Skip to content

Commit e93dbdf

Browse files
committed
Added F3 physics debug overlay
1 parent 7586cd8 commit e93dbdf

File tree

12 files changed

+460
-21
lines changed

12 files changed

+460
-21
lines changed

igneous/CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ set(SOURCES
1111
src/ecs/ecs.cpp
1212
src/gui/gui.cpp
1313
src/gui/imgui_assets.h
14+
src/physics/debugRenderer.cpp
15+
src/physics/debugRenderer.hpp
1416
src/physics/physics.cpp
1517
src/renderer/camera.cpp
1618
src/renderer/capture.cpp
@@ -71,6 +73,10 @@ add_asset_shaders(igneous
7173
HEADER src/gui/imgui_assets.h
7274
shaders/fs_imgui.sc
7375
shaders/vs_imgui.sc
76+
77+
HEADER src/physics/debug_assets.h
78+
shaders/fs_debug.sc
79+
shaders/vs_debug.sc
7480
)
7581

7682
configure_file (include/igneous/core/version.hpp.in include/igneous/core/version.hpp @ONLY)

igneous/include/igneous/core/log.hpp

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -30,19 +30,19 @@ class Log
3030
} // end namespace igneous
3131

3232
#if IG_DEBUG
33-
#define IG_CORE_TRACE(...) Log::getInstance().getCoreLogger()->trace(__VA_ARGS__)
34-
#define IG_CORE_INFO(...) Log::getInstance().getCoreLogger()->info(__VA_ARGS__)
35-
#define IG_CORE_WARN(...) Log::getInstance().getCoreLogger()->warn(__VA_ARGS__)
36-
#define IG_CORE_ERROR(...) Log::getInstance().getCoreLogger()->error(__VA_ARGS__)
37-
#define IG_CORE_CRITICAL(...) {Log::getInstance().getCoreLogger()->critical(__VA_ARGS__); abort();}
38-
#define IG_CORE_LOG(msg, level) Log::getInstance().getCoreLogger()->log((spdlog::level::level_enum)level, msg)
33+
#define IG_CORE_TRACE(...) igneous::Log::getInstance().getCoreLogger()->trace(__VA_ARGS__)
34+
#define IG_CORE_INFO(...) igneous::Log::getInstance().getCoreLogger()->info(__VA_ARGS__)
35+
#define IG_CORE_WARN(...) igneous::Log::getInstance().getCoreLogger()->warn(__VA_ARGS__)
36+
#define IG_CORE_ERROR(...) igneous::Log::getInstance().getCoreLogger()->error(__VA_ARGS__)
37+
#define IG_CORE_CRITICAL(...) {igneous::Log::getInstance().getCoreLogger()->critical(__VA_ARGS__); abort();}
38+
#define IG_CORE_LOG(msg, level) igneous::Log::getInstance().getCoreLogger()->log((spdlog::level::level_enum)level, msg)
3939

40-
#define IG_CLIENT_TRACE(...) Log::getInstance().getClientLogger()->trace(__VA_ARGS__)
41-
#define IG_CLIENT_INFO(...) Log::getInstance().getClientLogger()->info(__VA_ARGS__)
42-
#define IG_CLIENT_WARN(...) Log::getInstance().getClientLogger()->warn(__VA_ARGS__)
43-
#define IG_CLIENT_ERROR(...) Log::getInstance().getClientLogger()->error(__VA_ARGS__)
44-
#define IG_CLIENT_CRITICAL(...) {Log::getInstance().getClientLogger()->critical(__VA_ARGS__); abort();}
45-
#define IG_CLIENT_LOG(msg, level) Log::getInstance().getClientLogger()->log((spdlog::level::level_enum)level, msg)
40+
#define IG_CLIENT_TRACE(...) igneous::Log::getInstance().getClientLogger()->trace(__VA_ARGS__)
41+
#define IG_CLIENT_INFO(...) igneous::Log::getInstance().getClientLogger()->info(__VA_ARGS__)
42+
#define IG_CLIENT_WARN(...) igneous::Log::getInstance().getClientLogger()->warn(__VA_ARGS__)
43+
#define IG_CLIENT_ERROR(...) igneous::Log::getInstance().getClientLogger()->error(__VA_ARGS__)
44+
#define IG_CLIENT_CRITICAL(...) {igneous::Log::getInstance().getClientLogger()->critical(__VA_ARGS__); abort();}
45+
#define IG_CLIENT_LOG(msg, level) igneous::Log::getInstance().getClientLogger()->log((spdlog::level::level_enum)level, msg)
4646
#else
4747
#define IG_CORE_TRACE(...)
4848
#define IG_CORE_INFO(...)
@@ -59,9 +59,9 @@ class Log
5959
#define IG_CLIENT_LOG(msg, level)
6060
#endif
6161

