From 6083bbcc823be2bf598e46a06786f0f0371c415a Mon Sep 17 00:00:00 2001 From: Leonardo Zide Date: Mon, 7 Sep 2026 22:14:39 -0700 Subject: [PATCH] Draw start/current rotation direction. --- common/lc_viewmanipulator.cpp | 135 +++++++++++++++++----------------- common/lc_viewmanipulator.h | 2 + 2 files changed, 71 insertions(+), 66 deletions(-) diff --git a/common/lc_viewmanipulator.cpp b/common/lc_viewmanipulator.cpp index 694f651b..091fb7f4 100644 --- a/common/lc_viewmanipulator.cpp +++ b/common/lc_viewmanipulator.cpp @@ -632,7 +632,8 @@ void lcViewManipulator::DrawRotate(lcTrackButton TrackButton, lcTrackTool TrackT if (MouseToolDistance.LengthSquared() != 0.0f && (TrackButton != lcTrackButton::None)) { lcVector4 Rotation; - float Angle, Step, Radius = (TrackTool == lcTrackTool::RotateCamera) ? OverlayRotateCameraRadius : OverlayRotateRadius; + const float Radius = (TrackTool == lcTrackTool::RotateCamera) ? OverlayRotateCameraRadius : OverlayRotateRadius; + int AxisIndex = 0; HasAngle = true; @@ -640,40 +641,28 @@ void lcViewManipulator::DrawRotate(lcTrackButton TrackButton, lcTrackTool TrackT { case lcTrackTool::RotateX: Context->SetColor(0.8f, 0.0f, 0.0f, 0.3f); - Angle = MouseToolDistance[0]; + AxisIndex = 0; Rotation = lcVector4(0.0f, 0.0f, 0.0f, 1.0f); break; case lcTrackTool::RotateY: Context->SetColor(0.0f, 0.8f, 0.0f, 0.3f); - Angle = MouseToolDistance[1]; + AxisIndex = 1; Rotation = lcVector4(90.0f, 0.0f, 0.0f, 1.0f); break; case lcTrackTool::RotateZ: Context->SetColor(0.0f, 0.0f, 0.8f, 0.3f); - Angle = MouseToolDistance[2]; + AxisIndex = 2; Rotation = lcVector4(90.0f, 0.0f, -1.0f, 0.0f); break; case lcTrackTool::RotateCamera: - Context->SetColor(0.9f, 0.9f, 0.9f, 0.3f); - Angle = MouseToolDistance[0]; + Context->SetColor(mColorCamera[0], mColorCamera[1], mColorCamera[2], 0.3f); Rotation = lcVector4(0.0f, 0.0f, 0.0f, 1.0f); break; default: Rotation = lcVector4(0.0f, 0.0f, 0.0f, 1.0f); - Angle = 0.0f; break; } - if (Angle > 0.0f) - { - Step = 360.0f / 32; - } - else - { - Angle = -Angle; - Step = -360.0f / 32; - } - lcMatrix44 RotatedWorldMatrix; if (TrackTool == lcTrackTool::RotateCamera) @@ -696,61 +685,41 @@ void lcViewManipulator::DrawRotate(lcTrackButton TrackButton, lcTrackTool TrackT Context->SetVertexFormatPosition(3); float StartAngle; + const bool CameraDisc = TrackTool == lcTrackTool::RotateCamera; + const float SignedRotationAngle = MouseToolDistance[AxisIndex]; int i = 0; - if (TrackTool == lcTrackTool::RotateCamera) - StartAngle = 0.0f; - else + auto GetMouseAngle = [&](int MouseX, int MouseY) { lcVector3 MouseDownRay[2] = { - lcVector3((float)mView->GetMouseDownX(), (float)mView->GetMouseDownY(), 0.0f), - lcVector3((float)mView->GetMouseDownX(), (float)mView->GetMouseDownY(), 1.0f) + lcVector3((float)MouseX, (float)MouseY, 0.0f), + lcVector3((float)MouseX, (float)MouseY, 1.0f) }; mView->UnprojectPoints(MouseDownRay, 2); const lcVector3 Center = RotatedWorldMatrix.GetTranslation(); - const lcVector3 Normal = lcNormalize(lcMul30(lcVector3(1.0f, 0.0f, 0.0f), RotatedWorldMatrix)); + const lcVector3 LocalNormal = TrackTool == lcTrackTool::RotateCamera ? lcVector3(0.0f, 0.0f, 1.0f) : lcVector3(1.0f, 0.0f, 0.0f); + const lcVector3 Normal = lcNormalize(lcMul30(LocalNormal, RotatedWorldMatrix)); const lcVector4 Plane(Normal, -lcDot(Normal, Center)); lcVector3 Intersection; if (lcLineSegmentPlaneIntersection(&Intersection, MouseDownRay[0], MouseDownRay[1], Plane)) { const lcVector3 LocalPoint = lcMul(Intersection - Center, lcMatrix33AffineInverse(lcMatrix33(RotatedWorldMatrix))); - StartAngle = -atan2f(LocalPoint[2], LocalPoint[1]) * LC_RTOD; + return (TrackTool == lcTrackTool::RotateCamera ? atan2f(LocalPoint[1], LocalPoint[0]) : -atan2f(LocalPoint[2], LocalPoint[1])) * LC_RTOD; } - else - StartAngle = 0.0f; - } - - for (;;) - { - float VertexAngle; - if (TrackTool == lcTrackTool::RotateCamera) - { - VertexAngle = mView->GetCameraRotationStartAngle() * LC_RTOD - Step * i; - - if (Angle < 0.0f) - { - if (Step < 0) - VertexAngle += Angle; - else - VertexAngle -= Angle; - } - } - else - { - VertexAngle = Step * i - StartAngle; - - if (Angle < 0.0f) - { - if (Step > 0) - VertexAngle += Angle; - else - VertexAngle -= Angle; - } - } + return 0.0f; + }; + + StartAngle = TrackTool == lcTrackTool::RotateCamera ? mView->GetCameraRotationStartAngle() * LC_RTOD : GetMouseAngle(mView->GetMouseDownX(), mView->GetMouseDownY()); + const float StartVectorAngle = CameraDisc ? StartAngle : -StartAngle; + const int SegmentCount = std::max(1, (int)ceilf(fabsf(SignedRotationAngle) / (360.0f / 32.0f))); + + for (i = 0; i <= SegmentCount; i++) + { + const float VertexAngle = StartVectorAngle + (CameraDisc ? -1.0f : 1.0f) * SignedRotationAngle * i / SegmentCount; float x = cosf(VertexAngle * LC_DTOR) * Radius * OverlayScale; float y = sinf(VertexAngle * LC_DTOR) * Radius * OverlayScale; @@ -764,20 +733,53 @@ void lcViewManipulator::DrawRotate(lcTrackButton TrackButton, lcTrackTool TrackT NumVerts = 2; } - i++; - - if (Angle <= 0.0f) - break; - - if (Step > 0) - Angle -= Step; - else - Angle += Step; } if (NumVerts > 2) Context->DrawPrimitives(GL_TRIANGLE_FAN, 0, NumVerts); + // Draw thin triangular lines for the mouse-down and current vectors. + const float VectorRadius = Radius * OverlayScale; + const float VectorWidth = OverlayScale * 0.035f; + auto DrawVector = [&](float VectorAngle) + { + const float AngleRadians = VectorAngle * LC_DTOR; + const float Cos = cosf(AngleRadians); + const float Sin = sinf(AngleRadians); + lcVector3 Direction = CameraDisc ? lcVector3(Cos, Sin, 0.0f) : lcVector3(0.0f, Cos, Sin); + lcVector3 Perpendicular = CameraDisc ? lcVector3(-Sin, Cos, 0.0f) : lcVector3(0.0f, -Sin, Cos); + Direction *= VectorRadius; + Perpendicular *= VectorWidth; + lcVector3 VectorVerts[6] = + { + Perpendicular, Direction + Perpendicular, Direction - Perpendicular, + Perpendicular, Direction - Perpendicular, -Perpendicular + }; + Context->SetVertexBufferPointer(VectorVerts); + Context->SetVertexFormatPosition(3); + Context->DrawPrimitives(GL_TRIANGLES, 0, 6); + }; + + switch (TrackTool) + { + case lcTrackTool::RotateX: + Context->SetColor(mColorXAxisSelected); + break; + case lcTrackTool::RotateY: + Context->SetColor(mColorYAxisSelected); + break; + case lcTrackTool::RotateZ: + Context->SetColor(mColorZAxisSelected); + break; + default: + Context->SetColor(mColorCameraSelected); + break; + } + + const float CurrentVectorAngle = CameraDisc ? StartVectorAngle - SignedRotationAngle : StartVectorAngle + SignedRotationAngle; + DrawVector(StartVectorAngle); + DrawVector(CurrentVectorAngle); + Context->EnableColorBlend(false); } @@ -802,9 +804,10 @@ void lcViewManipulator::DrawRotate(lcTrackButton TrackButton, lcTrackTool TrackT } if (TrackTool == lcTrackTool::RotateCamera) - Context->SetColor(230.0f / 255.0f, 230.0f / 255.0f, 230.0f / 255.0f, 1.0f); + Context->SetColor(mColorCameraSelected); else - Context->SetColor(200.0f / 255.0f, 200.0f / 255.0f, 200.0f / 255.0f, 1.0f); + Context->SetColor(mColorCamera); + Context->SetWorldMatrix(lcMatrix44Identity()); Context->SetVertexBufferPointer(Verts); diff --git a/common/lc_viewmanipulator.h b/common/lc_viewmanipulator.h index 89f48516..828b651f 100644 --- a/common/lc_viewmanipulator.h +++ b/common/lc_viewmanipulator.h @@ -30,9 +30,11 @@ protected: static constexpr lcVector4 mColorXAxis = lcVector4(200.0f / 255.0f, 40.0f / 255.0f, 60.0f / 255.0f, 255.0f / 255.0f); static constexpr lcVector4 mColorYAxis = lcVector4(120.0f / 255.0f, 200.0f / 255.0f, 20.0f / 255.0f, 255.0f / 255.0f); static constexpr lcVector4 mColorZAxis = lcVector4( 70.0f / 255.0f, 130.0f / 255.0f, 240.0f / 255.0f, 255.0f / 255.0f); + static constexpr lcVector4 mColorCamera = lcVector4(200.0f / 255.0f, 200.0f / 255.0f, 200.0f / 255.0f, 255.0f / 255.0f); static constexpr lcVector4 mColorXAxisSelected = lcVector4(219.0f / 255.0f, 72.0f / 255.0f, 89.0f / 255.0f, 255.0f / 255.0f); static constexpr lcVector4 mColorYAxisSelected = lcVector4(145.0f / 255.0f, 233.0f / 255.0f, 37.0f / 255.0f, 255.0f / 255.0f); static constexpr lcVector4 mColorZAxisSelected = lcVector4(118.0f / 255.0f, 162.0f / 255.0f, 244.0f / 255.0f, 255.0f / 255.0f); + static constexpr lcVector4 mColorCameraSelected = lcVector4(230.0f / 255.0f, 230.0f / 255.0f, 230.0f / 255.0f, 255.0f / 255.0f); static constexpr int mMoveIndexStart = 0; static constexpr int mMoveIndexCount = 36;