19 |
19 |
20 for (int i = 0; i < 3; i++) |
20 for (int i = 0; i < 3; i++) |
21 { |
21 { |
22 if (ray.dir.cell[i] == 0) { |
22 if (ray.dir.cell[i] == 0) { |
23 /* ray is parallel to these planes */ |
23 /* ray is parallel to these planes */ |
24 if (ray.a.cell[i] < L.cell[i] || ray.a.cell[i] > R.cell[i]) |
24 if (ray.a.cell[i] < L.cell[i] || ray.a.cell[i] > H.cell[i]) |
25 return false; |
25 return false; |
26 } else |
26 } else |
27 { |
27 { |
28 /* compute the intersection distance of the planes */ |
28 /* compute the intersection distance of the planes */ |
29 t1 = (L.cell[i] - ray.a.cell[i]) / ray.dir.cell[i]; |
29 t1 = (L.cell[i] - ray.a.cell[i]) / ray.dir.cell[i]; |
30 t2 = (R.cell[i] - ray.a.cell[i]) / ray.dir.cell[i]; |
30 t2 = (H.cell[i] - ray.a.cell[i]) / ray.dir.cell[i]; |
31 |
31 |
32 if (t1 > t2) |
32 if (t1 > t2) |
33 swap(t1, t2); |
33 swap(t1, t2); |
34 |
34 |
35 if (t1 > tnear) |
35 if (t1 > tnear) |
112 } |
112 } |
113 |
113 |
114 BBox Sphere::get_bbox() |
114 BBox Sphere::get_bbox() |
115 { |
115 { |
116 BBox bbox = BBox(); |
116 BBox bbox = BBox(); |
117 bbox.L.x = center.x - radius; |
117 bbox.L = center - radius; |
118 bbox.L.y = center.y - radius; |
118 //bbox.L.y = center.y - radius; |
119 bbox.L.z = center.z - radius; |
119 //bbox.L.z = center.z - radius; |
120 bbox.R.x = center.x + radius; |
120 bbox.H = center + radius; |
121 bbox.R.y = center.y + radius; |
121 //bbox.H.y = center.y + radius; |
122 bbox.R.z = center.z + radius; |
122 //bbox.H.z = center.z + radius; |
123 return bbox; |
123 return bbox; |
124 } |
124 } |
125 |
125 |
126 bool Plane::intersect(const Ray &ray, float &dist) |
126 bool Box::intersect(const Ray &ray, float &dist) |
127 { |
127 { |
128 float dir = dot(N, ray.dir); |
128 float b; |
129 if (dir != 0) |
129 return get_bbox().intersect(ray, dist, b); |
130 { |
130 } |
131 float newdist = -(dot(N, ray.a) + d) / dir; |
131 |
132 if (newdist > 0 && newdist < dist) { |
132 Vector3 Box::normal(Vector3 &P) |
133 dist = newdist; |
133 { |
134 return true; |
134 Vector3 N(0,1,0); |
135 } |
135 /*for (int i = 0; i < 3; i++) |
136 } |
136 { |
137 return false; |
137 if (P.cell[i] >= L.cell[i]-Eps && P.cell[i] <= L.cell[i]+Eps) |
138 } |
138 //if (P.cell[i] == L.cell[i]) |
139 |
139 { |
140 BBox Plane::get_bbox() |
140 N.cell[i] = -1.0; |
141 { |
141 break; |
142 return BBox(); |
142 } |
|
143 if (P.cell[i] >= H.cell[i]-Eps && P.cell[i] <= H.cell[i]+Eps) |
|
144 //if (P.cell[i] == H.cell[i]) |
|
145 { |
|
146 N.cell[i] = +1.0; |
|
147 break; |
|
148 } |
|
149 }*/ |
|
150 return N; |
143 } |
151 } |
144 |
152 |
145 // this initialization and following intersection methods implements |
153 // this initialization and following intersection methods implements |
146 // Fast Triangle Intersection algorithm from |
154 // Fast Triangle Intersection algorithm from |
147 // http://www.mpi-inf.mpg.de/~wald/PhD/ |
155 // http://www.mpi-inf.mpg.de/~wald/PhD/ |
231 if (C.x < bbox.L.x) bbox.L.x = C.x; |
239 if (C.x < bbox.L.x) bbox.L.x = C.x; |
232 if (B.y < bbox.L.y) bbox.L.y = B.y; |
240 if (B.y < bbox.L.y) bbox.L.y = B.y; |
233 if (C.y < bbox.L.y) bbox.L.y = C.y; |
241 if (C.y < bbox.L.y) bbox.L.y = C.y; |
234 if (B.z < bbox.L.z) bbox.L.z = B.z; |
242 if (B.z < bbox.L.z) bbox.L.z = B.z; |
235 if (C.z < bbox.L.z) bbox.L.z = C.z; |
243 if (C.z < bbox.L.z) bbox.L.z = C.z; |
236 bbox.R = A; |
244 bbox.H = A; |
237 if (B.x > bbox.R.x) bbox.R.x = B.x; |
245 if (B.x > bbox.H.x) bbox.H.x = B.x; |
238 if (C.x > bbox.R.x) bbox.R.x = C.x; |
246 if (C.x > bbox.H.x) bbox.H.x = C.x; |
239 if (B.y > bbox.R.y) bbox.R.y = B.y; |
247 if (B.y > bbox.H.y) bbox.H.y = B.y; |
240 if (C.y > bbox.R.y) bbox.R.y = C.y; |
248 if (C.y > bbox.H.y) bbox.H.y = C.y; |
241 if (B.z > bbox.R.z) bbox.R.z = B.z; |
249 if (B.z > bbox.H.z) bbox.H.z = B.z; |
242 if (C.z > bbox.R.z) bbox.R.z = C.z; |
250 if (C.z > bbox.H.z) bbox.H.z = C.z; |
243 return bbox; |
251 return bbox; |
244 }; |
252 }; |