From 5a4d268daf2f54893250357a0c961375eafb4ff5 Mon Sep 17 00:00:00 2001 From: Roman Sorokin Date: Wed, 20 Aug 2014 16:46:57 +0300 Subject: Improved OverlayTree --- drape/overlay_tree.hpp | 63 ++++++++++++++++---------------------------------- 1 file changed, 20 insertions(+), 43 deletions(-) (limited to 'drape/overlay_tree.hpp') 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 handle); - void EndOverlayPlacing(); - -private: - struct Node - { - typedef double value_type; - - Node(RefPointer handle, m2::RectD const & pixelRect); - - RefPointer 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 find_result_t; - - class BaseFindFunctor + inline m2::RectD const LimitRect(RefPointer 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, detail::OverlayTraits> +{ + typedef m4::Tree, 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 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 -- cgit v1.2.3