diff --git a/ryot/src/bevy_ryot/drawing/mod.rs b/ryot/src/bevy_ryot/drawing/mod.rs index de9253fb..50353417 100644 --- a/ryot/src/bevy_ryot/drawing/mod.rs +++ b/ryot/src/bevy_ryot/drawing/mod.rs @@ -5,15 +5,16 @@ use crate::bevy_ryot::{AppearanceDescriptor, InternalContentState}; use crate::directional::*; use crate::layer::*; use crate::position::{Sector, SpriteMovement, TilePosition}; +use crate::prelude::map::MapTiles; use bevy::prelude::*; use bevy::render::view::{check_visibility, VisibilitySystems, VisibleEntities}; mod brushes; -pub use brushes::*; +pub use brushes::*; mod commands; -pub use commands::*; +pub use commands::*; mod systems; pub use systems::*; @@ -22,6 +23,7 @@ pub struct DrawingPlugin; impl Plugin for DrawingPlugin { fn build(&self, app: &mut App) { app.register_type::() + .add_systems(Update, (find_canvas_border_entities, fade_in_or_out)) .add_systems( PostUpdate, apply_detail_level_to_visibility @@ -339,3 +341,61 @@ fn apply_detail_level_to_visibility( visible_entities.entities = entities; } } + +#[derive(Component, Debug, Clone, Default)] +pub struct FadeAway(bool); + +fn find_canvas_border_entities( + tiles: Res, + mut commands: Commands, + mut q_sector: Query<&Sector, With>, +) { + for sector in q_sector.iter_mut() { + let inner_min = (sector.min.x + 1, sector.min.y + 1); + let inner_max = (sector.max.x - 1, sector.max.y - 1); + let outer_min = (sector.min.x - 5, sector.min.y - 5); + let outer_max = (sector.max.x + 5, sector.max.y + 5); + + for x in outer_min.0..=outer_max.0 { + for y in outer_min.1..=outer_max.1 { + let pos = TilePosition::new(x, y, 0); + let Some(tile) = tiles.get(&pos) else { + continue; + }; + + for (_, entity) in tile.into_iter() { + if x < inner_min.0 || x > inner_max.0 || y < inner_min.1 || y > inner_max.1 { + commands.entity(entity).insert(FadeAway(true)); + } else { + commands.entity(entity).insert(FadeAway(false)); + } + } + } + } + } +} + +fn fade_in_or_out( + time: Res