diff --git a/src/mbgl/map/raster_tile_data.cpp b/src/mbgl/map/raster_tile_data.cpp index 84e9bb236..524475f30 100644 --- a/src/mbgl/map/raster_tile_data.cpp +++ b/src/mbgl/map/raster_tile_data.cpp @@ -7,7 +7,7 @@ using namespace mbgl; RasterTileData::RasterTileData(Tile::ID const& id_, TexturePool& texturePool, const SourceInfo& source_, FileSource& fileSource_) : TileData(id_, source_, fileSource_), - bucket(texturePool, properties) { + bucket(texturePool, layout) { } RasterTileData::~RasterTileData() { diff --git a/src/mbgl/map/raster_tile_data.hpp b/src/mbgl/map/raster_tile_data.hpp index 7f338056f..a3c9f08cd 100644 --- a/src/mbgl/map/raster_tile_data.hpp +++ b/src/mbgl/map/raster_tile_data.hpp @@ -3,6 +3,7 @@ #include #include +#include #include namespace mbgl { @@ -24,7 +25,7 @@ public: virtual bool hasData(StyleLayer const& layer_desc) const; protected: - StyleBucketRaster properties; + StyleLayoutRaster layout; RasterBucket bucket; }; diff --git a/src/mbgl/map/source.cpp b/src/mbgl/map/source.cpp index cdf9bdd37..13f3f30c9 100644 --- a/src/mbgl/map/source.cpp +++ b/src/mbgl/map/source.cpp @@ -190,7 +190,7 @@ TileData::State Source::addTile(Map& map, uv::worker& worker, new_tile.data = std::make_shared(normalized_id, map.getMaxZoom(), style, glyphAtlas, glyphStore, spriteAtlas, sprite, - texturePool, info, fileSource); + info, fileSource); } else if (info.type == SourceType::Raster) { new_tile.data = std::make_shared(normalized_id, texturePool, info, fileSource); } else { diff --git a/src/mbgl/map/tile_parser.cpp b/src/mbgl/map/tile_parser.cpp index 6118d90a1..087f2a33c 100644 --- a/src/mbgl/map/tile_parser.cpp +++ b/src/mbgl/map/tile_parser.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -33,8 +34,7 @@ TileParser::TileParser(const std::string &data, VectorTileData &tile_, GlyphAtlas & glyphAtlas_, GlyphStore & glyphStore_, SpriteAtlas & spriteAtlas_, - const util::ptr &sprite_, - TexturePool& texturePool_) + const util::ptr &sprite_) : vector_data(pbf((const uint8_t *)data.data(), data.size())), tile(tile_), style(style_), @@ -42,7 +42,6 @@ TileParser::TileParser(const std::string &data, VectorTileData &tile_, glyphStore(glyphStore_), spriteAtlas(spriteAtlas_), sprite(sprite_), - texturePool(texturePool_), collision(util::make_unique(tile.id.z, 4096, tile.source.tile_size, tile.depth)) { assert(&tile != nullptr); assert(style); @@ -56,12 +55,12 @@ void TileParser::parse() { bool TileParser::obsolete() const { return tile.state == TileData::State::obsolete; } -void TileParser::parseStyleLayers(util::ptr group) { +void TileParser::parseStyleLayers(util::ptr group) { if (!group) { return; } - for (const util::ptr &layer_desc : group->layers) { + for (const util::ptr &layer_desc : group->layers) { // Cancel early when parsing. if (obsolete()) { return; @@ -78,7 +77,7 @@ void TileParser::parseStyleLayers(util::ptr group) { auto bucket_it = tile.buckets.find(layer_desc->bucket->name); if (bucket_it == tile.buckets.end()) { // We need to create this bucket since it doesn't exist yet. - std::unique_ptr bucket = createBucket(layer_desc->bucket); + std::unique_ptr bucket = createBucket(*layer_desc->bucket); if (bucket) { // Bucket creation might fail because the data tile may not // contain any data that falls into this bucket. @@ -115,35 +114,33 @@ private: }; template -void TileParser::applyLayoutProperty(PropertyKey key, ClassProperties &classProperties, T &target, const float z) { +void applyLayoutProperty(PropertyKey key, const ClassProperties &classProperties, T &target, const float z) { auto it = classProperties.properties.find(key); if (it != classProperties.properties.end()) { const PropertyEvaluator evaluator(z); target = mapbox::util::apply_visitor(evaluator, it->second); - } } -template <> -void TileParser::applyLayoutProperties(StyleBucket &bucket_desc, const float) { - bucket_desc.render.set(); +std::unique_ptr parseStyleLayoutFill(const StyleBucket &/*bucket*/, const float /*z*/) { // no-op; Fill buckets don't currently have any applicable layout properties + auto fillPtr = util::make_unique(); + return fillPtr; } -template<> -void TileParser::applyLayoutProperties(StyleBucket &bucket_desc, const float z) { - bucket_desc.render.set(); - StyleBucketLine &line = bucket_desc.render.get(); +std::unique_ptr parseStyleLayoutLine(const StyleBucket &bucket_desc, const float z) { + auto linePtr = util::make_unique(); + auto &line = *linePtr; applyLayoutProperty(PropertyKey::LineCap, bucket_desc.layout, line.cap, z); applyLayoutProperty(PropertyKey::LineJoin, bucket_desc.layout, line.join, z); applyLayoutProperty(PropertyKey::LineMiterLimit, bucket_desc.layout, line.miter_limit, z); applyLayoutProperty(PropertyKey::LineRoundLimit, bucket_desc.layout, line.round_limit, z); + return linePtr; } -template<> -void TileParser::applyLayoutProperties(StyleBucket &bucket_desc, const float z) { - bucket_desc.render.set(); - StyleBucketSymbol &symbol = bucket_desc.render.get(); +std::unique_ptr parseStyleLayoutSymbol(const StyleBucket &bucket_desc, const float z) { + auto symbolPtr = util::make_unique(); + auto &symbol = *symbolPtr; applyLayoutProperty(PropertyKey::SymbolPlacement, bucket_desc.layout, symbol.placement, z); if (symbol.placement == PlacementType::Line) { symbol.icon.rotation_alignment = RotationAlignmentType::Map; @@ -181,41 +178,34 @@ void TileParser::applyLayoutProperties(StyleBucket &bucket_des applyLayoutProperty(PropertyKey::TextTransform, bucket_desc.layout, symbol.text.transform, z); applyLayoutProperty(PropertyKey::TextOffset, bucket_desc.layout, symbol.text.offset, z); applyLayoutProperty(PropertyKey::TextAllowOverlap, bucket_desc.layout, symbol.text.allow_overlap, z); + return symbolPtr; } -std::unique_ptr TileParser::createBucket(util::ptr bucket_desc) { - if (!bucket_desc) { - fprintf(stderr, "missing bucket desc\n"); - return nullptr; - } - +std::unique_ptr TileParser::createBucket(const StyleBucket &bucket_desc) { // Skip this bucket if we are to not render this - if (tile.id.z < std::floor(bucket_desc->min_zoom) && std::floor(bucket_desc->min_zoom) < tile.source.max_zoom) return nullptr; - if (tile.id.z >= std::ceil(bucket_desc->max_zoom)) return nullptr; - if (bucket_desc->visibility == mbgl::VisibilityType::None) return nullptr; + if (tile.id.z < std::floor(bucket_desc.min_zoom) && std::floor(bucket_desc.min_zoom) < tile.source.max_zoom) return nullptr; + if (tile.id.z >= std::ceil(bucket_desc.max_zoom)) return nullptr; + if (bucket_desc.visibility == mbgl::VisibilityType::None) return nullptr; - auto layer_it = vector_data.layers.find(bucket_desc->source_layer); + auto layer_it = vector_data.layers.find(bucket_desc.source_layer); if (layer_it != vector_data.layers.end()) { const VectorTileLayer &layer = layer_it->second; - if (bucket_desc->type == StyleLayerType::Fill) { - applyLayoutProperties(*bucket_desc, tile.id.z); - return createFillBucket(layer, bucket_desc->filter, bucket_desc->render.get()); - } else if (bucket_desc->type == StyleLayerType::Line) { - applyLayoutProperties(*bucket_desc, tile.id.z); - return createLineBucket(layer, bucket_desc->filter, bucket_desc->render.get()); - } else if (bucket_desc->type == StyleLayerType::Symbol) { - applyLayoutProperties(*bucket_desc, tile.id.z); - return createSymbolBucket(layer, bucket_desc->filter, bucket_desc->render.get()); - } else if (bucket_desc->type == StyleLayerType::Raster) { + if (bucket_desc.type == StyleLayerType::Fill) { + return createFillBucket(layer, bucket_desc); + } else if (bucket_desc.type == StyleLayerType::Line) { + return createLineBucket(layer, bucket_desc); + } else if (bucket_desc.type == StyleLayerType::Symbol) { + return createSymbolBucket(layer, bucket_desc); + } else if (bucket_desc.type == StyleLayerType::Raster) { return nullptr; } else { - fprintf(stderr, "[WARNING] unknown bucket render type for layer '%s' (source layer '%s')\n", bucket_desc->name.c_str(), bucket_desc->source_layer.c_str()); + fprintf(stderr, "[WARNING] unknown bucket render type for layer '%s' (source layer '%s')\n", bucket_desc.name.c_str(), bucket_desc.source_layer.c_str()); } } else { // The layer specified in the bucket does not exist. Do nothing. if (debug::tileParseWarnings) { fprintf(stderr, "[WARNING] layer '%s' does not exist in tile %d/%d/%d\n", - bucket_desc->source_layer.c_str(), tile.id.z, tile.id.x, tile.id.y); + bucket_desc.source_layer.c_str(), tile.id.z, tile.id.x, tile.id.y); } } @@ -240,27 +230,34 @@ void TileParser::addBucketGeometries(Bucket& bucket, const VectorTileLayer& laye } } -std::unique_ptr TileParser::createFillBucket(const VectorTileLayer& layer, const FilterExpression &filter, const StyleBucketFill &fill) { - std::unique_ptr bucket = util::make_unique(tile.fillVertexBuffer, tile.triangleElementsBuffer, tile.lineElementsBuffer, fill); - addBucketGeometries(bucket, layer, filter); +std::unique_ptr TileParser::createFillBucket(const VectorTileLayer &layer, + const StyleBucket &bucket_desc) { + auto fill = parseStyleLayoutFill(bucket_desc, tile.id.z); + auto bucket = util::make_unique(std::move(fill), + tile.fillVertexBuffer, + tile.triangleElementsBuffer, + tile.lineElementsBuffer); + addBucketGeometries(bucket, layer, bucket_desc.filter); return obsolete() ? nullptr : std::move(bucket); } -std::unique_ptr TileParser::createRasterBucket(const StyleBucketRaster &raster) { - std::unique_ptr bucket = util::make_unique(texturePool, raster); +std::unique_ptr TileParser::createLineBucket(const VectorTileLayer &layer, + const StyleBucket &bucket_desc) { + auto line = parseStyleLayoutLine(bucket_desc, tile.id.z); + auto bucket = util::make_unique(std::move(line), + tile.lineVertexBuffer, + tile.triangleElementsBuffer, + tile.pointElementsBuffer); + addBucketGeometries(bucket, layer, bucket_desc.filter); return obsolete() ? nullptr : std::move(bucket); } -std::unique_ptr TileParser::createLineBucket(const VectorTileLayer& layer, const FilterExpression &filter, const StyleBucketLine &line) { - std::unique_ptr bucket = util::make_unique(tile.lineVertexBuffer, tile.triangleElementsBuffer, tile.pointElementsBuffer, line); - addBucketGeometries(bucket, layer, filter); +std::unique_ptr TileParser::createSymbolBucket(const VectorTileLayer &layer, + const StyleBucket &bucket_desc) { + auto symbol = parseStyleLayoutSymbol(bucket_desc, tile.id.z); + auto bucket = util::make_unique(std::move(symbol), *collision); + bucket->addFeatures( + layer, bucket_desc.filter, tile.id, spriteAtlas, *sprite, glyphAtlas, glyphStore); return obsolete() ? nullptr : std::move(bucket); } - -std::unique_ptr TileParser::createSymbolBucket(const VectorTileLayer& layer, const FilterExpression &filter, const StyleBucketSymbol &symbol) { - std::unique_ptr bucket = util::make_unique(symbol, *collision); - bucket->addFeatures(layer, filter, tile.id, spriteAtlas, *sprite, glyphAtlas, glyphStore); - return obsolete() ? nullptr : std::move(bucket); -} - } diff --git a/src/mbgl/map/tile_parser.hpp b/src/mbgl/map/tile_parser.hpp index d10f9aa26..0cf5b20d8 100644 --- a/src/mbgl/map/tile_parser.hpp +++ b/src/mbgl/map/tile_parser.hpp @@ -23,10 +23,10 @@ class SpriteAtlas; class Sprite; class Style; class StyleBucket; -class StyleBucketFill; -class StyleBucketRaster; -class StyleBucketLine; -class StyleBucketSymbol; +class StyleLayoutFill; +class StyleLayoutRaster; +class StyleLayoutLine; +class StyleLayoutSymbol; class StyleLayerGroup; class VectorTileData; class Collision; @@ -40,8 +40,7 @@ public: GlyphAtlas & glyphAtlas, GlyphStore & glyphStore, SpriteAtlas & spriteAtlas, - const util::ptr &sprite, - TexturePool& texturePool); + const util::ptr &sprite); ~TileParser(); public: @@ -49,17 +48,12 @@ public: private: bool obsolete() const; - void parseStyleLayers(util::ptr group); + void parseStyleLayers(util::ptr group); - template void applyLayoutProperties(StyleBucket &bucket, float z); - template void applyLayoutProperty(PropertyKey key, ClassProperties &classProperties, T &, float z); - - std::unique_ptr createBucket(util::ptr bucket_desc); - - std::unique_ptr createFillBucket(const VectorTileLayer& layer, const FilterExpression &filter, const StyleBucketFill &fill); - std::unique_ptr createRasterBucket(const StyleBucketRaster &raster); - std::unique_ptr createLineBucket(const VectorTileLayer& layer, const FilterExpression &filter, const StyleBucketLine &line); - std::unique_ptr createSymbolBucket(const VectorTileLayer& layer, const FilterExpression &filter, const StyleBucketSymbol &symbol); + std::unique_ptr createBucket(const StyleBucket &bucket_desc); + std::unique_ptr createFillBucket(const VectorTileLayer &layer, const StyleBucket &bucket_desc); + std::unique_ptr createLineBucket(const VectorTileLayer& layer, const StyleBucket &bucket_desc); + std::unique_ptr createSymbolBucket(const VectorTileLayer& layer, const StyleBucket &bucket_desc); template void addBucketGeometries(Bucket& bucket, const VectorTileLayer& layer, const FilterExpression &filter); @@ -73,7 +67,6 @@ private: GlyphStore & glyphStore; SpriteAtlas & spriteAtlas; util::ptr sprite; - TexturePool& texturePool; std::unique_ptr collision; }; diff --git a/src/mbgl/map/vector_tile_data.cpp b/src/mbgl/map/vector_tile_data.cpp index 646ad7318..5f6b24907 100644 --- a/src/mbgl/map/vector_tile_data.cpp +++ b/src/mbgl/map/vector_tile_data.cpp @@ -13,14 +13,12 @@ VectorTileData::VectorTileData(Tile::ID const& id_, float mapMaxZoom, util::ptr