From ad05e6d1f2d38dcb016a570e999bfaeef96665ce Mon Sep 17 00:00:00 2001 From: RustyStriker Date: Wed, 24 Aug 2022 23:03:11 +0300 Subject: [PATCH] grid size scale with zoom --- assets/shaders/grid.wgsl | 49 ++++++++++++++++++++++++++++++++++++++++ src/infinite_grid.rs | 8 +++++-- 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/assets/shaders/grid.wgsl b/assets/shaders/grid.wgsl index 947434c..f7c6b54 100644 --- a/assets/shaders/grid.wgsl +++ b/assets/shaders/grid.wgsl @@ -8,6 +8,55 @@ let grid_color: vec4 = vec4(1.0, 1.0, 1.0, 0.3); let x_color: vec4 = vec4(1.0, 0.0, 0.0, 1.0); let y_color :vec4 = vec4(0.0, 1.0, 0.0, 1.0); + +#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, + @location(1) normal: vec3, + @location(2) uv: vec2, +#ifdef VERTEX_TANGENTS + @location(3) tangent: vec4, +#endif +#ifdef VERTEX_COLORS + @location(4) color: vec4, +#endif + @builtin(vertex_index) index: u32, +}; + +struct VertexOutput { + @builtin(position) clip_position: vec4, + #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(vertex.position, 1.0)); + out.clip_position = mesh2d_position_world_to_clip(out.world_position); + var grid_plane = array, 4>( + vec3(-1., -1., 1.), + vec3(-1., 1., 1.), + vec3(1., -1., 1.), + vec3(1., 1., 1.) + ); + out.clip_position = vec4(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; +} + @fragment fn fragment( @builtin(position) position: vec4, diff --git a/src/infinite_grid.rs b/src/infinite_grid.rs index c270a9d..e60b10b 100644 --- a/src/infinite_grid.rs +++ b/src/infinite_grid.rs @@ -29,8 +29,8 @@ pub fn spawn_grid( ) { coms.spawn().insert_bundle(MaterialMesh2dBundle { - mesh: meshes.add(Mesh::from(shape::Cube { size: 1000.0 })).into(), - transform: Transform::from_xyz(0.0, 0.0, 0.0), + mesh: meshes.add(Mesh::from(shape::Plane { size: 1000.0 })).into(), + transform: Transform::from_rotation(Quat::from_rotation_x(std::f32::consts::FRAC_PI_2)), material: mats.add(GridMaterial { width: 2.0, size: Vec2::splat(15.0), visible: 1 }), ..default() }); @@ -40,11 +40,15 @@ pub fn update_grid_shader( snap_grid: Res, handles: Query<&Handle>, mut mats: ResMut>, + projection: Query<&OrthographicProjection, With>, ) { + let zoom = projection.get_single().map(|p| p.scale).unwrap_or(1.0); + for h in handles.iter() { if let Some(mut m) = mats.get_mut(h) { m.size = Vec2::new(snap_grid.width, snap_grid.height); m.visible = snap_grid.visible as u32; + m.width = zoom; } } }