diff --git a/MeshConverter/src/ms3d/ms3d.cpp b/MeshConverter/src/ms3d/ms3d.cpp index cbc9de9..2c3b24d 100644 --- a/MeshConverter/src/ms3d/ms3d.cpp +++ b/MeshConverter/src/ms3d/ms3d.cpp @@ -4,15 +4,137 @@ Ms3d::Ms3d() { + m_numVertices = 0; + m_numTriangles = 0; + m_numMeshes = 0; + m_numMaterials = 0; + m_vertices = NULL; + m_triangles = NULL; + m_meshes = NULL; + m_materials = NULL; } void Ms3d::Release() { + delete[] m_vertices; + delete[] m_triangles; + delete[] m_meshes; + delete[] m_materials; + m_numVertices = 0; + m_numTriangles = 0; + m_numMeshes = 0; + m_numMaterials = 0; } bool Ms3d::Load(const std::string &file) { - return false; + FILE *fp; + Ms3dHeader header; + + fp = fopen(file.c_str(), "rb"); + if (!fp) + return false; + + // filetype verification + fread(&header.id, 10, 1, fp); + if (strncmp(header.id, "MS3D000000", 10) != 0) + { + fclose(fp); + return false; + } + fread(&header.version, 4, 1, fp); + if (header.version != 4) + { + fclose(fp); + return false; + } + + // read vertices + fread(&m_numVertices, 2, 1, fp); + m_vertices = new Ms3dVertex[m_numVertices]; + + for (int i = 0; i < m_numVertices; ++i) + { + Ms3dVertex *vertex = &m_vertices[i]; + + fread(&vertex->editorFlags, 1, 1, fp); + fread(&vertex->vertex.x, 4, 1, fp); + fread(&vertex->vertex.y, 4, 1, fp); + fread(&vertex->vertex.z, 4, 1, fp); + fread(&vertex->jointIndex, 1, 1, fp); + fread(&vertex->unused, 1, 1, fp); + } + + // read triangle definitions + fread(&m_numTriangles, 2, 1, fp); + m_triangles = new Ms3dTriangle[m_numTriangles]; + + for (int i = 0; i < m_numTriangles; ++i) + { + Ms3dTriangle *triangle = &m_triangles[i]; + + fread(&triangle->editorFlags, 2, 1, fp); + for (int j = 0; j < 3; ++j) + fread(&triangle->vertices[j], 2, 1, fp); + for (int j = 0; j < 3; ++j) + { + fread(&triangle->normals[j].x, 4, 1, fp); + fread(&triangle->normals[j].y, 4, 1, fp); + fread(&triangle->normals[j].z, 4, 1, fp); + } + for (int j = 0; j < 3; ++j) + { + fread(&triangle->texCoords[j].x, 4, 1, fp); + fread(&triangle->texCoords[j].y, 4, 1, fp); + } + fread(&triangle->smoothingGroup, 1, 1, fp); + fread(&triangle->meshIndex, 1, 1, fp); + } + + // read mesh information + fread(&m_numMeshes, 2, 1, fp); + m_meshes = new Ms3dMesh[m_numMeshes]; + + for (int i = 0; i < m_numMeshes; ++i) + { + Ms3dMesh *mesh = &m_meshes[i]; + + fread(&mesh->editorFlags, 1, 1, fp); + fread(&mesh->name, 32, 1, fp); + fread(&mesh->numTriangles, 2, 1, fp); + mesh->triangles = new unsigned short[mesh->numTriangles]; + for (int j = 0; j < mesh->numTriangles; ++j) + fread(&mesh->triangles[j], 2, 1, fp); + fread(&mesh->materialIndex, 1, 1, fp); + } + + // read material information + fread(&m_numMaterials, 2, 1, fp); + m_materials = new Ms3dMaterial[m_numMaterials]; + + for (int i = 0; i < m_numMaterials; ++i) + { + Ms3dMaterial *material = &m_materials[i]; + + fread(&material->name, 32, 1, fp); + for (int j = 0; j < 4; ++j) + fread(&material->ambient[j], 4, 1, fp); + for (int j = 0; j < 4; ++j) + fread(&material->diffuse[j], 4, 1, fp); + for (int j = 0; j < 4; ++j) + fread(&material->specular[j], 4, 1, fp); + for (int j = 0; j < 4; ++j) + fread(&material->emissive[j], 4, 1, fp); + fread(&material->shininess, 4, 1, fp); + fread(&material->transparency, 4, 1, fp); + fread(&material->mode, 1, 1, fp); + fread(&material->texture, 128, 1, fp); + fread(&material->alpha, 128, 1, fp); + } + + fclose(fp); + + return true; } bool Ms3d::ConvertToMesh(const std::string &file) diff --git a/MeshConverter/src/ms3d/ms3d.h b/MeshConverter/src/ms3d/ms3d.h index 91a25cc..c0ae3e4 100644 --- a/MeshConverter/src/ms3d/ms3d.h +++ b/MeshConverter/src/ms3d/ms3d.h @@ -2,6 +2,65 @@ #define __MS3D_H_INCLUDED__ #include +#include "../geometry/vector3.h" +#include "../geometry/vector2.h" + +struct Ms3dHeader +{ + char id[10]; + long version; +}; + +struct Ms3dVertex +{ + unsigned char editorFlags; + Vector3 vertex; + char jointIndex; + unsigned char unused; +}; + +struct Ms3dTriangle +{ + unsigned short editorFlags; + unsigned short vertices[3]; + Vector3 normals[3]; + Vector2 texCoords[3]; + unsigned char smoothingGroup; + unsigned char meshIndex; +}; + +struct Ms3dMesh +{ + unsigned char editorFlags; + char name[32]; + unsigned short numTriangles; + unsigned short *triangles; + char materialIndex; + + Ms3dMesh() + { + triangles = NULL; + } + + ~Ms3dMesh() + { + delete[] triangles; + } +}; + +struct Ms3dMaterial +{ + char name[32]; + float ambient[4]; + float diffuse[4]; + float specular[4]; + float emissive[4]; + float shininess; + float transparency; + char mode; + char texture[128]; + char alpha[128]; +}; class Ms3d { @@ -13,6 +72,24 @@ public: bool Load(const std::string &file); bool ConvertToMesh(const std::string &file); + unsigned short GetNumVertices() { return m_numVertices; } + unsigned short GetNumTriangles() { return m_numTriangles; } + unsigned short GetNumMeshes() { return m_numMeshes; } + unsigned short GetNumMaterials() { return m_numMaterials; } + Ms3dVertex* GetVertices() { return m_vertices; } + Ms3dTriangle* GetTriangles() { return m_triangles; } + Ms3dMesh* GetMeshes() { return m_meshes; } + Ms3dMaterial* GetMaterials() { return m_materials; } + +private: + unsigned short m_numVertices; + unsigned short m_numTriangles; + unsigned short m_numMeshes; + unsigned short m_numMaterials; + Ms3dVertex *m_vertices; + Ms3dTriangle *m_triangles; + Ms3dMesh *m_meshes; + Ms3dMaterial *m_materials; }; #endif