/// <summary> /// Called by Handles when they are released. /// </summary> public void NotifyHandleDeactivated(TransformHandle handle) { if (handle is TransformTranslationHandle) { _activeTranslationAxes.Remove(((TransformTranslationHandle)handle).axis); } _activeHandles.Remove(handle); switch (_toolState) { case ToolState.Idle: Debug.LogWarning("Warning: Handle was deactived while Tool was already idle."); break; default: if (_activeHandles.Count == 0) { _toolState = ToolState.Idle; } break; } }
/// <summary> /// Called by handles when they are grasped. /// </summary> /// <param name="handle"></param> public void NotifyHandleActivated(TransformHandle handle) { switch (_toolState) { case ToolState.Idle: _activeHandles.Add(handle); if (handle is TransformTranslationHandle) { _toolState = ToolState.Translating; _activeTranslationAxes.Add(((TransformTranslationHandle)handle).axis); } else { _toolState = ToolState.Rotating; } break; case ToolState.Translating: if (handle is TransformRotationHandle) { Debug.LogError("Error: Can't rotate a transform while it is already being " + "translated."); } else { _activeHandles.Add(handle); _activeTranslationAxes.Add(((TransformTranslationHandle)handle).axis); } break; case ToolState.Rotating: Debug.LogError("Error: Only one handle can be active while a transform is being " + "rotated."); break; } }
private void updateHandles() { switch (_toolState) { case ToolState.Idle: // Find the closest handle to any InteractionHand. TransformHandle closestHandleToAnyHand = null; float closestHandleDist = float.PositiveInfinity; foreach (var intController in interactionManager.interactionControllers .Query() .Where(controller => controller.isTracked)) { if (!intController.isPrimaryHovering) { continue; } TransformHandle testHandle = intController.primaryHoveredObject .gameObject .GetComponent <TransformHandle>(); if (testHandle == null || !_transformHandles.Contains(testHandle)) { continue; } float testDist = intController.primaryHoverDistance; if (testDist < closestHandleDist) { closestHandleToAnyHand = testHandle; closestHandleDist = testDist; } } // While idle, only show the closest handle to any hand, hide other handles. foreach (var handle in _transformHandles) { if (closestHandleToAnyHand != null && handle == closestHandleToAnyHand) { handle.EnsureVisible(); } else { handle.EnsureHidden(); } } break; case ToolState.Translating: // While translating, show all translation handles except the other handle // on the same axis, and hide rotation handles. foreach (var handle in _transformHandles) { if (handle is TransformTranslationHandle) { var translateHandle = handle as TransformTranslationHandle; if (!_activeHandles.Contains(translateHandle) && _activeTranslationAxes.Contains(translateHandle.axis)) { handle.EnsureHidden(); } else { handle.EnsureVisible(); } } else { handle.EnsureHidden(); } } break; case ToolState.Rotating: // While rotating, only show the active rotating handle. foreach (var handle in _transformHandles) { if (_activeHandles.Contains(handle)) { handle.EnsureVisible(); } else { handle.EnsureHidden(); } } break; } }