q_nlerp( xform.q, mark_display->transform.q, t, xform.q );
v3_lerp( xform.s, mark_display->transform.s, t, xform.s );
+ struct board_pose pose = {0};
m4x3f mmdl;
mdl_transform_m4x3( &xform, mmdl );
- render_board( &main_camera, world, board, mmdl, k_board_shader_entity );
+ render_board( &main_camera, world, board, mmdl,
+ &pose, k_board_shader_entity );
fade_out:;
float rate = 5.0f*vg.time_delta;
player_pose holdout_pose;
float holdout_time;
+ struct board_pose board_pose;
+
/*
* Rewind
* ----------------------------------------------------
VG_STATIC void render_board( camera *cam, world_instance *world,
struct player_board *board, m4x3f root,
+ struct board_pose *pose,
enum board_shader shader )
{
if( !board ) return;
if( board->board.indice_count ){
m4x3f mlocal;
m3x3_identity( mlocal );
- v3_copy( board->board_position, mlocal[3] );
+
+ mdl_keyframe kf;
+ v3_zero( kf.co );
+ q_identity( kf.q );
+ v3_zero( kf.s );
+
+ v4f qroll;
+ q_axis_angle( qroll, (v3f){0.0f,0.0f,1.0f}, pose->lean * 0.6f );
+ keyframe_rotate_around( &kf, (v3f){0.0f,0.11f,0.0f},
+ (v3f){0.0f,0.0f,0.0f}, qroll );
+
+ v3_add( board->board_position, kf.co, mlocal[3] );
+ q_m3x3( kf.q, mlocal );
+
m4x3_mul( root, mlocal, mlocal );
if( shader == k_board_shader_entity ){
struct player_board *board =
addon_cache_item_if_loaded( k_addon_type_board,
player->board_view_slot );
+
render_board( cam, world, board, player->playeravatar->sk.final_mtx[
- player->playeravatar->id_board],
- k_board_shader_player );
+ player->playeravatar->id_board],
+ &player->board_pose,
+ k_board_shader_player );
SDL_AtomicUnlock( &addon_system.sl_cache_using_resources );
}
board;
};
+struct board_pose {
+ f32 lean;
+};
+
struct player_model{
struct dynamic_model_1texture mdl;
};
VG_STATIC void render_board( camera *cam, world_instance *world,
struct player_board *board, m4x3f root,
+ struct board_pose *pose,
enum board_shader shader );
+
VG_STATIC void render_playermodel( camera *cam, world_instance *world,
struct player_model *model,
struct skeleton *skeleton );
float dir_frame = s->blend_z * (15.0f/30.0f),
stand_blend = offset[1]*-2.0f;
+ v2f steer;
+ joystick_state( k_srjoystick_steer, steer );
+ f32 lean1,
+ lean2 = steer[0] * s->state.reverse * -0.36f,
+ lean;
+
+ if( fabsf(s->state.slip) > 0.3f ){
+ f32 slide_dir = vg_signf(v3_dot(player->rb.v,player->rb.to_world[0]));
+ s->state.delayed_slip_dir = slide_dir;
+ }
+ lean1 = s->blend_slide * s->state.delayed_slip_dir;
+
+ if( fabsf(lean1)>fabsf(lean2) ) lean = lean1;
+ else lean = lean2;
+
+ if( ((int)roundf(s->state.trick_euler[0])) % 2 ) lean = -lean;
+ lean = vg_clampf( lean, -1.0f, 1.0f );
+
+ player->board_pose.lean = vg_lerpf( player->board_pose.lean, lean,
+ vg.time_delta * 18.0f );
+
v3f local_cog;
m4x3_mulv( player->rb.to_local, s->state.cog, local_cog );
-
stand_blend = vg_clampf( 1.0f-local_cog[1], 0, 1 );
skeleton_sample_anim( sk, s->anim_stand, dir_frame, apose );
q_mul( qtotal, kf_board->q, kf_board->q );
-
/* trick rotation */
v4f qtrick, qyaw, qpitch, qroll;
v3f euler;
activity,
activity_prev;
- float reverse,
- slip;
+ f32 reverse, slip, delayed_slip_dir;
int manual_direction;
sizeof(struct ub_world_lighting), &world->ub_lighting );
render_world( world, &cam, 1 );
- render_board( &cam, world, board, mmdl, k_board_shader_entity );
- render_board( &cam, world, board, mmdl1, k_board_shader_entity );
+ struct board_pose pose = {0};
+ render_board( &cam, world, board, mmdl, &pose, k_board_shader_entity );
+ render_board( &cam, world, board, mmdl1, &pose, k_board_shader_entity );
glBindFramebuffer( GL_FRAMEBUFFER, 0 );
glViewport( 0,0, vg.window_x, vg.window_y );