00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "test_complex.h"
00010
00011
00012
00013 TestComplex::TestComplex(int _duration, int _type, TScene *s) : Test(_duration, _type, s)
00014 {
00015
00016 if(type == COMPLEX_HDR)
00017 {
00018 testname = "complex_hdr";
00019 weight = 0.30f;
00020 splits = 2;
00021 s->SetLoadList(167);
00022
00023
00024 key1_pos.Set(3.1f, -8.7f, -12.8f);
00025 key1_rot.Set(-25.0f, -180.0f, 0.0f);
00026 key2_pos.Set(2.2f, -2.7f, -22.2f);
00027 key2_rot.Set( 12.0f, -35.0f, 0.0f);
00028 inv = 1;
00029 fps = 100;
00030
00031 try
00032 {
00033
00034 s->UseHDR(true);
00035
00036
00037 s->CreateRenderTarget();
00038
00039
00040 s->MoveCamera(key1_pos.x, key1_pos.y, key1_pos.z);
00041 s->RotateCamera(key1_rot.x, A_X);
00042 s->RotateCamera(key1_rot.y, A_Y);
00043
00044
00045 s->AddLight(0, silver, white, white, TVector(30.0, 40.0, 30.0),1000.0);
00046
00047
00048 const char *cubemap[] = { "data/tex/cubemaps/posx.tga", "data/tex/cubemaps/negx.tga",
00049 "data/tex/cubemaps/posy.tga", "data/tex/cubemaps/negy.tga",
00050 "data/tex/cubemaps/posz.tga", "data/tex/cubemaps/negz.tga" };
00051
00052
00053 s->LoadScene("data/obj/scenes/bmw.3ds");
00054 s->LoadScene("data/obj/scenes/hills.3ds");
00055
00056 s->AddTexture("matroad","data/tex/road.tga",BASE, MODULATE, 1.0, 1.0, 1.0, true, true);
00057 s->AddTexture("matgrass","data/tex/grass.tga",BASE, MODULATE, 0.5, 10.0, 20.0, true, true);
00058 s->AddTexture("mathills","data/tex/dirtgras.tga",BASE, MODULATE, 0.5, 10.0, 20.0);
00059 s->AddMaterial("mat_body",silver);
00060 s->AddTexture("mat_body",cubemap,CUBEMAP_ENV);
00061 s->SetMaterial("body","mat_body");
00062 s->AddMaterial("mat_glass",black, white, white, 64.0, 0.0, 1.0);
00063 s->AddTexture("mat_glass",cubemap,CUBEMAP_ENV);
00064 s->SetMaterial("glass","mat_glass");
00065 s->AddMaterial("mat_chrome",black, white, white);
00066 s->AddTexture("mat_chrome",cubemap,CUBEMAP_ENV,ADD);
00067 s->SetMaterial("metal","mat_chrome");
00068
00069
00070 s->AddObject("skybox",SPHERE,400.0,0.0,8,8);
00071 s->MoveObj("skybox",0.0, 100.0, 0.0);
00072
00073
00074 s->AddMaterial("mat_sky",white,white,white,0.0,0.0,0.0,NONE);
00075 s->AddMaterial("mat_bark",lgrey,white);
00076 s->AddMaterial("mat_leaf",lgrey,white);
00077 s->AddMaterial("mat_grass",green,white);
00078
00079
00080 s->AddTexture("mat_bark","data/tex/bark4.tga");
00081 s->AddTexture("mat_bark","data/tex/normal/bark4_nm.tga",BUMP,MODULATE, 1.0);
00082 s->AddTexture("mat_leaf","data/tex/alpha/leafs4.tga",ALPHA);
00083 s->AddTexture("mat_sky",cubemap);
00084 s->AddTexture("mat_grass","data/tex/alpha/grass.tga",ALPHA);
00085
00086
00087 s->SetMaterial("skybox","mat_sky");
00088
00089
00090 float rnd;
00091 int OBJECT_COUNT_X = 7;
00092 int OBJECT_COUNT_Y = 4;
00093 string bark, leaf;
00094 for(int i=0; i<OBJECT_COUNT_X; i++)
00095 {
00096 for(int j=0; j<OBJECT_COUNT_Y; j++)
00097 {
00098 rnd = rand()%100 / 25.0f - 2.0f;
00099 bark = "tree" + num2str(i*OBJECT_COUNT_X + j) + "_bark";
00100 leaf = "tree" + num2str(i*OBJECT_COUNT_Y + j) + "_leaf";
00101
00102 if( (i*OBJECT_COUNT_X + j)%2 == 1)
00103 {
00104 s->AddObject(bark.c_str(),"data/obj/trees/tree1_bark.3ds");
00105 s->AddObject(leaf.c_str(),"data/obj/trees/tree1_leaf.3ds");
00106 }
00107 else
00108 {
00109 s->AddObject(bark.c_str(),"data/obj/trees/tree2_bark.3ds");
00110 s->AddObject(leaf.c_str(),"data/obj/trees/tree2_leaf.3ds");
00111 }
00112 float movz = i*14.0f + rnd - 7.0f*OBJECT_COUNT_X + 10.0f;
00113 float movx = j*14.0f - rnd - 7.0f*OBJECT_COUNT_Y - 30.0f;
00114 float roty = 10.0f * rnd;
00115 s->MoveObj(bark.c_str(), movx, 2.0f-j, movz);
00116 s->MoveObj(leaf.c_str(), movx, 2.0f-j, movz);
00117 s->RotateObj(bark.c_str(), roty, A_Y);
00118 s->RotateObj(leaf.c_str(), roty, A_Y);
00119 s->SetMaterial(bark.c_str(), "mat_bark");
00120 s->SetMaterial(leaf.c_str(), "mat_leaf");
00121 }
00122 }
00123
00124
00125 s->SetUniform("mat_bloom_hdr","THRESHOLD",0.3);
00126 s->SetUniform("mat_tonemap","exposure",1.0);
00127 s->SetUniform("mat_tonemap","bloomFactor",1.0);
00128 s->SetUniform("mat_tonemap","brightMax",1.5);
00129
00130
00131 s->SetUniform("mat_blur_horiz","kernel_size",21);
00132 s->SetUniform("mat_blur_horiz","blur_radius",0.005);
00133 s->SetUniform("mat_blur_vert","kernel_size",21);
00134 s->SetUniform("mat_blur_vert","blur_radius",0.005);
00135 }
00136 catch(int err)
00137 {
00138 stopbit = true;
00139 throw ERR;
00140 return;
00141 }
00142 }
00144 else if(type == COMPLEX_SSAO)
00145 {
00146 testname = "complex_ssao";
00147 weight = 0.30f;
00148 splits = 4;
00149
00150
00151 try
00152 {
00153
00154 s->UseSSAO(true);
00155
00156 s->CreateRenderTarget();
00157
00158
00159 s->LoadScene("data/obj/scenes/room.3ds");
00160
00161
00162 s->MoveCameraAbs(6.5,-15.0,-90.0);
00163 s->RotateCamera(15.0,A_X);
00164 s->SetLightRadius(0,150.0);
00165
00166
00167 s->SetUniform("mat_tonemap","exposure",1.2);
00168 s->SetUniform("mat_tonemap","bloomFactor",1.0);
00169 s->SetUniform("mat_tonemap","brightMax",1.0);
00170
00171
00172 s->SetUniform("mat_bloom_ssao","totStrength",2.2);
00173 s->SetUniform("mat_bloom_ssao","rad",0.02);
00174 s->SetUniform("mat_bloom_ssao","bias",0.02);
00175
00176
00177 s->SetUniform("mat_blur_horiz","kernel_size",15);
00178 s->SetUniform("mat_blur_horiz","blur_radius",0.002);
00179 s->SetUniform("mat_blur_vert","kernel_size",15);
00180 s->SetUniform("mat_blur_vert","blur_radius",0.002);
00181 }
00182 catch(int err)
00183 {
00184 stopbit = true;
00185 return;
00186 }
00187 }
00189 else if(type == COMPLEX_SHADOW)
00190 {
00191 testname = "complex_shadow";
00192 weight = 0.30f;
00193 splits = 4;
00194 s->SetLoadList(8);
00195
00196
00197 s->MoveCamera(1.0,-3.0,-20.0);
00198 s->RotateCamera(5.0, A_X);
00199 s->RotateCamera(60.0, A_Y);
00200
00201 try
00202 {
00203 lpos1.Set(-30.0,45.0,5.0);
00204
00205 s->AddLight(0,dgrey,dgrey,white,lpos1,1000.0);
00206 s->AddLight(1,dgrey,dgrey,grey,TVector(-20.0,20.0,10.0));
00207 s->AddLight(2,dgrey,dgrey,grey,TVector(-20.0,20.0,-10.0));
00208 s->SetShadow(0,4096);
00209
00210 s->LoadScene("data/obj/scenes/chata.3ds");
00211
00212 s->AddMaterial("mat_sky",white,white,white,1.0,0.0,0.0,NONE);
00213 s->AddTexture("matleaf","data/tex/alpha/leafs4.tga",ALPHA);
00214 s->AddTexture("matgrass","data/tex/alpha/grass.tga",ALPHA);
00215 s->AddTexture("matroad","data/tex/dirtroad.tga",BASE,MODULATE,1.0,1.0,1.0,true,true);
00216 s->AddTexture("matroad","data/tex/normal/bump.tga",BUMP,MODULATE,1.0,1.0,1.0,true,true);
00217 s->AddTexture("matroof","data/tex/roof.tga",BASE,MODULATE,1.0,1.0,1.0,true,true);
00218 const char *cubemap[] = { "data/tex/cubemaps/sky/posx.tga", "data/tex/cubemaps/sky/negx.tga",
00219 "data/tex/cubemaps/sky/posy.tga", "data/tex/cubemaps/sky/negy.tga",
00220 "data/tex/cubemaps/sky/posz.tga", "data/tex/cubemaps/sky/negz.tga" };
00221 s->AddTexture("mat_sky",cubemap);
00222
00223 s->AddObject("sky",SPHERE,200.0,0.0,8,8);
00224
00225
00226 s->SetMaterial("sky","mat_sky");
00227
00228
00229 s->CastShadow("sky",false);
00230 s->CastShadow("ground",false);
00231 s->ReceiveShadow("mat_sky",false);
00232 }
00233 catch(int err)
00234 {
00235 stopbit = true;
00236 return;
00237 }
00238 }
00240 else if(type == COMPLEX_SSAMPLING)
00241 {
00242 testname = "complex_ssampling";
00243 weight = 0.10f;
00244 splits = 4;
00245 s->SetLoadList(17 + 98 + 30);
00246
00247
00248 s->MoveCamera(0.0, -4.5, -15.0);
00249 s->RotateCamera(-7.0, A_X);
00250
00251 try
00252 {
00253
00254 s->AddLight(0, lgrey, white, white, TVector(30.0, 40.0, 30.0));
00255
00256
00257 s->UseHDR(true);
00258
00259
00260 s->CreateRenderTarget(2*s->GetResX(),2*s->GetResY(),GL_RGBA,GL_UNSIGNED_BYTE);
00261
00262
00263 s->LoadScene("data/obj/scenes/forest.3ds");
00264 s->AddMaterial("mat_well",grey);
00265 s->AddTexture("mat_well","data/tex/wall.tga",BASE, MODULATE, 1.0, 4.0, 4.0);
00266 s->AddTexture("mat_well","data/tex/normal/wall.tga",BUMP, MODULATE, 1.0, 4.0, 4.0);
00267 s->SetMaterial("well","mat_well");
00268
00269
00270 s->AddObject("skybox",SPHERE,400.0,0.0,8,8);
00271 s->AddObject("ground",PLANE,200.0,200.0);
00272
00273
00274 s->AddMaterial("mat_bark",lgrey,white);
00275 s->AddMaterial("mat_leaf",lgrey,white);
00276 s->AddMaterial("mat_grass",lgrey,white);
00277 s->AddMaterial("mat_ground",silver,silver);
00278 s->AddMaterial("mat_forest",white, white);
00279 s->AddMaterial("mat_sky",white,white,white,0.0,0.0,0.0,NONE);
00280
00281
00282 s->AddTexture("mat_bark","data/tex/bark4.tga");
00283 s->AddTexture("mat_bark","data/tex/normal/bark4_nm.tga",BUMP,MODULATE, 1.0);
00284 s->AddTexture("mat_leaf","data/tex/alpha/leafs4.tga",ALPHA);
00285 s->AddTexture("mat_grass","data/tex/alpha/grass.tga",ALPHA);
00286 const char *cubemap[] = { "data/tex/cubemaps/sky/posx.tga", "data/tex/cubemaps/sky/negx.tga",
00287 "data/tex/cubemaps/sky/posy.tga", "data/tex/cubemaps/sky/negy.tga",
00288 "data/tex/cubemaps/sky/posz.tga", "data/tex/cubemaps/sky/negz.tga" };
00289 s->AddTexture("mat_sky",cubemap);
00290 s->AddTexture("mat_ground","data/tex/grass.tga",BASE, MODULATE, 1.0, 10.0, 20.0);
00291 s->AddTexture("mat_forest","data/tex/alpha/forest.tga",ALPHA,MODULATE, 1.0, 10.0);
00292
00293
00294 s->SetMaterial("skybox","mat_sky");
00295 s->SetMaterial("ground","mat_ground");
00296 s->SetMaterial("forest","mat_forest");
00297
00298
00299 float rnd;
00300 int OBJECT_COUNT = 7;
00301 string bark, leaf;
00302 for(int i=0; i<OBJECT_COUNT; i++)
00303 {
00304 for(int j=0; j<OBJECT_COUNT; j++)
00305 {
00306 rnd = rand()%100 / 25.0f - 2.0f;
00307 bark = "tree" + num2str(i*OBJECT_COUNT + j) + "_bark";
00308 leaf = "tree" + num2str(i*OBJECT_COUNT + j) + "_leaf";
00309
00310 if( (i*OBJECT_COUNT + j)%2 == 1)
00311 {
00312 s->AddObject(bark.c_str(),"data/obj/trees/tree1_bark.3ds");
00313 s->AddObject(leaf.c_str(),"data/obj/trees/tree1_leaf.3ds");
00314 }
00315 else
00316 {
00317 s->AddObject(bark.c_str(),"data/obj/trees/tree2_bark.3ds");
00318 s->AddObject(leaf.c_str(),"data/obj/trees/tree2_leaf.3ds");
00319 }
00320 float movx = j*14.0f + rnd - 7.0f*OBJECT_COUNT;
00321 float movz = i*14.0f - rnd - 7.0f* OBJECT_COUNT;
00322 float roty = 10.0f * rnd;
00323 s->MoveObj(bark.c_str(), movx, 0.0, movz);
00324 s->MoveObj(leaf.c_str(), movx, 0.0, movz);
00325 s->RotateObj(bark.c_str(), roty, A_Z);
00326 s->RotateObj(leaf.c_str(), roty, A_Z);
00327 s->SetMaterial(bark.c_str(), "mat_bark");
00328 s->SetMaterial(leaf.c_str(), "mat_leaf");
00329 }
00330 }
00331
00332
00333 OBJECT_COUNT = 30;
00334 s->AddObject("grass","data/obj/trs.3ds");
00335 s->SetMaterial("grass", "mat_grass");
00336 string grass;
00337 for(int i=0; i<OBJECT_COUNT; i++)
00338 {
00339 for(int j=0; j<OBJECT_COUNT; j++)
00340 {
00341 rnd = rand()%100 / 25.0f - 2.0f;
00342 grass = "grass" + num2str(i*OBJECT_COUNT + j);
00343 s->AddObjectInstance("grass",grass.c_str());
00344 float movx = j*2.0f + rnd - OBJECT_COUNT;
00345 float movz = i*2.0f - rnd - OBJECT_COUNT;
00346 float roty = 10.0f * rnd;
00347 s->MoveObj(grass.c_str(), movx, 0.0, movz);
00348 s->RotateObj(grass.c_str(), roty, A_Z);
00349 }
00350 }
00351
00352
00353 s->SetUniform("mat_bloom_hdr","THRESHOLD",0.0);
00354 s->SetUniform("mat_tonemap","exposure",0.5);
00355 s->SetUniform("mat_tonemap","bloomFactor",1.0);
00356 s->SetUniform("mat_tonemap","brightMax",1.0);
00357
00358
00359 s->SetUniform("mat_blur_horiz","kernel_size",1);
00360 s->SetUniform("mat_blur_horiz","blur_radius",0.0);
00361 s->SetUniform("mat_blur_vert","kernel_size",1);
00362 s->SetUniform("mat_blur_vert","blur_radius",0.0);
00363 }
00364 catch(int err)
00365 {
00366 stopbit = true;
00367 return;
00368 }
00369 }
00370
00371
00372 if(!s->PostInit())
00373 stopbit = true;
00374 InitTime();
00375 }
00376
00377
00378
00379 TestComplex::~TestComplex()
00380 {
00381 s->Destroy(true);
00382 }
00383
00384
00385
00386 void TestComplex::Run()
00387 {
00388 Test::Run();
00389 if(!draw_scene)
00390 return;
00391
00393
00394 if(type == COMPLEX_HDR)
00395 {
00396 if(splitbit)
00397 {
00398 splitbit = false;
00399
00400
00401 switch(curr_setup)
00402 {
00403
00404 case 1:
00405 s->UseHDR(false);
00406 msg = "HDR lighting OFF";
00407 break;
00408
00409 case 2:
00410 s->UseHDR(true);
00411 inv = -1;
00412 msg = "HDR lighting ON";
00413 break;
00414 default: break;
00415 }
00416 }
00417 s->MoveCamera(dp.x, dp.y, dp.z);
00418 s->RotateCamera(dr.x, A_X);
00419 s->RotateCamera(dr.y, A_Y);
00420
00421 s->Redraw();
00422
00423
00424 s->DrawScreenText(msg.c_str(),50,95,1.2f);
00425 }
00427 else if(type == COMPLEX_SSAO)
00428 {
00429 if(splitbit)
00430 {
00431 splitbit = false;
00432
00433
00434 switch(curr_setup)
00435 {
00436
00437 case 1:
00438 s->UseSSAO(false);
00439 msg = "Ambient occlusion OFF";
00440 break;
00441
00442 case 2:
00443 try
00444 {
00445 s->UseSSAO(true);
00446 }
00447 catch(int err)
00448 {
00449 stopbit = true;
00450 return;
00451 }
00452 msg = "Ambient occlusion ON";
00453 break;
00454 default: break;
00455 }
00456 }
00457
00458 s->RotateCameraAbs(anim*10.0f,A_Y);
00459 s->MoveObjAbs("motor",0.0f,sin(5.0f*anim), 0.0f);
00460 s->MoveObjAbs("motor_fan",-32.5f, 14.0f + sin(5.0f*anim), -4.5f);
00461 s->RotateObjAbs("motor_fan",anim*100.0f,A_X);
00462
00463 s->Redraw();
00464
00465 s->DrawScreenText(msg.c_str(),50,95,1.2f);
00466 }
00468 else if(type == COMPLEX_SHADOW)
00469 {
00470 if(splitbit)
00471 {
00472 splitbit = false;
00473
00474
00475 switch(curr_setup)
00476 {
00477
00478 case 1:
00479 s->UseShadows(false);
00480 msg = "Dynamic shadows OFF";
00481 break;
00482
00483 case 2:
00484 s->UseShadows(true);
00485 msg = "Dynamic shadows ON";
00486 break;
00487 default: break;
00488 }
00489 }
00490 if(curr_setup > 1)
00491 {
00492
00493 float t_anim = (anim - 7.5f - SPLASH/1000.0f)/7.5f + PI/2.0f;
00494 lpos1.z = 50.0f * sin(t_anim);
00495 lpos1.y = 30.0f * abs(cos(t_anim)) + 10.0f;
00496 float l_color = abs(cos(t_anim)) + 0.1f;
00497 s->MoveLight(0,lpos1);
00498 s->ChangeLightColor(0,DIFFUSE,TVector(l_color,l_color,l_color));
00499 s->ChangeLightColor(1,DIFFUSE,TVector(l_color,l_color,l_color));
00500 s->ChangeLightColor(2,DIFFUSE,TVector(l_color,l_color,l_color));
00501 }
00502
00503 s->MoveCamera(0.0,0.0,-0.15f/fps);
00504
00505 s->Redraw();
00506
00507 s->DrawScreenText(msg.c_str(),50,95,1.2f);
00508 }
00510 else if(type == COMPLEX_SSAMPLING)
00511 {
00512 if(splitbit)
00513 {
00514 splitbit = false;
00515
00516
00517 switch(curr_setup)
00518 {
00519
00520 case 1:
00521 s->UseHDR(false);
00522 msg = "Supersampling OFF";
00523 break;
00524
00525 case 2:
00526 s->UseHDR(true);
00527 msg = "Supersampling ON";
00528 break;
00529 default: break;
00530 }
00531 }
00532
00533 s->RotateCameraAbs(anim*5.0f, A_Y);
00534
00535 s->Redraw();
00536
00537 s->DrawScreenText(msg.c_str(),50,95,1.2f);
00538 }
00539 }
00540
00541
00542
00543 void TestComplex::Animate()
00544 {
00545 Test::Animate();
00546
00547 switch(type)
00548 {
00549 case COMPLEX_HDR:
00550
00551 dp = (key2_pos - key1_pos)/(float)fps/12.0f * (float)inv;
00552 dr = (key2_rot - key1_rot)/(float)fps/12.0f * (float)inv;
00553 break;
00554 default:
00555 break;
00556 }
00557 }
00558
00559
00560
00561
00562 void TestComplex::SaveResults()
00563 {
00564 Test::SaveResults();
00565
00566 if(type == COMPLEX_HDR)
00567 {
00568
00569 switch(curr_setup)
00570 {
00571 case 1:
00572 results<<"<complex>\n"<<
00573 "<"<<testname<<">\n"<<
00574 "<hdr_off>\n<fps>"<<avg_fps<<"</fps>\n</hdr_off>\n";
00575 break;
00576 case 2:
00577
00578 test_score = avg_fps*4;
00579 cout<<"SCORE: "<<test_score<<endl;
00580 results<<"<hdr_on>\n<fps>"<<avg_fps<<"</fps>\n</hdr_on>\n"
00581 "<score>"<<test_score<<"</score>"
00582 "</"<<testname<<">\n";
00583 break;
00584 default: break;
00585 }
00586 }
00587
00588 else if(type == COMPLEX_SSAO)
00589 {
00590
00591 switch(curr_setup)
00592 {
00593 case 1:
00594 results<<"<"<<testname<<">\n"<<
00595 "<ao_off>\n<fps>"<<avg_fps<<"</fps>\n</ao_off>\n";
00596 break;
00597 case 4:
00598
00599 test_score = avg_fps * 4.5f;
00600 cout<<"SCORE: "<<test_score<<endl;
00601 results<<"<ao_on>\n<fps>"<<avg_fps<<"</fps>\n</ao_on>\n"
00602 "<score>"<<test_score<<"</score>"
00603 "</"<<testname<<">\n";
00604 break;
00605 default: break;
00606 }
00607 }
00608 else if(type == COMPLEX_SHADOW)
00609 {
00610
00611 switch(curr_setup)
00612 {
00613 case 1:
00614 results<<"<"<<testname<<">\n"<<
00615 "<shadow_off>\n<fps>"<<avg_fps<<"</fps>\n</shadow_off>\n";
00616 break;
00617 case 4:
00618
00619 test_score = avg_fps * 10.0f;
00620 cout<<"SCORE: "<<test_score<<endl;
00621 results<<"<shadow_on>\n<fps>"<<avg_fps<<"</fps>\n</shadow_on>\n"
00622 "<score>"<<test_score<<"</score>"
00623 "</"<<testname<<">\n";
00624 break;
00625 default: break;
00626 }
00627 }
00628 else if(type == COMPLEX_SSAMPLING)
00629 {
00630
00631 switch(curr_setup)
00632 {
00633 case 1:
00634 results<<"<"<<testname<<">\n"<<
00635 "<ssampling_off>\n<fps>"<<avg_fps<<"</fps>\n</ssampling_off>\n";
00636 break;
00637 case 4:
00638
00639 test_score = avg_fps * 3.3f;
00640 cout<<"SCORE: "<<test_score<<endl;
00641 results<<"<ssampling_on>\n<fps>"<<avg_fps<<"</fps>\n</ssampling_on>\n"
00642 "<score>"<<test_score<<"</score>"
00643 "</"<<testname<<">\n"
00644 "</complex>\n";
00645 break;
00646 default: break;
00647 }
00648 }
00649 }