main 7f2ee08aec0e cached
334 files
314.4 KB
102.5k tokens
80 symbols
1 requests
Download .txt
Showing preview only (400K chars total). Download the full file or copy to clipboard to get everything.
Repository: oculus-samples/Unreal-HandGameplay
Branch: main
Commit: 7f2ee08aec0e
Files: 334
Total size: 314.4 KB

Directory structure:
gitextract_c23nrrk_/

├── .gitattributes
├── .github/
│   └── ISSUE_TEMPLATE/
│       └── bug_report.yml
├── .gitignore
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Config/
│   ├── Android/
│   │   └── AndroidEngine.ini
│   ├── DefaultDeviceProfiles.ini
│   ├── DefaultEditor.ini
│   ├── DefaultEngine.ini
│   ├── DefaultGame.ini
│   └── DefaultInput.ini
├── Content/
│   └── HandGameplay/
│       ├── Audio/
│       │   ├── GrabSound.uasset
│       │   ├── LAST_TestAudio_Release01.uasset
│       │   ├── LAST_TestAudio_Release02.uasset
│       │   ├── LAST_TestAudio_Release03.uasset
│       │   ├── ReleaseSound.uasset
│       │   ├── SoundAttenuationForSpatialization.uasset
│       │   ├── generic_grab_01.uasset
│       │   ├── generic_grab_02.uasset
│       │   ├── generic_grab_03.uasset
│       │   ├── generic_grab_04.uasset
│       │   ├── impacts/
│       │   │   ├── sfx_impact_primary_block_01.uasset
│       │   │   ├── sfx_impact_primary_block_02.uasset
│       │   │   ├── sfx_impact_primary_block_03.uasset
│       │   │   ├── sfx_impact_primary_block_04.uasset
│       │   │   ├── sfx_impact_primary_block_05.uasset
│       │   │   ├── sfx_impact_primary_block_06.uasset
│       │   │   ├── sfx_impact_primary_block_07.uasset
│       │   │   ├── sfx_impact_primary_block_Cue.uasset
│       │   │   ├── sfx_impact_secondary_block_01.uasset
│       │   │   ├── sfx_impact_secondary_block_02.uasset
│       │   │   ├── sfx_impact_secondary_block_03.uasset
│       │   │   ├── sfx_impact_secondary_block_04.uasset
│       │   │   ├── sfx_impact_secondary_block_05.uasset
│       │   │   ├── sfx_impact_secondary_block_06.uasset
│       │   │   ├── sfx_impact_secondary_block_07.uasset
│       │   │   ├── sfx_impact_secondary_block_08.uasset
│       │   │   ├── sfx_impact_secondary_block_09.uasset
│       │   │   ├── sfx_impact_secondary_block_10.uasset
│       │   │   ├── sfx_impact_secondary_block_11.uasset
│       │   │   ├── sfx_impact_secondary_block_12.uasset
│       │   │   ├── sfx_impact_secondary_block_13.uasset
│       │   │   └── sfx_impact_secondary_block_Cue.uasset
│       │   ├── laser/
│       │   │   ├── LaserSound.uasset
│       │   │   ├── sfx_laser_end.uasset
│       │   │   ├── sfx_laser_lp.uasset
│       │   │   └── sfx_laser_start.uasset
│       │   ├── mus_showcase_hands01.uasset
│       │   └── sfx_ambient_outdoor_forest_ambix.uasset
│       ├── Blueprints/
│       │   ├── HandsCharacter.uasset
│       │   └── HandsGameMode.uasset
│       ├── Environment/
│       │   ├── DustMotes/
│       │   │   ├── DustMotes_mat.uasset
│       │   │   ├── DustMotes_system.uasset
│       │   │   ├── DustMotes_vfx.uasset
│       │   │   ├── T_Epic_sub_dustParticle.uasset
│       │   │   ├── vfxm_Dust.uasset
│       │   │   ├── vfxm_GradientCircle.uasset
│       │   │   └── vfxm_GradientCircle_Inst.uasset
│       │   ├── EnvMatParms.uasset
│       │   ├── HT_cube_Tex.uasset
│       │   ├── snow_envi/
│       │   │   └── materials/
│       │   │       └── front_rock_snow_bc.uasset
│       │   ├── summer_envi/
│       │   │   ├── back_wall_bc.uasset
│       │   │   ├── back_wall_mat.uasset
│       │   │   ├── back_wall_sm.uasset
│       │   │   ├── cieling_bc.uasset
│       │   │   ├── cieling_mat.uasset
│       │   │   ├── cieling_sm.uasset
│       │   │   ├── cloud.uasset
│       │   │   ├── cloud_sm.uasset
│       │   │   ├── clouds_bc.uasset
│       │   │   ├── collision.uasset
│       │   │   ├── front_rock_bc.uasset
│       │   │   ├── front_rock_mat.uasset
│       │   │   ├── front_rock_sm.uasset
│       │   │   ├── front_statue_bc.uasset
│       │   │   ├── front_statue_mat.uasset
│       │   │   ├── front_statue_sm.uasset
│       │   │   ├── grass_bc.uasset
│       │   │   ├── grass_mat.uasset
│       │   │   ├── grass_sm.uasset
│       │   │   ├── left_wall_bc.uasset
│       │   │   ├── left_wall_mat.uasset
│       │   │   ├── left_wall_sm.uasset
│       │   │   ├── main_floor_bc.uasset
│       │   │   ├── main_floor_mat.uasset
│       │   │   ├── main_floor_sm.uasset
│       │   │   ├── right_wall_bc.uasset
│       │   │   ├── right_wall_mat.uasset
│       │   │   ├── right_wall_sm.uasset
│       │   │   └── vines_bc.uasset
│       │   ├── vfxm_WindFoliage.uasset
│       │   ├── vfxm_WindGrass_Inst.uasset
│       │   ├── vfxm_WindVines_Inst.uasset
│       │   └── vfxsm_vinesVtxAlpha.uasset
│       ├── Hands/
│       │   ├── Models/
│       │   │   ├── HandMat.uasset
│       │   │   ├── OculusHand_L.uasset
│       │   │   ├── OculusHand_L_Skeleton.uasset
│       │   │   ├── OculusHand_R.uasset
│       │   │   └── OculusHand_R_Skeleton.uasset
│       │   ├── TutorialHand.uasset
│       │   ├── TutorialHandLeft.uasset
│       │   └── TutorialHandRight.uasset
│       ├── Input/
│       │   ├── Actions/
│       │   │   ├── AvatarLeftSystemGesture.uasset
│       │   │   ├── LogGestureState.uasset
│       │   │   ├── LogLeftHand.uasset
│       │   │   ├── LogRightHand.uasset
│       │   │   ├── TogglePoseRecording.uasset
│       │   │   ├── TogglePoseRecordingLeft.uasset
│       │   │   └── TogglePoseRecordingRight.uasset
│       │   └── InputMappingContext.uasset
│       ├── Levels/
│       │   ├── HandGameplayShowcase.umap
│       │   ├── HandRecognitionShowcaseArt.umap
│       │   ├── HandRecognitionShowcaseAudio.umap
│       │   └── HandRecognitionShowcaseVFX.umap
│       ├── Props/
│       │   ├── Blocks/
│       │   │   ├── Blocks001_Throwable_sm.uasset
│       │   │   ├── Blocks01_bc.uasset
│       │   │   ├── Blocks01_bc_Emissive.uasset
│       │   │   ├── Blocks01_nm.uasset
│       │   │   ├── InteractableBrick.uasset
│       │   │   ├── NS_BrickImpact.uasset
│       │   │   ├── T_Epic_SUB_UV_Small_Rocks.uasset
│       │   │   ├── vfxm_Blocks01_Throwable.uasset
│       │   │   ├── vfxm_Blocks01_Throwable_Inst.uasset
│       │   │   └── vfxm_ParticleSpriteUnlitSubUV.uasset
│       │   ├── Button/
│       │   │   ├── PushButtonBP.uasset
│       │   │   ├── SFX/
│       │   │   │   ├── GameConsole_button_press_in_01.uasset
│       │   │   │   └── GameConsole_button_press_out_04.uasset
│       │   │   ├── ToggleButtonBP.uasset
│       │   │   └── testbutton_sm.uasset
│       │   ├── RingWeapon/
│       │   │   ├── 2HandedBeamProp_Mesh.uasset
│       │   │   ├── InteractableArtefactHandle.uasset
│       │   │   ├── InteractableTwoHandedArtefact.uasset
│       │   │   ├── TwoHandArtefact_StartBeam.uasset
│       │   │   ├── TwoHandedBeamSystem.uasset
│       │   │   ├── vfxm_2HandedBeamProp.uasset
│       │   │   ├── vfxm_OrbFloating.uasset
│       │   │   ├── vfxm_TwoHandedArtefactBeam.uasset
│       │   │   └── vfxm_TwoHandedArtefactBeam_Inst.uasset
│       │   ├── Table/
│       │   │   ├── table_bc.uasset
│       │   │   ├── table_mat.uasset
│       │   │   └── table_sm.uasset
│       │   ├── Target/
│       │   │   ├── TargetBP.uasset
│       │   │   ├── sfx_spinning_target_01_loop.uasset
│       │   │   ├── target_m.uasset
│       │   │   ├── target_pentagon_sm.uasset
│       │   │   ├── targets_bc.uasset
│       │   │   └── targets_em.uasset
│       │   ├── TeleportBeacon/
│       │   │   ├── Activate_vfx.uasset
│       │   │   ├── NS_Activate.uasset
│       │   │   ├── TeleportBeacon.uasset
│       │   │   ├── TeleportationPad.uasset
│       │   │   ├── TeleportationPadMesh.uasset
│       │   │   ├── vfxm_ActivateGlow_Inst.uasset
│       │   │   ├── vfxm_AlphaPanner.uasset
│       │   │   ├── vfxm_TeleportBeaconPointerArrow.uasset
│       │   │   ├── vfxmi_TeleportBeacon.uasset
│       │   │   ├── vfxmi_TeleportPointerArrowRing.uasset
│       │   │   ├── vfxsm_TeleportBeacon.uasset
│       │   │   └── vfxsm_TeleportPointerArrowRing.uasset
│       │   └── TetherBall/
│       │       ├── Art/
│       │       │   ├── ball_bc.uasset
│       │       │   ├── ball_mat.uasset
│       │       │   ├── ball_sm.uasset
│       │       │   ├── tether_ball_base.uasset
│       │       │   ├── tether_ball_base_mat.uasset
│       │       │   ├── tether_ball_base_sm.uasset
│       │       │   └── tether_mat.uasset
│       │       ├── SFX/
│       │       │   ├── TetherBallHit.uasset
│       │       │   ├── TetherBallSoundConcurrency.uasset
│       │       │   ├── TetherBall_RubberThick_Imp_01.uasset
│       │       │   ├── TetherBall_RubberThick_Imp_02.uasset
│       │       │   ├── TetherBall_RubberThick_Imp_03.uasset
│       │       │   ├── TetherBall_RubberThick_Imp_04.uasset
│       │       │   ├── TetherBall_RubberThick_Imp_05.uasset
│       │       │   ├── TetherBall_RubberThick_Imp_06.uasset
│       │       │   ├── TetherBall_RubberThick_Imp_07.uasset
│       │       │   ├── TetherBall_RubberThick_Imp_08.uasset
│       │       │   └── TetherBall_RubberThick_Imp_09.uasset
│       │       ├── TetherBallBP.uasset
│       │       ├── ThetherBallPhysMat.uasset
│       │       ├── VFX/
│       │       │   └── spawn_tetherballBase_ps.uasset
│       │       └── tether_ball_sm.uasset
│       └── SharedArt/
│           ├── Blue.uasset
│           ├── FlatBlue.uasset
│           ├── Red.uasset
│           ├── T_Caustic01.uasset
│           ├── T_WorleyNoise01.uasset
│           └── TextBackground.uasset
├── HandGameplay.uproject
├── LICENSE
├── Platforms/
│   └── HoloLens/
│       └── Config/
│           └── HoloLensEngine.ini
├── Plugins/
│   ├── OculusHandTools/
│   │   ├── .gitattributes
│   │   ├── .gitignore
│   │   ├── Config/
│   │   │   └── FilterPlugin.ini
│   │   ├── Content/
│   │   │   ├── BlueprintMacros.uasset
│   │   │   ├── Button/
│   │   │   │   ├── IsButtonableInterface.uasset
│   │   │   │   └── PushButtonBaseBP.uasset
│   │   │   ├── Fonts/
│   │   │   │   ├── OculusSans-Black.uasset
│   │   │   │   ├── OculusSans-BlackItalic.uasset
│   │   │   │   ├── OculusSans-BlackItalic_Font.uasset
│   │   │   │   ├── OculusSans-Black_Font.uasset
│   │   │   │   ├── OculusSans-Bold.uasset
│   │   │   │   ├── OculusSans-BoldItalic.uasset
│   │   │   │   ├── OculusSans-BoldItalic_Font.uasset
│   │   │   │   ├── OculusSans-Bold_Font.uasset
│   │   │   │   ├── OculusSans-DemiBold.uasset
│   │   │   │   ├── OculusSans-DemiBoldItalic.uasset
│   │   │   │   ├── OculusSans-DemiBoldItalic_Font.uasset
│   │   │   │   ├── OculusSans-DemiBold_Font.uasset
│   │   │   │   ├── OculusSans-Light.uasset
│   │   │   │   ├── OculusSans-LightItalic.uasset
│   │   │   │   ├── OculusSans-LightItalic_Font.uasset
│   │   │   │   ├── OculusSans-Light_Font.uasset
│   │   │   │   ├── OculusSans-Medium.uasset
│   │   │   │   ├── OculusSans-MediumItalic.uasset
│   │   │   │   ├── OculusSans-MediumItalic_Font.uasset
│   │   │   │   ├── OculusSans-Medium_Font.uasset
│   │   │   │   ├── OculusSans-Normal.uasset
│   │   │   │   ├── OculusSans-NormalItalic.uasset
│   │   │   │   ├── OculusSans-NormalItalic_Font.uasset
│   │   │   │   ├── OculusSans-Normal_Font.uasset
│   │   │   │   ├── OculusSans-Regular.uasset
│   │   │   │   ├── OculusSans-RegularItalic.uasset
│   │   │   │   ├── OculusSans-RegularItalic_Font.uasset
│   │   │   │   ├── OculusSans-Regular_Font.uasset
│   │   │   │   ├── OculusSans-SemiBold.uasset
│   │   │   │   ├── OculusSans-SemiBoldItalic.uasset
│   │   │   │   ├── OculusSans-SemiBoldItalic_Font.uasset
│   │   │   │   ├── OculusSans-SemiBold_Font.uasset
│   │   │   │   ├── OculusSans-Thin.uasset
│   │   │   │   ├── OculusSans-ThinItalic.uasset
│   │   │   │   ├── OculusSans-ThinItalic_Font.uasset
│   │   │   │   ├── OculusSans-Thin_Font.uasset
│   │   │   │   ├── OculusSans-Ultra.uasset
│   │   │   │   ├── OculusSans-UltraItalic.uasset
│   │   │   │   ├── OculusSans-UltraItalic_Font.uasset
│   │   │   │   └── OculusSans-Ultra_Font.uasset
│   │   │   ├── HandDebug/
│   │   │   │   ├── HandDebugActor.uasset
│   │   │   │   ├── HandDebugWidget.uasset
│   │   │   │   ├── STADIUM_Black-01.uasset
│   │   │   │   └── WidgetInvisibleMaterial.uasset
│   │   │   ├── Hands/
│   │   │   │   ├── HandsCharacterBase.uasset
│   │   │   │   ├── HandsCharacterHandState.uasset
│   │   │   │   ├── TeleportSelector.uasset
│   │   │   │   └── TutorialHand.uasset
│   │   │   ├── RespawnProps/
│   │   │   │   ├── FloorIdentifier.uasset
│   │   │   │   └── RespawnFromFloor.uasset
│   │   │   └── Selectors/
│   │   │       ├── AimingGlow.uasset
│   │   │       ├── DefaultAimingActor.uasset
│   │   │       └── DefaultAimingSphere.uasset
│   │   ├── OculusHandTools.uplugin
│   │   ├── README.md
│   │   ├── README_HandInput.md
│   │   ├── README_HandPoseRecognition.md
│   │   ├── README_HandTrackingFilter.md
│   │   ├── README_Interactable.md
│   │   ├── README_OculusUtils.md
│   │   ├── README_ThrowAssist.md
│   │   └── Source/
│   │       ├── HandInput/
│   │       │   ├── CameraHandInput.cpp
│   │       │   ├── CameraHandInput.h
│   │       │   ├── EnumMap.h
│   │       │   ├── HandInput.Build.cs
│   │       │   ├── HandInput.cpp
│   │       │   ├── HandInput.h
│   │       │   ├── HandInputModule.cpp
│   │       │   ├── HandInputModule.h
│   │       │   └── QuatUtil.h
│   │       ├── HandTrackingFilter/
│   │       │   ├── HandTrackingFilter.Build.cs
│   │       │   ├── HandTrackingFilter.cpp
│   │       │   ├── HandTrackingFilter.h
│   │       │   ├── HandTrackingFilterComponent.cpp
│   │       │   ├── HandTrackingFilterComponent.h
│   │       │   └── QuatUtil.h
│   │       ├── OculusHandPoseRecognition/
│   │       │   ├── OculusHandPoseRecognition.Build.cs
│   │       │   ├── Private/
│   │       │   │   ├── FRecordHandPoseAction.h
│   │       │   │   ├── FWaitForHandGestureAction.h
│   │       │   │   ├── FWaitForHandPoseAction.h
│   │       │   │   ├── HandGesture.cpp
│   │       │   │   ├── HandGestureRecognizer.cpp
│   │       │   │   ├── HandPose.cpp
│   │       │   │   ├── HandPoseRecognizer.cpp
│   │       │   │   ├── HandRecognitionFunctionLibrary.cpp
│   │       │   │   ├── HandRecognitionGameMode.cpp
│   │       │   │   ├── OculusHandPoseRecognitionModule.cpp
│   │       │   │   └── PoseableHandComponent.cpp
│   │       │   └── Public/
│   │       │       ├── HandGesture.h
│   │       │       ├── HandGestureRecognizer.h
│   │       │       ├── HandPose.h
│   │       │       ├── HandPoseRecognizer.h
│   │       │       ├── HandRecognitionFunctionLibrary.h
│   │       │       ├── HandRecognitionGameMode.h
│   │       │       ├── OculusHandPoseRecognitionModule.h
│   │       │       └── PoseableHandComponent.h
│   │       ├── OculusInteractable/
│   │       │   ├── OculusInteractable.Build.cs
│   │       │   ├── Private/
│   │       │   │   ├── AimingActor.cpp
│   │       │   │   ├── HandGrabbingComponent.cpp
│   │       │   │   ├── Interactable.cpp
│   │       │   │   ├── InteractableFunctionLibrary.cpp
│   │       │   │   ├── InteractableSelector.cpp
│   │       │   │   ├── OculusInteractableModule.cpp
│   │       │   │   ├── TransformString.cpp
│   │       │   │   └── TransformString.h
│   │       │   └── Public/
│   │       │       ├── AimingActor.h
│   │       │       ├── HandGrabbingComponent.h
│   │       │       ├── Interactable.h
│   │       │       ├── InteractableFunctionLibrary.h
│   │       │       ├── InteractablePose.h
│   │       │       ├── InteractableSelector.h
│   │       │       └── OculusInteractableModule.h
│   │       └── OculusThrowAssist/
│   │           ├── OculusThrowAssist.Build.cs
│   │           ├── Private/
│   │           │   ├── OculusThrowAssistModule.cpp
│   │           │   ├── ThrowingComponent.cpp
│   │           │   └── TransformBufferComponent.cpp
│   │           └── Public/
│   │               ├── OculusThrowAssistModule.h
│   │               ├── ThrowingComponent.h
│   │               └── TransformBufferComponent.h
│   └── OculusUtils/
│       ├── OculusUtils.uplugin
│       └── Source/
│           └── OculusUtils/
│               ├── OculusUtils.Build.cs
│               ├── Private/
│               │   ├── ContinuousOverlapSphereComponent.cpp
│               │   ├── OculusDeveloperTelemetry.cpp
│               │   ├── OculusUtilsLibrary.cpp
│               │   └── OculusUtilsModule.cpp
│               └── Public/
│                   ├── ContinuousOverlapSphereComponent.h
│                   ├── OculusDeveloperTelemetry.h
│                   ├── OculusUtilsLibrary.h
│                   └── OculusUtilsModule.h
├── README.md
└── Source/
    ├── HandGameplay/
    │   ├── HandGameplay.Build.cs
    │   ├── HandGameplay.cpp
    │   ├── HandGameplay.h
    │   ├── HandGameplayGameModeBase.cpp
    │   ├── HandGameplayGameModeBase.h
    │   └── UpdatePermissions.xml
    ├── HandGameplay.Target.cs
    └── HandGameplayEditor.Target.cs

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
*.a filter=lfs diff=lfs merge=lfs -text
*.lib filter=lfs diff=lfs merge=lfs -text
*.uasset filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
*.umap filter=lfs diff=lfs merge=lfs -text
*.jpg filter=lfs diff=lfs merge=lfs -text


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: 🐛 Bug Report
description: Report a reproducible bug or regression.
title: '[BUG] '
body:
  - type: markdown
    attributes:
      value: Thank you for taking the time to report an issue!
  - type: input
    id: version
    attributes:
      label: Unreal Engine version
      placeholder: 5.3.0
    validations:
      required: true
  - type: dropdown
    id: meta-fork-unreal
    attributes:
      label: Using the Meta fork of Unreal Engine?
      options:
        - Yes, using the Meta fork
        - No, using the standard Epic build
    validations:
      required: true
  - type: checkboxes
    id: where
    attributes:
      label: Where does the issue occur?
      options:
        - label: In Unreal Editor
          required: false
        - label: In Quest builds
          required: false
  - type: textarea
    id: description
    attributes:
      label: Description
      description: A clear and concise description of what the bug is.
    validations:
      required: true
  - type: textarea
    id: reproduction
    attributes:
      label: Steps to reproduce
      description: The list of steps that reproduce the issue.
    validations:
      required: true
  - type: textarea
    id: logs
    attributes:
      label: Logs
      description: |
        For in-editor bugs, paste the logs from the "Output Log" window in the Unreal Editor.
        For on-device Quest bugs, paste the output of `adb logcat -s "UE"`
      render: text
    validations:
      required: true
  - type: textarea
    id: extra
    attributes:
      label: Additional info
      description: Please provide screenshots, a video, or any other relevant information.


================================================
FILE: .gitignore
================================================
# Visual Studio 2015 user specific files
.vs/

# Compiled Object files
*.slo
*.lo
*.o
*.obj

# Precompiled Headers
*.gch
*.pch

# Fortran module files
*.mod

# Executables
*.exe
*.out
*.app
*.ipa

# These project files can be generated by the engine
*.xcodeproj
*.xcworkspace
*.sln
*.suo
*.opensdf
*.sdf
*.VC.db
*.VC.opendb

# Precompiled Assets
SourceArt/**/*.png
SourceArt/**/*.tga

# Binary Files
Binaries/*
Plugins/*/Binaries/*

# Builds
Build/*

# Whitelist PakBlacklist-<BuildConfiguration>.txt files
!Build/*/
Build/*/**
!Build/*/PakBlacklist*.txt

# Don't ignore icon files in Build
!Build/*/**/
!Build/**/*.ico
!Build/**/*.png

# Built data for maps
*_BuiltData.uasset

# Configuration files generated by the Editor
Saved/*

# Compiled source files for the engine to use
Intermediate/*
Plugins/*/Intermediate/*

# Cache files for the editor to use
DerivedDataCache/*

StoreAssets/
GenerateSln.ps1
Config/DefaultEditorSettings.ini

Build/Android/res/drawable*/
lfs/
hooks/
.vsconfig


================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Code of Conduct

## Our Pledge

In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to make participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.

## Our Standards

Examples of behavior that contributes to creating a positive environment
include:

* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.

## Scope

This Code of Conduct applies within all project spaces, and it also applies when
an individual is representing the project or its community in public spaces.
Examples of representing a project or community include using an official
project e-mail address, posting via an official social media account, or acting
as an appointed representative at an online or offline event. Representation of
a project may be further defined and clarified by project maintainers.

This Code of Conduct also applies outside the project spaces when there is a
reasonable belief that an individual's behavior may have a negative impact on
the project or its community.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at <opensource-conduct@fb.com>. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html

[homepage]: https://www.contributor-covenant.org

For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing
We want to make contributing to this project as easy and transparent as possible.

## Pull Requests
We actively welcome your pull requests.

1. Fork the repo and create your branch from `main`.
2. If you've added code that should be tested, add tests.
3. If you've changed APIs, update the documentation.
4. Ensure the test suite passes.
5. Make sure your code lints.
6. If you haven't already, complete the Contributor License Agreement ("CLA").

## Contributor License Agreement ("CLA")
In order to accept your pull request, we need you to submit a CLA. You only need to do this once to work on any of Facebook's open source projects.

Complete your CLA here: <https://code.facebook.com/cla>

## Issues
We use GitHub issues to track public bugs. Please ensure your description is clear and has sufficient instructions to be able to reproduce the issue.

