00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "ExCModel3DS.h"
00025
00026 ExCModel3DS::ExCModel3DS(void)
00027 {
00028 Guard(ExCModel3DS::ExCModel3DS(void))
00029 m_ListId=-1;
00030 UnGuard
00031 }
00032
00033 ExCModel3DS::~ExCModel3DS(void)
00034 {
00035 Guard(ExCModel3DS::~ExCModel3DS(void))
00036 UnGuard
00037 }
00038 void ExCModel3DS::BuildArray(int Rendu)
00039 {
00040 Guard(void ExCModel3DS::BuildArray(int Rendu))
00041
00042
00043 int HowManyVertex =0;
00044 int HowManyFace =0;
00045 int HowManyText =0;
00046 for(unsigned int i=0;i<m_VecObject.size();i++)
00047 {
00048 HowManyVertex+=m_VecObject.at(i).Verts.size();;
00049 HowManyFace+=m_VecObject.at(i).Faces.size();
00050 HowManyText+=m_VecObject.at(i).TexVerts.size();;
00051 }
00052 m_VertexArray=new float[HowManyVertex*3];
00053 m_FaceArray=new unsigned int[HowManyFace*3];
00054 m_TextureArray= new float[HowManyText*2];
00055
00056
00057 unsigned int CmptFaces=0;
00058 for(unsigned int i=0;i<m_VecObject.size();i++)
00059 {
00060 for(unsigned int j=0;j<m_VecObject.at(i).Faces.size();j++)
00061 {
00062 m_FaceArray[j+i]=m_VecObject.at(i).Faces.at(j).vertIndex[0];
00063 m_FaceArray[j+i+1]=m_VecObject.at(i).Faces.at(j).vertIndex[1];
00064 m_FaceArray[j+i+2]=m_VecObject.at(i).Faces.at(j).vertIndex[2];
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094 }
00095 }
00096 glEnableClientState(GL_VERTEX_ARRAY);
00097 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
00098 glVertexPointer(3, GL_FLOAT,0,m_VertexArray);
00099 glTexCoordPointer(2,GL_FLOAT,0,m_TextureArray);
00100
00101
00102 UnGuard
00103 }
00104
00105 void ExCModel3DS::Draw(void)
00106 {
00107 Guard(void ExCModel3DS::Draw(void))
00108 glPushMatrix();
00109 glDisable(GL_LIGHTING);
00110 ExCModel::Draw();
00111 if(m_ListId==-1){
00112 BuildList(RENDER_TEXTURES);
00113
00114 }
00115 glCallList(m_ListId);
00116
00117 glEnable(GL_LIGHTING);
00118 glPopMatrix();
00120
00121 UnGuard
00122 }
00123
00124 void ExCModel3DS::BuildList(int Rendu)
00125 {
00126 Guard(void ExCModel3DS::BuildList(int Rendu))
00127 glDeleteLists(m_ListId,1);
00128 m_ListId=glGenLists(1);
00129 glNewList(m_ListId,GL_COMPILE);
00130 glPushAttrib(GL_ALL_ATTRIB_BITS);
00131
00132 ExCVec3D VecAB,VecBC,VecCA,VecFace;
00133 ExCVec3D VecX,VecY,VecZ;
00134 ExCVec2D VecTAB,VecTBC,VecTCA;
00135 glPushMatrix();
00136
00137 glDisable(GL_LIGHTING);
00138 for(unsigned int i=0;i<m_VecObject.size();i++)
00139 {
00140 for(unsigned int j=0;j<m_VecObject.at(i).Faces.size();j++)
00141 {
00142 VecFace.SetX(m_VecObject.at(i).Faces.at(j).vertIndex[0]);
00143 VecFace.SetY(m_VecObject.at(i).Faces.at(j).vertIndex[1]);
00144 VecFace.SetZ(m_VecObject.at(i).Faces.at(j).vertIndex[2]);
00145
00146
00147
00148 VecTAB.SetX(m_VecObject.at(i).TexVerts.at(VecFace.GetX()).GetX());
00149 VecTAB.SetY(m_VecObject.at(i).TexVerts.at(VecFace.GetX()).GetY());
00150
00151 VecTBC.SetX(m_VecObject.at(i).TexVerts.at(VecFace.GetY()).GetX());
00152 VecTBC.SetY(m_VecObject.at(i).TexVerts.at(VecFace.GetY()).GetY());
00153
00154 VecTCA.SetX(m_VecObject.at(i).TexVerts.at(VecFace.GetZ()).GetX());
00155 VecTCA.SetY(m_VecObject.at(i).TexVerts.at(VecFace.GetZ()).GetY());
00156
00157
00158
00159
00160
00161 VecX.SetX(m_VecObject.at(i).Verts.at(VecFace.GetX()).GetX());
00162 VecX.SetY(m_VecObject.at(i).Verts.at(VecFace.GetX()).GetY());
00163 VecX.SetZ(m_VecObject.at(i).Verts.at(VecFace.GetX()).GetZ());
00164
00165 VecY.SetX(m_VecObject.at(i).Verts.at(VecFace.GetY()).GetX());
00166 VecY.SetY(m_VecObject.at(i).Verts.at(VecFace.GetY()).GetY());
00167 VecY.SetZ(m_VecObject.at(i).Verts.at(VecFace.GetY()).GetZ());
00168
00169 VecZ.SetX(m_VecObject.at(i).Verts.at(VecFace.GetZ()).GetX());
00170 VecZ.SetY(m_VecObject.at(i).Verts.at(VecFace.GetZ()).GetY());
00171 VecZ.SetZ(m_VecObject.at(i).Verts.at(VecFace.GetZ()).GetZ());
00172
00174
00175 ManagerTexture->SetCurrentObject(m_VecObject.at(i).Material);
00176
00178
00179 glColor3f(1.0f,1.0f,1.0f);
00180 glEnable(GL_TEXTURE_2D);
00181 glBegin(GL_TRIANGLES);
00182 glTexCoord2f(VecTAB.GetX(),VecTAB.GetY());
00183 glVertex3fv(VecX.m_Vector);
00184 glTexCoord2f(VecTBC.GetX(),VecTBC.GetY());
00185 glVertex3fv(VecY.m_Vector);
00186 glTexCoord2f(VecTCA.GetX(),VecTCA.GetY());
00187 glVertex3fv(VecZ.m_Vector);
00188 glEnd();
00189 glDisable(GL_TEXTURE_2D);
00190 }
00191 }
00192 glPopMatrix();
00193
00194 glPopAttrib();
00195 glEndList();
00196 UnGuard
00197 }
00198
00199
00200
00201 bool ExCModel3DS::Load(std::string FileName)
00202 {
00203 Guard(bool ExCModel3DS::Load(std::string FileName))
00204 unsigned int version=0;
00205 int buffer[50000] = {0};
00206 char bufferc[255];memset(bufferc,0,255);
00207
00208
00209 m_filePtr = fopen(FileName.data(), "rb");
00210 if (m_filePtr == NULL)
00211 {
00212 throw ExCExpFileNotFound();
00213 return false;
00214 }
00215 tChunk *chunk;
00216 chunk = new tChunk;
00217 ReadChunk(chunk);
00218
00219 if(chunk->ID==PRIMARY)
00220 {
00221
00222 m_CurrentChunk = new tChunk;
00223 while (chunk->bytesRead < chunk->length)
00224 {
00225 ReadChunk(m_CurrentChunk);
00226 switch(m_CurrentChunk->ID)
00227 {
00228 case FILEVERSION:
00229 m_CurrentChunk->bytesRead += fread(&version, 1,m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_filePtr);
00230
00231 break;
00232 case OBJECTINFO:
00233
00234 ReadObjectInfo(m_CurrentChunk);
00235 break;
00236 case EDITKEYFRAME:
00237
00238 Skip(m_CurrentChunk);
00239 break;
00240 default:
00241
00242 Skip(m_CurrentChunk);
00243 break;
00244 }
00245 chunk->bytesRead += m_CurrentChunk->bytesRead;
00246 }
00247 delete m_CurrentChunk;
00248 m_CurrentChunk = chunk;
00249 }
00250
00251 fclose(m_filePtr);
00252 BuildArray(0);
00253 return true;
00254 UnGuard
00255 }
00256
00257 void ExCModel3DS::ReadObjectInfo(tChunk *chunk)
00258 {
00259 Guard(void ExCModel3DS::ReadObjectInfo(tChunk *chunk))
00260 int buffer[50000] = {0};
00261 char bufferc[255],b;
00262 std::string BuffObject;
00263 m_CurrentChunk = new tChunk;
00264 while (chunk->bytesRead < chunk->length)
00265 {
00266 ReadChunk(m_CurrentChunk);
00267 switch(m_CurrentChunk->ID)
00268 {
00269 case MATERIAL:
00270
00271 ReadObjectMaterial(m_CurrentChunk);
00272 break;
00273 case OBJECT:
00274 memset(bufferc,0,255);
00275
00276
00278
00279 do
00280 {
00281 m_CurrentChunk->bytesRead += fread(&b, 1, sizeof(char), m_filePtr);
00282 if(b!=0)BuffObject=BuffObject+b;
00283 }while(b!=0);
00284
00285 ReadObject(m_CurrentChunk);
00286 break;
00287 case MESH_VERSION:
00288
00289 Skip(m_CurrentChunk);
00290 break;
00291 case MASTER_SCALE:
00292
00293 Skip(m_CurrentChunk);
00294 break;
00295 default:
00296
00297 Skip(m_CurrentChunk);
00298 break;
00299 }
00300 chunk->bytesRead += m_CurrentChunk->bytesRead;
00301 }
00302 delete m_CurrentChunk;
00303 m_CurrentChunk = chunk;
00304 UnGuard
00305 }
00306 void ExCModel3DS::ReadObject(tChunk *chunk)
00307 {
00308 Guard(void ExCModel3DS::ReadObject(tChunk *chunk))
00309 int buffer[50000] = {0};
00310 t3DObject *pObject;
00311 pObject = new t3DObject;
00312 m_CurrentChunk = new tChunk;
00313 while (chunk->bytesRead < chunk->length)
00314 {
00315 ReadChunk(m_CurrentChunk);
00316 switch(m_CurrentChunk->ID)
00317 {
00318 case OBJECT_MESH:
00319
00320 ReadObject(m_CurrentChunk);
00321 break;
00322 case OBJECT_VERTICES:
00323
00324
00325 ReadVertices(pObject,m_CurrentChunk);
00326 break;
00327 case OBJECT_FACES:
00328
00329 ReadFace(pObject,m_CurrentChunk);
00330 break;
00331 case OBJECT_MATERIAL:
00332
00333 ReadObjectMaterial(pObject,m_CurrentChunk);
00334 break;
00335 case OBJECT_UV:
00336
00337 ReadUVCoordinates(pObject,m_CurrentChunk);
00338 break;
00339 case OBJECT_MESH_MATRIX:
00340
00341 Skip(m_CurrentChunk);
00342 break;
00343 default:
00344
00345 Skip(m_CurrentChunk);
00346 break;
00347 }
00348 chunk->bytesRead += m_CurrentChunk->bytesRead;
00349 }
00350
00351 m_VecObject.push_back(*pObject);
00352 delete m_CurrentChunk;
00353 m_CurrentChunk = chunk;
00354 UnGuard
00355 }
00356
00357 void ExCModel3DS::ReadObjectMaterial(tChunk *chunk)
00358 {
00359 Guard(void ExCModel3DS::ReadObjectMaterial(tChunk *chunk))
00360 int buffer[50000] = {0};
00361 char bufferc[255];
00362 m_CurrentChunk = new tChunk;
00363 while (chunk->bytesRead < chunk->length)
00364 {
00365 ReadChunk(m_CurrentChunk);
00366 switch(m_CurrentChunk->ID)
00367 {
00368 case MATNAME:
00369 memset(bufferc,0,255);
00370 m_CurrentChunk->bytesRead += fread(bufferc, 1, m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_filePtr);
00371
00372 break;
00373 case MATAMBIENTCOLOR:
00374
00375 Skip(m_CurrentChunk);
00376 break;
00377 case MATDIFFUSE:
00378
00379 Skip(m_CurrentChunk);
00380 break;
00381 case MATSPECULAR:
00382
00383 Skip(m_CurrentChunk);
00384 break;
00385 case MATSHININESS:
00386
00387 Skip(m_CurrentChunk);
00388 break;
00389 case MATSHININESSSTR:
00390
00391 Skip(m_CurrentChunk);
00392 break;
00393 case MATTRANSPARENCY:
00394
00395 Skip(m_CurrentChunk);
00396 break;
00397 case MATTRANSFALLOFF:
00398
00399 Skip(m_CurrentChunk);
00400 break;
00401 case MATREFLECTBLUR:
00402
00403 Skip(m_CurrentChunk);
00404 break;
00405 case MATTWOSIDED:
00406
00407 Skip(m_CurrentChunk);
00408 break;
00409 case MATTRANSPARENCYADD:
00410
00411 Skip(m_CurrentChunk);
00412 break;
00413 case MATSELFILUM:
00414
00415 Skip(m_CurrentChunk);
00416 break;
00417 case MATWIREON:
00418
00419 Skip(m_CurrentChunk);
00420 break;
00421 case MATWIRETHICKNESS:
00422
00423 Skip(m_CurrentChunk);
00424 break;
00425 case MATFACEMAP:
00426
00427 Skip(m_CurrentChunk);
00428 break;
00429 case MATTRANSFALLOFFIN:
00430
00431 Skip(m_CurrentChunk);
00432 break;
00433 case MATSOFTEN:
00434
00435 Skip(m_CurrentChunk);
00436 break;
00437 case MAT3DWIRETHICKNESS:
00438
00439 Skip(m_CurrentChunk);
00440 break;
00441 case MATTYPE:
00442
00443 Skip(m_CurrentChunk);
00444 break;
00445 case MATMAP:
00446
00447 ReadObjectMaterial(m_CurrentChunk);
00448 break;
00449 case MATMAPFILE:
00450
00451 Skip(m_CurrentChunk);
00452 break;
00453 case MATMAPOPTION:
00454
00455 Skip(m_CurrentChunk);
00456 break;
00457 case MATMAPFILTERINGBLUR:
00458
00459
00460 Skip(m_CurrentChunk);
00461 break;
00462 default:
00463
00464 Skip(m_CurrentChunk);
00465 break;
00466 }
00467 chunk->bytesRead += m_CurrentChunk->bytesRead;
00468 }
00469 delete m_CurrentChunk;
00470 m_CurrentChunk = chunk;
00471 UnGuard
00472 }
00473
00474
00475
00476 void ExCModel3DS::ReadChunk(tChunk *chunk)
00477 {
00478 Guard(void ExCModel3DS::tChunk ReadChunk(tChunk *chunk))
00480 chunk->bytesRead = fread(&chunk->ID, 1, 2, m_filePtr);
00481 chunk->bytesRead += fread(&chunk->length, 1, 4, m_filePtr);
00485 UnGuard
00486 }
00487
00488 void ExCModel3DS::Skip(tChunk *chunk)
00489 {
00490 Guard(void ExCModel3DS::tChunk Skip(tChunk *chunk))
00491 int buffer[50000] = {0};
00493 chunk->bytesRead += fread(buffer, 1, chunk->length - chunk->bytesRead, m_filePtr);
00494 UnGuard
00495 }
00496
00497 void ExCModel3DS::ReadVertices(t3DObject *pObject,tChunk *chunk)
00498 {
00499 Guard(void ExCModel3DS::ReadVertices(t3DObject *pObject,tChunk *chunk))
00500 int buffer[50000] = {0};
00501
00502 unsigned short vert;
00503 chunk->bytesRead += fread(&vert, 1,sizeof(unsigned short), m_filePtr);
00504 pObject->numOfVerts=vert;
00506 float fl;
00507 ExCVec3D vec;
00508 for(int i=0;i<vert;i++)
00509 {
00510 chunk->bytesRead += fread(&fl, 1,sizeof(float), m_filePtr);
00511 vec.SetX(fl);
00512 chunk->bytesRead += fread(&fl, 1,sizeof(float), m_filePtr);
00513 vec.SetY(fl);
00514 chunk->bytesRead += fread(&fl, 1,sizeof(float), m_filePtr);
00515 vec.SetZ(fl);
00517 pObject->Verts.push_back(vec);
00518 }
00519 Skip(chunk);
00520 UnGuard
00521 }
00522
00523 void ExCModel3DS::ReadFace(t3DObject *pObject,tChunk *chunk)
00524 {
00525 Guard(void ExCModel3DS::ReadFace(t3DObject *pObject,tChunk *chunk))
00526 int buffer[50000] = {0};
00527
00528 tFace stFace;
00529 unsigned short face,index;
00530 chunk->bytesRead += fread(&face, 1,sizeof(unsigned short), m_filePtr);
00531 pObject->numOfFaces=face;
00533
00534
00535 for(int i = 0; i <face; i++)
00536 {
00537
00538
00539 for(int j = 0; j < 4; j++)
00540 {
00541
00542 chunk->bytesRead += fread(&index, 1, sizeof(unsigned short), m_filePtr);
00543
00544 if(j < 3)
00545 {
00546
00547
00548 stFace.vertIndex[j]=index;
00549 }
00550 }
00552 pObject->Faces.push_back(stFace);
00553 }
00554 char b=0;
00555 std::string Material;
00556 m_CurrentChunk = new tChunk;
00557 while (chunk->bytesRead < chunk->length)
00558 {
00559 ReadChunk(m_CurrentChunk);
00560 switch(m_CurrentChunk->ID)
00561 {
00562 case OBJECT_MATERIAL:
00563
00564 do
00565 {
00566 m_CurrentChunk->bytesRead += fread(&b, 1, sizeof(char), m_filePtr);
00567 if(b!=0)Material=Material+b;
00568 }while(b!=0);
00570 pObject->Material=Material;
00571
00572 ManagerTexture->Load(Material);
00573 Skip(m_CurrentChunk);
00574 break;
00575 case OBJECT_SMOOTH_GROUP:
00576
00577 Skip(m_CurrentChunk);
00578 break;
00579 default:
00580
00581 Skip(m_CurrentChunk);
00582 break;
00583 }
00584 chunk->bytesRead += m_CurrentChunk->bytesRead;
00585 }
00586 delete m_CurrentChunk;
00587 m_CurrentChunk = chunk;
00588
00589
00590
00591 UnGuard
00592 }
00593
00594 void ExCModel3DS::ReadUVCoordinates(t3DObject *pObject,tChunk *chunk)
00595 {
00596 Guard(void ExCModel3DS::ReadUVCoordinates(t3DObject *pObject,tChunk *chunk))
00597 int buffer[50000] = {0};
00598
00599 unsigned short vert;
00600 chunk->bytesRead += fread(&vert, 1,sizeof(unsigned short), m_filePtr);
00601 pObject->numTexVertex=vert;
00603 float fl;
00604 ExCVec2D vec;
00605 for(int i=0;i<vert;i++)
00606 {
00607 chunk->bytesRead += fread(&fl, 1,sizeof(float), m_filePtr);
00608 vec.SetX(fl);
00609 chunk->bytesRead += fread(&fl, 1,sizeof(float), m_filePtr);
00610 vec.SetY(fl);
00612 pObject->TexVerts.push_back(vec);
00613 }
00614 Skip(chunk);
00615 UnGuard
00616 }
00617
00618 void ExCModel3DS::ReadObjectMaterial(t3DObject *pObject,tChunk *chunk)
00619 {
00620 Guard(void ExCModel3DS::ReadObjectMaterial(tChunk *chunk))
00621 char b=0;
00622 std::string Material;
00623 do
00624 {
00625 chunk->bytesRead += fread(&b, 1, sizeof(char), m_filePtr);
00626 Material=Material+b;
00627 }while(b!=0);
00628
00629 Skip(chunk);
00630 UnGuard
00631 }