transform.h

Go to the documentation of this file.
00001 
00005 /* Copyright, 2000 Nevrax Ltd.
00006  *
00007  * This file is part of NEVRAX NEL.
00008  * NEVRAX NEL is free software; you can redistribute it and/or modify
00009  * it under the terms of the GNU General Public License as published by
00010  * the Free Software Foundation; either version 2, or (at your option)
00011  * any later version.
00012 
00013  * NEVRAX NEL is distributed in the hope that it will be useful, but
00014  * WITHOUT ANY WARRANTY; without even the implied warranty of
00015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
00016  * General Public License for more details.
00017 
00018  * You should have received a copy of the GNU General Public License
00019  * along with NEVRAX NEL; see the file COPYING. If not, write to the
00020  * Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
00021  * MA 02111-1307, USA.
00022  */
00023 
00024 #ifndef NL_TRANSFORM_H
00025 #define NL_TRANSFORM_H
00026 
00027 #include "nel/3d/hrc_trav.h"
00028 #include "nel/3d/track.h"
00029 #include "nel/3d/transformable.h"
00030 #include "nel/3d/animated_value.h"
00031 #include "nel/3d/channel_mixer.h"
00032 #include "nel/misc/matrix.h"
00033 #include "nel/misc/matrix.h"
00034 #include "nel/misc/aabbox.h"
00035 #include "nel/3d/light_contribution.h"
00036 #include "nel/3d/lighting_manager.h"
00037 #include "nel/misc/class_id.h"
00038 #include "nel/3d/fast_ptr_list.h"
00039 
00040 
00041 namespace   NLMISC
00042 {
00043     class   CAABBox;
00044 };
00045 
00046 
00047 namespace   NL3D
00048 {
00049 
00050 using NLMISC::CRGBA;
00051 
00052 
00053 using NLMISC::CVector;
00054 using NLMISC::CPlane;
00055 using NLMISC::CMatrix;
00056 using NLMISC::CAABBox;
00057 
00058 
00059 class   CSkeletonModel;
00060 class   CInstanceGroup;
00061 class   ILogicInfo;
00062 class   CLoadBalancingGroup;
00063 class   CSkinSpecularRdrPass;
00064 class   CShadowMap;
00065 class   CMaterial;
00066 class   IDriver;
00067 class CInstanceUser;
00068 
00069 // ***************************************************************************
00070 // ClassIds.
00071 const NLMISC::CClassId      TransformId=NLMISC::CClassId(0x174750cb, 0xf952024);
00072 
00073 
00074 // ***************************************************************************
00097 class CTransform : public ITransformable
00098 {
00099 public:
00101     static  void    registerBasic();
00102 
00104     CScene          *getOwnerScene() const {return _OwnerScene;}
00105 
00106 public:
00107 
00109     // @{
00110 
00118     virtual void    update();
00119 
00130     virtual void    initModel();
00131 
00133     virtual void    traverseHrc();
00143     virtual void    traverseClip();
00145     virtual void    traverseAnimDetail();
00147     virtual void    traverseLoadBalancing();
00149     virtual void    traverseLight();
00151     virtual void    traverseRender();
00152 
00154     virtual bool    clip()
00155     {
00156         return true;
00157     }
00158 
00160     virtual void    profileRender();
00161 
00162 
00163     // @}
00164 
00165     // build matching user interface object (a class derived from CInstanceUser)
00166     virtual class UTransform *buildMatchingUserInterfaceObject ();
00167 
00168 public:
00169 
00172     void            setTransparency(bool v);
00173     void            setOpacity(bool v);
00174     // no op for non multi-lod object, else, force the opacity /
00175     void            setBypassLODOpacityFlag(bool bypass);
00176     bool            getBypassLODOpacityFlag() const{ return getStateFlag(BypassLODOpacity) != 0;  }
00177     // return a non-zero value if true
00178     uint32          isOpaque() { return getStateFlag(IsOpaque); }
00179     uint32          isTransparent() { return getStateFlag(IsTransparent); }
00180 
00181 
00189     void            setOrderingLayer(uint layer) { _OrderingLayer = uint8(layer); }
00190 
00192     uint            getOrderingLayer() const { return _OrderingLayer; }
00193 
00195     //  an object with distance 10 and priority 1 will be displayed before any object with distance 1 and priority 0.
00196     // IMPORTANT : priority is clamped by the number of priorities defined in the scene. By default there's only one priority of 0
00197     // that is possible, so priority ordering doesn't actually occurs.
00198     void            setTransparencyPriority(uint8 priority) { _TransparencyPriority = priority; }
00199     uint8           getTransparencyPriority() const { return _TransparencyPriority; }
00200 
00202     void            hide();
00204     void            show();
00205     /*
00206      *  Enable / disable user clipping. If enable, the transform is not clipped into the engine.
00207      *  The user has to use show / hide to clip or not the transform.
00208      */
00209     void            setUserClipping(bool enable);
00211     bool            getUserClipping() const;
00213     void            heritVisibility();
00215     CHrcTrav::TVisibility   getVisibility() {return Visibility;}
00217     CSkeletonModel*         getSkeletonModel () const {return _FatherSkeletonModel;}
00218     // Get the ancestor skeleton, (father skeleton that has the least depth in the model tree), or NULL if none
00219     CSkeletonModel          *getAncestorSkeletonModel() const { return _AncestorSkeletonModel; }
00220 
00222     // @{
00225     void            hrcLinkSon(CTransform *son);
00228     void            hrcUnlink();
00229     // get the Hrc parent if any (else NULL)
00230     CTransform      *hrcGetParent() const {return _HrcParent;}
00231     // get Sons links. NB: indices are no more valid after an hrcUnlink()
00232     uint            hrcGetNumChildren() const {return _HrcSons.size();}
00233     CTransform      *hrcGetChild(uint index) const;
00234     // @}
00235 
00236 
00238     // @{
00239     // Add a link from me to son for Clip Graph (no-op if son==this)
00240     void            clipAddChild(CTransform *son);
00241     // Remove a link from me to son for Clip Graph (no-op if not found)
00242     void            clipDelChild(CTransform *son);
00243     // unlink from all parent clip
00244     void            clipUnlinkFromAll();
00245     // get Parents links. NB: indices are no more valid after a clipDelChild()
00246     uint            clipGetNumParents() const {return _ClipParents.size();}
00247     CTransform      *clipGetParent(uint index) const;
00248     // get Sons links. NB: indices are no more valid after a clipDelChild()
00249     uint            clipGetNumChildren() const {return _ClipSons.size();}
00250     CTransform      *clipGetChild(uint index) const;
00251     // @}
00252 
00253 
00255     // @{
00257     virtual ITrack* getDefaultTrack (uint valueId);
00261     virtual void    registerToChannelMixer(CChannelMixer *chanMixer, const std::string &prefix);
00262     // @}
00263 
00268     void            setChannelMixerOwnerShip(bool enable = true)    { setStateFlag(IsDeleteChannelMixer, enable); }
00269     bool            getChannelMixerOwnerShip() const { return getStateFlag(IsDeleteChannelMixer)!=0; }
00270 
00271 
00279     void            freeze();
00280     void            setDontUnfreezeChildren(bool val);
00281 
00282 
00296     void            freezeHRC();
00297 
00298 
00301     void            unfreezeHRC();
00302 
00303 
00306     uint32          isQuadGridClipEnabled() const {return getStateFlag(QuadGridClipEnabled);}
00307 
00311     const CMatrix&  getWorldMatrix() const {return _WorldMatrix;}
00312 
00313     // force the world matrix (could be modified next frame after hrc traversal
00314     void            setWorldMatrix(const CMatrix &mat) { _WorldMatrix = mat;}
00315 
00318     bool    isHrcVisible() const
00319     {
00320         return _WorldVis;
00321     }
00322 
00325     bool    isClipVisible() const
00326     {
00327         return _Visible;
00328     }
00329 
00330 
00331     // A RefPtr is kept on the clusterSystem, so getClusterSystem() will return NULL if the instance group has been deleted
00332     void                setClusterSystem (CInstanceGroup *pCS);
00333     CInstanceGroup*     getClusterSystem ();
00334 
00335 
00337     // @{
00343     void                resetLighting();
00344 
00350     uint32              isLightable() const {return getStateFlag(IsFinalLightable);}
00351 
00356     void                setUserLightable(bool enable);
00357 
00360     bool                getUserLightable() const {return getStateFlag(IsUserLightable)!=0;}
00361 
00366     void                freezeStaticLightSetup(CPointLight *pointLight[NL3D_MAX_LIGHT_CONTRIBUTION],
00367         uint numPointLights, uint8 sunContribution, CPointLight *frozenAmbientlight);
00368 
00373     void                unfreezeStaticLightSetup();
00374 
00378     uint32              isBigLightable() const {return getStateFlag(IsBigLightable);}
00379 
00382     bool                useMergedPointLight() const {return _LightContribution.UseMergedPointLight;}
00383 
00386     const CLightContribution &getLightContribution() const { return _LightContribution; }
00387 
00388 
00394     virtual void        getLightHotSpotInWorld(CVector &modelPos, float &modelRadius) const {modelPos= CVector::Null; modelRadius=0;}
00395 
00396     // @}
00397 
00398 
00402     void                setLogicInfo(ILogicInfo *logicInfo) {_LogicInfo= logicInfo;}
00403 
00404 
00407     virtual void        getAABBox(NLMISC::CAABBox &bbox) const;
00408 
00409 
00411     // @{
00412 
00422     void                setLoadBalancingGroup(const std::string &group);
00423 
00426     const std::string   &getLoadBalancingGroup() const;
00427 
00428     // @}
00429 
00430 
00432     // @{
00434     uint32              isSkeleton() const {return getStateFlag(IsSkeleton);}
00436     uint32              isSkinned() const {return getStateFlag(IsSkinned);}
00446     virtual bool        getSkinBoneBBox(NLMISC::CAABBox &/* bbox */, uint /* boneId */) {return false;}
00447     // @}
00448 
00449 
00451     // @{
00452 
00457     void                setMeanColor(CRGBA color);
00458 
00460     CRGBA               getMeanColor() const {return _MeanColor;}
00461 
00463     uint32              isAnimDetailable() const {return getStateFlag(IsAnimDetailable);}
00465     uint32              isLoadBalancable() const {return getStateFlag(IsLoadBalancable);}
00467     uint32              isRenderable() const {return getStateFlag(IsRenderable);}
00468 
00470     uint32              isMeshBaseInstance() const {return getStateFlag(IsMeshBaseInstance);}
00472     uint32              isTransformShape() const {return getStateFlag(IsTransformShape);}
00474     uint32              isCluster() const {return getStateFlag(IsCluster);}
00475 
00482     bool                supportFastIntersect() const {return _SupportFastIntersect;}
00489     virtual bool        fastIntersect(const NLMISC::CVector &/* p0 */, const NLMISC::CVector &/* dir */, float &/* dist2D */, float &/* distZ */, bool /* computeDist2D */) {return false;}
00490 
00492     void                enableFastIntersectSupport(bool enable) {_SupportFastIntersect= enable;}
00493 
00494     // @}
00495 
00496 
00504     // @{
00509     void                enableCastShadowMap(bool state);
00511     bool                canCastShadowMap() const {return getStateFlag(IsFinalShadowMapCaster)!=0;}
00512 
00516     void                enableReceiveShadowMap(bool state) {if(modelCanReceiveShadowMap()) setStateFlag(IsFinalShadowMapReceiver, state);}
00518     bool                canReceiveShadowMap() const {return getStateFlag(IsFinalShadowMapReceiver)!=0;}
00519 
00521     uint32              modelCanCastShadowMap() const {return getStateFlag(IsShadowMapCaster);}
00523     uint32              modelCanReceiveShadowMap() const {return getStateFlag(IsShadowMapReceiver);}
00524 
00533     virtual void        generateShadowMap(const CVector &/* lightDir */) { }
00536     virtual CShadowMap  *getShadowMap() {return NULL;}
00537 
00540     virtual void        getReceiverBBox(CAABBox &bbox);
00541 
00547     virtual void        receiveShadowMap(CShadowMap * /* shadowMap */, const CVector &/* casterPos */, const CMaterial &/* shadowMat */) { }
00548 
00552     virtual const CMatrix   &getReceiverRenderWorldMatrix() const {return getWorldMatrix();}
00553 
00555     void                setGeneratingShadowMap(bool state) {if(canCastShadowMap()) setStateFlag(IsGeneratingShadowMap, state);}
00556     bool                isGeneratingShadowMap() const {return getStateFlag(IsGeneratingShadowMap)!=0;}
00557 
00562     virtual bool        computeWorldBBoxForShadow(NLMISC::CAABBox &/* worldBB */) {return false;}
00568     virtual void        renderIntoSkeletonShadowMap(CSkeletonModel * /* rootSkeleton */, CMaterial  &/* castMat */) { }
00569 
00579     void                setShadowMapDirectionZThreshold(float zthre);
00580     float               getShadowMapDirectionZThreshold() const {return _ShadowMapDirectionZThreshold;}
00581 
00587     void                setShadowMapMaxDepth(float depth);
00588     float               getShadowMapMaxDepth() const {return _ShadowMapMaxDepth;}
00589 
00590     // @}
00591 
00598     void                setForceClipRoot(bool forceClipRoot);
00599     bool                getForceClipRoot() const { return getStateFlag(ForceClipRoot) != 0; }
00600 
00601 
00602     // test if the model is a flare
00603     virtual bool isFlare() const { return false; }
00604 
00605 
00607     void        setSSSWO(bool state) {setStateFlag(SSSWO, state);}
00608     bool        getSSSWO() const {return getStateFlag(SSSWO)!=0;}
00609 
00610 
00611 // ********
00612 private:
00613     CHrcTrav::TVisibility   Visibility;
00614 
00615     static  CTrackDefaultVector     DefaultPos;
00616     static  CTrackDefaultVector     DefaultPivot;
00617     static  CTrackDefaultVector     DefaultRotEuler;
00618     static  CTrackDefaultQuat       DefaultRotQuat;
00619     static  CTrackDefaultVector     DefaultScale;
00620 
00621 protected:
00626     CTransform();
00628     virtual ~CTransform();
00629 
00631     virtual void    unlinkFromQuadCluster() {}
00632 
00634     // @{
00635 
00637     virtual bool            isSkinnable() const {return false;}
00642     virtual void            setApplySkin(bool state);
00648     virtual const std::vector<sint32>           *getSkinBoneUsage() const {return NULL;}
00654     virtual const std::vector<NLMISC::CBSphere> *getSkinBoneSphere() const {return NULL;}
00660     virtual void            renderSkin(float /* alphaMRM */) { }
00661 
00662 
00667     virtual bool            supportSkinGrouping() const {return false;}
00671     virtual sint            renderSkinGroupGeom(float /* alphaMRM */, uint /* remainingVertices */, uint8 * /* dest */) {return 0;}
00676     virtual void            renderSkinGroupPrimitives(uint /* baseVertex */, std::vector<CSkinSpecularRdrPass> &/* specularRdrPasses */, uint /* skinIndex */) { }
00678     virtual void            renderSkinGroupSpecularRdrPass(uint /* rdrPass */) { }
00679 
00681     virtual bool            supportShadowSkinGrouping() const {return false;}
00682     virtual sint            renderShadowSkinGeom(uint /* remainingVertices */, uint8 * /* vbDest */) {return 0;}
00683     virtual void            renderShadowSkinPrimitives(CMaterial &/* castMat */, IDriver * /* drv */, uint /* baseVertex */) { }
00684 
00691     virtual bool            supportIntersectSkin() const {return false;}
00692     virtual bool            intersectSkin(const CMatrix &/* toRaySpace */, float &/* dist2D */, float &/* distZ */, bool /* computeDist2D */) {return false;}
00693 
00694     // The SkeletonModel, root of us (skinning or sticked object). NULL , if normal mode.
00695     CSkeletonModel  *_FatherSkeletonModel;
00696     // If sticked object, id of the bone in the _FatherSkeletonModel.
00697     uint            _FatherBoneId;
00698 
00699     // @}
00700 
00702     // @{
00703 
00705     CLightContribution      _LightContribution;
00706 
00708     uint32                  isNeedUpdateLighting() const {return getStateFlag(IsNeedUpdateLighting);}
00710     uint32                  isNeedUpdateFrozenStaticLightSetup() const {return getStateFlag(IsNeedUpdateFrozenStaticLightSetup);}
00711 
00713     CLightingManager::CQGItLightedModel     _LightedModelIt;
00714 
00715     // @}
00716 
00717 
00720     CChannelMixer           *getChannelMixer() const {return _ChannelMixer;}
00721 
00722 
00724     // @{
00725 
00727     void                setIsLightable(bool val);
00733     void                setIsRenderable(bool val);
00735     void                setIsBigLightable(bool val);
00737     void                setIsSkeleton(bool val);
00741     void                setIsForceAnimDetail(bool val);
00743     void                setIsLoadbalancable(bool val);
00744 
00746     void                setIsMeshBaseInstance(bool val) {setStateFlag(IsMeshBaseInstance, val);}
00748     void                setIsTransformShape(bool val) {setStateFlag(IsTransformShape, val);}
00750     void                setIsCluster(bool val) {setStateFlag(IsCluster, val);}
00751 
00753     void                setIsShadowMapCaster(bool val) {setStateFlag(IsShadowMapCaster, val);}
00754     void                setIsShadowMapReceiver(bool val) {setStateFlag(IsShadowMapReceiver, val);}
00755 
00756     // @}
00757 
00759     bool                getShowWhenLODSticked() const { return _ForceCLodSticked; }
00760 
00761     // force to compute that transform matrix (useful if matrix needed but clipped because sticked to a clipped skeleton for example)
00762     void                forceCompute();
00763 
00764 private:
00765     static CTransform   *creator() {return new CTransform;}
00766     friend class    CSkeletonModel;
00767     friend class    CScene;
00768     friend class    CClipTrav;
00769     friend class    CAnimDetailTrav;
00770     friend class    CRenderTrav;
00771 
00772     // The Scene which owns us
00773     CScene          *_OwnerScene;
00774 
00776     // @{
00777     // Hrc hierarchy. One parent and possible multiple sons
00778     CFastPtrListNode            _HrcNode;
00779     CFastPtrList<CTransform>    _HrcSons;
00780     CTransform                  *_HrcParent;
00781     NLMISC::CRefPtr<CTransform> _HrcParentUnfreeze;
00782 
00783     /* Clip Graph. DAG (Direct Acyclic Graph)
00784      *  NB: implementation optmized for Low number of parent. clipAddChild() and clipDelChild() is in O(numParents).
00785      */
00786     struct  CClipNode
00787     {
00788         CFastPtrListNode            ClipNode;
00789         CTransform                  *Parent;
00790     };
00791     CFastPtrList<CTransform>    _ClipSons;
00792     std::vector<CClipNode*>     _ClipParents;
00793     bool            clipHasParent(CTransform *parent);
00794     void            clipDelFromParent(CTransform *parent);
00795 
00796     // @}
00797 
00799     // @{
00800     // linked list of models to update.
00801     CTransform      *_PrecModelToUpdate;
00802     CTransform      *_NextModelToUpdate;
00803 
00804     // for CScene::createModel() and for CTransform::freezeHRC() only.
00805     void            linkToUpdateList();
00806     void            unlinkFromUpdateList();
00807 
00808     // @}
00809 
00810 
00811     // For anim detail.
00812     NLMISC::CRefPtr<CChannelMixer>      _ChannelMixer;
00813 
00814     // Last date of ITransformable matrix.
00815     uint64          _LastTransformableMatrixDate;
00816 
00817     NLMISC::CRefPtr<CInstanceGroup>     _ClusterSystem;
00818 
00819 
00820     enum    TFreezeHRCState { FreezeHRCStateDisabled=0, FreezeHRCStateRequest, FreezeHRCStateReady, FreezeHRCStateEnabled};
00821     TFreezeHRCState         _FreezeHRCState;
00822 
00823     uint8               _OrderingLayer;
00824     uint8               _TransparencyPriority;
00825 
00826     // For stickObjectEx(). with forceCLod==true
00827     bool                _ForceCLodSticked : 1;
00828 
00830     bool                _TransformDirty   : 1;
00831 
00832     // see supportFastIntersect. Filled by CSkeletonModel
00833     bool                _SupportFastIntersect : 1;
00834 
00836     ILogicInfo          *_LogicInfo;
00837 
00838 
00840     CRGBA               _MeanColor;
00841 
00843     std::list<CTransform*>::iterator        _ItShadowCasterInScene;
00844 
00846     float                       _ShadowMapDirectionZThreshold;
00847     float                       _ShadowMapMaxDepth;
00848 
00850     // @{
00851 
00853     enum    TState  {
00854         // Post-clipping Traversal flags. If set, then the object is inserted into traversal list.
00855         IsAnimDetailable=       0x0001,
00856         IsLoadBalancable=       0x0002,
00857         IsLightable=            0x0004,
00858         IsRenderable=           0x0008,
00859         // Transparency Flags.
00860         IsTransparent=          0x0010,
00861         IsOpaque=               0x0020,
00862         // For fast clip.
00863         QuadGridClipEnabled=    0x0040,
00864         // Lighting.
00865         IsUserLightable=        0x0080,
00866         IsFinalLightable=       0x0100,     // IsLightable && IsUserLightable
00867         IsBigLightable=         0x0200,
00868         IsNeedUpdateLighting=   0x0400,
00869         IsNeedUpdateFrozenStaticLightSetup=
00870                                 0x0800,
00871         // Skinning
00872         IsSkeleton=             0x1000,     // set if the model is a skeleton (faster than dynamic_cast)
00873         IsSkinned=              0x2000,     // true if the model is isSkinnable() and if currently skinned
00874         // Misc
00875         IsDeleteChannelMixer=   0x4000,
00876         IsForceAnimDetail=      0x8000,
00877         IsMeshBaseInstance=     0x10000,
00878         IsTransformShape=       0x20000,    // set if the model is a transform_shape (faster than dynamic_cast)
00879         IsCluster=              0x40000,    // set if the model is a cluster (faster than dynamic_cast)
00880         UserClipping=           0x80000,    // set if the user provide a clip method, don't call clip() in ClipTrav
00881 
00882         // ShadowMap
00883         IsShadowMapCaster=      0x100000,   // set if the model can cast ShadowMap
00884         IsFinalShadowMapCaster= 0x200000,   // set if the model can cast ShadowMap AND the user want it
00885         IsShadowMapReceiver=    0x400000,   // set if the model can receive ShadowMap
00886         IsFinalShadowMapReceiver= 0x800000, // set if the model can receive ShadowMap AND the user want it
00887         IsGeneratingShadowMap=  0x1000000,  // temp set if the model is asked to render its shadowMap this frame.
00888 
00889         ForceClipRoot           = 0x2000000,// Force the object to always be attached to the root
00890                                             // As a consequence, it can't be inserted into a cluster system (even the root cluster)
00891                                             // and is thus always visible when in the frustum
00892         ClusterSystemAuto       = 0x4000000,
00893 
00894         SSSWO                   = 0x8000000,    // Special for SkeletonSpawnScript. if set, the WorldMatrix is special
00895 
00896         BypassLODOpacity        = 0x10000000    // for mesh multi lod : do not use the LOD opacity / transparency, but the parent one (overwritten at traversal, else ...)
00897 
00898         // NB: may continue on >=0x20000000
00899     };
00900 
00902     uint32              _StateFlags;
00903 
00905     void                setStateFlag(uint32 mask, bool val)
00906     {
00907         // reset the state.
00908         _StateFlags&= ~mask;
00909         // set the state
00910         _StateFlags|= ( 0- ((uint32)val) ) & mask;
00911     }
00912 
00914     uint32              getStateFlag(uint32 mask) const
00915     {
00916         return _StateFlags&mask;
00917     }
00918 
00919     // @}
00920 
00921 protected:
00922 
00926     uint32                      _RenderFilterType;
00927 
00928 
00929 protected:
00930 
00932     // @{
00933 
00935     CMatrix     _LocalMatrix;
00936     CHrcTrav::TVisibility   _LocalVis;  // The visibility state of the node.
00937     sint64      _LocalDate;             // The update date of the LocalMatrix.
00939     CMatrix     _WorldMatrix;
00940     sint64      _WorldDate;         // The update date of the WorldMatrix.
00941     bool        _WorldVis;          // Is the node visible? (enabled?)
00942     // Transform Specicic Hrc
00943     bool        _Frozen;
00944     bool        _DontUnfreezeChildren; // Useful when cluster system move to not test instance again
00945     bool        _ClipLinkedInSonsOfAncestorSkeletonModelGroup;
00946     // !NULL if any skeleton is an ancestor in hierarchy. Updated at each Hrc traversal!!
00947     CSkeletonModel  *_AncestorSkeletonModel;
00948 
00950     void        updateWorld();
00951     // according to _AncestorSkeletonModel, link clipTrav.
00952     void        updateClipTravForAncestorSkeleton();
00953 
00954     // @}
00955 
00956 
00958     // @{
00959 
00961     sint64      _ClipDate;
00962     // The index of the Observer in the _VisibleList; -1 (default) means not in
00963     sint        _IndexInVisibleList;
00965     bool        _Visible;
00966 
00967     // @}
00968 
00970     // @{
00971     // Used by CRenderTrav. see CRenderTrav::removeRenderModel() implementation
00972     uint8       _IndexLSBInRenderList;
00973     // @}
00974 
00976     // @{
00977 
00983     void            updateWorldMatrixFromFather();
00984 
00988     void            traverseAnimDetailWithoutUpdateWorldMatrix();
00989 
00990     // @}
00991 
00993     // @{
00994     // Which group owns this model
00995     CLoadBalancingGroup     *_LoadBalancingGroup;
00996     // @}
00997 
00999     // @{
01004     virtual void            createShadowMap() {}
01006     virtual void            deleteShadowMap() {}
01007     // @}
01008 
01009 };
01010 
01011 
01012 } // namespace NL3D
01013 
01014 
01015 #endif // NL_TRANSFORM_H
01016 
01017 /* End of transform.h */

Generated on Thu Jan 7 08:26:21 2010 for NeL by  doxygen 1.6.1