1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
//c/c++
#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <vector>
#include <stdlib.h>
//SDL/Opengl
#include <SDL/SDL.h>
#include <SDL/SDL_opengl.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_mixer.h>
#include <GL/gl.h>
#include <GL/glu.h>
using namespace std;
//project
#include "md2.h"
md2::md2()
{
}
void md2::render()
{
glBegin(GL_TRIANGLES);
for (int i=0; i<header.num_tris; i++)
{
glVertex3f(tris[i].vertex_index[0] * frame_head.scale[0] + frame_head.translate[0],
tris[i].vertex_index[1] * frame_head.scale[1] + frame_head.translate[1],
tris[i].vertex_index[2] * frame_head.scale[2] + frame_head.translate[2]);
}
glEnd;
}
bool md2::load(const char* filename)
{
int buffer [17];
ifstream file;
file.open(filename, istream::binary);
if (file == false)
{
cout << "cannot find file"<<endl;
return false;
}
for (int i=0; i<17; i++)
{
file.read((char*)&buffer[i], sizeof(int));
}
header.ident = buffer[0]; //must be IDP2 (844121161)
header.version = buffer[1]; //must be 8
if (header.ident != 844121161 || header.version != 8)
{
cout << "File is incorrect, version or magic number is wrong."<<endl;
return false;
}
header.skinwidth = buffer[2]; //width of texture
header.skinheight = buffer[3]; //height of texture
header.framesize = buffer[4]; //size of one frame in bytes
header.num_skins = buffer[5]; //number of textures
header.num_xyz = buffer[6]; //number of vertices
header.num_st = buffer[7]; //number of texture coordinates
header.num_tris = buffer[8]; //number of triangles
header.num_glcmds = buffer[9]; //number of opengl commands
header.num_frames = buffer[10]; //number of frames
header.ofs_skins = buffer[11]; //offset to skin names
header.ofs_st = buffer[12]; //offest to s-t texture coordinates
header.ofs_tris = buffer[13]; //offset to triangles
header.ofs_frames = buffer[14]; //offset to frame data
header.ofs_glcmds = buffer[15]; //offset to opengl commands
header.ofs_end = buffer[16]; //offset to end of file
//load int texture coordinates
file.seekg ( header.ofs_st, ios::beg );
for (int i=0; i<header.num_st; i++)
{
file.read((char*)&texCoord[i].s, sizeof(short));
file.read((char*)&texCoord[i].t, sizeof(short));
}
//recover the floating-point texture coordinates from int texture coordinates
for (int i=0; i<header.num_st; i++)
{
realst[i].s = texCoord[i].s / header.skinwidth;
realst[i].t = texCoord[i].t / header.skinheight;
}
//load tris data
file.seekg ( header.ofs_tris, ios::beg );
for (int i=0; i< header.num_tris; i++)
{
for (int j=0; j<3; j++)
{
file.read((char*) &tris[i].vertex_index[j], sizeof(float));
}
for (int j=0; j<3; j++)
{
file.read((char*)&tris[i].texture_index[j], sizeof(float));
}
}
//load frame header
file.seekg ( header.ofs_frames, ios::beg );
for (int i =0; i<3; i++)
{
file.read((char*)&frame_head.scale[i], sizeof(int));
}
for (int i =0; i<3; i++)
{
file.read((char*)&frame_head.translate[i], sizeof(int));
}
file.read(frame_head.name, 16);
//load vertex data as int
for (int i=0; i<header.num_xyz; i++)
{
for (int j=0; j<3; j++)
{
file.read((char*)&frame_coords[i].v_i[j], sizeof(int));
}
file.read((char*)&frame_coords[i].lightnormalindex, sizeof(int));
//convert int vertex data to float
frame_coords[i].v_f[0] = (frame_coords[i].v_i[0] * frame_head.scale[0]) + frame_head.translate[0];
frame_coords[i].v_f[1] = (frame_coords[i].v_i[1] * frame_head.scale[1]) + frame_head.translate[1];
frame_coords[i].v_f[2] = (frame_coords[i].v_i[2] * frame_head.scale[2]) + frame_head.translate[2];
}
file.close();
cout << "Finished loading MD2" <<endl;
return true;
}
|