NL3D::CSkeletonModel Class Reference

#include <skeleton_model.h>

Inheritance diagram for NL3D::CSkeletonModel:

NL3D::CTransformShape NL3D::CTransform NLMISC::CRefCount NL3D::ITransformable NL3D::IAnimatable

Detailed Description

A Skeleton model, instance of CSkeletonShape.

Skeletons sons are added with bindSkin(), stickObject(). They are removed auto at dtor.

Author:
Lionel Berenguier

Nevrax France

Date:
2001

Definition at line 84 of file skeleton_model.h.

IAnimatable Interface (registering only IAnimatable sons (bones)).

enum  TAnimValues { OwnerBit = CTransformShape::AnimValueLast, AnimValueLast }
 Added values. More...

virtual void registerToChannelMixer (CChannelMixer *chanMixer, const std::string &prefix)

Skin/BoneUsage Accessor. Called by CMeshInstance only.

enum  TBoneUsageType { UsageNormal, UsageForced, UsageCLodForced }
void decBoneUsage (uint i, TBoneUsageType boneUsageType)
 decrement the refCount of the ith bone. set forced to the same param passed when incBoneUsage()

void flagBoneAndParents (uint32 boneId, std::vector< bool > &boneUsage) const
void incBoneUsage (uint i, TBoneUsageType boneUsageType)

Skinning Behavior.

virtual const std::vector<
NLMISC::CBSphere > * 
getSkinBoneSphere () const
virtual const std::vector<
sint32 > * 
getSkinBoneUsage () const
virtual bool isSkinnable () const
 Deriver must change this method if the model can be skinned. called rarely.

virtual sint renderShadowSkinGeom (uint remainingVertices, uint8 *vbDest)
virtual void renderShadowSkinPrimitives (CMaterial &castMat, IDriver *drv, uint baseVertex)
virtual void renderSkin (float alphaMRM)
virtual sint renderSkinGroupGeom (float alphaMRM, uint remainingVertices, uint8 *dest)
virtual void renderSkinGroupPrimitives (uint baseVertex, std::vector< CSkinSpecularRdrPass > &specularRdrPasses, uint skinIndex)
virtual void renderSkinGroupSpecularRdrPass (uint rdrPass)
 Render a specific specular renderPass returned by renderSkinGroupPrimitives.

virtual void setApplySkin (bool state)
virtual bool supportShadowSkinGrouping () const
 Special Skinning For ShadowMapping.

virtual bool supportSkinGrouping () const
uint _FatherBoneId
CSkeletonModel_FatherSkeletonModel

[NOHEADER]

uint32 isNeedUpdateFrozenStaticLightSetup () const
 non-zero if the object has a FrozenStaticLightSetup not correclty updated.

uint32 isNeedUpdateLighting () const
 non-zero if the object needs to updatelighting.

CLightContribution _LightContribution
 The contribution of all lights. This enlarge the struct only of approx 15%.

CLightingManager::CQGItLightedModel _LightedModelIt
 each transform may be in a quadGird of lighted models (see CLightingManager)


Hrc Traversal

void updateClipTravForAncestorSkeleton ()
void updateWorld ()
 Update the world state according to the parent world state and the local states.

CSkeletonModel_AncestorSkeletonModel
bool _ClipLinkedInSonsOfAncestorSkeletonModelGroup
bool _DontUnfreezeChildren
bool _Frozen
sint64 _LocalDate
CMatrix _LocalMatrix
 Hrc IN variables.

CHrcTrav::TVisibility _LocalVis
sint64 _WorldDate
CMatrix _WorldMatrix
 Hrc OUT variables.

bool _WorldVis

CLod / Character Lod

void computeCLodVertexAlpha (CLodCharacterManager *mngr)
 recompute _CLodVertexAlpha, ignoring _CLodVertexAlphaDirty

void dirtLodVertexAlpha ()
 recompute _CLodVertexAlpha, ignoring _CLodVertexAlphaDirty

const CLightContributiongetSkeletonLightContribution ()
 recompute _CLodVertexAlpha, ignoring _CLodVertexAlphaDirty

CLodCharacterInstance _CLodInstance
 The Lod instance. -1 by default.

bool _CLodVertexAlphaDirty
bool _DisplayedAsLodCharacter
float _LodCharacterDistance
 see setLodCharacterDistance

float _OOLodCharacterDistance
 recompute _CLodVertexAlpha, ignoring _CLodVertexAlphaDirty


Bone Usage.

void decForcedBoneUsageAndParents (uint i, bool forceCLod)
 increment the refCount of the ith bone and its parents. for stickObjects.

void incForcedBoneUsageAndParents (uint i, bool forceCLod)
 increment the refCount of the ith bone and its parents. for stickObjects.

void initBoneUsages ()
 called by CSkeletonShape::createInstance(). init the vector.

void updateBoneToCompute ()
 According to Usage, ForedUsage and current skeleton Lod, update MustCompute and ValidBoneSkinMatrix.

std::vector< CBoneCompute_BoneToCompute
 List of bones to compute.

bool _BoneToComputeDirty
 Flag set if the MRSkeleton lod change, or if a new bone Usage change (only if was 0 or become 0).

std::vector< CBoneUsage_BoneUsage
 The list of BoneUsage. Updated by Meshes, stickObject(), and lod changes.

uint _CurLod
 The current lod activated for this skeleton.

float _CurLodInterp
 The current lod Interpolation Value for this skeleton.

float _LodInterpMultiplier
 For lod interpolation. Inverse of distance. If 0, disable interpolation.


Public Types

enum  { MaxNumBones = 256 }
 max number of bones supported in skeleton More...

enum  TTransformMode { DirectMatrix = 0, RotEuler, RotQuat, TransformModeCount }

Public Member Functions

virtual bool canStartStop ()
 Test if there is a start/stop caps in the objects (some fxs such as remanence).

bool compareMatrixDate (uint64 callerDate) const
void freeze ()
void freezeHRC ()
virtual void getAABBox (NLMISC::CAABBox &bbox) const
CSkeletonModelgetAncestorSkeletonModel () const
bool getChannelMixerOwnerShip () const
CInstanceGroupgetClusterSystem ()
float getDistMax () const
bool getForceClipRoot () const
CLightContributiongetLightContribution ()
virtual void getLightHotSpotInWorld (CVector &modelPos, float &modelRadius) const
virtual CMaterialgetMaterial (uint materialId)
virtual const CMaterialgetMaterial (uint materialId) const
const CMatrixgetMatrix () const
 Get the matrix, compute her if necessary (work in all modes).

uint64 getMatrixDate () const
virtual uint getNumMaterial () const
uint getOrderingLayer () const
 Get the ordering layer.

CScenegetOwnerScene () const
 get the scene which has created us

const sintgetRefCount () const
CSkeletonModelgetSkeletonModel () const
 Get the skeleton model. Returnr NULL in normal mode.

bool getUserClipping () const
 Return the user clipping state.

CHrcTrav::TVisibility getVisibility ()
 Get the local visibility state.

const CMatrixgetWorldMatrix () const
void heritVisibility ()
 herit the visibility from his father. (default behavior).

void hide ()
 Hide the object and his sons.

bool isClipVisible () const
bool isHrcVisible () const
bool isLinkToQuadCluster () const
 true if the model is linked to a quadCluster

uint32 isOpaque ()
uint32 isQuadGridClipEnabled () const
virtual bool isStarted () const
uint32 isTransparent ()
void setChannelMixerOwnerShip (bool enable=true)
void setClusterSystem (CInstanceGroup *pCS)
void setDistMax (float distMax)
void setDontUnfreezeChildren (bool val)
void setForceClipRoot (bool forceClipRoot)
void setLogicInfo (ILogicInfo *logicInfo)
void setOpacity (bool v)
void setOrderingLayer (uint layer)
void setTransparency (bool v)
void setUserClipping (bool enable)
void setWorldMatrix (const CMatrix &mat)
void show ()
 Show the objet and his sons.

virtual void start ()
virtual void stop ()
void unfreezeHRC ()
void updateSkinRenderLists ()
Skin operation.
bool bindSkin (CTransform *mi)
void detachSkeletonSon (CTransform *mi)
void dirtSkinRenderLists ()
void stickObject (CTransform *mi, uint boneId)
void stickObjectEx (CTransform *mi, uint boneId, bool forceCLod)
Load balancing methods
void changeMRMDistanceSetup (float distanceFinest, float distanceMiddle, float distanceCoarsest)
virtual float getNumTriangles (float distance)
 Special version for skins.

void resetDefaultMRMDistanceSetup ()
 Reset the Default MRM setup: follow MAX skin setup (ie the finer).

Misc.
void computeAllBones (const CMatrix &modelWorldMatrix)
bool computeCurrentBBox (NLMISC::CAABBox &bbox, bool forceCompute=false, bool computeInWorld=false)
bool computeRenderedBBox (NLMISC::CAABBox &bbox, bool computeInWorld=false)
bool forceComputeBone (uint boneId)
const NLMISC::CMatrixgetActiveBoneSkinMatrix (uint boneId) const
sint32 getBoneIdByName (const std::string &name) const
 return, from skeleton shape, the BoneIdByName. -1 if not here.

float getInterpolationDistance () const
 see setInterpolationDistance()

uint getNumBoneComputed () const
 return the number of bones currently animated/computed (because of bindSkin()/stickObject() / Lod system).

bool isBoneComputed (uint boneId) const
 Tell if a bone has been computed in the last frame or not. false if boneId is invalid.

void setInterpolationDistance (float dist)
CLod / Character Lod
float computeDisplayLodCharacterPriority () const
void computeLodTexture ()
uint getLodCharacterAnimId () const
TGlobalAnimationTime getLodCharacterAnimTime () const
float getLodCharacterDistance () const
 see setLodCharacterDistance. 0 if disabled

sint getLodCharacterShape () const
 see setLodCharacterShape

bool getLodCharacterWrapMode () const
bool isDisplayedAsLodCharacter () const
void setDisplayLodCharacterFlag (bool displayCLod)
void setLodCharacterAnimId (uint animId)
 Change/get the Character Lod anim setup.

void setLodCharacterAnimTime (TGlobalAnimationTime time)
void setLodCharacterDistance (float dist)
void setLodCharacterShape (sint shapeId)
 Change the Character Lod shape Id. set -1 if want to disable the feature (default).

void setLodCharacterWrapMode (bool wrapMode)
 tells if the animation must loop or clamp.

ShadowMap CTransform Implementation
virtual bool computeWorldBBoxForShadow (NLMISC::CAABBox &worldBB)
virtual void generateShadowMap (const CVector &lightDir)
virtual CShadowMapgetShadowMap ()
virtual void renderIntoSkeletonShadowMap (CSkeletonModel *rootSkeleton, CMaterial &castMat)
AnimCtrl (IK...)
IAnimCtrlgetBoneAnimCtrl (uint boneId) const
void setBoneAnimCtrl (uint boneId, IAnimCtrl *ctrl)
CTransform traverse specialisation
virtual void traverseAnimDetail ()
virtual void traverseRender ()

Static Public Member Functions

const char * getPivotValueName ()
const char * getPosValueName ()
const char * getRotEulerValueName ()
const char * getRotQuatValueName ()
const char * getScaleValueName ()
void registerBasic ()
 Call at the begining of the program, to register the model.


Data Fields

std::vector< CBoneBones
sint crefs
CPtrInfo * pinfo
CSmartPtr< IShapeShape
 The shape, the object instancied.


Static Public Attributes

CPtrInfo NullPtrInfo

Protected Member Functions

sint addValue (CChannelMixer *chanMixer, uint valueId, uint ownerValueId, const std::string &prefix, bool detail)
void clearFlag (uint valueId)
 This method clear a bit in the bitset.

virtual void createShadowMap ()
 CSkeletonModel ()
 Constructor.

virtual void deleteShadowMap ()
 To implement for ShadowCaster support. typically free the shadowMap.

void forceCompute ()
CChannelMixergetChannelMixer () const
bool getShowWhenLODSticked () const
 Test if obj must be displayed when sticked to an object displayed as a LOD (example: sword in hand of a character displayed as a LOD state).

virtual void initModel ()
 Build link to traversals.

void setFlag (uint valueId)
 This method set a bit in the bitset.

void setupCurrentLightContribution (CLightContribution *lightContrib, bool useLocalAtt)
virtual void unlinkFromQuadCluster ()
 special feature for CQuadGridClipManager. remove from it.

virtual ~CSkeletonModel ()
 Destructor.


Protected Attributes

uint32 _RenderFilterType

Private Types

typedef TTransformSet::iterator ItTransformSet
typedef NLMISC::CObjectVector<
CTransform *, false > 
TTransformArray
typedef std::set< CTransform * > TTransformSet
 skins/sticked objects


Private Member Functions

void buildDefaultLevelDetail ()
void renderShadowSkins (CMaterial &castMat)
void updateShadowMap (IDriver *driver)
Rendering
void renderCLod ()
void renderSkinList (NLMISC::CObjectVector< CTransform *, false > &skinList, float alphaMRM)
void renderSkins ()

Static Private Member Functions

CTransformcreator ()

Private Attributes

TTransformArray _AnimDetailSkins
bool _DefaultMRMSetup
std::list< CSkeletonModel
* >::iterator 
_ItSkeletonInScene
CMRMLevelDetail _LevelDetail
TTransformArray _OpaqueSkins
CShadowMap_ShadowMap
TTransformSet _Skins
 The skins.

bool _SkinToRenderDirty
TTransformSet _StickedObjects
 The StickedObjects.

TTransformArray _TransparentSkins
AnimCtrl (IK...)
sint _AnimCtrlUsage

Friends

struct CPtrInfo
class CSkeletonShape


Member Typedef Documentation

typedef TTransformSet::iterator NL3D::CSkeletonModel::ItTransformSet [private]
 

Definition at line 371 of file skeleton_model.h.

Referenced by computeCLodVertexAlpha(), computeLodTexture(), computeWorldBBoxForShadow(), renderIntoSkeletonShadowMap(), and updateSkinRenderLists().

typedef NLMISC::CObjectVector<CTransform*, false> NL3D::CSkeletonModel::TTransformArray [private]
 

Definition at line 382 of file skeleton_model.h.

typedef std::set<CTransform*> NL3D::CSkeletonModel::TTransformSet [private]
 

skins/sticked objects

Definition at line 370 of file skeleton_model.h.


Member Enumeration Documentation

anonymous enum
 

max number of bones supported in skeleton

Enumeration values:
MaxNumBones 

Definition at line 88 of file skeleton_model.h.

00088 { MaxNumBones = 256 };

enum NL3D::CSkeletonModel::TAnimValues
 

Added values.

Enumeration values:
OwnerBit 
AnimValueLast 

Reimplemented from NL3D::ITransformable.

Definition at line 103 of file skeleton_model.h.

00104         {
00105                 OwnerBit= CTransformShape::AnimValueLast, 
00106 
00107                 AnimValueLast,
00108         };

enum NL3D::CSkeletonModel::TBoneUsageType
 

Enumeration values:
UsageNormal 
UsageForced 
UsageCLodForced 

Definition at line 158 of file skeleton_model.h.

enum NL3D::ITransformable::TTransformMode [inherited]
 

Enumeration values:
DirectMatrix 
RotEuler 
RotQuat 
TransformModeCount 

Definition at line 58 of file transformable.h.

Referenced by NL3D::ITransformable::getTransformMode().

00059         {
00060                 DirectMatrix=0,         // DirectMatrixMode.
00061                 RotEuler,                       // Matrix is computed from sperated composantes, with euler rotation.
00062                 RotQuat,                        // Matrix is computed from sperated composantes, with quat rotation (default).
00063 
00064                 TransformModeCount
00065         };


Constructor & Destructor Documentation

NL3D::CSkeletonModel::CSkeletonModel  )  [protected]
 

Constructor.

Definition at line 75 of file skeleton_model.cpp.

References _AnimCtrlUsage, _CLodVertexAlphaDirty, _DefaultMRMSetup, _DisplayedAsLodCharacter, _LodCharacterDistance, _OOLodCharacterDistance, _SkinToRenderDirty, buildDefaultLevelDetail(), NL3D::CTransform::setOpacity(), and NL3D::CTransform::setTransparency().

00076 {
00077         IAnimatable::resize(AnimValueLast);
00078         _DisplayedAsLodCharacter= false;
00079         _LodCharacterDistance= 0;
00080         _OOLodCharacterDistance= 0;
00081 
00082         _DefaultMRMSetup= true;
00083 
00084         _SkinToRenderDirty= false;
00085 
00086         _CLodVertexAlphaDirty= true;
00087 
00088         // Inform the transform that I am a skeleton
00089         CTransform::setIsSkeleton(true);
00090 
00091         // By default, no skins, hence, impossible to have transparent pass. But opaque pass is always possible
00092         // because of CLod rendering
00093         setOpacity(true);
00094         setTransparency(false);
00095 
00096         // AnimDetail behavior: Must be traversed in AnimDetail, even if no channel mixer registered
00097         CTransform::setIsForceAnimDetail(true);
00098 
00099         // LoadBalancing behavior. true because directly act on skins to draw all their MRM level
00100         CTransform::setIsLoadbalancable(true);
00101 
00102         // Lighting behavior. Lightable because skins/stickedObjects may surely need its LightContribution
00103         CTransform::setIsLightable(true);
00104 
00105         // Render behavior. Always renderable, because either render the skeleton as a CLod, or render skins
00106         CTransform::setIsRenderable(true);
00107 
00108         // build a bug-free level detail
00109         buildDefaultLevelDetail();
00110 
00111         // RenderFilter: We are a skeleton
00112         _RenderFilterType= UScene::FilterSkeleton;
00113 
00114         _AnimCtrlUsage= 0;
00115 
00116         // ShadowMap
00117         CTransform::setIsShadowMapCaster(true);
00118         _ShadowMap= NULL;
00119 }

NL3D::CSkeletonModel::~CSkeletonModel  )  [protected, virtual]
 

Destructor.

Definition at line 123 of file skeleton_model.cpp.

References _ItSkeletonInScene, _Skins, _StickedObjects, deleteShadowMap(), detachSkeletonSon(), NL3D::CScene::eraseSkeletonModelToList(), NL3D::CTransform::getOwnerScene(), and setLodCharacterShape().

00124 {
00125         // if initModel() called
00126         if(getOwnerScene())
00127         {
00128                 // remove from scene
00129                 getOwnerScene()->eraseSkeletonModelToList(_ItSkeletonInScene);
00130         }
00131 
00132 
00133         // detach skeleton sons from skins.
00134         while(_Skins.begin()!=_Skins.end())
00135         {
00136                 detachSkeletonSon(*_Skins.begin());
00137         }
00138 
00139         // detach skeleton sons from sticked objects.
00140         while(_StickedObjects.begin()!=_StickedObjects.end())
00141         {
00142                 detachSkeletonSon(*_StickedObjects.begin());
00143         }
00144 
00145         // Free Lod instance
00146         setLodCharacterShape(-1);
00147 
00148         // delete the shadowMap
00149         deleteShadowMap();
00150 }


Member Function Documentation

sint NL3D::IAnimatable::addValue CChannelMixer chanMixer,
uint  valueId,
uint  ownerValueId,
const std::string &  prefix,
bool  detail
[protected, inherited]
 

This is a tool function which add a given value to a channel.

Returns:
-1 if the track was not found in the animationSet, else it return the channelId as if returned by CAnimationSet::getChannelIdByName(channelName).

Definition at line 37 of file animatable.cpp.

References NL3D::CChannelMixer::addChannel(), NL3D::IAnimatable::getDefaultTrack(), NL3D::IAnimatable::getValue(), NL3D::IAnimatable::getValueName(), nlassert, sint, and uint.

Referenced by NL3D::CTransform::registerToChannelMixer(), NL3D::CParticleSystemModel::registerToChannelMixer(), NL3D::CCamera::registerToChannelMixer(), NL3D::CBone::registerToChannelMixer(), NL3D::CAnimatedMorph::registerToChannelMixer(), NL3D::CAnimatedMaterial::registerToChannelMixer(), and NL3D::CAnimatedLightmap::registerToChannelMixer().

00038 {
00039         nlassert(chanMixer);
00040         return chanMixer->addChannel(prefix+getValueName(valueId), this, getValue(valueId), getDefaultTrack(valueId), valueId, ownerValueId, detail);
00041 }

bool NL3D::CSkeletonModel::bindSkin CTransform mi  ) 
 

bind a skin to the skeleton. NB: ~CTransform() calls detachSkeletonSon(). NB: nlassert() if there is too many skins/sticked objects on this skeleton (more than 255). NB: an object can't be skinned and sticked at same time :) NB: replaced if already here. NB: when a skin is binded, the command hide(), show(), ... have no effect on it, until it is detachSkeletonSon()-ed NB: For Skins, all Hrc/Clip/UpdateList link is done here

Returns:
false if mi is not skinnable, true otherwise

Definition at line 497 of file skeleton_model.cpp.

References NL3D::CTransform::_ClipLinkedInSonsOfAncestorSkeletonModelGroup, NL3D::CTransform::_FatherSkeletonModel, _Skins, NL3D::CTransform::clipUnlinkFromAll(), detachSkeletonSon(), dirtLodVertexAlpha(), dirtSkinRenderLists(), NL3D::CTransform::hrcUnlink(), NL3D::CTransform::isSkinnable(), nlassert, NL3D::CTransform::setApplySkin(), NL3D::CTransform::unfreezeHRC(), and NL3D::CTransform::unlinkFromUpdateList().

Referenced by NL3D::CSkeletonUser::bindSkin().

00498 {
00499         nlassert(mi);
00500         if( !mi->isSkinnable() )
00501                 return false;
00502 
00503         // try to detach this object from any skeleton first (possibly me).
00504         if(mi->_FatherSkeletonModel)
00505                 mi->_FatherSkeletonModel->detachSkeletonSon(mi);
00506 
00507         // Then Add me.
00508         _Skins.insert(mi);
00509 
00510         // advert skin transform it is skinned.
00511         mi->_FatherSkeletonModel= this;
00512         // setApplySkin() use _FatherSkeletonModel to computeBonesId() and to update current skeleton bone usage.
00513         mi->setApplySkin(true);
00514 
00515 
00516         // Unlink the Skin from Hrc and clip, because SkeletonModel now does the job for him.
00517         // First ensure that the transform is not frozen (unlink from some quadGrids etc...)
00518         mi->unfreezeHRC();
00519         // then never re-parse in validateList/Hrc/Clip
00520         mi->unlinkFromUpdateList();
00521         mi->hrcUnlink();
00522         // ClipTrav is a graph, so must unlink from ALL olds models.
00523         mi->clipUnlinkFromAll();
00524         // Ensure flag is correct
00525         mi->_ClipLinkedInSonsOfAncestorSkeletonModelGroup= false;
00526 
00527 
00528         // must recompute lod vertex alpha when LodCharacter used
00529         dirtLodVertexAlpha();
00530         // must recompute list of skins.
00531         dirtSkinRenderLists();
00532 
00533         // Ok, skinned
00534         return true;
00535 }

void NL3D::CSkeletonModel::buildDefaultLevelDetail  )  [private]
 

Definition at line 1282 of file skeleton_model.cpp.

References NL3D::CMRMLevelDetail::compileDistanceSetup(), NL3D::CMRMLevelDetail::DistanceCoarsest, NL3D::CMRMLevelDetail::DistanceFinest, NL3D::CMRMLevelDetail::DistanceMiddle, NL3D::CMRMLevelDetail::MaxFaceUsed, and NL3D::CMRMLevelDetail::MinFaceUsed.

Referenced by CSkeletonModel(), and updateSkinRenderLists().

01283 {
01284         // Avoid divide by zero.
01285         _LevelDetail.MinFaceUsed= 0;
01286         _LevelDetail.MaxFaceUsed= 0;
01287         _LevelDetail.DistanceFinest= 1;
01288         _LevelDetail.DistanceMiddle= 2;
01289         _LevelDetail.DistanceCoarsest= 3;
01290         _LevelDetail.compileDistanceSetup();
01291 }

bool NL3D::CTransform::canCastShadowMap  )  const [inline, inherited]
 

true if the instance cast shadow. By default false

Definition at line 470 of file transform.h.

References NL3D::CTransform::getStateFlag(), and NL3D::CTransform::IsFinalShadowMapCaster.

Referenced by NL3D::CClipTrav::clipSkeletonShadowMaps(), NL3D::CTransform::enableCastShadowMap(), NL3D::CTransform::setGeneratingShadowMap(), and NL3D::CMeshInstance::traverseRender().

00470 {return getStateFlag(IsFinalShadowMapCaster)!=0;}

bool NL3D::CTransform::canReceiveShadowMap  )  const [inline, inherited]
 

true if the instance receive shadow. By default false

Definition at line 477 of file transform.h.

References NL3D::CTransform::getStateFlag(), and NL3D::CTransform::IsFinalShadowMapReceiver.

Referenced by NL3D::CLandscapeUser::canReceiveShadowMap(), and NL3D::CLandscapeModel::traverseRender().

00477 {return getStateFlag(IsFinalShadowMapReceiver)!=0;}

virtual bool NL3D::CTransformShape::canStartStop  )  [inline, virtual, inherited]
 

Test if there is a start/stop caps in the objects (some fxs such as remanence).

Reimplemented in NL3D::CSegRemanence.

Definition at line 126 of file transform_shape.h.

Referenced by NL3D::CInstanceUser::canStartStop().

00126 { return false; }

void NL3D::CTransformShape::changeLightSetup CRenderTrav rdrTrav  )  [inherited]
 

setup lighting for this instance into driver. The traverseRender().

Definition at line 105 of file transform_shape.cpp.

References NL3D::CTransformShape::_CurrentLightContribution, NL3D::CTransformShape::_CurrentUseLocalAttenuation, and NL3D::CRenderTrav::changeLightSetup().

Referenced by NL3D::CMeshMRMGeom::activeInstance(), NL3D::CMeshGeom::activeInstance(), renderSkins(), and NL3D::CTransformShape::traverseRender().

00106 {
00107         // setup the instance lighting.
00108         rdrTrav->changeLightSetup(_CurrentLightContribution, _CurrentUseLocalAttenuation);
00109 }

void NL3D::CSkeletonModel::changeMRMDistanceSetup float  distanceFinest,
float  distanceMiddle,
float  distanceCoarsest
 

Special version for skins. NB: skins never follow their original MRM distance setup, but follow this skeleton MRM setup. Default is to follow the MAX of all skins binded (ie the finer). NB: Unlike CMeshBaseInstance::changeMRMDistanceSetup(), this setup applies to the SkeletonModel, not the shape. NB: no-op if distanceFinest<0, distanceMiddle<=distanceFinest or if distanceCoarsest<=distanceMiddle.

Parameters:
distanceFinest The MRM has its max faces when dist<=distanceFinest.
distanceMiddle The MRM has 50% of its faces at dist==distanceMiddle.
distanceCoarsest The MRM has faces/Divisor (ie near 0) when dist>=distanceCoarsest.

Definition at line 1589 of file skeleton_model.cpp.

References _DefaultMRMSetup, NL3D::CMRMLevelDetail::compileDistanceSetup(), NL3D::CMRMLevelDetail::DistanceCoarsest, NL3D::CMRMLevelDetail::DistanceFinest, and NL3D::CMRMLevelDetail::DistanceMiddle.

Referenced by NL3D::CSkeletonUser::changeMRMDistanceSetup().

01590 {
01591         // check input.
01592         if(distanceFinest<0)    return;
01593         if(distanceMiddle<=distanceFinest)      return;
01594         if(distanceCoarsest<=distanceMiddle)    return;
01595 
01596         // Change.
01597         _LevelDetail.DistanceFinest= distanceFinest;
01598         _LevelDetail.DistanceMiddle= distanceMiddle;
01599         _LevelDetail.DistanceCoarsest= distanceCoarsest;
01600 
01601         // compile 
01602         _LevelDetail.compileDistanceSetup();
01603 
01604         // Never more use MAX skin setup.
01605         _DefaultMRMSetup= false;
01606 }

void NL3D::IAnimatable::clearFlag uint  valueId  )  [inline, protected, inherited]
 

This method clear a bit in the bitset.

Definition at line 233 of file animatable.h.

References NL3D::IAnimatable::_BitSet, and uint.

Referenced by NL3D::ITransformable::clearTransformFlags(), NL3D::CParticleSystemModel::doAnimate(), and NL3D::CAnimatedMaterial::update().

00234         {
00235                 _BitSet&= ~(1<<valueId);
00236         }

bool NL3D::CTransformShape::clip  )  [virtual, inherited]
 

clip method called by traverseClip(). deafult is always visible

Reimplemented from NL3D::CTransform.

Reimplemented in NL3D::CParticleSystemModel, and NL3D::CWaterModel.

Definition at line 141 of file transform_shape.cpp.

References NL3D::CTravCameraScene::CamPos, NL3D::CClipTrav::ForceNoFrustumClip, NL3D::CScene::getClipTrav(), NL3D::CTransformShape::getDistMax(), NL3D::CTransform::getOwnerScene(), NLMISC::CMatrix::getPos(), NL3D::CTransform::getWorldMatrix(), H_AUTO, NL3D::CTransformShape::Shape, and NL3D::CClipTrav::WorldPyramid.

00142 {
00143         H_AUTO( NL3D_TrShape_Clip );
00144 
00145         CClipTrav                       &clipTrav= getOwnerScene()->getClipTrav();
00146 
00147         if(Shape)
00148         {
00149                 // first test DistMax (faster).
00150                 float maxDist = getDistMax();
00151                 // if DistMax test enabled
00152                 if(maxDist!=-1)
00153                 {
00154                         // Calc the distance
00155                         float sqrDist = (clipTrav.CamPos - getWorldMatrix().getPos()).sqrnorm ();
00156                         maxDist*=maxDist;
00157                         
00158                         // if dist > maxDist, skip
00159                         if (sqrDist > maxDist)
00160                         {
00161                                 // Ok, not shown
00162                                 return false;
00163                         }
00164                 }
00165 
00166                 // Else finer clip with pyramid, only if needed
00167                 if(clipTrav.ForceNoFrustumClip)
00168                         return true;
00169                 else
00170                         return Shape->clip(clipTrav.WorldPyramid, getWorldMatrix());
00171         }
00172         else
00173                 return false;
00174 }

void NL3D::CTransform::clipAddChild CTransform son  )  [inherited]
 

Definition at line 1217 of file transform.cpp.

References NL3D::CTransform::_ClipParents, NL3D::CTransform::_ClipSons, NL3D::CTransform::clipHasParent(), NL3D::CTransform::CClipNode::ClipNode, NL3D::CFastPtrList< CTransform >::insert(), and NL3D::CTransform::CClipNode::Parent.

Referenced by NL3D::CScene::createModel(), detachSkeletonSon(), NL3D::CLandscapeModel::initModel(), NL3D::CScene::initQuadGridClipManager(), NL3D::CQuadGridClipClusterListDist::resetSons(), NL3D::CClipTrav::traverse(), and NL3D::CTransform::updateClipTravForAncestorSkeleton().

01218 {
01219         if(!son)
01220                 return;
01221 
01222         // if already linked, no-op.
01223         if(son->clipHasParent(this))
01224                 return;
01225 
01226         // add a new parent entry for our son.
01227         CClipNode       *clipNode= new CClipNode;
01228         son->_ClipParents.push_back(clipNode);
01229 
01230         // link the son to us
01231         clipNode->Parent= this;
01232 
01233         // link us to the son 
01234         _ClipSons.insert(son, &clipNode->ClipNode);
01235 }

void NL3D::CTransform::clipDelChild CTransform son  )  [inherited]
 

Definition at line 1238 of file transform.cpp.

References NL3D::CTransform::clipDelFromParent().

Referenced by NL3D::CScene::initDefaultRoots(), NL3D::CLandscapeModel::initModel(), NL3D::CClipTrav::traverse(), and NL3D::CTransform::~CTransform().

01239 {
01240         if(!son)
01241                 return;
01242 
01243         // try to remove from me from my parent
01244         son->clipDelFromParent(this);
01245 }

CTransform * NL3D::CTransform::clipGetChild uint  index  )  const [inherited]
 

Definition at line 1265 of file transform.cpp.

References NL3D::CTransform::_ClipSons, index, nlassert, NL3D::CFastPtrList< CTransform >::size(), and uint.

Referenced by NL3D::CCluster::recursTraverseClip(), NL3D::CTransform::traverseClip(), NL3D::CRootModel::traverseClip(), NL3D::CParticleSystemModel::traverseClip(), and NL3D::CTransform::~CTransform().

01266 {
01267         nlassert(index < _ClipSons.size());
01268         return (const_cast<CTransform*>(this))->_ClipSons.begin()[index];
01269 }

uint NL3D::CTransform::clipGetNumChildren  )  const [inline, inherited]
 

Definition at line 237 of file transform.h.

References NL3D::CTransform::_ClipSons, NL3D::CFastPtrList< CTransform >::size(), and uint.

Referenced by NL3D::CCluster::recursTraverseClip(), NL3D::CTransform::traverseClip(), NL3D::CRootModel::traverseClip(), NL3D::CParticleSystemModel::traverseClip(), and NL3D::CTransform::~CTransform().

00237 {return _ClipSons.size();}

uint NL3D::CTransform::clipGetNumParents  )  const [inline, inherited]
 

Definition at line 234 of file transform.h.

References NL3D::CTransform::_ClipParents, and uint.

Referenced by NL3D::CTransform::clipUnlinkFromAll(), NL3D::CClipTrav::traverse(), and NL3D::CTransform::updateClipTravForAncestorSkeleton().

00234 {return _ClipParents.size();}

CTransform * NL3D::CTransform::clipGetParent uint  index  )  const [inherited]
 

Definition at line 1258 of file transform.cpp.

References NL3D::CTransform::_ClipParents, index, nlassert, and uint.

Referenced by NL3D::CTransform::clipUnlinkFromAll(), NL3D::CClipTrav::traverse(), and NL3D::CTransform::updateClipTravForAncestorSkeleton().

01259 {
01260         nlassert(index < _ClipParents.size());
01261         return _ClipParents[index]->Parent;
01262 }

void NL3D::CTransform::clipUnlinkFromAll  )  [inherited]
 

Definition at line 1248 of file transform.cpp.

References NL3D::CTransform::clipDelFromParent(), NL3D::CTransform::clipGetNumParents(), and NL3D::CTransform::clipGetParent().

Referenced by bindSkin(), NL3D::CScene::initQuadGridClipManager(), NL3D::CTransform::updateClipTravForAncestorSkeleton(), and NL3D::CTransform::~CTransform().

01249 {
01250         // unlink from all parent clip
01251         while( clipGetNumParents() )
01252         {
01253                 clipDelFromParent( clipGetParent(0) );
01254         }
01255 }

bool NL3D::ITransformable::compareMatrixDate uint64  callerDate  )  const [inline, inherited]
 

Tells if the LocalMatrix is newer than what caller except. This return true either if the matrix components (pos/rot etc...) are touched, or if matrix is newer than caller date.

Definition at line 82 of file transformable.h.

References NL3D::ITransformable::_LocalMatrixDate, NL3D::ITransformable::needCompute(), and uint64.

Referenced by NL3D::CWaterModel::updateDiffuseMapMatrix().

00083         {
00084                 return callerDate<_LocalMatrixDate || needCompute();
00085         }

void NL3D::CSkeletonModel::computeAllBones const CMatrix modelWorldMatrix  ) 
 

Tool function, especially for animation bake. It updates all bones (independent of bone usage, and lod interpolation), and take a user skeleton worldMatrix as input. NB: no detail animation is performed here, just the compute of bone hierarchy. NB: also, no special AnimCtrl (IK etc....) is performed here

Definition at line 807 of file skeleton_model.cpp.

References Bones, sint, and uint.

Referenced by NL3D::CLodCharacterBuilder::addAnim(), and computeCurrentBBox().

