summaryrefslogtreecommitdiff
path: root/src/3d
diff options
context:
space:
mode:
authorskal <pascal.massimino@gmail.com>2026-02-02 16:52:25 +0100
committerskal <pascal.massimino@gmail.com>2026-02-02 16:52:25 +0100
commita4bfd2f1aae7274eaeb632a8b60a75357da7b410 (patch)
treeeeb881f20e0ba891dc27e4ca018ec3fd4712ef74 /src/3d
parent2184a1043d1a071cdc78303b2247145bf3f18c0b (diff)
fix(3d): Tighten torus bounding box and restore object textures
- Adjusted Torus proxy hull in vs_main to fit unit dimensions (1.4x0.4x1.4). - Updated VisualDebug to support per-object local extents, improving wireframe accuracy. - Restored procedural floor grid and SDF bump mapping in the fragment shader. - Added varied scaling to test scene objects to verify transform robustness.
Diffstat (limited to 'src/3d')
-rw-r--r--src/3d/renderer.cc27
-rw-r--r--src/3d/visual_debug.cc18
-rw-r--r--src/3d/visual_debug.h3
3 files changed, 30 insertions, 18 deletions
diff --git a/src/3d/renderer.cc b/src/3d/renderer.cc
index 021374a..45276ea 100644
--- a/src/3d/renderer.cc
+++ b/src/3d/renderer.cc
@@ -61,8 +61,17 @@ fn vs_main(@builtin(vertex_index) vertex_index: u32,
vec3(-1.0, -1.0, -1.0), vec3(-1.0, 1.0, 1.0), vec3(-1.0, 1.0, -1.0)
);
- let p = pos[vertex_index];
+ var p = pos[vertex_index];
let obj = object_data.objects[instance_index];
+ let obj_type = obj.params.x;
+
+ // Tight fit for Torus proxy hull (major radius 1.0, minor 0.4)
+ if (obj_type == 3.0) {
+ p.x = p.x * 1.5;
+ p.z = p.z * 1.5;
+ p.y = p.y * 0.5;
+ }
+
let world_pos = obj.model * vec4<f32>(p, 1.0);
let clip_pos = globals.view_proj * world_pos;
@@ -104,21 +113,16 @@ fn get_dist(p: vec3<f32>, obj_type: f32) -> f32 {
fn map_scene(p: vec3<f32>, skip_idx: u32) -> f32 {
var d = 1000.0;
let count = u32(globals.params.x);
-
for (var i = 0u; i < count; i = i + 1u) {
if (i == skip_idx) { continue; }
let obj = object_data.objects[i];
let obj_type = obj.params.x;
if (obj_type <= 0.0) { continue; }
-
let q = (obj.inv_model * vec4<f32>(p, 1.0)).xyz;
-
- // Extraction of approx min scale for distance normalization
let scale_x = length(obj.model[0].xyz);
let scale_y = length(obj.model[1].xyz);
let scale_z = length(obj.model[2].xyz);
let s = min(scale_x, min(scale_y, scale_z));
-
d = min(d, get_dist(q, obj_type) * s);
}
return d;
@@ -127,13 +131,12 @@ fn map_scene(p: vec3<f32>, skip_idx: u32) -> f32 {
fn calc_shadow(ro: vec3<f32>, rd: vec3<f32>, tmin: f32, tmax: f32, skip_idx: u32) -> f32 {
var res = 1.0;
var t = tmin;
- if (t < 0.1) { t = 0.1; } // Robust bias to avoid self-shadowing
-
+ if (t < 0.05) { t = 0.05; }
for (var i = 0; i < 32; i = i + 1) {
let h = map_scene(ro + rd * t, skip_idx);
if (h < 0.001) { return 0.0; }
res = min(res, 16.0 * h / t); // Standard k=16
- t = t + clamp(h, 0.02, 0.5);
+ t = t + clamp(h, 0.02, 0.4);
if (t > tmax) { break; }
}
return clamp(res, 0.0, 1.0);
@@ -517,7 +520,11 @@ void Renderer3D::draw(WGPURenderPassEncoder pass, const Scene& scene,
#if !defined(STRIP_ALL)
if (s_debug_enabled_) {
for (const auto& obj : scene.objects) {
- visual_debug_.add_box(obj.get_model_matrix(),
+ vec3 extent(1.0f, 1.0f, 1.0f);
+ if (obj.type == ObjectType::TORUS) {
+ extent = vec3(1.5f, 0.5f, 1.5f);
+ }
+ visual_debug_.add_box(obj.get_model_matrix(), extent,
vec3(1.0f, 1.0f, 0.0f)); // Yellow boxes
}
diff --git a/src/3d/visual_debug.cc b/src/3d/visual_debug.cc
index 99d4b9f..c6c5c51 100644
--- a/src/3d/visual_debug.cc
+++ b/src/3d/visual_debug.cc
@@ -173,13 +173,17 @@ void VisualDebug::create_pipeline(WGPUTextureFormat format) {
wgpuShaderModuleRelease(shader_module);
}
-void VisualDebug::add_box(const mat4& transform, const vec3& color) {
- // 8 corners of unit cube [-1, 1]
- vec4 p[] = {
- transform * vec4(-1, -1, -1, 1), transform * vec4(1, -1, -1, 1),
- transform * vec4(1, 1, -1, 1), transform * vec4(-1, 1, -1, 1),
- transform * vec4(-1, -1, 1, 1), transform * vec4(1, -1, 1, 1),
- transform * vec4(1, 1, 1, 1), transform * vec4(-1, 1, 1, 1)};
+void VisualDebug::add_box(const mat4& transform, const vec3& local_extent,
+ const vec3& color) {
+ float lx = local_extent.x;
+ float ly = local_extent.y;
+ float lz = local_extent.z;
+
+ // 8 corners of transformed box
+ vec4 p[] = {transform * vec4(-lx, -ly, -lz, 1), transform * vec4(lx, -ly, -lz, 1),
+ transform * vec4(lx, ly, -lz, 1), transform * vec4(-lx, ly, -lz, 1),
+ transform * vec4(-lx, -ly, lz, 1), transform * vec4(lx, -ly, lz, 1),
+ transform * vec4(lx, ly, lz, 1), transform * vec4(-lx, ly, lz, 1)};
// 12 edges (each 2 vertices)
DebugLine edges[] = {
diff --git a/src/3d/visual_debug.h b/src/3d/visual_debug.h
index a58d913..456cb10 100644
--- a/src/3d/visual_debug.h
+++ b/src/3d/visual_debug.h
@@ -22,7 +22,8 @@ class VisualDebug {
void shutdown();
// Queue a wireframe box for rendering this frame
- void add_box(const mat4& transform, const vec3& color);
+ void add_box(const mat4& transform, const vec3& local_extent,
+ const vec3& color);
// Render all queued primitives and clear the queue
void render(WGPURenderPassEncoder pass, const mat4& view_proj);