#include #include #include namespace scwx { namespace qt { namespace map { static const std::string logPrefix_ = "scwx::qt::map::draw_layer"; static const auto logger_ = scwx::util::Logger::Create(logPrefix_); class DrawLayerImpl { public: explicit DrawLayerImpl(std::shared_ptr context) : context_ {context}, drawList_ {}, textureAtlas_ {GL_INVALID_INDEX} { } ~DrawLayerImpl() {} std::shared_ptr context_; std::vector> drawList_; GLuint textureAtlas_; std::uint64_t textureAtlasBuildCount_ {}; }; DrawLayer::DrawLayer(std::shared_ptr context) : GenericLayer(context), p(std::make_unique(context)) { } DrawLayer::~DrawLayer() = default; void DrawLayer::Initialize() { p->textureAtlas_ = p->context_->GetTextureAtlas(); for (auto& item : p->drawList_) { item->Initialize(); } } void DrawLayer::Render(const QMapLibreGL::CustomLayerRenderParameters& params) { gl::OpenGLFunctions& gl = p->context_->gl(); 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.glBindTexture(GL_TEXTURE_2D, p->textureAtlas_); for (auto& item : p->drawList_) { item->Render(params, textureAtlasChanged); } p->textureAtlasBuildCount_ = newTextureAtlasBuildCount; } void DrawLayer::Deinitialize() { p->textureAtlas_ = GL_INVALID_INDEX; for (auto& item : p->drawList_) { item->Deinitialize(); } } void DrawLayer::AddDrawItem(std::shared_ptr drawItem) { p->drawList_.push_back(drawItem); } } // namespace map } // namespace qt } // namespace scwx