voxel-zone/app/src/systems/mutable_mesh_refresher.rs

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;
}
}
}