void StyleLayer::updateProperties(float z, const TimePoint& now, ZoomHistory &zoomHistory) {
    cleanupAppliedStyleProperties(now);

    switch (type) {
        case StyleLayerType::Fill: applyStyleProperties<FillProperties>(z, now, zoomHistory); break;
        case StyleLayerType::Line: applyStyleProperties<LineProperties>(z, now, zoomHistory); break;
        case StyleLayerType::Symbol: applyStyleProperties<SymbolProperties>(z, now, zoomHistory); break;
        case StyleLayerType::Raster: applyStyleProperties<RasterProperties>(z, now, zoomHistory); break;
        case StyleLayerType::Background: applyStyleProperties<BackgroundProperties>(z, now, zoomHistory); break;
        default: properties.set<std::false_type>(); break;
    }

    // Update the render passes when this layer is visible.
    passes = RenderPass::None;
    if (isVisible()) {
        if (properties.is<FillProperties>()) {
            const FillProperties &fillProperties = properties.get<FillProperties>();
            const float alpha = fillProperties.fill_color[3] * fillProperties.opacity;

            if (fillProperties.antialias) {
                passes |= RenderPass::Translucent;
            }
            if (!fillProperties.image.from.empty() || alpha < 1.0f) {
                passes |= RenderPass::Translucent;
            } else {
                passes |= RenderPass::Opaque;
            }
        } else {
            passes |= RenderPass::Translucent;
        }
    }
}
void StyleLayer::updateProperties(float z, const TimePoint now, ZoomHistory &zoomHistory) {
    cleanupAppliedStyleProperties(now);

    switch (type) {
        case StyleLayerType::Fill: applyStyleProperties<FillProperties>(z, now, zoomHistory); break;
        case StyleLayerType::Line: applyStyleProperties<LineProperties>(z, now, zoomHistory); break;
        case StyleLayerType::Symbol: applyStyleProperties<SymbolProperties>(z, now, zoomHistory); break;
        case StyleLayerType::Raster: applyStyleProperties<RasterProperties>(z, now, zoomHistory); break;
        case StyleLayerType::Background: applyStyleProperties<BackgroundProperties>(z, now, zoomHistory); break;
        default: properties.set<std::false_type>(); break;
    }
}
void StyleLayer::updateProperties(float z, const timestamp now) {
    if (layers) {
        layers->updateProperties(z, now);
    }

    cleanupAppliedStyleProperties(now);

    switch (type) {
        case StyleLayerType::Fill: applyStyleProperties<FillProperties>(z, now); break;
        case StyleLayerType::Line: applyStyleProperties<LineProperties>(z, now); break;
        case StyleLayerType::Symbol: applyStyleProperties<SymbolProperties>(z, now); break;
        case StyleLayerType::Raster: applyStyleProperties<RasterProperties>(z, now); break;
        case StyleLayerType::Background: applyStyleProperties<BackgroundProperties>(z, now); break;
        default: properties.set<std::false_type>(); break;
    }
}