From 70ca30d6012ff4e5cdec4ec96296824c6ca5dbb7 Mon Sep 17 00:00:00 2001 From: Lars Brubaker Date: Thu, 15 Apr 2021 09:53:43 -0700 Subject: [PATCH] improving new zoom to mouse --- .../View3D/TrackballTumbleWidgetExtended.cs | 52 ++++++++++++++++--- 1 file changed, 46 insertions(+), 6 deletions(-) diff --git a/MatterControlLib/PartPreviewWindow/View3D/TrackballTumbleWidgetExtended.cs b/MatterControlLib/PartPreviewWindow/View3D/TrackballTumbleWidgetExtended.cs index f11236fa5..5e152b844 100644 --- a/MatterControlLib/PartPreviewWindow/View3D/TrackballTumbleWidgetExtended.cs +++ b/MatterControlLib/PartPreviewWindow/View3D/TrackballTumbleWidgetExtended.cs @@ -30,6 +30,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow private bool isRotating = false; private Vector3 lastRotationOrigin = Vector3.Zero; private Vector3 lastTranslationOrigin = Vector3.Zero; + private Vector2 lastScaleMousePosition = Vector2.Zero; private Vector3 rotateVec = Vector3.Zero; private Vector3 rotateVecOriginal = Vector3.Zero; private Vector2 mouseDownPosition = Vector2.Zero; @@ -52,7 +53,31 @@ namespace MatterHackers.MatterControl.PartPreviewWindow Vector2 currentMousePosition = GetMousePosition(mouseEvent); ZeroVelocity(); - if (mouseEvent.Button == MouseButtons.Middle) + if (mouseEvent.Button == MouseButtons.Left) + { + if (TrackBallController.CurrentTrackingType == TrackBallTransformType.None) + { + switch (TransformState) + { + case TrackBallTransformType.Rotation: + CurrentTrackingType = TrackBallTransformType.Rotation; + StartRotateAroundOrigin(currentMousePosition); + break; + + case TrackBallTransformType.Translation: + CurrentTrackingType = TrackBallTransformType.Translation; + mouseDownPosition = currentMousePosition; + break; + + case TrackBallTransformType.Scale: + CurrentTrackingType = TrackBallTransformType.Scale; + mouseDownPosition = currentMousePosition; + lastScaleMousePosition = currentMousePosition; + break; + } + } + } + else if (mouseEvent.Button == MouseButtons.Middle) { if(CurrentTrackingType == TrackBallTransformType.None) { @@ -86,6 +111,22 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { Translate(currentMousePosition); } + else if(CurrentTrackingType == TrackBallTransformType.Scale) + { + Vector2 mouseDelta = currentMousePosition - lastScaleMousePosition; + double zoomDelta = 1; + if (mouseDelta.Y < 0) + { + zoomDelta = - (-1 * mouseDelta.Y / 100); + } + else if (mouseDelta.Y > 0) + { + zoomDelta = + (1 * mouseDelta.Y / 100); + } + + ZoomToScreenPosition(currentMousePosition, zoomDelta); + lastScaleMousePosition = currentMousePosition; + } } public override void OnMouseUp(MouseEventArgs mouseEvent) @@ -130,7 +171,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow public override void OnMouseWheel(MouseEventArgs mouseEvent) { - ZoomToScreenPosition(GetMousePosition(mouseEvent), mouseEvent.WheelDelta > 0 ? true : false); + ZoomToScreenPosition(GetMousePosition(mouseEvent), mouseEvent.WheelDelta > 0 ? -ZoomDelta : ZoomDelta); } private Vector2 GetMousePosition(MouseEventArgs mouseEvent) @@ -252,14 +293,14 @@ namespace MatterHackers.MatterControl.PartPreviewWindow Invalidate(); } - public void ZoomToScreenPosition(Vector2 position, bool direction) + public void ZoomToScreenPosition(Vector2 screenPosition, double zoomDelta) { if(isRotating) { ZeroVelocity(); } - Ray ray = world.GetRayForLocalBounds(position); + Ray ray = world.GetRayForLocalBounds(screenPosition); IntersectInfo intersectionInfo = Object3DControlLayer.Scene.GetBVHData().GetClosestIntersection(ray); Vector3 hitPos = intersectionInfo == null ? Vector3.Zero : intersectionInfo.HitPosition; @@ -271,8 +312,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow } // calculate the vector between the camera and the intersection position and move the camera along it by ZoomDelta, then set it's direction - Vector3 zoomVec = (hitPos - ray.origin) * ZoomDelta; - zoomVec = direction ? -zoomVec : zoomVec; + Vector3 zoomVec = (hitPos - world.EyePosition) * zoomDelta; DisplacementVec += zoomVec; world.Translate(zoomVec);