diff options
Diffstat (limited to 'assets/shaders/tacmap/orbit.wgsl')
| -rw-r--r-- | assets/shaders/tacmap/orbit.wgsl | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/assets/shaders/tacmap/orbit.wgsl b/assets/shaders/tacmap/orbit.wgsl index a890fd8..7276345 100644 --- a/assets/shaders/tacmap/orbit.wgsl +++ b/assets/shaders/tacmap/orbit.wgsl @@ -38,24 +38,32 @@ fn vs_main( origins[model.origin][1], origins[model.origin][2]); - let model_pos = ((origin - camera.abs_pos - camera.rel_pos) + model.position) * camera.scale; - let origin_pos = (origin - camera.abs_pos - camera.rel_pos) * camera.scale; + let offset_pos = model.position; + let origin_pos = origin - camera.abs_pos - camera.rel_pos; - let view = camera.view; + let view_proj = camera.proj * camera.view; + + let origin_view_pos = camera.view * vec4<f32>(origin_pos * camera.scale, 1.0); + let offset_view = camera.view * vec4<f32>(offset_pos * camera.scale, 0.0); + let point_view_pos = origin_view_pos + offset_view; let orbit_normal = normalize(model.position); var normal = orbit_normal; - if length(model_pos - origin_pos) > 0.01 { + let offset_ndc = offset_view.xy / origin_view_pos.z; + + let discard_radius = 0.05; + + if length(offset_ndc) > discard_radius { normal *= POINT_NORMALS[index]; } - let view_proj = camera.proj * camera.view; + let point_vp_pos = camera.proj * point_view_pos; //Scale the world around the camera scale and translate about the camera's //absolute (/target) position - let point_view_pos = view_proj * vec4<f32>(model_pos + normal * 0.005, 1.0); - out.clip_position = point_view_pos; + let segment_vp_pos = point_vp_pos + (view_proj * vec4<f32>(normal * 0.005, 0.0)); + out.clip_position = segment_vp_pos; return out; } |
