void RayTracer::read_open_inventor_scene(std::string iv_file){ SoDB::init(); scene = new OSUInventorScene((char *)iv_file.c_str()); read_objects(); read_camera(); read_lights(); calculate_eye_coordinate_system(camera); calculate_image_dimentions(); return; }
/** * Each substructure in the M2 has a variable size except the header. * Memory for each substructure must therefore be allocated at reading depending on header values. * @param lk_m2_file The file to read data. * @param ptr Pointer to a M2/WotLK structure. */ int read_model(FILE *lk_m2_file, LKM2 *ptr) { //Header fseek(lk_m2_file, 0, SEEK_SET); fread(&ptr->header, sizeof(LKModelHeader), 1, lk_m2_file); char real_id[5]; real_id[0] = ptr->header.id[0]; real_id[1] = ptr->header.id[1]; real_id[2] = ptr->header.id[2]; real_id[3] = ptr->header.id[3]; real_id[4] = '\0'; if (strcmp("MD20", real_id)) { fprintf(stderr, "This is not an M2 file.\n"); exit(EXIT_FAILURE); } if (ptr->header.version != 264) { fprintf(stderr, "Incorrect model version (%d).\n", ptr->header.version); fprintf(stderr, "A WotLK model (264) is expected.\n"); exit(EXIT_FAILURE); } //Name ptr->filename = malloc(ptr->header.nameLength); fseek(lk_m2_file, ptr->header.nameOfs, SEEK_SET); fread(ptr->filename, sizeof(char), ptr->header.nameLength, lk_m2_file); //Global Sequences ptr->globalsequences = malloc( ptr->header.nGlobalSequences * sizeof(unsigned int)); if (ptr->header.nGlobalSequences > 0) { fseek(lk_m2_file, ptr->header.ofsGlobalSequences, SEEK_SET); fread(ptr->globalsequences, sizeof(unsigned int), ptr->header.nGlobalSequences, lk_m2_file); } //Animations ptr->animations = malloc( ptr->header.nAnimations * sizeof(LKModelAnimation)); fseek(lk_m2_file, ptr->header.ofsAnimations, SEEK_SET); fread(ptr->animations, sizeof(LKModelAnimation), ptr->header.nAnimations, lk_m2_file); //Animation Files FILE **anim_files; anim_files = malloc(ptr->header.nAnimations * sizeof(FILE *)); int i; for (i = 0; i < ptr->header.nAnimations; i++) { if (((ptr->animations[i].flags & 0x40) == 0) && ((ptr->animations[i].flags & 0x130) == 0)) { //If anim[i] is not an alias and is not stored in the model printf("\t%s\n", animfile_name(model_name, ptr->animations[i].animID, ptr->animations[i].subAnimID)); anim_files[i] = (FILE *) fcaseopen( animfile_name(model_name, ptr->animations[i].animID, ptr->animations[i].subAnimID), "r+b"); if (anim_files[i] == NULL) { fprintf(stderr, KRED "[Error] " RESET "[Anim #%d, ID%d, Flags %d] %s file not found.\n", i, ptr->animations[i].animID, ptr->animations[i].flags, animfile_name(model_name, ptr->animations[i].animID, ptr->animations[i].subAnimID)); fprintf(stderr, "[aliasNext %d]\n", ptr->animations[i].Index); exit(EXIT_FAILURE); } } } //Animations Lookup Table ptr->AnimLookup = malloc(ptr->header.nAnimationLookup * sizeof(short)); fseek(lk_m2_file, ptr->header.ofsAnimationLookup, SEEK_SET); fread(ptr->AnimLookup, sizeof(short), ptr->header.nAnimationLookup, lk_m2_file); //Bones read_bones(lk_m2_file, ptr, anim_files); //Skeleton Bone Lookup ptr->keybonelookup = malloc(ptr->header.nKeyBoneLookup * sizeof(short)); fseek(lk_m2_file, ptr->header.ofsKeyBoneLookup, SEEK_SET); fread(ptr->keybonelookup, sizeof(short), ptr->header.nKeyBoneLookup, lk_m2_file); //Vertices ptr->vertices = malloc(ptr->header.nVertices * sizeof(ModelVertex)); fseek(lk_m2_file, ptr->header.ofsVertices, SEEK_SET); fread(ptr->vertices, sizeof(ModelVertex), ptr->header.nVertices, lk_m2_file); //Colors read_colors(lk_m2_file, ptr, anim_files); //Textures Definition if (ptr->header.nTextures > 0) { ptr->textures_def = malloc( ptr->header.nTextures * sizeof(ModelTextureDef)); fseek(lk_m2_file, ptr->header.ofsTextures, SEEK_SET); fread(ptr->textures_def, sizeof(ModelTextureDef), ptr->header.nTextures, lk_m2_file); //textures names ptr->texture_names = malloc(ptr->header.nTextures * sizeof(char *)); int i; for (i = 0; i < ptr->header.nTextures; i++) { if (ptr->textures_def[i].type == 0) { //Filename is referenced in the m2 only when the type is 0 if (ptr->textures_def[i].nameLen >= 256) { fprintf(stderr, "nameLen too large : %d\nPlease report this issue.", ptr->textures_def[i].nameLen); return -1; } ptr->texture_names[i] = malloc(ptr->textures_def[i].nameLen); fseek(lk_m2_file, ptr->textures_def[i].nameOfs, SEEK_SET); fread(ptr->texture_names[i], sizeof(char), ptr->textures_def[i].nameLen, lk_m2_file); } } } //Transparency read_transparency(lk_m2_file, ptr, anim_files); //TexReplace ptr->TexReplace = malloc(ptr->header.nTexReplace * sizeof(short)); fseek(lk_m2_file, ptr->header.ofsTexReplace, SEEK_SET); fread(ptr->TexReplace, sizeof(short), ptr->header.nTexReplace, lk_m2_file); //Render Flags ptr->renderflags = malloc(ptr->header.nRenderFlags * sizeof(int)); fseek(lk_m2_file, ptr->header.ofsRenderFlags, SEEK_SET); fread(ptr->renderflags, sizeof(int), ptr->header.nRenderFlags, lk_m2_file); //Bone Lookup Table ptr->BoneLookupTable = malloc(ptr->header.nBoneLookupTable * sizeof(int16)); fseek(lk_m2_file, ptr->header.ofsBoneLookupTable, SEEK_SET); fread(ptr->BoneLookupTable, sizeof(int16), ptr->header.nBoneLookupTable, lk_m2_file); //Texture Lookup Table ptr->TexLookupTable = malloc(ptr->header.nTexLookup * sizeof(short)); fseek(lk_m2_file, ptr->header.ofsTexLookup, SEEK_SET); fread(ptr->TexLookupTable, sizeof(short), ptr->header.nTexLookup, lk_m2_file); //TexUnit ptr->TexUnit = malloc(ptr->header.nTexUnitLookup * sizeof(short)); fseek(lk_m2_file, ptr->header.ofsTexUnitLookup, SEEK_SET); fread(ptr->TexUnit, sizeof(short), ptr->header.nTexUnitLookup, lk_m2_file); //TransLookup ptr->TransparencyLookup = malloc( ptr->header.nTransparencyLookup * sizeof(short)); fseek(lk_m2_file, ptr->header.ofsTransparencyLookup, SEEK_SET); fread(ptr->TransparencyLookup, sizeof(short), ptr->header.nTransparencyLookup, lk_m2_file); //TexAnimLookup ptr->TexAnimLookup = malloc(ptr->header.nTexAnimLookup * sizeof(short)); fseek(lk_m2_file, ptr->header.ofsTexAnimLookup, SEEK_SET); fread(ptr->TexAnimLookup, sizeof(short), ptr->header.nTexAnimLookup, lk_m2_file); //BoundingTriangles ptr->BoundingTriangles = malloc( ptr->header.nBoundingTriangles / 3 * sizeof(Triangle)); fseek(lk_m2_file, ptr->header.ofsBoundingTriangles, SEEK_SET); fread(ptr->BoundingTriangles, sizeof(Triangle), ptr->header.nBoundingTriangles / 3, lk_m2_file); //BoundingVertices ptr->BoundingVertices = malloc( ptr->header.nBoundingVertices * sizeof(Vec3D)); fseek(lk_m2_file, ptr->header.ofsBoundingVertices, SEEK_SET); fread(ptr->BoundingVertices, sizeof(Vec3D), ptr->header.nBoundingVertices, lk_m2_file); //BoundingNormals ptr->BoundingNormals = malloc(ptr->header.nBoundingNormals * sizeof(Vec3D)); fseek(lk_m2_file, ptr->header.ofsBoundingNormals, SEEK_SET); fread(ptr->BoundingNormals, sizeof(Vec3D), ptr->header.nBoundingNormals, lk_m2_file); //Attachments read_attachments(lk_m2_file, ptr, anim_files); //Attachment Lookup Table ptr->AttachLookup = malloc(ptr->header.nAttachLookup * sizeof(short)); fseek(lk_m2_file, ptr->header.ofsAttachLookup, SEEK_SET); fread(ptr->AttachLookup, sizeof(short), ptr->header.nAttachLookup, lk_m2_file); //Events read_events(lk_m2_file, ptr); //Lights read_lights(lk_m2_file, ptr, anim_files); //Cameras read_cameras(lk_m2_file, ptr, anim_files); //Cameras Lookup ptr->CameraLookup = malloc(ptr->header.nCameraLookup * sizeof(short)); fseek(lk_m2_file, ptr->header.ofsCameraLookup, SEEK_SET); fread(ptr->CameraLookup, sizeof(short), ptr->header.nCameraLookup, lk_m2_file); //TexAnims read_texanims(lk_m2_file, ptr, anim_files); /*TODO Ribbons; Particles */ return 0; }