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  

ExCMap.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: ExCMap.cpp,v 1.20 2002/11/24 11:59:00 data Exp $
00021  *
00022  */
00023 
00024 #include "ExCMap.h"
00025 
00026 ExCMap::ExCMap(void)
00027 {
00028         m_ShowSkybox=true;
00029         m_ShowMesh=true;
00030         m_OctreeState=false;
00031         m_ShowOctreeSubdivision=false;
00032 #ifdef UNIX_SRC
00033         // This is very awfull but it segfault without it
00034         m_VecMesh.reserve (1000);
00035         m_VecVertex.reserve (1000);
00036 #endif
00037         m_STextureBoxNameTop="SkySpace_Top.tga";
00038         m_STextureBoxNameBottom="SkySpace_Bottom.tga";
00039         m_STextureBoxNameFront="SkySpace_Front.tga";
00040         m_STextureBoxNameBack="SkySpace_Back.tga";
00041         m_STextureBoxNameLeft="SkySpace_Left.tga";
00042         m_STextureBoxNameRight="SkySpace_Right.tga";
00043 }
00044 
00045 ExCMap::~ExCMap(void)
00046 {
00047 }
00048 
00049 void ExCMap::BuildSkyBox(void)
00050 {
00051 Guard(void ExMap::BuildSkyBox(void))
00052                 
00053                 glDeleteLists(m_GlSkyBoxListId,1);      //delete old list
00054                 m_GlSkyBoxListId=glGenLists(1); //Ask for a new free list
00055                 glNewList(m_GlSkyBoxListId,GL_COMPILE);
00056 
00057                 glEnable(GL_TEXTURE_2D);
00058                 glDisable(GL_LIGHTING);
00059                 ManagerTexture->SetCurrentObject(m_STextureBoxNameFront);
00060                 glBegin(GL_QUADS);
00061                         // Front Face
00062                         glColor4f(1, 1, 1, 1);
00063                         glTexCoord2f(1.0f, 1.0f); glVertex3d(-10000.0f,  10000.0f,  10000.0f);
00064                         glTexCoord2f(0.0f, 1.0f); glVertex3d( 10000.0f,  10000.0f,  10000.0f);
00065                         glTexCoord2f(0.0f, 0.0f); glVertex3d( 10000.0f, -10000.0f,  10000.0f);
00066                         glTexCoord2f(1.0f, 0.0f); glVertex3d(-10000.0f, -10000.0f,  10000.0f);
00067                 glEnd();
00068                 ManagerTexture->SetCurrentObject(m_STextureBoxNameBack);
00069                 glBegin(GL_QUADS);
00070                         // Back Face
00071                         glTexCoord2f(1.0f, 0.0f); glVertex3d( 10000.0f, -10000.0f, -10000.0f);
00072                         glTexCoord2f(1.0f, 1.0f); glVertex3d( 10000.0f,  10000.0f, -10000.0f);
00073                         glTexCoord2f(0.0f, 1.0f); glVertex3d(-10000.0f,  10000.0f, -10000.0f);
00074                         glTexCoord2f(0.0f, 0.0f); glVertex3d(-10000.0f, -10000.0f, -10000.0f);
00075                 glEnd();
00076                 ManagerTexture->SetCurrentObject(m_STextureBoxNameTop);
00077                 glBegin(GL_QUADS);
00078                         // Top Face
00079                         glTexCoord2f(0.0f, 1.0f); glVertex3d( 10000.0f,  10000.0f, -10000.0f);
00080                         glTexCoord2f(0.0f, 0.0f); glVertex3d( 10000.0f,  10000.0f,  10000.0f);
00081                         glTexCoord2f(1.0f, 0.0f); glVertex3d(-10000.0f,  10000.0f,  10000.0f);
00082                         glTexCoord2f(1.0f, 1.0f); glVertex3d(-10000.0f,  10000.0f, -10000.0f);
00083                 glEnd();
00084                 ManagerTexture->SetCurrentObject(m_STextureBoxNameBottom);
00085                 glBegin(GL_QUADS);
00086                         // Bottom Face
00087             glTexCoord2f(1.0f, 1.0f); glVertex3d(-10000.0f, -10000.0f,  10000.0f);
00088                         glTexCoord2f(0.0f, 1.0f); glVertex3d( 10000.0f, -10000.0f,  10000.0f);
00089                         glTexCoord2f(0.0f, 0.0f); glVertex3d( 10000.0f, -10000.0f, -10000.0f);
00090                         glTexCoord2f(1.0f, 0.0f); glVertex3d(-10000.0f, -10000.0f, -10000.0f);
00091                 glEnd();
00092                 ManagerTexture->SetCurrentObject(m_STextureBoxNameRight);
00093                 glBegin(GL_QUADS);
00094                         // Right face
00095                         glTexCoord2f(1.0f, 0.0f); glVertex3d( 10000.0f, -10000.0f,  10000.0f);
00096                         glTexCoord2f(1.0f, 1.0f); glVertex3d( 10000.0f,  10000.0f,  10000.0f);
00097                         glTexCoord2f(0.0f, 1.0f); glVertex3d( 10000.0f,  10000.0f, -10000.0f);
00098                         glTexCoord2f(0.0f, 0.0f); glVertex3d( 10000.0f, -10000.0f, -10000.0f);
00099                 glEnd();
00100                 ManagerTexture->SetCurrentObject(m_STextureBoxNameLeft);
00101                 glBegin(GL_QUADS);
00102                 // Left Face
00103                         glTexCoord2f(1.0f, 1.0f); glVertex3d(-10000.0f,  10000.0f, -10000.0f);
00104                         glTexCoord2f(0.0f, 1.0f); glVertex3d(-10000.0f,  10000.0f,  10000.0f);
00105                         glTexCoord2f(0.0f, 0.0f); glVertex3d(-10000.0f, -10000.0f,  10000.0f);
00106                         glTexCoord2f(1.0f, 0.0f); glVertex3d(-10000.0f, -10000.0f, -10000.0f);
00107 
00108                 glEnd();
00109                 glDisable(GL_TEXTURE_2D);
00110                 glEnable(GL_LIGHTING);
00111 
00112                 glEndList();
00113 UnGuard
00114 }
00115 
00116 void ExCMap::DrawAllMesh(void)
00117 {
00118 Guard(void ExMap::DrawAllMesh(void))
00119         glCallList(m_GlListId);
00120 UnGuard
00121 }
00122 
00123 void ExCMap::DrawMeshInFrustrum(void)
00124 {
00125 Guard(void ExMap::DrawMeshInFrustrum(void))
00126         //DrawAllMesh();
00127         //m_Octree.Draw();
00128         /*Frustrum.CalculateFrustum();
00129         glColor3f(1.0f, 1.0f, 1.0f);
00130         glDisable(GL_LIGHTING);
00131         glEnable(GL_TEXTURE_2D);
00132         int i=0;
00133         int pointinfrustrum=0;
00134 
00135         for(m_ItVecMesh=m_VecMesh.begin();m_ItVecMesh!=m_VecMesh.end();++m_ItVecMesh)
00136         {
00137                 ManagerTexture->SetCurrentObject(m_ItVecMesh->GetMaterial());
00138                 if(Frustrum.PointInFrustum(m_ItVecMesh->A.GetX(),m_ItVecMesh->A.GetY(),m_ItVecMesh->A.GetZ()))
00139                 {
00140                         pointinfrustrum++;
00141                 }
00142                 if(Frustrum.PointInFrustum(m_ItVecMesh->B.GetX(),m_ItVecMesh->B.GetY(),m_ItVecMesh->B.GetZ()))
00143                 {
00144                         pointinfrustrum++;
00145                 }
00146                 if(Frustrum.PointInFrustum(m_ItVecMesh->C.GetX(),m_ItVecMesh->C.GetY(),m_ItVecMesh->C.GetZ()))
00147                 {
00148                         pointinfrustrum++;
00149                 }
00150                 
00151                 if(pointinfrustrum>1)
00152                 {
00153                         glBegin(GL_TRIANGLES);
00154                                 glTexCoord2f(m_ItVecMesh->A.GetU(), m_ItVecMesh->A.GetV());
00155                                 glVertex3f(m_ItVecMesh->A.GetX(),m_ItVecMesh->A.GetY(),m_ItVecMesh->A.GetZ());
00156                                 glTexCoord2f(m_ItVecMesh->B.GetU(), m_ItVecMesh->B.GetV());
00157                                 glVertex3f(m_ItVecMesh->B.GetX(),m_ItVecMesh->B.GetY(),m_ItVecMesh->B.GetZ());
00158                                 glTexCoord2f(m_ItVecMesh->C.GetU(), m_ItVecMesh->C.GetV());
00159                                 glVertex3f(m_ItVecMesh->C.GetX(),m_ItVecMesh->C.GetY(),m_ItVecMesh->C.GetZ());
00160                         glEnd();
00161                 }
00162                 i++;
00163                 pointinfrustrum=0;
00164         }       
00165         glEnable(GL_LIGHTING);
00166         glDisable(GL_TEXTURE_2D);*/
00167 UnGuard
00168 }
00169 
00170 void ExCMap::Draw(void)
00171 {
00172 Guard(void ExMap::Draw(void))
00173         //if(m_ShowSkybox)glCallList(m_GlSkyBoxListId);
00174         glCallList(m_GlSkyBoxListId);
00175         glPushMatrix();
00176         glRotatef(-90,1.0f,0.0f,0.0f);
00177         if(m_ShowMesh)
00178         {                                                  
00179                 if(m_OctreeState)
00180                 {
00181                         DrawMeshInFrustrum();   
00182                 }else
00183                 {
00184                         DrawAllMesh();
00185                 }
00186         }
00187         glPopMatrix();
00188 
00189 UnGuard
00190 }
00191 
00192 void ExCMap::BuilList(void)
00193 {
00194 Guard(void ExMap::BuilList(void))
00195         m_GlListId=glGenLists(1);
00196         glNewList(m_GlListId,GL_COMPILE);
00197                 glColor3f(1.0f, 1.0f, 1.0f);
00198                 glDisable(GL_LIGHTING);
00199                 glEnable(GL_TEXTURE_2D);
00200                 int i=0;
00201                 
00202                 for(m_ItVecMesh=m_VecMesh.begin();m_ItVecMesh!=m_VecMesh.end();++m_ItVecMesh)
00203                 {
00204                         ManagerTexture->SetCurrentObject(m_ItVecMesh->GetMaterial());
00205                         glBegin(GL_TRIANGLES);
00206                         glTexCoord2f(m_ItVecMesh->A.GetU(), m_ItVecMesh->A.GetV());
00207                         glVertex3f(m_ItVecMesh->A.GetX(),m_ItVecMesh->A.GetY(),m_ItVecMesh->A.GetZ());
00208                         glTexCoord2f(m_ItVecMesh->B.GetU(), m_ItVecMesh->B.GetV());
00209                         glVertex3f(m_ItVecMesh->B.GetX(),m_ItVecMesh->B.GetY(),m_ItVecMesh->B.GetZ());
00210                         glTexCoord2f(m_ItVecMesh->C.GetU(), m_ItVecMesh->C.GetV());
00211                         glVertex3f(m_ItVecMesh->C.GetX(),m_ItVecMesh->C.GetY(),m_ItVecMesh->C.GetZ());
00212                         glEnd();
00213                         i++;
00214                 }
00215                 
00216                 glEnable(GL_LIGHTING);
00217                 glDisable(GL_TEXTURE_2D);
00218         glEndList();
00219         //delete data because they are now in list
00220         m_VecVertex.clear();
00221         m_VecMesh.clear();
00222 UnGuard
00223 }
00224 
00225 
00226 void ExCMap::BuildOctree(void)
00227 {
00228 Guard(void ExMap::BuildOctree(void))
00229         //m_Octree.SetManagerTexture(ManagerTexture);
00230         //m_Octree.Build(m_VecMesh);
00231 UnGuard
00232 }
00233 
00234 void ExCMap::BuildVertexArrays(void)
00235 {
00236 Guard(void ExMap::BuildVertexArrays(void))
00237         /*int i=0;
00238         float   *g_vertexArray;    // vertex array
00239         //float   *g_colorArray;     // color array
00240         float   *g_texcoordArray;  // texture array
00241 
00242         g_vertexArray= new float[m_VecMesh.size()*3][3];
00243         //g_colorArray=  new float[m_VecMesh.size()*3][3];
00244         g_texcoordArray= new float[m_VecMesh.size()*3][2];
00245 
00246         for(m_ItVecMesh=m_VecMesh.begin();m_ItVecMesh!=m_VecMesh.end();++m_ItVecMesh)
00247         {
00248                 //ManagerTexture->SetActiveTexture(m_ItVecMesh->GetMaterial());
00249                 
00250                 g_texcoordArray[i][0]=m_ItVecMesh->A.GetU(); 
00251                 g_texcoordArray[i][1]=m_ItVecMesh->A.GetV();
00252 
00253                 g_vertexArray[i][0]=m_ItVecMesh->A.GetX();
00254                 g_vertexArray[i][0]=m_ItVecMesh->A.GetY();
00255                 g_vertexArray[i][0]=m_ItVecMesh->A.GetZ();
00256                 
00257                 g_texcoordArray[i+1][0]=m_ItVecMesh->B.GetU();
00258                 g_texcoordArray[i+1][1]=m_ItVecMesh->B.GetV();
00259                 
00260                 g_vertexArray[i+1][0]=m_ItVecMesh->B.GetX();
00261                 g_vertexArray[i+1][0]=m_ItVecMesh->B.GetY();
00262                 g_vertexArray[i+1][0]=m_ItVecMesh->B.GetZ();
00263 
00264                 g_texcoordArray[i+2][0]=m_ItVecMesh->C.GetU();
00265                 g_texcoordArray[i+2][1]=m_ItVecMesh->C.GetV();
00266                 
00267                 g_vertexArray[i+2][0]=m_ItVecMesh->C.GetX();
00268                 g_vertexArray[i+2][0]=m_ItVecMesh->C.GetY();
00269                 g_vertexArray[i+2][0]=m_ItVecMesh->C.GetZ();
00270                 
00271                 i++;
00272         }
00273         // enable the vertex arrays being used
00274         glEnableClientState(GL_VERTEX_ARRAY);
00275         //glEnableClientState(GL_COLOR_ARRAY);
00276         glEnableClientState(GL_TEXTURE_COORD_ARRAY);
00277           // pass the pointers to OpenGL
00278         glVertexPointer(3, GL_FLOAT, 0, g_vertexArray);
00279         //glColorPointer(3, GL_FLOAT, 0, g_colorArray);
00280         glTexCoordPointer(2, GL_FLOAT, 0, g_texcoordArray);*/
00281 UnGuard
00282 }
00283 
00284 bool ExCMap::LoadMap(const char *FileName)
00285 {
00286 Guard(void ExCMap::LoadMap(const char *FileName))
00287         
00288         char                    buffer[255];
00289         ExCVertex               VertexBuff;
00290         ExCMesh                 MeshBuff;
00291 
00292         #ifdef UNIX_SRC
00293                 sprintf(buffer, PREFIX "/ExNihilo/Data/Map/%s", FileName);
00294         #else
00295                 sprintf(buffer, "../Data/Map/%s", FileName);
00296         #endif
00297         
00298         std::ifstream fin;
00299         std::string buffstring;
00300 
00301         char b[256];
00302         fin.open(buffer,std::ios::in);
00303         if(fin.is_open())
00304         {
00305                         //read file type
00306                         memset(b,0,255);fin.getline(b,256,'\n');
00307                         buffstring=ExNihilo::ExtracValueFromSring(b,"<filetype>","<#filetype>");
00308                         //read skybox_top
00309                         memset(b,0,255);fin.getline(b,256,'\n');
00310                         m_STextureBoxNameTop=ExNihilo::ExtracValueFromSring(b,"<skybox_top>","<#skybox_top>");
00311                         //read skybox_bottom
00312                         memset(b,0,255);fin.getline(b,256,'\n');
00313                         m_STextureBoxNameBottom=ExNihilo::ExtracValueFromSring(b,"<skybox_bottom>","<#skybox_bottom>");
00314                         //read skybox_front
00315                         memset(b,0,255);fin.getline(b,256,'\n');
00316                         m_STextureBoxNameFront=ExNihilo::ExtracValueFromSring(b,"<skybox_front>","<#skybox_front>");
00317                         //read skybox_back
00318                         memset(b,0,255);fin.getline(b,256,'\n');
00319                         m_STextureBoxNameBack=ExNihilo::ExtracValueFromSring(b,"<skybox_back>","<#skybox_back>");
00320                         //read skybox_left
00321                         memset(b,0,255);fin.getline(b,256,'\n');
00322                         m_STextureBoxNameLeft=ExNihilo::ExtracValueFromSring(b,"<skybox_left>","<#skybox_left>");
00323                         //read skybox_right
00324                         memset(b,0,255);fin.getline(b,256,'\n');
00325                         m_STextureBoxNameRight=ExNihilo::ExtracValueFromSring(b,"<skybox_right>","<#skybox_right>");
00326                 
00327         
00328                         //read number vertex
00329                         memset(b,0,255);fin.getline(b,256,'\n');
00330                         m_NumberVertex=ExNihilo::ExtractIntValueFromSring(b,"<number_vertex>","<#number_vertex>");
00331                         //read vertex
00332                         for(int i=0;i<m_NumberVertex;i++)
00333                         {
00334                                 memset(b,0,255);fin.getline(b,256,'\n');
00335                                 
00336                                 buffstring.erase(buffstring.begin(),buffstring.end());
00337                                 buffstring=ExNihilo::ExtracValueFromSring(b,"<vertex_data>","<#vertex_data>");
00338                                 VertexBuff.SetX(ExNihilo::ExtractFloatValueFromSring(buffstring,"<X>","<#X>"));
00339                                 VertexBuff.SetY(ExNihilo::ExtractFloatValueFromSring(buffstring,"<Y>","<#Y>"));
00340                                 VertexBuff.SetZ(ExNihilo::ExtractFloatValueFromSring(buffstring,"<Z>","<#Z>"));
00341                                 VertexBuff.SetU(ExNihilo::ExtractFloatValueFromSring(buffstring,"<U>","<#U>"));
00342                                 VertexBuff.SetV(ExNihilo::ExtractFloatValueFromSring(buffstring,"<V>","<#V>"));
00343                                 m_VecVertex.push_back(VertexBuff);
00344                                 //std::cout<<i<<"of"<<m_NumberVertex<<std::endl;
00345                         }
00346                         //read number mesh
00347                         memset(b,0,255);fin.getline(b,256,'\n');
00348                         m_NumberMesh=ExNihilo::ExtractIntValueFromSring(b,"<number_mesh>","<#number_mesh>");
00349                         //read mesh
00350                         for(int i=0;i<m_NumberMesh;i++)
00351                         {
00352                                 memset(b,0,255);
00353                                 fin.getline(b,256,'\n');
00354                                 buffstring.erase(buffstring.begin(),buffstring.end());
00355                                 buffstring=ExNihilo::ExtracValueFromSring(b,"<mesh_data>","<#mesh_data>");
00356         
00357 
00358                                 MeshBuff.A=m_VecVertex.at(ExNihilo::ExtractIntValueFromSring(buffstring,"<A>","<#A>"));
00359                                 MeshBuff.B=m_VecVertex.at(ExNihilo::ExtractIntValueFromSring(buffstring,"<B>","<#B>"));
00360                                 MeshBuff.C=m_VecVertex.at(ExNihilo::ExtractIntValueFromSring(buffstring,"<C>","<#C>"));
00361 
00362                                 MeshBuff.m_AB=ExNihilo::ExtractIntValueFromSring(buffstring,"<AB>","<#AB>");
00363                                 MeshBuff.m_CA=ExNihilo::ExtractIntValueFromSring(buffstring,"<CA>","<#CA>");
00364                                 MeshBuff.m_BC=ExNihilo::ExtractIntValueFromSring(buffstring,"<BC>","<#BC>");
00365 
00366                                 MeshBuff.SetMaterial(ExNihilo::ExtracValueFromSring(buffstring,"<texture>","<#texture>").data());
00367                                 
00368                                 ManagerTexture->Add(MeshBuff.GetMaterial());
00369                                 MeshBuff.m_Smoothing=ExNihilo::ExtractIntValueFromSring(buffstring,"<smothing>","<#smothing>");
00370                                 
00371                                 MeshBuff.m_MeshNumber=i;
00372                                 
00373                                 m_VecMesh.push_back(MeshBuff);
00374                                 //std::cout<<i<<"of"<<m_NumberMesh<<std::endl;
00375                                 
00376                         
00377                         }
00378                 fin.close();
00379                 
00380         }else throw   ExCExpFileNotFound();
00381 
00382 
00383 
00384         ManagerTexture->Load(m_STextureBoxNameTop);
00385         ManagerTexture->SetCurrentObject(m_STextureBoxNameTop);
00386         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
00387         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
00388         ManagerTexture->Load(m_STextureBoxNameBottom);
00389         ManagerTexture->SetCurrentObject(m_STextureBoxNameBottom);
00390         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
00391         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
00392         ManagerTexture->Load(m_STextureBoxNameFront);
00393         ManagerTexture->SetCurrentObject(m_STextureBoxNameFront);
00394         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
00395         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
00396         ManagerTexture->Load(m_STextureBoxNameBack);
00397         ManagerTexture->SetCurrentObject(m_STextureBoxNameBack);
00398         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
00399         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
00400         ManagerTexture->Load(m_STextureBoxNameLeft);
00401         ManagerTexture->SetCurrentObject(m_STextureBoxNameLeft);
00402         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
00403         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
00404         ManagerTexture->Load(m_STextureBoxNameRight);
00405         ManagerTexture->SetCurrentObject(m_STextureBoxNameRight);
00406         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
00407         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
00408         
00409 
00410         BuildSkyBox();
00411         BuilList();
00412         *Consol<<FileName<<" map file loaded with "<<m_NumberVertex<<" vertex and "<<m_NumberMesh<<" faces"<<std::endl;
00413 
00414         return true;
00415 
00416 UnGuard 
00417 }

Généré le Tue Dec 10 18:18:09 2002 pour ExNihilo par doxygen1.3-rc1