/*
         * Axes
         */

        public static AxisDelegate CreateAxisDelegate(SPInputId axis, Joystick joystick = Joystick.All, bool invert = false)
        {
            var inputId = SPInputDirect.GetInputName(axis, joystick);

            if (axis.IsAxis())
            {
                if (invert)
                {
                    return(() => - UnityEngine.Input.GetAxisRaw(inputId));
                }
                else
                {
                    return(() => UnityEngine.Input.GetAxisRaw(inputId));
                }
            }
            else
            {
                if (invert)
                {
                    return(() => UnityEngine.Input.GetButton(inputId) ? -1f : 0f);
                }
                else
                {
                    return(() => UnityEngine.Input.GetButton(inputId) ? 1f : 0f);
                }
            }
        }
        public static ButtonDelegate CreateAxleButtonDelegate(SPInputId axis, AxleValueConsideration consideration, Joystick joystick = Joystick.All, float axleButtonDeadZone = InputUtil.DEFAULT_AXLEBTNDEADZONE)
        {
            var inputId = SPInputDirect.GetInputName(axis, joystick);

            if (axis.IsAxis())
            {
                switch (consideration)
                {
                case AxleValueConsideration.Positive:
                    return(() => UnityEngine.Input.GetAxisRaw(inputId) > axleButtonDeadZone);

                case AxleValueConsideration.Negative:
                    return(() => UnityEngine.Input.GetAxisRaw(inputId) < -axleButtonDeadZone);

                case AxleValueConsideration.Absolute:
                    return(() => Math.Abs(UnityEngine.Input.GetAxisRaw(inputId)) > axleButtonDeadZone);

                default:
                    return(null);
                }
            }
            else
            {
                return(() => UnityEngine.Input.GetButton(inputId));
            }
        }
        /*
         * Triggers
         */

        public static AxisDelegate CreateTriggerDelegate(SPInputId axis, Joystick joystick = Joystick.All, AxleValueConsideration axisConsideration = AxleValueConsideration.Positive)
        {
            var inputId = SPInputDirect.GetInputName(axis, joystick);

            if (axis.IsAxis())
            {
                switch (axisConsideration)
                {
                case AxleValueConsideration.Positive:
                    return(() => UnityEngine.Mathf.Clamp01(UnityEngine.Input.GetAxisRaw(inputId)));

                case AxleValueConsideration.Negative:
                    return(() => - UnityEngine.Mathf.Clamp(UnityEngine.Input.GetAxisRaw(inputId), -1f, 0f));

                case AxleValueConsideration.Absolute:
                    return(() => Math.Abs(UnityEngine.Input.GetAxisRaw(inputId)));

                default:
                    return(null);
                }
            }
            else
            {
                return(() => UnityEngine.Input.GetButton(inputId) ? 1f : 0f);
            }
        }
        /*
         * Long Trigers
         */

        /// <summary>
        /// Some controller's triggers register -1 as inactive, and 1 as active. This creates a TriggerDelegate that normalizes this value to 0->1.
        /// </summary>
        /// <param name="axis"></param>
        /// <param name="joystick"></param>
        /// <returns></returns>
        public static AxisDelegate CreateLongTriggerDelegate(SPInputId axis, Joystick joystick = Joystick.All)
        {
            var inputId = SPInputDirect.GetInputName(axis, joystick);

            if (axis.IsAxis())
            {
                return(() => (UnityEngine.Input.GetAxisRaw(inputId) + 1f) / 2f);
            }
            else
            {
                return(() => UnityEngine.Input.GetButton(inputId) ? 1f : 0f);
            }
        }
        /*
         * Buttons
         */

        public static ButtonDelegate CreateButtonDelegate(SPInputId button, Joystick joystick = Joystick.All)
        {
            var inputId = SPInputDirect.GetInputName(button, joystick);

            if (button.IsButton())
            {
                return(() => UnityEngine.Input.GetButton(inputId));
            }
            else
            {
                return(() => UnityEngine.Input.GetAxisRaw(inputId) > InputUtil.DEFAULT_AXLEBTNDEADZONE);
            }
        }