00808 {
00809         // must test / update the hierarchy of Bones.
00810         // Since they are orderd in depth-first order, we are sure that parent are computed before sons.
00811         for(uint i=0;i<Bones.size();i++)
00812         {
00813                 sint    fatherId= Bones[i].getFatherId();
00814                 // if a root bone...
00815                 if(fatherId==-1)
00816                         // Compute root bone worldMatrix. Do not allow special AnimCtrl
00817                         Bones[i].compute( NULL, modelWorldMatrix, NULL);
00818                 else
00819                         // Compute bone worldMatrix. Do not allow special AnimCtrl
00820                         Bones[i].compute( &Bones[fatherId], modelWorldMatrix, NULL);
00821         }
00822 
00823 }

void NL3D::CSkeletonModel::computeCLodVertexAlpha CLodCharacterManager mngr  )  [private]
 

recompute _CLodVertexAlpha, ignoring _CLodVertexAlphaDirty

Definition at line 1043 of file skeleton_model.cpp.

References _CLodInstance, NL3D::CTransform::_FatherBoneId, _Skins, _StickedObjects, NL3D::CLodCharacterShape::addBoneAlpha(), Bones, NL3D::CLodCharacterShape::getBoneIdByName(), NL3D::CLodCharacterManager::getShape(), NL3D::CTransform::getSkinBoneUsage(), ItTransformSet, NL3D::CLodCharacterInstance::ShapeId, sint, NL3D::CLodCharacterShape::startBoneAlpha(), uint, and NL3D::CLodCharacterInstance::VertexAlphas.

Referenced by renderCLod().

01044 {
01045         // if shape id set.
01046         if(_CLodInstance.ShapeId<0)
01047                 return;
01048         // get the lod shape,a nd check exist in the manager
01049         const CLodCharacterShape        *lodShape= mngr->getShape(_CLodInstance.ShapeId);
01050         if(lodShape)
01051         {
01052                 // start process.
01053                 //-----------------
01054                 lodShape->startBoneAlpha(_CLodInstance.VertexAlphas);
01055 
01056                 // build an Id map, from Skeleton Ids to the lodShapes ids. (because may be differents)
01057                 static vector<sint>     boneMap;
01058                 // reset to -1 (ie not found)
01059                 boneMap.clear();
01060                 boneMap.resize(Bones.size(), -1);
01061                 uint i;
01062                 // for all skeletons bones.
01063                 for(i=0; i<boneMap.size(); i++)
01064                 {
01065                         boneMap[i]= lodShape->getBoneIdByName(Bones[i].getBoneName());;
01066                 }
01067 
01068                 // Parse all skins
01069                 //-----------------
01070                 ItTransformSet  it;
01071                 for(it= _Skins.begin(); it!=_Skins.end(); it++)
01072                 {
01073                         CTransform      *skin= *it;
01074 
01075                         // get array of bone used for this skin.
01076                         const vector<sint32>    *skinUsage= skin->getSkinBoneUsage();
01077                         // check correct skin
01078                         if(skinUsage)
01079                         {
01080                                 // For all bones used
01081                                 for(uint i=0; i<skinUsage->size(); i++)
01082                                 {
01083                                         // the id in the vector point to a bone in the skeleton. Hence use the boneMap to translate it
01084                                         // in the lodShape ids.
01085                                         sint    idInLod= boneMap[(*skinUsage)[i]];
01086                                         // only if id found in the lod shape
01087                                         if(idInLod>=0)
01088                                                 // add color to this bone.
01089                                                 lodShape->addBoneAlpha(idInLod, _CLodInstance.VertexAlphas);
01090                                 }
01091 
01092                         }
01093                 }
01094 
01095                 // Parse all sticked objects
01096                 //-----------------
01097                 for(it= _StickedObjects.begin(); it!=_StickedObjects.end(); it++)
01098                 {
01099                         CTransform      *object= *it;
01100 
01101                         // get on which bone this object is linked.
01102                         // use the boneMap to translate id to lodShape id.
01103                         sint    idInLod= boneMap[object->_FatherBoneId];
01104 
01105                         // only if id found in the lod shape
01106                         if(idInLod>=0)
01107                                 // add color to this bone.
01108                                 lodShape->addBoneAlpha(idInLod, _CLodInstance.VertexAlphas);
01109                 }
01110 
01111         }
01112 
01113 }

bool NL3D::CSkeletonModel::computeCurrentBBox NLMISC::CAABBox bbox,
bool  forceCompute = false,
bool  computeInWorld = false
 

same as computeRenderedBBox() but force animation and compute of all bones => don't need render(), but slower. for all used bones, extend the bbox with their pos NB: AnimCtrl are not evaluated by this method (since computed with 0 pos).

Parameters:
bbox return the bbox of the skinned skeleton, local to the skeleton. If the skeleton is not skinned/sticked at all, bbox is not modified.
forceCompute force evalution even if not skinned
computeInWorld true if want to get the bbox in world.
Returns:
true if the bbox is computed, false otherwise.

Definition at line 1665 of file skeleton_model.cpp.

References _BoneUsage, Bones, computeAllBones(), NL3D::CChannelMixer::eval(), NLMISC::CAABBox::extend(), NL3D::CTransform::getChannelMixer(), NL3D::CChannelMixer::resetEvalDetailDate(), NLMISC::CAABBox::setCenter(), NLMISC::CAABBox::setHalfSize(), uint, and uint8.

Referenced by NL3D::CSkeletonUser::computeCurrentBBox().

01666 {
01667         // animate all bones channels (detail only channels). don't bother cur lod state.
01668         CChannelMixer   *chanmix= getChannelMixer();
01669         if (chanmix)
01670         {       
01671                 // Force detail evaluation.
01672                 chanmix->resetEvalDetailDate();
01673                 chanmix->eval(true, 0);
01674                 chanmix->resetEvalDetailDate();
01675         }
01676         // compute all skeleton bones
01677         computeAllBones(CMatrix::Identity);
01678 
01679         // reset bbox
01680         CAABBox         tmpBBox;
01681         tmpBBox.setCenter(CVector::Null);
01682         tmpBBox.setHalfSize(CVector::Null);
01683         bool    empty= true;
01684 
01685         // For all bones
01686         uint    i;
01687         for(i=0;i<Bones.size();i++)
01688         {
01689                 // Is the bone used ?? (whatever bone lod, or CLod state)
01690                 uint8   mustCompute = forceCompute ? 1 : _BoneUsage[i].Usage | _BoneUsage[i].ForcedUsage | _BoneUsage[i].CLodForcedUsage;
01691 
01692                 // If the bone is used.
01693                 if(mustCompute)
01694                 {
01695                         CVector pos;
01696                         if(computeInWorld)
01697                                 pos= Bones[i].getWorldMatrix().getPos();
01698                         else
01699                                 pos= Bones[i].getLocalSkeletonMatrix().getPos();
01700                         if(empty)
01701                         {
01702                                 empty= false;
01703                                 tmpBBox.setCenter(pos);
01704                         }
01705                         else
01706                                 tmpBBox.extend(pos);
01707                 }
01708         }
01709 
01710         // End!
01711         if(!empty)
01712         {
01713                 bbox= tmpBBox;
01714                 return true;
01715         }
01716         else
01717                 return false;
01718 }

float NL3D::CSkeletonModel::computeDisplayLodCharacterPriority  )  const
 

Called in ClipTrav pass. Used to update the flag _DisplayedAsLodCharacter. return 0 if CLod not enabled. Else return a priority>0 computed from curDistance/LodCharacterDistance return 0 too if the skeleton is not visible or if his ancestorSkeletonModel is not visible. If priority is >1 then the skeleton must be displayed in CLod form

Definition at line 972 of file skeleton_model.cpp.

References _CLodInstance, _LodCharacterDistance, _OOLodCharacterDistance, NL3D::CTravCameraScene::CamPos, NL3D::CScene::getClipTrav(), NL3D::CTransform::getOwnerScene(), NLMISC::CMatrix::getPos(), NL3D::CTransform::getWorldMatrix(), NL3D::CTransform::isClipVisible(), and NL3D::CLodCharacterInstance::ShapeId.

Referenced by NL3D::CClipTrav::loadBalanceSkeletonCLod().

00973 {
00974         // if enabled
00975         if(_LodCharacterDistance>0 && _CLodInstance.ShapeId>=0)
00976         {
00977                 CVector         globalPos;
00978                 /* \todo yoyo: bad test of visibility. If the skeleton is hidden but has a _AncestorSkeletonModel 
00979                         wich is visible, then it is supposed to be visible (in this test), but only for The CLod LoadBalancing 
00980                         (priority not 0). Not so important...
00981                 */
00982 
00983                 // Get object position, test visibility;
00984                 // If has a skeleton ancestor, take his world position instead, because ours is invalid.
00985                 if( _AncestorSkeletonModel != NULL)
00986                 {
00987                         // if the ancestore is clipped, quit
00988                         if( !_AncestorSkeletonModel->isClipVisible() )
00989                                 return 0;
00990                         // take ancestor world position
00991                         globalPos= _AncestorSkeletonModel->getWorldMatrix().getPos();
00992                 }
00993                 else
00994                 {
00995                         // if the skeleton is clipped, quit
00996                         if( !isClipVisible() )
00997                                 return 0;
00998                         // take our world position
00999                         globalPos= getWorldMatrix().getPos();
01000                 }
01001 
01002                 // compute distance from camera.
01003                 float   dist= (getOwnerScene()->getClipTrav().CamPos - globalPos).norm();
01004 
01005                 // compute priority
01006                 return dist*_OOLodCharacterDistance;
01007         }
01008         else
01009                 return 0;
01010 }

void NL3D::CSkeletonModel::computeLodTexture  ) 
 

Call it when you want the system to recompute the Lod texture NB: Lod texturing is possible only in conjunction with AsyncTextureManager. Hence, instances skinned to the skeleton should be in AsyncTextureMode. For best result, you should wait that each of these instances are isAsyncTextureReady() (texture loaded)

Definition at line 866 of file skeleton_model.cpp.

References _CLodInstance, _Skins, NL3D::CLodCharacterManager::addTextureCompute(), NL3D::CLodCharacterTmpBitmap::build(), NL3D::CLodCharacterManager::endTextureCompute(), NL3D::CMeshBaseInstance::getAsyncTextureId(), NL3D::CScene::getAsyncTextureManager(), NL3D::CMeshBaseInstance::getAsyncTextureMode(), NL3D::CAsyncTextureManager::getCoarseBitmap(), NL3D::CScene::getLodCharacterManager(), NL3D::CMeshBase::getLodCharacterTexture(), NL3D::CTransform::getOwnerScene(), NL3D::CLodCharacterManager::getTmpBitmap(), ItTransformSet, NL3D::CMeshBaseInstance::Materials, min, nlassert, NL3D::CTransformShape::Shape, NL3D::CLodCharacterInstance::ShapeId, sint, NL3D::CLodCharacterManager::startTextureCompute(), and uint.

Referenced by NL3D::CSkeletonUser::computeLodTexture().

00867 {
00868         // is lod setuped
00869         if(_CLodInstance.ShapeId<0)
00870                 return;
00871 
00872         // get a ptr on the scene which owns us, and so on the lodManager.
00873         CScene                                  *scene= getOwnerScene();
00874         CLodCharacterManager    *mngr= scene->getLodCharacterManager();
00875         // mngr must be setuped since shape Id is >-1
00876         nlassert(mngr);
00877         /* Get the asyncTextureManager. This is a Hack. We use the AsyncTextureManager to store very low version of Textures
00878                 (kept in DXTC1 format for minimum memory overhead).
00879                 HENCE Lod Texture can work only with Async Textured instances!!
00880         */
00881         CAsyncTextureManager    *asyncMngr= scene->getAsyncTextureManager();
00882         // if not setuped, cancel
00883         if(!asyncMngr)
00884                 return;
00885 
00886 
00887         // **** start process. If cannot (TextureId==no more texture space), just quit.
00888         if(!mngr->startTextureCompute(_CLodInstance))
00889                 return;
00890         uint maxNumBmpToReset= 0;
00891 
00892         // **** For all skins which have a LodTexture setuped
00893         ItTransformSet  it= _Skins.begin();
00894         for(;it!=_Skins.end();it++)
00895         {
00896                 // the skin should be a meshBaseInstance setuped to asyncTexturing
00897                 CMeshBaseInstance       *mbi= dynamic_cast<CMeshBaseInstance*>(*it);
00898                 if(mbi && mbi->getAsyncTextureMode() && mbi->Shape)
00899                 {
00900                         CMeshBase       *mb= (CMeshBase*)(IShape*)(mbi->Shape);
00901                         // get the LodTexture info of this shape.
00902                         const CLodCharacterTexture      *lodText= mb->getLodCharacterTexture();
00903                         // if setuped
00904                         if(lodText)
00905                         {
00906                                 // Ok, compute influence of this instance on the Lod.
00907 
00908                                 // ---- Build all bmps of the instance with help of the asyncTextureManager
00909                                 uint    numMats= mbi->Materials.size();
00910                                 // 256 materials possibles for the lod Manager
00911                                 numMats= min(numMats, 256U);
00912                                 // for endTexturecompute
00913                                 maxNumBmpToReset= max(maxNumBmpToReset, numMats);
00914                                 // process each materials
00915                                 for(uint i=0;i<numMats;i++)
00916                                 {
00917                                         // get the manager bitmap to write to
00918                                         CLodCharacterTmpBitmap  &dstBmp= mngr->getTmpBitmap(i);
00919 
00920                                         // if the material stage 0 is not textured, or has not a valid async id, build the bitmap with a color.
00921                                         sint                    asyncTextId= mbi->getAsyncTextureId(i,0);
00922                                         const CBitmap   *coarseBitmap= NULL;
00923                                         if(asyncTextId!=-1)
00924                                         {
00925                                                 // get it from async manager
00926                                                 coarseBitmap= asyncMngr->getCoarseBitmap(asyncTextId);
00927                                         }
00928 
00929                                         // So if we have no bmp here, build with material color, else build a texture
00930                                         if(!coarseBitmap)
00931                                         {
00932                                                 dstBmp.build(mbi->Materials[i].getDiffuse());
00933                                         }
00934                                         else
00935                                         {
00936                                                 dstBmp.build(*coarseBitmap);
00937                                         }
00938                                 }
00939 
00940                                 // ---- add the lodTextureInfo to the current texture computed
00941                                 mngr->addTextureCompute(_CLodInstance, *lodText);
00942                         }
00943                 }
00944         }
00945 
00946         // **** compile the process
00947         mngr->endTextureCompute(_CLodInstance, maxNumBmpToReset);
00948 
00949 }

bool NL3D::CSkeletonModel::computeRenderedBBox NLMISC::CAABBox bbox,
bool  computeInWorld = false
 

Retrieve the current approx BBox around the skeleton, computed in the last CSene::render(). for all computed bones, extend the bbox with their pos

Parameters:
bbox return the bbox of the skinned skeleton, local to the skeleton. If the skeleton was clipped, the bbox is not modified.
computeInWorld true if want to get the bbox in world.
Returns:
true if the bbox is computed, false otherwise.

Definition at line 1620 of file skeleton_model.cpp.

References Bones, NLMISC::CAABBox::extend(), isBoneComputed(), NL3D::CTransform::isClipVisible(), NLMISC::CAABBox::setCenter(), NLMISC::CAABBox::setHalfSize(), and uint.

Referenced by NL3D::CSkeletonUser::computeRenderedBBox().

01621 {
01622         // reset bbox
01623         CAABBox         tmpBBox;
01624         tmpBBox.setCenter(CVector::Null);
01625         tmpBBox.setHalfSize(CVector::Null);
01626         bool    empty= true;
01627 
01628         // Not visible => empty bbox
01629         if(!isClipVisible())
01630                 return false;
01631 
01632         // For all bones
01633         uint    i;
01634         for(i=0;i<Bones.size();i++)
01635         {
01636                 if(isBoneComputed(i))
01637                 {
01638                         CVector pos;
01639                         if(computeInWorld)
01640                                 pos= Bones[i].getWorldMatrix().getPos();
01641                         else
01642                                 pos= Bones[i].getLocalSkeletonMatrix().getPos();
01643                         if(empty)
01644                         {
01645                                 empty= false;
01646                                 tmpBBox.setCenter(pos);
01647                         }
01648                         else
01649                                 tmpBBox.extend(pos);
01650                 }
01651         }
01652 
01653         // End!
01654         if(!empty)
01655         {
01656                 bbox= tmpBBox;
01657                 return true;
01658         }
01659         else
01660                 return false;
01661 }

bool NL3D::CSkeletonModel::computeWorldBBoxForShadow NLMISC::CAABBox worldBB  )  [virtual]
 

Special For Skeleton Caster. When Skeletons cast shadows, they first compute the WorldBBox. The model should compute its bbox in World (best fit).

Returns:
false if the model don't support it (default), or if hidden in HRC!!

Reimplemented from NL3D::CTransform.

Definition at line 1987 of file skeleton_model.cpp.

References _BoneToCompute, NL3D::CBone::_MaxSphere, _StickedObjects, NLMISC::CBSphere::applyTransform(), NLMISC::CBSphere::Center, NLMISC::CAABBox::computeAABBoxUnion(), NL3D::CTransform::computeWorldBBoxForShadow(), NL3D::CBone::getWorldMatrix(), NL3D::CTransform::isHrcVisible(), ItTransformSet, NLMISC::CVector::maxof(), NLMISC::CVector::minof(), r, NLMISC::CBSphere::Radius, NLMISC::CAABBox::setMinMax(), uint, NLMISC::CVector::x, NLMISC::CVector::y, and NLMISC::CVector::z.

Referenced by generateShadowMap().

01988 {
01989         uint    i;
01990 
01991         // If even not visible, no-op
01992         if(!isHrcVisible() || !Shape)
01993                 return false;
01994 
01995         // **** Compute The BBox with Bones of the skeleton
01996         CVector         minBB, maxBB;
01997         for(i=0;i<_BoneToCompute.size();i++)
01998         {
01999                 CBone                   *bone= _BoneToCompute[i].Bone;
02000                 // compute the world sphere
02001                 const   CMatrix &worldMat= bone->getWorldMatrix();
02002                 CBSphere                worldSphere;
02003                 bone->_MaxSphere.applyTransform(worldMat, worldSphere);
02004                 // compute bone min max bounding cube.
02005                 CVector         minBone, maxBone;
02006                 minBone= maxBone= worldSphere.Center;
02007                 float   r= worldSphere.Radius;
02008                 minBone.x-= r;
02009                 minBone.y-= r;
02010                 minBone.z-= r;
02011                 maxBone.x+= r;
02012                 maxBone.y+= r;
02013                 maxBone.z+= r;
02014                 // set or extend
02015                 if(i==0)
02016                 {
02017                         minBB= minBone;
02018                         maxBB= maxBone;
02019                 }
02020                 else
02021                 {
02022                         minBB.minof(minBB, minBone);
02023                         maxBB.maxof(maxBB, maxBone);
02024                 }
02025         }
02026         // build the bbox
02027         worldBB.setMinMax(minBB, maxBB);
02028         /*
02029         // Fake Version. Faster (-0.2 ms for 8 compute each frame) but false.
02030         for(i=0;i<_BoneToCompute.size();i++)
02031         {
02032                 CBone                   *bone= _BoneToCompute[i].Bone;
02033                 const   CMatrix &worldMat= bone->getWorldMatrix();
02034                 if(i==0)
02035                         worldBB.setCenter(worldMat.getPos());
02036                 else
02037                         worldBB.extend(worldMat.getPos());
02038         }
02039         worldBB.setHalfSize(worldBB.getHalfSize() *1.5f);
02040         */
02041 
02042 
02043         // **** Add to this bbox the ones of the Sticked objects.
02044         ItTransformSet  it;
02045         for(it= _StickedObjects.begin();it!=_StickedObjects.end();it++)
02046         {
02047                 CTransform      *stickModel= *it;
02048                 // Do the same for this son (NB: recurs, may be a skeleton too!!)
02049                 CAABBox         stickBB;
02050                 if(stickModel->computeWorldBBoxForShadow(stickBB))
02051                 {
02052                         // Make union of the 2
02053                         worldBB= CAABBox::computeAABBoxUnion(worldBB, stickBB);
02054                 }
02055         }
02056 
02057         // Done!
02058         return true;
02059 }

void NL3D::CSkeletonModel::createShadowMap  )  [protected, virtual]
 

To implement for ShadowCaster support. typically allocate a CShadowMap and store NB: the texture doesn't have to be inited at this time. Update it each frame in generateShadowMap()

Reimplemented from NL3D::CTransform.

Definition at line 1852 of file skeleton_model.cpp.

References NL3D::CTransform::getOwnerScene().

01853 {
01854         // create the shadowMap
01855         if(!_ShadowMap)
01856         {
01857                 _ShadowMap= new CShadowMap(&getOwnerScene()->getRenderTrav().getShadowMapManager());
01858         }
01859 }

CTransform* NL3D::CSkeletonModel::creator  )  [inline, static, private]
 

Reimplemented from NL3D::CTransformShape.

Definition at line 356 of file skeleton_model.h.

00356 {return new CSkeletonModel;}

void NL3D::CSkeletonModel::decBoneUsage uint  i,
TBoneUsageType  boneUsageType
 

decrement the refCount of the ith bone. set forced to the same param passed when incBoneUsage()

Definition at line 213 of file skeleton_model.cpp.

References _BoneToComputeDirty, _BoneUsage, nlassert, uint, uint8, UsageForced, and UsageNormal.

Referenced by decForcedBoneUsageAndParents(), NL3D::CMeshMRMSkinnedGeom::updateSkeletonUsage(), NL3D::CMeshMRMGeom::updateSkeletonUsage(), and NL3D::CMeshGeom::updateSkeletonUsage().

00214 {
00215         nlassert(i<_BoneUsage.size());
00216 
00217         // Get ptr on according refCount
00218         uint8   *usagePtr;
00219         if(boneUsageType == UsageNormal)
00220                 usagePtr= &_BoneUsage[i].Usage;
00221         else if(boneUsageType == UsageForced)
00222                 usagePtr= &_BoneUsage[i].ForcedUsage;
00223         else
00224                 usagePtr= &_BoneUsage[i].CLodForcedUsage;
00225 
00226         // If the bone was used before (and now won't be more), must update MustCompute.
00227         if(*usagePtr==1)
00228                 _BoneToComputeDirty= true;
00229 
00230         // Inc the refCount of the bone.
00231         nlassert(*usagePtr>0);
00232         (*usagePtr)--;
00233 }

void NL3D::CSkeletonModel::decForcedBoneUsageAndParents uint  i,
bool  forceCLod
[private]
 

increment the refCount of the ith bone and its parents. for stickObjects.

Definition at line 266 of file skeleton_model.cpp.

References Bones, decBoneUsage(), sint, and uint.

Referenced by detachSkeletonSon().

00267 {
00268         // dec forced
00269         decBoneUsage(i, forceCLod?UsageCLodForced:UsageForced);
00270 
00271         // recurs to father
00272         sint    fatherId= Bones[i].getFatherId();
00273         // if not a root bone...
00274         if(fatherId>=0)
00275                 decForcedBoneUsageAndParents(fatherId, forceCLod);
00276 }

void NL3D::CSkeletonModel::deleteShadowMap  )  [protected, virtual]
 

To implement for ShadowCaster support. typically free the shadowMap.

Reimplemented from NL3D::CTransform.

Definition at line 1862 of file skeleton_model.cpp.

Referenced by ~CSkeletonModel().

01863 {
01864         if(_ShadowMap)
01865         {
01866                 delete _ShadowMap;
01867                 _ShadowMap= NULL;
01868         }
01869 }

void NL3D::CSkeletonModel::detachSkeletonSon CTransform mi  ) 
 

unparent a CTransform from a bone of the skeleton, or unbind a skin. No-op if not a son of this skeleton NB: mi is made son of Root in Traversals Hrc, and change are made at render() for ClipTrav. NB: For Skins, all Hrc/Clip/UpdateList link is done here

Definition at line 573 of file skeleton_model.cpp.

References NL3D::CTransform::_FatherBoneId, NL3D::CTransform::_FatherSkeletonModel, NL3D::CTransform::_ForceCLodSticked, _Skins, _StickedObjects, NL3D::CTransform::clipAddChild(), decForcedBoneUsageAndParents(), dirtLodVertexAlpha(), dirtSkinRenderLists(), NL3D::CTransform::getOwnerScene(), NL3D::CScene::getRoot(), NL3D::CTransform::hrcLinkSon(), NL3D::CTransform::isSkinned(), NL3D::CTransform::linkToUpdateList(), nlassert, and NL3D::CTransform::setApplySkin().

Referenced by bindSkin(), NL3D::CSkeletonUser::detachSkeletonSon(), stickObjectEx(), NL3D::CMeshInstance::~CMeshInstance(), NL3D::CMeshMRMInstance::~CMeshMRMInstance(), NL3D::CMeshMRMSkinnedInstance::~CMeshMRMSkinnedInstance(), NL3D::CParticleSystemModel::~CParticleSystemModel(), NL3D::CSegRemanence::~CSegRemanence(), ~CSkeletonModel(), and NL3D::CTransform::~CTransform().

00574 {
00575         nlassert(tr);
00576 
00577         // If the instance is not binded/sticked to the skeleton, exit.
00578         if(tr->_FatherSkeletonModel!=this)
00579                 return;
00580 
00581         // try to erase from StickObject.
00582         _StickedObjects.erase(tr);
00583         // try to erase from Skins.
00584         _Skins.erase(tr);
00585 
00586         // If the instance is not skinned, then it is sticked
00587         bool    wasSkinned= tr->isSkinned()!=0;
00588         if( !wasSkinned )
00589         {
00590                 // Then decrement Bone Usage RefCount. Decrement from CLodForcedUsage if was sticked with forceCLod==true
00591                 decForcedBoneUsageAndParents(tr->_FatherBoneId, tr->_ForceCLodSticked);
00592         }
00593         else
00594         {
00595                 // it is skinned, advert the skinning is no more OK.
00596                 // setApplySkin() use _FatherSkeletonModel to update current skeleton bone usage.
00597                 tr->setApplySkin(false);
00598         }
00599 
00600         // advert transform it is no more sticked/skinned.
00601         tr->_FatherSkeletonModel= NULL;
00602         tr->_ForceCLodSticked= false;
00603 
00604         // link correctly Hrc / Clip / UpdateList...
00605         getOwnerScene()->getRoot()->hrcLinkSon( tr );
00606         if( !wasSkinned )
00607         {
00608                 //  No-op. ClipTrav graph/UpdateList updated in Hrc traversal.
00609         }
00610         else
00611         {
00612                 // Skin case: must do the Job here.
00613                 // Update ClipTrav here.
00614                 getOwnerScene()->getRoot()->clipAddChild(tr);
00615                 // Must re-add to the update list.
00616                 tr->linkToUpdateList();
00617         }
00618 
00619 
00620         // must recompute lod vertex alpha when LodCharacter used
00621         dirtLodVertexAlpha();
00622         // must recompute list of skins if was skinned
00623         if( wasSkinned )
00624                 dirtSkinRenderLists();
00625 }

void NL3D::CSkeletonModel::dirtLodVertexAlpha  )  [inline, private]
 

recompute _CLodVertexAlpha, ignoring _CLodVertexAlphaDirty

Definition at line 476 of file skeleton_model.h.

References _CLodVertexAlphaDirty.

Referenced by bindSkin(), detachSkeletonSon(), and stickObjectEx().

00476 {_CLodVertexAlphaDirty= true;}

void NL3D::CSkeletonModel::dirtSkinRenderLists  )  [inline]
 

Force the skeletonModel to recompute at next render which skins to render, at wich pass. If you call setOpacity()/setTransparency() on one of the skins binded to the skeleton, you should call this method, else strange result may occurs. NB: this is automatically called by bindSkin()/detachSkeletonSon()

Definition at line 151 of file skeleton_model.h.

References _SkinToRenderDirty.

Referenced by bindSkin(), detachSkeletonSon(), NL3D::CTransform::heritVisibility(), NL3D::CTransform::hide(), NL3D::CTransform::registerToChannelMixer(), resetDefaultMRMDistanceSetup(), NL3D::CTransform::setIsForceAnimDetail(), NL3D::CTransform::setOpacity(), NL3D::CTransform::setTransparency(), and NL3D::CTransform::show().

00151 {_SkinToRenderDirty= true;}

void NL3D::CTransform::enableCastShadowMap bool  state  )  [inherited]
 

By default, map shadow casting is disabled. This enabled shadow for this model. Fails if the model don't support dynamic Map Shadow Casting (eg landscape) Dervier note: createShadowMap() and deleteShadowMap() is called here.

Definition at line 1335 of file transform.cpp.

References NL3D::CTransform::canCastShadowMap(), NL3D::CTransform::createShadowMap(), NL3D::CTransform::deleteShadowMap(), NL3D::CTransform::getShadowMap(), NL3D::CTransform::IsFinalShadowMapCaster, NL3D::CTransform::modelCanCastShadowMap(), nlassert, and NL3D::CTransform::setStateFlag().

01336 {
01337         bool    precState= canCastShadowMap();
01338 
01339         if(modelCanCastShadowMap()) 
01340                 setStateFlag(IsFinalShadowMapCaster, state);
01341         else
01342                 setStateFlag(IsFinalShadowMapCaster, false);
01343 
01344         // if just enabled, create the shadowMap
01345         if(canCastShadowMap() && !precState)
01346         {
01347                 createShadowMap();
01348                 // The user must have created it.
01349                 nlassert(getShadowMap());
01350         }
01351         // if just disabled, free ressource
01352         else if(!canCastShadowMap() && precState)
01353         {
01354                 deleteShadowMap();
01355         }
01356 }

void NL3D::CTransform::enableReceiveShadowMap bool  state  )  [inline, inherited]
 

By default, map shadow receiving is disabled. This enabled shadow for this model. Fails if the model don't support dynamic Map Shadow Receiving (eg Particle system)

Definition at line 475 of file transform.h.

References NL3D::CTransform::IsFinalShadowMapReceiver, NL3D::CTransform::modelCanReceiveShadowMap(), and NL3D::CTransform::setStateFlag().

Referenced by NL3D::CLandscapeUser::enableReceiveShadowMap().

00475 {if(modelCanReceiveShadowMap()) setStateFlag(IsFinalShadowMapReceiver, state);}

void NL3D::CSkeletonModel::flagBoneAndParents uint32  boneId,
std::vector< bool > &  boneUsage
const
 

This method update boneUsage (must be of size of Bones). It's flag boneUsage[boneId] to true, and all parents of boneId.

Definition at line 237 of file skeleton_model.cpp.

References Bones, nlassert, sint, and uint32.

Referenced by NL3D::CMeshMRMSkinnedGeom::computeBonesId(), NL3D::CMeshMRMGeom::computeBonesId(), and NL3D::CMeshGeom::computeBonesId().

00238 {
00239         nlassert( boneUsage.size()==Bones.size() );
00240         nlassert( boneId<Bones.size() );
00241 
00242         // Flag this bone.
00243         boneUsage[boneId]= true;
00244 
00245         // if has father, flag it (recurs).
00246         sint    fatherId= Bones[boneId].getFatherId();
00247         if(fatherId>=0)
00248                 flagBoneAndParents(fatherId, boneUsage);
00249 }

void NL3D::CTransform::forceCompute  )  [protected, inherited]
 

Definition at line 1359 of file transform.cpp.

References NL3D::CTransform::_FatherBoneId, NL3D::CTransform::_FatherSkeletonModel, NL3D::CTransform::_HrcParent, forceComputeBone(), NL3D::CTransform::update(), and NL3D::CTransform::updateWorldMatrixFromFather().

Referenced by NL3D::CParticleSystemManager::processAnimate().

01360 {
01361         // if father is a skeleton, force to compute the bone we are sticked to
01362         if (_FatherSkeletonModel)
01363         {
01364                 _FatherSkeletonModel->forceComputeBone(_FatherBoneId);
01365         }
01366         else
01367         {
01368                 // force to compûte the father
01369                 if (_HrcParent)
01370                 {
01371                         _HrcParent->forceCompute();
01372                 }
01373         }
01374         // compute
01375         update();
01376         updateWorldMatrixFromFather();
01377 }

bool NL3D::CSkeletonModel::forceComputeBone uint  boneId  ) 
 

Force to compute a bone right now (useful if the skeleton is not visible and the bone position is needed) no-op is bone not present or already computed

Returns:
true if good indes & bone recomputed

Definition at line 391 of file skeleton_model.cpp.

References _BoneUsage, NL3D::CTransform::_FatherSkeletonModel, NL3D::CTransform::_HrcParent, Bones, NL3D::CBone::compute(), NL3D::CBone::getFatherId(), NL3D::CBone::getWorldMatrix(), NL3D::CTransform::isSkeleton(), MaxNumBones, nlassert, sint, NL3D::CForceComputeBoneInfo::StickBoneID, NL3D::CForceComputeBoneInfo::Transform, and uint.

Referenced by NL3D::CTransform::forceCompute(), and NL3D::CSkeletonUser::forceComputeBone().

00392 {
00393         if(boneId >= _BoneUsage.size()) return false;           
00394         // build list of ancestor, then must build
00395         std::vector<CForceComputeBoneInfo> ancestors;
00396         // count the number of ancestors (to avoid unwanted alloc with vector)
00397         uint numAncestors = 1;
00398         CTransform *currTransform = this;
00399         for(;;)
00400         {
00401                 currTransform = currTransform->_HrcParent ? currTransform->_HrcParent : currTransform->_FatherSkeletonModel; // find father transform (maybe a skeleton or a std transform)
00402                 if (!currTransform) break; // root reached ?
00403                 ++ numAncestors;
00404         }
00405         ancestors.reserve(numAncestors);
00406         // build list of ancestor
00407         currTransform = this;
00408         uint currStickBone = boneId;
00409         for(;;)
00410         {
00411                 // if curr transform is a skeleton, animate all bone from stick bone to the root bone
00412                 if (currTransform->isSkeleton())
00413                 {
00414                         if (_ChannelMixer)
00415                         {                       
00416                                 CSkeletonModel *skel = static_cast<CSkeletonModel *>(currTransform);
00417                                 nlassert(boneId < skel->_BoneUsage.size());
00418                                 nlassert(currStickBone < skel->Bones.size());
00419                                 sint currBoneIndex = currStickBone;
00420                                 // force channel mixer to eval for that bone
00421                                 while (currBoneIndex != -1)
00422                                 {
00423                                         nlassert((uint) currBoneIndex < skel->Bones.size());
00424                                         skel->Bones[currBoneIndex].forceAnimate(*_ChannelMixer);
00425                                         currBoneIndex = skel->Bones[currBoneIndex].getFatherId();
00426                                 }
00427                         }
00428                 }
00429                 else
00430                 {
00431                         // update stickBone ID (if father is a skeleton)
00432                         currStickBone = _FatherBoneId;
00433                 }
00434                 CForceComputeBoneInfo fcbi;
00435                 fcbi.StickBoneID = currStickBone;
00436                 fcbi.Transform   = currTransform;
00437                 ancestors.push_back(fcbi);
00438                 currTransform = currTransform->_HrcParent ? currTransform->_HrcParent : currTransform->_FatherSkeletonModel; // find father transform (maybe a skeleton or a std transform)
00439                 if (!currTransform) break; // root reached ?            
00440         }
00441         // bones must be recomputed from father bone to sons, so must traverse bones until root is reached to retrieve correct ordering
00442         CBone *OrderedBone[MaxNumBones];
00443         //
00444         const CMatrix *parentWorldMatrix = &CMatrix::Identity;
00445         for(std::vector<CForceComputeBoneInfo>::reverse_iterator it = ancestors.rbegin(); it != ancestors.rend(); ++it)
00446         {                                       
00447                 // update world matrix (NB : the call to getmatrix will update the local matrix)
00448                 it->Transform->setWorldMatrix(*parentWorldMatrix * it->Transform->getMatrix());         
00449                 if (it->Transform->isSkeleton())
00450                 {
00451                         CSkeletonModel *skel = static_cast<CSkeletonModel *>(it->Transform);
00452                         // reorder bones
00453                         uint numBones = 0;
00454                         nlassert(it->StickBoneID < skel->Bones.size());
00455                         sint currBoneIndex = it->StickBoneID;
00456                         nlassert(currBoneIndex != -1);                  
00457                         do
00458                         {
00459                                 nlassert(numBones < MaxNumBones);
00460                                 nlassert((uint) currBoneIndex < skel->Bones.size());
00461                                 OrderedBone[numBones] = &skel->Bones[currBoneIndex];
00462                                 currBoneIndex = OrderedBone[numBones]->getFatherId();
00463                                 ++ numBones;
00464                         }
00465                         while (currBoneIndex != -1);
00466                         const CMatrix &modelWorldMatrix = it->Transform->getWorldMatrix();
00467                         // recompute bones
00468                         CBone *fatherBone = NULL;
00469                         while (numBones--)
00470                         {
00471                                 OrderedBone[numBones]->compute(fatherBone, modelWorldMatrix, NULL);
00472                                 fatherBone = OrderedBone[numBones];
00473                         }
00474                         parentWorldMatrix = &(OrderedBone[0]->getWorldMatrix());
00475                 }
00476                 else
00477                 {
00478                         parentWorldMatrix = &it->Transform->getWorldMatrix();
00479                 }
00480         }
00481         return true;
00482 }