62-
#define IG_CONSOLE_TRACE(...) Log::getInstance().getConsoleLogger()->trace(__VA_ARGS__)
63-
#define IG_CONSOLE_INFO(...) Log::getInstance().getConsoleLogger()->info(__VA_ARGS__)
64-
#define IG_CONSOLE_WARN(...) Log::getInstance().getConsoleLogger()->warn(__VA_ARGS__)
65-
#define IG_CONSOLE_ERROR(...) Log::getInstance().getConsoleLogger()->error(__VA_ARGS__)
66-
#define IG_CONSOLE_CRITICAL(...) {Log::getInstance().getConsoleLogger()->critical(__VA_ARGS__); abort();}
67-
#define IG_CONSOLE_LOG(msg, level) Log::getInstance().getConsoleLogger()->log((spdlog::level::level_enum)level, msg)
62+
#define IG_CONSOLE_TRACE(...) igneous::Log::getInstance().getConsoleLogger()->trace(__VA_ARGS__)
63+
#define IG_CONSOLE_INFO(...) igneous::Log::getInstance().getConsoleLogger()->info(__VA_ARGS__)
64+
#define IG_CONSOLE_WARN(...) igneous::Log::getInstance().getConsoleLogger()->warn(__VA_ARGS__)
65+
#define IG_CONSOLE_ERROR(...) igneous::Log::getInstance().getConsoleLogger()->error(__VA_ARGS__)
66+
#define IG_CONSOLE_CRITICAL(...) {igneous::Log::getInstance().getConsoleLogger()->critical(__VA_ARGS__); abort();}
67+
#define IG_CONSOLE_LOG(msg, level) igneous::Log::getInstance().getConsoleLogger()->log((spdlog::level::level_enum)level, msg)

