Skip to content

Commit 0a3b5db

Browse files
author
David Kline
authored
Merge pull request #2750 from StephenHodgson/vNEXT-TeleportCursorFix
Teleport Cursor Fix
2 parents 316a88c + e4e8ea6 commit 0a3b5db

File tree

9 files changed

+44
-40
lines changed

9 files changed

+44
-40
lines changed

Assets/MixedRealityToolkit-SDK/Features/Input/GazeProvider.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,7 @@ protected override void Start()
278278
var cursorObj = Instantiate(cursorPrefab, transform.parent);
279279
GazePointer.BaseCursor = cursorObj.GetComponent<IMixedRealityCursor>();
280280
Debug.Assert(GazePointer.BaseCursor != null, "Failed to load cursor");
281+
GazePointer.BaseCursor.SetVisibilityOnSourceDetected = false;
281282
GazePointer.BaseCursor.Pointer = GazePointer;
282283
}
283284

Assets/MixedRealityToolkit-SDK/Features/UX/Prefabs/Pointers/ParabolicPointer.prefab

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,7 @@ MonoBehaviour:
267267
axisConstraint: 7
268268
cursorPrefab: {fileID: 1554777696564956, guid: ae2b3fffb00f464287cda86f49109b47,
269269
type: 2}
270+
disableCursorOnStart: 1
270271
raycastOrigin: {fileID: 0}
271272
activeHoldAction:
272273
id: 0

Assets/MixedRealityToolkit-SDK/Features/UX/Prefabs/Pointers/TouchPointer.prefab

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ MonoBehaviour:
104104
axisConstraint: 0
105105
cursorPrefab: {fileID: 1000012072213228, guid: 5b3e2856904e43c680f84f326861032a,
106106
type: 2}
107+
disableCursorOnStart: 1
108+
setCursorVisibilityOnSourceDetected: 1
107109
raycastOrigin: {fileID: 0}
108110
activeHoldAction:
109111
id: 0

Assets/MixedRealityToolkit-SDK/Features/UX/Scripts/Cursors/BaseCursor.cs

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ public class BaseCursor : InputSystemGlobalListener, IMixedRealityCursor
1818
{
1919
public CursorStateEnum CursorState { get; private set; } = CursorStateEnum.None;
2020

21+
public bool SetVisibilityOnSourceDetected { get; set; } = false;
22+
2123
/// <summary>
2224
/// Surface distance to place the cursor off of the surface at
2325
/// </summary>
@@ -65,18 +67,6 @@ public class BaseCursor : InputSystemGlobalListener, IMixedRealityCursor
6567
private Vector3 targetScale;
6668
private Quaternion targetRotation;
6769

68-
/// <summary>
69-
/// Indicates if the cursor should be visible
70-
/// </summary>
71-
public bool IsVisible
72-
{
73-
get { return isVisible; }
74-
set
75-
{
76-
SetVisibility(isVisible);
77-
}
78-
}
79-
8070
#region IMixedRealityCursor Implementation
8171

8272
/// <inheritdoc />
@@ -113,10 +103,10 @@ public float DefaultCursorDistance
113103
/// <inheritdoc />
114104
public virtual Vector3 LocalScale => transform.localScale;
115105

116-
/// <inheritdoc />
117106
public virtual void SetVisibility(bool visible)
118107
{
119-
if (PrimaryCursorVisual != null)
108+
if (PrimaryCursorVisual != null &&
109+
PrimaryCursorVisual.gameObject.activeInHierarchy != visible)
120110
{
121111
PrimaryCursorVisual.gameObject.SetActive(visible);
122112
isVisible = visible;
@@ -141,7 +131,12 @@ public virtual void OnSourceDetected(SourceStateEventData eventData)
141131
if (eventData.InputSource.Pointers[i].PointerId == Pointer.PointerId)
142132
{
143133
visibleSourcesCount++;
144-
SetVisibility(true);
134+
135+
if (SetVisibilityOnSourceDetected && visibleSourcesCount == 1)
136+
{
137+
SetVisibility(true);
138+
}
139+
145140
return;
146141
}
147142
}
@@ -173,10 +168,14 @@ public virtual void OnSourceLost(SourceStateEventData eventData)
173168
}
174169
}
175170

