#include #include #include #include #include #define MD2_SKINNAMELEN 64 int plugin_load(const char *filename, G3DModel *model) { FILE *f; guint32 idid, idver, skinwidth, skinheight, framesize; guint32 numskins, numverts, numtexs, numfaces, numglcmds, numframes; guint32 offskins, offtexs, offfaces, offframes, offglcmds, offend; char **skinnames; int i; G3DObject *object; G3DMaterial *material; f = fopen(filename, "r"); if(f == NULL) { g_printerr("couldn't open '%s'\n", filename); return EXIT_FAILURE; } idid = g3d_read_int32_be(f); if(idid != G3D_IFF_MKID('I','D','P','2')) { g_printerr("file '%s' is not a .md2 file\n", filename); fclose(f); return EXIT_FAILURE; } idver = g3d_read_int32_le(f); if(idver != 8) { g_printerr("file '%s' has wrong version (%d)\n", filename, idver); fclose(f); return EXIT_FAILURE; } object = g_new0(G3DObject, 1); object->name = g_strdup("Q2Object"); material = g3d_new_G3DMaterial(); object->materials = g_slist_append(object->materials, material); model->objects = g_slist_append(model->objects, object); skinwidth = g3d_read_int32_le(f); skinheight = g3d_read_int32_le(f); framesize = g3d_read_int32_le(f); numskins = g3d_read_int32_le(f); numverts = g3d_read_int32_le(f); numtexs = g3d_read_int32_le(f); numfaces = g3d_read_int32_le(f); numglcmds = g3d_read_int32_le(f); numframes = g3d_read_int32_le(f); object->vertex_count = numverts; object->vertices = g_malloc(numverts * 3 * sizeof(GLfloat)); offskins = g3d_read_int32_le(f); offtexs = g3d_read_int32_le(f); offfaces = g3d_read_int32_le(f); offframes = g3d_read_int32_le(f); offglcmds = g3d_read_int32_le(f); offend = g3d_read_int32_le(f); skinnames = g_malloc0(sizeof(char*) * numskins); for(i=0; i 0 g_printerr("skin #%d: %s\n", i+1, skinnames[i]); #endif } /* texture coordinates */ for(i=0; ifaces = g_slist_append(object->faces, face); face->material = material; face->num_vertices = 3; face->index_vertex = g_malloc(3 * sizeof(int)); face->index_vertex[0] = g3d_read_int16_le(f); face->index_vertex[1] = g3d_read_int16_le(f); face->index_vertex[2] = g3d_read_int16_le(f); g3d_read_int16_le(f); g3d_read_int16_le(f); g3d_read_int16_le(f); } /* vertices per frame */ #if DEBUG > 0 g_printerr("numframes: %d\n", numframes); #endif for(i=0; ivertices[j*3+0] = x; object->vertices[j*3+1] = y; object->vertices[j*3+2] = z; } } } /* free skin names */ for(i=0; i