TEST_FIXTURE(CharacteristicMatrixTestFixture, OneLayerTransmissionAndReflection) { const double pi = 3.1415926535897932384626; const complex <double> i(0.0, 1.0); double wavelength = 400e-9; double thickness = 913e-9; complex <double> index(1.55, 0.1); complex <double> index_before(1.2, 0.3); complex <double> index_after(1.1, 0.05); complex <double> wavenumber = 2.0 * pi * index / wavelength; complex <double> wavenumber_before = 2.0 * pi * index_before / wavelength; complex <double> wavenumber_after = 2.0 * pi * index_after / wavelength; complex <double> a_term = 0.25 * (1.0 * (exp(-i * wavenumber * thickness) + exp(i * wavenumber * thickness)) + wavenumber / wavenumber_before * (exp(-i * wavenumber * thickness) - exp(i * wavenumber * thickness)) + wavenumber_after / wavenumber * (exp(-i * wavenumber * thickness) - exp(i * wavenumber * thickness)) + wavenumber_after / wavenumber_before * (exp(-i * wavenumber * thickness) + exp(i * wavenumber * thickness))); complex <double> c_term = 0.25 * (1.0 * (exp(-i * wavenumber * thickness) + exp(i * wavenumber * thickness)) - wavenumber / wavenumber_before * (exp(-i * wavenumber * thickness) - exp(i * wavenumber * thickness)) + wavenumber_after / wavenumber * (exp(-i * wavenumber * thickness) - exp(i * wavenumber * thickness)) - wavenumber_after / wavenumber_before * (exp(-i * wavenumber * thickness) + exp(i * wavenumber * thickness))); double transmission = real(1.0 / a_term) * real(1.0 / a_term) + imag(1.0 / a_term) * imag(1.0 / a_term); double reflectivity = real(c_term / a_term) * real(c_term / a_term) + imag(c_term / a_term) * imag(c_term / a_term); HomogeneousCharacteristicMatrix glass(index, thickness, wavelength); CHECK_CLOSE(transmission, glass.TransmissionInEnvironment(index_before, index_after), 1e-16); CHECK_CLOSE(reflectivity, glass.ReflectivityInEnvironment(index_before, index_after), 1e-16); }
void drawClock(GLUquadricObj *quadObj, GLfloat shell_angle) { GLfloat spec1[] = { 1.0f, 1.0f, 1.0f, 1.0f }; glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, spec1); glColor3f(0.8f, 0.1f, 0.1f); body(quadObj); GLfloat spec2[] = { 0.8f, 0.2f, 0.2f, 1.0f }; glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, spec2); glColor3f(1.0f, 1.0f, 1.0f); glPushMatrix(); glTranslatef(1.0f, 0.0f, 0.0f); glRotatef(shell_angle, 0.0f, 1.0f, 0.0f); glTranslatef(-1.0f, 0.0f, 0.0f); shell(quadObj); glPopMatrix(); glPushMatrix(); glTranslatef(0.0f, 0.0f, -hFace); face(quadObj); glPopMatrix(); glass(quadObj); }
TEST_FIXTURE(CharacteristicMatrixTestFixture, ReflectionAndTransmissionAddToOne) { complex <double> index(1.55, 0.0); double wavelength = 400e-9; double thickness = 913e-9; HomogeneousCharacteristicMatrix glass(index, thickness, wavelength); CHECK_CLOSE(1.0, glass.TransmissionInEnvironment() + glass.ReflectivityInEnvironment(), 1e-16); }
void moviemen_buts(Widget iw_t, void * data, void * call_data) { /* remove the movie menu widget */ XtUnmanageChild(iw_moviemen); showbutx(NULL, NULL, NULL, TRUE); /* destroy the pixmap iglassav. */ glass(imagsav, iwin,0,0,FALSE, TRUE,(int *) 0,(int *) 0,FALSE); /* remove all translations from iw_win */ XtUninstallTranslations(iw_win); } /* end of moviemen_buts */
void mainLoop(SDL_Surface* screen, int x, int y, const int xC, const int yC, const int zC, int*** mapTable, int xSize, int ySize) { ///Chargement des images SDL_Surface* map [15] = {NULL}; map[0] = IMG_Load("graph/Pac/Wall.png"); map[1] = IMG_Load("graph/Pac/Coin.png"); SDL_Surface* tmp = IMG_Load("graph/Pac/Glass.png"); map[2] = SDL_DisplayFormat(tmp); SDL_FreeSurface(tmp); SDL_Surface* uP = IMG_Load("graph/Pac/Main/Up.png"); SDL_Surface* dP = IMG_Load("graph/Pac/Main/Down.png"); SDL_Surface* rP = IMG_Load("graph/Pac/Main/Right.png"); SDL_Surface* lP = IMG_Load("graph/Pac/Main/Left.png"); SDL_Surface** Papercraft = &uP; Block glass(1,1,1,true,map[2]); ///Fin. ///Initialisation des positions. SDL_Rect position; position.x = (0); position.y = (0); SDL_Rect mainPosition; mainPosition.x = x; mainPosition.y = y; ///Fin. int score(0); bool done(false); bool start(false); SDL_EnableKeyRepeat(100, 100); ///Boucle principale. while (!done) { //Attente d'un événement SDL_Event event; while (SDL_PollEvent(&event)) { switch (event.type) //Verification du type { case SDL_QUIT: //Fenêtre fermé (croix rouge) done = true; break; // check for keypresses case SDL_KEYDOWN://Vérification du clavier 'touche pressé' if (event.key.keysym.sym == SDLK_ESCAPE) {done = true;} if (event.key.keysym.sym == SDLK_KP2) { switch (mapTable[mainPosition.x][mainPosition.y+1][0]) { case '0': sKeyDown(&mainPosition); Papercraft = &dP; break; case 'c': sKeyDown(&mainPosition); Papercraft = &dP; score++; mapTable[mainPosition.x][mainPosition.y][0] = '0'; break; } } if (event.key.keysym.sym == SDLK_KP8) { switch(mapTable[mainPosition.x][mainPosition.y-1][0]) { case '0': zKeyDown(&mainPosition); Papercraft =&uP; break; case 'c': zKeyDown(&mainPosition); Papercraft =&uP; score++; mapTable[mainPosition.x][mainPosition.y][0] = '0'; break; } } if (event.key.keysym.sym == SDLK_KP4) { switch (mapTable[mainPosition.x-1][mainPosition.y][0]) { case '0': qKeyDown(&mainPosition); Papercraft =&lP; break; case 'c': qKeyDown(&mainPosition); Papercraft =&lP; score++; mapTable[mainPosition.x][mainPosition.y][0] = '0'; break; } } if (event.key.keysym.sym == SDLK_KP6) { switch(mapTable[mainPosition.x+1][mainPosition.y][0]) { case '0': dKeyDown(&mainPosition); Papercraft=&rP; break; case 'c': dKeyDown(&mainPosition); Papercraft=&rP; score++; mapTable[mainPosition.x][mainPosition.y][0] = '0'; break; } } start = true; break; } if (start)//Ne pas actualiser l'écran tant qu'une touche n'a pas été pressée. { screen = displayLoop(screen, xC, yC, zC, mapTable, xSize, ySize, position, mainPosition, &map[0], Papercraft, score, glass); SDL_Flip(screen); } } } ///Fin de la boucle. ///Libération de la mémoire. for (x=0;x<15;x++) { SDL_FreeSurface(map[x]); } SDL_FreeSurface(uP); SDL_FreeSurface(dP); SDL_FreeSurface(rP); SDL_FreeSurface(lP); }
int main(int argc, char* argv[]) { // Build your scene and setup your camera here, by calling // functions from Raytracer. The code here sets up an example // scene and renders it from two different view points, DO NOT // change this if you're just implementing part one of the // assignment. Raytracer raytracer; int width = 320; int height = 240; int aa = 2; int sceneNum = 0; double toRadian = 2*M_PI/360.0; fprintf(stderr, "Using options:\n"); #ifdef USE_EXTENDEDLIGHTS fprintf(stderr, "\tExtended light sources\n"); #else fprintf(stderr, "\tPoint light sources\n"); #endif #ifdef USE_REFRACTIONS fprintf(stderr, "\tRefractions\n"); #else fprintf(stderr, "\tNo refractions\n"); #endif #ifdef USE_REFLECTIONS fprintf(stderr, "\tReflections\n"); #else fprintf(stderr, "\tNo reflections\n"); #endif #ifdef IGNORE_SHADOWS fprintf(stderr, "\tNo shadows\n"); #else { #ifdef USE_TRANSMISSIONSHADOWS fprintf(stderr, "\tTransmission-based shadows\n"); #else fprintf(stderr, "\tSimple shadows\n"); #endif } #endif #ifdef USE_FINERFLUX fprintf(stderr, "\tFiner numerical flux intergrations\n"); #else fprintf(stderr, "\tCoarser numerical flux intergrations\n"); #endif if (argc == 3) { width = atoi(argv[1]); height = atoi(argv[2]); } else if (argc == 4) { width = atoi(argv[1]); height = atoi(argv[2]); aa = atoi(argv[3]); } else if (argc == 5) { width = atoi(argv[1]); height = atoi(argv[2]); aa = atoi(argv[3]); sceneNum = atoi(argv[4]); } // SceneNum should not exceed total scenes if ((sceneNum > 3)|| (sceneNum <0)) { sceneNum = 0; } // Camera parameters. Point3D eye(0, 0, 1); Vector3D view(0, 0, -1); Vector3D up(0, 1, 0); double fov = 60; // Defines materials for shading. Material gold( Colour(0.3, 0.3, 0.3), Colour(0.75164, 0.60648, 0.22648), Colour(0.628281, 0.555802, 0.366065), 51.2, 0.001, 0.0, 1/2.4 ); Material jade( Colour(0.22, 0.38, 0.33), Colour(0.52, 0.73, 0.57), Colour(0.316228, 0.316228, 0.316228), 12.8, 0.2 , 0.0, 0.0 ); Material polishedGold( Colour(0.24725, 0.2245, 0.0645), Colour(0.34615, 0.3143, 0.0903), Colour(0.797357, 0.723991, 0.208006), 83.2, 0.01,0.0,0.0); Material glass( Colour(0.15, 0.15, 0.15), Colour(0.08, 0.08, 0.08), Colour(0.2, 0.2, 0.2), 50.1,0.08,0.9,0.6667 ); Material glass1( Colour(0.2, 0.2, 0.2), Colour(0.2, 0.2, 0.2), Colour(0.7, 0.7, 0.7), 10.1,0.03,0.9,0.6667 ); Material steel( Colour(0.1, 0.1, 0.1), Colour(0.1, 0.1, 0.1), Colour(0.8, 0.8, 0.8), 80, 0.03, 0.0, 1.0 ); Material blueSolid( Colour(0, 0, 1), Colour(0, 0, 1), Colour(0, 0, 0), 0, 0.0, 0.0, 1.0 ); Material redSolid( Colour(1, 0, 0), Colour(1, 0, 0), Colour(0, 0, 0), 0, 0.0, 0.0, 1.0 ); Material chrome( Colour(0.25, 0.25, 0.25), Colour(0.4,0.4,0.4), Colour(0.7746, 0.7746, 0.7746), 77, 0.42, 0.0, 1.0); Material ruby( Colour(0.1745, 0.01175, 0.01175), Colour(0.61424, 0.04136, 0.04136), Colour(0.727811, 0.626959, 0.626959) , 76.8, 0.01, 0.0, 0.565); Material pearl( Colour(0.25, 0.20725, 0.20725), Colour(1, 0.829, 0.829), Colour(0.296648, 0.296648, 0.296648), 11.264, 0.1,0.0,1.0 ); Material silver(Colour(0.23125, 0.23125, 0.23125), Colour(0.2775, 0.2775, 0.2775), Colour(0.773911, 0.773911, 0.773911), 89.6, 0.4,0.0, 1.0); Material emerald(Colour(0.0215, 0.1745, 0.0215),Colour(0.07568, 0.61424, 0.07568), Colour(0.633, 0.727811, 0.633), 76.8, 0.1, 0.25, 0.637); Material brass(Colour(0.329412, 0.223529, 0.027451),Colour(0.780392, 0.568627, 0.113725), Colour(0.992157, 0.941176, 0.807843),27.8974, 0.3, 0.0, 1.0 ); Material bronze(Colour(0.2125, 0.1275, 0.054), Colour(0.714, 0.4284, 0.18144), Colour(0.393548, 0.271906, 0.166721), 25.6, 0.1, 0.0, 1.0 ); Material bronzeShiny(Colour(0.25, 0.148, 0.06475), Colour(0.4, 0.2368, 0.1036), Colour(0.774597, 0.458561, 0.200621), 76.86, 0.15, 0.0, 1.0 ); Material turquoise(Colour(0.1, 0.18725, 0.1745), Colour(0.396, 0.74151, 0.69102), Colour(0.297254, 0.30829, 0.306678), 12.8, 0.01, 0.2, 0.9); Material obsidian(Colour(0.05375, 0.05, 0.06625), Colour(0.18275, 0.17, 0.22525), Colour(0.332741, 0.328634, 0.346435), 38.4, 0.05, 0.18, 0.413); Material copper(Colour(0.19125, 0.0735, 0.0225), Colour(0.7038, 0.27048, 0.0828), Colour(0.256777, 0.137622, 0.086014), 12.8, 0.1, 0.0, 1.0 ); Material copperPolished(Colour(0.2295, 0.08825, 0.0275), Colour(0.5508, 0.2118, 0.066), Colour(0.580594, 0.223257, 0.0695701), 51.2, 0.15, 0.0, 1.0 ); Material pewter(Colour(0.105882, 0.058824, 0.113725), Colour(0.427451, 0.470588, 0.541176), Colour(0.333333, 0.333333, 0.521569), 9.84615, 0.0, 0.0, 1.0 ); // Light Sources //===================== //raytracer.addLightSource( new PointLight(Point3D(1, 1, 2),Colour(0.5, 0.5, 0.5)) ); #ifdef USE_EXTENDEDLIGHTS // Defines a ball light source raytracer.addLightSource( new BallLight(Point3D(-1, 1, 1), 2.0, Colour(0.9, 0.9, 0.9), 4) ); #else // Defines a point light source. raytracer.addLightSource( new PointLight(Point3D(0, 0, 5), Colour(0.9, 0.9,0.9) ) ); #endif if (sceneNum==0) { // Defines a point light source. //raytracer.addLightSource( new PointLight(Point3D(0, 0, 5), // Colour(0.9, 0.9, 0.9) ) ); // Add a unit square into the scene with material mat. SceneDagNode* sphere = raytracer.addObject( new UnitSphere(), &gold); SceneDagNode* plane = raytracer.addObject( new UnitSquare(), &jade ); // Apply some transformations to the unit square. double factor1[3] = { 1.0, 2.0, 1.0 }; double factor2[3] = { 6.0, 6.0, 1.0 }; double factor3[3] = { 4.0, 4.0, 4.0 }; double factor4[3] = { 3.7, 3.7, 3.7 }; raytracer.translate(sphere, Vector3D(0, 0, -5)); raytracer.rotate(sphere, 'x', -45); raytracer.rotate(sphere, 'z', 45); raytracer.scale(sphere, Point3D(0, 0, 0), factor1); raytracer.translate(plane, Vector3D(0, 0, -7)); raytracer.rotate(plane, 'z', 45); raytracer.scale(plane, Point3D(0, 0, 0), factor2); /* SceneDagNode* bigSphere = raytracer.addObject( new UnitSphere(), &glass1); raytracer.scale(bigSphere, Point3D(0, 0, 0), factor3); raytracer.translate(bigSphere, Vector3D(0, 0, -7)); SceneDagNode* bigSphere2 = raytracer.addObject( new UnitSphere(), &glass1); raytracer.scale(bigSphere2, Point3D(0, 0, 0), factor4); raytracer.translate(bigSphere2, Vector3D(0, 0, -7)); */ }// end of scene 0 if (sceneNum==1) { /* raytracer.addLightSource( new BallLight(Point3D(-1, 1, 1), 5.0, Colour(0.9, 0.9, 0.9), 0.888) ); raytracer.addLightSource( new PointLight(Point3D(0, 0, 2),Colour(0.5, 0.5, 0.5)) ); */ // Add a unit square into the scene with material mat. SceneDagNode* sphere = raytracer.addObject( new UnitSphere(), &glass); SceneDagNode* sphere1 = raytracer.addObject( new UnitSphere(), &brass); SceneDagNode* plane = raytracer.addObject( new UnitSquare(), &jade); SceneDagNode* cylinder = raytracer.addObject( new UnitCylinder(), &brass); // Apply some transformations to the unit square. double factor1[3] = { 1.0, 2.0, 1.0 }; double factor2[3] = { 6.0, 6.0, 1.0 }; double factor3[3] = { 0.5, 0.5, 2.0 }; raytracer.translate(sphere, Vector3D(0, 0, -5)); raytracer.rotate(sphere, 'x', -45); raytracer.rotate(sphere, 'z', 45); raytracer.scale(sphere, Point3D(0, 0, 0), factor1); raytracer.translate(sphere1, Vector3D(-2.5, 0, -5)); raytracer.translate(plane, Vector3D(0, 0, -7)); raytracer.rotate(plane, 'z', 45); raytracer.scale(plane, Point3D(0, 0, 0), factor2); raytracer.translate(cylinder, Vector3D(3, 0, -5)); //raytracer.rotate(cylinder, 'y', -20); raytracer.rotate(cylinder, 'z', 45); raytracer.rotate(cylinder, 'x', -75); raytracer.scale(cylinder, Point3D(0, 0, 0), factor3); }// end of scene1 //=============== Scene 2 ============================== //===================================================== if(sceneNum == 2) { /* raytracer.addLightSource( new BallLight(Point3D(-1, 1, 1), 5.0, Colour(0.9, 0.9, 0.9), 0.888) );*/ //raytracer.addLightSource( new PointLight(Point3D(0, 0, 2),Colour(0.5, 0.5, 0.5)) ); //Set up walls //======================================================== SceneDagNode* planeBack = raytracer.addObject( new UnitSquare(), &brass); SceneDagNode* planeBottom = raytracer.addObject( new UnitSquare(), &chrome); SceneDagNode* planeTop = raytracer.addObject( new UnitSquare(), &copperPolished); SceneDagNode* planeLeft = raytracer.addObject( new UnitSquare(), &bronzeShiny); SceneDagNode* planeRight = raytracer.addObject( new UnitSquare(), &brass); SceneDagNode* planeRear = raytracer.addObject( new UnitSquare(), &brass); double scaleFactor[3] = {8.0,8.0,1.0}; double scaleFactor1[3] = {20.01,20.01,1.0}; raytracer.translate(planeBottom, Vector3D(0, -10, 0)); raytracer.translate(planeTop, Vector3D(0, 10, 0)); raytracer.translate(planeLeft, Vector3D(-10, 0, 0)); raytracer.translate(planeRight, Vector3D(10, 0, 0)); raytracer.translate(planeBack, Vector3D(0, 0, -19.9)); raytracer.translate(planeBottom, Vector3D(0, 0, -10)); raytracer.translate(planeTop, Vector3D(0, 0, -10)); raytracer.translate(planeLeft, Vector3D(0, 0, -10)); raytracer.translate(planeRight, Vector3D(0, 0, -10)); raytracer.translate(planeRear, Vector3D(0, 0, 20)); raytracer.rotate(planeTop, 'x', 90); raytracer.rotate(planeBottom, 'x',-90); raytracer.rotate(planeLeft, 'y', -90); raytracer.rotate(planeRight, 'y', 90); raytracer.rotate(planeRear, 'x', 180); raytracer.scale(planeBack, Point3D(0, 0, 0), scaleFactor1); raytracer.scale(planeBottom, Point3D(0, 0, 0), scaleFactor1); raytracer.scale(planeTop, Point3D(0, 0, 0), scaleFactor1); raytracer.scale(planeLeft, Point3D(0, 0, 0), scaleFactor1); raytracer.scale(planeRight, Point3D(0, 0, 0), scaleFactor1); raytracer.scale(planeRear, Point3D(0, 0, 0), scaleFactor1); //=========================================================== double scaleEgg[3] = { 1.0, 1.5, 1.0 }; double scaleBall[3] = {2,2,2}; SceneDagNode* sphere = raytracer.addObject( new UnitSphere(), &glass1); SceneDagNode* sphere1 = raytracer.addObject( new UnitSphere(), &ruby); SceneDagNode* sphere2 = raytracer.addObject( new UnitSphere(), &chrome); //SceneDagNode* cone = raytracer.addObject(sphere, new UnitCone(), &emerald); //raytracer.translate(cone, Vector3D(0,0,-2)); raytracer.translate(sphere, Vector3D(-1,-1,-11)); raytracer.scale(sphere, Point3D(0,0,0), scaleBall); raytracer.translate(sphere1, Vector3D(2.5,-1,-11)); raytracer.translate(sphere2, Vector3D(2,3,-11)); //raytracer.translate(cone, Vector3D(-1,-1,-12)); raytracer.rotate(sphere1, 'z', -45); raytracer.scale(sphere1, Point3D(0,0,0), scaleEgg); //raytracer.rotate(cone, 'x', 90); }//end of scene 2 //==================== Scene 3 ================= //=============================================== if(sceneNum == 3) { #ifdef USE_EXTENDEDLIGHTS raytracer.addLightSource( new BallLight(Point3D(-5, 5, -3), 2.0, Colour(0.4, 0.4, 0.4), 2) ); raytracer.addLightSource( new BallLight(Point3D(5, 5, -3), 2.0, Colour(0.4, 0.4, 0.4), 2) ); #else raytracer.addLightSource( new PointLight(Point3D(-5, 5, 0), Colour(0.5, 0.0, 0.0) ) ); raytracer.addLightSource( new PointLight(Point3D(5, 5, 0), Colour(0.0, 0.5, 0.0) ) ); raytracer.addLightSource( new PointLight(Point3D(0, -5, 0), Colour(0.0, 0.0, 0.5) ) ); #endif double planeScale[3] = {10.0, 10.0, 1.0}; double sphereScale[3]= {1.5,1.5,1.5}; double coneScale[3] = {1.5,1.5,5}; SceneDagNode* plane = raytracer.addObject( new UnitSquare(), &pearl); SceneDagNode* sphere1 = raytracer.addObject( new UnitSphere(), &chrome); SceneDagNode* sphere2 = raytracer.addObject( new UnitSphere(), &brass); //SceneDagNode* cone = raytracer.addObject( new UnitCone(), &turquoise); raytracer.translate(sphere1, Vector3D(1, 1.5, -6.5)); raytracer.translate(sphere2, Vector3D(-1, -1.5, -6.5)); raytracer.scale(sphere2, Point3D(0,0,0), sphereScale); raytracer.scale(sphere1, Point3D(0,0,0), sphereScale); raytracer.rotate(plane, 'z', 45); raytracer.scale(plane, Point3D(0,0,0), planeScale); raytracer.translate(plane, Vector3D(0, 0, -8)); /* raytracer.translate(cone, Vector3D(2.0,-1.0,-3)); raytracer.rotate(cone, 'x', 180); raytracer.scale(cone, Point3D(0,0,0), coneScale); */ } // Render the scene, feel free to make the image smaller for // testing purposes. raytracer.render(width, height, eye, view, up, fov, aa, "sig1.bmp", 's'); //raytracer.render(width, height, eye, view, up, fov, aa, "diffuse1.bmp",'d'); //raytracer.render(width, height, eye, view, up, fov, aa, "view1.bmp",'p'); // Render it from a different point of view. Point3D eye2(4, 2, 1); Vector3D view2(-4, -2, -6); raytracer.render(width, height, eye2, view2, up, fov, aa, "sig2.bmp", 's'); //raytracer.render(width, height, eye2, view2, up, fov, aa, "diffuse2.bmp",'d'); //raytracer.render(width, height, eye2, view2, up, fov, aa, "view2.bmp",'p'); Point3D eye3(-4, -2, 1); Vector3D view3(4, 2, -6); raytracer.render(width, height, eye3, view3, up, fov, aa, "sig3.bmp", 's'); //raytracer.render(width, height, eye3, view3, up, fov, aa, "diffuse3.bmp",'d'); raytracer.render(width, height, eye3, view3, up, fov, aa, "view3.bmp",'p'); return 0; }
int main(int argc, char* argv[]) { // Build your scene and setup your camera here, by calling // functions from Raytracer. The code here sets up an example // scene and renders it from two different view points, DO NOT // change this if you're just implementing part one of the // assignment. Raytracer raytracer; int width = 320; int height = 240; if (argc == 3) { width = atoi(argv[1]); height = atoi(argv[2]); } /***********************************************************Testing ******************************** // Camera parameters. Point3D eye(0, 0, 1); Vector3D view(0, 0, -1); Vector3D up(0, 1, 0); double fov = 60; // Defines a material for shading. Material gold( Colour(0.3, 0.3, 0.3), Colour(0.75164, 0.60648, 0.22648), Colour(0.628281, 0.555802, 0.366065), 51.2,0.3,0,NULL ); Material jade( Colour(0, 0, 0), Colour(0.54, 0.89, 0.63), Colour(0.316228, 0.316228, 0.316228), 12.8,0.3,0,NULL); // Defines a point light source. raytracer.addLightSource( new PointLight(Point3D(0.0, 0, 5), Colour(0.9, 0.9, 0.9) ) ); // Add a unit square into the scene with material mat. SceneDagNode* sphere = raytracer.addObject( new UnitSphere(), &gold ); SceneDagNode* plane = raytracer.addObject( new UnitSquare(), &jade ); // Apply some transformations to the unit square. double factor1[3] = { 1.0, 2.0, 1.0 }; double factor2[3] = { 6.0, 6.0, 6.0 }; raytracer.translate(sphere, Vector3D(0, 0, -5)); raytracer.rotate(sphere, 'x', -45); raytracer.rotate(sphere, 'z', 45); raytracer.scale(sphere, Point3D(0, 0, 0), factor1); raytracer.translate(plane, Vector3D(0, 0, -7)); raytracer.rotate(plane, 'z', 45); raytracer.scale(plane, Point3D(0, 0, 0), factor2); // Render the scene, feel free to make the image smaller for // testing purposes. raytracer.render(width, height, eye, view, up, fov, "view4.bmp"); // Render it from a different point of view. Point3D eye2(4, 2, 1); Vector3D view2(-4, -2, -6); raytracer.render(width, height, eye2, view2, up, fov, "view5.bmp"); ***********************************************************Testing ********************************/ /***********************************************************Final Scene********************************/ // Camera parameters. // Point3D eye(0, 8, -3); // Vector3D view(0, -1,0); Point3D eye(0, 0, 1); Vector3D view(0, 0, -1); Vector3D up(0, 1, 0); double fov = 60; // Defines a material for shading. Material gold( Colour(0.3, 0.3, 0.3), Colour(0.75164, 0.60648, 0.22648), Colour(0.628281, 0.555802, 0.366065), 51.2,0.2,NULL); // Material jade( Colour(0, 0, 0), Colour(0.54, 0.89, 0.63), // Colour(0.316228, 0.316228, 0.316228), // 12.8,0.5,NULL); Material jade( Colour(0, 0, 0), Colour(0.47, 0.576, 0.859), Colour(0.316228, 0.316228, 0.316228), 12.8,0.5,NULL); Material red( Colour(0.3, 0.3, 0.3), Colour(1, 0, 0), Colour(0.628281, 0.555802, 0.366065), 51.2,0.2,NULL); Material white( Colour(0.3, 0.3, 0.3), Colour(1, 0.8549, 0.7255), Colour(0.628281, 0.555802, 0.366065), 51.2,0.2,NULL); Material pink( Colour(0.3, 0.3, 0.3), Colour(0.9412, 0.502, 0.502), Colour(0.628281, 0.555802, 0.366065), 51.2,0.2,NULL); Material mirror( Colour(0.0, 0.0, 0.0), Colour(0.0, 0.0, 0.0), Colour(0.0, 0.0, 0.0), 51.2,1,NULL); Material glass( Colour(0.3, 0.3, 0.3), Colour(1, 1, 1), Colour(0.628281, 0.555802, 0.366065), 51.2,0,1,NULL); glass.R_index = 1.3; glass.transparency_coef=1; // Defines a point light source. raytracer.addLightSource( new PointLight(Point3D(0, 0, 5), Colour(0.9, 0.9, 0.9) ) ); raytracer.addLightSource( new PointLight(Point3D(0, 6, -1), Colour(0.9, 0.3, 0.1) ) ); Material test( Colour(0.3, 0.3, 0.3), Colour(0.3, 0.60648, 0.22648), Colour(0.628281, 0.555802, 0.366065), 51.2 ,0.1,NULL); Material test3( Colour(0.3, 0.3, 0.3), Colour(0.3, 0.5, 0.22648), Colour(0.628281, 0.555802, 0.366065), 51.2,1,NULL ); Material test2( Colour(0, 0, 0), Colour(0.3, 0.3, 0.3), Colour(1.0, 1.0, 1.0), 51.2,0,NULL ); Texture sky("/Users/bingxu/Documents/graphics/COMP3271_assignment_4_template/raytracerMacOS/sky.bmp"); Texture board("/Users/bingxu/Documents/graphics/COMP3271_assignment_4_template/raytracerMacOS/board.bmp"); Material starrysky(Colour(0, 0, 0),Colour(0, 0, 0), Colour(0.1, 0.1, 0.1), 11.264, 0, &sky); Material board_mat(Colour(0, 0, 0),Colour(0, 0, 0), Colour(0.1, 0.1, 0.1), 11.264, 1, &board); SceneDagNode* plane = raytracer.addObject( new UnitSquare(), &jade ); SceneDagNode* plane1 = raytracer.addObject( new UnitSquare(), &jade ); SceneDagNode* plane2 = raytracer.addObject( new UnitSquare(), &board_mat );//the bottom SceneDagNode* sphere = raytracer.addObject( new UnitSphere(), &mirror); SceneDagNode* sphere1 = raytracer.addObject( new UnitSphere(), &white ); SceneDagNode* mars = raytracer.addObject( new UnitSphere(), &glass ); SceneDagNode* earth = raytracer.addObject( new UnitSphere(), &pink ); SceneDagNode* cylinder1 = raytracer.addObject( new UnitFiniteCylinder(), &gold ); SceneDagNode* cylinder2 = raytracer.addObject( new UnitFiniteCylinder(), &gold ); SceneDagNode* cylinder3 = raytracer.addObject( new UnitFiniteCylinder(), &gold ); SceneDagNode* cone = raytracer.addObject( new UnitFiniteCone(), &red ); double factor1[3] = { 2.0, 2.0, 2.0 }; double factor2[3] = {50,50,50}; double factor3[3] = { 1.0, 1.0, 1.0}; double factor4[3] = { 1.0, 2, 1.0}; double factor5[3] = {0.5,0.5,0.5}; double factor6[3] = {0.5,1.5,0.5}; double factor7[3] = {1.0,4.0,1.0}; //3 squares raytracer.translate(plane, Vector3D(0, 0, -15)); raytracer.scale(plane, Point3D(0, 0, 0), factor2); raytracer.translate(plane1, Vector3D(-15, 0, 0)); raytracer.rotate(plane1, 'y', 90); raytracer.scale(plane1, Point3D(0, 0, 0), factor2); raytracer.translate(plane2, Vector3D(0, -8, 0)); raytracer.rotate(plane2, 'x', -90); raytracer.scale(plane2, Point3D(0, 0, 0), factor2); //four balls raytracer.translate(sphere, Vector3D(-1, -6, -2)); raytracer.scale(sphere, Point3D(0, 0, 0), factor3); raytracer.translate(sphere1,Vector3D(-4.5, -6, 1)); raytracer.scale(sphere1, Point3D(0, 0, 0), factor3); raytracer.translate(mars, Vector3D(3, -3, -1)); raytracer.scale(mars, Point3D(0, 0, 0), factor3); raytracer.translate(earth, Vector3D(-8, -6, -2)); raytracer.scale(earth, Point3D(0, 0, 0), factor3); raytracer.rotate(cylinder1, 'z', -30); //raytracer.rotate(cylinder1, 'x', -15); raytracer.translate(cylinder1, Vector3D(0, -4, -2)); raytracer.scale(cylinder1, Point3D(0, 0, 0), factor7); raytracer.rotate(cylinder2, 'z', -30); raytracer.translate(cylinder2, Vector3D(1.5, -3, -2)); raytracer.scale(cylinder2, Point3D(0, 0, 0), factor6); raytracer.rotate(cylinder3, 'z', -30); raytracer.translate(cylinder3, Vector3D(-1.5, -3, -2)); raytracer.scale(cylinder3, Point3D(0, 0, 0), factor6); raytracer.rotate(cone, 'z', -30); raytracer.translate(cone, Vector3D(0, 2, -2)); raytracer.scale(cone, Point3D(0, 0, 0), factor4); std::clock_t start; double duration; start = std::clock(); // raytracer.render(width, height, eye, view, up, fov, "view4.bmp"); duration = ( std::clock() - start ) / (double) CLOCKS_PER_SEC; //std::cout<<"The rendering duration 1 is .......: "<< duration <<'\n'; // Render it from a different point of view. Point3D eye2(3, 1, 5); Vector3D view2(-10, -8, -15); std::clock_t start1; double duration1; start1 = std::clock(); raytracer.render(width, height, eye2, view2, up, fov, "view5.bmp"); duration1 = ( std::clock() - start1 ) / (double) CLOCKS_PER_SEC; // std::cout<<"The rendering duration 2 is .......: "<< duration1 <<'\n'; /***********************************************************Final Scene********************************/ return 0; }
void Panel::Draw() { //Draw panel KrRGBA *pixels = getCanvasResource()->Pixels(); ColorScheme* cs = get_color_scheme(); int width = Width(), height = Height(); if(flags.IsSet(FLAG_HASSHADOWS)) { width -= SHADOW_THICKNESS; height -= SHADOW_THICKNESS; } if(bInvertBevel) { KrRGBA aux; aux = colorUp; colorUp = colorDown; colorDown = aux; } //Fill background int i, j; for(j = 0; j < height; j++) { KrRGBA color(SlowCanvas::MixColors(Panel::getColorUp(), Panel::getColorDown(), j/(double)height)); for(i = 0; i < width; i++) { pixels[ j*Width() + i ] = color; } } //Glass effect if(height < 55) { KrRGBA glass(cs->editor_glass_r, cs->editor_glass_g, cs->editor_glass_b); int hm = height/2; for(j = 0; j < hm; j++) { for(i = 0; i < width; i++) { pixels[ j*Width() + i ] = SlowCanvas::MixColors(pixels[ j*Width() + i ], glass, .8*j/(double)hm); } } } KrRGBA colorBorder(cs->editor_border_r, cs->editor_border_g, cs->editor_border_b); //Horizontal lines for(i = 0; i < width; i++) { pixels[ i ] = colorBorder; pixels[ (height-1)*Width() + i ] = colorBorder; } //Vertical lines for(j = 0; j < height; j++) { pixels[ j*Width() ] = colorBorder; pixels[ j*Width() + (width-1) ] = colorBorder; } //Corner pixels pixels[ 1 + 1*Width() ] = colorBorder; pixels[ (width - 2) + 1*Width() ] = colorBorder; pixels[ (width - 2) + (height - 2)*Width() ] = colorBorder; pixels[ 1 + (height - 2)*Width() ] = colorBorder; //Restore colors if(bInvertBevel) { KrRGBA aux; aux = colorUp; colorUp = colorDown; colorDown = aux; } //Make trasparent corners KrRGBA transp(0, 0, 0, 0); pixels[ 0 + 0*Width() ] = transp; pixels[ 1 + 0*Width() ] = transp; pixels[ 0 + 1*Width() ] = transp; pixels[ (width - 1) + 0*Width() ] = transp; pixels[ (width - 2) + 0*Width() ] = transp; pixels[ (width - 1) + 1*Width() ] = transp; if(!flags.IsSet(FLAG_HASSHADOWS)) { pixels[ (width - 1) + (height - 1)*Width() ] = transp; pixels[ (width - 2) + (height - 1)*Width() ] = transp; pixels[ (width - 1) + (height - 2)*Width() ] = transp; } pixels[ 0 + (height - 1)*Width() ] = transp; pixels[ 1 + (height - 1)*Width() ] = transp; pixels[ 0 + (height - 2)*Width() ] = transp; if(flags.IsSet(FLAG_HASSHADOWS)) { KrRGBA colorShadow; double shadowFactor; colorShadow.c.red = cs->editor_shadow_r; colorShadow.c.green = cs->editor_shadow_g; colorShadow.c.blue = cs->editor_shadow_b; colorShadow.c.alpha = SHADOW_MAX; //Corner pixels[ (width - 1) + (height - 1)*Width() ] = colorShadow; pixels[ (width - 2) + (height - 1)*Width() ] = colorShadow; pixels[ (width - 1) + (height - 2)*Width() ] = colorShadow; //Vertical shadow for(i = width; i < Width(); i++) { for(int j = SHADOW_THICKNESS; j < Height(); j++) { shadowFactor = 1.0 - (i - width)/(double)SHADOW_THICKNESS; shadowFactor *= (j >= height)?(1.0 - (j - height)/(double)SHADOW_THICKNESS):1.0; shadowFactor *= (j - SHADOW_THICKNESS < SHADOW_FADE)?(j - SHADOW_THICKNESS)/(double)SHADOW_FADE:1.0; colorShadow.c.alpha = SHADOW_MAX*shadowFactor; pixels[ j*Width() + i ] = colorShadow; } } //Horizontal shadow for(i = SHADOW_THICKNESS; i < Width() - SHADOW_THICKNESS; i++) { for(int j = height; j < Height(); j++) { shadowFactor = 1.0 - (j - height)/(double)SHADOW_THICKNESS; shadowFactor *= (i - SHADOW_THICKNESS < SHADOW_FADE)?(i - SHADOW_THICKNESS)/(double)SHADOW_FADE:1.0; colorShadow.c.alpha = SHADOW_MAX*shadowFactor; pixels[ j*Width() + i ] = colorShadow; } } } getCanvasResource()->Refresh(); }
/* Set up display */ void display(void) { glClearColor(0.0, 0.0, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); //glColor4f(0.48627451, 0.223529412, 0.815686275, 1.0); glMatrixMode(GL_MODELVIEW); // Draw Glass glFrontFace(GL_CCW); glCullFace(GL_BACK); glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); glDisable(GL_BLEND); glass(1); glTranslatef(0,0.4,0); glCullFace(GL_FRONT); donut(1); glCullFace(GL_BACK); glTranslatef(0,-0.4,0); // Draw Table glEnable(GL_STENCIL_TEST); glStencilFunc(GL_ALWAYS, 1, 1); glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); table(); // Draw Reflections glClear(GL_DEPTH_BUFFER_BIT); glStencilFunc(GL_EQUAL, 1, 1); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glScalef(1, 1, -1); glLightfv(GL_LIGHT0, GL_POSITION, light0_position); glCullFace(GL_FRONT); glass(1); glTranslatef(0,.4,0); glCullFace(GL_BACK); donut(1); glCullFace(GL_FRONT); glTranslatef(0,-.4,0); glMatrixMode(GL_MODELVIEW); glPopMatrix(); glLightfv(GL_LIGHT0, GL_POSITION, light0_position); glCullFace(GL_BACK); // Alpha Blend Table glClear(GL_DEPTH_BUFFER_BIT); glStencilFunc(GL_EQUAL, 1, 1); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); glEnable(GL_BLEND); glBlendColor(1,1,1,0.4); glBlendFunc(GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA); table(); glDisable(GL_BLEND); // Draw Shadow glClear(GL_DEPTH_BUFFER_BIT); glDisable(GL_LIGHTING); glDisable(GL_LIGHT0); glEnable(GL_BLEND); glColor4f(0,0,0, 0.7); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glStencilFunc(GL_EQUAL, 1, 1); glStencilOp(GL_KEEP, GL_KEEP, GL_ZERO); glMatrixMode(GL_MODELVIEW); glPushMatrix(); shadowTransform(light0_position, tablePlane); glMultMatrixf((GLfloat *) shadowMatrix); glPolygonOffset(-1.0, -1.0); glEnable(GL_POLYGON_OFFSET_FILL); glass(0); glTranslatef(0,.4,0); glCullFace(GL_BACK); donut(0); glCullFace(GL_FRONT); glTranslatef(0,-.4,0); glDisable(GL_POLYGON_OFFSET_FILL); glMatrixMode(GL_MODELVIEW); glPopMatrix(); glDisable(GL_STENCIL_TEST); glDisable(GL_BLEND); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glutSwapBuffers(); }
void mag_pop(Widget iw_t, XEvent *event, String *params, Cardinal *num_params) { /* Get mouse position ix1,iy1. */ getloc( event, 'M', &ix1, &iy1 ); if ( !(strcmp(*params,"M")) && !leftdown ) /* Cursor moved. Erase and draw a new box */ { xorbox(iwin, icontxx, FALSE, ix1, iy1, magsizx, magsizy); } else if (!(strcmp(*params, "1"))) /* Left button pushed. */ /* Erase the old box first, draw a new one */ { xorbox(iwin, icontxx, 1, ix1, iy1,magsizx, magsizy); if (erase) XCopyArea(idispl, imagsav, iwin, icontx, ix3,iy3, lasmagx, lasmagy, ix3, iy3); /* Show magnified area */ glass(iwin, iwin, ix1, iy1, FALSE, FALSE, &ix2, &iy2, TRUE); leftdown = TRUE; } else if (!(strcmp(*params,"L"))) /* Left button up */ { /* Redraw the box */ xorbox(iwin, icontxx, 1, ix1, iy1, magsizx, magsizy); #ifndef WEB_TRUE xorbox(iwin, icontxx, 1, ix1, iy1, magsizx, magsizy); #endif /* Remember the last magnification varibles */ erase = 1; first = 0; lasmagx = magsizx * magfac; lasmagy = magsizy * magfac; ix3 = ix2; iy3 = iy2; leftdown = FALSE; } else if (!(strcmp(*params, "2"))) /* Center button pushed */ /* Make permanent magnification */ { xorbox(iwin, icontxx, 1, ix1, iy1, magsizx, magsizy); if (erase) XCopyArea(idispl, imagsav, iwin, icontx, ix3,iy3, lasmagx, lasmagy, ix3, iy3); /* Show magnified area */ glass(iwin, iwin, ix1, iy1, 1, FALSE, &ix2, &iy2, TRUE); /* Redraw the box */ xorbox(iwin, icontxx, 1, ix1, iy1,magsizx, magsizy); xorbox(iwin, icontxx, 1, ix1, iy1,magsizx, magsizy); /* Remember the last magnification varibles */ erase = 0; first = FALSE; leftdown = FALSE; } else if (!(strcmp(*params, "3"))) /* Right button pushed */ /* Stop this function call */ { if (erase) /* Replace the last temporary magnified area */ XCopyArea(idispl, imagsav, iwin, icontx, ix3,iy3, lasmagx, lasmagy,ix3, iy3); if (!first) /* Erase old box */ xorbox(iwin, icontxx, 1, ix1, iy1, magsizx, magsizy ); neednewmap = TRUE; leftdown = FALSE; XFlush( idispl ); XtUninstallTranslations(iw_win); glass(iwin, iwin, ix1, iy1, TRUE, 1, &ix2, &iy2, TRUE); /* Release GC */ XFreeGC(idispl, icontxx ); showbutx(NULL, NULL, NULL, 1); } }