Facebook has a [bounty program](https://www.facebook.com/whitehat/) for the safe disclosure of security bugs. In those cases, please go through the process outlined on that page and do not file a public issue.

## License
By contributing, you agree that your contributions will be licensed under the LICENSE file in the root directory of this source tree.


================================================
FILE: Config/Android/AndroidEngine.ini
================================================
[DevOptions.Shaders]
bNeedsShaderStableKeys=True



================================================
FILE: Config/DefaultDeviceProfiles.ini
================================================
[Oculus_Quest2 DeviceProfile]
DeviceType=Android
BaseProfileName=Oculus_Quest
bIsVisibleForAssets=False
-CVars=r.Mobile.Oculus.ForceSymmetric=1
-CVars=fx.NiagaraAllowGPUParticles=1
-CVars=FX.AllowGPUSorting=1
-CVars=r.Mobile.AdrenoOcclusionMode=1
-CVars=r.Oculus.DynamicResolution.PixelDensityMin=0.8f
-CVars=r.Oculus.DynamicResolution.PixelDensityMax=1.2f
-CVars=r.so.VisualizeBufferXOffset=500
-CVars=r.so.VisualizeBufferYOffset=500
+CVars=r.Mobile.Oculus.ForceSymmetric=1
+CVars=fx.NiagaraAllowGPUParticles=1
+CVars=FX.AllowGPUSorting=1
+CVars=r.Mobile.AdrenoOcclusionMode=1
+CVars=r.Oculus.DynamicResolution.PixelDensityMin=0.8
+CVars=r.Oculus.DynamicResolution.PixelDensityMax=1.2
+CVars=r.so.VisualizeBufferXOffset=500
+CVars=r.so.VisualizeBufferYOffset=500

[Meta_Quest_Pro DeviceProfile]
DeviceType=Android
BaseProfileName=Oculus_Quest2
bIsVisibleForAssets=False
+CVars=r.Oculus.DynamicResolution.PixelDensityMin=0.8
+CVars=r.Oculus.DynamicResolution.PixelDensityMax=1.2

[Meta_Quest_3 DeviceProfile]
DeviceType=Android
BaseProfileName=Meta_Quest_Pro
bIsVisibleForAssets=False
-CVars=r.Oculus.DynamicResolution.PixelDensityMin=0.7f
-CVars=r.Oculus.DynamicResolution.PixelDensityMax=1.6f
+CVars=r.Oculus.DynamicResolution.PixelDensityMin=0.8
+CVars=r.Oculus.DynamicResolution.PixelDensityMax=1.2

[Meta_Quest_3S DeviceProfile]
DeviceType=Android
BaseProfileName=Meta_Quest_3
bIsVisibleForAssets=False
+CVars=r.Oculus.DynamicResolution.PixelDensityMin=0.8
+CVars=r.Oculus.DynamicResolution.PixelDensityMax=1.2



================================================
FILE: Config/DefaultEditor.ini
================================================


================================================
FILE: Config/DefaultEngine.ini
================================================
[/Script/HardwareTargeting.HardwareTargetingSettings]
TargetedHardwareClass=Mobile
AppliedTargetedHardwareClass=Mobile
DefaultGraphicsPerformance=Scalable
AppliedDefaultGraphicsPerformance=Scalable

[/Script/Engine.Engine]
+ActiveGameNameRedirects=(OldGameName="TP_Blank",NewGameName="/Script/SHOHandRecognition")
+ActiveGameNameRedirects=(OldGameName="/Script/TP_Blank",NewGameName="/Script/SHOHandRecognition")
+ActiveGameNameRedirects=(OldGameName="/Script/HandPoseShowcase", NewGameName="/Script/HandGameplay")
+ActiveClassRedirects=(OldClassName="TP_BlankGameModeBase",NewClassName="SHOHandRecognitionGameModeBase")

[/Script/Engine.RendererSettings]
r.Mobile.DisableVertexFog=True
r.Shadow.CSM.MaxMobileCascades=2
r.MobileMSAA=4
r.Mobile.UseLegacyShadingModel=False
r.Mobile.AllowDitheredLODTransition=False
r.Mobile.AllowSoftwareOcclusion=False
r.Mobile.VirtualTextures=False
r.DiscardUnusedQuality=False
r.AllowOcclusionQueries=True
r.MinScreenRadiusForLights=0.030000
r.MinScreenRadiusForDepthPrepass=0.030000
r.MinScreenRadiusForCSMDepth=0.010000
r.PrecomputedVisibilityWarning=False
r.TextureStreaming=True
Compat.UseDXT5NormalMaps=False
r.VirtualTextures=False
r.VirtualTexturedLightmaps=False
r.VRS.Enable=True
r.VRS.EnableImage=False
r.VT.TileSize=128
r.VT.TileBorderSize=4
r.vt.FeedbackFactor=16
r.VT.EnableCompressZlib=True
r.VT.EnableCompressCrunch=False
r.ClearCoatNormal=False
r.AnisotropicBRDF=False
r.ReflectionCaptureResolution=128
r.ReflectionEnvironmentLightmapMixBasedOnRoughness=True
r.ForwardShading=True
r.VertexFoggingForOpaque=True
r.AllowStaticLighting=True
r.NormalMapsForStaticLighting=False
r.GenerateMeshDistanceFields=False
r.DistanceFieldBuild.EightBit=False
r.GenerateLandscapeGIData=False
r.DistanceFieldBuild.Compress=False
r.TessellationAdaptivePixelsPerTriangle=48.000000
r.SeparateTranslucency=False
r.TranslucentSortPolicy=0
TranslucentSortAxis=(X=0.000000,Y=-1.000000,Z=0.000000)
r.CustomDepth=0
r.CustomDepthTemporalAAJitter=False
r.PostProcessing.PropagateAlpha=0
r.DefaultFeature.Bloom=False
r.DefaultFeature.AmbientOcclusion=False
r.DefaultFeature.AmbientOcclusionStaticFraction=True
r.DefaultFeature.AutoExposure=False
r.DefaultFeature.AutoExposure.Method=0
r.DefaultFeature.AutoExposure.Bias=1.000000
r.DefaultFeature.AutoExposure.ExtendDefaultLuminanceRange=False
r.UsePreExposure=True
r.EyeAdaptation.EditorOnly=False
r.DefaultFeature.MotionBlur=False
r.DefaultFeature.LensFlare=False
r.TemporalAA.Upsampling=False
r.SSGI.Enable=False
r.DefaultFeature.AntiAliasing=3
r.DefaultFeature.LightUnits=1
r.DefaultBackBufferPixelFormat=4
r.Shadow.UnbuiltPreviewInGame=True
r.StencilForLODDither=False
r.EarlyZPass=0
r.EarlyZPassOnlyMaterialMasking=False
r.DBuffer=True
r.ClearSceneMethod=1
r.BasePassOutputsVelocity=False
r.VertexDeformationOutputsVelocity=False
r.SelectiveBasePassOutputs=False
bDefaultParticleCutouts=False
fx.GPUSimulationTextureSizeX=1024
fx.GPUSimulationTextureSizeY=1024
r.AllowGlobalClipPlane=False
r.GBufferFormat=1
r.MorphTarget.Mode=True
r.GPUCrashDebugging=False
vr.InstancedStereo=True
r.MobileHDR=False
vr.MobileMultiView=True
r.Mobile.UseHWsRGBEncoding=True
vr.RoundRobinOcclusion=False
vr.ODSCapture=False
r.MeshStreaming=False
r.WireframeCullThreshold=5.000000
r.RayTracing=False
r.RayTracing.UseTextureLod=False
r.SupportStationarySkylight=True
r.SupportLowQualityLightmaps=True
r.SupportPointLightWholeSceneShadows=True
r.SupportAtmosphericFog=True
r.SupportSkyAtmosphere=True
r.SupportSkyAtmosphereAffectsHeightFog=False
r.SkinCache.CompileShaders=False
r.SkinCache.DefaultBehavior=1
r.SkinCache.SceneMemoryLimitInMB=128.000000
r.Mobile.EnableStaticAndCSMShadowReceivers=False
r.Mobile.EnableMovableLightCSMShaderCulling=True
r.Mobile.AllowDistanceFieldShadows=False
r.Mobile.AllowMovableDirectionalLights=False
r.MobileNumDynamicPointLights=0
r.MobileDynamicPointLightsUseStaticBranch=True
r.Mobile.EnableMovableSpotlights=False
r.GPUSkin.Support16BitBoneIndex=False
r.GPUSkin.Limit2BoneInfluences=False
r.SupportDepthOnlyIndexBuffers=True
r.SupportReversedIndexBuffers=True
r.SupportMaterialLayers=False
r.LightPropagationVolume=False
r.Mobile.AmbientOcclusion=False
r.Mobile.AntiAliasing=3
r.MSAACount=4
r.AntiAliasingMethod=3

[/Script/EngineSettings.GameMapsSettings]
EditorStartupMap=/Game/HandGameplay/Levels/HandGameplayShowcase.HandGameplayShowcase
LocalMapOptions=
TransitionMap=None
bUseSplitscreen=False
TwoPlayerSplitscreenLayout=Horizontal
ThreePlayerSplitscreenLayout=FavorTop
FourPlayerSplitscreenLayout=Grid
bOffsetPlayerGamepadIds=False
GameInstanceClass=/Script/Engine.GameInstance
GameDefaultMap=/Game/HandGameplay/Levels/HandGameplayShowcase.HandGameplayShowcase
ServerDefaultMap=/Engine/Maps/Entry.Entry
GlobalDefaultGameMode=/Game/HandGameplay/Blueprints/HandsGameMode.HandsGameMode_C
GlobalDefaultServerGameMode=None

[/Script/Slate.SlateSettings]
bExplicitCanvasChildZOrder=True

[/Script/AndroidRuntimeSettings.AndroidRuntimeSettings]
PackageName=com.samples.[PROJECT]
StoreVersion=1
StoreVersionOffsetArm64=0
StoreVersionOffsetX8664=0
ApplicationDisplayName=
VersionDisplayName=1.0
MinSDKVersion=32
TargetSDKVersion=32
InstallLocation=Auto
bEnableLint=False
bPackageDataInsideApk=True
bCreateAllPlatformsInstall=False
bDisableVerifyOBBOnStartUp=False
bForceSmallOBBFiles=False
bAllowLargeOBBFiles=False
bAllowPatchOBBFile=False
bAllowOverflowOBBFiles=False
bUseExternalFilesDir=False
bPublicLogFiles=True
Orientation=Landscape
MaxAspectRatio=2.100000
bUseDisplayCutout=False
bAllowResizing=False
bSupportSizeChanges=False
bRestoreNotificationsOnReboot=False
bFullScreen=True
bEnableNewKeyboard=True
DepthBufferPreference=Default
bValidateTextureFormats=True
bForceCompressNativeLibs=False
bEnableAdvancedBinaryCompression=True
bEnableBundle=False
bEnableUniversalAPK=False
bBundleABISplit=True
bBundleLanguageSplit=True
bBundleDensitySplit=True
+ExtraApplicationNodeTags=android:allowBackup="false"
ExtraApplicationSettings=<meta-data android:name="com.oculus.supportedDevices" android:value="quest|quest2|questpro|quest3" />
ExtraActivitySettings=
bAndroidVoiceEnabled=False
bEnableMulticastSupport=False
bPackageForMetaQuest=True
bRemoveOSIG=True
KeyStore=
KeyAlias=
KeyStorePassword=
KeyPassword=
bBuildForArm64=True
bBuildForX8664=False
bBuildForES31=False
bSupportsVulkan=True
bSupportsVulkanSM5=False
DebugVulkanLayerDirectory=(Path="")
bAndroidOpenGLSupportsBackbufferSampling=False
bDetectVulkanByDefault=True
bBuildWithHiddenSymbolVisibility=False
bDisableStackProtector=False
bDisableLibCppSharedDependencyValidation=False
bSaveSymbols=False
bStripShaderReflection=True
bStripReflectOfAndroidShader=False
bEnableGooglePlaySupport=False
bUseGetAccounts=False
GamesAppID=
bEnableSnapshots=False
bSupportAdMob=True
AdMobAppID=
TagForChildDirectedTreatment=TAG_FOR_CHILD_DIRECTED_TREATMENT_UNSPECIFIED
TagForUnderAgeOfConsent=TAG_FOR_UNDER_AGE_OF_CONSENT_UNSPECIFIED
MaxAdContentRating=MAX_AD_CONTENT_RATING_G
AdMobAdUnitID=
GooglePlayLicenseKey=
GCMClientSenderID=
bShowLaunchImage=True
bAllowIMU=True
bAllowControllers=True
bBlockAndroidKeysOnControllers=False
bControllersBlockDeviceFeedback=False
AndroidAudio=Default
AudioSampleRate=44100
AudioCallbackBufferFrameSize=1024
AudioNumBuffersToEnqueue=4
AudioMaxChannels=0
AudioNumSourceWorkers=0
SpatializationPlugin=Oculus Audio
SourceDataOverridePlugin=
ReverbPlugin=Oculus Audio
OcclusionPlugin=
CompressionOverrides=(bOverrideCompressionTimes=False,DurationThreshold=5.000000,MaxNumRandomBranches=0,SoundCueQualityIndex=0)
CacheSizeKB=0
MaxChunkSizeOverrideKB=0
bResampleForDevice=False
SoundCueCookQualityIndex=-1
MaxSampleRate=0.000000
HighSampleRate=0.000000
MedSampleRate=0.000000
LowSampleRate=0.000000
MinSampleRate=0.000000
CompressionQualityModifier=0.000000
AutoStreamingThreshold=0.000000
AndroidGraphicsDebugger=None
MaliGraphicsDebuggerPath=(Path="")
bEnableMaliPerfCounters=False
bMultiTargetFormat_ETC2=False
bMultiTargetFormat_DXT=False
bMultiTargetFormat_ASTC=True
TextureFormatPriority_ETC2=0.200000
TextureFormatPriority_DXT=0.600000
TextureFormatPriority_ASTC=0.900000
SDKAPILevelOverride=
NDKAPILevelOverride=
BuildToolsOverride=
bStreamLandscapeMeshLODs=False
bEnableDomStorage=False

[/Script/OculusHMD.OculusHMDRuntimeSettings]
HandTrackingSupport=HandsOnly
FFRLevel=FFR_Medium
FFRDynamic=True
XrApi=LegacyOVRPlugin
HandTrackingFrequency=HIGH
bLateLatching=True
bPhaseSync=True
bAutoEnabled=True
bEnableSpecificColorGamut=False
ColorSpace=Quest
bSupportsDash=True
bCompositesDepth=True
bHQDistortion=False
PixelDensityMin=0.500000
PixelDensityMax=1.000000
OSSplashScreen=(FilePath="Plugins/OculusUtils/Resources/oculus_samples.png")
CPULevel=2
GPULevel=3
bFocusAware=True
bRequiresSystemKeyboard=False

[/Script/Engine.CollisionProfile]
-Profiles=(Name="NoCollision",CollisionEnabled=NoCollision,ObjectTypeName="WorldStatic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore)),HelpMessage="No collision",bCanModify=False)
-Profiles=(Name="BlockAll",CollisionEnabled=QueryAndPhysics,ObjectTypeName="WorldStatic",CustomResponses=,HelpMessage="WorldStatic object that blocks all actors by default. All new custom channels will use its own default response. ",bCanModify=False)
-Profiles=(Name="OverlapAll",CollisionEnabled=QueryOnly,ObjectTypeName="WorldStatic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Overlap),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldStatic object that overlaps all actors by default. All new custom channels will use its own default response. ",bCanModify=False)
-Profiles=(Name="BlockAllDynamic",CollisionEnabled=QueryAndPhysics,ObjectTypeName="WorldDynamic",CustomResponses=,HelpMessage="WorldDynamic object that blocks all actors by default. All new custom channels will use its own default response. ",bCanModify=False)
-Profiles=(Name="OverlapAllDynamic",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Overlap),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldDynamic object that overlaps all actors by default. All new custom channels will use its own default response. ",bCanModify=False)
-Profiles=(Name="IgnoreOnlyPawn",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="Pawn",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore)),HelpMessage="WorldDynamic object that ignores Pawn and Vehicle. All other channels will be set to default.",bCanModify=False)
-Profiles=(Name="OverlapOnlyPawn",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="Pawn",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Ignore)),HelpMessage="WorldDynamic object that overlaps Pawn, Camera, and Vehicle. All other channels will be set to default. ",bCanModify=False)
-Profiles=(Name="Pawn",CollisionEnabled=QueryAndPhysics,ObjectTypeName="Pawn",CustomResponses=((Channel="Visibility",Response=ECR_Ignore)),HelpMessage="Pawn object. Can be used for capsule of any playerable character or AI. ",bCanModify=False)
-Profiles=(Name="Spectator",CollisionEnabled=QueryOnly,ObjectTypeName="Pawn",CustomResponses=((Channel="WorldStatic",Response=ECR_Block),(Channel="Pawn",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore),(Channel="WorldDynamic",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore),(Channel="PhysicsBody",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore),(Channel="Destructible",Response=ECR_Ignore)),HelpMessage="Pawn object that ignores all other actors except WorldStatic.",bCanModify=False)
-Profiles=(Name="CharacterMesh",CollisionEnabled=QueryOnly,ObjectTypeName="Pawn",CustomResponses=((Channel="Pawn",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore)),HelpMessage="Pawn object that is used for Character Mesh. All other channels will be set to default.",bCanModify=False)
-Profiles=(Name="PhysicsActor",CollisionEnabled=QueryAndPhysics,ObjectTypeName="PhysicsBody",CustomResponses=,HelpMessage="Simulating actors",bCanModify=False)
-Profiles=(Name="Destructible",CollisionEnabled=QueryAndPhysics,ObjectTypeName="Destructible",CustomResponses=,HelpMessage="Destructible actors",bCanModify=False)
-Profiles=(Name="InvisibleWall",CollisionEnabled=QueryAndPhysics,ObjectTypeName="WorldStatic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore)),HelpMessage="WorldStatic object that is invisible.",bCanModify=False)
-Profiles=(Name="InvisibleWallDynamic",CollisionEnabled=QueryAndPhysics,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore)),HelpMessage="WorldDynamic object that is invisible.",bCanModify=False)
-Profiles=(Name="Trigger",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Ignore),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldDynamic object that is used for trigger. All other channels will be set to default.",bCanModify=False)
-Profiles=(Name="Ragdoll",CollisionEnabled=QueryAndPhysics,ObjectTypeName="PhysicsBody",CustomResponses=((Channel="Pawn",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore)),HelpMessage="Simulating Skeletal Mesh Component. All other channels will be set to default.",bCanModify=False)
-Profiles=(Name="Vehicle",CollisionEnabled=QueryAndPhysics,ObjectTypeName="Vehicle",CustomResponses=,HelpMessage="Vehicle object that blocks Vehicle, WorldStatic, and WorldDynamic. All other channels will be set to default.",bCanModify=False)
-Profiles=(Name="UI",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Block),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldStatic object that overlaps all actors by default. All new custom channels will use its own default response. ",bCanModify=False)
+Profiles=(Name="NoCollision",CollisionEnabled=NoCollision,bCanModify=False,ObjectTypeName="WorldStatic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore)),HelpMessage="No collision")
+Profiles=(Name="BlockAll",CollisionEnabled=QueryAndPhysics,bCanModify=False,ObjectTypeName="WorldStatic",CustomResponses=,HelpMessage="WorldStatic object that blocks all actors by default. All new custom channels will use its own default response. ")
+Profiles=(Name="OverlapAll",CollisionEnabled=QueryOnly,bCanModify=False,ObjectTypeName="WorldStatic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldStatic object that overlaps all actors by default. All new custom channels will use its own default response. ")
+Profiles=(Name="BlockAllDynamic",CollisionEnabled=QueryAndPhysics,bCanModify=False,ObjectTypeName="WorldDynamic",CustomResponses=,HelpMessage="WorldDynamic object that blocks all actors by default. All new custom channels will use its own default response. ")
+Profiles=(Name="OverlapAllDynamic",CollisionEnabled=QueryOnly,bCanModify=False,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldDynamic object that overlaps all actors by default. All new custom channels will use its own default response. ")
+Profiles=(Name="IgnoreOnlyPawn",CollisionEnabled=QueryOnly,bCanModify=False,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="Pawn",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore)),HelpMessage="WorldDynamic object that ignores Pawn and Vehicle. All other channels will be set to default.")
+Profiles=(Name="OverlapOnlyPawn",CollisionEnabled=QueryOnly,bCanModify=False,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="Pawn",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Overlap)),HelpMessage="WorldDynamic object that overlaps Pawn, Camera, and Vehicle. All other channels will be set to default. ")
+Profiles=(Name="Pawn",CollisionEnabled=QueryAndPhysics,bCanModify=False,ObjectTypeName="Pawn",CustomResponses=((Channel="Visibility",Response=ECR_Ignore)),HelpMessage="Pawn object. Can be used for capsule of any playerable character or AI. ")
+Profiles=(Name="Spectator",CollisionEnabled=QueryOnly,bCanModify=False,ObjectTypeName="Pawn",CustomResponses=((Channel="WorldDynamic",Response=ECR_Ignore),(Channel="Pawn",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore),(Channel="PhysicsBody",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore),(Channel="Destructible",Response=ECR_Ignore)),HelpMessage="Pawn object that ignores all other actors except WorldStatic.")
+Profiles=(Name="CharacterMesh",CollisionEnabled=QueryOnly,bCanModify=False,ObjectTypeName="Pawn",CustomResponses=((Channel="Pawn",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore)),HelpMessage="Pawn object that is used for Character Mesh. All other channels will be set to default.")
+Profiles=(Name="PhysicsActor",CollisionEnabled=QueryAndPhysics,bCanModify=False,ObjectTypeName="PhysicsBody",CustomResponses=,HelpMessage="Simulating actors")
+Profiles=(Name="Destructible",CollisionEnabled=QueryAndPhysics,bCanModify=False,ObjectTypeName="Destructible",CustomResponses=,HelpMessage="Destructible actors")
+Profiles=(Name="InvisibleWall",CollisionEnabled=QueryAndPhysics,bCanModify=False,ObjectTypeName="WorldStatic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore)),HelpMessage="WorldStatic object that is invisible.")
+Profiles=(Name="InvisibleWallDynamic",CollisionEnabled=QueryAndPhysics,bCanModify=False,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore)),HelpMessage="WorldDynamic object that is invisible.")
+Profiles=(Name="Trigger",CollisionEnabled=QueryOnly,bCanModify=False,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldDynamic object that is used for trigger. All other channels will be set to default.")
+Profiles=(Name="Ragdoll",CollisionEnabled=QueryAndPhysics,bCanModify=False,ObjectTypeName="PhysicsBody",CustomResponses=((Channel="Pawn",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore)),HelpMessage="Simulating Skeletal Mesh Component. All other channels will be set to default.")
+Profiles=(Name="Vehicle",CollisionEnabled=QueryAndPhysics,bCanModify=False,ObjectTypeName="Vehicle",CustomResponses=,HelpMessage="Vehicle object that blocks Vehicle, WorldStatic, and WorldDynamic. All other channels will be set to default.")
+Profiles=(Name="UI",CollisionEnabled=QueryOnly,bCanModify=False,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldStatic object that overlaps all actors by default. All new custom channels will use its own default response. ")
+DefaultChannelResponses=(Channel=ECC_GameTraceChannel1,DefaultResponse=ECR_Ignore,bTraceType=True,bStaticObject=False,Name="Interactable")
+DefaultChannelResponses=(Channel=ECC_GameTraceChannel2,DefaultResponse=ECR_Overlap,bTraceType=False,bStaticObject=False,Name="FingerTip")
-ProfileRedirects=(OldName="BlockingVolume",NewName="InvisibleWall")
-ProfileRedirects=(OldName="InterpActor",NewName="IgnoreOnlyPawn")
-ProfileRedirects=(OldName="StaticMeshComponent",NewName="BlockAllDynamic")
-ProfileRedirects=(OldName="SkeletalMeshActor",NewName="PhysicsActor")
-ProfileRedirects=(OldName="InvisibleActor",NewName="InvisibleWallDynamic")
+ProfileRedirects=(OldName="BlockingVolume",NewName="InvisibleWall")
+ProfileRedirects=(OldName="InterpActor",NewName="IgnoreOnlyPawn")
+ProfileRedirects=(OldName="StaticMeshComponent",NewName="BlockAllDynamic")
+ProfileRedirects=(OldName="SkeletalMeshActor",NewName="PhysicsActor")
+ProfileRedirects=(OldName="InvisibleActor",NewName="InvisibleWallDynamic")
-CollisionChannelRedirects=(OldName="Static",NewName="WorldStatic")
-CollisionChannelRedirects=(OldName="Dynamic",NewName="WorldDynamic")
-CollisionChannelRedirects=(OldName="VehicleMovement",NewName="Vehicle")
-CollisionChannelRedirects=(OldName="PawnMovement",NewName="Pawn")
+CollisionChannelRedirects=(OldName="Static",NewName="WorldStatic")
+CollisionChannelRedirects=(OldName="Dynamic",NewName="WorldDynamic")
+CollisionChannelRedirects=(OldName="VehicleMovement",NewName="Vehicle")
+CollisionChannelRedirects=(OldName="PawnMovement",NewName="Pawn")
+CollisionChannelRedirects=(OldName="Hand",NewName="FingerTip")

[/Script/Engine.UserInterfaceSettings]
UIScaleRule=ShortestSide
UIScaleCurve=(EditorCurveData=(Keys=((Time=0.256264,Value=1.000000)),DefaultValue=340282346638528859811704183484516925440.000000,PreInfinityExtrap=RCCE_Constant,PostInfinityExtrap=RCCE_Constant),ExternalCurve=None)

[/Script/WindowsTargetPlatform.WindowsTargetSettings]
SpatializationPlugin=Oculus Audio
ReverbPlugin=Oculus Audio

[/Script/OculusAudio.OculusAudioSettings]
LateReverberation=True

[/Script/LuminRuntimeSettings.LuminRuntimeSettings]
IconModelPath=(Path="")
IconPortalPath=(Path="")

[Core.Log]
LogHandPoseRecognition=warning

[/Script/AndroidFileServerEditor.AndroidFileServerRuntimeSettings]
bEnablePlugin=True
bAllowNetworkConnection=True
SecurityToken=8FCC7359434D4251D8FC3DAF8446EBE2
bIncludeInShipping=False
bAllowExternalStartInShipping=False
bCompileAFSProject=False
bUseCompression=False
bLogFiles=False
bReportStats=False
ConnectionType=USBOnly
bUseManualIPAddress=False
ManualIPAddress=

[/Script/OculusXRHMD.OculusXRHMDRuntimeSettings]
SystemSplashBackground=Black
bAutoEnabled=False
bHorizonOSVersionOverride=False
MinOSVersion=(Version=0,bLatest=True)
TargetOSVersion=(Version=0,bLatest=True)
XrApi=NativeOpenXR
ColorSpace=P3
ControllerPoseAlignment=Default
bThumbstickDpadEmulationEnabled=True
OculusXRSimulatorPreferredVersion=81
bNotifyWhenNewVersionIsAvailable=True
bSupportsDash=True
bCompositesDepth=True
bHQDistortion=False
bSetActivePIEToPrimary=True
bSetCVarPIEToPrimary=True
bUpdateHeadPoseForInactivePlayer=False
MPPoseRestoreType=Disabled
bDynamicResolution=False
+SupportedDevices=Quest3
+SupportedDevices=QuestPro
+SupportedDevices=Quest2
+SupportedDevices=Quest3S
SuggestedCpuPerfLevel=SustainedLow
SuggestedGpuPerfLevel=SustainedHigh
FoveatedRenderingMethod=FixedFoveatedRendering
FoveatedRenderingLevel=Off
bDynamicFoveatedRendering=False
bSupportEyeTrackedFoveatedRendering=False
bCompositeDepthMobile=False
bFocusAware=True
bLateLatching=False
bRequiresSystemKeyboard=False
HandTrackingSupport=HandsOnly
HandTrackingFrequency=LOW
HandTrackingVersion=Default
bInsightPassthroughEnabled=False
bAnchorSupportEnabled=False
bAnchorSharingEnabled=False
bSceneSupportEnabled=False
bBoundaryVisibilitySupportEnabled=False
bDefaultBoundaryVisibilitySuppressed=False
bColocationSessionsEnabled=False
bBodyTrackingEnabled=False
BodyTrackingFidelity=Low
BodyTrackingJointSet=UpperBody
bEyeTrackingEnabled=False
bFaceTrackingEnabled=False
FaceTrackingDataSource=()
bFaceTrackingVisemesEnabled=False
bDeploySoToDevice=False
bIterativeCookOnTheFly=False
bSupportExperimentalFeatures=False
ProcessorFavor=FavorEqually
bTileTurnOffEnabled=False
bSupportSBC=False
SBCPath=files/UnrealGame/HandGameplay/HandGameplay/Saved/VulkanCache
EnableWorldLock=True



================================================
FILE: Config/DefaultGame.ini
================================================


[/Script/EngineSettings.GeneralProjectSettings]
ProjectID=C55AF2354CBEC3833CFBFB923FDA1579
CopyrightNotice=Copyright (c) Meta Platforms, Inc. and affiliates.
bStartInVR=True

[/Script/UnrealEd.ProjectPackagingSettings]
StagingDirectory=(Path="../../../../../../../../QuestPackagingArea/SHO_HandGameplay/Android_ASTC")
+DirectoriesToNeverCook=(Path="/Game/Developers/jasonmeisel")


================================================
FILE: Config/DefaultInput.ini
================================================
[/Script/Engine.InputSettings]
-AxisConfig=(AxisKeyName="Gamepad_LeftX",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f))
-AxisConfig=(AxisKeyName="Gamepad_LeftY",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f))
-AxisConfig=(AxisKeyName="Gamepad_RightX",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f))
-AxisConfig=(AxisKeyName="Gamepad_RightY",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f))
-AxisConfig=(AxisKeyName="MouseX",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f))
-AxisConfig=(AxisKeyName="MouseY",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f))
-AxisConfig=(AxisKeyName="Mouse2D",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f))
+AxisConfig=(AxisKeyName="MagicLeap_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MagicLeap_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MagicLeap_Left_Trackpad_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MagicLeap_Left_Touch1_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MagicLeap_Left_Touch1_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MagicLeap_Left_Touch1_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Mouse2D",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MotionController_Right_Thumbstick_Z",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MagicLeap_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MagicLeap_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MagicLeap_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MagicLeap_Right_Trackpad_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MagicLeap_Right_Touch1_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MagicLeap_Right_Touch1_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MagicLeap_Right_Touch1_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Left_Thumbstick",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Left_FaceButton1",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Left_Trigger",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Left_FaceButton2",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Left_IndexPointing",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Left_ThumbUp",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Right_Thumbstick",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Right_FaceButton1",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Right_Trigger",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Right_FaceButton2",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Right_IndexPointing",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Right_ThumbUp",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusHand_Left_ThumbPinchStrength",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusHand_Left_IndexPinchStrength",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusHand_Left_MiddlePinchStrength",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusHand_Left_RingPinchStrength",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusHand_Left_PinkPinchStrength",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusHand_Right_ThumbPinchStrength",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusHand_Right_IndexPinchStrength",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusHand_Right_MiddlePinchStrength",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusHand_Right_RingPinchStrength",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusHand_Right_PinkPinchStrength",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_LeftX",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_LeftY",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_RightX",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_RightY",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MouseX",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MouseY",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MouseWheelAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_LeftTriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_RightTriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_Special_Left_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_Special_Left_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Daydream_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Daydream_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Daydream_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Daydream_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Vive_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Vive_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Vive_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Vive_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Vive_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Vive_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Left_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Right_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Grip_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_Touch",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Grip_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MotionController_Left_Thumbstick_Z",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MagicLeap_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Left_ThumbRest",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Right_ThumbRest",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
bAltEnterTogglesFullscreen=True
bF11TogglesFullscreen=True
bUseMouseForTouch=False
bEnableMouseSmoothing=True
bEnableFOVScaling=True
bCaptureMouseOnLaunch=True
bEnableLegacyInputScales=True
bEnableMotionControls=True
bFilterInputByPlatformUser=False
bEnableInputDeviceSubsystem=True
bShouldFlushPressedKeysOnViewportFocusLost=True
bEnableDynamicComponentInputBinding=True
bAlwaysShowTouchInterface=False
bShowConsoleOnFourFingerTap=True
bEnableGestureRecognizer=False
bUseAutocorrect=False
DefaultViewportMouseCaptureMode=CapturePermanently_IncludingInitialMouseDown
DefaultViewportMouseLockMode=LockOnCapture
FOVScale=0.011110
DoubleClickTime=0.200000
DefaultPlayerInputClass=/Script/EnhancedInput.EnhancedPlayerInput
DefaultInputComponentClass=/Script/EnhancedInput.EnhancedInputComponent
DefaultTouchInterface=None
-ConsoleKeys=Tilde
+ConsoleKeys=Tilde



================================================
FILE: Content/HandGameplay/Audio/GrabSound.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:b9849f17e45079ec2902ffee437cd8d186f29aafbf3e732eab5f688f0649a7e6
size 8916


================================================
FILE: Content/HandGameplay/Audio/LAST_TestAudio_Release01.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:1978301e2d109ee5baa2b3df67445779d460a4886b9046b2677b2879cecc96b8
size 44157


================================================
FILE: Content/HandGameplay/Audio/LAST_TestAudio_Release02.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:1cb0cf23601b97676c977ab2c9c535ca9c06717af91495ad2b71ea5545699dfd
size 44136


================================================
FILE: Content/HandGameplay/Audio/LAST_TestAudio_Release03.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:558c2159e23d0499cd3bb75743973a7b19f2267d437e7d7250901008e7a09762
size 44242


================================================
FILE: Content/HandGameplay/Audio/ReleaseSound.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:7409697cfa348d34ead533785d90e153499d095fff519020338abfabe177226d
size 7811


================================================
FILE: Content/HandGameplay/Audio/SoundAttenuationForSpatialization.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:5a90478a20b64771a4318e6a74b3a21201b3146ff29a4a5d3fb26df42fbd8460
size 1723


================================================
FILE: Content/HandGameplay/Audio/generic_grab_01.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:a2c245034b32b6f5ddd707597c564248464333e501f325e0ba3adda25959a5fd
size 37481


================================================
FILE: Content/HandGameplay/Audio/generic_grab_02.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:dbe114715a7464e7fd61bd705448106fd4f0ec07df42ebddfc9ff5f4ccc11666
size 36937


================================================
FILE: Content/HandGameplay/Audio/generic_grab_03.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:6b7e28b3d1e250ff7c16318291fd001955f755b4edfb3c4af9dffa6cdf63eaba
size 42133


================================================
FILE: Content/HandGameplay/Audio/generic_grab_04.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:0757440c8431852e8b0ce3ae3bb291890c6a33a868c489588ea886bec7dea106
size 36674


================================================
FILE: Content/HandGameplay/Audio/impacts/sfx_impact_primary_block_01.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:eaebcbd95610bc979b02ed9221ee0fc256c17dfbdbeb34cdb7d6dc10f807dbaa
size 20528


================================================
FILE: Content/HandGameplay/Audio/impacts/sfx_impact_primary_block_02.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:8bf0bb6c80d8715e2503d243e0d711c59fbce56a8d91d11869ed41e3d5982758
size 27057


================================================
FILE: Content/HandGameplay/Audio/impacts/sfx_impact_primary_block_03.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:eb040580284faf0a36126c46039399b3d308473e974e4a6f0501ceade9a1c949
size 23010


================================================
FILE: Content/HandGameplay/Audio/impacts/sfx_impact_primary_block_04.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:aded0c4d042fc7b92871673996a091dce6e91da0bcaf0016cfacb9cd5b391ec5
size 21826


================================================
FILE: Content/HandGameplay/Audio/impacts/sfx_impact_primary_block_05.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:a163e311b2ccf596cdb478c3c361d8b71f5d53fd361b0e3498187a07b1b27a83
size 22654


================================================
FILE: Content/HandGameplay/Audio/impacts/sfx_impact_primary_block_06.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:6e0d5ce075fb26cc9b81da4fbaa93a48f31193ca2960cc5c6ed5ca1c5cb64f3a
size 20680


================================================
FILE: Content/HandGameplay/Audio/impacts/sfx_impact_primary_block_07.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:3be5c781b4eabe164845d2b39182a57dbe39893c4deda2bc5de9137095762978
size 24363


================================================
FILE: Content/HandGameplay/Audio/impacts/sfx_impact_primary_block_Cue.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:99f5e033a67b622cf4960b6d740c24fa815b14553ab999408ed280d5dd63dc87
size 13769


================================================
FILE: Content/HandGameplay/Audio/impacts/sfx_impact_secondary_block_01.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:1bf1cdfc4f9bf89928f94fba5b314576505b63be63f0f51b2857f2f7fa3c4e7a
size 21480


================================================
FILE: Content/HandGameplay/Audio/impacts/sfx_impact_secondary_block_02.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:4b1c604e88462ea7cb419cc59aeea14e7e85dccbb0f34775ebe3b1d085ac30a1
size 25422


================================================
FILE: Content/HandGameplay/Audio/impacts/sfx_impact_secondary_block_03.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:5f6decb8de7585619fd12a51ff9143e4cc0d0cdaa4c29251d953075ec8461f13
size 35536


================================================
FILE: Content/HandGameplay/Audio/impacts/sfx_impact_secondary_block_04.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:388306dc74efc7cfbe22e4519635332d621133ac47daf91f433ffe6d85da5ab5
size 28496


================================================
FILE: Content/HandGameplay/Audio/impacts/sfx_impact_secondary_block_05.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:4d12f15c9ab424b4ec5a0b62c61b4cbe574795f29737c06143e3907e20c22275
size 45672


================================================
FILE: Content/HandGameplay/Audio/impacts/sfx_impact_secondary_block_06.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:da46fa6bccaa2960263bbda1204210a1b64b73d3de15b028ebc02333fe7eca27
size 27113


================================================
FILE: Content/HandGameplay/Audio/impacts/sfx_impact_secondary_block_07.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:59e4866391a9321a713ae1a98f0690a121666d508775160fc4393e602c5f6cca
size 30256


================================================
FILE: Content/HandGameplay/Audio/impacts/sfx_impact_secondary_block_08.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:cc7d95a24185342728913aef8f08248a5a80f40bf5c5306a4c31849510fdf482
size 26386


================================================
FILE: Content/HandGameplay/Audio/impacts/sfx_impact_secondary_block_09.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:0450e4e94724af41df543aff6656da566d8e8565dda267b428207ebdcbad9108
size 34593


================================================
FILE: Content/HandGameplay/Audio/impacts/sfx_impact_secondary_block_10.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:f3c9df420ac2e410031f394c5942c9785081b1e128ffaecf2f59ac33af3c69fd
size 34240


================================================
FILE: Content/HandGameplay/Audio/impacts/sfx_impact_secondary_block_11.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:4ca7163f0abdd9a17ec71eb907aca2273774f0d997df26e0351543988b0636fb
size 31648


================================================
FILE: Content/HandGameplay/Audio/impacts/sfx_impact_secondary_block_12.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:679b16faadd419a792ba4e37e32935c9620c8c7c0500a60aed132fbe5dd0ca09
size 37212


================================================
FILE: Content/HandGameplay/Audio/impacts/sfx_impact_secondary_block_13.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:234096a925df53199d57c3d2a8cab3d8eb68ad7cb6d1182affb06e5eb13d2a44
size 27979


================================================
FILE: Content/HandGameplay/Audio/impacts/sfx_impact_secondary_block_Cue.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:880d452734472b35c3463209b2cbeebea27ccdfed1f039e2ac0d107b19a092be
size 21332


================================================
FILE: Content/HandGameplay/Audio/laser/LaserSound.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:64a611c5eb7065b1b4428957a6ea5d67ce0dbcb9774bb6744232b7bdc11c8421
size 7671


================================================
FILE: Content/HandGameplay/Audio/laser/sfx_laser_end.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:09d282ba8ca20e06fbaeccbe4efeedc68c90bb67d01795f867959dc2afce1312
size 203679


================================================
FILE: Content/HandGameplay/Audio/laser/sfx_laser_lp.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:3b62e80c18f39438f0be03d7923b94206a0ae96a7d8d4140da60b94a82f9a515
size 705462


================================================
FILE: Content/HandGameplay/Audio/laser/sfx_laser_start.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:18c1bb23a20cf98917e72a067a7234256b78133655e2065bb9589e77bed0684d
size 161306


================================================
FILE: Content/HandGameplay/Audio/mus_showcase_hands01.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:8cac4df454ab7e5ec71671950148129e614bc27de9c3c7cef92d62963a2de38a
size 31912467


================================================
FILE: Content/HandGameplay/Audio/sfx_ambient_outdoor_forest_ambix.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:7e85a9b706e63552e98e5b84381b410223eb6c69ee6b50213c42cc9d2f8c79a5
size 39309174


================================================
FILE: Content/HandGameplay/Blueprints/HandsCharacter.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:4871e75eb2308c491e320f8fe4b0f704c1afeae43a934d67bb3449afc45558a7
size 77585


================================================
FILE: Content/HandGameplay/Blueprints/HandsGameMode.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:a71313d9a1c73496b14fc115426a21922a4412a1ee91027b1923a9e4b7bc2dd1
size 20601


================================================
FILE: Content/HandGameplay/Environment/DustMotes/DustMotes_mat.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:0b57e575286cb77fdf3432392fe72d265dda2a5c57133fbbef80581e55a7c742
size 80610


================================================
FILE: Content/HandGameplay/Environment/DustMotes/DustMotes_system.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:790bc72151f44604020e0c23d6f8514005023d0d1f7a3eaf931962b619a701ef
size 836668


================================================
FILE: Content/HandGameplay/Environment/DustMotes/DustMotes_vfx.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:5f0bc288750ae2cf9eaddfbaeb00ef2fb54a2ba03952c763346990753bcbbcf6
size 185051


================================================
FILE: Content/HandGameplay/Environment/DustMotes/T_Epic_sub_dustParticle.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:a5e5b2b4fee995be51884405dfe667a5d0d22da0ff4141c38d28ca59486ada19
size 38225


================================================
FILE: Content/HandGameplay/Environment/DustMotes/vfxm_Dust.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:381c95e433bd9090d5af77e83e4ca4613b99f41b8e1adf9421328cc075906124
size 85304


================================================
FILE: Content/HandGameplay/Environment/DustMotes/vfxm_GradientCircle.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:52b49b3f3069e7cec68ef7684defbadd4d5a1ace9a4635befaf09f14de4757f9
size 94105


================================================
FILE: Content/HandGameplay/Environment/DustMotes/vfxm_GradientCircle_Inst.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:e657cf3213a2d9483a4a5d7a34171808de8e2979f277df44774e522c95783e98
size 75299


================================================
FILE: Content/HandGameplay/Environment/EnvMatParms.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:ca178d89f6d9f0498998a502f84c4cd581409b85954accac4cfe5d44196609e4
size 2336


================================================
FILE: Content/HandGameplay/Environment/HT_cube_Tex.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:08bbb2ab01456d61878518b53c0e6a2bbf9af202c7b507c6457f41088b2d43e5
size 18267320


================================================
FILE: Content/HandGameplay/Environment/snow_envi/materials/front_rock_snow_bc.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:baa2f367209dde9f4e46d460d859ffce0a4d33dc23500b03387025942f804bf1
size 5150032


================================================
FILE: Content/HandGameplay/Environment/summer_envi/back_wall_bc.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:c902e85b67af6d2cd99a5bad91fd479b4019fc2c432fdf62a1ca65fdaa04074d
size 5590326


================================================
FILE: Content/HandGameplay/Environment/summer_envi/back_wall_mat.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:b7ce974ef29b45d8057886ad362204e46368008e8251f5fd5be7344ad2718048
size 137768


================================================
FILE: Content/HandGameplay/Environment/summer_envi/back_wall_sm.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:90740901bf42d83576dd7a26d3f9ef9056e6ddf6debf867b25ad30e52484cebc
size 313718


================================================
FILE: Content/HandGameplay/Environment/summer_envi/cieling_bc.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:30f503a452aaa88c690e11d2c97e5a9484ee6968cbcb5002010401e2f7445c86
size 6142030


================================================
FILE: Content/HandGameplay/Environment/summer_envi/cieling_mat.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:5a7126c3a42f491ac1d7817fec8c6e54a22149118f63dbe06d137cc2f679dadb
size 156936


================================================
FILE: Content/HandGameplay/Environment/summer_envi/cieling_sm.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:b354f382457e82b44a0ab155312f0f4325f9690fdd1e71a2b8927270757f5a09
size 152293


================================================
FILE: Content/HandGameplay/Environment/summer_envi/cloud.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:80f38f5943a40ad9e0905d7a17c83460d5c3db4ede8e1ea7fd74ef4b57d12eba
size 109892


================================================
FILE: Content/HandGameplay/Environment/summer_envi/cloud_sm.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:a4ba8c1172c2f1fbd713523780fd5c0afac7f04d43f4d69e54662738971c91eb
size 568262


================================================
FILE: Content/HandGameplay/Environment/summer_envi/clouds_bc.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:17c542e80cc6c53706b6cb9fd8109b342e2e4be5eebd39a04c61236d03af6b36
size 1814529


================================================
FILE: Content/HandGameplay/Environment/summer_envi/collision.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:6701718b9264456e2dab0f07b31fb5ee775cecb8b1c6c34a9d168420e718c7d3
size 145862


================================================
FILE: Content/HandGameplay/Environment/summer_envi/front_rock_bc.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:801cab027ce8e7aee8027265865a22365ad254c8e7aff707b7274e6a5419e90a
size 7457494


================================================
FILE: Content/HandGameplay/Environment/summer_envi/front_rock_mat.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:7b0067ced418dd4b5f864e379cfd5b77849a659fa16ae6fc1e4912a25b458fd4
size 142811


================================================
FILE: Content/HandGameplay/Environment/summer_envi/front_rock_sm.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:3aaff68e03a00c02d06ef932e4aeb6c4b5e206f66c74feb055c729ddb3956e93
size 632117


================================================
FILE: Content/HandGameplay/Environment/summer_envi/front_statue_bc.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:4dbfe761d9130aec0383bc7c45e5e4ccef4b8e9ae00308fb4e627f111fb5654e
size 7524738


================================================
FILE: Content/HandGameplay/Environment/summer_envi/front_statue_mat.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:96c313008f0bd1a2e80f07d48cbbe91a074b0f6ca88aaa6c0533ed6d4b4d6fb8
size 151266


================================================
FILE: Content/HandGameplay/Environment/summer_envi/front_statue_sm.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:e17241fc5fd27964e71773d8e5294609077f4b766d020cdcfd0da0d51ee974fd
size 881118


================================================
FILE: Content/HandGameplay/Environment/summer_envi/grass_bc.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:c6b73bcd76fce0f7ec32f5288db40970cbf72719606e9abb5baadaf92a65ac92
size 5004470


================================================
FILE: Content/HandGameplay/Environment/summer_envi/grass_mat.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:bc4dbb177cb2a909979699381ef3e7a3b32d2473b71453c8b9947c06f3b3c04c
size 147603


================================================
FILE: Content/HandGameplay/Environment/summer_envi/grass_sm.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:e9601ad317b3220937f78a66e4b5ebd68f100e111255c0140738635a5c2c68b3
size 180524


================================================
FILE: Content/HandGameplay/Environment/summer_envi/left_wall_bc.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:7129dcd59dc43c7dbc5ce39260bbd2befe6ef36ff2b02e2704a7214a05778ea1
size 7846747


================================================
FILE: Content/HandGameplay/Environment/summer_envi/left_wall_mat.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:12a70a31bb78083ae856811bd588c762950d718c6d77d332196d0c8fbbdef9fc
size 148314


================================================
FILE: Content/HandGameplay/Environment/summer_envi/left_wall_sm.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:598d63e3ac2943e70e28ce02dd4cdc4b83a321d71c09a13d1d85e688b4cf59d8
size 392141


================================================
FILE: Content/HandGameplay/Environment/summer_envi/main_floor_bc.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:402e435c4cfcf9535ec4bf11a284d69dbf579b7d22e6bfb4e56991bae4dc9d4d
size 8532169


================================================
FILE: Content/HandGameplay/Environment/summer_envi/main_floor_mat.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:6ac6712d14e4c6975797273b78278c632003f9bdac15da6081ee902d26f24f5a
size 144198


================================================
FILE: Content/HandGameplay/Environment/summer_envi/main_floor_sm.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:31e702b6f9fc44a16d81118fbe12a141f3e9eb4b31a85ab06ccdeabfb982c6de
size 200465


================================================
FILE: Content/HandGameplay/Environment/summer_envi/right_wall_bc.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:17098acc888a0d0fec0585d4eca19aff287bfd1affc39114fb723cd47609e5f5
size 6306874


================================================
FILE: Content/HandGameplay/Environment/summer_envi/right_wall_mat.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:79319e598a0a81e75a0ecd140ba4f64e843014ab5f0c392a740dcf3ea7d05538
size 134751


================================================
FILE: Content/HandGameplay/Environment/summer_envi/right_wall_sm.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:bb7eb1f3fc3fdfafaaed5e7c7e3122278c5a9a79d9379b7513f69952f58744ed
size 523096


================================================
FILE: Content/HandGameplay/Environment/summer_envi/vines_bc.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:8657ebe24ff6867959d9dafd4c66ca147dda405825ca00ffa31bff2bc2837126
size 1431233


================================================
FILE: Content/HandGameplay/Environment/vfxm_WindFoliage.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:aba24694c700ed06d22b01a1b426e677d954b9f40d2d7e8cfe37503bb40b9713
size 163497


================================================
FILE: Content/HandGameplay/Environment/vfxm_WindGrass_Inst.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:4075091fc2884277ae3265b6c4c116ae9780fc1518d4917ccb1590938846bbe3
size 142642


================================================
FILE: Content/HandGameplay/Environment/vfxm_WindVines_Inst.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:88384ad7256f73e82b3964b58e815877e928d7cb7df691247481627b4cda2369
size 128071


================================================
FILE: Content/HandGameplay/Environment/vfxsm_vinesVtxAlpha.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:1e506290165640ad39a6ae18e87ede4d0e61548f3d5b84b172db290406e0af4e
size 310382


================================================
FILE: Content/HandGameplay/Hands/Models/HandMat.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:6219b9c63ee1ab3b0b4675d08b30db656d0febfb61f68b066d1f03ebc8f505cd
size 129357


================================================
FILE: Content/HandGameplay/Hands/Models/OculusHand_L.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:e9d5ff1272c22f7d2bf481ca9094e57e088603281b66b17fdb4087a92b45cda8
size 500387


================================================
FILE: Content/HandGameplay/Hands/Models/OculusHand_L_Skeleton.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:3bfd455bd71d7e72070815035bb6e042ef8e2a45ad44e88b3a9f971e029d8ef3
size 18086


================================================
FILE: Content/HandGameplay/Hands/Models/OculusHand_R.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:3d03d878f090cd0f06bb17510e0a6040b998f9cb3511ac8b81630c80ebb7e815
size 500443


================================================
FILE: Content/HandGameplay/Hands/Models/OculusHand_R_Skeleton.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:cd6ad521c2923a9b13bb81a24e2fd5e2cc63250ada54e9c8c2c2c85927459f1d
size 18086


================================================
FILE: Content/HandGameplay/Hands/TutorialHand.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:2ac93caef3fa82b4392c6f1929c7af3f6329fe1ff28e39304692bcd47bb1fa00
size 100097


================================================
FILE: Content/HandGameplay/Hands/TutorialHandLeft.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:5da72c2cbcd284e2251c3567d5a1965e1a0697be2907cea3ae749e89fd6f643f
size 44984


================================================
FILE: Content/HandGameplay/Hands/TutorialHandRight.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:240c9b6594a30c1e582952db71e79964adfb3f4b5115197d80868e8e143e9ee4
size 38781


================================================
FILE: Content/HandGameplay/Input/Actions/AvatarLeftSystemGesture.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:db687a87c065b4da5889c279bbb85bc36e4cad91b95707db1e643bb82e4da4a5
size 1400


================================================
FILE: Content/HandGameplay/Input/Actions/LogGestureState.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:cf62c8e733b90fd4ae2807a286ca6cb695bb95634bb41ad202a13583310d903e
size 1360


================================================
FILE: Content/HandGameplay/Input/Actions/LogLeftHand.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:0bec330b1f1d1c08d7b3701fc8f67f21ac76a043af47a04908b56cba2a7970b9
size 1340


================================================
FILE: Content/HandGameplay/Input/Actions/LogRightHand.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:4ea0afae7721ecaa22a2d57f555261c0da4c1ac5dd87e26c5b994cc76f0f2692
size 1345


================================================
FILE: Content/HandGameplay/Input/Actions/TogglePoseRecording.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:5fdbd587886c526d16b1654bdfe3813445ca582af5448adc7a4d7d31d24008c7
size 1380


================================================
FILE: Content/HandGameplay/Input/Actions/TogglePoseRecordingLeft.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:e05a4a6eb3d46fbe6e918301caab9797bc816222eccb7a1929cb05173c496dac
size 1400


================================================
FILE: Content/HandGameplay/Input/Actions/TogglePoseRecordingRight.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:49061cfaed6bc737b226117849187a5aabd9fba4295d2d6226eca67b9491864e
size 1405


================================================
FILE: Content/HandGameplay/Input/InputMappingContext.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:97a2825de20eb4846b544ac3a94e80cc89e01accaa8639fdd71216109ff58548
size 6734


================================================
FILE: Content/HandGameplay/Levels/HandGameplayShowcase.umap
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:07c8e5339550f019e1c79d4660b4ce249fec3b39e5697537167e11aa18815016
size 346692


================================================
FILE: Content/HandGameplay/Levels/HandRecognitionShowcaseArt.umap
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:117d793adc535717d693bff0e08f42552fdaf96bcfd39f5a08899d88bd7180d7
size 49341


================================================
FILE: Content/HandGameplay/Levels/HandRecognitionShowcaseAudio.umap
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:adf30fae34a9e7df004da751fd6763529d8dc3c7b16c423d2b3396f587037960
size 11278


================================================
FILE: Content/HandGameplay/Levels/HandRecognitionShowcaseVFX.umap
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:6299627c430c30e2cc28e28b5c0dd14d3726ee1061c186d9bd2600c7a39e00f6
size 24789


================================================
FILE: Content/HandGameplay/Props/Blocks/Blocks001_Throwable_sm.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:400f80d39b38df00cc322fabefdcb1e5665053fb47b72c8339094b96ed759912
size 116820


================================================
FILE: Content/HandGameplay/Props/Blocks/Blocks01_bc.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:11d069f39ac48bae24f2b1acb90bf90261733268b6c4b55bda86d1207a7dbdf0
size 373341


================================================
FILE: Content/HandGameplay/Props/Blocks/Blocks01_bc_Emissive.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:230f528f6dcf748855b08ad6687c796c2e16a7c74d00be907363c4059c861c6a
size 166015


================================================
FILE: Content/HandGameplay/Props/Blocks/Blocks01_nm.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:55e19d90494d33137e9f044d96729702123e9a8ec837161180179b33fd3b0d89
size 448108


================================================
FILE: Content/HandGameplay/Props/Blocks/InteractableBrick.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:fe26a7b219c4255ce56765f18d3c0e73f3fad6bd35232401e0d55eceb2efbde4
size 77988


================================================
FILE: Content/HandGameplay/Props/Blocks/NS_BrickImpact.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:9ee79b9bd8d2f29f41e55bc3142c9ef1bcebdf9ae7a4901de5debf458ea93614
size 1201603


================================================
FILE: Content/HandGameplay/Props/Blocks/T_Epic_SUB_UV_Small_Rocks.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:398b9586620051eb4eb594a89d885580287b8df4e1ea4dd142455f6a88daafe7
size 69776


================================================
FILE: Content/HandGameplay/Props/Blocks/vfxm_Blocks01_Throwable.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:c3e37b2c1fbe3438dfc64c7c80d17b786774ef16e156ef5edf8397eaa3b3d78f
size 145820


================================================
FILE: Content/HandGameplay/Props/Blocks/vfxm_Blocks01_Throwable_Inst.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:35ded812adb41a0d1156c11fdaafd91a718e0c139d7040b12d287b022115a9a0
size 131607


================================================
FILE: Content/HandGameplay/Props/Blocks/vfxm_ParticleSpriteUnlitSubUV.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:1c0eb5ad0e0562ba7a3a8e45635669050d88fd9c9a36bf9464fd0b1c37cbd145
size 99625


================================================
FILE: Content/HandGameplay/Props/Button/PushButtonBP.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:96054da4ed1469b8b1e3488aa649caf8187cdc93b4e4d33d8ae4ab7cac42658d
size 33958


================================================
FILE: Content/HandGameplay/Props/Button/SFX/GameConsole_button_press_in_01.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:e6b03d935a18205e06a46a9c5529da3bb331ddcda0032db317eacb15568f9c04
size 78128


================================================
FILE: Content/HandGameplay/Props/Button/SFX/GameConsole_button_press_out_04.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:ca9d8977d512d6008e945d014abb37ccbdcc1f8002ba5a357f094e6dcc5b62b1
size 67611


================================================
FILE: Content/HandGameplay/Props/Button/ToggleButtonBP.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:83a1ddf8dd873ac663b3f2ded9debbc012bec912b4ca61c9a2ac0fc202e93f1a
size 59851


================================================
FILE: Content/HandGameplay/Props/Button/testbutton_sm.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:2937db3174474c119042cec9b802a6c6af41365998f3c26963ef5e58249b5b0a
size 106713


================================================
FILE: Content/HandGameplay/Props/RingWeapon/2HandedBeamProp_Mesh.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:dccb18897ebeecba8cfddf6722e4e1dd7e15ed7bdb10c27bdf4d11fc22ca3fae
size 136727


================================================
FILE: Content/HandGameplay/Props/RingWeapon/InteractableArtefactHandle.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:c1bd40c9c5640ff847874f06a51c53a8f503ad8666fb6333c2f5ab29043cbbec
size 22921


================================================
FILE: Content/HandGameplay/Props/RingWeapon/InteractableTwoHandedArtefact.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:44baf3b7ad3dbec11623e8aaefb097b87cb72e72848f7d7af0c2e090f92bf444
size 406172


================================================
FILE: Content/HandGameplay/Props/RingWeapon/TwoHandArtefact_StartBeam.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:54fe03d0134e0eef428b5b742e76b4ff06dd0f8cffe38982a99ab1edc957f407
size 306728


================================================
FILE: Content/HandGameplay/Props/RingWeapon/TwoHandedBeamSystem.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:3c945eeb2e333e3f2abf4061b754b61d40a25435471f6a36842181fdb2f90031
size 905952


================================================
FILE: Content/HandGameplay/Props/RingWeapon/vfxm_2HandedBeamProp.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:e64d98e9fc6a558f9441454c48a616a583b085c07050689ef3120c30da3b67d2
size 129560


================================================
FILE: Content/HandGameplay/Props/RingWeapon/vfxm_OrbFloating.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:9ceb862c2a51374ba5bdb8235a9bb61b7b2ec57674ec3b18fcc0b7fc55bbbdc1
size 129313


================================================
FILE: Content/HandGameplay/Props/RingWeapon/vfxm_TwoHandedArtefactBeam.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:daf831d5e14cb4c01178afbf354c8c2ef13da010d29c43a437df52421c2bb272
size 120677


================================================
FILE: Content/HandGameplay/Props/RingWeapon/vfxm_TwoHandedArtefactBeam_Inst.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:afc44e2fdae94a4ff70eaa5a7023d1d9eb8b509329912d2402c3a700ae814c00
size 86454


================================================
FILE: Content/HandGameplay/Props/Table/table_bc.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:e8f4e092d9e979fa974073fbda3e3a85bc625ebbaa6badae2d5646f8a51107e8
size 2873280


================================================
FILE: Content/HandGameplay/Props/Table/table_mat.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:2ee811fdfef12013624d479c0710e8c2f1c35057081889265a7783ca71569837
size 122049


================================================
FILE: Content/HandGameplay/Props/Table/table_sm.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:05e7df80416abb00f0f907278722785ba6dd1f63c70baa037bf39c4f717d8854
size 125429


================================================
FILE: Content/HandGameplay/Props/Target/TargetBP.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:489e960fea29eee0a5cdfdae2af6ad98429e21b83a5ecb57c307551d5ca600dd
size 168606


================================================
FILE: Content/HandGameplay/Props/Target/sfx_spinning_target_01_loop.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:0c6f7b263811dce4f7ba17c113776cf47f89b2a21c3f6770f2ffc52db455806a
size 2029960


================================================
FILE: Content/HandGameplay/Props/Target/target_m.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:0f90611a4b3546bfbe3301812624af3dfcb7e1045bf7ef17439eecf11bace8f0
size 137620


================================================
FILE: Content/HandGameplay/Props/Target/target_pentagon_sm.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:40810460e0acd422e7f79bdc76b0f112b4fd32502fcfc35009a44895d16c6e2e
size 111988


================================================
FILE: Content/HandGameplay/Props/Target/targets_bc.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:d3c3a8e05f71a62586c6e3ebbebebb750968d28276d524d6b73e1cc3c0f02c0d
size 1393767


================================================
FILE: Content/HandGameplay/Props/Target/targets_em.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:2013bdb1db3c56115fca9bf3d8b6fc665fb6e0a055a2f431f7b3c8d437a9e0d3
size 1461838


================================================
FILE: Content/HandGameplay/Props/TeleportBeacon/Activate_vfx.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:f5e5063e39d93d5186a072e59cb7da62b4305da0ffcfc97594da5314d8172a06
size 219044


================================================
FILE: Content/HandGameplay/Props/TeleportBeacon/NS_Activate.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:ff6745c9df34b10b024daffc552deb880712f9abe7299bafa2f62aa0baee79dc
size 1120235


================================================
FILE: Content/HandGameplay/Props/TeleportBeacon/TeleportBeacon.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:4fb8c9859a53a30bc3b58b9d16b9af7a0ecb29c1fecb7eaa39a0baa28c674458
size 115086


================================================
FILE: Content/HandGameplay/Props/TeleportBeacon/TeleportationPad.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:b33f746beb7471a7d51b772c0a0f8bda81df64b64935b3c0e8768e09ac458182
size 220236


================================================
FILE: Content/HandGameplay/Props/TeleportBeacon/TeleportationPadMesh.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:3352cb0e602349b25be96f31a176edbd2a1210ca99c56e9e7bf54f11186f946c
size 103637


================================================
FILE: Content/HandGameplay/Props/TeleportBeacon/vfxm_ActivateGlow_Inst.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:d16ea1baab686e825db506f5fd3c68ee6ca5ff70c41f6dac1ae68b23d0ff14ae
size 82813


================================================
FILE: Content/HandGameplay/Props/TeleportBeacon/vfxm_AlphaPanner.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:81ce8e1f1bf4edcee75faa6f7c4859328d56762459861f6e7b485dc24ca9a78a
size 141201


================================================
FILE: Content/HandGameplay/Props/TeleportBeacon/vfxm_TeleportBeaconPointerArrow.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:305a011c5d554a9d31a16abefa2329d658cfd5f61d3de7606196d554588318ae
size 119615


================================================
FILE: Content/HandGameplay/Props/TeleportBeacon/vfxmi_TeleportBeacon.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:391b9f9f78709f79e952028b104e19fc1001c468a5ad10953a357399fdd62cfd
size 126239


================================================
FILE: Content/HandGameplay/Props/TeleportBeacon/vfxmi_TeleportPointerArrowRing.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:655832a84c389743614cfeb4a940fca36f2e36265843667c94820a721816f4a0
size 114278


================================================
FILE: Content/HandGameplay/Props/TeleportBeacon/vfxsm_TeleportBeacon.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:e57765522db7755917a7065be479277f5f29136a1ff5753d7b30cba823aea8d0
size 148367


================================================
FILE: Content/HandGameplay/Props/TeleportBeacon/vfxsm_TeleportPointerArrowRing.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:ac19002af2dd2c8195bb367b2364f7d0c95590d0c6a188f539ff9697e0ef74a3
size 137894


================================================
FILE: Content/HandGameplay/Props/TetherBall/Art/ball_bc.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:c738d56d7c0aa6f3bfb999f7675dc1164e647f306e25bd9e5983bf6ce4ca2d97
size 1241517


================================================
FILE: Content/HandGameplay/Props/TetherBall/Art/ball_mat.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:fa16847b663305a08a1dc76f5f67b11c7e61351da8260dfc6f9b5b4f8eea259e
size 123074


================================================
FILE: Content/HandGameplay/Props/TetherBall/Art/ball_sm.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:8bb4bc79fd6fe522eaa4879f07631230aa55e337103849f7938717f1356c292e
size 155978


================================================
FILE: Content/HandGameplay/Props/TetherBall/Art/tether_ball_base.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:ed7f9002f59b8e0a40025addd009ebf0887e86d55d9d35c3b590bf54373e059e
size 674230


================================================
FILE: Content/HandGameplay/Props/TetherBall/Art/tether_ball_base_mat.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:cd91b5084903baf8a0a6efe2d947cc56543c37f2dca855ce43c94a4c0392c2f0
size 118285


================================================
FILE: Content/HandGameplay/Props/TetherBall/Art/tether_ball_base_sm.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:7cc3f92bc854e0019cb4b912527a16e8ac0df97f378acee9a45f07b350fcfcd6
size 109258


================================================
FILE: Content/HandGameplay/Props/TetherBall/Art/tether_mat.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:2e09393041414955f2180675afffe0851f1fd35c56d4a169f633e799fa865e85
size 115800


================================================
FILE: Content/HandGameplay/Props/TetherBall/SFX/TetherBallHit.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:3a8704b2611d072bbe8b50d5bfb27edf3971bc544d223b1a40558aacfd86d7de
size 16110


================================================
FILE: Content/HandGameplay/Props/TetherBall/SFX/TetherBallSoundConcurrency.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:622ee5df7d8e40c606792c2ca659a94263d6652e0fc98e64d9871a4f00f2116e
size 1549


================================================
FILE: Content/HandGameplay/Props/TetherBall/SFX/TetherBall_RubberThick_Imp_01.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:4d62109799fb674d78162e53011364ccce82423aa10bf1c688dc3f60252c57ba
size 43153


================================================
FILE: Content/HandGameplay/Props/TetherBall/SFX/TetherBall_RubberThick_Imp_02.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:dcadb7b0591413a37ba76c9717196dee27dc56caa6af26ffeacd3aedd183671a
size 33888


================================================
FILE: Content/HandGameplay/Props/TetherBall/SFX/TetherBall_RubberThick_Imp_03.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:026dd90f3857c99e8f4e6fdcd3a0616aabea03cb067971090e63f26b2be0d4e4
size 48030


================================================
FILE: Content/HandGameplay/Props/TetherBall/SFX/TetherBall_RubberThick_Imp_04.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:4ea7141b208fffaa22ba03276833ad9e17c61a0f2608f2da0179196081545092
size 62567


================================================
FILE: Content/HandGameplay/Props/TetherBall/SFX/TetherBall_RubberThick_Imp_05.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:e726ebddfd66dbf5f9f8100b80f984e42be59715a92da8ed3fb8c0c5fce24e01
size 43129


================================================
FILE: Content/HandGameplay/Props/TetherBall/SFX/TetherBall_RubberThick_Imp_06.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:a877d19496c02e40cdbfbec6b1f1e9d155f0c1c105046ae3253eb0df06bcd1eb
size 36879


================================================
FILE: Content/HandGameplay/Props/TetherBall/SFX/TetherBall_RubberThick_Imp_07.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:5b8910e973a1db85ba729aff9a38ee42ac23b17df628ee4914935ea89d694c77
size 30504


================================================
FILE: Content/HandGameplay/Props/TetherBall/SFX/TetherBall_RubberThick_Imp_08.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:2ef4387350baa1ee0b82432080ad64616413becffd7d7a135fde13f92f1867d1
size 27541


================================================
FILE: Content/HandGameplay/Props/TetherBall/SFX/TetherBall_RubberThick_Imp_09.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:02a2de4ddfd2caca2f16ec72b1c0fdccfa0a90a66fe8abb6694645ad75cab26f
size 39754


================================================
FILE: Content/HandGameplay/Props/TetherBall/TetherBallBP.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:a18056945e3328042cbf984ab8551b66c4160a003a5d0a147e85130a692482ab
size 200287


================================================
FILE: Content/HandGameplay/Props/TetherBall/ThetherBallPhysMat.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:d0cb195b43e06d51342ac25f054f5785d2297c2b065e21a5361a9180cf6b6083
size 1665


================================================
FILE: Content/HandGameplay/Props/TetherBall/VFX/spawn_tetherballBase_ps.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:ffbb463f7c2c0efcbd1d33797ac6f1726b76f0f7ecaab705ff8b63b785b5b806
size 45863


================================================
FILE: Content/HandGameplay/Props/TetherBall/tether_ball_sm.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:8eb309b42c11125e98086c44b90a212db8287902645446cf6b8a5b57b55da609
size 162513


================================================
FILE: Content/HandGameplay/SharedArt/Blue.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:4d29c50208c87b00d2442ba40ec3bb323115988b1017db0350a94715671bd720
size 111177


================================================
FILE: Content/HandGameplay/SharedArt/FlatBlue.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:4adf7a3032a3f8b0b41679d9f58a37902a400eab565d8189ff9c14371e93d14e
size 104258


================================================
FILE: Content/HandGameplay/SharedArt/Red.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:ba3bd8c301cf90755b3516af72f17c786d3fc10c356ec1364ada32cfb241e5a3
size 113428


================================================
FILE: Content/HandGameplay/SharedArt/T_Caustic01.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:c579f1a4402b4aaa42b6f080aa6acce3bebb9808e44bd53c61b7cc5d0aa4dbee
size 1530727


================================================
FILE: Content/HandGameplay/SharedArt/T_WorleyNoise01.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:31bc66ed0c48b42be7b627b057dfd357b491fc6bedd5ec8bb13a13cc9b1f8ae6
size 448233


================================================
FILE: Content/HandGameplay/SharedArt/TextBackground.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:ceb8c1e3729c63698365449612b9c8da558cea0e5adb96a99020247afda4bd55
size 109062


================================================
FILE: HandGameplay.uproject
================================================
{
	"FileVersion": 3,
	"EngineAssociation": "",
	"Category": "",
	"Description": "",
	"Modules": [
		{
			"Name": "HandGameplay",
			"Type": "Runtime",
			"LoadingPhase": "Default",
			"AdditionalDependencies": [
				"Engine"
			]
		}
	],
	"Plugins": [
		{
			"Name": "ApexDestruction",
			"Enabled": true
		},
		{
			"Name": "GooglePAD",
			"Enabled": false
		},
		{
			"Name": "OculusXR",
			"Enabled": true,
			"MarketplaceURL": "com.epicgames.launcher://ue/marketplace/product/8313d8d7e7cf4e03a33e79eb757bccba",
			"SupportedTargetPlatforms": [
				"Win64",
				"Android"
			]
		},
		{
			"Name": "OpenXRHandTracking",
			"Enabled": true,
			"SupportedTargetPlatforms": [
				"Win64",
				"Linux",
				"Android"
			]
		}
	]
}

================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) Facebook, Inc. and its affiliates.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: Platforms/HoloLens/Config/HoloLensEngine.ini
================================================


