the route strips are back
[carveJwlIkooP6JGAAIwe30JlM.git] / world_routes_ui.c
1 #include "skaterift.h"
2 #include "world_routes_ui.h"
3 #include "world_routes.h"
4
5 static u32 v4_rgba( v4f colour ){
6 u32 r = vg_minf(1.0f,colour[0])*255.0f,
7 g = vg_minf(1.0f,colour[1])*255.0f,
8 b = vg_minf(1.0f,colour[2])*255.0f,
9 a = vg_minf(1.0f,colour[3])*255.0f;
10
11 return r | (g<<8) | (b<<16) | (a<<24);
12 }
13
14 static void ent_route_imgui( world_instance *world, ent_route *route,
15 ui_point inout_cursor ){
16 u32 last_version=0;
17 f64 last_time = 0.0;
18
19 u32 valid_sections=0;
20
21 struct time_block{
22 f32 length;
23 int clean;
24 }
25 *blocks = alloca( sizeof(struct time_block) * route->checkpoints_count );
26
27 for( u32 i=0; i<route->checkpoints_count; i++ ){
28 u32 cpid = i+route->active_checkpoint+1;
29 cpid %= route->checkpoints_count;
30 cpid += route->checkpoints_start;
31
32 ent_checkpoint *cp = mdl_arritm( &world->ent_checkpoint, cpid );
33 ent_gate *rg = mdl_arritm( &world->ent_gate, cp->gate_index );
34 rg = mdl_arritm( &world->ent_gate, rg->target );
35
36 if( last_version+1 == rg->timing_version ) {
37 struct time_block *block = &blocks[ valid_sections ++ ];
38 block->clean = (rg->flags & k_ent_gate_clean_pass)? 1: 0;
39 block->length = rg->timing_time - last_time;
40 }
41 else valid_sections = 0;
42
43 last_version = rg->timing_version;
44 last_time = rg->timing_time;
45 }
46
47 if( last_version+1 == world_static.current_run_version ){
48 struct time_block *block = &blocks[ valid_sections ++ ];
49 block->clean = localplayer.rewinded_since_last_gate? 0: 1;
50 block->length = world_static.time - last_time;
51 }
52 else
53 valid_sections = 0;
54
55 u32 colour = v4_rgba( route->colour ) | 0xff000000;
56
57 ui_px x = 0,
58 h = route->factive * 16.0f;
59
60 for( u32 i=0; i<valid_sections; i ++ ){
61 struct time_block *block = &blocks[ i ];
62 ui_px w = block->length * 2.0f;
63 ui_rect rect = { x, inout_cursor[1], w, h };
64 ui_fill( rect, colour );
65
66 if( block->clean )
67 ui_outline( rect, 1, 0xff00ffff, 0 );
68
69 x += w + 4;
70 }
71
72 for( u32 i=0; i<route->checkpoints_count-valid_sections; i++ ){
73 struct time_block *block = &blocks[ i ];
74
75 ui_px w = 20;
76 ui_rect rect = { x, inout_cursor[1], w, h };
77 ui_outline( rect, -1, colour, 0 );
78 x += w + 4;
79 }
80
81 inout_cursor[1] += h + 4;
82 }
83
84 static void world_routes_imgui( world_instance *world ){
85 ui_point cursor = { 0, 0 };
86 for( u32 i=0; i<mdl_arrcount(&world->ent_route); i++ ){
87 ent_route_imgui( world, mdl_arritm( &world->ent_route, i ), cursor );
88 }
89 }