6 #include "../Evaluator.hh"
7 #include "../../libs/vector2/vector2.h"
20 template <
typename ContextType>
29 : childEvaluator{childEvaluator}
33 Curve(
const Curve<ContextType>& other) =
default;
34 Curve(Curve<ContextType>&& other) =
default;
35 virtual ~
Curve() =
default;
42 virtual float Sample(
float argument)
const = 0;
47 return Sample(childEvaluator->EvaluateContext(context, snapshot));
51 virtual void DebugDump(
const std::map<const void*, unsigned int>& nodeMapping,
54 debugData.AddChildNode(nodeMapping.at(childEvaluator.get()));
58 std::shared_ptr<Evaluator<ContextType>> childEvaluator{};
61 template <
typename ContextType>
75 :
Curve<ContextType>(childEvaluator), lowerBound{lowerBound}
79 virtual float Sample(
float argument)
const override final
81 return std::max(lowerBound, argument);
84 virtual data::EvaluatorType GetEvaluatorType() const override final {
return data::EvaluatorType::CURVE_LOWER_BOUND; }
87 float lowerBound = 0.0f;
90 template <
typename ContextType>
104 :
Curve<ContextType>(childEvaluator), upperBound{upperBound}
108 virtual float Sample(
float argument)
const override final
110 return std::min(upperBound, argument);
113 virtual data::EvaluatorType GetEvaluatorType() const override final {
return data::EvaluatorType::CURVE_UPPER_BOUND; }
116 float upperBound = 0.0f;
119 template <
typename ContextType>
136 :
Curve<ContextType>{childEvaluator}, lowerBound{lowerBound}, upperBound{upperBound}
140 virtual float Sample(
float argument)
const override final
142 return std::min(upperBound, std::max(lowerBound, argument));
145 virtual data::EvaluatorType GetEvaluatorType() const override final
147 return data::EvaluatorType::CURVE_DOUBLE_SIDED_BOUND;
151 float lowerBound = 0.0f;
152 float upperBound = 0.0f;
155 template <
typename ContextType>
162 std::vector<Vector2> DiscretizeCurve(
const Curve<ContextType>& curve, std::size_t samplesQuantity)
164 std::vector<Vector2> controlPoints;
165 float increment = 1.0f / (samplesQuantity - 1);
166 for(
float i = 0; i <= 1; i += increment)
168 controlPoints.push_back({i, curve.Sample(i)});
170 return controlPoints;
174 #endif //GRAIL_CURVE_H