Quellcode durchsuchen

Another interface down

Lucien Greathouse vor 1 Jahr
Ursprung
Commit
8786322c89
3 geänderte Dateien mit 63 neuen und 8 gelöschten Zeilen
  1. 27 4
      HelloWorld/main.cpp
  2. 12 0
      JoltC/Functions.h
  3. 24 4
      JoltC/JoltC.cpp

+ 27 - 4
HelloWorld/main.cpp

@@ -26,11 +26,14 @@ unsigned int Hello_GetNumBroadPhaseLayers(void* self) {
 }
 
 JPC_BroadPhaseLayer Hello_GetBroadPhaseLayer(void* self, JPC_ObjectLayer inLayer) {
-	if (inLayer == HELLO_OL_NON_MOVING) {
+	switch (inLayer) {
+	case HELLO_OL_NON_MOVING:
 		return HELLO_BPL_NON_MOVING;
-	} else if (inLayer == HELLO_OL_MOVING) {
+
+	case HELLO_OL_MOVING:
 		return HELLO_BPL_MOVING;
-	} else {
+
+	default:
 		unreachable();
 	}
 }
@@ -40,6 +43,23 @@ static JPC_BroadPhaseLayerInterfaceFns Hello_BPL = {
 	.GetBroadPhaseLayer = Hello_GetBroadPhaseLayer,
 };
 
+bool Hello_ShouldCollide(void* self, JPC_ObjectLayer inLayer1, JPC_BroadPhaseLayer inLayer2) {
+	switch (inLayer1) {
+	case HELLO_OL_NON_MOVING:
+		return inLayer2 == HELLO_BPL_MOVING;
+
+	case HELLO_OL_MOVING:
+		return true;
+
+	default:
+		unreachable();
+	}
+}
+
+static JPC_ObjectVsBroadPhaseLayerFilterFns Hello_OVB = {
+	.ShouldCollide = Hello_ShouldCollide,
+};
+
 int main() {
 	JPC_RegisterDefaultAllocator();
 	JPC_FactoryInit();
@@ -54,7 +74,10 @@ int main() {
 		.self = nullptr,
 	};
 
-	// create object_vs_broadphase_layer_filter
+	JPC_ObjectVsBroadPhaseLayerFilter object_vs_broad_phase_layer_filter = {
+		.fns = &Hello_OVB,
+		.self = nullptr,
+	};
 
 	// create object_vs_object_layer_filter
 

+ 12 - 0
JoltC/Functions.h

@@ -55,6 +55,18 @@ typedef struct JPC_BroadPhaseLayerInterface {
 	void *self;
 } JPC_BroadPhaseLayerInterface;
 
+////////////////////////////////////////////////////////////////////////////////
+// ObjectVsBroadPhaseLayerFilter
+
+typedef struct JPC_ObjectVsBroadPhaseLayerFilterFns {
+	bool (*ShouldCollide)(void *self, JPC_ObjectLayer inLayer1, JPC_BroadPhaseLayer inLayer2);
+} JPC_ObjectVsBroadPhaseLayerFilterFns;
+
+typedef struct JPC_ObjectVsBroadPhaseLayerFilter {
+	JPC_ObjectVsBroadPhaseLayerFilterFns *fns;
+	void *self;
+} JPC_ObjectVsBroadPhaseLayerFilter;
+
 ////////////////////////////////////////////////////////////////////////////////
 // PhysicsSystem
 

+ 24 - 4
JoltC/JoltC.cpp

@@ -81,7 +81,7 @@ public:
 	}
 
 #if defined(JPH_EXTERNAL_PROFILE) || defined(JPH_PROFILE_ENABLED)
-	const char * GetBroadPhaseLayerName(JPH::BroadPhaseLayer inLayer) const override {
+	const char * GetBroadPhaseLayerName([[maybe_unused]] JPH::BroadPhaseLayer inLayer) const override {
 		return "FIXME";
 	}
 #endif
@@ -95,6 +95,26 @@ static JPC_BroadPhaseLayerInterface_Impl to_jph(JPC_BroadPhaseLayerInterface in)
 	return JPC_BroadPhaseLayerInterface_Impl(in);
 }
 
+////////////////////////////////////////////////////////////////////////////////
+// ObjectVsBroadPhaseLayerFilter
+
+class JPC_ObjectVsBroadPhaseLayerFilter_Impl : public JPH::ObjectVsBroadPhaseLayerFilter {
+public:
+	explicit JPC_ObjectVsBroadPhaseLayerFilter_Impl(JPC_ObjectVsBroadPhaseLayerFilter in) : fns(*in.fns), self(in.self) {}
+
+	bool ShouldCollide(JPH::ObjectLayer inLayer1, JPH::BroadPhaseLayer inLayer2) const override {
+		return fns.ShouldCollide(self, inLayer1, to_jpc(inLayer2));
+	}
+
+private:
+	JPC_ObjectVsBroadPhaseLayerFilterFns fns;
+	void* self;
+};
+
+static JPC_ObjectVsBroadPhaseLayerFilter_Impl to_jph(JPC_ObjectVsBroadPhaseLayerFilter in) {
+	return JPC_ObjectVsBroadPhaseLayerFilter_Impl(in);
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // PhysicsSystem
 
@@ -111,13 +131,13 @@ JPC_API void JPC_PhysicsSystem_Init(
 	uint inNumBodyMutexes,
 	uint inMaxBodyPairs,
 	uint inMaxContactConstraints,
-	JPC_BroadPhaseLayerInterface inBroadPhaseLayerInterface)
-	// const ObjectVsBroadPhaseLayerFilter &inObjectVsBroadPhaseLayerFilter,
+	JPC_BroadPhaseLayerInterface inBroadPhaseLayerInterface,
+	JPC_ObjectVsBroadPhaseLayerFilter inObjectVsBroadPhaseLayerFilter)
 	// const ObjectLayerPairFilter &inObjectLayerPairFilter);
 {
 	auto impl_inBroadPhaseLayerInterface = to_jph(inBroadPhaseLayerInterface);
+	auto impl_inObjectVsBroadPhaseLayerFilter = to_jph(inObjectVsBroadPhaseLayerFilter);
 
-	JPH::ObjectVsBroadPhaseLayerFilter impl_inObjectVsBroadPhaseLayerFilter;
 	JPH::ObjectLayerPairFilter impl_inObjectLayerPairFilter;
 
 	to_jph(self)->Init(