From 02e7f65abd9f13361fff020bd4c4e9df6df3f91c Mon Sep 17 00:00:00 2001 From: ghostly_zsh Date: Tue, 25 Nov 2025 18:13:44 -0600 Subject: [PATCH] fix: starfield is now changing mode to stop unreasonable computations --- crates/unified/src/client/starfield.rs | 28 ++++++++++------ crates/unified/src/client/zoom.rs | 44 +++++++++++++++++++------- 2 files changed, 52 insertions(+), 20 deletions(-) diff --git a/crates/unified/src/client/starfield.rs b/crates/unified/src/client/starfield.rs index 3cb25a7ba916f0f7592eac76da621f217ee72fb0..2d413da2b7ff73ce2704e5cc248eaa0a0752d07a 100644 --- a/crates/unified/src/client/starfield.rs +++ b/crates/unified/src/client/starfield.rs @@ -25,6 +25,9 @@ pub const BACK_STARFIELD_SIZE: f32 = 256.0; pub const MID_STARFIELD_SIZE: f32 = 384.0; pub const FRONT_STARFIELD_SIZE: f32 = 512.0; +#[derive(Component, Clone, Copy, Debug)] +pub struct StarfieldSize(pub f32); + pub fn starfield_plugin(app: &mut App) { app.add_systems(Startup, set_up_starfield) .add_systems(Update, fix_starfield) @@ -86,7 +89,7 @@ pub fn set_up_starfield( pub fn fix_starfield( mut starfield_back: Query< - &mut Sprite, + (Entity, &mut Sprite), ( With, Without, @@ -94,7 +97,7 @@ pub fn fix_starfield( ), >, mut starfield_mid: Query< - &mut Sprite, + (Entity, &mut Sprite), ( With, Without, @@ -102,7 +105,7 @@ pub fn fix_starfield( ), >, mut starfield_front: Query< - &mut Sprite, + (Entity, &mut Sprite), ( With, Without, @@ -111,35 +114,42 @@ pub fn fix_starfield( >, assets: Res>, mut asset_events: MessageReader>, + mut commands: Commands, ) { for event in asset_events.read() { if let AssetEvent::Added { id } = event { - let mut starfield_back = starfield_back.single_mut().unwrap(); + let (entity_back, mut starfield_back) = starfield_back.single_mut().unwrap(); if *id == starfield_back.image.id() { let starfield_image = assets.get(*id).unwrap(); + let size = BACK_STARFIELD_SIZE / (starfield_image.size().x as f32); starfield_back.image_mode = SpriteImageMode::Tiled { tile_x: true, tile_y: true, - stretch_value: BACK_STARFIELD_SIZE / (starfield_image.size().x as f32), + stretch_value: size, }; + commands.entity(entity_back).insert(StarfieldSize(size)); } - let mut starfield_mid = starfield_mid.single_mut().unwrap(); + let (entity_mid, mut starfield_mid) = starfield_mid.single_mut().unwrap(); if *id == starfield_mid.image.id() { let starfield_image = assets.get(*id).unwrap(); + let size = MID_STARFIELD_SIZE / (starfield_image.size().x as f32); starfield_mid.image_mode = SpriteImageMode::Tiled { tile_x: true, tile_y: true, - stretch_value: MID_STARFIELD_SIZE / (starfield_image.size().x as f32), + stretch_value: size, }; + commands.entity(entity_mid).insert(StarfieldSize(size)); } - let mut starfield_front = starfield_front.single_mut().unwrap(); + let (entity_front, mut starfield_front) = starfield_front.single_mut().unwrap(); if *id == starfield_front.image.id() { let starfield_image = assets.get(*id).unwrap(); + let size = FRONT_STARFIELD_SIZE / (starfield_image.size().x as f32); starfield_front.image_mode = SpriteImageMode::Tiled { tile_x: true, tile_y: true, - stretch_value: FRONT_STARFIELD_SIZE / (starfield_image.size().x as f32), + stretch_value: size, }; + commands.entity(entity_front).insert(StarfieldSize(size)); } } } diff --git a/crates/unified/src/client/zoom.rs b/crates/unified/src/client/zoom.rs index e0e8cc954673f7bfc62d9bfc7bcecec4b685c313..30214682d9b8c9db60033a7fd1d376ff114ec8d4 100644 --- a/crates/unified/src/client/zoom.rs +++ b/crates/unified/src/client/zoom.rs @@ -4,11 +4,7 @@ use bevy::{ }; use crate::{ - ecs::Me, - client::{ - starfield::{BACK_STARFIELD_SIZE, FRONT_STARFIELD_SIZE, MID_STARFIELD_SIZE}, - }, - ecs::{MainCamera, StarfieldBack, StarfieldFront, StarfieldMid}, + client::starfield::{BACK_STARFIELD_SIZE, FRONT_STARFIELD_SIZE, MID_STARFIELD_SIZE, StarfieldSize}, ecs::{MainCamera, Me, StarfieldBack, StarfieldFront, StarfieldMid} }; pub fn zoom_plugin(app: &mut App) { @@ -19,7 +15,7 @@ fn on_scroll( mut scroll_events: MessageReader, window: Single<&Window>, starfield_back: Single< - (&mut Sprite, &mut Transform, &mut Visibility), + (&mut Sprite, &mut Transform, &mut Visibility, Option<&StarfieldSize>), ( With, Without, @@ -27,7 +23,7 @@ fn on_scroll( ), >, starfield_mid: Single< - (&mut Sprite, &mut Transform, &mut Visibility), + (&mut Sprite, &mut Transform, &mut Visibility, Option<&StarfieldSize>), ( With, Without, @@ -35,7 +31,7 @@ fn on_scroll( ), >, starfield_front: Single< - (&mut Sprite, &mut Transform, &mut Visibility), + (&mut Sprite, &mut Transform, &mut Visibility, Option<&StarfieldSize>), ( With, Without, @@ -63,10 +59,10 @@ fn on_scroll( ), >, ) { - let (mut starfield_back, mut starfield_back_pos, mut visibility_back) = + let (mut starfield_back, mut starfield_back_pos, mut visibility_back, size_back) = starfield_back.into_inner(); - let (mut starfield_mid, mut starfield_mid_pos, mut visibility_mid) = starfield_mid.into_inner(); - let (mut starfield_front, mut starfield_front_pos, mut visibility_front) = + let (mut starfield_mid, mut starfield_mid_pos, mut visibility_mid, size_mid) = starfield_mid.into_inner(); + let (mut starfield_front, mut starfield_front_pos, mut visibility_front, size_front) = starfield_front.into_inner(); for event in scroll_events.read() { match event.unit { @@ -77,10 +73,36 @@ fn on_scroll( camera.scale *= 1.03; } if camera.scale.z > 50.0 { + starfield_back.image_mode = SpriteImageMode::Auto; + starfield_mid.image_mode = SpriteImageMode::Auto; + starfield_front.image_mode = SpriteImageMode::Auto; *visibility_back = Visibility::Hidden; *visibility_mid = Visibility::Hidden; *visibility_front = Visibility::Hidden; } else { + if matches!(*visibility_back, Visibility::Hidden) { + if let Some(size_back) = size_back { + starfield_back.image_mode = SpriteImageMode::Tiled { + tile_x: true, + tile_y: true, + stretch_value: size_back.0, + }; + } + if let Some(size_mid) = size_mid { + starfield_mid.image_mode = SpriteImageMode::Tiled { + tile_x: true, + tile_y: true, + stretch_value: size_mid.0, + }; + } + if let Some(size_front) = size_front{ + starfield_front.image_mode = SpriteImageMode::Tiled { + tile_x: true, + tile_y: true, + stretch_value: size_front.0, + }; + } + } *visibility_back = Visibility::Inherited; *visibility_mid = Visibility::Inherited; *visibility_front = Visibility::Inherited;