Advertisement

Problems with loading a MS3D model

Started by June 10, 2003 03:09 PM
1 comment, last by Etus 21 years, 8 months ago
Hi, I''ve written a MS3D model importer based on NeHe''s tutorial, but I''m having some problems converting the data to my own structures. Here''s my code:

Mesh MS3DImporter :: LoadObject() {

	int loop = 0;
	unsigned short numVertices = 0;
	unsigned short numTriangles = 0;
	unsigned short numGroups = 0;
	unsigned short numMaterials = 0;

	fread(&numVertices, sizeof(unsigned short), 1, file);
	vertices = new MS3D_VERTEX_TYP[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_TYP[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_TYP[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);

	}

	fread(&numMaterials, sizeof(unsigned short), 1, file);
	materials = new MS3D_MATERIAL_TYP[numMaterials];

	for(loop = 0; loop < numMaterials; loop++) {

		fread(&materials[loop].name, sizeof(char), 32, file);
		fread(&materials[loop].ambient, sizeof(float), 4, file);
		fread(&materials[loop].diffuse, sizeof(float), 4, file);
		fread(&materials[loop].specular, sizeof(float), 4, file);
		fread(&materials[loop].emissive, sizeof(float), 4, file);
		fread(&materials[loop].shininess, sizeof(float), 1, file);
		fread(&materials[loop].transparency, sizeof(float), 1, file);
		fread(&materials[loop].mode, sizeof(char), 1, file);
		fread(&materials[loop].texture, sizeof(char), 128, file);
		fread(&materials[loop].alphamap, sizeof(char), 128, file);

	}

	// Insert data to mesh

	Mesh NewMesh(pTextureManager); // This is the mesh

	FileInfo FInfo;	// File info

	int i = 0;
	int j = 0;
	int materialCount = numMaterials;

	// First, insert the file data into the FInfo variable

	FInfo.Materials = new Material[materialCount];
	memset(FInfo.Materials, 0, sizeof(Material) * materialCount);

	FInfo.NumOfObjects = numGroups;
	FInfo.NumOfMaterials = materialCount;

	for(loop = 0; loop < materialCount; loop++) {
		
		if(materialCount > 0)
			FInfo.Materials[loop].bHasTexture = true;
		else
			FInfo.Materials[loop].bHasTexture = false;

		strcpy(FInfo.Materials[loop].TexFileName, materials[loop].texture);
		FInfo.Materials[loop].TwoSidedMat = false;
		FInfo.Materials[loop].UTile = 1;
		FInfo.Materials[loop].VTile = 1;

	}

	for(i = 0; i < FInfo.NumOfObjects; i++) {
		
		SubMesh NewSubMesh(pTextureManager, numVertices, numVertices, 
			numTriangles, numTriangles, numMaterials);
		
		// Vertices & Faces

		int counter = -1;
		for(j = 0; j < groups[i].numTriangles; j++) {

			int triangleIndex = groups[i].triangleIndices[j];
			MS3D_TRIANGLE_TYP tri = triangles[triangleIndex];

			for(loop = 0; loop < 3; loop++)	{
				
				int index = tri.vertexIndices[loop];

				counter++;
				
				NewSubMesh.MeshData.points[counter].x = vertices[index].vertex[0];
				NewSubMesh.MeshData.points[counter].y = vertices[index].vertex[1];
				NewSubMesh.MeshData.points[counter].z = vertices[index].vertex[2];
				NewSubMesh.MeshData.points[counter].u = tri.u[loop];
				NewSubMesh.MeshData.points[counter].v = tri.v[loop];
				
			}

			NewSubMesh.MeshData.the_faces[j].x = tri.vertexIndices[0];
			NewSubMesh.MeshData.the_faces[j].y = tri.vertexIndices[1];
			NewSubMesh.MeshData.the_faces[j].z = tri.vertexIndices[2];
			NewSubMesh.MeshData.the_faces[j].tx = 0;
			NewSubMesh.MeshData.the_faces[j].ty = 0;
			NewSubMesh.MeshData.the_faces[j].tz = 0;
			NewSubMesh.MeshData.the_faces[j].MatRef = (int)groups[i].materialIndex;

		}
		
		NewSubMesh.MeshData.bHasTexture = true;	
		NewSubMesh.MeshData.bHasTextureIndices = false;
		NewSubMesh.MeshData.verts = counter;
		NewSubMesh.MeshData.faces = groups[i].numTriangles;
		NewSubMesh.MeshData.NumOfTexCoords = counter;
		NewSubMesh.MeshData.NumOfTexFaces = 0;
		NewSubMesh.FInfo.playerPosition.x = 0.0f;
		NewSubMesh.FInfo.playerPosition.y = 0.0f;
		NewSubMesh.FInfo.playerPosition.z = 0.0f;
		NewSubMesh.FInfo.yOrient = 0.0f;
		NewSubMesh.FInfo = FInfo;
		NewSubMesh.CreateBoundingBox();			
		
		NewMesh.SubMeshList.push_back(NewSubMesh);
		
	}

	FInfo.playerPosition.x = 0.0f;
	FInfo.playerPosition.y = 0.0f;
	FInfo.playerPosition.z = 0.0f;
	FInfo.yOrient = 0.0f;
	NewMesh.FInfo = FInfo;	

	return NewMesh;

}
What am I doing wrong? Thanks, Etus
What is the problem? Are there any errors? What errors, where?
Advertisement
The number of vertices, in each group, are wrong. Moreover, sometimes the vertices repeat themselves.

- Etus

This topic is closed to new replies.

Advertisement