From a3752a6496ee77ba07e6e46d6f9a8535ca8340f9 Mon Sep 17 00:00:00 2001 From: Rendo Date: Mon, 3 Aug 2026 15:31:38 +0500 Subject: [PATCH] feat: Update tiles representation only when tile is updated --- src/grid/element.rs | 2 +- src/view/game.rs | 27 +++++++++++++++++++-------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/grid/element.rs b/src/grid/element.rs index 10ca4a7..f5e9d24 100644 --- a/src/grid/element.rs +++ b/src/grid/element.rs @@ -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, diff --git a/src/view/game.rs b/src/view/game.rs index 9b14f1b..ec42fcf 100644 --- a/src/view/game.rs +++ b/src/view/game.rs @@ -19,8 +19,11 @@ impl Plugin for GameViewPlugin { #[derive(Resource, Default)] pub struct CubeStages(pub Vec>); -#[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) -> impl Scene { Mesh3d(mesh) MeshMaterial3d Transform::from_translation(position) - TileWatch(index) + TileWatch{ + index + } Visibility::Hidden } } -pub fn update_cubes(query: Query<(&mut Mesh3d,&mut Visibility,&mut MeshMaterial3d,&TileWatch, &mut Transform)>, materials: Res, stages: Res, grid: Res) { +pub fn update_cubes(query: Query<(&mut Mesh3d,&mut Visibility,&mut MeshMaterial3d,&mut TileWatch, &mut Transform)>, materials: Res, stages: Res, grid: Res) { 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; } }