void DiMeshSerializerImpl::ImportMesh( DiDataStreamPtr& stream, DiMesh* pMesh ) { ReadFileHeader(stream); if (!stream->Eof()) { uint16 streamID = ReadChunk(stream); while(!stream->Eof() && ( streamID == DI_SUBMESH || streamID == DI_MESH_BOUNDS)) { switch(streamID) { case DI_SUBMESH: ReadSubMesh(stream, pMesh); break; case DI_MESH_BOUNDS: ReadBoundsInfo(stream, pMesh); break; } if (!stream->Eof()) { streamID = ReadChunk(stream); } } if (!stream->Eof()) { stream->Skip(-MSTREAM_OVERHEAD_SIZE); } } }
void OgreXmlSerializer::ReadMesh(MeshXml *mesh) { if (NextNode() != nnMesh) { throw DeadlyImportError("Root node is <" + m_currentNodeName + "> expecting <mesh>"); } DefaultLogger::get()->debug("Reading Mesh"); NextNode(); // Root level nodes while(m_currentNodeName == nnSharedGeometry || m_currentNodeName == nnSubMeshes || m_currentNodeName == nnSkeletonLink || m_currentNodeName == nnBoneAssignments || m_currentNodeName == nnLOD || m_currentNodeName == nnSubMeshNames || m_currentNodeName == nnExtremes || m_currentNodeName == nnPoses || m_currentNodeName == nnAnimations) { if (m_currentNodeName == nnSharedGeometry) { mesh->sharedVertexData = new VertexDataXml(); ReadGeometry(mesh->sharedVertexData); } else if (m_currentNodeName == nnSubMeshes) { NextNode(); while(m_currentNodeName == nnSubMesh) { ReadSubMesh(mesh); } } else if (m_currentNodeName == nnBoneAssignments) { ReadBoneAssignments(mesh->sharedVertexData); } else if (m_currentNodeName == nnSkeletonLink) { mesh->skeletonRef = ReadAttribute<std::string>("name"); DefaultLogger::get()->debug("Read skeleton link " + mesh->skeletonRef); NextNode(); } // Assimp incompatible/ignored nodes else SkipCurrentNode(); } }
int MREAData::ReadMesh(FILE* fp, int index, int segmentNum) { MeshData & mesh = m_meshes[index]; mesh.glList = 0; u32 nextOffset = ftell(fp) + m_sectionSizes[segmentNum]; fread(&mesh.header.unknown0x00, 4, 1, fp); toDWORD(mesh.header.unknown0x00); fread(mesh.header.transformMatrix, 4, 12, fp); for (u32 i = 0; i < 12; ++i) { toDWORD((u32&)mesh.header.transformMatrix[i]); } fread(mesh.header.boundingBox, 4, 6, fp); for (u32 i = 0; i < 6; ++i) { toDWORD((u32&)mesh.header.boundingBox[i]); } if (0 == index) { // minimum if (mesh.header.boundingBox[0] < minBounds.X) { minBounds.X = mesh.header.boundingBox[0]; } if (mesh.header.boundingBox[1] < minBounds.Y) { minBounds.Y = mesh.header.boundingBox[1]; } if (mesh.header.boundingBox[2] < minBounds.Z) { minBounds.Z = mesh.header.boundingBox[2]; } // maximum bounds if (mesh.header.boundingBox[3] > maxBounds.X) { maxBounds.X = mesh.header.boundingBox[3]; } if (mesh.header.boundingBox[4] > maxBounds.Y) { maxBounds.Y = mesh.header.boundingBox[4]; } if (mesh.header.boundingBox[5] > maxBounds.Z) { maxBounds.Z = mesh.header.boundingBox[5]; } } // move to next section data fseek(fp, nextOffset, SEEK_SET); ++segmentNum; nextOffset += m_sectionSizes[segmentNum]; u32 dataCount = m_sectionSizes[segmentNum] / 0x0C; u32 dataNum = 0; mesh.vertices.resize(dataCount); for(dataNum=0; dataNum<dataCount; ++dataNum) { fread(&mesh.vertices[dataNum].X, sizeof(float), 1, fp); fread(&mesh.vertices[dataNum].Y, sizeof(float), 1, fp); fread(&mesh.vertices[dataNum].Z, sizeof(float), 1, fp); toDWORD((u32&)mesh.vertices[dataNum].X); toDWORD((u32&)mesh.vertices[dataNum].Y); toDWORD((u32&)mesh.vertices[dataNum].Z); const tex vert = mesh.vertices[dataNum]; if (0) // == index) { // minimum bounds if (vert.X < minBounds.X) { minBounds.X = vert.X; } if (vert.Y < minBounds.Y) { minBounds.Y = vert.Y; } if (vert.Z < minBounds.Z) { minBounds.Z = vert.Z; } // maximum bounds if (vert.X > maxBounds.X) { maxBounds.X = vert.X; } if (vert.Y > maxBounds.Y) { maxBounds.Y = vert.Y; } if (vert.Z > maxBounds.Z) { maxBounds.Z = vert.Z; } } } // move to next section data fseek(fp, nextOffset, SEEK_SET); ++segmentNum; nextOffset += m_sectionSizes[segmentNum]; signed short x, y, z; dataCount = m_sectionSizes[segmentNum] / 0x06; mesh.normals.resize(dataCount); for(dataNum=0; dataNum<dataCount; ++dataNum) { fread(&x,sizeof(signed short),1,fp); fread(&y,sizeof(signed short),1,fp); fread(&z,sizeof(signed short),1,fp); toWORD((u16&)x); toWORD((u16&)y); toWORD((u16&)z); mesh.normals[dataNum].X = float(x) / 16834.0f; mesh.normals[dataNum].Y = float(y) / 16834.0f; mesh.normals[dataNum].Z = float(z) / 16834.0f; } // move to next section data fseek(fp, nextOffset, SEEK_SET); ++segmentNum; nextOffset += m_sectionSizes[segmentNum]; // read zero data // move to next section data fseek(fp, nextOffset, SEEK_SET); ++segmentNum; nextOffset += m_sectionSizes[segmentNum]; // read texture coordinate data dataCount = m_sectionSizes[segmentNum] / 0x08; mesh.uvs.resize(dataCount); for(dataNum=0; dataNum<dataCount; ++dataNum) { fread(&mesh.uvs[dataNum].U, sizeof(float), 1, fp); fread(&mesh.uvs[dataNum].V, sizeof(float), 1, fp); toDWORD((u32&)mesh.uvs[dataNum].U); toDWORD((u32&)mesh.uvs[dataNum].V); } // move to next section data fseek(fp, nextOffset, SEEK_SET); ++segmentNum; nextOffset += m_sectionSizes[segmentNum]; // read unknown data // move to next section data fseek(fp, nextOffset, SEEK_SET); ++segmentNum; nextOffset += m_sectionSizes[segmentNum]; // read sub mesh info data fread(&mesh.subMeshInfo.subMeshCount, 4, 1, fp); toDWORD(mesh.subMeshInfo.subMeshCount); mesh.subMeshInfo.subMeshOffsets.resize(mesh.subMeshInfo.subMeshCount); fread(&mesh.subMeshInfo.subMeshOffsets.front(), 4, mesh.subMeshInfo.subMeshCount, fp); for (u32 i = 0; i < mesh.subMeshInfo.subMeshCount; ++i) { toDWORD(mesh.subMeshInfo.subMeshOffsets[i]); } // move to next section data fseek(fp, nextOffset, SEEK_SET); ++segmentNum; nextOffset += m_sectionSizes[segmentNum]; // read sub mesh data for (u32 i = 0; i < mesh.subMeshInfo.subMeshCount; ++i) { ReadSubMesh(fp, mesh); // move to next section data fseek(fp, nextOffset, SEEK_SET); ++segmentNum; nextOffset += m_sectionSizes[segmentNum]; } return segmentNum; }