VEX Engine
Retro looking game engine made in vulkan mostly because i wanted to understand it better.
Loading...
Searching...
No Matches
PhysicsDebug.hpp
1#pragma once
2#include <vector>
3#include <mutex>
4#include <glm/glm.hpp>
5#include <atomic>
7
8namespace vex {
9
12 glm::vec3 position;
13 glm::vec4 color;
14};
15
16#if DEBUG
18class VulkanPhysicsDebug : public JPH::DebugRenderer {
19public:
20 VulkanPhysicsDebug() { Initialize(); }
21
23 virtual void DrawLine(JPH::RVec3Arg inFrom, JPH::RVec3Arg inTo, JPH::ColorArg inColor) override {
24 std::lock_guard<std::mutex> lock(m_mutex);
25
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()) };
28
29 glm::vec4 col = {
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
34 };
35
36 m_lines.push_back({ p1, col });
37 m_lines.push_back({ p2, col });
38 }
39
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);
45 }
46
48 virtual void DrawText3D(JPH::RVec3Arg inPos, const std::string_view &inString, JPH::ColorArg inColor, float inHeight) override {}
49
50 class BatchImpl : public JPH::RefTargetVirtual {
51 public:
52 std::vector<JPH::Float3> mVertices;
53 std::vector<JPH::uint32> mIndices;
54 VulkanPhysicsDebug* mRenderer;
55 std::atomic<JPH::uint32> mRefCount = 0;
56
57 BatchImpl(const Vertex* inVertices, int inVertexCount, const JPH::uint32* inIndices, int inIndexCount, VulkanPhysicsDebug* renderer)
58 : mRenderer(renderer)
59 {
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);
63 }
64 if (inIndices) {
65 mIndices.assign(inIndices, inIndices + inIndexCount);
66 }
67 }
68
69 virtual void AddRef() override { ++mRefCount; }
70 virtual void Release() override { if (--mRefCount == 0) delete this; }
71
72 void Draw(JPH::RMat44Arg inModelMatrix, JPH::ColorArg inModelColor) {
73 if (mIndices.empty()) return;
74
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]];
79
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);
83
84 JPH::RVec3 v1 = inModelMatrix * v1Local;
85 JPH::RVec3 v2 = inModelMatrix * v2Local;
86 JPH::RVec3 v3 = inModelMatrix * v3Local;
87
88 mRenderer->DrawLine(v1, v2, inModelColor);
89 mRenderer->DrawLine(v2, v3, inModelColor);
90 mRenderer->DrawLine(v3, v1, inModelColor);
91 }
92 }
93 };
94
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);
98
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);
103
104 indices[i*3 + 0] = i*3 + 0;
105 indices[i*3 + 1] = i*3 + 1;
106 indices[i*3 + 2] = i*3 + 2;
107 }
108
109 return new BatchImpl(verts.data(), static_cast<int>(verts.size()), indices.data(), static_cast<int>(indices.size()), this);
110 }
111
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);
114 }
115
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;
118
119 const Batch& batchRef = inGeometry->mLODs[0].mTriangleBatch;
120 if (BatchImpl* batch = static_cast<BatchImpl*>(batchRef.GetPtr())) {
121 batch->Draw(inModelMatrix, inModelColor);
122 }
123 }
124
125 void Clear() {
126 std::lock_guard<std::mutex> lock(m_mutex);
127 m_lines.clear();
128 }
129
130 const std::vector<DebugVertex>& GetLines() { return m_lines; }
131
132private:
133 std::vector<DebugVertex> m_lines;
134 std::mutex m_mutex;
135};
136#endif
137}
This file exist only because of coliding macros.
Represents a vertex used for debugging purposes.