176-
if (visibleSourcesCount == 0)
171+
if (!IsSourceDetected)
177172
{
178173
IsPointerDown = false;
179-
SetVisibility(false);
174+
175+
if (SetVisibilityOnSourceDetected)
176+
{
177+
SetVisibility(false);
178+
}
180179
}
181180
}
182181

@@ -231,13 +230,6 @@ public virtual void OnPointerUp(MixedRealityPointerEventData eventData)
231230

232231
#region MonoBehaviour Implementation
233232

234-
private void Awake()
235-
{
236-
// Use the setter to update visibility of the cursor at startup based on user preferences
237-
IsVisible = isVisible;
238-
SetVisibility(isVisible);
239-
}
240-
241233
private void Update()
242234
{
243235
UpdateCursorState();

Assets/MixedRealityToolkit-SDK/Features/UX/Scripts/Cursors/TeleportCursor.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ protected override void UpdateCursorTransform()
8383
if (Pointer == null)
8484
{
8585
Debug.LogError($"[TeleportCursor.{name}] No Pointer has been assigned!");
86+
SetVisibility(false);
8687
return;
8788
}
8889

@@ -93,6 +94,7 @@ protected override void UpdateCursorTransform()
9394
Debug.LogError(InputSystem.FocusProvider.IsPointerRegistered(Pointer)
9495
? $"{gameObject.name}: Unable to get focus details for {pointer.GetType().Name}!"
9596
: $"{pointer.GetType().Name} has not been registered!");
97+
SetVisibility(false);
9698
return;
9799
}
98100

Assets/MixedRealityToolkit-SDK/Features/UX/Scripts/Pointers/BaseControllerPointer.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ public abstract class BaseControllerPointer : ControllerPoseSynchronizer, IMixed
3030
[SerializeField]
3131
private GameObject cursorPrefab = null;
3232

33+
[SerializeField]
34+
private bool disableCursorOnStart = false;
35+
36+
[SerializeField]
37+
private bool setCursorVisibilityOnSourceDetected = false;
38+
3339
private GameObject cursorInstance = null;
3440

