Skip to content

Commit 434c3aa

Browse files
author
lawwong
committed
Fix Teleportable not working in some condition
1. Pointer3DInputModule doesn't clean up raycaster correctly when raycaster disabled if OnDisable happened earlier then InputModule update process. 2. The clean up process should not reset raycast result before event handling. This causes PointerExit handler getting empty raycast result.
1 parent c2f45c7 commit 434c3aa

File tree

3 files changed

+57
-25
lines changed

3 files changed

+57
-25
lines changed

Assets/HTC.UnityPlugin/Pointer3D/Pointer3DInputModule.cs

Lines changed: 52 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class Pointer3DInputModule : BaseInputModule
1414
private static bool isApplicationQuitting = false;
1515

1616
private static readonly IndexedSet<Pointer3DRaycaster> raycasters = new IndexedSet<Pointer3DRaycaster>();
17-
private static readonly List<Pointer3DRaycaster> processingRaycasters = new List<Pointer3DRaycaster>();
17+
private static IndexedSet<Pointer3DRaycaster> processingRaycasters = new IndexedSet<Pointer3DRaycaster>();
1818
private static int validEventDataId = PointerInputModule.kFakeTouchesId - 1;
1919

2020
#if UNITY_5_5_OR_NEWER
@@ -138,7 +138,7 @@ protected override void OnDisable()
138138
{
139139
base.OnDisable();
140140

141-
if (Active)
141+
if (Active && processingRaycasters.Count == 0)
142142
{
143143
for (var i = raycasters.Count - 1; i >= 0; --i)
144144
{
@@ -210,22 +210,28 @@ public static void AddRaycaster(Pointer3DRaycaster raycaster)
210210
raycasters.AddUnique(raycaster);
211211
}
212212

213-
public static void RemoveRaycasters(Pointer3DRaycaster raycaster)
213+
public static void RemoveRaycaster(Pointer3DRaycaster raycaster)
214214
{
215-
raycasters.Remove(raycaster);
215+
if (!raycasters.Remove(raycaster)) { return; }
216+
217+
if (!processingRaycasters.Contains(raycaster) && Active)
218+
{
219+
Instance.CleanUpRaycaster(raycaster);
220+
}
216221
}
217222

223+
[Obsolete("Use RemoveRaycaster instead")]
224+
public static void RemoveRaycasters(Pointer3DRaycaster raycaster) { RemoveRaycaster(raycaster); }
225+
218226
protected void CleanUpRaycaster(Pointer3DRaycaster raycaster)
219227
{
220-
raycaster.CleanUpRaycast();
221-
222228
var hoverEventData = raycaster.HoverEventData;
223229

224-
// hover event
225-
hoverEventData.pointerCurrentRaycast = default(RaycastResult);
230+
hoverEventData.Reset();
226231

227232
if (hoverEventData.pointerEnter != null)
228233
{
234+
hoverEventData.pointerEnter = null;
229235
HandlePointerExitAndEnter(hoverEventData, null);
230236
}
231237

@@ -236,15 +242,26 @@ protected void CleanUpRaycaster(Pointer3DRaycaster raycaster)
236242
if (buttonEventData == null) { continue; }
237243

238244
buttonEventData.Reset();
239-
buttonEventData.pointerCurrentRaycast = default(RaycastResult);
240245

241246
ProcessPressUp(buttonEventData);
242247

243248
if (buttonEventData.pointerEnter != null)
244249
{
250+
hoverEventData.pointerEnter = null;
245251
HandlePointerExitAndEnter(buttonEventData, null);
246252
}
247253
}
254+
255+
raycaster.CleanUpRaycast();
256+
257+
for (int i = 0, imax = raycaster.ButtonEventDataList.Count; i < imax; ++i)
258+
{
259+
raycaster.ButtonEventDataList[i].pointerPressRaycast = default(RaycastResult);
260+
raycaster.ButtonEventDataList[i].pointerCurrentRaycast = default(RaycastResult);
261+
}
262+
263+
hoverEventData.pointerPressRaycast = default(RaycastResult);
264+
hoverEventData.pointerCurrentRaycast = default(RaycastResult);
248265
}
249266

250267
protected virtual void ProcessRaycast()
@@ -254,13 +271,20 @@ protected virtual void ProcessRaycast()
254271

255272
// use another list to iterate raycasters
256273
// incase that raycasters may changed during this process cycle
257-
processingRaycasters.AddRange(raycasters);
274+
for (int i = 0, imax = raycasters.Count; i < imax; ++i)
275+
{
276+
var r = raycasters[i];
277+
278+
if (r != null)
279+
{
280+
processingRaycasters.Add(r);
281+
}
282+
}
283+
258284
for (var i = processingRaycasters.Count - 1; i >= 0; --i)
259285
{
260286
var raycaster = processingRaycasters[i];
261287

262-
if (raycaster == null || !raycaster.isActiveAndEnabled) { continue; }
263-
264288
raycaster.Raycast();
265289
var result = raycaster.FirstRaycastResult();
266290

@@ -321,10 +345,24 @@ protected virtual void ProcessRaycast()
321345
var scrollHandler = ExecuteEvents.GetEventHandler<IScrollHandler>(result.gameObject);
322346
ExecuteEvents.ExecuteHierarchy(scrollHandler, hoverEventData, ExecuteEvents.scrollHandler);
323347
}
348+
}
324349

