Advertisement
Guest User

raytracingesq

a guest
Jul 16th, 2013
596
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.09 KB | None | 0 0
  1. Color RayTrace(int depth, Color final_color, Scene ascene, vector<Object*> scene_objects, vector<Light*> light_sources, vector<float> intersections, Ray winning_ray, float index_of_winning_object){
  2.  
  3.     Vector3 camraydir=winning_ray.getRayDirection();
  4.     Vector3 camrayori=winning_ray.getRayOrigin();
  5.     Vector3 intersection_position=camrayori.vectAdd(camraydir.vectMult(intersections[index_of_winning_object]));
  6.     Vector3 intersecting_ray_direction=camraydir;
  7.     Vector3 winning_object_normal=scene_objects.at(index_of_winning_object)->getNormalAt(intersection_position);
  8.  
  9.     float material_index=scene_objects.at(index_of_winning_object)->getMaterialIndex();
  10.     Color diffuse_color=ascene.da_material[material_index].getDiffusal();
  11.     Color object_color=ascene.da_material[material_index].getAmbient();
  12.     Color ambient_color=ascene.da_ambient;
  13.     Color specular_color=ascene.da_material[material_index].getSpecular();
  14.  
  15.  
  16.     //=======REFLECTION=======//
  17.     //=======REFLECTION=======//
  18.     //=======REFLECTION=======//
  19.     /*
  20.     if(ascene.da_material[material_index].getSpecular().brightness()>0){
  21.         if(depth<1){
  22.             // reflection from objects with specular intensity
  23.             float dot1 = winning_object_normal.dot(intersecting_ray_direction.negative());
  24.             Vector3 scalar1 = winning_object_normal.vectMult(dot1);
  25.             Vector3 add1 = scalar1.vectAdd(intersecting_ray_direction);
  26.             Vector3 scalar2 = add1.vectMult(2);
  27.             Vector3 add2 = intersecting_ray_direction.negative().vectAdd(scalar2);
  28.             Vector3 reflection_direction = add2.normalize();
  29.  
  30.             Ray reflection_ray (intersection_position, reflection_direction);
  31.  
  32.             // determine what the ray intersects with first
  33.             vector<float> reflection_intersections;
  34.             for (int reflection_index = 0; reflection_index < scene_objects.size(); reflection_index++) {
  35.                 reflection_intersections.push_back(scene_objects.at(reflection_index)->findIntersection(reflection_ray));
  36.             }
  37.             int index_of_winning_object_with_reflection = winningObjectIndex(reflection_intersections);
  38.             if (index_of_winning_object_with_reflection != -1) {
  39.                 // reflection ray missed everthing else
  40.                 if (reflection_intersections.at(index_of_winning_object_with_reflection) > accuracy) {
  41.                     // determine the position and direction at the point of intersection with the reflection ray
  42.                     // the ray only affects the color if it reflected off something
  43.                     Vector3 reflection_intersection_position = intersection_position.vectAdd(reflection_direction.vectMult(reflection_intersections.at(index_of_winning_object_with_reflection)));
  44.                     Vector3 reflection_intersection_ray_direction = reflection_direction;
  45.                     depth++;
  46.                     Ray send_reflection_ray(reflection_intersection_position,reflection_intersection_ray_direction);
  47.                     Color reflection_intersection_color = RayTrace(depth, final_color, ascene, scene_objects, light_sources, intersections, send_reflection_ray, index_of_winning_object_with_reflection);
  48.  
  49.                     final_color.setColorRed(final_color.getColorRed()+reflection_intersection_color.getColorRed()*specular_color.getColorRed());
  50.                     final_color.setColorGreen(final_color.getColorGreen()+reflection_intersection_color.getColorGreen()*specular_color.getColorGreen());
  51.                     final_color.setColorBlue(final_color.getColorBlue()+reflection_intersection_color.getColorBlue()*specular_color.getColorBlue());
  52.                 }
  53.             }
  54.         }
  55.     }
  56. */
  57.     //=======DIFFUSE SHADING=======//
  58.     //=======DIFFUSE SHADING=======//
  59.     //=======DIFFUSE SHADING=======//
  60.     for(int k=0; k < light_sources.size(); k++){
  61.         //calculate diffuse shading
  62.         Vector3 light_direction=light_sources.at(k)->light_position.vectAdd(intersection_position.negative()).normalize();
  63.  
  64.         Color light_color=light_sources.at(k)->light_color;
  65.         float cosine_angle = winning_object_normal.dot(light_direction);
  66.  
  67.         if(fancybackground==true){
  68.             if(ascene.da_material[material_index].getspecExpP()==-1)
  69.             {
  70.                 //checkered/tile floor pattern
  71.                 int square=(int)floor(intersection_position.z()/100)+(int)floor(intersection_position.x()/100);
  72.                 //cout<<square<<endl;
  73.                 if((square % 2)== 0 ){
  74.                     //normal tile
  75.                     object_color.setColorRed(0);
  76.                     object_color.setColorGreen(0);
  77.                     object_color.setColorBlue(0);
  78.                 }
  79.                 else{
  80.                     //white tile
  81.                     object_color.setColorRed(1);
  82.                     object_color.setColorGreen(1);
  83.                     object_color.setColorBlue(1);
  84.                 }
  85.             }
  86.         }
  87.  
  88.         if(cosine_angle>0){
  89.             //Shadow
  90.             bool shadowed=false;
  91.             float distance_to_light=light_direction.length();
  92.             Ray shadow_ray(intersection_position, light_direction); //position negative yapınca shadow kapanıo
  93.  
  94.             vector<double> secondary_intersections;
  95.  
  96.             for (int m = 0; m < scene_objects.size() && shadowed == false; m++) {
  97.                 secondary_intersections.push_back(scene_objects.at(m)->findIntersection(shadow_ray));
  98.             }
  99.  
  100.             for (int c = 0; c < secondary_intersections.size(); c++) {
  101.                 if (secondary_intersections.at(c) > accuracy) {
  102.                     if (secondary_intersections.at(c) <= distance_to_light) {
  103.                         shadowed = true;
  104.                     }
  105.                 }
  106.                 break;
  107.             }
  108.  
  109.             if (shadowed == false) {
  110.                 //nonshadow
  111.                 float diffred=cosine_angle*diffuse_color.getColorRed();
  112.                 float diffgreen=cosine_angle*diffuse_color.getColorGreen();
  113.                 float diffblue=cosine_angle*diffuse_color.getColorBlue();
  114.  
  115.                 final_color.setColorRed(final_color.getColorRed()+diffred*light_color.getColorRed()/255*object_color.getColorRed());
  116.                 final_color.setColorGreen(final_color.getColorGreen()+diffgreen*light_color.getColorGreen()/255*object_color.getColorGreen());
  117.                 final_color.setColorBlue(final_color.getColorBlue()+diffblue*light_color.getColorBlue()/255*object_color.getColorBlue());
  118.  
  119.                 if(final_color.getColorRed()<ambient_color.getColorRed())
  120.                     final_color.setColorRed(final_color.getColorRed()+ambient_color.getColorRed()/255*object_color.getColorRed());
  121.                 if(final_color.getColorGreen()<ambient_color.getColorGreen())
  122.                     final_color.setColorGreen(final_color.getColorGreen()+ambient_color.getColorGreen()/255*object_color.getColorGreen());
  123.                 if(final_color.getColorBlue()<ambient_color.getColorBlue())
  124.                     final_color.setColorBlue(final_color.getColorBlue()+ambient_color.getColorBlue()/255*object_color.getColorBlue());
  125.                 //nonshadow
  126.                 //specular
  127.                 if (ascene.da_material[material_index].getSpecular().brightness()>0){
  128.                     // special [0-1]
  129.                     float dot1 = winning_object_normal.dot(intersecting_ray_direction.negative());
  130.                     Vector3 scalar1 = winning_object_normal.vectMult(dot1);
  131.                     Vector3 add1 = scalar1.vectAdd(intersecting_ray_direction);
  132.                     Vector3 scalar2 = add1.vectMult(2);
  133.                     Vector3 add2 = intersecting_ray_direction.negative().vectAdd(scalar2);
  134.                     Vector3 reflection_direction = add2.normalize();
  135.  
  136.                     float specular = reflection_direction.dot(light_direction);
  137.                     if (specular > 0) {
  138.                         specular = pow(specular, 10);
  139.  
  140.                         final_color.setColorRed(final_color.getColorRed()+specular*light_color.getColorRed()/255*specular_color.getColorRed());
  141.                         final_color.setColorGreen(final_color.getColorGreen()+specular*light_color.getColorGreen()/255*specular_color.getColorGreen());
  142.                         final_color.setColorBlue(final_color.getColorBlue()+specular*light_color.getColorBlue()/255*specular_color.getColorBlue());
  143.                     }
  144.                 }
  145.                 //specular
  146.             }else{
  147.                 final_color.setColorRed(final_color.getColorRed()+ambient_color.getColorRed()/255*object_color.getColorRed());
  148.                 final_color.setColorGreen(final_color.getColorGreen()+ambient_color.getColorGreen()/255*object_color.getColorGreen());
  149.                 final_color.setColorBlue(final_color.getColorBlue()+ambient_color.getColorBlue()/255*object_color.getColorBlue());
  150.             }
  151.             //Shadow
  152.  
  153.         }else{
  154.             final_color.setColorRed(final_color.getColorRed()+ambient_color.getColorRed()/255*object_color.getColorRed());
  155.             final_color.setColorGreen(final_color.getColorGreen()+ambient_color.getColorGreen()/255*object_color.getColorGreen());
  156.             final_color.setColorBlue(final_color.getColorBlue()+ambient_color.getColorBlue()/255*object_color.getColorBlue());
  157.         }
  158.     }
  159.  
  160.     return final_color;
  161. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement