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