From c4565759e4294540f54a81e4d91ddea7a769d3d4 Mon Sep 17 00:00:00 2001 From: bungoboingo Date: Tue, 18 Oct 2022 15:18:37 -0700 Subject: Cleaned up namespaces re: PR comments. --- wgpu/src/shader/gradient.wgsl | 88 ++++++++++++++++++++++++++++++++++ wgpu/src/shader/solid.wgsl | 17 +++++++ wgpu/src/shader/triangle_gradient.wgsl | 88 ---------------------------------- wgpu/src/shader/triangle_solid.wgsl | 17 ------- 4 files changed, 105 insertions(+), 105 deletions(-) create mode 100644 wgpu/src/shader/gradient.wgsl create mode 100644 wgpu/src/shader/solid.wgsl delete mode 100644 wgpu/src/shader/triangle_gradient.wgsl delete mode 100644 wgpu/src/shader/triangle_solid.wgsl (limited to 'wgpu/src/shader') diff --git a/wgpu/src/shader/gradient.wgsl b/wgpu/src/shader/gradient.wgsl new file mode 100644 index 00000000..63825aec --- /dev/null +++ b/wgpu/src/shader/gradient.wgsl @@ -0,0 +1,88 @@ +struct Uniforms { + transform: mat4x4, + //xy = start, wz = end + position: vec4, + //x = start stop, y = end stop, zw = padding + stop_range: vec4, +} + +struct Stop { + color: vec4, + offset: f32, +}; + +@group(0) @binding(0) +var uniforms: Uniforms; + +@group(0) @binding(1) +var color_stops: array; + +struct VertexOutput { + @builtin(position) position: vec4, + @location(0) raw_position: vec2 +} + +@vertex +fn vs_main(@location(0) input: vec2) -> VertexOutput { + var output: VertexOutput; + output.position = uniforms.transform * vec4(input.xy, 0.0, 1.0); + output.raw_position = input; + + return output; +} + +//TODO: rewrite without branching +@fragment +fn fs_main(input: VertexOutput) -> @location(0) vec4 { + let start = uniforms.position.xy; + let end = uniforms.position.zw; + let start_stop = uniforms.stop_range.x; + let end_stop = uniforms.stop_range.y; + + let v1 = end - start; + let v2 = input.raw_position.xy - start; + let unit = normalize(v1); + let offset = dot(unit, v2) / length(v1); + + let min_stop = color_stops[start_stop]; + let max_stop = color_stops[end_stop]; + + var color: vec4; + + if (offset <= min_stop.offset) { + color = min_stop.color; + } else if (offset >= max_stop.offset) { + color = max_stop.color; + } else { + var min = min_stop; + var max = max_stop; + var min_index = start_stop; + var max_index = end_stop; + + loop { + if (min_index >= max_index - 1) { + break; + } + + let index = min_index + (max_index - min_index) / 2; + + let stop = color_stops[index]; + + if (offset <= stop.offset) { + max = stop; + max_index = index; + } else { + min = stop; + min_index = index; + } + } + + color = mix(min.color, max.color, smoothstep( + min.offset, + max.offset, + offset + )); + } + + return color; +} diff --git a/wgpu/src/shader/solid.wgsl b/wgpu/src/shader/solid.wgsl new file mode 100644 index 00000000..68a8fea3 --- /dev/null +++ b/wgpu/src/shader/solid.wgsl @@ -0,0 +1,17 @@ +struct Uniforms { + transform: mat4x4, + color: vec4 +} + +@group(0) @binding(0) +var uniforms: Uniforms; + +@vertex +fn vs_main(@location(0) input: vec2) -> @builtin(position) vec4 { + return uniforms.transform * vec4(input.xy, 0.0, 1.0); +} + +@fragment +fn fs_main() -> @location(0) vec4 { + return uniforms.color; +} diff --git a/wgpu/src/shader/triangle_gradient.wgsl b/wgpu/src/shader/triangle_gradient.wgsl deleted file mode 100644 index 03ba9d88..00000000 --- a/wgpu/src/shader/triangle_gradient.wgsl +++ /dev/null @@ -1,88 +0,0 @@ -struct GradientUniforms { - transform: mat4x4, - //xy = start, wz = end - position: vec4, - //x = start stop, y = end stop, zw = padding - stop_range: vec4, -} - -struct Stop { - color: vec4, - offset: f32, -}; - -@group(0) @binding(0) -var uniforms: GradientUniforms; - -@group(0) @binding(1) -var color_stops: array; - -struct VertexOutput { - @builtin(position) position: vec4, - @location(0) raw_position: vec2 -} - -@vertex -fn vs_main(@location(0) input: vec2) -> VertexOutput { - var output: VertexOutput; - output.position = uniforms.transform * vec4(input.xy, 0.0, 1.0); - output.raw_position = input; - - return output; -} - -//TODO: rewrite without branching -@fragment -fn fs_gradient(input: VertexOutput) -> @location(0) vec4 { - let start = uniforms.position.xy; - let end = uniforms.position.zw; - let start_stop = uniforms.stop_range.x; - let end_stop = uniforms.stop_range.y; - - let v1 = end - start; - let v2 = input.raw_position.xy - start; - let unit = normalize(v1); - let offset = dot(unit, v2) / length(v1); - - let min_stop = color_stops[start_stop]; - let max_stop = color_stops[end_stop]; - - var color: vec4; - - if (offset <= min_stop.offset) { - color = min_stop.color; - } else if (offset >= max_stop.offset) { - color = max_stop.color; - } else { - var min = min_stop; - var max = max_stop; - var min_index = start_stop; - var max_index = end_stop; - - loop { - if (min_index >= max_index - 1) { - break; - } - - let index = min_index + (max_index - min_index) / 2; - - let stop = color_stops[index]; - - if (offset <= stop.offset) { - max = stop; - max_index = index; - } else { - min = stop; - min_index = index; - } - } - - color = mix(min.color, max.color, smoothstep( - min.offset, - max.offset, - offset - )); - } - - return color; -} diff --git a/wgpu/src/shader/triangle_solid.wgsl b/wgpu/src/shader/triangle_solid.wgsl deleted file mode 100644 index 9eb2df24..00000000 --- a/wgpu/src/shader/triangle_solid.wgsl +++ /dev/null @@ -1,17 +0,0 @@ -struct SolidUniforms { - transform: mat4x4, - color: vec4 -} - -@group(0) @binding(0) -var solid_uniforms: SolidUniforms; - -@vertex -fn vs_main(@location(0) input: vec2) -> @builtin(position) vec4 { - return solid_uniforms.transform * vec4(input.xy, 0.0, 1.0); -} - -@fragment -fn fs_solid() -> @location(0) vec4 { - return solid_uniforms.color; -} -- cgit