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 "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
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);
00054 m_GlSkyBoxListId=glGenLists(1);
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
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
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
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
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
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
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
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167 UnGuard
00168 }
00169
00170 void ExCMap::Draw(void)
00171 {
00172 Guard(void ExMap::Draw(void))
00173
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
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
00230
00231 UnGuard
00232 }
00233
00234 void ExCMap::BuildVertexArrays(void)
00235 {
00236 Guard(void ExMap::BuildVertexArrays(void))
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281 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
00306 memset(b,0,255);fin.getline(b,256,'\n');
00307 buffstring=ExNihilo::ExtracValueFromSring(b,"<filetype>","<#filetype>");
00308
00309 memset(b,0,255);fin.getline(b,256,'\n');
00310 m_STextureBoxNameTop=ExNihilo::ExtracValueFromSring(b,"<skybox_top>","<#skybox_top>");
00311
00312 memset(b,0,255);fin.getline(b,256,'\n');
00313 m_STextureBoxNameBottom=ExNihilo::ExtracValueFromSring(b,"<skybox_bottom>","<#skybox_bottom>");
00314
00315 memset(b,0,255);fin.getline(b,256,'\n');
00316 m_STextureBoxNameFront=ExNihilo::ExtracValueFromSring(b,"<skybox_front>","<#skybox_front>");
00317
00318 memset(b,0,255);fin.getline(b,256,'\n');
00319 m_STextureBoxNameBack=ExNihilo::ExtracValueFromSring(b,"<skybox_back>","<#skybox_back>");
00320
00321 memset(b,0,255);fin.getline(b,256,'\n');
00322 m_STextureBoxNameLeft=ExNihilo::ExtracValueFromSring(b,"<skybox_left>","<#skybox_left>");
00323
00324 memset(b,0,255);fin.getline(b,256,'\n');
00325 m_STextureBoxNameRight=ExNihilo::ExtracValueFromSring(b,"<skybox_right>","<#skybox_right>");
00326
00327
00328
00329 memset(b,0,255);fin.getline(b,256,'\n');
00330 m_NumberVertex=ExNihilo::ExtractIntValueFromSring(b,"<number_vertex>","<#number_vertex>");
00331
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
00345 }
00346
00347 memset(b,0,255);fin.getline(b,256,'\n');
00348 m_NumberMesh=ExNihilo::ExtractIntValueFromSring(b,"<number_mesh>","<#number_mesh>");
00349
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
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 }