Skip to content

Commit b5cee0f

Browse files
committed
Ensure we set CurrentTrackedHandedness to Handedness.None if the hand isn't tracked
1 parent 7c9e8a5 commit b5cee0f

1 file changed

Lines changed: 33 additions & 40 deletions

File tree

org.mixedrealitytoolkit.spatialmanipulation/Solvers/SolverHandler.cs

Lines changed: 33 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
// Copyright (c) Mixed Reality Toolkit Contributors
22
// Licensed under the BSD 3-Clause
33

4-
using MixedReality.Toolkit.Subsystems;
54
using System.Collections.Generic;
65
using System.Linq;
76
using Unity.Profiling;
@@ -251,16 +250,13 @@ public Transform TransformTarget
251250
}
252251
}
253252

254-
// Stores currently attached hand if valid (only possible values Left, Right, or None)
255-
private Handedness currentTrackedHandedness = Handedness.None;
256-
257253
/// <summary>
258254
/// Currently tracked hand or motion controller, if applicable.
259255
/// </summary>
260256
/// <remarks>
261-
/// The allowable <see cref="Handedness"/> values are Left, Right, or None
257+
/// The allowable <see cref="Handedness"/> values are Left, Right, or None.
262258
/// </remarks>
263-
public Handedness CurrentTrackedHandedness => currentTrackedHandedness;
259+
public Handedness CurrentTrackedHandedness { get; private set; } = Handedness.None;
264260

265261
// Stores controller side to favor if TrackedHandedness is set to both left and right.
266262
private Handedness preferredTrackedHandedness = Handedness.Left;
@@ -424,7 +420,7 @@ internal void UnregisterSolver(Solver solver)
424420
}
425421

