From ce36fff9cdde8abd04ca08c42fef10a03bd4565a Mon Sep 17 00:00:00 2001 From: rewin Date: Thu, 11 Jan 2024 21:03:47 +0300 Subject: [PATCH] Rotation refactor --- studio/src/interaction/gizmos/combo.rs | 8 +-- studio/src/interaction/gizmos/common.rs | 3 - studio/src/interaction/gizmos/rotation.rs | 60 +++++++++++--------- studio/src/interaction/gizmos/translation.rs | 2 +- 4 files changed, 37 insertions(+), 36 deletions(-) diff --git a/studio/src/interaction/gizmos/combo.rs b/studio/src/interaction/gizmos/combo.rs index 00ef78f..40e964e 100644 --- a/studio/src/interaction/gizmos/combo.rs +++ b/studio/src/interaction/gizmos/combo.rs @@ -7,7 +7,7 @@ use super::{ on_gizmo_element_hover, on_gizmo_element_unhover, rotation::{on_rotate, on_rotation_end, on_rotation_start, RotationWidget}, translation::{on_translate, on_translation_end, on_translation_start, TranslationWidget}, - GizmoMats, GizmoMeshes, TransformGizmoBundle, TransformGizmoRoot, GIZMO_RENDER_LAYER, + GizmoMats, GizmoMeshes, TransformGizmoBundle, GIZMO_RENDER_LAYER, }; #[inline] @@ -20,10 +20,7 @@ pub(super) fn spawn_combo_translation_rotation_gizmo( meshes: &GizmoMeshes, mats: &GizmoMats, ) { - cmd.spawn_empty() - .insert(TransformGizmoRoot) - .with_children(|cmd| { - cmd.spawn(TransformGizmoBundle::new(target, target_global_transform, space, normalizing_scale)) + cmd.spawn(TransformGizmoBundle::new(target, target_global_transform, space, normalizing_scale)) .with_children(|cmd| { use super::{ROT_X, ROT_Y, ROT_Z}; @@ -162,5 +159,4 @@ pub(super) fn spawn_combo_translation_rotation_gizmo( On::>::target_commands_mut(on_translation_end), )); }); - }); } diff --git a/studio/src/interaction/gizmos/common.rs b/studio/src/interaction/gizmos/common.rs index 98a7b0d..a069f22 100644 --- a/studio/src/interaction/gizmos/common.rs +++ b/studio/src/interaction/gizmos/common.rs @@ -6,9 +6,6 @@ use crate::{ math::{IsNonUniform, MatrixExtras, VecExtras}, }; -#[derive(Component)] -pub(super) struct TransformGizmoRoot; - #[derive(Component, Reflect)] pub(super) struct TransformGizmo { pub(super) target : Entity, diff --git a/studio/src/interaction/gizmos/rotation.rs b/studio/src/interaction/gizmos/rotation.rs index 8073b89..f155a0d 100644 --- a/studio/src/interaction/gizmos/rotation.rs +++ b/studio/src/interaction/gizmos/rotation.rs @@ -15,7 +15,7 @@ use crate::{ use super::{ on_gizmo_element_hover, on_gizmo_element_unhover, GizmoMats, GizmoMeshes, InitialTransform, - RebuildGizmo, TransformGizmo, TransformGizmoBundle, TransformGizmoRoot, GIZMO_RENDER_LAYER, + RebuildGizmo, TransformGizmo, TransformGizmoBundle, GIZMO_RENDER_LAYER, }; #[derive(Component)] @@ -47,10 +47,7 @@ pub(super) fn spawn_rotation_gizmo( meshes: &GizmoMeshes, mats: &GizmoMats, ) { - cmd.spawn_empty() - .insert(TransformGizmoRoot) - .with_children(|cmd| { - cmd.spawn(( + cmd.spawn(( TransformGizmoBundle::new(target, target_global_transform, space, normalizing_scale), On::>::run(on_rotation_start), On::>::run(on_rotate), @@ -130,7 +127,6 @@ pub(super) fn spawn_rotation_gizmo( On::>::run(on_gizmo_element_unhover), )); }); - }); } pub(super) fn update_ss_ring_rotation( @@ -182,38 +178,51 @@ fn on_trackball_unhover( pub(super) fn on_rotation_start( event: Listener>, mut cmd: Commands, - q_xform: Query<(Entity, &GlobalTransform), With>, + q_xform: Query<(Entity, &GlobalTransform)>, + q_gizmos: Query<&TransformGizmo> ) { info!("Rotation start"); - if let Ok((ent, &world_xform)) = q_xform.get_single() { - let hit_point = event.hit.position.unwrap(); + let Ok(gizmo) = q_gizmos.get_single() else { + error!("Rotation gizmo not found"); + return; + }; - cmd.entity(ent).insert(( - InitialTransform(world_xform), - InitialHitPoint(hit_point), - LastHitPoint(hit_point), - LastRotation { - axis: Vec3::ZERO, - theta: 0., - }, - )); - } + let Ok((ent, world_xform)) = q_xform.get(gizmo.target) else { + error!("Rotation gizmo target not found"); + return; + }; + + let hit_point = event.hit.position.unwrap(); + + cmd.entity(ent).insert(( + InitialTransform(world_xform.clone()), + InitialHitPoint(hit_point), + LastHitPoint(hit_point), + LastRotation { + axis: Vec3::ZERO, + theta: 0., + }, + )); } pub(super) fn on_rotation_end( - event: Listener>, + _: Listener>, mut cmd: Commands, r_xform_mode: Res, mut ev_rebuild_gizmo: EventWriter, + q_inited_components: Query> ) { info!("Rotation end"); - cmd.entity(event.target) - .remove::() - .remove::() - .remove::() - .remove::(); + for ent in q_inited_components.iter() { + cmd.entity(ent) + .remove::() + .remove::() + .remove::() + .remove::(); + } + if matches!(r_xform_mode.space, TransformSpace::World) { ev_rebuild_gizmo.send(RebuildGizmo); @@ -232,7 +241,6 @@ pub(super) fn on_rotate( &mut LastHitPoint, &mut LastRotation, ), - With, >, q_camera: Query<(&Camera, &GlobalTransform), With>, q_gizmo: Query<&GlobalTransform, (With, Without)>, diff --git a/studio/src/interaction/gizmos/translation.rs b/studio/src/interaction/gizmos/translation.rs index 8a81597..f169524 100644 --- a/studio/src/interaction/gizmos/translation.rs +++ b/studio/src/interaction/gizmos/translation.rs @@ -10,7 +10,7 @@ use crate::{interaction::TransformSpace, MainCamera}; use super::{ on_gizmo_element_hover, on_gizmo_element_unhover, GizmoMats, GizmoMeshes, InitialTransform, - TransformGizmo, TransformGizmoBundle, TransformGizmoRoot, GIZMO_RENDER_LAYER, + TransformGizmo, TransformGizmoBundle, GIZMO_RENDER_LAYER, }; #[derive(Component)]