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 "ExManagerFog.h"
00025
00026 bool ExManagerFog::m_flag = false;
00027 ExManagerFog* ExManagerFog::m_instance = NULL;
00028
00029 ExManagerFog* ExManagerFog::CreateSingleton(void){
00030 Guard(ExManagerFog* ExManagerFog::CreateSingleton(void))
00031 if(!m_flag)
00032 {
00033 m_flag = true;
00034 m_instance = new ExManagerFog;
00035 }else
00036 {
00037 std::cout<<"Error singleton already created"<<std::endl;
00038 }
00039 return m_instance;
00040 UnGuard
00041 }
00042
00043 ExManagerFog::ExManagerFog(void)
00044 {
00045 Guard(ExManagerFog::ExManagerFog(void))
00046 Reset();
00047 UnGuard
00048 }
00049
00050 ExManagerFog::~ExManagerFog(void)
00051 {
00052 Guard(ExManagerFog::~ExManagerFog(void))
00053 UnGuard
00054 }
00055
00056 void ExManagerFog::Init(void)
00057 {
00058 Guard(ExManagerFog::Init(void))
00059 glFogCoordfEXT = NULL;
00060
00061 char *blah = (char *) glGetString(GL_EXTENSIONS);
00062
00063
00064
00065 if (strstr( (const char *)blah, "GL_EXT_fog_coord" ))
00066 {
00067 glFogCoordfEXT = (PFNGLFOGCOORDFEXTPROC) wglGetProcAddress("glFogCoordfEXT");
00068 *Consol<<"ExManagerFog::glFogCoordfEXT found and enable"<<std::endl;
00069 }else
00070 {
00071 *Consol<<"ExManagerFog::OpenGl glFogCoordfEXT extension missing"<<std::endl;
00072 }
00073 UnGuard
00074 }
00075
00076 void ExManagerFog::Reset(void)
00077 {
00078 Guard(ExManagerFog::Reset(void))
00079 SetAlgo(GL_LINEAR);
00080 SetFogColor(0.8f,0.8f,0.8f,1.0f);
00081 SetStartPoint(100.0f);
00082 SetEndPoint(300.0f);
00083 SetDensity(0.50);
00084 m_State=false;
00085 DisableFog();
00086 UnGuard
00087 }
00088
00089 void ExManagerFog::Draw(void)
00090 {
00091 Guard(ExManagerFog::Draw(void))
00092 EnableFog();
00093 glPushAttrib(GL_ALL_ATTRIB_BITS);
00094 glColor3f(0.0f,0.0f,0.5f);
00095 glBegin(GL_QUADS);
00096 glFogCoordfEXT( 0.0f); glVertex3f(-100.0f,-100.0f,-100.0f);
00097 glFogCoordfEXT( 0.0f); glVertex3f( 100.0f,-100.0f,-100.0f);
00098 glFogCoordfEXT( 0.0f); glVertex3f( 100.0f, 100.0f,-100.0f);
00099 glFogCoordfEXT( 0.0f); glVertex3f(-100.0f, 100.0f,-100.0f);
00100 glEnd();
00101
00102 glBegin(GL_QUADS);
00103 glFogCoordfEXT( 0.0f); glVertex3f(-100.0f,-100.0f,-100.0f);
00104 glFogCoordfEXT( 0.0f); glVertex3f( 100.0f,-100.0f,-100.0f);
00105 glFogCoordfEXT( 1.0f); glVertex3f( 100.0f,-100.0f, 100.0f);
00106 glFogCoordfEXT( 1.0f); glVertex3f(-100.0f,-100.0f, 100.0f);
00107 glEnd();
00108
00109 glBegin(GL_QUADS);
00110 glFogCoordfEXT( 0.0f); glVertex3f(-100.0f, 100.0f,-100.0f);
00111 glFogCoordfEXT( 0.0f); glVertex3f( 100.0f, 100.0f,-100.0f);
00112 glFogCoordfEXT( 1.0f); glVertex3f( 100.0f, 100.0f, 100.0f);
00113 glFogCoordfEXT( 1.0f); glVertex3f(-100.0f, 100.0f, 100.0f);
00114 glEnd();
00115
00116 glBegin(GL_QUADS);
00117 glFogCoordfEXT( 1.0f); glVertex3f( 100.0f,-100.0f, 100.0f);
00118 glFogCoordfEXT( 1.0f); glVertex3f( 100.0f, 100.0f, 100.0f);
00119 glFogCoordfEXT( 0.0f); glVertex3f( 100.0f, 100.0f,-100.0f);
00120 glFogCoordfEXT( 0.0f); glVertex3f( 100.0f,-100.0f,-100.0f);
00121 glEnd();
00122
00123 glBegin(GL_QUADS);
00124 glFogCoordfEXT( 1.0f); glVertex3f(-100.0f,-100.0f, 100.0f);
00125 glFogCoordfEXT( 1.0f); glVertex3f(-100.0f, 100.0f, 100.0f);
00126 glFogCoordfEXT( 0.0f); glVertex3f(-100.0f, 100.0f,-100.0f);
00127 glFogCoordfEXT( 0.0f); glVertex3f(-100.0f,-100.0f,-100.0f);
00128 glEnd();
00129
00130 glPopAttrib();
00131 DisableFog();
00132 UnGuard
00133 }
00134
00135 void ExManagerFog::SetVolumetricFogCoord(GLfloat Value)
00136 {
00137 Guard(ExManagerFog::SetVolumetricFogCoord(GLfloat Value))
00138
00139 glFogCoordfEXT(Value);
00140 UnGuard
00141 }
00142
00143 void ExManagerFog::EnableFog(void)
00144 {
00145 Guard(ExManagerFog::EnableFog(void))
00146 m_State=true;
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166 float fogColor[4] = {0.8f, 0.8f, 0.8f, 1.0f};
00167
00168 glEnable(GL_FOG);
00169 glFogi(GL_FOG_MODE, GL_LINEAR);
00170 glFogfv(GL_FOG_COLOR, fogColor);
00171 glFogf(GL_FOG_START, 0.0);
00172 glFogf(GL_FOG_END, 50.0);
00173 glHint(GL_FOG_HINT, GL_NICEST);
00174
00175
00176
00177
00178
00179 glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT);
00180
00181 UnGuard
00182 }
00183
00184 void ExManagerFog::DisableFog(void)
00185 {
00186 Guard(ExManagerFog::DisableFog(void))
00187 glDisable(GL_FOG);
00188 m_State=false;
00189 UnGuard
00190 }
00191
00192
00193 void ExManagerFog::SetFogColor(float R,float G,float B,float A)
00194 {
00195 Guard(ExManagerFog::SetFogColor(float R,float G,float B,float A))
00196 SetFogColorR(R);
00197 SetFogColorG(G);
00198 SetFogColorB(B);
00199 SetFogColorA(A);
00200 UnGuard
00201 }
00202
00203 void ExManagerFog::SetFogColorR(float R)
00204 {
00205 Guard(ExManagerFog::SetFogColorR(float R))
00206 if(R>1.0f)R=1.0f;
00207 if(R<0.0f)R=0.0f;
00208 m_FogColor[0]=R;
00209 glFogfv(GL_FOG_COLOR,m_FogColor);
00210 UnGuard
00211 }
00212
00213 void ExManagerFog::SetFogColorG(float G)
00214 {
00215 Guard(ExManagerFog::SetFogColorG(float G))
00216 if(G>1.0f)G=1.0f;
00217 if(G<0.0f)G=0.0f;
00218 m_FogColor[1]=G;
00219 glFogfv(GL_FOG_COLOR,m_FogColor);
00220 UnGuard
00221 }
00222
00223 void ExManagerFog::SetFogColorB(float B)
00224 {
00225 Guard(ExManagerFog::SetFogColorB(float B))
00226 if(B>1.0f)B=1.0f;
00227 if(B<0.0f)B=0.0f;
00228 m_FogColor[2]=B;
00229 glFogfv(GL_FOG_COLOR,m_FogColor);
00230 UnGuard
00231 }
00232
00233 void ExManagerFog::SetFogColorA(float A)
00234 {
00235 Guard(ExManagerFog::SetFogColorA(float A))
00236 if(A>1.0f)A=1.0f;
00237 if(A<0.0f)A=0.0f;
00238 m_FogColor[3]=A;
00239 glFogfv(GL_FOG_COLOR,m_FogColor);
00240 UnGuard
00241 }
00242
00243 void ExManagerFog::IncFogColorR(float inc)
00244 {
00245 Guard(ExManagerFog::IncFogColorR(float inc))
00246 SetFogColorR(GetFogColorR()+inc);
00247 UnGuard
00248 }
00249
00250 void ExManagerFog::IncFogColorG(float inc)
00251 {
00252 Guard(ExManagerFog::IncFogColorG(float inc))
00253 SetFogColorG(GetFogColorG()+inc);
00254 UnGuard
00255 }
00256
00257 void ExManagerFog::IncFogColorB(float inc)
00258 {
00259 Guard(ExManagerFog::IncFogColorB(float inc))
00260 SetFogColorB(GetFogColorB()+inc);
00261 UnGuard
00262 }
00263
00264 void ExManagerFog::IncFogColorA(float inc)
00265 {
00266 Guard(ExManagerFog::IncFogColorA(float inc))
00267 SetFogColorA(GetFogColorA()+inc);
00268 UnGuard
00269 }
00270
00271 void ExManagerFog::SetStartPoint(float P)
00272 {
00273 Guard(ExManagerFog::SetStartPoint(float P))
00274 m_StartPoint=P;
00275 glFogf(GL_FOG_START,m_StartPoint);
00276 UnGuard
00277 }
00278
00279 void ExManagerFog::IncStartPoint(float inc)
00280 {
00281 Guard(ExManagerFog::IncStartPoint(float inc))
00282 SetStartPoint(GetStarPoint()+inc);
00283 UnGuard
00284 }
00285
00286 void ExManagerFog::SetEndPoint(float P)
00287 {
00288 Guard(ExManagerFog::SetEndPoint(float P))
00289 m_EndPoint=P;
00290 glFogf(GL_FOG_END,m_EndPoint);
00291 UnGuard
00292 }
00293
00294 void ExManagerFog::IncEndPoint(float inc)
00295 {
00296 Guard(ExManagerFog::IncEndPoint(float inc))
00297 SetEndPoint(GetEndPoint()+inc);
00298 UnGuard
00299 }
00300
00301 void ExManagerFog::SetDensity(float P)
00302 {
00303 Guard(ExManagerFog::SetDensity(float P))
00304 m_Density=P;
00305 glFogf(GL_FOG_DENSITY,m_Density);
00306 UnGuard
00307 }
00308
00309 void ExManagerFog::IncDensity(float inc)
00310 {
00311 Guard(ExManagerFog::IncDensity(float inc))
00312 SetDensity(GetDensity()+inc);
00313 UnGuard
00314 }
00315
00316 void ExManagerFog::SetAlgo(GLenum algo)
00317 {
00318 Guard(ExManagerFog::SetAlgo(GLenum algo))
00319 switch(algo)
00320 {
00321 case GL_LINEAR:
00322 m_FogAlgo=GL_LINEAR;
00323 glFogi(GL_FOG_MODE,GL_LINEAR);
00324 break;
00325 case GL_EXP:
00326 m_FogAlgo=GL_EXP;
00327 glFogi(GL_FOG_MODE,GL_EXP);
00328 break;
00329 case GL_EXP2:
00330 m_FogAlgo=GL_EXP2;
00331 glFogi(GL_FOG_MODE,GL_EXP2);
00332 break;
00333 default :
00334 m_FogAlgo=GL_LINEAR;
00335 glFogi(GL_FOG_MODE,GL_LINEAR);
00336 break;
00337 }
00338 UnGuard
00339 }
00340
00341 ExCAction ExManagerFog::InputCommand(ExCCommand Command)
00342 {
00343 Guard(ExCAction ExManagerFog::InputCommand(ExCCommand Command))
00344 return NOTHING;
00345 UnGuard
00346 }
00347
00348 ExCAction ExManagerFog::InputAction(ExCAction Action)
00349 {
00350 Guard(ExCAction ExManagerFog::InputAction(ExCAction Action))
00351 switch(Action.m_Action)
00352 {
00353 case ENABLE_FOG:EnableFog();break;
00354 case DISABEL_FOG:DisableFog();break;
00355 case SET_FOG_ALGO_LINEAR:SetAlgo(GL_LINEAR);break;
00356 case SET_FOG_ALGO_EXP:SetAlgo(GL_EXP);break;
00357 case SET_FOG_ALGO_EXP2:SetAlgo(GL_LINEAR);break;
00358
00359 case SET_FOG_COLOR_R:
00360 try
00361 {
00362 SetFogColorR(atof(Action.m_Param.data()));
00363 }catch(...)
00364 {
00365 *Consol<<"Enter a float value"<<std::endl;
00366 }
00367 break;
00368
00369 case SET_FOG_COLOR_G:
00370 try
00371 {
00372 SetFogColorG(atof(Action.m_Param.data()));
00373 }catch(...)
00374 {
00375 *Consol<<"Enter a float value"<<std::endl;
00376 }
00377 break;
00378
00379 case SET_FOG_COLOR_B:
00380 try
00381 {
00382 SetFogColorB(atof(Action.m_Param.data()));
00383 }catch(...)
00384 {
00385 *Consol<<"Enter a float value"<<std::endl;
00386 }
00387 break;
00388
00389 case SET_FOG_START_POINT:
00390 try
00391 {
00392 SetStartPoint(atof(Action.m_Param.data()));
00393 }catch(...)
00394 {
00395 *Consol<<"Enter a float value"<<std::endl;
00396 }
00397 break;
00398
00399 case SET_FOG_END_POINT:
00400 try
00401 {
00402 SetEndPoint(atof(Action.m_Param.data()));
00403 }catch(...)
00404 {
00405 *Consol<<"Enter a float value"<<std::endl;
00406 }
00407 break;
00408
00409 case SET_FOG_DENSITY:
00410 try
00411 {
00412 SetDensity(atof(Action.m_Param.data()));
00413 }catch(...)
00414 {
00415 *Consol<<"Enter a float value"<<std::endl;
00416 }
00417 break;
00418
00419 default:
00420 *Consol<<"Can not file action in FOG_ACTION_MAP"<<std::endl;
00421 break;
00422 }
00423
00424 if(Action.m_NextAction){return *Action.m_NextAction;}
00425 else{return NOTHING;}
00426 UnGuard
00427 }