1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254
|
/*
*
* Copyright (C) 2000 Silicon Graphics, Inc. All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* Further, this software is distributed without any warranty that it is
* free of the rightful claim of any third person regarding infringement
* or the like. Any license provided herein, whether implied or
* otherwise, applies only to this software file. Patent licenses, if
* any, provided herein do not apply to combinations of this program with
* other software, or any other product whatsoever.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
* Mountain View, CA 94043, or:
*
* http://www.sgi.com
*
* For further information regarding this notice, see:
*
* http://oss.sgi.com/projects/GenInfo/NoticeExplan/
*
*/
// -*- C++ -*-
/*
* Copyright (C) 1990,91 Silicon Graphics, Inc.
*
_______________________________________________________________________
______________ S I L I C O N G R A P H I C S I N C . ____________
|
| $Revision: 1.1.1.1 $
|
| Description:
| This file defines the base SoEngine class, and the
| SoEngineOutput class.
|
| Author(s) : Gavin Bell
|
______________ S I L I C O N G R A P H I C S I N C . ____________
_______________________________________________________________________
*/
#ifndef _SO_ENGINE_
#define _SO_ENGINE_
#include <Inventor/fields/SoFieldContainer.h>
#include <Inventor/SoLists.h>
#include <Inventor/SbString.h>
#include <Inventor/SoType.h>
//////////////////////////////////////////////////////////////////////////////
//
// Class: SoEngine
//
// Base SoEngine class (abstract).
//
//////////////////////////////////////////////////////////////////////////////
// C-api: abstract
class SoFieldData;
class SoEngineList;
class SoEngineOutput;
class SoEngineOutputList;
class SoEngineOutputData;
class SoField;
class SoOutput;
class SoInput;
class SoEngine : public SoFieldContainer {
public:
// Returns type identifier for SoEngine class
// C-api: expose
static SoType getClassTypeId() { return classTypeId; }
// Returns a list of outputs in this engine. This is virtual
// so private outputs can be hidden. Use getOutputName() to get the
// names of the fields, and use getConnectionType() to figure out
// their types. Returns the number of outputs added to the list.
// C-api: expose
// C-api: name=getOuts
virtual int getOutputs(SoEngineOutputList &list) const;
// Returns a pointer to the engine output with the given name.
// If no such output exists, NULL is returned.
// C-api: name=getOut
SoEngineOutput * getOutput(const SbName &outputName) const;
// Returns (in outputName) the name of the output pointed to.
// Returns FALSE if the output is not contained within the
// engine instance.
// C-api: name=getOutName
SbBool getOutputName(const SoEngineOutput *output,
SbName &outputName) const;
// Creates and returns a copy of the engine. All connections to
// inputs are copied as is (without copying what's at the other
// end).
SoEngine * copy() const;
// A engine can be given a name using setName() (which is a
// method on SoBase). These methods allow enginess to be looked
// up by name.
static SoEngine * getByName(const SbName &name);
// C-api: name=getByNameList
static int getByName(const SbName &name, SoEngineList &list);
protected:
// User-written evaluation engine.
virtual void evaluate() = 0;
SoINTERNAL public:
// wrapper for the user's evaluate() engine
void evaluateWrapper();
// Propagates modification notification through an instance.
virtual void notify(SoNotList *list);
// Initializes base engine class
static void initClass();
// Info on outputs:
virtual const SoEngineOutputData *getOutputData() const = 0;
// Initialize ALL Inventor engine classes
static void initClasses();
// Writes instance to SoOutput. (Used only for last stage of writing)
virtual void writeInstance(SoOutput *out);
// Copies an instance that is encountered through a field connection
virtual SoFieldContainer * copyThroughConnection() const;
// Recursive procedure that determines if this engine should be
// copied during a copy operation, or just referenced as is
SbBool shouldCopy() const;
// A very annoying double notification occurs with engines
// that enable their outputs during inputChanged; this flag
// prevents that:
SbBool isNotifying() const { return notifying; }
protected:
// Constructor, destructor
SoEngine();
~SoEngine();
// Reads stuff into instance. Returns FALSE on error
virtual SbBool readInstance(SoInput *in, unsigned short flags);
// This is called whenever the value of an input is changed. The
// default method does nothing. Subclasses can override this to
// detect when a specific field is changed.
virtual void inputChanged(SoField *whichField);
// This is used by the input&output inheritence mechanism, hidden in
// the SoSubEngine macros
static const SoFieldData **getInputDataPtr() { return NULL; }
static const SoEngineOutputData **getOutputDataPtr() { return NULL; }
// Write output type information for engines that are not built-in.
void writeOutputTypes(SoOutput *out);
private:
static SoType classTypeId; // Type identifier
SbBool needsEvaluation; // Dirty bit
SbBool notifying;
friend class SoEngineOutput;
};
//////////////////////////////////////////////////////////////////////////////
//
// Class: SoEngineOutput
//
// Engine outputs. They are lists of fields to be written into,
// and a pointer back to the containing engine.
//
//////////////////////////////////////////////////////////////////////////////
class SoEngineOutput {
public:
// type of field this output can connect to
// C-api: name=getConnType
SoType getConnectionType() const;
// Returns the number of fields this output is writing to, and
// adds pointers to those fields to the given list:
// C-api: name=getForwardConn
int getForwardConnections(SoFieldList &list) const;
// Enables or disables all connections from this output. If the
// connections are disabled, notification will not propagate
// through them and values will not be output along them. The
// default state is enabled.
void enable(SbBool flag);
SbBool isEnabled() const { return enabled; }
// Returns containing engine
SoEngine * getContainer() const { return container; }
SoINTERNAL public:
SoEngineOutput();
virtual ~SoEngineOutput();
void setContainer(SoEngine *eng) { container = eng; }
// Adds/removes connection to field
void addConnection(SoField *);
void removeConnection(SoField *);
// Number of connections this output currently has
int getNumConnections() const
{ return connections.getLength(); }
// Returns the fields this output is writing into
SoField * operator[](int i) const
{ return connections.get(i); }
// Before evaluating (which is done with the regular field API),
// we must disable notification on all the fields we're about to
// write into. After evaluating, the bits are restored:
void prepareToWrite() const;
void doneWriting() const;
private:
SbBool enabled;
SoFieldList connections;
SoEngine *container;
};
#endif /* _SO_ENGINE_ */
|