Skip to content

Commit c17ecee

Browse files
authored
Merge pull request #7012 from Troy-Ferrell/users/trferrel/fix-solvers
Fix Solvers tracking pointers as target transforms
2 parents f9ec532 + c8696d9 commit c17ecee

File tree

6 files changed

+139
-105
lines changed

6 files changed

+139
-105
lines changed

Assets/MixedRealityToolkit.SDK/Features/Input/Handlers/ControllerPoseSynchronizer.cs

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,10 @@ public class ControllerPoseSynchronizer : InputSystemGlobalHandlerListener, IMix
1414
{
1515
#region IMixedRealityControllerPoseSynchronizer Implementation
1616

17-
[SerializeField]
18-
[Tooltip("The handedness this controller should synchronize with.")]
19-
private Handedness handedness = Handedness.Left;
20-
2117
/// <inheritdoc />
2218
public Handedness Handedness
2319
{
24-
get { return handedness; }
25-
set { handedness = value; }
20+
get => Controller == null ? Handedness.None : Controller.ControllerHandedness;
2621
}
2722

2823
[SerializeField]
@@ -32,8 +27,8 @@ public Handedness Handedness
3227
/// <inheritdoc />
3328
public bool DestroyOnSourceLost
3429
{
35-
get { return destroyOnSourceLost; }
36-
set { destroyOnSourceLost = value; }
30+
get => destroyOnSourceLost;
31+
set => destroyOnSourceLost = value;
3732
}
3833

3934
/// <summary>
@@ -51,17 +46,8 @@ public bool DestroyOnSourceLost
5146
/// <inheritdoc />
5247
public virtual IMixedRealityController Controller
5348
{
54-
get { return controller; }
55-
set
56-
{
57-
controller = value;
58-
59-
if (controller != null && gameObject != null)
60-
{
61-
handedness = value.ControllerHandedness;
62-
gameObject.name = $"{handedness}_{gameObject.name}";
63-
}
64-
}
49+
get => controller;
50+
set => controller = value;
6551
}
6652

6753
[SerializeField]
@@ -71,8 +57,8 @@ public virtual IMixedRealityController Controller
7157
/// <inheritdoc />
7258
public bool UseSourcePoseData
7359
{
74-
get { return useSourcePoseData; }
75-
set { useSourcePoseData = value; }
60+
get => useSourcePoseData;
61+
set => useSourcePoseData = value;
7662
}
7763

7864
[SerializeField]
@@ -82,8 +68,8 @@ public bool UseSourcePoseData
8268
/// <inheritdoc />
8369
public MixedRealityInputAction PoseAction
8470
{
85-
get { return poseAction; }
86-
set { poseAction = value; }
71+
get => poseAction;
72+
set => poseAction = value;
8773
}
8874

8975
#endregion IMixedRealityControllerPoseSynchronizer Implementation
@@ -117,7 +103,7 @@ public virtual void OnSourceLost(SourceStateEventData eventData)
117103
{
118104
TrackingState = TrackingState.NotTracked;
119105

120-
if (destroyOnSourceLost)
106+
if (DestroyOnSourceLost)
121107
{
122108
GameObjectExtensions.DestroyGameObject(gameObject);
123109
}
@@ -214,5 +200,18 @@ public virtual void OnInputChanged(InputEventData<MixedRealityPose> eventData)
214200
}
215201

216202
#endregion IMixedRealityInputHandler Implementation
203+
204+
#region Obsolete
205+
206+
#pragma warning disable 0414
207+
[SerializeField]
208+
[HideInInspector]
209+
[System.Obsolete("Use the Handedness property instead to get current handedness which is set by Controller attached")]
210+
[Tooltip("Use the Handedness property instead to get current handedness which is set by Controller attached")]
211+
private Handedness handedness = Handedness.Left;
212+
#pragma warning restore 0414
213+
214+
#endregion
215+
217216
}
218217
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ public override IMixedRealityController Controller
208208

209209
if (base.Controller != null && this != null)
210210
{
211-
pointerName = gameObject.name;
211+
PointerName = gameObject.name;
212212
InputSourceParent = base.Controller.InputSource;
213213
}
214214
}

Assets/MixedRealityToolkit.SDK/Features/UX/Scripts/Pointers/BaseMousePointer.cs

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -59,23 +59,14 @@ public abstract class BaseMousePointer : BaseControllerPointer, IMixedRealityMou
5959

6060
protected abstract string ControllerName { get; }
6161

