- u32 world_count;
- u32 active_world;
-}
-world_global;
-
-VG_STATIC world_instance *get_active_world( void )
-{
- return &world_global.worlds[ world_global.active_world ];
-}
-
-/*
- * API
- */
-
-VG_STATIC
-int ray_hit_is_ramp( world_instance *world, ray_hit *hit );
-
-VG_STATIC
-struct world_material *ray_hit_material( world_instance *world, ray_hit *hit );
-
-VG_STATIC
-void ray_world_get_tri( world_instance *world, ray_hit *hit, v3f tri[3] );
-
-VG_STATIC
-int ray_world( world_instance *world, v3f pos, v3f dir, ray_hit *hit );
-
-/*
- * Submodules
- */
-
-#include "world_routes.h"
-#include "world_sfd.h"
-#include "world_render.h"
-#include "world_water.h"
-#include "world_gen.h"
-#include "world_gate.h"
-
-/*
- * -----------------------------------------------------------------------------
- * Events
- * -----------------------------------------------------------------------------
- */
-
-VG_STATIC int world_stop_sound( int argc, const char *argv[] )
-{
- world_instance *world = get_active_world();
-
- /*
- * None of our world audio runs as one shots, they always have a player.
- * Therefore it is safe to delete clip data after the players are
- * disconnected
- */
- audio_lock();
- for( int i=0; i<world->audio_things_count; i++ )
- {
- struct world_audio_thing *at = &world->audio_things[i];
-
- if( audio_player_is_playing( &at->player ) )
- {
- u32 cflags = audio_player_get_flags( &at->player );
- audio_player_set_flags( &at->player, cflags | AUDIO_FLAG_KILL );
- }
- }
- audio_unlock();
-
- return 0;
-}
-
-VG_STATIC int world_change_world( int argc, const char *argv[] )
-{
-#if 0
- world_instance *world = get_active_world();
-
- if( argc == 0 )
- {
- vg_info( "%s\n", world.world_name );
- return 0;
- }
- else
- {
- vg_info( "Switching world...\n" );
- strcpy( world.world_name, argv[0] );
- world.switching_to_new_world = 1;
- world_stop_sound( 0, NULL );
- }
-#endif
-
- return 0;
-}
-
-VG_STATIC void world_init(void)
-{
-#if 0
- vg_var_push( (struct vg_var){
- .name = "water_enable",
- .data = &world.water.enabled,
- .data_type = k_var_dtype_i32,
- .opt_i32 = { .min=0, .max=1, .clamp=1 },
- .persistent = 0
- });
-#endif
-
- vg_function_push( (struct vg_cmd)
- {
- .name = "world_stop_sound",
- .function = world_stop_sound
- });
-
- vg_function_push( (struct vg_cmd)
- {
- .name = "world",
- .function = world_change_world
- });
-
- world_global.sky_rate = 1.0;
- world_global.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_model_sky_register();
-
- vg_info( "Loading world resources\n" );
-
- vg_linear_clear( vg_mem.scratch );
- mdl_context *msky = mdl_load_full( vg_mem.scratch, "models/rs_skydome.mdl" );
-
- mdl_node *nupper = mdl_node_from_name( msky, "dome_complete" );
- world_global.dome_upper = *mdl_node_submesh( msky, nupper, 0 );
-
- vg_acquire_thread_sync();
- {
- mdl_unpack_glmesh( msky, &world_global.skydome );
- }
- vg_release_thread_sync();
-
- /* Other systems */
- vg_info( "Loading other world systems\n" );
-
- vg_loader_step( world_render_init, NULL );
- vg_loader_step( world_sfd_init, NULL );
- vg_loader_step( world_water_init, NULL );
- vg_loader_step( world_gates_init, NULL );
- vg_loader_step( world_routes_init, NULL );
-
- /* Allocate dynamic world memory arena */
- u32 max_size = 76*1024*1024;
- world_global.generic_heap = vg_create_linear_allocator( vg_mem.rtmemory,
- max_size,
- VG_MEMORY_SYSTEM );
-}
-
-VG_STATIC void world_audio_init(void)
-{
- u32 size = vg_linear_remaining( vg_audio.audio_pool )
- - sizeof(vg_linear_allocator);
-
- world_global.audio_heap = vg_create_linear_allocator( vg_audio.audio_pool,
- size,
- VG_MEMORY_SYSTEM );
-}
-
-VG_STATIC void world_trigger_achievement( world_instance *world, u32 uid )
-{
- struct logic_achievement *ach = &world->logic_achievements[ uid ];
-
- if( ach->achieved )
- return;
-
- steam_set_achievement( ach->achievement_id );
- steam_store_achievements();
-
- ach->achieved = 1;
-}
-
-VG_STATIC void world_run_relay( world_instance *world,
- struct relay_target *rt );
-
-VG_STATIC void world_trigger_relay( world_instance *world, u32 uid )
-{
- struct logic_relay *relay = &world->logic_relays[ uid ];
-
- for( int i=0; i<relay->target_count; i++ )
- {
- world_run_relay( world, &relay->targets[i] );
- }
-}
-
-VG_STATIC void world_trigger_audio( world_instance *world, u32 uid )
-{
- struct world_audio_thing *wat = &world->audio_things[ uid ];
-
- audio_lock();
- audio_player_playclip( &wat->player,
- &wat->temp_embedded_clip );
- audio_unlock();
-}
-
-VG_STATIC void world_run_relay( world_instance *world,
- struct relay_target *rt )
-{
- struct entity_instruction
- {
- enum classtype classtype;
- void (*p_trigger)( world_instance *world, u32 uid );
- }
- entity_instructions[] =
- {
- { k_classtype_logic_achievement, world_trigger_achievement },
- { k_classtype_logic_relay, world_trigger_relay },
- { k_classtype_audio, world_trigger_audio }
- };
-
- for( int i=0; i<vg_list_size(entity_instructions); i++ )
- {
- struct entity_instruction *instr = &entity_instructions[i];
-
- if( instr->classtype == rt->classtype )
- {
- instr->p_trigger( world, rt->sub_id );
- return;
- }
- }
-
- vg_error( "Don't know how to trigger classtype %d\n", rt->classtype );