test_render.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. /*
  2. * DoRayMe - a quick and dirty Raytracer
  3. * Render test for reflection 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(-5, 5, -5), Colour(1, 1, 1));
  30. w.addLight(&light);
  31. /* ----------------------------- */
  32. /* Environment */
  33. Plane p1 = Plane();
  34. p1.setTransform(translation(0, 0, 5) * rotationX(-M_PI/2));
  35. p1.material.pattern = new CheckersPattern(Colour(1, 1, 1), Colour(0.1, 0.1, 0.1));
  36. w.addObject(&p1);
  37. Plane p2 = Plane();
  38. p2.setTransform( translation(0, 0, -6) * rotationX(-M_PI/2) );
  39. p2.material.pattern = new CheckersPattern(Colour(1, 1, 1), Colour(0.1, 0.1, 0.1));
  40. w.addObject(&p2);
  41. Plane p3 = Plane();
  42. p3.setTransform(translation(-6, 0, 0) * rotationZ(M_PI/2) );
  43. p3.material.pattern = new CheckersPattern(Colour(1, 1, 1), Colour(0.1, 0.1, 0.1));
  44. w.addObject(&p3);
  45. Plane p4 = Plane();
  46. p3.setTransform(translation(6, 0, 0) * rotationZ(M_PI/2) );
  47. p3.material.pattern = new CheckersPattern(Colour(1, 1, 1), Colour(0.1, 0.1, 0.1));
  48. w.addObject(&p4);
  49. Plane p5 = Plane();
  50. p5.material.pattern = new CheckersPattern(Colour(1, 1, 1), Colour(0.1, 0.1, 0.1));
  51. w.addObject(&p5);
  52. /* ----------------------------- */
  53. /* Big Sphere */
  54. Sphere bigS = Sphere();
  55. bigS.setTransform(translation(-0.5, 1, 2) * scaling(2, 2, 2));
  56. bigS.material.colour = Colour(0, 0.4, 0.4);
  57. bigS.material.shininess = 50;
  58. bigS.material.specular = 1;
  59. bigS.material.reflective = 0.8;
  60. w.addObject(&bigS);
  61. /* Small Sphere */
  62. Sphere smaS = Sphere();
  63. smaS.setTransform(translation(2.2, 1, -1));
  64. smaS.material.colour = Colour(0.4, 0, 0.4);
  65. smaS.material.shininess = 50;
  66. smaS.material.specular = 1;
  67. smaS.material.reflective = 0.2;
  68. w.addObject(&smaS);
  69. /* Cylinder */
  70. Cylinder cyl = Cylinder();
  71. cyl.setTransform(translation(-3.5, 0, 1));
  72. cyl.isClosed = true;
  73. cyl.minCap = -1;
  74. cyl.maxCap = 3;
  75. cyl.material.colour = Colour(0.4, 1, 0.4);
  76. cyl.material.shininess = 20;
  77. cyl.material.specular = 1;
  78. cyl.material.reflective = 0.01;
  79. cyl.material.pattern = new GradientPattern(Colour(0.4, 1, 0.4), Colour(1.0, 0.2, 1.0));
  80. cyl.material.pattern->setTransform(scaling(1.1, 1.1, 1.1) * rotationY(M_PI / 2));
  81. w.addObject(&cyl);
  82. /* Cube */
  83. Cube cub = Cube();
  84. cub.setTransform(translation(0.6, 0.4, -1) * scaling(0.4, 0.4, 0.4) * rotationY(deg_to_rad(60)));
  85. cub.material.colour = Colour(1, 0, 0.4);
  86. cub.material.shininess = 50;
  87. cub.material.specular = 1;
  88. cub.material.reflective = 0.3;
  89. w.addObject(&cub);
  90. /* Glass cube */
  91. Cube gcub = Cube();
  92. gcub.setTransform(translation(-0.5, 0.6, -0.8) * scaling(0.6, 0.6, 0.6) * rotationY(deg_to_rad(40)));
  93. gcub.dropShadow = false;
  94. gcub.material.colour = Colour(0, 0.4, 0.1);
  95. gcub.material.specular = 1;
  96. gcub.material.shininess = 400;
  97. gcub.material.ambient = 0.1;
  98. gcub.material.diffuse = 0.3;
  99. gcub.material.reflective = 1;
  100. gcub.material.transparency = 1;
  101. gcub.material.refractiveIndex = 0.3;
  102. w.addObject(&gcub);
  103. /* ----------------------------- */
  104. /* Set the camera */
  105. Camera camera = Camera(40, 10, deg_to_rad(90));
  106. camera.setTransform(viewTransform(Point(-2, 2.5, -3.5),
  107. Point(2, 0, 3),
  108. Vector(0, 1, 0)));
  109. /* Now render it */
  110. Canvas image = camera.render(w, 20);
  111. image.SaveAsPNG("test_renter.png");
  112. return 0;
  113. }