00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "test_vert.h"
00010
00011
00012
00013 TestVert::TestVert(int _duration, int _type, TScene *s) : Test(_duration, _type, s)
00014 {
00015
00016 if(type == VERT_LIGHTS)
00017 {
00018 testname = "vert_lights";
00019 weight = 0.45f;
00020 splits = 3;
00021 s->SetLoadList(4);
00022 int INSTANCES = 20;
00023
00024
00025 s->RotateCamera(-45.0,A_Y);
00026 s->RotateCamera(20.0,A_X);
00027
00028
00029 lpos1.Set(0.0,10.0,0.0); lpos2.Set(0.0,10.0,0.0); lpos3.Set(0.0,10.0,0.0); lpos4.Set(0.0,10.0,0.0);
00030 lpos5.Set(0.0,10.0,0.0); lpos6.Set(0.0,10.0,0.0); lpos7.Set(0.0,10.0,0.0); lpos8.Set(0.0,10.0,0.0);
00031
00032
00033 s->AddLight(0,black,white,white,lpos1,40.0);
00034
00035 try
00036 {
00037
00038 s->LoadScene("data/obj/scenes/bmw.3ds");
00039 s->DrawObject("glass",false);
00040 s->AddMaterial("mat_body",black,TVector(0.0f,0.0f,0.02f),white,64.0,0.0,0.0,GOURAUD);
00041 s->SetMaterial("body","mat_body");
00042
00043
00044 s->AddMaterial("mat_tile",black,white,white,8.0,0.0,0.0,GOURAUD);
00045 s->AddTexture("mat_tile","data/tex/metal.tga");
00046
00047
00048 s->AddObject("tile0","data/obj/tile.3ds");
00049 s->MoveObj("tile0", -INSTANCES*2.0f, -1.7f, -INSTANCES*2.0f);
00050 s->SetMaterial("tile0", "mat_tile");
00051
00052 if(GLEW_ARB_draw_instanced || GLEW_EXT_draw_instanced)
00053 {
00054 s->CustomShader("mat_tile","data/shaders/instanced.vert",NULL,"data/shaders/instanced.frag");
00055 s->SetUniform("mat_tile","INSTANCES",INSTANCES);
00056 s->SetGInstances("tile0",INSTANCES*INSTANCES);
00057 }
00058
00059 else
00060 {
00061 string obj_name;
00062 for(int i=0; i<INSTANCES*INSTANCES; i++)
00063 {
00064 obj_name = "tile0" + num2str(i + 1);
00065 s->AddObjectInstance("tile0",obj_name.c_str());
00066 s->MoveObj(obj_name.c_str(), 5.0f*(i%INSTANCES), 0.0f, 5.0f*(i/INSTANCES));
00067 }
00068 }
00069 }
00070 catch(int err)
00071 {
00072 stopbit = true;
00073 throw ERR;
00074 return;
00075 }
00076 total_verts = 56847 + INSTANCES * INSTANCES * 4912;
00077 }
00078 else if(type == VERT_WAVES)
00079 {
00080 testname = "vert_waves";
00081 weight = 0.25;
00082 splits = 1;
00083 s->SetLoadList(7);
00084
00085
00086 s->MoveCamera(0.0,-5.0,-5.0);
00087
00088 try
00089 {
00090
00091 s->AddObject("sky",SPHERE,200.0,0.0,8,8);
00092 s->AddObject("sea",STRIP_PLANE,500.0,500.0,500,500);
00093
00094
00095 s->AddLight(0,grey,white,white,TVector(0.5,20.0,1.5));
00096
00097
00098 s->AddMaterial("mat_sea",silver,white,white,16.0);
00099 s->AddMaterial("mat_sky",black,white,white,0.0,0.0,0.0,NONE);
00100 const char *cubemaps[] = { "data/tex/cubemaps/sky/posx.tga", "data/tex/cubemaps/sky/negx.tga", "data/tex/cubemaps/sky/posy.tga",
00101 "data/tex/cubemaps/sky/negy.tga", "data/tex/cubemaps/sky/posz.tga", "data/tex/cubemaps/sky/negz.tga" };
00102 s->AddTexture("mat_sky",cubemaps);
00103 s->AddTexture("mat_sea",cubemaps,CUBEMAP_ENV);
00104 s->AddTexture("mat_sea","data/tex/sea.tga");
00105
00106 s->CustomShader("mat_sea","data/shaders/sea.vert",NULL,"data/shaders/sea.frag");
00107
00108
00109 s->SetMaterial("sky","mat_sky");
00110 s->SetMaterial("sea","mat_sea");
00111 }
00112 catch(int err)
00113 {
00114 stopbit = true;
00115 throw ERR;
00116 return;
00117 }
00118 total_verts = 250000;
00119 }
00120 else if(type == VERT_DISPLACE)
00121 {
00122 testname = "vert_displace";
00123 weight = 0.30f;
00124 splits = 4;
00125 s->SetLoadList(31);
00126
00127
00128 s->MoveCamera(0.0,-8.0,-88.0);
00129 s->RotateCamera(10.0,A_X);
00130
00131 try
00132 {
00133
00134 s->AddObject("tree_top","data/obj/tree_top.3ds");
00135 s->AddObject("tree_bark","data/obj/tree_bark.3ds");
00136 s->AddObject("terrain",STRIP_PLANE,300.0,300.0,200,200);
00137 s->MoveObj("terrain",-30.0,-0.5,0.0);
00138 s->AddObject("sky",SPHERE,200.0,0.0,8,8);
00139 s->AddObject("ground",STRIP_PLANE,50.0,100.0,500,1000);
00140
00141
00142 s->AddLight(0,grey,white,white,TVector(25.0,65.0,125.0),10000.0);
00143
00144
00145 s->AddMaterial("mat_tree_top",black,white,white,64.0,0.0,0.0,GOURAUD);
00146 s->AddMaterial("mat_tree_bark",black,white,white,64.0,0.0,0.0,GOURAUD);
00147 s->AddMaterial("mat_ground",black,white,silver,128.0,0.0,0.0,GOURAUD);
00148 s->AddMaterial("mat_terrain",black,white,grey,64.0,0.0,0.0,GOURAUD);
00149 s->AddMaterial("mat_sky",black,white,white,0.0,0.0,0.0,NONE);
00150
00151
00152 s->AddMaterial("mat_tree_doff",black,white,white,64.0,0.0,0.0,GOURAUD);
00153 s->AddMaterial("mat_ground_doff",black,white,silver,128.0,0.0,0.0,GOURAUD);
00154 s->AddMaterial("mat_terrain_doff",black,white,grey,64.0,0.0,0.0,GOURAUD);
00155
00156
00157 const char *cubemaps[] = { "data/tex/cubemaps/sky/posx.tga", "data/tex/cubemaps/sky/negx.tga", "data/tex/cubemaps/sky/posy.tga",
00158 "data/tex/cubemaps/sky/negy.tga", "data/tex/cubemaps/sky/posz.tga", "data/tex/cubemaps/sky/negz.tga" };
00159 s->AddTexture("mat_sky",cubemaps);
00160
00161
00162 s->AddTexture("mat_tree_top","data/tex/tree.tga",BASE,MODULATE,1.0,2.0,4.0);
00163 s->AddTexture("mat_tree_top","data/tex/normal/tree.tga",BUMP, MODULATE, 1.0, 2.0, 4.0);
00164 s->AddTexture("mat_tree_top","data/tex/depth/tree.tga",DISPLACE,MODULATE,0.1f, 1.0f, 1.0f);
00165
00166 s->AddTexture("mat_tree_bark","data/tex/tree.tga",BASE,MODULATE,1.0,2.0,4.0);
00167 s->AddTexture("mat_tree_bark","data/tex/normal/tree.tga",BUMP, MODULATE, 1.0, 2.0, 4.0);
00168 s->AddTexture("mat_tree_bark","data/tex/depth/tree.tga",DISPLACE,MODULATE,0.3f, 0.25f, 0.25f);
00169
00170 s->AddTexture("mat_ground","data/tex/dry.tga",BASE,MODULATE,1.0,2.0,4.0);
00171 s->AddTexture("mat_ground","data/tex/normal/dry.tga",BUMP, MODULATE, 1.0, 2.0,4.0);
00172 s->AddTexture("mat_ground","data/tex/depth/dry.tga",DISPLACE,MODULATE, 2.0,2.0,4.0);
00173 s->AddTexture("mat_ground","data/tex/alpha/tree_shadow.tga",BASE,MODULATE);
00174
00175 s->AddTexture("mat_terrain","data/tex/dust.tga",BASE,MODULATE,1.0,20.0,20.0);
00176 s->AddTexture("mat_terrain","data/tex/normal/terrain.tga",BUMP);
00177 s->AddTexture("mat_terrain","data/tex/depth/terrain.tga",DISPLACE,MODULATE, 75.0);
00178
00179
00180 s->AddTexture("mat_tree_doff","data/tex/tree.tga",BASE,MODULATE,1.0,2.0,4.0);
00181 s->AddTexture("mat_ground_doff","data/tex/dry.tga",BASE,MODULATE,1.0,2.0,4.0);
00182 s->AddTexture("mat_ground_doff","data/tex/alpha/tree_shadow.tga",BASE,MODULATE);
00183 s->AddTexture("mat_terrain_doff","data/tex/dust.tga",BASE,MODULATE,1.0,20.0,20.0);
00184
00185
00186 s->CustomShader("mat_ground","data/shaders/displaced_ground.vert",NULL,"data/shaders/displaced_ground.frag");
00187 s->CustomShader("mat_ground_doff","data/shaders/displaced_ground_doff.vert",NULL,"data/shaders/displaced_ground_doff.frag");
00188
00189
00190 s->SetMaterial("sky","mat_sky");
00191 s->SetMaterial("tree_top","mat_tree_doff");
00192 s->SetMaterial("tree_bark","mat_tree_doff");
00193 s->SetMaterial("ground","mat_ground_doff");
00194 s->SetMaterial("terrain","mat_terrain_doff");
00195 }
00196 catch(int err)
00197 {
00198 stopbit = true;
00199 throw ERR;
00200 return;
00201 }
00202 total_verts = 95890 + 4514 + 40000 + 500000 + 64;
00203 }
00204
00205
00206 if(!s->PostInit())
00207 {
00208 stopbit = true;
00209 throw ERR;
00210 }
00211 InitTime();
00212 }
00213
00214
00215
00216 TestVert::~TestVert()
00217 {
00218 s->Destroy();
00219 }
00220
00221
00222
00223 void TestVert::Run()
00224 {
00225 Test::Run();
00226 if(!draw_scene) return;
00227
00229
00230 if(type == VERT_LIGHTS)
00231 {
00232 if(splitbit)
00233 {
00234 splitbit = false;
00235
00236
00237 switch(curr_setup)
00238 {
00239
00240 case 1:
00241 msg = "1 light";
00242 break;
00243
00244 case 2:
00245 msg = "4 lights";
00246 s->AddLight(1,black,red,red,lpos2);
00247 s->AddLight(2,black,green,green,lpos3);
00248 s->AddLight(3,black,blue,blue,lpos4);
00249 break;
00250
00251 case 3:
00252 msg = "8 lights";
00253 s->AddLight(4,black,cyan,cyan,lpos5);
00254 s->AddLight(5,black,magenta,magenta,lpos6);
00255 s->AddLight(6,black,yellow,yellow,lpos7);
00256 s->AddLight(7,black,silver,silver,lpos8);
00257 break;
00258 default: break;
00259 }
00260 s->UpdateLightCount();
00261 }
00262
00263 s->MoveLight(0,lpos1);
00264 if(curr_setup > 1)
00265 {
00266 s->MoveLight(1,lpos2);
00267 s->MoveLight(2,lpos3);
00268 s->MoveLight(3,lpos4);
00269 }
00270 if(curr_setup > 2)
00271 {
00272 s->MoveLight(4,lpos5);
00273 s->MoveLight(5,lpos6);
00274 s->MoveLight(6,lpos7);
00275 s->MoveLight(7,lpos8);
00276 }
00277
00278 s->MoveCameraAbs(0.0f,-1.0f,-20.0f - anim/4.0f);
00279 s->Redraw();
00280
00281 s->DrawScreenText(msg.c_str(),50,95,1.2f);
00282 }
00283 else if(type == VERT_WAVES)
00284 {
00285 s->RotateCameraAbs(anim*9.0f,A_Y);
00286 s->SetUniform("mat_sea","time",anim);
00287 s->Redraw();
00288 }
00289 else if(type == VERT_DISPLACE)
00290 {
00291 if(splitbit)
00292 {
00293 splitbit = false;
00294
00295
00296 switch(curr_setup)
00297 {
00298 case 1:
00299 msg = "Displacement OFF";
00300 break;
00301 case 2:
00302 msg = "Displacement ON";
00303 s->SetMaterial("tree_top","mat_tree_top");
00304 s->SetMaterial("tree_bark","mat_tree_bark");
00305 s->SetMaterial("ground","mat_ground");
00306 s->SetMaterial("terrain","mat_terrain");
00307 break;
00308 default: break;
00309 }
00310 }
00311
00312
00313 if(curr_setup == 1)
00314 s->MoveCameraAbs(-1.4f,-8.0f,-90.0f + 8.5f*anim);
00315 else
00316 s->RotateCamera(10.0f/fps,A_Y);
00317
00318 s->Redraw();
00319 s->DrawScreenText(msg.c_str(),50,95,1.2f);
00320 }
00321 msg2 = num2str((total_verts * fps)/1000000.0f) + " MVertices/s";
00322 s->DrawScreenText(msg2.c_str(),90.0,1.0,1.0f);
00323 }
00324
00325
00326
00327 void TestVert::Animate()
00328 {
00329 Test::Animate();
00330 switch(type)
00331 {
00332 case VERT_LIGHTS:
00333
00334
00335 lpos1.x = 10.0f*cos(anim);
00336 lpos1.z = 45.0f*sin(anim);
00337
00338 if(curr_setup > 1)
00339 {
00340 lpos2.y = 10.0f*cos(1.5f*anim) + 10.0f;
00341 lpos2.z = 45.0f*sin(1.5f*anim);
00342
00343 lpos3.x = 10.0f*sin(anim) - 10.0f;
00344 lpos3.y = 10.0f*cos(0.5f*anim) + 10.0f;
00345 lpos3.z = 45.0f*cos(0.5f*anim);
00346
00347 lpos4.x = 10.0f*sin(0.4f*anim) + 10.0f;
00348 lpos4.y = 10.0f*sin(0.7f*anim) + 10.0f;
00349 lpos4.z = 45.0f*sin(0.7f*anim);
00350 }
00351 if(curr_setup > 2)
00352 {
00353 lpos5.x = 20.0f*cos(1.3f*anim);
00354 lpos5.z = 20.0f*sin(1.3f*anim);
00355
00356 lpos6.y = 10.0f*cos(1.8f*anim) + 10.0f;
00357 lpos6.z = 10.0f*sin(1.8f*anim);
00358
00359 lpos7.x = 10.0f*sin(1.6f*anim) - 10.0f;
00360 lpos7.y = 10.0f*cos(1.6f*anim) + 10.0f;
00361 lpos7.z = 10.0f*cos(1.6f*anim);
00362
00363 lpos8.x = 10.0f*sin(0.9f*anim) + 10.0f;
00364 lpos8.y = 10.0f*sin(0.8f*anim) + 10.0f;
00365 lpos8.z = 10.0f*sin(0.8f*anim);
00366 }
00367 break;
00368 case VERT_WAVES:
00369
00370 break;
00371 case VERT_DISPLACE:
00372
00373
00374
00375
00376
00377
00378
00379 break;
00380 }
00381 }
00382
00383
00384
00385 void TestVert::SaveResults()
00386 {
00387 Test::SaveResults();
00388
00389 vert_rate = (total_verts * avg_fps)/1000000.0f;
00390
00391 if(type == VERT_LIGHTS)
00392 {
00393
00394 switch(curr_setup)
00395 {
00396 case 1:
00397 results<<"<vertex>\n"
00398 "<"<<testname<<">\n"
00399 "<light1>\n<fps>"<<avg_fps<<"</fps>\n<vert_rate>"<<vert_rate<<"</vert_rate>\n</light1>\n";
00400 test_score += avg_fps*5;
00401 break;
00402 case 2:
00403 results<<"<light4>\n<fps>"<<avg_fps<<"</fps>\n<vert_rate>"<<vert_rate<<"</vert_rate>\n</light4>\n";
00404 test_score += avg_fps*5;
00405 break;
00406 case 3:
00407 test_score += avg_fps*7;
00408
00409 cout<<"SCORE: "<<test_score<<endl;
00410 results<<"<light8>\n<fps>"<<avg_fps<<"</fps>\n<vert_rate>"<<vert_rate<<"</vert_rate>\n</light8>\n"
00411 "<score>"<<test_score<<"</score>"
00412 "</"<<testname<<">\n";
00413 break;
00414 default: break;
00415 }
00416 }
00417 else if(type == VERT_DISPLACE)
00418 {
00419
00420 switch(curr_setup)
00421 {
00422 case 1:
00423 results<<"<"<<testname<<">\n"
00424 "<disp_off>\n<fps>"<<avg_fps<<"</fps>\n<vert_rate>"<<vert_rate<<"</vert_rate>\n</disp_off>\n";
00425 break;
00426 case 4:
00427
00428 test_score = avg_fps * 2;
00429 cout<<"SCORE: "<<test_score<<endl;
00430 results<<"<disp_on>\n<fps>"<<avg_fps<<"</fps>\n<vert_rate>"<<vert_rate<<"</vert_rate>\n</disp_on>\n"
00431 "<score>"<<test_score<<"</score>"
00432 "</"<<testname<<">\n"
00433 "</vertex>";
00434 break;
00435 default: break;
00436 }
00437 }
00438
00439 else
00440 {
00441
00442 test_score += vert_rate * 5.5f;
00443 cout<<"SCORE: "<<test_score<<endl;
00444 results<<"<"<<testname<<">\n"
00445 "<fps>"<<avg_fps<<"</fps><vert_rate>"<<vert_rate<<"</vert_rate>\n\n"
00446 "<score>"<<test_score<<"</score>"
00447 "</"<<testname<<">\n";
00448 }
00449 }