use bevy::prelude::*; use bevy::reflect::TypeUuid; use bevy::render::render_resource::AsBindGroup; use bevy::sprite::{MaterialMesh2dBundle, Material2d}; use crate::MainCamera; #[derive(AsBindGroup, TypeUuid, Debug, Clone)] #[uuid = "b56a4075-b836-4866-a6f6-3e34ef3ae44f"] pub struct GridMaterial { #[uniform(0)] width: f32, #[uniform(1)] size: Vec2, #[uniform(2)] visible: u32, } impl Material2d for GridMaterial { fn fragment_shader() -> bevy::render::render_resource::ShaderRef { "shaders/grid.wgsl".into() } } pub fn spawn_grid( mut coms: Commands, mut meshes: ResMut>, mut mats: ResMut>, ) { 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), material: mats.add(GridMaterial { width: 2.0, size: Vec2::splat(15.0), visible: 1 }), ..default() }); } pub fn update_grid_shader( snap_grid: Res, handles: Query<&Handle>, mut mats: ResMut>, ) { 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; } } } pub fn update_grid_position( cam: Query<&GlobalTransform, With>, mut grid: Query<&mut Transform, With>>, ) { let mut cam_pos = cam.get_single().map(|c| c.translation()).unwrap_or(Vec3::ZERO); cam_pos.z = 0.0; for mut t in grid.iter_mut() { t.translation = cam_pos; } }