MegaSkew.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. using UnityEngine;
  2. [AddComponentMenu("Modifiers/Skew")]
  3. public class MegaSkew : MegaModifier
  4. {
  5. public float amount = 0.0f;
  6. public bool doRegion = false;
  7. public float to = 0.0f;
  8. public float from = 0.0f;
  9. public float dir = 0.0f;
  10. public MegaAxis axis = MegaAxis.X;
  11. Matrix4x4 mat = new Matrix4x4();
  12. float amountOverLength = 0.0f;
  13. public override string ModName() { return "Skew"; }
  14. public override string GetHelpURL() { return "?page_id=319"; }
  15. public override Vector3 Map(int i, Vector3 p)
  16. {
  17. p = tm.MultiplyPoint3x4(p);
  18. float z = p.y;
  19. if ( doRegion )
  20. {
  21. if ( p.y < from )
  22. z = from;
  23. else
  24. if ( p.y > to )
  25. z = to;
  26. }
  27. p.x -= z * amountOverLength;
  28. return invtm.MultiplyPoint3x4(p);
  29. }
  30. public override bool ModLateUpdate(MegaModContext mc)
  31. {
  32. return Prepare(mc);
  33. }
  34. public override bool Prepare(MegaModContext mc)
  35. {
  36. if ( from > 0.0f )
  37. from = 0.0f;
  38. if ( to < 0.0f )
  39. to = 0.0f;
  40. mat = Matrix4x4.identity;
  41. switch ( axis )
  42. {
  43. case MegaAxis.X: MegaMatrix.RotateZ(ref mat, Mathf.PI * 0.5f); break;
  44. case MegaAxis.Y: MegaMatrix.RotateX(ref mat, -Mathf.PI * 0.5f); break;
  45. case MegaAxis.Z: break;
  46. }
  47. MegaMatrix.RotateY(ref mat, Mathf.Deg2Rad * dir);
  48. SetAxis(mat);
  49. float len = 0.0f;
  50. if ( !doRegion )
  51. {
  52. switch ( axis )
  53. {
  54. case MegaAxis.X: len = bbox.max.x - bbox.min.x; break;
  55. case MegaAxis.Z: len = bbox.max.y - bbox.min.y; break;
  56. case MegaAxis.Y: len = bbox.max.z - bbox.min.z; break;
  57. }
  58. }
  59. else
  60. len = to - from;
  61. if ( len == 0.0f )
  62. len = 0.000001f;
  63. amountOverLength = amount / len;
  64. return true;
  65. }
  66. public override void ExtraGizmo(MegaModContext mc)
  67. {
  68. if ( doRegion )
  69. DrawFromTo(axis, from, to, mc);
  70. }
  71. }