X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=plane.hh;h=7271329040563ef797f826594783f9b84a5b75f8;hb=9f13ae5fe777dd4f7a9302f6dcf3e0d99a1ce65d;hp=6190cf9227467d077d4f69d17899cbf20e98bb96;hpb=a737ad45e690daa3b39b8885e2b6574d2ea48833;p=chaz%2Frasterize diff --git a/plane.hh b/plane.hh index 6190cf9..7271329 100644 --- a/plane.hh +++ b/plane.hh @@ -8,7 +8,6 @@ #ifndef _PLANE_HH_ #define _PLANE_HH_ -#include "color.hh" #include "element.hh" @@ -20,37 +19,42 @@ namespace rt { */ 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; @@ -59,7 +63,7 @@ public: 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; @@ -67,17 +71,24 @@ public: 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; } };