#pragma once #include #include #include #include #include #include #include namespace mbgl { class LayerGroupBase; class PaintParameters; class RenderOrchestrator; 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; /** 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; } const std::string& getName() const { return name; } void setName(std::string value) { name = std::move(value); } int32_t getLayerIndex() const { return layerIndex; } void updateLayerIndex(int32_t value) { layerIndex = value; } virtual std::size_t getDrawableCount() const = 0; bool empty() const { return getDrawableCount() == 0; } virtual std::size_t clearDrawables() = 0; /// 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 observeDrawables(const std::function&&) = 0; virtual std::size_t observeDrawables(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 keep and false to discard it. /// @return The number of items removed virtual std::size_t observeDrawablesRemove(const std::function&& f) = 0; /// Attach a tweaker to be run on this layer group for each frame void setLayerTweaker(LayerTweakerPtr tweaker) { layerTweaker = std::move(tweaker); } /// Get the tweaker attached to this layer group const LayerTweakerPtr& getLayerTweaker() const { return layerTweaker; } protected: bool enabled = true; int32_t layerIndex; LayerTweakerPtr layerTweaker; 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 observeDrawables(const std::function&&) override; std::size_t observeDrawables(const std::function&&) const override; std::size_t observeDrawablesRemove(const std::function&&) override; /// Call the provided function for each drawable for the given tile std::size_t observeDrawables(mbgl::RenderPass, const OverscaledTileID&, const std::function&&); std::size_t observeDrawables(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 observeDrawables(const std::function&&) override; std::size_t observeDrawables(const std::function&&) const override; std::size_t observeDrawablesRemove(const std::function&&) override; std::size_t clearDrawables() override; protected: struct Impl; std::unique_ptr impl; }; } // namespace mbgl