Changeset 2454


Ignore:
Timestamp:
Feb 19, 2013, 5:45:40 PM (6 years ago)
Author:
sam
Message:

math: replace Interp with TimeInterp. We'll see how useful it gets.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/lol/math/interp.h

    r2444 r2454  
    2020{
    2121
    22 template<typename T, int N = 16> class Interp
     22template<typename T, int N = 16> class TimeInterp
    2323{
    2424public:
    25     inline Interp() : m_pos(-N) {}
    26     inline ~Interp() {}
     25    inline TimeInterp()
     26      : m_precision(0.f),
     27        m_accum(0.f),
     28        m_pos(-N)
     29    {}
    2730
    28     void Set(float key, T const &val)
     31    inline ~TimeInterp() {}
     32
     33    void SetPrecision(float seconds)
    2934    {
     35        m_precision = seconds;
     36    }
     37
     38    void Set(float seconds, T const &val)
     39    {
     40        m_accum += seconds;
     41        if (m_accum < m_precision)
     42            return;
     43        m_accum = 0.f;
     44
    3045        if (m_pos < 0)
    3146        {
    32             m_key[m_pos + N] = key;
     47            if (m_pos > -N)
     48                seconds += m_key[m_pos + N - 1];
     49            m_key[m_pos + N] = seconds;
    3350            m_val[m_pos + N] = val;
    3451            ++m_pos;
     
    3653        else
    3754        {
    38             m_key[m_pos] = key;
     55            if (m_pos > 0)
     56                seconds += m_key[m_pos - 1];
     57            m_key[m_pos] = seconds;
    3958            m_val[m_pos] = val;
    4059            m_pos = (m_pos + 1) % N;
     
    4261    }
    4362
    44     T Get(float key)
     63    T Get(float seconds)
    4564    {
    4665        if (m_pos == -N)
     
    4867        if (m_pos == 1 - N)
    4968            return m_val[0];
     69
     70        seconds += m_accum;
    5071
    5172        int start = max(0, m_pos);
     
    5677        {
    5778            int c = (a + b) / 2;
    58             if (m_key[(start + c) % N] >= key)
     79            if (GetTime((start + c) % N) >= seconds)
    5980                b = c;
    6081            else
     
    6283        }
    6384
    64         float ka = m_key[(start + a) % N];
    65         float kb = m_key[(start + b) % N];
    66         float u = (key - ka) / (kb - ka);
     85        float ka = GetTime((start + a) % N);
     86        float kb = GetTime((start + b) % N);
     87        float u = (seconds - ka) / (kb - ka);
    6788
    6889        return (1.f - u) * m_val[(start + a) % N] + u * m_val[(start + b) % N];
     
    7596
    7697private:
     98    inline float GetTime(int i)
     99    {
     100        float k = m_key[i % N];
     101        if (m_pos >= 0 && i >= m_pos)
     102            k -= m_key[N - 1];
     103        if (m_pos != 0)
     104            k -= m_key[(m_pos + N - 1) % N];
     105        return k;
     106    }
     107
    77108    float m_key[N];
    78109    T m_val[N];
     110
     111    float m_precision, m_accum;
    79112
    80113    /* If m_pos < 0, the value indicates how many free slots
  • trunk/test/unit/interp.cpp

    r2432 r2454  
    2525    void TearDown() {}
    2626
    27     LOLUNIT_TEST(FloatInterp)
     27    LOLUNIT_TEST(TimeInterpTest)
    2828    {
    29         Interp<float> interp;
     29        TimeInterp<float> ti;
    3030
    31         interp.Set(1.f, 100.f);
    32         interp.Set(2.f, 150.f);
     31        ti.Set(1.f, 10.f);
     32        ti.Set(1.f, 20.f);
     33        ti.Set(1.f, 30.f);
    3334
    34         LOLUNIT_ASSERT_DOUBLES_EQUAL(75.f, interp.Get(0.5f), 1.e-5f);
    35         LOLUNIT_ASSERT_DOUBLES_EQUAL(125.f, interp.Get(1.5f), 1.e-5f);
    36         LOLUNIT_ASSERT_DOUBLES_EQUAL(175.f, interp.Get(2.5f), 1.e-5f);
     35        LOLUNIT_ASSERT_DOUBLES_EQUAL(0.f, ti.Get(-3.0f), 1.e-5f);
     36        LOLUNIT_ASSERT_DOUBLES_EQUAL(10.f, ti.Get(-2.0f), 1.e-5f);
     37        LOLUNIT_ASSERT_DOUBLES_EQUAL(20.f, ti.Get(-1.0f), 1.e-5f);
     38        LOLUNIT_ASSERT_DOUBLES_EQUAL(30.f, ti.Get(0.0f), 1.e-5f);
     39        LOLUNIT_ASSERT_DOUBLES_EQUAL(40.f, ti.Get(1.0f), 1.e-5f);
    3740    }
    3841};
Note: See TracChangeset for help on using the changeset viewer.