@ -48,9 +48,10 @@ bool car_space_to_full_frame(const UIState *s, float in_x, float in_y, float in_
const vec3 KEp = matvecmul3 ( intrinsic_matrix , Ep ) ;
// Project.
out - > x = KEp . v [ 0 ] / KEp . v [ 2 ] ;
out - > y = KEp . v [ 1 ] / KEp . v [ 2 ] ;
float x = KEp . v [ 0 ] / KEp . v [ 2 ] ;
float y = KEp . v [ 1 ] / KEp . v [ 2 ] ;
nvgTransformPoint ( & out - > x , & out - > y , s - > car_space_transform , x , y ) ;
return out - > x > = - margin & & out - > x < = s - > fb_w + margin & & out - > y > = - margin & & out - > y < = s - > fb_h + margin ;
}
@ -64,11 +65,13 @@ static void ui_draw_text(NVGcontext *vg, float x, float y, const char* string, f
static void draw_chevron ( UIState * s , float x_in , float y_in , float sz ,
NVGcolor fillColor , NVGcolor glowColor ) {
vertex_data out ;
if ( ! car_space_to_full_frame ( s , x_in , y_in , 0.0 , & out ) ) return ;
vertex_data out = { } ;
car_space_to_full_frame ( s , x_in , y_in , 0.0 , & out ) ;
auto [ x , y ] = out ;
sz = std : : clamp ( ( sz * 30 ) / ( x_in / 3 + 30 ) , 15.0f , 30.0f ) ;
sz = std : : clamp ( ( sz * 30 ) / ( x_in / 3 + 30 ) , 15.0f , 30.0f ) * zoom ;
y = std : : fmin ( s - > scene . viz_rect . bottom ( ) - sz * .6 , y ) ;
x = std : : clamp ( x , 0.f , s - > scene . viz_rect . right ( ) - sz / 2 ) ;
// glow
float g_xo = sz / 5 ;
@ -194,22 +197,9 @@ static void ui_draw_vision_lane_lines(UIState *s) {
// Draw all world space objects.
static void ui_draw_world ( UIState * s ) {
const UIScene * scene = & s - > scene ;
nvgSave ( s - > vg ) ;
// Don't draw on top of sidebar
nvgScissor ( s - > vg , scene - > viz_rect . x , scene - > viz_rect . y , scene - > viz_rect . w , scene - > viz_rect . h ) ;
// Apply transformation such that video pixel coordinates match video
// 1) Put (0, 0) in the middle of the video
nvgTranslate ( s - > vg , s - > video_rect . x + s - > video_rect . w / 2 , s - > video_rect . y + s - > video_rect . h / 2 + y_offset ) ;
// 2) Apply same scaling as video
nvgScale ( s - > vg , zoom , zoom ) ;
// 3) Put (0, 0) in top left corner of video
nvgTranslate ( s - > vg , - intrinsic_matrix . v [ 2 ] , - intrinsic_matrix . v [ 5 ] ) ;
// Draw lane edges and vision/mpc tracks
ui_draw_vision_lane_lines ( s ) ;
@ -222,7 +212,7 @@ static void ui_draw_world(UIState *s) {
draw_lead ( s , scene - > lead_data [ 1 ] ) ;
}
}
nvgRestore ( s - > vg ) ;
nvgRese tSciss or ( s - > vg ) ;
}
static void ui_draw_vision_maxspeed ( UIState * s ) {
@ -631,4 +621,17 @@ void ui_nvg_init(UIState *s) {
s - > front_frame_mat = matmul ( device_transform , full_to_wide_frame_transform ) ;
s - > rear_frame_mat = matmul ( device_transform , frame_transform ) ;
// Apply transformation such that video pixel coordinates match video
// 1) Put (0, 0) in the middle of the video
nvgTranslate ( s - > vg , s - > video_rect . x + s - > video_rect . w / 2 , s - > video_rect . y + s - > video_rect . h / 2 + y_offset ) ;
// 2) Apply same scaling as video
nvgScale ( s - > vg , zoom , zoom ) ;
// 3) Put (0, 0) in top left corner of video
nvgTranslate ( s - > vg , - intrinsic_matrix . v [ 2 ] , - intrinsic_matrix . v [ 5 ] ) ;
nvgCurrentTransform ( s - > vg , s - > car_space_transform ) ;
nvgResetTransform ( s - > vg ) ;
}