39 return cv1._pos <
cv2._pos;
44 : cacheCV(0), prepared(
false) {
60 std::sort(_cvData.begin(), _cvData.end(), cvLessThan);
63 CV& end = *(_cvData.end() - 1);
64 CV& begin = *(_cvData.begin());
65 int realCVs =
static_cast<int>(_cvData.size()) - 2;
68 begin.
_val = _cvData[1]._val;
71 int lastIndex =
static_cast<int>(_cvData.size()) - 1;
83 for (
unsigned int i = 1;
i < _cvData.size() - 1;
i++) {
84 _cvData[
i]._deriv = (_cvData[
i + 1]._val - _cvData[
i - 1]._val) / (_cvData[
i + 1]._pos - _cvData[
i - 1]._pos);
88 for (
unsigned int i = 0;
i < _cvData.size() - 1;
i++) {
89 if (_cvData[
i]._interp == kMonotoneSpline) {
90 double h = _cvData[
i + 1]._pos - _cvData[
i]._pos;
92 _cvData[
i]._deriv = _cvData[
i + 1]._deriv = T();
94 T
delta = (_cvData[
i + 1]._val - _cvData[
i]._val) /
h;
95 clampCurveSegment(
delta, _cvData[
i]._deriv, _cvData[
i + 1]._deriv);
107 const int numPoints =
static_cast<int>(_cvData.size());
113 const float t0 =
static_cast<float>(_cvData[
index - 1]._pos);
114 const T
k0 = _cvData[
index - 1]._val;
116 const float t1 =
static_cast<float>(_cvData[
index]._pos);
117 const T
k1 = _cvData[
index]._val;
124 return k0 + u * (
k1 -
k0);
128 return k0 * (u - 1) * (u - 1) * (2 * u + 1) +
k1 * u * u * (3 - 2 * u);
131 case kMonotoneSpline: {
133 double h = _cvData[
index]._pos - _cvData[
index - 1]._pos;
134 T
y = _cvData[
index - 1]._val;
136 T
d1 = _cvData[
index - 1]._deriv;
153 const int numPoints =
static_cast<int>(_cvData.size());
159 const float t0 =
static_cast<float>(_cvData[
index - 1]._pos);
162 const float t1 =
static_cast<float>(_cvData[
index]._pos);
170 return k0 + u * (
k1 -
k0);
176 return k0 * (u - 1) * (u - 1) * (2 * u + 1) +
k1 * u * u * (3 - 2 * u);
180 case kMonotoneSpline: {
182 double h = _cvData[
index]._pos - _cvData[
index - 1]._pos;
202 int numPoints =
static_cast<int>(_cvData.size());
207 return _cvData[
index];
227 for (
int i = 0;
i < 3;
i++) {
static double comp(const T &val, const int i)
Returns a component of the given value.
static bool cvLessThan(const CV &cv1, const CV &cv2)
CV Parameter ordering (cv1._pos < cv2._pos)
double getChannelValue(const double param, int channel) const
CV getLowerBoundCV(const double param) const
InterpType
Supported interpolation types.
T getValue(const double param) const
Evaluates curve and returns full value.
static bool interpTypeValid(InterpType interp)
Returns whether the given interpolation type is supported.
void clampCurveSegment(const T &delta, T &d1, T &d2)
Performs hermite derivative clamping in canonical space.
void addPoint(double position, const T &val, InterpType type)
Adds a point to the curve.
std::vector< CV > _cvData
void preparePoints()
Prepares points for evaluation (sorts and computes boundaries, clamps extrema)
static_if< ref, T *, T[d]>::TYPE x
internal data (either an explicit arary or a pointer to raw data)
double clamp(double x, double lo, double hi)
This is the same as the prman cellnoise function< br ></div >< br > float< b > float y< br > float< b > float y
The result is computed int int< br >< div style="margin-left: 40px;"> Picks values randomly between loRange and hiRange based on supplied index(which is automatically hashed).