MegaBezFloatKeyControl.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. using UnityEngine;
  2. using System.IO;
  3. [System.Serializable]
  4. public class MegaBezFloatKey
  5. {
  6. public float val;
  7. public float intan;
  8. public float outtan;
  9. public float intanx;
  10. public float outtanx;
  11. public float coef0;
  12. public float coef1;
  13. public float coef2;
  14. public float coef3;
  15. }
  16. [System.Serializable]
  17. public class MegaBezFloatKeyControl : MegaControl
  18. {
  19. public MegaBezFloatKey[] Keys;
  20. private const float SCALE = 4800.0f;
  21. public float f;
  22. public void InitKeys()
  23. {
  24. for ( int i = 0; i < Keys.Length - 1; i++ )
  25. {
  26. float dt = Times[i + 1] - Times[i];
  27. float hout = Keys[i].val + (Keys[i].outtan * SCALE) * (dt / 3.0f);
  28. float hin = Keys[i + 1].val + (Keys[i + 1].intan * SCALE) * (dt / 3.0f);
  29. Keys[i].coef1 = Keys[i + 1].val + 3.0f * (hout - hin) - Keys[i].val;
  30. Keys[i].coef2 = 3.0f * (hin - 2.0f * hout + Keys[i].val);
  31. Keys[i].coef3 = 3.0f * (hout - Keys[i].val);
  32. }
  33. }
  34. public void InitKeys(float scale)
  35. {
  36. for ( int i = 0; i < Keys.Length - 1; i++ )
  37. {
  38. float dt = Times[i + 1] - Times[i];
  39. float hout = Keys[i].val + (Keys[i].outtan * scale) * (dt / 3.0f);
  40. float hin = Keys[i + 1].val + (Keys[i + 1].intan * scale) * (dt / 3.0f);
  41. Keys[i].coef1 = Keys[i + 1].val + 3.0f * (hout - hin) - Keys[i].val;
  42. Keys[i].coef2 = 3.0f * (hin - 2.0f * hout + Keys[i].val);
  43. Keys[i].coef3 = 3.0f * (hout - Keys[i].val);
  44. }
  45. }
  46. public void InitKeysMaya()
  47. {
  48. for ( int i = 0; i < Keys.Length - 1; i++ )
  49. {
  50. float x0 = Times[i];
  51. float x1 = Times[i] + Keys[i].outtanx;
  52. float x2 = Times[i + 1] - Keys[i + 1].intanx;
  53. float x3 = Times[i + 1];
  54. float y0 = Keys[i].val;
  55. float y1 = Keys[i].val + Keys[i].outtan;
  56. float y2 = Keys[i + 1].val - Keys[i + 1].intan;
  57. float y3 = Keys[i + 1].val;
  58. float dx = x3 - x0;
  59. float dy = y3 - y0;
  60. float tan_x = x1 - x0;
  61. float m1 = 0.0f;
  62. float m2 = 0.0f;
  63. if ( tan_x != 0.0f )
  64. m1 = (y1 - y0) / tan_x;
  65. tan_x = x3 - x2;
  66. if ( tan_x != 0.0f )
  67. m2 = (y3 - y2) / tan_x;
  68. float length = 1.0f / (dx * dx);
  69. float d1 = dx * m1;
  70. float d2 = dx * m2;
  71. Keys[i].coef0 = (d1 + d2 - dy - dy) * length / dx;
  72. Keys[i].coef1 = (dy + dy + dy - d1 - d1 - d2) * length;
  73. Keys[i].coef2 = m1;
  74. Keys[i].coef3 = y0;
  75. }
  76. }
  77. public float GetHermiteFloat(float tt)
  78. {
  79. if ( Times.Length == 1 )
  80. return Keys[0].val;
  81. int key = GetKey(tt);
  82. float t = Mathf.Clamp01((tt - Times[key]) / (Times[key + 1] - Times[key]));
  83. t = Mathf.Lerp(Times[key], Times[key + 1], t) - Times[key];
  84. return (t * (t * (t * Keys[key].coef0 + Keys[key].coef1) + Keys[key].coef2) + Keys[key].coef3);
  85. }
  86. public void MakeKey(MegaBezFloatKey key, Vector2 pco, Vector2 pleft, Vector2 pright, Vector2 co, Vector2 left, Vector2 right)
  87. {
  88. float f1 = pco.y * 100.0f;
  89. float f2 = pright.y * 100.0f;
  90. float f3 = left.y * 100.0f;
  91. float f4 = co.y * 100.0f;
  92. key.val = f1;
  93. key.coef3 = 3.0f * (f2 - f1);
  94. key.coef2 = 3.0f * (f1 - 2.0f * f2 + f3);
  95. key.coef1 = f4 - f1 + 3.0f * (f2 - f3);
  96. }
  97. public void Interp(float alpha, int key)
  98. {
  99. if ( alpha == 0.0f )
  100. f = Keys[key].val;
  101. else
  102. {
  103. if ( alpha == 1.0f )
  104. f = Keys[key + 1].val;
  105. else
  106. {
  107. float tp2 = alpha * alpha;
  108. float tp3 = tp2 * alpha;
  109. f = Keys[key].coef1 * tp3 + Keys[key].coef2 * tp2 + Keys[key].coef3 * alpha + Keys[key].val;
  110. }
  111. }
  112. }
  113. public override float GetFloat(float t)
  114. {
  115. if ( Times.Length == 1 )
  116. {
  117. return Keys[0].val;
  118. }
  119. int key = GetKey(t);
  120. float alpha = (t - Times[key]) / (Times[key + 1] - Times[key]);
  121. if ( alpha < 0.0f )
  122. alpha = 0.0f;
  123. else
  124. {
  125. if ( alpha > 1.0f )
  126. alpha = 1.0f;
  127. }
  128. // Do ease and hermite here maybe
  129. Interp(alpha, key);
  130. lastkey = key;
  131. lasttime = t;
  132. return f;
  133. }
  134. }