world regions
[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 if( route->flags & k_ent_route_flag_out_of_zone )
17 return;
18
19 u32 last_version=0;
20 f64 last_time = 0.0;
21
22 u32 valid_sections=0;
23
24 struct time_block{
25 f32 length;
26 int clean;
27 }
28 *blocks = alloca( sizeof(struct time_block) * route->checkpoints_count );
29
30 for( u32 i=0; i<route->checkpoints_count; i++ ){
31 u32 cpid = i+route->active_checkpoint+1;
32 cpid %= route->checkpoints_count;
33 cpid += route->checkpoints_start;
34
35 ent_checkpoint *cp = mdl_arritm( &world->ent_checkpoint, cpid );
36 ent_gate *rg = mdl_arritm( &world->ent_gate, cp->gate_index );
37 rg = mdl_arritm( &world->ent_gate, rg->target );
38
39 if( last_version+1 == rg->timing_version ) {
40 struct time_block *block = &blocks[ valid_sections ++ ];
41 block->clean = (rg->flags & k_ent_gate_clean_pass)? 1: 0;
42 block->length = rg->timing_time - last_time;
43 }
44 else valid_sections = 0;
45
46 last_version = rg->timing_version;
47 last_time = rg->timing_time;
48 }
49
50 if( last_version+1 == world_static.current_run_version ){
51 struct time_block *block = &blocks[ valid_sections ++ ];
52 block->clean = localplayer.rewinded_since_last_gate? 0: 1;
53 block->length = world_static.time - last_time;
54 }
55 else
56 valid_sections = 0;
57
58 u32 colour = v4_rgba( route->colour ) | 0xff000000;
59
60 ui_px x = 0,
61 h = route->factive * 16.0f;
62
63 for( u32 i=0; i<valid_sections; i ++ ){
64 struct time_block *block = &blocks[ i ];
65 ui_px w = block->length * 6.0f;
66 ui_rect rect = { x, inout_cursor[1], w, h };
67 ui_fill( rect, colour );
68
69 if( block->clean )
70 ui_outline( rect, 1, 0xff00ffff, 0 );
71
72 x += w + 4;
73 }
74
75 for( u32 i=0; i<route->checkpoints_count-valid_sections; i++ ){
76 struct time_block *block = &blocks[ i ];
77
78 ui_px w = 20;
79 ui_rect rect = { x, inout_cursor[1], w, h };
80 ui_outline( rect, -1, colour, 0 );
81 x += w + 4;
82 }
83
84 inout_cursor[1] += h + 4;
85 }
86
87 static void world_routes_imgui( world_instance *world ){
88 ui_point cursor = { 0, 0 };
89 for( u32 i=0; i<mdl_arrcount(&world->ent_route); i++ ){
90 ent_route_imgui( world, mdl_arritm( &world->ent_route, i ), cursor );
91 }
92 }