|  |  | @ -11,33 +11,18 @@ | 
			
		
	
		
		
			
				
					
					|  |  |  | #include "selfdrive/ui/qt/maps/map_helpers.h" |  |  |  | #include "selfdrive/ui/qt/maps/map_helpers.h" | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | const float DEFAULT_ZOOM = 13.5; // Don't go below 13 or features will start to disappear
 |  |  |  | const float DEFAULT_ZOOM = 13.5; // Don't go below 13 or features will start to disappear
 | 
			
		
	
		
		
			
				
					
					|  |  |  | const int RENDER_HEIGHT = 512, RENDER_WIDTH = 512; |  |  |  | const int HEIGHT = 512, WIDTH = 512; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | const int HEIGHT = 256, WIDTH = 256; |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | const int NUM_VIPC_BUFFERS = 4; |  |  |  | const int NUM_VIPC_BUFFERS = 4; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | const int EARTH_CIRCUMFERENCE_METERS = 40075000; |  |  |  | const int EARTH_CIRCUMFERENCE_METERS = 40075000; | 
			
		
	
		
		
			
				
					
					|  |  |  | const int PIXELS_PER_TILE = 256; |  |  |  | const int PIXELS_PER_TILE = 256; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | float get_meters_per_pixel(float lat, float zoom) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   float num_tiles = pow(2, zoom+1); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   float meters_per_tile = cos(DEG2RAD(lat)) * EARTH_CIRCUMFERENCE_METERS / num_tiles; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   return meters_per_tile / PIXELS_PER_TILE; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | float get_zoom_level_for_scale(float lat, float meters_per_pixel) { |  |  |  | float get_zoom_level_for_scale(float lat, float meters_per_pixel) { | 
			
		
	
		
		
			
				
					
					|  |  |  |   float meters_per_tile = meters_per_pixel * PIXELS_PER_TILE; |  |  |  |   float meters_per_tile = meters_per_pixel * PIXELS_PER_TILE; | 
			
		
	
		
		
			
				
					
					|  |  |  |   float num_tiles = cos(DEG2RAD(lat)) * EARTH_CIRCUMFERENCE_METERS / meters_per_tile; |  |  |  |   float num_tiles = cos(DEG2RAD(lat)) * EARTH_CIRCUMFERENCE_METERS / meters_per_tile; | 
			
		
	
		
		
			
				
					
					|  |  |  |   return log2(num_tiles) - 1; |  |  |  |   return log2(num_tiles) - 1; | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | void downsample(uint8_t *src, uint8_t *dst) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   for (int r = 0; r < HEIGHT; r++) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     for (int c = 0; c < WIDTH; c++) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       dst[r*WIDTH + c] = src[(r*2*RENDER_WIDTH + c*2) * 3]; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | MapRenderer::MapRenderer(const QMapboxGLSettings &settings, bool online) : m_settings(settings) { |  |  |  | MapRenderer::MapRenderer(const QMapboxGLSettings &settings, bool online) : m_settings(settings) { | 
			
		
	
		
		
			
				
					
					|  |  |  |   QSurfaceFormat fmt; |  |  |  |   QSurfaceFormat fmt; | 
			
		
	
	
		
		
			
				
					|  |  | @ -59,7 +44,7 @@ MapRenderer::MapRenderer(const QMapboxGLSettings &settings, bool online) : m_set | 
			
		
	
		
		
			
				
					
					|  |  |  |   gl_functions->initializeOpenGLFunctions(); |  |  |  |   gl_functions->initializeOpenGLFunctions(); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   QOpenGLFramebufferObjectFormat fbo_format; |  |  |  |   QOpenGLFramebufferObjectFormat fbo_format; | 
			
		
	
		
		
			
				
					
					|  |  |  |   fbo.reset(new QOpenGLFramebufferObject(RENDER_WIDTH, RENDER_HEIGHT, fbo_format)); |  |  |  |   fbo.reset(new QOpenGLFramebufferObject(WIDTH, HEIGHT, fbo_format)); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   std::string style = util::read_file(STYLE_PATH); |  |  |  |   std::string style = util::read_file(STYLE_PATH); | 
			
		
	
		
		
			
				
					
					|  |  |  |   m_map.reset(new QMapboxGL(nullptr, m_settings, fbo->size(), 1)); |  |  |  |   m_map.reset(new QMapboxGL(nullptr, m_settings, fbo->size(), 1)); | 
			
		
	
	
		
		
			
				
					|  |  | @ -69,7 +54,7 @@ MapRenderer::MapRenderer(const QMapboxGLSettings &settings, bool online) : m_set | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   m_map->resize(fbo->size()); |  |  |  |   m_map->resize(fbo->size()); | 
			
		
	
		
		
			
				
					
					|  |  |  |   m_map->setFramebufferObject(fbo->handle(), fbo->size()); |  |  |  |   m_map->setFramebufferObject(fbo->handle(), fbo->size()); | 
			
		
	
		
		
			
				
					
					|  |  |  |   gl_functions->glViewport(0, 0, RENDER_WIDTH, RENDER_HEIGHT); |  |  |  |   gl_functions->glViewport(0, 0, WIDTH, HEIGHT); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   if (online) { |  |  |  |   if (online) { | 
			
		
	
		
		
			
				
					
					|  |  |  |     vipc_server.reset(new VisionIpcServer("navd")); |  |  |  |     vipc_server.reset(new VisionIpcServer("navd")); | 
			
		
	
	
		
		
			
				
					|  |  | @ -114,9 +99,9 @@ void MapRenderer::updatePosition(QMapbox::Coordinate position, float bearing) { | 
			
		
	
		
		
			
				
					
					|  |  |  |     return; |  |  |  |     return; | 
			
		
	
		
		
			
				
					
					|  |  |  |   } |  |  |  |   } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   // Choose a zoom level that matches the scale of zoom level 13 at latitude 80deg
 |  |  |  |   // Choose a scale that ensures above 13 zoom level up to and above 75deg of lat
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |   float scale_lat80 = get_meters_per_pixel(80, 13); |  |  |  |   float meters_per_pixel = 2; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |   float zoom = get_zoom_level_for_scale(position.first, scale_lat80); |  |  |  |   float zoom = get_zoom_level_for_scale(position.first, meters_per_pixel); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   m_map->setCoordinate(position); |  |  |  |   m_map->setCoordinate(position); | 
			
		
	
		
		
			
				
					
					|  |  |  |   m_map->setBearing(bearing); |  |  |  |   m_map->setBearing(bearing); | 
			
		
	
	
		
		
			
				
					|  |  | @ -150,13 +135,15 @@ void MapRenderer::sendVipc() { | 
			
		
	
		
		
			
				
					
					|  |  |  |     .timestamp_eof = ts, |  |  |  |     .timestamp_eof = ts, | 
			
		
	
		
		
			
				
					
					|  |  |  |   }; |  |  |  |   }; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   assert(cap.sizeInBytes() >= buf->len*4); |  |  |  |   assert(cap.sizeInBytes() >= buf->len); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |   uint8_t* dst = (uint8_t*)buf->addr; |  |  |  |   uint8_t* dst = (uint8_t*)buf->addr; | 
			
		
	
		
		
			
				
					
					|  |  |  |   uint8_t* src = cap.bits(); |  |  |  |   uint8_t* src = cap.bits(); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   // 2x downsample + rgb to grayscale
 |  |  |  |   // RGB to greyscale
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |   memset(dst, 128, buf->len); |  |  |  |   memset(dst, 128, buf->len); | 
			
		
	
		
		
			
				
					
					|  |  |  |   downsample(src, dst); |  |  |  |   for (int i = 0; i < WIDTH * HEIGHT; i++) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     dst[i] = src[i * 3]; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   vipc_server->send(buf, &extra); |  |  |  |   vipc_server->send(buf, &extra); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -187,8 +174,10 @@ uint8_t* MapRenderer::getImage() { | 
			
		
	
		
		
			
				
					
					|  |  |  |   uint8_t* src = cap.bits(); |  |  |  |   uint8_t* src = cap.bits(); | 
			
		
	
		
		
			
				
					
					|  |  |  |   uint8_t* dst = new uint8_t[WIDTH * HEIGHT]; |  |  |  |   uint8_t* dst = new uint8_t[WIDTH * HEIGHT]; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   // 2x downsample + rgb to grayscale
 |  |  |  |   // RGB to greyscale
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |   downsample(src, dst); |  |  |  |   for (int i = 0; i < WIDTH * HEIGHT; i++) { | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     dst[i] = src[i * 3]; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   return dst; |  |  |  |   return dst; | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
	
		
		
			
				
					|  |  | 
 |