X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_load.c;h=3dce0288024f76612b89a65502d1d5b60ceef2b2;hb=fbc68c65e01838feb77f47b30994b45fcc39ebaf;hp=e8f545c56dff8af10b154dcb9e925d77402b87d2;hpb=2c91a71533b4ce86b9e7fd708420ae05c74d8f52;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_load.c b/world_load.c index e8f545c..3dce028 100644 --- a/world_load.c +++ b/world_load.c @@ -45,44 +45,55 @@ static void world_instance_load_mdl( u32 instance_id, const char *path ){ mdl_load_animation_block( meta, world->heap ); mdl_load_mesh_block( meta, world->heap ); - /* TODO: Make this a table? */ - mdl_load_array( meta, &world->ent_gate, "ent_gate", heap ); - mdl_load_array( meta, &world->ent_camera, "ent_camera", heap ); - mdl_load_array( meta, &world->ent_spawn, "ent_spawn", heap ); - mdl_load_array( meta, &world->ent_light, "ent_light", heap ); - mdl_load_array( meta, &world->ent_route_node,"ent_route_node", heap ); - mdl_load_array( meta, &world->ent_path_index,"ent_path_index", heap ); - mdl_load_array( meta, &world->ent_checkpoint,"ent_checkpoint", heap ); - mdl_load_array( meta, &world->ent_route, "ent_route", heap ); - mdl_load_array( meta, &world->ent_water, "ent_water", heap ); - mdl_load_array( meta, &world->ent_audio_clip,"ent_audio_clip", heap ); - mdl_load_array( meta, &world->ent_audio, "ent_audio", heap ); - mdl_load_array( meta, &world->ent_volume, "ent_volume", heap ); - mdl_load_array( meta, &world->ent_traffic, "ent_traffic", heap ); - mdl_load_array( meta, &world->ent_marker, "ent_marker", heap ); - mdl_load_array( meta, &world->ent_skateshop, "ent_skateshop", heap ); - mdl_load_array( meta, &world->ent_swspreview,"ent_swspreview", heap ); - mdl_load_array( meta, &world->ent_ccmd, "ent_ccmd", heap ); - mdl_load_array( meta, &world->ent_objective, "ent_objective", heap ); - mdl_load_array( meta, &world->ent_challenge, "ent_challenge", heap ); - mdl_load_array( meta, &world->ent_relay, "ent_relay", heap ); - mdl_load_array( meta, &world->ent_cubemap, "ent_cubemap", heap ); - mdl_load_array( meta, &world->ent_miniworld, "ent_miniworld", heap ); + vg_info( "%u\n", sizeof(ent_cubemap) ); + + MDL_LOAD_ARRAY( meta, &world->ent_gate, ent_gate, heap ); + MDL_LOAD_ARRAY( meta, &world->ent_camera, ent_camera, heap ); + MDL_LOAD_ARRAY( meta, &world->ent_spawn, ent_spawn, heap ); + MDL_LOAD_ARRAY( meta, &world->ent_light, ent_light, heap ); + MDL_LOAD_ARRAY( meta, &world->ent_route_node,ent_route_node, heap ); + MDL_LOAD_ARRAY( meta, &world->ent_path_index,ent_path_index, heap ); + MDL_LOAD_ARRAY( meta, &world->ent_checkpoint,ent_checkpoint, heap ); + MDL_LOAD_ARRAY( meta, &world->ent_route, ent_route, heap ); + MDL_LOAD_ARRAY( meta, &world->ent_water, ent_water, heap ); + MDL_LOAD_ARRAY( meta, &world->ent_audio_clip,ent_audio_clip, heap ); + MDL_LOAD_ARRAY( meta, &world->ent_audio, ent_audio, heap ); + MDL_LOAD_ARRAY( meta, &world->ent_volume, ent_volume, heap ); + MDL_LOAD_ARRAY( meta, &world->ent_traffic, ent_traffic, heap ); + MDL_LOAD_ARRAY( meta, &world->ent_marker, ent_marker, heap ); + MDL_LOAD_ARRAY( meta, &world->ent_skateshop, ent_skateshop, heap ); + MDL_LOAD_ARRAY( meta, &world->ent_swspreview,ent_swspreview, heap ); + MDL_LOAD_ARRAY( meta, &world->ent_ccmd, ent_ccmd, heap ); + MDL_LOAD_ARRAY( meta, &world->ent_objective, ent_objective, heap ); + MDL_LOAD_ARRAY( meta, &world->ent_challenge, ent_challenge, heap ); + MDL_LOAD_ARRAY( meta, &world->ent_relay, ent_relay, heap ); + MDL_LOAD_ARRAY( meta, &world->ent_cubemap, ent_cubemap, heap ); + MDL_LOAD_ARRAY( meta, &world->ent_miniworld, ent_miniworld, heap ); + MDL_LOAD_ARRAY( meta, &world->ent_prop, ent_prop, heap ); + MDL_LOAD_ARRAY( meta, &world->ent_region, ent_region, heap ); mdl_array_ptr infos; - mdl_load_array( meta, &infos, "ent_worldinfo", vg_mem.scratch ); + MDL_LOAD_ARRAY( meta, &infos, ent_worldinfo, vg_mem.scratch ); + world->skybox = k_skybox_default; if( mdl_arrcount(&infos) ){ world->info = *((ent_worldinfo *)mdl_arritm(&infos,0)); + + if( world->meta.info.version >= 104 ){ + if( MDL_CONST_PSTREQ( &world->meta, world->info.pstr_skybox,"space")){ + world->skybox = k_skybox_space; + } + } } else{ world->info.pstr_author = 0; world->info.pstr_desc = 0; world->info.pstr_name = 0; world->info.timezone = 0.0f; + world->info.flags = 0; } - time_t seconds = time(NULL) % ((u32)k_day_length*60); + time_t seconds = time(NULL) % ((u32)vg_maxf(1.0f,k_day_length)*60); world->time = ((f64)(seconds)/(k_day_length*60.0)); world->time += (world->info.timezone/24.0); @@ -99,13 +110,15 @@ static void world_instance_load_mdl( u32 instance_id, const char *path ){ /* init player position. * - this is overriden by the save state when(if) it loads */ - v3_zero( world->player_angles ); ent_spawn *rp = world_find_spawn_by_name( world, "start" ); if( !rp ) rp = world_find_closest_spawn( world, (v3f){0.0f,0.0f,0.0f} ); - - /* TODO: fallback to searching for a safe location using raycasts */ - assert(rp); - v3_copy( rp->transform.co, world->player_co ); + if( rp ) + v3_copy( rp->transform.co, world->player_co ); + else{ + /* FIXME: we need to find a safe place to put the player_co using + * raycasts. */ + v3_zero( world->player_co ); + } /* allocate leaderboard buffers */ u32 bs = mdl_arrcount(&world->ent_route)*sizeof(struct leaderboard_cache); @@ -119,6 +132,9 @@ static void world_instance_load_mdl( u32 instance_id, const char *path ){ board->data_len = 0; } + world->routes_ui = vg_linear_alloc( heap, + sizeof(struct route_ui)*mdl_arrcount(&world->ent_route) ); + vg_async_call( async_world_postprocess, world, 0 ); vg_async_stall(); } @@ -130,22 +146,21 @@ struct world_load_complete_data{ static void skaterift_world_load_done( void *payload, u32 size ){ struct world_load_complete_data *data = payload; + world_instance *world = &world_static.instances[ data->purpose ]; - /* TODO(W2): Load player position from this save file */ vg_msg sav; vg_msg_init( &sav, data->save.buf, data->save.len ); - world_instance *world = &world_static.instances[ data->purpose ]; + if( data->purpose != k_world_purpose_hub ){ + vg_msg player_frame = sav; + if( vg_msg_seekframe( &player_frame, "player" ) ){ + vg_msg_getkvv3f( &player_frame, "position", world->player_co, NULL ); + } + } + world_entity_start( world, &sav ); world->status = k_world_status_loaded; world_static.load_state = k_world_loader_none; - - for( int i=0; istatus == k_world_status_loaded ) - world_entity_relink( wi ); - } } struct world_load_args { @@ -157,7 +172,6 @@ struct world_load_args { * Does a complete world switch using the remaining free slots */ static void skaterift_world_load_thread( void *_args ){ - /* FIXME: we need to check all threads that take args. args can dissapear! */ struct world_load_args args = *((struct world_load_args *)_args); addon_reg *reg = args.reg; @@ -172,7 +186,7 @@ static void skaterift_world_load_thread( void *_args ){ vg_strnull( &path, path_buf, 4096 ); assert( reg ); - addon_get_content_folder( reg, &path ); + addon_get_content_folder( reg, &path, 1 ); vg_str folder = path; if( !vg_strgood( &folder ) ) { @@ -295,21 +309,19 @@ static void skaterift_change_world_start( addon_reg *reg ){ vg_linear_clear( vg_mem.scratch ); /* ?? */ vg_info( "unloading old worlds\n" ); - - for( u32 i=1; istatus == k_world_status_loaded ){ - inst->status = k_world_status_unloading; - world_fadeout_audio( inst ); - } - } + world_instance *client_world = + &world_static.instances[ k_world_purpose_client ]; - world_entity_relink( &world_static.instances[k_world_purpose_hub] ); + if( client_world->status == k_world_status_loaded ){ + client_world->status = k_world_status_unloading; + world_fadeout_audio( client_world ); + } world_static.instance_addons[ k_world_purpose_client ] = reg; network_send_item( k_netmsg_playeritem_world1 ); relink_all_remote_player_worlds(); + world_unlink_nonlocal( &world_static.instances[k_world_purpose_hub] ); } } @@ -323,7 +335,7 @@ static int skaterift_load_world_command( int argc, const char *argv[] ){ u32 reg_id = addon_match( &q ); if( reg_id != 0xffffffff ){ - addon_reg *reg = get_addon_from_index( k_addon_type_world, reg_id ); + addon_reg *reg = get_addon_from_index( k_addon_type_world, reg_id, 0 ); skaterift_change_world_start( reg ); } else { @@ -333,12 +345,16 @@ static int skaterift_load_world_command( int argc, const char *argv[] ){ else { vg_info( "worlds availible to load:\n" ); - for( int i=0; ialias, buf ); - vg_info( " %s\n", buf ); + + if( w->flags & ADDON_REG_HIDDEN ) + vg_info( " %s [hidden]\n", buf ); + else + vg_info( " %s\n", buf ); } }