ch14_test.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. /*
  2. * DoRayMe - a quick and dirty Raytracer
  3. * Render test for Group and Bounding box in chapter 14.
  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 <group.h>
  20. #include <cone.h>
  21. #include <pattern.h>
  22. #include <strippattern.h>
  23. #include <gradientpattern.h>
  24. #include <checkerspattern.h>
  25. #include <ringpattern.h>
  26. #include <transformation.h>
  27. Shape *leg()
  28. {
  29. Group *ret = new Group();
  30. Sphere *s = new Sphere();
  31. s->setTransform(translation(0, 0, -1) * scaling(0.25, 0.25, 0.25));
  32. ret->addObject(s);
  33. Cylinder *cyl = new Cylinder();
  34. cyl->minCap = 0;
  35. cyl->maxCap = 1;
  36. cyl->isClosed = false;
  37. cyl->setTransform(translation(0, 0, -1) * rotationY(-0.5236) * rotationZ(-1.5708) * scaling(0.25, 1, 0.25));
  38. ret->addObject(cyl);
  39. return ret;
  40. }
  41. Shape *cap()
  42. {
  43. Group *ret = new Group();
  44. Cone *c = new Cone();
  45. c->minCap = -1;
  46. c->maxCap = 0;
  47. c->isClosed = false;
  48. c->setTransform(rotationX(-0.7854) * scaling(0.24606, 1.37002, 0.24606));
  49. ret->addObject(c);
  50. c = new Cone();
  51. c->minCap = -1;
  52. c->maxCap = 0;
  53. c->isClosed = false;
  54. c->setTransform(rotationY(1.0472) * rotationX(-0.7854) * scaling(0.24606, 1.37002, 0.24606));
  55. ret->addObject(c);
  56. c = new Cone();
  57. c->minCap = -1;
  58. c->maxCap = 0;
  59. c->isClosed = false;
  60. c->setTransform(rotationY(2.0944) * rotationX(-0.7854) * scaling(0.24606, 1.37002, 0.24606));
  61. ret->addObject(c);
  62. c = new Cone();
  63. c->minCap = -1;
  64. c->maxCap = 0;
  65. c->isClosed = false;
  66. c->setTransform(rotationY(3.1416) * rotationX(-0.7854) * scaling(0.24606, 1.37002, 0.24606));
  67. ret->addObject(c);
  68. c = new Cone();
  69. c->minCap = -1;
  70. c->maxCap = 0;
  71. c->isClosed = false;
  72. c->setTransform(rotationY(4.1888) * rotationX(-0.7854) * scaling(0.24606, 1.37002, 0.24606));
  73. ret->addObject(c);
  74. c = new Cone();
  75. c->minCap = -1;
  76. c->maxCap = 0;
  77. c->isClosed = false;
  78. c->setTransform(rotationY(5.236) * rotationX(-0.7854) * scaling(0.24606, 1.37002, 0.24606));
  79. ret->addObject(c);
  80. return ret;
  81. }
  82. Shape *wacky()
  83. {
  84. Group *ret = new Group();
  85. Shape *s;
  86. s = leg();
  87. ret->addObject(s);
  88. s = leg();
  89. s->setTransform(rotationY(1.0472));
  90. ret->addObject(s);
  91. s = leg();
  92. s->setTransform(rotationY(2.0944));
  93. ret->addObject(s);
  94. s = leg();
  95. s->setTransform(rotationY(3.1416));
  96. ret->addObject(s);
  97. s = leg();
  98. s->setTransform(rotationY(4.1888));
  99. ret->addObject(s);
  100. s = leg();
  101. s->setTransform(rotationY(5.236));
  102. ret->addObject(s);
  103. s = cap();
  104. s->setTransform(translation(0, 1, 0));
  105. ret->addObject(s);
  106. s = cap();
  107. s->setTransform(rotationX(3.1416) * translation(0, 1, 0));
  108. ret->addObject(s);
  109. return ret;
  110. }
  111. int main()
  112. {
  113. World w = World();
  114. /* Add lights */
  115. Light light1 = Light(POINT_LIGHT, Point(10000, 10000, -10000), Colour(0.25, 0.25, 0.25));
  116. w.addLight(&light1);
  117. Light light2 = Light(POINT_LIGHT, Point(-10000, 10000, -10000), Colour(0.25, 0.25, 0.25));
  118. w.addLight(&light2);
  119. Light light3 = Light(POINT_LIGHT, Point(10000, -10000, -10000), Colour(0.25, 0.25, 0.25));
  120. w.addLight(&light3);
  121. Light light4 = Light(POINT_LIGHT, Point(-10000, -10000, -10000), Colour(0.25, 0.25, 0.25));
  122. w.addLight(&light4);
  123. /* ----------------------------- */
  124. /* White background */
  125. Plane p = Plane();
  126. p.setTransform(translation(0, 0, 100) * rotationX(1.5708));
  127. p.material.colour = Colour(1, 1, 1);
  128. p.material.ambient = 1;
  129. p.material.diffuse = 0;
  130. p.material.specular = 0;
  131. w.addObject(&p);
  132. Shape *wa;
  133. wa = wacky();
  134. wa->setTransform(translation(-2.8, 0, 0) * rotationX(0.4363) * rotationY(0.1745));
  135. wa->material.colour = Colour(0.9, 0.2, 0.4);
  136. wa->material.ambient = 0.2;
  137. wa->material.diffuse = 0.8;
  138. wa->material.specular = 0.7;
  139. wa->material.shininess = 20;
  140. w.addObject(wa);
  141. wa = wacky();
  142. wa->setTransform(rotationY(0.1745));
  143. wa->material.colour = Colour(0.2, 0.9, 0.6);
  144. wa->material.ambient = 0.2;
  145. wa->material.diffuse = 0.8;
  146. wa->material.specular = 0.7;
  147. wa->material.shininess = 20;
  148. w.addObject(wa);
  149. wa = wacky();
  150. wa->setTransform(translation(2.8, 0, 0) * rotationX(-0.4363) * rotationY(-0.1745));
  151. wa->material.colour = Colour(0.2, 0.3, 1.0);
  152. wa->material.ambient = 0.2;
  153. wa->material.diffuse = 0.8;
  154. wa->material.specular = 0.7;
  155. wa->material.shininess = 20;
  156. w.addObject(wa);
  157. /* ----------------------------- */
  158. /* Set the camera */
  159. Camera camera = Camera(1000, 334, 0.9);
  160. camera.setTransform(viewTransform(Point(0, 0, -9),
  161. Point(0, 0, 0),
  162. Vector(0, 1, 0)));
  163. /* Now render it */
  164. Canvas image = camera.render(w, 5);
  165. image.SaveAsPNG("ch14_test.png");
  166. return 0;
  167. }