From 194d5d4202fe2a466599b3a4047130c67eadfe38 Mon Sep 17 00:00:00 2001 From: Daria Volvenkova Date: Fri, 30 Nov 2018 16:28:00 +0300 Subject: [PATCH] Fixed overlays displacement in perspective mode. --- drape/overlay_tree.cpp | 44 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/drape/overlay_tree.cpp b/drape/overlay_tree.cpp index 991d549309..7649ecb105 100644 --- a/drape/overlay_tree.cpp +++ b/drape/overlay_tree.cpp @@ -61,6 +61,23 @@ public: return false; } + bool IsEqual(ref_ptr const & l, ref_ptr const & r) const + { + bool const displayFlagLeft = ((!m_enableMask || l->IsSpecialLayerOverlay()) ? true : l->GetDisplayFlag()); + bool const displayFlagRight = ((!m_enableMask || r->IsSpecialLayerOverlay()) ? true : r->GetDisplayFlag()); + + if (displayFlagLeft == displayFlagRight) + { + uint64_t const mask = m_enableMask ? l->GetPriorityMask() & r->GetPriorityMask() : + dp::kPriorityMaskAll; + uint64_t const priorityLeft = l->GetPriority() & mask; + uint64_t const priorityRight = r->GetPriority() & mask; + + return priorityLeft == priorityRight; + } + return false; + } + private: bool m_enableMask; }; @@ -236,18 +253,29 @@ void OverlayTree::InsertHandle(ref_ptr handle, int currentRank, // But if some of already inserted elements have more priority, then we don't insert "handle". for (auto const & rivalHandle : rivals) { - bool const rejectBySelected = m_selectedFeatureID.IsValid() && - rivalHandle->GetOverlayID().m_featureId == m_selectedFeatureID; + bool reject = m_selectedFeatureID.IsValid() && rivalHandle->GetOverlayID().m_featureId == m_selectedFeatureID; - bool rejectByDepth = false; - if (!rejectBySelected && modelView.isPerspective()) + if (!reject) { - bool const pathTextComparation = handle->HasLinearFeatureShape() || rivalHandle->HasLinearFeatureShape(); - rejectByDepth = !pathTextComparation && - handleToCompare->GetPivot(modelView, true).y > rivalHandle->GetPivot(modelView, true).y; + if (modelView.isPerspective()) + { + bool const isEqual = comparator.IsEqual(rivalHandle, handleToCompare); + bool const pathTextComparation = handle->HasLinearFeatureShape() || rivalHandle->HasLinearFeatureShape(); + bool const specialLayerComparation = handle->IsSpecialLayerOverlay() || rivalHandle->IsSpecialLayerOverlay(); + + if (isEqual && !pathTextComparation && !specialLayerComparation) + reject = handleToCompare->GetPivot(modelView, true).y < rivalHandle->GetPivot(modelView, true).y; + else + reject = comparator.IsGreater(rivalHandle, handleToCompare); + } + else + { + reject = comparator.IsGreater(rivalHandle, handleToCompare); + } } - if (rejectBySelected || rejectByDepth || comparator.IsGreater(rivalHandle, handleToCompare)) + + if (reject) { // Handle is displaced and bound to its parent, parent will be displaced too. if (boundToParent)