From: hgn Date: Wed, 12 Mar 2025 01:32:58 +0000 (+0000) Subject: fadeout cutscene and some bugs X-Git-Url: https://harrygodden.com/git/?a=commitdiff_plain;h=1094544f7596fac6dd70798669e11ddfdeefe711;p=carveJwlIkooP6JGAAIwe30JlM.git fadeout cutscene and some bugs --- diff --git a/src/metascene.c b/src/metascene.c index 1812db4..19b7dbd 100644 --- a/src/metascene.c +++ b/src/metascene.c @@ -93,6 +93,8 @@ void _cutscene_unload(void) _cutscene.subtitle = NULL; _cutscene.subtitle_list = NULL; _cutscene.subtitle_index = 0; + _cutscene.fadeout = 0; + _cutscene.fadeout_start = 0.0f; } /* @@ -107,8 +109,7 @@ struct cs_asoc ms_override *override; }; -static void _cutscene_override_asoc( u32 instance_id, u32 override_index, - struct cs_asoc *out_asoc ) +static void _cutscene_override_asoc( u32 instance_id, u32 override_index, struct cs_asoc *out_asoc ) { struct cs_instance *instance = &_cutscene.instances[ instance_id ]; mdl_context *mdl = &_cutscene.refs[ instance->ref_id ].mdl; @@ -209,8 +210,7 @@ static void cutscene_load_thread( void *data ) if( !ref ) { - _cutscene.refs = vg_linear_extend( _cutscene.arena, _cutscene.refs, - sizeof( struct model_ref ) ); + _cutscene.refs = vg_linear_extend( _cutscene.arena, _cutscene.refs, sizeof( struct model_ref ) ); ref_id = _cutscene.unique_refs; ref = &_cutscene.refs[ ref_id ]; ref->name = name; @@ -340,7 +340,7 @@ static int cmd_cutscene_load( int argc, const char *argv[] ) if( _cutscene.state != k_cutscene_state_none ) { vg_error( "Cutscene already in use..\n" ); - return 1; + return 0; } if( vg_loader_availible() ) @@ -577,7 +577,13 @@ void cutscene_update( f32 delta ) bool absorbed = 0; - if( _cutscene.subtitle_list ) + if( vg_str_eq( marker, "$fadeout" ) ) + { + _cutscene.fadeout = 1; + _cutscene.fadeout_start = _cutscene.time; + absorbed = 1; + } + else if( _cutscene.subtitle_list ) { const cs_subtitle *next = &_cutscene.subtitle_list[ _cutscene.subtitle_index ]; @@ -788,6 +794,46 @@ void cutscene_update( f32 delta ) _cutscene.state = k_cutscene_state_done; } +void cutscene_render_fadeout(void) +{ + bool render = 0; + f32 render_alpha = 0.0f; + + if( _cutscene.state >= k_cutscene_state_ready ) + { + if( _cutscene.fadeout ) + { + f32 l = ((f32)_cutscene.meta.info.end_frame/(f32)_cutscene.meta.info.framerate) - _cutscene.fadeout_start, + t = (_cutscene.time - _cutscene.fadeout_start) / l; + render = 1; + render_alpha = t; + _cutscene.fadeout_cooldown = 1.0f; + } + } + else + { + if( _cutscene.fadeout_cooldown > 0.0f ) + { + render = 1; + render_alpha = _cutscene.fadeout_cooldown; + _cutscene.fadeout_cooldown -= vg.time_delta; + } + } + + if( render ) + { + glEnable(GL_BLEND); + glDisable(GL_DEPTH_TEST); + glDepthMask(GL_FALSE); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glBlendEquation(GL_FUNC_ADD); + + shader_blitcolour_use(); + shader_blitcolour_uColour( (v4f){ 0.04f, 0.02f, 0.03f, vg_clampf( render_alpha, 0.0f, 1.0f ) } ); + render_fsquad(); + } +} + void cutscene_render( world_instance *world, vg_camera *cam ) { if( _cutscene.state >= k_cutscene_state_ready ) @@ -819,20 +865,17 @@ void _cutscene_gui( ui_context *ctx ) * ---------------------------------------------------------------------------- */ -static void cb_cutscene_view( ui_context *ctx, ui_rect rect, - struct vg_magi_panel *magi ) +static void cb_cutscene_view( ui_context *ctx, ui_rect rect, struct vg_magi_panel *magi ) { if( _cutscene.state == k_cutscene_state_none ) { - ui_text( ctx, rect, "No cutscene loaded.", 1, - k_ui_align_middle_center, 0 ); + ui_text( ctx, rect, "No cutscene loaded.", 1, k_ui_align_middle_center, 0 ); return; } if( _cutscene.state == k_cutscene_state_loading ) { - ui_text( ctx, rect, "Cutscene loading..", 1, - k_ui_align_middle_center, 0 ); + ui_text( ctx, rect, "Cutscene loading..", 1, k_ui_align_middle_center, 0 ); return; } diff --git a/src/metascene.h b/src/metascene.h index 87d45fc..e6b9314 100644 --- a/src/metascene.h +++ b/src/metascene.h @@ -158,6 +158,9 @@ struct _cutscene u32 strip; f32 time; + bool fadeout; + f32 fadeout_start, fadeout_cooldown; + const char *marker_this_frame; const char *subtitle; struct cs_subtitle @@ -172,6 +175,7 @@ extern _cutscene; void metascene_load( ms_context *ms, const char *path, void *alloc ); void cutscene_init(void); void cutscene_render( world_instance *world, vg_camera *cam ); +void cutscene_render_fadeout(void); void _cutscene_play(void); void _cutscene_unload(void); void cutscene_update( f32 delta ); diff --git a/src/player_dead.c b/src/player_dead.c index 7f1b5e9..dd2b9ae 100644 --- a/src/player_dead.c +++ b/src/player_dead.c @@ -164,11 +164,17 @@ void player__dead_transition( enum player_die_type type ) if( localplayer.subsystem == k_player_subsystem_dead ) return; + static bool dont_ask = 1; + if( dont_ask ) + { + dont_ask = 0; + return; + } + localplayer.subsystem = k_player_subsystem_dead; copy_localplayer_to_ragdoll( &localplayer.ragdoll, type ); - struct ragdoll_part *part = - &localplayer.ragdoll.parts[ localplayer.id_hip-1 ]; + struct ragdoll_part *part = &localplayer.ragdoll.parts[ localplayer.id_hip-1 ]; v3_copy( part->rb.co, player_dead.co_lpf ); v3_copy( part->rb.v, player_dead.v_lpf ); v3_copy( part->rb.w, player_dead.w_lpf ); diff --git a/src/player_ragdoll.c b/src/player_ragdoll.c index a919eeb..ebaa55d 100644 --- a/src/player_ragdoll.c +++ b/src/player_ragdoll.c @@ -299,16 +299,15 @@ void copy_ragdoll_pose_to_localplayer( struct player_ragdoll *rd ) /* * Make the ragdoll copy the player model */ -void copy_localplayer_to_ragdoll( struct player_ragdoll *rd, - enum player_die_type type ) +void copy_localplayer_to_ragdoll( struct player_ragdoll *rd, enum player_die_type type ) { v3f centroid; v3f *bone_mtx = localplayer.final_mtx[localplayer.id_hip]; - m4x3_mulv( bone_mtx, - localplayer.skeleton.bones[localplayer.id_hip].co, centroid ); + m4x3_mulv( bone_mtx, localplayer.skeleton.bones[localplayer.id_hip].co, centroid ); - for( int i=0; ipart_count; i++ ){ + for( int i=0; ipart_count; i++ ) + { struct ragdoll_part *part = &rd->parts[i]; v3f pos, offset; @@ -329,9 +328,10 @@ void copy_localplayer_to_ragdoll( struct player_ragdoll *rd, v3_cross( localplayer.rb.w, ra, v ); v3_add( localplayer.rb.v, v, part->rb.v ); - if( type == k_player_die_type_feet ){ - if( (bone == localplayer.id_foot_l) || - (bone == localplayer.id_foot_r) ){ + if( type == k_player_die_type_feet ) + { + if( (bone == localplayer.id_foot_l) || (bone == localplayer.id_foot_r) ) + { v3_zero( part->rb.v ); } } diff --git a/src/skaterift.c b/src/skaterift.c index abe5cd0..ef15b94 100644 --- a/src/skaterift.c +++ b/src/skaterift.c @@ -475,6 +475,7 @@ static void render_main_game(void) postprocess_to_screen( g_render.fb_main ); skaterift_replay_post_render(); + cutscene_render_fadeout(); if( gui.helper_count == 0 ) control_overlay_render(); diff --git a/src/skaterift_script.c b/src/skaterift_script.c index 603953c..e44a232 100644 --- a/src/skaterift_script.c +++ b/src/skaterift_script.c @@ -1394,13 +1394,16 @@ enum generic_cutscene_event generic_cutscene_wrapper( const struct generic_cutsc { if( generic->state == k_generic_cutscene_state_wake ) { - if( generic->freeze_player ) - localplayer.immobile = 1; - - if( cmd_cutscene_load( 1, (const char *[]){ generic->metascene_path } ) ) + if( _cutscene.state == k_cutscene_state_none ) { - generic->state = k_generic_cutscene_state_init; - vg_info( "generic_cutscene:state = initializing\n" ); + if( cmd_cutscene_load( 1, (const char *[]){ generic->metascene_path } ) ) + { + generic->state = k_generic_cutscene_state_init; + vg_info( "generic_cutscene:state = initializing\n" ); + + if( generic->freeze_player ) + localplayer.immobile = 1; + } } if( generic->trigger_start == 0 ) diff --git a/src/world_load.c b/src/world_load.c index 2874197..0e2ec62 100644 --- a/src/world_load.c +++ b/src/world_load.c @@ -421,7 +421,7 @@ void world_switcher_update(void) /* pre-load step aka waiting for audio to end. */ if( _world.loader_state == k_world_loader_unloading_current ) { - if( !vg_audio_flagged_stopped( AUDIO_FLAG_WORLD ) ) + if( !vg_audio_flagged_stopped( AUDIO_FLAG_WORLD|AUDIO_FLAG_CUTSCENE ) ) return; world_instance_free_graphics_data( &_world.main ); @@ -500,7 +500,13 @@ void skaterift_load_world_start( addon_reg *reg, bool preview ) } } else + { + if( _cutscene.state != k_cutscene_state_none ) + { + _cutscene_unload(); + } vg_audio_fadeout_flagged_audio( AUDIO_FLAG_WORLD, 1.0f ); + } _world.loader_reg = reg; _world.loader_instance = world; diff --git a/src/world_water.c b/src/world_water.c index fd25b56..984a370 100644 --- a/src/world_water.c +++ b/src/world_water.c @@ -228,10 +228,10 @@ void render_water_surface( world_instance *world, vg_camera *cam ) static void world_water_drown(void) { - if( localplayer.drowned ) return; - player__networked_sfx( k_player_subsystem_walk, 32, - k_player_walk_soundeffect_splash, - localplayer.rb.co, 1.0f ); + if( localplayer.drowned ) + return; + + player__networked_sfx( k_player_subsystem_walk, 32, k_player_walk_soundeffect_splash, localplayer.rb.co, 1.0f ); vg_info( "player fell of due to walking into walker\n" ); localplayer.drowned = 1; player__dead_transition( k_player_die_type_generic );