More bounding boxes

This commit is contained in:
Godzil
2020-02-28 18:33:59 +00:00
parent b4ae737b40
commit 307c125eba
19 changed files with 92 additions and 55 deletions

View File

@@ -30,7 +30,7 @@ public:
double maxCap;
Cone() : minCap(-INFINITY), maxCap(INFINITY), isClosed(false), Shape(SHAPE_CONE) { stats.addCone(); };
BoundingBox getBounds();
BoundingBox getLocalBounds();
bool haveFiniteBounds() { return !(isinf(this->minCap) || isinf(this->maxCap)); };
void dumpMe(FILE *fp);

View File

@@ -31,7 +31,7 @@ public:
Cylinder() : minCap(-INFINITY), maxCap(INFINITY), isClosed(false), Shape(SHAPE_CYLINDER) { stats.addCylinder(); };
BoundingBox getBounds();
BoundingBox getLocalBounds();
bool haveFiniteBounds() { return !(isinf(this->minCap) || isinf(this->maxCap)); };
void dumpMe(FILE *fp);

View File

@@ -38,6 +38,7 @@ public:
Shape *operator[](const int p) { return this->objectList[p]; }
Intersect intersect(Ray r);
BoundingBox getLocalBounds();
BoundingBox getBounds();
void updateBoundingBox();

View File

@@ -19,7 +19,7 @@ private:
public:
Plane() : Shape(SHAPE_PLANE) { stats.addPlane(); };
BoundingBox getBounds();
BoundingBox getLocalBounds();
bool haveFiniteBounds() { return false; };
};

View File

@@ -59,6 +59,7 @@ public:
Tuple normalAt(Tuple point);
/* Bounding box points are always world value */
virtual BoundingBox getLocalBounds();
virtual BoundingBox getBounds();
virtual bool haveFiniteBounds() { return true; };

View File

@@ -24,7 +24,7 @@ public:
public:
Triangle(Point p1, Point p2, Point p3);
BoundingBox getBounds();
BoundingBox getLocalBounds();
void dumpMe(FILE *fp);

View File

@@ -122,7 +122,7 @@ Tuple Cone::localNormalAt(Tuple point)
return Vector(point.x, y, point.z);
}
BoundingBox Cone::getBounds()
BoundingBox Cone::getLocalBounds()
{
BoundingBox ret;
@@ -130,11 +130,8 @@ BoundingBox Cone::getBounds()
double b = fabs(this->maxCap);
double limit = (a > b)?a:b;
ret.min = this->objectToWorld(Point(-limit, this->minCap, -limit));
ret.max = this->objectToWorld(Point(limit, this->maxCap, limit));
ret.min.fixPoint();
ret.max.fixPoint();
ret | Point(-limit, this->minCap, -limit);
ret | Point(limit, this->maxCap, limit);
return ret;
}

View File

@@ -108,15 +108,12 @@ Tuple Cylinder::localNormalAt(Tuple point)
return Vector(point.x, 0, point.z);
}
BoundingBox Cylinder::getBounds()
BoundingBox Cylinder::getLocalBounds()
{
BoundingBox ret;
ret.min = this->objectToWorld(Point(-1, this->minCap, -1));
ret.max = this->objectToWorld(Point(1, this->maxCap, 1));
ret.min.fixPoint();
ret.max.fixPoint();
ret | Point(-1, this->minCap, -1);
ret | Point(1, this->maxCap, 1);
return ret;
}

View File

@@ -116,6 +116,11 @@ bool Group::isEmpty()
return (this->objectCount == 0) && (this->unboxableObjectCount == 0);
}
BoundingBox Group::getLocalBounds()
{
return this->bounds;
}
BoundingBox Group::getBounds()
{
if (this->bounds.isEmpty()) { this->updateBoundingBox(); }

View File

@@ -35,15 +35,12 @@ Tuple Plane::localNormalAt(Tuple point)
return Vector(0, 1, 0);
}
BoundingBox Plane::getBounds()
BoundingBox Plane::getLocalBounds()
{
BoundingBox ret;
ret.min = this->objectToWorld(Point(-INFINITY, 0-getEpsilon(), -INFINITY));
ret.max = this->objectToWorld(Point(INFINITY, 0+getEpsilon(), INFINITY));
ret.min.fixPoint();
ret.max.fixPoint();
ret | Point(-INFINITY, 0-getEpsilon(), -INFINITY);
ret | Point(INFINITY, 0+getEpsilon(), INFINITY);
return ret;
}

View File

@@ -66,12 +66,25 @@ void Shape::setTransform(Matrix transform)
this->updateTransform();
}
BoundingBox Shape::getLocalBounds()
{
return BoundingBox(Point(-1, -1, -1), Point(1,1,1));
}
BoundingBox Shape::getBounds()
{
BoundingBox ret;
BoundingBox me = this->getLocalBounds();
ret | this->objectToWorld(Point(me.min.x, me.min.y, me.min.z));
ret | this->objectToWorld(Point(me.min.x, me.min.y, me.max.z));
ret | this->objectToWorld(Point(me.min.x, me.max.y, me.min.z));
ret | this->objectToWorld(Point(me.max.x, me.min.y, me.min.z));
ret | this->objectToWorld(Point(me.max.x, me.max.y, me.min.z));
ret | this->objectToWorld(Point(me.max.x, me.min.y, me.max.z));
ret | this->objectToWorld(Point(me.min.x, me.max.y, me.max.z));
ret | this->objectToWorld(Point(me.max.x, me.max.y, me.max.z));
ret.min = this->objectToWorld(Point(-1, -1, -1));
ret.max = this->objectToWorld(Point(1, 1, 1));
return ret;
}

View File

@@ -59,16 +59,13 @@ Tuple Triangle::localNormalAt(Tuple point)
return this->normal;
}
BoundingBox Triangle::getBounds()
BoundingBox Triangle::getLocalBounds()
{
BoundingBox ret;
ret | p1;
ret | p2;
ret | p3;
ret.min = this->objectToWorld(ret.min);
ret.max = this->objectToWorld(ret.max);
ret | this->objectToWorld(p1);
ret | this->objectToWorld(p2);
ret | this->objectToWorld(p3);
return ret;
}

View File

@@ -56,7 +56,6 @@ void Tuple::fixPoint()
void Tuple::fixVector()
{
if (isnan(this->x) || isnan(this->y) || isnan(this->z))
{
/* w is probably broken, so fix it */
@@ -66,5 +65,6 @@ void Tuple::fixVector()
bool Tuple::isRepresentable()
{
return !(isnan(this->x) || isnan(this->y) || isnan(this->z));
return !(isnan(this->x) || isnan(this->y) || isnan(this->z) ||
isinf(this->x) || isinf(this->y) || isinf(this->z));
}