protected override void HandlePointerEventRaised(PointerArgs args) { base.HandlePointerEventRaised(args); if (SelectedInteractable == null) { return; } if (args.Identifier != Identifier && (args.PointerEvent == PointerEvent.Select || args.PointerEvent == PointerEvent.Unselect)) { Pose toPose = PoseUtils.Multiply(_trackedGripPose, _snapOffset); if (SelectedInteractable.ResetGrabOnGrabsUpdated) { if (SelectedInteractable.CalculateBestPose(toPose, Hand.Scale, Hand.Handedness, ref _cachedBestHandPose, ref _cachedBestSnapPoint, out bool usesHandPose, out float poseScore)) { bool usePinchPoint = _currentSnap.SnappedToPinch; HandPose handPose = usesHandPose ? _cachedBestHandPose : null; _currentSnap.Set(SelectedInteractable, handPose, _cachedBestSnapPoint, usePinchPoint); } } Pose fromPose = _currentSnap.WorldSnapPose; _movement = SelectedInteractable.GenerateMovement(fromPose, toPose); SelectedInteractable.PointableElement.ProcessPointerEvent( new PointerArgs(Identifier, PointerEvent.Move, fromPose)); } }
protected virtual void ComputeBestSnapAddress(ref SnapAddress snapAddress) { IEnumerable<HandGrabInteractable> interactables = HandGrabInteractable.Registry.List(this); float bestFingerScore = -1f; float bestPoseScore = -1f; foreach (HandGrabInteractable interactable in interactables) { float fingerScore = 1.0f; if (!HandGrab.ComputeShouldSelect(this, interactable, out GrabTypeFlags selectingGrabTypes)) { fingerScore = HandGrab.ComputeHandGrabScore(this, interactable, out selectingGrabTypes); } if (fingerScore < bestFingerScore) { continue; } bool usePinchPoint = CanSnapToPinchPoint(interactable, selectingGrabTypes); Pose grabPoint = usePinchPoint ? _trackedPinchPose : _trackedGripPose; bool poseFound = interactable.CalculateBestPose(grabPoint, Hand.Scale, Hand.Handedness, ref _cachedBestHandPose, ref _cachedBestSnapPoint, out bool usesHandPose, out float poseScore); if (!poseFound) { continue; } if (fingerScore > bestFingerScore || poseScore > bestPoseScore) { bestFingerScore = fingerScore; bestPoseScore = poseScore; HandPose handPose = usesHandPose ? _cachedBestHandPose : null; snapAddress.Set(interactable, handPose, _cachedBestSnapPoint, usePinchPoint); } } if (bestFingerScore < 0) { snapAddress.Clear(); } }