#include <mesh_mrm_skinned.h>
Definition at line 423 of file mesh_mrm_skinned.h.
Public Member Functions | |
| void | build (const CVertexBuffer &buffer, const std::vector< CMesh::CSkinWeight > &skinWeight) |
| void | clear () |
| void | contReset () |
| uint | getNumVertices () const |
| CPackedVertex * | getPackedVertices () |
| const CPackedVertex * | getPackedVertices () const |
| void | getPos (CVector &dest, const CPackedVertex &src) const |
| void | serial (NLMISC::IStream &f) |
Private Attributes | |
| float | _DecompactScale |
| Decompact position values. | |
| std::vector< CPackedVertex > | _PackedBuffer |
|
||||||||||||
|
Definition at line 2018 of file mesh_mrm_skinned.cpp. References _DecompactScale, _PackedBuffer, buffer, NL3D::CMeshMRMSkinnedGeom::CPackedVertexBuffer::CPackedVertex::Matrices, NLMISC::CVector::maxof(), NLMISC::CVector::minof(), NL3D_MESH_MRM_SKINNED_DEFAULT_POS_SCALE, NL3D_MESH_MRM_SKINNED_MAX_MATRIX, nlassert, NL3D::CMeshMRMSkinnedGeom::CPackedVertexBuffer::CPackedVertex::setNormal(), NL3D::CMeshMRMSkinnedGeom::CPackedVertexBuffer::CPackedVertex::setPos(), NL3D::CMeshMRMSkinnedGeom::CPackedVertexBuffer::CPackedVertex::setUV(), NL3D::CMeshMRMSkinnedGeom::CPackedVertexBuffer::CPackedVertex::setWeight(), sint, uint, uint8, NL3D::CMeshMRMSkinnedGeom::CPackedVertexBuffer::CPackedVertex::Weights, NLMISC::CVector::x, NLMISC::CVector::y, and NLMISC::CVector::z. Referenced by NL3D::CMeshMRMSkinnedGeom::build().
02019 {
02020 const uint numVertices = buffer.getNumVertices();
02021 nlassert (numVertices == skinWeight.size());
02022 nlassert (buffer.getVertexFormat() & (CVertexBuffer::PositionFlag|CVertexBuffer::NormalFlag|CVertexBuffer::TexCoord0Flag) == (CVertexBuffer::PositionFlag|CVertexBuffer::NormalFlag|CVertexBuffer::TexCoord0Flag));
02023
02024 _PackedBuffer.resize (numVertices);
02025
02026 // default scale
02027 _DecompactScale = NL3D_MESH_MRM_SKINNED_DEFAULT_POS_SCALE;
02028
02029 if (numVertices)
02030 {
02031 // Get the min max of the bbox
02032 CVector _min = *(const CVector*)buffer.getVertexCoordPointer(0);
02033 CVector _max = _min;
02034
02035 // For each vertex
02036 uint i;
02037 for (i=1; i<numVertices; i++)
02038 {
02039 // Update min max
02040 const CVector &vect = *(const CVector*)buffer.getVertexCoordPointer(i);
02041 _min.minof(_min, vect);
02042 _max.maxof(_max, vect);
02043 }
02044
02045 // Scale enough ?
02046 float max_width = std::max((float)fabs(_min.x), std::max((float)fabs(_min.y), (float)fabs(_min.z)));
02047 max_width = std::max(max_width, std::max((float)fabs(_max.x), std::max((float)fabs(_max.y), (float)fabs(_max.z))));
02048 _DecompactScale = std::max(_DecompactScale, max_width / 32767.f);
02049
02050 // Pack
02051 for (i=0; i<numVertices; i++)
02052 {
02053 CPackedVertex &vertex = _PackedBuffer[i];
02054
02055 // Position
02056 vertex.setPos (*(const CVector*)buffer.getVertexCoordPointer(i), _DecompactScale);
02057
02058 // Normal
02059 vertex.setNormal (*(const CVector*)buffer.getNormalCoordPointer(i));
02060
02061 // UV
02062 const float *uv = (const float*)buffer.getTexCoordPointer(i, 0);
02063 vertex.setUV (uv[0], uv[1]);
02064
02065 // Matrices
02066 uint j;
02067 sint weightSum = 0;
02068 for (j=0; j<NL3D_MESH_MRM_SKINNED_MAX_MATRIX; j++)
02069 {
02070 vertex.Matrices[j] = (uint8)skinWeight[i].MatrixId[j];
02071 vertex.setWeight (j, skinWeight[i].Weights[j]);
02072 weightSum += (sint)vertex.Weights[j];
02073 }
02074
02075 // Weight error
02076 weightSum = 255 - weightSum;
02077
02078 // Add error to the first weight
02079 nlassert ((sint)vertex.Weights[0] + weightSum <= 255);
02080 nlassert ((sint)vertex.Weights[0] + weightSum > 0);
02081 vertex.Weights[0] += weightSum;
02082 }
02083 }
02084 }
|
|
|
Definition at line 475 of file mesh_mrm_skinned.h. References _PackedBuffer. Referenced by NL3D::CMeshMRMSkinnedGeom::build().
00476 {
00477 _PackedBuffer.clear();
00478 }
|
|
|
Definition at line 481 of file mesh_mrm_skinned.h. References _PackedBuffer, and NLMISC::contReset(). Referenced by NL3D::CMeshMRMSkinnedGeom::serial().
00482 {
00483 NLMISC::contReset (_PackedBuffer);
00484 }
|
|
|
Definition at line 505 of file mesh_mrm_skinned.h. References _PackedBuffer, and uint. Referenced by NL3D::CMeshMRMSkinnedGeom::build(), NL3D::CMeshMRMSkinnedGeom::compileRunTime(), NL3D::CMeshMRMSkinnedGeom::computeBonesId(), NL3D::CMeshMRMSkinnedGeom::getSkinWeights(), NL3D::CMeshMRMSkinnedGeom::getVertexBuffer(), and NL3D::CMeshMRMSkinnedGeom::updateRawSkinNormal().
00506 {
00507 return _PackedBuffer.size();
00508 }
|
|
|
Definition at line 496 of file mesh_mrm_skinned.h. References _PackedBuffer.
00497 {
00498 if (_PackedBuffer.empty())
00499 return NULL;
00500 else
00501 return &(_PackedBuffer[0]);
00502 }
|
|
|
Definition at line 487 of file mesh_mrm_skinned.h. References _PackedBuffer. Referenced by NL3D::CMeshMRMSkinnedGeom::applyGeomorphWithVBHardPtr(), NL3D::CMeshMRMSkinnedGeom::build(), NL3D::CMeshMRMSkinnedGeom::computeBonesId(), NL3D::CMeshMRMSkinnedGeom::getSkinWeights(), NL3D::CMeshMRMSkinnedGeom::getVertexBuffer(), and NL3D::CMeshMRMSkinnedGeom::updateRawSkinNormal().
00488 {
00489 if (_PackedBuffer.empty())
00490 return NULL;
00491 else
00492 return &(_PackedBuffer[0]);
00493 }
|
|
||||||||||||
|
Definition at line 511 of file mesh_mrm_skinned.h. References _DecompactScale, and src. Referenced by NL3D::CMeshMRMSkinnedGeom::computeBonesId(), NL3D::CMeshMRMSkinnedGeom::getVertexBuffer(), and NL3D::CMeshMRMSkinnedGeom::updateRawSkinNormal().
00512 {
00513 src.getPos (dest, _DecompactScale);
00514 }
|
|
|
Definition at line 1926 of file mesh_mrm_skinned.cpp. References _DecompactScale, _PackedBuffer, NLMISC::IStream::serial(), NLMISC::IStream::serialCont(), NLMISC::IStream::serialVersion(), and sint. Referenced by NL3D::CMeshMRMSkinnedGeom::serial().
01927 {
01928 // Version
01929 sint ver = f.serialVersion(0);
01930
01931 f.serialCont (_PackedBuffer);
01932 f.serial (_DecompactScale);
01933 }
|
|
|
Decompact position values.
Definition at line 521 of file mesh_mrm_skinned.h. |
|
|
Definition at line 524 of file mesh_mrm_skinned.h. Referenced by build(), clear(), contReset(), getNumVertices(), getPackedVertices(), and serial(). |
1.3.6