Przeglądaj źródła

Foundational work for CastShapeCollector

Lucien Greathouse 11 miesięcy temu
rodzic
commit
65eada9f15
2 zmienionych plików z 81 dodań i 0 usunięć
  1. 32 0
      JoltC/Functions.h
  2. 49 0
      JoltC/JoltC.cpp

+ 32 - 0
JoltC/Functions.h

@@ -160,6 +160,23 @@ typedef struct JPC_RayCastResult {
 	JPC_SubShapeID SubShapeID2;
 } JPC_RayCastResult;
 
+typedef struct JPC_ShapeCastResult {
+	// From CollideShapeResult
+	JPC_Vec3 ContactPointOn1;
+	JPC_Vec3 ContactPointOn2;
+	JPC_Vec3 PenetrationAxis;
+	float PenetrationDepth;
+	// SubShapeID SubShapeID1;
+	// SubShapeID SubShapeID2;
+	JPC_BodyID BodyID2;
+	// Face Shape1Face;
+	// Face Shape2Face;
+
+	// From ShapeCastResult
+	float Fraction;
+	bool IsBackFaceHit;
+} JPC_ShapeCastResult;
+
 typedef struct JPC_Body JPC_Body;
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -293,6 +310,21 @@ JPC_API JPC_ObjectLayerPairFilter* JPC_ObjectLayerPairFilter_new(
 
 JPC_API void JPC_ObjectLayerPairFilter_delete(JPC_ObjectLayerPairFilter* object);
 
+////////////////////////////////////////////////////////////////////////////////
+// CastShapeCollector
+
+typedef struct JPC_CastShapeCollectorFns {
+	void (*AddHit)(const void *self, const JPC_ShapeCastResult *Result);
+} JPC_CastShapeCollectorFns;
+
+typedef struct JPC_CastShapeCollector JPC_CastShapeCollector;
+
+JPC_API JPC_CastShapeCollector* JPC_CastShapeCollector_new(
+	const void *self,
+	JPC_CastShapeCollectorFns fns);
+
+JPC_API void JPC_CastShapeCollector_delete(JPC_CastShapeCollector* object);
+
 ////////////////////////////////////////////////////////////////////////////////
 // DrawSettings
 

+ 49 - 0
JoltC/JoltC.cpp

@@ -190,6 +190,26 @@ static JPC_RayCastResult to_jpc(JPH::RayCastResult in) {
 	return out;
 }
 
+static JPC_ShapeCastResult to_jpc(JPH::ShapeCastResult in) {
+	JPC_ShapeCastResult out{0};
+	// CollideShapeResult
+	out.ContactPointOn1 = to_jpc(in.mContactPointOn1);
+	out.ContactPointOn2 = to_jpc(in.mContactPointOn2);
+	out.PenetrationAxis = to_jpc(in.mPenetrationAxis);
+	out.PenetrationDepth = in.mPenetrationDepth;
+	// SubShapeID SubShapeID1;
+	// SubShapeID SubShapeID2;
+	out.BodyID2 = to_jpc(in.mBodyID2);
+	// Face Shape1Face;
+	// Face Shape2Face;
+
+	// ShapeCastResult
+	out.Fraction = in.mFraction;
+	out.IsBackFaceHit = in.mIsBackFaceHit;
+
+	return out;
+}
+
 JPC_API void JPC_RegisterDefaultAllocator() {
 	JPH::RegisterDefaultAllocator();
 }
@@ -422,6 +442,35 @@ JPC_API JPC_ObjectLayerPairFilter* JPC_ObjectLayerPairFilter_new(
 	return to_jpc(new JPC_ObjectLayerPairFilterBridge(self, fns));
 }
 
+////////////////////////////////////////////////////////////////////////////////
+// JPC_CastShapeCollector
+
+class JPC_CastShapeCollectorBridge final : public JPH::CastShapeCollector {
+	using ResultType = JPH::ShapeCastResult;
+
+public:
+	explicit JPC_CastShapeCollectorBridge(const void *self, JPC_CastShapeCollectorFns fns) : self(self), fns(fns) {}
+
+	virtual void AddHit(const ResultType &inResult) {
+		JPC_ShapeCastResult result = to_jpc(inResult);
+		fns.AddHit(self, &result);
+	}
+
+private:
+	const void* self;
+	JPC_CastShapeCollectorFns fns;
+};
+
+OPAQUE_WRAPPER(JPC_CastShapeCollector, JPC_CastShapeCollectorBridge)
+DESTRUCTOR(JPC_CastShapeCollector)
+
+JPC_API JPC_CastShapeCollector* JPC_CastShapeCollector_new(
+	const void *self,
+	JPC_CastShapeCollectorFns fns)
+{
+	return to_jpc(new JPC_CastShapeCollectorBridge(self, fns));
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // BodyManager::DrawSettings