#include <lod_character_shape.h>
Nevrax France
Definition at line 130 of file lod_character_shape.h.
Public Member Functions | |
| bool | addAnim (const CAnimBuild &animBuild) |
| void | buildMesh (const std::string &name, const CLodCharacterShapeBuild &lodBuild) |
| CLodCharacterShape () | |
| Constructor. | |
| sint | getAnimIdByName (const std::string &name) const |
| get the animId from a name. -1 if not found | |
| const CVector3s * | getAnimKey (uint animId, TGlobalAnimationTime time, bool wrapMode, CVector &unPackScaleFactor) const |
| sint | getBoneIdByName (const std::string &name) const |
| get a bone id, according to its name. -1 if not found | |
| const std::string & | getName () const |
| Get name of this lod. | |
| const CVector * | getNormals () const |
| get a ptr to the triangles indices | |
| uint | getNumBones () const |
| get the number of bones | |
| uint | getNumTriangles () const |
| get the number of triangles of this mesh | |
| uint | getNumVertices () const |
| get the number of vertices of this mesh | |
| const uint32 * | getTriangleArray () const |
| get a ptr to the triangles indices | |
| const CUV * | getUVs () const |
| get a ptr on the UVs. | |
| void | serial (NLMISC::IStream &f) |
| serial this shape | |
Vertex per Bone AlphaTesting | |
This system is used for example to remove weapon of a Lod, using AlphaTesting (ie the polygons of the weapons are still drawn, but with alpha==0 => invisible) | |
| void | addBoneAlpha (uint boneId, std::vector< uint8 > &tmpAlphas) const |
| Add a bone alpha influence to tmpAlpha. | |
| void | startBoneAlpha (std::vector< uint8 > &tmpAlphas) const |
| init the process by resize-ing a tmp uint8 vector of getNumVertices() size, and reset to 0 | |
Private Types | |
| typedef TStrIdMap::const_iterator | CstItStrIdMap |
| typedef TStrIdMap::iterator | ItStrIdMap |
| typedef std::map< std::string, uint32 > | TStrIdMap |
| Map name To Id. | |
Private Attributes | |
| TStrIdMap | _AnimMap |
| std::vector< CAnim > | _Anims |
| List of animation. | |
| TStrIdMap | _BoneMap |
| std::vector< CBoneInfluence > | _Bones |
| List of bones and vertices they influence. | |
| std::string | _Name |
| std::vector< CVector > | _Normals |
| uint32 | _NumTriangles |
| uint32 | _NumVertices |
| std::vector< uint32 > | _TriangleIndices |
| numTriangles * 3. | |
| std::vector< CUV > | _UVs |
|
|
Definition at line 278 of file lod_character_shape.h. |
|
|
Definition at line 277 of file lod_character_shape.h. |
|
|
Map name To Id.
Definition at line 276 of file lod_character_shape.h. |
|
|
Constructor.
Definition at line 330 of file lod_character_shape.cpp. References _NumTriangles, and _NumVertices.
00331 {
00332 _NumVertices= 0;
00333 _NumTriangles= 0;
00334 }
|
|
|
Add an animation. many nlAssert to verify array size etc... return false, if same AnimName exist. NB: the entire animation is compressed to CVector3s internally. Definition at line 411 of file lod_character_shape.cpp. References _AnimMap, _Anims, _NumVertices, NL3D::CLodCharacterShape::CAnimBuild::AnimLength, NL3D::CLodCharacterShape::CAnim::AnimLength, NLMISC::clamp(), getAnimIdByName(), NL3D::CLodCharacterShape::CAnim::Keys, NL3D::CLodCharacterShape::CAnimBuild::Keys, NLMISC::CVector::maxof(), NL3D::CLodCharacterShape::CAnim::Name, NL3D::CLodCharacterShape::CAnimBuild::Name, nlassert, NL3D::CLodCharacterShape::CAnimBuild::NumKeys, NL3D::CLodCharacterShape::CAnim::NumKeys, NL3D::CLodCharacterShape::CAnim::OOAnimLength, sint16, uint, NL3D::CLodCharacterShape::CAnim::UnPackScaleFactor, v, NL3D::CLodCharacterShape::CVector3s::x, NLMISC::CVector::x, NLMISC::CVectorD::x, NL3D::CLodCharacterShape::CVector3s::y, NLMISC::CVector::y, NLMISC::CVectorD::y, NL3D::CLodCharacterShape::CVector3s::z, NLMISC::CVector::z, and NLMISC::CVectorD::z. Referenced by NL3D::CLodCharacterBuilder::addAnim().
00412 {
00413 // first, verify don't exist.
00414 if(getAnimIdByName(animBuild.Name)!=-1)
00415 return false;
00416
00417 // build basics of the animation
00418 CAnim dstAnim;
00419 dstAnim.Name= animBuild.Name;
00420 dstAnim.AnimLength= animBuild.AnimLength;
00421 // Possible to have an Anim with just one key. setup an epsilon for animLength if 0.
00422 if(dstAnim.AnimLength<=0)
00423 dstAnim.AnimLength= 0.001f;
00424 dstAnim.OOAnimLength= 1.0f / animBuild.AnimLength;
00425 dstAnim.NumKeys= animBuild.NumKeys;
00426 // verify size of the array
00427 nlassert(dstAnim.NumKeys>0);
00428 nlassert(dstAnim.NumKeys * _NumVertices == animBuild.Keys.size());
00429 // resize dest array
00430 dstAnim.Keys.resize(animBuild.Keys.size());
00431
00432
00433 // Pack animation. 1st pass: compute max size over the animation vertices
00434 uint i;
00435 // minimum shape size is , say, 1 cm :)
00436 CVector maxSize(0.01f, 0.01f, 0.01f);
00437 for(i=0;i<animBuild.Keys.size();i++)
00438 {
00439 // take the maxSize of the abs values
00440 maxSize.maxof(maxSize, -animBuild.Keys[i]);
00441 maxSize.maxof(maxSize, animBuild.Keys[i]);
00442 }
00443
00444 // compute the UnPackScaleFactor ie maxSize, to be multiplied by max Abs value of a sint16
00445 dstAnim.UnPackScaleFactor= maxSize * (1.0f/32767);
00446
00447 // Pack animation. 2st pass: pack.
00448 CVectorD packScaleFactor;
00449 packScaleFactor.x= 1.0 / dstAnim.UnPackScaleFactor.x;
00450 packScaleFactor.y= 1.0 / dstAnim.UnPackScaleFactor.y;
00451 packScaleFactor.z= 1.0 / dstAnim.UnPackScaleFactor.z;
00452 // For all key vertices
00453 for(i=0;i<animBuild.Keys.size();i++)
00454 {
00455 CVector v= animBuild.Keys[i];
00456 CVector3s &dstV= dstAnim.Keys[i];
00457
00458 // compress
00459 v.x= float(v.x*packScaleFactor.x);
00460 v.y= float(v.y*packScaleFactor.y);
00461 v.z= float(v.z*packScaleFactor.z);
00462 // clamp to sint16 limits (for float precision problems).
00463 clamp(v.x, -32767, 32767);
00464 clamp(v.y, -32767, 32767);
00465 clamp(v.z, -32767, 32767);
00466 // get into the vector3s
00467 dstV.x= (sint16)floor(v.x);
00468 dstV.y= (sint16)floor(v.y);
00469 dstV.z= (sint16)floor(v.z);
00470 }
00471
00472
00473 // Add the anim to the array, and add an entry to the map
00474 _Anims.push_back(dstAnim);
00475 _AnimMap.insert(make_pair(dstAnim.Name, _Anims.size()-1));
00476
00477 return true;
00478 }
|
|
||||||||||||
|
Add a bone alpha influence to tmpAlpha.
Definition at line 641 of file lod_character_shape.cpp. References _Bones, NL3D::CLodCharacterShape::CBoneInfluence::InfVertices, uint, and NL3D::CLodCharacterShape::CVertexInf::VertexId. Referenced by NL3D::CSkeletonModel::computeCLodVertexAlpha().
00642 {
00643 // Yoyo: This is an error to not have the same skeleton that the one stored in the lod shape. But must not crash
00644 if(boneId>=_Bones.size())
00645 return;
00646 const CBoneInfluence &bone= _Bones[boneId];
00647
00648 // for all vertices influenced by this bone, must set the alpha to full
00649 for(uint i=0; i<bone.InfVertices.size(); i++)
00650 {
00651 const CVertexInf &vInf= bone.InfVertices[i];
00652 tmpAlphas[vInf.VertexId]= 255;
00653 }
00654 }
|
|
||||||||||||
|
build the Mesh base information NB: SkinWeights array tells for each vertex what bone to use (for alpha test removing) Definition at line 337 of file lod_character_shape.cpp. References _AnimMap, _Anims, _BoneMap, _Bones, _Normals, _NumTriangles, _NumVertices, _TriangleIndices, NL3D::CLodCharacterShapeBuild::BonesNames, NL3D::CLodCharacterShape::CVertexInf::Influence, NL3D_MESH_SKINNING_MAX_MATRIX, nlassert, NL3D::CLodCharacterShapeBuild::Normals, NL3D::CLodCharacterShapeBuild::SkinWeights, NL3D::CLodCharacterShapeBuild::TriangleIndices, uint, NL3D::CLodCharacterShapeBuild::UVs, NL3D::CLodCharacterShape::CVertexInf::VertexId, and NL3D::CLodCharacterShapeBuild::Vertices. Referenced by NL3D::CLodCharacterBuilder::setShape().
00338 {
00339 uint numVertices= lodBuild.Vertices.size();
00340 const vector<uint32> &triangleIndices= lodBuild.TriangleIndices;
00341 const vector<CMesh::CSkinWeight> &skinWeights= lodBuild.SkinWeights;
00342 const vector<CUV> &uvs= lodBuild.UVs;
00343 const vector<CVector> &normals= lodBuild.Normals;
00344
00345 nlassert(numVertices>0);
00346 nlassert(triangleIndices.size()>0);
00347 nlassert((triangleIndices.size()%3)==0);
00348 nlassert(skinWeights.size() == numVertices);
00349 nlassert(uvs.size() == numVertices);
00350 nlassert(normals.size() == numVertices);
00351
00352 // reset data
00353 contReset(_Anims);
00354 contReset(_AnimMap);
00355 contReset(_Bones);
00356 contReset(_BoneMap);
00357 contReset(_TriangleIndices);
00358 contReset(_UVs);
00359 contReset(_Normals);
00360
00361 // Copy data.
00362 _Name= name;
00363 _NumVertices= numVertices;
00364 _NumTriangles= triangleIndices.size()/3;
00365 _TriangleIndices= triangleIndices;
00366 _UVs= uvs;
00367 _Normals= normals;
00368
00369 // check indices.
00370 uint i;
00371 for(i=0;i<triangleIndices.size();i++)
00372 {
00373 nlassert(triangleIndices[i]<_NumVertices);
00374 }
00375
00376 // Copy bone names, and compute bone Map
00377 _Bones.resize(lodBuild.BonesNames.size());
00378 for(i=0; i<_Bones.size(); i++)
00379 {
00380 _Bones[i].Name= lodBuild.BonesNames[i];
00381 _BoneMap.insert( make_pair(_Bones[i].Name, i) );
00382 }
00383
00384 // "Normalize" SkinWeights for CLodCharacterShape
00385 for(i=0;i<skinWeights.size();i++)
00386 {
00387 nlassert(skinWeights[i].Weights[0]>0);
00388 // for all slots not 0
00389 for(uint j=0;j<NL3D_MESH_SKINNING_MAX_MATRIX;j++)
00390 {
00391 // if this this slot is used.
00392 if(skinWeights[i].Weights[j]>0)
00393 {
00394 uint boneId= skinWeights[i].MatrixId[j];
00395 nlassert(boneId < _Bones.size());
00396 // init the vInf data
00397 CVertexInf vInf;
00398 vInf.VertexId= i;
00399 vInf.Influence= skinWeights[i].Weights[j];
00400 // Insert this vertex influence in the bone.
00401 _Bones[boneId].InfVertices.push_back(vInf);
00402 }
00403 else
00404 // stop for this vertex.
00405 break;
00406 }
00407 }
00408 }
|
|
|
get the animId from a name. -1 if not found
Definition at line 541 of file lod_character_shape.cpp. References _AnimMap, and sint. Referenced by addAnim(), and NL3D::CSceneUser::getCLodAnimIdByName().
00542 {
00543 CstItStrIdMap it= _AnimMap.find(name);
00544 if(it == _AnimMap.end())
00545 return -1;
00546 else
00547 return it->second;
00548 }
|
|
||||||||||||||||||||
|
get a ptr to the vertices of the key according to animId and time. NB: the anim Loop if wrapMode is true
Definition at line 572 of file lod_character_shape.cpp. References _Anims, _NumVertices, NL3D::CLodCharacterShape::CAnim::AnimLength, NLMISC::clamp(), H_AUTO, NL3D::CLodCharacterShape::CAnim::Keys, NL3D::CLodCharacterShape::CAnim::NumKeys, NL3D::CLodCharacterShape::CAnim::OOAnimLength, sint, NL3D::TGlobalAnimationTime, uint, and NL3D::CLodCharacterShape::CAnim::UnPackScaleFactor. Referenced by NL3D::CLodCharacterManager::addRenderCharacterKey().
00573 {
00574 H_AUTO( NL3D_LodCharacterShape_getAnimKey )
00575
00576 float localTime;
00577
00578 if(animId>=_Anims.size())
00579 return NULL;
00580
00581 // get the anim.
00582 const CAnim &anim= _Anims[animId];
00583
00584 // scale info
00585 unPackScaleFactor= anim.UnPackScaleFactor;
00586
00587 // Loop mgt.
00588 if(wrapMode)
00589 localTime= (float)fmod(time, anim.AnimLength);
00590 else
00591 localTime= (float)time;
00592
00593 // Clamp to the range.
00594 clamp(localTime, 0, anim.AnimLength);
00595
00596 // get the key.
00597 sint keyId= (sint)floor( (localTime*anim.OOAnimLength) * anim.NumKeys );
00598 clamp(keyId, 0, sint(anim.NumKeys-1));
00599
00600 // return the key.
00601 return &anim.Keys[keyId * _NumVertices];
00602 }
|
|
|
get a bone id, according to its name. -1 if not found
Definition at line 552 of file lod_character_shape.cpp. References _BoneMap, and sint. Referenced by NL3D::CSkeletonModel::computeCLodVertexAlpha().
00553 {
00554 CstItStrIdMap it= _BoneMap.find(name);
00555 if(it == _BoneMap.end())
00556 return -1;
00557 else
00558 return it->second;
00559 }
|
|
|
Get name of this lod.
Definition at line 178 of file lod_character_shape.h. Referenced by NL3D::CLodCharacterManager::compile().
00178 {return _Name;}
|
|
|
get a ptr to the triangles indices
Definition at line 614 of file lod_character_shape.cpp. References _Normals, and _NumVertices. Referenced by NL3D::CLodCharacterManager::addRenderCharacterKey().
00615 {
00616 if(_NumVertices==0)
00617 return NULL;
00618
00619 return &_Normals[0];
00620 }
|
|
|
get the number of bones
Definition at line 190 of file lod_character_shape.h.
00190 {return _Bones.size();}
|
|
|
get the number of triangles of this mesh
Definition at line 187 of file lod_character_shape.h. References _NumTriangles, and uint. Referenced by NL3D::CLodCharacterManager::addRenderCharacterKey().
00187 {return _NumTriangles;}
|
|
|
get the number of vertices of this mesh
Definition at line 184 of file lod_character_shape.h. References _NumVertices, and uint. Referenced by NL3D::CLodCharacterBuilder::addAnim(), NL3D::CLodCharacterManager::addRenderCharacterKey(), NL3D::CLodCharacterManager::initInstance(), and startBoneAlpha().
00184 {return _NumVertices;}
|
|
|
get a ptr to the triangles indices
Definition at line 563 of file lod_character_shape.cpp. References _NumTriangles, _TriangleIndices, and uint32. Referenced by NL3D::CLodCharacterManager::addRenderCharacterKey().
00564 {
00565 if(_NumTriangles)
00566 return &_TriangleIndices[0];
00567 else
00568 return NULL;
00569 }
|
|
|
get a ptr on the UVs.
Definition at line 605 of file lod_character_shape.cpp. References _NumVertices. Referenced by NL3D::CLodCharacterManager::initInstance().
00606 {
00607 if(_NumVertices==0)
00608 return NULL;
00609
00610 return &_UVs[0];
00611 }
|
|
|
serial this shape
Definition at line 505 of file lod_character_shape.cpp. References _AnimMap, _Anims, _BoneMap, _Bones, _Normals, _NumTriangles, _NumVertices, _TriangleIndices, NLMISC::IStream::serial(), NLMISC::IStream::serialCheck(), NLMISC::IStream::serialCont(), NLMISC::IStream::serialVersion(), sint, and uint32.
00506 {
00507 // NEL_CLODSHAP
00508 f.serialCheck((uint32)'_LEN');
00509 f.serialCheck((uint32)'DOLC');
00510 f.serialCheck((uint32)'PAHS');
00511
00512 /*
00513 Version 1:
00514 - UVs and Normals.
00515 */
00516 sint ver= f.serialVersion(1);
00517
00518 f.serial(_Name);
00519 f.serial(_NumVertices);
00520 f.serial(_NumTriangles);
00521 f.serialCont(_Bones);
00522 f.serialCont(_BoneMap);
00523 f.serialCont(_TriangleIndices);
00524 f.serialCont(_Anims);
00525 f.serialCont(_AnimMap);
00526
00527 if(ver>=1)
00528 {
00529 f.serialCont(_UVs);
00530 f.serialCont(_Normals);
00531 }
00532 else
00533 {
00534 // Must init dummy UVs/normals
00535 _UVs.resize(_NumVertices, CUV(0,0));
00536 _Normals.resize(_NumVertices, CVector::K);
00537 }
00538 }
|
|
|
init the process by resize-ing a tmp uint8 vector of getNumVertices() size, and reset to 0
Definition at line 632 of file lod_character_shape.cpp. References getNumVertices(). Referenced by NL3D::CSkeletonModel::computeCLodVertexAlpha().
00633 {
00634 // clear
00635 tmpAlphas.clear();
00636 // alocate, and fill
00637 tmpAlphas.resize(getNumVertices(), 0);
00638 }
|
|
|
Definition at line 300 of file lod_character_shape.h. Referenced by addAnim(), buildMesh(), getAnimIdByName(), and serial(). |
|
|
List of animation.
Definition at line 297 of file lod_character_shape.h. Referenced by addAnim(), buildMesh(), getAnimKey(), and serial(). |
|
|
Definition at line 291 of file lod_character_shape.h. Referenced by buildMesh(), getBoneIdByName(), and serial(). |
|
|
List of bones and vertices they influence.
Definition at line 288 of file lod_character_shape.h. Referenced by addBoneAlpha(), buildMesh(), getNumBones(), and serial(). |
|
|
Definition at line 281 of file lod_character_shape.h. |
|
|
Definition at line 286 of file lod_character_shape.h. Referenced by buildMesh(), getNormals(), and serial(). |
|
|
Definition at line 283 of file lod_character_shape.h. Referenced by buildMesh(), CLodCharacterShape(), getNumTriangles(), getTriangleArray(), and serial(). |
|
|
Definition at line 282 of file lod_character_shape.h. Referenced by addAnim(), buildMesh(), CLodCharacterShape(), getAnimKey(), getNormals(), getNumVertices(), getUVs(), and serial(). |
|
|
numTriangles * 3.
Definition at line 294 of file lod_character_shape.h. Referenced by buildMesh(), getTriangleArray(), and serial(). |
|
|
Definition at line 285 of file lod_character_shape.h. |
1.3.6