public SimulatedHandDataProvider(MixedRealityInputSimulationProfile _profile)
        {
            profile = _profile;

            HandStateLeft  = new SimulatedHandState(Handedness.Left);
            HandStateRight = new SimulatedHandState(Handedness.Right);

            HandStateLeft.Gesture  = profile.DefaultHandGesture;
            HandStateRight.Gesture = profile.DefaultHandGesture;

            HandStateLeft.Reset();
            HandStateRight.Reset();
        }
        public void Update(bool enable)
        {
            if (!enable)
            {
                return;
            }

            bool wasLeftVisible  = stateLeft.IsVisible;
            bool wasRightVisible = stateRight.IsVisible;

            if (UnityEngine.Input.GetKeyDown(profile.ToggleLeftHandKey))
            {
                stateLeft.IsAlwaysTracked = !stateLeft.IsAlwaysTracked;
            }
            if (UnityEngine.Input.GetKeyDown(profile.ToggleRightHandKey))
            {
                stateRight.IsAlwaysTracked = !stateRight.IsAlwaysTracked;
            }

            if (UnityEngine.Input.GetKeyDown(profile.LeftHandManipulationKey))
            {
                stateLeft.IsSimulated = true;
                HandleCursor();
            }
            if (UnityEngine.Input.GetKeyUp(profile.LeftHandManipulationKey))
            {
                stateLeft.IsSimulated = false;
                HandleCursor();
            }

            if (UnityEngine.Input.GetKeyDown(profile.RightHandManipulationKey))
            {
                stateRight.IsSimulated = true;
                HandleCursor();
            }
            if (UnityEngine.Input.GetKeyUp(profile.RightHandManipulationKey))
            {
                stateRight.IsSimulated = false;
                HandleCursor();
            }

            // Hide cursor if either of the hands is simulated

            /*
             * Cursor.visible = !stateLeft.IsSimulated && !stateRight.IsSimulated;
             * Cursor.lockState = (!Cursor.visible) ? CursorLockMode.Locked : CursorLockMode.None;
             */

            stateLeft.UpdateVisibility(profile.HandHideTimeout);
            stateRight.UpdateVisibility(profile.HandHideTimeout);
            // Reset when enabling
            if (!wasLeftVisible && stateLeft.IsVisible)
            {
                stateLeft.Reset(profile.DefaultHandDistance, profile.DefaultHandGesture);
            }
            if (!wasRightVisible && stateRight.IsVisible)
            {
                stateRight.Reset(profile.DefaultHandDistance, profile.DefaultHandGesture);
            }

            var mousePos = MoveSpeed * new Vector3(UnityEngine.Input.GetAxis("Mouse X"), UnityEngine.Input.GetAxis("Mouse Y"), 0);

            Vector3 mouseDelta = mousePos;

            mouseDelta.z += UnityEngine.Input.GetAxis("Mouse ScrollWheel") * profile.HandDepthMultiplier;
            float   rotationDelta            = profile.HandRotationSpeed * Time.deltaTime;
            Vector3 rotationDeltaEulerAngles = Vector3.zero;

            if (UnityEngine.Input.GetKey(profile.YawHandCCWKey))
            {
                rotationDeltaEulerAngles.y = -rotationDelta;
            }
            if (UnityEngine.Input.GetKey(profile.YawHandCWKey))
            {
                rotationDeltaEulerAngles.y = rotationDelta;
            }
            if (UnityEngine.Input.GetKey(profile.PitchHandCCWKey))
            {
                rotationDeltaEulerAngles.x = rotationDelta;
            }
            if (UnityEngine.Input.GetKey(profile.PitchHandCWKey))
            {
                rotationDeltaEulerAngles.x = -rotationDelta;
            }
            if (UnityEngine.Input.GetKey(profile.RollHandCCWKey))
            {
                rotationDeltaEulerAngles.z = rotationDelta;
            }
            if (UnityEngine.Input.GetKey(profile.RollHandCWKey))
            {
                rotationDeltaEulerAngles.z = -rotationDelta;
            }

            stateLeft.SimulateInput(mouseDelta, profile.HandJitterAmount, rotationDeltaEulerAngles);
            stateRight.SimulateInput(mouseDelta, profile.HandJitterAmount, rotationDeltaEulerAngles);

            float gestureAnimDelta = profile.HandGestureAnimationSpeed * Time.deltaTime;

            AnimateGesture(stateLeft, gestureAnimDelta);
            AnimateGesture(stateRight, gestureAnimDelta);

            //lastMousePosition = UnityEngine.Input.mousePosition;
            //Debug.Log(lastMousePosition);
            //Debug.Log(new Vector3(UnityEngine.Input.GetAxis("Mouse X"), UnityEngine.Input.GetAxis("Mouse Y"), 0));

            ApplyHandData();
        }
        public void Update()
        {
            bool wasLeftVisible  = stateLeft.IsVisible;
            bool wasRightVisible = stateRight.IsVisible;

            if (UnityEngine.Input.GetKeyDown(profile.ToggleLeftHandKey))
            {
                stateLeft.IsAlwaysTracked = !stateLeft.IsAlwaysTracked;
            }
            if (UnityEngine.Input.GetKeyDown(profile.ToggleRightHandKey))
            {
                stateRight.IsAlwaysTracked = !stateRight.IsAlwaysTracked;
            }

            if (UnityEngine.Input.GetKeyDown(profile.LeftHandManipulationKey))
            {
                stateLeft.IsSimulated = true;
            }
            if (UnityEngine.Input.GetKeyUp(profile.LeftHandManipulationKey))
            {
                stateLeft.IsSimulated = false;
            }

            if (UnityEngine.Input.GetKeyDown(profile.RightHandManipulationKey))
            {
                stateRight.IsSimulated = true;
            }
            if (UnityEngine.Input.GetKeyUp(profile.RightHandManipulationKey))
            {
                stateRight.IsSimulated = false;
            }

            // Hide cursor if either of the hands is simulated
            Cursor.visible = !stateLeft.IsSimulated && !stateRight.IsSimulated;

            stateLeft.UpdateVisibility(profile.HandHideTimeout);
            stateRight.UpdateVisibility(profile.HandHideTimeout);
            // Reset when enabling
            if (!wasLeftVisible && stateLeft.IsVisible)
            {
                stateLeft.Reset(profile.DefaultHandDistance, profile.DefaultHandGesture);
            }
            if (!wasRightVisible && stateRight.IsVisible)
            {
                stateRight.Reset(profile.DefaultHandDistance, profile.DefaultHandGesture);
            }

            Vector3 mouseDelta = (lastMousePosition.HasValue ? UnityEngine.Input.mousePosition - lastMousePosition.Value : Vector3.zero);

            mouseDelta.z += UnityEngine.Input.GetAxis("Mouse ScrollWheel") * profile.HandDepthMultiplier;
            float   rotationDelta            = profile.HandRotationSpeed * Time.deltaTime;
            Vector3 rotationDeltaEulerAngles = Vector3.zero;

            if (UnityEngine.Input.GetKey(profile.YawHandCCWKey))
            {
                rotationDeltaEulerAngles.y = -rotationDelta;
            }
            if (UnityEngine.Input.GetKey(profile.YawHandCWKey))
            {
                rotationDeltaEulerAngles.y = rotationDelta;
            }
            if (UnityEngine.Input.GetKey(profile.PitchHandCCWKey))
            {
                rotationDeltaEulerAngles.x = rotationDelta;
            }
            if (UnityEngine.Input.GetKey(profile.PitchHandCWKey))
            {
                rotationDeltaEulerAngles.x = -rotationDelta;
            }
            if (UnityEngine.Input.GetKey(profile.RollHandCCWKey))
            {
                rotationDeltaEulerAngles.z = rotationDelta;
            }
            if (UnityEngine.Input.GetKey(profile.RollHandCWKey))
            {
                rotationDeltaEulerAngles.z = -rotationDelta;
            }
            stateLeft.SimulateInput(mouseDelta, profile.HandJitterAmount, rotationDeltaEulerAngles);
            stateRight.SimulateInput(mouseDelta, profile.HandJitterAmount, rotationDeltaEulerAngles);

            float gestureAnimDelta = profile.HandGestureAnimationSpeed * Time.deltaTime;

            AnimateGesture(stateLeft, gestureAnimDelta);
            AnimateGesture(stateRight, gestureAnimDelta);

            lastMousePosition = UnityEngine.Input.mousePosition;

            ApplyHandData();
        }