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.
This commit is contained in:
@@ -26,23 +26,29 @@ CSG::CSG(OperationType operation, Shape *left, Shape *right) : Shape(SHAPE_CSG),
|
|||||||
|
|
||||||
Intersect CSG::localIntersect(Ray r)
|
Intersect CSG::localIntersect(Ray r)
|
||||||
{
|
{
|
||||||
int i;
|
return this->intersect(r);
|
||||||
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);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Intersect CSG::intersect(Ray r)
|
Intersect CSG::intersect(Ray r)
|
||||||
{
|
{
|
||||||
return localIntersect(r);
|
int i;
|
||||||
|
Intersect ret = Intersect();
|
||||||
|
|
||||||
|
if (this->bounds.intesectMe(r))
|
||||||
|
{
|
||||||
|
Intersect leftxs = this->left->intersect(r);
|
||||||
|
Intersect rightxs = this->right->intersect(r);
|
||||||
|
|
||||||
|
for (i = 0 ; i < rightxs.count() ; i++)
|
||||||
|
{
|
||||||
|
leftxs.add(rightxs[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
this->filterIntersections(leftxs, ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
Tuple CSG::localNormalAt(Tuple point, Intersection *hit)
|
Tuple CSG::localNormalAt(Tuple point, Intersection *hit)
|
||||||
|
|||||||
Reference in New Issue
Block a user