ui frosting info
[carveJwlIkooP6JGAAIwe30JlM.git] / ent_traffic.c
1 #ifndef ENT_TRAFFIC_C
2 #define ENT_TRAFFIC_C
3
4 #include "world.h"
5
6 static void ent_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 );
9
10 u32 i1 = traffic->index,
11 i0,
12 i2 = i1+1;
13
14 if( i1 == 0 ) i0 = traffic->node_count-1;
15 else i0 = i1-1;
16
17 if( i2 >= traffic->node_count ) i2 = 0;
18
19 i0 += traffic->start_node;
20 i1 += traffic->start_node;
21 i2 += traffic->start_node;
22
23 v3f h[3];
24
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 );
28
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] );
32
33 float const k_sample_dist = 0.0025f;
34 v3f pc, pd;
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 );
37
38 v3f v0;
39 v3_sub( pd, pc, v0 );
40 float length = vg_maxf( 0.0001f, v3_length( v0 ) );
41 v3_muls( v0, 1.0f/length, v0 );
42
43 float mod = k_sample_dist / length;
44
45 traffic->t += traffic->speed * vg.time_delta * mod;
46
47 if( traffic->t > 1.0f ){
48 traffic->t -= 1.0f;
49
50 if( traffic->t > 1.0f ) traffic->t = 0.0f;
51
52 traffic->index ++;
53
54 if( traffic->index >= traffic->node_count )
55 traffic->index = 0;
56 }
57
58 v3_copy( pc, traffic->transform.co );
59
60 float a = atan2f( -v0[0], v0[2] );
61 q_axis_angle( traffic->transform.q, (v3f){0.0f,1.0f,0.0f}, -a );
62
63 vg_line_point( traffic->transform.co, 0.3f, VG__BLUE );
64 }
65 }
66
67 #endif /* ENT_TRAFFIC_C */