3c19afae61cee305ca3a305c0775f61b817bae82
[MicroTrace.git] / Sphere.cxx
1 #include "Sphere.hxx"
2
3 Sphere::Sphere(const Vec3f& center, float radius, Shader* shader)
4 : Primitive(shader),
5 m_center(center),
6 m_radius(radius)
7 {
8 }
9
10 Sphere::~Sphere()
11 {
12 }
13
14 bool
15 Sphere::Intersect(Ray& ray)
16 {
17 float A = ray.direction().dot(ray.direction());
18 float C = (ray.origin()-m_center).dot(ray.origin()-m_center) - m_radius*m_radius;
19 float B = 2 * ray.direction().dot(ray.origin()-m_center);
20
21 if( B*B-4*A*C < 0 )
22 return false;
23
24 float root = sqrtf(B*B-4*A*C);
25 float t = (-B-root)/(2.0f*A);
26 if(t > ray.t())
27 return false;
28
29 if( t < 1e-6 )
30 {
31 t = (-B+root)/(2.0f*A);
32 if( t < 1e-6 || t > ray.t())
33 return false;
34 }
35 ray.setT(t);
36 return true;
37 }
38
39 Vec3f
40 Sphere::GetNormal(Ray& ray)
41 {
42 return Vec3f();
43 }
This page took 0.042502 seconds and 3 git commands to generate.