From af63b4980d45e40d0cc5302b0f85475be5c1f90e Mon Sep 17 00:00:00 2001 From: "Thiago Marcos P. Santos" Date: Tue, 12 May 2015 19:42:05 +0300 Subject: [PATCH] Move the Collision object from TileParser to VectorTileData We keep the Collision object alive longer because we need it for the SymbolBuckets yet to be created in case more data resources arrive. When the tile is no longer needed or if it is completely parsed or obsolete (i.e. in a immutable state) we throw the Collision object away. --- src/mbgl/map/tile_parser.cpp | 5 +---- src/mbgl/map/tile_parser.hpp | 2 -- src/mbgl/map/vector_tile_data.cpp | 12 +++++++++++- src/mbgl/map/vector_tile_data.hpp | 12 ++++++++++-- 4 files changed, 22 insertions(+), 9 deletions(-) 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; }; }