MegaSpherify.cs 1.9 KB

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