#ifndef _PLANE_HH_
#define _PLANE_HH_
-#include "color.hh"
#include "element.hh"
*/
class plane : public element
{
-public:
+ vec_t norm;
+ scal_t dist;
- color_t material;
- vec_t normal;
- scal_t distance;
+public:
- plane(vec_t n, scal_t d, color_t color = COLOR_WHITE) :
- normal(n), distance(d), material(color)
+ plane(vec_t n, scal_t d) :
+ norm(n), dist(d)
{}
- plane(vec_t p, vec_t n, color_t color = COLOR_WHITE) :
- normal(vec_normalize(n)), distance(-vec_dot(normal, p)), material(color)
+ plane(vec_t p, vec_t n) :
+ norm(vec_normalize(n)), dist(-vec_dot(norm, p))
{}
- plane(vec_t a, vec_t b, vec_t c, color_t color = COLOR_WHITE) :
- normal(vec_normalize(vec_cross(vec_sub(b, a), vec_sub(c, a)))),
- distance(-vec_dot(normal, a)), material(color)
+ plane(vec_t a, vec_t b, vec_t c) :
+ norm(vec_normalize(vec_cross(vec_sub(b, a), vec_sub(c, a)))),
+ dist(-vec_dot(norm, a))
{}
virtual ~plane()
{}
- virtual bool intersect(ray_t ray, contact_t& hit) const
+ /*
+ * Get the normal vector of the plane.
+ */
+ vec_t normal() const
{
- // solve: [(ray.point + t*ray.direction) dot normal] + d = 0
+ return norm;
+ }
- scal_t denom = vec_dot(ray.d, normal);
+ virtual bool intersect(ray_t ray, contact_t& hit) const
+ {
+ scal_t denom = vec_dot(ray.d, norm);
// check for parallel condition
if (denom == S(0.0)) {
- if (scal_isequal(vec_dot(ray.o, normal), -distance)) {
+ if (scal_isequal(vec_dot(ray.o, norm), -dist)) {
hit.p = ray.o;
hit.d = S(0.0);
hit.n = VEC_ZERO;
return false; // no solution
}
- scal_t numer = vec_dot(ray.o, normal) + distance;
+ scal_t numer = vec_dot(ray.o, norm) + dist;
hit.d = -numer / denom;
if (hit.d < S(0.0)) {
return false;
hit.p = ray_solve(ray, hit.d);
if (S(0.0) <= numer) {
- hit.n = normal;
+ hit.n = norm;
}
else {
- hit.n = vec_neg(normal);
+ hit.n = vec_neg(norm);
}
return true;
}
- virtual color_t color(vec_t point) const
+ virtual vec_t txcoord(vec_t point) const
{
- return material;
+ vec_t uv = VEC_ZERO;
+
+ point.x *= S(0.3);
+ point.y *= S(0.3);
+ uv.x = point.x - scal_floor(point.x);
+ uv.y = point.z - scal_floor(point.z);
+
+ return uv;
}
};