195 lines
4.7 KiB
C#
195 lines
4.7 KiB
C#
using UnityEngine;
|
|
|
|
[AddComponentMenu("Modifiers/Morph-O-Matic")]
|
|
public class MegaMorphOMatic : MegaMorphBase
|
|
{
|
|
public bool UseLimit;
|
|
|
|
public float Max;
|
|
|
|
public float Min;
|
|
|
|
public float importScale = 1f;
|
|
|
|
public bool flipyz;
|
|
|
|
public bool negx;
|
|
|
|
public bool glUseLimit;
|
|
|
|
public float glMin;
|
|
|
|
public float glMax = 1f;
|
|
|
|
public float tolerance = 0.0001f;
|
|
|
|
public bool animate;
|
|
|
|
public float atime;
|
|
|
|
public float animtime;
|
|
|
|
public float looptime;
|
|
|
|
public MegaRepeatMode repeatMode;
|
|
|
|
public float speed = 1f;
|
|
|
|
public Vector3[] oPoints;
|
|
|
|
public MegaMomVertMap[] mapping;
|
|
|
|
public override string ModName()
|
|
{
|
|
return "Morph-O-Matic";
|
|
}
|
|
|
|
public override string GetHelpURL()
|
|
{
|
|
return "?page_id=1521";
|
|
}
|
|
|
|
public override bool ModLateUpdate(MegaModContext mc)
|
|
{
|
|
if (animate)
|
|
{
|
|
animtime += Time.deltaTime * speed;
|
|
switch (repeatMode)
|
|
{
|
|
case MegaRepeatMode.Loop:
|
|
animtime = Mathf.Repeat(animtime, looptime);
|
|
break;
|
|
case MegaRepeatMode.Clamp:
|
|
animtime = Mathf.Clamp(animtime, 0f, looptime);
|
|
break;
|
|
}
|
|
SetAnim(animtime);
|
|
}
|
|
return Prepare(mc);
|
|
}
|
|
|
|
public override bool Prepare(MegaModContext mc)
|
|
{
|
|
if (chanBank != null && chanBank.Count > 0)
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private Vector3 Cubic(MegaMorphTarget t, int pointnum, float alpha)
|
|
{
|
|
Vector3 delta = t.mompoints[pointnum].delta;
|
|
delta.x *= alpha;
|
|
delta.y *= alpha;
|
|
delta.z *= alpha;
|
|
return delta;
|
|
}
|
|
|
|
public static void Bez3D(out Vector3 b, ref Vector3[] p, float u)
|
|
{
|
|
Vector3 vector = p[0] + (p[1] - p[0]) * u;
|
|
Vector3 vector2 = p[1] + (p[2] - p[1]) * u;
|
|
Vector3 vector3 = vector + (vector2 - vector) * u;
|
|
vector = p[2] + (p[3] - p[2]) * u;
|
|
Vector3 vector4 = vector2 + (vector - vector2) * u;
|
|
b = vector3 + (vector4 - vector3) * u;
|
|
}
|
|
|
|
public override void Modify(MegaModifiers mc)
|
|
{
|
|
verts.CopyTo(sverts, 0);
|
|
for (int i = 0; i < chanBank.Count; i++)
|
|
{
|
|
MegaMorphChan megaMorphChan = chanBank[i];
|
|
megaMorphChan.UpdatePercent();
|
|
float num = megaMorphChan.Percent;
|
|
if (num == megaMorphChan.fChannelPercent)
|
|
{
|
|
MegaMorphTarget megaMorphTarget = megaMorphChan.mTargetCache[megaMorphChan.targ];
|
|
for (int j = 0; j < megaMorphTarget.mompoints.Length; j++)
|
|
{
|
|
int id = megaMorphTarget.mompoints[j].id;
|
|
int num2 = mapping[id].indices.Length;
|
|
Vector3 vector = megaMorphChan.diff[j];
|
|
for (int k = 0; k < num2; k++)
|
|
{
|
|
int num3 = mapping[id].indices[k];
|
|
sverts[num3].x += vector.x;
|
|
sverts[num3].y += vector.y;
|
|
sverts[num3].z += vector.z;
|
|
}
|
|
}
|
|
continue;
|
|
}
|
|
megaMorphChan.fChannelPercent = num;
|
|
if (megaMorphChan.mTargetCache == null || megaMorphChan.mTargetCache.Count <= 0 || !megaMorphChan.mActiveOverride)
|
|
{
|
|
continue;
|
|
}
|
|
if (megaMorphChan.mUseLimit || glUseLimit)
|
|
{
|
|
num = ((!glUseLimit) ? Mathf.Clamp(num, megaMorphChan.mSpinmin, megaMorphChan.mSpinmax) : Mathf.Clamp(num, glMin, glMax));
|
|
}
|
|
int num4 = 0;
|
|
float num5 = 0f;
|
|
if (num < megaMorphChan.mTargetCache[0].percent)
|
|
{
|
|
num4 = 0;
|
|
num5 = (num - megaMorphChan.mTargetCache[num4].percent) / (megaMorphChan.mTargetCache[num4 + 1].percent - megaMorphChan.mTargetCache[num4].percent);
|
|
}
|
|
else
|
|
{
|
|
int num6 = megaMorphChan.mTargetCache.Count - 1;
|
|
if (num >= megaMorphChan.mTargetCache[num6].percent)
|
|
{
|
|
num4 = num6 - 1;
|
|
num5 = (num - megaMorphChan.mTargetCache[num4].percent) / (megaMorphChan.mTargetCache[num4 + 1].percent - megaMorphChan.mTargetCache[num4].percent);
|
|
}
|
|
else
|
|
{
|
|
for (int l = 1; l < megaMorphChan.mTargetCache.Count; l++)
|
|
{
|
|
if (num < megaMorphChan.mTargetCache[l].percent)
|
|
{
|
|
num4 = l - 1;
|
|
num5 = (num - megaMorphChan.mTargetCache[num4].percent) / (megaMorphChan.mTargetCache[l].percent - megaMorphChan.mTargetCache[num4].percent);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
MegaMorphTarget megaMorphTarget2 = megaMorphChan.mTargetCache[num4];
|
|
megaMorphChan.targ = num4;
|
|
for (int m = 0; m < megaMorphTarget2.mompoints.Length; m++)
|
|
{
|
|
int id2 = megaMorphTarget2.mompoints[m].id;
|
|
Vector3 start = megaMorphTarget2.mompoints[m].start;
|
|
start.x += megaMorphTarget2.mompoints[m].delta.x * num5;
|
|
start.y += megaMorphTarget2.mompoints[m].delta.y * num5;
|
|
start.z += megaMorphTarget2.mompoints[m].delta.z * num5;
|
|
megaMorphChan.diff[m] = start;
|
|
for (int n = 0; n < mapping[id2].indices.Length; n++)
|
|
{
|
|
int num7 = mapping[id2].indices[n];
|
|
sverts[num7].x += start.x;
|
|
sverts[num7].y += start.y;
|
|
sverts[num7].z += start.z;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public override void PrepareMT(MegaModifiers mc, int cores)
|
|
{
|
|
}
|
|
|
|
public override void DoWork(MegaModifiers mc, int index, int start, int end, int cores)
|
|
{
|
|
if (index == 0)
|
|
{
|
|
Modify(mc);
|
|
}
|
|
}
|
|
}
|