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