| 1 | //************************************ bs::framework - Copyright 2018 Marko Pintera **************************************// |
| 2 | //*********** Licensed under the MIT license. See LICENSE.md for full terms. This notice is not to be removed. ***********// |
| 3 | #pragma once |
| 4 | |
| 5 | #include "Prerequisites/BsPrerequisitesUtil.h" |
| 6 | |
| 7 | namespace bs |
| 8 | { |
| 9 | /** @addtogroup General |
| 10 | * @{ |
| 11 | */ |
| 12 | |
| 13 | /** |
| 14 | * Contains a set of samples resulting from sampling some function at equal intervals. The table can then be used |
| 15 | * for sampling that function at arbitrary time intervals. The sampling is fast but precision is limited to the number |
| 16 | * of samples. |
| 17 | */ |
| 18 | class BS_UTILITY_EXPORT LookupTable |
| 19 | { |
| 20 | public: |
| 21 | /** |
| 22 | * Constructs a lookup table from the provided set of values. |
| 23 | * |
| 24 | * @param[in] values Buffer containing information about all the samples. Total buffer size must be divisble |
| 25 | * by @p sampleSize. |
| 26 | * @param[in] startTime Time at which the first provided sample has been evaluated at. |
| 27 | * @param[in] endTime Time at which the last provided sample has been evaluate at. All samples in-between |
| 28 | * first and last are assumed to be evaluated to equal intervals in the |
| 29 | * [startTime, endTime] range. |
| 30 | * @param[in] sampleSize Number of 'float's each sample requires. This number must divide the number of elements |
| 31 | * in the @p values buffer. |
| 32 | */ |
| 33 | LookupTable(Vector<float> values, float startTime = 0.0f, float endTime = 1.0f, uint32_t sampleSize = 1); |
| 34 | |
| 35 | /** |
| 36 | * Evaluates the lookup table at the specified time. |
| 37 | * |
| 38 | * @param[in] t Time to evaluate the lookup table at. |
| 39 | * @param[out] left Pointer to the set of values contained in the sample left to the time value. |
| 40 | * @param[out] right Pointer to the set of values contained in the sample right to the time value. |
| 41 | * @param[out] fraction Fraction that determines how to interpolate between @p left and @p right values, where |
| 42 | * 0 corresponds to the @p left value, 1 to the @p right value and values in-between |
| 43 | * interpolate linearly between the two. |
| 44 | */ |
| 45 | void evaluate(float t, const float*& left, const float*& right, float& fraction) const; |
| 46 | |
| 47 | /** Returns a sample at the specified index. Returns last available sample if index is out of range. */ |
| 48 | const float* getSample(uint32_t idx) const; |
| 49 | |
| 50 | private: |
| 51 | Vector<float> mValues; |
| 52 | uint32_t mSampleSize; |
| 53 | uint32_t mNumSamples; |
| 54 | float mTimeStart; |
| 55 | float mTimeScale; |
| 56 | }; |
| 57 | |
| 58 | /** @} */ |
| 59 | } |