1#include "map_view.h"
2
3#include "editor.h"
4
5#include <engine/keys.h>
6#include <engine/shared/config.h>
7
8#include <game/client/ui.h>
9
10void CMapView::OnInit(CEditor *pEditor)
11{
12 CEditorComponent::OnInit(pEditor);
13 RegisterSubComponent(Component&: m_MapGrid);
14 RegisterSubComponent(Component&: m_ProofMode);
15 InitSubComponents();
16}
17
18void CMapView::OnReset()
19{
20 m_Zoom = CSmoothValue(200.0f, 10.0f, 2000.0f);
21 m_Zoom.OnInit(pEditor: Editor());
22 m_WorldZoom = 1.0f;
23
24 SetWorldOffset({0, 0});
25 SetEditorOffset({0, 0});
26
27 m_ProofMode.OnReset();
28 m_MapGrid.OnReset();
29}
30
31void CMapView::OnMapLoad()
32{
33 m_ProofMode.OnMapLoad();
34}
35
36bool CMapView::IsFocused()
37{
38 return GetWorldOffset() == (m_ProofMode.IsModeMenu() ? m_ProofMode.CurrentMenuBackgroundPosition() : vec2(0.0f, 0.0f));
39}
40
41void CMapView::Focus()
42{
43 SetWorldOffset(m_ProofMode.IsModeMenu() ? m_ProofMode.CurrentMenuBackgroundPosition() : vec2(0.0f, 0.0f));
44}
45
46void CMapView::RenderGroupBorder()
47{
48 std::shared_ptr<CLayerGroup> pGroup = Map()->SelectedGroup();
49 if(pGroup)
50 {
51 pGroup->MapScreen();
52
53 for(size_t i = 0; i < Map()->m_vSelectedLayers.size(); i++)
54 {
55 std::shared_ptr<CLayer> pLayer = Map()->SelectedLayerType(Index: i, Type: LAYERTYPE_TILES);
56 if(pLayer)
57 {
58 CUIRect BorderRect;
59 BorderRect.x = 0.0f;
60 BorderRect.y = 0.0f;
61 pLayer->GetSize(pWidth: &BorderRect.w, pHeight: &BorderRect.h);
62 BorderRect.DrawOutline(Color: ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f));
63 }
64 }
65 }
66}
67
68void CMapView::RenderEditorMap()
69{
70 if(Editor()->m_Dialog == DIALOG_NONE && CLineInput::GetActiveInput() == nullptr && Input()->ShiftIsPressed() && !Input()->ModifierIsPressed() && Input()->KeyPress(Key: KEY_G))
71 {
72 const bool AnyHidden =
73 !Map()->m_pGameLayer->m_Visible ||
74 (Map()->m_pFrontLayer && !Map()->m_pFrontLayer->m_Visible) ||
75 (Map()->m_pTeleLayer && !Map()->m_pTeleLayer->m_Visible) ||
76 (Map()->m_pSpeedupLayer && !Map()->m_pSpeedupLayer->m_Visible) ||
77 (Map()->m_pTuneLayer && !Map()->m_pTuneLayer->m_Visible) ||
78 (Map()->m_pSwitchLayer && !Map()->m_pSwitchLayer->m_Visible);
79 Map()->m_pGameLayer->m_Visible = AnyHidden;
80 if(Map()->m_pFrontLayer)
81 Map()->m_pFrontLayer->m_Visible = AnyHidden;
82 if(Map()->m_pTeleLayer)
83 Map()->m_pTeleLayer->m_Visible = AnyHidden;
84 if(Map()->m_pSpeedupLayer)
85 Map()->m_pSpeedupLayer->m_Visible = AnyHidden;
86 if(Map()->m_pTuneLayer)
87 Map()->m_pTuneLayer->m_Visible = AnyHidden;
88 if(Map()->m_pSwitchLayer)
89 Map()->m_pSwitchLayer->m_Visible = AnyHidden;
90 }
91
92 for(auto &pGroup : Map()->m_vpGroups)
93 {
94 if(pGroup->m_Visible)
95 pGroup->Render();
96 }
97
98 // render the game, tele, speedup, front, tune and switch above everything else
99 if(Map()->m_pGameGroup->m_Visible)
100 {
101 Map()->m_pGameGroup->MapScreen();
102 for(auto &pLayer : Map()->m_pGameGroup->m_vpLayers)
103 {
104 if(pLayer->m_Visible && pLayer->IsEntitiesLayer())
105 pLayer->Render();
106 }
107 }
108
109 std::shared_ptr<CLayerTiles> pSelectedTilesLayer = std::static_pointer_cast<CLayerTiles>(r: Map()->SelectedLayerType(Index: 0, Type: LAYERTYPE_TILES));
110 if(Editor()->m_ShowTileInfo != CEditor::SHOW_TILE_OFF && pSelectedTilesLayer && pSelectedTilesLayer->m_Visible && m_Zoom.GetValue() <= 300.0f)
111 {
112 Map()->SelectedGroup()->MapScreen();
113 pSelectedTilesLayer->ShowInfo();
114 }
115}
116
117void CMapView::ResetZoom()
118{
119 SetEditorOffset({0, 0});
120 m_Zoom.SetValue(100.0f);
121}
122
123float CMapView::ScaleLength(float Value) const
124{
125 return m_WorldZoom * Value;
126}
127
128void CMapView::ZoomMouseTarget(float ZoomFactor)
129{
130 // zoom to the current mouse position
131 // get absolute mouse position
132 float aPoints[4];
133 Graphics()->MapScreenToWorld(
134 CenterX: GetWorldOffset().x, CenterY: GetWorldOffset().y,
135 ParallaxX: 100.0f, ParallaxY: 100.0f, ParallaxZoom: 100.0f, OffsetX: 0.0f, OffsetY: 0.0f, Aspect: Graphics()->ScreenAspect(), Zoom: m_WorldZoom, pPoints: aPoints);
136
137 float WorldWidth = aPoints[2] - aPoints[0];
138 float WorldHeight = aPoints[3] - aPoints[1];
139
140 float MouseWorldX = aPoints[0] + WorldWidth * (Ui()->MouseX() / Ui()->Screen()->w);
141 float MouseWorldY = aPoints[1] + WorldHeight * (Ui()->MouseY() / Ui()->Screen()->h);
142
143 // adjust camera
144 OffsetWorld(Offset: (vec2(MouseWorldX, MouseWorldY) - GetWorldOffset()) * (1.0f - ZoomFactor));
145}
146
147void CMapView::UpdateZoom()
148{
149 float OldLevel = m_Zoom.GetValue();
150 bool UpdatedZoom = m_Zoom.UpdateValue();
151 m_Zoom.SetValueRange(MinValue: 10.0f, MaxValue: g_Config.m_EdLimitMaxZoomLevel ? 2000.0f : std::numeric_limits<float>::max());
152 float NewLevel = m_Zoom.GetValue();
153 if(UpdatedZoom && g_Config.m_EdZoomTarget)
154 ZoomMouseTarget(ZoomFactor: NewLevel / OldLevel);
155 m_WorldZoom = NewLevel / 100.0f;
156}
157
158CSmoothValue *CMapView::Zoom()
159{
160 return &m_Zoom;
161}
162
163const CSmoothValue *CMapView::Zoom() const
164{
165 return &m_Zoom;
166}
167
168CProofMode *CMapView::ProofMode()
169{
170 return &m_ProofMode;
171}
172
173const CProofMode *CMapView::ProofMode() const
174{
175 return &m_ProofMode;
176}
177
178CMapGrid *CMapView::MapGrid()
179{
180 return &m_MapGrid;
181}
182
183const CMapGrid *CMapView::MapGrid() const
184{
185 return &m_MapGrid;
186}
187
188void CMapView::OffsetWorld(vec2 Offset)
189{
190 m_WorldOffset += Offset;
191}
192
193void CMapView::OffsetEditor(vec2 Offset)
194{
195 m_EditorOffset += Offset;
196}
197
198void CMapView::SetWorldOffset(vec2 WorldOffset)
199{
200 m_WorldOffset = WorldOffset;
201}
202
203void CMapView::SetEditorOffset(vec2 EditorOffset)
204{
205 m_EditorOffset = EditorOffset;
206}
207
208vec2 CMapView::GetWorldOffset() const
209{
210 return m_WorldOffset;
211}
212
213vec2 CMapView::GetEditorOffset() const
214{
215 return m_EditorOffset;
216}
217
218float CMapView::GetWorldZoom() const
219{
220 return m_WorldZoom;
221}
222