using System; using UnityEngine; [AddComponentMenu("Modifiers/Wave")] public class MegaWave : MegaModifier { public float amp; public float amp2; public float flex = 1f; public float wave = 1f; public float phase; public float Decay; public float dir; 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; private Matrix4x4 mat = default(Matrix4x4); public override string ModName() { return "Wave"; } public override string GetHelpURL() { return "?page_id=357"; } public override Vector3 Map(int i, Vector3 p) { p = tm.MultiplyPoint3x4(p); float num = Mathf.Abs(2f * p.x / dist); num *= num; p.z += flex * MegaUtils.WaveFunc(p.y, time, amp * (1f - num) + amp2 * num, wave, phase, dy); return invtm.MultiplyPoint3x4(p); } public override bool ModLateUpdate(MegaModContext mc) { if (animate) { t += Time.deltaTime * Speed; phase = t; } return Prepare(mc); } public override bool Prepare(MegaModContext mc) { mat = Matrix4x4.identity; MegaMatrix.RotateZ(ref mat, (float)Math.PI / 180f * dir); SetAxis(mat); dy = Decay / 1000f; dist = wave / 10f * 4f * 5f; if (dist == 0f) { dist = 1f; } 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; 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; } } 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(MegaModContext context) { Gizmos.color = Color.yellow; Matrix4x4 identity = Matrix4x4.identity; Vector3 pos = gizmoPos; pos.x = 0f - pos.x; pos.y = 0f - pos.y; pos.z = 0f - pos.z; Vector3 s = gizmoScale; s.x = 1f - (s.x - 1f); s.y = 1f - (s.y - 1f); identity.SetTRS(pos, Quaternion.Euler(gizmoRot), s); Gizmos.matrix = base.transform.localToWorldMatrix * identity; BuildMesh(t); } }