62-
private IMixedRealityController controller;
63-
6462
/// <inheritdoc />
6563
public override IMixedRealityController Controller
6664
{
67-
get { return controller; }
65+
get => base.Controller;
6866
set
6967
{
70-
controller = value;
68+
base.Controller = value;
7169
TrackingState = TrackingState.NotApplicable;
72-
73-
if (controller != null && gameObject != null)
74-
{
75-
InputSourceParent = controller.InputSource;
76-
Handedness = controller.ControllerHandedness;
77-
gameObject.name = ControllerName;
78-
}
7970
}
8071
}
8172

Assets/MixedRealityToolkit.SDK/Features/Utilities/Solvers/SolverHandler.cs

Lines changed: 62 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public class SolverHandler : MonoBehaviour
2727
/// </summary>
2828
public TrackedObjectType TrackedTargetType
2929
{
30-
get { return trackedTargetType; }
30+
get => trackedTargetType;
3131
set
3232
{
3333
if (trackedTargetType != value && IsValidTrackedObjectType(value))
@@ -38,23 +38,6 @@ public TrackedObjectType TrackedTargetType
3838
}
3939
}
4040

41-
/// <summary>
42-
/// Tracked object to calculate position and orientation from. If you want to manually override and use a scene object, use the TransformTarget field.
43-
/// </summary>
44-
[Obsolete("Use TrackedTargetType instead")]
45-
public TrackedObjectType TrackedObjectToReference
46-
{
47-
get { return trackedTargetType; }
48-
set
49-
{
50-
if (trackedTargetType != value)
51-
{
52-
trackedTargetType = value;
53-
RefreshTrackedObject();
54-
}
55-
}
56-
}
57-
5841
[SerializeField]
5942
[Tooltip("If tracking hands or motion controllers, determines which hand(s) are valid attachments")]
6043
private Handedness trackedHandness = Handedness.Both;
@@ -67,7 +50,7 @@ public TrackedObjectType TrackedObjectToReference
6750
/// </remarks>
6851
public Handedness TrackedHandness
6952
{
70-
get { return trackedHandness; }
53+
get => trackedHandness;
7154
set
7255
{
7356
if (trackedHandness != value && IsValidHandedness(value))
@@ -87,7 +70,7 @@ public Handedness TrackedHandness
8770
/// </summary>
8871
public TrackedHandJoint TrackedHandJoint
8972
{
90-
get { return trackedHandJoint; }
73+
get => trackedHandJoint;
9174
set
9275
{
9376
if (trackedHandJoint != value)
@@ -126,7 +109,7 @@ public Transform TransformOverride
126109
/// </summary>
127110
public Vector3 AdditionalOffset
128111
{
129-
get { return additionalOffset; }
112+
get => additionalOffset;
130113
set
131114
{
132115
if (additionalOffset != value)
@@ -146,7 +129,7 @@ public Vector3 AdditionalOffset
146129
/// </summary>
147130
public Vector3 AdditionalRotation
148131
{
149-
get { return additionalRotation; }
132+
get => additionalRotation;
150133
set
151134
{
152135
if (additionalRotation != value)
@@ -166,8 +149,8 @@ public Vector3 AdditionalRotation
166149
/// </summary>
167150
public bool UpdateSolvers
168151
{
169-
get { return updateSolvers; }
170-
set { updateSolvers = value; }
152+
get => updateSolvers;
153+
set => updateSolvers = value;
171154
}
172155

173156
protected readonly List<Solver> solvers = new List<Solver>();
@@ -178,17 +161,13 @@ public bool UpdateSolvers
178161
/// </summary>
179162
public IReadOnlyCollection<Solver> Solvers
180163
{
181-
get
182-
{
183-
return solvers.AsReadOnly();
184-
}
185-
164+
get => solvers.AsReadOnly();
186165
set
187166
{
188167
if (value != null)
189168
{
190-
this.solvers.Clear();
191-
this.solvers.AddRange(value);
169+
solvers.Clear();
170+
solvers.AddRange(value);
192171
}
193172
}
194173
}
@@ -230,7 +209,7 @@ public Transform TransformTarget
230209
RefreshTrackedObject();
231210
}
232211

233-
return (trackingTarget != null) ? trackingTarget.transform : null;
212+
return trackingTarget != null ? trackingTarget.transform : null;
234213
}
235214
}
236215

@@ -243,13 +222,7 @@ public Transform TransformTarget
243222
/// /// <remarks>
244223
/// Only possible values Left, Right, or None
245224
/// </remarks>
246-
public Handedness CurrentTrackedHandedness
247-
{
248-
get
249-
{
250-
return currentTrackedHandedness;
251-
}
252-
}
225+
public Handedness CurrentTrackedHandedness => currentTrackedHandedness;
253226

254227
// Stores controller side to favor if TrackedHandedness is set to both
255228
protected Handedness preferredTrackedHandedness = Handedness.Left;
@@ -277,6 +250,8 @@ public Handedness PreferredTrackedHandedness
277250
// Hidden GameObject managed by this component and attached as a child to the tracked target type (i.e head, hand etc)
278251
private GameObject trackingTarget;
279252

253+
private LinePointer controllerRay;
254+
280255
private float lastUpdateTime;
281256

282257
private IMixedRealityHandJointService HandJointService => handJointService ?? (handJointService = (CoreServices.InputSystem as IMixedRealityDataProviderAccess)?.GetDataProvider<IMixedRealityHandJointService>());
@@ -397,6 +372,7 @@ protected virtual void DetachFromCurrentTrackedObject()
397372
protected virtual void AttachToNewTrackedObject()
398373
{
399374
currentTrackedHandedness = Handedness.None;
375+
controllerRay = null;
400376

401377
Transform target = null;
402378
if (TrackedTargetType == TrackedObjectType.Head)
@@ -408,21 +384,28 @@ protected virtual void AttachToNewTrackedObject()
408384
if (TrackedHandness == Handedness.Both)
409385
{
410386
currentTrackedHandedness = PreferredTrackedHandedness;
411-
target = GetControllerRay(currentTrackedHandedness);
412-
if (target == null)
387+
controllerRay = PointerUtils.GetPointer<LinePointer>(currentTrackedHandedness);
388+
389+
if (controllerRay == null)
413390
{
391+
// If no pointer found, try again on the the opposite hand
414392
currentTrackedHandedness = currentTrackedHandedness.GetOppositeHandedness();
415-
target = GetControllerRay(currentTrackedHandedness);
416-
if (target == null)
417-
{
418-
currentTrackedHandedness = Handedness.None;
419-
}
393+
controllerRay = PointerUtils.GetPointer<LinePointer>(currentTrackedHandedness);
420394
}
421395
}
422396
else
423397
{
424398
currentTrackedHandedness = TrackedHandness;
425-
target = GetControllerRay(TrackedHandness);
399+
controllerRay = PointerUtils.GetPointer<LinePointer>(currentTrackedHandedness);
400+
}
401+
402+
if (controllerRay != null)
403+
{
404+
target = controllerRay.transform;
405+
}
406+
else
407+
{
408+
currentTrackedHandedness = Handedness.None;
426409
}
427410
}
428411
else if (TrackedTargetType == TrackedObjectType.HandJoint)
@@ -470,10 +453,9 @@ private void TrackTransform(Transform target)
470453
trackingTarget.transform.localRotation = Quaternion.Euler(AdditionalRotation);
471454
}
472455

473-
private Transform GetControllerRay(Handedness handedness)
456+
private LinePointer GetControllerRay(Handedness handedness)
474457
{
475-
var pointer = PointerUtils.GetPointer<LinePointer>(handedness);
476-
return pointer?.transform;
458+
return PointerUtils.GetPointer<LinePointer>(handedness);
477459
}
478460

479461
/// <summary>
@@ -486,7 +468,15 @@ private bool IsInvalidTracking()
486468
{
487469
return true;
488470
}
489-
471+
472+
// If we are attached to a pointer (i.e controller ray),
473+
// check if pointer's controller is still be tracked
474+
if (TrackedTargetType == TrackedObjectType.ControllerRay &&
475+
(controllerRay == null || !controllerRay.IsTracked))
476+
{
477+
return true;
478+
}
479+
490480
// If we were tracking a particular hand, check that our transform is still valid
491481
// The HandJointService does not destroy it's own hand joint tracked GameObjects even when a hand is no longer tracked
492482
// Those HandJointService's GameObjects though are the parents of our tracked transform and thus will not be null/destroyed
@@ -511,5 +501,26 @@ public static bool IsValidTrackedObjectType(TrackedObjectType type)
511501
{
512502
return type == TrackedObjectType.Head || type >= TrackedObjectType.ControllerRay;
513503
}
504+
505+
#region Obsolete
506+
507+
/// <summary>
508+
/// Tracked object to calculate position and orientation from. If you want to manually override and use a scene object, use the TransformTarget field.
509+
/// </summary>
510+
[Obsolete("Use TrackedTargetType instead")]
511+
public TrackedObjectType TrackedObjectToReference
512+
{
513+
get => trackedTargetType;
514+
set
515+
{
516+
if (trackedTargetType != value)
517+
{
518+
trackedTargetType = value;
519+
RefreshTrackedObject();
520+
}
521+
}
522+
}
523+
524+
#endregion
514525
}
515526
}

0 commit comments

Comments
 (0)