From: hgn Date: Mon, 29 Jan 2024 11:34:15 +0000 (+0000) Subject: glider orphan / entity normals with scale X-Git-Url: https://harrygodden.com/git/?p=carveJwlIkooP6JGAAIwe30JlM.git;a=commitdiff_plain;h=1be7cfcdb57c61c322462ab6c6c3e9894235732f glider orphan / entity normals with scale --- diff --git a/player.c b/player.c index f52c8bd..8b095cd 100644 --- a/player.c +++ b/player.c @@ -112,6 +112,9 @@ static void player__pre_update(void){ static void player__update(void){ if( player_subsystems[ localplayer.subsystem ]->update ) player_subsystems[ localplayer.subsystem ]->update(); + + if( localplayer.glider_orphan ) + glider_physics(); } static void player__post_update(void) @@ -284,6 +287,8 @@ static void player__reset(void){ localplayer.immobile = 0; localplayer.gate_waiting = NULL; + localplayer.have_glider = 0; + localplayer.glider_orphan = 0; v3_copy( localplayer.rb.co, localplayer.cam_control.tpv_lpf ); player__clean_refs(); diff --git a/player.h b/player.h index 97c8292..ad15227 100644 --- a/player.h +++ b/player.h @@ -88,7 +88,7 @@ struct { rigidbody rb; v3f angles; - bool have_glider; + bool have_glider, glider_orphan; /* * Camera management diff --git a/player_glide.c b/player_glide.c index d67d8ec..1b21191 100644 --- a/player_glide.c +++ b/player_glide.c @@ -22,12 +22,13 @@ static i32 k_glide_pause = 0; static void player_glide_pre_update(void){ if( button_down(k_srbind_use) ){ localplayer.subsystem = k_player_subsystem_skate; + localplayer.glider_orphan = 1; player_skate.state.activity = k_skate_activity_air; player_skate.state.activity_prev = k_skate_activity_air; q_mulv( localplayer.rb.q, (v3f){0.0f,1.0f,0.0f}, player_skate.state.cog ); - v3_add( player_skate.state.cog, localplayer.rb.co, player_skate.state.cog ); + v3_add( player_skate.state.cog, localplayer.rb.co, player_skate.state.cog); v3_copy( localplayer.rb.v, player_skate.state.cog_v ); player__begin_holdout( (v3f){0.0f,0.0f,0.0f} ); @@ -80,7 +81,10 @@ static void calculate_drag( v3f vl, f32 cd, v3f out_force ){ v3_muls( vl, -cd*v2, out_force ); } -static void player_glide_update(void){ +/* + * Returns true if the bottom sphere is hit + */ +static bool glider_physics(void){ rigidbody *rb = &player_glide.rb; v2f steer; @@ -120,7 +124,7 @@ static void player_glide_update(void){ if( player_glide.ticker ){ player_glide.ticker --; - return; + return 0; } player_glide.ticker += k_glide_pause; @@ -136,12 +140,15 @@ static void player_glide_update(void){ m3x3_mulv( rb->to_world, Fw, Fw ); v3_muladds( rb->w, Fw, k_rb_delta, rb->w ); + /* * collisions & constraints */ world_instance *world = world_current_instance(); rb_solver_reset(); + bool bottom_hit = 0; + rigidbody _null = {0}; _null.inv_mass = 0.0f; m3x3_zero( _null.iI ); @@ -173,6 +180,9 @@ static void player_glide_update(void){ l = rb_sphere__scene( mmdl, player_glide.parts[i].r, NULL, world->geo_bh, buf, k_material_flag_ghosts ); + + if( l ) + bottom_hit = 1; } for( u32 j=0; jtransform[3] ); shader_model_entity_uPv( cam->mtx.pv ); WORLD_BIND_LIGHT_BUFFERS_UB0_TEX234( world, model_entity ); - mdl_keyframe kf_backpack, - kf_res; + mdl_keyframe kf_res; + if( localplayer.glider_orphan ){ + rb_extrapolate( &player_glide.rb, kf_res.co, kf_res.q ); + v3_fill( kf_res.s, 1.0f ); + } + else { + f32 t; + if( localplayer.subsystem == k_player_subsystem_glide ) + t = 1.0f; + else + t = 0.0f; + vg_slewf( &player_glide.t, t, vg.time_frame_delta * 4.0f ); - struct skeleton *sk = &localplayer.skeleton; - m4x3_mulv( localplayer.final_mtx[localplayer.id_chest ], - sk->bones[localplayer.id_chest].co, - kf_backpack.co ); + mdl_keyframe kf_backpack; - v4f qyaw, qpitch, qchest, q; - q_axis_angle( qyaw, (v3f){0,1,0}, VG_TAUf*0.25f ); - q_axis_angle( qpitch, (v3f){1,0,0}, VG_TAUf*0.25f ); - m3x3_q( localplayer.final_mtx[ localplayer.id_chest ], qchest ); + struct skeleton *sk = &localplayer.skeleton; + m4x3_mulv( localplayer.final_mtx[localplayer.id_chest ], + sk->bones[localplayer.id_chest].co, + kf_backpack.co ); - q_mul( qyaw, qpitch, q ); - q_mul( qchest, q, kf_backpack.q ); - q_normalize( kf_backpack.q ); + v4f qyaw, qpitch, qchest, q; + q_axis_angle( qyaw, (v3f){0,1,0}, VG_TAUf*0.25f ); + q_axis_angle( qpitch, (v3f){1,0,0}, VG_TAUf*0.25f ); + m3x3_q( localplayer.final_mtx[ localplayer.id_chest ], qchest ); - v3_fill( kf_backpack.s, 0.2f ); + q_mul( qyaw, qpitch, q ); + q_mul( qchest, q, kf_backpack.q ); + q_normalize( kf_backpack.q ); - v3_copy( pose->root_co, kf_res.co ); - v4_copy( pose->root_q, kf_res.q ); - v3_fill( kf_res.s, 1.0f ); + v3_fill( kf_backpack.s, 0.2f ); - keyframe_lerp( &kf_backpack, &kf_res, vg_smoothstepf( player_glide.t ), - &kf_res ); - + v3_copy( pose->root_co, kf_res.co ); + v4_copy( pose->root_q, kf_res.q ); + v3_fill( kf_res.s, 1.0f ); + + keyframe_lerp( &kf_backpack, &kf_res, vg_smoothstepf( player_glide.t ), + &kf_res ); + } + m4x3f mmdl; q_m3x3( kf_res.q, mmdl ); m3x3_scale( mmdl, kf_res.s ); diff --git a/player_glide.h b/player_glide.h index e6af01d..777112b 100644 --- a/player_glide.h +++ b/player_glide.h @@ -72,6 +72,7 @@ static void player_glide_post_animate(void); static void player_glide_im_gui(void); static void player_glide_bind(void); static void player_glide_transition(void); +static bool glider_physics(void); struct player_subsystem_interface static player_subsystem_glide = { .pre_update = player_glide_pre_update, diff --git a/shaders/model.vs b/shaders/model.vs index 350a821..a23529d 100644 --- a/shaders/model.vs +++ b/shaders/model.vs @@ -29,6 +29,6 @@ void main() aWorldCo = world_pos0; aColour = a_colour; aUv = a_uv; - aNorm = mat3(uMdl) * a_norm; + aNorm = normalize( mat3(uMdl) * a_norm ); aCo = a_co; } diff --git a/shaders/model_board_view.h b/shaders/model_board_view.h index a50e9d5..abbc42f 100644 --- a/shaders/model_board_view.h +++ b/shaders/model_board_view.h @@ -58,7 +58,7 @@ static struct vg_shader _shader_model_board_view = { " aWorldCo = world_pos0;\n" " aColour = a_colour;\n" " aUv = a_uv;\n" -" aNorm = mat3(uMdl) * a_norm;\n" +" aNorm = normalize( mat3(uMdl) * a_norm );\n" " aCo = a_co;\n" "}\n" ""}, diff --git a/shaders/model_entity.h b/shaders/model_entity.h index 8b842ae..a970038 100644 --- a/shaders/model_entity.h +++ b/shaders/model_entity.h @@ -58,7 +58,7 @@ static struct vg_shader _shader_model_entity = { " aWorldCo = world_pos0;\n" " aColour = a_colour;\n" " aUv = a_uv;\n" -" aNorm = mat3(uMdl) * a_norm;\n" +" aNorm = normalize( mat3(uMdl) * a_norm );\n" " aCo = a_co;\n" "}\n" ""}, diff --git a/shaders/model_gate.h b/shaders/model_gate.h index 31329ab..1bc558f 100644 --- a/shaders/model_gate.h +++ b/shaders/model_gate.h @@ -58,7 +58,7 @@ static struct vg_shader _shader_model_gate = { " aWorldCo = world_pos0;\n" " aColour = a_colour;\n" " aUv = a_uv;\n" -" aNorm = mat3(uMdl) * a_norm;\n" +" aNorm = normalize( mat3(uMdl) * a_norm );\n" " aCo = a_co;\n" "}\n" ""}, diff --git a/shaders/model_gate_unlinked.h b/shaders/model_gate_unlinked.h index 1fda296..449322a 100644 --- a/shaders/model_gate_unlinked.h +++ b/shaders/model_gate_unlinked.h @@ -58,7 +58,7 @@ static struct vg_shader _shader_model_gate_unlinked = { " aWorldCo = world_pos0;\n" " aColour = a_colour;\n" " aUv = a_uv;\n" -" aNorm = mat3(uMdl) * a_norm;\n" +" aNorm = normalize( mat3(uMdl) * a_norm );\n" " aCo = a_co;\n" "}\n" ""}, diff --git a/shaders/model_menu.h b/shaders/model_menu.h index 1d17aa0..0ee6ad3 100644 --- a/shaders/model_menu.h +++ b/shaders/model_menu.h @@ -58,7 +58,7 @@ static struct vg_shader _shader_model_menu = { " aWorldCo = world_pos0;\n" " aColour = a_colour;\n" " aUv = a_uv;\n" -" aNorm = mat3(uMdl) * a_norm;\n" +" aNorm = normalize( mat3(uMdl) * a_norm );\n" " aCo = a_co;\n" "}\n" ""}, diff --git a/shaders/model_sky.h b/shaders/model_sky.h index f8f88d3..88612b2 100644 --- a/shaders/model_sky.h +++ b/shaders/model_sky.h @@ -58,7 +58,7 @@ static struct vg_shader _shader_model_sky = { " aWorldCo = world_pos0;\n" " aColour = a_colour;\n" " aUv = a_uv;\n" -" aNorm = mat3(uMdl) * a_norm;\n" +" aNorm = normalize( mat3(uMdl) * a_norm );\n" " aCo = a_co;\n" "}\n" ""}, diff --git a/shaders/model_sky_space.h b/shaders/model_sky_space.h index 8309550..c96f2c4 100644 --- a/shaders/model_sky_space.h +++ b/shaders/model_sky_space.h @@ -58,7 +58,7 @@ static struct vg_shader _shader_model_sky_space = { " aWorldCo = world_pos0;\n" " aColour = a_colour;\n" " aUv = a_uv;\n" -" aNorm = mat3(uMdl) * a_norm;\n" +" aNorm = normalize( mat3(uMdl) * a_norm );\n" " aCo = a_co;\n" "}\n" ""}, diff --git a/testing.c b/testing.c index c057c9f..37ef42e 100644 --- a/testing.c +++ b/testing.c @@ -24,6 +24,7 @@ static void testing_update(void){ if( vg_getkey( SDLK_8 ) ){ localplayer.have_glider = 1; + localplayer.have_glider = 0; } vg_line_boxf_transformed( baller.rb.to_world, baller.box, VG__RED );