From 80d88b2d18bef2c496adea55680396ebda7869ce Mon Sep 17 00:00:00 2001
From: Yoel <s73017@beuth-hochschule.de>
Date: Wed, 20 Jan 2021 13:42:54 +0100
Subject: [PATCH] Added function contains for bb. Fixed  partially contains.

---
 RayTracer/tools/AxisAlignedBoundingBox.cpp | 32 ++++++++++++++++++----
 RayTracer/tools/AxisAlignedBoundingBox.h   |  3 +-
 2 files changed, 28 insertions(+), 7 deletions(-)

diff --git a/RayTracer/tools/AxisAlignedBoundingBox.cpp b/RayTracer/tools/AxisAlignedBoundingBox.cpp
index 0ff9c27..69c3945 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 29b5c7d..bc7da01 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;
-- 
GitLab