forked from janhohenheim/foxtrot
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdev_editor.rs
85 lines (78 loc) · 2.49 KB
/
dev_editor.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
use crate::player_control::camera::ForceCursorGrabMode;
use crate::util::error;
use anyhow::Context;
use bevy::{prelude::*, window::CursorGrabMode};
use bevy_editor_pls::{
editor::{Editor, EditorEvent},
editor_window::EditorWindow,
AddEditorWindow,
};
use bevy_egui::egui;
use avian3d::prelude::PhysicsGizmos;
use serde::{Deserialize, Serialize};
pub(super) fn plugin(app: &mut App) {
app.init_resource::<DevEditorState>()
.add_editor_window::<DevEditorWindow>()
.add_systems(
Update,
(handle_debug_render.pipe(error), set_cursor_grab_mode),
);
}
pub(crate) struct DevEditorWindow;
impl EditorWindow for DevEditorWindow {
type State = DevEditorState;
const NAME: &'static str = "Foxtrot Dev";
const DEFAULT_SIZE: (f32, f32) = (200., 150.);
fn ui(
_world: &mut World,
mut cx: bevy_editor_pls::editor_window::EditorWindowContext,
ui: &mut egui::Ui,
) {
let state = cx
.state_mut::<DevEditorWindow>()
.expect("Failed to get dev window state");
state.open = true;
ui.heading("Debug Rendering");
ui.checkbox(&mut state.collider_render_enabled, "Colliders");
ui.checkbox(&mut state.navmesh_render_enabled, "Navmeshes");
}
}
#[derive(Debug, Clone, Eq, PartialEq, Resource, Reflect, Serialize, Deserialize)]
#[reflect(Resource, Serialize, Deserialize)]
#[derive(Default)]
pub(crate) struct DevEditorState {
pub(crate) open: bool,
pub(crate) collider_render_enabled: bool,
pub(crate) navmesh_render_enabled: bool,
}
fn handle_debug_render(
state: Res<Editor>,
mut last_enabled: Local<bool>,
mut config_store: ResMut<GizmoConfigStore>,
) -> anyhow::Result<()> {
let current_enabled = state
.window_state::<DevEditorWindow>()
.context("Failed to read dev window state")?
.collider_render_enabled;
if current_enabled == *last_enabled {
return Ok(());
}
*last_enabled = current_enabled;
let config = config_store.config_mut::<PhysicsGizmos>().0;
config.enabled = current_enabled;
Ok(())
}
fn set_cursor_grab_mode(
mut events: EventReader<EditorEvent>,
mut force_cursor_grab: ResMut<ForceCursorGrabMode>,
) {
for event in events.read() {
if let EditorEvent::Toggle { now_active } = event {
if *now_active {
force_cursor_grab.0 = Some(CursorGrabMode::None);
} else {
force_cursor_grab.0 = None;
}
}
}
}