]> Dogcows Code - chaz/rasterize/blobdiff - plane.hh
added texturing
[chaz/rasterize] / plane.hh
index 6190cf9227467d077d4f69d17899cbf20e98bb96..7271329040563ef797f826594783f9b84a5b75f8 100644 (file)
--- 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;
     }
 };
 
This page took 0.024542 seconds and 4 git commands to generate.