Skip to content

Commit

Permalink
Swing the camera down when the player lands on the ground, based on t…
Browse files Browse the repository at this point in the history
…he velocity the surface is hit with.
  • Loading branch information
MirceaKitsune authored and kwolekr committed Apr 11, 2013
1 parent 17cfb18 commit 7cd5eb4
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 2 deletions.
29 changes: 27 additions & 2 deletions src/camera.cpp
Expand Up @@ -67,6 +67,7 @@ Camera::Camera(scene::ISceneManager* smgr, MapDrawControl& draw_control,
m_view_bobbing_anim(0),
m_view_bobbing_state(0),
m_view_bobbing_speed(0),
m_view_bobbing_fall(0),

m_digging_anim(0),
m_digging_button(-1),
Expand Down Expand Up @@ -134,6 +135,13 @@ inline f32 my_modf(f32 x)

void Camera::step(f32 dtime)
{
if(m_view_bobbing_fall > 0)
{
m_view_bobbing_fall -= 3 * dtime;
if(m_view_bobbing_fall <= 0)
m_view_bobbing_fall = -1; // Mark the effect as finished
}

if (m_view_bobbing_state != 0)
{
//f32 offset = dtime * m_view_bobbing_speed * 0.035;
Expand Down Expand Up @@ -237,11 +245,28 @@ void Camera::update(LocalPlayer* player, f32 frametime, v2u32 screensize,
m_playernode->setRotation(v3f(0, -1 * player->getYaw(), 0));
m_playernode->updateAbsolutePosition();

//Get camera tilt timer (hurt animation)
// Get camera tilt timer (hurt animation)
float cameratilt = fabs(fabs(player->hurt_tilt_timer-0.75)-0.75);

// Fall bobbing animation
float fall_bobbing = 0;
if(player->camera_impact >= 1)
{
if(m_view_bobbing_fall == -1) // Effect took place and has finished
player->camera_impact = m_view_bobbing_fall = 0;
else if(m_view_bobbing_fall == 0) // Initialize effect
m_view_bobbing_fall = 1;

// Convert 0 -> 1 to 0 -> 1 -> 0
fall_bobbing = m_view_bobbing_fall < 0.5 ? m_view_bobbing_fall * 2 : -(m_view_bobbing_fall - 0.5) * 2 + 1;
// Smoothen and invert the above
fall_bobbing = sin(fall_bobbing * 0.5 * M_PI) * -1;
// Amplify according to the intensity of the impact
fall_bobbing *= (1 - rangelim(50 / player->camera_impact, 0, 1)) * 5;
}

// Set head node transformation
m_headnode->setPosition(player->getEyeOffset()+v3f(0,cameratilt*-player->hurt_tilt_strength,0));
m_headnode->setPosition(player->getEyeOffset()+v3f(0,cameratilt*-player->hurt_tilt_strength+fall_bobbing,0));
m_headnode->setRotation(v3f(player->getPitch(), 0, cameratilt*player->hurt_tilt_strength));
m_headnode->updateAbsolutePosition();

Expand Down
2 changes: 2 additions & 0 deletions src/camera.h
Expand Up @@ -166,6 +166,8 @@ class Camera
s32 m_view_bobbing_state;
// Speed of view bobbing animation
f32 m_view_bobbing_speed;
// Fall view bobbing
f32 m_view_bobbing_fall;

// Digging animation frame (0 <= m_digging_anim < 1)
f32 m_digging_anim;
Expand Down
3 changes: 3 additions & 0 deletions src/localplayer.cpp
Expand Up @@ -329,6 +329,9 @@ void LocalPlayer::move(f32 dtime, ClientEnvironment *env, f32 pos_max_d,
if(!touching_ground_was && touching_ground){
MtEvent *e = new SimpleTriggerEvent("PlayerRegainGround");
m_gamedef->event()->put(e);

// Set camera impact value to be used for view bobbing
camera_impact = getSpeed().Y * -1;
}

{
Expand Down
2 changes: 2 additions & 0 deletions src/localplayer.h
Expand Up @@ -59,6 +59,8 @@ class LocalPlayer : public Player
float last_yaw;
unsigned int last_keyPressed;

float camera_impact;

private:
// This is used for determining the sneaking range
v3s16 m_sneak_node;
Expand Down

0 comments on commit 7cd5eb4

Please sign in to comment.