[/Script/HoloLensPlatformEditor.HoloLensTargetSettings]
bBuildForEmulation=False
bBuildForDevice=True
bUseNameForLogo=True
bBuildForRetailWindowsStore=False
bAutoIncrementVersion=False
bShouldCreateAppInstaller=False
AppInstallerInstallationURL=
HoursBetweenUpdateChecks=0
bEnablePIXProfiling=False
TileBackgroundColor=(B=64,G=0,R=0,A=255)
SplashScreenBackgroundColor=(B=64,G=0,R=0,A=255)
+PerCultureResources=(CultureId="",Strings=(PackageDisplayName="",PublisherDisplayName="",PackageDescription="",ApplicationDisplayName="",ApplicationDescription=""),Images=())
TargetDeviceFamily=Windows.Holographic
MinimumPlatformVersion=10.0.18362.0
MaximumPlatformVersionTested=10.0.19041.0
MaxTrianglesPerCubicMeter=500.000000
SpatialMeshingVolumeSize=20.000000
CompilerVersion=Default
Windows10SDKVersion=10.0.18362.0
+CapabilityList=internetClientServer
+CapabilityList=privateNetworkClientServer
+Uap2CapabilityList=spatialPerception
bSetDefaultCapabilities=False
SpatializationPlugin=
SourceDataOverridePlugin=
ReverbPlugin=
OcclusionPlugin=
SoundCueCookQualityIndex=-1



