Created
April 9, 2019 13:16
-
-
Save glitchersgames/8d8da6c27d8a6b388050a5f90b40c074 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.Collections.Generic; | |
using UnityEngine.UI; | |
namespace UnityEngine.EventSystems | |
{ | |
/// <summary> | |
/// Simple event system using physics raycasts. | |
/// </summary> | |
[AddComponentMenu("Event/Physics Raycaster (Fixed)")] | |
[RequireComponent(typeof(Camera))] | |
public class FixedPhysicsRaycaster : BaseRaycaster | |
{ | |
/// <summary> | |
/// Const to use for clarity when no event mask is set | |
/// </summary> | |
protected const int kNoEventMaskSet = -1; | |
protected Camera m_EventCamera; | |
/// <summary> | |
/// Layer mask used to filter events. Always combined with the camera's culling mask if a camera is used. | |
/// </summary> | |
[SerializeField] | |
protected LayerMask m_EventMask = kNoEventMaskSet; | |
/// <summary> | |
/// The max number of intersections allowed. 0 = allocating version anything else is non alloc. | |
/// </summary> | |
[SerializeField] | |
protected int m_MaxRayIntersections = 0; | |
protected int m_LastMaxRayIntersections = 0; | |
RaycastHit[] m_Hits; | |
protected FixedPhysicsRaycaster() | |
{ } | |
public override Camera eventCamera | |
{ | |
get | |
{ | |
if (m_EventCamera == null) | |
m_EventCamera = GetComponent<Camera>(); | |
return m_EventCamera ?? Camera.main; | |
} | |
} | |
/// <summary> | |
/// Depth used to determine the order of event processing. | |
/// </summary> | |
public virtual int depth | |
{ | |
get { return (eventCamera != null) ? (int)eventCamera.depth : 0xFFFFFF; } | |
} | |
/// <summary> | |
/// Event mask used to determine which objects will receive events. | |
/// </summary> | |
public int finalEventMask | |
{ | |
get { return (eventCamera != null) ? eventCamera.cullingMask & m_EventMask : kNoEventMaskSet; } | |
} | |
/// <summary> | |
/// Layer mask used to filter events. Always combined with the camera's culling mask if a camera is used. | |
/// </summary> | |
public LayerMask eventMask | |
{ | |
get { return m_EventMask; } | |
set { m_EventMask = value; } | |
} | |
public int maxRayIntersections | |
{ | |
get { return m_MaxRayIntersections; } | |
set { m_MaxRayIntersections = value; } | |
} | |
protected void ComputeRayAndDistance(PointerEventData eventData, out Ray ray, out float distanceToClipPlane) | |
{ | |
ray = eventCamera.ScreenPointToRay(eventData.position); | |
// compensate far plane distance - see MouseEvents.cs | |
float projectionDirection = ray.direction.z; | |
distanceToClipPlane = Mathf.Approximately(0.0f, projectionDirection) | |
? Mathf.Infinity | |
: Mathf.Abs((eventCamera.farClipPlane - eventCamera.nearClipPlane) / projectionDirection); | |
} | |
public override void Raycast(PointerEventData eventData, List<RaycastResult> resultAppendList) | |
{ | |
// Cull ray casts that are outside of the view rect. (case 636595) | |
if (eventCamera == null || !eventCamera.pixelRect.Contains(eventData.position)) | |
return; | |
Ray ray; | |
float distanceToClipPlane; | |
ComputeRayAndDistance(eventData, out ray, out distanceToClipPlane); | |
int hitCount = 0; | |
if (m_MaxRayIntersections == 0) | |
{ | |
m_Hits = Physics.RaycastAll(ray, distanceToClipPlane, finalEventMask); | |
hitCount = m_Hits.Length; | |
} | |
else | |
{ | |
if (m_LastMaxRayIntersections != m_MaxRayIntersections) | |
{ | |
m_Hits = new RaycastHit[m_MaxRayIntersections]; | |
m_LastMaxRayIntersections = m_MaxRayIntersections; | |
} | |
hitCount = Physics.RaycastNonAlloc(ray, m_Hits, distanceToClipPlane, finalEventMask); | |
} | |
if (hitCount > 1) | |
System.Array.Sort(m_Hits, (r1, r2) => r1.distance.CompareTo(r2.distance)); | |
if (hitCount != 0) | |
{ | |
for (int b = 0, bmax = hitCount; b < bmax; ++b) | |
{ | |
var result = new RaycastResult | |
{ | |
gameObject = (m_Hits[b].collider ? m_Hits[b].collider.gameObject : null), | |
module = this, | |
distance = m_Hits[b].distance, | |
worldPosition = m_Hits[b].point, | |
worldNormal = m_Hits[b].normal, | |
screenPosition = eventData.position, | |
index = resultAppendList.Count, | |
sortingLayer = 0, | |
sortingOrder = 0 | |
}; | |
resultAppendList.Add(result); | |
} | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment