Skip to content

Commit 34ff282

Browse files
committed
Using nonalloc API for CameraLayer and CameraLayer2D, fixed defines for 5.4+.
1 parent 55b5a0a commit 34ff282

3 files changed

Lines changed: 69 additions & 28 deletions

File tree

Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
using UnityEngine;
66
using TouchScript.Layers;
7-
#if UNITY_5_3
7+
#if UNITY_5_3_OR_NEWER
88
using UnityEngine.SceneManagement;
99
#endif
1010

@@ -20,7 +20,7 @@ public class Runner : MonoBehaviour
2020

2121
public void LoadNextLevel()
2222
{
23-
#if UNITY_5_3
23+
#if UNITY_5_3_OR_NEWER
2424
SceneManager.LoadScene((SceneManager.GetActiveScene().buildIndex + 1) % SceneManager.sceneCountInBuildSettings);
2525
#else
2626
Application.LoadLevel((Application.loadedLevel + 1)%Application.levelCount);
@@ -37,7 +37,7 @@ private void Awake()
3737

3838
layer = GetComponent<UILayer>();
3939

40-
#if UNITY_5_3
40+
#if UNITY_5_3_OR_NEWER
4141
if (SceneManager.GetActiveScene().name == "Examples" && SceneManager.sceneCountInBuildSettings > 1)
4242
#else
4343
if (Application.loadedLevelName == "Examples" && Application.levelCount > 1)

Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
* @author Valentin Simonov / http://va.lent.in/
33
*/
44

5+
using System;
56
using System.Collections.Generic;
67
using TouchScript.Hit;
78
using UnityEngine;
@@ -16,12 +17,16 @@ namespace TouchScript.Layers
1617
public class CameraLayer : CameraLayerBase
1718
{
1819
#region Private variables
19-
20+
#if UNITY_5_3_OR_NEWER
21+
private RaycastHit[] raycastHits = new RaycastHit[20];
22+
#endif
2023
private List<RaycastHit> sortedHits = new List<RaycastHit>(20);
2124
private Transform cachedTransform;
2225
private List<HitTest> tmpHitTestList = new List<HitTest>(10);
2326

24-
#endregion
27+
private RaycastHitComparer comparer;
28+
29+
#endregion
2530

2631
#region Unity methods
2732

@@ -32,26 +37,31 @@ protected override void Awake()
3237
if (!Application.isPlaying) return;
3338

3439
cachedTransform = GetComponent<Transform>();
40+
comparer = new RaycastHitComparer(cachedTransform);
3541
}
3642

37-
#endregion
43+
#endregion
3844

39-
#region Protected functions
45+
#region Protected functions
4046

4147
/// <inheritdoc />
4248
protected override LayerHitResult castRay(Ray ray, out HitData hit)
4349
{
4450
hit = default(HitData);
51+
#if UNITY_5_3_OR_NEWER
52+
var count = Physics.RaycastNonAlloc(ray, raycastHits, float.PositiveInfinity, LayerMask);
53+
#else
4554
var raycastHits = Physics.RaycastAll(ray, float.PositiveInfinity, LayerMask);
55+
var count = raycastHits.Length;
56+
#endif
4657

47-
if (raycastHits.Length == 0) return LayerHitResult.Miss;
48-
if (raycastHits.Length > 1)
58+
if (count == 0) return LayerHitResult.Miss;
59+
if (count > 1)
4960
{
50-
sortHits(raycastHits);
61+
sortHits(raycastHits, count);
5162

5263
RaycastHit raycastHit = default(RaycastHit);
53-
var i = 0;
54-
while (i < sortedHits.Count)
64+
for (var i = 0; i < count; i++)
5565
{
5666
raycastHit = sortedHits[i];
5767
switch (doHit(raycastHit, out hit))
@@ -61,7 +71,6 @@ protected override LayerHitResult castRay(Ray ray, out HitData hit)
6171
case HitTest.ObjectHitResult.Discard:
6272
return LayerHitResult.Miss;
6373
}
64-
i++;
6574
}
6675
}
6776
else
@@ -99,20 +108,33 @@ private HitTest.ObjectHitResult doHit(RaycastHit raycastHit, out HitData hit)
99108
return hitResult;
100109
}
101110

