ch13_cone.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. /*
  2. * DoRayMe - a quick and dirty Raytracer
  3. * Render test for cones in chapter 13.
  4. *
  5. * Created by Manoël Trapier
  6. * Copyright (c) 2020 986-Studio.
  7. *
  8. */
  9. #include <world.h>
  10. #include <light.h>
  11. #include <sphere.h>
  12. #include <plane.h>
  13. #include <cube.h>
  14. #include <cylinder.h>
  15. #include <cone.h>
  16. #include <material.h>
  17. #include <colour.h>
  18. #include <canvas.h>
  19. #include <camera.h>
  20. #include <pattern.h>
  21. #include <strippattern.h>
  22. #include <gradientpattern.h>
  23. #include <checkerspattern.h>
  24. #include <ringpattern.h>
  25. #include <transformation.h>
  26. int main()
  27. {
  28. World w = World();
  29. /* Add light */
  30. Light light = Light(POINT_LIGHT, Point(1, 6.9, -4.9), Colour(1, 1, 1));
  31. w.addLight(&light);
  32. /* ----------------------------- */
  33. /* The floor */
  34. Plane floor = Plane();
  35. floor.material.pattern = new CheckersPattern(Colour(0.5, 0.5, 0.5), Colour(0.75, 0.75, 0.75));
  36. floor.material.pattern->setTransform(rotationY(0.3) * scaling(0.25, 0.25, 0.25));
  37. w.addObject(&floor);
  38. Plane ceiling = Plane();
  39. ceiling.material.pattern = new CheckersPattern(Colour(0.5, 0.2, 0.5), Colour(0.75, 0.4, 0.75));
  40. ceiling.material.pattern->setTransform(rotationY(0.3));
  41. ceiling.setTransform(translation(0, 8, 0));
  42. w.addObject(&ceiling);
  43. /* ----------------------------- */
  44. Cone cyl1 = Cone();
  45. cyl1.minCap = -1;
  46. cyl1.maxCap = 0;
  47. cyl1.isClosed = true;
  48. cyl1.setTransform(translation(-1, 0, 1) * scaling(0.5, 1, 0.5) * translation(0, 1, 0));
  49. cyl1.material.colour = Colour(0, 1, 0.6);
  50. cyl1.material.diffuse = 0.1;
  51. cyl1.material.specular = 0.9;
  52. cyl1.material.shininess = 300;
  53. cyl1.material.reflective = 0.3;
  54. w.addObject(&cyl1);
  55. /* ----------------------------- */
  56. /* Concentrics */
  57. Cylinder cons1 = Cylinder();
  58. cons1.minCap = 0;
  59. cons1.maxCap = 0.2;
  60. cons1.isClosed = false;
  61. cons1.setTransform(translation(1, 0, 0) * scaling(0.8, 1, 0.8));
  62. cons1.material.colour = Colour(1, 1, 0.3);
  63. cons1.material.ambient = 0.1;
  64. cons1.material.diffuse = 0.8;
  65. cons1.material.specular = 0.9;
  66. cons1.material.shininess = 300;
  67. cons1.material.reflective = 0.2;
  68. w.addObject(&cons1);
  69. Cylinder cons2 = Cylinder();
  70. cons2.minCap = 0;
  71. cons2.maxCap = 0.3;
  72. cons2.isClosed = false;
  73. cons2.setTransform(translation(1, 0, 0) * scaling(0.6, 1, 0.6));
  74. cons2.material.colour = Colour(1, 0.9, 0.4);
  75. cons2.material.ambient = 0.1;
  76. cons2.material.diffuse = 0.8;
  77. cons2.material.specular = 0.9;
  78. cons2.material.shininess = 300;
  79. cons2.material.reflective = 0.2;
  80. w.addObject(&cons2);
  81. Cylinder cons3 = Cylinder();
  82. cons3.minCap = 0;
  83. cons3.maxCap = 0.4;
  84. cons3.isClosed = false;
  85. cons3.setTransform(translation(1, 0, 0) * scaling(0.4, 1, 0.4));
  86. cons3.material.colour = Colour(1, 0.8, 0.5);
  87. cons3.material.ambient = 0.1;
  88. cons3.material.diffuse = 0.8;
  89. cons3.material.specular = 0.9;
  90. cons3.material.shininess = 300;
  91. cons3.material.reflective = 0.2;
  92. w.addObject(&cons3);
  93. Cylinder cons4 = Cylinder();
  94. cons4.minCap = 0;
  95. cons4.maxCap = 0.5;
  96. cons4.isClosed = true;
  97. cons4.setTransform(translation(1, 0, 0) * scaling(0.2, 1, 0.2));
  98. cons4.material.colour = Colour(1, 0.7, 0.6);
  99. cons4.material.ambient = 0.1;
  100. cons4.material.diffuse = 0.8;
  101. cons4.material.specular = 0.9;
  102. cons4.material.shininess = 300;
  103. cons4.material.reflective = 0.2;
  104. w.addObject(&cons4);
  105. /* ----------------------------- */
  106. /* decoratives cylinders */
  107. Cylinder deco1 = Cylinder();
  108. deco1.minCap = 0;
  109. deco1.maxCap = 0.3;
  110. deco1.isClosed = true;
  111. deco1.setTransform(translation(0, 0, -0.75) * scaling(0.05, 1, 0.05));
  112. deco1.material.colour = Colour(1, 0, 0);
  113. deco1.material.ambient = 0.1;
  114. deco1.material.diffuse = 0.9;
  115. deco1.material.specular = 0.9;
  116. deco1.material.shininess = 300;
  117. deco1.material.reflective = 0.5;
  118. w.addObject(&deco1);
  119. Cylinder deco2 = Cylinder();
  120. deco2.minCap = 0;
  121. deco2.maxCap = 0.3;
  122. deco2.isClosed = true;
  123. deco2.setTransform(translation(0, 0, -2.25) * rotationY(-0.15) * translation(0, 0, 1.5) * scaling(0.05, 1, 0.05));
  124. deco2.material.colour = Colour(1, 1, 0);
  125. deco2.material.ambient = 0.1;
  126. deco2.material.diffuse = 0.9;
  127. deco2.material.specular = 0.9;
  128. deco2.material.shininess = 300;
  129. deco2.material.reflective = 0.5;
  130. w.addObject(&deco2);
  131. Cylinder deco3 = Cylinder();
  132. deco3.minCap = 0;
  133. deco3.maxCap = 0.3;
  134. deco3.isClosed = true;
  135. deco3.setTransform(translation(0, 0, -2.25) * rotationY(-0.3) * translation(0, 0, 1.5) * scaling(0.05, 1, 0.05));
  136. deco3.material.colour = Colour(0, 1, 0);
  137. deco3.material.ambient = 0.1;
  138. deco3.material.diffuse = 0.9;
  139. deco3.material.specular = 0.9;
  140. deco3.material.shininess = 300;
  141. deco3.material.reflective = 0.5;
  142. w.addObject(&deco3);
  143. Cylinder deco4 = Cylinder();
  144. deco4.minCap = 0;
  145. deco4.maxCap = 0.3;
  146. deco4.isClosed = true;
  147. deco4.setTransform(translation(0, 0, -2.25) * rotationY(-0.45) * translation(0, 0, 1.5) * scaling(0.05, 1, 0.05));
  148. deco4.material.colour = Colour(0, 1, 1);
  149. deco4.material.ambient = 0.1;
  150. deco4.material.diffuse = 0.9;
  151. deco4.material.specular = 0.9;
  152. deco4.material.shininess = 300;
  153. deco4.material.reflective = 0.5;
  154. w.addObject(&deco4);
  155. /* ----------------------------- */
  156. Cone glassCylinder = Cone();
  157. glassCylinder.minCap = 0.001;
  158. glassCylinder.maxCap = 1;
  159. glassCylinder.isClosed = true;
  160. glassCylinder.dropShadow = false;
  161. glassCylinder.setTransform(translation(0, 0, -1.5) * scaling(0.33, 1, 0.33));
  162. glassCylinder.material.colour = Colour(0.2, 0.63, 0.24);
  163. glassCylinder.material.diffuse = 0.1;
  164. glassCylinder.material.specular = 0.9;
  165. glassCylinder.material.shininess = 300;
  166. glassCylinder.material.reflective = 0.3;
  167. w.addObject(&glassCylinder);
  168. /* ----------------------------- */
  169. /* Set the camera */
  170. Camera camera = Camera(400, 200, 0.314);
  171. camera.setTransform(viewTransform(Point(8, 3.5, -9),
  172. Point(0, 0.3, 0),
  173. Vector(0, 1, 0)));
  174. /* Now render it */
  175. Canvas image = camera.render(w, 20);
  176. image.SaveAsPNG("ch13_cone.png");
  177. return 0;
  178. }