mirror of
https://github.com/eliasstepanik/big_space_with_trim.git
synced 2026-01-11 10:08:28 +00:00
Update GlobalTransform when changing FloatingOrigin (#10)
Currently, when the `FloatingOrigin` component is removed from one entity and added to another, no `GlobalTransform`s are updated. This can cause problems for things like switching between playable characters that are in different `GridCell`s. --------- Co-authored-by: Aevyrie <aevyrie@gmail.com>
This commit is contained in:
parent
a2e3f05a70
commit
946719c77e
19
.github/workflows/rust.yml
vendored
19
.github/workflows/rust.yml
vendored
@ -29,7 +29,7 @@ jobs:
|
|||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: dtolnay/rust-toolchain@stable
|
- uses: dtolnay/rust-toolchain@stable
|
||||||
- uses: Swatinem/rust-cache@v2.7.0
|
- uses: Swatinem/rust-cache@v2.7.0
|
||||||
- run: cargo check --all-features
|
- run: cargo check --all-features --all-targets
|
||||||
|
|
||||||
check-no-defaults:
|
check-no-defaults:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@ -38,7 +38,7 @@ jobs:
|
|||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: dtolnay/rust-toolchain@stable
|
- uses: dtolnay/rust-toolchain@stable
|
||||||
- uses: Swatinem/rust-cache@v2.7.0
|
- uses: Swatinem/rust-cache@v2.7.0
|
||||||
- run: cargo check --no-default-features
|
- run: cargo check --no-default-features --all-targets
|
||||||
|
|
||||||
clippy:
|
clippy:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@ -48,7 +48,7 @@ jobs:
|
|||||||
- uses: dtolnay/rust-toolchain@stable
|
- uses: dtolnay/rust-toolchain@stable
|
||||||
- uses: Swatinem/rust-cache@v2.7.0
|
- uses: Swatinem/rust-cache@v2.7.0
|
||||||
- run: rustup component add clippy
|
- run: rustup component add clippy
|
||||||
- run: cargo clippy --all-features -- -D warnings
|
- run: cargo clippy --all-features --all-targets -- -D warnings
|
||||||
|
|
||||||
doc:
|
doc:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@ -57,7 +57,7 @@ jobs:
|
|||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: dtolnay/rust-toolchain@stable
|
- uses: dtolnay/rust-toolchain@stable
|
||||||
- uses: Swatinem/rust-cache@v2.7.0
|
- uses: Swatinem/rust-cache@v2.7.0
|
||||||
- run: cargo doc --all-features
|
- run: cargo doc --all-features --no-deps
|
||||||
env:
|
env:
|
||||||
RUSTDOCFLAGS: -D warnings
|
RUSTDOCFLAGS: -D warnings
|
||||||
|
|
||||||
@ -68,4 +68,13 @@ jobs:
|
|||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: dtolnay/rust-toolchain@stable
|
- uses: dtolnay/rust-toolchain@stable
|
||||||
- uses: Swatinem/rust-cache@v2.7.0
|
- uses: Swatinem/rust-cache@v2.7.0
|
||||||
- run: cargo test --all-features
|
- run: cargo test --all-features --all-targets
|
||||||
|
|
||||||
|
doctest:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [setup]
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: dtolnay/rust-toolchain@stable
|
||||||
|
- uses: Swatinem/rust-cache@v2.7.0
|
||||||
|
- run: cargo test --all-features --doc
|
||||||
18
Cargo.toml
18
Cargo.toml
@ -29,3 +29,21 @@ default = ["debug", "camera", "bevy_render"]
|
|||||||
debug = ["bevy/bevy_gizmos"]
|
debug = ["bevy/bevy_gizmos"]
|
||||||
bevy_render = ["bevy/bevy_render"]
|
bevy_render = ["bevy/bevy_render"]
|
||||||
camera = ["bevy_render"]
|
camera = ["bevy_render"]
|
||||||
|
|
||||||
|
[[example]]
|
||||||
|
name = "demo"
|
||||||
|
path = "examples/demo.rs"
|
||||||
|
required-features = ["default"]
|
||||||
|
doc-scrape-examples = true
|
||||||
|
|
||||||
|
[[example]]
|
||||||
|
name = "debug"
|
||||||
|
path = "examples/debug.rs"
|
||||||
|
required-features = ["default"]
|
||||||
|
doc-scrape-examples = true
|
||||||
|
|
||||||
|
[[example]]
|
||||||
|
name = "error"
|
||||||
|
path = "examples/error.rs"
|
||||||
|
required-features = ["default"]
|
||||||
|
doc-scrape-examples = true
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
use bevy::{
|
use bevy::{
|
||||||
prelude::*,
|
prelude::*,
|
||||||
transform::TransformSystem,
|
transform::TransformSystem,
|
||||||
window::{CursorGrabMode, PrimaryWindow, Window, WindowMode},
|
window::{CursorGrabMode, PrimaryWindow, WindowMode},
|
||||||
};
|
};
|
||||||
use big_space::{
|
use big_space::{
|
||||||
camera::{CameraController, CameraInput},
|
camera::{CameraController, CameraInput},
|
||||||
|
|||||||
98
src/lib.rs
98
src/lib.rs
@ -86,7 +86,7 @@
|
|||||||
#![allow(clippy::type_complexity)]
|
#![allow(clippy::type_complexity)]
|
||||||
#![deny(missing_docs)]
|
#![deny(missing_docs)]
|
||||||
|
|
||||||
use bevy::{math::DVec3, prelude::*, reflect::TypePath, transform::TransformSystem};
|
use bevy::{math::DVec3, prelude::*, transform::TransformSystem};
|
||||||
use propagation::propagate_transforms;
|
use propagation::propagate_transforms;
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
|
|
||||||
@ -311,7 +311,7 @@ pub fn recenter_transform_on_grid<P: GridPrecision>(
|
|||||||
/// Compute the `GlobalTransform` relative to the floating origin's cell.
|
/// Compute the `GlobalTransform` relative to the floating origin's cell.
|
||||||
pub fn update_global_from_grid<P: GridPrecision>(
|
pub fn update_global_from_grid<P: GridPrecision>(
|
||||||
settings: Res<FloatingOriginSettings>,
|
settings: Res<FloatingOriginSettings>,
|
||||||
origin: Query<Ref<GridCell<P>>, With<FloatingOrigin>>,
|
origin: Query<(Ref<GridCell<P>>, Ref<FloatingOrigin>)>,
|
||||||
mut entities: ParamSet<(
|
mut entities: ParamSet<(
|
||||||
Query<
|
Query<
|
||||||
(&Transform, &mut GlobalTransform, &GridCell<P>),
|
(&Transform, &mut GlobalTransform, &GridCell<P>),
|
||||||
@ -320,9 +320,9 @@ pub fn update_global_from_grid<P: GridPrecision>(
|
|||||||
Query<(&Transform, &mut GlobalTransform, &GridCell<P>)>,
|
Query<(&Transform, &mut GlobalTransform, &GridCell<P>)>,
|
||||||
)>,
|
)>,
|
||||||
) {
|
) {
|
||||||
let origin_cell = origin.single();
|
let (origin_cell, floating_origin) = origin.single();
|
||||||
|
|
||||||
if origin_cell.is_changed() {
|
if origin_cell.is_changed() || floating_origin.is_changed() {
|
||||||
let mut all_entities = entities.p1();
|
let mut all_entities = entities.p1();
|
||||||
all_entities
|
all_entities
|
||||||
.par_iter_mut()
|
.par_iter_mut()
|
||||||
@ -372,3 +372,93 @@ pub fn sync_simple_transforms<P: GridPrecision>(
|
|||||||
*global_transform = GlobalTransform::from(*transform);
|
*global_transform = GlobalTransform::from(*transform);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn changing_floating_origin_updates_global_transform() {
|
||||||
|
let mut app = App::new();
|
||||||
|
app.add_plugins(FloatingOriginPlugin::<i32>::default());
|
||||||
|
|
||||||
|
let first = app
|
||||||
|
.world
|
||||||
|
.spawn((
|
||||||
|
TransformBundle::from_transform(Transform::from_translation(Vec3::new(
|
||||||
|
150.0, 0.0, 0.0,
|
||||||
|
))),
|
||||||
|
GridCell::<i32>::new(5, 0, 0),
|
||||||
|
FloatingOrigin,
|
||||||
|
))
|
||||||
|
.id();
|
||||||
|
|
||||||
|
let second = app
|
||||||
|
.world
|
||||||
|
.spawn((
|
||||||
|
TransformBundle::from_transform(Transform::from_translation(Vec3::new(
|
||||||
|
0.0, 0.0, 300.0,
|
||||||
|
))),
|
||||||
|
GridCell::<i32>::new(0, -15, 0),
|
||||||
|
))
|
||||||
|
.id();
|
||||||
|
|
||||||
|
app.update();
|
||||||
|
|
||||||
|
app.world.entity_mut(first).remove::<FloatingOrigin>();
|
||||||
|
app.world.entity_mut(second).insert(FloatingOrigin);
|
||||||
|
|
||||||
|
app.update();
|
||||||
|
|
||||||
|
let second_global_transform = app.world.get::<GlobalTransform>(second).unwrap();
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
second_global_transform.translation(),
|
||||||
|
Vec3::new(0.0, 0.0, 300.0)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn child_global_transforms_are_updated_when_floating_origin_changes() {
|
||||||
|
let mut app = App::new();
|
||||||
|
app.add_plugins(FloatingOriginPlugin::<i32>::default());
|
||||||
|
|
||||||
|
let first = app
|
||||||
|
.world
|
||||||
|
.spawn((
|
||||||
|
TransformBundle::from_transform(Transform::from_translation(Vec3::new(
|
||||||
|
150.0, 0.0, 0.0,
|
||||||
|
))),
|
||||||
|
GridCell::<i32>::new(5, 0, 0),
|
||||||
|
FloatingOrigin,
|
||||||
|
))
|
||||||
|
.id();
|
||||||
|
|
||||||
|
let second = app
|
||||||
|
.world
|
||||||
|
.spawn((
|
||||||
|
TransformBundle::from_transform(Transform::from_translation(Vec3::new(
|
||||||
|
0.0, 0.0, 300.0,
|
||||||
|
))),
|
||||||
|
GridCell::<i32>::new(0, -15, 0),
|
||||||
|
))
|
||||||
|
.with_children(|parent| {
|
||||||
|
parent.spawn((TransformBundle::from_transform(
|
||||||
|
Transform::from_translation(Vec3::new(0.0, 0.0, 300.0)),
|
||||||
|
),));
|
||||||
|
})
|
||||||
|
.id();
|
||||||
|
|
||||||
|
app.update();
|
||||||
|
|
||||||
|
app.world.entity_mut(first).remove::<FloatingOrigin>();
|
||||||
|
app.world.entity_mut(second).insert(FloatingOrigin);
|
||||||
|
|
||||||
|
app.update();
|
||||||
|
|
||||||
|
let child = app.world.get::<Children>(second).unwrap()[0];
|
||||||
|
let child_transform = app.world.get::<GlobalTransform>(child).unwrap();
|
||||||
|
|
||||||
|
assert_eq!(child_transform.translation(), Vec3::new(0.0, 0.0, 600.0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -8,7 +8,13 @@ use bevy::prelude::*;
|
|||||||
/// Update [`GlobalTransform`] component of entities based on entity hierarchy and
|
/// Update [`GlobalTransform`] component of entities based on entity hierarchy and
|
||||||
/// [`Transform`] component.
|
/// [`Transform`] component.
|
||||||
pub fn propagate_transforms<P: GridPrecision>(
|
pub fn propagate_transforms<P: GridPrecision>(
|
||||||
origin_moved: Query<(), (Changed<GridCell<P>>, With<FloatingOrigin>)>,
|
origin_moved: Query<
|
||||||
|
(),
|
||||||
|
(
|
||||||
|
Or<(Changed<GridCell<P>>, Changed<FloatingOrigin>)>,
|
||||||
|
With<FloatingOrigin>,
|
||||||
|
),
|
||||||
|
>,
|
||||||
mut root_query: Query<
|
mut root_query: Query<
|
||||||
(
|
(
|
||||||
Entity,
|
Entity,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user