summaryrefslogtreecommitdiff
path: root/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp')
-rw-r--r--src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp74
1 files changed, 52 insertions, 22 deletions
diff --git a/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp b/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp
index 2f720284fc..08e9d609cd 100644
--- a/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp
+++ b/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp
@@ -12,6 +12,7 @@
#include <mbgl/geometry/feature_index.hpp>
#include <mbgl/util/math.hpp>
#include <mbgl/util/intersection_tests.hpp>
+#include <mbgl/tile/geometry_tile.hpp>
namespace mbgl {
@@ -26,8 +27,18 @@ const style::FillExtrusionLayer::Impl& RenderFillExtrusionLayer::impl() const {
return static_cast<const style::FillExtrusionLayer::Impl&>(*baseImpl);
}
-std::unique_ptr<Bucket> RenderFillExtrusionLayer::createBucket(const BucketParameters& parameters, const std::vector<const RenderLayer*>& layers) const {
- return std::make_unique<FillExtrusionBucket>(parameters, layers);
+std::unique_ptr<Bucket> RenderFillExtrusionLayer::createBucket(const BucketParameters&, const std::vector<const RenderLayer*>&) const {
+ assert(false); // Should be calling createLayout() instead.
+ return nullptr;
+}
+
+
+std::unique_ptr<PatternLayout<FillExtrusionBucket>>
+RenderFillExtrusionLayer::createLayout(const BucketParameters& parameters,
+ const std::vector<const RenderLayer*>& group,
+ std::unique_ptr<GeometryTileLayer> layer,
+ ImageDependencies& imageDependencies) const {
+ return std::make_unique<PatternLayout<FillExtrusionBucket>>(parameters, group, std::move(layer), imageDependencies);
}
void RenderFillExtrusionLayer::transition(const TransitionParameters& parameters) {
@@ -36,6 +47,7 @@ void RenderFillExtrusionLayer::transition(const TransitionParameters& parameters
void RenderFillExtrusionLayer::evaluate(const PropertyEvaluationParameters& parameters) {
evaluated = unevaluated.evaluate(parameters);
+ crossfade = parameters.getCrossfadeParameters();
passes = (evaluated.get<style::FillExtrusionOpacity>() > 0)
? (RenderPass::Translucent | RenderPass::Pass3D)
@@ -46,6 +58,10 @@ bool RenderFillExtrusionLayer::hasTransition() const {
return unevaluated.hasTransition();
}
+bool RenderFillExtrusionLayer::hasCrossfade() const {
+ return crossfade.t != 1;
+}
+
void RenderFillExtrusionLayer::render(PaintParameters& parameters, RenderSource*) {
if (parameters.pass == RenderPass::Opaque) {
return;
@@ -68,8 +84,10 @@ void RenderFillExtrusionLayer::render(PaintParameters& parameters, RenderSource*
parameters.context.setStencilMode(gl::StencilMode::disabled());
parameters.context.clear(Color{ 0.0f, 0.0f, 0.0f, 0.0f }, depthClearValue, {});
- auto draw = [&](auto& programInstance, const auto& tileBucket, auto&& uniformValues) {
+ auto draw = [&](auto& programInstance, const auto& tileBucket, auto&& uniformValues,
+ const optional<ImagePosition>& patternPositionA, const optional<ImagePosition>& patternPositionB) {
const auto& paintPropertyBinders = tileBucket.paintPropertyBinders.at(getID());
+ paintPropertyBinders.setPatternParameters(patternPositionA, patternPositionB, crossfade);
const auto allUniformValues = programInstance.computeAllUniformValues(
std::move(uniformValues),
@@ -98,7 +116,7 @@ void RenderFillExtrusionLayer::render(PaintParameters& parameters, RenderSource*
getID());
};
- if (evaluated.get<FillExtrusionPattern>().from.empty()) {
+ if (unevaluated.get<FillExtrusionPattern>().isUndefined()) {
for (const RenderTile& tile : renderTiles) {
auto bucket_ = tile.tile.getBucket<FillExtrusionBucket>(*baseImpl);
if (!bucket_) {
@@ -115,26 +133,22 @@ void RenderFillExtrusionLayer::render(PaintParameters& parameters, RenderSource*
parameters.state),
parameters.state,
parameters.evaluatedLight
- )
+ ),
+ {}, {}
);
}
} else {
- optional<ImagePosition> imagePosA =
- parameters.imageManager.getPattern(evaluated.get<FillExtrusionPattern>().from);
- optional<ImagePosition> imagePosB =
- parameters.imageManager.getPattern(evaluated.get<FillExtrusionPattern>().to);
-
- if (!imagePosA || !imagePosB) {
- return;
- }
-
- parameters.imageManager.bind(parameters.context, 0);
-
for (const RenderTile& tile : renderTiles) {
auto bucket_ = tile.tile.getBucket<FillExtrusionBucket>(*baseImpl);
if (!bucket_) {
continue;
}
+ const auto fillPatternValue = evaluated.get<FillExtrusionPattern>().constantOr(mbgl::Faded<std::basic_string<char> >{"", ""});
+ assert(dynamic_cast<GeometryTile*>(&tile.tile));
+ GeometryTile& geometryTile = static_cast<GeometryTile&>(tile.tile);
+ optional<ImagePosition> patternPosA = geometryTile.getPattern(fillPatternValue.from);
+ optional<ImagePosition> patternPosB = geometryTile.getPattern(fillPatternValue.to);
+ parameters.context.bindTexture(*geometryTile.iconAtlasTexture, 0, gl::TextureFilter::Linear);
FillExtrusionBucket& bucket = *bucket_;
draw(
@@ -144,11 +158,16 @@ void RenderFillExtrusionLayer::render(PaintParameters& parameters, RenderSource*
tile.translatedClipMatrix(evaluated.get<FillExtrusionTranslate>(),
evaluated.get<FillExtrusionTranslateAnchor>(),
parameters.state),
- parameters.imageManager.getPixelSize(), *imagePosA, *imagePosB,
- evaluated.get<FillExtrusionPattern>(), tile.id, parameters.state,
+ geometryTile.iconAtlasTexture->size,
+ crossfade,
+ tile.id,
+ parameters.state,
-std::pow(2, tile.id.canonical.z) / util::tileSize / 8.0f,
+ parameters.pixelRatio,
parameters.evaluatedLight
- )
+ ),
+ patternPosA,
+ patternPosB
);
}
}
@@ -168,9 +187,9 @@ void RenderFillExtrusionLayer::render(PaintParameters& parameters, RenderSource*
const auto allUniformValues = programInstance.computeAllUniformValues(
ExtrusionTextureProgram::UniformValues{
- uniforms::u_matrix::Value{ viewportMat }, uniforms::u_world::Value{ size },
- uniforms::u_image::Value{ 0 },
- uniforms::u_opacity::Value{ evaluated.get<FillExtrusionOpacity>() }
+ uniforms::u_matrix::Value( viewportMat ), uniforms::u_world::Value( size ),
+ uniforms::u_image::Value( 0 ),
+ uniforms::u_opacity::Value( evaluated.get<FillExtrusionOpacity>() )
},
paintAttributeData,
properties,
@@ -197,6 +216,17 @@ void RenderFillExtrusionLayer::render(PaintParameters& parameters, RenderSource*
getID());
}
}
+style::FillExtrusionPaintProperties::PossiblyEvaluated RenderFillExtrusionLayer::paintProperties() const {
+ return FillExtrusionPaintProperties::PossiblyEvaluated {
+ evaluated.get<style::FillExtrusionOpacity>(),
+ evaluated.get<style::FillExtrusionColor>(),
+ evaluated.get<style::FillExtrusionTranslate>(),
+ evaluated.get<style::FillExtrusionTranslateAnchor>(),
+ evaluated.get<style::FillExtrusionPattern>(),
+ evaluated.get<style::FillExtrusionHeight>(),
+ evaluated.get<style::FillExtrusionBase>()
+ };
+}
bool RenderFillExtrusionLayer::queryIntersectsFeature(
const GeometryCoordinates& queryGeometry,