Welcome to mirror list, hosted at ThFree Co, Russian Federation.

overlay_tree.hpp « drape - github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 5e9bb5207d58e695ee29863d81736d5be8be62a6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#pragma once

#include "overlay_handle.hpp"

#include "../base/buffer_vector.hpp"
#include "../geometry/screenbase.hpp"

#include "../std/kdtree.hpp"

class OverlayTree
{
public:
  void StartOverlayPlacing(ScreenBase const & screen);
  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]; }
  };

  ScreenBase m_modelView;
  typedef KDTree::KDTree<4, Node> tree_t;
  tree_t m_tree;

private:
  typedef buffer_vector<Node const *, 8> find_result_t;

  class BaseFindFunctor
  {
  public:
    BaseFindFunctor(m2::RectD const & r);

    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 FindIntersectedFunctor : public BaseFindFunctor
  {
    typedef BaseFindFunctor base_t;
  public:
    FindIntersectedFunctor(m2::RectD const & r, find_result_t & intersections);

    void operator()(Node const & node);

  private:
    find_result_t & m_intersections;
  };
};