1 #ifndef INFINITEPLANE_HXX
2 #define INFINITEPLANE_HXX
3
4 #include "Box.hxx"
5 #include "Primitive.hxx"
6
7 class InfinitePlane : public Primitive
8 {
9 Vec3f normal, origin;
10 float numerator, denominator, t;
11
12 Box box;
13 public:
14 InfinitePlane(Vec3f origin, Vec3f normal, Shader *shader, PhotonDistributor *photon_distributor)
15 : Primitive(shader, photon_distributor), normal(normal), origin(origin)
16 {
17 Normalize(this->normal);
18
19 if (normal.x == 0)
20 {
21 box.Extend(Vec3f(origin.x, -Infinity, -Infinity));
22 box.Extend(Vec3f(origin.x, Infinity, Infinity));
23 }
24 else if (normal.y == 0)
25 {
26 box.Extend(Vec3f(-Infinity, origin.y, -Infinity));
27 box.Extend(Vec3f( Infinity, origin.y, Infinity));
28 }
29 else if (normal.z == 0)
30 {
31 box.Extend(Vec3f(-Infinity, -Infinity, origin.z));
32 box.Extend(Vec3f( Infinity, Infinity, origin.z));
33 }
34 else
35 {
36 box.Extend(Vec3f(-Infinity));
37 box.Extend(Vec3f( Infinity));
38 }
39 };
40
41 virtual ~InfinitePlane(){};
42
43 virtual bool Intersect(Ray &ray)
44 {
45 numerator = Dot(origin - ray.org, normal);
46 denominator = Dot( ray.dir, normal);
47
48 if (denominator != 0.0)
49 {
50 t = numerator / denominator;
51 if (t < ray.t && t > Epsilon)
52 {
53 ray.t = t;
54 ray.hit = this;
55 return true;
56 }
57 }
58
59 return false;
60 };
61
62 virtual Vec3f GetNormal(Ray &ray)
63 {
64 Vec3f normal = this->normal;
65 return normal;
66 };
67
68 virtual Box CalcBounds()
69 {
70 return Box();
71 }
72 };
73
74 #endif
syntax highlighted by Code2HTML, v. 0.9.1