X-Git-Url: https://git.rohieb.name/MicroTrace.git/blobdiff_plain/13c3b8d1e2ecf7f1dbd02f9d4bfeb813b36fd40a..9fa235f6c621a9737be66359dc6bed473f1823d9:/Sphere.cxx diff --git a/Sphere.cxx b/Sphere.cxx index 77d4320..6b8d943 100644 --- a/Sphere.cxx +++ b/Sphere.cxx @@ -1,7 +1,7 @@ #include "Sphere.hxx" Sphere::Sphere(const Vec3f& center, float radius, Shader* shader) - : Primitive(shader), + : Primitive(shader), m_center(center), m_radius(radius) { @@ -20,39 +20,31 @@ Sphere::Intersect(Ray& ray) if( B*B-4*A*C < 0 ) return false; - + float root = sqrtf(B*B-4*A*C); float t = (-B-root)/(2.0f*A); if(t > ray.t()) return false; - - if( t < 1e-6 ) + + if( t < Epsilon ) { t = (-B+root)/(2.0f*A); - if( t < 1e-6 || t > ray.t()) + if( t < Epsilon || t > ray.t()) return false; } + ray.setT(t); + ray.setHit(this); + return true; } Vec3f Sphere::GetNormal(Ray& ray) { - // We don't want to modify the ray (probably this is not needed, but I am - // too lazy to think about it now ...) - Ray tempRay = ray; + Vec3f p = ray.origin()+ray.direction()*ray.t(); + Vec3f N = (p-m_center); + N.normalize(); - // Surface normal is the difference between intersection and center point - if(Intersect(tempRay)) { - // intersection point - Vec3f i = tempRay.origin() + tempRay.direction() * (tempRay.t() - Epsilon); - // normal - Vec3f n = (i - m_center); - n.normalize(); - return n; - } else { - // no intersection with ray, so no surface normal - return Vec3f(0,0,0); - } + return N; }