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; }