diff --git a/crates/editor_ui/src/tools/gizmo.rs b/crates/editor_ui/src/tools/gizmo.rs index 4659643b..ff30b4f1 100644 --- a/crates/editor_ui/src/tools/gizmo.rs +++ b/crates/editor_ui/src/tools/gizmo.rs @@ -2,7 +2,7 @@ use bevy::{prelude::*, render::camera::CameraProjection}; use bevy_egui_next::egui::{self, Key}; use egui_gizmo::*; use space_editor_core::prelude::*; -use space_shared::EditorCameraMarker; +use space_shared::*; use crate::{ colors::SELECTED_ITEM_COLOR, @@ -17,13 +17,18 @@ pub struct GizmoToolPlugin; impl Plugin for GizmoToolPlugin { fn build(&self, app: &mut App) { app.editor_tool(GizmoTool::default()); + app.world.resource_mut::().active_tool = Some(0); + app.init_resource::(); + app.editor_hotkey(GizmoHotkey::Translate, vec![KeyCode::G]); app.editor_hotkey(GizmoHotkey::Rotate, vec![KeyCode::R]); app.editor_hotkey(GizmoHotkey::Scale, vec![KeyCode::S]); app.editor_hotkey(GizmoHotkey::Delete, vec![KeyCode::X]); app.editor_hotkey(GizmoHotkey::Multiple, vec![KeyCode::ShiftLeft]); app.editor_hotkey(GizmoHotkey::Clone, vec![KeyCode::AltLeft]); + + app.add_systems(Update, draw_lines_system.in_set(EditorSet::Editor)); } } @@ -106,39 +111,37 @@ impl EditorTool for GizmoTool { } }); + let input = world.resource::>(); + let mut del = false; let mut clone_pressed = false; let mut multiple_pressed = false; - if !ui.ctx().wants_keyboard_input() { - //hot keys. Blender keys preffer - let mode2key = vec![ - (GizmoMode::Translate, GizmoHotkey::Translate), - (GizmoMode::Rotate, GizmoHotkey::Rotate), - (GizmoMode::Scale, GizmoHotkey::Scale), - ]; - - let input = world.resource::>(); + //hot keys. Blender keys preffer + let mode2key = vec![ + (GizmoMode::Translate, GizmoHotkey::Translate), + (GizmoMode::Rotate, GizmoHotkey::Rotate), + (GizmoMode::Scale, GizmoHotkey::Scale), + ]; - for (mode, key) in mode2key { - if input.just_pressed(key) { - self.gizmo_mode = mode; - } + for (mode, key) in mode2key { + if input.just_pressed(key) { + self.gizmo_mode = mode; } + } - if ui.input(|s| s.key_pressed(Key::Delete) || input.just_pressed(GizmoHotkey::Delete)) { - del = true; - } + if ui.input(|s| s.key_pressed(Key::Delete) || input.just_pressed(GizmoHotkey::Delete)) { + del = true; + } - if !input.pressed(GizmoHotkey::Clone) { - self.is_move_cloned_entities = false; - } else { - clone_pressed = true; - } + if !input.pressed(GizmoHotkey::Clone) { + self.is_move_cloned_entities = false; + } else { + clone_pressed = true; + } - if input.pressed(GizmoHotkey::Multiple) { - multiple_pressed = true; - } + if input.pressed(GizmoHotkey::Multiple) { + multiple_pressed = true; } if del { @@ -186,6 +189,13 @@ impl EditorTool for GizmoTool { let mut global_mean = GlobalTransform::from(mean_transform); + //Set resource for draw lines from mean center to each entity + unsafe { + cell.world_mut().insert_resource(MultipleCenter { + center: Some(global_mean.translation()), + }); + } + let mut loc_transform = vec![]; for e in &selected { let Some(ecell) = cell.get_entity(*e) else { @@ -252,6 +262,11 @@ impl EditorTool for GizmoTool { } } } else { + unsafe { + cell.world_mut() + .insert_resource(MultipleCenter { center: None }); + } + for e in &selected { let Some(ecell) = cell.get_entity(*e) else { continue; @@ -358,6 +373,11 @@ impl EditorTool for GizmoTool { } } +#[derive(Resource, Default)] +pub struct MultipleCenter { + pub center: Option, +} + trait ToButton { fn to_button(&self, size: &Sizing) -> egui::Button; } @@ -371,3 +391,15 @@ impl ToButton for GizmoMode { } } } + +fn draw_lines_system( + mut gizmos: Gizmos, + mean_center: Res, + selected: Query<&GlobalTransform, With>, +) { + if let Some(center) = mean_center.center { + for selected in &selected { + gizmos.line(selected.translation(), center, Color::WHITE); + } + } +}