mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 22:10:05 +00:00 
			
		
		
		
	Fixing placefile line hover offsets
This commit is contained in:
		
							parent
							
								
									8dfb9f1105
								
							
						
					
					
						commit
						5bb5093579
					
				
					 1 changed files with 45 additions and 39 deletions
				
			
		|  | @ -34,10 +34,14 @@ class PlacefileLines::Impl | ||||||
| public: | public: | ||||||
|    struct LineHoverEntry |    struct LineHoverEntry | ||||||
|    { |    { | ||||||
|       std::string hoverText_; |       std::shared_ptr<const gr::Placefile::LineDrawItem> di_; | ||||||
|  | 
 | ||||||
|       glm::vec2 p1_; |       glm::vec2 p1_; | ||||||
|       glm::vec2 p2_; |       glm::vec2 p2_; | ||||||
|       glm::mat2   rotate_; |       glm::vec2 otl_; | ||||||
|  |       glm::vec2 otr_; | ||||||
|  |       glm::vec2 obl_; | ||||||
|  |       glm::vec2 obr_; | ||||||
|       float     width_; |       float     width_; | ||||||
|    }; |    }; | ||||||
| 
 | 
 | ||||||
|  | @ -56,13 +60,14 @@ public: | ||||||
| 
 | 
 | ||||||
|    ~Impl() {} |    ~Impl() {} | ||||||
| 
 | 
 | ||||||
|    void BufferLine(const gr::Placefile::LineDrawItem::Element& e1, |    void BufferLine(const std::shared_ptr<const gr::Placefile::LineDrawItem>& di, | ||||||
|  |                    const gr::Placefile::LineDrawItem::Element&               e1, | ||||||
|                    const gr::Placefile::LineDrawItem::Element&               e2, |                    const gr::Placefile::LineDrawItem::Element&               e2, | ||||||
|                    const float                         width, |                    const float                         width, | ||||||
|                    const units::angle::degrees<double> angle, |                    const units::angle::degrees<double> angle, | ||||||
|                    const boost::gil::rgba8_pixel_t     color, |                    const boost::gil::rgba8_pixel_t     color, | ||||||
|                    const GLint                         threshold, |                    const GLint                         threshold, | ||||||
|                    const std::string&                          hoverText = {}); |                    bool                                bufferHover = false); | ||||||
|    void |    void | ||||||
|    UpdateBuffers(const std::shared_ptr<const gr::Placefile::LineDrawItem>& di); |    UpdateBuffers(const std::shared_ptr<const gr::Placefile::LineDrawItem>& di); | ||||||
|    void Update(); |    void Update(); | ||||||
|  | @ -298,7 +303,7 @@ bool PlacefileLines::RunMousePicking( | ||||||
| 
 | 
 | ||||||
|    // Calculate map scale, remove width and height from original calculation
 |    // Calculate map scale, remove width and height from original calculation
 | ||||||
|    glm::vec2 scale = util::maplibre::GetMapScale(params); |    glm::vec2 scale = util::maplibre::GetMapScale(params); | ||||||
|    scale = 1.0f / glm::vec2 {scale.x * params.width, scale.y * params.height}; |    scale = 2.0f / glm::vec2 {scale.x * params.width, scale.y * params.height}; | ||||||
| 
 | 
 | ||||||
|    // Scale and rotate the identity matrix to create the map matrix
 |    // Scale and rotate the identity matrix to create the map matrix
 | ||||||
|    glm::mat4 mapMatrix {1.0f}; |    glm::mat4 mapMatrix {1.0f}; | ||||||
|  | @ -317,19 +322,12 @@ bool PlacefileLines::RunMousePicking( | ||||||
|       glm::vec2 tr = tl; |       glm::vec2 tr = tl; | ||||||
| 
 | 
 | ||||||
|       // Calculate offsets
 |       // Calculate offsets
 | ||||||
|       // - Offset is half the line width (pixels) in each direction
 |       // - Pre-rotated offset is half the line width (pixels) in each direction
 | ||||||
|       // - Rotate the offset at each vertex
 |       // - Multiply the offset by the scaled and rotated map matrix
 | ||||||
|       // - Multiply the offset by the map matrix
 |       const glm::vec2 otl = mapMatrix * glm::vec4 {line.otl_, 0.0f, 1.0f}; | ||||||
|       const float     hw = line.width_ * 0.5f; |       const glm::vec2 obl = mapMatrix * glm::vec4 {line.obl_, 0.0f, 1.0f}; | ||||||
|       const glm::vec2 otl = |       const glm::vec2 obr = mapMatrix * glm::vec4 {line.obr_, 0.0f, 1.0f}; | ||||||
|          mapMatrix * |       const glm::vec2 otr = mapMatrix * glm::vec4 {line.otr_, 0.0f, 1.0f}; | ||||||
|          glm::vec4 {line.rotate_ * glm::vec2 {-hw, -hw}, 0.0f, 1.0f}; |  | ||||||
|       const glm::vec2 obl = |  | ||||||
|          mapMatrix * glm::vec4 {line.rotate_ * glm::vec2 {-hw, hw}, 0.0f, 1.0f}; |  | ||||||
|       const glm::vec2 obr = |  | ||||||
|          mapMatrix * glm::vec4 {line.rotate_ * glm::vec2 {hw, hw}, 0.0f, 1.0f}; |  | ||||||
|       const glm::vec2 otr = |  | ||||||
|          mapMatrix * glm::vec4 {line.rotate_ * glm::vec2 {hw, -hw}, 0.0f, 1.0f}; |  | ||||||
| 
 | 
 | ||||||
|       // Offset vertices
 |       // Offset vertices
 | ||||||
|       tl += otl; |       tl += otl; | ||||||
|  | @ -343,7 +341,7 @@ bool PlacefileLines::RunMousePicking( | ||||||
|       if (IsPointInPolygon({tl, bl, br, tr}, mousePos)) |       if (IsPointInPolygon({tl, bl, br, tr}, mousePos)) | ||||||
|       { |       { | ||||||
|          itemPicked = true; |          itemPicked = true; | ||||||
|          DrawTooltip(line.hoverText_); |          DrawTooltip(line.di_->hoverText_); | ||||||
|          break; |          break; | ||||||
|       } |       } | ||||||
|    } |    } | ||||||
|  | @ -419,13 +417,14 @@ void PlacefileLines::Impl::UpdateBuffers( | ||||||
|       angles.push_back(angle); |       angles.push_back(angle); | ||||||
| 
 | 
 | ||||||
|       // Buffer line with hover text
 |       // Buffer line with hover text
 | ||||||
|       BufferLine(di->elements_[i], |       BufferLine(di, | ||||||
|  |                  di->elements_[i], | ||||||
|                  di->elements_[i + 1], |                  di->elements_[i + 1], | ||||||
|                  di->width_ + 2, |                  di->width_ + 2, | ||||||
|                  angle, |                  angle, | ||||||
|                  kBlack_, |                  kBlack_, | ||||||
|                  thresholdValue, |                  thresholdValue, | ||||||
|                  di->hoverText_); |                  true); | ||||||
|    } |    } | ||||||
| 
 | 
 | ||||||
