From: hgn Date: Thu, 13 Jun 2024 10:17:31 +0000 (+0100) Subject: seperate projects X-Git-Url: https://harrygodden.com/git/?a=commitdiff_plain;h=ea41214530c8f3517b59ccbf7fad9f3bb159684a;p=carveJwlIkooP6JGAAIwe30JlM.git seperate projects --- diff --git a/build.c b/build.c index f1bf42d..8a82f49 100644 --- a/build.c +++ b/build.c @@ -171,6 +171,9 @@ void build_game_bin( struct vg_project *proj, struct vg_compiler_env *env ) vg_strcat( &conf.link, "-lws2_32 " ); } + //vg_strcat( &conf.defines, "-DSKATERIFT " ); + vg_strcat( &conf.defines, "-DHGATE " ); + vg_make_app( proj, &(struct vg_engine_config ) { .fixed_update_hz = 60, @@ -181,7 +184,7 @@ void build_game_bin( struct vg_project *proj, struct vg_compiler_env *env ) .custom_game_settings = 0, .custom_shaders = 1 }, - env, &conf, "skaterift.c", "skaterift" ); + env, &conf, "client.c", "skaterift" ); vg_add_controller_database( proj ); } diff --git a/camera.h b/camera.h deleted file mode 100644 index 7aa1b14..0000000 --- a/camera.h +++ /dev/null @@ -1,96 +0,0 @@ -#pragma once -#if 0 - -typedef struct camera camera; -struct camera{ - /* Input */ - v3f angles; - v3f pos; - float fov, nearz, farz; - - /* Output */ - m4x3f transform, - transform_inverse; - - struct camera_mtx{ - m4x4f p, - v, - pv; - } - mtx, - mtx_prev; -}; - -static void camera_lerp_angles( v3f a, v3f b, float t, v3f d ){ - d[0] = vg_alerpf( a[0], b[0], t ); - d[1] = vg_lerpf( a[1], b[1], t ); - d[2] = vg_lerpf( a[2], b[2], t ); -} - -/* lerp position, fov, and angles */ -static void camera_lerp( camera *a, camera *b, float t, camera *d ){ - v3_lerp( a->pos, b->pos, t, d->pos ); - camera_lerp_angles( a->angles, b->angles, t, d->angles ); - d->fov = vg_lerpf( a->fov, b->fov, t ); -} - -static void camera_copy( camera *a, camera *d ){ - v3_copy( a->pos, d->pos ); - v3_copy( a->angles, d->angles ); - d->fov = a->fov; -} - -static void m4x3_transform_camera( m4x3f m, camera *cam ){ - m4x3_mulv( m, cam->pos, cam->pos ); - - v3f v0; - v3_angles_vector( cam->angles, v0 ); - m3x3_mulv( m, v0, v0 ); - v3_normalize( v0 ); - v3_angles( v0, cam->angles ); -} - -/* - * 1) [angles, pos] -> transform - */ -static void camera_update_transform( camera *cam ) -{ - v4f qyaw, qpitch, qcam; - q_axis_angle( qyaw, (v3f){ 0.0f, 1.0f, 0.0f }, -cam->angles[0] ); - q_axis_angle( qpitch, (v3f){ 1.0f, 0.0f, 0.0f }, -cam->angles[1] ); - - q_mul( qyaw, qpitch, qcam ); - q_m3x3( qcam, cam->transform ); - v3_copy( cam->pos, cam->transform[3] ); -} - -/* - * 2) [transform] -> transform_inverse, view matrix - */ -static void camera_update_view( camera *cam ) -{ - m4x4_copy( cam->mtx.v, cam->mtx_prev.v ); - m4x3_invert_affine( cam->transform, cam->transform_inverse ); - m4x3_expand( cam->transform_inverse, cam->mtx.v ); -} - -/* - * 3) [fov,nearz,farz] -> projection matrix - */ -static void camera_update_projection( camera *cam ) -{ - m4x4_copy( cam->mtx.p, cam->mtx_prev.p ); - m4x4_projection( cam->mtx.p, cam->fov, - (float)vg.window_x / (float)vg.window_y, - cam->nearz, cam->farz ); -} - -/* - * 4) [projection matrix, view matrix] -> previous pv, new pv - */ -static void camera_finalize( camera *cam ) -{ - m4x4_copy( cam->mtx.pv, cam->mtx_prev.pv ); - m4x4_mul( cam->mtx.p, cam->mtx.v, cam->mtx.pv ); -} -#endif diff --git a/client.c b/client.c new file mode 100644 index 0000000..2005855 --- /dev/null +++ b/client.c @@ -0,0 +1,92 @@ +#include "vg/vg_opt.h" +#include "vg/vg_loader.h" +#include "vg/vg_io.h" +#include "vg/vg_audio.h" +#include "vg/vg_async.h" + +#include "client.h" +#include "render.h" +#include "network.h" +#include "player_remote.h" +#include "menu.h" + +struct game_client g_client = +{ + .demo_mode = 1 +}; + +static void async_client_ready( void *payload, u32 size ) +{ + g_client.loaded = 1; + + if( network_client.auto_connect ) + network_client.user_intent = k_server_intent_online; + + menu_at_begin(); +} + +void vg_load(void) +{ + vg_audio.always_keep_compressed = 1; + vg_loader_step( render_init, NULL ); + + game_load(); + + vg_async_call( async_client_ready, NULL, 0 ); +} + +void vg_preload(void) +{ +vg_info(" Copyright . . . -----, ,----- ,---. .---. \n" ); +vg_info(" 2021-2024 |\\ /| | / | | | | /| \n" ); +vg_info(" | \\ / | +-- / +----- +---' | / | \n" ); +vg_info(" | \\ / | | / | | \\ | / | \n" ); +vg_info(" | \\/ | | / | | \\ | / | \n" ); +vg_info(" ' ' '--' [] '----- '----- ' ' '---' " + "SOFTWARE\n" ); + + /* please forgive me! */ + u32 sz; char *drm; + if( (drm = vg_file_read_text( vg_mem.scratch, "DRM", &sz )) ) + if( !strcmp(drm, "blibby!") ) + g_client.demo_mode = 0; + + vg_loader_step( remote_players_init, NULL ); + + steam_init(); + vg_loader_step( NULL, steam_end ); + vg_loader_step( network_init, network_end ); +} + +void vg_launch_opt(void) +{ + const char *arg; + + if( vg_long_opt( "noauth" ) ) + network_client.auth_mode = eServerModeNoAuthentication; + + if( (arg = vg_long_opt_arg( "server" )) ) + network_set_host( arg, NULL ); + + if( vg_long_opt( "demo" ) ) + g_client.demo_mode = 1; + + game_launch_opt(); +} + +int main( int argc, char *argv[] ) +{ + network_set_host( "skaterift.com", NULL ); + vg_mem.use_libc_malloc = 0; + vg_set_mem_quota( 160*1024*1024 ); + vg_enter( argc, argv, "Voyager Game Engine" ); + return 0; +} + +#ifdef SKATERIFT +#include "skaterift.c" +#endif + +#ifdef HGATE +#include "hgate.c" +#endif diff --git a/client.h b/client.h new file mode 100644 index 0000000..22022aa --- /dev/null +++ b/client.h @@ -0,0 +1,17 @@ +#include "vg/vg_platform.h" + +/* + * client - entry point. window, common things like render init.. etc + * vg - backend code + * game - top layer: game content, state + */ + +struct game_client +{ + bool loaded, demo_mode; +} +extern g_client; + +/* game defined */ +void game_launch_opt( void ); +void game_load( void ); diff --git a/entity.h b/entity.h index e1e52da..6d503f9 100644 --- a/entity.h +++ b/entity.h @@ -38,25 +38,6 @@ typedef struct ent_list ent_list; typedef struct ent_glider ent_glider; typedef struct ent_npc ent_npc; -typedef struct ent_call ent_call; -struct ent_call{ - u32 id; - i32 function; - void *data; -}; - -typedef enum entity_call_result entity_call_result; -enum entity_call_result -{ - k_entity_call_result_OK, - k_entity_call_result_unhandled, - k_entity_call_result_invalid -}; - -typedef enum entity_call_result - (*fn_entity_call_handler)( world_instance *, ent_call *); - - enum entity_alias{ k_ent_none = 0, k_ent_gate = 1, @@ -88,6 +69,15 @@ enum entity_alias{ k_ent_npc = 27 }; +typedef struct ent_call ent_call; +typedef enum entity_call_result entity_call_result; +enum entity_call_result +{ + k_entity_call_result_OK, + k_entity_call_result_unhandled, + k_entity_call_result_invalid +}; + static inline u32 mdl_entity_id_type( u32 entity_id ) { return (entity_id & 0x0fff0000) >> 16; @@ -579,4 +569,14 @@ struct ent_npc }; #include "world.h" + +struct ent_call{ + u32 id; + i32 function; + void *data; +}; + +typedef enum entity_call_result + (*fn_entity_call_handler)( world_instance *, ent_call *); + void entity_call( world_instance *world, ent_call *call ); diff --git a/hgate.c b/hgate.c new file mode 100644 index 0000000..9c02564 --- /dev/null +++ b/hgate.c @@ -0,0 +1,678 @@ +/* + * ============================================================================= + * + * Copyright . . . -----, ,----- ,---. .---. + * 2021-2024 |\ /| | / | | | | /| + * | \ / | +-- / +----- +---' | / | + * | \ / | | / | | \ | / | + * | \/ | | / | | \ | / | + * ' ' '--' [] '----- '----- ' ' '---' SOFTWARE + * + * ============================================================================= + */ + +#define SR_ALLOW_REWIND_HUB + +#ifdef _WIN32 + #include +#endif + +/* + * system headers + * --------------------- */ + +#include "vg/vg_opt.h" +#include "vg/vg_loader.h" +#include "vg/vg_io.h" + +#include "skaterift.h" +#include "steam.h" +#include "render.h" +#include "world.h" +#include "font.h" +#include "player.h" +#include "network.h" +#include "menu.h" +#include "vehicle.h" +#include "save.h" +#include "player_remote.h" +#include "particle.h" +#include "trail.h" +#include "freecam.h" +#include "ent_tornado.h" +#include "ent_miniworld.h" +#include "ent_skateshop.h" +#include "ent_npc.h" +#include "ent_camera.h" +#include "world_map.h" +#include "gui.h" +#include "workshop.h" +#include "audio.h" +#include "player_render.h" +#include "control_overlay.h" + +struct skaterift_globals skaterift = +{ + .time_rate = 1.0f, + .hub_world = "maps/dev_hub", +}; + +void game_launch_opt(void) +{ + const char *arg; + if( (arg = vg_long_opt_arg( "world" )) ) + skaterift.hub_world = arg; +} + +static void async_skaterift_player_start( void *payload, u32 size ){ + world_switch_instance(0); +} + +static void skaterift_restore_state(void) +{ + savedata_file sav; + skaterift_read_main_savedata( &sav ); + + vg_msg kvsav; + vg_msg_init( &kvsav, sav.buf, sizeof(sav.buf) ); + + u32 ach; + vg_msg_getkvintg( &kvsav, "ach", k_vg_msg_u32, &ach, NULL ); + skaterift.achievements |= ach; + + u32 board_reg_id = time(NULL) % addon_count( k_addon_type_board, 0 ), + player_reg_id = (time(NULL)+44) % addon_count( k_addon_type_player, 0 ); + + vg_msg_cursor orig = kvsav.cur; + if( vg_msg_seekframe( &kvsav, "player" ) ){ + addon_alias q; + + /* board */ + skaterift_read_addon_alias( &kvsav, "board", k_addon_type_board, &q ); + u32 reg_id = addon_match( &q ); + if( reg_id != 0xffffffff ) + board_reg_id = reg_id; + + /* playermodel */ + skaterift_read_addon_alias( &kvsav, "playermodel", + k_addon_type_player, &q ); + reg_id = addon_match( &q ); + if( reg_id != 0xffffffff ) + player_reg_id = reg_id; + } + + localplayer.board_view_slot = + addon_cache_create_viewer( k_addon_type_board, board_reg_id ); + localplayer.playermodel_view_slot = + addon_cache_create_viewer( k_addon_type_player, player_reg_id ); + + kvsav.cur = orig; +} + +static addon_reg *skaterift_mount_world_unloadable( const char *path, u32 ext ){ + addon_reg *reg = addon_mount_local_addon( path, k_addon_type_world, ".mdl" ); + if( !reg ) vg_fatal_error( "world not found\n" ); + reg->flags |= (ADDON_REG_HIDDEN | ext); + return reg; +} + +static void skaterift_load_world_content(void){ + /* hub world */ + addon_reg *hub = skaterift_mount_world_unloadable( skaterift.hub_world, 0 ); + skaterift_mount_world_unloadable( "maps/mp_spawn", + ADDON_REG_CITY|ADDON_REG_PREMIUM ); + skaterift_mount_world_unloadable( "maps/mp_mtzero", + ADDON_REG_MTZERO|ADDON_REG_PREMIUM ); + skaterift_mount_world_unloadable( "maps/dev_tutorial", 0 ); + skaterift_mount_world_unloadable( "maps/dev_flatworld", 0 ); + skaterift_mount_world_unloadable( "maps/mp_line1", ADDON_REG_PREMIUM ); + + world_static.load_state = k_world_loader_load; + + struct world_load_args args = { + .purpose = k_world_purpose_hub, + .reg = hub + }; + skaterift_world_load_thread( &args ); +} + +static void skaterift_load_player_content(void) +{ + particle_alloc( &particles_grind, 300 ); + particle_alloc( &particles_env, 200 ); + + player_load_animation_reference( "models/ch_none.mdl" ); + player_model_load( &localplayer.fallback_model, "models/ch_none.mdl" ); + player__bind(); + player_board_load( &localplayer.fallback_board, "models/board_none.mdl" ); +} + +void game_load(void) +{ + vg_console_reg_cmd( "load_world", skaterift_load_world_command, NULL ); + vg_console_reg_var( "immobile", &localplayer.immobile, k_var_dtype_i32, 0 ); + vg_loader_step( menu_init, NULL ); + + vg_loader_step( control_overlay_init, NULL ); + vg_loader_step( world_init, NULL ); + vg_loader_step( vehicle_init, NULL ); + vg_loader_step( gui_init, NULL ); + + vg_loader_step( player_init, NULL ); + vg_loader_step( player_ragdoll_init, NULL ); + vg_loader_step( npc_init, NULL ); + + /* content stuff */ + vg_loader_step( addon_system_init, NULL ); + vg_loader_step( workshop_init, NULL ); + vg_loader_step( skateshop_init, NULL ); + vg_loader_step( ent_tornado_init, NULL ); + vg_loader_step( skaterift_replay_init, NULL ); + vg_loader_step( skaterift_load_player_content, NULL ); + + vg_bake_shaders(); + vg_loader_step( audio_init, NULL ); + + vg_loader_step( skaterift_load_world_content, NULL ); + vg_async_call( async_skaterift_player_start, NULL, 0 ); + vg_async_stall(); + + vg_console_load_autos(); + + addon_mount_content_folder( k_addon_type_player, + "playermodels", ".mdl" ); + addon_mount_content_folder( k_addon_type_board, "boards", ".mdl" ); + addon_mount_content_folder( k_addon_type_world, "maps", ".mdl" ); + addon_mount_workshop_items(); + vg_async_call( async_addon_reg_update, NULL, 0 ); + vg_async_stall(); + + skaterift_restore_state(); + update_ach_models(); + + vg_loader_step( NULL, skaterift_autosave_synchronous ); +} + +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 ); +} +void skaterift_change_client_world_preupdate(void); + +/* + * UPDATE LOOP + * ---------------------------------------------------------------------------*/ + +void vg_pre_update(void) +{ + skaterift_preupdate_inputs(); + + steam_update(); + skaterift_change_client_world_preupdate(); + + if( !g_client.loaded ) return; + + draw_origin_axis(); + addon_system_pre_update(); + skateshop_world_preview_preupdate(); + network_update(); + + /* time rate */ + f32 target = 1; + if( skaterift.activity & k_skaterift_replay ) + target = 0; + + v3f listen_co; + v3_copy( localplayer.rb.co, listen_co ); + + if( skaterift.activity & k_skaterift_menu ) + { + if( menu.bg_cam ) + { + v3_copy( menu.bg_cam->transform.co, listen_co ); + } + else target = 0; + } + + vg_slewf( &skaterift.time_rate, target, vg.time_frame_delta * (1.0f/0.3f) ); + vg.time_rate = vg_smoothstepf( skaterift.time_rate ); + + /* TODO: how can we compress this? */ + ent_miniworld_preupdate(); + world_entity_focus_preupdate(); + + if( skaterift.activity != k_skaterift_menu ) + { + player__pre_update(); + } + + skaterift_replay_pre_update(); + remote_sfx_pre_update(); + skateshop_world_preupdate( world_current_instance() ); + + world_update( world_current_instance(), localplayer.rb.co ); + audio_ambient_sprites_update( world_current_instance(), listen_co ); + world_map_pre_update(); +} + +void vg_fixed_update(void) +{ + if( !g_client.loaded ) return; + + world_routes_fixedupdate( world_current_instance() ); + player__update(); + vehicle_update_fixed(); +} + +void vg_post_update(void) +{ + if( !g_client.loaded ) return; + + player__post_update(); + + float dist; + int sample_index; + world_audio_sample_distances( localplayer.rb.co, &sample_index, &dist ); + + audio_lock(); + vg_dsp.echo_distances[sample_index] = dist; + + v3f ears = { 1.0f,0.0f,0.0f }; + m3x3_mulv( g_render.cam.transform, ears, ears ); + v3_copy( ears, vg_audio.external_listener_ears ); + v3_copy( g_render.cam.transform[3], vg_audio.external_listener_pos ); + + if( localplayer.gate_waiting ){ + m4x3_mulv( localplayer.gate_waiting->transport, + vg_audio.external_listener_pos, + vg_audio.external_listener_pos ); + } + + v3_copy( localplayer.rb.v, vg_audio.external_lister_velocity ); + audio_unlock(); + + vehicle_update_post(); + skaterift_autosave_update(); +} + +/* + * RENDERING + * ---------------------------------------------------------------------------*/ + +static void render_player_transparent(void) +{ + if( (skaterift.activity == k_skaterift_menu) && + (menu.page == k_menu_page_main) && + (menu.main_index == k_menu_main_guide) ) + { + return; + } + + static vg_camera small_cam; /* DOES NOT NEED TO BE STATIC BUT MINGW + SAIS OTHERWISE */ + + m4x3_copy( g_render.cam.transform, small_cam.transform ); + + small_cam.fov = g_render.cam.fov; + small_cam.nearz = 0.05f; + small_cam.farz = 60.0f; + + vg_camera_update_view( &small_cam ); + vg_camera_update_projection( &small_cam ); + vg_camera_finalize( &small_cam ); + + /* Draw player to window buffer and blend background ontop */ + player__render( &small_cam ); +} + +static world_instance *get_view_world(void) +{ + if( (skaterift.activity & k_skaterift_menu) && + (menu.page == k_menu_page_main) && + (menu.main_index == k_menu_main_guide) ) + { + return &world_static.instances[0]; + } + + world_instance *view_world = world_current_instance(); + if( localplayer.gate_waiting && + (localplayer.gate_waiting->flags & k_ent_gate_nonlocal) ){ + view_world = &world_static.instances[world_static.active_instance ^ 0x1]; + } + + return view_world; +} + +static void render_scene(void) +{ + /* Draw world */ + glEnable( GL_DEPTH_TEST ); + + for( u32 i=0; iub_lighting.g_daysky_colour, + world->ub_lighting.g_day_phase - + world->ub_lighting.g_sunset_phase*0.1f, bg ); + + v3_muladds( bg, world->ub_lighting.g_sunset_colour, + (1.0f-0.5f)*world->ub_lighting.g_sunset_phase, bg ); + + v3_muladds( bg, world->ub_lighting.g_nightsky_colour, + (1.0f-world->ub_lighting.g_day_phase), bg ); + + glClearColor( bg[0], bg[1], bg[2], 0.0f ); + glClear( GL_COLOR_BUFFER_BIT ); + glDrawBuffers( 2, (GLenum[]){ GL_COLOR_ATTACHMENT0, + GL_COLOR_ATTACHMENT1 } ); + + m4x3f identity; + m4x3_identity( identity ); + render_world_override( world, world, identity, &g_render.cam, + world_map.close_spawn, + (v4f){world->tar_min, world->tar_max, 1.0f, 0.0f}); + render_world_routes( world, world, identity, &g_render.cam, 0, 1 ); + return; + } + + world_instance *view_world = get_view_world(); + render_world( view_world, &g_render.cam, 0, 0, 1, 1 ); + + particle_system_update( &particles_grind, vg.time_delta ); + //particle_system_debug( &particles_grind ); + particle_system_prerender( &particles_grind ); + particle_system_render( &particles_grind, &g_render.cam ); + + ent_tornado_pre_update(); + particle_system_update( &particles_env, vg.time_delta ); + particle_system_prerender( &particles_env ); + particle_system_render( &particles_env, &g_render.cam ); + + player_glide_render_effects( &g_render.cam ); + + /* + * render transition + */ + if( global_miniworld.transition == 0 ) + return; + + world_instance *holdout_world = NULL; + f32 t = 0.0f; + + if( global_miniworld.transition == 1 ){ + holdout_world = &world_static.instances[ k_world_purpose_hub ]; + t = global_miniworld.t; + } + else{ + holdout_world = &world_static.instances[ k_world_purpose_client ]; + t = 1.0f-global_miniworld.t; + } + + if( holdout_world->status != k_world_status_loaded ) + return; + + t = vg_smoothstepf( t ); + + glEnable( GL_STENCIL_TEST ); + glDisable( GL_DEPTH_TEST ); + glStencilOp( GL_KEEP, GL_KEEP, GL_REPLACE ); + glStencilFunc( GL_ALWAYS, 1, 0xFF ); + glStencilMask( 0xFF ); + + shader_blit_transition_use(); + shader_blit_transition_uInverseRatio( (v2f){1.0f,1.0f} ); + shader_blit_transition_uT( -(sqrtf(2)+0.5f) * t ); + + render_fsquad(); + render_world( holdout_world, &global_miniworld.cam, 1, 0, 1, 1 ); +} + +static void skaterift_composite_maincamera(void) +{ + vg_camera_lerp( &localplayer.cam, &world_static.focus_cam, + vg_smoothstepf(world_static.focus_strength), &g_render.cam ); + + if( skaterift.activity == k_skaterift_replay ) + { + if( player_replay.use_freecam ) + { + freecam_preupdate(); + v3_copy( player_replay.replay_freecam.pos, g_render.cam.pos ); + v3_copy( player_replay.replay_freecam.angles, g_render.cam.angles ); + g_render.cam.fov = player_replay.replay_freecam.fov; + } + else + { + skaterift_get_replay_cam( &g_render.cam ); + } + } + + g_render.cam.nearz = 0.1f; + g_render.cam.farz = 2100.0f; + + if( (skaterift.activity == k_skaterift_menu) && menu.bg_cam ) + { + ent_camera_unpack( menu.bg_cam, &g_render.cam ); + } + + if( menu_viewing_map() ) + { + vg_camera_copy( &world_map.cam, &g_render.cam ); + g_render.cam.nearz = 4.0f; + g_render.cam.farz = 3100.0f; + } + + if( global_miniworld.transition ){ + f32 dt = vg.time_frame_delta / 2.0f, + s = vg_signf( global_miniworld.transition ); + global_miniworld.t += s * dt; + + if( (global_miniworld.t > 1.0f) || (global_miniworld.t < 0.0f) ){ + global_miniworld.t = vg_clampf( global_miniworld.t, 0.0f, 1.0f ); + global_miniworld.transition = 0; + } + } + + vg_camera_update_transform( &g_render.cam ); + vg_camera_update_view( &g_render.cam ); + vg_camera_update_projection( &g_render.cam ); + vg_camera_finalize( &g_render.cam ); +} + +static void render_main_game(void) +{ + if( skaterift.activity == k_skaterift_replay ) + { + player__animate_from_replay( &player_replay.local ); + } + else{ + player__animate(); + skaterift_record_frame( &player_replay.local, + localplayer.deferred_frame_record ); + localplayer.deferred_frame_record = 0; + } + animate_remote_players(); + player__pre_render(); + + skaterift_composite_maincamera(); + + /* --------------------------------------------------------------------- */ + if( !menu_viewing_map() ) + { + world_instance *world = world_current_instance(); + render_world_cubemaps( world ); + + ent_gate *nlg = world->rendering_gate; + if( nlg && (nlg->flags & k_ent_gate_nonlocal) ) + render_world_cubemaps( &world_static.instances[nlg->target] ); + } + + /* variable res target */ + vg_framebuffer_bind( g_render.fb_main, k_render_scale ); + glClearColor( 0.0f, 0.0f, 0.0f, 1.0f ); + glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT ); + + render_scene(); + glEnable( GL_DEPTH_TEST ); + + /* full res target */ + glBindFramebuffer( GL_FRAMEBUFFER, 0 ); + glViewport( 0,0, vg.window_x, vg.window_y ); + + render_player_transparent(); /* needs to read the depth buffer before we fuck + it up with the oblique rendering inside the + portals */ + + /* continue with variable rate */ + if( !global_miniworld.transition && !menu_viewing_map() ) + { + vg_framebuffer_bind( g_render.fb_main, k_render_scale ); + render_world_gates( get_view_world(), &g_render.cam ); + } + + /* composite */ + + if( (skaterift.activity == k_skaterift_menu) && menu.bg_blur ) + v2_muls( (v2f){ 0.04f, 0.001f }, 1.0f-skaterift.time_rate, + g_render.blur_override ); + else + v2_zero( g_render.blur_override ); + postprocess_to_screen( g_render.fb_main ); + + skaterift_replay_post_render(); + control_overlay_render(); +} + +void vg_render(void) +{ + if( !g_client.loaded ) + { + vg_loader_render(); + return; + } + + glBindFramebuffer( GL_FRAMEBUFFER, 0 ); + + glViewport( 0,0, vg.window_x, vg.window_y ); + glDisable( GL_DEPTH_TEST ); + glDisable( GL_BLEND ); + + glClearColor( 1.0f, 0.0f, 0.0f, 0.0f ); + glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT ); + + render_main_game(); + m4x4_copy( g_render.cam.mtx.pv, vg.pv ); + + /* Other shite */ + glDisable(GL_BLEND); + glDisable(GL_DEPTH_TEST); + vg_lines_drawall(); + glViewport( 0,0, vg.window_x, vg.window_y ); + + gui_render_icons(); +} + +void vg_gui( ui_context *ctx ) +{ + if( !g_client.loaded ) return; + + gui_draw( ctx ); + + if( k_light_editor ) + imgui_world_light_edit( ctx, world_current_instance() ); + + vg_ui.tex_bg = g_render.fb_main->attachments[0].id; + vg_framebuffer_inverse_ratio( g_render.fb_main, vg_ui.bg_inverse_ratio ); + + menu_gui( ctx ); + player__im_gui( ctx ); + world_instance *world = world_current_instance(); + + world_routes_imgui( ctx, world ); + skaterift_replay_imgui( ctx ); + workshop_form_gui( ctx ); + remote_player_network_imgui( ctx, vg.pv ); + + if( menu_viewing_map() ) + { + remote_players_imgui_world( ctx, world_current_instance(), + vg.pv, 2000.0f, 0 ); + remote_players_imgui_lobby( ctx ); + } + else + { + remote_players_chat_imgui( ctx ); /* TODO: conditional */ + remote_players_imgui_world( ctx, world_current_instance(), + vg.pv, 100.0f, 1 ); + } +} + +#include "addon.c" +#include "addon_types.c" +#include "audio.c" +#include "ent_challenge.c" +#include "ent_glider.c" +#include "entity.c" +#include "ent_miniworld.c" +#include "ent_objective.c" +#include "ent_region.c" +#include "ent_relay.c" +#include "ent_route.c" +#include "ent_skateshop.c" +#include "ent_tornado.c" +#include "ent_traffic.c" +#include "freecam.c" +#include "menu.c" +#include "network.c" +#include "particle.c" +#include "player_basic_info.c" +#include "player.c" +#include "player_common.c" +#include "player_dead.c" +#include "player_drive.c" +#include "player_effects.c" +#include "player_glide.c" +#include "player_ragdoll.c" +#include "player_remote.c" +#include "player_render.c" +#include "player_replay.c" +#include "player_skate.c" +#include "player_walk.c" +#include "render.c" +#include "save.c" +#include "scene.c" +#include "steam.c" +#include "trail.c" +#include "vehicle.c" +#include "workshop.c" +#include "world_audio.c" +#include "world.c" +#include "world_entity.c" +#include "world_gate.c" +#include "world_gen.c" +#include "world_load.c" +#include "world_map.c" +#include "world_physics.c" +#include "world_render.c" +#include "world_routes.c" +#include "world_routes_ui.c" +#include "world_sfd.c" +#include "world_volumes.c" +#include "world_water.c" +#include "ent_npc.c" +#include "model.c" +#include "control_overlay.c" +#include "ent_camera.c" diff --git a/network.h b/network.h index 4bd5a37..6af51af 100644 --- a/network.h +++ b/network.h @@ -1,11 +1,13 @@ /* - * Copyright (C) 2021-2022 Mt.ZERO Software, Harry Godden - All Rights Reserved + * Copyright (C) 2021-2024 Mt.ZERO Software, Harry Godden - All Rights Reserved * All trademarks are property of their respective owners */ #pragma once #include "vg/vg_platform.h" #include "vg/vg_steam_networking.h" +#include "vg/vg_mem_pool.h" +#include "vg/vg_msg.h" #include "steam.h" #include "network_common.h" #include "network_msg.h" diff --git a/player.c b/player.c index ff3e6dd..5a56169 100644 --- a/player.c +++ b/player.c @@ -1,6 +1,5 @@ #include "player.h" #include "addon.h" -#include "camera.h" #include "player_model.h" #include "input.h" #include "world.h" diff --git a/player_api.h b/player_api.h index 68f5aca..f7f4785 100644 --- a/player_api.h +++ b/player_api.h @@ -1,6 +1,5 @@ #pragma once #include "model.h" -#include "camera.h" typedef struct player_instance player_instance; typedef struct player_pose player_pose; diff --git a/render.h b/render.h index c5a0880..765f41b 100644 --- a/render.h +++ b/render.h @@ -4,9 +4,9 @@ #pragma once #include "common.h" #include "model.h" -#include "camera.h" #include "shader_props.h" #include "vg/vg_framebuffer.h" +#include "vg/vg_camera.h" #include "shaders/blit.h" #include "shaders/blitblur.h" diff --git a/skaterift.c b/skaterift.c index 87118fc..9c02564 100644 --- a/skaterift.c +++ b/skaterift.c @@ -21,18 +21,16 @@ * system headers * --------------------- */ -#include "skaterift.h" -#include "steam.h" -#include "render.h" #include "vg/vg_opt.h" #include "vg/vg_loader.h" #include "vg/vg_io.h" +#include "skaterift.h" +#include "steam.h" +#include "render.h" #include "world.h" - #include "font.h" #include "player.h" - #include "network.h" #include "menu.h" #include "vehicle.h" @@ -55,77 +53,21 @@ struct skaterift_globals skaterift = { - .op = k_async_op_clientloading, .time_rate = 1.0f, .demo_mode = 1, + .time_rate = 1.0f, .hub_world = "maps/dev_hub", }; -int main( int argc, char *argv[] ) -{ - network_set_host( "skaterift.com", NULL ); - vg_mem.use_libc_malloc = 0; - vg_set_mem_quota( 160*1024*1024 ); - vg_enter( argc, argv, "Voyager Game Engine" ); - return 0; -} - -void vg_launch_opt(void) +void game_launch_opt(void) { const char *arg; - if( vg_long_opt( "noauth" ) ){ - network_client.auth_mode = eServerModeNoAuthentication; - } - - if( (arg = vg_long_opt_arg( "server" )) ) - { - network_set_host( arg, NULL ); - } - - if( vg_long_opt( "demo" ) ){ - skaterift.demo_mode = 1; - } - - if( (arg = vg_long_opt_arg( "world" )) ){ + if( (arg = vg_long_opt_arg( "world" )) ) skaterift.hub_world = arg; - } -} - -void vg_preload(void) -{ -vg_info(" Copyright . . . -----, ,----- ,---. .---. \n" ); -vg_info(" 2021-2023 |\\ /| | / | | | | /| \n" ); -vg_info(" | \\ / | +-- / +----- +---' | / | \n" ); -vg_info(" | \\ / | | / | | \\ | / | \n" ); -vg_info(" | \\/ | | / | | \\ | / | \n" ); -vg_info(" ' ' '--' [] '----- '----- ' ' '---' " - "SOFTWARE\n" ); - - /* please forgive me! */ - u32 sz; char *drm; - if( (drm = vg_file_read_text( vg_mem.scratch, "DRM", &sz )) ) - if( !strcmp(drm, "blibby!") ) - skaterift.demo_mode = 0; - - vg_loader_step( remote_players_init, NULL ); - - steam_init(); - vg_loader_step( NULL, steam_end ); - vg_loader_step( network_init, network_end ); } static void async_skaterift_player_start( void *payload, u32 size ){ world_switch_instance(0); } -static void async_call_ready( void *payload, u32 size ) -{ - skaterift.op = k_async_op_none; - - if( network_client.auto_connect ) - network_client.user_intent = k_server_intent_online; - - menu_at_begin(); -} - static void skaterift_restore_state(void) { savedata_file sav; @@ -205,15 +147,12 @@ static void skaterift_load_player_content(void) player_board_load( &localplayer.fallback_board, "models/board_none.mdl" ); } -void vg_load(void) +void game_load(void) { - vg_audio.always_keep_compressed = 1; - vg_console_reg_cmd( "load_world", skaterift_load_world_command, NULL ); vg_console_reg_var( "immobile", &localplayer.immobile, k_var_dtype_i32, 0 ); - - vg_loader_step( render_init, NULL ); vg_loader_step( menu_init, NULL ); + vg_loader_step( control_overlay_init, NULL ); vg_loader_step( world_init, NULL ); vg_loader_step( vehicle_init, NULL ); @@ -231,18 +170,9 @@ void vg_load(void) vg_loader_step( skaterift_replay_init, NULL ); vg_loader_step( skaterift_load_player_content, NULL ); - /* --------------------- */ - vg_bake_shaders(); vg_loader_step( audio_init, NULL ); - /* 'systems' are completely loaded now */ - - /* Completing addon registrations - * ------------------------------------- - */ - - /* load home/permanent world manually */ vg_loader_step( skaterift_load_world_content, NULL ); vg_async_call( async_skaterift_player_start, NULL, 0 ); vg_async_stall(); @@ -257,17 +187,14 @@ void vg_load(void) vg_async_call( async_addon_reg_update, NULL, 0 ); vg_async_stall(); - /* and now */ skaterift_restore_state(); update_ach_models(); vg_loader_step( NULL, skaterift_autosave_synchronous ); - - //board_processview_thread(NULL); - vg_async_call( async_call_ready, NULL, 0 ); } -static void draw_origin_axis(void){ +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 ); @@ -285,7 +212,7 @@ void vg_pre_update(void) steam_update(); skaterift_change_client_world_preupdate(); - if( skaterift.op == k_async_op_clientloading ) return; + if( !g_client.loaded ) return; draw_origin_axis(); addon_system_pre_update(); @@ -332,7 +259,7 @@ void vg_pre_update(void) void vg_fixed_update(void) { - if( skaterift.op == k_async_op_clientloading ) return; + if( !g_client.loaded ) return; world_routes_fixedupdate( world_current_instance() ); player__update(); @@ -341,7 +268,7 @@ void vg_fixed_update(void) void vg_post_update(void) { - if( skaterift.op == k_async_op_clientloading ) return; + if( !g_client.loaded ) return; player__post_update(); @@ -631,7 +558,8 @@ static void render_main_game(void) void vg_render(void) { - if( skaterift.op == k_async_op_clientloading ){ + if( !g_client.loaded ) + { vg_loader_render(); return; } @@ -659,7 +587,7 @@ void vg_render(void) void vg_gui( ui_context *ctx ) { - if( skaterift.op == k_async_op_clientloading ) return; + if( !g_client.loaded ) return; gui_draw( ctx ); diff --git a/skaterift.h b/skaterift.h index bff9521..5801ec8 100644 --- a/skaterift.h +++ b/skaterift.h @@ -12,13 +12,6 @@ enum skaterift_rt struct skaterift_globals { - enum async_operation - { - k_async_op_none, - k_async_op_clientloading, - } - op; - f32 time_rate; enum skaterift_activity { diff --git a/world_load.c b/world_load.c index 5a28613..dafd58d 100644 --- a/world_load.c +++ b/world_load.c @@ -188,7 +188,7 @@ static void skaterift_world_load_done( void *payload, u32 size ) if( world_static.clear_async_op_when_done ) { - skaterift.op = k_async_op_none; + g_client.loaded = 1; world_static.clear_async_op_when_done = 0; } } @@ -351,7 +351,7 @@ void skaterift_change_world_start( addon_reg *reg ) world_static.load_state = k_world_loader_preload; if( world_static.active_instance != 0 ) - skaterift.op = k_async_op_clientloading; + g_client.loaded = 0; char buf[76]; addon_alias_uid( ®->alias, buf );