MegaSqueeze.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. using UnityEngine;
  2. [AddComponentMenu("Modifiers/Squeeze")]
  3. public class MegaSqueeze : MegaModifier
  4. {
  5. public float amount = 0.0f;
  6. public float crv = 0.0f;
  7. public float radialamount = 0.0f;
  8. public float radialcrv = 0.0f;
  9. public bool doRegion = false;
  10. public float to = 0.0f;
  11. public float from = 0.0f;
  12. public MegaAxis axis = MegaAxis.Y;
  13. Matrix4x4 mat = new Matrix4x4();
  14. float k1;
  15. float k2;
  16. float k3;
  17. float k4;
  18. float l;
  19. float l2;
  20. float ovl;
  21. float ovl2;
  22. void SetK(float K1, float K2, float K3, float K4)
  23. {
  24. k1 = K1;
  25. k2 = K2;
  26. k3 = K3;
  27. k4 = K4;
  28. }
  29. public override string ModName() { return "Squeeze"; }
  30. public override string GetHelpURL() { return "?page_id=338"; }
  31. public override Vector3 Map(int i, Vector3 p)
  32. {
  33. float z;
  34. p = tm.MultiplyPoint3x4(p);
  35. if ( l != 0.0f )
  36. {
  37. if ( doRegion )
  38. {
  39. if ( p.y < from )
  40. z = from * ovl;
  41. else
  42. {
  43. if ( p.y > to )
  44. z = to * ovl;
  45. else
  46. z = p.y * ovl;
  47. }
  48. }
  49. else
  50. z = Mathf.Abs(p.y * ovl);
  51. float f = 1.0f + z * k1 + k2 * z * (1.0f - z);
  52. p.y *= f;
  53. }
  54. if ( l2 != 0.0f )
  55. {
  56. float dist = Mathf.Sqrt(p.x * p.x + p.z * p.z);
  57. float xy = dist * ovl2;
  58. float f1 = 1.0f + xy * k3 + k4 * xy * (1.0f - xy);
  59. p.x *= f1;
  60. p.z *= f1;
  61. }
  62. return invtm.MultiplyPoint3x4(p);
  63. }
  64. public override bool ModLateUpdate(MegaModContext mc)
  65. {
  66. return Prepare(mc);
  67. }
  68. public override bool Prepare(MegaModContext mc)
  69. {
  70. mat = Matrix4x4.identity;
  71. SetAxis(mat);
  72. SetK(amount, crv, radialamount, radialcrv);
  73. Vector3 size = bbox.Size();
  74. switch ( axis )
  75. {
  76. case MegaAxis.X:
  77. l = size[0]; //bbox.max[1] - bbox.min[1];
  78. l2 = Mathf.Sqrt(size[1] * size[1] + size[2] * size[2]);
  79. break;
  80. case MegaAxis.Y:
  81. l = size[1]; //bbox.max[1] - bbox.min[1];
  82. l2 = Mathf.Sqrt(size[0] * size[0] + size[2] * size[2]);
  83. break;
  84. case MegaAxis.Z:
  85. l = size[2]; //bbox.max[1] - bbox.min[1];
  86. l2 = Mathf.Sqrt(size[1] * size[1] + size[0] * size[0]);
  87. break;
  88. }
  89. if ( l != 0.0f )
  90. ovl = 1.0f / l;
  91. if ( l2 != 0.0f )
  92. ovl2 = 1.0f / l2;
  93. return true;
  94. }
  95. public override void ExtraGizmo(MegaModContext mc)
  96. {
  97. if ( doRegion )
  98. DrawFromTo(MegaAxis.Z, from, to, mc);
  99. }
  100. }