2
0
Эх сурвалжийг харах

Binding to JPH::DebugRendererSimple

Lucien Greathouse 1 жил өмнө
parent
commit
9e63d9aeb4
2 өөрчлөгдсөн 71 нэмэгдсэн , 18 устгасан
  1. 26 8
      JoltC/Functions.h
  2. 45 10
      JoltC/JoltC.cpp

+ 26 - 8
JoltC/Functions.h

@@ -61,6 +61,15 @@ typedef struct JPC_Quat {
 
 ENSURE_SIZE_ALIGN(JPC_Quat, JPH::Quat)
 
+typedef struct JPC_Color {
+	alignas(uint32_t) uint8_t r;
+	uint8_t g;
+	uint8_t b;
+	uint8_t a;
+} JPC_Color;
+
+ENSURE_SIZE_ALIGN(JPC_Color, JPH::Color)
+
 #ifdef JPC_DOUBLE_PRECISION
 	typedef JPC_DVec3 JPC_RVec3;
 	typedef double Real;
@@ -166,10 +175,7 @@ typedef struct JPC_ObjectVsBroadPhaseLayerFilterFns {
 	bool (*ShouldCollide)(const void *self, JPC_ObjectLayer inLayer1, JPC_BroadPhaseLayer inLayer2);
 } JPC_ObjectVsBroadPhaseLayerFilterFns;
 
-typedef struct JPC_ObjectVsBroadPhaseLayerFilter {
-	const void *self;
-	JPC_ObjectVsBroadPhaseLayerFilterFns fns;
-} JPC_ObjectVsBroadPhaseLayerFilter;
+typedef struct JPC_ObjectVsBroadPhaseLayerFilter JPC_ObjectVsBroadPhaseLayerFilter;
 
 JPC_API JPC_ObjectVsBroadPhaseLayerFilter* JPC_ObjectVsBroadPhaseLayerFilter_new(
 	const void *self,
@@ -184,10 +190,7 @@ typedef struct JPC_ObjectLayerPairFilterFns {
 	bool (*ShouldCollide)(const void *self, JPC_ObjectLayer inLayer1, JPC_ObjectLayer inLayer2);
 } JPC_ObjectLayerPairFilterFns;
 
-typedef struct JPC_ObjectLayerPairFilter {
-	const void *self;
-	JPC_ObjectLayerPairFilterFns fns;
-} JPC_ObjectLayerPairFilter;
+typedef struct JPC_ObjectLayerPairFilter JPC_ObjectLayerPairFilter;
 
 JPC_API JPC_ObjectLayerPairFilter* JPC_ObjectLayerPairFilter_new(
 	const void *self,
@@ -195,6 +198,21 @@ JPC_API JPC_ObjectLayerPairFilter* JPC_ObjectLayerPairFilter_new(
 
 JPC_API void JPC_ObjectLayerPairFilter_delete(JPC_ObjectLayerPairFilter* object);
 
+////////////////////////////////////////////////////////////////////////////////
+// DebugRendererSimple
+
+typedef struct JPC_DebugRendererSimpleFns {
+	void (*DrawLine)(const void *self, JPC_RVec3 inFrom, JPC_RVec3 inTo, JPC_Color inColor);
+} JPC_DebugRendererSimpleFns;
+
+typedef struct JPC_DebugRendererSimple JPC_DebugRendererSimple;
+
+JPC_API JPC_DebugRendererSimple* JPC_DebugRendererSimple_new(
+	const void *self,
+	JPC_DebugRendererSimpleFns fns);
+
+JPC_API void JPC_DebugRendererSimple_delete(JPC_DebugRendererSimple* object);
+
 ////////////////////////////////////////////////////////////////////////////////
 // String
 

+ 45 - 10
JoltC/JoltC.cpp

@@ -11,6 +11,8 @@
 #include <Jolt/Physics/Body/BodyCreationSettings.h>
 #include <Jolt/Physics/Body/BodyActivationListener.h>
 
+#include <Jolt/Renderer/DebugRendererSimple.h>
+
 #include <JoltC/JoltC.h>
 
 #define OPAQUE_WRAPPER(c_type, cpp_type) \
@@ -93,6 +95,13 @@ static JPH::Quat to_jph(JPC_Quat in) {
 	return JPH::Quat(in.x, in.y, in.z, in.w);
 }
 
+static JPC_Color to_jpc(JPH::Color in) {
+	return JPC_Color{in.r, in.g, in.b, in.a};
+}
+static JPH::Color to_jph(JPC_Color in) {
+	return JPH::Color(in.r, in.g, in.b, in.a);
+}
+
 static JPC_BodyID to_jpc(JPH::BodyID in) {
 	return in.GetIndexAndSequenceNumber();
 }
@@ -189,6 +198,7 @@ private:
 };
 
 OPAQUE_WRAPPER(JPC_BroadPhaseLayerInterface, JPC_BroadPhaseLayerInterfaceBridge)
+DESTRUCTOR(JPC_BroadPhaseLayerInterface)
 
 JPC_API JPC_BroadPhaseLayerInterface* JPC_BroadPhaseLayerInterface_new(
 	const void *self,
@@ -197,10 +207,6 @@ JPC_API JPC_BroadPhaseLayerInterface* JPC_BroadPhaseLayerInterface_new(
 	return to_jpc(new JPC_BroadPhaseLayerInterfaceBridge(self, fns));
 }
 
-JPC_API void JPC_BroadPhaseLayerInterface_delete(JPC_BroadPhaseLayerInterface* object) {
-	delete to_jph(object);
-}
-
 ////////////////////////////////////////////////////////////////////////////////
 // ObjectVsBroadPhaseLayerFilter
 
@@ -218,6 +224,7 @@ private:
 };
 
 OPAQUE_WRAPPER(JPC_ObjectVsBroadPhaseLayerFilter, JPC_ObjectVsBroadPhaseLayerFilterBridge)
+DESTRUCTOR(JPC_ObjectVsBroadPhaseLayerFilter)
 
 JPC_API JPC_ObjectVsBroadPhaseLayerFilter* JPC_ObjectVsBroadPhaseLayerFilter_new(
 	const void *self,
@@ -226,10 +233,6 @@ JPC_API JPC_ObjectVsBroadPhaseLayerFilter* JPC_ObjectVsBroadPhaseLayerFilter_new
 	return to_jpc(new JPC_ObjectVsBroadPhaseLayerFilterBridge(self, fns));
 }
 
-JPC_API void JPC_ObjectVsBroadPhaseLayerFilter_delete(JPC_ObjectVsBroadPhaseLayerFilter* object) {
-	delete to_jph(object);
-}
-
 ////////////////////////////////////////////////////////////////////////////////
 // JPC_ObjectLayerPairFilter
 
@@ -247,6 +250,7 @@ private:
 };
 
 OPAQUE_WRAPPER(JPC_ObjectLayerPairFilter, JPC_ObjectLayerPairFilterBridge)
+DESTRUCTOR(JPC_ObjectLayerPairFilter)
 
 JPC_API JPC_ObjectLayerPairFilter* JPC_ObjectLayerPairFilter_new(
 	const void *self,
@@ -255,8 +259,39 @@ JPC_API JPC_ObjectLayerPairFilter* JPC_ObjectLayerPairFilter_new(
 	return to_jpc(new JPC_ObjectLayerPairFilterBridge(self, fns));
 }
 
-JPC_API void JPC_ObjectLayerPairFilter_delete(JPC_ObjectLayerPairFilter* object) {
-	delete to_jph(object);
+////////////////////////////////////////////////////////////////////////////////
+// DebugRendererSimple
+
+class JPC_DebugRendererSimpleBridge final : public JPH::DebugRendererSimple {
+public:
+	explicit JPC_DebugRendererSimpleBridge(const void *self, JPC_DebugRendererSimpleFns fns) : self(self), fns(fns) {}
+
+	virtual void DrawLine(JPH::RVec3Arg inFrom, JPH::RVec3Arg inTo, JPH::ColorArg inColor) override {
+		fns.DrawLine(self, to_jpc(inFrom), to_jpc(inTo), to_jpc(inColor));
+	}
+
+	virtual void DrawText3D(
+		[[maybe_unused]] JPH::RVec3Arg inPosition,
+		[[maybe_unused]] const std::string_view &inString,
+		[[maybe_unused]] JPH::ColorArg inColor = JPH::Color::sWhite,
+		[[maybe_unused]] float inHeight = 0.5f) override
+	{
+		// TODO
+	}
+
+private:
+	const void* self;
+	JPC_DebugRendererSimpleFns fns;
+};
+
+OPAQUE_WRAPPER(JPC_DebugRendererSimple, JPC_DebugRendererSimpleBridge)
+DESTRUCTOR(JPC_DebugRendererSimple)
+
+JPC_API JPC_DebugRendererSimple* JPC_DebugRendererSimple_new(
+	const void *self,
+	JPC_DebugRendererSimpleFns fns)
+{
+	return to_jpc(new JPC_DebugRendererSimpleBridge(self, fns));
 }
 
 ////////////////////////////////////////////////////////////////////////////////