MegaBulge.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. using UnityEngine;
  2. [AddComponentMenu("Modifiers/Bulge")]
  3. public class MegaBulge : MegaModifier
  4. {
  5. public Vector3 Amount = Vector3.zero;
  6. public Vector3 FallOff = Vector3.zero;
  7. public bool LinkFallOff = true;
  8. Vector3 per = Vector3.zero;
  9. float xsize;
  10. float ysize;
  11. float zsize;
  12. float size;
  13. float cx,cy,cz;
  14. Vector3 dcy = Vector3.zero;
  15. public override string ModName() { return "Bulge"; }
  16. public override string GetHelpURL() { return "?page_id=163"; }
  17. public override Vector3 Map(int i, Vector3 p)
  18. {
  19. p = tm.MultiplyPoint3x4(p);
  20. float xw,yw,zw;
  21. xw = p.x - cx; yw = p.y - cy; zw = p.z - cz;
  22. if ( xw == 0.0f && yw == 0.0f && zw == 0.0f )
  23. xw = yw = zw = 1.0f;
  24. float vdist = Mathf.Sqrt(xw * xw + yw * yw + zw * zw);
  25. float mfac = size / vdist;
  26. dcy.x = Mathf.Exp(-FallOff.x * Mathf.Abs(xw));
  27. if ( !LinkFallOff )
  28. {
  29. dcy.y = Mathf.Exp(-FallOff.y * Mathf.Abs(yw));
  30. dcy.z = Mathf.Exp(-FallOff.z * Mathf.Abs(zw));
  31. }
  32. else
  33. {
  34. dcy.y = dcy.z = dcy.x;
  35. }
  36. p.x = cx + xw + (Mathf.Sign(xw) * ((Mathf.Abs(xw * mfac) - Mathf.Abs(xw)) * per.x) * dcy.x);
  37. p.y = cy + yw + (Mathf.Sign(yw) * ((Mathf.Abs(yw * mfac) - Mathf.Abs(yw)) * per.y) * dcy.y);
  38. p.z = cz + zw + (Mathf.Sign(zw) * ((Mathf.Abs(zw * mfac) - Mathf.Abs(zw)) * per.z) * dcy.z);
  39. return invtm.MultiplyPoint3x4(p);
  40. }
  41. public override void ModStart(MegaModifiers mc)
  42. {
  43. xsize = bbox.max.x - bbox.min.x;
  44. ysize = bbox.max.y - bbox.min.y;
  45. zsize = bbox.max.z - bbox.min.z;
  46. size = (xsize > ysize) ? xsize : ysize;
  47. size = (zsize > size) ? zsize : size;
  48. size /= 2.0f;
  49. cx = bbox.center.x;
  50. cy = bbox.center.y;
  51. cz = bbox.center.z;
  52. // Get the percentage to spherify at this time
  53. per = Amount / 100.0f;
  54. }
  55. public override bool ModLateUpdate(MegaModContext mc)
  56. {
  57. return Prepare(mc);
  58. }
  59. public override bool Prepare(MegaModContext mc)
  60. {
  61. xsize = bbox.max.x - bbox.min.x;
  62. ysize = bbox.max.y - bbox.min.y;
  63. zsize = bbox.max.z - bbox.min.z;
  64. size = (xsize > ysize) ? xsize : ysize;
  65. size = (zsize > size) ? zsize : size;
  66. size /= 2.0f;
  67. cx = bbox.center.x;
  68. cy = bbox.center.y;
  69. cz = bbox.center.z;
  70. // Get the percentage to spherify at this time
  71. per = Amount / 100.0f;
  72. return true;
  73. }
  74. }