Archived

This topic is now archived and is closed to further replies.

jverkoey

need help with ms3d files

Recommended Posts

ooook, I used the code from nehe''s game tutorials for loading MS3D files, this is my MS3D header:
  
typedef struct MS3D_HEADER_TYP
{
   	char id[10];
	int  version;
} MS3D_HEADER, *MS3D_HEADER_PTR;

typedef struct MS3D_VERTEX_TYP
{
	unsigned char flags;
	unsigned char refCount;
	char boneID;
	float vertex[3];
} MS3D_VERTEX, *MS3D_VERTEX_PTR;

typedef struct MS3D_TRIANGLE_TYP
{
	unsigned short flags;
	unsigned short vertexIndices[3];
	float vertexNormals[3][3];
	float u[3];
	float v[3];
	unsigned char smoothingGroup;
	unsigned char groupIndex;
} MS3D_TRIANGLE, *MS3D_TRIANGLE_PTR;

typedef struct MS3D_GROUP_TYP
{
   	unsigned char	flags;
   	char name[32];
   	unsigned short	numTriangles;
	unsigned short*	triangleIndices;
	char materialIndex;
} MS3D_GROUP, *MS3D_GROUP_PTR;

class MS3D
{
public:
	unsigned short	numVertices;
	MS3D_VERTEX*	vertices;
	unsigned short	numTriangles;
	MS3D_TRIANGLE*	triangles;
	unsigned short	numGroups;
	MS3D_GROUP*	groups;
	
	bool Load(char* filename);
	void Render();
	
	MS3D()
	{}
	
	~MS3D()
	{	
		if(vertices)
			delete vertices;		
		if(triangles)
			delete triangles;
		if(groups)
			delete groups;
	}
};

bool MS3D::Load(char* filename)
{
	FILE* file;
	MS3D_HEADER header;
	int loop;
	
	if((file= fopen(filename, "rb"))==NULL)
	{
		// error message goes here

		return false;
	}
	
	fread(&header.id, sizeof(char), 10, file);
	fread(&header.version, 1, sizeof(int), file);
	if(strncmp(header.id, "MS3D000000", 10)!=0)
	{
		// error message goes here

		return false;
	}
	
	if(header.version!=3 && header.version!=4)
	{
		// error message goes here

		return false;
	}
	
	fread(&numVertices, sizeof(unsigned short), 1, file);
	vertices= new MS3D_VERTEX [numVertices];
	for(loop=0; loop<numVertices; loop++)
	{
		fread(&vertices[loop].flags,	sizeof(BYTE),  1, file);
		fread( vertices[loop].vertex,	sizeof(float), 3, file);
		fread(&vertices[loop].boneID,	sizeof(char),  1, file);
		fread(&vertices[loop].refCount, sizeof(BYTE),  1, file);
	}
	
	fread(&numTriangles, sizeof(unsigned short), 1, file);
	triangles= new MS3D_TRIANGLE [numTriangles];
	for(loop=0; loop<numTriangles; loop++)
	{
		fread(&triangles[loop].flags,		sizeof(unsigned short), 1, file);
		fread( triangles[loop].vertexIndices,	sizeof(unsigned short), 3, file);
		fread( triangles[loop].vertexNormals[0],sizeof(float),		3, file);
		fread( triangles[loop].vertexNormals[1],sizeof(float),	 	3, file);
		fread( triangles[loop].vertexNormals[2],sizeof(float),		3, file);
		fread( triangles[loop].u,		sizeof(float),		3, file);
		fread( triangles[loop].v,		sizeof(float),		3, file);
		fread(&triangles[loop].smoothingGroup,	sizeof(unsigned char),	1, file);
		fread(&triangles[loop].groupIndex,	sizeof(unsigned char),	1, file);
	}
	
	fread(&numGroups, sizeof(unsigned short), 1, file);
	groups= new MS3D_GROUP [numGroups];
	for(loop=0; loop<numGroups; loop++)
	{
		fread(&groups[loop].flags,	 sizeof(unsigned char),	1,  file);
		fread( groups[loop].name,	 sizeof(char),		32, file);
		fread(&groups[loop].numTriangles,sizeof(unsigned short),1,  file);
		
		groups[loop].triangleIndices=new unsigned short [groups[loop].numTriangles];
		
		fread( groups[loop].triangleIndices, sizeof(unsigned short), groups[loop].numTriangles,file);
		fread(&groups[loop].materialIndex,   sizeof(char), 1, file);
	}

	// error message goes here

	return true;
}

void MS3D::Render()
{
	// Draw By Group

	for(int loop1=0; loop1<numGroups; loop1++ )
	{
		// Draw As Regular Triangles, Since .MS3D''s Aren''t Optimized Like .MD2''s

		glBegin(GL_TRIANGLES);
		for(int loop2=0; loop2<groups[loop1].numTriangles; loop2++)
		{
			int triangleIndex       =  groups[loop1].triangleIndices[loop2];
			const MS3D_TRIANGLE* tri= &triangles[triangleIndex];
			
			// Loop Through The Triangle''s Vertices, And Output Them!

			for(int loop3=0; loop3<3; loop3++)
			{
				int index= tri->vertexIndices[loop3];
				glNormal3fv( tri->vertexNormals[loop3]);
				glTexCoord2f(tri->u[loop3], tri->v[loop3]);
				glVertex3fv(vertices[index].vertex);
			}
		}
		glEnd();
	}
}
  
and that code successfully loads up an ms3d file, and displays it, by creating each object, ex: MS3D ship; and etc.... now, what I need to be able to do, is load the ms3d file, but then allow the program to automatically load the bmps....but I don''t know how to look at the bmps that are saved to it, so I can''t exactly do that..... I don''t want to have to preload everything, because that wont'' give any functionality to my 3d artists, because I want them to be able to develop a file in ms3d, save it, and load it right in to the exe and not have to recompile anything........ what I need is some easy code and a decent walkthrough of where to put everything that I''d need. the rest of my code for the program uses nehe.gamedev.net''s bmp loader and that''s pretty much it, so what I have is a function that loads the textures, but I could create another bmp texture loader for the ms3d header file, if it won''t work any other way....... soo, in essense, i need to be able to load an ms3d, and its textures and be able to display it without having to recompile.... really all i need is what the header files look like that have the file names..because I evidently have the wrong type of header file..... bloodright.150m.com //For the latest on all of the IVGDA projects!

Share this post


Link to post
Share on other sites