code reduction w.r.t offscreen rendering

This commit is contained in:
wmayer
2018-01-07 17:12:50 +01:00
parent 292608e466
commit a9b1356bc7
9 changed files with 67 additions and 199 deletions

View File

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

View File

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

View File

@@ -55,9 +55,6 @@ public:
void RestoreDocFile(Base::Reader &reader);
//@}
private:
void createThumbnailFromFramebuffer(QImage&) const;
private:
QUrl uri;
View3DInventorViewer* viewer;

View File

@@ -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<QtGLWidget*>(_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();
}
// **********************************************************************************

View File

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

View File

@@ -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<QtGLWidget*>(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<QtGLWidget*>(this->viewport())->makeCurrent();

View File

@@ -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;
//@}
/**

View File

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

View File

@@ -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<PyObject*> callbacks;