301 lines
5.9 KiB
C#
301 lines
5.9 KiB
C#
using UnityEngine;
|
|
|
|
[AddComponentMenu("Modifiers/Melt")]
|
|
public class MegaMelt : MegaModifier
|
|
{
|
|
public float Amount;
|
|
|
|
public float Spread = 19f;
|
|
|
|
public MegaMeltMat MaterialType;
|
|
|
|
public float Solidity = 1f;
|
|
|
|
public MegaAxis axis;
|
|
|
|
public bool FlipAxis;
|
|
|
|
private float zba;
|
|
|
|
public float flatness;
|
|
|
|
private float size;
|
|
|
|
private float bulger;
|
|
|
|
private float ybr;
|
|
|
|
private float zbr;
|
|
|
|
private float visvaluea;
|
|
|
|
private int confiner;
|
|
|
|
private int vistypea;
|
|
|
|
private float cx;
|
|
|
|
private float cy;
|
|
|
|
private float cz;
|
|
|
|
private float xsize;
|
|
|
|
private float ysize;
|
|
|
|
private float zsize;
|
|
|
|
private float ooxsize;
|
|
|
|
private float ooysize;
|
|
|
|
private float oozsize;
|
|
|
|
public override string ModName()
|
|
{
|
|
return "Melt";
|
|
}
|
|
|
|
public override string GetHelpURL()
|
|
{
|
|
return "?page_id=225";
|
|
}
|
|
|
|
private float hypot(float x, float y)
|
|
{
|
|
return Mathf.Sqrt(x * x + y * y);
|
|
}
|
|
|
|
public override Vector3 Map(int i, Vector3 p)
|
|
{
|
|
float num = 0f;
|
|
float num2 = 0f;
|
|
float num3 = 0f;
|
|
p = tm.MultiplyPoint3x4(p);
|
|
float num4 = p.x;
|
|
float num5 = p.y;
|
|
float num6 = p.z;
|
|
float num7 = num4 - cx;
|
|
float num8 = num5 - cy;
|
|
float num9 = num6 - cz;
|
|
if (num7 == 0f && num8 == 0f && num9 == 0f)
|
|
{
|
|
num7 = (num8 = (num9 = 1f));
|
|
}
|
|
if (num4 == 0f && num5 == 0f && num6 == 0f)
|
|
{
|
|
num4 = (num5 = (num6 = 1f));
|
|
}
|
|
float num10 = Mathf.Sqrt(num7 * num7 + num8 * num8 + num9 * num9);
|
|
float num11 = size / num10;
|
|
if (axis == MegaAxis.Y)
|
|
{
|
|
float num12 = num7 + Mathf.Sign(num7) * (Mathf.Abs(num7 * num11) * (bulger * ybr));
|
|
float num13 = num8 + Mathf.Sign(num8) * (Mathf.Abs(num8 * num11) * (bulger * ybr));
|
|
num4 = num12 + cx;
|
|
num5 = num13 + cy;
|
|
}
|
|
if (axis == MegaAxis.Z)
|
|
{
|
|
float num12 = num7 + Mathf.Sign(num7) * (Mathf.Abs(num7 * num11) * (bulger * ybr));
|
|
float num13 = num9 + Mathf.Sign(num9) * (Mathf.Abs(num9 * num11) * (bulger * ybr));
|
|
num4 = num12 + cx;
|
|
num6 = num13 + cz;
|
|
}
|
|
if (axis == MegaAxis.X)
|
|
{
|
|
float num12 = num9 + Mathf.Sign(num9) * (Mathf.Abs(num9 * num11) * (bulger * ybr));
|
|
float num13 = num8 + Mathf.Sign(num8) * (Mathf.Abs(num8 * num11) * (bulger * ybr));
|
|
num6 = num12 + cz;
|
|
num5 = num13 + cy;
|
|
}
|
|
if ((axis != MegaAxis.Y || !(p.z < bbox.min.z + zbr)) && (axis != MegaAxis.Z || !(p.y < bbox.min.y + zbr)) && (axis != MegaAxis.X || !(p.x < bbox.min.x + zbr)))
|
|
{
|
|
if (axis == MegaAxis.Y)
|
|
{
|
|
num3 = hypot(bbox.max.x - cx, bbox.max.y - cy);
|
|
}
|
|
if (axis == MegaAxis.Z)
|
|
{
|
|
num3 = hypot(bbox.max.x - cx, bbox.max.z - cz);
|
|
}
|
|
if (axis == MegaAxis.X)
|
|
{
|
|
num3 = hypot(bbox.max.z - cz, bbox.max.y - cy);
|
|
}
|
|
if (axis == MegaAxis.Y)
|
|
{
|
|
num = hypot(num4 - cx, num5 - cy);
|
|
num2 = num3 - hypot(num4 - cx, num5 - cy);
|
|
}
|
|
if (axis == MegaAxis.Z)
|
|
{
|
|
num = hypot(num4 - cx, num6 - cz);
|
|
num2 = num3 - hypot(num4 - cx, num6 - cz);
|
|
}
|
|
if (axis == MegaAxis.X)
|
|
{
|
|
num = hypot(num6 - cz, num5 - cy);
|
|
num2 = num3 - hypot(num6 - cz, num5 - cy);
|
|
}
|
|
if (num2 < 0f)
|
|
{
|
|
num2 = 0f;
|
|
}
|
|
num += num2 / visvaluea;
|
|
if (axis == MegaAxis.Y)
|
|
{
|
|
if (FlipAxis)
|
|
{
|
|
float num14 = bbox.min.z + (num6 - bbox.min.z) * oozsize * flatness;
|
|
num6 -= num * bulger;
|
|
if (num6 <= num14)
|
|
{
|
|
num6 = num14;
|
|
}
|
|
if (num6 <= num14 + zbr)
|
|
{
|
|
num6 = num14 + zbr;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
float num15 = bbox.max.z - (bbox.max.z - num6) * oozsize * flatness;
|
|
num6 += num * bulger;
|
|
if (num6 >= num15)
|
|
{
|
|
num6 = num15;
|
|
}
|
|
if (num6 >= num15 + zbr)
|
|
{
|
|
num6 = num15 + zbr;
|
|
}
|
|
}
|
|
}
|
|
if (axis == MegaAxis.Z)
|
|
{
|
|
if (!FlipAxis)
|
|
{
|
|
float num16 = bbox.min.y + (num5 - bbox.min.y) * ooysize * flatness;
|
|
num5 -= num * bulger;
|
|
if (num5 <= num16)
|
|
{
|
|
num5 = num16;
|
|
}
|
|
if (num5 <= num16 + zbr)
|
|
{
|
|
num5 = num16 + zbr;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
float num17 = bbox.max.y - (bbox.max.y - num5) * ooysize * flatness;
|
|
num5 += num * bulger;
|
|
if (num5 >= num17)
|
|
{
|
|
num5 = num17;
|
|
}
|
|
if (num5 >= num17 + zbr)
|
|
{
|
|
num5 = num17 + zbr;
|
|
}
|
|
}
|
|
}
|
|
if (axis == MegaAxis.X)
|
|
{
|
|
if (!FlipAxis)
|
|
{
|
|
float num18 = bbox.min.x + (num4 - bbox.min.x) * ooxsize * flatness;
|
|
num4 -= num * bulger;
|
|
if (num4 <= num18)
|
|
{
|
|
num4 = num18;
|
|
}
|
|
if (num4 <= num18 + zbr)
|
|
{
|
|
num4 = num18 + zbr;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
float num19 = bbox.max.x - (bbox.max.x - num4) * ooxsize * flatness;
|
|
num4 += num * bulger;
|
|
if (num4 >= num19)
|
|
{
|
|
num4 = num19;
|
|
}
|
|
if (num4 >= num19 + zbr)
|
|
{
|
|
num4 = num19 + zbr;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
p.x = num4;
|
|
p.y = num5;
|
|
p.z = num6;
|
|
p = invtm.MultiplyPoint3x4(p);
|
|
return p;
|
|
}
|
|
|
|
public override void ModStart(MegaModifiers mc)
|
|
{
|
|
cx = bbox.center.x;
|
|
cy = bbox.center.y;
|
|
cz = bbox.center.z;
|
|
xsize = bbox.max.x - bbox.min.x;
|
|
ysize = bbox.max.y - bbox.min.y;
|
|
zsize = bbox.max.z - bbox.min.z;
|
|
size = ((!(xsize > ysize)) ? ysize : xsize);
|
|
size = ((!(zsize > size)) ? size : zsize);
|
|
size /= 2f;
|
|
}
|
|
|
|
public override bool ModLateUpdate(MegaModContext mc)
|
|
{
|
|
return Prepare(mc);
|
|
}
|
|
|
|
public override bool Prepare(MegaModContext mc)
|
|
{
|
|
cx = bbox.center.x;
|
|
cy = bbox.center.y;
|
|
cz = bbox.center.z;
|
|
xsize = bbox.max.x - bbox.min.x;
|
|
ysize = bbox.max.y - bbox.min.y;
|
|
zsize = bbox.max.z - bbox.min.z;
|
|
ooxsize = 1f / xsize;
|
|
ooysize = 1f / ysize;
|
|
oozsize = 1f / zsize;
|
|
size = ((!(xsize > ysize)) ? ysize : xsize);
|
|
size = ((!(zsize > size)) ? size : zsize);
|
|
size /= 2f;
|
|
switch (MaterialType)
|
|
{
|
|
case MegaMeltMat.Ice:
|
|
visvaluea = 2f;
|
|
break;
|
|
case MegaMeltMat.Glass:
|
|
visvaluea = 12f;
|
|
break;
|
|
case MegaMeltMat.Jelly:
|
|
visvaluea = 0.4f;
|
|
break;
|
|
case MegaMeltMat.Plastic:
|
|
visvaluea = 0.7f;
|
|
break;
|
|
case MegaMeltMat.Custom:
|
|
visvaluea = Solidity;
|
|
break;
|
|
}
|
|
if (Amount < 0f)
|
|
{
|
|
Amount = 0f;
|
|
}
|
|
ybr = Spread / 100f;
|
|
zbr = zba / 10f;
|
|
bulger = Amount / 100f;
|
|
return true;
|
|
}
|
|
}
|