@ -73,16 +73,15 @@ static void ui_draw_circle_image(const UIState *s, int center_x, int center_y, i 
			
		
	
		
			
				
					  ui_draw_circle_image ( s ,  center_x ,  center_y ,  radius ,  image ,  nvgRGBA ( 0 ,  0 ,  0 ,  ( 255  *  bg_alpha ) ) ,  img_alpha ) ;   
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					static  void  draw_lead ( UIState  * s ,  int  idx )  {  
			
		
	
		
			
				
					static  void  draw_lead ( UIState  * s ,  const  cereal : : RadarState : : LeadData : : Reader  & lead_data ,  const  vertex_data  & vd )  {  
			
		
	
		
			
				
					  // Draw lead car indicator
   
			
		
	
		
			
				
					  const  auto  & lead  =  s - > scene . lead_data [ idx ] ;   
			
		
	
		
			
				
					  auto  [ x ,  y ]  =  s - > scene . lead_vertices [ idx ] ;   
			
		
	
		
			
				
					  auto  [ x ,  y ]  =  vd ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  float  fillAlpha  =  0 ;   
			
		
	
		
			
				
					  float  speedBuff  =  10. ;   
			
		
	
		
			
				
					  float  leadBuff  =  40. ;   
			
		
	
		
			
				
					  float  d_rel  =  lead . getDRel ( ) ;   
			
		
	
		
			
				
					  float  v_rel  =  lead . getVRel ( ) ;   
			
		
	
		
			
				
					  float  d_rel  =  lead_data  . getDRel ( ) ;   
			
		
	
		
			
				
					  float  v_rel  =  lead_data  . getVRel ( ) ;   
			
		
	
		
			
				
					  if  ( d_rel  <  leadBuff )  {   
			
		
	
		
			
				
					    fillAlpha  =  255 * ( 1.0 - ( d_rel / leadBuff ) ) ;   
			
		
	
		
			
				
					    if  ( v_rel  <  0 )  {   
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -173,7 +172,6 @@ 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 ;   
			
		
	
		
			
				
					  // Don't draw on top of sidebar
   
			
		
	
		
			
				
					  nvgScissor ( s - > vg ,  s - > viz_rect . x ,  s - > viz_rect . y ,  s - > viz_rect . w ,  s - > viz_rect . h ) ;   
			
		
	
		
			
				
					
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -182,11 +180,14 @@ static void ui_draw_world(UIState *s) { 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  // Draw lead indicators if openpilot is handling longitudinal
   
			
		
	
		
			
				
					  if  ( s - > scene . longitudinal_control )  {   
			
		
	
		
			
				
					    if  ( scene - > lead_data [ 0 ] . getStatus ( ) )  {   
			
		
	
		
			
				
					      draw_lead ( s ,  0 ) ;   
			
		
	
		
			
				
					    auto  radar_state  =  ( * s - > sm ) [ " radarState " ] . getRadarState ( ) ;   
			
		
	
		
			
				
					    auto  lead_one  =  radar_state . getLeadOne ( ) ;   
			
		
	
		
			
				
					    auto  lead_two  =  radar_state . getLeadTwo ( ) ;   
			
		
	
		
			
				
					    if  ( lead_one . getStatus ( ) )  {   
			
		
	
		
			
				
					      draw_lead ( s ,  lead_one ,  s - > scene . lead_vertices [ 0 ] ) ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					    if  ( scene - > lead_data [ 1 ] . getStatus ( )  & &  ( std : : abs ( scene - > lead_data [ 0 ] . getDRel ( )  -  scene - > lead_data [ 1 ] . getDRel ( ) )  >  3.0 ) )  {   
			
		
	
		
			
				
					      draw_lead ( s ,  1 ) ;   
			
		
	
		
			
				
					    if  ( lead_two . getStatus ( )  & &  ( std : : abs ( lead_one . getDRel ( )  -  lead_two . getDRel ( ) )  >  3.0 ) )  {   
			
		
	
		
			
				
					      draw_lead ( s ,  lead_two ,  s - > scene . lead_vertices [ 1 ] ) ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					  }   
			
		
	
		
			
				
					  nvgResetScissor ( s - > vg ) ;   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -194,7 +195,7 @@ static void ui_draw_world(UIState *s) { 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					static  void  ui_draw_vision_maxspeed ( UIState  * s )  {  
			
		
	
		
			
				
					  const  int  SET_SPEED_NA  =  255 ;   
			
		
	
		
			
				
					  float  maxspeed  =  s - > scene . controls_state  . getVCruise ( ) ;   
			
		
	
		
			
				
					  float  maxspeed  =  ( * s - > sm ) [ " controlsState " ] . getControlsState ( )  . getVCruise ( ) ;   
			
		
	
		
			
				
					  const  bool  is_cruise_set  =  maxspeed  ! =  0  & &  maxspeed  ! =  SET_SPEED_NA ;   
			
		
	
		
			
				
					  if  ( is_cruise_set  & &  ! s - > scene . is_metric )  {  maxspeed  * =  0.6225 ;  }   
			
		
	
		
			
				
					
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -213,7 +214,7 @@ static void ui_draw_vision_maxspeed(UIState *s) { 
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					static  void  ui_draw_vision_speed ( UIState  * s )  {  
			
		
	
		
			
				
					  const  float  speed  =  std : : max ( 0.0 ,  s - > scene . car_state  . getVEgo ( )  *  ( s - > scene . is_metric  ?  3.6  :  2.2369363 ) ) ;   
			
		
	
		
			
				
					  const  float  speed  =  std : : max ( 0.0 ,  ( * s - > sm ) [ " carState " ] . getCarState ( )  . getVEgo ( )  *  ( s - > scene . is_metric  ?  3.6  :  2.2369363 ) ) ;   
			
		
	
		
			
				
					  const  std : : string  speed_str  =  std : : to_string ( ( int ) std : : nearbyint ( speed ) ) ;   
			
		
	
		
			
				
					  nvgTextAlign ( s - > vg ,  NVG_ALIGN_CENTER  |  NVG_ALIGN_BASELINE ) ;   
			
		
	
		
			
				
					  ui_draw_text ( s ,  s - > viz_rect . centerX ( ) ,  240 ,  speed_str . c_str ( ) ,  96  *  2.5 ,  COLOR_WHITE ,  " sans-bold " ) ;   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -221,7 +222,7 @@ static void ui_draw_vision_speed(UIState *s) { 
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					static  void  ui_draw_vision_event ( UIState  * s )  {  
			
		
	
		
			
				
					  if  ( s - > scene . controls_state  . getEngageable ( ) )  {   
			
		
	
		
			
				
					  if  ( ( * s - > sm ) [ " controlsState " ] . getControlsState ( )  . getEngageable ( ) )  {   
			
		
	
		
			
				
					    // draw steering wheel
   
			
		
	
		
			
				
					    const  int  radius  =  96 ;   
			
		
	
		
			
				
					    const  int  center_x  =  s - > viz_rect . right ( )  -  radius  -  bdr_s  *  2 ;   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -234,7 +235,8 @@ static void ui_draw_vision_face(UIState *s) { 
			
		
	
		
			
				
					  const  int  radius  =  96 ;   
			
		
	
		
			
				
					  const  int  center_x  =  s - > viz_rect . x  +  radius  +  ( bdr_s  *  2 ) ;   
			
		
	
		
			
				
					  const  int  center_y  =  s - > viz_rect . bottom ( )  -  footer_h  /  2 ;   
			
		
	
		
			
				
					  ui_draw_circle_image ( s ,  center_x ,  center_y ,  radius ,  " driver_face " ,  s - > scene . dmonitoring_state . getIsActiveMode ( ) ) ;   
			
		
	
		
			
				
					  bool  is_active  =  ( * s - > sm ) [ " driverMonitoringState " ] . getDriverMonitoringState ( ) . getIsActiveMode ( ) ;   
			
		
	
		
			
				
					  ui_draw_circle_image ( s ,  center_x ,  center_y ,  radius ,  " driver_face " ,  is_active ) ;   
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					static  void  ui_draw_driver_view ( UIState  * s )  {  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -252,9 +254,10 @@ static void ui_draw_driver_view(UIState *s) { 
			
		
	
		
			
				
					  ui_fill_rect ( s - > vg ,  { blackout_x_l ,  rect . y ,  blackout_w_l ,  rect . h } ,  COLOR_BLACK_ALPHA ( 144 ) ) ;   
			
		
	
		
			
				
					  ui_fill_rect ( s - > vg ,  { blackout_x_r ,  rect . y ,  blackout_w_r ,  rect . h } ,  COLOR_BLACK_ALPHA ( 144 ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  const  bool  face_detected  =  s - > scene . driver_state . getFaceProb ( )  >  0.4 ;   
			
		
	
		
			
				
					  auto  driver_state  =  ( * s - > sm ) [ " driverState " ] . getDriverState ( ) ;   
			
		
	
		
			
				
					  const  bool  face_detected  =  driver_state . getFaceProb ( )  >  0.4 ;   
			
		
	
		
			
				
					  if  ( face_detected )  {   
			
		
	
		
			
				
					    auto  fxy_list  =  s - > scene . driver_state . getFacePosition ( ) ;   
			
		
	
		
			
				
					    auto  fxy_list  =  driver_state . getFacePosition ( ) ;   
			
		
	
		
			
				
					    float  face_x  =  fxy_list [ 0 ] ;   
			
		
	
		
			
				
					    float  face_y  =  fxy_list [ 1 ] ;   
			
		
	
		
			
				
					    int  fbox_x  =  valid_rect . centerX ( )  +  ( is_rhd  ?  face_x  :  - face_x )  *  valid_rect . w ;   
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -308,7 +311,7 @@ static void ui_draw_vision(UIState *s) { 
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					    // Set Speed, Current Speed, Status/Events
   
			
		
	
		
			
				
					    ui_draw_vision_header ( s ) ;   
			
		
	
		
			
				
					    if  ( s - > scene . controls_state  . getAlertSize ( )  = =  cereal : : ControlsState : : AlertSize : : NONE )  {   
			
		
	
		
			
				
					    if  ( ( * s - > sm ) [ " controlsState " ] . getControlsState ( )  . getAlertSize ( )  = =  cereal : : ControlsState : : AlertSize : : NONE )  {   
			
		
	
		
			
				
					      ui_draw_vision_face ( s ) ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					  }  else  {