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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
|
#pragma once
#include "drape_frontend/backend_renderer.hpp"
#include "drape_frontend/color_constants.hpp"
#include "drape_frontend/frontend_renderer.hpp"
#include "drape_frontend/route_shape.hpp"
#include "drape_frontend/selection_shape.hpp"
#include "drape_frontend/traffic_generator.hpp"
#include "drape_frontend/threads_commutator.hpp"
#include "drape/pointers.hpp"
#include "drape/texture_manager.hpp"
#include "platform/location.hpp"
#include "geometry/polyline2d.hpp"
#include "geometry/screenbase.hpp"
#include "geometry/triangle2d.hpp"
#include "base/strings_bundle.hpp"
#include "std/map.hpp"
#include "std/mutex.hpp"
namespace dp { class OGLContextFactory; }
namespace df
{
class UserMarksProvider;
class MapDataProvider;
class Viewport;
class DrapeEngine
{
public:
struct Params
{
Params(ref_ptr<dp::OGLContextFactory> factory,
ref_ptr<StringsBundle> stringBundle,
Viewport const & viewport,
MapDataProvider const & model,
double vs,
gui::TWidgetsInitInfo && info,
pair<location::EMyPositionMode, bool> const & initialMyPositionMode,
bool allow3dBuildings,
bool blockTapEvents,
bool showChoosePositionMark,
vector<m2::TriangleD> && boundAreaTriangles,
bool firstLaunch,
bool isRoutingActive,
bool isAutozoomEnabled)
: m_factory(factory)
, m_stringsBundle(stringBundle)
, m_viewport(viewport)
, m_model(model)
, m_vs(vs)
, m_info(move(info))
, m_initialMyPositionMode(initialMyPositionMode)
, m_allow3dBuildings(allow3dBuildings)
, m_blockTapEvents(blockTapEvents)
, m_showChoosePositionMark(showChoosePositionMark)
, m_boundAreaTriangles(move(boundAreaTriangles))
, m_isFirstLaunch(firstLaunch)
, m_isRoutingActive(isRoutingActive)
, m_isAutozoomEnabled(isAutozoomEnabled)
{}
ref_ptr<dp::OGLContextFactory> m_factory;
ref_ptr<StringsBundle> m_stringsBundle;
Viewport m_viewport;
MapDataProvider m_model;
double m_vs;
gui::TWidgetsInitInfo m_info;
pair<location::EMyPositionMode, bool> m_initialMyPositionMode;
bool m_allow3dBuildings;
bool m_blockTapEvents;
bool m_showChoosePositionMark;
vector<m2::TriangleD> m_boundAreaTriangles;
bool m_isFirstLaunch;
bool m_isRoutingActive;
bool m_isAutozoomEnabled;
};
DrapeEngine(Params && params);
~DrapeEngine();
void Update(int w, int h);
void Resize(int w, int h);
void Invalidate();
void SetVisibleViewport(m2::RectD const & rect) const;
void AddTouchEvent(TouchEvent const & event);
void Scale(double factor, m2::PointD const & pxPoint, bool isAnim);
/// if zoom == -1, then current zoom will not change
void SetModelViewCenter(m2::PointD const & centerPt, int zoom, bool isAnim);
void SetModelViewRect(m2::RectD const & rect, bool applyRotation, int zoom, bool isAnim);
void SetModelViewAnyRect(m2::AnyRectD const & rect, bool isAnim);
using TModelViewListenerFn = FrontendRenderer::TModelViewChanged;
void SetModelViewListener(TModelViewListenerFn && fn);
void ClearUserMarksLayer(size_t layerId);
void ChangeVisibilityUserMarksLayer(size_t layerId, bool isVisible);
void UpdateUserMarksLayer(size_t layerId, UserMarksProvider * provider);
void SetRenderingEnabled(ref_ptr<dp::OGLContextFactory> contextFactory = nullptr);
void SetRenderingDisabled(bool const destroyContext);
void InvalidateRect(m2::RectD const & rect);
void UpdateMapStyle();
void SetCompassInfo(location::CompassInfo const & info);
void SetGpsInfo(location::GpsInfo const & info, bool isNavigable, location::RouteMatchingInfo const & routeInfo);
void SwitchMyPositionNextMode();
void LoseLocation();
void StopLocationFollow();
void SetMyPositionModeListener(location::TMyPositionModeChanged && fn);
using TTapEventInfoFn = FrontendRenderer::TTapEventInfoFn;
void SetTapEventInfoListener(TTapEventInfoFn && fn);
using TUserPositionChangedFn = FrontendRenderer::TUserPositionChangedFn;
void SetUserPositionListener(TUserPositionChangedFn && fn);
FeatureID GetVisiblePOI(m2::PointD const & glbPoint);
void SelectObject(SelectionShape::ESelectedObject obj, m2::PointD const & pt, FeatureID const & featureID, bool isAnim);
void DeselectObject();
bool GetMyPosition(m2::PointD & myPosition);
SelectionShape::ESelectedObject GetSelectedObject();
void AddRoute(m2::PolylineD const & routePolyline, vector<double> const & turns,
df::ColorConstant color, df::RoutePattern pattern = df::RoutePattern());
void RemoveRoute(bool deactivateFollowing);
void FollowRoute(int preferredZoomLevel, int preferredZoomLevel3d, bool enableAutoZoom);
void DeactivateRouteFollowing();
void SetRoutePoint(m2::PointD const & position, bool isStart, bool isValid);
void SetWidgetLayout(gui::TWidgetsLayoutInfo && info);
void AllowAutoZoom(bool allowAutoZoom);
void Allow3dMode(bool allowPerspectiveInNavigation, bool allow3dBuildings);
void EnablePerspective();
void UpdateGpsTrackPoints(vector<df::GpsTrackPoint> && toAdd, vector<uint32_t> && toRemove);
void ClearGpsTrackPoints();
void EnableChoosePositionMode(bool enable, vector<m2::TriangleD> && boundAreaTriangles,
bool hasPosition, m2::PointD const & position);
void BlockTapEvents(bool block);
void SetKineticScrollEnabled(bool enabled);
void SetTimeInBackground(double time);
void SetDisplacementMode(int mode);
using TRequestSymbolsSizeCallback = function<void(vector<m2::PointU> const &)>;
void RequestSymbolsSize(vector<string> const & symbols,
TRequestSymbolsSizeCallback const & callback);
void AddTrafficSegments(vector<pair<uint64_t, m2::PolylineD>> const & segments);
void UpdateTraffic(vector<TrafficSegmentData> const & segmentsData);
private:
void AddUserEvent(drape_ptr<UserEvent> && e);
void ModelViewChanged(ScreenBase const & screen);
void MyPositionModeChanged(location::EMyPositionMode mode, bool routingActive);
void TapEvent(TapInfo const & tapInfo);
void UserPositionChanged(m2::PointD const & position);
void ResizeImpl(int w, int h);
void RecacheGui(bool needResetOldGui);
void RecacheMapShapes();
private:
drape_ptr<FrontendRenderer> m_frontend;
drape_ptr<BackendRenderer> m_backend;
drape_ptr<ThreadsCommutator> m_threadCommutator;
drape_ptr<dp::TextureManager> m_textureManager;
drape_ptr<RequestedTiles> m_requestedTiles;
Viewport m_viewport;
TModelViewListenerFn m_modelViewChanged;
location::TMyPositionModeChanged m_myPositionModeChanged;
TUserPositionChangedFn m_userPositionChanged;
TTapEventInfoFn m_tapListener;
gui::TWidgetsInitInfo m_widgetsInfo;
gui::TWidgetsLayoutInfo m_widgetsLayout;
bool m_choosePositionMode = false;
bool m_kineticScrollEnabled = true;
};
} // namespace df
|