1 #ifndef WORLD_TRAFFIC_C
2 #define WORLD_TRAFFIC_C
6 static void world_traffic_update( world_instance
*world
, v3f pos
){
7 for( u32 i
=0; i
<mdl_arrcount( &world
->ent_traffic
); i
++ ){
8 ent_traffic
*traffic
= mdl_arritm( &world
->ent_traffic
, i
);
10 u32 i1
= traffic
->index
,
14 if( i1
== 0 ) i0
= traffic
->node_count
-1;
17 if( i2
>= traffic
->node_count
) i2
= 0;
19 i0
+= traffic
->start_node
;
20 i1
+= traffic
->start_node
;
21 i2
+= traffic
->start_node
;
25 ent_route_node
*rn0
= mdl_arritm( &world
->ent_route_node
, i0
),
26 *rn1
= mdl_arritm( &world
->ent_route_node
, i1
),
27 *rn2
= mdl_arritm( &world
->ent_route_node
, i2
);
29 v3_copy( rn1
->co
, h
[1] );
30 v3_lerp( rn0
->co
, rn1
->co
, 0.5f
, h
[0] );
31 v3_lerp( rn1
->co
, rn2
->co
, 0.5f
, h
[2] );
33 float const k_sample_dist
= 0.0025f
;
35 eval_bezier3( h
[0], h
[1], h
[2], traffic
->t
, pc
);
36 eval_bezier3( h
[0], h
[1], h
[2], traffic
->t
+k_sample_dist
, pd
);
40 float length
= vg_maxf( 0.0001f
, v3_length( v0
) );
41 v3_muls( v0
, 1.0f
/length
, v0
);
43 float mod
= k_sample_dist
/ length
;
45 traffic
->t
+= traffic
->speed
* vg
.time_delta
* mod
;
47 if( traffic
->t
> 1.0f
){
50 if( traffic
->t
> 1.0f
) traffic
->t
= 0.0f
;
54 if( traffic
->index
>= traffic
->node_count
)
58 v3_copy( pc
, traffic
->transform
.co
);
60 float a
= atan2f( -v0
[0], v0
[2] );
61 q_axis_angle( traffic
->transform
.q
, (v3f
){0.0f
,1.0f
,0.0f
}, -a
);
63 vg_line_point( traffic
->transform
.co
, 0.3f
, VG__BLUE
);
67 #endif /* WORLD_TRAFFIC_C */