// create a convex hull dgMeshEffect::dgMeshEffect (dgMemoryAllocator* const allocator, const dgFloat64* const vertexCloud, dgInt32 count, dgInt32 strideInByte, dgFloat64 distTol) :dgPolyhedra(allocator) { Init(); if (count >= 4) { dgConvexHull3d convexHull (allocator, vertexCloud, strideInByte, count, distTol); if (convexHull.GetCount()) { dgInt32 vertexCount = convexHull.GetVertexCount(); dgStack<dgVector> pointsPool (convexHull.GetVertexCount()); dgVector* const points = &pointsPool[0]; for (dgInt32 i = 0; i < vertexCount; i ++) { points[i] = convexHull.GetVertex(i); } dgVector uv(dgFloat32 (0.0f), dgFloat32 (0.0f), dgFloat32 (0.0f), dgFloat32 (0.0f)); dgVector normal (dgFloat32 (0.0f), dgFloat32 (1.0f), dgFloat32 (0.0f), dgFloat32 (0.0f)); dgInt32 triangleCount = convexHull.GetCount(); dgStack<dgInt32> faceCountPool (triangleCount); dgStack<dgInt32> materialsPool (triangleCount); dgStack<dgInt32> vertexIndexListPool (triangleCount * 3); dgStack<dgInt32> normalIndexListPool (triangleCount * 3); memset (&materialsPool[0], 0, triangleCount * sizeof (dgInt32)); memset (&normalIndexListPool[0], 0, 3 * triangleCount * sizeof (dgInt32)); dgInt32 index = 0; dgInt32* const faceCount = &faceCountPool[0]; dgInt32* const vertexIndexList = &vertexIndexListPool[0]; for (dgConvexHull3d::dgListNode* faceNode = convexHull.GetFirst(); faceNode; faceNode = faceNode->GetNext()) { dgConvexHull3DFace& face = faceNode->GetInfo(); faceCount[index] = 3; vertexIndexList[index * 3 + 0] = face.m_index[0]; vertexIndexList[index * 3 + 1] = face.m_index[1]; vertexIndexList[index * 3 + 2] = face.m_index[2]; index ++; } BuildFromVertexListIndexList(triangleCount, faceCount, &materialsPool[0], &points[0].m_x, sizeof (dgVector), vertexIndexList, &normal.m_x, sizeof (dgVector), &normalIndexListPool[0], &uv.m_x, sizeof (dgVector), &normalIndexListPool[0], &uv.m_x, sizeof (dgVector), &normalIndexListPool[0]); RepairTJoints (); } } }
bool dMeshNodeInfo::Deserialize (TiXmlElement* rootNode, int revisionNumber) { DeserialiseBase(dGeometryNodeInfo, rootNode, revisionNumber); // load all the vertexData TiXmlElement* pointElement = (TiXmlElement*) rootNode->FirstChild ("points"); int positionCount; float* positions; TiXmlElement* positionsElement = (TiXmlElement*) pointElement->FirstChild ("position"); positionsElement->Attribute("float4", &positionCount); positions = new dFloat[4 * positionCount]; dStringToFloatArray (positionsElement->Attribute("floats"), positions, 4 * positionCount); int normalCount; float* normals; TiXmlElement* normalsElement = (TiXmlElement*) pointElement->FirstChild ("normal"); normalsElement->Attribute("float3", &normalCount); normals = new dFloat[3 * normalCount]; dStringToFloatArray (normalsElement->Attribute("floats"), normals, 3 * normalCount); int uv0Count; float* uv0; TiXmlElement* uv0Element = (TiXmlElement*) pointElement->FirstChild ("uv0"); uv0Element->Attribute("float2", &uv0Count); uv0 = new dFloat[2 * uv0Count]; dStringToFloatArray (uv0Element->Attribute("floats"), uv0, 2 * uv0Count); int uv1Count; float* uv1; TiXmlElement* uv1Element = (TiXmlElement*) pointElement->FirstChild ("uv1"); uv1Element->Attribute("float2", &uv1Count); uv1 = new dFloat[2 * uv1Count]; dStringToFloatArray (uv1Element->Attribute("floats"), uv1, 2 * uv1Count); //load face informations TiXmlElement* polygonsElement = (TiXmlElement*) rootNode->FirstChild ("polygons"); int faceCount; polygonsElement->Attribute("count", &faceCount); int* faceIndexCount = new int[faceCount]; dStringToIntArray (polygonsElement->Attribute("faceIndexCount"), faceIndexCount, faceCount); int* faceMaterials = new int [faceCount]; TiXmlElement* materialElement = (TiXmlElement*) polygonsElement->FirstChild ("faceMaterial"); dStringToIntArray (materialElement->Attribute("index"), faceMaterials, faceCount); int indexCount = 0; for (int i = 0; i < faceCount; i ++) { indexCount += faceIndexCount[i]; } int* positionVertexIndex = new int [indexCount]; TiXmlElement* positionVertexIndexElement = (TiXmlElement*) polygonsElement->FirstChild ("position"); dStringToIntArray (positionVertexIndexElement->Attribute("index"), positionVertexIndex, indexCount); int* normalVertexIndex = new int [indexCount]; TiXmlElement* normalVertexIndexElement = (TiXmlElement*) polygonsElement->FirstChild ("normal"); dStringToIntArray (normalVertexIndexElement->Attribute("index"), normalVertexIndex, indexCount); int* uv0VertexIndex = new int [indexCount]; TiXmlElement* uv0VertexIndexElement = (TiXmlElement*) polygonsElement->FirstChild ("uv0"); dStringToIntArray (uv0VertexIndexElement->Attribute("index"), uv0VertexIndex, indexCount); int* uv1VertexIndex = new int [indexCount]; TiXmlElement* uv1VertexIndexElement = (TiXmlElement*) polygonsElement->FirstChild ("uv1"); dStringToIntArray (uv1VertexIndexElement->Attribute("index"), uv1VertexIndex, indexCount); BuildFromVertexListIndexList(faceCount, faceIndexCount, faceMaterials, &positions[0], 4 * sizeof (dFloat), positionVertexIndex, &normals[0], 3 * sizeof (dFloat), normalVertexIndex, &uv0[0], 2 * sizeof (dFloat), uv0VertexIndex, &uv1[0], 2 * sizeof (dFloat), uv1VertexIndex); delete uv1VertexIndex; delete uv0VertexIndex; delete normalVertexIndex; delete positionVertexIndex; delete faceMaterials; delete faceIndexCount; delete uv1; delete uv0; delete normals; delete positions; return true; }