35#ifndef AAX_CRANGETAPERDELEGATE_H
36#define AAX_CRANGETAPERDELEGATE_H
92template <
typename T,
int32_t RealPrecision=1000>
122 T
Round(
double iValue)
const;
128 unsigned long mNumRanges;
129 std::vector<T> mRanges;
130 std::vector<double> mRangesSteps;
131 std::vector<double> mRangesPercents;
132 std::vector<double> mRangesStepsCount;
133 bool mUseSmartRounding;
136template <
typename T,
int32_t RealPrecision>
140 mMaxValue(*(ranges + numRanges)),
141 mNumRanges(numRanges),
142 mRanges( ranges, ranges + numRanges + 1),
143 mRangesSteps( rangesSteps, rangesSteps + numRanges),
144 mUseSmartRounding( useSmartRounding )
146 mRangesStepsCount.reserve(mNumRanges);
147 mRangesPercents.reserve(mNumRanges);
149 for (; i < mNumRanges; i++)
151 mRangesStepsCount.push_back( (mRanges.at(i + 1) - mRanges.at(i)) / mRangesSteps.at(i));
154 for (i = 0; i < mNumRanges; i++)
156 numSteps += mRangesStepsCount.at(i);
158 for (i = 0; i < mNumRanges; i++)
160 mRangesPercents.push_back( mRangesStepsCount.at(i) / numSteps );
164template <
typename T,
int32_t RealPrecision>
166 mMinValue(rhs.mMinValue),
167 mMaxValue(rhs.mMaxValue),
168 mNumRanges(rhs.mNumRanges),
169 mRanges( rhs.mRanges.begin(), rhs.mRanges.end()),
170 mRangesSteps( rhs.mRangesSteps.begin(), rhs.mRangesSteps.end()),
171 mRangesPercents( rhs.mRangesPercents.begin(), rhs.mRangesPercents.end()),
172 mRangesStepsCount( rhs.mRangesStepsCount.begin(), rhs.mRangesStepsCount.end()),
173 mUseSmartRounding( rhs.mUseSmartRounding )
177template <
typename T,
int32_t RealPrecision>
183 this->mMinValue = rhs.mMinValue;
184 this->mMaxValue = rhs.mMaxValue;
185 this->mNumRanges = rhs.mNumRanges;
186 this->mRanges.assign( rhs.mRanges.begin(), rhs.mRanges.end());
187 this->mRangesSteps.assign( rhs.mRangesSteps.begin(), rhs.mRangesSteps.end());
188 this->mRangesPercents.assign( rhs.mRangesPercents.begin(), rhs.mRangesPercents.end());
189 this->mRangesStepsCount.assign( rhs.mRangesStepsCount.begin(), rhs.mRangesStepsCount.end());
194template <
typename T,
int32_t RealPrecision>
197 return ((0 >= RealPrecision) ?
static_cast<T
>(iValue) :
198 (0 <= iValue) ?
static_cast<T
>(floor( iValue*RealPrecision + 0.5f ) / RealPrecision) :
199 static_cast<T
>(ceil( iValue*RealPrecision - 0.5f ) / RealPrecision)
203template <
typename T,
int32_t RealPrecision>
209template <
typename T,
int32_t RealPrecision>
212 if (mMinValue == mMaxValue)
216 value = Round(value);
218 const T& highValue = mMaxValue > mMinValue ? mMaxValue : mMinValue;
219 const T& lowValue = mMaxValue > mMinValue ? mMinValue : mMaxValue;
221 if (value > highValue)
223 if (value < lowValue)
229template <
typename T,
int32_t RealPrecision>
232 double percentTotal = normalizedValue;
234 double percent = 0.0;
236 for (; i < mNumRanges; i++)
238 if ((percentTotal >= percent) && (percentTotal < (percent + mRangesPercents.at( i ) )))
240 percent += mRangesPercents.at( i );
245 extValue = mMaxValue;
247 extValue = mRanges.at(i) + ((mRanges.at(i+1) - mRanges.at(i))*(percentTotal - percent)) / (mRangesPercents.at(i));
249 T realValue = T(extValue);
250 if ( mUseSmartRounding )
251 realValue = SmartRound(extValue);
253 return ConstrainRealValue(realValue);
256template <
typename T,
int32_t RealPrecision>
259 realValue = ConstrainRealValue(realValue);
261 double percentTotal = 0.0;
263 for (; i < mNumRanges; i++)
265 if ((realValue >= mRanges[i]) && (realValue < mRanges[i+1]))
267 percentTotal += mRangesPercents[i];
272 else if (mRanges.at(i + 1) == mRanges.at(i))
275 percentTotal += (realValue - mRanges.at(i))/
static_cast<double>(mRanges.at(i + 1) - mRanges.at(i)) * mRangesPercents.at(i);
277 double normalizedValue = percentTotal;
278 return normalizedValue;
281template <
typename T,
int32_t RealPrecision>
285 for (; i < mNumRanges; i++)
287 if ((value >= mRanges.at(i)) && (value < mRanges.at(i + 1) ))
289 if ( i == mNumRanges - 1 )
295 longVal = int32_t(floor(value / mRangesSteps.at(i) + 0.5));
297 longVal = int32_t(ceil(value / mRangesSteps.at(i) - 0.5));
299 return static_cast<T
>(
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:164
A piecewise-linear taper conforming to AAX_ITaperDelegate.
Definition: AAX_CRangeTaperDelegate.h:94
T GetMaximumValue() const AAX_OVERRIDE
Returns the taper's maximum real value.
Definition: AAX_CRangeTaperDelegate.h:116
double RealToNormalized(T realValue) const AAX_OVERRIDE
Normalizes a real parameter value.
Definition: AAX_CRangeTaperDelegate.h:257
T SmartRound(double value) const
Definition: AAX_CRangeTaperDelegate.h:282
T NormalizedToReal(double normalizedValue) const AAX_OVERRIDE
Converts a normalized value to a real value.
Definition: AAX_CRangeTaperDelegate.h:230
T Round(double iValue) const
Definition: AAX_CRangeTaperDelegate.h:195
AAX_CRangeTaperDelegate< T, RealPrecision > * Clone() const AAX_OVERRIDE
Constructs and returns a copy of the taper delegate.
Definition: AAX_CRangeTaperDelegate.h:204
AAX_CRangeTaperDelegate(T *range, double *rangesSteps, unsigned long numRanges, bool useSmartRounding=true)
Constructs a Range Taper with specified minimum and maximum values.
Definition: AAX_CRangeTaperDelegate.h:137
T GetMinimumValue() const AAX_OVERRIDE
Returns the taper's minimum real value.
Definition: AAX_CRangeTaperDelegate.h:115
AAX_CRangeTaperDelegate & operator=(AAX_CRangeTaperDelegate &rhs)
Definition: AAX_CRangeTaperDelegate.h:178
T ConstrainRealValue(T value) const AAX_OVERRIDE
Applies a contraint to the value and returns the constrained value.
Definition: AAX_CRangeTaperDelegate.h:210
Definition: AAX_ITaperDelegate.h:99