From 2dd61c7f0185ec525658ca398801f46e6adccf23 Mon Sep 17 00:00:00 2001 From: hgn Date: Sun, 9 Jul 2023 00:59:30 +0100 Subject: [PATCH] review activity switching --- camera.h | 7 +-- ent_skateshop.c | 72 +++++++++++------------ ent_skateshop.h | 4 +- input.h | 7 +-- menu.h | 38 ++++++------ player.c | 20 +++++-- player.h | 11 ---- player_common.c | 13 ----- player_render.c | 45 ++++----------- player_replay.c | 12 ++-- skaterift.c | 149 ++++++++++++++++++++++++------------------------ skaterift.h | 10 ++++ vehicle.c | 7 +-- workshop.c | 2 +- world_gate.c | 26 ++++----- world_gate.h | 2 + 16 files changed, 191 insertions(+), 234 deletions(-) diff --git a/camera.h b/camera.h index 314eafe..7d720f7 100644 --- a/camera.h +++ b/camera.h @@ -4,9 +4,7 @@ #include "skaterift.h" typedef struct camera camera; - -struct camera -{ +struct camera{ /* Input */ v3f angles; v3f pos; @@ -23,8 +21,7 @@ struct camera } mtx, mtx_prev; -} -static main_camera, gate_camera; +}; VG_STATIC void camera_lerp_angles( v3f a, v3f b, float t, v3f d ) { diff --git a/ent_skateshop.c b/ent_skateshop.c index 4c55bb9..7cb0e9a 100644 --- a/ent_skateshop.c +++ b/ent_skateshop.c @@ -163,14 +163,18 @@ VG_STATIC void skateshop_load_world_preview( addon_reg *reg ){ * VG event preupdate */ void temp_update_playermodel(void); -VG_STATIC void global_skateshop_preupdate(void) -{ +VG_STATIC void global_skateshop_preupdate(void){ float rate = vg_minf( 1.0f, vg.time_frame_delta * 2.0f ); - global_skateshop.factive = vg_lerpf( global_skateshop.factive, - global_skateshop.active, rate ); + int active = 0; + if( skaterift.activity == k_skaterift_skateshop ) + active = 1; + + vg_slewf( &global_skateshop.factive, active, + vg.time_frame_delta * (1.0f/0.5f) ); - if( !global_skateshop.active ) return; + if( !active ) return; + /* input filter */ world_instance *world = world_current_instance(); ent_skateshop *shop = global_skateshop.ptr_ent; @@ -181,30 +185,25 @@ VG_STATIC void global_skateshop_preupdate(void) v3f dir = {0.0f,-1.0f,0.0f}; mdl_transform_vector( &ref->transform, dir, dir ); m3x3_mulv( localplayer.invbasis, dir, dir ); - player_vector_angles( localplayer.cam_override_angles, dir, 1.0f, 0.0f ); + player_vector_angles( global_skateshop.cam.angles, dir, 1.0f, 0.0f ); v3f lookat; if( shop->type == k_skateshop_type_boardshop || shop->type == k_skateshop_type_worldshop ){ ent_marker *display = mdl_arritm( &world->ent_marker, mdl_entity_id_id(shop->boards.id_display) ); - v3_sub( display->transform.co, localplayer.rb.co, lookat ); - } - else if( shop->type == k_skateshop_type_charshop ){ + else if( shop->type == k_skateshop_type_charshop ) v3_sub( ref->transform.co, localplayer.rb.co, lookat ); - } - else{ + else vg_fatal_error( "Unknown store (%u)\n", shop->type ); - } q_axis_angle( localplayer.rb.q, (v3f){0.0f,1.0f,0.0f}, atan2f(lookat[0],lookat[2]) ); - v3_copy( ref->transform.co, localplayer.cam_override_pos ); - localplayer.cam_override_fov = ref->fov; - localplayer.cam_override_strength = global_skateshop.factive; + v3_copy( ref->transform.co, global_skateshop.cam.pos ); + global_skateshop.cam.fov = ref->fov; /* input */ if( shop->type == k_skateshop_type_boardshop ){ @@ -385,8 +384,7 @@ VG_STATIC void global_skateshop_preupdate(void) } } -VG_STATIC void skateshop_render_boardshop(void) -{ +VG_STATIC void skateshop_render_boardshop(void){ world_instance *world = world_current_instance(); ent_skateshop *shop = global_skateshop.ptr_ent; @@ -435,7 +433,7 @@ VG_STATIC void skateshop_render_boardshop(void) struct board_pose pose = {0}; m4x3f mmdl; mdl_transform_m4x3( &xform, mmdl ); - render_board( &main_camera, world, board, mmdl, + render_board( &skaterift.cam, world, board, mmdl, &pose, k_board_shader_entity ); fade_out:; @@ -460,7 +458,7 @@ fade_out:; float scale = 0.2f, thickness = 0.03f; - font3d_bind( &gui.font, &main_camera ); + font3d_bind( &gui.font, &skaterift.cam ); shader_model_font_uColour( (v4f){1.0f,1.0f,1.0f,1.0f} ); /* Selection counter @@ -481,11 +479,11 @@ fade_out:; i+=highscore_intl( buf+i, addon_count(k_addon_type_board), 3 ); buf[i++] = '\0'; - font3d_simple_draw( &gui.font, 0, buf, &main_camera, mmdl ); + font3d_simple_draw( &gui.font, 0, buf, &skaterift.cam, mmdl ); } else{ font3d_simple_draw( &gui.font, 0, - "Nothing installed", &main_camera, mmdl ); + "Nothing installed", &skaterift.cam, mmdl ); } u16 cache_id = skateshop_selected_cache_id(); @@ -532,7 +530,7 @@ fade_out:; mlocal[3][2] = 0.0f; m4x3_mul( mtext, mlocal, mmdl ); font3d_simple_draw( &gui.font, 0, global_skateshop.render.item_title, - &main_camera, mmdl ); + &skaterift.cam, mmdl ); /* Author name * ----------------------------------------------------------------- */ @@ -545,7 +543,7 @@ fade_out:; mlocal[3][2] = 0.0f; m4x3_mul( mtext, mlocal, mmdl ); font3d_simple_draw( &gui.font, 0, global_skateshop.render.item_desc, - &main_camera, mmdl ); + &skaterift.cam, mmdl ); SDL_AtomicUnlock( &addon_system.sl_cache_using_resources ); } @@ -622,7 +620,7 @@ VG_STATIC void skateshop_render_worldshop(void) m4x3f mtext,mlocal,mtextmdl; mdl_transform_m4x3( &mark_info->transform, mtext ); - font3d_bind( &gui.font, &main_camera ); + font3d_bind( &gui.font, &skaterift.cam ); shader_model_font_uColour( (v4f){1.0f,1.0f,1.0f,1.0f} ); float scale = 0.2f, thickness = 0.015f, scale1 = 0.08f; @@ -633,14 +631,14 @@ VG_STATIC void skateshop_render_worldshop(void) mlocal[3][1] = 0.1f; mlocal[3][2] = 0.0f; m4x3_mul( mtext, mlocal, mtextmdl ); - font3d_simple_draw( &gui.font, 0, buftext, &main_camera, mtextmdl ); + font3d_simple_draw( &gui.font, 0, buftext, &skaterift.cam, mtextmdl ); m3x3_setdiagonalv3( mlocal, (v3f){ scale1, scale1, thickness } ); mlocal[3][0] = -font3d_string_width( &gui.font, 0, bufsubtext ); mlocal[3][0] *= scale1*0.5f; mlocal[3][1] = -scale1*0.3f; m4x3_mul( mtext, mlocal, mtextmdl ); - font3d_simple_draw( &gui.font, 0, bufsubtext, &main_camera, mtextmdl ); + font3d_simple_draw( &gui.font, 0, bufsubtext, &skaterift.cam, mtextmdl ); /* pointcloud */ m4x3f mmdl; @@ -650,7 +648,7 @@ VG_STATIC void skateshop_render_worldshop(void) glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE); glDisable(GL_DEPTH_TEST); - pointcloud_render( world, &main_camera, mmdl ); + pointcloud_render( world, &skaterift.cam, mmdl ); glDisable(GL_BLEND); glEnable(GL_DEPTH_TEST); } @@ -658,9 +656,8 @@ VG_STATIC void skateshop_render_worldshop(void) /* * World: render event */ -VG_STATIC void skateshop_render(void) -{ - if( !global_skateshop.active ) return; +VG_STATIC void skateshop_render(void){ + if( skaterift.activity != k_skaterift_skateshop ) return; ent_skateshop *shop = global_skateshop.ptr_ent; @@ -687,19 +684,17 @@ VG_STATIC void ent_skateshop_call( world_instance *world, ent_call *call ) ent_skateshop *shop = mdl_arritm( &world->ent_skateshop, index ); vg_info( "skateshop_call\n" ); - if( menu.active ) return; + if( skaterift.activity != k_skaterift_default ) return; if( !vg_loader_availible() ) return; if( call->function == k_ent_function_trigger ){ - if( localplayer.subsystem != k_player_subsystem_walk ){ - return; - } + if( localplayer.subsystem != k_player_subsystem_walk ) return; vg_info( "Entering skateshop\n" ); localplayer.immobile = 1; menu.disable_open = 1; - global_skateshop.active = 1; + skaterift.activity = k_skaterift_skateshop; v3_zero( localplayer.rb.v ); v3_zero( localplayer.rb.w ); @@ -723,13 +718,12 @@ VG_STATIC void ent_skateshop_call( world_instance *world, ent_call *call ) /* * Entity logic: exit event */ -VG_STATIC void global_skateshop_exit(void) -{ +VG_STATIC void global_skateshop_exit(void){ vg_info( "exit skateshop\n" ); localplayer.immobile = 0; - global_skateshop.active = 0; + skaterift.activity = k_skaterift_default; menu.disable_open = 0; - srinput.ignore_input_frames = 2; + srinput.enabled = 0; } #endif /* ENT_SKATESHOP_C */ diff --git a/ent_skateshop.h b/ent_skateshop.h index 9f76251..1d0699a 100644 --- a/ent_skateshop.h +++ b/ent_skateshop.h @@ -13,8 +13,6 @@ struct{ v3f look_target; ent_skateshop *ptr_ent; - - int active; float factive; struct shop_view_slot{ @@ -36,6 +34,8 @@ struct{ u32 world_reg; } render; + + camera cam; } static global_skateshop={.render={.reg_id=0xffffffff,.world_reg=0xffffffff}}; diff --git a/input.h b/input.h index b4262bc..fe387cc 100644 --- a/input.h +++ b/input.h @@ -46,7 +46,7 @@ struct { float axis_states[ k_sraxis_max ][2]; v2f joystick_states[ k_srjoystick_max ][2]; u8 button_states[ k_srbind_max ][2]; - u32 ignore_input_frames; + u32 enabled; } static srinput; @@ -182,7 +182,7 @@ static const char *joystick_display_string( enum sr_joystick joystick, static int buttons_filter_fixed(void) { - if( srinput.ignore_input_frames ) return 1; + if( !srinput.enabled ) return 1; if( vg_ui.wants_mouse ) return 1; if( vg.engine_stage == k_engine_stage_update_fixed ) @@ -244,9 +244,6 @@ static void setbtn( enum sr_bind button, u8 value ) static void skaterift_preupdate_inputs(void) { - if( srinput.ignore_input_frames ) - srinput.ignore_input_frames --; - for( u32 i=0; icam.angles ) ); player__debugtext( 1, "basis: " PRINTF_v4f( player->qbasis ) ); diff --git a/player.h b/player.h index ecf595d..6315e1a 100644 --- a/player.h +++ b/player.h @@ -61,11 +61,6 @@ struct player_instance{ */ camera cam; struct player_cam_controller cam_control; - - v3f cam_override_pos; - v3f cam_override_angles; - float cam_override_fov; - float cam_override_strength; f32 cam_trackshake; float cam_velocity_influence, @@ -96,12 +91,6 @@ struct player_instance{ struct board_pose board_pose; - /* - * Replay - * ------------------------------------------------- - */ - replay_buffer replay; - /* * Subsystems * ------------------------------------------------- diff --git a/player_common.c b/player_common.c index 2ebec6c..8314048 100644 --- a/player_common.c +++ b/player_common.c @@ -232,19 +232,6 @@ VG_STATIC void player__cam_iterate( player_instance *player ){ player->cam_land_punch_v ); v3_add( player->cam_land_punch, player->cam.pos, player->cam.pos ); - /* override camera */ - player->cam.angles[0] = - vg_alerpf( player->cam.angles[0], player->cam_override_angles[0], - player->cam_override_strength ); - player->cam.angles[1] = - vg_lerpf ( player->cam.angles[1], player->cam_override_angles[1], - player->cam_override_strength ); - v3_lerp( player->cam.pos, player->cam_override_pos, - player->cam_override_strength, player->cam.pos ); - player->cam.fov = vg_lerpf( player->cam.fov, player->cam_override_fov, - player->cam_override_strength ); - - if( k_cinema >= 0.0001f ){ ent_camera *cam = NULL; f32 min_dist = k_cinema; diff --git a/player_render.c b/player_render.c index 49a67c1..3fe9336 100644 --- a/player_render.c +++ b/player_render.c @@ -175,20 +175,16 @@ VG_STATIC void player_animate( player_instance *player ){ _player_post_animate[ player->subsystem ]( player ); } -VG_STATIC void player_animate_from_replay( player_instance *player ){ +VG_STATIC void player_animate_from_replay( player_instance *player, + replay_buffer *replay ){ /* TODO: frame blending */ - player_animation res; - replay_frame *frame = player->replay.cursor_frame; + replay_frame *frame = replay->cursor_frame; if( frame ){ memcpy( &res, &frame->anim, sizeof(frame->anim) ); memcpy( &frame->board_pose, &player->board_pose, sizeof(player->board_pose) ); - v3_copy( frame->cam_pos, player->cam_override_pos ); - v3_copy( frame->cam_angles, player->cam_override_angles ); - player->cam_override_fov = frame->cam_fov; - player->cam_override_strength = 1.0f; } else return; @@ -196,10 +192,9 @@ VG_STATIC void player_animate_from_replay( player_instance *player ){ skeleton_apply_pose( sk, res.pose, k_anim_apply_absolute ); } -VG_STATIC void player_record_replay( player_instance *player, int force ){ - /* replay recorder */ - replay_buffer *replay = &player->replay; - +VG_STATIC +void player_record_replay_frame( player_instance *player, + replay_buffer *replay, int force_gamestate ){ f64 delta = 9999999.9, statedelta = 9999999.9; @@ -213,7 +208,7 @@ VG_STATIC void player_record_replay( player_instance *player, int force ){ k_gamestate_rate = 0.5; u16 gamestates = 0; - if( statedelta > k_gamestate_rate || force /* or switching */ ){ + if( statedelta > k_gamestate_rate || force_gamestate /* or switching */ ){ gamestates = 1; } @@ -259,27 +254,7 @@ VG_STATIC void player_record_replay( player_instance *player, int force ){ } VG_STATIC void player__pre_render( player_instance *player ){ - if( player->replay.control == k_replay_control_none ){ - player->cam_override_strength = 0.0f; - player_animate( player ); - - if( button_down( k_srbind_reset ) && !player->immobile ){ - audio_lock(); - audio_oneshot( &audio_rewind[4], 1.0f, 0.0f ); - audio_unlock(); - - player_record_replay( player, 1 ); - player->replay.control = k_replay_control_scrub; - } - else - player_record_replay( player, 0 ); - } - else { - player->cam_override_strength = 1.0f-skaterift.time_rate; - player_replay_control_update( player ); - player_animate_from_replay( player ); - } - + player_animate( player ); player__cam_iterate( player ); /* shadowing/ao info */ @@ -324,7 +299,7 @@ VG_STATIC void render_board( camera *cam, world_instance *world, render_fb_inverse_ratio( gpipeline.fb_main, inverse ); - inverse[2] = main_camera.farz-main_camera.nearz; + inverse[2] = skaterift.cam.farz-skaterift.cam.nearz; shader_model_board_view_uInverseRatioDepth( inverse ); render_fb_inverse_ratio( NULL, inverse ); @@ -449,7 +424,7 @@ VG_STATIC void render_playermodel( camera *cam, world_instance *world, render_fb_bind_texture( gpipeline.fb_main, 2, 1 ); v3f inverse; render_fb_inverse_ratio( gpipeline.fb_main, inverse ); - inverse[2] = main_camera.farz-main_camera.nearz; + inverse[2] = skaterift.cam.farz-skaterift.cam.nearz; shader_model_character_view_uInverseRatioDepth( inverse ); render_fb_inverse_ratio( NULL, inverse ); diff --git a/player_replay.c b/player_replay.c index 5f57d9f..38c2192 100644 --- a/player_replay.c +++ b/player_replay.c @@ -12,12 +12,6 @@ VG_STATIC void replay_clear( replay_buffer *replay ){ replay->control = k_replay_control_none; } -VG_STATIC void local_replay_init( u32 bytes ){ - localplayer.replay.data = vg_linear_alloc( vg_mem.rtmemory, bytes ); - localplayer.replay.size = bytes; - replay_clear( &localplayer.replay ); -} - replay_gamestate *replay_frame_gamestate( replay_frame *frame, u16 index ){ void *baseptr = frame; @@ -162,6 +156,7 @@ VG_STATIC replay_frame *replay_find_recent_stateframe( replay_buffer *replay ){ } VG_STATIC void player_replay_control_update( player_instance *player ){ +#if 0 f64 speed = 1.0; f64 target = player->replay.cursor; @@ -220,9 +215,11 @@ VG_STATIC void player_replay_control_update( player_instance *player ){ return; } } +#endif } VG_STATIC void replay_debug_info( player_instance *player ){ +#if 0 player__debugtext( 2, "replay info" ); replay_buffer *replay = &player->replay; @@ -250,9 +247,11 @@ VG_STATIC void replay_debug_info( player_instance *player ){ len = end - start; player__debugtext( 1, "cursor: %.2fs / %.2fs\n", cur, len ); +#endif } VG_STATIC void replay_imgui( player_instance *player ){ +#if 0 if( player->replay.control == k_replay_control_none ) return; replay_buffer *replay = &player->replay; @@ -310,6 +309,7 @@ VG_STATIC void replay_imgui( player_instance *player ){ snprintf( buffer, 128, "-%.2fs\n", len ); ui_text( bar, buffer, 1, k_ui_align_middle_left, 0 ); ui_text( bar, "0s", 1, k_ui_align_middle_right, 0 ); +#endif } #endif /* PLAYER_REPLAY_C */ diff --git a/skaterift.c b/skaterift.c index 5d86c94..8df2f8a 100644 --- a/skaterift.c +++ b/skaterift.c @@ -50,20 +50,16 @@ static struct player_avatar localplayer_avatar; -int main( int argc, char *argv[] ) -{ +int main( int argc, char *argv[] ){ vg_mem.use_libc_malloc = 0; vg_set_mem_quota( 160*1024*1024 ); vg_enter( argc, argv, "Voyager Game Engine" ); return 0; } -VG_STATIC void vg_launch_opt(void) -{ -} +VG_STATIC void vg_launch_opt(void){} -VG_STATIC void vg_preload(void) -{ +VG_STATIC void vg_preload(void){ skaterift_read_savedata(); vg_info(" Copyright . . . -----, ,----- ,---. .---. \n" ); @@ -79,8 +75,7 @@ vg_info(" ' ' '--' [] '----- '----- ' ' '---' " vg_loader_step( network_init, network_end ); } -VG_STATIC void load_playermodels(void) -{ +VG_STATIC void load_playermodels(void){ /* FIXME: hack */ shader_model_character_view_register(); shader_model_board_view_register(); @@ -151,8 +146,7 @@ static void skaterift_restore_state(void){ } } -VG_STATIC void vg_load(void) -{ +VG_STATIC void vg_load(void){ vg_console_reg_cmd( "changeworld", skaterift_change_world_command, NULL ); vg_loader_step( render_init, NULL ); @@ -175,7 +169,11 @@ VG_STATIC void vg_load(void) vg_loader_step( load_playermodels, NULL ); /* player setup */ - local_replay_init( (1024*1024*1)/2 ); + u32 bytes = (1024*1024*1)/2; + skaterift.replay.data = vg_linear_alloc( vg_mem.rtmemory, bytes ); + skaterift.replay.size = bytes; + replay_clear( &skaterift.replay ); + player__create( &localplayer ); player_avatar_load( &localplayer_avatar, "models/ch_none.mdl" ); player__use_avatar( &localplayer, &localplayer_avatar ); @@ -256,37 +254,51 @@ VG_STATIC void vg_load(void) vg_async_call( async_call_ready, NULL, 0 ); } -VG_STATIC void draw_origin_axis(void) -{ +VG_STATIC void draw_origin_axis(void){ vg_line( (v3f){ 0.0f, 0.0f, 0.0f }, (v3f){ 1.0f, 0.0f, 0.0f }, 0xffff0000 ); vg_line( (v3f){ 0.0f, 0.0f, 0.0f }, (v3f){ 0.0f, 1.0f, 0.0f }, 0xff00ff00 ); vg_line( (v3f){ 0.0f, 0.0f, 0.0f }, (v3f){ 0.0f, 0.0f, 1.0f }, 0xff0000ff ); } - static void skaterift_change_world_preupdate(void); -VG_STATIC void vg_update(void) -{ + +/* + * UPDATE LOOP + * ---------------------------------------------------------------------------*/ + +VG_STATIC void vg_pre_update(void){ + srinput.enabled = 1; + steam_update(); skaterift_preupdate_inputs(); if( skaterift.op == k_async_op_clientloading ) return; - - if( world_loader.state == k_world_loader_preload ){ + if( world_loader.state == k_world_loader_preload ) skaterift_change_world_preupdate(); - } draw_origin_axis(); network_update(); + + /* time rate */ + f32 target = 1; + if( skaterift.activity & (k_skaterift_replay|k_skaterift_menu) ) + target = 0; + + vg_slewf( &skaterift.time_rate, target, vg.time_frame_delta * 6.0f ); + vg.time_rate = vg_smoothstepf( skaterift.time_rate ); + + if( button_down( k_srbind_reset ) ){ + if( skaterift.activity == k_skaterift_default ){ + skaterift.activity = k_skaterift_replay; + } + } player__pre_update( &localplayer ); global_skateshop_preupdate(); world_update( world_current_instance(), localplayer.rb.co ); audio_ambient_sprites_update( world_current_instance(), localplayer.rb.co ); - //gui_helper_action( localplayer.input_use, "\x7f Hello \x1f""A \x1e\x84" ); } -VG_STATIC void vg_update_fixed(void) -{ +VG_STATIC void vg_fixed_update(void){ if( skaterift.op == k_async_op_clientloading ) return; world_routes_fixedupdate( world_current_instance() ); @@ -294,7 +306,7 @@ VG_STATIC void vg_update_fixed(void) vehicle_update_fixed(); } -VG_STATIC void vg_update_post(void){ +VG_STATIC void vg_post_update(void){ if( skaterift.op == k_async_op_clientloading ) return; player__post_update( &localplayer ); @@ -307,9 +319,9 @@ VG_STATIC void vg_update_post(void){ vg_dsp.echo_distances[sample_index] = dist; v3f ears = { 1.0f,0.0f,0.0f }; - m3x3_mulv( main_camera.transform, ears, ears ); + m3x3_mulv( skaterift.cam.transform, ears, ears ); v3_copy( ears, vg_audio.external_listener_ears ); - v3_copy( main_camera.transform[3], vg_audio.external_listener_pos ); + v3_copy( skaterift.cam.transform[3], vg_audio.external_listener_pos ); if( localplayer.gate_waiting ){ m4x3_mulv( localplayer.gate_waiting->transport, @@ -320,22 +332,18 @@ VG_STATIC void vg_update_post(void){ v3_copy( localplayer.rb.v, vg_audio.external_lister_velocity ); audio_unlock(); - int replay_open = localplayer.replay.control != k_replay_control_none?1:0; - - f32 target = (1-(menu.active||replay_open)); - vg_slewf( &skaterift.time_rate, target, vg.time_frame_delta * 6.0f ); - - vg.time_rate = skaterift.time_rate; vehicle_update_post(); } -VG_STATIC void vg_framebuffer_resize( int w, int h ) -{ +/* + * RENDERING + * ---------------------------------------------------------------------------*/ + +VG_STATIC void vg_framebuffer_resize( int w, int h ){ render_fb_resize(); } -VG_STATIC void present_view_with_post_processing(void) -{ +VG_STATIC void present_view_with_post_processing(void){ glBindFramebuffer( GL_FRAMEBUFFER, 0 ); glViewport( 0,0, vg.window_x, vg.window_y ); @@ -356,7 +364,7 @@ VG_STATIC void present_view_with_post_processing(void) shader_blitblur_uInverseRatio( inverse ); v2f override; - if( menu.active ) + if( skaterift.activity == k_skaterift_menu ) v2_muls( (v2f){ 0.04f, 0.001f }, 1.0f-skaterift.time_rate, override ); else v2_zero( override ); @@ -375,14 +383,13 @@ VG_STATIC void present_view_with_post_processing(void) render_fsquad(); } -VG_STATIC void render_player_transparent(void) -{ +VG_STATIC void render_player_transparent(void){ static camera small_cam; /* DOES NOT NEED TO BE STATIC BUT MINGW SAIS OTHERWISE */ - m4x3_copy( main_camera.transform, small_cam.transform ); + m4x3_copy( skaterift.cam.transform, small_cam.transform ); - small_cam.fov = main_camera.fov; + small_cam.fov = skaterift.cam.fov; small_cam.nearz = 0.05f; small_cam.farz = 60.0f; @@ -396,8 +403,7 @@ VG_STATIC void render_player_transparent(void) player__render( &small_cam, &localplayer ); } -VG_STATIC void render_scene(void) -{ +VG_STATIC void render_scene(void){ render_fb_bind( gpipeline.fb_main, 1 ); glClearColor( 0.0f, 0.0f, 0.0f, 1.0f ); glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT ); @@ -419,50 +425,49 @@ VG_STATIC void render_scene(void) } } - render_world( view_world, &main_camera, 0 ); + render_world( view_world, &skaterift.cam, 0 ); - render_water_texture( view_world, &main_camera, 0 ); + render_water_texture( view_world, &skaterift.cam, 0 ); render_fb_bind( gpipeline.fb_main, 1 ); - render_water_surface( view_world, &main_camera ); + render_water_surface( view_world, &skaterift.cam ); } -VG_STATIC void render_scene_gate_subview(void) -{ +VG_STATIC void render_scene_gate_subview(void){ render_fb_bind( gpipeline.fb_main, 1 ); world_instance *view_world = localplayer.viewable_world; if( !view_world ) return; /* ??? */ int depth = 1; if( localplayer.gate_waiting ) depth = 0; - render_world_gates( view_world, &main_camera, depth ); + render_world_gates( view_world, &skaterift.cam, depth ); } -VG_STATIC void render_main_game(void) -{ - player__pre_render( &localplayer ); - main_camera.fov = localplayer.cam.fov; - v3_copy( localplayer.cam.pos, main_camera.pos ); - v3_copy( localplayer.cam.angles, main_camera.angles ); +VG_STATIC void skaterift_composite_maincamera(void){ + camera_lerp( &localplayer.cam, &global_skateshop.cam, + vg_smoothstepf(global_skateshop.factive), &skaterift.cam ); - main_camera.nearz = 0.1f; - main_camera.farz = 2100.0f; + skaterift.cam.nearz = 0.1f; + skaterift.cam.farz = 2100.0f; - camera_update_transform( &main_camera ); + camera_update_transform( &skaterift.cam ); if( localplayer.gate_waiting ){ - m3x3_mul( localplayer.basis_gate, main_camera.transform, - main_camera.transform ); + m3x3_mul( localplayer.basis_gate, skaterift.cam.transform, + skaterift.cam.transform ); } else{ - m3x3_mul( localplayer.basis, main_camera.transform, - main_camera.transform ); + m3x3_mul( localplayer.basis, skaterift.cam.transform, + skaterift.cam.transform ); } - camera_update_view( &main_camera ); - camera_update_projection( &main_camera ); - camera_finalize( &main_camera ); + camera_update_view( &skaterift.cam ); + camera_update_projection( &skaterift.cam ); + camera_finalize( &skaterift.cam ); +} - /* ========== Begin Frame ========== */ +VG_STATIC void render_main_game(void){ + player__pre_render( &localplayer ); + skaterift_composite_maincamera(); render_scene(); @@ -472,11 +477,9 @@ VG_STATIC void render_main_game(void) render_scene_gate_subview(); present_view_with_post_processing(); - /* =========== End Frame =========== */ } -VG_STATIC void vg_render(void) -{ +VG_STATIC void vg_render(void){ if( skaterift.op == k_async_op_clientloading ){ _vg_loader_render(); return; @@ -492,8 +495,7 @@ VG_STATIC void vg_render(void) glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT ); render_main_game(); - - m4x4_copy( main_camera.mtx.pv, vg.pv ); + m4x4_copy( skaterift.cam.mtx.pv, vg.pv ); /* Other shite */ glDisable(GL_BLEND); @@ -503,12 +505,11 @@ VG_STATIC void vg_render(void) gui_draw(); } -VG_STATIC void vg_gui(void) -{ +VG_STATIC void vg_gui(void){ if( skaterift.op == k_async_op_clientloading ) return; menu_update(); - if( menu.active ){ + if( skaterift.activity == k_skaterift_menu ){ glClear( GL_DEPTH_BUFFER_BIT ); menu_render(); } diff --git a/skaterift.h b/skaterift.h index aee794e..e78df2f 100644 --- a/skaterift.h +++ b/skaterift.h @@ -26,6 +26,16 @@ struct{ op; f32 time_rate; + camera cam; + replay_buffer replay; + + enum skaterift_activity { + k_skaterift_default = 0x00, + k_skaterift_replay = 0x01, + k_skaterift_skateshop = 0x02, + k_skaterift_menu = 0x04 + } + activity; } static skaterift = { .op = k_async_op_clientloading, .time_rate = 1.0f }; diff --git a/vehicle.c b/vehicle.c index e988d61..a171a8d 100644 --- a/vehicle.c +++ b/vehicle.c @@ -3,11 +3,10 @@ #include "vehicle.h" -VG_STATIC int spawn_car( int argc, const char *argv[] ) -{ +VG_STATIC int spawn_car( int argc, const char *argv[] ){ v3f ra, rb, rx; - v3_copy( main_camera.pos, ra ); - v3_muladds( ra, main_camera.transform[2], -10.0f, rb ); + v3_copy( skaterift.cam.pos, ra ); + v3_muladds( ra, skaterift.cam.transform[2], -10.0f, rb ); float t; if( spherecast_world( world_current_instance(), ra, rb, diff --git a/workshop.c b/workshop.c index 30ddb56..1efc428 100644 --- a/workshop.c +++ b/workshop.c @@ -908,7 +908,7 @@ VG_STATIC void workshop_render_world_preview(void){ glEnable( GL_DEPTH_TEST ); glDisable( GL_BLEND ); - render_world( localplayer.viewable_world, &main_camera, 1 ); + render_world( localplayer.viewable_world, &skaterift.cam, 1 ); glBindFramebuffer( GL_FRAMEBUFFER, 0 ); glViewport( 0,0, vg.window_x, vg.window_y ); diff --git a/world_gate.c b/world_gate.c index 876007d..a61bc16 100644 --- a/world_gate.c +++ b/world_gate.c @@ -105,29 +105,29 @@ VG_STATIC int render_gate( world_instance *world_inside, } /* update gate camera */ - gate_camera.fov = cam->fov; - gate_camera.nearz = 0.1f; - gate_camera.farz = 2000.0f; + world_gates.cam.fov = cam->fov; + world_gates.cam.nearz = 0.1f; + world_gates.cam.farz = 2000.0f; - m4x3_mul( gate->transport, cam->transform, gate_camera.transform ); - camera_update_view( &gate_camera ); - camera_update_projection( &gate_camera ); + m4x3_mul( gate->transport, cam->transform, world_gates.cam.transform ); + camera_update_view( &world_gates.cam ); + camera_update_projection( &world_gates.cam ); /* Add special clipping plane to projection */ v4f surface; q_mulv( gate->q[1], (v3f){0.0f,0.0f,-1.0f}, surface ); surface[3] = v3_dot( surface, gate->co[1] ); - m4x3_mulp( gate_camera.transform_inverse, surface, surface ); + m4x3_mulp( world_gates.cam.transform_inverse, surface, surface ); surface[3] = -fabsf(surface[3]); if( dist < -0.5f ) - m4x4_clip_projection( gate_camera.mtx.p, surface ); + m4x4_clip_projection( world_gates.cam.mtx.p, surface ); /* Ready to draw with new camrea */ - camera_finalize( &gate_camera ); + camera_finalize( &world_gates.cam ); - vg_line_point( gate_camera.transform[3], 0.3f, 0xff00ff00 ); + vg_line_point( world_gates.cam.transform[3], 0.3f, 0xff00ff00 ); { shader_model_gate_use(); shader_model_gate_uPv( cam->mtx.pv ); @@ -152,17 +152,17 @@ VG_STATIC int render_gate( world_instance *world_inside, glStencilMask( 0x00 ); } - render_world( world_inside, &gate_camera, layer_depth ); + render_world( world_inside, &world_gates.cam, layer_depth ); { glDisable( GL_STENCIL_TEST ); - render_water_texture( world_inside, &gate_camera, layer_depth ); + render_water_texture( world_inside, &world_gates.cam, layer_depth ); render_fb_bind( gpipeline.fb_main, 1 ); glEnable( GL_STENCIL_TEST ); - render_water_surface( world_inside, &gate_camera ); + render_water_surface( world_inside, &world_gates.cam ); glStencilMask( 0xFF ); glStencilFunc( GL_ALWAYS, 1, 0xFF ); diff --git a/world_gate.h b/world_gate.h index 4defb75..b45c70d 100644 --- a/world_gate.h +++ b/world_gate.h @@ -5,12 +5,14 @@ #ifndef WORLD_GATE_H #define WORLD_GATE_H +#include "camera.h" #include "world.h" #include "shaders/model_gate.h" struct world_gates{ glmesh mesh; mdl_submesh sm_surface, sm_marker[4]; + camera cam; } static world_gates; -- 2.25.1