MegaTaper.cs 2.2 KB

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