shape_maker/src/infinite_grid.rs

61 lines
1.7 KiB
Rust

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<Assets<Mesh>>,
mut mats: ResMut<Assets<GridMaterial>>,
) {
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<crate::SnapGrid>,
handles: Query<&Handle<GridMaterial>>,
mut mats: ResMut<Assets<GridMaterial>>,
) {
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<MainCamera>>,
mut grid: Query<&mut Transform, With<Handle<GridMaterial>>>,
) {
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;
}
}