diff --git a/src/ms3d/ms3d.cpp b/src/ms3d/ms3d.cpp index d58736c..f8feb9e 100644 --- a/src/ms3d/ms3d.cpp +++ b/src/ms3d/ms3d.cpp @@ -20,11 +20,11 @@ Ms3d::Ms3d() void Ms3d::Release() { - delete[] m_vertices; - delete[] m_triangles; - delete[] m_meshes; - delete[] m_materials; - delete[] m_joints; + SAFE_DELETE_ARRAY(m_vertices); + SAFE_DELETE_ARRAY(m_triangles); + SAFE_DELETE_ARRAY(m_meshes); + SAFE_DELETE_ARRAY(m_materials); + SAFE_DELETE_ARRAY(m_joints); m_numVertices = 0; m_numTriangles = 0; m_numMeshes = 0; @@ -32,34 +32,34 @@ void Ms3d::Release() m_numJoints = 0; } -bool Ms3d::Load(const std::string &file) +BOOL Ms3d::Load(const std::string &file) { FILE *fp; Ms3dHeader header; fp = fopen(file.c_str(), "rb"); if (!fp) - return false; + return FALSE; // filetype verification fread(&header.id, 10, 1, fp); if (strncmp(header.id, "MS3D000000", 10) != 0) { fclose(fp); - return false; + return FALSE; } fread(&header.version, 4, 1, fp); if (header.version != 4) { fclose(fp); - return false; + return FALSE; } // read vertices fread(&m_numVertices, 2, 1, fp); m_vertices = new Ms3dVertex[m_numVertices]; - for (int i = 0; i < m_numVertices; ++i) + for (uint16_t i = 0; i < m_numVertices; ++i) { Ms3dVertex *vertex = &m_vertices[i]; @@ -75,7 +75,7 @@ bool Ms3d::Load(const std::string &file) fread(&m_numTriangles, 2, 1, fp); m_triangles = new Ms3dTriangle[m_numTriangles]; - for (int i = 0; i < m_numTriangles; ++i) + for (uint16_t i = 0; i < m_numTriangles; ++i) { Ms3dTriangle *triangle = &m_triangles[i]; @@ -100,14 +100,14 @@ bool Ms3d::Load(const std::string &file) fread(&m_numMeshes, 2, 1, fp); m_meshes = new Ms3dMesh[m_numMeshes]; - for (int i = 0; i < m_numMeshes; ++i) + for (uint16_t i = 0; i < m_numMeshes; ++i) { Ms3dMesh *mesh = &m_meshes[i]; fread(&mesh->editorFlags, 1, 1, fp); ReadString(fp, mesh->name, 32); fread(&mesh->numTriangles, 2, 1, fp); - mesh->triangles = new unsigned short[mesh->numTriangles]; + mesh->triangles = new uint16_t[mesh->numTriangles]; for (int j = 0; j < mesh->numTriangles; ++j) fread(&mesh->triangles[j], 2, 1, fp); fread(&mesh->materialIndex, 1, 1, fp); @@ -119,7 +119,7 @@ bool Ms3d::Load(const std::string &file) { m_materials = new Ms3dMaterial[m_numMaterials]; - for (int i = 0; i < m_numMaterials; ++i) + for (uint16_t i = 0; i < m_numMaterials; ++i) { Ms3dMaterial *material = &m_materials[i]; @@ -149,7 +149,7 @@ bool Ms3d::Load(const std::string &file) { m_joints = new Ms3dJoint[m_numJoints]; - for (int i = 0; i < m_numJoints; ++i) + for (uint16_t i = 0; i < m_numJoints; ++i) { Ms3dJoint *joint = &m_joints[i]; @@ -165,7 +165,7 @@ bool Ms3d::Load(const std::string &file) fread(&joint->numRotationFrames, 2, 1, fp); fread(&joint->numTranslationFrames, 2, 1, fp); joint->rotationFrames = new Ms3dKeyFrame[joint->numRotationFrames]; - for (int j = 0; j < joint->numRotationFrames; ++j) + for (uint16_t j = 0; j < joint->numRotationFrames; ++j) { Ms3dKeyFrame *frame = &joint->rotationFrames[j]; fread(&frame->time, 4, 1, fp); @@ -174,7 +174,7 @@ bool Ms3d::Load(const std::string &file) fread(&frame->param.z, 4, 1, fp); } joint->translationFrames = new Ms3dKeyFrame[joint->numTranslationFrames]; - for (int j = 0; j < joint->numTranslationFrames; ++j) + for (uint16_t j = 0; j < joint->numTranslationFrames; ++j) { Ms3dKeyFrame *frame = &joint->translationFrames[j]; fread(&frame->time, 4, 1, fp); @@ -199,8 +199,8 @@ bool Ms3d::Load(const std::string &file) std::string line; std::string name; std::string temp; - int start; - int end; + int32_t start; + int32_t end; while (!feof(fp)) { @@ -233,206 +233,19 @@ bool Ms3d::Load(const std::string &file) m_animations.push_back(*animation); } } - delete[] buffer; + SAFE_DELETE_ARRAY(buffer); fclose(fp); } - return true; + return TRUE; } -bool Ms3d::ConvertToMesh(const std::string &file, float scaleFactor) -{ - FILE *fp = fopen(file.c_str(), "wb"); - if (fp == NULL) - return false; - - fputs("MESH", fp); - unsigned char version = 1; - fwrite(&version, 1, 1, fp); - - // vertices chunk - fputs("VTX", fp); - long numVertices = m_numVertices; - long sizeOfVertices = ((sizeof(float) * 3)) * numVertices + sizeof(long); - fwrite(&sizeOfVertices, sizeof(long), 1, fp); - fwrite(&numVertices, sizeof(long), 1, fp); - for (long i = 0; i < numVertices; ++i) - { - Ms3dVertex *vertex = &m_vertices[i]; - - vertex->vertex *= scaleFactor; - - fwrite(&vertex->vertex.x, sizeof(float), 1, fp); - fwrite(&vertex->vertex.y, sizeof(float), 1, fp); - fwrite(&vertex->vertex.z, sizeof(float), 1, fp); - } - - // triangles chunk - fputs("TRI", fp); - long numTriangles = m_numTriangles; - long sizeOfTriangles = (sizeof(int) * 4 + (sizeof(float) * 3) * 3 + (sizeof(float) * 2) * 3) * numTriangles + sizeof(long); - fwrite(&sizeOfTriangles, sizeof(long), 1, fp); - fwrite(&numTriangles, sizeof(long), 1, fp); - for (long i = 0; i < numTriangles; ++i) - { - Ms3dTriangle *triangle = &m_triangles[i]; - int index = triangle->vertices[0]; - fwrite(&index, sizeof(int), 1, fp); - index = triangle->vertices[1]; - fwrite(&index, sizeof(int), 1, fp); - index = triangle->vertices[2]; - fwrite(&index, sizeof(int), 1, fp); - - index = triangle->meshIndex; - fwrite(&index, sizeof(int), 1, fp); - - for (int j = 0; j < 3; ++j) - { - fwrite(&triangle->normals[j].x, sizeof(float), 1, fp); - fwrite(&triangle->normals[j].y, sizeof(float), 1, fp); - fwrite(&triangle->normals[j].z, sizeof(float), 1, fp); - } - for (int j = 0; j < 3; ++j) - { - fwrite(&triangle->texCoords[j].x, sizeof(float), 1, fp); - fwrite(&triangle->texCoords[j].y, sizeof(float), 1, fp); - } - } - - // sub-meshes / groups chunk - fputs("GRP", fp); - long numGroups = m_numMeshes; - long sizeOfGroupNames = 0; - for (long i = 0; i < numGroups; ++i) - sizeOfGroupNames += (m_meshes[i].name.length() + 1); - long sizeOfGroups = sizeOfGroupNames + (sizeof(int)) * numGroups + sizeof(long); - fwrite(&sizeOfGroups, sizeof(long), 1, fp); - fwrite(&numGroups, sizeof(long), 1, fp); - for (long i = 0; i < numGroups; ++i) - { - Ms3dMesh *mesh = &m_meshes[i]; - fwrite(mesh->name.c_str(), mesh->name.length(), 1, fp); - char c = '\0'; - fwrite(&c, 1, 1, fp); - int numTriangles = mesh->numTriangles; - fwrite(&numTriangles, sizeof(int), 1, fp); - } - - // joints chunk - fputs("JNT", fp); - long numJoints = m_numJoints; - long sizeOfJointNames = 0; - for (long i = 0; i < numJoints; ++i) - sizeOfJointNames += (m_joints[i].name.length() + 1); - long sizeOfJoints = sizeOfJointNames + (sizeof(int) + sizeof(float) * 3 + sizeof(float) * 3) * numJoints + sizeof(long); - fwrite(&sizeOfJoints, sizeof(long), 1, fp); - fwrite(&numJoints, sizeof(long), 1, fp); - for (long i = 0; i < numJoints; ++i) - { - Ms3dJoint *joint = &m_joints[i]; - - joint->position *= scaleFactor; - - fwrite(joint->name.c_str(), joint->name.length(), 1, fp); - char c = '\0'; - fwrite(&c, 1, 1, fp); - int parentIndex = FindIndexOfJoint(joint->parentName); - fwrite(&parentIndex, sizeof(int), 1, fp); - fwrite(&joint->position.x, sizeof(float), 1, fp); - fwrite(&joint->position.y, sizeof(float), 1, fp); - fwrite(&joint->position.z, sizeof(float), 1, fp); - fwrite(&joint->rotation.x, sizeof(float), 1, fp); - fwrite(&joint->rotation.y, sizeof(float), 1, fp); - fwrite(&joint->rotation.z, sizeof(float), 1, fp); - } - - // joints to vertices mapping chunk - fputs("JTV", fp); - long numMappings = numVertices; - long sizeOfJointMappings = (sizeof(int) + sizeof(float)) * numMappings + sizeof(long); - fwrite(&sizeOfJointMappings, sizeof(long), 1, fp); - fwrite(&numMappings, sizeof(long), 1, fp); - for (long i = 0; i < numMappings; ++i) - { - Ms3dVertex *vertex = &m_vertices[i]; - int jointIndex = vertex->jointIndex; - fwrite(&jointIndex, sizeof(int), 1, fp); - float weight = 1.0f; - fwrite(&weight, sizeof(float), 1, fp); - } - - // joint animation keyframes - fputs("JKF", fp); - long numFrames = m_numFrames; - long sizeOfJointFrames = ((6 * sizeof(float)) * m_numJoints) * numFrames + sizeof(long); - fwrite(&sizeOfJointFrames, sizeof(long), 1, fp); - fwrite(&numFrames, sizeof(long), 1, fp); - for (long i = 0; i < numFrames; ++i) - { - for (int j = 0; j < m_numJoints; ++j) - { - Ms3dJoint *joint = &m_joints[j]; - Ms3dKeyFrame *position; - Ms3dKeyFrame *rotation; - - if (i >= joint->numTranslationFrames) - position = &joint->translationFrames[0]; - else - position = &joint->translationFrames[i]; - if (i >= joint->numRotationFrames) - rotation = &joint->rotationFrames[0]; - else - rotation = &joint->rotationFrames[i]; - - position->param *= scaleFactor; - - fwrite(&position->param.x, sizeof(float), 1, fp); - fwrite(&position->param.y, sizeof(float), 1, fp); - fwrite(&position->param.z, sizeof(float), 1, fp); - fwrite(&rotation->param.x, sizeof(float), 1, fp); - fwrite(&rotation->param.y, sizeof(float), 1, fp); - fwrite(&rotation->param.z, sizeof(float), 1, fp); - } - } - - if (m_animations.size() > 0) - { - // figure out the size of all the animation name strings - long sizeofNames = 0; - for (unsigned int i = 0; i < m_animations.size(); ++i) - sizeofNames += m_animations[i].name.length() + 1; - - // animations chunk - fputs("ANI", fp); - long numAnimations = m_animations.size(); - long sizeofAnimations = (sizeof(long) * 2) * numAnimations + sizeofNames + sizeof(long); - fwrite(&sizeofAnimations, sizeof(long), 1, fp); - fwrite(&numAnimations, sizeof(long), 1, fp); - for (long i = 0; i < numAnimations; ++i) - { - long data; - const Ms3dAnimation *animation = &m_animations[i]; - //fputs(animation->name.c_str(), fp); - fputs(animation->name.c_str(), fp); - fwrite("\0", 1, 1, fp); - data = animation->startFrame; - fwrite(&data, sizeof(long), 1, fp); - data = animation->endFrame; - fwrite(&data, sizeof(long), 1, fp); - } - } - - fclose(fp); - - return true; -} - -int Ms3d::FindIndexOfJoint(const std::string &jointName) const +int32_t Ms3d::FindIndexOfJoint(const std::string &jointName) const { if (jointName.length() == 0) return -1; - for (int i = 0; i < m_numJoints; ++i) + for (uint16_t i = 0; i < m_numJoints; ++i) { Ms3dJoint *joint = &m_joints[i]; if (joint->name == jointName) diff --git a/src/ms3d/ms3d.h b/src/ms3d/ms3d.h index 3e15387..ee2225a 100644 --- a/src/ms3d/ms3d.h +++ b/src/ms3d/ms3d.h @@ -1,42 +1,43 @@ #ifndef __MS3D_H_INCLUDED__ #define __MS3D_H_INCLUDED__ -#include +#include "common.h" #include "../geometry/vector3.h" #include "../geometry/vector2.h" +#include #include struct Ms3dHeader { char id[10]; - long version; + int32_t version; }; struct Ms3dVertex { - unsigned char editorFlags; + uint8_t editorFlags; Vector3 vertex; - char jointIndex; - unsigned char unused; + int8_t jointIndex; + uint8_t unused; }; struct Ms3dTriangle { - unsigned short editorFlags; - unsigned short vertices[3]; + uint16_t editorFlags; + uint16_t vertices[3]; Vector3 normals[3]; Vector2 texCoords[3]; - unsigned char smoothingGroup; - unsigned char meshIndex; + uint8_t smoothingGroup; + uint8_t meshIndex; }; struct Ms3dMesh { - unsigned char editorFlags; + uint8_t editorFlags; std::string name; - unsigned short numTriangles; - unsigned short *triangles; - char materialIndex; + uint16_t numTriangles; + uint16_t *triangles; + int8_t materialIndex; Ms3dMesh() { @@ -45,7 +46,7 @@ struct Ms3dMesh ~Ms3dMesh() { - delete[] triangles; + SAFE_DELETE_ARRAY(triangles); } }; @@ -58,7 +59,7 @@ struct Ms3dMaterial float emissive[4]; float shininess; float transparency; - char mode; + int8_t mode; std::string texture; std::string alpha; }; @@ -71,13 +72,13 @@ struct Ms3dKeyFrame struct Ms3dJoint { - unsigned char editorFlags; + uint8_t editorFlags; std::string name; std::string parentName; Vector3 rotation; Vector3 position; - unsigned short numRotationFrames; - unsigned short numTranslationFrames; + uint16_t numRotationFrames; + uint16_t numTranslationFrames; Ms3dKeyFrame *rotationFrames; Ms3dKeyFrame *translationFrames; @@ -89,16 +90,16 @@ struct Ms3dJoint ~Ms3dJoint() { - delete[] rotationFrames; - delete[] translationFrames; + SAFE_DELETE_ARRAY(rotationFrames); + SAFE_DELETE_ARRAY(translationFrames); } }; struct Ms3dAnimation { std::string name; - unsigned int startFrame; - unsigned int endFrame; + uint32_t startFrame; + uint32_t endFrame; }; class Ms3d @@ -108,17 +109,16 @@ public: virtual ~Ms3d() { Release(); } void Release(); - bool Load(const std::string &file); - bool ConvertToMesh(const std::string &file, float scaleFactor); + BOOL Load(const std::string &file); - unsigned short GetNumVertices() const { return m_numVertices; } - unsigned short GetNumTriangles() const { return m_numTriangles; } - unsigned short GetNumMeshes() const { return m_numMeshes; } - unsigned short GetNumMaterials() const { return m_numMaterials; } - unsigned short GetNumJoints() const { return m_numJoints; } - int GetNumAnimations() const { return m_animations.size(); } + uint16_t GetNumVertices() const { return m_numVertices; } + uint16_t GetNumTriangles() const { return m_numTriangles; } + uint16_t GetNumMeshes() const { return m_numMeshes; } + uint16_t GetNumMaterials() const { return m_numMaterials; } + uint16_t GetNumJoints() const { return m_numJoints; } + uint32_t GetNumAnimations() const { return m_animations.size(); } float GetAnimationFps() const { return m_animationFps; } - int GetNumFrames() const { return m_numFrames; } + uint32_t GetNumFrames() const { return m_numFrames; } Ms3dVertex* GetVertices() const { return m_vertices; } Ms3dTriangle* GetTriangles() const { return m_triangles; } Ms3dMesh* GetMeshes() const { return m_meshes; } @@ -126,18 +126,18 @@ public: Ms3dJoint* GetJoints() const { return m_joints; } const Ms3dAnimation* GetAnimation(int index) const { return &m_animations[index]; } - int FindIndexOfJoint(const std::string &jointName) const; + int32_t FindIndexOfJoint(const std::string &jointName) const; private: - unsigned short m_numVertices; - unsigned short m_numTriangles; - unsigned short m_numMeshes; - unsigned short m_numMaterials; - unsigned short m_numJoints; + uint16_t m_numVertices; + uint16_t m_numTriangles; + uint16_t m_numMeshes; + uint16_t m_numMaterials; + uint16_t m_numJoints; float m_animationFps; float m_editorAnimationTime; - int m_numFrames; + uint32_t m_numFrames; Ms3dVertex *m_vertices; Ms3dTriangle *m_triangles; Ms3dMesh *m_meshes;