浏览代码

NarrowPhaseQuery::CollideShape API, some robustness improvements on struct bindings

Lucien Greathouse 4 月之前
父节点
当前提交
293345b116
共有 3 个文件被更改,包括 195 次插入16 次删除
  1. 83 15
      JoltC/Functions.h
  2. 111 1
      JoltCImpl/JoltC.cpp
  3. 1 0
      JoltCImpl/Test.cpp

+ 83 - 15
JoltC/Functions.h

@@ -178,6 +178,18 @@ typedef struct JPC_ShapeCastResult {
 	bool IsBackFaceHit;
 } JPC_ShapeCastResult;
 
+typedef struct JPC_CollideShapeResult {
+	JPC_Vec3 ContactPointOn1;
+	JPC_Vec3 ContactPointOn2;
+	JPC_Vec3 PenetrationAxis;
+	float PenetrationDepth;
+	JPC_SubShapeID SubShapeID1;
+	JPC_SubShapeID SubShapeID2;
+	JPC_BodyID BodyID2;
+	// Face Shape1Face;
+	// Face Shape2Face;
+} JPC_CollideShapeResult;
+
 typedef struct JPC_Body JPC_Body;
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -465,6 +477,37 @@ typedef struct JPC_SubShapeIDPair {
 } JPC_SubShapeIDPair;
 
 ENSURE_SIZE_ALIGN(JPC_SubShapeIDPair, JPH::SubShapeIDPair)
