works, sorta, but blinks like crazy, cursor gets f-ed up...

This commit is contained in:
David Kelly 2017-06-15 14:17:43 -07:00
parent 54dfc33b38
commit 3d922f5db6
6 changed files with 116 additions and 19 deletions

View file

@ -190,6 +190,7 @@ Rectangle {
boxSize: 24;
onClicked: {
sendToScript({method: (checked ? 'spectatorCameraOn' : 'spectatorCameraOff')});
spectatorCameraPreviewItem.ready = checked;
}
}
@ -202,7 +203,10 @@ Rectangle {
anchors.topMargin: 20;
anchors.right: parent.right;
Hifi.ResourceImageItem {
id: spectatorCameraPreviewItem;
anchors.fill: parent;
url: "resource://spectatorCameraFrame";
ready: false;
}
}

View file

@ -8,11 +8,55 @@
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
#include "Application.h"
#include "ResourceImageItem.h"
#include <QOpenGLFramebufferObjectFormat>
#include <DependencyManager.h>
#include <TextureCache.h>
ResourceImageItem::ResourceImageItem(QQuickItem* parent) : QQuickFramebufferObject(parent) {
connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(update()));
}
void ResourceImageItem::setUrl(const QString& url) {
if (url != m_url) {
m_url = url;
update();
}
}
void ResourceImageItem::setReady(bool ready) {
if (ready != m_ready) {
m_ready = ready;
if (m_ready) {
m_updateTimer.start(1000);
} else {
m_updateTimer.stop();
}
update();
}
}
void ResourceImageItemRenderer::synchronize(QQuickFramebufferObject* item) {
ResourceImageItem* resourceImageItem = static_cast<ResourceImageItem*>(item);
bool urlChanged = false;
if( _url != resourceImageItem->getUrl()) {
_url = resourceImageItem->getUrl();
urlChanged = true;
}
bool readyChanged = false;
if (_ready != resourceImageItem->getReady()) {
_ready = resourceImageItem->getReady();
readyChanged = true;
}
_window = resourceImageItem->window();
qDebug() << "synchronize called!!!!!!!";
if (_ready && !_url.isNull() && !_url.isEmpty() && (readyChanged || urlChanged)) {
_networkTexture = DependencyManager::get<TextureCache>()->getTexture(_url);
}
}
QOpenGLFramebufferObject* ResourceImageItemRenderer::createFramebufferObject(const QSize& size) {
QOpenGLFramebufferObjectFormat format;
format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
@ -20,9 +64,12 @@ QOpenGLFramebufferObject* ResourceImageItemRenderer::createFramebufferObject(con
}
void ResourceImageItemRenderer::render() {
auto texture = DependencyManager::get<TextureCache>()->getTexture(QUrl("resource://spectatorCameraFrame"));
qDebug() << "render called!!!!!!!!!!!!!!";
if (_networkTexture && _ready) {
auto texture = _networkTexture->getGPUTexture();
if (texture) {
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture->getGPUTexture(), 0);
qApp->getActiveDisplayPlugin()->copyTextureToQuickFramebuffer(texture, framebufferObject());
_window->resetOpenGLState();
}
}
}

View file

@ -13,15 +13,37 @@
#define hifi_ResourceImageItem_h
#include <QQuickFramebufferObject>
#include <QOpenGLFunctions>
#include <QQuickWindow>
#include <QTimer>
class ResourceImageItemRenderer : public QQuickFramebufferObject::Renderer, protected QOpenGLFunctions {
class ResourceImageItemRenderer : public QQuickFramebufferObject::Renderer {
public:
QOpenGLFramebufferObject* createFramebufferObject(const QSize& size);
void synchronize(QQuickFramebufferObject* item);
void render();
private:
bool _ready;
QString _url;
NetworkTexturePointer _networkTexture;
QQuickWindow* _window;
};
class ResourceImageItem : public QQuickFramebufferObject {
Q_OBJECT
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 { return new ResourceImageItemRenderer; }
private:
QString m_url;
bool m_ready { false };
QTimer m_updateTimer; // TODO: something more clever
};
#endif // hifi_ResourceImageItem_h

View file

@ -16,6 +16,7 @@
#include <QtOpenGL/QGLWidget>
#include <QtGui/QImage>
#include <QOpenGLFramebufferObject>
#if defined(Q_OS_MAC)
#include <OpenGL/CGLCurrent.h>
#endif
@ -820,3 +821,20 @@ void OpenGLDisplayPlugin::updateCompositeFramebuffer() {
_compositeFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("OpenGLDisplayPlugin::composite", gpu::Element::COLOR_RGBA_32, renderSize.x, renderSize.y));
}
}
void OpenGLDisplayPlugin::copyTextureToQuickFramebuffer(gpu::TexturePointer source, QOpenGLFramebufferObject* target) {
auto glBackend = const_cast<OpenGLDisplayPlugin&>(*this).getGLBackend();
withMainThreadContext([&] {
GLuint sourceTexture = glBackend->getTextureID(source);
GLuint targetTexture = target->texture();
GLuint fbo { 0 };
glCreateFramebuffers(1, &fbo);
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, sourceTexture, 0);
glCopyTextureSubImage2D(targetTexture, 0, 0, 0, 0, 0, target->width(), target->height());
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
glDeleteFramebuffers(1, &fbo);
glDeleteTextures(1, &fbo);
});
}

View file

@ -78,6 +78,8 @@ public:
// Three threads, one for rendering, one for texture transfers, one reserved for the GL driver
int getRequiredThreadCount() const override { return 3; }
void copyTextureToQuickFramebuffer(gpu::TexturePointer source, QOpenGLFramebufferObject* target);
protected:
friend class PresentThread;

View file

@ -25,6 +25,8 @@
#include "Plugin.h"
class QOpenGLFramebufferObject;
class QImage;
enum Eye {
@ -208,6 +210,8 @@ public:
// Hardware specific stats
virtual QJsonObject getHardwareStats() const { return QJsonObject(); }
virtual void copyTextureToQuickFramebuffer(gpu::TexturePointer source, QOpenGLFramebufferObject* target) = 0;
uint32_t presentCount() const { return _presentedFrameIndex; }
// Time since last call to incrementPresentCount (only valid if DEBUG_PAINT_DELAY is defined)
int64_t getPaintDelayUsecs() const;