129 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			129 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | namespace Fusion.Addons.KCC | ||
|  | { | ||
|  | 	using System; | ||
|  | 	using UnityEngine; | ||
|  | 
 | ||
|  | 	public sealed class KCCOverlapHit | ||
|  | 	{ | ||
|  | 		// PUBLIC MEMBERS | ||
|  | 
 | ||
|  | 		public EColliderType  Type; | ||
|  | 		public Collider       Collider; | ||
|  | 		public Transform      Transform; | ||
|  | 		public bool           IsConvex; | ||
|  | 		public bool           IsTrigger; | ||
|  | 		public bool           IsPrimitive; | ||
|  | 		public bool           IsConvertible; | ||
|  | 		public bool           IsWithinExtent; | ||
|  | 		public bool           HasPenetration; | ||
|  | 		public float          MaxPenetration; | ||
|  | 		public float          UpDirectionDot; | ||
|  | 		public ECollisionType CollisionType; | ||
|  | 		public Vector3        CachedPosition; // Used internally for depenetration. Do not use! | ||
|  | 		public Quaternion     CachedRotation; // Used internally for depenetration. Do not use! | ||
|  | 
 | ||
|  | 		// PRIVATE MEMBERS | ||
|  | 
 | ||
|  | 		private static readonly Type SphereColliderType  = typeof(SphereCollider); | ||
|  | 		private static readonly Type CapsuleColliderType = typeof(CapsuleCollider); | ||
|  | 		private static readonly Type BoxColliderType     = typeof(BoxCollider); | ||
|  | 		private static readonly Type MeshColliderType    = typeof(MeshCollider); | ||
|  | #if !KCC_DISABLE_TERRAIN | ||
|  | 		private static readonly Type TerrainColliderType = typeof(TerrainCollider); | ||
|  | #endif | ||
|  | 
 | ||
|  | 		// PUBLIC METHODS | ||
|  | 
 | ||
|  | 		public bool IsValid() => Type != EColliderType.None; | ||
|  | 
 | ||
|  | 		public bool Set(Collider collider) | ||
|  | 		{ | ||
|  | 			Type colliderType = collider.GetType(); | ||
|  | 
 | ||
|  | 			if (colliderType == BoxColliderType) | ||
|  | 			{ | ||
|  | 				Type          = EColliderType.Box; | ||
|  | 				IsConvex      = true; | ||
|  | 				IsPrimitive   = true; | ||
|  | 				IsConvertible = false; | ||
|  | 			} | ||
|  | 			else if (colliderType == MeshColliderType) | ||
|  | 			{ | ||
|  | 				MeshCollider meshCollider = (MeshCollider)collider; | ||
|  | 
 | ||
|  | 				Type          = EColliderType.Mesh; | ||
|  | 				IsConvex      = meshCollider.convex; | ||
|  | 				IsPrimitive   = false; | ||
|  | 				IsConvertible = false; | ||
|  | 
 | ||
|  | 				if (IsConvex == true) | ||
|  | 				{ | ||
|  | 					Mesh mesh = meshCollider.sharedMesh; | ||
|  | 					IsConvertible = mesh != null && mesh.isReadable == true; | ||
|  | 				} | ||
|  | 			} | ||
|  | #if !KCC_DISABLE_TERRAIN | ||
|  | 			else if (colliderType == TerrainColliderType) | ||
|  | 			{ | ||
|  | 				Type          = EColliderType.Terrain; | ||
|  | 				IsConvex      = false; | ||
|  | 				IsPrimitive   = false; | ||
|  | 				IsConvertible = false; | ||
|  | 			} | ||
|  | #endif | ||
|  | 			else if (colliderType == SphereColliderType) | ||
|  | 			{ | ||
|  | 				Type          = EColliderType.Sphere; | ||
|  | 				IsConvex      = true; | ||
|  | 				IsPrimitive   = true; | ||
|  | 				IsConvertible = false; | ||
|  | 			} | ||
|  | 			else if (colliderType == CapsuleColliderType) | ||
|  | 			{ | ||
|  | 				Type          = EColliderType.Capsule; | ||
|  | 				IsConvex      = true; | ||
|  | 				IsPrimitive   = true; | ||
|  | 				IsConvertible = false; | ||
|  | 			} | ||
|  | 			else | ||
|  | 			{ | ||
|  | 				return false; | ||
|  | 			} | ||
|  | 
 | ||
|  | 			Collider       = collider; | ||
|  | 			Transform      = collider.transform; | ||
|  | 			IsTrigger      = collider.isTrigger; | ||
|  | 			IsWithinExtent = default; | ||
|  | 			HasPenetration = default; | ||
|  | 			MaxPenetration = default; | ||
|  | 			UpDirectionDot = default; | ||
|  | 			CollisionType  = default; | ||
|  | 
 | ||
|  | 			return true; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		public void Reset() | ||
|  | 		{ | ||
|  | 			Type      = EColliderType.None; | ||
|  | 			Collider  = default; | ||
|  | 			Transform = default; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		public void CopyFromOther(KCCOverlapHit other) | ||
|  | 		{ | ||
|  | 			Type           = other.Type; | ||
|  | 			Collider       = other.Collider; | ||
|  | 			Transform      = other.Transform; | ||
|  | 			IsConvex       = other.IsConvex; | ||
|  | 			IsTrigger      = other.IsTrigger; | ||
|  | 			IsPrimitive    = other.IsPrimitive; | ||
|  | 			IsConvertible  = other.IsConvertible; | ||
|  | 			IsWithinExtent = other.IsWithinExtent; | ||
|  | 			HasPenetration = other.HasPenetration; | ||
|  | 			MaxPenetration = other.MaxPenetration; | ||
|  | 			UpDirectionDot = other.UpDirectionDot; | ||
|  | 			CollisionType  = other.CollisionType; | ||
|  | 		} | ||
|  | 	} | ||
|  | } |