diff options
author | Daria Volvenkova <d.volvenkova@corp.mail.ru> | 2016-02-09 17:49:02 +0300 |
---|---|---|
committer | Sergey Yershov <yershov@corp.mail.ru> | 2016-03-23 16:20:45 +0300 |
commit | 0534c18351ce108275e5332a1b682f152b04f6fb (patch) | |
tree | e57274c296bb0014aab5e4ea2a3883eca02972fc /drape | |
parent | 921281f1fde516105aaaa01dd87d0d7b0861cb2c (diff) |
Use separate buckets for tile features in different quadrants.
Diffstat (limited to 'drape')
-rw-r--r-- | drape/batcher.cpp | 22 | ||||
-rw-r--r-- | drape/batcher.hpp | 13 | ||||
-rw-r--r-- | drape/feature_geometry_decl.hpp | 16 | ||||
-rw-r--r-- | drape/render_bucket.cpp | 2 | ||||
-rw-r--r-- | drape/render_bucket.hpp | 5 |
5 files changed, 39 insertions, 19 deletions
diff --git a/drape/batcher.cpp b/drape/batcher.cpp index c8f9b5ac31..8784bbf384 100644 --- a/drape/batcher.cpp +++ b/drape/batcher.cpp @@ -171,16 +171,16 @@ void Batcher::EndSession() m_flushInterface = TFlushFn(); } -void Batcher::StartFeatureRecord(FeatureGeometryId feature, m2::RectD const & limitRect) +void Batcher::StartFeatureRecord(const FeatureShapeInfo & feature) { m_currentFeature = feature; - m_featureLimitRect = limitRect; if (!m_currentFeature.IsValid()) return; for (auto it = m_buckets.begin(); it != m_buckets.end(); ++it) - it->second->StartFeatureRecord(feature, limitRect); + if (it->first.m_quadrantId == feature.m_quadrantId) + it->second->StartFeatureRecord(feature.m_geomId, feature.m_limitRect); } void Batcher::EndFeatureRecord() @@ -188,10 +188,11 @@ void Batcher::EndFeatureRecord() if (!m_currentFeature.IsValid()) return; - m_currentFeature = FeatureGeometryId(); - for (auto it = m_buckets.begin(); it != m_buckets.end(); ++it) - it->second->EndFeatureRecord(true); + if (it->first.m_quadrantId == m_currentFeature.m_quadrantId) + it->second->EndFeatureRecord(true); + + m_currentFeature = FeatureShapeInfo(); } void Batcher::ChangeBuffer(ref_ptr<CallbacksWrapper> wrapper) @@ -205,24 +206,25 @@ void Batcher::ChangeBuffer(ref_ptr<CallbacksWrapper> wrapper) ref_ptr<RenderBucket> Batcher::GetBucket(GLState const & state) { - TBuckets::iterator it = m_buckets.find(BucketId(state, m_currentFeature.IsValid())); + TBuckets::iterator it = m_buckets.find(BucketId(state, m_currentFeature.m_quadrantId)); if (it != m_buckets.end()) return make_ref(it->second); drape_ptr<VertexArrayBuffer> vao = make_unique_dp<VertexArrayBuffer>(m_indexBufferSize, m_vertexBufferSize); drape_ptr<RenderBucket> buffer = make_unique_dp<RenderBucket>(move(vao)); ref_ptr<RenderBucket> result = make_ref(buffer); + result->SetQuadrantId(m_currentFeature.m_quadrantId); if (m_currentFeature.IsValid()) - result->StartFeatureRecord(m_currentFeature, m_featureLimitRect); + result->StartFeatureRecord(m_currentFeature.m_geomId, m_currentFeature.m_limitRect); - m_buckets.emplace(BucketId(state, m_currentFeature.IsValid()), move(buffer)); + m_buckets.emplace(BucketId(state, m_currentFeature.m_quadrantId), move(buffer)); return result; } void Batcher::FinalizeBucket(GLState const & state) { - BucketId bucketId(state, m_currentFeature.IsValid()); + BucketId bucketId(state, m_currentFeature.m_quadrantId); TBuckets::iterator it = m_buckets.find(bucketId); ASSERT(it != m_buckets.end(), ("Have no bucket for finalize with given state")); drape_ptr<RenderBucket> bucket = move(it->second); diff --git a/drape/batcher.hpp b/drape/batcher.hpp index 3c71dc7002..e6283dd1a4 100644 --- a/drape/batcher.hpp +++ b/drape/batcher.hpp @@ -50,7 +50,7 @@ public: void StartSession(TFlushFn const & flusher); void EndSession(); - void StartFeatureRecord(FeatureGeometryId feature, m2::RectD const & limitRect); + void StartFeatureRecord(FeatureShapeInfo const & feature); void EndFeatureRecord(); private: @@ -72,20 +72,20 @@ private: struct BucketId { BucketId() = default; - BucketId(GLState const & state, bool sharedFeatures) + BucketId(GLState const & state, uint32_t quadrantId) : m_state(state) - , m_sharedFeatures(sharedFeatures) + , m_quadrantId(quadrantId) {} bool operator < (BucketId const & other) const { if (m_state == other.m_state) - return m_sharedFeatures < other.m_sharedFeatures; + return m_quadrantId < other.m_quadrantId; return m_state < other.m_state; } GLState m_state; - bool m_sharedFeatures; + uint32_t m_quadrantId = 0; }; using TBuckets = map<BucketId, drape_ptr<RenderBucket>>; @@ -94,8 +94,7 @@ private: uint32_t m_indexBufferSize; uint32_t m_vertexBufferSize; - FeatureGeometryId m_currentFeature; - m2::RectD m_featureLimitRect; + FeatureShapeInfo m_currentFeature; }; class BatcherFactory diff --git a/drape/feature_geometry_decl.hpp b/drape/feature_geometry_decl.hpp index 80745fa22e..0a5f1d2411 100644 --- a/drape/feature_geometry_decl.hpp +++ b/drape/feature_geometry_decl.hpp @@ -25,4 +25,20 @@ struct FeatureGeometryId } }; +struct FeatureShapeInfo +{ + dp::FeatureGeometryId m_geomId; + m2::RectD m_limitRect; + uint32_t m_quadrantId = 0; + + FeatureShapeInfo() = default; + FeatureShapeInfo(dp::FeatureGeometryId const & geomId, m2::RectD limitRect, uint32_t quadrantId) + : m_geomId(geomId) + , m_limitRect(limitRect) + , m_quadrantId(quadrantId) + {} + + bool IsValid() const { return m_geomId.IsValid(); } +}; + } // namespace dp diff --git a/drape/render_bucket.cpp b/drape/render_bucket.cpp index 830b9dc0c5..d09f956e73 100644 --- a/drape/render_bucket.cpp +++ b/drape/render_bucket.cpp @@ -125,7 +125,7 @@ void RenderBucket::AddFeaturesInfo(RenderBucket const & bucket) bool RenderBucket::IsFeaturesWaiting(TCheckFeaturesWaiting isFeaturesWaiting) { - ASSERT(IsShared(), ()); + ASSERT_GREATER(m_quadrantId, 0, ()); for (auto const & featureRange : m_featuresGeometryInfo) if (isFeaturesWaiting(featureRange.second.m_limitRect)) return true; diff --git a/drape/render_bucket.hpp b/drape/render_bucket.hpp index c66e51be72..e4f2c419a2 100644 --- a/drape/render_bucket.hpp +++ b/drape/render_bucket.hpp @@ -49,7 +49,9 @@ public: todo(make_ref(h)); } - bool IsShared() const { return !m_featuresGeometryInfo.empty(); } + void SetQuadrantId(uint32_t quadrantId) { m_quadrantId = quadrantId; } + uint32_t GetQuadrantId() const { return m_quadrantId; } + void StartFeatureRecord(FeatureGeometryId feature, m2::RectD const & limitRect); void EndFeatureRecord(bool featureCompleted); @@ -72,6 +74,7 @@ private: using TFeaturesGeometryInfo = map<FeatureGeometryId, FeatureGeometryInfo>; using TFeatureInfo = pair<FeatureGeometryId, FeatureGeometryInfo>; + uint32_t m_quadrantId = 0; TFeatureInfo m_featureInfo; TFeaturesGeometryInfo m_featuresGeometryInfo; |