#include <ps_mesh.h>
Definition at line 480 of file ps_mesh.h.
Public Member Functions | |
CMeshDisplayShare (uint maxNumMD) | |
ctor giving the max number of CDipslayMesh structures to be kept simultaneously. | |
CMeshDisplay & | getMeshDisplay (CMesh *mesh, uint32 format) |
Static Private Member Functions | |
void | buildRdrPassSet (TRdrPassSet &dest, const CMesh &mesh) |
build a set of render pass from a mesh | |
void | buildVB (CVertexBuffer &dest, const CMesh &mesh, uint32 format) |
Build a vb from a shape. The format can add an additionnal color. | |
Private Attributes | |
std::list< CMDEntry > | _Cache |
uint | _MaxNumMD |
uint | _NumMD |
|
ctor giving the max number of CDipslayMesh structures to be kept simultaneously.
Definition at line 484 of file ps_mesh.h. References _MaxNumMD, _NumMD, and uint.
|
|
build a set of render pass from a mesh
Definition at line 2064 of file ps_mesh.cpp. References NL3D::ConstraintMeshBufSize, NL3D::DuplicatePrimitiveBlock(), NL3D::CMeshBase::getMaterial(), NL3D::CMesh::getNbMatrixBlock(), NL3D::CMesh::getNbRdrPass(), NL3D::CVertexBuffer::getNumVertices(), NL3D::CMesh::getRdrPassMaterial(), NL3D::CMesh::getRdrPassPrimitiveBlock(), NL3D::CMesh::getVertexBuffer(), nlassert, NL3D::CPSConstraintMesh::TRdrPassSet, and uint. Referenced by getMeshDisplay().
02065 { 02066 // we don't support skinning for mesh particles, so there must be only one matrix block 02067 nlassert(m.getNbMatrixBlock() == 1); // SKINNING UNSUPPORTED 02068 02069 dest.resize(m.getNbRdrPass(0)); 02070 const CVertexBuffer &srcVb = m.getVertexBuffer(); 02071 02072 for (uint k = 0; k < m.getNbRdrPass(0); ++k) 02073 { 02074 dest[k].Mat = m.getMaterial(m.getRdrPassMaterial(0, k)); 02075 dest[k].SourceMat = dest[k].Mat; 02076 DuplicatePrimitiveBlock(m.getRdrPassPrimitiveBlock(0, k), dest[k].Pb, ConstraintMeshBufSize, srcVb.getNumVertices() ); 02077 } 02078 } |
|
Build a vb from a shape. The format can add an additionnal color. we duplicate the original mesh data's 'ConstraintMeshBufSize' times, eventually adding a color Definition at line 2081 of file ps_mesh.cpp. References NL3D::ConstraintMeshBufSize, NL3D::CVertexBuffer::getColorOff(), NL3D::CVertexBuffer::getNumVertices(), NL3D::CVertexBuffer::getUVRouting(), NL3D::CMesh::getVertexBuffer(), NL3D::CVertexBuffer::getVertexCoordPointer(), NL3D::CVertexBuffer::getVertexFormat(), NL3D::CVertexBuffer::getVertexSize(), nlassert, NL3D::CVertexBuffer::setNumVertices(), NL3D::CVertexBuffer::setUVRouting(), NL3D::CVertexBuffer::setVertexFormat(), sint, uint, uint32, uint8, and v. Referenced by getMeshDisplay().
02082 { 02084 const CVertexBuffer &meshVb = mesh.getVertexBuffer(); 02085 nlassert(destFormat == meshVb.getVertexFormat() || destFormat == (meshVb.getVertexFormat() | (uint32) CVertexBuffer::PrimaryColorFlag) ); 02086 dest.setVertexFormat(destFormat); 02087 dest.setNumVertices(ConstraintMeshBufSize * meshVb.getNumVertices()); 02088 for(uint k = 0; k < CVertexBuffer::MaxStage; ++k) 02089 { 02090 dest.setUVRouting((uint8) k, meshVb.getUVRouting()[k]); 02091 } 02092 02093 02094 uint8 *outPtr = (uint8 *) dest.getVertexCoordPointer(); 02095 uint8 *inPtr = (uint8 *) meshVb.getVertexCoordPointer(); 02096 uint meshSize = dest.getVertexSize() * meshVb.getNumVertices(); 02097 02098 if (destFormat == meshVb.getVertexFormat()) // no color added 02099 { 02100 for (uint k = 0; k < ConstraintMeshBufSize; ++k) 02101 { 02102 ::memcpy((void *) (outPtr + k * meshSize), (void *) inPtr, meshSize); 02103 } 02104 } 02105 else // color added, but not available in src 02106 { 02107 sint colorOff = dest.getColorOff(); 02108 uint inVSize = meshVb.getVertexSize(); 02109 uint outVSize = dest.getVertexSize(); 02110 for (uint k = 0; k < ConstraintMeshBufSize; ++k) 02111 { 02112 for (uint v = 0; v < meshVb.getNumVertices(); ++v) 02113 { 02114 // copy until color 02115 ::memcpy((void *) (outPtr + k * meshSize + v * outVSize), (void *) (inPtr + v * inVSize), colorOff); 02116 // copy datas after color 02117 ::memcpy((void *) (outPtr + k * meshSize + v * outVSize + colorOff + sizeof(uint8[4])), (void *) (inPtr + v * inVSize + colorOff), inVSize - colorOff); 02118 } 02119 } 02120 } 02121 } |
|
Definition at line 2033 of file ps_mesh.cpp. References _Cache, _MaxNumMD, _NumMD, buildRdrPassSet(), buildVB(), format, nlassert, and uint32. Referenced by NL3D::CPSConstraintMesh::restoreMaterials().
02034 { 02035 nlassert(mesh); 02036 // linear search is ok because of small size 02037 for(std::list<CMDEntry>::iterator it = _Cache.begin(); it != _Cache.end(); ++it) 02038 { 02039 if (it->Format == format && it->Mesh == mesh) 02040 { 02041 // relink at start (most recent use) 02042 _Cache.splice(_Cache.begin(), _Cache, it); 02043 return it->MD; 02044 } 02045 } 02046 if (_NumMD == _MaxNumMD) 02047 { 02048 _Cache.pop_back(); // remove least recently used mesh 02049 -- _NumMD; 02050 } 02051 //NLMISC::TTicks start = NLMISC::CTime::getPerformanceTime(); 02052 _Cache.push_front(CMDEntry()); 02053 _Cache.front().Mesh = mesh; 02054 _Cache.front().Format = format; 02055 buildRdrPassSet(_Cache.front().MD.RdrPasses, *mesh); 02056 buildVB(_Cache.front().MD.VB, *mesh, format); 02057 ++ _NumMD; 02058 /*NLMISC::TTicks end = NLMISC::CTime::getPerformanceTime(); 02059 nlinfo("mesh setup time = %.2f", (float) (1000 * NLMISC::CTime::ticksToSecond(end - start))); */ 02060 return _Cache.front().MD; 02061 } |
|
Definition at line 498 of file ps_mesh.h. Referenced by getMeshDisplay(). |
|
Definition at line 496 of file ps_mesh.h. Referenced by CMeshDisplayShare(), and getMeshDisplay(). |
|
Definition at line 497 of file ps_mesh.h. Referenced by CMeshDisplayShare(), and getMeshDisplay(). |