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...... */
27 basecall
.function
= k_ent_function_trigger_leave
;
28 basecall
.id
= mdl_entity_id( k_ent_volume
, idx
);
31 entity_call( world
, &basecall
);
34 world_static
.active_trigger_volume_count
= j
;
36 static float random_accum
= 0.0f
;
37 random_accum
+= vg
.time_delta
;
41 while( random_accum
> 0.1f
){
49 bh_iter_init_range( 0, &it
, pos
, radius
);
52 while( bh_next( world
->entity_bh
, &it
, &idx
) ){
53 u32 id
= world
->entity_list
[ idx
],
54 type
= mdl_entity_id_type( id
),
55 index
= mdl_entity_id_id( id
);
57 if( type
!= k_ent_volume
) continue;
59 ent_volume
*volume
= mdl_arritm( &world
->ent_volume
, index
);
60 boxf cube
= {{-1.0f
,-1.0f
,-1.0f
},{1.0f
,1.0f
,1.0f
}};
62 if( volume
->flags
& k_ent_volume_flag_particles
){
63 vg_line_boxf_transformed( volume
->to_world
, cube
, 0xff00c0ff );
65 for( int j
=0; j
<random_ticks
; j
++ ){
69 basecall
.function
= 0;
71 entity_call( world
, &basecall
);
75 for( u32 i
=0; i
<world_static
.active_trigger_volume_count
; i
++ )
76 if( world_static
.active_trigger_volumes
[i
] == index
)
79 if( world_static
.active_trigger_volume_count
>
80 vg_list_size(world_static
.active_trigger_volumes
) ) continue;
83 m4x3_mulv( volume
->to_local
, pos
, local
);
85 if( (fabsf(local
[0]) <= 1.0f
) &&
86 (fabsf(local
[1]) <= 1.0f
) &&
87 (fabsf(local
[2]) <= 1.0f
) ){
89 basecall
.function
= 0;
93 entity_call( world
, &basecall
);
94 world_static
.active_trigger_volumes
[
95 world_static
.active_trigger_volume_count
++ ] = index
;
98 vg_line_boxf_transformed( volume
->to_world
, cube
, 0xffcccccc );
104 #endif /* WORLD_VOLUMES_H */