#ifndef MBGL_MAP_TILE_WORKER #define MBGL_MAP_TILE_WORKER #include #include #include #include #include #include #include #include #include #include #include #include #include namespace mbgl { class CollisionTile; class GeometryTile; class Style; class Bucket; class StyleLayer; class StyleBucket; class GeometryTileLayer; using TileParseResult = mapbox::util::variant< TileData::State, // success std::string>; // error class TileWorker : public util::noncopyable { public: TileWorker(TileID, std::string sourceID, uint16_t maxZoom, Style&, std::vector>, const std::atomic&, std::unique_ptr); ~TileWorker(); Bucket* getBucket(const StyleLayer&) const; TileParseResult parse(const GeometryTile&); void redoPlacement(float angle, float pitch, bool collisionDebug); std::vector> layers; private: void parseLayer(const StyleLayer&, const GeometryTile&); std::unique_ptr createFillBucket(const GeometryTileLayer&, const StyleBucket&); std::unique_ptr createLineBucket(const GeometryTileLayer&, const StyleBucket&); std::unique_ptr createCircleBucket(const GeometryTileLayer&, const StyleBucket&); std::unique_ptr createSymbolBucket(const GeometryTileLayer&, const StyleBucket&); template void addBucketGeometries(Bucket&, const GeometryTileLayer&, const FilterExpression&); const TileID id; const std::string sourceID; const uint16_t maxZoom; Style& style; const std::atomic& state; bool partialParse = false; FillVertexBuffer fillVertexBuffer; LineVertexBuffer lineVertexBuffer; CircleVertexBuffer circleVertexBuffer; TriangleElementsBuffer triangleElementsBuffer; LineElementsBuffer lineElementsBuffer; std::unique_ptr collisionTile; // Contains all the Bucket objects for the tile. Buckets are render // objects and they get added to this map as they get processed. // Tiles partially parsed can get new buckets at any moment but are // also fit for rendering. That said, access to this list needs locking // unless the tile is completely parsed. std::unordered_map> buckets; mutable std::mutex bucketsMutex; }; } #endif