feat: Update tiles representation only when tile is updated

This commit is contained in:
Rendo 2026-08-03 15:31:38 +05:00
commit a3752a6496
2 changed files with 20 additions and 9 deletions

View file

@ -2,7 +2,7 @@ use std::fmt::Display;
use crate::MAX_FLUID_AMOUNT;
#[derive(Default,Clone,Copy)]
#[derive(Default,Clone,Copy, PartialEq, Eq)]
pub enum GridElement{
#[default]
Air,

View file

@ -19,8 +19,11 @@ impl Plugin for GameViewPlugin {
#[derive(Resource, Default)]
pub struct CubeStages(pub Vec<Handle<Mesh>>);
#[derive(Component, FromTemplate)]
pub struct TileWatch(pub usize);
#[derive(Component, Clone, Default)]
pub struct TileWatch{
pub index: usize,
pub previous_element: GridElement
}
#[derive(Resource, Default)]
pub struct TileMaterials {
@ -92,17 +95,23 @@ pub fn cube(position: Vec3,index: usize,mesh: Handle<Mesh>) -> impl Scene {
Mesh3d(mesh)
MeshMaterial3d<StandardMaterial>
Transform::from_translation(position)
TileWatch(index)
TileWatch{
index
}
Visibility::Hidden
}
}
pub fn update_cubes(query: Query<(&mut Mesh3d,&mut Visibility,&mut MeshMaterial3d<StandardMaterial>,&TileWatch, &mut Transform)>, materials: Res<TileMaterials>, stages: Res<CubeStages>, grid: Res<Grid>) {
pub fn update_cubes(query: Query<(&mut Mesh3d,&mut Visibility,&mut MeshMaterial3d<StandardMaterial>,&mut TileWatch, &mut Transform)>, materials: Res<TileMaterials>, stages: Res<CubeStages>, grid: Res<Grid>) {
if grid.is_changed() == false { return; }
for (mut mesh,mut visibility, mut material, index, mut transform) in query {
let state = grid.data[index.0];
for (mut mesh,mut visibility, mut material, mut tile_data, mut transform) in query {
let state = grid.data[tile_data.index];
if tile_data.previous_element == state {
continue;
}
match state {
GridElement::Air => {
@ -113,7 +122,7 @@ pub fn update_cubes(query: Query<(&mut Mesh3d,&mut Visibility,&mut MeshMaterial3
material.0 = materials.water.clone();
let stage = ((amount as f32)/(MAX_FLUID_AMOUNT as f32) * (FLUID_FULLNES_STAGES-1) as f32).ceil() as usize;
transform.translation = grid.deindexify(index.0 as u32).as_vec3() - vec3(0.,((FLUID_FULLNES_STAGES-1-stage) as f32 / (FLUID_FULLNES_STAGES as f32))/2.,0.);
transform.translation = grid.deindexify(tile_data.index as u32).as_vec3() - vec3(0.,((FLUID_FULLNES_STAGES-1-stage) as f32 / (FLUID_FULLNES_STAGES as f32))/2.,0.);
mesh.0 = stages.0[stage].clone();
},
@ -132,11 +141,13 @@ pub fn update_cubes(query: Query<(&mut Mesh3d,&mut Visibility,&mut MeshMaterial3
material.0 = materials.source.clone();
let stage = ((source_amount as f32)/(MAX_FLUID_AMOUNT as f32) * (FLUID_FULLNES_STAGES-1) as f32).ceil() as usize;
transform.translation = grid.deindexify(index.0 as u32).as_vec3() - vec3(0.,((FLUID_FULLNES_STAGES-1-stage) as f32 / (FLUID_FULLNES_STAGES as f32))/2.,0.);
transform.translation = grid.deindexify(tile_data.index as u32).as_vec3() - vec3(0.,((FLUID_FULLNES_STAGES-1-stage) as f32 / (FLUID_FULLNES_STAGES as f32))/2.,0.);
mesh.0 = stages.0[stage].clone();
}
}
tile_data.previous_element = state;
}
}