diff --git a/src/Gui/NavigationStyle.cpp b/src/Gui/NavigationStyle.cpp index a63abb399c..1072649939 100644 --- a/src/Gui/NavigationStyle.cpp +++ b/src/Gui/NavigationStyle.cpp @@ -862,10 +862,9 @@ void NavigationStyle::doRotate(SoCamera * camera, float angle, const SbVec2f& po } -SbVec3f NavigationStyle::getRotationCenter(SbBool* ok) const +SbVec3f NavigationStyle::getRotationCenter(SbBool& found) const { - if (ok) - *ok = PRIVATE(this)->rotationCenterFound; + found = PRIVATE(this)->rotationCenterFound; return PRIVATE(this)->rotationCenter; } @@ -1412,12 +1411,14 @@ void NavigationStyle::setViewingMode(const ViewerMode newmode) case DRAGGING: // Set up initial projection point for the projector object when // first starting a drag operation. + viewer->showRotationCenter(true); this->spinprojector->project(this->lastmouseposition); this->interactiveCountInc(); this->clearLog(); break; case SPINNING: + viewer->showRotationCenter(true); this->interactiveCountInc(); viewer->getSoRenderManager()->scheduleRedraw(); break; @@ -1442,6 +1443,8 @@ void NavigationStyle::setViewingMode(const ViewerMode newmode) switch (oldmode) { case SPINNING: case DRAGGING: + viewer->showRotationCenter(false); + [[fallthrough]]; case PANNING: case ZOOMING: case BOXZOOM: diff --git a/src/Gui/NavigationStyle.h b/src/Gui/NavigationStyle.h index 59a3b39cf3..a6c6bf51e1 100644 --- a/src/Gui/NavigationStyle.h +++ b/src/Gui/NavigationStyle.h @@ -172,6 +172,8 @@ public: void setOrbitStyle(OrbitStyle style); OrbitStyle getOrbitStyle() const; + SbVec3f getRotationCenter(SbBool&) const; + protected: void initialize(); void finalize(); @@ -187,7 +189,6 @@ protected: SbBool seekToPoint(const SbVec2s screenpos); void seekToPoint(const SbVec3f& scenepos); SbBool lookAtPoint(const SbVec2s screenpos); - SbVec3f getRotationCenter(SbBool*) const; void reorientCamera(SoCamera * camera, const SbRotation & rot); void panCamera(SoCamera * camera, diff --git a/src/Gui/View3DInventorViewer.cpp b/src/Gui/View3DInventorViewer.cpp index a4ff65551c..4eac801515 100644 --- a/src/Gui/View3DInventorViewer.cpp +++ b/src/Gui/View3DInventorViewer.cpp @@ -52,6 +52,7 @@ # include # include # include +# include # include # include # include @@ -62,8 +63,10 @@ # include # include # include +# include # include # include +# include # include # include # include @@ -337,6 +340,7 @@ View3DInventorViewer::View3DInventorViewer(QWidget* parent, const QtGLWidget* sh , framebuffer(nullptr) , axisCross(nullptr) , axisGroup(nullptr) + , rotationCenterGroup(nullptr) , editing(false) , redirected(false) , allowredir(false) @@ -355,6 +359,7 @@ View3DInventorViewer::View3DInventorViewer(const QtGLFormat& format, QWidget* pa , framebuffer(nullptr) , axisCross(nullptr) , axisGroup(nullptr) + , rotationCenterGroup(nullptr) , editing(false) , redirected(false) , allowredir(false) @@ -1268,6 +1273,65 @@ bool View3DInventorViewer::hasAxisCross() return axisGroup; } +void View3DInventorViewer::showRotationCenter(bool show) +{ + SoNode* scene = getSceneGraph(); + auto sep = static_cast(scene); + + if (show) { + SbBool found; + SbVec3f center = navigation->getRotationCenter(found); + + if (!found) { + return; + } + + if (!rotationCenterGroup) { + rotationCenterGroup = new SoSkipBoundingGroup(); + + auto sphere = new SoSphere(); + + // There needs to be a non-transparent object to ensure the transparent sphere works when opening an new empty document + auto hidden = new SoSeparator(); + auto hiddenScale = new SoScale(); + hiddenScale->scaleFactor = SbVec3f(0, 0, 0); + hidden->addChild(hiddenScale); + hidden->addChild(sphere); + + auto complexity = new SoComplexity(); + complexity->value = 1; + + auto material = new SoMaterial(); + material->emissiveColor = SbColor(1, 0, 0); + material->transparency = 0.8; + + auto translation = new SoTranslation(); + translation->translation.setValue(center); + + auto annotation = new SoAnnotation(); + annotation->addChild(complexity); + annotation->addChild(material); + annotation->addChild(sphere); + + auto scaledSphere = new SoShapeScale(); + scaledSphere->setPart("shape", annotation); + scaledSphere->scaleFactor = 4.0; + + rotationCenterGroup->addChild(translation); + rotationCenterGroup->addChild(hidden); + rotationCenterGroup->addChild(scaledSphere); + + sep->addChild(rotationCenterGroup); + } + } + else { + if (rotationCenterGroup) { + sep->removeChild(rotationCenterGroup); + rotationCenterGroup = nullptr; + } + } +} + void View3DInventorViewer::setNavigationType(Base::Type t) { if (this->navigation && this->navigation->getTypeId() == t) diff --git a/src/Gui/View3DInventorViewer.h b/src/Gui/View3DInventorViewer.h index 856a778252..43dd1e9bf6 100644 --- a/src/Gui/View3DInventorViewer.h +++ b/src/Gui/View3DInventorViewer.h @@ -413,6 +413,8 @@ public: void setAxisCross(bool b); bool hasAxisCross(); + void showRotationCenter(bool show); + void setEnabledFPSCounter(bool b); void setEnabledNaviCube(bool b); bool isEnabledNaviCube() const; @@ -509,6 +511,8 @@ private: SoShapeScale* axisCross; SoGroup* axisGroup; + SoGroup* rotationCenterGroup; + //stuff needed to draw the fps counter bool fpsEnabled; bool vboEnabled;