using System; using UnityEngine; [ExecuteInEditMode] public class MegaWarp : MonoBehaviour { public float Width = 1f; public float Height = 1f; public float Length = 1f; public float Decay; public bool Enabled = true; public bool DisplayGizmo = true; public Color GizCol1 = Color.yellow; public Color GizCol2 = Color.green; [NonSerialized] public Matrix4x4 tm = default(Matrix4x4); [NonSerialized] public Matrix4x4 invtm = default(Matrix4x4); private Vector3 Offset = Vector3.zero; private int steps = 50; [NonSerialized] public float totaldecay; [HideInInspector] public Vector3[] corners = new Vector3[8]; public static Color gCol1; public static Color gCol2; public virtual string WarpName() { return "None"; } public virtual string GetHelpURL() { return "Warp.htm"; } public virtual Vector3 Map(int i, Vector3 p) { return p; } public virtual bool Prepare(float decay) { return true; } public virtual string GetIcon() { return "MegaWave icon.png"; } [ContextMenu("Help")] public void Help() { Application.OpenURL("http://www.west-racing.com/mf/" + GetHelpURL()); } public virtual void SetAxis(Matrix4x4 tmAxis) { Matrix4x4 inverse = tmAxis.inverse; tm = tmAxis * tm; invtm *= inverse; } public void DrawEdge(Vector3 p1, Vector3 p2) { Vector3 vector = Map(-1, p1); Vector3 zero = Vector3.zero; for (int i = 1; i <= steps; i++) { zero = p1 + (p2 - p1) * ((float)i / (float)steps); zero = Map(-1, zero); if ((i & 4) == 0) { Gizmos.color = gCol1; } else { Gizmos.color = gCol2; } Gizmos.DrawLine(vector, zero); vector = zero; } Gizmos.color = gCol1; } public void DrawEdgeCol(Vector3 p1, Vector3 p2) { Vector3 vector = Map(-1, p1); Vector3 zero = Vector3.zero; for (int i = 1; i <= steps; i++) { zero = p1 + (p2 - p1) * ((float)i / (float)steps); zero = Map(-1, zero); Gizmos.DrawLine(vector, zero); vector = zero; } } public void SetGizCols(float a) { gCol1 = GizCol1; gCol1.a *= a; gCol2 = GizCol2; gCol2.a *= a; } public virtual void DrawGizmo(Color col) { SetGizCols(col.a); tm = Matrix4x4.identity; invtm = tm.inverse; if (Prepare(0f)) { tm *= base.transform.localToWorldMatrix; invtm = tm.inverse; Vector3 vector = new Vector3((0f - Width) * 0.5f, 0f, (0f - Length) * 0.5f); Vector3 vector2 = new Vector3(Width * 0.5f, Height, Length * 0.5f); Gizmos.matrix = base.transform.localToWorldMatrix; corners[0] = new Vector3(vector.x, vector.y, vector.z); corners[1] = new Vector3(vector.x, vector2.y, vector.z); corners[2] = new Vector3(vector2.x, vector2.y, vector.z); corners[3] = new Vector3(vector2.x, vector.y, vector.z); corners[4] = new Vector3(vector.x, vector.y, vector2.z); corners[5] = new Vector3(vector.x, vector2.y, vector2.z); corners[6] = new Vector3(vector2.x, vector2.y, vector2.z); corners[7] = new Vector3(vector2.x, vector.y, vector2.z); DrawEdge(corners[0], corners[1]); DrawEdge(corners[1], corners[2]); DrawEdge(corners[2], corners[3]); DrawEdge(corners[3], corners[0]); DrawEdge(corners[4], corners[5]); DrawEdge(corners[5], corners[6]); DrawEdge(corners[6], corners[7]); DrawEdge(corners[7], corners[4]); DrawEdge(corners[0], corners[4]); DrawEdge(corners[1], corners[5]); DrawEdge(corners[2], corners[6]); DrawEdge(corners[3], corners[7]); ExtraGizmo(); } } public virtual void ExtraGizmo() { } public void DrawFromTo(MegaAxis axis, float from, float to) { Vector3 vector = new Vector3((0f - Width) * 0.5f, 0f, (0f - Length) * 0.5f); Vector3 vector2 = new Vector3(Width * 0.5f, Height, Length * 0.5f); switch (axis) { case MegaAxis.X: corners[0] = new Vector3(0f - from, vector.y, vector.z); corners[1] = new Vector3(0f - from, vector2.y, vector.z); corners[2] = new Vector3(0f - from, vector2.y, vector2.z); corners[3] = new Vector3(0f - from, vector.y, vector2.z); corners[4] = new Vector3(0f - to, vector.y, vector.z); corners[5] = new Vector3(0f - to, vector2.y, vector.z); corners[6] = new Vector3(0f - to, vector2.y, vector2.z); corners[7] = new Vector3(0f - to, vector.y, vector2.z); break; case MegaAxis.Y: corners[0] = new Vector3(vector.x, vector.y, 0f - from); corners[1] = new Vector3(vector.x, vector2.y, 0f - from); corners[2] = new Vector3(vector2.x, vector2.y, 0f - from); corners[3] = new Vector3(vector2.x, vector.y, 0f - from); corners[4] = new Vector3(vector.x, vector.y, 0f - to); corners[5] = new Vector3(vector.x, vector2.y, 0f - to); corners[6] = new Vector3(vector2.x, vector2.y, 0f - to); corners[7] = new Vector3(vector2.x, vector.y, 0f - to); break; case MegaAxis.Z: corners[0] = new Vector3(vector.x, from, vector.z); corners[1] = new Vector3(vector.x, from, vector2.z); corners[2] = new Vector3(vector2.x, from, vector2.z); corners[3] = new Vector3(vector2.x, from, vector.z); corners[4] = new Vector3(vector.x, to, vector.z); corners[5] = new Vector3(vector.x, to, vector2.z); corners[6] = new Vector3(vector2.x, to, vector2.z); corners[7] = new Vector3(vector2.x, to, vector.z); break; } Color red = Color.red; red.a = gCol1.a; Gizmos.color = red; DrawEdgeCol(corners[0] - Offset, corners[1] - Offset); DrawEdgeCol(corners[1] - Offset, corners[2] - Offset); DrawEdgeCol(corners[2] - Offset, corners[3] - Offset); DrawEdgeCol(corners[3] - Offset, corners[0] - Offset); red = Color.green; red.a = gCol1.a; Gizmos.color = red; DrawEdgeCol(corners[4] - Offset, corners[5] - Offset); DrawEdgeCol(corners[5] - Offset, corners[6] - Offset); DrawEdgeCol(corners[6] - Offset, corners[7] - Offset); DrawEdgeCol(corners[7] - Offset, corners[4] - Offset); } }