#ifdef HAVE_TOUCHSCREENGUI
bool m_cache_hold_aux1;
+ bool m_touch_use_crosshair;
+ inline bool isNoCrosshairAllowed() {
+ return !m_touch_use_crosshair && camera->getCameraMode() == CAMERA_MODE_FIRST;
+ }
#endif
#ifdef __ANDROID__
bool m_android_chat_open;
m_invert_mouse = g_settings->getBool("invert_mouse");
m_first_loop_after_window_activation = true;
+#ifdef HAVE_TOUCHSCREENGUI
+ m_touch_use_crosshair = g_settings->getBool("touch_use_crosshair");
+#endif
+
g_client_translations->clear();
// address can change if simple_singleplayer_mode
camera->toggleCameraMode();
+#ifdef HAVE_TOUCHSCREENGUI
+ if (g_touchscreengui)
+ g_touchscreengui->setUseCrosshair(!isNoCrosshairAllowed());
+#endif
+
// Make the player visible depending on camera mode.
playercao->updateMeshCulling();
playercao->setChildrenVisible(camera->getCameraMode() > CAMERA_MODE_FIRST);
shootline.end = shootline.start + camera_direction * BS * d;
#ifdef HAVE_TOUCHSCREENGUI
-
- if ((g_settings->getBool("touchtarget")) && (g_touchscreengui)) {
+ if (g_touchscreengui && isNoCrosshairAllowed()) {
shootline = g_touchscreengui->getShootline();
// Scale shootline to the acual distance the player can reach
- shootline.end = shootline.start
- + shootline.getVector().normalize() * BS * d;
+ shootline.end = shootline.start +
+ shootline.getVector().normalize() * BS * d;
shootline.start += intToFloat(camera_offset, BS);
shootline.end += intToFloat(camera_offset, BS);
}
-
#endif
PointedThing pointed = updatePointedThing(shootline,
(player->hud_flags & HUD_FLAG_CROSSHAIR_VISIBLE) &&
(camera->getCameraMode() != CAMERA_MODE_THIRD_FRONT));
#ifdef HAVE_TOUCHSCREENGUI
- try {
- draw_crosshair = !g_settings->getBool("touchtarget");
- } catch (SettingNotFoundException) {
- }
+ if (isNoCrosshairAllowed())
+ draw_crosshair = false;
#endif
m_rendering_engine->draw_scene(skycolor, m_game_ui->m_flags.show_hud,
m_game_ui->m_flags.show_minimap, draw_wield_tool, draw_crosshair);
translated->MouseInput.Control = false;
translated->MouseInput.ButtonStates = 0;
translated->MouseInput.Event = EMIE_LMOUSE_LEFT_UP;
+ if (m_draw_crosshair) {
+ translated->MouseInput.X = m_screensize.X / 2;
+ translated->MouseInput.Y = m_screensize.Y / 2;
+ }
m_receiver->OnEvent(*translated);
delete translated;
} else {
m_move_downtime = porting::getTimeMs();
m_move_downlocation = v2s32(event.TouchInput.X, event.TouchInput.Y);
m_move_sent_as_mouse_event = false;
+ if (m_draw_crosshair)
+ m_move_downlocation = v2s32(m_screensize.X / 2, m_screensize.Y / 2);
}
}
}
return;
if (m_has_move_id) {
- if ((event.TouchInput.ID == m_move_id) &&
- (!m_move_sent_as_mouse_event)) {
-
+ if (event.TouchInput.ID == m_move_id &&
+ (!m_move_sent_as_mouse_event || m_draw_crosshair)) {
double distance = sqrt(
(m_pointerpos[event.TouchInput.ID].X - event.TouchInput.X) *
(m_pointerpos[event.TouchInput.ID].X - event.TouchInput.X) +
// update camera_yaw and camera_pitch
s32 dx = X - m_pointerpos[event.TouchInput.ID].X;
s32 dy = Y - m_pointerpos[event.TouchInput.ID].Y;
+ m_pointerpos[event.TouchInput.ID] = v2s32(X, Y);
// adapt to similar behaviour as pc screen
const double d = g_settings->getFloat("mouse_sensitivity", 0.001f, 10.0f) * 3.0f;
m_camera_pitch = MYMIN(MYMAX(m_camera_pitch + (dy * d), -180), 180);
// update shootline
+ // no need to update (X, Y) when using crosshair since the shootline is not used
m_shootline = m_device
->getSceneManager()
->getSceneCollisionManager()
->getRayFromScreenCoordinates(v2s32(X, Y));
- m_pointerpos[event.TouchInput.ID] = v2s32(X, Y);
}
} else if ((event.TouchInput.ID == m_move_id) &&
(m_move_sent_as_mouse_event)) {
if (distance > (20 + m_touchscreen_threshold))
return false;
+ v2s32 mPos = v2s32(m_key_events[0].x, m_key_events[0].y);
+ if (m_draw_crosshair) {
+ mPos.X = m_screensize.X / 2;
+ mPos.Y = m_screensize.Y / 2;
+ }
+
auto *translated = new SEvent();
memset(translated, 0, sizeof(SEvent));
translated->EventType = EET_MOUSE_INPUT_EVENT;
- translated->MouseInput.X = m_key_events[0].x;
- translated->MouseInput.Y = m_key_events[0].y;
+ translated->MouseInput.X = mPos.X;
+ translated->MouseInput.Y = mPos.Y;
translated->MouseInput.Shift = false;
translated->MouseInput.Control = false;
translated->MouseInput.ButtonStates = EMBSM_RIGHT;
m_shootline = m_device
->getSceneManager()
->getSceneCollisionManager()
- ->getRayFromScreenCoordinates(v2s32(m_key_events[0].x, m_key_events[0].y));
+ ->getRayFromScreenCoordinates(mPos);
translated->MouseInput.Event = EMIE_RMOUSE_PRESSED_DOWN;
verbosestream << "TouchScreenGUI::translateEvent right click press" << std::endl;
u64 delta = porting::getDeltaMs(m_move_downtime, porting::getTimeMs());
if (delta > MIN_DIG_TIME_MS) {
+ s32 mX = m_move_downlocation.X;
+ s32 mY = m_move_downlocation.Y;
+ if (m_draw_crosshair) {
+ mX = m_screensize.X / 2;
+ mY = m_screensize.Y / 2;
+ }
m_shootline = m_device
->getSceneManager()
->getSceneCollisionManager()
->getRayFromScreenCoordinates(
- v2s32(m_move_downlocation.X,m_move_downlocation.Y));
+ v2s32(mX, mY));
SEvent translated;
memset(&translated, 0, sizeof(SEvent));
translated.EventType = EET_MOUSE_INPUT_EVENT;
- translated.MouseInput.X = m_move_downlocation.X;
- translated.MouseInput.Y = m_move_downlocation.Y;
+ translated.MouseInput.X = mX;
+ translated.MouseInput.Y = mY;
translated.MouseInput.Shift = false;
translated.MouseInput.Control = false;
translated.MouseInput.ButtonStates = EMBSM_LEFT;