#pragma once #include #include #include #include #include #include #include namespace mbgl { class Bucket; class BucketParameters; class TransitionParameters; class PropertyEvaluationParameters; class PaintParameters; class RenderSource; class RenderTile; class TransformState; class RenderLayer { protected: RenderLayer(style::LayerType, Immutable); const style::LayerType type; public: static std::unique_ptr create(Immutable); virtual ~RenderLayer() = default; // Begin transitions for any properties that have changed since the last frame. virtual void transition(const TransitionParameters&) = 0; // Fully evaluate possibly-transitioning paint properties based on a zoom level. virtual void evaluate(const PropertyEvaluationParameters&) = 0; // Returns true if any paint properties have active transitions. virtual bool hasTransition() const = 0; // Check whether this layer is of the given subtype. template bool is() const; // Dynamically cast this layer to the given subtype. template T* as() { return is() ? reinterpret_cast(this) : nullptr; } template const T* as() const { return is() ? reinterpret_cast(this) : nullptr; } const std::string& getID() const; // Checks whether this layer needs to be rendered in the given render pass. bool hasRenderPass(RenderPass) const; // Checks whether this layer can be rendered. bool needsRendering(float zoom) const; virtual void render(PaintParameters&, RenderSource*) = 0; // Check wether the given geometry intersects // with the feature virtual bool queryIntersectsFeature( const GeometryCoordinates&, const GeometryTileFeature&, const float, const TransformState&, const float, const mat4&) const { return false; }; virtual std::unique_ptr createBucket(const BucketParameters&, const std::vector&) const = 0; void setRenderTiles(std::vector>); // Private implementation Immutable baseImpl; void setImpl(Immutable); friend std::string layoutKey(const RenderLayer&); protected: // Checks whether the current hardware can render this layer. If it can't, we'll show a warning // in the console to inform the developer. void checkRenderability(const PaintParameters&, uint32_t activeBindingCount); protected: // renderTiles are exposed directly to CrossTileSymbolIndex and Placement so they // can update opacities in the symbol buckets immediately before rendering friend class CrossTileSymbolIndex; friend class Placement; // Stores current set of tiles to be rendered for this layer. std::vector> renderTiles; // Stores what render passes this layer is currently enabled for. This depends on the // evaluated StyleProperties object and is updated accordingly. RenderPass passes = RenderPass::None; private: // Some layers may not render correctly on some hardware when the vertex attribute limit of // that GPU is exceeded. More attributes are used when adding many data driven paint properties // to a layer. bool hasRenderFailures = false; }; } // namespace mbgl