ch13_test.cpp 5.7 KB

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