call->function = k_ent_function_particle_spawn;
call->data = co;
-
entity_call( world, call );
}
- else if( volume->type == k_volume_subtype_trigger ){
- /* TODO */
- }
+ else
+ entity_call( world, call );
}
}
{
ent_audio *audio = mdl_arritm( &world->ent_audio, call->ent.index );
+ v3f sound_co;
+
if( call->function == k_ent_function_particle_spawn ){
- float chance = vg_randf()*100.0f,
- bar = 0.0f;
+ v3_copy( call->data, sound_co );
+ }
+ else if( call->function == k_ent_function_trigger ){
+ v3_copy( audio->transform.co, sound_co );
+ }
+ else
+ vg_fatal_exit_loop( "ent_audio_call (invalid function id)" );
+
+ float chance = vg_randf()*100.0f,
+ bar = 0.0f;
- for( u32 i=0; i<audio->clip_count; i++ ){
- ent_audio_clip *clip = mdl_arritm( &world->ent_audio_clip,
- audio->clip_start+i );
+ for( u32 i=0; i<audio->clip_count; i++ ){
+ ent_audio_clip *clip = mdl_arritm( &world->ent_audio_clip,
+ audio->clip_start+i );
- float mod = world->probabilities[ audio->probability_curve ],
- p = clip->probability * mod;
+ float mod = world->probabilities[ audio->probability_curve ],
+ p = clip->probability * mod;
- bar += p;
+ bar += p;
- if( chance < bar ){
- float *pos = call->data;
+ if( chance < bar ){
- audio_lock();
+ audio_lock();
- if( audio->behaviour == k_channel_behaviour_unlimited ){
- audio_oneshot_3d( &clip->clip, pos,
- audio->transform.s[0],
- audio->volume );
+ if( audio->behaviour == k_channel_behaviour_unlimited ){
+ audio_oneshot_3d( &clip->clip, sound_co,
+ audio->transform.s[0],
+ audio->volume );
+ }
+ else if( audio->behaviour == k_channel_behaviour_discard_if_full ){
+ audio_channel *ch =
+ audio_get_group_idle_channel( audio->group,
+ audio->max_channels );
+
+ if( ch ){
+ audio_channel_init( ch, &clip->clip, audio->flags );
+ audio_channel_group( ch, audio->group );
+ audio_channel_set_spacial( ch, sound_co, audio->transform.s[0] );
+ audio_channel_edit_volume( ch, audio->volume, 1 );
+ ch = audio_relinquish_channel( ch );
}
- else if( audio->behaviour == k_channel_behaviour_discard_if_full ){
- audio_channel *ch =
- audio_get_group_idle_channel( audio->group,
- audio->max_channels );
-
- if( ch ){
- audio_channel_init( ch, &clip->clip, audio->flags );
- audio_channel_group( ch, audio->group );
- audio_channel_set_spacial( ch, pos, audio->transform.s[0] );
- audio_channel_edit_volume( ch, audio->volume, 1 );
- ch = audio_relinquish_channel( ch );
+ }
+ else if( audio->behaviour == k_channel_behaviour_crossfade_if_full){
+ audio_channel *ch =
+ audio_get_group_idle_channel( audio->group,
+ audio->max_channels );
+
+ /* group is full */
+ if( !ch ){
+ audio_channel *existing =
+ audio_get_group_first_active_channel( audio->group );
+
+ if( existing ){
+ if( existing->source == &clip->clip ){
+ audio_unlock();
+ return;
+ }
+
+ existing = audio_channel_fadeout( existing, audio->crossfade);
}
- }
- else if( audio->behaviour == k_channel_behaviour_crossfade_if_full){
-
- }
-
+ ch = audio_get_first_idle_channel();
+ }
- audio_unlock();
- break;
+ if( ch ){
+ audio_channel_init( ch, &clip->clip, audio->flags );
+ audio_channel_group( ch, audio->group );
+ audio_channel_fadein( ch, audio->crossfade );
+ ch = audio_relinquish_channel( ch );
+ }
}
+
+ audio_unlock();
+ return;
}
}
}
if( volume->type == k_volume_subtype_trigger ){
v3f local;
m4x3_mulv( volume->to_local, pos, local );
- vg_line_boxf_transformed( volume->to_world, cube, 0xff00ff00 );
if( (fabsf(local[0]) <= 1.0f) &&
(fabsf(local[1]) <= 1.0f) &&
(fabsf(local[2]) <= 1.0f) )
{
in_volume = 1;
+ vg_line_boxf_transformed( volume->to_world, cube, 0xff00ff00 );
if( !world_global.in_volume ){
ent_call basecall;
entity_call( world, &basecall );
}
}
+ else
+ vg_line_boxf_transformed( volume->to_world, cube, 0xff0000ff );
}
else if( volume->type == k_volume_subtype_particle ){
vg_line_boxf_transformed( volume->to_world, cube, 0xff00c0ff );