void NL3D::CTransform::freeze  )  [inherited]
 

freeze the preceding position of the model. Do not use, special code for cluster. This inform the scene that preceding position setuped by user is "frozen". ie at next render(), this object won't be added to the "object moving list" (usefull for cluster mgt). The "frozen" state is disabled (at render() time) if:

  • change in position (directly or indireclty, such as animation) is performed after the freeze().
  • the "frozen" state of a father is not enabled (or disabled by a change in position of him :) ).

Definition at line 367 of file transform.cpp.

References NL3D::CTransform::_Frozen, and NL3D::CTransform::update().

Referenced by NL3D::CInstanceGroup::addToSceneWhenAllShapesLoaded(), and NL3D::CScene::initDefaultRoots().

00368 {
00369         // First, update the model
00370         // _Frozen state is disabled here (in CTransform::update()).
00371         update();
00372 
00373         // Then flag the frozen state.
00374         _Frozen= true;
00375 }

void NL3D::CTransform::freezeHRC  )  [inherited]
 

freeze the HRC so the WorldMatrix computed at next render() will be kept for long, and the model won't either be tested in HRC (which is still expensive, even if the worldmatrix doesn't need to be recomputed). The model won't either be validated. It is suposed to not change at all. Also, if it is not a son of a CCluster, it may be accelerated during Cliping (with CQuadGridClipManager).

NB: the model won't be tested in HRC anymore. calling freezeHRC() on a model in a hierarchy without calling it to the root of the hierarchy will result in that the model won't be validated nor be HRC traversed. To be simplier, you should freezeHRC() all the models of a hierarchy, from base root to leaves.

NB: if the hierarchy of this object must change, or if the object must moves, you must call unfreezeHRC() first, and you should do this for all the parents of this model.

Definition at line 385 of file transform.cpp.

References NL3D::CTransform::_FreezeHRCState, NL3D::CTransform::_Frozen, NL3D::CTransform::_TransformDirty, NL3D::CTransform::FreezeHRCStateDisabled, NL3D::CTransform::FreezeHRCStateRequest, NL3D::CTransform::QuadGridClipEnabled, and NL3D::CTransform::setStateFlag().

Referenced by NL3D::CInstanceGroup::freezeHRC().

00386 {
00387         // if disabled, say we are ready to validate our worldMatrix for long.
00388         if(_FreezeHRCState==FreezeHRCStateDisabled)
00389         {
00390                 _FreezeHRCState= FreezeHRCStateRequest;
00391                 setStateFlag(QuadGridClipEnabled, true);
00392 
00393                 /* If the transform is not frozen (ie staticaly inserted in a cluster),
00394                         We must be sure it will be tested against QuadGridClipManager at next ClipTrav pass.
00395                         => must make this object a "moving object" at next render=> dirt _LocalMatrixDate.
00396                 */
00397                 if(!_Frozen)
00398                 {
00399                         _TransformDirty= true;
00400                 }
00401         }
00402 }

void NL3D::CTransform::freezeStaticLightSetup CPointLight pointLight[NL3D_MAX_LIGHT_CONTRIBUTION],
uint  numPointLights,
uint8  sunContribution,
CPointLight frozenAmbientlight
[inherited]
 

Freeze and set the Static Light Setup. Called by CInstanceGroup::addToScene() NB: it calls resetLighting() first. NB: nlassert(numPointLights<=NL3D_MAX_LIGHT_CONTRIBUTION)

Definition at line 1028 of file transform.cpp.

References NL3D::CTransform::_LightContribution, NL3D::CLightContribution::Factor, NL3D::CLightContribution::FrozenAmbientLight, NL3D::CLightContribution::FrozenStaticLightSetup, NL3D::CTransform::IsNeedUpdateFrozenStaticLightSetup, NL3D_MAX_LIGHT_CONTRIBUTION, nlassert, NL3D::CLightContribution::NumFrozenStaticLight, NL3D::CLightContribution::PointLight, NL3D::CTransform::resetLighting(), NL3D::CTransform::setStateFlag(), NL3D::CLightContribution::SunContribution, uint, and uint8.

01030 {
01031         nlassert(numPointLights <= NL3D_MAX_LIGHT_CONTRIBUTION);
01032 
01033         // resetLighting() first.
01034         resetLighting();
01035 
01036         // Enable StaticLightSetup.
01037         _LightContribution.FrozenStaticLightSetup= true;
01038         _LightContribution.NumFrozenStaticLight= numPointLights;
01039         _LightContribution.SunContribution= sunContribution;
01040         // setup the FrozenAmbientLight
01041         _LightContribution.FrozenAmbientLight= frozenAmbientlight;
01042         // Setup other pointLights
01043         uint i;
01044         for(i=0;i<numPointLights;i++)
01045         {
01046                 // set the light
01047                 _LightContribution.PointLight[i]= pointLight[i];
01048                 // Enable at max.
01049                 _LightContribution.Factor[i]= 255;
01050                 // Compute static AttFactor Later because don't have WorlPosition of the model here!!
01051                 setStateFlag(IsNeedUpdateFrozenStaticLightSetup, true);
01052 
01053                 // Do NOT set the iterator, because it is a staticLight.
01054         }
01055         // End the list
01056         if(i<NL3D_MAX_LIGHT_CONTRIBUTION)
01057                 _LightContribution.PointLight[i]= NULL;
01058 }

void NL3D::CSkeletonModel::generateShadowMap const CVector lightDir  )  [virtual]
 

For Casters. Display the Shadow to the "Auxiliary Driver". This method should only write to AlphaBuffer (since RGB may be the current rendered scene!), with Alpha==1 when pixel is shadowed. The ShadowMapManager has already cleared the AlphaBuffer to black, and has already enabled alpha write only. The ShadowMapManager has already setuped Viewport/Scissor as its convenience. The extra blurring is a work of the ShadowMapManager (which blurs multiple shadows in a same pass) NB: you can overwrite the current driver frustum/ViewMatrix/modelMatrix without backuping it (ShadowMapManager work)

Reimplemented from NL3D::CTransform.

Definition at line 1781 of file skeleton_model.cpp.

References NL3D::CShadowMap::buildCasterCameraMatrix(), NL3D::CShadowMap::buildProjectionInfos(), computeWorldBBoxForShadow(), NL3D::CRenderTrav::getAuxDriver(), NL3D::CShadowMapManager::getCasterShadowMaterial(), NLMISC::CAABBox::getCenter(), NLMISC::CAABBox::getHalfSize(), NL3D::CTransform::getOwnerScene(), NLMISC::CMatrix::getPos(), NL3D::ITransformable::getPos(), NL3D::CScene::getRenderTrav(), NL3D::CRenderTrav::getShadowMapManager(), NL3D::CTransform::getWorldMatrix(), H_AUTO, NLMISC::CMatrix::inverted(), NLMISC::CVector::normalize(), renderIntoSkeletonShadowMap(), NL3D::IDriver::setFrustum(), NLMISC::CMatrix::setPos(), NL3D::IDriver::setupViewMatrix(), updateShadowMap(), NLMISC::CVector::x, NLMISC::CVector::y, and NLMISC::CVector::z.

01782 {
01783         H_AUTO( NL3D_Skeleton_GenerateShadow );
01784 
01785         // get the driver for Texture Render
01786         CScene                  *scene= getOwnerScene();
01787         CRenderTrav             &renderTrav= scene->getRenderTrav();
01788         IDriver                 *driver= renderTrav.getAuxDriver();
01789 
01790         if(!Shape)
01791                 return;
01792 
01793         // update ShadowMap data if needed.
01794         // ****
01795         updateShadowMap(driver);
01796 
01797         // compute the ProjectionMatrix.
01798         // ****
01799 
01800         // Compute the BBox in World, with bounding Box of Bones, and with BoundingBox of sticked Objects
01801         CAABBox         bbWorld;
01802         computeWorldBBoxForShadow(bbWorld);
01803 
01804 
01805         // Here the bbox is defined in world, hence must remove the World Pos.
01806         CMatrix         localPosMatrix;
01807         localPosMatrix.setPos(-getWorldMatrix().getPos());
01808 
01809         // setup cameraMatrix with BBox and Enlarge For 1 pixel
01810         CMatrix         cameraMatrix;
01811         _ShadowMap->buildCasterCameraMatrix(lightDir, localPosMatrix, bbWorld, cameraMatrix);
01812 
01813 
01814         // Render.
01815         // ****
01816         // setup the orhtogonal frustum and viewMatrix to include all the object.
01817         driver->setFrustum(0,1,0,1,0,1,false);
01818         driver->setupViewMatrix(cameraMatrix.inverted());
01819 
01820         // render the Skinned meshs, and also the Sticked Objects/Skeletons
01821         CMaterial       &castMat= renderTrav.getShadowMapManager().getCasterShadowMaterial();
01822         renderIntoSkeletonShadowMap(this, castMat);
01823 
01824         // Infos.
01825         // ****
01826 
01827         // Compute the BackPoint: the first point to be shadowed. 
01828         CVector         backPoint= bbWorld.getCenter();
01829         // get the 3/4 bottom of the shape
01830         backPoint.z-= bbWorld.getHalfSize().z/2;
01831         // Use the 3/4 bottom of the BBox minus the light direction in XY.
01832         CVector ldir= lightDir;
01833         ldir.z= 0;
01834         ldir.normalize();
01835         // NB: This way seems to works quite well, even if the worldBBox is changing every frame.
01836         float   lenXY= (CVector(bbWorld.getHalfSize().x, bbWorld.getHalfSize().y, 0)).norm();
01837         backPoint-= ldir*lenXY;
01838         // localPos.
01839         backPoint-= getWorldMatrix().getPos();
01840 
01841         // Compute LocalProjectionMatrix and other infos from cameraMatrix and backPoint?
01842         _ShadowMap->buildProjectionInfos(cameraMatrix, backPoint, scene);
01843 }

void NL3D::CTransformShape::getAABBox NLMISC::CAABBox bbox  )  const [virtual, inherited]
 

Get the untransformed AABBox of the mesh. NULL (gtSize()==0) if no mesh.

Reimplemented from NL3D::CTransform.

Reimplemented in NL3D::CParticleSystemModel.

Definition at line 83 of file transform_shape.cpp.

References NLMISC::CAABBox::setCenter(), NLMISC::CAABBox::setHalfSize(), and NL3D::CTransformShape::Shape.

Referenced by NL3D::CTransformShape::getLightHotSpotInWorld(), NL3D::CInstanceUser::getShapeAABBox(), NL3D::CQuadGridClipManager::linkModel(), and NL3D::CClipTrav::traverse().

00084 {
00085         if(Shape)
00086         {
00087                 Shape->getAABBox(bbox);
00088         }
00089         else
00090         {
00091                 bbox.setCenter(CVector::Null);
00092                 bbox.setHalfSize(CVector::Null);
00093         }
00094 }

const NLMISC::CMatrix & NL3D::CSkeletonModel::getActiveBoneSkinMatrix uint  boneId  )  const
 

if Bones[boneId] is "Computed" (usage/lod), return Bones[boneId].getBoneSkinMatrix() else return parent ones (recurs, but precomputed)

Definition at line 487 of file skeleton_model.cpp.

References _BoneUsage, Bones, and uint.

Referenced by NL3D::computeBoneMatrixes3x4(), and NL3D::CMeshGeom::computeSkinMatrixes().

00488 {
00489         // Get me or first father with MustCompute==true.
00490         uint validBoneId= _BoneUsage[boneId].ValidBoneSkinMatrix;
00491         // return his WorldMatrix.
00492         return Bones[validBoneId].getBoneSkinMatrix();
00493 }

CSkeletonModel* NL3D::CTransform::getAncestorSkeletonModel  )  const [inline, inherited]
 

Definition at line 207 of file transform.h.

References NL3D::CTransform::_AncestorSkeletonModel.

Referenced by NL3D::CParticleSystemManager::processAnimate().

00207 { return _AncestorSkeletonModel; }

IAnimCtrl * NL3D::CSkeletonModel::getBoneAnimCtrl uint  boneId  )  const
 

Definition at line 1764 of file skeleton_model.cpp.

References Bones, and uint.

Referenced by NL3D::CSkeletonUser::getBoneAnimCtrl().

01765 {
01766         if(boneId>=Bones.size())
01767                 return NULL;
01768 
01769         return Bones[boneId]._AnimCtrl;
01770 }

sint32 NL3D::CSkeletonModel::getBoneIdByName const std::string &  name  )  const
 

return, from skeleton shape, the BoneIdByName. -1 if not here.

Definition at line 629 of file skeleton_model.cpp.

References NL3D::CSkeletonShape::getBoneIdByName(), and sint32.

Referenced by NL3D::CMeshMRMSkinnedGeom::computeBonesId(), NL3D::CMeshMRMGeom::computeBonesId(), NL3D::CMeshGeom::computeBonesId(), and NL3D::CSkeletonUser::getBoneIdByName().

00630 {
00631         CSkeletonShape          *shp= safe_cast<CSkeletonShape*>((IShape*)Shape);
00632         return shp->getBoneIdByName(name);
00633 }

CChannelMixer* NL3D::CTransform::getChannelMixer  )  const [inline, protected, inherited]
 

get the channelMixer owned by the transform. return result of a refPtr => may be NULL.

Definition at line 641 of file transform.h.

Referenced by computeCurrentBBox(), NL3D::CMeshBaseInstance::traverseHrc(), and updateBoneToCompute().

00641 {return _ChannelMixer;}

bool NL3D::CTransform::getChannelMixerOwnerShip  )  const [inline, inherited]
 

Definition at line 257 of file transform.h.

References NL3D::CTransform::getStateFlag(), and NL3D::CTransform::IsDeleteChannelMixer.

Referenced by NL3D::CTransform::registerToChannelMixer(), and NL3D::CTransform::~CTransform().

00257 { return getStateFlag(IsDeleteChannelMixer)!=0; }

CInstanceGroup* NL3D::CTransform::getClusterSystem  )  [inline, inherited]
 

Definition at line 320 of file transform.h.

References NL3D::CTransform::_ClusterSystem.

Referenced by NL3D::CScene::findCameraClusterSystemFromRay(), and NL3D::CClipTrav::traverse().

00320 { return _ClusterSystem; }

ITrack * NL3D::CTransform::getDefaultTrack uint  valueId  )  [virtual, inherited]
 

Default Track Values are identity (pos,pivot= 0, scale= 1, rots=0).

Implements NL3D::ITransformable.

Reimplemented in NL3D::CCamera, NL3D::CMeshBaseInstance, NL3D::CParticleSystemModel, NL3D::CSegRemanence, NL3D::CWaterModel, and NL3D::CWaveMakerModel.

Definition at line 311 of file transform.cpp.

References nlstop, and uint.

00312 {
00313         // Cyril: prefer do it here in CTransform, because of CCamera, CLight etc... (which may not need a default value too!!)
00314 
00315         // what value ?
00316         switch (valueId)
00317         {
00318         case PosValue:                  return &DefaultPos;
00319         case RotEulerValue:             return &DefaultRotEuler;
00320         case RotQuatValue:              return &DefaultRotQuat;
00321         case ScaleValue:                return &DefaultScale;
00322         case PivotValue:                return &DefaultPivot;
00323         }
00324 
00325         // No, only ITrnasformable values!
00326         nlstop;
00327         // Deriver note: else call BaseClass::getDefaultTrack(valueId);
00328 
00329         return NULL;
00330 
00331 }

float NL3D::CTransformShape::getDistMax  )  const [inline, inherited]
 

Definition at line 135 of file transform_shape.h.

Referenced by NL3D::CQuadGridClipCluster::addModel(), NL3D::CTransformShape::clip(), and NL3D::CInstanceUser::getDistMax().

00135 { return _DistMax; }    

bool NL3D::CTransform::getForceClipRoot  )  const [inline, inherited]
 

Definition at line 538 of file transform.h.

References NL3D::CTransform::ForceClipRoot, and NL3D::CTransform::getStateFlag().

Referenced by NL3D::CTransformUser::getForceClipRoot().

00538 { return getStateFlag(ForceClipRoot) != 0; }    

float NL3D::CSkeletonModel::getInterpolationDistance  )  const
 

see setInterpolationDistance()

Definition at line 648 of file skeleton_model.cpp.

References _LodInterpMultiplier.

Referenced by NL3D::CSkeletonUser::getInterpolationDistance().

00649 {
00650         if(_LodInterpMultiplier==0)
00651                 return 0.f;
00652         else
00653                 return 1.f / _LodInterpMultiplier;
00654 }

const CLightContribution& NL3D::CTransform::getLightContribution  )  const [inline, inherited]
 

Return the current light contribution of this model

Definition at line 373 of file transform.h.

References NL3D::CTransform::_LightContribution.

Referenced by NL3D::CShadowMapManager::computeShadowColors(), and NL3D::CShadowMapManager::computeShadowDirection().

00373 { return _LightContribution; }  

CLightContribution& NL3D::CTransformShape::getLightContribution  )  [inline, inherited]
 

Reimplemented in NL3D::CMeshMultiLodInstance.

Definition at line 155 of file transform_shape.h.

Referenced by NL3D::CTransformShape::traverseRender(), and NL3D::CParticleSystemModel::traverseRender().

00155 { return _LightContribution;}

void NL3D::CSkeletonModel::getLightHotSpotInWorld CVector modelPos,
float &  modelRadius
const [virtual]
 

get the HotSpot of the model for Light computation. For models with global attenuation, this is the point taken for attenuation computes. NB: should return the current world position. NB: return also the modelRadius (only for bigLightable) Default to NULL.

Reimplemented from NL3D::CTransformShape.

Definition at line 1722 of file skeleton_model.cpp.

References Bones, NLMISC::CMatrix::getPos(), and isBoneComputed().

01723 {
01724         // If the bone 0 is computed (pelvis), then return its worldMatrix
01725         if(isBoneComputed(0))
01726         {
01727                 modelPos= Bones[0].getWorldMatrix().getPos();
01728         }
01729         else
01730         {
01731                 /* Else return the skeleton pos. NB: this seems unusefull since bone 0 not computed means no Skins.
01732                         But lighting computation is still done and may use a VisualCollisionEntity.
01733                         This system cache some infos according to position. This is why we must return a position 
01734                         near the skeleton (else cache crash each frame => slowdown...)
01735                 */
01736                 modelPos= _WorldMatrix.getPos();
01737         }
01738 
01739         // Consider Skeletons as not big lightable
01740         modelRadius= 0;
01741 }

const std::string & NL3D::CTransform::getLoadBalancingGroup  )  const [inherited]
 

Get the load Balancing group of a model. see setLoadBalancingGroup().

Definition at line 532 of file transform.cpp.

References NL3D::CTransform::_LoadBalancingGroup, and NL3D::CLoadBalancingGroup::Name.

00533 {
00534         // get the group name
00535         return _LoadBalancingGroup->Name;
00536 }

uint NL3D::CSkeletonModel::getLodCharacterAnimId  )  const [inline]
 

Called in ClipTrav pass. Used to update the flag _DisplayedAsLodCharacter. return 0 if CLod not enabled. Else return a priority>0 computed from curDistance/LodCharacterDistance return 0 too if the skeleton is not visible or if his ancestorSkeletonModel is not visible. If priority is >1 then the skeleton must be displayed in CLod form

Definition at line 247 of file skeleton_model.h.

References _CLodInstance, NL3D::CLodCharacterInstance::AnimId, and uint.

Referenced by NL3D::CSkeletonUser::getLodCharacterAnimId().

00247 {return _CLodInstance.AnimId;}

TGlobalAnimationTime NL3D::CSkeletonModel::getLodCharacterAnimTime  )  const [inline]
 

Called in ClipTrav pass. Used to update the flag _DisplayedAsLodCharacter. return 0 if CLod not enabled. Else return a priority>0 computed from curDistance/LodCharacterDistance return 0 too if the skeleton is not visible or if his ancestorSkeletonModel is not visible. If priority is >1 then the skeleton must be displayed in CLod form

Definition at line 249 of file skeleton_model.h.

References _CLodInstance, NL3D::CLodCharacterInstance::AnimTime, and NL3D::TGlobalAnimationTime.

Referenced by NL3D::CSkeletonUser::getLodCharacterAnimTime().

00249 {return _CLodInstance.AnimTime;}

float NL3D::CSkeletonModel::getLodCharacterDistance  )  const [inline]
 

see setLodCharacterDistance. 0 if disabled

Definition at line 267 of file skeleton_model.h.

References _LodCharacterDistance.

Referenced by NL3D::CSkeletonUser::getLodCharacterDistance().

00267 {return _LodCharacterDistance;}

sint NL3D::CSkeletonModel::getLodCharacterShape  )  const [inline]
 

see setLodCharacterShape

Definition at line 243 of file skeleton_model.h.

References _CLodInstance, NL3D::CLodCharacterInstance::ShapeId, and sint.

Referenced by NL3D::CSkeletonUser::getLodCharacterShape().

00243 {return _CLodInstance.ShapeId;}

bool NL3D::CSkeletonModel::getLodCharacterWrapMode  )  const [inline]
 

Called in ClipTrav pass. Used to update the flag _DisplayedAsLodCharacter. return 0 if CLod not enabled. Else return a priority>0 computed from curDistance/LodCharacterDistance return 0 too if the skeleton is not visible or if his ancestorSkeletonModel is not visible. If priority is >1 then the skeleton must be displayed in CLod form

Definition at line 253 of file skeleton_model.h.

References _CLodInstance, and NL3D::CLodCharacterInstance::WrapMode.

Referenced by NL3D::CSkeletonUser::getLodCharacterWrapMode().

00253 {return _CLodInstance.WrapMode;}

CMaterial * NL3D::CTransformShape::getMaterial uint  materialId  )  [virtual, inherited]
 

Get a material of the transform shape

Reimplemented in NL3D::CMeshBaseInstance.

Definition at line 127 of file transform_shape.cpp.

References uint.

00128 {
00129         return NULL;
00130 }

const CMaterial * NL3D::CTransformShape::getMaterial uint  materialId  )  const [virtual, inherited]
 

Get a material of the transform shape

Reimplemented in NL3D::CMeshBaseInstance.

Definition at line 120 of file transform_shape.cpp.

References uint.

00121 {
00122         return NULL;
00123 }

const CMatrix& NL3D::ITransformable::getMatrix  )  const [inline, inherited]
 

Get the matrix, compute her if necessary (work in all modes).

Definition at line 76 of file transformable.h.

References NL3D::ITransformable::updateMatrix().

Referenced by NL3D::CInstanceGroup::addToSceneWhenAllShapesLoaded(), NL3D::CCamera::buildCameraPyramid(), NL3D::CBone::compute(), NL3D::CWaterShape::createInstance(), NL3D::CWaterModel::getAttenuatedHeight(), NL3D::CTransformableUser::getMatrix(), NL3D::CCloudScape::render(), NL3D::CMeshMultiLod::renderCoarseMesh(), and NL3D::CTransform::update().

00076 {updateMatrix(); return _LocalMatrix;}

uint64 NL3D::ITransformable::getMatrixDate  )  const [inline, inherited]
 

return the last date of computed matrix. updateMatrix() if necessary.

Definition at line 90 of file transformable.h.

References NL3D::ITransformable::_LocalMatrixDate, uint64, and NL3D::ITransformable::updateMatrix().

Referenced by NL3D::CWaterModel::updateDiffuseMapMatrix().

00091         {
00092                 updateMatrix();
00093                 return _LocalMatrixDate;
00094         }

CRGBA NL3D::CTransform::getMeanColor  )  const [inline, inherited]
 

see setMeanColor()

Definition at line 437 of file transform.h.

References NL3D::CTransform::_MeanColor.

00437 {return _MeanColor;}

virtual const CMRMLevelDetail* NL3D::CTransformShape::getMRMLevelDetail  )  const [inline, virtual, inherited]
 

If the model support MRM, return the level detail setup. default is return NULL.

Reimplemented in NL3D::CMeshMRMInstance, and NL3D::CMeshMRMSkinnedInstance.

Definition at line 114 of file transform_shape.h.

Referenced by updateSkinRenderLists().

00114 {return NULL;}

uint NL3D::CSkeletonModel::getNumBoneComputed  )  const [inline]
 

return the number of bones currently animated/computed (because of bindSkin()/stickObject() / Lod system).

Definition at line 191 of file skeleton_model.h.

References _BoneToCompute, and uint.

00191 {return _BoneToCompute.size();}

uint NL3D::CTransformShape::getNumMaterial  )  const [virtual, inherited]
 

Get the count of material in this transform shape

Reimplemented in NL3D::CMeshBaseInstance.

Definition at line 113 of file transform_shape.cpp.

References uint.

00114 {
00115         return 0;
00116 }

float NL3D::CSkeletonModel::getNumTriangles float  distance  )  [virtual]
 

Special version for skins.

Reimplemented from NL3D::CTransformShape.

Definition at line 1578 of file skeleton_model.cpp.

References NL3D::CMRMLevelDetail::getNumTriangles(), and isDisplayedAsLodCharacter().

01579 {
01580         // If the skeleton is displayed as a CLod suppose 0 triangles.
01581         if( isDisplayedAsLodCharacter() )
01582                 return 0;
01583         else
01584                 // NB: this is an approximation, but this is continious.
01585                 return _LevelDetail.getNumTriangles(distance);
01586 }

float NL3D::CTransformShape::getNumTrianglesAfterLoadBalancing  )  [inline, inherited]
 

get an approximation of the number of triangles this instance should render. This method is valid only for IShape classes (in render()), after LoadBalancing traversal is performed. NB: It is not guaranted that this instance will render those number of triangles.

Definition at line 111 of file transform_shape.h.

References NL3D::CTransformShape::_NumTrianglesAfterLoadBalancing.

Referenced by NL3D::CParticleSystemModel::doAnimate(), NL3D::CMeshMRMSkinned::profileSceneRender(), NL3D::CMeshMRM::profileSceneRender(), NL3D::CMeshMRMSkinned::render(), NL3D::CMeshMRM::render(), renderSkins(), NL3D::CMeshMRM::supportMeshBlockRendering(), and NL3D::CMeshMultiLodInstance::traverseLoadBalancing().

00111 {return _NumTrianglesAfterLoadBalancing;}

uint NL3D::CTransform::getOrderingLayer  )  const [inline, inherited]
 

Get the ordering layer.

Definition at line 187 of file transform.h.

References NL3D::CTransform::_OrderingLayer, and uint.

Referenced by NL3D::CTransformUser::getOrderingLayer(), and NL3D::CRenderTrav::traverse().

00187 { return _OrderingLayer; }

CScene* NL3D::CTransform::getOwnerScene  )  const [inline, inherited]
 

get the scene which has created us

Definition at line 105 of file transform.h.

References NL3D::CTransform::_OwnerScene.

Referenced by NL3D::CLandscape::addZone(), NL3D::CWaterModel::clip(), NL3D::CTransformShape::clip(), NL3D::CLandscapeModel::clipAndRenderLandscape(), NL3D::CWaterModel::computeClippedPoly(), computeDisplayLodCharacterPriority(), computeLodTexture(), NL3D::CWaterModel::computeSimpleClippedPoly(), createShadowMap(), NL3D::CMeshInstance::createShadowMap(), detachSkeletonSon(), NL3D::CParticleSystemModel::doAnimate(), NL3D::CWaterModel::doSimpleRender(), NL3D::CTargetAnimCtrl::execute(), generateShadowMap(), NL3D::CMeshInstance::generateShadowMap(), NL3D::CMeshMultiLodInstance::getCoarseMeshLighting(), NL3D::CTransform::initModel(), initModel(), NL3D::CPointLightModel::initModel(), NL3D::CLandscapeModel::initModel(), NL3D::CParticleSystemModel::insertInVisibleList(), NL3D::CMeshMultiLod::instanciateCoarseMeshSpace(), NL3D::CQuadGridClipManager::linkModel(), NL3D::CQuadGridClipManager::profile(), NL3D::CTransformShape::profileRender(), NL3D::CLandscapeModel::receiveShadowMap(), NL3D::CCluster::recursTraverseClip(), NL3D::CMeshBaseInstance::releaseCurrentAsyncTextures(), NL3D::CSegRemanence::render(), NL3D::CMeshMultiLod::render(), NL3D::CMeshMRMSkinnedGeom::render(), NL3D::CMeshMRMGeom::render(), NL3D::CMeshGeom::render(), renderCLod(), NL3D::CMeshMultiLod::renderCoarseMesh(), renderIntoSkeletonShadowMap(), NL3D::CMeshInstance::renderIntoSkeletonShadowMap(), renderShadowSkins(), NL3D::CMeshMRMGeom::renderSkin(), NL3D::CMeshGeom::renderSkin(), NL3D::CMeshMRMSkinnedGeom::renderSkinGroupGeom(), NL3D::CMeshMRMGeom::renderSkinGroupGeom(), NL3D::CMeshMRMSkinnedGeom::renderSkinGroupPrimitives(), NL3D::CMeshMRMGeom::renderSkinGroupPrimitives(), NL3D::CMeshMRMSkinnedGeom::renderSkinGroupSpecularRdrPass(), NL3D::CMeshMRMGeom::renderSkinGroupSpecularRdrPass(), renderSkinList(), renderSkins(), NL3D::CQuadGridClipManager::reset(), NL3D::CTransform::setLoadBalancingGroup(), setLodCharacterShape(), NL3D::CMeshBaseInstance::startAsyncTextureLoading(), NL3D::CWaveMakerModel::traverseAnimDetail(), traverseAnimDetail(), NL3D::CSegRemanence::traverseAnimDetail(), NL3D::CParticleSystemModel::traverseAnimDetail(), NL3D::CMeshBaseInstance::traverseAnimDetail(), NL3D::CTransform::traverseAnimDetailWithoutUpdateWorldMatrix(), NL3D::CTransform::traverseClip(), NL3D::CQuadGridClipManager::traverseClip(), NL3D::CParticleSystemModel::traverseClip(), NL3D::CLandscapeModel::traverseClip(), NL3D::CMeshBaseInstance::traverseHrc(), NL3D::CLandscapeModel::traverseHrc(), NL3D::CTransform::traverseLight(), NL3D::CPointLightModel::traverseLight(), NL3D::CTransformShape::traverseLoadBalancing(), NL3D::CMeshMultiLodInstance::traverseLoadBalancing(), NL3D::CTransformShape::traverseLoadBalancingPass0(), NL3D::CWaterModel::traverseRender(), NL3D::CVegetableBlendLayerModel::traverseRender(), NL3D::CTransformShape::traverseRender(), NL3D::CMeshInstance::traverseRender(), NL3D::CLandscapeModel::traverseRender(), NL3D::CFlareModel::traverseRender(), NL3D::CTransform::unfreezeHRC(), NL3D::CTransform::update(), NL3D::CTransform::updateClipTravForAncestorSkeleton(), NL3D::CQuadGridClipManager::updateClustersFromCamera(), updateShadowMap(), NL3D::CMeshInstance::updateShadowMap(), NL3D::CTransform::updateWorld(), ~CSkeletonModel(), and NL3D::CTransform::~CTransform().

00105 {return _OwnerScene;}

CVector NL3D::ITransformable::getPivot  )  [inline, inherited]
 

Work only in Rot* mode (nlassert).

Definition at line 255 of file transformable.h.

References NL3D::ITransformable::_Pivot, nlassert, NL3D::ITransformable::RotEuler, NL3D::ITransformable::RotQuat, and NL3D::CAnimatedValueBlendable< T >::Value.

00256         {
00257                 nlassert(_Mode==RotEuler || _Mode==RotQuat);
00258                 return _Pivot.Value;
00259         }

void NL3D::ITransformable::getPivot CVector pivot  )  [inline, inherited]
 

Work only in Rot* mode (nlassert).

Definition at line 224 of file transformable.h.

References NL3D::ITransformable::_Pivot, nlassert, NL3D::ITransformable::RotEuler, NL3D::ITransformable::RotQuat, and NL3D::CAnimatedValueBlendable< T >::Value.

Referenced by NL3D::CTransformableUser::getPivot().

00225         {
00226                 nlassert(_Mode==RotEuler || _Mode==RotQuat);
00227                 pivot= _Pivot.Value;
00228         }

const char * NL3D::ITransformable::getPivotValueName  )  [static, inherited]
 

Definition at line 117 of file transformable.cpp.

Referenced by NL3D::ITransformable::getValueName().

00118 {
00119         return "pivot";
00120 }

CVector NL3D::ITransformable::getPos void   )  [inline, inherited]
 

Work only in Rot* mode(nlassert).

Definition at line 231 of file transformable.h.

References nlassert, NL3D::ITransformable::RotEuler, NL3D::ITransformable::RotQuat, and NL3D::CAnimatedValueBlendable< T >::Value.

Referenced by generateShadowMap(), NL3D::CWaterModel::getHeight(), renderIntoSkeletonShadowMap(), NL3D::CMeshInstance::renderIntoSkeletonShadowMap(), and NL3D::CPointLightModel::traverseLight().

00232         {
00233                 nlassert(_Mode==RotEuler || _Mode==RotQuat);
00234                 return _Pos.Value;
00235         }

void NL3D::ITransformable::getPos CVector pos  )  [inline, inherited]
 

Work only in Rot* mode(nlassert).

Definition at line 200 of file transformable.h.

References nlassert, NL3D::ITransformable::RotEuler, NL3D::ITransformable::RotQuat, and NL3D::CAnimatedValueBlendable< T >::Value.

Referenced by NL3D::CTransformableUser::getPos(), NL3D::CInstanceGroup::getPos(), and NL3D::CPSLight::step().

00201         {
00202                 nlassert(_Mode==RotEuler || _Mode==RotQuat);
00203                 pos= _Pos.Value;
00204         }

const char * NL3D::ITransformable::getPosValueName  )  [static, inherited]
 

Definition at line 97 of file transformable.cpp.

Referenced by NL3D::ITransformable::getValueName().

00098 {
00099         return "pos";
00100 }

void NL3D::CTransform::getReceiverBBox CAABBox bbox  )  [virtual, inherited]
 

For receivers. get the World Instance bbox that includes the receiver.

Reimplemented in NL3D::CLandscapeModel.

Definition at line 1328 of file transform.cpp.

References NLMISC::CAABBox::setCenter(), and NLMISC::CAABBox::setHalfSize().

Referenced by NL3D::CShadowMapManager::addShadowReceiver().

01329 {
01330         bbox.setCenter(CVector::Null);
01331         bbox.setHalfSize(CVector::Null);
01332 }

virtual const CMatrix& NL3D::CTransform::getReceiverRenderWorldMatrix  )  const [inline, virtual, inherited]
 

For receivers. Retrieve the WorldMatrix of the model used for IDriver::render(). By default it returns getWorldMatrix(). The exception is the Landscape and his "ZBuffer Problem" management.

Reimplemented in NL3D::CLandscapeModel.

Definition at line 511 of file transform.h.

References NL3D::CTransform::getWorldMatrix().