426422
/// <summary>
427-
/// Clear the parent of the internally created tracking-target game object.
423+
/// Clear the parent of the internally created tracking-target game object.
428424
/// </summary>
429425
/// <remarks>
430426
/// A tracking-target is created when <see cref="AttachToNewTrackedObject"/> is called, and
@@ -452,7 +448,7 @@ protected virtual void AttachToNewTrackedObject()
452448
{
453449
using (AttachToNewTrackedObjectPerfMarker.Auto())
454450
{
455-
currentTrackedHandedness = Handedness.None;
451+
CurrentTrackedHandedness = Handedness.None;
456452
controllerInteractor = null;
457453

458454
Transform target = null;
@@ -462,54 +458,52 @@ protected virtual void AttachToNewTrackedObject()
462458
}
463459
else if (TrackedTargetType == TrackedObjectType.ControllerRay)
464460
{
465-
currentTrackedHandedness = TrackedHandedness;
466-
if ((currentTrackedHandedness & Handedness.Both) == Handedness.Both)
461+
CurrentTrackedHandedness = TrackedHandedness;
462+
if ((CurrentTrackedHandedness & Handedness.Both) == Handedness.Both)
467463
{
468-
currentTrackedHandedness = PreferredTrackedHandedness;
469-
controllerInteractor = GetControllerInteractor(currentTrackedHandedness);
464+
CurrentTrackedHandedness = PreferredTrackedHandedness;
465+
controllerInteractor = GetControllerInteractor(CurrentTrackedHandedness);
470466

471467
if (controllerInteractor == null || !controllerInteractor.isHoverActive)
472468
{
473469
// If no interactor found, try again on the opposite hand
474-
currentTrackedHandedness = currentTrackedHandedness.GetOppositeHandedness();
475-
controllerInteractor = GetControllerInteractor(currentTrackedHandedness);
470+
CurrentTrackedHandedness = PreferredTrackedHandedness.GetOppositeHandedness();
471+
controllerInteractor = GetControllerInteractor(CurrentTrackedHandedness);
476472
}
477473
}
478474
else
479475
{
480-
controllerInteractor = GetControllerInteractor(currentTrackedHandedness);
476+
controllerInteractor = GetControllerInteractor(CurrentTrackedHandedness);
481477
}
482478

483-
if (controllerInteractor != null)
479+
if (controllerInteractor != null && controllerInteractor.isHoverActive)
484480
{
485481
target = controllerInteractor.transform;
486482
}
487483
else
488484
{
489-
currentTrackedHandedness = Handedness.None;
485+
CurrentTrackedHandedness = Handedness.None;
490486
}
491487
}
492488
else if (TrackedTargetType == TrackedObjectType.HandJoint)
493489
{
494490
if (XRSubsystemHelpers.HandsAggregator != null)
495491
{
496-
currentTrackedHandedness = TrackedHandedness;
497-
if ((currentTrackedHandedness & Handedness.Both) == Handedness.Both)
492+
CurrentTrackedHandedness = TrackedHandedness;
493+
if ((CurrentTrackedHandedness & Handedness.Both) == Handedness.Both)
498494
{
499-
if (IsHandTracked(PreferredTrackedHandedness))
500-
{
501-
currentTrackedHandedness = PreferredTrackedHandedness;
502-
}
503-
else if (IsHandTracked(PreferredTrackedHandedness.GetOppositeHandedness()))
504-
{
505-
currentTrackedHandedness = PreferredTrackedHandedness.GetOppositeHandedness();
506-
}
507-
else
495+
CurrentTrackedHandedness = PreferredTrackedHandedness;
496+
if (!IsHandTracked(CurrentTrackedHandedness))
508497
{
509-
currentTrackedHandedness = Handedness.None;
498+
CurrentTrackedHandedness = PreferredTrackedHandedness.GetOppositeHandedness();
510499
}
511500
}
512501

502+
if (!IsHandTracked(CurrentTrackedHandedness))
503+
{
504+
CurrentTrackedHandedness = Handedness.None;
505+
}
506+
513507
if (UpdateCachedHandJointTransform())
514508
{
515509
target = cachedHandJointTransform;
@@ -518,7 +512,7 @@ protected virtual void AttachToNewTrackedObject()
518512
}
519513
else if (TrackedTargetType == TrackedObjectType.CustomOverride)
520514
{
521-
target = this.transformOverride;
515+
target = transformOverride;
522516
}
523517

524518
TrackTransform(target);
@@ -529,7 +523,7 @@ protected virtual void AttachToNewTrackedObject()
529523
new ProfilerMarker("[MRTK] SolverHandler.UpdateCachedHandJointTransform");
530524

531525
/// <summary>
532-
/// Update the cached transform's position to match that of the current track joint.
526+
/// Update the cached transform's position to match that of the current track joint.
533527
/// </summary>
534528
/// <returns>
535529
/// <see langword="true"/> if the tracked joint is found and cached transform is updated, <see langword="false"/> otherwise.
@@ -539,7 +533,7 @@ private bool UpdateCachedHandJointTransform()
539533
bool updated = false;
540534
using (UpdateCachedHandJointTransformPerfMarker.Auto())
541535
{
542-
XRNode? handNode = currentTrackedHandedness.ToXRNode();
536+
XRNode? handNode = CurrentTrackedHandedness.ToXRNode();
543537

544538
if (handNode.HasValue &&
545539
XRSubsystemHelpers.HandsAggregator != null &&
@@ -571,7 +565,6 @@ private void TrackTransform(Transform target)
571565
trackingTarget.transform.localPosition = Vector3.Scale(AdditionalOffset, trackingTarget.transform.localScale);
572566
trackingTarget.transform.localRotation = Quaternion.Euler(AdditionalRotation);
573567
}
574-
575568
}
576569

577570
/// <summary>
@@ -613,10 +606,10 @@ private bool IsInvalidTracking()
613606
}
614607

615608
// If we were tracking a particular hand, check that our transform is still valid
616-
if (TrackedTargetType == TrackedObjectType.HandJoint && currentTrackedHandedness != Handedness.None)
609+
if (TrackedTargetType == TrackedObjectType.HandJoint && CurrentTrackedHandedness != Handedness.None)
617610
{
618-
bool trackingLeft = currentTrackedHandedness.IsMatch(Handedness.Left) && IsHandTracked(Handedness.Left);
619-
bool trackingRight = currentTrackedHandedness.IsMatch(Handedness.Right) && IsHandTracked(Handedness.Right);
611+
bool trackingLeft = CurrentTrackedHandedness.IsMatch(Handedness.Left) && IsHandTracked(Handedness.Left);
612+
bool trackingRight = CurrentTrackedHandedness.IsMatch(Handedness.Right) && IsHandTracked(Handedness.Right);
620613
return !trackingLeft && !trackingRight;
621614
}
622615

@@ -630,14 +623,14 @@ private bool IsInvalidTracking()
630623
/// <returns>
631624
/// <see langword="true"/> if the hand is tracked, or <see langword="false"/>.
632625
/// </returns>
633-
public static bool IsHandTracked(Handedness hand)
626+
private static bool IsHandTracked(Handedness hand)
634627
{
635628
// Early out if the hand isn't a valid XRNode
636629
// (i.e., Handedness.None or Handedness.Both)
637630
XRNode? node = hand.ToXRNode();
638-
if (!node.HasValue) { return false; }
639-
return XRSubsystemHelpers.HandsAggregator != null &&
640-
XRSubsystemHelpers.HandsAggregator.TryGetJoint(TrackedHandJoint.Palm, node.Value, out HandJointPose pose);
631+
return node.HasValue &&
632+
XRSubsystemHelpers.HandsAggregator != null &&
633+
XRSubsystemHelpers.HandsAggregator.TryGetJoint(TrackedHandJoint.Palm, node.Value, out _);
641634
}
642635

643636
/// <summary>

0 commit comments

Comments
 (0)