From 4ba0e28ae97ddd3fb2d5ab0de2e61a7e42e13c79 Mon Sep 17 00:00:00 2001 From: ExMix Date: Tue, 5 Aug 2014 12:33:29 +0300 Subject: [PATCH] [drape] support dynamic geometry in render loop --- drape/pointers.hpp | 6 ++++++ drape/render_bucket.cpp | 7 +++++++ drape/render_bucket.hpp | 2 ++ drape_frontend/frontend_renderer.cpp | 27 ++++++++++++++++++++++----- drape_frontend/render_group.cpp | 22 ++++++++++------------ drape_frontend/render_group.hpp | 2 ++ 6 files changed, 49 insertions(+), 17 deletions(-) diff --git a/drape/pointers.hpp b/drape/pointers.hpp index 6116bab638..c903ab113f 100644 --- a/drape/pointers.hpp +++ b/drape/pointers.hpp @@ -264,6 +264,12 @@ TransferPointer MovePointer(T * p) return MasterPointer(p).Move(); } +template +T * NonConstGetter(dp::MasterPointer & p) +{ + return p.GetRaw(); +} + struct MasterPointerDeleter { template diff --git a/drape/render_bucket.cpp b/drape/render_bucket.cpp index 9e627f1a73..faffdd0d10 100644 --- a/drape/render_bucket.cpp +++ b/drape/render_bucket.cpp @@ -32,6 +32,13 @@ void RenderBucket::AddOverlayHandle(TransferPointer handle) m_overlay.push_back(MasterPointer(handle)); } +void RenderBucket::Update(ScreenBase const & modelView) +{ + for_each(m_overlay.begin(), m_overlay.end(), bind(&OverlayHandle::Update, + bind(&dp::NonConstGetter, _1), + modelView)); +} + void RenderBucket::CollectOverlayHandles(RefPointer tree) { for_each(m_overlay.begin(), m_overlay.end(), bind(&OverlayTree::Add, tree.GetRaw(), diff --git a/drape/render_bucket.hpp b/drape/render_bucket.hpp index 0e6771f890..2db38aa162 100644 --- a/drape/render_bucket.hpp +++ b/drape/render_bucket.hpp @@ -2,6 +2,7 @@ #include "pointers.hpp" +class ScreenBase; namespace dp { @@ -20,6 +21,7 @@ public: void AddOverlayHandle(TransferPointer handle); + void Update(ScreenBase const & modelView); void CollectOverlayHandles(RefPointer tree); void Render(); diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index 8d6535c0bb..4b4f55e216 100644 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -168,18 +168,28 @@ void FrontendRenderer::RenderScene() size_t eraseCount = 0; for (size_t i = 0; i < m_renderGroups.size(); ++i) { - if (m_renderGroups[i]->IsEmpty()) + RenderGroup * group = m_renderGroups[i]; + if (group->IsEmpty()) continue; - if (m_renderGroups[i]->IsPendingOnDelete()) + if (group->IsPendingOnDelete()) { - delete m_renderGroups[i]; + delete group; ++eraseCount; continue; } - if (m_renderGroups[i]->GetState().GetDepthLayer() == dp::GLState::OverlayLayer) - m_renderGroups[i]->CollectOverlay(dp::MakeStackRefPointer(&m_overlayTree)); + switch (group->GetState().GetDepthLayer()) + { + case dp::GLState::OverlayLayer: + group->CollectOverlay(dp::MakeStackRefPointer(&m_overlayTree)); + break; + case dp::GLState::DynamicGeometry: + group->Update(m_view); + break; + default: + break; + } } m_overlayTree.EndOverlayPlacing(); m_renderGroups.resize(m_renderGroups.size() - eraseCount); @@ -194,10 +204,17 @@ void FrontendRenderer::RenderScene() GLFunctions::glClear(); + dp::GLState::DepthLayer prevLayer = dp::GLState::GeometryLayer; for (size_t i = 0; i < m_renderGroups.size(); ++i) { RenderGroup * group = m_renderGroups[i]; dp::GLState const & state = group->GetState(); + dp::GLState::DepthLayer layer = state.GetDepthLayer(); + if (prevLayer != layer && layer == dp::GLState::OverlayLayer) + GLFunctions::glClearDepth(); + + ASSERT_LESS_OR_EQUAL(prevLayer, layer, ()); + dp::RefPointer program = m_gpuProgramManager->GetProgram(state.GetProgramIndex()); program->Bind(); ApplyUniforms(m_generalUniforms, program); diff --git a/drape_frontend/render_group.cpp b/drape_frontend/render_group.cpp index 47dcd98b37..3e79979235 100644 --- a/drape_frontend/render_group.cpp +++ b/drape_frontend/render_group.cpp @@ -1,22 +1,13 @@ #include "render_group.hpp" #include "../base/stl_add.hpp" +#include "../geometry/screenbase.hpp" #include "../std/bind.hpp" namespace df { -namespace -{ - -dp::RenderBucket * NonConstGetter(dp::MasterPointer & p) -{ - return p.GetRaw(); -} - -} /// namespace - RenderGroup::RenderGroup(dp::GLState const & state, df::TileKey const & tileKey) : m_state(state) , m_tileKey(tileKey) @@ -29,10 +20,17 @@ RenderGroup::~RenderGroup() DeleteRange(m_renderBuckets, dp::MasterPointerDeleter()); } +void RenderGroup::Update(ScreenBase const & modelView) +{ + for_each(m_renderBuckets.begin(), m_renderBuckets.end(), bind(&dp::RenderBucket::Update, + bind(&dp::NonConstGetter, _1), + modelView)); +} + void RenderGroup::CollectOverlay(dp::RefPointer tree) { for_each(m_renderBuckets.begin(), m_renderBuckets.end(), bind(&dp::RenderBucket::CollectOverlayHandles, - bind(&NonConstGetter, _1), + bind(&dp::NonConstGetter, _1), tree)); } @@ -40,7 +38,7 @@ void RenderGroup::Render() { ASSERT(m_pendingOnDelete == false, ()); for_each(m_renderBuckets.begin(), m_renderBuckets.end(), bind(&dp::RenderBucket::Render, - bind(&NonConstGetter, _1))); + bind(&dp::NonConstGetter, _1))); } void RenderGroup::PrepareForAdd(size_t countForAdd) diff --git a/drape_frontend/render_group.hpp b/drape_frontend/render_group.hpp index 4dc2788de9..040097c8be 100644 --- a/drape_frontend/render_group.hpp +++ b/drape_frontend/render_group.hpp @@ -9,6 +9,7 @@ #include "../std/vector.hpp" #include "../std/set.hpp" +class ScreenBase; namespace dp { class OverlayTree; } namespace df @@ -20,6 +21,7 @@ public: RenderGroup(dp::GLState const & state, TileKey const & tileKey); ~RenderGroup(); + void Update(ScreenBase const & modelView); void CollectOverlay(dp::RefPointer tree); void Render();