From 8a54dd304d3f1182ee4a7ac420ffcd5db8f435ba Mon Sep 17 00:00:00 2001 From: Bas Ruigrok Date: Mon, 3 Jun 2024 22:35:12 +0200 Subject: [PATCH 1/2] Gui: Fix rotation mode for Gesture style --- src/Gui/GestureNavigationStyle.cpp | 5 +++-- src/Gui/NavigationStyle.cpp | 31 +++++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/Gui/GestureNavigationStyle.cpp b/src/Gui/GestureNavigationStyle.cpp index 01ef0aec9e..b48752f883 100644 --- a/src/Gui/GestureNavigationStyle.cpp +++ b/src/Gui/GestureNavigationStyle.cpp @@ -492,9 +492,10 @@ public: explicit RotateState(my_context ctx):my_base(ctx) { auto &ns = this->outermost_context().ns; - ns.setRotationCenter(ns.getFocalPoint()); + const auto inventorEvent = static_cast(this->triggering_event())->inventor_event; + ns.saveCursorPosition(inventorEvent); ns.setViewingMode(NavigationStyle::DRAGGING); - this->base_pos = static_cast(this->triggering_event())->inventor_event->getPosition(); + this->base_pos = inventorEvent->getPosition(); if (ns.logging) Base::Console().Log(" -> RotateState\n"); } diff --git a/src/Gui/NavigationStyle.cpp b/src/Gui/NavigationStyle.cpp index 99595fd71d..bf9ca75d32 100644 --- a/src/Gui/NavigationStyle.cpp +++ b/src/Gui/NavigationStyle.cpp @@ -930,9 +930,19 @@ void NavigationStyle::spin(const SbVec2f & pointerpos) * \param curpos current normalized position or mouse pointer * \param prevpos previous normalized position of mouse pointer */ -void NavigationStyle::spin_simplified(SoCamera* cam, SbVec2f curpos, SbVec2f prevpos){ +void NavigationStyle::spin_simplified(SoCamera* cam, SbVec2f curpos, SbVec2f prevpos) +{ assert(this->spinprojector); + if (this->rotationCenterMode && this->rotationCenterFound) { + SbVec3f hitpoint = this->rotationCenter; + + // set to the given position + SbVec3f direction; + viewer->getSoRenderManager()->getCamera()->orientation.getValue().multVec(SbVec3f(0, 0, -1), direction); + viewer->getSoRenderManager()->getCamera()->position = hitpoint - viewer->getSoRenderManager()->getCamera()->focalDistance.getValue() * direction; + } + // 0000333: Turntable camera rotation SbMatrix mat; viewer->getSoRenderManager()->getCamera()->orientation.getValue().getValue(mat); @@ -952,6 +962,19 @@ void NavigationStyle::spin_simplified(SoCamera* cam, SbVec2f curpos, SbVec2f pre r.invert(); this->reorientCamera(cam, r); + if (this->rotationCenterMode && this->rotationCenterFound) { + const SbViewportRegion & vp = viewer->getSoRenderManager()->getViewportRegion(); + SbVec2s glsize(vp.getViewportSizePixels()); + + float ratio = vp.getViewportAspectRatio(); + SbViewVolume vv = viewer->getSoRenderManager()->getCamera()->getViewVolume(vp.getViewportAspectRatio()); + SbPlane panplane = vv.getPlane(viewer->getSoRenderManager()->getCamera()->focalDistance.getValue()); + SbVec2f posn; + posn[0] = float(this->localPos[0]) / float(std::max((int)(glsize[0]-1), 1)); + posn[1] = float(this->localPos[1]) / float(std::max((int)(glsize[1]-1), 1)); + panCamera(viewer->getSoRenderManager()->getCamera(), ratio, panplane, posn, SbVec2f(0.5,0.5)); + } + hasDragged = true; } @@ -1361,6 +1384,12 @@ void NavigationStyle::setViewingMode(const ViewerMode newmode) { const ViewerMode oldmode = this->currentmode; if (newmode == oldmode) { + + // The rotation center could have been changed even if the mode has not changed + if (newmode == NavigationStyle::DRAGGING && rotationCenterFound) { + viewer->changeRotationCenterPosition(rotationCenter); + } + return; } From 13573d39045269a403d18a0d0ba3c9b3786965dc Mon Sep 17 00:00:00 2001 From: Bas Ruigrok Date: Tue, 4 Jun 2024 21:56:10 +0200 Subject: [PATCH 2/2] Gui: Fix rotation mode for MayaGesture style --- src/Gui/MayaGestureNavigationStyle.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Gui/MayaGestureNavigationStyle.cpp b/src/Gui/MayaGestureNavigationStyle.cpp index fc9353016d..75c2394396 100644 --- a/src/Gui/MayaGestureNavigationStyle.cpp +++ b/src/Gui/MayaGestureNavigationStyle.cpp @@ -448,7 +448,7 @@ SbBool MayaGestureNavigationStyle::processSoEvent(const SoEvent * const ev) // start DRAGGING mode (orbit) // if not pressing left mouse button then it assumes is right mouse button and starts ZOOMING mode - setRotationCenter(getFocalPoint()); + saveCursorPosition(ev); setViewingMode(this->button1down ? NavigationStyle::DRAGGING : NavigationStyle::ZOOMING); processed = true; } else { @@ -477,7 +477,7 @@ SbBool MayaGestureNavigationStyle::processSoEvent(const SoEvent * const ev) processed = true; } else if (type.isDerivedFrom(SoGesturePinchEvent::getClassTypeId())) { setupPanningPlane(viewer->getSoRenderManager()->getCamera());//set up panning plane - setRotationCenter(getFocalPoint()); + saveCursorPosition(ev); setViewingMode(NavigationStyle::DRAGGING); processed = true; } //all other gestures - ignore! @@ -504,7 +504,12 @@ SbBool MayaGestureNavigationStyle::processSoEvent(const SoEvent * const ev) case SoMouseButtonEvent::BUTTON3: // allows to release button3 into SELECTION mode if(comboAfter & BUTTON1DOWN || comboAfter & BUTTON2DOWN) { //don't leave navigation till all buttons have been released - setRotationCenter(getFocalPoint()); + if (comboAfter & BUTTON1DOWN && comboAfter & BUTTON2DOWN) { + setRotationCenter(getFocalPoint()); + } + else { + saveCursorPosition(ev); + } setViewingMode((comboAfter & BUTTON1DOWN) ? NavigationStyle::DRAGGING : NavigationStyle::PANNING); processed = true; } else { //all buttons are released