Prechádzať zdrojové kódy

Finish porting the other PhysicsSystem interfaces to be opaque

Lucien Greathouse 1 rok pred
rodič
commit
ee82713487
3 zmenil súbory, kde vykonal 51 pridanie a 30 odobranie
  1. 5 14
      HelloWorld/main.cpp
  2. 14 2
      JoltC/Functions.h
  3. 32 14
      JoltC/JoltC.cpp

+ 5 - 14
HelloWorld/main.cpp

@@ -89,26 +89,15 @@ int main() {
 	JPC_JobSystemThreadPool* job_system = JPC_JobSystemThreadPool_new2(JPC_MAX_PHYSICS_JOBS, JPC_MAX_PHYSICS_BARRIERS);
 
 	JPC_BroadPhaseLayerInterface* broad_phase_layer_interface = JPC_BroadPhaseLayerInterface_new(nullptr, Hello_BPL);
-
-	JPC_ObjectVsBroadPhaseLayerFilter object_vs_broad_phase_layer_filter = {
-		.self = nullptr,
-		.fns = Hello_OVB,
-	};
-
-	JPC_ObjectLayerPairFilter object_vs_object_layer_filter = {
-		.self = nullptr,
-		.fns = Hello_OVO,
-	};
-
-	// FIXME: These types get freed on accident
-
-	JPC_PhysicsSystem* physics_system = JPC_PhysicsSystem_new();
+	JPC_ObjectVsBroadPhaseLayerFilter* object_vs_broad_phase_layer_filter = JPC_ObjectVsBroadPhaseLayerFilter_new(nullptr, Hello_OVB);
+	JPC_ObjectLayerPairFilter* object_vs_object_layer_filter = JPC_ObjectLayerPairFilter_new(nullptr, Hello_OVO);
 
 	const unsigned int cMaxBodies = 1024;
 	const unsigned int cNumBodyMutexes = 0;
 	const unsigned int cMaxBodyPairs = 1024;
 	const unsigned int cMaxContactConstraints = 1024;
 
+	JPC_PhysicsSystem* physics_system = JPC_PhysicsSystem_new();
 	JPC_PhysicsSystem_Init(
 		physics_system,
 		cMaxBodies,
@@ -164,6 +153,8 @@ int main() {
 
 	JPC_PhysicsSystem_delete(physics_system);
 	JPC_BroadPhaseLayerInterface_delete(broad_phase_layer_interface);
+	JPC_ObjectVsBroadPhaseLayerFilter_delete(object_vs_broad_phase_layer_filter);
+	JPC_ObjectLayerPairFilter_delete(object_vs_object_layer_filter);
 
 	JPC_JobSystemThreadPool_delete(job_system);
 	JPC_TempAllocatorImpl_delete(temp_allocator);

+ 14 - 2
JoltC/Functions.h

@@ -132,6 +132,12 @@ typedef struct JPC_ObjectVsBroadPhaseLayerFilter {
 	JPC_ObjectVsBroadPhaseLayerFilterFns fns;
 } JPC_ObjectVsBroadPhaseLayerFilter;
 
+JPC_API JPC_ObjectVsBroadPhaseLayerFilter* JPC_ObjectVsBroadPhaseLayerFilter_new(
+	const void *self,
+	JPC_ObjectVsBroadPhaseLayerFilterFns fns);
+
+JPC_API void JPC_ObjectVsBroadPhaseLayerFilter_delete(JPC_ObjectVsBroadPhaseLayerFilter* object);
+
 ////////////////////////////////////////////////////////////////////////////////
 // ObjectLayerPairFilter
 
@@ -144,6 +150,12 @@ typedef struct JPC_ObjectLayerPairFilter {
 	JPC_ObjectLayerPairFilterFns fns;
 } JPC_ObjectLayerPairFilter;
 
+JPC_API JPC_ObjectLayerPairFilter* JPC_ObjectLayerPairFilter_new(
+	const void *self,
+	JPC_ObjectLayerPairFilterFns fns);
+
+JPC_API void JPC_ObjectLayerPairFilter_delete(JPC_ObjectLayerPairFilter* object);
+
 ////////////////////////////////////////////////////////////////////////////////
 // String
 
@@ -236,8 +248,8 @@ JPC_API void JPC_PhysicsSystem_Init(
 	uint inMaxBodyPairs,
 	uint inMaxContactConstraints,
 	JPC_BroadPhaseLayerInterface* inBroadPhaseLayerInterface,
-	JPC_ObjectVsBroadPhaseLayerFilter inObjectVsBroadPhaseLayerFilter,
-	JPC_ObjectLayerPairFilter inObjectLayerPairFilter);
+	JPC_ObjectVsBroadPhaseLayerFilter* inObjectVsBroadPhaseLayerFilter,
+	JPC_ObjectLayerPairFilter* inObjectLayerPairFilter);
 
 JPC_API JPC_PhysicsUpdateError JPC_PhysicsSystem_Update(
 	JPC_PhysicsSystem* self,

+ 32 - 14
JoltC/JoltC.cpp

@@ -165,9 +165,9 @@ JPC_API void JPC_BroadPhaseLayerInterface_delete(JPC_BroadPhaseLayerInterface* o
 ////////////////////////////////////////////////////////////////////////////////
 // ObjectVsBroadPhaseLayerFilter
 
-class JPC_ObjectVsBroadPhaseLayerFilter_Impl final : public JPH::ObjectVsBroadPhaseLayerFilter {
+class JPC_ObjectVsBroadPhaseLayerFilterBridge final : public JPH::ObjectVsBroadPhaseLayerFilter {
 public:
-	explicit JPC_ObjectVsBroadPhaseLayerFilter_Impl(JPC_ObjectVsBroadPhaseLayerFilter in) : self(in.self), fns(in.fns) {}
+	explicit JPC_ObjectVsBroadPhaseLayerFilterBridge(const void *self, JPC_ObjectVsBroadPhaseLayerFilterFns fns) : self(self), fns(fns) {}
 
 	virtual bool ShouldCollide(JPH::ObjectLayer inLayer1, JPH::BroadPhaseLayer inLayer2) const override {
 		return fns.ShouldCollide(self, inLayer1, to_jpc(inLayer2));
@@ -178,16 +178,25 @@ private:
 	JPC_ObjectVsBroadPhaseLayerFilterFns fns;
 };
 
-static JPC_ObjectVsBroadPhaseLayerFilter_Impl to_jph(JPC_ObjectVsBroadPhaseLayerFilter in) {
-	return JPC_ObjectVsBroadPhaseLayerFilter_Impl(in);
+OPAQUE_WRAPPER(JPC_ObjectVsBroadPhaseLayerFilter, JPC_ObjectVsBroadPhaseLayerFilterBridge)
+
+JPC_API JPC_ObjectVsBroadPhaseLayerFilter* JPC_ObjectVsBroadPhaseLayerFilter_new(
+	const void *self,
+	JPC_ObjectVsBroadPhaseLayerFilterFns fns)
+{
+	return to_jpc(new JPC_ObjectVsBroadPhaseLayerFilterBridge(self, fns));
+}
+
+JPC_API void JPC_ObjectVsBroadPhaseLayerFilter_delete(JPC_ObjectVsBroadPhaseLayerFilter* object) {
+	delete to_jph(object);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // JPC_ObjectLayerPairFilter
 
-class JPC_ObjectLayerPairFilter_Impl final : public JPH::ObjectLayerPairFilter {
+class JPC_ObjectLayerPairFilterBridge final : public JPH::ObjectLayerPairFilter {
 public:
-	explicit JPC_ObjectLayerPairFilter_Impl(JPC_ObjectLayerPairFilter in) : self(in.self), fns(in.fns) {}
+	explicit JPC_ObjectLayerPairFilterBridge(const void *self, JPC_ObjectLayerPairFilterFns fns) : self(self), fns(fns) {}
 
 	virtual bool ShouldCollide(JPH::ObjectLayer inLayer1, JPH::ObjectLayer inLayer2) const override {
 		return fns.ShouldCollide(self, inLayer1, inLayer2);
@@ -198,8 +207,17 @@ private:
 	JPC_ObjectLayerPairFilterFns fns;
 };
 
-static JPC_ObjectLayerPairFilter_Impl to_jph(JPC_ObjectLayerPairFilter in) {
-	return JPC_ObjectLayerPairFilter_Impl(in);
+OPAQUE_WRAPPER(JPC_ObjectLayerPairFilter, JPC_ObjectLayerPairFilterBridge)
+
+JPC_API JPC_ObjectLayerPairFilter* JPC_ObjectLayerPairFilter_new(
+	const void *self,
+	JPC_ObjectLayerPairFilterFns fns)
+{
+	return to_jpc(new JPC_ObjectLayerPairFilterBridge(self, fns));
+}
+
+JPC_API void JPC_ObjectLayerPairFilter_delete(JPC_ObjectLayerPairFilter* object) {
+	delete to_jph(object);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -303,12 +321,12 @@ JPC_API void JPC_PhysicsSystem_Init(
 	uint inMaxBodyPairs,
 	uint inMaxContactConstraints,
 	JPC_BroadPhaseLayerInterface* inBroadPhaseLayerInterface,
-	JPC_ObjectVsBroadPhaseLayerFilter inObjectVsBroadPhaseLayerFilter,
-	JPC_ObjectLayerPairFilter inObjectLayerPairFilter)
+	JPC_ObjectVsBroadPhaseLayerFilter* inObjectVsBroadPhaseLayerFilter,
+	JPC_ObjectLayerPairFilter* inObjectLayerPairFilter)
 {
 	JPC_BroadPhaseLayerInterfaceBridge* impl_inBroadPhaseLayerInterface = to_jph(inBroadPhaseLayerInterface);
-	auto impl_inObjectVsBroadPhaseLayerFilter = to_jph(inObjectVsBroadPhaseLayerFilter);
-	auto impl_inObjectLayerPairFilter = to_jph(inObjectLayerPairFilter);
+	JPC_ObjectVsBroadPhaseLayerFilterBridge* impl_inObjectVsBroadPhaseLayerFilter = to_jph(inObjectVsBroadPhaseLayerFilter);
+	JPC_ObjectLayerPairFilterBridge* impl_inObjectLayerPairFilter = to_jph(inObjectLayerPairFilter);
 
 	to_jph(self)->Init(
 		inMaxBodies,
@@ -316,8 +334,8 @@ JPC_API void JPC_PhysicsSystem_Init(
 		inMaxBodyPairs,
 		inMaxContactConstraints,
 		*impl_inBroadPhaseLayerInterface,
-		impl_inObjectVsBroadPhaseLayerFilter,
-		impl_inObjectLayerPairFilter);
+		*impl_inObjectVsBroadPhaseLayerFilter,
+		*impl_inObjectLayerPairFilter);
 }
 
 JPC_API JPC_BodyInterface* JPC_PhysicsSystem_GetBodyInterface(JPC_PhysicsSystem* self) {