diff --git a/drape/render_bucket.cpp b/drape/render_bucket.cpp index 1b5576565e..a17905eb69 100644 --- a/drape/render_bucket.cpp +++ b/drape/render_bucket.cpp @@ -104,26 +104,29 @@ void RenderBucket::Render(ScreenBase const & screen) void RenderBucket::StartFeatureRecord(FeatureGeometryId feature, const m2::RectD & limitRect) { - m_featureInfo = feature; - m_featureLimitRect = limitRect; + m_featureInfo = make_pair(feature, FeatureGeometryInfo(limitRect)); m_buffer->ResetChangingTracking(); - m_featuresRanges.insert(make_pair(feature, FeatureGeometryInfo(limitRect))); } void RenderBucket::EndFeatureRecord(bool featureCompleted) { - auto it = m_featuresRanges.find(m_featureInfo); - ASSERT(it != m_featuresRanges.end(), ()); - it->second.m_featureCompleted = featureCompleted; - if (!m_buffer->IsChanged()) - m_featuresRanges.erase(it); - m_featureInfo = FeatureGeometryId(); + ASSERT(m_featureInfo.first.IsValid(), ()); + m_featureInfo.second.m_featureCompleted = featureCompleted; + if (m_buffer->IsChanged()) + m_featuresGeometryInfo.insert(m_featureInfo); + m_featureInfo = TFeatureInfo(); +} + +void RenderBucket::AddFeaturesInfo(RenderBucket const & bucket) +{ + for (auto const & info : bucket.m_featuresGeometryInfo) + m_featuresGeometryInfo.insert(info); } bool RenderBucket::IsFeaturesWaiting(TCheckFeaturesWaiting isFeaturesWaiting) { - ASSERT(!m_featuresRanges.empty(), ()); - for (auto const & featureRange : m_featuresRanges) + ASSERT(!m_featuresGeometryInfo.empty(), ()); + for (auto const & featureRange : m_featuresGeometryInfo) if (isFeaturesWaiting(featureRange.second.m_limitRect)) return true; return false; diff --git a/drape/render_bucket.hpp b/drape/render_bucket.hpp index 7a011a6812..6ac231603e 100644 --- a/drape/render_bucket.hpp +++ b/drape/render_bucket.hpp @@ -55,21 +55,24 @@ public: using TCheckFeaturesWaiting = function; bool IsFeaturesWaiting(TCheckFeaturesWaiting isFeaturesWaiting); + void AddFeaturesInfo(RenderBucket const & bucket); + private: struct FeatureGeometryInfo { + FeatureGeometryInfo() = default; FeatureGeometryInfo(m2::RectD const & limitRect) : m_limitRect(limitRect) {} m2::RectD m_limitRect; - bool m_featureCompleted = true; + bool m_featureCompleted = false; }; - using TFeaturesRanges = map; + using TFeaturesGeometryInfo = map; + using TFeatureInfo = pair; - FeatureGeometryId m_featureInfo; - m2::RectD m_featureLimitRect; - TFeaturesRanges m_featuresRanges; + TFeatureInfo m_featureInfo; + TFeaturesGeometryInfo m_featuresGeometryInfo; vector > m_overlay; drape_ptr m_buffer; diff --git a/drape_frontend/batch_merge_helper.cpp b/drape_frontend/batch_merge_helper.cpp index d328d58274..92648181f3 100644 --- a/drape_frontend/batch_merge_helper.cpp +++ b/drape_frontend/batch_merge_helper.cpp @@ -145,6 +145,8 @@ void BatchMergeHelper::MergeBatches(vector> & batches, allocateFn(bucket, newBuffer); } + bucket->AddFeaturesInfo(*b); + uint32_t indexOffset = newBuffer->GetStartIndexValue(); for (auto const & vboNode : buffer->m_staticBuffers) diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index cd57afb6e1..3b135e724a 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -999,7 +999,7 @@ void FrontendRenderer::RenderScene(ScreenBase const & modelView) AfterDrawFrame(); #endif - //MergeBuckets(); + MergeBuckets(); } void FrontendRenderer::Render2dLayer(ScreenBase const & modelView)