audio&island
[carveJwlIkooP6JGAAIwe30JlM.git] / player.h
index 6c819801b01f664310d73f91144bc1be1911ab92..34ed46944337270ec1f571bac991ee02a9d37222 100644 (file)
--- a/player.h
+++ b/player.h
@@ -1,6 +1,7 @@
 #ifndef PLAYER_H
 #define PLAYER_H
 
+#include "audio.h"
 #include "common.h"
 #include "character.h"
 #include "bvh.h"
@@ -63,8 +64,7 @@ static void player_transform_update(void)
 
 static int reset_player( int argc, char const *argv[] )
 {
-   v3_copy( (v3f){ 0.0f, -2.0f, 0.0f }, player.co );
-
+   v3_copy( world.tutorial, player.co );
    if( argc == 1 )
    {
       if( !strcmp( argv[0], "tutorial" ))
@@ -1626,12 +1626,17 @@ static void player_animate(void)
 
    character_final_pose( &player.mdl, (v3f){0.0f,0.0f,0.0f}, 
          &pose_fly, amt_air );
+   
+   static float fupper = 0.0f;
+   fupper = vg_lerpf( fupper, -vg_get_axis("horizontal")*0.2f, 0.1f );
+   character_yaw_upper( &player.mdl, fupper );
 
    /* Camera position */
    v3_lerp( player.smooth_localcam, player.mdl.cam_pos, 0.08f, 
             player.smooth_localcam );
    v3_muladds( player.smooth_localcam, offset, 0.7f, player.camera_pos );
    player.camera_pos[1] = vg_clampf( player.camera_pos[1], 0.3f, kheight );
+
    m4x3_mulv( player.to_world, player.camera_pos, player.camera_pos );
 
    player.air_blend = vg_lerpf( player.air_blend, player.in_air, 0.04f );
@@ -2008,6 +2013,51 @@ static void player_do_collision( rigidbody *rb )
    }
 }
 
+static void player_audio(void)
+{
+   float speed = vg_minf(v3_length( player.v )*0.1f,1.0f),
+         attn = v3_dist( player.co, player.camera[3] )+1.0f;
+   attn = (1.0f/(attn*attn)) * speed;
+
+   static float air = 0.0f;
+   air = vg_lerpf(air, player.in_air? 1.0f: 0.0f, 0.7f);
+   
+   v3f ears = { 1.0f,0.0f,0.0f };
+   v3f delta;
+
+   v3_sub( player.co, player.camera[3], delta );
+   v3_normalize( delta );
+   m3x3_mulv( player.camera, ears, ears );
+
+   float pan = v3_dot( ears, delta );
+   audio_player0.pan = pan;
+   audio_player1.pan = pan;
+   audio_player2.pan = pan;
+
+   if( freecam )
+   {
+      audio_player0.vol = 0.0f;
+      audio_player1.vol = 0.0f;
+      audio_player2.vol = 0.0f;
+   }
+   else
+   {
+      if( player.is_dead )
+      {
+         audio_player0.vol = 0.0f;
+         audio_player1.vol = 0.0f;
+         audio_player2.vol = 0.0f;
+      }
+      else
+      {
+         float slide = vg_clampf( fabsf(player.slip), 0.0f, 1.0f );
+         audio_player0.vol = (1.0f-air)*attn*(1.0f-slide);
+         audio_player1.vol =       air *attn;
+         audio_player2.vol = (1.0f-air)*attn*slide;
+      }
+   }
+}
+
 static void player_update(void)
 {
    for( int i=0; i<player.land_log_count; i++ )
@@ -2083,6 +2133,11 @@ static void player_update(void)
 
             player_do_motion();
             player_animate();
+
+            v3f offs = { -0.35f, 0.0f, 0.0f };
+            m3x3_mulv( player.to_world, offs, offs );
+   m4x3_mulv( player.to_world, player.mdl.ik_body.end, player.camera_pos );
+            v3_add( offs, player.camera_pos, player.camera_pos );
          }
          else
          {
@@ -2091,6 +2146,8 @@ static void player_update(void)
       }
    }
 
+   player_audio();
+
    /* Update camera matrices */
    m4x3_identity( player.camera );
    m4x3_rotate_y( player.camera, -player.angles[0] );
@@ -2109,7 +2166,11 @@ static void draw_player(void)
    else
       character_eval( &player.mdl );
 
-   character_draw( &player.mdl, (player.is_dead|player.in_air)? 0.0f: 1.0f );
+   float opacity = 1.0f-player.air_blend;
+   if( player.is_dead )
+      opacity = 0.0f;
+
+   character_draw( &player.mdl, opacity );
 }
 
 #endif /* PLAYER_H */