md2_model_t * GlWindow::loadModel (const char *filename, int pos) { if (d_models[pos] != 0) { md2_freeModel (d_models[pos]); d_models[pos] = 0; #ifdef WIN32 if (pos == 0) strcpy (modelFile, ""); else // pos == 1 strcpy (weaponFile, ""); #endif } if (!filename || !strlen (filename)) return 0; d_models[pos] = md2_readModel (filename); #ifdef WIN32 if (pos == 0) strcpy (modelFile, filename); else // pos == 1 strcpy (weaponFile, filename); #endif return d_models[pos]; }
int main (int argc, char *argv[]) { md2_model_t *model; if (argc != 2) { printf ("usage: %s <model.md2>\n", argv[0]); return -1; } model = md2_readModel (argv[1]); if (!model) { printf ("hoops\n"); return -1; } md2_printModelInfo (model); md2_freeModel (model); return 0; }
/* * load model */ md2_model_t* md2_readModel (const char *filename) { FILE *file; md2_model_t *model; byte buffer[MD2_MAX_FRAMESIZE]; int i; model = (md2_model_t *) malloc (sizeof (md2_model_t)); if (!model) return 0; file = fopen (filename, "rb"); if (!file) { free (model); return 0; } /* initialize model and read header */ memset (model, 0, sizeof (md2_model_t)); fread (&model->header, sizeof (md2_header_t), 1, file); #if 0 printf ("magic:\t\t%d\n", model->header.magic); printf ("version:\t\t%d\n", model->header.version); printf ("skinWidth:\t\t%d\n", model->header.skinWidth); printf ("skinHeight:\t\t%d\n", model->header.skinHeight); printf ("frameSize:\t\t%d\n", model->header.frameSize); printf ("numSkins:\t\t%d\n", model->header.numSkins); printf ("numVertices:\t\t%d\n", model->header.numVertices); printf ("numTexCoords:\t\t%d\n", model->header.numTexCoords); printf ("numTriangles:\t\t%d\n", model->header.numTriangles); printf ("numGlCommands:\t\t%d\n", model->header.numGlCommands); printf ("numFrames:\t\t%d\n", model->header.numFrames); printf ("offsetSkins:\t\t%d\n", model->header.offsetSkins); printf ("offsetTexCoords:\t%d\n", model->header.offsetTexCoords); printf ("offsetTriangles:\t%d\n", model->header.offsetTriangles); printf ("offsetFrames:\t\t%d\n", model->header.offsetFrames); printf ("offsetGlCommands:\t%d\n", model->header.offsetGlCommands); printf ("offsetEnd:\t\t%d\n", model->header.offsetEnd); #endif if (model->header.magic != (int) (('2' << 24) + ('P' << 16) + ('D' << 8) + 'I')) { fclose (file); free (model); return 0; } /* read skins */ fseek (file, model->header.offsetSkins, SEEK_SET); if (model->header.numSkins > 0) { model->skins = (md2_skin_t *) malloc (sizeof (md2_skin_t) * model->header.numSkins); if (!model->skins) { md2_freeModel (model); return 0; } for (i = 0; i < model->header.numSkins; i++) fread (&model->skins[i], sizeof (md2_skin_t), 1, file); } /* read texture coordinates */ fseek (file, model->header.offsetTexCoords, SEEK_SET); if (model->header.numTexCoords > 0) { model->texCoords = (md2_textureCoordinate_t *) malloc (sizeof (md2_textureCoordinate_t) * model->header.numTexCoords); if (!model->texCoords) { md2_freeModel (model); return 0; } for (i = 0; i < model->header.numTexCoords; i++) fread (&model->texCoords[i], sizeof (md2_textureCoordinate_t), 1, file); } /* read triangles */ fseek (file, model->header.offsetTriangles, SEEK_SET); if (model->header.numTriangles > 0) { model->triangles = (md2_triangle_t *) malloc (sizeof (md2_triangle_t) * model->header.numTriangles); if (!model->triangles) { md2_freeModel (model); return 0; } for (i = 0; i < model->header.numTriangles; i++) fread (&model->triangles[i], sizeof (md2_triangle_t), 1, file); } /* read alias frames */ fseek (file, model->header.offsetFrames, SEEK_SET); if (model->header.numFrames > 0) { model->frames = (md2_frame_t *) malloc (sizeof (md2_frame_t) * model->header.numFrames); if (!model->frames) { md2_freeModel (model); return 0; } for (i = 0; i < model->header.numFrames; i++) { md2_alias_frame_t *frame = (md2_alias_frame_t *) buffer; int j; model->frames[i].vertices = (md2_triangleVertex_t *) malloc (sizeof (md2_triangleVertex_t) * model->header.numVertices); if (!model->frames[i].vertices) { md2_freeModel (model); return 0; } fread (frame, 1, model->header.frameSize, file); strcpy (model->frames[i].name, frame->name); for (j = 0; j < model->header.numVertices; j++) { model->frames[i].vertices[j].vertex[0] = (float) ((int) frame->alias_vertices[j].vertex[0]) * frame->scale[0] + frame->translate[0]; model->frames[i].vertices[j].vertex[2] = -1* ((float) ((int) frame->alias_vertices[j].vertex[1]) * frame->scale[1] + frame->translate[1]); model->frames[i].vertices[j].vertex[1] = (float) ((int) frame->alias_vertices[j].vertex[2]) * frame->scale[2] + frame->translate[2]; model->frames[i].vertices[j].normal[0] = avertexnormals[frame->alias_vertices[j].lightNormalIndex][0]; model->frames[i].vertices[j].normal[1] = avertexnormals[frame->alias_vertices[j].lightNormalIndex][1]; model->frames[i].vertices[j].normal[2] = avertexnormals[frame->alias_vertices[j].lightNormalIndex][2]; //model->frames[i].vertices[j].lightNormalIndex = frame->alias_vertices[j].lightNormalIndex; } } } /* read gl commands */ fseek (file, model->header.offsetGlCommands, SEEK_SET); if (model->header.numGlCommands) { model->glCommandBuffer = (int *) malloc (sizeof (int) * model->header.numGlCommands); if (!model->glCommandBuffer) { md2_freeModel (model); return 0; } fread (model->glCommandBuffer, sizeof (int), model->header.numGlCommands, file); } fclose (file); return model; }
// // load model // // Hurdler: the current path is the Legacy.exe path static md2_model_t *md2_readModel(const char *filename) { FILE *file; md2_model_t *model; UINT8 buffer[MD2_MAX_FRAMESIZE]; size_t i; model = calloc(1, sizeof (*model)); if (model == NULL) return 0; file = fopen(filename, "rb"); if (!file) { free(model); return 0; } // initialize model and read header if (fread(&model->header, sizeof (model->header), 1, file) != 1 || model->header.magic != (INT32)(('2' << 24) + ('P' << 16) + ('D' << 8) + 'I')) { fclose(file); free(model); return 0; } model->header.numSkins = 1; // read skins fseek(file, model->header.offsetSkins, SEEK_SET); if (model->header.numSkins > 0) { model->skins = calloc(sizeof (md2_skin_t), model->header.numSkins); if (!model->skins || model->header.numSkins != fread(model->skins, sizeof (md2_skin_t), model->header.numSkins, file)) { md2_freeModel (model); return 0; } ; } // read texture coordinates fseek(file, model->header.offsetTexCoords, SEEK_SET); if (model->header.numTexCoords > 0) { model->texCoords = calloc(sizeof (md2_textureCoordinate_t), model->header.numTexCoords); if (!model->texCoords || model->header.numTexCoords != fread(model->texCoords, sizeof (md2_textureCoordinate_t), model->header.numTexCoords, file)) { md2_freeModel (model); return 0; } } // read triangles fseek(file, model->header.offsetTriangles, SEEK_SET); if (model->header.numTriangles > 0) { model->triangles = calloc(sizeof (md2_triangle_t), model->header.numTriangles); if (!model->triangles || model->header.numTriangles != fread(model->triangles, sizeof (md2_triangle_t), model->header.numTriangles, file)) { md2_freeModel (model); return 0; } } // read alias frames fseek(file, model->header.offsetFrames, SEEK_SET); if (model->header.numFrames > 0) { model->frames = calloc(sizeof (md2_frame_t), model->header.numFrames); if (!model->frames) { md2_freeModel (model); return 0; } for (i = 0; i < model->header.numFrames; i++) { md2_alias_frame_t *frame = (md2_alias_frame_t *)(void *)buffer; size_t j; model->frames[i].vertices = calloc(sizeof (md2_triangleVertex_t), model->header.numVertices); if (!model->frames[i].vertices || model->header.frameSize != fread(frame, 1, model->header.frameSize, file)) { md2_freeModel (model); return 0; } strcpy(model->frames[i].name, frame->name); for (j = 0; j < model->header.numVertices; j++) { model->frames[i].vertices[j].vertex[0] = (float) ((INT32) frame->alias_vertices[j].vertex[0]) * frame->scale[0] + frame->translate[0]; model->frames[i].vertices[j].vertex[2] = -1* ((float) ((INT32) frame->alias_vertices[j].vertex[1]) * frame->scale[1] + frame->translate[1]); model->frames[i].vertices[j].vertex[1] = (float) ((INT32) frame->alias_vertices[j].vertex[2]) * frame->scale[2] + frame->translate[2]; model->frames[i].vertices[j].normal[0] = avertexnormals[frame->alias_vertices[j].lightNormalIndex][0]; model->frames[i].vertices[j].normal[1] = avertexnormals[frame->alias_vertices[j].lightNormalIndex][1]; model->frames[i].vertices[j].normal[2] = avertexnormals[frame->alias_vertices[j].lightNormalIndex][2]; } } } // read gl commands fseek(file, model->header.offsetGlCommands, SEEK_SET); if (model->header.numGlCommands) { model->glCommandBuffer = calloc(sizeof (INT32), model->header.numGlCommands); if (!model->glCommandBuffer || model->header.numGlCommands != fread(model->glCommandBuffer, sizeof (INT32), model->header.numGlCommands, file)) { md2_freeModel (model); return 0; } } fclose(file); return model; }