1 #ifndef COIN_SOSUBENGINE_H
2 #define COIN_SOSUBENGINE_H
28 #include <Inventor/SbName.h>
29 #include <Inventor/SoType.h>
30 #include <Inventor/engines/SoEngine.h>
31 #include <Inventor/engines/SoOutputData.h>
32 #include <Inventor/fields/SoFieldData.h>
40 #define PRIVATE_ENGINE_TYPESYSTEM_HEADER( ) \
42 static SoType getClassTypeId(void); \
43 virtual SoType getTypeId(void) const; \
45 static SoType classTypeId
47 #define SO_ENGINE_ABSTRACT_HEADER(_classname_) \
48 PRIVATE_ENGINE_TYPESYSTEM_HEADER(); \
50 static const SoFieldData ** getInputDataPtr(void); \
51 static const SoEngineOutputData ** getOutputDataPtr(void); \
53 virtual const SoFieldData * getFieldData(void) const; \
54 virtual const SoEngineOutputData * getOutputData(void) const; \
56 static unsigned int classinstances; \
57 static SoFieldData * inputdata; \
58 static const SoFieldData ** parentinputdata; \
59 static SoEngineOutputData * outputdata; \
60 static const SoEngineOutputData ** parentoutputdata; \
61 static void atexit_cleanup(void)
63 #define SO_ENGINE_HEADER(_classname_) \
64 SO_ENGINE_ABSTRACT_HEADER(_classname_); \
66 static void * createInstance(void)
70 #define PRIVATE_ENGINE_TYPESYSTEM_SOURCE(_class_) \
71 SoType _class_::getClassTypeId(void) { return _class_::classTypeId; } \
72 SoType _class_::getTypeId(void) const { return _class_::classTypeId; } \
73 SoType _class_::classTypeId STATIC_SOTYPE_INIT
75 #define SO_ENGINE_ABSTRACT_SOURCE(_class_) \
76 PRIVATE_ENGINE_TYPESYSTEM_SOURCE(_class_); \
78 unsigned int _class_::classinstances = 0; \
79 SoFieldData * _class_::inputdata = NULL; \
80 const SoFieldData ** _class_::parentinputdata = NULL; \
81 SoEngineOutputData * _class_::outputdata = NULL; \
82 const SoEngineOutputData ** _class_::parentoutputdata = NULL; \
84 const SoFieldData ** \
85 _class_::getInputDataPtr(void) \
87 return (const SoFieldData **)&_class_::inputdata; \
91 _class_::getFieldData(void) const \
93 return _class_::inputdata; \
96 const SoEngineOutputData ** \
97 _class_::getOutputDataPtr(void) \
99 return (const SoEngineOutputData**)&_class_::outputdata; \
102 const SoEngineOutputData * \
103 _class_::getOutputData(void) const \
105 return _class_::outputdata; \
108 #define SO_ENGINE_SOURCE(_class_) \
109 SO_ENGINE_ABSTRACT_SOURCE(_class_); \
112 _class_::createInstance(void) \
114 return new _class_; \
118 _class_::atexit_cleanup(void) \
120 delete _class_::inputdata; \
121 delete _class_::outputdata; \
122 _class_::inputdata = NULL; \
123 _class_::outputdata = NULL; \
124 _class_::parentinputdata = NULL; \
125 _class_::parentoutputdata = NULL; \
126 _class_::classTypeId STATIC_SOTYPE_INIT; \
127 _class_::classinstances = 0; \
132 #define SO_ENGINE_IS_FIRST_INSTANCE() \
133 (classinstances == 1)
135 #define SO_ENGINE_CONSTRUCTOR(_class_) \
137 SoBase::staticDataLock(); \
138 _class_::classinstances++; \
140 assert(_class_::classTypeId != SoType::badType()); \
142 if (!_class_::inputdata) { \
143 _class_::inputdata = \
144 new SoFieldData(_class_::parentinputdata ? \
145 *_class_::parentinputdata : NULL); \
146 _class_::outputdata = \
147 new SoEngineOutputData(_class_::parentoutputdata ? \
148 *_class_::parentoutputdata : NULL); \
153 this->isBuiltIn = FALSE; \
154 SoBase::staticDataUnlock(); \
159 #define PRIVATE_COMMON_ENGINE_INIT_CODE(_class_, _classname_, _createfunc_, _parentclass_) \
162 assert(_class_::classTypeId == SoType::badType()); \
164 assert(_parentclass_::getClassTypeId() != SoType::badType()); \
167 _class_::classTypeId = \
168 SoType::createType(_parentclass_::getClassTypeId(), \
173 _class_::parentinputdata = _parentclass_::getInputDataPtr(); \
174 _class_::parentoutputdata = _parentclass_::getOutputDataPtr(); \
178 #define SO_ENGINE_INIT_CLASS(_class_, _parentclass_, _parentname_) \
180 const char * classname = SO__QUOTE(_class_); \
181 PRIVATE_COMMON_ENGINE_INIT_CODE(_class_, classname, &_class_::createInstance, _parentclass_); \
184 #define SO_ENGINE_EXIT_CLASS(_class_) \
185 _class_::atexit_cleanup()
187 #define SO_ENGINE_INIT_ABSTRACT_CLASS(_class_, _parentclass_, _parentname_) \
189 const char * classname = SO__QUOTE(_class_); \
190 PRIVATE_COMMON_ENGINE_INIT_CODE(_class_, classname, NULL, _parentclass_); \
195 #define SO_ENGINE_ADD_INPUT(_input_, _defaultval_) \
197 this->_input_.setValue _defaultval_;\
198 this->_input_.setContainer(this); \
199 inputdata->addField(this, SO__QUOTE(_input_), &this->_input_);\
202 #define SO_ENGINE_ADD_OUTPUT(_output_, _type_) \
204 outputdata->addOutput(this, SO__QUOTE(_output_), \
206 _type_::getClassTypeId()); \
207 this->_output_.setContainer(this); \
212 #define SO_ENGINE_DEFINE_ENUM_VALUE(_enumname_, _enumval_) \
214 inputdata->addEnumValue(SO__QUOTE(_enumname_), \
215 SO__QUOTE(_enumval_), _enumval_); \
218 #define SO_ENGINE_OUTPUT(_engineout_, _fieldtype_, _writeop_) \
220 if (_engineout_.isEnabled()) { \
224 int SO_ENGINE_OUTPUT_numconnections = _engineout_.getNumConnections(); \
229 for (int SO_ENGINE_OUTPUT_i = 0; SO_ENGINE_OUTPUT_i < SO_ENGINE_OUTPUT_numconnections; SO_ENGINE_OUTPUT_i++) { \
230 _fieldtype_ * SO_ENGINE_OUTPUT_field = (_fieldtype_*) _engineout_[SO_ENGINE_OUTPUT_i]; \
231 if (!SO_ENGINE_OUTPUT_field->isReadOnly()) { SO_ENGINE_OUTPUT_field->_writeop_; } \
234 assert(_engineout_.getNumConnections() == SO_ENGINE_OUTPUT_numconnections); \
240 #define SO_COMPOSE__HEADER(_name_) \
241 SO_ENGINE_HEADER(_name_); \
243 virtual void evaluate(); \
248 static void initClass()
252 #endif // !COIN_SOSUBENGINE_H
Copyright © 1998-2007 by Systems in Motion AS. All rights reserved.
Generated on Wed Jul 18 2012 for Coin by Doxygen. 1.8.1.1