From e1df3feb5c78e65f867ff2cead3118050cf6f197 Mon Sep 17 00:00:00 2001 From: David Kelly Date: Tue, 11 Jul 2017 10:54:35 -0700 Subject: [PATCH] fix hmd preview --- .../src/display-plugins/OpenGLDisplayPlugin.cpp | 16 +++++++++++----- .../src/display-plugins/hmd/HmdDisplayPlugin.cpp | 3 ++- .../src/model-networking/TextureCache.cpp | 4 ++-- .../src/model-networking/TextureCache.h | 2 +- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp index e5de6fce8a..004cd05883 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp @@ -514,8 +514,14 @@ void OpenGLDisplayPlugin::renderFromTexture(gpu::Batch& batch, const gpu::Textur batch.setPipeline(_presentPipeline); batch.draw(gpu::TRIANGLE_STRIP, 4); if (copyFbo) { - gpu::Vec4i rect {0, 0, scissor.z, scissor.w}; - batch.blit(fbo, rect, copyFbo, rect); + gpu::Vec4i sourceRect(scissor.x, scissor.y, scissor.x + scissor.z, scissor.y + scissor.w); + gpu::Vec4i copyRect(0, 0, copyFbo->getWidth(), copyFbo->getHeight()); + batch.setFramebuffer(copyFbo); + batch.resetViewTransform(); + batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, vec4(0)); + batch.setViewportTransform(copyRect); + batch.setStateScissorRect(copyRect); + batch.blit(fbo, sourceRect, copyFbo, copyRect); } } @@ -849,9 +855,9 @@ void OpenGLDisplayPlugin::copyTextureToQuickFramebuffer(NetworkTexturePointer ne // setup source fbo glBindFramebuffer(GL_FRAMEBUFFER, fbo[0]); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, sourceTexture, 0); - GLint texWidth, texHeight; - glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &texWidth); - glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &texHeight); + + GLint texWidth = networkTexture->getWidth(); + GLint texHeight = networkTexture->getHeight(); // setup destination fbo glBindFramebuffer(GL_FRAMEBUFFER, fbo[1]); diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp index 656d3013ab..c0937ce289 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp @@ -286,7 +286,8 @@ void HmdDisplayPlugin::internalPresent() { viewport.z *= 2; } - auto fbo = DependencyManager::get()->getHmdPreviewFramebuffer(); + // TODO: only bother getting and passing in the hmdPreviewFramebuffer if the camera is on + auto fbo = DependencyManager::get()->getHmdPreviewFramebuffer(scissor.z, scissor.w); renderFromTexture(batch, _compositeFramebuffer->getRenderBuffer(0), viewport, scissor, fbo); }); swapBuffers(); diff --git a/libraries/model-networking/src/model-networking/TextureCache.cpp b/libraries/model-networking/src/model-networking/TextureCache.cpp index c511db28ac..3538080065 100644 --- a/libraries/model-networking/src/model-networking/TextureCache.cpp +++ b/libraries/model-networking/src/model-networking/TextureCache.cpp @@ -1001,9 +1001,9 @@ NetworkTexturePointer TextureCache::getResourceTexture(QUrl resourceTextureUrl) return NetworkTexturePointer(); } -const gpu::FramebufferPointer& TextureCache::getHmdPreviewFramebuffer() { +const gpu::FramebufferPointer& TextureCache::getHmdPreviewFramebuffer(int width, int height) { if (!_hmdPreviewFramebuffer) { - _hmdPreviewFramebuffer.reset(gpu::Framebuffer::create("hmdPreview",gpu::Element::COLOR_SRGBA_32, 2040, 1024)); + _hmdPreviewFramebuffer.reset(gpu::Framebuffer::create("hmdPreview",gpu::Element::COLOR_SRGBA_32, width, height)); } return _hmdPreviewFramebuffer; } diff --git a/libraries/model-networking/src/model-networking/TextureCache.h b/libraries/model-networking/src/model-networking/TextureCache.h index 8b7607d04d..2de447f573 100644 --- a/libraries/model-networking/src/model-networking/TextureCache.h +++ b/libraries/model-networking/src/model-networking/TextureCache.h @@ -170,7 +170,7 @@ public: NetworkTexturePointer getResourceTexture(QUrl resourceTextureUrl); const gpu::FramebufferPointer& getSpectatorCameraFramebuffer(); void resetSpectatorCameraFramebuffer(int width, int height); - const gpu::FramebufferPointer& getHmdPreviewFramebuffer(); + const gpu::FramebufferPointer& getHmdPreviewFramebuffer(int width, int height); protected: // Overload ResourceCache::prefetch to allow specifying texture type for loads