// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. using System; using System.Collections.Generic; namespace Microsoft.MixedReality.Toolkit.Physics { /// /// Compares the Raycast Results from Unity's Graphic & Physics Raycasters. /// public class RaycastResultComparer : IComparer { private static readonly List> comparers = new List> { CompareRaycastsByLayerMaskPrioritization, CompareRaycastsBySortingLayer, CompareRaycastsBySortingOrder, CompareRaycastsByCanvasDepth, CompareRaycastsByDistance, }; protected virtual List> Comparers { get { return comparers; } } public int Compare(ComparableRaycastResult left, ComparableRaycastResult right) { for (var i = 0; i < Comparers.Count; i++) { var result = Comparers[i](left, right); if (result != 0) { return result; } } return 0; } protected static int CompareRaycastsByLayerMaskPrioritization(ComparableRaycastResult left, ComparableRaycastResult right) { // Lower is better, -1 is not relevant. return right.LayerMaskIndex.CompareTo(left.LayerMaskIndex); } protected static int CompareRaycastsBySortingLayer(ComparableRaycastResult left, ComparableRaycastResult right) { // Higher is better. return left.RaycastResult.sortingLayer.CompareTo(right.RaycastResult.sortingLayer); } protected static int CompareRaycastsBySortingOrder(ComparableRaycastResult left, ComparableRaycastResult right) { // Higher is better. return left.RaycastResult.sortingOrder.CompareTo(right.RaycastResult.sortingOrder); } protected static int CompareRaycastsByCanvasDepth(ComparableRaycastResult left, ComparableRaycastResult right) { // Module is the graphic raycaster on the canvases. if (left.RaycastResult.module.transform.IsParentOrChildOf(right.RaycastResult.module.transform)) { // Higher is better. return left.RaycastResult.depth.CompareTo(right.RaycastResult.depth); } return 0; } protected static int CompareRaycastsByDistance(ComparableRaycastResult left, ComparableRaycastResult right) { // Lower is better. return right.RaycastResult.distance.CompareTo(left.RaycastResult.distance); } } }