mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 13:00:05 +00:00 
			
		
		
		
	Untested geo line implementation without texture
This commit is contained in:
		
							parent
							
								
									bee167764a
								
							
						
					
					
						commit
						7a07e0f698
					
				
					 4 changed files with 322 additions and 0 deletions
				
			
		|  | @ -46,8 +46,10 @@ set(HDR_GL source/scwx/qt/gl/gl.hpp | ||||||
| set(SRC_GL source/scwx/qt/gl/shader_program.cpp | set(SRC_GL source/scwx/qt/gl/shader_program.cpp | ||||||
|            source/scwx/qt/gl/text_shader.cpp) |            source/scwx/qt/gl/text_shader.cpp) | ||||||
| set(HDR_GL_DRAW source/scwx/qt/gl/draw/draw_item.hpp | set(HDR_GL_DRAW source/scwx/qt/gl/draw/draw_item.hpp | ||||||
|  |                 source/scwx/qt/gl/draw/geo_line.hpp | ||||||
|                 source/scwx/qt/gl/draw/rectangle.hpp) |                 source/scwx/qt/gl/draw/rectangle.hpp) | ||||||
| set(SRC_GL_DRAW source/scwx/qt/gl/draw/draw_item.cpp | set(SRC_GL_DRAW source/scwx/qt/gl/draw/draw_item.cpp | ||||||
|  |                 source/scwx/qt/gl/draw/geo_line.cpp | ||||||
|                 source/scwx/qt/gl/draw/rectangle.cpp) |                 source/scwx/qt/gl/draw/rectangle.cpp) | ||||||
| set(HDR_MANAGER source/scwx/qt/manager/radar_product_manager.hpp | set(HDR_MANAGER source/scwx/qt/manager/radar_product_manager.hpp | ||||||
|                 source/scwx/qt/manager/radar_product_manager_notifier.hpp |                 source/scwx/qt/manager/radar_product_manager_notifier.hpp | ||||||
|  |  | ||||||
							
								
								
									
										241
									
								
								scwx-qt/source/scwx/qt/gl/draw/geo_line.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										241
									
								
								scwx-qt/source/scwx/qt/gl/draw/geo_line.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,241 @@ | ||||||
|  | #include <scwx/qt/gl/draw/geo_line.hpp> | ||||||
|  | #include <scwx/common/geographic.hpp> | ||||||
|  | 
 | ||||||
|  | #include <optional> | ||||||
|  | 
 | ||||||
|  | namespace scwx | ||||||
|  | { | ||||||
|  | namespace qt | ||||||
|  | { | ||||||
|  | namespace gl | ||||||
|  | { | ||||||
|  | namespace draw | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | static const std::string logPrefix_ = "scwx::qt::gl::draw::geo_line"; | ||||||
|  | 
 | ||||||
|  | static constexpr size_t kNumRectangles        = 1; | ||||||
|  | static constexpr size_t kNumTriangles         = kNumRectangles * 2; | ||||||
|  | static constexpr size_t kVerticesPerTriangle  = 3; | ||||||
|  | static constexpr size_t kVerticesPerRectangle = kVerticesPerTriangle * 2; | ||||||
|  | static constexpr size_t kPointsPerVertex      = 10; | ||||||
|  | static constexpr size_t kBufferLength = | ||||||
|  |    kNumTriangles * kVerticesPerTriangle * kPointsPerVertex; | ||||||
|  | 
 | ||||||
|  | class GeoLine::Impl | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |    explicit Impl(OpenGLFunctions& gl) : | ||||||
|  |        gl_ {gl}, | ||||||
|  |        dirty_ {false}, | ||||||
|  |        visible_ {true}, | ||||||
|  |        points_ {}, | ||||||
|  |        width_ {1.0f}, | ||||||
|  |        modulateColor_ {std::nullopt}, | ||||||
|  |        vao_ {GL_INVALID_INDEX}, | ||||||
|  |        vbo_ {GL_INVALID_INDEX} | ||||||
|  |    { | ||||||
|  |    } | ||||||
|  | 
 | ||||||
|  |    ~Impl() {} | ||||||
|  | 
 | ||||||
|  |    OpenGLFunctions& gl_; | ||||||
|  | 
 | ||||||
|  |    bool dirty_; | ||||||
|  | 
 | ||||||
|  |    bool                              visible_; | ||||||
|  |    std::array<common::Coordinate, 2> points_; | ||||||
|  |    float                             width_; | ||||||
|  | 
 | ||||||
|  |    std::optional<boost::gil::rgba8_pixel_t> modulateColor_; | ||||||
|  | 
 | ||||||
|  |    // TODO: Texture
 | ||||||
|  | 
 | ||||||
|  |    GLuint vao_; | ||||||
|  |    GLuint vbo_; | ||||||
|  | 
 | ||||||
|  |    void Update(); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | // TODO: OpenGL context with shaders
 | ||||||
|  | GeoLine::GeoLine(OpenGLFunctions& gl) : | ||||||
|  |     DrawItem(), p(std::make_unique<Impl>(gl)) | ||||||
|  | { | ||||||
|  | } | ||||||
|  | GeoLine::~GeoLine() = default; | ||||||
|  | 
 | ||||||
|  | GeoLine::GeoLine(GeoLine&&) noexcept            = default; | ||||||
|  | GeoLine& GeoLine::operator=(GeoLine&&) noexcept = default; | ||||||
|  | 
 | ||||||
|  | void GeoLine::Initialize() | ||||||
|  | { | ||||||
|  |    gl::OpenGLFunctions& gl = p->gl_; | ||||||
|  | 
 | ||||||
|  |    gl.glGenVertexArrays(1, &p->vao_); | ||||||
|  |    gl.glGenBuffers(1, &p->vbo_); | ||||||
|  | 
 | ||||||
|  |    gl.glBindVertexArray(p->vao_); | ||||||
|  |    gl.glBindBuffer(GL_ARRAY_BUFFER, p->vbo_); | ||||||
|  |    gl.glBufferData( | ||||||
|  |       GL_ARRAY_BUFFER, sizeof(float) * kBufferLength, nullptr, GL_DYNAMIC_DRAW); | ||||||
|  | 
 | ||||||
|  |    // aLatLong
 | ||||||
|  |    gl.glVertexAttribPointer(0, | ||||||
|  |                             2, | ||||||
|  |                             GL_FLOAT, | ||||||
|  |                             GL_FALSE, | ||||||
|  |                             kPointsPerVertex * sizeof(float), | ||||||
|  |                             static_cast<void*>(0)); | ||||||
|  |    gl.glEnableVertexAttribArray(0); | ||||||
|  | 
 | ||||||
|  |    // aXYOffset
 | ||||||
|  |    gl.glVertexAttribPointer(1, | ||||||
|  |                             2, | ||||||
|  |                             GL_FLOAT, | ||||||
|  |                             GL_FALSE, | ||||||
|  |                             kPointsPerVertex * sizeof(float), | ||||||
|  |                             reinterpret_cast<void*>(2 * sizeof(float))); | ||||||
|  |    gl.glEnableVertexAttribArray(1); | ||||||
|  | 
 | ||||||
|  |    // aTexCoord
 | ||||||
|  |    gl.glVertexAttribPointer(2, | ||||||
|  |                             2, | ||||||
|  |                             GL_FLOAT, | ||||||
|  |                             GL_FALSE, | ||||||
|  |                             kPointsPerVertex * sizeof(float), | ||||||
|  |                             reinterpret_cast<void*>(4 * sizeof(float))); | ||||||
|  |    gl.glEnableVertexAttribArray(2); | ||||||
|  | 
 | ||||||
|  |    // aModulate
 | ||||||
|  |    gl.glVertexAttribPointer(3, | ||||||
|  |                             4, | ||||||
|  |                             GL_FLOAT, | ||||||
|  |                             GL_FALSE, | ||||||
|  |                             kPointsPerVertex * sizeof(float), | ||||||
|  |                             reinterpret_cast<void*>(6 * sizeof(float))); | ||||||
|  |    gl.glEnableVertexAttribArray(3); | ||||||
|  | 
 | ||||||
|  |    p->dirty_ = true; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void GeoLine::Render() | ||||||
|  | { | ||||||
|  |    if (p->visible_) | ||||||
|  |    { | ||||||
|  |       gl::OpenGLFunctions& gl = p->gl_; | ||||||
|  | 
 | ||||||
|  |       gl.glBindVertexArray(p->vao_); | ||||||
|  |       gl.glBindBuffer(GL_ARRAY_BUFFER, p->vbo_); | ||||||
|  | 
 | ||||||
|  |       p->Update(); | ||||||
|  | 
 | ||||||
|  |       // Draw line
 | ||||||
|  |       gl.glDrawArrays(GL_TRIANGLES, 0, 6); | ||||||
|  |    } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void GeoLine::Deinitialize() | ||||||
|  | { | ||||||
|  |    gl::OpenGLFunctions& gl = p->gl_; | ||||||
|  | 
 | ||||||
|  |    gl.glDeleteVertexArrays(1, &p->vao_); | ||||||
|  |    gl.glDeleteBuffers(1, &p->vbo_); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void GeoLine::SetPoints(float latitude1, | ||||||
|  |                         float longitude1, | ||||||
|  |                         float latitude2, | ||||||
|  |                         float longitude2) | ||||||
|  | { | ||||||
|  |    if (p->points_[0].latitude_ != latitude1 || | ||||||
|  |        p->points_[0].longitude_ != longitude1 || | ||||||
|  |        p->points_[1].latitude_ != latitude2 || | ||||||
|  |        p->points_[1].longitude_ != longitude2) | ||||||
|  |    { | ||||||
|  |       p->points_[0] = {latitude1, longitude1}; | ||||||
|  |       p->points_[1] = {latitude2, longitude2}; | ||||||
|  |       p->dirty_     = true; | ||||||
|  |    } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void GeoLine::SetModulateColor(boost::gil::rgba8_pixel_t color) | ||||||
|  | { | ||||||
|  |    if (p->modulateColor_ != color) | ||||||
|  |    { | ||||||
|  |       p->modulateColor_ = color; | ||||||
|  |       p->dirty_         = true; | ||||||
|  |    } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void GeoLine::SetWidth(float width) | ||||||
|  | { | ||||||
|  |    if (p->width_ != width) | ||||||
|  |    { | ||||||
|  |       p->width_ = width; | ||||||
|  |       p->dirty_ = true; | ||||||
|  |    } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void GeoLine::SetVisible(bool visible) | ||||||
|  | { | ||||||
|  |    p->visible_ = visible; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void GeoLine::Impl::Update() | ||||||
|  | { | ||||||
|  |    if (dirty_) | ||||||
|  |    { | ||||||
|  |       gl::OpenGLFunctions& gl = gl_; | ||||||
|  | 
 | ||||||
|  |       const float lx = points_[0].latitude_; | ||||||
|  |       const float rx = points_[1].latitude_; | ||||||
|  |       const float by = points_[0].longitude_; | ||||||
|  |       const float ty = points_[1].longitude_; | ||||||
|  | 
 | ||||||
|  |       const double i     = points_[1].longitude_ - points_[0].longitude_; | ||||||
|  |       const double j     = points_[1].latitude_ - points_[0].latitude_; | ||||||
|  |       const double angle = std::atan2(i, j) * 180.0 / M_PI; | ||||||
|  |       const float  ox    = width_ * 0.5f * std::cosf(angle); | ||||||
|  |       const float  oy    = width_ * 0.5f * std::sinf(angle); | ||||||
|  | 
 | ||||||
|  |       float mc0 = 1.0f; | ||||||
|  |       float mc1 = 1.0f; | ||||||
|  |       float mc2 = 1.0f; | ||||||
|  |       float mc3 = 1.0f; | ||||||
|  | 
 | ||||||
|  |       if (modulateColor_.has_value()) | ||||||
|  |       { | ||||||
|  |          boost::gil::rgba8_pixel_t& mc = modulateColor_.value(); | ||||||
|  | 
 | ||||||
|  |          mc0 = mc[0] / 255.0f; | ||||||
|  |          mc1 = mc[1] / 255.0f; | ||||||
|  |          mc2 = mc[2] / 255.0f; | ||||||
|  |          mc3 = mc[3] / 255.0f; | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       const float buffer[kNumRectangles][kVerticesPerRectangle] | ||||||
|  |                         [kPointsPerVertex] = //
 | ||||||
|  |          {                                   //
 | ||||||
|  |           // Line
 | ||||||
|  |           { | ||||||
|  |              {lx, by, -ox, -oy, 0.0f, 0.0f, mc0, mc1, mc2, mc3}, // BL
 | ||||||
|  |              {lx, by, +ox, +oy, 0.0f, 1.0f, mc0, mc1, mc2, mc3}, // TL
 | ||||||
|  |              {rx, ty, -ox, -oy, 1.0f, 0.0f, mc0, mc1, mc2, mc3}, // BR
 | ||||||
|  |              {rx, ty, -ox, -oy, 1.0f, 0.0f, mc0, mc1, mc2, mc3}, // BR
 | ||||||
|  |              {rx, ty, +ox, +oy, 1.0f, 1.0f, mc0, mc1, mc2, mc3}, // TR
 | ||||||
|  |              {lx, by, +ox, +oy, 0.0f, 1.0f, mc0, mc1, mc2, mc3}  // TL
 | ||||||
|  |           }}; | ||||||
|  | 
 | ||||||
|  |       gl.glBufferData(GL_ARRAY_BUFFER, | ||||||
|  |                       sizeof(float) * kBufferLength, | ||||||
|  |                       buffer, | ||||||
|  |                       GL_DYNAMIC_DRAW); | ||||||
|  | 
 | ||||||
|  |       dirty_ = false; | ||||||
|  |    } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | } // namespace draw
 | ||||||
|  | } // namespace gl
 | ||||||
|  | } // namespace qt
 | ||||||
|  | } // namespace scwx
 | ||||||
							
								
								
									
										77
									
								
								scwx-qt/source/scwx/qt/gl/draw/geo_line.hpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								scwx-qt/source/scwx/qt/gl/draw/geo_line.hpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,77 @@ | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include <scwx/qt/gl/gl.hpp> | ||||||
|  | #include <scwx/qt/gl/draw/draw_item.hpp> | ||||||
|  | 
 | ||||||
|  | #include <boost/gil.hpp> | ||||||
|  | 
 | ||||||
|  | namespace scwx | ||||||
|  | { | ||||||
|  | namespace qt | ||||||
|  | { | ||||||
|  | namespace gl | ||||||
|  | { | ||||||
|  | namespace draw | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | class GeoLine : public DrawItem | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |    explicit GeoLine(OpenGLFunctions& gl); | ||||||
|  |    ~GeoLine(); | ||||||
|  | 
 | ||||||
|  |    GeoLine(const GeoLine&)            = delete; | ||||||
|  |    GeoLine& operator=(const GeoLine&) = delete; | ||||||
|  | 
 | ||||||
|  |    GeoLine(GeoLine&&) noexcept; | ||||||
|  |    GeoLine& operator=(GeoLine&&) noexcept; | ||||||
|  | 
 | ||||||
|  |    void Initialize() override; | ||||||
|  |    void Render() override; | ||||||
|  |    void Deinitialize() override; | ||||||
|  | 
 | ||||||
|  |    /**
 | ||||||
|  |     * Sets the geographic coordinate endpoints associated with the line. | ||||||
|  |     * | ||||||
|  |     * @param latitude1 Latitude of the first endpoint in degrees | ||||||
|  |     * @param longitude1 Longitude of the first endpoint in degrees | ||||||
|  |     * @param latitude2 Latitude of the second endpoint in degrees | ||||||
|  |     * @param longitude2 Longitude of the second endpoint in degrees | ||||||
|  |     */ | ||||||
|  |    void SetPoints(float latitude1, | ||||||
|  |                   float longitude1, | ||||||
|  |                   float latitude2, | ||||||
|  |                   float longitude2); | ||||||
|  | 
 | ||||||
|  |    /**
 | ||||||
|  |     * Sets the modulate color of the line. If specified, the texture color will | ||||||
|  |     * be multiplied by the modulate color to produce the result. | ||||||
|  |     * | ||||||
|  |     * @param color Modulate color (RGBA) | ||||||
|  |     */ | ||||||
|  |    void SetModulateColor(boost::gil::rgba8_pixel_t color); | ||||||
|  | 
 | ||||||
|  |    /**
 | ||||||
|  |     * Sets the width of the line. | ||||||
|  |     * | ||||||
|  |     * @param width Width in pixels | ||||||
|  |     */ | ||||||
|  |    void SetWidth(float width); | ||||||
|  | 
 | ||||||
|  |    /**
 | ||||||
|  |     * Sets the visibility of the line. | ||||||
|  |     * | ||||||
|  |     * @param visible | ||||||
|  |     */ | ||||||
|  |    void SetVisible(bool visible); | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  |    class Impl; | ||||||
|  | 
 | ||||||
|  |    std::unique_ptr<Impl> p; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } // namespace draw
 | ||||||
|  | } // namespace gl
 | ||||||
|  | } // namespace qt
 | ||||||
|  | } // namespace scwx
 | ||||||
|  | @ -13,6 +13,8 @@ struct Coordinate | ||||||
|    double latitude_;  ///< Latitude in degrees
 |    double latitude_;  ///< Latitude in degrees
 | ||||||
|    double longitude_; ///< Longitude in degrees
 |    double longitude_; ///< Longitude in degrees
 | ||||||
| 
 | 
 | ||||||
|  |    Coordinate() : Coordinate(0.0, 0.0) {} | ||||||
|  | 
 | ||||||
|    Coordinate(double latitude, double longitude) : |    Coordinate(double latitude, double longitude) : | ||||||
|        latitude_ {latitude}, longitude_ {longitude} |        latitude_ {latitude}, longitude_ {longitude} | ||||||
|    { |    { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat