~starkingdoms/starkingdoms

02e7f65abd9f13361fff020bd4c4e9df6df3f91c — ghostly_zsh 20 days ago 7979969
fix: starfield is now changing mode to stop unreasonable computations
2 files changed, 52 insertions(+), 20 deletions(-)

M crates/unified/src/client/starfield.rs
M crates/unified/src/client/zoom.rs
M crates/unified/src/client/starfield.rs => crates/unified/src/client/starfield.rs +19 -9
@@ 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<StarfieldBack>,
            Without<StarfieldMid>,


@@ 94,7 97,7 @@ pub fn fix_starfield(
        ),
    >,
    mut starfield_mid: Query<
        &mut Sprite,
        (Entity, &mut Sprite),
        (
            With<StarfieldMid>,
            Without<StarfieldBack>,


@@ 102,7 105,7 @@ pub fn fix_starfield(
        ),
    >,
    mut starfield_front: Query<
        &mut Sprite,
        (Entity, &mut Sprite),
        (
            With<StarfieldFront>,
            Without<StarfieldBack>,


@@ 111,35 114,42 @@ pub fn fix_starfield(
    >,
    assets: Res<Assets<Image>>,
    mut asset_events: MessageReader<AssetEvent<Image>>,
    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));
            }
        }
    }

M crates/unified/src/client/zoom.rs => crates/unified/src/client/zoom.rs +33 -11
@@ 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<MouseWheel>,
    window: Single<&Window>,
    starfield_back: Single<
        (&mut Sprite, &mut Transform, &mut Visibility),
        (&mut Sprite, &mut Transform, &mut Visibility, Option<&StarfieldSize>),
        (
            With<StarfieldBack>,
            Without<StarfieldMid>,


@@ 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<StarfieldMid>,
            Without<StarfieldBack>,


@@ 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<StarfieldFront>,
            Without<StarfieldBack>,


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