Merge pull request #14507 from Rexbas/gesture-rotation-mode
Gui: Fix Gesture navigation rotation mode
This commit is contained in:
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user