save commit
[MicroTrace.git] / Box.cxx
diff --git a/Box.cxx b/Box.cxx
index ef9f750..9f1ca77 100644 (file)
--- a/Box.cxx
+++ b/Box.cxx
@@ -1,6 +1,12 @@
 #include "Box.hxx"
+#include "InfinitePlane.hxx"
 
-Box::Box()
+Box::Box() : m_min(Infinity, Infinity, Infinity),
+  m_max(-Infinity, -Infinity, -Infinity)
+{
+}
+
+Box::Box(Vec3f min, Vec3f max) : m_min(min), m_max(max)
 {
 }
 
@@ -10,11 +16,15 @@ Box::~Box()
 
 Box::Box(const Box& b)
 {
+  m_min = b.m_min;
+  m_max = b.m_max;
 }
 
 Box&
 Box::operator=(const Box& b)
 {
+  m_min = b.m_min;
+  m_max = b.m_max;
   return *this;
 }
 
@@ -26,9 +36,17 @@ Box::Clear()
 void
 Box::Extend(const Vec3f& a)
 {
+  // for all three coordinates, move m_max or m_min to the point
+  for(size_t i = 0; i < 3; i++) {
+    if(a[i] > m_max[i]) {
+      m_max[i] = a[i];
+    } else if(a[i] < m_min[i]) {
+      m_min[i] = a[i];
+    } // else: do nothing, coordinate is inside the box
+  }
 }
 
-void 
+void
 Box::Extend(const Box& box)
 {
 }
@@ -42,6 +60,48 @@ Box::Overlaps(const Box& b) const
 void
 Box::Clip(const Ray& ray, float& tnear, float& tfar) const
 {
+  // Note: equations here are the same as in InfinitePlane::Intersect()
+  // t = ((o-a)*n) / (d*n)
+  // o = ray.origin(), d = ray.direction(),
+  // n = surface normal of plane, a = anchor point of plane
+  Vec3f diff_min = m_min - ray.origin(); // o-a
+  Vec3f diff_max = m_max - ray.origin();
+
+  float cos_theta;
+  float tx_near, tx_far;
+
+  // clip along x axis
+  if(cos_theta = ray.direction().dot(Vec3f(1,0,0)) != 0) // if not parallel...
+    tx_near = diff_min.dot(Vec3f(1,0,0)) / cos_theta;
+  if(cos_theta = ray.direction().dot(Vec3f(1,0,0)) != 0)
+    tx_far = diff_max.dot(Vec3f(1,0,0)) / cos_theta;
+
+  // clip along y axis
+  if(cos_theta = ray.direction().dot(Vec3f(0,1,0)) != 0)
+    ty_near = diff_min.dot(Vec3f(0,1,0)) / cos_theta;
+  if(cos_theta = ray.direction().dot(Vec3f(0,0,1)) != 0)
+    ty_far = diff_max.dot(Vec3f(0,1,0)) / cos_theta;
+
+  // ray intersects box iff it intersects projection on xy plane
+  // in this case: tx_near <= ty_near <= tx_far  <= ty_far
+  //           or: tx_far  <= ty_near <= tx_near <= ty_far
+  //           or: tx_far  <= ty_far  <= tx_near <= ty_near
+  //           or: tx_near <= ty_far  <= tx_far  <= ty_near
+  if(tx_near <= ty_near && tx_far <= ty_near &&
+    tx_near <= ty_far && tx_far <= ty_far) {
+
+    // clip along z axis
+    if (cos_theta = ray.direction().dot(Vec3f(0, 1, 0)) != 0)
+      tz_near = diff_min.dot(Vec3f(0, 1, 0)) / cos_theta;
+    if (cos_theta = ray.direction().dot(Vec3f(0, 0, 1)) != 0)
+      tz_far = diff_max.dot(Vec3f(0, 1, 0)) / cos_theta;
+
+  } else {
+
+  }
+
+  //////////////////////////
+
 }
 
 const Vec3f&
This page took 0.020342 seconds and 4 git commands to generate.