瀏覽代碼

Add CollisionGroup and GroupFilter, untested!

Lucien Greathouse 5 月之前
父節點
當前提交
42ad28fde8
共有 2 個文件被更改,包括 72 次插入0 次删除
  1. 23 0
      JoltC/Functions.h
  2. 49 0
      JoltCImpl/JoltC.cpp

+ 23 - 0
JoltC/Functions.h

@@ -246,6 +246,29 @@ JPC_API JPC_JobSystemThreadPool* JPC_JobSystemThreadPool_new3(
 
 JPC_API void JPC_JobSystemThreadPool_delete(JPC_JobSystemThreadPool* object);
 
+////////////////////////////////////////////////////////////////////////////////
+// CollisionGroup and GroupFilter
+
+typedef uint32_t JPC_GroupID;
+typedef uint32_t JPC_SubGroupID;
+typedef struct JPC_GroupFilter JPC_GroupFilter;
+
+typedef struct JPC_CollisionGroup {
+	const JPC_GroupFilter* GroupFilter;
+	JPC_GroupID GroupID;
+	JPC_SubGroupID SubGroupID;
+} JPC_CollisionGroup;
+
+typedef struct JPC_GroupFilterFns {
+	bool (*CanCollide)(const void *self, const JPC_CollisionGroup* inGroup1, const JPC_CollisionGroup* inGroup2);
+} JPC_GroupFilterFns;
+
+JPC_API JPC_GroupFilter* JPC_GroupFilter_new(
+	const void *self,
+	JPC_GroupFilterFns fns);
+
+JPC_API void JPC_GroupFilter_delete(JPC_GroupFilter* object);
+
 ////////////////////////////////////////////////////////////////////////////////
 // BroadPhaseLayerInterface
 

+ 49 - 0
JoltCImpl/JoltC.cpp

@@ -338,6 +338,55 @@ JPC_API JPC_JobSystemThreadPool* JPC_JobSystemThreadPool_new3(
 	return to_jpc(new JPH::JobSystemThreadPool(inMaxJobs, inMaxBarriers, inNumThreads));
 }
 
+////////////////////////////////////////////////////////////////////////////////
+// CollisionGroup
+
+JPC_IMPL JPC_CollisionGroup JPC_CollisionGroup_to_jpc(const JPH::CollisionGroup* input);
+
+class JPC_GroupFilterBridge final : public JPH::GroupFilter {
+public:
+	explicit JPC_GroupFilterBridge(const void *self, JPC_GroupFilterFns fns) : self(self), fns(fns) {}
+
+	bool CanCollide(const JPH::CollisionGroup &inGroup1, const JPH::CollisionGroup &inGroup2) const override {
+		JPC_CollisionGroup jpcGroup1 = JPC_CollisionGroup_to_jpc(&inGroup1);
+		JPC_CollisionGroup jpcGroup2 = JPC_CollisionGroup_to_jpc(&inGroup2);
+
+		return fns.CanCollide(self, &jpcGroup1, &jpcGroup2);
+	}
+
+	void SaveBinaryState(JPH::StreamOut &inStream) const override {}
+	void RestoreBinaryState(JPH::StreamIn &inStream) override {}
+
+private:
+	const void* self;
+	JPC_GroupFilterFns fns;
+};
+
+OPAQUE_WRAPPER(JPC_GroupFilter, JPC_GroupFilterBridge)
+DESTRUCTOR(JPC_GroupFilter)
+
+JPC_IMPL JPH::CollisionGroup JPC_CollisionGroup_to_jph(const JPC_CollisionGroup* self) {
+	const JPC_GroupFilterBridge* filter_group = to_jph(self->GroupFilter);
+
+	JPH::CollisionGroup group(filter_group, self->GroupID, self->SubGroupID);
+	return group;
+}
+
+JPC_IMPL JPC_CollisionGroup JPC_CollisionGroup_to_jpc(const JPH::CollisionGroup* input) {
+	JPC_CollisionGroup group{};
+	group.GroupFilter; // NOTE: This member doesn't matter for callers of this function
+	group.GroupID = input->GetGroupID();
+	group.SubGroupID = input->GetSubGroupID();
+	return group;
+}
+
+JPC_API JPC_GroupFilter* JPC_GroupFilter_new(
+	const void *self,
+	JPC_GroupFilterFns fns)
+{
+	return to_jpc(new JPC_GroupFilterBridge(self, fns));
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // BroadPhaseLayerInterface