diff --git a/interface/src/ui/ResourceImageItem.cpp b/interface/src/ui/ResourceImageItem.cpp index edb9549850..68ad50f2a1 100644 --- a/interface/src/ui/ResourceImageItem.cpp +++ b/interface/src/ui/ResourceImageItem.cpp @@ -18,34 +18,36 @@ #include -ResourceImageItem::ResourceImageItem(QQuickItem* parent) : QQuickFramebufferObject(parent) { - connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(onUpdateTimer())); -} - -void ResourceImageItem::onUpdateTimer() { - update(); -} - void ResourceImageItem::setUrl(const QString& url) { if (url != m_url) { m_url = url; + update(); } - update(); } void ResourceImageItem::setReady(bool ready) { if (ready != m_ready) { m_ready = ready; - if (m_ready) { - // 10 HZ for now. Also this serves as a small - // delay before getting the network texture, which - // helps a lot. TODO: find better way. - m_updateTimer.start(100); + update(); + } +} + +void ResourceImageItemRenderer::onUpdateTimer() { + if (_ready && _networkTexture && _networkTexture->isLoaded()) { + if(_fboMutex.tryLock()) { + invalidateFramebufferObject(); + qApp->getActiveDisplayPlugin()->copyTextureToQuickFramebuffer(_networkTexture, _copyFbo, &_fenceSync); + _fboMutex.unlock(); } else { - m_updateTimer.stop(); - update(); + qDebug() << "couldn't get a lock, using last frame"; } } + + update(); +} + +ResourceImageItemRenderer::ResourceImageItemRenderer() : QQuickFramebufferObject::Renderer() { + connect(&_updateTimer, SIGNAL(timeout()), this, SLOT(onUpdateTimer())); } void ResourceImageItemRenderer::synchronize(QQuickFramebufferObject* item) { @@ -68,18 +70,11 @@ void ResourceImageItemRenderer::synchronize(QQuickFramebufferObject* item) { _networkTexture = DependencyManager::get()->getTexture(_url); } - if (_ready && _networkTexture && _networkTexture->isLoaded()) { - if(_fboMutex.tryLock()) { - invalidateFramebufferObject(); - qApp->getActiveDisplayPlugin()->copyTextureToQuickFramebuffer(_networkTexture, _copyFbo, &_fenceSync); - _fboMutex.unlock(); - } else { - qDebug() << "couldn't get a lock, using last frame"; - } - + if (_ready && !_updateTimer.isActive()) { + _updateTimer.start(100); + } else if (!_ready && _updateTimer.isActive()) { + _updateTimer.stop(); } - glFlush(); - } QOpenGLFramebufferObject* ResourceImageItemRenderer::createFramebufferObject(const QSize& size) { @@ -90,28 +85,6 @@ QOpenGLFramebufferObject* ResourceImageItemRenderer::createFramebufferObject(con return new QOpenGLFramebufferObject(size, format); } -/* -// this is helpful to look for problems without the confusion of the framebufer stuff -void ResourceImageItemRenderer::render() { - qDebug() << "rendering"; - static int colorInt = 0; - float red = (float)((colorInt++ % 50)/(float)50); - glClearColor(red, 0.0f, 0.0f, 0.5f + red/2.0f); - glClear(GL_COLOR_BUFFER_BIT); - glFlush(); - update(); - //_window->resetOpenGLState(); - // we only want to call Renderer::update once per timer tick, and - // so waiting on the fenceSync and resetting it does that - auto f = QOpenGLContext::currentContext()->extraFunctions(); - if (_fenceSync) { - f->glWaitSync(_fenceSync, 0, GL_TIMEOUT_IGNORED); - f->glDeleteSync(_fenceSync); - _fenceSync = 0; - update(); - } -} -*/ void ResourceImageItemRenderer::render() { auto f = QOpenGLContext::currentContext()->extraFunctions(); bool doUpdate = false; @@ -136,4 +109,5 @@ void ResourceImageItemRenderer::render() { } } glFlush(); + _window->resetOpenGLState(); } diff --git a/interface/src/ui/ResourceImageItem.h b/interface/src/ui/ResourceImageItem.h index 839324cbf1..2fd106a828 100644 --- a/interface/src/ui/ResourceImageItem.h +++ b/interface/src/ui/ResourceImageItem.h @@ -18,8 +18,10 @@ #include -class ResourceImageItemRenderer : public QQuickFramebufferObject::Renderer { +class ResourceImageItemRenderer : public QObject, public QQuickFramebufferObject::Renderer { + Q_OBJECT public: + ResourceImageItemRenderer(); QOpenGLFramebufferObject* createFramebufferObject(const QSize& size) override; void synchronize(QQuickFramebufferObject* item) override; void render() override; @@ -32,6 +34,9 @@ private: QMutex _fboMutex; QOpenGLFramebufferObject* _copyFbo; GLsync _fenceSync { 0 }; + QTimer _updateTimer; +public slots: + void onUpdateTimer(); }; class ResourceImageItem : public QQuickFramebufferObject { @@ -39,20 +44,15 @@ class ResourceImageItem : public QQuickFramebufferObject { Q_PROPERTY(QString url READ getUrl WRITE setUrl) Q_PROPERTY(bool ready READ getReady WRITE setReady) public: - ResourceImageItem(QQuickItem* parent = Q_NULLPTR); QString getUrl() const { return m_url; } void setUrl(const QString& url); bool getReady() const { return m_ready; } void setReady(bool ready); QQuickFramebufferObject::Renderer* createRenderer() const override { return new ResourceImageItemRenderer; } -public slots: - void onUpdateTimer(); - private: QString m_url; bool m_ready { false }; - QTimer m_updateTimer; // TODO: something more clever };