MegaPageFlip.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. using UnityEngine;
  2. [AddComponentMenu("Modifiers/Page Flip")]
  3. public class MegaPageFlip : MegaModifier
  4. {
  5. public bool animT = false;
  6. public bool autoMode = true;
  7. public bool lockRho = true;
  8. public bool lockTheta = true;
  9. public float timeStep = 0.01f;
  10. public float rho = 0.0f;
  11. public float theta = 0.0f;
  12. public float deltaT = 0.0f;
  13. public float kT = 1.0f;
  14. public float turn = 0.0f;
  15. public float ap1 = -15.0f;
  16. public float ap2 = -2.5f;
  17. public float ap3 = -3.5f;
  18. public bool flipx = true;
  19. //Vector2 _pageSize;
  20. Vector3 apex = new Vector3(0.0f, 0.0f, -3.0f);
  21. Vector3 _cornerP;
  22. Vector3 _pageOrigin;
  23. float fx = 1.0f;
  24. public void calcAuto(float t)
  25. {
  26. float num = 90.0f * Mathf.Deg2Rad;
  27. if ( t == 0.0f )
  28. {
  29. rho = 0.0f;
  30. theta = num;
  31. apex.z = ap1; //-15.0f;
  32. }
  33. else
  34. {
  35. float num2;
  36. float num3;
  37. float num4;
  38. if ( t <= 0.15f )
  39. {
  40. num2 = t / 0.15f;
  41. num3 = Mathf.Sin((Mathf.PI * Mathf.Pow(num2, 0.05f)) / 2.0f);
  42. num4 = Mathf.Sin((Mathf.PI * Mathf.Pow(num2, 0.5f)) / 2.0f);
  43. rho = t * 180.0f;
  44. theta = funcLinear(num3, 90.0f * Mathf.Deg2Rad, 8.0f * Mathf.Deg2Rad);
  45. apex.z = funcLinear(num4, ap1, ap2); //-15.0f, -2.5f);
  46. }
  47. else
  48. {
  49. if ( t <= 0.4f )
  50. {
  51. num2 = (t - 0.15f) / 0.25f;
  52. rho = t * 180f;
  53. theta = funcLinear(num2, 8.0f * Mathf.Deg2Rad, 6.0f * Mathf.Deg2Rad);
  54. apex.z = funcLinear(num2, ap2, ap3); //-2.5f, -3.5f);
  55. }
  56. else
  57. {
  58. if ( t <= 1.0f )
  59. {
  60. num2 = (t - 0.4f) / 0.6f;
  61. rho = t * 180.0f;
  62. num3 = Mathf.Sin((Mathf.PI * Mathf.Pow(num2, 10.0f)) / 2.0f);
  63. num4 = Mathf.Sin((Mathf.PI * Mathf.Pow(num2, 2.0f)) / 2.0f);
  64. theta = funcLinear(num3, 6.0f * Mathf.Deg2Rad, 90.0f * Mathf.Deg2Rad);
  65. apex.z = funcLinear(num4, ap3, ap1); //-3.5f, -15.0f);
  66. }
  67. }
  68. }
  69. }
  70. }
  71. public float calcTheta(float _rho)
  72. {
  73. int num = 0;
  74. float num2 = 1.0f;
  75. float num3 = 0.05f;
  76. float num4 = 90.0f * Mathf.Deg2Rad;
  77. float num5 = (num2 - num3) * num4;
  78. float num6 = _rho / 180.0f;
  79. if ( num6 < 0.25f )
  80. num = (int)(num6 / 0.25f);
  81. else
  82. {
  83. if ( num6 < 0.5f )
  84. num = 1;
  85. else
  86. {
  87. if ( num6 <= 1.0f )
  88. num = (int)((1.0f - num6) * 0.5f);
  89. }
  90. }
  91. return (num4 - (num * num5));
  92. }
  93. public float calcTheta2(float t)
  94. {
  95. float num = 0.1f;
  96. float num2 = 45.0f * Mathf.Deg2Rad;
  97. float num3 = Mathf.Abs(1.0f - (t * 2.0f));
  98. return ((num * num2) + (num3 * num2));
  99. }
  100. public Vector3 curlTurn(Vector3 p)
  101. {
  102. float rhs = Mathf.Sqrt((p.x * p.x) + Mathf.Pow((p.z - apex.z), 2.0f));
  103. float num2 = rhs * Mathf.Sin(theta);
  104. float f = Mathf.Asin(p.x / rhs) / Mathf.Sin(theta);
  105. p.x = num2 * Mathf.Sin(f);
  106. p.z = (rhs + apex.z) - ((num2 * (1.0f - Mathf.Cos(f))) * Mathf.Sin(theta));
  107. p.y = (num2 * (1.0f - Mathf.Cos(f))) * Mathf.Cos(theta);
  108. return p;
  109. }
  110. #if false
  111. public Vector3 flatTurn(Vector3 p)
  112. {
  113. theta = (deltaT * Mathf.PI) * 2.0f;
  114. float rhs = p.x / _pageSize.x;
  115. p.x = Mathf.Cos(theta) * rhs * _pageSize.x;
  116. p.y = Mathf.Sin(theta) * rhs * _pageSize.x;
  117. return p;
  118. }
  119. #endif
  120. public float funcLinear(float ft, float f0, float f1)
  121. {
  122. return (f0 + ((f1 - f0) * ft));
  123. }
  124. public float funcQuad(float ft, float f0, float f1, float p)
  125. {
  126. return (f0 + ((f1 - f0) * Mathf.Pow(ft, p)));
  127. }
  128. public override string ModName() { return "PageFlip"; }
  129. public override string GetHelpURL() { return "?page_id=271"; }
  130. public Vector3 flatTurn1(Vector3 p)
  131. {
  132. float rhs = p.x;
  133. p.x = Mathf.Cos(rho * Mathf.Deg2Rad) * rhs;
  134. p.y = Mathf.Sin(rho * Mathf.Deg2Rad) * -rhs;
  135. return p;
  136. }
  137. public Vector3 rotpage(Vector3 p)
  138. {
  139. float x = p.x;
  140. float y = p.y;
  141. p.x = Mathf.Cos(rho * Mathf.Deg2Rad) * x + Mathf.Sin(rho * Mathf.Deg2Rad) * y;
  142. p.y = Mathf.Sin(rho * Mathf.Deg2Rad) * -x + Mathf.Cos(rho * Mathf.Deg2Rad) * y;
  143. return p;
  144. }
  145. public override Vector3 Map(int i, Vector3 p)
  146. {
  147. p = tm.MultiplyPoint3x4(p);
  148. p = curlTurn(p);
  149. p.x *= fx;
  150. p = rotpage(p);
  151. p.x *= fx;
  152. return invtm.MultiplyPoint3x4(p);
  153. }
  154. public override bool ModLateUpdate(MegaModContext mc)
  155. {
  156. return Prepare(mc);
  157. }
  158. public override bool Prepare(MegaModContext mc)
  159. {
  160. if ( flipx )
  161. fx = -1.0f;
  162. else
  163. fx = 1.0f;
  164. theta = 15.0f * Mathf.Deg2Rad;
  165. if ( turn < 0.0f )
  166. turn = 0.0f;
  167. if ( turn > 100.0f )
  168. turn = 100.0f;
  169. deltaT = turn / 100.0f;
  170. if ( animT )
  171. deltaT = (kT * Time.time) % 1.0f;
  172. if ( autoMode )
  173. calcAuto(deltaT);
  174. return true;
  175. }
  176. }