Ver código fonte

Adds optional body filter to DrawBodies() (#198)

DocAce 3 anos atrás
pai
commit
5b262a0304

+ 16 - 0
Jolt/Physics/Body/BodyFilter.h

@@ -82,4 +82,20 @@ private:
 	Array<BodyID>			mBodyIDs;
 };
 
+#ifdef JPH_DEBUG_RENDERER
+/// Class function to filter out bodies for debug rendering, returns true if body should be rendered
+class BodyDrawFilter : public NonCopyable
+{
+public:
+	/// Destructor
+	virtual					~BodyDrawFilter() = default;
+
+	/// Filter function. Returns true if inBody should be rendered
+	virtual bool			ShouldDraw(const Body& inBody) const
+	{
+		return true;
+	}
+};
+#endif // JPH_DEBUG_RENDERER
+
 JPH_NAMESPACE_END

+ 3 - 2
Jolt/Physics/Body/BodyManager.cpp

@@ -13,6 +13,7 @@
 #include <Jolt/Core/QuickSort.h>
 #ifdef JPH_DEBUG_RENDERER
 	#include <Jolt/Renderer/DebugRenderer.h>
+	#include <Jolt/Physics/Body/BodyFilter.h>
 #endif // JPH_DEBUG_RENDERER
 
 JPH_NAMESPACE_BEGIN
@@ -558,14 +559,14 @@ bool BodyManager::RestoreState(StateRecorder &inStream)
 }
 
 #ifdef JPH_DEBUG_RENDERER
-void BodyManager::Draw(const DrawSettings &inDrawSettings, const PhysicsSettings &inPhysicsSettings, DebugRenderer *inRenderer)
+void BodyManager::Draw(const DrawSettings &inDrawSettings, const PhysicsSettings &inPhysicsSettings, DebugRenderer *inRenderer, const BodyDrawFilter *inBodyFilter)
 {
 	JPH_PROFILE_FUNCTION();
 
 	LockAllBodies();
 
 	for (const Body *body : mBodies)
-		if (sIsValidBodyPointer(body) && body->IsInBroadPhase())
+		if (sIsValidBodyPointer(body) && body->IsInBroadPhase() && (!inBodyFilter || inBodyFilter->ShouldDraw(*body)))
 		{
 			JPH_ASSERT(mBodies[body->GetID().GetIndex()] == body);
 

+ 2 - 1
Jolt/Physics/Body/BodyManager.h

@@ -15,6 +15,7 @@ class BodyActivationListener;
 struct PhysicsSettings;
 #ifdef JPH_DEBUG_RENDERER
 class DebugRenderer;
+class BodyDrawFilter;
 #endif // JPH_DEBUG_RENDERER
 
 /// Array of bodies
@@ -181,7 +182,7 @@ public:
 	};
 
 	/// Draw the state of the bodies (debugging purposes)
-	void							Draw(const DrawSettings &inSettings, const PhysicsSettings &inPhysicsSettings, DebugRenderer *inRenderer);
+	void							Draw(const DrawSettings &inSettings, const PhysicsSettings &inPhysicsSettings, DebugRenderer *inRenderer, const BodyDrawFilter *inBodyFilter = nullptr);
 #endif // JPH_DEBUG_RENDERER
 
 #ifdef JPH_ENABLE_ASSERTS

+ 1 - 1
Jolt/Physics/PhysicsSystem.h

@@ -114,7 +114,7 @@ public:
 	static bool					sDrawMotionQualityLinearCast;								///< Draw debug info for objects that perform continuous collision detection through the linear cast motion quality
 
 	/// Draw the state of the bodies (debugging purposes)
-	void						DrawBodies(const BodyManager::DrawSettings &inSettings, DebugRenderer *inRenderer) { mBodyManager.Draw(inSettings, mPhysicsSettings, inRenderer); }
+	void						DrawBodies(const BodyManager::DrawSettings &inSettings, DebugRenderer *inRenderer, const BodyDrawFilter *inBodyFilter = nullptr) { mBodyManager.Draw(inSettings, mPhysicsSettings, inRenderer, inBodyFilter); }
 
 	/// Draw the constraints only (debugging purposes)
 	void						DrawConstraints(DebugRenderer *inRenderer)					{ mConstraintManager.DrawConstraints(inRenderer); }