diff options
author | Roman Sorokin <sorok-roma@yandex.ru> | 2014-08-20 17:46:57 +0400 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 02:25:17 +0300 |
commit | 5a4d268daf2f54893250357a0c961375eafb4ff5 (patch) | |
tree | 85ace0ba90f4bd031eaa161a40221e3c74d364aa /drape/overlay_tree.hpp | |
parent | d28f9cb2e29e53b65d1475b5374148e790eaaaaa (diff) |
Improved OverlayTree
Diffstat (limited to 'drape/overlay_tree.hpp')
-rw-r--r-- | drape/overlay_tree.hpp | 63 |
1 files changed, 20 insertions, 43 deletions
diff --git a/drape/overlay_tree.hpp b/drape/overlay_tree.hpp index 29344086af..2b7b994690 100644 --- a/drape/overlay_tree.hpp +++ b/drape/overlay_tree.hpp @@ -2,65 +2,42 @@ #include "overlay_handle.hpp" -#include "../base/buffer_vector.hpp" #include "../geometry/screenbase.hpp" +#include "../geometry/tree4d.hpp" -#include "../std/kdtree.hpp" namespace dp { -class OverlayTree +namespace detail { -public: - void StartOverlayPlacing(ScreenBase const & screen, bool canOverlap = false); - void Add(RefPointer<OverlayHandle> handle); - void EndOverlayPlacing(); - -private: - struct Node - { - typedef double value_type; - - Node(RefPointer<OverlayHandle> handle, m2::RectD const & pixelRect); - - RefPointer<OverlayHandle> m_nodeValue; - double m_pts[4]; - - double operator[] (size_t i) const { return m_pts[i]; } - }; +struct OverlayTraits +{ ScreenBase m_modelView; - typedef KDTree::KDTree<4, Node> tree_t; - tree_t m_tree; - bool m_canOverlap; -private: - typedef buffer_vector<Node const *, 8> find_result_t; - - class BaseFindFunctor + inline m2::RectD const LimitRect(RefPointer<OverlayHandle> handle) { - public: - BaseFindFunctor(m2::RectD const & r); + return handle->GetPixelRect(m_modelView); + } +}; - bool ScanLeft(size_t plane, Node const & v) const; - bool ScanRight(size_t plane, Node const & v) const; +} - protected: - m2::RectD const & m_rect; - }; +class OverlayTree : public m4::Tree<RefPointer<OverlayHandle>, detail::OverlayTraits> +{ + typedef m4::Tree<RefPointer<OverlayHandle>, detail::OverlayTraits> BaseT; - class FindIntersectedFunctor : public BaseFindFunctor - { - typedef BaseFindFunctor base_t; - public: - FindIntersectedFunctor(m2::RectD const & r, find_result_t & intersections); +public: + void StartOverlayPlacing(ScreenBase const & screen, bool canOverlap = false); + void Add(RefPointer<OverlayHandle> handle); + void EndOverlayPlacing(); - void operator()(Node const & node); +private: + ScreenBase const & GetModelView() const { return m_traits.m_modelView; } - private: - find_result_t & m_intersections; - }; +private: + bool m_canOverlap; }; } // namespace dp |