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

traffic_manager.cpp « map - github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 6f6c91af2dbf2074d482225f3f395d60ee180db9 (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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include "map/traffic_manager.hpp"

#include "routing/routing_helpers.hpp"

#include "drape_frontend/drape_engine.hpp"

#include "indexer/scales.hpp"

void TrafficManager::SetDrapeEngine(ref_ptr<df::DrapeEngine> engine)
{
  m_drapeEngine = engine;
}

void TrafficManager::UpdateViewport(ScreenBase const & screen)
{
  // 1. Determine mwm's inside viewport.

  // 2. Request traffic for this mwm's.

  // 3. Cache geometry for rendering if it's necessary.
  //MwmSet::MwmId mwmId;
  //if (m_mwmIds.find(mwmId) == m_mwmIds.end())
  //{
  //  df::TrafficSegmentsGeometry geometry;
  //  traffic::TrafficInfo info;
  //  CalculateSegmentsGeometry(info, geometry);
  //  m_mwmIds.insert(mwmId);
  //  m_drapeEngine->CacheTrafficSegmentsGeometry(geometry);
  //}

  // 4. Update traffic colors.
  //df::TrafficSegmentsColoring coloring;
  //traffic::TrafficInfo info;
  //CalculateSegmentsColoring(info, coloring);
  //m_drapeEngine->UpdateTraffic(coloring);

  // 5. Remove some mwm's from cache.
  //MwmSet::MwmId mwmId;
  //m_drapeEngine->ClearTrafficCache(mwmId);
}

void TrafficManager::UpdateMyPosition(MyPosition const & myPosition)
{
  // 1. Determine mwm's nearby "my position".

  // 2. Request traffic for this mwm's.

  // 3. Do all routing stuff.
}

void TrafficManager::CalculateSegmentsGeometry(traffic::TrafficInfo const & trafficInfo,
                                               df::TrafficSegmentsGeometry & output) const
{
  size_t const coloringSize = trafficInfo.GetColoring().size();
  output.reserve(coloringSize);

  vector<FeatureID> features;
  features.reserve(coloringSize);
  for (auto const & c : trafficInfo.GetColoring())
    features.emplace_back(trafficInfo.GetMwmId(), c.first.m_fid);

  int constexpr kScale = scales::GetUpperScale();
  unordered_map<uint32_t, m2::PolylineD> polylines;
  auto featureReader = [&polylines](FeatureType & ft)
  {
    uint32_t const fid = ft.GetID().m_index;
    if (polylines.find(fid) != polylines.end())
      return;

    if (routing::IsRoad(feature::TypesHolder(ft)))
    {
      m2::PolylineD polyline;
      ft.ForEachPoint([&polyline](m2::PointD const & pt) { polyline.Add(pt); }, kScale);
      polylines[fid] = polyline;
    }
  };
  m_index.ReadFeatures(featureReader, features);

  for (auto const & c : trafficInfo.GetColoring())
  {
    output.push_back(make_pair(df::TrafficSegmentID(trafficInfo.GetMwmId(), c.first),
                               polylines[c.first.m_fid].ExtractSegment(c.first.m_idx,
                                                                       c.first.m_dir == 1)));
  }
}

void TrafficManager::CalculateSegmentsColoring(traffic::TrafficInfo const & trafficInfo,
                                               df::TrafficSegmentsColoring & output) const
{
  for (auto const & c : trafficInfo.GetColoring())
  {
    df::TrafficSegmentID const sid (trafficInfo.GetMwmId(), c.first);
    output.emplace_back(sid, c.second);
  }
}