00001
00010 #ifdef MT_OPENMP
00011 #include <omp.h>
00012 #endif
00013
00017 #include <sstream>
00018 #include <iostream>
00019
00023 #include "Image.h"
00024
00028 #include "Object.h"
00029 #include "Scene.h"
00030 #include "Sphere.h"
00031
00035 #include "PerspectiveCamera.h"
00036 #include "CylindricCamera.h"
00037 #include "DepthOfFieldCamera.h"
00038
00042 #include "PointLight.h"
00043 #include "QuadAreaLight.h"
00044
00048 #include "Texture2D.h"
00049 #include "FlatShader.h"
00050 #include "DebugShader.h"
00051 #include "EdgeShader.h"
00052 #include "FlatTransparentShader.h"
00053 #include "MirrorShader.h"
00054 #include "EyeLightShader.h"
00055 #include "PhongShader.h"
00056 #include "CloudShader.h"
00057 #include "PlasmaShader.h"
00058 #include "MarbleShader.h"
00059 #include "BumpMappedDebugShader.h"
00060 #include "BumpMappedPhongShader.h"
00061 #include "BumpMappedMarblePhongShader.h"
00062 #include "TransparentShader.h"
00063 #include "UniAxialCrystalShader.h"
00064 #include "MixShader.h"
00065 #include "MapShader.h"
00066 #include "WoodShader.h"
00067 #include "BumpMappedWoodPhongShader.h"
00068 #include "GoldShader.h"
00069 #include "SilverShader.h"
00070 #include "SteelShader.h"
00071 #include "CopperShader.h"
00072
00076 #include "SampleGenerator.h"
00077 #include "RegularSampleGenerator.h"
00078 #include "RandomSampleGenerator.h"
00079 #include "StratifiedSampleGenerator.h"
00080 #include "PoissonDiskSampleGenerator.h"
00081
00082 using namespace std;
00083
00097 Object* AddObject(char* fileName, Scene& scene, bool useAcc = true, const Object::PrimitiveFactory& factory = Object::TriangleFactory() )
00098 {
00099 Object* obj = new Object(useAcc);
00100 obj->ParseOBJ(fileName, factory);
00101 obj->setColor(ColorRGBA(1,1,1));
00102 obj->BuildAccelStructure();
00103
00104 scene.AddObject(obj);
00105
00106 return obj;
00107 }
00108
00117 Object* AddSphere(Sphere* sphere, Scene& scene, bool useAcc = true)
00118 {
00119 Object* obj = new Object(useAcc);
00120 obj->Add(sphere);
00121 obj->setColor(Vector3D(1,1,1));
00122 obj->BuildAccelStructure();
00123
00124 scene.AddObject(obj);
00125
00126 return obj;
00127 }
00128
00144 void RenderFrame (Scene* scene, string prefix,
00145 Vector3D pos, Vector3D dir, float angle,
00146 int resX, int resY)
00147 {
00148
00149 stringstream s;
00150 s << prefix << scene->timer.GetTime() << ".png";
00151
00152
00153 printf("render %s (%dx%d)\n", s.str().c_str(), resX, resY);
00154
00155
00156 Image img(resX, resY);
00157
00158
00159 PerspectiveCamera camera(pos, dir, Vector3D(0,1,0), angle, resX, resY);
00160
00161 #ifdef MT_OPENMP
00162 #pragma omp parallel
00163 {
00164 #pragma omp for schedule(dynamic) nowait
00165 #endif
00166
00167
00168 for (int y=0; y < resY; y++) {
00169 for (int x=0; x < resX; x++) {
00170
00171 Ray ray = camera.InitRay(x, y);
00172
00173
00174 ColorRGBA color = scene->RayTrace(ray);
00175 color.normalize();
00176 img.setPixel(color, x, y);
00177 }
00178 }
00179
00180 #ifdef MT_OPENMP
00181 }
00182 #endif
00183
00184
00185 img.WritePNG(s.str().c_str());
00186 }
00187
00206 void RenderSupersampledFrame(Scene* scene, string prefix,
00207 Vector3D pos, Vector3D dir, float angle,
00208 int resX, int resY,
00209 const SampleGenerator& sampler = SampleGenerator(), int sampleCount = 1)
00210 {
00211
00212 stringstream s;
00213 s << prefix << scene->timer.GetTime() << ".png";
00214
00215
00216 printf("render supersampled %s (%dx%d)\n", s.str().c_str(), resX, resY);
00217
00218
00219 Image img(resX, resY);
00220
00221
00222 PerspectiveCamera camera(pos, dir, Vector3D(0,1,0), angle, resX, resY);
00223
00224 #ifdef MT_OPENMP
00225 #pragma omp parallel
00226 {
00227 #endif
00228
00229
00230 float* xv = new float[sampleCount];
00231 float* yv = new float[sampleCount];
00232 float* weight = new float[sampleCount];
00233
00234 #ifdef MT_OPENMP
00235 #pragma omp for schedule(dynamic) nowait
00236 #endif
00237
00238
00239 for (int y=0; y < resY; y++) {
00240 for (int x=0; x < resX; x++) {
00241 ColorRGBA color(0,0,0);
00242 sampler.GetSamples(sampleCount, xv, yv, weight);
00243 for (int s=0; s < sampleCount; s++) {
00244
00245 Ray ray = camera.InitRay(x + xv[s], y + yv[s]);
00246
00247
00248 color = color + weight[s] * scene->RayTrace(ray);
00249 }
00250 color.normalize();
00251 img.setPixel(color, x, y);
00252 }
00253 }
00254
00255
00256 delete [] xv;
00257 delete [] yv;
00258 delete [] weight;
00259
00260 #ifdef MT_OPENMP
00261 }
00262 #endif
00263
00264
00265 img.WritePNG(s.str().c_str());
00266 }
00267
00287 void RenderDepthOfFieldFrame(Scene* scene, string prefix,
00288 Vector3D pos, Vector3D dir, float angle,
00289 int resX, int resY,
00290 float lensRadius, float focalDistance,
00291 const SampleGenerator& sampler = SampleGenerator(), int sampleCount = 1)
00292 {
00293
00294 stringstream s;
00295 s << prefix << scene->timer.GetTime() << ".png";
00296
00297
00298 printf("render %s (%dx%d)\n", s.str().c_str(), resX, resY);
00299
00300
00301 Image img(resX, resY);
00302
00303 #ifdef MT_OPENMP
00304 #pragma omp parallel
00305 {
00306 #endif
00307
00308
00309 float* xv = new float[sampleCount];
00310 float* yv = new float[sampleCount];
00311 float* weight = new float[sampleCount];
00312
00313 #ifdef MT_OPENMP
00314 #pragma omp for schedule(dynamic) nowait
00315 #endif
00316
00317
00318 for (int y=0; y < resY; y++) {
00319 for (int x=0; x < resX; x++) {
00320 ColorRGBA color(0,0,0);
00321 sampler.GetSamples(sampleCount, xv, yv, weight);
00322 for (int s=0; s < sampleCount; s++) {
00323
00324 DepthOfFieldCamera camera(pos, dir, Vector3D(0,1,0), angle, resX, resY, lensRadius, focalDistance, xv[s], yv[s]);
00325
00326
00327 Ray ray = camera.InitRay(x, y);
00328
00329
00330 color = color + weight[s] * scene->RayTrace(ray);
00331 }
00332 color.normalize();
00333 img.setPixel(color, x, y);
00334 }
00335 }
00336
00337
00338 delete [] xv;
00339 delete [] yv;
00340 delete [] weight;
00341
00342 #ifdef MT_OPENMP
00343 }
00344 #endif
00345
00346
00347 img.WritePNG(s.str().c_str());
00348 }
00349
00350
00365 void RenderLinearFramePath (Scene* scene, string prefix,
00366 Vector3D pos, Vector3D dir, float angle,
00367 int resX, int resY,
00368 Vector3D path, int times)
00369 {
00370
00371 Image img(resX, resY);
00372
00373 for (int i=0; i < times; i++) {
00374
00375 stringstream s;
00376 s << prefix << scene->timer.GetTime() << ".png";
00377
00378
00379 printf("render %s (%dx%d)\n", s.str().c_str(), resX, resY);
00380
00381
00382 PerspectiveCamera camera(pos + i * path, dir, Vector3D(0,1,0), angle, resX, resY);
00383
00384 #ifdef MT_OPENMP
00385 #pragma omp parallel
00386 {
00387 #pragma omp for schedule(dynamic) nowait
00388 #endif
00389
00390
00391 for (int y=0; y < resY; y++) {
00392 for (int x=0; x < resX; x++) {
00393
00394 Ray ray = camera.InitRay(x, y);
00395
00396
00397 ColorRGBA color = scene->RayTrace(ray);
00398 color.normalize();
00399 img.setPixel(color, x, y);
00400 }
00401 }
00402
00403 #ifdef MT_OPENMP
00404 }
00405 #endif
00406
00407
00408 img.WritePNG(s.str().c_str());
00409
00410
00411 scene->timer.Tick();
00412 }
00413 }
00414
00428 void RenderStereoFrame (Scene* scene, string prefix,
00429 Vector3D pos, Vector3D dir, float angle,
00430 int resX, int resY,
00431 float distance = 0.01f)
00432 {
00433
00434 stringstream s;
00435 s << prefix << scene->timer.GetTime() << ".png";
00436
00437
00438 printf("render %s (%dx%d)\n", s.str().c_str(), resX, resY);
00439
00440
00441 Image img(resX, resY);
00442
00443
00444 Vector3D greenpos = pos + Vector3D(distance,0,0);
00445 Vector3D greendir = (pos + dir) - greenpos;
00446 PerspectiveCamera red(pos, dir, Vector3D(0,1,0), angle, resX, resY);
00447 PerspectiveCamera green(greenpos, greendir, Vector3D(0,1,0), angle, resX, resY);
00448
00449 #ifdef MT_OPENMP
00450 #pragma omp parallel
00451 {
00452 #pragma omp for schedule(dynamic) nowait
00453 #endif
00454
00455
00456 for (int y=0; y < resY; y++) {
00457 for (int x=0; x < resX; x++) {
00458
00459 Ray redray = red.InitRay(x, y);
00460 Ray greenray = green.InitRay(x, y);
00461
00462
00463 ColorRGBA color;
00464 color.red() = scene->RayTrace(redray).average();
00465 color.green() = scene->RayTrace(greenray).average();
00466 color.normalize();
00467 img.setPixel(color, x, y);
00468 }
00469 }
00470
00471 #ifdef MT_OPENMP
00472 }
00473 #endif
00474
00475
00476 img.WritePNG(s.str().c_str());
00477 }
00478
00487 void moveSphere(Sphere* sphere, float deltaRadius, float rotAngle, Vector3D posOffset)
00488 {
00489 rotAngle *= M_PI / 180;
00490 sphere->ChangeRadius(deltaRadius);
00491 Vector3D pos = sphere->GetPosition();
00492 sphere->SetPosition(Vector3D(posOffset.x() + (cos(rotAngle)*pos.x() + sin(rotAngle)*pos.z()), posOffset.y() + pos.y(), posOffset.z() + (-sin(rotAngle)*pos.x() + cos(rotAngle)*pos.z())));
00493 }
00494
00502 Vector3D rotateVec(Vector3D vec, float rotAngle)
00503 {
00504 rotAngle *= M_PI / 180;
00505 return Vector3D((cos(rotAngle)*vec.x() + sin(rotAngle)*vec.z()), vec.y(), (-sin(rotAngle)*vec.x() + cos(rotAngle)*vec.z()));
00506 }
00507
00513 void hideSphere(Sphere* sphere)
00514 {
00515 sphere->SetRadius(0.0);
00516 }
00517
00518 #define USE_KDTREE 1
00519
00531 int main(int argc, char **argv)
00532 {
00533 int toFrame=-1;
00534 int fromFrame=-1;
00535 int resX = 800;
00536 int resY = 600;
00537 int numSamples = 9;
00538 SampleGenerator* sampler = 0;
00539
00540 if (argc > 4)
00541 {
00542 fromFrame = atoi(argv[1]);
00543 toFrame = atoi(argv[2]);
00544 resX = atoi(argv[3]);
00545 resY = atoi(argv[4]);
00546
00547 if (argc >= 7)
00548 {
00549 if (strcmp(argv[5],"-super") == 0)
00550 {
00551 if (strcmp(argv[6],"stratified") == 0)
00552 sampler = new StratifiedSampleGenerator();
00553 else if (strcmp(argv[6],"random") == 0)
00554 sampler = new RandomSampleGenerator();
00555 else if (strcmp(argv[6],"regular") == 0)
00556 sampler = new RegularSampleGenerator();
00557 else if (strcmp(argv[6],"poisson") == 0)
00558 sampler = new PoissonDiskSampleGenerator();
00559 }
00560
00561 if (argc == 8)
00562 numSamples = atoi(argv[7]);
00563 }
00564 }
00565 else
00566 {
00567 std::cout << "Usage: ./Animation fromFrame toFrame ResX ResY [-super (stratified|random|regular|poisson)]" << std::endl ;
00568 exit(0);
00569 }
00570
00571
00572 if ((toFrame < 0) || (fromFrame < 0))
00573 {
00574 std::cout << "Usage: ./Animation fromFrame toFrame ResX ResY [-super (stratified|random|regular|poisson)]" << std::endl ;
00575 exit(0);
00576 }
00577
00578
00579 Scene* scene = new Scene();
00580 scene->setBgColor(Vector3D(0.5,0.5,0.5));
00581
00582 QuadAreaLight* light1 = new QuadAreaLight(Vector3D(200.0,200.0,200.0), Vector3D(3, 3, 3), Vector3D(0.5,0,0.5), Vector3D(0,0.2,0.5));
00583 light1->SetNumberOfRays(16);
00584 scene->AddLight(light1);
00585 QuadAreaLight* light2 = new QuadAreaLight(Vector3D(100.0,100.0,100.0), Vector3D(-3, 3, -4), Vector3D(0.5,0,0.5), Vector3D(0,0.2,0.5));
00586 light2->SetNumberOfRays(16);
00587 scene->AddLight(light2);
00588 PointLight* light3 = new PointLight(Vector3D(0,5,5), ColorRGBA(0,0,0));
00589 scene->AddLight(light3);
00590 scene->castShadows = true;
00591
00592
00593
00594 Object* ground = AddObject("../objs/ground3.obj", *scene, USE_KDTREE, Object::TexturedSmoothTriangleFactory());
00595 Texture* bumptex = new Texture2D("textures/bump.png");
00596 bumptex->setWrapMode(Texture::REPEAT);
00597 bumptex->setInterpolationMode(Texture::LINEAR);
00598 Shader* groundshader = new BumpMappedMarblePhongShader(scene, ColorRGBA (0.8,0.8,0.85), 0, 1, 0, 5, bumptex, 0, Vector3D(0,0,0));
00599 ground->setShader(groundshader);
00600
00601
00602
00603 Object* skydome = AddObject("../objs/skydome3.obj", *scene, USE_KDTREE, Object::TexturedSmoothTriangleFactory());
00604 Shader* skyShader = new CloudShader(scene);
00605 skydome->setShader(skyShader);
00606
00607
00608 Sphere* dSphere = new Sphere(Vector3D(0,2,0), 0.4);
00609 Object* disco = AddSphere(dSphere, *scene, false);
00610 Shader* discoShader = new SteelShader(scene);
00611 disco->setShader(discoShader);
00612
00613
00614 Object* jonas = AddObject("../objs/jonas2.obj", *scene, USE_KDTREE, Object::TexturedSmoothTriangleFactory());
00615 Shader* jonasShader = new BumpMappedMarblePhongShader(scene, ColorRGBA (0.9,0.9,1), 0, 1, 0, 0.5, bumptex, -0.7, Vector3D(0,0,0));
00616 jonas->setShader(jonasShader);
00617 jonas->setVisible(false);
00618
00619 Object* simon = AddObject("../objs/simon2.obj", *scene, USE_KDTREE, Object::TexturedSmoothTriangleFactory());
00620 Shader* simonShader = new BumpMappedWoodPhongShader(scene, ColorRGBA(0.9,0.9,1), 0, 1, 0, 0.5, bumptex, 0, Vector3D(0,0,0));
00621 simon->setShader(simonShader);
00622 simon->setVisible(false);
00623
00624
00625 Sphere * sphere1 = new Sphere(Vector3D(1.5,0.3,0), 0);
00626 Sphere * sphere2 = new Sphere(Vector3D(-1.5,0.3,0), 0);
00627 Sphere * sphere3 = new Sphere(Vector3D(0,0.3,1.5), 0);
00628 Sphere * sphere4 = new Sphere(Vector3D(0,0.3,-1.5), 0);
00629
00630 Sphere * sphere5 = new Sphere(Vector3D(0.75, 1.8,0), 0);
00631 Sphere * sphere6 = new Sphere(Vector3D(-0.75, 1.8,0), 0);
00632 Sphere * sphere7 = new Sphere(Vector3D(0, 1.8,0.75), 0);
00633 Sphere * sphere8 = new Sphere(Vector3D(0, 1.8,-0.75), 0);
00634
00635 Object* objectSphere1 = AddSphere(sphere1, *scene, false);
00636 Object* objectSphere2 = AddSphere(sphere2, *scene, false);
00637 Object* objectSphere3 = AddSphere(sphere3, *scene, false);
00638 Object* objectSphere4 = AddSphere(sphere4, *scene, false);
00639 Object* objectSphere5 = AddSphere(sphere5, *scene, false);
00640 Object* objectSphere6 = AddSphere(sphere6, *scene, false);
00641 Object* objectSphere7 = AddSphere(sphere7, *scene, false);
00642 Object* objectSphere8 = AddSphere(sphere8, *scene, false);
00643
00644 Shader* sphereShader1 = new TransparentShader(scene,1,1.5);
00645 objectSphere1->setShader(sphereShader1);
00646 objectSphere2->setShader(sphereShader1);
00647 objectSphere3->setShader(sphereShader1);
00648 objectSphere4->setShader(sphereShader1);
00649 Shader* sphereShader2 = new SilverShader(scene);
00650 objectSphere5->setShader(sphereShader2);
00651 objectSphere6->setShader(sphereShader2);
00652 Shader* sphereShader3 = new CopperShader(scene);
00653 objectSphere7->setShader(sphereShader3);
00654 objectSphere8->setShader(sphereShader3);
00655
00656
00657 float angle = 2;
00658 angle *= M_PI / 180;
00659 float trans_fac = 0.007;
00660 float z=0;
00661
00662 Vector3D camera_pos(0,2,17);
00663 Vector3D camera_dir(0,-2,-17);
00664
00665 int tmp_i = 0;
00666 Vector3D tmp_v = Vector3D(0,0,0.005);
00667
00668 for (int i = 0; i < toFrame; ++i)
00669 {
00670
00671 if ( i >= fromFrame)
00672 {
00673 if (sampler == 0) {
00674 RenderFrame(scene, "../result/result", camera_pos, camera_dir, 70, resX, resY);
00675 }
00676 else
00677 {
00678 RenderSupersampledFrame(scene, "../result/result", camera_pos, camera_dir, 70, resX, resY, *sampler, numSamples);
00679 }
00680 }
00681
00682 scene->timer.Tick();
00683
00684
00687
00688
00689
00690 if (i < 71)
00691 {
00692 camera_pos += Vector3D(0,0,-0.15);
00693 camera_dir = - camera_pos;
00694 }
00695
00696 if (i < 100 && i >= 71)
00697 {
00698 tmp_i++;
00699 camera_pos += Vector3D(0,0,-0.15) + tmp_i * tmp_v;
00700 camera_dir = - camera_pos;
00701 }
00702
00703
00704 if ((i >= 100) && (i < 460))
00705 {
00706 int t = i-100;
00707 if ( t < 90)
00708 {
00709 moveSphere(sphere1, 0.002777, 2, Vector3D(0,0,0));
00710 moveSphere(sphere2, 0.002777, 2, Vector3D(0,0,0));
00711 moveSphere(sphere3, 0.002777, 2, Vector3D(0,0,0));
00712 moveSphere(sphere4, 0.002777, 2, Vector3D(0,0,0));
00713 }
00714 else if ( t < 180)
00715 {
00716 moveSphere(sphere1, 0.0, 2, Vector3D(0,0.002,0));
00717 moveSphere(sphere2, 0.0, 2, Vector3D(0,0.002,0));
00718 moveSphere(sphere3, 0.0, 2, Vector3D(0,0.002,0));
00719 moveSphere(sphere4, 0.0, 2, Vector3D(0,0.002,0));
00720
00721 moveSphere(sphere5, 0.001666, 4, Vector3D(0,-0.017, 0));
00722 moveSphere(sphere6, 0.001666, 4, Vector3D(0,-0.017, 0));
00723 moveSphere(sphere7, 0.001666, 4, Vector3D(0,-0.017, 0));
00724 moveSphere(sphere8, 0.001666, 4, Vector3D(0,-0.017, 0));
00725 }
00726 else if ( t < 270)
00727 {
00728 light3->changeIllumination(0.007*(float)(t-180));
00729 moveSphere(sphere1, 0.0, 2, Vector3D(0,0.002,0));
00730 moveSphere(sphere2, 0.0, 2, Vector3D(0,0.002,0));
00731 moveSphere(sphere3, 0.0, 2, Vector3D(0,0.002,0));
00732 moveSphere(sphere4, 0.0, 2, Vector3D(0,0.002,0));
00733
00734 moveSphere(sphere5, -0.001666, 4, Vector3D(0,0.017, 0));
00735 moveSphere(sphere6, -0.001666, 4, Vector3D(0,0.017, 0));
00736 moveSphere(sphere7, -0.001666, 4, Vector3D(0,0.017, 0));
00737 moveSphere(sphere8, -0.001666, 4, Vector3D(0,0.017, 0));
00738 }
00739 else
00740 {
00741 moveSphere(sphere1, 0.0, 2, Vector3D(0,0.002,0));
00742 moveSphere(sphere2, 0.0, 2, Vector3D(0,0.002,0));
00743 moveSphere(sphere3, 0.0, 2, Vector3D(0,0.002,0));
00744 moveSphere(sphere4, 0.0, 2, Vector3D(0,0.002,0));
00745
00746 moveSphere(sphere5, 0.001666, 4, Vector3D(0,-0.017, 0));
00747 moveSphere(sphere6, 0.001666, 4, Vector3D(0,-0.017, 0));
00748 moveSphere(sphere7, 0.001666, 4, Vector3D(0,-0.017, 0));
00749 moveSphere(sphere8, 0.001666, 4, Vector3D(0,-0.017, 0));
00750 }
00751 }
00752
00753 if ((i >= 460) && (i < 820))
00754 {
00755
00756 jonas->setVisible(true);
00757 simon->setVisible(true);
00758
00759
00760 int t = i-460;
00761 if ( t < 90)
00762 {
00763 moveSphere(sphere1, 0.0, 2, Vector3D(0,0,0));
00764 moveSphere(sphere2, 0.0, 2, Vector3D(0,0,0));
00765 moveSphere(sphere3, 0.0, 2, Vector3D(0,0,0));
00766 moveSphere(sphere4, 0.0, 2, Vector3D(0,0,0));
00767
00768 moveSphere(sphere5, -0.001666, 4, Vector3D(0,0.017, 0));
00769 moveSphere(sphere6, -0.001666, 4, Vector3D(0,0.017, 0));
00770 moveSphere(sphere7, -0.001666, 4, Vector3D(0,0.017, 0));
00771 moveSphere(sphere8, -0.001666, 4, Vector3D(0,0.017, 0));
00772 }
00773 else if ( t < 180)
00774 {
00775 moveSphere(sphere1, 0.0, 2, Vector3D(0,-0.002,0));
00776 moveSphere(sphere2, 0.0, 2, Vector3D(0,-0.002,0));
00777 moveSphere(sphere3, 0.0, 2, Vector3D(0,-0.002,0));
00778 moveSphere(sphere4, 0.0, 2, Vector3D(0,-0.002,0));
00779
00780 moveSphere(sphere5, 0.001666, 4, Vector3D(0,-0.017, 0));
00781 moveSphere(sphere6, 0.001666, 4, Vector3D(0,-0.017, 0));
00782 moveSphere(sphere7, 0.001666, 4, Vector3D(0,-0.017, 0));
00783 moveSphere(sphere8, 0.001666, 4, Vector3D(0,-0.017, 0));
00784 }
00785 else if ( t < 270)
00786 {
00787 moveSphere(sphere1, 0.0, 2, Vector3D(0,-0.002,0));
00788 moveSphere(sphere2, 0.0, 2, Vector3D(0,-0.002,0));
00789 moveSphere(sphere3, 0.0, 2, Vector3D(0,-0.002,0));
00790 moveSphere(sphere4, 0.0, 2, Vector3D(0,-0.002,0));
00791
00792 moveSphere(sphere5, -0.001666, 4, Vector3D(0,0.017, 0));
00793 moveSphere(sphere6, -0.001666, 4, Vector3D(0,0.017, 0));
00794 moveSphere(sphere7, -0.001666, 4, Vector3D(0,0.017, 0));
00795 moveSphere(sphere8, -0.001666, 4, Vector3D(0,0.017, 0));
00796 }
00797 else
00798 {
00799 moveSphere(sphere1, 0.0, 2, Vector3D(0,-0.002,0));
00800 moveSphere(sphere2, 0.0, 2, Vector3D(0,-0.002,0));
00801 moveSphere(sphere3, 0.0, 2, Vector3D(0,-0.002,0));
00802 moveSphere(sphere4, 0.0, 2, Vector3D(0,-0.002,0));
00803
00804 moveSphere(sphere5, 0.001666, 4, Vector3D(0,-0.017, 0));
00805 moveSphere(sphere6, 0.001666, 4, Vector3D(0,-0.017, 0));
00806 moveSphere(sphere7, 0.001666, 4, Vector3D(0,-0.017, 0));
00807 moveSphere(sphere8, 0.001666, 4, Vector3D(0,-0.017, 0));
00808 }
00809
00810 }
00811
00812 if ((i >= 820) && (i < 1200))
00813 {
00814 int t = i-820;
00815 if ( t < 90)
00816 {
00817 moveSphere(sphere1, -0.002777, 2, Vector3D(0,0,0));
00818 moveSphere(sphere2, -0.002777, 2, Vector3D(0,0,0));
00819 moveSphere(sphere3, -0.002777, 2, Vector3D(0,0,0));
00820 moveSphere(sphere4, -0.002777, 2, Vector3D(0,0,0));
00821
00822 moveSphere(sphere5, -0.001666, 4, Vector3D(0,0.0, 0));
00823 moveSphere(sphere6, -0.001666, 4, Vector3D(0,0.0, 0));
00824 moveSphere(sphere7, -0.001666, 4, Vector3D(0,0.0, 0));
00825 moveSphere(sphere8, -0.001666, 4, Vector3D(0,0.0, 0));
00826 }
00827
00828 if (i < 1000) {
00829
00830 camera_pos = 0.995*rotateVec(camera_pos, 1);
00831 camera_dir = -camera_pos;
00832 }
00833 else
00834 {
00835 camera_pos = rotateVec(camera_pos, 1);
00836 camera_dir = -camera_pos;
00837 }
00838 }
00841
00842 }
00843
00844 delete skyShader;
00845 delete discoShader;
00846 delete jonasShader;
00847 delete simonShader;
00848 delete sphereShader1;
00849 delete sphereShader2;
00850 delete sphereShader3;
00851
00852 delete bumptex;
00853 delete groundshader;
00854
00855
00856 std::cout << "\a\a\a\a\a" << std::endl;
00857
00858 }
00859