From a740632616cccc713281718fcee17501a1367202 Mon Sep 17 00:00:00 2001 From: Rexbas Date: Fri, 10 Nov 2023 22:33:41 +0100 Subject: [PATCH] Gui: Find bounding sphere before drag or animation --- src/Gui/NavigationAnimation.cpp | 2 ++ src/Gui/NavigationStyle.cpp | 42 +++++++++++++++++--------------- src/Gui/NavigationStyle.h | 4 +++ src/Gui/View3DInventorViewer.cpp | 2 ++ 4 files changed, 30 insertions(+), 20 deletions(-) diff --git a/src/Gui/NavigationAnimation.cpp b/src/Gui/NavigationAnimation.cpp index 4a086fc63fa5..8294c154f919 100644 --- a/src/Gui/NavigationAnimation.cpp +++ b/src/Gui/NavigationAnimation.cpp @@ -57,6 +57,7 @@ FixedTimeAnimation::FixedTimeAnimation(NavigationStyle* navigation, const SbRota void FixedTimeAnimation::initialize() { + navigation->findBoundingSphere(); prevAngle = 0; prevTranslation = SbVec3f(0, 0, 0); @@ -133,6 +134,7 @@ SpinningAnimation::SpinningAnimation(NavigationStyle* navigation, const SbVec3f& void SpinningAnimation::initialize() { + navigation->findBoundingSphere(); prevAngle = 0; navigation->setViewing(true); diff --git a/src/Gui/NavigationStyle.cpp b/src/Gui/NavigationStyle.cpp index 4f39c63ae6b6..e435be57c1b2 100644 --- a/src/Gui/NavigationStyle.cpp +++ b/src/Gui/NavigationStyle.cpp @@ -479,6 +479,13 @@ void NavigationStyle::viewAll() } } +void NavigationStyle::findBoundingSphere() { + // Find a bounding sphere for the scene + SoGetBoundingBoxAction action(viewer->getSoRenderManager()->getViewportRegion()); + action.apply(viewer->getSceneGraph()); + boundingSphere.circumscribe(action.getBoundingBox()); +} + /** Rotate the camera by the given amount, then reposition it so we're still pointing at the same * focal point */ @@ -511,29 +518,23 @@ void NavigationStyle::reorientCamera(SoCamera* camera, const SbRotation& rotatio camera->position = rotationCenter + newRotationCenterDistance; // Fix issue with near clipping in orthogonal view - if (camera->getTypeId().isDerivedFrom(SoOrthographicCamera::getClassTypeId())) { + if (camera->getTypeId().isDerivedFrom(SoOrthographicCamera::getClassTypeId())) { - // Find a bounding sphere for the scene - SoGetBoundingBoxAction action(viewer->getSoRenderManager()->getViewportRegion()); - action.apply(viewer->getSceneGraph()); - SbSphere boundingSphere; - boundingSphere.circumscribe(action.getBoundingBox()); + // The center of the bounding sphere in camera coordinate system + SbVec3f center; + camera->orientation.getValue().inverse().multVec(boundingSphere.getCenter() - camera->position.getValue(), center); - // The center of the bounding sphere in camera coordinate system - SbVec3f center; - camera->orientation.getValue().inverse().multVec(boundingSphere.getCenter() - camera->position.getValue(), center); + SbVec3f dir; + camera->orientation.getValue().multVec(SbVec3f(0, 0, -1), dir); - SbVec3f dir; - camera->orientation.getValue().multVec(SbVec3f(0, 0, -1), dir); - - // Reposition the camera but keep the focal point the same - // nearDistance is 0 and farDistance is the diameter of the bounding sphere - float repositionDistance = -center.getValue()[2] - boundingSphere.getRadius(); - camera->position = camera->position.getValue() + repositionDistance * dir; - camera->nearDistance = 0; - camera->farDistance = 2 * boundingSphere.getRadius(); - camera->focalDistance = camera->focalDistance.getValue() - repositionDistance; - } + // Reposition the camera but keep the focal point the same + // nearDistance is 0 and farDistance is the diameter of the bounding sphere + float repositionDistance = -center.getValue()[2] - boundingSphere.getRadius(); + camera->position = camera->position.getValue() + repositionDistance * dir; + camera->nearDistance = 0; + camera->farDistance = 2 * boundingSphere.getRadius(); + camera->focalDistance = camera->focalDistance.getValue() - repositionDistance; + } } void NavigationStyle::panCamera(SoCamera * cam, float aspectratio, const SbPlane & panplane, @@ -1299,6 +1300,7 @@ void NavigationStyle::setViewingMode(const ViewerMode newmode) // Set up initial projection point for the projector object when // first starting a drag operation. animator->stop(); + findBoundingSphere(); viewer->showRotationCenter(true); this->spinprojector->project(this->lastmouseposition); this->interactiveCountInc(); diff --git a/src/Gui/NavigationStyle.h b/src/Gui/NavigationStyle.h index c499776456b7..12c5e4a00dea 100644 --- a/src/Gui/NavigationStyle.h +++ b/src/Gui/NavigationStyle.h @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -151,6 +152,7 @@ class GuiExport NavigationStyle : public Base::BaseClass SoCamera* getCamera() const; void setCameraOrientation(const SbRotation& orientation, SbBool moveToCenter = false); void translateCamera(const SbVec3f& translation); + void findBoundingSphere(); void reorientCamera(SoCamera* camera, const SbRotation& rotation); void reorientCamera(SoCamera* camera, const SbRotation& rotation, const SbVec3f& rotationCenter); @@ -278,6 +280,8 @@ class GuiExport NavigationStyle : public Base::BaseClass NavigationStyle::RotationCenterModes rotationCenterMode; float sensitivity; SbBool resetcursorpos; + + SbSphere boundingSphere; }; /** Sub-classes of this class appear in the preference dialog where users can diff --git a/src/Gui/View3DInventorViewer.cpp b/src/Gui/View3DInventorViewer.cpp index 2a50022f1ea6..fc4ff34ad134 100644 --- a/src/Gui/View3DInventorViewer.cpp +++ b/src/Gui/View3DInventorViewer.cpp @@ -1498,6 +1498,8 @@ void View3DInventorViewer::setSceneGraph(SoNode* root) static_cast(scene)->insertChild(this->backlight, 0); } } + + navigation->findBoundingSphere(); } void View3DInventorViewer::savePicture(int width, int height, int sample, const QColor& bg, QImage& img) const