122 lines
2.5 KiB
C#
122 lines
2.5 KiB
C#
using UnityEngine;
|
|
|
|
[AddComponentMenu("Modifiers/Hit")]
|
|
public class MegaHitDeform : MegaModifier
|
|
{
|
|
public float hitradius = 1f;
|
|
|
|
public float Hardness = 0.5f;
|
|
|
|
public float deformlimit = 0.1f;
|
|
|
|
public float scaleforce = 1000f;
|
|
|
|
public float maxForce = 1f;
|
|
|
|
private Vector3[] offsets;
|
|
|
|
private float msize;
|
|
|
|
public override string ModName()
|
|
{
|
|
return "Hit Deform";
|
|
}
|
|
|
|
public override void Modify(MegaModifiers mc)
|
|
{
|
|
if (offsets != null)
|
|
{
|
|
for (int i = 0; i < sverts.Length; i++)
|
|
{
|
|
sverts[i] = verts[i] + offsets[i];
|
|
}
|
|
}
|
|
}
|
|
|
|
public void Deform(Vector3 point, Vector3 normal, float force)
|
|
{
|
|
force = Mathf.Min(maxForce, force);
|
|
if (!(force > 0.01f))
|
|
{
|
|
return;
|
|
}
|
|
float num = force * (msize * (0.1f / Mathf.Max(0.1f, Hardness)));
|
|
float num2 = deformlimit;
|
|
float num3 = num2 * num2;
|
|
Vector3 vector = base.transform.InverseTransformPoint(point);
|
|
Vector3 vector2 = base.transform.InverseTransformDirection(normal);
|
|
for (int i = 0; i < verts.Length; i++)
|
|
{
|
|
float sqrMagnitude = (verts[i] + offsets[i] - vector).sqrMagnitude;
|
|
if (!(sqrMagnitude <= num))
|
|
{
|
|
continue;
|
|
}
|
|
Vector3 vector3 = vector2 * (1f - sqrMagnitude / num) * num;
|
|
offsets[i] += vector3;
|
|
if (deformlimit > 0f)
|
|
{
|
|
vector3 = offsets[i];
|
|
sqrMagnitude = vector3.sqrMagnitude;
|
|
if (sqrMagnitude > num3)
|
|
{
|
|
offsets[i] = vector3 * (num2 / vector3.magnitude);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void Deform(Collision collision)
|
|
{
|
|
float num = Mathf.Min(maxForce, collision.impactForceSum.sqrMagnitude / scaleforce);
|
|
if (num > 0.01f)
|
|
{
|
|
ContactPoint[] contacts = collision.contacts;
|
|
for (int i = 0; i < contacts.Length; i++)
|
|
{
|
|
Deform(contacts[i].point, contacts[i].normal, num);
|
|
}
|
|
}
|
|
}
|
|
|
|
public override bool ModLateUpdate(MegaModContext mc)
|
|
{
|
|
return Prepare(mc);
|
|
}
|
|
|
|
public override bool Prepare(MegaModContext mc)
|
|
{
|
|
if (offsets == null || offsets.Length != mc.mod.verts.Length)
|
|
{
|
|
offsets = new Vector3[mc.mod.verts.Length];
|
|
}
|
|
msize = MegaUtils.SmallestValue(mc.bbox.Size());
|
|
return true;
|
|
}
|
|
|
|
public void Repair(float repair)
|
|
{
|
|
Repair(repair, Vector3.zero, 0f);
|
|
}
|
|
|
|
public void Repair(float repair, Vector3 point, float radius)
|
|
{
|
|
point = base.transform.InverseTransformPoint(point);
|
|
float num = radius * radius;
|
|
for (int i = 0; i < offsets.Length && (!(radius > 0f) || !((point - verts[i]).sqrMagnitude >= num)); i++)
|
|
{
|
|
offsets[i] *= repair;
|
|
}
|
|
}
|
|
|
|
public void OnCollisionEnter(Collision collision)
|
|
{
|
|
Deform(collision);
|
|
}
|
|
|
|
public void OnCollisionStay(Collision collision)
|
|
{
|
|
Deform(collision);
|
|
}
|
|
}
|