+++ /dev/null
-#ifndef WORLD_VOLUMES_C
-#define WORLD_VOLUMES_C
-
-#include "world_volumes.h"
-
-static void world_volumes_update( world_instance *world, v3f pos ){
- /* filter and check the existing ones */
- u32 j=0;
- for( u32 i=0; i<world_static.active_trigger_volume_count; i++ ){
- i32 idx = world_static.active_trigger_volumes[i];
- ent_volume *volume = mdl_arritm( &world->ent_volume, idx );
-
- v3f local;
- m4x3_mulv( volume->to_local, pos, local );
- if( (fabsf(local[0]) <= 1.0f) &&
- (fabsf(local[1]) <= 1.0f) &&
- (fabsf(local[2]) <= 1.0f) )
- {
- world_static.active_trigger_volumes[ j ++ ] = idx;
- boxf cube = {{-1.0f,-1.0f,-1.0f},{1.0f,1.0f,1.0f}};
- vg_line_boxf_transformed( volume->to_world, cube, 0xff00ccff );
- /* triggr on stay ..... */
- }
- else{
- /* trigger on exit...... */
- ent_call basecall;
- basecall.function = k_ent_function_trigger_leave;
- basecall.id = mdl_entity_id( k_ent_volume, idx );
- basecall.data = NULL;
-
- entity_call( world, &basecall );
- }
- }
- world_static.active_trigger_volume_count = j;
-
- static float random_accum = 0.0f;
- random_accum += vg.time_delta;
-
- u32 random_ticks = 0;
-
- while( random_accum > 0.1f ){
- random_accum -= 0.1f;
- random_ticks ++;
- }
-
- float radius = 32.0f;
-
- bh_iter it;
- bh_iter_init_range( 0, &it, pos, radius );
- i32 idx;
-
- while( bh_next( world->entity_bh, &it, &idx ) ){
- u32 id = world->entity_list[ idx ],
- type = mdl_entity_id_type( id ),
- index = mdl_entity_id_id( id );
-
- if( type != k_ent_volume ) continue;
-
- ent_volume *volume = mdl_arritm( &world->ent_volume, index );
- boxf cube = {{-1.0f,-1.0f,-1.0f},{1.0f,1.0f,1.0f}};
-
- if( volume->flags & k_ent_volume_flag_particles ){
- vg_line_boxf_transformed( volume->to_world, cube, 0xff00c0ff );
-
- for( int j=0; j<random_ticks; j++ ){
- ent_call basecall;
- basecall.id = id;
- basecall.data = NULL;
- basecall.function = 0;
-
- entity_call( world, &basecall );
- }
- }
- else{
- for( u32 i=0; i<world_static.active_trigger_volume_count; i++ )
- if( world_static.active_trigger_volumes[i] == index )
- goto next_volume;
-
- if( world_static.active_trigger_volume_count >
- vg_list_size(world_static.active_trigger_volumes) ) continue;
-
- v3f local;
- m4x3_mulv( volume->to_local, pos, local );
-
- if( (fabsf(local[0]) <= 1.0f) &&
- (fabsf(local[1]) <= 1.0f) &&
- (fabsf(local[2]) <= 1.0f) ){
- ent_call basecall;
- basecall.function = 0;
- basecall.id = id;
- basecall.data = NULL;
-
- entity_call( world, &basecall );
- world_static.active_trigger_volumes[
- world_static.active_trigger_volume_count ++ ] = index;
- }
- else
- vg_line_boxf_transformed( volume->to_world, cube, 0xffcccccc );
- }
-next_volume:;
- }
-}
-
-#endif /* WORLD_VOLUMES_H */