el_pango
Member
Good evening all,
I'm trying to load and display a .MD2 file[sup]1[/sup] like so:
load:
	
	
		
			
	
	
	
		
		
	
put into array and draw:
	
	
		
			
	
	
	
		
		
	
But nothing appears.
I've verified that the correct arrays (vertex, tex coord and normal) are enabled and the pointers to them are set, that I can draw something else (a simple textured cube works) and that the model is inside the frustum (rendering with same coordinates as cube) and that backface culling is off, so even if the camera were stuck inside the model, I'd see something, but no luck.
Sorry for the wall of code, but can anyone figure out what I've done wrong here?
1. File format as described in this page on icculus.org.
				
			I'm trying to load and display a .MD2 file[sup]1[/sup] like so:
load:
		Code:
	
	MD2_MODEL_PTR MD2MODEL_load(const char * filename)
{
	FILE 					*fin;
	MD2_HEADER_STRUCT	header;
	int					index;
	int					element_index;
	int					dest;
	int					tmp;
	MD2_MODEL			*output;
	fin	= fopen(filename,"rb");
	if(fin == NULL)
	{
		DUH_WHERE_AM_I("file couldn't be opened");
		return NULL;
	}
	rewind(fin);
	output = (MD2_MODEL *)malloc(sizeof(MD2_MODEL));
	if(output == NULL)
	{
		DUH_WHERE_AM_I("malloc failed, couldn't create space for model");
		fclose(fin);
		return NULL;
	}
	/* read header, populate fields */
	fread(&header.ident,				4,1,fin);
	fread(&header.version,			4,1,fin);
	fread(&header.skin_width,		4,1,fin);
	fread(&header.skin_height,		4,1,fin);
	fread(&header.frame_size,		4,1,fin);
	fread(&header.num_skins,		4,1,fin);
	fread(&header.num_vertices,	4,1,fin);
	fread(&header.num_texture_coords,4,1,fin);
	fread(&header.num_triangles,	4,1,fin);
	fread(&header.num_gl_commands,4,1,fin);
	fread(&header.num_frames,		4,1,fin);
	fread(&header.offset_skins,	4,1,fin);
	fread(&header.offset_texture_coords,4,1,fin);
	fread(&header.offset_triangles,4,1,fin);
	fread(&header.offset_frames,	4,1,fin);
	fread(&header.offset_gl_commands,4,1,fin);
	fread(&header.offset_end,		4,1,fin);
	output->num_frames 		= header.num_frames;
	output->frames				= malloc(sizeof(MD2_ANIM_FRAME_STRUCT) * output->num_frames);
	output->num_tris			= header.num_triangles;
	output->tri_list			= malloc(sizeof(MD2_TRIANGLE) * output->num_tris);
	output->num_tex_coords 	= header.num_texture_coords;
	output->tex_coords		= malloc(sizeof(MD2_TEX_COORD) * output->num_tex_coords);
	output->tmp_verts			= malloc(sizeof(VERTEX )		* output->num_tris * 3);
	output->tmp_norms			= malloc(sizeof(NORMAL)			* output->num_tris * 3);
	output->tmp_coords		= malloc(sizeof(TEX_COORD)		* output->num_tris * 3);
	fseek(fin,header.offset_texture_coords,0L);
	/* load u,v coordinates */
	for(index = 0; index < header.num_texture_coords; index++)
	{
		fread(&output->tex_coords[index].u,2,1,fin);
		fread(&output->tex_coords[index].v,2,1,fin);
	}
	fseek(fin,header.offset_triangles,0L);
	/* load triangle vertex indexes */
	for(index = 0; index < header.num_triangles; index++)
	{
		fread(&output->tri_list[index].vertex_indices[0],2,1,fin);
		fread(&output->tri_list[index].vertex_indices[1],2,1,fin);
		fread(&output->tri_list[index].vertex_indices[2],2,1,fin);
		fread(&output->tri_list[index].texture_indices[0],2,1,fin);
		fread(&output->tri_list[index].texture_indices[1],2,1,fin);
		fread(&output->tri_list[index].texture_indices[2],2,1,fin);
	}
	fseek(fin,header.offset_frames,0L);
	for(index = 0; index < output->num_frames; index++)
	{
		DUH_WHERE_AM_I("reading next frame");
		element_index 	= 0;
		fread(&output->frames[index].scale_x,		4,1,fin);
		fread(&output->frames[index].scale_y,		4,1,fin);
		fread(&output->frames[index].scale_z,		4,1,fin);
		fread(&output->frames[index].translate_x,	4,1,fin);
		fread(&output->frames[index].translate_y,	4,1,fin);
		fread(&output->frames[index].translate_z,	4,1,fin);
		fseek(fin,16,ftell(fin)); // skip the name
		do
		{
			fread(&output->frames[index].vertices[element_index].unscaled_x,1,1,fin);
			fread(&output->frames[index].vertices[element_index].unscaled_y,1,1,fin);
			fread(&output->frames[index].vertices[element_index].unscaled_z,1,1,fin);
			fread(&output->frames[index].vertices[element_index].normal_list_index,1,1,fin);
			element_index++;
		}
		while(element_index < header.num_vertices);
	}
	fclose(fin);
	return output;
}put into array and draw:
		Code:
	
	MD2MODEL_render(const MD2_MODEL *model, GLfloat x, GLfloat y, GLfloat z,
					GLfloat y_rotation, GLuint texture, int tex_size, int curr_frame,
	            int next_frame, float tween_value)
{
	float 	scaled_x0, scaled_y0, scaled_z0;
	float 	scaled_x1, scaled_y1, scaled_z1;
	float 	scaled_x, scaled_y, scaled_z;
	int		tri_index;
	for(tri_index = 0; tri_index < model->num_tris; tri_index++)
	{
		scaled_x = model->frames[curr_frame].vertices[model->tri_list[tri_index].vertex_indices[0]].unscaled_x * model->frames[curr_frame].scale_x + model->frames[curr_frame].translate_x;
		scaled_y = model->frames[curr_frame].vertices[model->tri_list[tri_index].vertex_indices[0]].unscaled_y * model->frames[curr_frame].scale_y + model->frames[curr_frame].translate_y;
		scaled_z = model->frames[curr_frame].vertices[model->tri_list[tri_index].vertex_indices[0]].unscaled_z * model->frames[curr_frame].scale_z + model->frames[curr_frame].translate_z;
		model->tmp_verts[tri_index * 3 + 0].x = scaled_x;
		model->tmp_verts[tri_index * 3 + 0].y = scaled_y;
		model->tmp_verts[tri_index * 3 + 0].z = scaled_z;
		scaled_x = normal_list[ model->frames[curr_frame].vertices[model->tri_list[tri_index].vertex_indices[0]].normal_list_index][0];
		scaled_y = normal_list[ model->frames[curr_frame].vertices[model->tri_list[tri_index].vertex_indices[0]].normal_list_index][ 1];
		scaled_z = normal_list[ model->frames[curr_frame].vertices[model->tri_list[tri_index].vertex_indices[0]].normal_list_index][ 2];
		model->tmp_norms[tri_index * 3 + 0].x = scaled_x;
		model->tmp_norms[tri_index * 3 + 0].y = scaled_y;
		model->tmp_norms[tri_index * 3 + 0].z = scaled_z;
		model->tmp_coords[tri_index * 3 + 0].u = model->tex_coords[model->tri_list[tri_index].texture_indices[0]].u / tex_size;
		model->tmp_coords[tri_index * 3 + 0].v = model->tex_coords[model->tri_list[tri_index].texture_indices[0]].v / tex_size;
		///////////////////////////////////////
		scaled_x = model->frames[curr_frame].vertices[model->tri_list[tri_index].vertex_indices[1]].unscaled_x * model->frames[curr_frame].scale_x + model->frames[curr_frame].translate_x;
		scaled_y = model->frames[curr_frame].vertices[model->tri_list[tri_index].vertex_indices[1]].unscaled_y * model->frames[curr_frame].scale_y + model->frames[curr_frame].translate_y;
		scaled_z = model->frames[curr_frame].vertices[model->tri_list[tri_index].vertex_indices[1]].unscaled_z * model->frames[curr_frame].scale_z + model->frames[curr_frame].translate_z;
		model->tmp_verts[tri_index * 3 + 1].x = scaled_x;
		model->tmp_verts[tri_index * 3 + 1].y = scaled_y;
		model->tmp_verts[tri_index * 3 + 1].z = scaled_z;
		scaled_x = normal_list[ model->frames[curr_frame].vertices[model->tri_list[tri_index].vertex_indices[1]].normal_list_index][0];
		scaled_y = normal_list[ model->frames[curr_frame].vertices[model->tri_list[tri_index].vertex_indices[1]].normal_list_index][ 1];
		scaled_z = normal_list[ model->frames[curr_frame].vertices[model->tri_list[tri_index].vertex_indices[1]].normal_list_index][2];
		model->tmp_norms[tri_index * 3 + 1].x = scaled_x;
		model->tmp_norms[tri_index * 3 + 1].y = scaled_y;
		model->tmp_norms[tri_index * 3 + 1].z = scaled_z;
		model->tmp_coords[tri_index * 3 + 1].u = model->tex_coords[model->tri_list[tri_index].texture_indices[1]].u / tex_size;
		model->tmp_coords[tri_index * 3 + 1].u = model->tex_coords[model->tri_list[tri_index].texture_indices[1]].v / tex_size;
		///////////////////////////////////////
		scaled_x = model->frames[curr_frame].vertices[model->tri_list[tri_index].vertex_indices[2]].unscaled_x * model->frames[curr_frame].scale_x + model->frames[curr_frame].translate_x;
		scaled_y = model->frames[curr_frame].vertices[model->tri_list[tri_index].vertex_indices[2]].unscaled_y * model->frames[curr_frame].scale_y + model->frames[curr_frame].translate_y;
		scaled_z = model->frames[curr_frame].vertices[model->tri_list[tri_index].vertex_indices[2]].unscaled_z * model->frames[curr_frame].scale_z + model->frames[curr_frame].translate_z;
		model->tmp_verts[tri_index * 3 + 2].x = scaled_x;
		model->tmp_verts[tri_index * 3 + 2].y = scaled_y;
		model->tmp_verts[tri_index * 3 + 2].z = scaled_z;
		scaled_x = normal_list[ model->frames[curr_frame].vertices[model->tri_list[tri_index].vertex_indices[2]].normal_list_index][ 0];
		scaled_y = normal_list[ model->frames[curr_frame].vertices[model->tri_list[tri_index].vertex_indices[2]].normal_list_index ][1];
		scaled_z = normal_list[ model->frames[curr_frame].vertices[model->tri_list[tri_index].vertex_indices[2]].normal_list_index][2];
		model->tmp_norms[tri_index * 3 + 2].x = scaled_x;
		model->tmp_norms[tri_index * 3 + 2].y = scaled_y;
		model->tmp_norms[tri_index * 3 + 2].z = scaled_z;
		model->tmp_coords[tri_index * 3 + 2].u = model->tex_coords[model->tri_list[tri_index].texture_indices[2]].u / tex_size;
		model->tmp_coords[tri_index * 3 + 2].u = model->tex_coords[model->tri_list[tri_index].texture_indices[2]].v / tex_size;
	}
	// world_pos	=	  Matrix.CreateRotationZ(MathHelper.ToRadians(y_rotation)) * Matrix.CreateRotationX(MathHelper.ToRadians(x_rotation))  * Matrix.CreateTranslation(x,y,z) ;
	glMatrixMode(GL_MODELVIEW);
	glPushMatrix();
	glTranslatef(x,y,z);
	glRotatef(y_rotation,0,1,0);
//	//be.End();
//	be.TextureEnabled		= true;
//	be.LightingEnabled	= false;
//	be.Texture				= tex;
//	be.World					= world_pos;
//	be.CommitChanges();
//	foreach (EffectPass pass in be.CurrentTechnique.Passes)
//	{
//		pass.Begin();
//		COMMON.gfx_device.DrawUserPrimitives<VertexPositionTexture>(PrimitiveType.TriangleList, tmp_verts, 0,model->num_tris);
//		pass.End();
//	}
	glBindTexture(GL_TEXTURE_2D, texture);
	glVertexPointer(3,GL_FLOAT,0,model->tmp_verts);
	glNormalPointer(GL_FLOAT,0,model->tmp_norms);
	glTexCoordPointer(2,GL_FLOAT,0,model->tmp_coords);
	glDrawArrays(GL_TRIANGLES,0,model->num_tris * 3);
	glPopMatrix();
}But nothing appears.
I've verified that the correct arrays (vertex, tex coord and normal) are enabled and the pointers to them are set, that I can draw something else (a simple textured cube works) and that the model is inside the frustum (rendering with same coordinates as cube) and that backface culling is off, so even if the camera were stuck inside the model, I'd see something, but no luck.
Sorry for the wall of code, but can anyone figure out what I've done wrong here?
1. File format as described in this page on icculus.org.
 
	
 
 
		 
 
		 
 
		