diff options
Diffstat (limited to 'src/mbgl/layer')
-rw-r--r-- | src/mbgl/layer/background_layer.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/layer/background_layer.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/layer/circle_layer.cpp | 12 | ||||
-rw-r--r-- | src/mbgl/layer/circle_layer.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/layer/fill_layer.cpp | 12 | ||||
-rw-r--r-- | src/mbgl/layer/fill_layer.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/layer/line_layer.cpp | 19 | ||||
-rw-r--r-- | src/mbgl/layer/line_layer.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/layer/raster_layer.cpp | 5 | ||||
-rw-r--r-- | src/mbgl/layer/raster_layer.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/layer/symbol_layer.cpp | 69 | ||||
-rw-r--r-- | src/mbgl/layer/symbol_layer.hpp | 2 |
12 files changed, 133 insertions, 0 deletions
diff --git a/src/mbgl/layer/background_layer.cpp b/src/mbgl/layer/background_layer.cpp index 70c6488ce1..bbfd56a1b3 100644 --- a/src/mbgl/layer/background_layer.cpp +++ b/src/mbgl/layer/background_layer.cpp @@ -21,4 +21,8 @@ void BackgroundLayer::recalculate(const StyleCalculationParameters& parameters) passes = properties.isVisible() ? RenderPass::Translucent : RenderPass::None; } +std::unique_ptr<Bucket> BackgroundLayer::createBucket(StyleBucketParameters&) const { + return nullptr; +} + } diff --git a/src/mbgl/layer/background_layer.hpp b/src/mbgl/layer/background_layer.hpp index 86dfd24a4b..b333cd4636 100644 --- a/src/mbgl/layer/background_layer.hpp +++ b/src/mbgl/layer/background_layer.hpp @@ -15,6 +15,8 @@ public: void recalculate(const StyleCalculationParameters&) override; + std::unique_ptr<Bucket> createBucket(StyleBucketParameters&) const override; + BackgroundPaintProperties properties; }; diff --git a/src/mbgl/layer/circle_layer.cpp b/src/mbgl/layer/circle_layer.cpp index e3fa4b4dee..e74e87ea9d 100644 --- a/src/mbgl/layer/circle_layer.cpp +++ b/src/mbgl/layer/circle_layer.cpp @@ -1,5 +1,7 @@ #include <mbgl/layer/circle_layer.hpp> #include <mbgl/style/property_parsing.hpp> +#include <mbgl/style/style_bucket_parameters.hpp> +#include <mbgl/renderer/circle_bucket.hpp> namespace mbgl { @@ -27,4 +29,14 @@ void CircleLayer::recalculate(const StyleCalculationParameters& parameters) { passes = properties.isVisible() ? RenderPass::Translucent : RenderPass::None; } +std::unique_ptr<Bucket> CircleLayer::createBucket(StyleBucketParameters& parameters) const { + auto bucket = std::make_unique<CircleBucket>(); + + parameters.eachFilteredFeature(filter, [&] (const auto& feature) { + bucket->addGeometry(feature.getGeometries()); + }); + + return std::move(bucket); +} + } diff --git a/src/mbgl/layer/circle_layer.hpp b/src/mbgl/layer/circle_layer.hpp index 957d6b9cae..f07d304846 100644 --- a/src/mbgl/layer/circle_layer.hpp +++ b/src/mbgl/layer/circle_layer.hpp @@ -15,6 +15,8 @@ public: void recalculate(const StyleCalculationParameters&) override; + std::unique_ptr<Bucket> createBucket(StyleBucketParameters&) const override; + CirclePaintProperties properties; }; diff --git a/src/mbgl/layer/fill_layer.cpp b/src/mbgl/layer/fill_layer.cpp index 53bf0ac89c..5ff26337b7 100644 --- a/src/mbgl/layer/fill_layer.cpp +++ b/src/mbgl/layer/fill_layer.cpp @@ -1,5 +1,7 @@ #include <mbgl/layer/fill_layer.hpp> #include <mbgl/style/property_parsing.hpp> +#include <mbgl/style/style_bucket_parameters.hpp> +#include <mbgl/renderer/fill_bucket.hpp> namespace mbgl { @@ -43,4 +45,14 @@ void FillLayer::recalculate(const StyleCalculationParameters& parameters) { } } +std::unique_ptr<Bucket> FillLayer::createBucket(StyleBucketParameters& parameters) const { + auto bucket = std::make_unique<FillBucket>(); + + parameters.eachFilteredFeature(filter, [&] (const auto& feature) { + bucket->addGeometry(feature.getGeometries()); + }); + + return std::move(bucket); +} + } diff --git a/src/mbgl/layer/fill_layer.hpp b/src/mbgl/layer/fill_layer.hpp index 7a5d468bb3..fd22efa826 100644 --- a/src/mbgl/layer/fill_layer.hpp +++ b/src/mbgl/layer/fill_layer.hpp @@ -15,6 +15,8 @@ public: void recalculate(const StyleCalculationParameters&) override; + std::unique_ptr<Bucket> createBucket(StyleBucketParameters&) const override; + FillPaintProperties properties; }; diff --git a/src/mbgl/layer/line_layer.cpp b/src/mbgl/layer/line_layer.cpp index 793c133325..a27cf65ee2 100644 --- a/src/mbgl/layer/line_layer.cpp +++ b/src/mbgl/layer/line_layer.cpp @@ -1,5 +1,7 @@ #include <mbgl/layer/line_layer.hpp> #include <mbgl/style/property_parsing.hpp> +#include <mbgl/style/style_bucket_parameters.hpp> +#include <mbgl/renderer/line_bucket.hpp> #include <mbgl/map/tile_id.hpp> namespace mbgl { @@ -52,4 +54,21 @@ void LineLayer::recalculate(const StyleCalculationParameters& parameters) { passes = properties.isVisible() ? RenderPass::Translucent : RenderPass::None; } +std::unique_ptr<Bucket> LineLayer::createBucket(StyleBucketParameters& parameters) const { + auto bucket = std::make_unique<LineBucket>(); + + const float z = parameters.tileID.z; + + layout.calculate(PropertyKey::LineCap, bucket->layout.cap, z); + layout.calculate(PropertyKey::LineJoin, bucket->layout.join, z); + layout.calculate(PropertyKey::LineMiterLimit, bucket->layout.miter_limit, z); + layout.calculate(PropertyKey::LineRoundLimit, bucket->layout.round_limit, z); + + parameters.eachFilteredFeature(filter, [&] (const auto& feature) { + bucket->addGeometry(feature.getGeometries()); + }); + + return std::move(bucket); +} + } diff --git a/src/mbgl/layer/line_layer.hpp b/src/mbgl/layer/line_layer.hpp index 5f8c0f2b3a..8acd58f01f 100644 --- a/src/mbgl/layer/line_layer.hpp +++ b/src/mbgl/layer/line_layer.hpp @@ -15,6 +15,8 @@ public: void recalculate(const StyleCalculationParameters&) override; + std::unique_ptr<Bucket> createBucket(StyleBucketParameters&) const override; + LinePaintProperties properties; }; diff --git a/src/mbgl/layer/raster_layer.cpp b/src/mbgl/layer/raster_layer.cpp index 3f210233ac..8649b58ab8 100644 --- a/src/mbgl/layer/raster_layer.cpp +++ b/src/mbgl/layer/raster_layer.cpp @@ -1,5 +1,6 @@ #include <mbgl/layer/raster_layer.hpp> #include <mbgl/style/property_parsing.hpp> +#include <mbgl/renderer/bucket.hpp> namespace mbgl { @@ -35,4 +36,8 @@ void RasterLayer::recalculate(const StyleCalculationParameters& parameters) { passes = properties.isVisible() ? RenderPass::Translucent : RenderPass::None; } +std::unique_ptr<Bucket> RasterLayer::createBucket(StyleBucketParameters&) const { + return nullptr; +} + } diff --git a/src/mbgl/layer/raster_layer.hpp b/src/mbgl/layer/raster_layer.hpp index 6a0de8a38c..a5b09191a6 100644 --- a/src/mbgl/layer/raster_layer.hpp +++ b/src/mbgl/layer/raster_layer.hpp @@ -15,6 +15,8 @@ public: void recalculate(const StyleCalculationParameters&) override; + std::unique_ptr<Bucket> createBucket(StyleBucketParameters&) const override; + RasterPaintProperties properties; }; diff --git a/src/mbgl/layer/symbol_layer.cpp b/src/mbgl/layer/symbol_layer.cpp index bde588de02..a82eae3aaa 100644 --- a/src/mbgl/layer/symbol_layer.cpp +++ b/src/mbgl/layer/symbol_layer.cpp @@ -1,6 +1,9 @@ #include <mbgl/layer/symbol_layer.hpp> +#include <mbgl/renderer/symbol_bucket.hpp> +#include <mbgl/map/tile_id.hpp> #include <mbgl/style/property_evaluator.hpp> #include <mbgl/style/property_parsing.hpp> +#include <mbgl/style/style_bucket_parameters.hpp> namespace mbgl { @@ -108,4 +111,70 @@ void SymbolLayer::recalculate(const StyleCalculationParameters& parameters) { passes = properties.isVisible() ? RenderPass::Translucent : RenderPass::None; } +std::unique_ptr<Bucket> SymbolLayer::createBucket(StyleBucketParameters& parameters) const { + const float z = parameters.tileID.z; + auto bucket = std::make_unique<SymbolBucket>(parameters.tileID.overscaling, z); + + layout.calculate(PropertyKey::SymbolPlacement, bucket->layout.placement, z); + if (bucket->layout.placement == PlacementType::Line) { + bucket->layout.icon.rotation_alignment = RotationAlignmentType::Map; + bucket->layout.text.rotation_alignment = RotationAlignmentType::Map; + }; + layout.calculate(PropertyKey::SymbolSpacing, bucket->layout.spacing, z); + layout.calculate(PropertyKey::SymbolAvoidEdges, bucket->layout.avoid_edges, z); + + layout.calculate(PropertyKey::IconAllowOverlap, bucket->layout.icon.allow_overlap, z); + layout.calculate(PropertyKey::IconIgnorePlacement, bucket->layout.icon.ignore_placement, z); + layout.calculate(PropertyKey::IconOptional, bucket->layout.icon.optional, z); + layout.calculate(PropertyKey::IconRotationAlignment, bucket->layout.icon.rotation_alignment, z); + layout.calculate(PropertyKey::IconImage, bucket->layout.icon.image, z); + layout.calculate(PropertyKey::IconPadding, bucket->layout.icon.padding, z); + layout.calculate(PropertyKey::IconRotate, bucket->layout.icon.rotate, z); + layout.calculate(PropertyKey::IconKeepUpright, bucket->layout.icon.keep_upright, z); + layout.calculate(PropertyKey::IconOffset, bucket->layout.icon.offset, z); + + layout.calculate(PropertyKey::TextRotationAlignment, bucket->layout.text.rotation_alignment, z); + layout.calculate(PropertyKey::TextField, bucket->layout.text.field, z); + layout.calculate(PropertyKey::TextFont, bucket->layout.text.font, z); + layout.calculate(PropertyKey::TextMaxWidth, bucket->layout.text.max_width, z); + layout.calculate(PropertyKey::TextLineHeight, bucket->layout.text.line_height, z); + layout.calculate(PropertyKey::TextLetterSpacing, bucket->layout.text.letter_spacing, z); + layout.calculate(PropertyKey::TextMaxAngle, bucket->layout.text.max_angle, z); + layout.calculate(PropertyKey::TextRotate, bucket->layout.text.rotate, z); + layout.calculate(PropertyKey::TextPadding, bucket->layout.text.padding, z); + layout.calculate(PropertyKey::TextIgnorePlacement, bucket->layout.text.ignore_placement, z); + layout.calculate(PropertyKey::TextOptional, bucket->layout.text.optional, z); + layout.calculate(PropertyKey::TextJustify, bucket->layout.text.justify, z); + layout.calculate(PropertyKey::TextAnchor, bucket->layout.text.anchor, z); + layout.calculate(PropertyKey::TextKeepUpright, bucket->layout.text.keep_upright, z); + layout.calculate(PropertyKey::TextTransform, bucket->layout.text.transform, z); + layout.calculate(PropertyKey::TextOffset, bucket->layout.text.offset, z); + layout.calculate(PropertyKey::TextAllowOverlap, bucket->layout.text.allow_overlap, z); + + layout.calculate(PropertyKey::IconSize, bucket->layout.icon.size, z + 1); + layout.calculate(PropertyKey::IconSize, bucket->layout.icon.max_size, 18); + layout.calculate(PropertyKey::TextSize, bucket->layout.text.size, z + 1); + layout.calculate(PropertyKey::TextSize, bucket->layout.text.max_size, 18); + + bucket->parseFeatures(parameters.layer, filter); + + if (bucket->needsDependencies(parameters.glyphStore, parameters.sprite)) { + parameters.partialParse = true; + } + + // We do not add features if the parser is in a "partial" state because + // the layer ordering needs to be respected when calculating text + // collisions. Although, at this point, we requested all the resources + // needed by this tile. + if (!parameters.partialParse) { + bucket->addFeatures(parameters.tileUID, + parameters.spriteAtlas, + parameters.glyphAtlas, + parameters.glyphStore, + parameters.collisionTile); + } + + return std::move(bucket); +} + } diff --git a/src/mbgl/layer/symbol_layer.hpp b/src/mbgl/layer/symbol_layer.hpp index ce92c19594..21f0f41d07 100644 --- a/src/mbgl/layer/symbol_layer.hpp +++ b/src/mbgl/layer/symbol_layer.hpp @@ -15,6 +15,8 @@ public: void recalculate(const StyleCalculationParameters&) override; + std::unique_ptr<Bucket> createBucket(StyleBucketParameters&) const override; + SymbolPaintProperties properties; }; |