mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 09:50:06 +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 | ||||
|            source/scwx/qt/gl/text_shader.cpp) | ||||
| 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) | ||||
| 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) | ||||
| set(HDR_MANAGER source/scwx/qt/manager/radar_product_manager.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 longitude_; ///< Longitude in degrees
 | ||||
| 
 | ||||
|    Coordinate() : Coordinate(0.0, 0.0) {} | ||||
| 
 | ||||
|    Coordinate(double latitude, double longitude) : | ||||
|        latitude_ {latitude}, longitude_ {longitude} | ||||
|    { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat