using UnityEngine; [AddComponentMenu("Modifiers/Bulge")] public class MegaBulge : MegaModifier { public Vector3 Amount = Vector3.zero; public Vector3 FallOff = Vector3.zero; public bool LinkFallOff = true; private Vector3 per = Vector3.zero; private float xsize; private float ysize; private float zsize; private float size; private float cx; private float cy; private float cz; private Vector3 dcy = Vector3.zero; public override string ModName() { return "Bulge"; } public override string GetHelpURL() { return "?page_id=163"; } public override Vector3 Map(int i, Vector3 p) { p = tm.MultiplyPoint3x4(p); float num = p.x - cx; float num2 = p.y - cy; float num3 = p.z - cz; if (num == 0f && num2 == 0f && num3 == 0f) { num = (num2 = (num3 = 1f)); } float num4 = Mathf.Sqrt(num * num + num2 * num2 + num3 * num3); float num5 = size / num4; dcy.x = Mathf.Exp((0f - FallOff.x) * Mathf.Abs(num)); if (!LinkFallOff) { dcy.y = Mathf.Exp((0f - FallOff.y) * Mathf.Abs(num2)); dcy.z = Mathf.Exp((0f - FallOff.z) * Mathf.Abs(num3)); } else { dcy.y = (dcy.z = dcy.x); } p.x = cx + num + Mathf.Sign(num) * ((Mathf.Abs(num * num5) - Mathf.Abs(num)) * per.x) * dcy.x; p.y = cy + num2 + Mathf.Sign(num2) * ((Mathf.Abs(num2 * num5) - Mathf.Abs(num2)) * per.y) * dcy.y; p.z = cz + num3 + Mathf.Sign(num3) * ((Mathf.Abs(num3 * num5) - Mathf.Abs(num3)) * per.z) * dcy.z; return invtm.MultiplyPoint3x4(p); } public override void ModStart(MegaModifiers mc) { xsize = bbox.max.x - bbox.min.x; ysize = bbox.max.y - bbox.min.y; zsize = bbox.max.z - bbox.min.z; size = ((!(xsize > ysize)) ? ysize : xsize); size = ((!(zsize > size)) ? size : zsize); size /= 2f; cx = bbox.center.x; cy = bbox.center.y; cz = bbox.center.z; per = Amount / 100f; } public override bool ModLateUpdate(MegaModContext mc) { return Prepare(mc); } public override bool Prepare(MegaModContext mc) { xsize = bbox.max.x - bbox.min.x; ysize = bbox.max.y - bbox.min.y; zsize = bbox.max.z - bbox.min.z; size = ((!(xsize > ysize)) ? ysize : xsize); size = ((!(zsize > size)) ? size : zsize); size /= 2f; cx = bbox.center.x; cy = bbox.center.y; cz = bbox.center.z; per = Amount / 100f; return true; } }