From bacdaf416f23c18afd3f328aa25a64024561fe20 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 12 Jun 2015 17:15:41 +0200 Subject: [PATCH 1/9] Working on the Job input/output mechanism --- libraries/render/src/render/DrawTask.cpp | 22 +++++ libraries/render/src/render/DrawTask.h | 109 ++++++++++++++++++++++- 2 files changed, 130 insertions(+), 1 deletion(-) diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index 53964ac1db..c012b1dfc7 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -56,6 +56,28 @@ void DrawSceneTask::run(const SceneContextPointer& sceneContext, const RenderCon Job::~Job() { } + + +void FetchCullItems::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, CulledItems& outItems) { + PerformanceTimer perfTimer("FetchCullItems::run"); + + auto& scene = sceneContext->_scene; + auto& items = scene->getMasterBucket().at(ItemFilter::Builder::opaqueShape()); + auto& renderDetails = renderContext->args->_details; + + ItemIDsBounds inItems; + inItems.reserve(items.size()); + for (auto id : items) { + inItems.emplace_back(id); + } + + ItemIDsBounds& renderedItems = inItems; + + outItems._items.reserve(inItems.size()); + cullItems(sceneContext, renderContext, renderedItems, outItems._items); +} + + void render::cullItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, ItemIDsBounds& outItems) { PerformanceTimer perfTimer("cullItems"); assert(renderContext->args); diff --git a/libraries/render/src/render/DrawTask.h b/libraries/render/src/render/DrawTask.h index 0052c314c0..37fff55245 100755 --- a/libraries/render/src/render/DrawTask.h +++ b/libraries/render/src/render/DrawTask.h @@ -16,16 +16,62 @@ namespace render { + + + + template void jobRun(const T& jobModel, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { } +template void jobRunI(const T& jobModel, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const I& input) { } +template void jobRunO(const T& jobModel, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, O& output) { + jobModel.run(sceneContext, renderContext, output); +} +template void jobRunIO(const T& jobModel, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const I& input, O& output) { } class Job { public: + class Varying { + public: + + Varying() {} + template + Varying(T data) : _concept(new Model(data)) {} + + protected: + friend class Job; + + std::vector> _consumerJobs; + + void addJobConsumer(const std::shared_ptr& job) { + _consumerJobs.push_back(job); + } + + class Concept { + public: + virtual ~Concept() = default; + }; + template class Model : public Concept { + public: + typedef T Data; + Data _data; + Model(Data data): _data(data) {} + }; + }; + typedef std::shared_ptr VaryingPointer; + template Job(T data) : _concept(new Model(data)) {} + + + template + static Job* createO(T data) { return new Job(new ModelO(data)); } + Job(const Job& other) : _concept(other._concept) {} ~Job(); + const VaryingPointer& getInput() const { return _concept->getInput(); } + const VaryingPointer& getOutput() const { return _concept->getOutput(); } + virtual void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { if (_concept) { _concept->run(sceneContext, renderContext); @@ -33,21 +79,70 @@ public: } protected: + class Concept { public: virtual ~Concept() = default; + virtual const VaryingPointer& getInput() const { return VaryingPointer(); } + virtual const VaryingPointer& getOutput() const { return VaryingPointer(); } virtual void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) = 0; }; + Job(Concept* concept) : _concept(concept) {} + template class Model : public Concept { public: typedef T Data; - + Data _data; + Model(Data data): _data(data) {} void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { jobRun(_data, sceneContext, renderContext); } }; +public: + template class ModelI : public Concept { + public: + typedef T Data; + typedef I Input; + + Data _data; + VaryingPointer _intput; + + ModelI(Data data): _data(data) {} + + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { jobRunI(_data, sceneContext, renderContext, _input); } + }; + + template class ModelO : public Concept { + public: + typedef T Data; + typedef O Output; + + Data _data; + VaryingPointer _output; + + ModelO(Data data): _data(data), _output(new Varying::Model(Output())) {} + + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { jobRunO(_data, sceneContext, renderContext, _output); } + }; + + template class ModelIO : public Concept { + public: + typedef T Data; + typedef I Input; + typedef O Output; + + Data _data; + VaryingPointer _intput; + VaryingPointer _output; + + ModelIO(Data data, Output output): _data(data), _output(new Varying::Model(output)) {} + + void setInput(const VaryingPointer& input) { _input = input; } + + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { jobRunIO(_data, sceneContext, renderContext, _input, _output); } + }; std::shared_ptr _concept; }; @@ -61,6 +156,18 @@ void cullItems(const SceneContextPointer& sceneContext, const RenderContextPoint void depthSortItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, bool frontToBack, const ItemIDsBounds& inItems, ItemIDsBounds& outITems); void renderItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, int maxDrawnItems = -1); +class CulledItems { +public: + ItemIDsBounds _items; +}; + +class FetchCullItems { +public: + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, CulledItems& outItems); + + typedef Job::ModelO JobModel; +}; + void materialSortItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, ItemIDsBounds& outItems); From 9be87758fd24048334a2bf89183d41ff7458fa2c Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Tue, 16 Jun 2015 15:00:47 +0200 Subject: [PATCH 2/9] Improving the design of the Jobs and varying --- interface/src/avatar/SkeletonModel.cpp | 3 +- libraries/fbx/src/FBXReader.cpp | 35 ++++- .../src/DeferredLightingEffect.cpp | 4 +- .../render-utils/src/DeferredLightingEffect.h | 4 +- .../render-utils/src/RenderDeferredTask.cpp | 81 +++++++++-- .../render-utils/src/RenderDeferredTask.h | 40 +++--- libraries/render/src/render/DrawTask.cpp | 136 +++++++++++------- libraries/render/src/render/DrawTask.h | 134 +++++++++++------ 8 files changed, 310 insertions(+), 127 deletions(-) diff --git a/interface/src/avatar/SkeletonModel.cpp b/interface/src/avatar/SkeletonModel.cpp index 2aa08d36f3..9497e2099d 100644 --- a/interface/src/avatar/SkeletonModel.cpp +++ b/interface/src/avatar/SkeletonModel.cpp @@ -260,7 +260,8 @@ void SkeletonModel::updateJointState(int index) { } JointState& state = _jointStates[index]; const FBXJoint& joint = state.getFBXJoint(); - if (joint.parentIndex != -1 && joint.parentIndex <= _jointStates.size()) { + // if (joint.parentIndex != -1 && joint.parentIndex <= _jointStates.size()) { + if (joint.parentIndex > -1 && joint.parentIndex <= _jointStates.size()) { const JointState& parentState = _jointStates.at(joint.parentIndex); const FBXGeometry& geometry = _geometry->getFBXGeometry(); if (index == geometry.leanJointIndex) { diff --git a/libraries/fbx/src/FBXReader.cpp b/libraries/fbx/src/FBXReader.cpp index de8f53c503..764ef5bc93 100644 --- a/libraries/fbx/src/FBXReader.cpp +++ b/libraries/fbx/src/FBXReader.cpp @@ -516,6 +516,24 @@ QVector createVec4Vector(const QVector& doubleVector) { return values; } + +QVector createVec4VectorRGBA(const QVector& doubleVector, glm::vec4& average) { + QVector values; + for (const double* it = doubleVector.constData(), *end = it + (doubleVector.size() / 4 * 4); it != end; ) { + float x = *it++; + float y = *it++; + float z = *it++; + float w = *it++; + auto val = glm::vec4(x, y, z, w); + values.append(val); + average += val; + } + if (!values.isEmpty()) { + average *= (1.0f / float(values.size())); + } + return values; +} + QVector createVec3Vector(const QVector& doubleVector) { QVector values; for (const double* it = doubleVector.constData(), *end = it + (doubleVector.size() / 3 * 3); it != end; ) { @@ -799,6 +817,7 @@ public: QVector normalIndices; bool colorsByVertex; + glm::vec4 averageColor{1.0f, 1.0f, 1.0f, 1.0f}; QVector colors; QVector colorIndices; @@ -940,8 +959,7 @@ ExtractedMesh extractMesh(const FBXNode& object, unsigned int& meshIndex) { bool indexToDirect = false; foreach (const FBXNode& subdata, child.children) { if (subdata.name == "Colors") { - data.colors = createVec4Vector(getDoubleVector(subdata)); - + data.colors = createVec4VectorRGBA(getDoubleVector(subdata), data.averageColor); } else if (subdata.name == "ColorsIndex") { data.colorIndices = getIntVector(subdata); @@ -956,6 +974,19 @@ ExtractedMesh extractMesh(const FBXNode& object, unsigned int& meshIndex) { // hack to work around wacky Makehuman exports data.colorsByVertex = true; } + +#if defined(FBXREADER_KILL_BLACK_COLOR_ATTRIBUTE) + // Potential feature where we decide to kill the color attribute is to dark? + // Tested with the model: + // https://hifi-public.s3.amazonaws.com/ryan/gardenLight2.fbx + // let's check if we did have true data ? + if (glm::all(glm::lessThanEqual(data.averageColor, glm::vec4(0.09f)))) { + data.colors.clear(); + data.colorIndices.clear(); + data.colorsByVertex = false; + qCDebug(modelformat) << "LayerElementColor has an average value of 0.0f... let's forget it."; + } +#endif } else if (child.name == "LayerElementUV") { if (child.properties.at(0).toInt() == 0) { diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index f0a52af086..569892f6e8 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -191,7 +191,7 @@ void DeferredLightingEffect::addSpotLight(const glm::vec3& position, float radiu } } -void DeferredLightingEffect::prepare() { +void DeferredLightingEffect::prepare(RenderArgs* args) { // clear the normal and specular buffers auto textureCache = DependencyManager::get(); textureCache->setPrimaryDrawBuffers(false, true, false); @@ -205,7 +205,7 @@ void DeferredLightingEffect::prepare() { textureCache->setPrimaryDrawBuffers(true, false, false); } -void DeferredLightingEffect::render() { +void DeferredLightingEffect::render(RenderArgs* args) { // perform deferred lighting, rendering to free fbo glDisable(GL_BLEND); glDisable(GL_LIGHTING); diff --git a/libraries/render-utils/src/DeferredLightingEffect.h b/libraries/render-utils/src/DeferredLightingEffect.h index bd7fcb286b..2440c78df3 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.h +++ b/libraries/render-utils/src/DeferredLightingEffect.h @@ -66,8 +66,8 @@ public: void addSpotLight(const glm::vec3& position, float radius, const glm::vec3& color = glm::vec3(1.0f, 1.0f, 1.0f), float intensity = 0.5f, const glm::quat& orientation = glm::quat(), float exponent = 0.0f, float cutoff = PI); - void prepare(); - void render(); + void prepare(RenderArgs* args); + void render(RenderArgs* args); void copyBack(RenderArgs* args); void setupTransparent(RenderArgs* args, int lightBufferUnit); diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index d9dda279e0..978a3dede2 100755 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -21,18 +21,18 @@ using namespace render; -template <> void render::jobRun(const PrepareDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { +void PrepareDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { PerformanceTimer perfTimer("PrepareDeferred"); - DependencyManager::get()->prepare(); + DependencyManager::get()->prepare(renderContext->args); } -template <> void render::jobRun(const RenderDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { +void RenderDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { PerformanceTimer perfTimer("RenderDeferred"); - DependencyManager::get()->render(); + DependencyManager::get()->render(renderContext->args); // renderContext->args->_context->syncCache(); } -template <> void render::jobRun(const ResolveDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { +void ResolveDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { PerformanceTimer perfTimer("ResolveDeferred"); DependencyManager::get()->copyBack(renderContext->args); renderContext->args->_context->syncCache(); @@ -40,7 +40,7 @@ template <> void render::jobRun(const ResolveDeferred& job, const SceneContextPo } - +/* RenderDeferredTask::RenderDeferredTask() : Task() { _jobs.push_back(Job(PrepareDeferred())); _jobs.push_back(Job(DrawBackground())); @@ -53,6 +53,22 @@ RenderDeferredTask::RenderDeferredTask() : Task() { _jobs.push_back(Job(DrawPostLayered())); _jobs.push_back(Job(ResetGLState())); } +*/ +RenderDeferredTask::RenderDeferredTask() : Task() { + _jobs.push_back(Job(new PrepareDeferred::JobModel())); + _jobs.push_back(Job(new DrawBackground::JobModel())); + _jobs.push_back(Job(new FetchItems::JobModel())); + _jobs.push_back(Job(new CullItems::JobModel(_jobs.back().getOutput()))); + _jobs.push_back(Job(new DepthSortItems::JobModel(_jobs.back().getOutput()))); + _jobs.push_back(Job(new DrawOpaqueDeferred::JobModel(_jobs.back().getOutput()))); + _jobs.push_back(Job(new DrawLight::JobModel())); + _jobs.push_back(Job(new ResetGLState::JobModel())); + _jobs.push_back(Job(new RenderDeferred::JobModel())); + _jobs.push_back(Job(new ResolveDeferred::JobModel())); + _jobs.push_back(Job(new DrawTransparentDeferred::JobModel())); + _jobs.push_back(Job(new DrawPostLayered::JobModel())); + _jobs.push_back(Job(new ResetGLState::JobModel())); +} RenderDeferredTask::~RenderDeferredTask() { } @@ -77,9 +93,8 @@ void RenderDeferredTask::run(const SceneContextPointer& sceneContext, const Rend } }; - - -template <> void render::jobRun(const DrawOpaqueDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { +/* +void DrawOpaqueDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { PerformanceTimer perfTimer("DrawOpaqueDeferred"); assert(renderContext->args); assert(renderContext->args->_viewFrustum); @@ -126,7 +141,7 @@ template <> void render::jobRun(const DrawOpaqueDeferred& job, const SceneContex } } */ - +/* if (renderContext->_renderOpaque) { RenderArgs* args = renderContext->args; gpu::Batch batch; @@ -153,13 +168,49 @@ template <> void render::jobRun(const DrawOpaqueDeferred& job, const SceneContex renderItems(sceneContext, renderContext, renderedItems, renderContext->_maxDrawnOpaqueItems); + renderContext->args->_context->syncCache(); args->_context->render((*args->_batch)); args->_batch = nullptr; } } +*/ +void DrawOpaqueDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems) { + PerformanceTimer perfTimer("DrawOpaqueDeferred"); + assert(renderContext->args); + assert(renderContext->args->_viewFrustum); -template <> void render::jobRun(const DrawTransparentDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { + RenderArgs* args = renderContext->args; + gpu::Batch batch; + args->_batch = &batch; + + glm::mat4 projMat; + Transform viewMat; + args->_viewFrustum->evalProjectionMatrix(projMat); + args->_viewFrustum->evalViewTransform(viewMat); + if (args->_renderMode == RenderArgs::MIRROR_RENDER_MODE) { + viewMat.postScale(glm::vec3(-1.0f, 1.0f, 1.0f)); + } + batch.setProjectionTransform(projMat); + batch.setViewTransform(viewMat); + + { + GLenum buffers[3]; + int bufferCount = 0; + buffers[bufferCount++] = GL_COLOR_ATTACHMENT0; + buffers[bufferCount++] = GL_COLOR_ATTACHMENT1; + buffers[bufferCount++] = GL_COLOR_ATTACHMENT2; + batch._glDrawBuffers(bufferCount, buffers); + } + + renderItems(sceneContext, renderContext, inItems, renderContext->_maxDrawnOpaqueItems); + + renderContext->args->_context->syncCache(); + args->_context->render((*args->_batch)); + args->_batch = nullptr; +} + +void DrawTransparentDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { PerformanceTimer perfTimer("DrawTransparentDeferred"); assert(renderContext->args); assert(renderContext->args->_viewFrustum); @@ -172,7 +223,13 @@ template <> void render::jobRun(const DrawTransparentDeferred& job, const SceneC ItemIDsBounds inItems; inItems.reserve(items.size()); for (auto id : items) { - inItems.push_back(id); + auto item = scene->getItem(id); + AABox bound; + { + PerformanceTimer perfTimer("getBound"); + bound = item.getBound(); + } + inItems.emplace_back(ItemIDAndBounds(id, bound)); } ItemIDsBounds& renderedItems = inItems; diff --git a/libraries/render-utils/src/RenderDeferredTask.h b/libraries/render-utils/src/RenderDeferredTask.h index e2cac53c0d..b587c7526b 100755 --- a/libraries/render-utils/src/RenderDeferredTask.h +++ b/libraries/render-utils/src/RenderDeferredTask.h @@ -16,39 +16,47 @@ class PrepareDeferred { public: + void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext); + + typedef render::Job::Model JobModel; }; -namespace render { -template <> void jobRun(const PrepareDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); -} + class RenderDeferred { public: + void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext); + + typedef render::Job::Model JobModel; }; -namespace render { -template <> void jobRun(const RenderDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); -} class ResolveDeferred { public: -}; -namespace render { -template <> void jobRun(const ResolveDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); -} + void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext); + typedef render::Job::Model JobModel; +}; class DrawOpaqueDeferred { public: + void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const render::ItemIDsBounds& inItems); + + typedef render::Job::ModelI JobModel; }; -namespace render { -template <> void jobRun(const DrawOpaqueDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); -} + +/*class DrawOpaqueDeferred { +public: + void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext); + + typedef render::Job::Model JobModel; +}; +*/ class DrawTransparentDeferred { public: + void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext); + + typedef render::Job::Model JobModel; }; -namespace render { -template <> void jobRun(const DrawTransparentDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); -} class RenderDeferredTask : public render::Task { public: diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index 1ab8c29294..743d19765a 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -26,10 +26,10 @@ using namespace render; DrawSceneTask::DrawSceneTask() : Task() { - _jobs.push_back(Job(DrawOpaque())); - _jobs.push_back(Job(DrawLight())); - _jobs.push_back(Job(DrawTransparent())); - _jobs.push_back(Job(ResetGLState())); + _jobs.push_back(Job(new Job::Model())); + _jobs.push_back(Job(new Job::Model())); + _jobs.push_back(Job(new Job::Model())); + _jobs.push_back(Job(new Job::Model())); } DrawSceneTask::~DrawSceneTask() { @@ -58,24 +58,6 @@ Job::~Job() { -void FetchCullItems::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, CulledItems& outItems) { - PerformanceTimer perfTimer("FetchCullItems::run"); - - auto& scene = sceneContext->_scene; - auto& items = scene->getMasterBucket().at(ItemFilter::Builder::opaqueShape()); - auto& renderDetails = renderContext->args->_details; - - ItemIDsBounds inItems; - inItems.reserve(items.size()); - for (auto id : items) { - inItems.emplace_back(id); - } - - ItemIDsBounds& renderedItems = inItems; - - outItems._items.reserve(inItems.size()); - cullItems(sceneContext, renderContext, renderedItems, outItems._items); -} void render::cullItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, ItemIDsBounds& outItems) { @@ -90,17 +72,9 @@ void render::cullItems(const SceneContextPointer& sceneContext, const RenderCont renderDetails->_considered += inItems.size(); // Culling / LOD - for (auto itemDetails : inItems) { - auto item = scene->getItem(itemDetails.id); - AABox bound; - { - PerformanceTimer perfTimer("getBound"); - - bound = item.getBound(); - } - - if (bound.isNull()) { - outItems.emplace_back(ItemIDAndBounds(itemDetails.id)); // One more Item to render + for (auto item : inItems) { + if (item.bounds.isNull()) { + outItems.emplace_back(item); // One more Item to render continue; } @@ -109,16 +83,16 @@ void render::cullItems(const SceneContextPointer& sceneContext, const RenderCont bool outOfView; { PerformanceTimer perfTimer("boxInFrustum"); - outOfView = args->_viewFrustum->boxInFrustum(bound) == ViewFrustum::OUTSIDE; + outOfView = args->_viewFrustum->boxInFrustum(item.bounds) == ViewFrustum::OUTSIDE; } if (!outOfView) { bool bigEnoughToRender; { PerformanceTimer perfTimer("shouldRender"); - bigEnoughToRender = (args->_shouldRender) ? args->_shouldRender(args, bound) : true; + bigEnoughToRender = (args->_shouldRender) ? args->_shouldRender(args, item.bounds) : true; } if (bigEnoughToRender) { - outItems.emplace_back(ItemIDAndBounds(itemDetails.id, bound)); // One more Item to render + outItems.emplace_back(item); // One more Item to render } else { renderDetails->_tooSmall++; } @@ -129,6 +103,36 @@ void render::cullItems(const SceneContextPointer& sceneContext, const RenderCont renderDetails->_rendered += outItems.size(); } + +void FetchItems::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, ItemIDsBounds& outItems) { + PerformanceTimer perfTimer("FetchCullItems::run"); + + auto& scene = sceneContext->_scene; + auto& items = scene->getMasterBucket().at(_filter); + auto& renderDetails = renderContext->args->_details; + + outItems.clear(); + outItems.reserve(items.size()); + for (auto id : items) { + auto item = scene->getItem(id); + AABox bound; + { + PerformanceTimer perfTimer("getBound"); + bound = item.getBound(); + } + outItems.emplace_back(ItemIDAndBounds(id, bound)); + } +} + +void CullItems::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, ItemIDsBounds& outItems) { + PerformanceTimer perfTimer("CullItems::run"); + + outItems.clear(); + outItems.reserve(inItems.size()); + cullItems(sceneContext, renderContext, inItems, outItems); +} + + struct ItemBound { float _centerDepth = 0.0f; float _nearDepth = 0.0f; @@ -161,9 +165,10 @@ void render::depthSortItems(const SceneContextPointer& sceneContext, const Rende // Allocate and simply copy + outItems.clear(); outItems.reserve(inItems.size()); - + // Make a local dataset of the center distance and closest point distance std::vector itemBounds; itemBounds.reserve(outItems.size()); @@ -191,6 +196,13 @@ void render::depthSortItems(const SceneContextPointer& sceneContext, const Rende } } + +void DepthSortItems::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, ItemIDsBounds& outItems) { + outItems.clear(); + outItems.reserve(inItems.size()); + depthSortItems(sceneContext, renderContext, _frontToBack, inItems, outItems); +} + void render::renderItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, int maxDrawnItems) { PerformanceTimer perfTimer("renderItems"); auto& scene = sceneContext->_scene; @@ -205,6 +217,11 @@ void render::renderItems(const SceneContextPointer& sceneContext, const RenderCo int numItems = 0; for (auto itemDetails : inItems) { auto item = scene->getItem(itemDetails.id); + if (numItems + 1 >= maxDrawnItems) { + item.render(args); + + return; + } item.render(args); numItems++; if (numItems >= maxDrawnItems) { @@ -246,8 +263,7 @@ void addClearStateCommands(gpu::Batch& batch) { // Back to no program batch._glUseProgram(0); } - -template <> void render::jobRun(const ResetGLState& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { +void ResetGLState::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { gpu::Batch theBatch; addClearStateCommands(theBatch); @@ -255,7 +271,7 @@ template <> void render::jobRun(const ResetGLState& job, const SceneContextPoint renderContext->args->_context->render(theBatch); } -template <> void render::jobRun(const DrawOpaque& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { +template <> void render::jobRun(DrawOpaque& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { PerformanceTimer perfTimer("DrawOpaque"); assert(renderContext->args); assert(renderContext->args->_viewFrustum); @@ -268,7 +284,13 @@ template <> void render::jobRun(const DrawOpaque& job, const SceneContextPointer ItemIDsBounds inItems; inItems.reserve(items.size()); for (auto id : items) { - inItems.emplace_back(ItemIDAndBounds(id)); + auto item = scene->getItem(id); + AABox bound; + { + PerformanceTimer perfTimer("getBound"); + bound = item.getBound(); + } + inItems.emplace_back(ItemIDAndBounds(id, bound)); } ItemIDsBounds& renderedItems = inItems; @@ -324,7 +346,7 @@ template <> void render::jobRun(const DrawOpaque& job, const SceneContextPointer } -template <> void render::jobRun(const DrawTransparent& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { +template <> void render::jobRun(DrawTransparent& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { PerformanceTimer perfTimer("DrawTransparent"); assert(renderContext->args); assert(renderContext->args->_viewFrustum); @@ -337,7 +359,13 @@ template <> void render::jobRun(const DrawTransparent& job, const SceneContextPo ItemIDsBounds inItems; inItems.reserve(items.size()); for (auto id : items) { - inItems.emplace_back(id); + auto item = scene->getItem(id); + AABox bound; + { + PerformanceTimer perfTimer("getBound"); + bound = item.getBound(); + } + inItems.emplace_back(ItemIDAndBounds(id, bound)); } ItemIDsBounds& renderedItems = inItems; @@ -407,7 +435,7 @@ template <> void render::jobRun(const DrawTransparent& job, const SceneContextPo } } -template <> void render::jobRun(const DrawLight& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { +void DrawLight::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { PerformanceTimer perfTimer("DrawLight"); assert(renderContext->args); assert(renderContext->args->_viewFrustum); @@ -420,7 +448,13 @@ template <> void render::jobRun(const DrawLight& job, const SceneContextPointer& ItemIDsBounds inItems; inItems.reserve(items.size()); for (auto id : items) { - inItems.emplace_back(id); + auto item = scene->getItem(id); + AABox bound; + { + PerformanceTimer perfTimer("getBound"); + bound = item.getBound(); + } + inItems.emplace_back(ItemIDAndBounds(id, bound)); } ItemIDsBounds culledItems; @@ -435,7 +469,7 @@ template <> void render::jobRun(const DrawLight& job, const SceneContextPointer& args->_batch = nullptr; } -template <> void render::jobRun(const DrawBackground& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { +void DrawBackground::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { PerformanceTimer perfTimer("DrawBackground"); assert(renderContext->args); assert(renderContext->args->_viewFrustum); @@ -472,7 +506,7 @@ template <> void render::jobRun(const DrawBackground& job, const SceneContextPoi args->_context->syncCache(); } -template <> void render::jobRun(const DrawPostLayered& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { +void DrawPostLayered::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { PerformanceTimer perfTimer("DrawPostLayered"); assert(renderContext->args); assert(renderContext->args->_viewFrustum); @@ -487,7 +521,13 @@ template <> void render::jobRun(const DrawPostLayered& job, const SceneContextPo for (auto id : items) { auto& item = scene->getItem(id); if (item.getKey().isVisible() && (item.getLayer() > 0)) { - inItems.emplace_back(id); + auto item = scene->getItem(id); + AABox bound; + { + PerformanceTimer perfTimer("getBound"); + bound = item.getBound(); + } + inItems.emplace_back(ItemIDAndBounds(id, bound)); } } if (inItems.empty()) { diff --git a/libraries/render/src/render/DrawTask.h b/libraries/render/src/render/DrawTask.h index 37fff55245..d81dee2b37 100755 --- a/libraries/render/src/render/DrawTask.h +++ b/libraries/render/src/render/DrawTask.h @@ -20,22 +20,35 @@ namespace render { -template void jobRun(const T& jobModel, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { } -template void jobRunI(const T& jobModel, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const I& input) { } -template void jobRunO(const T& jobModel, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, O& output) { +template void jobRun(T& jobModel, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { + jobModel.run(sceneContext, renderContext); +} +template void jobRunI(T& jobModel, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const I& input) { + jobModel.run(sceneContext, renderContext, input); +} +template void jobRunO(T& jobModel, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, O& output) { jobModel.run(sceneContext, renderContext, output); } -template void jobRunIO(const T& jobModel, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const I& input, O& output) { } +template void jobRunIO(T& jobModel, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const I& input, O& output) { + jobModel.run(sceneContext, renderContext, input, output); +} class Job { public: + // Varying represent a varying piece of data class Varying { public: + Varying(const Varying& var): _concept(var._concept) {} + Varying() {} template - Varying(T data) : _concept(new Model(data)) {} + Varying(const T& data) : _concept(new Job::Varying::Model(data)) {} + + // Access the _data contained win the concept explicitely + template T& edit() { return (static_cast*> (_concept.get())->_data); } + template const T& get() const { return (static_cast*> (_concept.get())->_data); } protected: friend class Job; @@ -54,64 +67,66 @@ public: public: typedef T Data; Data _data; - Model(Data data): _data(data) {} + Model(const Model& source): _data(source.data) {} + Model(const Data& data): _data(data) {} + virtual ~Model() {} }; + + std::shared_ptr _concept; }; - typedef std::shared_ptr VaryingPointer; - - template - Job(T data) : _concept(new Model(data)) {} - - - template - static Job* createO(T data) { return new Job(new ModelO(data)); } Job(const Job& other) : _concept(other._concept) {} ~Job(); - const VaryingPointer& getInput() const { return _concept->getInput(); } - const VaryingPointer& getOutput() const { return _concept->getOutput(); } + const Varying getInput() const { return _concept->getInput(); } + const Varying getOutput() const { return _concept->getOutput(); } - virtual void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { if (_concept) { _concept->run(sceneContext, renderContext); } } protected: +public: class Concept { public: virtual ~Concept() = default; - virtual const VaryingPointer& getInput() const { return VaryingPointer(); } - virtual const VaryingPointer& getOutput() const { return VaryingPointer(); } + virtual const Varying getInput() const { return Varying(); } + virtual const Varying getOutput() const { return Varying(); } virtual void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) = 0; }; Job(Concept* concept) : _concept(concept) {} +public: template class Model : public Concept { public: typedef T Data; Data _data; + Model() {} Model(Data data): _data(data) {} void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { jobRun(_data, sceneContext, renderContext); } }; -public: + template class ModelI : public Concept { public: typedef T Data; typedef I Input; Data _data; - VaryingPointer _intput; + Varying _input; + const Varying getInput() const { return _input; } + + ModelI(const Varying& input): _input(input) {} ModelI(Data data): _data(data) {} - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { jobRunI(_data, sceneContext, renderContext, _input); } + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { jobRunI(_data, sceneContext, renderContext, _input.get()); } }; template class ModelO : public Concept { @@ -120,11 +135,19 @@ public: typedef O Output; Data _data; - VaryingPointer _output; + Varying _output; - ModelO(Data data): _data(data), _output(new Varying::Model(Output())) {} + const Varying getOutput() const { return _output; } - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { jobRunO(_data, sceneContext, renderContext, _output); } + ModelO() : _output(Output()) { + + } + + ModelO(Data data): _data(data), _output(Output()) {} + + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { + jobRunO(_data, sceneContext, renderContext, _output.edit()); + } }; template class ModelIO : public Concept { @@ -134,14 +157,18 @@ public: typedef O Output; Data _data; - VaryingPointer _intput; - VaryingPointer _output; + Varying _input; + Varying _output; - ModelIO(Data data, Output output): _data(data), _output(new Varying::Model(output)) {} + const Varying getInput() const { return _input; } + const Varying getOutput() const { return _output; } - void setInput(const VaryingPointer& input) { _input = input; } + ModelIO(const Varying& input): _input(input), _output(Output()) {} + ModelIO(Data data, Output output): _data(data), _output(output) {} - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { jobRunIO(_data, sceneContext, renderContext, _input, _output); } + void setInput(const Varying& input) { _input = input; } + + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { jobRunIO(_data, sceneContext, renderContext, _input.get(), _output.edit()); } }; std::shared_ptr _concept; @@ -156,56 +183,74 @@ void cullItems(const SceneContextPointer& sceneContext, const RenderContextPoint void depthSortItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, bool frontToBack, const ItemIDsBounds& inItems, ItemIDsBounds& outITems); void renderItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, int maxDrawnItems = -1); -class CulledItems { + +class FetchItems { public: - ItemIDsBounds _items; + ItemFilter _filter = ItemFilter::Builder::opaqueShape().withoutLayered(); + + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, ItemIDsBounds& outItems); + + typedef Job::ModelO JobModel; }; -class FetchCullItems { +class CullItems { public: - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, CulledItems& outItems); + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, ItemIDsBounds& outItems); - typedef Job::ModelO JobModel; + typedef Job::ModelIO JobModel; }; +class DepthSortItems { +public: + bool _frontToBack = true; + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, ItemIDsBounds& outITems); + + typedef Job::ModelIO JobModel; +}; -void materialSortItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, ItemIDsBounds& outItems); class DrawOpaque { public: }; -template <> void jobRun(const DrawOpaque& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); +template <> void jobRun(DrawOpaque& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); class DrawTransparent { public: }; -template <> void jobRun(const DrawTransparent& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); +template <> void jobRun(DrawTransparent& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); class DrawLight { public: + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); + + typedef Job::Model JobModel; }; -template <> void jobRun(const DrawLight& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); class DrawBackground { public: + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); + + typedef Job::Model JobModel; }; -template <> void jobRun(const DrawBackground& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); class DrawPostLayered { public: + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); + + typedef Job::Model JobModel; }; -template <> void jobRun(const DrawPostLayered& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); - - class ResetGLState { public: + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); + + typedef Job::Model JobModel; }; -template <> void jobRun(const ResetGLState& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); + class DrawSceneTask : public Task { @@ -233,6 +278,7 @@ public: // standard builders allocating the main buckets void allocateStandardMaterialBuckets(); }; +void materialSortItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, ItemIDsBounds& outItems); } From b1ff877af1a5d1d96a09fcb00b4668efce8068ed Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Tue, 16 Jun 2015 15:56:38 +0200 Subject: [PATCH 3/9] trying to improve something ? --- libraries/render/src/render/DrawTask.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index 743d19765a..d8b154d1f0 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -105,7 +105,7 @@ void render::cullItems(const SceneContextPointer& sceneContext, const RenderCont void FetchItems::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, ItemIDsBounds& outItems) { - PerformanceTimer perfTimer("FetchCullItems::run"); + PerformanceTimer perfTimer("FetchItems::run"); auto& scene = sceneContext->_scene; auto& items = scene->getMasterBucket().at(_filter); @@ -114,13 +114,13 @@ void FetchItems::run(const SceneContextPointer& sceneContext, const RenderContex outItems.clear(); outItems.reserve(items.size()); for (auto id : items) { - auto item = scene->getItem(id); - AABox bound; + auto& item = scene->getItem(id); + /* AABox bound; { - PerformanceTimer perfTimer("getBound"); + // PerformanceTimer perfTimer("getBound"); bound = item.getBound(); - } - outItems.emplace_back(ItemIDAndBounds(id, bound)); + }*/ + outItems.emplace_back(ItemIDAndBounds(id, item.getBound())); } } From d1ac3148f025c4fc0f05552f05b13334977d0761 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Tue, 16 Jun 2015 17:33:53 +0200 Subject: [PATCH 4/9] migrating the transparent pipeline --- libraries/render-utils/src/Model.cpp | 1 + .../render-utils/src/RenderDeferredTask.cpp | 51 +++++++++++++++++-- .../render-utils/src/RenderDeferredTask.h | 12 +---- libraries/render/src/render/DrawTask.h | 4 ++ 4 files changed, 54 insertions(+), 14 deletions(-) diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 71178070c6..c2b5540aee 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -1795,6 +1795,7 @@ AABox Model::getPartBounds(int meshIndex, int partIndex) { } void Model::renderPart(RenderArgs* args, int meshIndex, int partIndex, bool translucent) { + PerformanceTimer perfTimer("Model::renderPart"); if (!_readyWhenAdded) { return; // bail asap diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 978a3dede2..9266018796 100755 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -57,7 +57,7 @@ RenderDeferredTask::RenderDeferredTask() : Task() { RenderDeferredTask::RenderDeferredTask() : Task() { _jobs.push_back(Job(new PrepareDeferred::JobModel())); _jobs.push_back(Job(new DrawBackground::JobModel())); - _jobs.push_back(Job(new FetchItems::JobModel())); + _jobs.push_back(Job(new FetchItems::JobModel(FetchItems()))); _jobs.push_back(Job(new CullItems::JobModel(_jobs.back().getOutput()))); _jobs.push_back(Job(new DepthSortItems::JobModel(_jobs.back().getOutput()))); _jobs.push_back(Job(new DrawOpaqueDeferred::JobModel(_jobs.back().getOutput()))); @@ -65,7 +65,10 @@ RenderDeferredTask::RenderDeferredTask() : Task() { _jobs.push_back(Job(new ResetGLState::JobModel())); _jobs.push_back(Job(new RenderDeferred::JobModel())); _jobs.push_back(Job(new ResolveDeferred::JobModel())); - _jobs.push_back(Job(new DrawTransparentDeferred::JobModel())); + _jobs.push_back(Job(new FetchItems::JobModel(FetchItems(ItemFilter::Builder::transparentShape().withoutLayered())))); + _jobs.push_back(Job(new CullItems::JobModel(_jobs.back().getOutput()))); + _jobs.push_back(Job(new DepthSortItems::JobModel(_jobs.back().getOutput()))); + _jobs.push_back(Job(new DrawTransparentDeferred::JobModel(_jobs.back().getOutput()))); _jobs.push_back(Job(new DrawPostLayered::JobModel())); _jobs.push_back(Job(new ResetGLState::JobModel())); } @@ -209,7 +212,7 @@ void DrawOpaqueDeferred::run(const SceneContextPointer& sceneContext, const Rend args->_context->render((*args->_batch)); args->_batch = nullptr; } - +/* void DrawTransparentDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { PerformanceTimer perfTimer("DrawTransparentDeferred"); assert(renderContext->args); @@ -288,4 +291,44 @@ void DrawTransparentDeferred::run(const SceneContextPointer& sceneContext, const // reset blend function to standard... glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_CONSTANT_ALPHA, GL_ONE); } -} +}*/ + +void DrawTransparentDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems) { + PerformanceTimer perfTimer("DrawTransparentDeferred"); + assert(renderContext->args); + assert(renderContext->args->_viewFrustum); + auto& renderDetails = renderContext->args->_details; + + RenderArgs* args = renderContext->args; + gpu::Batch batch; + args->_batch = &batch; + + glm::mat4 projMat; + Transform viewMat; + args->_viewFrustum->evalProjectionMatrix(projMat); + args->_viewFrustum->evalViewTransform(viewMat); + if (args->_renderMode == RenderArgs::MIRROR_RENDER_MODE) { + viewMat.postScale(glm::vec3(-1.0f, 1.0f, 1.0f)); + } + batch.setProjectionTransform(projMat); + batch.setViewTransform(viewMat); + + const float TRANSPARENT_ALPHA_THRESHOLD = 0.0f; + + { + GLenum buffers[3]; + int bufferCount = 0; + buffers[bufferCount++] = GL_COLOR_ATTACHMENT0; + batch._glDrawBuffers(bufferCount, buffers); + args->_alphaThreshold = TRANSPARENT_ALPHA_THRESHOLD; + } + + + renderItems(sceneContext, renderContext, inItems, renderContext->_maxDrawnTransparentItems); + + args->_context->render((*args->_batch)); + args->_batch = nullptr; + + // reset blend function to standard... + glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_CONSTANT_ALPHA, GL_ONE); +} \ No newline at end of file diff --git a/libraries/render-utils/src/RenderDeferredTask.h b/libraries/render-utils/src/RenderDeferredTask.h index b587c7526b..3c1de8e6d6 100755 --- a/libraries/render-utils/src/RenderDeferredTask.h +++ b/libraries/render-utils/src/RenderDeferredTask.h @@ -43,19 +43,11 @@ public: typedef render::Job::ModelI JobModel; }; -/*class DrawOpaqueDeferred { -public: - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext); - - typedef render::Job::Model JobModel; -}; -*/ - class DrawTransparentDeferred { public: - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext); + void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const render::ItemIDsBounds& inItems); - typedef render::Job::Model JobModel; + typedef render::Job::ModelI JobModel; }; class RenderDeferredTask : public render::Task { diff --git a/libraries/render/src/render/DrawTask.h b/libraries/render/src/render/DrawTask.h index d81dee2b37..cb4b4ae26e 100755 --- a/libraries/render/src/render/DrawTask.h +++ b/libraries/render/src/render/DrawTask.h @@ -186,6 +186,10 @@ void renderItems(const SceneContextPointer& sceneContext, const RenderContextPoi class FetchItems { public: + + FetchItems() {} + FetchItems(const ItemFilter& filter): _filter(filter) {} + ItemFilter _filter = ItemFilter::Builder::opaqueShape().withoutLayered(); void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, ItemIDsBounds& outItems); From fb42613344b3ac9c21264d5faf4cc35e93bba6f0 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Thu, 18 Jun 2015 20:25:51 +0200 Subject: [PATCH 5/9] Fixing transparency that i just broke --- .../render-utils/src/RenderDeferredTask.cpp | 59 ++--- libraries/render/src/render/DrawTask.cpp | 239 +----------------- libraries/render/src/render/DrawTask.h | 45 +--- 3 files changed, 37 insertions(+), 306 deletions(-) diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 79f369dd5e..0589512435 100755 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -25,54 +25,34 @@ using namespace render; void PrepareDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { - PerformanceTimer perfTimer("PrepareDeferred"); DependencyManager::get()->prepare(renderContext->args); } void RenderDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { - PerformanceTimer perfTimer("RenderDeferred"); DependencyManager::get()->render(renderContext->args); -// renderContext->args->_context->syncCache(); } void ResolveDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { PerformanceTimer perfTimer("ResolveDeferred"); DependencyManager::get()->copyBack(renderContext->args); - renderContext->args->_context->syncCache(); - } - -/* RenderDeferredTask::RenderDeferredTask() : Task() { - _jobs.push_back(Job(PrepareDeferred())); - _jobs.push_back(Job(DrawBackground())); - _jobs.push_back(Job(DrawOpaqueDeferred())); - _jobs.push_back(Job(DrawLight())); - _jobs.push_back(Job(ResetGLState())); - _jobs.push_back(Job(RenderDeferred())); - _jobs.push_back(Job(ResolveDeferred())); - _jobs.push_back(Job(DrawTransparentDeferred())); - _jobs.push_back(Job(DrawOverlay3D())); - _jobs.push_back(Job(ResetGLState())); -} -*/ -RenderDeferredTask::RenderDeferredTask() : Task() { - _jobs.push_back(Job(new PrepareDeferred::JobModel())); - _jobs.push_back(Job(new DrawBackground::JobModel())); - _jobs.push_back(Job(new FetchItems::JobModel(FetchItems()))); - _jobs.push_back(Job(new CullItems::JobModel(_jobs.back().getOutput()))); - _jobs.push_back(Job(new DepthSortItems::JobModel(_jobs.back().getOutput()))); - _jobs.push_back(Job(new DrawOpaqueDeferred::JobModel(_jobs.back().getOutput()))); - _jobs.push_back(Job(new DrawLight::JobModel())); + _jobs.push_back(Job(new PrepareDeferred::JobModel("PrepareDeferred"))); + _jobs.push_back(Job(new DrawBackground::JobModel("DrawBackground"))); + _jobs.push_back(Job(new FetchItems::JobModel("FetchOpaque", FetchItems()))); + _jobs.push_back(Job(new CullItems::JobModel("CullOpaque", _jobs.back().getOutput()))); + _jobs.push_back(Job(new DepthSortItems::JobModel("DepthSortOpaque", _jobs.back().getOutput()))); + _jobs.push_back(Job(new DrawOpaqueDeferred::JobModel("DrawOpaqueDeferred", _jobs.back().getOutput()))); + _jobs.push_back(Job(new DrawLight::JobModel("DrawLight"))); _jobs.push_back(Job(new ResetGLState::JobModel())); - _jobs.push_back(Job(new RenderDeferred::JobModel())); - _jobs.push_back(Job(new ResolveDeferred::JobModel())); - _jobs.push_back(Job(new FetchItems::JobModel(FetchItems(ItemFilter::Builder::transparentShape().withoutLayered())))); - _jobs.push_back(Job(new CullItems::JobModel(_jobs.back().getOutput()))); - _jobs.push_back(Job(new DepthSortItems::JobModel(_jobs.back().getOutput()))); - _jobs.push_back(Job(new DrawTransparentDeferred::JobModel(_jobs.back().getOutput()))); - _jobs.push_back(Job(new DrawOverlay3D::JobModel())); + _jobs.push_back(Job(new RenderDeferred::JobModel("RenderDeferred"))); + _jobs.push_back(Job(new ResolveDeferred::JobModel("ResolveDeferred"))); + _jobs.push_back(Job(new FetchItems::JobModel("FetchTransparent", FetchItems(ItemFilter::Builder::transparentShape().withoutLayered())))); + _jobs.push_back(Job(new CullItems::JobModel("CullTransparent", _jobs.back().getOutput()))); + _jobs.push_back(Job(new DepthSortItems::JobModel("DepthSortTransparent", _jobs.back().getOutput(), DepthSortItems(false)))); + _jobs.push_back(Job(new DrawTransparentDeferred::JobModel("TransparentDeferred", _jobs.back().getOutput()))); + _jobs.push_back(Job(new DrawOverlay3D::JobModel("DrawOverlay3D"))); _jobs.push_back(Job(new ResetGLState::JobModel())); } @@ -100,7 +80,6 @@ void RenderDeferredTask::run(const SceneContextPointer& sceneContext, const Rend }; void DrawOpaqueDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems) { - PerformanceTimer perfTimer("DrawOpaqueDeferred"); assert(renderContext->args); assert(renderContext->args->_viewFrustum); @@ -108,6 +87,8 @@ void DrawOpaqueDeferred::run(const SceneContextPointer& sceneContext, const Rend gpu::Batch batch; args->_batch = &batch; + renderContext->_numDrawnOpaqueItems = inItems.size(); + glm::mat4 projMat; Transform viewMat; args->_viewFrustum->evalProjectionMatrix(projMat); @@ -129,13 +110,14 @@ void DrawOpaqueDeferred::run(const SceneContextPointer& sceneContext, const Rend renderItems(sceneContext, renderContext, inItems, renderContext->_maxDrawnOpaqueItems); + // Before rendering the batch make sure we re in sync with gl state + args->_context->syncCache(); renderContext->args->_context->syncCache(); args->_context->render((*args->_batch)); args->_batch = nullptr; } void DrawTransparentDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems) { - PerformanceTimer perfTimer("DrawTransparentDeferred"); assert(renderContext->args); assert(renderContext->args->_viewFrustum); auto& renderDetails = renderContext->args->_details; @@ -144,6 +126,8 @@ void DrawTransparentDeferred::run(const SceneContextPointer& sceneContext, const gpu::Batch batch; args->_batch = &batch; + renderContext->_numDrawnTransparentItems = inItems.size(); + glm::mat4 projMat; Transform viewMat; args->_viewFrustum->evalProjectionMatrix(projMat); @@ -166,6 +150,8 @@ void DrawTransparentDeferred::run(const SceneContextPointer& sceneContext, const renderItems(sceneContext, renderContext, inItems, renderContext->_maxDrawnTransparentItems); + // Before rendering the batch make sure we re in sync with gl state + args->_context->syncCache(); args->_context->render((*args->_batch)); args->_batch = nullptr; @@ -189,7 +175,6 @@ const gpu::PipelinePointer& DrawOverlay3D::getOpaquePipeline() const { } void DrawOverlay3D::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { - PerformanceTimer perfTimer("DrawOverlay3D"); assert(renderContext->args); assert(renderContext->args->_viewFrustum); diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index 28f4fea110..69dd7fc387 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -25,11 +25,6 @@ using namespace render; DrawSceneTask::DrawSceneTask() : Task() { - - _jobs.push_back(Job(new Job::Model())); - _jobs.push_back(Job(new Job::Model())); - _jobs.push_back(Job(new Job::Model())); - _jobs.push_back(Job(new Job::Model())); } DrawSceneTask::~DrawSceneTask() { @@ -61,7 +56,6 @@ Job::~Job() { void render::cullItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, ItemIDsBounds& outItems) { - PerformanceTimer perfTimer("cullItems"); assert(renderContext->args); assert(renderContext->args->_viewFrustum); @@ -105,8 +99,6 @@ void render::cullItems(const SceneContextPointer& sceneContext, const RenderCont void FetchItems::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, ItemIDsBounds& outItems) { - PerformanceTimer perfTimer("FetchItems::run"); - auto& scene = sceneContext->_scene; auto& items = scene->getMasterBucket().at(_filter); auto& renderDetails = renderContext->args->_details; @@ -125,7 +117,6 @@ void FetchItems::run(const SceneContextPointer& sceneContext, const RenderContex } void CullItems::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, ItemIDsBounds& outItems) { - PerformanceTimer perfTimer("CullItems::run"); outItems.clear(); outItems.reserve(inItems.size()); @@ -156,7 +147,6 @@ struct BackToFrontSort { }; void render::depthSortItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, bool frontToBack, const ItemIDsBounds& inItems, ItemIDsBounds& outItems) { - PerformanceTimer perfTimer("depthSortItems"); assert(renderContext->args); assert(renderContext->args->_viewFrustum); @@ -204,7 +194,6 @@ void DepthSortItems::run(const SceneContextPointer& sceneContext, const RenderCo } void render::renderItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, int maxDrawnItems) { - PerformanceTimer perfTimer("renderItems"); auto& scene = sceneContext->_scene; RenderArgs* args = renderContext->args; // render @@ -271,172 +260,7 @@ void ResetGLState::run(const SceneContextPointer& sceneContext, const RenderCont renderContext->args->_context->render(theBatch); } -template <> void render::jobRun(DrawOpaque& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { - PerformanceTimer perfTimer("DrawOpaque"); - assert(renderContext->args); - assert(renderContext->args->_viewFrustum); - - // render opaques - auto& scene = sceneContext->_scene; - auto& items = scene->getMasterBucket().at(ItemFilter::Builder::opaqueShape()); - auto& renderDetails = renderContext->args->_details; - - ItemIDsBounds inItems; - inItems.reserve(items.size()); - for (auto id : items) { - auto item = scene->getItem(id); - AABox bound; - { - PerformanceTimer perfTimer("getBound"); - bound = item.getBound(); - } - inItems.emplace_back(ItemIDAndBounds(id, bound)); - } - ItemIDsBounds& renderedItems = inItems; - - renderContext->_numFeedOpaqueItems = renderedItems.size(); - - ItemIDsBounds culledItems; - culledItems.reserve(inItems.size()); - if (renderContext->_cullOpaque) { - renderDetails.pointTo(RenderDetails::OPAQUE_ITEM); - cullItems(sceneContext, renderContext, renderedItems, culledItems); - renderDetails.pointTo(RenderDetails::OTHER_ITEM); - renderedItems = culledItems; - } - - renderContext->_numDrawnOpaqueItems = renderedItems.size(); - - ItemIDsBounds sortedItems; - sortedItems.reserve(culledItems.size()); - if (renderContext->_sortOpaque) { - depthSortItems(sceneContext, renderContext, true, renderedItems, sortedItems); // Sort Front to back opaque items! - renderedItems = sortedItems; - } - - if (renderContext->_renderOpaque) { - RenderArgs* args = renderContext->args; - gpu::Batch batch; - args->_batch = &batch; - - glm::mat4 projMat; - Transform viewMat; - args->_viewFrustum->evalProjectionMatrix(projMat); - args->_viewFrustum->evalViewTransform(viewMat); - if (args->_renderMode == RenderArgs::MIRROR_RENDER_MODE) { - viewMat.postScale(glm::vec3(-1.0f, 1.0f, 1.0f)); - } - batch.setProjectionTransform(projMat); - batch.setViewTransform(viewMat); - - { - GLenum buffers[3]; - int bufferCount = 0; - buffers[bufferCount++] = GL_COLOR_ATTACHMENT0; - buffers[bufferCount++] = GL_COLOR_ATTACHMENT1; - buffers[bufferCount++] = GL_COLOR_ATTACHMENT2; - batch._glDrawBuffers(bufferCount, buffers); - } - - renderItems(sceneContext, renderContext, renderedItems, renderContext->_maxDrawnOpaqueItems); - - args->_context->render((*args->_batch)); - args->_batch = nullptr; - } -} - - -template <> void render::jobRun(DrawTransparent& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { - PerformanceTimer perfTimer("DrawTransparent"); - assert(renderContext->args); - assert(renderContext->args->_viewFrustum); - - // render transparents - auto& scene = sceneContext->_scene; - auto& items = scene->getMasterBucket().at(ItemFilter::Builder::transparentShape()); - auto& renderDetails = renderContext->args->_details; - - ItemIDsBounds inItems; - inItems.reserve(items.size()); - for (auto id : items) { - auto item = scene->getItem(id); - AABox bound; - { - PerformanceTimer perfTimer("getBound"); - bound = item.getBound(); - } - inItems.emplace_back(ItemIDAndBounds(id, bound)); - } - ItemIDsBounds& renderedItems = inItems; - - renderContext->_numFeedTransparentItems = renderedItems.size(); - - ItemIDsBounds culledItems; - culledItems.reserve(inItems.size()); - if (renderContext->_cullTransparent) { - renderDetails.pointTo(RenderDetails::TRANSLUCENT_ITEM); - cullItems(sceneContext, renderContext, inItems, culledItems); - renderDetails.pointTo(RenderDetails::OTHER_ITEM); - renderedItems = culledItems; - } - - renderContext->_numDrawnTransparentItems = renderedItems.size(); - - ItemIDsBounds sortedItems; - sortedItems.reserve(culledItems.size()); - if (renderContext->_sortTransparent) { - depthSortItems(sceneContext, renderContext, false, renderedItems, sortedItems); // Sort Back to front transparent items! - renderedItems = sortedItems; - } - - if (renderContext->_renderTransparent) { - RenderArgs* args = renderContext->args; - gpu::Batch batch; - args->_batch = &batch; - - glm::mat4 projMat; - Transform viewMat; - args->_viewFrustum->evalProjectionMatrix(projMat); - args->_viewFrustum->evalViewTransform(viewMat); - if (args->_renderMode == RenderArgs::MIRROR_RENDER_MODE) { - viewMat.postScale(glm::vec3(-1.0f, 1.0f, 1.0f)); - } - batch.setProjectionTransform(projMat); - batch.setViewTransform(viewMat); - - const float MOSTLY_OPAQUE_THRESHOLD = 0.75f; - const float TRANSPARENT_ALPHA_THRESHOLD = 0.0f; - - // render translucent meshes afterwards - { - GLenum buffers[2]; - int bufferCount = 0; - buffers[bufferCount++] = GL_COLOR_ATTACHMENT1; - buffers[bufferCount++] = GL_COLOR_ATTACHMENT2; - batch._glDrawBuffers(bufferCount, buffers); - args->_alphaThreshold = MOSTLY_OPAQUE_THRESHOLD; - } - - renderItems(sceneContext, renderContext, renderedItems, renderContext->_maxDrawnTransparentItems); - - { - GLenum buffers[3]; - int bufferCount = 0; - buffers[bufferCount++] = GL_COLOR_ATTACHMENT0; - batch._glDrawBuffers(bufferCount, buffers); - args->_alphaThreshold = TRANSPARENT_ALPHA_THRESHOLD; - } - - - renderItems(sceneContext, renderContext, renderedItems, renderContext->_maxDrawnTransparentItems); - - args->_context->render((*args->_batch)); - args->_batch = nullptr; - } -} - void DrawLight::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { - PerformanceTimer perfTimer("DrawLight"); assert(renderContext->args); assert(renderContext->args->_viewFrustum); @@ -449,12 +273,7 @@ void DrawLight::run(const SceneContextPointer& sceneContext, const RenderContext inItems.reserve(items.size()); for (auto id : items) { auto item = scene->getItem(id); - AABox bound; - { - PerformanceTimer perfTimer("getBound"); - bound = item.getBound(); - } - inItems.emplace_back(ItemIDAndBounds(id, bound)); + inItems.emplace_back(ItemIDAndBounds(id, item.getBound())); } ItemIDsBounds culledItems; @@ -470,7 +289,6 @@ void DrawLight::run(const SceneContextPointer& sceneContext, const RenderContext } void DrawBackground::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { - PerformanceTimer perfTimer("DrawBackground"); assert(renderContext->args); assert(renderContext->args->_viewFrustum); @@ -506,61 +324,6 @@ void DrawBackground::run(const SceneContextPointer& sceneContext, const RenderCo args->_context->syncCache(); } -void DrawPostLayered::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { - PerformanceTimer perfTimer("DrawPostLayered"); - assert(renderContext->args); - assert(renderContext->args->_viewFrustum); - - // render backgrounds - auto& scene = sceneContext->_scene; - auto& items = scene->getMasterBucket().at(ItemFilter::Builder::opaqueShape().withLayered()); - - - ItemIDsBounds inItems; - inItems.reserve(items.size()); - for (auto id : items) { - auto& item = scene->getItem(id); - if (item.getKey().isVisible() && (item.getLayer() > 0)) { - auto item = scene->getItem(id); - AABox bound; - { - PerformanceTimer perfTimer("getBound"); - bound = item.getBound(); - } - inItems.emplace_back(ItemIDAndBounds(id, bound)); - } - } - if (inItems.empty()) { - return; - } - - RenderArgs* args = renderContext->args; - gpu::Batch batch; - args->_batch = &batch; - - glm::mat4 projMat; - Transform viewMat; - args->_viewFrustum->evalProjectionMatrix(projMat); - args->_viewFrustum->evalViewTransform(viewMat); - if (args->_renderMode == RenderArgs::MIRROR_RENDER_MODE) { - viewMat.postScale(glm::vec3(-1.0f, 1.0f, 1.0f)); - } - batch.setProjectionTransform(projMat); - batch.setViewTransform(viewMat); - - batch.clearFramebuffer(gpu::Framebuffer::BUFFER_DEPTH, glm::vec4(), 1.f, 0); - - renderItems(sceneContext, renderContext, inItems); - - // Force the context sync - args->_context->syncCache(); - - args->_context->render((*args->_batch)); - args->_batch = nullptr; - -} - - void ItemMaterialBucketMap::insert(const ItemID& id, const model::MaterialKey& key) { // Insert the itemID in every bucket where it filters true for (auto& bucket : (*this)) { diff --git a/libraries/render/src/render/DrawTask.h b/libraries/render/src/render/DrawTask.h index 67a41f1abf..2455c75091 100755 --- a/libraries/render/src/render/DrawTask.h +++ b/libraries/render/src/render/DrawTask.h @@ -13,6 +13,9 @@ #define hifi_render_Task_h #include "Engine.h" +#include "gpu/Batch.h" +#include + namespace render { @@ -79,9 +82,9 @@ public: const Varying getOutput() const { return _concept->getOutput(); } void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { - if (_concept) { - _concept->run(sceneContext, renderContext); - } + PerformanceTimer perfTimer(getName().c_str()); + PROFILE_RANGE(getName().c_str()); + _concept->run(sceneContext, renderContext); } protected: @@ -129,9 +132,8 @@ public: const Varying getInput() const { return _input; } - ModelI(const Varying& input): _input(input) {} - ModelI(const Varying& input, const std::string& name): Concept(name), _input(input) {} - ModelI(Data data): _data(data) {} + ModelI(const std::string& name, const Varying& input): Concept(name), _input(input) {} + ModelI(const std::string& name, Data data): Concept(name), _data(data) {} void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { jobRunI(_data, sceneContext, renderContext, _input.get()); } }; @@ -146,11 +148,11 @@ public: const Varying getOutput() const { return _output; } - ModelO() : _output(Output()) { + ModelO(const std::string& name): Concept(name), _output(Output()) { } - ModelO(Data data): _data(data), _output(Output()) {} + ModelO(const std::string& name, Data data): Concept(name), _data(data), _output(Output()) {} void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { jobRunO(_data, sceneContext, renderContext, _output.edit()); @@ -170,8 +172,8 @@ public: const Varying getInput() const { return _input; } const Varying getOutput() const { return _output; } - ModelIO(const Varying& input): _input(input), _output(Output()) {} - ModelIO(Data data, Output output): _data(data), _output(output) {} + ModelIO(const std::string& name, const Varying& input, Data data = Data()): Concept(name), _data(data), _input(input), _output(Output()) {} + ModelIO(const std::string& name, Data data, Output output): Concept(name), _data(data), _output(output) {} void setInput(const Varying& input) { _input = input; } @@ -215,24 +217,13 @@ class DepthSortItems { public: bool _frontToBack = true; + DepthSortItems(bool frontToBack = true) : _frontToBack(frontToBack) {} + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, ItemIDsBounds& outITems); typedef Job::ModelIO JobModel; }; - - -class DrawOpaque { -public: -}; -template <> void jobRun(DrawOpaque& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); - - -class DrawTransparent { -public: -}; -template <> void jobRun(DrawTransparent& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); - class DrawLight { public: void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); @@ -247,14 +238,6 @@ public: typedef Job::Model JobModel; }; - -class DrawPostLayered { -public: - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); - - typedef Job::Model JobModel; -}; - class ResetGLState { public: void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); From 31633eca1015b6e3ce87cb6bc6742ea43053f1d8 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 19 Jun 2015 10:41:40 +0200 Subject: [PATCH 6/9] IMproving the probe system and cleaning the engine script --- examples/utilities/tools/renderEngineDebug.js | 58 +++++++------------ interface/src/Application.cpp | 5 +- .../render-utils/src/RenderDeferredTask.cpp | 51 ++++++++++------ libraries/render/src/render/DrawTask.cpp | 9 ++- libraries/render/src/render/DrawTask.h | 7 ++- libraries/render/src/render/Engine.h | 4 ++ .../src/SceneScriptingInterface.cpp | 2 + .../src/SceneScriptingInterface.h | 10 +++- 8 files changed, 81 insertions(+), 65 deletions(-) diff --git a/examples/utilities/tools/renderEngineDebug.js b/examples/utilities/tools/renderEngineDebug.js index 79b0010210..6a2eb1cf37 100755 --- a/examples/utilities/tools/renderEngineDebug.js +++ b/examples/utilities/tools/renderEngineDebug.js @@ -10,25 +10,7 @@ Script.include("cookies.js"); -var panel = new Panel(10, 400); - -panel.newCheckbox("Enable Cull Opaque", - function(value) { Scene.setEngineCullOpaque((value != 0)); }, - function() { return Scene.doEngineCullOpaque(); }, - function(value) { return (value); } -); - -panel.newCheckbox("Enable Sort Opaque", - function(value) { Scene.setEngineSortOpaque((value != 0)); }, - function() { return Scene.doEngineSortOpaque(); }, - function(value) { return (value); } -); - -panel.newCheckbox("Enable Render Opaque", - function(value) { Scene.setEngineRenderOpaque((value != 0)); }, - function() { return Scene.doEngineRenderOpaque(); }, - function(value) { return (value); } -); +var panel = new Panel(10, 800); panel.newSlider("Num Feed Opaques", 0, 1000, function(value) { }, @@ -48,24 +30,6 @@ panel.newSlider("Max Drawn Opaques", -1, 1000, function(value) { return (value); } ); -panel.newCheckbox("Enable Cull Transparent", - function(value) { Scene.setEngineCullTransparent((value != 0)); }, - function() { return Scene.doEngineCullTransparent(); }, - function(value) { return (value); } -); - -panel.newCheckbox("Enable Sort Transparent", - function(value) { Scene.setEngineSortTransparent((value != 0)); }, - function() { return Scene.doEngineSortTransparent(); }, - function(value) { return (value); } -); - -panel.newCheckbox("Enable Render Transparent", - function(value) { Scene.setEngineRenderTransparent((value != 0)); }, - function() { return Scene.doEngineRenderTransparent(); }, - function(value) { return (value); } -); - panel.newSlider("Num Feed Transparents", 0, 100, function(value) { }, function() { return Scene.getEngineNumFeedTransparentItems(); }, @@ -84,6 +48,24 @@ panel.newSlider("Max Drawn Transparents", -1, 100, function(value) { return (value); } ); +panel.newSlider("Num Feed Overlay3Ds", 0, 100, + function(value) { }, + function() { return Scene.getEngineNumFeedOverlay3DItems(); }, + function(value) { return (value); } +); + +panel.newSlider("Num Drawn Overlay3Ds", 0, 100, + function(value) { }, + function() { return Scene.getEngineNumDrawnOverlay3DItems(); }, + function(value) { return (value); } +); + +panel.newSlider("Max Drawn Overlay3Ds", -1, 100, + function(value) { Scene.setEngineMaxDrawnOverlay3DItems(value); }, + function() { return Scene.getEngineMaxDrawnOverlay3DItems(); }, + function(value) { return (value); } +); + var tickTackPeriod = 500; function updateCounters() { @@ -91,6 +73,8 @@ function updateCounters() { panel.set("Num Drawn Opaques", panel.get("Num Drawn Opaques")); panel.set("Num Feed Transparents", panel.get("Num Feed Transparents")); panel.set("Num Drawn Transparents", panel.get("Num Drawn Transparents")); + panel.set("Num Feed Overlay3Ds", panel.get("Num Feed Overlay3Ds")); + panel.set("Num Drawn Overlay3Ds", panel.get("Num Drawn Overlay3Ds")); } Script.setInterval(updateCounters, tickTackPeriod); diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index bd4c4b14ed..2086e651c4 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3541,6 +3541,7 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se renderContext._maxDrawnOpaqueItems = sceneInterface->getEngineMaxDrawnOpaqueItems(); renderContext._maxDrawnTransparentItems = sceneInterface->getEngineMaxDrawnTransparentItems(); + renderContext._maxDrawnOverlay3DItems = sceneInterface->getEngineMaxDrawnOverlay3DItems(); renderArgs->_shouldRender = LODManager::shouldRender; @@ -3557,7 +3558,9 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se sceneInterface->setEngineFeedTransparentItems(engineRC->_numFeedTransparentItems); sceneInterface->setEngineDrawnTransparentItems(engineRC->_numDrawnTransparentItems); - + + sceneInterface->setEngineFeedOverlay3DItems(engineRC->_numFeedOverlay3DItems); + sceneInterface->setEngineDrawnOverlay3DItems(engineRC->_numDrawnOverlay3DItems); } //Render the sixense lasers if (Menu::getInstance()->isOptionChecked(MenuOption::SixenseLasers)) { diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 0589512435..e75813ad27 100755 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -38,22 +38,35 @@ void ResolveDeferred::run(const SceneContextPointer& sceneContext, const RenderC } RenderDeferredTask::RenderDeferredTask() : Task() { - _jobs.push_back(Job(new PrepareDeferred::JobModel("PrepareDeferred"))); - _jobs.push_back(Job(new DrawBackground::JobModel("DrawBackground"))); - _jobs.push_back(Job(new FetchItems::JobModel("FetchOpaque", FetchItems()))); - _jobs.push_back(Job(new CullItems::JobModel("CullOpaque", _jobs.back().getOutput()))); - _jobs.push_back(Job(new DepthSortItems::JobModel("DepthSortOpaque", _jobs.back().getOutput()))); - _jobs.push_back(Job(new DrawOpaqueDeferred::JobModel("DrawOpaqueDeferred", _jobs.back().getOutput()))); - _jobs.push_back(Job(new DrawLight::JobModel("DrawLight"))); - _jobs.push_back(Job(new ResetGLState::JobModel())); - _jobs.push_back(Job(new RenderDeferred::JobModel("RenderDeferred"))); - _jobs.push_back(Job(new ResolveDeferred::JobModel("ResolveDeferred"))); - _jobs.push_back(Job(new FetchItems::JobModel("FetchTransparent", FetchItems(ItemFilter::Builder::transparentShape().withoutLayered())))); - _jobs.push_back(Job(new CullItems::JobModel("CullTransparent", _jobs.back().getOutput()))); - _jobs.push_back(Job(new DepthSortItems::JobModel("DepthSortTransparent", _jobs.back().getOutput(), DepthSortItems(false)))); - _jobs.push_back(Job(new DrawTransparentDeferred::JobModel("TransparentDeferred", _jobs.back().getOutput()))); - _jobs.push_back(Job(new DrawOverlay3D::JobModel("DrawOverlay3D"))); - _jobs.push_back(Job(new ResetGLState::JobModel())); + _jobs.push_back(Job(new PrepareDeferred::JobModel("PrepareDeferred"))); + _jobs.push_back(Job(new DrawBackground::JobModel("DrawBackground"))); + _jobs.push_back(Job(new FetchItems::JobModel("FetchOpaque", + FetchItems( + [] (const RenderContextPointer& context, int count) { + context->_numFeedOpaqueItems = count; + } + ) + ))); + _jobs.push_back(Job(new CullItems::JobModel("CullOpaque", _jobs.back().getOutput()))); + _jobs.push_back(Job(new DepthSortItems::JobModel("DepthSortOpaque", _jobs.back().getOutput()))); + _jobs.push_back(Job(new DrawOpaqueDeferred::JobModel("DrawOpaqueDeferred", _jobs.back().getOutput()))); + _jobs.push_back(Job(new DrawLight::JobModel("DrawLight"))); + _jobs.push_back(Job(new ResetGLState::JobModel())); + _jobs.push_back(Job(new RenderDeferred::JobModel("RenderDeferred"))); + _jobs.push_back(Job(new ResolveDeferred::JobModel("ResolveDeferred"))); + _jobs.push_back(Job(new FetchItems::JobModel("FetchTransparent", + FetchItems( + ItemFilter::Builder::transparentShape().withoutLayered(), + [] (const RenderContextPointer& context, int count) { + context->_numFeedTransparentItems = count; + } + ) + ))); + _jobs.push_back(Job(new CullItems::JobModel("CullTransparent", _jobs.back().getOutput()))); + _jobs.push_back(Job(new DepthSortItems::JobModel("DepthSortTransparent", _jobs.back().getOutput(), DepthSortItems(false)))); + _jobs.push_back(Job(new DrawTransparentDeferred::JobModel("TransparentDeferred", _jobs.back().getOutput()))); + _jobs.push_back(Job(new DrawOverlay3D::JobModel("DrawOverlay3D"))); + _jobs.push_back(Job(new ResetGLState::JobModel())); } RenderDeferredTask::~RenderDeferredTask() { @@ -191,7 +204,9 @@ void DrawOverlay3D::run(const SceneContextPointer& sceneContext, const RenderCon inItems.emplace_back(id); } } - + renderContext->_numFeedOverlay3DItems = inItems.size(); + renderContext->_numDrawnOverlay3DItems = inItems.size(); + RenderArgs* args = renderContext->args; gpu::Batch batch; args->_batch = &batch; @@ -212,7 +227,7 @@ void DrawOverlay3D::run(const SceneContextPointer& sceneContext, const RenderCon if (!inItems.empty()) { batch.clearFramebuffer(gpu::Framebuffer::BUFFER_DEPTH, glm::vec4(), 1.f, 0); - renderItems(sceneContext, renderContext, inItems); + renderItems(sceneContext, renderContext, inItems, renderContext->_maxDrawnOverlay3DItems); } // Before rendering the batch make sure we re in sync with gl state diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index 69dd7fc387..203b192230 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -107,13 +107,12 @@ void FetchItems::run(const SceneContextPointer& sceneContext, const RenderContex outItems.reserve(items.size()); for (auto id : items) { auto& item = scene->getItem(id); - /* AABox bound; - { - // PerformanceTimer perfTimer("getBound"); - bound = item.getBound(); - }*/ outItems.emplace_back(ItemIDAndBounds(id, item.getBound())); } + + if (_probeNumItems) { + _probeNumItems(renderContext, outItems.size()); + } } void CullItems::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, ItemIDsBounds& outItems) { diff --git a/libraries/render/src/render/DrawTask.h b/libraries/render/src/render/DrawTask.h index 2455c75091..8a4d424005 100755 --- a/libraries/render/src/render/DrawTask.h +++ b/libraries/render/src/render/DrawTask.h @@ -195,11 +195,12 @@ void renderItems(const SceneContextPointer& sceneContext, const RenderContextPoi class FetchItems { public: - - FetchItems() {} - FetchItems(const ItemFilter& filter): _filter(filter) {} + typedef std::function ProbeNumItems; + FetchItems(const ProbeNumItems& probe): _probeNumItems(probe) {} + FetchItems(const ItemFilter& filter, const ProbeNumItems& probe): _filter(filter), _probeNumItems(probe) {} ItemFilter _filter = ItemFilter::Builder::opaqueShape().withoutLayered(); + ProbeNumItems _probeNumItems; void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, ItemIDsBounds& outItems); diff --git a/libraries/render/src/render/Engine.h b/libraries/render/src/render/Engine.h index 121d6458e9..054f7e5ce4 100644 --- a/libraries/render/src/render/Engine.h +++ b/libraries/render/src/render/Engine.h @@ -45,6 +45,10 @@ public: int _numDrawnTransparentItems = 0; int _maxDrawnTransparentItems = -1; + int _numFeedOverlay3DItems = 0; + int _numDrawnOverlay3DItems = 0; + int _maxDrawnOverlay3DItems = -1; + RenderContext() {} }; typedef std::shared_ptr RenderContextPointer; diff --git a/libraries/script-engine/src/SceneScriptingInterface.cpp b/libraries/script-engine/src/SceneScriptingInterface.cpp index 679ec1180f..debba309c5 100644 --- a/libraries/script-engine/src/SceneScriptingInterface.cpp +++ b/libraries/script-engine/src/SceneScriptingInterface.cpp @@ -159,4 +159,6 @@ void SceneScriptingInterface::clearEngineCounters() { _numDrawnOpaqueItems = 0; _numFeedTransparentItems = 0; _numDrawnTransparentItems = 0; + _numFeedOverlay3DItems = 0; + _numDrawnOverlay3DItems = 0; } diff --git a/libraries/script-engine/src/SceneScriptingInterface.h b/libraries/script-engine/src/SceneScriptingInterface.h index 543f55a971..8359aa58fa 100644 --- a/libraries/script-engine/src/SceneScriptingInterface.h +++ b/libraries/script-engine/src/SceneScriptingInterface.h @@ -90,17 +90,22 @@ public: Q_INVOKABLE int getEngineNumDrawnOpaqueItems() { return _numDrawnOpaqueItems; } void setEngineDrawnTransparentItems(int count) { _numDrawnTransparentItems = count; } Q_INVOKABLE int getEngineNumDrawnTransparentItems() { return _numDrawnTransparentItems; } + void setEngineDrawnOverlay3DItems(int count) { _numDrawnOverlay3DItems = count; } + Q_INVOKABLE int getEngineNumDrawnOverlay3DItems() { return _numDrawnOverlay3DItems; } void setEngineFeedOpaqueItems(int count) { _numFeedOpaqueItems = count; } Q_INVOKABLE int getEngineNumFeedOpaqueItems() { return _numFeedOpaqueItems; } void setEngineFeedTransparentItems(int count) { _numFeedTransparentItems = count; } Q_INVOKABLE int getEngineNumFeedTransparentItems() { return _numFeedTransparentItems; } + void setEngineFeedOverlay3DItems(int count) { _numFeedOverlay3DItems = count; } + Q_INVOKABLE int getEngineNumFeedOverlay3DItems() { return _numFeedOverlay3DItems; } Q_INVOKABLE void setEngineMaxDrawnOpaqueItems(int count) { _maxDrawnOpaqueItems = count; } Q_INVOKABLE int getEngineMaxDrawnOpaqueItems() { return _maxDrawnOpaqueItems; } Q_INVOKABLE void setEngineMaxDrawnTransparentItems(int count) { _maxDrawnTransparentItems = count; } Q_INVOKABLE int getEngineMaxDrawnTransparentItems() { return _maxDrawnTransparentItems; } - + Q_INVOKABLE void setEngineMaxDrawnOverlay3DItems(int count) { _maxDrawnOverlay3DItems = count; } + Q_INVOKABLE int getEngineMaxDrawnOverlay3DItems() { return _maxDrawnOverlay3DItems; } signals: void shouldRenderAvatarsChanged(bool shouldRenderAvatars); void shouldRenderEntitiesChanged(bool shouldRenderEntities); @@ -124,9 +129,12 @@ protected: int _numDrawnOpaqueItems = 0; int _numFeedTransparentItems = 0; int _numDrawnTransparentItems = 0; + int _numFeedOverlay3DItems = 0; + int _numDrawnOverlay3DItems = 0; int _maxDrawnOpaqueItems = -1; int _maxDrawnTransparentItems = -1; + int _maxDrawnOverlay3DItems = -1; }; From 9adfdb06fe95c0808ffb738f237eee2e03a2ea17 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 19 Jun 2015 11:00:27 +0200 Subject: [PATCH 7/9] undo local modif to SKeletonModel.cpp --- interface/src/avatar/SkeletonModel.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/interface/src/avatar/SkeletonModel.cpp b/interface/src/avatar/SkeletonModel.cpp index 9497e2099d..8c52c79ca0 100644 --- a/interface/src/avatar/SkeletonModel.cpp +++ b/interface/src/avatar/SkeletonModel.cpp @@ -41,7 +41,6 @@ SkeletonModel::SkeletonModel(Avatar* owningAvatar, QObject* parent) : _headClipDistance(DEFAULT_NEAR_CLIP) { assert(_owningAvatar); - _enableShapes = true; } SkeletonModel::~SkeletonModel() { @@ -255,13 +254,9 @@ void SkeletonModel::applyPalmData(int jointIndex, PalmData& palm) { } void SkeletonModel::updateJointState(int index) { - if (index > _jointStates.size()) { - return; // bail - } JointState& state = _jointStates[index]; const FBXJoint& joint = state.getFBXJoint(); - // if (joint.parentIndex != -1 && joint.parentIndex <= _jointStates.size()) { - if (joint.parentIndex > -1 && joint.parentIndex <= _jointStates.size()) { + if (joint.parentIndex != -1) { const JointState& parentState = _jointStates.at(joint.parentIndex); const FBXGeometry& geometry = _geometry->getFBXGeometry(); if (index == geometry.leanJointIndex) { From b0f5990bd73d20013f8dc3da82a5a6f53be16ba7 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 19 Jun 2015 17:13:29 +0200 Subject: [PATCH 8/9] fix syntax --- libraries/fbx/src/FBXReader.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/fbx/src/FBXReader.cpp b/libraries/fbx/src/FBXReader.cpp index fd207dc773..236e2979f5 100644 --- a/libraries/fbx/src/FBXReader.cpp +++ b/libraries/fbx/src/FBXReader.cpp @@ -506,7 +506,7 @@ FBXNode parseFBX(QIODevice* device) { QVector createVec4Vector(const QVector& doubleVector) { QVector values; - for (const double* it = doubleVector.constData(), *end = it + (doubleVector.size() / 4 * 4); it != end; ) { + for (const double* it = doubleVector.constData(), *end = it + ((doubleVector.size() / 4) * 4); it != end; ) { float x = *it++; float y = *it++; float z = *it++; @@ -519,7 +519,7 @@ QVector createVec4Vector(const QVector& doubleVector) { QVector createVec4VectorRGBA(const QVector& doubleVector, glm::vec4& average) { QVector values; - for (const double* it = doubleVector.constData(), *end = it + (doubleVector.size() / 4 * 4); it != end; ) { + for (const double* it = doubleVector.constData(), *end = it + ((doubleVector.size() / 4) * 4); it != end; ) { float x = *it++; float y = *it++; float z = *it++; @@ -536,7 +536,7 @@ QVector createVec4VectorRGBA(const QVector& doubleVector, glm QVector createVec3Vector(const QVector& doubleVector) { QVector values; - for (const double* it = doubleVector.constData(), *end = it + (doubleVector.size() / 3 * 3); it != end; ) { + for (const double* it = doubleVector.constData(), *end = it + ((doubleVector.size() / 3) * 3); it != end; ) { float x = *it++; float y = *it++; float z = *it++; @@ -547,7 +547,7 @@ QVector createVec3Vector(const QVector& doubleVector) { QVector createVec2Vector(const QVector& doubleVector) { QVector values; - for (const double* it = doubleVector.constData(), *end = it + (doubleVector.size() / 2 * 2); it != end; ) { + for (const double* it = doubleVector.constData(), *end = it + ((doubleVector.size() / 2) * 2); it != end; ) { float s = *it++; float t = *it++; values.append(glm::vec2(s, -t)); From 598d0a5375babc73b68f90ea36bb7c14f34e48a1 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 19 Jun 2015 17:44:56 +0200 Subject: [PATCH 9/9] Just remove these changes on SkeletonModel.cpp --- interface/src/avatar/SkeletonModel.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/interface/src/avatar/SkeletonModel.cpp b/interface/src/avatar/SkeletonModel.cpp index 8c52c79ca0..2aa08d36f3 100644 --- a/interface/src/avatar/SkeletonModel.cpp +++ b/interface/src/avatar/SkeletonModel.cpp @@ -41,6 +41,7 @@ SkeletonModel::SkeletonModel(Avatar* owningAvatar, QObject* parent) : _headClipDistance(DEFAULT_NEAR_CLIP) { assert(_owningAvatar); + _enableShapes = true; } SkeletonModel::~SkeletonModel() { @@ -254,9 +255,12 @@ void SkeletonModel::applyPalmData(int jointIndex, PalmData& palm) { } void SkeletonModel::updateJointState(int index) { + if (index > _jointStates.size()) { + return; // bail + } JointState& state = _jointStates[index]; const FBXJoint& joint = state.getFBXJoint(); - if (joint.parentIndex != -1) { + if (joint.parentIndex != -1 && joint.parentIndex <= _jointStates.size()) { const JointState& parentState = _jointStates.at(joint.parentIndex); const FBXGeometry& geometry = _geometry->getFBXGeometry(); if (index == geometry.leanJointIndex) {