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; }
bool DeserializeMesh (const NewtonMesh* const mesh, TiXmlElement* const rootNode) { // load all the vertexData TiXmlElement* const pointElement = (TiXmlElement*) rootNode->FirstChild ("points"); int positionCount; TiXmlElement* const positionsElement = (TiXmlElement*) pointElement->FirstChild ("position"); positionsElement->Attribute("float4", &positionCount); dFloat* const positions = new dFloat[4 * positionCount]; dStringToFloatArray (positionsElement->Attribute("floats"), positions, 4 * positionCount); int normalCount; TiXmlElement* normalsElement = (TiXmlElement*) pointElement->FirstChild ("normal"); normalsElement->Attribute("float3", &normalCount); dFloat* const normals = new dFloat[3 * normalCount]; dStringToFloatArray (normalsElement->Attribute("floats"), normals, 3 * normalCount); int uv0Count; TiXmlElement* uv0Element = (TiXmlElement*) pointElement->FirstChild ("uv0"); uv0Element->Attribute("float2", &uv0Count); dFloat* const uv0 = new dFloat[2 * uv0Count]; dStringToFloatArray (uv0Element->Attribute("floats"), uv0, 2 * uv0Count); int uv1Count; TiXmlElement* uv1Element = (TiXmlElement*) pointElement->FirstChild ("uv1"); uv1Element->Attribute("float2", &uv1Count); dFloat* const 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* const faceIndexCount = new int[faceCount]; dStringToIntArray (polygonsElement->Attribute("faceIndexCount"), faceIndexCount, faceCount); int* const 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* const positionVertexIndex = new int [indexCount]; TiXmlElement* const positionVertexIndexElement = (TiXmlElement*) polygonsElement->FirstChild ("position"); dStringToIntArray (positionVertexIndexElement->Attribute("index"), positionVertexIndex, indexCount); int* const normalVertexIndex = new int [indexCount]; TiXmlElement* const normalVertexIndexElement = (TiXmlElement*) polygonsElement->FirstChild ("normal"); dStringToIntArray (normalVertexIndexElement->Attribute("index"), normalVertexIndex, indexCount); int* const uv0VertexIndex = new int [indexCount]; TiXmlElement* const uv0VertexIndexElement = (TiXmlElement*) polygonsElement->FirstChild ("uv0"); dStringToIntArray (uv0VertexIndexElement->Attribute("index"), uv0VertexIndex, indexCount); int* const uv1VertexIndex = new int [indexCount]; TiXmlElement* const 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); NewtonMeshBuildFromVertexListIndexList(mesh, 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; }