diff options
| author | Jon Santmyer <jon@jonsantmyer.com> | 2026-04-30 10:06:32 -0400 |
|---|---|---|
| committer | Jon Santmyer <jon@jonsantmyer.com> | 2026-04-30 10:06:32 -0400 |
| commit | 961f8c6d405c9c6fcf9aaf4fb6f199b0e5c60d88 (patch) | |
| tree | a26797d6314fa8c193a459e988427c7bfe7f19a7 /assets/shaders/tacmap/body.wgsl | |
| parent | 25255a8b9147d27aa40b28d6aadb62c0ab275d32 (diff) | |
| download | systemic4x-961f8c6d405c9c6fcf9aaf4fb6f199b0e5c60d88.tar.gz systemic4x-961f8c6d405c9c6fcf9aaf4fb6f199b0e5c60d88.tar.bz2 systemic4x-961f8c6d405c9c6fcf9aaf4fb6f199b0e5c60d88.zip | |
add orbit rendering for bodies
Diffstat (limited to 'assets/shaders/tacmap/body.wgsl')
| -rw-r--r-- | assets/shaders/tacmap/body.wgsl | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/assets/shaders/tacmap/body.wgsl b/assets/shaders/tacmap/body.wgsl new file mode 100644 index 0000000..7156150 --- /dev/null +++ b/assets/shaders/tacmap/body.wgsl @@ -0,0 +1,79 @@ +struct InstanceInput { + @location(0) position: vec3<f32>, + @location(1) radius: f32 +}; + +struct VertexOutput { + @builtin(position) clip_position: vec4<f32>, + @location(0) local_position: vec3<f32> +}; + +struct CameraUniform { + view: mat4x4<f32>, + proj: mat4x4<f32>, + pos: vec3<f32>, + scale: f32 +}; + +@group(0) @binding(0) +var<uniform> camera: CameraUniform; + +const QUAD_VERTICES = array<vec3<f32>,6>( + vec3<f32>(-1.0, -1.0, 0.0), + vec3<f32>(-1.0, 1.0 , 0.0), + vec3<f32>(1.0, 1.0 , 0.0), + vec3<f32>(1.0, 1.0 , 0.0), + vec3<f32>(1.0, -1.0, 0.0), + vec3<f32>(-1.0, -1.0, 0.0), +); + +@vertex +fn vs_main( + @builtin(vertex_index) index: u32, + instance: InstanceInput +) -> VertexOutput { + var out: VertexOutput; + + let model = QUAD_VERTICES[index]; + var view = camera.view; + + //Billboard the circle + let camera_right = vec3<f32>(view[0][0], view[1][0], view[2][0]); + let camera_up = vec3<f32>(view[0][1], view[1][1], view[2][1]); + let model_pos = camera_right * model.x + + camera_up * model.y; + + let min_size = 0.025; + + //Scale the world around the camera scale and translate about the camera's + //absolute (/target) position + let instance_pos = (instance.position - camera.pos) * camera.scale; + + let view_proj = camera.proj * view; + + let center_view_pos = view_proj * vec4<f32>(instance_pos, 1.0); + let vertex_view_pos = view_proj * vec4<f32>(instance_pos + (model_pos * instance.radius * camera.scale), 1.0); + + let vertex_dist = length(vertex_view_pos - center_view_pos) / center_view_pos.w; + if vertex_dist < min_size { + out.clip_position = center_view_pos / center_view_pos.w; + out.clip_position += camera.proj * vec4<f32>(model.xy * (min_size / 2.0), 0.0, 0.0); + }else{ + out.clip_position = vertex_view_pos; + } + + out.local_position = model; + + return out; +} + +@fragment +fn fs_main(in: VertexOutput +) -> @location(0) vec4<f32> { + let point_dist = length(in.local_position); + var alpha = 1.0; + if point_dist > 1.0 { + alpha = 0.0; + } + return vec4<f32>(1.0, 1.0, 1.0, alpha); +} |
