diff options
Diffstat (limited to 'assets')
| -rw-r--r-- | assets/final/shaders/render/scene_query_bvh.wgsl | 11 | ||||
| -rw-r--r-- | assets/final/shaders/render/scene_query_linear.wgsl | 11 |
2 files changed, 16 insertions, 6 deletions
diff --git a/assets/final/shaders/render/scene_query_bvh.wgsl b/assets/final/shaders/render/scene_query_bvh.wgsl index 61efe49..f70a389 100644 --- a/assets/final/shaders/render/scene_query_bvh.wgsl +++ b/assets/final/shaders/render/scene_query_bvh.wgsl @@ -45,10 +45,15 @@ fn map_scene(p: vec3<f32>, skip_idx: u32) -> f32 { // IMPORTANT: Plane (type 4.0) and Mesh (type 5.0) should not be scaled by 's'. // The 's' factor is meant for unit primitives (sphere, box, torus) that are // scaled by the model matrix. Meshes already have correct local-space extents. - if (obj.params.x != 4.0 && obj.params.x != 5.0) { // Not plane, not mesh - d = min(d, get_dist(q, obj.params) * s); - } else { + // For planes with non-uniform scaling, we need to correct the distance by the + // scale along the normal direction (Y for horizontal planes). + if (obj.params.x == 4.0) { // Plane + let plane_scale = length(obj.model[1].xyz); // Y scale for horizontal plane + d = min(d, get_dist(q, obj.params) * plane_scale); + } else if (obj.params.x == 5.0) { // Mesh d = min(d, get_dist(q, obj.params)); + } else { // Unit primitives + d = min(d, get_dist(q, obj.params) * s); } } else { // Internal if (stack_ptr < 31) { diff --git a/assets/final/shaders/render/scene_query_linear.wgsl b/assets/final/shaders/render/scene_query_linear.wgsl index ab3845a..881a939 100644 --- a/assets/final/shaders/render/scene_query_linear.wgsl +++ b/assets/final/shaders/render/scene_query_linear.wgsl @@ -45,10 +45,15 @@ fn map_scene(p: vec3<f32>, skip_idx: u32) -> f32 { // IMPORTANT: Plane (type 4.0) and Mesh (type 5.0) should not be scaled by 's'. // The 's' factor is meant for unit primitives (sphere, box, torus) that are // scaled by the model matrix. Meshes already have correct local-space extents. - if (obj.params.x != 4.0 && obj.params.x != 5.0) { // Not plane, not mesh - d = min(d, get_dist(q, obj.params) * s); - } else { + // For planes with non-uniform scaling, we need to correct the distance by the + // scale along the normal direction (Y for horizontal planes). + if (obj.params.x == 4.0) { // Plane + let plane_scale = length(obj.model[1].xyz); // Y scale for horizontal plane + d = min(d, get_dist(q, obj.params) * plane_scale); + } else if (obj.params.x == 5.0) { // Mesh d = min(d, get_dist(q, obj.params)); + } else { // Unit primitives + d = min(d, get_dist(q, obj.params) * s); } } else { // Internal if (stack_ptr < 31) { |
