From b5ced3af46c96ceb959fbbf1addfeba3bd4f76d5 Mon Sep 17 00:00:00 2001 From: Jon Santmyer Date: Wed, 15 Apr 2026 16:53:58 -0400 Subject: first commit. working body rendering --- assets/shaders/canvas.wgsl | 32 ++++++++++++++++++ assets/shaders/tacbody.wgsl | 79 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 assets/shaders/canvas.wgsl create mode 100644 assets/shaders/tacbody.wgsl (limited to 'assets/shaders') diff --git a/assets/shaders/canvas.wgsl b/assets/shaders/canvas.wgsl new file mode 100644 index 0000000..3be1a77 --- /dev/null +++ b/assets/shaders/canvas.wgsl @@ -0,0 +1,32 @@ +struct VertexInput { + @location(0) position: vec3, + @location(1) uv: vec2 +}; + +struct VertexOutput { + @builtin(position) clip_position: vec4, + @location(0) uv: vec2 +}; + +@vertex +fn vs_main( + model: VertexInput, +) -> VertexOutput { + var out: VertexOutput; + + out.clip_position = vec4(model.position, 1.0); + out.uv = model.uv; + + return out; +} + +@group(0) @binding(0) +var canvas_texture: texture_2d; +@group(0) @binding(1) +var canvas_sampler: sampler; + +@fragment +fn fs_main(in: VertexOutput +) -> @location(0) vec4 { + return textureSample(canvas_texture, canvas_sampler, in.uv); +} diff --git a/assets/shaders/tacbody.wgsl b/assets/shaders/tacbody.wgsl new file mode 100644 index 0000000..e8fb653 --- /dev/null +++ b/assets/shaders/tacbody.wgsl @@ -0,0 +1,79 @@ +struct VertexInput { + @location(0) position: vec3 +}; + +struct InstanceInput { + @location(2) position: vec3, + @location(3) radius: f32 +}; + +struct VertexOutput { + @builtin(position) clip_position: vec4, + @location(0) local_position: vec3 +}; + +struct CameraUniform { + view: mat4x4, + proj: mat4x4, + scale: f32 +}; + +@group(0) @binding(0) +var camera: CameraUniform; + +@vertex +fn vs_main( + model: VertexInput, + instance: InstanceInput +) -> VertexOutput { + var out: VertexOutput; + + var view = camera.view; + + //Billboard the circle + view[0][0] = 1.0; + view[0][1] = 0.0; + view[0][2] = 0.0; + + view[1][0] = 0.0; + view[1][1] = 1.0; + view[1][2] = 0.0; + + view[2][0] = 0.0; + view[2][1] = 0.0; + view[2][2] = 1.0; + + let min_size = 0.025; + + //Scale the world around the camera scale. + let model_pos = model.position; + let instance_pos = instance.position * camera.scale; + + let view_proj = camera.proj * view; + + let center_view_pos = view_proj * vec4(instance_pos, 1.0); + let vertex_view_pos = view_proj * vec4(instance_pos + (model_pos * 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(model_pos.xy * (min_size / 2), 0.0, 0.0); + }else{ + out.clip_position = vertex_view_pos; + } + + out.local_position = model.position; + + return out; +} + +@fragment +fn fs_main(in: VertexOutput +) -> @location(0) vec4 { + let point_dist = length(in.local_position); + var alpha = 1.0; + if point_dist > 1.0 { + alpha = 0.0; + } + return vec4(1.0, 1.0, 1.0, alpha); +} -- cgit v1.2.3