2 #include "world_routes_ui.h"
3 #include "world_routes.h"
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
;
11 return r
| (g
<<8) | (b
<<16) | (a
<<24);
14 static void ent_route_imgui( world_instance
*world
, ent_route
*route
,
15 ui_point inout_cursor
){
25 *blocks
= alloca( sizeof(struct time_block
) * route
->checkpoints_count
);
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
;
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
);
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
;
41 else valid_sections
= 0;
43 last_version
= rg
->timing_version
;
44 last_time
= rg
->timing_time
;
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
;
55 u32 colour
= v4_rgba( route
->colour
) | 0xff000000;
58 h
= route
->factive
* 16.0f
;
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
);
67 ui_outline( rect
, 1, 0xff00ffff, 0 );
72 for( u32 i
=0; i
<route
->checkpoints_count
-valid_sections
; i
++ ){
73 struct time_block
*block
= &blocks
[ i
];
76 ui_rect rect
= { x
, inout_cursor
[1], w
, h
};
77 ui_outline( rect
, -1, colour
, 0 );
81 inout_cursor
[1] += h
+ 4;
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
);