00001 #include "ExCModeLoader.h"
00002
00003
00004 ExCModelLoader::ExCModelLoader(void)
00005 {
00006
00007 }
00008
00009 ExCModelLoader::ExCModelLoader(std::string FileName)
00010 {
00011 LoadModel(FileName);
00012 }
00013
00014 ExCModelLoader::~ExCModelLoader(void)
00015 {
00016
00017 }
00018
00019 int ExCModelLoader::LoadModel(std::string FileName)
00020 {
00021 Guard(int ExCModelLoader::LoadModel(std::string FileName))
00022 if(FileName.find(".exm")==(FileName.length()-4))LoadEXM(FileName);;
00023 if(FileName.find(".md2")==(FileName.length()-4))LoadMD2(FileName);
00024 if(FileName.find(".md3")==(FileName.length()-4))LoadMD3(FileName);
00025 if(FileName.find(".asc")==(FileName.length()-4))LoadASC(FileName);
00026 if(FileName.find(".3ds")==(FileName.length()-4))Load3DS(FileName);
00027 if(FileName.find(".obj")==(FileName.length()-4))LoadOBJ(FileName);
00028 if(FileName.find(".ase")==(FileName.length()-4))LoadASE(FileName);
00029 return m_VecExcModel.size();
00030 UnGuard
00031 }
00032
00033 void ExCModelLoader::LoadMD3(std::string strFileName)
00034 {
00035 Guard(void ExCModelLoader::LoadMD3(std::string strFileName))
00036 UnGuard
00037 }
00038
00039 void ExCModelLoader::LoadASC(std::string strFileName)
00040 {
00041 Guard(void ExCModelLoader::LoadASC(std::string strFileName))
00042 UnGuard
00043 }
00044
00045 void ExCModelLoader::Load3DS(std::string strFileName)
00046 {
00047 Guard(void ExCModelLoader::Load3DS(std::string strFileName))
00048 UnGuard
00049 }
00050
00051 void ExCModelLoader::LoadOBJ(std::string strFileName)
00052 {
00053 Guard(void ExCModelLoader::LoadOBJ(std::string strFileName))
00054 UnGuard
00055 }
00056
00057 void ExCModelLoader::LoadASE(std::string strFileName)
00058 {
00059 Guard(void ExCModelLoader::LoadASE(std::string strFileName))
00060 UnGuard
00061 }
00062
00063 void ExCModelLoader::LoadEXM(std::string strFileName)
00064 {
00065 Guard(void ExCModelLoader::LoadEXM(std::string strFileName))
00066 std::cout<<"Loading EXM Model"<<std::endl;
00067 ExCModelEXM TmpModel;
00068 m_VecExcModel.push_back(TmpModel);
00069 UnGuard
00070 }
00071
00072 void ExCModelLoader::LoadMD2(std::string strFileName)
00073 {
00074 Guard(void ExCModelLoader::LoadMD2(std::string strFileName))
00075 std::cout<<"Loading MD2 Model"<<std::endl;
00076 ExCModelEXM TmpModel;
00077
00078
00079
00080
00081 int i,j;
00082 FILE *filePtr;
00083 int fileLen;
00084 char *buffer;
00085
00086 MD2_modelHeader_t *modelHeader;
00087 MD2_frame_t *frame;
00088 MD2_stIndex_t *stPtr;
00089 MD2_mesh_t *bufIndexPtr;
00090
00091
00092 std::string Skin;
00093 Skin=ExNihilo::ExtracValueFromSring(strFileName,"../Data/Modeles/",".md2")+".pcx";
00094 TmpModel.m_VecTextures.push_back(Skin);
00095 TmpModel.m_VecTextures.push_back("fire.bmp");
00096
00097 filePtr = fopen(strFileName.data(), "rb");
00098 if (filePtr == NULL)
00099 {
00100 throw ExCExpFileNotFound();
00101 }
00102
00103
00104 fseek(filePtr, 0, SEEK_END);
00105 fileLen = ftell(filePtr);
00106 fseek(filePtr, 0, SEEK_SET);
00107
00108
00109 buffer = new char [fileLen+1];
00110 fread(buffer, sizeof(char), fileLen, filePtr);
00111
00112 modelHeader = (MD2_modelHeader_t*)buffer;
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128 std::cout<<"This is used to identify the file: "<<modelHeader->ident<<std::endl;
00129 std::cout<<"The version number of the file (Musbe 8):"<<modelHeader->version<<std::endl;
00130 std::cout<<"The skin width in pixels:"<<modelHeader->skinwidth<<std::endl;
00131 std::cout<<"The skin heighin pixels:"<<modelHeader->skinheight<<std::endl;
00132 std::cout<<"The size in bytes the frames are:"<<modelHeader->framesize<<std::endl;
00133 std::cout<<"The number of skins associated with the model:"<<modelHeader->numSkins<<std::endl;
00134 std::cout<<"The number of vertices (constan for each frame):"<<modelHeader->numXYZ<<std::endl;
00135 std::cout<<"The number of texture coordinates:"<<modelHeader->numST<<std::endl;
00136 std::cout<<"The number of faces (polygons):"<<modelHeader->numTris<<std::endl;
00137 std::cout<<"The number of gl commands:"<<modelHeader->numGLcmds<<std::endl;
00138 std::cout<<"The number of animation frames:"<<modelHeader->numFrames<<std::endl;
00139 std::cout<<"The offset in the file for the skin data:"<<modelHeader->offsetSkins<<std::endl;
00140 std::cout<<"The offset in the file for the texture data:"<<modelHeader->offsetST<<std::endl;
00141 std::cout<<"The offset in the file for the face data:"<<modelHeader->offsetTris<<std::endl;
00142 std::cout<<"The offset in the file for the frames data:"<<modelHeader->offsetFrames<<std::endl;
00143 std::cout<<"The offset in the file for the gl commands data:"<<modelHeader->offsetGLcmds<<std::endl;
00144 std::cout<<"The end of the file offset:"<<modelHeader->offsetEnd<<std::endl;
00145
00146
00147
00148
00149 std::cout<<"read all skin"<<std::endl;
00150 char mybuff[65];
00151 std::string BuffSkin;
00152 fseek(filePtr,modelHeader->offsetSkins, SEEK_SET);
00153 for(i = 0;i<modelHeader->numSkins;++i)
00154 {
00155 fread(&mybuff,sizeof(char),64, filePtr);
00156 BuffSkin=mybuff;
00157
00158
00159 }
00160
00161
00162
00163 std::cout<<"read vertex data "<<std::endl;
00164 ExCVec3D Vec3D;
00165 for (j = 0; j < modelHeader->numFrames; j++)
00166 {
00167 frame = (MD2_frame_t*)&buffer[modelHeader->offsetFrames+ modelHeader->framesize * j];
00168 for (i = 0; i < modelHeader->numXYZ; i++)
00169 {
00170 Vec3D.SetX(frame->scale[0] * frame->fp[i].v[0] + frame->translate[0]);
00171 Vec3D.SetY(frame->scale[1] * frame->fp[i].v[1] + frame->translate[1]);
00172 Vec3D.SetZ(frame->scale[2] * frame->fp[i].v[2] + frame->translate[2]);
00173 Vec3D=Vec3D/3;
00174 TmpModel.m_VecVertex.push_back(Vec3D);
00175
00176
00177
00178
00179
00180 }
00181
00182 }
00183
00184
00185
00186 std::cout<<"read triangles data "<<std::endl;
00187 fseek(filePtr,modelHeader->offsetTris, SEEK_SET);
00188 short AB,BC,CA,TAB,TBC,TCA;
00189 ExCVec3D VertexNum,TexturNum;
00190
00191
00192
00193
00194
00195 bufIndexPtr = (MD2_mesh_t*)&buffer[modelHeader->offsetTris];
00196
00197 for (j = 0; j < modelHeader->numFrames; j++)
00198 {
00199
00200 for(i = 0; i < modelHeader->numTris; i++)
00201 {
00202 AB = bufIndexPtr[i].meshIndex[0];
00203 BC = bufIndexPtr[i].meshIndex[1];
00204 CA = bufIndexPtr[i].meshIndex[2];
00205 TAB = bufIndexPtr[i].stIndex[0];
00206 TBC = bufIndexPtr[i].stIndex[1];
00207 TCA = bufIndexPtr[i].stIndex[2];
00208
00209 VertexNum.SetValue(AB,BC,CA);
00210 TexturNum.SetValue(TAB,TBC,TCA);
00211 std::pair<ExCVec3D,ExCVec3D> tmp(VertexNum,TexturNum);
00212 TmpModel.m_VecTriangle.push_back(tmp);
00213
00214
00215 }
00216 }
00217
00218
00219
00220 std::cout<<"read texture coord data "<<std::endl;
00221 std::vector<ExCVec2D> *VecTexture;
00222 VecTexture= new std::vector<ExCVec2D>;
00223 stPtr = (MD2_stIndex_t*)&buffer[modelHeader->offsetST];
00224 for (i = 0; i < modelHeader->numST; i++)
00225 {
00226 VecTexture->push_back(ExCVec2D(((float)stPtr[i].s / (float)modelHeader->skinwidth),((float)stPtr[i].t / (float)modelHeader->skinheight)));
00227 }
00228
00229
00230
00231 std::cout<<"Build Texture Array"<<std::endl;
00232 TmpModel.TabTextures= new float[modelHeader->numTris*6];
00233 for(i = 0; i < modelHeader->numTris; i++)
00234 {
00235 TmpModel.TabTextures[0+i*6]=VecTexture->at(TmpModel.m_VecTriangle.at(i).second.GetY()).GetX();
00236 TmpModel.TabTextures[1+i*6]=VecTexture->at(TmpModel.m_VecTriangle.at(i).second.GetY()).GetY();
00237 TmpModel.TabTextures[2+i*6]=VecTexture->at(TmpModel.m_VecTriangle.at(i).second.GetX()).GetX();
00238 TmpModel.TabTextures[3+i*6]=VecTexture->at(TmpModel.m_VecTriangle.at(i).second.GetX()).GetY();
00239 TmpModel.TabTextures[4+i*6]=VecTexture->at(TmpModel.m_VecTriangle.at(i).second.GetZ()).GetX();
00240 TmpModel.TabTextures[5+i*6]=VecTexture->at(TmpModel.m_VecTriangle.at(i).second.GetZ()).GetY();
00241 }
00242 TmpModel.m_numTriangles=modelHeader->numTris;
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304 delete VecTexture;
00305 delete buffer;
00306
00307 m_VecExcModel.push_back(TmpModel);
00308 UnGuard
00309 }
00310
00311