diff --git a/RayTracer/tools/AxisAlignedBoundingBox.cpp b/RayTracer/tools/AxisAlignedBoundingBox.cpp index 0ff9c27ed12b7b469ecc92aa7c65cd304625a324..69c39457f23fe0a550eacf46d2fe5efac5ecbcf7 100644 --- a/RayTracer/tools/AxisAlignedBoundingBox.cpp +++ b/RayTracer/tools/AxisAlignedBoundingBox.cpp @@ -91,17 +91,37 @@ bool AxisAlignedBoundingBox::contains(const Vec3& v) const { return x && y && z; } + +bool AxisAlignedBoundingBox::contains(const AxisAlignedBoundingBox& bb) const { + std::array<Vec3, 8> vertices = { + Vec3(bb.minBound().x(), bb.minBound().y(), bb.minBound().z()), + Vec3(bb.minBound().x(), bb.minBound().y(), bb.maxBound().z()), + Vec3(bb.minBound().x(), bb.maxBound().y(), bb.minBound().z()), + Vec3(bb.minBound().x(), bb.maxBound().y(), bb.maxBound().z()), + Vec3(bb.maxBound().x(), bb.minBound().y(), bb.minBound().z()), + Vec3(bb.maxBound().x(), bb.minBound().y(), bb.maxBound().z()), + Vec3(bb.maxBound().x(), bb.maxBound().y(), bb.minBound().z()), + Vec3(bb.maxBound().x(), bb.maxBound().y(), bb.maxBound().z())}; + for (Vec3 v : vertices) + if (!contains(v)) return false; + return true; +} // This Method is not entirely correct. It only checks if the corners of this bb // is inside the arguments bb. This should be enough for the splitting algorithm // to create a hierarchy. Theoretically there are overlapping bbs, where no // corner is inside the others. + bool AxisAlignedBoundingBox::partiallyContains( - const AxisAlignedBoundingBox bb) { + const AxisAlignedBoundingBox& bb) const { std::array<Vec3, 8> vertices = { - Vec3(min.x(), min.y(), min.z()), Vec3(min.x(), min.y(), max.z()), - Vec3(min.x(), max.y(), min.z()), Vec3(min.x(), max.y(), max.z()), - Vec3(max.x(), min.y(), min.z()), Vec3(max.x(), min.y(), max.z()), - Vec3(max.x(), max.y(), min.z()), Vec3(max.x(), max.y(), max.z())}; + Vec3(bb.minBound().x(), bb.minBound().y(), bb.minBound().z()), + Vec3(bb.minBound().x(), bb.minBound().y(), bb.maxBound().z()), + Vec3(bb.minBound().x(), bb.maxBound().y(), bb.minBound().z()), + Vec3(bb.minBound().x(), bb.maxBound().y(), bb.maxBound().z()), + Vec3(bb.maxBound().x(), bb.minBound().y(), bb.minBound().z()), + Vec3(bb.maxBound().x(), bb.minBound().y(), bb.maxBound().z()), + Vec3(bb.maxBound().x(), bb.maxBound().y(), bb.minBound().z()), + Vec3(bb.maxBound().x(), bb.maxBound().y(), bb.maxBound().z())}; for (Vec3 v : vertices) if (bb.contains(v)) return true; return false; @@ -123,7 +143,7 @@ void AxisAlignedBoundingBox::orientate() { std::max<float>(min.y(), max.y()), std::max<float>(min.z(), max.z())); } - +// Pair is 0->Left 1->Right std::array<AxisAlignedBoundingBox, 2> splitAABB(AxisAlignedBoundingBox box) { util::Vec3 size2 = (box.maxBound() - box.minBound()) / 2; AxisAlignedBoundingBox left; diff --git a/RayTracer/tools/AxisAlignedBoundingBox.h b/RayTracer/tools/AxisAlignedBoundingBox.h index 29b5c7d9cd99ba13719df2d97d60a29dc5e63d47..bc7da01e5249cbe3ba106f199d25bba7c790bcc4 100644 --- a/RayTracer/tools/AxisAlignedBoundingBox.h +++ b/RayTracer/tools/AxisAlignedBoundingBox.h @@ -18,7 +18,8 @@ class AxisAlignedBoundingBox { // Methods bool intersects(const cam::Ray& r) const; bool contains(const Vec3& v) const; - bool partiallyContains(const AxisAlignedBoundingBox bb); + bool contains(const AxisAlignedBoundingBox& bb) const; + bool partiallyContains(const AxisAlignedBoundingBox& bb) const; Vec3 center() const; Vec3 minBound() const; Vec3 maxBound() const;