igneous/include/igneous/physics/physics.hpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,28 @@ namespace igneous {
88

99
typedef btRigidBody* RigidBodyHandle;
1010

11+
enum DebugDrawModes
12+
{
13+
DBG_NoDebug = 0,
14+
DBG_DrawWireframe = 1,
15+
DBG_DrawAabb = 2,
16+
DBG_DrawFeaturesText = 4,
17+
DBG_DrawContactPoints = 8,
18+
DBG_NoDeactivation = 16,
19+
DBG_NoHelpText = 32,
20+
DBG_DrawText = 64,
21+
DBG_ProfileTimings = 128,
22+
DBG_EnableSatComparison = 256,
23+
DBG_DisableBulletLCP = 512,
24+
DBG_EnableCCD = 1024,
25+
DBG_DrawConstraints = (1 << 11),
26+
DBG_DrawConstraintLimits = (1 << 12),
27+
DBG_FastWireframe = (1 << 13),
28+
DBG_DrawNormals = (1 << 14),
29+
DBG_DrawFrames = (1 << 15),
30+
DBG_MAX_DEBUG_DRAW_MODE
31+
};
32+
1133
namespace physics
1234
{
1335
void init();

igneous/shaders/fs_debug.sc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
$input v_color0
2+
3+
#include <bgfx_shader.sh>
4+
5+
void main()
6+
{
7+
gl_FragColor = vec4(v_color0.xyz, 1.0f);
8+
}

igneous/shaders/varying.def.sc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0);
1+
vec4 v_color0 : COLOR0 = vec4(0.0, 0.0, 0.0, 1.0);
22
vec3 v_normal : NORMAL = vec3(0.0, 0.0, 1.0);
33
vec2 v_texcoord0 : TEXCOORD0 = vec2(0.0, 0.0);
44

igneous/shaders/vs_debug.sc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
$input a_position, a_color0
2+
$output v_color0
3+
4+
#include <bgfx_shader.sh>
5+
6+
void main()
7+
{
8+
gl_Position = mul(u_modelViewProj, vec4(a_position, 1.0) );
9+
v_color0 = a_color0;
10+
}

igneous/src/physics/debugRenderer.cpp

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
#include "debugRenderer.hpp"
2+
3+
#include <vector>
4+
5+
#include "igneous/core/log.hpp"
6+
#include "igneous/core/input.hpp"
7+
8+
#include "debug_assets.h"
9+
10+
namespace igneous {
11+
namespace physics
12+
{
13+
struct DebugVertex
14+
{
15+
float x, y, z;
16+
float r, g, b;
17+
static void init()
18+
{
19+
ms_decl
20+
.begin()
21+
.add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float)
22+
.add(bgfx::Attrib::Color0, 3, bgfx::AttribType::Float)
23+
.end();
24+
}
25+
static bgfx::VertexDecl ms_decl;
26+
};
27+
28+
bgfx::VertexDecl DebugVertex::ms_decl;
29+
30+
static bgfx::ProgramHandle debugProgram;
31+
static std::vector<DebugVertex> debugVertices;
32+
static std::vector<uint16_t> debugIndicies;
33+
34+
DebugRenderer::DebugRenderer()
35+
: debugMode(DBG_NoDebug)
36+
{
37+
bgfx::ShaderHandle fs = bgfx::createShader(bgfx::makeRef(fs_debug(), fs_debug_len()));
38+
bgfx::ShaderHandle vs = bgfx::createShader(bgfx::makeRef(vs_debug(), vs_debug_len()));
39+
debugProgram = bgfx::createProgram(vs, fs, true);
40+
DebugVertex::init();
41+
}
42+
43+
DebugRenderer::~DebugRenderer()
44+
{
45+
bgfx::destroy(debugProgram);
46+
}
47+
48+
void DebugRenderer::drawLine(const btVector3& from, const btVector3& to, const btVector3& color)
49+
{
50+
DebugVertex fromVertex;
51+
fromVertex.x = from.getX();
52+
fromVertex.y = from.getY();
53+
fromVertex.z = from.getZ();
54+
fromVertex.r = color.getX();
55+
fromVertex.g = color.getY();
56+
fromVertex.b = color.getZ();
57+
58+
DebugVertex toVertex;
59+
toVertex.x = to.getX();
60+
toVertex.y = to.getY();
61+
toVertex.z = to.getZ();
62+
toVertex.r = color.getX();
63+
toVertex.g = color.getY();
64+
toVertex.b = color.getZ();
65+
66+
debugVertices.push_back(fromVertex);
67+
debugVertices.push_back(toVertex);
68+
69+
debugIndicies.push_back(debugIndicies.size());
70+
debugIndicies.push_back(debugIndicies.size());
71+
}
72+
73+
void DebugRenderer::render()
74+
{
75+
bgfx::VertexBufferHandle vb = bgfx::createVertexBuffer(bgfx::makeRef(debugVertices.data(), (uint32_t)debugVertices.size() * DebugVertex::ms_decl.getStride()), DebugVertex::ms_decl);
76+
bgfx::setVertexBuffer(0, vb);
77+
bgfx::IndexBufferHandle ib = bgfx::createIndexBuffer(bgfx::makeRef(debugIndicies.data(), (uint32_t)debugIndicies.size() * sizeof(uint16_t)));
78+
bgfx::setIndexBuffer(ib);
79+
bgfx::setState(BGFX_STATE_WRITE_RGB | BGFX_STATE_PT_LINES | BGFX_STATE_LINEAA);
80+
bgfx::setViewRect(100, 0, 0, input::width, input::height);
81+
bgfx::submit(100, debugProgram);
82+
bgfx::destroy(vb);
83+
bgfx::destroy(ib);
84+
debugVertices.clear();
85+
debugIndicies.clear();
86+
bgfx::setState(BGFX_STATE_DEFAULT);
87+
}
88+
89+
void DebugRenderer::drawContactPoint(const btVector3& PointOnB, const btVector3& normalOnB, btScalar distance, int lifeTime, const btVector3& color)
90+
{
91+
92+
}
93+
94+
void DebugRenderer::reportErrorWarning(const char* warningString)
95+
{
96+
IG_CORE_ERROR(warningString);
97+
}
98+
99+
void DebugRenderer::draw3dText(const btVector3& location, const char* textString)
100+
{
101+
102+
}
103+
104+
void DebugRenderer::setDebugMode(int debugMode)
105+
{
106+
this->debugMode = debugMode;
107+
}
108+
109+
int DebugRenderer::getDebugMode() const
110+
{
111+
return debugMode;
112+
}
113+
}
114+
} // end namespace igneous

igneous/src/physics/debugRenderer.hpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#pragma once
2+
3+
#include <bgfx/bgfx.h>
4+
#include <LinearMath/btIDebugDraw.h>
5+
6+
namespace igneous {
7+
namespace physics
8+
{
9+
class DebugRenderer : public btIDebugDraw
10+
{
11+
public:
12+
DebugRenderer();
13+
~DebugRenderer();
14+
15+
void render();
16+
17+
void drawLine(const btVector3& from, const btVector3& to, const btVector3& color);
18+
void drawContactPoint(const btVector3& PointOnB, const btVector3& normalOnB, btScalar distance, int lifeTime, const btVector3& color);
19+
void reportErrorWarning(const char* warningString);
20+
void draw3dText(const btVector3& location, const char* textString);
21+
void setDebugMode(int debugMode);
22+
int getDebugMode() const;
23+
private:
24+
int debugMode;
25+
};
26+
}
27+
} // end namespace igneous

0 commit comments

Comments
 (0)