18class VulkanPhysicsDebug :
public JPH::DebugRenderer {
20 VulkanPhysicsDebug() { Initialize(); }
23 virtual void DrawLine(JPH::RVec3Arg inFrom, JPH::RVec3Arg inTo, JPH::ColorArg inColor)
override {
24 std::lock_guard<std::mutex> lock(m_mutex);
26 glm::vec3 p1 = {
static_cast<float>(inFrom.GetX()),
static_cast<float>(inFrom.GetY()),
static_cast<float>(inFrom.GetZ()) };
27 glm::vec3 p2 = {
static_cast<float>(inTo.GetX()),
static_cast<float>(inTo.GetY()),
static_cast<float>(inTo.GetZ()) };
30 static_cast<float>(inColor.r) / 255.0f,
31 static_cast<float>(inColor.g) / 255.0f,
32 static_cast<float>(inColor.b) / 255.0f,
33 static_cast<float>(inColor.a) / 255.0f
36 m_lines.push_back({ p1, col });
37 m_lines.push_back({ p2, col });
41 virtual void DrawTriangle(JPH::RVec3Arg inV1, JPH::RVec3Arg inV2, JPH::RVec3Arg inV3, JPH::ColorArg inColor, ECastShadow inCastShadow)
override {
42 DrawLine(inV1, inV2, inColor);
43 DrawLine(inV2, inV3, inColor);
44 DrawLine(inV3, inV1, inColor);
48 virtual void DrawText3D(JPH::RVec3Arg inPos,
const std::string_view &inString, JPH::ColorArg inColor,
float inHeight)
override {}
50 class BatchImpl :
public JPH::RefTargetVirtual {
52 std::vector<JPH::Float3> mVertices;
53 std::vector<JPH::uint32> mIndices;
54 VulkanPhysicsDebug* mRenderer;
55 std::atomic<JPH::uint32> mRefCount = 0;
57 BatchImpl(
const Vertex* inVertices,
int inVertexCount,
const JPH::uint32* inIndices,
int inIndexCount, VulkanPhysicsDebug* renderer)
60 mVertices.resize(inVertexCount);
61 for(
int i = 0; i < inVertexCount; ++i) {
62 mVertices[i] = JPH::Float3(inVertices[i].mPosition.x, inVertices[i].mPosition.y, inVertices[i].mPosition.z);
65 mIndices.assign(inIndices, inIndices + inIndexCount);
69 virtual void AddRef()
override { ++mRefCount; }
70 virtual void Release()
override {
if (--mRefCount == 0)
delete this; }
72 void Draw(JPH::RMat44Arg inModelMatrix, JPH::ColorArg inModelColor) {
73 if (mIndices.empty())
return;
75 for (
size_t i = 0; i < mIndices.size(); i += 3) {
76 const JPH::Float3& f1 = mVertices[mIndices[i]];
77 const JPH::Float3& f2 = mVertices[mIndices[i+1]];
78 const JPH::Float3& f3 = mVertices[mIndices[i+2]];
80 JPH::Vec3 v1Local(f1.x, f1.y, f1.z);
81 JPH::Vec3 v2Local(f2.x, f2.y, f2.z);
82 JPH::Vec3 v3Local(f3.x, f3.y, f3.z);
84 JPH::RVec3 v1 = inModelMatrix * v1Local;
85 JPH::RVec3 v2 = inModelMatrix * v2Local;
86 JPH::RVec3 v3 = inModelMatrix * v3Local;
88 mRenderer->DrawLine(v1, v2, inModelColor);
89 mRenderer->DrawLine(v2, v3, inModelColor);
90 mRenderer->DrawLine(v3, v1, inModelColor);
95 virtual Batch CreateTriangleBatch(
const Triangle *inTriangles,
int inTriangleCount)
override {
96 std::vector<Vertex> verts(inTriangleCount * 3);
97 std::vector<JPH::uint32> indices(inTriangleCount * 3);
99 for(
int i=0; i<inTriangleCount; ++i) {
100 verts[i*3 + 0].mPosition = JPH::Float3(inTriangles[i].mV[0].mPosition.x, inTriangles[i].mV[0].mPosition.y, inTriangles[i].mV[0].mPosition.z);
101 verts[i*3 + 1].mPosition = JPH::Float3(inTriangles[i].mV[1].mPosition.x, inTriangles[i].mV[1].mPosition.y, inTriangles[i].mV[1].mPosition.z);
102 verts[i*3 + 2].mPosition = JPH::Float3(inTriangles[i].mV[2].mPosition.x, inTriangles[i].mV[2].mPosition.y, inTriangles[i].mV[2].mPosition.z);
104 indices[i*3 + 0] = i*3 + 0;
105 indices[i*3 + 1] = i*3 + 1;
106 indices[i*3 + 2] = i*3 + 2;
109 return new BatchImpl(verts.data(),
static_cast<int>(verts.size()), indices.data(),
static_cast<int>(indices.size()),
this);
112 virtual Batch CreateTriangleBatch(
const Vertex *inVertices,
int inVertexCount,
const JPH::uint32 *inIndices,
int inIndexCount)
override {
113 return new BatchImpl(inVertices, inVertexCount, inIndices, inIndexCount,
this);
116 virtual void DrawGeometry(JPH::RMat44Arg inModelMatrix,
const JPH::AABox &inWorldSpaceBounds,
float inLODScaleSq, JPH::ColorArg inModelColor,
const GeometryRef &inGeometry, ECullMode inCullMode, ECastShadow inCastShadow, EDrawMode inDrawMode)
override {
117 if (inGeometry->mLODs.empty())
return;
119 const Batch& batchRef = inGeometry->mLODs[0].mTriangleBatch;
120 if (BatchImpl* batch =
static_cast<BatchImpl*
>(batchRef.GetPtr())) {
121 batch->Draw(inModelMatrix, inModelColor);
126 std::lock_guard<std::mutex> lock(m_mutex);
130 const std::vector<DebugVertex>& GetLines() {
return m_lines; }
133 std::vector<DebugVertex> m_lines;
This file exist only because of coliding macros.
Represents a vertex used for debugging purposes.