From 8415bc32b6d205ab1bfb157cbb991715f20b64fa Mon Sep 17 00:00:00 2001 From: DeepSOIC Date: Sun, 7 Aug 2016 01:00:44 +0300 Subject: [PATCH] Gui: Selection: pick radius support --- src/Gui/NavigationStyle.cpp | 5 +++-- src/Gui/Quarter/SoQTQuarterAdaptor.cpp | 16 +++++++++++++++- src/Gui/Quarter/SoQTQuarterAdaptor.h | 4 ++++ src/Gui/View3DInventor.cpp | 5 +++++ src/Gui/ViewProvider.cpp | 2 ++ src/Gui/ViewProviderGeometryObject.cpp | 2 ++ 6 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/Gui/NavigationStyle.cpp b/src/Gui/NavigationStyle.cpp index c49472ffa4..abfa9af0a3 100644 --- a/src/Gui/NavigationStyle.cpp +++ b/src/Gui/NavigationStyle.cpp @@ -309,7 +309,7 @@ SbBool NavigationStyle::lookAtPoint(const SbVec2s screenpos) SoRayPickAction rpaction(viewer->getSoRenderManager()->getViewportRegion()); rpaction.setPoint(screenpos); - rpaction.setRadius(2); + rpaction.setRadius(viewer->getPickRadius()); rpaction.apply(viewer->getSoRenderManager()->getSceneGraph()); SoPickedPoint * picked = rpaction.getPickedPoint(); @@ -994,7 +994,7 @@ void NavigationStyle::saveCursorPosition(const SoEvent * const ev) if (PRIVATE(this)->dragAtCursor) { SoRayPickAction rpaction(viewer->getSoRenderManager()->getViewportRegion()); rpaction.setPoint(this->localPos); - rpaction.setRadius(2); + rpaction.setRadius(viewer->getPickRadius()); rpaction.apply(viewer->getSoRenderManager()->getSceneGraph()); SoPickedPoint * picked = rpaction.getPickedPoint(); @@ -1058,6 +1058,7 @@ SbBool NavigationStyle::handleEventInForeground(const SoEvent* const e) { SoHandleEventAction action(viewer->getSoRenderManager()->getViewportRegion()); action.setEvent(e); + action.setPickRadius(viewer->getPickRadius()); action.apply(viewer->foregroundroot); return action.isHandled(); } diff --git a/src/Gui/Quarter/SoQTQuarterAdaptor.cpp b/src/Gui/Quarter/SoQTQuarterAdaptor.cpp index a769c93a66..73794ab0a3 100644 --- a/src/Gui/Quarter/SoQTQuarterAdaptor.cpp +++ b/src/Gui/Quarter/SoQTQuarterAdaptor.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -163,6 +164,7 @@ void SIM::Coin3D::Quarter::SoQTQuarterAdaptor::init() m_inseekmode = false; m_storedcamera = 0; m_viewingflag = false; + pickRadius = 5.0; m_seeksensor = new SoTimerSensor(SoQTQuarterAdaptor::seeksensorCB, (void*)this); getSoEventManager()->setNavigationState(SoEventManager::NO_NAVIGATION); @@ -378,12 +380,24 @@ SbBool SIM::Coin3D::Quarter::SoQTQuarterAdaptor::isSeekValuePercentage(void) con return m_seekdistanceabs ? false : true; } +void SIM::Coin3D::Quarter::SoQTQuarterAdaptor::setPickRadius(float pickRadius) +{ + this->pickRadius = pickRadius; + SoEventManager* evm = this->getSoEventManager(); + if (evm){ + SoHandleEventAction* a = evm->getHandleEventAction(); + if (a){ + a->setPickRadius(pickRadius); + } + } +} + SbBool SIM::Coin3D::Quarter::SoQTQuarterAdaptor::seekToPoint(const SbVec2s screenpos) { SoRayPickAction rpaction(getSoRenderManager()->getViewportRegion()); rpaction.setPoint(screenpos); - rpaction.setRadius(2); + rpaction.setRadius(pickRadius); rpaction.apply(getSoRenderManager()->getSceneGraph()); SoPickedPoint* picked = rpaction.getPickedPoint(); diff --git a/src/Gui/Quarter/SoQTQuarterAdaptor.h b/src/Gui/Quarter/SoQTQuarterAdaptor.h index eea6f44e6c..c79705fa03 100644 --- a/src/Gui/Quarter/SoQTQuarterAdaptor.h +++ b/src/Gui/Quarter/SoQTQuarterAdaptor.h @@ -85,6 +85,9 @@ public: void setSeekValueAsPercentage(const SbBool on); SbBool isSeekValuePercentage(void) const; + virtual float getPickRadius(void) const {return this->pickRadius;}; + virtual void setPickRadius(float pickRadius); + virtual void saveHomePosition(void); virtual void resetToHomePosition(void); @@ -120,6 +123,7 @@ private: SbBool m_seekdistanceabs; SoSearchAction searchaction; SoGetMatrixAction matrixaction; + float pickRadius; // Home position storage. SoNode * m_storedcamera; diff --git a/src/Gui/View3DInventor.cpp b/src/Gui/View3DInventor.cpp index 26b7768875..2d4f54c8aa 100644 --- a/src/Gui/View3DInventor.cpp +++ b/src/Gui/View3DInventor.cpp @@ -192,6 +192,7 @@ View3DInventor::View3DInventor(Gui::Document* pcDocument, QWidget* parent, OnChange(*hGrp,"DimensionsVisible"); OnChange(*hGrp,"Dimensions3dVisible"); OnChange(*hGrp,"DimensionsDeltaVisible"); + OnChange(*hGrp,"PickRadius"); stopSpinTimer = new QTimer(this); connect(stopSpinTimer, SIGNAL(timeout()), this, SLOT(stopAnimating())); @@ -395,6 +396,10 @@ void View3DInventor::OnChange(ParameterGrp::SubjectType &rCaller,ParameterGrp::M else _viewer->turnDeltaDimensionsOff(); } + else if (strcmp(Reason, "PickRadius") == 0) + { + _viewer->setPickRadius(rGrp.GetFloat("PickRadius", 5.0f)); + } else{ unsigned long col1 = rGrp.GetUnsigned("BackgroundColor",3940932863UL); unsigned long col2 = rGrp.GetUnsigned("BackgroundColor2",859006463UL); // default color (dark blue) diff --git a/src/Gui/ViewProvider.cpp b/src/Gui/ViewProvider.cpp index 09fcdb6001..1f5138aaa3 100644 --- a/src/Gui/ViewProvider.cpp +++ b/src/Gui/ViewProvider.cpp @@ -416,6 +416,7 @@ SoPickedPoint* ViewProvider::getPointOnRay(const SbVec2s& pos, const View3DInven //get the picked point SoRayPickAction rp(viewer->getSoRenderManager()->getViewportRegion()); rp.setPoint(pos); + rp.setRadius(viewer->getPickRadius()); rp.apply(root); root->unref(); trans->unref(); @@ -452,6 +453,7 @@ SoPickedPoint* ViewProvider::getPointOnRay(const SbVec3f& pos,const SbVec3f& dir //get the picked point SoRayPickAction rp(viewer->getSoRenderManager()->getViewportRegion()); rp.setRay(pos,dir); + rp.setRadius(viewer->getPickRadius()); rp.apply(root); root->unref(); trans->unref(); diff --git a/src/Gui/ViewProviderGeometryObject.cpp b/src/Gui/ViewProviderGeometryObject.cpp index 69aed1c7ed..561e8f8b75 100644 --- a/src/Gui/ViewProviderGeometryObject.cpp +++ b/src/Gui/ViewProviderGeometryObject.cpp @@ -371,6 +371,7 @@ SoPickedPointList ViewProviderGeometryObject::getPickedPoints(const SbVec2s& pos SoRayPickAction rp(viewer.getSoRenderManager()->getViewportRegion()); rp.setPickAll(pickAll); + rp.setRadius(viewer.getPickRadius()); rp.setPoint(pos); rp.apply(root); root->unref(); @@ -389,6 +390,7 @@ SoPickedPoint* ViewProviderGeometryObject::getPickedPoint(const SbVec2s& pos, co SoRayPickAction rp(viewer.getSoRenderManager()->getViewportRegion()); rp.setPoint(pos); + rp.setRadius(viewer.getPickRadius()); rp.apply(root); root->unref();