#ifndef PLAYER_H
#define PLAYER_H
+#include "audio.h"
#include "common.h"
#include "character.h"
#include "bvh.h"
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" ))
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 );
}
}
+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++ )
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
{
}
}
+ player_audio();
+
/* Update camera matrices */
m4x3_identity( player.camera );
m4x3_rotate_y( player.camera, -player.angles[0] );
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 */