Page principale | Liste des namespaces | Hiérarchie des classes | Liste par ordre alphabétique | Liste des composants | Liste des fichiers | Membres des namespaces | Composants | Déclarations

ExCModel3DS.cpp

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

Généré le Tue Oct 28 12:43:31 2003 pour ExNihilo par doxygen 1.3.4