00001
00017 #include "glux_engine/engine.h"
00018 using namespace std;
00019
00020
00021 unsigned cycle = 0;
00022 unsigned fps;
00023
00024
00025 TScene *s;
00026 char msg[32];
00027 bool wire = false;
00028 int fsaa;
00029 float anim = 0.0;
00030 TVector lpos1(-30.0,45.0,5.0),lpos2(0.0,1.0,0.0);
00031
00032
00033
00034 bool InitScene(int resx, int resy)
00035 {
00036 s = new TScene();
00037 if(!s->PreInit(resx, resy, 0.1, 1000.0, 45.0, 0))
00038 return false;
00039
00040
00041 s->UseHDR(true);
00042
00043
00044 s->CreateRenderTarget();
00045
00046
00047 s->MoveCamera(1.0,-3.0,-24.0);
00048 s->RotateCamera(5.0, A_X);
00049 s->RotateCamera(60.0, A_Y);
00050
00051
00052 s->AddLight(0,grey,white,white,lpos1);
00053 s->AddLight(1,grey,silver,grey,TVector(-20.0,20.0,10.0));
00054 s->SetShadow(0,4096);
00055
00056 s->LoadScene("data/obj/scenes/chata.3ds");
00057
00058 s->AddMaterial("mat_sky",white,white,white,0.0,0.0,0.0,NONE);
00059 s->AddTexture("matleaf","data/tex/alpha/leafs4.tga",ALPHA);
00060 s->AddTexture("matgrass","data/tex/alpha/grass.tga",ALPHA);
00061 s->AddTexture("matroad","data/tex/dirtroad.tga",BASE,MODULATE,1.0,1.0,1.0,true,true);
00062 s->AddTexture("matroad","data/tex/normal/bump.tga",BUMP,MODULATE,1.0,1.0,1.0,true,true);
00063 s->AddTexture("matroof","data/tex/roof.tga",BASE,MODULATE,1.0,1.0,1.0,true,true);
00064 const char *cubemap[] = { "data/tex/cubemaps/sky/posx.tga", "data/tex/cubemaps/sky/negx.tga",
00065 "data/tex/cubemaps/sky/posy.tga", "data/tex/cubemaps/sky/negy.tga",
00066 "data/tex/cubemaps/sky/posz.tga", "data/tex/cubemaps/sky/negz.tga" };
00067 s->AddTexture("mat_sky",cubemap);
00068
00069 s->AddObject("sky",SPHERE,200.0,0.0,8,8);
00070
00071
00072 s->SetMaterial("sky","mat_sky");
00073
00074
00075 s->CastShadow("sky",false);
00076 s->CastShadow("ground",false);
00077 s->ReceiveShadow("mat_sky",false);
00078
00079
00080 s->SetUniform("mat_bloom_hdr","THRESHOLD",0.0);
00081 s->SetUniform("mat_tonemap","exposure",1.0);
00082 s->SetUniform("mat_tonemap","bloomFactor",1.0);
00083 s->SetUniform("mat_tonemap","brightMax",1.2);
00084
00085
00086 s->SetUniform("mat_blur_horiz","kernel_size",9);
00087 s->SetUniform("mat_blur_horiz","blur_radius",0.003);
00088 s->SetUniform("mat_blur_vert","kernel_size",9);
00089 s->SetUniform("mat_blur_vert","blur_radius",0.003);
00090
00091 return s->PostInit();
00092 }
00093
00094 string name;
00095
00096
00097 void Redraw()
00098 {
00099
00100 lpos1.z = 50.0 * sin(anim);
00101 lpos1.y = 30.0 * abs(cos(anim)) + 10.0;
00102 s->MoveLight(0,lpos1);
00103 s->SetUniform("mat_tonemap","exposure",abs(cos(anim)) + 0.05);
00104
00105 s->Redraw();
00106 cycle++;
00107
00108
00109 sprintf(msg,"%d fps",fps);
00110 s->DrawScreenText(msg,50.0,1.0,1.0);
00111
00112
00113 int meminfo[4];
00114 glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI,meminfo);
00115 sprintf(msg,"VRAM used: %d MB",1024 - meminfo[0]/1024);
00116 s->DrawScreenText(msg,10.0,1.0,1.0);
00117 }
00118
00119
00120
00121 const float INC = 0.5;
00122 bool use_ssao = true;
00123 void KeyInput(SDLKey key)
00124 {
00125 lpos1 = s->GetLightPos(0);
00126 switch(key)
00127 {
00128 case SDLK_x:
00129 wire = !wire;
00130 if(wire) glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
00131 else glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
00132 break;
00133
00134
00135 case SDLK_w: lpos1.z -= INC; s->MoveLight(0,lpos1); break;
00136 case SDLK_s: lpos1.z += INC; s->MoveLight(0,lpos1); break;
00137 case SDLK_a: lpos1.x -= INC; s->MoveLight(0,lpos1); break;
00138 case SDLK_d: lpos1.x += INC; s->MoveLight(0,lpos1); break;
00139 case SDLK_q: lpos1.y += INC; s->MoveLight(0,lpos1); break;
00140 case SDLK_e: lpos1.y -= INC; s->MoveLight(0,lpos1); break;
00141
00142 case SDLK_c: s->UseShadows(true); break;
00143 case SDLK_v: s->UseShadows(false); break;
00144 case SDLK_b: s->UseHDR(true); break;
00145 case SDLK_n: s->UseHDR(false); break;
00146
00147 case SDLK_ESCAPE:
00148 SDL_Quit();
00149 exit(0);
00150 break;
00151 default:
00152 break;
00153 }
00154 cout<<lpos1.x<<","<<lpos1.y<<","<<lpos1.z<<endl;
00155 }
00156
00165 int status;
00166 void MouseClick(SDL_Event event)
00167 {
00168 if(event.button.state = SDL_RELEASED)
00169 status = 0;
00170 else
00171 status = event.button.button;
00172 }
00173
00180 void MouseMotion(SDL_Event event)
00181 {
00182 int x = event.motion.xrel;
00183 int y = event.motion.yrel;
00184
00185 if(status == SDL_BUTTON_LEFT)
00186 {
00187 s->RotateCamera(y, A_X);
00188 s->RotateCamera(x, A_Y);
00189 }
00190 else if(status == 4)
00191 s->MoveCamera(0.0,0.0, x/10.0 );
00192 else if(status == SDL_BUTTON_MIDDLE)
00193 s->MoveCamera( x/10.0, -y/10.0, 0.0);
00194
00195
00196
00197 }
00198
00203 void WrongParams()
00204 {
00205 cout<<"Wrong parameters.\n"
00206 "Usage: gluxEngine.exe [-w|-f resX resY][-aa value]\n"
00207 "Parameters:\n"
00208 "-w,-f: windowed/fullscreen mode\n"
00209 "resX, resY: screen resolution in pixels\n"
00210 "-aa: antialiasing strength (0,1 = off)\n";
00211 exit(1);
00212 }
00213
00214
00216
00218 int main(int argc, char **argv)
00219 {
00220
00221 string param;
00222 int fsaa = 1;
00223 bool fullscreen = false;
00224 int resx = 1024, resy = 640;
00225
00226
00227 for(int i=1; i<argc; i++)
00228 {
00229 param = argv[i];
00231
00232 if(param == "-w" || param == "-f")
00233 {
00234 if(param == "-w")
00235 fullscreen = false;
00236 else if(param == "-f")
00237 fullscreen = true;
00238
00239 if(i+2 < argc)
00240 {
00241 resx = atoi(argv[i+1]);
00242 resy = atoi(argv[i+2]);
00243 i += 2;
00244 }
00245 else
00246 WrongParams();
00247 }
00249
00250 else if(param == "-aa")
00251 {
00252 if(i+1 < argc)
00253 {
00254 fsaa = atoi(argv[i+1]);
00255 i++;
00256 }
00257 else
00258 WrongParams();
00259 }
00261
00262 else
00263 WrongParams();
00264 }
00265
00266
00267 if(SDL_Init(SDL_INIT_VIDEO) < 0) exit(1);
00268
00269
00270 if(SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3) == -1)
00271 {
00272 ShowMessage("OpenGL 3.0 not supported :(\n",false);
00273 SDL_Quit();
00274 exit(1);
00275 }
00276
00277 if(SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2) == -1)
00278 {
00279 cout<<"OpenGL 3.2 not supported, falling back to 3.1\n";
00280 if(SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1) == -1)
00281 {
00282 cout<<"OpenGL 3.1 not supported, falling back to 3.0\n";
00283 SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
00284 }
00285 }
00286
00287
00288 SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
00289 SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
00290
00291
00292 SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
00293 SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, fsaa);
00294
00295 SDL_WM_SetCaption("gluxEngine", 0);
00296
00297
00298 int mode = SDL_OPENGL;
00299 if(fullscreen)
00300 mode |= SDL_FULLSCREEN;
00301 if(SDL_SetVideoMode(resx, resy, 32, mode) == NULL)
00302 {
00303 ShowMessage("Display mode not supported!\n");
00304 SDL_Quit();
00305 return 1;
00306 }
00307
00308
00309 if(glewInit() != GLEW_OK)
00310 {
00311 ShowMessage("GLEW initialization failed!\n");
00312 SDL_Quit();
00313 return 1;
00314 }
00315
00316
00317 if(!InitScene(resx,resy)) exit(1);
00318
00319
00320 SDLKey key;
00321 bool keypress = false;
00322 SDL_Event event;
00323 int time_now, time_nextMS, time_nextS, last_keypress;
00324 time_now = time_nextMS = time_nextS = SDL_GetTicks();
00325 while(true)
00326 {
00327
00328 time_now = SDL_GetTicks();
00329
00330 if(time_now >= time_nextMS)
00331 {
00332 anim += 0.01;
00333 time_nextMS += 10;
00334 }
00335 if(time_now >= time_nextS)
00336 {
00337 time_nextS += 1000;
00338
00339 fps = cycle;
00340 cycle = 0;
00341 }
00342
00343
00344 if(SDL_PollEvent(&event))
00345 {
00346 if(event.type == SDL_QUIT)
00347 break;
00348
00349 else if(event.type == SDL_KEYDOWN)
00350 {
00351 keypress = true;
00352 last_keypress = time_now;
00353 key = event.key.keysym.sym;
00354 }
00355 else if(event.type == SDL_KEYUP)
00356 keypress = false;
00357
00358 else if(event.type == SDL_MOUSEMOTION)
00359 {
00360 MouseMotion(event);
00361 MouseClick(event);
00362 }
00363 }
00364
00365
00366 if(keypress && (time_now - last_keypress > 150 || last_keypress == time_now) )
00367 KeyInput(key);
00368
00369
00370 Redraw();
00371 SDL_GL_SwapBuffers();
00372 }
00373
00374
00375 SDL_Quit();
00376 return 0;
00377 }