Luanti 5.17.0-dev
Loading...
Searching...
No Matches
touchcontrols.h
Go to the documentation of this file.
1// Luanti
2// SPDX-License-Identifier: LGPL-2.1-or-later
3// Copyright (C) 2014 sapier
4// Copyright (C) 2024 grorp, Gregor Parzefall
5
6#pragma once
7
8#include "irrlichttypes.h"
9#include "IEventReceiver.h"
10
11#include <memory>
12#include <optional>
13#include <unordered_map>
14#include <vector>
15
16#include "itemdef.h"
17#include "touchscreenlayout.h"
18#include "util/basic_macros.h"
19#include "client/keycode.h"
20
21class IrrlichtDevice;
22namespace gui
23{
24 class IGUIEnvironment;
25 class IGUIImage;
26 class IGUIStaticText;
27}
28
30
31using namespace core;
32using namespace gui;
33
34
35enum class TapState
36{
40};
41
42
43#define BUTTON_REPEAT_DELAY 0.5f
44#define BUTTON_REPEAT_INTERVAL 0.333f
45
46// Our simulated clicks last some milliseconds so that server-side mods have a
47// chance to detect them via l_get_player_control.
48// If you tap faster than this value, the simulated clicks are of course shorter.
49#define SIMULATED_CLICK_DURATION_MS 50
50
51
53{
57 std::vector<size_t> pointer_ids;
58 std::shared_ptr<IGUIImage> gui_button = nullptr;
59
60 enum {
65 std::string toggle_textures[2];
66};
67
68
70{
71public:
72 TouchControls(IrrlichtDevice *device, ISimpleTextureSource *tsrc);
75
76 void translateEvent(const SEvent &event);
78
79 double getYawChange()
80 {
81 double res = m_camera_yaw_change;
83 return res;
84 }
85
86 double getPitchChange() {
87 double res = m_camera_pitch_change;
89 return res;
90 }
91
93
105 line3d<f32> getShootline() { return m_shootline; }
106
107 void step(float dtime);
108
109 void setVisible(bool visible);
110 void hide();
111 void show();
112
113 void resetHotbarRects();
114 void registerHotbarRect(u16 index, const recti &rect);
115 std::optional<u16> getHotbarSelection();
116
118 IGUIStaticText *getStatusText() { return m_status_text.get(); }
119
120private:
121 IrrlichtDevice *m_device = nullptr;
122 IGUIEnvironment *m_guienv = nullptr;
123 IEventReceiver *m_receiver = nullptr;
125 bool m_visible = true;
126
127 // changes to these two values are handled in TouchControls::step
130
131 // cached settings
137
138 static void settingChangedCallback(const std::string &name, void *data);
139 void readSettings();
140
142 void applyLayout(const ButtonLayout &layout);
143
144 std::unordered_map<u16, recti> m_hotbar_rects;
145 std::optional<u16> m_hotbar_selection = std::nullopt;
146
147 // value in degree
150
158 line3d<f32> m_shootline;
159
160 bool m_has_move_id = false;
161 size_t m_move_id;
164 // m_move_pos stays valid even after the m_move_id pointer has been
165 // released and m_pointer_pos[m_move_id] has been erased
166 // (or even overwritten by a new pointer reusing the same id).
168 // This is needed so that we don't miss if m_has_move_id is true for less
169 // than one client step, i.e. press and release happen in the same step.
170 bool m_had_move_id = false;
172
173 bool m_has_joystick_id = false;
177 std::shared_ptr<IGUIImage> m_joystick_btn_off;
178 std::shared_ptr<IGUIImage> m_joystick_btn_bg;
179 std::shared_ptr<IGUIImage> m_joystick_btn_center;
180
181 std::vector<button_info> m_buttons;
182 std::shared_ptr<IGUIImage> m_overflow_btn;
183
184 bool m_overflow_open = false;
185 std::shared_ptr<IGUIStaticText> m_overflow_bg;
186 std::vector<button_info> m_overflow_buttons;
187 std::vector<std::shared_ptr<IGUIStaticText>> m_overflow_button_titles;
188 std::vector<recti> m_overflow_button_rects;
189
190 std::shared_ptr<IGUIStaticText> m_status_text;
191
192 // Note: TouchControls intentionally uses IGUIImage instead of IGUIButton
193 // for its buttons. We only want static image display, not interactivity,
194 // from Irrlicht.
195
196 void emitGameKeyEvent(GameKeyType key, float value);
197
198 void loadButtonTexture(IGUIImage *gui_button, const std::string &path);
199 void buttonEmitAction(button_info &btn, bool action);
200
201 bool buttonsHandlePress(std::vector<button_info> &buttons, size_t pointer_id, IGUIElement *element);
202 bool buttonsHandleRelease(std::vector<button_info> &buttons, size_t pointer_id);
203 bool buttonsStep(std::vector<button_info> &buttons, float dtime);
204
205 void toggleOverflowMenu();
206 void updateVisibility();
207 void releaseAll();
208
209 // initialize a button
211 void addButton(std::vector<button_info> &buttons,
212 touch_gui_button_id id, const std::string &image,
213 const recti &rect, bool visible);
214 void addToggleButton(std::vector<button_info> &buttons,
216 const std::string &image_1, const std::string &image_2,
217 const recti &rect, bool visible);
218
220 const recti &rect, bool visible);
221
222 // handle pressing hotbar items
223 bool isHotbarButton(const SEvent &event);
224
225 // handle release event
226 void handleReleaseEvent(size_t pointer_id);
227
228 // apply joystick status
229 void applyJoystickStatus();
230
231 // map to store the IDs and original positions of currently pressed pointers
232 std::unordered_map<size_t, v2s32> m_pointer_downpos;
233 // map to store the IDs and positions of currently pressed pointers
234 std::unordered_map<size_t, v2s32> m_pointer_pos;
235
236 // The following are not used if m_interaction_style == BUTTONS_CROSSHAIR
237
240
241 bool m_dig_pressed = false;
243
244 bool m_place_pressed = false;
246};
247
Definition texturesource.h:34
Definition touchcontrols.h:70
bool m_has_joystick_id
Definition touchcontrols.h:173
void registerHotbarRect(u16 index, const recti &rect)
Definition touchcontrols.cpp:675
void addButton(std::vector< button_info > &buttons, touch_gui_button_id id, const std::string &image, const recti &rect, bool visible)
Definition touchcontrols.cpp:340
bool m_dig_pressed
Definition touchcontrols.h:241
DISABLE_CLASS_COPY(TouchControls)
void applyContextControls(const TouchInteractionMode &mode)
Definition touchcontrols.cpp:747
IGUIImage * makeButtonDirect(touch_gui_button_id id, const recti &rect, bool visible)
Definition touchcontrols.cpp:363
v2s32 m_move_pos
Definition touchcontrols.h:167
void show()
Definition touchcontrols.cpp:742
bool m_visible
Definition touchcontrols.h:125
void updateVisibility()
Definition touchcontrols.cpp:701
TapState m_tap_state
Definition touchcontrols.h:239
double m_camera_pitch_change
Definition touchcontrols.h:149
~TouchControls()
Definition touchcontrols.cpp:326
bool mayAddButton(touch_gui_button_id id)
Definition touchcontrols.cpp:332
u64 m_move_downtime
Definition touchcontrols.h:163
IGUIStaticText * getStatusText()
Definition touchcontrols.h:118
u64 m_place_pressed_until
Definition touchcontrols.h:245
void addToggleButton(std::vector< button_info > &buttons, touch_gui_button_id id, const std::string &image_1, const std::string &image_2, const recti &rect, bool visible)
Definition touchcontrols.cpp:353
TouchControls(IrrlichtDevice *device, ISimpleTextureSource *tsrc)
Definition touchcontrols.cpp:193
bool m_fixed_joystick
Definition touchcontrols.h:135
v2u32 m_screensize
Definition touchcontrols.h:128
bool isStatusTextOverridden()
Definition touchcontrols.h:117
void readSettings()
Definition touchcontrols.cpp:212
void resetHotbarRects()
Definition touchcontrols.cpp:670
bool buttonsStep(std::vector< button_info > &buttons, float dtime)
Definition touchcontrols.cpp:117
std::optional< u16 > getHotbarSelection()
Definition touchcontrols.cpp:388
bool m_overflow_open
Definition touchcontrols.h:184
double getYawChange()
Definition touchcontrols.h:79
line3d< f32 > m_shootline
A line starting at the camera and pointing towards the selected object.
Definition touchcontrols.h:158
std::vector< button_info > m_overflow_buttons
Definition touchcontrols.h:186
u16 m_long_tap_delay
Definition touchcontrols.h:134
std::shared_ptr< IGUIStaticText > m_overflow_bg
Definition touchcontrols.h:185
std::vector< recti > m_overflow_button_rects
Definition touchcontrols.h:188
ISimpleTextureSource * m_texturesource
Definition touchcontrols.h:124
void releaseAll()
Definition touchcontrols.cpp:720
std::vector< std::shared_ptr< IGUIStaticText > > m_overflow_button_titles
Definition touchcontrols.h:187
bool m_move_prevent_short_tap
Definition touchcontrols.h:171
void buttonEmitAction(button_info &btn, bool action)
Definition touchcontrols.cpp:51
std::unordered_map< size_t, v2s32 > m_pointer_pos
Definition touchcontrols.h:234
size_t m_joystick_id
Definition touchcontrols.h:174
void applyLayout(const ButtonLayout &layout)
Definition touchcontrols.cpp:231
TouchInteractionMode m_last_mode
Definition touchcontrols.h:238
std::shared_ptr< IGUIImage > m_joystick_btn_center
Definition touchcontrols.h:179
IGUIEnvironment * m_guienv
Definition touchcontrols.h:122
bool buttonsHandlePress(std::vector< button_info > &buttons, size_t pointer_id, IGUIElement *element)
Definition touchcontrols.cpp:70
std::optional< u16 > m_hotbar_selection
Definition touchcontrols.h:145
void loadButtonTexture(IGUIImage *gui_button, const std::string &path)
Definition touchcontrols.cpp:42
IEventReceiver * m_receiver
Definition touchcontrols.h:123
static void settingChangedCallback(const std::string &name, void *data)
Definition touchcontrols.cpp:207
std::shared_ptr< IGUIImage > m_overflow_btn
Definition touchcontrols.h:182
void translateEvent(const SEvent &event)
Definition touchcontrols.cpp:443
s32 m_button_size
Definition touchcontrols.h:129
void setVisible(bool visible)
Definition touchcontrols.cpp:680
std::shared_ptr< IGUIImage > m_joystick_btn_bg
Definition touchcontrols.h:178
std::unordered_map< size_t, v2s32 > m_pointer_downpos
Definition touchcontrols.h:232
bool isHotbarButton(const SEvent &event)
Definition touchcontrols.cpp:373
IrrlichtDevice * m_device
Definition touchcontrols.h:121
void handleReleaseEvent(size_t pointer_id)
Definition touchcontrols.cpp:395
void applyJoystickStatus()
Definition touchcontrols.cpp:616
void toggleOverflowMenu()
Definition touchcontrols.cpp:693
bool m_had_move_id
Definition touchcontrols.h:170
size_t m_move_id
Definition touchcontrols.h:161
std::shared_ptr< IGUIStaticText > m_status_text
Definition touchcontrols.h:190
double m_touchscreen_threshold
Definition touchcontrols.h:133
std::shared_ptr< IGUIImage > m_joystick_btn_off
Definition touchcontrols.h:177
line3d< f32 > getShootline()
Returns a line which describes what the player is pointing at.
Definition touchcontrols.h:105
u64 m_dig_pressed_until
Definition touchcontrols.h:242
std::vector< button_info > m_buttons
Definition touchcontrols.h:181
void hide()
Definition touchcontrols.cpp:737
bool isShootlineAvailable()
Definition touchcontrols.h:92
ButtonLayout m_layout
Definition touchcontrols.h:141
std::unordered_map< u16, recti > m_hotbar_rects
Definition touchcontrols.h:144
bool m_joystick_status_aux1
Definition touchcontrols.h:176
bool buttonsHandleRelease(std::vector< button_info > &buttons, size_t pointer_id)
Definition touchcontrols.cpp:96
bool m_move_has_really_moved
Definition touchcontrols.h:162
void step(float dtime)
Definition touchcontrols.cpp:626
double getPitchChange()
Definition touchcontrols.h:86
double m_camera_yaw_change
Definition touchcontrols.h:148
void emitGameKeyEvent(GameKeyType key, float value)
Definition touchcontrols.cpp:32
bool m_place_pressed
Definition touchcontrols.h:244
bool m_joystick_has_really_moved
Definition touchcontrols.h:175
bool m_joystick_triggers_aux1
Definition touchcontrols.h:136
TouchInteractionStyle m_interaction_style
Definition touchcontrols.h:132
bool m_has_move_id
Definition touchcontrols.h:160
core::vector2d< s32 > v2s32
Definition irr_v2d.h:13
core::vector2d< u32 > v2u32
Definition irr_v2d.h:14
TouchInteractionMode
Definition itemdef.h:38
@ TouchInteractionMode_END
Definition itemdef.h:42
KeyType::T GameKeyType
Definition keys.h:109
Definition printing.h:10
Definition fontengine.h:15
Definition touchscreenlayout.h:85
Definition touchcontrols.h:53
std::string toggle_textures[2]
Definition touchcontrols.h:65
enum button_info::@247302172371072203356073361206233144227125131320 toggleable
std::shared_ptr< IGUIImage > gui_button
Definition touchcontrols.h:58
@ SECOND_TEXTURE
Definition touchcontrols.h:63
@ NOT_TOGGLEABLE
Definition touchcontrols.h:61
@ FIRST_TEXTURE
Definition touchcontrols.h:62
std::vector< size_t > pointer_ids
Definition touchcontrols.h:57
float repeat_counter
Definition touchcontrols.h:55
touch_gui_button_id id
Definition touchcontrols.h:54
GameKeyType game_key
Definition touchcontrols.h:56
TouchControls * g_touchcontrols
Definition touchcontrols.cpp:30
TapState
Definition touchcontrols.h:36
@ LongTap
Definition touchcontrols.h:39
@ ShortTap
Definition touchcontrols.h:38
@ None
Definition touchcontrols.h:37
TouchInteractionStyle
Definition touchscreenlayout.h:25
@ TAP
Definition touchscreenlayout.h:26
touch_gui_button_id
Definition touchscreenlayout.h:33