Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/drape
diff options
context:
space:
mode:
authorDaria Volvenkova <d.volvenkova@corp.mail.ru>2016-02-09 17:49:02 +0300
committerSergey Yershov <yershov@corp.mail.ru>2016-03-23 16:20:45 +0300
commit0534c18351ce108275e5332a1b682f152b04f6fb (patch)
treee57274c296bb0014aab5e4ea2a3883eca02972fc /drape
parent921281f1fde516105aaaa01dd87d0d7b0861cb2c (diff)
Use separate buckets for tile features in different quadrants.
Diffstat (limited to 'drape')
-rw-r--r--drape/batcher.cpp22
-rw-r--r--drape/batcher.hpp13
-rw-r--r--drape/feature_geometry_decl.hpp16
-rw-r--r--drape/render_bucket.cpp2
-rw-r--r--drape/render_bucket.hpp5
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;