Exemplo n.º 1
0
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 ...");
}