Files
2026-02-21 16:45:37 +08:00

132 lines
3.2 KiB
C#

using UnityEngine;
[AddComponentMenu("Modifiers/UV/Adjust")]
public class MegaUVAdjust : MegaModifier
{
public bool animate;
public float rotspeed;
public float spiralspeed;
public Vector3 speed = Vector3.zero;
public float spiral;
public float spirallim = 360f;
public override MegaModChannel ChannelsReq()
{
return MegaModChannel.UV;
}
public override MegaModChannel ChannelsChanged()
{
return MegaModChannel.UV;
}
public override string ModName()
{
return "UVAdjust";
}
public override string GetHelpURL()
{
return "?page_id=352";
}
public override Vector3 Map(int i, Vector3 p)
{
return p;
}
public override void Modify(MegaModifiers mc)
{
Vector2[] sourceUvs = mc.GetSourceUvs();
Vector2[] destUvs = mc.GetDestUvs();
if (sourceUvs.Length > 0)
{
Vector3 pos = -gizmoPos;
Vector3 s = gizmoScale;
Vector3 vector = gizmoRot;
Matrix4x4 identity = Matrix4x4.identity;
Vector3 point = Vector3.zero;
for (int i = 0; i < sourceUvs.Length; i++)
{
point.x = sourceUvs[i].x - Offset.x - 0.5f;
point.z = sourceUvs[i].y - Offset.z - 0.5f;
point.y = 0f;
float num = Mathf.Sqrt(point.x * point.x + point.z * point.z) * spiral;
vector = new Vector3(gizmoRot.x, gizmoRot.y + num, gizmoRot.z);
point = Matrix4x4.TRS(pos, Quaternion.Euler(vector), s).MultiplyPoint(point);
destUvs[i].x = point.x;
destUvs[i].y = point.z;
}
}
}
public override bool ModLateUpdate(MegaModContext mc)
{
if (animate)
{
spiral += spiralspeed * Time.deltaTime;
if (Mathf.Abs(spiral) > spirallim)
{
if (spiral < 0f)
{
spiral = 0f - spirallim;
}
else
{
spiral = spirallim;
}
spiralspeed = 0f - spiralspeed;
}
gizmoRot.y += rotspeed * Time.deltaTime;
gizmoRot.y = Mathf.Repeat(gizmoRot.y, 360f);
gizmoPos += speed * Time.deltaTime;
}
return Prepare(mc);
}
public override bool Prepare(MegaModContext mc)
{
return true;
}
public override void DrawGizmo(MegaModContext context)
{
tm = Matrix4x4.identity;
invtm = tm.inverse;
if (Prepare(context))
{
Vector3 vector = new Vector3(-0.5f, 0f, -0.5f);
Vector3 vector2 = new Vector3(0.5f, 0f, 0.5f);
vector += Offset;
vector2 += Offset;
Matrix4x4 identity = Matrix4x4.identity;
Vector3 s = gizmoScale;
s.x = 1f / s.x;
s.y = 1f / s.y;
s.z = 1f / s.z;
identity.SetTRS(Vector3.Scale(-gizmoPos - Offset, bbox.Size()), Quaternion.Euler(-gizmoRot), s);
if (context.mod.sourceObj != null)
{
Gizmos.matrix = context.mod.sourceObj.transform.localToWorldMatrix;
}
else
{
Gizmos.matrix = base.transform.localToWorldMatrix;
}
corners[0] = identity.MultiplyPoint(Vector3.Scale(new Vector3(vector.x, vector.y, vector.z), bbox.Size()));
corners[1] = identity.MultiplyPoint(Vector3.Scale(new Vector3(vector.x, vector.y, vector2.z), bbox.Size()));
corners[2] = identity.MultiplyPoint(Vector3.Scale(new Vector3(vector2.x, vector.y, vector2.z), bbox.Size()));
corners[3] = identity.MultiplyPoint(Vector3.Scale(new Vector3(vector2.x, vector.y, vector.z), bbox.Size()));
DrawEdge(corners[0], corners[1]);
DrawEdge(corners[1], corners[2]);
DrawEdge(corners[2], corners[3]);
DrawEdge(corners[3], corners[0]);
}
}
}