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;