40 lines
1.4 KiB
Rust
40 lines
1.4 KiB
Rust
use bevy::prelude::{Commands, Component, Entity, Mesh, Query, ResMut};
|
|
|
|
use block_mesh::Voxel;
|
|
use common::space::three_dimensional::traits::DefaultVoxel;
|
|
|
|
use crate::{components::mutable_mesh::MutableMesh, voxels::layers::traits::VoxelLayer};
|
|
|
|
pub fn mutable_mesh_refresher<TContainer, TVoxel>(
|
|
mut commands: Commands,
|
|
mut query: Query<(Entity, &mut MutableMesh, &TContainer)>,
|
|
mesh_query: Query<&Handle<Mesh>>,
|
|
mut meshes: ResMut<Assets<Mesh>>,
|
|
) where
|
|
TContainer: VoxelLayer<TVoxel> + Component,
|
|
TVoxel: Voxel + DefaultVoxel + Copy,
|
|
{
|
|
// for (e, mut mutable_mesh, container) in query.iter_mut().filter(|(_, mm, _)| mm.current == false){
|
|
for (e, mut mutable_mesh, container) in query.iter_mut() {
|
|
if !mutable_mesh.current {
|
|
let mut commands = commands.entity(e);
|
|
match mutable_mesh.visible {
|
|
true => {
|
|
if mesh_query.contains(e) {
|
|
commands.remove::<Handle<Mesh>>();
|
|
}
|
|
let new_mesh = container.generate_simple_mesh(&mut meshes);
|
|
commands.insert(new_mesh);
|
|
}
|
|
false => {
|
|
if mesh_query.contains(e) {
|
|
commands.remove::<Handle<Mesh>>();
|
|
}
|
|
}
|
|
};
|
|
|
|
mutable_mesh.current = true;
|
|
}
|
|
}
|
|
}
|