Referenced by NL3D::CShadowMapManager::renderProject().

00511 {return getWorldMatrix();}

const sint& NLMISC::CRefCount::getRefCount  )  const [inline, inherited]
 

Definition at line 70 of file smart_ptr.h.

References NLMISC::CRefCount::crefs, and sint.

00071         {
00072                 return  crefs;
00073         }

CVector NL3D::ITransformable::getRotEuler  )  [inline, inherited]
 

Work only in RotEuler mode(nlassert).

Definition at line 237 of file transformable.h.

References NL3D::ITransformable::_RotEuler, nlassert, NL3D::ITransformable::RotEuler, and NL3D::CAnimatedValueBlendable< T >::Value.

00238         {
00239                 nlassert(_Mode==RotEuler);
00240                 return _RotEuler.Value;
00241         }

void NL3D::ITransformable::getRotEuler CVector rot  )  [inline, inherited]
 

Work only in RotEuler mode(nlassert).

Definition at line 206 of file transformable.h.

References NL3D::ITransformable::_RotEuler, nlassert, NL3D::ITransformable::RotEuler, and NL3D::CAnimatedValueBlendable< T >::Value.

Referenced by NL3D::CTransformableUser::getRotEuler().

00207         {
00208                 nlassert(_Mode==RotEuler);
00209                 rot= _RotEuler.Value;
00210         }

const char * NL3D::ITransformable::getRotEulerValueName  )  [static, inherited]
 

Definition at line 102 of file transformable.cpp.

Referenced by NL3D::ITransformable::getValueName().

00103 {
00104         return "roteuler";
00105 }

CMatrix::TRotOrder NL3D::ITransformable::getRotOrder  )  [inline, inherited]
 

get the current rotorder (information vlaid only when RotEuler mode).

Definition at line 194 of file transformable.h.

References NL3D::ITransformable::_RotOrder.

Referenced by NL3D::CTransformableUser::getRotOrder().

00195         {
00196                 return _RotOrder;
00197         }

CQuat NL3D::ITransformable::getRotQuat  )  [inline, inherited]
 

Work only in RotQuat mode (nlassert).

Definition at line 243 of file transformable.h.

References NL3D::ITransformable::_RotQuat, nlassert, NL3D::ITransformable::RotQuat, and NL3D::CAnimatedValueBlendable< T >::Value.

00244         {
00245                 nlassert(_Mode==RotQuat);
00246                 return _RotQuat.Value;
00247         }

void NL3D::ITransformable::getRotQuat CQuat quat  )  [inline, inherited]
 

Work only in RotQuat mode (nlassert).

Definition at line 212 of file transformable.h.

References NL3D::ITransformable::_RotQuat, nlassert, NL3D::ITransformable::RotQuat, and NL3D::CAnimatedValueBlendable< T >::Value.

Referenced by NL3D::CTransformableUser::getRotQuat(), and NL3D::CInstanceGroup::getRotQuat().

00213         {
00214                 nlassert(_Mode==RotQuat);
00215                 quat= _RotQuat.Value;
00216         }

const char * NL3D::ITransformable::getRotQuatValueName  )  [static, inherited]
 

Definition at line 107 of file transformable.cpp.

Referenced by NL3D::ITransformable::getValueName().

00108 {
00109         return "rotquat";
00110 }

CVector NL3D::ITransformable::getScale void   )  [inline, inherited]
 

Work only in Rot* mode (nlassert).

Definition at line 249 of file transformable.h.

References nlassert, NL3D::ITransformable::RotEuler, NL3D::ITransformable::RotQuat, and NL3D::CAnimatedValueBlendable< T >::Value.

00250         {
00251                 nlassert(_Mode==RotEuler || _Mode==RotQuat);
00252                 return _Scale.Value;
00253         }

void NL3D::ITransformable::getScale CVector scale  )  [inline, inherited]
 

Work only in Rot* mode (nlassert).

Definition at line 218 of file transformable.h.

References nlassert, NL3D::ITransformable::RotEuler, NL3D::ITransformable::RotQuat, and NL3D::CAnimatedValueBlendable< T >::Value.

Referenced by NL3D::CBone::compute(), and NL3D::CTransformableUser::getScale().

00219         {
00220                 nlassert(_Mode==RotEuler || _Mode==RotQuat);
00221                 scale= _Scale.Value;
00222         }

const char * NL3D::ITransformable::getScaleValueName  )  [static, inherited]
 

Definition at line 112 of file transformable.cpp.

Referenced by NL3D::ITransformable::getValueName().

00113 {
00114         return "scale";
00115 }

CShadowMap * NL3D::CSkeletonModel::getShadowMap  )  [virtual]
 

get The shadow Map result for receveing. If NULL, nothing is displayed.

Reimplemented from NL3D::CTransform.

Definition at line 1846 of file skeleton_model.cpp.

Referenced by NL3D::CClipTrav::clipSkeletonShadowMaps().

01847 {
01848         return _ShadowMap;
01849 }

bool NL3D::CTransform::getShowWhenLODSticked  )  const [inline, protected, inherited]
 

Test if obj must be displayed when sticked to an object displayed as a LOD (example: sword in hand of a character displayed as a LOD state).

Definition at line 680 of file transform.h.

References NL3D::CTransform::_ForceCLodSticked.

Referenced by NL3D::CParticleSystemModel::traverseClip().

00680 { return _ForceCLodSticked; }

const CLightContribution& NL3D::CSkeletonModel::getSkeletonLightContribution  )  [inline, private]
 

recompute _CLodVertexAlpha, ignoring _CLodVertexAlphaDirty

Definition at line 458 of file skeleton_model.h.

Referenced by renderCLod().

00458 {return _LightContribution;}

CSkeletonModel* NL3D::CTransform::getSkeletonModel  )  const [inline, inherited]
 

Get the skeleton model. Returnr NULL in normal mode.

Definition at line 205 of file transform.h.

References NL3D::CTransform::_FatherSkeletonModel.

Referenced by NL3D::CMeshMRMSkinnedGeom::render(), NL3D::CMeshMRMGeom::render(), NL3D::CMeshGeom::render(), NL3D::CMeshMRMSkinnedGeom::renderShadowSkinGeom(), NL3D::CMeshMRMGeom::renderShadowSkinGeom(), NL3D::CMeshMRMGeom::renderSkin(), NL3D::CMeshGeom::renderSkin(), NL3D::CMeshMRMSkinnedGeom::renderSkinGroupGeom(), NL3D::CMeshMRMGeom::renderSkinGroupGeom(), and NL3D::CTransformShape::traverseLoadBalancingPass0().

00205 {return _FatherSkeletonModel;}

virtual const std::vector<NLMISC::CBSphere>* NL3D::CTransform::getSkinBoneSphere  )  const [inline, protected, virtual, inherited]
 

Deriver must change this method if isSkinnable(). It return a list of sphere relative to each bone of the father skeleton. Use with getSkinBoneUsage() to know to wich bone this sphere apply NB: if a sphere radius is -1, it means that the bone is not used (for any reason...) default is to return NULL.

Reimplemented in NL3D::CMeshMRMInstance, and NL3D::CMeshMRMSkinnedInstance.

Definition at line 584 of file transform.h.

Referenced by updateSkinRenderLists().

00584 {return NULL;}

virtual const std::vector<sint32>* NL3D::CTransform::getSkinBoneUsage  )  const [inline, protected, virtual, inherited]
 

Deriver must change this method if isSkinnable(). It return the list of bone (correct skeleton index) used by the skins (NB: without the parents of the bone). NB: if an index is -1, it means that the skin bone has not been found in the skeleton (skip it) default is to return NULL.

Reimplemented in NL3D::CMeshInstance, NL3D::CMeshMRMInstance, and NL3D::CMeshMRMSkinnedInstance.

Definition at line 578 of file transform.h.

Referenced by computeCLodVertexAlpha(), and updateSkinRenderLists().

00578 {return NULL;}

TTransformMode NL3D::ITransformable::getTransformMode  )  [inline, inherited]
 

get the current transform mode.

Definition at line 189 of file transformable.h.

References NL3D::ITransformable::TTransformMode.

Referenced by NL3D::CTargetAnimCtrl::execute(), and NL3D::CTransformableUser::getTransformMode().

00190         {
00191                 return _Mode;
00192         }

bool NL3D::CTransform::getUserClipping  )  const [inherited]
 

Return the user clipping state.

Definition at line 1316 of file transform.cpp.

References NL3D::CTransform::getStateFlag(), and NL3D::CTransform::UserClipping.

Referenced by NL3D::CTransformUser::getUserClipping().

01317 {
01318         return getStateFlag(UserClipping) != 0;
01319 }

bool NL3D::CTransform::getUserLightable  )  const [inline, inherited]
 

Get the UserLightable flag.

Definition at line 347 of file transform.h.

References NL3D::CTransform::getStateFlag(), and NL3D::CTransform::IsUserLightable.

Referenced by NL3D::CTransformUser::getUserLightable().

00347 {return getStateFlag(IsUserLightable)!=0;}

IAnimatedValue * NL3D::ITransformable::getValue uint  valueId  )  [virtual, inherited]
 

From IAnimatable.

Implements NL3D::IAnimatable.

Reimplemented in NL3D::CCamera, and NL3D::CParticleSystemModel.

Definition at line 58 of file transformable.cpp.

References NL3D::ITransformable::_Pivot, NL3D::ITransformable::_RotEuler, NL3D::ITransformable::_RotQuat, nlstop, NL3D::ITransformable::PivotValue, NL3D::ITransformable::PosValue, NL3D::ITransformable::RotEulerValue, NL3D::ITransformable::RotQuatValue, NL3D::ITransformable::ScaleValue, and uint.

00059 {
00060         // what value ?
00061         switch (valueId)
00062         {
00063         case PosValue:                  return &_Pos;
00064         case RotEulerValue:             return &_RotEuler;
00065         case RotQuatValue:              return &_RotQuat;
00066         case ScaleValue:                return &_Scale;
00067         case PivotValue:                return &_Pivot;
00068         }
00069 
00070         // No, only ITrnasformable values!
00071         nlstop;
00072         // Deriver note: else call BaseClass::getValue(valueId);
00073 
00074         return NULL;
00075 }

const char * NL3D::ITransformable::getValueName uint  valueId  )  const [virtual, inherited]
 

From IAnimatable.

Implements NL3D::IAnimatable.

Reimplemented in NL3D::CCamera, and NL3D::CParticleSystemModel.

Definition at line 77 of file transformable.cpp.

References NL3D::ITransformable::getPivotValueName(), NL3D::ITransformable::getPosValueName(), NL3D::ITransformable::getRotEulerValueName(), NL3D::ITransformable::getRotQuatValueName(), NL3D::ITransformable::getScaleValueName(), nlstop, NL3D::ITransformable::PivotValue, NL3D::ITransformable::PosValue, NL3D::ITransformable::RotEulerValue, NL3D::ITransformable::RotQuatValue, NL3D::ITransformable::ScaleValue, and uint.

00078 {
00079         // what value ?
00080         switch (valueId)
00081         {
00082         case PosValue:                  return getPosValueName ();
00083         case RotEulerValue:             return getRotEulerValueName();
00084         case RotQuatValue:              return getRotQuatValueName();
00085         case ScaleValue:                return getScaleValueName();
00086         case PivotValue:                return getPivotValueName();
00087         }
00088 
00089         // No, only ITrnasformable values!
00090         nlstop;
00091         // Deriver note: else call BaseClass::getValueName(valueId);
00092 
00093         return "";
00094 }

CHrcTrav::TVisibility NL3D::CTransform::getVisibility  )  [inline, inherited]
 

Get the local visibility state.

Definition at line 203 of file transform.h.

References NL3D::CTransform::Visibility.

Referenced by NL3D::CTransformUser::getVisibility(), NL3D::CParticleSystemManager::processAnimate(), NL3D::CMeshMRMSkinnedInstance::renderSkin(), NL3D::CMeshMRMInstance::renderSkin(), NL3D::CMeshInstance::renderSkin(), NL3D::CParticleSystemModel::traverseAnimDetail(), and updateSkinRenderLists().

00203 {return Visibility;}

const CMatrix& NL3D::CTransform::getWorldMatrix  )  const [inline, inherited]
 

Get the worldMatrix that is computed at last Hrc pass

Definition at line 299 of file transform.h.

Referenced by NL3D::CMeshMRMGeom::activeInstance(), NL3D::CMeshGeom::activeInstance(), NL3D::CLightingManager::addDynamicLight(), NL3D::CCamera::buildCameraPyramid(), NL3D::CParticleSystemModel::checkAgainstPyramid(), NL3D::CTransformShape::clip(), NL3D::CClipTrav::clipSkeletonShadowMaps(), NL3D::CWaterModel::computeClippedPoly(), computeDisplayLodCharacterPriority(), NL3D::CShadowMapManager::computeShadowDirection(), NL3D::CWaterModel::computeSimpleClippedPoly(), NL3D::CMeshInstance::computeWorldBBoxForShadow(), NL3D::CParticleSystemModel::doAnimate(), NL3D::CWaterModel::doSimpleRender(), NL3D::CTargetAnimCtrl::execute(), generateShadowMap(), NL3D::CMeshInstance::generateShadowMap(), NL3D::CTransformShape::getLightHotSpotInWorld(), NL3D::CTransform::getReceiverRenderWorldMatrix(), NL3D::CLightingManager::insertStaticLightedModel(), NL3D::CQuadGridClipManager::linkModel(), NL3D::CParticleSystemManager::processAnimate(), NL3D::CParticleSystemModel::refreshRscDeletion(), NL3D::CParticleSystemShape::render(), NL3D::CMeshMRMSkinnedGeom::render(), NL3D::CMeshMRMGeom::render(), NL3D::CMeshGeom::render(), renderCLod(), renderIntoSkeletonShadowMap(), NL3D::CMeshInstance::renderIntoSkeletonShadowMap(), NL3D::CMeshMultiLod::renderMeshGeom(), NL3D::CShadowMapManager::renderProject(), NL3D::CMeshMRMGeom::renderSkin(), NL3D::CMeshGeom::renderSkin(), renderSkins(), NL3D::CSegRemanence::samplePos(), NL3D::CShadowMapManager::selectShadowMapsToGenerate(), NL3D::CMeshVPWindTree::setupPerInstanceConstants(), NL3D::CRenderTrav::traverse(), NL3D::CClipTrav::traverse(), NL3D::CWaveMakerModel::traverseAnimDetail(), traverseAnimDetail(), NL3D::CParticleSystemModel::traverseClip(), NL3D::CTransform::traverseLight(), NL3D::CPointLightModel::traverseLight(), NL3D::CTransformShape::traverseLoadBalancingPass0(), NL3D::CWaterModel::traverseRender(), NL3D::CFlareModel::traverseRender(), and NL3D::CWaterModel::updateDiffuseMapMatrix().

00299 {return _WorldMatrix;}

void NL3D::CTransform::heritVisibility  )  [inherited]
 

herit the visibility from his father. (default behavior).

Definition at line 287 of file transform.cpp.

References NL3D::CTransform::_FatherSkeletonModel, NL3D::CTransform::_TransformDirty, dirtSkinRenderLists(), NL3D::CTransform::isSkinned(), nlassert, and NL3D::CTransform::Visibility.

Referenced by NL3D::CTransformUser::heritVisibility().

00288 {
00289         // Optim: do nothing if already set
00290         if(Visibility!= CHrcTrav::Herit)
00291         {
00292                 _TransformDirty= true;
00293                 Visibility= CHrcTrav::Herit;
00294                 // If skinned, then must inform skeleton parent that it must recompute skin render/animDetail lists
00295                 if(isSkinned())
00296                 {
00297                         nlassert(_FatherSkeletonModel);
00298                         _FatherSkeletonModel->dirtSkinRenderLists();
00299                 }
00300         }
00301 }

void NL3D::CTransform::hide  )  [inherited]
 

Hide the object and his sons.

Definition at line 223 of file transform.cpp.

References NL3D::CTransform::_FatherSkeletonModel, NL3D::CTransform::_TransformDirty, dirtSkinRenderLists(), NL3D::CTransform::isSkinned(), nlassert, and NL3D::CTransform::Visibility.

Referenced by NL3D::CTransformUser::hide(), NL3D::CLandscapeUser::hide(), NL3D::CPSMesh::newElement(), and NL3D::CPSMesh::updatePos().

00224 {
00225         // Optim: do nothing if already set
00226         if(Visibility!= CHrcTrav::Hide)
00227         {
00228                 _TransformDirty= true;
00229                 Visibility= CHrcTrav::Hide;
00230                 // If skinned, then must inform skeleton parent that it must recompute skin render/animDetail lists
00231                 if(isSkinned())
00232                 {
00233                         nlassert(_FatherSkeletonModel);
00234                         _FatherSkeletonModel->dirtSkinRenderLists();
00235                 }
00236         }
00237 }

CTransform * NL3D::CTransform::hrcGetChild uint  index  )  const [inherited]
 

Definition at line 1202 of file transform.cpp.

References NL3D::CTransform::_HrcSons, index, nlassert, NL3D::CFastPtrList< CTransform >::size(), and uint.

Referenced by NL3D::CTransform::traverseHrc(), NL3D::CRootModel::traverseHrc(), NL3D::CAnimDetailTrav::traverseHrcRecurs(), and NL3D::CTransform::~CTransform().

01203 {
01204         nlassert(index < _HrcSons.size());
01205         return (const_cast<CTransform*>(this))->_HrcSons.begin()[index];
01206 }

uint NL3D::CTransform::hrcGetNumChildren  )  const [inline, inherited]
 

Definition at line 220 of file transform.h.

References NL3D::CTransform::_HrcSons, NL3D::CFastPtrList< CTransform >::size(), and uint.

Referenced by NL3D::CTransform::traverseHrc(), NL3D::CRootModel::traverseHrc(), NL3D::CAnimDetailTrav::traverseHrcRecurs(), and NL3D::CTransform::~CTransform().

00220 {return _HrcSons.size();}

CTransform* NL3D::CTransform::hrcGetParent  )  const [inline, inherited]
 

Definition at line 218 of file transform.h.

References NL3D::CTransform::_HrcParent.

Referenced by NL3D::CMeshBaseInstance::traverseHrc(), and NL3D::CTransform::updateWorldMatrixFromFather().

00218 {return _HrcParent;}

void NL3D::CTransform::hrcLinkSon CTransform son  )  [inherited]
 

link son to this in Hierarchy traversal NB: link does nothing if the son node is HRC frozen

Definition at line 1151 of file transform.cpp.

References NL3D::CTransform::_FreezeHRCState, NL3D::CTransform::_HrcNode, NL3D::CTransform::_HrcParent, NL3D::CTransform::_HrcParentUnfreeze, NL3D::CTransform::_HrcSons, NL3D::CTransform::_WorldDate, NL3D::CTransform::hrcUnlink(), and NL3D::CFastPtrList< CTransform >::insert().

Referenced by NL3D::CInstanceGroup::addToSceneWhenAllShapesLoaded(), NL3D::CScene::createModel(), detachSkeletonSon(), NL3D::CInstanceGroup::linkRoot(), NL3D::CTransform::setForceClipRoot(), stickObjectEx(), and NL3D::CTransform::unfreezeHRC().

01152 {
01153         if(!son)
01154                 return;
01155 
01156         // If not unfrozen, can't link
01157         if (son->_FreezeHRCState != CTransform::FreezeHRCStateDisabled)
01158                 return;
01159 
01160         // no-op if already me.
01161         if(son->_HrcParent==this)
01162                 return;
01163 
01164         // unlink from anyone
01165         son->hrcUnlink();
01166 
01167         // link son to me
01168         _HrcSons.insert(son, &son->_HrcNode);
01169         
01170         // link me to son
01171         son->_HrcParent= this;
01172         
01173         // Backup parent
01174         son->_HrcParentUnfreeze= this;
01175         
01176         // my son should recompute his worldMatrix!
01177         son->_WorldDate= -1;
01178 }

void NL3D::CTransform::hrcUnlink  )  [inherited]
 

unlink this from any Father in Hrc. No-op if no parent NB: unlink does nothing if the node is HRC frozen

Definition at line 1181 of file transform.cpp.

References NL3D::CTransform::_HrcNode, NL3D::CTransform::_HrcParent, NL3D::CTransform::_HrcParentUnfreeze, NL3D::CTransform::_WorldDate, NL3D::CTransform::ForceClipRoot, NL3D::CTransform::getStateFlag(), nlassert, and NL3D::CFastPtrListNode::unlink().

Referenced by bindSkin(), NL3D::CTransform::hrcLinkSon(), NL3D::CScene::initDefaultRoots(), NL3D::CScene::initQuadGridClipManager(), NL3D::CTransform::setForceClipRoot(), NL3D::CTransform::update(), and NL3D::CTransform::~CTransform().

01182 {
01183         // no-op if already NULL
01184         if(_HrcParent==NULL)
01185                 return;
01186 
01187         // if ForceClipRoot flag is set, then the fx can't be linked elsewhere in the hierarchy
01188         nlassert(!getStateFlag(ForceClipRoot));
01189 
01190         // unlink my parent from me.
01191         _HrcNode.unlink();
01192 
01193         // unlink me from parent
01194         _HrcParent= NULL;
01195         _HrcParentUnfreeze= NULL;
01196 
01197         // I should recompute my worldMatrix (well not usefull since not linked, but still do it...)
01198         _WorldDate= -1;
01199 }

void NL3D::CSkeletonModel::incBoneUsage uint  i,
TBoneUsageType  boneUsageType
 

increment the refCount of the ith bone. set boneUsageType to UsageNormal if enable Skeleton Bone degradation (skins) Forced usage are for Sticked objects

Definition at line 189 of file skeleton_model.cpp.

References _BoneToComputeDirty, _BoneUsage, nlassert, uint, uint8, UsageForced, and UsageNormal.

Referenced by incForcedBoneUsageAndParents(), NL3D::CMeshMRMSkinnedGeom::updateSkeletonUsage(), NL3D::CMeshMRMGeom::updateSkeletonUsage(), and NL3D::CMeshGeom::updateSkeletonUsage().

00190 {
00191         nlassert(i<_BoneUsage.size());
00192 
00193         // Get ptr on according refCount
00194         uint8   *usagePtr;
00195         if(boneUsageType == UsageNormal)
00196                 usagePtr= &_BoneUsage[i].Usage;
00197         else if(boneUsageType == UsageForced)
00198                 usagePtr= &_BoneUsage[i].ForcedUsage;
00199         else
00200                 usagePtr= &_BoneUsage[i].CLodForcedUsage;
00201 
00202         // If the bone was not used before, must update MustCompute.
00203         if(*usagePtr==0)
00204                 _BoneToComputeDirty= true;
00205 
00206         // Inc the refCount of the bone.
00207         nlassert(*usagePtr<255);
00208         (*usagePtr)++;
00209 }

void NL3D::CSkeletonModel::incForcedBoneUsageAndParents uint  i,
bool  forceCLod
[private]
 

increment the refCount of the ith bone and its parents. for stickObjects.

Definition at line 253 of file skeleton_model.cpp.

References Bones, incBoneUsage(), sint, and uint.

Referenced by stickObjectEx().

00254 {
00255         // inc forced.
00256         incBoneUsage(i, forceCLod?UsageCLodForced:UsageForced );
00257 
00258         // recurs to father
00259         sint    fatherId= Bones[i].getFatherId();
00260         // if not a root bone...
00261         if(fatherId>=0)
00262                 incForcedBoneUsageAndParents(fatherId, forceCLod);
00263 }

void NL3D::CSkeletonModel::initBoneUsages  )  [private]
 

called by CSkeletonShape::createInstance(). init the vector.

Definition at line 165 of file skeleton_model.cpp.

References _BoneToCompute, _BoneToComputeDirty, _BoneUsage, _CurLod, _CurLodInterp, _LodInterpMultiplier, Bones, and uint.

Referenced by NL3D::CSkeletonShape::createInstance().

00166 {
00167         // reset all to 0.
00168         _BoneUsage.resize(Bones.size());
00169         for(uint i=0; i<_BoneUsage.size(); i++)
00170         {
00171                 _BoneUsage[i].Usage= 0;
00172                 _BoneUsage[i].ForcedUsage= 0;
00173                 _BoneUsage[i].CLodForcedUsage= 0;
00174                 _BoneUsage[i].MustCompute= 0;
00175                 _BoneUsage[i].ValidBoneSkinMatrix= 0;
00176         }
00177         // reserve space for bone to compute
00178         _BoneToCompute.reserve(Bones.size());
00179 
00180         _BoneToComputeDirty= false;
00181         _CurLod= 0;
00182         _CurLodInterp= 1.f;
00183         // Default is 0.5 meters.
00184         _LodInterpMultiplier= 1.f / 0.5f;
00185 }

void NL3D::CSkeletonModel::initModel  )  [protected, virtual]
 

Build link to traversals.

Reimplemented from NL3D::CTransform.

Definition at line 154 of file skeleton_model.cpp.

References _ItSkeletonInScene, NL3D::CScene::appendSkeletonModelToList(), and NL3D::CTransform::getOwnerScene().

00155 {
00156         // Link this skeleton to the CScene.
00157         _ItSkeletonInScene= getOwnerScene()->appendSkeletonModelToList(this);
00158 
00159         // Call base class
00160         CTransformShape::initModel();
00161 }

uint32 NL3D::CTransform::isAnimDetailable  )  const [inline, inherited]
 

non-zero if the model is animDetailable (ie added to the animDetail list if visible)

Definition at line 440 of file transform.h.

References NL3D::CTransform::getStateFlag(), NL3D::CTransform::IsAnimDetailable, and uint32.

Referenced by NL3D::CClipTrav::clipSkeletonShadowMaps(), NL3D::CTransform::traverseClip(), and updateSkinRenderLists().

00440 {return getStateFlag(IsAnimDetailable);}

uint32 NL3D::CTransform::isBigLightable  )  const [inline, inherited]
 

non-zero if the lighting Manager must take into account the bbox of the transform. Default behavior is false. Deriver must call setIsBigLightable() at initialisation to change it.

Definition at line 365 of file transform.h.

References NL3D::CTransform::getStateFlag(), NL3D::CTransform::IsBigLightable, and uint32.

Referenced by NL3D::CTransformShape::getLightHotSpotInWorld().

00365 {return getStateFlag(IsBigLightable);}

bool NL3D::CSkeletonModel::isBoneComputed uint  boneId  )  const
 

Tell if a bone has been computed in the last frame or not. false if boneId is invalid.

Definition at line 374 of file skeleton_model.cpp.

References _BoneUsage, NL3D::CTransform::isClipVisible(), and uint.

Referenced by computeRenderedBBox(), getLightHotSpotInWorld(), and NL3D::CSkeletonUser::isBoneComputed().

00375 {
00376         if(boneId>=_BoneUsage.size())
00377                 return false;
00378         else
00379                 return _BoneUsage[boneId].MustCompute!=0 && isClipVisible();
00380 }

bool NL3D::CTransform::isClipVisible  )  const [inline, inherited]
 

tells if the transform has been clipped in the clip traversal.

Definition at line 313 of file transform.h.

References NL3D::CTransform::_Visible.

Referenced by NL3D::CClipTrav::clipSkeletonShadowMaps(), computeDisplayLodCharacterPriority(), computeRenderedBBox(), NL3D::CTransformUser::getLastClippedState(), isBoneComputed(), NL3D::CParticleSystemManager::processAnimate(), NL3D::CTransform::traverseClip(), NL3D::CParticleSystemModel::traverseClip(), and NL3D::CPointLightModel::traverseLight().

00314         {
00315                 return _Visible;
00316         }

uint32 NL3D::CTransform::isCluster  )  const [inline, inherited]
 

non-zero if the CTransform can be casted to a CCluster

Definition at line 451 of file transform.h.

References NL3D::CTransform::getStateFlag(), NL3D::CTransform::IsCluster, and uint32.

Referenced by NL3D::CClipTrav::traverse().

00451 {return getStateFlag(IsCluster);}

bool NL3D::CSkeletonModel::isDisplayedAsLodCharacter  )  const [inline]
 

True if the skeleton model and his skins are to be displayed with a CLodCharacterShape, instead of the std way This state is modified early during the HRC Traversal. Because Clip traversal need this result.

Definition at line 259 of file skeleton_model.h.

References _DisplayedAsLodCharacter.

Referenced by getNumTriangles(), NL3D::CSkeletonUser::isDisplayedAsLodCharacter(), traverseAnimDetail(), NL3D::CTransform::traverseClip(), NL3D::CParticleSystemModel::traverseClip(), traverseRender(), and updateBoneToCompute().

00259 {return _DisplayedAsLodCharacter;}

bool NL3D::CTransform::isGeneratingShadowMap  )  const [inline, inherited]
 

true if the instance cast shadow. By default false

Definition at line 515 of file transform.h.

References NL3D::CTransform::getStateFlag(), and NL3D::CTransform::IsGeneratingShadowMap.

Referenced by NL3D::CClipTrav::clipSkeletonShadowMaps(), and traverseAnimDetail().

00515 {return getStateFlag(IsGeneratingShadowMap)!=0;}

bool NL3D::CTransform::isHrcVisible  )  const [inline, inherited]
 

tells if the transform has been determined as visible in the hrc traversal

Reimplemented in NL3D::CPointLightModel.

Definition at line 306 of file transform.h.

References NL3D::CTransform::_WorldVis.

Referenced by NL3D::CClipTrav::clipSkeletonShadowMaps(), computeWorldBBoxForShadow(), NL3D::CMeshInstance::computeWorldBBoxForShadow(), NL3D::CTransformUser::getLastWorldVisState(), renderIntoSkeletonShadowMap(), NL3D::CMeshInstance::renderIntoSkeletonShadowMap(), and traverseAnimDetail().

00307         {
00308                 return _WorldVis;
00309         }

uint32 NL3D::CTransform::isLightable  )  const [inline, inherited]
 

true if the model can be lighted (such as CMeshBaseInstance) Default behavior is false. Deriver must use setIsLightable(true) method if the instance can be lighted.

Returns:
0 if getUserLightable() is false, or if the model can't be lighted at all. else return a non-zero value

Definition at line 337 of file transform.h.

References NL3D::CTransform::getStateFlag(), NL3D::CTransform::IsFinalLightable, and uint32.

Referenced by NL3D::CClipTrav::clipSkeletonShadowMaps(), NL3D::CTransform::traverseClip(), NL3D::CTransformShape::traverseRender(), NL3D::CTransform::unfreezeHRC(), NL3D::CTransform::update(), and NL3D::CTransform::updateWorld().

00337 {return getStateFlag(IsFinalLightable);}

bool NL3D::CTransformShape::isLinkToQuadCluster  )  const [inline, inherited]
 

true if the model is linked to a quadCluster

Definition at line 141 of file transform_shape.h.

References NL3D::CTransformShape::_QuadClusterListNode, and NL3D::CFastPtrListNode::isLinked().

00141 {return _QuadClusterListNode.isLinked();}

uint32 NL3D::CTransform::isLoadBalancable  )  const [inline, inherited]
 

non-zero if the model is loadBalancable (ie added to the loadBalancing list if visible)

Definition at line 442 of file transform.h.

References NL3D::CTransform::getStateFlag(), NL3D::CTransform::IsLoadBalancable, and uint32.

Referenced by NL3D::CTransform::traverseClip().

00442 {return getStateFlag(IsLoadBalancable);}

uint32 NL3D::CTransform::isMeshBaseInstance  )  const [inline, inherited]
 

non-zero if the CTransform can be casted to a CMeshBaseInstance

Definition at line 447 of file transform.h.

References NL3D::CTransform::getStateFlag(), NL3D::CTransform::IsMeshBaseInstance, and uint32.

Referenced by NL3D::CInstanceUser::enableAsyncTextureMode(), NL3D::CInstanceUser::getAsyncTextureDistance(), NL3D::CInstanceUser::getAsyncTextureMode(), NL3D::CInstanceUser::isAsyncTextureDirty(), NL3D::CInstanceUser::isAsyncTextureReady(), NL3D::CInstanceUser::setAsyncTextureDirty(), NL3D::CInstanceUser::setAsyncTextureDistance(), and NL3D::CInstanceUser::startAsyncTextureLoading().

00447 {return getStateFlag(IsMeshBaseInstance);}

uint32 NL3D::CTransform::isNeedUpdateFrozenStaticLightSetup  )  const [inline, protected, inherited]
 

non-zero if the object has a FrozenStaticLightSetup not correclty updated.

Definition at line 631 of file transform.h.

References NL3D::CTransform::getStateFlag(), NL3D::CTransform::IsNeedUpdateFrozenStaticLightSetup, and uint32.

Referenced by NL3D::CTransform::traverseLight().

00631 {return getStateFlag(IsNeedUpdateFrozenStaticLightSetup);}

uint32 NL3D::CTransform::isNeedUpdateLighting  )  const [inline, protected, inherited]
 

non-zero if the object needs to updatelighting.

Definition at line 629 of file transform.h.

References NL3D::CTransform::getStateFlag(), NL3D::CTransform::IsNeedUpdateLighting, and uint32.

Referenced by NL3D::CTransform::resetLighting(), and NL3D::CTransform::traverseLight().

00629 {return getStateFlag(IsNeedUpdateLighting);}

uint32 NL3D::CTransform::isOpaque  )  [inline, inherited]
 

Definition at line 173 of file transform.h.

References NL3D::CTransform::getStateFlag(), and uint32.

Referenced by NL3D::CTransformUser::isOpaque(), NL3D::CRenderTrav::traverse(), and updateSkinRenderLists().

00173 { return getStateFlag(IsOpaque); }

uint32 NL3D::CTransform::isQuadGridClipEnabled  )  const [inline, inherited]
 

special feature for CQuadGridClipManager. return a non-zero value if true

Definition at line 294 of file transform.h.

References NL3D::CTransform::getStateFlag(), NL3D::CTransform::QuadGridClipEnabled, and uint32.

Referenced by NL3D::CClipTrav::traverse().

00294 {return getStateFlag(QuadGridClipEnabled);}

uint32 NL3D::CTransform::isRenderable  )  const [inline, inherited]
 

non-zero if the model is renderable (ie something may appear on screen)

Definition at line 444 of file transform.h.

References NL3D::CTransform::getStateFlag(), NL3D::CTransform::IsRenderable, and uint32.

Referenced by NL3D::CTransform::traverseClip().

00444 {return getStateFlag(IsRenderable);}

uint32 NL3D::CTransform::isSkeleton  )  const [inline, inherited]
 

return non-zero if I am a skeleton. if yes, static_cast<CSkeletonModel*> may be used

Definition at line 421 of file transform.h.

References NL3D::CTransform::getStateFlag(), NL3D::CTransform::IsSkeleton, and uint32.

Referenced by forceComputeBone(), and NL3D::CAnimDetailTrav::traverse().

00421 {return getStateFlag(IsSkeleton);}

virtual bool NL3D::CTransform::isSkinnable  )  const [inline, protected, virtual, inherited]
 

Deriver must change this method if the model can be skinned. called rarely.

Reimplemented in NL3D::CMeshInstance, NL3D::CMeshMRMInstance, and NL3D::CMeshMRMSkinnedInstance.

Definition at line 567 of file transform.h.

Referenced by bindSkin().

00567 {return false;}

uint32 NL3D::CTransform::isSkinned  )  const [inline, inherited]
 

non-zero if the model is skinned onto a skeleton.

Definition at line 423 of file transform.h.

References NL3D::CTransform::getStateFlag(), NL3D::CTransform::IsSkinned, and uint32.

Referenced by detachSkeletonSon(), NL3D::CTransform::heritVisibility(), NL3D::CTransform::hide(), NL3D::CTransform::registerToChannelMixer(), NL3D::CMeshMRMSkinnedGeom::render(), NL3D::CMeshMRMGeom::render(), NL3D::CMeshGeom::render(), NL3D::CMeshMRMGeom::renderSkin(), NL3D::CMeshGeom::renderSkin(), NL3D::CMeshMRMSkinnedGeom::renderSkinGroupGeom(), NL3D::CMeshMRMGeom::renderSkinGroupGeom(), NL3D::CTransform::setIsForceAnimDetail(), NL3D::CTransform::setOpacity(), NL3D::CTransform::setTransparency(), NL3D::CTransform::show(), NL3D::CTransform::updateWorldMatrixFromFather(), and NL3D::CTransform::~CTransform().

