From 93347346e8bd8f7412ae03a0858dd307a1df2e0d Mon Sep 17 00:00:00 2001 From: Micha White Date: Thu, 20 Oct 2022 20:39:44 -0400 Subject: Moved files into workspace --- alligator_render/shaders/sprite.wgsl | 62 ++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 alligator_render/shaders/sprite.wgsl (limited to 'alligator_render/shaders') diff --git a/alligator_render/shaders/sprite.wgsl b/alligator_render/shaders/sprite.wgsl new file mode 100644 index 0000000..60b5773 --- /dev/null +++ b/alligator_render/shaders/sprite.wgsl @@ -0,0 +1,62 @@ + +@group(0) @binding(0) +var camera: mat4x4; + +struct VertexInput { + @location(0) position: vec2 +} + +struct InstanceInput { + @location(1) position: vec2, + @location(2) size: vec2, + @location(3) texture_coordinates: vec2, + @location(4) texture_size: vec2, + @location(5) texture_atlas_index: u32, + @location(6) rotation: f32, + @location(7) z_index: f32, +} + +struct VertexOutput { + @builtin(position) clip_position: vec4, + @location(0) texture_coordinates: vec2, + @location(1) texture_atlas_index: u32 +} + +@vertex +fn vs_main(model: VertexInput, instance: InstanceInput) -> VertexOutput { + var out: VertexOutput; + + // rotate the sprite + let rotation = -instance.rotation; + let a = vec2(cos(rotation), sin(rotation)); + let b = vec2(-a[1], a[0]); + let rotation = mat2x2(a, b); + let rotated = rotation * model.position; + + // scale the sprite + let scaled = rotated * instance.size; + + // move the sprite + let position2d = scaled + instance.position; + + // camera stuff + let position4d = vec4(position2d, instance.z_index, 1.0); + let position = camera * position4d; + + let tex_coords = vec2(model.position[0] + 0.5, 1.0 - (model.position[1] + 0.5)); + + out.clip_position = position; + out.texture_atlas_index = instance.texture_atlas_index; + out.texture_coordinates = tex_coords * instance.texture_size + instance.texture_coordinates; + return out; +} + +@group(1) @binding(0) +var t_diffuse: texture_2d; +@group(1) @binding(1) +var s_diffuse: sampler; + +@fragment +fn fs_main(in: VertexOutput) -> @location(0) vec4 { + return textureSample(t_diffuse, s_diffuse, in.texture_coordinates); +} \ No newline at end of file -- cgit v1.2.3