From 89c0ff5f3955ecd4316a7b4280e995b7b431817d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20K=C3=A4fer?= Date: Tue, 17 Feb 2015 17:49:02 -0800 Subject: [PATCH 1/2] make StyleBucket mutable refs #881 --- src/mbgl/map/tile_parser.cpp | 94 ++++++++++++++-------------- src/mbgl/map/tile_parser.hpp | 14 ++--- src/mbgl/renderer/fill_bucket.cpp | 27 ++++---- src/mbgl/renderer/fill_bucket.hpp | 10 +-- src/mbgl/renderer/line_bucket.cpp | 16 ++--- src/mbgl/renderer/line_bucket.hpp | 10 +-- src/mbgl/renderer/painter_line.cpp | 7 ++- src/mbgl/renderer/painter_symbol.cpp | 19 +++--- src/mbgl/renderer/symbol_bucket.cpp | 10 ++- src/mbgl/renderer/symbol_bucket.hpp | 4 +- src/mbgl/style/style_bucket.cpp | 7 --- src/mbgl/style/style_bucket.hpp | 5 -- src/mbgl/style/style_layer.hpp | 2 +- src/mbgl/style/style_parser.cpp | 18 +++--- 14 files changed, 120 insertions(+), 123 deletions(-) diff --git a/src/mbgl/map/tile_parser.cpp b/src/mbgl/map/tile_parser.cpp index 6118d90a1..aeed805d9 100644 --- a/src/mbgl/map/tile_parser.cpp +++ b/src/mbgl/map/tile_parser.cpp @@ -56,12 +56,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 +78,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 +115,26 @@ 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(); +void parseLayoutProperties(StyleBucketFill &/*fill*/, const StyleBucket &/*bucket*/, const float /*z*/) { // no-op; Fill buckets don't currently have any applicable layout properties } -template<> -void TileParser::applyLayoutProperties(StyleBucket &bucket_desc, const float z) { - bucket_desc.render.set(); - StyleBucketLine &line = bucket_desc.render.get(); +void parseLayoutProperties(StyleBucketLine &line, const StyleBucket &bucket_desc, const float z) { 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); } -template<> -void TileParser::applyLayoutProperties(StyleBucket &bucket_desc, const float z) { - bucket_desc.render.set(); - StyleBucketSymbol &symbol = bucket_desc.render.get(); +void parseLayoutProperties(StyleBucketSymbol &symbol, const StyleBucket &bucket_desc, const float z) { applyLayoutProperty(PropertyKey::SymbolPlacement, bucket_desc.layout, symbol.placement, z); if (symbol.placement == PlacementType::Line) { symbol.icon.rotation_alignment = RotationAlignmentType::Map; @@ -183,39 +174,31 @@ void TileParser::applyLayoutProperties(StyleBucket &bucket_des applyLayoutProperty(PropertyKey::TextAllowOverlap, bucket_desc.layout, symbol.text.allow_overlap, z); } -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,9 +223,15 @@ 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 = util::make_unique(); + parseLayoutProperties(*fill, 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); } @@ -251,16 +240,25 @@ std::unique_ptr TileParser::createRasterBucket(const StyleBucketRaster & 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::createLineBucket(const VectorTileLayer &layer, + const StyleBucket &bucket_desc) { + auto line = util::make_unique(); + parseLayoutProperties(*line, 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::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); +std::unique_ptr TileParser::createSymbolBucket(const VectorTileLayer &layer, + const StyleBucket &bucket_desc) { + auto symbol = util::make_unique(); + parseLayoutProperties(*symbol, 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); } - } diff --git a/src/mbgl/map/tile_parser.hpp b/src/mbgl/map/tile_parser.hpp index d10f9aa26..4d4f8efe7 100644 --- a/src/mbgl/map/tile_parser.hpp +++ b/src/mbgl/map/tile_parser.hpp @@ -49,17 +49,13 @@ 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 createBucket(const StyleBucket &bucket_desc); + std::unique_ptr createFillBucket(const VectorTileLayer &layer, const StyleBucket &bucket_desc); 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 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); diff --git a/src/mbgl/renderer/fill_bucket.cpp b/src/mbgl/renderer/fill_bucket.cpp index b58e860b4..6544e43f0 100644 --- a/src/mbgl/renderer/fill_bucket.cpp +++ b/src/mbgl/renderer/fill_bucket.cpp @@ -31,18 +31,22 @@ void FillBucket::free(void *, void *ptr) { ::free(ptr); } -FillBucket::FillBucket(FillVertexBuffer &vertexBuffer_, +FillBucket::FillBucket(std::unique_ptr layout_, + FillVertexBuffer &vertexBuffer_, TriangleElementsBuffer &triangleElementsBuffer_, - LineElementsBuffer &lineElementsBuffer_, - const StyleBucketFill &properties_) - : properties(properties_), - allocator(new TESSalloc{&alloc, &realloc, &free, nullptr, // userData - 64, // meshEdgeBucketSize - 64, // meshVertexBucketSize - 32, // meshFaceBucketSize - 64, // dictNodeBucketSize - 8, // regionBucketSize - 128, // extraVertices allocated for the priority queue. + LineElementsBuffer &lineElementsBuffer_) + : layout(std::move(layout_)), + allocator(new TESSalloc{ + &alloc, + &realloc, + &free, + nullptr, // userData + 64, // meshEdgeBucketSize + 64, // meshVertexBucketSize + 32, // meshFaceBucketSize + 64, // dictNodeBucketSize + 8, // regionBucketSize + 128, // extraVertices allocated for the priority queue. }), tesselator(tessNewTess(allocator)), vertexBuffer(vertexBuffer_), @@ -52,6 +56,7 @@ FillBucket::FillBucket(FillVertexBuffer &vertexBuffer_, triangle_elements_start(triangleElementsBuffer_.index()), line_elements_start(lineElementsBuffer.index()) { assert(tesselator); + assert(layout); } FillBucket::~FillBucket() { diff --git a/src/mbgl/renderer/fill_bucket.hpp b/src/mbgl/renderer/fill_bucket.hpp index e9762b762..06ac5cc29 100644 --- a/src/mbgl/renderer/fill_bucket.hpp +++ b/src/mbgl/renderer/fill_bucket.hpp @@ -38,10 +38,10 @@ class FillBucket : public Bucket { typedef ElementGroup<1> line_group_type; public: - FillBucket(FillVertexBuffer& vertexBuffer, - TriangleElementsBuffer& triangleElementsBuffer, - LineElementsBuffer& lineElementsBuffer, - const StyleBucketFill& properties); + FillBucket(std::unique_ptr layout, + FillVertexBuffer &vertexBuffer, + TriangleElementsBuffer &triangleElementsBuffer, + LineElementsBuffer &lineElementsBuffer); ~FillBucket(); virtual void render(Painter& painter, util::ptr layer_desc, const Tile::ID& id, const mat4 &matrix); @@ -55,7 +55,7 @@ public: void drawVertices(OutlineShader& shader); public: - const StyleBucketFill &properties; + const std::unique_ptr layout; private: TESSalloc *allocator; diff --git a/src/mbgl/renderer/line_bucket.cpp b/src/mbgl/renderer/line_bucket.cpp index 8141e68e2..106ea3e11 100644 --- a/src/mbgl/renderer/line_bucket.cpp +++ b/src/mbgl/renderer/line_bucket.cpp @@ -18,18 +18,18 @@ struct geometry_too_long_exception : std::exception {}; using namespace mbgl; -LineBucket::LineBucket(LineVertexBuffer& vertexBuffer_, - TriangleElementsBuffer& triangleElementsBuffer_, - PointElementsBuffer& pointElementsBuffer_, - const StyleBucketLine& properties_) - : properties(properties_), +LineBucket::LineBucket(std::unique_ptr layout_, + LineVertexBuffer &vertexBuffer_, + TriangleElementsBuffer &triangleElementsBuffer_, + PointElementsBuffer &pointElementsBuffer_) + : layout(std::move(layout_)), vertexBuffer(vertexBuffer_), triangleElementsBuffer(triangleElementsBuffer_), pointElementsBuffer(pointElementsBuffer_), vertex_start(vertexBuffer_.index()), triangle_elements_start(triangleElementsBuffer_.index()), - point_elements_start(pointElementsBuffer_.index()) -{ + point_elements_start(pointElementsBuffer_.index()) { + assert(layout); } void LineBucket::addGeometry(pbf& geom) { @@ -61,6 +61,8 @@ struct TriangleElement { typedef uint16_t PointElement; void LineBucket::addGeometry(const std::vector& vertices) { + assert(layout); + auto &properties = *layout; // TODO: use roundLimit // const float roundLimit = geometry.round_limit; diff --git a/src/mbgl/renderer/line_bucket.hpp b/src/mbgl/renderer/line_bucket.hpp index 3bc8bf399..271d95022 100644 --- a/src/mbgl/renderer/line_bucket.hpp +++ b/src/mbgl/renderer/line_bucket.hpp @@ -25,10 +25,10 @@ class LineBucket : public Bucket { typedef ElementGroup<1> point_group_type; public: - LineBucket(LineVertexBuffer& vertexBuffer, - TriangleElementsBuffer& triangleElementsBuffer, - PointElementsBuffer& pointElementsBuffer, - const StyleBucketLine& properties); + LineBucket(std::unique_ptr layout, + LineVertexBuffer &vertexBuffer, + TriangleElementsBuffer &triangleElementsBuffer, + PointElementsBuffer &pointElementsBuffer); virtual void render(Painter& painter, util::ptr layer_desc, const Tile::ID& id, const mat4 &matrix); virtual bool hasData() const; @@ -44,7 +44,7 @@ public: void drawPoints(LinejoinShader& shader); public: - const StyleBucketLine &properties; + const std::unique_ptr layout; private: LineVertexBuffer& vertexBuffer; diff --git a/src/mbgl/renderer/painter_line.cpp b/src/mbgl/renderer/painter_line.cpp index a66da1fcd..2bdfb26a4 100644 --- a/src/mbgl/renderer/painter_line.cpp +++ b/src/mbgl/renderer/painter_line.cpp @@ -14,7 +14,8 @@ void Painter::renderLine(LineBucket& bucket, util::ptr layer_desc, c if (pass == RenderPass::Opaque) return; if (!bucket.hasData()) return; - const LineProperties &properties = layer_desc->getProperties(); + const auto &properties = layer_desc->getProperties(); + const auto &layout = *bucket.layout; // the distance over which the line edge fades out. // Retina devices need a smaller distance to avoid aliasing. @@ -81,8 +82,8 @@ void Painter::renderLine(LineBucket& bucket, util::ptr layer_desc, c linesdfShader->u_blur = blur; linesdfShader->u_color = color; - LinePatternPos posA = lineAtlas.getDashPosition(properties.dash_array.from, bucket.properties.cap == CapType::Round); - LinePatternPos posB = lineAtlas.getDashPosition(properties.dash_array.to, bucket.properties.cap == CapType::Round); + LinePatternPos posA = lineAtlas.getDashPosition(properties.dash_array.from, layout.cap == CapType::Round); + LinePatternPos posB = lineAtlas.getDashPosition(properties.dash_array.to, layout.cap == CapType::Round); lineAtlas.bind(); float patternratio = std::pow(2.0, std::floor(std::log2(state.getScale())) - id.z) / 8.0; diff --git a/src/mbgl/renderer/painter_symbol.cpp b/src/mbgl/renderer/painter_symbol.cpp index 579a6d2e0..fb0dd9fbf 100644 --- a/src/mbgl/renderer/painter_symbol.cpp +++ b/src/mbgl/renderer/painter_symbol.cpp @@ -117,7 +117,8 @@ void Painter::renderSymbol(SymbolBucket &bucket, util::ptr layer_des return; } - const SymbolProperties &properties = layer_desc->getProperties(); + const auto &properties = layer_desc->getProperties(); + const auto &layout = *bucket.layout; MBGL_CHECK_ERROR(glDisable(GL_STENCIL_TEST)); @@ -125,21 +126,21 @@ void Painter::renderSymbol(SymbolBucket &bucket, util::ptr layer_des bool sdf = bucket.sdfIcons; const float angleOffset = - bucket.properties.icon.rotation_alignment == RotationAlignmentType::Map + layout.icon.rotation_alignment == RotationAlignmentType::Map ? state.getAngle() : 0; // If layerStyle.size > bucket.info.fontSize then labels may collide - const float fontSize = properties.icon.size != 0 ? properties.icon.size : bucket.properties.icon.max_size; + const float fontSize = properties.icon.size != 0 ? properties.icon.size : layout.icon.max_size; const float fontScale = fontSize / 1.0f; - spriteAtlas.bind(state.isChanging() || bucket.properties.placement == PlacementType::Line || angleOffset != 0 || fontScale != 1 || sdf); + spriteAtlas.bind(state.isChanging() || layout.placement == PlacementType::Line || angleOffset != 0 || fontScale != 1 || sdf); if (sdf) { renderSDF(bucket, id, matrix, - bucket.properties.icon, + layout.icon, properties.icon, 1.0f, {{ float(spriteAtlas.getWidth()) / 4.0f, float(spriteAtlas.getHeight()) / 4.0f }}, @@ -166,12 +167,12 @@ void Painter::renderSymbol(SymbolBucket &bucket, util::ptr layer_des const float angle = std::round(state.getAngle() / M_PI * 128); // adjust min/max zooms for variable font sies - float zoomAdjust = std::log(fontSize / bucket.properties.icon.max_size) / std::log(2); + float zoomAdjust = std::log(fontSize / layout.icon.max_size) / std::log(2); iconShader->u_angle = (int32_t)(angle + 256) % 256; - bool flip = (bucket.properties.icon.rotation_alignment == RotationAlignmentType::Map) - && bucket.properties.icon.keep_upright; + bool flip = (layout.icon.rotation_alignment == RotationAlignmentType::Map) + && layout.icon.keep_upright; iconShader->u_flip = flip ? 1 : 0; iconShader->u_zoom = (state.getNormalizedZoom() - zoomAdjust) * 10; // current zoom level @@ -192,7 +193,7 @@ void Painter::renderSymbol(SymbolBucket &bucket, util::ptr layer_des renderSDF(bucket, id, matrix, - bucket.properties.text, + layout.text, properties.text, 24.0f, {{ float(glyphAtlas.width) / 4, float(glyphAtlas.height) / 4 }}, diff --git a/src/mbgl/renderer/symbol_bucket.cpp b/src/mbgl/renderer/symbol_bucket.cpp index 44cc3816a..27a7c8e35 100644 --- a/src/mbgl/renderer/symbol_bucket.cpp +++ b/src/mbgl/renderer/symbol_bucket.cpp @@ -20,8 +20,10 @@ namespace mbgl { -SymbolBucket::SymbolBucket(const StyleBucketSymbol &properties_, Collision &collision_) - : properties(properties_), collision(collision_) {} +SymbolBucket::SymbolBucket(std::unique_ptr layout_, Collision &collision_) + : layout(std::move(layout_)), collision(collision_) { + assert(layout); +} void SymbolBucket::render(Painter &painter, util::ptr layer_desc, const Tile::ID &id, const mat4 &matrix) { @@ -44,6 +46,7 @@ std::vector SymbolBucket::processFeatures(const VectorTileLayer & const FilterExpression &filter, GlyphStore &glyphStore, const Sprite &sprite) { + auto &properties = *layout; const bool has_text = properties.text.field.size(); const bool has_icon = properties.icon.image.size(); @@ -120,7 +123,7 @@ std::vector SymbolBucket::processFeatures(const VectorTileLayer & void SymbolBucket::addFeatures(const VectorTileLayer &layer, const FilterExpression &filter, const Tile::ID &id, SpriteAtlas &spriteAtlas, Sprite &sprite, GlyphAtlas & glyphAtlas, GlyphStore &glyphStore) { - + auto &properties = *layout; const std::vector features = processFeatures(layer, filter, glyphStore, sprite); float horizontalAlign = 0.5; @@ -220,6 +223,7 @@ const PlacementRange fullRange{{2 * M_PI, 0}}; void SymbolBucket::addFeature(const std::vector &line, const Shaping &shaping, const GlyphPositions &face, const Rect &image) { assert(line.size()); + auto &properties = *layout; const float minScale = 0.5f; const float glyphSize = 24.0f; diff --git a/src/mbgl/renderer/symbol_bucket.hpp b/src/mbgl/renderer/symbol_bucket.hpp index 537c6d209..5b3ea092a 100644 --- a/src/mbgl/renderer/symbol_bucket.hpp +++ b/src/mbgl/renderer/symbol_bucket.hpp @@ -54,7 +54,7 @@ class SymbolBucket : public Bucket { typedef ElementGroup<2> IconElementGroup; public: - SymbolBucket(const StyleBucketSymbol &properties, Collision &collision); + SymbolBucket(std::unique_ptr layout, Collision &collision); virtual void render(Painter &painter, util::ptr layer_desc, const Tile::ID &id, const mat4 &matrix); virtual bool hasData() const; @@ -89,7 +89,7 @@ private: const FontStack &fontStack, GlyphAtlas &glyphAtlas, GlyphPositions &face); public: - const StyleBucketSymbol &properties; + const std::unique_ptr layout; bool sdfIcons = false; private: diff --git a/src/mbgl/style/style_bucket.cpp b/src/mbgl/style/style_bucket.cpp index 6e866f303..54c75fc57 100644 --- a/src/mbgl/style/style_bucket.cpp +++ b/src/mbgl/style/style_bucket.cpp @@ -9,13 +9,6 @@ template<> const StyleBucketRaster &defaultLayoutProperties() { static StyleBuck template<> const StyleBucketBackground &defaultLayoutProperties() { static StyleBucketBackground p; return p; } StyleBucket::StyleBucket(StyleLayerType type_) : type(type_) { - switch (type) { - case StyleLayerType::Fill: render.set(); break; - case StyleLayerType::Line: render.set(); break; - case StyleLayerType::Symbol: render.set(); break; - case StyleLayerType::Raster: render.set(); break; - default: break; - } } } \ No newline at end of file diff --git a/src/mbgl/style/style_bucket.hpp b/src/mbgl/style/style_bucket.hpp index eac899cb9..ec852c19f 100644 --- a/src/mbgl/style/style_bucket.hpp +++ b/src/mbgl/style/style_bucket.hpp @@ -104,10 +104,6 @@ class StyleBucketBackground { public: }; -typedef mapbox::util::variant StyleBucketRender; - - class StyleBucket : public util::noncopyable { public: typedef util::ptr Ptr; @@ -119,7 +115,6 @@ public: std::string source_layer; FilterExpression filter; ClassProperties layout; - StyleBucketRender render = std::false_type(); float min_zoom = -std::numeric_limits::infinity(); float max_zoom = std::numeric_limits::infinity(); VisibilityType visibility = VisibilityType::Visible; diff --git a/src/mbgl/style/style_layer.hpp b/src/mbgl/style/style_layer.hpp index 69af1dc23..1dadfed94 100644 --- a/src/mbgl/style/style_layer.hpp +++ b/src/mbgl/style/style_layer.hpp @@ -67,7 +67,7 @@ public: // Bucket information, telling the renderer how to generate the geometries // for this layer (feature property filters, tessellation instructions, ...). - util::ptr bucket; + util::ptr bucket; // Contains all style classes that can be applied to this layer. const std::map styles; diff --git a/src/mbgl/style/style_parser.cpp b/src/mbgl/style/style_parser.cpp index af6a84492..8840db023 100644 --- a/src/mbgl/style/style_parser.cpp +++ b/src/mbgl/style/style_parser.cpp @@ -894,10 +894,10 @@ void StyleParser::parseReference(JSVal value, util::ptr &layer) { #pragma mark - Parse Bucket void StyleParser::parseBucket(JSVal value, util::ptr &layer) { - layer->bucket = std::make_shared(layer->type); + util::ptr bucket = std::make_shared(layer->type); // We name the buckets according to the layer that defined it. - layer->bucket->name = layer->id; + bucket->name = layer->id; if (value.HasMember("source")) { JSVal value_source = replaceConstant(value["source"]); @@ -905,7 +905,7 @@ void StyleParser::parseBucket(JSVal value, util::ptr &layer) { const std::string source_name = { value_source.GetString(), value_source.GetStringLength() }; auto source_it = sources.find(source_name); if (source_it != sources.end()) { - layer->bucket->style_source = source_it->second; + bucket->style_source = source_it->second; } else { Log::Warning(Event::ParseStyle, "can't find source '%s' required for layer '%s'", source_name.c_str(), layer->id.c_str()); } @@ -917,7 +917,7 @@ void StyleParser::parseBucket(JSVal value, util::ptr &layer) { if (value.HasMember("source-layer")) { JSVal value_source_layer = replaceConstant(value["source-layer"]); if (value_source_layer.IsString()) { - layer->bucket->source_layer = { value_source_layer.GetString(), value_source_layer.GetStringLength() }; + bucket->source_layer = { value_source_layer.GetString(), value_source_layer.GetStringLength() }; } else { Log::Warning(Event::ParseStyle, "source-layer of layer '%s' must be a string", layer->id.c_str()); } @@ -925,18 +925,18 @@ void StyleParser::parseBucket(JSVal value, util::ptr &layer) { if (value.HasMember("filter")) { JSVal value_filter = replaceConstant(value["filter"]); - layer->bucket->filter = parseFilterExpression(value_filter); + bucket->filter = parseFilterExpression(value_filter); } if (value.HasMember("layout")) { JSVal value_render = replaceConstant(value["layout"]); - parseLayout(value_render, layer->bucket); + parseLayout(value_render, bucket); } if (value.HasMember("minzoom")) { JSVal min_zoom = value["minzoom"]; if (min_zoom.IsNumber()) { - layer->bucket->min_zoom = min_zoom.GetDouble(); + bucket->min_zoom = min_zoom.GetDouble(); } else { Log::Warning(Event::ParseStyle, "minzoom of layer %s must be numeric", layer->id.c_str()); } @@ -945,11 +945,13 @@ void StyleParser::parseBucket(JSVal value, util::ptr &layer) { if (value.HasMember("maxzoom")) { JSVal max_zoom = value["maxzoom"]; if (max_zoom.IsNumber()) { - layer->bucket->min_zoom = max_zoom.GetDouble(); + bucket->min_zoom = max_zoom.GetDouble(); } else { Log::Warning(Event::ParseStyle, "maxzoom of layer %s must be numeric", layer->id.c_str()); } } + + layer->bucket = bucket; } void StyleParser::parseSprite(JSVal value) { From c07fa069944b42890aa419cfe542ed98add57037 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20K=C3=A4fer?= Date: Tue, 17 Feb 2015 18:09:34 -0800 Subject: [PATCH 2/2] rename StyleBucket* => StyleLayout* and remove a few unused variables refs #881 --- src/mbgl/map/raster_tile_data.cpp | 2 +- src/mbgl/map/raster_tile_data.hpp | 3 +- src/mbgl/map/source.cpp | 2 +- src/mbgl/map/tile_parser.cpp | 33 ++++---- src/mbgl/map/tile_parser.hpp | 13 ++-- src/mbgl/map/vector_tile_data.cpp | 5 +- src/mbgl/map/vector_tile_data.hpp | 3 - src/mbgl/renderer/fill_bucket.cpp | 7 +- src/mbgl/renderer/fill_bucket.hpp | 5 +- src/mbgl/renderer/line_bucket.cpp | 27 ++++--- src/mbgl/renderer/line_bucket.hpp | 7 +- src/mbgl/renderer/painter_fill.cpp | 1 + src/mbgl/renderer/painter_line.cpp | 3 +- src/mbgl/renderer/painter_symbol.cpp | 3 +- src/mbgl/renderer/raster_bucket.cpp | 4 +- src/mbgl/renderer/raster_bucket.hpp | 5 +- src/mbgl/renderer/symbol_bucket.cpp | 87 +++++++++++---------- src/mbgl/renderer/symbol_bucket.hpp | 6 +- src/mbgl/style/property_fallback.cpp | 71 +++++++++--------- src/mbgl/style/style_bucket.cpp | 14 ---- src/mbgl/style/style_bucket.hpp | 102 +------------------------ src/mbgl/style/style_layout.cpp | 11 +++ src/mbgl/style/style_layout.hpp | 108 +++++++++++++++++++++++++++ src/mbgl/style/style_parser.cpp | 1 + src/mbgl/text/placement.cpp | 25 ++++--- src/mbgl/text/placement.hpp | 6 +- 26 files changed, 290 insertions(+), 264 deletions(-) delete mode 100644 src/mbgl/style/style_bucket.cpp create mode 100644 src/mbgl/style/style_layout.cpp create mode 100644 src/mbgl/style/style_layout.hpp 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 aeed805d9..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); @@ -123,18 +122,25 @@ void applyLayoutProperty(PropertyKey key, const ClassProperties &classProperties } } -void parseLayoutProperties(StyleBucketFill &/*fill*/, const StyleBucket &/*bucket*/, const float /*z*/) { +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; } -void parseLayoutProperties(StyleBucketLine &line, const StyleBucket &bucket_desc, const float z) { +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; } -void parseLayoutProperties(StyleBucketSymbol &symbol, const StyleBucket &bucket_desc, const float z) { +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; @@ -172,6 +178,7 @@ void parseLayoutProperties(StyleBucketSymbol &symbol, const StyleBucket &bucket_ 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(const StyleBucket &bucket_desc) { @@ -225,8 +232,7 @@ void TileParser::addBucketGeometries(Bucket& bucket, const VectorTileLayer& laye std::unique_ptr TileParser::createFillBucket(const VectorTileLayer &layer, const StyleBucket &bucket_desc) { - auto fill = util::make_unique(); - parseLayoutProperties(*fill, bucket_desc, tile.id.z); + auto fill = parseStyleLayoutFill(bucket_desc, tile.id.z); auto bucket = util::make_unique(std::move(fill), tile.fillVertexBuffer, tile.triangleElementsBuffer, @@ -235,15 +241,9 @@ std::unique_ptr TileParser::createFillBucket(const VectorTileLayer &laye return obsolete() ? nullptr : std::move(bucket); } -std::unique_ptr TileParser::createRasterBucket(const StyleBucketRaster &raster) { - std::unique_ptr bucket = util::make_unique(texturePool, raster); - return obsolete() ? nullptr : std::move(bucket); -} - std::unique_ptr TileParser::createLineBucket(const VectorTileLayer &layer, const StyleBucket &bucket_desc) { - auto line = util::make_unique(); - parseLayoutProperties(*line, bucket_desc, tile.id.z); + auto line = parseStyleLayoutLine(bucket_desc, tile.id.z); auto bucket = util::make_unique(std::move(line), tile.lineVertexBuffer, tile.triangleElementsBuffer, @@ -254,8 +254,7 @@ std::unique_ptr TileParser::createLineBucket(const VectorTileLayer &laye std::unique_ptr TileParser::createSymbolBucket(const VectorTileLayer &layer, const StyleBucket &bucket_desc) { - auto symbol = util::make_unique(); - parseLayoutProperties(*symbol, bucket_desc, tile.id.z); + 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); diff --git a/src/mbgl/map/tile_parser.hpp b/src/mbgl/map/tile_parser.hpp index 4d4f8efe7..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: @@ -53,7 +52,6 @@ private: std::unique_ptr createBucket(const StyleBucket &bucket_desc); std::unique_ptr createFillBucket(const VectorTileLayer &layer, const StyleBucket &bucket_desc); - std::unique_ptr createRasterBucket(const StyleBucketRaster &raster); std::unique_ptr createLineBucket(const VectorTileLayer& layer, const StyleBucket &bucket_desc); std::unique_ptr createSymbolBucket(const VectorTileLayer& layer, const StyleBucket &bucket_desc); @@ -69,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