From 0a295fc258e9cdb620edd4b459630efe6dd4745f Mon Sep 17 00:00:00 2001 From: kunalgosar Date: Fri, 14 Apr 2017 13:56:13 -0700 Subject: [PATCH 01/11] setBlendshapes will presist --- interface/src/avatar/SkeletonModel.cpp | 2 +- libraries/avatars/src/AvatarData.cpp | 1 + libraries/avatars/src/AvatarData.h | 6 ++++++ libraries/avatars/src/HeadData.cpp | 13 ++++++++++--- libraries/avatars/src/HeadData.h | 2 ++ libraries/render-utils/src/Model.cpp | 1 + 6 files changed, 21 insertions(+), 4 deletions(-) diff --git a/interface/src/avatar/SkeletonModel.cpp b/interface/src/avatar/SkeletonModel.cpp index 0c11fa456d..9f13efe3b8 100644 --- a/interface/src/avatar/SkeletonModel.cpp +++ b/interface/src/avatar/SkeletonModel.cpp @@ -242,7 +242,7 @@ void SkeletonModel::updateAttitude() { void SkeletonModel::simulate(float deltaTime, bool fullUpdate) { updateAttitude(); if (fullUpdate) { - setBlendshapeCoefficients(_owningAvatar->getHead()->getBlendshapeCoefficients()); + setBlendshapeCoefficients(_owningAvatar->getHead()->getSummedBlendshapeCoefficients()); Model::simulate(deltaTime, fullUpdate); diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 9802630cf5..20894104ff 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -967,6 +967,7 @@ int AvatarData::parseDataFromBuffer(const QByteArray& buffer) { const int coefficientsSize = sizeof(float) * numCoefficients; PACKET_READ_CHECK(FaceTrackerCoefficients, coefficientsSize); _headData->_blendshapeCoefficients.resize(numCoefficients); // make sure there's room for the copy! + _headData->_baseBlendshapeCoefficients.resize(numCoefficients); memcpy(_headData->_blendshapeCoefficients.data(), sourceBuffer, coefficientsSize); sourceBuffer += coefficientsSize; int numBytesRead = sourceBuffer - startSection; diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 8319eb5249..79bcac5fcc 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -438,6 +438,12 @@ public: _headData->setBlendshapeCoefficients(blendshapeCoefficients); } } + + void setSummedBlendshapeCoefficients(QVector& blendshapeCoefficients) { + if (_headData) { + _headData->setSummedBlendshapeCoefficients(blendshapeCoefficients); + } + } // access to Head().set/getMousePitch (degrees) float getHeadPitch() const { return _headData->getBasePitch(); } diff --git a/libraries/avatars/src/HeadData.cpp b/libraries/avatars/src/HeadData.cpp index 909c6a613e..59b1a209e7 100644 --- a/libraries/avatars/src/HeadData.cpp +++ b/libraries/avatars/src/HeadData.cpp @@ -38,7 +38,8 @@ HeadData::HeadData(AvatarData* owningAvatar) : _rightEyeBlink(0.0f), _averageLoudness(0.0f), _browAudioLift(0.0f), - _owningAvatar(owningAvatar) + _owningAvatar(owningAvatar), + _baseBlendshapeCoefficients(0, 0), { } @@ -86,17 +87,23 @@ static const QMap& getBlendshapesLookupMap() { return blendshapeLookupMap; } +const QVector& HeadData::getSummedBlendshapeCoefficients() { + for (int i = 0; i < _baseBlendshapeCoefficients.size(); i++) { + _blendshapeCoefficients[i] += _baseBlendshapeCoefficients[i]; + } + return _blendshapeCoefficients; +} void HeadData::setBlendshape(QString name, float val) { const auto& blendshapeLookupMap = getBlendshapesLookupMap(); - //Check to see if the named blendshape exists, and then set its value if it does auto it = blendshapeLookupMap.find(name); if (it != blendshapeLookupMap.end()) { if (_blendshapeCoefficients.size() <= it.value()) { _blendshapeCoefficients.resize(it.value() + 1); + _baseBlendshapeCoefficients.resize(it.value() + 1); } - _blendshapeCoefficients[it.value()] = val; + _baseBlendshapeCoefficients[it.value()] = val; } } diff --git a/libraries/avatars/src/HeadData.h b/libraries/avatars/src/HeadData.h index 6c468daefd..ec542fe6a1 100644 --- a/libraries/avatars/src/HeadData.h +++ b/libraries/avatars/src/HeadData.h @@ -59,6 +59,7 @@ public: void setBlendshape(QString name, float val); const QVector& getBlendshapeCoefficients() const { return _blendshapeCoefficients; } + const QVector& getSummedBlendshapeCoefficients(); void setBlendshapeCoefficients(const QVector& blendshapeCoefficients) { _blendshapeCoefficients = blendshapeCoefficients; } const glm::vec3& getLookAtPosition() const { return _lookAtPosition; } @@ -92,6 +93,7 @@ protected: float _browAudioLift; QVector _blendshapeCoefficients; + QVector _baseBlendshapeCoefficients; AvatarData* _owningAvatar; private: diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index c274d69af6..ec82b0f606 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -901,6 +901,7 @@ Blender::Blender(ModelPointer model, int blendNumber, const Geometry::WeakPointe } void Blender::run() { + qDebug() << "!!!!!!!!!!!!!!" << _blendshapeCoefficients; PROFILE_RANGE_EX(simulation_animation, __FUNCTION__, 0xFFFF0000, 0, { { "url", _model->getURL().toString() } }); QVector vertices, normals; if (_model) { From d215856b238f8cc896fabadf5a1ab0815eecd8f5 Mon Sep 17 00:00:00 2001 From: kunalgosar Date: Fri, 14 Apr 2017 13:59:09 -0700 Subject: [PATCH 02/11] cleanup to blendshapes --- interface/src/avatar/SkeletonModel.cpp | 2 +- libraries/avatars/src/AvatarData.h | 6 ------ libraries/avatars/src/HeadData.cpp | 3 ++- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/interface/src/avatar/SkeletonModel.cpp b/interface/src/avatar/SkeletonModel.cpp index 9f13efe3b8..81a5bf38dc 100644 --- a/interface/src/avatar/SkeletonModel.cpp +++ b/interface/src/avatar/SkeletonModel.cpp @@ -242,7 +242,7 @@ void SkeletonModel::updateAttitude() { void SkeletonModel::simulate(float deltaTime, bool fullUpdate) { updateAttitude(); if (fullUpdate) { - setBlendshapeCoefficients(_owningAvatar->getHead()->getSummedBlendshapeCoefficients()); + setBlendshapeCoefficients(_owningAvatar->getHead()->getSummedBlendshapeCoefficients()); Model::simulate(deltaTime, fullUpdate); diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 79bcac5fcc..8319eb5249 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -438,12 +438,6 @@ public: _headData->setBlendshapeCoefficients(blendshapeCoefficients); } } - - void setSummedBlendshapeCoefficients(QVector& blendshapeCoefficients) { - if (_headData) { - _headData->setSummedBlendshapeCoefficients(blendshapeCoefficients); - } - } // access to Head().set/getMousePitch (degrees) float getHeadPitch() const { return _headData->getBasePitch(); } diff --git a/libraries/avatars/src/HeadData.cpp b/libraries/avatars/src/HeadData.cpp index 59b1a209e7..6c0f0d3b5c 100644 --- a/libraries/avatars/src/HeadData.cpp +++ b/libraries/avatars/src/HeadData.cpp @@ -39,7 +39,7 @@ HeadData::HeadData(AvatarData* owningAvatar) : _averageLoudness(0.0f), _browAudioLift(0.0f), _owningAvatar(owningAvatar), - _baseBlendshapeCoefficients(0, 0), + _baseBlendshapeCoefficients(0, 0) { } @@ -96,6 +96,7 @@ const QVector& HeadData::getSummedBlendshapeCoefficients() { void HeadData::setBlendshape(QString name, float val) { const auto& blendshapeLookupMap = getBlendshapesLookupMap(); + //Check to see if the named blendshape exists, and then set its value if it does auto it = blendshapeLookupMap.find(name); if (it != blendshapeLookupMap.end()) { From 06c5fa05856524030e81ace3778f73e32acce8fe Mon Sep 17 00:00:00 2001 From: kunalgosar Date: Fri, 14 Apr 2017 15:15:08 -0700 Subject: [PATCH 03/11] correctly resizing blendshapes vector --- libraries/avatars/src/HeadData.cpp | 5 ++++- libraries/render-utils/src/Model.cpp | 1 - 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/libraries/avatars/src/HeadData.cpp b/libraries/avatars/src/HeadData.cpp index 6c0f0d3b5c..1e059e04ba 100644 --- a/libraries/avatars/src/HeadData.cpp +++ b/libraries/avatars/src/HeadData.cpp @@ -15,6 +15,7 @@ #include #include +#include #include #include @@ -39,7 +40,7 @@ HeadData::HeadData(AvatarData* owningAvatar) : _averageLoudness(0.0f), _browAudioLift(0.0f), _owningAvatar(owningAvatar), - _baseBlendshapeCoefficients(0, 0) + _baseBlendshapeCoefficients(QVector(0, 0)) { } @@ -102,6 +103,8 @@ void HeadData::setBlendshape(QString name, float val) { if (it != blendshapeLookupMap.end()) { if (_blendshapeCoefficients.size() <= it.value()) { _blendshapeCoefficients.resize(it.value() + 1); + } + if (_baseBlendshapeCoefficients.size() <= it.value()) { _baseBlendshapeCoefficients.resize(it.value() + 1); } _baseBlendshapeCoefficients[it.value()] = val; diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index ec82b0f606..c274d69af6 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -901,7 +901,6 @@ Blender::Blender(ModelPointer model, int blendNumber, const Geometry::WeakPointe } void Blender::run() { - qDebug() << "!!!!!!!!!!!!!!" << _blendshapeCoefficients; PROFILE_RANGE_EX(simulation_animation, __FUNCTION__, 0xFFFF0000, 0, { { "url", _model->getURL().toString() } }); QVector vertices, normals; if (_model) { From ffdbc12968257b527d4f3cbb2376ca9bc30bc94e Mon Sep 17 00:00:00 2001 From: kunalgosar Date: Tue, 18 Apr 2017 12:20:03 -0700 Subject: [PATCH 04/11] copy into new vector --- libraries/avatars/src/HeadData.cpp | 23 ++++++++++++++++++----- libraries/avatars/src/HeadData.h | 1 + 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/libraries/avatars/src/HeadData.cpp b/libraries/avatars/src/HeadData.cpp index 1e059e04ba..271ce133a2 100644 --- a/libraries/avatars/src/HeadData.cpp +++ b/libraries/avatars/src/HeadData.cpp @@ -39,8 +39,9 @@ HeadData::HeadData(AvatarData* owningAvatar) : _rightEyeBlink(0.0f), _averageLoudness(0.0f), _browAudioLift(0.0f), - _owningAvatar(owningAvatar), - _baseBlendshapeCoefficients(QVector(0, 0)) + _baseBlendshapeCoefficients(QVector(0, 0.0f)), + _currBlendShapeCoefficients(QVector(0, 0.0f)), + _owningAvatar(owningAvatar) { } @@ -89,10 +90,22 @@ static const QMap& getBlendshapesLookupMap() { } const QVector& HeadData::getSummedBlendshapeCoefficients() { - for (int i = 0; i < _baseBlendshapeCoefficients.size(); i++) { - _blendshapeCoefficients[i] += _baseBlendshapeCoefficients[i]; + int maxSize = std::max(_baseBlendshapeCoefficients.size(), _blendshapeCoefficients.size()); + if (_currBlendShapeCoefficients.size() != maxSize) { + _currBlendShapeCoefficients.resize(maxSize); } - return _blendshapeCoefficients; + + for (int i = 0; i < maxSize; i++) { + if (i >= _baseBlendshapeCoefficients.size()) { + _currBlendShapeCoefficients[i] = _blendshapeCoefficients[i]; + } else if (i >= _blendshapeCoefficients.size()) { + _currBlendShapeCoefficients[i] = _baseBlendshapeCoefficients[i]; + } else { + _currBlendShapeCoefficients[i] = _baseBlendshapeCoefficients[i] + _blendshapeCoefficients[i]; + } + } + + return _currBlendShapeCoefficients; } void HeadData::setBlendshape(QString name, float val) { diff --git a/libraries/avatars/src/HeadData.h b/libraries/avatars/src/HeadData.h index ec542fe6a1..dbed0a6a65 100644 --- a/libraries/avatars/src/HeadData.h +++ b/libraries/avatars/src/HeadData.h @@ -94,6 +94,7 @@ protected: QVector _blendshapeCoefficients; QVector _baseBlendshapeCoefficients; + QVector _currBlendShapeCoefficients; AvatarData* _owningAvatar; private: From c7a7fa90ec370d8350f58ecce858e6b8ae0dec5f Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Tue, 18 Apr 2017 18:43:56 -0400 Subject: [PATCH 05/11] update Display menu on unsuccesful selection --- interface/src/Application.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index c6cd185034..9a8203f644 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -6778,6 +6778,13 @@ void Application::updateDisplayMode() { if (!active) { qFatal("Failed to activate fallback plugin"); } + + // We've changed the selection - it should be reflected in the menu + QAction* action = menu->getActionForOption(newDisplayPlugin->getName()); + if (!action) { + qFatal("Failed to find activated plugin"); + } + action->setChecked(true); } _offscreenContext->makeCurrent(); From 63fe579022f6aa1408402f61e8b7b87c89d37d95 Mon Sep 17 00:00:00 2001 From: samcake Date: Tue, 18 Apr 2017 17:05:40 -0700 Subject: [PATCH 06/11] simply removing the SceneContext from the engine/task run call since we never used it and can unify into the RenderContext instead' --- .../src/AmbientOcclusionEffect.cpp | 4 +-- .../render-utils/src/AmbientOcclusionEffect.h | 4 +-- .../render-utils/src/AntialiasingEffect.cpp | 2 +- .../render-utils/src/AntialiasingEffect.h | 2 +- .../render-utils/src/DebugDeferredBuffer.cpp | 2 +- .../render-utils/src/DebugDeferredBuffer.h | 2 +- .../src/DeferredFrameTransform.cpp | 2 +- .../render-utils/src/DeferredFrameTransform.h | 2 +- .../src/DeferredLightingEffect.cpp | 18 +++++------ .../render-utils/src/DeferredLightingEffect.h | 12 ++++---- libraries/render-utils/src/HitEffect.cpp | 2 +- libraries/render-utils/src/HitEffect.h | 2 +- libraries/render-utils/src/LightClusters.cpp | 4 +-- libraries/render-utils/src/LightClusters.h | 4 +-- libraries/render-utils/src/LightingModel.cpp | 2 +- libraries/render-utils/src/LightingModel.h | 2 +- .../render-utils/src/RenderDeferredTask.cpp | 26 ++++++++-------- .../render-utils/src/RenderDeferredTask.h | 16 +++++----- .../render-utils/src/RenderForwardTask.cpp | 12 ++++---- .../render-utils/src/RenderForwardTask.h | 8 ++--- .../render-utils/src/RenderShadowTask.cpp | 10 +++---- libraries/render-utils/src/RenderShadowTask.h | 6 ++-- .../render-utils/src/SubsurfaceScattering.cpp | 4 +-- .../render-utils/src/SubsurfaceScattering.h | 4 +-- .../render-utils/src/SurfaceGeometryPass.cpp | 4 +-- .../render-utils/src/SurfaceGeometryPass.h | 4 +-- .../render-utils/src/ToneMappingEffect.cpp | 2 +- .../render-utils/src/ToneMappingEffect.h | 2 +- libraries/render/src/render/BlurTask.cpp | 4 +-- libraries/render/src/render/BlurTask.h | 4 +-- libraries/render/src/render/Context.h | 11 ++----- libraries/render/src/render/CullTask.cpp | 12 ++++---- libraries/render/src/render/CullTask.h | 6 ++-- .../render/src/render/DrawSceneOctree.cpp | 10 +++---- libraries/render/src/render/DrawSceneOctree.h | 4 +-- libraries/render/src/render/DrawStatus.cpp | 6 ++-- libraries/render/src/render/DrawStatus.h | 2 +- libraries/render/src/render/DrawTask.cpp | 18 +++++------ libraries/render/src/render/DrawTask.h | 10 +++---- libraries/render/src/render/Engine.cpp | 1 - libraries/render/src/render/Engine.h | 8 ++--- libraries/render/src/render/EngineStats.cpp | 2 +- libraries/render/src/render/EngineStats.h | 2 +- libraries/render/src/render/FilterTask.cpp | 18 +++++------ libraries/render/src/render/FilterTask.h | 14 ++++----- libraries/render/src/render/SortTask.cpp | 16 +++++----- libraries/render/src/render/SortTask.h | 8 ++--- libraries/render/src/render/Task.h | 30 +++++++++---------- tests/gpu-test/src/TestWindow.cpp | 10 +++---- tests/gpu-test/src/TestWindow.h | 1 - 50 files changed, 173 insertions(+), 188 deletions(-) diff --git a/libraries/render-utils/src/AmbientOcclusionEffect.cpp b/libraries/render-utils/src/AmbientOcclusionEffect.cpp index 678d8b1baf..9f4a71ef08 100644 --- a/libraries/render-utils/src/AmbientOcclusionEffect.cpp +++ b/libraries/render-utils/src/AmbientOcclusionEffect.cpp @@ -338,7 +338,7 @@ void AmbientOcclusionEffect::updateGaussianDistribution() { GaussianDistribution::evalSampling(coefs, Parameters::GAUSSIAN_COEFS_LENGTH, _parametersBuffer->getBlurRadius(), _parametersBuffer->getBlurDeviation()); } -void AmbientOcclusionEffect::run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const Inputs& inputs, Outputs& outputs) { +void AmbientOcclusionEffect::run(const render::RenderContextPointer& renderContext, const Inputs& inputs, Outputs& outputs) { assert(renderContext->args); assert(renderContext->args->hasViewFrustum()); @@ -478,7 +478,7 @@ const gpu::PipelinePointer& DebugAmbientOcclusion::getDebugPipeline() { return _debugPipeline; } -void DebugAmbientOcclusion::run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const Inputs& inputs) { +void DebugAmbientOcclusion::run(const render::RenderContextPointer& renderContext, const Inputs& inputs) { assert(renderContext->args); assert(renderContext->args->hasViewFrustum()); diff --git a/libraries/render-utils/src/AmbientOcclusionEffect.h b/libraries/render-utils/src/AmbientOcclusionEffect.h index 4e41926f9f..92d0f1d375 100644 --- a/libraries/render-utils/src/AmbientOcclusionEffect.h +++ b/libraries/render-utils/src/AmbientOcclusionEffect.h @@ -114,7 +114,7 @@ public: AmbientOcclusionEffect(); void configure(const Config& config); - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const Inputs& inputs, Outputs& outputs); + void run(const render::RenderContextPointer& renderContext, const Inputs& inputs, Outputs& outputs); // Class describing the uniform buffer with all the parameters common to the AO shaders @@ -200,7 +200,7 @@ public: DebugAmbientOcclusion(); void configure(const Config& config); - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const Inputs& inputs); + void run(const render::RenderContextPointer& renderContext, const Inputs& inputs); private: diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index f11d62acbe..9a81320416 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -100,7 +100,7 @@ const gpu::PipelinePointer& Antialiasing::getBlendPipeline() { return _blendPipeline; } -void Antialiasing::run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const gpu::FramebufferPointer& sourceBuffer) { +void Antialiasing::run(const render::RenderContextPointer& renderContext, const gpu::FramebufferPointer& sourceBuffer) { assert(renderContext->args); assert(renderContext->args->hasViewFrustum()); diff --git a/libraries/render-utils/src/AntialiasingEffect.h b/libraries/render-utils/src/AntialiasingEffect.h index bc0ab28d95..e403032b4e 100644 --- a/libraries/render-utils/src/AntialiasingEffect.h +++ b/libraries/render-utils/src/AntialiasingEffect.h @@ -31,7 +31,7 @@ public: Antialiasing(); ~Antialiasing(); void configure(const Config& config) {} - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const gpu::FramebufferPointer& sourceBuffer); + void run(const render::RenderContextPointer& renderContext, const gpu::FramebufferPointer& sourceBuffer); const gpu::PipelinePointer& getAntialiasingPipeline(); const gpu::PipelinePointer& getBlendPipeline(); diff --git a/libraries/render-utils/src/DebugDeferredBuffer.cpp b/libraries/render-utils/src/DebugDeferredBuffer.cpp index e534628c83..a67d20c6b0 100644 --- a/libraries/render-utils/src/DebugDeferredBuffer.cpp +++ b/libraries/render-utils/src/DebugDeferredBuffer.cpp @@ -391,7 +391,7 @@ void DebugDeferredBuffer::configure(const Config& config) { _size = config.size; } -void DebugDeferredBuffer::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const Inputs& inputs) { +void DebugDeferredBuffer::run(const RenderContextPointer& renderContext, const Inputs& inputs) { if (_mode == Off) { return; } diff --git a/libraries/render-utils/src/DebugDeferredBuffer.h b/libraries/render-utils/src/DebugDeferredBuffer.h index be775e052f..bd5618f5be 100644 --- a/libraries/render-utils/src/DebugDeferredBuffer.h +++ b/libraries/render-utils/src/DebugDeferredBuffer.h @@ -45,7 +45,7 @@ public: ~DebugDeferredBuffer(); void configure(const Config& config); - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const Inputs& inputs); + void run(const render::RenderContextPointer& renderContext, const Inputs& inputs); protected: friend class DebugDeferredBufferConfig; diff --git a/libraries/render-utils/src/DeferredFrameTransform.cpp b/libraries/render-utils/src/DeferredFrameTransform.cpp index 2f9d7b016a..b1166437db 100644 --- a/libraries/render-utils/src/DeferredFrameTransform.cpp +++ b/libraries/render-utils/src/DeferredFrameTransform.cpp @@ -63,7 +63,7 @@ void DeferredFrameTransform::update(RenderArgs* args) { } } -void GenerateDeferredFrameTransform::run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, DeferredFrameTransformPointer& frameTransform) { +void GenerateDeferredFrameTransform::run(const render::RenderContextPointer& renderContext, DeferredFrameTransformPointer& frameTransform) { if (!frameTransform) { frameTransform = std::make_shared(); } diff --git a/libraries/render-utils/src/DeferredFrameTransform.h b/libraries/render-utils/src/DeferredFrameTransform.h index df47396a38..84be943998 100644 --- a/libraries/render-utils/src/DeferredFrameTransform.h +++ b/libraries/render-utils/src/DeferredFrameTransform.h @@ -70,7 +70,7 @@ public: GenerateDeferredFrameTransform() {} - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, DeferredFrameTransformPointer& frameTransform); + void run(const render::RenderContextPointer& renderContext, DeferredFrameTransformPointer& frameTransform); private: }; diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index dc1822c0f5..7167e8cba8 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -479,7 +479,7 @@ model::MeshPointer DeferredLightingEffect::getSpotLightMesh() { return _spotLightMesh; } -void PreparePrimaryFramebuffer::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, gpu::FramebufferPointer& primaryFramebuffer) { +void PreparePrimaryFramebuffer::run(const RenderContextPointer& renderContext, gpu::FramebufferPointer& primaryFramebuffer) { auto framebufferCache = DependencyManager::get(); auto framebufferSize = framebufferCache->getFrameBufferSize(); @@ -512,7 +512,7 @@ void PreparePrimaryFramebuffer::run(const SceneContextPointer& sceneContext, con primaryFramebuffer = _primaryFramebuffer; } -void PrepareDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const Inputs& inputs, Outputs& outputs) { +void PrepareDeferred::run(const RenderContextPointer& renderContext, const Inputs& inputs, Outputs& outputs) { auto args = renderContext->args; auto primaryFramebuffer = inputs.get0(); @@ -553,7 +553,7 @@ void PrepareDeferred::run(const SceneContextPointer& sceneContext, const RenderC } -void RenderDeferredSetup::run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, +void RenderDeferredSetup::run(const render::RenderContextPointer& renderContext, const DeferredFrameTransformPointer& frameTransform, const DeferredFramebufferPointer& deferredFramebuffer, const LightingModelPointer& lightingModel, @@ -681,7 +681,7 @@ RenderDeferredLocals::RenderDeferredLocals() : } -void RenderDeferredLocals::run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, +void RenderDeferredLocals::run(const render::RenderContextPointer& renderContext, const DeferredFrameTransformPointer& frameTransform, const DeferredFramebufferPointer& deferredFramebuffer, const LightingModelPointer& lightingModel, @@ -746,7 +746,7 @@ void RenderDeferredLocals::run(const render::SceneContextPointer& sceneContext, } } -void RenderDeferredCleanup::run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext) { +void RenderDeferredCleanup::run(const render::RenderContextPointer& renderContext) { auto args = renderContext->args; auto& batch = (*args->_batch); { @@ -792,7 +792,7 @@ RenderDeferred::RenderDeferred() { void RenderDeferred::configure(const Config& config) { } -void RenderDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const Inputs& inputs) { +void RenderDeferred::run(const RenderContextPointer& renderContext, const Inputs& inputs) { PROFILE_RANGE(render, "DeferredLighting"); auto deferredTransform = inputs.get0(); @@ -813,11 +813,11 @@ void RenderDeferred::run(const SceneContextPointer& sceneContext, const RenderCo args->_batch = &batch; _gpuTimer->begin(batch); - setupJob.run(sceneContext, renderContext, deferredTransform, deferredFramebuffer, lightingModel, surfaceGeometryFramebuffer, ssaoFramebuffer, subsurfaceScatteringResource); + setupJob.run(renderContext, deferredTransform, deferredFramebuffer, lightingModel, surfaceGeometryFramebuffer, ssaoFramebuffer, subsurfaceScatteringResource); - lightsJob.run(sceneContext, renderContext, deferredTransform, deferredFramebuffer, lightingModel, surfaceGeometryFramebuffer, lightClusters); + lightsJob.run(renderContext, deferredTransform, deferredFramebuffer, lightingModel, surfaceGeometryFramebuffer, lightClusters); - cleanupJob.run(sceneContext, renderContext); + cleanupJob.run(renderContext); _gpuTimer->end(batch); args->_context->appendFrameBatch(batch); diff --git a/libraries/render-utils/src/DeferredLightingEffect.h b/libraries/render-utils/src/DeferredLightingEffect.h index d2b8dd42b2..c5e694cb18 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.h +++ b/libraries/render-utils/src/DeferredLightingEffect.h @@ -127,7 +127,7 @@ class PreparePrimaryFramebuffer { public: using JobModel = render::Job::ModelO; - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, gpu::FramebufferPointer& primaryFramebuffer); + void run(const render::RenderContextPointer& renderContext, gpu::FramebufferPointer& primaryFramebuffer); gpu::FramebufferPointer _primaryFramebuffer; }; @@ -141,7 +141,7 @@ public: using JobModel = render::Job::ModelIO; - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const Inputs& inputs, Outputs& outputs); + void run(const render::RenderContextPointer& renderContext, const Inputs& inputs, Outputs& outputs); DeferredFramebufferPointer _deferredFramebuffer; }; @@ -150,7 +150,7 @@ class RenderDeferredSetup { public: // using JobModel = render::Job::ModelI; - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, + void run(const render::RenderContextPointer& renderContext, const DeferredFrameTransformPointer& frameTransform, const DeferredFramebufferPointer& deferredFramebuffer, const LightingModelPointer& lightingModel, @@ -163,7 +163,7 @@ class RenderDeferredLocals { public: using JobModel = render::Job::ModelI; - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, + void run(const render::RenderContextPointer& renderContext, const DeferredFrameTransformPointer& frameTransform, const DeferredFramebufferPointer& deferredFramebuffer, const LightingModelPointer& lightingModel, @@ -181,7 +181,7 @@ class RenderDeferredCleanup { public: using JobModel = render::Job::Model; - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext); + void run(const render::RenderContextPointer& renderContext); }; using RenderDeferredConfig = render::GPUJobConfig; @@ -196,7 +196,7 @@ public: void configure(const Config& config); - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const Inputs& inputs); + void run(const render::RenderContextPointer& renderContext, const Inputs& inputs); RenderDeferredSetup setupJob; RenderDeferredLocals lightsJob; diff --git a/libraries/render-utils/src/HitEffect.cpp b/libraries/render-utils/src/HitEffect.cpp index 9fb4c5bcd4..319e94384f 100644 --- a/libraries/render-utils/src/HitEffect.cpp +++ b/libraries/render-utils/src/HitEffect.cpp @@ -68,7 +68,7 @@ const gpu::PipelinePointer& HitEffect::getHitEffectPipeline() { return _hitEffectPipeline; } -void HitEffect::run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext) { +void HitEffect::run(const render::RenderContextPointer& renderContext) { assert(renderContext->args); assert(renderContext->args->hasViewFrustum()); RenderArgs* args = renderContext->args; diff --git a/libraries/render-utils/src/HitEffect.h b/libraries/render-utils/src/HitEffect.h index ea14ac231d..d025d2d980 100644 --- a/libraries/render-utils/src/HitEffect.h +++ b/libraries/render-utils/src/HitEffect.h @@ -26,7 +26,7 @@ public: HitEffect(); ~HitEffect(); void configure(const Config& config) {} - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext); + void run(const render::RenderContextPointer& renderContext); const gpu::PipelinePointer& getHitEffectPipeline(); diff --git a/libraries/render-utils/src/LightClusters.cpp b/libraries/render-utils/src/LightClusters.cpp index d6c20f8f28..4145264b2d 100644 --- a/libraries/render-utils/src/LightClusters.cpp +++ b/libraries/render-utils/src/LightClusters.cpp @@ -558,7 +558,7 @@ void LightClusteringPass::configure(const Config& config) { _freeze = config.freeze; } -void LightClusteringPass::run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const Inputs& inputs, Outputs& output) { +void LightClusteringPass::run(const render::RenderContextPointer& renderContext, const Inputs& inputs, Outputs& output) { auto args = renderContext->args; auto deferredTransform = inputs.get0(); @@ -697,7 +697,7 @@ const gpu::PipelinePointer DebugLightClusters::getDrawClusterContentPipeline() { } -void DebugLightClusters::run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const Inputs& inputs) { +void DebugLightClusters::run(const render::RenderContextPointer& renderContext, const Inputs& inputs) { if (!(doDrawClusterFromDepth || doDrawContent || doDrawGrid)) { return; } diff --git a/libraries/render-utils/src/LightClusters.h b/libraries/render-utils/src/LightClusters.h index d27a6e1d92..105d6fb139 100644 --- a/libraries/render-utils/src/LightClusters.h +++ b/libraries/render-utils/src/LightClusters.h @@ -176,7 +176,7 @@ public: void configure(const Config& config); - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const Inputs& inputs, Outputs& output); + void run(const render::RenderContextPointer& renderContext, const Inputs& inputs, Outputs& output); protected: LightClustersPointer _lightClusters; @@ -221,7 +221,7 @@ public: void configure(const Config& config); - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const Inputs& inputs); + void run(const render::RenderContextPointer& renderContext, const Inputs& inputs); protected: gpu::BufferPointer _gridBuffer; diff --git a/libraries/render-utils/src/LightingModel.cpp b/libraries/render-utils/src/LightingModel.cpp index bd321bad95..30801ac69e 100644 --- a/libraries/render-utils/src/LightingModel.cpp +++ b/libraries/render-utils/src/LightingModel.cpp @@ -179,7 +179,7 @@ void MakeLightingModel::configure(const Config& config) { _lightingModel->setWireframe(config.enableWireframe); } -void MakeLightingModel::run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, LightingModelPointer& lightingModel) { +void MakeLightingModel::run(const render::RenderContextPointer& renderContext, LightingModelPointer& lightingModel) { lightingModel = _lightingModel; diff --git a/libraries/render-utils/src/LightingModel.h b/libraries/render-utils/src/LightingModel.h index c1189d5160..26fb4faac5 100644 --- a/libraries/render-utils/src/LightingModel.h +++ b/libraries/render-utils/src/LightingModel.h @@ -171,7 +171,7 @@ public: MakeLightingModel(); void configure(const Config& config); - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, LightingModelPointer& lightingModel); + void run(const render::RenderContextPointer& renderContext, LightingModelPointer& lightingModel); private: LightingModelPointer _lightingModel; diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 35bf9c0bde..08d4f0fc68 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -218,14 +218,14 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren task.addJob("Blit", primaryFramebuffer); } -void BeginGPURangeTimer::run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, gpu::RangeTimerPointer& timer) { +void BeginGPURangeTimer::run(const render::RenderContextPointer& renderContext, gpu::RangeTimerPointer& timer) { timer = _gpuTimer; gpu::doInBatch(renderContext->args->_context, [&](gpu::Batch& batch) { _gpuTimer->begin(batch); }); } -void EndGPURangeTimer::run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const gpu::RangeTimerPointer& timer) { +void EndGPURangeTimer::run(const render::RenderContextPointer& renderContext, const gpu::RangeTimerPointer& timer) { gpu::doInBatch(renderContext->args->_context, [&](gpu::Batch& batch) { timer->end(batch); }); @@ -235,7 +235,7 @@ void EndGPURangeTimer::run(const render::SceneContextPointer& sceneContext, cons } -void DrawDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const Inputs& inputs) { +void DrawDeferred::run(const RenderContextPointer& renderContext, const Inputs& inputs) { assert(renderContext->args); assert(renderContext->args->hasViewFrustum()); @@ -272,7 +272,7 @@ void DrawDeferred::run(const SceneContextPointer& sceneContext, const RenderCont ShapeKey globalKey = keyBuilder.build(); args->_globalShapeKey = globalKey._flags.to_ulong(); - renderShapes(sceneContext, renderContext, _shapePlumber, inItems, _maxDrawn, globalKey); + renderShapes(renderContext, _shapePlumber, inItems, _maxDrawn, globalKey); args->_batch = nullptr; args->_globalShapeKey = 0; @@ -281,7 +281,7 @@ void DrawDeferred::run(const SceneContextPointer& sceneContext, const RenderCont config->setNumDrawn((int)inItems.size()); } -void DrawStateSortDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const Inputs& inputs) { +void DrawStateSortDeferred::run(const RenderContextPointer& renderContext, const Inputs& inputs) { assert(renderContext->args); assert(renderContext->args->hasViewFrustum()); @@ -319,9 +319,9 @@ void DrawStateSortDeferred::run(const SceneContextPointer& sceneContext, const R args->_globalShapeKey = globalKey._flags.to_ulong(); if (_stateSort) { - renderStateSortShapes(sceneContext, renderContext, _shapePlumber, inItems, _maxDrawn, globalKey); + renderStateSortShapes(renderContext, _shapePlumber, inItems, _maxDrawn, globalKey); } else { - renderShapes(sceneContext, renderContext, _shapePlumber, inItems, _maxDrawn, globalKey); + renderShapes(renderContext, _shapePlumber, inItems, _maxDrawn, globalKey); } args->_batch = nullptr; args->_globalShapeKey = 0; @@ -336,7 +336,7 @@ DrawOverlay3D::DrawOverlay3D(bool opaque) : initOverlay3DPipelines(*_shapePlumber); } -void DrawOverlay3D::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const Inputs& inputs) { +void DrawOverlay3D::run(const RenderContextPointer& renderContext, const Inputs& inputs) { assert(renderContext->args); assert(renderContext->args->hasViewFrustum()); @@ -378,7 +378,7 @@ void DrawOverlay3D::run(const SceneContextPointer& sceneContext, const RenderCon // Setup lighting model for all items; batch.setUniformBuffer(render::ShapePipeline::Slot::LIGHTING_MODEL, lightingModel->getParametersBuffer()); - renderShapes(sceneContext, renderContext, _shapePlumber, inItems, _maxDrawn); + renderShapes(renderContext, _shapePlumber, inItems, _maxDrawn); args->_batch = nullptr; }); } @@ -403,7 +403,7 @@ gpu::PipelinePointer DrawStencilDeferred::getOpaquePipeline() { return _opaquePipeline; } -void DrawStencilDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const DeferredFramebufferPointer& deferredFramebuffer) { +void DrawStencilDeferred::run(const RenderContextPointer& renderContext, const DeferredFramebufferPointer& deferredFramebuffer) { assert(renderContext->args); assert(renderContext->args->hasViewFrustum()); @@ -430,7 +430,7 @@ void DrawStencilDeferred::run(const SceneContextPointer& sceneContext, const Ren args->_batch = nullptr; } -void DrawBackgroundDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const Inputs& inputs) { +void DrawBackgroundDeferred::run(const RenderContextPointer& renderContext, const Inputs& inputs) { assert(renderContext->args); assert(renderContext->args->hasViewFrustum()); @@ -458,7 +458,7 @@ void DrawBackgroundDeferred::run(const SceneContextPointer& sceneContext, const batch.setProjectionTransform(projMat); batch.setViewTransform(viewMat); - renderItems(sceneContext, renderContext, inItems); + renderItems(renderContext, inItems); // _gpuTimer.end(batch); }); args->_batch = nullptr; @@ -466,7 +466,7 @@ void DrawBackgroundDeferred::run(const SceneContextPointer& sceneContext, const // std::static_pointer_cast(renderContext->jobConfig)->gpuTime = _gpuTimer.getAverage(); } -void Blit::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const gpu::FramebufferPointer& srcFramebuffer) { +void Blit::run(const RenderContextPointer& renderContext, const gpu::FramebufferPointer& srcFramebuffer) { assert(renderContext->args); assert(renderContext->args->_context); diff --git a/libraries/render-utils/src/RenderDeferredTask.h b/libraries/render-utils/src/RenderDeferredTask.h index 660cae88b0..12ecd5ecaf 100644 --- a/libraries/render-utils/src/RenderDeferredTask.h +++ b/libraries/render-utils/src/RenderDeferredTask.h @@ -23,7 +23,7 @@ public: BeginGPURangeTimer(const std::string& name) : _gpuTimer(std::make_shared(name)) {} - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, gpu::RangeTimerPointer& timer); + void run(const render::RenderContextPointer& renderContext, gpu::RangeTimerPointer& timer); protected: gpu::RangeTimerPointer _gpuTimer; @@ -39,7 +39,7 @@ public: EndGPURangeTimer() {} void configure(const Config& config) {} - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const gpu::RangeTimerPointer& timer); + void run(const render::RenderContextPointer& renderContext, const gpu::RangeTimerPointer& timer); protected: }; @@ -74,7 +74,7 @@ public: DrawDeferred(render::ShapePlumberPointer shapePlumber) : _shapePlumber{ shapePlumber } {} void configure(const Config& config) { _maxDrawn = config.maxDrawn; } - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const Inputs& inputs); + void run(const render::RenderContextPointer& renderContext, const Inputs& inputs); protected: render::ShapePlumberPointer _shapePlumber; @@ -112,7 +112,7 @@ public: DrawStateSortDeferred(render::ShapePlumberPointer shapePlumber) : _shapePlumber{ shapePlumber } {} void configure(const Config& config) { _maxDrawn = config.maxDrawn; _stateSort = config.stateSort; } - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const Inputs& inputs); + void run(const render::RenderContextPointer& renderContext, const Inputs& inputs); protected: render::ShapePlumberPointer _shapePlumber; @@ -125,7 +125,7 @@ class DrawStencilDeferred { public: using JobModel = render::Job::ModelI>; - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const std::shared_ptr& deferredFramebuffer); + void run(const render::RenderContextPointer& renderContext, const std::shared_ptr& deferredFramebuffer); protected: gpu::PipelinePointer _opaquePipeline; @@ -143,7 +143,7 @@ public: using JobModel = render::Job::ModelI; void configure(const Config& config) {} - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const Inputs& inputs); + void run(const render::RenderContextPointer& renderContext, const Inputs& inputs); protected: gpu::RangeTimerPointer _gpuTimer; @@ -177,7 +177,7 @@ public: DrawOverlay3D(bool opaque); void configure(const Config& config) { _maxDrawn = config.maxDrawn; } - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const Inputs& inputs); + void run(const render::RenderContextPointer& renderContext, const Inputs& inputs); protected: render::ShapePlumberPointer _shapePlumber; @@ -189,7 +189,7 @@ class Blit { public: using JobModel = render::Job::ModelI; - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const gpu::FramebufferPointer& srcFramebuffer); + void run(const render::RenderContextPointer& renderContext, const gpu::FramebufferPointer& srcFramebuffer); }; class RenderDeferredTask { diff --git a/libraries/render-utils/src/RenderForwardTask.cpp b/libraries/render-utils/src/RenderForwardTask.cpp index 8a9d7dfbf3..46a7128fee 100755 --- a/libraries/render-utils/src/RenderForwardTask.cpp +++ b/libraries/render-utils/src/RenderForwardTask.cpp @@ -59,7 +59,7 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend task.addJob("Blit", framebuffer); } -void PrepareFramebuffer::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, +void PrepareFramebuffer::run(const RenderContextPointer& renderContext, gpu::FramebufferPointer& framebuffer) { auto framebufferCache = DependencyManager::get(); auto framebufferSize = framebufferCache->getFrameBufferSize(); @@ -100,7 +100,7 @@ void PrepareFramebuffer::run(const SceneContextPointer& sceneContext, const Rend framebuffer = _framebuffer; } -void Draw::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, +void Draw::run(const RenderContextPointer& renderContext, const Inputs& items) { RenderArgs* args = renderContext->args; @@ -117,7 +117,7 @@ void Draw::run(const SceneContextPointer& sceneContext, const RenderContextPoint batch.setModelTransform(Transform()); // Render items - renderStateSortShapes(sceneContext, renderContext, _shapePlumber, items, -1); + renderStateSortShapes(renderContext, _shapePlumber, items, -1); }); args->_batch = nullptr; } @@ -142,7 +142,7 @@ const gpu::PipelinePointer Stencil::getPipeline() { return _stencilPipeline; } -void Stencil::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { +void Stencil::run(const RenderContextPointer& renderContext) { RenderArgs* args = renderContext->args; gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { @@ -158,7 +158,7 @@ void Stencil::run(const SceneContextPointer& sceneContext, const RenderContextPo args->_batch = nullptr; } -void DrawBackground::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, +void DrawBackground::run(const RenderContextPointer& renderContext, const Inputs& background) { RenderArgs* args = renderContext->args; @@ -177,7 +177,7 @@ void DrawBackground::run(const SceneContextPointer& sceneContext, const RenderCo batch.setProjectionTransform(projMat); batch.setViewTransform(viewMat); - renderItems(sceneContext, renderContext, background); + renderItems(renderContext, background); }); args->_batch = nullptr; } diff --git a/libraries/render-utils/src/RenderForwardTask.h b/libraries/render-utils/src/RenderForwardTask.h index f78ce8f317..63d087b3c5 100755 --- a/libraries/render-utils/src/RenderForwardTask.h +++ b/libraries/render-utils/src/RenderForwardTask.h @@ -31,7 +31,7 @@ public: using Inputs = gpu::FramebufferPointer; using JobModel = render::Job::ModelO; - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, + void run(const render::RenderContextPointer& renderContext, gpu::FramebufferPointer& framebuffer); private: @@ -44,7 +44,7 @@ public: using JobModel = render::Job::ModelI; Draw(const render::ShapePlumberPointer& shapePlumber) : _shapePlumber(shapePlumber) {} - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, + void run(const render::RenderContextPointer& renderContext, const Inputs& items); private: @@ -55,7 +55,7 @@ class Stencil { public: using JobModel = render::Job::Model; - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext); + void run(const render::RenderContextPointer& renderContext); private: const gpu::PipelinePointer getPipeline(); @@ -67,7 +67,7 @@ public: using Inputs = render::ItemBounds; using JobModel = render::Job::ModelI; - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, + void run(const render::RenderContextPointer& renderContext, const Inputs& background); }; diff --git a/libraries/render-utils/src/RenderShadowTask.cpp b/libraries/render-utils/src/RenderShadowTask.cpp index ddfe038a1a..0a4371cccd 100644 --- a/libraries/render-utils/src/RenderShadowTask.cpp +++ b/libraries/render-utils/src/RenderShadowTask.cpp @@ -31,7 +31,7 @@ using namespace render; -void RenderShadowMap::run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, +void RenderShadowMap::run(const render::RenderContextPointer& renderContext, const render::ShapeBounds& inShapes) { assert(renderContext->args); assert(renderContext->args->hasViewFrustum()); @@ -74,7 +74,7 @@ void RenderShadowMap::run(const render::SceneContextPointer& sceneContext, const if (items.first.isSkinned()) { skinnedShapeKeys.push_back(items.first); } else { - renderItems(sceneContext, renderContext, items.second); + renderItems(renderContext, items.second); } } @@ -82,7 +82,7 @@ void RenderShadowMap::run(const render::SceneContextPointer& sceneContext, const args->_pipeline = shadowSkinnedPipeline; batch.setPipeline(shadowSkinnedPipeline->pipeline); for (const auto& key : skinnedShapeKeys) { - renderItems(sceneContext, renderContext, inShapes.at(key)); + renderItems(renderContext, inShapes.at(key)); } args->_pipeline = nullptr; @@ -139,7 +139,7 @@ void RenderShadowTask::configure(const Config& configuration) { // Task::configure(configuration); } -void RenderShadowSetup::run(const SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, Output& output) { +void RenderShadowSetup::run(const render::RenderContextPointer& renderContext, Output& output) { auto lightStage = DependencyManager::get()->getLightStage(); const auto globalShadow = lightStage->getShadow(0); @@ -157,7 +157,7 @@ void RenderShadowSetup::run(const SceneContextPointer& sceneContext, const rende args->_renderMode = RenderArgs::SHADOW_RENDER_MODE; } -void RenderShadowTeardown::run(const SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const Input& input) { +void RenderShadowTeardown::run(const render::RenderContextPointer& renderContext, const Input& input) { RenderArgs* args = renderContext->args; // Reset the render args diff --git a/libraries/render-utils/src/RenderShadowTask.h b/libraries/render-utils/src/RenderShadowTask.h index 9190034b2e..a044028e4d 100644 --- a/libraries/render-utils/src/RenderShadowTask.h +++ b/libraries/render-utils/src/RenderShadowTask.h @@ -24,7 +24,7 @@ public: using JobModel = render::Job::ModelI; RenderShadowMap(render::ShapePlumberPointer shapePlumber) : _shapePlumber{ shapePlumber } {} - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, + void run(const render::RenderContextPointer& renderContext, const render::ShapeBounds& inShapes); protected: @@ -56,14 +56,14 @@ class RenderShadowSetup { public: using Output = RenderArgs::RenderMode; using JobModel = render::Job::ModelO; - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, Output& output); + void run(const render::RenderContextPointer& renderContext, Output& output); }; class RenderShadowTeardown { public: using Input = RenderArgs::RenderMode; using JobModel = render::Job::ModelI; - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const Input& input); + void run(const render::RenderContextPointer& renderContext, const Input& input); }; #endif // hifi_RenderShadowTask_h diff --git a/libraries/render-utils/src/SubsurfaceScattering.cpp b/libraries/render-utils/src/SubsurfaceScattering.cpp index a57657a353..c92acc11ad 100644 --- a/libraries/render-utils/src/SubsurfaceScattering.cpp +++ b/libraries/render-utils/src/SubsurfaceScattering.cpp @@ -134,7 +134,7 @@ void SubsurfaceScattering::configure(const Config& config) { _scatteringResource->setShowDiffusedNormal(config.showDiffusedNormal); } -void SubsurfaceScattering::run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, Outputs& outputs) { +void SubsurfaceScattering::run(const render::RenderContextPointer& renderContext, Outputs& outputs) { assert(renderContext->args); assert(renderContext->args->hasViewFrustum()); @@ -506,7 +506,7 @@ gpu::PipelinePointer DebugSubsurfaceScattering::getShowLUTPipeline() { } -void DebugSubsurfaceScattering::run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const Inputs& inputs) { +void DebugSubsurfaceScattering::run(const render::RenderContextPointer& renderContext, const Inputs& inputs) { assert(renderContext->args); assert(renderContext->args->hasViewFrustum()); diff --git a/libraries/render-utils/src/SubsurfaceScattering.h b/libraries/render-utils/src/SubsurfaceScattering.h index 715d9bc77b..30021fae40 100644 --- a/libraries/render-utils/src/SubsurfaceScattering.h +++ b/libraries/render-utils/src/SubsurfaceScattering.h @@ -132,7 +132,7 @@ public: SubsurfaceScattering(); void configure(const Config& config); - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, Outputs& outputs); + void run(const render::RenderContextPointer& renderContext, Outputs& outputs); private: SubsurfaceScatteringResourcePointer _scatteringResource; @@ -170,7 +170,7 @@ public: DebugSubsurfaceScattering(); void configure(const Config& config); - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const Inputs& inputs); + void run(const render::RenderContextPointer& renderContext, const Inputs& inputs); private: diff --git a/libraries/render-utils/src/SurfaceGeometryPass.cpp b/libraries/render-utils/src/SurfaceGeometryPass.cpp index a4a83bb6c5..164aca0624 100644 --- a/libraries/render-utils/src/SurfaceGeometryPass.cpp +++ b/libraries/render-utils/src/SurfaceGeometryPass.cpp @@ -133,7 +133,7 @@ LinearDepthPass::LinearDepthPass() { void LinearDepthPass::configure(const Config& config) { } -void LinearDepthPass::run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const Inputs& inputs, Outputs& outputs) { +void LinearDepthPass::run(const render::RenderContextPointer& renderContext, const Inputs& inputs, Outputs& outputs) { assert(renderContext->args); assert(renderContext->args->hasViewFrustum()); @@ -404,7 +404,7 @@ void SurfaceGeometryPass::configure(const Config& config) { } -void SurfaceGeometryPass::run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const Inputs& inputs, Outputs& outputs) { +void SurfaceGeometryPass::run(const render::RenderContextPointer& renderContext, const Inputs& inputs, Outputs& outputs) { assert(renderContext->args); assert(renderContext->args->hasViewFrustum()); diff --git a/libraries/render-utils/src/SurfaceGeometryPass.h b/libraries/render-utils/src/SurfaceGeometryPass.h index 6d830f9a28..859bcaa07a 100644 --- a/libraries/render-utils/src/SurfaceGeometryPass.h +++ b/libraries/render-utils/src/SurfaceGeometryPass.h @@ -74,7 +74,7 @@ public: LinearDepthPass(); void configure(const Config& config); - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const Inputs& inputs, Outputs& outputs); + void run(const render::RenderContextPointer& renderContext, const Inputs& inputs, Outputs& outputs); private: typedef gpu::BufferView UniformBufferView; @@ -169,7 +169,7 @@ public: SurfaceGeometryPass(); void configure(const Config& config); - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const Inputs& inputs, Outputs& outputs); + void run(const render::RenderContextPointer& renderContext, const Inputs& inputs, Outputs& outputs); float getCurvatureDepthThreshold() const { return _parametersBuffer.get().curvatureInfo.x; } diff --git a/libraries/render-utils/src/ToneMappingEffect.cpp b/libraries/render-utils/src/ToneMappingEffect.cpp index 24c62fb7c2..d54481d246 100644 --- a/libraries/render-utils/src/ToneMappingEffect.cpp +++ b/libraries/render-utils/src/ToneMappingEffect.cpp @@ -88,7 +88,7 @@ void ToneMappingDeferred::configure(const Config& config) { _toneMappingEffect.setToneCurve((ToneMappingEffect::ToneCurve)config.curve); } -void ToneMappingDeferred::run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const Inputs& inputs) { +void ToneMappingDeferred::run(const render::RenderContextPointer& renderContext, const Inputs& inputs) { auto lightingBuffer = inputs.get0()->getRenderBuffer(0); auto destFbo = inputs.get1(); diff --git a/libraries/render-utils/src/ToneMappingEffect.h b/libraries/render-utils/src/ToneMappingEffect.h index 9e8b3f6aa4..13dffd16a7 100644 --- a/libraries/render-utils/src/ToneMappingEffect.h +++ b/libraries/render-utils/src/ToneMappingEffect.h @@ -89,7 +89,7 @@ public: using JobModel = render::Job::ModelI; void configure(const Config& config); - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const Inputs& inputs); + void run(const render::RenderContextPointer& renderContext, const Inputs& inputs); ToneMappingEffect _toneMappingEffect; }; diff --git a/libraries/render/src/render/BlurTask.cpp b/libraries/render/src/render/BlurTask.cpp index b0329b22a5..2fc7dc0ea0 100644 --- a/libraries/render/src/render/BlurTask.cpp +++ b/libraries/render/src/render/BlurTask.cpp @@ -200,7 +200,7 @@ void BlurGaussian::configure(const Config& config) { } -void BlurGaussian::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const gpu::FramebufferPointer& sourceFramebuffer, gpu::FramebufferPointer& blurredFramebuffer) { +void BlurGaussian::run(const RenderContextPointer& renderContext, const gpu::FramebufferPointer& sourceFramebuffer, gpu::FramebufferPointer& blurredFramebuffer) { assert(renderContext->args); assert(renderContext->args->hasViewFrustum()); @@ -308,7 +308,7 @@ void BlurGaussianDepthAware::configure(const Config& config) { } -void BlurGaussianDepthAware::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const Inputs& SourceAndDepth, gpu::FramebufferPointer& blurredFramebuffer) { +void BlurGaussianDepthAware::run(const RenderContextPointer& renderContext, const Inputs& SourceAndDepth, gpu::FramebufferPointer& blurredFramebuffer) { assert(renderContext->args); assert(renderContext->args->hasViewFrustum()); diff --git a/libraries/render/src/render/BlurTask.h b/libraries/render/src/render/BlurTask.h index a00a444af7..f023aabfe7 100644 --- a/libraries/render/src/render/BlurTask.h +++ b/libraries/render/src/render/BlurTask.h @@ -105,7 +105,7 @@ public: BlurGaussian(bool generateOutputFramebuffer = false); void configure(const Config& config); - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const gpu::FramebufferPointer& sourceFramebuffer, gpu::FramebufferPointer& blurredFramebuffer); + void run(const RenderContextPointer& renderContext, const gpu::FramebufferPointer& sourceFramebuffer, gpu::FramebufferPointer& blurredFramebuffer); protected: @@ -141,7 +141,7 @@ public: BlurGaussianDepthAware(bool generateNewOutput = false, const BlurParamsPointer& params = BlurParamsPointer()); void configure(const Config& config); - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const Inputs& SourceAndDepth, gpu::FramebufferPointer& blurredFramebuffer); + void run(const RenderContextPointer& renderContext, const Inputs& SourceAndDepth, gpu::FramebufferPointer& blurredFramebuffer); const BlurParamsPointer& getParameters() const { return _parameters; } diff --git a/libraries/render/src/render/Context.h b/libraries/render/src/render/Context.h index 04cf373146..cb0fc65d40 100644 --- a/libraries/render/src/render/Context.h +++ b/libraries/render/src/render/Context.h @@ -16,20 +16,13 @@ namespace render { -class SceneContext { -public: - ScenePointer _scene; - - SceneContext() {} -}; -using SceneContextPointer = std::shared_ptr; - -class JobConfig; + class JobConfig; class RenderContext { public: RenderArgs* args; std::shared_ptr jobConfig{ nullptr }; + ScenePointer _scene; }; using RenderContextPointer = std::shared_ptr; diff --git a/libraries/render/src/render/CullTask.cpp b/libraries/render/src/render/CullTask.cpp index e4ba5af13f..4fc53d99f9 100644 --- a/libraries/render/src/render/CullTask.cpp +++ b/libraries/render/src/render/CullTask.cpp @@ -61,10 +61,10 @@ void render::cullItems(const RenderContextPointer& renderContext, const CullFunc details._rendered += (int)outItems.size(); } -void FetchNonspatialItems::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, ItemBounds& outItems) { +void FetchNonspatialItems::run(const RenderContextPointer& renderContext, ItemBounds& outItems) { assert(renderContext->args); assert(renderContext->args->hasViewFrustum()); - auto& scene = sceneContext->_scene; + auto& scene = renderContext->_scene; outItems.clear(); @@ -82,11 +82,11 @@ void FetchSpatialTree::configure(const Config& config) { _lodAngle = config.lodAngle; } -void FetchSpatialTree::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, ItemSpatialTree::ItemSelection& outSelection) { +void FetchSpatialTree::run(const RenderContextPointer& renderContext, ItemSpatialTree::ItemSelection& outSelection) { assert(renderContext->args); assert(renderContext->args->hasViewFrustum()); RenderArgs* args = renderContext->args; - auto& scene = sceneContext->_scene; + auto& scene = renderContext->_scene; // start fresh outSelection.clear(); @@ -112,12 +112,12 @@ void CullSpatialSelection::configure(const Config& config) { _skipCulling = config.skipCulling; } -void CullSpatialSelection::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, +void CullSpatialSelection::run(const RenderContextPointer& renderContext, const ItemSpatialTree::ItemSelection& inSelection, ItemBounds& outItems) { assert(renderContext->args); assert(renderContext->args->hasViewFrustum()); RenderArgs* args = renderContext->args; - auto& scene = sceneContext->_scene; + auto& scene = renderContext->_scene; auto& details = args->_details.edit(_detailType); details._considered += (int)inSelection.numItems(); diff --git a/libraries/render/src/render/CullTask.h b/libraries/render/src/render/CullTask.h index 243b16e733..fae2a342a1 100644 --- a/libraries/render/src/render/CullTask.h +++ b/libraries/render/src/render/CullTask.h @@ -25,7 +25,7 @@ namespace render { class FetchNonspatialItems { public: using JobModel = Job::ModelO; - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, ItemBounds& outItems); + void run(const RenderContextPointer& renderContext, ItemBounds& outItems); }; class FetchSpatialTreeConfig : public Job::Config { @@ -63,7 +63,7 @@ namespace render { ItemFilter _filter{ ItemFilter::Builder::opaqueShape().withoutLayered() }; void configure(const Config& config); - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, ItemSpatialTree::ItemSelection& outSelection); + void run(const RenderContextPointer& renderContext, ItemSpatialTree::ItemSelection& outSelection); }; class CullSpatialSelectionConfig : public Job::Config { @@ -106,7 +106,7 @@ namespace render { ItemFilter _filter{ ItemFilter::Builder::opaqueShape().withoutLayered() }; void configure(const Config& config); - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemSpatialTree::ItemSelection& inSelection, ItemBounds& outItems); + void run(const RenderContextPointer& renderContext, const ItemSpatialTree::ItemSelection& inSelection, ItemBounds& outItems); }; } diff --git a/libraries/render/src/render/DrawSceneOctree.cpp b/libraries/render/src/render/DrawSceneOctree.cpp index eac3113662..c48a9ddbe3 100644 --- a/libraries/render/src/render/DrawSceneOctree.cpp +++ b/libraries/render/src/render/DrawSceneOctree.cpp @@ -84,12 +84,11 @@ void DrawSceneOctree::configure(const Config& config) { } -void DrawSceneOctree::run(const SceneContextPointer& sceneContext, - const RenderContextPointer& renderContext, const ItemSpatialTree::ItemSelection& inSelection) { +void DrawSceneOctree::run(const RenderContextPointer& renderContext, const ItemSpatialTree::ItemSelection& inSelection) { assert(renderContext->args); assert(renderContext->args->hasViewFrustum()); RenderArgs* args = renderContext->args; - auto& scene = sceneContext->_scene; + auto& scene = renderContext->_scene; std::static_pointer_cast(renderContext->jobConfig)->numAllocatedCells = (int)scene->getSpatialTree().getNumAllocatedCells(); std::static_pointer_cast(renderContext->jobConfig)->numFreeCells = (int)scene->getSpatialTree().getNumFreeCells(); @@ -196,12 +195,11 @@ void DrawItemSelection::configure(const Config& config) { } -void DrawItemSelection::run(const SceneContextPointer& sceneContext, - const RenderContextPointer& renderContext, const ItemSpatialTree::ItemSelection& inSelection) { +void DrawItemSelection::run(const RenderContextPointer& renderContext, const ItemSpatialTree::ItemSelection& inSelection) { assert(renderContext->args); assert(renderContext->args->hasViewFrustum()); RenderArgs* args = renderContext->args; - auto& scene = sceneContext->_scene; + auto& scene = renderContext->_scene; gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { glm::mat4 projMat; diff --git a/libraries/render/src/render/DrawSceneOctree.h b/libraries/render/src/render/DrawSceneOctree.h index 530b7accac..4838e34c57 100644 --- a/libraries/render/src/render/DrawSceneOctree.h +++ b/libraries/render/src/render/DrawSceneOctree.h @@ -71,7 +71,7 @@ namespace render { DrawSceneOctree() {} void configure(const Config& config); - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemSpatialTree::ItemSelection& selection); + void run(const RenderContextPointer& renderContext, const ItemSpatialTree::ItemSelection& selection); const gpu::PipelinePointer getDrawCellBoundsPipeline(); const gpu::PipelinePointer getDrawLODReticlePipeline(); @@ -129,7 +129,7 @@ namespace render { DrawItemSelection() {} void configure(const Config& config); - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemSpatialTree::ItemSelection& selection); + void run(const RenderContextPointer& renderContext, const ItemSpatialTree::ItemSelection& selection); const gpu::PipelinePointer getDrawItemBoundPipeline(); }; diff --git a/libraries/render/src/render/DrawStatus.cpp b/libraries/render/src/render/DrawStatus.cpp index ec0a64d7a5..d6275a8d7a 100644 --- a/libraries/render/src/render/DrawStatus.cpp +++ b/libraries/render/src/render/DrawStatus.cpp @@ -103,13 +103,11 @@ void DrawStatus::configure(const Config& config) { _showNetwork = config.showNetwork; } -void DrawStatus::run(const SceneContextPointer& sceneContext, - const RenderContextPointer& renderContext, - const ItemBounds& inItems) { +void DrawStatus::run(const RenderContextPointer& renderContext, const ItemBounds& inItems) { assert(renderContext->args); assert(renderContext->args->hasViewFrustum()); RenderArgs* args = renderContext->args; - auto& scene = sceneContext->_scene; + auto& scene = renderContext->_scene; const int NUM_STATUS_VEC4_PER_ITEM = 2; const int VEC4_LENGTH = 4; diff --git a/libraries/render/src/render/DrawStatus.h b/libraries/render/src/render/DrawStatus.h index e60cb58779..2e0adb4653 100644 --- a/libraries/render/src/render/DrawStatus.h +++ b/libraries/render/src/render/DrawStatus.h @@ -45,7 +45,7 @@ namespace render { DrawStatus(const gpu::TexturePointer statusIconMap) { setStatusIconMap(statusIconMap); } void configure(const Config& config); - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems); + void run(const RenderContextPointer& renderContext, const ItemBounds& inItems); const gpu::PipelinePointer getDrawItemBoundsPipeline(); const gpu::PipelinePointer getDrawItemStatusPipeline(); diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index 3deb15a320..ed9975e2e5 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -25,8 +25,8 @@ using namespace render; -void render::renderItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems, int maxDrawnItems) { - auto& scene = sceneContext->_scene; +void render::renderItems(const RenderContextPointer& renderContext, const ItemBounds& inItems, int maxDrawnItems) { + auto& scene = renderContext->_scene; RenderArgs* args = renderContext->args; int numItemsToDraw = (int)inItems.size(); @@ -55,9 +55,9 @@ void renderShape(RenderArgs* args, const ShapePlumberPointer& shapeContext, cons } } -void render::renderShapes(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, +void render::renderShapes(const RenderContextPointer& renderContext, const ShapePlumberPointer& shapeContext, const ItemBounds& inItems, int maxDrawnItems, const ShapeKey& globalKey) { - auto& scene = sceneContext->_scene; + auto& scene = renderContext->_scene; RenderArgs* args = renderContext->args; int numItemsToDraw = (int)inItems.size(); @@ -70,9 +70,9 @@ void render::renderShapes(const SceneContextPointer& sceneContext, const RenderC } } -void render::renderStateSortShapes(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, +void render::renderStateSortShapes(const RenderContextPointer& renderContext, const ShapePlumberPointer& shapeContext, const ItemBounds& inItems, int maxDrawnItems, const ShapeKey& globalKey) { - auto& scene = sceneContext->_scene; + auto& scene = renderContext->_scene; RenderArgs* args = renderContext->args; int numItemsToDraw = (int)inItems.size(); @@ -123,7 +123,7 @@ void render::renderStateSortShapes(const SceneContextPointer& sceneContext, cons } } -void DrawLight::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inLights) { +void DrawLight::run(const RenderContextPointer& renderContext, const ItemBounds& inLights) { assert(renderContext->args); assert(renderContext->args->hasViewFrustum()); RenderArgs* args = renderContext->args; @@ -131,7 +131,7 @@ void DrawLight::run(const SceneContextPointer& sceneContext, const RenderContext // render lights gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { args->_batch = &batch; - renderItems(sceneContext, renderContext, inLights, _maxDrawn); + renderItems(renderContext, inLights, _maxDrawn); args->_batch = nullptr; }); @@ -163,7 +163,7 @@ const gpu::PipelinePointer DrawBounds::getPipeline() { return _boundsPipeline; } -void DrawBounds::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, +void DrawBounds::run(const RenderContextPointer& renderContext, const Inputs& items) { RenderArgs* args = renderContext->args; diff --git a/libraries/render/src/render/DrawTask.h b/libraries/render/src/render/DrawTask.h index 9a74802888..317aaf1e25 100755 --- a/libraries/render/src/render/DrawTask.h +++ b/libraries/render/src/render/DrawTask.h @@ -16,9 +16,9 @@ namespace render { -void renderItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems, int maxDrawnItems = -1); -void renderShapes(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ShapePlumberPointer& shapeContext, const ItemBounds& inItems, int maxDrawnItems = -1, const ShapeKey& globalKey = ShapeKey()); -void renderStateSortShapes(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ShapePlumberPointer& shapeContext, const ItemBounds& inItems, int maxDrawnItems = -1, const ShapeKey& globalKey = ShapeKey()); +void renderItems(const RenderContextPointer& renderContext, const ItemBounds& inItems, int maxDrawnItems = -1); +void renderShapes(const RenderContextPointer& renderContext, const ShapePlumberPointer& shapeContext, const ItemBounds& inItems, int maxDrawnItems = -1, const ShapeKey& globalKey = ShapeKey()); +void renderStateSortShapes(const RenderContextPointer& renderContext, const ShapePlumberPointer& shapeContext, const ItemBounds& inItems, int maxDrawnItems = -1, const ShapeKey& globalKey = ShapeKey()); class DrawLightConfig : public Job::Config { Q_OBJECT @@ -43,7 +43,7 @@ public: using JobModel = Job::ModelI; void configure(const Config& config) { _maxDrawn = config.maxDrawn; } - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inLights); + void run(const RenderContextPointer& renderContext, const ItemBounds& inLights); protected: int _maxDrawn; // initialized by Config }; @@ -59,7 +59,7 @@ public: using JobModel = render::Job::ModelI; void configure(const Config& configuration) {} - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, + void run(const render::RenderContextPointer& renderContext, const Inputs& items); private: diff --git a/libraries/render/src/render/Engine.cpp b/libraries/render/src/render/Engine.cpp index 08efb7b281..b3372a9305 100644 --- a/libraries/render/src/render/Engine.cpp +++ b/libraries/render/src/render/Engine.cpp @@ -35,7 +35,6 @@ public: }; Engine::Engine() : Task("Engine", EngineTask::JobModel::create()), - _sceneContext(std::make_shared()), _renderContext(std::make_shared()) { } diff --git a/libraries/render/src/render/Engine.h b/libraries/render/src/render/Engine.h index de8340c33e..68d86e6c16 100644 --- a/libraries/render/src/render/Engine.h +++ b/libraries/render/src/render/Engine.h @@ -32,18 +32,16 @@ namespace render { void load(); // Register the scene - void registerScene(const ScenePointer& scene) { _sceneContext->_scene = scene; } + void registerScene(const ScenePointer& scene) { _renderContext->_scene = scene; } - // Push a RenderContext - void setRenderContext(const RenderContext& renderContext) { (*_renderContext) = renderContext; } + // acces the RenderContext RenderContextPointer getRenderContext() const { return _renderContext; } // Render a frame // Must have a scene registered and a context set - void run() { assert(_sceneContext && _renderContext); Task::run(_sceneContext, _renderContext); } + void run() { assert(_renderContext); Task::run(_renderContext); } protected: - SceneContextPointer _sceneContext; RenderContextPointer _renderContext; }; using EnginePointer = std::shared_ptr; diff --git a/libraries/render/src/render/EngineStats.cpp b/libraries/render/src/render/EngineStats.cpp index 2cb23bb41c..ce116ed2c5 100644 --- a/libraries/render/src/render/EngineStats.cpp +++ b/libraries/render/src/render/EngineStats.cpp @@ -14,7 +14,7 @@ using namespace render; -void EngineStats::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { +void EngineStats::run(const RenderContextPointer& renderContext) { // Tick time quint64 msecsElapsed = _frameTimer.restart(); diff --git a/libraries/render/src/render/EngineStats.h b/libraries/render/src/render/EngineStats.h index a5ebf88498..8fd38eb501 100644 --- a/libraries/render/src/render/EngineStats.h +++ b/libraries/render/src/render/EngineStats.h @@ -99,7 +99,7 @@ namespace render { EngineStats() { _frameTimer.start(); } void configure(const Config& configuration) {} - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); + void run(const RenderContextPointer& renderContext); }; } diff --git a/libraries/render/src/render/FilterTask.cpp b/libraries/render/src/render/FilterTask.cpp index f1ab6b844a..f6b765cd9d 100644 --- a/libraries/render/src/render/FilterTask.cpp +++ b/libraries/render/src/render/FilterTask.cpp @@ -21,8 +21,8 @@ using namespace render; -void FilterLayeredItems::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems) { - auto& scene = sceneContext->_scene; +void FilterLayeredItems::run(const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems) { + auto& scene = renderContext->_scene; // Clear previous values outItems.clear(); @@ -36,7 +36,7 @@ void FilterLayeredItems::run(const SceneContextPointer& sceneContext, const Rend } } -void SliceItems::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems) { +void SliceItems::run(const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems) { outItems.clear(); std::static_pointer_cast(renderContext->jobConfig)->setNumItems((int)inItems.size()); @@ -51,8 +51,8 @@ void SliceItems::run(const SceneContextPointer& sceneContext, const RenderContex } -void SelectItems::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems) { - auto selection = sceneContext->_scene->getSelection(_name); +void SelectItems::run(const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems) { + auto selection = renderContext->_scene->getSelection(_name); const auto& selectedItems = selection.getItems(); outItems.clear(); @@ -67,8 +67,8 @@ void SelectItems::run(const SceneContextPointer& sceneContext, const RenderConte } } -void SelectSortItems::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems) { - auto selection = sceneContext->_scene->getSelection(_name); +void SelectSortItems::run(const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems) { + auto selection = renderContext->_scene->getSelection(_name); const auto& selectedItems = selection.getItems(); outItems.clear(); @@ -98,8 +98,8 @@ void SelectSortItems::run(const SceneContextPointer& sceneContext, const RenderC } } -void MetaToSubItems::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemIDs& outItems) { - auto& scene = sceneContext->_scene; +void MetaToSubItems::run(const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemIDs& outItems) { + auto& scene = renderContext->_scene; // Now we have a selection of items to render outItems.clear(); diff --git a/libraries/render/src/render/FilterTask.h b/libraries/render/src/render/FilterTask.h index 00019fa1ae..1c4611ee9f 100644 --- a/libraries/render/src/render/FilterTask.h +++ b/libraries/render/src/render/FilterTask.h @@ -41,8 +41,8 @@ namespace render { ItemFilterArray _filters; void configure(const Config& config) {} - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBoundsArray& outItems) { - auto& scene = sceneContext->_scene; + void run(const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBoundsArray& outItems) { + auto& scene = renderContext->_scene; // Clear previous values for (size_t i = 0; i < NUM_FILTERS; i++) { @@ -73,7 +73,7 @@ namespace render { int _keepLayer { 0 }; - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems); + void run(const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems); }; // SliceItems job config defining the slice range @@ -107,7 +107,7 @@ namespace render { _rangeLength = config.rangeLength; } - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems); + void run(const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems); }; // Keep items belonging to the job selection @@ -118,7 +118,7 @@ namespace render { std::string _name; SelectItems(const Selection::Name& name) : _name(name) {} - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems); + void run(const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems); }; // Same as SelectItems but reorder the output to match the selection order @@ -129,7 +129,7 @@ namespace render { std::string _name; SelectSortItems(const Selection::Name& name) : _name(name) {} - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems); + void run(const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems); }; // From meta-Items, generate the sub-items @@ -139,7 +139,7 @@ namespace render { MetaToSubItems() {} - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemIDs& outItems); + void run(const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemIDs& outItems); }; } diff --git a/libraries/render/src/render/SortTask.cpp b/libraries/render/src/render/SortTask.cpp index 28860aa410..5b7ead4b6a 100644 --- a/libraries/render/src/render/SortTask.cpp +++ b/libraries/render/src/render/SortTask.cpp @@ -40,11 +40,11 @@ struct BackToFrontSort { } }; -void render::depthSortItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, bool frontToBack, const ItemBounds& inItems, ItemBounds& outItems) { +void render::depthSortItems(const RenderContextPointer& renderContext, bool frontToBack, const ItemBounds& inItems, ItemBounds& outItems) { assert(renderContext->args); assert(renderContext->args->hasViewFrustum()); - auto& scene = sceneContext->_scene; + auto& scene = renderContext->_scene; RenderArgs* args = renderContext->args; @@ -80,8 +80,8 @@ void render::depthSortItems(const SceneContextPointer& sceneContext, const Rende } } -void PipelineSortShapes::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems, ShapeBounds& outShapes) { - auto& scene = sceneContext->_scene; +void PipelineSortShapes::run(const RenderContextPointer& renderContext, const ItemBounds& inItems, ShapeBounds& outShapes) { + auto& scene = renderContext->_scene; outShapes.clear(); for (const auto& item : inItems) { @@ -100,7 +100,7 @@ void PipelineSortShapes::run(const SceneContextPointer& sceneContext, const Rend } } -void DepthSortShapes::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ShapeBounds& inShapes, ShapeBounds& outShapes) { +void DepthSortShapes::run(const RenderContextPointer& renderContext, const ShapeBounds& inShapes, ShapeBounds& outShapes) { outShapes.clear(); outShapes.reserve(inShapes.size()); @@ -111,10 +111,10 @@ void DepthSortShapes::run(const SceneContextPointer& sceneContext, const RenderC outItems = outShapes.insert(std::make_pair(pipeline.first, ItemBounds{})).first; } - depthSortItems(sceneContext, renderContext, _frontToBack, inItems, outItems->second); + depthSortItems(renderContext, _frontToBack, inItems, outItems->second); } } -void DepthSortItems::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems) { - depthSortItems(sceneContext, renderContext, _frontToBack, inItems, outItems); +void DepthSortItems::run(const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems) { + depthSortItems(renderContext, _frontToBack, inItems, outItems); } diff --git a/libraries/render/src/render/SortTask.h b/libraries/render/src/render/SortTask.h index eb341192aa..dfeb22d540 100644 --- a/libraries/render/src/render/SortTask.h +++ b/libraries/render/src/render/SortTask.h @@ -15,12 +15,12 @@ #include "Engine.h" namespace render { - void depthSortItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, bool frontToBack, const ItemBounds& inItems, ItemBounds& outItems); + void depthSortItems(const RenderContextPointer& renderContext, bool frontToBack, const ItemBounds& inItems, ItemBounds& outItems); class PipelineSortShapes { public: using JobModel = Job::ModelIO; - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems, ShapeBounds& outShapes); + void run(const RenderContextPointer& renderContext, const ItemBounds& inItems, ShapeBounds& outShapes); }; class DepthSortShapes { @@ -30,7 +30,7 @@ namespace render { bool _frontToBack; DepthSortShapes(bool frontToBack = true) : _frontToBack(frontToBack) {} - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ShapeBounds& inShapes, ShapeBounds& outShapes); + void run(const RenderContextPointer& renderContext, const ShapeBounds& inShapes, ShapeBounds& outShapes); }; class DepthSortItems { @@ -40,7 +40,7 @@ namespace render { bool _frontToBack; DepthSortItems(bool frontToBack = true) : _frontToBack(frontToBack) {} - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems); + void run(const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems); }; } diff --git a/libraries/render/src/render/Task.h b/libraries/render/src/render/Task.h index 03824bd14d..1035b74340 100644 --- a/libraries/render/src/render/Task.h +++ b/libraries/render/src/render/Task.h @@ -451,17 +451,17 @@ template void jobConfigure(T&, const JobConfig&) { template void jobConfigure(T&, const TaskConfig&) { // nop, as the default TaskConfig was used, so the data does not need a configure method } -template void jobRun(T& data, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const JobNoIO& input, JobNoIO& output) { - data.run(sceneContext, renderContext); +template void jobRun(T& data, const RenderContextPointer& renderContext, const JobNoIO& input, JobNoIO& output) { + data.run(renderContext); } -template void jobRun(T& data, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const I& input, JobNoIO& output) { - data.run(sceneContext, renderContext, input); +template void jobRun(T& data, const RenderContextPointer& renderContext, const I& input, JobNoIO& output) { + data.run(renderContext, input); } -template void jobRun(T& data, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const JobNoIO& input, O& output) { - data.run(sceneContext, renderContext, output); +template void jobRun(T& data, const RenderContextPointer& renderContext, const JobNoIO& input, O& output) { + data.run(renderContext, output); } -template void jobRun(T& data, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const I& input, O& output) { - data.run(sceneContext, renderContext, input, output); +template void jobRun(T& data, const RenderContextPointer& renderContext, const I& input, O& output) { + data.run(renderContext, input, output); } // The guts of a job @@ -479,7 +479,7 @@ public: virtual QConfigPointer& getConfiguration() { return _config; } virtual void applyConfiguration() = 0; - virtual void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) = 0; + virtual void run(const RenderContextPointer& renderContext) = 0; protected: void setCPURunTime(double mstime) { std::static_pointer_cast(_config)->setCPURunTime(mstime); } @@ -529,10 +529,10 @@ public: jobConfigure(_data, *std::static_pointer_cast(_config)); } - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) override { + void run(const RenderContextPointer& renderContext) override { renderContext->jobConfig = std::static_pointer_cast(_config); if (renderContext->jobConfig->alwaysEnabled || renderContext->jobConfig->isEnabled()) { - jobRun(_data, sceneContext, renderContext, _input.get(), _output.edit()); + jobRun(_data, renderContext, _input.get(), _output.edit()); } renderContext->jobConfig.reset(); } @@ -554,12 +554,12 @@ public: return concept->_data; } - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { + void run(const RenderContextPointer& renderContext) { PerformanceTimer perfTimer(_name.c_str()); PROFILE_RANGE(render, _name.c_str()); auto start = usecTimestampNow(); - _concept->run(sceneContext, renderContext); + _concept->run(renderContext); _concept->setCPURunTime((double)(usecTimestampNow() - start) / 1000.0); } @@ -669,11 +669,11 @@ public: } } - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) override { + void run(const RenderContextPointer& renderContext) override { auto config = std::static_pointer_cast(_config); if (config->alwaysEnabled || config->enabled) { for (auto job : _jobs) { - job.run(sceneContext, renderContext); + job.run(renderContext); } } } diff --git a/tests/gpu-test/src/TestWindow.cpp b/tests/gpu-test/src/TestWindow.cpp index 0ca1ad2297..d62467f510 100644 --- a/tests/gpu-test/src/TestWindow.cpp +++ b/tests/gpu-test/src/TestWindow.cpp @@ -97,17 +97,17 @@ void TestWindow::beginFrame() { #ifdef DEFERRED_LIGHTING gpu::FramebufferPointer primaryFramebuffer; - _preparePrimaryFramebuffer.run(_sceneContext, _renderContext, primaryFramebuffer); + _preparePrimaryFramebuffer.run(_renderContext, primaryFramebuffer); DeferredFrameTransformPointer frameTransform; - _generateDeferredFrameTransform.run(_sceneContext, _renderContext, frameTransform); + _generateDeferredFrameTransform.run(_renderContext, frameTransform); LightingModelPointer lightingModel; - _generateLightingModel.run(_sceneContext, _renderContext, lightingModel); + _generateLightingModel.run(_renderContext, lightingModel); _prepareDeferredInputs.edit0() = primaryFramebuffer; _prepareDeferredInputs.edit1() = lightingModel; - _prepareDeferred.run(_sceneContext, _renderContext, _prepareDeferredInputs, _prepareDeferredOutputs); + _prepareDeferred.run(_renderContext, _prepareDeferredInputs, _prepareDeferredOutputs); _renderDeferredInputs.edit0() = frameTransform; // Pass the deferredFrameTransform @@ -144,7 +144,7 @@ void TestWindow::endFrame() { batch.setResourceTexture(0, nullptr); }); - _renderDeferred.run(_sceneContext, _renderContext, _renderDeferredInputs); + _renderDeferred.run(_renderContext, _renderDeferredInputs); gpu::doInBatch(_renderArgs->_context, [&](gpu::Batch& batch) { PROFILE_RANGE_BATCH(batch, "blit"); diff --git a/tests/gpu-test/src/TestWindow.h b/tests/gpu-test/src/TestWindow.h index c8d09825aa..fd059f3e32 100644 --- a/tests/gpu-test/src/TestWindow.h +++ b/tests/gpu-test/src/TestWindow.h @@ -31,7 +31,6 @@ protected: #ifdef DEFERRED_LIGHTING // Prepare the ShapePipelines render::ShapePlumberPointer _shapePlumber { std::make_shared() }; - render::SceneContextPointer _sceneContext{ std::make_shared() }; render::RenderContextPointer _renderContext{ std::make_shared() }; gpu::PipelinePointer _opaquePipeline; model::LightPointer _light { std::make_shared() }; From 2c16b2bf3ae23bcbbf16ad9410e378857ba40cdb Mon Sep 17 00:00:00 2001 From: samcake Date: Tue, 18 Apr 2017 18:12:42 -0700 Subject: [PATCH 07/11] Expose the runtime from the engine in Stats --- interface/resources/qml/Stats.qml | 8 ++++---- interface/src/ui/Stats.cpp | 2 ++ interface/src/ui/Stats.h | 2 ++ 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/interface/resources/qml/Stats.qml b/interface/resources/qml/Stats.qml index d6459afd08..98e7f61ff7 100644 --- a/interface/resources/qml/Stats.qml +++ b/interface/resources/qml/Stats.qml @@ -244,16 +244,16 @@ Item { id: octreeCol spacing: 4; x: 4; y: 4; StatText { - text: " Frame timing:" + text: "Engine: " + root.engineFrameTime.toFixed(1) + " ms" } StatText { - text: " Batch: " + root.batchFrameTime.toFixed(1) + " ms" + text: "Batch: " + root.batchFrameTime.toFixed(1) + " ms" } StatText { - text: " GPU: " + root.gpuFrameTime.toFixed(1) + " ms" + text: "GPU: " + root.gpuFrameTime.toFixed(1) + " ms" } StatText { - text: " Avatar: " + root.avatarSimulationTime.toFixed(1) + " ms" + text: "Avatar: " + root.avatarSimulationTime.toFixed(1) + " ms" } StatText { text: "Triangles: " + root.triangles + diff --git a/interface/src/ui/Stats.cpp b/interface/src/ui/Stats.cpp index dc612b0129..01740b88ca 100644 --- a/interface/src/ui/Stats.cpp +++ b/interface/src/ui/Stats.cpp @@ -335,6 +335,8 @@ void Stats::updateStats(bool force) { // Update Frame timing (in ms) STAT_UPDATE(gpuFrameTime, (float)gpuContext->getFrameTimerGPUAverage()); STAT_UPDATE(batchFrameTime, (float)gpuContext->getFrameTimerBatchAverage()); + auto config = qApp->getRenderEngine()->getConfiguration().get(); + STAT_UPDATE(engineFrameTime, (float) config->getCPURunTime()); STAT_UPDATE(avatarSimulationTime, (float)avatarManager->getAvatarSimulationTime()); diff --git a/interface/src/ui/Stats.h b/interface/src/ui/Stats.h index 85cf2caab9..a2ed125008 100644 --- a/interface/src/ui/Stats.h +++ b/interface/src/ui/Stats.h @@ -128,6 +128,7 @@ class Stats : public QQuickItem { STATS_PROPERTY(int, gpuFreeMemory, 0) STATS_PROPERTY(float, gpuFrameTime, 0) STATS_PROPERTY(float, batchFrameTime, 0) + STATS_PROPERTY(float, engineFrameTime, 0) STATS_PROPERTY(float, avatarSimulationTime, 0) public: @@ -250,6 +251,7 @@ signals: void gpuFreeMemoryChanged(); void gpuFrameTimeChanged(); void batchFrameTimeChanged(); + void engineFrameTimeChanged(); void avatarSimulationTimeChanged(); void rectifiedTextureCountChanged(); void decimatedTextureCountChanged(); From 023d03d9f8bd06b95b44b556b1afa7e4b86e3a2d Mon Sep 17 00:00:00 2001 From: Vladyslav Stelmakhovskyi Date: Thu, 20 Apr 2017 17:43:16 +0200 Subject: [PATCH 08/11] Implemented snap sound using sound injector --- interface/resources/sounds/snap.wav | Bin 182658 -> 121874 bytes interface/src/Application.cpp | 30 +++++++++++++++++++++------- interface/src/Application.h | 4 ++++ 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/interface/resources/sounds/snap.wav b/interface/resources/sounds/snap.wav index bb562e1db909662f08de66fb8e03c6fb31191ec2..e5b86c0c71c74146b2fbd286c2cb01d5d91ec20a 100644 GIT binary patch literal 121874 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 h^sigF+XHgPW{0v#8S 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%0D%^qTrfRBgS0FA~2* z$Hm-?iU}v-+f8e=#rqmr7o-gS#LlQ$XI7t`Wb4RIx&sq%h1snJ>ryhM{oNSbmsW#A z;wtYic8TnK3m-#9l2U4dEUkW0S8Ned87}`nPxL0c3%P`(U7-_cBrB6j?+ {-WU^<=+*8g7!= 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%0APTr1A7LKSv;~b+E7)-KTba#_1NT>Ju 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 literal 182658 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%0A1dJj(tMi(4$Mso{_DS#fPtjoKMDeM~(Yyj0bmO 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 zT*_{7N?^f8b^O&!getSteamClientPlugin(); setProperty(hifi::properties::STEAM, (steamClient && steamClient->isRunning())); @@ -1453,6 +1454,9 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo return entityServerNode && !isPhysicsEnabled(); }); + QFileInfo inf = QFileInfo(PathUtils::resourcesPath() + "sounds/snap.wav"); + _snapshotSound = DependencyManager::get()->getSound(QUrl::fromLocalFile(inf.absoluteFilePath())); + QVariant testProperty = property(hifi::properties::TEST); qDebug() << testProperty; if (testProperty.isValid()) { @@ -1785,6 +1789,8 @@ void Application::cleanupBeforeQuit() { DependencyManager::destroy(); DependencyManager::destroy(); +// delete _snapshotSound; +// _snapshotSound = nullptr; qCDebug(interfaceapp) << "Application::cleanupBeforeQuit() complete"; } @@ -6405,15 +6411,24 @@ void Application::loadAddAvatarBookmarkDialog() const { } void Application::takeSnapshot(bool notify, bool includeAnimated, float aspectRatio) { - postLambdaEvent([notify, includeAnimated, aspectRatio, this] { - QMediaPlayer* player = new QMediaPlayer(); - QFileInfo inf = QFileInfo(PathUtils::resourcesPath() + "sounds/snap.wav"); - player->setMedia(QUrl::fromLocalFile(inf.absoluteFilePath())); - player->play(); + + //keep sound thread out of event loop scope + AudioInjectorOptions options; + options.localOnly = true; + options.stereo = true; + + if (_snapshotSoundInjector) { + _snapshotSoundInjector->setOptions(options); + _snapshotSoundInjector->restart(); + } else { + QByteArray samples = _snapshotSound->getByteArray(); + _snapshotSoundInjector = AudioInjector::playSound(samples, options); + } + + postLambdaEvent([notify, includeAnimated, aspectRatio, this] { // Get a screenshot and save it QString path = Snapshot::saveSnapshot(getActiveDisplayPlugin()->getScreenshot(aspectRatio)); - // If we're not doing an animated snapshot as well... if (!includeAnimated || !(SnapshotAnimated::alsoTakeAnimatedSnapshot.get())) { // Tell the dependency manager that the capture of the still snapshot has taken place. @@ -6424,6 +6439,7 @@ void Application::takeSnapshot(bool notify, bool includeAnimated, float aspectRa } }); } + void Application::shareSnapshot(const QString& path, const QUrl& href) { postLambdaEvent([path, href] { // not much to do here, everything is done in snapshot code... diff --git a/interface/src/Application.h b/interface/src/Application.h index 9f429b0433..d986abc89a 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -73,6 +73,7 @@ #include #include +#include "Sound.h" class OffscreenGLCanvas; class GLCanvas; @@ -80,6 +81,7 @@ class FaceTracker; class MainWindow; class AssetUpload; class CompositorHelper; +class AudioInjector; namespace controller { class StateController; @@ -682,6 +684,8 @@ private: QTimer _addAssetToWorldErrorTimer; FileScriptingInterface* _fileDownload; + AudioInjector* _snapshotSoundInjector{ nullptr }; + SharedSoundPointer _snapshotSound; }; From b2533b6106c12a9f587833a761cc408fb854892c Mon Sep 17 00:00:00 2001 From: Vladyslav Stelmakhovskyi Date: Thu, 20 Apr 2017 21:12:57 +0200 Subject: [PATCH 09/11] Code nitpick. Pointer cleanup on exit --- interface/src/Application.cpp | 6 ++++-- interface/src/Application.h | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 299417fdb9..0e4da4b158 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1780,18 +1780,20 @@ void Application::cleanupBeforeQuit() { // stop QML DependencyManager::destroy(); + delete _snapshotSoundInjector; + _snapshotSoundInjector = nullptr; + // stop audio after QML, as there are unexplained audio crashes originating in qtwebengine // stop the AudioClient, synchronously QMetaObject::invokeMethod(DependencyManager::get().data(), "stop", Qt::BlockingQueuedConnection); + // destroy Audio so it and its threads have a chance to go down safely DependencyManager::destroy(); DependencyManager::destroy(); -// delete _snapshotSound; -// _snapshotSound = nullptr; qCDebug(interfaceapp) << "Application::cleanupBeforeQuit() complete"; } diff --git a/interface/src/Application.h b/interface/src/Application.h index 80bc5e2a7f..dff1de2860 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -685,7 +685,7 @@ private: QTimer _addAssetToWorldErrorTimer; FileScriptingInterface* _fileDownload; - AudioInjector* _snapshotSoundInjector{ nullptr }; + AudioInjector* _snapshotSoundInjector { nullptr }; SharedSoundPointer _snapshotSound; }; From 2665ede06fd8ae665af79b65e3d96a64559ce6dd Mon Sep 17 00:00:00 2001 From: Vladyslav Stelmakhovskyi Date: Thu, 20 Apr 2017 21:32:14 +0200 Subject: [PATCH 10/11] Audio injector cleanup --- interface/src/Application.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 0e4da4b158..536643012c 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1780,8 +1780,9 @@ void Application::cleanupBeforeQuit() { // stop QML DependencyManager::destroy(); - delete _snapshotSoundInjector; - _snapshotSoundInjector = nullptr; + if (_snapshotSoundInjector != nullptr) { + _snapshotSoundInjector->stop(); + } // stop audio after QML, as there are unexplained audio crashes originating in qtwebengine From a8de6eab8cff839f6b6a85ef7db9bc8308e9a734 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Thu, 20 Apr 2017 14:39:06 -0700 Subject: [PATCH 11/11] Organize the files in the JS and QML projects to appear in a folder hierarchy --- CMakeLists.txt | 1 + interface/CMakeLists.txt | 1 + 2 files changed, 2 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index aa2c353453..406fb5aeb1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -210,6 +210,7 @@ endforeach() file(GLOB_RECURSE JS_SRC scripts/*.js) add_custom_target(js SOURCES ${JS_SRC}) +GroupSources("scripts") if (UNIX) install( diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index ac44be18f2..0006bdd778 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -65,6 +65,7 @@ set(INTERFACE_SRCS ${INTERFACE_SRCS} "${QT_UI_HEADERS}" "${QT_RESOURCES}") file(GLOB_RECURSE QML_SRC resources/qml/*.qml resources/qml/*.js) add_custom_target(qml SOURCES ${QML_SRC}) +GroupSources("resources/qml") if (UNIX) install(