From 5914d47c0541bbceec7d9332b2cf4587731231f2 Mon Sep 17 00:00:00 2001 From: Dmitry Stepanov Date: Mon, 24 Jun 2024 20:15:47 +0300 Subject: [PATCH] proper distance scaling for collider gizmo handles --- editor/src/plugins/collider/mod.rs | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/editor/src/plugins/collider/mod.rs b/editor/src/plugins/collider/mod.rs index e20435132..f16d86672 100644 --- a/editor/src/plugins/collider/mod.rs +++ b/editor/src/plugins/collider/mod.rs @@ -58,6 +58,7 @@ use crate::{ settings::Settings, Editor, Message, }; +use fyrox::scene::sprite::Sprite; fn try_get_collider_shape(collider: Handle, scene: &Scene) -> Option { scene @@ -161,20 +162,31 @@ trait ShapeGizmoTrait { }) } - fn try_sync_to_collider(&self, collider: Handle, scene: &mut Scene) -> bool { + fn try_sync_to_collider( + &self, + collider: Handle, + camera: Handle, + scene: &mut Scene, + ) -> bool { let mut is_ok = true; let transform = scene.graph[collider].global_transform(); self.for_each_handle(&mut |handle| { if let Some(local_position) = self.handle_local_position(handle, collider, scene) { - scene.graph[handle] - .local_transform_mut() + let scale = calculate_gizmo_distance_scaling(&scene.graph, camera, handle); + + let node = &mut scene.graph[handle]; + node.local_transform_mut() .set_position(transform.transform_point(&local_position.into()).coords) + .set_scale(scale) .set_rotation(UnitQuaternion::from_matrix_eps( &transform.basis(), f32::EPSILON, 16, Default::default(), )); + if let Some(sprite) = node.component_mut::() { + sprite.set_size(0.05 * scale.x); + } } else { is_ok = false; } @@ -570,7 +582,11 @@ impl InteractionMode for ColliderShapeInteractionMode { let scene = &mut engine.scenes[game_scene.scene]; - if !self.shape_gizmo.try_sync_to_collider(self.collider, scene) { + if !self.shape_gizmo.try_sync_to_collider( + self.collider, + game_scene.camera_controller.camera, + scene, + ) { let new_gizmo = make_shape_gizmo(self.collider, scene, game_scene.editor_objects_root, true);