AR Design
UBC EML collab with UBC SALA - visualizing IoT data in AR
RaycastResultComparer.cs
Go to the documentation of this file.
1 // Copyright (c) Microsoft Corporation. All rights reserved.
2 // Licensed under the MIT License. See LICENSE in the project root for license information.
3 
4 using System;
5 using System.Collections.Generic;
6 using UnityEngine.EventSystems;
7 
8 namespace HoloToolkit.Unity
9 {
11  {
12  public readonly int LayerMaskIndex;
13  public readonly RaycastResult RaycastResult;
14 
15  public ComparableRaycastResult(RaycastResult raycastResult, int layerMaskIndex = 0)
16  {
17  RaycastResult = raycastResult;
18  LayerMaskIndex = layerMaskIndex;
19  }
20  }
21 
22  public class RaycastResultComparer : IComparer<ComparableRaycastResult>
23  {
24  private static readonly List<Func<ComparableRaycastResult, ComparableRaycastResult, int>> Comparers = new List<Func<ComparableRaycastResult, ComparableRaycastResult, int>>
25  {
26  CompareRaycastsByLayerMaskPrioritization,
27  CompareRaycastsBySortingLayer,
28  CompareRaycastsBySortingOrder,
29  CompareRaycastsByCanvasDepth,
30  CompareRaycastsByDistance,
31  };
32 
34  {
35  for (var i = 0; i < Comparers.Count; i++)
36  {
37  var result = Comparers[i](left, right);
38  if (result != 0)
39  {
40  return result;
41  }
42  }
43  return 0;
44  }
45 
46  private static int CompareRaycastsByLayerMaskPrioritization(ComparableRaycastResult left, ComparableRaycastResult right)
47  {
48  //Lower is better, -1 is not relevant
49  return right.LayerMaskIndex.CompareTo(left.LayerMaskIndex);
50  }
51 
52  private static int CompareRaycastsBySortingLayer(ComparableRaycastResult left, ComparableRaycastResult right)
53  {
54  //Higher is better
55  return left.RaycastResult.sortingLayer.CompareTo(right.RaycastResult.sortingLayer);
56  }
57 
58  private static int CompareRaycastsBySortingOrder(ComparableRaycastResult left, ComparableRaycastResult right)
59  {
60  //Higher is better
61  return left.RaycastResult.sortingOrder.CompareTo(right.RaycastResult.sortingOrder);
62  }
63 
64  private static int CompareRaycastsByCanvasDepth(ComparableRaycastResult left, ComparableRaycastResult right)
65  {
66  //Module is the graphic raycaster on the canvases.
67  if (left.RaycastResult.module.transform.IsParentOrChildOf(right.RaycastResult.module.transform))
68  {
69  //Higher is better
70  return left.RaycastResult.depth.CompareTo(right.RaycastResult.depth);
71  }
72  return 0;
73  }
74 
75  private static int CompareRaycastsByDistance(ComparableRaycastResult left, ComparableRaycastResult right)
76  {
77  //Lower is better
78  return right.RaycastResult.distance.CompareTo(left.RaycastResult.distance);
79  }
80  }
81 }
ComparableRaycastResult(RaycastResult raycastResult, int layerMaskIndex=0)
int Compare(ComparableRaycastResult left, ComparableRaycastResult right)