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 ExCModel::ExCModel();
00030 SetName("ExCModel3DS");
00031 SetType(typeid(this).name());
00032 m_ListId=-1;
00033 m_CollisionGizmo=new ExCGizmoRectangle;
00034 m_CollisionCounter=0;
00035 HasList=false;
00036 HasArray=false;
00037 m_AlwaysDraw=false;
00038 SetVisibleState(true);
00039 UnGuard
00040 }
00041
00042 ExCModel3DS::~ExCModel3DS(void)
00043 {
00044 Guard(ExCModel3DS::~ExCModel3DS(void))
00045 UnGuard
00046 }
00047 void ExCModel3DS::BuildArray(int Rendu)
00048 {
00049 Guard(void ExCModel3DS::BuildArray(int Rendu))
00050
00051 ExCVec3D VecAB,VecBC,VecCA,VecFace;
00052 ExCVec3D VecX,VecY,VecZ;
00053 ExCVec2D VecTAB,VecTBC,VecTCA;
00054
00055 for(unsigned int i=0;i<m_VecObject->size();i++)
00056 {
00057
00058 m_VecObject->at(i).TabVertices= new float[m_VecObject->at(i).Faces.size()*9];
00059 m_VecObject->at(i).TabTextures= new float[m_VecObject->at(i).Faces.size()*6];
00060
00061 for(unsigned int j=0;j<m_VecObject->at(i).Faces.size();j++)
00062 {
00063 VecFace.SetX(m_VecObject->at(i).Faces.at(j).vertIndex[0]);
00064 VecFace.SetY(m_VecObject->at(i).Faces.at(j).vertIndex[1]);
00065 VecFace.SetZ(m_VecObject->at(i).Faces.at(j).vertIndex[2]);
00066
00067
00068
00069 VecTAB.SetX(m_VecObject->at(i).TexVerts.at(VecFace.GetX()).GetX());
00070 VecTAB.SetY(m_VecObject->at(i).TexVerts.at(VecFace.GetX()).GetY());
00071
00072 VecTBC.SetX(m_VecObject->at(i).TexVerts.at(VecFace.GetY()).GetX());
00073 VecTBC.SetY(m_VecObject->at(i).TexVerts.at(VecFace.GetY()).GetY());
00074
00075 VecTCA.SetX(m_VecObject->at(i).TexVerts.at(VecFace.GetZ()).GetX());
00076 VecTCA.SetY(m_VecObject->at(i).TexVerts.at(VecFace.GetZ()).GetY());
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087 VecX.SetX(m_VecObject->at(i).Verts.at(VecFace.GetX()).GetX());
00088 VecX.SetY(m_VecObject->at(i).Verts.at(VecFace.GetX()).GetY());
00089 VecX.SetZ(m_VecObject->at(i).Verts.at(VecFace.GetX()).GetZ());
00090
00091 VecY.SetX(m_VecObject->at(i).Verts.at(VecFace.GetY()).GetX());
00092 VecY.SetY(m_VecObject->at(i).Verts.at(VecFace.GetY()).GetY());
00093 VecY.SetZ(m_VecObject->at(i).Verts.at(VecFace.GetY()).GetZ());
00094
00095 VecZ.SetX(m_VecObject->at(i).Verts.at(VecFace.GetZ()).GetX());
00096 VecZ.SetY(m_VecObject->at(i).Verts.at(VecFace.GetZ()).GetY());
00097 VecZ.SetZ(m_VecObject->at(i).Verts.at(VecFace.GetZ()).GetZ());
00098
00099
00100
00101
00102
00103
00104 ManagerTexture->SetCurrentObject(m_VecObject->at(i).Material);
00105
00106
00107
00108 m_VecObject->at(i).TabVertices[0+j*9]=VecX.GetX();
00109 m_VecObject->at(i).TabVertices[1+j*9]=VecX.GetY();
00110 m_VecObject->at(i).TabVertices[2+j*9]=VecX.GetZ();
00111 m_VecObject->at(i).TabVertices[3+j*9]=VecY.GetX();
00112 m_VecObject->at(i).TabVertices[4+j*9]=VecY.GetY();
00113 m_VecObject->at(i).TabVertices[5+j*9]=VecY.GetZ();
00114 m_VecObject->at(i).TabVertices[6+j*9]=VecZ.GetX();
00115 m_VecObject->at(i).TabVertices[7+j*9]=VecZ.GetY();
00116 m_VecObject->at(i).TabVertices[8+j*9]=VecZ.GetZ();
00117
00118 m_VecObject->at(i).TabTextures[0+j*6]=VecTAB.GetX();
00119 m_VecObject->at(i).TabTextures[1+j*6]=VecTAB.GetY();
00120 m_VecObject->at(i).TabTextures[2+j*6]=VecTBC.GetX();
00121 m_VecObject->at(i).TabTextures[3+j*6]=VecTBC.GetY();
00122 m_VecObject->at(i).TabTextures[4+j*6]=VecTCA.GetX();
00123 m_VecObject->at(i).TabTextures[5+j*6]=VecTCA.GetY();
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143 }
00144 }
00145 HasArray=true;
00146 UnGuard
00147 }
00148
00149 void ExCModel3DS::Draw(void)
00150 {
00151 Guard(void ExCModel3DS::Draw(void))
00152 ExCVec3D VecAB,VecBC,VecCA,VecFace;
00153 ExCVec3D VecX,VecY,VecZ;
00154 bool DrawIt=false;
00155 ProcessAllAction();
00156 if(!m_Visible)return;
00157 if(HasList==false)BuildList(RENDER_TEXTURES);
00158 if(HasArray==false)BuildArray(RENDER_TEXTURES);
00159 glPushMatrix();
00160
00161
00162 glRotatef(-90,1,0,0);
00163 if(m_AlwaysDraw)
00164 {
00165
00166 CallAllArray();
00167 }else
00168 {
00169
00170 ExCFrustum Frustrum;
00171 Frustrum.CalculateFrustum();
00172 for(unsigned int i=0;i<m_VecObject->size();i++)
00173 {
00174 DrawIt=false;
00175 for(unsigned int j=0;j<m_VecObject->at(i).Faces.size();j++)
00176 {
00177 VecFace.SetX(m_VecObject->at(i).Faces.at(j).vertIndex[0]);
00178 VecFace.SetY(m_VecObject->at(i).Faces.at(j).vertIndex[1]);
00179 VecFace.SetZ(m_VecObject->at(i).Faces.at(j).vertIndex[2]);
00180
00181
00182
00183 VecX.SetX(m_VecObject->at(i).Verts.at(VecFace.GetX()).GetX());
00184 VecX.SetY(m_VecObject->at(i).Verts.at(VecFace.GetX()).GetY());
00185 VecX.SetZ(m_VecObject->at(i).Verts.at(VecFace.GetX()).GetZ());
00186 VecY.SetX(m_VecObject->at(i).Verts.at(VecFace.GetY()).GetX());
00187 VecY.SetY(m_VecObject->at(i).Verts.at(VecFace.GetY()).GetY());
00188 VecY.SetZ(m_VecObject->at(i).Verts.at(VecFace.GetY()).GetZ());
00189 VecZ.SetX(m_VecObject->at(i).Verts.at(VecFace.GetZ()).GetX());
00190 VecZ.SetY(m_VecObject->at(i).Verts.at(VecFace.GetZ()).GetY());
00191 VecZ.SetZ(m_VecObject->at(i).Verts.at(VecFace.GetZ()).GetZ());
00192 VecX=VecX+m_Position;
00193 VecY=VecY+m_Position;
00194 VecZ=VecZ+m_Position;
00195 if(Frustrum.PointInFrustum(VecX.GetX(),VecX.GetY(),VecX.GetZ())){DrawIt=true;}
00196 if(Frustrum.PointInFrustum(VecY.GetX(),VecY.GetY(),VecY.GetZ())){DrawIt=true;}
00197 if(Frustrum.PointInFrustum(VecZ.GetX(),VecZ.GetY(),VecZ.GetZ())){DrawIt=true;}
00198 }
00199 if(DrawIt)
00200 {
00201
00202
00203
00204 glDisable(GL_LIGHTING);
00205 glColor3f(1.0f,1.0f,1.0f);
00206 ManagerTexture->SetTexture(0,m_VecObject->at(i).Material);
00207 glTexCoordPointer(2,GL_FLOAT,0,m_VecObject->at(i).TabTextures);
00208 glEnableClientState(GL_VERTEX_ARRAY);
00209 glVertexPointer(3,GL_FLOAT,0,m_VecObject->at(i).TabVertices);
00210 glDrawArrays( GL_TRIANGLES, 0, m_VecObject->at(i).Faces.size()*3 );
00211 ManagerTexture->ResetMultitexture();
00212
00213 }
00214 }
00215 }
00216
00217 glPopMatrix();
00218 UnGuard
00219 }
00220
00221 void ExCModel3DS::CallAllList(void)
00222 {
00223 Guard(void ExCModel3DS::CallAllList(void))
00224 for(unsigned int i=0;i<m_VecObject->size();i++)
00225 {
00226 glCallList(m_VecObject->at(i).m_ListId);
00227 }
00228 UnGuard
00229 }
00230
00231 void ExCModel3DS::CallAllArray(void)
00232 {
00233 Guard(void ExCModel3DS::CallAllArray(void))
00234 for(unsigned int i=0;i<m_VecObject->size();i++)
00235 {
00236 glDisable(GL_LIGHTING);
00237 glColor3f(1.0f,1.0f,1.0f);
00238 ManagerTexture->SetTexture(0,m_VecObject->at(i).Material);
00239 glTexCoordPointer(2,GL_FLOAT,0,m_VecObject->at(i).TabTextures);
00240 glEnableClientState(GL_VERTEX_ARRAY);
00241 glVertexPointer(3,GL_FLOAT,0,m_VecObject->at(i).TabVertices);
00242 glDrawArrays( GL_TRIANGLES, 0, m_VecObject->at(i).Faces.size()*3 );
00243 ManagerTexture->ResetMultitexture();
00244 }
00245 UnGuard
00246 }
00247
00248
00249 void ExCModel3DS::BuildList(int Rendu)
00250 {
00251 Guard(void ExCModel3DS::BuildList(int Rendu))
00252
00253
00254 ExCVec3D VecAB,VecBC,VecCA,VecFace;
00255 ExCVec3D VecX,VecY,VecZ;
00256 ExCVec2D VecTAB,VecTBC,VecTCA;
00257 glPushMatrix();
00258
00259 glDisable(GL_LIGHTING);
00260 for(unsigned int i=0;i<m_VecObject->size();i++)
00261 {
00262 try
00263 {
00264 glDeleteLists(m_VecObject->at(i).m_ListId,1);
00265 m_VecObject->at(i).m_ListId=glGenLists(1);
00266 glNewList(m_VecObject->at(i).m_ListId,GL_COMPILE);
00267 for(unsigned int j=0;j<m_VecObject->at(i).Faces.size();j++)
00268 {
00269 VecFace.SetX(m_VecObject->at(i).Faces.at(j).vertIndex[0]);
00270 VecFace.SetY(m_VecObject->at(i).Faces.at(j).vertIndex[1]);
00271 VecFace.SetZ(m_VecObject->at(i).Faces.at(j).vertIndex[2]);
00272
00273
00274
00275 VecTAB.SetX(m_VecObject->at(i).TexVerts.at(VecFace.GetX()).GetX());
00276 VecTAB.SetY(m_VecObject->at(i).TexVerts.at(VecFace.GetX()).GetY());
00277
00278 VecTBC.SetX(m_VecObject->at(i).TexVerts.at(VecFace.GetY()).GetX());
00279 VecTBC.SetY(m_VecObject->at(i).TexVerts.at(VecFace.GetY()).GetY());
00280
00281 VecTCA.SetX(m_VecObject->at(i).TexVerts.at(VecFace.GetZ()).GetX());
00282 VecTCA.SetY(m_VecObject->at(i).TexVerts.at(VecFace.GetZ()).GetY());
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294 VecX.SetX(m_VecObject->at(i).Verts.at(VecFace.GetX()).GetX());
00295 VecX.SetY(m_VecObject->at(i).Verts.at(VecFace.GetX()).GetY());
00296 VecX.SetZ(m_VecObject->at(i).Verts.at(VecFace.GetX()).GetZ());
00297
00298 VecY.SetX(m_VecObject->at(i).Verts.at(VecFace.GetY()).GetX());
00299 VecY.SetY(m_VecObject->at(i).Verts.at(VecFace.GetY()).GetY());
00300 VecY.SetZ(m_VecObject->at(i).Verts.at(VecFace.GetY()).GetZ());
00301
00302 VecZ.SetX(m_VecObject->at(i).Verts.at(VecFace.GetZ()).GetX());
00303 VecZ.SetY(m_VecObject->at(i).Verts.at(VecFace.GetZ()).GetY());
00304 VecZ.SetZ(m_VecObject->at(i).Verts.at(VecFace.GetZ()).GetZ());
00305
00306
00307
00308
00309
00310
00311 ManagerTexture->SetCurrentObject(m_VecObject->at(i).Material);
00312
00313 glColor3f(1.0f,1.0f,1.0f);
00314 glEnable(GL_TEXTURE_2D);
00315 glBegin(GL_TRIANGLES);
00316 glTexCoord2f(VecTAB.GetX(),VecTAB.GetY());
00317 glVertex3fv(VecX.m_Vector);
00318 glTexCoord2f(VecTBC.GetX(),VecTBC.GetY());
00319 glVertex3fv(VecY.m_Vector);
00320 glTexCoord2f(VecTCA.GetX(),VecTCA.GetY());
00321 glVertex3fv(VecZ.m_Vector);
00322 glEnd();
00323 glDisable(GL_TEXTURE_2D);
00324
00325 }
00326 glEndList();
00327 }catch (...)
00328 {
00329
00330 }
00331
00332 }
00333 glPopMatrix();
00334
00335
00336 HasList=true;
00337
00338 UnGuard
00339 }
00340
00341 ExCAction ExCModel3DS::InputAction(ExCAction Action)
00342 {
00343
00344 switch(Action.m_Action)
00345 {
00346 case NEXT_FRAME:
00347 NextFrame();
00348 break;
00349 case PREVIOUS_FRAME:
00350 break;
00351 case SET_CURENT_FRAME:
00352 break;
00353 case START_ACTION:
00354 StartAction(Action.m_Param);
00355 break;
00356 case STOP_ACTION:
00357 StopAction(Action.m_Param);
00358 break;
00359 case TURN_LEFT:
00360 StartAction("TURN_LEFT");
00361 break;
00362 case TURN_RIGHT:
00363 StartAction("TURN_RIGHT");
00364 case LOOK_UP:
00365 StartAction(Action.m_Param);
00366 break;
00367 case LOOK_DOWN:
00368 StartAction(Action.m_Param);
00369 break;
00370 case MODEL_SET_POS_X:
00371 std::cout<<"MODEL"<<Action<<atof(Action.m_Param.data());
00372 m_Position.SetX(atof(Action.m_Param.data()));
00373 break;
00374 case MODEL_SET_POS_Y:
00375 m_Position.SetY(atof(Action.m_Param.data()));
00376 break;
00377 case MODEL_SET_POS_Z:
00378 m_Position.SetZ(atof(Action.m_Param.data()));
00379 break;
00380 case MODEL_SET_ANGLE_X:
00381 m_Angle.SetX(atof(Action.m_Param.data()));
00382 break;
00383 case MODEL_SET_ANGLE_Y:
00384 m_Angle.SetY(atof(Action.m_Param.data()));
00385 break;
00386 case MODEL_SET_ANGLE_Z:
00387 m_Angle.SetZ(atof(Action.m_Param.data()));
00388 break;
00389 case MODEL_START_ROTATE_Y_DOWN:
00390 StartAction("TURN_RIGHT");
00391 break;
00392 case MODEL_STOP_ROTATE_Y_DOWN:
00393 StopAction("TURN_RIGHT");
00394 if(!IsAction("RUN")){StartAction("IDLE");}
00395 break;
00396 case MODEL_START_ROTATE_Y_UP:
00397 StartAction("TURN_LEFT");
00398 break;
00399 case MODEL_STOP_ROTATE_Y_UP:
00400 StopAction("TURN_LEFT");
00401 if(!IsAction("RUN")){StartAction("IDLE");}
00402 break;
00403 case MODEL_START_ROTATE_Z_DOWN:
00404 StartAction("LOOK_UP");
00405 break;
00406 case MODEL_STOP_ROTATE_Z_DOWN:
00407 StopAction("LOOK_UP");
00408 break;
00409 case MODEL_START_ROTATE_Z_UP:
00410 StartAction("LOOK_DOWN");
00411 break;
00412 case MODEL_STOP_ROTATE_Z_UP:
00413 StopAction("LOOK_DOWN");
00414 break;
00415 case MODEL_START_ROTATE_X_DOWN:
00416 StartAction("X_DOWN");
00417 break;
00418 case MODEL_STOP_ROTATE_X_DOWN:
00419 StopAction("X_DOWN");
00420 break;
00421 case MODEL_START_ROTATE_X_UP:
00422 StartAction("X_UP");
00423 break;
00424 case MODEL_STOP_ROTATE_X_UP:
00425 StopAction("X_UP");
00426 break;
00427 case MODEL_START_MOVE_FORWARD:
00428 StartAction("RUN");
00429 m_Acceleration=m_Acceleration+0.01;
00430 break;
00431 case MODEL_STOP_MOVE_FORWARD:
00432 StopAction("RUN");
00433 StartAction("IDLE");
00434 m_Acceleration.SetValue(0.0f,0.0f,0.0f);
00435 break;
00436 case MODEL_JUMP:
00437 StartAction("JUMP");
00438 break;
00439 case MODEL_SET_ACTION:
00440 break;
00441 case MODEL_STOP_ALL:
00442 m_VecAction.clear();
00443 m_Velocity.SetValue(0.0f,0.0f,0.0f);
00444 m_Acceleration.SetValue(0.0f,0.0f,0.0f);
00445 break;
00446 case MODEL_SHOW_COLLISION_SPHERE:
00447
00448 break;
00449 case MODEL_START_STRAFE_LEFT:
00450 StartAction("STRAFE_LEFT");
00451 break;
00452 case MODEL_STOP_STRAFE_LEFT :
00453 StopAction("STRAFE_LEFT");
00454 break;
00455 case MODEL_START_STRAFE_RIGHT:
00456 StartAction("STRAFE_RIGHT");
00457 break;
00458 case MODEL_STOP_STREFA_RIGHT:
00459 StopAction("STRAFE_RIGHT");
00460 break;
00461 case MODEL_TOGGLE_VISIBLESTATE:
00462 SetVisibleState(!GetVisibleState());
00463
00464 break;
00465 case MODEL_HIDE:
00466 SetVisibleState(false);
00467
00468 break;
00469 case MODEL_SHOW:
00470 SetVisibleState(true);
00471
00472 break;
00473 case MODEL_TOGGLE_ALWAYS_DRAW:
00474 m_AlwaysDraw=!m_AlwaysDraw;
00475 break;
00476 case MODEL_ALWAYS_DRAW_ON:
00477 m_AlwaysDraw=true;
00478 break;
00479 case MODEL_ALWAYS_DRAW_OFF:
00480 m_AlwaysDraw=false;
00481 break;
00482
00483 }
00484 return NOTHING;
00485 }
00486
00487 void ExCModel3DS::Process(std::string Action)
00488 {
00489 Guard(void ExCModel3DS::Process(std::string Action))
00490 if(m_Angle.GetX()<0)m_Angle.SetX(359);
00491 if(m_Angle.GetX()>359)m_Angle.SetX(0);
00492 if(m_Angle.GetY()<0)m_Angle.SetY(359);
00493 if(m_Angle.GetY()>359)m_Angle.SetY(0);
00494 if(m_Angle.GetZ()<0)m_Angle.SetZ(359);
00495 if(m_Angle.GetZ()>359)m_Angle.SetZ(0);
00496
00497 if(Action=="RUN")
00498 {
00499
00500
00501
00502 }
00503 if(Action=="STRAFE_LEFT")
00504 {
00505 float angle;
00506 angle=m_Angle.GetY()+90;
00507 if(angle>360)angle=angle-360;
00508 m_Position=m_Position+ExCVec3D(Cos[(int)angle],0.0f,Sin[(int)angle]);
00509 return;
00510 }
00511 if(Action=="STRAFE_RIGHT")
00512 {
00513 float angle;
00514 angle=m_Angle.GetY()+90;
00515 if(angle>360)angle=angle-360;
00516 m_Position=m_Position-ExCVec3D(Cos[(int)angle],0.0f,Sin[(int)angle]);
00517 return;
00518 }
00519
00520 if(Action=="TURN_LEFT"){m_Angle.DecY(2);return;}
00521 if(Action=="TURN_RIGHT"){m_Angle.IncY(2);return;}
00522 if(Action=="LOOK_UP"){m_Angle.IncZ(2);return;}
00523 if(Action=="LOOK_DOWN"){m_Angle.DecZ(2);return;}
00524 if(Action=="X_UP"){m_Angle.IncX(2);return;}
00525 if(Action=="X_DOWN"){m_Angle.DecX(2);return;}
00526 if(Action=="JUMP")
00527 {
00528 if(m_CurrentFrames=72)
00529 {
00530 StopAction("JUMP");
00531 if(!IsAction("RUN")){StartAction("IDLE");}
00532 }
00533 }
00534 UnGuard
00535 }
00536 void ExCModel3DS::ProcessAllAction(void)
00537 {
00538 Guard(void ExCModel3DS::ProcessAllAction(void))
00539 for(unsigned int i=0;i< m_VecAction.size();i++)
00540 {
00541 Process(m_VecAction.at(i));
00542 }
00543 UnGuard
00544 }
00545
00546 void ExCModel3DS::StopAction(std::string Action)
00547 {
00548 Guard(void ExCModel3DS::StopAction(std::string Action))
00549 for(m_IVecAction= m_VecAction.begin();m_IVecAction!= m_VecAction.end();m_IVecAction++)
00550 {
00551 if(strcmp(m_IVecAction->data(),Action.data())==0)
00552 {
00553 m_VecAction.erase(m_IVecAction);
00554 return;
00555 }
00556 }
00557 UnGuard
00558 }
00559
00560 bool ExCModel3DS::IsAction(std::string Action)
00561 {
00562 Guard(bool ExCModel3DS::IsAction(std::string Action))
00563 for(m_IVecAction= m_VecAction.begin();m_IVecAction!= m_VecAction.end();m_IVecAction++)
00564 {
00565 if(strcmp(m_IVecAction->data(),Action.data())==0)
00566 {
00567 return true;
00568 }
00569 }
00570 return false;
00571 UnGuard
00572 }
00573 void ExCModel3DS::StartAction(std::string Action)
00574 {
00575 Guard(void ExCModel3DS::StartAction(std::string Action))
00576 m_VecAction.push_back(Action);
00577 m_CurrentAction=Action;
00578 UnGuard
00579 }
00580
00581
00582 bool ExCModel3DS::Load(std::string FileName)
00583 {
00584 Guard(bool ExCModel3DS::Load(std::string FileName))
00585
00586 m_VecObject= new std::vector<t3DObject> ;
00587 numOfObjects=0;
00588 numOfMaterials=0;
00589 m_VecMaterials.clear();
00590 m_VecObject->clear();
00591 HasList=false;
00592 unsigned int version=0;
00593 int buffer[50000] = {0};
00594 char bufferc[255];memset(bufferc,0,255);
00595
00596
00597 m_filePtr = fopen(FileName.data(), "rb");
00598 if (m_filePtr == NULL)
00599 {
00600 throw ExCExpFileNotFound();
00601 return false;
00602 }
00603 tChunk *chunk;
00604 chunk = new tChunk;
00605 ReadChunk(chunk);
00606
00607 if(chunk->ID==PRIMARY)
00608 {
00609
00610 m_CurrentChunk = new tChunk;
00611 while (chunk->bytesRead < chunk->length)
00612 {
00613 ReadChunk(m_CurrentChunk);
00614 switch(m_CurrentChunk->ID)
00615 {
00616 case FILEVERSION:
00617 m_CurrentChunk->bytesRead += fread(&version, 1,m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_filePtr);
00618
00619 break;
00620 case OBJECTINFO:
00621
00622 ReadObjectInfo(m_CurrentChunk);
00623 break;
00624 case EDITKEYFRAME:
00625
00626 Skip(m_CurrentChunk);
00627 break;
00628 default:
00629
00630 Skip(m_CurrentChunk);
00631 break;
00632 }
00633 chunk->bytesRead += m_CurrentChunk->bytesRead;
00634 }
00635 delete m_CurrentChunk;
00636 m_CurrentChunk = chunk;
00637 }
00638
00639 fclose(m_filePtr);
00640
00641 return true;
00642 UnGuard
00643 }
00644
00645 void ExCModel3DS::ReadObjectInfo(tChunk *chunk)
00646 {
00647 Guard(void ExCModel3DS::ReadObjectInfo(tChunk *chunk))
00648 int buffer[50000] = {0};
00649 char bufferc[255],b;
00650 std::string BuffObject;
00651 m_CurrentChunk = new tChunk;
00652 while (chunk->bytesRead < chunk->length)
00653 {
00654 ReadChunk(m_CurrentChunk);
00655 switch(m_CurrentChunk->ID)
00656 {
00657 case MATERIAL:
00658
00659 ReadObjectMaterial(m_CurrentChunk);
00660 break;
00661 case OBJECT:
00662 memset(bufferc,0,255);
00663
00664
00666 BuffObject.erase(BuffObject.begin(),BuffObject.end());
00667 do
00668 {
00669 m_CurrentChunk->bytesRead += fread(&b, 1, sizeof(char), m_filePtr);
00670 if(b!=0)BuffObject=BuffObject+b;
00671 }while(b!=0);
00672
00673 ReadObject(m_CurrentChunk);
00674 break;
00675 case MESH_VERSION:
00676
00677 Skip(m_CurrentChunk);
00678 break;
00679 case MASTER_SCALE:
00680
00681 Skip(m_CurrentChunk);
00682 break;
00683 default:
00684
00685 Skip(m_CurrentChunk);
00686 break;
00687 }
00688 chunk->bytesRead += m_CurrentChunk->bytesRead;
00689 }
00690 delete m_CurrentChunk;
00691 m_CurrentChunk = chunk;
00692 UnGuard
00693 }
00694 void ExCModel3DS::ReadObject(tChunk *chunk)
00695 {
00696 Guard(void ExCModel3DS::ReadObject(tChunk *chunk))
00697 int buffer[50000] = {0};
00698 t3DObject *pObject;
00699 pObject = new t3DObject;
00700 m_CurrentChunk = new tChunk;
00701 while (chunk->bytesRead < chunk->length)
00702 {
00703 ReadChunk(m_CurrentChunk);
00704 switch(m_CurrentChunk->ID)
00705 {
00706 case OBJECT_MESH:
00707
00708 ReadObject(m_CurrentChunk);
00709 break;
00710 case OBJECT_VERTICES:
00711
00712
00713 ReadVertices(pObject,m_CurrentChunk);
00714 break;
00715 case OBJECT_FACES:
00716
00717 ReadFace(pObject,m_CurrentChunk);
00718 break;
00719 case OBJECT_MATERIAL:
00720
00721
00722 ReadObjectMaterial(pObject,m_CurrentChunk);
00723 break;
00724 case OBJECT_UV:
00725
00726 ReadUVCoordinates(pObject,m_CurrentChunk);
00727 break;
00728 case OBJECT_MESH_MATRIX:
00729
00730 Skip(m_CurrentChunk);
00731 break;
00732 default:
00733
00734 Skip(m_CurrentChunk);
00735 break;
00736 }
00737 chunk->bytesRead += m_CurrentChunk->bytesRead;
00738 }
00739
00740 m_VecObject->push_back(*pObject);
00741 delete m_CurrentChunk;
00742 m_CurrentChunk = chunk;
00743 UnGuard
00744 }
00745
00746 void ExCModel3DS::ReadObjectMaterial(tChunk *chunk)
00747 {
00748 Guard(void ExCModel3DS::ReadObjectMaterial(tChunk *chunk))
00749 int buffer[50000] = {0};
00750 char bufferc[255];
00751 m_CurrentChunk = new tChunk;
00752 while (chunk->bytesRead < chunk->length)
00753 {
00754 ReadChunk(m_CurrentChunk);
00755 switch(m_CurrentChunk->ID)
00756 {
00757 case MATNAME:
00758 memset(bufferc,0,255);
00759 m_CurrentChunk->bytesRead += fread(bufferc, 1, m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_filePtr);
00760
00761 break;
00762 case MATAMBIENTCOLOR:
00763
00764 Skip(m_CurrentChunk);
00765 break;
00766 case MATDIFFUSE:
00767
00768 Skip(m_CurrentChunk);
00769 break;
00770 case MATSPECULAR:
00771
00772 Skip(m_CurrentChunk);
00773 break;
00774 case MATSHININESS:
00775
00776 Skip(m_CurrentChunk);
00777 break;
00778 case MATSHININESSSTR:
00779
00780 Skip(m_CurrentChunk);
00781 break;
00782 case MATTRANSPARENCY:
00783
00784 Skip(m_CurrentChunk);
00785 break;
00786 case MATTRANSFALLOFF:
00787
00788 Skip(m_CurrentChunk);
00789 break;
00790 case MATREFLECTBLUR:
00791
00792 Skip(m_CurrentChunk);
00793 break;
00794 case MATTWOSIDED:
00795
00796 Skip(m_CurrentChunk);
00797 break;
00798 case MATTRANSPARENCYADD:
00799
00800 Skip(m_CurrentChunk);
00801 break;
00802 case MATSELFILUM:
00803
00804 Skip(m_CurrentChunk);
00805 break;
00806 case MATWIREON:
00807
00808 Skip(m_CurrentChunk);
00809 break;
00810 case MATWIRETHICKNESS:
00811
00812 Skip(m_CurrentChunk);
00813 break;
00814 case MATFACEMAP:
00815
00816 Skip(m_CurrentChunk);
00817 break;
00818 case MATTRANSFALLOFFIN:
00819
00820 Skip(m_CurrentChunk);
00821 break;
00822 case MATSOFTEN:
00823
00824 Skip(m_CurrentChunk);
00825 break;
00826 case MAT3DWIRETHICKNESS:
00827
00828 Skip(m_CurrentChunk);
00829 break;
00830 case MATTYPE:
00831
00832 Skip(m_CurrentChunk);
00833 break;
00834 case MATMAP:
00835
00836 ReadObjectMaterial(m_CurrentChunk);
00837 break;
00838 case MATMAPFILE:
00839
00840 Skip(m_CurrentChunk);
00841 break;
00842 case MATMAPOPTION:
00843
00844 Skip(m_CurrentChunk);
00845 break;
00846 case MATMAPFILTERINGBLUR:
00847
00848
00849 Skip(m_CurrentChunk);
00850 break;
00851 default:
00852
00853 Skip(m_CurrentChunk);
00854 break;
00855 }
00856 chunk->bytesRead += m_CurrentChunk->bytesRead;
00857 }
00858 delete m_CurrentChunk;
00859 m_CurrentChunk = chunk;
00860 UnGuard
00861 }
00862
00863
00864
00865 void ExCModel3DS::ReadChunk(tChunk *chunk)
00866 {
00867 Guard(void ExCModel3DS::tChunk ReadChunk(tChunk *chunk))
00869 chunk->bytesRead = fread(&chunk->ID, 1, 2, m_filePtr);
00870 chunk->bytesRead += fread(&chunk->length, 1, 4, m_filePtr);
00874 UnGuard
00875 }
00876
00877 void ExCModel3DS::Skip(tChunk *chunk)
00878 {
00879 Guard(void ExCModel3DS::tChunk Skip(tChunk *chunk))
00880 int buffer[50000] = {0};
00882 chunk->bytesRead += fread(buffer, 1, chunk->length - chunk->bytesRead, m_filePtr);
00883 UnGuard
00884 }
00885
00886 void ExCModel3DS::ReadVertices(t3DObject *pObject,tChunk *chunk)
00887 {
00888 Guard(void ExCModel3DS::ReadVertices(t3DObject *pObject,tChunk *chunk))
00889 int buffer[50000] = {0};
00890
00891 unsigned short vert;
00892 chunk->bytesRead += fread(&vert, 1,sizeof(unsigned short), m_filePtr);
00893 pObject->numOfVerts=vert;
00895 float fl;
00896 ExCVec3D vec;
00897 for(int i=0;i<vert;i++)
00898 {
00899 chunk->bytesRead += fread(&fl, 1,sizeof(float), m_filePtr);
00900 vec.SetX(fl);
00901 chunk->bytesRead += fread(&fl, 1,sizeof(float), m_filePtr);
00902 vec.SetY(fl);
00903 chunk->bytesRead += fread(&fl, 1,sizeof(float), m_filePtr);
00904 vec.SetZ(fl);
00906 pObject->Verts.push_back(vec);
00907 }
00908 Skip(chunk);
00909 UnGuard
00910 }
00911
00912 void ExCModel3DS::ReadFace(t3DObject *pObject,tChunk *chunk)
00913 {
00914 Guard(void ExCModel3DS::ReadFace(t3DObject *pObject,tChunk *chunk))
00915 int buffer[50000] = {0};
00916
00917 tFace stFace;
00918 unsigned short face,index;
00919 chunk->bytesRead += fread(&face, 1,sizeof(unsigned short), m_filePtr);
00920 pObject->numOfFaces=face;
00922
00923
00924 for(int i = 0; i <face; i++)
00925 {
00926
00927
00928 for(int j = 0; j < 4; j++)
00929 {
00930
00931 chunk->bytesRead += fread(&index, 1, sizeof(unsigned short), m_filePtr);
00932
00933 if(j < 3)
00934 {
00935
00936
00937 stFace.vertIndex[j]=index;
00938 }
00939 }
00941 pObject->Faces.push_back(stFace);
00942 }
00943 char b=0;
00944 std::string Material;
00945 m_CurrentChunk = new tChunk;
00946 while (chunk->bytesRead < chunk->length)
00947 {
00948 ReadChunk(m_CurrentChunk);
00949 switch(m_CurrentChunk->ID)
00950 {
00951 case OBJECT_MATERIAL:
00952
00953 do
00954 {
00955 m_CurrentChunk->bytesRead += fread(&b, 1, sizeof(char), m_filePtr);
00956 if(b!=0)Material=Material+b;
00957 }while(b!=0);
00959 pObject->Material=Material;
00960
00961 ManagerTexture->Load(Material);
00962 Skip(m_CurrentChunk);
00963 break;
00964 case OBJECT_SMOOTH_GROUP:
00965
00966 Skip(m_CurrentChunk);
00967 break;
00968 default:
00969
00970 Skip(m_CurrentChunk);
00971 break;
00972 }
00973 chunk->bytesRead += m_CurrentChunk->bytesRead;
00974 }
00975 delete m_CurrentChunk;
00976 m_CurrentChunk = chunk;
00977
00978
00979
00980 UnGuard
00981 }
00982
00983 void ExCModel3DS::ReadUVCoordinates(t3DObject *pObject,tChunk *chunk)
00984 {
00985 Guard(void ExCModel3DS::ReadUVCoordinates(t3DObject *pObject,tChunk *chunk))
00986 int buffer[50000] = {0};
00987
00988 unsigned short vert;
00989 chunk->bytesRead += fread(&vert, 1,sizeof(unsigned short), m_filePtr);
00990 pObject->numTexVertex=vert;
00992 float fl;
00993 ExCVec2D vec;
00994 for(int i=0;i<vert;i++)
00995 {
00996 chunk->bytesRead += fread(&fl, 1,sizeof(float), m_filePtr);
00997 vec.SetX(fl);
00998 chunk->bytesRead += fread(&fl, 1,sizeof(float), m_filePtr);
00999 vec.SetY(fl);
01001 pObject->TexVerts.push_back(vec);
01002 }
01003 Skip(chunk);
01004 UnGuard
01005 }
01006
01007 void ExCModel3DS::ReadObjectMaterial(t3DObject *pObject,tChunk *chunk)
01008 {
01009 Guard(void ExCModel3DS::ReadObjectMaterial(tChunk *chunk))
01010 char b=0;
01011 std::string Material;
01012 do
01013 {
01014 chunk->bytesRead += fread(&b, 1, sizeof(char), m_filePtr);
01015 Material=Material+b;
01016 }while(b!=0);
01017
01018 Skip(chunk);
01019 UnGuard
01020 }