From 398075e45aa32775988e671857f012b518fa08da Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 16 Jul 2015 16:26:28 -0700 Subject: [PATCH 01/12] hacking on more naked GL --- interface/src/Application.cpp | 5 + interface/src/Application.h | 3 - interface/src/audio/AudioScope.cpp | 4 +- interface/src/audio/AudioScope.h | 1 + interface/src/ui/ApplicationCompositor.cpp | 31 ++-- interface/src/ui/ApplicationOverlay.cpp | 180 +++++++++++++------ interface/src/ui/ApplicationOverlay.h | 9 +- interface/src/ui/overlays/Overlays.cpp | 17 +- libraries/render-utils/src/GeometryCache.cpp | 2 + 9 files changed, 185 insertions(+), 67 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 056490806a..71eabd2d6d 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -895,6 +895,11 @@ void Application::paintGL() { { PerformanceTimer perfTimer("renderOverlay"); + + // NOTE: the ApplicationOverlay class assumes it's viewport is setup to be the device size + // There is no batch associated with this renderArgs + QSize size = qApp->getDeviceSize(); + renderArgs._viewport = glm::ivec4(0, 0, size.width(), size.height()); _applicationOverlay.renderOverlay(&renderArgs); } diff --git a/interface/src/Application.h b/interface/src/Application.h index 44ead54563..d2a55fbf70 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -359,9 +359,6 @@ signals: /// Fired when we're rendering in-world interface elements; allows external parties to hook in. void renderingInWorldInterface(); - /// Fired when we're rendering the overlay. - void renderingOverlay(); - /// Fired when the import window is closed void importDone(); diff --git a/interface/src/audio/AudioScope.cpp b/interface/src/audio/AudioScope.cpp index 4b4e86e7f4..d9ceb82eef 100644 --- a/interface/src/audio/AudioScope.cpp +++ b/interface/src/audio/AudioScope.cpp @@ -38,6 +38,7 @@ AudioScope::AudioScope() : _scopeOutputLeft(NULL), _scopeOutputRight(NULL), _scopeLastFrame(), + _audioScopeBackground(DependencyManager::get()->allocateID()), _audioScopeGrid(DependencyManager::get()->allocateID()), _inputID(DependencyManager::get()->allocateID()), _outputLeftID(DependencyManager::get()->allocateID()), @@ -135,7 +136,8 @@ void AudioScope::render(RenderArgs* renderArgs, int width, int height) { batch.setProjectionTransform(legacyProjection); batch.setModelTransform(Transform()); batch.setViewTransform(Transform()); - geometryCache->renderQuad(batch, x, y, w, h, backgroundColor); + batch._glLineWidth(1.0f); // default + geometryCache->renderQuad(batch, x, y, w, h, backgroundColor, _audioScopeBackground); geometryCache->renderGrid(batch, x, y, w, h, gridRows, gridCols, gridColor, _audioScopeGrid); renderLineStrip(batch, _inputID, inputColor, x, y, _samplesPerScope, _scopeInputOffset, _scopeInput); renderLineStrip(batch, _outputLeftID, outputLeftColor, x, y, _samplesPerScope, _scopeOutputOffset, _scopeOutputLeft); diff --git a/interface/src/audio/AudioScope.h b/interface/src/audio/AudioScope.h index 4ff4b55c29..0b716d7666 100644 --- a/interface/src/audio/AudioScope.h +++ b/interface/src/audio/AudioScope.h @@ -69,6 +69,7 @@ private: QByteArray* _scopeOutputRight; QByteArray _scopeLastFrame; + int _audioScopeBackground; int _audioScopeGrid; int _inputID; int _outputLeftID; diff --git a/interface/src/ui/ApplicationCompositor.cpp b/interface/src/ui/ApplicationCompositor.cpp index 4623109cdd..56735111c1 100644 --- a/interface/src/ui/ApplicationCompositor.cpp +++ b/interface/src/ui/ApplicationCompositor.cpp @@ -189,8 +189,9 @@ void ApplicationCompositor::displayOverlayTexture(RenderArgs* renderArgs) { return; } - GLuint texture = qApp->getApplicationOverlay().getOverlayTexture(); - if (!texture) { + //GLuint texture = 0; // FIXME -- qApp->getApplicationOverlay().getOverlayTexture(); + gpu::FramebufferPointer overlayFramebuffer = qApp->getApplicationOverlay().getOverlayFramebuffer(); + if (!overlayFramebuffer) { return; } @@ -209,9 +210,12 @@ void ApplicationCompositor::displayOverlayTexture(RenderArgs* renderArgs) { batch.setModelTransform(Transform()); batch.setViewTransform(Transform()); batch.setProjectionTransform(mat4()); - batch._glBindTexture(GL_TEXTURE_2D, texture); - batch._glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - batch._glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + //batch._glBindTexture(GL_TEXTURE_2D, texture); + //batch._glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + //batch._glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + batch.setResourceTexture(0, overlayFramebuffer->getRenderBuffer(0)); + geometryCache->renderUnitQuad(batch, vec4(vec3(1), _alpha)); // Doesn't actually render @@ -258,8 +262,12 @@ void ApplicationCompositor::displayOverlayTextureHmd(RenderArgs* renderArgs, int return; } - GLuint texture = qApp->getApplicationOverlay().getOverlayTexture(); - if (!texture) { + //GLuint texture = 0; // FIXME -- qApp->getApplicationOverlay().getOverlayTexture(); + //if (!texture) { + // return; + //} + gpu::FramebufferPointer overlayFramebuffer = qApp->getApplicationOverlay().getOverlayFramebuffer(); + if (!overlayFramebuffer) { return; } @@ -275,9 +283,12 @@ void ApplicationCompositor::displayOverlayTextureHmd(RenderArgs* renderArgs, int geometryCache->useSimpleDrawPipeline(batch); batch._glDisable(GL_DEPTH_TEST); batch._glDisable(GL_CULL_FACE); - batch._glBindTexture(GL_TEXTURE_2D, texture); - batch._glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - batch._glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + //batch._glBindTexture(GL_TEXTURE_2D, texture); + //batch._glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + //batch._glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + batch.setResourceTexture(0, overlayFramebuffer->getRenderBuffer(0)); + batch.setViewTransform(Transform()); batch.setProjectionTransform(qApp->getEyeProjection(eye)); diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 63dcba9d5d..f89867c70d 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -40,12 +40,6 @@ const float CONNECTION_STATUS_BORDER_LINE_WIDTH = 4.0f; static const float ORTHO_NEAR_CLIP = -10000; static const float ORTHO_FAR_CLIP = 10000; -// TODO move somewhere useful -static void fboViewport(QOpenGLFramebufferObject* fbo) { - auto size = fbo->size(); - glViewport(0, 0, size.width(), size.height()); -} - ApplicationOverlay::ApplicationOverlay() { auto geometryCache = DependencyManager::get(); @@ -84,16 +78,41 @@ void ApplicationOverlay::renderOverlay(RenderArgs* renderArgs) { buildFramebufferObject(); // Execute the batch into our framebuffer - _overlayFramebuffer->bind(); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - fboViewport(_overlayFramebuffer); + + gpu::Batch batch; + + // 1) bind the framebuffer + //_overlayFramebuffer->bind(); + batch.setFramebuffer(_overlayFramebuffer); + + // 2) clear it... + //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glm::vec4 color { 0.0f, 0.0f, 0.0f, 0.0f }; + float depth = 1.0f; + int stencil = 0; + //batch.clearFramebuffer(gpu::Framebuffer::BUFFER_COLORS | gpu::Framebuffer::BUFFER_DEPTH, color, depth, stencil); + batch.clearColorFramebuffer(_overlayFramebuffer->getBufferMask(), glm::vec4(0.0f, 0.0f, 0.0f, 0.0f)); + + int width = _overlayFramebuffer ? _overlayFramebuffer->getWidth() : 0; + int height = _overlayFramebuffer ? _overlayFramebuffer->getHeight() : 0; + + glViewport(0, 0, width, height); + + qDebug() << "ApplicationOverlay::renderOverlay()... "; + qDebug() << " renderArgs->batch:" << (void*)renderArgs->_batch; + qDebug() << " renderArgs->_viewport:" << renderArgs->_viewport.z << "," << renderArgs->_viewport.w; + qDebug() << " getDeviceSize:" << qApp->getDeviceSize(); + qDebug() << " getCanvasSize:" << qApp->getCanvasSize(); + qDebug() << " _overlayFramebuffer size:" << width << "," << height; // Now render the overlay components together into a single texture - renderOverlays(renderArgs); - renderStatsAndLogs(renderArgs); - renderDomainConnectionStatusBorder(renderArgs); - renderQmlUi(renderArgs); - _overlayFramebuffer->release(); + renderOverlays(renderArgs); // renders Scripts Overlay and AudioScope + renderStatsAndLogs(renderArgs); // currently renders nothing + renderDomainConnectionStatusBorder(renderArgs); // renders the connected domain line + renderQmlUi(renderArgs); // renders a unit quad with the QML UI texture + + //_overlayFramebuffer->release(); // now we're done for later composition + batch.setFramebuffer(nullptr); CHECK_GL_ERROR(); } @@ -102,11 +121,15 @@ void ApplicationOverlay::renderQmlUi(RenderArgs* renderArgs) { if (_uiTexture) { gpu::Batch batch; auto geometryCache = DependencyManager::get(); + geometryCache->useSimpleDrawPipeline(batch); batch.setProjectionTransform(mat4()); - batch.setModelTransform(mat4()); + batch.setModelTransform(Transform()); + batch.setViewTransform(Transform()); batch._glBindTexture(GL_TEXTURE_2D, _uiTexture); + geometryCache->renderUnitQuad(batch, glm::vec4(1)); + renderArgs->_context->syncCache(); renderArgs->_context->render(batch); } @@ -114,31 +137,34 @@ void ApplicationOverlay::renderQmlUi(RenderArgs* renderArgs) { void ApplicationOverlay::renderOverlays(RenderArgs* renderArgs) { PROFILE_RANGE(__FUNCTION__); - glm::vec2 size = qApp->getCanvasSize(); - mat4 legacyProjection = glm::ortho(0, size.x, size.y, 0, ORTHO_NEAR_CLIP, ORTHO_FAR_CLIP); - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadMatrixf(glm::value_ptr(legacyProjection)); - glMatrixMode(GL_MODELVIEW); - - glDisable(GL_DEPTH_TEST); - glDisable(GL_LIGHTING); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glUseProgram(0); - - // give external parties a change to hook in - emit qApp->renderingOverlay(); - qApp->getOverlays().renderHUD(renderArgs); - - DependencyManager::get()->render(renderArgs, _overlayFramebuffer->size().width(), _overlayFramebuffer->size().height()); - - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - - fboViewport(_overlayFramebuffer); + gpu::Batch batch; + auto geometryCache = DependencyManager::get(); + geometryCache->useSimpleDrawPipeline(batch); + auto textureCache = DependencyManager::get(); + batch.setResourceTexture(0, textureCache->getWhiteTexture()); + int width = renderArgs->_viewport.z; + int height = renderArgs->_viewport.w; + mat4 legacyProjection = glm::ortho(0, width, height, 0, -1000, 1000); + batch.setProjectionTransform(legacyProjection); + batch.setModelTransform(Transform()); + batch.setViewTransform(Transform()); + batch._glLineWidth(1.0f); // default + + { + // Render all of the Script based "HUD" aka 2D overlays. + // note: we call them HUD, as opposed to 2D, only because there are some cases of 3D HUD overlays, like the + // cameral controls for the edit.js + qApp->getOverlays().renderHUD(renderArgs); + + // Render the audio scope + int width = _overlayFramebuffer ? _overlayFramebuffer->getWidth() : 0; + int height = _overlayFramebuffer ? _overlayFramebuffer->getHeight() : 0; + DependencyManager::get()->render(renderArgs, width, height); + } + + renderArgs->_context->syncCache(); + renderArgs->_context->render(batch); } void ApplicationOverlay::renderRearViewToFbo(RenderArgs* renderArgs) { @@ -202,32 +228,86 @@ void ApplicationOverlay::renderDomainConnectionStatusBorder(RenderArgs* renderAr } } -GLuint ApplicationOverlay::getOverlayTexture() { - if (!_overlayFramebuffer) { - return 0; - } - return _overlayFramebuffer->texture(); -} - void ApplicationOverlay::buildFramebufferObject() { PROFILE_RANGE(__FUNCTION__); - QSize fboSize = qApp->getDeviceSize(); - if (_overlayFramebuffer && fboSize == _overlayFramebuffer->size()) { + + QSize desiredSize = qApp->getDeviceSize(); + int currentWidth = _overlayFramebuffer ? _overlayFramebuffer->getWidth() : 0; + int currentHeight = _overlayFramebuffer ? _overlayFramebuffer->getHeight() : 0; + QSize frameBufferCurrentSize(currentWidth, currentHeight); + + if (_overlayFramebuffer && desiredSize == frameBufferCurrentSize) { // Already built return; } if (_overlayFramebuffer) { - delete _overlayFramebuffer; + _overlayFramebuffer.reset(); + _overlayDepthTexture.reset(); + _overlayColorTexture.reset(); } + + _overlayFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create()); + + auto colorFormat = gpu::Element(gpu::VEC4, gpu::NUINT8, gpu::RGBA); + auto width = desiredSize.width(); + auto height = desiredSize.height(); + + auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_POINT); + _overlayColorTexture = gpu::TexturePointer(gpu::Texture::create2D(colorFormat, width, height, defaultSampler)); + _overlayFramebuffer->setRenderBuffer(0, _overlayColorTexture); + + + auto depthFormat = gpu::Element(gpu::SCALAR, gpu::FLOAT, gpu::DEPTH); + _overlayDepthTexture = gpu::TexturePointer(gpu::Texture::create2D(depthFormat, width, height, defaultSampler)); + + _overlayFramebuffer->setDepthStencilBuffer(_overlayDepthTexture, depthFormat); + + + /* + // This code essentially created a frame buffer, then sets a bunch of the parameters for that texture. _overlayFramebuffer = new QOpenGLFramebufferObject(fboSize, QOpenGLFramebufferObject::Depth); + + GLfloat borderColor[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; + + gpu::Batch batch; + batch._glBindTexture(GL_TEXTURE_2D, getOverlayTexture()); + batch._glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + batch._glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + batch._glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); + batch._glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); + batch._glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor); + batch._glBindTexture(GL_TEXTURE_2D, 0); + */ + + /* glBindTexture(GL_TEXTURE_2D, getOverlayTexture()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); - GLfloat borderColor[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor); glBindTexture(GL_TEXTURE_2D, 0); + */ + + + + /**** Example code... + batch._glBindTexture(GL_TEXTURE_2D, texture); + batch._glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + batch._glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + + // this stuff is what would actually render from the texture + + geometryCache->useSimpleDrawPipeline(batch); + batch.setViewportTransform(glm::ivec4(0, 0, deviceSize.width(), deviceSize.height())); + batch.setModelTransform(Transform()); + batch.setViewTransform(Transform()); + batch.setProjectionTransform(mat4()); + batch._glBindTexture(GL_TEXTURE_2D, texture); + geometryCache->renderUnitQuad(batch, vec4(vec3(1), _alpha)); + ****/ + } diff --git a/interface/src/ui/ApplicationOverlay.h b/interface/src/ui/ApplicationOverlay.h index 2f434ed7e1..0bbe4e3f77 100644 --- a/interface/src/ui/ApplicationOverlay.h +++ b/interface/src/ui/ApplicationOverlay.h @@ -25,7 +25,8 @@ public: ~ApplicationOverlay(); void renderOverlay(RenderArgs* renderArgs); - GLuint getOverlayTexture(); + + gpu::FramebufferPointer getOverlayFramebuffer() const { return _overlayFramebuffer; } private: void renderStatsAndLogs(RenderArgs* renderArgs); @@ -44,7 +45,11 @@ private: int _magnifierBorder; ivec2 _previousBorderSize{ -1 }; - QOpenGLFramebufferObject* _overlayFramebuffer{ nullptr }; + + gpu::TexturePointer _overlayDepthTexture; + gpu::TexturePointer _overlayColorTexture; + gpu::FramebufferPointer _overlayFramebuffer; + }; #endif // hifi_ApplicationOverlay_h diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index e4401b32ef..8a1aa1014e 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -100,9 +100,24 @@ void Overlays::renderHUD(RenderArgs* renderArgs) { QReadLocker lock(&_lock); gpu::Batch batch; renderArgs->_batch = &batch; - + + auto geometryCache = DependencyManager::get(); + auto textureCache = DependencyManager::get(); + int width = renderArgs->_viewport.z; + int height = renderArgs->_viewport.w; + mat4 legacyProjection = glm::ortho(0, width, height, 0, -1000, 1000); + foreach(Overlay::Pointer thisOverlay, _overlaysHUD) { + + // Reset all batch pipeline settings between overlay + geometryCache->useSimpleDrawPipeline(batch); + batch.setResourceTexture(0, textureCache->getWhiteTexture()); + batch.setProjectionTransform(legacyProjection); + batch.setModelTransform(Transform()); + batch.setViewTransform(Transform()); + batch._glLineWidth(1.0f); // default + thisOverlay->render(renderArgs); } diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 2bf41bc9b3..7cb882acc1 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -433,6 +433,8 @@ void GeometryCache::renderGrid(gpu::Batch& batch, int x, int y, int width, int h } // Draw vertical grid lines for (int i = cols + 1; --i >= 0; ) { + //glVertex2i(tx, y); + //glVertex2i(tx, y + height); *(vertex++) = tx; *(vertex++) = y; From 09430b6596107f9fbdf7dfd76ed6851dcc2411a7 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 16 Jul 2015 16:27:41 -0700 Subject: [PATCH 02/12] hacking on more naked GL --- interface/src/ui/ApplicationOverlay.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index f89867c70d..cfa0390e73 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -90,8 +90,8 @@ void ApplicationOverlay::renderOverlay(RenderArgs* renderArgs) { glm::vec4 color { 0.0f, 0.0f, 0.0f, 0.0f }; float depth = 1.0f; int stencil = 0; - //batch.clearFramebuffer(gpu::Framebuffer::BUFFER_COLORS | gpu::Framebuffer::BUFFER_DEPTH, color, depth, stencil); - batch.clearColorFramebuffer(_overlayFramebuffer->getBufferMask(), glm::vec4(0.0f, 0.0f, 0.0f, 0.0f)); + batch.clearFramebuffer(gpu::Framebuffer::BUFFER_COLORS | gpu::Framebuffer::BUFFER_DEPTH, color, depth, stencil); + //batch.clearColorFramebuffer(_overlayFramebuffer->getBufferMask(), glm::vec4(0.0f, 0.0f, 0.0f, 0.0f)); int width = _overlayFramebuffer ? _overlayFramebuffer->getWidth() : 0; int height = _overlayFramebuffer ? _overlayFramebuffer->getHeight() : 0; From 069620b2d9cdfc7c840dbdae2a4df43b38fb2b8f Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 16 Jul 2015 16:36:48 -0700 Subject: [PATCH 03/12] hacking on more naked GL --- interface/src/ui/ApplicationOverlay.cpp | 23 ++++++++++++++--------- interface/src/ui/overlays/Overlays.cpp | 7 +++---- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index cfa0390e73..4fa6cbcb92 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -80,6 +80,7 @@ void ApplicationOverlay::renderOverlay(RenderArgs* renderArgs) { // Execute the batch into our framebuffer gpu::Batch batch; + renderArgs->_batch = &batch; // 1) bind the framebuffer //_overlayFramebuffer->bind(); @@ -113,13 +114,17 @@ void ApplicationOverlay::renderOverlay(RenderArgs* renderArgs) { //_overlayFramebuffer->release(); // now we're done for later composition batch.setFramebuffer(nullptr); + + renderArgs->_context->syncCache(); + renderArgs->_context->render(batch); + CHECK_GL_ERROR(); } void ApplicationOverlay::renderQmlUi(RenderArgs* renderArgs) { PROFILE_RANGE(__FUNCTION__); if (_uiTexture) { - gpu::Batch batch; + gpu::Batch& batch = *renderArgs->_batch; auto geometryCache = DependencyManager::get(); geometryCache->useSimpleDrawPipeline(batch); @@ -130,15 +135,15 @@ void ApplicationOverlay::renderQmlUi(RenderArgs* renderArgs) { geometryCache->renderUnitQuad(batch, glm::vec4(1)); - renderArgs->_context->syncCache(); - renderArgs->_context->render(batch); + //renderArgs->_context->syncCache(); + //renderArgs->_context->render(batch); } } void ApplicationOverlay::renderOverlays(RenderArgs* renderArgs) { PROFILE_RANGE(__FUNCTION__); - gpu::Batch batch; + gpu::Batch& batch = *renderArgs->_batch; auto geometryCache = DependencyManager::get(); geometryCache->useSimpleDrawPipeline(batch); auto textureCache = DependencyManager::get(); @@ -163,8 +168,8 @@ void ApplicationOverlay::renderOverlays(RenderArgs* renderArgs) { DependencyManager::get()->render(renderArgs, width, height); } - renderArgs->_context->syncCache(); - renderArgs->_context->render(batch); + //renderArgs->_context->syncCache(); + //renderArgs->_context->render(batch); } void ApplicationOverlay::renderRearViewToFbo(RenderArgs* renderArgs) { @@ -208,7 +213,7 @@ void ApplicationOverlay::renderDomainConnectionStatusBorder(RenderArgs* renderAr }); auto nodeList = DependencyManager::get(); if (nodeList && !nodeList->getDomainHandler().isConnected()) { - gpu::Batch batch; + gpu::Batch& batch = *renderArgs->_batch; auto geometryCache = DependencyManager::get(); geometryCache->useSimpleDrawPipeline(batch); batch.setProjectionTransform(mat4()); @@ -223,8 +228,8 @@ void ApplicationOverlay::renderDomainConnectionStatusBorder(RenderArgs* renderAr //batch.setModelTransform(glm::scale(mat4(), vec3(scaleAmount))); geometryCache->renderVertices(batch, gpu::LINE_STRIP, _domainStatusBorder); - renderArgs->_context->syncCache(); - renderArgs->_context->render(batch); + //renderArgs->_context->syncCache(); + //renderArgs->_context->render(batch); } } diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index 8a1aa1014e..343e571bfe 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -98,8 +98,7 @@ void Overlays::cleanupOverlaysToDelete() { void Overlays::renderHUD(RenderArgs* renderArgs) { PROFILE_RANGE(__FUNCTION__); QReadLocker lock(&_lock); - gpu::Batch batch; - renderArgs->_batch = &batch; + gpu::Batch& batch = *renderArgs->_batch; auto geometryCache = DependencyManager::get(); auto textureCache = DependencyManager::get(); @@ -121,8 +120,8 @@ void Overlays::renderHUD(RenderArgs* renderArgs) { thisOverlay->render(renderArgs); } - renderArgs->_context->syncCache(); - renderArgs->_context->render(batch); + //renderArgs->_context->syncCache(); + //renderArgs->_context->render(batch); } unsigned int Overlays::addOverlay(const QString& type, const QScriptValue& properties) { From 410e0a99ad58b8c2d26a8ac10432d42ab5038868 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 16 Jul 2015 16:45:58 -0700 Subject: [PATCH 04/12] hacking on more naked GL --- interface/src/ui/ApplicationOverlay.cpp | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 4fa6cbcb92..f2d00512ae 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -89,7 +89,7 @@ void ApplicationOverlay::renderOverlay(RenderArgs* renderArgs) { // 2) clear it... //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glm::vec4 color { 0.0f, 0.0f, 0.0f, 0.0f }; - float depth = 1.0f; + float depth = 0.0f; int stencil = 0; batch.clearFramebuffer(gpu::Framebuffer::BUFFER_COLORS | gpu::Framebuffer::BUFFER_DEPTH, color, depth, stencil); //batch.clearColorFramebuffer(_overlayFramebuffer->getBufferMask(), glm::vec4(0.0f, 0.0f, 0.0f, 0.0f)); @@ -97,14 +97,8 @@ void ApplicationOverlay::renderOverlay(RenderArgs* renderArgs) { int width = _overlayFramebuffer ? _overlayFramebuffer->getWidth() : 0; int height = _overlayFramebuffer ? _overlayFramebuffer->getHeight() : 0; - glViewport(0, 0, width, height); - - qDebug() << "ApplicationOverlay::renderOverlay()... "; - qDebug() << " renderArgs->batch:" << (void*)renderArgs->_batch; - qDebug() << " renderArgs->_viewport:" << renderArgs->_viewport.z << "," << renderArgs->_viewport.w; - qDebug() << " getDeviceSize:" << qApp->getDeviceSize(); - qDebug() << " getCanvasSize:" << qApp->getCanvasSize(); - qDebug() << " _overlayFramebuffer size:" << width << "," << height; + //glViewport(0, 0, width, height); + batch.setViewportTransform(glm::ivec4(0, 0, width, height)); // Now render the overlay components together into a single texture renderOverlays(renderArgs); // renders Scripts Overlay and AudioScope @@ -113,7 +107,7 @@ void ApplicationOverlay::renderOverlay(RenderArgs* renderArgs) { renderQmlUi(renderArgs); // renders a unit quad with the QML UI texture //_overlayFramebuffer->release(); // now we're done for later composition - batch.setFramebuffer(nullptr); + //batch.setFramebuffer(nullptr); renderArgs->_context->syncCache(); renderArgs->_context->render(batch); From 33464dfd6c5d27fdb22959da619c5c3caedadef3 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 17 Jul 2015 11:35:42 -0700 Subject: [PATCH 05/12] cleanup dead code --- interface/src/ui/ApplicationCompositor.cpp | 4 +- interface/src/ui/ApplicationOverlay.cpp | 81 +++++----------------- 2 files changed, 19 insertions(+), 66 deletions(-) diff --git a/interface/src/ui/ApplicationCompositor.cpp b/interface/src/ui/ApplicationCompositor.cpp index 56735111c1..d98ddf7d5a 100644 --- a/interface/src/ui/ApplicationCompositor.cpp +++ b/interface/src/ui/ApplicationCompositor.cpp @@ -210,10 +210,12 @@ void ApplicationCompositor::displayOverlayTexture(RenderArgs* renderArgs) { batch.setModelTransform(Transform()); batch.setViewTransform(Transform()); batch.setProjectionTransform(mat4()); + + // FIXME - Is this the proper technique for selecting the source 2D texture used by the renderUnitQuad??? + // And, how do we make sure we're getting the right blend/resampler? //batch._glBindTexture(GL_TEXTURE_2D, texture); //batch._glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); //batch._glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - batch.setResourceTexture(0, overlayFramebuffer->getRenderBuffer(0)); geometryCache->renderUnitQuad(batch, vec4(vec3(1), _alpha)); diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index f2d00512ae..ea18867844 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -76,14 +76,16 @@ void ApplicationOverlay::renderOverlay(RenderArgs* renderArgs) { AvatarInputs::getInstance()->update(); buildFramebufferObject(); + + if (!_overlayFramebuffer) { + return; // we can't do anything without our frame buffer. + } // Execute the batch into our framebuffer - gpu::Batch batch; renderArgs->_batch = &batch; // 1) bind the framebuffer - //_overlayFramebuffer->bind(); batch.setFramebuffer(_overlayFramebuffer); // 2) clear it... @@ -94,10 +96,9 @@ void ApplicationOverlay::renderOverlay(RenderArgs* renderArgs) { batch.clearFramebuffer(gpu::Framebuffer::BUFFER_COLORS | gpu::Framebuffer::BUFFER_DEPTH, color, depth, stencil); //batch.clearColorFramebuffer(_overlayFramebuffer->getBufferMask(), glm::vec4(0.0f, 0.0f, 0.0f, 0.0f)); - int width = _overlayFramebuffer ? _overlayFramebuffer->getWidth() : 0; - int height = _overlayFramebuffer ? _overlayFramebuffer->getHeight() : 0; + int width = _overlayFramebuffer->getWidth(); + int height = _overlayFramebuffer->getHeight(); - //glViewport(0, 0, width, height); batch.setViewportTransform(glm::ivec4(0, 0, width, height)); // Now render the overlay components together into a single texture @@ -106,12 +107,11 @@ void ApplicationOverlay::renderOverlay(RenderArgs* renderArgs) { renderDomainConnectionStatusBorder(renderArgs); // renders the connected domain line renderQmlUi(renderArgs); // renders a unit quad with the QML UI texture - //_overlayFramebuffer->release(); // now we're done for later composition - //batch.setFramebuffer(nullptr); - renderArgs->_context->syncCache(); renderArgs->_context->render(batch); + renderArgs->_batch = nullptr; // so future users of renderArgs don't try to use our batch + CHECK_GL_ERROR(); } @@ -128,9 +128,6 @@ void ApplicationOverlay::renderQmlUi(RenderArgs* renderArgs) { batch._glBindTexture(GL_TEXTURE_2D, _uiTexture); geometryCache->renderUnitQuad(batch, glm::vec4(1)); - - //renderArgs->_context->syncCache(); - //renderArgs->_context->render(batch); } } @@ -161,9 +158,6 @@ void ApplicationOverlay::renderOverlays(RenderArgs* renderArgs) { int height = _overlayFramebuffer ? _overlayFramebuffer->getHeight() : 0; DependencyManager::get()->render(renderArgs, width, height); } - - //renderArgs->_context->syncCache(); - //renderArgs->_context->render(batch); } void ApplicationOverlay::renderRearViewToFbo(RenderArgs* renderArgs) { @@ -222,8 +216,6 @@ void ApplicationOverlay::renderDomainConnectionStatusBorder(RenderArgs* renderAr //batch.setModelTransform(glm::scale(mat4(), vec3(scaleAmount))); geometryCache->renderVertices(batch, gpu::LINE_STRIP, _domainStatusBorder); - //renderArgs->_context->syncCache(); - //renderArgs->_context->render(batch); } } @@ -252,61 +244,20 @@ void ApplicationOverlay::buildFramebufferObject() { auto width = desiredSize.width(); auto height = desiredSize.height(); + // NOTE: I need to make sure this gpu::Sampler is using these values... + // + // glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + // glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + // glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); + // glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); + // glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor); + auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_POINT); _overlayColorTexture = gpu::TexturePointer(gpu::Texture::create2D(colorFormat, width, height, defaultSampler)); _overlayFramebuffer->setRenderBuffer(0, _overlayColorTexture); - auto depthFormat = gpu::Element(gpu::SCALAR, gpu::FLOAT, gpu::DEPTH); _overlayDepthTexture = gpu::TexturePointer(gpu::Texture::create2D(depthFormat, width, height, defaultSampler)); _overlayFramebuffer->setDepthStencilBuffer(_overlayDepthTexture, depthFormat); - - - /* - - // This code essentially created a frame buffer, then sets a bunch of the parameters for that texture. - _overlayFramebuffer = new QOpenGLFramebufferObject(fboSize, QOpenGLFramebufferObject::Depth); - - GLfloat borderColor[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; - - gpu::Batch batch; - batch._glBindTexture(GL_TEXTURE_2D, getOverlayTexture()); - batch._glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - batch._glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - batch._glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); - batch._glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); - batch._glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor); - batch._glBindTexture(GL_TEXTURE_2D, 0); - */ - - /* - glBindTexture(GL_TEXTURE_2D, getOverlayTexture()); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); - glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor); - glBindTexture(GL_TEXTURE_2D, 0); - */ - - - - /**** Example code... - batch._glBindTexture(GL_TEXTURE_2D, texture); - batch._glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - batch._glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - - - // this stuff is what would actually render from the texture - - geometryCache->useSimpleDrawPipeline(batch); - batch.setViewportTransform(glm::ivec4(0, 0, deviceSize.width(), deviceSize.height())); - batch.setModelTransform(Transform()); - batch.setViewTransform(Transform()); - batch.setProjectionTransform(mat4()); - batch._glBindTexture(GL_TEXTURE_2D, texture); - geometryCache->renderUnitQuad(batch, vec4(vec3(1), _alpha)); - ****/ - } From 4dadf60724c57bc60b411fcd23569da8edf55779 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 17 Jul 2015 12:50:20 -0700 Subject: [PATCH 06/12] some tweaks from Sam --- interface/src/ui/ApplicationOverlay.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index ea18867844..5d0e8cfa05 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -91,7 +91,7 @@ void ApplicationOverlay::renderOverlay(RenderArgs* renderArgs) { // 2) clear it... //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glm::vec4 color { 0.0f, 0.0f, 0.0f, 0.0f }; - float depth = 0.0f; + float depth = 1.0f; int stencil = 0; batch.clearFramebuffer(gpu::Framebuffer::BUFFER_COLORS | gpu::Framebuffer::BUFFER_DEPTH, color, depth, stencil); //batch.clearColorFramebuffer(_overlayFramebuffer->getBufferMask(), glm::vec4(0.0f, 0.0f, 0.0f, 0.0f)); @@ -252,7 +252,7 @@ void ApplicationOverlay::buildFramebufferObject() { // glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); // glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor); - auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_POINT); + auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR); _overlayColorTexture = gpu::TexturePointer(gpu::Texture::create2D(colorFormat, width, height, defaultSampler)); _overlayFramebuffer->setRenderBuffer(0, _overlayColorTexture); From ccd2f98a76db96ffd53e02786ad80e181efec0fa Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 17 Jul 2015 15:28:25 -0700 Subject: [PATCH 07/12] one more try --- interface/src/ui/ApplicationOverlay.cpp | 13 ++++++------- libraries/gpu/src/gpu/GLBackend.cpp | 2 +- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 5d0e8cfa05..2cf7c508ec 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -85,6 +85,11 @@ void ApplicationOverlay::renderOverlay(RenderArgs* renderArgs) { gpu::Batch batch; renderArgs->_batch = &batch; + int width = _overlayFramebuffer->getWidth(); + int height = _overlayFramebuffer->getHeight(); + + batch.setViewportTransform(glm::ivec4(0, 0, width, height)); + // 1) bind the framebuffer batch.setFramebuffer(_overlayFramebuffer); @@ -93,13 +98,7 @@ void ApplicationOverlay::renderOverlay(RenderArgs* renderArgs) { glm::vec4 color { 0.0f, 0.0f, 0.0f, 0.0f }; float depth = 1.0f; int stencil = 0; - batch.clearFramebuffer(gpu::Framebuffer::BUFFER_COLORS | gpu::Framebuffer::BUFFER_DEPTH, color, depth, stencil); - //batch.clearColorFramebuffer(_overlayFramebuffer->getBufferMask(), glm::vec4(0.0f, 0.0f, 0.0f, 0.0f)); - - int width = _overlayFramebuffer->getWidth(); - int height = _overlayFramebuffer->getHeight(); - - batch.setViewportTransform(glm::ivec4(0, 0, width, height)); + batch.clearFramebuffer(gpu::Framebuffer::BUFFER_COLOR0 | gpu::Framebuffer::BUFFER_DEPTH, color, depth, stencil); // Now render the overlay components together into a single texture renderOverlays(renderArgs); // renders Scripts Overlay and AudioScope diff --git a/libraries/gpu/src/gpu/GLBackend.cpp b/libraries/gpu/src/gpu/GLBackend.cpp index adbef7cb31..b14f9afc97 100644 --- a/libraries/gpu/src/gpu/GLBackend.cpp +++ b/libraries/gpu/src/gpu/GLBackend.cpp @@ -227,7 +227,7 @@ void GLBackend::do_clearFramebuffer(Batch& batch, uint32 paramOffset) { int stencil = batch._params[paramOffset + 0]._float; GLuint glmask = 0; - if (masks & Framebuffer::BUFFER_DEPTH) { + if (masks & Framebuffer::BUFFER_STENCIL) { glClearStencil(stencil); glmask |= GL_STENCIL_BUFFER_BIT; } From 03a44a1c80cf7e816201f02944d3a585dd3b295e Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 17 Jul 2015 15:45:42 -0700 Subject: [PATCH 08/12] fix retina --- interface/src/Application.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index d815329602..b3270332f4 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -898,8 +898,8 @@ void Application::paintGL() { // NOTE: the ApplicationOverlay class assumes it's viewport is setup to be the device size // There is no batch associated with this renderArgs - QSize size = qApp->getDeviceSize(); - renderArgs._viewport = glm::ivec4(0, 0, size.width(), size.height()); + glm::vec2 size = getCanvasSize(); + renderArgs._viewport = glm::ivec4(0, 0, size.x, size.y); _applicationOverlay.renderOverlay(&renderArgs); } From c20c6e4b90081b4b36310e830fcb3789678ce2af Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 17 Jul 2015 16:01:32 -0700 Subject: [PATCH 09/12] fix retina in an Austin approved manner --- interface/src/Application.cpp | 5 +---- interface/src/ui/overlays/Overlays.cpp | 6 ++++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b3270332f4..002ba68a86 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -896,10 +896,7 @@ void Application::paintGL() { { PerformanceTimer perfTimer("renderOverlay"); - // NOTE: the ApplicationOverlay class assumes it's viewport is setup to be the device size - // There is no batch associated with this renderArgs - glm::vec2 size = getCanvasSize(); - renderArgs._viewport = glm::ivec4(0, 0, size.x, size.y); + // NOTE: There is no batch associated with this renderArgs _applicationOverlay.renderOverlay(&renderArgs); } diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index 343e571bfe..0d40c60ca4 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -102,8 +102,10 @@ void Overlays::renderHUD(RenderArgs* renderArgs) { auto geometryCache = DependencyManager::get(); auto textureCache = DependencyManager::get(); - int width = renderArgs->_viewport.z; - int height = renderArgs->_viewport.w; + + auto size = qApp->getCanvasSize(); + int width = size.x; + int height = size.y; mat4 legacyProjection = glm::ortho(0, width, height, 0, -1000, 1000); From 8692f51399ca69cbb0302509c14c10359b4b4e82 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 17 Jul 2015 16:15:02 -0700 Subject: [PATCH 10/12] dead code cleanup --- interface/src/Application.cpp | 3 +++ interface/src/ui/ApplicationCompositor.cpp | 12 ------------ interface/src/ui/ApplicationOverlay.cpp | 12 ------------ interface/src/ui/overlays/Overlays.cpp | 3 --- 4 files changed, 3 insertions(+), 27 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 002ba68a86..d36392d61d 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -897,6 +897,9 @@ void Application::paintGL() { PerformanceTimer perfTimer("renderOverlay"); // NOTE: There is no batch associated with this renderArgs + // the ApplicationOverlay class assumes it's viewport is setup to be the device size + QSize size = qApp->getDeviceSize(); + renderArgs._viewport = glm::ivec4(0, 0, size.width(), size.height()); _applicationOverlay.renderOverlay(&renderArgs); } diff --git a/interface/src/ui/ApplicationCompositor.cpp b/interface/src/ui/ApplicationCompositor.cpp index d98ddf7d5a..cd28ca0732 100644 --- a/interface/src/ui/ApplicationCompositor.cpp +++ b/interface/src/ui/ApplicationCompositor.cpp @@ -189,7 +189,6 @@ void ApplicationCompositor::displayOverlayTexture(RenderArgs* renderArgs) { return; } - //GLuint texture = 0; // FIXME -- qApp->getApplicationOverlay().getOverlayTexture(); gpu::FramebufferPointer overlayFramebuffer = qApp->getApplicationOverlay().getOverlayFramebuffer(); if (!overlayFramebuffer) { return; @@ -210,14 +209,7 @@ void ApplicationCompositor::displayOverlayTexture(RenderArgs* renderArgs) { batch.setModelTransform(Transform()); batch.setViewTransform(Transform()); batch.setProjectionTransform(mat4()); - - // FIXME - Is this the proper technique for selecting the source 2D texture used by the renderUnitQuad??? - // And, how do we make sure we're getting the right blend/resampler? - //batch._glBindTexture(GL_TEXTURE_2D, texture); - //batch._glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - //batch._glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); batch.setResourceTexture(0, overlayFramebuffer->getRenderBuffer(0)); - geometryCache->renderUnitQuad(batch, vec4(vec3(1), _alpha)); // Doesn't actually render @@ -264,10 +256,6 @@ void ApplicationCompositor::displayOverlayTextureHmd(RenderArgs* renderArgs, int return; } - //GLuint texture = 0; // FIXME -- qApp->getApplicationOverlay().getOverlayTexture(); - //if (!texture) { - // return; - //} gpu::FramebufferPointer overlayFramebuffer = qApp->getApplicationOverlay().getOverlayFramebuffer(); if (!overlayFramebuffer) { return; diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 2cf7c508ec..afcccc4776 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -89,12 +89,8 @@ void ApplicationOverlay::renderOverlay(RenderArgs* renderArgs) { int height = _overlayFramebuffer->getHeight(); batch.setViewportTransform(glm::ivec4(0, 0, width, height)); - - // 1) bind the framebuffer batch.setFramebuffer(_overlayFramebuffer); - // 2) clear it... - //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glm::vec4 color { 0.0f, 0.0f, 0.0f, 0.0f }; float depth = 1.0f; int stencil = 0; @@ -243,14 +239,6 @@ void ApplicationOverlay::buildFramebufferObject() { auto width = desiredSize.width(); auto height = desiredSize.height(); - // NOTE: I need to make sure this gpu::Sampler is using these values... - // - // glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - // glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - // glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); - // glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); - // glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor); - auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR); _overlayColorTexture = gpu::TexturePointer(gpu::Texture::create2D(colorFormat, width, height, defaultSampler)); _overlayFramebuffer->setRenderBuffer(0, _overlayColorTexture); diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index 0d40c60ca4..e801de4484 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -121,9 +121,6 @@ void Overlays::renderHUD(RenderArgs* renderArgs) { thisOverlay->render(renderArgs); } - - //renderArgs->_context->syncCache(); - //renderArgs->_context->render(batch); } unsigned int Overlays::addOverlay(const QString& type, const QScriptValue& properties) { From 695470b1c1bf7ba7a1ebd7ab0d7812841ab1fd5f Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 17 Jul 2015 16:30:10 -0700 Subject: [PATCH 11/12] fix audio scope --- interface/src/audio/AudioScope.cpp | 7 ++++--- interface/src/ui/ApplicationOverlay.cpp | 9 +++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/interface/src/audio/AudioScope.cpp b/interface/src/audio/AudioScope.cpp index d9ceb82eef..75a5137ca4 100644 --- a/interface/src/audio/AudioScope.cpp +++ b/interface/src/audio/AudioScope.cpp @@ -127,11 +127,14 @@ void AudioScope::render(RenderArgs* renderArgs, int width, int height) { int w = (int)SCOPE_WIDTH; int h = (int)SCOPE_HEIGHT; - gpu::Batch batch; + gpu::Batch& batch = *renderArgs->_batch; auto geometryCache = DependencyManager::get(); geometryCache->useSimpleDrawPipeline(batch); auto textureCache = DependencyManager::get(); batch.setResourceTexture(0, textureCache->getWhiteTexture()); + + // FIXME - do we really need to reset this here? we know that we're called inside of ApplicationOverlay::renderOverlays + // which already set up our batch for us to have these settings mat4 legacyProjection = glm::ortho(0, width, height, 0, -1000, 1000); batch.setProjectionTransform(legacyProjection); batch.setModelTransform(Transform()); @@ -142,8 +145,6 @@ void AudioScope::render(RenderArgs* renderArgs, int width, int height) { renderLineStrip(batch, _inputID, inputColor, x, y, _samplesPerScope, _scopeInputOffset, _scopeInput); renderLineStrip(batch, _outputLeftID, outputLeftColor, x, y, _samplesPerScope, _scopeOutputOffset, _scopeOutputLeft); renderLineStrip(batch, _outputRightD, outputRightColor, x, y, _samplesPerScope, _scopeOutputOffset, _scopeOutputRight); - renderArgs->_context->syncCache(); - renderArgs->_context->render(batch); } void AudioScope::renderLineStrip(gpu::Batch& batch, int id, const glm::vec4& color, int x, int y, int n, int offset, const QByteArray* byteArray) { diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index afcccc4776..f455b1dc62 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -143,15 +143,16 @@ void ApplicationOverlay::renderOverlays(RenderArgs* renderArgs) { batch._glLineWidth(1.0f); // default { + // Render the audio scope + //int width = _overlayFramebuffer ? _overlayFramebuffer->getWidth() : 0; + //int height = _overlayFramebuffer ? _overlayFramebuffer->getHeight() : 0; + DependencyManager::get()->render(renderArgs, width, height); + // Render all of the Script based "HUD" aka 2D overlays. // note: we call them HUD, as opposed to 2D, only because there are some cases of 3D HUD overlays, like the // cameral controls for the edit.js qApp->getOverlays().renderHUD(renderArgs); - // Render the audio scope - int width = _overlayFramebuffer ? _overlayFramebuffer->getWidth() : 0; - int height = _overlayFramebuffer ? _overlayFramebuffer->getHeight() : 0; - DependencyManager::get()->render(renderArgs, width, height); } } From eb989fd7250d690f1c92c821416c230d4f6a696a Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 17 Jul 2015 16:38:05 -0700 Subject: [PATCH 12/12] fix the backround colors for text overlays, pending austins PR to really fix them --- interface/src/ui/overlays/Overlays.cpp | 2 +- interface/src/ui/overlays/TextOverlay.cpp | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index e801de4484..63b87a30ae 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -113,7 +113,7 @@ void Overlays::renderHUD(RenderArgs* renderArgs) { // Reset all batch pipeline settings between overlay geometryCache->useSimpleDrawPipeline(batch); - batch.setResourceTexture(0, textureCache->getWhiteTexture()); + batch.setResourceTexture(0, textureCache->getWhiteTexture()); // FIXME - do we really need to do this?? batch.setProjectionTransform(legacyProjection); batch.setModelTransform(Transform()); batch.setViewTransform(Transform()); diff --git a/interface/src/ui/overlays/TextOverlay.cpp b/interface/src/ui/overlays/TextOverlay.cpp index 3f033d9266..a2f0f13e82 100644 --- a/interface/src/ui/overlays/TextOverlay.cpp +++ b/interface/src/ui/overlays/TextOverlay.cpp @@ -71,6 +71,12 @@ void TextOverlay::render(RenderArgs* args) { return; // do nothing if we're not visible } + if (!args->_batch) { + return; // do nothing if the batch is not valid + } + + gpu::Batch& batch = *args->_batch; + const float MAX_COLOR = 255.0f; xColor backgroundColor = getBackgroundColor(); glm::vec4 quadColor(backgroundColor.red / MAX_COLOR, backgroundColor.green / MAX_COLOR, backgroundColor.blue / MAX_COLOR, @@ -84,7 +90,7 @@ void TextOverlay::render(RenderArgs* args) { glm::vec2 topLeft(left, top); glm::vec2 bottomRight(right, bottom); glBindTexture(GL_TEXTURE_2D, 0); - DependencyManager::get()->renderQuad(topLeft, bottomRight, quadColor); + DependencyManager::get()->renderQuad(batch, topLeft, bottomRight, quadColor); const int leftAdjust = -1; // required to make text render relative to left edge of bounds const int topAdjust = -2; // required to make text render relative to top edge of bounds