22#ifndef AAX_CRANGETAPERDELEGATE_H
23#define AAX_CRANGETAPERDELEGATE_H
79template <
typename T,
int32_t RealPrecision=1000>
109 T
Round(
double iValue)
const;
116 std::vector<T> mRanges;
117 std::vector<double> mRangesSteps;
118 std::vector<double> mRangesPercents;
119 std::vector<double> mRangesStepsCount;
120 bool mUseSmartRounding;
123template <
typename T,
int32_t RealPrecision>
127 mMaxValue(*(ranges + numRanges)),
128 mNumRanges(numRanges),
129 mRanges( ranges, ranges + numRanges + 1),
130 mRangesSteps( rangesSteps, rangesSteps + numRanges),
131 mUseSmartRounding( useSmartRounding )
133 mRangesStepsCount.reserve(numRanges);
134 mRangesPercents.reserve(numRanges);
136 for (; i < mNumRanges; i++)
138 mRangesStepsCount.push_back( (mRanges.at(i + 1) - mRanges.at(i)) / mRangesSteps.at(i));
141 for (i = 0; i < mNumRanges; i++)
143 numSteps += mRangesStepsCount.at(i);
145 for (i = 0; i < mNumRanges; i++)
147 mRangesPercents.push_back( mRangesStepsCount.at(i) / numSteps );
151template <
typename T,
int32_t RealPrecision>
153 mMinValue(rhs.mMinValue),
154 mMaxValue(rhs.mMaxValue),
155 mNumRanges(rhs.mNumRanges),
156 mRanges( rhs.mRanges.begin(), rhs.mRanges.end()),
157 mRangesSteps( rhs.mRangesSteps.begin(), rhs.mRangesSteps.end()),
158 mRangesPercents( rhs.mRangesPercents.begin(), rhs.mRangesPercents.end()),
159 mRangesStepsCount( rhs.mRangesStepsCount.begin(), rhs.mRangesStepsCount.end()),
160 mUseSmartRounding( rhs.mUseSmartRounding )
164template <
typename T,
int32_t RealPrecision>
170 this->mMinValue = rhs.mMinValue;
171 this->mMaxValue = rhs.mMaxValue;
172 this->mNumRanges = rhs.mNumRanges;
173 this->mRanges.assign( rhs.mRanges.begin(), rhs.mRanges.end());
174 this->mRangesSteps.assign( rhs.mRangesSteps.begin(), rhs.mRangesSteps.end());
175 this->mRangesPercents.assign( rhs.mRangesPercents.begin(), rhs.mRangesPercents.end());
176 this->mRangesStepsCount.assign( rhs.mRangesStepsCount.begin(), rhs.mRangesStepsCount.end());
181template <
typename T,
int32_t RealPrecision>
184 return ((0 >= RealPrecision) ?
static_cast<T
>(iValue) :
185 (0 <= iValue) ? floor( iValue*RealPrecision + 0.5f ) / RealPrecision :
186 ceil( iValue*RealPrecision - 0.5f ) / RealPrecision
190template <
typename T,
int32_t RealPrecision>
196template <
typename T,
int32_t RealPrecision>
199 if (mMinValue == mMaxValue)
203 value = Round(value);
205 const T& highValue = mMaxValue > mMinValue ? mMaxValue : mMinValue;
206 const T& lowValue = mMaxValue > mMinValue ? mMinValue : mMaxValue;
208 if (value > highValue)
210 if (value < lowValue)
216template <
typename T,
int32_t RealPrecision>
219 double percentTotal = normalizedValue;
221 double percent = 0.0;
223 for (; i < mNumRanges; i++)
225 if ((percentTotal >= percent) && (percentTotal < (percent + mRangesPercents.at( i ) )))
227 percent += mRangesPercents.at( i );
232 extValue = mMaxValue;
234 extValue = mRanges.at(i) + ((mRanges.at(i+1) - mRanges.at(i))*(percentTotal - percent)) / (mRangesPercents.at(i));
236 T realValue = T(extValue);
237 if ( mUseSmartRounding )
238 realValue = SmartRound(extValue);
240 return ConstrainRealValue(realValue);
243template <
typename T,
int32_t RealPrecision>
246 realValue = ConstrainRealValue(realValue);
248 double percentTotal = 0.0;
250 for (; i < mNumRanges; i++)
252 if ((realValue >= mRanges[i]) && (realValue < mRanges[i+1]))
254 percentTotal += mRangesPercents[i];
259 else if (mRanges.at(i + 1) == mRanges.at(i))
262 percentTotal += (realValue - mRanges.at(i))/(mRanges.at(i + 1) - mRanges.at(i)) * mRangesPercents.at(i);
264 double normalizedValue = percentTotal;
265 return normalizedValue;
268template <
typename T,
int32_t RealPrecision>
272 for (; i < mNumRanges; i++)
274 if ((value >= mRanges.at(i)) && (value < mRanges.at(i + 1) ))
276 if ( i == mNumRanges - 1 )
282 longVal = int32_t(floor(value / mRangesSteps.at(i) + 0.5));
284 longVal = int32_t(ceil(value / mRangesSteps.at(i) - 0.5));
286 return static_cast<double>(longVal) * mRangesSteps.at(i);
Defines the taper conversion behavior for a parameter.
Various utility definitions for AAX.
#define AAX_OVERRIDE
override keyword macro
Definition: AAX.h:151
A piecewise-linear taper conforming to AAX_ITaperDelegate.
Definition: AAX_CRangeTaperDelegate.h:81
AAX_CRangeTaperDelegate(T *range, double *rangesSteps, long numRanges, bool useSmartRounding=true)
Constructs a Range Taper with specified minimum and maximum values.
Definition: AAX_CRangeTaperDelegate.h:124
T GetMaximumValue() const AAX_OVERRIDE
Returns the taper's maximum real value.
Definition: AAX_CRangeTaperDelegate.h:103
double RealToNormalized(T realValue) const AAX_OVERRIDE
Normalizes a real parameter value.
Definition: AAX_CRangeTaperDelegate.h:244
T SmartRound(double value) const
Definition: AAX_CRangeTaperDelegate.h:269
T NormalizedToReal(double normalizedValue) const AAX_OVERRIDE
Converts a normalized value to a real value.
Definition: AAX_CRangeTaperDelegate.h:217
T Round(double iValue) const
Definition: AAX_CRangeTaperDelegate.h:182
AAX_CRangeTaperDelegate< T, RealPrecision > * Clone() const AAX_OVERRIDE
Constructs and returns a copy of the taper delegate.
Definition: AAX_CRangeTaperDelegate.h:191
T GetMinimumValue() const AAX_OVERRIDE
Returns the taper's minimum real value.
Definition: AAX_CRangeTaperDelegate.h:102
AAX_CRangeTaperDelegate & operator=(AAX_CRangeTaperDelegate &rhs)
Definition: AAX_CRangeTaperDelegate.h:165
T ConstrainRealValue(T value) const AAX_OVERRIDE
Applies a contraint to the value and returns the constrained value.
Definition: AAX_CRangeTaperDelegate.h:197
Definition: AAX_ITaperDelegate.h:86