summaryrefslogtreecommitdiff
path: root/src/mbgl/style/layers/terrain_layer_impl.cpp
blob: 79e41fa9353a3e39b6e81143061bdfd5df1bd7b2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <mbgl/style/layers/terrain_layer_impl.hpp>
#include <mbgl/style/geometry_bucket_parameters.hpp>
#include <mbgl/style/raster_bucket_parameters.hpp>
#include <mbgl/renderer/terrain_bucket.hpp>

namespace mbgl {
namespace style {

void TerrainLayer::Impl::cascade(const CascadeParameters& parameters) {
    paint.cascade(parameters);
}

bool TerrainLayer::Impl::recalculate(const CalculationParameters& parameters) {
    bool hasTransitions = paint.recalculate(parameters);

    passes = RenderPass::Translucent;

    return hasTransitions;
}

std::unique_ptr<Bucket> TerrainLayer::Impl::createBucket(BucketParameters& params) const {
    if (params.is<mapbox::util::recursive_wrapper<GeometryBucketParameters>>()) {
        // DEM data encoded into vector tile
        auto& parameters = params.get<GeometryBucketParameters>();
        auto& layer = parameters.layer;

        for (std::size_t i = 0; !parameters.cancelled() && i < layer.featureCount(); i++) {
            auto feature = layer.getFeature(i);
            if (feature->getType() == FeatureType(4)) {
                return std::make_unique<TerrainBucket>(feature->getDEMPyramid());
            } else {
                // Trying to create a DEM from another feature type.
            }
        }
    } else if (params.is<mapbox::util::recursive_wrapper<RasterBucketParameters>>()) {
        // DEM data from raster tile
        auto& parameters = params.get<RasterBucketParameters>();
        if (parameters.data) {
            return std::make_unique<TerrainBucket>(decodeImage(*parameters.data));
        }
    }

    return nullptr;
}

} // namespace style
} // namespace mbgl