61 lines
1.7 KiB
Rust
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;
|
|
}
|
|
} |