s32 WBFS_OpenNamed(char *partition) { unsigned long i; PartitionInfo_t t; for (i = 0; i < GetNumPartitions(); i++) { if (GetPartitionInfo(i, &t) == 0 && memcmp(t.name, partition, strlen(t.name)) == 0) { partition_idx = i; return 0; } } return -1; }
/** Private helper method which builds the actual destination mesh after partitioning has happened. */ void U2SkinPartition::BuildResultMesh(U2MeshBuilder &srcMeshBlder, U2MeshBuilder &dstMeshBlder) { // FILE_LOG(logDEBUG) << _T("Start BuildResultMesh ..."); uint32 i; for(i=0; i < dstMeshBlder.m_vertexArray.FilledSize(); ++i) { U2MeshBuilder::Vertex* pVert = dstMeshBlder.m_vertexArray[i]; U2_DELETE pVert; } dstMeshBlder.m_vertexArray.RemoveAll(); for(i=0; i < dstMeshBlder.m_triangleArray.FilledSize(); ++i) { U2MeshBuilder::Triangle* pTri = dstMeshBlder.m_triangleArray[i]; U2_DELETE pTri; } dstMeshBlder.m_triangleArray.RemoveAll(); int partitionIdx; int numPartitions = GetNumPartitions(); for(partitionIdx=0; partitionIdx < numPartitions; ++partitionIdx) { const Partition& partition = *m_partitions[partitionIdx]; // record the original group id in the groupMapArray m_groupMappings.AddElem(partition.GetGroupId()); //for(int i=0; i < partition.GetBonePalette().FilledSize(); ++i) //{ // FILE_LOG(logDEBUG) << _T("BonePalette : ") << partition.GetBonePalette()[i]; //} // transfer the partition vertices and triangles uint32 i; const U2PrimitiveVec<int>& triArray = partition.GetTriangleIndices(); for(i=0; i < triArray.FilledSize(); ++i) { U2MeshBuilder::Triangle& tri = srcMeshBlder.GetTriangleAt(triArray[i]); // transfer the 3 vertices of the triangle int origVertexIdx[3]; tri.GetVertexIndices(origVertexIdx[0], origVertexIdx[1], origVertexIdx[2]); int triPoint; int newVertexIdx[3]; for(triPoint=0; triPoint < 3; ++triPoint) { const U2MeshBuilder::Vertex& v = srcMeshBlder.GetVertexAt(origVertexIdx[triPoint]); // convert the global joint indices to partition-local joint indices const D3DXVECTOR4& globalBoneIndices = v.GetBoneIndices(); D3DXVECTOR4 localBoneIndices; localBoneIndices.x = float(partition.GlobalToLocalBoneIdx(int(globalBoneIndices.x))); localBoneIndices.y = float(partition.GlobalToLocalBoneIdx(int(globalBoneIndices.y))); localBoneIndices.z = float(partition.GlobalToLocalBoneIdx(int(globalBoneIndices.z))); localBoneIndices.w = float(partition.GlobalToLocalBoneIdx(int(globalBoneIndices.w))); // add the vertex to the destination mesh and correct the joint indices newVertexIdx[triPoint] = dstMeshBlder.GetNumVertices(); U2MeshBuilder::Vertex *pNewVert = U2_NEW U2MeshBuilder::Vertex; memcpy_s(pNewVert, sizeof(v), &v, sizeof(v)); dstMeshBlder.AddVertex(*pNewVert); dstMeshBlder.GetVertexAt(newVertexIdx[triPoint]).SetBoneIndices(localBoneIndices); } // update the triangle and add to the dest mesh's triangle array tri.SetGroupId(partitionIdx); tri.SetVertexIndices(newVertexIdx[0], newVertexIdx[1], newVertexIdx[2]); U2MeshBuilder::Triangle* pNewTri = U2_NEW U2MeshBuilder::Triangle; memcpy_s(pNewTri, sizeof(U2MeshBuilder::Triangle), &tri, sizeof(U2MeshBuilder::Triangle)); dstMeshBlder.AddTriangle(*pNewTri); } } //for(uint32 i=0; i < dstMeshBlder.GetNumTriangles(); ++i) //{ // int i0, i1, i2; // dstMeshBlder.GetTriangleAt(i).GetVertexIndices(i0, i1, i2); // FILE_LOG(logDEBUG) << _T("Dst Triindex : ") << i0 << i1 << i2; //} // finally, do a cleanup on the dest mesh to remove any redundant vertices dstMeshBlder.Cleanup(0); //#ifdef DEBUG // for(uint32 vertexIndex=0;vertexIndex < dstMeshBlder.GetNumVertices(); ++vertexIndex) // { // FILE_LOG(logDEBUG) << _T("Vertex ") << vertexIndex << _T( ": X , ") << // dstMeshBlder.GetVertexAt(vertexIndex).m_vert.x << _T( ": Y , ") << // dstMeshBlder.GetVertexAt(vertexIndex).m_vert.y << _T( ": Z , ") << // dstMeshBlder.GetVertexAt(vertexIndex).m_vert.z; // } //#endif // FILE_LOG(logDEBUG) << _T("End BuildResultMesh ..."); }