325-
if (!raycaster.isActiveAndEnabled)
350+
if (isActiveAndEnabled)
351+
{
352+
for (var i = processingRaycasters.Count - 1; i >= 0; --i)
353+
{
354+
var r = processingRaycasters[i];
355+
if (!raycasters.Contains(r))
356+
{
357+
CleanUpRaycaster(r);
358+
}
359+
}
360+
}
361+
else
362+
{
363+
for (var i = processingRaycasters.Count - 1; i >= 0; --i)
326364
{
327-
CleanUpRaycaster(raycaster);
365+
CleanUpRaycaster(processingRaycasters[i]);
328366
}
329367
}
330368

Assets/HTC.UnityPlugin/Pointer3D/Raycaster/Pointer3DRaycaster.cs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -100,25 +100,19 @@ protected override void Start()
100100
SetLagacyRaycastMode(m_raycastMode);
101101
m_raycastMode = RaycastMode.DefaultRaycast;
102102
}
103-
104-
Pointer3DInputModule.AddRaycaster(this);
105103
}
106104

107105
// override OnEnable & OnDisable on purpose so that this BaseRaycaster won't be registered into RaycasterManager
108106
protected override void OnEnable()
109107
{
110108
//base.OnEnable();
109+
Pointer3DInputModule.AddRaycaster(this);
111110
}
112111

113112
protected override void OnDisable()
114113
{
115114
//base.OnDisable();
116-
}
117-
118-
protected override void OnDestroy()
119-
{
120-
base.OnDestroy();
121-
Pointer3DInputModule.RemoveRaycasters(this);
115+
Pointer3DInputModule.RemoveRaycaster(this);
122116
}
123117

124118
public virtual void CleanUpRaycast()

Assets/HTC.UnityPlugin/ViveInputUtility/Scripts/Misc/Teleportable.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,12 @@ public void OnPointerExit(PointerEventData eventData)
6666
// skip if it was teleporting
6767
if (teleportCoroutine != null) { return; }
6868

69+
// don't teleport if it was not releasing the button
70+
if (eventData.eligibleForClick) { return; }
71+
6972
VivePointerEventData viveEventData;
7073
if (!eventData.TryGetViveButtonEventData(out viveEventData)) { return; }
7174

72-
// don't teleport if it was not releasing the button
73-
if (viveEventData.eligibleForClick) { return; }
74-
7575
if (viveEventData.viveButton != teleportViveButton) { return; }
7676

7777
var hitResult = eventData.pointerCurrentRaycast;

0 commit comments

Comments
 (0)