use standard types in Ms3d structures/class for consistency and remove old Ms3d::ConvertToMesh method

This commit is contained in:
Gered 2012-12-12 15:52:37 -05:00
parent 903de59132
commit bcd9b3afdc
2 changed files with 61 additions and 248 deletions

View file

@ -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)

View file

@ -1,42 +1,43 @@
#ifndef __MS3D_H_INCLUDED__
#define __MS3D_H_INCLUDED__
#include <string>
#include "common.h"
#include "../geometry/vector3.h"
#include "../geometry/vector2.h"
#include <string>
#include <vector>
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;