Gizmo3D

gzNode.h

Go to the documentation of this file.
00001 //*****************************************************************************
00002 // File         : gzNode.h
00003 // Module       : 
00004 // Description  : Class definition of the gzNode class
00005 // Author       : Anders Modén      
00006 // Product      : Gizmo3D 2.1.1
00007 //      
00008 // Copyright © 2003- Saab Training Systems AB, Sweden
00009 //          
00010 // NOTE:    Gizmo3D is a high performance 3D Scene Graph and effect visualisation 
00011 //          C++ toolkit for Linux, Mac OS X, Windows (Win32) and IRIX® for  
00012 //          usage in Game or VisSim development.
00013 //
00014 //
00015 // Revision History...                          
00016 //                                  
00017 // Who  Date    Description                     
00018 //                                  
00019 // AMO  981014  Created file    
00020 //
00021 //******************************************************************************
00022 #ifndef __GZ_NODE_H__
00023 #define __GZ_NODE_H__
00024 
00030 #include "gzObject.h"
00031 #include "gzMatrix.h"
00032 #include "gzState.h"
00033 #include "gzDbFlags.h"
00034 
00035 class gzContext;    // Forward decl
00036 class gzNode;       // Forward declaraton
00037 
00038 
00039 // Additional Node gzDebugFlags
00040 const gzDebugFlags GZ_DEBUG_RECURSIVE           =(gzDebugFlags)(1<<0);
00041 const gzDebugFlags GZ_DEBUG_SHOW_ATTRIBUTES     =(gzDebugFlags)(1<<1);
00042 const gzDebugFlags GZ_DEBUG_SHOW_GEOMETRY       =(gzDebugFlags)(1<<2);
00043 const gzDebugFlags GZ_DEBUG_SHOW_USERDATA       =(gzDebugFlags)(1<<3);
00044 const gzDebugFlags GZ_DEBUG_SHOW_STATE          =(gzDebugFlags)(1<<4);
00045 const gzDebugFlags GZ_DEBUG_SHOW_NODE_ACTIONS   =(gzDebugFlags)(1<<5);
00046 
00047 
00049 enum gzIntersectMaskValue
00050 {   
00052     GZ_INTERSECT_MASK_GROUND            =   (1<<1)  ,
00053 
00055     GZ_INTERSECT_MASK_WATER             =   (1<<2)  ,
00056 
00058     GZ_INTERSECT_MASK_MAP_SURFACE       =   GZ_INTERSECT_MASK_GROUND | GZ_INTERSECT_MASK_WATER ,
00059 
00060 
00062     GZ_INTERSECT_MASK_BUILDING          =   (1<<3)  ,
00063 
00065     GZ_INTERSECT_MASK_FOREST            =   (1<<4)  ,
00066 
00068     GZ_INTERSECT_MASK_STATIC_OBJECT     =   GZ_INTERSECT_MASK_FOREST | GZ_INTERSECT_MASK_BUILDING   ,
00069 
00070 
00072     GZ_INTERSECT_MASK_HUMAN             =   (1<<5)  ,
00073     
00075     GZ_INTERSECT_MASK_ANIMAL            =   (1<<6)  ,
00076 
00078     GZ_INTERSECT_MASK_VEHICLE           =   (1<<7)  ,
00079 
00081     GZ_INTERSECT_MASK_DYNAMIC_OBJECT    =   GZ_INTERSECT_MASK_HUMAN | GZ_INTERSECT_MASK_ANIMAL  ,
00082 
00083 
00085     GZ_INTERSECT_MASK_OVERLAY_OBJECTS   =   (1<<8)  ,
00086 
00088     GZ_INTERSECT_MASK_UNDERLAY_OBJECTS  =   (1<<9)  ,
00089 
00091     GZ_INTERSECT_MASK_SCREEN_OBJECT =   GZ_INTERSECT_MASK_OVERLAY_OBJECTS | GZ_INTERSECT_MASK_UNDERLAY_OBJECTS  ,
00092 
00094     GZ_INTERSECT_MASK_ALL               =   -1      ,
00095 
00097     GZ_INTERSECT_MASK_NOTHING           =   0   
00098 };
00099 
00100 GZ_USE_BIT_LOGIC(gzIntersectMaskValue);
00101 
00102 enum gzCullMaskValue
00103 {   
00104     GZ_CULL_MASK_ALL            =   -1,
00105     GZ_CULL_MASK_NOTHING        =   0   
00106 };
00107 
00108 GZ_USE_BIT_LOGIC(gzCullMaskValue);
00109 
00110 //************** Common defined performance sections ******************
00111 
00112 const gzString GZ_SECTION_RENDER                ="_render";
00113 const gzString GZ_SECTION_CULL                  ="_cull";
00114 const gzString GZ_SECTION_NODE_DATA             ="_node_upd";
00115 const gzString GZ_SECTION_DYNLOAD               ="_dynload";
00116 const gzString GZ_SECTION_REFRESH               ="_refresh";
00117 const gzString GZ_SECTION_FINISH                ="_finish";
00118 const gzString GZ_SECTION_SHADOW_VOLUME_CREATE  ="_shad_vol_cr";
00119 const gzString GZ_SECTION_SHADOW_VOLUME_RENDER  ="_shad_vol_re";
00120 
00121 //******************************************************************************
00122 // Class    : gzIntersectMask
00123 //                                  
00124 // Purpose  : To keep a definition of what kind of intersect object it is.
00125 //                                  
00126 // Notes    : - 
00127 //                                  
00128 // Revision History...                          
00129 //                                  
00130 // Who  Date    Description                     
00131 //                                  
00132 // AMO  000828  Created 
00133 //                                  
00134 //******************************************************************************
00135 class GZ_GRAPH_EXPORT gzIntersectMask
00136 {
00137 public:
00138 
00139     inline gzIntersectMask():m_mask(GZ_INTERSECT_MASK_ALL){}
00140 
00141     inline virtual ~gzIntersectMask(){}
00142 
00143     inline gzVoid setIntersectMask( const gzIntersectMaskValue & mask )
00144     {
00145         m_mask=mask;
00146     }
00147 
00148     inline gzIntersectMaskValue getIntersectMask()
00149     {
00150         return m_mask;
00151     }
00152 
00153     inline gzBool isIntersecting( const gzIntersectMaskValue & mask )
00154     {
00155         return (mask&m_mask)!=0;
00156     }
00157 
00158     inline gzBool isIntersecting( gzIntersectMask * imask )
00159     {
00160         return (m_mask&imask->m_mask)!=0;
00161     }
00162 
00163 private:
00164 
00165     gzIntersectMaskValue    m_mask;
00166 };
00167 
00168 //******************************************************************************
00169 // Class    : gzCullMask
00170 //                                  
00171 // Purpose  : To keep a definition of what shall be culled or not
00172 //                                  
00173 // Notes    : - 
00174 //                                  
00175 // Revision History...                          
00176 //                                  
00177 // Who  Date    Description                     
00178 //                                  
00179 // AMO  050209  Created 
00180 //                                  
00181 //******************************************************************************
00182 class GZ_GRAPH_EXPORT gzCullMask
00183 {
00184 public:
00185 
00186     inline gzCullMask():m_mask(GZ_CULL_MASK_NOTHING){}
00187 
00188     inline virtual ~gzCullMask(){}
00189 
00190     inline gzVoid setCullMask( const gzCullMaskValue & mask )
00191     {
00192         m_mask=mask;
00193     }
00194 
00195     inline gzCullMaskValue getCullMask()
00196     {
00197         return m_mask;
00198     }
00199 
00200     inline gzBool isCulled( const gzCullMaskValue & mask )
00201     {
00202         return (mask&m_mask)!=0;
00203     }
00204 
00205     inline gzBool isCulled( gzCullMask * mask )
00206     {
00207         return (m_mask&mask->m_mask)!=0;
00208     }
00209 
00210 private:
00211 
00212     gzCullMaskValue m_mask;
00213 };
00214 
00215 
00220 const gzCopyMode    GZ_CLONE_SHARE_STATE        = (gzCopyMode)(1<<0); 
00221 const gzCopyMode    GZ_CLONE_SHARE_GEOMETRY     = (gzCopyMode)(1<<1);
00222 const gzCopyMode    GZ_CLONE_SHARE_TEXTURE      = (gzCopyMode)(1<<2);
00223 const gzCopyMode    GZ_CLONE_SHARE_MATERIAL     = (gzCopyMode)(1<<3);
00224 const gzCopyMode    GZ_CLONE_SHARE_TEXENV       = (gzCopyMode)(1<<4);
00225 const gzCopyMode    GZ_CLONE_SHARE_TEXGEN       = (gzCopyMode)(1<<5);
00226 const gzCopyMode    GZ_CLONE_SHARE_GFX_PROGRAM  = (gzCopyMode)(1<<6);
00227 const gzCopyMode    GZ_CLONE_SHARE_FONT         = (gzCopyMode)(1<<7);
00228 
00229 //******************************************************************************
00230 // Class    : gzNodeLock
00231 //                                  
00232 // Purpose  : To lock scene graph nodes between rendering and editing threads
00233 //                                  
00234 // Notes    : - 
00235 //                                  
00236 // Revision History...                          
00237 //                                  
00238 // Who  Date    Description                     
00239 //                                  
00240 // AMO  991123  Created 
00241 //                                  
00242 //******************************************************************************
00243 
00247 class GZ_GRAPH_EXPORT gzNodeLock
00248 {
00249 public:
00250 
00252     static gzVoid waitLockRender();
00253 
00255     static gzVoid waitLockEdit();
00256 
00258     static gzBool tryLockRender();
00259 
00261     static gzBool tryLockEdit();
00262 
00264     static gzVoid unLock();
00265 
00267     static gzBool isLocked();
00268 
00270     static gzBool isLockedRender();
00271 
00273     static gzBool isLockedEdit();
00274 
00276     static gzULong getLockedEditThreadID();
00277 
00278 private:
00279 
00280     static gzSemaphore g_lock;
00281 };
00282 
00283 
00284 
00285 //******************************************************************************
00286 // Class    : gzTraverseAction
00287 //                                  
00288 // Purpose  : To traverse a graph of nodes
00289 //                                  
00290 // Notes    : - 
00291 //                                  
00292 // Revision History...                          
00293 //                                  
00294 // Who  Date    Description                     
00295 //                                  
00296 // AMO  981126  Created 
00297 //                                  
00298 //******************************************************************************
00299 class gzTraverseAction : public gzTypeInterface
00300 {
00301 public:
00302 
00303     GZ_DECLARE_TYPE_INTERFACE_EXPORT(GZ_GRAPH_EXPORT);  // typed interface
00304 
00305     GZ_GRAPH_EXPORT gzVoid traverse(gzNode *node,gzContext *context);
00306 
00307     GZ_GRAPH_EXPORT virtual gzBool traverseTransform(){ return TRUE; }
00308 
00309 protected:
00310 
00311     GZ_GRAPH_EXPORT virtual gzBool checkBoundary(gzContext *context, gzNode *node) { return TRUE; } // default TRUE
00312 
00313     GZ_GRAPH_EXPORT virtual gzVoid preTraverseAction( gzNode *node , gzContext *context);
00314     GZ_GRAPH_EXPORT virtual gzVoid postTraverseAction( gzNode *node , gzContext *context);
00315 };
00316 
00317 enum gzBoundaryMode
00318 {
00319     GZ_BOUNDARY_DEFAULT,
00320     GZ_BOUNDARY_ZERO_Y
00321 };
00322     
00323 //******************************************************************************
00324 // Class    : gzBoundary
00325 //                                  
00326 // Purpose  : -
00327 //                                  
00328 // Notes    : - 
00329 //                                  
00330 // Revision History...                          
00331 //                                  
00332 // Who  Date    Description                     
00333 //                                  
00334 // AMO  981202  Created 
00335 //                                  
00336 //******************************************************************************
00337 class gzBoundary
00338 {
00339 public:
00340 
00341     GZ_GRAPH_EXPORT gzBoundary():   m_center(gzVec3(0,0,0)),m_baseOffset(0),m_radius(0.0f),m_mode(GZ_BOUNDARY_DEFAULT),m_accumIncludeBoundary(FALSE),
00342                                     m_recursiveIncludeBoundary(FALSE),m_childRecursiveIncludeBoundary(FALSE),m_isReset(TRUE),m_localIncludeBoundary(FALSE),m_useRadius(TRUE){}
00343 
00344     GZ_GRAPH_EXPORT virtual ~gzBoundary(){};
00345 
00346     GZ_GRAPH_EXPORT const  gzVec3 & getBoundaryCenter() const   { return m_center; }
00347     GZ_GRAPH_EXPORT const  gzReal & getBoundaryRadius() const   { return m_radius; }
00348 
00349     GZ_GRAPH_EXPORT gzVoid setBoundaryCenter( gzVec3 center );
00350 
00351     GZ_GRAPH_EXPORT gzVoid setBoundaryRadius( gzReal radius );
00352 
00353     GZ_GRAPH_EXPORT gzVoid resetBoundary()                      { m_isReset = TRUE ; m_radius=GZ_FLOAT_ZERO; m_center=gzVec3(0,0,0); m_childRecursiveIncludeBoundary=FALSE; m_accumIncludeBoundary=m_recursiveIncludeBoundary|m_localIncludeBoundary; }
00354 
00355     GZ_GRAPH_EXPORT gzVoid unResetBoundary()                    { m_isReset = FALSE;  }
00356 
00357     GZ_GRAPH_EXPORT gzVoid includeBoundary(const gzVec3 &center , const gzReal &radius );
00358 
00359     GZ_GRAPH_EXPORT gzVoid includeMaxBoundary(const gzVec3 &center , const gzReal &radius , const gzVec3 &offset=gzVec3(0,0,0));
00360 
00361     GZ_GRAPH_EXPORT gzVoid includeBoundary(const gzBoundary *boundary , gzMatrix4 *transform , gzReal maxScale);
00362 
00363     GZ_GRAPH_EXPORT gzVoid includeMaxBoundary(const gzBoundary *boundary , gzMatrix4 *transform, gzReal maxScale , const gzVec3 &offset=gzVec3(0,0,0));
00364 
00365 
00367     GZ_GRAPH_EXPORT inline gzBool getRecursiveIncludeBoundary() const           { return m_recursiveIncludeBoundary|m_childRecursiveIncludeBoundary; }
00368 
00370     GZ_GRAPH_EXPORT inline gzBool getForceRecursiveIncludeBoundary() const      { return m_recursiveIncludeBoundary; }
00371 
00373     GZ_GRAPH_EXPORT inline gzBool getForceChildRecursiveIncludeBoundary() const { return m_childRecursiveIncludeBoundary; }
00374 
00376     GZ_GRAPH_EXPORT inline gzBool getForceLocalIncludeBoundary() const          { return m_localIncludeBoundary; }
00377 
00379     GZ_GRAPH_EXPORT inline gzBool getForceIncludeBoundary() const               { return m_accumIncludeBoundary; }
00380 
00382     GZ_GRAPH_EXPORT gzVoid setForceRecursiveIncludeBoundary(gzBool on)          { m_recursiveIncludeBoundary=on; m_accumIncludeBoundary=m_recursiveIncludeBoundary|m_childRecursiveIncludeBoundary|m_localIncludeBoundary; }
00383 
00385     GZ_GRAPH_EXPORT gzVoid setForceChildRecursiveIncludeBoundary(gzBool on)     { m_childRecursiveIncludeBoundary=on; m_accumIncludeBoundary=m_recursiveIncludeBoundary|m_childRecursiveIncludeBoundary|m_localIncludeBoundary; }
00386 
00388     GZ_GRAPH_EXPORT gzVoid setForceLocalIncludeBoundary(gzBool on)              { m_localIncludeBoundary = on; m_accumIncludeBoundary=m_recursiveIncludeBoundary|m_childRecursiveIncludeBoundary|m_localIncludeBoundary; }
00389 
00390 
00391     GZ_GRAPH_EXPORT gzVoid setBaseOffsetBoundary(gzReal offset)                 { m_baseOffset=offset; }
00392 
00393     GZ_GRAPH_EXPORT gzReal getBaseOffsetBoundary()                              { return m_baseOffset; }
00394 
00395     GZ_GRAPH_EXPORT gzVoid setBoundaryMode(gzBoundaryMode mode)                 { m_mode=mode; }
00396 
00397     GZ_GRAPH_EXPORT gzVoid adjustBoundary();
00398 
00399     // --------- set to false if object doesn't have a radius -----
00400 
00402     GZ_GRAPH_EXPORT gzVoid useRadius(gzBool on)                                 { m_useRadius=on; }
00403 
00404     GZ_GRAPH_EXPORT inline gzBool useRadius() const                             { return m_useRadius; }
00405 
00406 
00407 private:
00408 
00409     gzVec3          m_center;
00410     gzReal          m_baseOffset;
00411     gzReal          m_radius;
00412     
00413     gzBoundaryMode  m_mode;
00414                     
00415     gzBool          m_accumIncludeBoundary:1;
00416     gzBool          m_recursiveIncludeBoundary:1;
00417     gzBool          m_childRecursiveIncludeBoundary:1;
00418     gzBool          m_isReset:1;
00419     gzBool          m_localIncludeBoundary:1;
00420     gzBool          m_useRadius:1;
00421 };
00422 
00424  enum gzNodeActionEvent
00425  {  
00426     // Subscribeable options
00427     GZ_NODE_ACTION_BEFORE_PRE_TRAVERSE  = 0         , 
00428     GZ_NODE_ACTION_AFTER_PRE_TRAVERSE               ,
00429     GZ_NODE_ACTION_BEFORE_POST_TRAVERSE             ,
00430     GZ_NODE_ACTION_AFTER_POST_TRAVERSE              ,
00431     GZ_NODE_ACTION_BEFORE_RENDER                    ,
00432     GZ_NODE_ACTION_AFTER_RENDER                     ,
00433 
00434     GZ_NODE_ACTION_BEFORE_SCENE_RENDER              ,
00435     GZ_NODE_ACTION_AFTER_SCENE_RENDER               ,
00436 
00437     GZ_NODE_ACTION_BEFORE_SCENE_UPDATE_NODE_DATA    ,
00438     GZ_NODE_ACTION_AFTER_SCENE_UPDATE_NODE_DATA     ,
00439 
00440     GZ_NODE_ACTION_BEFORE_NODE_DATA_UPDATE          ,
00441     GZ_NODE_ACTION_AFTER_NODE_DATA_UPDATE           ,
00442 
00443     GZ_NODE_ACTION_REF                              ,
00444     GZ_NODE_ACTION_UNREF                            ,
00445     GZ_NODE_ACTION_NODE_ID_CHANGE                   ,
00446 
00447 
00448     // Internal action , no use
00449     GZ_NODE_ACTION_COUNT                    ,
00450 
00451     // Default Actions, always active
00452     GZ_NODE_ACTION_ADD                      ,
00453     GZ_NODE_ACTION_REMOVE               
00454 };
00455 
00456 class gzNodeActionInterface;    // Forward
00457 
00458 //******************************************************************************
00459 // Class    : gzNodeActionInterfaceHandle
00460 //                                  
00461 // Purpose  : Holds data of active actions combined with user data
00462 //                                  
00463 // Notes    : - 
00464 //                                  
00465 // Revision History...                          
00466 //                                  
00467 // Who  Date    Description                     
00468 //                                  
00469 // AMO  000602  Created 
00470 //                                  
00471 //******************************************************************************
00472 class gzNodeActionInterfaceHandle
00473 {
00474 public:
00475 
00476     gzRefPointer<gzNodeActionInterface> receiver;
00477     gzVoid                              *userdata;
00478 };
00479 
00480 //******************************************************************************
00481 // Class    : gzNodeActionProvider
00482 //                                  
00483 // Purpose  : The node action provider
00484 //                                  
00485 // Notes    : - 
00486 //                                  
00487 // Revision History...                          
00488 //                                  
00489 // Who  Date    Description                     
00490 //                                  
00491 // AMO  000602  Created 
00492 //                                  
00493 //******************************************************************************
00494 class gzNodeActionProvider : public gzObject
00495 {
00496 public:
00497 
00498     GZ_GRAPH_EXPORT gzNodeActionProvider();
00499 
00500     GZ_GRAPH_EXPORT virtual ~gzNodeActionProvider();
00501 
00502     GZ_GRAPH_EXPORT gzNodeActionProvider(const gzNodeActionProvider & copy);
00503 
00504     GZ_GRAPH_EXPORT gzNodeActionProvider &operator=(const gzNodeActionProvider & copy);
00505 
00506     GZ_GRAPH_EXPORT virtual gzVoid  ref();      // Ref/Unref detection
00507     GZ_GRAPH_EXPORT virtual gzVoid  unref();
00508 
00509     // ---------- Node action interface --------------------------------
00510 
00511     GZ_GRAPH_EXPORT gzVoid action(gzNodeActionEvent action , gzContext *context ,gzTraverseAction *actionclass);
00512 
00513     GZ_GRAPH_EXPORT gzBool  hasActiveActions()  { return m_receivers!=NULL; }
00514 
00515     GZ_GRAPH_EXPORT gzBool  hasActiveAction(gzNodeActionEvent action);
00516 
00517     GZ_GRAPH_EXPORT gzVoid addActionInterface(gzNodeActionInterface *receiver , gzNodeActionEvent action , gzVoid *userdata=NULL);
00518     GZ_GRAPH_EXPORT gzVoid removeActionInterface(gzNodeActionInterface *receiver , gzNodeActionEvent action );
00519     GZ_GRAPH_EXPORT gzVoid removeAllActionInterfaces(gzType *type=NULL);
00520     GZ_GRAPH_EXPORT gzBool hasActionInterfaceType(gzType *type);
00521 
00522     GZ_GRAPH_EXPORT gzArray<gzNodeActionInterfaceHandle> getActionInterfaces(gzNodeActionEvent action);
00523 
00524     
00525 
00526 
00527     // ---------- Debug function ----------------------------------------
00528 
00529     GZ_GRAPH_EXPORT virtual gzVoid  debugOutput(gzString base , gzString anchor , gzDebugFlags features);
00530 
00531 
00532 private:
00533 
00534     gzList<gzNodeActionInterfaceHandle> *m_receivers;
00535 };
00536 
00537 //******************************************************************************
00538 // Class    : gzNodeActionInterface
00539 //                                  
00540 // Purpose  : Derive from this interface to get node actions
00541 //                                  
00542 // Notes    : - 
00543 //                                  
00544 // Revision History...                          
00545 //                                  
00546 // Who  Date    Description                     
00547 //                                  
00548 // AMO  000602  Created 
00549 //                                  
00550 //******************************************************************************
00551 class gzNodeActionInterface : public gzReference
00552 {
00553 public:
00554 
00555     GZ_GRAPH_EXPORT gzNodeActionInterface():m_activeProviders(NULL){};
00556 
00557     GZ_GRAPH_EXPORT gzNodeActionInterface(const gzNodeActionInterface &copy);
00558 
00559     GZ_GRAPH_EXPORT gzNodeActionInterface & operator=(const gzNodeActionInterface &copy);
00560 
00561     GZ_GRAPH_EXPORT virtual ~gzNodeActionInterface();
00562 
00563     GZ_GRAPH_EXPORT virtual gzVoid onAction(gzNodeActionEvent action , gzContext *context , gzNodeActionProvider *trigger , gzTraverseAction *actionclass , gzVoid *userdata){};
00564 
00565     GZ_GRAPH_EXPORT gzList<gzNodeActionProvider>    * getActionProviderInterfaces();
00566 
00567     GZ_GRAPH_EXPORT gzVoid removeAllActions();
00568 
00569 private:
00570 
00571     friend class gzNodeActionProvider;
00572 
00573     gzList<gzNodeActionProvider>    *m_activeProviders;
00574 };
00575 
00576 
00577 // Forward declaration of a group
00578 class gzGroup;
00579 
00580 // Disable clear and destroy for gzGroup
00581 template <> inline gzVoid gzList<gzGroup>::clearAndDestroy() 
00582 {
00583 }
00584 
00585 //******************************************************************************
00586 // Class    : gzNode
00587 //                                  
00588 // Purpose  : -
00589 //                                  
00590 // Notes    : - 
00591 //                                  
00592 // Revision History...                          
00593 //                                  
00594 // Who  Date    Description                     
00595 //                                  
00596 // AMO  980912  Created 
00597 //                                  
00598 //******************************************************************************
00599 class gzNode :  public gzBoundary , public gzNodeActionProvider , 
00600                 public gzNameInterface , public gzDebugInterface , 
00601                 public gzIntersectMask , public gzUpdateIDInterface , 
00602                 public gzCullMask
00603 {
00604 public:
00605 
00606     GZ_GRAPH_EXPORT gzNode(const gzString & name=GZ_EMPTY_STRING);
00607     GZ_GRAPH_EXPORT virtual ~gzNode();
00608 
00609     GZ_GRAPH_EXPORT gzNode(const gzNode &copy);
00610     GZ_GRAPH_EXPORT gzNode & operator=(const gzNode &copy);
00611 
00612 
00613     GZ_DECLARE_TYPE_INTERFACE_EXPORT(GZ_GRAPH_EXPORT);  // typed interface
00614 
00615     // ---------- Clone interface ---------------------------------------
00616     GZ_GRAPH_EXPORT virtual gzReference* clone() const;
00617     GZ_GRAPH_EXPORT virtual gzVoid  setCopyMode(gzCopyMode mode);
00618     GZ_GRAPH_EXPORT virtual gzBool  useDeepCopy();
00619 
00620     // ---------- Action Interface --------------------------------------
00621 
00622     GZ_GRAPH_EXPORT virtual gzVoid preTraverseAction( gzTraverseAction *actionclass , gzContext *context) {};
00623     GZ_GRAPH_EXPORT virtual gzVoid postTraverseAction( gzTraverseAction *actionclass , gzContext *context) {};
00624     GZ_GRAPH_EXPORT virtual gzActionStage useActionStage( gzTraverseAction *actionclass , gzContext *context) { return GZ_ACTION_STAGE_TRAVERSE; }
00625     GZ_GRAPH_EXPORT virtual gzBool isGroupNode() { return FALSE; }  // Speed up RTTI
00626 
00627     // ---------- Common graph functions --------------------------------
00628 
00629     GZ_GRAPH_EXPORT gzVoid  setState( gzState *state );
00630     GZ_GRAPH_EXPORT gzState *getState();
00631 
00632     GZ_GRAPH_EXPORT virtual gzNode *find(const gzString &path,gzBool recursive=TRUE);
00633 
00634     // ----------- Parent Utilities --------------------------------------
00635 
00636     GZ_GRAPH_EXPORT gzVoid              removeFromParents();
00637     GZ_GRAPH_EXPORT gzList<gzGroup> &   getParentGroupList();
00638     GZ_GRAPH_EXPORT gzULong             getNumberOfParents();   
00639     GZ_GRAPH_EXPORT gzBool              isShared();
00640     GZ_GRAPH_EXPORT gzBool              isHierarchicalChildOf(gzGroup *group);
00641 
00642     // ---------- Debug function ----------------------------------------
00643 
00644     GZ_GRAPH_EXPORT virtual gzVoid  debugOutput(gzString base , gzString anchor , gzDebugFlags features);
00645 
00646     // ---------- Serializing -------------------------------------------
00647 
00648     GZ_GRAPH_EXPORT virtual gzVoid write(gzSerializeAdapter *adapter);
00649     GZ_GRAPH_EXPORT virtual gzVoid read(gzSerializeAdapter *adapter);
00650     GZ_GRAPH_EXPORT virtual gzULong getDataSize(gzSerializeAdapter *adapter) const;
00651 
00652 
00653     // ---------- Node identities ---------------------------------------
00654 
00655     GZ_GRAPH_EXPORT gzBool  registerNodeID(gzULong id);
00656     GZ_GRAPH_EXPORT gzBool  unregisterNodeID();
00657     GZ_GRAPH_EXPORT gzBool  getNodeId(gzULong &id);
00658     static GZ_GRAPH_EXPORT  gzNode *findNode(gzULong id);
00659     static GZ_GRAPH_EXPORT  gzULong getMaxUsedNodeId();
00660     static GZ_GRAPH_EXPORT  gzVoid preAllocateNodeId(gzULong id);
00661     
00662     // ---------- Boundary management -----------------------------------
00663 
00665     GZ_GRAPH_EXPORT virtual gzVoid updateNode() {};
00666 
00668     GZ_GRAPH_EXPORT virtual gzVoid updateNodeData(gzBool forceBoundaryUpdate=FALSE);
00669 
00670     GZ_GRAPH_EXPORT gzVoid setDirtyNodeData(gzBool dirty);      
00671     GZ_GRAPH_EXPORT gzBool hasDirtyNodeData();
00672     GZ_GRAPH_EXPORT gzVoid enableNodeDataUpdate(gzBool on);     // Update data in a node
00673     GZ_GRAPH_EXPORT gzBool doUpdateNodeData();
00674 
00675 protected:
00676 
00677     // ---------- Protected Boundary management -----------------------------------
00678 
00679     friend class gzGroup;
00680 
00681     GZ_GRAPH_EXPORT gzVoid addParentGroup(gzGroup *parent);
00682     GZ_GRAPH_EXPORT gzVoid removeParentGroup(gzGroup *parent);
00683 
00684 private:
00685 
00686     gzBool  getNodeId_unsafe(gzULong &id);
00687 
00688     // ---------- common node members -----------------------------------
00689 
00690     gzRefPointer<gzState> m_state;
00691 
00692     // Boundary Group info
00693 
00694     gzList<gzGroup>     m_parents;
00695     gzULong             m_nodeID;
00696     gzUByte             m_dirtyNodeData:1;
00697     gzUByte             m_updateNodeData:1;
00698 
00699     // Static vars
00700 
00701     static gzMutex                                      nodeIdLocker;
00702     static gzDict<gzULongCompareInterface,gzNode>       nodeIdStorage;
00703     static gzDict<gzInstanceCompareInterface,gzVoid>    idNodeStorage;
00704 
00705 };
00706 
00707 // Declare smart pointer type
00708 GZ_DECLARE_REFPTR(gzNode);
00709 
00710 //******************************************************************************
00711 // Class    : gzDbManager
00712 //                                  
00713 // Purpose  : -
00714 //                                  
00715 // Notes    : - 
00716 //                                  
00717 // Revision History...                          
00718 //                                  
00719 // Who  Date    Description                     
00720 //                                  
00721 // AMO  980912  Created 
00722 //                                  
00723 //******************************************************************************
00724 class gzDbManager : public gzReference
00725 {
00726 public:
00727 
00728     GZ_GRAPH_EXPORT virtual ~gzDbManager(){};
00729 
00730     GZ_GRAPH_EXPORT static gzVoid   registerManager(gzDbManager *manager);
00731 
00732     GZ_GRAPH_EXPORT static gzVoid   unregisterManager(gzDbManager *manager);
00733 
00734     GZ_GRAPH_EXPORT static gzVoid   unregisterManagers();
00735         
00736     GZ_GRAPH_EXPORT static gzNode   *loadDB(const gzString &url , gzString extension=GZ_EVALUATE_EXTENSION , gzSerializeAdapterFlags flags=GZ_DB_FLAGS_DEFAULT , gzULong version=0 , const gzString &password=GZ_EMPTY_STRING);
00737 
00738     GZ_GRAPH_EXPORT virtual gzNode  *loadDB(gzSerializeAdapter *adapter );
00739 
00740     GZ_GRAPH_EXPORT static gzBool   saveDB(gzNode *node , const gzString &url , gzString extension=GZ_EVALUATE_EXTENSION , gzSerializeAdapterFlags flags=GZ_DB_FLAGS_DEFAULT, gzULong version=0 , const gzString &password=GZ_EMPTY_STRING);
00741 
00742     GZ_GRAPH_EXPORT virtual gzBool  saveDB(gzNode *node , gzSerializeAdapter *adapter);
00743 
00745     GZ_GRAPH_EXPORT virtual gzString    getExtensions()=0;
00746 
00748     GZ_GRAPH_EXPORT virtual gzULong getVersion(const gzString &extension)=0;
00749 
00750     GZ_GRAPH_EXPORT static gzString getAllExtensions();
00751 
00752 protected:
00753 
00755     GZ_GRAPH_EXPORT virtual gzVoid  registerManager(const gzString &extension);
00756 
00757 
00758     static gzRefDict<gzString,gzDbManager> s_registeredDbManagers;
00759 };  
00760 
00761 #endif // __GZ_NODE_H__
00762 

Documentation for Gizmo3D generated at Wed Feb 20 11:54:07 2008 by   Saab Training Systems AB, ¸ (c) 2003-and beyond