305 lines
5.6 KiB
C#
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;
|
|
}
|
|
}
|