CurveTimeline.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. using System;
  2. using System.Collections.Generic;
  3. namespace Spine
  4. {
  5. public abstract class CurveTimeline : Timeline
  6. {
  7. public CurveTimeline(int frameCount)
  8. {
  9. this.curves = new float[(frameCount - 1) * 19];
  10. }
  11. public int FrameCount
  12. {
  13. get
  14. {
  15. return this.curves.Length / 19 + 1;
  16. }
  17. }
  18. public abstract void Apply(Skeleton skeleton, float lastTime, float time, List<Event> firedEvents, float alpha);
  19. public void SetLinear(int frameIndex)
  20. {
  21. this.curves[frameIndex * 19] = 0f;
  22. }
  23. public void SetStepped(int frameIndex)
  24. {
  25. this.curves[frameIndex * 19] = 1f;
  26. }
  27. public void SetCurve(int frameIndex, float cx1, float cy1, float cx2, float cy2)
  28. {
  29. float num = 0.1f;
  30. float num2 = num * num;
  31. float num3 = num2 * num;
  32. float num4 = 3f * num;
  33. float num5 = 3f * num2;
  34. float num6 = 6f * num2;
  35. float num7 = 6f * num3;
  36. float num8 = -cx1 * 2f + cx2;
  37. float num9 = -cy1 * 2f + cy2;
  38. float num10 = (cx1 - cx2) * 3f + 1f;
  39. float num11 = (cy1 - cy2) * 3f + 1f;
  40. float num12 = cx1 * num4 + num8 * num5 + num10 * num3;
  41. float num13 = cy1 * num4 + num9 * num5 + num11 * num3;
  42. float num14 = num8 * num6 + num10 * num7;
  43. float num15 = num9 * num6 + num11 * num7;
  44. float num16 = num10 * num7;
  45. float num17 = num11 * num7;
  46. int i = frameIndex * 19;
  47. float[] array = this.curves;
  48. array[i++] = 2f;
  49. float num18 = num12;
  50. float num19 = num13;
  51. int num20 = i + 19 - 1;
  52. while (i < num20)
  53. {
  54. array[i] = num18;
  55. array[i + 1] = num19;
  56. num12 += num14;
  57. num13 += num15;
  58. num14 += num16;
  59. num15 += num17;
  60. num18 += num12;
  61. num19 += num13;
  62. i += 2;
  63. }
  64. }
  65. public float GetCurvePercent(int frameIndex, float percent)
  66. {
  67. float[] array = this.curves;
  68. int i = frameIndex * 19;
  69. float num = array[i];
  70. if (num == 0f)
  71. {
  72. return percent;
  73. }
  74. if (num == 1f)
  75. {
  76. return 0f;
  77. }
  78. i++;
  79. float num2 = 0f;
  80. int num3 = i;
  81. int num4 = i + 19 - 1;
  82. while (i < num4)
  83. {
  84. num2 = array[i];
  85. if (num2 >= percent)
  86. {
  87. float num5;
  88. float num6;
  89. if (i == num3)
  90. {
  91. num5 = 0f;
  92. num6 = 0f;
  93. }
  94. else
  95. {
  96. num5 = array[i - 2];
  97. num6 = array[i - 1];
  98. }
  99. return num6 + (array[i + 1] - num6) * (percent - num5) / (num2 - num5);
  100. }
  101. i += 2;
  102. }
  103. float num7 = array[i - 1];
  104. return num7 + (1f - num7) * (percent - num2) / (1f - num2);
  105. }
  106. public float GetCurveType(int frameIndex)
  107. {
  108. return this.curves[frameIndex * 19];
  109. }
  110. protected const float LINEAR = 0f;
  111. protected const float STEPPED = 1f;
  112. protected const float BEZIER = 2f;
  113. protected const int BEZIER_SEGMENTS = 10;
  114. protected const int BEZIER_SIZE = 19;
  115. private float[] curves;
  116. }
  117. }