diff --git a/src/Gui/SoFCOffscreenRenderer.cpp b/src/Gui/SoFCOffscreenRenderer.cpp index ba2d60711d..ad28b3cebf 100644 --- a/src/Gui/SoFCOffscreenRenderer.cpp +++ b/src/Gui/SoFCOffscreenRenderer.cpp @@ -556,6 +556,9 @@ SoQtOffscreenRenderer::makePixelBuffer(int width, int height, int samples) viewport.setWindowSize(width, height); QGLFormat fmt; + //With enabled alpha a transparent background is supported but + //at the same time breaks semi-transparent models + //fmt.setAlpha(true); if (samples > 0) { fmt.setSampleBuffers(true); fmt.setSamples(samples); @@ -583,9 +586,13 @@ SoQtOffscreenRenderer::makeFrameBuffer(int width, int height, int samples) QtGLFramebufferObjectFormat fmt; fmt.setSamples(samples); fmt.setAttachment(QtGLFramebufferObject::Depth); + //With enabled alpha a transparent background is supported but + //at the same time breaks semi-transparent models #if defined(HAVE_QT5_OPENGL) + //fmt.setInternalTextureFormat(GL_RGBA32F_ARB); fmt.setInternalTextureFormat(GL_RGB32F_ARB); #else + //fmt.setInternalTextureFormat(GL_RGBA); fmt.setInternalTextureFormat(GL_RGB); #endif #else @@ -668,7 +675,7 @@ SoQtOffscreenRenderer::renderFromBase(SoBase * base) this->renderaction->removePreRenderCallback(pre_render_cb, NULL); #if !defined(HAVE_QT5_OPENGL) - if (PRIVATE(this)->pbuffer) { + if (pixelbuffer) { pixelbuffer->doneCurrent(); } else @@ -750,14 +757,10 @@ void SoQtOffscreenRenderer::writeToImage (QImage& img) const { #if !defined(HAVE_QT5_OPENGL) - if (PRIVATE(this)->pbuffer) { - if (pixelbuffer) - img = pixelbuffer->toImage(); - } - else { - if (framebuffer) - img = framebuffer->toImage(); - } + if (pixelbuffer) + img = pixelbuffer->toImage(); + else if (framebuffer) + img = framebuffer->toImage(); #else img = this->glImage; #endif diff --git a/src/Gui/Thumbnail.cpp b/src/Gui/Thumbnail.cpp index 9eec6f5d28..eccf1ef9b2 100644 --- a/src/Gui/Thumbnail.cpp +++ b/src/Gui/Thumbnail.cpp @@ -87,22 +87,9 @@ void Thumbnail::SaveDocFile (Base::Writer &writer) const if (!this->viewer) return; QImage img; -#if !defined(HAVE_QT5_OPENGL) - bool pbuffer = QGLPixelBuffer::hasOpenGLPbuffers(); -#else - bool pbuffer = false; -#endif - if (App::GetApplication().GetParameterGroupByPath - ("User parameter:BaseApp/Preferences/Document")->GetBool("DisablePBuffers",!pbuffer)) { - this->createThumbnailFromFramebuffer(img); - } - else { - try { - this->viewer->savePicture(this->size, this->size, QColor(), img); - } - catch (...) { - this->createThumbnailFromFramebuffer(img); - } + if (this->viewer->isActiveWindow()) { + QColor invalid; + this->viewer->imageFromFramebuffer(this->size, this->size, 0, invalid, img); } QPixmap px = Gui::BitmapFactory().pixmap(App::Application::Config()["AppIcon"].c_str()); @@ -135,22 +122,3 @@ void Thumbnail::RestoreDocFile(Base::Reader &reader) { Q_UNUSED(reader); } - -void Thumbnail::createThumbnailFromFramebuffer(QImage& img) const -{ - // Alternative way of off-screen rendering - if (this->viewer->isActiveWindow()) { - static_cast(this->viewer->getGLWidget())->makeCurrent(); - - QtGLFramebufferObjectFormat format; - format.setAttachment(QtGLFramebufferObject::Depth); -#if defined(HAVE_QT5_OPENGL) - format.setInternalTextureFormat(GL_RGB32F_ARB); -#else - format.setInternalTextureFormat(GL_RGB); -#endif - QtGLFramebufferObject fbo(this->size, this->size, format); - this->viewer->renderToFramebuffer(&fbo); - img = fbo.toImage(); - } -} diff --git a/src/Gui/Thumbnail.h b/src/Gui/Thumbnail.h index 2f387a6009..5bd487ff81 100644 --- a/src/Gui/Thumbnail.h +++ b/src/Gui/Thumbnail.h @@ -55,9 +55,6 @@ public: void RestoreDocFile(Base::Reader &reader); //@} -private: - void createThumbnailFromFramebuffer(QImage&) const; - private: QUrl uri; View3DInventorViewer* viewer; diff --git a/src/Gui/View3DInventor.cpp b/src/Gui/View3DInventor.cpp index 0c7c896e82..2f87e4b158 100644 --- a/src/Gui/View3DInventor.cpp +++ b/src/Gui/View3DInventor.cpp @@ -476,60 +476,6 @@ void View3DInventor::printPreview() void View3DInventor::print(QPrinter* printer) { - // The SVG output needs to be improved -#if 0 - SoFCVectorizeSVGAction action; - SoSVGVectorOutput* out = action.getSVGOutput(); - std::string tmp = Base::FileInfo::getTempFileName(); - if (!out || !out->openFile(tmp.c_str())) - return; - SoVectorizeAction::PageSize ps; - switch (printer->pageSize()) { - case QPrinter::A0: - ps = SoVectorizeAction::A0; - break; - case QPrinter::A1: - ps = SoVectorizeAction::A1; - break; - case QPrinter::A2: - ps = SoVectorizeAction::A2; - break; - case QPrinter::A3: - ps = SoVectorizeAction::A3; - break; - case QPrinter::A4: - ps = SoVectorizeAction::A4; - break; - case QPrinter::A5: - ps = SoVectorizeAction::A5; - break; - case QPrinter::A6: - ps = SoVectorizeAction::A6; - break; - case QPrinter::A7: - ps = SoVectorizeAction::A7; - break; - case QPrinter::A8: - ps = SoVectorizeAction::A8; - break; - case QPrinter::A9: - ps = SoVectorizeAction::A9; - break; - default: - ps = SoVectorizeAction::A4; - break; - } - QColor c = Qt::white; - _viewer->saveGraphic(ps,c,&action); - out->closeFile(); - QSvgRenderer svg; - if (svg.load(QString::fromUtf8(tmp.c_str()))) { - QPainter p(printer); - svg.render(&p); - p.end(); - } -#else - QImage img; QPainter p(printer); p.setRenderHints(QPainter::Antialiasing | QPainter::HighQualityAntialiasing); if (!p.isActive() && !printer->outputFileName().isEmpty()) { @@ -539,56 +485,12 @@ void View3DInventor::print(QPrinter* printer) qApp->restoreOverrideCursor(); return; } + QRect rect = printer->pageRect(); - -#if !defined(HAVE_QT5_OPENGL) - bool pbuffer = QGLPixelBuffer::hasOpenGLPbuffers(); -#else - bool pbuffer = false; -#endif - if (App::GetApplication().GetParameterGroupByPath - ("User parameter:BaseApp/Preferences/Document")->GetBool("DisablePBuffers",!pbuffer)) { - previewFromFramebuffer(rect, img); - } - else { - try { - _viewer->savePicture(rect.width(), rect.height(), QColor(Qt::white), img); - } - catch (...) { - previewFromFramebuffer(rect, img); - } - } - + QImage img; + _viewer->imageFromFramebuffer(rect.width(), rect.height(), 8, QColor(255,255,255), img); p.drawImage(0,0,img); p.end(); -#endif -} - -void View3DInventor::previewFromFramebuffer(const QRect& rect, QImage& img) -{ - static_cast(_viewer->getGLWidget())->makeCurrent(); - -#if QT_VERSION >= 0x040600 - QtGLFramebufferObjectFormat format; - format.setSamples(8); - format.setAttachment(QtGLFramebufferObject::Depth); -#if defined(HAVE_QT5_OPENGL) - format.setInternalTextureFormat(GL_RGB32F_ARB); -#else - format.setInternalTextureFormat(GL_RGB); -#endif - QtGLFramebufferObject fbo(rect.width(), rect.height(), format); -#else - QtGLFramebufferObject fbo(rect.width(), rect.height(), QtGLFramebufferObject::Depth); -#endif - const QColor col = _viewer->backgroundColor(); - bool on = _viewer->hasGradientBackground(); - _viewer->setBackgroundColor(QColor(255,255,255)); - _viewer->setGradientBackground(false); - _viewer->renderToFramebuffer(&fbo); - _viewer->setBackgroundColor(col); - _viewer->setGradientBackground(on); - img = fbo.toImage(); } // ********************************************************************************** diff --git a/src/Gui/View3DInventor.h b/src/Gui/View3DInventor.h index c50491783c..04fbc6334c 100644 --- a/src/Gui/View3DInventor.h +++ b/src/Gui/View3DInventor.h @@ -129,7 +129,6 @@ protected: void focusInEvent (QFocusEvent * e); void customEvent (QEvent * e); void contextMenuEvent (QContextMenuEvent*e); - void previewFromFramebuffer(const QRect&, QImage&); /// handle to the viewer parameter group ParameterGrp::handle hGrp; diff --git a/src/Gui/View3DInventorViewer.cpp b/src/Gui/View3DInventorViewer.cpp index 00002bcbac..e5264a5c40 100644 --- a/src/Gui/View3DInventorViewer.cpp +++ b/src/Gui/View3DInventorViewer.cpp @@ -925,7 +925,7 @@ void View3DInventorViewer::setSceneGraph(SoNode* root) } } -void View3DInventorViewer::savePicture(int w, int h, const QColor& bg, QImage& img) const +void View3DInventorViewer::savePicture(int w, int h, int s, const QColor& bg, QImage& img) const { bool useCoinOffscreenRenderer = false; useCoinOffscreenRenderer = App::GetApplication().GetParameterGroupByPath @@ -1007,7 +1007,7 @@ void View3DInventorViewer::savePicture(int w, int h, const QColor& bg, QImage& i // render the scene if (!useCoinOffscreenRenderer) { SoQtOffscreenRenderer renderer(vp); - renderer.setNumPasses(4); + renderer.setNumPasses(s); if (bgColor.isValid()) renderer.setBackgroundColor(SbColor4f(bgColor.redF(), bgColor.greenF(), bgColor.blueF(), bgColor.alphaF())); if (!renderer.render(root)) @@ -1020,7 +1020,7 @@ void View3DInventorViewer::savePicture(int w, int h, const QColor& bg, QImage& i SoFCOffscreenRenderer& renderer = SoFCOffscreenRenderer::instance(); renderer.setViewportRegion(vp); renderer.getGLRenderAction()->setSmoothing(true); - renderer.getGLRenderAction()->setNumPasses(4); + renderer.getGLRenderAction()->setNumPasses(s); if (bgColor.isValid()) renderer.setBackgroundColor(SbColor(bgColor.redF(), bgColor.greenF(), bgColor.blueF())); if (!renderer.render(root)) @@ -1405,6 +1405,46 @@ QImage View3DInventorViewer::grabFramebuffer() return res; } +void View3DInventorViewer::imageFromFramebuffer(int width, int height, int samples, + const QColor& bgcolor, QImage& img) +{ + QtGLWidget* gl = static_cast(this->viewport()); + gl->makeCurrent(); + + const QtGLContext* context = QtGLContext::currentContext(); + if (!context) { + Base::Console().Warning("imageFromFramebuffer failed because no context is active\n"); + return; + } + + QtGLFramebufferObjectFormat fboFormat; + fboFormat.setSamples(samples); + fboFormat.setAttachment(QtGLFramebufferObject::Depth); + //With enabled alpha a transparent background is supported but + //at the same time breaks semi-transparent models +#if defined(HAVE_QT5_OPENGL) + //fboFormat.setInternalTextureFormat(GL_RGBA32F_ARB); + fboFormat.setInternalTextureFormat(GL_RGB32F_ARB); +#else + //fboFormat.setInternalTextureFormat(GL_RGBA); + fboFormat.setInternalTextureFormat(GL_RGB); +#endif + QtGLFramebufferObject fbo(width, height, fboFormat); + + const QColor col = backgroundColor(); + bool on = hasGradientBackground(); + + if (bgcolor.isValid()) { + setBackgroundColor(bgcolor); + setGradientBackground(false); + } + + renderToFramebuffer(&fbo); + setBackgroundColor(col); + setGradientBackground(on); + img = fbo.toImage(); +} + void View3DInventorViewer::renderToFramebuffer(QtGLFramebufferObject* fbo) { static_cast(this->viewport())->makeCurrent(); diff --git a/src/Gui/View3DInventorViewer.h b/src/Gui/View3DInventorViewer.h index 79bd0519fb..385456231c 100644 --- a/src/Gui/View3DInventorViewer.h +++ b/src/Gui/View3DInventorViewer.h @@ -161,6 +161,8 @@ public: RenderType getRenderType() const; void renderToFramebuffer(QtGLFramebufferObject*); QImage grabFramebuffer(); + void imageFromFramebuffer(int width, int height, int samples, + const QColor& bgcolor, QImage& img); virtual void setViewing(SbBool enable); virtual void setCursorEnabled(SbBool enable); @@ -199,9 +201,9 @@ public: //@{ /** * Creates an image with width \a w and height \a h of the current scene graph - * and exports the rendered scenegraph to an image. + * using a multi-sampling of \a s and exports the rendered scenegraph to an image. */ - void savePicture(int w, int h, const QColor&, QImage&) const; + void savePicture(int w, int h, int s, const QColor&, QImage&) const; void saveGraphic(int pagesize, const QColor&, SoVectorizeAction* va) const; //@} /** diff --git a/src/Gui/View3DPy.cpp b/src/Gui/View3DPy.cpp index c607214279..156fbc1a6c 100644 --- a/src/Gui/View3DPy.cpp +++ b/src/Gui/View3DPy.cpp @@ -695,43 +695,6 @@ Py::Object View3DInventorPy::isAnimationEnabled(const Py::Tuple& args) return Py::Boolean(ok ? true : false); } -void View3DInventorPy::createImageFromFramebuffer(int width, int height, const QColor& bgcolor, QImage& img) -{ - View3DInventorViewer* viewer = _view->getViewer(); - static_cast(viewer->getGLWidget())->makeCurrent(); - - const QtGLContext* context = QtGLContext::currentContext(); - if (!context) { - Base::Console().Warning("createImageFromFramebuffer failed because no context is active\n"); - return; - } -#if QT_VERSION >= 0x040600 - QtGLFramebufferObjectFormat format; - format.setSamples(8); - format.setAttachment(QtGLFramebufferObject::Depth); -#if defined(HAVE_QT5_OPENGL) - format.setInternalTextureFormat(GL_RGB32F_ARB); -#else - format.setInternalTextureFormat(GL_RGB); -#endif - QtGLFramebufferObject fbo(width, height, format); -#else - QtGLFramebufferObject fbo(width, height, QtGLFramebufferObject::Depth); -#endif - const QColor col = viewer->backgroundColor(); - bool on = viewer->hasGradientBackground(); - - if (bgcolor.isValid()) { - viewer->setBackgroundColor(bgcolor); - viewer->setGradientBackground(false); - } - - viewer->renderToFramebuffer(&fbo); - viewer->setBackgroundColor(col); - viewer->setGradientBackground(on); - img = fbo.toImage(); -} - Py::Object View3DInventorPy::saveImage(const Py::Tuple& args) { char *cFileName,*cColor="Current",*cComment="$MIBA"; @@ -757,15 +720,10 @@ Py::Object View3DInventorPy::saveImage(const Py::Tuple& args) QImage img; if (App::GetApplication().GetParameterGroupByPath ("User parameter:BaseApp/Preferences/Document")->GetBool("DisablePBuffers", false)) { - createImageFromFramebuffer(w, h, bg, img); + _view->getViewer()->imageFromFramebuffer(w, h, 8, bg, img); } else { - try { - _view->getViewer()->savePicture(w, h, bg, img); - } - catch (const Base::Exception&) { - createImageFromFramebuffer(w, h, bg, img); - } + _view->getViewer()->savePicture(w, h, 8, bg, img); } SoFCOffscreenRenderer& renderer = SoFCOffscreenRenderer::instance(); diff --git a/src/Gui/View3DPy.h b/src/Gui/View3DPy.h index e2e3945ff0..5753903cb1 100644 --- a/src/Gui/View3DPy.h +++ b/src/Gui/View3DPy.h @@ -117,7 +117,6 @@ private: typedef PyObject* (*method_varargs_handler)(PyObject *_self, PyObject *_args); static method_varargs_handler pycxx_handler; static PyObject *method_varargs_ext_handler(PyObject *_self, PyObject *_args); - void createImageFromFramebuffer(int width, int height, const QColor&, QImage&); private: std::list callbacks;