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

route_builder.cpp « drape_frontend - github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 95946eb44f621d30c28c6b90e7b227423c8ffd1a (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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include "drape_frontend/route_builder.hpp"

#include "drape_frontend/route_shape.hpp"

namespace df
{

RouteBuilder::RouteBuilder(TFlushRouteFn const & flushRouteFn,
                           TFlushRouteSignFn const & flushRouteSignFn,
                           TFlushRouteArrowsFn const & flushRouteArrowsFn)
  : m_flushRouteFn(flushRouteFn)
  , m_flushRouteSignFn(flushRouteSignFn)
  , m_flushRouteArrowsFn(flushRouteArrowsFn)
{}

void RouteBuilder::Build(m2::PolylineD const & routePolyline, vector<double> const & turns,
                         df::ColorConstant color, df::RoutePattern const & pattern,
                         ref_ptr<dp::TextureManager> textures)
{
  drape_ptr<RouteData> routeData = make_unique_dp<RouteData>();
  routeData->m_routeIndex = m_routeIndex++;
  routeData->m_color = color;
  routeData->m_sourcePolyline = routePolyline;
  routeData->m_sourceTurns = turns;
  routeData->m_pattern = pattern;
  routeData->m_pivot = routePolyline.GetLimitRect().Center();
  RouteShape::CacheRoute(textures, *routeData.get());
  m_routeCache.insert(make_pair(routeData->m_routeIndex, routePolyline));

  // Flush route geometry.
  GLFunctions::glFlush();

  if (m_flushRouteFn != nullptr)
    m_flushRouteFn(move(routeData));
}

void RouteBuilder::ClearRouteCache()
{
  m_routeCache.clear();
}

void RouteBuilder::BuildSign(m2::PointD const & pos, bool isStart, bool isValid,
                             ref_ptr<dp::TextureManager> textures)
{
  drape_ptr<RouteSignData> routeSignData = make_unique_dp<RouteSignData>();
  routeSignData->m_isStart = isStart;
  routeSignData->m_position = pos;
  routeSignData->m_isValid = isValid;
  if (isValid)
    RouteShape::CacheRouteSign(textures, *routeSignData.get());

  // Flush route sign geometry.
  GLFunctions::glFlush();

  if (m_flushRouteSignFn != nullptr)
    m_flushRouteSignFn(move(routeSignData));
}

void RouteBuilder::BuildArrows(int routeIndex, vector<ArrowBorders> const & borders,
                               ref_ptr<dp::TextureManager> textures)
{
  auto it = m_routeCache.find(routeIndex);
  if (it == m_routeCache.end())
    return;

  drape_ptr<RouteArrowsData> routeArrowsData = make_unique_dp<RouteArrowsData>();
  routeArrowsData->m_pivot = it->second.GetLimitRect().Center();
  RouteShape::CacheRouteArrows(textures, it->second, borders, *routeArrowsData.get());

  // Flush route arrows geometry.
  GLFunctions::glFlush();

  if (m_flushRouteArrowsFn != nullptr)
    m_flushRouteArrowsFn(move(routeArrowsData));
}

} // namespace df