mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 01:50:06 +00:00 
			
		
		
		
	Use GLEW instead of QOpenGLFunctions
This commit is contained in:
		
							parent
							
								
									4bd749d976
								
							
						
					
					
						commit
						331b2d855f
					
				
					 33 changed files with 788 additions and 959 deletions
				
			
		|  | @ -30,13 +30,11 @@ static const std::string logPrefix_ = "scwx::qt::gl::draw::draw_item"; | |||
| class DrawItem::Impl | ||||
| { | ||||
| public: | ||||
|    explicit Impl(OpenGLFunctions& gl) : gl_ {gl} {} | ||||
|    explicit Impl() {} | ||||
|    ~Impl() {} | ||||
| 
 | ||||
|    OpenGLFunctions& gl_; | ||||
| }; | ||||
| 
 | ||||
| DrawItem::DrawItem(OpenGLFunctions& gl) : p(std::make_unique<Impl>(gl)) {} | ||||
| DrawItem::DrawItem() : p(std::make_unique<Impl>()) {} | ||||
| DrawItem::~DrawItem() = default; | ||||
| 
 | ||||
| DrawItem::DrawItem(DrawItem&&) noexcept            = default; | ||||
|  | @ -74,7 +72,7 @@ void DrawItem::UseDefaultProjection( | |||
|                                      0.0f, | ||||
|                                      static_cast<float>(params.height)); | ||||
| 
 | ||||
|    p->gl_.glUniformMatrix4fv( | ||||
|    glUniformMatrix4fv( | ||||
|       uMVPMatrixLocation, 1, GL_FALSE, glm::value_ptr(projection)); | ||||
| } | ||||
| 
 | ||||
|  | @ -91,7 +89,7 @@ void DrawItem::UseRotationProjection( | |||
|                             glm::radians<float>(params.bearing), | ||||
|                             glm::vec3(0.0f, 0.0f, 1.0f)); | ||||
| 
 | ||||
|    p->gl_.glUniformMatrix4fv( | ||||
|    glUniformMatrix4fv( | ||||
|       uMVPMatrixLocation, 1, GL_FALSE, glm::value_ptr(projection)); | ||||
| } | ||||
| 
 | ||||
|  | @ -100,16 +98,14 @@ void DrawItem::UseMapProjection( | |||
|    GLint                                         uMVPMatrixLocation, | ||||
|    GLint                                         uMapScreenCoordLocation) | ||||
| { | ||||
|    OpenGLFunctions& gl = p->gl_; | ||||
| 
 | ||||
|    const glm::mat4 uMVPMatrix = util::maplibre::GetMapMatrix(params); | ||||
| 
 | ||||
|    gl.glUniform2fv(uMapScreenCoordLocation, | ||||
|                    1, | ||||
|                    glm::value_ptr(util::maplibre::LatLongToScreenCoordinate( | ||||
|                       {params.latitude, params.longitude}))); | ||||
|    glUniform2fv(uMapScreenCoordLocation, | ||||
|                 1, | ||||
|                 glm::value_ptr(util::maplibre::LatLongToScreenCoordinate( | ||||
|                    {params.latitude, params.longitude}))); | ||||
| 
 | ||||
|    gl.glUniformMatrix4fv( | ||||
|    glUniformMatrix4fv( | ||||
|       uMVPMatrixLocation, 1, GL_FALSE, glm::value_ptr(uMVPMatrix)); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -21,7 +21,7 @@ namespace draw | |||
| class DrawItem | ||||
| { | ||||
| public: | ||||
|    explicit DrawItem(OpenGLFunctions& gl); | ||||
|    explicit DrawItem(); | ||||
|    virtual ~DrawItem(); | ||||
| 
 | ||||
|    DrawItem(const DrawItem&)            = delete; | ||||
|  |  | |||
|  | @ -144,7 +144,7 @@ public: | |||
| }; | ||||
| 
 | ||||
| GeoIcons::GeoIcons(const std::shared_ptr<GlContext>& context) : | ||||
|     DrawItem(context->gl()), p(std::make_unique<Impl>(context)) | ||||
|     DrawItem(), p(std::make_unique<Impl>(context)) | ||||
| { | ||||
| } | ||||
| GeoIcons::~GeoIcons() = default; | ||||
|  | @ -165,8 +165,6 @@ void GeoIcons::set_thresholded(bool thresholded) | |||
| 
 | ||||
| void GeoIcons::Initialize() | ||||
| { | ||||
|    gl::OpenGLFunctions& gl = p->context_->gl(); | ||||
| 
 | ||||
|    p->shaderProgram_ = p->context_->GetShaderProgram( | ||||
|       {{GL_VERTEX_SHADER, ":/gl/geo_texture2d.vert"}, | ||||
|        {GL_GEOMETRY_SHADER, ":/gl/threshold.geom"}, | ||||
|  | @ -181,87 +179,87 @@ void GeoIcons::Initialize() | |||
|    p->uSelectedTimeLocation_ = | ||||
|       p->shaderProgram_->GetUniformLocation("uSelectedTime"); | ||||
| 
 | ||||
|    gl.glGenVertexArrays(1, &p->vao_); | ||||
|    gl.glGenBuffers(static_cast<GLsizei>(p->vbo_.size()), p->vbo_.data()); | ||||
|    glGenVertexArrays(1, &p->vao_); | ||||
|    glGenBuffers(static_cast<GLsizei>(p->vbo_.size()), p->vbo_.data()); | ||||
| 
 | ||||
|    gl.glBindVertexArray(p->vao_); | ||||
|    gl.glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[0]); | ||||
|    gl.glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
|    glBindVertexArray(p->vao_); | ||||
|    glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[0]); | ||||
|    glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|    // aLatLong
 | ||||
|    gl.glVertexAttribPointer(0, | ||||
|                             2, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerVertex * sizeof(float), | ||||
|                             static_cast<void*>(0)); | ||||
|    gl.glEnableVertexAttribArray(0); | ||||
|    glVertexAttribPointer(0, | ||||
|                          2, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerVertex * sizeof(float), | ||||
|                          static_cast<void*>(0)); | ||||
|    glEnableVertexAttribArray(0); | ||||
| 
 | ||||
|    // aXYOffset
 | ||||
|    gl.glVertexAttribPointer(1, | ||||
|                             2, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerVertex * sizeof(float), | ||||
|                             reinterpret_cast<void*>(2 * sizeof(float))); | ||||
|    gl.glEnableVertexAttribArray(1); | ||||
|    glVertexAttribPointer(1, | ||||
|                          2, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerVertex * sizeof(float), | ||||
|                          reinterpret_cast<void*>(2 * sizeof(float))); | ||||
|    glEnableVertexAttribArray(1); | ||||
| 
 | ||||
|    // aModulate
 | ||||
|    gl.glVertexAttribPointer(3, | ||||
|                             4, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerVertex * sizeof(float), | ||||
|                             reinterpret_cast<void*>(4 * sizeof(float))); | ||||
|    gl.glEnableVertexAttribArray(3); | ||||
|    glVertexAttribPointer(3, | ||||
|                          4, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerVertex * sizeof(float), | ||||
|                          reinterpret_cast<void*>(4 * sizeof(float))); | ||||
|    glEnableVertexAttribArray(3); | ||||
| 
 | ||||
|    // aAngle
 | ||||
|    gl.glVertexAttribPointer(4, | ||||
|                             1, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerVertex * sizeof(float), | ||||
|                             reinterpret_cast<void*>(8 * sizeof(float))); | ||||
|    gl.glEnableVertexAttribArray(4); | ||||
|    glVertexAttribPointer(4, | ||||
|                          1, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerVertex * sizeof(float), | ||||
|                          reinterpret_cast<void*>(8 * sizeof(float))); | ||||
|    glEnableVertexAttribArray(4); | ||||
| 
 | ||||
|    gl.glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[1]); | ||||
|    gl.glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
|    glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[1]); | ||||
|    glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|    // aTexCoord
 | ||||
|    gl.glVertexAttribPointer(2, | ||||
|                             3, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerTexCoord * sizeof(float), | ||||
|                             static_cast<void*>(0)); | ||||
|    gl.glEnableVertexAttribArray(2); | ||||
|    glVertexAttribPointer(2, | ||||
|                          3, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerTexCoord * sizeof(float), | ||||
|                          static_cast<void*>(0)); | ||||
|    glEnableVertexAttribArray(2); | ||||
| 
 | ||||
|    gl.glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[2]); | ||||
|    gl.glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
|    glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[2]); | ||||
|    glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|    // aThreshold
 | ||||
|    gl.glVertexAttribIPointer(5, //
 | ||||
|                              1, | ||||
|                              GL_INT, | ||||
|                              0, | ||||
|                              static_cast<void*>(0)); | ||||
|    gl.glEnableVertexAttribArray(5); | ||||
|    glVertexAttribIPointer(5, //
 | ||||
|                           1, | ||||
|                           GL_INT, | ||||
|                           0, | ||||
|                           static_cast<void*>(0)); | ||||
|    glEnableVertexAttribArray(5); | ||||
| 
 | ||||
|    // aTimeRange
 | ||||
|    gl.glVertexAttribIPointer(6, //
 | ||||
|                              2, | ||||
|                              GL_INT, | ||||
|                              kIntegersPerVertex_ * sizeof(GLint), | ||||
|                              reinterpret_cast<void*>(1 * sizeof(GLint))); | ||||
|    gl.glEnableVertexAttribArray(6); | ||||
|    glVertexAttribIPointer(6, //
 | ||||
|                           2, | ||||
|                           GL_INT, | ||||
|                           kIntegersPerVertex_ * sizeof(GLint), | ||||
|                           reinterpret_cast<void*>(1 * sizeof(GLint))); | ||||
|    glEnableVertexAttribArray(6); | ||||
| 
 | ||||
|    // aDisplayed
 | ||||
|    gl.glVertexAttribIPointer(7, | ||||
|                              1, | ||||
|                              GL_INT, | ||||
|                              kIntegersPerVertex_ * sizeof(GLint), | ||||
|                              reinterpret_cast<void*>(3 * sizeof(GLint))); | ||||
|    gl.glEnableVertexAttribArray(7); | ||||
|    glVertexAttribIPointer(7, | ||||
|                           1, | ||||
|                           GL_INT, | ||||
|                           kIntegersPerVertex_ * sizeof(GLint), | ||||
|                           reinterpret_cast<void*>(3 * sizeof(GLint))); | ||||
|    glEnableVertexAttribArray(7); | ||||
| 
 | ||||
