Gui: Fix rotation mode for Gesture style

This commit is contained in:
Bas Ruigrok
2024-06-03 22:35:12 +02:00
parent 36a7fd9be4
commit 0001879be0
2 changed files with 33 additions and 3 deletions

View File

@@ -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<const NS::Event*>(this->triggering_event())->inventor_event;
ns.saveCursorPosition(inventorEvent);
ns.setViewingMode(NavigationStyle::DRAGGING);
this->base_pos = static_cast<const NS::Event*>(this->triggering_event())->inventor_event->getPosition();
this->base_pos = inventorEvent->getPosition();
if (ns.logging)
Base::Console().Log(" -> RotateState\n");
}

View File

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