+// These fields are private, so we can't test them directly!
+// ENSURE_NORMAL_FIELD(  SubShapeIDPair, Body1ID)
+// ENSURE_NORMAL_FIELD(  SubShapeIDPair, SubShapeID1)
+// ENSURE_NORMAL_FIELD(  SubShapeIDPair, Body2ID)
+// ENSURE_NORMAL_FIELD(  SubShapeIDPair, SubShapeID2)
+
+typedef struct JPC_ShapeCastSettings {
+	// JPH::CollideSettingsBase
+	JPC_ActiveEdgeMode ActiveEdgeMode;
+	JPC_CollectFacesMode CollectFacesMode;
+	float CollisionTolerance;
+	float PenetrationTolerance;
+	JPC_Vec3 ActiveEdgeMovementDirection;
+
+	// JPH::ShapeCastSettings
+	JPC_BackFaceMode BackFaceModeTriangles;
+	JPC_BackFaceMode BackFaceModeConvex;
+	bool UseShrunkenShapeAndConvexRadius;
+	bool ReturnDeepestPoint;
+} JPC_ShapeCastSettings;
+
+ENSURE_SIZE_ALIGN(JPC_ShapeCastSettings, JPH::ShapeCastSettings)
+ENSURE_NORMAL_FIELD(  ShapeCastSettings, ActiveEdgeMode)
+ENSURE_NORMAL_FIELD(  ShapeCastSettings, CollectFacesMode)
+ENSURE_NORMAL_FIELD(  ShapeCastSettings, CollisionTolerance)
+ENSURE_NORMAL_FIELD(  ShapeCastSettings, PenetrationTolerance)
+ENSURE_NORMAL_FIELD(  ShapeCastSettings, ActiveEdgeMovementDirection)
+ENSURE_NORMAL_FIELD(  ShapeCastSettings, BackFaceModeTriangles)
+ENSURE_NORMAL_FIELD(  ShapeCastSettings, BackFaceModeConvex)
+ENSURE_NORMAL_FIELD(  ShapeCastSettings, UseShrunkenShapeAndConvexRadius)
+ENSURE_NORMAL_FIELD(  ShapeCastSettings, ReturnDeepestPoint)
 
 typedef struct JPC_CollideShapeSettings {
 	// CollideSettingsBase
@@ -480,6 +523,13 @@ typedef struct JPC_CollideShapeSettings {
 } JPC_CollideShapeSettings;
 
 ENSURE_SIZE_ALIGN(JPC_CollideShapeSettings, JPH::CollideShapeSettings)
+ENSURE_NORMAL_FIELD(  CollideShapeSettings, ActiveEdgeMode)
+ENSURE_NORMAL_FIELD(  CollideShapeSettings, CollectFacesMode)
+ENSURE_NORMAL_FIELD(  CollideShapeSettings, CollisionTolerance)
+ENSURE_NORMAL_FIELD(  CollideShapeSettings, PenetrationTolerance)
+ENSURE_NORMAL_FIELD(  CollideShapeSettings, ActiveEdgeMovementDirection)
+ENSURE_NORMAL_FIELD(  CollideShapeSettings, MaxSeparationDistance)
+ENSURE_NORMAL_FIELD(  CollideShapeSettings, BackFaceMode)
 
 typedef struct JPC_ContactListenerFns {
 	// ValidateResult (*OnContactValidate)(
@@ -534,6 +584,24 @@ JPC_API void JPC_CastShapeCollector_delete(JPC_CastShapeCollector* object);
 
 JPC_API void JPC_CastShapeCollector_UpdateEarlyOutFraction(JPC_CastShapeCollector *self, float inFraction);
 
+////////////////////////////////////////////////////////////////////////////////
+// CollideShapeCollector
+
+typedef struct JPC_CollideShapeCollector JPC_CollideShapeCollector;
+
+typedef struct JPC_CollideShapeCollectorFns {
+	void (*Reset)(void *self);
+	void (*AddHit)(void *self, JPC_CollideShapeCollector *base, const JPC_CollideShapeResult *Result);
+} JPC_CollideShapeCollectorFns;
+
+JPC_API JPC_CollideShapeCollector* JPC_CollideShapeCollector_new(
+	void *self,
+	JPC_CollideShapeCollectorFns fns);
+
+JPC_API void JPC_CollideShapeCollector_delete(JPC_CollideShapeCollector* object);
+
+JPC_API void JPC_CollideShapeCollector_UpdateEarlyOutFraction(JPC_CollideShapeCollector *self, float inFraction);
+
 ////////////////////////////////////////////////////////////////////////////////
 // DrawSettings
 
@@ -1323,21 +1391,6 @@ typedef struct JPC_RShapeCast {
 	// const JPC_AABox ShapeWorldBounds;
 } JPC_RShapeCast;
 
-typedef struct JPC_ShapeCastSettings {
-	// JPH::CollideSettingsBase
-	// EActiveEdgeMode ActiveEdgeMode;
-	// ECollectFacesMode CollectFacesMode;
-	float CollisionTolerance;
-	float PenetrationTolerance;
-	JPC_Vec3 ActiveEdgeMovementDirection;
-
-	// JPH::ShapeCastSettings
-	JPC_BackFaceMode BackFaceModeTriangles;
-	JPC_BackFaceMode BackFaceModeConvex;
-	bool UseShrunkenShapeAndConvexRadius;
-	bool ReturnDeepestPoint;
-} JPC_ShapeCastSettings;
-
 JPC_API void JPC_ShapeCastSettings_default(JPC_ShapeCastSettings* object);
 
 typedef struct JPC_NarrowPhaseQuery_CastShapeArgs {
@@ -1353,6 +1406,21 @@ typedef struct JPC_NarrowPhaseQuery_CastShapeArgs {
 
 JPC_API void JPC_NarrowPhaseQuery_CastShape(const JPC_NarrowPhaseQuery* self, JPC_NarrowPhaseQuery_CastShapeArgs* args);
 
+typedef struct JPC_NarrowPhaseQuery_CollideShapeArgs {
+	const JPC_Shape *Shape;
+	JPC_Vec3 ShapeScale;
+	JPC_RMat44 CenterOfMassTransform;
+	JPC_CollideShapeSettings Settings;
+	JPC_RVec3 BaseOffset;
+	JPC_CollideShapeCollector *Collector;
+	const JPC_BroadPhaseLayerFilter *BroadPhaseLayerFilter;
+	const JPC_ObjectLayerFilter *ObjectLayerFilter;
+	const JPC_BodyFilter *BodyFilter;
+	const JPC_ShapeFilter *ShapeFilter;
+} JPC_NarrowPhaseQuery_CollideShapeArgs;
+
+JPC_API void JPC_NarrowPhaseQuery_CollideShape(const JPC_NarrowPhaseQuery* self, JPC_NarrowPhaseQuery_CollideShapeArgs* args);
+
 ////////////////////////////////////////////////////////////////////////////////
 // PhysicsSystem
 

+ 111 - 1
JoltCImpl/JoltC.cpp

@@ -127,6 +127,9 @@ DESTRUCTOR(JPC_String)
 
 LAYOUT_COMPATIBLE(JPC_BodyManager_DrawSettings, JPH::BodyManager::DrawSettings)
 
+LAYOUT_COMPATIBLE(JPC_ShapeCastSettings, JPH::ShapeCastSettings)
+LAYOUT_COMPATIBLE(JPC_CollideShapeSettings, JPH::CollideShapeSettings)
+
 LAYOUT_COMPATIBLE(JPC_BodyID, JPH::BodyID)
 
 static auto to_jpc(JPH::BroadPhaseLayer in) { return in.GetValue(); }
@@ -280,6 +283,22 @@ JPC_IMPL JPH::ShapeCastSettings JPC_ShapeCastSettings_to_jph(JPC_ShapeCastSettin
 	return out;
 }
 
+JPC_IMPL JPC_CollideShapeResult JPC_CollideShapeResult_to_jpc(JPH::CollideShapeResult in) {
+	JPC_CollideShapeResult out{};
+	// CollideShapeResult
+	out.ContactPointOn1 = to_jpc(in.mContactPointOn1);
+	out.ContactPointOn2 = to_jpc(in.mContactPointOn2);
+	out.PenetrationAxis = to_jpc(in.mPenetrationAxis);
+	out.PenetrationDepth = in.mPenetrationDepth;
+	out.SubShapeID1 = to_jpc(in.mSubShapeID1);
+	out.SubShapeID2 = to_jpc(in.mSubShapeID2);
+	out.BodyID2 = to_jpc(in.mBodyID2);
+	// Face Shape1Face;
+	// Face Shape2Face;
+
+	return out;
+}
+
 JPC_API void JPC_RegisterDefaultAllocator() {
 	JPH::RegisterDefaultAllocator();
 }
@@ -755,6 +774,51 @@ JPC_API void JPC_CastShapeCollector_UpdateEarlyOutFraction(JPC_CastShapeCollecto
 	to_jph(self)->UpdateEarlyOutFraction(inFraction);
 }
 
+////////////////////////////////////////////////////////////////////////////////
+// JPC_CollideShapeCollector
+
+class JPC_CollideShapeCollectorBridge;
+OPAQUE_WRAPPER(JPC_CollideShapeCollector, JPC_CollideShapeCollectorBridge)
+
+class JPC_CollideShapeCollectorBridge final : public JPH::CollideShapeCollector {
+	using ResultType = JPH::CollideShapeResult;
+
+public:
+	explicit JPC_CollideShapeCollectorBridge(void *self, JPC_CollideShapeCollectorFns fns) : self(self), fns(fns) {}
+
+	void Reset() override {
+		JPH::CollideShapeCollector::Reset();
+
+		if (fns.Reset != nullptr) {
+			fns.Reset(self);
+		}
+	}
+
+	void AddHit(const ResultType &inResult) override {
+		JPC_CollideShapeResult result = JPC_CollideShapeResult_to_jpc(inResult);
+		JPC_CollideShapeCollector *base = to_jpc(this);
+
+		fns.AddHit(self, base, &result);
+	}
+
+private:
+	void* self;
+	JPC_CollideShapeCollectorFns fns;
+};
+
+DESTRUCTOR(JPC_CollideShapeCollector)
+
+JPC_API JPC_CollideShapeCollector* JPC_CollideShapeCollector_new(
+	void *self,
+	JPC_CollideShapeCollectorFns fns)
+{
+	return to_jpc(new JPC_CollideShapeCollectorBridge(self, fns));
+}
+
+JPC_API void JPC_CollideShapeCollector_UpdateEarlyOutFraction(JPC_CollideShapeCollector* self, float inFraction) {
+	to_jph(self)->UpdateEarlyOutFraction(inFraction);
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // BodyManager::DrawSettings
 
@@ -2501,7 +2565,7 @@ JPC_API void JPC_ShapeCastSettings_default(JPC_ShapeCastSettings* settings) {
 }
 
 JPC_API void JPC_NarrowPhaseQuery_CastShape(const JPC_NarrowPhaseQuery* self, JPC_NarrowPhaseQuery_CastShapeArgs* args) {
-	JPH::ShapeCastSettings settings = JPC_ShapeCastSettings_to_jph(args->Settings);
+	JPH::ShapeCastSettings settings = to_jph(args->Settings);
 
 	JPH::ClosestHitCollisionCollector<JPH::CastShapeCollector> defaultCollector{};
 	JPH::CastShapeCollector* collector = &defaultCollector;
@@ -2544,6 +2608,52 @@ JPC_API void JPC_NarrowPhaseQuery_CastShape(const JPC_NarrowPhaseQuery* self, JP
 		*shapeFilter);
 }
 
+JPC_API void JPC_NarrowPhaseQuery_CollideShape(const JPC_NarrowPhaseQuery* self, JPC_NarrowPhaseQuery_CollideShapeArgs* args) {
+	JPH::CollideShapeSettings settings = to_jph(args->Settings);
+
+	JPH::ClosestHitCollisionCollector<JPH::CollideShapeCollector> defaultCollector{};
+	JPH::CollideShapeCollector* collector = &defaultCollector;
+	if (args->Collector != nullptr) {
+		collector = to_jph(args->Collector);
+	}
+
+	JPH::BroadPhaseLayerFilter defaultBplFilter{};
+	const JPH::BroadPhaseLayerFilter* bplFilter = &defaultBplFilter;
+	if (args->BroadPhaseLayerFilter != nullptr) {
+		bplFilter = to_jph(args->BroadPhaseLayerFilter);
+	}
+
+	JPH::ObjectLayerFilter defaultOlFilter{};
+	const JPH::ObjectLayerFilter* olFilter = &defaultOlFilter;
+	if (args->ObjectLayerFilter != nullptr) {
+		olFilter = to_jph(args->ObjectLayerFilter);
+	}
+
+	JPH::BodyFilter defaultBodyFilter{};
+	const JPH::BodyFilter* bodyFilter = &defaultBodyFilter;
+	if (args->BodyFilter != nullptr) {
+		bodyFilter = to_jph(args->BodyFilter);
+	}
+
+	JPH::ShapeFilter defaultShapeFilter{};
+	const JPH::ShapeFilter* shapeFilter = &defaultShapeFilter;
+	if (args->ShapeFilter != nullptr) {
+		shapeFilter = to_jph(args->ShapeFilter);
+	}
+
+	to_jph(self)->CollideShape(
+		to_jph(args->Shape),
+		to_jph(args->ShapeScale),
+		to_jph(args->CenterOfMassTransform),
+		settings,
+		to_jph(args->BaseOffset),
+		*collector,
+		*bplFilter,
+		*olFilter,
+		*bodyFilter,
+		*shapeFilter);
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // PhysicsSystem
 

+ 1 - 0
JoltCImpl/Test.cpp

@@ -21,6 +21,7 @@
 #include <Jolt/Physics/Collision/CollideShape.h>
 #include <Jolt/Physics/Collision/Shape/BoxShape.h>
 #include <Jolt/Physics/Collision/Shape/SphereShape.h>
+#include <Jolt/Physics/Collision/ShapeCast.h>
 #include <Jolt/Physics/Constraints/ConstraintPart/SwingTwistConstraintPart.h>
 #include <Jolt/Physics/Constraints/SixDOFConstraint.h>
 #include <Jolt/Physics/PhysicsSettings.h>