]> git.lizzy.rs Git - minetest.git/commitdiff
Add setting to mirror hands
authorElias Fleckenstein <eliasfleckenstein@web.de>
Sat, 23 Jul 2022 22:18:39 +0000 (00:18 +0200)
committerLizzy Fleckenstein <eliasfleckenstein@web.de>
Tue, 7 Mar 2023 17:18:19 +0000 (18:18 +0100)
builtin/settingtypes.txt
src/client/camera.cpp
src/client/camera.h
src/defaultsettings.cpp

index 962261ed49c2b69bef087af15b0b82735219aaf2..41ebcc6c817d0b67e7828442f6485dc0b5c922cc 100644 (file)
@@ -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
index 68bed8ee2708802bd1905a4bd3b112049a2bb6d4..5a3bd651a18b2f91d59bed77baa7676bcdbbb776 100644 (file)
@@ -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;
        }
 
index ae27a5e423c423be3c55b5e8559a2ea1c68406c4..2fceea6fde286539c92bc2f1e0390f5d12d3ccfc 100644 (file)
@@ -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);
index 5710b731a9fcd53f64866d0b9e1b5bac92a2a775..1dd4e257539da82a50880dec2acec964a5060a78 100644 (file)
@@ -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");