132 lines
3.2 KiB
C#
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]);
|
|
}
|
|
}
|
|
}
|