static void player_walk_drop_in_vector( v3f vec ){
v3f axis, init_dir;
- v3_cross( localplayer.basis[1], player_walk.state.drop_in_normal, axis );
+ v3_cross( (v3f){0.0f,1.0f,0.0f}, player_walk.state.drop_in_normal, axis );
v3_cross( axis, player_walk.state.drop_in_normal, init_dir );
v3_normalize( init_dir );
- v3_muls( init_dir, 7.0f, vec );
+ v3_muls( init_dir, 4.25f, vec );
}
static float player_xyspeed2(void){
- v3f xy;
- v3_muladds( localplayer.rb.v, localplayer.basis[1],
- -v3_dot( localplayer.basis[1], localplayer.rb.v ), xy );
-
- return v3_length2(xy);
+ return v3_length2( (v3f){localplayer.rb.v[0], 0.0f, localplayer.rb.v[2]} );
}
static void player_walk_generic_to_skate( enum skate_activity init, f32 yaw ){
v3f dir;
v3_copy( v, dir );
v3_normalize( dir );
- m3x3_mulv( localplayer.invbasis, dir, dir );
q_axis_angle( localplayer.rb.q, (v3f){0.0f,1.0f,0.0f},
atan2f(-dir[0],-dir[2]) );
- q_mul( localplayer.qbasis, localplayer.rb.q, localplayer.rb.q );
q_normalize( localplayer.rb.q );
q_mulv( localplayer.rb.q, (v3f){0.0f,1.0f,0.0f}, player_skate.state.cog );
static void player_walk_drop_in_overhang_transform( f32 t, v3f co, v4f q ){
v3f axis;
- v3_cross( localplayer.basis[1], player_walk.state.drop_in_normal, axis );
+ v3_cross( (v3f){0,1,0}, player_walk.state.drop_in_normal, axis );
v3_normalize( axis );
float a = acosf( player_walk.state.drop_in_normal[1] ) * t;
static struct skeleton_anim *player_walk_outro_anim( enum walk_outro type ){
struct player_walk *w = &player_walk;
+ if( type >= k_walk_outro_max )
+ return NULL;
+
return (struct skeleton_anim *[]){
[k_walk_outro_none] = NULL,
[k_walk_outro_jump_to_air] = w->anim_jump_to_air,
if( !localplayer.immobile )
player_look( localplayer.angles, skaterift.time_rate );
+ v2f steer;
+ joystick_state( k_srjoystick_steer, steer );
+
+ if( w->state.activity == k_walk_activity_sit ){
+ if( w->state.sit_t < 1.0f )
+ w->state.sit_t = vg_minf( 1.0f, w->state.sit_t + vg.time_delta );
+
+ if( button_down(k_srbind_sit) || (v2_length2(steer)>0.2f) ||
+ button_down(k_srbind_jump) ){
+ w->state.activity = k_walk_activity_sit_up;
+ }
+ return;
+ }
+ else if( w->state.activity == k_walk_activity_sit_up ){
+ if( w->state.sit_t > 0.0f )
+ w->state.sit_t = vg_maxf( 0.0f, w->state.sit_t - vg.time_delta );
+ else
+ w->state.activity = k_walk_activity_ground;
+
+ if( button_down(k_srbind_sit) )
+ w->state.activity = k_walk_activity_sit;
+
+ return;
+ }
+ else if( w->state.activity == k_walk_activity_ground ){
+ if( button_down(k_srbind_sit) ){
+ v3_zero( localplayer.rb.v );
+ w->state.activity = k_walk_activity_sit;
+ return;
+ }
+ }
+
+ w->state.sit_t = 0.0f;
+
if( w->state.outro_type ){
struct skeleton_anim *anim = player_walk_outro_anim(w->state.outro_type);
}
}
else if( button_down( k_srbind_use ) && !localplayer.immobile ){
- if( v3_dist2( localplayer.rb.co, gzoomer.obj.rb.co ) <= 4.0f*4.0f ){
+ if( 0 && (v3_dist2(localplayer.rb.co,gzoomer.obj.rb.co) <= 4.0f*4.0f) ){
localplayer.subsystem = k_player_subsystem_drive;
}
else{
w->state.outro_start_time = vg.time;
localplayer.immobile = 1;
- struct player_avatar *av = localplayer.playeravatar;
- m4x3_mulv( localplayer.final_mtx[ av->id_ik_foot_r ],
- av->sk.bones[ av->id_ik_foot_r ].co,
+ u32 foot_id = localplayer.id_ik_foot_r;
+
+ m4x3_mulv( localplayer.final_mtx[ foot_id ],
+ localplayer.skeleton.bones[ foot_id ].co,
w->state.drop_in_foot_anchor );
}
else{
}
static int player_walk_normal_standable( v3f n ){
- return v3_dot( n, localplayer.basis[1] ) > 0.70710678118f;
+ return n[1] > 0.70710678118f;
}
static void player_accelerate( v3f v, v3f movedir, f32 speed, f32 accel ){
v2f steer;
joystick_state( k_srjoystick_steer, steer );
- if( w->state.activity == k_walk_activity_sit ){
- if( w->state.sit_t < 1.0f )
- w->state.sit_t += vg.time_delta;
- else {
- w->state.sit_t = 1.0f;
-
- if( button_down(k_srbind_sit) || (v2_length2(steer)>0.2f) ||
- button_down(k_srbind_jump) ){
- w->state.activity = k_walk_activity_sit_up;
- }
- }
+ if( (w->state.activity == k_walk_activity_sit) ||
+ (w->state.activity == k_walk_activity_sit_up) ){
return;
}
- else if( w->state.activity == k_walk_activity_sit_up ){
- if( w->state.sit_t > 0.0f ){
- w->state.sit_t -= vg.time_delta;
- return;
- }
- }
- else
- w->state.sit_t = 0.0f;
v3_copy( localplayer.rb.co, w->state.prev_pos );
v3_zero( localplayer.rb.w );
if( world->water.enabled ){
if( localplayer.rb.co[1]+0.4f < world->water.height ){
- audio_oneshot_3d( &audio_splash, localplayer.rb.co, 40.0f, 1.0f );
+ player__networked_sfx( k_player_subsystem_walk, 32,
+ k_player_walk_soundeffect_splash,
+ localplayer.rb.co, 1.0f );
player__dead_transition();
return;
}
m4x3f mtx;
m3x3_copy( localplayer.rb.to_world, mtx );
- v3_add( localplayer.rb.co, localplayer.basis[1], mtx[3] );
+ v3_add( localplayer.rb.co, (v3f){0,1,0}, mtx[3] );
vg_line_capsule( mtx, w->collider.radius, w->collider.height, VG__WHITE );
v3f forward_dir = { -sinf(yaw), 0.0f, cosf(yaw) };
v3f right_dir = { forward_dir[2], 0.0f, -forward_dir[0] };
- m3x3_mulv( localplayer.basis, forward_dir, forward_dir );
- m3x3_mulv( localplayer.basis, right_dir, right_dir );
-
-
w->move_speed = localplayer.immobile? 0.0f: v2_length( steer );
/*
if( w->state.activity == k_walk_activity_ground ){
v3_normalize( surface_avg );
- if( button_down(k_srbind_sit) ){
- w->state.activity = k_walk_activity_sit;
- return;
- }
-
v3f tx, ty;
v3_tangent_basis( surface_avg, tx, ty );
f32 t = vg.time - w->state.jump_input_time;
if( t < PLAYER_JUMP_EPSILON ){
- float d = v3_dot( localplayer.basis[1], localplayer.rb.v );
- v3_muladds( localplayer.rb.v, localplayer.basis[1], -d,
- localplayer.rb.v );
- v3_muladds( localplayer.rb.v, localplayer.basis[1], 5.0f,
- localplayer.rb.v );
+ localplayer.rb.v[1] = 5.0f;
w->state.activity = k_walk_activity_air;
prev_state = k_walk_activity_air;
accel_speed = k_walk_air_accel;
v3f pa, pb;
v3_copy( localplayer.rb.co, pa );
- v3_muladds( pa, localplayer.basis[1], w->collider.radius + max_dist, pa );
- v3_muladds( pa, localplayer.basis[1], -max_dist * 2.0f, pb );
+ pa[1] += w->collider.radius + max_dist;
+ v3_add( pa, (v3f){0, -max_dist * 2.0f, 0}, pb );
vg_line( pa, pb, 0xff000000 );
v3f n;
w->collider.radius, &t, n, 0 ) != -1 ){
if( player_walk_normal_standable(n) ){
v3_lerp( pa, pb, t, localplayer.rb.co );
- v3_muladds( localplayer.rb.co, localplayer.basis[1],
- -w->collider.radius - k_penetration_slop,
- localplayer.rb.co );
+ localplayer.rb.co[1] += -w->collider.radius - k_penetration_slop;
w->state.activity = k_walk_activity_ground;
- float d = -v3_dot(n,localplayer.rb.v),
- g = -k_gravity * k_rb_delta;
+ float d = -v3_dot(n,localplayer.rb.v);
v3_muladds( localplayer.rb.v, n, d, localplayer.rb.v );
- v3_muladds( localplayer.rb.v, localplayer.basis[1], g,
- localplayer.rb.v );
+ localplayer.rb.v[1] += -k_gravity * k_rb_delta;
}
}
}
/* integrate */
if( w->state.activity == k_walk_activity_air ){
- v3_muladds( localplayer.rb.v, localplayer.basis[1], -k_gravity*k_rb_delta,
- localplayer.rb.v );
+ localplayer.rb.v[1] += -k_gravity*k_rb_delta;
}
if( localplayer.immobile ){
v3_muladds( localplayer.rb.co, localplayer.rb.v, k_rb_delta,
localplayer.rb.co );
- v3_add( localplayer.rb.co, localplayer.basis[1], mtx[3] );
+ v3_add( localplayer.rb.co, (v3f){0,1,0}, mtx[3] );
vg_line_capsule( mtx, w->collider.radius, w->collider.height, VG__GREEN );
/*
localplayer.rb.co[1] -= w->collider.radius;
rb_update_transform( &localplayer.rb );
- v3_add( localplayer.rb.co, localplayer.basis[1], mtx[3] );
+ v3_add( localplayer.rb.co, (v3f){0,1,0}, mtx[3] );
vg_line_capsule( mtx, w->collider.radius, w->collider.height, VG__RED);
}
}
m4x3f mtx;
m3x3_copy( localplayer.rb.to_world, mtx );
- v3_add( localplayer.rb.co, localplayer.basis[1], mtx[3] );
+ v3_add( localplayer.rb.co, (v3f){0,1,0}, mtx[3] );
float substep = vg.time_fixed_extrapolate;
v3_muladds( mtx[3], localplayer.rb.v, k_rb_delta*substep, mtx[3] );
/* Calculate header */
v3f v;
- if( player_xyspeed2() > 0.1f*0.1f )
- {
- v3f v_xy;
- m3x3_mulv( localplayer.invbasis, localplayer.rb.v, v_xy );
- float a = atan2f( v_xy[0], v_xy[2] );
-
+ if( player_xyspeed2() > 0.1f*0.1f ){
+ float a = atan2f( localplayer.rb.v[0], localplayer.rb.v[2] );
q_axis_angle( localplayer.rb.q, (v3f){0.0f,1.0f,0.0f}, a );
- q_mul( localplayer.qbasis, localplayer.rb.q, localplayer.rb.q );
- q_normalize( localplayer.rb.q );
}
vg_line_point( w->state.drop_in_target, 0.1f, VG__GREEN );
p1[0] = sinf( a );
p1[1] = 0.0f;
p1[2] = cosf( a );
- m3x3_mulv( localplayer.basis, p1, p1 );
v3_add( localplayer.rb.co, p1, p1 );
vg_line( localplayer.rb.co, p1, VG__PINK );
-
int walk_phase = 0;
if( vg_fractf(w->state.walk_timer) > 0.5f )
walk_phase = 1;
animator->walk_timer = w->state.walk_timer;
- if( !localplayer.immobile )
- rb_extrapolate( &localplayer.rb, animator->root_co, animator->root_q );
- else{
+ if( localplayer.immobile || (w->state.outro_type == k_walk_outro_drop_in) ){
v3_copy( localplayer.rb.co, animator->root_co );
v4_copy( localplayer.rb.q, animator->root_q );
}
+ else{
+ rb_extrapolate( &localplayer.rb, animator->root_co, animator->root_q );
+ }
f32 walk_yaw = player_get_heading_yaw();
}
if( w->state.outro_type ){
- struct player_avatar *av = localplayer.playeravatar;
struct skeleton_anim *anim =
player_walk_outro_anim( w->state.outro_type );
f32 outro_length = (f32)anim->length / anim->rate,
v3_lerp( w->state.drop_in_start, w->state.drop_in_target,
step_t, localplayer.rb.co );
+ v3_copy( localplayer.rb.co, animator->root_co );
+
+ /* for the camera purposes only */
+ v3f init_velocity;
+ player_walk_drop_in_vector( init_velocity );
+ v3_muls( init_velocity, dop_t, localplayer.rb.v );
+ v3_copy( localplayer.rb.v,
+ localplayer.cam_control.cam_velocity_smooth );
+
q_axis_angle( animator->root_q, (v3f){0.0f,1.0f,0.0f},
walk_yaw + VG_PIf );
/* the drop in bit */
if( step_t >= 1.0f ){
+ v3f final_co;
v4f final_q;
- player_walk_drop_in_overhang_transform( dop_t, localplayer.rb.co,
- final_q );
+ player_walk_drop_in_overhang_transform( dop_t, final_co, final_q );
+
q_mul( final_q, animator->root_q, animator->root_q );
+ v3_copy( final_co, animator->root_co );
+
v4_copy( animator->root_q, localplayer.rb.q );
+ rb_update_transform( &localplayer.rb );
+
v3_muladds( animator->root_co, localplayer.rb.to_world[1],
-0.1f*dop_t, animator->root_co );
+ v3_copy( animator->root_co, localplayer.rb.co );
}
+
return;
}
else{
}
q_axis_angle( animator->root_q, (v3f){0.0f,1.0f,0.0f}, walk_yaw + VG_PIf );
- q_mul( localplayer.qbasis, animator->root_q, animator->root_q );
- q_normalize( animator->root_q );
}
static void player__walk_pose( void *_animator, player_pose *pose ){
struct player_walk *w = &player_walk;
struct player_walk_animator *animator = _animator;
- struct skeleton *sk = &localplayer.playeravatar->sk;
- struct player_avatar *av = localplayer.playeravatar;
+ struct skeleton *sk = &localplayer.skeleton;
v3_copy( animator->root_co, pose->root_co );
v4_copy( animator->root_q, pose->root_q );
skeleton_sample_anim( sk, w->anim_sit, st*sit_norm, bpose );
v4f qy,qp;
- f32 *qh = bpose[av->id_head-1].q;
+ f32 *qh = bpose[localplayer.id_head-1].q;
q_axis_angle( qy, (v3f){0.0f,1.0f,0.0f}, animator->yaw*0.5f*st );
q_axis_angle( qp, (v3f){0.0f,0.0f,1.0f}, animator->pitch*st );
q_mul( qy, qh, qh );
q_mul( qh, qp, qh );
q_normalize( qh );
- qh = bpose[av->id_chest-1].q;
+ qh = bpose[localplayer.id_chest-1].q;
q_axis_angle( qy, (v3f){0.0f,1.0f,0.0f}, animator->yaw*0.5f*st );
q_mul( qy, qh, qh );
q_normalize( qh );
if( animator->outro_type ){
struct skeleton_anim *anim = player_walk_outro_anim(animator->outro_type);
+
+ if( !anim ){
+ skeleton_copy_pose( sk, apose, pose->keyframes );
+ return;
+ }
f32 outro_length = (f32)anim->length / anim->rate,
outro_time = animator->outro_t*outro_length;
v3f anchored_pos;
m4x3_mulv( inverse, animator->foot_anchor, anchored_pos );
- v3_lerp( pose->keyframes[ av->id_ik_foot_r-1 ].co, anchored_pos,
+ v3_lerp( pose->keyframes[ localplayer.id_ik_foot_r-1 ].co,
+ anchored_pos,
1.0f-animator->commit_t,
- pose->keyframes[ av->id_ik_foot_r-1 ].co );
+ pose->keyframes[ localplayer.id_ik_foot_r-1 ].co );
}
}
else
* Camera
*/
struct player_walk *w = &player_walk;
- struct player_avatar *av = localplayer.playeravatar;
if( w->state.outro_type ){
struct skeleton_anim *anim = player_walk_outro_anim(w->state.outro_type);
static void player__walk_bind(void){
struct player_walk *w = &player_walk;
- struct player_avatar *av = localplayer.playeravatar;
- struct skeleton *sk = &av->sk;
+ struct skeleton *sk = &localplayer.skeleton;
w->anim_idle = skeleton_get_anim( sk, "idle_cycle+y" );
w->anim_walk = skeleton_get_anim( sk, "walk+y" );
v3f fwd = { 0.0f, 0.0f, 1.0f };
q_mulv( localplayer.rb.q, fwd, fwd );
- m3x3_mulv( localplayer.invbasis, fwd, fwd );
-
q_axis_angle( localplayer.rb.q, (v3f){0.0f,1.0f,0.0f},
atan2f(fwd[0], fwd[2]) );
- q_mul( localplayer.qbasis, localplayer.rb.q, localplayer.rb.q );
- q_normalize( localplayer.rb.q );
rb_update_transform( &localplayer.rb );
}
-static void player__walk_reset( ent_spawn *rp ){
+static void player__walk_reset(void){
struct player_walk *w = &player_walk;
w->state.activity = k_walk_activity_air;
w->state.outro_type = k_walk_outro_none;
bitpack_qf32( ctx, 8, 0.0f, 1.0f, &animator->run );
bitpack_qf32( ctx, 8, 0.0f, 1.0f, &animator->walk );
bitpack_qf32( ctx, 16, 0.0f, 120.0f, &animator->walk_timer );
- bitpack_qf32( ctx, 8, -k_sit_yaw_limit, k_sit_yaw_limit, &animator->yaw );
- bitpack_qf32( ctx, 8, -k_sit_pitch_limit, k_sit_pitch_limit,
- &animator->pitch );
for( int i=0; i<1; i++ ){ /* without this you get a warning from gcc. lol */
bitpack_bytes( ctx, 8, &animator->outro_type );
bitpack_qf32( ctx, 8, 0.0f, 1.0f, &animator->commit_t );
}
}
+
+ u32 code = bitpack_qf32( ctx, 8, 0.0f, 1.0f, &animator->sit_t );
+ if( code ){
+ bitpack_qf32( ctx, 8, -k_sit_yaw_limit, k_sit_yaw_limit, &animator->yaw );
+ bitpack_qf32( ctx, 8, -k_sit_pitch_limit, k_sit_pitch_limit,
+ &animator->pitch );
+ }
+}
+
+static void player__walk_sfx_oneshot( u8 id, v3f pos, f32 volume ){
+ audio_lock();
+
+ if( id == k_player_walk_soundeffect_splash ){
+ audio_oneshot_3d( &audio_splash, pos, 40.0f, 1.0f );
+ }
+
+ audio_unlock();
}
#endif /* PLAYER_DEVICE_WALK_H */