+ if( state->activity == k_skate_activity_handplant ){
+ state->handplant_t += vg.time_delta;
+ mdl_keyframe hpose[32];
+
+ struct skeleton_anim *anim = player_skate.anim_handplant;
+
+ int end = !skeleton_sample_anim_clamped(
+ &localplayer.skeleton, anim,
+ state->handplant_t, hpose );
+
+ if( state->reverse < 0.0f )
+ player_mirror_pose( hpose, hpose );
+
+ mdl_keyframe *kf_world = &hpose[ localplayer.id_world -1 ];
+ m4x3f world, mmdl, world_view;
+ q_m3x3( kf_world->q, world );
+ v3_copy( kf_world->co, world[3] );
+
+ /* original mtx */
+ q_m3x3( state->store_q, mmdl );
+ v3_copy( state->store_co, mmdl[3] );
+ m4x3_mul( mmdl, world, world_view );
+
+ vg_line_arrow( world_view[3], world_view[0], 1.0f, 0xff0000ff );
+ vg_line_arrow( world_view[3], world_view[1], 1.0f, 0xff00ff00 );
+ vg_line_arrow( world_view[3], world_view[2], 1.0f, 0xffff0000 );
+
+ m4x3f invworld;
+ m4x3_invert_affine( world, invworld );
+ m4x3_mul( mmdl, invworld, world_view );
+
+ v3_copy( world_view[3], localplayer.rb.co );
+ m3x3_q( world_view, localplayer.rb.q );
+
+ /* new * old^-1 = transfer function */
+ m4x3f transfer;
+ m4x3_invert_affine( mmdl, transfer );
+ m4x3_mul( world_view, transfer, transfer );
+
+ m3x3_mulv( transfer, state->air_init_v, localplayer.rb.v );
+ m3x3_mulv( transfer, state->store_cog_v, state->cog_v );
+
+ m4x3_mulv( transfer, state->store_cog, state->cog );
+ v3_muladds( state->cog, localplayer.rb.to_world[1],
+ -state->handplant_t*0.5f, state->cog );
+
+ v4f qtransfer;
+ m3x3_q( transfer, qtransfer );
+ q_mul( qtransfer, state->store_smoothed, state->smoothed_rotation );
+ q_normalize( state->smoothed_rotation );
+ rb_update_transform( &localplayer.rb );
+
+ if( end ){
+ state->activity = k_skate_activity_air;
+ }
+ else return;
+ }
+
+ if( button_down(k_srbind_use) && (v3_length2(state->trick_vel) < 0.01f) ){