================================================
FILE: Plugins/OculusHandTools/.gitattributes
================================================
*.a filter=lfs diff=lfs merge=lfs -text
*.lib filter=lfs diff=lfs merge=lfs -text
*.uasset filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
*.umap filter=lfs diff=lfs merge=lfs -text
*.jpg filter=lfs diff=lfs merge=lfs -text


================================================
FILE: Plugins/OculusHandTools/.gitignore
================================================
# Visual Studio 2015 user specific files
.vs/

# Compiled Object files
*.slo
*.lo
*.o
*.obj

# Precompiled Headers
*.gch
*.pch

# Fortran module files
*.mod

# Executables
*.exe
*.out
*.app
*.ipa

# These project files can be generated by the engine
*.xcodeproj
*.xcworkspace
*.sln
*.suo
*.opensdf
*.sdf
*.VC.db
*.VC.opendb

# Precompiled Assets
SourceArt/**/*.png
SourceArt/**/*.tga

# Binary Files
Binaries/*
Plugins/*/Binaries/*

# Builds
Build/*

# Whitelist PakBlacklist-<BuildConfiguration>.txt files
!Build/*/
Build/*/**
!Build/*/PakBlacklist*.txt

# Don't ignore icon files in Build
!Build/*/**/
!Build/**/*.ico
!Build/**/*.png

# Built data for maps
*_BuiltData.uasset

# Configuration files generated by the Editor
Saved/*

# Compiled source files for the engine to use
Intermediate/*
Plugins/*/Intermediate/*

# Cache files for the editor to use
DerivedDataCache/*

StoreAssets/
GenerateSln.ps1


================================================
FILE: Plugins/OculusHandTools/Config/FilterPlugin.ini
================================================
[FilterPlugin]
; This section lists additional files which will be packaged along with your plugin. Paths should be listed relative to the root plugin directory, and
; may include "...", "*", and "?" wildcards to match directories, files, and individual characters respectively.
;
; Examples:
;    /README.txt
;    /Extras/...
;    /Binaries/ThirdParty/*.dll


================================================
FILE: Plugins/OculusHandTools/Content/BlueprintMacros.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:fd8a267cc165f554ad3caca177326a8ffdc8d28f0e465eda99986f44474f955b
size 19603


================================================
FILE: Plugins/OculusHandTools/Content/Button/IsButtonableInterface.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:bbc6041451dbced11619631f508c5bba488a8c751c6807027058155431a77e34
size 8842


================================================
FILE: Plugins/OculusHandTools/Content/Button/PushButtonBaseBP.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:bc31619c51f959dd3d66f795acdb4b2278cecd65fe431b45bcd54c76cfa7010d
size 420145


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-Black.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:32771fd4caa2a3602a864be461f4648c71c44a6525ba97cfb3f90204b77d1b1e
size 158824


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-BlackItalic.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:478864f05f6d4be2278d511f832853bcc9e9ee22f8fcf3703e6bec9fc6ef29a2
size 193332


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-BlackItalic_Font.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:47c5b118bf8405524375bbcacfb6910b90c110f4ec8272f47cf6437048f50ab7
size 9053


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-Black_Font.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:ceb0a59d1241f49c24fbd1c8b1511ddeca5f630195be570de617f55655ff652c
size 8641


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-Bold.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:5311a26a07352ceb5e038fde8584c38231f42f4c2926ad617dc6a53876695792
size 157470


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-BoldItalic.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:3980178ca9739b58ce89f889be02ef11a9e35332149930d70de0a3b02bd6ef88
size 190918


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-BoldItalic_Font.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:ee0e5d9b718f4dbffc4cbb075aeee3df287a41094275f130f1c4f5969d24388e
size 9150


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-Bold_Font.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:60e3255a84e3abdf54526b725235cbb1d20c2e2f8ba99c502b365ce4fa4ca433
size 8676


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-DemiBold.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:5a1213f99a6198d5344c9ffdc1289f46a91bf928b845f4bf18dc956b98bf3690
size 157094


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-DemiBoldItalic.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:3ab4e717e741ce59e63e9f887f78b2b0de3e552b2cf1e43410964af97a68deb0
size 191850


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-DemiBoldItalic_Font.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:fe14c12e99f34c5de5836e7375f93de0f556b16b7b9c577d25589d77d7a5eac4
size 9168


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-DemiBold_Font.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:e5d3096fdd763e6e7f950f15cf65bf2d37d881b6eb5768628c89fb9466683717
size 8781


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-Light.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:43ffafdee0fda042fdb2c5bc68c289385982536652234ad7b2384b56392d077b
size 157532


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-LightItalic.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:a2170036e9e99f4e5084cada6e4a415d032f9c02366b3ce82fc9907aef1dcf81
size 189180


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-LightItalic_Font.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:56d9fd7cb3521ef1651d623d937e052396e185dbc809f030188855f5a6962520
size 9330


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-Light_Font.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:64992b5f8cd6ea277842b76862e5dd4de494c31e3638e5a68d80a73ddf77035e
size 8608


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-Medium.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:e3656a97844e3300b46ee7ac8ad48329fd1eef673c9acc701f2c051ce9cccd54
size 144430


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-MediumItalic.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:06a652b0d2208ce5bec58021f44ca7d304389e6dbe1b0b2c001bd414ffb1a9eb
size 187234


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-MediumItalic_Font.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:89b71292847af0e4776c0f4679391a26144b71189555afec3e1b780320743949
size 9367


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-Medium_Font.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:f80911b61ff847747655c9e3f159df168a3b1cc4eaacb42c32149ef9c973c40d
size 8835


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-Normal.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:a94395cc1f34cbc8d5b0c482ffd769450c65bed2231c985f3926d2afacc36b6f
size 155734


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-NormalItalic.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:e201ffc9b185bc0edee5241cce68000b6dca445166fbc5f60132007fd2012845
size 191538


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-NormalItalic_Font.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:1218b2fd1e272348793881364a83b34cd58464103844a5a91d86848fa9d25924
size 9455


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-Normal_Font.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:0b710fa5fbdcabfcedadfbb516a918fa01f0ed6dbb93bc6f5828f03fef395008
size 8882


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-Regular.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:77691182bc12af00b5ea06e4d81ff70c7a4bed5c58be727cb8b31cb455754656
size 157876


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-RegularItalic.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:d128ad81e480e1535a2fe3f89c7aa304b1730994022c1e69cfa38121188d8c41
size 189356


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-RegularItalic_Font.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:fcedc6cbb14e81b0b1d6f017e830c8b27f1db03f35722a6c0fa355dc2aa35af7
size 9370


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-Regular_Font.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:b8fa7e6ca6a15773f0c2b3a3a6cec65a368f3c05656bb62923db5a5eb5cd373a
size 8948


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-SemiBold.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:b45e9eb70fd35ecc3b1051ac503e8e41dbbab1be67c057db5c6abf0a89870055
size 139022


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-SemiBoldItalic.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:77d8797a5d6fda4c105946d782339b184b4a4fa13ecb257c1030c60ade5d2d3c
size 188166


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-SemiBoldItalic_Font.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:cf4128d4ee4e48a42666ce26e30e8880d95cbb9e491162f4b9868ec1e16a37f1
size 8959


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-SemiBold_Font.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:3b6506d5c861eeb27575386fdfc5638e17999a01eca3eed100317305533de002
size 8559


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-Thin.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:660bd26d26249b97875e1dcad98c279995bcc3ae2a2f3a95a7a1df71ae2cfe96
size 74730


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-ThinItalic.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:b814c0746547695abc1958721d673c715a4783d7413024a0d336d8810afec699
size 155030


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-ThinItalic_Font.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:f9b4e8279d87af58943e723ae7776e722c210f73da2b3dba7b1b5dfba7a56dd7
size 9096


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-Thin_Font.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:35df1772e8a52af570664cb5ffcac7ccc2e5ef61672d6fd912d9d72327dfc482
size 8159


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-Ultra.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:e2cbe30fe7f907a9275178800d1cb0520348c7664e8bf14894f4232608eaf44b
size 78320


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-UltraItalic.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:a6493fec0fd50c1525add29b3764f39ea0d2b00fd51eacfed41dd0d420c63247
size 164176


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-UltraItalic_Font.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:760804e0434aa3917132456e13d67ba2f2c98f6977ed08f1fc47535e707f26b6
size 9228


================================================
FILE: Plugins/OculusHandTools/Content/Fonts/OculusSans-Ultra_Font.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:76c5a834e42047acebba52777552f1b4d1f537addb4429e68706bfc6d56ffdbd
size 8511


================================================
FILE: Plugins/OculusHandTools/Content/HandDebug/HandDebugActor.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:44406daaad17618ee0158bcb182d52ee7b13fee81306cf30f1684c1f23efbec5
size 491492


================================================
FILE: Plugins/OculusHandTools/Content/HandDebug/HandDebugWidget.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:3aae4ad96088bd115446a24b81e1062d238947a150e564404a461ecf4f24b1ae
size 808054


================================================
FILE: Plugins/OculusHandTools/Content/HandDebug/STADIUM_Black-01.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:9cc4e46fb0b5e26007c69227011fd7b52d2ede4382c61e51a753f3c4c584f20b
size 12116


================================================
FILE: Plugins/OculusHandTools/Content/HandDebug/WidgetInvisibleMaterial.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:61ff3feacce79561a4519ee16539ee4147b974381f7b314c91606ff501728d94
size 88316


================================================
FILE: Plugins/OculusHandTools/Content/Hands/HandsCharacterBase.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:16b0f518b3dddea779a9e1b4e6263af40c710c94dba7c00aa7e7bf3098c3a055
size 259675


================================================
FILE: Plugins/OculusHandTools/Content/Hands/HandsCharacterHandState.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:30d88c023a9cec698c205b42103315fcdab02a8fedeeffaeb9bf853caa967d50
size 608331


================================================
FILE: Plugins/OculusHandTools/Content/Hands/TeleportSelector.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:339afc81c650e5b098e391cd286c9d3f18ae5119f81c9f84775a447d3c957fa8
size 36134


================================================
FILE: Plugins/OculusHandTools/Content/Hands/TutorialHand.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:d33902179993bbf5c81b590a5b0d52dc3b0e65db2ed5cf26c8d6ebfcae70d85e
size 58115


================================================
FILE: Plugins/OculusHandTools/Content/RespawnProps/FloorIdentifier.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:feb0d6df608e45ab8ccb8a769c2c5b8ed9b40f1de4610b8540abc2c8a3cea5d4
size 55755


================================================
FILE: Plugins/OculusHandTools/Content/RespawnProps/RespawnFromFloor.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:5a93c3ecc1f9d612b2454ea506a725a575ad6c6465f79c82087d0f78c75d960d
size 58532


================================================
FILE: Plugins/OculusHandTools/Content/Selectors/AimingGlow.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:2001a56ea1f231e9ef6eed6fe806f00961f3d7ef304f84ae717e6c261cf750e1
size 80386


================================================
FILE: Plugins/OculusHandTools/Content/Selectors/DefaultAimingActor.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:5fc11596db979534c1661daeaf72afaeff80663fa0da224a1ce47abad5322664
size 96075


================================================
FILE: Plugins/OculusHandTools/Content/Selectors/DefaultAimingSphere.uasset
================================================
version https://git-lfs.github.com/spec/v1
oid sha256:8efa83ee2630b4e6741bd55163b0969bbc9cfe4cc30d9c03f3207d57c62bfe52
size 90949


================================================
FILE: Plugins/OculusHandTools/OculusHandTools.uplugin
================================================
{
	"FileVersion": 3,
	"Version": 1,
	"VersionName": "1.1",
	"FriendlyName": "OculusHandTools",
	"Description": "",
	"Category": "Other",
	"CreatedBy": "",
	"CreatedByURL": "",
	"DocsURL": "",
	"MarketplaceURL": "",
	"SupportURL": "",
	"CanContainContent": true,
	"IsBetaVersion": false,
	"IsExperimentalVersion": false,
	"Installed": false,
	"SupportedTargetPlatforms": [
		"Win64",
		"Mac",
		"Android"
	],
	"Modules": [
		{
			"Name": "OculusHandPoseRecognition",
			"Type": "Runtime",
			"LoadingPhase": "Default",
			"WhitelistPlatforms": [
				"Win64",
				"Mac",
				"Android"
			]
		},
		{
			"Name": "OculusInteractable",
			"Type": "Runtime",
			"LoadingPhase": "Default",
			"WhitelistPlatforms": [
				"Win64",
				"Mac",
				"Android"
			]
		},
		{
			"Name": "HandInput",
			"Type": "Runtime",
			"LoadingPhase": "Default",
			"WhitelistPlatforms": [
				"Win64",
				"Mac",
				"Android"
			]
		},
		{
			"Name": "HandTrackingFilter",
			"Type": "Runtime",
			"LoadingPhase": "Default",
			"WhitelistPlatforms": [
				"Win64",
				"Mac",
				"Android"
			]
		},
		{
			"Name": "OculusThrowAssist",
			"Type": "Runtime",
			"LoadingPhase": "Default",
			"WhitelistPlatforms": [
				"Win64",
				"Mac",
				"Android"
			]
		}
	],
	"Plugins": [
		{
			"Name": "OculusXR",
			"Enabled": true,
			"MarketplaceURL": "com.epicgames.launcher://ue/marketplace/product/8313d8d7e7cf4e03a33e79eb757bccba",
			"SupportedTargetPlatforms": [
				"Win64",
				"Android"
			]
		},
		{
			"Name": "OculusUtils",
			"Enabled":  true
		}
	]
}


================================================
FILE: Plugins/OculusHandTools/README.md
================================================
# Meta Quest Hand Tools For UE4

## Meta Quest Hand Tracking

The Meta Quest (Oculus) is the first platform to offer native hand tracking using inside-out cameras. Its hand tracking API provides raw hand bone rotations, hand location and orientation, confidence levels, and recognition of some higher-level hand poses like pinch strength and system poses.

To help developers start with raw hand bone rotations, the Meta Quest DevTech team created the Meta Quest Hand Tools plugin for UE4. It supports many common hand tracking mechanics and utilities.

Most mechanics are implemented as blueprints in the [Content](./Content/) folder. More details follow below. Additional mechanics and utilities are available in these C++ modules:

- [HandInput module](./README_HandInput.md)
- [HandPoseRecognition module](./README_HandPoseRecognition.md)
- [OculusHandTrackingFilter module](./README_HandTrackingFilter.md)
- [OculusInteractable module](./README_Interactable.md)
- [OculusThrowAssist module](./README_ThrowAssist.md)
- [OculusUtils module](./README_OculusUtils.md)

## Mechanics Implementations

The Content folder contains utilities for hand tracking gameplay mechanics. Examples appear in the *Hand Gameplay Showcase*.

All mechanics integrate into the *HandsCharacterHandState* component. This component is created in the construction script of *HandsCharacterBase*, which sets up references to all relevant actor components.

To add these mechanics to your project, create a new blueprint class with *HandsCharacterBase* as its parent. The showcase’s *HandsCharacter* class demonstrates this.

### Throwing

The *HandsCharacterHandState* class implements throwing in the "Throwing" section of its event graph. Its *Throw with Assist* function calls the *Get Throw Vector* method of the *ThrowingComponent*. This component tracks hand position over a short time to calculate an accurate, predictable velocity for thrown objects.

### Punching

Punching is a simple, fun mechanic using hand tracking. In the "Fist / punching" section of the *HandsCharacterHandState* event graph, a collision sphere on the hand activates only when the hand forms a fist and no object is grabbed.

The *TetherBallBP* class in the Hand Gameplay Showcase provides an example of a "punchable" object.

### Teleportation

You can implement a simple teleportation system using *InteractableSelector* actors from the *OculusInteractable* module. In the "Grabbing" section of the *HandsCharacterHandState* event graph, if a grab fails, it checks for a selected teleporter and teleports the player there. Teleporter selection happens in the "Selection" section of the same graph.

To restrict selection to teleporters, use the *TeleportSelector* actor instead of the standard *InteractableSelector*.

Add this to your project's *DefaultEngine.ini*:

```ini
[/Script/Engine.CollisionProfile]
+DefaultChannelResponses=(Channel=ECC_GameTraceChannel1,DefaultResponse=ECR_Ignore,bTraceType=True,bStaticObject=False,Name="Interactable")
```

### Pushing Buttons

The *PushButtonBaseBP* class handles buttons pushed by the player’s pointer finger. The button moves with the finger and plays clicking sounds when fully pressed. Use the *OnButtonPress* event to define the button’s response.

The button’s Box component uses the *FingerTip* collision channel. The *RightFingerTip* component in *HandsCharacterBase* uses the same channel.

Add this to your project's *DefaultEngine.ini*:

```ini
[/Script/Engine.CollisionProfile]
+DefaultChannelResponses=(Channel=ECC_GameTraceChannel2,DefaultResponse=ECR_Overlap,bTraceType=False,bStaticObject=False,Name="FingerTip")
```

### Two-Handed Aiming

During *First Steps with Hands*, we found the two-handed rifle very stable and satisfying to aim. The *InteractableTwoHandedArtefact* class shows how to implement this aiming style using the grabbing system.

### Example Hands for Tutorials

<img width="256" src="./Media/tutorialhand.png" />

Use the *TutorialHand* actor to display hand poses to players. Set the pose via the [*Pose String*](./README_HandPoseRecognition.md#pose-strings) property.

<img width="256" src="./Media/tutorialhand_details.png" />

## Future Improvements

We hope this showcase inspires your hand tracking projects. The team looks forward to seeing your work and improvements. We are developing ways for you to share your projects with the Meta Quest community.


================================================
FILE: Plugins/OculusHandTools/README_HandInput.md
================================================
# Hand Input

## Grabbing (with Pose Override)

The *CameraHandInput* component handles grabbing. It uses the *IsGripping* and *IsPinching* methods to detect various grab poses.

Additional logic appears in *HandsCharacterHandState* under the "Grabbing," "Final attachment," and "Pose" sections of its event graph.

To keep the hand wrapped naturally around a grabbed object, you must override the hand pose. Provide the component with a "Bone Map" to apply poses to the hand mesh.

<img width="512" src="./Media/bonemap.png" />

An actor must inherit from the *Interactable* class to be grabbable. Set grab pose properties using hand pose strings within this class. For an example, see the *InteractableBrick* class in the Hand Gameplay Showcase.

## Finger Stabilization

The *CameraHandInput* component also stabilizes and smooths the hand skeleton. You can adjust or disable this filtering through its properties:

<img width="512" src="./Media/camerahandinput_filtering.png" />


================================================
FILE: Plugins/OculusHandTools/README_HandPoseRecognition.md
================================================
# The OculusHandPoseRecognition Module

This module includes two [USceneComponent](https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/Engine/USceneComponent?application_version=5.6) subclasses. They recognize specific hand poses—defined by relative hand bone angles—and hand gestures—defined as sequences of hand poses. It also provides a library of useful blueprint utility nodes.

## 1. Hand Pose Recognizer Component

The [UHandPoseRecognizer](./Source/OculusHandPoseRecognition/Public/HandPoseRecognizer.h) class is the core of the hand recognition system. It regularly polls the [Oculus Hands API](../../../../../Engine/Plugins/Runtime/Oculus/OculusVR/Source/OculusInput/Public/OculusXRInputFunctionLibrary.h) to record hand bone data when reliable. Wrist bone data comes from the motion controller component attached to the player's VR character.

<img width="256" src="./Media/recognizer_attachment.png" alt="Recognizer attached to controller." />

You can use multiple recognizers per hand, each with its own set of hand poses. Group poses into one recognizer when they are mutually exclusive. For example, our showcase uses one recognizer for American Sign Language numbers and another for letters. Although ASL distinguishes the letter 'O' from the number '0', our example uses static hand poses recognized by separate recognizers to detect both simultaneously.

### Pose Strings

Each recognizer defines what it can recognize as a set of bone angles. Here is the thumbs-up pose for the left hand:

    L T0-52-18+51 T1+13-8+30 T2+7-9-10 T3-10+21+8
      I1+6-72+1 I2-3-108+1 I3+1-55-3
      M1+1-77-8 M2-1-99+1 M3-6-51-8
      R1-4-85-10 R2-5-100-1 R3-4-50-1
      P0+15-6-25 P1+8-88+4 P2-8-94-7 P3-4-54+2
      W+81+0+0

The description starts with 'L' or 'R' for left or right hand. It lists hand bones in order: 'T' (Thumb), 'I' (Index), 'M' (Middle), 'R' (Ring), 'P' (Pinky), and 'W' (Wrist). All bones except the wrist include a bone index starting at 0 for thumb and pinky, and 1 for the other fingers.

Angles are three signed numbers for pitch, yaw, and roll, in degrees.

You can generate new pose strings using the logger described in [Using a Hand Pose Recognizer](#using-a-hand-pose-recognizer).

### Computing Distance (Error) to Hand Pose

Matching a hand to a reference pose starts by summing the squares of all angular differences. A lower sum means a better match. You decide what error value counts as a good match; this is covered in the next section.

Sometimes, you may want to ignore some bones. For example, in a "gun" pose, some people use only the index finger, others use both index and middle fingers. To match both with one pose, remove the middle finger bones from the reference pose.

You can also ignore specific angles (pitch, yaw, or roll) of a bone. For example, in the thumbs-up pose, you only need to know if the thumb points up or down, not its facing direction. Use +0 to ignore an angle. Use +1 or -1 to recognize angles near zero.

We have realized that for some bones are more (or less) important than others for some poses.  For that purpose, you can add between the bone identifier and the pitch/yaw/roll values a weight value.  Here's a full example that combines weights and ignores specific fingers:

    L T0*3-61+1+31 T1*3+12-8+30 T2*3+6-13-10 T3*3-10+21+8
      I1+16-22-1 I2+1-2-3 I3+3+2-2
      R1-2-77-12 R2-5-100-1 R3-4-57-1
      P0+15-6-25 P1+8-90-3 P2-5-76-8 P3-4+1+3

This left hand "gun" pose differs from the "gun shot" pose because the thumb is lifted away from the index. The thumb's weight is increased by 3. The middle finger is ignored to match both single and double-barrel poses. The wrist is ignored, so hand orientation of which way the hand is pointed does not matter.

### Error vs Confidence Level

Weights and ignoring angles or fingers affect the error range. You may also want to be more lenient with some poses.

To normalize this, each pose defines a maximum error value for 100% confidence (error at max confidence, EAMC).

For example, if you set EAMC to 2000, any error below 2000 means full confidence (1.0). An error of 4000 corresponds to 0.5 confidence, and so on.

| Error | Confidence (EAMC = 2000) |
| ----- | ------------------------ |
| 500   | 1.00                     |
| 2000  | 1.00                     |
| 3000  | 0.66                     |
| 4000  | 0.50                     |
| 6000  | 0.33                     |
| 8000  | 0.25                     |

Confidence levels simplify handling recognition results, but raw errors remain useful during development to set EAMC.

### Configuring a Hand Pose Recognizer

In the hand pose recognizer's details panel, find the *Hand Pose Recognition* section.

<img width="256" src="./Media/recognizer_config.png" alt="Recognizer configuration." />

Set the *side* value to recognize the left or right hand. Set it to none to disable the recognizer.

The recognition interval throttles recognition frequency. The default 0s runs recognition every tick.

The confidence floor sets the minimum confidence required to recognize a pose. You can set a default at the recognizer level and customize it per pose.

The damping factor controls how slowly bone updates integrate per recognition interval. By default, the latest values fully replace the current state every tick. A value of 0.2 blends 80% of the latest value with the current state.

You can configure an array of [poses](#pose-strings). There is no limit to the number of poses per recognizer.

Each pose has a name, which need not be unique. You also set the encoded pose, custom confidence floor, and error at max confidence.

### Using a Hand Pose Recognizer

The *Log Encoded Hand Pose* blueprint node outputs the current hand pose as an encoded string to the output log. The example below shows recognizers for both hands wired to input events.

<img width="256" src="./Media/log_encoded_pose.png" alt="Log hand pose." />

In this example, CTRL-L and CTRL-R keyboard events trigger logging. A typical workflow is to generate hand poses, log them, then transfer or modify the strings for use in a hand pose recognizer.

The *Get Recognized Hand Pose* node retrieves the current recognition state.

<img width="512" src="./Media/get_recognized_hand_pose.png" alt="Get recognized hand pose." />

This image from the Hand Pose Showcase shows the VRCharacter blueprint forwarding the recognizer's state to display on a projector slide.

When a pose is recognized (confidence above the floor), you get its index, name, duration held (seconds), raw error, and confidence level.

## 2. Hand Gesture Recognizer Component

The [UHandGestureRecognizer](./Source/OculusHandPoseRecognition/Public/HandGestureRecognizer.h) class handles gesture recognition.

A gesture is a sequence of hand poses. Our implementation recognizes gestures only from one hand pose recognizer, which is the common case. Attach the gesture recognizer to the pose recognizer it depends on.

<img width="256" src="./Media/gesture_recognizer.png" alt="Gesture recognizer." />

In this screenshot, *LeftFlickSwipeGestureRecognizer* attaches to *LeftFlickSwipePoseRecognizer*. This gesture moves the projector to the previous slide. Similar recognizers on the right hand move to the next slide.

### Defining a Gesture as a Sequence of Poses

In the Hand Pose Showcase, a sci-fi movie gesture changes channels by pointing the right index and middle fingers at the screen, then flicking left.

We tested other gestures but found this one easy to learn and perform. First, the static hand pose recognizer:

<img width="256" src="./Media/flick_pose.png" alt="Flick pose recognition." />

It recognizes two poses: pointing and flicking. Next, the gesture recognizer:

<img width="256" src="./Media/flick_gesture.png" alt="Flick gesture recognition." />

The recognition interval throttles gesture recognition frequency. It defaults to every game tick.

The skipped frames value adds delay control but is experimental and may be removed.

This example recognizes one gesture, "Flick," which transitions from "Point" to "Flick." Gesture names need not be unique.

*Max Transition Time* sets the maximum allowed time (seconds) between poses, including when no pose is recognized. Here, it tolerates up to 0.2 seconds between "Point" and "Flick."

You can require holding a pose before continuing. For example:

    Point/200, Flick

The user must hold "Point" for 200 milliseconds before "Flick" triggers the gesture.

The *Is Looping* flag enables recognition of looping gestures, like waving your hand.

### Using a Hand Gesture Recognizer

The gesture recognizer supports *force grab* and *force throw* gestures. Here is part of the grabbing code in VRCharacter:

<img width="512" src="./Media/force_grab_gesture.png" alt="Grab gesture recognition." />

This node returns whether a gesture was recognized. If so, you get the gesture index, name (not necessarily unique), and direction.

The gesture direction is a vector from an average location near the end of the first pose to an average location near the start of the last pose.

We also experimented with gesture duration measures. The outer duration spans from the start of the first pose to the end of the last. The inner duration spans from near the end of the first pose to near the start of the last.

The *Behavior* argument controls how the recognizer resets after recognizing a gesture. By default, only the recognized gesture resets. You can reset all gestures if needed.

<img width="512" src="./Media/gesture_state.png" alt="Gesture progress." />

The Hand Pose Showcase shows how to detect a gesture in progress. Here, the player's hand highlights when ready to flick to the previous or next slide. The "Flick" gesture is queried to check if it is in progress.

## 3. Hand Recognition Blueprint Library

<img width="512" src="./Media/wait_nodes.png" alt="Pose and gesture wait nodes." />

### Waiting for Hand Pose

UE4 supports latent blueprint nodes that pause execution until a condition is met.

The *Wait for Hand Pose* node waits for a specified UHandPoseRecognizer instance to recognize a pose. Specify *Min Pose Duration* to require the pose be held for a minimum time. If you set a non-negative *Time to Wait*, the node exits via the *Time Out* pin if no pose is recognized within that time.

When a pose is recognized, execution resumes at the *Pose Seen* pin, providing the recognized pose index and name.

### Waiting for Gesture

The *Wait for Hand Gesture* node waits for a gesture recognition. Specify how long to wait with *Time to Wait*. The *Behavior* argument matches that in the *GetRecognizedHandGesture* node.

When a gesture is recognized, execution resumes at the *Gesture Seen* pin, providing gesture index, name, direction, and durations.

If *Time to Wait* expires, the node exits via the *Time Out* pin.

You can loop back into the wait node to wait again, as shown in the screenshot.

### Recording a Pose Range

<img width="512" src="./Media/pose_range_recording.png" alt="Pose range recording." />

The *Record Hand Pose* blueprint records the range of hand bone angles. In the screenshot from *HandPoseShowcase*, you start and stop recording with a keyboard key. When stopped, the node outputs a report like this (recording the [royal wave](https://www.youtube.com/watch?v=n5pkDB7zEeo)):

    Hand Pose Range Recorded #0
      Thumb_0 pitch  11.58 [ -55.70 ..  -44.12]  yaw  13.78 [ -26.18 ..  -12.40]  roll  16.16 [ +44.29 ..  +60.45]
      Thumb_1 pitch  14.34 [ +14.35 ..  +28.70]  yaw   9.21 [  -6.92 ..   +2.29]  roll   1.96 [ +30.00 ..  +31.96]
      Thumb_2 pitch   1.39 [  -0.03 ..   +1.37]  yaw   7.99 [ -45.73 ..  -37.74]  roll   0.46 [ -10.10 ..   -9.64]
      Thumb_3 pitch   2.92 [  -7.76 ..   -4.84]  yaw  17.45 [ -12.73 ..   +4.72]  roll   0.45 [  +9.26 ..   +9.71]
      Index_1 pitch   5.86 [  +4.05 ..   +9.91]  yaw  10.05 [ -31.78 ..  -21.73]  roll   1.99 [  +0.69 ..   +2.69]
      Index_2 pitch   0.46 [  -0.03 ..   +0.43]  yaw   8.70 [ -16.26 ..   -7.55]  roll   0.02 [  -3.04 ..   -3.03]
      Index_3 pitch   0.17 [  +3.06 ..   +3.22]  yaw   5.54 [  +2.21 ..   +7.75]  roll   0.19 [  -1.82 ..   -1.63]
     Middle_1 pitch   8.14 [  -1.27 ..   +6.87]  yaw  13.01 [ -37.69 ..  -24.67]  roll   4.12 [  -4.32 ..   -0.20]
     Middle_2 pitch   0.20 [  +0.20 ..   +0.40]  yaw   8.38 [ -12.74 ..   -4.36]  roll   0.06 [  -1.39 ..   -1.33]
     Middle_3 pitch   0.70 [  +0.11 ..   +0.81]  yaw   8.97 [  +0.51 ..   +9.48]  roll   0.95 [  -4.95 ..   -4.00]
       Ring_1 pitch   5.89 [  -0.00 ..   +5.89]  yaw  18.23 [ -34.62 ..  -16.39]  roll   3.38 [  -9.76 ..   -6.39]
       Ring_2 pitch   0.83 [  -0.93 ..   -0.10]  yaw  11.61 [ -18.00 ..   -6.39]  roll   0.16 [  -4.15 ..   -3.99]
       Ring_3 pitch   0.06 [  -3.40 ..   -3.34]  yaw   6.10 [  -3.92 ..   +2.18]  roll   0.11 [  -0.60 ..   -0.50]
      Pinky_0 pitch   0.00 [ +15.32 ..  +15.32]  yaw   0.00 [  -5.57 ..   -5.57]  roll   0.00 [ -24.89 ..  -24.89]
      Pinky_1 pitch  10.01 [  -9.62 ..   +0.39]  yaw  19.92 [ -27.22 ..   -7.30]  roll   3.09 [ +10.10 ..  +13.20]
      Pinky_2 pitch   1.93 [  +2.19 ..   +4.11]  yaw  17.13 [ -25.88 ..   -8.75]  roll   1.73 [  -7.25 ..   -5.52]
      Pinky_3 pitch   0.05 [  -5.64 ..   -5.59]  yaw  11.15 [  -8.46 ..   +2.69]  roll   0.58 [  -0.06 ..   +0.53]
        Wrist pitch  32.72 [  -7.06 ..  +25.67]  yaw   0.72 [-179.60 .. +179.67]  roll  28.95 [ -90.53 ..  -61.58]
    Hand pose range total square error - full=1325.39 half=331.35 quarter=82.84


================================================
FILE: Plugins/OculusHandTools/README_HandTrackingFilter.md
================================================
# Filtered Hand Tracking

The *HandTrackingFilterComponent* improves hand-tracking in games by stabilizing hand movement when tracking quality is low or lost. Attach this component to the *MotionControllerComponent* in your Character to achieve smoother hand tracking.

For more details, see the "Hand tracking accuracy mitigation" section in [Adding Hand Tracking To First Steps](https://developers.meta.com/horizon/blog/adding-hand-tracking-to-first-steps/).


================================================
FILE: Plugins/OculusHandTools/README_Interactable.md
================================================
# The OculusInteractable Module

The *HandPoseShowcase* brings a proven hand gameplay mechanic to UE4. One of our internal Meta Quest teams created a demo for Unity called Tiny Castles. We chose their *force grab/throw* mechanic to showcase in this project. To implement this, we created our own far field selector, [AInteractableSelector](./Source/OculusInteractable/Public/InteractableSelector.h), designed to attach to the VR character's motion controller. It can also attach to the HMD or other components.

The interactable selector selects game actors subclassed from [AInteractable](./Source/OculusInteractable/Public/Interactable.h).

## Interactable Actors

AInteractable actors have two main events triggered by the selector: *BeginSelection* and *EndSelection*. The selector selects only one object at a time. This object receives notifications when selection starts and ends.

Typically, selection highlights the chosen actor.

The interactable interface also defines three user events for game-specific use. The plugin does not use these events or define their meaning. In *HandPoseShowcase*, *Interaction1*, *Interaction2*, and *Interaction3* correspond to *BeginGrab* (user starts grabbing), *EndGrab* (object reaches the user's hand), and *Drop* (user releases the object), respectively.

To be selectable, an AInteractable actor must have at least one mesh that generates overlap events with the first game trace channel. In our implementation (see [AInteractableSelector](./Source/OculusInteractable/Private/InteractableSelector.cpp)), the following is defined at the top of the file:

```cpp
ECollisionChannel InteractableTraceChannel = ECollisionChannel::ECC_GameTraceChannel1;
```

This trace channel is added in the project settings under the engine collision section, as shown below.

<img width="400" src="./Media/trace_channel.png" alt="Interactable trace channel." />

If your project uses this channel, assign `InteractableTraceChannel` to a different collision channel.

## Interactable Selector

The far field selector works out of the box but is meant to be subclassed and customized. It has many configuration parameters.

<img width="400" src="./Media/selector.png" alt="Default far field selector." />

The selector usually starts deactivated. In *HandPoseShowcase*, it activates when the user makes an open palm hand pose. The selection ray begins at the specified *Raycast Offset* relative to the selector actor and traces forward for the specified *Raycast Distance*.

Two angles control selector behavior: *Raycast Angle* and *Raycast Stickiness Angle*. The *Raycast Angle* defines the selection cone—only objects inside this cone can be selected. The *Raycast Stickiness Angle* allows the current selection to remain active even if it moves outside the stricter cone.

The selector’s visuals include an *Aiming Actor* and a particle beam effect.

If no *Aiming Actor* exists, the *Aiming Actor Class* spawns one. You can align the aiming actor with the surface hit normal and control its rotation speed using *Aiming Actor Rotation Rate*.

The *Dampening Factor* affects aiming stability. Without dampening, aiming jitters with the user's hand movements.


================================================
FILE: Plugins/OculusHandTools/README_OculusUtils.md
================================================
# The OculusUtils Module

## Continuous Overlap

The *RightFingerTip* in *HandsCharacterBase* is a *ContinuousOverlapSphereComponent*, unlike the fist spheres, which use a standard *SphereComponent*.

<img width="256" src="./Media/continuousoverlapsphere.png" />

This component prevents the fingertip from passing through buttons without triggering them. The standard *SphereComponent* only supports continuous **collision** detection (enabled with "Use CCD"), not continuous **overlap** detection.

## Tick Until

<img width="256" src="./Media/tickuntil.png" />

The *Tick Until* blueprint node runs once per tick from the *Completed* pin until it hits *Break*.


================================================
FILE: Plugins/OculusHandTools/README_ThrowAssist.md
================================================
# The OculusThrowAssist Module

This module implements the throwing system. It includes *ThrowingComponent*, an ActorComponent that tracks a hand and estimates throwing velocities.

To use *ThrowingComponent* in your Character or Hand, add one instance per hand to your Actor. Call *Initialize* with the component controlling the hand’s transform (usually a *MotionControllerComponent*). Call *Update* every Tick to track the transform. Finally, call *GetThrowVector* to estimate the velocity of an object thrown from the tracked hand.


================================================
FILE: Plugins/OculusHandTools/Source/HandInput/CameraHandInput.cpp
================================================
// Copyright (c) Meta Platforms, Inc. and affiliates.

#include "CameraHandInput.h"

#include "OculusXRInputFunctionLibrary.h"
#include "Components/PoseableMeshComponent.h"
#include "HandPose.h"
#include "IXRTrackingSystem.h"
#include "OculusXRHandComponent.h"
#include "QuatUtil.h"

#define ConvertBoneToFinger UOculusXRInputFunctionLibrary::ConvertBoneToFinger
#define GetFingerTrackingConfidence UOculusXRInputFunctionLibrary::GetFingerTrackingConfidence

namespace {
	bool IsOpenXRSystem()
	{
		const FName SystemName(TEXT("OpenXR"));
		return GEngine->XRSystem.IsValid() && (GEngine->XRSystem->GetSystemName() == SystemName);
	}
}

UCameraHandInput::UCameraHandInput(FObjectInitializer const& ObjectInitializer)
	: Super(ObjectInitializer)
{
	PrimaryComponentTick.bCanEverTick = true;
	PrimaryComponentTick.TickGroup = TG_PostPhysics;
	bIsActive = false;

	for (auto& Quat : BoneRotations)
	{
		Quat = FQuat::Identity;
	}
	for (auto& Quat : BoneVelocities)
	{
		Quat = FQuat::Identity;
	}
	for (auto& Time : BoneLastFrozenTimes)
	{
		Time = -99999;
	}
}

void UCameraHandInput::BeginPlay()
{
	Super::BeginPlay();
}

void UCameraHandInput::SetHand(EControllerHand InHand)
{
	Hand = InHand == EControllerHand::Left ? EOculusXRHandType::HandLeft : EOculusXRHandType::HandRight;
}

void UCameraHandInput::SetUpBoneMap(UPoseableMeshComponent* HandMesh, TArray<FHandBoneMapping>& BoneMap)
{
	if (HandMesh == nullptr)
		return;

	auto SkinnedAsset = HandMesh->GetSkinnedAsset();
	if (SkinnedAsset == nullptr)
		return;

	auto& RefSkeleton = SkinnedAsset->GetRefSkeleton();
	
	// set the bone ids for fast lookup
	for (auto& BoneMapping : BoneMap)
	{
		auto BoneName = BoneMapping.BoneName;
		auto const BoneIndex = RefSkeleton.FindBoneIndex(BoneName);
		BoneMapping.BoneId = BoneIndex;

		if (BoneIndex < 0)
		{
			UE_LOG(LogHandInput, Warning, TEXT("Hand Tracking: Unable to find bone named '%s' in hand skeleton."),
				*BoneMapping.BoneName.ToString());
		}
		else
		{
			BoneMapping.ReferenceTransform = RefSkeleton.GetRefBonePose()[BoneIndex];
		}
	}
}

void UCameraHandInput::SetPoseableMeshComponent(UPoseableMeshComponent* PoseableMeshComponent)
{
	HandMesh = PoseableMeshComponent;
	UpdateMeshVisibility();

	if (ensureMsgf(HandMesh, TEXT("SetPoseableMeshComponent failed")) && ensureMsgf(HandMesh->GetSkinnedAsset(),
		TEXT("SetPoseableMeshComponent failed")))
	{
		SetUpBoneMap(HandMesh, BoneMap);
		GripBoneId = HandMesh->GetSkinnedAsset()->GetRefSkeleton().FindBoneIndex(GripBoneName);
		OnInitializeMesh.Broadcast(this);
	}
}

void UCameraHandInput::SetupInput(UInputComponent* Input)
{
	if (Hand == EOculusXRHandType::HandLeft)
	{
		Input->BindAxisKey("OculusHand_Left_IndexPinchStrength", this, &UCameraHandInput::IndexFingerPinchUpdate);
		Input->BindAxisKey("OculusHand_Left_MiddlePinchStrength", this, &UCameraHandInput::MiddleFingerPinchUpdate);
		Input->BindAxisKey("OculusHand_Left_RingPinchStrength", this, &UCameraHandInput::RingFingerPinchUpdate);
		Input->BindAxisKey("OculusHand_Left_PinkPinchStrength", this, &UCameraHandInput::PinkyFingerPinchUpdate);
	}
	else
	{
		Input->BindAxisKey("OculusHand_Right_IndexPinchStrength", this, &UCameraHandInput::IndexFingerPinchUpdate);
		Input->BindAxisKey("OculusHand_Right_MiddlePinchStrength", this, &UCameraHandInput::MiddleFingerPinchUpdate);
		Input->BindAxisKey("OculusHand_Right_RingPinchStrength", this, &UCameraHandInput::RingFingerPinchUpdate);
		Input->BindAxisKey("OculusHand_Right_PinkPinchStrength", this, &UCameraHandInput::PinkyFingerPinchUpdate);
	}

	bInputIsInitialized = true;
}

bool UCameraHandInput::IsActive()
{
	return UOculusXRInputFunctionLibrary::IsHandTrackingEnabled();
}

void UCameraHandInput::TickComponent(float DeltaTime, ELevelTick TickType,
	FActorComponentTickFunction* ThisTickFunction)
{
	Super::TickComponent(DeltaTime, TickType, ThisTickFunction);

	// there must be a better way to do this that isn't polling
	if (!bInputIsInitialized)
	{
		if (auto const InputComponent = GetOwner()->InputComponent)
		{
			SetupInput(InputComponent);
		}
	}

	auto const bIsActiveThisFrame = IsActive();
	if (bIsActive != bIsActiveThisFrame)
	{
		bIsActive = bIsActiveThisFrame;
		UpdateMeshVisibility();
	}

	if (!bIsActiveThisFrame)
	{
		return;
	}

	UpdateTracking();
	UpdateSkeleton();
	if (bAlwaysUpdateGrab || IsTracked())
	{
		UpdateGrabInput();
	}
	UpdatePointingInput();

	if (HandMesh)
	{
		for (auto&& BoneMapping : BoneMap)
		{
			BoneCache[BoneMapping.MappedBone] = HandMesh->GetSocketTransform(BoneMapping.BoneName);
		}
	}

	/*
	float Size = GetGrippingAxis() * 20.0f;
	FColor Color = IsPinching() ? FColor::Green : FColor::Red;
	DrawDebugSphere(GetWorld(), HandComponent->GetComponentLocation(), Size, 32, Color);
	*/

	// GEngine->AddOnScreenDebugMessage(-1, 0, FColor::Yellow, FString::Printf(TEXT("%i %f"), bInputIsInitialized ? 1 : 0, GetHighestPinchValue()));
}

