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

305 lines
5.6 KiB
C#

using UnityEngine;
[AddComponentMenu("Modifiers/Warps/Melt")]
public class MegaMeltWarp : MegaWarp
{
public float Amount;
public float Spread = 19f;
public MegaMeltMat MaterialType;
public float Solidity = 1f;
public MegaAxis axis;
public bool FlipAxis;
private float zba;
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 float flatness = 0.1f;
private Vector3 max = Vector3.zero;
private Vector3 min = Vector3.zero;
public override string WarpName()
{
return "Melt";
}
public override string GetIcon()
{
return "MegaMelt icon.png";
}
public override string GetHelpURL()
{
return "?page_id=2566";
}
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);
Vector3 a = 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 t = Mathf.Exp((0f - totaldecay) * Mathf.Abs(num10));
float num11 = size / num10;
if (axis == MegaAxis.Z)
{
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.Y)
{
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.Z)
{
num3 = hypot(max.x - cx, max.y - cy);
}
if (axis == MegaAxis.Y)
{
num3 = hypot(max.x - cx, max.z - cz);
}
if (axis == MegaAxis.X)
{
num3 = hypot(max.z - cz, max.y - cy);
}
if (axis == MegaAxis.Z)
{
num = hypot(num4 - cx, num5 - cy);
num2 = num3 - hypot(num4 - cx, num5 - cy);
}
if (axis == MegaAxis.Y)
{
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.Z)
{
if (FlipAxis)
{
float num14 = min.z + (num6 - min.z) * oozsize * flatness;
num6 -= num * bulger;
if (num6 <= num14)
{
num6 = num14;
}
if (num6 <= num14 + zbr)
{
num6 = num14 + zbr;
}
}
else
{
float num15 = max.z - (max.z - num6) * oozsize * flatness;
num6 += num * bulger;
if (num6 >= num15)
{
num6 = num15;
}
if (num6 >= num15 + zbr)
{
num6 = num15 + zbr;
}
}
}
if (axis == MegaAxis.Y)
{
if (!FlipAxis)
{
float num16 = min.y + (num5 - min.y) * ooysize * flatness;
num5 -= num * bulger;
if (num5 <= num16)
{
num5 = num16;
}
if (num5 <= num16 + zbr)
{
num5 = num16 + zbr;
}
}
else
{
float num17 = max.y - (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 = min.x + (num4 - min.x) * ooxsize * flatness;
num4 -= num * bulger;
if (num4 <= num18)
{
num4 = num18;
}
if (num4 <= num18 + zbr)
{
num4 = num18 + zbr;
}
}
else
{
float num19 = max.x - (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 = Vector3.Lerp(a, p, t);
p = invtm.MultiplyPoint3x4(p);
return p;
}
public override bool Prepare(float decay)
{
tm = base.transform.worldToLocalMatrix;
invtm = tm.inverse;
cx = 0f;
cz = 0f;
cy = 0f;
xsize = Width;
ysize = Height;
zsize = Length;
ooxsize = 1f / xsize;
ooysize = 1f / ysize;
oozsize = 1f / zsize;
size = ((!(xsize > ysize)) ? ysize : xsize);
size = ((!(zsize > size)) ? size : zsize);
size /= 2f;
min.x = (0f - Width) * 0.5f;
min.z = (0f - Length) * 0.5f;
min.y = 0f;
max.x = Width * 0.5f;
max.z = Length * 0.5f;
max.y = Height;
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;
totaldecay = Decay + decay;
if (totaldecay < 0f)
{
totaldecay = 0f;
}
return true;
}
}