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
diff options
context:
space:
mode:
authorr.kuznetsov <r.kuznetsov@corp.mail.ru>2015-12-01 14:35:47 +0300
committerr.kuznetsov <r.kuznetsov@corp.mail.ru>2015-12-01 18:30:50 +0300
commite7851ffcece6131950de7f5e83b5cd57804599aa (patch)
treeba59efdc721e3c801ac3633434a6472885a2c5df
parent959dbce5afdbcd1ccab1f44b93fd6993cc57d870 (diff)
Fixed selection of POI and texts
-rw-r--r--drape/drape_tests/font_texture_tests.cpp4
-rw-r--r--drape/overlay_handle.cpp19
-rw-r--r--drape/overlay_handle.hpp7
-rw-r--r--drape/overlay_tree.cpp20
-rw-r--r--drape/overlay_tree.hpp4
-rw-r--r--drape/render_bucket.cpp2
-rwxr-xr-xdrape_frontend/frontend_renderer.cpp4
-rw-r--r--drape_frontend/poi_symbol_shape.cpp6
-rwxr-xr-xdrape_frontend/render_group.cpp6
-rw-r--r--drape_frontend/text_shape.cpp6
10 files changed, 52 insertions, 26 deletions
diff --git a/drape/drape_tests/font_texture_tests.cpp b/drape/drape_tests/font_texture_tests.cpp
index f397397b43..a162a7c5f9 100644
--- a/drape/drape_tests/font_texture_tests.cpp
+++ b/drape/drape_tests/font_texture_tests.cpp
@@ -95,7 +95,7 @@ UNIT_TEST(UploadingGlyphs)
GetPlatform().GetFontNames(args.m_fonts);
GlyphManager mng(args);
- DummyGlyphIndex index(m2::PointU(64, 64), make_ref(&mng));
+ DummyGlyphIndex index(m2::PointU(128, 128), make_ref(&mng));
index.MapResource(GlyphKey(0x58));
index.MapResource(GlyphKey(0x59));
index.MapResource(GlyphKey(0x61));
@@ -104,7 +104,7 @@ UNIT_TEST(UploadingGlyphs)
Texture::Params p;
p.m_allocator = GetDefaultAllocator();
p.m_format = dp::ALPHA;
- p.m_width = p.m_height = 64;
+ p.m_width = p.m_height = 128;
DummyTexture tex;
tex.Create(p);
diff --git a/drape/overlay_handle.cpp b/drape/overlay_handle.cpp
index a8e9bdf9f4..69d10c9f5f 100644
--- a/drape/overlay_handle.cpp
+++ b/drape/overlay_handle.cpp
@@ -24,6 +24,7 @@ OverlayHandle::OverlayHandle(FeatureID const & id, dp::Anchor anchor, uint64_t p
, m_anchor(anchor)
, m_priority(priority)
, m_overlayRank(OverlayRank0)
+ , m_extendingSize(0)
, m_isVisible(false)
{
}
@@ -62,8 +63,8 @@ bool OverlayHandle::IsIntersect(ScreenBase const & screen, ref_ptr<OverlayHandle
Rects ar1;
Rects ar2;
- GetPixelShape(screen, ar1);
- h->GetPixelShape(screen, ar2);
+ GetExtendedPixelShape(screen, ar1);
+ h->GetExtendedPixelShape(screen, ar2);
for (size_t i = 0; i < ar1.size(); ++i)
for (size_t j = 0; j < ar2.size(); ++j)
@@ -121,6 +122,20 @@ OverlayHandle::TOffsetNode const & OverlayHandle::GetOffsetNode(uint8_t bufferID
return *it;
}
+m2::RectD OverlayHandle::GetExtendedPixelRect(ScreenBase const & screen) const
+{
+ m2::RectD rect = GetPixelRect(screen);
+ rect.Inflate(m_extendingSize, m_extendingSize);
+ return rect;
+}
+
+void OverlayHandle::GetExtendedPixelShape(ScreenBase const & screen, Rects & rects) const
+{
+ GetPixelShape(screen, rects);
+ for (auto & rect : rects)
+ rect.Inflate(m_extendingSize, m_extendingSize);
+}
+
SquareHandle::SquareHandle(FeatureID const & id, dp::Anchor anchor,
m2::PointD const & gbPivot, m2::PointD const & pxSize,
uint64_t priority)
diff --git a/drape/overlay_handle.hpp b/drape/overlay_handle.hpp
index 0c4889b7ed..d6aed64b57 100644
--- a/drape/overlay_handle.hpp
+++ b/drape/overlay_handle.hpp
@@ -48,9 +48,13 @@ public:
virtual bool Update(ScreenBase const & /*screen*/) { return true; }
virtual m2::RectD GetPixelRect(ScreenBase const & screen) const = 0;
-
virtual void GetPixelShape(ScreenBase const & screen, Rects & rects) const = 0;
+ double GetExtendingSize() const { return m_extendingSize; }
+ void SetExtendingSize(double extendingSize) { m_extendingSize = extendingSize; }
+ m2::RectD GetExtendedPixelRect(ScreenBase const & screen) const;
+ void GetExtendedPixelShape(ScreenBase const & screen, Rects & rects) const;
+
bool IsIntersect(ScreenBase const & screen, ref_ptr<OverlayHandle> const h) const;
virtual bool IndexesRequired() const { return true; }
@@ -78,6 +82,7 @@ protected:
uint64_t const m_priority;
int m_overlayRank;
+ double m_extendingSize;
typedef pair<BindingInfo, MutateRegion> TOffsetNode;
TOffsetNode const & GetOffsetNode(uint8_t bufferID) const;
diff --git a/drape/overlay_tree.cpp b/drape/overlay_tree.cpp
index cf4576f05d..c3ecc9174a 100644
--- a/drape/overlay_tree.cpp
+++ b/drape/overlay_tree.cpp
@@ -54,11 +54,16 @@ OverlayTree::OverlayTree()
m_handles[i].reserve(kAverageHandlesCount[i]);
}
-void OverlayTree::Frame()
+bool OverlayTree::Frame()
{
+ if (IsNeedUpdate())
+ return true;
+
m_frameCounter++;
if (m_frameCounter >= kFrameUpdarePeriod)
m_frameCounter = -1;
+
+ return IsNeedUpdate();
}
bool OverlayTree::IsNeedUpdate() const
@@ -68,7 +73,6 @@ bool OverlayTree::IsNeedUpdate() const
void OverlayTree::ForceUpdate()
{
- Clear();
m_frameCounter = -1;
}
@@ -81,6 +85,8 @@ void OverlayTree::StartOverlayPlacing(ScreenBase const & screen)
void OverlayTree::Add(ref_ptr<OverlayHandle> handle, bool isTransparent)
{
+ ASSERT(IsNeedUpdate(), ());
+
ScreenBase const & modelView = GetModelView();
handle->SetIsVisible(false);
@@ -88,7 +94,7 @@ void OverlayTree::Add(ref_ptr<OverlayHandle> handle, bool isTransparent)
if (!handle->Update(modelView))
return;
- m2::RectD const pixelRect = handle->GetPixelRect(modelView);
+ m2::RectD const pixelRect = handle->GetExtendedPixelRect(modelView);
if (!m_traits.m_modelView.PixelRect().IsIntersect(pixelRect))
{
handle->SetIsVisible(false);
@@ -103,8 +109,10 @@ void OverlayTree::Add(ref_ptr<OverlayHandle> handle, bool isTransparent)
void OverlayTree::InsertHandle(ref_ptr<OverlayHandle> handle, bool isTransparent,
detail::OverlayInfo const & parentOverlay)
{
+ ASSERT(IsNeedUpdate(), ());
+
ScreenBase const & modelView = GetModelView();
- m2::RectD const pixelRect = handle->GetPixelRect(modelView);
+ m2::RectD const pixelRect = handle->GetExtendedPixelRect(modelView);
TOverlayContainer elements;
@@ -155,6 +163,8 @@ void OverlayTree::InsertHandle(ref_ptr<OverlayHandle> handle, bool isTransparent
void OverlayTree::EndOverlayPlacing()
{
+ ASSERT(IsNeedUpdate(), ());
+
HandleComparator comparator;
for (int rank = 0; rank < dp::OverlayRanksCount; rank++)
@@ -176,6 +186,8 @@ void OverlayTree::EndOverlayPlacing()
{
info.m_handle->SetIsVisible(true);
});
+
+ m_frameCounter = 0;
}
bool OverlayTree::CheckHandle(ref_ptr<OverlayHandle> handle, int currentRank,
diff --git a/drape/overlay_tree.hpp b/drape/overlay_tree.hpp
index 1644c6775c..3979892c83 100644
--- a/drape/overlay_tree.hpp
+++ b/drape/overlay_tree.hpp
@@ -39,7 +39,7 @@ struct OverlayTraits
inline m2::RectD const LimitRect(OverlayInfo const & info)
{
- return info.m_handle->GetPixelRect(m_modelView);
+ return info.m_handle->GetExtendedPixelRect(m_modelView);
}
};
@@ -52,7 +52,7 @@ class OverlayTree : public m4::Tree<detail::OverlayInfo, detail::OverlayTraits>
public:
OverlayTree();
- void Frame();
+ bool Frame();
bool IsNeedUpdate() const;
void ForceUpdate();
diff --git a/drape/render_bucket.cpp b/drape/render_bucket.cpp
index b02401d7c5..0207f2e360 100644
--- a/drape/render_bucket.cpp
+++ b/drape/render_bucket.cpp
@@ -110,7 +110,7 @@ void RenderBucket::RenderDebug(ScreenBase const & screen) const
for (auto const & handle : m_overlay)
{
OverlayHandle::Rects rects;
- handle->GetPixelShape(screen, rects);
+ handle->GetExtendedPixelShape(screen, rects);
for (auto const & rect : rects)
DebugRectRenderer::Instance().DrawRect(screen, rect);
}
diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp
index adf0121da8..8f65bf945d 100755
--- a/drape_frontend/frontend_renderer.cpp
+++ b/drape_frontend/frontend_renderer.cpp
@@ -561,9 +561,7 @@ FeatureID FrontendRenderer::GetVisiblePOI(m2::RectD const & pixelRect) const
void FrontendRenderer::BeginUpdateOverlayTree(ScreenBase const & modelView)
{
- m_overlayTree->Frame();
-
- if (m_overlayTree->IsNeedUpdate())
+ if (m_overlayTree->Frame())
m_overlayTree->StartOverlayPlacing(modelView);
}
diff --git a/drape_frontend/poi_symbol_shape.cpp b/drape_frontend/poi_symbol_shape.cpp
index acd167ac48..fc9f36c414 100644
--- a/drape_frontend/poi_symbol_shape.cpp
+++ b/drape_frontend/poi_symbol_shape.cpp
@@ -50,13 +50,11 @@ void PoiSymbolShape::Draw(ref_ptr<dp::Batcher> batcher, ref_ptr<dp::TextureManag
dp::AttributeProvider provider(1, 4);
provider.InitStream(0, gpu::SolidTexturingVertex::GetBindingInfo(), make_ref(vertexes));
- m2::PointU const size = pixelSize + m2::PointU(m_params.m_extendingSize,
- m_params.m_extendingSize) * 2;
drape_ptr<dp::OverlayHandle> handle = make_unique_dp<dp::SquareHandle>(m_params.m_id,
dp::Center,
- m_pt, size,
+ m_pt, pixelSize,
GetOverlayPriority());
-
+ handle->SetExtendingSize(m_params.m_extendingSize);
batcher->InsertTriangleStrip(state, make_ref(&provider), move(handle));
}
diff --git a/drape_frontend/render_group.cpp b/drape_frontend/render_group.cpp
index f14cfa3ef1..cd1739fcb5 100755
--- a/drape_frontend/render_group.cpp
+++ b/drape_frontend/render_group.cpp
@@ -60,13 +60,13 @@ void RenderGroup::Update(ScreenBase const & modelView)
void RenderGroup::CollectOverlay(ref_ptr<dp::OverlayTree> tree)
{
- if (m_pendingOnDelete)
+ if (m_pendingOnDelete || GetOpacity() < 1.0)
return;
ASSERT(m_shader != nullptr, ());
ASSERT(m_generalUniforms != nullptr, ());
- for(drape_ptr<dp::RenderBucket> & renderBucket : m_renderBuckets)
- renderBucket->CollectOverlayHandles(tree, GetOpacity() < 1.0);
+ for (auto & renderBucket : m_renderBuckets)
+ renderBucket->CollectOverlayHandles(tree, false /* isTransparent */);
}
void RenderGroup::Render(ScreenBase const & screen)
diff --git a/drape_frontend/text_shape.cpp b/drape_frontend/text_shape.cpp
index 117001cddc..cd6d3b9121 100644
--- a/drape_frontend/text_shape.cpp
+++ b/drape_frontend/text_shape.cpp
@@ -151,20 +151,18 @@ void TextShape::DrawSubString(StraightTextLayout const & layout, dp::FontDecl co
m2::PointU const & pixelSize = layout.GetPixelSize();
- m2::PointU const size = pixelSize + m2::PointU(m_params.m_extendingSize,
- m_params.m_extendingSize) * 2;
-
drape_ptr<dp::OverlayHandle> handle = make_unique_dp<StraightTextHandle>(m_params.m_featureID,
layout.GetText(),
m_params.m_anchor,
glsl::ToVec2(m_basePoint),
- glsl::vec2(size.x, size.y),
+ glsl::vec2(pixelSize.x, pixelSize.y),
baseOffset,
GetOverlayPriority(),
textures,
isOptional,
move(dynamicBuffer));
handle->SetOverlayRank(m_hasPOI ? (isPrimary ? dp::OverlayRank1 : dp::OverlayRank2) : dp::OverlayRank0);
+ handle->SetExtendingSize(m_params.m_extendingSize);
dp::AttributeProvider provider(2, staticBuffer.size());
provider.InitStream(0, gpu::TextStaticVertex::GetBindingInfo(), make_ref(staticBuffer.data()));