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

gps_track_renderer.hpp « drape_frontend - github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: b9c67005ce8a8a5a676f18ecd8bf42d548d89fb0 (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
#pragma once

#include "drape_frontend/gps_track_point.hpp"
#include "drape_frontend/gps_track_shape.hpp"

#include "drape/gpu_program_manager.hpp"
#include "drape/pointers.hpp"
#include "drape/uniform_values_storage.hpp"

#include "geometry/screenbase.hpp"
#include "geometry/spline.hpp"

#include "std/map.hpp"
#include "std/vector.hpp"

namespace df
{

class GpsTrackRenderer final
{
public:
  using TRenderDataRequestFn = function<void(size_t)>;
  explicit GpsTrackRenderer(TRenderDataRequestFn const & dataRequestFn);

  void AddRenderData(ref_ptr<dp::GpuProgramManager> mng,
                     drape_ptr<GpsTrackRenderData> && renderData);

  void UpdatePoints(vector<GpsTrackPoint> const & toAdd,
                    vector<uint32_t> const & toRemove);

  void RenderTrack(ScreenBase const & screen, int zoomLevel,
                   ref_ptr<dp::GpuProgramManager> mng,
                   dp::UniformValuesStorage const & commonUniforms);

  void Update();
  void Clear();
  void ClearRenderData();

private:
  float CalculateRadius(ScreenBase const & screen) const;
  size_t GetAvailablePointsCount() const;
  dp::Color CalculatePointColor(size_t pointIndex, m2::PointD const & curPoint,
                                double lengthFromStart, double fullLength) const;
  dp::Color GetColorBySpeed(double speed) const;

  TRenderDataRequestFn m_dataRequestFn;
  vector<drape_ptr<GpsTrackRenderData>> m_renderData;
  vector<GpsTrackPoint> m_points;
  m2::Spline m_pointsSpline;
  bool m_needUpdate;
  bool m_waitForRenderData;
  vector<pair<GpsTrackHandle*, size_t>> m_handlesCache;
  float m_radius;
  m2::PointD m_pivot;
};

} // namespace df