From b8d4c31772b04d794b02727e803dd01a4c45c1e1 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 24 Jul 2022 00:18:39 +0200 Subject: [PATCH] Add setting to mirror hands --- builtin/settingtypes.txt | 3 +++ src/client/camera.cpp | 18 ++++++++++++------ src/client/camera.h | 1 + src/defaultsettings.cpp | 1 + 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 962261ed4..41ebcc6c8 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -228,6 +228,9 @@ view_bobbing_amount (View bobbing factor) float 1.0 0.0 7.9 # For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double. fall_bobbing_amount (Fall bobbing factor) float 0.03 0.0 100.0 +# Draw main hand on left side of screen, offhand on right side. +mirror_hands (Mirror hands) bool false + [**Camera] # Camera 'near clipping plane' distance in nodes, between 0 and 0.25 diff --git a/src/client/camera.cpp b/src/client/camera.cpp index 68bed8ee2..5a3bd651a 100644 --- a/src/client/camera.cpp +++ b/src/client/camera.cpp @@ -64,6 +64,11 @@ WieldNode::WieldNode(HandIndex index, Client *client, scene::ISceneManager *mgr) m_meshnode->drop(); // mgr grabbed it } +int WieldNode::getDirection() +{ + return g_settings->getBool("mirror_hands") ? -m_direction : m_direction; +} + void WieldNode::step(f32 dtime) { bool was_under_zero = m_change_timer < 0; @@ -136,7 +141,7 @@ void WieldNode::addArmInertia(f32 player_yaw, v3f camera_direction) m_cam_vel_old.X = m_cam_vel.X; f32 acc_X = 0.12f * (m_cam_vel.X - (gap_X * 0.1f)); - m_offset.X += (m_last_cam_pos.X < player_yaw ? acc_X : -acc_X) * m_direction; + m_offset.X += (m_last_cam_pos.X < player_yaw ? acc_X : -acc_X) * getDirection(); if (m_last_cam_pos.X != player_yaw) m_last_cam_pos.X = player_yaw; @@ -191,6 +196,7 @@ void WieldNode::addArmInertia(f32 player_yaw, v3f camera_direction) void WieldNode::update(video::SColor player_light_color, f32 view_bobbing_anim, f32 tool_reload_ratio) { + int direction = getDirection(); m_player_light_color = player_light_color; // Position the wielded item @@ -232,15 +238,15 @@ void WieldNode::update(video::SColor player_light_color, f32 view_bobbing_anim, core::quaternion quat_end(v3f(80, 30, 100) * core::DEGTORAD); core::quaternion quat_slerp; quat_slerp.slerp(quat_begin, quat_end, sin(digfrac * M_PI)); - quat_slerp.W *= m_direction; - quat_slerp.X *= m_direction; + quat_slerp.W *= direction; + quat_slerp.X *= direction; quat_slerp.toEuler(rot); rot *= core::RADTODEG; - pos.X *= m_direction; + pos.X *= direction; } else { f32 bobfrac = my_modf(view_bobbing_anim); - pos.X *= m_direction; - pos.X -= sin(bobfrac*M_PI*2.0+M_PI*m_index) * 3.0 * m_direction; + pos.X *= direction; + pos.X -= sin(bobfrac*M_PI*2.0+M_PI*m_index) * 3.0 * direction; pos.Y += sin(my_modf(bobfrac*2.0)*M_PI+M_PI*m_index) * 3.0; } diff --git a/src/client/camera.h b/src/client/camera.h index ae27a5e42..2fceea6fd 100644 --- a/src/client/camera.h +++ b/src/client/camera.h @@ -77,6 +77,7 @@ class WieldNode { public: WieldNode(HandIndex index, Client *client, scene::ISceneManager *mgr); + int getDirection(); void step(f32 dtime); void addArmInertia(f32 player_yaw, v3f camera_direction); void update(video::SColor player_light_color, f32 view_bobbing_anim, f32 tool_reload_ratio); diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 5710b731a..1dd4e2575 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -217,6 +217,7 @@ void set_default_settings() settings->setDefault("enable_clouds", "true"); settings->setDefault("view_bobbing_amount", "1.0"); settings->setDefault("fall_bobbing_amount", "0.03"); + settings->setDefault("mirror_hands", "false"); settings->setDefault("enable_3d_clouds", "true"); settings->setDefault("cloud_radius", "12"); settings->setDefault("menu_clouds", "true"); -- 2.44.0