#pragma once #include #include #include #include #include #include #include namespace mbgl { class LayerGroupBase; class PaintParameters; class RenderOrchestrator; class RenderTree; class TileLayerGroup; using LayerGroupBasePtr = std::shared_ptr; namespace gfx { class Context; class Drawable; class UploadPass; using DrawablePtr = std::shared_ptr; using UniqueDrawable = std::unique_ptr; } // namespace gfx class LayerTweaker; using LayerTweakerPtr = std::shared_ptr; using LayerTweakerWeakPtr = std::weak_ptr; /** A layer-like group of drawables, not a group of layers. */ class LayerGroupBase : public util::SimpleIdentifiable { protected: LayerGroupBase(int32_t layerIndex, std::string name = std::string()); public: LayerGroupBase(const LayerGroupBase&) = delete; LayerGroupBase& operator=(const LayerGroupBase&) = delete; ~LayerGroupBase() override = default; /// Whether the drawables should be drawn bool getEnabled() const { return enabled; } void setEnabled(bool value) { enabled = value; } /// Get the name of the layer group const std::string& getName() const { return name; } /// Set the name of the layer group void setName(std::string value) { name = std::move(value); } /// Get the layer index int32_t getLayerIndex() const { return layerIndex; } /// Update the layer index to a new value void updateLayerIndex(int32_t value) { layerIndex = value; } /// Get the number of drawables contained virtual std::size_t getDrawableCount() const = 0; /// Whether the number of drawables contained is zero bool empty() const { return getDrawableCount() == 0; } /// Clear the drawable collection virtual std::size_t clearDrawables() = 0; /// Add a drawable void addDrawable(gfx::UniqueDrawable&); /// Called before starting each frame virtual void preRender(RenderOrchestrator&, PaintParameters&) {} /// Called during the upload pass virtual void upload(gfx::UploadPass&) {} /// Called during each render pass virtual void render(RenderOrchestrator&, PaintParameters&) {} /// Called at the end of each frame virtual void postRender(RenderOrchestrator&, PaintParameters&) {} /// Call the provided function for each drawable in priority order virtual std::size_t visitDrawables(const std::function&&) = 0; virtual std::size_t visitDrawables(const std::function&&) const = 0; /// Call the provided function for each drawable in undefined order, allowing for removal. /// @param f A function called with each drawable, returning true to discard it and false to keep it /// @return The number of items removed virtual std::size_t removeDrawablesIf(const std::function&& f) = 0; /// Attach a tweaker to be run on this layer group for each frame. /// Tweaker lifetime is controlled by the render layer and drawables, the layer group retains a weak reference. void addLayerTweaker(const LayerTweakerPtr& tweaker) { layerTweakers.emplace_back(tweaker); } void runTweakers(const RenderTree&, PaintParameters&); protected: bool enabled = true; int32_t layerIndex; std::vector layerTweakers; std::string name; }; /** A layer group for tile-based drawables. */ class TileLayerGroup : public LayerGroupBase { public: TileLayerGroup(int32_t layerIndex, std::size_t initialCapacity, std::string name); ~TileLayerGroup() override; std::size_t getDrawableCount() const override; std::size_t getDrawableCount(mbgl::RenderPass, const OverscaledTileID&) const; std::vector removeDrawables(mbgl::RenderPass, const OverscaledTileID&); void addDrawable(mbgl::RenderPass, const OverscaledTileID&, gfx::UniqueDrawable&&); std::size_t visitDrawables(const std::function&&) override; std::size_t visitDrawables(const std::function&&) const override; std::size_t removeDrawablesIf(const std::function&&) override; /// Call the provided function for each drawable for the given tile std::size_t visitDrawables(mbgl::RenderPass, const OverscaledTileID&, const std::function&&); std::size_t visitDrawables(mbgl::RenderPass, const OverscaledTileID&, const std::function&&) const; std::size_t clearDrawables() override; protected: struct Impl; std::unique_ptr impl; }; /** A layer group for non-tile-based drawables. */ class LayerGroup : public LayerGroupBase { public: LayerGroup(int32_t layerIndex, std::size_t initialCapacity, std::string name); ~LayerGroup() override; std::size_t getDrawableCount() const override; std::size_t getDrawableCount(mbgl::RenderPass) const; std::vector removeDrawables(mbgl::RenderPass); void addDrawable(gfx::UniqueDrawable&&); std::size_t visitDrawables(const std::function&&) override; std::size_t visitDrawables(const std::function&&) const override; std::size_t removeDrawablesIf(const std::function&&) override; std::size_t clearDrawables() override; protected: struct Impl; std::unique_ptr impl; }; } // namespace mbgl