summaryrefslogtreecommitdiff
path: root/src/3d/visual_debug.cc
diff options
context:
space:
mode:
authorskal <pascal.massimino@gmail.com>2026-02-02 15:55:03 +0100
committerskal <pascal.massimino@gmail.com>2026-02-02 15:55:03 +0100
commitc194f59e171a1e58ce1704f37d99ffcd09a42433 (patch)
treef77a32f2c4c23b335209b8df11cc82920388b51a /src/3d/visual_debug.cc
parent316825883c705ed0fe927c32e072f98141d3eaa3 (diff)
fix(gpu): Resolve high-DPI squished rendering and 3D shadow bugs
- Implemented dynamic resolution support in all shaders and effects. - Added explicit viewport setting for all render passes to ensure correct scaling. - Fixed 3D shadow mapping by adding PLANE support and standardizing soft shadow logic. - Propagated resize events through the Effect hierarchy. - Applied project-wide code formatting.
Diffstat (limited to 'src/3d/visual_debug.cc')
-rw-r--r--src/3d/visual_debug.cc98
1 files changed, 62 insertions, 36 deletions
diff --git a/src/3d/visual_debug.cc b/src/3d/visual_debug.cc
index 361372b..daa1033 100644
--- a/src/3d/visual_debug.cc
+++ b/src/3d/visual_debug.cc
@@ -5,8 +5,8 @@
#if !defined(STRIP_ALL)
-#include <cstring>
#include <cstdio>
+#include <cstring>
// Simple shader for drawing colored lines
static const char* kDebugShaderCode = R"(
@@ -42,10 +42,11 @@ fn fs_main(in : VertexOutput) -> @location(0) vec4<f32> {
void VisualDebug::init(WGPUDevice device, WGPUTextureFormat format) {
device_ = device;
create_pipeline(format);
-
+
// Initial capacity for vertex buffer (e.g., 1024 lines)
- vertex_buffer_capacity_ = 1024 * 2 * sizeof(float) * 6; // 2 verts per line, 6 floats per vert
-
+ vertex_buffer_capacity_ =
+ 1024 * 2 * sizeof(float) * 6; // 2 verts per line, 6 floats per vert
+
WGPUBufferDescriptor vb_desc = {};
vb_desc.usage = WGPUBufferUsage_Vertex | WGPUBufferUsage_CopyDst;
vb_desc.size = vertex_buffer_capacity_;
@@ -58,11 +59,16 @@ void VisualDebug::init(WGPUDevice device, WGPUTextureFormat format) {
}
void VisualDebug::shutdown() {
- if (pipeline_) wgpuRenderPipelineRelease(pipeline_);
- if (bind_group_layout_) wgpuBindGroupLayoutRelease(bind_group_layout_);
- if (vertex_buffer_) wgpuBufferRelease(vertex_buffer_);
- if (uniform_buffer_) wgpuBufferRelease(uniform_buffer_);
- if (bind_group_) wgpuBindGroupRelease(bind_group_);
+ if (pipeline_)
+ wgpuRenderPipelineRelease(pipeline_);
+ if (bind_group_layout_)
+ wgpuBindGroupLayoutRelease(bind_group_layout_);
+ if (vertex_buffer_)
+ wgpuBufferRelease(vertex_buffer_);
+ if (uniform_buffer_)
+ wgpuBufferRelease(uniform_buffer_);
+ if (bind_group_)
+ wgpuBindGroupRelease(bind_group_);
}
void VisualDebug::create_pipeline(WGPUTextureFormat format) {
@@ -82,7 +88,8 @@ void VisualDebug::create_pipeline(WGPUTextureFormat format) {
WGPUPipelineLayoutDescriptor pl_desc = {};
pl_desc.bindGroupLayoutCount = 1;
pl_desc.bindGroupLayouts = &bind_group_layout_;
- WGPUPipelineLayout pipeline_layout = wgpuDeviceCreatePipelineLayout(device_, &pl_desc);
+ WGPUPipelineLayout pipeline_layout =
+ wgpuDeviceCreatePipelineLayout(device_, &pl_desc);
// Shader
#if defined(DEMO_CROSS_COMPILE_WIN32)
@@ -98,7 +105,8 @@ void VisualDebug::create_pipeline(WGPUTextureFormat format) {
WGPUShaderModuleDescriptor shader_desc = {};
shader_desc.nextInChain = (const WGPUChainedStruct*)&wgsl_desc.chain;
#endif
- WGPUShaderModule shader_module = wgpuDeviceCreateShaderModule(device_, &shader_desc);
+ WGPUShaderModule shader_module =
+ wgpuDeviceCreateShaderModule(device_, &shader_desc);
// Vertex State
WGPUVertexAttribute attributes[2];
@@ -137,7 +145,7 @@ void VisualDebug::create_pipeline(WGPUTextureFormat format) {
fragment_state.entryPoint = {"fs_main", 7};
#endif
fragment_state.targetCount = 1;
-
+
WGPUColorTargetState color_target = {};
color_target.format = format;
color_target.writeMask = WGPUColorWriteMask_All;
@@ -152,7 +160,8 @@ void VisualDebug::create_pipeline(WGPUTextureFormat format) {
WGPUDepthStencilState depth_stencil = {};
depth_stencil.format = WGPUTextureFormat_Depth24Plus;
depth_stencil.depthWriteEnabled = WGPUOptionalBool_False; // Don't write depth
- depth_stencil.depthCompare = WGPUCompareFunction_Less; // But do test against it
+ depth_stencil.depthCompare =
+ WGPUCompareFunction_Less; // But do test against it
pipeline_desc.depthStencil = &depth_stencil;
pipeline_desc.multisample.count = 1;
@@ -177,9 +186,12 @@ void VisualDebug::add_box(const vec3& c, const vec3& e, const vec3& color) {
// 12 edges (each 2 vertices)
DebugLine edges[] = {
- {p0, p1, color}, {p1, p2, color}, {p2, p3, color}, {p3, p0, color}, // Front face
- {p4, p5, color}, {p5, p6, color}, {p6, p7, color}, {p7, p4, color}, // Back face
- {p0, p4, color}, {p1, p5, color}, {p2, p6, color}, {p3, p7, color} // Connecting edges
+ {p0, p1, color}, {p1, p2, color},
+ {p2, p3, color}, {p3, p0, color}, // Front face
+ {p4, p5, color}, {p5, p6, color},
+ {p6, p7, color}, {p7, p4, color}, // Back face
+ {p0, p4, color}, {p1, p5, color},
+ {p2, p6, color}, {p3, p7, color} // Connecting edges
};
for (const auto& l : edges) {
@@ -189,7 +201,8 @@ void VisualDebug::add_box(const vec3& c, const vec3& e, const vec3& color) {
void VisualDebug::update_buffers(const mat4& view_proj) {
// Update Uniforms
- wgpuQueueWriteBuffer(wgpuDeviceGetQueue(device_), uniform_buffer_, 0, &view_proj, sizeof(mat4));
+ wgpuQueueWriteBuffer(wgpuDeviceGetQueue(device_), uniform_buffer_, 0,
+ &view_proj, sizeof(mat4));
// Update Vertices
size_t required_size = lines_.size() * 2 * sizeof(float) * 6;
@@ -207,38 +220,51 @@ void VisualDebug::update_buffers(const mat4& view_proj) {
std::vector<float> vertex_data;
vertex_data.reserve(lines_.size() * 12); // 2 verts * 6 floats
for (const auto& line : lines_) {
- vertex_data.push_back(line.start.x); vertex_data.push_back(line.start.y); vertex_data.push_back(line.start.z);
- vertex_data.push_back(line.color.x); vertex_data.push_back(line.color.y); vertex_data.push_back(line.color.z);
-
- vertex_data.push_back(line.end.x); vertex_data.push_back(line.end.y); vertex_data.push_back(line.end.z);
- vertex_data.push_back(line.color.x); vertex_data.push_back(line.color.y); vertex_data.push_back(line.color.z);
+ vertex_data.push_back(line.start.x);
+ vertex_data.push_back(line.start.y);
+ vertex_data.push_back(line.start.z);
+ vertex_data.push_back(line.color.x);
+ vertex_data.push_back(line.color.y);
+ vertex_data.push_back(line.color.z);
+
+ vertex_data.push_back(line.end.x);
+ vertex_data.push_back(line.end.y);
+ vertex_data.push_back(line.end.z);
+ vertex_data.push_back(line.color.x);
+ vertex_data.push_back(line.color.y);
+ vertex_data.push_back(line.color.z);
}
- wgpuQueueWriteBuffer(wgpuDeviceGetQueue(device_), vertex_buffer_, 0, vertex_data.data(), vertex_data.size() * sizeof(float));
+ wgpuQueueWriteBuffer(wgpuDeviceGetQueue(device_), vertex_buffer_, 0,
+ vertex_data.data(),
+ vertex_data.size() * sizeof(float));
}
-
- // Re-create bind group if needed (e.g. if uniform buffer changed, though here it's static)
+
+ // Re-create bind group if needed (e.g. if uniform buffer changed, though here
+ // it's static)
if (!bind_group_) {
- WGPUBindGroupEntry bg_entry = {};
- bg_entry.binding = 0;
- bg_entry.buffer = uniform_buffer_;
- bg_entry.size = sizeof(mat4);
+ WGPUBindGroupEntry bg_entry = {};
+ bg_entry.binding = 0;
+ bg_entry.buffer = uniform_buffer_;
+ bg_entry.size = sizeof(mat4);
- WGPUBindGroupDescriptor bg_desc = {};
- bg_desc.layout = bind_group_layout_;
- bg_desc.entryCount = 1;
- bg_desc.entries = &bg_entry;
- bind_group_ = wgpuDeviceCreateBindGroup(device_, &bg_desc);
+ WGPUBindGroupDescriptor bg_desc = {};
+ bg_desc.layout = bind_group_layout_;
+ bg_desc.entryCount = 1;
+ bg_desc.entries = &bg_entry;
+ bind_group_ = wgpuDeviceCreateBindGroup(device_, &bg_desc);
}
}
void VisualDebug::render(WGPURenderPassEncoder pass, const mat4& view_proj) {
- if (lines_.empty()) return;
+ if (lines_.empty())
+ return;
update_buffers(view_proj);
wgpuRenderPassEncoderSetPipeline(pass, pipeline_);
wgpuRenderPassEncoderSetBindGroup(pass, 0, bind_group_, 0, nullptr);
- wgpuRenderPassEncoderSetVertexBuffer(pass, 0, vertex_buffer_, 0, lines_.size() * 2 * sizeof(float) * 6);
+ wgpuRenderPassEncoderSetVertexBuffer(pass, 0, vertex_buffer_, 0,
+ lines_.size() * 2 * sizeof(float) * 6);
wgpuRenderPassEncoderDraw(pass, (uint32_t)lines_.size() * 2, 1, 0, 0);
lines_.clear(); // Clear for next frame