217 lines
5.7 KiB
C#
217 lines
5.7 KiB
C#
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);
|
|
}
|
|
}
|