#pragma once #include #include #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: enum class LineShaderType { Classic, MetalWideVector }; struct LineOptions { gfx::PolylineGeneratorOptions geometry; float blur = 0.f; float opacity = 1.f; float gapWidth = 0.f; float offset = 0.f; float width = 1.f; LineShaderType shaderType = LineShaderType::Classic; Color color; }; struct FillOptions { Color color; float opacity = 1.f; }; struct SymbolOptions { Size size; gfx::Texture2DPtr texture; std::array anchor{0.5f, 0.5f}; std::array, 2> textureCoordinates{{{0, 0}, {1, 1}}}; float angleDegrees{.0f}; bool scaleWithMap{false}; bool pitchWithMap{false}; }; 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 Set the Symbol options * * @param options */ void setSymbolOptions(const SymbolOptions& options); /** * @brief Add a polyline * * @param coordinates in tile range * @return true if the polyline was added */ bool addPolyline(const GeometryCoordinates& coordinates); /** * @brief Add a polyline * * @param coordinates Geographic coordinates * @return true if the polyline was added */ bool addPolyline(const LineString& coordinates); /** * @brief Add a multipolygon area fill * * @param geometry a collection of rings with optional holes * @return true if the fill was added */ bool addFill(const GeometryCollection& geometry); /** * @brief Add a symbol * * @param point * @return true if the symbol was added */ bool addSymbol(const GeometryCoordinate& point); /** * @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 lineShaderWideVector() const; gfx::ShaderPtr fillShaderDefault() const; gfx::ShaderPtr symbolShaderDefault() const; enum class BuilderType { None, LineClassic, LineWideVector, Fill, Symbol }; std::unique_ptr createBuilder(const std::string& name, gfx::ShaderPtr shader) const; bool updateBuilder(BuilderType type, const std::string& name, gfx::ShaderPtr shader); std::unique_ptr builder; std::optional tileID; gfx::ShaderPtr lineShader; gfx::ShaderPtr fillShader; gfx::ShaderPtr symbolShader; LineOptions lineOptions; FillOptions fillOptions; SymbolOptions symbolOptions; BuilderType builderType{BuilderType::None}; }; 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