Tracer
sphere.h
1 #ifndef sphere_h
2 #define sphere_h
3 
4 #include "hittable.h"
5 
6 class sphere : public hittable {
7 public:
8  vec3 center;
9  float radius;
10  material* mat;
11  __device__ sphere() {}
12  __device__ sphere(const vec3& a, float b, material* m) {
13  center = a;
14  radius = b;
15  mat = m;
16  }
17  __device__ bool hit(const ray& r, float min, float max, hit_record& rec) const {
18  float a = r.direction.dot(r.direction);//a=dot(direction,direction)
19  float b = r.direction.dot(r.origin - center);//2*dot(direction,orgin-center
20  float c = (r.origin - center).dot(r.origin - center) - radius * radius; //dot(orgin-center,orgin-center)-radius2
21  float discriminant = b * b - a * c;//b2-4ac
22  if (discriminant > 0) {//Does not intersect
23  float t = (-b - sqrt(discriminant)) / a;
24  if (t > min&& t < max) {
25  rec.t = t;
26  rec.p = r.position(t);
27  rec.n = (rec.p - center) / radius;
28  rec.mat = mat;
29  return true;
30  }
31  t = (-b + sqrt(discriminant)) / a;
32  if (t > min&& t < max) {
33  rec.t = t;
34  rec.p = r.position(t);
35  rec.n = (rec.p - center) / radius;
36  rec.mat = mat;
37  return true;
38  }
39  }
40  return false;
41  }
42 };
43 
44 
45 #endif
Definition: sphere.h:6
Definition: vec3.h:10
Definition: ray.h:4
Definition: material.h:11
Definition: hittable.h:8
Definition: hittable.h:15