From: hgn Date: Fri, 31 Mar 2023 00:01:42 +0000 (+0100) Subject: fuck you, you cant put your couch there X-Git-Url: https://harrygodden.com/git/?a=commitdiff_plain;h=59c926ee69a041fbe9450b302e11072d39abb432;p=carveJwlIkooP6JGAAIwe30JlM.git fuck you, you cant put your couch there --- diff --git a/maps_src/mp_gridmap.mdl b/maps_src/mp_gridmap.mdl index 9e7a510..5ad8669 100644 Binary files a/maps_src/mp_gridmap.mdl and b/maps_src/mp_gridmap.mdl differ diff --git a/player_skate.c b/player_skate.c index 446c4bf..8535540 100644 --- a/player_skate.c +++ b/player_skate.c @@ -3,6 +3,7 @@ #include "player.h" #include "audio.h" +#include "vg/vg_perlin.h" VG_STATIC void player__skate_bind( player_instance *player ) { @@ -523,8 +524,6 @@ void player__approximate_best_trajectory( player_instance *player ) { grind_located = 1; grind_located_gravity = inf->gravity; - - vg_success( "Grind located\n" ); } } } @@ -1031,8 +1030,6 @@ VG_STATIC void skate_apply_jump_model( player_instance *player ) 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 ); @@ -1127,7 +1124,8 @@ VG_STATIC void skate_integrate( player_instance *player ) { 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 ){ @@ -1135,13 +1133,14 @@ VG_STATIC void skate_integrate( player_instance *player ) 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 ); @@ -1292,15 +1291,14 @@ VG_STATIC void player__skate_post_update( player_instance *player ) 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; @@ -2014,25 +2012,56 @@ VG_STATIC enum skate_activity skate_availible_grind( player_instance *player ) 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; @@ -2806,6 +2835,16 @@ VG_STATIC void player__skate_animate( player_instance *player, 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 */ @@ -2901,15 +2940,8 @@ VG_STATIC void player__skate_animate( player_instance *player, for( int i=0; ipose[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; @@ -2918,18 +2950,8 @@ VG_STATIC void player__skate_animate( player_instance *player, 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; @@ -2980,11 +3002,14 @@ VG_STATIC void player__skate_animate( player_instance *player, 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; /* @@ -3007,6 +3032,37 @@ VG_STATIC void player__skate_animate( player_instance *player, } } + { + 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 ); @@ -3080,33 +3136,22 @@ VG_STATIC void player__skate_clear_mechanics( player_instance *player ) 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; diff --git a/player_skate.h b/player_skate.h index 9f21115..0f99fdb 100644 --- a/player_skate.h +++ b/player_skate.h @@ -95,7 +95,8 @@ struct player_skate blend_push, blend_jump, blend_airdir, - blend_weight; + blend_weight, + subslap; /* vectors representing the direction of the axels in localspace */ v3f truckv0[2]; diff --git a/skeleton.h b/skeleton.h index 2fcfb50..2595cda 100644 --- a/skeleton.h +++ b/skeleton.h @@ -73,6 +73,22 @@ VG_STATIC void keyframe_copy_pose( mdl_keyframe *kfa, mdl_keyframe *kfb, kfb[i] = kfa[i]; } + +/* apply a rotation from the perspective of root */ +VG_STATIC void keyframe_rotate_around( mdl_keyframe *kf, + v3f origin, v3f offset, v4f q ) +{ + v3f v0, co; + v3_add( kf->co, offset, co ); + v3_sub( co, origin, v0 ); + q_mulv( q, v0, v0 ); + v3_add( v0, origin, co ); + v3_sub( co, offset, kf->co ); + + q_mul( q, kf->q, kf->q ); + q_normalize( kf->q ); +} + /* * Lerp between two sets of keyframes and store in dest. Rotations use Nlerp. */ diff --git a/sound_src/metalscrape.ogg b/sound_src/metalscrape.ogg index 64f8b39..c6448c5 100644 Binary files a/sound_src/metalscrape.ogg and b/sound_src/metalscrape.ogg differ diff --git a/sound_src/slidetap.ogg b/sound_src/slidetap.ogg index 34cceab..72a070d 100644 Binary files a/sound_src/slidetap.ogg and b/sound_src/slidetap.ogg differ diff --git a/sound_src/woodimpact.ogg b/sound_src/woodimpact.ogg index 439ec31..ae56fd1 100644 Binary files a/sound_src/woodimpact.ogg and b/sound_src/woodimpact.ogg differ diff --git a/sound_src/woodroll0.ogg b/sound_src/woodroll0.ogg index 3e204e2..b512134 100644 Binary files a/sound_src/woodroll0.ogg and b/sound_src/woodroll0.ogg differ diff --git a/sound_src/woodroll1.ogg b/sound_src/woodroll1.ogg index d05a9fa..e7b31f2 100644 Binary files a/sound_src/woodroll1.ogg and b/sound_src/woodroll1.ogg differ diff --git a/sound_src/woodroll2.ogg b/sound_src/woodroll2.ogg index 060e842..9bf8629 100644 Binary files a/sound_src/woodroll2.ogg and b/sound_src/woodroll2.ogg differ diff --git a/sound_src/woodslide.ogg b/sound_src/woodslide.ogg index 9946a6b..23602e3 100644 Binary files a/sound_src/woodslide.ogg and b/sound_src/woodslide.ogg differ