using UnityEngine; [AddComponentMenu("Modifiers/Warps/Squeeze")] public class MegaSqueezeWarp : MegaWarp { public float amount; public float crv; public float radialamount; public float radialcrv; public bool doRegion; public float to; public float from; public MegaAxis axis = MegaAxis.Y; private Matrix4x4 mat = default(Matrix4x4); private float k1; private float k2; private float k3; private float k4; private float l; private float l2; private float ovl; private float ovl2; private void SetK(float K1, float K2, float K3, float K4) { k1 = K1; k2 = K2; k3 = K3; k4 = K4; } public override string WarpName() { return "Squeeze"; } public override string GetIcon() { return "MegaStretch icon.png"; } public override string GetHelpURL() { return "?page_id=338"; } public override Vector3 Map(int i, Vector3 p) { p = tm.MultiplyPoint3x4(p); Vector3 a = p; float magnitude = p.magnitude; float t = Mathf.Exp((0f - totaldecay) * Mathf.Abs(magnitude)); if (l != 0f) { float num = ((!doRegion) ? Mathf.Abs(p.y * ovl) : ((p.y < from) ? (from * ovl) : ((!(p.y > to)) ? (p.y * ovl) : (to * ovl)))); float num2 = 1f + num * k1 + k2 * num * (1f - num); p.y *= num2; } if (l2 != 0f) { float num3 = Mathf.Sqrt(p.x * p.x + p.z * p.z); float num4 = num3 * ovl2; float num5 = 1f + num4 * k3 + k4 * num4 * (1f - num4); p.x *= num5; p.z *= num5; } p = Vector3.Lerp(a, p, t); return invtm.MultiplyPoint3x4(p); } public override bool Prepare(float decay) { tm = base.transform.worldToLocalMatrix; invtm = tm.inverse; mat = Matrix4x4.identity; SetAxis(mat); SetK(amount, crv, radialamount, radialcrv); Vector3 zero = Vector3.zero; zero.x = Width; zero.y = Height; zero.z = Length; switch (axis) { case MegaAxis.X: l = zero[0]; l2 = Mathf.Sqrt(zero[1] * zero[1] + zero[2] * zero[2]); break; case MegaAxis.Y: l = zero[1]; l2 = Mathf.Sqrt(zero[0] * zero[0] + zero[2] * zero[2]); break; case MegaAxis.Z: l = zero[2]; l2 = Mathf.Sqrt(zero[1] * zero[1] + zero[0] * zero[0]); break; } if (l != 0f) { ovl = 1f / l; } if (l2 != 0f) { ovl2 = 1f / l2; } totaldecay = Decay + decay; if (totaldecay < 0f) { totaldecay = 0f; } return true; } public override void ExtraGizmo() { if (doRegion) { DrawFromTo(MegaAxis.Z, from, to); } } }