|  |  | @ -23,8 +23,8 @@ static bool calib_frame_to_full_frame(const UIState *s, float in_x, float in_y, | 
			
		
	
		
		
			
				
					
					|  |  |  |   const QRectF clip_region{-margin, -margin, s->fb_w + 2 * margin, s->fb_h + 2 * margin}; |  |  |  |   const QRectF clip_region{-margin, -margin, s->fb_w + 2 * margin, s->fb_h + 2 * margin}; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   const vec3 pt = (vec3){{in_x, in_y, in_z}}; |  |  |  |   const vec3 pt = (vec3){{in_x, in_y, in_z}}; | 
			
		
	
		
		
			
				
					
					|  |  |  |   const vec3 Ep = matvecmul3(s->scene.view_from_calib, pt); |  |  |  |   const vec3 Ep = matvecmul3(s->scene.wide_cam ? s->scene.view_from_wide_calib : s->scene.view_from_calib, pt); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |   const vec3 KEp = matvecmul3(s->wide_camera ? ecam_intrinsic_matrix : fcam_intrinsic_matrix, Ep); |  |  |  |   const vec3 KEp = matvecmul3(s->scene.wide_cam ? ecam_intrinsic_matrix : fcam_intrinsic_matrix, Ep); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   // Project.
 |  |  |  |   // Project.
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   QPointF point = s->car_space_transform.map(QPointF{KEp.v[0] / KEp.v[2], KEp.v[1] / KEp.v[2]}); |  |  |  |   QPointF point = s->car_space_transform.map(QPointF{KEp.v[0] / KEp.v[2], KEp.v[1] / KEp.v[2]}); | 
			
		
	
	
		
		
			
				
					|  |  | @ -121,17 +121,23 @@ static void update_state(UIState *s) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   if (sm.updated("liveCalibration")) { |  |  |  |   if (sm.updated("liveCalibration")) { | 
			
		
	
		
		
			
				
					
					|  |  |  |     auto rpy_list = sm["liveCalibration"].getLiveCalibration().getRpyCalib(); |  |  |  |     auto rpy_list = sm["liveCalibration"].getLiveCalibration().getRpyCalib(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     auto wfde_list = sm["liveCalibration"].getLiveCalibration().getWideFromDeviceEuler(); | 
			
		
	
		
		
			
				
					
					|  |  |  |     Eigen::Vector3d rpy; |  |  |  |     Eigen::Vector3d rpy; | 
			
		
	
		
		
			
				
					
					|  |  |  |     rpy << rpy_list[0], rpy_list[1], rpy_list[2]; |  |  |  |     Eigen::Vector3d wfde; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     if (rpy_list.size() == 3) rpy << rpy_list[0], rpy_list[1], rpy_list[2]; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     if (wfde_list.size() == 3) wfde << wfde_list[0], wfde_list[1], wfde_list[2]; | 
			
		
	
		
		
			
				
					
					|  |  |  |     Eigen::Matrix3d device_from_calib = euler2rot(rpy); |  |  |  |     Eigen::Matrix3d device_from_calib = euler2rot(rpy); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     Eigen::Matrix3d wide_from_device = euler2rot(wfde); | 
			
		
	
		
		
			
				
					
					|  |  |  |     Eigen::Matrix3d view_from_device; |  |  |  |     Eigen::Matrix3d view_from_device; | 
			
		
	
		
		
			
				
					
					|  |  |  |     view_from_device << 0,1,0, |  |  |  |     view_from_device << 0,1,0, | 
			
		
	
		
		
			
				
					
					|  |  |  |                         0,0,1, |  |  |  |                         0,0,1, | 
			
		
	
		
		
			
				
					
					|  |  |  |                         1,0,0; |  |  |  |                         1,0,0; | 
			
		
	
		
		
			
				
					
					|  |  |  |     Eigen::Matrix3d view_from_calib = view_from_device * device_from_calib; |  |  |  |     Eigen::Matrix3d view_from_calib = view_from_device * device_from_calib; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     Eigen::Matrix3d view_from_wide_calib = view_from_device * wide_from_device * device_from_calib ; | 
			
		
	
		
		
			
				
					
					|  |  |  |     for (int i = 0; i < 3; i++) { |  |  |  |     for (int i = 0; i < 3; i++) { | 
			
		
	
		
		
			
				
					
					|  |  |  |       for (int j = 0; j < 3; j++) { |  |  |  |       for (int j = 0; j < 3; j++) { | 
			
		
	
		
		
			
				
					
					|  |  |  |         scene.view_from_calib.v[i*3 + j] = view_from_calib(i,j); |  |  |  |         scene.view_from_calib.v[i*3 + j] = view_from_calib(i,j); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         scene.view_from_wide_calib.v[i*3 + j] = view_from_wide_calib(i,j); | 
			
		
	
		
		
			
				
					
					|  |  |  |       } |  |  |  |       } | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |     scene.calibration_valid = sm["liveCalibration"].getLiveCalibration().getCalStatus() == 1; |  |  |  |     scene.calibration_valid = sm["liveCalibration"].getLiveCalibration().getCalStatus() == 1; | 
			
		
	
	
		
		
			
				
					|  |  | @ -167,6 +173,17 @@ static void update_state(UIState *s) { | 
			
		
	
		
		
			
				
					
					|  |  |  |     scene.light_sensor = std::max(100.0f - scale * sm["wideRoadCameraState"].getWideRoadCameraState().getExposureValPercent(), 0.0f); |  |  |  |     scene.light_sensor = std::max(100.0f - scale * sm["wideRoadCameraState"].getWideRoadCameraState().getExposureValPercent(), 0.0f); | 
			
		
	
		
		
			
				
					
					|  |  |  |   } |  |  |  |   } | 
			
		
	
		
		
			
				
					
					|  |  |  |   scene.started = sm["deviceState"].getDeviceState().getStarted() && scene.ignition; |  |  |  |   scene.started = sm["deviceState"].getDeviceState().getStarted() && scene.ignition; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   if (sm.updated("carState")) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     float v_ego = sm["carState"].getCarState().getVEgo(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     // TODO: support replays without ecam by using fcam
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     // Wide or narrow cam dependent on speed
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     if ((v_ego < 10) || s->wide_cam_only) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       scene.wide_cam = true; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } else if (v_ego > 15) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       scene.wide_cam = false; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   } | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | void ui_update_params(UIState *s) { |  |  |  | void ui_update_params(UIState *s) { | 
			
		
	
	
		
		
			
				
					|  |  | @ -197,7 +214,7 @@ void UIState::updateStatus() { | 
			
		
	
		
		
			
				
					
					|  |  |  |     if (scene.started) { |  |  |  |     if (scene.started) { | 
			
		
	
		
		
			
				
					
					|  |  |  |       status = STATUS_DISENGAGED; |  |  |  |       status = STATUS_DISENGAGED; | 
			
		
	
		
		
			
				
					
					|  |  |  |       scene.started_frame = sm->frame; |  |  |  |       scene.started_frame = sm->frame; | 
			
		
	
		
		
			
				
					
					|  |  |  |       wide_camera = Params().getBool("WideCameraOnly"); |  |  |  |       wide_cam_only = Params().getBool("WideCameraOnly"); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |     started_prev = scene.started; |  |  |  |     started_prev = scene.started; | 
			
		
	
		
		
			
				
					
					|  |  |  |     emit offroadTransition(!scene.started); |  |  |  |     emit offroadTransition(!scene.started); | 
			
		
	
	
		
		
			
				
					|  |  | @ -219,7 +236,7 @@ UIState::UIState(QObject *parent) : QObject(parent) { | 
			
		
	
		
		
			
				
					
					|  |  |  |   }); |  |  |  |   }); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   Params params; |  |  |  |   Params params; | 
			
		
	
		
		
			
				
					
					|  |  |  |   wide_camera = params.getBool("WideCameraOnly"); |  |  |  |   wide_cam_only = params.getBool("WideCameraOnly"); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |   prime_type = std::atoi(params.get("PrimeType").c_str()); |  |  |  |   prime_type = std::atoi(params.get("PrimeType").c_str()); | 
			
		
	
		
		
			
				
					
					|  |  |  |   language = QString::fromStdString(params.get("LanguageSetting")); |  |  |  |   language = QString::fromStdString(params.get("LanguageSetting")); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | 
 |