3541
[SerializeField]
@@ -73,7 +79,7 @@ public abstract class BaseControllerPointer : ControllerPoseSynchronizer, IMixed
7379
/// Set a new cursor for this <see cref="IMixedRealityPointer"/>
7480
/// </summary>
7581
/// <remarks>This <see cref="GameObject"/> must have a <see cref="IMixedRealityCursor"/> attached to it.</remarks>
76-
/// <param name="newCursor"></param>
82+
/// <param name="newCursor">The new cursor</param>
7783
public virtual void SetCursor(GameObject newCursor = null)
7884
{
7985
if (cursorInstance != null)
@@ -104,6 +110,12 @@ public virtual void SetCursor(GameObject newCursor = null)
104110
{
105111
BaseCursor.DefaultCursorDistance = PointerExtent;
106112
BaseCursor.Pointer = this;
113+
BaseCursor.SetVisibilityOnSourceDetected = setCursorVisibilityOnSourceDetected;
114+
115+
if (disableCursorOnStart)
116+
{
117+
BaseCursor.SetVisibility(false);
118+
}
107119
}
108120
else
109121
{
@@ -118,7 +130,6 @@ protected override void OnEnable()
118130
{
119131
base.OnEnable();
120132
SetCursor();
121-
BaseCursor?.SetVisibility(true);
122133

123134
if (MixedRealityManager.IsInitialized && TeleportSystem != null && !lateRegisterTeleport)
124135
{

Assets/MixedRealityToolkit-SDK/Features/UX/Scripts/Pointers/TeleportPointer.cs

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -97,19 +97,6 @@ protected Gradient GetLineGradient(TeleportSurfaceResult targetResult)
9797
}
9898
}
9999

100-
protected override void OnEnable()
101-
{
102-
base.OnEnable();
103-
BaseCursor?.SetVisibility(false);
104-
}
105-
106-
/// <inheritdoc />
107-
public override void SetCursor(GameObject newCursor = null)
108-
{
109-
base.SetCursor(newCursor);
110-
BaseCursor?.SetVisibility(false);
111-
}
112-
113100
#region IMixedRealityPointer Implementation
114101

115102
/// <inheritdoc />
@@ -180,7 +167,6 @@ public override void OnPostRaycast()
180167
// If we hit something
181168
if (Result.CurrentPointerTarget != null)
182169
{
183-
BaseCursor?.SetVisibility(true);
184170
// Check if it's in our valid layers
185171
if (((1 << Result.CurrentPointerTarget.layer) & ValidLayers.value) != 0)
186172
{
@@ -236,6 +222,7 @@ public override void OnPostRaycast()
236222

237223
// Clamp the end of the parabola to the result hit's point
238224
LineBase.LineEndClamp = LineBase.GetNormalizedLengthFromWorldLength(clearWorldLength, LineCastResolution);
225+
BaseCursor?.SetVisibility(TeleportSurfaceResult == TeleportSurfaceResult.Valid || TeleportSurfaceResult == TeleportSurfaceResult.HotSpot);
239226
}
240227
else
241228
{

Assets/MixedRealityToolkit-SDK/Inspectors/UX/Pointers/BaseControllerPointerInspector.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ namespace Microsoft.MixedReality.Toolkit.SDK.Inspectors.UX.Pointers
1111
public class BaseControllerPointerInspector : ControllerPoseSynchronizerInspector
1212
{
1313
private SerializedProperty cursorPrefab;
14+
private SerializedProperty disableCursorOnStart;
15+
private SerializedProperty setCursorVisibilityOnSourceDetected;
1416
private SerializedProperty raycastOrigin;
1517
private SerializedProperty pointerExtent;
1618
private SerializedProperty activeHoldAction;
@@ -27,6 +29,8 @@ protected override void OnEnable()
2729
base.OnEnable();
2830

2931
cursorPrefab = serializedObject.FindProperty("cursorPrefab");
32+
disableCursorOnStart = serializedObject.FindProperty("disableCursorOnStart");
33+
setCursorVisibilityOnSourceDetected = serializedObject.FindProperty("setCursorVisibilityOnSourceDetected");
3034
raycastOrigin = serializedObject.FindProperty("raycastOrigin");
3135
pointerExtent = serializedObject.FindProperty("pointerExtent");
3236
activeHoldAction = serializedObject.FindProperty("activeHoldAction");
@@ -48,6 +52,8 @@ public override void OnInspectorGUI()
4852
if (basePointerFoldout)
4953
{
5054
EditorGUILayout.PropertyField(cursorPrefab);
55+
EditorGUILayout.PropertyField(disableCursorOnStart);
56+
EditorGUILayout.PropertyField(setCursorVisibilityOnSourceDetected);
5157
EditorGUILayout.PropertyField(raycastOrigin);
5258
EditorGUILayout.PropertyField(pointerExtent);
5359
EditorGUILayout.PropertyField(pointerOrientation);

Assets/MixedRealityToolkit/_Core/Interfaces/InputSystem/IMixedRealityCursor.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ public interface IMixedRealityCursor : IMixedRealityFocusChangedHandler, IMixedR
4242
/// <param name="visible">True if cursor should be visible, false if not.</param>
4343
void SetVisibility(bool visible);
4444

45+
bool SetVisibilityOnSourceDetected { get; set; }
46+
4547
/// <summary>
4648
/// Returns the <see cref="IMixedRealityCursor"/>'s <see cref="GameObject"/> reference.
4749
/// </summary>

0 commit comments

Comments
 (0)