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]); } } }