From a6655eebe2a69ee427264bd43df5747851ed96df Mon Sep 17 00:00:00 2001 From: hachem Date: Fri, 15 Aug 2025 03:18:29 +0200 Subject: feat: complete first geodesic 3D raytracing --- src/engine/object.h | 43 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 5 deletions(-) (limited to 'src/engine/object.h') diff --git a/src/engine/object.h b/src/engine/object.h index 5f5d86f..c45815b 100644 --- a/src/engine/object.h +++ b/src/engine/object.h @@ -10,7 +10,9 @@ namespace Donut glm::vec3 m_direction; glm::vec3 m_origin; - Ray(glm::vec3 o, glm::vec3 d); + Ray(glm::vec3 o, glm::vec3 d) + : m_origin(o), + m_direction(glm::normalize(d)) { } }; class Material @@ -20,7 +22,10 @@ namespace Donut float m_specular; float m_emission; - Material(glm::vec3 c, float s, float e); + Material(glm::vec3 c, float s, float e) + : m_color(c), + m_specular(s), + m_emission(e) { } }; class Object @@ -30,9 +35,37 @@ namespace Donut float m_radius; Material m_material; - Object(glm::vec3 c, float r, Material m); + Object(glm::vec3 c, float r, Material m) + : m_centre(c), + m_radius(r), + m_material(m) { } - bool intersect(Ray &ray, float &t); - glm::vec3 get_normal(glm::vec3 &point) const; + bool intersect(Ray &ray, float &t) + { + glm::vec3 oc = ray.m_origin - m_centre; + float a = glm::dot(ray.m_direction, ray.m_direction); + float b = 2.0f * glm::dot(oc, ray.m_direction); + float c = glm::dot(oc, oc) - m_radius * m_radius; + double discriminant = b*b - 4*a*c; + + if(discriminant < 0) + return false; + + float intercept = (-b - sqrt(discriminant)) / (2.0f*a); + if(intercept < 0) + { + intercept = (-b + sqrt(discriminant)) / (2.0f*a); + if(intercept<0) + return false; + } + + t = intercept; + return true; + } + + glm::vec3 get_normal(glm::vec3 &point) const + { + return glm::normalize(point - m_centre); + } }; }; -- cgit v1.3