X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world.c;h=9b19387208ad9a47a5c96805b6923a83185af09b;hb=bececcbb7b2e886e72425e7c070e1fdc3aa126dc;hp=5cc7841641acfe46e91e686079431440694bade0;hpb=74174e4357c402824302174845f89b975dba5981;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world.c b/world.c index 5cc7841..9b19387 100644 --- a/world.c +++ b/world.c @@ -2,48 +2,26 @@ * Copyright (C) 2021-2023 Mt.ZERO Software, Harry Godden - All Rights Reserved */ -#ifndef WORLD_C -#define WORLD_C - +#include "skaterift.h" #include "world.h" #include "network.h" +#include "vg/vg_loader.h" +#include "vg/vg_mem.h" +#include "save.h" +#include "player.h" +#include "ent_traffic.h" -static world_instance *world_current_instance(void){ - return &world_static.worlds[ world_static.active_world ]; -} +struct world_static world_static; -static void world_init(void) +world_instance *world_current_instance(void) { - VG_VAR_F32( k_day_length ); - VG_VAR_I32( k_debug_light_indices ); - VG_VAR_I32( k_debug_light_complexity ); - VG_VAR_I32( k_light_preview ); - - world_render.sky_rate = 1.0; - world_render.sky_target_rate = 1.0; - - shader_scene_standard_register(); - shader_scene_standard_alphatest_register(); - shader_scene_vertex_blend_register(); - shader_scene_terrain_register(); - shader_scene_depth_register(); - shader_scene_position_register(); - - shader_model_sky_register(); - - vg_info( "Loading world resources\n" ); - - vg_linear_clear( vg_mem.scratch ); - - mdl_context msky; - mdl_open( &msky, "models/rs_skydome.mdl", vg_mem.scratch ); - mdl_load_metadata_block( &msky, vg_mem.scratch ); - mdl_async_load_glmesh( &msky, &world_render.skydome ); - mdl_close( &msky ); + return &world_static.instances[ world_static.active_instance ]; +} - /* Other systems */ - vg_info( "Loading other world systems\n" ); +static int skaterift_switch_instance_cmd( int argc, const char *argv[] ); +void world_init(void) +{ vg_loader_step( world_render_init, NULL ); vg_loader_step( world_sfd_init, NULL ); vg_loader_step( world_water_init, NULL ); @@ -54,244 +32,79 @@ static void world_init(void) u32 max_size = 76*1024*1024; world_static.heap = vg_create_linear_allocator( vg_mem.rtmemory, max_size, VG_MEMORY_SYSTEM ); -} -#include "world_entity.c" -#include "world_gate.c" -#include "world_gen.c" -#include "world_load.c" -#include "world_physics.c" -#include "world_render.c" -#include "world_sfd.c" -#include "world_volumes.c" -#include "world_water.c" -#include "world_audio.c" -#include "world_routes.c" + vg_console_reg_cmd( "switch_active_instance", + skaterift_switch_instance_cmd, NULL ); +} -VG_STATIC void world_update( world_instance *world, v3f pos ) +void world_switch_instance( u32 index ) { - world_render.sky_time += world_render.sky_rate * vg.time_delta; - world_render.sky_rate = vg_lerp( world_render.sky_rate, - world_render.sky_target_rate, - vg.time_delta * 5.0 ); - - world_routes_update_timer_texts( world ); - world_routes_update( world ); - //world_routes_debug( world ); - - /* ---- traffic -------- */ - - for( u32 i=0; ient_traffic ); i++ ){ - ent_traffic *traffic = mdl_arritm( &world->ent_traffic, i ); - - u32 i1 = traffic->index, - i0, - i2 = i1+1; - - if( i1 == 0 ) i0 = traffic->node_count-1; - else i0 = i1-1; - - if( i2 >= traffic->node_count ) i2 = 0; - - i0 += traffic->start_node; - i1 += traffic->start_node; - i2 += traffic->start_node; - - v3f h[3]; - - ent_route_node *rn0 = mdl_arritm( &world->ent_route_node, i0 ), - *rn1 = mdl_arritm( &world->ent_route_node, i1 ), - *rn2 = mdl_arritm( &world->ent_route_node, i2 ); - - v3_copy( rn1->co, h[1] ); - v3_lerp( rn0->co, rn1->co, 0.5f, h[0] ); - v3_lerp( rn1->co, rn2->co, 0.5f, h[2] ); - - float const k_sample_dist = 0.0025f; - v3f pc, pd; - eval_bezier3( h[0], h[1], h[2], traffic->t, pc ); - eval_bezier3( h[0], h[1], h[2], traffic->t+k_sample_dist, pd ); - - v3f v0; - v3_sub( pd, pc, v0 ); - float length = vg_maxf( 0.0001f, v3_length( v0 ) ); - v3_muls( v0, 1.0f/length, v0 ); - - float mod = k_sample_dist / length; - - traffic->t += traffic->speed * vg.time_delta * mod; - - if( traffic->t > 1.0f ){ - traffic->t -= 1.0f; - - if( traffic->t > 1.0f ) traffic->t = 0.0f; - - traffic->index ++; - - if( traffic->index >= traffic->node_count ) - traffic->index = 0; - } - - v3_copy( pc, traffic->transform.co ); - - float a = atan2f( -v0[0], v0[2] ); - q_axis_angle( traffic->transform.q, (v3f){0.0f,1.0f,0.0f}, -a ); + localplayer.subsystem = k_player_subsystem_walk; - vg_line_pt3( traffic->transform.co, 0.3f, VG__BLUE ); + if( index >= vg_list_size(world_static.instances) ){ + vg_error( "Instance ID out of range (%u)\n", index ); + return; } - /* ---- SFD ------------ */ - - if( mdl_arrcount( &world->ent_route ) ){ - u32 closest = 0; - float min_dist = INFINITY; + world_instance *new = &world_static.instances[ index ]; - for( u32 i=0; ient_route ); i++ ){ - ent_route *route = mdl_arritm( &world->ent_route, i ); - float dist = v3_dist2( route->board_transform[3], pos ); - - if( dist < min_dist ){ - min_dist = dist; - closest = i; - } - } - - if( (world_sfd.active_route_board != closest) || network_scores_updated ) - { - network_scores_updated = 0; - world_sfd.active_route_board = closest; - - ent_route *route = mdl_arritm( &world->ent_route, closest ); - u32 id = route->official_track_id; - - if( id != 0xffffffff ){ - struct netmsg_board *local_board = - &scoreboard_client_data.boards[id]; - - for( int i=0; i<13; i++ ){ - sfd_encode( i, &local_board->data[27*i] ); - } - }else{ - sfd_encode( 0, mdl_pstr( &world->meta, route->pstr_name ) ); - sfd_encode( 1, "No data" ); - } - } + if( new->status != k_world_status_loaded ){ + vg_error( "Instance is not loaded (%u)\n", index ); + return; } - sfd_update(); - - /* volumes - * ------------------------------------------------------------------------- - */ - - /* filter and check the existing ones - * TODO: on change world, clear volumes list */ - u32 j=0; - for( u32 i=0; ient_volume, idx ); - v3f local; - m4x3_mulv( volume->to_local, pos, local ); - if( (fabsf(local[0]) <= 1.0f) && - (fabsf(local[1]) <= 1.0f) && - (fabsf(local[2]) <= 1.0f) ) - { - world_static.active_trigger_volumes[ j ++ ] = idx; - boxf cube = {{-1.0f,-1.0f,-1.0f},{1.0f,1.0f,1.0f}}; - vg_line_boxf_transformed( volume->to_world, cube, 0xff00ccff ); - /* triggr on stay ..... */ - } - else{ - /* trigger on exit...... */ + if( skaterift.demo_mode ){ + if( world_static.instance_addons[index]->flags & ADDON_REG_PREMIUM ){ + vg_error( "Can't switch to a premium world in the demo version\n" ); + return; } } - world_static.active_trigger_volume_count = j; - - static float random_accum = 0.0f; - random_accum += vg.time_delta; - u32 random_ticks = 0; + world_instance *current = + &world_static.instances[ world_static.active_instance ]; - while( random_accum > 0.1f ){ - random_accum -= 0.1f; - random_ticks ++; + if( index != world_static.active_instance ){ + v3_copy( localplayer.rb.co, current->player_co ); + skaterift_autosave(1); } - float radius = 25.0f; - boxf volume_proximity; - v3_add( pos, (v3f){ radius, radius, radius }, volume_proximity[1] ); - v3_sub( pos, (v3f){ radius, radius, radius }, volume_proximity[0] ); - - bh_iter it; - bh_iter_init_box( 0, &it, volume_proximity ); - i32 idx; - - while( bh_next( world->volume_bh, &it, &idx ) ){ - ent_volume *volume = mdl_arritm( &world->ent_volume, idx ); - - boxf cube = {{-1.0f,-1.0f,-1.0f},{1.0f,1.0f,1.0f}}; - - if( volume->type == k_volume_subtype_trigger ){ - for( u32 i=0; iplayer_co, localplayer.rb.co ); - if( world_static.active_trigger_volume_count > - vg_list_size(world_static.active_trigger_volumes) ) continue; - - v3f local; - m4x3_mulv( volume->to_local, pos, local ); - - if( (fabsf(local[0]) <= 1.0f) && - (fabsf(local[1]) <= 1.0f) && - (fabsf(local[2]) <= 1.0f) ) - { - ent_call basecall; - basecall.function = k_ent_function_trigger; - basecall.id = mdl_entity_id( k_ent_volume, idx ); - basecall.data = NULL; - - entity_call( world, &basecall ); - world_static.active_trigger_volumes[ - world_static.active_trigger_volume_count ++ ] = idx; - } - else - vg_line_boxf_transformed( volume->to_world, cube, 0xffcccccc ); - } - else if( volume->type == k_volume_subtype_particle ){ - vg_line_boxf_transformed( volume->to_world, cube, 0xff00c0ff ); + world_static.active_instance = index; + player__reset(); +} - for( int j=0; j\n" ); + return 0; +} - entity_call( world, &basecall ); - } - } -next_volume:; - } +void skaterift_world_get_save_path( enum world_purpose which, char buf[128] ) +{ + addon_reg *reg = world_static.instance_addons[ which ]; -#if 0 - if( k_debug_light_indices ) - { - for( int i=0; ilight_count; i++ ){ - struct world_light *light = &world->lights[i]; - struct classtype_world_light *inf = light->inf; + if( !reg ) + vg_fatal_error( "Looking up addon for world without one\n" ); - u32 colour = 0xff000000; - u8 r = inf->colour[0] * 255.0f, - g = inf->colour[1] * 255.0f, - b = inf->colour[2] * 255.0f; + char id[76]; + addon_alias_uid( ®->alias, id ); + snprintf( buf, 128, "savedata/%s.bkv", id ); +} - colour |= r; - colour |= g << 8; - colour |= b << 16; +void world_update( world_instance *world, v3f pos ) +{ + world_render.sky_time += world_render.sky_rate * vg.time_delta; + world_render.sky_rate = vg_lerp( world_render.sky_rate, + world_render.sky_target_rate, + vg.time_delta * 5.0 ); - vg_line_pt3( light->node->co, 0.25f, colour ); - } - } -#endif + world_routes_update_timer_texts( world ); + world_routes_update( world ); + ent_traffic_update( world, pos ); + world_sfd_update( world, pos ); + world_volumes_update( world, pos ); } - -#endif /* WORLD_C */