diff --git a/src/Gui/View3DInventorViewer.cpp b/src/Gui/View3DInventorViewer.cpp index 3c7460d129..a307d08f23 100644 --- a/src/Gui/View3DInventorViewer.cpp +++ b/src/Gui/View3DInventorViewer.cpp @@ -1356,41 +1356,7 @@ void View3DInventorViewer::setRenderType(const RenderType type) break; case Image: { - QtGLWidget* gl = static_cast(this->viewport()); - gl->makeCurrent(); -#if !defined(HAVE_QT5_OPENGL) - int w = gl->width(); - int h = gl->height(); - QImage img(QSize(w,h), QImage::Format_RGB32); - glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, img.bits()); - glImage = img; -#else - const SbViewportRegion vp = this->getSoRenderManager()->getViewportRegion(); - SbVec2s size = vp.getViewportSizePixels(); - int width = size[0]; - int height = size[1]; - - int samples = getNumSamples(); - if (samples == 0) { - // if anti-aliasing is off we can directly use glReadPixels - QImage img(QSize(width, height), QImage::Format_RGB32); - glReadPixels(0, 0, width, height, GL_BGRA, GL_UNSIGNED_BYTE, img.bits()); - glImage = img; - } - else { - QOpenGLFramebufferObjectFormat fboFormat; - fboFormat.setSamples(getNumSamples()); - fboFormat.setAttachment(QOpenGLFramebufferObject::Depth); - fboFormat.setTextureTarget(GL_TEXTURE_2D); - fboFormat.setInternalTextureFormat(GL_RGBA32F_ARB); - - QOpenGLFramebufferObject fbo(width, height, fboFormat); - renderToFramebuffer(&fbo); - - glImage = fbo.toImage(false); - } -#endif - gl->doneCurrent(); + glImage = grabFramebuffer(); } break; } @@ -1401,6 +1367,48 @@ View3DInventorViewer::RenderType View3DInventorViewer::getRenderType() const return this->renderType; } +QImage View3DInventorViewer::grabFramebuffer() +{ + QtGLWidget* gl = static_cast(this->viewport()); + gl->makeCurrent(); + + QImage res; +#if !defined(HAVE_QT5_OPENGL) + int w = gl->width(); + int h = gl->height(); + QImage img(QSize(w,h), QImage::Format_RGB32); + glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, img.bits()); + res = img; +#else + const SbViewportRegion vp = this->getSoRenderManager()->getViewportRegion(); + SbVec2s size = vp.getViewportSizePixels(); + int width = size[0]; + int height = size[1]; + + int samples = getNumSamples(); + if (samples == 0) { + // if anti-aliasing is off we can directly use glReadPixels + QImage img(QSize(width, height), QImage::Format_RGB32); + glReadPixels(0, 0, width, height, GL_BGRA, GL_UNSIGNED_BYTE, img.bits()); + res = img; + } + else { + QOpenGLFramebufferObjectFormat fboFormat; + fboFormat.setSamples(getNumSamples()); + fboFormat.setAttachment(QOpenGLFramebufferObject::Depth); + fboFormat.setTextureTarget(GL_TEXTURE_2D); + fboFormat.setInternalTextureFormat(GL_RGB32F_ARB); + + QOpenGLFramebufferObject fbo(width, height, fboFormat); + renderToFramebuffer(&fbo); + + res = fbo.toImage(false); + } +#endif + gl->doneCurrent(); + return res; +} + void View3DInventorViewer::renderToFramebuffer(QtGLFramebufferObject* fbo) { static_cast(this->viewport())->makeCurrent(); diff --git a/src/Gui/View3DInventorViewer.h b/src/Gui/View3DInventorViewer.h index 06688ff872..392e1b7c67 100644 --- a/src/Gui/View3DInventorViewer.h +++ b/src/Gui/View3DInventorViewer.h @@ -159,6 +159,7 @@ public: void setRenderType(const RenderType type); RenderType getRenderType() const; void renderToFramebuffer(QtGLFramebufferObject*); + QImage grabFramebuffer(); virtual void setViewing(SbBool enable); virtual void setCursorEnabled(SbBool enable);