1 #ifndef WORLD_VOLUMES_C
2 #define WORLD_VOLUMES_C
4 #include "world_volumes.h"
6 static void world_volumes_update( world_instance
*world
, v3f pos
){
7 /* filter and check the existing ones */
9 for( u32 i
=0; i
<world_static
.active_trigger_volume_count
; i
++ ){
10 i32 idx
= world_static
.active_trigger_volumes
[i
];
11 ent_volume
*volume
= mdl_arritm( &world
->ent_volume
, idx
);
14 m4x3_mulv( volume
->to_local
, pos
, local
);
15 if( (fabsf(local
[0]) <= 1.0f
) &&
16 (fabsf(local
[1]) <= 1.0f
) &&
17 (fabsf(local
[2]) <= 1.0f
) )
19 world_static
.active_trigger_volumes
[ j
++ ] = idx
;
20 boxf cube
= {{-1.0f
,-1.0f
,-1.0f
},{1.0f
,1.0f
,1.0f
}};
21 vg_line_boxf_transformed( volume
->to_world
, cube
, 0xff00ccff );
22 /* triggr on stay ..... */
25 /* trigger on exit...... */
28 world_static
.active_trigger_volume_count
= j
;
30 static float random_accum
= 0.0f
;
31 random_accum
+= vg
.time_delta
;
35 while( random_accum
> 0.1f
){
43 bh_iter_init_range( 0, &it
, pos
, radius
);
46 while( bh_next( world
->entity_bh
, &it
, &idx
) ){
47 u32 id
= world
->entity_list
[ idx
],
48 type
= mdl_entity_id_type( id
),
49 index
= mdl_entity_id_id( id
);
51 if( type
!= k_ent_volume
) continue;
53 ent_volume
*volume
= mdl_arritm( &world
->ent_volume
, index
);
54 boxf cube
= {{-1.0f
,-1.0f
,-1.0f
},{1.0f
,1.0f
,1.0f
}};
56 if( volume
->flags
& k_ent_volume_flag_particles
){
57 vg_line_boxf_transformed( volume
->to_world
, cube
, 0xff00c0ff );
59 for( int j
=0; j
<random_ticks
; j
++ ){
63 basecall
.function
= 0;
65 entity_call( world
, &basecall
);
69 for( u32 i
=0; i
<world_static
.active_trigger_volume_count
; i
++ )
70 if( world_static
.active_trigger_volumes
[i
] == index
)
73 if( world_static
.active_trigger_volume_count
>
74 vg_list_size(world_static
.active_trigger_volumes
) ) continue;
77 m4x3_mulv( volume
->to_local
, pos
, local
);
79 if( (fabsf(local
[0]) <= 1.0f
) &&
80 (fabsf(local
[1]) <= 1.0f
) &&
81 (fabsf(local
[2]) <= 1.0f
) ){
83 basecall
.function
= 0;
87 entity_call( world
, &basecall
);
88 world_static
.active_trigger_volumes
[
89 world_static
.active_trigger_volume_count
++ ] = index
;
92 vg_line_boxf_transformed( volume
->to_world
, cube
, 0xffcccccc );
98 #endif /* WORLD_VOLUMES_H */