~starkingdoms/starkingdoms

6fa05cdac8725f686de82fcc708ed8dcb5275de0 — TerraMaster85 5 months ago 00663a9
starfield: compensate for anchor point shift
1 files changed, 45 insertions(+), 11 deletions(-)

M crates/unified/src/client/starfield.rs
M crates/unified/src/client/starfield.rs => crates/unified/src/client/starfield.rs +45 -11
@@ 2,12 2,16 @@ use bevy::{
    app::{App, Startup, Update},
    asset::{AssetEvent, AssetServer, Assets},
    ecs::{
        //entity::Entity,
        //entity_disabling::Disabled,
        event::EventReader,
        query::{With, Without},
        system::{Commands, Query, Res, Single},
    },
    image::Image,
    log::warn,
    math::{Vec2, Vec3},
    //render::view::visibility::Visibility,
    sprite::{Sprite, SpriteImageMode},
    transform::components::Transform,
    window::{Window, WindowResized},


@@ 35,7 39,8 @@ pub fn set_up_starfield(
    window: Query<&Window>,
) {
    let starfield_handle = asset_server.load("textures/starfield.png");
    let starfield_transp_handle = asset_server.load("textures/starfield_transp.png");
    let starfield_transp_handle =
        asset_server.load("textures/starfield_transp.png");
    let window = window.iter().next().unwrap();
    commands
        .spawn(Sprite {


@@ 66,7 71,9 @@ pub fn set_up_starfield(
    commands
        .spawn(Sprite {
            image: starfield_transp_handle,
            custom_size: Some(window.size() + Vec2::splat(FRONT_STARFIELD_SIZE)),
            custom_size: Some(
                window.size() + Vec2::splat(FRONT_STARFIELD_SIZE),
            ),
            image_mode: SpriteImageMode::Tiled {
                tile_x: true,
                tile_y: true,


@@ 114,7 121,8 @@ pub fn fix_starfield(
                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: BACK_STARFIELD_SIZE
                        / (starfield_image.size().x as f32),
                };
            }
            let mut starfield_mid = starfield_mid.single_mut().unwrap();


@@ 123,7 131,8 @@ pub fn fix_starfield(
                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: MID_STARFIELD_SIZE
                        / (starfield_image.size().x as f32),
                };
            }
            let mut starfield_front = starfield_front.single_mut().unwrap();


@@ 132,7 141,8 @@ pub fn fix_starfield(
                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: FRONT_STARFIELD_SIZE
                        / (starfield_image.size().x as f32),
                };
            }
        }


@@ 166,17 176,37 @@ pub fn resize_starfield(
    >,
    mut resize_event: EventReader<WindowResized>,
    camera: Single<&Transform, With<MainCamera>>,
    mut commands: Commands,
) {
    for event in resize_event.read() {
        starfield_back.single_mut().unwrap().custom_size = Some(
        let Ok(mut starfield_back) = starfield_back.single_mut() else {
            warn!("{:?}: no such entity!", stringify!(starfield_back));
            return;
        };
        let Ok(mut starfield_mid) = starfield_mid.single_mut() else {
            warn!("{:?}: no such entity!", stringify!(starfield_mid));
            return;
        };
        let Ok(mut starfield_front) = starfield_front.single_mut() else {
            warn!("{:?}: no such entity!", stringify!(starfield_front));
            return;
        };

        /*if camera.scale.z > 10.0 { // arbitrary
            // TODO: find out how to disable sprites // done
        } else {
            // TODO: find out how to reenable them without toggling on every update :(
        }*/

        starfield_back.custom_size = Some(
            Vec2::new(event.width, event.height) * camera.scale.z
                + Vec2::splat(BACK_STARFIELD_SIZE * 2.0),
        );
        starfield_mid.single_mut().unwrap().custom_size = Some(
        starfield_mid.custom_size = Some(
            Vec2::new(event.width, event.height) * camera.scale.z
                + Vec2::splat(MID_STARFIELD_SIZE * 2.0),
        );
        starfield_front.single_mut().unwrap().custom_size = Some(
        starfield_front.custom_size = Some(
            Vec2::new(event.width, event.height) * camera.scale.z
                + Vec2::splat(FRONT_STARFIELD_SIZE * 2.0),
        );


@@ 185,8 215,12 @@ pub fn resize_starfield(

macro_rules! fix_negative_field_translations {
    ($field:ident, $size:expr) => {
        if $field.translation.y < $size { $field.translation.y -= $size; }
        if $field.translation.x < $size { $field.translation.x -= $size; }
        if $field.translation.y < $size / 2.0 {
            $field.translation.y -= $size;
        }
        if $field.translation.x < $size / 2.0 {
            $field.translation.x -= $size;
        }
    };
}



@@ 271,7 305,7 @@ pub fn update_starfield(
            % FRONT_STARFIELD_SIZE
        + Vec3::new(0.0, FRONT_STARFIELD_SIZE, 0.0)
        - Vec3::new(0.0, 0.0, 4.0);
    

    fix_negative_field_translations!(starfield_back_pos, BACK_STARFIELD_SIZE);
    fix_negative_field_translations!(starfield_mid_pos, MID_STARFIELD_SIZE);
    fix_negative_field_translations!(starfield_front_pos, FRONT_STARFIELD_SIZE);