#pragma once #include "util.h" #define MAX_VERTS 16384 struct VERTEX { F32 x, y; U32 col; }; inline constexpr U32 rgba( U32 r, U32 g, U32 b, U32 a ) { return r | ( g << 8 ) | ( b << 16 ) | ( a << 24 ); } const U32 C_HALO_IN = rgba( 0, 0, 0, 10 ); const U32 C_HALO_OUT = rgba( 0, 0, 0, 0 ); const U32 C_FACE_MID = rgba( 96, 100, 110, 155 ); const U32 C_FACE_EDGE = rgba( 24, 26, 32, 20 ); const U32 C_SWIRL = rgba( 165, 170, 180, 60 ); const U32 C_RIM = rgba( 255, 255, 255, 205 ); const U32 C_TICK = rgba( 235, 240, 255, 180 ); const U32 C_TICKMIN = rgba( 235, 240, 255, 120 ); const U32 C_LABEL = rgba( 245, 247, 252, 235 ); const U32 C_REDLINE = rgba( 210, 40, 40, 230 ); const U32 C_REDLINE2 = rgba( 255, 70, 70, 230 ); const U32 C_NEEDLE = rgba( 225, 228, 236, 250 ); const U32 C_TRAIL = rgba( 225, 228, 236, 130 ); const U32 C_HUB = rgba( 70, 74, 84, 255 ); const U32 C_HUBDOT = rgba( 210, 214, 222, 255 ); const U32 C_GEAR = rgba( 245, 247, 252, 245 ); const U32 C_SPEED = rgba( 245, 247, 252, 245 ); const U32 C_PEAK = rgba( 255, 255, 255, 210 ); const U32 C_VACUUM = rgba( 160, 170, 190, 110 ); const U32 C_ZERO = rgba( 255, 255, 255, 235 ); const U32 C_LAMP = rgba( 0, 255, 255, 250 ); const U32 C_LAMPBG = rgba( 20, 20, 20, 130 ); #define ZONE_RED 0.86f // 7-seg glyph indices; 0-9 are the digits enum GLYPH { G_R = 10, G_N, G_DASH, G_A, G_B, G_S, G_T, G_C, G_COUNT, }; F32 gauge_angle( F32 t ); class GAUGE_RENDERER { public: VERTEX verts[MAX_VERTS]; I32 nverts; F32 fade; GAUGE_RENDERER(); void clear(); void set_fade( F32 f ); U32 faded( U32 c ) const; void rect( F32 x, F32 y, F32 w, F32 h, U32 c ); void line( F32 x0, F32 y0, F32 x1, F32 y1, F32 t, U32 c ); void arc( F32 cx, F32 cy, F32 r0, F32 r1, F32 a0, F32 a1, U32 c ); void arc_grad( F32 cx, F32 cy, F32 r0, F32 r1, F32 a0, F32 a1, U32 c_in, U32 c_out ); void disc( F32 cx, F32 cy, F32 r, U32 c ); void disc_grad( F32 cx, F32 cy, F32 r, U32 c_in, U32 c_out ); void tick( F32 cx, F32 cy, F32 a, F32 rin, F32 rout, F32 t, U32 c ); void needle( F32 cx, F32 cy, F32 a, F32 len, F32 back, F32 w, U32 c ); void needle_trail( F32 cx, F32 cy, F32 a0, F32 a1, F32 r0, F32 r1, U32 c ); // 7-seg text void glyph( F32 x, F32 y, F32 dw, F32 dh, I32 g, U32 c ); void glyph_c( F32 cx, F32 cy, F32 dw, F32 dh, I32 g, U32 c ); void number( F32 x, F32 y, F32 dw, F32 dh, I32 val, U32 c ); void number_c( F32 cx, F32 cy, F32 dw, F32 dh, I32 val, U32 c ); void number_r( F32 x, F32 y, F32 dw, F32 dh, I32 val, U32 c ); void lamp( F32 cx, F32 cy, F32 h, const I32 g[3], U32 c ); void build_tach_bg( F32 cx, F32 cy, F32 r, F32 rpm_max, F32 red_ang, F32 rpm_off ); void build_tach_gear_speed( F32 cx, F32 cy, F32 r, F32 rpm, F32 rpm_max, I32 gear, F32 speed, F32 red_ang ); void build_tach( F32 cx, F32 cy, F32 r, F32 trail, F32 rpm, F32 rpm_max, F32 red_ang, F32 rpm_off, F32 peak, I32 gear, F32 speed, U8 have_ext, U8 flash_needle ); void build_boost_bg( F32 cx, F32 cy, F32 r, F32 range ); void build_boost( F32 cx, F32 cy, F32 r, F32 bar, F32 range, F32 trail ); void build_lamps( F32 cx, F32 cy, F32 r, F32 h, U8 hb, U8 abs_on, U8 tcs_on, U8 abs_flash, U8 tcs_flash ); void build_tires( F32 cx, F32 cy, F32 h, F32 fl, F32 fr, F32 rl, F32 rr ); };