bevy_transform/
plugins.rs

1use crate::systems::{
2    mark_dirty_trees, propagate_parent_transforms, sync_simple_transforms,
3    StaticTransformOptimizations,
4};
5use bevy_app::{App, Plugin, PostStartup, PostUpdate};
6use bevy_ecs::schedule::{IntoScheduleConfigs, SystemSet};
7
8/// Set enum for the systems relating to transform propagation
9#[derive(Debug, Hash, PartialEq, Eq, Clone, SystemSet)]
10pub enum TransformSystems {
11    /// Propagates changes in transform to children's [`GlobalTransform`](crate::components::GlobalTransform)
12    Propagate,
13}
14
15/// The base plugin for handling [`Transform`](crate::components::Transform) components
16#[derive(Default)]
17pub struct TransformPlugin;
18
19impl Plugin for TransformPlugin {
20    fn build(&self, app: &mut App) {
21        app.init_resource::<StaticTransformOptimizations>()
22            // add transform systems to startup so the first update is "correct"
23            .add_systems(
24                PostStartup,
25                (
26                    mark_dirty_trees,
27                    propagate_parent_transforms,
28                    sync_simple_transforms,
29                )
30                    .chain()
31                    .in_set(TransformSystems::Propagate),
32            )
33            .add_systems(
34                PostUpdate,
35                (
36                    mark_dirty_trees,
37                    propagate_parent_transforms,
38                    // TODO: Adjust the internal parallel queries to make this system more efficiently share and fill CPU time.
39                    sync_simple_transforms,
40                )
41                    .chain()
42                    .in_set(TransformSystems::Propagate),
43            );
44    }
45}