diff options
Diffstat (limited to 'src/engine/object.h')
| -rw-r--r-- | src/engine/object.h | 43 |
1 files changed, 38 insertions, 5 deletions
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); + } }; }; |
