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}