#pragma once #include #include #include #include #include #include #include #include #include #include #include #include namespace mbgl { class Worker; class DebugBucket; class TransformState; class TileDataObserver; namespace style { class Layer; } class TileData : private util::noncopyable { public: TileData(const OverscaledTileID&); virtual ~TileData(); void setObserver(TileDataObserver* observer); enum class Necessity : bool { Optional = false, Required = true, }; virtual void setNecessity(Necessity) = 0; // Mark this tile as no longer needed and cancel any pending work. virtual void cancel() = 0; virtual Bucket* getBucket(const style::Layer&) = 0; virtual bool parsePending() { return true; } virtual void redoPlacement(PlacementConfig) {} virtual void queryRenderedFeatures( std::unordered_map>& result, const GeometryCoordinates& queryGeometry, const TransformState&, const optional>& layerIDs); void setTriedOptional(); // Returns true when the tile source has received a first response, regardless of whether a load // error occurred or actual data was loaded. bool hasTriedOptional() const { return triedOptional; } // Tile data considered "Renderable" can be used for rendering. Data in // partial state is still waiting for network resources but can also // be rendered, although layers will be missing. bool isRenderable() const { return availableData != DataAvailability::None; } bool isComplete() const { return availableData == DataAvailability::All; } bool isIncomplete() const { return availableData == DataAvailability::Some; } void dumpDebugLogs() const; const OverscaledTileID id; optional modified; optional expires; // Contains the tile ID string for painting debug information. std::unique_ptr debugBucket; protected: bool triedOptional = false; enum class DataAvailability : uint8_t { // Still waiting for data to load or parse. None, // TileData is partially parsed, some buckets are still waiting for dependencies // to arrive, but it is good for rendering. Partial tiles can also be re-parsed, // but might remain in the same state if dependencies are still missing. Some, // TileData is fully parsed, and all buckets are available if they exist. All, }; DataAvailability availableData = DataAvailability::None; TileDataObserver* observer = nullptr; }; } // namespace mbgl