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:
@@ -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();
|
||||
|
||||
@@ -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())->
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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*);
|
||||
|
||||
Reference in New Issue
Block a user