Exemplo n.º 1
0
        /// <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;
            }
        }
Exemplo n.º 2
0
        /// <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;
            }
        }
Exemplo n.º 3
0
        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;
            }
        }