Files
UltimateFishing/Assets/Scripts/Assembly-CSharp/MegaModifier.cs
2026-02-21 16:45:37 +08:00

512 lines
11 KiB
C#

using System;
using UnityEngine;
[RequireComponent(typeof(MegaModifyObject))]
public class MegaModifier : MonoBehaviour
{
[HideInInspector]
public bool ModEnabled = true;
[HideInInspector]
public bool DisplayGizmo = true;
[HideInInspector]
public int Order = -1;
[HideInInspector]
public Vector3 Offset = Vector3.zero;
[HideInInspector]
public Vector3 gizmoPos = Vector3.zero;
[HideInInspector]
public Vector3 gizmoRot = Vector3.zero;
[HideInInspector]
public Vector3 gizmoScale = Vector3.one;
[HideInInspector]
public Color gizCol1 = Color.yellow;
[HideInInspector]
public Color gizCol2 = Color.green;
[NonSerialized]
[HideInInspector]
public Matrix4x4 tm = default(Matrix4x4);
[NonSerialized]
public Matrix4x4 invtm = default(Matrix4x4);
[HideInInspector]
public MegaBox3 bbox = new MegaBox3();
[HideInInspector]
public Vector3[] corners = new Vector3[8];
[HideInInspector]
public int steps = 50;
[HideInInspector]
public Vector3[] verts;
[HideInInspector]
public Vector3[] sverts;
[HideInInspector]
public bool valid;
[HideInInspector]
public float[] selection;
[HideInInspector]
public MegaModifier instance;
public bool limitchandisplay;
public int startchannel;
public int displaychans = 10;
public bool useUndo = true;
[HideInInspector]
public string Label = string.Empty;
[HideInInspector]
public int MaxLOD;
public virtual MegaModChannel ChannelsReq()
{
return MegaModChannel.Verts;
}
public virtual MegaModChannel ChannelsChanged()
{
return MegaModChannel.Verts;
}
public virtual float GizmoSize()
{
return bbox.Radius() * 0.05f;
}
public virtual void ModStart(MegaModifiers ms)
{
}
public virtual void ModUpdate()
{
}
public virtual bool ModLateUpdate(MegaModContext mc)
{
return true;
}
public virtual Vector3 Map(int i, Vector3 p)
{
return p;
}
public virtual void ShowGUI()
{
}
public virtual string ModName()
{
return "Missing Name";
}
public virtual bool InitMod(MegaModifiers mc)
{
return true;
}
public virtual bool Prepare(MegaModContext mc)
{
return true;
}
public virtual void ModEnd(MegaModifiers ms)
{
}
public virtual string GetHelpURL()
{
return "?page_id=377";
}
public virtual void PrepareMT(MegaModifiers mc, int cores)
{
}
public virtual void DoneMT(MegaModifiers mc)
{
}
public virtual void SetValues(MegaModifier mod)
{
}
public virtual bool CanThread()
{
return true;
}
public virtual void Copy(MegaModifier dst)
{
dst.Label = Label;
dst.MaxLOD = MaxLOD;
dst.ModEnabled = ModEnabled;
dst.DisplayGizmo = DisplayGizmo;
dst.Order = Order;
dst.Offset = Offset;
dst.gizmoPos = gizmoPos;
dst.gizmoRot = gizmoRot;
dst.gizmoScale = gizmoScale;
dst.gizCol1 = gizCol1;
dst.gizCol2 = gizCol2;
}
public virtual void PostCopy(MegaModifier dst)
{
}
public virtual void DoWork(MegaModifiers mc, int index, int start, int end, int cores)
{
if (selection != null)
{
DoWorkWeighted(mc, index, start, end, cores);
return;
}
for (int i = start; i < end; i++)
{
sverts[i] = Map(i, verts[i]);
}
}
public virtual void DoWorkWeighted(MegaModifiers mc, int index, int start, int end, int cores)
{
for (int i = start; i < end; i++)
{
Vector3 vector = verts[i];
float num = selection[i];
if (num > 0.001f)
{
Vector3 vector2 = Map(i, verts[i]);
sverts[i].x = vector.x + (vector2.x - vector.x) * num;
sverts[i].y = vector.y + (vector2.y - vector.y) * num;
sverts[i].z = vector.z + (vector2.z - vector.z) * num;
}
else
{
sverts[i] = vector;
}
}
}
private void Awake()
{
MegaModifyObject component = base.gameObject.GetComponent<MegaModifyObject>();
if (component != null)
{
component.ModReset(this);
}
}
private void Reset()
{
MegaModifyObject component = base.gameObject.GetComponent<MegaModifyObject>();
if (component != null)
{
component.ModReset(this);
}
}
[ContextMenu("Help")]
public void Help()
{
Application.OpenURL("http://www.west-racing.com/mf/" + GetHelpURL());
}
[ContextMenu("Reset Offset")]
public void ResetOffset()
{
Offset = Vector3.zero;
}
private Vector3 GetCentre()
{
MegaModifyObject component = base.gameObject.GetComponent<MegaModifyObject>();
if (component != null && component.cachedMesh != null)
{
return component.cachedMesh.bounds.center;
}
return Vector3.zero;
}
[ContextMenu("Reset GizmoPos")]
public void ResetGizmoPos()
{
gizmoPos = Vector3.zero;
}
[ContextMenu("Reset GizmoRot")]
public void ResetGizmoRot()
{
gizmoRot = Vector3.zero;
}
[ContextMenu("Reset GizmoScale")]
public void ResetGizmoScale()
{
gizmoScale = Vector3.one;
}
[ContextMenu("Center Offset")]
public void CentreOffset()
{
Offset = -GetCentre();
}
[ContextMenu("Center GizmoPos")]
public void CentreGizmoPos()
{
gizmoPos = -GetCentre();
}
public void SetModMesh(Mesh ms)
{
if (ms != null)
{
Bounds bounds = ms.bounds;
bbox.min = bounds.center - bounds.extents;
bbox.max = bounds.center + bounds.extents;
verts = ms.vertices;
MeshChanged();
}
}
public virtual void MeshChanged()
{
}
public void SetTM()
{
tm = Matrix4x4.identity;
Quaternion q = Quaternion.Euler(-gizmoRot);
tm.SetTRS(gizmoPos + Offset, q, gizmoScale);
invtm = tm.inverse;
}
public void SetTM(Vector3 off)
{
tm = Matrix4x4.identity;
Quaternion q = Quaternion.Euler(-gizmoRot);
tm.SetTRS(gizmoPos + off, q, gizmoScale);
invtm = tm.inverse;
}
public void SetAxis(Matrix4x4 tmAxis)
{
Matrix4x4 inverse = tmAxis.inverse;
tm = tmAxis * tm;
invtm *= inverse;
}
public virtual void Modify(ref Vector3[] sverts, ref Vector3[] verts)
{
for (int i = 0; i < verts.Length; i++)
{
sverts[i] = Map(i, verts[i]);
}
}
public virtual void Modify(Vector3[] sverts, Vector3[] verts)
{
for (int i = 0; i < verts.Length; i++)
{
sverts[i] = Map(i, verts[i]);
}
}
public virtual void Modify(MegaModifiers mc)
{
if (verts != null)
{
for (int i = 0; i < verts.Length; i++)
{
sverts[i] = Map(i, verts[i]);
}
}
}
public virtual void ModifyWeighted(MegaModifiers mc)
{
for (int i = 0; i < verts.Length; i++)
{
Vector3 vector = verts[i];
float num = mc.selection[i];
if (num > 0.001f)
{
Vector3 vector2 = Map(i, verts[i]);
sverts[i].x = vector.x + (vector2.x - vector.x) * num;
sverts[i].y = vector.y + (vector2.y - vector.y) * num;
sverts[i].z = vector.z + (vector2.z - vector.z) * num;
}
else
{
sverts[i] = verts[i];
}
}
}
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 = gizCol1;
}
else
{
Gizmos.color = gizCol2;
}
Gizmos.DrawLine(vector, zero);
vector = zero;
}
Gizmos.color = gizCol1;
}
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 virtual void DrawGizmo(MegaModContext context)
{
tm = Matrix4x4.identity;
MegaMatrix.Translate(ref tm, context.Offset);
invtm = tm.inverse;
if (Prepare(context))
{
Vector3 min = context.bbox.min;
Vector3 max = context.bbox.max;
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);
if (context.mod.sourceObj != null)
{
Gizmos.matrix = context.mod.sourceObj.transform.localToWorldMatrix * identity;
}
else
{
Gizmos.matrix = context.go.transform.localToWorldMatrix * identity;
}
corners[0] = new Vector3(min.x, min.y, min.z);
corners[1] = new Vector3(min.x, max.y, min.z);
corners[2] = new Vector3(max.x, max.y, min.z);
corners[3] = new Vector3(max.x, min.y, min.z);
corners[4] = new Vector3(min.x, min.y, max.z);
corners[5] = new Vector3(min.x, max.y, max.z);
corners[6] = new Vector3(max.x, max.y, max.z);
corners[7] = new Vector3(max.x, min.y, max.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(context);
}
}
public virtual void ExtraGizmo(MegaModContext mc)
{
}
public void DrawFromTo(MegaAxis axis, float from, float to, MegaModContext mc)
{
Vector3 min = mc.bbox.min;
Vector3 max = mc.bbox.max;
switch (axis)
{
case MegaAxis.X:
corners[0] = new Vector3(0f - from, min.y, min.z);
corners[1] = new Vector3(0f - from, max.y, min.z);
corners[2] = new Vector3(0f - from, max.y, max.z);
corners[3] = new Vector3(0f - from, min.y, max.z);
corners[4] = new Vector3(0f - to, min.y, min.z);
corners[5] = new Vector3(0f - to, max.y, min.z);
corners[6] = new Vector3(0f - to, max.y, max.z);
corners[7] = new Vector3(0f - to, min.y, max.z);
break;
case MegaAxis.Y:
corners[0] = new Vector3(min.x, min.y, 0f - from);
corners[1] = new Vector3(min.x, max.y, 0f - from);
corners[2] = new Vector3(max.x, max.y, 0f - from);
corners[3] = new Vector3(max.x, min.y, 0f - from);
corners[4] = new Vector3(min.x, min.y, 0f - to);
corners[5] = new Vector3(min.x, max.y, 0f - to);
corners[6] = new Vector3(max.x, max.y, 0f - to);
corners[7] = new Vector3(max.x, min.y, 0f - to);
break;
case MegaAxis.Z:
corners[0] = new Vector3(min.x, from, min.z);
corners[1] = new Vector3(min.x, from, max.z);
corners[2] = new Vector3(max.x, from, max.z);
corners[3] = new Vector3(max.x, from, min.z);
corners[4] = new Vector3(min.x, to, min.z);
corners[5] = new Vector3(min.x, to, max.z);
corners[6] = new Vector3(max.x, to, max.z);
corners[7] = new Vector3(max.x, to, min.z);
break;
}
Color red = Color.red;
red.a = gizCol1.a;
Gizmos.color = red;
Vector3 zero = Vector3.zero;
DrawEdgeCol(corners[0] - zero, corners[1] - zero);
DrawEdgeCol(corners[1] - zero, corners[2] - zero);
DrawEdgeCol(corners[2] - zero, corners[3] - zero);
DrawEdgeCol(corners[3] - zero, corners[0] - zero);
red = Color.green;
red.a = gizCol1.a;
Gizmos.color = red;
DrawEdgeCol(corners[4] - zero, corners[5] - zero);
DrawEdgeCol(corners[5] - zero, corners[6] - zero);
DrawEdgeCol(corners[6] - zero, corners[7] - zero);
DrawEdgeCol(corners[7] - zero, corners[4] - zero);
}
private void OnDrawGizmosSelected()
{
}
}