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:
authorr.kuznetsov <r.kuznetsov@corp.mail.ru>2015-05-25 10:03:32 +0300
committerr.kuznetsov <r.kuznetsov@corp.mail.ru>2015-11-30 16:08:30 +0300
commit75d9e73f981dcf41a6b28131670a8f4d3f41a978 (patch)
treedd6745d5d7f8ba71350b7efc71c92f9ef5c7156a /drape
parent4da09701875359b00d81ab00a09c5ddb70a7c83e (diff)
Added separated clipping of transparent and solid objects by overlay tree
Diffstat (limited to 'drape')
-rw-r--r--drape/overlay_tree.cpp18
-rw-r--r--drape/overlay_tree.hpp27
-rw-r--r--drape/render_bucket.cpp4
-rw-r--r--drape/render_bucket.hpp2
4 files changed, 34 insertions, 17 deletions
diff --git a/drape/overlay_tree.cpp b/drape/overlay_tree.cpp
index 7fd5c2b9dc..43f964735e 100644
--- a/drape/overlay_tree.cpp
+++ b/drape/overlay_tree.cpp
@@ -12,7 +12,7 @@ void OverlayTree::StartOverlayPlacing(ScreenBase const & screen, bool canOverlap
ASSERT(IsEmpty(), ());
}
-void OverlayTree::Add(ref_ptr<OverlayHandle> handle)
+void OverlayTree::Add(ref_ptr<OverlayHandle> handle, bool isTransparent)
{
ScreenBase const & modelView = GetModelView();
@@ -29,16 +29,16 @@ void OverlayTree::Add(ref_ptr<OverlayHandle> handle)
return;
}
- typedef buffer_vector<ref_ptr<OverlayHandle>, 8> OverlayContainerT;
+ typedef buffer_vector<detail::OverlayInfo, 8> OverlayContainerT;
OverlayContainerT elements;
/*
* Find elements that already on OverlayTree and it's pixel rect
* intersect with handle pixel rect ("Intersected elements")
*/
- ForEachInRect(pixelRect, [&] (ref_ptr<OverlayHandle> r)
+ ForEachInRect(pixelRect, [&] (detail::OverlayInfo const & info)
{
- if (handle->IsIntersect(modelView, r))
- elements.push_back(r);
+ if (handle->IsIntersect(modelView, info.m_handle) && isTransparent == info.m_isTransparent)
+ elements.push_back(info);
});
double const inputPriority = handle->GetPriority();
@@ -49,20 +49,20 @@ void OverlayTree::Add(ref_ptr<OverlayHandle> handle)
* But if some of already inserted elements more priority than we don't insert "handle"
*/
for (OverlayContainerT::const_iterator it = elements.begin(); it != elements.end(); ++it)
- if (inputPriority < (*it)->GetPriority())
+ if (inputPriority < (*it).m_handle->GetPriority())
return;
for (OverlayContainerT::const_iterator it = elements.begin(); it != elements.end(); ++it)
Erase(*it);
- BaseT::Add(handle, pixelRect);
+ BaseT::Add(detail::OverlayInfo(handle, isTransparent), pixelRect);
}
void OverlayTree::EndOverlayPlacing()
{
- ForEach([] (ref_ptr<OverlayHandle> handle)
+ ForEach([] (detail::OverlayInfo const & info)
{
- handle->SetIsVisible(true);
+ info.m_handle->SetIsVisible(true);
});
Clear();
diff --git a/drape/overlay_tree.hpp b/drape/overlay_tree.hpp
index b389c69eb6..6c0282e3e6 100644
--- a/drape/overlay_tree.hpp
+++ b/drape/overlay_tree.hpp
@@ -12,25 +12,42 @@ namespace dp
namespace detail
{
+struct OverlayInfo
+{
+ ref_ptr<OverlayHandle> m_handle;
+ bool m_isTransparent = false;
+
+ OverlayInfo() = default;
+ OverlayInfo(ref_ptr<OverlayHandle> handle, bool isTransparent)
+ : m_handle(handle)
+ , m_isTransparent(isTransparent)
+ {}
+
+ bool operator==(OverlayInfo const & rhs) const
+ {
+ return m_handle == rhs.m_handle && m_isTransparent == rhs.m_isTransparent;
+ }
+};
+
struct OverlayTraits
{
ScreenBase m_modelView;
- inline m2::RectD const LimitRect(ref_ptr<OverlayHandle> handle)
+ inline m2::RectD const LimitRect(OverlayInfo const & info)
{
- return handle->GetPixelRect(m_modelView);
+ return info.m_handle->GetPixelRect(m_modelView);
}
};
}
-class OverlayTree : public m4::Tree<ref_ptr<OverlayHandle>, detail::OverlayTraits>
+class OverlayTree : public m4::Tree<detail::OverlayInfo, detail::OverlayTraits>
{
- typedef m4::Tree<ref_ptr<OverlayHandle>, detail::OverlayTraits> BaseT;
+ typedef m4::Tree<detail::OverlayInfo, detail::OverlayTraits> BaseT;
public:
void StartOverlayPlacing(ScreenBase const & screen, bool canOverlap = false);
- void Add(ref_ptr<OverlayHandle> handle);
+ void Add(ref_ptr<OverlayHandle> handle, bool isTransparent);
void EndOverlayPlacing();
private:
diff --git a/drape/render_bucket.cpp b/drape/render_bucket.cpp
index 1c1babad64..836c98f07e 100644
--- a/drape/render_bucket.cpp
+++ b/drape/render_bucket.cpp
@@ -61,10 +61,10 @@ void RenderBucket::Update(ScreenBase const & modelView)
overlayHandle->Update(modelView);
}
-void RenderBucket::CollectOverlayHandles(ref_ptr<OverlayTree> tree)
+void RenderBucket::CollectOverlayHandles(ref_ptr<OverlayTree> tree, bool isTransparent)
{
for (drape_ptr<OverlayHandle> const & overlayHandle : m_overlay)
- tree->Add(make_ref(overlayHandle));
+ tree->Add(make_ref(overlayHandle), isTransparent);
}
void RenderBucket::Render(ScreenBase const & screen)
diff --git a/drape/render_bucket.hpp b/drape/render_bucket.hpp
index 5eddca0029..d41ae7b283 100644
--- a/drape/render_bucket.hpp
+++ b/drape/render_bucket.hpp
@@ -26,7 +26,7 @@ public:
void AddOverlayHandle(drape_ptr<OverlayHandle> && handle);
void Update(ScreenBase const & modelView);
- void CollectOverlayHandles(ref_ptr<OverlayTree> tree);
+ void CollectOverlayHandles(ref_ptr<OverlayTree> tree, bool isTransparent);
void Render(ScreenBase const & screen);
/// Only for testing! Don't use this function in production code!