Interpolator.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. /******************************************************************************
  2. Use 'InterpolatorTime' to calculate time step fraction between sequentially received data.
  3. Use 'AngularInterpolator' to calculate linear interpolation between sequentially received angle values.
  4. Use 'LinearInterpolator' to calculate linear interpolation between sequentially received values.
  5. Use 'SplineInterpolator' to calculate spline interpolation between sequentially received values.
  6. One 'InterpolatorTime' can be paired with one or more value interpolators ('AngularInterpolator', 'LinearInterpolator', 'SplineInterpolator')
  7. It can be used like this:
  8. Define interpolator variables:
  9. InterpolatorTime time_interp ; // 'time_interp' time interpolator paired with 'player_angle' and 'player_pos'
  10. InterpolatorA player_angle; // linear angular interpolation
  11. Interpolator3 player_pos ; // linear 3D position interpolation
  12. Game loop:
  13. {
  14. // process received data from the network
  15. for(; received_data; )
  16. {
  17. InterpolatorTemp temp; // some helper temporary data
  18. // !! 'add' of 'InterpolatorTime' must be called first !!
  19. time_interp.add(received_data.duration, temp);
  20. // now call 'add' for value interpolators with the same 'temp'
  21. player_angle .add(received_data.angle , temp);
  22. player_position.add(received_data.position, temp);
  23. }
  24. // update interpolators once per frame
  25. InterpolatorTemp temp; // some helper temporary data
  26. // !! 'update' of 'InterpolatorTime' must be called first !!
  27. time_interp.update(duration, temp);
  28. // now call 'update' for value interpolators with the same 'temp'
  29. player_angle .update(temp);
  30. player_position.update(temp);
  31. }
  32. /******************************************************************************/
  33. struct InterpolatorTime
  34. {
  35. Bool is()C {return _elms!=0;} // if have any value
  36. // operations
  37. void add (Flt duration, InterpolatorTemp &temp); // call this method when received new data !! before calling 'add' method of other classes ('AngularInterpolator', 'LinearInterpolator', 'SplineInterpolator') !! 'duration'=for how long this data should be valid
  38. void update( InterpolatorTemp &temp); // call this method once per frame !! before calling 'update' method of other classes ('AngularInterpolator', 'LinearInterpolator', 'SplineInterpolator') !!
  39. InterpolatorTime& reset(); // reset to initial settings
  40. InterpolatorTime() {reset();}
  41. #if !EE_PRIVATE
  42. private:
  43. #endif
  44. Byte _elms, _count;
  45. Flt _time, _cur_duration, _next_duration, _left;
  46. };
  47. /******************************************************************************/
  48. T1(TYPE) struct AngularInterpolator
  49. {
  50. // get
  51. C TYPE& operator()()C {return _value;} // get current value
  52. // operations
  53. void add (C TYPE &value, C InterpolatorTemp &temp); // call this method when received new data !! after calling 'InterpolatorTime.add' with the same 'temp' !!, 'value'=received data value
  54. void update( C InterpolatorTemp &temp); // call this method once per frame !! after calling 'InterpolatorTime.update' with the same 'temp' !!
  55. AngularInterpolator();
  56. #if !EE_PRIVATE
  57. private:
  58. #endif
  59. TYPE _value, _prev, _cur, _next;
  60. };
  61. /******************************************************************************/
  62. T1(TYPE) struct LinearInterpolator
  63. {
  64. // get
  65. C TYPE& operator()()C {return _value;} // get current value
  66. // operations
  67. void add (C TYPE &value, C InterpolatorTemp &temp); // call this method when received new data !! after calling 'InterpolatorTime.add' with the same 'temp' !!, 'value'=received data value
  68. void update( C InterpolatorTemp &temp); // call this method once per frame !! after calling 'InterpolatorTime.update' with the same 'temp' !!
  69. LinearInterpolator();
  70. #if !EE_PRIVATE
  71. private:
  72. #endif
  73. TYPE _value, _prev, _cur, _next;
  74. };
  75. /******************************************************************************/
  76. T1(TYPE) struct SplineInterpolator
  77. {
  78. // get
  79. C TYPE& operator()()C {return _value;} // get current value
  80. // operations
  81. void add (C TYPE &value, C InterpolatorTemp &temp); // call this method when received new data !! after calling 'InterpolatorTime.add' with the same 'temp' !!, 'value'=received data value
  82. void update( C InterpolatorTemp &temp); // call this method once per frame !! after calling 'InterpolatorTime.update' with the same 'temp' !!
  83. SplineInterpolator();
  84. #if !EE_PRIVATE
  85. private:
  86. #endif
  87. TYPE _value, _prev2, _prev, _cur, _next;
  88. };
  89. /******************************************************************************/
  90. struct InterpolatorTemp
  91. {
  92. Byte op;
  93. Flt frac;
  94. };
  95. /******************************************************************************/
  96. typedef AngularInterpolator<Flt> InterpolatorA;
  97. typedef LinearInterpolator<Flt > Interpolator1;
  98. typedef LinearInterpolator<Vec2> Interpolator2;
  99. typedef LinearInterpolator<Vec > Interpolator3;
  100. typedef LinearInterpolator<Vec4> Interpolator4;
  101. typedef SplineInterpolator<Flt > Interpolator1S;
  102. typedef SplineInterpolator<Vec2> Interpolator2S;
  103. typedef SplineInterpolator<Vec > Interpolator3S;
  104. typedef SplineInterpolator<Vec4> Interpolator4S;
  105. /******************************************************************************/