Browse Source

- Collision
- Dummy visibility testing

Panagiotis Christopoulos Charitos 14 năm trước cách đây
mục cha
commit
abc43f5db1
3 tập tin đã thay đổi với 79 bổ sung15 xóa
  1. 63 1
      anki/collision/ToAabb.cpp
  2. 6 2
      anki/scene/VisibilityTester.cpp
  3. 10 12
      anki/scene/VisibilityTester.h

+ 63 - 1
anki/collision/ToAabb.cpp

@@ -1,12 +1,74 @@
 #include "anki/collision/ToAabb.h"
 #include "anki/collision/Collision.h"
+#include "anki/util/Assert.h"
 
 
 namespace anki {
 
 
-//===========================================================================
+//=============================================================================
+void ToAbb::visit(LineSegment& ls)
+{
+	Vec3 min = pls.getOrigin();
+	Vec3 max = pls.getOrigin() + ls.getDirection();
 
+	for(uint i = 0; i < 3; ++i)
+	{
+		if(max[i] < min[i])
+		{
+			float tmp = max[i];
+			max[i] = min[i];
+			min[i] = tmp;
+		}
+	}
+
+	aabb.setMax(max);
+	aabb.setMin(min);
+}
+
+
+//=============================================================================
+void ToAbb::visit(Obb& obb)
+{
+	// XXX
+}
+
+
+//=============================================================================
+void ToAbb::visit(Frustum&)
+{
+	/// XXX
+}
+
+
+//=============================================================================
+void ToAbb::visit(Plane&)
+{
+	ANKI_ASSERT(0 && "Can't do that");
+}
+
+
+//=============================================================================
+void ToAbb::visit(Ray&)
+{
+	ANKI_ASSERT(0 && "Can't do that");
+}
+
+
+//=============================================================================
+void ToAbb::visit(Sphere& s)
+{
+	Vec3 r = Vec3(s.getRadius());
+	aabb.setMin(s.getCenter() - r);
+	aabb.setMax(s.getCenter() + r);
+}
+
+
+//=============================================================================
+void ToAbb::visit(Aabb& b)
+{
+	aabb = b;
+}
 
 
 } // end namespace anki

+ 6 - 2
anki/scene/VisibilityTester.cpp

@@ -33,16 +33,20 @@ void VisibilityTester::test(Frustumable& cam, Scene& scene,
 		}
 
 
+		VisibilityInfo::Pair p = {nullptr, nullptr};
+
 		if(fr)
 		{
-			vinfo.frustumables.push_back(fr);
+			p.frustumable = fr;
 		}
 
 		if(r)
 		{
 			r->enableFlag(Renderable::RF_VISIBLE);
-			vinfo.renderables.push_back(r);
+			p.renderable = r;
 		}
+
+		vinfo.pairs.push_back(p);
 	}
 }
 

+ 10 - 12
anki/scene/VisibilityTester.h

@@ -20,24 +20,22 @@ class VisibilityInfo
 	friend class VisibilityTester;
 
 public:
-	typedef std::vector<Renderable*> Renderables;
-	typedef std::vector<Frustumable*> Frustumables;
-
-	boost::iterator_range<Renderables::iterator> getRenderables()
+	struct Pair
 	{
-		return boost::iterator_range<Renderables::iterator>(
-			renderables.begin(), renderables.end());
-	}
+		Renderable* renderable;
+		Frustumable* frustumable;
+	};
+
+	typedef std::vector<Pair> Pairs;
 
-	boost::iterator_range<Frustumables::iterator> getFrustumable()
+	boost::iterator_range<Pairs::iterator> getPairs()
 	{
-		return boost::iterator_range<Frustumables::iterator>(
-			frustumables.begin(), frustumables.end());
+		return boost::iterator_range<Pairs::iterator>(
+			pairs.begin(), pairs.end());
 	}
 
 private:
-	Renderables renderables;
-	std::vector<Frustumable*> frustumables;
+	Pairs pairs;
 };