Skip to main content

bevy_hikari/
transform.rs

1use bevy::{
2    ecs::query::QueryItem,
3    prelude::*,
4    render::extract_component::{ExtractComponent, ExtractComponentPlugin},
5    transform::TransformSystem,
6};
7
8pub struct TransformPlugin;
9impl Plugin for TransformPlugin {
10    fn build(&self, app: &mut App) {
11        app.add_plugin(ExtractComponentPlugin::<GlobalTransformQueue>::default())
12            .add_system_to_stage(
13                CoreStage::PostUpdate,
14                previous_transform_system.after(TransformSystem::TransformPropagate),
15            );
16    }
17}
18
19#[derive(Component, Debug, Clone, Deref, DerefMut)]
20pub struct GlobalTransformQueue(pub [Mat4; 2]);
21
22impl ExtractComponent for GlobalTransformQueue {
23    type Query = &'static Self;
24    type Filter = ();
25
26    fn extract_component(item: QueryItem<Self::Query>) -> Self {
27        item.clone()
28    }
29}
30
31#[allow(clippy::type_complexity)]
32fn previous_transform_system(
33    mut commands: Commands,
34    query: Query<(Entity, &GlobalTransform, Option<&GlobalTransformQueue>)>,
35) {
36    for (entity, transform, queue) in &query {
37        let matrix = transform.compute_matrix();
38        let queue = match queue {
39            Some(queue) => GlobalTransformQueue([matrix, queue[0]]),
40            None => GlobalTransformQueue([matrix; 2]),
41        };
42        commands.entity(entity).insert(queue);
43    }
44}