loading of basic ms3d model data (no joint/animation data yet)
This commit is contained in:
parent
de7bb4adb5
commit
bcfa084aa1
|
@ -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)
|
||||
{
|
||||
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)
|
||||
|
|
|
@ -2,6 +2,65 @@
|
|||
#define __MS3D_H_INCLUDED__
|
||||
|
||||
#include <string>
|
||||
#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
|
||||
|
|
Reference in a new issue