class OcctFramebufferObject::FboRenderer : public QQuickFramebufferObject::Renderer
{
public:
FboRenderer();
protected:
void synchronize(QQuickFramebufferObject* fboViewer) override;
QOpenGLFramebufferObject* createFramebufferObject(const QSize& size) override;
void render() override;
private:
OcctViewer m_renderer;
};
OcctFramebufferObject::FboRenderer::FboRenderer()
: Renderer()
{
}
void OcctFramebufferObject::FboRenderer::synchronize(QQuickFramebufferObject* fboViewer)
{
auto* viewer = qobject_cast<OcctFramebufferObject*>(fboViewer);
if (viewer == nullptr)
return;
// The right place for passing data from GUI to Rendering thread
...
}
QOpenGLFramebufferObject* OcctFramebufferObject::FboRenderer::createFramebufferObject(const QSize& size)
{
QOpenGLFramebufferObjectFormat format;
format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
format.setInternalTextureFormat(GL_RGB8);
format.setSamples(4);
return new QOpenGLFramebufferObject(size, format);
}
void OcctFramebufferObject::FboRenderer::render()
{
const QOpenGLFramebufferObject& fbo = *framebufferObject();
m_renderer.setSize(fbo.width(), fbo.height());
m_renderer.render(fbo.handle()); // Do rendering stuff here
}