From 5604e64f541ab42ade405ee7425a28c22d3ccf22 Mon Sep 17 00:00:00 2001 From: wmayer Date: Sat, 23 Sep 2017 11:14:41 +0200 Subject: [PATCH] Various fixes: + disable VBO rendering in split views + activate multi-sampling in split view for manual alignment + share GL widget in case a document has multiple views to make VBO rendering work correctly --- src/Gui/Document.cpp | 9 ++++- src/Gui/ManualAlignment.cpp | 38 +++++++++++++++++-- src/Gui/SplitView3DInventor.cpp | 64 ++++++++++++++++---------------- src/Gui/View3DInventor.cpp | 37 +++++------------- src/Gui/View3DInventorViewer.cpp | 4 +- src/Gui/View3DInventorViewer.h | 3 +- 6 files changed, 89 insertions(+), 66 deletions(-) diff --git a/src/Gui/Document.cpp b/src/Gui/Document.cpp index efad6176f2..9bb98ebec6 100644 --- a/src/Gui/Document.cpp +++ b/src/Gui/Document.cpp @@ -1055,7 +1055,14 @@ void Document::createView(const Base::Type& typeId) std::list theViews = this->getMDIViewsOfType(typeId); if (typeId == View3DInventor::getClassTypeId()) { - View3DInventor* view3D = new View3DInventor(this, getMainWindow()); + QtGLWidget* shareWidget = 0; + // VBO rendering doesn't work correctly when we don't share the OpenGL widgets + if (!theViews.empty()) { + View3DInventor* firstView = static_cast(theViews.front()); + shareWidget = qobject_cast(firstView->getViewer()->getGLWidget()); + } + + View3DInventor* view3D = new View3DInventor(this, getMainWindow(), shareWidget); if (!theViews.empty()) { View3DInventor* firstView = static_cast(theViews.front()); std::string overrideMode = firstView->getViewer()->getOverrideMode(); diff --git a/src/Gui/ManualAlignment.cpp b/src/Gui/ManualAlignment.cpp index 0d38aae03a..2d3bc7afea 100644 --- a/src/Gui/ManualAlignment.cpp +++ b/src/Gui/ManualAlignment.cpp @@ -340,12 +340,37 @@ public: AlignmentView(Gui::Document* pcDocument, QWidget* parent, Qt::WindowFlags wflags=0) : AbstractSplitView(pcDocument, parent, wflags) { + //anti-aliasing settings + bool smoothing = false; + bool glformat = false; + int samples = View3DInventorViewer::getNumSamples(); + QtGLFormat f; + + if (samples > 1) { + glformat = true; +#if !defined(HAVE_QT5_OPENGL) + f.setSampleBuffers(true); +#endif + f.setSamples(samples); + } + else if (samples > 0) { + smoothing = true; + } + QSplitter* mainSplitter=0; mainSplitter = new QSplitter(Qt::Horizontal, this); - _viewer.push_back(new View3DInventorViewer(mainSplitter)); - _viewer.back()->setDocument(pcDocument); - _viewer.push_back(new View3DInventorViewer(mainSplitter)); - _viewer.back()->setDocument(pcDocument); + if (glformat) { + _viewer.push_back(new View3DInventorViewer(f, mainSplitter)); + _viewer.back()->setDocument(pcDocument); + _viewer.push_back(new View3DInventorViewer(f, mainSplitter)); + _viewer.back()->setDocument(pcDocument); + } + else { + _viewer.push_back(new View3DInventorViewer(mainSplitter)); + _viewer.back()->setDocument(pcDocument); + _viewer.push_back(new View3DInventorViewer(mainSplitter)); + _viewer.back()->setDocument(pcDocument); + } QFrame* vbox = new QFrame(this); QVBoxLayout* layout = new QVBoxLayout(); @@ -374,6 +399,11 @@ public: // apply the user settings setupSettings(); + if (smoothing) { + for (std::vector::size_type i = 0; i != _viewer.size(); i++) + _viewer[i]->getSoRenderManager()->getGLRenderAction()->setSmoothing(true); + } + static_cast(getViewer(0)->getSoRenderManager()->getSceneGraph())-> addChild(setupHeadUpDisplay(tr("Movable object"))); static_cast(getViewer(1)->getSoRenderManager()->getSceneGraph())-> diff --git a/src/Gui/SplitView3DInventor.cpp b/src/Gui/SplitView3DInventor.cpp index bb9c077655..6f4d5c713b 100644 --- a/src/Gui/SplitView3DInventor.cpp +++ b/src/Gui/SplitView3DInventor.cpp @@ -87,7 +87,6 @@ void AbstractSplitView::setupSettings() OnChange(*hGrp,"BackgroundColor3"); OnChange(*hGrp,"BackgroundColor4"); OnChange(*hGrp,"UseBackgroundColorMid"); - OnChange(*hGrp,"UseAntialiasing"); OnChange(*hGrp,"ShowFPS"); OnChange(*hGrp,"UseVBO"); OnChange(*hGrp,"Orthographic"); @@ -99,6 +98,10 @@ void AbstractSplitView::setupSettings() OnChange(*hGrp,"BacklightDirection"); OnChange(*hGrp,"BacklightIntensity"); OnChange(*hGrp,"NavigationStyle"); + OnChange(*hGrp,"OrbitStyle"); + OnChange(*hGrp,"Sensitivity"); + OnChange(*hGrp,"ResetCursorPosition"); + OnChange(*hGrp,"PickRadius"); } View3DInventorViewer* AbstractSplitView::getViewer(unsigned int n) const @@ -204,6 +207,21 @@ void AbstractSplitView::OnChange(ParameterGrp::SubjectType &rCaller,ParameterGrp //for (std::vector::iterator it = _viewer.begin(); it != _viewer.end(); ++it) // (*it)->setNavigationType(type); } + else if (strcmp(Reason,"OrbitStyle") == 0) { + int style = rGrp.GetInt("OrbitStyle",1); + for (std::vector::iterator it = _viewer.begin(); it != _viewer.end(); ++it) + (*it)->navigationStyle()->setOrbitStyle(NavigationStyle::OrbitStyle(style)); + } + else if (strcmp(Reason,"Sensitivity") == 0) { + float val = rGrp.GetFloat("Sensitivity",2.0f); + for (std::vector::iterator it = _viewer.begin(); it != _viewer.end(); ++it) + (*it)->navigationStyle()->setSensitivity(val); + } + else if (strcmp(Reason,"ResetCursorPosition") == 0) { + bool on = rGrp.GetBool("ResetCursorPosition",false); + for (std::vector::iterator it = _viewer.begin(); it != _viewer.end(); ++it) + (*it)->navigationStyle()->setResetCursorPosition(on); + } else if (strcmp(Reason,"EyeDistance") == 0) { for (std::vector::iterator it = _viewer.begin(); it != _viewer.end(); ++it) (*it)->getSoRenderManager()->setStereoOffset(rGrp.GetFloat("EyeDistance",5.0)); @@ -220,17 +238,14 @@ void AbstractSplitView::OnChange(ParameterGrp::SubjectType &rCaller,ParameterGrp for (std::vector::iterator it = _viewer.begin(); it != _viewer.end(); ++it) (*it)->setGradientBackground((rGrp.GetBool("Gradient",true))); } - else if (strcmp(Reason,"UseAntialiasing") == 0) { - for (std::vector::iterator it = _viewer.begin(); it != _viewer.end(); ++it) - (*it)->getSoRenderManager()->getGLRenderAction()->setSmoothing(rGrp.GetBool("UseAntialiasing",false)); - } else if (strcmp(Reason,"ShowFPS") == 0) { for (std::vector::iterator it = _viewer.begin(); it != _viewer.end(); ++it) (*it)->setEnabledFPSCounter(rGrp.GetBool("ShowFPS",false)); } else if (strcmp(Reason,"UseVBO") == 0) { - for (std::vector::iterator it = _viewer.begin(); it != _viewer.end(); ++it) - (*it)->setEnabledVBO(rGrp.GetBool("UseVBO",false)); + // Disable VBO for split screen as this leads to random crashes + //for (std::vector::iterator it = _viewer.begin(); it != _viewer.end(); ++it) + // (*it)->setEnabledVBO(rGrp.GetBool("UseVBO",false)); } else if (strcmp(Reason,"Orthographic") == 0) { @@ -244,6 +259,10 @@ void AbstractSplitView::OnChange(ParameterGrp::SubjectType &rCaller,ParameterGrp (*it)->setCameraType(SoPerspectiveCamera::getClassTypeId()); } } + else if (strcmp(Reason, "PickRadius") == 0) { + for (std::vector::iterator it = _viewer.begin(); it != _viewer.end(); ++it) + (*it)->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) @@ -684,37 +703,20 @@ SplitView3DInventor::SplitView3DInventor(int views, Gui::Document* pcDocument, Q hGrp->Attach(this); //anti-aliasing settings - QtGLFormat f; bool smoothing = false; bool glformat = false; - switch (hGrp->GetInt("AntiAliasing",0) ) { - case View3DInventorViewer::MSAA2x: + int samples = View3DInventorViewer::getNumSamples(); + QtGLFormat f; + + if (samples > 1) { glformat = true; #if !defined(HAVE_QT5_OPENGL) f.setSampleBuffers(true); #endif - f.setSamples(2); - break; - case View3DInventorViewer::MSAA4x: - glformat = true; -#if !defined(HAVE_QT5_OPENGL) - f.setSampleBuffers(true); -#endif - f.setSamples(4); - break; - case View3DInventorViewer::MSAA8x: - glformat = true; -#if !defined(HAVE_QT5_OPENGL) - f.setSampleBuffers(true); -#endif - f.setSamples(8); - break; - case View3DInventorViewer::Smoothing: + f.setSamples(samples); + } + else if (samples > 0) { smoothing = true; - break; - case View3DInventorViewer::None: - default: - break; } // minimal 2 views diff --git a/src/Gui/View3DInventor.cpp b/src/Gui/View3DInventor.cpp index 6b1b03a069..76becbb088 100644 --- a/src/Gui/View3DInventor.cpp +++ b/src/Gui/View3DInventor.cpp @@ -122,37 +122,20 @@ View3DInventor::View3DInventor(Gui::Document* pcDocument, QWidget* parent, hGrp->Attach(this); //anti-aliasing settings - QtGLFormat f; bool smoothing = false; bool glformat = false; - switch( hGrp->GetInt("AntiAliasing",0) ) { - case View3DInventorViewer::MSAA2x: - glformat = true; + int samples = View3DInventorViewer::getNumSamples(); + QtGLFormat f; + + if (samples > 1) { + glformat = true; #if !defined(HAVE_QT5_OPENGL) - f.setSampleBuffers(true); + f.setSampleBuffers(true); #endif - f.setSamples(2); - break; - case View3DInventorViewer::MSAA4x: - glformat = true; -#if !defined(HAVE_QT5_OPENGL) - f.setSampleBuffers(true); -#endif - f.setSamples(4); - break; - case View3DInventorViewer::MSAA8x: - glformat = true; -#if !defined(HAVE_QT5_OPENGL) - f.setSampleBuffers(true); -#endif - f.setSamples(8); - break; - case View3DInventorViewer::Smoothing: - smoothing = true; - break; - case View3DInventorViewer::None: - default: - break; + f.setSamples(samples); + } + else if (samples > 0) { + smoothing = true; } if (glformat) diff --git a/src/Gui/View3DInventorViewer.cpp b/src/Gui/View3DInventorViewer.cpp index 706555d43a..098ac7a321 100644 --- a/src/Gui/View3DInventorViewer.cpp +++ b/src/Gui/View3DInventorViewer.cpp @@ -1290,10 +1290,10 @@ void View3DInventorViewer::clearGraphicsItems() this->graphicsItems.clear(); } -int View3DInventorViewer::getNumSamples() const +int View3DInventorViewer::getNumSamples() { int samples = App::GetApplication().GetParameterGroupByPath - ("User parameter:BaseApp/Preferences/View")->GetInt("AntiAliasing"); + ("User parameter:BaseApp/Preferences/View")->GetInt("AntiAliasing", 0); switch (samples) { case View3DInventorViewer::MSAA2x: diff --git a/src/Gui/View3DInventorViewer.h b/src/Gui/View3DInventorViewer.h index 392e1b7c67..5cccec975c 100644 --- a/src/Gui/View3DInventorViewer.h +++ b/src/Gui/View3DInventorViewer.h @@ -155,7 +155,8 @@ public: void setFeedbackSize(const int size); int getFeedbackSize(void) const; - int getNumSamples() const; + /// Get the preferred samples from the user settings + static int getNumSamples(); void setRenderType(const RenderType type); RenderType getRenderType() const; void renderToFramebuffer(QtGLFramebufferObject*);