*/
m_cache_fall_bobbing_amount = g_settings->getFloat("fall_bobbing_amount");
m_cache_view_bobbing_amount = g_settings->getFloat("view_bobbing_amount");
- m_cache_viewing_range_min = g_settings->getFloat("viewing_range_nodes_min");
- m_cache_viewing_range_max = g_settings->getFloat("viewing_range_nodes_max");
m_cache_wanted_fps = g_settings->getFloat("wanted_fps");
m_cache_fov = g_settings->getFloat("fov");
m_cache_view_bobbing = g_settings->getBool("view_bobbing");
{
f32 oldy = old_player_position.Y;
f32 newy = player_position.Y;
- f32 t = exp(-10*frametime);
+ f32 t = exp(-23*frametime);
player_position.Y = oldy * t + newy * (1-t);
}
PlayerEyeOffset += player->eye_offset_first;
else
PlayerEyeOffset += player->eye_offset_third;
-
+
// Set head node transformation
m_headnode->setPosition(PlayerEyeOffset+v3f(0,cameratilt*-player->hurt_tilt_strength+fall_bobbing,0));
m_headnode->setRotation(v3f(player->getPitch(), 0, cameratilt*player->hurt_tilt_strength));
// Seperate camera position for calculation
v3f my_cp = m_camera_position;
-
+
// Reposition the camera for third person view
if (m_camera_mode > CAMERA_MODE_FIRST)
{
// Calculate new position
bool abort = false;
- for (int i = BS; i <= BS*2; i++)
+ for (int i = BS; i <= BS*2.75; i++)
{
my_cp.X = m_camera_position.X + m_camera_direction.X*-i;
my_cp.Z = m_camera_position.Z + m_camera_direction.Z*-i;
(((s16)(my_cp.Y/BS) - m_camera_offset.Y)/CAMERA_OFFSET_STEP);
m_camera_offset.Z += CAMERA_OFFSET_STEP*
(((s16)(my_cp.Z/BS) - m_camera_offset.Z)/CAMERA_OFFSET_STEP);
-
+
// Set camera node transformation
m_cameranode->setPosition(my_cp-intToFloat(m_camera_offset, BS));
m_cameranode->setUpVector(abs_cam_up);
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);
// Render distance feedback loop
updateViewingRange(frametime, busytime);
- // If the player seems to be walking on solid ground,
+ // If the player is walking, swimming, or climbing,
// view bobbing is enabled and free_move is off,
// start (or continue) the view bobbing animation.
v3f speed = player->getSpeed();
- if ((hypot(speed.X, speed.Z) > BS) &&
- (player->touching_ground) &&
- (m_cache_view_bobbing == true) &&
- (g_settings->getBool("free_move") == false ||
- !m_gamedef->checkLocalPrivilege("fly")))
+ const bool movement_XZ = hypot(speed.X, speed.Z) > BS;
+ const bool movement_Y = abs(speed.Y) > BS;
+
+ const bool walking = movement_XZ && player->touching_ground;
+ const bool swimming = (movement_XZ || player->swimming_vertical) && player->in_liquid;
+ const bool climbing = movement_Y && player->is_climbing;
+ if ((walking || swimming || climbing) &&
+ m_cache_view_bobbing &&
+ (!g_settings->getBool("free_move") || !m_gamedef->checkLocalPrivilege("fly")))
{
// Start animation
m_view_bobbing_state = 1;
<<std::endl;*/
// Get current viewing range and FPS settings
- f32 viewing_range_min = m_cache_viewing_range_min;
+ f32 viewing_range_min = g_settings->getFloat("viewing_range_nodes_min");
viewing_range_min = MYMAX(15.0, viewing_range_min);
- f32 viewing_range_max = m_cache_viewing_range_max;
+ f32 viewing_range_max = g_settings->getFloat("viewing_range_nodes_max");
viewing_range_max = MYMAX(viewing_range_min, viewing_range_max);
-
+
// Immediately apply hard limits
if(m_draw_control.wanted_range < viewing_range_min)
m_draw_control.wanted_range = viewing_range_min;
}
new_range += wanted_range_change;
-
+
//f32 new_range_unclamped = new_range;
new_range = MYMAX(new_range, viewing_range_min);
new_range = MYMIN(new_range, viewing_range_max);