View bobbing is slower in the water.
authorKahrl <kahrl@gmx.net>
Thu, 8 Sep 2011 21:31:48 +0000 (23:31 +0200)
committerKahrl <kahrl@gmx.net>
Wed, 14 Sep 2011 23:53:42 +0000 (01:53 +0200)
src/camera.cpp
src/camera.h

index 8dc1af02b1863cc100544bb566a70adcee768be0..a84ee953c7999633106199a14b2cd8d5c70f3bb6 100644 (file)
@@ -19,10 +19,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #include "camera.h"
 #include "debug.h"
+#include "client.h"
 #include "main.h" // for g_settings
 #include "map.h"
 #include "player.h"
-#include "utility.h"
 #include <cmath>
 
 const s32 BOBFRAMES = 0x1000000; // must be a power of two
@@ -51,7 +51,8 @@ Camera::Camera(scene::ISceneManager* smgr, MapDrawControl& draw_control):
        m_time_per_range(30. / 50), // a sane default of 30ms per 50 nodes of range
 
        m_view_bobbing_anim(0),
-       m_view_bobbing_state(0)
+       m_view_bobbing_state(0),
+       m_view_bobbing_slow(false)
 {
        //dstream<<__FUNCTION_NAME<<std::endl;
 
@@ -72,7 +73,8 @@ void Camera::step(f32 dtime)
 {
        if (m_view_bobbing_state != 0)
        {
-               s32 offset = MYMAX(dtime * BOBFRAMES, 1);
+               f32 bobspeed = (m_view_bobbing_slow ? (BOBFRAMES / 4) : BOBFRAMES);
+               s32 offset = MYMAX(dtime * bobspeed, 1);
                if (m_view_bobbing_state == 2)
                {
                        // Animation is getting turned off
@@ -93,7 +95,6 @@ void Camera::update(LocalPlayer* player, f32 frametime, v2u32 screensize)
 
        // Set player node transformation
        m_playernode->setPosition(player->getPosition());
-       //m_playernode->setRotation(v3f(player->getPitch(), -1 * player->getYaw(), 0));
        m_playernode->setRotation(v3f(0, -1 * player->getYaw(), 0));
        m_playernode->updateAbsolutePosition();
 
@@ -144,9 +145,8 @@ void Camera::update(LocalPlayer* player, f32 frametime, v2u32 screensize)
        // view bobbing is enabled and free_move is off,
        // start (or continue) the view bobbing animation.
        v3f speed = player->getSpeed();
-       //dstream<<"speed: ("<<speed.X<<","<<speed.Y<<","<<speed.Z<<")"<<std::endl;
        if ((hypot(speed.X, speed.Z) > BS) &&
-               (fabs(speed.Y) < BS/10) &&
+               (player->touching_ground) &&
                (g_settings.getBool("view_bobbing") == true) &&
                (g_settings.getBool("free_move") == false))
        {
@@ -158,6 +158,7 @@ void Camera::update(LocalPlayer* player, f32 frametime, v2u32 screensize)
                // Stop animation
                m_view_bobbing_state = 2;
        }
+       m_view_bobbing_slow = player->in_water_stable;
 }
 
 void Camera::updateViewingRange(f32 frametime_in)
index 500168f3de13bb03a01156ae36589f2b44955e02..ba5d72bf41dd790613f6cad3487e1a8b8306aef2 100644 (file)
@@ -136,6 +136,8 @@ private:
        // If 1, view bobbing is on (player is walking).
        // If 2, view bobbing is getting switched off.
        s32 m_view_bobbing_state;
+       // If true, view bobbing is slown down (player is swimming)
+       bool m_view_bobbing_slow;
 };
 
 #endif