diff --git a/src/ViewportWidget.cpp b/src/ViewportWidget.cpp index 326150d..e0cae3f 100644 --- a/src/ViewportWidget.cpp +++ b/src/ViewportWidget.cpp @@ -373,6 +373,30 @@ void ViewportWidget::paintGL() else refDir = QVector3D(0, 1, 0); } + if (angleFromInput) { + QVector3D currentMouseWorldPos = unproject(m_currentMousePos, m_currentPlane); + QVector3D mouseVec = currentMouseWorldPos - startPos; + + double mouseAngle; + if (m_currentPlane == SketchPlane::XY) mouseAngle = qRadiansToDegrees(atan2(mouseVec.z(), mouseVec.x())); + else if (m_currentPlane == SketchPlane::XZ) mouseAngle = qRadiansToDegrees(atan2(mouseVec.y(), mouseVec.x())); + else mouseAngle = qRadiansToDegrees(atan2(mouseVec.z(), mouseVec.y())); + + double refAngleForQuadrant; + if (m_currentPlane == SketchPlane::XY) refAngleForQuadrant = qRadiansToDegrees(atan2(refDir.z(), refDir.x())); + else if (m_currentPlane == SketchPlane::XZ) refAngleForQuadrant = qRadiansToDegrees(atan2(refDir.y(), refDir.x())); + else refAngleForQuadrant = qRadiansToDegrees(atan2(refDir.z(), refDir.y())); + + double relativeMouseAngle = mouseAngle - refAngleForQuadrant; + while (relativeMouseAngle <= -180.0) relativeMouseAngle += 360.0; + while (relativeMouseAngle > 180.0) relativeMouseAngle -= 360.0; + + if ((relativeMouseAngle >= 45 && relativeMouseAngle < 135) || + (relativeMouseAngle >= 135 || relativeMouseAngle < -135)) { + refDir = -refDir; + } + } + double refAngle, lineAngle; if (m_currentPlane == SketchPlane::XY) { refAngle = atan2(refDir.z(), refDir.x());