SleakEngine 1.0.0
C++23 multi-backend game engine
Loading...
Searching...
No Matches
DebugOverlay.cpp
Go to the documentation of this file.
4#include <Core/GameBase.hpp>
5#include <Camera/Camera.hpp>
6#include <Core/SceneBase.hpp>
8#include <UI/UI.hpp>
9
10namespace Sleak {
11
16
18 GameBase* game) {
19 m_renderer = renderer;
20 m_game = game;
23}
24
25void DebugOverlay::Render(float deltaTime) {
26 if (!m_renderer || !m_renderer->GetImGUIEnabled() || !m_visible)
27 return;
28
29 // Refresh cached metrics on interval
30 m_metricTimer += deltaTime;
31 if (m_metricTimer >= m_config.MetricRefreshInterval) {
32 m_cachedMetrics = SystemMetrics::Query();
33 m_metricTimer = 0.0f;
34 }
35
36 if (m_config.ShowCameraPanel) RenderCameraPanel();
37 if (m_config.ShowPerformancePanel) RenderPerformancePanel();
38}
39
40void DebugOverlay::RenderCameraPanel() {
41 Camera* camera = nullptr;
42 if (m_game && m_game->GetActiveScene())
43 camera = m_game->GetActiveScene()->GetActiveCamera();
44 if (!camera) return;
45
46 UI::BeginPanel("Camera", 0, 0, m_config.PanelAlpha,
48
49 UI::Text("%s", camera->GetName().c_str());
50 UI::Text("Position: %s",
51 camera->GetPosition().ToString().c_str());
52 UI::Text("Direction: %s",
53 camera->GetDirection().ToString().c_str());
54 UI::Text("Look At: %s",
55 camera->GetLookTarget().ToString().c_str());
56 UI::Text("Up: %s",
57 camera->GetUp().ToString().c_str());
58
59 float fov = camera->GetFieldOfView();
60 if (UI::DragFloat("FOV", &fov, 1.0f, 30.0f, 125.0f))
61 camera->SetFieldOfView(fov);
62
63 const char* projStr =
65 ? "Perspective"
66 : "Orthographic";
67 UI::Text("Projection: %s", projStr);
68 UI::Text("Near: %.2f Far: %.2f", camera->GetNearPlane(),
69 camera->GetFarPlane());
70
72 if (UI::Button("To Origin"))
73 camera->SetPosition({0, 0, -5});
75 if (UI::Button("Look Forward"))
76 camera->SetDirection({0, 0, 1});
78
80
81 // FreeLookCameraController section
82 auto* controller =
83 camera->GetComponent<FreeLookCameraController>();
84 if (controller) {
85 UI::BeginChild("Camera Controller");
86
87 bool enabled = controller->IsEnabled();
88 if (enabled)
89 UI::TextColored(0, 1, 0, 1, "Camera control Enabled");
90 else
91 UI::TextColored(1, 0, 0, 1, "Camera control Disabled");
92
93 float yaw = controller->GetYaw();
94 if (UI::DragFloat(
95 "Yaw", &yaw, 1.0f,
96 controller->GetYawRange().GetX(),
97 controller->GetYawRange().GetY()))
98 controller->SetYaw(yaw);
99
100 float pitch = controller->GetPitch();
101 if (UI::DragFloat(
102 "Pitch", &pitch, 1.0f,
103 controller->GetPitchRange().GetX(),
104 controller->GetPitchRange().GetY()))
105 controller->SetPitch(pitch);
106
107 float roll = controller->GetRoll();
108 if (UI::DragFloat(
109 "Roll", &roll, 1.0f,
110 controller->GetRollRange().GetX(),
111 controller->GetRollRange().GetY()))
112 controller->SetRoll(roll);
113
114 UI::Text("Speed: %.2f / %.2f", controller->GetSpeed(),
115 controller->GetMaxSpeed());
116 UI::Text("Acceleration: %.2f",
117 controller->GetAcceleration());
118 UI::Text("Velocity: %s",
119 controller->GetVelocity().ToString().c_str());
120 UI::Text("Input: %s",
121 controller->GetTranslationInput()
122 .ToString()
123 .c_str());
124
125 UI::EndChild();
126 }
127
128 UI::EndPanel();
129}
130
131void DebugOverlay::RenderPerformancePanel() {
132 float viewportWidth = UI::GetViewportWidth();
133
134 UI::BeginPanel("Performance", viewportWidth - 240, 0,
135 m_config.PanelAlpha, UI::PanelFlags_AutoResize);
136
137 // Color-coded renderer type
138 switch (m_renderer->GetType()) {
140 UI::TextColored(0.0f, 0.5f, 1.0f, 1.0f, "DirectX 12");
141 break;
143 UI::TextColored(0.2f, 0.6f, 0.8f, 1.0f, "DirectX 11");
144 break;
146 UI::TextColored(0.8f, 0.2f, 0.0f, 1.0f, "Vulkan");
147 break;
149 UI::TextColored(0.0f, 0.8f, 0.2f, 1.0f, "OpenGL");
150 break;
151 default:
152 UI::TextColored(0.5f, 0.5f, 0.5f, 1.0f, "Unknown");
153 break;
154 }
155
157 UI::Text("FPS: %d", m_renderer->GetFrameRate());
158 UI::Text("Frame Time: %.2f ms", m_renderer->GetFrameTime());
159
161 UI::Text("Vertices: %d", m_renderer->GetVertices());
162 UI::Text("Triangles: %d", m_renderer->GetTriangles());
163
165 UI::Text("CPU: %.1f%%", m_cachedMetrics.CpuUsagePercent);
166 UI::Text("RAM: %.1f MB", m_cachedMetrics.RamUsageMB);
167
168 if (m_cachedMetrics.GpuUsagePercent > 0.0f)
169 UI::Text("GPU: %.1f%%", m_cachedMetrics.GpuUsagePercent);
170 else
171 UI::TextDisabled("GPU: N/A");
172
174 if (UI::Checkbox("Show Colliders", &m_showColliders)) {
175 DebugLineRenderer::SetEnabled(m_showColliders);
176 }
177
179 UI::Text("Anti-Aliasing");
180 {
181 const char* labels[] = {"Off", "2x", "4x", "8x"};
182 int values[] = {1, 2, 4, 8};
183 int count = 1;
184 uint32_t maxMSAA = m_renderer->GetMaxMSAASampleCount();
185 for (int i = 1; i < 4; i++)
186 if (static_cast<uint32_t>(values[i]) <= maxMSAA) count = i + 1;
187 int current = 0;
188 for (int i = 0; i < count; i++)
189 if (static_cast<uint32_t>(values[i]) == m_renderer->GetMSAASampleCount()) current = i;
190 if (UI::Combo("MSAA", &current, labels, count))
191 m_renderer->SetMSAASampleCount(values[current]);
192 }
193
194 UI::EndPanel();
195}
196
197} // namespace Sleak
void SetFieldOfView(float fov)
Definition Camera.hpp:69
void SetPosition(const Math::Vector3D &position)
Definition Camera.hpp:78
Math::Vector3D GetPosition() const
Definition Camera.hpp:80
float GetFieldOfView() const
Definition Camera.hpp:70
float GetFarPlane() const
Definition Camera.hpp:76
Math::Vector3D GetLookTarget() const
Definition Camera.hpp:92
Math::Vector3D GetUp() const
Definition Camera.hpp:95
Math::Vector3D GetDirection() const
Definition Camera.hpp:82
ProjectionType GetProjectionType() const
Definition Camera.hpp:98
void SetDirection(const Math::Vector3D &direction)
Definition Camera.hpp:83
float GetNearPlane() const
Definition Camera.hpp:73
static void SetEnabled(bool enabled)
static void Initialize()
Allocates the shared vertex buffer, shader, and constant buffer.
void Initialize(RenderEngine::Renderer *renderer, GameBase *game)
void Render(float deltaTime)
Refreshes cached metrics on the configured interval and draws the enabled panels.
virtual SceneBase * GetActiveScene()
Definition GameBase.hpp:105
T * GetComponent()
Finds the first attached component of type T, or nullptr.
std::string ToString() const
Definition Vector.hpp:480
const std::string & GetName() const
Definition Object.hpp:25
Abstract render backend: swapchain, frame lifecycle, and post-effect toggles.
Definition Renderer.hpp:37
Camera * GetActiveCamera() const
static SystemMetricsData Query()
Reads the current CPU/RAM/GPU usage from the OS.
@ PanelFlags_AutoResize
Definition UI.hpp:17
ENGINE_API void Separator()
Definition UI.cpp:74
ENGINE_API bool Button(const char *label)
Definition UI.cpp:62
ENGINE_API float GetViewportWidth()
Definition UI.cpp:102
ENGINE_API void BeginGroup()
Definition UI.cpp:82
ENGINE_API void TextColored(float r, float g, float b, float a, const char *fmt,...)
Definition UI.cpp:44
ENGINE_API void EndGroup()
Definition UI.cpp:86
ENGINE_API void BeginChild(const char *name)
Definition UI.cpp:90
ENGINE_API void EndChild()
Definition UI.cpp:98
ENGINE_API void Text(const char *fmt,...)
Definition UI.cpp:37
ENGINE_API void TextDisabled(const char *fmt,...)
Definition UI.cpp:51
ENGINE_API void SameLine()
Definition UI.cpp:78
ENGINE_API void BeginPanel(const char *name, float x, float y, float bgAlpha=0.4f, int flags=PanelFlags_NoTitleBar|PanelFlags_AutoResize|PanelFlags_NoMove|PanelFlags_NoInput|PanelFlags_NoFocusOnAppear)
Opens a floating overlay window at (x, y); pair with EndPanel.
Definition UI.cpp:14
ENGINE_API bool Checkbox(const char *label, bool *value)
Definition UI.cpp:58
ENGINE_API bool Combo(const char *label, int *current, const char *const items[], int count)
Definition UI.cpp:70
ENGINE_API void EndPanel()
Definition UI.cpp:33
ENGINE_API bool DragFloat(const char *label, float *value, float speed=1.0f, float min=0.0f, float max=0.0f)
Definition UI.cpp:66
Root namespace for everything the engine exposes.
Definition Camera.hpp:10