00423 {return getStateFlag(IsSkinned);}

virtual bool NL3D::CTransformShape::isStarted  )  const [inline, virtual, inherited]
 

Reimplemented in NL3D::CSegRemanence.

Definition at line 132 of file transform_shape.h.

Referenced by NL3D::CInstanceUser::isStarted().

00132 { return false; }

uint32 NL3D::IAnimatable::isTouched uint  valueId  )  const [inline, inherited]
 

Return non 0 int if the value as been touched else 0.

Parameters:
valueId is the animated value ID in the object we want to test the touch flag. or it may be an OwnerBit.

Definition at line 184 of file animatable.h.

References NL3D::IAnimatable::_BitSet, uint, and uint32.

Referenced by NL3D::CParticleSystemModel::doAnimate(), NL3D::ITransformable::needCompute(), NL3D::IAnimatable::propagateTouch(), and NL3D::CAnimatedMaterial::update().

00185         {
00186                 return _BitSet&(1<<valueId);
00187         }

uint32 NL3D::CTransform::isTransformShape  )  const [inline, inherited]
 

non-zero if the CTransform can be casted to a CTransformShape

Definition at line 449 of file transform.h.

References NL3D::CTransform::getStateFlag(), NL3D::CTransform::IsTransformShape, and uint32.

Referenced by NL3D::CTransform::updateWorld().

00449 {return getStateFlag(IsTransformShape);}

uint32 NL3D::CTransform::isTransparent  )  [inline, inherited]
 

Definition at line 174 of file transform.h.

References NL3D::CTransform::getStateFlag(), and uint32.

Referenced by NL3D::CTransformUser::isTransparent(), NL3D::CRenderTrav::traverse(), and updateSkinRenderLists().

00174 { return getStateFlag(IsTransparent); }

void NL3D::ITransformable::lookAt const CVector eye,
const CVector target,
float  roll = 0.f
[inherited]
 

Setup Matrix by the lookAt method. Work only in DirectMatrix mode and RotQuat mode (not euler...).

Parameters:
eye is the coordinate of the object.
target is the point the object look at.
roll is the roll angle in radian along the object's Y axis.

Definition at line 169 of file transformable.cpp.

References NL3D::ITransformable::DirectMatrix, NLMISC::CMatrix::getPos(), NLMISC::CMatrix::getRot(), NLMISC::CMatrix::identity(), nlassert, NLMISC::CVector::normalize(), NLMISC::CMatrix::rotateY(), NL3D::ITransformable::RotQuat, NL3D::ITransformable::setMatrix(), NL3D::ITransformable::setPivot(), NL3D::ITransformable::setPos(), NLMISC::CMatrix::setPos(), NLMISC::CMatrix::setRot(), NL3D::ITransformable::setRotQuat(), and NL3D::ITransformable::setScale().

Referenced by NL3D::CTransformableUser::lookAt(), and NL3D::CCamera::update().

00170 {
00171         nlassert(_Mode==RotQuat || _Mode==DirectMatrix);
00172 
00173         // Roll matrix
00174         CMatrix rollMT;
00175         rollMT.identity();
00176         if (roll!=0.f)
00177                 rollMT.rotateY (roll);
00178 
00179         // Make the target base
00180         CVector j=target;
00181         j-=eye;
00182         j.normalize();
00183         CVector i=j^CVector (0,0,1.f);
00184         CVector k=i^j;
00185         k.normalize();
00186         i=j^k;
00187         i.normalize();
00188 
00189         // Make the target matrix
00190         CMatrix targetMT;
00191         targetMT.identity();
00192         targetMT.setRot (i, j, k);
00193         targetMT.setPos (eye);
00194 
00195         // Compose matrix
00196         targetMT*=rollMT;
00197 
00198         // Set the matrix
00199         if(_Mode==DirectMatrix)
00200                 setMatrix (targetMT);
00201         else
00202         {
00203                 // transfrom to quaternion mode.
00204                 setScale(CVector(1,1,1));
00205                 setPivot(CVector::Null);
00206                 setPos(targetMT.getPos());
00207                 setRotQuat(targetMT.getRot());
00208         }
00209 }

uint32 NL3D::CTransform::modelCanCastShadowMap  )  const [inline, inherited]
 

true if the model provide a method to support shadowMap generation

Definition at line 480 of file transform.h.

References NL3D::CTransform::getStateFlag(), NL3D::CTransform::IsShadowMapCaster, and uint32.

Referenced by NL3D::CTransform::enableCastShadowMap().

00480 {return getStateFlag(IsShadowMapCaster);}

uint32 NL3D::CTransform::modelCanReceiveShadowMap  )  const [inline, inherited]
 

true if the model provide a method to support shadowMap receiving

Definition at line 482 of file transform.h.

References NL3D::CTransform::getStateFlag(), NL3D::CTransform::IsShadowMapReceiver, and uint32.

Referenced by NL3D::CTransform::enableReceiveShadowMap().

00482 {return getStateFlag(IsShadowMapReceiver);}

void NL3D::CTransformShape::profileRender  )  [virtual, inherited]
 

Called at RenderTrav to profile current render. no-op per default.

Reimplemented from NL3D::CTransform.

Definition at line 248 of file transform_shape.cpp.

References NL3D::CTransform::getOwnerScene(), NL3D::CScene::getRenderTrav(), NL3D::CRenderTrav::isCurrentPassOpaque(), and NL3D::CTransformShape::Shape.

00249 {
00250         // profile the shape.
00251         if(Shape)
00252         {
00253                 CRenderTrav                     &rdrTrav= getOwnerScene()->getRenderTrav();
00254                 bool                            currentPassOpaque= rdrTrav.isCurrentPassOpaque();
00255 
00256                 Shape->profileSceneRender( &rdrTrav, this, currentPassOpaque );
00257         }
00258 }

virtual void NL3D::CTransform::receiveShadowMap CShadowMap shadowMap,
const CVector casterPos,
const CMaterial shadowMat
[inline, virtual, inherited]
 

For receivers. Modulate the Object with a ShadowMap. The model shoud render in the scene driver a version of its geometry simplified, and modulate the background with shadowColor.

Parameters:
casterPos the world position of the caster model.
shadowMat a correclty setuped material with good ShadowColor, ready to be rendered.

Reimplemented in NL3D::CLandscapeModel.

Definition at line 506 of file transform.h.

Referenced by NL3D::CShadowMapManager::renderProject().

00506 {}

void NL3D::CSkeletonModel::registerBasic  )  [static]
 

Call at the begining of the program, to register the model.

Reimplemented from NL3D::CTransformShape.

Definition at line 54 of file skeleton_model.cpp.

References NL3D::SkeletonModelId, and NL3D::TransformShapeId.

00055 {
00056         CScene::registerModel(SkeletonModelId, TransformShapeId, CSkeletonModel::creator);
00057 }

void NL3D::CSkeletonModel::registerToChannelMixer CChannelMixer chanMixer,
const std::string &  prefix
[virtual]
 

register transform channels (in global anim mode).

See also:
setChannelMixerOwnerShip

Reimplemented from NL3D::CTransform.

Definition at line 61 of file skeleton_model.cpp.

References Bones, and uint.

Referenced by NL3D::CLodCharacterBuilder::addAnim().

00062 {
00063         CTransformShape::registerToChannelMixer(chanMixer, prefix);
00064 
00065         // Add any bones.
00066         for(uint i=0;i<Bones.size();i++)
00067         {
00068                 // append  bonename.
00069                 Bones[i].registerToChannelMixer(chanMixer, prefix + Bones[i].getBoneName() + ".");
00070         }
00071 
00072 }

void NL3D::CSkeletonModel::renderCLod  )  [private]
 

render the skeleton as a CLod.

  • update instance Lighting
  • render the lod.
    • no op if passTransparent

Definition at line 1295 of file skeleton_model.cpp.

References _CLodInstance, _CLodVertexAlphaDirty, NL3D::CLodCharacterManager::addRenderCharacterKey(), NL3D::CLightContribution::AttFactor, NLMISC::CRGBA::B, NL3D::CLodCharacterManager::beginRender(), NL3D::CTravCameraScene::CamPos, computeCLodVertexAlpha(), NL3D::CLodCharacterManager::endRender(), NLMISC::CRGBA::G, NL3D::CPointLight::getDiffuse(), NL3D::CRenderTrav::getDriver(), NL3D::CScene::getLodCharacterManager(), NL3D::CTransform::getOwnerScene(), NLMISC::CMatrix::getPos(), NL3D::CPointLight::getPosition(), NL3D::CScene::getRenderTrav(), getSkeletonLightContribution(), NL3D::CScene::getSunAmbient(), NL3D::CScene::getSunDiffuse(), NL3D::CScene::getSunDirection(), NL3D::CTransform::getWorldMatrix(), NL3D::CRenderTrav::isCurrentPassOpaque(), NL3D::CLodCharacterManager::isRendering(), NLMISC::CRGBA::modulateFromuiRGBOnly(), nlassert, NLMISC::CVector::normalize(), NL3D::CLightContribution::PointLight, NLMISC::CRGBA::R, NL3D::CLightContribution::SunContribution, and uint.

Referenced by traverseRender().

01296 {
01297         CRenderTrav                     &renderTrav= getOwnerScene()->getRenderTrav();
01298         IDriver                         *drv= renderTrav.getDriver();
01299         CScene                          *scene= getOwnerScene();
01300 
01301         // Transparent pass? quit
01302         if(!renderTrav.isCurrentPassOpaque())
01303                 return;
01304 
01305         // the lod manager. no op if not here
01306         CLodCharacterManager    *mngr= scene->getLodCharacterManager();
01307         if(!mngr)
01308                 return;
01309 
01310         // Get global lighting on the instance. Suppose SunAmbient only.
01311         //=================
01312         const CLightContribution        *lightContrib;
01313 
01314         // the std case is to take my model lightContribution
01315         if(_AncestorSkeletonModel==NULL)
01316                 lightContrib= &getSkeletonLightContribution();
01317         // but if skinned/sticked (directly or not) to a skeleton, take its.
01318         else
01319                 lightContrib= &_AncestorSkeletonModel->getSkeletonLightContribution();
01320 
01321         // compute his main light contribution result. Try first with sun
01322         CRGBA   mainAmbient= scene->getSunAmbient();
01323         CRGBA   mainDiffuse= scene->getSunDiffuse();
01324         // modulate sun contribution
01325         mainDiffuse.modulateFromuiRGBOnly(mainDiffuse, lightContrib->SunContribution );
01326         CVector mainLightDir= scene->getSunDirection();
01327 
01328 
01329         /* During night, and in the buildings, it may be better to use one of the other Points lights
01330                 Test only with the first pointLight, for faster compute, even if It may fail in some cases.
01331         */
01332         CPointLight     *mainPL= lightContrib->PointLight[0];
01333         if(mainPL)
01334         {
01335                 CRGBA   plDiffuse;
01336                 // get the diffuse of the pointLight, attenuated from distance and importance.
01337                 plDiffuse.modulateFromuiRGBOnly(mainPL->getDiffuse(), lightContrib->AttFactor[0]);
01338                 // compare the 2 diffuse
01339                 uint    d0= mainDiffuse.R + mainDiffuse.G + mainDiffuse.B;
01340                 uint    d1= plDiffuse.R + plDiffuse.G + plDiffuse.B;
01341                 // if the pointLight is lighter, take it.
01342                 if(d1>d0)
01343                 {
01344                         // leave ambient, but take diffuse and pointLight fake Direction
01345                         mainDiffuse= plDiffuse;
01346                         mainLightDir= getWorldMatrix().getPos() - mainPL->getPosition();
01347                         mainLightDir.normalize();
01348                 }
01349         }
01350 
01351 
01352         // compute colors of the lods.
01353         //=================
01354         // NB: even if texturing is sufficient, still important for AlphaTest.
01355 
01356         // If must recompute alpha because of change of skin added/deleted
01357         if(_CLodVertexAlphaDirty)
01358         {
01359                 // recompute vertex alpha
01360                 computeCLodVertexAlpha(mngr);
01361                 // set _CLodVertexAlphaDirty to false.
01362                 _CLodVertexAlphaDirty= false;
01363         }
01364 
01365         // render the Lod in the LodManager.
01366         //=================
01367         // render must have been intialized
01368         nlassert(mngr->isRendering());
01369 
01370 
01371         // add the instance to the manager. 
01372         if(!mngr->addRenderCharacterKey(_CLodInstance, getWorldMatrix(), 
01373                 mainAmbient, mainDiffuse, mainLightDir) )
01374         {
01375                 // If failed to add it because no more vertex space in the manager, retry.
01376 
01377                 // close vertexBlock, compile render
01378                 mngr->endRender();
01379                 // and restart.
01380                 mngr->beginRender(drv, renderTrav.CamPos);
01381 
01382                 // retry. but no-op if refail.
01383                 mngr->addRenderCharacterKey(_CLodInstance, getWorldMatrix(), 
01384                         mainAmbient, mainDiffuse, mainLightDir);
01385         }
01386 }

void NL3D::CSkeletonModel::renderIntoSkeletonShadowMap CSkeletonModel rootSkeleton,
CMaterial castMat
[virtual]
 

Special For Skeleton Caster. Render into the AuxDriver the mesh, within the current setuped Frustum/ViewMatrix. no-op by default, or if hidden in HRC!!

Parameters:
rootSkeleton the skeleton which is currently rendering its shadowMap

Reimplemented from NL3D::CTransform.

Definition at line 2062 of file skeleton_model.cpp.

References _StickedObjects, NL3D::CRenderTrav::getAuxDriver(), NL3D::CTransform::getOwnerScene(), NLMISC::CMatrix::getPos(), NL3D::ITransformable::getPos(), NL3D::CScene::getRenderTrav(), NL3D::CTransform::getWorldMatrix(), NL3D::CTransform::isHrcVisible(), ItTransformSet, NL3D::CTransform::renderIntoSkeletonShadowMap(), renderShadowSkins(), NLMISC::CMatrix::setPos(), NLMISC::CMatrix::setRot(), and NL3D::IDriver::setupModelMatrix().

Referenced by generateShadowMap().

02063 {
02064         // If even not visible, no-op
02065         if(!isHrcVisible() || !Shape)
02066                 return;
02067 
02068         // render into aux Driver
02069         IDriver                 *driver= getOwnerScene()->getRenderTrav().getAuxDriver();
02070 
02071         // **** Render the Skeleton Skins
02072         // The model Matrix is special here. It must be the Skeleton World Matrix, minus The Root Skeleton pos.
02073         CMatrix         localPosMatrix;
02074         localPosMatrix.setRot( getWorldMatrix() );
02075         // NB: if this==rootSkeleton, then the final pos will be CVector::Null
02076         localPosMatrix.setPos( getWorldMatrix().getPos() - rootSkeleton->getWorldMatrix().getPos() );
02077         driver->setupModelMatrix(localPosMatrix);
02078 
02079         // render the skins.
02080         renderShadowSkins(castMat);
02081 
02082         // **** Render The Sticked Objects.
02083         ItTransformSet  it;
02084         for(it= _StickedObjects.begin();it!=_StickedObjects.end();it++)
02085         {
02086                 CTransform      *stickModel= *it;
02087                 stickModel->renderIntoSkeletonShadowMap(rootSkeleton, castMat);
02088         }
02089 }

virtual sint NL3D::CTransform::renderShadowSkinGeom uint  remainingVertices,
uint8 vbDest
[inline, protected, virtual, inherited]
 

Deriver must change this method if isSkinnable(). It return a list of sphere relative to each bone of the father skeleton. Use with getSkinBoneUsage() to know to wich bone this sphere apply NB: if a sphere radius is -1, it means that the bone is not used (for any reason...) default is to return NULL.

Reimplemented in NL3D::CMeshMRMInstance, and NL3D::CMeshMRMSkinnedInstance.

Definition at line 612 of file transform.h.

References sint, uint, and uint8.

00612 {return 0;}

virtual void NL3D::CTransform::renderShadowSkinPrimitives CMaterial castMat,
IDriver drv,
uint  baseVertex
[inline, protected, virtual, inherited]
 

Deriver must change this method if isSkinnable(). It return a list of sphere relative to each bone of the father skeleton. Use with getSkinBoneUsage() to know to wich bone this sphere apply NB: if a sphere radius is -1, it means that the bone is not used (for any reason...) default is to return NULL.

Reimplemented in NL3D::CMeshMRMInstance, and NL3D::CMeshMRMSkinnedInstance.

Definition at line 613 of file transform.h.

References uint.

00613 {}

void NL3D::CSkeletonModel::renderShadowSkins CMaterial castMat  )  [private]
 

Definition at line 1885 of file skeleton_model.cpp.

References _OpaqueSkins, _TransparentSkins, NL3D::CVertexStreamManager::activate(), NL3D::CRenderTrav::getAuxDriver(), NL3D::CVertexStreamManager::getMaxVertices(), NL3D::CTransform::getOwnerScene(), NL3D::CScene::getRenderTrav(), NL3D::CRenderTrav::getShadowMeshSkinManager(), NL3D::CVertexStreamManager::getVertexSize(), H_AUTO, NL3D::CVertexStreamManager::lock(), sint, NLMISC::CObjectVector< T, EnableObjectBehavior >::size(), NL3D::CVertexStreamManager::swapVBHard(), uint, uint8, and NL3D::CVertexStreamManager::unlock().

Referenced by renderIntoSkeletonShadowMap().

01886 {
01887         H_AUTO( NL3D_Skin_RenderShadow );
01888 
01889         CRenderTrav                     &rdrTrav= getOwnerScene()->getRenderTrav();
01890         // Render Shadow in auxiliary driver.
01891         IDriver                         *driver= rdrTrav.getAuxDriver();
01892 
01893         // if the SkinManager is not possible at all, just rendered the std way
01894         if( !rdrTrav.getShadowMeshSkinManager() )
01895         {
01896                 // can occurs?????
01897                 // ABORT!! ...  avoid Mesh Shadowing (free shadowMap)? Replace with a dummy Shadow?
01898                 // For now, no-op... 
01899         }
01900         else
01901         {
01902                 uint    i;
01903 
01904                 // get the meshSkinManager
01905                 CVertexStreamManager    &meshSkinManager= *rdrTrav.getShadowMeshSkinManager();
01906 
01907                 // array (rarely allocated) of skins with grouping support
01908                 static  std::vector<CTransform*>        skinsToGroup;
01909                 static  std::vector<uint>                       baseVertices;
01910                 skinsToGroup.clear();
01911                 baseVertices.clear();
01912 
01913                 // get the maxVertices the manager support
01914                 uint    maxVertices= meshSkinManager.getMaxVertices();
01915                 uint    vertexSize= meshSkinManager.getVertexSize();
01916 
01917                 // fill array of skins to group (suppose all support else won't be rendered)
01918                 for(i=0;i<_OpaqueSkins.size();i++)
01919                 {
01920                         if(_OpaqueSkins[i]->supportShadowSkinGrouping())
01921                                 skinsToGroup.push_back(_OpaqueSkins[i]);
01922                 }
01923                 for(i=0;i<_TransparentSkins.size();i++)
01924                 {
01925                         if(_TransparentSkins[i]->supportShadowSkinGrouping())
01926                                 skinsToGroup.push_back(_TransparentSkins[i]);
01927                 }
01928 
01929                 // For each skin, have an index which gives the decal of the vertices in the buffer
01930                 baseVertices.resize(skinsToGroup.size());
01931 
01932                 // while there is skin to render in group
01933                 uint    skinId= 0;
01934                 while(skinId<skinsToGroup.size())
01935                 {
01936                         // space left in the manager
01937                         uint    remainingVertices= maxVertices;
01938                         uint    currentBaseVertex= 0;
01939 
01940                         // First pass, fill The VB.
01941                         //------------
01942                         // lock buffer
01943                         uint8   *vbDest= meshSkinManager.lock();
01944 
01945                         // For all skins until the buffer is full
01946                         uint    startSkinId= skinId;
01947                         while(skinId<skinsToGroup.size())
01948                         {
01949                                 // if success to fill the AGP
01950                                 sint    numVerticesAdded= skinsToGroup[skinId]->renderShadowSkinGeom(remainingVertices, 
01951                                         vbDest + vertexSize*currentBaseVertex );
01952                                 // -1 means that this skin can't render because no space left for her. Then stop for this block
01953                                 if(numVerticesAdded==-1)
01954                                         break;
01955                                 // Else ok, get the currentBaseVertex for this skin
01956                                 baseVertices[skinId]= currentBaseVertex;
01957                                 // and jump to the next place
01958                                 currentBaseVertex+= numVerticesAdded;
01959                                 remainingVertices-= numVerticesAdded;
01960 
01961                                 // go to the next skin
01962                                 skinId++;
01963                         }
01964 
01965                         // release buffer. ATI: release only vertices used.
01966                         meshSkinManager.unlock(currentBaseVertex);
01967 
01968                         // Second pass, render the primitives.
01969                         //------------
01970                         meshSkinManager.activate();
01971 
01972                         // Render any primitives
01973                         for(uint i=startSkinId;i<skinId;i++)
01974                         {
01975                                 // render the skin in the current buffer
01976                                 skinsToGroup[i]->renderShadowSkinPrimitives(castMat, driver, baseVertices[i]);
01977                         }
01978 
01979                         // End of this block, swap to the next buffer
01980                         meshSkinManager.swapVBHard();
01981                 }
01982         }
01983 }

virtual void NL3D::CTransform::renderSkin float  alphaMRM  )  [inline, protected, virtual, inherited]
 

Deriver must change this method if isSkinnable(). It renders the skin with current ctx of the skeletonModel SkeletonModel has already setuped the Light and the modelMatrix in the driver. If the skin is a MRM, it is the skeleton which drives the MRM level with alphaMRM: [0,1] default is nop

Reimplemented in NL3D::CMeshInstance, NL3D::CMeshMRMInstance, and NL3D::CMeshMRMSkinnedInstance.

Definition at line 590 of file transform.h.

00590 {}

virtual sint NL3D::CTransform::renderSkinGroupGeom float  alphaMRM,
uint  remainingVertices,
uint8 dest
[inline, protected, virtual, inherited]
 

if supportSkinGrouping(), called to transform the VBuffer, and store it into dest.

Returns:
number of vertices added to the VBuffer, or -1 if > reaminingVertices

Reimplemented in NL3D::CMeshMRMInstance, and NL3D::CMeshMRMSkinnedInstance.

Definition at line 601 of file transform.h.

References sint, uint, and uint8.

00601 {return 0;}

virtual void NL3D::CTransform::renderSkinGroupPrimitives uint  baseVertex,
std::vector< CSkinSpecularRdrPass > &  specularRdrPasses,
uint  skinIndex
[inline, protected, virtual, inherited]
 

if supportSkinGrouping(), called to render the primitives of the already skinned vertices (VB activated in the driver) Optionnaly, fill specRdrPasses with specular rdrPass to sort (used for specular grouping).

Parameters:
baseVertex value to add to each PBlock index.

Reimplemented in NL3D::CMeshMRMInstance, and NL3D::CMeshMRMSkinnedInstance.

Definition at line 606 of file transform.h.

References uint.

00606 {}

virtual void NL3D::CTransform::renderSkinGroupSpecularRdrPass uint  rdrPass  )  [inline, protected, virtual, inherited]
 

Render a specific specular renderPass returned by renderSkinGroupPrimitives.

Reimplemented in NL3D::CMeshMRMInstance, and NL3D::CMeshMRMSkinnedInstance.

Definition at line 608 of file transform.h.

References uint.

00608 {}

void NL3D::CSkeletonModel::renderSkinList NLMISC::CObjectVector< CTransform *, false > &  skinList,
float  alphaMRM
[private]
 

render a list of skin, no lighting setup etc..., but use where possible a CVertexStreamManager

Definition at line 1449 of file skeleton_model.cpp.

References NL3D::CVertexStreamManager::activate(), NL3D::IDriver::endSpecularBatch(), NL3D::CRenderTrav::getDriver(), NL3D::CVertexStreamManager::getMaxVertices(), NL3D::CRenderTrav::getMeshSkinManager(), NL3D::CTransform::getOwnerScene(), NL3D::CScene::getRenderTrav(), NL3D::CVertexStreamManager::getVertexSize(), H_AUTO, NL3D::CVertexStreamManager::lock(), NL3D::CSkinSpecularRdrPass::RdrPassIndex, sint, NLMISC::CObjectVector< T, EnableObjectBehavior >::size(), NL3D::CSkinSpecularRdrPass::SkinIndex, NL3D::IDriver::startSpecularBatch(), NL3D::CVertexStreamManager::swapVBHard(), uint, uint8, and NL3D::CVertexStreamManager::unlock().

Referenced by renderSkins().

01450 {
01451         CRenderTrav                     &rdrTrav= getOwnerScene()->getRenderTrav();
01452 
01453         // if the SkinManager is not possible at all, just rendered the std way.
01454         if( !rdrTrav.getMeshSkinManager() )
01455         {
01456                 for(uint i=0;i<skinList.size();i++)
01457                 {
01458                         skinList[i]->renderSkin(alphaMRM);
01459                 }
01460         }
01461         else
01462         {
01463                 // get the meshSkinManager
01464                 CVertexStreamManager    &meshSkinManager= *rdrTrav.getMeshSkinManager();
01465 
01466                 // array (rarely allocated) of skins with grouping support
01467                 static  std::vector<CTransform*>        skinsToGroup;
01468                 static  std::vector<uint>                       baseVertices;
01469                 skinsToGroup.clear();
01470                 baseVertices.clear();
01471 
01472                 // get the maxVertices the manager support
01473                 uint    maxVertices= meshSkinManager.getMaxVertices();
01474                 uint    vertexSize= meshSkinManager.getVertexSize();
01475 
01476                 // render any skins which do not support SkinGrouping, and fill array of skins to group
01477                 for(uint i=0;i<skinList.size();i++)
01478                 {
01479                         // If don't support, or if too big to fit in the manager, just renderSkin()
01480                         if(!skinList[i]->supportSkinGrouping())
01481                         {
01482                                 H_AUTO( NL3D_Skin_NotGrouped );
01483                                 skinList[i]->renderSkin(alphaMRM);
01484                         }
01485                         else
01486                         {
01487                                 skinsToGroup.push_back(skinList[i]);
01488                         }
01489                 }
01490 
01491                 H_AUTO( NL3D_Skin_Grouped );
01492                 
01493                 // For each skin, have an index which gives the decal of the vertices in the buffer
01494                 baseVertices.resize(skinsToGroup.size());
01495 
01496                 // while there is skin to render in group
01497                 uint    skinId= 0;
01498                 while(skinId<skinsToGroup.size())
01499                 {
01500                         // space left in the manager
01501                         uint    remainingVertices= maxVertices;
01502                         uint    currentBaseVertex= 0;
01503 
01504 
01505                         // First pass, fill The VB.
01506                         //------------
01507                         // lock buffer
01508                         uint8   *vbDest= meshSkinManager.lock();
01509                         
01510                         // For all skins until the buffer is full
01511                         uint    startSkinId= skinId;
01512                         while(skinId<skinsToGroup.size())
01513                         {
01514                                 // if success to fill the AGP
01515                                 sint    numVerticesAdded= skinsToGroup[skinId]->renderSkinGroupGeom(alphaMRM, remainingVertices, 
01516                                         vbDest + vertexSize*currentBaseVertex );
01517                                 // -1 means that this skin can't render because no space left for her. Then stop for this block
01518                                 if(numVerticesAdded==-1)
01519                                         break;
01520                                 // Else ok, get the currentBaseVertex for this skin
01521                                 baseVertices[skinId]= currentBaseVertex;
01522                                 // and jump to the next place
01523                                 currentBaseVertex+= numVerticesAdded;
01524                                 remainingVertices-= numVerticesAdded;
01525 
01526                                 // go to the next skin
01527                                 skinId++;
01528                         }
01529 
01530                         // release buffer. ATI: release only vertices used.
01531                         meshSkinManager.unlock(currentBaseVertex);
01532                         
01533                         // Second pass, render the primitives.
01534                         //------------
01535                         meshSkinManager.activate();
01536                         
01537                         /* Render any primitives that are not specular. Group specular ones into specularRdrPasses.
01538                                 NB: this speed a lot (specular setup is heavy)!
01539                         */
01540                         static std::vector<CSkinSpecularRdrPass>        specularRdrPasses;
01541                         specularRdrPasses.clear();
01542                         for(uint i=startSkinId;i<skinId;i++)
01543                         {
01544                                 // render the skin in the current buffer
01545                                 skinsToGroup[i]->renderSkinGroupPrimitives(baseVertices[i], specularRdrPasses, i);
01546                         }
01547 
01548                         // If any skin Specular rdrPass to render
01549                         if(!specularRdrPasses.empty())
01550                         {
01551                                 // Sort by Specular Map. HTimerInfo: take 0.0% time
01552                                 sort(specularRdrPasses.begin(), specularRdrPasses.end());
01553                                 
01554                                 // Batch Specular! HTimerInfo: take 0.2%
01555                                 rdrTrav.getDriver()->startSpecularBatch();
01556                                 
01557                                 // Render all of them
01558                                 for(uint i=0;i<specularRdrPasses.size();i++)
01559                                 {
01560                                         CSkinSpecularRdrPass    &specRdrPass= specularRdrPasses[i];
01561                                         // render the associated skin in the current buffer
01562                                         skinsToGroup[specRdrPass.SkinIndex]->renderSkinGroupSpecularRdrPass(specRdrPass.RdrPassIndex);
01563                                 }
01564 
01565                                 // End Batch Specular! HTimerInfo: take 0.0%
01566                                 rdrTrav.getDriver()->endSpecularBatch();
01567                         }
01568 
01569 
01570                         // End of this block, swap to the next buffer. HTimerInfo: take 0.0%
01571                         meshSkinManager.swapVBHard();
01572                 }
01573         }
01574 }

void NL3D::CSkeletonModel::renderSkins  )  [private]
 

render the skins of the skeleton

  • update instance Lighting, and setup Driver lighting
    • activate skeleton Matrix
  • render all the skins (according if passOpaque or not)

Definition at line 1390 of file skeleton_model.cpp.

References NL3D::CTransform::_LightContribution, _OpaqueSkins, _TransparentSkins, NL3D::CTransformShape::changeLightSetup(), NL3D::IDriver::forceNormalize(), NL3D::CRenderTrav::getDriver(), NL3D::CMRMLevelDetail::getLevelDetailFromPolyCount(), NL3D::CTransformShape::getNumTrianglesAfterLoadBalancing(), NL3D::CTransform::getOwnerScene(), NL3D::CScene::getRenderTrav(), NL3D::CTransform::getWorldMatrix(), NL3D::CRenderTrav::isCurrentPassOpaque(), NL3D::IDriver::isForceNormalize(), nlassert, renderSkinList(), NL3D::CTransformShape::setupCurrentLightContribution(), and NL3D::IDriver::setupModelMatrix().

Referenced by traverseRender().

01391 {
01392         // Render skins according to the pass.
01393         CRenderTrav                     &rdrTrav= getOwnerScene()->getRenderTrav();
01394         // get a ptr on the driver
01395         IDriver                         *drv= rdrTrav.getDriver();
01396         nlassert(drv);
01397 
01398 
01399         // Compute the levelOfDetail
01400         float   alphaMRM= _LevelDetail.getLevelDetailFromPolyCount(getNumTrianglesAfterLoadBalancing());
01401 
01402         // force normalisation of normals..
01403         bool    bkupNorm= drv->isForceNormalize();
01404         drv->forceNormalize(true);                      
01405 
01406 
01407         // rdr good pass
01408         if(rdrTrav.isCurrentPassOpaque())
01409         {
01410                 // Compute in Pass Opaque only the light contribution. 
01411                 // Easier for skeleton: suppose lightable, no local attenuation
01412 
01413                 // the std case is to take my model lightContribution
01414                 if(_AncestorSkeletonModel==NULL)
01415                         setupCurrentLightContribution(&_LightContribution, false);
01416                 // but if sticked (directly or not) to a skeleton, take its.
01417                 else
01418                         setupCurrentLightContribution(&_AncestorSkeletonModel->_LightContribution, false);
01419 
01420 
01421                 // Activate Driver setup: light and modelMatrix
01422                 changeLightSetup( &rdrTrav );
01423                 rdrTrav.getDriver()->setupModelMatrix(getWorldMatrix());
01424 
01425 
01426                 // Render all totaly opaque skins.
01427                 renderSkinList(_OpaqueSkins, alphaMRM);
01428         }
01429         else
01430         {
01431                 // NB: must have some transparent skins, since thee skeletonModel is traversed in the transparent pass.
01432 
01433                 // Activate Driver setup: light and modelMatrix
01434                 changeLightSetup( &rdrTrav );
01435                 rdrTrav.getDriver()->setupModelMatrix(getWorldMatrix());
01436 
01437 
01438                 // render all opaque/transparent skins
01439                 renderSkinList(_TransparentSkins, alphaMRM);
01440         }
01441 
01442 
01443         // bkup force normalisation.
01444         drv->forceNormalize(bkupNorm);
01445 }

void NL3D::CSkeletonModel::resetDefaultMRMDistanceSetup  ) 
 

Reset the Default MRM setup: follow MAX skin setup (ie the finer).

Definition at line 1610 of file skeleton_model.cpp.

References _DefaultMRMSetup, and dirtSkinRenderLists().

01611 {
01612         _DefaultMRMSetup= true;
01613 
01614         // Must use Skins linked to know the MRM setup.
01615         dirtSkinRenderLists();
01616 }

void NL3D::CTransform::resetLighting  )  [inherited]
 

reset lights which influence this models. NB: the model is removed from all lights's list (except FrozenStaticLightSetup). Called by light rendering.

NB: the model is NOT removed from LightingManager (with eraseStaticLightedModel()).

Definition at line 988 of file transform.cpp.

References NL3D::CTransform::_LightContribution, NL3D::CLightContribution::FrozenStaticLightSetup, NL3D::CTransform::IsNeedUpdateLighting, NL3D::CTransform::isNeedUpdateLighting(), NL3D_MAX_LIGHT_CONTRIBUTION, NL3D::CLightContribution::NumFrozenStaticLight, NL3D::CLightContribution::PointLight, NL3D::CPointLight::removeLightedModel(), NL3D::CTransform::setStateFlag(), NL3D::CLightContribution::TransformIterator, and uint.

Referenced by NL3D::CLightingManager::addDynamicLight(), NL3D::CTransform::freezeStaticLightSetup(), NL3D::CPointLight::resetLightedModels(), NL3D::CTransform::unfreezeStaticLightSetup(), NL3D::CTransform::updateWorld(), and NL3D::CTransform::~CTransform().

00989 {
00990         // if the model is already isNeedUpdateLighting, his light setup is reseted.
00991         // so no need to reset again
00992         if(isNeedUpdateLighting())
00993                 return;
00994 
00995 
00996         // For all light not in FrozenStaticLightSetup, remove me from their list
00997         uint    startLight= 0;
00998         if(_LightContribution.FrozenStaticLightSetup)
00999         {
01000                 startLight= _LightContribution.NumFrozenStaticLight;
01001         }
01002 
01003         // for all light in the list, remove me from their list.
01004         for(uint i=startLight; i<NL3D_MAX_LIGHT_CONTRIBUTION; i++)
01005         {
01006                 CPointLight             *pl= _LightContribution.PointLight[i];
01007                 // if end of list, break.
01008                 if(!pl)
01009                         break;
01010                 else
01011                 {
01012                         // remove me from this light.
01013                         pl->removeLightedModel(_LightContribution.TransformIterator[i]);
01014                 }
01015         }
01016         // empty the list.
01017         if(startLight<NL3D_MAX_LIGHT_CONTRIBUTION)
01018                 _LightContribution.PointLight[startLight]= NULL;
01019 
01020 
01021         // the model needs to update his lighting.
01022         setStateFlag(IsNeedUpdateLighting, true);
01023         
01024 }

