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:
-rw-r--r--drape/overlay_handle.cpp5
-rw-r--r--drape/overlay_handle.hpp1
-rw-r--r--drape/overlay_tree.cpp21
-rw-r--r--drape/overlay_tree.hpp3
-rwxr-xr-xdrape_frontend/frontend_renderer.cpp3
-rw-r--r--drape_frontend/path_text_shape.cpp41
-rw-r--r--drape_frontend/path_text_shape.hpp2
-rw-r--r--drape_frontend/tile_info.cpp2
8 files changed, 56 insertions, 22 deletions
diff --git a/drape/overlay_handle.cpp b/drape/overlay_handle.cpp
index 9aae8c3a6b..fae2487c67 100644
--- a/drape/overlay_handle.cpp
+++ b/drape/overlay_handle.cpp
@@ -193,6 +193,11 @@ bool OverlayHandle::IsMinVisibilityTimeUp() const
return t > kMinVisibilityTimeMs;
}
+uint64_t OverlayHandle::GetPriorityInFollowingMode() const
+{
+ return GetPriority();
+}
+
SquareHandle::SquareHandle(FeatureID const & id, dp::Anchor anchor,
m2::PointD const & gbPivot, m2::PointD const & pxSize,
diff --git a/drape/overlay_handle.hpp b/drape/overlay_handle.hpp
index dde756fc16..8cfda56e3e 100644
--- a/drape/overlay_handle.hpp
+++ b/drape/overlay_handle.hpp
@@ -78,6 +78,7 @@ public:
uint64_t const & GetPriority() const;
virtual uint64_t GetPriorityMask() const { return kPriorityMaskAll; }
+ virtual uint64_t GetPriorityInFollowingMode() const;
virtual bool IsBound() const { return false; }
diff --git a/drape/overlay_tree.cpp b/drape/overlay_tree.cpp
index beeddddb0e..e720c10225 100644
--- a/drape/overlay_tree.cpp
+++ b/drape/overlay_tree.cpp
@@ -18,6 +18,8 @@ namespace
class HandleComparator
{
public:
+ HandleComparator(bool followingMode) : m_followingMode(followingMode) {}
+
bool operator()(ref_ptr<OverlayHandle> const & l, ref_ptr<OverlayHandle> const & r) const
{
return IsGreater(l, r);
@@ -26,8 +28,10 @@ public:
bool IsGreater(ref_ptr<OverlayHandle> const & l, ref_ptr<OverlayHandle> const & r) const
{
uint64_t const mask = l->GetPriorityMask() & r->GetPriorityMask();
- uint64_t const priorityLeft = l->GetPriority() & mask;
- uint64_t const priorityRight = r->GetPriority() & mask;
+ uint64_t const priorityLeft = (m_followingMode ? l->GetPriorityInFollowingMode() :
+ l->GetPriority()) & mask;
+ uint64_t const priorityRight = (m_followingMode ? r->GetPriorityInFollowingMode() :
+ r->GetPriority()) & mask;
if (priorityLeft > priorityRight)
return true;
@@ -44,12 +48,16 @@ public:
return false;
}
+
+private:
+ bool m_followingMode;
};
} // namespace
OverlayTree::OverlayTree()
: m_frameCounter(-1)
+ , m_followingMode(false)
{
for (size_t i = 0; i < m_handles.size(); i++)
m_handles[i].reserve(kAverageHandlesCount[i]);
@@ -145,7 +153,7 @@ void OverlayTree::InsertHandle(ref_ptr<OverlayHandle> handle,
// If input element "handle" more priority than all "Intersected elements"
// than we remove all "Intersected elements" and insert input element "handle".
// But if some of already inserted elements more priority than we don't insert "handle".
- HandleComparator comparator;
+ HandleComparator comparator(m_followingMode);
for (auto const & info : elements)
{
bool const rejectByDepth = is3dMode ? posY > info.m_handle->GetPivot(modelView, is3dMode).y : false;
@@ -176,7 +184,7 @@ void OverlayTree::EndOverlayPlacing()
{
ASSERT(IsNeedUpdate(), ());
- HandleComparator comparator;
+ HandleComparator comparator(m_followingMode);
for (int rank = 0; rank < dp::OverlayRanksCount; rank++)
{
@@ -263,4 +271,9 @@ void OverlayTree::Select(m2::RectD const & rect, TSelectResult & result) const
});
}
+void OverlayTree::SetFollowingMode(bool mode)
+{
+ m_followingMode = mode;
+}
+
} // namespace dp
diff --git a/drape/overlay_tree.hpp b/drape/overlay_tree.hpp
index b65457f1cc..07f385a46b 100644
--- a/drape/overlay_tree.hpp
+++ b/drape/overlay_tree.hpp
@@ -61,6 +61,8 @@ public:
using TSelectResult = buffer_vector<ref_ptr<OverlayHandle>, 8>;
void Select(m2::RectD const & rect, TSelectResult & result) const;
+ void SetFollowingMode(bool mode);
+
private:
ScreenBase const & GetModelView() const { return m_traits.m_modelView; }
void InsertHandle(ref_ptr<OverlayHandle> handle,
@@ -72,6 +74,7 @@ private:
int m_frameCounter;
array<vector<ref_ptr<OverlayHandle>>, dp::OverlayRanksCount> m_handles;
vector<detail::OverlayInfo> m_handlesToDelete;
+ bool m_followingMode;
};
} // namespace dp
diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp
index 357211f43f..12cba9ef10 100755
--- a/drape_frontend/frontend_renderer.cpp
+++ b/drape_frontend/frontend_renderer.cpp
@@ -387,6 +387,7 @@ void FrontendRenderer::AcceptMessage(ref_ptr<Message> message)
if (msg->NeedDeactivateFollowing())
{
m_myPositionController->DeactivateRouting();
+ m_overlayTree->SetFollowingMode(false);
if (m_enable3dInNavigation)
DisablePerspective();
}
@@ -398,6 +399,7 @@ void FrontendRenderer::AcceptMessage(ref_ptr<Message> message)
ref_ptr<FollowRouteMessage> const msg = message;
m_myPositionController->NextMode(!m_enable3dInNavigation ? msg->GetPreferredZoomLevel()
: msg->GetPreferredZoomLevelIn3d());
+ m_overlayTree->SetFollowingMode(true);
if (m_enable3dInNavigation)
AddUserEvent(EnablePerspectiveEvent(msg->GetRotationAngle(), msg->GetAngleFOV(),
true /* animated */, false /* immediately start*/));
@@ -407,6 +409,7 @@ void FrontendRenderer::AcceptMessage(ref_ptr<Message> message)
case Message::DeactivateRouteFollowing:
{
m_myPositionController->DeactivateRouting();
+ m_overlayTree->SetFollowingMode(false);
if (m_enable3dInNavigation)
DisablePerspective();
break;
diff --git a/drape_frontend/path_text_shape.cpp b/drape_frontend/path_text_shape.cpp
index e501a54074..10060c2555 100644
--- a/drape_frontend/path_text_shape.cpp
+++ b/drape_frontend/path_text_shape.cpp
@@ -31,10 +31,9 @@ class PathTextHandle : public df::TextHandle
public:
PathTextHandle(m2::SharedSpline const & spl,
df::SharedTextLayout const & layout,
- float mercatorOffset,
- float depth,
- uint32_t textIndex,
- uint64_t priority,
+ float mercatorOffset, float depth,
+ uint32_t textIndex, uint64_t priority,
+ uint64_t priorityFollowingMode,
ref_ptr<dp::TextureManager> textureManager,
bool isBillboard)
: TextHandle(FeatureID(), layout->GetText(), dp::Center, priority, textureManager, isBillboard)
@@ -43,6 +42,7 @@ public:
, m_textIndex(textIndex)
, m_globalOffset(mercatorOffset)
, m_depth(depth)
+ , m_priorityFollowingMode(priorityFollowingMode)
{
m2::Spline::iterator centerPointIter = m_spline.CreateIterator();
@@ -81,6 +81,9 @@ public:
if (screen.isPerspective())
{
+ if (pixelSpline.GetSize() < 2)
+ return false;
+
vector<float> offsets;
df::PathTextLayout::CalculatePositions(offsets, pixelSpline.GetLength(), 1.0,
m_layout->GetPixelLength());
@@ -173,6 +176,11 @@ public:
return false;
}
+ uint64_t GetPriorityInFollowingMode() const override
+ {
+ return m_priorityFollowingMode;
+ }
+
private:
m2::SharedSpline m_spline;
df::SharedTextLayout m_layout;
@@ -180,6 +188,7 @@ private:
m2::PointD m_globalPivot;
float const m_globalOffset;
float const m_depth;
+ uint64_t const m_priorityFollowingMode;
};
}
@@ -193,13 +202,15 @@ PathTextShape::PathTextShape(m2::SharedSpline const & spline,
, m_params(params)
{}
-uint64_t PathTextShape::GetOverlayPriority() const
+uint64_t PathTextShape::GetOverlayPriority(bool followingMode) const
{
// Overlay priority for path text shapes considers length of the text.
// Greater test length has more priority, because smaller texts have more chances to be shown along the road.
// [6 bytes - standard overlay priority][1 byte - reserved][1 byte - length].
static uint64_t constexpr kMask = ~static_cast<uint64_t>(0xFF);
- uint64_t priority = dp::CalculateOverlayPriority(m_params.m_minVisibleScale, m_params.m_rank, m_params.m_depth);
+ uint64_t priority = dp::kPriorityMaskAll;
+ if (!followingMode)
+ priority = dp::CalculateOverlayPriority(m_params.m_minVisibleScale, m_params.m_rank, m_params.m_depth);
priority &= kMask;
priority |= (static_cast<uint8_t>(m_params.m_text.size()));
@@ -237,11 +248,10 @@ void PathTextShape::DrawPathTextPlain(ref_ptr<dp::TextureManager> textures,
provider.InitStream(1, gpu::TextDynamicVertex::GetBindingInfo(), make_ref(dynBuffer.data()));
drape_ptr<dp::OverlayHandle> handle = make_unique_dp<PathTextHandle>(m_spline, layoutPtr, offset,
- m_params.m_depth,
- textIndex,
- GetOverlayPriority(),
- textures,
- true);
+ m_params.m_depth, textIndex,
+ GetOverlayPriority(false /* followingMode */),
+ GetOverlayPriority(true /* followingMode */),
+ textures, true);
batcher->InsertListOfStrip(state, make_ref(&provider), move(handle), 4);
}
}
@@ -279,11 +289,10 @@ void PathTextShape::DrawPathTextOutlined(ref_ptr<dp::TextureManager> textures,
provider.InitStream(1, gpu::TextDynamicVertex::GetBindingInfo(), make_ref(dynBuffer.data()));
drape_ptr<dp::OverlayHandle> handle = make_unique_dp<PathTextHandle>(m_spline, layoutPtr, offset,
- m_params.m_depth,
- textIndex,
- GetOverlayPriority(),
- textures,
- true);
+ m_params.m_depth, textIndex,
+ GetOverlayPriority(false /* followingMode */),
+ GetOverlayPriority(true /* followingMode */),
+ textures, true);
batcher->InsertListOfStrip(state, make_ref(&provider), move(handle), 4);
}
}
diff --git a/drape_frontend/path_text_shape.hpp b/drape_frontend/path_text_shape.hpp
index 04cc864584..b9dde17f22 100644
--- a/drape_frontend/path_text_shape.hpp
+++ b/drape_frontend/path_text_shape.hpp
@@ -17,7 +17,7 @@ public:
MapShapePriority GetPriority() const override { return MapShapePriority::LinePriority; }
private:
- uint64_t GetOverlayPriority() const;
+ uint64_t GetOverlayPriority(bool followingMode) const;
void DrawPathTextPlain(ref_ptr<dp::TextureManager> textures,
ref_ptr<dp::Batcher> batcher,
diff --git a/drape_frontend/tile_info.cpp b/drape_frontend/tile_info.cpp
index 5dcccc4162..d3854c17b5 100644
--- a/drape_frontend/tile_info.cpp
+++ b/drape_frontend/tile_info.cpp
@@ -16,8 +16,8 @@ namespace df
TileInfo::TileInfo(drape_ptr<EngineContext> && context)
: m_context(move(context))
- , m_isCanceled(false)
, m_is3d(false)
+ , m_isCanceled(false)
{
}