1
0
mirror of https://github.com/thp/pyotherside.git synced 2025-02-05 08:08:23 +08:00

Use proper way of synchronizing PyFbo and PyFboRenderer.

This commit is contained in:
Dennis Tomas 2014-10-19 20:40:11 +02:00
parent 1ec78f422e
commit 092370631a
2 changed files with 26 additions and 41 deletions

View File

@ -26,7 +26,6 @@ class PyFboRenderer : public QQuickFramebufferObject::Renderer
public:
PyFboRenderer()
: m_renderer(0)
, m_oldRenderer(0)
{
}
@ -36,45 +35,47 @@ public:
delete m_renderer;
m_renderer = 0;
}
if (m_oldRenderer) {
delete m_oldRenderer;
m_oldRenderer = 0;
}
}
void render() {
if (m_oldRenderer) {
m_oldRenderer->cleanup();
delete m_oldRenderer;
m_oldRenderer = 0;
}
if (!m_renderer) {
void render()
{
if (!m_renderer)
return;
}
m_renderer->init();
m_renderer->render();
}
void setRenderer(QVariant rendererRef) {
// Defer deleting the old renderer until render() is called,
// when we have an OpenGL context.
m_oldRenderer = m_renderer;
m_renderer = new PyGLRenderer(rendererRef, false);
update();
void synchronize(QQuickFramebufferObject *item)
{
PyFbo *pyFbo = static_cast<PyFbo *>(item);
if (pyFbo->renderer() == m_rendererRef)
return;
if (m_renderer) {
m_renderer->cleanup();
delete m_renderer;
m_renderer = 0;
}
QOpenGLFramebufferObject *createFramebufferObject(const QSize &size) {
m_rendererRef = pyFbo->renderer();
if (!m_rendererRef.isNull()) {
m_renderer = new PyGLRenderer(m_rendererRef, false);
m_renderer->init();
}
}
QOpenGLFramebufferObject *createFramebufferObject(const QSize &size)
{
QOpenGLFramebufferObjectFormat format;
// TODO: get the FBO format from the PyGLRenderer.
return new QOpenGLFramebufferObject(size, format);
}
private:
QVariant m_rendererRef;
PyGLRenderer *m_renderer;
PyGLRenderer *m_oldRenderer;
};
PyFbo::PyFbo()
: m_fboRenderer(0)
{
}
@ -83,21 +84,10 @@ void PyFbo::setRenderer(QVariant rendererRef)
if (rendererRef == m_rendererRef)
return;
m_rendererRef = rendererRef;
// If we already have a PyFboRenderer, set its python GL renderer.
// Otherwise it will be set when createRenderer() is called.
if (m_fboRenderer) {
static_cast<PyFboRenderer *>(m_fboRenderer)->setRenderer(m_rendererRef);
}
update();
}
QQuickFramebufferObject::Renderer *PyFbo::createRenderer() const
{
m_fboRenderer = new PyFboRenderer();
// If we already have a python GL renderer, set it now.
if (!m_rendererRef.isNull()) {
static_cast<PyFboRenderer *>(m_fboRenderer)->setRenderer(m_rendererRef);
}
return m_fboRenderer;
return new PyFboRenderer();
}

View File

@ -37,11 +37,6 @@ public:
void setRenderer(QVariant rendererRef);
private:
QVariant m_rendererRef;
// We have to keep a pointer to the renderer created by createRenderer()
// around, for being able to swap out its PyGLRenderer
// when setRenderer() is called.
mutable Renderer *m_fboRenderer;
};
#endif