diff options
| author | skal <pascal.massimino@gmail.com> | 2026-02-02 15:55:03 +0100 |
|---|---|---|
| committer | skal <pascal.massimino@gmail.com> | 2026-02-02 15:55:03 +0100 |
| commit | c194f59e171a1e58ce1704f37d99ffcd09a42433 (patch) | |
| tree | f77a32f2c4c23b335209b8df11cc82920388b51a /src/3d/visual_debug.cc | |
| parent | 316825883c705ed0fe927c32e072f98141d3eaa3 (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.cc | 98 |
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 |
