Skip to content
Snippets Groups Projects
Commit f2ec2265 authored by Kahrl's avatar Kahrl
Browse files

minor view bobbing improvements

parent 0931d4b7
No related branches found
No related tags found
No related merge requests found
...@@ -25,6 +25,8 @@ with this program; if not, write to the Free Software Foundation, Inc., ...@@ -25,6 +25,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "utility.h" #include "utility.h"
#include <cmath> #include <cmath>
const s32 BOBFRAMES = 0x1000000; // must be a power of two
Camera::Camera(scene::ISceneManager* smgr, MapDrawControl& draw_control): Camera::Camera(scene::ISceneManager* smgr, MapDrawControl& draw_control):
m_smgr(smgr), m_smgr(smgr),
m_playernode(NULL), m_playernode(NULL),
...@@ -70,18 +72,17 @@ void Camera::step(f32 dtime) ...@@ -70,18 +72,17 @@ void Camera::step(f32 dtime)
{ {
if (m_view_bobbing_state != 0) if (m_view_bobbing_state != 0)
{ {
const f32 bobspeed = 0x1000000; s32 offset = MYMAX(dtime * BOBFRAMES, 1);
s32 offset = MYMAX(dtime * bobspeed, 1);
if (m_view_bobbing_state == 2) if (m_view_bobbing_state == 2)
{ {
// Animation is getting turned off // Animation is getting turned off
s32 subanim = (m_view_bobbing_anim & 0x7fffff); s32 subanim = (m_view_bobbing_anim & (BOBFRAMES/2-1));
if (subanim < 0x400000) if (subanim < BOBFRAMES/4)
offset = -1 * MYMIN(offset, subanim); offset = -1 * MYMIN(offset, subanim);
else else
offset = MYMIN(offset, 0x800000 - subanim); offset = MYMIN(offset, BOBFRAMES/2 - subanim);
} }
m_view_bobbing_anim = (m_view_bobbing_anim + offset) & 0xffffff; m_view_bobbing_anim = (m_view_bobbing_anim + offset) & (BOBFRAMES-1);
} }
} }
...@@ -102,14 +103,20 @@ void Camera::update(LocalPlayer* player, f32 frametime, v2u32 screensize) ...@@ -102,14 +103,20 @@ void Camera::update(LocalPlayer* player, f32 frametime, v2u32 screensize)
relative_cam_target.rotateYZBy(player->getPitch()); relative_cam_target.rotateYZBy(player->getPitch());
relative_cam_target += relative_cam_pos; relative_cam_target += relative_cam_pos;
f32 bobangle = m_view_bobbing_anim * 2 * M_PI / 0x1000000; if ((m_view_bobbing_anim & (BOBFRAMES/2-1)) != 0)
f32 bobangle_s = sin(bobangle); {
f32 bobangle_c = cos(bobangle); f32 bobamount = cos(player->getPitch() * M_PI / 180);
f32 bobwidth = 0.02 * cos(player->getPitch() * M_PI / 180) bobamount = 2 * MYMIN(bobamount, 0.5);
/ (bobangle_c * bobangle_c + 1);
f32 bobheight = bobwidth; f32 bobangle = m_view_bobbing_anim * 2 * M_PI / BOBFRAMES;
relative_cam_pos.X += bobwidth * bobangle_s; f32 bobangle_s = sin(bobangle);
relative_cam_pos.Y += bobheight * bobangle_s * bobangle_c; f32 bobangle_c = cos(bobangle);
f32 bobwidth = 0.02 * bobamount / (bobangle_c * bobangle_c + 1);
f32 bobheight = 1.5 * bobwidth;
relative_cam_pos.X += bobwidth * bobangle_s;
relative_cam_pos.Y += bobheight * bobangle_s * bobangle_c;
}
// Compute absolute camera position and target // Compute absolute camera position and target
m_playernode->getAbsoluteTransformation().transformVect(m_camera_position, relative_cam_pos); m_playernode->getAbsoluteTransformation().transformVect(m_camera_position, relative_cam_pos);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment