Skip to main content

bevy_transform/
plugins.rs

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