#include "player.h"
#include "audio.h"
+#include "vg/vg_perlin.h"
VG_STATIC void player__skate_bind( player_instance *player )
{
{
grind_located = 1;
grind_located_gravity = inf->gravity;
-
- vg_success( "Grind located\n" );
}
}
}
s->state.jump_charge = 0.0f;
s->state.jump_time = vg.time;
- vg_success( PRINTF_v3f( jumpdir ) );
-
v2f steer = { player->input_js1h->axis.value,
player->input_js1v->axis.value };
v2_normalize_clamp( steer );
{
struct player_skate *s = &player->_skate;
- float decay_rate = 1.0f - (k_rb_delta * 3.0f),
+ float decay_rate_x = 1.0f - (k_rb_delta * 3.0f),
+ decay_rate_z = decay_rate_x,
decay_rate_y = 1.0f;
if( s->state.activity >= k_skate_activity_grind_any ){
decay_rate = 1.0f-vg_lerpf( 3.0f, 20.0f, s->grind_strength ) * k_rb_delta;
decay_rate_y = decay_rate;
#endif
- decay_rate = 1.0f-(40.0f*k_rb_delta);
+ decay_rate_x = 1.0f-(16.0f*k_rb_delta);
decay_rate_y = 1.0f-(10.0f*k_rb_delta);
+ decay_rate_z = 1.0f-(40.0f*k_rb_delta);
}
- float wx = v3_dot( player->rb.w, player->rb.to_world[0] ) * decay_rate,
+ float wx = v3_dot( player->rb.w, player->rb.to_world[0] ) * decay_rate_x,
wy = v3_dot( player->rb.w, player->rb.to_world[1] ) * decay_rate_y,
- wz = v3_dot( player->rb.w, player->rb.to_world[2] ) * decay_rate;
+ wz = v3_dot( player->rb.w, player->rb.to_world[2] ) * decay_rate_z;
v3_muls( player->rb.to_world[0], wx, player->rb.w );
v3_muladds( player->rb.w, player->rb.to_world[1], wy, player->rb.w );
sample_type = k_skate_sample_concrete_scrape_metal;
}
else if( (s->state.activity == k_skate_activity_grind_back50) ||
- (s->state.activity == k_skate_activity_grind_front50) ){
-
- float d = v3_dot( player->rb.to_world[2], s->grind_dir );
-
+ (s->state.activity == k_skate_activity_grind_front50) )
+ {
if( s->surface == k_surface_prop_metal ){
sample_type = k_skate_sample_metal_scrape_generic;
}
else{
- if( d > 0.70710678118654752f )
+ float a = v3_dot( player->rb.to_world[2], s->grind_dir );
+ if( fabsf(a) > 0.70710678118654752f )
sample_type = k_skate_sample_concrete_scrape_wood;
else
sample_type = k_skate_sample_concrete_scrape_metal;
res_front50 = 0,
res_slide = 0;
+ int allow_back = 1,
+ allow_front = 1;
+
+ if( s->state.activity == k_skate_activity_grind_5050 ||
+ s->state.activity == k_skate_activity_grind_back50 ||
+ s->state.activity == k_skate_activity_grind_front50 )
+ {
+ float tilt = player->input_js1v->axis.value;
+
+ if( fabsf(tilt) >= 0.25f ){
+ v3f raw = {0.0f,0.0f,tilt};
+ m3x3_mulv( player->rb.to_world, raw, raw );
+
+ float way = player->input_js1v->axis.value *
+ vg_signf( v3_dot( raw, player->rb.v ) );
+
+ if( way < 0.0f ) allow_front = 0;
+ else allow_back = 0;
+ }
+ }
+
if( s->state.activity == k_skate_activity_grind_boardslide ){
res_slide = skate_boardslide_renew( player, &inf_slide );
}
else if( s->state.activity == k_skate_activity_grind_back50 ){
res_back50 = skate_grind_truck_renew( player, 1.0f, &inf_back50 );
- res_front50 = skate_grind_truck_entry( player, -1.0f, &inf_front50 );
+
+ if( allow_front )
+ res_front50 = skate_grind_truck_entry( player, -1.0f, &inf_front50 );
}
else if( s->state.activity == k_skate_activity_grind_front50 ){
res_front50 = skate_grind_truck_renew( player, -1.0f, &inf_front50 );
- res_back50 = skate_grind_truck_entry( player, 1.0f, &inf_back50 );
+
+ if( allow_back )
+ res_back50 = skate_grind_truck_entry( player, 1.0f, &inf_back50 );
}
else if( s->state.activity == k_skate_activity_grind_5050 ){
- res_front50 = skate_grind_truck_renew( player, -1.0f, &inf_front50 );
- res_back50 = skate_grind_truck_entry( player, 1.0f, &inf_back50 );
+ if( allow_front )
+ res_front50 = skate_grind_truck_renew( player, -1.0f, &inf_front50 );
+ if( allow_back )
+ res_back50 = skate_grind_truck_renew( player, 1.0f, &inf_back50 );
}
else{
res_slide = skate_boardslide_entry( player, &inf_slide );
- res_back50 = skate_grind_truck_entry( player, 1.0f, &inf_back50 );
- res_front50 = skate_grind_truck_entry( player, -1.0f, &inf_front50 );
+
+ if( allow_back )
+ res_back50 = skate_grind_truck_entry( player, 1.0f, &inf_back50 );
+
+ if( allow_front )
+ res_front50 = skate_grind_truck_entry( player, -1.0f, &inf_front50 );
if( res_back50 != res_front50 ){
int wants_to_do_that = fabsf(player->input_js1v->axis.value) >= 0.25f;
skeleton_lerp_pose( sk, ground_pose, air_pose, s->blend_fly, dest->pose );
+ mdl_keyframe *kf_board = &dest->pose[av->id_board-1],
+ *kf_foot_l = &dest->pose[av->id_ik_foot_l-1],
+ *kf_foot_r = &dest->pose[av->id_ik_foot_r-1],
+ *kf_knee_l = &dest->pose[av->id_ik_knee_l-1],
+ *kf_knee_r = &dest->pose[av->id_ik_knee_r-1],
+ *kf_hip = &dest->pose[av->id_hip-1],
+ *kf_wheels[] = { &dest->pose[av->id_wheel_r-1],
+ &dest->pose[av->id_wheel_l-1] };
+
+
mdl_keyframe grind_pose[32];
{
/* TODO: factor balance into this sampler */
for( int i=0; i<vg_list_size(apply_to); i ++ ){
mdl_keyframe *kf = &dest->pose[apply_to[i]-1];
- v3f v0, co;
- v3_add( kf->co, av->sk.bones[apply_to[i]].co, co );
- v3_sub( co, origin, v0 );
- q_mulv( qtotal, v0, v0 );
- v3_add( v0, origin, co );
- v3_sub( co, av->sk.bones[apply_to[i]].co, kf->co );
-
- q_mul( qtotal, kf->q, kf->q );
- q_normalize( kf->q );
+ keyframe_rotate_around( kf, origin, av->sk.bones[apply_to[i]].co,
+ qtotal );
}
v3f p1, p2;
vg_line_arrow( player->rb.co, p1, 0.25f, VG__PINK );
vg_line_arrow( player->rb.co, p2, 0.25f, VG__PINK );
- }
-
-
- mdl_keyframe *kf_board = &dest->pose[av->id_board-1],
- *kf_foot_l = &dest->pose[av->id_ik_foot_l-1],
- *kf_foot_r = &dest->pose[av->id_ik_foot_r-1],
- *kf_knee_l = &dest->pose[av->id_ik_knee_l-1],
- *kf_knee_r = &dest->pose[av->id_ik_knee_r-1],
- *kf_hip = &dest->pose[av->id_hip-1],
- *kf_wheels[] = { &dest->pose[av->id_wheel_r-1],
- &dest->pose[av->id_wheel_l-1] };
+ }
v4f qtotal;
v4f qtrickr, qyawr, qpitchr, qrollr;
kf_foot_l->co[2] += s->blend_weight * 0.1f;
}
+ float slapm = vg_maxf( 1.0f-v3_length2( s->state.trick_vel ), 0.0f );
+ s->subslap = vg_lerpf( s->subslap, slapm, vg.time_delta*10.0f );
+
kf_foot_l->co[1] += s->state.slap;
kf_foot_r->co[1] += s->state.slap;
kf_knee_l->co[1] += s->state.slap;
kf_knee_r->co[1] += s->state.slap;
- kf_board->co[1] += s->state.slap;
+ kf_board->co[1] += s->state.slap * s->subslap;
kf_hip->co[1] += s->state.slap * 0.25f;
/*
}
}
+ {
+ mdl_keyframe
+ *kf_head = &dest->pose[av->id_head-1],
+ *kf_elbow_l = &dest->pose[av->id_ik_elbow_l-1],
+ *kf_elbow_r = &dest->pose[av->id_ik_elbow_r-1],
+ *kf_hand_l = &dest->pose[av->id_ik_hand_l-1],
+ *kf_hand_r = &dest->pose[av->id_ik_hand_r-1];
+
+ float warble = perlin1d( vg.time, 2.0f, 2, 300 );
+ warble *= vg_maxf(s->blend_grind,fabsf(s->blend_weight)) * 0.3f;
+
+ v4f qrot;
+ q_axis_angle( qrot, (v3f){0.8f,0.7f,0.6f}, warble );
+
+ v3f origin = {0.0f,0.2f,0.0f};
+ keyframe_rotate_around( kf_hand_l, origin,
+ av->sk.bones[av->id_ik_hand_l].co, qrot );
+ keyframe_rotate_around( kf_hand_r, origin,
+ av->sk.bones[av->id_ik_hand_r].co, qrot );
+ keyframe_rotate_around( kf_hip, origin,
+ av->sk.bones[av->id_hip].co, qrot );
+ keyframe_rotate_around( kf_elbow_r, origin,
+ av->sk.bones[av->id_ik_elbow_r].co, qrot );
+ keyframe_rotate_around( kf_elbow_l, origin,
+ av->sk.bones[av->id_ik_elbow_l].co, qrot );
+
+ q_inv( qrot, qrot );
+ q_mul( qrot, kf_head->q, kf_head->q );
+ q_normalize( kf_head->q );
+ }
+
/* transform */
rb_extrapolate( &player->rb, dest->root_co, dest->root_q );
v3_muladds( dest->root_co, player->rb.to_world[1], -0.1f, dest->root_co );
struct player_skate *s = &player->_skate;
s->state.jump_charge = 0.0f;
s->state.flip_rate = 0.0f;
-#if 0
- s->state.steery = 0.0f;
- s->state.steerx = 0.0f;
- s->state.steery_s = 0.0f;
- s->state.steerx_s = 0.0f;
-#endif
s->state.reverse = 0.0f;
s->state.slip = 0.0f;
v3_copy( player->rb.co, s->state.prev_pos );
-
-#if 0
- m3x3_identity( s->state.velocity_bias );
- m3x3_identity( s->state.velocity_bias_pstep );
-#endif
-
+ v4_copy( player->rb.q, s->state.smoothed_rotation );
v3_zero( s->state.throw_v );
v3_zero( s->state.trick_vel );
v3_zero( s->state.trick_euler );
+ v3_zero( s->state.cog_v );
+ v3_muladds( player->rb.co, player->rb.to_world[1], 1.0f, s->state.cog );
}
VG_STATIC void player__skate_reset( player_instance *player,
ent_spawn *rp )
{
struct player_skate *s = &player->_skate;
- v3_muladds( player->rb.co, player->rb.to_world[1], 1.0f, s->state.cog );
v3_zero( player->rb.v );
- v3_zero( s->state.cog_v );
v4_copy( rp->transform.q, player->rb.q );
s->state.activity = k_skate_activity_air;