diff --git a/src/mbgl/map/tile_parser.cpp b/src/mbgl/map/tile_parser.cpp index 201e6187a..86517da42 100644 --- a/src/mbgl/map/tile_parser.cpp +++ b/src/mbgl/map/tile_parser.cpp @@ -8,7 +8,6 @@ #include #include #include -#include #include #include @@ -35,10 +34,8 @@ TileParser::TileParser(const GeometryTile& geometryTile_, glyphStore(glyphStore_), spriteAtlas(spriteAtlas_), sprite(sprite_), - collision(util::make_unique(tile.id.z, 4096, tile.source.tile_size, tile.depth)), partialParse(false) { assert(sprite); - assert(collision); } bool TileParser::obsolete() const { @@ -196,7 +193,7 @@ std::unique_ptr TileParser::createSymbolBucket(const GeometryTileLayer& return nullptr; } - auto bucket = util::make_unique(*collision); + auto bucket = util::make_unique(*tile.getCollision()); const float z = tile.id.z; auto& layout = bucket->layout; diff --git a/src/mbgl/map/tile_parser.hpp b/src/mbgl/map/tile_parser.hpp index 18184e27a..67150bcd4 100644 --- a/src/mbgl/map/tile_parser.hpp +++ b/src/mbgl/map/tile_parser.hpp @@ -29,7 +29,6 @@ class StyleLayoutRaster; class StyleLayoutLine; class StyleLayoutSymbol; class VectorTileData; -class Collision; class TileParser : private util::noncopyable { public: @@ -69,7 +68,6 @@ private: SpriteAtlas& spriteAtlas; util::ptr sprite; - std::unique_ptr collision; bool partialParse; }; diff --git a/src/mbgl/map/vector_tile_data.cpp b/src/mbgl/map/vector_tile_data.cpp index 8f5138b58..263ad52b9 100644 --- a/src/mbgl/map/vector_tile_data.cpp +++ b/src/mbgl/map/vector_tile_data.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include using namespace mbgl; @@ -19,12 +20,13 @@ VectorTileData::VectorTileData(const TileID& id_, util::ptr sprite_, const SourceInfo& source_) : TileData(id_, source_), + depth(id_.z >= source_.max_zoom ? mapMaxZoom - id_.z : 1), glyphAtlas(glyphAtlas_), glyphStore(glyphStore_), spriteAtlas(spriteAtlas_), sprite(sprite_), style(style_), - depth(id.z >= source.max_zoom ? mapMaxZoom - id.z : 1) { + collision(util::make_unique(id_.z, 4096, source_.tile_size, depth)) { } VectorTileData::~VectorTileData() { @@ -91,3 +93,11 @@ void VectorTileData::setBucket(StyleLayer const& layer, std::unique_ptr buckets[layer.bucket->name] = std::move(bucket); } + +void VectorTileData::setState(const State& state_) { + TileData::setState(state_); + + if (isImmutable()) { + collision.reset(); + } +} diff --git a/src/mbgl/map/vector_tile_data.hpp b/src/mbgl/map/vector_tile_data.hpp index 146bc9322..5fe351ca0 100644 --- a/src/mbgl/map/vector_tile_data.hpp +++ b/src/mbgl/map/vector_tile_data.hpp @@ -16,6 +16,7 @@ namespace mbgl { class Bucket; +class Collision; class Painter; class SourceInfo; class StyleLayer; @@ -45,6 +46,14 @@ public: void setBucket(StyleLayer const &layer_desc, std::unique_ptr bucket); + void setState(const State& state) override; + + inline Collision* getCollision() const { + return collision.get(); + } + + const float depth; + protected: // Holds the actual geometries in this tile. FillVertexBuffer fillVertexBuffer; @@ -69,8 +78,7 @@ private: std::unordered_map> buckets; mutable std::mutex bucketsMutex; -public: - const float depth; + std::unique_ptr collision; }; }