From 629f71924a91fae33c03f6364deeb827781384f6 Mon Sep 17 00:00:00 2001 From: Rexbas Date: Sat, 22 Jul 2023 15:20:10 +0200 Subject: [PATCH] Gui: Improve object center rotation mode (cherry picked from commit fcbee3ad4997737bd455ee2294bde4113a1f409f) --- src/Gui/NavigationStyle.cpp | 3 ++- src/Gui/View3DInventorViewer.cpp | 30 +++++++++++++++++++++---- src/Gui/View3DInventorViewer.h | 3 +++ src/Gui/ViewProvider.h | 2 ++ src/Gui/ViewProviderMeasureDistance.cpp | 10 +++++++++ src/Gui/ViewProviderMeasureDistance.h | 2 ++ 6 files changed, 45 insertions(+), 5 deletions(-) diff --git a/src/Gui/NavigationStyle.cpp b/src/Gui/NavigationStyle.cpp index a63abb399c8c..d77e70a38518 100644 --- a/src/Gui/NavigationStyle.cpp +++ b/src/Gui/NavigationStyle.cpp @@ -1078,8 +1078,9 @@ void NavigationStyle::saveCursorPosition(const SoEvent * const ev) if (!cam) // no camera return; + // Get the bounding box center of the physical object group SoGetBoundingBoxAction action(viewer->getSoRenderManager()->getViewportRegion()); - action.apply(viewer->getSceneGraph()); + action.apply(viewer->objectGroup); SbBox3f boundingBox = action.getBoundingBox(); SbVec3f boundingBoxCenter = boundingBox.getCenter(); setRotationCenter(boundingBoxCenter); diff --git a/src/Gui/View3DInventorViewer.cpp b/src/Gui/View3DInventorViewer.cpp index a4ff65551cbd..92c90a494815 100644 --- a/src/Gui/View3DInventorViewer.cpp +++ b/src/Gui/View3DInventorViewer.cpp @@ -332,6 +332,7 @@ View3DInventorViewer::View3DInventorViewer(QWidget* parent, const QtGLWidget* sh : Quarter::SoQTQuarterAdaptor(parent, sharewidget) , SelectionObserver(false, ResolveMode::NoResolve) , editViewProvider(nullptr) + , objectGroup(nullptr) , navigation(nullptr) , renderType(Native) , framebuffer(nullptr) @@ -350,6 +351,7 @@ View3DInventorViewer::View3DInventorViewer(const QtGLFormat& format, QWidget* pa : Quarter::SoQTQuarterAdaptor(format, parent, sharewidget) , SelectionObserver(false, ResolveMode::NoResolve) , editViewProvider(nullptr) + , objectGroup(nullptr) , navigation(nullptr) , renderType(Native) , framebuffer(nullptr) @@ -477,6 +479,11 @@ void View3DInventorViewer::init() pcEditingRoot->addChild(pcEditingTransform); pcViewProviderRoot->addChild(pcEditingRoot); + // Create group for the physical object + objectGroup = new SoGroup(); + objectGroup->ref(); + pcViewProviderRoot->addChild(objectGroup); + // Set our own render action which show a bounding box if // the SoFCSelection::BOX style is set // @@ -564,6 +571,8 @@ View3DInventorViewer::~View3DInventorViewer() coinRemoveAllChildren(this->pcViewProviderRoot); this->pcViewProviderRoot->unref(); this->pcViewProviderRoot = nullptr; + this->objectGroup->unref(); + this->objectGroup = nullptr; this->backlight->unref(); this->backlight = nullptr; @@ -754,8 +763,15 @@ void View3DInventorViewer::addViewProvider(ViewProvider* pcProvider) SoSeparator* root = pcProvider->getRoot(); if (root) { - if(pcProvider->canAddToSceneGraph()) - pcViewProviderRoot->addChild(root); + if (pcProvider->canAddToSceneGraph()) { + // Add to the physical object group if related to the physical object otherwise add to the scene graph + if (pcProvider->isPartOfPhysicalObject()) { + objectGroup->addChild(root); + } + else { + pcViewProviderRoot->addChild(root); + } + } _ViewProviderMap[root] = pcProvider; } @@ -779,9 +795,15 @@ void View3DInventorViewer::removeViewProvider(ViewProvider* pcProvider) SoSeparator* root = pcProvider->getRoot(); if (root) { - int index = pcViewProviderRoot->findChild(root); - if(index>=0) + int index = objectGroup->findChild(root); + if (index >= 0) { + objectGroup->removeChild(index); + } + + index = pcViewProviderRoot->findChild(root); + if (index >= 0) { pcViewProviderRoot->removeChild(index); + } _ViewProviderMap.erase(root); } diff --git a/src/Gui/View3DInventorViewer.h b/src/Gui/View3DInventorViewer.h index 856a778252c2..c19cd3281056 100644 --- a/src/Gui/View3DInventorViewer.h +++ b/src/Gui/View3DInventorViewer.h @@ -483,7 +483,10 @@ class GuiExport View3DInventorViewer : public Quarter::SoQTQuarterAdaptor, publi SoSeparator * foregroundroot; SoDirectionalLight* backlight; + // Scene graph root SoSeparator * pcViewProviderRoot; + // Child group in the scene graph that contains view providers related to the physical object + SoGroup* objectGroup; std::unique_ptr inventorSelection; diff --git a/src/Gui/ViewProvider.h b/src/Gui/ViewProvider.h index 1ec43105e829..bd295a31afdf 100644 --- a/src/Gui/ViewProvider.h +++ b/src/Gui/ViewProvider.h @@ -142,6 +142,8 @@ class GuiExport ViewProvider : public App::TransactionalObject virtual SoSeparator* getBackRoot() const; ///Indicate whether to be added to scene graph or not virtual bool canAddToSceneGraph() const {return true;} + // Indicate whether to be added to object group (true) or only to scene graph (false) + virtual bool isPartOfPhysicalObject() const {return true;} /** deliver the children belonging to this object * this method is used to deliver the objects to diff --git a/src/Gui/ViewProviderMeasureDistance.cpp b/src/Gui/ViewProviderMeasureDistance.cpp index 2c486d95dd2d..4475005363db 100644 --- a/src/Gui/ViewProviderMeasureDistance.cpp +++ b/src/Gui/ViewProviderMeasureDistance.cpp @@ -120,6 +120,11 @@ ViewProviderMeasureDistance::~ViewProviderMeasureDistance() pLines->unref(); } +bool ViewProviderMeasureDistance::isPartOfPhysicalObject() const +{ + return false; +} + void ViewProviderMeasureDistance::onChanged(const App::Property* prop) { if (prop == &Mirror || prop == &DistFactor) { @@ -313,6 +318,11 @@ ViewProviderPointMarker::~ViewProviderPointMarker() pMarker->unref(); } +bool ViewProviderPointMarker::isPartOfPhysicalObject() const +{ + return false; +} + void ViewProviderMeasureDistance::measureDistanceCallback(void * ud, SoEventCallback * n) { auto view = static_cast(n->getUserData()); diff --git a/src/Gui/ViewProviderMeasureDistance.h b/src/Gui/ViewProviderMeasureDistance.h index 73b015876f55..48b039466c6d 100644 --- a/src/Gui/ViewProviderMeasureDistance.h +++ b/src/Gui/ViewProviderMeasureDistance.h @@ -66,6 +66,7 @@ class GuiExport ViewProviderPointMarker : public ViewProviderDocumentObject public: ViewProviderPointMarker(); ~ViewProviderPointMarker() override; + bool isPartOfPhysicalObject() const override; protected: SoCoordinate3 * pCoords; @@ -81,6 +82,7 @@ class GuiExport ViewProviderMeasureDistance : public ViewProviderDocumentObject /// Constructor ViewProviderMeasureDistance(); ~ViewProviderMeasureDistance() override; + bool isPartOfPhysicalObject() const override; // Display properties App::PropertyColor TextColor;