102 lines
2.2 KiB
C#
102 lines
2.2 KiB
C#
using UnityEngine;
|
|
|
|
[AddComponentMenu("Modifiers/Bulge")]
|
|
public class MegaBulge : MegaModifier
|
|
{
|
|
public Vector3 Amount = Vector3.zero;
|
|
|
|
public Vector3 FallOff = Vector3.zero;
|
|
|
|
public bool LinkFallOff = true;
|
|
|
|
private Vector3 per = Vector3.zero;
|
|
|
|
private float xsize;
|
|
|
|
private float ysize;
|
|
|
|
private float zsize;
|
|
|
|
private float size;
|
|
|
|
private float cx;
|
|
|
|
private float cy;
|
|
|
|
private float cz;
|
|
|
|
private Vector3 dcy = Vector3.zero;
|
|
|
|
public override string ModName()
|
|
{
|
|
return "Bulge";
|
|
}
|
|
|
|
public override string GetHelpURL()
|
|
{
|
|
return "?page_id=163";
|
|
}
|
|
|
|
public override Vector3 Map(int i, Vector3 p)
|
|
{
|
|
p = tm.MultiplyPoint3x4(p);
|
|
float num = p.x - cx;
|
|
float num2 = p.y - cy;
|
|
float num3 = p.z - cz;
|
|
if (num == 0f && num2 == 0f && num3 == 0f)
|
|
{
|
|
num = (num2 = (num3 = 1f));
|
|
}
|
|
float num4 = Mathf.Sqrt(num * num + num2 * num2 + num3 * num3);
|
|
float num5 = size / num4;
|
|
dcy.x = Mathf.Exp((0f - FallOff.x) * Mathf.Abs(num));
|
|
if (!LinkFallOff)
|
|
{
|
|
dcy.y = Mathf.Exp((0f - FallOff.y) * Mathf.Abs(num2));
|
|
dcy.z = Mathf.Exp((0f - FallOff.z) * Mathf.Abs(num3));
|
|
}
|
|
else
|
|
{
|
|
dcy.y = (dcy.z = dcy.x);
|
|
}
|
|
p.x = cx + num + Mathf.Sign(num) * ((Mathf.Abs(num * num5) - Mathf.Abs(num)) * per.x) * dcy.x;
|
|
p.y = cy + num2 + Mathf.Sign(num2) * ((Mathf.Abs(num2 * num5) - Mathf.Abs(num2)) * per.y) * dcy.y;
|
|
p.z = cz + num3 + Mathf.Sign(num3) * ((Mathf.Abs(num3 * num5) - Mathf.Abs(num3)) * per.z) * dcy.z;
|
|
return invtm.MultiplyPoint3x4(p);
|
|
}
|
|
|
|
public override void ModStart(MegaModifiers mc)
|
|
{
|
|
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;
|
|
cx = bbox.center.x;
|
|
cy = bbox.center.y;
|
|
cz = bbox.center.z;
|
|
per = Amount / 100f;
|
|
}
|
|
|
|
public override bool ModLateUpdate(MegaModContext mc)
|
|
{
|
|
return Prepare(mc);
|
|
}
|
|
|
|
public override bool Prepare(MegaModContext mc)
|
|
{
|
|
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;
|
|
cx = bbox.center.x;
|
|
cy = bbox.center.y;
|
|
cz = bbox.center.z;
|
|
per = Amount / 100f;
|
|
return true;
|
|
}
|
|
}
|