3 #include <hittable/hittable.hpp>
4 #include <camera/ray.hpp>
6 #include <math3d/vec3.hpp>
7 using namespace ptracey;
19 for (
const auto &obj : objs)
23 void clear() { objects.clear(); }
24 void add(shared_ptr<hittable>
object) {
25 objects.push_back(
object);
28 virtual bool hit(
const ray &r, Real t_min, Real t_max,
32 bounding_box(Real time0, Real time1,
33 aabb &output_box)
const override;
34 virtual Real pdf_value(
const vec3 &o,
35 const vec3 &v)
const override;
36 virtual vec3 random(
const vec3 &o)
const override;
39 std::vector<shared_ptr<hittable>> objects;
41 bool hittable_list::hit(
const ray &r, Real t_min,
44 auto hit_anything =
false;
45 auto closest_so_far = t_max;
47 for (
const auto &
object : objects) {
48 if (object->hit(r, t_min, closest_so_far, temp_rec)) {
50 closest_so_far = temp_rec.t;
57 bool hittable_list::bounding_box(Real time0, Real time1,
58 aabb &output_box)
const {
63 bool first_box =
true;
65 for (
const auto &
object : objects) {
66 if (!object->bounding_box(time0, time1, temp_box))
70 : surrounding_box(output_box, temp_box);
76 Real hittable_list::pdf_value(
const point3 &o,
77 const vec3 &v)
const {
78 auto weight = 1.0 / objects.size();
81 for (
const auto &
object : objects)
82 sum += weight *
object->pdf_value(o, v);
86 vec3 hittable_list::random(
const vec3 &o)
const {
87 auto int_size =
static_cast<int>(objects.size());
88 return objects[random_int(0, int_size - 1)]->random(o);