< Summary

Class:InputProcessor
Assembly:InputController
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/InputController/InputController.cs
Covered lines:42
Uncovered lines:24
Coverable lines:66
Total lines:698
Line coverage:63.6% (42 of 66)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
InputProcessor()0%110100%
PassModifierKeys(...)0%5.025090.91%
PassModifiers(...)0%8.147071.43%
IsStartMenuVisible()0%110100%
FromKey(...)0%4.054085.71%
FromMouseButton(...)0%12300%
FromMouseButtonUp(...)0%3.073080%
FromKey(...)0%4.374071.43%
FromKey(...)0%2.062075%
FromMouse(...)0%20400%
FromAxis(...)0%220100%
IsModifierSet(...)0%2100%
FocusIsInInputField()0%5.25080%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/InputController/InputController.cs

#LineLine coverage
 1using DCL;
 2using System;
 3using System.Linq;
 4using TMPro;
 5using UnityEngine;
 6using UnityEngine.EventSystems;
 7using DCL.Configuration;
 8
 9/// <summary>
 10/// Mapping for Trigger actions
 11/// </summary>
 12public enum DCLAction_Trigger
 13{
 14    //Remember to explicitly assign the value to each entry so we minimize issues with serialization + conflicts
 15    CameraChange = 100,
 16    CursorUnlock = 101,
 17
 18    ToggleNavMap = 110,
 19    ToggleFriends = 120,
 20    CloseWindow = 121,
 21    ToggleWorldChat = 122,
 22    ToggleUIVisibility = 123,
 23    ToggleControlsHud = 124,
 24    ToggleSettings = 125,
 25    ToggleStartMenu = 126,
 26    ToggleVoiceChatRecording = 127,
 27    ToggleAvatarEditorHud = 128,
 28    ToggleQuestsPanelHud = 129,
 29    ToggleAvatarNamesHud = 130,
 30    TogglePlacesAndEventsHud = 131,
 31
 32    OpenExpressions = 200,
 33    Expression_Wave = 201,
 34    Expression_FistPump = 202,
 35    Expression_Robot = 203,
 36    Expression_RaiseHand = 204,
 37    Expression_Clap = 205,
 38    Expression_ThrowMoney = 206,
 39    Expression_SendKiss = 207,
 40    Expression_Dance = 208,
 41    Expression_Hohoho = 209,
 42    Expression_Snowfall = 210,
 43
 44    //Builder In World 4xx
 45    BuildEditModeChange = 408,
 46    BuildEditModeToggleUI = 409,
 47    BuildEditModeToggleEntityList = 410,
 48    BuildEditModeToggleCatalog = 411,
 49    BuildEditModeToggleSceneInfo = 412,
 50    BuildEditModeToggleChangeCamera = 413,
 51    BuildEditModeToggleControls = 414,
 52    BuildEditModeToggleSnapMode = 415,
 53    BuildEditModeUndoAction = 417,
 54    BuildEditModeRedoAction = 418,
 55    BuildEditModeQuickBar1 = 419,
 56    BuildEditModeQuickBar2 = 420,
 57    BuildEditModeQuickBar3 = 421,
 58    BuildEditModeQuickBar4 = 422,
 59    BuildEditModeQuickBar5 = 423,
 60    BuildEditModeQuickBar6 = 424,
 61    BuildEditModeQuickBar7 = 425,
 62    BuildEditModeQuickBar8 = 426,
 63    BuildEditModeQuickBar9 = 427,
 64    BuildEditModeDuplicate = 428,
 65    BuildEditModeTranslate = 429,
 66    BuildEditModeRotate = 430,
 67    BuildEditModeScale = 431,
 68    BuildEditModeDelete = 434,
 69    BuildEditModeFocusSelectedEntities = 435,
 70    BuildEditModeReset = 443,
 71    BuildEditHideSelectedEntities = 444,
 72    BuildEditShowAllEntities = 445,
 73    BuildEditModeResetCamera = 446,
 74    BuildEditModeZoomIn = 447,
 75    BuildEditModeZoomOut = 448
 76}
 77
 78/// <summary>
 79/// Mapping for hold actions
 80/// </summary>
 81public enum DCLAction_Hold
 82{
 83    //Remember to explicitly assign the value to each entry so we minimize issues with serialization + conflicts
 84    Sprint = 1,
 85    Jump = 2,
 86    FreeCameraMode = 101,
 87    VoiceChatRecording = 102,
 88    DefaultConfirmAction = 300,
 89    DefaultCancelAction = 301,
 90    BuildEditModeMultiSelection = 432,
 91    BuildEditModeSquareMultiSelection = 433,
 92    BuildEditModeFirstPersonRotation = 436,
 93    BuildEditModeCameraAdvanceFoward = 437,
 94    BuildEditModeCameraAdvanceBack = 438,
 95    BuildEditModeCameraAdvanceLeft = 439,
 96    BuildEditModeCameraAdvanceRight = 440,
 97    BuildEditModeCameraAdvanceUp = 441,
 98    BuildEditModeCameraAdvanceDown = 442,
 99    BuildEditModeCameraPan = 446
 100}
 101
 102/// <summary>
 103/// Mapping for measurable actions
 104/// </summary>
 105public enum DCLAction_Measurable
 106{
 107    //Remember to explicitly assign the value to each entry so we minimize issues with serialization + conflicts
 108    CharacterXAxis = 1,
 109    CharacterYAxis = 2,
 110    CameraXAxis = 3,
 111    CameraYAxis = 4,
 112}
 113
 114/// <summary>
 115/// Group of actions currently actived
 116/// </summary>
 117public enum InputTypeMode
 118{
 119    OFF,
 120    GENERAL,
 121    BUILD_MODE_LOADING,
 122    BUILD_MODE
 123}
 124
 125/// <summary>
 126/// Input Controller will map inputs(keys/mouse/axis) to DCL actions, check if they can be triggered (modifiers) and rai
 127/// </summary>
 128public class InputController : MonoBehaviour
 129{
 130    public static bool ENABLE_THIRD_PERSON_CAMERA = true;
 131
 132    [Header("General Input")]
 133    public InputAction_Trigger[] triggerTimeActions;
 134
 135    public InputAction_Hold[] holdActions;
 136    public InputAction_Measurable[] measurableActions;
 137
 138    [Header("BuildMode Input")]
 139    public InputAction_Trigger[] builderTriggerTimeActions;
 140
 141    public InputAction_Hold[] builderHoldActions;
 142    public InputAction_Trigger[] loadingBuilderTriggerTimeActions;
 143
 144    bool renderingEnabled => CommonScriptableObjects.rendererState.Get();
 145    bool allUIHidden => CommonScriptableObjects.allUIHidden.Get();
 146    public InputTypeMode inputTypeMode { get; set; } = InputTypeMode.GENERAL;
 147
 148    private void Update()
 149    {
 150        if (!renderingEnabled)
 151        {
 152            Stop_Measurable(measurableActions);
 153            return;
 154        }
 155
 156        switch (inputTypeMode)
 157        {
 158            case InputTypeMode.OFF:
 159                Stop_Measurable(measurableActions);
 160                return;
 161            case InputTypeMode.GENERAL:
 162                Update_Trigger(triggerTimeActions);
 163                Update_Hold(holdActions);
 164                Update_Measurable(measurableActions);
 165                break;
 166            case InputTypeMode.BUILD_MODE_LOADING:
 167                Update_Trigger(loadingBuilderTriggerTimeActions);
 168                Stop_Measurable(measurableActions);
 169                break;
 170            case InputTypeMode.BUILD_MODE:
 171                Update_Trigger(builderTriggerTimeActions);
 172                Update_Hold(builderHoldActions);
 173                Update_Measurable(measurableActions);
 174                break;
 175        }
 176    }
 177
 178    /// <summary>
 179    /// Map the trigger actions to inputs + modifiers and check if their events must be triggered
 180    /// </summary>
 181    public void Update_Trigger(InputAction_Trigger[] triggerTimeActions)
 182    {
 183        for (var i = 0; i < triggerTimeActions.Length; i++)
 184        {
 185            var action = triggerTimeActions[i];
 186
 187            if (action.isTriggerBlocked != null && action.isTriggerBlocked.Get())
 188                continue;
 189
 190            switch (action.GetDCLAction())
 191            {
 192                case DCLAction_Trigger.CameraChange:
 193                    if (CommonScriptableObjects.cameraModeInputLocked.Get())
 194                        break;
 195
 196                    //Disable until the fine-tuning is ready
 197                    if (ENABLE_THIRD_PERSON_CAMERA)
 198                        InputProcessor.FromKey(action, KeyCode.V,
 199                            modifiers: InputProcessor.Modifier.FocusNotInInput);
 200                    break;
 201                case DCLAction_Trigger.CursorUnlock:
 202                    InputProcessor.FromMouseButtonUp(action, 1, InputProcessor.Modifier.NeedsPointerLocked);
 203#if !WEB_PLATFORM
 204                    InputProcessor.FromKey(action, KeyCode.Escape, modifiers: InputProcessor.Modifier.NeedsPointerLocked
 205#endif
 206                    break;
 207                case DCLAction_Trigger.ToggleNavMap:
 208                    if (allUIHidden)
 209                        break;
 210                    InputProcessor.FromKey(action, KeyCode.M, modifiers: InputProcessor.Modifier.FocusNotInInput);
 211                    break;
 212                case DCLAction_Trigger.ToggleFriends:
 213                    if (allUIHidden)
 214                        break;
 215                    InputProcessor.FromKey(action, KeyCode.L, modifiers: InputProcessor.Modifier.None);
 216                    break;
 217                case DCLAction_Trigger.ToggleWorldChat:
 218                    if (allUIHidden)
 219                        break;
 220                    InputProcessor.FromKey(action, KeyCode.Return, modifiers: InputProcessor.Modifier.None);
 221                    break;
 222                case DCLAction_Trigger.ToggleUIVisibility:
 223                    InputProcessor.FromKey(action, KeyCode.U, modifiers: InputProcessor.Modifier.None);
 224                    break;
 225                case DCLAction_Trigger.CloseWindow:
 226                    if (allUIHidden || DataStore.i.common.isSignUpFlow.Get())
 227                        break;
 228                    InputProcessor.FromKey(action, KeyCode.Escape, modifiers: InputProcessor.Modifier.None);
 229                    break;
 230                case DCLAction_Trigger.OpenExpressions:
 231                    if (allUIHidden)
 232                        break;
 233                    InputProcessor.FromKey(action, KeyCode.B, modifiers: InputProcessor.Modifier.FocusNotInInput);
 234                    break;
 235                case DCLAction_Trigger.ToggleControlsHud:
 236                    InputProcessor.FromKey(action, KeyCode.C, modifiers: InputProcessor.Modifier.FocusNotInInput);
 237                    break;
 238                case DCLAction_Trigger.ToggleSettings:
 239                    InputProcessor.FromKey(action, KeyCode.P, modifiers: InputProcessor.Modifier.FocusNotInInput);
 240                    break;
 241                case DCLAction_Trigger.ToggleStartMenu:
 242                    if (allUIHidden)
 243                        break;
 244                    InputProcessor.FromKey(action, KeyCode.Tab, modifiers: InputProcessor.Modifier.None);
 245                    break;
 246                case DCLAction_Trigger.TogglePlacesAndEventsHud:
 247                    InputProcessor.FromKey(action, KeyCode.X, modifiers: InputProcessor.Modifier.FocusNotInInput);
 248                    break;
 249                case DCLAction_Trigger.Expression_Wave:
 250                    InputProcessor.FromKey(action, KeyCode.Alpha1,
 251                        modifiers: InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 252                    break;
 253                case DCLAction_Trigger.Expression_FistPump:
 254                    InputProcessor.FromKey(action, KeyCode.Alpha2,
 255                        modifiers: InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 256                    break;
 257                case DCLAction_Trigger.Expression_Robot:
 258                    InputProcessor.FromKey(action, KeyCode.Alpha3,
 259                        modifiers: InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 260                    break;
 261                case DCLAction_Trigger.Expression_RaiseHand:
 262                    InputProcessor.FromKey(action, KeyCode.Alpha4,
 263                        modifiers: InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 264                    break;
 265                case DCLAction_Trigger.Expression_Clap:
 266                    InputProcessor.FromKey(action, KeyCode.Alpha5,
 267                        modifiers: InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 268                    break;
 269                case DCLAction_Trigger.Expression_ThrowMoney:
 270                    InputProcessor.FromKey(action, KeyCode.Alpha6,
 271                        modifiers: InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 272                    break;
 273                case DCLAction_Trigger.Expression_SendKiss:
 274                    InputProcessor.FromKey(action, KeyCode.Alpha7,
 275                        modifiers: InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 276                    break;
 277                case DCLAction_Trigger.BuildEditModeChange:
 278                    InputProcessor.FromKey(action, KeyCode.K, modifiers: InputProcessor.Modifier.FocusNotInInput);
 279                    break;
 280                case DCLAction_Trigger.ToggleVoiceChatRecording:
 281                    InputProcessor.FromKey(action, KeyCode.T, modifiers: InputProcessor.Modifier.FocusNotInInput, modifi
 282                    break;
 283                case DCLAction_Trigger.ToggleAvatarEditorHud:
 284                    InputProcessor.FromKey(action, KeyCode.I, modifiers: InputProcessor.Modifier.FocusNotInInput);
 285                    break;
 286                case DCLAction_Trigger.BuildEditModeToggleUI:
 287                    InputProcessor.FromKey(action, KeyCode.U, modifiers: InputProcessor.Modifier.FocusNotInInput);
 288                    break;
 289                case DCLAction_Trigger.BuildEditModeToggleChangeCamera:
 290                    InputProcessor.FromKey(action, KeyCode.V, modifiers: InputProcessor.Modifier.FocusNotInInput);
 291                    break;
 292                case DCLAction_Trigger.BuildEditModeToggleControls:
 293                    InputProcessor.FromKey(action, KeyCode.C, modifiers: InputProcessor.Modifier.FocusNotInInput);
 294                    break;
 295                case DCLAction_Trigger.BuildEditModeToggleSnapMode:
 296                    InputProcessor.FromKey(action, KeyCode.O, modifiers: InputProcessor.Modifier.FocusNotInInput);
 297                    break;
 298                case DCLAction_Trigger.BuildEditModeRedoAction:
 299                    InputProcessor.FromKey(action, KeyCode.Y, modifiers: InputProcessor.Modifier.FocusNotInInput, modifi
 300                    break;
 301                case DCLAction_Trigger.BuildEditModeUndoAction:
 302                    InputProcessor.FromKey(action, KeyCode.Z, modifiers: InputProcessor.Modifier.FocusNotInInput, modifi
 303                    break;
 304                case DCLAction_Trigger.BuildEditModeQuickBar1:
 305                    InputProcessor.FromKey(action, KeyCode.Alpha1, modifiers: InputProcessor.Modifier.FocusNotInInput);
 306                    break;
 307                case DCLAction_Trigger.BuildEditModeQuickBar2:
 308                    InputProcessor.FromKey(action, KeyCode.Alpha2, modifiers: InputProcessor.Modifier.FocusNotInInput);
 309                    break;
 310                case DCLAction_Trigger.BuildEditModeQuickBar3:
 311                    InputProcessor.FromKey(action, KeyCode.Alpha3, modifiers: InputProcessor.Modifier.FocusNotInInput);
 312                    break;
 313                case DCLAction_Trigger.BuildEditModeQuickBar4:
 314                    InputProcessor.FromKey(action, KeyCode.Alpha4, modifiers: InputProcessor.Modifier.FocusNotInInput);
 315                    break;
 316                case DCLAction_Trigger.BuildEditModeQuickBar5:
 317                    InputProcessor.FromKey(action, KeyCode.Alpha5, modifiers: InputProcessor.Modifier.FocusNotInInput);
 318                    break;
 319                case DCLAction_Trigger.BuildEditModeQuickBar6:
 320                    InputProcessor.FromKey(action, KeyCode.Alpha6, modifiers: InputProcessor.Modifier.FocusNotInInput);
 321                    break;
 322                case DCLAction_Trigger.BuildEditModeQuickBar7:
 323                    InputProcessor.FromKey(action, KeyCode.Alpha7, modifiers: InputProcessor.Modifier.FocusNotInInput);
 324                    break;
 325                case DCLAction_Trigger.BuildEditModeQuickBar8:
 326                    InputProcessor.FromKey(action, KeyCode.Alpha8, modifiers: InputProcessor.Modifier.FocusNotInInput);
 327                    break;
 328                case DCLAction_Trigger.BuildEditModeQuickBar9:
 329                    InputProcessor.FromKey(action, KeyCode.Alpha9, modifiers: InputProcessor.Modifier.FocusNotInInput);
 330                    break;
 331                case DCLAction_Trigger.BuildEditModeDelete:
 332                    InputProcessor.FromKey(action, KeyCode.Delete, modifiers: InputProcessor.Modifier.FocusNotInInput);
 333                    InputProcessor.FromKey(action, KeyCode.Backspace, modifiers: InputProcessor.Modifier.FocusNotInInput
 334                    break;
 335                case DCLAction_Trigger.BuildEditModeDuplicate:
 336                    InputProcessor.FromKey(action, KeyCode.D, modifiers: InputProcessor.Modifier.FocusNotInInput, modifi
 337                    break;
 338                case DCLAction_Trigger.BuildEditModeTranslate:
 339                    InputProcessor.FromKey(action, KeyCode.G, modifiers: InputProcessor.Modifier.FocusNotInInput);
 340                    InputProcessor.FromKey(action, KeyCode.M, modifiers: InputProcessor.Modifier.FocusNotInInput);
 341                    break;
 342                case DCLAction_Trigger.BuildEditModeRotate:
 343                    InputProcessor.FromKey(action, KeyCode.R, modifiers: InputProcessor.Modifier.FocusNotInInput);
 344                    break;
 345                case DCLAction_Trigger.BuildEditModeScale:
 346                    InputProcessor.FromKey(action, KeyCode.S, modifiers: InputProcessor.Modifier.FocusNotInInput);
 347                    break;
 348                case DCLAction_Trigger.BuildEditModeFocusSelectedEntities:
 349                    InputProcessor.FromKey(action, KeyCode.F, modifiers: InputProcessor.Modifier.FocusNotInInput);
 350                    break;
 351                case DCLAction_Trigger.BuildEditModeReset:
 352                    InputProcessor.FromKey(action, KeyCode.R, modifiers: InputProcessor.Modifier.FocusNotInInput, modifi
 353                    break;
 354                case DCLAction_Trigger.BuildEditHideSelectedEntities:
 355                    InputProcessor.FromKey(action, KeyCode.H, modifiers: InputProcessor.Modifier.FocusNotInInput);
 356                    break;
 357                case DCLAction_Trigger.BuildEditShowAllEntities:
 358                    InputProcessor.FromKey(action, KeyCode.H, modifiers: InputProcessor.Modifier.FocusNotInInput, modifi
 359                    break;
 360                case DCLAction_Trigger.BuildEditModeResetCamera:
 361                    InputProcessor.FromKey(action, KeyCode.C, modifiers: InputProcessor.Modifier.FocusNotInInput, modifi
 362                    break;
 363                case DCLAction_Trigger.BuildEditModeZoomIn:
 364                    InputProcessor.FromKey(action, KeyCode.KeypadPlus, modifiers: InputProcessor.Modifier.FocusNotInInpu
 365                    break;
 366                case DCLAction_Trigger.BuildEditModeZoomOut:
 367                    InputProcessor.FromKey(action, KeyCode.KeypadMinus, modifiers: InputProcessor.Modifier.FocusNotInInp
 368                    break;
 369                case DCLAction_Trigger.ToggleQuestsPanelHud:
 370                    InputProcessor.FromKey(action, KeyCode.J, modifiers: InputProcessor.Modifier.FocusNotInInput);
 371                    break;
 372                case DCLAction_Trigger.ToggleAvatarNamesHud:
 373                    InputProcessor.FromKey(action, KeyCode.N, modifiers: InputProcessor.Modifier.FocusNotInInput);
 374                    break;
 375                default:
 376                    throw new ArgumentOutOfRangeException();
 377            }
 378        }
 379    }
 380
 381    /// <summary>
 382    /// Map the hold actions to inputs + modifiers and check if their events must be triggered
 383    /// </summary>
 384    private void Update_Hold(InputAction_Hold[] holdActions)
 385    {
 386        for (var i = 0; i < holdActions.Length; i++)
 387        {
 388            var action = holdActions[i];
 389            switch (action.GetDCLAction())
 390            {
 391                case DCLAction_Hold.Sprint:
 392                    InputProcessor.FromKey(action, InputSettings.WalkButtonKeyCode,
 393                        InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 394                    break;
 395                case DCLAction_Hold.Jump:
 396                    InputProcessor.FromKey(action, InputSettings.JumpButtonKeyCode,
 397                        InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 398                    break;
 399                case DCLAction_Hold.FreeCameraMode:
 400                    //Disable until the fine-tuning is ready
 401                    if (ENABLE_THIRD_PERSON_CAMERA)
 402                        InputProcessor.FromKey(action, KeyCode.Y, InputProcessor.Modifier.NeedsPointerLocked);
 403                    break;
 404                case DCLAction_Hold.VoiceChatRecording:
 405                    // Push to talk functionality only triggers if no modifier key is pressed
 406                    InputProcessor.FromKey(action, KeyCode.T, InputProcessor.Modifier.FocusNotInInput, null);
 407                    break;
 408                case DCLAction_Hold.DefaultConfirmAction:
 409                    InputProcessor.FromKey(action, KeyCode.E, InputProcessor.Modifier.None);
 410                    break;
 411                case DCLAction_Hold.DefaultCancelAction:
 412                    InputProcessor.FromKey(action, KeyCode.F, InputProcessor.Modifier.None);
 413                    break;
 414                case DCLAction_Hold.BuildEditModeMultiSelection:
 415                    InputProcessor.FromKey(action, KeyCode.LeftShift, InputProcessor.Modifier.FocusNotInInput);
 416                    break;
 417                case DCLAction_Hold.BuildEditModeSquareMultiSelection:
 418                    InputProcessor.FromKey(action, KeyCode.LeftShift, InputProcessor.Modifier.FocusNotInInput);
 419                    break;
 420                case DCLAction_Hold.BuildEditModeFirstPersonRotation:
 421                    InputProcessor.FromKey(action, KeyCode.R, InputProcessor.Modifier.FocusNotInInput);
 422                    break;
 423                case DCLAction_Hold.BuildEditModeCameraAdvanceFoward:
 424                    InputProcessor.FromKey(action, KeyCode.UpArrow, InputProcessor.Modifier.FocusNotInInput);
 425                    InputProcessor.FromKey(action, KeyCode.W, InputProcessor.Modifier.FocusNotInInput);
 426                    break;
 427                case DCLAction_Hold.BuildEditModeCameraAdvanceBack:
 428                    InputProcessor.FromKey(action, KeyCode.DownArrow, InputProcessor.Modifier.FocusNotInInput);
 429                    InputProcessor.FromKey(action, KeyCode.S, InputProcessor.Modifier.FocusNotInInput);
 430                    break;
 431                case DCLAction_Hold.BuildEditModeCameraAdvanceLeft:
 432                    InputProcessor.FromKey(action, KeyCode.LeftArrow, InputProcessor.Modifier.FocusNotInInput);
 433                    InputProcessor.FromKey(action, KeyCode.A, InputProcessor.Modifier.FocusNotInInput);
 434                    break;
 435                case DCLAction_Hold.BuildEditModeCameraAdvanceRight:
 436                    InputProcessor.FromKey(action, KeyCode.RightArrow, InputProcessor.Modifier.FocusNotInInput);
 437                    InputProcessor.FromKey(action, KeyCode.D, InputProcessor.Modifier.FocusNotInInput);
 438                    break;
 439                case DCLAction_Hold.BuildEditModeCameraAdvanceUp:
 440                    InputProcessor.FromKey(action, KeyCode.E, InputProcessor.Modifier.FocusNotInInput);
 441                    break;
 442                case DCLAction_Hold.BuildEditModeCameraAdvanceDown:
 443                    InputProcessor.FromKey(action, KeyCode.Q, InputProcessor.Modifier.FocusNotInInput);
 444                    break;
 445                case DCLAction_Hold.BuildEditModeCameraPan:
 446                    InputProcessor.FromKey(action, KeyCode.LeftShift, InputProcessor.Modifier.FocusNotInInput);
 447                    break;
 448                default:
 449                    throw new ArgumentOutOfRangeException();
 450            }
 451        }
 452    }
 453
 454    /// <summary>
 455    /// Map the measurable actions to inputs + modifiers and check if their events must be triggered
 456    /// </summary>
 457    private void Update_Measurable(InputAction_Measurable[] measurableActions)
 458    {
 459        for (var i = 0; i < measurableActions.Length; i++)
 460        {
 461            var action = measurableActions[i];
 462            switch (action.GetDCLAction())
 463            {
 464                case DCLAction_Measurable.CharacterXAxis:
 465                    InputProcessor.FromAxis(action, "Horizontal",
 466                        InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 467                    break;
 468                case DCLAction_Measurable.CharacterYAxis:
 469                    InputProcessor.FromAxis(action, "Vertical",
 470                        InputProcessor.Modifier.FocusNotInInput | InputProcessor.Modifier.NotInStartMenu);
 471                    break;
 472                case DCLAction_Measurable.CameraXAxis:
 473                    InputProcessor.FromAxis(action, "Mouse X", InputProcessor.Modifier.NeedsPointerLocked);
 474                    break;
 475                case DCLAction_Measurable.CameraYAxis:
 476                    InputProcessor.FromAxis(action, "Mouse Y", InputProcessor.Modifier.NeedsPointerLocked);
 477                    break;
 478                default:
 479                    throw new ArgumentOutOfRangeException();
 480            }
 481        }
 482    }
 483
 484    private void Stop_Measurable(InputAction_Measurable[] measurableActions)
 485    {
 486        for (var i = 0; i < measurableActions.Length; i++)
 487        {
 488            measurableActions[i].RaiseOnValueChanged(0);
 489        }
 490    }
 491}
 492
 493/// <summary>
 494/// Helper class that wraps the processing of inputs and modifiers to trigger actions events
 495/// </summary>
 496public static class InputProcessor
 497{
 1498    private static readonly KeyCode[] MODIFIER_KEYS = new[] { KeyCode.LeftControl, KeyCode.LeftAlt, KeyCode.LeftShift, K
 499
 500    [Flags]
 501    public enum Modifier
 502    {
 503        //Set the values as bit masks
 504        None = 0b0000000, // No modifier needed
 505        NeedsPointerLocked = 0b0000001, // The pointer must be locked to the game
 506        FocusNotInInput = 0b0000010, // The game focus cannot be in an input field
 507        NotInStartMenu = 0b0000100 // The game focus cannot be in full-screen start menu
 508    }
 509
 510    /// <summary>
 511    /// Check if the modifier keys are pressed
 512    /// </summary>
 513    /// <param name="modifierKeys"> Keycodes modifiers</param>
 514    /// <returns></returns>
 515    public static Boolean PassModifierKeys(KeyCode[] modifierKeys)
 516    {
 2192996517        for (var i = 0; i < MODIFIER_KEYS.Length; i++)
 518        {
 880802519            var keyCode = MODIFIER_KEYS[i];
 880802520            var pressed = Input.GetKey(keyCode);
 880802521            if (modifierKeys == null)
 522            {
 862784523                if (pressed)
 0524                    return false;
 525            }
 526            else
 527            {
 18018528                if (modifierKeys.Contains(keyCode) != pressed)
 9009529                    return false;
 530            }
 531        }
 532
 215696533        return true;
 534    }
 535
 536    /// <summary>
 537    /// Check if a miscellaneous modifiers are present. These modifiers are related to the meta-state of the application
 538    /// they can be anything such as mouse pointer state, where the focus is, camera mode...
 539    /// </summary>
 540    /// <param name="modifiers"></param>
 541    /// <returns></returns>
 542    public static bool PassModifiers(Modifier modifiers)
 543    {
 323798544        if (IsModifierSet(modifiers, Modifier.NeedsPointerLocked) && !DCL.Helpers.Utils.IsCursorLocked)
 45015545            return false;
 546
 278783547        if (IsModifierSet(modifiers, Modifier.FocusNotInInput) && FocusIsInInputField())
 0548            return false;
 549
 278783550        if (IsModifierSet(modifiers, Modifier.NotInStartMenu) && IsStartMenuVisible())
 0551            return false;
 552
 278783553        return true;
 554    }
 555
 99099556    private static bool IsStartMenuVisible() => DataStore.i.exploreV2.isOpen.Get();
 557
 558    /// <summary>
 559    /// Process an input action mapped to a keyboard key.
 560    /// </summary>
 561    /// <param name="action">Trigger Action to perform</param>
 562    /// <param name="key">KeyCode mapped to this action</param>
 563    /// <param name="modifierKeys">KeyCodes required to perform the action</param>
 564    /// <param name="modifiers">Miscellaneous modifiers required for this action</param>
 565    public static void FromKey(InputAction_Trigger action, KeyCode key, KeyCode[] modifierKeys = null,
 566        Modifier modifiers = Modifier.None)
 567    {
 215690568        if (!PassModifiers(modifiers))
 9003569            return;
 570
 206687571        if (!PassModifierKeys(modifierKeys))
 9009572            return;
 573
 197678574        if (Input.GetKeyDown(key))
 0575            action.RaiseOnTriggered();
 197678576    }
 577
 578    /// <summary>
 579    /// Process an input action mapped to a button.
 580    /// </summary>
 581    /// <param name="action">Trigger Action to perform</param>
 582    /// <param name="mouseButtonIdx">Index of the mouse button mapped to this action</param>
 583    /// <param name="modifiers">Miscellaneous modifiers required for this action</param>
 584    public static void FromMouseButton(InputAction_Trigger action, int mouseButtonIdx,
 585        Modifier modifiers = Modifier.None)
 586    {
 0587        if (!PassModifiers(modifiers))
 0588            return;
 589
 0590        if (Input.GetMouseButton(mouseButtonIdx))
 0591            action.RaiseOnTriggered();
 0592    }
 593
 594    public static void FromMouseButtonUp(InputAction_Trigger action, int mouseButtonIdx,
 595        Modifier modifiers = Modifier.None)
 596    {
 9009597        if (!PassModifiers(modifiers))
 9003598            return;
 599
 6600        if (Input.GetMouseButtonUp(mouseButtonIdx))
 0601            action.RaiseOnTriggered();
 6602    }
 603
 604    /// <summary>
 605    /// Process an input action mapped to a keyboard key
 606    /// </summary>
 607    /// <param name="action">Hold Action to perform</param>
 608    /// <param name="key">KeyCode mapped to this action</param>
 609    /// <param name="modifiers">Miscellaneous modifiers required for this action</param>
 610    public static void FromKey(InputAction_Hold action, KeyCode key, Modifier modifiers = Modifier.None)
 611    {
 63063612        if (!PassModifiers(modifiers))
 9003613            return;
 614
 54060615        if (Input.GetKeyDown(key))
 0616            action.RaiseOnStarted();
 54060617        if (Input.GetKeyUp(key))
 0618            action.RaiseOnFinished();
 54060619    }
 620
 621    /// <summary>
 622    /// Process an input action mapped to a keyboard key
 623    /// </summary>
 624    /// <param name="action">Hold Action to perform</param>
 625    /// <param name="key">KeyCode mapped to this action</param>
 626    /// <param name="modifiers">Miscellaneous modifiers required for this action</param>
 627    /// <param name="modifierKeys">KeyCodes required to perform the action</param>
 628    public static void FromKey(InputAction_Hold action, KeyCode key, Modifier modifiers, KeyCode[] modifierKeys)
 629    {
 18018630        if (!PassModifierKeys(modifierKeys))
 0631            return;
 632
 18018633        FromKey(action, key, modifiers);
 18018634    }
 635
 636    /// <summary>
 637    /// Process an input action mapped to a mouse button
 638    /// </summary>
 639    /// <param name="action">Hold Action to perform</param>
 640    /// <param name="mouseButtonIdx">Index of the mouse button</param>
 641    /// <param name="modifiers">Miscellaneous modifiers required for this action</param>
 642    public static void FromMouse(InputAction_Hold action, int mouseButtonIdx, Modifier modifiers = Modifier.None)
 643    {
 0644        if (!PassModifiers(modifiers))
 0645            return;
 646
 0647        if (Input.GetMouseButtonDown(mouseButtonIdx))
 0648            action.RaiseOnStarted();
 0649        if (Input.GetMouseButtonUp(mouseButtonIdx))
 0650            action.RaiseOnFinished();
 0651    }
 652
 653    /// <summary>
 654    /// Process an input action mapped to an axis
 655    /// </summary>
 656    /// <param name="action">Measurable Action to perform</param>
 657    /// <param name="axisName">Axis name</param>
 658    /// <param name="modifiers">Miscellaneous modifiers required for this action</param>
 659    public static void FromAxis(InputAction_Measurable action, string axisName, Modifier modifiers = Modifier.None)
 660    {
 36036661        if (!PassModifiers(modifiers))
 662        {
 18006663            action.RaiseOnValueChanged(0);
 18006664            return;
 665        }
 666
 18030667        action.RaiseOnValueChanged(Input.GetAxis(axisName));
 18030668    }
 669
 670    /// <summary>
 671    /// Bitwise check for the modifiers flags
 672    /// </summary>
 673    /// <param name="modifiers">Modifier to check</param>
 674    /// <param name="value">Modifier mapped to a bit to check</param>
 675    /// <returns></returns>
 676    public static bool IsModifierSet(Modifier modifiers, Modifier value)
 677    {
 0678        int flagsValue = (int)modifiers;
 0679        int flagValue = (int)value;
 680
 0681        return (flagsValue & flagValue) != 0;
 682    }
 683
 684    public static bool FocusIsInInputField()
 685    {
 216042686        if (EventSystem.current == null)
 201882687            return false;
 688
 14160689        if (EventSystem.current.currentSelectedGameObject != null &&
 690            (EventSystem.current.currentSelectedGameObject.GetComponent<TMP_InputField>() != null ||
 691             EventSystem.current.currentSelectedGameObject.GetComponent<UnityEngine.UI.InputField>() != null))
 692        {
 0693            return true;
 694        }
 695
 14160696        return false;
 697    }
 698}