210 lines
4.6 KiB
C#
210 lines
4.6 KiB
C#
|
namespace Fusion.Addons.KCC
|
||
|
{
|
||
|
using UnityEngine;
|
||
|
|
||
|
public sealed class KCCOverlapInfo
|
||
|
{
|
||
|
// PUBLIC MEMBERS
|
||
|
|
||
|
public Vector3 Position;
|
||
|
public float Radius;
|
||
|
public float Height;
|
||
|
public float Extent;
|
||
|
public LayerMask LayerMask;
|
||
|
public QueryTriggerInteraction TriggerInteraction;
|
||
|
public KCCOverlapHit[] AllHits;
|
||
|
public int AllHitCount;
|
||
|
public KCCOverlapHit[] ColliderHits;
|
||
|
public int ColliderHitCount;
|
||
|
public KCCOverlapHit[] TriggerHits;
|
||
|
public int TriggerHitCount;
|
||
|
|
||
|
// CONSTRUCTORS
|
||
|
|
||
|
public KCCOverlapInfo() : this(KCC.CACHE_SIZE)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
public KCCOverlapInfo(int maxHits)
|
||
|
{
|
||
|
AllHits = new KCCOverlapHit[maxHits];
|
||
|
TriggerHits = new KCCOverlapHit[maxHits];
|
||
|
ColliderHits = new KCCOverlapHit[maxHits];
|
||
|
|
||
|
for (int i = 0; i < maxHits; ++i)
|
||
|
{
|
||
|
AllHits[i] = new KCCOverlapHit();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// PUBLIC METHODS
|
||
|
|
||
|
public bool HasCollider(Collider collider)
|
||
|
{
|
||
|
for (int i = 0, count = AllHitCount; i < count; ++i)
|
||
|
{
|
||
|
KCCOverlapHit hit = AllHits[i];
|
||
|
if (object.ReferenceEquals(hit.Collider, collider) == true)
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
public bool HasCollider(EColliderType colliderType)
|
||
|
{
|
||
|
for (int i = 0, count = AllHitCount; i < count; ++i)
|
||
|
{
|
||
|
KCCOverlapHit hit = AllHits[i];
|
||
|
if (hit.Type == colliderType)
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
public bool HasColliderWithinExtent(Collider collider)
|
||
|
{
|
||
|
for (int i = 0, count = AllHitCount; i < count; ++i)
|
||
|
{
|
||
|
KCCOverlapHit hit = AllHits[i];
|
||
|
if (object.ReferenceEquals(hit.Collider, collider) == true && hit.IsWithinExtent == true)
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
public bool HasColliderWithinExtent(EColliderType colliderType)
|
||
|
{
|
||
|
for (int i = 0, count = AllHitCount; i < count; ++i)
|
||
|
{
|
||
|
KCCOverlapHit hit = AllHits[i];
|
||
|
if (hit.Type == colliderType && hit.IsWithinExtent == true)
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
public void AddHit(Collider collider)
|
||
|
{
|
||
|
if (AllHitCount == AllHits.Length)
|
||
|
return;
|
||
|
|
||
|
KCCOverlapHit hit = AllHits[AllHitCount];
|
||
|
if (hit.Set(collider) == true)
|
||
|
{
|
||
|
++AllHitCount;
|
||
|
|
||
|
if (hit.IsTrigger == true)
|
||
|
{
|
||
|
TriggerHits[TriggerHitCount] = hit;
|
||
|
++TriggerHitCount;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ColliderHits[ColliderHitCount] = hit;
|
||
|
++ColliderHitCount;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void ToggleConvexMeshColliders(bool convex)
|
||
|
{
|
||
|
KCCOverlapHit hit;
|
||
|
|
||
|
for (int i = 0; i < ColliderHitCount; ++i)
|
||
|
{
|
||
|
hit = ColliderHits[i];
|
||
|
|
||
|
if (hit.Type == EColliderType.Mesh && hit.IsConvertible == true)
|
||
|
{
|
||
|
((MeshCollider)hit.Collider).convex = convex;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public bool AllHitsWithinExtent()
|
||
|
{
|
||
|
KCCOverlapHit[] hits = AllHits;
|
||
|
for (int i = 0, count = AllHitCount; i < count; ++i)
|
||
|
{
|
||
|
if (AllHits[i].IsWithinExtent == false)
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
public void Reset(bool deep)
|
||
|
{
|
||
|
Position = default;
|
||
|
Radius = default;
|
||
|
Height = default;
|
||
|
Extent = default;
|
||
|
LayerMask = default;
|
||
|
TriggerInteraction = QueryTriggerInteraction.Collide;
|
||
|
AllHitCount = default;
|
||
|
TriggerHitCount = default;
|
||
|
ColliderHitCount = default;
|
||
|
|
||
|
if (deep == true)
|
||
|
{
|
||
|
for (int i = 0, count = AllHits.Length; i < count; ++i)
|
||
|
{
|
||
|
AllHits[i].Reset();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void CopyFromOther(KCCOverlapInfo other)
|
||
|
{
|
||
|
Position = other.Position;
|
||
|
Radius = other.Radius;
|
||
|
Height = other.Height;
|
||
|
Extent = other.Extent;
|
||
|
LayerMask = other.LayerMask;
|
||
|
TriggerInteraction = other.TriggerInteraction;
|
||
|
AllHitCount = other.AllHitCount;
|
||
|
TriggerHitCount = default;
|
||
|
ColliderHitCount = default;
|
||
|
|
||
|
KCCOverlapHit hit;
|
||
|
|
||
|
for (int i = 0; i < AllHitCount; ++i)
|
||
|
{
|
||
|
hit = AllHits[i];
|
||
|
|
||
|
hit.CopyFromOther(other.AllHits[i]);
|
||
|
|
||
|
if (hit.IsTrigger == true)
|
||
|
{
|
||
|
TriggerHits[TriggerHitCount] = hit;
|
||
|
++TriggerHitCount;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ColliderHits[ColliderHitCount] = hit;
|
||
|
++ColliderHitCount;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void DumpHits(KCC kcc)
|
||
|
{
|
||
|
if (AllHitCount <= 0)
|
||
|
return;
|
||
|
|
||
|
kcc.Log($"Overlap Hits ({AllHitCount})");
|
||
|
|
||
|
KCCOverlapHit[] hits = AllHits;
|
||
|
for (int i = 0, count = AllHitCount; i < count; ++i)
|
||
|
{
|
||
|
KCCOverlapHit hit = AllHits[i];
|
||
|
kcc.Log($"Collider: {hit.Collider.name}, Type: {hit.Type}, IsTrigger: {hit.IsTrigger}, IsConvex: {hit.IsConvex}, IsWithinExtent: {hit.IsWithinExtent}, HasPenetration: {hit.HasPenetration}, CollisionType: {hit.CollisionType}");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|