From 895a0d7b85272999248ddaf5311759a50d8359db Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Tue, 17 Mar 2015 16:14:35 -0700 Subject: [PATCH 1/3] Correcting frustum usage by the avatar renderer that was causing aspect ratio problem --- interface/src/Application.h | 4 ++++ interface/src/avatar/Avatar.cpp | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/interface/src/Application.h b/interface/src/Application.h index b013692393..a200e56d74 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -174,7 +174,11 @@ public: bool isThrottleRendering() const { return _glWidget->isThrottleRendering(); } Camera* getCamera() { return &_myCamera; } + // Represents the current view frustum of the avatar. ViewFrustum* getViewFrustum() { return &_viewFrustum; } + // Represents the view frustum of the current rendering pass, + // which might be different from the viewFrustum, i.e. shadowmap + // passes, mirror window passes, etc ViewFrustum* getDisplayViewFrustum() { return &_displayViewFrustum; } ViewFrustum* getShadowViewFrustum() { return &_shadowViewFrustum; } const OctreePacketProcessor& getOctreePacketProcessor() const { return _octreeProcessor; } diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 75d77b780a..d2f0f815df 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -338,7 +338,7 @@ void Avatar::render(const glm::vec3& cameraPosition, RenderMode renderMode, bool // simple frustum check float boundingRadius = getBillboardSize(); ViewFrustum* frustum = (renderMode == Avatar::SHADOW_RENDER_MODE) ? - Application::getInstance()->getShadowViewFrustum() : Application::getInstance()->getViewFrustum(); + Application::getInstance()->getShadowViewFrustum() : Application::getInstance()->getDisplayViewFrustum(); if (frustum->sphereInFrustum(getPosition(), boundingRadius) == ViewFrustum::OUTSIDE) { return; } From e6163089114d269e2fa205c9232871761fd3adbb Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Tue, 17 Mar 2015 16:28:44 -0700 Subject: [PATCH 2/3] Adding runtime check to ensure that the correct frustum is fetched during rendering --- interface/src/Application.cpp | 19 +++++++++++++++++++ interface/src/Application.h | 4 ++-- interface/src/ui/overlays/Overlays.cpp | 2 +- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 184d1bf940..24cf06e684 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2795,7 +2795,25 @@ QImage Application::renderAvatarBillboard() { return image; } + +static QThread * activeRenderingThread = nullptr; + +ViewFrustum* Application::getViewFrustum() { + if (QThread::currentThread() == activeRenderingThread) { + qWarning() << "Calling Application::getViewFrustum() from the active rendering thread, did you mean Application::getDisplayViewFrustum()?"; + } + return &_viewFrustum; +} + +ViewFrustum* Application::getDisplayViewFrustum() { + if (QThread::currentThread() != activeRenderingThread) { + qWarning() << "Calling Application::getDisplayViewFrustum() from outside the active rendering thread or outside rendering, did you mean Application::getViewFrustum()?"; + } + return &_displayViewFrustum; +} + void Application::displaySide(Camera& theCamera, bool selfAvatarOnly, RenderArgs::RenderSide renderSide) { + activeRenderingThread = QThread::currentThread(); PROFILE_RANGE(__FUNCTION__); PerformanceTimer perfTimer("display"); PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), "Application::displaySide()"); @@ -3020,6 +3038,7 @@ void Application::displaySide(Camera& theCamera, bool selfAvatarOnly, RenderArgs glClear(GL_DEPTH_BUFFER_BIT); _overlays.renderWorld(true); } + activeRenderingThread = nullptr; } void Application::updateUntranslatedViewMatrix(const glm::vec3& viewMatrixTranslation) { diff --git a/interface/src/Application.h b/interface/src/Application.h index a200e56d74..ae68374fed 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -175,11 +175,11 @@ public: Camera* getCamera() { return &_myCamera; } // Represents the current view frustum of the avatar. - ViewFrustum* getViewFrustum() { return &_viewFrustum; } + ViewFrustum* getViewFrustum(); // Represents the view frustum of the current rendering pass, // which might be different from the viewFrustum, i.e. shadowmap // passes, mirror window passes, etc - ViewFrustum* getDisplayViewFrustum() { return &_displayViewFrustum; } + ViewFrustum* getDisplayViewFrustum(); ViewFrustum* getShadowViewFrustum() { return &_shadowViewFrustum; } const OctreePacketProcessor& getOctreePacketProcessor() const { return _octreeProcessor; } EntityTreeRenderer* getEntities() { return &_entities; } diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index c7b350f100..158deb00ff 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -122,7 +122,7 @@ void Overlays::renderWorld(bool drawFront, RenderArgs::RenderMode renderMode, Re float myAvatarScale = 1.0f; auto lodManager = DependencyManager::get(); - RenderArgs args = { NULL, Application::getInstance()->getViewFrustum(), + RenderArgs args = { NULL, Application::getInstance()->getDisplayViewFrustum(), lodManager->getOctreeSizeScale(), lodManager->getBoundaryLevelAdjust(), renderMode, renderSide, From 1662230289e45fe09ebfa3414c192fd978262eb7 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Tue, 17 Mar 2015 16:44:29 -0700 Subject: [PATCH 3/3] Adding some fixmes to the code, since globals are evil and such checks should be confined to debug mode only --- interface/src/Application.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 24cf06e684..0ed4495034 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2795,11 +2795,12 @@ QImage Application::renderAvatarBillboard() { return image; } - +// FIXME, preprocessor guard this check to occur only in DEBUG builds static QThread * activeRenderingThread = nullptr; ViewFrustum* Application::getViewFrustum() { if (QThread::currentThread() == activeRenderingThread) { + // FIXME, should this be an assert? qWarning() << "Calling Application::getViewFrustum() from the active rendering thread, did you mean Application::getDisplayViewFrustum()?"; } return &_viewFrustum; @@ -2807,6 +2808,7 @@ ViewFrustum* Application::getViewFrustum() { ViewFrustum* Application::getDisplayViewFrustum() { if (QThread::currentThread() != activeRenderingThread) { + // FIXME, should this be an assert? qWarning() << "Calling Application::getDisplayViewFrustum() from outside the active rendering thread or outside rendering, did you mean Application::getViewFrustum()?"; } return &_displayViewFrustum;