void UCameraHandInput::UpdateTracking()
{
	auto const IsTrackedThisFrame = IsTracked();
	if (IsTrackedThisFrame && !WasTrackedLastFrame)
	{
		TimeWhenTrackingLastGained = GetWorld()->GetTimeSeconds();
	}

	WasTrackedLastFrame = IsTrackedThisFrame;
}

bool UCameraHandInput::IsTracked() const
{
	return UOculusXRInputFunctionLibrary::GetTrackingConfidence(Hand) == EOculusXRTrackingConfidence::High;
}

void UCameraHandInput::FilterBoneRotation(EOculusXRBone Bone, FQuat LastRotation, FQuat& Rotation)
{
	auto const Now = GetWorld()->GetTimeSeconds();
	auto& LastFrozenTime = BoneLastFrozenTimes[Bone];

	auto& LastVelocity = BoneVelocities[Bone];
	auto const Finger = ConvertBoneToFinger(Bone);

	auto const ActualAngularDistance = LastRotation.AngularDistance(Rotation);
	if (MaxBoneSmoothingAngularDistance > ActualAngularDistance)
	{
		auto const Alpha = FMath::Max(FMath::GetRangePct(MinBoneAngularDistance, MaxBoneSmoothingAngularDistance,
			ActualAngularDistance), 0.0f);
		Rotation = FQuat::Slerp(LastRotation, Rotation, Alpha);
		LastFrozenTime = Now;
	}
	else
	{
		auto const Alpha = FMath::Clamp((Now - LastFrozenTime) / BoneUnfreezeTime, 0.0f, 1.0f);
		Rotation = FQuat::Slerp(LastRotation, Rotation, Alpha);
	}

	if (bAlwaysClampBoneSpeed || GetFingerTrackingConfidence(Hand, Finger) != EOculusXRTrackingConfidence::High)
	{
		auto const DeltaSeconds = GetWorld()->GetDeltaSeconds();
		auto const AngularDistance = LastRotation.AngularDistance(Rotation);
		auto const MaxAngularDistance = MaxBoneAngularSpeed * DeltaSeconds;
		if (MaxAngularDistance < AngularDistance)
		{
			Rotation = Scale(LastVelocity, DeltaSeconds) * LastRotation;
			LastVelocity = Scale(LastVelocity, BoneVelocityDamping);
		}
		else
		{
			LastVelocity = Scale(Rotation * LastRotation.Inverse(), 1.0f / DeltaSeconds);
		}
	}
}

void UCameraHandInput::SetBoneRotation(UPoseableMeshComponent* HandMesh, FHandBoneMapping BoneMapping,
	FQuat BoneRotation, bool IsLeft)
{
	if (BoneMapping.BoneId == -1 || HandMesh == nullptr || HandMesh->BoneSpaceTransforms.Num() <= BoneMapping.BoneId)
	{
		return;
	}
	if (IsOpenXRSystem() && BoneMapping.BoneId == 0)
	{
		BoneMapping.RotationOffset = IsLeft ? LeftHandRootFixupRotationOpenXR : RightHandRootFixupRotationOpenXR;
	}
	
	BoneRotation = BoneMapping.RotationOffset * BoneRotation;
	BoneRotation.Normalize();
	HandMesh->BoneSpaceTransforms[BoneMapping.BoneId] = FTransform(
		BoneRotation,
		BoneMapping.ReferenceTransform.GetTranslation(),
		BoneMapping.ReferenceTransform.GetScale3D());

	if (BoneMapping.MappedBone == EOculusXRBone::Wrist_Root)
	{
		HandMesh->BoneSpaceTransforms[BoneMapping.BoneId].SetLocation(FVector::ZeroVector);
	}
}

void UCameraHandInput::UpdateSkeleton()
{
	if (!HandMesh)
	{
		return;
	}

	auto const bHasCustomGestureThisFrame = bHasCustomGesture;
	if (bHasCustomGesture)
	{
		// custom gestures have to be applied every frame, so reset the flag here
		bHasCustomGesture = false;
		bHadCustomGestureLastFrame = true;
	}
	else if (bHadCustomGestureLastFrame)
	{
		// reset the grip bone
		auto&& Pose = HandMesh->GetSkinnedAsset()->GetRefSkeleton().GetRefBonePose();
		if (ensureMsgf(Pose.IsValidIndex(GripBoneId), TEXT("GripBoneId is %i"), GripBoneId))
		{
			HandMesh->BoneSpaceTransforms[GripBoneId] = Pose[GripBoneId];
		}
		bHadCustomGestureLastFrame = false;
	}

	if (bHasCustomGestureThisFrame && DigitsMaskedFromCustomGesture == 0)
	{
		// get the bone rotations anyway, since we need them for gesture detection (eg. dropping)
		for (auto Index = 0; Index != static_cast<int>(EOculusXRBone::Bone_Max); Index += 1)
		{
			auto const Bone = static_cast<EOculusXRBone>(Index);
			auto const Rotation = UOculusXRInputFunctionLibrary::GetBoneRotation(Hand, Bone);
			RawLocalSpaceRotations[Bone] = Rotation;
		}

		return;
	}

	// Update finger rotations
	for (auto Index = 0; Index != static_cast<int>(EOculusXRBone::Bone_Max); Index += 1)
	{
		auto const Bone = static_cast<EOculusXRBone>(Index);
		auto& LastRotation = BoneRotations[Bone];
		auto Rotation = UOculusXRInputFunctionLibrary::GetBoneRotation(Hand, Bone);
		RawLocalSpaceRotations[Bone] = Rotation;
		if (bBoneRotationFilteringEnabled)
		{
			FilterBoneRotation(Bone, LastRotation, Rotation);
		}
		LastRotation = Rotation;
	}

	for (auto BoneMapping : BoneMap)
	{
		if (BoneMapping.BoneId >= 0)
		{
			// skip updating if we're in a custom gesture and the bone's digit isn't masked out
			if (bHasCustomGestureThisFrame)
			{
				if (BoneMapping.Digit == EHandDigit::None)
				{
					continue;
				}
				if ((static_cast<uint8>(BoneMapping.Digit) & DigitsMaskedFromCustomGesture) != static_cast<uint8>(BoneMapping.Digit))
				{
					continue;
				}
			}

			auto const BoneRotation = BoneRotations[BoneMapping.MappedBone];
			
			SetBoneRotation(HandMesh, BoneMapping, BoneRotation, GetHand() == EOculusXRHandType::HandLeft);
		}
	}

	HandMesh->MarkRefreshTransformDirty();

	if (bDynamicScalingEnabled)
	{
		auto const Scale = UOculusXRInputFunctionLibrary::GetHandScale(Hand);
		HandMesh->SetRelativeScale3D(FVector(Scale));
	}
}

void UCameraHandInput::UpdateGrabInput()
{
	// Hand pose grab input
	auto const GrabAxisValue = GetGrippingAxis();
	if (bIsInGrabPose)
	{
		if (GrabAxisValue < ReleaseThresholdForGrip)
		{
			bIsInGrabPose = false;
		}
	}
	else if (GrabAxisValue > GrabThresholdForGrip)
	{
		bIsInGrabPose = true;
	}

	// pinch axis input
	auto const HighestPinchValueThisFrame = GetHighestPinchValue();

	if (bIsPinching)
	{
		if (HighestPinchValueLastFrame > ReleaseThreshold && HighestPinchValueThisFrame <= ReleaseThreshold)
		{
			bIsPinching = false;
		}
	}
	else
	{
		if (HighestPinchValueLastFrame < GrabThreshold && HighestPinchValueThisFrame >= GrabThreshold)
		{
			bIsPinching = true;
		}
	}

	HighestPinchValueLastFrame = HighestPinchValueThisFrame;
}

void UCameraHandInput::UpdatePointingInput()
{
	bIsPointing = GetPointingAxis() > 0.5f;
}

void UCameraHandInput::IndexFingerPinchUpdate(float Value) { FingerPinchUpdate(0, Value); }
void UCameraHandInput::MiddleFingerPinchUpdate(float Value) { FingerPinchUpdate(1, Value); }
void UCameraHandInput::RingFingerPinchUpdate(float Value) { FingerPinchUpdate(2, Value); }
void UCameraHandInput::PinkyFingerPinchUpdate(float Value) { FingerPinchUpdate(3, Value); }

void UCameraHandInput::FingerPinchUpdate(int FingerIndex, float Value)
{
	// don't update if the hand, finger, or thumb have low confidence tracking
	if (!IsTracked())
	{
		return;
	}

	if (GetFingerTrackingConfidence(Hand, EOculusXRFinger::Thumb) ==
		EOculusXRTrackingConfidence::Low)
	{
		return;
	}

	auto const OculusFinger = static_cast<EOculusXRFinger>(FingerIndex + 1);
	if (GetFingerTrackingConfidence(Hand, OculusFinger) == EOculusXRTrackingConfidence::Low)
	{
		return;
	}

	FingerPinchValues[FingerIndex] = Value;
}

float UCameraHandInput::GetHighestPinchValue()
{
	// only look at the index and middle fingers
	return FMath::Max(FingerPinchValues[0], FingerPinchValues[1]);
}

FTransform UCameraHandInput::GetGripBoneTransform(EBoneSpaces::Type BoneSpace)
{
	auto const TransformSpace = BoneSpace == EBoneSpaces::ComponentSpace ?
		RTS_Component :
		RTS_World;

	if (HandMesh)
	{
		return HandMesh->GetSocketTransform(GripBoneName, TransformSpace);
	}
	return FTransform::Identity;
}

EOculusXRHandType UCameraHandInput::GetHand() const
{
	return Hand;
}

UPoseableMeshComponent* UCameraHandInput::GetMesh() const
{
	return HandMesh;
}

FName UCameraHandInput::GetGripBoneName() const
{
	return GripBoneName;
}

void UCameraHandInput::ForceMeshHidden(bool Hidden)
{
	if (Hidden != bForceMeshHidden)
	{
		bForceMeshHidden = Hidden;
		UpdateMeshVisibility();
	}
}

void UCameraHandInput::UpdateMeshVisibility() const
{
	auto const bVisible = bIsActive && !bForceMeshHidden;
	if (HandMesh)
	{
		HandMesh->SetHiddenInGame(!bVisible);
	}
}

// these are all a mess and we really need a generic (data-driven) system to handle this
float UCameraHandInput::GetPointingAxis()
{
	auto const SummedJoints =
		RawLocalSpaceRotations[EOculusXRBone::Index_1].GetNormalized().GetAngle() +
		RawLocalSpaceRotations[EOculusXRBone::Index_2].GetNormalized().GetAngle() +
		RawLocalSpaceRotations[EOculusXRBone::Index_3].GetNormalized().GetAngle();

	return FMath::GetMappedRangeValueClamped(PointingAxisJointRotationRange, FVector2D(0.f, 1.f), SummedJoints);
}

float UCameraHandInput::GetGrippingAxis()
{
	auto const SummedJoints =
		RawLocalSpaceRotations[EOculusXRBone::Middle_1].GetNormalized().GetAngle() +
		RawLocalSpaceRotations[EOculusXRBone::Middle_2].GetNormalized().GetAngle() +
		RawLocalSpaceRotations[EOculusXRBone::Middle_3].GetNormalized().GetAngle() +
		RawLocalSpaceRotations[EOculusXRBone::Ring_1].GetNormalized().GetAngle() +
		RawLocalSpaceRotations[EOculusXRBone::Ring_2].GetNormalized().GetAngle() +
		RawLocalSpaceRotations[EOculusXRBone::Ring_3].GetNormalized().GetAngle() +
		RawLocalSpaceRotations[EOculusXRBone::Pinky_1].GetNormalized().GetAngle() +
		RawLocalSpaceRotations[EOculusXRBone::Pinky_2].GetNormalized().GetAngle() +
		RawLocalSpaceRotations[EOculusXRBone::Pinky_3].GetNormalized().GetAngle();

	return FMath::GetMappedRangeValueClamped(GrippingAxisJointRotationRange, FVector2D(0.f, 1.f), SummedJoints);
}

float UCameraHandInput::GetThumbUpAxis()
{
	auto const SummedJoints =
		RawLocalSpaceRotations[EOculusXRBone::Thumb_0].GetNormalized().GetAngle() +
		RawLocalSpaceRotations[EOculusXRBone::Thumb_1].GetNormalized().GetAngle() +
		RawLocalSpaceRotations[EOculusXRBone::Thumb_2].GetNormalized().GetAngle() +
		RawLocalSpaceRotations[EOculusXRBone::Thumb_3].GetNormalized().GetAngle();

	return FMath::GetMappedRangeValueClamped(ThumbUpAxisJointRotationRange, FVector2D(0.f, 1.f), SummedJoints);
}

bool UCameraHandInput::ApplyPoseToMesh(
	FString PoseString, UPoseableMeshComponent* HandMesh,
	TArray<FHandBoneMapping> const& BoneMappings, bool IsLeft)
{
	auto BoneToRecognizedBone = [](EOculusXRBone Bone)
	{
		switch (Bone)
		{
		case EOculusXRBone::Wrist_Root: return Wrist;
		case EOculusXRBone::Thumb_0: return Thumb_0;
		case EOculusXRBone::Thumb_1: return Thumb_1;
		case EOculusXRBone::Thumb_2: return Thumb_2;
		case EOculusXRBone::Thumb_3: return Thumb_3;
		case EOculusXRBone::Index_1: return Index_1;
		case EOculusXRBone::Index_2: return Index_2;
		case EOculusXRBone::Index_3: return Index_3;
		case EOculusXRBone::Middle_1: return Middle_1;
		case EOculusXRBone::Middle_2: return Middle_2;
		case EOculusXRBone::Middle_3: return Middle_3;
		case EOculusXRBone::Ring_1: return Ring_1;
		case EOculusXRBone::Ring_2: return Ring_2;
		case EOculusXRBone::Ring_3: return Ring_3;
		case EOculusXRBone::Pinky_0: return Pinky_0;
		case EOculusXRBone::Pinky_1: return Pinky_1;
		case EOculusXRBone::Pinky_2: return Pinky_2;
		case EOculusXRBone::Pinky_3: return Pinky_3;
		default: return static_cast<ERecognizedBone>(-1);
		}
	};

	FHandPose Pose;
	Pose.CustomEncodedPose = PoseString;
	if (HandMesh == nullptr || Pose.Decode() == false)
	{
		return false;
	}

	for (auto Mapping : BoneMappings)
	{
		auto const Bone = BoneToRecognizedBone(Mapping.MappedBone);
		if (Bone != static_cast<ERecognizedBone>(-1))
		{
			auto Rotator = Bone == Wrist ? FRotator::ZeroRotator : Pose.GetRotator(Bone);
			SetBoneRotation(HandMesh, Mapping, Rotator.Quaternion(), IsLeft);
		}
	}

	HandMesh->RefreshBoneTransforms();
	return true;
}

bool UCameraHandInput::SetPose(FString PoseString)
{
	if (ApplyPoseToMesh(PoseString, HandMesh, BoneMap, GetHand() == EOculusXRHandType::HandLeft))
	{
		bHasCustomGesture = true;
		return true;
	}

	return false;
}

#undef ConvertBoneToFinger
#undef GetFingerTrackingConfidence

#ifdef EOculusXRFinger
#undef EOculusXRFinger
#endif


================================================
FILE: Plugins/OculusHandTools/Source/HandInput/CameraHandInput.h
================================================
// Copyright (c) Meta Platforms, Inc. and affiliates.

#pragma once

#include "HandInput.h"

#include "OculusXRInputFunctionLibrary.h"
#include "EnumMap.h"

#include "CameraHandInput.generated.h"

class UTransformBufferComponent;

namespace OculusInput
{
	enum class EOculusXRHandButton;
}

class UPoseableMeshComponent;
class UThrowingComponent;
class UHandComponentBase;

UENUM(BlueprintType, meta = (Bitflags, UseEnumValuesAsMaskValuesInEditor = "true"))
enum class EHandDigit : uint8
{
	None = 0,
	Thumb = 1 << 0,
	Index = 1 << 1,
	Middle = 1 << 2,
	Ring = 1 << 3,
	Pinky = 1 << 4,

	Count = 6
};

USTRUCT(BlueprintType)
struct HANDINPUT_API FHandBoneMapping
{
	GENERATED_BODY()

	UPROPERTY(BlueprintReadOnly, EditAnywhere)
	FName BoneName;

	UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Transient)
	int BoneId{};

	UPROPERTY(BlueprintReadOnly, EditAnywhere)
	EOculusXRBone MappedBone{};

	UPROPERTY(BlueprintReadOnly, EditAnywhere)
	FQuat RotationOffset = FQuat::Identity;

	UPROPERTY(BlueprintReadOnly, EditAnywhere)
	EHandDigit Digit{};

	UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Transient)
	FTransform ReferenceTransform;
};

UCLASS(meta = (BlueprintSpawnableComponent))
class HANDINPUT_API UCameraHandInput : public UActorComponent, public IHandInput
{
	GENERATED_BODY()

public:
	UCameraHandInput(FObjectInitializer const& ObjectInitializer);

	virtual void BeginPlay() override;

	UFUNCTION(BlueprintCallable)
	void SetPoseableMeshComponent(UPoseableMeshComponent* PoseableMeshComponent);
	void SetupInput(UInputComponent* Input);
	void ForceMeshHidden(bool Hidden);

	UFUNCTION(BlueprintCallable)
	static bool ApplyPoseToMesh(
		FString PoseString, UPoseableMeshComponent* HandMesh,
		TArray<FHandBoneMapping> const& BoneMappings, bool IsLeft);

	UFUNCTION(BlueprintCallable)
	static void SetUpBoneMap(UPoseableMeshComponent* HandMesh, UPARAM(ref) TArray<FHandBoneMapping>& BoneMap);

	// IHandInput
	UFUNCTION(BlueprintCallable)
	virtual void SetHand(EControllerHand InHand) override;
	virtual bool IsActive() override;
	virtual FTransform GetGripBoneTransform(EBoneSpaces::Type BoneSpace) override;
	virtual bool IsPointing() override { return bIsPointing; }
	virtual EHandTrackingMode GetTrackingMode() override { return EHandTrackingMode::Camera; }
	// ~IHandInput

	UFUNCTION(BlueprintPure)
	EOculusXRHandType GetHand() const;

	UFUNCTION(BlueprintPure)
	UPoseableMeshComponent* GetMesh() const;

	UFUNCTION(BlueprintPure)
	FName GetGripBoneName() const;

	UPROPERTY(EditAnywhere, Category = "Hand Input")
	FName GripBoneName;

	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Hand Input")
	bool bDynamicScalingEnabled = true;

	UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = "Hand Input")
	float GrabThreshold = 0.8f;

	UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = "Hand Input")
	float ReleaseThreshold = 0.3f;

	UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = "Hand Input")
	float GrabThresholdForGrip = 0.6f;

	UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = "Hand Input")
	float ReleaseThresholdForGrip = 0.3f;

	UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = "Hand Input")
	float ThrowGestureReleaseFactor = 1.0f;

	// How long to delay before releasing the grip when a previously gripped hand loses tracking and is
	// regained in a non-gripped pose
	UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = "Hand Input")
	float GripReleaseDelayOnTrackingResumed = .5f;

	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Hand Input")
	bool bDropDelayEnabled = true;

	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Hand Input")
	TArray<FHandBoneMapping> BoneMap;

	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Hand Input")
	bool bAlwaysUpdateGrab = false;

	UPROPERTY(BlueprintReadWrite, Category = "Hand Input", Transient)
	UPoseableMeshComponent* HandMesh = nullptr;

	// grip release delay with good tracking
	UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = "Hand Input")
	float GlobalDropDelay = 0.05f;

	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Hand Input")
	bool bGlobalDropDelayEnabled = true;

	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Hand Input")
	float GlobalDropDelayReductionFactorWhenThrowing = 2.f;

	/// minimum distance for a bone to not be frozen
	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Bone Jitter Mitigation")
	float MinBoneAngularDistance = 0.01f;

	/// maximum distance for a bone to be smoothed
	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Bone Jitter Mitigation")
	float MaxBoneSmoothingAngularDistance = 0.25f;

	/// amount of time to smooth back from frozen to unfrozen
	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Bone Jitter Mitigation")
	float BoneUnfreezeTime = 0.1f;

	/// max speed for a bone to extrapolate
	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Bone Data Filter")
	float MaxBoneAngularSpeed = 0.5f;

	/// when enabled, bone speed will be clamped even if data is high quality
	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Bone Data Filter")
	bool bAlwaysClampBoneSpeed = false;

	/// per-frame damping of extrapolated bone speed
	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Bone Data Filter")
	float BoneVelocityDamping = 0.95f;

	/// when enabled, bone filtering will be active
	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Bone Data Filter")
	bool bBoneRotationFilteringEnabled = true;

	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Hand Input")
	FVector2D PointingAxisJointRotationRange = FVector2D(14.f, 18.f);

	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Hand Input")
	FVector2D GrippingAxisJointRotationRange = FVector2D(55.f, 44.f);

	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Hand Input")
	FVector2D ThumbUpAxisJointRotationRange = FVector2D(21.8f, 22.7f);

	DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnInitializeMesh, UCameraHandInput *, CameraHandInput);

	UPROPERTY(BlueprintAssignable, Category = "Hand Input")
	FOnInitializeMesh OnInitializeMesh;

	UFUNCTION(BlueprintPure)
	bool IsPinching() const { return bIsPinching; }

	UFUNCTION(BlueprintPure)
	bool IsInGrabPose() const { return bIsInGrabPose; }

	UFUNCTION(BlueprintPure)
	FTransform GetBoneTransformWorld(EOculusXRBone Bone) { return BoneCache[Bone]; }

	UFUNCTION(BlueprintPure)
	bool IsTracked() const;

	UFUNCTION(BlueprintPure)
	float GetPointingAxis();

	UFUNCTION(BlueprintPure)
	float GetGrippingAxis();

	UFUNCTION(BlueprintPure)
	float GetThumbUpAxis();

	UFUNCTION(BlueprintCallable)
	bool SetPose(FString PoseString);

protected:
	virtual void TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;

