shape_maker/assets/shaders/grid.wgsl

83 lines
2.4 KiB
WebGPU Shading Language
Raw Normal View History

2022-08-24 16:37:07 +00:00
@group(1) @binding(0)
var<uniform> grid_width: f32;
@group(1) @binding(1)
var<uniform> grid_size: vec2<f32>;
@group(1) @binding(2)
var<uniform> visible: u32;
let grid_color: vec4<f32> = vec4<f32>(1.0, 1.0, 1.0, 0.3);
let x_color: vec4<f32> = vec4<f32>(1.0, 0.0, 0.0, 1.0);
let y_color :vec4<f32> = vec4<f32>(0.0, 1.0, 0.0, 1.0);
2022-08-24 20:03:11 +00:00
#import bevy_sprite::mesh2d_view_bindings
#import bevy_sprite::mesh2d_bindings
// NOTE: Bindings must come before functions that use them!
#import bevy_sprite::mesh2d_functions
struct Vertex {
@location(0) position: vec3<f32>,
@location(1) normal: vec3<f32>,
@location(2) uv: vec2<f32>,
#ifdef VERTEX_TANGENTS
@location(3) tangent: vec4<f32>,
#endif
#ifdef VERTEX_COLORS
@location(4) color: vec4<f32>,
#endif
@builtin(vertex_index) index: u32,
};
struct VertexOutput {
@builtin(position) clip_position: vec4<f32>,
#import bevy_sprite::mesh2d_vertex_output
}
@vertex
fn vertex(vertex: Vertex) -> VertexOutput {
var out: VertexOutput;
out.uv = vertex.uv;
out.world_position = mesh2d_position_local_to_world(mesh.model, vec4<f32>(vertex.position, 1.0));
out.clip_position = mesh2d_position_world_to_clip(out.world_position);
var grid_plane = array<vec3<f32>, 4>(
vec3<f32>(-1., -1., 1.),
vec3<f32>(-1., 1., 1.),
vec3<f32>(1., -1., 1.),
vec3<f32>(1., 1., 1.)
);
out.clip_position = vec4<f32>(grid_plane[vertex.index].xyz, 1.0);
out.world_normal = mesh2d_normal_local_to_world(vertex.normal);
#ifdef VERTEX_TANGENTS
out.world_tangent = mesh2d_tangent_local_to_world(vertex.tangent);
#endif
#ifdef VERTEX_COLORS
out.color = vertex.color;
#endif
return out;
}
2022-08-24 16:37:07 +00:00
@fragment
fn fragment(
@builtin(position) position: vec4<f32>,
#import bevy_sprite::mesh2d_vertex_output
) -> @location(0) vec4<f32> {
if abs(world_position.y) < grid_width && abs(world_position.x) < grid_width {
return grid_color;
}
else if abs(world_position.y) < grid_width {
return x_color;
}
else if abs(world_position.x) < grid_width {
return y_color;
}
else if visible == u32(0) {
return vec4<f32>(0.0, 0.0, 0.0, 0.0);
}
else if abs(world_position.x) % grid_size.x <= grid_width || abs(world_position.y) % grid_size.y <= grid_width {
return grid_color;
}
else {
return vec4<f32>(0.0, 0.0, 0.0, 0.0);
}
}