#pragma once #include #include #include #include #include #include #include #include #include #include namespace mbgl { namespace style { class CustomDrawableLayerHost { public: class Interface; public: virtual ~CustomDrawableLayerHost() = default; virtual void initialize() = 0; virtual void update(Interface& interface) = 0; virtual void deinitialize() = 0; }; class CustomDrawableLayerHost::Interface { public: struct LineOptions { Color color; float blur = 0.f; float opacity = 1.f; float gapWidth = 0.f; float offset = 0.f; float width = 1.f; gfx::PolylineGeneratorOptions geometry; }; struct FillOptions { Color color; float opacity = 1.f; }; public: /// @brief Construct a new Interface object (internal core use only) Interface(RenderLayer& layer, LayerGroupBasePtr& layerGroup, gfx::ShaderRegistry& shaders, gfx::Context& context, const TransformState& state, const std::shared_ptr& updateParameters, const RenderTree& renderTree, UniqueChangeRequestVec& changes); /** * @brief Get the drawable count * * @return std::size_t */ std::size_t getDrawableCount() const; /** * @brief Set the Tile ID * * @param tileID */ void setTileID(OverscaledTileID tileID); /** * @brief Set the line options * * @param options */ void setLineOptions(const LineOptions& options); /** * @brief Set the fill options * * @param options */ void setFillOptions(const FillOptions& options); /** * @brief Add a polyline * * @param coordinates * @param options Polyline options */ void addPolyline(const GeometryCoordinates& coordinates); void addFill(const GeometryCollection& geometry); /** * @brief Finish the current drawable building session * */ void finish(); public: RenderLayer& layer; LayerGroupBasePtr& layerGroup; gfx::ShaderRegistry& shaders; gfx::Context& context; const TransformState& state; const std::shared_ptr& updateParameters; const RenderTree& renderTree; UniqueChangeRequestVec& changes; private: gfx::ShaderPtr lineShaderDefault() const; gfx::ShaderPtr fillShaderDefault() const; std::unique_ptr createBuilder(const std::string& name, gfx::ShaderPtr shader) const; gfx::ShaderPtr lineShader; gfx::ShaderPtr fillShader; std::unique_ptr builder; std::optional tileID; LineOptions lineOptions; FillOptions fillOptions; }; class CustomDrawableLayer final : public Layer { public: CustomDrawableLayer(const std::string& id, std::unique_ptr host); CustomDrawableLayer(const CustomDrawableLayer&) = delete; ~CustomDrawableLayer() final; class Impl; const Impl& impl() const; Mutable mutableImpl() const; private: std::optional setPropertyInternal(const std::string& name, const conversion::Convertible& value) final; StyleProperty getProperty(const std::string&) const final; std::unique_ptr cloneRef(const std::string& id) const final; Mutable mutableBaseImpl() const final; }; } // namespace style } // namespace mbgl