28 #ifndef __DEPENDENTNODEFIELDS_H__
29 #define __DEPENDENTNODEFIELDS_H__
45 template<
class NodeType,
47 H3DUniquePtr< FieldType > NodeType:: *member_ptr >
50 typedef NodeType node_type;
51 typedef FieldType field_type;
52 typedef H3DUniquePtr< FieldType > NodeType:: * member_ptr_type;
53 static Field *getField( NodeType *n ) {
54 return (n->*member_ptr).get();
56 static member_ptr_type getMemberPtr() {
61 namespace FieldInternals {
67 template<
class FieldRefType >
71 typedef typename FieldRefType::node_type node_type;
77 static void route( node_type *n,
Field *f ) {
78 FieldRefType::getField( n )->
route( f );
85 static void unroute( node_type *n, Field *f ) {
86 FieldRefType::getField( n )->unroute( f );
93 template<
class FieldRefType,
class FieldRefs >
94 class DoRoutes< pair< FieldRefType, FieldRefs > > {
97 typedef typename FieldRefType::node_type node_type;
103 static void route( node_type *n, Field *f ) {
104 FieldRefType::getField( n )->route( f );
105 DoRoutes< FieldRefs >::route( n , f );
112 static void unroute( node_type *n, Field *f ) {
113 DoRoutes< FieldRefs >::unroute( n , f );
114 FieldRefType::getField( n )->unroute( f );
125 class H3DAPI_API EventField:
public AutoUpdate< Field > {
129 EventField( Field *f ):
135 virtual void update() {
148 template<
class BaseField,
class FieldRefs >
149 class DependentNodeFieldBase:
public BaseField {
151 typedef typename FieldRefs::node_type fr_node_type;
154 DependentNodeFieldBase() {
155 event_field.reset(
new EventField(
this ) );
166 H3DUniquePtr< EventField > event_field;
175 template<
class BaseField,
class FieldRefs,
bool DynamicCast = false >
176 class DependentNodeField:
public DependentNodeFieldBase< BaseField, FieldRefs > {
178 typedef typename FieldRefs::node_type fr_node_type;
183 virtual void onAdd( Node *n ) {
184 BaseField::onAdd( n );
185 fr_node_type *node =
static_cast< fr_node_type *
>( n );
187 DoRoutes< FieldRefs >::route( node,
188 this->event_field.get() );
195 virtual void onRemove( Node *n ) {
196 fr_node_type *node =
static_cast< fr_node_type *
>( n );
198 DoRoutes< FieldRefs >::unroute( node,
199 this->event_field.get() );
200 BaseField::onRemove( n );
204 template<
class BaseField,
class FieldRefs >
205 class DependentNodeField< BaseField, FieldRefs, true >:
public DependentNodeFieldBase< BaseField, FieldRefs > {
207 typedef typename FieldRefs::node_type fr_node_type;
212 virtual void onAdd( Node *n ) {
213 BaseField::onAdd( n );
214 fr_node_type *node =
dynamic_cast< fr_node_type *
>( n );
216 DoRoutes< FieldRefs >::route( node,
217 this->event_field.get() );
224 virtual void onRemove( Node *n ) {
225 fr_node_type *node =
dynamic_cast< fr_node_type *
>( n );
227 DoRoutes< FieldRefs >::unroute( node,
228 this->event_field.get() );
229 BaseField::onRemove( n );
290 template<
class NodeType,
class FieldRefs =
void,
bool DynamicCast = false >
292 public FieldInternals::DependentNodeField<
293 TypedSFNode< NodeType >,
294 FieldRefs, DynamicCast > {
310 template<
class FieldRefs,
bool DynamicCast >
311 class DependentSFNode< FieldRefs, void, DynamicCast >:
312 public FieldInternals::DependentNodeField<
313 TypedSFNode< typename FieldInternals::DoRoutes< FieldRefs >::node_type >,
314 FieldRefs, DynamicCast > {
331 template<
class NodeType,
class FieldRefs =
void,
bool DynamicCast = false >
333 public FieldInternals::DependentNodeField<
334 TypedMFNode< NodeType >,
344 this->clear( this->ownerId() );
352 template<
class FieldRefs,
bool DynamicCast >
353 class DependentMFNode< FieldRefs, void, DynamicCast >:
354 public FieldInternals::DependentNodeField<
355 TypedMFNode< typename FieldInternals::DoRoutes< FieldRefs >::node_type >,
365 this->clear( this->ownerId() );
373 template<
class NodeType,
class FieldRefs =
void,
bool DynamicCast = false >
375 public FieldInternals::DependentNodeField<
376 TypedSFNodeObject< NodeType >,
377 FieldRefs, DynamicCast > {
392 template<
class NodeType,
class FieldRefs =
void,
bool DynamicCast = false >
394 public FieldInternals::DependentNodeField<
395 TypedMFNodeObject< NodeType >,
396 FieldRefs, DynamicCast > {
404 this->clear( this->ownerId() );
Contains the MFNode class.
Contains the SFNode class.
DependentMFNodeObject is similar to DependentMFNode but uses TypedMFNodeObject instead of TypedMFNode...
Definition: DependentNodeFields.h:396
virtual ~DependentMFNodeObject()
Destructor.
Definition: DependentNodeFields.h:403
DependentMFNodeObject()
Constructor. Default value of value is NULL.
Definition: DependentNodeFields.h:400
DependentMFNode are modified TypedMFNode fields where the field dirty status is dependent on fields i...
Definition: DependentNodeFields.h:336
DependentMFNode()
Constructor. Default value of value is NULL.
Definition: DependentNodeFields.h:340
virtual ~DependentMFNode()
Destructor.
Definition: DependentNodeFields.h:343
DependentSFNodeObject is similar to DependentSFNode but uses TypedSFNodeObject instead of TypedSFNode...
Definition: DependentNodeFields.h:377
virtual ~DependentSFNodeObject()
Destructor.
Definition: DependentNodeFields.h:384
DependentSFNodeObject()
Constructor. Default value of value is NULL.
Definition: DependentNodeFields.h:381
DependentSFNode are modified TypedSFNode fields where the field dirty status is dependent on fields i...
Definition: DependentNodeFields.h:294
DependentSFNode()
Constructor. Default value of value is NULL.
Definition: DependentNodeFields.h:298
virtual ~DependentSFNode()
Destructor.
Definition: DependentNodeFields.h:301
Class used for specifying a field member of a node in a DependentSFNode or DependentMFNode specificat...
Definition: DependentNodeFields.h:48
The Field class.
Definition: Field.h:46
virtual void route(Field *, int id=0)
Set up a route from this field to the field given as argument.
Definition: Field.cpp:93
H3D API namespace.
Definition: Anchor.h:38