summaryrefslogtreecommitdiff
path: root/include/mbgl/style/function/camera_function.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/mbgl/style/function/camera_function.hpp')
-rw-r--r--include/mbgl/style/function/camera_function.hpp23
1 files changed, 16 insertions, 7 deletions
diff --git a/include/mbgl/style/function/camera_function.hpp b/include/mbgl/style/function/camera_function.hpp
index c44002e8c1..721d3083e1 100644
--- a/include/mbgl/style/function/camera_function.hpp
+++ b/include/mbgl/style/function/camera_function.hpp
@@ -1,7 +1,9 @@
#pragma once
#include <mbgl/style/expression/expression.hpp>
-#include <mbgl/style/expression/curve.hpp>
+#include <mbgl/style/expression/interpolate.hpp>
+#include <mbgl/style/expression/step.hpp>
+#include <mbgl/style/expression/find_zoom_curve.hpp>
#include <mbgl/style/expression/value.hpp>
#include <mbgl/style/expression/is_constant.hpp>
#include <mbgl/style/function/convert.hpp>
@@ -17,7 +19,7 @@ namespace style {
template <class T>
class CameraFunction {
public:
- using Curve = expression::Curve<typename expression::ValueConverter<T>::ExpressionType>;
+ using ExpressionType = typename expression::ValueConverter<T>::ExpressionType;
using Stops = std::conditional_t<
util::Interpolatable<T>::value,
@@ -29,7 +31,7 @@ public:
CameraFunction(std::unique_ptr<expression::Expression> expression_)
: expression(std::move(expression_)),
- zoomCurve(*Curve::findZoomCurve(expression.get()))
+ zoomCurve(*expression::findZoomCurve<ExpressionType>(expression.get()))
{
assert(!isZoomConstant(expression.get()));
assert(isFeatureConstant(expression.get()));
@@ -40,7 +42,7 @@ public:
expression(stops.match([&] (const auto& s) {
return expression::Convert::toExpression(s);
})),
- zoomCurve(*Curve::findZoomCurve(expression.get()))
+ zoomCurve(*expression::findZoomCurve<ExpressionType>(expression.get()))
{}
T evaluate(float zoom) const {
@@ -53,11 +55,18 @@ public:
}
float interpolationFactor(const Range<float>& inputLevels, const float inputValue) const {
- return zoomCurve->interpolationFactor(Range<double> { inputLevels.min, inputLevels.max }, inputValue);
+ return zoomCurve.match(
+ [&](expression::Interpolate<ExpressionType>* z) {
+ return z->interpolationFactor(Range<double> { inputLevels.min, inputLevels.max }, inputValue);
+ },
+ [&](expression::Step*) { return 0.0f; }
+ );
}
Range<float> getCoveringStops(const float lower, const float upper) const {
- return zoomCurve->getCoveringStops(lower, upper);
+ return zoomCurve.match(
+ [&](auto z) { return z->getCoveringStops(lower, upper); }
+ );
}
friend bool operator==(const CameraFunction& lhs,
@@ -72,7 +81,7 @@ public:
private:
std::shared_ptr<expression::Expression> expression;
- const Curve* zoomCurve;
+ const variant<expression::Interpolate<ExpressionType>*, expression::Step*> zoomCurve;
};
} // namespace style