private:
	EOculusXRHandType Hand = EOculusXRHandType::None;
	bool bIsActive = false;

	void UpdateTracking();
	bool WasTrackedLastFrame = false;
	float TimeWhenTrackingLastGained = -1;

	void FilterBoneRotation(EOculusXRBone Bone, FQuat LastRotation, FQuat& Rotation);
	static void SetBoneRotation(UPoseableMeshComponent* HandMesh, FHandBoneMapping BoneMapping, FQuat BoneRotation, bool IsLeft);
	void UpdateSkeleton();

	bool bInputIsInitialized = false;
	void UpdateGrabInput();
	float GetHighestPinchValue();
	void IndexFingerPinchUpdate(float Value);
	void MiddleFingerPinchUpdate(float Value);
	void RingFingerPinchUpdate(float Value);
	void PinkyFingerPinchUpdate(float Value);
	void FingerPinchUpdate(int FingerIndex, float Value);
	float FingerPinchValues[4] = {0};
	bool bIsPinching = false;
	float HighestPinchValueLastFrame = 0;
	bool bIsInGrabPose = false;

	void UpdatePointingInput();
	bool bIsPointing = false;

	int GripBoneId = -1;

	bool bHasCustomGesture = false;
	bool bHadCustomGestureLastFrame = false;
	uint8 DigitsMaskedFromCustomGesture = 0;

	bool bForceMeshHidden = false;
	void UpdateMeshVisibility() const;

	// cache bone transforms from hand tracking for use by gameplay code
	TEnumMap<EOculusXRBone, FTransform> BoneCache;
	TEnumMap<EOculusXRBone, FQuat> RawLocalSpaceRotations;

	// cache bone rotations from hand tracking for smoothing
	TEnumMap<EOculusXRBone, FQuat> BoneRotations;
	TEnumMap<EOculusXRBone, FQuat> BoneVelocities;
	TEnumMap<EOculusXRBone, float> BoneLastFrozenTimes;
};


================================================
FILE: Plugins/OculusHandTools/Source/HandInput/EnumMap.h
================================================
// Copyright (c) Meta Platforms, Inc. and affiliates.

#pragma once

#include "Containers/StaticArray.h"

template <typename EEnum, typename InElementType, int ExtraElements = 0>
class TEnumMap : public TStaticArray<InElementType, ExtraElements + static_cast<int>(EEnum::Invalid)>
{
	using Super = TStaticArray<InElementType, ExtraElements + static_cast<int>(EEnum::Invalid)>;

public:
	InElementType& operator[](EEnum Index)
	{
		return (*static_cast<Super*>(this))[static_cast<uint32>(Index)];
	}

	InElementType const& operator[](EEnum Index) const
	{
		return (*static_cast<Super const*>(this))[static_cast<uint32>(Index)];
	}
};


================================================
FILE: Plugins/OculusHandTools/Source/HandInput/HandInput.Build.cs
================================================
// Copyright (c) Meta Platforms, Inc. and affiliates.

using UnrealBuildTool;

public class HandInput : ModuleRules
{
	public HandInput(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
		//CppStandard = CppStandardVersion.Latest;

		PublicDependencyModuleNames.AddRange(
			new string[] {
				"Core",
				"CoreUObject",
				"Engine",
				"InputCore",
				"OculusXRInput",
				"HeadMountedDisplay"
			}
		);

		PrivateDependencyModuleNames.AddRange(
			new string[] {
				"OculusHandPoseRecognition",
				"OculusUtils"
			}
		);

		PublicIncludePaths.AddRange(new string[] {
			// TODO(els): Relative to UE4\Source... not sure why this fixes the build since we do depend on Core.
			// "Runtime/Core/Public/Containers",
			// "Runtime/CoreUObject/Public/UObject",
		});

		PrivateIncludePaths.AddRange(new string[] {
		});

		IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_6;
	}
}


================================================
FILE: Plugins/OculusHandTools/Source/HandInput/HandInput.cpp
================================================
// Copyright (c) Meta Platforms, Inc. and affiliates.

#include "HandInput.h"


================================================
FILE: Plugins/OculusHandTools/Source/HandInput/HandInput.h
================================================
// Copyright (c) Meta Platforms, Inc. and affiliates.

#pragma once

#include "HandInput.generated.h"

UENUM(BlueprintType)
enum class EHandTrackingMode : uint8
{
	Controller,
	Camera,
	Unknown
};

UINTERFACE()
class HANDINPUT_API UHandInput : public UInterface
{
	GENERATED_BODY()
};

class HANDINPUT_API IHandInput
{
	GENERATED_BODY()
	
public:
	virtual void SetHand(EControllerHand Hand) = 0;
	virtual bool IsActive() = 0;
	virtual FTransform GetGripBoneTransform(EBoneSpaces::Type BoneSpace) = 0;
	virtual bool IsPointing() = 0;
	virtual EHandTrackingMode GetTrackingMode() = 0;
};

DECLARE_LOG_CATEGORY_EXTERN(LogHandInput, Log, All);


================================================
FILE: Plugins/OculusHandTools/Source/HandInput/HandInputModule.cpp
================================================
// Copyright (c) Meta Platforms, Inc. and affiliates.

#include "HandInputModule.h"
#include "HandInput.h"

#define LOCTEXT_NAMESPACE "FHandInputModule"

#include "OculusDeveloperTelemetry.h"

OCULUS_TELEMETRY_LOAD_MODULE("Unreal-HandInput");

bool FHandInputModule::IsGameModule() const
{
	return true;
}

#undef LOCTEXT_NAMESPACE

IMPLEMENT_MODULE(FHandInputModule, HandInput);

DEFINE_LOG_CATEGORY(LogHandInput);


================================================
FILE: Plugins/OculusHandTools/Source/HandInput/HandInputModule.h
================================================
// Copyright (c) Meta Platforms, Inc. and affiliates.

#pragma once

#include "Modules/ModuleInterface.h"

class HANDINPUT_API FHandInputModule : public IModuleInterface
{
public:
	virtual bool IsGameModule() const override;
};


================================================
FILE: Plugins/OculusHandTools/Source/HandInput/QuatUtil.h
================================================
// Copyright (c) Meta Platforms, Inc. and affiliates.

#pragma once

#include "Math/Quat.h"

static FORCEINLINE FQuat Scale(FQuat Rotation, float S)
{
	return FQuat::Slerp(FQuat::Identity, Rotation, S);
}


================================================
FILE: Plugins/OculusHandTools/Source/HandTrackingFilter/HandTrackingFilter.Build.cs
================================================
// Copyright (c) Meta Platforms, Inc. and affiliates.

using UnrealBuildTool;

public class HandTrackingFilter : ModuleRules
{
	public HandTrackingFilter(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
		//CppStandard = CppStandardVersion.Latest;

		PublicDependencyModuleNames.AddRange(
			new string[] {
				"Core",
				"CoreUObject",
				"Engine",
				"InputCore",
				"OculusXRInput",
				"HeadMountedDisplay"
			}
		);

		PrivateDependencyModuleNames.AddRange(
			new string[] {
				"OculusUtils",
				"XRBase",
			}
		);

		PublicIncludePaths.AddRange(new string[] {
			// TODO(els): Relative to UE4\Source... not sure why this fixes the build since we do depend on Core.
			// "Runtime/Core/Public/Containers",
			// "Runtime/CoreUObject/Public/UObject",
		});

		PrivateIncludePaths.AddRange(new string[] {
		});

		IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_6;
	}
}


================================================
FILE: Plugins/OculusHandTools/Source/HandTrackingFilter/HandTrackingFilter.cpp
================================================
// Copyright (c) Meta Platforms, Inc. and affiliates.

#include "HandTrackingFilter.h"

#define LOCTEXT_NAMESPACE "FHandTrackingFilterModule"

#include "OculusDeveloperTelemetry.h"

OCULUS_TELEMETRY_LOAD_MODULE("Unreal-HandTrackingFilter");

bool FHandTrackingFilterModule::IsGameModule() const
{
	return true;
}

#undef LOCTEXT_NAMESPACE

IMPLEMENT_MODULE(FHandTrackingFilterModule, HandTrackingFilter);


================================================
FILE: Plugins/OculusHandTools/Source/HandTrackingFilter/HandTrackingFilter.h
================================================
// Copyright (c) Meta Platforms, Inc. and affiliates.

#pragma once

#include "Modules/ModuleInterface.h"

class HANDTRACKINGFILTER_API FHandTrackingFilterModule : public IModuleInterface
{
public:
	virtual bool IsGameModule() const override;
};


================================================
FILE: Plugins/OculusHandTools/Source/HandTrackingFilter/HandTrackingFilterComponent.cpp
================================================
// Copyright (c) Meta Platforms, Inc. and affiliates.

#include "HandTrackingFilterComponent.h"

#include "MotionControllerComponent.h"
#include "OculusXRInputFunctionLibrary.h"
#include "Camera/CameraComponent.h"
#include "QuatUtil.h"
#include "XRMotionControllerBase.h"

DECLARE_LOG_CATEGORY_EXTERN(LogHandTrackingFilter, Log, All);

DEFINE_LOG_CATEGORY(LogHandTrackingFilter);

// use real time because this can get hit multiple times per frame
#define NOW FPlatformTime::Seconds()

UHandTrackingFilterComponent::UHandTrackingFilterComponent()
{
	bAutoActivate = true;
}

void UHandTrackingFilterComponent::BeginPlay()
{
	Super::BeginPlay();

	LastFrameData = FHandTrackingFilterData{NOW, GetComponentTransform()};

	if (auto Controller = Cast<UMotionControllerComponent>(GetAttachParent()))
	{
		UOculusXRInputFunctionLibrary::HandMovementFilter.AddWeakLambda(this,
			[this, ThisHand = Controller->GetTrackingSource()]
		(
			EControllerHand Hand,
			FVector* Location,
			FRotator* Orientation,
			bool* Success
		)
			{
				if (Hand == ThisHand && UOculusXRInputFunctionLibrary::IsHandTrackingEnabled())
				{
					if (IsInGameThread() && PreFilterComponent)
					{
						PreFilterComponent->SetActive(*Success);
						if (*Success)
						{
							PreFilterComponent->SetRelativeRotation(*Orientation);
							PreFilterComponent->SetRelativeLocation(*Location);
						}
					}

					DoFiltering(*Location, *Orientation, !*Success);
					*Success = true;
				}
			});
	}
}

void UHandTrackingFilterComponent::EndPlay(const EEndPlayReason::Type EndPlayReason)
{
	UOculusXRInputFunctionLibrary::HandMovementFilter.RemoveAll(this);

	Super::EndPlay(EndPlayReason);
}

EHandTrackingDataQuality UHandTrackingFilterComponent::GetDataQualityOverride() const
{
	if (bIgnoreConfidence)
		return EHandTrackingDataQuality::None;

	if (auto const Controller = Cast<UMotionControllerComponent>(GetAttachParent()))
	{
		auto Hand = EControllerHand::Left;
		FXRMotionControllerBase::GetHandEnumForSourceName(Controller->MotionSource, Hand);
		auto const DeviceHand = Hand == EControllerHand::Left ? EOculusXRHandType::HandLeft : EOculusXRHandType::HandRight;
		return Controller->IsTracked() ?
			UOculusXRInputFunctionLibrary::GetTrackingConfidence(DeviceHand) == EOculusXRTrackingConfidence::High ?
			EHandTrackingDataQuality::Good :
			EHandTrackingDataQuality::None :
			EHandTrackingDataQuality::Bad;
	}

	return EHandTrackingDataQuality::None;
}

FVector UHandTrackingFilterComponent::SmoothPosition(FVector StartPos, FVector TargetPos)
{
	if (SmoothPositionFactor > 0.99f)
	{
		// Updating disabled
		return StartPos;
	}

	auto const Diff = TargetPos - StartPos;
	auto const Dist = Diff.Size();

	if (Dist < MinSmoothPositionDistance)
	{
		// Not enough of a change to update
		UE_LOG(LogHandTrackingFilter, Verbose, TEXT("%s - SmoothPos - Not enough of a change to update"), *GetName());
		LastGoodVelocity = FVector::ZeroVector;
		return StartPos;
	}

	if (Dist >= MaxSmoothPositionDistance)
	{
		// Clamp max distance from target
		UE_LOG(LogHandTrackingFilter, Verbose, TEXT("%s - SmoothPos - Clamp max distance from target"), *GetName());
		auto const Dir = Diff / Dist;
		auto const MoveDist = Dist - MaxSmoothPositionDistance;
		return StartPos + Dir * MoveDist;
	}

	UE_LOG(LogHandTrackingFilter, Verbose, TEXT("%s - SmoothPos - Smooth"), *GetName());
	auto const SmoothFactor = 1.0f - SmoothPositionFactor;
	return FMath::Lerp(StartPos, TargetPos, SmoothFactor);
}

void UHandTrackingFilterComponent::SetPreFilterComponent(USceneComponent* Component)
{
	PreFilterComponent = Component;
}

FQuat UHandTrackingFilterComponent::SmoothRotation(FQuat StartRot, FQuat TargetRot)
{
	if (SmoothRotationFactorMin > 0.99f)
	{
		// Updating disabled
		return StartRot;
	}

	auto const CosAngle = StartRot | TargetRot;
	if (CosAngle > SmoothRotationDotMax)
	{
		// Not enough of a change to update
		UE_LOG(LogHandTrackingFilter, Verbose, TEXT("%s - SmoothRotation - Not enough of a change to update"), *GetName());
		return StartRot;
	}

	float SmoothFactor;
	if (CosAngle <= SmoothRotationDotMin)
	{
		UE_LOG(LogHandTrackingFilter, Verbose, TEXT("%s - SmoothRotation - CosAngle %f <= SmoothRotationDotMin %f"), *GetName(), CosAngle, SmoothRotationDotMin);
		SmoothFactor = 1.0f - SmoothRotationFactorMin;
	}
	else
	{
		UE_LOG(LogHandTrackingFilter, Verbose, TEXT("%s - SmoothRotation - CosAngle %f > SmoothRotationDotMin %f"), *GetName(), CosAngle, SmoothRotationDotMin);
		auto const Weight = (CosAngle - SmoothRotationDotMin) / (SmoothRotationDotMax - SmoothRotationDotMin);
		SmoothFactor = 1.0f - FMath::Lerp(SmoothRotationFactorMin,
			SmoothRotationFactorMax, Weight);
	}

	UE_LOG(LogHandTrackingFilter, Verbose, TEXT("%s - SmoothRotation - %f"), *GetName(), SmoothFactor);
	return FQuat::Slerp(StartRot, TargetRot, SmoothFactor);
}

bool UHandTrackingFilterComponent::DoFirstPassFilter(
	FHandTrackingFilterData const& LastData,
	FHandTrackingFilterData const& ThisFrameInitData,
	FTransform& NewTransform)
{
	auto const LastLocation = LastData.Transform.GetLocation();
	auto const NewLocation = ThisFrameInitData.Transform.GetLocation();
	auto const DeltaLocation = NewLocation - LastLocation;
	auto const DistanceSquared = DeltaLocation.SizeSquared();

	// if there hasn't been a tracking update, extrapolate
	if (DistanceSquared < MinTrackingDistance * MinTrackingDistance)
	{
		UE_LOG(LogHandTrackingFilter, Verbose, TEXT("%s - DoFirstPassFilter - if the location hasn't changed (%f), there hasn't been a tracking update"), *GetName(), DistanceSquared);
		NewTransform = LastSetTransform;
		return true;
	}

	auto const NewRotation = ThisFrameInitData.Transform.GetRotation();

	auto const SmoothedPosition = SmoothPosition(LastSetTransform.GetLocation(), NewLocation);
	NewTransform.SetLocation(SmoothedPosition);

	auto const SmoothedRotation = SmoothRotation(LastSetTransform.GetRotation(), NewRotation);
	NewTransform.SetRotation(SmoothedRotation);

	return false;
}

FTransform UHandTrackingFilterComponent::DoFilteringImpl(FTransform HandTransform, bool bForceBadData)
{
	auto CalculatedData = FHandTrackingFilterCalculatedData();

	auto const LastData = LastFrameData;
	auto ThisFrameInitData = FHandTrackingFilterData{NOW, HandTransform};

	auto const DeltaTime = ThisFrameInitData.Time - LastData.Time;

	auto MitigatedTransform = ThisFrameInitData.Transform;
	auto const EarlyOut = DoFirstPassFilter(LastData, ThisFrameInitData, MitigatedTransform);
	if (!bForceBadData && EarlyOut)
	{
		LastSetTransform = MitigatedTransform;
		return MitigatedTransform;
	}

	UE_LOG(LogHandTrackingFilter, Verbose, TEXT("%s - DoFilteringImpl - dt %lf"), *GetName(), DeltaTime);

	auto& Data = LastFrameData;
	Data = ThisFrameInitData;

	auto const DeltaLocation = MitigatedTransform.GetLocation() - LastSetTransform.GetLocation();
	auto const Distance = DeltaLocation.Size();
	CalculatedData.Distance = Distance;

	Data.Velocity = DeltaLocation / DeltaTime;
	CalculatedData.Velocity = Data.Velocity;

	auto const DeltaVelocity = Data.Velocity - LastData.Velocity;
	auto const Acceleration = CalculatedData.Acceleration = DeltaVelocity / DeltaTime;
	CalculatedData.AccelerationScalar = Acceleration.Size();

	auto DeltaRotation = Data.Transform.GetRotation() * LastSetTransform.GetRotation().Inverse();
	Data.AngularVelocity = Scale(DeltaRotation, 1 / DeltaTime);
	CalculatedData.AngularVelocityScalar = Data.AngularVelocity.GetAngle();

	auto BadData = CalculatedData.AccelerationScalar > MaxAcceleration ||
		Distance > MaxDistancePerFrame ||
		Data.Velocity.SizeSquared() > MaxSpeed * MaxSpeed ||
		CalculatedData.AngularVelocityScalar > MaxAngularVelocity;

	auto const QualityOverride = GetDataQualityOverride();
	if (QualityOverride == EHandTrackingDataQuality::Good)
		BadData = false;
	else if (QualityOverride == EHandTrackingDataQuality::Bad)
		BadData = true;

	auto const Camera = GetOwner()->FindComponentByClass<UCameraComponent>();
	if (Camera != nullptr)
	{
		CalculatedData.CameraDistance = FVector::Dist(Data.Transform.GetLocation(), Camera->GetComponentLocation());
		if ((QualityOverride != EHandTrackingDataQuality::Good || bCameraRadiusIgnoreConfidence) && CalculatedData.CameraDistance < IgnoreCameraLocationRadius)
			BadData = true;
	}
	else
	{
		CalculatedData.CameraDistance = -1;
	}

	if (bForceBadData)
	{
		UE_LOG(LogHandTrackingFilter, Verbose, TEXT("%s - DoFilteringImpl - Bad Data Forced"), *GetName());
		BadData = true;
	}

	auto const OriginalDistance = Distance;
	auto const LastSetTransformActual = LastSetTransform;
	auto NewTransform = IntegrateFilterData(MitigatedTransform, Data, DeltaTime, BadData);
	if (FVector::Dist(LastSetTransformActual.GetLocation(), NewTransform.GetLocation()) > OriginalDistance)
	{
		UE_LOG(LogHandTrackingFilter, Verbose, TEXT("%s - DoFilteringImpl - over 5 oh no - %s %f"),
			*GetName(),
			BadData ? TEXT("bad data") : TEXT("good data"),
			OriginalDistance);
	}

	CalculatedData.QualityOverride = QualityOverride;
	CalculatedData.BadData = BadData;

	OnCalculatedData.Broadcast(CalculatedData);

	if (UE_LOG_ACTIVE(LogHandTrackingFilter, VeryVerbose))
	{
		auto CalculatedDataText = FString(TEXT(""));
		FHandTrackingFilterCalculatedData::StaticStruct()->ExportText(CalculatedDataText, &CalculatedData, nullptr,
			this,
			PPF_ExportsNotFullyQualified | PPF_Copy | PPF_Delimited | PPF_IncludeTransient | PPF_ExternalEditor, nullptr);
		UE_LOG(LogHandTrackingFilter, VeryVerbose, TEXT("%s - OnCalculatedData - (%i,%i,%i) %s"),
			*GetName(),
			(int)NewTransform.GetLocation().X,
			(int)NewTransform.GetLocation().Y,
			(int)NewTransform.GetLocation().Z,
			*CalculatedDataText);
	}

	return NewTransform;
}

void UHandTrackingFilterComponent::DoFiltering(FVector& Location, FRotator& Orientation, bool bForceBadData)
{
	if (IsActive() == false)
		return;

	if (bForceZeroTransform)
	{
		Location = FVector::ZeroVector;
		Orientation = FRotator::ZeroRotator;
		return;
	}

	auto ParentTransform = GetAttachParent()->GetAttachParent()->GetComponentTransform();
	auto RelativeTransform = FTransform(Orientation, Location);
	auto WorldTransform = DoFilteringImpl(RelativeTransform * ParentTransform, bForceBadData);
	auto NewRelativeTransform = WorldTransform * ParentTransform.Inverse();
	Location = NewRelativeTransform.GetLocation();
	Orientation = NewRelativeTransform.Rotator();
}

void UHandTrackingFilterComponent::ExtrapolateTransform(float DeltaTime, FVector& FakeLocation, FQuat& FakeRotation)
{
	UE_LOG(LogHandTrackingFilter, Verbose, TEXT("%s - ExtrapolateTransform - LastGoodVelocity = %f"), *GetName(), LastGoodVelocity.Size());
	FakeLocation = LastSetTransform.GetLocation() + LastGoodVelocity * DeltaTime;
	FakeRotation = Scale(LastGoodAngularVelocity, DeltaTime) * LastSetTransform.GetRotation();
}

FTransform UHandTrackingFilterComponent::IntegrateFilterData(
	FTransform MitigatedTransform,
	FHandTrackingFilterData const& Data, float DeltaTime,
	bool BadData)
{
	if (BadData)
	{
		LastBadDataTime = Data.Time;
		LastGoodVelocity *= VelocityDamping; // damp the velocity so it doesn't fly off
		LastGoodAngularVelocity = Scale(LastGoodAngularVelocity, VelocityDamping);
		UE_LOG(LogHandTrackingFilter, Verbose, TEXT("%s - IntegrateFilterData - Bad Data"), *GetName());
	}
	else
	{
		LastGoodVelocity = FMath::Lerp(LastGoodVelocity, Data.Velocity.GetClampedToMaxSize(MaxFakeVelocity), GoodVelocityBlendRate);
		LastGoodAngularVelocity = Scale(Data.AngularVelocity,
			FMath::Max(Data.AngularVelocity.GetAngle() / MaxAngularVelocity, 1.0f));
		UE_LOG(LogHandTrackingFilter, Verbose, TEXT("%s - IntegrateFilterData - Good Data"), *GetName());
	}

	FVector FakeLocation;
	FQuat FakeRotation;
	ExtrapolateTransform(DeltaTime, FakeLocation, FakeRotation);

	if (BadData)
	{
		// when the data is bad it's possible for the MitigatedTransform to be invalid (containing NaNs)
		// so we set LastSetTransform directly instead of using the lerps
		LastSetTransform.SetLocation(FakeLocation);
		LastSetTransform.SetRotation(FakeRotation);
	}
	else
	{
		auto const FadePercent = FMath::Clamp((Data.Time - LastBadDataTime) / BadTransformFadeTime, 0.0, 1.0);
		LastSetTransform.SetLocation(FMath::LerpStable(FakeLocation, MitigatedTransform.GetLocation(), FadePercent));
		LastSetTransform.SetRotation(FQuat::Slerp(FakeRotation, MitigatedTransform.GetRotation(), FadePercent));
	}

	return LastSetTransform;
}

#undef NOW


================================================
FILE: Plugins/OculusHandTools/Source/HandTrackingFilter/HandTrackingFilterComponent.h
================================================
// Copyright (c) Meta Platforms, Inc. and affiliates.

#pragma once

#include "CoreMinimal.h"
#include "Components/SceneComponent.h"
#include "HandTrackingFilterComponent.generated.h"

struct HANDTRACKINGFILTER_API FHandTrackingFilterData
{
	double Time;
	FTransform Transform;
	FVector Velocity;
	FQuat AngularVelocity;
};

UENUM(BlueprintType)
enum class EHandTrackingDataQuality : uint8
{
	None,
	Good,
	Bad
};

USTRUCT(BlueprintType)
struct HANDTRACKINGFILTER_API FHandTrackingFilterCalculatedData
{
	GENERATED_BODY()

	UPROPERTY(BlueprintReadOnly)
	FVector Acceleration = FVector::ZeroVector;

	UPROPERTY(BlueprintReadOnly)
	float AccelerationScalar{};

	UPROPERTY(BlueprintReadOnly)
	float AngularVelocityScalar{};

	UPROPERTY(BlueprintReadOnly)
	float CameraDistance{};

	UPROPERTY(BlueprintReadOnly)
	float Distance{};

	UPROPERTY(BlueprintReadOnly)
	FVector Velocity = FVector::ZeroVector;

	/// hand confidence information
	UPROPERTY(BlueprintReadOnly)
	EHandTrackingDataQuality QualityOverride{};

	/// if the data should be ignored
	UPROPERTY(BlueprintReadOnly)
	bool BadData{};
};

UCLASS(ClassGroup=(Custom), meta=(BlueprintSpawnableComponent))
class HANDTRACKINGFILTER_API UHandTrackingFilterComponent : public USceneComponent
{
	GENERATED_BODY()

public:
	UHandTrackingFilterComponent();

protected:
	virtual void BeginPlay() override;
	virtual void EndPlay(EEndPlayReason::Type const EndPlayReason) override;

	FHandTrackingFilterData LastFrameData;

	double LastBadDataTime = -99999;
	FVector LastGoodVelocity = FVector::ZeroVector;
	FQuat LastGoodAngularVelocity = FQuat::Identity;
	FTransform LastSetTransform = FTransform::Identity;