void NL3D::IAnimatable::resize uint  count  )  [inline, inherited]
 

Change value count, bit are set to 0

Parameters:
count is the new value count.

Definition at line 195 of file animatable.h.

References count, nlassert, and uint.

00196         {
00197                 // with the "uint32 _BitSet" implementation, juste check the size is correct
00198                 nlassert(count<=32);
00199         }

void NL3D::CTransform::setApplySkin bool  state  )  [protected, virtual, inherited]
 

Deriver must change this method if isSkinnable(). called by CSkeletonModel::bindSkin() NB: _FatherSkeletonModel is valid when setApplySkin() is called The default behavior must be called: it sets the flag so isSkinned() return the good thing

Reimplemented in NL3D::CMeshInstance, NL3D::CMeshMRMInstance, and NL3D::CMeshMRMSkinnedInstance.

Definition at line 584 of file transform.cpp.

References NL3D::CTransform::IsSkinned, and NL3D::CTransform::setStateFlag().

Referenced by bindSkin(), and detachSkeletonSon().

00585 {
00586         setStateFlag(IsSkinned, state);
00587 }

void NL3D::CSkeletonModel::setBoneAnimCtrl uint  boneId,
IAnimCtrl ctrl
 

Set a special ctrl on a bone. see IAnimCtrl. NB: once an animCtrl is set to a bone in a skeleton, his bones are always computed each frame. set to NULL if you want to reset this bone AnimCtrl.

Definition at line 1745 of file skeleton_model.cpp.

References NL3D::CBone::_AnimCtrl, _AnimCtrlUsage, Bones, and uint.

Referenced by NL3D::CSkeletonUser::setBoneAnimCtrl().

01746 {
01747         if(boneId>=Bones.size())
01748                 return;
01749 
01750         CBone   &bone= Bones[boneId];
01751 
01752         // Update refCount
01753         if(ctrl && !bone._AnimCtrl)
01754                 _AnimCtrlUsage++;
01755         else if(!ctrl && bone._AnimCtrl)
01756                 _AnimCtrlUsage--;
01757 
01758         // set
01759         bone._AnimCtrl= ctrl;
01760 }

void NL3D::CTransform::setChannelMixerOwnerShip bool  enable = true  )  [inline, inherited]
 

This force gives this object ownership of the channel mixer it is registered to, so it will delete it when the dtor is called. It should be called AFTER this object has been registered to a channel mixer, because a new registration will broke the ownership. This is useful for automatic animations, when there's no owner of the channel mixer that could delete it.

Definition at line 256 of file transform.h.

References NL3D::CTransform::IsDeleteChannelMixer, and NL3D::CTransform::setStateFlag().

Referenced by NL3D::CScene::createInstance(), and NL3D::CTransform::registerToChannelMixer().

00256 { setStateFlag(IsDeleteChannelMixer, enable); }

void NL3D::CTransform::setClusterSystem CInstanceGroup pCS  )  [inline, inherited]
 

Definition at line 912 of file transform.h.

References NL3D::CTransform::_ClusterSystem, NL3D::CTransform::ForceClipRoot, NL3D::CTransform::getStateFlag(), and nlassert.

Referenced by NL3D::CScene::findCameraClusterSystemFromRay(), and NL3D::CTransform::setForceClipRoot().

00913 {
00914         if (pCS != NULL)
00915         {
00916                 nlassert(!getStateFlag(ForceClipRoot)); // the transform must be linked to the root, and have not cluster system when this flag is set
00917         }
00918         _ClusterSystem = pCS;
00919 }

void NL3D::CSkeletonModel::setDisplayLodCharacterFlag bool  displayCLod  ) 
 

Called in ClipTrav pass. setup the flag.

Definition at line 1014 of file skeleton_model.cpp.

References _BoneToComputeDirty, _CLodInstance, _DisplayedAsLodCharacter, _LodCharacterDistance, and NL3D::CLodCharacterInstance::ShapeId.

Referenced by NL3D::CClipTrav::loadBalanceSkeletonCLod(), and traverseAnimDetail().

01015 {
01016         // if enabled
01017         if(_LodCharacterDistance>0 && _CLodInstance.ShapeId>=0)
01018         {
01019                 // If the flag has changed since last frame, must recompute bone Usage.
01020                 if(_DisplayedAsLodCharacter != displayCLod)
01021                         _BoneToComputeDirty= true;
01022 
01023                 // set new state
01024                 _DisplayedAsLodCharacter= displayCLod;
01025         }
01026 }

void NL3D::CTransformShape::setDistMax float  distMax  )  [inline, inherited]
 

Definition at line 137 of file transform_shape.h.

Referenced by NL3D::CScene::createInstance(), and NL3D::CInstanceUser::setDistMax().

00137 { _DistMax = distMax; }

void NL3D::CTransform::setDontUnfreezeChildren bool  val  )  [inherited]
 

Definition at line 378 of file transform.cpp.

References NL3D::CTransform::_DontUnfreezeChildren.

Referenced by NL3D::CInstanceGroup::createRoot().

00379 {
00380         _DontUnfreezeChildren = val;
00381 }

void NL3D::IAnimatable::setFather IAnimatable father,
uint  fatherOwnerBit
[inline, inherited]
 

Say which (if any) IAnimatable owns this one. This is important for Touch propagation. By this system, Fathers and ancestors know if they must check their sons (isTouched() return true).

Parameters:
father the father we must inform of our update.
fatherOwnerBit What bit of father we must set when we are updated

Definition at line 153 of file animatable.h.

References NL3D::IAnimatable::_Father, NL3D::IAnimatable::_FatherOwnerBit, NL3D::IAnimatable::propagateTouch(), and uint.

Referenced by NL3D::CMeshBase::instanciateMeshBase(), and NL3D::CSegRemanence::setAnimatedMaterial().

00154         {
00155                 _Father= father; _FatherOwnerBit= fatherOwnerBit;
00156 
00157                 // propagate the touch to the fathers.
00158                 propagateTouch();
00159         }

void NL3D::IAnimatable::setFlag uint  valueId  )  [inline, protected, inherited]
 

This method set a bit in the bitset.

Definition at line 239 of file animatable.h.

References NL3D::IAnimatable::_BitSet, and uint.

Referenced by NL3D::IAnimatable::propagateTouch(), and NL3D::IAnimatable::touch().

00240         {
00241                 _BitSet|= (1<<valueId);
00242         }

void NL3D::CTransform::setForceClipRoot bool  forceClipRoot  )  [inherited]
 

Force the transform to always be attached to the root As a consequence, it can't be inserted into a cluster system (even the root cluster) and is thus always visible when in the frustum (not clusterized) NB : any call to setClusterSystem will cause an assertion when the flag is set NB : any call to hrcUnlink will cause an assertion when the flag is set (must remain linked to the root)

Definition at line 1380 of file transform.cpp.

References NL3D::CTransform::_OwnerScene, NL3D::CTransform::ForceClipRoot, NL3D::CScene::getRoot(), NL3D::CTransform::getStateFlag(), NL3D::CTransform::hrcLinkSon(), NL3D::CTransform::hrcUnlink(), NL3D::CTransform::setClusterSystem(), and NL3D::CTransform::setStateFlag().

Referenced by NL3D::CTransformUser::setForceClipRoot().

01381 {
01382         if (forceClipRoot == (getStateFlag(ForceClipRoot) != 0)) return;
01383         if (forceClipRoot)
01384         {
01385                 // unlink from previous father and link to the root
01386                 hrcUnlink();
01387                 if (_OwnerScene)
01388                 {
01389                         _OwnerScene->getRoot()->hrcLinkSon(this);
01390                 }
01391                 setClusterSystem(NULL);
01392         }
01393         setStateFlag(ForceClipRoot, forceClipRoot);
01394 }

void NL3D::CTransform::setGeneratingShadowMap bool  state  )  [inline, inherited]
 

For ShadowMapManager. true if the model is rendering its ShadowMap this frame.

Definition at line 514 of file transform.h.

References NL3D::CTransform::canCastShadowMap(), NL3D::CTransform::IsGeneratingShadowMap, and NL3D::CTransform::setStateFlag().

Referenced by NL3D::CShadowMapManager::addShadowCasterGenerate().

00514 {if(canCastShadowMap()) setStateFlag(IsGeneratingShadowMap, state);}

void NL3D::CSkeletonModel::setInterpolationDistance float  dist  ) 
 

change the Lod Bone interpolation distance (in meters). If 0, interpolation is disabled. The smaller this value is, the more Lod skeleton system will "pop". Default is 0.5 meters.

Definition at line 637 of file skeleton_model.cpp.

References _LodInterpMultiplier.

Referenced by NL3D::CSkeletonUser::setInterpolationDistance().

00638 {
00639         dist= std::max(0.f, dist);
00640         // disable interpolation?
00641         if(dist==0)
00642                 _LodInterpMultiplier= 0.f;
00643         else
00644                 _LodInterpMultiplier= 1.f / dist;
00645 }

void NL3D::CTransform::setIsBigLightable bool  val  )  [protected, inherited]
 

Deriver must use this method with true to indicate the model is a big lightable.

Definition at line 574 of file transform.cpp.

References NL3D::CTransform::IsBigLightable, and NL3D::CTransform::setStateFlag().

Referenced by NL3D::CMeshBase::instanciateMeshBase().

00575 {
00576         setStateFlag(IsBigLightable, val);
00577 }

void NL3D::CTransform::setIsCluster bool  val  )  [inline, protected, inherited]
 

For CCluster only.

Definition at line 671 of file transform.h.

References NL3D::CTransform::IsCluster, and NL3D::CTransform::setStateFlag().

00671 {setStateFlag(IsCluster, val);}

void NL3D::CTransform::setIsForceAnimDetail bool  val  )  [protected, inherited]
 

Deriver must use this method with true if the model must be AnimDetail-ed whatever registerToChannelMixer() has been called or not

Definition at line 590 of file transform.cpp.

References NL3D::CTransform::_FatherSkeletonModel, dirtSkinRenderLists(), NL3D::CTransform::getStateFlag(), NL3D::CTransform::IsAnimDetailable, NL3D::CTransform::IsForceAnimDetail, NL3D::CTransform::isSkinned(), nlassert, and NL3D::CTransform::setStateFlag().

00591 {
00592         setStateFlag(IsForceAnimDetail, val );
00593 
00594         // Update flag, if we must be inserted in AnimDetail
00595         setStateFlag(IsAnimDetailable, _ChannelMixer || getStateFlag(IsForceAnimDetail) );
00596 
00597         // If skinned, then must inform skeleton parent that it must recompute skin render/animDetail lists
00598         if(isSkinned())
00599         {
00600                 nlassert(_FatherSkeletonModel);
00601                 _FatherSkeletonModel->dirtSkinRenderLists();
00602         }
00603 }

void NL3D::CTransform::setIsLightable bool  val  )  [protected, inherited]
 

Deriver must use this method with true to indicate the model support lighting.

Definition at line 552 of file transform.cpp.

References NL3D::CTransform::getStateFlag(), NL3D::CTransform::IsFinalLightable, NL3D::CTransform::IsLightable, NL3D::CTransform::IsUserLightable, and NL3D::CTransform::setStateFlag().

Referenced by NL3D::CMeshBase::instanciateMeshBase().

00553 {
00554         setStateFlag(IsLightable, val);
00555         // update IsFinalLightable
00556         setStateFlag(IsFinalLightable, (getStateFlag(IsLightable) && getStateFlag(IsUserLightable)) );
00557 }

void NL3D::CTransform::setIsLoadbalancable bool  val  )  [protected, inherited]
 

Deriver must use this method with true to indicate the model support loadBalancing.

Definition at line 605 of file transform.cpp.

References NL3D::CTransform::IsLoadBalancable, and NL3D::CTransform::setStateFlag().

00606 {
00607         setStateFlag(IsLoadBalancable, val );
00608 }

void NL3D::CTransform::setIsMeshBaseInstance bool  val  )  [inline, protected, inherited]
 

For CMeshBaseInstance only.

Definition at line 667 of file transform.h.

References NL3D::CTransform::IsMeshBaseInstance, and NL3D::CTransform::setStateFlag().

00667 {setStateFlag(IsMeshBaseInstance, val);}

void NL3D::CTransform::setIsRenderable bool  val  )  [protected, inherited]
 

Deriver must use this method with true to indicate the model can be rendered. "can be rendered" means if object has to be inserted in RenderTrav list. eg: a mesh must be inserted in a render list, but not a light, or a NULL transform. The default is false.

Definition at line 568 of file transform.cpp.

References NL3D::CTransform::IsRenderable, and NL3D::CTransform::setStateFlag().

00569 {
00570         setStateFlag(IsRenderable, val);
00571 }

void NL3D::CTransform::setIsShadowMapCaster bool  val  )  [inline, protected, inherited]
 

ShadowMap.

Definition at line 674 of file transform.h.

References NL3D::CTransform::IsShadowMapCaster, and NL3D::CTransform::setStateFlag().

00674 {setStateFlag(IsShadowMapCaster, val);}

void NL3D::CTransform::setIsShadowMapReceiver bool  val  )  [inline, protected, inherited]
 

Deriver must use this method with true to indicate the model is a big lightable.

Definition at line 675 of file transform.h.

References NL3D::CTransform::IsShadowMapReceiver, and NL3D::CTransform::setStateFlag().

00675 {setStateFlag(IsShadowMapReceiver, val);}

void NL3D::CTransform::setIsSkeleton bool  val  )  [protected, inherited]
 

For CSkeletonModel only.

Definition at line 579 of file transform.cpp.

References NL3D::CTransform::IsSkeleton, and NL3D::CTransform::setStateFlag().

00580 {
00581         setStateFlag(IsSkeleton, val);
00582 }

void NL3D::CTransform::setIsTransformShape bool  val  )  [inline, protected, inherited]
 

For CTransformShape only.

Definition at line 669 of file transform.h.

References NL3D::CTransform::IsTransformShape, and NL3D::CTransform::setStateFlag().

00669 {setStateFlag(IsTransformShape, val);}

void NL3D::CTransform::setLoadBalancingGroup const std::string &  group  )  [inherited]
 

Change the load Balancing group of a model. Every models are in a special LoadBalancingGroup. NB: the group is created if did not exist. NB: if models are skinned, it is their Skeleton which drive the group

By default, models lies in the "Default" group, but Skeletons for skinning and ParticlesSystems which are in "Skin" and "Fx" group respectively. The "Default" group is special because it is not balanced (ie models are only degraded from their distance to camera)

Definition at line 522 of file transform.cpp.

References NL3D::CTransform::_LoadBalancingGroup, NL3D::CScene::getLoadBalancingTrav(), NL3D::CLoadBalancingTrav::getOrCreateGroup(), and NL3D::CTransform::getOwnerScene().

Referenced by NL3D::CSkeletonShape::createInstance(), NL3D::CSegRemanenceShape::createInstance(), and NL3D::CParticleSystemShape::createInstance().

00523 {
00524         // Get the traversal.
00525         CLoadBalancingTrav      &trav= getOwnerScene()->getLoadBalancingTrav();
00526         // get the group from trav (create if needed), and set it.
00527         _LoadBalancingGroup= trav.getOrCreateGroup(group);
00528 }

void NL3D::CSkeletonModel::setLodCharacterAnimId uint  animId  ) 
 

Change/get the Character Lod anim setup.

Definition at line 953 of file skeleton_model.cpp.

References _CLodInstance, NL3D::CLodCharacterInstance::AnimId, and uint.

Referenced by NL3D::CSkeletonUser::setLodCharacterAnimId().

00954 {
00955         _CLodInstance.AnimId= animId;
00956 }

void NL3D::CSkeletonModel::setLodCharacterAnimTime TGlobalAnimationTime  time  ) 
 

Called in ClipTrav pass. Used to update the flag _DisplayedAsLodCharacter. return 0 if CLod not enabled. Else return a priority>0 computed from curDistance/LodCharacterDistance return 0 too if the skeleton is not visible or if his ancestorSkeletonModel is not visible. If priority is >1 then the skeleton must be displayed in CLod form

Definition at line 959 of file skeleton_model.cpp.

References _CLodInstance, NL3D::CLodCharacterInstance::AnimTime, and NL3D::TGlobalAnimationTime.

Referenced by NL3D::CSkeletonUser::setLodCharacterAnimTime().

00960 {
00961         _CLodInstance.AnimTime= time;
00962 }

void NL3D::CSkeletonModel::setLodCharacterDistance float  dist  ) 
 

This is the distance at which the skeleton use a CLodCharacterShape to display himself if 0, never display the skeleton as a CLodCharacterShape

Definition at line 827 of file skeleton_model.cpp.

References _LodCharacterDistance, and _OOLodCharacterDistance.

Referenced by NL3D::CSkeletonUser::setLodCharacterDistance().

00828 {
00829         _LodCharacterDistance= max(dist, 0.f);
00830         if(_LodCharacterDistance>0)
00831                 _OOLodCharacterDistance= 1.0f/_LodCharacterDistance;
00832         else
00833                 _OOLodCharacterDistance= 0;
00834 }

void NL3D::CSkeletonModel::setLodCharacterShape sint  shapeId  ) 
 

Change the Character Lod shape Id. set -1 if want to disable the feature (default).

Definition at line 837 of file skeleton_model.cpp.

References _CLodInstance, NL3D::CScene::getLodCharacterManager(), NL3D::CTransform::getOwnerScene(), NL3D::CLodCharacterManager::initInstance(), NL3D::CLodCharacterManager::releaseInstance(), NL3D::CLodCharacterInstance::ShapeId, and sint.

Referenced by NL3D::CSkeletonUser::setLodCharacterShape(), and ~CSkeletonModel().

00838 {
00839         // get a ptr on the scene which owns us, and so on the lodManager.
00840         CScene                                  *scene= getOwnerScene();
00841         CLodCharacterManager    *mngr= scene->getLodCharacterManager();
00842 
00843         // if mngr not setuped, noop (lod not possible).
00844         if(!mngr)
00845                 return;
00846 
00847         // If a shape was setup, free the instance
00848         if(_CLodInstance.ShapeId>=0)
00849         {
00850                 mngr->releaseInstance(_CLodInstance);
00851                 _CLodInstance.ShapeId= -1;
00852         }
00853 
00854         // assign
00855         _CLodInstance.ShapeId= shapeId;
00856 
00857         // if a real shape is setuped, alloc an instance
00858         if(_CLodInstance.ShapeId>=0)
00859         {
00860                 mngr->initInstance(_CLodInstance);
00861         }
00862 }

void NL3D::CSkeletonModel::setLodCharacterWrapMode bool  wrapMode  ) 
 

tells if the animation must loop or clamp.

Definition at line 965 of file skeleton_model.cpp.

References _CLodInstance, and NL3D::CLodCharacterInstance::WrapMode.

Referenced by NL3D::CSkeletonUser::setLodCharacterWrapMode().

00966 {
00967         _CLodInstance.WrapMode= wrapMode;
00968 }

void NL3D::CTransform::setLogicInfo ILogicInfo logicInfo  )  [inline, inherited]
 

Set the LogicInfo for this transfrom, eg to retrieve statc light information, see ILogicInfo. Ptr is kept in CTransfrom, so should call setLogicInfo(NULL) before to clean up.

Definition at line 389 of file transform.h.

References NL3D::CTransform::_LogicInfo.

Referenced by NL3D::CTransformUser::setLogicInfo().

00389 {_LogicInfo= logicInfo;}

void NL3D::ITransformable::setMatrix const CMatrix mat  )  [inline, inherited]
 

Work only in DirecTMatrix mode (nlassert).

Definition at line 174 of file transformable.h.

References NL3D::ITransformable::_LocalMatrixDate, NL3D::ITransformable::DirectMatrix, and nlassert.

Referenced by NL3D::ITransformable::lookAt(), and NL3D::CTransformableUser::setMatrix().

00175         {
00176                 nlassert(_Mode==DirectMatrix);
00177                 _LocalMatrix= mat;
00178                 // The matrix has changed.
00179                 _LocalMatrixDate++;
00180         }

void NL3D::CTransform::setMeanColor CRGBA  color  )  [inherited]
 

set the Mean color of the transform. The mean color can be used for many purpose, such as drawing objects if the textures are not loaded. It is used also for Lod Character. Default color is (255,255,255)

Definition at line 540 of file transform.cpp.

References NL3D::CTransform::_MeanColor.

00541 {
00542         // if the color is different from prec
00543         if(color!=_MeanColor)
00544         {
00545                 // change it.
00546                 _MeanColor= color;
00547         }
00548 }

void NL3D::CTransform::setOpacity bool  v  )  [inherited]
 

Definition at line 255 of file transform.cpp.

References NL3D::CTransform::_FatherSkeletonModel, dirtSkinRenderLists(), NL3D::CTransform::getStateFlag(), NL3D::CTransform::isSkinned(), nlassert, NL3D::CTransform::setStateFlag(), and v.

Referenced by NL3D::CFlareModel::CFlareModel(), NL3D::CParticleSystemModel::CParticleSystemModel(), CSkeletonModel(), NL3D::CVegetableBlendLayerModel::CVegetableBlendLayerModel(), NL3D::CWaterModel::CWaterModel(), NL3D::CMeshBase::instanciateMeshBase(), NL3D::CTransformUser::setOpacity(), NL3D::CMeshMultiLodInstance::traverseLoadBalancing(), NL3D::CSegRemanence::updateOpacityFromShape(), and NL3D::CParticleSystemModel::updateOpacityInfos().

00256 { 
00257         bool bTmp = getStateFlag(IsOpaque) == 0 ? false : true;
00258         if (bTmp != v)
00259         {
00260                 setStateFlag(IsOpaque, v);
00261                 if(isSkinned())
00262                 {
00263                         nlassert(_FatherSkeletonModel);
00264                         _FatherSkeletonModel->dirtSkinRenderLists();
00265                 }
00266         }
00267 }

void NL3D::CTransform::setOrderingLayer uint  layer  )  [inline, inherited]
 

Set the current layer for this transform. Typically, this is used to sort transparent objects. Isn't used with solid objects. For now : Layer 0 is for underwater Layer 1 is for water surfaces Layer 2 is for object above water

Definition at line 184 of file transform.h.

References NL3D::CTransform::_OrderingLayer, and uint.

Referenced by NL3D::CWaterModel::CWaterModel(), and NL3D::CTransformUser::setOrderingLayer().

00184 { _OrderingLayer = layer; }

void NL3D::ITransformable::setPivot float  x,
float  y,
float  z
[inline, inherited]
 

Work only in Rot* mode (nlassert).

Definition at line 169 of file transformable.h.

References NL3D::ITransformable::setPivot(), x, y, and z.

00170         {
00171                 setPivot(CVector(x, y, z));
00172         }

void NL3D::ITransformable::setPivot const CVector pivot  )  [inline, inherited]
 

Work only in Rot* mode (nlassert).

Definition at line 162 of file transformable.h.

References NL3D::ITransformable::_Pivot, nlassert, NL3D::ITransformable::PivotValue, NL3D::ITransformable::RotEuler, NL3D::ITransformable::RotQuat, NL3D::IAnimatable::touch(), and NL3D::CAnimatedValueBlendable< T >::Value.

Referenced by NL3D::ITransformable::lookAt(), NL3D::CTransformableUser::setPivot(), and NL3D::ITransformable::setPivot().

00163         {
00164                 nlassert(_Mode==RotEuler || _Mode==RotQuat);
00165                 _Pivot.Value= pivot;
00166                 touch(PivotValue, OwnerBit);
00167         }

void NL3D::ITransformable::setPos float  x,
float  y,
float  z
[inline, inherited]
 

Work only in Rot* mode(nlassert).

Definition at line 121 of file transformable.h.

References NL3D::ITransformable::setPos(), x, y, and z.

00122         {
00123                 setPos(CVector(x,y,z));
00124         }

void NL3D::ITransformable::setPos const CVector pos  )  [inline, inherited]
 

Work only in Rot* mode(nlassert).

Definition at line 114 of file transformable.h.

References nlassert, NL3D::ITransformable::PosValue, NL3D::ITransformable::RotEuler, NL3D::ITransformable::RotQuat, NL3D::IAnimatable::touch(), and NL3D::CAnimatedValueBlendable< T >::Value.

Referenced by NL3D::CCamera::build(), NL3D::ITransformable::lookAt(), NL3D::CTransformableUser::setPos(), NL3D::ITransformable::setPos(), NL3D::CInstanceGroup::setPos(), and NL3D::CPSLight::step().

00115         {
00116                 nlassert(_Mode==RotEuler || _Mode==RotQuat);
00117                 _Pos.Value= pos;
00118                 touch(PosValue, OwnerBit);
00119         }

void NL3D::ITransformable::setRotEuler float  rotX,
float  rotY,
float  rotZ
[inline, inherited]
 

Work only in RotEuler mode(nlassert).

Definition at line 133 of file transformable.h.

References NL3D::ITransformable::setRotEuler().

00134         {
00135                 setRotEuler(CVector(rotX, rotY, rotZ));
00136         }

void NL3D::ITransformable::setRotEuler const CVector rot  )  [inline, inherited]
 

Work only in RotEuler mode(nlassert).

Definition at line 126 of file transformable.h.

References NL3D::ITransformable::_RotEuler, nlassert, NL3D::ITransformable::RotEuler, NL3D::ITransformable::RotEulerValue, NL3D::IAnimatable::touch(), and NL3D::CAnimatedValueBlendable< T >::Value.

Referenced by NL3D::CTransformableUser::setRotEuler(), and NL3D::ITransformable::setRotEuler().

00127         {
00128                 nlassert(_Mode==RotEuler);
00129                 _RotEuler.Value= rot;
00130                 touch(RotEulerValue, OwnerBit);
00131         }

void NL3D::ITransformable::setRotQuat const CQuat quat  )  [inline, inherited]
 

Work only in RotQuat mode (nlassert).

Definition at line 138 of file transformable.h.

References NL3D::ITransformable::_RotQuat, nlassert, NL3D::ITransformable::RotQuat, NL3D::ITransformable::RotQuatValue, NL3D::IAnimatable::touch(), and NL3D::CAnimatedValueBlendable< T >::Value.

Referenced by NL3D::CTargetAnimCtrl::execute(), NL3D::ITransformable::lookAt(), NL3D::CTransformableUser::setRotQuat(), and NL3D::CInstanceGroup::setRotQuat().

00139         {
00140                 nlassert(_Mode==RotQuat);
00141                 _RotQuat.Value= quat;
00142                 touch(RotQuatValue, OwnerBit);
00143         }

void NL3D::ITransformable::setScale float  scale  )  [inline, inherited]
 

Work only in Rot* mode (nlassert).

Definition at line 157 of file transformable.h.

References NL3D::ITransformable::setScale().

00158         {
00159                 setScale(CVector(scale, scale, scale));
00160         }

void NL3D::ITransformable::setScale float  scaleX,
float  scaleY,
float  scaleZ
[inline, inherited]
 

Work only in Rot* mode (nlassert).

Definition at line 152 of file transformable.h.

References NL3D::ITransformable::setScale().

00153         {
00154                 setScale(CVector(scaleX, scaleY, scaleZ));
00155         }

void NL3D::ITransformable::setScale const CVector scale  )  [inline, inherited]
 

Work only in Rot* mode (nlassert).

Definition at line 145 of file transformable.h.

References nlassert, NL3D::ITransformable::RotEuler, NL3D::ITransformable::RotQuat, NL3D::ITransformable::ScaleValue, NL3D::IAnimatable::touch(), and NL3D::CAnimatedValueBlendable< T >::Value.

Referenced by NL3D::ITransformable::lookAt(), NL3D::CTransformableUser::setScale(), and NL3D::ITransformable::setScale().

00146         {
00147                 nlassert(_Mode==RotEuler || _Mode==RotQuat);
00148                 _Scale.Value= scale;
00149                 touch(ScaleValue, OwnerBit);
00150         }

void NL3D::ITransformable::setTransformMode TTransformMode  mode,
CMatrix::TRotOrder  ro = CMatrix::ZXY
[inline, inherited]
 

Change the transform mode. Components or matrix are not reseted.

Definition at line 100 of file transformable.h.

References NL3D::ITransformable::_RotOrder, NL3D::ITransformable::PosValue, and NL3D::IAnimatable::touch().

Referenced by NL3D::CCamera::build(), NL3D::CCamera::enableTargetAnimation(), NL3D::CPSMesh::newElement(), NL3D::CTransformableUser::setTransformMode(), and NL3D::CPSMesh::updatePos().

00101         {
00102                 _Mode= mode;
00103                 _RotOrder= ro;
00104                 // just for information.
00105                 touch(PosValue, OwnerBit);
00106         }

void NL3D::CTransform::setTransparency bool  v  )  [inherited]
 

Accessors for opacity/transparency

Definition at line 240 of file transform.cpp.

References NL3D::CTransform::_FatherSkeletonModel, dirtSkinRenderLists(), NL3D::CTransform::getStateFlag(), NL3D::CTransform::isSkinned(), nlassert, NL3D::CTransform::setStateFlag(), and v.

Referenced by NL3D::CFlareModel::CFlareModel(), NL3D::CParticleSystemModel::CParticleSystemModel(), CSkeletonModel(), NL3D::CVegetableBlendLayerModel::CVegetableBlendLayerModel(), NL3D::CWaterModel::CWaterModel(), NL3D::CMeshBase::instanciateMeshBase(), NL3D::CTransformUser::setTransparency(), NL3D::CMeshMultiLodInstance::traverseLoadBalancing(), NL3D::CSegRemanence::updateOpacityFromShape(), NL3D::CParticleSystemModel::updateOpacityInfos(), and updateSkinRenderLists().

00241 { 
00242         bool bTmp = getStateFlag(IsTransparent) == 0 ? false : true;
00243         if (bTmp != v)
00244         {
00245                 setStateFlag(IsTransparent, v);
00246                 if(isSkinned())
00247                 {
00248                         nlassert(_FatherSkeletonModel);
00249                         _FatherSkeletonModel->dirtSkinRenderLists();
00250                 }
00251         }
00252 }

void NL3D::CTransformShape::setupCurrentLightContribution CLightContribution lightContrib,
bool  useLocalAtt
[protected, inherited]
 

For deriver who wants to setup their own current lightContribution setup (as skeleton). Must call changeLightSetup() so change are effectively made in driver

Definition at line 98 of file transform_shape.cpp.

References NL3D::CTransformShape::_CurrentLightContribution, and NL3D::CTransformShape::_CurrentUseLocalAttenuation.

Referenced by renderSkins().

00099 {
00100         _CurrentLightContribution= lightContrib;
00101         _CurrentUseLocalAttenuation= useLocalAtt;
00102 }

void NL3D::CTransform::setUserClipping bool  enable  )  [inherited]
 

Definition at line 1310 of file transform.cpp.

References NL3D::CTransform::setStateFlag(), and NL3D::CTransform::UserClipping.

Referenced by NL3D::CTransformUser::setUserClipping().

01311 {
01312         setStateFlag (UserClipping, enable);
01313 }

void NL3D::CTransform::setUserLightable bool  enable  )  [inherited]
 

Set the UserLightable flag. if false, isLightable() will always return false. Doing this, user can disable lighting on a model which may be interesting for speed. Default behavior is UserLightable==true.

Definition at line 559 of file transform.cpp.

References NL3D::CTransform::getStateFlag(), NL3D::CTransform::IsFinalLightable, NL3D::CTransform::IsLightable, NL3D::CTransform::IsUserLightable, and NL3D::CTransform::setStateFlag().

Referenced by NL3D::CTransformUser::setUserLightable().

00560 {
00561         setStateFlag(IsUserLightable, enable);
00562         // update IsFinalLightable
00563         setStateFlag(IsFinalLightable, (getStateFlag(IsLightable) && getStateFlag(IsUserLightable)) );
00564 }

void NL3D::CTransform::setWorldMatrix const CMatrix mat  )  [inline, inherited]
 

Definition at line 302 of file transform.h.

Referenced by NL3D::CParticleSystemManager::processAnimate().

00302 { _WorldMatrix = mat;}

void NL3D::CTransform::show  )  [inherited]
 

Show the objet and his sons.

Definition at line 271 of file transform.cpp.

References NL3D::CTransform::_FatherSkeletonModel, NL3D::CTransform::_TransformDirty, dirtSkinRenderLists(), NL3D::CTransform::isSkinned(), nlassert, and NL3D::CTransform::Visibility.

Referenced by NL3D::CTransformUser::show(), and NL3D::CLandscapeUser::show().

00272 {
00273         // Optim: do nothing if already set
00274         if(Visibility!= CHrcTrav::Show)
00275         {
00276                 _TransformDirty= true;
00277                 Visibility= CHrcTrav::Show;
00278                 // If skinned, then must inform skeleton parent that it must recompute skin render/animDetail lists
00279                 if(isSkinned())
00280                 {
00281                         nlassert(_FatherSkeletonModel);
00282                         _FatherSkeletonModel->dirtSkinRenderLists();
00283                 }
00284         }
00285 }

virtual void NL3D::CTransformShape::start  )  [inline, virtual, inherited]
 

Reimplemented in NL3D::CSegRemanence.

Definition at line 128 of file transform_shape.h.

Referenced by NL3D::CInstanceUser::start().

00128 {};

void NL3D::CSkeletonModel::stickObject CTransform mi,
uint  boneId
 

parent a CTransform to a bone of the skeleton. NB: ~CTransform() calls detachSkeletonSon(). NB: nlassert() if there is too many skins/sticked objects on this skeleton (more than 255). NB: an object can't be skinned and sticked at same time :) NB: replaced if already here. NB: mi is made son of skeleton model in Traversals Hrc, and change are made at render() for ClipTrav.

Definition at line 537 of file skeleton_model.cpp.

References stickObjectEx(), and uint.

Referenced by NL3D::CSkeletonUser::stickObject().

00538 {
00539         // by default don't force display of "mi" if the skeleton become in CLod state
00540         stickObjectEx(mi, boneId, false);
00541 }

void NL3D::CSkeletonModel::stickObjectEx CTransform mi,
uint  boneId,
bool  forceCLod
 

same method as stickObject(), but if you set forceCLod as true, then this object will be visible even if the skeleton father is in CLod state (ie displayed with a CLodCharacterShape) NB: if "mi" is a skeleton model, forceCLod is considerer true, whatever the value passed in.

Definition at line 543 of file skeleton_model.cpp.

References NL3D::CTransform::_FatherBoneId, NL3D::CTransform::_FatherSkeletonModel, NL3D::CTransform::_ForceCLodSticked, _StickedObjects, detachSkeletonSon(), dirtLodVertexAlpha(), NL3D::CTransform::hrcLinkSon(), incForcedBoneUsageAndParents(), nlassert, and uint.

Referenced by stickObject(), and NL3D::CSkeletonUser::stickObjectEx().

00544 {
00545         nlassert(mi);
00546 
00547         // if "mi" is a skeleton, forceCLod must be true, for correct animation purpose
00548         if(dynamic_cast<CSkeletonModel*>(mi))
00549                 forceCLod= true;
00550 
00551         // try to detach this object from any skeleton first (possibly me).
00552         if(mi->_FatherSkeletonModel)
00553                 mi->_FatherSkeletonModel->detachSkeletonSon(mi);
00554 
00555         // Then Add me.
00556         _StickedObjects.insert(mi);
00557         // increment the refCount usage of the bone
00558         incForcedBoneUsageAndParents(boneId, forceCLod);
00559 
00560         // advert transform of its sticked state.
00561         mi->_FatherSkeletonModel= this;
00562         mi->_FatherBoneId= boneId;
00563         // advert him if it is "ForceCLod" sticked
00564         mi->_ForceCLodSticked= forceCLod;
00565 
00566         // link correctly Hrc only. ClipTrav grah updated in Hrc traversal.
00567         hrcLinkSon( mi );
00568 
00569         // must recompute lod vertex alpha when LodCharacter used
00570         dirtLodVertexAlpha();
00571 }

virtual void NL3D::CTransformShape::stop  )  [inline, virtual, inherited]
 

