diff options
Diffstat (limited to 'src/engine/scene.h')
| -rw-r--r-- | src/engine/scene.h | 47 |
1 files changed, 24 insertions, 23 deletions
diff --git a/src/engine/scene.h b/src/engine/scene.h index 2ac9cd8..4b41203 100644 --- a/src/engine/scene.h +++ b/src/engine/scene.h @@ -7,63 +7,64 @@ namespace Donut { - class Scene + class Scene { public: - std::vector<Object> objs; - glm::vec3 m_light_pos; - - Scene() + Scene() : m_light_pos(5.0f, 5.0f, 5.0f) { } - - glm::vec3 trace(Ray &ray) + + auto trace(Ray& ray) -> glm::vec3 { float closest = std::numeric_limits<float>::infinity(); const Object* hit_obj = nullptr; - - for(auto& obj : objs) + + for (auto& obj : objs) { float t; - if(obj.intersect(ray, t)) - if(t < closest) + if (obj.intersect(ray, t)) + if (t < closest) { closest = t; hit_obj = &obj; } } - - if(hit_obj) + + if (hit_obj) { glm::vec3 hit_point = ray.m_origin + ray.m_direction * closest; glm::vec3 normal = hit_obj->get_normal(hit_point); glm::vec3 light_dir = glm::normalize(m_light_pos - hit_point); - + float diff = std::max(glm::dot(normal, light_dir), 0.0f); - + Ray shadow_ray(hit_point + normal * 0.001f, light_dir); bool in_shadow = false; - - for(auto& obj : objs) + + for (auto& obj : objs) { float t; - if(obj.intersect(shadow_ray, t)) + if (obj.intersect(shadow_ray, t)) { in_shadow = true; break; } } - + glm::vec3 color = hit_obj->m_material.m_color; float ambient = 0.1f; - - if (in_shadow) + + if (in_shadow) return color * ambient; return color * (ambient + diff * 0.9f); } - - return glm::vec3(0.0f, 0.0f, 0.1f); + + return glm::vec3(0.0f, 0.0f, 0.1f); } + + public: + std::vector<Object> objs; + glm::vec3 m_light_pos; }; }; |
