summaryrefslogtreecommitdiff
path: root/src/3d/renderer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/3d/renderer.cc')
-rw-r--r--src/3d/renderer.cc27
1 files changed, 17 insertions, 10 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
}