	bool DoFirstPassFilter(FHandTrackingFilterData const& LastData, FHandTrackingFilterData const& ThisFrameInitData, FTransform& NewTransform);
	FTransform DoFilteringImpl(FTransform HandTransform, bool bForceBadData);
	FTransform IntegrateFilterData(FTransform MitigatedTransform, FHandTrackingFilterData const& Data, float DeltaTime, bool BadData);
	void DoFiltering(FVector& Location, FRotator& Orientation, bool bForceBadData);
	void ExtrapolateTransfo
Download .txt
gitextract_c23nrrk_/

├── .gitattributes
├── .github/
│   └── ISSUE_TEMPLATE/
│       └── bug_report.yml
├── .gitignore
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Config/
│   ├── Android/
│   │   └── AndroidEngine.ini
│   ├── DefaultDeviceProfiles.ini
│   ├── DefaultEditor.ini
│   ├── DefaultEngine.ini
│   ├── DefaultGame.ini
│   └── DefaultInput.ini
├── Content/
│   └── HandGameplay/
│       ├── Audio/
│       │   ├── GrabSound.uasset
│       │   ├── LAST_TestAudio_Release01.uasset
│       │   ├── LAST_TestAudio_Release02.uasset
│       │   ├── LAST_TestAudio_Release03.uasset
│       │   ├── ReleaseSound.uasset
│       │   ├── SoundAttenuationForSpatialization.uasset
│       │   ├── generic_grab_01.uasset
│       │   ├── generic_grab_02.uasset
│       │   ├── generic_grab_03.uasset
│       │   ├── generic_grab_04.uasset
│       │   ├── impacts/
│       │   │   ├── sfx_impact_primary_block_01.uasset
│       │   │   ├── sfx_impact_primary_block_02.uasset
│       │   │   ├── sfx_impact_primary_block_03.uasset
│       │   │   ├── sfx_impact_primary_block_04.uasset
│       │   │   ├── sfx_impact_primary_block_05.uasset
│       │   │   ├── sfx_impact_primary_block_06.uasset
│       │   │   ├── sfx_impact_primary_block_07.uasset
│       │   │   ├── sfx_impact_primary_block_Cue.uasset
│       │   │   ├── sfx_impact_secondary_block_01.uasset
│       │   │   ├── sfx_impact_secondary_block_02.uasset
│       │   │   ├── sfx_impact_secondary_block_03.uasset
│       │   │   ├── sfx_impact_secondary_block_04.uasset
│       │   │   ├── sfx_impact_secondary_block_05.uasset
│       │   │   ├── sfx_impact_secondary_block_06.uasset
│       │   │   ├── sfx_impact_secondary_block_07.uasset
│       │   │   ├── sfx_impact_secondary_block_08.uasset
│       │   │   ├── sfx_impact_secondary_block_09.uasset
│       │   │   ├── sfx_impact_secondary_block_10.uasset
│       │   │   ├── sfx_impact_secondary_block_11.uasset
│       │   │   ├── sfx_impact_secondary_block_12.uasset
│       │   │   ├── sfx_impact_secondary_block_13.uasset
│       │   │   └── sfx_impact_secondary_block_Cue.uasset
│       │   ├── laser/
│       │   │   ├── LaserSound.uasset
│       │   │   ├── sfx_laser_end.uasset
│       │   │   ├── sfx_laser_lp.uasset
│       │   │   └── sfx_laser_start.uasset
│       │   ├── mus_showcase_hands01.uasset
│       │   └── sfx_ambient_outdoor_forest_ambix.uasset
│       ├── Blueprints/
│       │   ├── HandsCharacter.uasset
│       │   └── HandsGameMode.uasset
│       ├── Environment/
│       │   ├── DustMotes/
│       │   │   ├── DustMotes_mat.uasset
│       │   │   ├── DustMotes_system.uasset
│       │   │   ├── DustMotes_vfx.uasset
│       │   │   ├── T_Epic_sub_dustParticle.uasset
│       │   │   ├── vfxm_Dust.uasset
│       │   │   ├── vfxm_GradientCircle.uasset
│       │   │   └── vfxm_GradientCircle_Inst.uasset
│       │   ├── EnvMatParms.uasset
│       │   ├── HT_cube_Tex.uasset
│       │   ├── snow_envi/
│       │   │   └── materials/
│       │   │       └── front_rock_snow_bc.uasset
│       │   ├── summer_envi/
│       │   │   ├── back_wall_bc.uasset
│       │   │   ├── back_wall_mat.uasset
│       │   │   ├── back_wall_sm.uasset
│       │   │   ├── cieling_bc.uasset
│       │   │   ├── cieling_mat.uasset
│       │   │   ├── cieling_sm.uasset
│       │   │   ├── cloud.uasset
│       │   │   ├── cloud_sm.uasset
│       │   │   ├── clouds_bc.uasset
│       │   │   ├── collision.uasset
│       │   │   ├── front_rock_bc.uasset
│       │   │   ├── front_rock_mat.uasset
│       │   │   ├── front_rock_sm.uasset
│       │   │   ├── front_statue_bc.uasset
│       │   │   ├── front_statue_mat.uasset
│       │   │   ├── front_statue_sm.uasset
│       │   │   ├── grass_bc.uasset
│       │   │   ├── grass_mat.uasset
│       │   │   ├── grass_sm.uasset
│       │   │   ├── left_wall_bc.uasset
│       │   │   ├── left_wall_mat.uasset
│       │   │   ├── left_wall_sm.uasset
│       │   │   ├── main_floor_bc.uasset
│       │   │   ├── main_floor_mat.uasset
│       │   │   ├── main_floor_sm.uasset
│       │   │   ├── right_wall_bc.uasset
│       │   │   ├── right_wall_mat.uasset
│       │   │   ├── right_wall_sm.uasset
│       │   │   └── vines_bc.uasset
│       │   ├── vfxm_WindFoliage.uasset
│       │   ├── vfxm_WindGrass_Inst.uasset
│       │   ├── vfxm_WindVines_Inst.uasset
│       │   └── vfxsm_vinesVtxAlpha.uasset
│       ├── Hands/
│       │   ├── Models/
│       │   │   ├── HandMat.uasset
│       │   │   ├── OculusHand_L.uasset
│       │   │   ├── OculusHand_L_Skeleton.uasset
│       │   │   ├── OculusHand_R.uasset
│       │   │   └── OculusHand_R_Skeleton.uasset
│       │   ├── TutorialHand.uasset
│       │   ├── TutorialHandLeft.uasset
│       │   └── TutorialHandRight.uasset
│       ├── Input/
│       │   ├── Actions/
│       │   │   ├── AvatarLeftSystemGesture.uasset
│       │   │   ├── LogGestureState.uasset
│       │   │   ├── LogLeftHand.uasset
│       │   │   ├── LogRightHand.uasset
│       │   │   ├── TogglePoseRecording.uasset
│       │   │   ├── TogglePoseRecordingLeft.uasset
│       │   │   └── TogglePoseRecordingRight.uasset
│       │   └── InputMappingContext.uasset
│       ├── Levels/
│       │   ├── HandGameplayShowcase.umap
│       │   ├── HandRecognitionShowcaseArt.umap
│       │   ├── HandRecognitionShowcaseAudio.umap
│       │   └── HandRecognitionShowcaseVFX.umap
│       ├── Props/
│       │   ├── Blocks/
│       │   │   ├── Blocks001_Throwable_sm.uasset
│       │   │   ├── Blocks01_bc.uasset
│       │   │   ├── Blocks01_bc_Emissive.uasset
│       │   │   ├── Blocks01_nm.uasset
│       │   │   ├── InteractableBrick.uasset
│       │   │   ├── NS_BrickImpact.uasset
│       │   │   ├── T_Epic_SUB_UV_Small_Rocks.uasset
│       │   │   ├── vfxm_Blocks01_Throwable.uasset
│       │   │   ├── vfxm_Blocks01_Throwable_Inst.uasset
│       │   │   └── vfxm_ParticleSpriteUnlitSubUV.uasset
│       │   ├── Button/
│       │   │   ├── PushButtonBP.uasset
│       │   │   ├── SFX/
│       │   │   │   ├── GameConsole_button_press_in_01.uasset
│       │   │   │   └── GameConsole_button_press_out_04.uasset
│       │   │   ├── ToggleButtonBP.uasset
│       │   │   └── testbutton_sm.uasset
│       │   ├── RingWeapon/
│       │   │   ├── 2HandedBeamProp_Mesh.uasset
│       │   │   ├── InteractableArtefactHandle.uasset
│       │   │   ├── InteractableTwoHandedArtefact.uasset
│       │   │   ├── TwoHandArtefact_StartBeam.uasset
│       │   │   ├── TwoHandedBeamSystem.uasset
│       │   │   ├── vfxm_2HandedBeamProp.uasset
│       │   │   ├── vfxm_OrbFloating.uasset
│       │   │   ├── vfxm_TwoHandedArtefactBeam.uasset
│       │   │   └── vfxm_TwoHandedArtefactBeam_Inst.uasset
│       │   ├── Table/
│       │   │   ├── table_bc.uasset
│       │   │   ├── table_mat.uasset
│       │   │   └── table_sm.uasset
│       │   ├── Target/
│       │   │   ├── TargetBP.uasset
│       │   │   ├── sfx_spinning_target_01_loop.uasset
│       │   │   ├── target_m.uasset
│       │   │   ├── target_pentagon_sm.uasset
│       │   │   ├── targets_bc.uasset
│       │   │   └── targets_em.uasset
│       │   ├── TeleportBeacon/
│       │   │   ├── Activate_vfx.uasset
│       │   │   ├── NS_Activate.uasset
│       │   │   ├── TeleportBeacon.uasset
│       │   │   ├── TeleportationPad.uasset
│       │   │   ├── TeleportationPadMesh.uasset
│       │   │   ├── vfxm_ActivateGlow_Inst.uasset
│       │   │   ├── vfxm_AlphaPanner.uasset
│       │   │   ├── vfxm_TeleportBeaconPointerArrow.uasset
│       │   │   ├── vfxmi_TeleportBeacon.uasset
│       │   │   ├── vfxmi_TeleportPointerArrowRing.uasset
│       │   │   ├── vfxsm_TeleportBeacon.uasset
│       │   │   └── vfxsm_TeleportPointerArrowRing.uasset
│       │   └── TetherBall/
│       │       ├── Art/
│       │       │   ├── ball_bc.uasset
│       │       │   ├── ball_mat.uasset
│       │       │   ├── ball_sm.uasset
│       │       │   ├── tether_ball_base.uasset
│       │       │   ├── tether_ball_base_mat.uasset
│       │       │   ├── tether_ball_base_sm.uasset
│       │       │   └── tether_mat.uasset
│       │       ├── SFX/
│       │       │   ├── TetherBallHit.uasset
│       │       │   ├── TetherBallSoundConcurrency.uasset
│       │       │   ├── TetherBall_RubberThick_Imp_01.uasset
│       │       │   ├── TetherBall_RubberThick_Imp_02.uasset
│       │       │   ├── TetherBall_RubberThick_Imp_03.uasset
│       │       │   ├── TetherBall_RubberThick_Imp_04.uasset
│       │       │   ├── TetherBall_RubberThick_Imp_05.uasset
│       │       │   ├── TetherBall_RubberThick_Imp_06.uasset
│       │       │   ├── TetherBall_RubberThick_Imp_07.uasset
│       │       │   ├── TetherBall_RubberThick_Imp_08.uasset
│       │       │   └── TetherBall_RubberThick_Imp_09.uasset
│       │       ├── TetherBallBP.uasset
│       │       ├── ThetherBallPhysMat.uasset
│       │       ├── VFX/
│       │       │   └── spawn_tetherballBase_ps.uasset
│       │       └── tether_ball_sm.uasset
│       └── SharedArt/
│           ├── Blue.uasset
│           ├── FlatBlue.uasset
│           ├── Red.uasset
│           ├── T_Caustic01.uasset
│           ├── T_WorleyNoise01.uasset
│           └── TextBackground.uasset
├── HandGameplay.uproject
├── LICENSE
├── Platforms/
│   └── HoloLens/
│       └── Config/
│           └── HoloLensEngine.ini
├── Plugins/
│   ├── OculusHandTools/
│   │   ├── .gitattributes
│   │   ├── .gitignore
│   │   ├── Config/
│   │   │   └── FilterPlugin.ini
│   │   ├── Content/
│   │   │   ├── BlueprintMacros.uasset
│   │   │   ├── Button/
│   │   │   │   ├── IsButtonableInterface.uasset
│   │   │   │   └── PushButtonBaseBP.uasset
│   │   │   ├── Fonts/
│   │   │   │   ├── OculusSans-Black.uasset
│   │   │   │   ├── OculusSans-BlackItalic.uasset
│   │   │   │   ├── OculusSans-BlackItalic_Font.uasset
│   │   │   │   ├── OculusSans-Black_Font.uasset
│   │   │   │   ├── OculusSans-Bold.uasset
│   │   │   │   ├── OculusSans-BoldItalic.uasset
│   │   │   │   ├── OculusSans-BoldItalic_Font.uasset
│   │   │   │   ├── OculusSans-Bold_Font.uasset
│   │   │   │   ├── OculusSans-DemiBold.uasset
│   │   │   │   ├── OculusSans-DemiBoldItalic.uasset
│   │   │   │   ├── OculusSans-DemiBoldItalic_Font.uasset
│   │   │   │   ├── OculusSans-DemiBold_Font.uasset
│   │   │   │   ├── OculusSans-Light.uasset
│   │   │   │   ├── OculusSans-LightItalic.uasset
│   │   │   │   ├── OculusSans-LightItalic_Font.uasset
│   │   │   │   ├── OculusSans-Light_Font.uasset
│   │   │   │   ├── OculusSans-Medium.uasset
│   │   │   │   ├── OculusSans-MediumItalic.uasset
│   │   │   │   ├── OculusSans-MediumItalic_Font.uasset
│   │   │   │   ├── OculusSans-Medium_Font.uasset
│   │   │   │   ├── OculusSans-Normal.uasset
│   │   │   │   ├── OculusSans-NormalItalic.uasset
│   │   │   │   ├── OculusSans-NormalItalic_Font.uasset
│   │   │   │   ├── OculusSans-Normal_Font.uasset
│   │   │   │   ├── OculusSans-Regular.uasset
│   │   │   │   ├── OculusSans-RegularItalic.uasset
│   │   │   │   ├── OculusSans-RegularItalic_Font.uasset
│   │   │   │   ├── OculusSans-Regular_Font.uasset
│   │   │   │   ├── OculusSans-SemiBold.uasset
│   │   │   │   ├── OculusSans-SemiBoldItalic.uasset
│   │   │   │   ├── OculusSans-SemiBoldItalic_Font.uasset
│   │   │   │   ├── OculusSans-SemiBold_Font.uasset
│   │   │   │   ├── OculusSans-Thin.uasset
│   │   │   │   ├── OculusSans-ThinItalic.uasset
│   │   │   │   ├── OculusSans-ThinItalic_Font.uasset
│   │   │   │   ├── OculusSans-Thin_Font.uasset
│   │   │   │   ├── OculusSans-Ultra.uasset
│   │   │   │   ├── OculusSans-UltraItalic.uasset
│   │   │   │   ├── OculusSans-UltraItalic_Font.uasset
│   │   │   │   └── OculusSans-Ultra_Font.uasset
│   │   │   ├── HandDebug/
│   │   │   │   ├── HandDebugActor.uasset
│   │   │   │   ├── HandDebugWidget.uasset
│   │   │   │   ├── STADIUM_Black-01.uasset
│   │   │   │   └── WidgetInvisibleMaterial.uasset
│   │   │   ├── Hands/
│   │   │   │   ├── HandsCharacterBase.uasset
│   │   │   │   ├── HandsCharacterHandState.uasset
│   │   │   │   ├── TeleportSelector.uasset
│   │   │   │   └── TutorialHand.uasset
│   │   │   ├── RespawnProps/
│   │   │   │   ├── FloorIdentifier.uasset
│   │   │   │   └── RespawnFromFloor.uasset
│   │   │   └── Selectors/
│   │   │       ├── AimingGlow.uasset
│   │   │       ├── DefaultAimingActor.uasset
│   │   │       └── DefaultAimingSphere.uasset
│   │   ├── OculusHandTools.uplugin
│   │   ├── README.md
│   │   ├── README_HandInput.md
│   │   ├── README_HandPoseRecognition.md
│   │   ├── README_HandTrackingFilter.md
│   │   ├── README_Interactable.md
│   │   ├── README_OculusUtils.md
│   │   ├── README_ThrowAssist.md
│   │   └── Source/
│   │       ├── HandInput/
│   │       │   ├── CameraHandInput.cpp
│   │       │   ├── CameraHandInput.h
│   │       │   ├── EnumMap.h
│   │       │   ├── HandInput.Build.cs
│   │       │   ├── HandInput.cpp
│   │       │   ├── HandInput.h
│   │       │   ├── HandInputModule.cpp
│   │       │   ├── HandInputModule.h
│   │       │   └── QuatUtil.h
│   │       ├── HandTrackingFilter/
│   │       │   ├── HandTrackingFilter.Build.cs
│   │       │   ├── HandTrackingFilter.cpp
│   │       │   ├── HandTrackingFilter.h
│   │       │   ├── HandTrackingFilterComponent.cpp
│   │       │   ├── HandTrackingFilterComponent.h
│   │       │   └── QuatUtil.h
│   │       ├── OculusHandPoseRecognition/
│   │       │   ├── OculusHandPoseRecognition.Build.cs
│   │       │   ├── Private/
│   │       │   │   ├── FRecordHandPoseAction.h
│   │       │   │   ├── FWaitForHandGestureAction.h
│   │       │   │   ├── FWaitForHandPoseAction.h
│   │       │   │   ├── HandGesture.cpp
│   │       │   │   ├── HandGestureRecognizer.cpp
│   │       │   │   ├── HandPose.cpp
│   │       │   │   ├── HandPoseRecognizer.cpp
│   │       │   │   ├── HandRecognitionFunctionLibrary.cpp
│   │       │   │   ├── HandRecognitionGameMode.cpp
│   │       │   │   ├── OculusHandPoseRecognitionModule.cpp
│   │       │   │   └── PoseableHandComponent.cpp
│   │       │   └── Public/
│   │       │       ├── HandGesture.h
│   │       │       ├── HandGestureRecognizer.h
│   │       │       ├── HandPose.h
│   │       │       ├── HandPoseRecognizer.h
│   │       │       ├── HandRecognitionFunctionLibrary.h
│   │       │       ├── HandRecognitionGameMode.h
│   │       │       ├── OculusHandPoseRecognitionModule.h
│   │       │       └── PoseableHandComponent.h
│   │       ├── OculusInteractable/
│   │       │   ├── OculusInteractable.Build.cs
│   │       │   ├── Private/
│   │       │   │   ├── AimingActor.cpp
│   │       │   │   ├── HandGrabbingComponent.cpp
│   │       │   │   ├── Interactable.cpp
│   │       │   │   ├── InteractableFunctionLibrary.cpp
│   │       │   │   ├── InteractableSelector.cpp
│   │       │   │   ├── OculusInteractableModule.cpp
│   │       │   │   ├── TransformString.cpp
│   │       │   │   └── TransformString.h
│   │       │   └── Public/
│   │       │       ├── AimingActor.h
│   │       │       ├── HandGrabbingComponent.h
│   │       │       ├── Interactable.h
│   │       │       ├── InteractableFunctionLibrary.h
│   │       │       ├── InteractablePose.h
│   │       │       ├── InteractableSelector.h
│   │       │       └── OculusInteractableModule.h
│   │       └── OculusThrowAssist/
│   │           ├── OculusThrowAssist.Build.cs
│   │           ├── Private/
│   │           │   ├── OculusThrowAssistModule.cpp
│   │           │   ├── ThrowingComponent.cpp
│   │           │   └── TransformBufferComponent.cpp
│   │           └── Public/
│   │               ├── OculusThrowAssistModule.h
│   │               ├── ThrowingComponent.h
│   │               └── TransformBufferComponent.h
│   └── OculusUtils/
│       ├── OculusUtils.uplugin
│       └── Source/
│           └── OculusUtils/
│               ├── OculusUtils.Build.cs
│               ├── Private/
│               │   ├── ContinuousOverlapSphereComponent.cpp
│               │   ├── OculusDeveloperTelemetry.cpp
│               │   ├── OculusUtilsLibrary.cpp
│               │   └── OculusUtilsModule.cpp
│               └── Public/
│                   ├── ContinuousOverlapSphereComponent.h
│                   ├── OculusDeveloperTelemetry.h
│                   ├── OculusUtilsLibrary.h
│                   └── OculusUtilsModule.h
├── README.md
└── Source/
    ├── HandGameplay/
    │   ├── HandGameplay.Build.cs
    │   ├── HandGameplay.cpp
    │   ├── HandGameplay.h
    │   ├── HandGameplayGameModeBase.cpp
    │   ├── HandGameplayGameModeBase.h
    │   └── UpdatePermissions.xml
    ├── HandGameplay.Target.cs
    └── HandGameplayEditor.Target.cs
Download .txt
SYMBOL INDEX (80 symbols across 54 files)

FILE: Plugins/OculusHandTools/Source/HandInput/CameraHandInput.cpp
  function IsOpenXRSystem (line 16) | bool IsOpenXRSystem()
  function FTransform (line 414) | FTransform UCameraHandInput::GetGripBoneTransform(EBoneSpaces::Type Bone...
  function EOculusXRHandType (line 427) | EOculusXRHandType UCameraHandInput::GetHand() const
  function UPoseableMeshComponent (line 432) | UPoseableMeshComponent* UCameraHandInput::GetMesh() const
  function FName (line 437) | FName UCameraHandInput::GetGripBoneName() const

FILE: Plugins/OculusHandTools/Source/HandInput/CameraHandInput.h
  function namespace (line 14) | namespace OculusInput
  function EHandDigit (line 24) | enum class EHandDigit : uint8

FILE: Plugins/OculusHandTools/Source/HandInput/EnumMap.h
  function InElementType (line 18) | InElementType const& operator[](EEnum Index) const

FILE: Plugins/OculusHandTools/Source/HandInput/HandInput.Build.cs
  class HandInput (line 5) | public class HandInput : ModuleRules
    method HandInput (line 7) | public HandInput(ReadOnlyTargetRules Target) : base(Target)

FILE: Plugins/OculusHandTools/Source/HandInput/HandInput.h
  function class (line 21) | class HANDINPUT_API IHandInput

FILE: Plugins/OculusHandTools/Source/HandInput/QuatUtil.h
  function FORCEINLINE (line 7) | static FORCEINLINE FQuat Scale(FQuat Rotation, float S)

FILE: Plugins/OculusHandTools/Source/HandTrackingFilter/HandTrackingFilter.Build.cs
  class HandTrackingFilter (line 5) | public class HandTrackingFilter : ModuleRules
    method HandTrackingFilter (line 7) | public HandTrackingFilter(ReadOnlyTargetRules Target) : base(Target)

FILE: Plugins/OculusHandTools/Source/HandTrackingFilter/HandTrackingFilterComponent.cpp
  function EHandTrackingDataQuality (line 66) | EHandTrackingDataQuality UHandTrackingFilterComponent::GetDataQualityOve...
  function FVector (line 86) | FVector UHandTrackingFilterComponent::SmoothPosition(FVector StartPos, F...
  function FQuat (line 124) | FQuat UHandTrackingFilterComponent::SmoothRotation(FQuat StartRot, FQuat...
  function FTransform (line 187) | FTransform UHandTrackingFilterComponent::DoFilteringImpl(FTransform Hand...
  function FTransform (line 313) | FTransform UHandTrackingFilterComponent::IntegrateFilterData(

FILE: Plugins/OculusHandTools/Source/HandTrackingFilter/HandTrackingFilterComponent.h
  function FHandTrackingFilterData (line 9) | struct HANDTRACKINGFILTER_API FHandTrackingFilterData
  function class (line 18) | class EHandTrackingDataQuality : uint8

FILE: Plugins/OculusHandTools/Source/HandTrackingFilter/QuatUtil.h
  function HANDTRACKINGFILTER_API (line 7) | HANDTRACKINGFILTER_API Scale(FQuat Rotation, float S)

FILE: Plugins/OculusHandTools/Source/OculusHandPoseRecognition/OculusHandPoseRecognition.Build.cs
  class OculusHandPoseRecognition (line 5) | public class OculusHandPoseRecognition : ModuleRules
    method OculusHandPoseRecognition (line 7) | public OculusHandPoseRecognition (ReadOnlyTargetRules Target) : base(T...

FILE: Plugins/OculusHandTools/Source/OculusHandPoseRecognition/Private/FRecordHandPoseAction.h
  function class (line 13) | class FRecordHandPoseAction : public FPendingLatentAction

FILE: Plugins/OculusHandTools/Source/OculusHandPoseRecognition/Private/FWaitForHandGestureAction.h
  function class (line 12) | class FWaitForHandGestureAction : public FPendingLatentAction

FILE: Plugins/OculusHandTools/Source/OculusHandPoseRecognition/Private/FWaitForHandPoseAction.h
  function class (line 12) | class FWaitForHandPoseAction : public FPendingLatentAction

FILE: Plugins/OculusHandTools/Source/OculusHandPoseRecognition/Private/HandGestureRecognizer.cpp
  function EGestureState (line 165) | EGestureState UHandGestureRecognizer::GetGestureRecognitionState(int Index)

FILE: Plugins/OculusHandTools/Source/OculusHandPoseRecognition/Private/HandPose.cpp
  function FString (line 184) | FString FHandPose::FmtRot(FString Prefix, FRotator R)

FILE: Plugins/OculusHandTools/Source/OculusHandPoseRecognition/Private/HandPoseRecognizer.cpp
  function FRotator (line 45) | FRotator UHandPoseRecognizer::GetWristRotator(FQuat ComponentQuat) const

FILE: Plugins/OculusHandTools/Source/OculusHandPoseRecognition/Private/PoseableHandComponent.cpp
  type ELevelTick (line 16) | enum ELevelTick

FILE: Plugins/OculusHandTools/Source/OculusHandPoseRecognition/Public/HandGesture.h
  function class (line 12) | class EGestureState : uint8

FILE: Plugins/OculusHandTools/Source/OculusHandPoseRecognition/Public/HandGestureRecognizer.h
  function OCULUSHANDPOSERECOGNITION_API (line 65) | OCULUSHANDPOSERECOGNITION_API UHandGestureRecognizer : public USceneComp...

FILE: Plugins/OculusHandTools/Source/OculusHandPoseRecognition/Public/HandPose.h
  type ERecognizedBone (line 11) | enum ERecognizedBone
  function OCULUSHANDPOSERECOGNITION_API (line 36) | OCULUSHANDPOSERECOGNITION_API FHandPose

FILE: Plugins/OculusHandTools/Source/OculusHandPoseRecognition/Public/HandPoseRecognizer.h
  function OCULUSHANDPOSERECOGNITION_API (line 18) | OCULUSHANDPOSERECOGNITION_API UHandPoseRecognizer : public USceneComponent

FILE: Plugins/OculusHandTools/Source/OculusHandPoseRecognition/Public/HandRecognitionFunctionLibrary.h
  function class (line 37) | class ERecordHandPoseExitType : uint8

FILE: Plugins/OculusHandTools/Source/OculusHandPoseRecognition/Public/HandRecognitionGameMode.h
  function OCULUSHANDPOSERECOGNITION_API (line 14) | OCULUSHANDPOSERECOGNITION_API AHandRecognitionGameMode : public AGameMod...

FILE: Plugins/OculusHandTools/Source/OculusHandPoseRecognition/Public/OculusHandPoseRecognitionModule.h
  function class (line 10) | class FOculusHandPoseRecognitionModule : public IModuleInterface

FILE: Plugins/OculusHandTools/Source/OculusHandPoseRecognition/Public/PoseableHandComponent.h
  function OCULUSHANDPOSERECOGNITION_API (line 12) | OCULUSHANDPOSERECOGNITION_API UPoseableHandComponent : public UOculusXRH...

FILE: Plugins/OculusHandTools/Source/OculusInteractable/OculusInteractable.Build.cs
  class OculusInteractable (line 5) | public class OculusInteractable : ModuleRules
    method OculusInteractable (line 7) | public OculusInteractable (ReadOnlyTargetRules Target) : base(Target)

FILE: Plugins/OculusHandTools/Source/OculusInteractable/Private/HandGrabbingComponent.cpp
  function AInteractable (line 8) | AInteractable* UHandGrabbingComponent::TryGrab(FTransform GrabTransform)
  function AInteractable (line 66) | AInteractable* UHandGrabbingComponent::TryRelease(bool bReenablePhysics)

FILE: Plugins/OculusHandTools/Source/OculusInteractable/Private/InteractableSelector.cpp
  function AInteractable (line 310) | AInteractable* AInteractableSelector::GetSelectedInteractable(bool& Sele...
  function AActor (line 316) | AActor* AInteractableSelector::GetNonInteractableHit() const

FILE: Plugins/OculusHandTools/Source/OculusInteractable/Private/TransformString.h
  function class (line 10) | class FTransformString

FILE: Plugins/OculusHandTools/Source/OculusInteractable/Public/AimingActor.h
  function OCULUSINTERACTABLE_API (line 10) | OCULUSINTERACTABLE_API AAimingActor : public AActor

FILE: Plugins/OculusHandTools/Source/OculusInteractable/Public/HandGrabbingComponent.h
  function OCULUSINTERACTABLE_API (line 15) | OCULUSINTERACTABLE_API UHandGrabbingComponent : public USceneComponent

FILE: Plugins/OculusHandTools/Source/OculusInteractable/Public/Interactable.h
  function class (line 13) | class EHandSide : uint8

FILE: Plugins/OculusHandTools/Source/OculusInteractable/Public/InteractableFunctionLibrary.h
  function OCULUSINTERACTABLE_API (line 10) | OCULUSINTERACTABLE_API UInteractableFunctionLibrary : public UBlueprintF...

FILE: Plugins/OculusHandTools/Source/OculusInteractable/Public/InteractablePose.h
  function OCULUSINTERACTABLE_API (line 10) | OCULUSINTERACTABLE_API FInteractablePose

FILE: Plugins/OculusHandTools/Source/OculusInteractable/Public/InteractableSelector.h
  function OCULUSINTERACTABLE_API (line 18) | OCULUSINTERACTABLE_API AInteractableSelector : public AActor

FILE: Plugins/OculusHandTools/Source/OculusInteractable/Public/OculusInteractableModule.h
  function class (line 9) | class FOculusInteractableModule : public IModuleInterface

FILE: Plugins/OculusHandTools/Source/OculusThrowAssist/OculusThrowAssist.Build.cs
  class OculusThrowAssist (line 5) | public class OculusThrowAssist  : ModuleRules
    method OculusThrowAssist (line 7) | public OculusThrowAssist  (ReadOnlyTargetRules Target) : base(Target)

FILE: Plugins/OculusHandTools/Source/OculusThrowAssist/Private/ThrowingComponent.cpp
  function FVector (line 76) | FVector UThrowingComponent::GetThrowVector(FVector LookDirection) const
  function FVector (line 101) | FVector UThrowingComponent::GetThrowVectorInPast(float SecondsAgo, FVect...

FILE: Plugins/OculusHandTools/Source/OculusThrowAssist/Private/TransformBufferComponent.cpp
  type ELevelTick (line 20) | enum ELevelTick

FILE: Plugins/OculusHandTools/Source/OculusThrowAssist/Public/OculusThrowAssistModule.h
  function class (line 9) | class FOculusThrowAssistModule : public IModuleInterface

FILE: Plugins/OculusHandTools/Source/OculusThrowAssist/Public/ThrowingComponent.h
  function OCULUSTHROWASSIST_API (line 13) | OCULUSTHROWASSIST_API UThrowingComponent : public UActorComponent

FILE: Plugins/OculusHandTools/Source/OculusThrowAssist/Public/TransformBufferComponent.h
  function ETransformBufferUpdateMode (line 11) | enum class ETransformBufferUpdateMode : uint8

FILE: Plugins/OculusUtils/Source/OculusUtils/OculusUtils.Build.cs
  class OculusUtils (line 6) | public class OculusUtils : ModuleRules
    method OculusUtils (line 8) | public OculusUtils(ReadOnlyTargetRules Target) : base(Target)

FILE: Plugins/OculusUtils/Source/OculusUtils/Private/OculusDeveloperTelemetry.cpp
  function MakeTelemetryTextBlock (line 30) | auto MakeTelemetryTextBlock(float Width)

FILE: Plugins/OculusUtils/Source/OculusUtils/Private/OculusUtilsLibrary.cpp
  class FTickUntilAction (line 69) | class FTickUntilAction : public FPendingLatentAction
    method FTickUntilAction (line 77) | FTickUntilAction(FLatentActionInfo const& LatentInfo) :
    method UpdateOperation (line 84) | virtual void UpdateOperation(FLatentResponse& Response) override

FILE: Plugins/OculusUtils/Source/OculusUtils/Public/ContinuousOverlapSphereComponent.h
  function OCULUSUTILS_API (line 14) | OCULUSUTILS_API UContinuousOverlapSphereComponent : public USphereComponent

FILE: Plugins/OculusUtils/Source/OculusUtils/Public/OculusDeveloperTelemetry.h
  function OCULUSUTILS_API (line 14) | OCULUSUTILS_API UOculusDeveloperTelemetry : public UObject
  function class (line 37) | class FOculusTelemetrySettingsCustomization : public IDetailCustomization

FILE: Plugins/OculusUtils/Source/OculusUtils/Public/OculusUtilsLibrary.h
  function class (line 11) | class ETickUntilInputPin : uint8

FILE: Plugins/OculusUtils/Source/OculusUtils/Public/OculusUtilsModule.h
  function class (line 9) | class FOculusUtilsModule : public IModuleInterface

FILE: Source/HandGameplay.Target.cs
  class HandGameplayTarget (line 6) | public class HandGameplayTarget : TargetRules
    method HandGameplayTarget (line 8) | public HandGameplayTarget( TargetInfo Target) : base(Target)

FILE: Source/HandGameplay/HandGameplay.Build.cs
  class HandGameplay (line 5) | public class HandGameplay : ModuleRules
    method HandGameplay (line 7) | public HandGameplay(ReadOnlyTargetRules Target) : base(Target)

FILE: Source/HandGameplay/HandGameplayGameModeBase.h
  function HANDGAMEPLAY_API (line 13) | HANDGAMEPLAY_API AHandGameplayGameModeBase : public AGameModeBase

FILE: Source/HandGameplayEditor.Target.cs
  class HandGameplayEditorTarget (line 6) | public class HandGameplayEditorTarget : TargetRules
    method HandGameplayEditorTarget (line 8) | public HandGameplayEditorTarget( TargetInfo Target) : base(Target)
Condensed preview — 334 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (372K chars).
[
  {
    "path": ".gitattributes",
    "chars": 254,
    "preview": "*.a filter=lfs diff=lfs merge=lfs -text\n*.lib filter=lfs diff=lfs merge=lfs -text\n*.uasset filter=lfs diff=lfs merge=lfs"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "chars": 1668,
    "preview": "name: 🐛 Bug Report\ndescription: Report a reproducible bug or regression.\ntitle: '[BUG] '\nbody:\n  - type: markdown\n    at"
  },
  {
    "path": ".gitignore",
    "chars": 991,
    "preview": "# Visual Studio 2015 user specific files\n.vs/\n\n# Compiled Object files\n*.slo\n*.lo\n*.o\n*.obj\n\n# Precompiled Headers\n*.gch"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 3535,
    "preview": "# Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as\ncontributors and"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 1227,
    "preview": "# Contributing\nWe want to make contributing to this project as easy and transparent as possible.\n\n## Pull Requests\nWe ac"
  },
  {
    "path": "Config/Android/AndroidEngine.ini",
    "chars": 50,
    "preview": "[DevOptions.Shaders]\nbNeedsShaderStableKeys=True\n\n"
  },
  {
    "path": "Config/DefaultDeviceProfiles.ini",
    "chars": 1517,
    "preview": "[Oculus_Quest2 DeviceProfile]\nDeviceType=Android\nBaseProfileName=Oculus_Quest\nbIsVisibleForAssets=False\n-CVars=r.Mobile."
  },
  {
    "path": "Config/DefaultEditor.ini",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "Config/DefaultEngine.ini",
    "chars": 25422,
    "preview": "[/Script/HardwareTargeting.HardwareTargetingSettings]\nTargetedHardwareClass=Mobile\nAppliedTargetedHardwareClass=Mobile\nD"
  },
  {
    "path": "Config/DefaultGame.ini",
    "chars": 382,
    "preview": "\n\n[/Script/EngineSettings.GeneralProjectSettings]\nProjectID=C55AF2354CBEC3833CFBFB923FDA1579\nCopyrightNotice=Copyright ("
  },
  {
    "path": "Config/DefaultInput.ini",
    "chars": 15496,
    "preview": "[/Script/Engine.InputSettings]\n-AxisConfig=(AxisKeyName=\"Gamepad_LeftX\",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensi"
  },
  {
    "path": "Content/HandGameplay/Audio/GrabSound.uasset",
    "chars": 129,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:b9849f17e45079ec2902ffee437cd8d186f29aafbf3e732eab5f688f0649a7e6\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/LAST_TestAudio_Release01.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:1978301e2d109ee5baa2b3df67445779d460a4886b9046b2677b2879cecc96b8\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/LAST_TestAudio_Release02.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:1cb0cf23601b97676c977ab2c9c535ca9c06717af91495ad2b71ea5545699dfd\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/LAST_TestAudio_Release03.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:558c2159e23d0499cd3bb75743973a7b19f2267d437e7d7250901008e7a09762\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/ReleaseSound.uasset",
    "chars": 129,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:7409697cfa348d34ead533785d90e153499d095fff519020338abfabe177226d\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/SoundAttenuationForSpatialization.uasset",
    "chars": 129,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:5a90478a20b64771a4318e6a74b3a21201b3146ff29a4a5d3fb26df42fbd8460\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/generic_grab_01.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:a2c245034b32b6f5ddd707597c564248464333e501f325e0ba3adda25959a5fd\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/generic_grab_02.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:dbe114715a7464e7fd61bd705448106fd4f0ec07df42ebddfc9ff5f4ccc11666\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/generic_grab_03.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:6b7e28b3d1e250ff7c16318291fd001955f755b4edfb3c4af9dffa6cdf63eaba\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/generic_grab_04.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:0757440c8431852e8b0ce3ae3bb291890c6a33a868c489588ea886bec7dea106\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/impacts/sfx_impact_primary_block_01.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:eaebcbd95610bc979b02ed9221ee0fc256c17dfbdbeb34cdb7d6dc10f807dbaa\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/impacts/sfx_impact_primary_block_02.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:8bf0bb6c80d8715e2503d243e0d711c59fbce56a8d91d11869ed41e3d5982758\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/impacts/sfx_impact_primary_block_03.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:eb040580284faf0a36126c46039399b3d308473e974e4a6f0501ceade9a1c949\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/impacts/sfx_impact_primary_block_04.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:aded0c4d042fc7b92871673996a091dce6e91da0bcaf0016cfacb9cd5b391ec5\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/impacts/sfx_impact_primary_block_05.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:a163e311b2ccf596cdb478c3c361d8b71f5d53fd361b0e3498187a07b1b27a83\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/impacts/sfx_impact_primary_block_06.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:6e0d5ce075fb26cc9b81da4fbaa93a48f31193ca2960cc5c6ed5ca1c5cb64f3a\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/impacts/sfx_impact_primary_block_07.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:3be5c781b4eabe164845d2b39182a57dbe39893c4deda2bc5de9137095762978\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/impacts/sfx_impact_primary_block_Cue.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:99f5e033a67b622cf4960b6d740c24fa815b14553ab999408ed280d5dd63dc87\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/impacts/sfx_impact_secondary_block_01.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:1bf1cdfc4f9bf89928f94fba5b314576505b63be63f0f51b2857f2f7fa3c4e7a\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/impacts/sfx_impact_secondary_block_02.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:4b1c604e88462ea7cb419cc59aeea14e7e85dccbb0f34775ebe3b1d085ac30a1\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/impacts/sfx_impact_secondary_block_03.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:5f6decb8de7585619fd12a51ff9143e4cc0d0cdaa4c29251d953075ec8461f13\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/impacts/sfx_impact_secondary_block_04.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:388306dc74efc7cfbe22e4519635332d621133ac47daf91f433ffe6d85da5ab5\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/impacts/sfx_impact_secondary_block_05.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:4d12f15c9ab424b4ec5a0b62c61b4cbe574795f29737c06143e3907e20c22275\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/impacts/sfx_impact_secondary_block_06.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:da46fa6bccaa2960263bbda1204210a1b64b73d3de15b028ebc02333fe7eca27\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/impacts/sfx_impact_secondary_block_07.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:59e4866391a9321a713ae1a98f0690a121666d508775160fc4393e602c5f6cca\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/impacts/sfx_impact_secondary_block_08.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:cc7d95a24185342728913aef8f08248a5a80f40bf5c5306a4c31849510fdf482\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/impacts/sfx_impact_secondary_block_09.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:0450e4e94724af41df543aff6656da566d8e8565dda267b428207ebdcbad9108\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/impacts/sfx_impact_secondary_block_10.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:f3c9df420ac2e410031f394c5942c9785081b1e128ffaecf2f59ac33af3c69fd\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/impacts/sfx_impact_secondary_block_11.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:4ca7163f0abdd9a17ec71eb907aca2273774f0d997df26e0351543988b0636fb\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/impacts/sfx_impact_secondary_block_12.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:679b16faadd419a792ba4e37e32935c9620c8c7c0500a60aed132fbe5dd0ca09\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/impacts/sfx_impact_secondary_block_13.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:234096a925df53199d57c3d2a8cab3d8eb68ad7cb6d1182affb06e5eb13d2a44\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/impacts/sfx_impact_secondary_block_Cue.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:880d452734472b35c3463209b2cbeebea27ccdfed1f039e2ac0d107b19a092be\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/laser/LaserSound.uasset",
    "chars": 129,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:64a611c5eb7065b1b4428957a6ea5d67ce0dbcb9774bb6744232b7bdc11c8421\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/laser/sfx_laser_end.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:09d282ba8ca20e06fbaeccbe4efeedc68c90bb67d01795f867959dc2afce1312\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/laser/sfx_laser_lp.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:3b62e80c18f39438f0be03d7923b94206a0ae96a7d8d4140da60b94a82f9a515\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/laser/sfx_laser_start.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:18c1bb23a20cf98917e72a067a7234256b78133655e2065bb9589e77bed0684d\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/mus_showcase_hands01.uasset",
    "chars": 133,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:8cac4df454ab7e5ec71671950148129e614bc27de9c3c7cef92d62963a2de38a\ns"
  },
  {
    "path": "Content/HandGameplay/Audio/sfx_ambient_outdoor_forest_ambix.uasset",
    "chars": 133,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:7e85a9b706e63552e98e5b84381b410223eb6c69ee6b50213c42cc9d2f8c79a5\ns"
  },
  {
    "path": "Content/HandGameplay/Blueprints/HandsCharacter.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:4871e75eb2308c491e320f8fe4b0f704c1afeae43a934d67bb3449afc45558a7\ns"
  },
  {
    "path": "Content/HandGameplay/Blueprints/HandsGameMode.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:a71313d9a1c73496b14fc115426a21922a4412a1ee91027b1923a9e4b7bc2dd1\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/DustMotes/DustMotes_mat.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:0b57e575286cb77fdf3432392fe72d265dda2a5c57133fbbef80581e55a7c742\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/DustMotes/DustMotes_system.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:790bc72151f44604020e0c23d6f8514005023d0d1f7a3eaf931962b619a701ef\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/DustMotes/DustMotes_vfx.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:5f0bc288750ae2cf9eaddfbaeb00ef2fb54a2ba03952c763346990753bcbbcf6\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/DustMotes/T_Epic_sub_dustParticle.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:a5e5b2b4fee995be51884405dfe667a5d0d22da0ff4141c38d28ca59486ada19\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/DustMotes/vfxm_Dust.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:381c95e433bd9090d5af77e83e4ca4613b99f41b8e1adf9421328cc075906124\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/DustMotes/vfxm_GradientCircle.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:52b49b3f3069e7cec68ef7684defbadd4d5a1ace9a4635befaf09f14de4757f9\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/DustMotes/vfxm_GradientCircle_Inst.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:e657cf3213a2d9483a4a5d7a34171808de8e2979f277df44774e522c95783e98\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/EnvMatParms.uasset",
    "chars": 129,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:ca178d89f6d9f0498998a502f84c4cd581409b85954accac4cfe5d44196609e4\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/HT_cube_Tex.uasset",
    "chars": 133,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:08bbb2ab01456d61878518b53c0e6a2bbf9af202c7b507c6457f41088b2d43e5\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/snow_envi/materials/front_rock_snow_bc.uasset",
    "chars": 132,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:baa2f367209dde9f4e46d460d859ffce0a4d33dc23500b03387025942f804bf1\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/summer_envi/back_wall_bc.uasset",
    "chars": 132,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:c902e85b67af6d2cd99a5bad91fd479b4019fc2c432fdf62a1ca65fdaa04074d\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/summer_envi/back_wall_mat.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:b7ce974ef29b45d8057886ad362204e46368008e8251f5fd5be7344ad2718048\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/summer_envi/back_wall_sm.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:90740901bf42d83576dd7a26d3f9ef9056e6ddf6debf867b25ad30e52484cebc\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/summer_envi/cieling_bc.uasset",
    "chars": 132,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:30f503a452aaa88c690e11d2c97e5a9484ee6968cbcb5002010401e2f7445c86\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/summer_envi/cieling_mat.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:5a7126c3a42f491ac1d7817fec8c6e54a22149118f63dbe06d137cc2f679dadb\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/summer_envi/cieling_sm.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:b354f382457e82b44a0ab155312f0f4325f9690fdd1e71a2b8927270757f5a09\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/summer_envi/cloud.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:80f38f5943a40ad9e0905d7a17c83460d5c3db4ede8e1ea7fd74ef4b57d12eba\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/summer_envi/cloud_sm.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:a4ba8c1172c2f1fbd713523780fd5c0afac7f04d43f4d69e54662738971c91eb\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/summer_envi/clouds_bc.uasset",
    "chars": 132,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:17c542e80cc6c53706b6cb9fd8109b342e2e4be5eebd39a04c61236d03af6b36\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/summer_envi/collision.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:6701718b9264456e2dab0f07b31fb5ee775cecb8b1c6c34a9d168420e718c7d3\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/summer_envi/front_rock_bc.uasset",
    "chars": 132,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:801cab027ce8e7aee8027265865a22365ad254c8e7aff707b7274e6a5419e90a\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/summer_envi/front_rock_mat.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:7b0067ced418dd4b5f864e379cfd5b77849a659fa16ae6fc1e4912a25b458fd4\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/summer_envi/front_rock_sm.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:3aaff68e03a00c02d06ef932e4aeb6c4b5e206f66c74feb055c729ddb3956e93\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/summer_envi/front_statue_bc.uasset",
    "chars": 132,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:4dbfe761d9130aec0383bc7c45e5e4ccef4b8e9ae00308fb4e627f111fb5654e\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/summer_envi/front_statue_mat.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:96c313008f0bd1a2e80f07d48cbbe91a074b0f6ca88aaa6c0533ed6d4b4d6fb8\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/summer_envi/front_statue_sm.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:e17241fc5fd27964e71773d8e5294609077f4b766d020cdcfd0da0d51ee974fd\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/summer_envi/grass_bc.uasset",
    "chars": 132,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:c6b73bcd76fce0f7ec32f5288db40970cbf72719606e9abb5baadaf92a65ac92\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/summer_envi/grass_mat.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:bc4dbb177cb2a909979699381ef3e7a3b32d2473b71453c8b9947c06f3b3c04c\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/summer_envi/grass_sm.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:e9601ad317b3220937f78a66e4b5ebd68f100e111255c0140738635a5c2c68b3\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/summer_envi/left_wall_bc.uasset",
    "chars": 132,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:7129dcd59dc43c7dbc5ce39260bbd2befe6ef36ff2b02e2704a7214a05778ea1\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/summer_envi/left_wall_mat.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:12a70a31bb78083ae856811bd588c762950d718c6d77d332196d0c8fbbdef9fc\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/summer_envi/left_wall_sm.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:598d63e3ac2943e70e28ce02dd4cdc4b83a321d71c09a13d1d85e688b4cf59d8\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/summer_envi/main_floor_bc.uasset",
    "chars": 132,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:402e435c4cfcf9535ec4bf11a284d69dbf579b7d22e6bfb4e56991bae4dc9d4d\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/summer_envi/main_floor_mat.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:6ac6712d14e4c6975797273b78278c632003f9bdac15da6081ee902d26f24f5a\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/summer_envi/main_floor_sm.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:31e702b6f9fc44a16d81118fbe12a141f3e9eb4b31a85ab06ccdeabfb982c6de\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/summer_envi/right_wall_bc.uasset",
    "chars": 132,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:17098acc888a0d0fec0585d4eca19aff287bfd1affc39114fb723cd47609e5f5\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/summer_envi/right_wall_mat.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:79319e598a0a81e75a0ecd140ba4f64e843014ab5f0c392a740dcf3ea7d05538\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/summer_envi/right_wall_sm.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:bb7eb1f3fc3fdfafaaed5e7c7e3122278c5a9a79d9379b7513f69952f58744ed\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/summer_envi/vines_bc.uasset",
    "chars": 132,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:8657ebe24ff6867959d9dafd4c66ca147dda405825ca00ffa31bff2bc2837126\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/vfxm_WindFoliage.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:aba24694c700ed06d22b01a1b426e677d954b9f40d2d7e8cfe37503bb40b9713\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/vfxm_WindGrass_Inst.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:4075091fc2884277ae3265b6c4c116ae9780fc1518d4917ccb1590938846bbe3\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/vfxm_WindVines_Inst.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:88384ad7256f73e82b3964b58e815877e928d7cb7df691247481627b4cda2369\ns"
  },
  {
    "path": "Content/HandGameplay/Environment/vfxsm_vinesVtxAlpha.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:1e506290165640ad39a6ae18e87ede4d0e61548f3d5b84b172db290406e0af4e\ns"
  },
  {
    "path": "Content/HandGameplay/Hands/Models/HandMat.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:6219b9c63ee1ab3b0b4675d08b30db656d0febfb61f68b066d1f03ebc8f505cd\ns"
  },
  {
    "path": "Content/HandGameplay/Hands/Models/OculusHand_L.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:e9d5ff1272c22f7d2bf481ca9094e57e088603281b66b17fdb4087a92b45cda8\ns"
  },
  {
    "path": "Content/HandGameplay/Hands/Models/OculusHand_L_Skeleton.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:3bfd455bd71d7e72070815035bb6e042ef8e2a45ad44e88b3a9f971e029d8ef3\ns"
  },
  {
    "path": "Content/HandGameplay/Hands/Models/OculusHand_R.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:3d03d878f090cd0f06bb17510e0a6040b998f9cb3511ac8b81630c80ebb7e815\ns"
  },
  {
    "path": "Content/HandGameplay/Hands/Models/OculusHand_R_Skeleton.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:cd6ad521c2923a9b13bb81a24e2fd5e2cc63250ada54e9c8c2c2c85927459f1d\ns"
  },
  {
    "path": "Content/HandGameplay/Hands/TutorialHand.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:2ac93caef3fa82b4392c6f1929c7af3f6329fe1ff28e39304692bcd47bb1fa00\ns"
  },
  {
    "path": "Content/HandGameplay/Hands/TutorialHandLeft.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:5da72c2cbcd284e2251c3567d5a1965e1a0697be2907cea3ae749e89fd6f643f\ns"
  },
  {
    "path": "Content/HandGameplay/Hands/TutorialHandRight.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:240c9b6594a30c1e582952db71e79964adfb3f4b5115197d80868e8e143e9ee4\ns"
  },
  {
    "path": "Content/HandGameplay/Input/Actions/AvatarLeftSystemGesture.uasset",
    "chars": 129,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:db687a87c065b4da5889c279bbb85bc36e4cad91b95707db1e643bb82e4da4a5\ns"
  },
  {
    "path": "Content/HandGameplay/Input/Actions/LogGestureState.uasset",
    "chars": 129,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:cf62c8e733b90fd4ae2807a286ca6cb695bb95634bb41ad202a13583310d903e\ns"
  },
  {
    "path": "Content/HandGameplay/Input/Actions/LogLeftHand.uasset",
    "chars": 129,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:0bec330b1f1d1c08d7b3701fc8f67f21ac76a043af47a04908b56cba2a7970b9\ns"
  },
  {
    "path": "Content/HandGameplay/Input/Actions/LogRightHand.uasset",
    "chars": 129,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:4ea0afae7721ecaa22a2d57f555261c0da4c1ac5dd87e26c5b994cc76f0f2692\ns"
  },
  {
    "path": "Content/HandGameplay/Input/Actions/TogglePoseRecording.uasset",
    "chars": 129,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:5fdbd587886c526d16b1654bdfe3813445ca582af5448adc7a4d7d31d24008c7\ns"
  },
  {
    "path": "Content/HandGameplay/Input/Actions/TogglePoseRecordingLeft.uasset",
    "chars": 129,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:e05a4a6eb3d46fbe6e918301caab9797bc816222eccb7a1929cb05173c496dac\ns"
  },
  {
    "path": "Content/HandGameplay/Input/Actions/TogglePoseRecordingRight.uasset",
    "chars": 129,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:49061cfaed6bc737b226117849187a5aabd9fba4295d2d6226eca67b9491864e\ns"
  },
  {
    "path": "Content/HandGameplay/Input/InputMappingContext.uasset",
    "chars": 129,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:97a2825de20eb4846b544ac3a94e80cc89e01accaa8639fdd71216109ff58548\ns"
  },
  {
    "path": "Content/HandGameplay/Levels/HandGameplayShowcase.umap",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:07c8e5339550f019e1c79d4660b4ce249fec3b39e5697537167e11aa18815016\ns"
  },
  {
    "path": "Content/HandGameplay/Levels/HandRecognitionShowcaseArt.umap",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:117d793adc535717d693bff0e08f42552fdaf96bcfd39f5a08899d88bd7180d7\ns"
  },
  {
    "path": "Content/HandGameplay/Levels/HandRecognitionShowcaseAudio.umap",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:adf30fae34a9e7df004da751fd6763529d8dc3c7b16c423d2b3396f587037960\ns"
  },
  {
    "path": "Content/HandGameplay/Levels/HandRecognitionShowcaseVFX.umap",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:6299627c430c30e2cc28e28b5c0dd14d3726ee1061c186d9bd2600c7a39e00f6\ns"
  },
  {
    "path": "Content/HandGameplay/Props/Blocks/Blocks001_Throwable_sm.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:400f80d39b38df00cc322fabefdcb1e5665053fb47b72c8339094b96ed759912\ns"
  },
  {
    "path": "Content/HandGameplay/Props/Blocks/Blocks01_bc.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:11d069f39ac48bae24f2b1acb90bf90261733268b6c4b55bda86d1207a7dbdf0\ns"
  },
  {
    "path": "Content/HandGameplay/Props/Blocks/Blocks01_bc_Emissive.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:230f528f6dcf748855b08ad6687c796c2e16a7c74d00be907363c4059c861c6a\ns"
  },
  {
    "path": "Content/HandGameplay/Props/Blocks/Blocks01_nm.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:55e19d90494d33137e9f044d96729702123e9a8ec837161180179b33fd3b0d89\ns"
  },
  {
    "path": "Content/HandGameplay/Props/Blocks/InteractableBrick.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:fe26a7b219c4255ce56765f18d3c0e73f3fad6bd35232401e0d55eceb2efbde4\ns"
  },
  {
    "path": "Content/HandGameplay/Props/Blocks/NS_BrickImpact.uasset",
    "chars": 132,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:9ee79b9bd8d2f29f41e55bc3142c9ef1bcebdf9ae7a4901de5debf458ea93614\ns"
  },
  {
    "path": "Content/HandGameplay/Props/Blocks/T_Epic_SUB_UV_Small_Rocks.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:398b9586620051eb4eb594a89d885580287b8df4e1ea4dd142455f6a88daafe7\ns"
  },
  {
    "path": "Content/HandGameplay/Props/Blocks/vfxm_Blocks01_Throwable.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:c3e37b2c1fbe3438dfc64c7c80d17b786774ef16e156ef5edf8397eaa3b3d78f\ns"
  },
  {
    "path": "Content/HandGameplay/Props/Blocks/vfxm_Blocks01_Throwable_Inst.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:35ded812adb41a0d1156c11fdaafd91a718e0c139d7040b12d287b022115a9a0\ns"
  },
  {
    "path": "Content/HandGameplay/Props/Blocks/vfxm_ParticleSpriteUnlitSubUV.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:1c0eb5ad0e0562ba7a3a8e45635669050d88fd9c9a36bf9464fd0b1c37cbd145\ns"
  },
  {
    "path": "Content/HandGameplay/Props/Button/PushButtonBP.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:96054da4ed1469b8b1e3488aa649caf8187cdc93b4e4d33d8ae4ab7cac42658d\ns"
  },
  {
    "path": "Content/HandGameplay/Props/Button/SFX/GameConsole_button_press_in_01.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:e6b03d935a18205e06a46a9c5529da3bb331ddcda0032db317eacb15568f9c04\ns"
  },
  {
    "path": "Content/HandGameplay/Props/Button/SFX/GameConsole_button_press_out_04.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:ca9d8977d512d6008e945d014abb37ccbdcc1f8002ba5a357f094e6dcc5b62b1\ns"
  },
  {
    "path": "Content/HandGameplay/Props/Button/ToggleButtonBP.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:83a1ddf8dd873ac663b3f2ded9debbc012bec912b4ca61c9a2ac0fc202e93f1a\ns"
  },
  {
    "path": "Content/HandGameplay/Props/Button/testbutton_sm.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:2937db3174474c119042cec9b802a6c6af41365998f3c26963ef5e58249b5b0a\ns"
  },
  {
    "path": "Content/HandGameplay/Props/RingWeapon/2HandedBeamProp_Mesh.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:dccb18897ebeecba8cfddf6722e4e1dd7e15ed7bdb10c27bdf4d11fc22ca3fae\ns"
  },
  {
    "path": "Content/HandGameplay/Props/RingWeapon/InteractableArtefactHandle.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:c1bd40c9c5640ff847874f06a51c53a8f503ad8666fb6333c2f5ab29043cbbec\ns"
  },
  {
    "path": "Content/HandGameplay/Props/RingWeapon/InteractableTwoHandedArtefact.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:44baf3b7ad3dbec11623e8aaefb097b87cb72e72848f7d7af0c2e090f92bf444\ns"
  },
  {
    "path": "Content/HandGameplay/Props/RingWeapon/TwoHandArtefact_StartBeam.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:54fe03d0134e0eef428b5b742e76b4ff06dd0f8cffe38982a99ab1edc957f407\ns"
  },
  {
    "path": "Content/HandGameplay/Props/RingWeapon/TwoHandedBeamSystem.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:3c945eeb2e333e3f2abf4061b754b61d40a25435471f6a36842181fdb2f90031\ns"
  },
  {
    "path": "Content/HandGameplay/Props/RingWeapon/vfxm_2HandedBeamProp.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:e64d98e9fc6a558f9441454c48a616a583b085c07050689ef3120c30da3b67d2\ns"
  },
  {
    "path": "Content/HandGameplay/Props/RingWeapon/vfxm_OrbFloating.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:9ceb862c2a51374ba5bdb8235a9bb61b7b2ec57674ec3b18fcc0b7fc55bbbdc1\ns"
  },
  {
    "path": "Content/HandGameplay/Props/RingWeapon/vfxm_TwoHandedArtefactBeam.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:daf831d5e14cb4c01178afbf354c8c2ef13da010d29c43a437df52421c2bb272\ns"
  },
  {
    "path": "Content/HandGameplay/Props/RingWeapon/vfxm_TwoHandedArtefactBeam_Inst.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:afc44e2fdae94a4ff70eaa5a7023d1d9eb8b509329912d2402c3a700ae814c00\ns"
  },
  {
    "path": "Content/HandGameplay/Props/Table/table_bc.uasset",
    "chars": 132,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:e8f4e092d9e979fa974073fbda3e3a85bc625ebbaa6badae2d5646f8a51107e8\ns"
  },
  {
    "path": "Content/HandGameplay/Props/Table/table_mat.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:2ee811fdfef12013624d479c0710e8c2f1c35057081889265a7783ca71569837\ns"
  },
  {
    "path": "Content/HandGameplay/Props/Table/table_sm.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:05e7df80416abb00f0f907278722785ba6dd1f63c70baa037bf39c4f717d8854\ns"
  },
  {
    "path": "Content/HandGameplay/Props/Target/TargetBP.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:489e960fea29eee0a5cdfdae2af6ad98429e21b83a5ecb57c307551d5ca600dd\ns"
  },
  {
    "path": "Content/HandGameplay/Props/Target/sfx_spinning_target_01_loop.uasset",
    "chars": 132,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:0c6f7b263811dce4f7ba17c113776cf47f89b2a21c3f6770f2ffc52db455806a\ns"
  },
  {
    "path": "Content/HandGameplay/Props/Target/target_m.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:0f90611a4b3546bfbe3301812624af3dfcb7e1045bf7ef17439eecf11bace8f0\ns"
  },
  {
    "path": "Content/HandGameplay/Props/Target/target_pentagon_sm.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:40810460e0acd422e7f79bdc76b0f112b4fd32502fcfc35009a44895d16c6e2e\ns"
  },
  {
    "path": "Content/HandGameplay/Props/Target/targets_bc.uasset",
    "chars": 132,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:d3c3a8e05f71a62586c6e3ebbebebb750968d28276d524d6b73e1cc3c0f02c0d\ns"
  },
  {
    "path": "Content/HandGameplay/Props/Target/targets_em.uasset",
    "chars": 132,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:2013bdb1db3c56115fca9bf3d8b6fc665fb6e0a055a2f431f7b3c8d437a9e0d3\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TeleportBeacon/Activate_vfx.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:f5e5063e39d93d5186a072e59cb7da62b4305da0ffcfc97594da5314d8172a06\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TeleportBeacon/NS_Activate.uasset",
    "chars": 132,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:ff6745c9df34b10b024daffc552deb880712f9abe7299bafa2f62aa0baee79dc\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TeleportBeacon/TeleportBeacon.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:4fb8c9859a53a30bc3b58b9d16b9af7a0ecb29c1fecb7eaa39a0baa28c674458\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TeleportBeacon/TeleportationPad.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:b33f746beb7471a7d51b772c0a0f8bda81df64b64935b3c0e8768e09ac458182\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TeleportBeacon/TeleportationPadMesh.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:3352cb0e602349b25be96f31a176edbd2a1210ca99c56e9e7bf54f11186f946c\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TeleportBeacon/vfxm_ActivateGlow_Inst.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:d16ea1baab686e825db506f5fd3c68ee6ca5ff70c41f6dac1ae68b23d0ff14ae\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TeleportBeacon/vfxm_AlphaPanner.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:81ce8e1f1bf4edcee75faa6f7c4859328d56762459861f6e7b485dc24ca9a78a\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TeleportBeacon/vfxm_TeleportBeaconPointerArrow.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:305a011c5d554a9d31a16abefa2329d658cfd5f61d3de7606196d554588318ae\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TeleportBeacon/vfxmi_TeleportBeacon.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:391b9f9f78709f79e952028b104e19fc1001c468a5ad10953a357399fdd62cfd\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TeleportBeacon/vfxmi_TeleportPointerArrowRing.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:655832a84c389743614cfeb4a940fca36f2e36265843667c94820a721816f4a0\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TeleportBeacon/vfxsm_TeleportBeacon.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:e57765522db7755917a7065be479277f5f29136a1ff5753d7b30cba823aea8d0\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TeleportBeacon/vfxsm_TeleportPointerArrowRing.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:ac19002af2dd2c8195bb367b2364f7d0c95590d0c6a188f539ff9697e0ef74a3\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TetherBall/Art/ball_bc.uasset",
    "chars": 132,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:c738d56d7c0aa6f3bfb999f7675dc1164e647f306e25bd9e5983bf6ce4ca2d97\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TetherBall/Art/ball_mat.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:fa16847b663305a08a1dc76f5f67b11c7e61351da8260dfc6f9b5b4f8eea259e\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TetherBall/Art/ball_sm.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:8bb4bc79fd6fe522eaa4879f07631230aa55e337103849f7938717f1356c292e\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TetherBall/Art/tether_ball_base.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:ed7f9002f59b8e0a40025addd009ebf0887e86d55d9d35c3b590bf54373e059e\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TetherBall/Art/tether_ball_base_mat.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:cd91b5084903baf8a0a6efe2d947cc56543c37f2dca855ce43c94a4c0392c2f0\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TetherBall/Art/tether_ball_base_sm.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:7cc3f92bc854e0019cb4b912527a16e8ac0df97f378acee9a45f07b350fcfcd6\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TetherBall/Art/tether_mat.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:2e09393041414955f2180675afffe0851f1fd35c56d4a169f633e799fa865e85\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TetherBall/SFX/TetherBallHit.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:3a8704b2611d072bbe8b50d5bfb27edf3971bc544d223b1a40558aacfd86d7de\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TetherBall/SFX/TetherBallSoundConcurrency.uasset",
    "chars": 129,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:622ee5df7d8e40c606792c2ca659a94263d6652e0fc98e64d9871a4f00f2116e\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TetherBall/SFX/TetherBall_RubberThick_Imp_01.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:4d62109799fb674d78162e53011364ccce82423aa10bf1c688dc3f60252c57ba\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TetherBall/SFX/TetherBall_RubberThick_Imp_02.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:dcadb7b0591413a37ba76c9717196dee27dc56caa6af26ffeacd3aedd183671a\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TetherBall/SFX/TetherBall_RubberThick_Imp_03.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:026dd90f3857c99e8f4e6fdcd3a0616aabea03cb067971090e63f26b2be0d4e4\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TetherBall/SFX/TetherBall_RubberThick_Imp_04.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:4ea7141b208fffaa22ba03276833ad9e17c61a0f2608f2da0179196081545092\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TetherBall/SFX/TetherBall_RubberThick_Imp_05.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:e726ebddfd66dbf5f9f8100b80f984e42be59715a92da8ed3fb8c0c5fce24e01\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TetherBall/SFX/TetherBall_RubberThick_Imp_06.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:a877d19496c02e40cdbfbec6b1f1e9d155f0c1c105046ae3253eb0df06bcd1eb\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TetherBall/SFX/TetherBall_RubberThick_Imp_07.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:5b8910e973a1db85ba729aff9a38ee42ac23b17df628ee4914935ea89d694c77\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TetherBall/SFX/TetherBall_RubberThick_Imp_08.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:2ef4387350baa1ee0b82432080ad64616413becffd7d7a135fde13f92f1867d1\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TetherBall/SFX/TetherBall_RubberThick_Imp_09.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:02a2de4ddfd2caca2f16ec72b1c0fdccfa0a90a66fe8abb6694645ad75cab26f\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TetherBall/TetherBallBP.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:a18056945e3328042cbf984ab8551b66c4160a003a5d0a147e85130a692482ab\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TetherBall/ThetherBallPhysMat.uasset",
    "chars": 129,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:d0cb195b43e06d51342ac25f054f5785d2297c2b065e21a5361a9180cf6b6083\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TetherBall/VFX/spawn_tetherballBase_ps.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:ffbb463f7c2c0efcbd1d33797ac6f1726b76f0f7ecaab705ff8b63b785b5b806\ns"
  },
  {
    "path": "Content/HandGameplay/Props/TetherBall/tether_ball_sm.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:8eb309b42c11125e98086c44b90a212db8287902645446cf6b8a5b57b55da609\ns"
  },
  {
    "path": "Content/HandGameplay/SharedArt/Blue.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:4d29c50208c87b00d2442ba40ec3bb323115988b1017db0350a94715671bd720\ns"
  },
  {
    "path": "Content/HandGameplay/SharedArt/FlatBlue.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:4adf7a3032a3f8b0b41679d9f58a37902a400eab565d8189ff9c14371e93d14e\ns"
  },
  {
    "path": "Content/HandGameplay/SharedArt/Red.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:ba3bd8c301cf90755b3516af72f17c786d3fc10c356ec1364ada32cfb241e5a3\ns"
  },
  {
    "path": "Content/HandGameplay/SharedArt/T_Caustic01.uasset",
    "chars": 132,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:c579f1a4402b4aaa42b6f080aa6acce3bebb9808e44bd53c61b7cc5d0aa4dbee\ns"
  },
  {
    "path": "Content/HandGameplay/SharedArt/T_WorleyNoise01.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:31bc66ed0c48b42be7b627b057dfd357b491fc6bedd5ec8bb13a13cc9b1f8ae6\ns"
  },
  {
    "path": "Content/HandGameplay/SharedArt/TextBackground.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:ceb8c1e3729c63698365449612b9c8da558cea0e5adb96a99020247afda4bd55\ns"
  },
  {
    "path": "HandGameplay.uproject",
    "chars": 728,
    "preview": "{\n\t\"FileVersion\": 3,\n\t\"EngineAssociation\": \"\",\n\t\"Category\": \"\",\n\t\"Description\": \"\",\n\t\"Modules\": [\n\t\t{\n\t\t\t\"Name\": \"HandGa"
  },
  {
    "path": "LICENSE",
    "chars": 1086,
    "preview": "MIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any pers"
  },
  {
    "path": "Platforms/HoloLens/Config/HoloLensEngine.ini",
    "chars": 1069,
    "preview": "\n\n[/Script/HoloLensPlatformEditor.HoloLensTargetSettings]\nbBuildForEmulation=False\nbBuildForDevice=True\nbUseNameForLogo="
  },
  {
    "path": "Plugins/OculusHandTools/.gitattributes",
    "chars": 254,
    "preview": "*.a filter=lfs diff=lfs merge=lfs -text\n*.lib filter=lfs diff=lfs merge=lfs -text\n*.uasset filter=lfs diff=lfs merge=lfs"
  },
  {
    "path": "Plugins/OculusHandTools/.gitignore",
    "chars": 906,
    "preview": "# Visual Studio 2015 user specific files\n.vs/\n\n# Compiled Object files\n*.slo\n*.lo\n*.o\n*.obj\n\n# Precompiled Headers\n*.gch"
  },
  {
    "path": "Plugins/OculusHandTools/Config/FilterPlugin.ini",
    "chars": 359,
    "preview": "[FilterPlugin]\n; This section lists additional files which will be packaged along with your plugin. Paths should be list"
  },
  {
    "path": "Plugins/OculusHandTools/Content/BlueprintMacros.uasset",
    "chars": 130,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:fd8a267cc165f554ad3caca177326a8ffdc8d28f0e465eda99986f44474f955b\ns"
  },
  {
    "path": "Plugins/OculusHandTools/Content/Button/IsButtonableInterface.uasset",
    "chars": 129,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:bbc6041451dbced11619631f508c5bba488a8c751c6807027058155431a77e34\ns"
  },
  {
    "path": "Plugins/OculusHandTools/Content/Button/PushButtonBaseBP.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:bc31619c51f959dd3d66f795acdb4b2278cecd65fe431b45bcd54c76cfa7010d\ns"
  },
  {
    "path": "Plugins/OculusHandTools/Content/Fonts/OculusSans-Black.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:32771fd4caa2a3602a864be461f4648c71c44a6525ba97cfb3f90204b77d1b1e\ns"
  },
  {
    "path": "Plugins/OculusHandTools/Content/Fonts/OculusSans-BlackItalic.uasset",
    "chars": 131,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:478864f05f6d4be2278d511f832853bcc9e9ee22f8fcf3703e6bec9fc6ef29a2\ns"
  },
  {
    "path": "Plugins/OculusHandTools/Content/Fonts/OculusSans-BlackItalic_Font.uasset",
    "chars": 129,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:47c5b118bf8405524375bbcacfb6910b90c110f4ec8272f47cf6437048f50ab7\ns"
  },
  {
    "path": "Plugins/OculusHandTools/Content/Fonts/OculusSans-Black_Font.uasset",
    "chars": 129,
    "preview": "version https://git-lfs.github.com/spec/v1\noid sha256:ceb0a59d1241f49c24fbd1c8b1511ddeca5f630195be570de617f55655ff652c\ns"
  }
]

// ... and 134 more files (download for full content)

About this extraction

This page contains the full source code of the oculus-samples/Unreal-HandGameplay GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 334 files (314.4 KB), approximately 102.5k tokens, and a symbol index with 80 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!