From 7783393c56f183bcd3b5506906b84d3014594b55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9E=97=E4=BC=9F?= Date: Wed, 11 Jan 2023 21:12:01 +0000 Subject: [PATCH] Expose transform propagate systems (#7145) # Objective - I tried to create a fork of bevy_rapier to track latest bevy main branch. But bevy_rapier depends on bevy internal `propagate_transforms` system (see https://github.com/dimforge/bevy_rapier/blob/master/src/plugin/plugin.rs#L64). - `propagate_transforms` system was changed to private in https://github.com/bevyengine/bevy/pull/4775. I don't know if it's reasonable that making `propagate_transforms` public. I also created an issue to bevy_rapier https://github.com/dimforge/bevy_rapier/issues/307 to see how offical team will solve this issue. ## Solution - make `propagate_transforms` system public. --- crates/bevy_transform/src/components/global_transform.rs | 3 +++ crates/bevy_transform/src/lib.rs | 7 +++++++ crates/bevy_transform/src/systems.rs | 6 ++++++ 3 files changed, 16 insertions(+) diff --git a/crates/bevy_transform/src/components/global_transform.rs b/crates/bevy_transform/src/components/global_transform.rs index f85cb3fec907c..71355f2693285 100644 --- a/crates/bevy_transform/src/components/global_transform.rs +++ b/crates/bevy_transform/src/components/global_transform.rs @@ -28,6 +28,9 @@ use bevy_reflect::{std_traits::ReflectDefault, FromReflect, Reflect}; /// update the [`Transform`] of an entity in this stage or after, you will notice a 1 frame lag /// before the [`GlobalTransform`] is updated. /// +/// Third party plugins should use [`transform_propagate_system_set`](crate::transform_propagate_system_set) +/// to control when transforms are propagated from parents to children. +/// /// # Examples /// /// - [`transform`] diff --git a/crates/bevy_transform/src/lib.rs b/crates/bevy_transform/src/lib.rs index 0c09757573aeb..1fa1ea1c54970 100644 --- a/crates/bevy_transform/src/lib.rs +++ b/crates/bevy_transform/src/lib.rs @@ -79,6 +79,13 @@ pub enum TransformSystem { TransformPropagate, } +/// Transform propagation system set for third party plugins use +pub fn transform_propagate_system_set() -> SystemSet { + SystemSet::new() + .with_system(systems::sync_simple_transforms) + .with_system(systems::propagate_transforms) +} + /// The base plugin for handling [`Transform`] components #[derive(Default)] pub struct TransformPlugin; diff --git a/crates/bevy_transform/src/systems.rs b/crates/bevy_transform/src/systems.rs index fb237d42c22f0..c31146c1f3ebc 100644 --- a/crates/bevy_transform/src/systems.rs +++ b/crates/bevy_transform/src/systems.rs @@ -3,6 +3,9 @@ use bevy_ecs::prelude::{Changed, Entity, Query, With, Without}; use bevy_hierarchy::{Children, Parent}; /// Update [`GlobalTransform`] component of entities that aren't in the hierarchy +/// +/// Third party plugins should use [`transform_propagate_system_set`](crate::transform_propagate_system_set) +/// to propagate transforms correctly. pub fn sync_simple_transforms( mut query: Query< (&Transform, &mut GlobalTransform), @@ -16,6 +19,9 @@ pub fn sync_simple_transforms( /// Update [`GlobalTransform`] component of entities based on entity hierarchy and /// [`Transform`] component. +/// +/// Third party plugins should use [`transform_propagate_system_set`](crate::transform_propagate_system_set) +/// to propagate transforms correctly. pub fn propagate_transforms( mut root_query: Query< (