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
This commit is contained in:
wmayer
2017-09-23 11:14:41 +02:00
parent 6f2d59540a
commit 39e4020bdf
6 changed files with 89 additions and 66 deletions

View File

@@ -1055,7 +1055,14 @@ void Document::createView(const Base::Type& typeId)
std::list<MDIView*> 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<View3DInventor*>(theViews.front());
shareWidget = qobject_cast<QtGLWidget*>(firstView->getViewer()->getGLWidget());
}
View3DInventor* view3D = new View3DInventor(this, getMainWindow(), shareWidget);
if (!theViews.empty()) {
View3DInventor* firstView = static_cast<View3DInventor*>(theViews.front());
std::string overrideMode = firstView->getViewer()->getOverrideMode();

View File

@@ -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<int>::size_type i = 0; i != _viewer.size(); i++)
_viewer[i]->getSoRenderManager()->getGLRenderAction()->setSmoothing(true);
}
static_cast<SoGroup*>(getViewer(0)->getSoRenderManager()->getSceneGraph())->
addChild(setupHeadUpDisplay(tr("Movable object")));
static_cast<SoGroup*>(getViewer(1)->getSoRenderManager()->getSceneGraph())->

View File

@@ -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<View3DInventorViewer*>::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<View3DInventorViewer*>::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<View3DInventorViewer*>::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<View3DInventorViewer*>::iterator it = _viewer.begin(); it != _viewer.end(); ++it)
(*it)->navigationStyle()->setResetCursorPosition(on);
}
else if (strcmp(Reason,"EyeDistance") == 0) {
for (std::vector<View3DInventorViewer*>::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<View3DInventorViewer*>::iterator it = _viewer.begin(); it != _viewer.end(); ++it)
(*it)->setGradientBackground((rGrp.GetBool("Gradient",true)));
}
else if (strcmp(Reason,"UseAntialiasing") == 0) {
for (std::vector<View3DInventorViewer*>::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<View3DInventorViewer*>::iterator it = _viewer.begin(); it != _viewer.end(); ++it)
(*it)->setEnabledFPSCounter(rGrp.GetBool("ShowFPS",false));
}
else if (strcmp(Reason,"UseVBO") == 0) {
for (std::vector<View3DInventorViewer*>::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<View3DInventorViewer*>::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<View3DInventorViewer*>::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

View File

@@ -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)

View File

@@ -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:

View File

@@ -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*);