Reimplemented in NL3D::CSegRemanence.

Definition at line 130 of file transform_shape.h.

Referenced by NL3D::CInstanceUser::stop().

00130 {};

virtual bool NL3D::CTransform::supportShadowSkinGrouping  )  const [inline, protected, virtual, inherited]
 

Special Skinning For ShadowMapping.

Reimplemented in NL3D::CMeshMRMInstance, and NL3D::CMeshMRMSkinnedInstance.

Definition at line 611 of file transform.h.

00611 {return false;}

virtual bool NL3D::CTransform::supportSkinGrouping  )  const [inline, protected, virtual, inherited]
 

Deriver may support SkinGrouping if isSkinnable(). It renders the skin with current ctx of the skeletonModel, but torn in 2 pass: fillVB,a nd renderPrimitives Deriver may check NL3D_MESH_SKIN_MANAGER_VERTEXFORMAT and NL3D_MESH_SKIN_MANAGER_MAXVERTICES

Reimplemented in NL3D::CMeshMRMInstance, and NL3D::CMeshMRMSkinnedInstance.

Definition at line 597 of file transform.h.

00597 {return false;}

void NL3D::IAnimatable::touch uint  valueId,
uint  ownerValueId
[inline, inherited]
 

Touch a value because it has been modified.

Parameters:
valueId is the animated value ID in the object we want to touch.
ownerValueId is the bit of the IAnimatable part which owns this animated value.

Definition at line 168 of file animatable.h.

References NL3D::IAnimatable::propagateTouch(), NL3D::IAnimatable::setFlag(), and uint.

Referenced by NL3D::CChannelMixer::eval(), NL3D::CChannelMixer::evalSingleChannel(), NL3D::CParticleSystemModel::reallocRsc(), NL3D::CChannelMixer::refreshList(), NL3D::CCamera::setFov(), NL3D::ITransformable::setPivot(), NL3D::ITransformable::setPos(), NL3D::CCamera::setRoll(), NL3D::ITransformable::setRotEuler(), NL3D::ITransformable::setRotQuat(), NL3D::ITransformable::setScale(), NL3D::CCamera::setTargetPos(), NL3D::ITransformable::setTransformMode(), and NL3D::CParticleSystemInstanceUser::setUserParam().

00169         {
00170                 // Set the bit
00171                 setFlag(valueId);
00172                 // Set the owner bit
00173                 setFlag(ownerValueId);
00174 
00175                 // propagate the touch to the fathers.
00176                 propagateTouch();
00177         }

void NL3D::CSkeletonModel::traverseAnimDetail  )  [virtual]
 

this do :

Reimplemented from NL3D::CTransform.

Definition at line 658 of file skeleton_model.cpp.

References _AnimCtrlUsage, _AnimDetailSkins, _BoneToCompute, _BoneToComputeDirty, _CurLod, _CurLodInterp, _LodInterpMultiplier, NL3D::CSkeletonModel::CBoneCompute::Bone, NL3D::CTravCameraScene::CamPos, NLMISC::clamp(), NL3D::CBone::compute(), NL3D::CSkeletonShape::CLod::Distance, NL3D::CSkeletonModel::CBoneCompute::Father, NL3D::CBone::getBoneSkinMatrix(), NL3D::CScene::getClipTrav(), NL3D::CSkeletonShape::getLod(), NL3D::CSkeletonShape::getLodForDistance(), NL3D::CSkeletonShape::getNumLods(), NL3D::CTransform::getOwnerScene(), NLMISC::CMatrix::getPos(), NL3D::CTransform::getWorldMatrix(), NL3D::CBone::interpolateBoneSkinMatrix(), isDisplayedAsLodCharacter(), NL3D::CTransform::isGeneratingShadowMap(), NL3D::CTransform::isHrcVisible(), NL3D::CSkeletonModel::CBoneCompute::MustInterpolate, setDisplayLodCharacterFlag(), NLMISC::CObjectVector< T, EnableObjectBehavior >::size(), uint, and updateBoneToCompute().

00659 {
00660         CSkeletonShape  *skeShape= ((CSkeletonShape*)(IShape*)Shape);
00661 
00662         /* NB: If "this" skeleton has an AncestorSkeletonModel displayed but "this" skeleton is clipped, 
00663                 it will be still animDetailed.
00664                 So its possible sticked sons will be displayed with correct WorldMatrix (if not themselves clipped).
00665         */
00666 
00667         /*      If the Root Skeleton Model (ie me or my AncestorSM) is asked to render a ShadowMap, BUT I am
00668                 in CLod Form (and visible in HRC else won't be rendered in shadowMap...), then temporarly
00669                 Avoid CLod!! To really compute the bones for this frame only.
00670         */
00671         bool    tempAvoidCLod= false;
00672         bool    genShadow;
00673         if(_AncestorSkeletonModel)
00674                 genShadow= _AncestorSkeletonModel->isGeneratingShadowMap();
00675         else
00676                 genShadow= isGeneratingShadowMap();
00677         // do the test.
00678         if(genShadow && isDisplayedAsLodCharacter() && isHrcVisible() )
00679         {
00680                 tempAvoidCLod= true;
00681                 // Disable it just the time of this AnimDetail
00682                 setDisplayLodCharacterFlag(false);
00683         }
00684 
00685 
00686         // Update Lod, and animate.
00687         //===============
00688 
00689         /*
00690                 CTransformShape::traverseAnimDetail() is torn in 2 here because 
00691                 channels may be enabled/disabled by updateBoneToCompute()
00692         */
00693 
00694         // First update Skeleton WorldMatrix (case where the skeleton is sticked).
00695         CTransform::updateWorldMatrixFromFather();
00696         // get dist from camera.
00697         float   dist= (getWorldMatrix().getPos() - getOwnerScene()->getClipTrav().CamPos).norm();
00698         // Use dist to get current lod to use for this skeleton
00699         uint    newLod= skeShape->getLodForDistance( dist );
00700         if(newLod != _CurLod)
00701         {
00702                 // set new lod to use.
00703                 _CurLod= newLod;
00704                 // dirt the skeleton.
00705                 _BoneToComputeDirty= true;
00706         }
00707 
00708         // If needed, let's know which bone has to be computed, and enable / disable (lod) channels in channelMixer.
00709         bool forceUpdate= _BoneToComputeDirty;
00710         updateBoneToCompute();
00711 
00712         // Animate skeleton.
00713         CTransformShape::traverseAnimDetailWithoutUpdateWorldMatrix();
00714 
00715 
00716         // Prepare Lod Bone interpolation.
00717         //===============
00718 
00719         float   lodBoneInterp;
00720         const CSkeletonShape::CLod      *lodNext= NULL;
00721         // if a lod exist after current lod, and if lod interpolation enabled
00722         if( _CurLod < skeShape->getNumLods()-1 && _LodInterpMultiplier>0 )
00723         {
00724                 // get next lod.
00725                 lodNext= &skeShape->getLod(_CurLod+1);
00726                 // get interp value to next.
00727                 lodBoneInterp= (lodNext->Distance - dist) * _LodInterpMultiplier;
00728                 NLMISC::clamp(lodBoneInterp, 0.f, 1.f);
00729                 // if still 1, keep cur matrix => disable interpolation
00730                 if(lodBoneInterp==1.f)
00731                         lodNext=NULL;
00732         }
00733         // else, no interpolation
00734         else
00735         {
00736                 lodBoneInterp=1.f;
00737         }
00738         // If the interpolation value is different from last one, must update.
00739         if(lodBoneInterp != _CurLodInterp)
00740         {
00741                 // set new one.
00742                 _CurLodInterp= lodBoneInterp;
00743                 // must update bone compute.
00744                 forceUpdate= true;
00745         }
00746 
00747 
00748 
00749         // Compute bones
00750         //===============
00751 
00752         // If User AnimCtrl, then must update
00753         if(_AnimCtrlUsage>0)
00754                 forceUpdate= true;
00755 
00756         // test if bones must be updated. either if animation change or if BoneUsage change.
00757         if(IAnimatable::isTouched(CSkeletonModel::OwnerBit) || forceUpdate)
00758         {
00759                 // Retrieve the WorldMatrix of the current CTransformShape.
00760                 const CMatrix           &modelWorldMatrix= getWorldMatrix();
00761 
00762                 // must test / update the hierarchy of Bones.
00763                 // Since they are orderd in depth-first order, we are sure that parent are computed before sons.
00764                 uint                                                    numBoneToCompute= _BoneToCompute.size();
00765                 CSkeletonModel::CBoneCompute    *pBoneCompute= numBoneToCompute? &_BoneToCompute[0] : NULL;
00766                 // traverse only bones which need to be computed
00767                 for(;numBoneToCompute>0;numBoneToCompute--, pBoneCompute++)
00768                 {
00769                         // compute the bone with his father, if any
00770                         pBoneCompute->Bone->compute( pBoneCompute->Father, modelWorldMatrix, this);
00771 
00772                         // Lod interpolation on this bone .. only if interp is enabled now, and if bone wants it
00773                         if(lodNext && pBoneCompute->MustInterpolate)
00774                         {
00775                                 // interpolate with my father matrix.
00776                                 const CMatrix           &fatherMatrix= pBoneCompute->Father->getBoneSkinMatrix();
00777                                 pBoneCompute->Bone->interpolateBoneSkinMatrix(fatherMatrix, lodBoneInterp);
00778                         }
00779                 }
00780 
00781                 IAnimatable::clearFlag(CSkeletonModel::OwnerBit);
00782         }
00783 
00784         // Sticked Objects: 
00785         // they will update their WorldMatrix after, because of the AnimDetail traverse scheme:
00786         // traverse visible Clip models, and if skeleton, traverse Hrc sons.
00787 
00788 
00789         // Restore the Initial CLod flag if needed (see above)
00790         if(tempAvoidCLod)
00791         {
00792                 setDisplayLodCharacterFlag(true);
00793         }
00794 
00795 
00796         // Update Animated Skins.
00797         //===============
00798         for(uint i=0;i<_AnimDetailSkins.size();i++)
00799         {
00800                 // traverse it. NB: updateWorldMatrixFromFather() is called but no-op because isSkinned()
00801                 _AnimDetailSkins[i]->traverseAnimDetail();
00802         }
00803 }

void NL3D::CTransform::traverseAnimDetailWithoutUpdateWorldMatrix  )  [protected, inherited]
 

traverse without updatin WorldMatrixFromFather:

  • animdetail if the model channelmixer is not NULL, and if model not clipped

Definition at line 938 of file transform.cpp.

References NL3D::CChannelMixer::eval(), and NL3D::CTransform::getOwnerScene().

Referenced by NL3D::CTransform::traverseAnimDetail().

00939 {
00940         // AnimDetail behavior: animate only if not clipped.
00941         // NB: no need to test because of VisibilityList use.
00942 
00943         // test if the refptr is NULL or not (RefPtr).
00944         CChannelMixer   *chanmix= _ChannelMixer;
00945         if(chanmix)
00946         {
00947                 // eval detail!!
00948                 chanmix->eval(true, getOwnerScene()->getAnimDetailTrav().CurrentDate);
00949         }
00950 }

void NL3D::CTransform::traverseClip  )  [virtual, inherited]
 

The base traverseClip method. The behavior is to:

  • test if _WorldVis is visible.
  • test if is clipped with clip() OR IF SKELETON MODEL, USE SKELETON MODEL clip!!
  • if visible and not clipped, set _Visible=true (else false). and
    • add the CTransform* to the ClipTrav list
  • if _Visible==true, and renderable, add it to the RenderTraversal: RenderTrav->addRenderModel(model);
  • always traverseSons(), to clip the sons.

Reimplemented in NL3D::CCluster, NL3D::CLandscapeModel, NL3D::CParticleSystemModel, NL3D::CQuadGridClipManager, and NL3D::CRootModel.

Definition at line 806 of file transform.cpp.

References NL3D::CTransform::_AncestorSkeletonModel, NL3D::CTransform::_ClipDate, NL3D::CTransform::_FatherSkeletonModel, NL3D::CTransform::_ForceCLodSticked, NL3D::CTransform::_RenderFilterType, NL3D::CTransform::_StateFlags, NL3D::CTransform::_Visible, NL3D::CTransform::_WorldVis, NL3D::CLightTrav::addLightedModel(), NL3D::CRenderTrav::addRenderModel(), NL3D::CLoadBalancingTrav::addVisibleModel(), NL3D::CAnimDetailTrav::addVisibleModel(), NL3D::CClipTrav::addVisibleModel(), NL3D::CTransform::clip(), NL3D::CTransform::clipGetChild(), NL3D::CTransform::clipGetNumChildren(), NL3D::CClipTrav::CurrentDate, NL3D::CScene::getAnimDetailTrav(), NL3D::CScene::getClipTrav(), NL3D::CScene::getFilterRenderFlags(), NL3D::CScene::getLightTrav(), NL3D::CScene::getLoadBalancingTrav(), NL3D::CTransform::getOwnerScene(), NL3D::CScene::getRenderTrav(), NL3D::CTransform::isAnimDetailable(), NL3D::CTransform::isClipVisible(), isDisplayedAsLodCharacter(), NL3D::CTransform::isLightable(), NL3D::CTransform::isLoadBalancable(), NL3D::CTransform::isRenderable(), num, uint, and NL3D::CTransform::UserClipping.

Referenced by NL3D::CCluster::recursTraverseClip(), NL3D::CClipTrav::traverse(), NL3D::CRootModel::traverseClip(), and NL3D::CParticleSystemModel::traverseClip().

00807 {
00808         // disable H_AUTO, because slowdown when lot of models (eg 1000-2000 tested in forest)
00809         //H_AUTO( NL3D_TransformClip );
00810 
00811         CScene                  *scene= getOwnerScene();
00812         CClipTrav               &clipTrav= scene->getClipTrav();
00813 
00814         if ((_ClipDate == clipTrav.CurrentDate) && _Visible)
00815                 return;
00816         _ClipDate = clipTrav.CurrentDate;
00817 
00818         // clip: update Visible flag.
00819         _Visible= false;
00820         // if at least visible.
00821         if(_WorldVis)
00822         {
00823                 // If linked to a SkeletonModel anywhere in the hierarchy, don't clip, and use skeleton model clip result.
00824                 // This works because we are sons of a special node which is not in the clip traversal, and
00825                 // which is traversed at end of the traversal.
00826                 if( _AncestorSkeletonModel!=NULL )
00827                 {
00828                         _Visible= _AncestorSkeletonModel->isClipVisible();
00829                         // Special test: if we are sticked to a skeletonModel, and if we are still visible, maybe we don't have to
00830                         if(_Visible && _FatherSkeletonModel)
00831                         {
00832                                 // if our skeletonModel father is displayed with a Lod, maybe we are not to be displayed
00833                                 if(_FatherSkeletonModel->isDisplayedAsLodCharacter())
00834                                 {
00835                                         // We are visible only if we where sticked to the skeleton with forceCLod==true.
00836                                         // This is also true if we are actually a skeletonModel
00837                                         if(!_ForceCLodSticked)
00838                                                 // otherWise we are not visible. eg: this is the case of skins and some sticked object
00839                                                 _Visible= false;
00840                                 }
00841                         }
00842                 }
00843                 // else, clip.
00844                 else
00845                 {
00846                         // If the instance is not filtered
00847                         if(scene->getFilterRenderFlags() & _RenderFilterType)
00848                         {
00849                                 // User cliping enabled ?
00850                                 if (_StateFlags & UserClipping)
00851                                         _Visible= true;
00852                                 else
00853                                         _Visible= clip();
00854                         }
00855                 }
00856         }
00857 
00858         // if visible, add to list.
00859         if(_Visible)
00860         {
00861                 // add this model to the visibility list.
00862                 clipTrav.addVisibleModel(this);
00863 
00864                 // Has not an ancestor skeleton model?
00865                 if( _AncestorSkeletonModel==NULL )
00866                 {
00867                         // If needed, insert the model in the lighted list.
00868                         // don't insert if has an ancestorSkeletonModel, because in this case, result is driven by 
00869                         // the _LightContribution of the _AncestorSkeletonModel.
00870                         if( isLightable() )
00871                                 scene->getLightTrav().addLightedModel(this);
00872 
00873                         // If needed, insert the model in the animDetail list.
00874                         // don't insert if has an ancestoreSkeletonModel, because in this case, this ancestore will 
00875                         // animDetail through the hierarchy...
00876                         if( isAnimDetailable() )
00877                                 scene->getAnimDetailTrav().addVisibleModel(this);
00878                 }
00879 
00880                 // If needed, Add it to the loadBalancing trav
00881                 if( isLoadBalancable() )
00882                         scene->getLoadBalancingTrav().addVisibleModel(this);
00883 
00884                 // If needed, insert the model in the render list.
00885                 if( isRenderable() )
00886                         scene->getRenderTrav().addRenderModel(this);
00887         }
00888 
00889         // Traverse the Clip sons.
00890         uint    num= clipGetNumChildren();
00891         for(uint i=0;i<num;i++)
00892                 clipGetChild(i)->traverseClip();
00893 }

void NL3D::CTransform::traverseHrc  )  [virtual, inherited]
 

Each method is called in its associated traversal.

Reimplemented in NL3D::CCluster, NL3D::CLandscapeModel, NL3D::CMeshBaseInstance, NL3D::CQuadGridClipManager, and NL3D::CRootModel.

Definition at line 786 of file transform.cpp.

References NL3D::CTransform::hrcGetChild(), NL3D::CTransform::hrcGetNumChildren(), num, uint, and NL3D::CTransform::updateWorld().

Referenced by NL3D::CHrcTrav::traverse(), and NL3D::CRootModel::traverseHrc().

00787 {
00788         // Recompute the matrix, according to _HrcParent matrix mode, and local matrix.
00789         updateWorld();
00790 
00791         // Traverse the Hrc sons.
00792         uint    num= hrcGetNumChildren();
00793         for(uint i=0;i<num;i++)
00794                 hrcGetChild(i)->traverseHrc();
00795 }

void NL3D::CTransform::traverseLight  )  [virtual, inherited]
 

traverse the lightedModel per default: recompute LightContribution is isLightable()

Reimplemented in NL3D::CPointLightModel, NL3D::CQuadGridClipManager, and NL3D::CRootModel.

Definition at line 1080 of file transform.cpp.

References NL3D::CTransform::_LightContribution, NL3D::CTransform::_LogicInfo, NL3D::CLightContribution::AttFactor, NL3D::CPointLight::computeLinearAttenuation(), NL3D::CLightingManager::computeModelLightContributions(), NL3D::CTransform::getAABBox(), NLMISC::CAABBox::getCenter(), NL3D::CScene::getLightTrav(), NL3D::CTransform::getOwnerScene(), NL3D::CPointLight::getPosition(), NL3D::CTransform::getWorldMatrix(), NL3D::CTransform::isNeedUpdateFrozenStaticLightSetup(), NL3D::CTransform::isNeedUpdateLighting(), NL3D::CLightTrav::LightingManager, NL3D::CLightContribution::NumFrozenStaticLight, NLMISC::OptFastFloor(), NL3D::CLightContribution::PointLight, NL3D::CTransform::setStateFlag(), sint, uint, and uint8.

01081 {
01082         // if the model do not need to update his lighting, just skip.
01083         if(!isNeedUpdateLighting())
01084                 return;
01085 
01086 
01087         // If a freezeStaticLightSetup() has been called on this model recently.
01088         if(isNeedUpdateFrozenStaticLightSetup())
01089         {
01090                 // Now, the correct matrix is computed.
01091                 // get the untransformed bbox from the model.
01092                 CAABBox         bbox;
01093                 getAABBox(bbox);
01094                 // get transformed center pos of bbox
01095                 CVector worldModelPos= getWorldMatrix() * bbox.getCenter();
01096 
01097                 // So we can compute AttFactor for each static light influencing this static object
01098                 uint    numPointLights= _LightContribution.NumFrozenStaticLight;
01099                 for(uint i=0;i<numPointLights;i++)
01100                 {
01101                         const CPointLight       *pl= _LightContribution.PointLight[i];
01102                         // don't worry about the precision of floor, because of *255.
01103                         float   distToModel= (pl->getPosition() - worldModelPos).norm();
01104                         sint    attFactor= NLMISC::OptFastFloor( 255 * pl->computeLinearAttenuation(worldModelPos, distToModel) );
01105                         _LightContribution.AttFactor[i]= (uint8)attFactor;
01106                 }
01107 
01108                 // clean.
01109                 setStateFlag(CTransform::IsNeedUpdateFrozenStaticLightSetup, false);
01110         }
01111 
01112 
01113         // see CTransform::clip(), here I am Lightable(), and I have no _AncestorSkeletonModel
01114         // So I am sure that I really need to recompute my ModelLightContributions.
01115         getOwnerScene()->getLightTrav().LightingManager.computeModelLightContributions(this,
01116                 _LightContribution, _LogicInfo);
01117 
01118         // done!
01119         setStateFlag(CTransform::IsNeedUpdateLighting, false);
01120 }

void NL3D::CTransformShape::traverseLoadBalancing  )  [virtual, inherited]
 

no-op by default

Reimplemented from NL3D::CTransform.

Reimplemented in NL3D::CMeshMultiLodInstance.

Definition at line 262 of file transform_shape.cpp.

References NL3D::CScene::getLoadBalancingTrav(), NL3D::CLoadBalancingTrav::getLoadPass(), NL3D::CTransform::getOwnerScene(), NL3D::CTransformShape::traverseLoadBalancingPass0(), and NL3D::CTransformShape::traverseLoadBalancingPass1().

00263 {
00264         CLoadBalancingTrav              &loadTrav= getOwnerScene()->getLoadBalancingTrav();
00265         if(loadTrav.getLoadPass()==0)
00266                 traverseLoadBalancingPass0();
00267         else
00268                 traverseLoadBalancingPass1();
00269 }

void NL3D::CSkeletonModel::traverseRender  )  [virtual]
 

If displayed as a CLod, render it, else render the skins binded to this skeleton

Reimplemented from NL3D::CTransformShape.

Definition at line 1030 of file skeleton_model.cpp.

References H_AUTO, isDisplayedAsLodCharacter(), renderCLod(), and renderSkins().

01031 {
01032         H_AUTO( NL3D_Skeleton_Render );
01033 
01034         // render as CLod, or render Skins.
01035         if(isDisplayedAsLodCharacter())
01036                 renderCLod();
01037         else
01038                 renderSkins();
01039 }

void NL3D::CTransform::unfreezeHRC  )  [inherited]
 

see freezeHRC().

Definition at line 406 of file transform.cpp.

References NL3D::CTransform::_FreezeHRCState, NL3D::CTransform::_HrcParent, NL3D::CTransform::_HrcParentUnfreeze, NL3D::CTransform::_LightedModelIt, NL3D::CLightingManager::eraseStaticLightedModel(), NL3D::CTransform::FreezeHRCStateDisabled, NL3D::CScene::getLightTrav(), NL3D::CTransform::getOwnerScene(), NL3D::CScene::getRoot(), NL3D::CTransform::hrcLinkSon(), NL3D::CTransform::isLightable(), NL3D::CLightTrav::LightingManager, NL3D::CTransform::linkToUpdateList(), nlassert, NL3D::CTransform::QuadGridClipEnabled, NL3D::CTransform::setStateFlag(), and NL3D::CTransform::unlinkFromQuadCluster().

Referenced by bindSkin(), NL3D::CMeshBaseInstance::traverseHrc(), and NL3D::CInstanceGroup::unfreezeHRC().

00407 {
00408         // if this model is no HRC frozen disabled
00409         if(_FreezeHRCState!=FreezeHRCStateDisabled)
00410         {
00411                 // if model correctly frozen.
00412                 if(_FreezeHRCState == CTransform::FreezeHRCStateEnabled )
00413                 {
00414                         // Should not be linked : can't link after a freezeHRC
00415                         nlassert (_HrcParent == NULL);
00416 
00417                         // Set as unfreeze else, hrcLinkSon doesn't work
00418                         _FreezeHRCState= FreezeHRCStateDisabled;
00419 
00420                         // Link this model to the previous HRC parent.
00421                         if (_HrcParentUnfreeze)
00422                                 _HrcParentUnfreeze->hrcLinkSon( this );
00423                         else
00424                                 getOwnerScene()->getRoot()->hrcLinkSon( this );
00425 
00426                         // Link this object to the validateList.
00427                         linkToUpdateList();
00428 
00429                         // if lightable()
00430                         if( isLightable() )
00431                         {
00432                                 CLightTrav      &lightTrav= getOwnerScene()->getLightTrav();
00433                                 // Lighting: must remove the object from the quadGrid.
00434                                 // NB: works if _LightedModelIt==NULL. result is that _LightedModelIt= NULL.
00435                                 _LightedModelIt= lightTrav.LightingManager.eraseStaticLightedModel(_LightedModelIt);
00436                         }
00437 
00438                 }
00439                 else
00440                         _FreezeHRCState= FreezeHRCStateDisabled;
00441 
00442                 // unlink me from any QuadCluster, and disable QuadCluster
00443                 unlinkFromQuadCluster();
00444                 setStateFlag(QuadGridClipEnabled, false);
00445         }
00446 }

void NL3D::CTransform::unfreezeStaticLightSetup  )  [inherited]
 

unFreeze the Static Light Setup. Must be called if static pointLights are deleted. NB: it calls resetLighting() first. NB: do not need to call it if pointLights and this transform are deleted at same time.

Definition at line 1061 of file transform.cpp.

References NL3D::CTransform::_LightContribution, NL3D::CLightContribution::FrozenAmbientLight, NL3D::CLightContribution::FrozenStaticLightSetup, NL3D::CTransform::IsNeedUpdateFrozenStaticLightSetup, NL3D::CLightContribution::NumFrozenStaticLight, NL3D::CLightContribution::PointLight, NL3D::CTransform::resetLighting(), and NL3D::CTransform::setStateFlag().

Referenced by NL3D::CInstanceGroup::removeFromScene().

01062 {
01063         // resetLighting() first.
01064         resetLighting();
01065 
01066         // Disable StaticLightSetup.
01067         _LightContribution.FrozenStaticLightSetup= false;
01068         _LightContribution.NumFrozenStaticLight= 0;
01069         // End the list
01070         _LightContribution.PointLight[0]= NULL;
01071         // No more FrozenAmbientLight
01072         _LightContribution.FrozenAmbientLight= NULL;
01073 
01074         // Don't need to update StaticLightSetup since no more exist.
01075         setStateFlag(IsNeedUpdateFrozenStaticLightSetup, false);
01076 }

void NL3D::CTransformShape::unlinkFromQuadCluster  )  [protected, virtual, inherited]
 

special feature for CQuadGridClipManager. remove from it.

Reimplemented from NL3D::CTransform.

Definition at line 133 of file transform_shape.cpp.

References NL3D::CTransformShape::_QuadClusterListNode, and NL3D::CFastPtrListNode::unlink().

00134 {
00135         // if linked to a quadGridClipCluster, unlink it
00136         _QuadClusterListNode.unlink();
00137 }

void NL3D::CTransform::update  )  [virtual, inherited]
 

This function update the model (called by CScene::updateModels()) Deriver Must :

  • call BaseClass::update() (eg: CTransform::update()).
  • test if something is different (eg: animation modification). Then update Model information (eg compute new Matrix).

The default behavior is to update transform Matrix etc...

Reimplemented in NL3D::CCamera.

Definition at line 450 of file transform.cpp.

References NL3D::CTransform::_FreezeHRCState, NL3D::CTransform::_Frozen, NL3D::CTransform::_LastTransformableMatrixDate, NL3D::CTransform::_LightedModelIt, NL3D::CTransform::_LocalDate, NL3D::CTransform::_LocalMatrix, NL3D::CTransform::_LocalVis, NL3D::CTransform::_TransformDirty, NL3D::CHrcTrav::CurrentDate, NL3D::CLightingManager::eraseStaticLightedModel(), NL3D::CScene::getHrcTrav(), NL3D::CScene::getLightTrav(), NL3D::ITransformable::getMatrix(), NL3D::CTransform::getOwnerScene(), NL3D::CTransform::hrcUnlink(), NL3D::CLightingManager::insertStaticLightedModel(), NL3D::CTransform::isLightable(), NL3D::CLightTrav::LightingManager, NL3D::CTransform::unlinkFromUpdateList(), and NL3D::CTransform::Visibility.

Referenced by NL3D::CTransform::forceCompute(), NL3D::CTransform::freeze(), and NL3D::CScene::updateModels().

00451 {
00452         // test if the matrix has been changed in ITransformable.
00453         if(ITransformable::compareMatrixDate(_LastTransformableMatrixDate))
00454         {
00455                 _LastTransformableMatrixDate= ITransformable::getMatrixDate();
00456                 _TransformDirty= true;
00457         }
00458 
00459         // update the freezeHRC state.
00460         if(_FreezeHRCState != CTransform::FreezeHRCStateDisabled)
00461         {
00462                 // if the model request to be frozen in HRC
00463                 if(_FreezeHRCState == CTransform::FreezeHRCStateRequest )
00464                 {
00465                         // Wait for next Hrc traversal to compute good _WorldMatrix for this model and his sons.
00466                         // Also, next Hrc traversal will insert the model in the LightingManager quadGrid (if lightable)
00467                         _FreezeHRCState = CTransform::FreezeHRCStateReady;
00468                 }
00469                 // if the model is ready to be frozen in HRC, then do it!!
00470                 else if( _FreezeHRCState == CTransform::FreezeHRCStateReady )
00471                 {
00472                         // Unlink this model.
00473                         hrcUnlink();
00474 
00475                         // unLink this object from the validateList. NB: the list will still be correclty parsed.
00476                         unlinkFromUpdateList();
00477 
00478                         // if lightable, the model is inserted in a quadgrid to update his lighting only when
00479                         // dynamicLights touch him (since himself is static).
00480                         if( isLightable() )
00481                         {
00482                                 CLightTrav      &lightTrav= getOwnerScene()->getLightTrav();
00483                                 // Lighting: must reinsert the object from the quadGrid.
00484                                 // NB: works if _LightedModelIt==NULL. result is that _LightedModelIt= NULL.
00485                                 _LightedModelIt= lightTrav.LightingManager.eraseStaticLightedModel(_LightedModelIt);
00486                                 // insert in the quadgrid.
00487                                 _LightedModelIt= lightTrav.LightingManager.insertStaticLightedModel(this);
00488                         }
00489 
00490                         // Now this model won't be tested for validation nor for worldMatrix update. End!!
00491                         _FreezeHRCState = CTransform::FreezeHRCStateEnabled;
00492                 }
00493         }
00494 
00495         // update _LocalMatrix
00496         if(_TransformDirty)
00497         {
00498                 // update the local matrix.
00499                 _LocalMatrix= getMatrix();
00500                 _LocalVis= Visibility;
00501                 // update the date of the local matrix.
00502                 _LocalDate= getOwnerScene()->getHrcTrav().CurrentDate;
00503 
00504                 // The transform has been modified. Hence, it is no more frozen.
00505                 _Frozen= false;
00506 
00507                 // ok!
00508                 _TransformDirty= false;
00509         }
00510 }

void NL3D::CSkeletonModel::updateBoneToCompute  )  [private]
 

According to Usage, ForedUsage and current skeleton Lod, update MustCompute and ValidBoneSkinMatrix.

Definition at line 280 of file skeleton_model.cpp.

References _BoneToCompute, _BoneToComputeDirty, _BoneUsage, _CurLod, _LodInterpMultiplier, NL3D::CSkeletonShape::CLod::ActiveBones, NL3D::CSkeletonModel::CBoneCompute::Bone, Bones, NL3D::CSkeletonModel::CBoneCompute::Father, NL3D::CTransform::getChannelMixer(), NL3D::CSkeletonShape::getLod(), NL3D::CSkeletonShape::getNumLods(), isDisplayedAsLodCharacter(), NL3D::CSkeletonModel::CBoneCompute::MustInterpolate, sint, and uint.

Referenced by traverseAnimDetail().

00281 {
00282         // If already computed, skip
00283         if(!_BoneToComputeDirty)
00284                 return;
00285 
00286         // get the channelMixer owned by CTransform.
00287         CChannelMixer   *chanMixer= getChannelMixer();
00288 
00289         // Get Lod infos from skeletonShape
00290         CSkeletonShape          *skeShape= (CSkeletonShape*)(IShape*)Shape;
00291         const CSkeletonShape::CLod      &lod= skeShape->getLod(_CurLod);
00292 
00293         // reset _BoneToCompute
00294         _BoneToCompute.clear();
00295 
00296         // For all bones
00297         for(uint i=0; i<_BoneUsage.size(); i++)
00298         {
00299                 // If we are in CLod mode
00300                 if(isDisplayedAsLodCharacter())
00301                         // don't compute the bone
00302                         _BoneUsage[i].MustCompute= 0;
00303                 else
00304                 {
00305                         // set MustCompute to non 0 if (Usage && Lod) || ForcedUsage;
00306                         _BoneUsage[i].MustCompute= (_BoneUsage[i].Usage & lod.ActiveBones[i]) | _BoneUsage[i].ForcedUsage;
00307                 }
00308                 // if CLodForcedUsage for the bone, it must be computed, whatever _DisplayedAsLodCharacter state
00309                 _BoneUsage[i].MustCompute|= _BoneUsage[i].CLodForcedUsage;
00310 
00311                 // If the bone must be computed (if !0)
00312                 if(_BoneUsage[i].MustCompute)
00313                 {
00314                         // lodEnable the channels of this bone
00315                         if(chanMixer)
00316                                 Bones[i].lodEnableChannels(chanMixer, true);
00317 
00318                         // This bone is computed => take his valid boneSkinMatrix.
00319                         _BoneUsage[i].ValidBoneSkinMatrix= i;
00320 
00321                         // Append to the list to compute.
00322                         //-------
00323                         CBoneCompute    bc;
00324                         bc.Bone= &Bones[i];
00325                         sint    fatherId= Bones[i].getFatherId();
00326                         // if a root bone...
00327                         if(fatherId==-1)
00328                                 bc.Father= NULL;
00329                         else
00330                                 bc.Father= &Bones[fatherId];
00331                         // MustInterpolate??
00332                         bc.MustInterpolate= false;
00333                         const CSkeletonShape::CLod      *lodNext= NULL;
00334                         // if a lod exist after current lod, and if lod interpolation enabled
00335                         if( _CurLod < skeShape->getNumLods()-1 && _LodInterpMultiplier>0 )
00336                         {
00337                                 // get next lod.
00338                                 lodNext= &skeShape->getLod(_CurLod+1);
00339                                 // Lod interpolation on this bone ?? only if at next lod, the bone is disabled.
00340                                 // And only if it is not enabed because of a "Forced reason"
00341                                 // Must also have a father, esle can't interpolate.
00342                                 if(lodNext->ActiveBones[i]==0 && _BoneUsage[i].ForcedUsage==0 && _BoneUsage[i].CLodForcedUsage==0 
00343                                         && bc.Father)
00344                                         bc.MustInterpolate= true;
00345                         }
00346                         // append
00347                         _BoneToCompute.push_back(bc);
00348                 }
00349                 else
00350                 {
00351                         // lodDisable the channels of this bone
00352                         if(chanMixer)
00353                                 Bones[i].lodEnableChannels(chanMixer, false);
00354 
00355                         // This bone is not computed => take the valid boneSkinMatrix of his father
00356                         sint    fatherId= Bones[i].getFatherId();
00357                         if(fatherId<0)
00358                                 // just take me, even if not computed.
00359                                 _BoneUsage[i].ValidBoneSkinMatrix= i;
00360                         else
00361                                 // NB: father ValidBoneSkinMatrix already computed because of the hierarchy order of Bones array.
00362                                 _BoneUsage[i].ValidBoneSkinMatrix= _BoneUsage[fatherId].ValidBoneSkinMatrix;
00363                 }
00364         }
00365 
00366         // For 
00367 
00368         // computed
00369         _BoneToComputeDirty= false;
00370 }

void NL3D::CTransform::updateClipTravForAncestorSkeleton  )  [protected, inherited]
 

