#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, WideVector }; 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; Color color; }; struct FillOptions { Color color; float opacity = 1.f; }; struct SymbolOptions { Size size; gfx::Texture2DPtr texture; std::array anchor{0.5f, 0.5f}; float angleDegrees{.0f}; bool scaleWithMap{false}; bool pitchWithMap{false}; }; struct GeometryVertex { std::array position; std::array texcoords; }; struct GeometryOptions { mat4 matrix = matrix::identity4(); Color color = Color::white(); gfx::Texture2DPtr texture; }; template using TweakerCallback = std::function; using LineTweakerCallback = TweakerCallback; using FillTweakerCallback = TweakerCallback; using SymbolTweakerCallback = TweakerCallback; using GeometryTweakerCallback = TweakerCallback; 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 Set the geometry options * * @param options */ void setGeometryOptions(const GeometryOptions& options); void setLineTweakerCallback(LineTweakerCallback&& callback) { lineTweakerCallback = callback; } void setFillTweakerCallback(FillTweakerCallback&& callback) { fillTweakerCallback = callback; } void setSymbolTweakerCallback(SymbolTweakerCallback&& callback) { symbolTweakerCallback = callback; } void setGeometryTweakerCallback(GeometryTweakerCallback&& callback) { geometryTweakerCallback = callback; } /** * @brief Add a polyline * * @param coordinates in tile range * @param shaderType * @return a valid util::SimpleIdentity if the polyline was added */ util::SimpleIdentity addPolyline(const GeometryCoordinates& coordinates, LineShaderType shaderType = LineShaderType::Classic); /** * @brief Add a polyline * * @param coordinates Geographic coordinates * @param shaderType * @return a valid util::SimpleIdentity if the poline was added */ util::SimpleIdentity addPolyline(const LineString& coordinates, LineShaderType shaderType = LineShaderType::Classic); /** * @brief Add a multipolygon area fill * * @param geometry a collection of rings with optional holes * @return a valid util::SimpleIdentity if the fill was added */ util::SimpleIdentity addFill(const GeometryCollection& geometry); /** * @brief Add a symbol * * @param point * @param textureCoordinates (optional mapping) * @return a valid util::SimpleIdentity if the symbol was added */ util::SimpleIdentity addSymbol(const GeometryCoordinate& point, const std::array, 2>& textureCoordinates = {{{0, 0}, {1, 1}}}); util::SimpleIdentity addGeometry(std::shared_ptr> vertices, std::shared_ptr> indices, bool is3D); /** * @brief Finish the current drawable building session * */ void finish(); void removeDrawable(const util::SimpleIdentity& id); 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; gfx::ShaderPtr geometryShaderDefault() const; enum class BuilderType { None, LineClassic, LineWideVector, Fill, Symbol, Geometry }; 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; LineOptions lineOptions; FillOptions fillOptions; SymbolOptions symbolOptions; GeometryOptions geometryOptions; LineTweakerCallback lineTweakerCallback; FillTweakerCallback fillTweakerCallback; SymbolTweakerCallback symbolTweakerCallback; GeometryTweakerCallback geometryTweakerCallback; 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