Update placefile icon texture coordinates when the texture atlas changes

This commit is contained in:
Dan Paulat 2023-08-19 22:52:38 -05:00
parent e021484bfb
commit 565734217b
7 changed files with 55 additions and 16 deletions

View file

@ -41,6 +41,17 @@ DrawItem::~DrawItem() = default;
DrawItem::DrawItem(DrawItem&&) noexcept = default; DrawItem::DrawItem(DrawItem&&) noexcept = default;
DrawItem& DrawItem::operator=(DrawItem&&) noexcept = default; DrawItem& DrawItem::operator=(DrawItem&&) noexcept = default;
void DrawItem::Render(
const QMapLibreGL::CustomLayerRenderParameters& /* params */)
{
}
void DrawItem::Render(const QMapLibreGL::CustomLayerRenderParameters& params,
bool /* textureAtlasChanged */)
{
Render(params);
}
void DrawItem::UseDefaultProjection( void DrawItem::UseDefaultProjection(
const QMapLibreGL::CustomLayerRenderParameters& params, const QMapLibreGL::CustomLayerRenderParameters& params,
GLint uMVPMatrixLocation) GLint uMVPMatrixLocation)

View file

@ -28,8 +28,9 @@ public:
DrawItem& operator=(DrawItem&&) noexcept; DrawItem& operator=(DrawItem&&) noexcept;
virtual void Initialize() = 0; virtual void Initialize() = 0;
virtual void virtual void Render(const QMapLibreGL::CustomLayerRenderParameters& params);
Render(const QMapLibreGL::CustomLayerRenderParameters& params) = 0; virtual void Render(const QMapLibreGL::CustomLayerRenderParameters& params,
bool textureAtlasChanged);
virtual void Deinitialize() = 0; virtual void Deinitialize() = 0;
protected: protected:

View file

