code reduction w.r.t offscreen rendering
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,9 +55,6 @@ public:
|
||||
void RestoreDocFile(Base::Reader &reader);
|
||||
//@}
|
||||
|
||||
private:
|
||||
void createThumbnailFromFramebuffer(QImage&) const;
|
||||
|
||||
private:
|
||||
QUrl uri;
|
||||
View3DInventorViewer* viewer;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
// **********************************************************************************
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
//@}
|
||||
/**
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user