null
authorhgn <hgodden00@gmail.com>
Sat, 1 Apr 2023 20:50:24 +0000 (21:50 +0100)
committerhgn <hgodden00@gmail.com>
Sat, 1 Apr 2023 20:50:24 +0000 (21:50 +0100)
blender_export.py
entity.h
maps_src/mp_gridmap.mdl
world.h

index a367cc169a6863b09db6445269a5da7b9e798566..0d4c63ac0aba6786a5325c98f9b9d1dee1fb4360 100644 (file)
@@ -1265,6 +1265,15 @@ def sr_compile( collection ):
             elif obj_data.formato == '1': audio.flags |= 0x400
             elif obj_data.formato == '2': audio.flags |= 0x1000
 
+            audio.channel_behaviour = int(obj_data.channel_behaviour)
+            if audio.channel_behaviour >= 1:#{
+               audio.group = obj_data.group
+            #}
+            if audio.channel_behaviour == 2:#{
+               audio.crossfade = obj_data.transition_duration
+            #}
+            audio.probability_curve = int(obj_data.probability_curve)
+
             for ci in range(audio.clip_count):#{
                entry = obj_data.files[ci]
                clip = ent_audio_clip()
@@ -1892,6 +1901,8 @@ class SR_OBJECT_ENT_AUDIO(bpy.types.PropertyGroup):
    flag_loop: bpy.props.BoolProperty( name="Loop",default=False )
    flag_auto: bpy.props.BoolProperty( name="Play at start",default=False )
    flag_nodoppler: bpy.props.BoolProperty( name="No Doppler",default=False )
+
+   group: bpy.props.IntProperty( name="Group ID", default=0 )
    formato: bpy.props.EnumProperty(
       name="Format",
       items=[('0','Uncompressed Mono',''),
@@ -1928,6 +1939,8 @@ class SR_OBJECT_ENT_AUDIO(bpy.types.PropertyGroup):
       c.prop( data[0], 'max_channels' )
       c = split.column()
       c.prop( data[0], 'channel_behaviour', text='Behaviour' )
+      if data[0].channel_behaviour >= '1':
+         box.prop( data[0], 'group' )
       if data[0].channel_behaviour == '2': 
          box.prop( data[0], 'transition_duration' )
 
index 490737d5322737ab15cc839270bf38e236b1f65c..5b0d4a73bb82842d63959434e4e86eb882b8cf55 100644 (file)
--- a/entity.h
+++ b/entity.h
@@ -176,10 +176,22 @@ struct ent_audio{
        clip_start,
        clip_count;
    float volume, crossfade;
-   u32 channel_behaviour,
+   u32 behaviour,
        group,
        probability_curve,
        max_channels;
 };
 
+enum channel_behaviour{
+   k_channel_behaviour_unlimited = 0,
+   k_channel_behaviour_discard_if_full = 1,
+   k_channel_behaviour_crossfade_if_full = 2
+};
+
+enum probability_curve{
+   k_probability_curve_constant = 0,
+   k_probability_curve_wildlife_day = 1,
+   k_probability_curve_wildlife_night = 2
+};
+
 #endif /* ENTITY_H */
index ceb3721c51f0b0173603e197c56301a2d30c137a..18f438ebad6d3016753facecffebaeb0ac33d0ef 100644 (file)
Binary files a/maps_src/mp_gridmap.mdl and b/maps_src/mp_gridmap.mdl differ
diff --git a/world.h b/world.h
index 08d3ca09123d253651cc89fecc653e36f1468718..997ff312b03fc0a28377aab2515810671b398c78 100644 (file)
--- a/world.h
+++ b/world.h
@@ -118,6 +118,8 @@ struct world_instance
           tex_light_entities,
           tex_light_cubes;
 
+   float probabilities[3];
+
    v3i light_cubes;
 
    struct framebuffer heightmap;
@@ -517,15 +519,40 @@ VG_STATIC void ent_audio_call( world_instance *world, ent_call *call )
          ent_audio_clip *clip = mdl_arritm( &world->ent_audio_clip, 
                                              audio->clip_start+i );
 
-         bar += clip->probability;
+         float mod = world->probabilities[ audio->probability_curve ],
+               p   = clip->probability * mod;
+
+         bar += p;
 
          if( chance < bar ){
             float *pos = call->data;
 
             audio_lock();
-            audio_oneshot_3d( &clip->clip, pos,
-                              audio->transform.s[0],
-                              audio->volume );
+
+            if( audio->behaviour == k_channel_behaviour_unlimited ){
+               audio_oneshot_3d( &clip->clip, pos,
+                                 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, 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_unlock();
             break;
          }
@@ -571,6 +598,15 @@ VG_STATIC void world_update( world_instance *world, v3f pos )
    v3_normalize( state->g_sun_dir );
 
 
+   world->probabilities[ k_probability_curve_constant ] = 1.0f;
+
+   float dp = state->g_day_phase;
+
+   world->probabilities[ k_probability_curve_wildlife_day ] =
+      (dp*dp*0.8f+state->g_sunset_phase)*0.8f;
+   world->probabilities[ k_probability_curve_wildlife_night ] = 
+      1.0f-powf(fabsf((state->g_time_of_day-0.5f)*5.0f),5.0f);
+      
 
    glBindBuffer( GL_UNIFORM_BUFFER, world->ubo_lighting );
    glBufferSubData( GL_UNIFORM_BUFFER, 0,