public void OnBeforeFocusChange(FocusEventData eventData) { if (!EnableForce || !TryToVerifyPointerAndController(eventData.Pointer, out var pointer)) { return; } // this should never trigger! Debug.Assert(pointer != null); if (eventData.NewFocusedObject != null && eventData.NewFocusedObject.transform.IsChildOf(transform)) { // if already listed then ignore if (!_focusers.Add(pointer)) { return; } eventData.Pointer.FocusTarget = this; var isHoloLens2OrVr = !IsGgvOrDesktopController(eventData.Pointer.Controller); var tractorBeam = isHoloLens2OrVr ? AttachTractorBeamToPointer(pointer) : null; switch (ForceState) { case State.Root: case State.Free: if (!IsGgvOrDesktopController(eventData.Pointer.Controller)) { Debug.Assert(_activeTractorBeams.Add(tractorBeam)); StartDwell(); } break; case State.Dwell: if (isHoloLens2OrVr) { Debug.Assert(_activeTractorBeams.Add(tractorBeam)); } break; case State.Manipulation: case State.Attraction: break; default: throw new ArgumentOutOfRangeException(); } } else { _focusers.Remove(pointer); if ((ForceSolver)eventData.Pointer.FocusTarget == this) { eventData.Pointer.FocusTarget = null; } _activeTractorBeams.Remove(ForceTractorBeam.GetTractorBeamFromPointer(pointer)); } }
private ForceTractorBeam AttachTractorBeamToPointer(ShellHandRayPointer pointer) { return(ForceTractorBeam.AttachToHandRayPointer(pointer, TractionBeamPrefab)); }