-
Notifications
You must be signed in to change notification settings - Fork 0
/
Scene.cpp
42 lines (29 loc) · 1.22 KB
/
Scene.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include "Scene.h"
#include <utility>
namespace RayTracer {
Scene::Scene() = default;
Scene::Scene(std::vector<std::unique_ptr<Geometry>>&& objects) : objects(std::move(objects)) {}
Intersection Scene::intersect(const Ray& ray) const
{
if (objects.empty()) return {false, {}, std::numeric_limits<float>::infinity(), nullptr};
auto closestIntersection = Intersection{false, {}, std::numeric_limits<float>::infinity(), nullptr};
for (const auto& object : objects)
{
const auto newIntersection = object->intersect(ray);
if (newIntersection.exists && newIntersection.distance < closestIntersection.distance) closestIntersection = newIntersection;
}
return closestIntersection;
}
void Scene::addObject(Geometry* const object)
{
objects.emplace_back(object);
}
void Scene::addObjects(std::vector<std::unique_ptr<Geometry>>&& objects)
{
Scene::objects.insert(Scene::objects.end(), std::make_move_iterator(objects.begin()), std::make_move_iterator(objects.end()));
}
void Scene::setObjects(std::vector<std::unique_ptr<Geometry>>&& objects)
{
Scene::objects = std::move(objects);
}
} // RayTracer