|    p->dirty_ = true; | ||||
| } | ||||
|  | @ -283,9 +281,7 @@ void GeoIcons::Render(const QMapLibre::CustomLayerRenderParameters& params, | |||
| 
 | ||||
|    if (!p->currentIconList_.empty()) | ||||
|    { | ||||
|       gl::OpenGLFunctions& gl = p->context_->gl(); | ||||
| 
 | ||||
|       gl.glBindVertexArray(p->vao_); | ||||
|       glBindVertexArray(p->vao_); | ||||
| 
 | ||||
|       p->Update(textureAtlasChanged); | ||||
|       p->shaderProgram_->Use(); | ||||
|  | @ -298,12 +294,12 @@ void GeoIcons::Render(const QMapLibre::CustomLayerRenderParameters& params, | |||
|          // If thresholding is enabled, set the map distance
 | ||||
|          units::length::nautical_miles<float> mapDistance = | ||||
|             util::maplibre::GetMapDistance(params); | ||||
|          gl.glUniform1f(p->uMapDistanceLocation_, mapDistance.value()); | ||||
|          glUniform1f(p->uMapDistanceLocation_, mapDistance.value()); | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|          // If thresholding is disabled, set the map distance to 0
 | ||||
|          gl.glUniform1f(p->uMapDistanceLocation_, 0.0f); | ||||
|          glUniform1f(p->uMapDistanceLocation_, 0.0f); | ||||
|       } | ||||
| 
 | ||||
|       // Selected time
 | ||||
|  | @ -311,27 +307,25 @@ void GeoIcons::Render(const QMapLibre::CustomLayerRenderParameters& params, | |||
|          (p->selectedTime_ == std::chrono::system_clock::time_point {}) ? | ||||
|             std::chrono::system_clock::now() : | ||||
|             p->selectedTime_; | ||||
|       gl.glUniform1i( | ||||
|       glUniform1i( | ||||
|          p->uSelectedTimeLocation_, | ||||
|          static_cast<GLint>(std::chrono::duration_cast<std::chrono::minutes>( | ||||
|                                selectedTime.time_since_epoch()) | ||||
|                                .count())); | ||||
| 
 | ||||
|       // Interpolate texture coordinates
 | ||||
|       gl.glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | ||||
|       gl.glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | ||||
|       glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | ||||
|       glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | ||||
| 
 | ||||
|       // Draw icons
 | ||||
|       gl.glDrawArrays(GL_TRIANGLES, 0, p->numVertices_); | ||||
|       glDrawArrays(GL_TRIANGLES, 0, p->numVertices_); | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| void GeoIcons::Deinitialize() | ||||
| { | ||||
|    gl::OpenGLFunctions& gl = p->context_->gl(); | ||||
| 
 | ||||
|    gl.glDeleteVertexArrays(1, &p->vao_); | ||||
|    gl.glDeleteBuffers(static_cast<GLsizei>(p->vbo_.size()), p->vbo_.data()); | ||||
|    glDeleteVertexArrays(1, &p->vao_); | ||||
|    glDeleteBuffers(static_cast<GLsizei>(p->vbo_.size()), p->vbo_.data()); | ||||
| 
 | ||||
|    std::unique_lock lock {p->iconMutex_}; | ||||
| 
 | ||||
|  | @ -847,8 +841,6 @@ void GeoIcons::Impl::UpdateModifiedIconBuffers() | |||
| 
 | ||||
| void GeoIcons::Impl::Update(bool textureAtlasChanged) | ||||
| { | ||||
|    gl::OpenGLFunctions& gl = context_->gl(); | ||||
| 
 | ||||
|    UpdateModifiedIconBuffers(); | ||||
| 
 | ||||
|    // If the texture atlas has changed
 | ||||
|  | @ -864,11 +856,11 @@ void GeoIcons::Impl::Update(bool textureAtlasChanged) | |||
|       UpdateTextureBuffer(); | ||||
| 
 | ||||
|       // Buffer texture data
 | ||||
|       gl.glBindBuffer(GL_ARRAY_BUFFER, vbo_[1]); | ||||
|       gl.glBufferData(GL_ARRAY_BUFFER, | ||||
|                       sizeof(float) * textureBuffer_.size(), | ||||
|                       textureBuffer_.data(), | ||||
|                       GL_DYNAMIC_DRAW); | ||||
|       glBindBuffer(GL_ARRAY_BUFFER, vbo_[1]); | ||||
|       glBufferData(GL_ARRAY_BUFFER, | ||||
|                    sizeof(float) * textureBuffer_.size(), | ||||
|                    textureBuffer_.data(), | ||||
|                    GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|       lastTextureAtlasChanged_ = false; | ||||
|    } | ||||
|  | @ -877,18 +869,18 @@ void GeoIcons::Impl::Update(bool textureAtlasChanged) | |||
|    if (dirty_) | ||||
|    { | ||||
|       // Buffer vertex data
 | ||||
|       gl.glBindBuffer(GL_ARRAY_BUFFER, vbo_[0]); | ||||
|       gl.glBufferData(GL_ARRAY_BUFFER, | ||||
|                       sizeof(float) * currentIconBuffer_.size(), | ||||
|                       currentIconBuffer_.data(), | ||||
|                       GL_DYNAMIC_DRAW); | ||||
|       glBindBuffer(GL_ARRAY_BUFFER, vbo_[0]); | ||||
|       glBufferData(GL_ARRAY_BUFFER, | ||||
|                    sizeof(float) * currentIconBuffer_.size(), | ||||
|                    currentIconBuffer_.data(), | ||||
|                    GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|       // Buffer threshold data
 | ||||
|       gl.glBindBuffer(GL_ARRAY_BUFFER, vbo_[2]); | ||||
|       gl.glBufferData(GL_ARRAY_BUFFER, | ||||
|                       sizeof(GLint) * currentIntegerBuffer_.size(), | ||||
|                       currentIntegerBuffer_.data(), | ||||
|                       GL_DYNAMIC_DRAW); | ||||
|       glBindBuffer(GL_ARRAY_BUFFER, vbo_[2]); | ||||
|       glBufferData(GL_ARRAY_BUFFER, | ||||
|                    sizeof(GLint) * currentIntegerBuffer_.size(), | ||||
|                    currentIntegerBuffer_.data(), | ||||
|                    GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|       numVertices_ = | ||||
|          static_cast<GLsizei>(currentIconBuffer_.size() / kPointsPerVertex); | ||||
|  |  | |||
|  | @ -130,7 +130,7 @@ public: | |||
| }; | ||||
| 
 | ||||
| GeoLines::GeoLines(std::shared_ptr<GlContext> context) : | ||||
|     DrawItem(context->gl()), p(std::make_unique<Impl>(context)) | ||||
|     DrawItem(), p(std::make_unique<Impl>(context)) | ||||
| { | ||||
| } | ||||
| GeoLines::~GeoLines() = default; | ||||
|  | @ -151,8 +151,6 @@ void GeoLines::set_thresholded(bool thresholded) | |||
| 
 | ||||
| void GeoLines::Initialize() | ||||
| { | ||||
|    gl::OpenGLFunctions& gl = p->context_->gl(); | ||||
| 
 | ||||
|    p->shaderProgram_ = p->context_->GetShaderProgram( | ||||
|       {{GL_VERTEX_SHADER, ":/gl/geo_texture2d.vert"}, | ||||
|        {GL_GEOMETRY_SHADER, ":/gl/threshold.geom"}, | ||||
|  | @ -167,78 +165,78 @@ void GeoLines::Initialize() | |||
|    p->uSelectedTimeLocation_ = | ||||
|       p->shaderProgram_->GetUniformLocation("uSelectedTime"); | ||||
| 
 | ||||
|    gl.glGenVertexArrays(1, &p->vao_); | ||||
|    gl.glGenBuffers(static_cast<GLsizei>(p->vbo_.size()), p->vbo_.data()); | ||||
|    glGenVertexArrays(1, &p->vao_); | ||||
|    glGenBuffers(static_cast<GLsizei>(p->vbo_.size()), p->vbo_.data()); | ||||
| 
 | ||||
|    gl.glBindVertexArray(p->vao_); | ||||
|    gl.glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[0]); | ||||
|    gl.glBufferData(GL_ARRAY_BUFFER, | ||||
|                    sizeof(float) * kLineBufferLength_, | ||||
|                    nullptr, | ||||
|                    GL_DYNAMIC_DRAW); | ||||
|    glBindVertexArray(p->vao_); | ||||
|    glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[0]); | ||||
|    glBufferData(GL_ARRAY_BUFFER, | ||||
|                 sizeof(float) * kLineBufferLength_, | ||||
|                 nullptr, | ||||
|                 GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|    // aLatLong
 | ||||
|    gl.glVertexAttribPointer(0, | ||||
|                             2, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerVertex * sizeof(float), | ||||
|                             static_cast<void*>(0)); | ||||
|    gl.glEnableVertexAttribArray(0); | ||||
|    glVertexAttribPointer(0, | ||||
|                          2, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerVertex * sizeof(float), | ||||
|                          static_cast<void*>(0)); | ||||
|    glEnableVertexAttribArray(0); | ||||
| 
 | ||||
|    // aXYOffset
 | ||||
|    gl.glVertexAttribPointer(1, | ||||
|                             2, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerVertex * sizeof(float), | ||||
|                             reinterpret_cast<void*>(2 * sizeof(float))); | ||||
|    gl.glEnableVertexAttribArray(1); | ||||
|    glVertexAttribPointer(1, | ||||
|                          2, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerVertex * sizeof(float), | ||||
|                          reinterpret_cast<void*>(2 * sizeof(float))); | ||||
|    glEnableVertexAttribArray(1); | ||||
| 
 | ||||
|    // aModulate
 | ||||
|    gl.glVertexAttribPointer(3, | ||||
|                             4, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerVertex * sizeof(float), | ||||
|                             reinterpret_cast<void*>(4 * sizeof(float))); | ||||
|    gl.glEnableVertexAttribArray(3); | ||||
|    glVertexAttribPointer(3, | ||||
|                          4, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerVertex * sizeof(float), | ||||
|                          reinterpret_cast<void*>(4 * sizeof(float))); | ||||
|    glEnableVertexAttribArray(3); | ||||
| 
 | ||||
|    // aAngle
 | ||||
|    gl.glVertexAttribPointer(4, | ||||
|                             1, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerVertex * sizeof(float), | ||||
|                             reinterpret_cast<void*>(8 * sizeof(float))); | ||||
|    gl.glEnableVertexAttribArray(4); | ||||
|    glVertexAttribPointer(4, | ||||
|                          1, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerVertex * sizeof(float), | ||||
|                          reinterpret_cast<void*>(8 * sizeof(float))); | ||||
|    glEnableVertexAttribArray(4); | ||||
| 
 | ||||
|    gl.glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[1]); | ||||
|    gl.glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
|    glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[1]); | ||||
|    glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|    // aThreshold
 | ||||
|    gl.glVertexAttribIPointer(5, //
 | ||||
|                              1, | ||||
|                              GL_INT, | ||||
|                              kIntegersPerVertex_ * sizeof(GLint), | ||||
|                              static_cast<void*>(0)); | ||||
|    gl.glEnableVertexAttribArray(5); | ||||
|    glVertexAttribIPointer(5, //
 | ||||
|                           1, | ||||
|                           GL_INT, | ||||
|                           kIntegersPerVertex_ * sizeof(GLint), | ||||
|                           static_cast<void*>(0)); | ||||
|    glEnableVertexAttribArray(5); | ||||
| 
 | ||||
|    // aTimeRange
 | ||||
|    gl.glVertexAttribIPointer(6, //
 | ||||
|                              2, | ||||
|                              GL_INT, | ||||
|                              kIntegersPerVertex_ * sizeof(GLint), | ||||
|                              reinterpret_cast<void*>(1 * sizeof(GLint))); | ||||
|    gl.glEnableVertexAttribArray(6); | ||||
|    glVertexAttribIPointer(6, //
 | ||||
|                           2, | ||||
|                           GL_INT, | ||||
|                           kIntegersPerVertex_ * sizeof(GLint), | ||||
|                           reinterpret_cast<void*>(1 * sizeof(GLint))); | ||||
|    glEnableVertexAttribArray(6); | ||||
| 
 | ||||
|    // aDisplayed
 | ||||
|    gl.glVertexAttribIPointer(7, | ||||
|                              1, | ||||
|                              GL_INT, | ||||
|                              kIntegersPerVertex_ * sizeof(GLint), | ||||
|                              reinterpret_cast<void*>(3 * sizeof(GLint))); | ||||
|    gl.glEnableVertexAttribArray(7); | ||||
|    glVertexAttribIPointer(7, | ||||
|                           1, | ||||
|                           GL_INT, | ||||
|                           kIntegersPerVertex_ * sizeof(GLint), | ||||
|                           reinterpret_cast<void*>(3 * sizeof(GLint))); | ||||
|    glEnableVertexAttribArray(7); | ||||
| 
 | ||||
|    p->dirty_ = true; | ||||
| } | ||||
|  | @ -254,9 +252,7 @@ void GeoLines::Render(const QMapLibre::CustomLayerRenderParameters& params) | |||
| 
 | ||||
|    if (p->newLineList_.size() > 0) | ||||
|    { | ||||
|       gl::OpenGLFunctions& gl = p->context_->gl(); | ||||
| 
 | ||||
|       gl.glBindVertexArray(p->vao_); | ||||
|       glBindVertexArray(p->vao_); | ||||
| 
 | ||||
|       p->Update(); | ||||
|       p->shaderProgram_->Use(); | ||||
|  | @ -269,12 +265,12 @@ void GeoLines::Render(const QMapLibre::CustomLayerRenderParameters& params) | |||
|          // If thresholding is enabled, set the map distance
 | ||||
|          units::length::nautical_miles<float> mapDistance = | ||||
|             util::maplibre::GetMapDistance(params); | ||||
|          gl.glUniform1f(p->uMapDistanceLocation_, mapDistance.value()); | ||||
|          glUniform1f(p->uMapDistanceLocation_, mapDistance.value()); | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|          // If thresholding is disabled, set the map distance to 0
 | ||||
|          gl.glUniform1f(p->uMapDistanceLocation_, 0.0f); | ||||
|          glUniform1f(p->uMapDistanceLocation_, 0.0f); | ||||
|       } | ||||
| 
 | ||||
|       // Selected time
 | ||||
|  | @ -282,26 +278,24 @@ void GeoLines::Render(const QMapLibre::CustomLayerRenderParameters& params) | |||
|          (p->selectedTime_ == std::chrono::system_clock::time_point {}) ? | ||||
|             std::chrono::system_clock::now() : | ||||
|             p->selectedTime_; | ||||
|       gl.glUniform1i( | ||||
|       glUniform1i( | ||||
|          p->uSelectedTimeLocation_, | ||||
|          static_cast<GLint>(std::chrono::duration_cast<std::chrono::minutes>( | ||||
|                                selectedTime.time_since_epoch()) | ||||
|                                .count())); | ||||
| 
 | ||||
|       // Draw icons
 | ||||
|       gl.glDrawArrays(GL_TRIANGLES, | ||||
|                       0, | ||||
|                       static_cast<GLsizei>(p->currentLineList_.size() * | ||||
|                                            kVerticesPerRectangle)); | ||||
|       glDrawArrays(GL_TRIANGLES, | ||||
|                    0, | ||||
|                    static_cast<GLsizei>(p->currentLineList_.size() * | ||||
|                                         kVerticesPerRectangle)); | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| void GeoLines::Deinitialize() | ||||
| { | ||||
|    gl::OpenGLFunctions& gl = p->context_->gl(); | ||||
| 
 | ||||
|    gl.glDeleteVertexArrays(1, &p->vao_); | ||||
|    gl.glDeleteBuffers(static_cast<GLsizei>(p->vbo_.size()), p->vbo_.data()); | ||||
|    glDeleteVertexArrays(1, &p->vao_); | ||||
|    glDeleteBuffers(static_cast<GLsizei>(p->vbo_.size()), p->vbo_.data()); | ||||
| 
 | ||||
|    std::unique_lock lock {p->lineMutex_}; | ||||
| 
 | ||||
|  | @ -671,21 +665,19 @@ void GeoLines::Impl::Update() | |||
|    // If the lines have been updated
 | ||||
|    if (dirty_) | ||||
|    { | ||||
|       gl::OpenGLFunctions& gl = context_->gl(); | ||||
| 
 | ||||
|       // Buffer lines data
 | ||||
|       gl.glBindBuffer(GL_ARRAY_BUFFER, vbo_[0]); | ||||
|       gl.glBufferData(GL_ARRAY_BUFFER, | ||||
|                       sizeof(float) * currentLinesBuffer_.size(), | ||||
|                       currentLinesBuffer_.data(), | ||||
|                       GL_DYNAMIC_DRAW); | ||||
|       glBindBuffer(GL_ARRAY_BUFFER, vbo_[0]); | ||||
|       glBufferData(GL_ARRAY_BUFFER, | ||||
|                    sizeof(float) * currentLinesBuffer_.size(), | ||||
|                    currentLinesBuffer_.data(), | ||||
|                    GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|       // Buffer threshold data
 | ||||
|       gl.glBindBuffer(GL_ARRAY_BUFFER, vbo_[1]); | ||||
|       gl.glBufferData(GL_ARRAY_BUFFER, | ||||
|                       sizeof(GLint) * currentIntegerBuffer_.size(), | ||||
|                       currentIntegerBuffer_.data(), | ||||
|                       GL_DYNAMIC_DRAW); | ||||
|       glBindBuffer(GL_ARRAY_BUFFER, vbo_[1]); | ||||
|       glBufferData(GL_ARRAY_BUFFER, | ||||
|                    sizeof(GLint) * currentIntegerBuffer_.size(), | ||||
|                    currentIntegerBuffer_.data(), | ||||
|                    GL_DYNAMIC_DRAW); | ||||
|    } | ||||
| 
 | ||||
|    dirty_ = false; | ||||
|  |  | |||
|  | @ -21,11 +21,11 @@ namespace draw | |||
| static const std::string logPrefix_ = "scwx::qt::gl::draw::icons"; | ||||
| static const auto        logger_    = scwx::util::Logger::Create(logPrefix_); | ||||
| 
 | ||||
| static constexpr std::size_t kNumRectangles        = 1; | ||||
| static constexpr std::size_t kNumTriangles         = kNumRectangles * 2; | ||||
| static constexpr std::size_t kVerticesPerTriangle  = 3; | ||||
| static constexpr std::size_t kPointsPerVertex      = 10; | ||||
| static constexpr std::size_t kPointsPerTexCoord    = 3; | ||||
| static constexpr std::size_t kNumRectangles       = 1; | ||||
| static constexpr std::size_t kNumTriangles        = kNumRectangles * 2; | ||||
| static constexpr std::size_t kVerticesPerTriangle = 3; | ||||
| static constexpr std::size_t kPointsPerVertex     = 10; | ||||
| static constexpr std::size_t kPointsPerTexCoord   = 3; | ||||
| static constexpr std::size_t kIconBufferLength = | ||||
|    kNumTriangles * kVerticesPerTriangle * kPointsPerVertex; | ||||
| static constexpr std::size_t kTextureBufferLength = | ||||
|  | @ -116,7 +116,7 @@ public: | |||
| }; | ||||
| 
 | ||||
| Icons::Icons(const std::shared_ptr<GlContext>& context) : | ||||
|     DrawItem(context->gl()), p(std::make_unique<Impl>(context)) | ||||
|     DrawItem(), p(std::make_unique<Impl>(context)) | ||||
| { | ||||
| } | ||||
| Icons::~Icons() = default; | ||||
|  | @ -126,8 +126,6 @@ Icons& Icons::operator=(Icons&&) noexcept = default; | |||
| 
 | ||||
| void Icons::Initialize() | ||||
| { | ||||
|    gl::OpenGLFunctions& gl = p->context_->gl(); | ||||
| 
 | ||||
|    p->shaderProgram_ = p->context_->GetShaderProgram( | ||||
|       {{GL_VERTEX_SHADER, ":/gl/texture2d_array.vert"}, | ||||
|        {GL_GEOMETRY_SHADER, ":/gl/threshold.geom"}, | ||||
|  | @ -135,69 +133,69 @@ void Icons::Initialize() | |||
| 
 | ||||
|    p->uMVPMatrixLocation_ = p->shaderProgram_->GetUniformLocation("uMVPMatrix"); | ||||
| 
 | ||||
|    gl.glGenVertexArrays(1, &p->vao_); | ||||
|    gl.glGenBuffers(static_cast<GLsizei>(p->vbo_.size()), p->vbo_.data()); | ||||
|    glGenVertexArrays(1, &p->vao_); | ||||
|    glGenBuffers(static_cast<GLsizei>(p->vbo_.size()), p->vbo_.data()); | ||||
| 
 | ||||
|    gl.glBindVertexArray(p->vao_); | ||||
|    gl.glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[0]); | ||||
|    gl.glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
|    glBindVertexArray(p->vao_); | ||||
|    glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[0]); | ||||
|    glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|    // aVertex
 | ||||
|    gl.glVertexAttribPointer(0, | ||||
|                             2, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerVertex * sizeof(float), | ||||
|                             reinterpret_cast<void*>(0)); | ||||
|    gl.glEnableVertexAttribArray(0); | ||||
|    glVertexAttribPointer(0, | ||||
|                          2, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerVertex * sizeof(float), | ||||
|                          reinterpret_cast<void*>(0)); | ||||
|    glEnableVertexAttribArray(0); | ||||
| 
 | ||||
|    // aXYOffset
 | ||||
|    gl.glVertexAttribPointer(1, | ||||
|                             2, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerVertex * sizeof(float), | ||||
|                             reinterpret_cast<void*>(2 * sizeof(float))); | ||||
|    gl.glEnableVertexAttribArray(1); | ||||
|    glVertexAttribPointer(1, | ||||
|                          2, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerVertex * sizeof(float), | ||||
|                          reinterpret_cast<void*>(2 * sizeof(float))); | ||||
|    glEnableVertexAttribArray(1); | ||||
| 
 | ||||
|    // aModulate
 | ||||
|    gl.glVertexAttribPointer(3, | ||||
|                             4, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerVertex * sizeof(float), | ||||
|                             reinterpret_cast<void*>(4 * sizeof(float))); | ||||
|    gl.glEnableVertexAttribArray(3); | ||||
|    glVertexAttribPointer(3, | ||||
|                          4, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerVertex * sizeof(float), | ||||
|                          reinterpret_cast<void*>(4 * sizeof(float))); | ||||
|    glEnableVertexAttribArray(3); | ||||
| 
 | ||||
|    // aAngle
 | ||||
|    gl.glVertexAttribPointer(4, | ||||
|                             1, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerVertex * sizeof(float), | ||||
|                             reinterpret_cast<void*>(8 * sizeof(float))); | ||||
|    gl.glEnableVertexAttribArray(4); | ||||
|    glVertexAttribPointer(4, | ||||
|                          1, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerVertex * sizeof(float), | ||||
|                          reinterpret_cast<void*>(8 * sizeof(float))); | ||||
|    glEnableVertexAttribArray(4); | ||||
| 
 | ||||
|    // aDisplayed
 | ||||
|    gl.glVertexAttribPointer(5, | ||||
|                             1, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerVertex * sizeof(float), | ||||
|                             reinterpret_cast<void*>(9 * sizeof(float))); | ||||
|    gl.glEnableVertexAttribArray(5); | ||||
|    glVertexAttribPointer(5, | ||||
|                          1, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerVertex * sizeof(float), | ||||
|                          reinterpret_cast<void*>(9 * sizeof(float))); | ||||
|    glEnableVertexAttribArray(5); | ||||
| 
 | ||||
|    gl.glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[1]); | ||||
|    gl.glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
|    glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[1]); | ||||
|    glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|    // aTexCoord
 | ||||
|    gl.glVertexAttribPointer(2, | ||||
|                             3, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerTexCoord * sizeof(float), | ||||
|                             static_cast<void*>(0)); | ||||
|    gl.glEnableVertexAttribArray(2); | ||||
|    glVertexAttribPointer(2, | ||||
|                          3, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerTexCoord * sizeof(float), | ||||
|                          static_cast<void*>(0)); | ||||
|    glEnableVertexAttribArray(2); | ||||
| 
 | ||||
|    p->dirty_ = true; | ||||
| } | ||||
|  | @ -219,29 +217,25 @@ void Icons::Render(const QMapLibre::CustomLayerRenderParameters& params, | |||
| 
 | ||||
|    if (!p->currentIconList_.empty()) | ||||
|    { | ||||
|       gl::OpenGLFunctions& gl = p->context_->gl(); | ||||
| 
 | ||||
|       gl.glBindVertexArray(p->vao_); | ||||
|       glBindVertexArray(p->vao_); | ||||
| 
 | ||||
|       p->Update(textureAtlasChanged); | ||||
|       p->shaderProgram_->Use(); | ||||
|       UseDefaultProjection(params, p->uMVPMatrixLocation_); | ||||
| 
 | ||||
|       // Interpolate texture coordinates
 | ||||
|       gl.glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | ||||
|       gl.glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | ||||
|       glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | ||||
|       glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | ||||
| 
 | ||||
|       // Draw icons
 | ||||
|       gl.glDrawArrays(GL_TRIANGLES, 0, p->numVertices_); | ||||
|       glDrawArrays(GL_TRIANGLES, 0, p->numVertices_); | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| void Icons::Deinitialize() | ||||
| { | ||||
|    gl::OpenGLFunctions& gl = p->context_->gl(); | ||||
| 
 | ||||
|    gl.glDeleteVertexArrays(1, &p->vao_); | ||||
|    gl.glDeleteBuffers(static_cast<GLsizei>(p->vbo_.size()), p->vbo_.data()); | ||||
|    glDeleteVertexArrays(1, &p->vao_); | ||||
|    glDeleteBuffers(static_cast<GLsizei>(p->vbo_.size()), p->vbo_.data()); | ||||
| 
 | ||||
|    std::unique_lock lock {p->iconMutex_}; | ||||
| 
 | ||||
|  | @ -679,8 +673,6 @@ void Icons::Impl::UpdateModifiedIconBuffers() | |||
| 
 | ||||
| void Icons::Impl::Update(bool textureAtlasChanged) | ||||
| { | ||||
|    gl::OpenGLFunctions& gl = context_->gl(); | ||||
| 
 | ||||
|    UpdateModifiedIconBuffers(); | ||||
| 
 | ||||
|    // If the texture atlas has changed
 | ||||
|  | @ -696,11 +688,11 @@ void Icons::Impl::Update(bool textureAtlasChanged) | |||
|       UpdateTextureBuffer(); | ||||
| 
 | ||||
|       // Buffer texture data
 | ||||
|       gl.glBindBuffer(GL_ARRAY_BUFFER, vbo_[1]); | ||||
|       gl.glBufferData(GL_ARRAY_BUFFER, | ||||
|                       sizeof(float) * textureBuffer_.size(), | ||||
|                       textureBuffer_.data(), | ||||
|                       GL_DYNAMIC_DRAW); | ||||
|       glBindBuffer(GL_ARRAY_BUFFER, vbo_[1]); | ||||
|       glBufferData(GL_ARRAY_BUFFER, | ||||
|                    sizeof(float) * textureBuffer_.size(), | ||||
|                    textureBuffer_.data(), | ||||
|                    GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|       lastTextureAtlasChanged_ = false; | ||||
|    } | ||||
|  | @ -709,11 +701,11 @@ void Icons::Impl::Update(bool textureAtlasChanged) | |||
|    if (dirty_) | ||||
|    { | ||||
|       // Buffer vertex data
 | ||||
|       gl.glBindBuffer(GL_ARRAY_BUFFER, vbo_[0]); | ||||
|       gl.glBufferData(GL_ARRAY_BUFFER, | ||||
|                       sizeof(float) * currentIconBuffer_.size(), | ||||
|                       currentIconBuffer_.data(), | ||||
|                       GL_DYNAMIC_DRAW); | ||||
|       glBindBuffer(GL_ARRAY_BUFFER, vbo_[0]); | ||||
|       glBufferData(GL_ARRAY_BUFFER, | ||||
|                    sizeof(float) * currentIconBuffer_.size(), | ||||
|                    currentIconBuffer_.data(), | ||||
|                    GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|       numVertices_ = | ||||
|          static_cast<GLsizei>(currentIconBuffer_.size() / kPointsPerVertex); | ||||
|  |  | |||
|  | @ -79,7 +79,7 @@ public: | |||
| }; | ||||
| 
 | ||||
| LinkedVectors::LinkedVectors(std::shared_ptr<GlContext> context) : | ||||
|     DrawItem(context->gl()), p(std::make_unique<Impl>(context)) | ||||
|     DrawItem(), p(std::make_unique<Impl>(context)) | ||||
| { | ||||
| } | ||||
| LinkedVectors::~LinkedVectors() = default; | ||||
|  |  | |||
|  | @ -140,7 +140,7 @@ public: | |||
| }; | ||||
| 
 | ||||
| PlacefileIcons::PlacefileIcons(const std::shared_ptr<GlContext>& context) : | ||||
|     DrawItem(context->gl()), p(std::make_unique<Impl>(context)) | ||||
|     DrawItem(), p(std::make_unique<Impl>(context)) | ||||
| { | ||||
| } | ||||
| PlacefileIcons::~PlacefileIcons() = default; | ||||
|  | @ -161,12 +161,6 @@ void PlacefileIcons::set_thresholded(bool thresholded) | |||
| 
 | ||||
| void PlacefileIcons::Initialize() | ||||
| { | ||||
|    gl::OpenGLFunctions& gl   = p->context_->gl(); | ||||
| 
 | ||||
| #if !defined(__APPLE__) | ||||
|    auto&                gl30 = p->context_->gl30(); | ||||
| #endif | ||||
| 
 | ||||
|    p->shaderProgram_ = p->context_->GetShaderProgram( | ||||
|       {{GL_VERTEX_SHADER, ":/gl/geo_texture2d.vert"}, | ||||
|        {GL_GEOMETRY_SHADER, ":/gl/threshold.geom"}, | ||||
|  | @ -181,86 +175,82 @@ void PlacefileIcons::Initialize() | |||
|    p->uSelectedTimeLocation_ = | ||||
|       p->shaderProgram_->GetUniformLocation("uSelectedTime"); | ||||
| 
 | ||||
|    gl.glGenVertexArrays(1, &p->vao_); | ||||
|    gl.glGenBuffers(static_cast<GLsizei>(p->vbo_.size()), p->vbo_.data()); | ||||
|    glGenVertexArrays(1, &p->vao_); | ||||
|    glGenBuffers(static_cast<GLsizei>(p->vbo_.size()), p->vbo_.data()); | ||||
| 
 | ||||
|    gl.glBindVertexArray(p->vao_); | ||||
|    gl.glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[0]); | ||||
|    gl.glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
|    glBindVertexArray(p->vao_); | ||||
|    glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[0]); | ||||
|    glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|    // aLatLong
 | ||||
|    gl.glVertexAttribPointer(0, | ||||
|                             2, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerVertex * sizeof(float), | ||||
|                             static_cast<void*>(0)); | ||||
|    gl.glEnableVertexAttribArray(0); | ||||
|    glVertexAttribPointer(0, | ||||
|                          2, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerVertex * sizeof(float), | ||||
|                          static_cast<void*>(0)); | ||||
|    glEnableVertexAttribArray(0); | ||||
| 
 | ||||
|    // aXYOffset
 | ||||
|    gl.glVertexAttribPointer(1, | ||||
|                             2, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerVertex * sizeof(float), | ||||
|                             reinterpret_cast<void*>(2 * sizeof(float))); | ||||
|    gl.glEnableVertexAttribArray(1); | ||||
|    glVertexAttribPointer(1, | ||||
|                          2, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerVertex * sizeof(float), | ||||
|                          reinterpret_cast<void*>(2 * sizeof(float))); | ||||
|    glEnableVertexAttribArray(1); | ||||
| 
 | ||||
|    // aModulate
 | ||||
|    gl.glVertexAttribPointer(3, | ||||
|                             4, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerVertex * sizeof(float), | ||||
|                             reinterpret_cast<void*>(4 * sizeof(float))); | ||||
|    gl.glEnableVertexAttribArray(3); | ||||
|    glVertexAttribPointer(3, | ||||
|                          4, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerVertex * sizeof(float), | ||||
|                          reinterpret_cast<void*>(4 * sizeof(float))); | ||||
|    glEnableVertexAttribArray(3); | ||||
| 
 | ||||
|    // aAngle
 | ||||
|    gl.glVertexAttribPointer(4, | ||||
|                             1, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerVertex * sizeof(float), | ||||
|                             reinterpret_cast<void*>(8 * sizeof(float))); | ||||
|    gl.glEnableVertexAttribArray(4); | ||||
|    glVertexAttribPointer(4, | ||||
|                          1, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerVertex * sizeof(float), | ||||
|                          reinterpret_cast<void*>(8 * sizeof(float))); | ||||
|    glEnableVertexAttribArray(4); | ||||
| 
 | ||||
|    gl.glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[1]); | ||||
|    gl.glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
|    glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[1]); | ||||
|    glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|    // aTexCoord
 | ||||
|    gl.glVertexAttribPointer(2, | ||||
|                             3, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerTexCoord * sizeof(float), | ||||
|                             static_cast<void*>(0)); | ||||
|    gl.glEnableVertexAttribArray(2); | ||||
|    glVertexAttribPointer(2, | ||||
|                          3, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerTexCoord * sizeof(float), | ||||
|                          static_cast<void*>(0)); | ||||
|    glEnableVertexAttribArray(2); | ||||
| 
 | ||||
|    gl.glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[2]); | ||||
|    gl.glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
|    glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[2]); | ||||
|    glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|    // aThreshold
 | ||||
|    gl.glVertexAttribIPointer(5, //
 | ||||
|                              1, | ||||
|                              GL_INT, | ||||
|                              0, | ||||
|                              static_cast<void*>(0)); | ||||
|    gl.glEnableVertexAttribArray(5); | ||||
|    glVertexAttribIPointer(5, //
 | ||||
|                           1, | ||||
|                           GL_INT, | ||||
|                           0, | ||||
|                           static_cast<void*>(0)); | ||||
|    glEnableVertexAttribArray(5); | ||||
| 
 | ||||
|    // aTimeRange
 | ||||
|    gl.glVertexAttribIPointer(6, //
 | ||||
|                              2, | ||||
|                              GL_INT, | ||||
|                              kIntegersPerVertex_ * sizeof(GLint), | ||||
|                              reinterpret_cast<void*>(1 * sizeof(GLint))); | ||||
|    gl.glEnableVertexAttribArray(6); | ||||
|    glVertexAttribIPointer(6, //
 | ||||
|                           2, | ||||
|                           GL_INT, | ||||
|                           kIntegersPerVertex_ * sizeof(GLint), | ||||
|                           reinterpret_cast<void*>(1 * sizeof(GLint))); | ||||
|    glEnableVertexAttribArray(6); | ||||
| 
 | ||||
|    // aDisplayed
 | ||||
| #if !defined(__APPLE__) | ||||
|    gl30.glVertexAttribI1i(7, 1); | ||||
| #else | ||||
|    glVertexAttribI1i(7, 1); | ||||
| #endif | ||||
| 
 | ||||
|    p->dirty_ = true; | ||||
| } | ||||
|  | @ -273,9 +263,7 @@ void PlacefileIcons::Render( | |||
| 
 | ||||
|    if (!p->currentIconList_.empty()) | ||||
|    { | ||||
|       gl::OpenGLFunctions& gl = p->context_->gl(); | ||||
| 
 | ||||
|       gl.glBindVertexArray(p->vao_); | ||||
|       glBindVertexArray(p->vao_); | ||||
| 
 | ||||
|       p->Update(textureAtlasChanged); | ||||
|       p->shaderProgram_->Use(); | ||||
|  | @ -288,12 +276,12 @@ void PlacefileIcons::Render( | |||
|          // If thresholding is enabled, set the map distance
 | ||||
|          units::length::nautical_miles<float> mapDistance = | ||||
|             util::maplibre::GetMapDistance(params); | ||||
|          gl.glUniform1f(p->uMapDistanceLocation_, mapDistance.value()); | ||||
|          glUniform1f(p->uMapDistanceLocation_, mapDistance.value()); | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|          // If thresholding is disabled, set the map distance to 0
 | ||||
|          gl.glUniform1f(p->uMapDistanceLocation_, 0.0f); | ||||
|          glUniform1f(p->uMapDistanceLocation_, 0.0f); | ||||
|       } | ||||
| 
 | ||||
|       // Selected time
 | ||||
|  | @ -301,27 +289,25 @@ void PlacefileIcons::Render( | |||
|          (p->selectedTime_ == std::chrono::system_clock::time_point {}) ? | ||||
|             std::chrono::system_clock::now() : | ||||
|             p->selectedTime_; | ||||
|       gl.glUniform1i( | ||||
|       glUniform1i( | ||||
|          p->uSelectedTimeLocation_, | ||||
|          static_cast<GLint>(std::chrono::duration_cast<std::chrono::minutes>( | ||||
|                                selectedTime.time_since_epoch()) | ||||
|                                .count())); | ||||
| 
 | ||||
|       // Interpolate texture coordinates
 | ||||
|       gl.glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | ||||
|       gl.glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | ||||
|       glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | ||||
|       glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | ||||
| 
 | ||||
|       // Draw icons
 | ||||
|       gl.glDrawArrays(GL_TRIANGLES, 0, p->numVertices_); | ||||
|       glDrawArrays(GL_TRIANGLES, 0, p->numVertices_); | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| void PlacefileIcons::Deinitialize() | ||||
| { | ||||
|    gl::OpenGLFunctions& gl = p->context_->gl(); | ||||
| 
 | ||||
|    gl.glDeleteVertexArrays(1, &p->vao_); | ||||
|    gl.glDeleteBuffers(static_cast<GLsizei>(p->vbo_.size()), p->vbo_.data()); | ||||
|    glDeleteVertexArrays(1, &p->vao_); | ||||
|    glDeleteBuffers(static_cast<GLsizei>(p->vbo_.size()), p->vbo_.data()); | ||||
| 
 | ||||
|    std::unique_lock lock {p->iconMutex_}; | ||||
| 
 | ||||
|  | @ -649,8 +635,6 @@ void PlacefileIcons::Impl::UpdateTextureBuffer() | |||
| 
 | ||||
| void PlacefileIcons::Impl::Update(bool textureAtlasChanged) | ||||
| { | ||||
|    gl::OpenGLFunctions& gl = context_->gl(); | ||||
| 
 | ||||
|    // If the texture atlas has changed
 | ||||
|    if (dirty_ || textureAtlasChanged) | ||||
|    { | ||||
|  | @ -664,29 +648,29 @@ void PlacefileIcons::Impl::Update(bool textureAtlasChanged) | |||
|       UpdateTextureBuffer(); | ||||
| 
 | ||||
|       // Buffer texture data
 | ||||
|       gl.glBindBuffer(GL_ARRAY_BUFFER, vbo_[1]); | ||||
|       gl.glBufferData(GL_ARRAY_BUFFER, | ||||
|                       sizeof(float) * textureBuffer_.size(), | ||||
|                       textureBuffer_.data(), | ||||
|                       GL_DYNAMIC_DRAW); | ||||
|       glBindBuffer(GL_ARRAY_BUFFER, vbo_[1]); | ||||
|       glBufferData(GL_ARRAY_BUFFER, | ||||
|                    sizeof(float) * textureBuffer_.size(), | ||||
|                    textureBuffer_.data(), | ||||
|                    GL_DYNAMIC_DRAW); | ||||
|    } | ||||
| 
 | ||||
|    // If buffers need updating
 | ||||
|    if (dirty_) | ||||
|    { | ||||
|       // Buffer vertex data
 | ||||
|       gl.glBindBuffer(GL_ARRAY_BUFFER, vbo_[0]); | ||||
|       gl.glBufferData(GL_ARRAY_BUFFER, | ||||
|                       sizeof(float) * currentIconBuffer_.size(), | ||||
|                       currentIconBuffer_.data(), | ||||
|                       GL_DYNAMIC_DRAW); | ||||
|       glBindBuffer(GL_ARRAY_BUFFER, vbo_[0]); | ||||
|       glBufferData(GL_ARRAY_BUFFER, | ||||
|                    sizeof(float) * currentIconBuffer_.size(), | ||||
|                    currentIconBuffer_.data(), | ||||
|                    GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|       // Buffer threshold data
 | ||||
|       gl.glBindBuffer(GL_ARRAY_BUFFER, vbo_[2]); | ||||
|       gl.glBufferData(GL_ARRAY_BUFFER, | ||||
|                       sizeof(GLint) * currentIntegerBuffer_.size(), | ||||
|                       currentIntegerBuffer_.data(), | ||||
|                       GL_DYNAMIC_DRAW); | ||||
|       glBindBuffer(GL_ARRAY_BUFFER, vbo_[2]); | ||||
|       glBufferData(GL_ARRAY_BUFFER, | ||||
|                    sizeof(GLint) * currentIntegerBuffer_.size(), | ||||
|                    currentIntegerBuffer_.data(), | ||||
|                    GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|       numVertices_ = | ||||
|          static_cast<GLsizei>(currentIconBuffer_.size() / kPointsPerVertex); | ||||
|  |  | |||
|  | @ -117,7 +117,7 @@ public: | |||
| }; | ||||
| 
 | ||||
| PlacefileImages::PlacefileImages(const std::shared_ptr<GlContext>& context) : | ||||
|     DrawItem(context->gl()), p(std::make_unique<Impl>(context)) | ||||
|     DrawItem(), p(std::make_unique<Impl>(context)) | ||||
| { | ||||
| } | ||||
| PlacefileImages::~PlacefileImages() = default; | ||||
|  | @ -139,12 +139,6 @@ void PlacefileImages::set_thresholded(bool thresholded) | |||
| 
 | ||||
| void PlacefileImages::Initialize() | ||||
| { | ||||
|    gl::OpenGLFunctions& gl   = p->context_->gl(); | ||||
| 
 | ||||
| #if !defined(__APPLE__) | ||||
|    auto&                gl30 = p->context_->gl30(); | ||||
| #endif | ||||
| 
 | ||||
|    p->shaderProgram_ = p->context_->GetShaderProgram( | ||||
|       {{GL_VERTEX_SHADER, ":/gl/geo_texture2d.vert"}, | ||||
|        {GL_GEOMETRY_SHADER, ":/gl/threshold.geom"}, | ||||
|  | @ -159,77 +153,73 @@ void PlacefileImages::Initialize() | |||
|    p->uSelectedTimeLocation_ = | ||||
|       p->shaderProgram_->GetUniformLocation("uSelectedTime"); | ||||
| 
 | ||||
|    gl.glGenVertexArrays(1, &p->vao_); | ||||
|    gl.glGenBuffers(static_cast<GLsizei>(p->vbo_.size()), p->vbo_.data()); | ||||
|    glGenVertexArrays(1, &p->vao_); | ||||
|    glGenBuffers(static_cast<GLsizei>(p->vbo_.size()), p->vbo_.data()); | ||||
| 
 | ||||
|    gl.glBindVertexArray(p->vao_); | ||||
|    gl.glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[0]); | ||||
|    gl.glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
|    glBindVertexArray(p->vao_); | ||||
|    glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[0]); | ||||
|    glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|    // aLatLong
 | ||||
|    gl.glVertexAttribPointer(0, | ||||
|                             2, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerVertex * sizeof(float), | ||||
|                             static_cast<void*>(0)); | ||||
|    gl.glEnableVertexAttribArray(0); | ||||
|    glVertexAttribPointer(0, | ||||
|                          2, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerVertex * sizeof(float), | ||||
|                          static_cast<void*>(0)); | ||||
|    glEnableVertexAttribArray(0); | ||||
| 
 | ||||
|    // aXYOffset
 | ||||
|    gl.glVertexAttribPointer(1, | ||||
|                             2, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerVertex * sizeof(float), | ||||
|                             reinterpret_cast<void*>(2 * sizeof(float))); | ||||
|    gl.glEnableVertexAttribArray(1); | ||||
|    glVertexAttribPointer(1, | ||||
|                          2, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerVertex * sizeof(float), | ||||
|                          reinterpret_cast<void*>(2 * sizeof(float))); | ||||
|    glEnableVertexAttribArray(1); | ||||
| 
 | ||||
|    // aModulate
 | ||||
|    gl.glVertexAttribPointer(3, | ||||
|                             4, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerVertex * sizeof(float), | ||||
|                             reinterpret_cast<void*>(4 * sizeof(float))); | ||||
|    gl.glEnableVertexAttribArray(3); | ||||
|    glVertexAttribPointer(3, | ||||
|                          4, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerVertex * sizeof(float), | ||||
|                          reinterpret_cast<void*>(4 * sizeof(float))); | ||||
|    glEnableVertexAttribArray(3); | ||||
| 
 | ||||
|    gl.glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[1]); | ||||
|    gl.glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
|    glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[1]); | ||||
|    glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|    // aTexCoord
 | ||||
|    gl.glVertexAttribPointer(2, | ||||
|                             3, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerTexCoord * sizeof(float), | ||||
|                             static_cast<void*>(0)); | ||||
|    gl.glEnableVertexAttribArray(2); | ||||
|    glVertexAttribPointer(2, | ||||
|                          3, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerTexCoord * sizeof(float), | ||||
|                          static_cast<void*>(0)); | ||||
|    glEnableVertexAttribArray(2); | ||||
| 
 | ||||
|    gl.glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[2]); | ||||
|    gl.glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
|    glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[2]); | ||||
|    glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|    // aThreshold
 | ||||
|    gl.glVertexAttribIPointer(5, //
 | ||||
|                              1, | ||||
|                              GL_INT, | ||||
|                              kIntegersPerVertex_ * sizeof(GLint), | ||||
|                              static_cast<void*>(0)); | ||||
|    gl.glEnableVertexAttribArray(5); | ||||
|    glVertexAttribIPointer(5, //
 | ||||
|                           1, | ||||
|                           GL_INT, | ||||
|                           kIntegersPerVertex_ * sizeof(GLint), | ||||
|                           static_cast<void*>(0)); | ||||
|    glEnableVertexAttribArray(5); | ||||
| 
 | ||||
|    // aTimeRange
 | ||||
|    gl.glVertexAttribIPointer(6, //
 | ||||
|                              2, | ||||
|                              GL_INT, | ||||
|                              kIntegersPerVertex_ * sizeof(GLint), | ||||
|                              reinterpret_cast<void*>(1 * sizeof(GLint))); | ||||
|    gl.glEnableVertexAttribArray(6); | ||||
|    glVertexAttribIPointer(6, //
 | ||||
|                           2, | ||||
|                           GL_INT, | ||||
|                           kIntegersPerVertex_ * sizeof(GLint), | ||||
|                           reinterpret_cast<void*>(1 * sizeof(GLint))); | ||||
|    glEnableVertexAttribArray(6); | ||||
| 
 | ||||
|    // aDisplayed
 | ||||
| #if !defined(__APPLE__) | ||||
|    gl30.glVertexAttribI1i(7, 1); | ||||
| #else | ||||
|    glVertexAttribI1i(7, 1); | ||||
| #endif | ||||
| 
 | ||||
|    p->dirty_ = true; | ||||
| } | ||||
|  | @ -242,9 +232,7 @@ void PlacefileImages::Render( | |||
| 
 | ||||
|    if (!p->currentImageList_.empty()) | ||||
|    { | ||||
|       gl::OpenGLFunctions& gl = p->context_->gl(); | ||||
| 
 | ||||
|       gl.glBindVertexArray(p->vao_); | ||||
|       glBindVertexArray(p->vao_); | ||||
| 
 | ||||
|       p->Update(textureAtlasChanged); | ||||
|       p->shaderProgram_->Use(); | ||||
|  | @ -257,12 +245,12 @@ void PlacefileImages::Render( | |||
|          // If thresholding is enabled, set the map distance
 | ||||
|          units::length::nautical_miles<float> mapDistance = | ||||
|             util::maplibre::GetMapDistance(params); | ||||
|          gl.glUniform1f(p->uMapDistanceLocation_, mapDistance.value()); | ||||
|          glUniform1f(p->uMapDistanceLocation_, mapDistance.value()); | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|          // If thresholding is disabled, set the map distance to 0
 | ||||
|          gl.glUniform1f(p->uMapDistanceLocation_, 0.0f); | ||||
|          glUniform1f(p->uMapDistanceLocation_, 0.0f); | ||||
|       } | ||||
| 
 | ||||
|       // Selected time
 | ||||
|  | @ -270,27 +258,25 @@ void PlacefileImages::Render( | |||
|          (p->selectedTime_ == std::chrono::system_clock::time_point {}) ? | ||||
|             std::chrono::system_clock::now() : | ||||
|             p->selectedTime_; | ||||
|       gl.glUniform1i( | ||||
|       glUniform1i( | ||||
|          p->uSelectedTimeLocation_, | ||||
|          static_cast<GLint>(std::chrono::duration_cast<std::chrono::minutes>( | ||||
|                                selectedTime.time_since_epoch()) | ||||
|                                .count())); | ||||
| 
 | ||||
|       // Interpolate texture coordinates
 | ||||
|       gl.glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | ||||
|       gl.glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | ||||
|       glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | ||||
|       glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | ||||
| 
 | ||||
|       // Draw images
 | ||||
|       gl.glDrawArrays(GL_TRIANGLES, 0, p->numVertices_); | ||||
|       glDrawArrays(GL_TRIANGLES, 0, p->numVertices_); | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| void PlacefileImages::Deinitialize() | ||||
| { | ||||
|    gl::OpenGLFunctions& gl = p->context_->gl(); | ||||
| 
 | ||||
|    gl.glDeleteVertexArrays(1, &p->vao_); | ||||
|    gl.glDeleteBuffers(static_cast<GLsizei>(p->vbo_.size()), p->vbo_.data()); | ||||
|    glDeleteVertexArrays(1, &p->vao_); | ||||
|    glDeleteBuffers(static_cast<GLsizei>(p->vbo_.size()), p->vbo_.data()); | ||||
| 
 | ||||
|    std::unique_lock lock {p->imageMutex_}; | ||||
| 
 | ||||
|  | @ -446,8 +432,6 @@ void PlacefileImages::Impl::UpdateTextureBuffer() | |||
| 
 | ||||
| void PlacefileImages::Impl::Update(bool textureAtlasChanged) | ||||
| { | ||||
|    gl::OpenGLFunctions& gl = context_->gl(); | ||||
| 
 | ||||
|    // If the texture atlas has changed
 | ||||
|    if (dirty_ || textureAtlasChanged) | ||||
|    { | ||||
|  | @ -461,29 +445,29 @@ void PlacefileImages::Impl::Update(bool textureAtlasChanged) | |||
|       UpdateTextureBuffer(); | ||||
| 
 | ||||
|       // Buffer texture data
 | ||||
|       gl.glBindBuffer(GL_ARRAY_BUFFER, vbo_[1]); | ||||
|       gl.glBufferData(GL_ARRAY_BUFFER, | ||||
|                       sizeof(float) * textureBuffer_.size(), | ||||
|                       textureBuffer_.data(), | ||||
|                       GL_DYNAMIC_DRAW); | ||||
|       glBindBuffer(GL_ARRAY_BUFFER, vbo_[1]); | ||||
|       glBufferData(GL_ARRAY_BUFFER, | ||||
|                    sizeof(float) * textureBuffer_.size(), | ||||
|                    textureBuffer_.data(), | ||||
|                    GL_DYNAMIC_DRAW); | ||||
|    } | ||||
| 
 | ||||
|    // If buffers need updating
 | ||||
|    if (dirty_) | ||||
|    { | ||||
|       // Buffer vertex data
 | ||||
|       gl.glBindBuffer(GL_ARRAY_BUFFER, vbo_[0]); | ||||
|       gl.glBufferData(GL_ARRAY_BUFFER, | ||||
|                       sizeof(float) * currentImageBuffer_.size(), | ||||
|                       currentImageBuffer_.data(), | ||||
|                       GL_DYNAMIC_DRAW); | ||||
|       glBindBuffer(GL_ARRAY_BUFFER, vbo_[0]); | ||||
|       glBufferData(GL_ARRAY_BUFFER, | ||||
|                    sizeof(float) * currentImageBuffer_.size(), | ||||
|                    currentImageBuffer_.data(), | ||||
|                    GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|       // Buffer threshold data
 | ||||
|       gl.glBindBuffer(GL_ARRAY_BUFFER, vbo_[2]); | ||||
|       gl.glBufferData(GL_ARRAY_BUFFER, | ||||
|                       sizeof(GLint) * currentIntegerBuffer_.size(), | ||||
|                       currentIntegerBuffer_.data(), | ||||
|                       GL_DYNAMIC_DRAW); | ||||
|       glBindBuffer(GL_ARRAY_BUFFER, vbo_[2]); | ||||
|       glBufferData(GL_ARRAY_BUFFER, | ||||
|                    sizeof(GLint) * currentIntegerBuffer_.size(), | ||||
|                    currentIntegerBuffer_.data(), | ||||
|                    GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|       numVertices_ = | ||||
|          static_cast<GLsizei>(currentImageBuffer_.size() / kPointsPerVertex); | ||||
|  |  | |||
|  | @ -106,7 +106,7 @@ public: | |||
| }; | ||||
| 
 | ||||
| PlacefileLines::PlacefileLines(const std::shared_ptr<GlContext>& context) : | ||||
|     DrawItem(context->gl()), p(std::make_unique<Impl>(context)) | ||||
|     DrawItem(), p(std::make_unique<Impl>(context)) | ||||
| { | ||||
| } | ||||
| PlacefileLines::~PlacefileLines() = default; | ||||
|  | @ -127,12 +127,6 @@ void PlacefileLines::set_thresholded(bool thresholded) | |||
| 
 | ||||
| void PlacefileLines::Initialize() | ||||
| { | ||||
|    gl::OpenGLFunctions& gl   = p->context_->gl(); | ||||
| 
 | ||||
| #if !defined(__APPLE__) | ||||
|    auto&                gl30 = p->context_->gl30(); | ||||
| #endif | ||||
| 
 | ||||
|    p->shaderProgram_ = p->context_->GetShaderProgram( | ||||
|       {{GL_VERTEX_SHADER, ":/gl/geo_texture2d.vert"}, | ||||
|        {GL_GEOMETRY_SHADER, ":/gl/threshold.geom"}, | ||||
|  | @ -147,74 +141,70 @@ void PlacefileLines::Initialize() | |||
|    p->uSelectedTimeLocation_ = | ||||
|       p->shaderProgram_->GetUniformLocation("uSelectedTime"); | ||||
| 
 | ||||
|    gl.glGenVertexArrays(1, &p->vao_); | ||||
|    gl.glGenBuffers(2, p->vbo_.data()); | ||||
|    glGenVertexArrays(1, &p->vao_); | ||||
|    glGenBuffers(2, p->vbo_.data()); | ||||
| 
 | ||||
|    gl.glBindVertexArray(p->vao_); | ||||
|    gl.glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[0]); | ||||
|    gl.glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
|    glBindVertexArray(p->vao_); | ||||
|    glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[0]); | ||||
|    glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|    // aLatLong
 | ||||
|    gl.glVertexAttribPointer(0, | ||||
|                             2, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerVertex * sizeof(float), | ||||
|                             static_cast<void*>(0)); | ||||
|    gl.glEnableVertexAttribArray(0); | ||||
|    glVertexAttribPointer(0, | ||||
|                          2, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerVertex * sizeof(float), | ||||
|                          static_cast<void*>(0)); | ||||
|    glEnableVertexAttribArray(0); | ||||
| 
 | ||||
|    // aXYOffset
 | ||||
|    gl.glVertexAttribPointer(1, | ||||
|                             2, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerVertex * sizeof(float), | ||||
|                             reinterpret_cast<void*>(2 * sizeof(float))); | ||||
|    gl.glEnableVertexAttribArray(1); | ||||
|    glVertexAttribPointer(1, | ||||
|                          2, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerVertex * sizeof(float), | ||||
|                          reinterpret_cast<void*>(2 * sizeof(float))); | ||||
|    glEnableVertexAttribArray(1); | ||||
| 
 | ||||
|    // aModulate
 | ||||
|    gl.glVertexAttribPointer(3, | ||||
|                             4, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerVertex * sizeof(float), | ||||
|                             reinterpret_cast<void*>(4 * sizeof(float))); | ||||
|    gl.glEnableVertexAttribArray(3); | ||||
|    glVertexAttribPointer(3, | ||||
|                          4, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerVertex * sizeof(float), | ||||
|                          reinterpret_cast<void*>(4 * sizeof(float))); | ||||
|    glEnableVertexAttribArray(3); | ||||
| 
 | ||||
|    // aAngle
 | ||||
|    gl.glVertexAttribPointer(4, | ||||
|                             1, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerVertex * sizeof(float), | ||||
|                             reinterpret_cast<void*>(8 * sizeof(float))); | ||||
|    gl.glEnableVertexAttribArray(4); | ||||
|    glVertexAttribPointer(4, | ||||
|                          1, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerVertex * sizeof(float), | ||||
|                          reinterpret_cast<void*>(8 * sizeof(float))); | ||||
|    glEnableVertexAttribArray(4); | ||||
| 
 | ||||
|    gl.glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[1]); | ||||
|    gl.glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
|    glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[1]); | ||||
|    glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|    // aThreshold
 | ||||
|    gl.glVertexAttribIPointer(5, //
 | ||||
|                              1, | ||||
|                              GL_INT, | ||||
|                              kIntegersPerVertex_ * sizeof(GLint), | ||||
|                              static_cast<void*>(0)); | ||||
|    gl.glEnableVertexAttribArray(5); | ||||
|    glVertexAttribIPointer(5, //
 | ||||
|                           1, | ||||
|                           GL_INT, | ||||
|                           kIntegersPerVertex_ * sizeof(GLint), | ||||
|                           static_cast<void*>(0)); | ||||
|    glEnableVertexAttribArray(5); | ||||
| 
 | ||||
|    // aTimeRange
 | ||||
|    gl.glVertexAttribIPointer(6, //
 | ||||
|                              2, | ||||
|                              GL_INT, | ||||
|                              kIntegersPerVertex_ * sizeof(GLint), | ||||
|                              reinterpret_cast<void*>(1 * sizeof(GLint))); | ||||
|    gl.glEnableVertexAttribArray(6); | ||||
|    glVertexAttribIPointer(6, //
 | ||||
|                           2, | ||||
|                           GL_INT, | ||||
|                           kIntegersPerVertex_ * sizeof(GLint), | ||||
|                           reinterpret_cast<void*>(1 * sizeof(GLint))); | ||||
|    glEnableVertexAttribArray(6); | ||||
| 
 | ||||
|    // aDisplayed
 | ||||
| #if !defined(__APPLE__) | ||||
|    gl30.glVertexAttribI1i(7, 1); | ||||
| #else | ||||
|    glVertexAttribI1i(7, 1); | ||||
| #endif | ||||
| 
 | ||||
|    p->dirty_ = true; | ||||
| } | ||||
|  | @ -226,9 +216,7 @@ void PlacefileLines::Render( | |||
| 
 | ||||
|    if (p->currentNumLines_ > 0) | ||||
|    { | ||||
|       gl::OpenGLFunctions& gl = p->context_->gl(); | ||||
| 
 | ||||
|       gl.glBindVertexArray(p->vao_); | ||||
|       glBindVertexArray(p->vao_); | ||||
| 
 | ||||
|       p->Update(); | ||||
|       p->shaderProgram_->Use(); | ||||
|  | @ -241,12 +229,12 @@ void PlacefileLines::Render( | |||
|          // If thresholding is enabled, set the map distance
 | ||||
|          units::length::nautical_miles<float> mapDistance = | ||||
|             util::maplibre::GetMapDistance(params); | ||||
|          gl.glUniform1f(p->uMapDistanceLocation_, mapDistance.value()); | ||||
|          glUniform1f(p->uMapDistanceLocation_, mapDistance.value()); | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|          // If thresholding is disabled, set the map distance to 0
 | ||||
|          gl.glUniform1f(p->uMapDistanceLocation_, 0.0f); | ||||
|          glUniform1f(p->uMapDistanceLocation_, 0.0f); | ||||
|       } | ||||
| 
 | ||||
|       // Selected time
 | ||||
|  | @ -254,23 +242,21 @@ void PlacefileLines::Render( | |||
|          (p->selectedTime_ == std::chrono::system_clock::time_point {}) ? | ||||
|             std::chrono::system_clock::now() : | ||||
|             p->selectedTime_; | ||||
|       gl.glUniform1i( | ||||
|       glUniform1i( | ||||
|          p->uSelectedTimeLocation_, | ||||
|          static_cast<GLint>(std::chrono::duration_cast<std::chrono::minutes>( | ||||
|                                selectedTime.time_since_epoch()) | ||||
|                                .count())); | ||||
| 
 | ||||
|       // Draw icons
 | ||||
|       gl.glDrawArrays(GL_TRIANGLES, 0, p->numVertices_); | ||||
|       glDrawArrays(GL_TRIANGLES, 0, p->numVertices_); | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| void PlacefileLines::Deinitialize() | ||||
| { | ||||
|    gl::OpenGLFunctions& gl = p->context_->gl(); | ||||
| 
 | ||||
|    gl.glDeleteVertexArrays(1, &p->vao_); | ||||
|    gl.glDeleteBuffers(2, p->vbo_.data()); | ||||
|    glDeleteVertexArrays(1, &p->vao_); | ||||
|    glDeleteBuffers(2, p->vbo_.data()); | ||||
| 
 | ||||
|    std::unique_lock lock {p->lineMutex_}; | ||||
| 
 | ||||
|  | @ -482,21 +468,19 @@ void PlacefileLines::Impl::Update() | |||
|    // If the placefile has been updated
 | ||||
|    if (dirty_) | ||||
|    { | ||||
|       gl::OpenGLFunctions& gl = context_->gl(); | ||||
| 
 | ||||
|       // Buffer lines data
 | ||||
|       gl.glBindBuffer(GL_ARRAY_BUFFER, vbo_[0]); | ||||
|       gl.glBufferData(GL_ARRAY_BUFFER, | ||||
|                       sizeof(float) * currentLinesBuffer_.size(), | ||||
|                       currentLinesBuffer_.data(), | ||||
|                       GL_DYNAMIC_DRAW); | ||||
|       glBindBuffer(GL_ARRAY_BUFFER, vbo_[0]); | ||||
|       glBufferData(GL_ARRAY_BUFFER, | ||||
|                    sizeof(float) * currentLinesBuffer_.size(), | ||||
|                    currentLinesBuffer_.data(), | ||||
|                    GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|       // Buffer threshold data
 | ||||
|       gl.glBindBuffer(GL_ARRAY_BUFFER, vbo_[1]); | ||||
|       gl.glBufferData(GL_ARRAY_BUFFER, | ||||
|                       sizeof(GLint) * currentIntegerBuffer_.size(), | ||||
|                       currentIntegerBuffer_.data(), | ||||
|                       GL_DYNAMIC_DRAW); | ||||
|       glBindBuffer(GL_ARRAY_BUFFER, vbo_[1]); | ||||
|       glBufferData(GL_ARRAY_BUFFER, | ||||
|                    sizeof(GLint) * currentIntegerBuffer_.size(), | ||||
|                    currentIntegerBuffer_.data(), | ||||
|                    GL_DYNAMIC_DRAW); | ||||
|    } | ||||
| 
 | ||||
|    dirty_ = false; | ||||
|  |  | |||
|  | @ -130,7 +130,7 @@ public: | |||
| 
 | ||||
| PlacefilePolygons::PlacefilePolygons( | ||||
|    const std::shared_ptr<GlContext>& context) : | ||||
|     DrawItem(context->gl()), p(std::make_unique<Impl>(context)) | ||||
|     DrawItem(), p(std::make_unique<Impl>(context)) | ||||
| { | ||||
| } | ||||
| PlacefilePolygons::~PlacefilePolygons() = default; | ||||
|  | @ -152,8 +152,6 @@ void PlacefilePolygons::set_thresholded(bool thresholded) | |||
| 
 | ||||
| void PlacefilePolygons::Initialize() | ||||
| { | ||||
|    gl::OpenGLFunctions& gl = p->context_->gl(); | ||||
| 
 | ||||
|    p->shaderProgram_ = p->context_->GetShaderProgram( | ||||
|       {{GL_VERTEX_SHADER, ":/gl/map_color.vert"}, | ||||
|        {GL_GEOMETRY_SHADER, ":/gl/threshold.geom"}, | ||||
|  | @ -168,58 +166,58 @@ void PlacefilePolygons::Initialize() | |||
|    p->uSelectedTimeLocation_ = | ||||
|       p->shaderProgram_->GetUniformLocation("uSelectedTime"); | ||||
| 
 | ||||
|    gl.glGenVertexArrays(1, &p->vao_); | ||||
|    gl.glGenBuffers(2, p->vbo_.data()); | ||||
|    glGenVertexArrays(1, &p->vao_); | ||||
|    glGenBuffers(2, p->vbo_.data()); | ||||
| 
 | ||||
|    gl.glBindVertexArray(p->vao_); | ||||
|    gl.glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[0]); | ||||
|    gl.glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
|    glBindVertexArray(p->vao_); | ||||
|    glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[0]); | ||||
|    glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|    // aScreenCoord
 | ||||
|    gl.glVertexAttribPointer(0, | ||||
|                             2, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerVertex * sizeof(float), | ||||
|                             static_cast<void*>(0)); | ||||
|    gl.glEnableVertexAttribArray(0); | ||||
|    glVertexAttribPointer(0, | ||||
|                          2, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerVertex * sizeof(float), | ||||
|                          static_cast<void*>(0)); | ||||
|    glEnableVertexAttribArray(0); | ||||
| 
 | ||||
|    // aXYOffset
 | ||||
|    gl.glVertexAttribPointer(1, | ||||
|                             2, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerVertex * sizeof(float), | ||||
|                             reinterpret_cast<void*>(2 * sizeof(float))); | ||||
|    gl.glEnableVertexAttribArray(1); | ||||
|    glVertexAttribPointer(1, | ||||
|                          2, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerVertex * sizeof(float), | ||||
|                          reinterpret_cast<void*>(2 * sizeof(float))); | ||||
|    glEnableVertexAttribArray(1); | ||||
| 
 | ||||
|    // aColor
 | ||||
|    gl.glVertexAttribPointer(2, | ||||
|                             4, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerVertex * sizeof(float), | ||||
|                             reinterpret_cast<void*>(4 * sizeof(float))); | ||||
|    gl.glEnableVertexAttribArray(2); | ||||
|    glVertexAttribPointer(2, | ||||
|                          4, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerVertex * sizeof(float), | ||||
|                          reinterpret_cast<void*>(4 * sizeof(float))); | ||||
|    glEnableVertexAttribArray(2); | ||||
| 
 | ||||
|    gl.glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[1]); | ||||
|    gl.glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
|    glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[1]); | ||||
|    glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|    // aThreshold
 | ||||
|    gl.glVertexAttribIPointer(3, //
 | ||||
|                              1, | ||||
|                              GL_INT, | ||||
|                              kIntegersPerVertex_ * sizeof(GLint), | ||||
|                              static_cast<void*>(0)); | ||||
|    gl.glEnableVertexAttribArray(3); | ||||
|    glVertexAttribIPointer(3, //
 | ||||
|                           1, | ||||
|                           GL_INT, | ||||
|                           kIntegersPerVertex_ * sizeof(GLint), | ||||
|                           static_cast<void*>(0)); | ||||
|    glEnableVertexAttribArray(3); | ||||
| 
 | ||||
|    // aTimeRange
 | ||||
|    gl.glVertexAttribIPointer(4, //
 | ||||
|                              2, | ||||
|                              GL_INT, | ||||
|                              kIntegersPerVertex_ * sizeof(GLint), | ||||
|                              reinterpret_cast<void*>(1 * sizeof(GLint))); | ||||
|    gl.glEnableVertexAttribArray(4); | ||||
|    glVertexAttribIPointer(4, //
 | ||||
|                           2, | ||||
|                           GL_INT, | ||||
|                           kIntegersPerVertex_ * sizeof(GLint), | ||||
|                           reinterpret_cast<void*>(1 * sizeof(GLint))); | ||||
|    glEnableVertexAttribArray(4); | ||||
| 
 | ||||
|    p->dirty_ = true; | ||||
| } | ||||
|  | @ -229,9 +227,7 @@ void PlacefilePolygons::Render( | |||
| { | ||||
|    if (!p->currentBuffer_.empty()) | ||||
|    { | ||||
|       gl::OpenGLFunctions& gl = p->context_->gl(); | ||||
| 
 | ||||
|       gl.glBindVertexArray(p->vao_); | ||||
|       glBindVertexArray(p->vao_); | ||||
| 
 | ||||
|       p->Update(); | ||||
|       p->shaderProgram_->Use(); | ||||
|  | @ -244,12 +240,12 @@ void PlacefilePolygons::Render( | |||
|          // If thresholding is enabled, set the map distance
 | ||||
|          units::length::nautical_miles<float> mapDistance = | ||||
|             util::maplibre::GetMapDistance(params); | ||||
|          gl.glUniform1f(p->uMapDistanceLocation_, mapDistance.value()); | ||||
|          glUniform1f(p->uMapDistanceLocation_, mapDistance.value()); | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|          // If thresholding is disabled, set the map distance to 0
 | ||||
|          gl.glUniform1f(p->uMapDistanceLocation_, 0.0f); | ||||
|          glUniform1f(p->uMapDistanceLocation_, 0.0f); | ||||
|       } | ||||
| 
 | ||||
|       // Selected time
 | ||||
|  | @ -257,23 +253,21 @@ void PlacefilePolygons::Render( | |||
|          (p->selectedTime_ == std::chrono::system_clock::time_point {}) ? | ||||
|             std::chrono::system_clock::now() : | ||||
|             p->selectedTime_; | ||||
|       gl.glUniform1i( | ||||
|       glUniform1i( | ||||
|          p->uSelectedTimeLocation_, | ||||
|          static_cast<GLint>(std::chrono::duration_cast<std::chrono::minutes>( | ||||
|                                selectedTime.time_since_epoch()) | ||||
|                                .count())); | ||||
| 
 | ||||
|       // Draw icons
 | ||||
|       gl.glDrawArrays(GL_TRIANGLES, 0, p->numVertices_); | ||||
|       glDrawArrays(GL_TRIANGLES, 0, p->numVertices_); | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| void PlacefilePolygons::Deinitialize() | ||||
| { | ||||
|    gl::OpenGLFunctions& gl = p->context_->gl(); | ||||
| 
 | ||||
|    gl.glDeleteVertexArrays(1, &p->vao_); | ||||
|    gl.glDeleteBuffers(2, p->vbo_.data()); | ||||
|    glDeleteVertexArrays(1, &p->vao_); | ||||
|    glDeleteBuffers(2, p->vbo_.data()); | ||||
| 
 | ||||
|    std::unique_lock lock {p->bufferMutex_}; | ||||
| 
 | ||||
|  | @ -318,23 +312,21 @@ void PlacefilePolygons::Impl::Update() | |||
| { | ||||
|    if (dirty_) | ||||
|    { | ||||
|       gl::OpenGLFunctions& gl = context_->gl(); | ||||
| 
 | ||||
|       std::unique_lock lock {bufferMutex_}; | ||||
| 
 | ||||
|       // Buffer vertex data
 | ||||
|       gl.glBindBuffer(GL_ARRAY_BUFFER, vbo_[0]); | ||||
|       gl.glBufferData(GL_ARRAY_BUFFER, | ||||
|                       sizeof(GLfloat) * currentBuffer_.size(), | ||||
|                       currentBuffer_.data(), | ||||
|                       GL_DYNAMIC_DRAW); | ||||
|       glBindBuffer(GL_ARRAY_BUFFER, vbo_[0]); | ||||
|       glBufferData(GL_ARRAY_BUFFER, | ||||
|                    sizeof(GLfloat) * currentBuffer_.size(), | ||||
|                    currentBuffer_.data(), | ||||
|                    GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|       // Buffer threshold data
 | ||||
|       gl.glBindBuffer(GL_ARRAY_BUFFER, vbo_[1]); | ||||
|       gl.glBufferData(GL_ARRAY_BUFFER, | ||||
|                       sizeof(GLint) * currentIntegerBuffer_.size(), | ||||
|                       currentIntegerBuffer_.data(), | ||||
|                       GL_DYNAMIC_DRAW); | ||||
|       glBindBuffer(GL_ARRAY_BUFFER, vbo_[1]); | ||||
|       glBufferData(GL_ARRAY_BUFFER, | ||||
|                    sizeof(GLint) * currentIntegerBuffer_.size(), | ||||
|                    currentIntegerBuffer_.data(), | ||||
|                    GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|       numVertices_ = | ||||
|          static_cast<GLsizei>(currentBuffer_.size() / kPointsPerVertex); | ||||
|  |  | |||
|  | @ -72,7 +72,7 @@ public: | |||
| 
 | ||||
| PlacefileText::PlacefileText(const std::shared_ptr<GlContext>& context, | ||||
|                              const std::string&                placefileName) : | ||||
|     DrawItem(context->gl()), p(std::make_unique<Impl>(context, placefileName)) | ||||
|     DrawItem(), p(std::make_unique<Impl>(context, placefileName)) | ||||
| { | ||||
| } | ||||
| PlacefileText::~PlacefileText() = default; | ||||
|  |  | |||
|  | @ -74,7 +74,7 @@ public: | |||
| 
 | ||||
| PlacefileTriangles::PlacefileTriangles( | ||||
|    const std::shared_ptr<GlContext>& context) : | ||||
|     DrawItem(context->gl()), p(std::make_unique<Impl>(context)) | ||||
|     DrawItem(), p(std::make_unique<Impl>(context)) | ||||
| { | ||||
| } | ||||
| PlacefileTriangles::~PlacefileTriangles() = default; | ||||
|  | @ -96,8 +96,6 @@ void PlacefileTriangles::set_thresholded(bool thresholded) | |||
| 
 | ||||
| void PlacefileTriangles::Initialize() | ||||
| { | ||||
|    gl::OpenGLFunctions& gl = p->context_->gl(); | ||||
| 
 | ||||
|    p->shaderProgram_ = p->context_->GetShaderProgram( | ||||
|       {{GL_VERTEX_SHADER, ":/gl/map_color.vert"}, | ||||
|        {GL_GEOMETRY_SHADER, ":/gl/threshold.geom"}, | ||||
|  | @ -112,58 +110,58 @@ void PlacefileTriangles::Initialize() | |||
|    p->uSelectedTimeLocation_ = | ||||
|       p->shaderProgram_->GetUniformLocation("uSelectedTime"); | ||||
| 
 | ||||
|    gl.glGenVertexArrays(1, &p->vao_); | ||||
|    gl.glGenBuffers(2, p->vbo_.data()); | ||||
|    glGenVertexArrays(1, &p->vao_); | ||||
|    glGenBuffers(2, p->vbo_.data()); | ||||
| 
 | ||||
|    gl.glBindVertexArray(p->vao_); | ||||
|    gl.glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[0]); | ||||
|    gl.glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
|    glBindVertexArray(p->vao_); | ||||
|    glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[0]); | ||||
|    glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|    // aScreenCoord
 | ||||
|    gl.glVertexAttribPointer(0, | ||||
|                             2, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerVertex * sizeof(float), | ||||
|                             static_cast<void*>(0)); | ||||
|    gl.glEnableVertexAttribArray(0); | ||||
|    glVertexAttribPointer(0, | ||||
|                          2, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerVertex * sizeof(float), | ||||
|                          static_cast<void*>(0)); | ||||
|    glEnableVertexAttribArray(0); | ||||
| 
 | ||||
|    // aXYOffset
 | ||||
|    gl.glVertexAttribPointer(1, | ||||
|                             2, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerVertex * sizeof(float), | ||||
|                             reinterpret_cast<void*>(2 * sizeof(float))); | ||||
|    gl.glEnableVertexAttribArray(1); | ||||
|    glVertexAttribPointer(1, | ||||
|                          2, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerVertex * sizeof(float), | ||||
|                          reinterpret_cast<void*>(2 * sizeof(float))); | ||||
|    glEnableVertexAttribArray(1); | ||||
| 
 | ||||
|    // aColor
 | ||||
|    gl.glVertexAttribPointer(2, | ||||
|                             4, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             kPointsPerVertex * sizeof(float), | ||||
|                             reinterpret_cast<void*>(4 * sizeof(float))); | ||||
|    gl.glEnableVertexAttribArray(2); | ||||
|    glVertexAttribPointer(2, | ||||
|                          4, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          kPointsPerVertex * sizeof(float), | ||||
|                          reinterpret_cast<void*>(4 * sizeof(float))); | ||||
|    glEnableVertexAttribArray(2); | ||||
| 
 | ||||
|    gl.glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[1]); | ||||
|    gl.glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
|    glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[1]); | ||||
|    glBufferData(GL_ARRAY_BUFFER, 0u, nullptr, GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|    // aThreshold
 | ||||
|    gl.glVertexAttribIPointer(3, //
 | ||||
|                              1, | ||||
|                              GL_INT, | ||||
|                              kIntegersPerVertex_ * sizeof(GLint), | ||||
|                              static_cast<void*>(0)); | ||||
|    gl.glEnableVertexAttribArray(3); | ||||
|    glVertexAttribIPointer(3, //
 | ||||
|                           1, | ||||
|                           GL_INT, | ||||
|                           kIntegersPerVertex_ * sizeof(GLint), | ||||
|                           static_cast<void*>(0)); | ||||
|    glEnableVertexAttribArray(3); | ||||
| 
 | ||||
|    // aTimeRange
 | ||||
|    gl.glVertexAttribIPointer(4, //
 | ||||
|                              2, | ||||
|                              GL_INT, | ||||
|                              kIntegersPerVertex_ * sizeof(GLint), | ||||
|                              reinterpret_cast<void*>(1 * sizeof(GLint))); | ||||
|    gl.glEnableVertexAttribArray(4); | ||||
|    glVertexAttribIPointer(4, //
 | ||||
|                           2, | ||||
|                           GL_INT, | ||||
|                           kIntegersPerVertex_ * sizeof(GLint), | ||||
|                           reinterpret_cast<void*>(1 * sizeof(GLint))); | ||||
|    glEnableVertexAttribArray(4); | ||||
| 
 | ||||
|    p->dirty_ = true; | ||||
| } | ||||
|  | @ -173,9 +171,7 @@ void PlacefileTriangles::Render( | |||
| { | ||||
|    if (!p->currentBuffer_.empty()) | ||||
|    { | ||||
|       gl::OpenGLFunctions& gl = p->context_->gl(); | ||||
| 
 | ||||
|       gl.glBindVertexArray(p->vao_); | ||||
|       glBindVertexArray(p->vao_); | ||||
| 
 | ||||
|       p->Update(); | ||||
|       p->shaderProgram_->Use(); | ||||
|  | @ -188,12 +184,12 @@ void PlacefileTriangles::Render( | |||
|          // If thresholding is enabled, set the map distance
 | ||||
|          units::length::nautical_miles<float> mapDistance = | ||||
|             util::maplibre::GetMapDistance(params); | ||||
|          gl.glUniform1f(p->uMapDistanceLocation_, mapDistance.value()); | ||||
|          glUniform1f(p->uMapDistanceLocation_, mapDistance.value()); | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|          // If thresholding is disabled, set the map distance to 0
 | ||||
|          gl.glUniform1f(p->uMapDistanceLocation_, 0.0f); | ||||
|          glUniform1f(p->uMapDistanceLocation_, 0.0f); | ||||
|       } | ||||
| 
 | ||||
|       // Selected time
 | ||||
|  | @ -201,23 +197,21 @@ void PlacefileTriangles::Render( | |||
|          (p->selectedTime_ == std::chrono::system_clock::time_point {}) ? | ||||
|             std::chrono::system_clock::now() : | ||||
|             p->selectedTime_; | ||||
|       gl.glUniform1i( | ||||
|       glUniform1i( | ||||
|          p->uSelectedTimeLocation_, | ||||
|          static_cast<GLint>(std::chrono::duration_cast<std::chrono::minutes>( | ||||
|                                selectedTime.time_since_epoch()) | ||||
|                                .count())); | ||||
| 
 | ||||
|       // Draw icons
 | ||||
|       gl.glDrawArrays(GL_TRIANGLES, 0, p->numVertices_); | ||||
|       glDrawArrays(GL_TRIANGLES, 0, p->numVertices_); | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| void PlacefileTriangles::Deinitialize() | ||||
| { | ||||
|    gl::OpenGLFunctions& gl = p->context_->gl(); | ||||
| 
 | ||||
|    gl.glDeleteVertexArrays(1, &p->vao_); | ||||
|    gl.glDeleteBuffers(2, p->vbo_.data()); | ||||
|    glDeleteVertexArrays(1, &p->vao_); | ||||
|    glDeleteBuffers(2, p->vbo_.data()); | ||||
| 
 | ||||
|    std::unique_lock lock {p->bufferMutex_}; | ||||
| 
 | ||||
|  | @ -320,23 +314,21 @@ void PlacefileTriangles::Impl::Update() | |||
| { | ||||
|    if (dirty_) | ||||
|    { | ||||
|       gl::OpenGLFunctions& gl = context_->gl(); | ||||
| 
 | ||||
|       std::unique_lock lock {bufferMutex_}; | ||||
| 
 | ||||
|       // Buffer vertex data
 | ||||
|       gl.glBindBuffer(GL_ARRAY_BUFFER, vbo_[0]); | ||||
|       gl.glBufferData(GL_ARRAY_BUFFER, | ||||
|                       sizeof(GLfloat) * currentBuffer_.size(), | ||||
|                       currentBuffer_.data(), | ||||
|                       GL_DYNAMIC_DRAW); | ||||
|       glBindBuffer(GL_ARRAY_BUFFER, vbo_[0]); | ||||
|       glBufferData(GL_ARRAY_BUFFER, | ||||
|                    sizeof(GLfloat) * currentBuffer_.size(), | ||||
|                    currentBuffer_.data(), | ||||
|                    GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|       // Buffer threshold data
 | ||||
|       gl.glBindBuffer(GL_ARRAY_BUFFER, vbo_[1]); | ||||
|       gl.glBufferData(GL_ARRAY_BUFFER, | ||||
|                       sizeof(GLint) * currentIntegerBuffer_.size(), | ||||
|                       currentIntegerBuffer_.data(), | ||||
|                       GL_DYNAMIC_DRAW); | ||||
|       glBindBuffer(GL_ARRAY_BUFFER, vbo_[1]); | ||||
|       glBufferData(GL_ARRAY_BUFFER, | ||||
|                    sizeof(GLint) * currentIntegerBuffer_.size(), | ||||
|                    currentIntegerBuffer_.data(), | ||||
|                    GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|       numVertices_ = | ||||
|          static_cast<GLsizei>(currentBuffer_.size() / kPointsPerVertex); | ||||
|  |  | |||
|  | @ -73,7 +73,7 @@ public: | |||
| }; | ||||
| 
 | ||||
| Rectangle::Rectangle(std::shared_ptr<GlContext> context) : | ||||
|     DrawItem(context->gl()), p(std::make_unique<Impl>(context)) | ||||
|     DrawItem(), p(std::make_unique<Impl>(context)) | ||||
| { | ||||
| } | ||||
| Rectangle::~Rectangle() = default; | ||||
|  | @ -83,41 +83,39 @@ Rectangle& Rectangle::operator=(Rectangle&&) noexcept = default; | |||
| 
 | ||||
| void Rectangle::Initialize() | ||||
| { | ||||
|    gl::OpenGLFunctions& gl = p->context_->gl(); | ||||
| 
 | ||||
|    p->shaderProgram_ = | ||||
|       p->context_->GetShaderProgram(":/gl/color.vert", ":/gl/color.frag"); | ||||
| 
 | ||||
|    p->uMVPMatrixLocation_ = | ||||
|       gl.glGetUniformLocation(p->shaderProgram_->id(), "uMVPMatrix"); | ||||
|       glGetUniformLocation(p->shaderProgram_->id(), "uMVPMatrix"); | ||||
|    if (p->uMVPMatrixLocation_ == -1) | ||||
|    { | ||||
|       logger_->warn("Could not find uMVPMatrix"); | ||||
|    } | ||||
| 
 | ||||
|    gl.glGenVertexArrays(1, &p->vao_); | ||||
|    gl.glGenBuffers(1, &p->vbo_); | ||||
|    glGenVertexArrays(1, &p->vao_); | ||||
|    glGenBuffers(1, &p->vbo_); | ||||
| 
 | ||||
|    gl.glBindVertexArray(p->vao_); | ||||
|    gl.glBindBuffer(GL_ARRAY_BUFFER, p->vbo_); | ||||
|    gl.glBufferData( | ||||
|    glBindVertexArray(p->vao_); | ||||
|    glBindBuffer(GL_ARRAY_BUFFER, p->vbo_); | ||||
|    glBufferData( | ||||
|       GL_ARRAY_BUFFER, sizeof(float) * BUFFER_LENGTH, nullptr, GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|    gl.glVertexAttribPointer(0, | ||||
|                             3, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             POINTS_PER_VERTEX * sizeof(float), | ||||
|                             static_cast<void*>(0)); | ||||
|    gl.glEnableVertexAttribArray(0); | ||||
|    glVertexAttribPointer(0, | ||||
|                          3, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          POINTS_PER_VERTEX * sizeof(float), | ||||
|                          static_cast<void*>(0)); | ||||
|    glEnableVertexAttribArray(0); | ||||
| 
 | ||||
|    gl.glVertexAttribPointer(1, | ||||
|                             4, | ||||
|                             GL_FLOAT, | ||||
|                             GL_FALSE, | ||||
|                             POINTS_PER_VERTEX * sizeof(float), | ||||
|                             reinterpret_cast<void*>(3 * sizeof(float))); | ||||
|    gl.glEnableVertexAttribArray(1); | ||||
|    glVertexAttribPointer(1, | ||||
|                          4, | ||||
|                          GL_FLOAT, | ||||
|                          GL_FALSE, | ||||
|                          POINTS_PER_VERTEX * sizeof(float), | ||||
|                          reinterpret_cast<void*>(3 * sizeof(float))); | ||||
|    glEnableVertexAttribArray(1); | ||||
| 
 | ||||
|    p->dirty_ = true; | ||||
| } | ||||
|  | @ -126,10 +124,8 @@ void Rectangle::Render(const QMapLibre::CustomLayerRenderParameters& params) | |||
| { | ||||
|    if (p->visible_) | ||||
|    { | ||||
|       gl::OpenGLFunctions& gl = p->context_->gl(); | ||||
| 
 | ||||
|       gl.glBindVertexArray(p->vao_); | ||||
|       gl.glBindBuffer(GL_ARRAY_BUFFER, p->vbo_); | ||||
|       glBindVertexArray(p->vao_); | ||||
|       glBindBuffer(GL_ARRAY_BUFFER, p->vbo_); | ||||
| 
 | ||||
|       p->Update(); | ||||
|       p->shaderProgram_->Use(); | ||||
|  | @ -138,23 +134,21 @@ void Rectangle::Render(const QMapLibre::CustomLayerRenderParameters& params) | |||
|       if (p->fillColor_.has_value()) | ||||
|       { | ||||
|          // Draw fill
 | ||||
|          gl.glDrawArrays(GL_TRIANGLES, 24, 6); | ||||
|          glDrawArrays(GL_TRIANGLES, 24, 6); | ||||
|       } | ||||
| 
 | ||||
|       if (p->borderWidth_ > 0.0f) | ||||
|       { | ||||
|          // Draw border
 | ||||
|          gl.glDrawArrays(GL_TRIANGLES, 0, 24); | ||||
|          glDrawArrays(GL_TRIANGLES, 0, 24); | ||||
|       } | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| void Rectangle::Deinitialize() | ||||
| { | ||||
|    gl::OpenGLFunctions& gl = p->context_->gl(); | ||||
| 
 | ||||
|    gl.glDeleteVertexArrays(1, &p->vao_); | ||||
|    gl.glDeleteBuffers(1, &p->vbo_); | ||||
|    glDeleteVertexArrays(1, &p->vao_); | ||||
|    glDeleteBuffers(1, &p->vbo_); | ||||
| } | ||||
| 
 | ||||
| void Rectangle::SetBorder(float width, boost::gil::rgba8_pixel_t color) | ||||
|  | @ -206,8 +200,6 @@ void Rectangle::Impl::Update() | |||
| { | ||||
|    if (dirty_) | ||||
|    { | ||||
|       gl::OpenGLFunctions& gl = context_->gl(); | ||||
| 
 | ||||
|       const float lox = x_; | ||||
|       const float rox = x_ + width_; | ||||
|       const float boy = y_; | ||||
|  | @ -289,10 +281,10 @@ void Rectangle::Impl::Update() | |||
|              {lox, toy, z_, fc0, fc1, fc2, fc3}  // TL
 | ||||
|           }}; | ||||
| 
 | ||||
|       gl.glBufferData(GL_ARRAY_BUFFER, | ||||
|                       sizeof(float) * BUFFER_LENGTH, | ||||
|                       buffer, | ||||
|                       GL_DYNAMIC_DRAW); | ||||
|       glBufferData(GL_ARRAY_BUFFER, | ||||
|                    sizeof(float) * BUFFER_LENGTH, | ||||
|                    buffer, | ||||
|                    GL_DYNAMIC_DRAW); | ||||
| 
 | ||||
|       dirty_ = false; | ||||
|    } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat