Skip to content

Commit a2f73e5

Browse files
author
lawwong
committed
Let Pointer3DInputModule event behaviour more consistent with StandaloneInputModule
Also add some debug message that can be shown in EventSystem preview window. Add Press Enter/Exit event: - IPointer3DPressEnterHandler - IPointer3DPressExitHandler Their behaviours are like IPointerEnterHandler/IPointerExitHandler, but press enter happend when the button is pressed and moved in, and press exit on button released or pointer moved out.
1 parent e78c660 commit a2f73e5

File tree

8 files changed

+253
-88
lines changed

8 files changed

+253
-88
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
//========= Copyright 2016-2017, HTC Corporation. All rights reserved. ===========
2+
3+
using UnityEngine.EventSystems;
4+
5+
namespace HTC.UnityPlugin.Pointer3D
6+
{
7+
public static class ExecutePointer3DEvents
8+
{
9+
public static readonly ExecuteEvents.EventFunction<IPointer3DPressEnterHandler> PressEnterHandler = Execute;
10+
private static void Execute(IPointer3DPressEnterHandler handler, BaseEventData eventData)
11+
{
12+
handler.OnPointer3DPressEnter(ExecuteEvents.ValidateEventData<Pointer3DEventData>(eventData));
13+
}
14+
15+
public static readonly ExecuteEvents.EventFunction<IPointer3DPressExitHandler> PressExitHandler = Execute;
16+
private static void Execute(IPointer3DPressExitHandler handler, BaseEventData eventData)
17+
{
18+
handler.OnPointer3DPressExit(ExecuteEvents.ValidateEventData<Pointer3DEventData>(eventData));
19+
}
20+
}
21+
}

Assets/HTC.UnityPlugin/Pointer3D/ExecutePointer3DEvents.cs.meta

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/HTC.UnityPlugin/Pointer3D/Pointer3DEventData.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ public class Pointer3DEventData : PointerEventData
6565
public Quaternion pressRotation;
6666

6767
public float pressDistance;
68+
public GameObject pressEnter;
6869

6970
public Pointer3DEventData(Pointer3DRaycaster ownerRaycaster, EventSystem eventSystem) : base(eventSystem)
7071
{
@@ -77,5 +78,17 @@ public Pointer3DEventData(Pointer3DRaycaster ownerRaycaster, EventSystem eventSy
7778
public virtual bool GetPressDown() { return false; }
7879

7980
public virtual bool GetPressUp() { return false; }
81+
82+
public override string ToString()
83+
{
84+
var str = string.Empty;
85+
str += "eligibleForClick: " + eligibleForClick + "\n";
86+
str += "pointerEnter: " + Pointer3DInputModule.PrintGOPath(pointerEnter) + "\n";
87+
str += "pointerPress: " + Pointer3DInputModule.PrintGOPath(pointerPress) + "\n";
88+
str += "lastPointerPress: " + Pointer3DInputModule.PrintGOPath(lastPress) + "\n";
89+
str += "pressEnter: " + Pointer3DInputModule.PrintGOPath(pressEnter) + "\n";
90+
str += "pointerDrag: " + Pointer3DInputModule.PrintGOPath(pointerDrag) + "\n";
91+
return str;
92+
}
8093
}
8194
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
//========= Copyright 2016-2017, HTC Corporation. All rights reserved. ===========
2+
3+
using UnityEngine.EventSystems;
4+
5+
namespace HTC.UnityPlugin.Pointer3D
6+
{
7+
public interface IPointer3DPressEnterHandler : IEventSystemHandler
8+
{
9+
void OnPointer3DPressEnter(Pointer3DEventData eventData);
10+
}
11+
12+
public interface IPointer3DPressExitHandler : IEventSystemHandler
13+
{
14+
void OnPointer3DPressExit(Pointer3DEventData eventData);
15+
}
16+
}

Assets/HTC.UnityPlugin/Pointer3D/Pointer3DEventInterfaces.cs.meta

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/HTC.UnityPlugin/Pointer3D/Pointer3DInputModule.cs

Lines changed: 128 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -145,11 +145,6 @@ protected override void OnDisable()
145145
instance.CleanUpRaycaster(raycasters[i]);
146146
}
147147
}
148-
149-
if (eventSystem != null)
150-
{
151-
eventSystem.SetSelectedGameObject(null, GetBaseEventData());
152-
}
153148
}
154149

155150
public static readonly Comparison<RaycastResult> defaultRaycastComparer = RaycastComparer;
@@ -225,30 +220,38 @@ public static void RemoveRaycaster(Pointer3DRaycaster raycaster)
225220

226221
protected void CleanUpRaycaster(Pointer3DRaycaster raycaster)
227222
{
223+
if (raycaster == null) { return; }
224+
228225
var hoverEventData = raycaster.HoverEventData;
226+
if (hoverEventData == null || raycaster.ButtonEventDataList.Count == 0) { return; }
229227

230228
hoverEventData.Reset();
231229

232-
if (hoverEventData.pointerEnter != null)
233-
{
234-
hoverEventData.pointerEnter = null;
235-
HandlePointerExitAndEnter(hoverEventData, null);
236-
}
237-
238230
// buttons event
239231
for (int i = 0, imax = raycaster.ButtonEventDataList.Count; i < imax; ++i)
240232
{
241233
var buttonEventData = raycaster.ButtonEventDataList[i];
242-
if (buttonEventData == null) { continue; }
234+
if (buttonEventData == null || buttonEventData == hoverEventData) { continue; }
243235

244236
buttonEventData.Reset();
245237

246-
ProcessPressUp(buttonEventData);
238+
if (buttonEventData.eligibleForClick)
239+
{
240+
ProcessPressUp(buttonEventData);
241+
HandlePressExitAndEnter(buttonEventData, null);
242+
}
247243

248244
if (buttonEventData.pointerEnter != null)
249245
{
250-
hoverEventData.pointerEnter = null;
251-
HandlePointerExitAndEnter(buttonEventData, null);
246+
if (i == 0)
247+
{
248+
// perform exit event for hover event data
249+
HandlePointerExitAndEnter(buttonEventData, null);
250+
}
251+
else
252+
{
253+
buttonEventData.pointerEnter = null;
254+
}
252255
}
253256
}
254257

@@ -259,9 +262,6 @@ protected void CleanUpRaycaster(Pointer3DRaycaster raycaster)
259262
raycaster.ButtonEventDataList[i].pointerPressRaycast = default(RaycastResult);
260263
raycaster.ButtonEventDataList[i].pointerCurrentRaycast = default(RaycastResult);
261264
}
262-
263-
hoverEventData.pointerPressRaycast = default(RaycastResult);
264-
hoverEventData.pointerCurrentRaycast = default(RaycastResult);
265265
}
266266

267267
protected virtual void ProcessRaycast()
@@ -284,6 +284,10 @@ protected virtual void ProcessRaycast()
284284
for (var i = processingRaycasters.Count - 1; i >= 0; --i)
285285
{
286286
var raycaster = processingRaycasters[i];
287+
if (raycaster == null) { continue; }
288+
289+
var hoverEventData = raycaster.HoverEventData;
290+
if(hoverEventData == null || raycaster.ButtonEventDataList.Count == 0) { continue; }
287291

288292
raycaster.Raycast();
289293
var result = raycaster.FirstRaycastResult();
@@ -293,8 +297,7 @@ protected virtual void ProcessRaycast()
293297
var raycasterPos = raycaster.transform.position;
294298
var raycasterRot = raycaster.transform.rotation;
295299

296-
// hover event
297-
var hoverEventData = raycaster.HoverEventData;
300+
// gen shared data and put in hover event
298301
hoverEventData.Reset();
299302
hoverEventData.delta = Vector2.zero;
300303
hoverEventData.scrollDelta = scrollDelta;
@@ -306,16 +309,11 @@ protected virtual void ProcessRaycast()
306309
hoverEventData.rotationDelta = Quaternion.Inverse(hoverEventData.rotation) * raycasterRot;
307310
hoverEventData.rotation = raycasterRot;
308311

309-
if (hoverEventData.pointerEnter != result.gameObject)
310-
{
311-
HandlePointerExitAndEnter(hoverEventData, result.gameObject);
312-
}
313-
314-
// buttons event
312+
// copy data to other button event
315313
for (int j = 0, jmax = raycaster.ButtonEventDataList.Count; j < jmax; ++j)
316314
{
317315
var buttonEventData = raycaster.ButtonEventDataList[j];
318-
if (buttonEventData == null) { continue; }
316+
if (buttonEventData == null || buttonEventData == hoverEventData) { continue; }
319317

320318
buttonEventData.Reset();
321319
buttonEventData.delta = Vector2.zero;
@@ -327,15 +325,21 @@ protected virtual void ProcessRaycast()
327325
buttonEventData.position3D = hoverEventData.position3D;
328326
buttonEventData.rotationDelta = hoverEventData.rotationDelta;
329327
buttonEventData.rotation = hoverEventData.rotation;
328+
}
330329

331-
ProcessPress(buttonEventData);
330+
ProcessPress(hoverEventData);
331+
ProcessMove(hoverEventData);
332+
ProcessDrag(hoverEventData);
332333

333-
var hoverGO = buttonEventData.eligibleForClick ? result.gameObject : null;
334-
if (buttonEventData.pointerEnter != hoverGO)
335-
{
336-
HandlePointerExitAndEnter(buttonEventData, hoverGO);
337-
}
334+
// other buttons event
335+
for (int j = 1, jmax = raycaster.ButtonEventDataList.Count; j < jmax; ++j)
336+
{
337+
var buttonEventData = raycaster.ButtonEventDataList[j];
338+
if (buttonEventData == null || buttonEventData == hoverEventData) { continue; }
339+
340+
buttonEventData.pointerEnter = hoverEventData.pointerEnter;
338341

342+
ProcessPress(buttonEventData);
339343
ProcessDrag(buttonEventData);
340344
}
341345

@@ -369,21 +373,31 @@ protected virtual void ProcessRaycast()
369373
processingRaycasters.Clear();
370374
}
371375

376+
protected virtual void ProcessMove(PointerEventData eventData)
377+
{
378+
var hoverGO = eventData.pointerCurrentRaycast.gameObject;
379+
if (eventData.pointerEnter != hoverGO)
380+
{
381+
HandlePointerExitAndEnter(eventData, hoverGO);
382+
}
383+
}
384+
372385
protected virtual void ProcessPress(Pointer3DEventData eventData)
373386
{
374-
if (!eventData.eligibleForClick)
387+
if (eventData.GetPressDown())
375388
{
376-
if (eventData.GetPress())
377-
{
378-
ProcessPressDown(eventData);
379-
}
389+
ProcessPressDown(eventData);
390+
HandlePressExitAndEnter(eventData, eventData.pointerCurrentRaycast.gameObject);
380391
}
381-
else
392+
else if (eventData.GetPress())
382393
{
383-
if (!eventData.GetPress())
384-
{
385-
ProcessPressUp(eventData);
386-
}
394+
HandlePressExitAndEnter(eventData, eventData.pointerCurrentRaycast.gameObject);
395+
}
396+
397+
if (eventData.GetPressUp())
398+
{
399+
ProcessPressUp(eventData);
400+
HandlePressExitAndEnter(eventData, null);
387401
}
388402
}
389403

@@ -414,7 +428,7 @@ protected void ProcessPressDown(Pointer3DEventData eventData)
414428
newPressed = ExecuteEvents.GetEventHandler<IPointerClickHandler>(currentOverGo);
415429
}
416430

417-
float time = Time.unscaledTime;
431+
var time = Time.unscaledTime;
418432

419433
if (newPressed == eventData.lastPress)
420434
{
@@ -452,21 +466,17 @@ protected void ProcessPressUp(Pointer3DEventData eventData)
452466
{
453467
var currentOverGo = eventData.pointerCurrentRaycast.gameObject;
454468

455-
if (eventData.pointerPress != null)
456-
{
457-
ExecuteEvents.Execute(eventData.pointerPress, eventData, ExecuteEvents.pointerUpHandler);
469+
ExecuteEvents.Execute(eventData.pointerPress, eventData, ExecuteEvents.pointerUpHandler);
458470

459-
// see if we mouse up on the same element that we clicked on...
460-
var pointerUpHandler = ExecuteEvents.GetEventHandler<IPointerClickHandler>(currentOverGo);
471+
// see if we mouse up on the same element that we clicked on...
472+
var pointerUpHandler = ExecuteEvents.GetEventHandler<IPointerClickHandler>(currentOverGo);
461473

462-
if (eventData.pointerPress == pointerUpHandler && eventData.eligibleForClick)
463-
{
464-
ExecuteEvents.Execute(eventData.pointerPress, eventData, ExecuteEvents.pointerClickHandler);
465-
}
474+
// PointerClick and Drop events
475+
if (eventData.pointerPress == pointerUpHandler && eventData.eligibleForClick)
476+
{
477+
ExecuteEvents.Execute(eventData.pointerPress, eventData, ExecuteEvents.pointerClickHandler);
466478
}
467-
468-
// Drop events
469-
if (currentOverGo != null && eventData.pointerDrag != null && eventData.dragging)
479+
else if (eventData.pointerDrag != null && eventData.dragging)
470480
{
471481
ExecuteEvents.ExecuteHierarchy(currentOverGo, eventData, ExecuteEvents.dropHandler);
472482
}
@@ -508,7 +518,7 @@ protected void ProcessDrag(Pointer3DEventData eventData)
508518
{
509519
// Before doing drag we should cancel any pointer down state
510520
// And clear selection!
511-
if (eventData.pointerPress != null && eventData.pointerPress != eventData.pointerDrag)
521+
if (eventData.pointerPress != eventData.pointerDrag)
512522
{
513523
ExecuteEvents.Execute(eventData.pointerPress, eventData, ExecuteEvents.pointerUpHandler);
514524

@@ -520,6 +530,35 @@ protected void ProcessDrag(Pointer3DEventData eventData)
520530
}
521531
}
522532

533+
protected static void HandlePressExitAndEnter(Pointer3DEventData eventData, GameObject newEnterTarget)
534+
{
535+
if (eventData.pressEnter == newEnterTarget) { return; }
536+
537+
var oldTarget = eventData.pressEnter == null ? null : eventData.pressEnter.transform;
538+
var newTarget = newEnterTarget == null ? null : newEnterTarget.transform;
539+
var commonRoot = default(Transform);
540+
541+
for (var t = oldTarget; t != null; t = t.parent)
542+
{
543+
if (newTarget != null && newTarget.IsChildOf(t))
544+
{
545+
commonRoot = t;
546+
break;
547+
}
548+
else
549+
{
550+
ExecuteEvents.Execute(t.gameObject, eventData, ExecutePointer3DEvents.PressExitHandler);
551+
}
552+
}
553+
554+
eventData.pressEnter = newEnterTarget;
555+
556+
for (var t = newTarget; t != commonRoot; t = t.parent)
557+
{
558+
ExecuteEvents.Execute(t.gameObject, eventData, ExecutePointer3DEvents.PressEnterHandler);
559+
}
560+
}
561+
523562
protected void DeselectIfSelectionChanged(GameObject currentOverGo, BaseEventData pointerEvent)
524563
{
525564
// Selection tracking
@@ -562,5 +601,37 @@ public bool SendMoveEventToSelectedObject(float x, float y, float moveDeadZone)
562601
ExecuteEvents.Execute(selected, data, ExecuteEvents.moveHandler);
563602
return data.used;
564603
}
604+
605+
public static string PrintGOPath(GameObject go)
606+
{
607+
var str = string.Empty;
608+
609+
if (go != null)
610+
{
611+
for (var t = go.transform; t != null; t = t.parent)
612+
{
613+
if (!string.IsNullOrEmpty(str)) { str = "." + str; }
614+
str = t.name + str;
615+
}
616+
}
617+
618+
return str;
619+
}
620+
621+
public override string ToString()
622+
{
623+
var str = string.Empty;
624+
625+
for (int i = 0, imax = raycasters.Count; i < imax; ++i)
626+
{
627+
var raycaster = raycasters[i];
628+
if (raycaster == null) { continue; }
629+
630+
str += "<b>Raycaster: [" + i + "]</b>\n";
631+
str += raycaster.ToString() + "\n";
632+
}
633+
634+
return str;
635+
}
565636
}
566637
}

0 commit comments

Comments
 (0)