diff options
author | Elias Fleckenstein <eliasfleckenstein@web.de> | 2022-05-12 13:24:36 +0200 |
---|---|---|
committer | Elias Fleckenstein <eliasfleckenstein@web.de> | 2022-07-23 20:11:53 +0200 |
commit | b7767dd9aae27f0fe6b7ae3b99d0f51860979f82 (patch) | |
tree | 0eb7414f1004f9c4d5a77c94df65220325322b5e /src/client/camera.cpp | |
parent | 2351c9561265d4136f78ce3dd73c0c77acfed711 (diff) | |
download | minetest-b7767dd9aae27f0fe6b7ae3b99d0f51860979f82.tar.xz |
Dual Wielding
Diffstat (limited to 'src/client/camera.cpp')
-rw-r--r-- | src/client/camera.cpp | 190 |
1 files changed, 110 insertions, 80 deletions
diff --git a/src/client/camera.cpp b/src/client/camera.cpp index df75c52d6..5ca4e4908 100644 --- a/src/client/camera.cpp +++ b/src/client/camera.cpp @@ -45,6 +45,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #define WIELDMESH_AMPLITUDE_X 7.0f #define WIELDMESH_AMPLITUDE_Y 10.0f +#define HANDS (int i = 0, s = +1; i <= 1; i++, s *= -1) // i is index, s is sign + Camera::Camera(MapDrawControl &draw_control, Client *client, RenderingEngine *rendering_engine): m_draw_control(draw_control), m_client(client), @@ -62,9 +64,12 @@ Camera::Camera(MapDrawControl &draw_control, Client *client, RenderingEngine *re // all other 3D scene nodes and before the GUI. m_wieldmgr = smgr->createNewSceneManager(); m_wieldmgr->addCameraSceneNode(); - m_wieldnode = new WieldMeshSceneNode(m_wieldmgr, -1, false); - m_wieldnode->setItem(ItemStack(), m_client); - m_wieldnode->drop(); // m_wieldmgr grabbed it + + for HANDS { + m_wieldnode[i] = new WieldMeshSceneNode(m_wieldmgr, -1, false); + m_wieldnode[i]->setItem(ItemStack(), m_client); + m_wieldnode[i]->drop(); // m_wieldmgr grabbed it + } /* TODO: Add a callback function so these can be updated when a setting * changes. At this point in time it doesn't matter (e.g. /set @@ -151,12 +156,16 @@ void Camera::step(f32 dtime) m_view_bobbing_fall = -1; // Mark the effect as finished } - bool was_under_zero = m_wield_change_timer < 0; - m_wield_change_timer = MYMIN(m_wield_change_timer + dtime, 0.125); + for HANDS { + bool was_under_zero = m_wield_change_timer[i]; + m_wield_change_timer[i] = MYMIN(m_wield_change_timer[i] + dtime, 0.125); + + if (m_wield_change_timer[i] >= 0 && was_under_zero) { + m_wieldnode[i]->setItem(m_wield_item_next[i], m_client); - if (m_wield_change_timer >= 0 && was_under_zero) { - m_wieldnode->setItem(m_wield_item_next, m_client); - m_wieldnode->setNodeLightColor(m_player_light_color); + if (i == 0) + m_wieldnode[i]->setNodeLightColor(m_player_light_color); + } } if (m_view_bobbing_state != 0) @@ -197,24 +206,27 @@ void Camera::step(f32 dtime) } } - if (m_digging_button != -1) { - f32 offset = dtime * 3.5f; - float m_digging_anim_was = m_digging_anim; - m_digging_anim += offset; - if (m_digging_anim >= 1) - { - m_digging_anim = 0; - m_digging_button = -1; - } - float lim = 0.15; - if(m_digging_anim_was < lim && m_digging_anim >= lim) - { - if (m_digging_button == 0) { - m_client->getEventManager()->put(new SimpleTriggerEvent(MtEvent::CAMERA_PUNCH_LEFT)); - } else if(m_digging_button == 1) { - m_client->getEventManager()->put(new SimpleTriggerEvent(MtEvent::CAMERA_PUNCH_RIGHT)); + for HANDS { + if (m_digging_button[i] != -1) { + f32 offset = dtime * 3.5f; + float m_digging_anim_was = m_digging_anim[i]; + m_digging_anim[i] += offset; + if (m_digging_anim[i] >= 1) + { + m_digging_anim[i] = 0; + m_digging_button[i] = -1; + } + float lim = 0.15; + if(m_digging_anim_was < lim && m_digging_anim[i] >= lim) + { + if (m_digging_button[i] == 0) { + m_client->getEventManager()->put(new SimpleTriggerEvent(MtEvent::CAMERA_PUNCH_LEFT)); + } else if(m_digging_button[i] == 1) { + m_client->getEventManager()->put(new SimpleTriggerEvent(MtEvent::CAMERA_PUNCH_RIGHT)); + } } } + } } @@ -514,52 +526,68 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 tool_reload_ratio) if (m_arm_inertia) addArmInertia(player->getYaw()); - // Position the wielded item - //v3f wield_position = v3f(45, -35, 65); - v3f wield_position = v3f(m_wieldmesh_offset.X, m_wieldmesh_offset.Y, 65); - //v3f wield_rotation = v3f(-100, 120, -100); - v3f wield_rotation = v3f(-100, 120, -100); - wield_position.Y += fabs(m_wield_change_timer)*320 - 40; - if(m_digging_anim < 0.05 || m_digging_anim > 0.5) - { - f32 frac = 1.0; - if(m_digging_anim > 0.5) - frac = 2.0 * (m_digging_anim - 0.5); - // This value starts from 1 and settles to 0 - f32 ratiothing = std::pow((1.0f - tool_reload_ratio), 0.5f); - //f32 ratiothing2 = pow(ratiothing, 0.5f); - f32 ratiothing2 = (easeCurve(ratiothing*0.5))*2.0; - wield_position.Y -= frac * 25.0 * pow(ratiothing2, 1.7f); - //wield_position.Z += frac * 5.0 * ratiothing2; - wield_position.X -= frac * 35.0 * pow(ratiothing2, 1.1f); - wield_rotation.Y += frac * 70.0 * pow(ratiothing2, 1.4f); - //wield_rotation.X -= frac * 15.0 * pow(ratiothing2, 1.4f); - //wield_rotation.Z += frac * 15.0 * pow(ratiothing2, 1.0f); - } - if (m_digging_button != -1) - { - f32 digfrac = m_digging_anim; - wield_position.X -= 50 * sin(pow(digfrac, 0.8f) * M_PI); - wield_position.Y += 24 * sin(digfrac * 1.8 * M_PI); - wield_position.Z += 25 * 0.5; - - // Euler angles are PURE EVIL, so why not use quaternions? - core::quaternion quat_begin(wield_rotation * core::DEGTORAD); - 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.toEuler(wield_rotation); - wield_rotation *= core::RADTODEG; - } else { - f32 bobfrac = my_modf(m_view_bobbing_anim); - wield_position.X -= sin(bobfrac*M_PI*2.0) * 3.0; - wield_position.Y += sin(my_modf(bobfrac*2.0)*M_PI) * 3.0; - } - m_wieldnode->setPosition(wield_position); - m_wieldnode->setRotation(wield_rotation); - m_player_light_color = player->light_color; - m_wieldnode->setNodeLightColor(m_player_light_color); + + for HANDS { + // Position the wielded item + //v3f wield_position = v3f(45, -35, 65); + v3f wield_position = v3f(m_wieldmesh_offset.X, m_wieldmesh_offset.Y, 65); + //v3f wield_rotation = v3f(-100, 120, -100); + v3f wield_rotation = v3f(-100, 120, -100); + + wield_position.Y += fabs(m_wield_change_timer[i])*320 - 40; + if(m_digging_anim[i] < 0.05 || m_digging_anim[i] > 0.5) + { + f32 frac = 1.0; + if(m_digging_anim[i] > 0.5) + frac = 2.0 * (m_digging_anim[i] - 0.5); + // This value starts from 1 and settles to 0 + f32 ratiothing = std::pow((1.0f - tool_reload_ratio), 0.5f); + //f32 ratiothing2 = pow(ratiothing, 0.5f); + f32 ratiothing2 = (easeCurve(ratiothing*0.5))*2.0; + wield_position.Y -= frac * 25.0 * pow(ratiothing2, 1.7f); + //wield_position.Z += frac * 5.0 * ratiothing2; + wield_position.X -= frac * 35.0 * pow(ratiothing2, 1.1f); + wield_rotation.Y += frac * 70.0 * pow(ratiothing2, 1.4f); + //wield_rotation.X -= frac * 15.0 * pow(ratiothing2, 1.4f); + //wield_rotation.Z += frac * 15.0 * pow(ratiothing2, 1.0f); + } + if (m_digging_button[i] != -1) + { + f32 digfrac = m_digging_anim[i]; + wield_position.X -= 50 * sin(pow(digfrac, 0.8f) * M_PI); + wield_position.Y += 24 * sin(digfrac * 1.8 * M_PI); + wield_position.Z += 25 * 0.5; + + // Euler angles are PURE EVIL, so why not use quaternions? + core::quaternion quat_begin(wield_rotation * core::DEGTORAD); + //core::quaternion quat_end(v3f(s * 80, 30, s * 100) * core::DEGTORAD); + 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 *= s; + quat_slerp.X *= s; + quat_slerp.toEuler(wield_rotation); + wield_rotation *= core::RADTODEG; + wield_position.X *= s; + } else { + f32 bobfrac = my_modf(m_view_bobbing_anim); + wield_position.X *= s; + wield_position.X -= sin(bobfrac*M_PI*2.0+M_PI*i) * 3.0 * s; + wield_position.Y += sin(my_modf(bobfrac*2.0)*M_PI+M_PI*i) * 3.0; + } + + m_wieldnode[i]->setPosition(wield_position); + m_wieldnode[i]->setRotation(wield_rotation); + + m_wieldnode[i]->setNodeLightColor(m_player_light_color); + + if (i == 1) { + m_wieldnode[i]->setVisible( + (m_wield_item_next[i].name != "" && m_wield_change_timer[i] > 0) + || (m_offhand_wield_item_old && m_wield_change_timer[i] < 0)); + } + } // Set render distance updateViewingRange(); @@ -607,21 +635,23 @@ void Camera::updateViewingRange() m_cameranode->setFarValue((viewing_range < 2000) ? 2000 * BS : viewing_range * BS); } -void Camera::setDigging(s32 button) +void Camera::setDigging(s32 button, int hand) { - if (m_digging_button == -1) - m_digging_button = button; + if (m_digging_button[hand] == -1) + m_digging_button[hand] = button; } -void Camera::wield(const ItemStack &item) +void Camera::wield(const ItemStack &item, int hand) { - if (item.name != m_wield_item_next.name || - item.metadata != m_wield_item_next.metadata) { - m_wield_item_next = item; - if (m_wield_change_timer > 0) - m_wield_change_timer = -m_wield_change_timer; - else if (m_wield_change_timer == 0) - m_wield_change_timer = -0.001; + if (item.name != m_wield_item_next[hand].name || + item.metadata != m_wield_item_next[hand].metadata) { + if (hand == 1) + m_offhand_wield_item_old = m_wield_item_next[hand].name != ""; + m_wield_item_next[hand] = item; + if (m_wield_change_timer[hand] > 0) + m_wield_change_timer[hand] = -m_wield_change_timer[hand]; + else if (m_wield_change_timer[hand] == 0) + m_wield_change_timer[hand] = -0.001; } } |