#include #include #include #include #include #include #include #include #include namespace mbgl { RenderFillLayer::RenderFillLayer(Immutable _impl) : RenderLayer(style::LayerType::Fill, _impl), unevaluated(impl().paint.untransitioned()) { } const style::FillLayer::Impl& RenderFillLayer::impl() const { return static_cast(*baseImpl); } std::unique_ptr RenderFillLayer::createBucket(const BucketParameters& parameters, const std::vector& layers) const { return std::make_unique(parameters, layers); } void RenderFillLayer::transition(const TransitionParameters& parameters) { unevaluated = impl().paint.transitioned(parameters, std::move(unevaluated)); } void RenderFillLayer::evaluate(const PropertyEvaluationParameters& parameters) { evaluated = unevaluated.evaluate(parameters); if (unevaluated.get().isUndefined()) { evaluated.get() = evaluated.get(); } passes = RenderPass::None; if (evaluated.get()) { passes |= RenderPass::Translucent; } if (!unevaluated.get().isUndefined() || evaluated.get().constantOr(Color()).a < 1.0f || evaluated.get().constantOr(0) < 1.0f) { passes |= RenderPass::Translucent; } else { passes |= RenderPass::Opaque; } } bool RenderFillLayer::hasTransition() const { return unevaluated.hasTransition(); } void RenderFillLayer::render(Painter& painter, PaintParameters& parameters, RenderSource*) { for (const RenderTile& tile : renderTiles) { Bucket* bucket = tile.tile.getBucket(*baseImpl); assert(dynamic_cast(bucket)); painter.renderFill( parameters, *reinterpret_cast(bucket), *this, tile); } } bool RenderFillLayer::queryIntersectsFeature( const GeometryCoordinates& queryGeometry, const GeometryTileFeature& feature, const float, const float bearing, const float pixelsToTileUnits) const { auto translatedQueryGeometry = FeatureIndex::translateQueryGeometry( queryGeometry, evaluated.get(), evaluated.get(), bearing, pixelsToTileUnits); return util::polygonIntersectsMultiPolygon(translatedQueryGeometry.value_or(queryGeometry), feature.getGeometries()); } } // namespace mbgl