102-
private void sortHits(RaycastHit[] hits)
111+
private void sortHits(RaycastHit[] hits, int count)
103112
{
104-
var cameraPos = cachedTransform.position;
105113
sortedHits.Clear();
106-
sortedHits.AddRange(hits);
107-
sortedHits.Sort((a, b) =>
114+
for (var i = 0; i < count; i++) sortedHits.Add(hits[i]);
115+
sortedHits.Sort(comparer);
116+
}
117+
118+
#endregion
119+
120+
private class RaycastHitComparer : IComparer<RaycastHit>
121+
{
122+
private Transform transform;
123+
124+
public RaycastHitComparer(Transform transform)
108125
{
126+
this.transform = transform;
127+
}
128+
129+
public int Compare(RaycastHit a, RaycastHit b)
130+
{
131+
var cameraPos = transform.position;
109132
if (a.collider.transform == b.collider.transform) return 0;
110133
var distA = (a.point - cameraPos).sqrMagnitude;
111134
var distB = (b.point - cameraPos).sqrMagnitude;
112135
return distA < distB ? -1 : 1;
113-
});
136+
}
114137
}
115138

116-
#endregion
117139
}
118140
}

Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,14 @@ public class CameraLayer2D : CameraLayerBase
2121
[HideInInspector]
2222
private int[] layerIds = new int[0];
2323

24+
private RaycastHit2D[] raycastHits = new RaycastHit2D[20];
25+
2426
private Dictionary<int, int> layerById = new Dictionary<int, int>();
2527
private List<RaycastHit2D> sortedHits = new List<RaycastHit2D>(20);
2628
private List<HitTest> tmpHitTestList = new List<HitTest>(10);
2729

30+
private RaycastHit2DComparer comparer;
31+
2832
#endregion
2933

3034
#region Unity methods
@@ -43,6 +47,8 @@ protected virtual void OnEnable()
4347
if (layerById.ContainsKey(value)) continue;
4448
layerById.Add(value, i);
4549
}
50+
51+
comparer = new RaycastHit2DComparer(layerById);
4652
}
4753

4854
#endregion
@@ -53,12 +59,12 @@ protected virtual void OnEnable()
5359
protected override LayerHitResult castRay(Ray ray, out HitData hit)
5460
{
5561
hit = default(HitData);
56-
var raycastHits = Physics2D.GetRayIntersectionAll(ray, float.PositiveInfinity, LayerMask);
62+
var count = Physics2D.GetRayIntersectionNonAlloc(ray, raycastHits, float.PositiveInfinity, LayerMask);
5763

58-
if (raycastHits.Length == 0) return LayerHitResult.Miss;
59-
if (raycastHits.Length > 1)
64+
if (count == 0) return LayerHitResult.Miss;
65+
if (count > 1)
6066
{
61-
sortHits(raycastHits);
67+
sortHits(raycastHits, count);
6268

6369
RaycastHit2D raycastHit = default(RaycastHit2D);
6470
var i = 0;
@@ -111,11 +117,25 @@ private HitTest.ObjectHitResult doHit(RaycastHit2D raycastHit, out HitData hit)
111117
return hitResult;
112118
}
113119

114-
private void sortHits(RaycastHit2D[] hits)
120+
private void sortHits(RaycastHit2D[] hits, int count)
115121
{
116122
sortedHits.Clear();
117-
sortedHits.AddRange(hits);
118-
sortedHits.Sort((a, b) =>
123+
for (var i = 0; i < count; i++) sortedHits.Add(hits[i]);
124+
sortedHits.Sort(comparer);
125+
}
126+
127+
#endregion
128+
129+
private class RaycastHit2DComparer : IComparer<RaycastHit2D>
130+
{
131+
private Dictionary<int, int> layerById;
132+
133+
public RaycastHit2DComparer(Dictionary<int, int> layerById)
134+
{
135+
this.layerById = layerById;
136+
}
137+
138+
public int Compare(RaycastHit2D a, RaycastHit2D b)
119139
{
120140
if (a.collider.transform == b.collider.transform) return 0;
121141

@@ -133,9 +153,8 @@ private void sortHits(RaycastHit2D[] hits)
133153
}
134154

135155
return a.distance < b.distance ? -1 : 1;
136-
});
156+
}
137157
}
138158

139-
#endregion
140159
}
141160
}

0 commit comments

Comments
 (0)