*/
void *heap;
- char world_name[ 64 ];
enum world_status{
k_world_status_unloaded = 0,
k_world_status_loading = 1,
- k_world_status_loaded = 2
+ k_world_status_loaded = 2,
+ k_world_status_unloading = 3 /* dont spawn sounds and stuff */
}
status;
float probabilities[3];
v3i light_cubes;
-
struct framebuffer heightmap;
/*
* --------------------------------------------------------------------------
*/
void *heap;
+ char *load_target;
/* rendering */
glmesh skydome;
v3f render_gate_pos;
int in_volume;
- int switching_to_new_world;
-
world_instance worlds[4];
u32 active_world;
VG_STATIC void ent_audio_call( world_instance *world, ent_call *call )
{
+ if( world->status == k_world_status_unloading ){
+ vg_warn( "cannot modify audio while unloading world\n" );
+ return;
+ }
+
+ u8 world_id = (world - world_global.worlds) + 1;
u32 index = mdl_entity_id_id( call->id );
ent_audio *audio = mdl_arritm( &world->ent_audio, index );
bar += p;
if( chance < bar ){
-
audio_lock();
if( audio->behaviour == k_channel_behaviour_unlimited ){
if( ch ){
audio_channel_init( ch, &clip->clip, audio->flags );
audio_channel_group( ch, audio->group );
+ audio_channel_world( ch, world_id );
audio_channel_set_spacial( ch, sound_co, audio->transform.s[0] );
audio_channel_edit_volume( ch, audio->volume, 1 );
ch = audio_relinquish_channel( ch );
if( ch ){
audio_channel_init( ch, &clip->clip, audio->flags );
audio_channel_group( ch, audio->group );
+ audio_channel_world( ch, world_id );
audio_channel_fadein( ch, audio->crossfade );
ch = audio_relinquish_channel( ch );
}
}
}
+/* finds any active playing in world and fades them out, we can only do this
+ * while unloading */
+VG_STATIC void world_fadeout_audio( world_instance *world )
+{
+ if( world->status != k_world_status_unloading ){
+ vg_fatal_error( "World status must be set to 'unloading', to fadeout"
+ " audio.\n" );
+ }
+
+ u8 world_id = (world - world_global.worlds) + 1;
+
+ audio_lock();
+ for( u32 i=0; i<AUDIO_CHANNELS; i++ ){
+ audio_channel *ch = &vg_audio.channels[i];
+
+ if( ch->allocated && (ch->world_id == world_id) ){
+ ch = audio_channel_fadeout( ch, 1.0f );
+ }
+ }
+ audio_unlock();
+}
+
VG_STATIC void world_update( world_instance *world, v3f pos )
{
world_global.sky_time += world_global.sky_rate * vg.time_delta;