ms3d models with textures...

yo,
i know how to render ms3d models without textures… but, does anyone know how to render ms3d models with textures…

Theres nothing hard to render ms3d:s with textures, just make sure you have loaded the texture coordinates, and when I implemented it, I had to flip t vector.

The code goes like this:

for(i=0; inum_meshes; i++)
{
pmesh = &mdl->meshes[i];
pmaterial = &mdl->materials[pmesh->material_index];

  glBindTexture(GL_TEXTURE_2D, pmaterial->data->id);
  
  glBegin(GL_TRIANGLES);
  for(j=0; j<pmesh->num_triangles; j++)
  {
  	ptriangle	= &mdl->triangles[pmesh->triangle_indices[j]];
  	
  	for(k=0; k<3; k++)
  	{
  		glTexCoord2f(ptriangle->s[k], ptriangle->t[k]);
  		glNormal3fv(ptriangle->vertex_normals[k]);
  		glVertex3fv(mdl->vertices[ptriangle->vertex_indices[k]].pos);
  	}
  }
  glEnd();

}

hmm… im haveing trouble understanding this… here is my code

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(void);

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

return false;
}
fread(&header.id, sizeof(char), 10, file);
fread(&header.version, 1, sizeof(int), file);
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);

}

return true;
}
void MS3D::
Render(void)
{
int loop1;
int loop2;
int loop3;

// Draw By Group
for(loop1=0; loop1<numGroups; loop1++ )
{
// Draw As Regular Triangles, Since .MS3D’s Aren’t Optimized Like .MD2’s
glBegin(GL_TRIANGLES);
for(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(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();
  }

}

can you mix your code with mine to get it to work… (sorry that i ask so much)

Firstly, what kind of results do you get when you render using your code?

a model that is not textured

Your problem is simple, you have forgot to put glBindTexture before rendering the mesh.

You have to put a texture id variable to your material structure and load a texture for it at the loading stage.
Then bind the texture before rendering the mesh by doing:

glBindTexture(GL_TEXTURE_2D, materials[groups[loop].material_index].texture_id);

also make sure you have enabled texturing.

BTW, there’s a tutorial in NeHe’s site that also shows how to load/render MS3D model at http://nehe.gamedev.net/tutorials/lesson.asp?l=31

well this code wasn’t made for useing textures… i got this code from the nehe game tutorials on lesson 4… but how do i load the texture and alll the other stuff… im useing jpg for textures

NeHe has two tutorials for ms3d:s, and the one I posted shows how to load them and render using texturing.

I should say at this point that forget those JPGs, they’re way too complex, unless you want to link some lib with your app (DeVil).
Otherways I suggest using TGAs.

yea… i tried that one but when i put my own model in it it displays it without a texture… and i am useing the same kinda of texture as the tutorial… and when i opened the model in the tut in milkshape … the texture didnt show… but the material was there… please help