using UnityEngine; [AddComponentMenu("Modifiers/Warps/Wave")] public class MegaWaveWarp : MegaWarp { public float amp; public float amp2; public float flex = 1f; public float wave = 1f; public float phase; public bool animate; public float Speed = 1f; public int divs = 4; public int numSegs = 4; public int numSides = 4; private float time; private float dy; private float dist; private float t; public override string WarpName() { return "Wave"; } public override string GetIcon() { return "MegaWave icon.png"; } public override string GetHelpURL() { return "?page_id=380"; } public override Vector3 Map(int i, Vector3 p) { p = tm.MultiplyPoint3x4(p); Vector3 a = p; float magnitude = p.magnitude; float num = Mathf.Exp((0f - totaldecay) * Mathf.Abs(magnitude)); float num2 = Mathf.Abs(2f * p.x / magnitude); num2 *= num2; p.z += flex * MegaUtils.WaveFunc(p.y, time, amp * (1f - num2) + amp2 * num2, wave, phase, dy); p = Vector3.Lerp(a, p, num); return invtm.MultiplyPoint3x4(p); } private void Update() { if (animate) { t += Time.deltaTime * Speed; phase = t; } } public override bool Prepare(float decay) { tm = base.transform.worldToLocalMatrix; invtm = tm.inverse; dist = wave / 10f * 4f * 5f; if (dist == 0f) { dist = 1f; } dy = Decay / 1000f; totaldecay = dy + decay; if (totaldecay < 0f) { totaldecay = 0f; } return true; } private void BuildMesh(float t) { Vector3 zero = Vector3.zero; Vector3 vector = Vector3.zero; float num = wave / (float)divs; float num2 = num * 4f; int num3 = (int)(num2 * (float)numSides * 0.5f); float num4 = (0f - (float)numSegs) / 2f * num; float num5 = (0f - (float)numSides) / 2f * num2; Gizmos.color = MegaWarp.gCol1; for (int i = 0; i <= numSides; i++) { zero.x = num5 + num2 * (float)i; float num6 = Mathf.Abs(zero.x / ((num3 == 0) ? 1E-05f : ((float)num3))); num6 *= num6; for (int j = 0; j <= numSegs; j++) { zero.y = num4 + (float)j * num; zero.z = MegaUtils.WaveFunc(zero.y, t, amp * (1f - num6) + amp2 * num6, wave, phase, Decay / 1000f); if (j > 0) { Gizmos.DrawLine(vector, zero); } vector = zero; } } Gizmos.color = MegaWarp.gCol2; for (int k = 0; k <= numSegs; k++) { zero.y = num4 + (float)k * num; for (int l = 0; l <= numSides; l++) { zero.x = num5 + num2 * (float)l; float num7 = Mathf.Abs(zero.x / ((num3 == 0) ? 1E-05f : ((float)num3))); num7 *= num7; zero.z = MegaUtils.WaveFunc(zero.y, t, amp * (1f - num7) + amp2 * num7, wave, phase, Decay / 1000f); if (l > 0) { Gizmos.DrawLine(vector, zero); } vector = zero; } } } public override void DrawGizmo(Color col) { SetGizCols(col.a); tm = Matrix4x4.identity; invtm = tm.inverse; if (Prepare(0f)) { tm *= base.transform.localToWorldMatrix; invtm = tm.inverse; Gizmos.matrix = base.transform.localToWorldMatrix; BuildMesh(t); } } }