|    // For each element pair inside a Line statement, render a colored line
 |    // For each element pair inside a Line statement, render a colored line
 | ||||||
|  | @ -433,7 +432,8 @@ void PlacefileLines::Impl::UpdateBuffers( | ||||||
|    { |    { | ||||||
|       auto angle = angles[i]; |       auto angle = angles[i]; | ||||||
| 
 | 
 | ||||||
|       BufferLine(di->elements_[i], |       BufferLine(di, | ||||||
|  |                  di->elements_[i], | ||||||
|                  di->elements_[i + 1], |                  di->elements_[i + 1], | ||||||
|                  di->width_, |                  di->width_, | ||||||
|                  angle, |                  angle, | ||||||
|  | @ -443,13 +443,14 @@ void PlacefileLines::Impl::UpdateBuffers( | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void PlacefileLines::Impl::BufferLine( | void PlacefileLines::Impl::BufferLine( | ||||||
|  |    const std::shared_ptr<const gr::Placefile::LineDrawItem>& di, | ||||||
|    const gr::Placefile::LineDrawItem::Element&               e1, |    const gr::Placefile::LineDrawItem::Element&               e1, | ||||||
|    const gr::Placefile::LineDrawItem::Element&               e2, |    const gr::Placefile::LineDrawItem::Element&               e2, | ||||||
|    const float                                               width, |    const float                                               width, | ||||||
|    const units::angle::degrees<double>                       angle, |    const units::angle::degrees<double>                       angle, | ||||||
|    const boost::gil::rgba8_pixel_t                           color, |    const boost::gil::rgba8_pixel_t                           color, | ||||||
|    const GLint                                               threshold, |    const GLint                                               threshold, | ||||||
|    const std::string&                          hoverText) |    bool                                                      bufferHover) | ||||||
| { | { | ||||||
|    // Latitude and longitude coordinates in degrees
 |    // Latitude and longitude coordinates in degrees
 | ||||||
|    const float lat1 = static_cast<float>(e1.latitude_); |    const float lat1 = static_cast<float>(e1.latitude_); | ||||||
|  | @ -494,7 +495,7 @@ void PlacefileLines::Impl::BufferLine( | ||||||
|       newThresholdBuffer_.end(), |       newThresholdBuffer_.end(), | ||||||
|       {threshold, threshold, threshold, threshold, threshold, threshold}); |       {threshold, threshold, threshold, threshold, threshold, threshold}); | ||||||
| 
 | 
 | ||||||
|    if (!hoverText.empty()) |    if (bufferHover && !di->hoverText_.empty()) | ||||||
|    { |    { | ||||||
|       const units::angle::radians<double> radians = angle; |       const units::angle::radians<double> radians = angle; | ||||||
| 
 | 
 | ||||||
|  | @ -506,8 +507,13 @@ void PlacefileLines::Impl::BufferLine( | ||||||
| 
 | 
 | ||||||
|       const glm::mat2 rotate {cosAngle, -sinAngle, sinAngle, cosAngle}; |       const glm::mat2 rotate {cosAngle, -sinAngle, sinAngle, cosAngle}; | ||||||
| 
 | 
 | ||||||
|  |       const glm::vec2 otl = rotate * glm::vec2 {-hw, +hw}; | ||||||
|  |       const glm::vec2 otr = rotate * glm::vec2 {+hw, +hw}; | ||||||
|  |       const glm::vec2 obl = rotate * glm::vec2 {-hw, -hw}; | ||||||
|  |       const glm::vec2 obr = rotate * glm::vec2 {+hw, -hw}; | ||||||
|  | 
 | ||||||
|       newHoverLines_.emplace_back( |       newHoverLines_.emplace_back( | ||||||
|          LineHoverEntry {hoverText, sc1, sc2, rotate, width}); |          LineHoverEntry {di, sc1, sc2, otl, otr, obl, obr, width}); | ||||||
|    } |    } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat