From 0cd60782e79c5c7a9784efc324626c1dfacc1bd1 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 14 May 2015 11:00:30 -0700 Subject: [PATCH 01/23] Add error handling to JSConsole --- interface/src/ui/JSConsole.cpp | 5 +++++ interface/src/ui/JSConsole.h | 1 + 2 files changed, 6 insertions(+) diff --git a/interface/src/ui/JSConsole.cpp b/interface/src/ui/JSConsole.cpp index 700781df69..74585df855 100644 --- a/interface/src/ui/JSConsole.cpp +++ b/interface/src/ui/JSConsole.cpp @@ -59,6 +59,7 @@ JSConsole::JSConsole(QWidget* parent, ScriptEngine* scriptEngine) : connect(_scriptEngine, SIGNAL(evaluationFinished(QScriptValue, bool)), this, SLOT(handleEvalutationFinished(QScriptValue, bool))); connect(_scriptEngine, SIGNAL(printedMessage(const QString&)), this, SLOT(handlePrint(const QString&))); + connect(_scriptEngine, SIGNAL(errorMessage(const QString&)), this, SLOT(handleError(const QString&))); resizeTextInput(); } @@ -96,6 +97,10 @@ void JSConsole::handleEvalutationFinished(QScriptValue result, bool isException) appendMessage(gutter, resultStr); } +void JSConsole::handleError(const QString& message) { + appendMessage(GUTTER_ERROR, "" + message.toHtmlEscaped() + ""); +} + void JSConsole::handlePrint(const QString& message) { appendMessage("", message); } diff --git a/interface/src/ui/JSConsole.h b/interface/src/ui/JSConsole.h index daeba8ea15..98afdf7bf8 100644 --- a/interface/src/ui/JSConsole.h +++ b/interface/src/ui/JSConsole.h @@ -49,6 +49,7 @@ protected slots: void resizeTextInput(); void handleEvalutationFinished(QScriptValue result, bool isException); void handlePrint(const QString& message); + void handleError(const QString& message); private: void appendMessage(const QString& gutter, const QString& message); From 4a4c9c75fcf6f6af1b05d7ceb282f589184f5753 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 22 May 2015 09:50:51 -0700 Subject: [PATCH 02/23] Add gpu::context to RenderArgs and start using RenderArgs in place of the flags --- interface/src/Application.cpp | 64 +++++++++++++------ interface/src/Application.h | 6 +- interface/src/devices/OculusManager.cpp | 9 +-- interface/src/devices/OculusManager.h | 4 +- interface/src/devices/TV3DManager.cpp | 9 +-- interface/src/devices/TV3DManager.h | 2 +- interface/src/ui/ApplicationOverlay.cpp | 2 +- interface/src/ui/ApplicationOverlay.h | 2 +- .../src/ui/overlays/LocalModelsOverlay.cpp | 2 +- .../src/EntityTreeRenderer.cpp | 44 ++++++------- .../src/EntityTreeRenderer.h | 4 +- .../src/RenderableBoxEntityItem.cpp | 2 + libraries/gpu/src/gpu/Context.cpp | 15 ++++- libraries/octree/src/OctreeHeadlessViewer.h | 4 +- libraries/octree/src/OctreeRenderer.cpp | 35 +++++----- libraries/octree/src/OctreeRenderer.h | 4 +- libraries/render-utils/src/GlowEffect.cpp | 4 +- libraries/render-utils/src/GlowEffect.h | 6 +- libraries/shared/src/RenderArgs.h | 3 + 19 files changed, 128 insertions(+), 93 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 05fc2fec0a..ae0e611a10 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -116,6 +116,7 @@ #include "devices/TV3DManager.h" #include "gpu/Batch.h" +#include "gpu/Context.h" #include "gpu/GLBackend.h" #include "scripting/AccountScriptingInterface.h" @@ -830,6 +831,15 @@ void Application::initializeUi() { void Application::paintGL() { PROFILE_RANGE(__FUNCTION__); _glWidget->makeCurrent(); + + auto lodManager = DependencyManager::get(); + RenderArgs renderArgs(NULL, Application::getInstance()->getViewFrustum(), + lodManager->getOctreeSizeScale(), + lodManager->getBoundaryLevelAdjust(), + RenderArgs::DEFAULT_RENDER_MODE, RenderArgs::MONO, RenderArgs::RENDER_DEBUG_NONE); + gpu::Context context; + renderArgs._context = &context; + PerformanceTimer perfTimer("paintGL"); //Need accurate frame timing for the oculus rift if (OculusManager::isConnected()) { @@ -843,7 +853,7 @@ void Application::paintGL() { { PerformanceTimer perfTimer("renderOverlay"); - _applicationOverlay.renderOverlay(); + _applicationOverlay.renderOverlay(renderArgs); } glEnable(GL_LINE_SMOOTH); @@ -892,22 +902,25 @@ void Application::paintGL() { loadViewFrustum(_myCamera, _viewFrustum); if (getShadowsEnabled()) { - updateShadowMap(); + renderArgs._renderMode = RenderArgs::SHADOW_RENDER_MODE; + updateShadowMap(renderArgs); } + renderArgs._renderMode = RenderArgs::DEFAULT_RENDER_MODE; + if (OculusManager::isConnected()) { //When in mirror mode, use camera rotation. Otherwise, use body rotation if (_myCamera.getMode() == CAMERA_MODE_MIRROR) { - OculusManager::display(_glWidget, _myCamera.getRotation(), _myCamera.getPosition(), _myCamera); + OculusManager::display(_glWidget, renderArgs, _myCamera.getRotation(), _myCamera.getPosition(), _myCamera); } else { - OculusManager::display(_glWidget, _myAvatar->getWorldAlignedOrientation(), _myAvatar->getDefaultEyePosition(), _myCamera); + OculusManager::display(_glWidget, renderArgs, _myAvatar->getWorldAlignedOrientation(), _myAvatar->getDefaultEyePosition(), _myCamera); } } else if (TV3DManager::isConnected()) { - TV3DManager::display(_myCamera); + TV3DManager::display(renderArgs, _myCamera); } else { - DependencyManager::get()->prepare(); + DependencyManager::get()->prepare(renderArgs); // Viewport is assigned to the size of the framebuffer QSize size = DependencyManager::get()->getFrameBufferSize(); @@ -916,16 +929,16 @@ void Application::paintGL() { glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); - displaySide(_myCamera); + displaySide(renderArgs, _myCamera); glPopMatrix(); if (Menu::getInstance()->isOptionChecked(MenuOption::FullscreenMirror)) { _rearMirrorTools->render(true, _glWidget->mapFromGlobal(QCursor::pos())); } else if (Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) { - renderRearViewMirror(_mirrorViewRect); + renderRearViewMirror(renderArgs, _mirrorViewRect); } - auto finalFbo = DependencyManager::get()->render(); + auto finalFbo = DependencyManager::get()->render(renderArgs); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); glBindFramebuffer(GL_READ_FRAMEBUFFER, gpu::GLBackend::getFramebufferID(finalFbo)); @@ -2879,7 +2892,7 @@ glm::vec3 Application::getSunDirection() { // FIXME, preprocessor guard this check to occur only in DEBUG builds static QThread * activeRenderingThread = nullptr; -void Application::updateShadowMap() { +void Application::updateShadowMap(RenderArgs& renderArgs) { activeRenderingThread = QThread::currentThread(); PerformanceTimer perfTimer("shadowMap"); @@ -3005,7 +3018,7 @@ void Application::updateShadowMap() { { PerformanceTimer perfTimer("entities"); - _entities.render(RenderArgs::SHADOW_RENDER_MODE); + _entities.render(renderArgs); } // render JS/scriptable overlays @@ -3092,7 +3105,13 @@ QImage Application::renderAvatarBillboard() { Glower glower; const int BILLBOARD_SIZE = 64; - renderRearViewMirror(QRect(0, _glWidget->getDeviceHeight() - BILLBOARD_SIZE, + // TODO: Pass a RenderArgs renderAvatarBillboard + auto lodManager = DependencyManager::get(); + RenderArgs renderArgs(NULL, Application::getInstance()->getViewFrustum(), + lodManager->getOctreeSizeScale(), + lodManager->getBoundaryLevelAdjust(), + RenderArgs::DEFAULT_RENDER_MODE, RenderArgs::MONO, RenderArgs::RENDER_DEBUG_NONE); + renderRearViewMirror(renderArgs, QRect(0, _glWidget->getDeviceHeight() - BILLBOARD_SIZE, BILLBOARD_SIZE, BILLBOARD_SIZE), true); @@ -3144,7 +3163,7 @@ const ViewFrustum* Application::getDisplayViewFrustum() const { return &_displayViewFrustum; } -void Application::displaySide(Camera& theCamera, bool selfAvatarOnly, RenderArgs::RenderSide renderSide) { +void Application::displaySide(RenderArgs& renderArgs, Camera& theCamera, bool selfAvatarOnly) { activeRenderingThread = QThread::currentThread(); PROFILE_RANGE(__FUNCTION__); PerformanceTimer perfTimer("display"); @@ -3183,7 +3202,7 @@ void Application::displaySide(Camera& theCamera, bool selfAvatarOnly, RenderArgs if (theCamera.getMode() == CAMERA_MODE_MIRROR) { viewTransform.setScale(Transform::Vec3(-1.0f, 1.0f, 1.0f)); } - if (renderSide != RenderArgs::MONO) { + if (renderArgs._renderSide != RenderArgs::MONO) { glm::mat4 invView = glm::inverse(_untranslatedViewMatrix); viewTransform.evalFromRawMatrix(invView); @@ -3336,7 +3355,9 @@ void Application::displaySide(Camera& theCamera, bool selfAvatarOnly, RenderArgs if (theCamera.getMode() == CAMERA_MODE_MIRROR) { renderMode = RenderArgs::MIRROR_RENDER_MODE; } - _entities.render(renderMode, renderSide, renderDebugFlags); + renderArgs._renderMode = renderMode; + renderArgs._debugFlags = renderDebugFlags; + _entities.render(renderArgs); if (!Menu::getInstance()->isOptionChecked(MenuOption::Wireframe)) { // Restaure polygon mode @@ -3357,8 +3378,8 @@ void Application::displaySide(Camera& theCamera, bool selfAvatarOnly, RenderArgs { PerformanceTimer perfTimer("avatars"); - DependencyManager::get()->renderAvatars(mirrorMode ? RenderArgs::MIRROR_RENDER_MODE : RenderArgs::NORMAL_RENDER_MODE, - false, selfAvatarOnly); + RenderArgs::RenderMode renderMode = mirrorMode ? RenderArgs::MIRROR_RENDER_MODE : RenderArgs::NORMAL_RENDER_MODE; + DependencyManager::get()->renderAvatars(renderMode, false, selfAvatarOnly); } { @@ -3375,8 +3396,9 @@ void Application::displaySide(Camera& theCamera, bool selfAvatarOnly, RenderArgs { PerformanceTimer perfTimer("avatarsPostLighting"); - DependencyManager::get()->renderAvatars(mirrorMode ? RenderArgs::MIRROR_RENDER_MODE : RenderArgs::NORMAL_RENDER_MODE, - true, selfAvatarOnly); + RenderArgs::RenderMode renderMode = mirrorMode ? RenderArgs::MIRROR_RENDER_MODE : RenderArgs::NORMAL_RENDER_MODE; + DependencyManager::get()->renderAvatars(renderMode, true, selfAvatarOnly); + renderArgs._renderMode = RenderArgs::NORMAL_RENDER_MODE; } //Render the sixense lasers @@ -3504,7 +3526,7 @@ glm::vec2 Application::getScaledScreenPoint(glm::vec2 projectedPoint) { return screenPoint; } -void Application::renderRearViewMirror(const QRect& region, bool billboard) { +void Application::renderRearViewMirror(RenderArgs& renderArgs, const QRect& region, bool billboard) { // Grab current viewport to reset it at the end int viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport); @@ -3564,7 +3586,7 @@ void Application::renderRearViewMirror(const QRect& region, bool billboard) { // render rear mirror view glPushMatrix(); - displaySide(_mirrorCamera, true); + displaySide(renderArgs, _mirrorCamera, true); glPopMatrix(); if (!billboard) { diff --git a/interface/src/Application.h b/interface/src/Application.h index 2226c97b99..1d1463e04c 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -270,7 +270,7 @@ public: QImage renderAvatarBillboard(); - void displaySide(Camera& whichCamera, bool selfAvatarOnly = false, RenderArgs::RenderSide renderSide = RenderArgs::MONO); + void displaySide(RenderArgs& renderArgs, Camera& whichCamera, bool selfAvatarOnly = false); /// Stores the current modelview matrix as the untranslated view matrix to use for transforms and the supplied vector as /// the view matrix translation. @@ -499,8 +499,8 @@ private: glm::vec3 getSunDirection(); - void updateShadowMap(); - void renderRearViewMirror(const QRect& region, bool billboard = false); + void updateShadowMap(RenderArgs& renderArgs); + void renderRearViewMirror(RenderArgs& renderArgs, const QRect& region, bool billboard = false); void setMenuShortcutsEnabled(bool enabled); static void attachNewHeadToNode(Node *newNode); diff --git a/interface/src/devices/OculusManager.cpp b/interface/src/devices/OculusManager.cpp index 3ceb2fd079..acb62ab0d1 100644 --- a/interface/src/devices/OculusManager.cpp +++ b/interface/src/devices/OculusManager.cpp @@ -465,7 +465,7 @@ void OculusManager::configureCamera(Camera& camera) { } //Displays everything for the oculus, frame timing must be active -void OculusManager::display(QGLWidget * glCanvas, const glm::quat &bodyOrientation, const glm::vec3 &position, Camera& whichCamera) { +void OculusManager::display(QGLWidget * glCanvas, RenderArgs& renderArgs, const glm::quat &bodyOrientation, const glm::vec3 &position, Camera& whichCamera) { #ifdef DEBUG // Ensure the frame counter always increments by exactly 1 @@ -532,7 +532,7 @@ void OculusManager::display(QGLWidget * glCanvas, const glm::quat &bodyOrientati //Bind our framebuffer object. If we are rendering the glow effect, we let the glow effect shader take care of it if (Menu::getInstance()->isOptionChecked(MenuOption::EnableGlowEffect)) { - DependencyManager::get()->prepare(); + DependencyManager::get()->prepare(renderArgs); } else { auto primaryFBO = DependencyManager::get()->getPrimaryFramebuffer(); glBindFramebuffer(GL_FRAMEBUFFER, gpu::GLBackend::getFramebufferID(primaryFBO)); @@ -613,7 +613,8 @@ void OculusManager::display(QGLWidget * glCanvas, const glm::quat &bodyOrientati glViewport(vp.Pos.x, vp.Pos.y, vp.Size.w, vp.Size.h); - qApp->displaySide(*_camera, false, RenderArgs::MONO); + renderArgs._renderSide = RenderArgs::MONO; + qApp->displaySide(renderArgs, *_camera, false); qApp->getApplicationOverlay().displayOverlayTextureHmd(*_camera); }); _activeEye = ovrEye_Count; @@ -625,7 +626,7 @@ void OculusManager::display(QGLWidget * glCanvas, const glm::quat &bodyOrientati if (Menu::getInstance()->isOptionChecked(MenuOption::EnableGlowEffect)) { //Full texture viewport for glow effect glViewport(0, 0, _renderTargetSize.w, _renderTargetSize.h); - finalFbo = DependencyManager::get()->render(); + finalFbo = DependencyManager::get()->render(renderArgs); } else { finalFbo = DependencyManager::get()->getPrimaryFramebuffer(); glBindFramebuffer(GL_FRAMEBUFFER, 0); diff --git a/interface/src/devices/OculusManager.h b/interface/src/devices/OculusManager.h index a6c3bbf4d5..50cfebaf63 100644 --- a/interface/src/devices/OculusManager.h +++ b/interface/src/devices/OculusManager.h @@ -20,6 +20,8 @@ #include #include +#include "RenderArgs.h" + class Camera; class PalmData; class Text3DOverlay; @@ -61,7 +63,7 @@ public: static void endFrameTiming(); static bool allowSwap(); static void configureCamera(Camera& camera); - static void display(QGLWidget * glCanvas, const glm::quat &bodyOrientation, const glm::vec3 &position, Camera& whichCamera); + static void display(QGLWidget * glCanvas, RenderArgs& renderArgs, const glm::quat &bodyOrientation, const glm::vec3 &position, Camera& whichCamera); static void reset(); /// param \yaw[out] yaw in radians diff --git a/interface/src/devices/TV3DManager.cpp b/interface/src/devices/TV3DManager.cpp index 530b3d30d6..49d5313a2b 100644 --- a/interface/src/devices/TV3DManager.cpp +++ b/interface/src/devices/TV3DManager.cpp @@ -80,7 +80,7 @@ void TV3DManager::configureCamera(Camera& whichCamera, int screenWidth, int scre glLoadIdentity(); } -void TV3DManager::display(Camera& whichCamera) { +void TV3DManager::display(RenderArgs& renderArgs, Camera& whichCamera) { double nearZ = DEFAULT_NEAR_CLIP; // near clipping plane double farZ = DEFAULT_FAR_CLIP; // far clipping plane @@ -93,7 +93,7 @@ void TV3DManager::display(Camera& whichCamera) { int portalH = deviceSize.height(); - DependencyManager::get()->prepare(); + DependencyManager::get()->prepare(renderArgs); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); Camera eyeCamera; @@ -118,7 +118,8 @@ void TV3DManager::display(Camera& whichCamera) { glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - qApp->displaySide(eyeCamera, false, RenderArgs::MONO); + renderArgs._renderSide = RenderArgs::MONO; + qApp->displaySide(renderArgs, eyeCamera, false); qApp->getApplicationOverlay().displayOverlayTextureStereo(whichCamera, _aspect, fov); _activeEye = NULL; }, [&]{ @@ -128,7 +129,7 @@ void TV3DManager::display(Camera& whichCamera) { glPopMatrix(); glDisable(GL_SCISSOR_TEST); - auto finalFbo = DependencyManager::get()->render(); + auto finalFbo = DependencyManager::get()->render(renderArgs); auto fboSize = finalFbo->getSize(); // Get the ACTUAL device size for the BLIT deviceSize = qApp->getDeviceSize(); diff --git a/interface/src/devices/TV3DManager.h b/interface/src/devices/TV3DManager.h index 26a57ae259..e46447517a 100644 --- a/interface/src/devices/TV3DManager.h +++ b/interface/src/devices/TV3DManager.h @@ -33,7 +33,7 @@ public: static void connect(); static bool isConnected(); static void configureCamera(Camera& camera, int screenWidth, int screenHeight); - static void display(Camera& whichCamera); + static void display(RenderArgs& renderArgs, Camera& whichCamera); static void overrideOffAxisFrustum(float& left, float& right, float& bottom, float& top, float& nearVal, float& farVal, glm::vec4& nearClipPlane, glm::vec4& farClipPlane); private: diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index e3f9216c13..1140fade08 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -185,7 +185,7 @@ ApplicationOverlay::~ApplicationOverlay() { } // Renders the overlays either to a texture or to the screen -void ApplicationOverlay::renderOverlay() { +void ApplicationOverlay::renderOverlay(const RenderArgs& renderArgs) { PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), "ApplicationOverlay::displayOverlay()"); Overlays& overlays = qApp->getOverlays(); diff --git a/interface/src/ui/ApplicationOverlay.h b/interface/src/ui/ApplicationOverlay.h index 34beb98682..717e7457aa 100644 --- a/interface/src/ui/ApplicationOverlay.h +++ b/interface/src/ui/ApplicationOverlay.h @@ -32,7 +32,7 @@ public: ApplicationOverlay(); ~ApplicationOverlay(); - void renderOverlay(); + void renderOverlay(const RenderArgs& renderArgs); void displayOverlayTexture(); void displayOverlayTextureStereo(Camera& whichCamera, float aspectRatio, float fov); void displayOverlayTextureHmd(Camera& whichCamera); diff --git a/interface/src/ui/overlays/LocalModelsOverlay.cpp b/interface/src/ui/overlays/LocalModelsOverlay.cpp index e6fae4ff3d..c9bc7315e8 100644 --- a/interface/src/ui/overlays/LocalModelsOverlay.cpp +++ b/interface/src/ui/overlays/LocalModelsOverlay.cpp @@ -47,7 +47,7 @@ void LocalModelsOverlay::render(RenderArgs* args) { Application* app = Application::getInstance(); glm::vec3 oldTranslation = app->getViewMatrixTranslation(); app->setViewMatrixTranslation(oldTranslation + _position); - _entityTreeRenderer->render(); + _entityTreeRenderer->render(*args); Application::getInstance()->setViewMatrixTranslation(oldTranslation); } glPopMatrix(); diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 23160be045..15a587872f 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -474,13 +474,11 @@ void EntityTreeRenderer::applyZonePropertiesToScene(const ZoneEntityItem* zone) } } -void EntityTreeRenderer::render(RenderArgs::RenderMode renderMode, - RenderArgs::RenderSide renderSide, - RenderArgs::DebugFlags renderDebugFlags) { +void EntityTreeRenderer::render(RenderArgs& renderArgs) { if (_tree && !_shuttingDown) { - Model::startScene(renderSide); + Model::startScene(renderArgs._renderSide); - ViewFrustum* frustum = (renderMode == RenderArgs::SHADOW_RENDER_MODE) ? + ViewFrustum* frustum = (renderArgs._renderMode == RenderArgs::SHADOW_RENDER_MODE) ? _viewState->getShadowViewFrustum() : _viewState->getCurrentViewFrustum(); // Setup batch transform matrices @@ -492,44 +490,44 @@ void EntityTreeRenderer::render(RenderArgs::RenderMode renderMode, batch.setProjectionTransform(projMat); batch.setViewTransform(viewMat); - RenderArgs args(this, frustum, getSizeScale(), getBoundaryLevelAdjust(), - renderMode, renderSide, renderDebugFlags, &batch); + renderArgs._renderer = this; + renderArgs._batch = &batch; _tree->lockForRead(); // Whenever you're in an intersection between zones, we will always choose the smallest zone. _bestZone = NULL; _bestZoneVolume = std::numeric_limits::max(); - _tree->recurseTreeWithOperation(renderOperation, &args); + _tree->recurseTreeWithOperation(renderOperation, &renderArgs); applyZonePropertiesToScene(_bestZone); // we must call endScene while we still have the tree locked so that no one deletes a model // on us while rendering the scene - Model::endScene(renderMode, &args); + Model::endScene(renderArgs._renderMode, &renderArgs); _tree->unlock(); glPushMatrix(); - gpu::GLBackend::renderBatch(batch); + renderArgs._context->enqueueBatch(batch); glPopMatrix(); // stats... - _meshesConsidered = args._meshesConsidered; - _meshesRendered = args._meshesRendered; - _meshesOutOfView = args._meshesOutOfView; - _meshesTooSmall = args._meshesTooSmall; + _meshesConsidered = renderArgs._meshesConsidered; + _meshesRendered = renderArgs._meshesRendered; + _meshesOutOfView = renderArgs._meshesOutOfView; + _meshesTooSmall = renderArgs._meshesTooSmall; - _elementsTouched = args._elementsTouched; - _itemsRendered = args._itemsRendered; - _itemsOutOfView = args._itemsOutOfView; - _itemsTooSmall = args._itemsTooSmall; + _elementsTouched = renderArgs._elementsTouched; + _itemsRendered = renderArgs._itemsRendered; + _itemsOutOfView = renderArgs._itemsOutOfView; + _itemsTooSmall = renderArgs._itemsTooSmall; - _materialSwitches = args._materialSwitches; - _trianglesRendered = args._trianglesRendered; - _quadsRendered = args._quadsRendered; + _materialSwitches = renderArgs._materialSwitches; + _trianglesRendered = renderArgs._trianglesRendered; + _quadsRendered = renderArgs._quadsRendered; - _translucentMeshPartsRendered = args._translucentMeshPartsRendered; - _opaqueMeshPartsRendered = args._opaqueMeshPartsRendered; + _translucentMeshPartsRendered = renderArgs._translucentMeshPartsRendered; + _opaqueMeshPartsRendered = renderArgs._opaqueMeshPartsRendered; } deleteReleasedModels(); // seems like as good as any other place to do some memory cleanup } diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.h b/libraries/entities-renderer/src/EntityTreeRenderer.h index c42c628f57..79de554917 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.h +++ b/libraries/entities-renderer/src/EntityTreeRenderer.h @@ -58,9 +58,7 @@ public: void processEraseMessage(const QByteArray& dataByteArray, const SharedNodePointer& sourceNode); virtual void init(); - virtual void render(RenderArgs::RenderMode renderMode = RenderArgs::DEFAULT_RENDER_MODE, - RenderArgs::RenderSide renderSide = RenderArgs::MONO, - RenderArgs::DebugFlags renderDebugFlags = RenderArgs::RENDER_DEBUG_NONE); + virtual void render(RenderArgs& renderArgs) override; virtual const FBXGeometry* getGeometryForEntity(const EntityItem* entityItem); virtual const Model* getModelForEntityItem(const EntityItem* entityItem); diff --git a/libraries/entities-renderer/src/RenderableBoxEntityItem.cpp b/libraries/entities-renderer/src/RenderableBoxEntityItem.cpp index bd44e88d3e..a49f3214b1 100644 --- a/libraries/entities-renderer/src/RenderableBoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableBoxEntityItem.cpp @@ -11,6 +11,7 @@ #include +#include #include #include @@ -44,6 +45,7 @@ void RenderableBoxEntityItem::render(RenderArgs* args) { } else { DependencyManager::get()->renderSolidCube(batch, 1.0f, cubeColor); } + args->_context->enqueueBatch(batch); RenderableDebugableEntityItem::render(this, args); }; diff --git a/libraries/gpu/src/gpu/Context.cpp b/libraries/gpu/src/gpu/Context.cpp index 54387e8f71..f4f398b6d7 100644 --- a/libraries/gpu/src/gpu/Context.cpp +++ b/libraries/gpu/src/gpu/Context.cpp @@ -15,9 +15,22 @@ using namespace gpu; +Context::Context() { +} + +Context::Context(const Context& context) { +} + +Context::~Context() { +} + bool Context::makeProgram(Shader& shader, const Shader::BindingSet& bindings) { if (shader.isProgram()) { return GLBackend::makeProgram(shader, bindings); } return false; -} \ No newline at end of file +} + +void Context::enqueueBatch(Batch& batch) { + GLBackend::renderBatch(batch); +} diff --git a/libraries/octree/src/OctreeHeadlessViewer.h b/libraries/octree/src/OctreeHeadlessViewer.h index 2adb33d3bf..90f7a2e805 100644 --- a/libraries/octree/src/OctreeHeadlessViewer.h +++ b/libraries/octree/src/OctreeHeadlessViewer.h @@ -33,9 +33,7 @@ public: virtual void renderElement(OctreeElement* element, RenderArgs* args) { /* swallow these */ } virtual void init(); - virtual void render(RenderArgs::RenderMode renderMode = RenderArgs::DEFAULT_RENDER_MODE, - RenderArgs::RenderSide renderSide = RenderArgs::MONO, - RenderArgs::DebugFlags renderDebugFlags = RenderArgs::RENDER_DEBUG_NONE) { /* swallow these */ } + virtual void render(RenderArgs& renderArgs) override { /* swallow these */ } void setJurisdictionListener(JurisdictionListener* jurisdictionListener) { _jurisdictionListener = jurisdictionListener; } diff --git a/libraries/octree/src/OctreeRenderer.cpp b/libraries/octree/src/OctreeRenderer.cpp index 946ad3aa1b..f2fc3a16eb 100644 --- a/libraries/octree/src/OctreeRenderer.cpp +++ b/libraries/octree/src/OctreeRenderer.cpp @@ -164,32 +164,29 @@ bool OctreeRenderer::renderOperation(OctreeElement* element, void* extraData) { return false; } -void OctreeRenderer::render(RenderArgs::RenderMode renderMode, - RenderArgs::RenderSide renderSide, - RenderArgs::DebugFlags renderDebugFlags) { - RenderArgs args(this, _viewFrustum, getSizeScale(), getBoundaryLevelAdjust(), - renderMode, renderSide, renderDebugFlags); +void OctreeRenderer::render(RenderArgs& renderArgs) { if (_tree) { + renderArgs._renderer = this; _tree->lockForRead(); - _tree->recurseTreeWithOperation(renderOperation, &args); + _tree->recurseTreeWithOperation(renderOperation, &renderArgs); _tree->unlock(); } - _meshesConsidered = args._meshesConsidered; - _meshesRendered = args._meshesRendered; - _meshesOutOfView = args._meshesOutOfView; - _meshesTooSmall = args._meshesTooSmall; + _meshesConsidered = renderArgs._meshesConsidered; + _meshesRendered = renderArgs._meshesRendered; + _meshesOutOfView = renderArgs._meshesOutOfView; + _meshesTooSmall = renderArgs._meshesTooSmall; - _elementsTouched = args._elementsTouched; - _itemsRendered = args._itemsRendered; - _itemsOutOfView = args._itemsOutOfView; - _itemsTooSmall = args._itemsTooSmall; + _elementsTouched = renderArgs._elementsTouched; + _itemsRendered = renderArgs._itemsRendered; + _itemsOutOfView = renderArgs._itemsOutOfView; + _itemsTooSmall = renderArgs._itemsTooSmall; - _materialSwitches = args._materialSwitches; - _trianglesRendered = args._trianglesRendered; - _quadsRendered = args._quadsRendered; + _materialSwitches = renderArgs._materialSwitches; + _trianglesRendered = renderArgs._trianglesRendered; + _quadsRendered = renderArgs._quadsRendered; - _translucentMeshPartsRendered = args._translucentMeshPartsRendered; - _opaqueMeshPartsRendered = args._opaqueMeshPartsRendered; + _translucentMeshPartsRendered = renderArgs._translucentMeshPartsRendered; + _opaqueMeshPartsRendered = renderArgs._opaqueMeshPartsRendered; } diff --git a/libraries/octree/src/OctreeRenderer.h b/libraries/octree/src/OctreeRenderer.h index ca0914723f..63d1889851 100644 --- a/libraries/octree/src/OctreeRenderer.h +++ b/libraries/octree/src/OctreeRenderer.h @@ -51,9 +51,7 @@ public: virtual void init(); /// render the content of the octree - virtual void render(RenderArgs::RenderMode renderMode = RenderArgs::DEFAULT_RENDER_MODE, - RenderArgs::RenderSide renderSide = RenderArgs::MONO, - RenderArgs::DebugFlags renderDebugFlags = RenderArgs::RENDER_DEBUG_NONE); + virtual void render(RenderArgs& renderArgs); ViewFrustum* getViewFrustum() const { return _viewFrustum; } void setViewFrustum(ViewFrustum* viewFrustum) { _viewFrustum = viewFrustum; } diff --git a/libraries/render-utils/src/GlowEffect.cpp b/libraries/render-utils/src/GlowEffect.cpp index 07c2e0e9c6..b7d4389cc4 100644 --- a/libraries/render-utils/src/GlowEffect.cpp +++ b/libraries/render-utils/src/GlowEffect.cpp @@ -94,7 +94,7 @@ void GlowEffect::init(bool enabled) { _enabled = enabled; } -void GlowEffect::prepare() { +void GlowEffect::prepare(const RenderArgs& renderArgs) { auto primaryFBO = DependencyManager::get()->getPrimaryFramebuffer(); GLuint fbo = gpu::GLBackend::getFramebufferID(primaryFBO); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo); @@ -117,7 +117,7 @@ void GlowEffect::end() { glBlendColor(0.0f, 0.0f, 0.0f, _intensity = _intensityStack.pop()); } -gpu::FramebufferPointer GlowEffect::render() { +gpu::FramebufferPointer GlowEffect::render(const RenderArgs& renderArgs) { PerformanceTimer perfTimer("glowEffect"); auto textureCache = DependencyManager::get(); diff --git a/libraries/render-utils/src/GlowEffect.h b/libraries/render-utils/src/GlowEffect.h index 73c512ecf5..16ca810fda 100644 --- a/libraries/render-utils/src/GlowEffect.h +++ b/libraries/render-utils/src/GlowEffect.h @@ -15,6 +15,8 @@ #include #include +#include "RenderArgs.h" + #include #include #include @@ -37,7 +39,7 @@ public: void init(bool enabled); /// Prepares the glow effect for rendering the current frame. To be called before rendering the scene. - void prepare(); + void prepare(const RenderArgs& renderArgs); /// Starts using the glow effect. /// \param intensity the desired glow intensity, from zero to one @@ -52,7 +54,7 @@ public: /// Renders the glow effect. To be called after rendering the scene. /// \param toTexture whether to render to a texture, rather than to the frame buffer /// \return the framebuffer object to which we rendered, or NULL if to the frame buffer - gpu::FramebufferPointer render(); + gpu::FramebufferPointer render(const RenderArgs& renderArgs); public slots: void toggleGlowEffect(bool enabled); diff --git a/libraries/shared/src/RenderArgs.h b/libraries/shared/src/RenderArgs.h index d322cd63ae..ebb9214b85 100644 --- a/libraries/shared/src/RenderArgs.h +++ b/libraries/shared/src/RenderArgs.h @@ -16,6 +16,7 @@ class ViewFrustum; class OctreeRenderer; namespace gpu { class Batch; +class Context; } class RenderArgs { @@ -38,6 +39,7 @@ public: RenderSide renderSide = MONO, DebugFlags debugFlags = RENDER_DEBUG_NONE, gpu::Batch* batch = nullptr, + gpu::Context* context = nullptr, int elementsTouched = 0, int itemsRendered = 0, @@ -90,6 +92,7 @@ public: RenderSide _renderSide; DebugFlags _debugFlags; gpu::Batch* _batch; + gpu::Context* _context; int _elementsTouched; int _itemsRendered; From c6ce5e7680a629190aa3a2a4e4782e868f62bf07 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 22 May 2015 18:54:40 +0200 Subject: [PATCH 03/23] PerformanceTimer deactivated when not in use --- interface/src/ui/ApplicationOverlay.cpp | 8 ++++ interface/src/ui/Stats.cpp | 9 +++-- interface/src/ui/Stats.h | 2 + libraries/shared/src/PerfStat.cpp | 49 ++++++++++++++++++------- libraries/shared/src/PerfStat.h | 6 ++- 5 files changed, 55 insertions(+), 19 deletions(-) diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index e3f9216c13..c65de2afb0 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -979,6 +979,14 @@ void ApplicationOverlay::renderStatsAndLogs() { glLineWidth(1.0f); glPointSize(1.0f); + // Determine whether to compute timing details + bool shouldDisplayTimingDetail = Menu::getInstance()->isOptionChecked(MenuOption::DisplayDebugTimingDetails) && + Menu::getInstance()->isOptionChecked(MenuOption::Stats) && + Stats::getInstance()->isExpanded(); + if (shouldDisplayTimingDetail != PerformanceTimer::isActive()) { + PerformanceTimer::setActive(shouldDisplayTimingDetail); + } + if (Menu::getInstance()->isOptionChecked(MenuOption::Stats)) { // let's set horizontal offset to give stats some margin to mirror int horizontalOffset = MIRROR_VIEW_WIDTH + MIRROR_VIEW_LEFT_PADDING * 2; diff --git a/interface/src/ui/Stats.cpp b/interface/src/ui/Stats.cpp index 161eb06f5f..c49208c835 100644 --- a/interface/src/ui/Stats.cpp +++ b/interface/src/ui/Stats.cpp @@ -224,9 +224,10 @@ void Stats::display( lines = 5; int columnOneWidth = _generalStatsWidth; - PerformanceTimer::tallyAllTimerRecords(); // do this even if we're not displaying them, so they don't stack up - - if (_expanded && Menu::getInstance()->isOptionChecked(MenuOption::DisplayDebugTimingDetails)) { + bool performanceTimerIsActive = PerformanceTimer::isActive(); + bool displayPerf = _expanded && Menu::getInstance()->isOptionChecked(MenuOption::DisplayDebugTimingDetails); + if (displayPerf && performanceTimerIsActive) { + PerformanceTimer::tallyAllTimerRecords(); // do this even if we're not displaying them, so they don't stack up columnOneWidth = _generalStatsWidth + _pingStatsWidth + _geoStatsWidth; // 3 columns wide... // we will also include room for 1 line per timing record and a header of 4 lines @@ -276,7 +277,7 @@ void Stats::display( // TODO: the display of these timing details should all be moved to JavaScript - if (_expanded && Menu::getInstance()->isOptionChecked(MenuOption::DisplayDebugTimingDetails)) { + if (displayPerf && performanceTimerIsActive) { bool onlyDisplayTopTen = Menu::getInstance()->isOptionChecked(MenuOption::OnlyDisplayTopTen); // Timing details... verticalOffset += STATS_PELS_PER_LINE * 4; // skip 3 lines to be under the other columns diff --git a/interface/src/ui/Stats.h b/interface/src/ui/Stats.h index 406496d858..00c1650b71 100644 --- a/interface/src/ui/Stats.h +++ b/interface/src/ui/Stats.h @@ -27,6 +27,8 @@ public: static void drawBackground(unsigned int rgba, int x, int y, int width, int height); void toggleExpanded(); + bool isExpanded() { return _expanded; } + void checkClick(int mouseX, int mouseY, int mouseDragStartedX, int mouseDragStartedY, int horizontalOffset); void resetWidth(int width, int horizontalOffset); void display(const float* color, int horizontalOffset, float fps, int inPacketsPerSecond, int outPacketsPerSecond, diff --git a/libraries/shared/src/PerfStat.cpp b/libraries/shared/src/PerfStat.cpp index 286d257d1f..22cf000c24 100644 --- a/libraries/shared/src/PerfStat.cpp +++ b/libraries/shared/src/PerfStat.cpp @@ -79,29 +79,50 @@ void PerformanceTimerRecord::tallyResult(const quint64& now) { // PerformanceTimer // ---------------------------------------------------------------------------- +std::atomic PerformanceTimer::_isActive(false); QHash PerformanceTimer::_fullNames; QMap PerformanceTimer::_records; -PerformanceTimer::PerformanceTimer(const QString& name) : - _start(0), - _name(name) -{ - QString& fullName = _fullNames[QThread::currentThread()]; - fullName.append("/"); - fullName.append(_name); - _start = usecTimestampNow(); +PerformanceTimer::PerformanceTimer(const QString& name) { + if (_isActive) { + _name = name; + QString& fullName = _fullNames[QThread::currentThread()]; + fullName.append("/"); + fullName.append(_name); + _start = usecTimestampNow(); + } } PerformanceTimer::~PerformanceTimer() { - quint64 elapsedusec = (usecTimestampNow() - _start); - QString& fullName = _fullNames[QThread::currentThread()]; - PerformanceTimerRecord& namedRecord = _records[fullName]; - namedRecord.accumulateResult(elapsedusec); - fullName.resize(fullName.size() - (_name.size() + 1)); + if (_isActive && _start != 0) { + quint64 elapsedusec = (usecTimestampNow() - _start); + QString& fullName = _fullNames[QThread::currentThread()]; + PerformanceTimerRecord& namedRecord = _records[fullName]; + namedRecord.accumulateResult(elapsedusec); + fullName.resize(fullName.size() - (_name.size() + 1)); + } } -// static +// static +bool PerformanceTimer::PerformanceTimer::isActive() { + return _isActive; +} + +// static +void PerformanceTimer::setActive(bool active) { + if (active != _isActive) { + _isActive.store(active); + if (!active) { + _fullNames.clear(); + _records.clear(); + } + + qDebug() << "PerformanceTimer has been turned" << ((active) ? "on" : "off"); + } +} + +// static void PerformanceTimer::tallyAllTimerRecords() { QMap::iterator recordsItr = _records.begin(); QMap::const_iterator recordsEnd = _records.end(); diff --git a/libraries/shared/src/PerfStat.h b/libraries/shared/src/PerfStat.h index 81731abfa9..2d5a54db38 100644 --- a/libraries/shared/src/PerfStat.h +++ b/libraries/shared/src/PerfStat.h @@ -76,14 +76,18 @@ public: PerformanceTimer(const QString& name); ~PerformanceTimer(); + static bool isActive(); + static void setActive(bool active); + static const PerformanceTimerRecord& getTimerRecord(const QString& name) { return _records[name]; }; static const QMap& getAllTimerRecords() { return _records; }; static void tallyAllTimerRecords(); static void dumpAllTimerRecords(); private: - quint64 _start; + quint64 _start = 0; QString _name; + static std::atomic _isActive; static QHash _fullNames; static QMap _records; }; From 6fd474a1a31cf9bc8539626f01b5db2a16d17f2c Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 22 May 2015 09:56:21 -0700 Subject: [PATCH 04/23] Fix comment --- interface/src/Application.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index ae0e611a10..cb5d68c9d7 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3105,7 +3105,7 @@ QImage Application::renderAvatarBillboard() { Glower glower; const int BILLBOARD_SIZE = 64; - // TODO: Pass a RenderArgs renderAvatarBillboard + // TODO: Pass a RenderArgs to renderAvatarBillboard auto lodManager = DependencyManager::get(); RenderArgs renderArgs(NULL, Application::getInstance()->getViewFrustum(), lodManager->getOctreeSizeScale(), From 5ac02f66cafc5c1348e61cba43255e4591243fcd Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 22 May 2015 09:58:20 -0700 Subject: [PATCH 05/23] Remove const from ApplicationOverlay::renderOverlay --- interface/src/ui/ApplicationOverlay.cpp | 2 +- interface/src/ui/ApplicationOverlay.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 1140fade08..56937684af 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -185,7 +185,7 @@ ApplicationOverlay::~ApplicationOverlay() { } // Renders the overlays either to a texture or to the screen -void ApplicationOverlay::renderOverlay(const RenderArgs& renderArgs) { +void ApplicationOverlay::renderOverlay(RenderArgs& renderArgs) { PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), "ApplicationOverlay::displayOverlay()"); Overlays& overlays = qApp->getOverlays(); diff --git a/interface/src/ui/ApplicationOverlay.h b/interface/src/ui/ApplicationOverlay.h index 717e7457aa..33b35d1f91 100644 --- a/interface/src/ui/ApplicationOverlay.h +++ b/interface/src/ui/ApplicationOverlay.h @@ -32,7 +32,7 @@ public: ApplicationOverlay(); ~ApplicationOverlay(); - void renderOverlay(const RenderArgs& renderArgs); + void renderOverlay(RenderArgs& renderArgs); void displayOverlayTexture(); void displayOverlayTextureStereo(Camera& whichCamera, float aspectRatio, float fov); void displayOverlayTextureHmd(Camera& whichCamera); From 66dc555ba9c1601317906335f5ebe9e6b11372d8 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 22 May 2015 09:59:34 -0700 Subject: [PATCH 06/23] Remove context->enqueueBatch from RenderableBoxEntityItem --- libraries/entities-renderer/src/RenderableBoxEntityItem.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableBoxEntityItem.cpp b/libraries/entities-renderer/src/RenderableBoxEntityItem.cpp index a49f3214b1..bd44e88d3e 100644 --- a/libraries/entities-renderer/src/RenderableBoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableBoxEntityItem.cpp @@ -11,7 +11,6 @@ #include -#include #include #include @@ -45,7 +44,6 @@ void RenderableBoxEntityItem::render(RenderArgs* args) { } else { DependencyManager::get()->renderSolidCube(batch, 1.0f, cubeColor); } - args->_context->enqueueBatch(batch); RenderableDebugableEntityItem::render(this, args); }; From 491861c1dbf38624ca52431cb866e825efb320b3 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 22 May 2015 10:02:06 -0700 Subject: [PATCH 07/23] Remove constness from GlowEffect RenderArgs params --- libraries/render-utils/src/GlowEffect.cpp | 4 ++-- libraries/render-utils/src/GlowEffect.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/render-utils/src/GlowEffect.cpp b/libraries/render-utils/src/GlowEffect.cpp index b7d4389cc4..bd0dfa0b5d 100644 --- a/libraries/render-utils/src/GlowEffect.cpp +++ b/libraries/render-utils/src/GlowEffect.cpp @@ -94,7 +94,7 @@ void GlowEffect::init(bool enabled) { _enabled = enabled; } -void GlowEffect::prepare(const RenderArgs& renderArgs) { +void GlowEffect::prepare(RenderArgs& renderArgs) { auto primaryFBO = DependencyManager::get()->getPrimaryFramebuffer(); GLuint fbo = gpu::GLBackend::getFramebufferID(primaryFBO); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo); @@ -117,7 +117,7 @@ void GlowEffect::end() { glBlendColor(0.0f, 0.0f, 0.0f, _intensity = _intensityStack.pop()); } -gpu::FramebufferPointer GlowEffect::render(const RenderArgs& renderArgs) { +gpu::FramebufferPointer GlowEffect::render(RenderArgs& renderArgs) { PerformanceTimer perfTimer("glowEffect"); auto textureCache = DependencyManager::get(); diff --git a/libraries/render-utils/src/GlowEffect.h b/libraries/render-utils/src/GlowEffect.h index 16ca810fda..9222556475 100644 --- a/libraries/render-utils/src/GlowEffect.h +++ b/libraries/render-utils/src/GlowEffect.h @@ -39,7 +39,7 @@ public: void init(bool enabled); /// Prepares the glow effect for rendering the current frame. To be called before rendering the scene. - void prepare(const RenderArgs& renderArgs); + void prepare(RenderArgs& renderArgs); /// Starts using the glow effect. /// \param intensity the desired glow intensity, from zero to one @@ -54,7 +54,7 @@ public: /// Renders the glow effect. To be called after rendering the scene. /// \param toTexture whether to render to a texture, rather than to the frame buffer /// \return the framebuffer object to which we rendered, or NULL if to the frame buffer - gpu::FramebufferPointer render(const RenderArgs& renderArgs); + gpu::FramebufferPointer render(RenderArgs& renderArgs); public slots: void toggleGlowEffect(bool enabled); From d40d9cca6937561292004641be017958c430d352 Mon Sep 17 00:00:00 2001 From: Eric Levin Date: Fri, 22 May 2015 10:02:28 -0700 Subject: [PATCH 08/23] deleted look.js (no longer needed) and removed from default scripts --- examples/defaultScripts.js | 1 - examples/look.js | 183 ------------------------------------- 2 files changed, 184 deletions(-) delete mode 100644 examples/look.js diff --git a/examples/defaultScripts.js b/examples/defaultScripts.js index ff22f68cb5..8f32b80bba 100644 --- a/examples/defaultScripts.js +++ b/examples/defaultScripts.js @@ -15,7 +15,6 @@ Script.load("controllers/hydra/hydraMove.js"); Script.load("inspect.js"); Script.load("lobby.js"); Script.load("notifications.js"); -Script.load("look.js"); Script.load("users.js"); Script.load("grab.js"); Script.load("pointer.js"); diff --git a/examples/look.js b/examples/look.js deleted file mode 100644 index 7adcd054c2..0000000000 --- a/examples/look.js +++ /dev/null @@ -1,183 +0,0 @@ -// -// look.js -// examples -// -// Copyright 2015 High Fidelity, Inc. -// -// This is an example script that demonstrates use of the Controller class -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -var wantDebugging = false; - - -// Configuration -var TOUCH_YAW_SCALE = -0.25; -var TOUCH_PITCH_SCALE = -12.5; -var FIXED_TOUCH_TIMESTEP = 0.016; - -var MOUSE_YAW_SCALE = -0.25; -var MOUSE_PITCH_SCALE = -12.5; -var FIXED_MOUSE_TIMESTEP = 0.016; - -// Mouse Data -var alwaysLook = false; // if you want the mouse look to happen only when you click, change this to false -var isMouseDown = false; -var lastTouchX = 0; -var lastTouchY = 0; -var yawFromTouch = 0; -var pitchFromTouch = 0; - -// Touch Data -var TIME_BEFORE_GENERATED_END_TOUCH_EVENT = 50; // ms -var startedTouching = false; -var lastTouchEvent = 0; -var lastMouseX = 0; -var lastMouseY = 0; -var yawFromMouse = 0; -var pitchFromMouse = 0; - - -// Mouse Events -function mousePressEvent(event) { - if (wantDebugging) { - print("mousePressEvent event.x,y=" + event.x + ", " + event.y); - } - if (event.isRightButton) { - isMouseDown = true; - lastMouseX = event.x; - lastMouseY = event.y; - } -} - -function mouseReleaseEvent(event) { - if (wantDebugging) { - print("mouseReleaseEvent event.x,y=" + event.x + ", " + event.y); - } - isMouseDown = false; -} - -function mouseMoveEvent(event) { - if (wantDebugging) { - print("mouseMoveEvent event.x,y=" + event.x + ", " + event.y); - } - - if (alwaysLook || isMouseDown) { - yawFromMouse += ((event.x - lastMouseX) * MOUSE_YAW_SCALE * FIXED_MOUSE_TIMESTEP); - pitchFromMouse += ((event.y - lastMouseY) * MOUSE_PITCH_SCALE * FIXED_MOUSE_TIMESTEP); - lastMouseX = event.x; - lastMouseY = event.y; - } -} - -// Touch Events -function touchBeginEvent(event) { - if (wantDebugging) { - print("touchBeginEvent event.x,y=" + event.x + ", " + event.y); - } - lastTouchX = event.x; - lastTouchY = event.y; - yawFromTouch = 0; - pitchFromTouch = 0; - startedTouching = true; - var d = new Date(); - lastTouchEvent = d.getTime(); -} - -function touchEndEvent(event) { - if (wantDebugging) { - if (event) { - print("touchEndEvent event.x,y=" + event.x + ", " + event.y); - } else { - print("touchEndEvent generated"); - } - } - startedTouching = false; -} - -function touchUpdateEvent(event) { - // print("TOUCH UPDATE"); - if (wantDebugging) { - print("touchUpdateEvent event.x,y=" + event.x + ", " + event.y); - } - - if (!startedTouching) { - // handle Qt 5.4.x bug where we get touch update without a touch begin event - touchBeginEvent(event); - return; - } - - yawFromTouch += ((event.x - lastTouchX) * TOUCH_YAW_SCALE * FIXED_TOUCH_TIMESTEP); - pitchFromTouch += ((event.y - lastTouchY) * TOUCH_PITCH_SCALE * FIXED_TOUCH_TIMESTEP); - lastTouchX = event.x; - lastTouchY = event.y; - var d = new Date(); - lastTouchEvent = d.getTime(); -} - - -function update(deltaTime) { - if (wantDebugging) { - print("update()..."); - } - - if (startedTouching) { - var d = new Date(); - var sinceLastTouch = d.getTime() - lastTouchEvent; - if (sinceLastTouch > TIME_BEFORE_GENERATED_END_TOUCH_EVENT) { - touchEndEvent(); - } - } - - if (yawFromTouch != 0 || yawFromMouse != 0) { - var newOrientation = Quat.multiply(MyAvatar.orientation, Quat.fromPitchYawRollRadians(0, yawFromTouch + yawFromMouse, 0)); - - if (wantDebugging) { - print("changing orientation" - + " [old]MyAvatar.orientation="+MyAvatar.orientation.x + "," + MyAvatar.orientation.y + "," - + MyAvatar.orientation.z + "," + MyAvatar.orientation.w - + " newOrientation="+newOrientation.x + "," + newOrientation.y + "," + newOrientation.z + "," + newOrientation.w); - } - - MyAvatar.orientation = newOrientation; - yawFromTouch = 0; - yawFromMouse = 0; - } - - if (pitchFromTouch != 0 || pitchFromMouse != 0) { - var newPitch = MyAvatar.headPitch + pitchFromTouch + pitchFromMouse; - - if (wantDebugging) { - print("changing pitch [old]MyAvatar.headPitch="+MyAvatar.headPitch+ " newPitch="+newPitch); - } - - MyAvatar.headPitch = newPitch; - pitchFromTouch = 0; - pitchFromMouse = 0; - } -} - - -// Map the mouse events to our functions -Controller.mousePressEvent.connect(mousePressEvent); -Controller.mouseMoveEvent.connect(mouseMoveEvent); -Controller.mouseReleaseEvent.connect(mouseReleaseEvent); - -// Map the mouse events to our functions -Controller.touchBeginEvent.connect(touchBeginEvent); -Controller.touchUpdateEvent.connect(touchUpdateEvent); -Controller.touchEndEvent.connect(touchEndEvent); - -// disable the standard application for mouse events -Controller.captureTouchEvents(); - -function scriptEnding() { - // re-enabled the standard application for mouse events - Controller.releaseTouchEvents(); -} - -// would be nice to change to update -Script.update.connect(update); -Script.scriptEnding.connect(scriptEnding); From e2769266089ef2270e83e7974ffcccdf74b7917b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Brisset?= Date: Fri, 22 May 2015 18:23:42 +0100 Subject: [PATCH 09/23] Add include/remove duplicate type --- libraries/shared/src/PerfStat.cpp | 2 +- libraries/shared/src/PerfStat.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/shared/src/PerfStat.cpp b/libraries/shared/src/PerfStat.cpp index 22cf000c24..615330e13f 100644 --- a/libraries/shared/src/PerfStat.cpp +++ b/libraries/shared/src/PerfStat.cpp @@ -105,7 +105,7 @@ PerformanceTimer::~PerformanceTimer() { } // static -bool PerformanceTimer::PerformanceTimer::isActive() { +bool PerformanceTimer::isActive() { return _isActive; } diff --git a/libraries/shared/src/PerfStat.h b/libraries/shared/src/PerfStat.h index 2d5a54db38..523bee0808 100644 --- a/libraries/shared/src/PerfStat.h +++ b/libraries/shared/src/PerfStat.h @@ -19,6 +19,7 @@ #include "SharedUtil.h" #include "SimpleMovingAverage.h" +#include #include #include #include From a01830f8f858ec6398b79bd865acce01975e5c6e Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 22 May 2015 12:32:02 -0700 Subject: [PATCH 10/23] Fix some double to float conversion warnings in Windows builds --- libraries/entities-renderer/src/EntityTreeRenderer.cpp | 2 +- .../entities-renderer/src/RenderableWebEntityItem.cpp | 4 ++-- tools/vhacd-util/src/VHACDUtilApp.cpp | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 7bc253d00a..c47c24f20a 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -1175,7 +1175,7 @@ void EntityTreeRenderer::entityCollisionWithEntity(const EntityItemID& idA, cons return; } // Don't respond to small continuous contacts. - const float COLLISION_MINUMUM_PENETRATION = 0.005; + const float COLLISION_MINUMUM_PENETRATION = 0.005f; if ((collision.type != CONTACT_EVENT_TYPE_START) && (glm::length(collision.penetration) < COLLISION_MINUMUM_PENETRATION)) { return; } diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp index f416fff744..1f71e10d4e 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp @@ -25,8 +25,8 @@ #include "EntityTreeRenderer.h" -const float DPI = 30.47; -const float METERS_TO_INCHES = 39.3701; +const float DPI = 30.47f; +const float METERS_TO_INCHES = 39.3701f; EntityItem* RenderableWebEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { return new RenderableWebEntityItem(entityID, properties); diff --git a/tools/vhacd-util/src/VHACDUtilApp.cpp b/tools/vhacd-util/src/VHACDUtilApp.cpp index 46e1898979..ed4dab020f 100644 --- a/tools/vhacd-util/src/VHACDUtilApp.cpp +++ b/tools/vhacd-util/src/VHACDUtilApp.cpp @@ -255,27 +255,27 @@ VHACDUtilApp::VHACDUtilApp(int argc, char* argv[]) : vHacdDepth = parser.value(vHacdDepthOption).toInt(); } - float vHacdAlpha = 0.05; + float vHacdAlpha = 0.05f; if (parser.isSet(vHacdAlphaOption)) { vHacdAlpha = parser.value(vHacdAlphaOption).toFloat(); } - float vHacdBeta = 0.05; + float vHacdBeta = 0.05f; if (parser.isSet(vHacdBetaOption)) { vHacdBeta = parser.value(vHacdBetaOption).toFloat(); } - float vHacdGamma = 0.00125; + float vHacdGamma = 0.00125f; if (parser.isSet(vHacdGammaOption)) { vHacdGamma = parser.value(vHacdGammaOption).toFloat(); } - float vHacdDelta = 0.05; + float vHacdDelta = 0.05f; if (parser.isSet(vHacdDeltaOption)) { vHacdDelta = parser.value(vHacdDeltaOption).toFloat(); } - float vHacdConcavity = 0.0025; + float vHacdConcavity = 0.0025f; if (parser.isSet(vHacdConcavityOption)) { vHacdConcavity = parser.value(vHacdConcavityOption).toFloat(); } From 945a84d24fbbada93f656233749d83b4611dad17 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 22 May 2015 15:01:43 -0700 Subject: [PATCH 11/23] adjust logic used by the entity-server to decide if the contents of an octree-element have already been sent to a particular interface with a particular frustum --- assignment-client/src/octree/OctreeQueryNode.cpp | 3 +-- assignment-client/src/octree/OctreeQueryNode.h | 6 +++++- assignment-client/src/octree/OctreeSendThread.cpp | 14 ++++++++++---- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 35f8fb9973..56d5e041a9 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -325,8 +325,7 @@ void OctreeQueryNode::updateLastKnownViewFrustum() { } // save that we know the view has been sent. - quint64 now = usecTimestampNow(); - setLastTimeBagEmpty(now); // is this what we want? poor names + setLastTimeBagEmpty(); } diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index ea0f3240aa..ff59fb7685 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -77,7 +77,7 @@ public: bool moveShouldDump() const; quint64 getLastTimeBagEmpty() const { return _lastTimeBagEmpty; } - void setLastTimeBagEmpty(quint64 lastTimeBagEmpty) { _lastTimeBagEmpty = lastTimeBagEmpty; } + void setLastTimeBagEmpty() { _lastTimeBagEmpty = _sceneSendStartTime; } bool getCurrentPacketIsColor() const { return _currentPacketIsColor; } bool getCurrentPacketIsCompressed() const { return _currentPacketIsCompressed; } @@ -98,6 +98,8 @@ public: void setLastRootTimestamp(quint64 timestamp) { _lastRootTimestamp = timestamp; } unsigned int getlastOctreePacketLength() const { return _lastOctreePacketLength; } int getDuplicatePacketCount() const { return _duplicatePacketCount; } + + void sceneStart(quint64 sceneSendStartTime) { _sceneSendStartTime = sceneSendStartTime; } void nodeKilled(); void forceNodeShutdown(); @@ -158,6 +160,8 @@ private: SentPacketHistory _sentPacketHistory; QQueue _nackedSequenceNumbers; + + quint64 _sceneSendStartTime = 0; }; #endif // hifi_OctreeQueryNode_h diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 2014c56476..f85d09b169 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -343,8 +343,7 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus if (!viewFrustumChanged && !nodeData->getWantDelta()) { // only set our last sent time if we weren't resetting due to frustum change - quint64 now = usecTimestampNow(); - nodeData->setLastTimeBagEmpty(now); + nodeData->setLastTimeBagEmpty(); } // track completed scenes and send out the stats packet accordingly @@ -368,9 +367,11 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus // TODO: add these to stats page //::startSceneSleepTime = _usleepTime; - + + nodeData->sceneStart(usecTimestampNow() - CHANGE_FUDGE); // start tracking our stats - nodeData->stats.sceneStarted(isFullScene, viewFrustumChanged, _myServer->getOctree()->getRoot(), _myServer->getJurisdiction()); + nodeData->stats.sceneStarted(isFullScene, viewFrustumChanged, + _myServer->getOctree()->getRoot(), _myServer->getJurisdiction()); // This is the start of "resending" the scene. bool dontRestartSceneOnMove = false; // this is experimental @@ -561,6 +562,11 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus } + if (somethingToSend) { + qDebug() << "Hit PPS Limit"; + } + + // Here's where we can/should allow the server to send other data... // send the environment packet // TODO: should we turn this into a while loop to better handle sending multiple special packets From 53fe41ef4da605c5f7b8fb3138e954e3a64fcf5a Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 22 May 2015 15:11:56 -0700 Subject: [PATCH 12/23] improve a debug print --- assignment-client/src/octree/OctreeSendThread.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index f85d09b169..972debb21f 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -563,7 +563,8 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus if (somethingToSend) { - qDebug() << "Hit PPS Limit"; + qDebug() << "Hit PPS Limit, packetsSentThisInterval =" << packetsSentThisInterval + << " maxPacketsPerInterval = " << maxPacketsPerInterval; } From 32cc0eacfc0838861375539a5ca8549c2879feb6 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 22 May 2015 15:21:26 -0700 Subject: [PATCH 13/23] improve a debug print --- assignment-client/src/octree/OctreeSendThread.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 972debb21f..d664fb5c8f 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -564,7 +564,8 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus if (somethingToSend) { qDebug() << "Hit PPS Limit, packetsSentThisInterval =" << packetsSentThisInterval - << " maxPacketsPerInterval = " << maxPacketsPerInterval; + << " maxPacketsPerInterval = " << maxPacketsPerInterval + << " clientMaxPacketsPerInterval = " << clientMaxPacketsPerInterval; } From 3f22b5f8b391fdeb7122ff51f3106085a0a42c1e Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 22 May 2015 15:25:53 -0700 Subject: [PATCH 14/23] Add RenderArgs to more render methods --- interface/src/Application.cpp | 67 +++++++++---------- interface/src/Application.h | 8 +-- interface/src/avatar/Avatar.cpp | 45 ++++++------- interface/src/avatar/Avatar.h | 8 +-- interface/src/avatar/AvatarManager.cpp | 14 ++-- interface/src/avatar/AvatarManager.h | 4 +- interface/src/avatar/Hand.cpp | 6 +- interface/src/avatar/Hand.h | 2 +- interface/src/avatar/Head.cpp | 14 ++-- interface/src/avatar/Head.h | 4 +- interface/src/avatar/MyAvatar.cpp | 34 +++++----- interface/src/avatar/MyAvatar.h | 8 +-- interface/src/devices/OculusManager.cpp | 4 +- interface/src/devices/OculusManager.h | 2 +- interface/src/devices/TV3DManager.cpp | 4 +- interface/src/devices/TV3DManager.h | 2 +- interface/src/octree/OctreeFade.cpp | 6 +- interface/src/octree/OctreeFade.h | 2 +- interface/src/ui/ApplicationOverlay.cpp | 4 +- interface/src/ui/ApplicationOverlay.h | 2 +- interface/src/ui/RearMirrorTools.cpp | 2 +- interface/src/ui/RearMirrorTools.h | 2 +- .../src/ui/overlays/LocalModelsOverlay.cpp | 2 +- interface/src/ui/overlays/ModelOverlay.cpp | 2 +- interface/src/ui/overlays/Overlays.cpp | 22 ++---- interface/src/ui/overlays/Overlays.h | 6 +- .../src/EntityTreeRenderer.cpp | 44 ++++++------ .../src/EntityTreeRenderer.h | 2 +- libraries/octree/src/OctreeHeadlessViewer.h | 2 +- libraries/octree/src/OctreeRenderer.cpp | 32 ++++----- libraries/octree/src/OctreeRenderer.h | 2 +- libraries/render-utils/src/GlowEffect.cpp | 16 +++-- libraries/render-utils/src/GlowEffect.h | 12 ++-- libraries/render-utils/src/Model.cpp | 8 +-- libraries/render-utils/src/Model.h | 2 +- 35 files changed, 191 insertions(+), 205 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index cb5d68c9d7..260c7e74e7 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -853,7 +853,7 @@ void Application::paintGL() { { PerformanceTimer perfTimer("renderOverlay"); - _applicationOverlay.renderOverlay(renderArgs); + _applicationOverlay.renderOverlay(&renderArgs); } glEnable(GL_LINE_SMOOTH); @@ -903,7 +903,7 @@ void Application::paintGL() { if (getShadowsEnabled()) { renderArgs._renderMode = RenderArgs::SHADOW_RENDER_MODE; - updateShadowMap(renderArgs); + updateShadowMap(&renderArgs); } renderArgs._renderMode = RenderArgs::DEFAULT_RENDER_MODE; @@ -911,16 +911,16 @@ void Application::paintGL() { if (OculusManager::isConnected()) { //When in mirror mode, use camera rotation. Otherwise, use body rotation if (_myCamera.getMode() == CAMERA_MODE_MIRROR) { - OculusManager::display(_glWidget, renderArgs, _myCamera.getRotation(), _myCamera.getPosition(), _myCamera); + OculusManager::display(_glWidget, &renderArgs, _myCamera.getRotation(), _myCamera.getPosition(), _myCamera); } else { - OculusManager::display(_glWidget, renderArgs, _myAvatar->getWorldAlignedOrientation(), _myAvatar->getDefaultEyePosition(), _myCamera); + OculusManager::display(_glWidget, &renderArgs, _myAvatar->getWorldAlignedOrientation(), _myAvatar->getDefaultEyePosition(), _myCamera); } } else if (TV3DManager::isConnected()) { - TV3DManager::display(renderArgs, _myCamera); + TV3DManager::display(&renderArgs, _myCamera); } else { - DependencyManager::get()->prepare(renderArgs); + DependencyManager::get()->prepare(&renderArgs); // Viewport is assigned to the size of the framebuffer QSize size = DependencyManager::get()->getFrameBufferSize(); @@ -929,16 +929,16 @@ void Application::paintGL() { glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); - displaySide(renderArgs, _myCamera); + displaySide(&renderArgs, _myCamera); glPopMatrix(); if (Menu::getInstance()->isOptionChecked(MenuOption::FullscreenMirror)) { - _rearMirrorTools->render(true, _glWidget->mapFromGlobal(QCursor::pos())); + _rearMirrorTools->render(&renderArgs, true, _glWidget->mapFromGlobal(QCursor::pos())); } else if (Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) { - renderRearViewMirror(renderArgs, _mirrorViewRect); + renderRearViewMirror(&renderArgs, _mirrorViewRect); } - auto finalFbo = DependencyManager::get()->render(renderArgs); + auto finalFbo = DependencyManager::get()->render(&renderArgs); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); glBindFramebuffer(GL_READ_FRAMEBUFFER, gpu::GLBackend::getFramebufferID(finalFbo)); @@ -2892,7 +2892,7 @@ glm::vec3 Application::getSunDirection() { // FIXME, preprocessor guard this check to occur only in DEBUG builds static QThread * activeRenderingThread = nullptr; -void Application::updateShadowMap(RenderArgs& renderArgs) { +void Application::updateShadowMap(RenderArgs* renderArgs) { activeRenderingThread = QThread::currentThread(); PerformanceTimer perfTimer("shadowMap"); @@ -3013,7 +3013,7 @@ void Application::updateShadowMap(RenderArgs& renderArgs) { { PerformanceTimer perfTimer("avatarManager"); - DependencyManager::get()->renderAvatars(RenderArgs::SHADOW_RENDER_MODE); + DependencyManager::get()->renderAvatars(renderArgs); } { @@ -3024,12 +3024,12 @@ void Application::updateShadowMap(RenderArgs& renderArgs) { // render JS/scriptable overlays { PerformanceTimer perfTimer("3dOverlays"); - _overlays.renderWorld(false, RenderArgs::SHADOW_RENDER_MODE); + _overlays.renderWorld(renderArgs, false); } { PerformanceTimer perfTimer("3dOverlaysFront"); - _overlays.renderWorld(true, RenderArgs::SHADOW_RENDER_MODE); + _overlays.renderWorld(renderArgs, true); } glDisable(GL_POLYGON_OFFSET_FILL); @@ -3097,20 +3097,16 @@ PickRay Application::computePickRay(float x, float y) const { return result; } -QImage Application::renderAvatarBillboard() { +QImage Application::renderAvatarBillboard(RenderArgs* renderArgs) { auto primaryFramebuffer = DependencyManager::get()->getPrimaryFramebuffer(); glBindFramebuffer(GL_FRAMEBUFFER, gpu::GLBackend::getFramebufferID(primaryFramebuffer)); // the "glow" here causes an alpha of one - Glower glower; + Glower glower(renderArgs); const int BILLBOARD_SIZE = 64; // TODO: Pass a RenderArgs to renderAvatarBillboard auto lodManager = DependencyManager::get(); - RenderArgs renderArgs(NULL, Application::getInstance()->getViewFrustum(), - lodManager->getOctreeSizeScale(), - lodManager->getBoundaryLevelAdjust(), - RenderArgs::DEFAULT_RENDER_MODE, RenderArgs::MONO, RenderArgs::RENDER_DEBUG_NONE); renderRearViewMirror(renderArgs, QRect(0, _glWidget->getDeviceHeight() - BILLBOARD_SIZE, BILLBOARD_SIZE, BILLBOARD_SIZE), true); @@ -3163,7 +3159,7 @@ const ViewFrustum* Application::getDisplayViewFrustum() const { return &_displayViewFrustum; } -void Application::displaySide(RenderArgs& renderArgs, Camera& theCamera, bool selfAvatarOnly) { +void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool selfAvatarOnly) { activeRenderingThread = QThread::currentThread(); PROFILE_RANGE(__FUNCTION__); PerformanceTimer perfTimer("display"); @@ -3202,7 +3198,7 @@ void Application::displaySide(RenderArgs& renderArgs, Camera& theCamera, bool se if (theCamera.getMode() == CAMERA_MODE_MIRROR) { viewTransform.setScale(Transform::Vec3(-1.0f, 1.0f, 1.0f)); } - if (renderArgs._renderSide != RenderArgs::MONO) { + if (renderArgs->_renderSide != RenderArgs::MONO) { glm::mat4 invView = glm::inverse(_untranslatedViewMatrix); viewTransform.evalFromRawMatrix(invView); @@ -3333,7 +3329,7 @@ void Application::displaySide(RenderArgs& renderArgs, Camera& theCamera, bool se // render JS/scriptable overlays { PerformanceTimer perfTimer("3dOverlays"); - _overlays.renderWorld(false); + _overlays.renderWorld(renderArgs, false); } // render models... @@ -3355,8 +3351,8 @@ void Application::displaySide(RenderArgs& renderArgs, Camera& theCamera, bool se if (theCamera.getMode() == CAMERA_MODE_MIRROR) { renderMode = RenderArgs::MIRROR_RENDER_MODE; } - renderArgs._renderMode = renderMode; - renderArgs._debugFlags = renderDebugFlags; + renderArgs->_renderMode = renderMode; + renderArgs->_debugFlags = renderDebugFlags; _entities.render(renderArgs); if (!Menu::getInstance()->isOptionChecked(MenuOption::Wireframe)) { @@ -3378,8 +3374,9 @@ void Application::displaySide(RenderArgs& renderArgs, Camera& theCamera, bool se { PerformanceTimer perfTimer("avatars"); - RenderArgs::RenderMode renderMode = mirrorMode ? RenderArgs::MIRROR_RENDER_MODE : RenderArgs::NORMAL_RENDER_MODE; - DependencyManager::get()->renderAvatars(renderMode, false, selfAvatarOnly); + renderArgs->_renderMode = mirrorMode ? RenderArgs::MIRROR_RENDER_MODE : RenderArgs::NORMAL_RENDER_MODE; + DependencyManager::get()->renderAvatars(renderArgs, false, selfAvatarOnly); + renderArgs->_renderMode = RenderArgs::NORMAL_RENDER_MODE; } { @@ -3396,9 +3393,9 @@ void Application::displaySide(RenderArgs& renderArgs, Camera& theCamera, bool se { PerformanceTimer perfTimer("avatarsPostLighting"); - RenderArgs::RenderMode renderMode = mirrorMode ? RenderArgs::MIRROR_RENDER_MODE : RenderArgs::NORMAL_RENDER_MODE; - DependencyManager::get()->renderAvatars(renderMode, true, selfAvatarOnly); - renderArgs._renderMode = RenderArgs::NORMAL_RENDER_MODE; + renderArgs->_renderMode = mirrorMode ? RenderArgs::MIRROR_RENDER_MODE : RenderArgs::NORMAL_RENDER_MODE; + DependencyManager::get()->renderAvatars(renderArgs, true, selfAvatarOnly); + renderArgs->_renderMode = RenderArgs::NORMAL_RENDER_MODE; } //Render the sixense lasers @@ -3422,7 +3419,7 @@ void Application::displaySide(RenderArgs& renderArgs, Camera& theCamera, bool se "Application::displaySide() ... octree fades..."); _octreeFadesLock.lockForWrite(); for(std::vector::iterator fade = _octreeFades.begin(); fade != _octreeFades.end();) { - fade->render(); + fade->render(renderArgs); if(fade->isDone()) { fade = _octreeFades.erase(fade); } else { @@ -3447,8 +3444,8 @@ void Application::displaySide(RenderArgs& renderArgs, Camera& theCamera, bool se { PerformanceTimer perfTimer("3dOverlaysFront"); glClear(GL_DEPTH_BUFFER_BIT); - Glower glower; // Sets alpha to 1.0 - _overlays.renderWorld(true); + Glower glower(renderArgs); // Sets alpha to 1.0 + _overlays.renderWorld(renderArgs, true); } activeRenderingThread = nullptr; } @@ -3526,7 +3523,7 @@ glm::vec2 Application::getScaledScreenPoint(glm::vec2 projectedPoint) { return screenPoint; } -void Application::renderRearViewMirror(RenderArgs& renderArgs, const QRect& region, bool billboard) { +void Application::renderRearViewMirror(RenderArgs* renderArgs, const QRect& region, bool billboard) { // Grab current viewport to reset it at the end int viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport); @@ -3590,7 +3587,7 @@ void Application::renderRearViewMirror(RenderArgs& renderArgs, const QRect& regi glPopMatrix(); if (!billboard) { - _rearMirrorTools->render(false, _glWidget->mapFromGlobal(QCursor::pos())); + _rearMirrorTools->render(renderArgs, false, _glWidget->mapFromGlobal(QCursor::pos())); } // reset Viewport and projection matrix diff --git a/interface/src/Application.h b/interface/src/Application.h index 1d1463e04c..3c9c141afb 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -268,9 +268,9 @@ public: virtual void setupWorldLight(); virtual bool shouldRenderMesh(float largestDimension, float distanceToCamera); - QImage renderAvatarBillboard(); + QImage renderAvatarBillboard(RenderArgs* renderArgs); - void displaySide(RenderArgs& renderArgs, Camera& whichCamera, bool selfAvatarOnly = false); + void displaySide(RenderArgs* renderArgs, Camera& whichCamera, bool selfAvatarOnly = false); /// Stores the current modelview matrix as the untranslated view matrix to use for transforms and the supplied vector as /// the view matrix translation. @@ -499,8 +499,8 @@ private: glm::vec3 getSunDirection(); - void updateShadowMap(RenderArgs& renderArgs); - void renderRearViewMirror(RenderArgs& renderArgs, const QRect& region, bool billboard = false); + void updateShadowMap(RenderArgs* renderArgs); + void renderRearViewMirror(RenderArgs* renderArgs, const QRect& region, bool billboard = false); void setMenuShortcutsEnabled(bool enabled); static void attachNewHeadToNode(Node *newNode); diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 8a627c019c..aaa4a737f9 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -268,7 +268,7 @@ static TextRenderer* textRenderer(TextRendererType type) { return displayNameRenderer; } -void Avatar::render(const glm::vec3& cameraPosition, RenderArgs::RenderMode renderMode, bool postLighting) { +void Avatar::render(RenderArgs* renderArgs, const glm::vec3& cameraPosition, bool postLighting) { if (_referential) { _referential->update(); } @@ -339,7 +339,7 @@ void Avatar::render(const glm::vec3& cameraPosition, RenderArgs::RenderMode rend // simple frustum check float boundingRadius = getBillboardSize(); ViewFrustum* frustum = nullptr; - if (renderMode == RenderArgs::SHADOW_RENDER_MODE) { + if (renderArgs->_renderMode == RenderArgs::SHADOW_RENDER_MODE) { frustum = Application::getInstance()->getShadowViewFrustum(); } else { frustum = Application::getInstance()->getDisplayViewFrustum(); @@ -365,14 +365,14 @@ void Avatar::render(const glm::vec3& cameraPosition, RenderArgs::RenderMode rend GLOW_FROM_AVERAGE_LOUDNESS = 0.0f; } - float glowLevel = _moving && distanceToTarget > GLOW_DISTANCE && renderMode == RenderArgs::NORMAL_RENDER_MODE + float glowLevel = _moving && distanceToTarget > GLOW_DISTANCE && renderArgs->_renderMode == RenderArgs::NORMAL_RENDER_MODE ? 1.0f : GLOW_FROM_AVERAGE_LOUDNESS; // render body - renderBody(frustum, renderMode, postLighting, glowLevel); + renderBody(renderArgs, frustum, postLighting, glowLevel); - if (!postLighting && renderMode != RenderArgs::SHADOW_RENDER_MODE) { + if (!postLighting && renderArgs->_renderMode != RenderArgs::SHADOW_RENDER_MODE) { // add local lights const float BASE_LIGHT_DISTANCE = 2.0f; const float LIGHT_EXPONENT = 1.0f; @@ -396,10 +396,10 @@ void Avatar::render(const glm::vec3& cameraPosition, RenderArgs::RenderMode rend _skeletonModel.renderJointCollisionShapes(0.7f); } - if (renderHead && shouldRenderHead(cameraPosition, renderMode)) { + if (renderHead && shouldRenderHead(renderArgs, cameraPosition)) { getHead()->getFaceModel().renderJointCollisionShapes(0.7f); } - if (renderBounding && shouldRenderHead(cameraPosition, renderMode)) { + if (renderBounding && shouldRenderHead(renderArgs, cameraPosition)) { _skeletonModel.renderBoundingCollisionShapes(0.7f); } @@ -436,7 +436,7 @@ void Avatar::render(const glm::vec3& cameraPosition, RenderArgs::RenderMode rend float angle = abs(angleBetween(toTarget + delta, toTarget - delta)); float sphereRadius = getHead()->getAverageLoudness() * SPHERE_LOUDNESS_SCALING; - if (renderMode == RenderArgs::NORMAL_RENDER_MODE && (sphereRadius > MIN_SPHERE_SIZE) && + if (renderArgs->_renderMode == RenderArgs::NORMAL_RENDER_MODE && (sphereRadius > MIN_SPHERE_SIZE) && (angle < MAX_SPHERE_ANGLE) && (angle > MIN_SPHERE_ANGLE)) { glPushMatrix(); glTranslatef(_position.x, _position.y, _position.z); @@ -455,8 +455,8 @@ void Avatar::render(const glm::vec3& cameraPosition, RenderArgs::RenderMode rend } const float DISPLAYNAME_DISTANCE = 20.0f; - setShowDisplayName(renderMode == RenderArgs::NORMAL_RENDER_MODE && distanceToTarget < DISPLAYNAME_DISTANCE); - if (!postLighting || renderMode != RenderArgs::NORMAL_RENDER_MODE || (isMyAvatar() && + setShowDisplayName(renderArgs->_renderMode == RenderArgs::NORMAL_RENDER_MODE && distanceToTarget < DISPLAYNAME_DISTANCE); + if (!postLighting || renderArgs->_renderMode != RenderArgs::NORMAL_RENDER_MODE || (isMyAvatar() && Application::getInstance()->getCamera()->getMode() == CAMERA_MODE_FIRST_PERSON)) { return; } @@ -479,13 +479,12 @@ glm::quat Avatar::computeRotationFromBodyToWorldUp(float proportion) const { return glm::angleAxis(angle * proportion, axis); } -void Avatar::renderBody(ViewFrustum* renderFrustum, RenderArgs::RenderMode renderMode, bool postLighting, float glowLevel) { - Model::RenderMode modelRenderMode = renderMode; +void Avatar::renderBody(RenderArgs* renderArgs, ViewFrustum* renderFrustum, bool postLighting, float glowLevel) { { - Glower glower(glowLevel); + Glower glower(renderArgs, glowLevel); if (_shouldRenderBillboard || !(_skeletonModel.isRenderable() && getHead()->getFaceModel().isRenderable())) { - if (postLighting || renderMode == RenderArgs::SHADOW_RENDER_MODE) { + if (postLighting || renderArgs->_renderMode == RenderArgs::SHADOW_RENDER_MODE) { // render the billboard until both models are loaded renderBillboard(); } @@ -493,18 +492,18 @@ void Avatar::renderBody(ViewFrustum* renderFrustum, RenderArgs::RenderMode rende } if (postLighting) { - getHand()->render(false, modelRenderMode); + getHand()->render(renderArgs, false); } else { - RenderArgs args; - args._viewFrustum = renderFrustum; - _skeletonModel.render(1.0f, modelRenderMode, &args); - renderAttachments(renderMode, &args); + // RenderArgs args; + // args._viewFrustum = renderFrustum; + _skeletonModel.render(renderArgs, 1.0f); + renderAttachments(renderArgs); } } - getHead()->render(1.0f, renderFrustum, modelRenderMode, postLighting); + getHead()->render(renderArgs, 1.0f, renderFrustum, postLighting); } -bool Avatar::shouldRenderHead(const glm::vec3& cameraPosition, RenderArgs::RenderMode renderMode) const { +bool Avatar::shouldRenderHead(const RenderArgs* renderArgs, const glm::vec3& cameraPosition) const { return true; } @@ -528,11 +527,11 @@ void Avatar::simulateAttachments(float deltaTime) { } } -void Avatar::renderAttachments(RenderArgs::RenderMode renderMode, RenderArgs* args) { +void Avatar::renderAttachments(RenderArgs* args) { // RenderArgs::RenderMode modelRenderMode = (renderMode == RenderArgs::SHADOW_RENDER_MODE) ? // RenderArgs::SHADOW_RENDER_MODE : RenderArgs::DEFAULT_RENDER_MODE; foreach (Model* model, _attachmentModels) { - model->render(1.0f, renderMode, args); + model->render(args, 1.0f); } } diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index a358e7e58d..63c537f1ce 100644 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -68,7 +68,7 @@ public: void init(); void simulate(float deltaTime); - virtual void render(const glm::vec3& cameraPosition, RenderArgs::RenderMode renderMode = RenderArgs::NORMAL_RENDER_MODE, + virtual void render(RenderArgs* renderArgs, const glm::vec3& cameraPosition, bool postLighting = false); //setters @@ -208,11 +208,11 @@ protected: float calculateDisplayNameScaleFactor(const glm::vec3& textPosition, bool inHMD); void renderDisplayName(); - virtual void renderBody(ViewFrustum* renderFrustum, RenderArgs::RenderMode renderMode, bool postLighting, float glowLevel = 0.0f); - virtual bool shouldRenderHead(const glm::vec3& cameraPosition, RenderArgs::RenderMode renderMode) const; + virtual void renderBody(RenderArgs* renderArgs, ViewFrustum* renderFrustum, bool postLighting, float glowLevel = 0.0f); + virtual bool shouldRenderHead(const RenderArgs* renderArgs, const glm::vec3& cameraPosition) const; void simulateAttachments(float deltaTime); - virtual void renderAttachments(RenderArgs::RenderMode renderMode, RenderArgs* args); + virtual void renderAttachments(RenderArgs* args); virtual void updateJointMappings(); diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 38144dfe5f..5d38e89281 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -115,7 +115,7 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { simulateAvatarFades(deltaTime); } -void AvatarManager::renderAvatars(RenderArgs::RenderMode renderMode, bool postLighting, bool selfAvatarOnly) { +void AvatarManager::renderAvatars(RenderArgs* renderArgs, bool postLighting, bool selfAvatarOnly) { PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), "Application::renderAvatars()"); bool renderLookAtVectors = Menu::getInstance()->isOptionChecked(MenuOption::RenderLookAtVectors); @@ -129,14 +129,14 @@ void AvatarManager::renderAvatars(RenderArgs::RenderMode renderMode, bool postLi if (!avatar->isInitialized()) { continue; } - avatar->render(cameraPosition, renderMode, postLighting); + avatar->render(renderArgs, cameraPosition, postLighting); avatar->setDisplayingLookatVectors(renderLookAtVectors); } - renderAvatarFades(cameraPosition, renderMode); + renderAvatarFades(renderArgs, cameraPosition); } } else { // just render myAvatar - _myAvatar->render(cameraPosition, renderMode, postLighting); + _myAvatar->render(renderArgs, cameraPosition, postLighting); _myAvatar->setDisplayingLookatVectors(renderLookAtVectors); } } @@ -159,14 +159,14 @@ void AvatarManager::simulateAvatarFades(float deltaTime) { } } -void AvatarManager::renderAvatarFades(const glm::vec3& cameraPosition, RenderArgs::RenderMode renderMode) { +void AvatarManager::renderAvatarFades(RenderArgs* renderArgs, const glm::vec3& cameraPosition) { // render avatar fades - Glower glower(renderMode == RenderArgs::NORMAL_RENDER_MODE ? 1.0f : 0.0f); + Glower glower(renderArgs, renderArgs->_renderMode == RenderArgs::NORMAL_RENDER_MODE ? 1.0f : 0.0f); foreach(const AvatarSharedPointer& fadingAvatar, _avatarFades) { Avatar* avatar = static_cast(fadingAvatar.data()); if (avatar != static_cast(_myAvatar.data()) && avatar->isInitialized()) { - avatar->render(cameraPosition, renderMode); + avatar->render(renderArgs, cameraPosition); } } } diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index 3c7f7296fe..e6a358401c 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -37,7 +37,7 @@ public: void updateMyAvatar(float deltaTime); void updateOtherAvatars(float deltaTime); - void renderAvatars(RenderArgs::RenderMode renderMode, bool postLighting = false, bool selfAvatarOnly = false); + void renderAvatars(RenderArgs* renderArgs, bool postLighting = false, bool selfAvatarOnly = false); void clearOtherAvatars(); @@ -60,7 +60,7 @@ private: AvatarManager(const AvatarManager& other); void simulateAvatarFades(float deltaTime); - void renderAvatarFades(const glm::vec3& cameraPosition, RenderArgs::RenderMode renderMode); + void renderAvatarFades(RenderArgs* renderArgs, const glm::vec3& cameraPosition); AvatarSharedPointer newSharedAvatar(); diff --git a/interface/src/avatar/Hand.cpp b/interface/src/avatar/Hand.cpp index e67ed15b67..74653d9768 100644 --- a/interface/src/avatar/Hand.cpp +++ b/interface/src/avatar/Hand.cpp @@ -102,8 +102,8 @@ void Hand::resolvePenetrations() { } } -void Hand::render(bool isMine, Model::RenderMode renderMode) { - if (renderMode != RenderArgs::SHADOW_RENDER_MODE && +void Hand::render(RenderArgs* renderArgs, bool isMine) { + if (renderArgs->_renderMode != RenderArgs::SHADOW_RENDER_MODE && Menu::getInstance()->isOptionChecked(MenuOption::RenderSkeletonCollisionShapes)) { // draw a green sphere at hand joint location, which is actually near the wrist) for (size_t i = 0; i < getNumPalms(); i++) { @@ -119,7 +119,7 @@ void Hand::render(bool isMine, Model::RenderMode renderMode) { } } - if (renderMode != RenderArgs::SHADOW_RENDER_MODE && Menu::getInstance()->isOptionChecked(MenuOption::DisplayHands)) { + if (renderArgs->_renderMode != RenderArgs::SHADOW_RENDER_MODE && Menu::getInstance()->isOptionChecked(MenuOption::DisplayHands)) { renderHandTargets(isMine); } diff --git a/interface/src/avatar/Hand.h b/interface/src/avatar/Hand.h index e19f5674b4..524ec23aff 100644 --- a/interface/src/avatar/Hand.h +++ b/interface/src/avatar/Hand.h @@ -52,7 +52,7 @@ public: }; void simulate(float deltaTime, bool isMine); - void render(bool isMine, Model::RenderMode renderMode = RenderArgs::DEFAULT_RENDER_MODE); + void render(RenderArgs* renderArgs, bool isMine); void collideAgainstAvatar(Avatar* avatar, bool isMyHand); diff --git a/interface/src/avatar/Head.cpp b/interface/src/avatar/Head.cpp index e0cdef109e..488fb3f1b1 100644 --- a/interface/src/avatar/Head.cpp +++ b/interface/src/avatar/Head.cpp @@ -262,15 +262,13 @@ void Head::relaxLean(float deltaTime) { _deltaLeanForward *= relaxationFactor; } -void Head::render(float alpha, ViewFrustum* renderFrustum, Model::RenderMode mode, bool postLighting) { +void Head::render(RenderArgs* renderArgs, float alpha, ViewFrustum* renderFrustum, bool postLighting) { if (postLighting) { if (_renderLookatVectors) { - renderLookatVectors(_leftEyePosition, _rightEyePosition, getCorrectedLookAtPosition()); + renderLookatVectors(renderArgs, _leftEyePosition, _rightEyePosition, getCorrectedLookAtPosition()); } } else { - RenderArgs args; - args._viewFrustum = renderFrustum; - _faceModel.render(alpha, mode, &args); + _faceModel.render(renderArgs, alpha); } } @@ -353,9 +351,9 @@ void Head::addLeanDeltas(float sideways, float forward) { _deltaLeanForward += forward; } -void Head::renderLookatVectors(glm::vec3 leftEyePosition, glm::vec3 rightEyePosition, glm::vec3 lookatPosition) { +void Head::renderLookatVectors(RenderArgs* renderArgs, glm::vec3 leftEyePosition, glm::vec3 rightEyePosition, glm::vec3 lookatPosition) { auto geometryCache = DependencyManager::get(); - DependencyManager::get()->begin(); + DependencyManager::get()->begin(renderArgs); glLineWidth(2.0); @@ -364,7 +362,7 @@ void Head::renderLookatVectors(glm::vec3 leftEyePosition, glm::vec3 rightEyePosi geometryCache->renderLine(leftEyePosition, lookatPosition, startColor, endColor, _leftEyeLookAtID); geometryCache->renderLine(rightEyePosition, lookatPosition, startColor, endColor, _rightEyeLookAtID); - DependencyManager::get()->end(); + DependencyManager::get()->end(renderArgs); } diff --git a/interface/src/avatar/Head.h b/interface/src/avatar/Head.h index e523d958a6..b8e6bf8c51 100644 --- a/interface/src/avatar/Head.h +++ b/interface/src/avatar/Head.h @@ -40,7 +40,7 @@ public: void init(); void reset(); void simulate(float deltaTime, bool isMine, bool billboard = false); - void render(float alpha, ViewFrustum* renderFrustum, Model::RenderMode mode, bool postLighting); + void render(RenderArgs* renderArgs, float alpha, ViewFrustum* renderFrustum, bool postLighting); void setScale(float scale); void setPosition(glm::vec3 position) { _position = position; } void setAverageLoudness(float averageLoudness) { _averageLoudness = averageLoudness; } @@ -153,7 +153,7 @@ private: int _rightEyeLookAtID; // private methods - void renderLookatVectors(glm::vec3 leftEyePosition, glm::vec3 rightEyePosition, glm::vec3 lookatPosition); + void renderLookatVectors(RenderArgs* renderArgs, glm::vec3 leftEyePosition, glm::vec3 rightEyePosition, glm::vec3 lookatPosition); void calculateMouthShapes(); friend class FaceModel; diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index e573110157..e1f62f616e 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -328,13 +328,13 @@ void MyAvatar::renderDebugBodyPoints() { } // virtual -void MyAvatar::render(const glm::vec3& cameraPosition, RenderArgs::RenderMode renderMode, bool postLighting) { +void MyAvatar::render(RenderArgs* renderArgs, const glm::vec3& cameraPosition, bool postLighting) { // don't render if we've been asked to disable local rendering if (!_shouldRender) { return; // exit early } - Avatar::render(cameraPosition, renderMode, postLighting); + Avatar::render(renderArgs, cameraPosition, postLighting); // don't display IK constraints in shadow mode if (Menu::getInstance()->isOptionChecked(MenuOption::ShowIKConstraints) && postLighting) { @@ -1166,7 +1166,7 @@ void MyAvatar::attach(const QString& modelURL, const QString& jointName, const g Avatar::attach(modelURL, jointName, translation, rotation, scale, allowDuplicates, useSaved); } -void MyAvatar::renderBody(ViewFrustum* renderFrustum, RenderArgs::RenderMode renderMode, bool postLighting, float glowLevel) { +void MyAvatar::renderBody(RenderArgs* renderArgs, ViewFrustum* renderFrustum, bool postLighting, float glowLevel) { if (!(_skeletonModel.isRenderable() && getHead()->getFaceModel().isRenderable())) { return; // wait until both models are loaded } @@ -1190,28 +1190,25 @@ void MyAvatar::renderBody(ViewFrustum* renderFrustum, RenderArgs::RenderMode ren }*/ // Render the body's voxels and head - RenderArgs::RenderMode modelRenderMode = renderMode; if (!postLighting) { - RenderArgs args; - args._viewFrustum = renderFrustum; - _skeletonModel.render(1.0f, modelRenderMode, &args); - renderAttachments(renderMode, &args); + _skeletonModel.render(renderArgs, 1.0f); + renderAttachments(renderArgs); } // Render head so long as the camera isn't inside it - if (shouldRenderHead(cameraPos, renderMode)) { - getHead()->render(1.0f, renderFrustum, modelRenderMode, postLighting); + if (shouldRenderHead(renderArgs, cameraPos)) { + getHead()->render(renderArgs, 1.0f, renderFrustum, postLighting); } if (postLighting) { - getHand()->render(true, modelRenderMode); + getHand()->render(renderArgs, true); } } const float RENDER_HEAD_CUTOFF_DISTANCE = 0.50f; -bool MyAvatar::shouldRenderHead(const glm::vec3& cameraPosition, RenderArgs::RenderMode renderMode) const { +bool MyAvatar::shouldRenderHead(const RenderArgs* renderArgs, const glm::vec3& cameraPosition) const { const Head* head = getHead(); - return (renderMode != RenderArgs::NORMAL_RENDER_MODE) || (Application::getInstance()->getCamera()->getMode() != CAMERA_MODE_FIRST_PERSON) || + return (renderArgs->_renderMode != RenderArgs::NORMAL_RENDER_MODE) || (Application::getInstance()->getCamera()->getMode() != CAMERA_MODE_FIRST_PERSON) || (glm::length(cameraPosition - head->getEyePosition()) > RENDER_HEAD_CUTOFF_DISTANCE * _scale); } @@ -1474,7 +1471,8 @@ void MyAvatar::maybeUpdateBillboard() { return; } } - QImage image = Application::getInstance()->renderAvatarBillboard(); + RenderArgs renderArgs; + QImage image = Application::getInstance()->renderAvatarBillboard(&renderArgs); _billboard.clear(); QBuffer buffer(&_billboard); buffer.open(QIODevice::WriteOnly); @@ -1551,9 +1549,9 @@ void MyAvatar::updateMotionBehavior() { _feetTouchFloor = menu->isOptionChecked(MenuOption::ShiftHipsForIdleAnimations); } -void MyAvatar::renderAttachments(RenderArgs::RenderMode renderMode, RenderArgs* args) { - if (Application::getInstance()->getCamera()->getMode() != CAMERA_MODE_FIRST_PERSON || renderMode == RenderArgs::MIRROR_RENDER_MODE) { - Avatar::renderAttachments(renderMode, args); +void MyAvatar::renderAttachments(RenderArgs* args) { + if (Application::getInstance()->getCamera()->getMode() != CAMERA_MODE_FIRST_PERSON || args->_renderMode == RenderArgs::MIRROR_RENDER_MODE) { + Avatar::renderAttachments(args); return; } const FBXGeometry& geometry = _skeletonModel.getGeometry()->getFBXGeometry(); @@ -1563,7 +1561,7 @@ void MyAvatar::renderAttachments(RenderArgs::RenderMode renderMode, RenderArgs* for (int i = 0; i < _attachmentData.size(); i++) { const QString& jointName = _attachmentData.at(i).jointName; if (jointName != headJointName && jointName != "Head") { - _attachmentModels.at(i)->render(1.0f, renderMode, args); + _attachmentModels.at(i)->render(args, 1.0f); } } } diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 4746a40099..34264f5808 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -37,9 +37,9 @@ public: void simulate(float deltaTime); void updateFromTrackers(float deltaTime); - void render(const glm::vec3& cameraPosition, RenderArgs::RenderMode renderMode = RenderArgs::NORMAL_RENDER_MODE, bool postLighting = false); - void renderBody(ViewFrustum* renderFrustum, RenderArgs::RenderMode renderMode, bool postLighting, float glowLevel = 0.0f); - bool shouldRenderHead(const glm::vec3& cameraPosition, RenderArgs::RenderMode renderMode) const; + void render(RenderArgs* renderArgs, const glm::vec3& cameraPosition, bool postLighting = false); + void renderBody(RenderArgs* renderArgs, ViewFrustum* renderFrustum, bool postLighting, float glowLevel = 0.0f); + bool shouldRenderHead(const RenderArgs* renderArgs, const glm::vec3& cameraPosition) const override; void renderDebugBodyPoints(); // setters @@ -198,7 +198,7 @@ signals: void transformChanged(); protected: - virtual void renderAttachments(RenderArgs::RenderMode renderMode, RenderArgs* args); + virtual void renderAttachments(RenderArgs* args); private: diff --git a/interface/src/devices/OculusManager.cpp b/interface/src/devices/OculusManager.cpp index acb62ab0d1..a7383ae4bb 100644 --- a/interface/src/devices/OculusManager.cpp +++ b/interface/src/devices/OculusManager.cpp @@ -465,7 +465,7 @@ void OculusManager::configureCamera(Camera& camera) { } //Displays everything for the oculus, frame timing must be active -void OculusManager::display(QGLWidget * glCanvas, RenderArgs& renderArgs, const glm::quat &bodyOrientation, const glm::vec3 &position, Camera& whichCamera) { +void OculusManager::display(QGLWidget * glCanvas, RenderArgs* renderArgs, const glm::quat &bodyOrientation, const glm::vec3 &position, Camera& whichCamera) { #ifdef DEBUG // Ensure the frame counter always increments by exactly 1 @@ -613,7 +613,7 @@ void OculusManager::display(QGLWidget * glCanvas, RenderArgs& renderArgs, const glViewport(vp.Pos.x, vp.Pos.y, vp.Size.w, vp.Size.h); - renderArgs._renderSide = RenderArgs::MONO; + renderArgs->_renderSide = RenderArgs::MONO; qApp->displaySide(renderArgs, *_camera, false); qApp->getApplicationOverlay().displayOverlayTextureHmd(*_camera); }); diff --git a/interface/src/devices/OculusManager.h b/interface/src/devices/OculusManager.h index 50cfebaf63..799f07ea35 100644 --- a/interface/src/devices/OculusManager.h +++ b/interface/src/devices/OculusManager.h @@ -63,7 +63,7 @@ public: static void endFrameTiming(); static bool allowSwap(); static void configureCamera(Camera& camera); - static void display(QGLWidget * glCanvas, RenderArgs& renderArgs, const glm::quat &bodyOrientation, const glm::vec3 &position, Camera& whichCamera); + static void display(QGLWidget * glCanvas, RenderArgs* renderArgs, const glm::quat &bodyOrientation, const glm::vec3 &position, Camera& whichCamera); static void reset(); /// param \yaw[out] yaw in radians diff --git a/interface/src/devices/TV3DManager.cpp b/interface/src/devices/TV3DManager.cpp index 49d5313a2b..09edb03e5a 100644 --- a/interface/src/devices/TV3DManager.cpp +++ b/interface/src/devices/TV3DManager.cpp @@ -80,7 +80,7 @@ void TV3DManager::configureCamera(Camera& whichCamera, int screenWidth, int scre glLoadIdentity(); } -void TV3DManager::display(RenderArgs& renderArgs, Camera& whichCamera) { +void TV3DManager::display(RenderArgs* renderArgs, Camera& whichCamera) { double nearZ = DEFAULT_NEAR_CLIP; // near clipping plane double farZ = DEFAULT_FAR_CLIP; // far clipping plane @@ -118,7 +118,7 @@ void TV3DManager::display(RenderArgs& renderArgs, Camera& whichCamera) { glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - renderArgs._renderSide = RenderArgs::MONO; + renderArgs->_renderSide = RenderArgs::MONO; qApp->displaySide(renderArgs, eyeCamera, false); qApp->getApplicationOverlay().displayOverlayTextureStereo(whichCamera, _aspect, fov); _activeEye = NULL; diff --git a/interface/src/devices/TV3DManager.h b/interface/src/devices/TV3DManager.h index e46447517a..330a4ee0ee 100644 --- a/interface/src/devices/TV3DManager.h +++ b/interface/src/devices/TV3DManager.h @@ -33,7 +33,7 @@ public: static void connect(); static bool isConnected(); static void configureCamera(Camera& camera, int screenWidth, int screenHeight); - static void display(RenderArgs& renderArgs, Camera& whichCamera); + static void display(RenderArgs* renderArgs, Camera& whichCamera); static void overrideOffAxisFrustum(float& left, float& right, float& bottom, float& top, float& nearVal, float& farVal, glm::vec4& nearClipPlane, glm::vec4& farClipPlane); private: diff --git a/interface/src/octree/OctreeFade.cpp b/interface/src/octree/OctreeFade.cpp index ad313bdb6d..881f3c5938 100644 --- a/interface/src/octree/OctreeFade.cpp +++ b/interface/src/octree/OctreeFade.cpp @@ -37,8 +37,8 @@ OctreeFade::OctreeFade(FadeDirection direction, float red, float green, float bl opacity = (direction == FADE_OUT) ? FADE_OUT_START : FADE_IN_START; } -void OctreeFade::render() { - DependencyManager::get()->begin(); +void OctreeFade::render(RenderArgs* renderArgs) { + DependencyManager::get()->begin(renderArgs); glDisable(GL_LIGHTING); glPushMatrix(); @@ -53,7 +53,7 @@ void OctreeFade::render() { glEnable(GL_LIGHTING); - DependencyManager::get()->end(); + DependencyManager::get()->end(renderArgs); opacity *= (direction == FADE_OUT) ? FADE_OUT_STEP : FADE_IN_STEP; } diff --git a/interface/src/octree/OctreeFade.h b/interface/src/octree/OctreeFade.h index daae9be66f..137a505537 100644 --- a/interface/src/octree/OctreeFade.h +++ b/interface/src/octree/OctreeFade.h @@ -39,7 +39,7 @@ public: OctreeFade(FadeDirection direction = FADE_OUT, float red = DEFAULT_RED, float green = DEFAULT_GREEN, float blue = DEFAULT_BLUE); - void render(); + void render(RenderArgs* renderArgs); bool isDone() const; }; diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 56937684af..c321b3f52a 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -185,7 +185,7 @@ ApplicationOverlay::~ApplicationOverlay() { } // Renders the overlays either to a texture or to the screen -void ApplicationOverlay::renderOverlay(RenderArgs& renderArgs) { +void ApplicationOverlay::renderOverlay(RenderArgs* renderArgs) { PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), "ApplicationOverlay::displayOverlay()"); Overlays& overlays = qApp->getOverlays(); @@ -222,7 +222,7 @@ void ApplicationOverlay::renderOverlay(RenderArgs& renderArgs) { // give external parties a change to hook in emit qApp->renderingOverlay(); - overlays.renderHUD(); + overlays.renderHUD(renderArgs); renderPointers(); diff --git a/interface/src/ui/ApplicationOverlay.h b/interface/src/ui/ApplicationOverlay.h index 33b35d1f91..e249f77e39 100644 --- a/interface/src/ui/ApplicationOverlay.h +++ b/interface/src/ui/ApplicationOverlay.h @@ -32,7 +32,7 @@ public: ApplicationOverlay(); ~ApplicationOverlay(); - void renderOverlay(RenderArgs& renderArgs); + void renderOverlay(RenderArgs* renderArgs); void displayOverlayTexture(); void displayOverlayTextureStereo(Camera& whichCamera, float aspectRatio, float fov); void displayOverlayTextureHmd(Camera& whichCamera); diff --git a/interface/src/ui/RearMirrorTools.cpp b/interface/src/ui/RearMirrorTools.cpp index ec73668d9e..94dd614edf 100644 --- a/interface/src/ui/RearMirrorTools.cpp +++ b/interface/src/ui/RearMirrorTools.cpp @@ -47,7 +47,7 @@ RearMirrorTools::RearMirrorTools(QRect& bounds) : _headZoomIconRect = QRect(_bounds.left() + ICON_PADDING, _bounds.bottom() - ICON_PADDING - ICON_SIZE, ICON_SIZE, ICON_SIZE); } -void RearMirrorTools::render(bool fullScreen, const QPoint & mousePosition) { +void RearMirrorTools::render(RenderArgs* renderArgs, bool fullScreen, const QPoint & mousePosition) { if (fullScreen) { _fullScreen = true; displayIcon(QRect(QPoint(), qApp->getDeviceSize()), _shrinkIconRect, _closeTexture); diff --git a/interface/src/ui/RearMirrorTools.h b/interface/src/ui/RearMirrorTools.h index 2b359c2d07..c633d72a49 100644 --- a/interface/src/ui/RearMirrorTools.h +++ b/interface/src/ui/RearMirrorTools.h @@ -24,7 +24,7 @@ class RearMirrorTools : public QObject { Q_OBJECT public: RearMirrorTools(QRect& bounds); - void render(bool fullScreen, const QPoint & mousePos); + void render(RenderArgs* renderArgs, bool fullScreen, const QPoint & mousePos); bool mousePressEvent(int x, int y); static Setting::Handle rearViewZoomLevel; diff --git a/interface/src/ui/overlays/LocalModelsOverlay.cpp b/interface/src/ui/overlays/LocalModelsOverlay.cpp index c9bc7315e8..b9ce245128 100644 --- a/interface/src/ui/overlays/LocalModelsOverlay.cpp +++ b/interface/src/ui/overlays/LocalModelsOverlay.cpp @@ -47,7 +47,7 @@ void LocalModelsOverlay::render(RenderArgs* args) { Application* app = Application::getInstance(); glm::vec3 oldTranslation = app->getViewMatrixTranslation(); app->setViewMatrixTranslation(oldTranslation + _position); - _entityTreeRenderer->render(*args); + _entityTreeRenderer->render(args); Application::getInstance()->setViewMatrixTranslation(oldTranslation); } glPopMatrix(); diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index 29d7c20f09..169b1ce388 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -68,7 +68,7 @@ void ModelOverlay::render(RenderArgs* args) { if (glowLevel > 0.0f) { glower = new Glower(glowLevel); } - _model.render(getAlpha(), RenderArgs::DEFAULT_RENDER_MODE, args); + _model.render(args, getAlpha()); if (glower) { delete glower; } diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index 0537c62b38..98e081ab66 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -82,34 +82,27 @@ void Overlays::update(float deltatime) { } -void Overlays::renderHUD() { +void Overlays::renderHUD(RenderArgs* renderArgs) { QReadLocker lock(&_lock); auto lodManager = DependencyManager::get(); - RenderArgs args(NULL, Application::getInstance()->getViewFrustum(), - lodManager->getOctreeSizeScale(), - lodManager->getBoundaryLevelAdjust(), - RenderArgs::DEFAULT_RENDER_MODE, RenderArgs::MONO, RenderArgs::RENDER_DEBUG_NONE); foreach(Overlay* thisOverlay, _overlaysHUD) { if (thisOverlay->is3D()) { glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); - thisOverlay->render(&args); + thisOverlay->render(renderArgs); glDisable(GL_LIGHTING); glDisable(GL_DEPTH_TEST); } else{ - thisOverlay->render(&args); + thisOverlay->render(renderArgs); } } } -void Overlays::renderWorld(bool drawFront, - RenderArgs::RenderMode renderMode, - RenderArgs::RenderSide renderSide, - RenderArgs::DebugFlags renderDebugFlags) { +void Overlays::renderWorld(RenderArgs* renderArgs, bool drawFront) { QReadLocker lock(&_lock); if (_overlaysWorld.size() == 0) { return; @@ -123,11 +116,6 @@ void Overlays::renderWorld(bool drawFront, float myAvatarScale = 1.0f; auto lodManager = DependencyManager::get(); - RenderArgs args(NULL, Application::getInstance()->getDisplayViewFrustum(), - lodManager->getOctreeSizeScale(), - lodManager->getBoundaryLevelAdjust(), - renderMode, renderSide, renderDebugFlags); - foreach(Overlay* thisOverlay, _overlaysWorld) { Base3DOverlay* overlay3D = static_cast(thisOverlay); @@ -154,7 +142,7 @@ void Overlays::renderWorld(bool drawFront, default: break; } - thisOverlay->render(&args); + thisOverlay->render(renderArgs); glPopMatrix(); } } diff --git a/interface/src/ui/overlays/Overlays.h b/interface/src/ui/overlays/Overlays.h index 04e306097b..530efd2012 100644 --- a/interface/src/ui/overlays/Overlays.h +++ b/interface/src/ui/overlays/Overlays.h @@ -53,10 +53,8 @@ public: ~Overlays(); void init(); void update(float deltatime); - void renderWorld(bool drawFront, RenderArgs::RenderMode renderMode = RenderArgs::DEFAULT_RENDER_MODE, - RenderArgs::RenderSide renderSide = RenderArgs::MONO, - RenderArgs::DebugFlags renderDebugFlags = RenderArgs::RENDER_DEBUG_NONE); - void renderHUD(); + void renderWorld(RenderArgs* renderArgs, bool drawFront); + void renderHUD(RenderArgs* renderArgs); public slots: /// adds an overlay with the specific properties diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 15a587872f..d2017fd6ff 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -474,11 +474,11 @@ void EntityTreeRenderer::applyZonePropertiesToScene(const ZoneEntityItem* zone) } } -void EntityTreeRenderer::render(RenderArgs& renderArgs) { +void EntityTreeRenderer::render(RenderArgs* renderArgs) { if (_tree && !_shuttingDown) { - Model::startScene(renderArgs._renderSide); + Model::startScene(renderArgs->_renderSide); - ViewFrustum* frustum = (renderArgs._renderMode == RenderArgs::SHADOW_RENDER_MODE) ? + ViewFrustum* frustum = (renderArgs->_renderMode == RenderArgs::SHADOW_RENDER_MODE) ? _viewState->getShadowViewFrustum() : _viewState->getCurrentViewFrustum(); // Setup batch transform matrices @@ -490,44 +490,44 @@ void EntityTreeRenderer::render(RenderArgs& renderArgs) { batch.setProjectionTransform(projMat); batch.setViewTransform(viewMat); - renderArgs._renderer = this; - renderArgs._batch = &batch; + renderArgs->_renderer = this; + renderArgs->_batch = &batch; _tree->lockForRead(); // Whenever you're in an intersection between zones, we will always choose the smallest zone. _bestZone = NULL; _bestZoneVolume = std::numeric_limits::max(); - _tree->recurseTreeWithOperation(renderOperation, &renderArgs); + _tree->recurseTreeWithOperation(renderOperation, renderArgs); applyZonePropertiesToScene(_bestZone); // we must call endScene while we still have the tree locked so that no one deletes a model // on us while rendering the scene - Model::endScene(renderArgs._renderMode, &renderArgs); + Model::endScene(renderArgs->_renderMode, renderArgs); _tree->unlock(); glPushMatrix(); - renderArgs._context->enqueueBatch(batch); + renderArgs->_context->enqueueBatch(batch); glPopMatrix(); // stats... - _meshesConsidered = renderArgs._meshesConsidered; - _meshesRendered = renderArgs._meshesRendered; - _meshesOutOfView = renderArgs._meshesOutOfView; - _meshesTooSmall = renderArgs._meshesTooSmall; + _meshesConsidered = renderArgs->_meshesConsidered; + _meshesRendered = renderArgs->_meshesRendered; + _meshesOutOfView = renderArgs->_meshesOutOfView; + _meshesTooSmall = renderArgs->_meshesTooSmall; - _elementsTouched = renderArgs._elementsTouched; - _itemsRendered = renderArgs._itemsRendered; - _itemsOutOfView = renderArgs._itemsOutOfView; - _itemsTooSmall = renderArgs._itemsTooSmall; + _elementsTouched = renderArgs->_elementsTouched; + _itemsRendered = renderArgs->_itemsRendered; + _itemsOutOfView = renderArgs->_itemsOutOfView; + _itemsTooSmall = renderArgs->_itemsTooSmall; - _materialSwitches = renderArgs._materialSwitches; - _trianglesRendered = renderArgs._trianglesRendered; - _quadsRendered = renderArgs._quadsRendered; + _materialSwitches = renderArgs->_materialSwitches; + _trianglesRendered = renderArgs->_trianglesRendered; + _quadsRendered = renderArgs->_quadsRendered; - _translucentMeshPartsRendered = renderArgs._translucentMeshPartsRendered; - _opaqueMeshPartsRendered = renderArgs._opaqueMeshPartsRendered; + _translucentMeshPartsRendered = renderArgs->_translucentMeshPartsRendered; + _opaqueMeshPartsRendered = renderArgs->_opaqueMeshPartsRendered; } deleteReleasedModels(); // seems like as good as any other place to do some memory cleanup } @@ -711,7 +711,7 @@ void EntityTreeRenderer::renderElement(OctreeElement* element, RenderArgs* args) Glower* glower = NULL; if (entityItem->getGlowLevel() > 0.0f) { - glower = new Glower(entityItem->getGlowLevel()); + glower = new Glower(args, entityItem->getGlowLevel()); } entityItem->render(args); args->_itemsRendered++; diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.h b/libraries/entities-renderer/src/EntityTreeRenderer.h index 79de554917..8c5cc72feb 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.h +++ b/libraries/entities-renderer/src/EntityTreeRenderer.h @@ -58,7 +58,7 @@ public: void processEraseMessage(const QByteArray& dataByteArray, const SharedNodePointer& sourceNode); virtual void init(); - virtual void render(RenderArgs& renderArgs) override; + virtual void render(RenderArgs* renderArgs) override; virtual const FBXGeometry* getGeometryForEntity(const EntityItem* entityItem); virtual const Model* getModelForEntityItem(const EntityItem* entityItem); diff --git a/libraries/octree/src/OctreeHeadlessViewer.h b/libraries/octree/src/OctreeHeadlessViewer.h index 90f7a2e805..70ee43be35 100644 --- a/libraries/octree/src/OctreeHeadlessViewer.h +++ b/libraries/octree/src/OctreeHeadlessViewer.h @@ -33,7 +33,7 @@ public: virtual void renderElement(OctreeElement* element, RenderArgs* args) { /* swallow these */ } virtual void init(); - virtual void render(RenderArgs& renderArgs) override { /* swallow these */ } + virtual void render(RenderArgs* renderArgs) override { /* swallow these */ } void setJurisdictionListener(JurisdictionListener* jurisdictionListener) { _jurisdictionListener = jurisdictionListener; } diff --git a/libraries/octree/src/OctreeRenderer.cpp b/libraries/octree/src/OctreeRenderer.cpp index f2fc3a16eb..246fab8578 100644 --- a/libraries/octree/src/OctreeRenderer.cpp +++ b/libraries/octree/src/OctreeRenderer.cpp @@ -164,29 +164,29 @@ bool OctreeRenderer::renderOperation(OctreeElement* element, void* extraData) { return false; } -void OctreeRenderer::render(RenderArgs& renderArgs) { +void OctreeRenderer::render(RenderArgs* renderArgs) { if (_tree) { - renderArgs._renderer = this; + renderArgs->_renderer = this; _tree->lockForRead(); - _tree->recurseTreeWithOperation(renderOperation, &renderArgs); + _tree->recurseTreeWithOperation(renderOperation, renderArgs); _tree->unlock(); } - _meshesConsidered = renderArgs._meshesConsidered; - _meshesRendered = renderArgs._meshesRendered; - _meshesOutOfView = renderArgs._meshesOutOfView; - _meshesTooSmall = renderArgs._meshesTooSmall; + _meshesConsidered = renderArgs->_meshesConsidered; + _meshesRendered = renderArgs->_meshesRendered; + _meshesOutOfView = renderArgs->_meshesOutOfView; + _meshesTooSmall = renderArgs->_meshesTooSmall; - _elementsTouched = renderArgs._elementsTouched; - _itemsRendered = renderArgs._itemsRendered; - _itemsOutOfView = renderArgs._itemsOutOfView; - _itemsTooSmall = renderArgs._itemsTooSmall; + _elementsTouched = renderArgs->_elementsTouched; + _itemsRendered = renderArgs->_itemsRendered; + _itemsOutOfView = renderArgs->_itemsOutOfView; + _itemsTooSmall = renderArgs->_itemsTooSmall; - _materialSwitches = renderArgs._materialSwitches; - _trianglesRendered = renderArgs._trianglesRendered; - _quadsRendered = renderArgs._quadsRendered; + _materialSwitches = renderArgs->_materialSwitches; + _trianglesRendered = renderArgs->_trianglesRendered; + _quadsRendered = renderArgs->_quadsRendered; - _translucentMeshPartsRendered = renderArgs._translucentMeshPartsRendered; - _opaqueMeshPartsRendered = renderArgs._opaqueMeshPartsRendered; + _translucentMeshPartsRendered = renderArgs->_translucentMeshPartsRendered; + _opaqueMeshPartsRendered = renderArgs->_opaqueMeshPartsRendered; } diff --git a/libraries/octree/src/OctreeRenderer.h b/libraries/octree/src/OctreeRenderer.h index 63d1889851..3172d3429d 100644 --- a/libraries/octree/src/OctreeRenderer.h +++ b/libraries/octree/src/OctreeRenderer.h @@ -51,7 +51,7 @@ public: virtual void init(); /// render the content of the octree - virtual void render(RenderArgs& renderArgs); + virtual void render(RenderArgs* renderArgs); ViewFrustum* getViewFrustum() const { return _viewFrustum; } void setViewFrustum(ViewFrustum* viewFrustum) { _viewFrustum = viewFrustum; } diff --git a/libraries/render-utils/src/GlowEffect.cpp b/libraries/render-utils/src/GlowEffect.cpp index bd0dfa0b5d..2e8b58c6c2 100644 --- a/libraries/render-utils/src/GlowEffect.cpp +++ b/libraries/render-utils/src/GlowEffect.cpp @@ -94,7 +94,7 @@ void GlowEffect::init(bool enabled) { _enabled = enabled; } -void GlowEffect::prepare(RenderArgs& renderArgs) { +void GlowEffect::prepare(RenderArgs* renderArgs) { auto primaryFBO = DependencyManager::get()->getPrimaryFramebuffer(); GLuint fbo = gpu::GLBackend::getFramebufferID(primaryFBO); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo); @@ -105,19 +105,19 @@ void GlowEffect::prepare(RenderArgs& renderArgs) { _isOddFrame = !_isOddFrame; } -void GlowEffect::begin(float intensity) { +void GlowEffect::begin(RenderArgs* renderArgs, float intensity) { // store the current intensity and add the new amount _intensityStack.push(_intensity); glBlendColor(0.0f, 0.0f, 0.0f, _intensity += intensity); _isEmpty &= (_intensity == 0.0f); } -void GlowEffect::end() { +void GlowEffect::end(RenderArgs* renderArgs) { // restore the saved intensity glBlendColor(0.0f, 0.0f, 0.0f, _intensity = _intensityStack.pop()); } -gpu::FramebufferPointer GlowEffect::render(RenderArgs& renderArgs) { +gpu::FramebufferPointer GlowEffect::render(RenderArgs* renderArgs) { PerformanceTimer perfTimer("glowEffect"); auto textureCache = DependencyManager::get(); @@ -212,10 +212,14 @@ void GlowEffect::toggleGlowEffect(bool enabled) { } Glower::Glower(float amount) { - DependencyManager::get()->begin(amount); + RenderArgs renderArgs; + DependencyManager::get()->begin(&renderArgs, amount); +} +Glower::Glower(RenderArgs* renderArgs, float amount) : _renderArgs(renderArgs) { + DependencyManager::get()->begin(_renderArgs, amount); } Glower::~Glower() { - DependencyManager::get()->end(); + DependencyManager::get()->end(_renderArgs); } diff --git a/libraries/render-utils/src/GlowEffect.h b/libraries/render-utils/src/GlowEffect.h index 9222556475..23a21a9575 100644 --- a/libraries/render-utils/src/GlowEffect.h +++ b/libraries/render-utils/src/GlowEffect.h @@ -39,14 +39,14 @@ public: void init(bool enabled); /// Prepares the glow effect for rendering the current frame. To be called before rendering the scene. - void prepare(RenderArgs& renderArgs); + void prepare(RenderArgs* renderArgs); /// Starts using the glow effect. /// \param intensity the desired glow intensity, from zero to one - void begin(float intensity = 1.0f); + void begin(RenderArgs* renderArgs, float intensity = 1.0f); /// Stops using the glow effect. - void end(); + void end(RenderArgs* renderArgs); /// Returns the current glow intensity. float getIntensity() const { return _intensity; } @@ -54,7 +54,7 @@ public: /// Renders the glow effect. To be called after rendering the scene. /// \param toTexture whether to render to a texture, rather than to the frame buffer /// \return the framebuffer object to which we rendered, or NULL if to the frame buffer - gpu::FramebufferPointer render(RenderArgs& renderArgs); + gpu::FramebufferPointer render(RenderArgs* renderArgs); public slots: void toggleGlowEffect(bool enabled); @@ -87,7 +87,11 @@ class Glower { public: Glower(float amount = 1.0f); + Glower(RenderArgs* renderArgs, float amount = 1.0f); ~Glower(); + +private: + RenderArgs* _renderArgs; }; #endif // hifi_GlowEffect_h diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 483ea6177e..ea7d399749 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -765,19 +765,19 @@ void Model::renderSetup(RenderArgs* args) { } } -bool Model::render(float alpha, RenderMode mode, RenderArgs* args) { +bool Model::render(RenderArgs* renderArgs, float alpha) { PROFILE_RANGE(__FUNCTION__); // render the attachments foreach (Model* attachment, _attachments) { - attachment->render(alpha, mode, args); + attachment->render(renderArgs, alpha); } if (_meshStates.isEmpty()) { return false; } - renderSetup(args); - return renderCore(alpha, mode, args); + renderSetup(renderArgs); + return renderCore(alpha, renderArgs->_renderMode, renderArgs); } bool Model::renderCore(float alpha, RenderMode mode, RenderArgs* args) { diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 8c8c35fb4a..f4c8889a38 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -98,7 +98,7 @@ public: void reset(); virtual void simulate(float deltaTime, bool fullUpdate = true); - bool render(float alpha = 1.0f, RenderArgs::RenderMode mode = RenderArgs::DEFAULT_RENDER_MODE, RenderArgs* args = NULL); + bool render(RenderArgs* renderArgs, float alpha = 1.0f); // Scene rendering support static void startScene(RenderArgs::RenderSide renderSide); From 71c0aa4913371350628c34c9f6d6fc235a2aa7df Mon Sep 17 00:00:00 2001 From: Eric Levin Date: Fri, 22 May 2015 15:33:38 -0700 Subject: [PATCH 15/23] renamed ajt-test to particles.js since ajt-test doesn't tell us anything about what the script does --- examples/{ajt-test.js => particles.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename examples/{ajt-test.js => particles.js} (100%) diff --git a/examples/ajt-test.js b/examples/particles.js similarity index 100% rename from examples/ajt-test.js rename to examples/particles.js From bffcfa2ab88da58ad996dd3f224d90064592379c Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 22 May 2015 15:34:05 -0700 Subject: [PATCH 16/23] Add cache sync flag in Context::enqueueBatch --- libraries/gpu/src/gpu/Context.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/gpu/src/gpu/Context.cpp b/libraries/gpu/src/gpu/Context.cpp index f4f398b6d7..78a6a6f607 100644 --- a/libraries/gpu/src/gpu/Context.cpp +++ b/libraries/gpu/src/gpu/Context.cpp @@ -32,5 +32,5 @@ bool Context::makeProgram(Shader& shader, const Shader::BindingSet& bindings) { } void Context::enqueueBatch(Batch& batch) { - GLBackend::renderBatch(batch); + GLBackend::renderBatch(batch, true); } From 1d1274478171e9b7558db73c75160ab2cba84b5a Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 22 May 2015 15:34:19 -0700 Subject: [PATCH 17/23] Remove commented out code --- interface/src/avatar/Avatar.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index aaa4a737f9..bf554f25bf 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -494,8 +494,6 @@ void Avatar::renderBody(RenderArgs* renderArgs, ViewFrustum* renderFrustum, bool if (postLighting) { getHand()->render(renderArgs, false); } else { - // RenderArgs args; - // args._viewFrustum = renderFrustum; _skeletonModel.render(renderArgs, 1.0f); renderAttachments(renderArgs); } From 7be646d62e339a41e56408e7097fdab68c594ef1 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 22 May 2015 16:02:10 -0700 Subject: [PATCH 18/23] Make gpu::context the first RenderArgs ctor parameter --- libraries/shared/src/RenderArgs.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/libraries/shared/src/RenderArgs.h b/libraries/shared/src/RenderArgs.h index ebb9214b85..e86389d705 100644 --- a/libraries/shared/src/RenderArgs.h +++ b/libraries/shared/src/RenderArgs.h @@ -31,7 +31,8 @@ public: RENDER_DEBUG_SIMULATION_OWNERSHIP = 2, }; - RenderArgs(OctreeRenderer* renderer = nullptr, + RenderArgs(gpu::Context* context = nullptr, + OctreeRenderer* renderer = nullptr, ViewFrustum* viewFrustum = nullptr, float sizeScale = 1.0f, int boundaryLevelAdjust = 0, @@ -39,7 +40,6 @@ public: RenderSide renderSide = MONO, DebugFlags debugFlags = RENDER_DEBUG_NONE, gpu::Batch* batch = nullptr, - gpu::Context* context = nullptr, int elementsTouched = 0, int itemsRendered = 0, @@ -57,6 +57,7 @@ public: int translucentMeshPartsRendered = 0, int opaqueMeshPartsRendered = 0) : + _context(context), _renderer(renderer), _viewFrustum(viewFrustum), _sizeScale(sizeScale), @@ -84,6 +85,7 @@ public: _opaqueMeshPartsRendered(opaqueMeshPartsRendered) { } + gpu::Context* _context; OctreeRenderer* _renderer; ViewFrustum* _viewFrustum; float _sizeScale; @@ -92,7 +94,6 @@ public: RenderSide _renderSide; DebugFlags _debugFlags; gpu::Batch* _batch; - gpu::Context* _context; int _elementsTouched; int _itemsRendered; From 05f8ba558f877325eac2568e0b93cd3758b56e37 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 22 May 2015 16:02:24 -0700 Subject: [PATCH 19/23] Update RenderArgs construction in paintGL --- interface/src/Application.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b3d98de018..fd0ff6ab11 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -834,12 +834,10 @@ void Application::paintGL() { _glWidget->makeCurrent(); auto lodManager = DependencyManager::get(); - RenderArgs renderArgs(NULL, Application::getInstance()->getViewFrustum(), - lodManager->getOctreeSizeScale(), - lodManager->getBoundaryLevelAdjust(), - RenderArgs::DEFAULT_RENDER_MODE, RenderArgs::MONO, RenderArgs::RENDER_DEBUG_NONE); gpu::Context context; - renderArgs._context = &context; + RenderArgs renderArgs(&context, nullptr, getViewFrustum(), lodManager->getOctreeSizeScale(), + lodManager->getBoundaryLevelAdjust(), RenderArgs::DEFAULT_RENDER_MODE, + RenderArgs::MONO, RenderArgs::RENDER_DEBUG_NONE); PerformanceTimer perfTimer("paintGL"); //Need accurate frame timing for the oculus rift From 47d9cf42c5519b9f2ee7ca7c7b96f67fd98c3ed5 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 22 May 2015 16:04:05 -0700 Subject: [PATCH 20/23] Remove unused lodManager --- interface/src/Application.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index fd0ff6ab11..b1a9f305d3 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3105,7 +3105,6 @@ QImage Application::renderAvatarBillboard(RenderArgs* renderArgs) { const int BILLBOARD_SIZE = 64; // TODO: Pass a RenderArgs to renderAvatarBillboard - auto lodManager = DependencyManager::get(); renderRearViewMirror(renderArgs, QRect(0, _glWidget->getDeviceHeight() - BILLBOARD_SIZE, BILLBOARD_SIZE, BILLBOARD_SIZE), true); From 8380eec03b023ef8b6a1c317b305a83d0da860ba Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 22 May 2015 16:10:43 -0700 Subject: [PATCH 21/23] Update Model::renderCore to use RenderArgs --- libraries/render-utils/src/Model.cpp | 6 ++++-- libraries/render-utils/src/Model.h | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 1d99e45801..58eea49d03 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -777,15 +777,17 @@ bool Model::render(RenderArgs* renderArgs, float alpha) { } renderSetup(renderArgs); - return renderCore(alpha, renderArgs->_renderMode, renderArgs); + return renderCore(renderArgs, alpha); } -bool Model::renderCore(float alpha, RenderMode mode, RenderArgs* args) { +bool Model::renderCore(RenderArgs* args, float alpha) { PROFILE_RANGE(__FUNCTION__); if (!_viewState) { return false; } + auto mode = args->_renderMode; + // Let's introduce a gpu::Batch to capture all the calls to the graphics api _renderBatch.clear(); gpu::Batch& batch = _renderBatch; diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index f4c8889a38..779fe3a649 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -371,7 +371,7 @@ private: // helper functions used by render() or renderInScene() void renderSetup(RenderArgs* args); - bool renderCore(float alpha, RenderArgs::RenderMode mode, RenderArgs* args); + bool renderCore(RenderArgs* args, float alpha); int renderMeshes(gpu::Batch& batch, RenderArgs::RenderMode mode, bool translucent, float alphaThreshold, bool hasLightmap, bool hasTangents, bool hasSpecular, bool isSkinned, bool isWireframe, RenderArgs* args = NULL, bool forceRenderMeshes = false); From 822ae800c5fe5a28bf8824bb69329a1f3c7e9e81 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 22 May 2015 16:17:01 -0700 Subject: [PATCH 22/23] Update Model::endScene to require RenderArgs --- libraries/entities-renderer/src/EntityTreeRenderer.cpp | 2 +- libraries/render-utils/src/Model.cpp | 4 +++- libraries/render-utils/src/Model.h | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 790b833753..a29033f35e 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -504,7 +504,7 @@ void EntityTreeRenderer::render(RenderArgs* renderArgs) { // we must call endScene while we still have the tree locked so that no one deletes a model // on us while rendering the scene - Model::endScene(renderArgs->_renderMode, renderArgs); + Model::endScene(renderArgs); _tree->unlock(); glPushMatrix(); diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 58eea49d03..e304e6ee05 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -1846,7 +1846,7 @@ void Model::setupBatchTransform(gpu::Batch& batch, RenderArgs* args) { batch.setViewTransform(_transforms[0]); } -void Model::endScene(RenderMode mode, RenderArgs* args) { +void Model::endScene(RenderArgs* args) { PROFILE_RANGE(__FUNCTION__); @@ -1855,6 +1855,8 @@ void Model::endScene(RenderMode mode, RenderArgs* args) { glPushMatrix(); #endif + auto mode = args->_renderMode; + RenderArgs::RenderSide renderSide = RenderArgs::MONO; if (args) { renderSide = args->_renderSide; diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 779fe3a649..66a1a87d1f 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -103,7 +103,7 @@ public: // Scene rendering support static void startScene(RenderArgs::RenderSide renderSide); bool renderInScene(float alpha = 1.0f, RenderArgs* args = NULL); - static void endScene(RenderArgs::RenderMode mode = RenderArgs::DEFAULT_RENDER_MODE, RenderArgs* args = NULL); + static void endScene(RenderArgs* args); /// Sets the URL of the model to render. /// \param fallback the URL of a fallback model to render if the requested model fails to load From 43317bc82963381a4e3e003056b8c88be1dba6ce Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 22 May 2015 17:00:39 -0700 Subject: [PATCH 23/23] Temporarily remove isValidScale assert --- libraries/shared/src/Transform.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/shared/src/Transform.h b/libraries/shared/src/Transform.h index f3b5b14385..5defb6f0f6 100644 --- a/libraries/shared/src/Transform.h +++ b/libraries/shared/src/Transform.h @@ -24,13 +24,13 @@ inline bool isValidScale(glm::vec3 scale) { bool result = scale.x != 0.0f && scale.y != 0.0f && scale.z != 0.0f; - assert(result); + // assert(result); return result; } inline bool isValidScale(float scale) { bool result = scale != 0.0f; - assert(result); + // assert(result); return result; }