1use std::sync::Mutex;
2
3use bevy_app::{App, Last, Plugin};
4use bevy_ecs::schedule::IntoScheduleConfigs;
5
6use crate::{
7 config::DefaultGizmoConfigGroup,
8 gizmos::{GizmoBuffer, Gizmos},
9 GizmoMeshSystems,
10};
11
12static GLOBAL_GIZMO: Mutex<GizmoBuffer<DefaultGizmoConfigGroup, ()>> =
13 Mutex::new(GizmoBuffer::new());
14
15pub struct GlobalGizmosPlugin;
17
18impl Plugin for GlobalGizmosPlugin {
19 fn build(&self, app: &mut App) {
20 app.add_systems(Last, flush_global_gizmos.before(GizmoMeshSystems));
21 }
22}
23
24fn flush_global_gizmos(mut gizmos: Gizmos) {
25 let mut buffer = GizmoBuffer::new();
26 {
27 core::mem::swap(&mut buffer, &mut GLOBAL_GIZMO.lock().unwrap());
28 }
29 gizmos.strip_positions.extend(buffer.strip_positions);
30 gizmos.strip_colors.extend(buffer.strip_colors);
31 gizmos.list_positions.extend(buffer.list_positions);
32 gizmos.list_colors.extend(buffer.list_colors);
33}
34
35pub fn gizmo() -> impl core::ops::DerefMut<Target = GizmoBuffer<DefaultGizmoConfigGroup, ()>> {
47 GLOBAL_GIZMO.lock().unwrap()
48}