File 0004-Fixed-drawing-the-rotate-overlay-during-in-place-sub.patch of Package leocad

From ccd9904c4cd7f305b168490750d94016a936a104 Mon Sep 17 00:00:00 2001
From: Leonardo Zide <leozide@gmail.com>
Date: Sun, 25 Apr 2021 12:02:57 -0700
Subject: [PATCH 4/4] Fixed drawing the rotate overlay during in place submodel
 edits.

---
 common/lc_view.cpp | 38 +++++++++++++++++++++++---------------
 1 file changed, 23 insertions(+), 15 deletions(-)

diff --git a/common/lc_view.cpp b/common/lc_view.cpp
index 8a6abb13..133939f9 100644
--- a/common/lc_view.cpp
+++ b/common/lc_view.cpp
@@ -1489,6 +1489,11 @@ void lcView::DrawRotateOverlay()
 	lcVector3 MouseToolDistance = ActiveModel->SnapRotation(ActiveModel->GetMouseToolDistance());
 	bool HasAngle = false;
 
+	lcMatrix44 WorldMatrix = lcMatrix44(RelativeRotation, OverlayCenter);
+
+	if (ActiveModel != mModel)
+		WorldMatrix = lcMul(WorldMatrix, mActiveSubmodelTransform);
+
 	// Draw a disc showing the rotation amount.
 	if (MouseToolDistance.LengthSquared() != 0.0f && (mTrackButton != lcTrackButton::None))
 	{
@@ -1532,10 +1537,9 @@ void lcView::DrawRotateOverlay()
 
 		if (fabsf(Angle) >= fabsf(Step))
 		{
-			lcMatrix44 WorldMatrix = lcMatrix44(RelativeRotation, OverlayCenter);
-			WorldMatrix = lcMul(lcMatrix44FromAxisAngle(lcVector3(Rotation[1], Rotation[2], Rotation[3]), Rotation[0] * LC_DTOR), WorldMatrix);
+			lcMatrix44 RotatedWorldMatrix = lcMul(lcMatrix44FromAxisAngle(lcVector3(Rotation[1], Rotation[2], Rotation[3]), Rotation[0] * LC_DTOR), WorldMatrix);
 
-			mContext->SetWorldMatrix(WorldMatrix);
+			mContext->SetWorldMatrix(RotatedWorldMatrix);
 
 			glEnable(GL_BLEND);
 
@@ -1587,7 +1591,7 @@ void lcView::DrawRotateOverlay()
 	if (gMainWindow->GetTool() == lcTool::Rotate && !HasAngle && mTrackButton == lcTrackButton::None)
 	{
 		lcMatrix44 Mat = lcMatrix44AffineInverse(mCamera->mWorldView);
-		Mat.SetTranslation(OverlayCenter);
+		Mat.SetTranslation(WorldMatrix.GetTranslation());
 
 		lcVector3 Verts[32];
 
@@ -1615,9 +1619,9 @@ void lcView::DrawRotateOverlay()
 	ViewDir.Normalize();
 
 	// Transform ViewDir to local space.
-	ViewDir = lcMul(ViewDir, lcMatrix33AffineInverse(RelativeRotation));
+	ViewDir = lcMul(ViewDir, lcMatrix33AffineInverse(lcMatrix33(WorldMatrix)));
 
-	mContext->SetWorldMatrix(lcMatrix44(RelativeRotation, OverlayCenter));
+	mContext->SetWorldMatrix(WorldMatrix);
 
 	// Draw each axis circle.
 	for (int i = 0; i < 3; i++)
@@ -1712,9 +1716,8 @@ void lcView::DrawRotateOverlay()
 			break;
 		};
 
-		lcMatrix44 WorldMatrix = lcMatrix44(RelativeRotation, OverlayCenter);
-		WorldMatrix = lcMul(lcMatrix44FromAxisAngle(lcVector3(Rotation[1], Rotation[2], Rotation[3]), Rotation[0] * LC_DTOR), WorldMatrix);
-		mContext->SetWorldMatrix(WorldMatrix);
+		lcMatrix44 RotatedWorldMatrix = lcMul(lcMatrix44FromAxisAngle(lcVector3(Rotation[1], Rotation[2], Rotation[3]), Rotation[0] * LC_DTOR), WorldMatrix);
+		mContext->SetWorldMatrix(RotatedWorldMatrix);
 
 		mContext->SetColor(0.8f, 0.8f, 0.0f, 1.0f);
 
@@ -1742,7 +1745,7 @@ void lcView::DrawRotateOverlay()
 		}
 
 		// Draw text.
-		lcVector3 ScreenPos = ProjectPoint(OverlayCenter);
+		lcVector3 ScreenPos = ProjectPoint(WorldMatrix.GetTranslation());
 
 		mContext->SetMaterial(lcMaterialType::UnlitTextureModulate);
 		mContext->SetWorldMatrix(lcMatrix44Identity());
@@ -2165,11 +2168,16 @@ float lcView::GetOverlayScale() const
 	lcModel* ActiveModel = GetActiveModel();
 	ActiveModel->GetMoveRotateTransform(OverlayCenter, RelativeRotation);
 
-	lcVector3 ScreenPos = ProjectPoint(OverlayCenter);
+	lcMatrix44 WorldMatrix = lcMatrix44(RelativeRotation, OverlayCenter);
+
+	if (ActiveModel != mModel)
+		WorldMatrix = lcMul(WorldMatrix, mActiveSubmodelTransform);
+
+	lcVector3 ScreenPos = ProjectPoint(WorldMatrix.GetTranslation());
 	ScreenPos[0] += 10.0f;
 	lcVector3 Point = UnprojectPoint(ScreenPos);
 
-	lcVector3 Dist(Point - OverlayCenter);
+	lcVector3 Dist(Point - WorldMatrix.GetTranslation());
 	return Dist.Length() * 5.0f;
 }
 
@@ -3605,7 +3613,7 @@ void lcView::OnMouseMove()
 				else
 					PlaneNormal = lcVector3(1.0f, 0.0f, 0.0f);
 
-				PlaneNormal = lcMul(PlaneNormal, RelativeRotation);
+				PlaneNormal = lcMul30(PlaneNormal, WorldMatrix);
 				lcVector4 Plane(PlaneNormal, -lcDot(PlaneNormal, Center));
 				lcVector3 Intersection;
 
@@ -3616,7 +3624,7 @@ void lcView::OnMouseMove()
 					if (lcLineSegmentPlaneIntersection(&MoveStart, MouseDownStart, MouseDownEnd, Plane))
 					{
 						lcVector3 Distance = Intersection - MoveStart;
-						Distance = lcMul(Distance, lcMatrix33AffineInverse(RelativeRotation));
+						Distance = lcMul(Distance, lcMatrix33AffineInverse(lcMatrix33(WorldMatrix)));
 						ActiveModel->UpdateMoveTool(Distance, true, mTrackButton != lcTrackButton::Left);
 					}
 				}
@@ -3635,7 +3643,7 @@ void lcView::OnMouseMove()
 				else
 					Direction = lcVector3(-1.0f, 0.0f, 0.0f);
 
-				Direction = lcMul(Direction, RelativeRotation);
+				Direction = lcMul30(Direction, WorldMatrix);
 
 				lcVector3 Intersection;
 				lcClosestPointsBetweenLines(Center, Center + Direction, CurrentStart, CurrentEnd, &Intersection, nullptr);
-- 
2.31.1

openSUSE Build Service is sponsored by