#include <mesh_multi_lod.h>
Inheritance diagram for NL3D::CMeshMultiLod:

This mesh handle several meshes of any kind of shape (MRM, standard, coarse meshes..) At run time, it chooses what LOD meshes it must render according to its settings.
Nevrax France
Definition at line 52 of file mesh_multi_lod.h.
Public Types | |
Structures for building a mesh. | |
| typedef std::map< std::string, CLightInfoMapListV7 > | TLightInfoMapV7 |
| typedef std::vector< CLightMapInfoList > | TLightMapInfo |
Structures for building a mesh. | |
| typedef std::map< std::string, CLightInfoMapListV7 > | TLightInfoMapV7 |
| typedef std::vector< CLightMapInfoList > | TLightMapInfo |
Structures for building a mesh. | |
| typedef std::map< std::string, CLightInfoMapListV7 > | TLightInfoMapV7 |
| typedef std::vector< CLightMapInfoList > | TLightMapInfo |
Structures for building a mesh. | |
| typedef std::map< std::string, CLightInfoMapListV7 > | TLightInfoMapV7 |
| typedef std::vector< CLightMapInfoList > | TLightMapInfo |
Structures for building a mesh. | |
| typedef std::map< std::string, CLightInfoMapListV7 > | TLightInfoMapV7 |
| typedef std::vector< CLightMapInfoList > | TLightMapInfo |
Public Member Functions | |
| void | changeMRMDistanceSetup (float distanceFinest, float distanceMiddle, float distanceCoarsest) |
| void | flushTextures (IDriver &driver, uint selectedTexture) |
| Flush textures. | |
| virtual std::string | getClassName ()=0 |
| float | getDistMax () const |
| const IMeshGeom & | getMeshGeom (uint slot) const |
| Geometry accessor. | |
| uint | getNumSlotMesh () const |
| Get slot mesh count. | |
| virtual float | getNumTriangles (float distance) |
| should not be called direclty as the intance of this shape will use 'getNumTrianglesWithCoarsestDist' themselves to get the correct distance. | |
| float | getNumTrianglesWithCoarsestDist (float distance, float coarsestMeshDist) const |
| const sint & | getRefCount () const |
| IMeshGeom * | getSlotMesh (uint i, bool &coarseMesh) |
| Get a slot mesh. | |
| bool | isLightable () const |
| Is this mesh lightable? true if one of his materials is not a lightmap. NB: result stored in file. | |
| bool | isStatic () const |
| Is static mesh ? | |
| void | serialMeshBase (NLMISC::IStream &f) throw (NLMISC::EStream) |
| serial the base Part of this mesh. | |
| void | setDistMax (float distMax) |
| virtual bool | useLightingLocalAttenuation () const |
| tells if the shape wants LocalAttenuation for RealTime lighting. Default is false | |
animated material mgt. do it after CMesh::build(), or CMeshMRM::build() | |
| CMaterialBase * | getAnimatedMaterial (uint id) |
| return NULL if this material is NOT animated. (or if material do not exist) | |
| void | setAnimatedMaterial (uint id, const std::string &matName) |
| setup a material as animated. Material must exist or else no-op. | |
Automatic animation | |
| bool | getAutoAnim () const |
| void | setAutoAnim (bool on=true) |
access default tracks. | |
| CTrackDefaultRGBA * | getDefaultLMFactor () |
| CTrackDefaultVector * | getDefaultPivot () |
| CTrackDefaultVector * | getDefaultPos () |
| CTrackDefaultVector * | getDefaultRotEuler () |
| CTrackDefaultQuat * | getDefaultRotQuat () |
| CTrackDefaultVector * | getDefaultScale () |
LodCharacterTexture | |
| const CLodCharacterTexture * | getLodCharacterTexture () const |
| get the lod texture info. see CSkeletonModel Lod system. NULL per default. NB: serialised | |
| void | resetLodCharacterTexture () |
| reset the lod texture info. see CSkeletonModel Lod system. | |
| void | setupLodCharacterTexture (CLodCharacterTexture &lodText) |
| setup the lod texture info. see CSkeletonModel Lod system | |
Material accessors | |
| const CMaterial & | getMaterial (uint id) const |
| Get a material, const version. | |
| CMaterial & | getMaterial (uint id) |
| Get a material. | |
| uint | getNbMaterial () const |
| Get the number of materials in the mesh. | |
animated material mgt. do it after CMesh::build(), or CMeshMRM::build() | |
| CMaterialBase * | getAnimatedMaterial (uint id) |
| return NULL if this material is NOT animated. (or if material do not exist) | |
| void | setAnimatedMaterial (uint id, const std::string &matName) |
| setup a material as animated. Material must exist or else no-op. | |
Automatic animation | |
| bool | getAutoAnim () const |
| void | setAutoAnim (bool on=true) |
access default tracks. | |
| CTrackDefaultRGBA * | getDefaultLMFactor () |
| CTrackDefaultVector * | getDefaultPivot () |
| CTrackDefaultVector * | getDefaultPos () |
| CTrackDefaultVector * | getDefaultRotEuler () |
| CTrackDefaultQuat * | getDefaultRotQuat () |
| CTrackDefaultVector * | getDefaultScale () |
LodCharacterTexture | |
| const CLodCharacterTexture * | getLodCharacterTexture () const |
| get the lod texture info. see CSkeletonModel Lod system. NULL per default. NB: serialised | |
| void | resetLodCharacterTexture () |
| reset the lod texture info. see CSkeletonModel Lod system. | |
| void | setupLodCharacterTexture (CLodCharacterTexture &lodText) |
| setup the lod texture info. see CSkeletonModel Lod system | |
Material accessors | |
| const CMaterial & | getMaterial (uint id) const |
| Get a material, const version. | |
| CMaterial & | getMaterial (uint id) |
| Get a material. | |
| uint | getNbMaterial () const |
| Get the number of materials in the mesh. | |
animated material mgt. do it after CMesh::build(), or CMeshMRM::build() | |
| CMaterialBase * | getAnimatedMaterial (uint id) |
| return NULL if this material is NOT animated. (or if material do not exist) | |
| void | setAnimatedMaterial (uint id, const std::string &matName) |
| setup a material as animated. Material must exist or else no-op. | |
Automatic animation | |
| bool | getAutoAnim () const |
| void | setAutoAnim (bool on=true) |
access default tracks. | |
| CTrackDefaultRGBA * | getDefaultLMFactor () |
| CTrackDefaultVector * | getDefaultPivot () |
| CTrackDefaultVector * | getDefaultPos () |
| CTrackDefaultVector * | getDefaultRotEuler () |
| CTrackDefaultQuat * | getDefaultRotQuat () |
| CTrackDefaultVector * | getDefaultScale () |
LodCharacterTexture | |
| const CLodCharacterTexture * | getLodCharacterTexture () const |
| get the lod texture info. see CSkeletonModel Lod system. NULL per default. NB: serialised | |
| void | resetLodCharacterTexture () |
| reset the lod texture info. see CSkeletonModel Lod system. | |
| void | setupLodCharacterTexture (CLodCharacterTexture &lodText) |
| setup the lod texture info. see CSkeletonModel Lod system | |
Material accessors | |
| const CMaterial & | getMaterial (uint id) const |
| Get a material, const version. | |
| CMaterial & | getMaterial (uint id) |
| Get a material. | |
| uint | getNbMaterial () const |
| Get the number of materials in the mesh. | |
animated material mgt. do it after CMesh::build(), or CMeshMRM::build() | |
| CMaterialBase * | getAnimatedMaterial (uint id) |
| return NULL if this material is NOT animated. (or if material do not exist) | |
| void | setAnimatedMaterial (uint id, const std::string &matName) |
| setup a material as animated. Material must exist or else no-op. | |
Automatic animation | |
| bool | getAutoAnim () const |
| void | setAutoAnim (bool on=true) |
access default tracks. | |
| CTrackDefaultRGBA * | getDefaultLMFactor () |
| CTrackDefaultVector * | getDefaultPivot () |
| CTrackDefaultVector * | getDefaultPos () |
| CTrackDefaultVector * | getDefaultRotEuler () |
| CTrackDefaultQuat * | getDefaultRotQuat () |
| CTrackDefaultVector * | getDefaultScale () |
LodCharacterTexture | |
| const CLodCharacterTexture * | getLodCharacterTexture () const |
| get the lod texture info. see CSkeletonModel Lod system. NULL per default. NB: serialised | |
| void | resetLodCharacterTexture () |
| reset the lod texture info. see CSkeletonModel Lod system. | |
| void | setupLodCharacterTexture (CLodCharacterTexture &lodText) |
| setup the lod texture info. see CSkeletonModel Lod system | |
Material accessors | |
| const CMaterial & | getMaterial (uint id) const |
| Get a material, const version. | |
| CMaterial & | getMaterial (uint id) |
| Get a material. | |
| uint | getNbMaterial () const |
| Get the number of materials in the mesh. | |
Structures for building a multi lod mesh. | |
| void | build (CMeshMultiLodBuild &mbuild) |
| Build a mesh from material info, and a builded MeshGeom. WARNING: This has a side effect of deleting AnimatedMaterials. | |
From IShape | |
| virtual bool | clip (const std::vector< CPlane > &pyramid, const CMatrix &worldMatrix) |
| clip this mesh in a driver. | |
| virtual CTransformShape * | createInstance (CScene &scene) |
| Create a CMeshInstance, which contains materials. | |
| virtual void | getAABBox (NLMISC::CAABBox &bbox) const |
| Get bbox. | |
| NLMISC_DECLARE_CLASS (CMeshMultiLod) | |
| Declare name of the shape. | |
| virtual void | profileSceneRender (CRenderTrav *rdrTrav, CTransformShape *trans, bool opaquePass) |
| profiling | |
| virtual void | render (IDriver *drv, CTransformShape *trans, bool passOpaque) |
| render() this mesh in a driver. | |
| virtual void | serial (NLMISC::IStream &f) throw (NLMISC::EStream) |
| serial this mesh. | |
animated material mgt. do it after CMesh::build(), or CMeshMRM::build() | |
| CMaterialBase * | getAnimatedMaterial (uint id) |
| return NULL if this material is NOT animated. (or if material do not exist) | |
| void | setAnimatedMaterial (uint id, const std::string &matName) |
| setup a material as animated. Material must exist or else no-op. | |
Automatic animation | |
| bool | getAutoAnim () const |
| void | setAutoAnim (bool on=true) |
access default tracks. | |
| CTrackDefaultRGBA * | getDefaultLMFactor () |
| CTrackDefaultVector * | getDefaultPivot () |
| CTrackDefaultVector * | getDefaultPos () |
| CTrackDefaultVector * | getDefaultRotEuler () |
| CTrackDefaultQuat * | getDefaultRotQuat () |
| CTrackDefaultVector * | getDefaultScale () |
LodCharacterTexture | |
| const CLodCharacterTexture * | getLodCharacterTexture () const |
| get the lod texture info. see CSkeletonModel Lod system. NULL per default. NB: serialised | |
| void | resetLodCharacterTexture () |
| reset the lod texture info. see CSkeletonModel Lod system. | |
| void | setupLodCharacterTexture (CLodCharacterTexture &lodText) |
| setup the lod texture info. see CSkeletonModel Lod system | |
Material accessors | |
| const CMaterial & | getMaterial (uint id) const |
| Get a material, const version. | |
| CMaterial & | getMaterial (uint id) |
| Get a material. | |
| uint | getNbMaterial () const |
| Get the number of materials in the mesh. | |
Mesh Block Render Interface | |
| virtual IMeshGeom * | supportMeshBlockRendering (CTransformShape *trans, float &polygonCount) const |
Data Fields | |
| TLightMapInfo | _LightInfos |
| sint | crefs |
| CPtrInfo * | pinfo |
Static Public Attributes | |
| CPtrInfo | NullPtrInfo |
Protected Types | |
| typedef std::map< uint32, CMaterialBase > | TAnimatedMaterialMap |
| Animated Material mgt. | |
Protected Member Functions | |
| void | applyMaterialUsageOptim (const std::vector< bool > &materialUsed, std::vector< sint > &remap) |
| void | buildMeshBase (CMeshBaseBuild &m) |
| Just copy informations from a CMeshBaseBuild. | |
| void | instanciateMeshBase (CMeshBaseInstance *mi, CScene *ownerScene) |
| instanciate MeshBase part to an instance (a CMeshBaseInstance). | |
Protected Attributes | |
| TAnimatedMaterialMap | _AnimatedMaterials |
| std::vector< CMorphBase > | _AnimatedMorph |
| bool | _AutoAnim |
| CTrackDefaultRGBA | _DefaultLMFactor |
| CTrackDefaultVector | _DefaultPivot |
| CTrackDefaultVector | _DefaultPos |
| Transform default tracks. Those default tracks are instancied, ie, CInstanceMesh will have the same and can't specialize it. | |
| CTrackDefaultVector | _DefaultRotEuler |
| CTrackDefaultQuat | _DefaultRotQuat |
| CTrackDefaultVector | _DefaultScale |
| float | _DistMax |
| Default to -1. | |
| bool | _IsLightable |
| Is this mesh lightable?? | |
| std::vector< CMaterial > | _Materials |
| The Materials. | |
| bool | _UseLightingLocalAttenuation |
| Is this mesh Use Lighting Local Attenuation ?? | |
Private Member Functions | |
| void | clear () |
| Clear the mesh. | |
| void | compileCoarseMeshes () |
| compile Coarse Meshs when builded/loaded. | |
| void | compileDistMax () |
| copileDistMax when builded/loaded. | |
| void | instanciateCoarseMeshSpace (CMeshMultiLodInstance *mi) |
| called at createInstance() time | |
| void | profileMeshGeom (uint slot, CRenderTrav *rdrTrav, CMeshMultiLodInstance *trans, float numPoylgons, uint32 rdrFlags) |
| Profile the MeshGeom of a slot, even if coarseMesh. | |
| void | renderCoarseMesh (uint slot, IDriver *drv, CMeshMultiLodInstance *trans, CCoarseMeshManager *manager) |
| Render the CoarseMesh of a slot. must be a coarseMesh, and shoudl be called only in passOpaque. | |
| void | renderMeshGeom (uint slot, IDriver *drv, CMeshMultiLodInstance *trans, float numPoylgons, uint32 rdrFlags, float alpha, CCoarseMeshManager *manager) |
| Render the MeshGeom of a slot, even if coarseMesh. | |
Private Attributes | |
| std::vector< CMeshSlot > | _MeshVector |
| Vector of meshes. | |
| bool | _StaticLod |
| Static or dynamic load ? Yoyo: no more used, but leave for possible usage later... | |
Friends | |
| class | CMeshMultiLodInstance |
| struct | CPtrInfo |
|
|
Animated Material mgt.
Definition at line 239 of file mesh_base.h. |
|
|
Definition at line 76 of file mesh_base.h. Referenced by NL3D::CMeshBase::serialMeshBase(). |
|
|
Definition at line 111 of file mesh_base.h. |
|
||||||||||||
|
delete any material not used, and build remap table (old to new). _AnimatedMaterials are reseted resetLodCharacterTexture(); is called Definition at line 333 of file mesh_base.cpp. References NL3D::CMeshBase::_AnimatedMaterials, NL3D::CMeshBase::_LightInfos, count, nlassert, NL3D::CMeshBase::resetLodCharacterTexture(), sint, NL3D::CMeshBase::CLightMapInfoList::StageList, and uint.
00334 {
00335 nlassert(_Materials.size()==materialUsed.size());
00336
00337 // security reset
00338 resetLodCharacterTexture();
00339 _AnimatedMaterials.clear();
00340
00341 // init all ids to "Not Used"
00342 remap.clear();
00343 remap.resize(_Materials.size(), -1);
00344
00345 // remove unused materials and build remap
00346 vector<CMaterial>::iterator itMat= _Materials.begin();
00347 uint dstIdx= 0;
00348 uint i;
00349 for(i=0;i<materialUsed.size();i++)
00350 {
00351 // if used, still use it, and remap.
00352 if(materialUsed[i])
00353 {
00354 remap[i]= dstIdx;
00355 itMat++;
00356 dstIdx++;
00357 }
00358 // remove from the array
00359 else
00360 {
00361 itMat= _Materials.erase(itMat);
00362 }
00363 }
00364
00365 // apply the remap to LightMaps infos
00366 const uint count = _LightInfos.size ();
00367 for (i=0; i<count; i++)
00368 {
00369 CLightMapInfoList &mapInfoList = _LightInfos[i];
00370 std::list<CMeshBase::CLightMapInfoList::CMatStage>::iterator ite = mapInfoList.StageList.begin ();
00371 while (ite != mapInfoList.StageList.end ())
00372 {
00373 sint newId= remap[ite->MatId];
00374 // If material used
00375 if(newId>=0)
00376 {
00377 // apply remap on the material id
00378 ite->MatId= newId;
00379 ite++;
00380 }
00381 else
00382 {
00383 // remove it from list of light infos
00384 ite= mapInfoList.StageList.erase(ite);
00385 }
00386 }
00387 }
00388 }
|
|
|
Build a mesh from material info, and a builded MeshGeom. WARNING: This has a side effect of deleting AnimatedMaterials.
Definition at line 52 of file mesh_multi_lod.cpp. References _MeshVector, _StaticLod, NL3D::CMeshMultiLod::CMeshMultiLodBuild::BaseMesh, clear(), compileCoarseMeshes(), compileDistMax(), NL3D::CMeshMultiLod::CMeshMultiLodBuild::LodMeshes, NL3D::CMeshMultiLod::CMeshSlot::MeshGeom, nlassert, NL3D::CMeshMultiLod::CMeshMultiLodBuild::StaticLod, and uint.
00053 {
00054 // Clear the mesh
00055 clear ();
00056
00057 // Build the base mesh
00058 CMeshBase::buildMeshBase (mbuild.BaseMesh);
00059
00060 // Static flag
00061 _StaticLod=mbuild.StaticLod;
00062
00063 // Resize the array
00064 _MeshVector.resize (mbuild.LodMeshes.size());
00065
00066 // For each slots
00067 for (uint slot=0; slot<mbuild.LodMeshes.size(); slot++)
00068 {
00069 // Dist max
00070 _MeshVector[slot].DistMax=mbuild.LodMeshes[slot].DistMax;
00071
00072 // BlendLength
00073 _MeshVector[slot].BlendLength=mbuild.LodMeshes[slot].BlendLength;
00074
00075 // Flags
00076 _MeshVector[slot].Flags=0;
00077
00078 // Blend in ?
00079 if (mbuild.LodMeshes[slot].Flags & CMeshMultiLodBuild::CBuildSlot::BlendIn)
00080 _MeshVector[slot].Flags|=CMeshSlot::BlendIn;
00081
00082 // Blend out ?
00083 if (mbuild.LodMeshes[slot].Flags & CMeshMultiLodBuild::CBuildSlot::BlendOut)
00084 _MeshVector[slot].Flags|=CMeshSlot::BlendOut;
00085
00086 // Coarse mesh ?
00087 if (mbuild.LodMeshes[slot].Flags & CMeshMultiLodBuild::CBuildSlot::CoarseMesh)
00088 {
00089 // Flag
00090 _MeshVector[slot].Flags|=CMeshSlot::CoarseMesh;
00091 }
00092
00093 // Is opaque
00094 if (mbuild.LodMeshes[slot].Flags & CMeshMultiLodBuild::CBuildSlot::IsOpaque)
00095 _MeshVector[slot].Flags|=CMeshSlot::IsOpaque;
00096
00097 // Is transparent
00098 if (mbuild.LodMeshes[slot].Flags & CMeshMultiLodBuild::CBuildSlot::IsTransparent)
00099 _MeshVector[slot].Flags|=CMeshSlot::IsTransparent;
00100
00101 // MeshGeom
00102 nlassert (mbuild.LodMeshes[slot].MeshGeom);
00103
00104 // Valid pointer ?
00105 if (_MeshVector[slot].Flags&CMeshSlot::CoarseMesh)
00106 {
00107 // If it is a coarse mesh, it must be a CMeshGeom.
00108 if (dynamic_cast<CMeshGeom*>(mbuild.LodMeshes[slot].MeshGeom)==NULL)
00109 {
00110 // If it is a coarse mesh, it must be a CMeshGeom.
00111 _MeshVector[slot].MeshGeom = NULL;
00112 delete mbuild.LodMeshes[slot].MeshGeom;
00113 }
00114 else
00115 // Ok, no prb
00116 _MeshVector[slot].MeshGeom = mbuild.LodMeshes[slot].MeshGeom;
00117 }
00118 else
00119 // Ok, no prb
00120 _MeshVector[slot].MeshGeom = mbuild.LodMeshes[slot].MeshGeom;
00121 }
00122
00123 // Sort the slot by the distance...
00124 for (int i=mbuild.LodMeshes.size()-1; i>0; i--)
00125 for (int j=0; j<i; j++)
00126 {
00127 // Bad sort ?
00128 if (_MeshVector[j].DistMax>_MeshVector[j+1].DistMax)
00129 {
00130 // Exchange slots
00131 CMeshSlot tmp=_MeshVector[j];
00132 _MeshVector[j]=_MeshVector[j+1];
00133 _MeshVector[j+1]=tmp;
00134 tmp.MeshGeom=NULL;
00135 }
00136 }
00137
00138 // Calc start and end polygon count
00139 for (uint k=0; k<mbuild.LodMeshes.size(); k++)
00140 {
00141 // Get start distance
00142 float startDist;
00143 if (k==0)
00144 startDist=0;
00145 else
00146 startDist=_MeshVector[k-1].DistMax;
00147
00148 // Get start poly count
00149 float startPolyCount;
00150 startPolyCount=_MeshVector[k].MeshGeom->getNumTriangles (startDist);
00151
00152 // Get end distance
00153 float endDist=_MeshVector[k].DistMax;
00154
00155 // Get end poly count
00156 if (k==mbuild.LodMeshes.size()-1)
00157 {
00158 _MeshVector[k].EndPolygonCount=_MeshVector[k].MeshGeom->getNumTriangles (endDist);
00159 if (startPolyCount==_MeshVector[k].EndPolygonCount)
00160 _MeshVector[k].EndPolygonCount=startPolyCount/2;
00161 }
00162 else
00163 _MeshVector[k].EndPolygonCount=_MeshVector[k+1].MeshGeom->getNumTriangles (endDist);
00164
00165 // Calc A
00166 if (endDist==startDist)
00167 _MeshVector[k].A=0;
00168 else
00169 _MeshVector[k].A=(_MeshVector[k].EndPolygonCount-startPolyCount)/(endDist-startDist);
00170
00171 // Calc A
00172 _MeshVector[k].B=_MeshVector[k].EndPolygonCount-_MeshVector[k].A*endDist;
00173 }
00174
00175 // End: compile some stuff
00176 compileDistMax();
00177 compileCoarseMeshes();
00178 }
|
|
|
||||||||||||||||
|
Change MRM Distance setup of the Lod 0 only. No op if the lod0 is not a CMeshMRMGeom NB: no-op if distanceFinest<0, distanceMiddle<=distanceFinest or if distanceCoarsest<=distanceMiddle.
Definition at line 609 of file mesh_multi_lod.cpp. References _MeshVector, NL3D::CMeshMRMGeom::changeMRMDistanceSetup(), and getNumSlotMesh(). Referenced by NL3D::CMeshMultiLodInstance::changeMRMDistanceSetup().
00610 {
00611 // no-op if empty.
00612 if(getNumSlotMesh ()==0)
00613 return;
00614
00615 // If not NULL
00616 if(_MeshVector[0].MeshGeom==NULL)
00617 return;
00618
00619 // verify it is a CMeshMRMGeom. else no-op.
00620 CMeshMRMGeom *mgeom= dynamic_cast<CMeshMRMGeom*>(_MeshVector[0].MeshGeom);
00621 if(mgeom==NULL)
00622 return;
00623
00624 // ok, setup.
00625 mgeom->changeMRMDistanceSetup(distanceFinest, distanceMiddle, distanceCoarsest);
00626 }
|
|
|
Clear the mesh.
Definition at line 403 of file mesh_multi_lod.cpp. References _MeshVector. Referenced by build().
00404 {
00405 _MeshVector.clear ();
00406 }
|
|
||||||||||||
|
clip this mesh in a driver.
Reimplemented from NL3D::IShape. Definition at line 211 of file mesh_multi_lod.cpp. References _MeshVector, NL3D::IMeshGeom::clip(), NL3D::CMeshMultiLod::CMeshSlot::MeshGeom, and uint.
00212 {
00213 // Look for the biggest mesh
00214 uint meshCount=_MeshVector.size();
00215 for (uint i=0; i<meshCount; i++)
00216 {
00217 // Ref on slot
00218 CMeshSlot &slot=_MeshVector[i];
00219
00220 // Is mesh present ?
00221 if (slot.MeshGeom)
00222 {
00223 // Clip this mesh
00224 return slot.MeshGeom->clip (pyramid, worldMatrix);
00225 }
00226 }
00227 return true;
00228 }
|
|
|
compile Coarse Meshs when builded/loaded.
Definition at line 765 of file mesh_multi_lod.cpp. References _MeshVector, NL3D::CMeshMultiLod::CMeshSlot::CoarseNumTris, NL3D::CMeshMultiLod::CMeshSlot::CoarseTriangles, NL3D::CMeshMultiLod::CMeshSlot::Flags, NL3D::CMeshGeom::getNbMatrixBlock(), NL3D::CMeshGeom::getNbRdrPass(), NL3D::CPrimitiveBlock::getNumTri(), NL3D::CMeshGeom::getRdrPassPrimitiveBlock(), NL3D::CPrimitiveBlock::getTriPointer(), NL3D::CMeshMultiLod::CMeshSlot::MeshGeom, uint, and uint32. Referenced by build().
00766 {
00767 // For All Slots that are CoarseMeshes.
00768 for(uint i=0;i<_MeshVector.size();i++)
00769 {
00770 CMeshSlot &slotRef= _MeshVector[i];
00771 if( slotRef.Flags & CMeshSlot::CoarseMesh )
00772 {
00773 // reset
00774 slotRef.CoarseNumTris= 0;
00775
00776 // Get a pointer on the geom mesh
00777 CMeshGeom *meshGeom= safe_cast<CMeshGeom*>(slotRef.MeshGeom);
00778
00779 // For All RdrPass of the 1st matrix block
00780 if( meshGeom->getNbMatrixBlock()>0 )
00781 {
00782 // 1st count
00783 for(uint i=0;i<meshGeom->getNbRdrPass(0);i++)
00784 {
00785 slotRef.CoarseNumTris+= meshGeom->getRdrPassPrimitiveBlock(0, i).getNumTri();
00786 }
00787
00788 // 2snd allocate and fill
00789 if( slotRef.CoarseNumTris )
00790 {
00791 slotRef.CoarseTriangles.resize(slotRef.CoarseNumTris * 3);
00792 uint32 *dstPtr= &slotRef.CoarseTriangles[0];
00793 for(uint i=0;i<meshGeom->getNbRdrPass(0);i++)
00794 {
00795 const CPrimitiveBlock &pb= meshGeom->getRdrPassPrimitiveBlock(0, i);
00796 uint numTris= pb.getNumTri();
00797 memcpy(dstPtr, pb.getTriPointer(), numTris*3*sizeof(uint32));
00798 dstPtr+= numTris*3;
00799 }
00800 }
00801 }
00802 }
00803 }
00804 }
|
|
|
copileDistMax when builded/loaded.
Definition at line 587 of file mesh_multi_lod.cpp. References _MeshVector. Referenced by build().
00588 {
00589 // Last element
00590 std::vector<CMeshSlot>::const_iterator ite=_MeshVector.end();
00591 ite--;
00592 if (ite!=_MeshVector.end())
00593 IShape::_DistMax= ite->DistMax;
00594 else
00595 IShape::_DistMax= -1;
00596 }
|
|
|
Create a CMeshInstance, which contains materials.
Reimplemented from NL3D::IShape. Definition at line 182 of file mesh_multi_lod.cpp. References NL3D::CMeshMultiLodInstance::_LastLodMatrixDate, _MeshVector, NL3D::CScene::createModel(), NL3D::CMeshMultiLodInstance::initRenderFilterType(), instanciateCoarseMeshSpace(), NL3D::CTransformShape::Shape, and uint.
00183 {
00184 // Create a CMeshInstance, an instance of a multi lod mesh.
00185 CMeshMultiLodInstance *mi=(CMeshMultiLodInstance*)scene.createModel(NL3D::MeshMultiLodInstanceId);
00186 mi->Shape= this;
00187 mi->_LastLodMatrixDate=0;
00188
00189 // instanciate the material part of the Mesh, ie the CMeshBase.
00190 CMeshBase::instanciateMeshBase(mi, &scene);
00191
00192 // Create the necessary space for Coarse Instanciation
00193 instanciateCoarseMeshSpace(mi);
00194
00195 // For all lods, do some instance init for MeshGeom
00196 for(uint i=0; i<_MeshVector.size(); i++)
00197 {
00198 if(_MeshVector[i].MeshGeom)
00199 _MeshVector[i].MeshGeom->initInstance(mi);
00200 }
00201
00202 // init the Filter type
00203 mi->initRenderFilterType();
00204
00205
00206 return mi;
00207 }
|
|
||||||||||||
|
Flush textures. Flush material textures Implements NL3D::IShape. Definition at line 392 of file mesh_base.cpp. References uint.
00393 {
00394 // Mat count
00395 uint matCount=_Materials.size();
00396
00397 // Flush each material textures
00398 for (uint mat=0; mat<matCount; mat++)
00399 {
00401 _Materials[mat].flushTextures (driver, selectedTexture);
00402 }
00403 }
|
|
|
Get bbox.
Reimplemented from NL3D::IShape. Definition at line 383 of file mesh_multi_lod.cpp. References _MeshVector, count, and uint.
00384 {
00385 // Get count
00386 uint count=_MeshVector.size();
00387 for (uint slot=0; slot<count; slot++)
00388 {
00389 // Shape ?
00390 if (_MeshVector[slot].MeshGeom)
00391 {
00392 // Get the bounding box
00393 bbox=_MeshVector[slot].MeshGeom->getBoundingBox().getAABBox();
00394
00395 // ok
00396 break;
00397 }
00398 }
00399 }
|
|
|
return NULL if this material is NOT animated. (or if material do not exist)
Definition at line 90 of file mesh_base.cpp. References NL3D::CMeshBase::_AnimatedMaterials, and uint.
00091 {
00092 TAnimatedMaterialMap::iterator it;
00093 it= _AnimatedMaterials.find(id);
00094 if(it!=_AnimatedMaterials.end())
00095 return &it->second;
00096 else
00097 return NULL;
00098 }
|
|
|
Definition at line 212 of file mesh_base.h. References NL3D::CMeshBase::_AutoAnim. Referenced by NL3D::CScene::createInstance(), and NL3D::CMeshBaseInstance::traverseHrc().
00212 { return _AutoAnim; }
|
|
|
Implemented in NLAIAGENT::CNumericIndex, NLAIC::IPointerGestion, NLAIC::CIdentType, and CAutomataDesc. Referenced by NLMISC::CClassRegistry::checkObject(), and NL3D::GetTextureSize(). |
|
|
Definition at line 166 of file mesh_base.h. References NL3D::CMeshBase::_DefaultLMFactor.
00166 {return &_DefaultLMFactor;}
|
|
|
Definition at line 162 of file mesh_base.h. References NL3D::CMeshBase::_DefaultPivot. Referenced by NL3D::CMeshBaseInstance::getDefaultTrack().
00162 {return &_DefaultPivot;}
|
|
|
Definition at line 161 of file mesh_base.h. Referenced by NL3D::CMeshBaseInstance::getDefaultTrack().
00161 {return &_DefaultPos;}
|
|
|
Definition at line 163 of file mesh_base.h. References NL3D::CMeshBase::_DefaultRotEuler. Referenced by NL3D::CMeshBaseInstance::getDefaultTrack().
00163 {return &_DefaultRotEuler;}
|
|
|
Definition at line 164 of file mesh_base.h. References NL3D::CMeshBase::_DefaultRotQuat. Referenced by NL3D::CMeshBaseInstance::getDefaultTrack().
00164 {return &_DefaultRotQuat;}
|
|
|
Definition at line 165 of file mesh_base.h. References NL3D::CMeshBase::_DefaultScale. Referenced by NL3D::CMeshBaseInstance::getDefaultTrack().
00165 {return &_DefaultScale;}
|
|
|
return the DistMax where the shape is no more displayed. Default is to return -1, meaning DistMax = infinite. Definition at line 112 of file shape.h.
00112 {return _DistMax;}
|
|
|
get the lod texture info. see CSkeletonModel Lod system. NULL per default. NB: serialised
Definition at line 223 of file mesh_base.h. References NL3D::CMeshBase::_LodCharacterTexture. Referenced by NL3D::CSkeletonModel::computeLodTexture().
00223 {return _LodCharacterTexture;}
|
|
|
Get a material, const version.
Definition at line 184 of file mesh_base.h. References uint.
00185 {
00186 return _Materials[id];
00187 }
|
|
|
Get a material.
Definition at line 179 of file mesh_base.h. References uint. Referenced by NL3D::CZoneLighter::addTriangles(), NL3D::CCoarseMeshBuild::buildBitmap(), NL3D::CPSConstraintMesh::CMeshDisplayShare::buildRdrPassSet(), NL3D::CheckForLightableFacesInMesh(), NL3D::CheckForOpaqueAndTransparentFacesInMesh(), NL3D::CShapeBank::processWaitingShapes(), NL3D::CCoarseMeshBuild::remapCoordinates(), NL3D::CAsyncFileManager3D::CMeshLoad::run(), and NL3D::CMeshBaseInstance::selectTextureSet().
00180 {
00181 return _Materials[id];
00182 }
|
|
|
Geometry accessor.
Definition at line 599 of file mesh_multi_lod.cpp. References _MeshVector, getNumSlotMesh(), nlassert, and uint. Referenced by NL3D::CZoneLighter::addTriangles(), NL3D::CInstanceLighter::addTriangles(), and NL3D::UShape::getMeshTriangles().
00600 {
00601 // Checks
00602 nlassert (slot<getNumSlotMesh ());
00603
00604 return *_MeshVector[slot].MeshGeom;
00605 }
|
|
|
Get the number of materials in the mesh.
Definition at line 173 of file mesh_base.h. References uint. Referenced by NL3D::CShapeBank::processWaitingShapes(), NL3D::CAsyncFileManager3D::CMeshLoad::run(), and NL3D::CMeshBaseInstance::selectTextureSet().
00174 {
00175 return _Materials.size();
00176 }
|
|
|
Get slot mesh count.
Definition at line 144 of file mesh_multi_lod.h. References _MeshVector, and uint. Referenced by changeMRMDistanceSetup(), getMeshGeom(), NL3D::UShape::getMeshTriangles(), and NL3D::CMeshMultiLodInstance::initRenderFilterType().
00145 {
00146 return _MeshVector.size();
00147 }
|
|
|
should not be called direclty as the intance of this shape will use 'getNumTrianglesWithCoarsestDist' themselves to get the correct distance.
Implements NL3D::IShape. Definition at line 180 of file mesh_multi_lod.h. References getNumTrianglesWithCoarsestDist().
00181 {
00182 return getNumTrianglesWithCoarsestDist(distance, -1);
00183 }
|
|
||||||||||||
|
Definition at line 320 of file mesh_multi_lod.cpp. References _MeshVector, NL3D::CMeshMultiLod::CMeshSlot::A, NL3D::CMeshMultiLod::CMeshSlot::B, NL3D::CMeshMultiLod::CMeshSlot::MeshGeom, and uint. Referenced by NL3D::CMeshMultiLodInstance::getNumTriangles(), and getNumTriangles().
00321 {
00322 // Look in the table for good distances..
00323 uint meshCount=_MeshVector.size();
00324
00325 // At least on mesh
00326 if (meshCount>0)
00327 {
00328
00329 if (coarsestMeshDist != -1)
00330 {
00331 if (coarsestMeshDist != 0)
00332 {
00333 // rescale distance to new coarse mesh distance..
00334 distance *= _MeshVector[meshCount - 1].DistMax / coarsestMeshDist;
00335 }
00336 }
00337
00338 uint i=0;
00339 // Look for good i
00340 while ( _MeshVector[i].DistMax < distance)
00341 {
00342 if (i==meshCount-1)
00343 // Abort if last one
00344 break;
00345 i++;
00346 }
00347
00348 // Ref on slot
00349 const CMeshSlot &slot=_MeshVector[i];
00350
00351 // Is mesh present ?
00352 if (slot.MeshGeom)
00353 {
00354 // Get the polygon count with the distance
00355 float polyCount=slot.A * distance + slot.B;
00356
00357 /*// Get the perfect polygon count in this slot for the asked distance
00358 float goodPolyCount=slot.MeshGeom->getNumTriangles (distance);
00359
00360 // Get the next slot perfect polygon count
00361 float realEndPolyCount;
00362
00363 // Last slot ?
00364 if ( (i<meshCount-1) && _MeshVector[i+1].MeshGeom )
00365 // Take end number polygon count in the next slot
00366 realEndPolyCount=_MeshVector[i+1].MeshGeom->getNumTriangles (slot.DistMax);
00367 else
00368 // Take end number polygon count in the this slot
00369 realEndPolyCount=slot.EndPolygonCount;
00370
00371 // Return blended polygon count to have a continous decreasing function
00372 return (goodPolyCount-slot.BeginPolygonCount) * (realEndPolyCount-slot.BeginPolygonCount) /
00373 (slot.EndPolygonCount-slot.BeginPolygonCount) + slot.BeginPolygonCount;*/
00374 return polyCount;
00375 }
00376 }
00377
00378 return 0;
00379 }
|
|
|
Definition at line 70 of file smart_ptr.h. References NLMISC::CRefCount::crefs, and sint.
00071 {
00072 return crefs;
00073 }
|
|
||||||||||||
|
Get a slot mesh.
Definition at line 150 of file mesh_multi_lod.h. References _MeshVector, and uint. Referenced by NL3D::CMeshMultiLodInstance::initRenderFilterType().
00151 {
00152 // Coarse mesh ?
00153 coarseMesh=(_MeshVector[i].Flags&CMeshSlot::CoarseMesh)!=0;
00154
00155 // Return the mesh pointer
00156 return _MeshVector[i].MeshGeom;
00157 }
|
|
|
called at createInstance() time
Definition at line 740 of file mesh_multi_lod.cpp. References NL3D::CMeshMultiLodInstance::_CoarseMeshVB, _MeshVector, NL3D::CMeshMultiLod::CMeshSlot::Flags, NL3D::CScene::getCoarseMeshManager(), NL3D::CVertexBuffer::getNumVertices(), NL3D::CTransform::getOwnerScene(), NL3D::CMeshGeom::getVertexBuffer(), NL3D::CCoarseMeshManager::getVertexSize(), NL3D::CMeshMultiLod::CMeshSlot::MeshGeom, and uint. Referenced by createInstance().
00741 {
00742 CCoarseMeshManager *manager= mi->getOwnerScene()->getCoarseMeshManager();
00743
00744 if(manager)
00745 {
00746 // For all MeshSlots that have a CoarseMesh, count max Coarse NumVertices;
00747 uint numVertices= 0;
00748 for(uint i=0;i<_MeshVector.size();i++)
00749 {
00750 CMeshSlot &slotRef= _MeshVector[i];
00751 if( slotRef.Flags & CMeshSlot::CoarseMesh )
00752 {
00753 // Get a pointer on the geom mesh
00754 CMeshGeom *meshGeom= safe_cast<CMeshGeom*>(slotRef.MeshGeom);
00755 numVertices= max(numVertices, (uint)meshGeom->getVertexBuffer().getNumVertices() );
00756 }
00757 }
00758
00759 // Then allocate vertex space for dest manager vertex size.
00760 mi->_CoarseMeshVB.resize( numVertices*manager->getVertexSize() );
00761 }
00762 }
|
|
||||||||||||
|
instanciate MeshBase part to an instance (a CMeshBaseInstance).
Definition at line 261 of file mesh_base.cpp. References NL3D::CMeshBase::_AnimatedMaterials, NL3D::CMeshBaseInstance::_AnimatedMaterials, NL3D::CMeshBase::_AnimatedMorph, NL3D::CMeshBaseInstance::_AnimatedMorphFactor, NL3D::CMeshBase::_DefaultPivot, NL3D::CMeshBase::_DefaultRotQuat, NL3D::CMeshBase::_DefaultScale, NL3D::CMeshBaseInstance::AsyncTextures, NL3D::CAnimatedValueQuat, NL3D::CAnimatedValueVector, NL3D::CTrackDefaultBlendable< CQuat >::getValue(), NL3D::CTrackDefaultBlendable< CVector >::getValue(), NL3D::CMeshBaseInstance::Materials, nlassert, NL3D::CMeshBaseInstance::selectTextureSet(), NL3D::IAnimatable::setFather(), NL3D::CTransform::setIsBigLightable(), NL3D::CTransform::setIsLightable(), NL3D::CAnimatedMaterial::setMaterial(), NL3D::CTransform::setOpacity(), NL3D::CTransform::setTransparency(), and uint32.
00262 {
00263 uint32 i;
00264
00265
00266 // setup animated blendShapes
00267 //===========================
00268 mi->_AnimatedMorphFactor.reserve(_AnimatedMorph.size());
00269 for(i = 0; i < _AnimatedMorph.size(); ++i)
00270 {
00271 CAnimatedMorph am(&_AnimatedMorph[i]);
00272 mi->_AnimatedMorphFactor.push_back (am);
00273 }
00274
00275 // setup materials.
00276 //=================
00277 // Copy material. Textures are referenced only
00278 mi->Materials= _Materials;
00279
00280 // Instanciate selectable textures (use default set)
00281 mi->selectTextureSet(0);
00282
00283 // prepare possible AsyncTextures
00284 mi->AsyncTextures.resize(_Materials.size());
00285
00286 // setup animated materials.
00287 //==========================
00288 TAnimatedMaterialMap::iterator it;
00289 mi->_AnimatedMaterials.reserve(_AnimatedMaterials.size());
00290 for(it= _AnimatedMaterials.begin(); it!= _AnimatedMaterials.end(); it++)
00291 {
00292 CAnimatedMaterial aniMat(&it->second);
00293
00294 // set the target instance material.
00295 nlassert(it->first < mi->Materials.size());
00296 aniMat.setMaterial(&mi->Materials[it->first]);
00297
00298 // Must set the Animatable father of the animated material (the mesh_base_instance!).
00299 aniMat.setFather(mi, CMeshBaseInstance::OwnerBit);
00300
00301 // Append this animated material.
00302 mi->_AnimatedMaterials.push_back(aniMat);
00303 }
00304
00305 // Misc
00306 //==========================
00307
00308 // Setup position with the default value
00309 mi->ITransformable::setPos( ((CAnimatedValueVector&)_DefaultPos.getValue()).Value );
00310 mi->ITransformable::setRotQuat( ((CAnimatedValueQuat&)_DefaultRotQuat.getValue()).Value );
00311 mi->ITransformable::setScale( ((CAnimatedValueVector&)_DefaultScale.getValue()).Value );
00312 mi->ITransformable::setPivot( ((CAnimatedValueVector&)_DefaultPivot.getValue()).Value );
00313
00314 // Check materials for transparency
00315 mi->setTransparency( false );
00316 mi->setOpacity( false );
00317 for( i = 0; i < mi->Materials.size(); ++i )
00318 if( mi->Materials[i].getBlend() )
00319 mi->setTransparency( true );
00320 else
00321 mi->setOpacity( true );
00322
00323 // if the mesh is lightable, then the instance is
00324 mi->setIsLightable(this->isLightable());
00325
00326 // a mesh is considered big for lightable if it uses localAttenuation
00327 mi->setIsBigLightable(this->useLightingLocalAttenuation());
00328
00329 }
|
|
|
Is this mesh lightable? true if one of his materials is not a lightmap. NB: result stored in file.
Definition at line 198 of file mesh_base.h. References NL3D::CMeshBase::_IsLightable. Referenced by NL3D::CInstanceLighter::light().
00198 {return _IsLightable;}
|
|
|
Is static mesh ?
Definition at line 160 of file mesh_multi_lod.h. References _StaticLod.
00161 {
00162 return _StaticLod;
00163 }
|
|
|
Declare name of the shape.
|
|
||||||||||||||||||||||||
|
Profile the MeshGeom of a slot, even if coarseMesh.
Definition at line 661 of file mesh_multi_lod.cpp. References _MeshVector, NL3D::CMeshMultiLod::CMeshSlot::Flags, NL3D::CMeshMultiLod::CMeshSlot::MeshGeom, NL3D::IMeshGeom::profileSceneRender(), uint, and uint32. Referenced by profileSceneRender().
00662 {
00663 // Ref
00664 CMeshSlot &slotRef=_MeshVector[slot];
00665
00666 // MeshGeom exist?
00667 if (slotRef.MeshGeom)
00668 {
00669 // NB Here, the meshGeom may still be a coarseMesh, but rendered through CMeshGeom
00670 if(slotRef.Flags&CMeshSlot::CoarseMesh)
00671 {
00672 // Render only for opaque material
00673 if(rdrFlags & IMeshGeom::RenderOpaqueMaterial)
00674 {
00675 slotRef.MeshGeom->profileSceneRender(rdrTrav, trans, numPoylgons, rdrFlags);
00676 }
00677 }
00678 else
00679 {
00680 slotRef.MeshGeom->profileSceneRender(rdrTrav, trans, numPoylgons, rdrFlags);
00681 }
00682 }
00683 }
|
|
||||||||||||||||
|
profiling
Reimplemented from NL3D::IShape. Definition at line 687 of file mesh_multi_lod.cpp. References _MeshVector, NL3D::CMeshMultiLodInstance::Flags, NL3D::CMeshMultiLodInstance::Lod0, NL3D::CMeshMultiLodInstance::Lod1, nlassert, NL3D::CMeshMultiLodInstance::PolygonCountLod0, NL3D::CMeshMultiLodInstance::PolygonCountLod1, profileMeshGeom(), and uint32.
00688 {
00689 // Render good meshes
00690 CMeshMultiLodInstance *instance=safe_cast<CMeshMultiLodInstance*>(trans);
00691
00692
00693 // Second lod ?
00694 if ( (instance->Lod1!=0xffffffff) && (passOpaque==false) )
00695 {
00696 // build rdrFlags to rdr both transparent and opaque materials,
00697 // use globalAlphaBlend, and disable ZWrite for Lod1
00698 uint32 rdrFlags= IMeshGeom::RenderOpaqueMaterial | IMeshGeom::RenderTransparentMaterial |
00699 IMeshGeom::RenderGlobalAlpha | IMeshGeom::RenderGADisableZWrite;
00700 // NB: very important to render Lod1 first, because Lod0 is still rendered with ZWrite enabled.
00701 profileMeshGeom (instance->Lod1, rdrTrav, instance, instance->PolygonCountLod1, rdrFlags);
00702 }
00703
00704
00705 // Have an opaque pass ?
00706 if ( (instance->Flags&CMeshMultiLodInstance::Lod0Blend) == 0)
00707 {
00708 // Is this slot a CoarseMesh?
00709 if ( _MeshVector[instance->Lod0].Flags&CMeshSlot::CoarseMesh )
00710 {
00711 }
00712 else
00713 {
00714 // build rdrFlags the normal way (as CMesh::render() for example)
00715 uint32 mask= (0-(uint32)passOpaque);
00716 uint32 rdrFlags;
00717 // select rdrFlags, without ifs.
00718 rdrFlags= mask & (IMeshGeom::RenderOpaqueMaterial | IMeshGeom::RenderPassOpaque);
00719 rdrFlags|= ~mask & (IMeshGeom::RenderTransparentMaterial);
00720 // Only render the normal way the first lod
00721 profileMeshGeom (instance->Lod0, rdrTrav, instance, instance->PolygonCountLod0, rdrFlags);
00722 }
00723 }
00724 else
00725 {
00726 // Should not be in opaque
00727 nlassert (passOpaque==false);
00728
00729 // build rdrFlags to rdr both transparent and opaque materials,
00730 // use globalAlphaBlend, BUT Don't disable ZWrite for Lod0
00731 uint32 rdrFlags= IMeshGeom::RenderOpaqueMaterial | IMeshGeom::RenderTransparentMaterial |
00732 IMeshGeom::RenderGlobalAlpha;
00733
00734 // Render first lod in blend mode. Don't disable ZWrite for Lod0
00735 profileMeshGeom (instance->Lod0, rdrTrav, instance, instance->PolygonCountLod0, rdrFlags);
00736 }
00737 }
|
|
||||||||||||||||
|
render() this mesh in a driver.
Implements NL3D::IShape. Definition at line 232 of file mesh_multi_lod.cpp. References _MeshVector, NL3D::CMeshMultiLodInstance::BlendFactor, NL3D::CMeshMultiLodInstance::Flags, NL3D::CScene::getCoarseMeshManager(), NL3D::CTransform::getOwnerScene(), NL3D::CMeshMultiLodInstance::Lod0, NL3D::CMeshMultiLodInstance::Lod1, nlassert, NL3D::CMeshMultiLodInstance::PolygonCountLod0, NL3D::CMeshMultiLodInstance::PolygonCountLod1, renderCoarseMesh(), renderMeshGeom(), and uint32.
00233 {
00234 // Render good meshes
00235 CMeshMultiLodInstance *instance=safe_cast<CMeshMultiLodInstance*>(trans);
00236
00237 // Static or dynamic coarse mesh ?
00238 CCoarseMeshManager *manager;
00239 // Get the coarse mesh manager
00240 manager=instance->getOwnerScene()->getCoarseMeshManager();
00241
00242 // *** Render Lods
00243
00244 // Second lod ?
00245 if ( (instance->Lod1!=0xffffffff) && (passOpaque==false) )
00246 {
00247 // build rdrFlags to rdr both transparent and opaque materials,
00248 // use globalAlphaBlend, and disable ZWrite for Lod1
00249 uint32 rdrFlags= IMeshGeom::RenderOpaqueMaterial | IMeshGeom::RenderTransparentMaterial |
00250 IMeshGeom::RenderGlobalAlpha | IMeshGeom::RenderGADisableZWrite;
00251 // NB: very important to render Lod1 first, because Lod0 is still rendered with ZWrite enabled.
00252 renderMeshGeom (instance->Lod1, drv, instance, instance->PolygonCountLod1, rdrFlags, 1.f-instance->BlendFactor, manager);
00253 }
00254
00255
00256 // Have an opaque pass ?
00257 if ( (instance->Flags&CMeshMultiLodInstance::Lod0Blend) == 0)
00258 {
00259 // Is this slot a CoarseMesh?
00260 if ( _MeshVector[instance->Lod0].Flags&CMeshSlot::CoarseMesh )
00261 {
00262 // render as a CoarseMesh the lod 0, only in opaque pass
00263 if(passOpaque)
00264 renderCoarseMesh (instance->Lod0, drv, instance, manager);
00265 }
00266 else
00267 {
00268 // build rdrFlags the normal way (as CMesh::render() for example)
00269 uint32 mask= (0-(uint32)passOpaque);
00270 uint32 rdrFlags;
00271 // select rdrFlags, without ifs.
00272 rdrFlags= mask & (IMeshGeom::RenderOpaqueMaterial | IMeshGeom::RenderPassOpaque);
00273 rdrFlags|= ~mask & (IMeshGeom::RenderTransparentMaterial);
00274 // Only render the normal way the first lod
00275 renderMeshGeom (instance->Lod0, drv, instance, instance->PolygonCountLod0, rdrFlags, 1, manager);
00276 }
00277 }
00278 else
00279 {
00280 // Should not be in opaque
00281 nlassert (passOpaque==false);
00282
00283 // build rdrFlags to rdr both transparent and opaque materials,
00284 // use globalAlphaBlend, BUT Don't disable ZWrite for Lod0
00285 uint32 rdrFlags= IMeshGeom::RenderOpaqueMaterial | IMeshGeom::RenderTransparentMaterial |
00286 IMeshGeom::RenderGlobalAlpha;
00287
00288 // Render first lod in blend mode. Don't disable ZWrite for Lod0
00289 renderMeshGeom (instance->Lod0, drv, instance, instance->PolygonCountLod0, rdrFlags, instance->BlendFactor, manager);
00290 }
00291 }
|
|
||||||||||||||||||||
|
Render the CoarseMesh of a slot. must be a coarseMesh, and shoudl be called only in passOpaque.
Definition at line 496 of file mesh_multi_lod.cpp. References NL3D::CMeshMultiLodInstance::_CoarseMeshVB, NL3D::CMeshMultiLodInstance::_LastCoarseMesh, NL3D::CMeshMultiLodInstance::_LastCoarseMeshNumVertices, NL3D::CMeshMultiLodInstance::_LastLodLightingDate, NL3D::CMeshMultiLodInstance::_LastLodMatrixDate, _MeshVector, NL3D::CCoarseMeshManager::addMesh(), NL3D::CMeshMultiLod::CMeshSlot::CoarseNumTris, NL3D::CMeshMultiLod::CMeshSlot::CoarseTriangles, NL3D::CHrcTrav::CurrentDate, NL3D::CMeshMultiLod::CMeshSlot::Flags, NL3D::CCoarseMeshManager::flushRender(), NL3D::CMeshMultiLodInstance::getCoarseMeshLighting(), NL3D::CScene::getCoarseMeshLightingUpdate(), NL3D::CCoarseMeshManager::getColorOff(), NL3D::CScene::getFilterRenderFlags(), NL3D::CScene::getHrcTrav(), NL3D::ITransformable::getMatrix(), NL3D::CVertexBuffer::getNumVertices(), NL3D::CTransform::getOwnerScene(), NL3D::CCoarseMeshManager::getUVOff(), NL3D::CMeshGeom::getVertexBuffer(), NL3D::CCoarseMeshManager::getVertexSize(), NL3D::CMeshMultiLod::CMeshSlot::MeshGeom, nlassert, NL3D::CMeshMultiLodInstance::setColorCoarseMesh(), NL3D::CMeshMultiLodInstance::setPosCoarseMesh(), NL3D::CMeshMultiLodInstance::setUVCoarseMesh(), sint64, and uint. Referenced by render().
00497 {
00498 // if the manager is NULL, quit.
00499 if(manager==NULL)
00500 return;
00501
00502 // get the scene
00503 CScene *scene= trans->getOwnerScene();
00504 if(!scene)
00505 return;
00506
00507 // If filtered...
00508 if( (scene->getFilterRenderFlags() & UScene::FilterCoarseMesh)==0 )
00509 return;
00510
00511 // Ref
00512 CMeshSlot &slotRef=_MeshVector[slot];
00513
00514 // the slot must be a Coarse mesh
00515 nlassert(slotRef.Flags&CMeshSlot::CoarseMesh);
00516
00517 // Get a pointer on the geom mesh
00518 CMeshGeom *meshGeom= safe_cast<CMeshGeom*>(slotRef.MeshGeom);
00519
00520 // ** If not the same as Before (or if NULL before...)
00521 if ( trans->_LastCoarseMesh!=meshGeom )
00522 {
00523 uint numVerts= meshGeom->getVertexBuffer().getNumVertices();
00524 uint numTris= slotRef.CoarseNumTris;
00525 // If empty meshGeom, erase cache (each frame, ugly but error mgt here...)
00526 if( numTris==0 || numVerts==0 )
00527 trans->_LastCoarseMesh= NULL;
00528 else
00529 {
00530 // Cache
00531 trans->_LastCoarseMesh= meshGeom;
00532 trans->_LastCoarseMeshNumVertices= numVerts;
00533
00534 // Check setuped size.
00535 nlassert( trans->_CoarseMeshVB.size() >= numVerts*manager->getVertexSize() );
00536
00537 // Fill only UVs here. (Pos updated in Matrix pass. Color in Lighting Pass)
00538 trans->setUVCoarseMesh( *meshGeom, manager->getVertexSize(), manager->getUVOff() );
00539
00540 // Dirt the matrix
00541 trans->_LastLodMatrixDate=0;
00542 // Dirt the lighting. NB: period maximum is 255. Hence the -256, to ensure lighting compute now
00543 trans->_LastLodLightingDate= -0x100;
00544 }
00545 }
00546
00547 // ** If setuped, update and render
00548 if( trans->_LastCoarseMesh )
00549 {
00550 // Matrix has changed ?
00551 if ( trans->ITransformable::compareMatrixDate (trans->_LastLodMatrixDate) )
00552 {
00553 // Get date
00554 trans->_LastLodMatrixDate = trans->ITransformable::getMatrixDate();
00555
00556 // Set matrix
00557 trans->setPosCoarseMesh ( *meshGeom, trans->getMatrix(), manager->getVertexSize() );
00558 }
00559
00560 // Lighting: test if must update lighting, according to date of HrcTrav (num of CScene::render() call).
00561 sint64 currentDate= scene->getHrcTrav().CurrentDate;
00562 if( trans->_LastLodLightingDate < currentDate - scene->getCoarseMeshLightingUpdate() )
00563 {
00564 // reset the date.
00565 trans->_LastLodLightingDate= currentDate;
00566
00567 // get average sun color
00568 CRGBA sunContrib= trans->getCoarseMeshLighting();
00569
00570 // Set color
00571 trans->setColorCoarseMesh ( sunContrib, manager->getVertexSize(), manager->getColorOff() );
00572 }
00573
00574 // Add dynamic to the manager
00575 if( !manager->addMesh(trans->_LastCoarseMeshNumVertices, &trans->_CoarseMeshVB[0], slotRef.CoarseNumTris, &slotRef.CoarseTriangles[0] ) )
00576 {
00577 // If failure, flush the manager
00578 manager->flushRender(drv);
00579 // then try to re-add. No-op if fails this time..
00580 manager->addMesh(trans->_LastCoarseMeshNumVertices, &trans->_CoarseMeshVB[0], slotRef.CoarseNumTris, &slotRef.CoarseTriangles[0] );
00581 }
00582 }
00583
00584 }
|
|
||||||||||||||||||||||||||||||||
|
Render the MeshGeom of a slot, even if coarseMesh.
Definition at line 446 of file mesh_multi_lod.cpp. References _MeshVector, alpha, NL3D::CMeshMultiLod::CMeshSlot::Flags, NL3D::CMeshMultiLodInstance::getCoarseMeshLighting(), NL3D::CCoarseMeshManager::getMaterial(), NL3D::CTransform::getWorldMatrix(), NL3D::CMeshMultiLod::CMeshSlot::MeshGeom, NL3D::CMeshBlender::prepareRenderForGlobalAlphaCoarseMesh(), NL3D::IMeshGeom::render(), NL3D::CMeshGeom::renderSimpleWithMaterial(), NL3D::CMeshBlender::restoreRenderCoarseMesh(), uint, and uint32. Referenced by render().
00447 {
00448 // Ref
00449 CMeshSlot &slotRef=_MeshVector[slot];
00450
00451 // MeshGeom exist?
00452 if (slotRef.MeshGeom)
00453 {
00454 // NB Here, the meshGeom may still be a coarseMesh, but rendered through CMeshGeom
00455 if(slotRef.Flags&CMeshSlot::CoarseMesh)
00456 {
00457 // Render only for opaque material
00458 if(manager && (rdrFlags & IMeshGeom::RenderOpaqueMaterial) )
00459 {
00460 bool gaDisableZWrite= (rdrFlags & IMeshGeom::RenderGADisableZWrite)?true:false;
00461
00462 // Render the CoarseMesh with the manager material
00463 CMaterial &material= manager->getMaterial();
00464
00465 // modulate material for alphaBlend transition
00466 // ----------
00467 // get average sun color for this coarseMesh
00468 CRGBA newCol= trans->getCoarseMeshLighting();
00469
00470 // Use a CMeshBlender to modify material and driver.
00471 CMeshBlender blender;
00472 blender.prepareRenderForGlobalAlphaCoarseMesh(material, drv, newCol, alpha, gaDisableZWrite);
00473
00474
00475 // render simple the coarseMesh
00476 CMeshGeom *meshGeom= safe_cast<CMeshGeom*>(slotRef.MeshGeom);
00477 meshGeom->renderSimpleWithMaterial(drv, trans->getWorldMatrix(), material);
00478
00479
00480 // resetup standard CoarseMeshMaterial material values
00481 // ----------
00482 // blender restore
00483 blender.restoreRenderCoarseMesh(material, drv, gaDisableZWrite);
00484 }
00485 }
00486 else
00487 {
00488 // Render the geom mesh
00489 // Disable ZWrite only if in transition and for rendering Lod1
00490 slotRef.MeshGeom->render (drv, trans, numPoylgons, rdrFlags, alpha);
00491 }
00492 }
00493 }
|
|
|
reset the lod texture info. see CSkeletonModel Lod system.
Definition at line 436 of file mesh_base.cpp. References NL3D::CMeshBase::_LodCharacterTexture. Referenced by NL3D::CMeshBase::applyMaterialUsageOptim(), NL3D::CMeshBase::setupLodCharacterTexture(), and NL3D::CMeshBase::~CMeshBase().
00437 {
00438 if(_LodCharacterTexture)
00439 {
00440 delete _LodCharacterTexture;
00441 _LodCharacterTexture= NULL;
00442 }
00443 }
|
|
|
serial this mesh.
Implements NLMISC::IStreamable. Definition at line 295 of file mesh_multi_lod.cpp.
00296 {
00297 // Serial a version number
00298 (void)f.serialVersion (0);
00299
00300 // serial Materials infos contained in CMeshBase.
00301 CMeshBase::serialMeshBase(f);
00302
00303 // Static lod flag
00304 f.serial (_StaticLod);
00305
00306 // Serial the values
00307 f.serialCont (_MeshVector);
00308
00309
00310 // if reading, compile some stuff
00311 if (f.isReading())
00312 {
00313 compileDistMax();
00314 compileCoarseMeshes();
00315 }
00316 }
|
|
|
serial the base Part of this mesh.
Definition at line 149 of file mesh_base.cpp. References NL3D::CMeshBase::_AnimatedMaterials, NL3D::CMeshBase::_AnimatedMorph, NL3D::CMeshBase::_AutoAnim, NL3D::CMeshBase::_DefaultPivot, NL3D::CMeshBase::_DefaultRotEuler, NL3D::CMeshBase::_DefaultRotQuat, NL3D::CMeshBase::_DefaultScale, NL3D::CMeshBase::_IsLightable, NL3D::CMeshBase::_LightInfos, NL3D::CMeshBase::_LodCharacterTexture, NL3D::CMeshBase::_UseLightingLocalAttenuation, NL3D::CMeshBase::computeIsLightable(), sint, and NL3D::CMeshBase::TLightInfoMapV7.
00150 {
00151 /*
00152 Version 8:
00153 - new format for CLightMapInfoList
00154 Version 7:
00155 - _LodCharacterTexture
00156 Version 6:
00157 - _DistMax
00158 Version 5:
00159 - _AutoAnim
00160 Version 4:
00161 - _UseLightingLocalAttenuation
00162 Version 3:
00163 - _IsLightable
00164 Version 2:
00165 - Added Blend Shapes factors
00166 Version 1:
00167 - Cut in version because of badly coded ITexture* serialisation. throw an exception if
00168 find a version < 1.
00169 Version 0:
00170 - 1st version.
00171 */
00172 sint ver = f.serialVersion(8);
00173
00174 if (ver >= 2)
00175 {
00176 f.serialCont (_AnimatedMorph);
00177 }
00178
00179 if(ver<1)
00180 throw NLMISC::EStream(f, "Mesh in Stream is too old (MeshBase version < 1)");
00181
00182 f.serial (_DefaultPos);
00183 f.serial (_DefaultPivot);
00184 f.serial (_DefaultRotEuler);
00185 f.serial (_DefaultRotQuat);
00186 f.serial (_DefaultScale);
00187
00188 f.serialCont(_Materials);
00189 f.serialCont(_AnimatedMaterials);
00190
00191 if(ver >= 8)
00192 f.serialCont(_LightInfos);
00193 else
00194 {
00195 TLightInfoMapV7 temp;
00196 f.serialCont(temp);
00197 }
00198
00199 if(ver>=3)
00200 // read/write _IsLightable flag.
00201 f.serial(_IsLightable);
00202 else if( f.isReading() )
00203 // update _IsLightable flag.
00204 computeIsLightable();
00205
00206 if(ver>=4)
00207 f.serial(_UseLightingLocalAttenuation);
00208 else if( f.isReading() )
00209 _UseLightingLocalAttenuation= false;
00210
00211 if (ver >= 5)
00212 {
00213 f.serial(_AutoAnim);
00214 }
00215
00216 if(ver >= 6)
00217 f.serial(_DistMax);
00218
00219 if(ver >= 7)
00220 f.serialPtr(_LodCharacterTexture);
00221
00222 }
|
|
||||||||||||
|
setup a material as animated. Material must exist or else no-op.
Definition at line 77 of file mesh_base.cpp. References NL3D::CMeshBase::_AnimatedMaterials, nlassert, and uint.
00078 {
00079 nlassert(!matName.empty());
00080 if(id<_Materials.size())
00081 {
00082 // add / replace animated material.
00083 _AnimatedMaterials[id].Name= matName;
00084 // copy Material default.
00085 _AnimatedMaterials[id].copyFromMaterial(&_Materials[id]);
00086 }
00087 }
|
|
|
Tells that the model instanciated from this shape should be automatically animated. If so the scene will search for an automatic anim that has the same name than this shape and will bind it. This state is serialized. NB: This is a clue to scene::createInstance, a call to createInstance of this object won't make the animation binding. Definition at line 210 of file mesh_base.h. References NL3D::CMeshBase::_AutoAnim.
00210 { _AutoAnim = on; }
|
|
|
setup the DistMax where the shape is no more displayed. Take effect only for the next created instances. setting <0 means -1 and so means DistMax = infinite. Definition at line 66 of file shape.cpp. Referenced by NL3D::CFlareShape::CFlareShape().
|
|
|
setup the lod texture info. see CSkeletonModel Lod system
Definition at line 446 of file mesh_base.cpp. References NL3D::CMeshBase::_LodCharacterTexture, and NL3D::CMeshBase::resetLodCharacterTexture().
00447 {
00448 // delete old
00449 resetLodCharacterTexture();
00450 // seutp new
00451 _LodCharacterTexture= new CLodCharacterTexture;
00452 *_LodCharacterTexture= lodText;
00453 }
|
|
||||||||||||
|
return !NULL if this shape can support MeshBlock rendering for a special instance. NB: Mesh Block render cannot occurs if the Mesh is Skinned/MeshMorphed. NB: Mesh Block render can occurs only in Opaque pass NB: Mesh block render can occurs only for CMeshBase meshes.
Reimplemented from NL3D::IShape. Definition at line 630 of file mesh_multi_lod.cpp. References _MeshVector, NL3D::CMeshMultiLodInstance::Flags, NL3D::CMeshMultiLodInstance::Lod0, NL3D::CMeshMultiLodInstance::PolygonCountLod0, NL3D::IMeshGeom::supportMeshBlockRendering(), and uint.
00631 {
00632 IMeshGeom *ret= NULL;
00633
00634 // get the instance
00635 CMeshMultiLodInstance *instance=safe_cast<CMeshMultiLodInstance*>(trans);
00636
00637 // Must not be in blend transition.
00638 if ( (instance->Flags&CMeshMultiLodInstance::Lod0Blend) == 0)
00639 {
00640 uint slot= instance->Lod0;
00641 // The slot must not be a CoarseMesh
00642 if ( (_MeshVector[slot].Flags&CMeshSlot::CoarseMesh)==0 )
00643 {
00644 // MeshGeom exist?
00645 ret= _MeshVector[slot].MeshGeom;
00646 }
00647 }
00648
00649 // Ok if meshGeom is ok.
00650 if( ret && ret->supportMeshBlockRendering() )
00651 {
00652 polygonCount= instance->PolygonCountLod0;
00653 return ret;
00654 }
00655 else
00656 return NULL;
00657 }
|
|
|
tells if the shape wants LocalAttenuation for RealTime lighting. Default is false
Reimplemented from NL3D::IShape. Definition at line 429 of file mesh_base.cpp. References NL3D::CMeshBase::_UseLightingLocalAttenuation.
00430 {
00431 return _UseLightingLocalAttenuation;
00432 }
|
|
|
Definition at line 276 of file mesh_multi_lod.h. |
|
|
Definition at line 67 of file smart_ptr.h. |
|
|
Definition at line 240 of file mesh_base.h. Referenced by NL3D::CMeshBase::applyMaterialUsageOptim(), NL3D::CMeshBase::buildMeshBase(), NL3D::CMeshBase::getAnimatedMaterial(), NL3D::CMeshBase::instanciateMeshBase(), NL3D::CMeshBase::serialMeshBase(), and NL3D::CMeshBase::setAnimatedMaterial(). |
|
|
Definition at line 251 of file mesh_base.h. Referenced by NL3D::CMeshBase::buildMeshBase(), NL3D::CMeshBase::instanciateMeshBase(), and NL3D::CMeshBase::serialMeshBase(). |
|
|
Definition at line 258 of file mesh_base.h. Referenced by NL3D::CMeshBase::CMeshBase(), NL3D::CMeshBase::getAutoAnim(), NL3D::CMeshBase::serialMeshBase(), and NL3D::CMeshBase::setAutoAnim(). |
|
|
Definition at line 249 of file mesh_base.h. Referenced by NL3D::CMeshBase::CMeshBase(), and NL3D::CMeshBase::getDefaultLMFactor(). |
|
|
Definition at line 245 of file mesh_base.h. Referenced by NL3D::CMeshBase::buildMeshBase(), NL3D::CMeshBase::CMeshBase(), NL3D::CMeshBase::getDefaultPivot(), NL3D::CMeshBase::instanciateMeshBase(), and NL3D::CMeshBase::serialMeshBase(). |
|
|
Transform default tracks. Those default tracks are instancied, ie, CInstanceMesh will have the same and can't specialize it.
Definition at line 244 of file mesh_base.h. |
|
|
Definition at line 246 of file mesh_base.h. Referenced by NL3D::CMeshBase::buildMeshBase(), NL3D::CMeshBase::CMeshBase(), NL3D::CMeshBase::getDefaultRotEuler(), and NL3D::CMeshBase::serialMeshBase(). |
|
|
Definition at line 247 of file mesh_base.h. Referenced by NL3D::CMeshBase::buildMeshBase(), NL3D::CMeshBase::CMeshBase(), NL3D::CMeshBase::getDefaultRotQuat(), NL3D::CMeshBase::instanciateMeshBase(), and NL3D::CMeshBase::serialMeshBase(). |
|
|
Definition at line 248 of file mesh_base.h. Referenced by NL3D::CMeshBase::buildMeshBase(), NL3D::CMeshBase::CMeshBase(), NL3D::CMeshBase::getDefaultScale(), NL3D::CMeshBase::instanciateMeshBase(), and NL3D::CMeshBase::serialMeshBase(). |
|
|
Default to -1.
|
|
|
Is this mesh lightable??
Definition at line 254 of file mesh_base.h. Referenced by NL3D::CMeshBase::computeIsLightable(), NL3D::CMeshBase::isLightable(), and NL3D::CMeshBase::serialMeshBase(). |
|
|
|
The Materials.
Definition at line 230 of file mesh_base.h. |
|
|
Vector of meshes.
Definition at line 253 of file mesh_multi_lod.h. Referenced by build(), changeMRMDistanceSetup(), clear(), clip(), compileCoarseMeshes(), compileDistMax(), createInstance(), getAABBox(), getMeshGeom(), getNumSlotMesh(), getNumTrianglesWithCoarsestDist(), getSlotMesh(), instanciateCoarseMeshSpace(), profileMeshGeom(), profileSceneRender(), render(), renderCoarseMesh(), renderMeshGeom(), supportMeshBlockRendering(), and NL3D::CMeshMultiLodInstance::traverseLoadBalancing(). |
|
|
Static or dynamic load ? Yoyo: no more used, but leave for possible usage later...
Definition at line 250 of file mesh_multi_lod.h. Referenced by build(), and isStatic(). |
|
|
Is this mesh Use Lighting Local Attenuation ??
Definition at line 256 of file mesh_base.h. Referenced by NL3D::CMeshBase::buildMeshBase(), NL3D::CMeshBase::CMeshBase(), NL3D::CMeshBase::serialMeshBase(), and NL3D::CMeshBase::useLightingLocalAttenuation(). |
|
|
Definition at line 79 of file smart_ptr.h. Referenced by NLMISC::CRefCount::CRefCount(), NLMISC::CRefCount::getRefCount(), and NLMISC::CRefCount::~CRefCount(). |
|
|
Referenced by NLMISC::CRefCount::CRefCount(). |
|
|
Definition at line 80 of file smart_ptr.h. Referenced by NLMISC::CRefCount::CRefCount(), and NLMISC::CRefCount::~CRefCount(). |
1.3.6