Definition at line 748 of file transform.cpp.

References NL3D::CTransform::_AncestorSkeletonModel, NL3D::CTransform::_ClipLinkedInSonsOfAncestorSkeletonModelGroup, NL3D::CTransform::clipAddChild(), NL3D::CTransform::clipGetNumParents(), NL3D::CTransform::clipGetParent(), NL3D::CTransform::clipUnlinkFromAll(), NL3D::CScene::getClipTrav(), NL3D::CTransform::getOwnerScene(), NL3D::CScene::getRoot(), and NL3D::CScene::SonsOfAncestorSkeletonModelGroup.

Referenced by NL3D::CTransform::updateWorld().

00749 {
00750         CClipTrav               &clipTrav= getOwnerScene()->getClipTrav();
00751 
00752         // If I have an ancestor Skeleton Model, I must be binded in ClipTrav to the SonsOfAncestorSkeletonModelGroup
00753         if(_AncestorSkeletonModel && !_ClipLinkedInSonsOfAncestorSkeletonModelGroup)
00754         {
00755                 // must unlink from ALL olds models.
00756                 clipUnlinkFromAll();
00757 
00758                 // And link to SonsOfAncestorSkeletonModelGroup.
00759                 getOwnerScene()->SonsOfAncestorSkeletonModelGroup->clipAddChild(this);
00760 
00761                 // update the flag.
00762                 _ClipLinkedInSonsOfAncestorSkeletonModelGroup= true;
00763         }
00764 
00765 
00766         // else I must be binded to the standard Root.
00767         if(!_AncestorSkeletonModel && _ClipLinkedInSonsOfAncestorSkeletonModelGroup)
00768         {
00769                 // verify first I am really still linked to the SonsOfAncestorSkeletonModelGroup.
00770                 // This test is important, because link may have changed for any reason (portals, clipManager....).
00771                 if( clipGetNumParents() == 1 && clipGetParent(0)==getOwnerScene()->SonsOfAncestorSkeletonModelGroup )
00772                 {
00773                         // must unlink from ALL olds models.
00774                         clipUnlinkFromAll();
00775                         // and now, link to std root.
00776                         getOwnerScene()->getRoot()->clipAddChild(this);
00777                 }
00778 
00779                 // update the flag
00780                 _ClipLinkedInSonsOfAncestorSkeletonModelGroup= false;
00781         }
00782 }

void NL3D::CSkeletonModel::updateShadowMap IDriver driver  )  [private]
 

Definition at line 1872 of file skeleton_model.cpp.

References NL3D::CTransform::getOwnerScene(), NL3D::CScene::getShadowMapTextureSize(), NL3D::CShadowMap::getTextureSize(), NL3D::CShadowMap::initTexture(), and nlassert.

Referenced by generateShadowMap().

01873 {
01874         nlassert(_ShadowMap);
01875 
01876         // create/update texture
01877         if(_ShadowMap->getTextureSize()!=getOwnerScene()->getShadowMapTextureSize())
01878         {
01879                 _ShadowMap->initTexture(getOwnerScene()->getShadowMapTextureSize());
01880         }
01881 }

void NL3D::CSkeletonModel::updateSkinRenderLists  ) 
 

Definition at line 1117 of file skeleton_model.cpp.

References _AnimDetailSkins, _DefaultMRMSetup, _OpaqueSkins, _Skins, _SkinToRenderDirty, _TransparentSkins, Bones, buildDefaultLevelDetail(), NLMISC::CObjectVector< T, EnableObjectBehavior >::clear(), NL3D::CMRMLevelDetail::compileDistanceSetup(), NL3D::CMRMLevelDetail::DistanceCoarsest, NL3D::CMRMLevelDetail::DistanceFinest, NL3D::CMRMLevelDetail::DistanceMiddle, NL3D::CTransformShape::getMRMLevelDetail(), NL3D::CTransform::getSkinBoneSphere(), NL3D::CTransform::getSkinBoneUsage(), NL3D::CTransform::getVisibility(), NL3D::CTransform::isAnimDetailable(), NL3D::CTransform::isOpaque(), NL3D::CTransform::isTransparent(), ItTransformSet, NL3D::CMRMLevelDetail::MaxFaceUsed, NL3D::CMRMLevelDetail::MinFaceUsed, nlassert, NLMISC::CBSphere::Radius, NLMISC::CObjectVector< T, EnableObjectBehavior >::resize(), NL3D::CTransform::setTransparency(), sint, and uint.

Referenced by NL3D::CClipTrav::traverse().

01118 {
01119         // If need to update array of skins to compute
01120         if(_SkinToRenderDirty)
01121         {
01122                 uint    i;
01123 
01124                 _SkinToRenderDirty= false;
01125 
01126                 // Reset the LevelDetail.
01127                 _LevelDetail.MinFaceUsed= 0;
01128                 _LevelDetail.MaxFaceUsed= 0;
01129                 // If must follow default MRM setup from skins.
01130                 if(_DefaultMRMSetup)
01131                 {
01132                         _LevelDetail.DistanceCoarsest= 0;
01133                         _LevelDetail.DistanceMiddle= 0;
01134                         _LevelDetail.DistanceFinest= 0;
01135                 }
01136 
01137                 // reset Bone Sphere of skeleton.
01138                 static  std::vector<bool>       sphereEmpty;
01139                 sphereEmpty.clear();
01140                 sphereEmpty.resize(Bones.size(), true);
01141                 for(i=0;i<Bones.size();i++)
01142                 {
01143                         // Default sphere is centered on the bone pos, and has 0 radius.
01144                         Bones[i]._MaxSphere.Center= CVector::Null;
01145                         Bones[i]._MaxSphere.Radius= 0;
01146                 }
01147 
01148                 // Parse to count new size of the arrays, and to build MRM info, and bone Max sphere
01149                 uint    opaqueSize= 0;
01150                 uint    transparentSize= 0;
01151                 uint    animDetailSize= 0;
01152                 ItTransformSet          it;
01153                 for(it= _Skins.begin();it!=_Skins.end();it++)
01154                 {
01155                         CTransform      *skin= *it;
01156 
01157                         // If the skin is hidden, don't add it to any list!
01158                         if(skin->getVisibility()==CHrcTrav::Hide)
01159                                 continue;
01160 
01161                         // if transparent, then must fill in transparent list.
01162                         if(skin->isTransparent())
01163                                 transparentSize++;
01164                         // else may fill in opaquelist. NB: for optimisation, don't add in opaqueList 
01165                         // if added to the transperent list (all materials are rendered)
01166                         else if(skin->isOpaque())
01167                                 opaqueSize++;
01168 
01169                         // if animDetailable, then must fill list
01170                         if(skin->isAnimDetailable())
01171                                 animDetailSize++;
01172 
01173                         // if the skin support MRM, then must update levelDetal number of faces
01174                         CTransformShape         *trShape= dynamic_cast<CTransformShape*>(skin);
01175                         if(trShape)
01176                         {
01177                                 const   CMRMLevelDetail         *skinLevelDetail= trShape->getMRMLevelDetail();
01178                                 if(skinLevelDetail)
01179                                 {
01180                                         // Add Faces to the Skeleton level detail
01181                                         _LevelDetail.MinFaceUsed+= skinLevelDetail->MinFaceUsed;
01182                                         _LevelDetail.MaxFaceUsed+= skinLevelDetail->MaxFaceUsed;
01183                                         // MRM Max skin setup.
01184                                         if(_DefaultMRMSetup)
01185                                         {
01186                                                 // Get the maximum distance setup (ie the one which degrades the less)
01187                                                 _LevelDetail.DistanceCoarsest= max(_LevelDetail.DistanceCoarsest, skinLevelDetail->DistanceCoarsest);
01188                                                 _LevelDetail.DistanceMiddle= max(_LevelDetail.DistanceMiddle, skinLevelDetail->DistanceMiddle);
01189                                                 _LevelDetail.DistanceFinest= max(_LevelDetail.DistanceFinest, skinLevelDetail->DistanceFinest);
01190                                         }
01191                                 }
01192                         }
01193 
01194                         // Enlarge Bone BBox
01195                         const std::vector<sint32>                       *boneUsage= skin->getSkinBoneUsage();
01196                         const std::vector<NLMISC::CBSphere>     *boneSphere= skin->getSkinBoneSphere();
01197                         if(boneUsage && boneSphere)
01198                         {
01199                                 nlassert(boneUsage->size()==boneSphere->size());
01200                                 for(i=0;i<boneUsage->size();i++)
01201                                 {
01202                                         const CBSphere  &sphere= (*boneSphere)[i];
01203                                         sint                    boneId= (*boneUsage)[i];
01204                                         nlassert(boneId<(sint)Bones.size());
01205                                         // if valid boneId, and sphere not empty (ie not -1 radius)
01206                                         if(boneId>-1 && sphere.Radius>=0)
01207                                         {
01208                                                 if(sphereEmpty[boneId])
01209                                                 {
01210                                                         sphereEmpty[boneId]= false;
01211                                                         Bones[boneId]._MaxSphere= sphere;
01212                                                 }
01213                                                 else
01214                                                 {
01215                                                         Bones[boneId]._MaxSphere.setUnion(Bones[boneId]._MaxSphere, sphere);
01216                                                 }
01217                                         }
01218                                 }
01219                         }
01220                 }
01221 
01222                 // MRM Max skin setup.
01223                 if(_DefaultMRMSetup)
01224                 {
01225                         // compile LevelDetail.
01226                         if(_LevelDetail.MaxFaceUsed==0)
01227                                 // build a bug-free level detail
01228                                 buildDefaultLevelDetail();
01229                         else
01230                                 _LevelDetail.compileDistanceSetup();
01231                 }
01232 
01233                 // alloc array.
01234                 _OpaqueSkins.clear();
01235                 _TransparentSkins.clear();
01236                 _AnimDetailSkins.clear();
01237                 _OpaqueSkins.resize(opaqueSize);
01238                 _TransparentSkins.resize(transparentSize);
01239                 _AnimDetailSkins.resize(animDetailSize);
01240 
01241                 // ReParse, to fill array.
01242                 uint    opaqueId= 0;
01243                 uint    transparentId= 0;
01244                 uint    animDetailId= 0;
01245                 for(it= _Skins.begin();it!=_Skins.end();it++)
01246                 {
01247                         CTransform      *skin= *it;
01248 
01249                         // If the skin is hidden, don't add it to any list!
01250                         if(skin->getVisibility()==CHrcTrav::Hide)
01251                                 continue;
01252 
01253                         // if transparent, then must fill in transparent list.
01254                         if(skin->isTransparent())
01255                         {
01256                                 nlassert(transparentId<transparentSize);
01257                                 _TransparentSkins[transparentId++]= skin;
01258                         }
01259                         // else may fill in opaquelist. NB: for optimisation, don't add in opaqueList 
01260                         // if added to the transperent list (all materials are rendered)
01261                         else if(skin->isOpaque())
01262                         {
01263                                 nlassert(opaqueId<opaqueSize);
01264                                 _OpaqueSkins[opaqueId++]= skin;
01265                         }
01266 
01267                         // if animDetailable, then must fill list
01268                         if(skin->isAnimDetailable())
01269                         {
01270                                 nlassert(animDetailId<animDetailSize);
01271                                 _AnimDetailSkins[animDetailId++]= skin;
01272                         }
01273                 }
01274 
01275                 // set the Transparency to the skeleton only if has at least one transparent skin
01276                 setTransparency( transparentSize>0 );
01277         }
01278 }

void NL3D::CTransform::updateWorld  )  [protected, inherited]
 

Update the world state according to the parent world state and the local states.

Definition at line 663 of file transform.cpp.

References NL3D::CTransform::_AncestorSkeletonModel, NL3D::CTransform::_DontUnfreezeChildren, NL3D::CTransform::_FatherSkeletonModel, NL3D::CTransform::_Frozen, NL3D::CTransform::_HrcParent, NL3D::CTransform::_LightContribution, NL3D::CTransform::_LocalDate, NL3D::CTransform::_LocalMatrix, NL3D::CTransform::_LocalVis, NL3D::CHrcTrav::_MovingObjects, NL3D::CTransform::_WorldDate, NL3D::CTransform::_WorldMatrix, NL3D::CTransform::_WorldVis, NL3D::CHrcTrav::CurrentDate, NL3D::CTransform::ForceClipRoot, NL3D::CLightContribution::FrozenStaticLightSetup, NL3D::CScene::getHrcTrav(), NL3D::CTransform::getOwnerScene(), NL3D::CTransform::getStateFlag(), NL3D::CTransform::isLightable(), NL3D::CTransform::isTransformShape(), NL3D::CTransform::resetLighting(), and NL3D::CTransform::updateClipTravForAncestorSkeleton().

Referenced by NL3D::CTransform::traverseHrc().

00664 {
00665         const   CMatrix         *pFatherWM;
00666         bool                            visFather;
00667 
00668         // If not root case, link to Fahter.
00669         if(_HrcParent)
00670         {
00671                 pFatherWM= &(_HrcParent->_WorldMatrix);
00672                 visFather= _HrcParent->_WorldVis;
00673 
00674                 // if _HrcParent is not frozen (for any reason), disable us!
00675 
00676                 if (!_HrcParent->_Frozen && !_HrcParent->_DontUnfreezeChildren)
00677                         _Frozen= false;
00678 
00679                 // herit _AncestorSkeletonModel
00680                 if (_HrcParent->_AncestorSkeletonModel)
00681                         // If my father has an _AncestorSkeletonModel, get it.
00682                         _AncestorSkeletonModel= _HrcParent->_AncestorSkeletonModel;
00683                 else
00684                         // else I have an ancestor skel model if I am sticked/binded directly to a skeleton model.
00685                         _AncestorSkeletonModel= _FatherSkeletonModel;
00686         }
00687         // else, default!!
00688         else
00689         {
00690                 pFatherWM= &(CMatrix::Identity);
00691                 visFather= true;
00692 
00693                 // at the root of the hierarchy, we have no parent, hence no FatherSkeletonModel nor _AncestorSkeletonModel.
00694                 _AncestorSkeletonModel= NULL;
00695 
00696                 // NB: Root is Frozen by essence :), so don't modify the frozen state here.
00697         }
00698 
00699         // Combine matrix
00700         if(_LocalDate>_WorldDate || (_HrcParent && _HrcParent->_WorldDate>_WorldDate) )
00701         {
00702                 // Must recompute the world matrix.  ONLY IF I AM NOT SKINNED/STICKED TO A SKELETON in the hierarchy!
00703                 if( _AncestorSkeletonModel==NULL )
00704                 {
00705                         _WorldMatrix=  *pFatherWM * _LocalMatrix;
00706                         _WorldDate= getOwnerScene()->getHrcTrav().CurrentDate;
00707 
00708                         // Add the model to the moving object list, only if I am a transform shape
00709                         if (!_Frozen && isTransformShape() && !getStateFlag(ForceClipRoot))
00710                                 getOwnerScene()->getHrcTrav()._MovingObjects.push_back (static_cast<CTransformShape*>(this));
00711                 }
00712         }
00713 
00714         // Update dynamic lighting.
00715         /*
00716                 If the model is not frozen in StaticLight, then must update lighting each frame.
00717                 Even if the object doesn't move, a new dynamic light may enter in its aera. Hence we must test
00718                 it in the light quadrid. StaticLight-ed Objects don't need it because they are inserted in a special quadgrid, 
00719                 where dynamics lights touch all StaticLight-ed object to force their computing
00720 
00721                 NB: not done if _AncestorSkeletonModel!=NULL. no need because  in this case, 
00722                 result is driven by the _LightContribution of the _AncestorSkeletonModel.
00723         */
00724         if( !_LightContribution.FrozenStaticLightSetup && _AncestorSkeletonModel==NULL )
00725         {
00726                 // if the model is lightable reset lighting
00727                 if( isLightable() )
00728                         resetLighting();
00729         }
00730 
00731         // Combine visibility.
00732         switch(_LocalVis)
00733         {
00734                 case CHrcTrav::Herit: _WorldVis= visFather; break;
00735                 case CHrcTrav::Hide: _WorldVis= false; break;
00736                 case CHrcTrav::Show: _WorldVis= true; break;
00737                 default: break;
00738         }
00739 
00740 
00741         // If I have an ancestor Skeleton Model, I must be binded in ClipTrav to the SonsOfAncestorSkeletonModelGroup
00742         updateClipTravForAncestorSkeleton();
00743 
00744 }

void NL3D::CTransform::updateWorldMatrixFromFather  )  [protected, inherited]
 

For Skeleton Object Stick. update the wolrd matrix. no-op if skinned. no-op if no AcnestorSkeletonModel. use standard father WorldMatrix if !_FatherSkeletonModel else get the correct boneId WorldMatrix from _FatherSkeletonModel

Definition at line 905 of file transform.cpp.

References NL3D::CTransform::_AncestorSkeletonModel, NL3D::CTransform::_FatherBoneId, NL3D::CTransform::_FatherSkeletonModel, NL3D::CTransform::_LocalMatrix, NL3D::CTransform::_WorldMatrix, Bones, NL3D::CTransform::hrcGetParent(), and NL3D::CTransform::isSkinned().

Referenced by NL3D::CTransform::forceCompute(), and NL3D::CTransform::traverseAnimDetail().

00906 {
00907         // If I am not skinned, and If I have a skeleton ancestor
00908         if(!isSkinned() && _AncestorSkeletonModel )
00909         {
00910                 // Compute the HRC _WorldMatrix.
00911                 // if I am not sticked.
00912                 if(!_FatherSkeletonModel)
00913                 {
00914                         // get the normal father worldMatrix in Hrc.
00915                         CTransform      *fatherTransform= hrcGetParent();
00916                         // if exist
00917                         if(fatherTransform)
00918                         {
00919                                 const CMatrix &parentWM= fatherTransform->_WorldMatrix;
00920                                 // combine worldMatrix
00921                                 _WorldMatrix= parentWM * _LocalMatrix;
00922                         }
00923                         else
00924                                 _WorldMatrix= _LocalMatrix;
00925                 }
00926                 else
00927                 {
00928                         // get the worldMatrix of the bone if I am sticked.
00929                         const CMatrix &parentWM= _FatherSkeletonModel->Bones[_FatherBoneId].getWorldMatrix();
00930                         // combine worldMatrix
00931                         _WorldMatrix= parentWM * _LocalMatrix;
00932                 }
00933         }
00934 }

bool NL3D::CTransform::useMergedPointLight  )  const [inline, inherited]
 

return true if the current light contribution of this model use a MergedPointLight

Definition at line 369 of file transform.h.

References NL3D::CTransform::_LightContribution, and NL3D::CLightContribution::UseMergedPointLight.

00369 {return _LightContribution.UseMergedPointLight;}


Friends And Related Function Documentation

friend struct CPtrInfo [friend, inherited]
 

Definition at line 67 of file smart_ptr.h.

friend class CSkeletonShape [friend]
 

Definition at line 357 of file skeleton_model.h.


Field Documentation

CSkeletonModel* NL3D::CTransform::_AncestorSkeletonModel [protected, inherited]
 

Definition at line 851 of file transform.h.

Referenced by NL3D::CClipTrav::clipSkeletonShadowMaps(), NL3D::CTransform::CTransform(), NL3D::CTransform::getAncestorSkeletonModel(), NL3D::CAnimDetailTrav::traverse(), NL3D::CTransform::traverseClip(), NL3D::CTransform::updateClipTravForAncestorSkeleton(), NL3D::CTransform::updateWorld(), and NL3D::CTransform::updateWorldMatrixFromFather().

sint NL3D::CSkeletonModel::_AnimCtrlUsage [private]
 

Definition at line 508 of file skeleton_model.h.

Referenced by CSkeletonModel(), setBoneAnimCtrl(), and traverseAnimDetail().

TTransformArray NL3D::CSkeletonModel::_AnimDetailSkins [private]
 

Definition at line 386 of file skeleton_model.h.

Referenced by traverseAnimDetail(), and updateSkinRenderLists().

std::vector<CBoneCompute> NL3D::CSkeletonModel::_BoneToCompute [private]
 

List of bones to compute.

Definition at line 429 of file skeleton_model.h.

Referenced by computeWorldBBoxForShadow(), getNumBoneComputed(), initBoneUsages(), traverseAnimDetail(), and updateBoneToCompute().

bool NL3D::CSkeletonModel::_BoneToComputeDirty [private]
 

Flag set if the MRSkeleton lod change, or if a new bone Usage change (only if was 0 or become 0).

Definition at line 431 of file skeleton_model.h.

Referenced by decBoneUsage(), incBoneUsage(), initBoneUsages(), setDisplayLodCharacterFlag(), traverseAnimDetail(), and updateBoneToCompute().

std::vector<CBoneUsage> NL3D::CSkeletonModel::_BoneUsage [private]
 

The list of BoneUsage. Updated by Meshes, stickObject(), and lod changes.

Definition at line 427 of file skeleton_model.h.

Referenced by computeCurrentBBox(), decBoneUsage(), forceComputeBone(), getActiveBoneSkinMatrix(), incBoneUsage(), initBoneUsages(), isBoneComputed(), and updateBoneToCompute().

sint64 NL3D::CTransform::_ClipDate [protected, inherited]
 

date of last traverseClip()

Definition at line 865 of file transform.h.

Referenced by NL3D::CTransform::CTransform(), and NL3D::CTransform::traverseClip().

bool NL3D::CTransform::_ClipLinkedInSonsOfAncestorSkeletonModelGroup [protected, inherited]
 

Definition at line 849 of file transform.h.

Referenced by bindSkin(), NL3D::CTransform::CTransform(), and NL3D::CTransform::updateClipTravForAncestorSkeleton().

CLodCharacterInstance NL3D::CSkeletonModel::_CLodInstance [private]
 

The Lod instance. -1 by default.

Definition at line 470 of file skeleton_model.h.

Referenced by computeCLodVertexAlpha(), computeDisplayLodCharacterPriority(), computeLodTexture(), getLodCharacterAnimId(), getLodCharacterAnimTime(), getLodCharacterShape(), getLodCharacterWrapMode(), renderCLod(), setDisplayLodCharacterFlag(), setLodCharacterAnimId(), setLodCharacterAnimTime(), setLodCharacterShape(), and setLodCharacterWrapMode().

bool NL3D::CSkeletonModel::_CLodVertexAlphaDirty [private]
 

dirt when a bindSkin/stickObject/detachSkeletonSon is called

Definition at line 474 of file skeleton_model.h.

Referenced by CSkeletonModel(), dirtLodVertexAlpha(), and renderCLod().

uint NL3D::CSkeletonModel::_CurLod [private]
 

The current lod activated for this skeleton.

Definition at line 433 of file skeleton_model.h.

Referenced by initBoneUsages(), traverseAnimDetail(), and updateBoneToCompute().

float NL3D::CSkeletonModel::_CurLodInterp [private]
 

The current lod Interpolation Value for this skeleton.

Definition at line 435 of file skeleton_model.h.

Referenced by initBoneUsages(), and traverseAnimDetail().

bool NL3D::CSkeletonModel::_DefaultMRMSetup [private]
 

Definition at line 380 of file skeleton_model.h.

Referenced by changeMRMDistanceSetup(), CSkeletonModel(), resetDefaultMRMDistanceSetup(), and updateSkinRenderLists().

bool NL3D::CSkeletonModel::_DisplayedAsLodCharacter [private]
 

True if the skeleton model and his skins have to be displayed with a CLodCharacterShape, instead of the std way This state is modified early during the HRC Traversal. Because Clip traversal need this result.

Definition at line 463 of file skeleton_model.h.

Referenced by CSkeletonModel(), isDisplayedAsLodCharacter(), and setDisplayLodCharacterFlag().

bool NL3D::CTransform::_DontUnfreezeChildren [protected, inherited]
 

Definition at line 848 of file transform.h.

Referenced by NL3D::CTransform::CTransform(), NL3D::CTransform::setDontUnfreezeChildren(), and NL3D::CTransform::updateWorld().

uint NL3D::CTransform::_FatherBoneId [protected, inherited]
 

Deriver must change this method if isSkinnable(). It return a list of sphere relative to each bone of the father skeleton. Use with getSkinBoneUsage() to know to wich bone this sphere apply NB: if a sphere radius is -1, it means that the bone is not used (for any reason...) default is to return NULL.

Definition at line 618 of file transform.h.

Referenced by computeCLodVertexAlpha(), detachSkeletonSon(), NL3D::CTransform::forceCompute(), stickObjectEx(), and NL3D::CTransform::updateWorldMatrixFromFather().

CSkeletonModel* NL3D::CTransform::_FatherSkeletonModel [protected, inherited]
 

Deriver must change this method if isSkinnable(). It return a list of sphere relative to each bone of the father skeleton. Use with getSkinBoneUsage() to know to wich bone this sphere apply NB: if a sphere radius is -1, it means that the bone is not used (for any reason...) default is to return NULL.

Definition at line 616 of file transform.h.

Referenced by bindSkin(), NL3D::CTransform::CTransform(), detachSkeletonSon(), NL3D::CTransform::forceCompute(), forceComputeBone(), NL3D::CTransform::getSkeletonModel(), NL3D::CTransform::heritVisibility(), NL3D::CTransform::hide(), NL3D::CTransform::registerToChannelMixer(), NL3D::CTransform::setIsForceAnimDetail(), NL3D::CTransform::setOpacity(), NL3D::CTransform::setTransparency(), NL3D::CTransform::show(), stickObjectEx(), NL3D::CTransform::traverseClip(), NL3D::CTransform::updateWorld(), NL3D::CTransform::updateWorldMatrixFromFather(), and NL3D::CTransform::~CTransform().

bool NL3D::CTransform::_Frozen [protected, inherited]
 

Definition at line 847 of file transform.h.

Referenced by NL3D::CTransform::CTransform(), NL3D::CTransform::freeze(), NL3D::CTransform::freezeHRC(), NL3D::CTransform::update(), and NL3D::CTransform::updateWorld().

sint NL3D::CTransform::_IndexInVisibleList [protected, inherited]
 

date of last traverseClip()

Definition at line 869 of file transform.h.

Referenced by NL3D::CClipTrav::addVisibleModel(), NL3D::CTransform::CTransform(), and NL3D::CTransform::~CTransform().

std::list<CSkeletonModel*>::iterator NL3D::CSkeletonModel::_ItSkeletonInScene [private]
 

Definition at line 367 of file skeleton_model.h.

Referenced by initModel(), and ~CSkeletonModel().

CMRMLevelDetail NL3D::CSkeletonModel::_LevelDetail [private]
 

Definition at line 389 of file skeleton_model.h.

CLightContribution NL3D::CTransform::_LightContribution [protected, inherited]
 

The contribution of all lights. This enlarge the struct only of approx 15%.

Definition at line 626 of file transform.h.

Referenced by NL3D::CTransform::freezeStaticLightSetup(), NL3D::CTransform::getLightContribution(), renderSkins(), NL3D::CTransform::resetLighting(), NL3D::CTransform::traverseLight(), NL3D::CTransform::unfreezeStaticLightSetup(), NL3D::CTransform::updateWorld(), and NL3D::CTransform::useMergedPointLight().

CLightingManager::CQGItLightedModel NL3D::CTransform::_LightedModelIt [protected, inherited]
 

each transform may be in a quadGird of lighted models (see CLightingManager)

Definition at line 634 of file transform.h.

Referenced by NL3D::CTransform::unfreezeHRC(), NL3D::CTransform::update(), and NL3D::CTransform::~CTransform().

CLoadBalancingGroup* NL3D::CTransform::_LoadBalancingGroup [protected, inherited]
 

Definition at line 894 of file transform.h.

Referenced by NL3D::CTransform::CTransform(), NL3D::CTransform::getLoadBalancingGroup(), NL3D::CTransform::initModel(), and NL3D::CTransform::setLoadBalancingGroup().

sint64 NL3D::CTransform::_LocalDate [protected, inherited]
 

Definition at line 841 of file transform.h.

Referenced by NL3D::CTransform::CTransform(), NL3D::CTransform::update(), and NL3D::CTransform::updateWorld().

CMatrix NL3D::CTransform::_LocalMatrix [protected, inherited]
 

Hrc IN variables.

Reimplemented from NL3D::ITransformable.

Definition at line 839 of file transform.h.

Referenced by NL3D::CTransform::CTransform(), NL3D::CTransform::update(), NL3D::CTransform::updateWorld(), and NL3D::CTransform::updateWorldMatrixFromFather().

CHrcTrav::TVisibility NL3D::CTransform::_LocalVis [protected, inherited]
 

Definition at line 840 of file transform.h.

Referenced by NL3D::CTransform::CTransform(), NL3D::CTransform::update(), and NL3D::CTransform::updateWorld().

float NL3D::CSkeletonModel::_LodCharacterDistance [private]
 

see setLodCharacterDistance

Definition at line 466 of file skeleton_model.h.

Referenced by computeDisplayLodCharacterPriority(), CSkeletonModel(), getLodCharacterDistance(), setDisplayLodCharacterFlag(), and setLodCharacterDistance().

float NL3D::CSkeletonModel::_LodInterpMultiplier [private]
 

For lod interpolation. Inverse of distance. If 0, disable interpolation.

Definition at line 437 of file skeleton_model.h.

Referenced by getInterpolationDistance(), initBoneUsages(), setInterpolationDistance(), traverseAnimDetail(), and updateBoneToCompute().

float NL3D::CSkeletonModel::_OOLodCharacterDistance [private]
 

recompute _CLodVertexAlpha, ignoring _CLodVertexAlphaDirty

Definition at line 467 of file skeleton_model.h.

Referenced by computeDisplayLodCharacterPriority(), CSkeletonModel(), and setLodCharacterDistance().

TTransformArray NL3D::CSkeletonModel::_OpaqueSkins [private]
 

Definition at line 383 of file skeleton_model.h.

Referenced by renderShadowSkins(), renderSkins(), and updateSkinRenderLists().

uint32 NL3D::CTransform::_RenderFilterType [protected, inherited]
 

State for renderFiltering. Default is 0xFFFFFFFF (always displayed) Deriver work to change this value

Definition at line 830 of file transform.h.

Referenced by NL3D::CTransform::CTransform(), and NL3D::CTransform::traverseClip().

CShadowMap* NL3D::CSkeletonModel::_ShadowMap [private]
 

Definition at line 513 of file skeleton_model.h.

TTransformSet NL3D::CSkeletonModel::_Skins [private]
 

The skins.

Definition at line 373 of file skeleton_model.h.

Referenced by bindSkin(), computeCLodVertexAlpha(), computeLodTexture(), detachSkeletonSon(), updateSkinRenderLists(), and ~CSkeletonModel().

bool NL3D::CSkeletonModel::_SkinToRenderDirty [private]
 

Definition at line 378 of file skeleton_model.h.

Referenced by CSkeletonModel(), dirtSkinRenderLists(), and updateSkinRenderLists().

TTransformSet NL3D::CSkeletonModel::_StickedObjects [private]
 

The StickedObjects.

Definition at line 375 of file skeleton_model.h.

Referenced by computeCLodVertexAlpha(), computeWorldBBoxForShadow(), detachSkeletonSon(), renderIntoSkeletonShadowMap(), stickObjectEx(), and ~CSkeletonModel().

TTransformArray NL3D::CSkeletonModel::_TransparentSkins [private]
 

Definition at line 384 of file skeleton_model.h.

Referenced by renderShadowSkins(), renderSkins(), and updateSkinRenderLists().

bool NL3D::CTransform::_Visible [protected, inherited]
 

set to true is the object is visible (not clipped).

Definition at line 867 of file transform.h.

Referenced by NL3D::CTransform::CTransform(), NL3D::CTransform::isClipVisible(), and NL3D::CTransform::traverseClip().

sint64 NL3D::CTransform::_WorldDate [protected, inherited]
 

Definition at line 845 of file transform.h.

Referenced by NL3D::CTransform::CTransform(), NL3D::CTransform::hrcLinkSon(), NL3D::CTransform::hrcUnlink(), and NL3D::CTransform::updateWorld().

CMatrix NL3D::CTransform::_WorldMatrix [protected, inherited]
 

Hrc OUT variables.

Definition at line 843 of file transform.h.

Referenced by NL3D::CTransform::updateWorld(), and NL3D::CTransform::updateWorldMatrixFromFather().

bool NL3D::CTransform::_WorldVis [protected, inherited]
 

Definition at line 844 of file transform.h.

Referenced by NL3D::CTransform::CTransform(), NL3D::CTransform::isHrcVisible(), NL3D::CTransform::traverseClip(), and NL3D::CTransform::updateWorld().

std::vector<CBone> NL3D::CSkeletonModel::Bones
 

The list of CBone, created from the CSkeletonShape. They are odered in depth-first order.

Definition at line 98 of file skeleton_model.h.

Referenced by NL3D::CLodCharacterBuilder::applySkin(), computeAllBones(), NL3D::CMeshMRMSkinnedGeom::computeBonesId(), NL3D::CMeshMRMGeom::computeBonesId(), NL3D::CMeshGeom::computeBonesId(), computeCLodVertexAlpha(), computeCurrentBBox(), computeRenderedBBox(), NL3D::CSkeletonShape::createInstance(), NL3D::CSkeletonUser::CSkeletonUser(), decForcedBoneUsageAndParents(), NL3D::CTargetAnimCtrl::execute(), flagBoneAndParents(), forceComputeBone(), getActiveBoneSkinMatrix(), getBoneAnimCtrl(), NL3D::CTargetAnimCtrl::getCurrentLSRotationFromBone(), getLightHotSpotInWorld(), incForcedBoneUsageAndParents(), initBoneUsages(), registerToChannelMixer(), setBoneAnimCtrl(), NL3D::CTransformShape::traverseLoadBalancingPass0(), updateBoneToCompute(), NL3D::CMeshMRMSkinnedGeom::updateSkeletonUsage(), NL3D::CMeshMRMGeom::updateSkeletonUsage(), NL3D::CMeshGeom::updateSkeletonUsage(), updateSkinRenderLists(), and NL3D::CTransform::updateWorldMatrixFromFather().

sint NLMISC::CRefCount::crefs [mutable, inherited]
 

Definition at line 79 of file smart_ptr.h.

Referenced by NLMISC::CRefCount::CRefCount(), NLMISC::CRefCount::getRefCount(), and NLMISC::CRefCount::~CRefCount().

CRefCount::CPtrInfo NLMISC::CRefCount::NullPtrInfo [static, inherited]
 

Referenced by NLMISC::CRefCount::CRefCount().

CPtrInfo* NLMISC::CRefCount::pinfo [mutable, inherited]
 

Definition at line 80 of file smart_ptr.h.

Referenced by NLMISC::CRefCount::CRefCount(), and NLMISC::CRefCount::~CRefCount().

CSmartPtr<IShape> NL3D::CTransformShape::Shape [inherited]
 

The shape, the object instancied.

Definition at line 72 of file transform_shape.h.

Referenced by NL3D::CTransformShape::clip(), computeLodTexture(), NL3D::CWaveMakerShape::createInstance(), NL3D::CWaterShape::createInstance(), NL3D::CSkeletonShape::createInstance(), NL3D::IShape::createInstance(), NL3D::CSegRemanenceShape::createInstance(), NL3D::CScene::createInstance(), NL3D::CParticleSystemShape::createInstance(), NL3D::CMeshMultiLod::createInstance(), NL3D::CMeshMRMSkinned::createInstance(), NL3D::CMeshMRM::createInstance(), NL3D::CMesh::createInstance(), NL3D::CFlareShape::createInstance(), NL3D::CScene::deleteInstance(), NL3D::CTransformShape::getAABBox(), NL3D::CTransformShape::getNumTriangles(), NL3D::CSkeletonUser::getShapeDistMax(), NL3D::CInstanceUser::getShapeDistMax(), NL3D::CTransformShape::profileRender(), NL3D::CSkeletonUser::setShapeDistMax(), NL3D::CInstanceUser::setShapeDistMax(), and NL3D::CTransformShape::traverseRender().


The documentation for this class was generated from the following files:
Generated on Tue Mar 16 07:46:05 2004 for NeL by doxygen 1.3.6