@ -37,8 +37,6 @@ struct PlacefileIconInfo
auto baseUrl = QUrl::fromUserInput(QString::fromStdString(baseUrlString)); auto baseUrl = QUrl::fromUserInput(QString::fromStdString(baseUrlString));
auto relativeUrl = QUrl(QString::fromStdString(iconFile->filename_)); auto relativeUrl = QUrl(QString::fromStdString(iconFile->filename_));
resolvedUrl_ = baseUrl.resolved(relativeUrl).toString().toStdString(); resolvedUrl_ = baseUrl.resolved(relativeUrl).toString().toStdString();
UpdateTextureInfo();
} }
void UpdateTextureInfo(); void UpdateTextureInfo();
@ -78,10 +76,9 @@ public:
std::mutex iconMutex_; std::mutex iconMutex_;
boost::unordered_flat_map<std::size_t, const PlacefileIconInfo> boost::unordered_flat_map<std::size_t, PlacefileIconInfo>
currentIconFiles_ {}; currentIconFiles_ {};
boost::unordered_flat_map<std::size_t, const PlacefileIconInfo> boost::unordered_flat_map<std::size_t, PlacefileIconInfo> newIconFiles_ {};
newIconFiles_ {};
std::vector<std::shared_ptr<const gr::Placefile::IconDrawItem>> std::vector<std::shared_ptr<const gr::Placefile::IconDrawItem>>
currentIconList_ {}; currentIconList_ {};
@ -103,7 +100,7 @@ public:
GLsizei numVertices_; GLsizei numVertices_;
void UpdateBuffers(); void UpdateBuffers();
void Update(); void Update(bool textureAtlasChanged);
}; };
PlacefileIcons::PlacefileIcons(std::shared_ptr<GlContext> context) : PlacefileIcons::PlacefileIcons(std::shared_ptr<GlContext> context) :
@ -203,7 +200,8 @@ void PlacefileIcons::Initialize()
} }
void PlacefileIcons::Render( void PlacefileIcons::Render(
const QMapLibreGL::CustomLayerRenderParameters& params) const QMapLibreGL::CustomLayerRenderParameters& params,
bool textureAtlasChanged)
{ {
std::unique_lock lock {p->iconMutex_}; std::unique_lock lock {p->iconMutex_};
@ -213,7 +211,7 @@ void PlacefileIcons::Render(
gl.glBindVertexArray(p->vao_); gl.glBindVertexArray(p->vao_);
p->Update(); p->Update(textureAtlasChanged);
p->shaderProgram_->Use(); p->shaderProgram_->Use();
UseRotationProjection(params, p->uMVPMatrixLocation_); UseRotationProjection(params, p->uMVPMatrixLocation_);
UseMapProjection( UseMapProjection(
@ -329,8 +327,6 @@ void PlacefileIcons::FinishIcons()
p->newIconList_.clear(); p->newIconList_.clear();
p->newIconFiles_.clear(); p->newIconFiles_.clear();
p->UpdateBuffers();
// Mark the draw item dirty // Mark the draw item dirty
p->dirty_ = true; p->dirty_ = true;
} }
@ -434,8 +430,21 @@ void PlacefileIcons::Impl::UpdateBuffers()
dirty_ = true; dirty_ = true;
} }
void PlacefileIcons::Impl::Update() void PlacefileIcons::Impl::Update(bool textureAtlasChanged)
{ {
// If the texture atlas has changed
if (textureAtlasChanged)
{
// Update texture coordinates
for (auto& iconFile : currentIconFiles_)
{
iconFile.second.UpdateTextureInfo();
}
// Update OpenGL buffer data
UpdateBuffers();
}
if (dirty_) if (dirty_)
{ {
gl::OpenGLFunctions& gl = context_->gl(); gl::OpenGLFunctions& gl = context_->gl();

View file

@ -30,7 +30,8 @@ public:
void set_thresholded(bool thresholded); void set_thresholded(bool thresholded);
void Initialize() override; void Initialize() override;
void Render(const QMapLibreGL::CustomLayerRenderParameters& params) override; void Render(const QMapLibreGL::CustomLayerRenderParameters& params,
bool textureAtlasChanged) override;
void Deinitialize() override; void Deinitialize() override;
/** /**

View file

@ -52,6 +52,11 @@ gl::OpenGLFunctions& GlContext::gl()
return p->gl_; return p->gl_;
} }
std::uint64_t GlContext::texture_buffer_count() const
{
return p->textureBufferCount_;
}
std::shared_ptr<gl::ShaderProgram> std::shared_ptr<gl::ShaderProgram>
GlContext::GetShaderProgram(const std::string& vertexPath, GlContext::GetShaderProgram(const std::string& vertexPath,
const std::string& fragmentPath) const std::string& fragmentPath)

View file

@ -24,6 +24,8 @@ public:
gl::OpenGLFunctions& gl(); gl::OpenGLFunctions& gl();
std::uint64_t texture_buffer_count() const;
std::shared_ptr<gl::ShaderProgram> std::shared_ptr<gl::ShaderProgram>
GetShaderProgram(const std::string& vertexPath, GetShaderProgram(const std::string& vertexPath,
const std::string& fragmentPath); const std::string& fragmentPath);

View file

@ -24,6 +24,8 @@ public:
std::shared_ptr<MapContext> context_; std::shared_ptr<MapContext> context_;
std::vector<std::shared_ptr<gl::draw::DrawItem>> drawList_; std::vector<std::shared_ptr<gl::draw::DrawItem>> drawList_;
GLuint textureAtlas_; GLuint textureAtlas_;
std::uint64_t textureAtlasBuildCount_ {};
}; };
DrawLayer::DrawLayer(std::shared_ptr<MapContext> context) : DrawLayer::DrawLayer(std::shared_ptr<MapContext> context) :
@ -47,13 +49,21 @@ void DrawLayer::Render(const QMapLibreGL::CustomLayerRenderParameters& params)
gl::OpenGLFunctions& gl = p->context_->gl(); gl::OpenGLFunctions& gl = p->context_->gl();
p->textureAtlas_ = p->context_->GetTextureAtlas(); p->textureAtlas_ = p->context_->GetTextureAtlas();
// Determine if the texture atlas changed since last render
std::uint64_t newTextureAtlasBuildCount =
p->context_->texture_buffer_count();
bool textureAtlasChanged =
newTextureAtlasBuildCount != p->textureAtlasBuildCount_;
gl.glActiveTexture(GL_TEXTURE0); gl.glActiveTexture(GL_TEXTURE0);
gl.glBindTexture(GL_TEXTURE_2D, p->textureAtlas_); gl.glBindTexture(GL_TEXTURE_2D, p->textureAtlas_);
for (auto& item : p->drawList_) for (auto& item : p->drawList_)
{ {
item->Render(params); item->Render(params, textureAtlasChanged);
} }
p->textureAtlasBuildCount_ = newTextureAtlasBuildCount;
} }
void DrawLayer::Deinitialize() void DrawLayer::Deinitialize()