From 7f63ec5c10eb7e8dd4edaabd1a6a437328911d39 Mon Sep 17 00:00:00 2001 From: Jon Santmyer Date: Sun, 10 May 2026 13:29:56 -0400 Subject: fleets --- assets/shaders/tacmap/fleet.wgsl | 73 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 assets/shaders/tacmap/fleet.wgsl (limited to 'assets/shaders/tacmap/fleet.wgsl') diff --git a/assets/shaders/tacmap/fleet.wgsl b/assets/shaders/tacmap/fleet.wgsl new file mode 100644 index 0000000..8a87fb9 --- /dev/null +++ b/assets/shaders/tacmap/fleet.wgsl @@ -0,0 +1,73 @@ +struct InstanceInput { + @location(0) rotmat_0: vec3, + @location(1) rotmat_1: vec3, + @location(2) rotmat_2: vec3, + @location(3) origin: vec3, + @location(4) offset: vec3, +}; + +struct VertexOutput { + @builtin(position) clip_position: vec4, + @location(0) color: vec3 +}; + +struct CameraUniform { + view: mat4x4, + proj: mat4x4, + abs_pos: vec3, + rel_pos: vec3, + scale: f32, +}; + +@group(0) @binding(0) +var camera: CameraUniform; + +const FLEET_VERTICES = array,6>( + vec3(-1.0, -1.0, 0.0), + vec3(-1.0, 1.0 , 0.0), + vec3(1.0, 0.0 , 0.0), + + vec3(-1.0, 0.0, -1.0), + vec3(-1.0, 0.0, 1.0 ), + vec3(1.0, 0.0, 0.0 ), +); + +@vertex +fn vs_main( + @builtin(vertex_index) index: u32, + instance: InstanceInput +) -> VertexOutput { + var out: VertexOutput; + + let rotmat = mat3x3( + instance.rotmat_0, + instance.rotmat_1, + instance.rotmat_2 + ); + let model_pos = rotmat * FLEET_VERTICES[index] * 0.025; + var view = camera.view; + + let min_size = 0.025; + + //Scale the world around the camera scale and translate about the camera's + //absolute (/target) position + let origin_pos = instance.origin - camera.abs_pos; + let offset_pos = instance.offset - camera.rel_pos; + + let instance_pos = (offset_pos + origin_pos) * camera.scale; + let vertex_pos = instance_pos + model_pos; + + let view_proj = camera.proj * view; + let instance_vp_pos = view_proj * vec4(instance_pos, 1.0); + let model_vp_pos = view_proj * vec4(model_pos, 0.0); + + out.clip_position = instance_vp_pos + model_vp_pos; + out.color = vec3(0.75, 1.0, 0.75); + return out; +} + +@fragment +fn fs_main(in: VertexOutput +) -> @location(0) vec4 { + return vec4(in.color, 1.0); +} -- cgit v1.2.3