浏览代码

Change CSG to derive the intersect function and do the calculation there instead of the local one.

Also use the bounding box to reject ray that don't it that CSG element.
Godzil 4 年之前
父节点
当前提交
1510de3b36
共有 1 个文件被更改,包括 17 次插入11 次删除
  1. 17 11
      source/shapes/csg.cpp

+ 17 - 11
source/shapes/csg.cpp

@@ -25,26 +25,32 @@ CSG::CSG(OperationType operation, Shape *left, Shape *right) : Shape(SHAPE_CSG),
 }
 
 Intersect CSG::localIntersect(Ray r)
+{
+    return this->intersect(r);
+}
+
+
+Intersect CSG::intersect(Ray r)
 {
     int i;
-    Intersect leftxs = this->left->intersect(r);
-    Intersect rightxs = this->right->intersect(r);
+    Intersect ret = Intersect();
 
-    for(i = 0; i < rightxs.count(); i++)
+    if (this->bounds.intesectMe(r))
     {
-        leftxs.add(rightxs[i]);
-    }
+        Intersect leftxs = this->left->intersect(r);
+        Intersect rightxs = this->right->intersect(r);
+
+        for (i = 0 ; i < rightxs.count() ; i++)
+        {
+            leftxs.add(rightxs[i]);
+        }
 
-    Intersect ret = this->filterIntersections(leftxs);
+        this->filterIntersections(leftxs, ret);
+    }
 
     return ret;
 }
 
-Intersect CSG::intersect(Ray r)
-{
-    return localIntersect(r);
-}
-
 Tuple CSG::localNormalAt(Tuple point, Intersection *hit)
 {
     return Vector(1, 0, 0);