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