From a17764e307dd8b8baee1950a06a610b9a8f7e629 Mon Sep 17 00:00:00 2001 From: "DESKTOP-S4BOTN2\\user" Date: Tue, 17 Jun 2025 23:40:17 +0900 Subject: [PATCH] =?UTF-8?q?ADD=20:=20=EB=A1=9C=EC=BD=94=EC=BD=94=20?= =?UTF-8?q?=EC=9E=A5=EA=B0=91=20=EA=B8=B0=EB=8A=A5=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Y Bot.Materials/Alpha_Body_MAT.asset | 4 +- .../Y Bot.Materials/Alpha_Joints_MAT.asset | 4 +- .../Editor/OptitrackSkeletonAnimatorEditor.cs | 4 +- .../Prefabs/BaseAvatar - OptiTrack.prefab | 4 +- .../OptiTrack/Scripts/OptitrackRigidBody.cs | 8 +- .../OptitrackSkeletonAnimator_Mingle.cs | 86 +- Assets/External/Rokoko.meta | 8 + Assets/External/Rokoko/Art.meta | 8 + Assets/External/Rokoko/Art/Fonts.meta | 8 + .../Art/Fonts/proximanova-bold-webfont.ttf | Bin 0 -> 34352 bytes .../Fonts/proximanova-bold-webfont.ttf.meta | 28 + .../Art/Fonts/proximanova-regular-webfont.ttf | Bin 0 -> 33604 bytes .../proximanova-regular-webfont.ttf.meta | 29 + Assets/External/Rokoko/Art/Icons.meta | 8 + .../Art/Icons/RokokoIconAtlas.spriteatlas | 52 + .../Icons/RokokoIconAtlas.spriteatlas.meta | 15 + .../Art/Icons/rokoko-bg-border-radius-1px.png | 3 + .../rokoko-bg-border-radius-1px.png.meta | 123 ++ .../Icons/rokoko-direction-indicator-256.png | 3 + .../rokoko-direction-indicator-256.png.meta | 135 ++ .../Art/Icons/rokoko-icon-broadcast-32.png | 3 + .../Icons/rokoko-icon-broadcast-32.png.meta | 123 ++ .../Art/Icons/rokoko-icon-input-gloves-32.png | 3 + .../rokoko-icon-input-gloves-32.png.meta | 123 ++ .../Art/Icons/rokoko-icon-profile-32.png | 3 + .../Art/Icons/rokoko-icon-profile-32.png.meta | 123 ++ .../Rokoko/Art/Icons/rokoko-icon-prop-32.png | 3 + .../Art/Icons/rokoko-icon-prop-32.png.meta | 123 ++ .../Art/Icons/rokoko-icon-record-32.png | 3 + .../Art/Icons/rokoko-icon-record-32.png.meta | 123 ++ .../Art/Icons/rokoko-icon-restart-32.png | 3 + .../Art/Icons/rokoko-icon-restart-32.png.meta | 123 ++ .../Art/Icons/rokoko-icon-row-face-32.png | 3 + .../Icons/rokoko-icon-row-face-32.png.meta | 123 ++ .../Art/Icons/rokoko-icon-row-suit-32.png | 3 + .../Icons/rokoko-icon-row-suit-32.png.meta | 123 ++ .../Art/Icons/rokoko-icon-stop-white-32.png | 3 + .../Icons/rokoko-icon-stop-white-32.png.meta | 123 ++ .../Art/Icons/rokoko-icon-straightpose-32.png | 3 + .../rokoko-icon-straightpose-32.png.meta | 123 ++ .../Art/Icons/rokoko-icon-unicast-32.png | 3 + .../Art/Icons/rokoko-icon-unicast-32.png.meta | 123 ++ Assets/External/Rokoko/Art/Materials.meta | 8 + .../Materials/Rokoko_FaceHead_Material.mat | 77 + .../Rokoko_FaceHead_Material.mat.meta | 16 + .../Art/Materials/Rokoko_Floor_Material.mat | 89 + .../Materials/Rokoko_Floor_Material.mat.meta | 15 + .../Materials/Rokoko_GroundArrow_Material.mat | 91 + .../Rokoko_GroundArrow_Material.mat.meta | 16 + .../Rokoko_GroundMarker_Material.mat | 91 + .../Rokoko_GroundMarker_Material.mat.meta | 16 + .../Materials/Rokoko_Invisible_Material.mat | 78 + .../Rokoko_Invisible_Material.mat.meta | 15 + .../Materials/Rokoko_NewtonJoint_Material.mat | 77 + .../Rokoko_NewtonJoint_Material.mat.meta | 15 + .../Materials/Rokoko_NewtonMain_Material.mat | 77 + .../Rokoko_NewtonMain_Material.mat.meta | 15 + .../Art/Materials/Rokoko_Prop_Material.mat | 77 + .../Materials/Rokoko_Prop_Material.mat.meta | 15 + Assets/External/Rokoko/Art/Meshes.meta | 8 + Assets/External/Rokoko/Art/Meshes/Newton.meta | 8 + .../Art/Meshes/Newton/Rokoko_Newton.FBX | 3 + .../Art/Meshes/Newton/Rokoko_Newton.FBX.meta | 1743 +++++++++++++++++ .../Rokoko/Art/Meshes/NewtonFace.meta | 8 + .../Meshes/NewtonFace/Rokoko_Newtonface.FBX | 3 + .../NewtonFace/Rokoko_Newtonface.FBX.meta | 139 ++ Assets/External/Rokoko/Art/Shaders.meta | 8 + ...ko_RoundTransparentGridFloor_Shader.shader | 115 ++ ...undTransparentGridFloor_Shader.shader.meta | 16 + Assets/External/Rokoko/Art/Textures.meta | 8 + .../Rokoko/Art/Textures/rokoko-floor-2048.png | 3 + .../Art/Textures/rokoko-floor-2048.png.meta | 123 ++ .../Rokoko/Art/Textures/rokoko-gray-16.jpg | 3 + .../Art/Textures/rokoko-gray-16.jpg.meta | 99 + Assets/External/Rokoko/EditorScripts.meta | 8 + .../External/Rokoko/EditorScripts/Editor.meta | 8 + .../EditorScripts/Editor/ActorEditor.cs | 242 +++ .../EditorScripts/Editor/ActorEditor.cs.meta | 18 + .../EditorScripts/Editor/ActorNewtonEditor.cs | 13 + .../Editor/ActorNewtonEditor.cs.meta | 18 + .../Editor/BlendShapesMappingEditor.cs | 100 + .../Editor/BlendShapesMappingEditor.cs.meta | 18 + .../EditorScripts/Editor/CharacterEditor.cs | 109 ++ .../Editor/CharacterEditor.cs.meta | 18 + .../Rokoko/EditorScripts/Editor/FaceEditor.cs | 111 ++ .../EditorScripts/Editor/FaceEditor.cs.meta | 18 + .../Editor/HumanBoneMappingEditor.cs | 88 + .../Editor/HumanBoneMappingEditor.cs.meta | 18 + .../EditorScripts/Editor/PropColorEditor.cs | 44 + .../Editor/PropColorEditor.cs.meta | 18 + .../Rokoko/EditorScripts/Editor/PropEditor.cs | 43 + .../EditorScripts/Editor/PropEditor.cs.meta | 18 + .../EditorScripts/Editor/TweakableEditor.cs | 44 + .../Editor/TweakableEditor.cs.meta | 18 + .../EditorScripts/RokokoEditorScripts.asmdef | 18 + .../RokokoEditorScripts.asmdef.meta | 14 + Assets/External/Rokoko/Prefabs.meta | 8 + Assets/External/Rokoko/Prefabs/Actors.meta | 8 + .../Rokoko/Prefabs/Actors/Newton.prefab | 3 + .../Rokoko/Prefabs/Actors/Newton.prefab.meta | 14 + .../Actors/Newton_CustomSkeleton.prefab | 3 + .../Actors/Newton_CustomSkeleton.prefab.meta | 14 + .../Prefabs/Actors/Newton_NoFace.prefab | 3 + .../Prefabs/Actors/Newton_NoFace.prefab.meta | 14 + .../Rokoko/Prefabs/Actors/Prop.prefab | 3 + .../Rokoko/Prefabs/Actors/Prop.prefab.meta | 14 + Assets/External/Rokoko/Prefabs/UI.meta | 8 + .../Rokoko/Prefabs/UI/CommandAPI.prefab | 3 + .../Rokoko/Prefabs/UI/CommandAPI.prefab.meta | 15 + .../Rokoko/Prefabs/UI/Hierarchy_UI.prefab | 3 + .../Prefabs/UI/Hierarchy_UI.prefab.meta | 14 + .../Rokoko/Prefabs/UI/PlaybackRow.prefab | 3 + .../Rokoko/Prefabs/UI/PlaybackRow.prefab.meta | 14 + Assets/External/Rokoko/Scared_mixamo.fbx | 3 + Assets/External/Rokoko/Scared_mixamo.fbx.meta | 878 +++++++++ Assets/External/Rokoko/Scenes.meta | 8 + .../Scenes/RokokoPluginExampleScene.unity | 3 + .../RokokoPluginExampleScene.unity.meta | 15 + ...okokoPluginExampleScene_CustomActors.unity | 3 + ...PluginExampleScene_CustomActors.unity.meta | 15 + ...ExampleScene_CustomActorsSettings.lighting | 64 + ...leScene_CustomActorsSettings.lighting.meta | 15 + ...koPluginExampleScene_CustomCharacter.unity | 3 + ...ginExampleScene_CustomCharacter.unity.meta | 14 + ...koPluginExampleScene_DriftCorrection.unity | 3 + ...ginExampleScene_DriftCorrection.unity.meta | 14 + Assets/External/Rokoko/Scripts.meta | 8 + Assets/External/Rokoko/Scripts/Core.meta | 8 + .../Rokoko/Scripts/Core/ARKitBlendshapes.cs | 66 + .../Scripts/Core/ARKitBlendshapes.cs.meta | 18 + .../Rokoko/Scripts/Core/CommandAPI.meta | 9 + .../Core/CommandAPI/CalibrateRequestData.cs | 63 + .../CommandAPI/CalibrateRequestData.cs.meta | 18 + .../Core/CommandAPI/InfoRequestData.cs | 30 + .../Core/CommandAPI/InfoRequestData.cs.meta | 18 + .../Core/CommandAPI/LivestreamRequestData.cs | 23 + .../CommandAPI/LivestreamRequestData.cs.meta | 18 + .../Core/CommandAPI/PlaybackRequestData.cs | 43 + .../CommandAPI/PlaybackRequestData.cs.meta | 18 + .../Core/CommandAPI/RecordingRequestData.cs | 30 + .../CommandAPI/RecordingRequestData.cs.meta | 18 + .../Scripts/Core/CommandAPI/RequestData.cs | 21 + .../Core/CommandAPI/RequestData.cs.meta | 10 + .../Core/CommandAPI/ResetActorRequestData.cs | 21 + .../CommandAPI/ResetActorRequestData.cs.meta | 18 + .../Core/CommandAPI/StudioCommandAPI.cs | 188 ++ .../Core/CommandAPI/StudioCommandAPI.cs.meta | 10 + .../Core/CommandAPI/StudioCommandAPIBase.cs | 151 ++ .../CommandAPI/StudioCommandAPIBase.cs.meta | 10 + .../Core/CommandAPI/TrackerRequestData.cs | 75 + .../CommandAPI/TrackerRequestData.cs.meta | 18 + .../Scripts/Core/JsonLiveSerializerV3.cs | 266 +++ .../Scripts/Core/JsonLiveSerializerV3.cs.meta | 18 + .../Rokoko/Scripts/Core/LZ4Wrapper.cs | 79 + .../Rokoko/Scripts/Core/LZ4Wrapper.cs.meta | 18 + .../Rokoko/Scripts/Core/StudioReceiver.cs | 68 + .../Scripts/Core/StudioReceiver.cs.meta | 18 + .../Rokoko/Scripts/Core/UDPReceiver.cs | 109 ++ .../Rokoko/Scripts/Core/UDPReceiver.cs.meta | 18 + Assets/External/Rokoko/Scripts/Mono.meta | 8 + .../External/Rokoko/Scripts/Mono/Inputs.meta | 8 + .../Rokoko/Scripts/Mono/Inputs/Actor.cs | 510 +++++ .../Rokoko/Scripts/Mono/Inputs/Actor.cs.meta | 18 + .../Rokoko/Scripts/Mono/Inputs/ActorNewton.cs | 91 + .../Scripts/Mono/Inputs/ActorNewton.cs.meta | 18 + .../Scripts/Mono/Inputs/BlendShapesMapping.cs | 13 + .../Mono/Inputs/BlendShapesMapping.cs.meta | 18 + .../Rokoko/Scripts/Mono/Inputs/Character.cs | 183 ++ .../Scripts/Mono/Inputs/Character.cs.meta | 18 + .../Rokoko/Scripts/Mono/Inputs/Face.cs | 111 ++ .../Rokoko/Scripts/Mono/Inputs/Face.cs.meta | 18 + .../Scripts/Mono/Inputs/HumanBoneMapping.cs | 11 + .../Mono/Inputs/HumanBoneMapping.cs.meta | 18 + .../Rokoko/Scripts/Mono/Inputs/Prop.cs | 42 + .../Rokoko/Scripts/Mono/Inputs/Prop.cs.meta | 18 + .../Rokoko/Scripts/Mono/Inputs/PropColor.cs | 21 + .../Scripts/Mono/Inputs/PropColor.cs.meta | 18 + .../Rokoko/Scripts/Mono/PrefabInstancer.cs | 46 + .../Scripts/Mono/PrefabInstancer.cs.meta | 18 + .../Rokoko/Scripts/Mono/PrefabPool.cs | 53 + .../Rokoko/Scripts/Mono/PrefabPool.cs.meta | 18 + .../Rokoko/Scripts/Mono/RokokoHelper.cs | 344 ++++ .../Rokoko/Scripts/Mono/RokokoHelper.cs.meta | 18 + .../Rokoko/Scripts/Mono/Serializable.meta | 8 + .../Serializable/BlendshapesDictionary.cs | 7 + .../BlendshapesDictionary.cs.meta | 18 + .../Mono/Serializable/HumanTPoseDictionary.cs | 8 + .../Serializable/HumanTPoseDictionary.cs.meta | 18 + .../Serializable/SerializableDictionary.cs | 63 + .../SerializableDictionary.cs.meta | 18 + .../Rokoko/Scripts/Mono/StudioManager.cs | 342 ++++ .../Rokoko/Scripts/Mono/StudioManager.cs.meta | 18 + .../Scripts/Mono/TPoseGuideGameComponent.cs | 48 + .../Mono/TPoseGuideGameComponent.cs.meta | 18 + Assets/External/Rokoko/Scripts/Mono/UI.meta | 8 + .../Scripts/Mono/UI/InputHierarchyRow.cs | 63 + .../Scripts/Mono/UI/InputHierarchyRow.cs.meta | 18 + .../Scripts/Mono/UI/UIHierarchyManager.cs | 88 + .../Mono/UI/UIHierarchyManager.cs.meta | 18 + Assets/External/Rokoko/Scripts/Plugins.meta | 8 + .../External/Rokoko/Scripts/Plugins/LZ4.meta | 8 + .../Rokoko/Scripts/Plugins/LZ4/Android.meta | 8 + .../Scripts/Plugins/LZ4/Android/libs.meta | 8 + .../Plugins/LZ4/Android/libs/arm64-v8a.meta | 8 + .../LZ4/Android/libs/arm64-v8a/liblz4.so | 3 + .../LZ4/Android/libs/arm64-v8a/liblz4.so.meta | 34 + .../Plugins/LZ4/Android/libs/armeabi-v7a.meta | 8 + .../LZ4/Android/libs/armeabi-v7a/liblz4.so | 3 + .../Android/libs/armeabi-v7a/liblz4.so.meta | 34 + .../Scripts/Plugins/LZ4/Android/libs/x86.meta | 8 + .../Plugins/LZ4/Android/libs/x86/liblz4.so | 3 + .../LZ4/Android/libs/x86/liblz4.so.meta | 34 + .../Rokoko/Scripts/Plugins/LZ4/iOS.meta | 8 + .../Rokoko/Scripts/Plugins/LZ4/iOS/liblz4.a | 3 + .../Scripts/Plugins/LZ4/iOS/liblz4.a.meta | 34 + .../Scripts/Plugins/LZ4/lz4.bundle.meta | 33 + .../Plugins/LZ4/lz4.bundle/Contents.meta | 8 + .../LZ4/lz4.bundle/Contents/MacOS.meta | 8 + .../Plugins/LZ4/lz4.bundle/Contents/MacOS/lz4 | Bin 0 -> 418692 bytes .../Rokoko/Scripts/Plugins/LZ4/x86_64.meta | 8 + .../Rokoko/Scripts/Plugins/LZ4/x86_64/lz4.dll | 3 + .../Scripts/Plugins/LZ4/x86_64/lz4.dll.meta | 34 + .../Rokoko/Scripts/RokokoAssembly.asmdef | 3 + .../Rokoko/Scripts/RokokoAssembly.asmdef.meta | 14 + .../External/Rokoko/TestController.controller | 87 + .../Rokoko/TestController.controller.meta | 15 + Assets/External/Rokoko/Warrior.fbx | 3 + Assets/External/Rokoko/Warrior.fbx.meta | 113 ++ .../External/Rokoko/WarriorTimeline.playable | 155 ++ .../Rokoko/WarriorTimeline.playable.meta | 15 + Assets/External/Rokoko/documentation.txt | 3 + Assets/External/Rokoko/documentation.txt.meta | 14 + Assets/External/Rokoko/package.json | 3 + Assets/External/Rokoko/package.json.meta | 14 + .../Editor/UniHumanoid/HumanPoseClipEditor.cs | 90 + .../UniHumanoid/HumanPoseClipEditor.cs.meta | 2 + .../Editor/UniHumanoid/HumanPoseWindow.cs | 259 +++ .../UniHumanoid/HumanPoseWindow.cs.meta | 2 + .../CustomRetargetingScript.cs | 25 +- .../Editor/LimbWeightControllerEditor.cs | 15 + .../KindRetargeting/LimbWeightController.cs | 18 +- .../KindRetargeting/PropLocationController.cs | 37 +- 242 files changed, 12211 insertions(+), 63 deletions(-) create mode 100644 Assets/External/Rokoko.meta create mode 100644 Assets/External/Rokoko/Art.meta create mode 100644 Assets/External/Rokoko/Art/Fonts.meta create mode 100644 Assets/External/Rokoko/Art/Fonts/proximanova-bold-webfont.ttf create mode 100644 Assets/External/Rokoko/Art/Fonts/proximanova-bold-webfont.ttf.meta create mode 100644 Assets/External/Rokoko/Art/Fonts/proximanova-regular-webfont.ttf create mode 100644 Assets/External/Rokoko/Art/Fonts/proximanova-regular-webfont.ttf.meta create mode 100644 Assets/External/Rokoko/Art/Icons.meta create mode 100644 Assets/External/Rokoko/Art/Icons/RokokoIconAtlas.spriteatlas create mode 100644 Assets/External/Rokoko/Art/Icons/RokokoIconAtlas.spriteatlas.meta create mode 100644 Assets/External/Rokoko/Art/Icons/rokoko-bg-border-radius-1px.png create mode 100644 Assets/External/Rokoko/Art/Icons/rokoko-bg-border-radius-1px.png.meta create mode 100644 Assets/External/Rokoko/Art/Icons/rokoko-direction-indicator-256.png create mode 100644 Assets/External/Rokoko/Art/Icons/rokoko-direction-indicator-256.png.meta create mode 100644 Assets/External/Rokoko/Art/Icons/rokoko-icon-broadcast-32.png create mode 100644 Assets/External/Rokoko/Art/Icons/rokoko-icon-broadcast-32.png.meta create mode 100644 Assets/External/Rokoko/Art/Icons/rokoko-icon-input-gloves-32.png create mode 100644 Assets/External/Rokoko/Art/Icons/rokoko-icon-input-gloves-32.png.meta create mode 100644 Assets/External/Rokoko/Art/Icons/rokoko-icon-profile-32.png create mode 100644 Assets/External/Rokoko/Art/Icons/rokoko-icon-profile-32.png.meta create mode 100644 Assets/External/Rokoko/Art/Icons/rokoko-icon-prop-32.png create mode 100644 Assets/External/Rokoko/Art/Icons/rokoko-icon-prop-32.png.meta create mode 100644 Assets/External/Rokoko/Art/Icons/rokoko-icon-record-32.png create mode 100644 Assets/External/Rokoko/Art/Icons/rokoko-icon-record-32.png.meta create mode 100644 Assets/External/Rokoko/Art/Icons/rokoko-icon-restart-32.png create mode 100644 Assets/External/Rokoko/Art/Icons/rokoko-icon-restart-32.png.meta create mode 100644 Assets/External/Rokoko/Art/Icons/rokoko-icon-row-face-32.png create mode 100644 Assets/External/Rokoko/Art/Icons/rokoko-icon-row-face-32.png.meta create mode 100644 Assets/External/Rokoko/Art/Icons/rokoko-icon-row-suit-32.png create mode 100644 Assets/External/Rokoko/Art/Icons/rokoko-icon-row-suit-32.png.meta create mode 100644 Assets/External/Rokoko/Art/Icons/rokoko-icon-stop-white-32.png create mode 100644 Assets/External/Rokoko/Art/Icons/rokoko-icon-stop-white-32.png.meta create mode 100644 Assets/External/Rokoko/Art/Icons/rokoko-icon-straightpose-32.png create mode 100644 Assets/External/Rokoko/Art/Icons/rokoko-icon-straightpose-32.png.meta create mode 100644 Assets/External/Rokoko/Art/Icons/rokoko-icon-unicast-32.png create mode 100644 Assets/External/Rokoko/Art/Icons/rokoko-icon-unicast-32.png.meta create mode 100644 Assets/External/Rokoko/Art/Materials.meta create mode 100644 Assets/External/Rokoko/Art/Materials/Rokoko_FaceHead_Material.mat create mode 100644 Assets/External/Rokoko/Art/Materials/Rokoko_FaceHead_Material.mat.meta create mode 100644 Assets/External/Rokoko/Art/Materials/Rokoko_Floor_Material.mat create mode 100644 Assets/External/Rokoko/Art/Materials/Rokoko_Floor_Material.mat.meta create mode 100644 Assets/External/Rokoko/Art/Materials/Rokoko_GroundArrow_Material.mat create mode 100644 Assets/External/Rokoko/Art/Materials/Rokoko_GroundArrow_Material.mat.meta create mode 100644 Assets/External/Rokoko/Art/Materials/Rokoko_GroundMarker_Material.mat create mode 100644 Assets/External/Rokoko/Art/Materials/Rokoko_GroundMarker_Material.mat.meta create mode 100644 Assets/External/Rokoko/Art/Materials/Rokoko_Invisible_Material.mat create mode 100644 Assets/External/Rokoko/Art/Materials/Rokoko_Invisible_Material.mat.meta create mode 100644 Assets/External/Rokoko/Art/Materials/Rokoko_NewtonJoint_Material.mat create mode 100644 Assets/External/Rokoko/Art/Materials/Rokoko_NewtonJoint_Material.mat.meta create mode 100644 Assets/External/Rokoko/Art/Materials/Rokoko_NewtonMain_Material.mat create mode 100644 Assets/External/Rokoko/Art/Materials/Rokoko_NewtonMain_Material.mat.meta create mode 100644 Assets/External/Rokoko/Art/Materials/Rokoko_Prop_Material.mat create mode 100644 Assets/External/Rokoko/Art/Materials/Rokoko_Prop_Material.mat.meta create mode 100644 Assets/External/Rokoko/Art/Meshes.meta create mode 100644 Assets/External/Rokoko/Art/Meshes/Newton.meta create mode 100644 Assets/External/Rokoko/Art/Meshes/Newton/Rokoko_Newton.FBX create mode 100644 Assets/External/Rokoko/Art/Meshes/Newton/Rokoko_Newton.FBX.meta create mode 100644 Assets/External/Rokoko/Art/Meshes/NewtonFace.meta create mode 100644 Assets/External/Rokoko/Art/Meshes/NewtonFace/Rokoko_Newtonface.FBX create mode 100644 Assets/External/Rokoko/Art/Meshes/NewtonFace/Rokoko_Newtonface.FBX.meta create mode 100644 Assets/External/Rokoko/Art/Shaders.meta create mode 100644 Assets/External/Rokoko/Art/Shaders/Rokoko_RoundTransparentGridFloor_Shader.shader create mode 100644 Assets/External/Rokoko/Art/Shaders/Rokoko_RoundTransparentGridFloor_Shader.shader.meta create mode 100644 Assets/External/Rokoko/Art/Textures.meta create mode 100644 Assets/External/Rokoko/Art/Textures/rokoko-floor-2048.png create mode 100644 Assets/External/Rokoko/Art/Textures/rokoko-floor-2048.png.meta create mode 100644 Assets/External/Rokoko/Art/Textures/rokoko-gray-16.jpg create mode 100644 Assets/External/Rokoko/Art/Textures/rokoko-gray-16.jpg.meta create mode 100644 Assets/External/Rokoko/EditorScripts.meta create mode 100644 Assets/External/Rokoko/EditorScripts/Editor.meta create mode 100644 Assets/External/Rokoko/EditorScripts/Editor/ActorEditor.cs create mode 100644 Assets/External/Rokoko/EditorScripts/Editor/ActorEditor.cs.meta create mode 100644 Assets/External/Rokoko/EditorScripts/Editor/ActorNewtonEditor.cs create mode 100644 Assets/External/Rokoko/EditorScripts/Editor/ActorNewtonEditor.cs.meta create mode 100644 Assets/External/Rokoko/EditorScripts/Editor/BlendShapesMappingEditor.cs create mode 100644 Assets/External/Rokoko/EditorScripts/Editor/BlendShapesMappingEditor.cs.meta create mode 100644 Assets/External/Rokoko/EditorScripts/Editor/CharacterEditor.cs create mode 100644 Assets/External/Rokoko/EditorScripts/Editor/CharacterEditor.cs.meta create mode 100644 Assets/External/Rokoko/EditorScripts/Editor/FaceEditor.cs create mode 100644 Assets/External/Rokoko/EditorScripts/Editor/FaceEditor.cs.meta create mode 100644 Assets/External/Rokoko/EditorScripts/Editor/HumanBoneMappingEditor.cs create mode 100644 Assets/External/Rokoko/EditorScripts/Editor/HumanBoneMappingEditor.cs.meta create mode 100644 Assets/External/Rokoko/EditorScripts/Editor/PropColorEditor.cs create mode 100644 Assets/External/Rokoko/EditorScripts/Editor/PropColorEditor.cs.meta create mode 100644 Assets/External/Rokoko/EditorScripts/Editor/PropEditor.cs create mode 100644 Assets/External/Rokoko/EditorScripts/Editor/PropEditor.cs.meta create mode 100644 Assets/External/Rokoko/EditorScripts/Editor/TweakableEditor.cs create mode 100644 Assets/External/Rokoko/EditorScripts/Editor/TweakableEditor.cs.meta create mode 100644 Assets/External/Rokoko/EditorScripts/RokokoEditorScripts.asmdef create mode 100644 Assets/External/Rokoko/EditorScripts/RokokoEditorScripts.asmdef.meta create mode 100644 Assets/External/Rokoko/Prefabs.meta create mode 100644 Assets/External/Rokoko/Prefabs/Actors.meta create mode 100644 Assets/External/Rokoko/Prefabs/Actors/Newton.prefab create mode 100644 Assets/External/Rokoko/Prefabs/Actors/Newton.prefab.meta create mode 100644 Assets/External/Rokoko/Prefabs/Actors/Newton_CustomSkeleton.prefab create mode 100644 Assets/External/Rokoko/Prefabs/Actors/Newton_CustomSkeleton.prefab.meta create mode 100644 Assets/External/Rokoko/Prefabs/Actors/Newton_NoFace.prefab create mode 100644 Assets/External/Rokoko/Prefabs/Actors/Newton_NoFace.prefab.meta create mode 100644 Assets/External/Rokoko/Prefabs/Actors/Prop.prefab create mode 100644 Assets/External/Rokoko/Prefabs/Actors/Prop.prefab.meta create mode 100644 Assets/External/Rokoko/Prefabs/UI.meta create mode 100644 Assets/External/Rokoko/Prefabs/UI/CommandAPI.prefab create mode 100644 Assets/External/Rokoko/Prefabs/UI/CommandAPI.prefab.meta create mode 100644 Assets/External/Rokoko/Prefabs/UI/Hierarchy_UI.prefab create mode 100644 Assets/External/Rokoko/Prefabs/UI/Hierarchy_UI.prefab.meta create mode 100644 Assets/External/Rokoko/Prefabs/UI/PlaybackRow.prefab create mode 100644 Assets/External/Rokoko/Prefabs/UI/PlaybackRow.prefab.meta create mode 100644 Assets/External/Rokoko/Scared_mixamo.fbx create mode 100644 Assets/External/Rokoko/Scared_mixamo.fbx.meta create mode 100644 Assets/External/Rokoko/Scenes.meta create mode 100644 Assets/External/Rokoko/Scenes/RokokoPluginExampleScene.unity create mode 100644 Assets/External/Rokoko/Scenes/RokokoPluginExampleScene.unity.meta create mode 100644 Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_CustomActors.unity create mode 100644 Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_CustomActors.unity.meta create mode 100644 Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_CustomActorsSettings.lighting create mode 100644 Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_CustomActorsSettings.lighting.meta create mode 100644 Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_CustomCharacter.unity create mode 100644 Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_CustomCharacter.unity.meta create mode 100644 Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_DriftCorrection.unity create mode 100644 Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_DriftCorrection.unity.meta create mode 100644 Assets/External/Rokoko/Scripts.meta create mode 100644 Assets/External/Rokoko/Scripts/Core.meta create mode 100644 Assets/External/Rokoko/Scripts/Core/ARKitBlendshapes.cs create mode 100644 Assets/External/Rokoko/Scripts/Core/ARKitBlendshapes.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Core/CommandAPI.meta create mode 100644 Assets/External/Rokoko/Scripts/Core/CommandAPI/CalibrateRequestData.cs create mode 100644 Assets/External/Rokoko/Scripts/Core/CommandAPI/CalibrateRequestData.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Core/CommandAPI/InfoRequestData.cs create mode 100644 Assets/External/Rokoko/Scripts/Core/CommandAPI/InfoRequestData.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Core/CommandAPI/LivestreamRequestData.cs create mode 100644 Assets/External/Rokoko/Scripts/Core/CommandAPI/LivestreamRequestData.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Core/CommandAPI/PlaybackRequestData.cs create mode 100644 Assets/External/Rokoko/Scripts/Core/CommandAPI/PlaybackRequestData.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Core/CommandAPI/RecordingRequestData.cs create mode 100644 Assets/External/Rokoko/Scripts/Core/CommandAPI/RecordingRequestData.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Core/CommandAPI/RequestData.cs create mode 100644 Assets/External/Rokoko/Scripts/Core/CommandAPI/RequestData.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Core/CommandAPI/ResetActorRequestData.cs create mode 100644 Assets/External/Rokoko/Scripts/Core/CommandAPI/ResetActorRequestData.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Core/CommandAPI/StudioCommandAPI.cs create mode 100644 Assets/External/Rokoko/Scripts/Core/CommandAPI/StudioCommandAPI.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Core/CommandAPI/StudioCommandAPIBase.cs create mode 100644 Assets/External/Rokoko/Scripts/Core/CommandAPI/StudioCommandAPIBase.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Core/CommandAPI/TrackerRequestData.cs create mode 100644 Assets/External/Rokoko/Scripts/Core/CommandAPI/TrackerRequestData.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Core/JsonLiveSerializerV3.cs create mode 100644 Assets/External/Rokoko/Scripts/Core/JsonLiveSerializerV3.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Core/LZ4Wrapper.cs create mode 100644 Assets/External/Rokoko/Scripts/Core/LZ4Wrapper.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Core/StudioReceiver.cs create mode 100644 Assets/External/Rokoko/Scripts/Core/StudioReceiver.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Core/UDPReceiver.cs create mode 100644 Assets/External/Rokoko/Scripts/Core/UDPReceiver.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Mono.meta create mode 100644 Assets/External/Rokoko/Scripts/Mono/Inputs.meta create mode 100644 Assets/External/Rokoko/Scripts/Mono/Inputs/Actor.cs create mode 100644 Assets/External/Rokoko/Scripts/Mono/Inputs/Actor.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Mono/Inputs/ActorNewton.cs create mode 100644 Assets/External/Rokoko/Scripts/Mono/Inputs/ActorNewton.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Mono/Inputs/BlendShapesMapping.cs create mode 100644 Assets/External/Rokoko/Scripts/Mono/Inputs/BlendShapesMapping.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Mono/Inputs/Character.cs create mode 100644 Assets/External/Rokoko/Scripts/Mono/Inputs/Character.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Mono/Inputs/Face.cs create mode 100644 Assets/External/Rokoko/Scripts/Mono/Inputs/Face.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Mono/Inputs/HumanBoneMapping.cs create mode 100644 Assets/External/Rokoko/Scripts/Mono/Inputs/HumanBoneMapping.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Mono/Inputs/Prop.cs create mode 100644 Assets/External/Rokoko/Scripts/Mono/Inputs/Prop.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Mono/Inputs/PropColor.cs create mode 100644 Assets/External/Rokoko/Scripts/Mono/Inputs/PropColor.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Mono/PrefabInstancer.cs create mode 100644 Assets/External/Rokoko/Scripts/Mono/PrefabInstancer.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Mono/PrefabPool.cs create mode 100644 Assets/External/Rokoko/Scripts/Mono/PrefabPool.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Mono/RokokoHelper.cs create mode 100644 Assets/External/Rokoko/Scripts/Mono/RokokoHelper.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Mono/Serializable.meta create mode 100644 Assets/External/Rokoko/Scripts/Mono/Serializable/BlendshapesDictionary.cs create mode 100644 Assets/External/Rokoko/Scripts/Mono/Serializable/BlendshapesDictionary.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Mono/Serializable/HumanTPoseDictionary.cs create mode 100644 Assets/External/Rokoko/Scripts/Mono/Serializable/HumanTPoseDictionary.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Mono/Serializable/SerializableDictionary.cs create mode 100644 Assets/External/Rokoko/Scripts/Mono/Serializable/SerializableDictionary.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Mono/StudioManager.cs create mode 100644 Assets/External/Rokoko/Scripts/Mono/StudioManager.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Mono/TPoseGuideGameComponent.cs create mode 100644 Assets/External/Rokoko/Scripts/Mono/TPoseGuideGameComponent.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Mono/UI.meta create mode 100644 Assets/External/Rokoko/Scripts/Mono/UI/InputHierarchyRow.cs create mode 100644 Assets/External/Rokoko/Scripts/Mono/UI/InputHierarchyRow.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Mono/UI/UIHierarchyManager.cs create mode 100644 Assets/External/Rokoko/Scripts/Mono/UI/UIHierarchyManager.cs.meta create mode 100644 Assets/External/Rokoko/Scripts/Plugins.meta create mode 100644 Assets/External/Rokoko/Scripts/Plugins/LZ4.meta create mode 100644 Assets/External/Rokoko/Scripts/Plugins/LZ4/Android.meta create mode 100644 Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs.meta create mode 100644 Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/arm64-v8a.meta create mode 100644 Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/arm64-v8a/liblz4.so create mode 100644 Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/arm64-v8a/liblz4.so.meta create mode 100644 Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/armeabi-v7a.meta create mode 100644 Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/armeabi-v7a/liblz4.so create mode 100644 Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/armeabi-v7a/liblz4.so.meta create mode 100644 Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/x86.meta create mode 100644 Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/x86/liblz4.so create mode 100644 Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/x86/liblz4.so.meta create mode 100644 Assets/External/Rokoko/Scripts/Plugins/LZ4/iOS.meta create mode 100644 Assets/External/Rokoko/Scripts/Plugins/LZ4/iOS/liblz4.a create mode 100644 Assets/External/Rokoko/Scripts/Plugins/LZ4/iOS/liblz4.a.meta create mode 100644 Assets/External/Rokoko/Scripts/Plugins/LZ4/lz4.bundle.meta create mode 100644 Assets/External/Rokoko/Scripts/Plugins/LZ4/lz4.bundle/Contents.meta create mode 100644 Assets/External/Rokoko/Scripts/Plugins/LZ4/lz4.bundle/Contents/MacOS.meta create mode 100644 Assets/External/Rokoko/Scripts/Plugins/LZ4/lz4.bundle/Contents/MacOS/lz4 create mode 100644 Assets/External/Rokoko/Scripts/Plugins/LZ4/x86_64.meta create mode 100644 Assets/External/Rokoko/Scripts/Plugins/LZ4/x86_64/lz4.dll create mode 100644 Assets/External/Rokoko/Scripts/Plugins/LZ4/x86_64/lz4.dll.meta create mode 100644 Assets/External/Rokoko/Scripts/RokokoAssembly.asmdef create mode 100644 Assets/External/Rokoko/Scripts/RokokoAssembly.asmdef.meta create mode 100644 Assets/External/Rokoko/TestController.controller create mode 100644 Assets/External/Rokoko/TestController.controller.meta create mode 100644 Assets/External/Rokoko/Warrior.fbx create mode 100644 Assets/External/Rokoko/Warrior.fbx.meta create mode 100644 Assets/External/Rokoko/WarriorTimeline.playable create mode 100644 Assets/External/Rokoko/WarriorTimeline.playable.meta create mode 100644 Assets/External/Rokoko/documentation.txt create mode 100644 Assets/External/Rokoko/documentation.txt.meta create mode 100644 Assets/External/Rokoko/package.json create mode 100644 Assets/External/Rokoko/package.json.meta create mode 100644 Assets/External/UniGLTF/Editor/UniHumanoid/HumanPoseClipEditor.cs create mode 100644 Assets/External/UniGLTF/Editor/UniHumanoid/HumanPoseClipEditor.cs.meta create mode 100644 Assets/External/UniGLTF/Editor/UniHumanoid/HumanPoseWindow.cs create mode 100644 Assets/External/UniGLTF/Editor/UniHumanoid/HumanPoseWindow.cs.meta diff --git a/Assets/External/OptiTrack Unity Plugin/OptiTrack/BaseAvatar/Y Bot.Materials/Alpha_Body_MAT.asset b/Assets/External/OptiTrack Unity Plugin/OptiTrack/BaseAvatar/Y Bot.Materials/Alpha_Body_MAT.asset index 101e8953..2458cca4 100644 --- a/Assets/External/OptiTrack Unity Plugin/OptiTrack/BaseAvatar/Y Bot.Materials/Alpha_Body_MAT.asset +++ b/Assets/External/OptiTrack Unity Plugin/OptiTrack/BaseAvatar/Y Bot.Materials/Alpha_Body_MAT.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:430d4309a3db96648e09a074875bfb451e7f7330049cf0ff475d909747c58f4d -size 23404 +oid sha256:651885b63ff3edbdb7a37c3d5800a432c8f908e5b5f65d3be5dad285e721a5e4 +size 45119 diff --git a/Assets/External/OptiTrack Unity Plugin/OptiTrack/BaseAvatar/Y Bot.Materials/Alpha_Joints_MAT.asset b/Assets/External/OptiTrack Unity Plugin/OptiTrack/BaseAvatar/Y Bot.Materials/Alpha_Joints_MAT.asset index cf342f76..c4b8ced3 100644 --- a/Assets/External/OptiTrack Unity Plugin/OptiTrack/BaseAvatar/Y Bot.Materials/Alpha_Joints_MAT.asset +++ b/Assets/External/OptiTrack Unity Plugin/OptiTrack/BaseAvatar/Y Bot.Materials/Alpha_Joints_MAT.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5bfc94bc818fb5242623522679b8bbb94254dcbc897a3e376548d0d22b1fd09c -size 23354 +oid sha256:c8f90cf5cdf0f57311959a425b5e2c96d528a3ee922451b630b44709658a1df1 +size 45121 diff --git a/Assets/External/OptiTrack Unity Plugin/OptiTrack/Editor/OptitrackSkeletonAnimatorEditor.cs b/Assets/External/OptiTrack Unity Plugin/OptiTrack/Editor/OptitrackSkeletonAnimatorEditor.cs index 048ea5ac..4e0c940a 100644 --- a/Assets/External/OptiTrack Unity Plugin/OptiTrack/Editor/OptitrackSkeletonAnimatorEditor.cs +++ b/Assets/External/OptiTrack Unity Plugin/OptiTrack/Editor/OptitrackSkeletonAnimatorEditor.cs @@ -1,14 +1,14 @@ using UnityEditor; using UnityEngine; -[CustomEditor(typeof(OptitrackSkeletonAnimator_Meechu))] +[CustomEditor(typeof(OptitrackSkeletonAnimator_Mingle))] public class OptitrackSkeletonAnimatorEditor : Editor { public override void OnInspectorGUI() { DrawDefaultInspector(); - OptitrackSkeletonAnimator_Meechu skeletonAnimator = (OptitrackSkeletonAnimator_Meechu)target; + OptitrackSkeletonAnimator_Mingle skeletonAnimator = (OptitrackSkeletonAnimator_Mingle)target; GUILayout.Space(10); EditorGUILayout.LabelField("스켈레톤 상태", EditorStyles.boldLabel); diff --git a/Assets/External/OptiTrack Unity Plugin/OptiTrack/Prefabs/BaseAvatar - OptiTrack.prefab b/Assets/External/OptiTrack Unity Plugin/OptiTrack/Prefabs/BaseAvatar - OptiTrack.prefab index 064b64b5..ea9a970a 100644 --- a/Assets/External/OptiTrack Unity Plugin/OptiTrack/Prefabs/BaseAvatar - OptiTrack.prefab +++ b/Assets/External/OptiTrack Unity Plugin/OptiTrack/Prefabs/BaseAvatar - OptiTrack.prefab @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2369d3e901ee9989d9e7e7a0b819982b6f7b422d7aa81aa6b1b8d5ab79865054 -size 95715 +oid sha256:b930ca102f90f1bfeeb74d42f887c8494e31420aeec00d0183c2b79a6c0846c1 +size 99764 diff --git a/Assets/External/OptiTrack Unity Plugin/OptiTrack/Scripts/OptitrackRigidBody.cs b/Assets/External/OptiTrack Unity Plugin/OptiTrack/Scripts/OptitrackRigidBody.cs index 9b60ab2f..5221ebe1 100644 --- a/Assets/External/OptiTrack Unity Plugin/OptiTrack/Scripts/OptitrackRigidBody.cs +++ b/Assets/External/OptiTrack Unity Plugin/OptiTrack/Scripts/OptitrackRigidBody.cs @@ -100,8 +100,8 @@ public class OptitrackRigidBody : MonoBehaviour m_isRigidBodyFound = rbState.IsTracked; if (m_isRigidBodyFound) { - transform.position = rbState.Pose.Position; - transform.rotation = rbState.Pose.Orientation; + transform.localPosition = rbState.Pose.Position; + transform.localRotation = rbState.Pose.Orientation; } } else @@ -122,8 +122,8 @@ public class OptitrackRigidBody : MonoBehaviour m_isRigidBodyFound = rbState.IsTracked; if (m_isRigidBodyFound) { - transform.position = rbState.Pose.Position; - transform.rotation = rbState.Pose.Orientation; + transform.localPosition = rbState.Pose.Position; + transform.localRotation = rbState.Pose.Orientation; } } } diff --git a/Assets/External/OptiTrack Unity Plugin/OptiTrack/Scripts/OptitrackSkeletonAnimator_Mingle.cs b/Assets/External/OptiTrack Unity Plugin/OptiTrack/Scripts/OptitrackSkeletonAnimator_Mingle.cs index 41ef7407..3fa264e7 100644 --- a/Assets/External/OptiTrack Unity Plugin/OptiTrack/Scripts/OptitrackSkeletonAnimator_Mingle.cs +++ b/Assets/External/OptiTrack Unity Plugin/OptiTrack/Scripts/OptitrackSkeletonAnimator_Mingle.cs @@ -4,6 +4,14 @@ using Unity.Mathematics; using UnityEngine; using System.Collections; +[System.Serializable] +public enum MotionApplicationScope +{ + All, // 전신 적용 + ExcludeFingersOnly, // 손가락만 제외 + ExcludeHandsAndFingers // 손목 + 손가락 제외 +} + public class OptitrackSkeletonAnimator_Mingle : MonoBehaviour { [Header("OptiTrack 설정")] @@ -14,6 +22,10 @@ public class OptitrackSkeletonAnimator_Mingle : MonoBehaviour public string SkeletonAssetName = "Skeleton1"; private Animator TargetAnimator; + [Header("모션 적용 범위")] + [Tooltip("모션 캡처 데이터를 적용할 범위 선택")] + public MotionApplicationScope motionScope = MotionApplicationScope.All; + private OptitrackSkeletonDefinition m_skeletonDef; private Dictionary m_optitrackToHumanBoneMap; @@ -108,45 +120,20 @@ public class OptitrackSkeletonAnimator_Mingle : MonoBehaviour if (m_optitrackToHumanBoneMap.TryGetValue(optitrackBoneName, out HumanBodyBones humanBone)) { + // 모션 스코프에 따른 본 필터링 + if (!ShouldApplyMotionToBone(optitrackBoneName)) + continue; + Transform boneTransform = TargetAnimator.GetBoneTransform(humanBone); if (boneTransform != null) { if (skelState.BonePoses.TryGetValue(bone.Id, out OptitrackPose bonePose)) { + // 위치는 항상 업데이트 (Hip 등 루트 본의 경우) boneTransform.localPosition = bonePose.Position; + + // 회전 업데이트 boneTransform.localRotation = bonePose.Orientation; - - /* - // 엄지 손가락 본에 대한 고정 회전값 적용 - if (optitrackBoneName.Contains("LThumb1")) - { - boneTransform.localRotation = bonePose.Orientation * Quaternion.Euler(-40f, -60f, 20f); - } - else if (optitrackBoneName.Contains("LThumb2")) - { - boneTransform.localRotation = bonePose.Orientation; - } - else if (optitrackBoneName.Contains("LThumb3")) - { - boneTransform.localRotation = bonePose.Orientation * Quaternion.Euler(-60f, 0f, 0f); - } - else if (optitrackBoneName.Contains("RThumb1")) - { - boneTransform.localRotation = bonePose.Orientation * Quaternion.Euler(40f, 60f, 20f); - } - else if (optitrackBoneName.Contains("RThumb2")) - { - boneTransform.localRotation = bonePose.Orientation; - } - else if (optitrackBoneName.Contains("RThumb3")) - { - boneTransform.localRotation = bonePose.Orientation * Quaternion.Euler(-60f, 0f, 0f); - } - else - { - boneTransform.localRotation = bonePose.Orientation; - } - */ } } } @@ -290,4 +277,39 @@ public class OptitrackSkeletonAnimator_Mingle : MonoBehaviour yield return new WaitForSeconds(updateInterval); } } + + private bool IsFingerBone(string boneName) + { + // 손가락 관련 본들 확인 (양손 모두) + return boneName.Contains("Thumb") || + boneName.Contains("Index") || + boneName.Contains("Middle") || + boneName.Contains("Ring") || + boneName.Contains("Pinky"); + } + + private bool IsHandBone(string boneName) + { + // 손 관련 본들 확인 (양손 모두) + return boneName.Contains("LHand") || + boneName.Contains("RHand"); + } + + private bool ShouldApplyMotionToBone(string boneName) + { + switch (motionScope) + { + case MotionApplicationScope.All: + return true; + + case MotionApplicationScope.ExcludeFingersOnly: + return !IsFingerBone(boneName); + + case MotionApplicationScope.ExcludeHandsAndFingers: + return !IsFingerBone(boneName) && !IsHandBone(boneName); + + default: + return true; + } + } } diff --git a/Assets/External/Rokoko.meta b/Assets/External/Rokoko.meta new file mode 100644 index 00000000..e7f180ff --- /dev/null +++ b/Assets/External/Rokoko.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6074c86fbcd256e4bb26cb276832ead6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/Art.meta b/Assets/External/Rokoko/Art.meta new file mode 100644 index 00000000..f9acc6da --- /dev/null +++ b/Assets/External/Rokoko/Art.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3f3e3c0381a922e48aa26f921f58c891 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/Art/Fonts.meta b/Assets/External/Rokoko/Art/Fonts.meta new file mode 100644 index 00000000..c63a8ace --- /dev/null +++ b/Assets/External/Rokoko/Art/Fonts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 96350abf3fd28af40b410cc048105913 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/Art/Fonts/proximanova-bold-webfont.ttf b/Assets/External/Rokoko/Art/Fonts/proximanova-bold-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a7ec518b561b909d211a93d7ecc7b08549282984 GIT binary patch literal 34352 zcmch=2Vh*qwKqOX=MvS-uM3h9o@P2&Yg1R z%$zdk%)Js)2w_GPCtBO4^iN&&`+={8kljeVxU+NatZh>-`vUhb;y!a)$JEaFbKUt6f1CWKNYL_y=U{&{U5y{j7$qG+=a@fY>>`zx-v;=t)b_`gK{W7K$;pFTQI9YPQTZ^= z2`8`Lv1azvdy{Z~P>7C!wW|kL=?#CnL5MS5cwVy>3GsJo9>6{77rARUY&-L{CrlsX zey0$cx7Kf3Ik^2lR)&Pwxg7O>v0?Dc&2p3YT!?chziZ>*hSd+;eZfVzKNI<9Zr-$Y zTl4*{93jp_dzyEG^rRfr1-Kd+pzdc~R><}L^eaZv&8wSsV&fFn+%3gwhl zt2b@gv|*!&>*(yBE1WBLY*{Y?CvRE3PIRsx+_q5+palJ-P*5sa$nZ&A!~c6K)rsG; zP5XXJ=RX|X3!Dq_VqVuD_(>{m0-_eNBI1$q6pp9G^FkwjD?Y;Y$Kn$_`BZ#`>p0Fu zIi+|8d8lSO^x{U8i|tzx_pO!t*2m>UIE*^g9_oecpVQ_-x!6>yJ@&pzBurT})g`Lh z=gdVsbIKybvwFJ`_jGq4p3^%E@!To&bncv)h$ocStXsWhqcCq6+_Fx%HmuvQPUNEj zYK5?@!lK^A1N*7MB}#yYR?&s0G=gnOry7nLL$qGbDo?5<^ zo&mL1&!s{ObjbYOn9#3KTEgZ;1LkZy;Ce0mN%*1gd%`TV;m2_Idiaa*@4_F3U&Qf9 z`1$Z1NP9WF4>6_PkE?fa|A+7k;agGiLq0wXe+9_?AAjLvVNmh-FZ>OlL%o0vzwlS# zPt<4OPrto2|_95D)Xk7_K)!#-{&g)(D%vp?Rmm~3_l-z8h%{8q7>lo?Qh3mv_$MVnj4r^M+Eqo_@gJ2 z|Dt8prxWicFAekptyqXBM7bP;|U2le20I9>{W9zKZkBjJ0f1m-Q{3p4f+wFZ1b{}p=hTKI7EezG&obov1n@cDoB3txOB~;X4t(9{wZc1~xvXR9ubCAG(YFq8P;U2)&M-KO#7ycWVBB z2Qn%F96%Q0{2^eZ^Q1EiBX9uEo+G$%24@Jrh2x``S1!$|pn%Etb}@5J8y z``5sHgrYDek-F60f1kR5spkRHt6}I5)F&Lr(Px-6BYO6B1gDH)PC10J{*>wZ6L9_C zsbdRyu#fBcB)lJ`UShg?8yGr>IS)EfTZm#IQYJcHPjXX}L{X^FB49)v<4_#s*3{G& zqvM4fN7QPihq zASj{;K_iM0;zSvOUicB>q3H#n*;FDZ(3Yx%PE;c(q6Q%W+D|RUvkpNo>JgGe146QB zL`V@$2&tkOAx&J0AjOXn6mhNi3F4a&6tPF#in4nVQpHaZ6zGLdkp?Wf(XLiF&`N^H zMIOBhe?EJSdMlMr&mA_SLMjNpcTKY;d^Ab7-5geI{Xp+=mB;1Fjb zAc7Q6BGmBMq={F>YiRd%@dhCID}rAf6>sADEd;-K2f;7?hTyz>p8_v5FML9Y z-$r_J+y!x$BX2e+1X`R(f%GTcm^9?0puZ0xNx>a)e?P8?e~!`XiPS_Aihg5!@Fi8s za@r)kgfmB?@Kfpql_ma(wwYUUSxWm>ofx?fM7Tb|dlZuM7vr*pcpp;VhTI|kf1LIa zJ~G})EHo3ZQJTWX&^O0mVz|b1AT>Xr9(zs@jNeVHkITLhDMNijsd0VkyUNiR;Q2@B z3zegTG=uk8Vnt-&ByBOrM-R~Z@C^}davyl_5%A#)G2*+&%Y?5Uzn*xdN|T9clid-| z9p}5017k88<<;Mblh?R+BpIlVG3*{cuO@Bv3)0Fa)(&iqlE(C}el%-PHli6v=F+>E zf#0tzjY3raP&K=^k@7vtPJ~OP8sG|g*~BN4-2pnR*Jwq+y2}`KO~k-tCBHo_{9o#` z=vaMw&J&+Rv3KH=??{n&Mu!6X0LdsbOQ$TBPG*))sVtWqESEA_E;(5Kn3xY*Ba(Mq z{x~PdACf$AEP1pnc@kKv>RIyG!I7K5D@hKRSpsCT1h9UK1kkbsNRDuE;-SgRzcZPC zo0)$*n17p@e>=q62x-j49n8heYG0+E_^wzl&PTs(7{4#DI{BFS)5o|z%6DJn5z02D}~qySU3kRqgeXc53jRhs;cJw97wd<} z8g#N6AVK~J{)lxo;xQgRSw)ho!8myrZ9;<34{L+BfvM-!yYZM;&fswq ze=2tdWN#omg1)~&^@NX&=lV8$hyRMz;K$?KeZ0iCU;U48@D^J6YJzoy8wfu}eLb-) zmZop-4HIFC z-hCUM@mzr(+KC{cQ%}R)bOa4+)^V&^$BQ0>c+rcXg?2p`IZ3mQXU$s2nzc&%iL6=c znFAy-2S{cPkir}wl{ITUYt{(r=vXQkm{;k*sZt;ZXyu~Hh7^_!7M2YuEE}}U(HzXtBy%){ zIhuw!S{ie-I57pm#A^*RNQ|4Jd6wE% zRw%Dw{4%(ur=fFR8=bxX=DFtI%RkXl_x;Ke{i&;*@DuDKI2gVss^5K|8loKZ`&hSG z&wY$)#dyF*gjLqQ8NV*0J+3gFkchq)lhl!IvZMOaoyUOa}n4zvDn zqO@H5t@VB91GF{DauqhmfAvG&q40J8Di>gmNF(6uC}ubOItY5^4|-^2@ZqsdBc63f z9rFh*^9LPUFycfDf)vXTB-64My4d;9MQHsV&orxLn$X>HrOtU(sS%qmK!55(kUKZ|&)V2}zuM3|HS}6|SjjMg()55#Rdj7xgJ2_ehFtLX` zfS?nm;_#cm$sa-2Lul>qczQ7WA9#8nsN;}m2tSUicL2#lVOUfNi{yEUXk+Xj!rcTt zk@Xr{qmEf%qb*N3kMs9hrYEu%CP06n6+!}25?KW)m=WC2+iiGC*1;TT>Q1DPjWCC2 zgq7uRI@3l9(?$~0MiSFTD$_<1(?$}nNpe`C#6{#YSpm&V2^OXS3)6s(rJ$Xqw1usJ zDm_?OS5c|L!4lial%Qvw#Lo0!VY!_US)q`HFNrN;NlX<(r@LbdJEK_y66rO8IJkydQ`W)$MDQq21XYQxx5jOA$8+cUpF&dk?W>qz|Bpy|D{Yn}R zY1kdCTe&cIdF={pMSh^)Bb-LkNpcS**DHCRkbb0EKO|sM`6_Wz;-6#%R>aj@a~tMy zJOcSDsYK+bdR5e$F^wZ)!QxaCw@tLFf!>vYvRMck@fiZ?)+$YF7|$A>zZ#yo8t$V; zypIqkzCcj01BLdWNI+pmO<8#I*%*Aeq7~N!-_5YQk{>(rgNKMP@@>6WFrxHKVazBz z>TwKBoUkBBhFZfTr!ZC&hB7XK9kP+fF|2V+WwbLUiScMaEwNGvG6<_{$ROA~vXP7Y z?1am4{C|O`3WKetDi}q|Zw5yrdkHL$QK2yHd2#r>gtTAcqnruz3rbrXe)My$tZJI7kk7llBk!HDOjb^=&a=rpDl$^ow zxg4L&aTUiE9AC)sMvBFye7%h0c8+Zv-_7v`j?dv(eHwf15OAh)oHj}P0G|FQ_ejNU2Ip~b>>Q89F1i+H zb9~NtEIpjZ#c?*rIVZ+ke{4=S=iyj{`C3pc&f%PGfSmY99<*oyIWY_Jsuz6I3yFU< zw2f<^0k=ce?}h#2HZg){_lX1GwX{lJ4Zi<`SjTj{0kx?6>jXH7V5#TAIUh#}4&v># z*dh1_YBgNV@hKb+a9qOi4=9Fy-h+4rctHaAksX{T7yh~cymXC7zm}oDjpFc&99MCC z3daK+mvH<8gdKzv zpApYIvBdv$H{ry(wW~I6+92}RY#CfBO4grp@}Q{MxP8MG(YR^Ls*R#;>-NoCv44;t zC0?unrZn6GvNBUD{bZys@sPO0+jB9hRTz&Bu}$pcJW_0qoX?7!&ySS3JaYfb$a#d* zNjp3$<7Am!C@+-{$+y6h%alH4qjCc{>`_ge#-r)hY|&h&!7fdLKtn!YI{zII!af2? z`Z-b*NIVsjrQ?5G9^zp_WMp8Lw;d zoc)vLB!7SeloBHp?I+RHczskqX$ewv15OP_(*^pXGO=)UBSobewMS|xnjJ)u1fj$% zpb`@6>hU_&ninz#2;bzppc4`SX4qtSp3h~YHGDVBv3b7_ z%<8O;ju_2{=!ntWAzKlRkR7v|+EwSy0ohFTESKVK05?tC zcrDab=+Q2r{E){55&br--?|m8r~ETcV-1&~q8r5TF+tfjA>UMPLKYWu925s+cy9nL z<0s>AM^~A6`Yz5joR6p`MVuqTvRwAdGnJ>5S2P+;f=2JsyUZ@9E8FF9<-7c@dRK>Q znd=_6C-0ko#z8jFF9kL1MY%bVa)QeVm%(LsWk$-?#gvn@A01Z4w_snrI=m&^6OzY1 zJoe17CyyO`H5|V^a zKtD-(zN+i+0n8SBI)H$ftawP!MP8_pJY{_6Zyo9JfaIq$6e!9_P5eDc-Tj=uT&8xM)!JoWyE z@4ol(-^E#feM?+;#Ra=ByXr?*UwPg2;@X>U+4IEHhqj;)%t!cXteSk~Cg}h9N`-t= zVy6OD^IhS_a9NoAk$G4<4+_feR(1@DlGapUBt@HOPEAiTB^V9uL(vv zYV@yjD49}*OznfGw6%8*8Tii3cSEgxJBGEbZNu@pcD~lNwv8I%<4x^D>Fvvh%s8|- zbU0jtZS6zG_Bps2>YTG^$7p=KjtWsSqG3b4`dB;mSc}WC$BB{0sF_L+n{YwJ5;z@~ zeLF_9t!S)mG$k!r-wtp`q)co#nA7Xq0mP8L-GB>o`)YK6u5`Fc!&T{!EV*A2xhP8e zkZ9lBK6OY~y3+lGjY>r6{!+|Kn$c;PRc_3$BIQO*Hk~LNmcrjSqKh;CtzuXk|4QSC zM!}^R)=+XhC6DN|mTwwIB&Amx-9}%f(d(9p?>_ysa^tZzZej?E2*8K&0_a(T7E;A< za$?J{P+E2lY5aloN{v@rQ(0lPn6+L{es#r-=FN7$+wG@Axhd4VB@l4C0s$A*QzFlh zrz&?q6L5fc4aaL*hE1B5fGNMaDpG~cTN8WJ>n+U8Ec9w?@1=_ZuQn)u@~h;mg2K$? zUwJ%qRgi@%s@sU@B*2&f`(Foon9wquth5Yg;A~J@MiLGB10TNkoA;Ca?~P~;@&5OQ zQ4B^7wF;4rlA*!!izM$K!!Kug)9v1}pif)Kvy?=)8P*({U@ymenn- zTkc#@v%;~ub}7QL`a%1u;A+RowaZFtmIUv-^Um4(`|ifCZ~yE&<=*}Ki3Mbb_b46U z1TNSl%b+ccW|*u>^LwMYrgTm7dm~;GARN`3;uDcpW>Rn($uyPv-wWhwbrx@RzAtFC zRhKE%Rn0P3T?r1M%lBEb6{u6T>Qrel)l^p@LFw4MZrN1>v)Tt*7B^L`n6m8jdA$`g zrVKQP&MU~zFF06KRJd(R(&9zQ1M54CH>VZ#wNx&s(=J(-JZr7rbh)u;c8kUYI? zGecJwIGx$am*X`q;S7I{n(cmcVo zSyonLON%*GdOc;bI(zYI1sd^QtAC z3%zriN~agiY7MlP*t3c|>Zkb!Tjau^E#Prx7vzNIdz-DrrRH+CzaCu!UjWUC`36iO_cxAzY`|evXI=bvg?-Nh- zayfta46IeIS7C@xXbE8Cf|0RR*_*D;QKn7QXZgxpdDXT4fs~*_Q|NO0gZ|(kSP!6Yxc%2$+1y&XcE)V~CDW&EZ@=IQX$|Q&Z#aE!VPV;);PlSo^ZK{{aDHQ6mw(C`y$dh)J?t&?`wH{rPMMdN zU(~s6?BkBI~QZv?LNpqxxGtXHu$qBZFNR+35j4|txbK9Gd@ z=&qKPMobTjS5s+}3qy~~#Dnwa@4oN8OE=4(hSr~bsnkhzC0UOCHlfaJtkclnOkzlh zCNtQr!IT2wF`=J6Bamr{qLx^$ZKCmRm@=qUk13tS)A$U704hTp#2i2|6Zm`_ z%{Uzm0a$=%#^r+ztMXejTZ+oNi=<;|RrATst=nd~=sWY^BgDkGx=<^WDg3eU+Do|B`}q!22kyV`Bh zc;(vAko^41Jxcc3D~}xl^>~592J|Nba<`It6foIn-ej8+F>gkSOu66@AbH3q=Hn{! ziji6(LO;aOtx-mf$>r^9Y3!P@y{&EgjOmRnvuB*u)pgbkxwE;VqNS^_a9Z-5qM|vS zHC0{zz1V8*X=v!p&+lz$=rLOt*EjYT74N4{A$f$y+v9fO_j^L+%gDsn1ng6C&87gxIe1>vbPUSsT)Db^N^W)Lw5t56w%eVK>V=i5xfK;E;`gjry$1s#Z|TqS+bgQv zS%8cAn0z06!A2ZG(Y6em6QRe&=z)fq>oL9-<3L$aMZDsi zRWNOC>nU}`Q;bQcRcg#eOG#G8+5JmyTQU8-zU2!nD>k0=qkef%UzqJ{$t}%q3CMx_ z*Y{uE-@CcCI7gdTymZEt)7ta0t3NYotv2uU>fRmgD{dR;*)=_w-O_*6g44`7h3$F1 z@+m?I{}Y2T1U^DL{G95#Ar9*XT|&!9f=M2DKk11#iO%xeIz zSuZ9gN$V%KWMNe-E$PvVHo2^6K}lPA&5Shzq3dL8Zc(v!XkWr zmn_*kc*>=PXIU3i*DbBCURqZ(-+I=vN0JxZvTD^W3l?`Z76t28H8-!St0``{o#rz2 z`EK-C56c!>OILerHt9*+NBW4l;m#vLP?cXSjcro5cJHD^d)J1(lDgJq6&qLXP;TnK zVdcu}`_HajRyVLcMEjzsUMK2J0xoxs=uC0`_w0~=jL!s9l3Ke;hZMKTmqPc;_Ru48 zMyNo!>8u}}brYE##_LIhg>yJDq2;)`#)#SI9jjtDmk+(qz=;M=oo--^LYicWX*S2QlGsae)oJj*^Jo2#!}xMJTjdEd?R z`r2Ca{3=?rEwj%GH@3~cWlaS38yN?V@!6Sx8Ja}>kR~lAr*s>=Mq0f?A5)S-Pww6= z8?L-k+C%SR1^%_vLNSZtA+nAK*QOORR`FQDquaaDU&;mRfA}+bJKCc?uEScTWmI9U zG7ton)>NYfTIc&ZDr)_8yU$&BTHC%reL0w0>z3_PqHQQ=GrZtx)CNaaZ(%3jqQ8CcixTHc3-F(tX zH?LgDF=$VnDu^TWw}|_1!OEO^Jz_Lr5Y?HN}YpSYOciy#I z{;;;_`s<5>%1!lyjSYi!AIpy_AFM1S+V+J1tWbZ_;SE85vQ25kN%DDBjJHW?b*8fO zsOAwzD>vxeF5aw&sYy%PClvcq?+kt z9mSkb`OH%EGZlJ=OPyV*SgD&#ap>hpI+W}8hLR7sE<5yg64`Gs*P{H@27^PS+p>1; zZdu#0reR8aoxusD>nsKG|yR+8jAKjy3VMFjLrxD0pH05-Jb=;JInu9 zJJ`CB8J0Dl1fdm_(nARu@DqEAlr?2{yG&?O8Fsd29Ert9yN`EB%$t)4Eqr zzvTSkQx6wZl;n8422<|rskH;uOV;M*<>lmL8I8U<9m`KY6diKxBl#B01p?<-Fz=HFZit@rF>M^!q49JmhU=&f3!BchAZcvC9+LZq**2P0&i zU)^?9Z}*JetFHU;HK2jewyt^ey5!}d&F5Wr-MO$ZMr9>^FNN2ER3EJcHAGp`8^7svrY}@_MeTGdg zQ{Q?k^l<1-#wYjX64aAGeMtaZ67Zm|K)MQw(fds(yl?;Q`@*}WQC=GQOeTj;57E1I z^vY z%lgBRg`h7TQJ2Obh`OL+>UnsGTUxySm(D)>C1wA-W1aID_E?)hhV*J+68Ib01e7NL zn=#xb-W#tkj_MO?eKzo|Y8*yX_tGiKL-W3&&oZD)x|}8Vqd&A4DzdisrdOtWUs<^1*AZE{VLk*|`3xGGnRyYhshZSmG4=wh1)U(?60sfz z<)CA>zYsRS?xONOdwrm{IZ(WzVae&c(t<8uRh7>bOsmLp=T5Jzp6bfZYR@aFo0p$I ze=u}t$ZRceyYsE&jZ;Jm=%f%hFoAE|RZ1~|$}Gkdz%!a*j0cn;mY)Ee7G$-q0_Ss3A1op7~nn=y4+Mt^Qw{q*Vet}0W1#OTzGH8#KBDLbQscX#cZimUKt7(@5uQ zw7N<_r=Q+_urdB4O+%fm-P+Na@;rds?=3 z-!P@95W=12JK3`qfv;Nt&#(oUfX#8#WHf3aMUss=1GuVD!A$^MwUT`k>L6rEP@~bi zxUX+#=VNUC#Y&RP>Q~jx~iv3+=_|M3+Y0MkCNY z;xi^fZL`tTnYeO?5nt7?@_pFPF+T1aYX)n2v${)~Ft?UBmvm>H`;+ypt4icNLz64m z-cD1@)mS&BJhz~3Q_rkT_4&EYq2{yKx_$BqdrntVQI5x-Ug z)c#$a2ZRqB@WHZ#bX6T7CwT(hIuKNKRV-uEyiWo?Ga#h92UxE%Yn-W{b1DtSGl?`t;CkQF~6woUYK_QTon7y=kznfs0v;I_g!1 zF^yQcHM-i2=)F;^2KhmLzpc4>+pHdnd+OTT>+0It>XJLQbxz&Z(Xnl6=eCa1W;Zs> zp54$m8yz4X-K7+wohXmiLu!MzGL59opjjN#$a_TO0H8zL4+sxNLXZTs<_(#KXFnrj6hkBp=Xr8rrs~{4+!4 zpYhc(x-iqSCYFljrS*%Omoo+TWSo1hp*e@RCusMZ|b~MfyPbULQ zzkoHrNsf7HR2Lx`CT{8M>pOSF3cESguFddHOYUg>X43^1Z2F5WJ3+fV2V(?!gba_v z&PSf#G`ESK4Zv4&jCjlEMJ%!2AT8wNg_#S2Jw3b1ikZtbcfLpeS404n>HoXQ8mK=onA^_wwzFY2QHsl3V?^pW1H zvw6SSbj962-Mwn%?tQ=5ecNqcesJxzAAnckjf_U_gNf!5+9y~b=2D5D5;9sOL!*K7 z5_aQYzt!nVG##Xlz3Eugk(!^B-fu`RlC2>L(?IB5>?*;IKbh$xMu09d(u)&GI8Mtdn*5?NEyZi(&q_N4~C9gTv7K zSEDwgiDW>gF-;W(I$9&yjd3Iqa>+A}y$r|gVld`gZAKWlGCejAEU)Ny z=G|44n_F~-XV$dT#RG{`Pi>pBt|M{A^wepyy!y}=3#O)Gvv|9oNkrISt8+rPtHY|D zyl*1~#zG93i`|1GQ1XDxawE;F8YAtl2;>2$`C}-puJVERL`By4T0VzVKQ_VFz#Gh( zTTpQZR=P@D&McFEYM{I^`OFThy>oNZoh_%O1U;pV>E@&>Pm{S>mMn9&8Q%GlPVil@=2OH4?!q)}gJ-=bexplo2D6=s6l z2$vspM>6^4Mhq`Lc*>y-vCRdx2e`|v7Om>>CZA9{1C4`Z$9Rp3=9EWNpczE>fx8L6V)?054 zKTpeRxxBZpXY1CUzFw@5vB;)=kJBXfO_P1nf&-LEv>7@$GjtGnY~g$5qZsD^cA=z+ zQLizJIELN`8*w04HM>l-&5Z5P7#~#CK%>iNV-4vgKKbajCA$_>XU#7w@K@H>c2(6E ztf*L2zq7N#G1HeKR45rm6YOjR;Tm0<|{?=JY^VkXTuop98QXB8Mei>*hk_` zNrv}eyR#Xv`ioI=D`Ku^`3f@O?8$tf0B0OZkuQtxvwYDr+R%s+$immayT}gN1TVm7 zP8$0FY-yyGjg+SqVWjHPJV4i&KOmwqDdc4$wi5B&m?kJSWA5H4<0-gx$&y=^F1>}~ z{@ruu?(WAQF3#yLty@+LYkt|xj2v^bw`4{M{&JhmImt_IU83ektn5bKv2vlz+~8ni zE8Ce<+*2OtEzQZG&4C#69K5mAt6YrU6oMvboiUW@#{>jN9&x2%Ni~vB&Z$6p zDi~x0WvcCfx1oS=v!GeTYGj|LRe4L=+DdXO)ADod<>}t6nZA}e1BtomcDLJ}?$ygR zMq98vP;D_5II=9}Mu(%m{mIi(((D$i!;k`)vPFyhKk|0isj;eTktBiDID7B*y?eK- z@u$PX_uYpBG9~I$jHf*y8m5%IYWS?l#`I(P=rh0S3w=)V@Vobt#KAvzOdi4fr|~Vr z8>|`85gx$^0~7uQ=7Cd$vgWq@@=q>-&lUYpm)=3$81M+WQa2J7oNF7FQn z`pe7b&|iF!XQjK$mYq1I=#(iYr_*$7EE_V*i^npe(DTbbEp$6vX@h^9Z#S9A9w0?3 zc7HBW&cZCkY5`I|p0tEC4NmNeNtL~!VdX4(lL9-R<@J*GdeGVebe>_LSv+DPrV}t7 z*DoeyGHnC))0=a1oAcDa%)GqJ44*GUUZ2~Pm)FdHO}WqbGBfh?GctYL4k=kLD<`om zbc&rr(r=I5J_Mr$`R^v|B8rFIE4q^?^f`HW&w94!$tQch?7?14ue?L9)ifA%co#y* zJ7BX53wY7xI!^miO#?1OjI9j%+eO>=DJ5531(5KJ);nF$t>~?0UU6Wx!+Kl1(M~HK zY#}2Fh82&|9MNaVp34qa>@*{}29wkxcU}4}t0_^R=yb1jTBj8`auc!E3BA0?Wrv3Q zON&ieubZDAFeD#Bn;GFf^2g9U(xB0eN<%XF4U5Hd?7xh+F z^%fQNR#o;EeO;KBTUZFyL@~@PEsg#a2K+@u<>gR}Y5pF^AE2dU?6gB|+9;1%yn>@6~A#8>j>vFGsBobdb~^0)llh4Pz}pW-=K375Yj zQXVTAz?2?tlD}rXuZXPZ3A&cEhYGOwz|2M})-t04$Dq|k_K(m8K<290fx&Bd>_oN5 zV04dxzbGrKz}HndyI|{-Wv68oxIFHpgbg0K6MKI>fq*CUS#6dj$82{sEiS8AFwIw+ zZ*%0@u>~O~w+ghO`W7@R0dpQ;)nVtw55&(VNk6Q(Crv*h{}z+JWUQWN<<~Lk3&+x* zQ;K5JuNX^zUj9M+40b3`t>zY{0~5ZNLDrp}*uI51X@|u>PC4+}foJ9=HN#fd`su8S=bw83sfPwWBCTw30aI1F(8 z2f#si?;w2du-Ur7G zbhu^x^-Qybx9c@DZ(&UZ-kw#A+%MY4@iN1YdBOO+d(!m7%JfOok6>#!;a{zX>R0P| zR`JB76CTv`=af0X1AV9O68X52PFf8X7jWsSJ8?JHU2#R-&o_yD^Yr}6%-dH%TlQFSOCene(y%gO*Inh(U`>xK_ z)lpA<={47s)+#rxuU|o~`t#*^RS#BxMlfb%|Jn*&sg|tp*|6(6jMy;u-l*1COL&jt zJ=v;$#O~^vu`OmWEgRX_Mw2?i@_BWHagu8n71mgKi}Q*~$||Q;7Ux+lWjV!lyMk*w zYnIj*=V#dSOKQ5R%Lf{heR&Hr^0TcLYf^GXQ)N-L(_l%qWdsUCdGh7jftuX5;^L~z zbh|O#pijz}Qdc?+`|mL(>=#rX1}>)pXBzPS#!1r;%fC#TenjHcim`g`AFJnCIU18b zJeK|(bgJ?E?~J8CFY%fK<}u*WOozR+6mRCXVSGmeMjx9o3~rpx8VMTAjZ_*+4eiM0gUTp5V@8(>^=7Sk2H?@~&Cd zHfUR?{AWkd)n=*ltSLXcDQ8{F{B5gdRxHeDsp{_t6mM#5nP1E8GpFRT@3XkTS3<6_U2Ri}25g?39FILe z9a|yE7um?Z$V!$uYM(2O+R0>2s{CF;C#pHgPPix?{q->-XH0*ywyp|JaA&TD=h7R9 zJ5k_tY-pc8?%!1D8DoWS7SP<89+^ASqGLND{jhv{()1&8I3}Iuh+5Bc(2p=j_$zFW za{W)J_2V0NGjQCX)W&iS?GuxWhb#$z2TGF>*N~1sCb#ie*X}v4tm{wIajSdy3=o{V% zB{~9(pvPzBQ`~35bq@EfKZ5J-Nz)Hw4{wCNCgeXN?~h5R`qg@#mB5KgzsOHGQq!N4 zpE5mWiRJRB0;h09TOZ2s55@c8s^vvsR8@r|kai;Q+bWTD!aKRS4hN2-^2t!cGkoK9 z%BOOj4zJhY%$?PHSbgrG4cAQf3i+|df;``? z7#N?gx5xn;>zS!RplYUr!IBEJ3`Cv>s;a9Ea zISK6ubC!JrT+b4&|1fkgnw#uzgUpKf+ayfG3Q2Qz>_yys0bA5t99=Qx`&3RA@wYv? z>suXen*Psu+W!~FR-EU(|>!j{u9E#AJYxn*f(<<@TOp|H7MBt=hA&thkr;dih~P z?aCJHXKM;RAC)l|VXl#WTaEvQFq&t`BpFl9zTi>6ietr~%9a9y=i6lqy^IhGJY-C) zK*^1+U9l!meA62|o%TBHmFQaJa-GyZi#@RIC%LC?o3^nrbmM!Cbv2D~A02xI`&Mc@ zI%afmsdm8;^O{!nExomw@cr1gHvbPu8JZKKl-mptppH}sr=M*dJk+5%o?>!9P znMjAehwVVuPU{)ivb0CJ@T91nL%<$7O}QWIf2_ol@-Z3Ijx;gFOze!TRW{pKk$9U!^R@i{Ycmy=KW`6 zL(&P)po9K%+yEm(FGk7%c8v=A^~b{=I)HVgVA%1VEKQZk;eGP^!>fdLDMjJGMC`+9 zG=G!gnjasr+7Jgs47-ap3y1c9AG@#;&QQ|BA1d#Fm)bxn0cCvUIKj^Gc5`uYQ&Vwq z^Yt0&>6w}7=^4t;T3U)rnwpEv8Ms9f<2J@l2}^yky%vnCIiRN47c=f1HbGCgi+Ez-(P9 z?~!-S3eDpUOuTnQ8O563kN2WSiVVeYDtHZWEsW+E?GU3Q>HJaW|^6gLt9jsqro+w7;0CX1U ztG8@PW9fb4>6(R{e+Ke<#ix``<&@pg`ZV2KZsPMkdJb4n@BhX=Mx#A; zALBrBuFFaL81dCAi7!tAkM!Q}kk-F5vNzZlgt~QJN6p3kgNkcv{Y9b8$m_xvsMaYz z#Vo5Sd~l(Fg*m+v9&yijbg}Q_Mubr0HK^V59DZv{me*HSOP?0^qblRfXi|-9R)!8!5Z_CKcHaEH5Z4Leg83A7WV`v!# zT1fT8%cTE1c+q_~S`@4?h1?FD(7VY-__*S+-$P=HL^8V}-9!!`0T6+&vRbw-J9zU& z)zt@A&!6(u$1`W%!gF6Er=9xyyf>DmHGVE~H186s`G3hq&Y@l5x;Ufe3gk@y9jZUj zjQV|`xJEpm8)xL2A`kiWrCg79t73jcW;g=CTZwY2Fe+i@_E&t^<)R#i2mS-Qg75O-I$Qh` z`Kb)m5j_rxL`@o=-xL0)a=mE7-XM?iJkHZ_G~jpv_b-b!X~OZ2&?-BTmL%FV3vm7~ z9LMl{bL9L3oEM_~PPG3Lu2HAvI(z_VPxzQ}A?oiFMH0I_2xgp(@_2jY127? zeFhl%r+juPg`lx%=+kuEcVHcK43^?!;g=N~U$C#J#~JzLT9kiPSYT^N z;Ahwera_0%S9}aO{Iz@??YqFs02|Im84^xBCfxhE-F#tFHUVFNmGis>8|}|TzDAER zI8Wp#X&4s`a7VcR2*P8XNR>hOYzdcF;Qk8X;=arV9FL0(su!Lgt*Axkz zW&p6df3y=u$>Jh?9ICKEVF5G93Z3Yx4#?G`6>P;N*EAVj|&i{!6 zegz&U8Y>*iY~X$hXdsL=ayUW*6~Phw6zh4})T z8s=gW9h%G3gXSoYFUCG{_F@)*_h7GJH1yz0fG=Q&`;AJ1lB+bsGJY<+U5_fy<14UV z;G3_l_+H^-n)l;!_J9`{asMf}qEtK;{_KNkO@Hd}jx_AyTQHMKrG$bz=^N7@On)K$t@O{#bIfbad&~#T&zoN|zhiM( z+ANDKms+l|9I_m>d}39sChLH8t#zCATt8ANXJ8c)+uCeX4 zy<&UU_L*JSlkIkUuD#iQm3@!>=l1*TkJ+EKha8I>YaCk~=Qu8PT<6&5%yypXyuf*t zbC2`q&ikB?IiGdDl;O!J%c#%j%$Sq0G~?8aTQc6y_##uuOwDv==4YrvNX*PmSPxV~`byBpmXxNmeH@}zpoFzO(B@io4d9S`e1edCyX;v^eZ z;X6$lerl8SwLJR8#`K-VXbL7G?$oDouoFbDwYYLpEpds+;esz;y{0eRHAJqdt(M3& z)f2s@{|OMi#P2@Tm*L9KW zR53?xid-KOR`5Ty{%0W9{v5eJ3|^&+Tpz){m^AhJzci2;S-bkSY&!Fl4TG+pO{WjK z+BU6UR# zZECAj1J%Eky^M2VPZ9o1&CMhvyFhr1v4LEe=gwLj=NsuRZ}bZSpdDP zK%RQ!2_mHe=W=`;aU)}OHL#$Lfz*$?|a zq#`x^1xEUkF8ybt1d#}hkp8De3hZyu|EiIW8q{yJ+CgtlP*x^*IQ{ok7j!ib*0{OY zsgVymc>ye#^j|VFyP zg2zSuKSQ%H1$!|q>3^+$+y5F`CYFmq8INx$Umz|NkBIB=1<8xVZgH8o8DG`EU25^4 z75;*6F8>%`&q)wh$VB`f(kH}gQZH`7_x3->j+!sTKKzfOXT;O^KSe7r1Xp1)9sz0( ziNoTz;#u*WcpkL9M*Km%fUh;(3$*@S{7C#syeR&Nf%`!G4gaI{R3LmECfa(SeJ=*$ zG#-Sl7?^D!p)>Fe+%xh2NOs_}hi605J&6B#x=WlR&K2j055-6LFC~8#L)g*vE9g}J zC6i>bOu@G^(xd@znwn&~G-DIARobLoI`F;r44H{t<=OcD$f&p#`ia_&&iZ55GopM04fi#X`(WhE^&!13av!O;JW_9Yxqi(lCvV@fdez|8 zwQ81%PW4>f88>zNmQ8$9-Pum(&b9!LsVqH=q-?ow2EmE+P-gOYe=#0g!Ha(8}7jU21-qPBpYLDr_{b#tJ z-rmz1q?`f~a8iMU63MbC!yn>KqMKK)(B zPTP$8whbGHHtd*j=dT$%^8oUnwsmOfiFJ!+J;c~A(0`_4giEvxxJ+i!s^vrLH?Cj1 zjwxH(rVp}=W!pEdVeSnTzV1F0R<*Nj#l!pPl0PeV`OcpArxI9>^T7&?gS9ieN* zv%AIlKIA=!XY}O#NS#a<`XuxLJ(qvzJ&hL8!&{)0_c2nRM4nAt@$BVr{ym_f_d*|p zZU{XQx(^g}cIc*1f9O2GI2DvO7W!4_9K^psOJ5HiqB5bsPQaNO3;jdn{cvjfPq{xH zMNO0oLGA(eTWHZRQCMg=w2wv@oBB=ly~aSM$p?lJy2zZCjo=uw2>(4RtY ziW{WjE+Mx{lzK|-j0YgAp3JCB1KMZ4+Q)E`<+nwy2j#2Io8JoQ58b%HVu zM~Ay_rk0fNNj7}{M-+!v-9}F$eVdvqbfcUSx;lKl0d1l1AECbp&UqkoPx#3NksNeI zj#oqHhRz6G5V{k0dx-ZzWf+ObFTzui`>EH^BXUaU{;5y?_wMD9K+6ad#EpVxC*U8C zC*_=xJP`Exe%1hjS$1U2ofttP%$5Z#QX?q zR)G-9DiPvX6+%3#Mo55VR0C_Q79ok%AtbZ&5IFlag2XOmSKxdlg2eW)t5J3zLK3?M zL4qaq2;vf(j=EIL1o*LNK|De!ASWOt89{?~rZ5Ap8nj%CP{wo!MR;yP{&a*GmWdF< zvRMubFdKrAwgdkCR|9Yo;lVFb4rn`HJ1dlmJ*#$HED-asf~ zZ?d-#|0_ZfdmEvMeSlzs<@*V+A%PYM?+kb^0IVY5T>-qyl;y|xRsfTU=*cdo7d=TA zl#(GR#f<)3!z`k12a{qplbxwNOL+nEW`hIBPTCWCQP`L7Kwf_ox(AZve%y~C{vyIK zQ%&Wj3Em(*1}MS;!}S%Ci}LUIk}C3)uA$q-8JtQQ6jDY=)A2N+MJLiIec~6om87L; z?>o?~w~fnA7CMY{SOGX6LEk=wJf32U$hu?#*1r<_XJuu5fto2Cg-tTvC$#5<=$gn< zj@*Yn#?$e;NNV&o^Z?xvo+)3n{q;}E(HOo-5?Yj{>t|#)Ms%-SM`ZjWHIhC;p0{9w zUP^ic`uC2|bI=4AfL6|req3g`Ewni*OMco5}P{`HuGkcfeAdObej7H;xBGHXNM7zgcMH~Qd|d# z4W9*%7k-E}>`cgW6L9!-=sV2XzY`MbDDK|D*nWL{D@DetY!S*i#%C>GgPT8voWWci zfzICoKKUPFQExi*p{$R|!($ZKCL4ePX_O>jinKJ@9_lD8$+kzF(5@*$ucivUY7lx= zBlN0K;4nd8FG*l2PG~=)(0)dtZ{h@&5(It{1U3@T9yQu#5^c)_1q7HBw?X(mcE@f( zn=*i#-I#^G7`g<~Q|N%7LRDf0^h)R~NU5(e@Bbq756lnWp3p|eg8?1#2Ds+|96u;4 zrk2Be_z7q^YTL2#dJY3ZcwRX*|MBi=hWt-|nXuPNp`p#Jgz`ps4!S=X_;b^EPlbV5 z-%FsQ8-BdklS@I{lcu^))bal0XOTNdrz1GN9iRU_gZpnIGbFU_PvbeKSlt4uJTLnL zM)Xz8Szr8~uK8X+#-Tll+2he@T^D)s!`J^24jvWuhnRnh7T+6zFYCd`UF0fc@S{YV z@|<0i8Q1L*O%lm1Uxfy~PvBbCK0h$O1I)JtyfEd%2S8kXP#$ea4B>wfIfRamu7&iG zXxlUJ<$Q)&CFb2f^#?!H|CRYa9FQ0F|LEZVa3Dbww;^!M%iCc)OhZtJ*?EkZovT<6 zf{OJbs4+tyL{6HWtHkU)R?N<2`ypP;&J%|7G_@&qy4 z*0AdlbnFHMBl|sqp8WyAAZFnT%))O%tNw_&xPpx#D8-CCo!ySW**yqcSR*Oy0R%2= zk`yruS71*43H%chD-`ySN?4y-VH2rf5hcO)Bo7H)HSn#FZ^R&M&^Td(#t6$PU064HxBUNB3Rp7`daFM{4AZP>@QiWZm61J&9 zSXb%7x>5?yL#psOq>7%T3L8r)>`{ZTv{b?#jT82kO4y@u!XDKNdo)g1U@G)H5gwOz zXohL<5-Bi_G=?)U5^Cx1QtsHYq_v%%h7uY zm07^OAM?>GB9Q;ZE3KFQ3%`iP{Vx>33=^#!rV^oB#LC^l(2Y~)xjzOkVqryA znSL}c&0&Sz0_?+^4e!m>g#DlXgI)VqSZBZf=_ObJ?717MR`LeZdKGH^0ygNgp}S#! zlU;c)tdMbwB@Fqbf1!q`tf9+8caj$*^t-6UABZCFaOk?J52sq56VC}_px;y>5#og` zhzFNoMO^qvV}vYF3t2$(RUP<+yrN20kHFa?1THvMh56l?u+PaS7$Z1SB{(x)aHd*t zX1w4`wct!iaHbk{JA_=}Vs4uOE58^sA@U?E#N0MR_*OH*^EL7qCx36&78jn|lE*kf zNFBY9*s|==3yB>gB#>T6Aia=4>0*{=5c1h5G^C`9$?XGU2(fSBrNn`?(0{?|1&r@-h!q*4 z2CUD$AX5n}?bqNr#LDbXSw|CVZ@WZ_RcKeJU#79pHp~@I3e5pu><+C9 zofBG$mDTfD+5`pu8?nWavY7GGsv;x~+Wib_`Z9DD;_t#cx*5{=Bg`ev#Q7HZ@Lodv zK0Min^~AT}Q6^l=KjU4TIo~M8O-0Vs*eII7BTtMAqOjLQd!e z)yD`qp%W59CvG$VLYD}X@qw!FwTYi;Q}IQ(#XD zB%UKqqcsSL9~K;z!E@0sJ>b0yKgUNHZ<2aH_=|9ypuR6r<|Lf8F}=7LB1BQfs|Ll3<{)QH;d`Z1b}s%=s<((Xx#(Ki$AjNnZIT@r2;0=Eib zFUsD^I6={}jVKArkF2a#;E`6gVg>!h3i?wC%8L~=7c1yYC+JKgtiVJ;XR(6L6oQ`A zf}YfZo?-WLL&sED%v6k+?1){|t*PZ6e`O9ag{fvRH=Xvcvus?)ZK z`1ne(*pncq!#hDVN1UsK6=ud=7J?Fc*gge(+DArqvr=F~DcYkHEl~Z z2|K!IPZvikQUNIoPd-Je+`c^4fH<{p6ci!+Q{fiehIFMEh2v4UgfXEJlEer}lUied zCC^2x6#~DKz?u|prQm=`ZKYK>2_+H$F9DErB7a0D5hhB|5(fNbBNujm30y{Kg`{c1}EMB0(266MI7s{|e zi~$X%LaOHhV>DN2VVl`bJf$2P!q*+)>zUy)7liL`313G=I!V!YxRN{h9DW|Zo4+f? zOHQdzS|?pD-6y@HP%3g2(-j*Pmnj~RTce=$SJb2U3@yYw0yOp+QY6rV30Imk(HI+q zHvWDN;u`Xzll&t%1S<_k zG%OAoLG`DC{;|dLxH$$U<)FO>7ExlNMFfRv*8PN>1INutzIcvSa*R-OG0?UEQM7Lu)QfQB6q(^coqK-7dCA1!rCrWT=+6kC4Y}y2k zl=R<9g)szsOK~l40eOnmQT{jSN@TGJd4u9;7xt>7Uiy8BJBrc%Uf9;yl|uPQ0wl3h zS%{bM0lrOoM0!nn!xC>vwPaYbEx8uE#bv3ov{)8dZnoy;fA`-?=mYvCq4YkK=^rn{ zEE-FiB{N*6GO7$m8Aa$T*kcc2y=r5qC&-U|a_r;7j~{;c@PmgRIDFsXdk&8szUlBa zhtEA+{ntlc`#6SnTmKJ!95SA|Og~QgPS$ziUYr0`8KY9i#>FQjCMBn6v^ssN!DvcL z&oF0ZW#?F|xwgD~yQ846sJNum>2jBOyyZTBprW#>x~8_SzM-+H85{rGJEnDZP4DjM z?VHg*FgSD8>^UdQoi~5M!bOXhEM@2JI`4wrS6qGF@2>y-4S%@l=0E=Fmf>4RMsK_0 z_B;3Ab?<@u{>(NFop{pW?bn{X=7X)P*)Okz{$VS(iPo+CIlJ+mGncQYn{}tYz3dm~ zTz>H3S6+Sdt=C?^n?3l*d;j^jcmMt&+wsO<+1VGK^{ewQy7-d+xa>FV(!E#hdFaq% z8yS1_X9A4EsIW^{N;gP$$;1D~X{W`}P)DdHycl zn?+pR&@`rriP1F=>zfx3r{YlIP~)&HX=)zUHuvLZxUGNg_OX~4H5H;{oJKS;@?+Kb zV-=#~kK@9R0hvmV=n$b|u_7JOzU`x`22|EGmXwkh-;Cytavs;LN!3?1qY=aL%^E~f zn}^T=im4GxL9CQ82dMx`O##(daZ@Dy7Q}@4-3Vu{no+efw{9cdIkgBrf+I=kxHFarLqsd}58m-cmLCaQ)#bmTvq2RD%kMH5R()G~m z>5xPtF^c*Toub~Yv-`@!Ak;R0^i8)ZL$5cRl=&B$%zAwWBK*K;oZf8K$BkMn<1vCw z6;z^)X3Q?y(8JjJQI#fUzy5-n&l6ln#^N;bs`?`%iBkOtSGpb;PJdt|OO31Xfzjjy zRs93Qx(7xwW07EZV8k3-KcbQ9-T5}PEno|H#o<+Z131(+aoF^@S|BYu5MbR zSyxk6v#zGLc6G|y=JlGBYie_w)-~OJ`|Z9%<#*s$e#mz_A31c0#!A78LVF|&xIGu1 zU^n#tm|bU3)E^nm*CnB;iMp7$`Xgg*orKG1w$6pLEL|EhxbswMgU#pUjzBgy`J9rk zyp9KaUdREp-C@XxtY*3@pF?x~p9IHx*z zN`1Az4(WTdtG)^1a-qv)gi2hE${1MShmbh)M#NC|=9O#k(j zr6m;=B_&m}=-ITw!fEu3t13%ND=LvJIlD?qx?Ik#qM|P6o?}B&S!1Ke-Pq_39*TP4 z2`AFn2 zTx~QNb2tXZq*60e9mh~m|8xPn!|uS~prev*U}bjk;F@`-^t6?ib~~E~olTV{Uuv8; zJukko#1;IspsA_E=J0Q7YRU*?y2^V4Jw4{){v{{0&$Z90FKI7mt#dV(WLxTu2^IDk z*36Td_`)`8b!na>P!ud|YPB>KWHq~MT4}5}@g2KZ@SRF<-DHj%XR;{XlFOBZD%tze zpP(_Bk=Qa|63sWMPnkBYrPSy3`btlFZ`-!_7UZtlzvYyBR@hLN7G<84%joPxrw|Nk z2e7cC+*jJt*@<%HeAV46a~Hg~ZToxkZ7c3MMYJ)OpUpjJqZYG?5jCWOUhN1t0w#x7 z9Wbd)YKO^o`C{XVCmI*WI8}>HC!T0pta9>i>I=%t9d(;F)j7(`3+gw??apFL`Abq2 z=9|fERH;$8j*No;T}QytKAX=AhVdF~+*o=4{rFq@V)#8FEVw|DvS zy|ZWU9U9s@`{ccQPu{q9??$xS078m^e5JL%5fvn)0uqwO2nu6#wdeQK2BgxHy*D2l zLS7#=3~frsd~HmvOD6tdy7X9FOu95&+<`jCE@BHJjfg-{TMbtKdB2&_Us<&v+iU+> zd)0{zeY@81_MpFM?b%xbHFc#9pC?dqLVe>Ir_byRk9Fuv{x#|E-QI$@;pTRJO&~)cpecY=B!5C~% z#e6~VA)dW);lhEx|NX{R{-@yVX*Yhs=MzsiVcatSHyfI7OwyT2?#Al$kh>{5XgQ#G zyoYLs7ML|mAR3C=aZ2l^mRU1f<~G#w%Y*l1^t&sURMo9%p0UYs*_{5`#@>1ZU)lLV zMy_W`Q`2&P01P72S~hT<1)YUj?Ya!A)uPj(*0?B&GpU`B?j$R~K#|cU>p&@noQ44c z!CSp!?xwb)%%-xs!6Kf%s=9VrRpm+Tzc`iuW>!nt+)QI+*-Y?=AlcgI|HSi>x&w52^Tpyy)S4pNzmpP*GYr|ZuMCW+{VudUcnCqKb>h|^u-L1xQ}|{(V2*IvUPEwnbBfh9!3M~4;>{$yDZ3}G#8`3K$w$+ z*FhyGgLY(;&ueKIY+O}UwW?{bv1MMv+NS2U_5AdKy88ZwUhl&AiVm}R8kBIuybtE5 z>Sokd_So$`m9;Z;sq^at{Us&+0luZC#^dwF#rb@}k1MhjitLJl@`eU624$hIq)h3C z$QUT(k$314F$NZ0DsjD_bJ9D|HbTix=q6jPgW4@?A&)ok zA_*a>>PJ%JVB7g8Y(q^{d|b{&=;0a7N^xMNSFs`R0R)3i_Nf7w)>1x2)@poZz(RS zt@KUL_T;Z`tvQ<_)oNJ*@9#6-}*3*A;zmNU1&S5)A4`wQEP9o3HX?82->b9{!? z{m8^XNX!?nAe^IZex1^v<;^vvo*1_hr)z0RWq?Ss_ zoNDse+D{)`c*C;JU%)=nEnRoQ#RL35<9!A0epkTdnx4TI+_8G*#k0Fs`(3#zd)eG+ z&6`_Fa_fShC&s0l^ZFZRoH1?r4fFfX=&Z=7AGm1t&$CJcbKGTh<#sXN*pDIo60$`N z>dTPl6|p+L|AX#>7eZc-C^4Z>gC6s(Y8!_wn{QR{FM_vJ&*zCNc+&jf`P_QZ?%mRr z$A;eGuuf>F2&PVemjZu|m2{R>mjaEr6Jj)tbe0M3N77m9Gz;l0y;V%Dgl1ASaS=0L@1G%src0rb8lI393Ws>|$*1`BX;#NlF9;OzN(V!uM4XCp5!aZ~6?pZkN zwBoj`WmWB)o0~VcS1rqGU$QT8_EpQ5Up2eE)=}(l-PzOgvo>Fe<1FGE>h~`6J06w< zYBT7d36DTSQ*U7*h35ptJV2@eR8h>eJ?{?fnK^UM(7W&UZmzA_+;_2b|!a20@?0DO+c>JkJl)jB2NQW1t8=1bzu9)5f9Dn2iGJzpB^lCJE0 zx$}K8Bqrd*p?xE9vGqGgj}Js^8wW8U$_Jkb?}KvaG1;*wWm*r6aH?>pfoKKDT$#-g$g<@9du!7I_G#JKKu0c6EO4 zubq9>kUWlrgB=0~GKKCOn&QJ?lN`Yv0|WdV9G>9Qn5MtY zb6~lJ@xZPDECoqh%%W+gkMTjb2hd;2gtZ*lTo)n_?eK!_K^EtT3fW|n0~H8gfWseX zubnoqWubpo?&(e4_59hObLHCnf{8YFh&JowdITqh+p5Pj7ht$Ij@#aCMk^gFgMa7F z6})8nVYK%5{Dj~`!D}P!83Dw^xWgLTna_n;{MW7k{Kz93MpqCU_FW?8WY`5#9tf(kkBQKf- z!5`j%-z-^j+2G)1OP2g*Kx(L6Kdp0pP0faB)7IDWTldbLyLahQaR&dj{j8^ZXItCO z?l2D)i~buhYo}h1YIT?wjcFo`GR}rt8?!^qkiFc)6B`$mc@{P7AK>S9R^NJSb*FTt ze|{h^-yi%hDZV|}ULpGPw&;%@_7wW#(5Xq95V|FIG5BrOqN;^imhmofp*EoMj&)YlDKBSt^e_B5*~1K8-~mp?!H2iZ(>_sERy@G=C&OVh%~%#%*zn-hO*g@aPI~ z$^BA;EN7CTFqaE@1;0+>F_~utzfy7hDQtZIujk%3fA>_LVwi@qahSb9 ze$pUdehj5^1hZwpIs#-9k-7u&3~UcK#=bL(!b{6n3zJa~ln z1V@Rcu&eSKDS$WOqWmK??^j4w#~vw&v`;EQpAH}o(|S#|p52wwfs4S?Zs?tZSQW^G z-!zNu9Mfn_>U!vTyM|n)@ZZ+&7`4cbo+w#kiZ+>z2K0fXsceDz1AKe!vf}QtvhLy) zl`Z~~4vWpPsCr;!m!Z9|yt%o&u-y=7&Y$M-cH}k9cKfZl<%N#Ef#7WqWaU)5oYgs4 zaF$pX_(X&L>mbWvg&4F+#Pw!v3|c4XTt_;=tF4Qk3_A=qKiRk8))~6GvIooRmjnV! z>dR(jb}gDw+%Y)VQ9L6R%oHjpt=}}gdsD5`-m$D?Wq<#wQY$vb()hc8lV^dGbQ=E@ zt$}Ke(<)H2Y=o0*IMQ44-w9L0RlBymZZOB=?4CYv-t_4%PtIUn``TJwxw)yNz*$cf z)H@4Gnl{tk1WDBK<#_)_(3>%%Hi0^qBGr#&Y89x|ogaoBHu6dNX(u82#>`pNKmXEt z_ss0BF2juC_QApSl0HL+-C4V-d-|sO(gMzp4e^E6(pCNaD@!clx}_NO&j{Sw*jS=Q zM?K8ZP!D&EW@zH}EB*K9CAju0PO1MOVcg}F#jWG!Dj8RP_+_n5$>yqC)6%}GBDg(f zVOLRaW?tu(_6_w1+VUk{%WduDJg~W?Wy>^u`(jI0S!cuM&Of_59ga>gEa6&%lMk}p z0I$J_f#j$b^IUlBwPZ7o>9kthkvR2=1q~VVS)AC=wz#ivdV>?I7-{*ArAxc`HBI@Q z1KNs&GG~5Ma1p^LJlF7}=xa9i=b52BwB`hWEzk;6IajMAj2l&OONy@5idof!oetKN z?Jn%=h>W;Dupz6<*F48Oj{3put}~Z6%q`>#Q~OFf1_s+fVJ)_t_RdzjyXNHX=^JZH z3#J8&*DuQ{c>*GDZtBK#<}e?I|oc^#=;C)nB{XLNJjzNQ4@Tu)PL7w>TS zO0qE}>R3*L!~fQn>Gu@m`8zv;zZ>uG8)%1)=0(xtjwb!kxL;gRUes%(ara={Yihk= z(AKg&!9U6JL`nk8uDJ(Vj^hra)9n%T2o!UrlUigJsoy? zhsQI`ZlC5!Y}wq_Ml(^ITbjMIJf4|e?@W(pmX~l&GP*<3h<=ca9%1n$xX7Y`xK

sCThqIwDN30sb*&M_M+LM0OWABUVSMi3|i#h=KG2sHUqcXTX)L z$?em2@xS#HxVshZtl&*V^H%7XYk@nvuxT}UVze|`fY>n_r_GA8Y3<)PX^q07C2s3T zpY8J3)YVnAdWvUMtZlQIrk9pgRaaL`D_=hMXB}Iz3QF?wY$-_@6;6A-y{+7wTVS>1 zBqwE7dm8#_XG=WVkt3}Df5Wy`YGX+DYP3dbPJ))!cimW~A{#|s;gJnga#&pC@9XPY zx->m4B{SA&txT*6@S3Kx&T0z2keQnhSCK<_0_->V-()%mVUMVQrv#zeMp7_5LcKv& zgn^QJ;}>VogJ28z1hKc|I)BS&1|O{P6y@+`5K3YK4F+Bb#3bn6mw=1x8^1YK8q9qgB$KT1#edl>J-Id4DajoOk+yHvd;;CvQPDZ-D ztjcCiPdD4DEVZ>}htugW*Vf)=t#dq`?eI9VpDL)$4V2oRZ%IvUc|O+}wo!ZVj>FlJ zH92@k0)g<79NI)SbSToMT#c35l%^qHP?Clg!`vp(mVliaR*dO9=AG0QuR$~{8O|?X zPoyE1iN>Al%#~YVD-Brd3Z4?pd%B?38g7%B-@wVgVJ6SCNh8548>i8LJsH@Krki9J zL{{8nBO+kp&(^e9icCo@|Vw3uQ|g~npa?7 zKA(1`lE1%$-2}Npx;usad^p9GHj*3ss0JK~$saxDmKv_xA9 z+~xzf5PK2SV$}r#2=@_hw>l!kO-2(eL7+zMhgJ@wpMO_2E2k(u&6<{0m6zSnnsV_; zYMZTgMNP{|na#tz4LPA`8dJ0gC@iMap?2n;uIh7D~n?plkhsG{BLD&6a`dwoTPwdFTeIa_;*^2)M{oP`-yeL_lxztq#1q^ok} z*X0-FfDB6VOj(-vBy)9HQB&%JZkst*o1}B*Its9R1AVHL{Cv6eYw)WHUZ9=B39exi zST-g>^VEpeq?v4NduX>uc;RjkyRB%))q%`Rah3e?HPtL%^_hULU?rFXzXh2`HeEHS zY|NBGR^4bI#fsr{r4)jLa#AL*EriW1DQwz>J^wbHn4^k$MW=Ta; zT1HOkK)H9oWyweHb80(m#Zg-dB! zR6%^>&i9FR@T-HT^8L?0;QJbIIppk*?Nd==u6>L@0Un_7bmF}*Gc-yHcyiPo9#E{0 zM+Vd%k#;{YplV`NK~BlshV~1$GF0-tODeJJph}!QGt0_gt`C-#4SHfqEXypVrtG-J zg4NCX^mP5P@odP<&qo$d_^<5Q#YYRR>6VlwFV9War^mmK9Z zhFDEASTngd_>{E9jd3>d5uSiP5>KSCQLWgvX3}6^BK!zZEI{mQ47+L;wztC>)Zxu8 zD$33&Daqj@?OsnuhsWD~up~RDxHu=fM2s65UoT1RLO_2ONXB7PO0Ez*w4X&6@))4-!N^&xw1ELp239gA6zHWl3sgsok%EGzaB zI52x$SJ-3hN;4(Is*Jih8gqY1R|Y0O!3Q@07t4abGUrH*%31kkZoF1Tb(*2uX>BS6 z*4`M`h^;BY*-l;=VUEF&?mnTEv_h|ItW;We%*lU`C=!mLI|QSK-3MEv7`TjK5M1u4 zJ)*YAQvZDxdE=CYa1d%_Pa$^(Y8{hOOk{s)1=E@$!$@`z&=V1I(BOJoX@*U&i#MpP zIi(pILsouGNseFhvn-P#1-@DRU{gX~R(`3L#3{xj8Dns(!iVwr98JV{fSw8E?)H5L?fy30CoE^~Jl@c0V1D-dwGD zD0-WkXfi8-cPGgNSn$}5O6P1ygnj#3#krmYf)EOFdr|Na=}Jv5_V6=}jlIX=UDqhs zm;A)>=N}*E`4{|h@w^B^zDBwRJ@YeN2{srT39%FxsO0ODEU(J3Nm45zs`lIZ5e1U_$)Xo$?7yO{Z z+vo82E2aH!(%e_p=1-1i)T)EZ&Z4u+8AD9gpp#y|jtgBp~k*15)92lJ^@x zU_=6K7JD@K^}P9fAAf0Lh5PNdY4d?t+m*Zte)`-Q6Bby^` zx@mlW1TU)Ro@2MlyCgoSKTPt9`nyFz^y?A*dMr%WVjWtvAF@U8$6cboQ`5KN{T{-@ z)bvAm4|5`&;LC6x!@H^z>4XP4eKorkc;Kvo?dD@rETl9o1Y^b_@A4hW-@QA3_oZ~c zl>Y3OUTVkfrNA=2;s6_y*336$iHOM=TTa zaWJEa+l3>Mg)MRH#6G`{R?(*$n@apOSaP1ZR63_j&z@6y?+f$5!O?yDV5@4}Ojn_WG0Zg6%fKHLaTpoK}W$dWFEn)by>q z{Du0`&Xs{-+z+Rs1D6^&I=n|4L0;PrJ83wc7l2_{qCh?DgIH1Fe?2JJ2xu*j&V4T zt($;zQ2ORtb4{tZCnhWcqW?jD=1_tb`kN#?nA%}c$(i+Ns7 zQ(0+auEg_$+j@$tJ36Who9ve?%*poV*(fU^nTZQmun9keUK_681EwWKch;k3UTp zfy0Hl&NsL`nbZBpS40g<{gakJ1NF}QVnxaKw2-QGeRKQ7qA2JE>#b6Zpo?iT9nF%* zd2%|@(J?_UQ_~OO``AQZayrqA3}-c%7wMrt;&PdQ|Bwuy5|Fl!S$t_BAyXL-p<+OWFGW&~3?c6gHQx(auyxEzIz-1D#u%8#c7HZfGcW z&KYPZDo;zRE3~-_?Z@6L>vy|nl!4gX{bi!vqMvU_#9#fQ|Br2x)8%#({|?A_nRC2! z!aLsb4C6OR;Dz!l@PBdee(88R!I#q?!?$uK(rG+o_^W#XA3BHLC3y$`8HxOy!mpaB z#VmN(>>7^2mfVOxY5Ib!Vk;N6utSB@)sjf zQIF^!2Jf)FX7^*o?0JmP8$}iT+=T(Gmz7#;Z3}!@J}bld5bK2_*y-;!Vbyuc?g}x%imcmR_9F{-ih&Rl8xX|G-G7fS z+l{x0XoA`#vDFSV39<{k$S%V?dSd-ntm)7a8kWw)dNkQ8N;C9i21XN}WRorf^Z%XL z5{g$e((rx`c1|1_%h%D?3D_+OWVcM&LE#%W?hRH+9$Z=gg}nDkLwRRRTeN$|jNOZ- zosq}y2=3+cgV$mD-I=w$w`&8o0(SLo&)QbsDt5`8&{Dr$OaY|0{??z-rrd!ZOxo}g zD0I+n&|EI8scP7TW7YEdvR7UhwQFdZdB!uwVJ9tfAdwCgc&8Rze?KFpDT3H!6 zn9D8^douTKX*q4Py*tTZwEa*;ZQ3Rtx(Rei9ysJw_^c zfng_No6#@&yo)-PdZo)wlKmxkhhEBIuSoBL_vt@AjHZ$cVKiBIlA_;h@JCb*HuI!b z6%&(EeN}U`v=jfzO`r_i6PIHDqCtqdw6aGDTxuf1c z`yZrB-YM_1fiSU4@z{s-MjP=1U}E#!%^vlN9)Ekvs~!aB-+s@J-erD>PZ#~MqEF}zR08#D1ZxG~?-;C?$vwR}%`PR0 z*9h}U^B$JFZ82uxW=glSCnEv)hA*E#$om8yY^ZxA3$@DF7`7b`A@HmOh(*VJ`s&Fj z+KK9waWdMSwkZh9nTkHDKXeA~6YojdXqPzcq&C6!hn+d4p5xR!>5ZJpHBWw<@_QB2 zmq*U!7R*Bv7>jlR?rLZ#DZz1Wy||RrlWfC#meLmSo}~#EW-1$v!8Y}$Mzwg!>#5N! z8@+cKt*xV1Jfh?C$<2f}iJlSerd;E*Sh}S9_{cjn@-3}s%I|H;{7}#1gwHdp?qi%CqHzaf-!ojMl_(S?e*NNIy;m>7iyjp-&&=S?;KK?9uMR$!apufAdbgu)Lsz-Mlx8gN z+)#TK-uhV3S8hx*8Or;@d)l=8&-{1j3++9|+ti8_+Sodhj15ys9IxA_K7f~fH4o6H zIkd`Pi&0~F05Qzh4Yt*pb(h!i%&yq3%;JWI;!OVM2QxAf@jCq*`}Vy7J|<+o$LU*G z4DU5q`FlY#9m1Z_;MslB^^p6Y2z#QNPo$4TrT0ywORtJ_Y^#NT^b<;l-PkQ**${dJ z@T4b?^SqCqqb*e5|L)$v%EXDifgJwk1a>R%sDkVpR=MPDw({$@o0@EEd^J*cYyP_6 z25L(YzU?$yx(1eqiQy{RmBJRek=1*GspaXHG@z_S+h<5c#2R>NmAztqEw(hOE4z0Pu^ zGw^+cL+~MggWUw*FfAWsx%?>RO7BBAmB1dLGVr@d%bAxCFoQIm`J_^oB{`V|aGIoE z=9LtH)5^*bFQfdTEMO2EaXig*iWG*ui!4q$h4o0+q09kXD{_3+nO zf^-6|LDr)v#Iu7qj^TM%__`R^PG-k90W1OrU@A7TWa$EyC~X9M`oCF6v3`R#(+-Sg;!67~NVGmqn*>cv;mq*=^N zZ54T50KWIKN<};?;XANieJ8xd-vDpGJ^utsV>Qd!-m|BbljYHJIK82?oV}a{eINp(7 zL0==|Kw}Ygpj{2(p2jo!ps}Dan+d!T-j8!AwllXF3ycGeMdZL3{E_gF>&G}=7x<5i z1C2%0!9$=$x~Jz+hZq-(8C?mMat8A%9z;I0i(@8%?`5TO_+t6P;3aU^_|=JLz%Tnv z_&6EY+i}3xF2;n$1qb*iThS=^!$tHiX#O17lIMVL=s1yeNTV1Vl;sYT!NJahJwRi3 zC(GfFfHvO4vtvv{haycrh#tjQ(m2zYV$2bv=_>tKJvsESo$NVY&iCPKe|D)snlGIx zT_xQwJtO^H`bJTrXi{ubJgWFo=~V7e?pA&lQxmf?W>3s;%;Pa{sY+CTP(7nIs;8^B zsrRT4sK1T1#Cl=}W4FcrD)zS67vhrRYU0j{yFWfY-X1?a{>1oS#oreHT>Li)x&%u? zRYG6F(u8#hcPD(4Sd_Rj@s`B5l1h?hCGAWaPI@ls-QO@XFgvrTiG=0QzRTaGYSyHA&>o2$D>cdb5AU!%WP{{cRWmYSNEdS>cnsRvU( zO8pw2rc5?;7)~;rX}HaBpWzE*qA}B0VyrRlGVV6+Gu~{x%XrZEj7ekKVA^TgW!i1p zXS&&Rm+7GCnY6^Tw6wf5cUnzaN7`W8y0iz=o=$r$?ftYb(t_#k^b682ProjGIQ>BS zqv7v*8MAg}?asO(>xFFP4+KqiW_Ce#Rrd7kb=j9>-w-IFA3!!|2@~sw)op=^J$vPXM3LS7RxjhJTo+X&E42e7&MJ?;uiFn$L zboqWjKp^;=L@mxAc_z2<6hNdFSwI=nv7haSVXZ`uHsed8RrvCe3w}Hb&hfTTzt)O6 zBQ-C>-CAJg|6eH=+OQ57S&#OuL3|l-MVJ`EF&pQl;@LX1$O5br_6PCx&>`HliKmq6 z7th@2r3ZIa$U|Qf^oVit0~+CW2w0HEatP%&p){p#Mr;Gdf!eSF^iA}RU+8SiY>xN) z3alh?1@yW6^;s3>K(U}``Zj(dtiFlww(9{w{<>)z{6QIFe@+&7EC(&K!aHYUdDy*R zhdeKU{YwA4vIO%#C$K=&MdAfYQtBQ zJFwaSTLhHQ4I1nPUDAIDrT;xL6JPG0jc=8n08X5TFDfs_TYBUF;$D7LR9F;Y-V3!4v#7yB7N- z9)qoT3r1%de89`u6Tt1G>~Z!N_9SeOr}6*kPlQeL40{$U!z-}6)Q^($)a)`!EtGi&5Bwk=YC$+KR7MZo?Pvw`1SM&!OS&!hh;Kjh)I)XJjo^Q8yn^p@zseJMB2U7bQz=}-wOq&bJQbUUjoies(+~ft;|_Kwz9@bh zH1NY%@%tlB$KInqvjcd8)66d5nOH^3<~iKLtvna+iRSTqZs!iwiZ$CetSnQXvTl{z z?QW58z4C3NJA7@CuT7rtHT=BE7rw8gs|V%7R{;+9B0sJoKd$BB=b{|${o(sS_*xOZ zM&LEd_hn(YWo7Xvu3B-*#-Zg)Hm#H&dD`TwuT9x{%EtBL#@E(N*S03NXa}yM9k_~i z;94FldhPLeV%M)5a?*E=<2SF|I3!0!8h!mZcJtQtPKtydQZ(+w^`~qUi3~#nRWVY{ znunA7w%--{bAyKTk3xwP{*;o$=u?jPa^tYFxutor_^RVDZyuJKmz;#VVTDM|94Q3^ zec$#mbxe#XF}wg@RE&#hXv!RoiH~VsysGK0&{Jasvw1j1E^`;AB&cQ9Lv;%o`+vzu B={x`c literal 0 HcmV?d00001 diff --git a/Assets/External/Rokoko/Art/Fonts/proximanova-regular-webfont.ttf.meta b/Assets/External/Rokoko/Art/Fonts/proximanova-regular-webfont.ttf.meta new file mode 100644 index 00000000..6f4a454a --- /dev/null +++ b/Assets/External/Rokoko/Art/Fonts/proximanova-regular-webfont.ttf.meta @@ -0,0 +1,29 @@ +fileFormatVersion: 2 +guid: f0155dcc7dd9dc848a0f10091d13702d +TrueTypeFontImporter: + externalObjects: {} + serializedVersion: 4 + fontSize: 16 + forceTextureCase: -2 + characterSpacing: 0 + characterPadding: 1 + includeFontData: 1 + fontName: "\0\0" + fontNames: + - "\0\0" + fallbackFontReferences: + - {fileID: 12800000, guid: 2f6f345d4d6f3754cb5e574ab4dafaa6, type: 3} + customCharacters: + fontRenderingMode: 0 + ascentCalculationMode: 1 + useLegacyBoundsCalculation: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Art/Fonts/proximanova-regular-webfont.ttf + uploadId: 616054 diff --git a/Assets/External/Rokoko/Art/Icons.meta b/Assets/External/Rokoko/Art/Icons.meta new file mode 100644 index 00000000..35054af7 --- /dev/null +++ b/Assets/External/Rokoko/Art/Icons.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6c575b3954b7a31428687559eba456e9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/Art/Icons/RokokoIconAtlas.spriteatlas b/Assets/External/Rokoko/Art/Icons/RokokoIconAtlas.spriteatlas new file mode 100644 index 00000000..71ffd9fc --- /dev/null +++ b/Assets/External/Rokoko/Art/Icons/RokokoIconAtlas.spriteatlas @@ -0,0 +1,52 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!687078895 &4343727234628468602 +SpriteAtlas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: RokokoIconAtlas + m_EditorData: + serializedVersion: 2 + textureSettings: + serializedVersion: 2 + anisoLevel: 1 + compressionQuality: 50 + maxTextureSize: 2048 + textureCompression: 0 + filterMode: 1 + generateMipMaps: 0 + readable: 0 + crunchedCompression: 0 + sRGB: 1 + platformSettings: + - serializedVersion: 3 + m_BuildTarget: DefaultTexturePlatform + m_MaxTextureSize: 2048 + m_ResizeAlgorithm: 0 + m_TextureFormat: -1 + m_TextureCompression: 1 + m_CompressionQuality: 50 + m_CrunchedCompression: 1 + m_AllowsAlphaSplitting: 0 + m_Overridden: 0 + m_AndroidETC2FallbackOverride: 0 + m_ForceMaximumCompressionQuality_BC6H_BC7: 0 + packingSettings: + serializedVersion: 2 + padding: 4 + blockOffset: 1 + allowAlphaSplitting: 0 + enableRotation: 0 + enableTightPacking: 0 + variantMultiplier: 1 + packables: + - {fileID: 102900000, guid: 6c575b3954b7a31428687559eba456e9, type: 3} + totalSpriteSurfaceArea: 0 + bindAsDefault: 1 + m_MasterAtlas: {fileID: 0} + m_PackedSprites: [] + m_PackedSpriteNamesToIndex: [] + m_Tag: RokokoIconAtlas + m_IsVariant: 0 diff --git a/Assets/External/Rokoko/Art/Icons/RokokoIconAtlas.spriteatlas.meta b/Assets/External/Rokoko/Art/Icons/RokokoIconAtlas.spriteatlas.meta new file mode 100644 index 00000000..39f527d5 --- /dev/null +++ b/Assets/External/Rokoko/Art/Icons/RokokoIconAtlas.spriteatlas.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +guid: c4c98c4b2f785964793210729bc0df2a +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Art/Icons/RokokoIconAtlas.spriteatlas + uploadId: 616054 diff --git a/Assets/External/Rokoko/Art/Icons/rokoko-bg-border-radius-1px.png b/Assets/External/Rokoko/Art/Icons/rokoko-bg-border-radius-1px.png new file mode 100644 index 00000000..325f168d --- /dev/null +++ b/Assets/External/Rokoko/Art/Icons/rokoko-bg-border-radius-1px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e8560c6d31da1b0ec03c02b45209102b99217d3e36c8910e139aadd1c4c7e1a +size 199 diff --git a/Assets/External/Rokoko/Art/Icons/rokoko-bg-border-radius-1px.png.meta b/Assets/External/Rokoko/Art/Icons/rokoko-bg-border-radius-1px.png.meta new file mode 100644 index 00000000..935da4e1 --- /dev/null +++ b/Assets/External/Rokoko/Art/Icons/rokoko-bg-border-radius-1px.png.meta @@ -0,0 +1,123 @@ +fileFormatVersion: 2 +guid: 523426f29c740a54a9b199958c36590b +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 1 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 6, y: 6, z: 6, w: 6} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 1 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Art/Icons/rokoko-bg-border-radius-1px.png + uploadId: 616054 diff --git a/Assets/External/Rokoko/Art/Icons/rokoko-direction-indicator-256.png b/Assets/External/Rokoko/Art/Icons/rokoko-direction-indicator-256.png new file mode 100644 index 00000000..02e51a2b --- /dev/null +++ b/Assets/External/Rokoko/Art/Icons/rokoko-direction-indicator-256.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8d336a0de400d6a4820f4a6397c1bcf19647fe8c6cd9a02c8f13e6884341efb1 +size 2492 diff --git a/Assets/External/Rokoko/Art/Icons/rokoko-direction-indicator-256.png.meta b/Assets/External/Rokoko/Art/Icons/rokoko-direction-indicator-256.png.meta new file mode 100644 index 00000000..a4a6b38f --- /dev/null +++ b/Assets/External/Rokoko/Art/Icons/rokoko-direction-indicator-256.png.meta @@ -0,0 +1,135 @@ +fileFormatVersion: 2 +guid: 08c6561abd3b8194a8624dee9434e5bc +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 2 + aniso: 16 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 1 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 256 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 256 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 256 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Art/Icons/rokoko-direction-indicator-256.png + uploadId: 616054 diff --git a/Assets/External/Rokoko/Art/Icons/rokoko-icon-broadcast-32.png b/Assets/External/Rokoko/Art/Icons/rokoko-icon-broadcast-32.png new file mode 100644 index 00000000..fada06e6 --- /dev/null +++ b/Assets/External/Rokoko/Art/Icons/rokoko-icon-broadcast-32.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:30d8de7ab7bb2931ae45880fb2b756756ddb14da432bfea23ef2a4a5f3aa3187 +size 3436 diff --git a/Assets/External/Rokoko/Art/Icons/rokoko-icon-broadcast-32.png.meta b/Assets/External/Rokoko/Art/Icons/rokoko-icon-broadcast-32.png.meta new file mode 100644 index 00000000..23afc4be --- /dev/null +++ b/Assets/External/Rokoko/Art/Icons/rokoko-icon-broadcast-32.png.meta @@ -0,0 +1,123 @@ +fileFormatVersion: 2 +guid: 32ea982362dd9dc4ba2005b739d18e72 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Art/Icons/rokoko-icon-broadcast-32.png + uploadId: 616054 diff --git a/Assets/External/Rokoko/Art/Icons/rokoko-icon-input-gloves-32.png b/Assets/External/Rokoko/Art/Icons/rokoko-icon-input-gloves-32.png new file mode 100644 index 00000000..c67c36c6 --- /dev/null +++ b/Assets/External/Rokoko/Art/Icons/rokoko-icon-input-gloves-32.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c492d8021151950099abace6142559bfc870bbd317aefb5a44124637c95c118 +size 578 diff --git a/Assets/External/Rokoko/Art/Icons/rokoko-icon-input-gloves-32.png.meta b/Assets/External/Rokoko/Art/Icons/rokoko-icon-input-gloves-32.png.meta new file mode 100644 index 00000000..34a676b0 --- /dev/null +++ b/Assets/External/Rokoko/Art/Icons/rokoko-icon-input-gloves-32.png.meta @@ -0,0 +1,123 @@ +fileFormatVersion: 2 +guid: 0f4595a450884a440bbe6abbbed6ee1b +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Art/Icons/rokoko-icon-input-gloves-32.png + uploadId: 616054 diff --git a/Assets/External/Rokoko/Art/Icons/rokoko-icon-profile-32.png b/Assets/External/Rokoko/Art/Icons/rokoko-icon-profile-32.png new file mode 100644 index 00000000..09907aa6 --- /dev/null +++ b/Assets/External/Rokoko/Art/Icons/rokoko-icon-profile-32.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:75af3931591ba6ed0908ce0f02b1273a990f85fd093a00e39a63240ffd60ee9e +size 715 diff --git a/Assets/External/Rokoko/Art/Icons/rokoko-icon-profile-32.png.meta b/Assets/External/Rokoko/Art/Icons/rokoko-icon-profile-32.png.meta new file mode 100644 index 00000000..1c0fd66f --- /dev/null +++ b/Assets/External/Rokoko/Art/Icons/rokoko-icon-profile-32.png.meta @@ -0,0 +1,123 @@ +fileFormatVersion: 2 +guid: 3816b5268ba20094bbcec7291dcb4ea1 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Art/Icons/rokoko-icon-profile-32.png + uploadId: 616054 diff --git a/Assets/External/Rokoko/Art/Icons/rokoko-icon-prop-32.png b/Assets/External/Rokoko/Art/Icons/rokoko-icon-prop-32.png new file mode 100644 index 00000000..5beb2ea9 --- /dev/null +++ b/Assets/External/Rokoko/Art/Icons/rokoko-icon-prop-32.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e070ec492b35f2746ed97d02b2af2641fd6f0f9a82d8012a31a72b31b6bc075e +size 3991 diff --git a/Assets/External/Rokoko/Art/Icons/rokoko-icon-prop-32.png.meta b/Assets/External/Rokoko/Art/Icons/rokoko-icon-prop-32.png.meta new file mode 100644 index 00000000..12c8553c --- /dev/null +++ b/Assets/External/Rokoko/Art/Icons/rokoko-icon-prop-32.png.meta @@ -0,0 +1,123 @@ +fileFormatVersion: 2 +guid: 11261587382ef3d4ba3784b1f97294ce +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Art/Icons/rokoko-icon-prop-32.png + uploadId: 616054 diff --git a/Assets/External/Rokoko/Art/Icons/rokoko-icon-record-32.png b/Assets/External/Rokoko/Art/Icons/rokoko-icon-record-32.png new file mode 100644 index 00000000..7ef21b57 --- /dev/null +++ b/Assets/External/Rokoko/Art/Icons/rokoko-icon-record-32.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae2602d81c3a54081526c749f6e5bdf7dacd919a8a1da2c77ebab4708c4eda1d +size 667 diff --git a/Assets/External/Rokoko/Art/Icons/rokoko-icon-record-32.png.meta b/Assets/External/Rokoko/Art/Icons/rokoko-icon-record-32.png.meta new file mode 100644 index 00000000..8342fa5d --- /dev/null +++ b/Assets/External/Rokoko/Art/Icons/rokoko-icon-record-32.png.meta @@ -0,0 +1,123 @@ +fileFormatVersion: 2 +guid: f1807d94f1a8b7e43ac0f6f24f73e8df +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Art/Icons/rokoko-icon-record-32.png + uploadId: 616054 diff --git a/Assets/External/Rokoko/Art/Icons/rokoko-icon-restart-32.png b/Assets/External/Rokoko/Art/Icons/rokoko-icon-restart-32.png new file mode 100644 index 00000000..3a9b8475 --- /dev/null +++ b/Assets/External/Rokoko/Art/Icons/rokoko-icon-restart-32.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b518b52b461a402b8a019f65a85cc047ae6bda6139ace67ff4a92873bdd712e3 +size 669 diff --git a/Assets/External/Rokoko/Art/Icons/rokoko-icon-restart-32.png.meta b/Assets/External/Rokoko/Art/Icons/rokoko-icon-restart-32.png.meta new file mode 100644 index 00000000..7b7c7430 --- /dev/null +++ b/Assets/External/Rokoko/Art/Icons/rokoko-icon-restart-32.png.meta @@ -0,0 +1,123 @@ +fileFormatVersion: 2 +guid: cd9504a8179c4644d8aea04f16200efa +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Art/Icons/rokoko-icon-restart-32.png + uploadId: 616054 diff --git a/Assets/External/Rokoko/Art/Icons/rokoko-icon-row-face-32.png b/Assets/External/Rokoko/Art/Icons/rokoko-icon-row-face-32.png new file mode 100644 index 00000000..598a20ac --- /dev/null +++ b/Assets/External/Rokoko/Art/Icons/rokoko-icon-row-face-32.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d9ca7b3ebda81df5c15ec4742a33c2a410adfdf01af6bedd26bafcb4c1f5ded +size 763 diff --git a/Assets/External/Rokoko/Art/Icons/rokoko-icon-row-face-32.png.meta b/Assets/External/Rokoko/Art/Icons/rokoko-icon-row-face-32.png.meta new file mode 100644 index 00000000..85a83488 --- /dev/null +++ b/Assets/External/Rokoko/Art/Icons/rokoko-icon-row-face-32.png.meta @@ -0,0 +1,123 @@ +fileFormatVersion: 2 +guid: 1d5c2843614d4a84981b045f31b14072 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Art/Icons/rokoko-icon-row-face-32.png + uploadId: 616054 diff --git a/Assets/External/Rokoko/Art/Icons/rokoko-icon-row-suit-32.png b/Assets/External/Rokoko/Art/Icons/rokoko-icon-row-suit-32.png new file mode 100644 index 00000000..02cc860c --- /dev/null +++ b/Assets/External/Rokoko/Art/Icons/rokoko-icon-row-suit-32.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1ad3b1cfc103e7b6e0d660b0d45de447fb926520a8c58e7a21d260091af0c3a7 +size 757 diff --git a/Assets/External/Rokoko/Art/Icons/rokoko-icon-row-suit-32.png.meta b/Assets/External/Rokoko/Art/Icons/rokoko-icon-row-suit-32.png.meta new file mode 100644 index 00000000..055e7b12 --- /dev/null +++ b/Assets/External/Rokoko/Art/Icons/rokoko-icon-row-suit-32.png.meta @@ -0,0 +1,123 @@ +fileFormatVersion: 2 +guid: ba8e6073760b14d41b8dcc5a9eaf1c21 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Art/Icons/rokoko-icon-row-suit-32.png + uploadId: 616054 diff --git a/Assets/External/Rokoko/Art/Icons/rokoko-icon-stop-white-32.png b/Assets/External/Rokoko/Art/Icons/rokoko-icon-stop-white-32.png new file mode 100644 index 00000000..f95bef38 --- /dev/null +++ b/Assets/External/Rokoko/Art/Icons/rokoko-icon-stop-white-32.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b77cbe16f57a75afe361f03d5d75050e1355676c1c846e3b1b421abe7e0bb399 +size 187 diff --git a/Assets/External/Rokoko/Art/Icons/rokoko-icon-stop-white-32.png.meta b/Assets/External/Rokoko/Art/Icons/rokoko-icon-stop-white-32.png.meta new file mode 100644 index 00000000..801bc354 --- /dev/null +++ b/Assets/External/Rokoko/Art/Icons/rokoko-icon-stop-white-32.png.meta @@ -0,0 +1,123 @@ +fileFormatVersion: 2 +guid: 9b913558b089c6d4088c17d9cc583b28 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Art/Icons/rokoko-icon-stop-white-32.png + uploadId: 616054 diff --git a/Assets/External/Rokoko/Art/Icons/rokoko-icon-straightpose-32.png b/Assets/External/Rokoko/Art/Icons/rokoko-icon-straightpose-32.png new file mode 100644 index 00000000..474e0e0d --- /dev/null +++ b/Assets/External/Rokoko/Art/Icons/rokoko-icon-straightpose-32.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b5e59e64511c4e7f07b1374b2db88b6d50f30643026bb3cb795641f971bd1675 +size 1240 diff --git a/Assets/External/Rokoko/Art/Icons/rokoko-icon-straightpose-32.png.meta b/Assets/External/Rokoko/Art/Icons/rokoko-icon-straightpose-32.png.meta new file mode 100644 index 00000000..120e4935 --- /dev/null +++ b/Assets/External/Rokoko/Art/Icons/rokoko-icon-straightpose-32.png.meta @@ -0,0 +1,123 @@ +fileFormatVersion: 2 +guid: 3ac26960e4ad8b846a7f29b4d3db4eae +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Art/Icons/rokoko-icon-straightpose-32.png + uploadId: 616054 diff --git a/Assets/External/Rokoko/Art/Icons/rokoko-icon-unicast-32.png b/Assets/External/Rokoko/Art/Icons/rokoko-icon-unicast-32.png new file mode 100644 index 00000000..56bdbee9 --- /dev/null +++ b/Assets/External/Rokoko/Art/Icons/rokoko-icon-unicast-32.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:52b54ec608d3dd570cf391cd698f33e6244a7f54bdc83faff59c4e431a1cf758 +size 3115 diff --git a/Assets/External/Rokoko/Art/Icons/rokoko-icon-unicast-32.png.meta b/Assets/External/Rokoko/Art/Icons/rokoko-icon-unicast-32.png.meta new file mode 100644 index 00000000..cee53674 --- /dev/null +++ b/Assets/External/Rokoko/Art/Icons/rokoko-icon-unicast-32.png.meta @@ -0,0 +1,123 @@ +fileFormatVersion: 2 +guid: 3cacab5c68cb3a94cbe8e23fe0d460d4 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Art/Icons/rokoko-icon-unicast-32.png + uploadId: 616054 diff --git a/Assets/External/Rokoko/Art/Materials.meta b/Assets/External/Rokoko/Art/Materials.meta new file mode 100644 index 00000000..39aaca06 --- /dev/null +++ b/Assets/External/Rokoko/Art/Materials.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5eba2627ac93b09498e806b1ca1f6ee4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/Art/Materials/Rokoko_FaceHead_Material.mat b/Assets/External/Rokoko/Art/Materials/Rokoko_FaceHead_Material.mat new file mode 100644 index 00000000..81d270f0 --- /dev/null +++ b/Assets/External/Rokoko/Art/Materials/Rokoko_FaceHead_Material.mat @@ -0,0 +1,77 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Rokoko_FaceHead_Material + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0, g: 0.5812235, b: 0.71599996, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/External/Rokoko/Art/Materials/Rokoko_FaceHead_Material.mat.meta b/Assets/External/Rokoko/Art/Materials/Rokoko_FaceHead_Material.mat.meta new file mode 100644 index 00000000..7e343d94 --- /dev/null +++ b/Assets/External/Rokoko/Art/Materials/Rokoko_FaceHead_Material.mat.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: 055df0cb0b68a9745962a657f2ef977b +timeCreated: 1564996349 +licenseType: Store +NativeFormatImporter: + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Art/Materials/Rokoko_FaceHead_Material.mat + uploadId: 616054 diff --git a/Assets/External/Rokoko/Art/Materials/Rokoko_Floor_Material.mat b/Assets/External/Rokoko/Art/Materials/Rokoko_Floor_Material.mat new file mode 100644 index 00000000..8c0e67e3 --- /dev/null +++ b/Assets/External/Rokoko/Art/Materials/Rokoko_Floor_Material.mat @@ -0,0 +1,89 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Rokoko_Floor_Material + m_Shader: {fileID: 4800000, guid: fc0c201ebbc6ff844a8111b15ce5737a, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTexture: + m_Texture: {fileID: 2800000, guid: 673b25e62d3e3a4488ffd4d2c9636e84, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _FadeDistance: 9 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _Radius: 0 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _SubTiles: 1 + - _Tiles: 3 + - _UVSec: 0 + - _ZWrite: 1 + - __dirty: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _GridColor: {r: 1, g: 1, b: 1, a: 0} + - _MainColor: {r: 0.11764706, g: 0.10980392, b: 0.11372549, a: 0.42745098} + - _Tint: {r: 0, g: 0, b: 0, a: 0} diff --git a/Assets/External/Rokoko/Art/Materials/Rokoko_Floor_Material.mat.meta b/Assets/External/Rokoko/Art/Materials/Rokoko_Floor_Material.mat.meta new file mode 100644 index 00000000..2abc7f5d --- /dev/null +++ b/Assets/External/Rokoko/Art/Materials/Rokoko_Floor_Material.mat.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +guid: de5442149a5364a45a89b4aed5318922 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Art/Materials/Rokoko_Floor_Material.mat + uploadId: 616054 diff --git a/Assets/External/Rokoko/Art/Materials/Rokoko_GroundArrow_Material.mat b/Assets/External/Rokoko/Art/Materials/Rokoko_GroundArrow_Material.mat new file mode 100644 index 00000000..78ed0289 --- /dev/null +++ b/Assets/External/Rokoko/Art/Materials/Rokoko_GroundArrow_Material.mat @@ -0,0 +1,91 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Rokoko_GroundArrow_Material + m_Shader: {fileID: 10800, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - : + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _AlphaTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: 08c6561abd3b8194a8624dee9434e5bc, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - : 0 + - PixelSnap: 0 + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _EnableExternalAlpha: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - : {r: 0, g: 1.929164e-33, b: 0, a: 1.9291523e-33} + - _Color: {r: 0.5019608, g: 0.5019608, b: 0.5019608, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _Flip: {r: 1, g: 1, b: 1, a: 1} + - _RendererColor: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/External/Rokoko/Art/Materials/Rokoko_GroundArrow_Material.mat.meta b/Assets/External/Rokoko/Art/Materials/Rokoko_GroundArrow_Material.mat.meta new file mode 100644 index 00000000..7854eac5 --- /dev/null +++ b/Assets/External/Rokoko/Art/Materials/Rokoko_GroundArrow_Material.mat.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: 5b70380947dd58c43899aabae4e5d5af +timeCreated: 1492703436 +licenseType: Store +NativeFormatImporter: + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Art/Materials/Rokoko_GroundArrow_Material.mat + uploadId: 616054 diff --git a/Assets/External/Rokoko/Art/Materials/Rokoko_GroundMarker_Material.mat b/Assets/External/Rokoko/Art/Materials/Rokoko_GroundMarker_Material.mat new file mode 100644 index 00000000..d85da567 --- /dev/null +++ b/Assets/External/Rokoko/Art/Materials/Rokoko_GroundMarker_Material.mat @@ -0,0 +1,91 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Rokoko_GroundMarker_Material + m_Shader: {fileID: 10800, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - : + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _AlphaTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 10912, guid: 0000000000000000f000000000000000, type: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - : 0 + - PixelSnap: 0 + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _EnableExternalAlpha: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - : {r: 0, g: 1.9445366e-33, b: 0, a: 1.9445248e-33} + - _Color: {r: 0.5019608, g: 0.5019608, b: 0.5019608, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _Flip: {r: 1, g: 1, b: 1, a: 1} + - _RendererColor: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/External/Rokoko/Art/Materials/Rokoko_GroundMarker_Material.mat.meta b/Assets/External/Rokoko/Art/Materials/Rokoko_GroundMarker_Material.mat.meta new file mode 100644 index 00000000..538ca24a --- /dev/null +++ b/Assets/External/Rokoko/Art/Materials/Rokoko_GroundMarker_Material.mat.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: 51a66222b072d794fa8dede8e56e2f60 +timeCreated: 1492703436 +licenseType: Store +NativeFormatImporter: + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Art/Materials/Rokoko_GroundMarker_Material.mat + uploadId: 616054 diff --git a/Assets/External/Rokoko/Art/Materials/Rokoko_Invisible_Material.mat b/Assets/External/Rokoko/Art/Materials/Rokoko_Invisible_Material.mat new file mode 100644 index 00000000..4abd8888 --- /dev/null +++ b/Assets/External/Rokoko/Art/Materials/Rokoko_Invisible_Material.mat @@ -0,0 +1,78 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Rokoko_Invisible_Material + m_Shader: {fileID: 30, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _ALPHAPREMULTIPLY_ON + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 10 + - _GlossMapScale: 1 + - _Glossiness: 0 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 3 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 0 + - __dirty: 1 + m_Colors: + - _Color: {r: 0, g: 0, b: 0, a: 0} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 0} diff --git a/Assets/External/Rokoko/Art/Materials/Rokoko_Invisible_Material.mat.meta b/Assets/External/Rokoko/Art/Materials/Rokoko_Invisible_Material.mat.meta new file mode 100644 index 00000000..a1b3362c --- /dev/null +++ b/Assets/External/Rokoko/Art/Materials/Rokoko_Invisible_Material.mat.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +guid: 77c3b338e3957c147a347451541a2339 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Art/Materials/Rokoko_Invisible_Material.mat + uploadId: 616054 diff --git a/Assets/External/Rokoko/Art/Materials/Rokoko_NewtonJoint_Material.mat b/Assets/External/Rokoko/Art/Materials/Rokoko_NewtonJoint_Material.mat new file mode 100644 index 00000000..0968eeb4 --- /dev/null +++ b/Assets/External/Rokoko/Art/Materials/Rokoko_NewtonJoint_Material.mat @@ -0,0 +1,77 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Rokoko_NewtonJoint_Material + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: a8551caaa94b44a43af0ec50bb5819ba, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.16911763, g: 0.16911763, b: 0.16911763, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 0} diff --git a/Assets/External/Rokoko/Art/Materials/Rokoko_NewtonJoint_Material.mat.meta b/Assets/External/Rokoko/Art/Materials/Rokoko_NewtonJoint_Material.mat.meta new file mode 100644 index 00000000..06c9cadb --- /dev/null +++ b/Assets/External/Rokoko/Art/Materials/Rokoko_NewtonJoint_Material.mat.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +guid: 9a1455f894960f847b59c41f17fb77d7 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Art/Materials/Rokoko_NewtonJoint_Material.mat + uploadId: 616054 diff --git a/Assets/External/Rokoko/Art/Materials/Rokoko_NewtonMain_Material.mat b/Assets/External/Rokoko/Art/Materials/Rokoko_NewtonMain_Material.mat new file mode 100644 index 00000000..f91d85f6 --- /dev/null +++ b/Assets/External/Rokoko/Art/Materials/Rokoko_NewtonMain_Material.mat @@ -0,0 +1,77 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Rokoko_NewtonMain_Material + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _METALLICGLOSSMAP + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 2800000, guid: 0265e9ba7f5e59445b11cb82a48f7214, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.6792453, g: 0.6792453, b: 0.6792453, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 0} diff --git a/Assets/External/Rokoko/Art/Materials/Rokoko_NewtonMain_Material.mat.meta b/Assets/External/Rokoko/Art/Materials/Rokoko_NewtonMain_Material.mat.meta new file mode 100644 index 00000000..cbdbbc86 --- /dev/null +++ b/Assets/External/Rokoko/Art/Materials/Rokoko_NewtonMain_Material.mat.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +guid: 423b90d678fb1c8408b9143d62e31c74 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Art/Materials/Rokoko_NewtonMain_Material.mat + uploadId: 616054 diff --git a/Assets/External/Rokoko/Art/Materials/Rokoko_Prop_Material.mat b/Assets/External/Rokoko/Art/Materials/Rokoko_Prop_Material.mat new file mode 100644 index 00000000..7f1e9dae --- /dev/null +++ b/Assets/External/Rokoko/Art/Materials/Rokoko_Prop_Material.mat @@ -0,0 +1,77 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Rokoko_Prop_Material + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.2794118, g: 0.2794118, b: 0.2794118, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/External/Rokoko/Art/Materials/Rokoko_Prop_Material.mat.meta b/Assets/External/Rokoko/Art/Materials/Rokoko_Prop_Material.mat.meta new file mode 100644 index 00000000..9848e9a8 --- /dev/null +++ b/Assets/External/Rokoko/Art/Materials/Rokoko_Prop_Material.mat.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +guid: efb193505e790244d941eded8ab70459 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Art/Materials/Rokoko_Prop_Material.mat + uploadId: 616054 diff --git a/Assets/External/Rokoko/Art/Meshes.meta b/Assets/External/Rokoko/Art/Meshes.meta new file mode 100644 index 00000000..dec8fe34 --- /dev/null +++ b/Assets/External/Rokoko/Art/Meshes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bf60f35f54457e54ca439dc910bc5701 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/Art/Meshes/Newton.meta b/Assets/External/Rokoko/Art/Meshes/Newton.meta new file mode 100644 index 00000000..c01bc762 --- /dev/null +++ b/Assets/External/Rokoko/Art/Meshes/Newton.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e7cb8f76f6ac4f34e81a3ad808e8ab63 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/Art/Meshes/Newton/Rokoko_Newton.FBX b/Assets/External/Rokoko/Art/Meshes/Newton/Rokoko_Newton.FBX new file mode 100644 index 00000000..b20578ab --- /dev/null +++ b/Assets/External/Rokoko/Art/Meshes/Newton/Rokoko_Newton.FBX @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0208a211187c0f53b9c4f837e0ba6667bf6c523a6d711e45709dd7a22e08cfad +size 2618336 diff --git a/Assets/External/Rokoko/Art/Meshes/Newton/Rokoko_Newton.FBX.meta b/Assets/External/Rokoko/Art/Meshes/Newton/Rokoko_Newton.FBX.meta new file mode 100644 index 00000000..b5aac393 --- /dev/null +++ b/Assets/External/Rokoko/Art/Meshes/Newton/Rokoko_Newton.FBX.meta @@ -0,0 +1,1743 @@ +fileFormatVersion: 2 +guid: af1509907cf0821439505d380e183bd9 +ModelImporter: + serializedVersion: 23 + fileIDToRecycleName: + 100000: Base + 100002: Camera001 + 100004: COM_Head + 100006: COM_LeftArm + 100008: COM_LeftFoot + 100010: COM_LeftForeArm + 100012: COM_LeftHand + 100014: COM_LeftShin + 100016: COM_LeftThigh + 100018: COM_Pelvis + 100020: COM_RightArm + 100022: COM_RightFoot + 100024: COM_RightForeArm + 100026: COM_RightHand + 100028: COM_RightShin + 100030: COM_RightThigh + 100032: COM_Thorax + 100034: Head + 100036: HeadTip + 100038: HeadVertex + 100040: Hips + 100042: IMU_0x00 + 100044: IMU_0x01 + 100046: IMU_0x02 + 100048: IMU_0x03 + 100050: IMU_0x20 + 100052: IMU_0x21 + 100054: IMU_0x22 + 100056: IMU_0x23 + 100058: IMU_0x24 + 100060: IMU_0x40 + 100062: IMU_0x60 + 100064: IMU_0x61 + 100066: IMU_0x62 + 100068: IMU_0x63 + 100070: IMU_0x64 + 100072: IMU_0x80 + 100074: IMU_0x81 + 100076: IMU_0x82 + 100078: IMU_0x83 + 100080: LA + 100082: Left1stMetatarsalHead + 100084: Left2ndToeTip + 100086: Left5thMetatarsalHead + 100088: LeftAcromion + 100090: LeftAnteroSuperiorIliacSpine + 100092: LeftArm + 100094: LeftCalcaneous + 100096: LeftFibulaHead + 100098: LeftFifthMetacarpalHead + 100100: LeftFinger1Distal + 100102: LeftFinger1Metacarpal + 100104: LeftFinger1Proximal + 100106: LeftFinger1Tip + 100108: LeftFinger2Distal + 100110: LeftFinger2Medial + 100112: LeftFinger2Metacarpal + 100114: LeftFinger2Proximal + 100116: LeftFinger2Tip + 100118: LeftFinger3Distal + 100120: LeftFinger3Medial + 100122: LeftFinger3Metacarpal + 100124: LeftFinger3Proximal + 100126: LeftFinger3Tip + 100128: LeftFinger4Distal + 100130: LeftFinger4Medial + 100132: LeftFinger4Metacarpal + 100134: LeftFinger4Proximal + 100136: LeftFinger4Tip + 100138: LeftFinger5Distal + 100140: LeftFinger5Medial + 100142: LeftFinger5Metacarpal + 100144: LeftFinger5Proximal + 100146: LeftFinger5Tip + 100148: LeftFoot + 100150: LeftForeArm + 100152: LeftGreaterTrochanter + 100154: LeftHand + 100156: LeftHEEL + 100158: LeftLateralFemoralEpicondyle + 100160: LeftLateralHumeralEpicondyle + 100162: LeftLateralMalleolus + 100164: LeftMedialFemoralEpicondyle + 100166: LeftMedialHumeralEpicondyle + 100168: LeftOlecranion + 100170: LeftRadialStyloid + 100172: LeftSecondMetacarpalHead + 100174: LeftShin + 100176: LeftShoulder + 100178: LeftSphyrion + 100180: LeftThigh + 100182: LeftThirdFingerTip + 100184: LeftTibialeHead + 100186: LeftToe + 100188: LeftToeTip + 100190: LeftUlnarStyloid + 100192: MidpointPosteroSuperiorIliacSpines + 100194: Neck + 100196: newton + 100198: newtonalpha_mass + 100200: Occiput + 100202: Point001 + 100204: Point002 + 100206: RA + 100208: Right1stMetatarsalHead + 100210: Right2ndToeTip + 100212: Right5thMetatarsalHead + 100214: RightAcromion + 100216: RightAnteroSuperiorIliacSpine + 100218: RightArm + 100220: RightCalcaneous + 100222: RightFibulaHead + 100224: RightFifthMetacarpalHead + 100226: RightFinger1Distal + 100228: RightFinger1Metacarpal + 100230: RightFinger1Proximal + 100232: RightFinger1Tip + 100234: RightFinger2Distal + 100236: RightFinger2Medial + 100238: RightFinger2Metacarpal + 100240: RightFinger2Proximal + 100242: RightFinger2Tip + 100244: RightFinger3Distal + 100246: RightFinger3Medial + 100248: RightFinger3Metacarpal + 100250: RightFinger3Proximal + 100252: RightFinger3Tip + 100254: RightFinger4Distal + 100256: RightFinger4Medial + 100258: RightFinger4Metacarpal + 100260: RightFinger4Proximal + 100262: RightFinger4Tip + 100264: RightFinger5Distal + 100266: RightFinger5Medial + 100268: RightFinger5Metacarpal + 100270: RightFinger5Proximal + 100272: RightFinger5Tip + 100274: RightFoot + 100276: RightForeArm + 100278: RightGreaterTrochanter + 100280: RightHand + 100282: RightHEEL + 100284: RightLateralFemoralEpicondyle + 100286: RightLateralHumeralEpicondyle + 100288: RightLateralMalleolus + 100290: RightMedialFemoralEpicondyle + 100292: RightMedialHumeralEpicondyle + 100294: RightOlecranion + 100296: RightRadialStyloid + 100298: RightSecondMetacarpalHead + 100300: RightShin + 100302: RightShoulder + 100304: RightSphyrion + 100306: RightThigh + 100308: RightThirdFingerTip + 100310: RightTibialeHead + 100312: RightToe + 100314: RightToeTip + 100316: RightUlnarStyloid + 100318: //RootNode + 100320: Sellion + 100322: SeventhCervicale + 100324: SITBONE + 100326: SkinData_newton + 100328: Spine1 + 100330: Spine2 + 100332: Spine3 + 100334: Spine4 + 100336: Suprasternale + 100338: Symphision + 400000: Base + 400002: Camera001 + 400004: COM_Head + 400006: COM_LeftArm + 400008: COM_LeftFoot + 400010: COM_LeftForeArm + 400012: COM_LeftHand + 400014: COM_LeftShin + 400016: COM_LeftThigh + 400018: COM_Pelvis + 400020: COM_RightArm + 400022: COM_RightFoot + 400024: COM_RightForeArm + 400026: COM_RightHand + 400028: COM_RightShin + 400030: COM_RightThigh + 400032: COM_Thorax + 400034: Head + 400036: HeadTip + 400038: HeadVertex + 400040: Hips + 400042: IMU_0x00 + 400044: IMU_0x01 + 400046: IMU_0x02 + 400048: IMU_0x03 + 400050: IMU_0x20 + 400052: IMU_0x21 + 400054: IMU_0x22 + 400056: IMU_0x23 + 400058: IMU_0x24 + 400060: IMU_0x40 + 400062: IMU_0x60 + 400064: IMU_0x61 + 400066: IMU_0x62 + 400068: IMU_0x63 + 400070: IMU_0x64 + 400072: IMU_0x80 + 400074: IMU_0x81 + 400076: IMU_0x82 + 400078: IMU_0x83 + 400080: LA + 400082: Left1stMetatarsalHead + 400084: Left2ndToeTip + 400086: Left5thMetatarsalHead + 400088: LeftAcromion + 400090: LeftAnteroSuperiorIliacSpine + 400092: LeftArm + 400094: LeftCalcaneous + 400096: LeftFibulaHead + 400098: LeftFifthMetacarpalHead + 400100: LeftFinger1Distal + 400102: LeftFinger1Metacarpal + 400104: LeftFinger1Proximal + 400106: LeftFinger1Tip + 400108: LeftFinger2Distal + 400110: LeftFinger2Medial + 400112: LeftFinger2Metacarpal + 400114: LeftFinger2Proximal + 400116: LeftFinger2Tip + 400118: LeftFinger3Distal + 400120: LeftFinger3Medial + 400122: LeftFinger3Metacarpal + 400124: LeftFinger3Proximal + 400126: LeftFinger3Tip + 400128: LeftFinger4Distal + 400130: LeftFinger4Medial + 400132: LeftFinger4Metacarpal + 400134: LeftFinger4Proximal + 400136: LeftFinger4Tip + 400138: LeftFinger5Distal + 400140: LeftFinger5Medial + 400142: LeftFinger5Metacarpal + 400144: LeftFinger5Proximal + 400146: LeftFinger5Tip + 400148: LeftFoot + 400150: LeftForeArm + 400152: LeftGreaterTrochanter + 400154: LeftHand + 400156: LeftHEEL + 400158: LeftLateralFemoralEpicondyle + 400160: LeftLateralHumeralEpicondyle + 400162: LeftLateralMalleolus + 400164: LeftMedialFemoralEpicondyle + 400166: LeftMedialHumeralEpicondyle + 400168: LeftOlecranion + 400170: LeftRadialStyloid + 400172: LeftSecondMetacarpalHead + 400174: LeftShin + 400176: LeftShoulder + 400178: LeftSphyrion + 400180: LeftThigh + 400182: LeftThirdFingerTip + 400184: LeftTibialeHead + 400186: LeftToe + 400188: LeftToeTip + 400190: LeftUlnarStyloid + 400192: MidpointPosteroSuperiorIliacSpines + 400194: Neck + 400196: newton + 400198: newtonalpha_mass + 400200: Occiput + 400202: Point001 + 400204: Point002 + 400206: RA + 400208: Right1stMetatarsalHead + 400210: Right2ndToeTip + 400212: Right5thMetatarsalHead + 400214: RightAcromion + 400216: RightAnteroSuperiorIliacSpine + 400218: RightArm + 400220: RightCalcaneous + 400222: RightFibulaHead + 400224: RightFifthMetacarpalHead + 400226: RightFinger1Distal + 400228: RightFinger1Metacarpal + 400230: RightFinger1Proximal + 400232: RightFinger1Tip + 400234: RightFinger2Distal + 400236: RightFinger2Medial + 400238: RightFinger2Metacarpal + 400240: RightFinger2Proximal + 400242: RightFinger2Tip + 400244: RightFinger3Distal + 400246: RightFinger3Medial + 400248: RightFinger3Metacarpal + 400250: RightFinger3Proximal + 400252: RightFinger3Tip + 400254: RightFinger4Distal + 400256: RightFinger4Medial + 400258: RightFinger4Metacarpal + 400260: RightFinger4Proximal + 400262: RightFinger4Tip + 400264: RightFinger5Distal + 400266: RightFinger5Medial + 400268: RightFinger5Metacarpal + 400270: RightFinger5Proximal + 400272: RightFinger5Tip + 400274: RightFoot + 400276: RightForeArm + 400278: RightGreaterTrochanter + 400280: RightHand + 400282: RightHEEL + 400284: RightLateralFemoralEpicondyle + 400286: RightLateralHumeralEpicondyle + 400288: RightLateralMalleolus + 400290: RightMedialFemoralEpicondyle + 400292: RightMedialHumeralEpicondyle + 400294: RightOlecranion + 400296: RightRadialStyloid + 400298: RightSecondMetacarpalHead + 400300: RightShin + 400302: RightShoulder + 400304: RightSphyrion + 400306: RightThigh + 400308: RightThirdFingerTip + 400310: RightTibialeHead + 400312: RightToe + 400314: RightToeTip + 400316: RightUlnarStyloid + 400318: //RootNode + 400320: Sellion + 400322: SeventhCervicale + 400324: SITBONE + 400326: SkinData_newton + 400328: Spine1 + 400330: Spine2 + 400332: Spine3 + 400334: Spine4 + 400336: Suprasternale + 400338: Symphision + 2100000: Hips + 2100002: RKK_Joint + 2100004: Spine + 2100006: Chest + 2100008: Neck + 2100010: Head + 2100012: RightUpperLeg + 2100014: RightLowerLeg + 2100016: RightFoot + 2100018: RightShoulder + 2100020: RightUpperArm + 2100022: RightLowerArm + 2100024: RightHand + 2100026: LeftUpperLeg + 2100028: LeftLowerLeg + 2100030: LeftFoot + 2100032: LeftShoulder + 2100034: LeftUpperArm + 2100036: LeftLowerArm + 2100038: LeftHand + 2100040: No Name + 2300000: SkinData_newton + 3300000: SkinData_newton + 4300000: newton + 4300002: SkinData_newton + 7400000: Take 001 + 9500000: //RootNode + 13700000: newton + externalObjects: {} + materials: + importMaterials: 1 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 3 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + optimizeMeshForGPU: 1 + keepQuads: 0 + weldVertices: 1 + preserveHierarchy: 0 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + previousCalculatedGlobalScale: 0.01 + hasPreviousCalculatedGlobalScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + importAnimation: 1 + copyAvatar: 0 + humanDescription: + serializedVersion: 2 + human: + - boneName: Hips + humanName: Hips + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: LeftThigh + humanName: LeftUpperLeg + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: RightThigh + humanName: RightUpperLeg + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: LeftShin + humanName: LeftLowerLeg + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: RightShin + humanName: RightLowerLeg + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: LeftFoot + humanName: LeftFoot + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: RightFoot + humanName: RightFoot + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: Spine1 + humanName: Spine + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: Spine2 + humanName: Chest + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: Neck + humanName: Neck + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: Head + humanName: Head + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: LeftShoulder + humanName: LeftShoulder + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: RightShoulder + humanName: RightShoulder + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: LeftArm + humanName: LeftUpperArm + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: RightArm + humanName: RightUpperArm + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: LeftForeArm + humanName: LeftLowerArm + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: RightForeArm + humanName: RightLowerArm + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: LeftHand + humanName: LeftHand + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: RightHand + humanName: RightHand + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: LeftToe + humanName: LeftToes + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: RightToe + humanName: RightToes + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: LeftFinger1Metacarpal + humanName: Left Thumb Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: LeftFinger1Proximal + humanName: Left Thumb Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: LeftFinger1Distal + humanName: Left Thumb Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: LeftFinger2Proximal + humanName: Left Index Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: LeftFinger2Medial + humanName: Left Index Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: LeftFinger2Distal + humanName: Left Index Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: LeftFinger3Proximal + humanName: Left Middle Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: LeftFinger3Medial + humanName: Left Middle Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: LeftFinger3Distal + humanName: Left Middle Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: LeftFinger4Proximal + humanName: Left Ring Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: LeftFinger4Medial + humanName: Left Ring Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: LeftFinger4Distal + humanName: Left Ring Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: LeftFinger5Proximal + humanName: Left Little Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: LeftFinger5Medial + humanName: Left Little Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: LeftFinger5Distal + humanName: Left Little Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: RightFinger1Metacarpal + humanName: Right Thumb Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: RightFinger1Proximal + humanName: Right Thumb Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: RightFinger1Distal + humanName: Right Thumb Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: RightFinger2Proximal + humanName: Right Index Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: RightFinger2Medial + humanName: Right Index Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: RightFinger2Distal + humanName: Right Index Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: RightFinger3Proximal + humanName: Right Middle Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: RightFinger3Medial + humanName: Right Middle Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: RightFinger3Distal + humanName: Right Middle Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: RightFinger4Proximal + humanName: Right Ring Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: RightFinger4Medial + humanName: Right Ring Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: RightFinger4Distal + humanName: Right Ring Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: RightFinger5Proximal + humanName: Right Little Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: RightFinger5Medial + humanName: Right Little Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: RightFinger5Distal + humanName: Right Little Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: Spine3 + humanName: UpperChest + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + skeleton: + - name: Rokoko_Newton(Clone) + parentName: + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: Camera001 + parentName: Rokoko_Newton(Clone) + position: {x: -0.0033928298, y: 0, z: 0} + rotation: {x: 0.00000006657903, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: Base + parentName: Rokoko_Newton(Clone) + position: {x: -0, y: 0, z: 0} + rotation: {x: 0.00000006657903, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: newton + parentName: Base + position: {x: -0.00000031143426, y: 1.0248078, z: -0.00000015258789} + rotation: {x: 0.00000017881393, y: -0.0000007907536, z: 1.4139776e-13, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: Hips + parentName: Base + position: {x: -0, y: 0.9399695, z: 0.039482567} + rotation: {x: -0.0000002225253, y: -4.7116753e-14, z: 0.000000043711413, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: LeftAnteroSuperiorIliacSpine + parentName: Hips + position: {x: -0.11200134, y: 0.07642166, z: 0.0383786} + rotation: {x: 0.06961594, y: 0.70367146, z: 0.069615565, w: 0.70367163} + scale: {x: 1, y: 1, z: 1} + - name: COM_Pelvis + parentName: Hips + position: {x: -0.0000003218651, y: 0.05875464, z: -0.041636884} + rotation: {x: 0.06961594, y: 0.70367146, z: 0.069615565, w: 0.70367163} + scale: {x: 0.14199997, y: 0.14199997, z: 0.14199996} + - name: RightAnteroSuperiorIliacSpine + parentName: Hips + position: {x: 0.11200065, y: 0.07642166, z: 0.03837868} + rotation: {x: 0.06961594, y: 0.70367146, z: 0.069615565, w: 0.70367163} + scale: {x: 1, y: 1, z: 1} + - name: SITBONE + parentName: Hips + position: {x: -0.0000004196167, y: -0.05357254, z: -0.017100388} + rotation: {x: 0.06961594, y: 0.70367146, z: 0.069615565, w: 0.70367163} + scale: {x: 0.09400003, y: 0.09400003, z: 0.094} + - name: Symphision + parentName: Hips + position: {x: -0.00000045776366, y: -0.004967117, z: 0.06800291} + rotation: {x: 0.06961594, y: 0.70367146, z: 0.069615565, w: 0.70367163} + scale: {x: 0.09400003, y: 0.09400003, z: 0.094} + - name: MidpointPosteroSuperiorIliacSpines + parentName: Hips + position: {x: -0.00000030517577, y: 0.0982505, z: -0.08885374} + rotation: {x: 0.06961594, y: 0.70367146, z: 0.069615565, w: 0.70367163} + scale: {x: 0.09400003, y: 0.09400003, z: 0.094} + - name: IMU_0x00 + parentName: Hips + position: {x: -0.1423971, y: 0.07453018, z: -0.06668468} + rotation: {x: 0.0060633793, y: 0.514276, z: -0.15004764, w: 0.844375} + scale: {x: 1, y: 1, z: 1} + - name: IMU_0x80 + parentName: Hips + position: {x: 0.1423971, y: 0.07453018, z: -0.06668468} + rotation: {x: 0.0060632997, y: -0.51427597, z: 0.15004756, w: 0.844375} + scale: {x: 1, y: 1, z: 1} + - name: Spine1 + parentName: Hips + position: {x: -0.00000031123975, y: 0.084838405, z: -0.039482705} + rotation: {x: 9.2843864e-14, y: -0.00000047683713, z: 1, w: -0.00000007549791} + scale: {x: 1, y: 1, z: 1} + - name: Spine2 + parentName: Spine1 + position: {x: -0.000000011917327, y: -0.07549995, z: -0.000000042915342} + rotation: {x: -0, y: -0, z: 4.42714e-20, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: Spine3 + parentName: Spine2 + position: {x: -0.000000010881431, y: -0.07550003, z: -0.0000000495345} + rotation: {x: -0, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: IMU_0x60 + parentName: Spine3 + position: {x: -0.105044916, y: -0.078868486, z: -0.08805051} + rotation: {x: 0.14042684, y: 0.21850036, z: -0.04735148, w: 0.9645184} + scale: {x: 0.99999994, y: 0.99999976, z: 1.0000001} + - name: IMU_0x20 + parentName: Spine3 + position: {x: 0.105044276, y: -0.078868486, z: -0.08805051} + rotation: {x: 0.14042687, y: -0.21850032, z: 0.047351435, w: 0.9645184} + scale: {x: 0.99999994, y: 0.99999994, z: 1} + - name: COM_Thorax + parentName: Spine3 + position: {x: -0.0010021355, y: -0.14566872, z: -0.00000045776366} + rotation: {x: -5.133922e-24, y: -0.000000041921655, z: -1.2246469e-16, w: 1} + scale: {x: 0.333, y: 0.333, z: 0.333} + - name: Spine4 + parentName: Spine3 + position: {x: -0.00000033050776, y: -0.12748733, z: -0.00000007602211} + rotation: {x: -0, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: SeventhCervicale + parentName: Spine4 + position: {x: -0.000000057220447, y: -0.2292694, z: -0.07214441} + rotation: {x: 0.7071072, y: -0.00000065909836, z: -0.70710635, w: -0.00000065909916} + scale: {x: 1, y: 1, z: 1} + - name: Suprasternale + parentName: Spine4 + position: {x: 0.000000019073504, y: -0.16413909, z: 0.05110153} + rotation: {x: 0.7071072, y: -0.00000065909836, z: -0.70710635, w: -0.00000065909916} + scale: {x: 1, y: 1, z: 1} + - name: Neck + parentName: Spine4 + position: {x: -0.00000004156294, y: -0.20150344, z: -0.00000040883606} + rotation: {x: -0, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: Head + parentName: Neck + position: {x: -0.00000011498934, y: -0.11100937, z: 0.000000033953548} + rotation: {x: -0, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: HeadTip + parentName: Head + position: {x: -0.000000025448134, y: -0.16853577, z: -0.00000010733907} + rotation: {x: 0, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: HeadVertex + parentName: Head + position: {x: -0.00000018350711, y: -0.16770478, z: 0.00000007252012} + rotation: {x: 0.7071069, y: -0.00000047078476, z: -0.7071067, w: -0.00000047078487} + scale: {x: 1, y: 1, z: 1} + - name: Occiput + parentName: Head + position: {x: 3.6379787e-14, y: 0.009298248, z: -0.07312792} + rotation: {x: 0.7071069, y: -0.00000047078476, z: -0.7071067, w: -0.00000047078487} + scale: {x: 1, y: 1, z: 1} + - name: Sellion + parentName: Head + position: {x: -0, y: -0.0638295, z: 0.104983106} + rotation: {x: 0.7071069, y: -0.00000047078476, z: -0.7071067, w: -0.00000047078487} + scale: {x: 1, y: 1, z: 1} + - name: COM_Head + parentName: Head + position: {x: -0.000000059604606, y: -0.039730653, z: -0.00609375} + rotation: {x: 0.7071069, y: -0.000000494324, z: -0.7071067, w: -0.0000004943241} + scale: {x: 0.06699997, y: 0.06699997, z: 0.06699997} + - name: IMU_0x40 + parentName: Head + position: {x: -0, y: -0.036019135, z: -0.07326601} + rotation: {x: 0.22826454, y: -1.0629396e-10, z: -4.5336743e-10, w: 0.97359914} + scale: {x: 1, y: 0.9999999, z: 1} + - name: RightShoulder + parentName: Spine4 + position: {x: -0.070000015, y: -0.123680726, z: 0.019037798} + rotation: {x: 0.00000053245435, y: -0.00000008007794, z: -0.7071075, w: 0.7071062} + scale: {x: 1.0000005, y: 1.0000005, z: 1} + - name: RightAcromion + parentName: RightShoulder + position: {x: 0.034446564, y: -0.13607804, z: -0.046092108} + rotation: {x: 0.5000005, y: 0.4999995, z: -0.5000001, w: 0.4999999} + scale: {x: 1, y: 0.99999976, z: 0.99999976} + - name: IMU_0x61 + parentName: RightShoulder + position: {x: 0.07022568, y: -0.069560505, z: -0.09810438} + rotation: {x: -0.15355799, y: -0.33637244, z: -0.07551738, w: 0.92605114} + scale: {x: 1, y: 0.9999997, z: 1.0000002} + - name: RightArm + parentName: RightShoulder + position: {x: -0, y: -0.13607779, z: 0.000000114440915} + rotation: {x: 0.0000011046799, y: -0.70710677, z: 0.000000027808795, w: 0.7071069} + scale: {x: 1.0000001, y: 0.9999997, z: 0.9999998} + - name: COM_RightArm + parentName: RightArm + position: {x: 0.005013599, y: -0.11799377, z: 0.0069920346} + rotation: {x: -0.00000023841898, y: 1, z: -0.00000047683733, w: -0.00000079894824} + scale: {x: 0.023999987, y: 0.023999989, z: 0.023999985} + - name: RightLateralHumeralEpicondyle + parentName: RightArm + position: {x: -0.000000022649765, y: -0.25799227, z: -0.04100189} + rotation: {x: -0.0000002384192, y: 1, z: -0.00000059604673, w: -0.0000010652643} + scale: {x: 1, y: 1, z: 1} + - name: RightMedialHumeralEpicondyle + parentName: RightArm + position: {x: 0.00000017523764, y: -0.26400834, z: 0.041002672} + rotation: {x: -0.0000002384192, y: 1, z: -0.00000059604673, w: -0.0000010652643} + scale: {x: 1, y: 1, z: 1} + - name: RA + parentName: RightArm + position: {x: -0.02501334, y: 0.054010265, z: -0.0030080986} + rotation: {x: -0.0000002384192, y: 1, z: -0.00000059604673, w: -0.0000010652643} + scale: {x: 0.27099997, y: 0.2710001, z: 0.27099997} + - name: IMU_0x62 + parentName: RightArm + position: {x: -0.02751419, y: -0.14396355, z: -0.02966462} + rotation: {x: 0.056332603, y: -0.059736725, z: 0.07541033, w: 0.9937663} + scale: {x: 1.0000002, y: 0.99999976, z: 1.0000001} + - name: RightForeArm + parentName: RightArm + position: {x: 0.00000011563301, y: -0.27102154, z: 0.0000004863739} + rotation: {x: -0.000000042146834, y: -0, z: 0.000000042146834, w: 1} + scale: {x: 1.0000004, y: 1, z: 1.0000004} + - name: RightUlnarStyloid + parentName: RightForeArm + position: {x: -0.032998085, y: -0.28396896, z: 0.00000015258789} + rotation: {x: 0.00000033093082, y: 0.70710564, z: -0.00000033093082, w: 0.7071079} + scale: {x: 0.99999994, y: 1, z: 0.9999999} + - name: RightRadialStyloid + parentName: RightForeArm + position: {x: 0.032997478, y: -0.2839692, z: 0} + rotation: {x: 0.00000033093082, y: 0.70710564, z: -0.00000033093082, w: 0.7071079} + scale: {x: 0.99999994, y: 1, z: 0.9999999} + - name: RightOlecranion + parentName: RightForeArm + position: {x: -0.021989126, y: 0.014030075, z: -0.008009033} + rotation: {x: 0.00000033093082, y: 0.70710564, z: -0.00000033093082, w: 0.7071079} + scale: {x: 0.99999994, y: 1, z: 0.9999999} + - name: COM_RightForeArm + parentName: RightForeArm + position: {x: 0.0039903256, y: -0.11798955, z: 0.0030001067} + rotation: {x: 0.00000072694775, y: 0.70710576, z: 0.00000016200597, w: 0.70710784} + scale: {x: 0.017000016, y: 0.017000018, z: 0.01700002} + - name: IMU_0x63 + parentName: RightForeArm + position: {x: -0.0016897583, y: -0.1777256, z: -0.045803834} + rotation: {x: -0.0011002737, y: -0.3175501, z: 0.13212185, w: 0.93899125} + scale: {x: 1, y: 0.99999994, z: 1.0000001} + - name: RightHand + parentName: RightForeArm + position: {x: -0.00000046014785, y: -0.28299984, z: 0.00000045776366} + rotation: {x: -5.6843412e-14, y: -1.7763532e-15, z: 0.000000042146834, w: 1} + scale: {x: 1.0000005, y: 1, z: 1.0000008} + - name: RightFifthMetacarpalHead + parentName: RightHand + position: {x: -0.045300998, y: -0.07497856, z: 0.007988109} + rotation: {x: 0.0000001785093, y: 0.76604605, z: -0.0000015009489, w: 0.6427857} + scale: {x: 1, y: 1, z: 1} + - name: RightSecondMetacarpalHead + parentName: RightHand + position: {x: 0.0453012, y: -0.085979, z: -0.007987785} + rotation: {x: 0.0000001785093, y: 0.76604605, z: -0.0000015009489, w: 0.6427857} + scale: {x: 1, y: 1, z: 1} + - name: RightThirdFingerTip + parentName: RightHand + position: {x: 0.0009847427, y: -0.18897857, z: -0.00017348288} + rotation: {x: 0.00000028452268, y: 0.76604605, z: -0.000001562881, w: 0.6427857} + scale: {x: 1, y: 1, z: 1} + - name: COM_RightHand + parentName: RightHand + position: {x: 0.0071246526, y: -0.067978546, z: 0.005851822} + rotation: {x: 0.7071075, y: -0.70710605, z: 0.00000015737727, w: 0.00000003093653} + scale: {x: 0.0059999814, y: 0.0059999824, z: 0.0059999814} + - name: IMU_0x64 + parentName: RightHand + position: {x: 0.00928009, y: -0.06782341, z: -0.034534376} + rotation: {x: 0.0000000037252903, y: -0, z: -0, w: 1} + scale: {x: 1.0000002, y: 0.9999998, z: 1.0000001} + - name: RightFinger4Metacarpal + parentName: RightHand + position: {x: -0.005475466, y: -0.02742981, z: 0.0010297012} + rotation: {x: -0.0000008851789, y: -0.0000007711869, z: -0.087154806, w: 0.99619484} + scale: {x: 1.0000002, y: 0.99999994, z: 1.0000004} + - name: RightFinger4Proximal + parentName: RightFinger4Metacarpal + position: {x: -0.0000003528595, y: -0.05032509, z: 0.000000019073486} + rotation: {x: 0.00000054928745, y: 0.0000007417998, z: 0.08715556, w: 0.9961948} + scale: {x: 1.0000001, y: 1.0000001, z: 1.0000005} + - name: RightFinger4Medial + parentName: RightFinger4Proximal + position: {x: 0.000000047683713, y: -0.04300003, z: 0.000000095367426} + rotation: {x: 0.00000004214677, y: -1.1368681e-13, z: 0.000000037252487, w: 1} + scale: {x: 1.0000004, y: 1.0000001, z: 1.0000005} + - name: RightFinger4Distal + parentName: RightFinger4Medial + position: {x: -0.000000026226044, y: -0.027731704, z: 0.00000017166137} + rotation: {x: 0.000000042146763, y: -0.00000011920932, z: 0.00000008195643, + w: 1} + scale: {x: 1.0000006, y: 1.0000007, z: 1.0000008} + - name: RightFinger4Tip + parentName: RightFinger4Distal + position: {x: 0.000000028610229, y: -0.026999816, z: -0.00000034332274} + rotation: {x: 0.00000011920929, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: RightFinger5Metacarpal + parentName: RightHand + position: {x: -0.014876098, y: -0.02487854, z: 0.001029644} + rotation: {x: -0.0000011598866, y: -0.00000038011135, z: -0.17364717, w: 0.98480797} + scale: {x: 1.0000004, y: 1.0000005, z: 1.0000005} + - name: RightFinger5Proximal + parentName: RightFinger5Metacarpal + position: {x: -0.00000034332274, y: -0.04746277, z: -0.000000019073486} + rotation: {x: 0.0000008278341, y: 0.00000032156098, z: 0.17364791, w: 0.98480785} + scale: {x: 0.9999993, y: 0.99999976, z: 1} + - name: RightFinger5Medial + parentName: RightFinger5Proximal + position: {x: 0.0000000047683715, y: -0.034999922, z: 0.00000032424927} + rotation: {x: 0.000000042146826, y: -5.6843405e-14, z: 0.0000000447032, w: 1} + scale: {x: 1, y: 0.99999994, z: 1} + - name: RightFinger5Distal + parentName: RightFinger5Medial + position: {x: -0.000000044107438, y: -0.021999815, z: -0.00000018119812} + rotation: {x: 0.00000012644055, y: -1.4273656e-13, z: 0.000000119209275, w: 1} + scale: {x: 1.0000001, y: 1.0000002, z: 1.0000004} + - name: RightFinger5Tip + parentName: RightFinger5Distal + position: {x: -0.00000014781952, y: -0.022409286, z: -0.0000004196167} + rotation: {x: 0, y: -0, z: -0, w: 1} + scale: {x: 0.99999994, y: 0.99999994, z: 1} + - name: RightFinger3Metacarpal + parentName: RightHand + position: {x: 0.0054473067, y: -0.027674254, z: 0.0010297965} + rotation: {x: -0.00000088508386, y: 6.5725196e-14, z: 0.00000021073382, w: 1} + scale: {x: 1.0000002, y: 1.0000001, z: 1.0000002} + - name: RightFinger3Proximal + parentName: RightFinger3Metacarpal + position: {x: -0.00000027418136, y: -0.05364952, z: 0.000000114440915} + rotation: {x: 0.00000046361512, y: -5.666578e-13, z: 0.0000004636155, w: 1} + scale: {x: 0.99999994, y: 0.99999994, z: 1.0000001} + - name: RightFinger3Medial + parentName: RightFinger3Proximal + position: {x: 0.000000007152557, y: -0.04699989, z: 0.000000019073486} + rotation: {x: 0.00000008429364, y: -1.0302868e-13, z: 0.00000008429378, w: 1} + scale: {x: 0.99999994, y: 0.99999994, z: 1} + - name: RightFinger3Distal + parentName: RightFinger3Medial + position: {x: -0.000000009536743, y: -0.030999908, z: 0.0000001335144} + rotation: {x: 0.000000042146834, y: -5.151434e-14, z: 0.000000042146834, w: 1} + scale: {x: 1.0000002, y: 1.0000004, z: 1.0000004} + - name: RightFinger3Tip + parentName: RightFinger3Distal + position: {x: -0.000000166893, y: -0.029982146, z: -0.00000014305114} + rotation: {x: 0.00000035762798, y: -1.5632386e-14, z: -0.000000043711307, w: 1} + scale: {x: 0.9999998, y: 0.9999998, z: 1} + - name: RightFinger1Metacarpal + parentName: RightHand + position: {x: 0.02784873, y: -0.0207798, z: 0.0010295295} + rotation: {x: -0.12815903, y: 0.36039925, z: -0.3151592, w: -0.8685404} + scale: {x: 1.0000006, y: 1.0000005, z: 1.0000008} + - name: RightFinger1Proximal + parentName: RightFinger1Metacarpal + position: {x: -0, y: -0.039891127, z: 0.00000015258789} + rotation: {x: -0.02143035, y: 0.0000011026856, z: -0.021429535, w: 0.9995406} + scale: {x: 1.0000005, y: 1.000001, z: 1.0000015} + - name: RightFinger1Distal + parentName: RightFinger1Proximal + position: {x: 0.000000085830685, y: -0.030277861, z: -0.00000015258789} + rotation: {x: 0.00000014901158, y: 0.0000000064350147, z: 0.00000027338817, + w: 1} + scale: {x: 1.0000005, y: 1, z: 1.0000005} + - name: RightFinger1Tip + parentName: RightFinger1Distal + position: {x: 0.000000085830685, y: -0.034589767, z: -0.00000047683716} + rotation: {x: 0.000002663161, y: -0.000000111758816, z: 2.9750925e-13, w: 1} + scale: {x: 1.0000005, y: 1.0000002, z: 0.9999998} + - name: RightFinger2Metacarpal + parentName: RightHand + position: {x: 0.016034164, y: -0.026455687, z: 0.0010299683} + rotation: {x: 0.0000009820359, y: 0.0000012553708, z: -0.08715682, w: -0.99619466} + scale: {x: 1.0000007, y: 1.0000004, z: 1.0000007} + - name: RightFinger2Proximal + parentName: RightFinger2Metacarpal + position: {x: -0.0000003814697, y: -0.054138336, z: 0.000000019073486} + rotation: {x: -0.0000006461448, y: -0.0000012847571, z: 0.087156065, w: -0.9961947} + scale: {x: 1.0000005, y: 1.0000002, z: 1.0000006} + - name: RightFinger2Medial + parentName: RightFinger2Proximal + position: {x: -0.000000023841856, y: -0.044999693, z: -0.00000014305114} + rotation: {x: -0, y: -0, z: 0.000000007449749, w: 1} + scale: {x: 1.0000005, y: 1.0000002, z: 1.0000007} + - name: RightFinger2Distal + parentName: RightFinger2Medial + position: {x: -0.0000000047683715, y: -0.027684936, z: 0.00000015258789} + rotation: {x: 0.000000042146826, y: -1.140008e-13, z: 0.000000044703476, w: 1} + scale: {x: 1.0000002, y: 1.0000002, z: 1.0000004} + - name: RightFinger2Tip + parentName: RightFinger2Distal + position: {x: -0.00000013828277, y: -0.0271315, z: -0.0000003147125} + rotation: {x: 0.00000011984037, y: 0.00000023841856, z: -0.00000009416588, w: 1} + scale: {x: 0.99999994, y: 0.99999994, z: 1} + - name: LeftShoulder + parentName: Spine4 + position: {x: 0.06999998, y: -0.123680726, z: 0.019037932} + rotation: {x: -0.00000019527988, y: 0.00000025709724, z: -0.7071068, w: -0.7071068} + scale: {x: 0.9999997, y: 0.9999997, z: 1} + - name: LeftAcromion + parentName: LeftShoulder + position: {x: -0.03444702, y: -0.136078, z: -0.04609241} + rotation: {x: 0, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: IMU_0x21 + parentName: LeftShoulder + position: {x: -0.07022568, y: -0.06956057, z: -0.09810452} + rotation: {x: -0.15355802, y: 0.3363725, z: 0.0755174, w: 0.9260511} + scale: {x: 1.0000002, y: 1, z: 0.9999999} + - name: LeftArm + parentName: LeftShoulder + position: {x: -0, y: -0.13607779, z: 0} + rotation: {x: 0.0000006474181, y: 0.7071068, z: 0.00000046860413, w: 0.7071068} + scale: {x: 0.99999994, y: 1, z: 1} + - name: LeftMedialHumeralEpicondyle + parentName: LeftArm + position: {x: -0.00000026583672, y: -0.26400834, z: 0.041002806} + rotation: {x: 0, y: -0, z: -0.000000043711392, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: LeftLateralHumeralEpicondyle + parentName: LeftArm + position: {x: -0.00000016331673, y: -0.25799227, z: -0.041001882} + rotation: {x: 0, y: -0, z: -0.000000043711392, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: LA + parentName: LeftArm + position: {x: 0.02501354, y: 0.054010257, z: -0.0030080986} + rotation: {x: 0, y: -0, z: -0.000000043711392, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: COM_LeftArm + parentName: LeftArm + position: {x: -0.005013504, y: -0.117993936, z: 0.0069920346} + rotation: {x: 0, y: -0, z: -0, w: 1} + scale: {x: 0.024000049, y: 0.023999993, z: 0.023999866} + - name: IMU_0x22 + parentName: LeftArm + position: {x: 0.027514229, y: -0.14396347, z: -0.02966467} + rotation: {x: 0.056332607, y: 0.05973677, z: -0.075410314, w: 0.9937663} + scale: {x: 1, y: 1.0000002, z: 1} + - name: LeftForeArm + parentName: LeftArm + position: {x: -0.00000078201293, y: -0.2710215, z: 0.00000030517577} + rotation: {x: -0.00000023180766, y: -0, z: -0.00000048468866, w: 1} + scale: {x: 1.0000005, y: 1.0000005, z: 1.0000004} + - name: COM_LeftForeArm + parentName: LeftForeArm + position: {x: -0.0039894865, y: -0.1179895, z: 0.0029999542} + rotation: {x: 0, y: -0, z: -0, w: 1} + scale: {x: 0.01700002, y: 0.016999902, z: 0.017000077} + - name: LeftUlnarStyloid + parentName: LeftForeArm + position: {x: 0.032998968, y: -0.2839689, z: 0} + rotation: {x: 0.000000043711392, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: LeftRadialStyloid + parentName: LeftForeArm + position: {x: -0.03299661, y: -0.28396925, z: 0} + rotation: {x: 0.000000043711392, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: LeftOlecranion + parentName: LeftForeArm + position: {x: 0.021989634, y: 0.014030113, z: -0.008008919} + rotation: {x: 0.000000043711392, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: IMU_0x23 + parentName: LeftForeArm + position: {x: 0.0016905213, y: -0.17772521, z: -0.045804136} + rotation: {x: -0.0011003271, y: 0.31755, z: -0.13212176, w: 0.9389913} + scale: {x: 1, y: 1, z: 0.99999994} + - name: LeftHand + parentName: LeftForeArm + position: {x: 0.00000049471856, y: -0.28299996, z: 0.000000114440915} + rotation: {x: -0.00000021073424, y: -1.1191046e-13, z: 0.000000042146862, w: 1} + scale: {x: 1.0000005, y: 1.0000005, z: 1.0000005} + - name: COM_LeftHand + parentName: LeftHand + position: {x: -0.0071236226, y: -0.06797841, z: 0.0058525084} + rotation: {x: 0.7071064, y: 0.7071072, z: -0.00000080348474, w: -0.0000015567392} + scale: {x: 0.0060000424, y: 0.0060001006, z: 0.0060000406} + - name: LeftThirdFingerTip + parentName: LeftHand + position: {x: -0.0009836518, y: -0.1889785, z: -0.00017331123} + rotation: {x: 0.6427869, y: 0.0000014222223, z: 0.76604503, w: -0.0000007406124} + scale: {x: -0.08, y: -0.07999995, z: -0.07999997} + - name: LeftSecondMetacarpalHead + parentName: LeftHand + position: {x: -0.04530025, y: -0.085979, z: -0.007987385} + rotation: {x: -1.9106855e-15, y: -0.000000043711392, z: -0.000000043711385, + w: 1} + scale: {x: 1, y: 1, z: 1} + - name: LeftFifthMetacarpalHead + parentName: LeftHand + position: {x: 0.045301974, y: -0.07497833, z: 0.007988129} + rotation: {x: -1.9106855e-15, y: -0.000000043711392, z: -0.000000043711385, + w: 1} + scale: {x: 1, y: 1, z: 1} + - name: IMU_0x24 + parentName: LeftHand + position: {x: -0.009279337, y: -0.06782325, z: -0.034534395} + rotation: {x: 0.00000047683716, y: -0.000000029802326, z: -0.0000000074505664, + w: 1} + scale: {x: 1, y: 0.9999998, z: 0.9999998} + - name: LeftFinger1Metacarpal + parentName: LeftHand + position: {x: -0.027848657, y: -0.020779876, z: 0.0010298156} + rotation: {x: 0.12815799, y: 0.3603993, z: -0.31515694, w: 0.8685413} + scale: {x: 1.0000013, y: 1.0000011, z: 1.0000012} + - name: LeftFinger1Proximal + parentName: LeftFinger1Metacarpal + position: {x: -0.00000015258789, y: -0.039891053, z: 0.000000076293944} + rotation: {x: -0.021426588, y: -0.0000016689295, z: 0.021428023, w: 0.99954075} + scale: {x: 1.0000008, y: 1.0000013, z: 1.0000013} + - name: LeftFinger1Distal + parentName: LeftFinger1Proximal + position: {x: -0.00000014305114, y: -0.030278014, z: -0.000000076293944} + rotation: {x: -0.000000029802315, y: -0.000000007450579, z: 0.0000000907639, + w: 1} + scale: {x: 1.0000004, y: 1.0000002, z: 1.0000004} + - name: LeftFinger1Tip + parentName: LeftFinger1Distal + position: {x: -0.000000085830685, y: -0.03458969, z: -0.00000023841858} + rotation: {x: 0.000003163015, y: 0.00000023841736, z: -0.0000003894151, w: 1} + scale: {x: 0.9999999, y: 0.99999994, z: 1} + - name: LeftFinger2Metacarpal + parentName: LeftHand + position: {x: -0.016034165, y: -0.026455687, z: 0.0010298347} + rotation: {x: -0.00000036909626, y: -0.00000014024367, z: -0.087156534, w: 0.99619466} + scale: {x: 1.0000008, y: 1.0000007, z: 1.0000005} + - name: LeftFinger2Proximal + parentName: LeftFinger2Metacarpal + position: {x: 0.00000028610228, y: -0.054138184, z: -0.0000001335144} + rotation: {x: 0.00000043207615, y: 0.00000014575335, z: 0.087157056, w: 0.9961946} + scale: {x: 1.0000001, y: 1.0000002, z: 1.0000002} + - name: LeftFinger2Medial + parentName: LeftFinger2Proximal + position: {x: -0.000000019073486, y: -0.04499977, z: -0.000000019073486} + rotation: {x: 0.00000031610136, y: 0.000000059604602, z: -0.000000014901259, + w: 1} + scale: {x: 1.0000002, y: 1.0000002, z: 1.0000004} + - name: LeftFinger2Distal + parentName: LeftFinger2Medial + position: {x: 0.00000015258789, y: -0.027684936, z: 0.000000019073486} + rotation: {x: 0.00000016858742, y: -0.000000059604645, z: 0.00000002980237, + w: 1} + scale: {x: 0.9999997, y: 0.9999997, z: 0.99999964} + - name: LeftFinger2Tip + parentName: LeftFinger2Distal + position: {x: 0.0000003814697, y: -0.027131423, z: -0.0000004673004} + rotation: {x: 0.00000023841818, y: -0.0000016689302, z: -0.00000023841818, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: LeftFinger3Metacarpal + parentName: LeftHand + position: {x: -0.00544731, y: -0.027674254, z: 0.001029663} + rotation: {x: -0.0000003161013, y: -2.0516919e-13, z: 0.00000014751403, w: 1} + scale: {x: 1.0000002, y: 1.0000002, z: 1.0000001} + - name: LeftFinger3Proximal + parentName: LeftFinger3Metacarpal + position: {x: 0.00000030517577, y: -0.05364952, z: 0.000000019073486} + rotation: {x: 0.0000004214684, y: 2.5224264e-13, z: -0.00000016858748, w: 1} + scale: {x: 1, y: 1.0000004, z: 1} + - name: LeftFinger3Medial + parentName: LeftFinger3Proximal + position: {x: -0.0000000023841857, y: -0.046999816, z: -0.000000333786} + rotation: {x: 0.00000035824823, y: 1.447731e-13, z: 0.00000006322019, w: 1} + scale: {x: 1, y: 1.0000005, z: 1.0000004} + - name: LeftFinger3Distal + parentName: LeftFinger3Medial + position: {x: 0.00000007867813, y: -0.030999908, z: -0.000000009536743} + rotation: {x: -5.6843412e-14, y: -3.5527404e-15, z: -0.00000016858739, w: 1} + scale: {x: 1, y: 1.0000005, z: 1.0000005} + - name: LeftFinger3Tip + parentName: LeftFinger3Distal + position: {x: 0.00000016212464, y: -0.029982222, z: -0.00000015258789} + rotation: {x: 0.00000023841858, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: LeftFinger4Metacarpal + parentName: LeftHand + position: {x: 0.005475464, y: -0.027429733, z: 0.0010298347} + rotation: {x: -0.0000007267241, y: -0.00000036639545, z: 0.087154776, w: 0.9961948} + scale: {x: 1.0000007, y: 1.0000008, z: 1.0000006} + - name: LeftFinger4Proximal + parentName: LeftFinger4Metacarpal + position: {x: 0.0000003147125, y: -0.05032509, z: 0.00000028610228} + rotation: {x: 0.00000085268397, y: 0.00000035537465, z: -0.087153934, w: 0.99619484} + scale: {x: 1.0000002, y: 1.0000005, z: 1.0000005} + - name: LeftFinger4Medial + parentName: LeftFinger4Proximal + position: {x: -0, y: -0.04300003, z: -0.00000012397766} + rotation: {x: -0.000000063220334, y: -0, z: 0.000000022351433, w: 1} + scale: {x: 0.99999976, y: 0.9999997, z: 0.9999998} + - name: LeftFinger4Distal + parentName: LeftFinger4Medial + position: {x: 0.000000028312206, y: -0.027731856, z: 0.00000012397766} + rotation: {x: -0, y: 3.4074045e-14, z: -0.00000008940696, w: 1} + scale: {x: 1.0000005, y: 1.0000005, z: 1.0000005} + - name: LeftFinger4Tip + parentName: LeftFinger4Distal + position: {x: 0.000000076293944, y: -0.026999893, z: -0.00000044822693} + rotation: {x: 0.00000031391647, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: LeftFinger5Metacarpal + parentName: LeftHand + position: {x: 0.014876098, y: -0.02487854, z: 0.0010296821} + rotation: {x: -0.0000011177058, y: -0.0000009709163, z: 0.17364742, w: 0.9848079} + scale: {x: 1.0000008, y: 1.0000011, z: 1.0000006} + - name: LeftFinger5Proximal + parentName: LeftFinger5Metacarpal + position: {x: 0.0000003147125, y: -0.04746292, z: 0.000000019073486} + rotation: {x: 0.0000013875522, y: 0.0000008022859, z: -0.17364651, w: 0.9848081} + scale: {x: 1.0000002, y: 1.0000001, z: 1.0000005} + - name: LeftFinger5Medial + parentName: LeftFinger5Proximal + position: {x: 0.000000085830685, y: -0.035, z: 0.00000018119812} + rotation: {x: 0.00000012644054, y: 0.000000059604574, z: 0.00000016391157, w: 1} + scale: {x: 0.9999996, y: 0.9999999, z: 0.9999997} + - name: LeftFinger5Distal + parentName: LeftFinger5Medial + position: {x: -0.000000076293944, y: -0.021999815, z: -0.00000015258789} + rotation: {x: 0.00000018966094, y: -1.0302866e-13, z: -0.000000059604574, w: 1} + scale: {x: 1.0000001, y: 1, z: 1} + - name: LeftFinger5Tip + parentName: LeftFinger5Distal + position: {x: 0.00000014781952, y: -0.022409286, z: 0.000000019073486} + rotation: {x: -0.00000023841858, y: -0.00000007549788, z: -0.000000075497915, + w: 1} + scale: {x: 1, y: 1, z: 1} + - name: RightThigh + parentName: Hips + position: {x: 0.08099951, y: 0, z: -0.0000000023841857} + rotation: {x: 0.00000011098625, y: -0.7071066, z: -0.000000110986186, w: 0.70710695} + scale: {x: 0.9999995, y: 1, z: 0.9999995} + - name: RightMedialFemoralEpicondyle + parentName: RightThigh + position: {x: 0.00000013589859, y: -0.43200004, z: 0.056998137} + rotation: {x: -0.00000013315805, y: 1, z: -8.5517066e-16, w: -0.0000000059623755} + scale: {x: 1, y: 1, z: 1} + - name: RightLateralFemoralEpicondyle + parentName: RightThigh + position: {x: 0.0000001335144, y: -0.43100202, z: -0.056999948} + rotation: {x: -0.00000013315805, y: 1, z: -8.5517066e-16, w: -0.0000000059623755} + scale: {x: 1, y: 1, z: 1} + - name: RightGreaterTrochanter + parentName: RightThigh + position: {x: -0.039743975, y: 0.0060004424, z: -0.10099999} + rotation: {x: -0.00000013315805, y: 1, z: -8.5517066e-16, w: -0.0000000059623755} + scale: {x: 1, y: 1, z: 1} + - name: COM_RightThigh + parentName: RightThigh + position: {x: -0.01814393, y: -0.18200009, z: -0.013999939} + rotation: {x: -0.00000013315808, y: 1, z: 0.00000013315808, w: 0.00000023841856} + scale: {x: 0.122999996, y: 0.12300001, z: 0.12300002} + - name: IMU_0x81 + parentName: RightThigh + position: {x: 0.0103025185, y: -0.20575629, z: -0.09410194} + rotation: {x: -0.040235978, y: 0.06301143, z: 0.04836623, w: 0.99602777} + scale: {x: 1, y: 0.99999994, z: 0.9999999} + - name: RightShin + parentName: RightThigh + position: {x: 0.00000017166137, y: -0.43200007, z: 0.000000047683713} + rotation: {x: -0.00000004371138, y: -0.00000005960465, z: -7.105428e-15, w: 1} + scale: {x: 0.9999997, y: 1, z: 0.9999997} + - name: RightSphyrion + parentName: RightShin + position: {x: 0.021000648, y: -0.43399593, z: 0.032995056} + rotation: {x: -0.00000013315805, y: 1, z: -0.00000039947417, w: 5.31932e-14} + scale: {x: 1, y: 0.4330001, z: 0.43300006} + - name: RightTibialeHead + parentName: RightShin + position: {x: 0.021000508, y: -0.027019156, z: 0.042001035} + rotation: {x: -0.00000013315805, y: 1, z: -0.00000039947417, w: 5.31932e-14} + scale: {x: 1, y: 1, z: 1} + - name: RightLateralMalleolus + parentName: RightShin + position: {x: -0.021000342, y: -0.43300015, z: -0.032994185} + rotation: {x: -0.00000013315805, y: 1, z: -0.00000039947417, w: 5.31932e-14} + scale: {x: 1, y: 0.4330001, z: 0.43300006} + - name: RightFibulaHead + parentName: RightShin + position: {x: 0.000000021457671, y: -0.022992324, z: -0.046980493} + rotation: {x: -0.00000013315805, y: 1, z: -0.00000039947417, w: 5.31932e-14} + scale: {x: 1, y: 1, z: 1} + - name: COM_RightShin + parentName: RightShin + position: {x: -0.021000437, y: -0.17800638, z: -0.0029875564} + rotation: {x: -0.00000013315805, y: 1, z: -0.0000002663161, w: 3.5462135e-14} + scale: {x: 0.047999978, y: 0.047999978, z: 0.04799997} + - name: IMU_0x82 + parentName: RightShin + position: {x: 0.038170014, y: -0.21006322, z: 0} + rotation: {x: -0.0846937, y: -0.7760139, z: -0.038128525, w: 0.62383944} + scale: {x: 0.9999998, y: 1, z: 1.0000001} + - name: RightFoot + parentName: RightShin + position: {x: 0.000000102519984, y: -0.4329999, z: -0.00062554836} + rotation: {x: 0.4999999, y: -0.5000001, z: 0.50000006, w: 0.49999994} + scale: {x: 1.0000008, y: 1.0000004, z: 1.0000001} + - name: RightHEEL + parentName: RightFoot + position: {x: 0.000000095367426, y: 0.050186004, z: 0.07496586} + rotation: {x: -0.00000023841858, y: 0, z: -0, w: 1} + scale: {x: 0.26500005, y: 0.26500005, z: 0.265} + - name: RightCalcaneous + parentName: RightFoot + position: {x: -0.006995945, y: 0.05018601, z: 0.0061829565} + rotation: {x: -0.5702422, y: -0.41811895, z: 0.57024264, w: 0.41811934} + scale: {x: 1, y: 1, z: 1} + - name: COM_RightFoot + parentName: RightFoot + position: {x: -0.005988922, y: -0.032092918, z: 0.047852278} + rotation: {x: -0.49999976, y: -0.49999982, z: 0.50000024, w: 0.5000002} + scale: {x: 0.012000026, y: 0.012000022, z: 0.012000024} + - name: Right1stMetatarsalHead + parentName: RightFoot + position: {x: 0.047011074, y: -0.13292049, z: 0.06391615} + rotation: {x: -0.5702422, y: -0.41811895, z: 0.57024264, w: 0.41811934} + scale: {x: 1, y: 1, z: 1} + - name: Right5thMetatarsalHead + parentName: RightFoot + position: {x: -0.059995916, y: -0.11575983, z: 0.058505476} + rotation: {x: -0.5702422, y: -0.41811895, z: 0.57024264, w: 0.41811934} + scale: {x: 1, y: 1, z: 1} + - name: Right2ndToeTip + parentName: RightFoot + position: {x: 0.0010070801, y: -0.20615087, z: 0.074446306} + rotation: {x: -0.5702422, y: -0.41811895, z: 0.57024264, w: 0.41811934} + scale: {x: 1, y: 1, z: 1} + - name: IMU_0x83 + parentName: RightFoot + position: {x: -0.0000000047683715, y: -0.10620308, z: 0.014033507} + rotation: {x: -0.27362692, y: -0.0007550972, z: -0.081129454, w: 0.95840794} + scale: {x: 0.9999998, y: 1, z: 0.9999999} + - name: RightToe + parentName: RightFoot + position: {x: 0.000000019073486, y: -0.13169399, z: 0.0623944} + rotation: {x: -0.0000000745058, y: -0.000000029802319, z: -0.000000029802319, + w: -1} + scale: {x: 1, y: 0.99999976, z: 0.9999998} + - name: RightToeTip + parentName: RightToe + position: {x: -0.000000009536743, y: -0.074456915, z: 0.012571463} + rotation: {x: 0, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: LeftThigh + parentName: Hips + position: {x: -0.08099951, y: 0, z: 0} + rotation: {x: 0.000000049169003, y: 0.7071066, z: 0.00000017280342, w: 0.70710695} + scale: {x: 0.9999995, y: 1, z: 0.9999995} + - name: COM_LeftThigh + parentName: LeftThigh + position: {x: 0.018143939, y: -0.18200012, z: -0.014000092} + rotation: {x: 0, y: -0, z: -0, w: 1} + scale: {x: 0.12299989, y: 0.122999795, z: 0.123000056} + - name: LeftGreaterTrochanter + parentName: LeftThigh + position: {x: 0.039743982, y: 0.006000519, z: -0.10099999} + rotation: {x: 0, y: -0, z: -0.00000008742278, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: LeftLateralFemoralEpicondyle + parentName: LeftThigh + position: {x: -0.00000014305114, y: -0.43100202, z: -0.057000026} + rotation: {x: 0, y: -0, z: -0.00000008742278, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: LeftMedialFemoralEpicondyle + parentName: LeftThigh + position: {x: -0.00000014781952, y: -0.432, z: 0.05699806} + rotation: {x: 0, y: -0, z: -0.00000008742278, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: IMU_0x01 + parentName: LeftThigh + position: {x: -0.010302512, y: -0.20575629, z: -0.09410194} + rotation: {x: -0.040235974, y: -0.06301134, z: -0.04836623, w: 0.99602777} + scale: {x: 1, y: 0.99999994, z: 0.9999999} + - name: LeftShin + parentName: LeftThigh + position: {x: -0.00000017642975, y: -0.4319998, z: 0.0000001335144} + rotation: {x: -0.0000012914405, y: 0.00000014901161, z: 2.7355895e-13, w: 1} + scale: {x: 0.99999964, y: 0.99999994, z: 0.9999997} + - name: LeftFibulaHead + parentName: LeftShin + position: {x: -0.0000000166893, y: -0.02299244, z: -0.046980713} + rotation: {x: 0, y: -0, z: -0.00000008742278, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: LeftTibialeHead + parentName: LeftShin + position: {x: -0.021000514, y: -0.027019538, z: 0.042000804} + rotation: {x: 0, y: -0, z: -0.00000008742278, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: LeftLateralMalleolus + parentName: LeftShin + position: {x: 0.021000447, y: -0.43300045, z: -0.03299548} + rotation: {x: 0, y: -0, z: -0.00000008742278, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: COM_LeftShin + parentName: LeftShin + position: {x: 0.021000495, y: -0.17800659, z: -0.002988243} + rotation: {x: 0.000000059604645, y: -1.4210855e-14, z: -0.00000023841858, w: 1} + scale: {x: 0.04799998, y: 0.048000038, z: 0.04799997} + - name: LeftSphyrion + parentName: LeftShin + position: {x: -0.021000542, y: -0.43399626, z: 0.032993734} + rotation: {x: 0, y: -0, z: -0.00000008742278, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: IMU_0x02 + parentName: LeftShin + position: {x: -0.038170006, y: -0.21006356, z: 0.000000009536743} + rotation: {x: -0.084693715, y: 0.776014, z: 0.03812851, w: 0.6238394} + scale: {x: 0.9999998, y: 1.0000001, z: 1.0000001} + - name: LeftFoot + parentName: LeftShin + position: {x: -0.00000015258789, y: -0.43299976, z: -0.0006256628} + rotation: {x: -0.50000054, y: -0.49999946, z: 0.50000024, w: -0.49999982} + scale: {x: 1.0000008, y: 1.0000002, z: 1.0000002} + - name: Left1stMetatarsalHead + parentName: LeftFoot + position: {x: -0.047009792, y: -0.13292022, z: 0.063916914} + rotation: {x: 0, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: Left2ndToeTip + parentName: LeftFoot + position: {x: -0.0010058403, y: -0.20615074, z: 0.0744469} + rotation: {x: 0, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: Left5thMetatarsalHead + parentName: LeftFoot + position: {x: 0.059997175, y: -0.115759656, z: 0.058505885} + rotation: {x: 0, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: LeftCalcaneous + parentName: LeftFoot + position: {x: 0.006997194, y: 0.050186157, z: 0.0061832666} + rotation: {x: 0, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: LeftHEEL + parentName: LeftFoot + position: {x: 0.0000013446808, y: 0.050186157, z: 0.074966244} + rotation: {x: 0, y: -0.000000043711385, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: COM_LeftFoot + parentName: LeftFoot + position: {x: 0.005990267, y: -0.032092746, z: 0.047852606} + rotation: {x: 0, y: -0, z: -0, w: 1} + scale: {x: 0.0120001435, y: 0.012000024, z: 0.0120001435} + - name: IMU_0x03 + parentName: LeftFoot + position: {x: -0, y: -0.106202975, z: 0.014033947} + rotation: {x: -0.27362692, y: 0.00075502216, z: 0.08112946, w: 0.95840794} + scale: {x: 0.99999994, y: 1.0000002, z: 0.9999999} + - name: LeftToe + parentName: LeftFoot + position: {x: -0.00000016212464, y: -0.13169397, z: 0.062394362} + rotation: {x: -0.0000002682209, y: -0.00000008940697, z: 0.000000029802322, + w: 1} + scale: {x: 0.9999994, y: 0.9999992, z: 0.99999917} + - name: LeftToeTip + parentName: LeftToe + position: {x: -0.000000019073486, y: -0.07445687, z: 0.012571468} + rotation: {x: 0, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: SkinData_newton + parentName: Rokoko_Newton(Clone) + position: {x: -0.00000031143426, y: 1.0248078, z: 0.000000014374509} + rotation: {x: 0.00000026027428, y: -0.0000007907536, z: 2.0581281e-13, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: newtonalpha_mass + parentName: Rokoko_Newton(Clone) + position: {x: -0, y: 0, z: 0} + rotation: {x: 0.00000006657903, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: Point001 + parentName: Rokoko_Newton(Clone) + position: {x: -0.08369885, y: 0.070833474, z: -0.056665372} + rotation: {x: 0.091698945, y: 0.70113575, z: -0.70113575, w: 0.091698945} + scale: {x: 1, y: 1, z: 1} + - name: Point002 + parentName: Rokoko_Newton(Clone) + position: {x: 0.083698496, y: 0.070833206, z: -0.05666556} + rotation: {x: -0.09169912, y: 0.7011357, z: -0.7011357, w: -0.09169912} + scale: {x: 1, y: 1, z: 1} + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 1 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + animationType: 3 + humanoidOversampling: 1 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Art/Meshes/Newton/Rokoko_Newton.FBX + uploadId: 616054 diff --git a/Assets/External/Rokoko/Art/Meshes/NewtonFace.meta b/Assets/External/Rokoko/Art/Meshes/NewtonFace.meta new file mode 100644 index 00000000..bb82385a --- /dev/null +++ b/Assets/External/Rokoko/Art/Meshes/NewtonFace.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f238c9fb6d8d5ae4699a98b849acc18d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/Art/Meshes/NewtonFace/Rokoko_Newtonface.FBX b/Assets/External/Rokoko/Art/Meshes/NewtonFace/Rokoko_Newtonface.FBX new file mode 100644 index 00000000..2ce6a3e6 --- /dev/null +++ b/Assets/External/Rokoko/Art/Meshes/NewtonFace/Rokoko_Newtonface.FBX @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:43861923a2da1e20f6b351d8947eb3481289f2ed0f9cc2f9d3e205983c1ec02b +size 3456576 diff --git a/Assets/External/Rokoko/Art/Meshes/NewtonFace/Rokoko_Newtonface.FBX.meta b/Assets/External/Rokoko/Art/Meshes/NewtonFace/Rokoko_Newtonface.FBX.meta new file mode 100644 index 00000000..2069512e --- /dev/null +++ b/Assets/External/Rokoko/Art/Meshes/NewtonFace/Rokoko_Newtonface.FBX.meta @@ -0,0 +1,139 @@ +fileFormatVersion: 2 +guid: ec8a239e263555b4e89a907a0c672c82 +ModelImporter: + serializedVersion: 23 + fileIDToRecycleName: + 100000: //RootNode + 400000: //RootNode + 2100000: Lens + 2100002: sclera + 2100004: Iris + 2100006: Head + 2100008: 'Material #21' + 2100010: Pupil + 2100012: 'Material #22' + 4300000: NewtonFace + 7400000: Take 001 + 9500000: //RootNode + 13700000: //RootNode + externalObjects: {} + materials: + importMaterials: 1 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: + - serializedVersion: 16 + name: Take 001 + takeName: Take 001 + firstFrame: 0 + lastFrame: 100 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + isReadable: 1 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + optimizeMeshForGPU: 1 + keepQuads: 0 + weldVertices: 1 + preserveHierarchy: 0 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + previousCalculatedGlobalScale: 0.01 + hasPreviousCalculatedGlobalScale: 1 + tangentSpace: + normalSmoothAngle: 180 + normalImportMode: 1 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + importAnimation: 1 + copyAvatar: 0 + humanDescription: + serializedVersion: 2 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + animationType: 2 + humanoidOversampling: 1 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Art/Meshes/NewtonFace/Rokoko_Newtonface.FBX + uploadId: 616054 diff --git a/Assets/External/Rokoko/Art/Shaders.meta b/Assets/External/Rokoko/Art/Shaders.meta new file mode 100644 index 00000000..d33c8c0e --- /dev/null +++ b/Assets/External/Rokoko/Art/Shaders.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c5c7b7128e5f04d47bcfe25a055381c4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/Art/Shaders/Rokoko_RoundTransparentGridFloor_Shader.shader b/Assets/External/Rokoko/Art/Shaders/Rokoko_RoundTransparentGridFloor_Shader.shader new file mode 100644 index 00000000..2cf13287 --- /dev/null +++ b/Assets/External/Rokoko/Art/Shaders/Rokoko_RoundTransparentGridFloor_Shader.shader @@ -0,0 +1,115 @@ +Shader "Rokoko/RoundGridFloor" +{ + Properties + { + [NoScaleOffset]_MainTexture("MainTexture", 2D) = "white" {} + _Tiles("Tiles", Range( 0.2 , 4)) = 0.04 + _SubTiles("SubTiles", Int) = 4 + _Radius("Radius", Float) = 2 + _FadeDistance("FadeDistance", Float) = 2 + _MainColor("MainColor", Color) = (0.5849056,0.5849056,0.5849056,0) + _GridColor("GridColor", Color) = (1,1,1,0) + [HideInInspector] __dirty( "", Int ) = 1 + } + + SubShader + { + Tags{ "RenderType" = "Opaque" "Queue" = "Geometry+0" "IsEmissive" = "true" } + Cull Back + GrabPass{ } + CGPROGRAM + #include "UnityShaderVariables.cginc" + #pragma target 3.0 + #pragma surface surf StandardSpecular keepalpha addshadow fullforwardshadows exclude_path:deferred + struct Input + { + float3 worldPos; + float4 screenPos; + }; + + uniform float4 _MainColor; + uniform float4 _GridColor; + uniform sampler2D _MainTexture; + uniform float _Tiles; + uniform int _SubTiles; + uniform float _FadeDistance; + uniform float _Radius; + uniform sampler2D _GrabTexture; + + + float3 mod2D289( float3 x ) { return x - floor( x * ( 1.0 / 289.0 ) ) * 289.0; } + + float2 mod2D289( float2 x ) { return x - floor( x * ( 1.0 / 289.0 ) ) * 289.0; } + + float3 permute( float3 x ) { return mod2D289( ( ( x * 34.0 ) + 1.0 ) * x ); } + + float snoise( float2 v ) + { + const float4 C = float4( 0.211324865405187, 0.366025403784439, -0.577350269189626, 0.024390243902439 ); + float2 i = floor( v + dot( v, C.yy ) ); + float2 x0 = v - i + dot( i, C.xx ); + float2 i1; + i1 = ( x0.x > x0.y ) ? float2( 1.0, 0.0 ) : float2( 0.0, 1.0 ); + float4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + i = mod2D289( i ); + float3 p = permute( permute( i.y + float3( 0.0, i1.y, 1.0 ) ) + i.x + float3( 0.0, i1.x, 1.0 ) ); + float3 m = max( 0.5 - float3( dot( x0, x0 ), dot( x12.xy, x12.xy ), dot( x12.zw, x12.zw ) ), 0.0 ); + m = m * m; + m = m * m; + float3 x = 2.0 * frac( p * C.www ) - 1.0; + float3 h = abs( x ) - 0.5; + float3 ox = floor( x + 0.5 ); + float3 a0 = x - ox; + m *= 1.79284291400159 - 0.85373472095314 * ( a0 * a0 + h * h ); + float3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot( m, g ); + } + + + inline float4 ASE_ComputeGrabScreenPos( float4 pos ) + { + #if UNITY_UV_STARTS_AT_TOP + float scale = -1.0; + #else + float scale = 1.0; + #endif + float4 o = pos; + o.y = pos.w * 0.5f; + o.y = ( pos.y - o.y ) * _ProjectionParams.x * scale + o.y; + return o; + } + + + void surf( Input i , inout SurfaceOutputStandardSpecular o ) + { + float4 _black = float4(0,0,0,0); + float3 ase_worldPos = i.worldPos; + float4 transform127 = mul(unity_WorldToObject,float4( ase_worldPos , 0.0 )); + float4 appendResult129 = (float4(transform127.x , transform127.z , 0.0 , 0.0)); + float4 lerpResult114 = lerp( _MainColor , _GridColor , max( tex2D( _MainTexture, ( appendResult129 * _Tiles ).xy ).r , tex2D( _MainTexture, ( appendResult129 * _SubTiles * _Tiles ).xy ).r )); + float4 ase_screenPos = float4( i.screenPos.xyz , i.screenPos.w + 0.00000000001 ); + float4 ase_screenPosNorm = ase_screenPos / ase_screenPos.w; + ase_screenPosNorm.z = ( UNITY_NEAR_CLIP_VALUE >= 0 ) ? ase_screenPosNorm.z : ase_screenPosNorm.z * 0.5 + 0.5; + float simplePerlin2D148 = snoise( ( ase_screenPosNorm * 2048.0 ).xy ); + float ScreenRandom152 = ( ( simplePerlin2D148 - 1.0 ) * 0.0008 ); + float3 ase_vertex3Pos = mul( unity_WorldToObject, float4( i.worldPos , 1 ) ); + float3 ase_objectScale = float3( length( unity_ObjectToWorld[ 0 ].xyz ), length( unity_ObjectToWorld[ 1 ].xyz ), length( unity_ObjectToWorld[ 2 ].xyz ) ); + float clampResult126 = clamp( ( (0.0 + (length( ( ase_vertex3Pos * ase_objectScale ) ) - ( _FadeDistance + _Radius )) * (1.0 - 0.0) / (_Radius - ( _FadeDistance + _Radius ))) + ( ScreenRandom152 * 32.0 ) ) , 0.0 , 1.0 ); + float Mask84 = clampResult126; + float4 lerpResult86 = lerp( _black , ( lerpResult114 + ScreenRandom152 ) , Mask84); + o.Albedo = lerpResult86.rgb; + float4 ase_grabScreenPos = ASE_ComputeGrabScreenPos( ase_screenPos ); + float4 screenColor106 = tex2Dproj( _GrabTexture, UNITY_PROJ_COORD( ase_grabScreenPos ) ); + float4 lerpResult107 = lerp( screenColor106 , _black , Mask84); + o.Emission = lerpResult107.rgb; + o.Occlusion = Mask84; + o.Alpha = 1; + } + + ENDCG + } + Fallback "Diffuse" +} \ No newline at end of file diff --git a/Assets/External/Rokoko/Art/Shaders/Rokoko_RoundTransparentGridFloor_Shader.shader.meta b/Assets/External/Rokoko/Art/Shaders/Rokoko_RoundTransparentGridFloor_Shader.shader.meta new file mode 100644 index 00000000..d1a8d5d4 --- /dev/null +++ b/Assets/External/Rokoko/Art/Shaders/Rokoko_RoundTransparentGridFloor_Shader.shader.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: fc0c201ebbc6ff844a8111b15ce5737a +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Art/Shaders/Rokoko_RoundTransparentGridFloor_Shader.shader + uploadId: 616054 diff --git a/Assets/External/Rokoko/Art/Textures.meta b/Assets/External/Rokoko/Art/Textures.meta new file mode 100644 index 00000000..ed87c07c --- /dev/null +++ b/Assets/External/Rokoko/Art/Textures.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bd204d920b563eb46ba6ddd864c9c14e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/Art/Textures/rokoko-floor-2048.png b/Assets/External/Rokoko/Art/Textures/rokoko-floor-2048.png new file mode 100644 index 00000000..f8a92e9a --- /dev/null +++ b/Assets/External/Rokoko/Art/Textures/rokoko-floor-2048.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2297a3690f6a6cc6db6f57b7eb9c10ccfd8c1e8def411e19b17f2e2b7d53e3c2 +size 24107 diff --git a/Assets/External/Rokoko/Art/Textures/rokoko-floor-2048.png.meta b/Assets/External/Rokoko/Art/Textures/rokoko-floor-2048.png.meta new file mode 100644 index 00000000..4148d0c5 --- /dev/null +++ b/Assets/External/Rokoko/Art/Textures/rokoko-floor-2048.png.meta @@ -0,0 +1,123 @@ +fileFormatVersion: 2 +guid: 673b25e62d3e3a4488ffd4d2c9636e84 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 14 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 0 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 1 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 1 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Art/Textures/rokoko-floor-2048.png + uploadId: 616054 diff --git a/Assets/External/Rokoko/Art/Textures/rokoko-gray-16.jpg b/Assets/External/Rokoko/Art/Textures/rokoko-gray-16.jpg new file mode 100644 index 00000000..75c02b8e --- /dev/null +++ b/Assets/External/Rokoko/Art/Textures/rokoko-gray-16.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3303326f088456275b4626646bbd3ccbb91028e507e31a7d01bf2d593daec784 +size 11157 diff --git a/Assets/External/Rokoko/Art/Textures/rokoko-gray-16.jpg.meta b/Assets/External/Rokoko/Art/Textures/rokoko-gray-16.jpg.meta new file mode 100644 index 00000000..b0140e09 --- /dev/null +++ b/Assets/External/Rokoko/Art/Textures/rokoko-gray-16.jpg.meta @@ -0,0 +1,99 @@ +fileFormatVersion: 2 +guid: 0265e9ba7f5e59445b11cb82a48f7214 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Art/Textures/rokoko-gray-16.jpg + uploadId: 616054 diff --git a/Assets/External/Rokoko/EditorScripts.meta b/Assets/External/Rokoko/EditorScripts.meta new file mode 100644 index 00000000..73750484 --- /dev/null +++ b/Assets/External/Rokoko/EditorScripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 247225ee61910404f8b6667f6ebb5a8c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/EditorScripts/Editor.meta b/Assets/External/Rokoko/EditorScripts/Editor.meta new file mode 100644 index 00000000..ba274ba8 --- /dev/null +++ b/Assets/External/Rokoko/EditorScripts/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bcb7fc52d279a04418128409398af3bd +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/EditorScripts/Editor/ActorEditor.cs b/Assets/External/Rokoko/EditorScripts/Editor/ActorEditor.cs new file mode 100644 index 00000000..a084081e --- /dev/null +++ b/Assets/External/Rokoko/EditorScripts/Editor/ActorEditor.cs @@ -0,0 +1,242 @@ +#if UNITY_EDITOR + +using Rokoko.Helper; +using Rokoko.Inputs; +using UnityEditor; +using UnityEngine; + +namespace Rokoko.RokokoEditor +{ + [CustomEditor(typeof(Actor))] + [CanEditMultipleObjects] + public class ActorEditor : TweakableEditor + { + private const string TPOSE_GUIDE_PREFAB_PATH = "TPoseGuide_Prefab"; + private const int GroupSpace = 20; + + private SerializedProperty boneMapping; + private SerializedProperty animatorProperty; + private SerializedProperty profileNameProperty; + private SerializedProperty faceProperty; + + private GameObject tPoseGuide; + + protected void OnEnable() + { + boneMapping = serializedObject.FindProperty("boneMapping"); + animatorProperty = serializedObject.FindProperty("animator"); + profileNameProperty = serializedObject.FindProperty("profileName"); + faceProperty = serializedObject.FindProperty("face"); + + Actor actor = (Actor)target; + + if (!Application.isPlaying) + actor.animator = actor.gameObject.GetComponent(); + + if (actor.animator != null && !actor.isValidTpose) + actor.CalculateTPose(); + + EditorApplication.playModeStateChanged += EditorApplication_playModeStateChanged; + } + + private void OnDisable() + { + HideTPoseGuide(); + } + + private void HideTPoseGuide() + { + if (tPoseGuide != null) + { + RokokoHelper.Destroy(tPoseGuide); + tPoseGuide = null; + } + } + + private void EditorApplication_playModeStateChanged(PlayModeStateChange obj) + { + HideTPoseGuide(); + } + + // Stops showing the script field + protected override string[] GetInvisibleInDefaultInspector() + { + return new[] { "m_Script" }; + } + + public override void OnInspectorGUI() + { + Actor actor = (Actor)target; + serializedObject.Update(); + + Undo.RecordObject(actor, "Undo Actor Changes"); + + // TPose + { + GUILayout.BeginVertical("HelpBox"); + + EditorGUILayout.HelpBox("T Pose reference is needed in order translate properly animation from Studio.", MessageType.Info); + + if (actor.animator != null) + { + GUILayout.BeginHorizontal(); + { + GUILayout.Label("T Pose reference"); + + string textValue = (actor.characterTPose.Count == 0) ? "Not set" : $"Referece:{actor.name}"; + GUILayout.TextField(textValue); + + if (actor.characterTPose.Count == 0) + EditorGUILayout.HelpBox("You need to assign a reference T Pose.", MessageType.Error); + } + GUILayout.EndHorizontal(); + + GUILayout.Space(10); + + if (actor.characterTPose.Count > 0) + { + if (!actor.isValidTpose) + { + EditorGUILayout.HelpBox("Refernce T Pose seems wrong.\nRotate the character to match the TPose orientation guide and then \"Assign T Pose\" again.", MessageType.Error); + + GUI.color = Color.white; + } + } + + EditorGUILayout.BeginHorizontal(); + + if (tPoseGuide == null) + { + if (GUILayout.Button("Show T Pose Guide")) + { + tPoseGuide = GameObject.Instantiate(Resources.Load(TPOSE_GUIDE_PREFAB_PATH)); + TPoseGuideGameComponent tposeComponent = tPoseGuide.GetComponent(); + tposeComponent.followTarget = actor.transform; + + float actorHeight = actor.GetActorHeight(); + // Plane is x10 times bigger + // Make contour guide bigger + tposeComponent.transform.localScale = Vector3.one * actorHeight * 0.1f * 1.25f; + tposeComponent.followOffset = new Vector3(0, actorHeight / 2f, -0.5f); + } + } + else + { + if (GUILayout.Button("Hide T Pose Guide")) + { + HideTPoseGuide(); + } + } + + if (GUILayout.Button("Assign T Pose")) + { + actor.CalculateTPose(); + } + + EditorGUILayout.EndHorizontal(); + + if (tPoseGuide != null) + { + EditorGUILayout.HelpBox("Rotate your character according to the help guide plane.\nNote: Position doesn't matter, you only need to match the actor to the silhouette", MessageType.Info); + } + } + else + { + EditorGUILayout.HelpBox("Please select a valid Animator", MessageType.Error); + } + + GUILayout.EndVertical(); + + GUILayout.Space(GroupSpace); + } + + // Profile name + { + GUILayout.BeginVertical("HelpBox"); + + EditorGUILayout.HelpBox("Profile name allows you to override any target from Studio", MessageType.Info); + EditorGUILayout.PropertyField(profileNameProperty); + + GUILayout.EndVertical(); + + GUILayout.Space(GroupSpace); + + } + + // Bone Mapping + { + GUILayout.BeginVertical("HelpBox"); + + EditorGUILayout.HelpBox("Bone mapping is used to convert a Studio Actor to any custom character hierarchy", MessageType.Info); + EditorGUILayout.PropertyField(boneMapping); + if (actor.boneMapping == Actor.BoneMappingEnum.Animator) + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.PropertyField(animatorProperty); + if (GUILayout.Button("Self")) + { + actor.animator = actor.GetComponentInChildren(); + } + EditorGUILayout.EndHorizontal(); + + if (actor.animator == null) + { + EditorGUILayout.HelpBox("Please select a valid Animator", MessageType.Error); + } + else if (!actor.animator.isHuman) + { + EditorGUILayout.HelpBox("The avatar you are using is not humanoid.\nPlease go in model inspector, under Rig tab and select AnimationType as Humanoid.", MessageType.Error); + } + } + else + { + if (actor.GetComponent() == null) + { + actor.customBoneMapping = Undo.AddComponent(actor.gameObject, typeof(HumanBoneMapping)) as HumanBoneMapping; + } + else if (actor.customBoneMapping == null) + { + actor.customBoneMapping = actor.GetComponent(); + } + } + + GUILayout.EndVertical(); + + GUILayout.Space(GroupSpace); + } + + // Face + { + EditorGUILayout.LabelField("Actor Face (Optional)", EditorStyles.boldLabel); + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.PropertyField(faceProperty); + if (GUILayout.Button("Create")) + { + if (actor.gameObject.GetComponent() is Face face) + { + actor.face = face; + } + else + { + actor.face = Undo.AddComponent(actor.gameObject, typeof(Face)) as Face; + } + + } + if (GUILayout.Button("Self")) + { + actor.face = actor.GetComponentInChildren(); + } + EditorGUILayout.EndHorizontal(); + + GUILayout.Space(10); + } + + serializedObject.ApplyModifiedProperties(); + + // Draw standard fields + base.OnInspectorGUI(); + } + } +} + +#endif \ No newline at end of file diff --git a/Assets/External/Rokoko/EditorScripts/Editor/ActorEditor.cs.meta b/Assets/External/Rokoko/EditorScripts/Editor/ActorEditor.cs.meta new file mode 100644 index 00000000..ee182de7 --- /dev/null +++ b/Assets/External/Rokoko/EditorScripts/Editor/ActorEditor.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 6c145f0e6172c614cb36925c13089d46 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/EditorScripts/Editor/ActorEditor.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/EditorScripts/Editor/ActorNewtonEditor.cs b/Assets/External/Rokoko/EditorScripts/Editor/ActorNewtonEditor.cs new file mode 100644 index 00000000..a2b21ac7 --- /dev/null +++ b/Assets/External/Rokoko/EditorScripts/Editor/ActorNewtonEditor.cs @@ -0,0 +1,13 @@ +#if UNITY_EDITOR + +using Rokoko.Inputs; +using UnityEditor; + +namespace Rokoko.RokokoEditor +{ + [CustomEditor(typeof(ActorNewton))] + [CanEditMultipleObjects] + public class ActorNewtonEditor : ActorEditor { } +} + +#endif \ No newline at end of file diff --git a/Assets/External/Rokoko/EditorScripts/Editor/ActorNewtonEditor.cs.meta b/Assets/External/Rokoko/EditorScripts/Editor/ActorNewtonEditor.cs.meta new file mode 100644 index 00000000..ad98fad7 --- /dev/null +++ b/Assets/External/Rokoko/EditorScripts/Editor/ActorNewtonEditor.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: d1046da63220b6747b3ff405b5d9b66f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/EditorScripts/Editor/ActorNewtonEditor.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/EditorScripts/Editor/BlendShapesMappingEditor.cs b/Assets/External/Rokoko/EditorScripts/Editor/BlendShapesMappingEditor.cs new file mode 100644 index 00000000..6b0d9a49 --- /dev/null +++ b/Assets/External/Rokoko/EditorScripts/Editor/BlendShapesMappingEditor.cs @@ -0,0 +1,100 @@ +#if UNITY_EDITOR + +using Rokoko.Inputs; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; +using Rokoko.Helper; +using Rokoko.Core; + +namespace Rokoko.RokokoEditor +{ + [CustomEditor(typeof(BlendShapesMapping))] + [CanEditMultipleObjects] + public class BlendShapesMappingEditor : TweakableEditor + { + private BlendShapes[] _BlendshapesArray = null; + public BlendShapes[] BlendshapesArray + { + get + { + if (_BlendshapesArray == null) + { + _BlendshapesArray = new BlendShapes[(int)BlendShapes.size]; + for (int i = 0; i < _BlendshapesArray.Length; i++) + { + _BlendshapesArray[i] = (BlendShapes)i; + } + } + + return _BlendshapesArray; + } + } + + + SerializedProperty blendshapeNames; + + protected void OnEnable() + { + blendshapeNames = serializedObject.FindProperty("blendshapeNames"); + } + + // Stops showing the script field + protected override string[] GetInvisibleInDefaultInspector() + { + return new[] { "m_Script" }; + } + + public override void OnInspectorGUI() + { + BlendShapesMapping blendshapesMapping = (BlendShapesMapping)target; + serializedObject.Update(); + + Undo.RecordObject(blendshapesMapping, "Undo ActorCustomBoneMapping Changes"); + + // Initialize Array + if (blendshapesMapping.blendshapeNames.Count != BlendshapesArray.Length) + { + blendshapesMapping.blendshapeNames = new BlendshapesDictionary(); + for (int i = 0; i < BlendshapesArray.Length; i++) + { + blendshapesMapping.blendshapeNames.Add(BlendshapesArray[i], ""); + } + + // SerializedObject rereferce needs to be updated + return; + } + + GUILayout.Space(10); + + if (GUILayout.Button("Copy from ARKit")) + { + // Copy fields from ARKit + for (int i = 0; i < blendshapesMapping.blendshapeNames.Count; i++) + { + KeyValuePair keyPair = blendshapesMapping.blendshapeNames[i]; + blendshapesMapping.blendshapeNames[keyPair.Key] = keyPair.Key.ToString(); + } + } + + GUILayout.Space(10); + + // Draw a field for each Blendshape + for (int i = 0; i < blendshapesMapping.blendshapeNames.Count; i++) + { + KeyValuePair keyPair = blendshapesMapping.blendshapeNames[i]; + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(keyPair.Key.ToString().ToUpperFirstChar()); + blendshapesMapping.blendshapeNames[keyPair.Key] = EditorGUILayout.TextField(keyPair.Value.ToString()); + EditorGUILayout.EndHorizontal(); + } + + serializedObject.ApplyModifiedProperties(); + + // Draw standard fields + //base.OnInspectorGUI(); + } + } +} + +#endif \ No newline at end of file diff --git a/Assets/External/Rokoko/EditorScripts/Editor/BlendShapesMappingEditor.cs.meta b/Assets/External/Rokoko/EditorScripts/Editor/BlendShapesMappingEditor.cs.meta new file mode 100644 index 00000000..ee43ff8e --- /dev/null +++ b/Assets/External/Rokoko/EditorScripts/Editor/BlendShapesMappingEditor.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: b14cf39ebf53638488debce90a690ad2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/EditorScripts/Editor/BlendShapesMappingEditor.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/EditorScripts/Editor/CharacterEditor.cs b/Assets/External/Rokoko/EditorScripts/Editor/CharacterEditor.cs new file mode 100644 index 00000000..6ef148c5 --- /dev/null +++ b/Assets/External/Rokoko/EditorScripts/Editor/CharacterEditor.cs @@ -0,0 +1,109 @@ +#if UNITY_EDITOR + +using Rokoko.Helper; +using Rokoko.Inputs; +using UnityEditor; +using UnityEngine; + +namespace Rokoko.RokokoEditor +{ + [CustomEditor(typeof(Character))] + [CanEditMultipleObjects] + public class CharacterEditor : TweakableEditor + { + private const int GroupSpace = 20; + + private SerializedProperty animatorProperty; + private SerializedProperty profileNameProperty; + private SerializedProperty faceProperty; + + private GameObject tPoseGuide; + + protected void OnEnable() + { + animatorProperty = serializedObject.FindProperty("animator"); + profileNameProperty = serializedObject.FindProperty("profileName"); + faceProperty = serializedObject.FindProperty("face"); + + Character character = (Character)target; + + if (!Application.isPlaying) + character.animator = character.gameObject.GetComponent(); + + EditorApplication.playModeStateChanged += EditorApplication_playModeStateChanged; + } + + private void OnDisable() + { + } + + private void HideTPoseGuide() + { + } + + private void EditorApplication_playModeStateChanged(PlayModeStateChange obj) + { + } + + // Stops showing the script field + protected override string[] GetInvisibleInDefaultInspector() + { + return new[] { "m_Script" }; + } + + public override void OnInspectorGUI() + { + Character character = (Character)target; + serializedObject.Update(); + + Undo.RecordObject(character, "Undo Character Changes"); + + + // Profile name + { + GUILayout.BeginVertical("HelpBox"); + + EditorGUILayout.HelpBox("Profile name allows you to override any target from Studio", MessageType.Info); + EditorGUILayout.PropertyField(profileNameProperty); + + GUILayout.EndVertical(); + + GUILayout.Space(GroupSpace); + + } + + // Face + { + EditorGUILayout.LabelField("Character Face (Optional)", EditorStyles.boldLabel); + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.PropertyField(faceProperty); + if (GUILayout.Button("Create")) + { + if (character.gameObject.GetComponent() is Face face) + { + character.face = face; + } + else + { + character.face = Undo.AddComponent(character.gameObject, typeof(Face)) as Face; + } + + } + if (GUILayout.Button("Self")) + { + character.face = character.GetComponentInChildren(); + } + EditorGUILayout.EndHorizontal(); + + GUILayout.Space(10); + } + + serializedObject.ApplyModifiedProperties(); + + // Draw standard fields + base.OnInspectorGUI(); + } + } +} + +#endif \ No newline at end of file diff --git a/Assets/External/Rokoko/EditorScripts/Editor/CharacterEditor.cs.meta b/Assets/External/Rokoko/EditorScripts/Editor/CharacterEditor.cs.meta new file mode 100644 index 00000000..2508aa07 --- /dev/null +++ b/Assets/External/Rokoko/EditorScripts/Editor/CharacterEditor.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 23947746632310247af5d08e4faf5afd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/EditorScripts/Editor/CharacterEditor.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/EditorScripts/Editor/FaceEditor.cs b/Assets/External/Rokoko/EditorScripts/Editor/FaceEditor.cs new file mode 100644 index 00000000..a0a0183b --- /dev/null +++ b/Assets/External/Rokoko/EditorScripts/Editor/FaceEditor.cs @@ -0,0 +1,111 @@ +#if UNITY_EDITOR + +using Rokoko.Helper; +using Rokoko.Inputs; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using UnityEditor; +using UnityEngine; + +namespace Rokoko.RokokoEditor +{ + [CustomEditor(typeof(Face))] + [CanEditMultipleObjects] + public class FaceEditor : TweakableEditor + { + private static int blendshapesCount; + + SerializedProperty blendshapeMappingProperty; + SerializedProperty blendshapeCustomMapProperty; + SerializedProperty meshRendererProperty; + + protected void OnEnable() + { + blendshapeMappingProperty = serializedObject.FindProperty("blendshapeMapping"); + blendshapeCustomMapProperty = serializedObject.FindProperty("blendshapeCustomMap"); + meshRendererProperty = serializedObject.FindProperty("meshRenderer"); + blendshapesCount = (int)Core.BlendShapes.size; + + Face face = (Face)target; + face.meshRenderer = face.GetComponentInChildren(); + } + + // Stops showing the script field + protected override string[] GetInvisibleInDefaultInspector() + { + return new[] { "m_Script" }; + } + + public override void OnInspectorGUI() + { + Face face = (Face)target; + serializedObject.Update(); + + Undo.RecordObject(face, "Undo Face Changes"); + + EditorGUILayout.HelpBox("Blendshape mapping is used to convert a Studio Face to any custom character blendshapes", MessageType.Info); + EditorGUILayout.PropertyField(blendshapeMappingProperty); + if (face.blendshapeMapping == Face.FaceMappingEnum.ARKit) + { + // Do nothing + } + else + { + EditorGUILayout.PropertyField(blendshapeCustomMapProperty); + if (face.GetComponent() == null) + { + face.blendshapeCustomMap = Undo.AddComponent(face.gameObject, typeof(BlendShapesMapping)) as BlendShapesMapping; + } + } + + GUILayout.Space(10); + + EditorGUILayout.BeginHorizontal(); + { + EditorGUILayout.PropertyField(meshRendererProperty); + if (GUILayout.Button("Find in Hierarchy")) + { + face.meshRenderer = face.GetComponentInChildren(); + } + } + EditorGUILayout.EndHorizontal(); + + + if (face.meshRenderer == null) + { + EditorGUILayout.HelpBox("You need to assign a valid SkinnedMeshRenderer", MessageType.Error); + } + else if (face.meshRenderer.sharedMesh.blendShapeCount == 0) + { + EditorGUILayout.HelpBox("Assigned SkinnedMeshRenderer doesn't have any blendshapes", MessageType.Warning); + } + else if (face.meshRenderer.sharedMesh.blendShapeCount > 0) + { + if (face.meshRenderer.sharedMesh.blendShapeCount < blendshapesCount) + { + StringBuilder message = new StringBuilder(); + message.AppendLine($"Face supports {blendshapesCount} blendshapes, but found {face.meshRenderer.sharedMesh.blendShapeCount} on SkinnedMeshRenderer\n"); + List missingBlendshapes = face.meshRenderer.sharedMesh.GetAllMissingBlendshapes(); + message.AppendLine("Missing blendshapes:"); + for (int i = 0; i < missingBlendshapes.Count; i++) + { + message.AppendLine(missingBlendshapes[i]); + } + EditorGUILayout.HelpBox(message.ToString(), MessageType.Warning); + } + else + { + EditorGUILayout.HelpBox($"Found {face.meshRenderer.sharedMesh.blendShapeCount} blendshapes on SkinnedMeshRenderer", MessageType.Info); + } + } + + serializedObject.ApplyModifiedProperties(); + + // Draw standard fields + base.OnInspectorGUI(); + } + } +} + +#endif \ No newline at end of file diff --git a/Assets/External/Rokoko/EditorScripts/Editor/FaceEditor.cs.meta b/Assets/External/Rokoko/EditorScripts/Editor/FaceEditor.cs.meta new file mode 100644 index 00000000..1ebbeb2a --- /dev/null +++ b/Assets/External/Rokoko/EditorScripts/Editor/FaceEditor.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: d5dc6a1ce1b3e1e4ca93a58eb7b8423e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/EditorScripts/Editor/FaceEditor.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/EditorScripts/Editor/HumanBoneMappingEditor.cs b/Assets/External/Rokoko/EditorScripts/Editor/HumanBoneMappingEditor.cs new file mode 100644 index 00000000..756dbd77 --- /dev/null +++ b/Assets/External/Rokoko/EditorScripts/Editor/HumanBoneMappingEditor.cs @@ -0,0 +1,88 @@ +#if UNITY_EDITOR + +using Rokoko.Inputs; +using UnityEditor; +using UnityEngine; + +namespace Rokoko.RokokoEditor +{ + [CustomEditor(typeof(HumanBoneMapping))] + [CanEditMultipleObjects] + public class HumanBoneMappingEditor : TweakableEditor + { + private HumanBodyBones[] _HumanBodyBonesArray; + + public HumanBodyBones[] HumanBodyBonesArray + { + get + { + if (_HumanBodyBonesArray == null) + { + _HumanBodyBonesArray = new HumanBodyBones[(int)HumanBodyBones.LastBone]; + for (int i = 0; i < _HumanBodyBonesArray.Length; i++) + _HumanBodyBonesArray[i] = (HumanBodyBones)i; + } + return _HumanBodyBonesArray; + } + } + + SerializedProperty customBodyBones; + + protected void OnEnable() + { + customBodyBones = serializedObject.FindProperty("customBodyBones"); + } + + // Stops showing the script field + protected override string[] GetInvisibleInDefaultInspector() + { + return new[] { "m_Script" }; + } + + public override void OnInspectorGUI() + { + HumanBoneMapping boneMapping = (HumanBoneMapping)target; + Undo.RecordObject(boneMapping, "Undo ActorCustomBoneMapping Changes"); + + // Initialize Array + if (boneMapping.customBodyBones.Length != HumanBodyBonesArray.Length) + { + boneMapping.customBodyBones = new Transform[HumanBodyBonesArray.Length]; + + // SerializedObject rereferce needs to be updated + return; + } + + GUILayout.Space(10); + + if (GUILayout.Button("Copy from Animator")) + { + Animator animator = boneMapping.GetComponent(); + if (animator != null) + { + for (int i = 0; i < HumanBodyBonesArray.Length; i++) + { + boneMapping.customBodyBones[i] = animator.GetBoneTransform(HumanBodyBonesArray[i]); + } + } + } + + GUILayout.Space(10); + + // Draw a field for each HumanBodyBone + for (int i = 0; i < HumanBodyBonesArray.Length; i++) + { + SerializedProperty element = customBodyBones.GetArrayElementAtIndex(i); + EditorGUILayout.PropertyField(element, new GUIContent(HumanBodyBonesArray[i].ToString())); + } + + serializedObject.ApplyModifiedProperties(); + + // Draw standard fields + //base.OnInspectorGUI(); + + } + } +} + +#endif \ No newline at end of file diff --git a/Assets/External/Rokoko/EditorScripts/Editor/HumanBoneMappingEditor.cs.meta b/Assets/External/Rokoko/EditorScripts/Editor/HumanBoneMappingEditor.cs.meta new file mode 100644 index 00000000..d945f1e5 --- /dev/null +++ b/Assets/External/Rokoko/EditorScripts/Editor/HumanBoneMappingEditor.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: a0839a667aaa630449048d91f665bff9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/EditorScripts/Editor/HumanBoneMappingEditor.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/EditorScripts/Editor/PropColorEditor.cs b/Assets/External/Rokoko/EditorScripts/Editor/PropColorEditor.cs new file mode 100644 index 00000000..e0c4cc44 --- /dev/null +++ b/Assets/External/Rokoko/EditorScripts/Editor/PropColorEditor.cs @@ -0,0 +1,44 @@ +#if UNITY_EDITOR + +using Rokoko.Inputs; +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace Rokoko.RokokoEditor +{ + [CustomEditor(typeof(PropColor))] + [CanEditMultipleObjects] + public class PropColorEditor : PropEditor + { + SerializedProperty meshRendererProperty; + + protected override void OnEnable() + { + base.OnEnable(); + meshRendererProperty = serializedObject.FindProperty("meshRenderer"); + } + + public override void OnInspectorGUI() + { + base.OnInspectorGUI(); + + PropColor propColor = (PropColor)target; + serializedObject.Update(); + + GUILayout.Space(10); + + EditorGUILayout.LabelField("Update mesh color", EditorStyles.boldLabel); + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.PropertyField(meshRendererProperty); + if (GUILayout.Button("Self")) + { + propColor.meshRenderer = propColor.GetComponentInChildren(); + } + EditorGUILayout.EndHorizontal(); + } + } +} + +#endif \ No newline at end of file diff --git a/Assets/External/Rokoko/EditorScripts/Editor/PropColorEditor.cs.meta b/Assets/External/Rokoko/EditorScripts/Editor/PropColorEditor.cs.meta new file mode 100644 index 00000000..6843caa1 --- /dev/null +++ b/Assets/External/Rokoko/EditorScripts/Editor/PropColorEditor.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 0d1dd208261ef5a4992092a3318f5134 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/EditorScripts/Editor/PropColorEditor.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/EditorScripts/Editor/PropEditor.cs b/Assets/External/Rokoko/EditorScripts/Editor/PropEditor.cs new file mode 100644 index 00000000..f57b0aa7 --- /dev/null +++ b/Assets/External/Rokoko/EditorScripts/Editor/PropEditor.cs @@ -0,0 +1,43 @@ +#if UNITY_EDITOR + +using Rokoko.Inputs; +using UnityEditor; + +namespace Rokoko.RokokoEditor +{ + [CustomEditor(typeof(Prop))] + [CanEditMultipleObjects] + public class PropEditor : TweakableEditor + { + SerializedProperty propNameProperty; + + protected virtual void OnEnable() + { + propNameProperty = serializedObject.FindProperty("propName"); + } + + // Stops showing the script field + protected override string[] GetInvisibleInDefaultInspector() + { + return new[] { "m_Script" }; + } + + public override void OnInspectorGUI() + { + Prop prop = (Prop)target; + serializedObject.Update(); + + Undo.RecordObject(prop, "Undo Prop Changes"); + + EditorGUILayout.HelpBox("Prop name allows you to override any prop target from studio", MessageType.Info); + EditorGUILayout.PropertyField(propNameProperty); + + serializedObject.ApplyModifiedProperties(); + + // Draw standard fields + base.OnInspectorGUI(); + } + } +} + +#endif \ No newline at end of file diff --git a/Assets/External/Rokoko/EditorScripts/Editor/PropEditor.cs.meta b/Assets/External/Rokoko/EditorScripts/Editor/PropEditor.cs.meta new file mode 100644 index 00000000..da037ea9 --- /dev/null +++ b/Assets/External/Rokoko/EditorScripts/Editor/PropEditor.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 6ffddd999956ac94880e3d3b948a51b9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/EditorScripts/Editor/PropEditor.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/EditorScripts/Editor/TweakableEditor.cs b/Assets/External/Rokoko/EditorScripts/Editor/TweakableEditor.cs new file mode 100644 index 00000000..e2a82eab --- /dev/null +++ b/Assets/External/Rokoko/EditorScripts/Editor/TweakableEditor.cs @@ -0,0 +1,44 @@ +#if UNITY_EDITOR + +using UnityEditor; + +/// +/// A simple class to inherit from when only minor tweaks to a component's inspector are required. +/// In such cases, a full custom inspector is normally overkill but, by inheriting from this class, custom tweaks become trivial. +/// +/// To hide items from being drawn, simply override GetInvisibleInDefaultInspector, returning a string[] of fields to hide. +/// To draw/add extra GUI code/anything else you want before the default inspector is drawn, override OnBeforeDefaultInspector. +/// Similarly, override OnAfterDefaultInspector to draw GUI elements after the default inspector is drawn. +/// + +namespace Rokoko.RokokoEditor +{ + public abstract class TweakableEditor : Editor + { + private static readonly string[] _emptyStringArray = new string[0]; + + public override void OnInspectorGUI() + { + serializedObject.Update(); + + OnBeforeDefaultInspector(); + DrawPropertiesExcluding(serializedObject, GetInvisibleInDefaultInspector()); + OnAfterDefaultInspector(); + + serializedObject.ApplyModifiedProperties(); + } + + protected virtual void OnBeforeDefaultInspector() + { } + + protected virtual void OnAfterDefaultInspector() + { } + + protected virtual string[] GetInvisibleInDefaultInspector() + { + return _emptyStringArray; + } + } +} + +#endif \ No newline at end of file diff --git a/Assets/External/Rokoko/EditorScripts/Editor/TweakableEditor.cs.meta b/Assets/External/Rokoko/EditorScripts/Editor/TweakableEditor.cs.meta new file mode 100644 index 00000000..5c70bf07 --- /dev/null +++ b/Assets/External/Rokoko/EditorScripts/Editor/TweakableEditor.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: c2ecfb1b4e8e7e84f8b2e187eafde67d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/EditorScripts/Editor/TweakableEditor.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/EditorScripts/RokokoEditorScripts.asmdef b/Assets/External/Rokoko/EditorScripts/RokokoEditorScripts.asmdef new file mode 100644 index 00000000..9abd5ab8 --- /dev/null +++ b/Assets/External/Rokoko/EditorScripts/RokokoEditorScripts.asmdef @@ -0,0 +1,18 @@ +{ + "name": "RokokoEditor", + "rootNamespace": "", + "references": [ + "GUID:c0283c4bf59b9ad4aa5b4622e1c041a8" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Assets/External/Rokoko/EditorScripts/RokokoEditorScripts.asmdef.meta b/Assets/External/Rokoko/EditorScripts/RokokoEditorScripts.asmdef.meta new file mode 100644 index 00000000..545c6f28 --- /dev/null +++ b/Assets/External/Rokoko/EditorScripts/RokokoEditorScripts.asmdef.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: 855bf3bf522250848be7ed3fd9e6664e +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/EditorScripts/RokokoEditorScripts.asmdef + uploadId: 616054 diff --git a/Assets/External/Rokoko/Prefabs.meta b/Assets/External/Rokoko/Prefabs.meta new file mode 100644 index 00000000..09f8be93 --- /dev/null +++ b/Assets/External/Rokoko/Prefabs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 783138d5a2f60ff4ea5015e2c8cca4bf +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/Prefabs/Actors.meta b/Assets/External/Rokoko/Prefabs/Actors.meta new file mode 100644 index 00000000..731800bc --- /dev/null +++ b/Assets/External/Rokoko/Prefabs/Actors.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3fb9c566e8aee9446858332229f7b0ae +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/Prefabs/Actors/Newton.prefab b/Assets/External/Rokoko/Prefabs/Actors/Newton.prefab new file mode 100644 index 00000000..3aaf4ed5 --- /dev/null +++ b/Assets/External/Rokoko/Prefabs/Actors/Newton.prefab @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3eb1a4dd47208d99e95710c8e92cd74d7b60a647292db819858da401cdc09d0e +size 175146 diff --git a/Assets/External/Rokoko/Prefabs/Actors/Newton.prefab.meta b/Assets/External/Rokoko/Prefabs/Actors/Newton.prefab.meta new file mode 100644 index 00000000..5a7fe89f --- /dev/null +++ b/Assets/External/Rokoko/Prefabs/Actors/Newton.prefab.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: 3e7a0bccb581d8945b546f992a7871f4 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Prefabs/Actors/Newton.prefab + uploadId: 616054 diff --git a/Assets/External/Rokoko/Prefabs/Actors/Newton_CustomSkeleton.prefab b/Assets/External/Rokoko/Prefabs/Actors/Newton_CustomSkeleton.prefab new file mode 100644 index 00000000..2180d83e --- /dev/null +++ b/Assets/External/Rokoko/Prefabs/Actors/Newton_CustomSkeleton.prefab @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f6c675323ca03cee41cfed18d2157538a721541c8701e6026a5b90a51aa58137 +size 177308 diff --git a/Assets/External/Rokoko/Prefabs/Actors/Newton_CustomSkeleton.prefab.meta b/Assets/External/Rokoko/Prefabs/Actors/Newton_CustomSkeleton.prefab.meta new file mode 100644 index 00000000..a4d8df32 --- /dev/null +++ b/Assets/External/Rokoko/Prefabs/Actors/Newton_CustomSkeleton.prefab.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: fe3b0c434bb22024aaddb5f7564faa14 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Prefabs/Actors/Newton_CustomSkeleton.prefab + uploadId: 616054 diff --git a/Assets/External/Rokoko/Prefabs/Actors/Newton_NoFace.prefab b/Assets/External/Rokoko/Prefabs/Actors/Newton_NoFace.prefab new file mode 100644 index 00000000..f762c98e --- /dev/null +++ b/Assets/External/Rokoko/Prefabs/Actors/Newton_NoFace.prefab @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:62e6adadabdb802be9410477528551cb0841a1667147364ebd95cf31ef8fb5a6 +size 170036 diff --git a/Assets/External/Rokoko/Prefabs/Actors/Newton_NoFace.prefab.meta b/Assets/External/Rokoko/Prefabs/Actors/Newton_NoFace.prefab.meta new file mode 100644 index 00000000..f9a68b99 --- /dev/null +++ b/Assets/External/Rokoko/Prefabs/Actors/Newton_NoFace.prefab.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: 45a3ed8bac3c96c4297dcd116a155351 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Prefabs/Actors/Newton_NoFace.prefab + uploadId: 616054 diff --git a/Assets/External/Rokoko/Prefabs/Actors/Prop.prefab b/Assets/External/Rokoko/Prefabs/Actors/Prop.prefab new file mode 100644 index 00000000..92cc87fb --- /dev/null +++ b/Assets/External/Rokoko/Prefabs/Actors/Prop.prefab @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e48c462e8a2a50757f2a6de69fb519765945639fdc0374e765411f2cee7b6f3b +size 2773 diff --git a/Assets/External/Rokoko/Prefabs/Actors/Prop.prefab.meta b/Assets/External/Rokoko/Prefabs/Actors/Prop.prefab.meta new file mode 100644 index 00000000..988d3efa --- /dev/null +++ b/Assets/External/Rokoko/Prefabs/Actors/Prop.prefab.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: 1b1f12af1c3d2fa4bb2cd58a1aa78db5 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Prefabs/Actors/Prop.prefab + uploadId: 616054 diff --git a/Assets/External/Rokoko/Prefabs/UI.meta b/Assets/External/Rokoko/Prefabs/UI.meta new file mode 100644 index 00000000..686714ff --- /dev/null +++ b/Assets/External/Rokoko/Prefabs/UI.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: db95f5fd11f463b42ad4514065e74eab +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/Prefabs/UI/CommandAPI.prefab b/Assets/External/Rokoko/Prefabs/UI/CommandAPI.prefab new file mode 100644 index 00000000..8a11fbe8 --- /dev/null +++ b/Assets/External/Rokoko/Prefabs/UI/CommandAPI.prefab @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a364f1309863486d1cae428175cedcd5f7df5c7618fe1406c4bf6baf492d489c +size 66266 diff --git a/Assets/External/Rokoko/Prefabs/UI/CommandAPI.prefab.meta b/Assets/External/Rokoko/Prefabs/UI/CommandAPI.prefab.meta new file mode 100644 index 00000000..596f971e --- /dev/null +++ b/Assets/External/Rokoko/Prefabs/UI/CommandAPI.prefab.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +guid: 024fe78707b0a9e4599b8093e621eaa7 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 100100000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Prefabs/UI/CommandAPI.prefab + uploadId: 616054 diff --git a/Assets/External/Rokoko/Prefabs/UI/Hierarchy_UI.prefab b/Assets/External/Rokoko/Prefabs/UI/Hierarchy_UI.prefab new file mode 100644 index 00000000..6892f0b3 --- /dev/null +++ b/Assets/External/Rokoko/Prefabs/UI/Hierarchy_UI.prefab @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d204f530ce9057687f80e79bb54d0a53bc31abd2c447a332895c941f4dd7425 +size 18748 diff --git a/Assets/External/Rokoko/Prefabs/UI/Hierarchy_UI.prefab.meta b/Assets/External/Rokoko/Prefabs/UI/Hierarchy_UI.prefab.meta new file mode 100644 index 00000000..b87a610f --- /dev/null +++ b/Assets/External/Rokoko/Prefabs/UI/Hierarchy_UI.prefab.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: bc90cf8ecd1a41c42bd2bc08d5539e38 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Prefabs/UI/Hierarchy_UI.prefab + uploadId: 616054 diff --git a/Assets/External/Rokoko/Prefabs/UI/PlaybackRow.prefab b/Assets/External/Rokoko/Prefabs/UI/PlaybackRow.prefab new file mode 100644 index 00000000..7ad9713a --- /dev/null +++ b/Assets/External/Rokoko/Prefabs/UI/PlaybackRow.prefab @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a9299a293a3b94bcfa9555f76801dd3c5cc7f5306c887cbaff6f00e59dc16be +size 27794 diff --git a/Assets/External/Rokoko/Prefabs/UI/PlaybackRow.prefab.meta b/Assets/External/Rokoko/Prefabs/UI/PlaybackRow.prefab.meta new file mode 100644 index 00000000..c4b44b8b --- /dev/null +++ b/Assets/External/Rokoko/Prefabs/UI/PlaybackRow.prefab.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: 57ed10a773465374ea968f6babbec922 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Prefabs/UI/PlaybackRow.prefab + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scared_mixamo.fbx b/Assets/External/Rokoko/Scared_mixamo.fbx new file mode 100644 index 00000000..bc7f7e8e --- /dev/null +++ b/Assets/External/Rokoko/Scared_mixamo.fbx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3a0a300694ebbc8a792a9728797e8513200d19c3db6cf26a209c0c8c39e0b810 +size 3598368 diff --git a/Assets/External/Rokoko/Scared_mixamo.fbx.meta b/Assets/External/Rokoko/Scared_mixamo.fbx.meta new file mode 100644 index 00000000..b029ca3b --- /dev/null +++ b/Assets/External/Rokoko/Scared_mixamo.fbx.meta @@ -0,0 +1,878 @@ +fileFormatVersion: 2 +guid: 36a951994cc4a8747ba422cbe26f7858 +ModelImporter: + serializedVersion: 21300 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 2 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + removeConstantScaleCurves: 1 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 1 + importConstraints: 0 + animationCompression: 3 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + nodeNameCollisionStrategy: 1 + fileIdsGeneration: 2 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + bakeAxisConversion: 0 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + optimizeBones: 1 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVMarginMethod: 1 + secondaryUVMinLightmapResolution: 40 + secondaryUVMinObjectScale: 1 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: + - boneName: mixamorig:Hips + humanName: Hips + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:LeftUpLeg + humanName: LeftUpperLeg + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:RightUpLeg + humanName: RightUpperLeg + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:LeftLeg + humanName: LeftLowerLeg + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:RightLeg + humanName: RightLowerLeg + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:LeftFoot + humanName: LeftFoot + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:RightFoot + humanName: RightFoot + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:Spine + humanName: Spine + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:Spine1 + humanName: Chest + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:Neck + humanName: Neck + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:Head + humanName: Head + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:LeftShoulder + humanName: LeftShoulder + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:RightShoulder + humanName: RightShoulder + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:LeftArm + humanName: LeftUpperArm + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:RightArm + humanName: RightUpperArm + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:LeftForeArm + humanName: LeftLowerArm + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:RightForeArm + humanName: RightLowerArm + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:LeftHand + humanName: LeftHand + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:RightHand + humanName: RightHand + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:LeftToeBase + humanName: LeftToes + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:RightToeBase + humanName: RightToes + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:LeftHandThumb1 + humanName: Left Thumb Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:LeftHandThumb2 + humanName: Left Thumb Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:LeftHandThumb3 + humanName: Left Thumb Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:LeftHandIndex1 + humanName: Left Index Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:LeftHandIndex2 + humanName: Left Index Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:LeftHandIndex3 + humanName: Left Index Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:LeftHandMiddle1 + humanName: Left Middle Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:LeftHandMiddle2 + humanName: Left Middle Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:LeftHandMiddle3 + humanName: Left Middle Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:LeftHandRing1 + humanName: Left Ring Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:LeftHandRing2 + humanName: Left Ring Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:LeftHandRing3 + humanName: Left Ring Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:LeftHandPinky1 + humanName: Left Little Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:LeftHandPinky2 + humanName: Left Little Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:LeftHandPinky3 + humanName: Left Little Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:RightHandThumb1 + humanName: Right Thumb Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:RightHandThumb2 + humanName: Right Thumb Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:RightHandThumb3 + humanName: Right Thumb Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:RightHandIndex1 + humanName: Right Index Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:RightHandIndex2 + humanName: Right Index Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:RightHandIndex3 + humanName: Right Index Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:RightHandMiddle1 + humanName: Right Middle Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:RightHandMiddle2 + humanName: Right Middle Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:RightHandMiddle3 + humanName: Right Middle Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:RightHandRing1 + humanName: Right Ring Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:RightHandRing2 + humanName: Right Ring Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:RightHandRing3 + humanName: Right Ring Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:RightHandPinky1 + humanName: Right Little Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:RightHandPinky2 + humanName: Right Little Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:RightHandPinky3 + humanName: Right Little Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:Spine2 + humanName: UpperChest + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + skeleton: + - name: Scared_mixamo(Clone) + parentName: + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:Reference + parentName: Scared_mixamo(Clone) + position: {x: -0, y: 0, z: 0} + rotation: {x: 0, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:Body + parentName: mixamorig:Reference + position: {x: -0, y: 0, z: 0} + rotation: {x: 0, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:HeadFace + parentName: mixamorig:Reference + position: {x: -0, y: 0.0000000024259583, z: -0.00000022285663} + rotation: {x: 0.00000006657903, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:Hips + parentName: mixamorig:Reference + position: {x: -0, y: 0.9037807, z: -2.417918e-15} + rotation: {x: -0, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:LeftUpLeg + parentName: mixamorig:Hips + position: {x: -0.07787898, y: 0, z: -2.3922876e-23} + rotation: {x: 3.5491237e-34, y: -7.3216153e-28, z: 1, w: -0.000000484746} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:LeftLeg + parentName: mixamorig:LeftUpLeg + position: {x: 0.0000003013351, y: 0.41535452, z: 0.0000003827621} + rotation: {x: 0.00000062279975, y: -4.491322e-10, z: -0.00072115, w: 0.99999976} + scale: {x: 1.0000001, y: 1.0000001, z: 1} + - name: mixamorig:LeftFoot + parentName: mixamorig:LeftLeg + position: {x: -0.000000050229218, y: 0.4163161, z: 0.0000000024661482} + rotation: {x: 0.53471565, y: 0.00038557468, z: 0.0006093385, w: 0.8450318} + scale: {x: 1.0000004, y: 1.0000002, z: 1.0000001} + - name: mixamorig:LeftToeBase + parentName: mixamorig:LeftFoot + position: {x: -0.00000006202875, y: 0.14011212, z: -0.00000020407406} + rotation: {x: 0.21942928, y: -8.731149e-11, z: -0.00000009610085, w: 0.9756285} + scale: {x: 1.0000007, y: 1.0000002, z: 1.0000002} + - name: mixamorig:LeftToe_End + parentName: mixamorig:LeftToeBase + position: {x: 0.000000019683629, y: 0.06999996, z: -0.00000036921563} + rotation: {x: -2.4868996e-13, y: 1.6783135e-14, z: 1.7877745e-14, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:RightUpLeg + parentName: mixamorig:Hips + position: {x: 0.07787898, y: 0, z: -0.0000000022923363} + rotation: {x: 1.4993052e-34, y: -3.2787031e-28, z: 1, w: -0.00000045728603} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:RightLeg + parentName: mixamorig:RightUpLeg + position: {x: 0.0000004101159, y: 0.41535464, z: 0.0000003781775} + rotation: {x: 0.0000003705356, y: 2.6748592e-10, z: 0.0007218899, w: 0.99999976} + scale: {x: 1.0000002, y: 1.0000002, z: 1} + - name: mixamorig:RightFoot + parentName: mixamorig:RightLeg + position: {x: -0.000000026337704, y: 0.4163161, z: 0.0000000031358873} + rotation: {x: 0.53471524, y: -0.00038588233, z: -0.0006098256, w: 0.84503204} + scale: {x: 1.0000002, y: 0.9999999, z: 0.9999999} + - name: mixamorig:RightToeBase + parentName: mixamorig:RightFoot + position: {x: 0.000000012894521, y: 0.14011227, z: -0.00000044927603} + rotation: {x: 0.21942711, y: 5.820766e-11, z: 0.00000063944026, w: 0.9756289} + scale: {x: 1.0000005, y: 1.0000001, z: 1} + - name: mixamorig:RightToe_End + parentName: mixamorig:RightToeBase + position: {x: -5.6772476e-10, y: 0.07000017, z: -0.00000071996186} + rotation: {x: -2.9842792e-13, y: 5.780977e-14, z: -1.9057566e-15, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:Spine + parentName: mixamorig:Hips + position: {x: 0.000000011990522, y: 0.12667805, z: 0} + rotation: {x: -0, y: 3.190771e-30, z: -2.3962281e-23, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:Spine1 + parentName: mixamorig:Spine + position: {x: 0.0000000025234501, y: 0.124173276, z: 0} + rotation: {x: -0, y: 3.190771e-30, z: -2.3962281e-23, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:Spine2 + parentName: mixamorig:Spine1 + position: {x: -0.0000000034319207, y: 0.11996293, z: -0.0000000037252903} + rotation: {x: -0, y: 3.190749e-30, z: -2.3962123e-23, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:LeftShoulder + parentName: mixamorig:Spine2 + position: {x: -0.06768812, y: 0.09955788, z: 0} + rotation: {x: 0.5, y: -0.5, z: 0.5, w: 0.5} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:LeftArm + parentName: mixamorig:LeftShoulder + position: {x: -6.0888794e-15, y: 0.12941296, z: -0.00000023841858} + rotation: {x: -0, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:LeftForeArm + parentName: mixamorig:LeftArm + position: {x: 0.0000007394701, y: 0.25094384, z: 0.000000119209275} + rotation: {x: -0, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:LeftHand + parentName: mixamorig:LeftForeArm + position: {x: -0.000000080093756, y: 0.2763268, z: 0.000000119209275} + rotation: {x: -0, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:LeftHandIndex1 + parentName: mixamorig:LeftHand + position: {x: 0.024832107, y: 0.07828188, z: 0.0009986162} + rotation: {x: -0, y: -0, z: -0.000000834465, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:LeftHandIndex2 + parentName: mixamorig:LeftHandIndex1 + position: {x: 0.0000000042470276, y: 0.04441101, z: -0.00000023841858} + rotation: {x: -0, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:LeftHandIndex3 + parentName: mixamorig:LeftHandIndex2 + position: {x: -0.00000016009629, y: 0.027322719, z: -0.00000023841858} + rotation: {x: -0.000011265278, y: -9.40048e-12, z: 0.0000071525574, w: 1} + scale: {x: 1.0000001, y: 1.0000001, z: 1.0000001} + - name: mixamorig:LeftHandIndex4 + parentName: mixamorig:LeftHandIndex3 + position: {x: 0.0000000062997145, y: 0.027131414, z: 0.00000030851314} + rotation: {x: 2.6858509e-12, y: 7.1054257e-15, z: -1.5134557e-12, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:LeftHandMiddle1 + parentName: mixamorig:LeftHand + position: {x: 0.0052840635, y: 0.07888889, z: 0.0009987354} + rotation: {x: -0.0000031590462, y: -0, z: -0.0000007748604, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:LeftHandMiddle2 + parentName: mixamorig:LeftHandMiddle1 + position: {x: -0.0000000023273459, y: 0.04559241, z: -0.00000027574094} + rotation: {x: -0, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:LeftHandMiddle3 + parentName: mixamorig:LeftHandMiddle2 + position: {x: -0.000000076869725, y: 0.030071655, z: -0.00000019778497} + rotation: {x: -0, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:LeftHandMiddle4 + parentName: mixamorig:LeftHandMiddle3 + position: {x: -0.00000016560472, y: 0.02998215, z: 0.000000025897414} + rotation: {x: -0.49998322, y: 0.50001675, z: -0.5000136, w: 0.4999864} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:LeftHandPinky1 + parentName: mixamorig:LeftHand + position: {x: -0.030413289, y: 0.0680446, z: 0.0009989738} + rotation: {x: 0.0000022053719, y: -0, z: -0.0000004172325, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:LeftHandPinky2 + parentName: mixamorig:LeftHandPinky1 + position: {x: 0.00000000282894, y: 0.034458637, z: -0.0000003092732} + rotation: {x: -0.0000056624413, y: 0.0000000595986, z: -0.0000016689302, w: 1} + scale: {x: 1.0000001, y: 1, z: 1} + - name: mixamorig:LeftHandPinky3 + parentName: mixamorig:LeftHandPinky2 + position: {x: 0.0000000040571386, y: 0.021659479, z: -0.00000009060199} + rotation: {x: 0.0000034570692, y: -0.000000059614536, z: 0.0000049471855, w: 1} + scale: {x: 1.0000002, y: 1.0000001, z: 1.0000001} + - name: mixamorig:LeftHandPinky4 + parentName: mixamorig:LeftHandPinky3 + position: {x: 0.0000000041422252, y: 0.022409271, z: -0.000000037010757} + rotation: {x: -1.0658139e-14, y: -3.5527133e-15, z: 6.927791e-13, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:LeftHandRing1 + parentName: mixamorig:LeftHand + position: {x: -0.013966348, y: 0.07569122, z: 0.0009993315} + rotation: {x: 0.000000029802319, y: -0.000000029802319, z: -0.0000006407499, + w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:LeftHandRing2 + parentName: mixamorig:LeftHandRing1 + position: {x: -0.0000000024119942, y: 0.04258539, z: -0.00000035762787} + rotation: {x: -0.00000008940698, y: 0.000000029802262, z: 0.000000014901104, + w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:LeftHandRing3 + parentName: mixamorig:LeftHandRing2 + position: {x: -0.00000003142688, y: 0.02746447, z: -0.0000001192093} + rotation: {x: -0.00000834465, y: -5.2136073e-12, z: -0.00000014901164, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:LeftHandRing4 + parentName: mixamorig:LeftHandRing3 + position: {x: -0.000000006313589, y: 0.026999911, z: -0.000000030448845} + rotation: {x: 0, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:LeftHandThumb1 + parentName: mixamorig:LeftHand + position: {x: 0.036862448, y: 0.016169965, z: 0.0009441376} + rotation: {x: 0.003476113, y: 0.000053077936, z: -0.4732895, w: 0.8809001} + scale: {x: 1, y: 1.0000001, z: 1.0000001} + - name: mixamorig:LeftHandThumb2 + parentName: mixamorig:LeftHandThumb1 + position: {x: -0.010516237, y: 0.036976773, z: -0.00000021772424} + rotation: {x: 0.0000023285395, y: -0.0000008211428, z: 0.17508073, w: 0.9845541} + scale: {x: 1.0000001, y: 1.0000001, z: 1.0000002} + - name: mixamorig:LeftHandThumb3 + parentName: mixamorig:LeftHandThumb2 + position: {x: 0.000000015558387, y: 0.02915626, z: -0.00000022997925} + rotation: {x: -0.000000029802322, y: -0.000000029802129, z: 0.0000000149010555, + w: 1} + scale: {x: 1.0000002, y: 1.0000002, z: 1.0000002} + - name: mixamorig:LeftHandThumb4 + parentName: mixamorig:LeftHandThumb3 + position: {x: 0.000000070909564, y: 0.034589745, z: -0.00000020938404} + rotation: {x: -1.627143e-12, y: 2.9132255e-13, z: 6.181722e-13, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:RightShoulder + parentName: mixamorig:Spine2 + position: {x: 0.06768826, y: 0.09955788, z: 0} + rotation: {x: 0.50000036, y: 0.49999973, z: -0.50000024, w: 0.4999998} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:RightArm + parentName: mixamorig:RightShoulder + position: {x: 0.0000000068783694, y: 0.12941314, z: 0.00000002578629} + rotation: {x: -0, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:RightForeArm + parentName: mixamorig:RightArm + position: {x: 0.00000010367964, y: 0.25094423, z: -0.000000005029048} + rotation: {x: -0, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:RightHand + parentName: mixamorig:RightForeArm + position: {x: 0.00000091794897, y: 0.27632713, z: -0.00000030149582} + rotation: {x: -0, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:RightHandIndex1 + parentName: mixamorig:RightHand + position: {x: -0.024831852, y: 0.07828305, z: 0.000998709} + rotation: {x: -0.0000005066395, y: -0, z: 0.0000007599592, w: 1} + scale: {x: 0.9999999, y: 1, z: 0.9999999} + - name: mixamorig:RightHandIndex2 + parentName: mixamorig:RightHandIndex1 + position: {x: -0.00000001111125, y: 0.04441161, z: -0.00000059573154} + rotation: {x: -0.000000014901161, y: 1.8873791e-14, z: -0.000000014901161, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:RightHandIndex3 + parentName: mixamorig:RightHandIndex2 + position: {x: -0.000000012268687, y: 0.027323138, z: -0.00000035731298} + rotation: {x: -0.0000056624413, y: 6.2938543e-12, z: -0.00000397861, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:RightHandIndex4 + parentName: mixamorig:RightHandIndex3 + position: {x: 0.0000000018306582, y: 0.027131611, z: -0.00000034546693} + rotation: {x: 0, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:RightHandMiddle1 + parentName: mixamorig:RightHand + position: {x: -0.005283898, y: 0.078889884, z: 0.0009987073} + rotation: {x: -0.00000055134296, y: -0.000000029802322, z: 0.00000059604645, + w: 1} + scale: {x: 0.9999999, y: 1, z: 0.9999999} + - name: mixamorig:RightHandMiddle2 + parentName: mixamorig:RightHandMiddle1 + position: {x: -0.00000000370721, y: 0.04559344, z: -0.00000030703194} + rotation: {x: -0.000000029802262, y: 5.32907e-15, z: 0.000000029802246, w: 1} + scale: {x: 1, y: 1, z: 1.0000001} + - name: mixamorig:RightHandMiddle3 + parentName: mixamorig:RightHandMiddle2 + position: {x: 0.000000009176926, y: 0.030072333, z: -0.00000030523952} + rotation: {x: -0, y: -0, z: 1.5881834e-22, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:RightHandMiddle4 + parentName: mixamorig:RightHandMiddle3 + position: {x: 0.00000016974272, y: 0.029982252, z: 0.000000056589112} + rotation: {x: 0, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:RightHandPinky1 + parentName: mixamorig:RightHand + position: {x: 0.03041353, y: 0.068045184, z: 0.0009987167} + rotation: {x: 0.000005990267, y: -0.000000029802322, z: 0.00000074505806, w: 1} + scale: {x: 0.9999999, y: 1, z: 0.9999999} + - name: mixamorig:RightHandPinky2 + parentName: mixamorig:RightHandPinky1 + position: {x: 0.0000000060457386, y: 0.034459334, z: -0.00000028000215} + rotation: {x: -0.000010088086, y: -7.3896445e-12, z: -0.0000024884937, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:RightHandPinky3 + parentName: mixamorig:RightHandPinky2 + position: {x: 0.0000000082569835, y: 0.021660123, z: -0.00000046924174} + rotation: {x: -0.0000066161156, y: -2.0090596e-12, z: -0.000002324581, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:RightHandPinky4 + parentName: mixamorig:RightHandPinky3 + position: {x: 3.306879e-11, y: 0.022409303, z: -0.000000021943743} + rotation: {x: 0, y: -0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:RightHandRing1 + parentName: mixamorig:RightHand + position: {x: 0.013966673, y: 0.07569204, z: 0.000998471} + rotation: {x: 0.0000012218952, y: -0.000000029802322, z: 0.0000002682209, w: 1} + scale: {x: 0.9999999, y: 1, z: 0.9999999} + - name: mixamorig:RightHandRing2 + parentName: mixamorig:RightHandRing1 + position: {x: -3.6257858e-10, y: 0.04258623, z: -0.00000079344716} + rotation: {x: -0, y: -0, z: 7.993606e-15, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:RightHandRing3 + parentName: mixamorig:RightHandRing2 + position: {x: 0.00000005486614, y: 0.027464794, z: -0.00000036051335} + rotation: {x: -0.0000073611736, y: 1.9753088e-12, z: 1.9895197e-13, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:RightHandRing4 + parentName: mixamorig:RightHandRing3 + position: {x: -0.0000000050864424, y: 0.02699997, z: -0.000000031501802} + rotation: {x: -1.3571364e-12, y: -7.1054265e-15, z: -6.394883e-14, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:RightHandThumb1 + parentName: mixamorig:RightHand + position: {x: -0.036861885, y: 0.015437997, z: 0.00094370253} + rotation: {x: 0.0034954543, y: -0.000067561865, z: 0.4756712, w: 0.87961626} + scale: {x: 0.9999999, y: 1, z: 0.9999999} + - name: mixamorig:RightHandThumb2 + parentName: mixamorig:RightHandThumb1 + position: {x: 0.010904432, y: 0.037607055, z: -0.0000007831257} + rotation: {x: -0.0000021781307, y: 0.0000012647943, z: -0.17773637, w: 0.9840782} + scale: {x: 1.0000002, y: 1.0000004, z: 1.0000002} + - name: mixamorig:RightHandThumb3 + parentName: mixamorig:RightHandThumb2 + position: {x: -4.4113374e-10, y: 0.02915672, z: -0.00000044944045} + rotation: {x: -0.00000011920907, y: -0.000000059604467, z: -1.7543496e-13, w: 1} + scale: {x: 1.0000001, y: 1, z: 1.0000001} + - name: mixamorig:RightHandThumb4 + parentName: mixamorig:RightHandThumb3 + position: {x: -0.00000021005964, y: 0.034589972, z: -0.000000030675526} + rotation: {x: -0, y: -0, z: -5.929231e-21, w: 1} + scale: {x: 1.0000002, y: 1.0000002, z: 1.0000002} + - name: mixamorig:Neck + parentName: mixamorig:Spine2 + position: {x: 0.00000013200449, y: 0.17428434, z: -0.00000010058284} + rotation: {x: -0, y: 3.1907927e-30, z: -2.3962439e-23, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:Head + parentName: mixamorig:Neck + position: {x: -0.0000000013002822, y: 0.106102824, z: -0.0000000037252903} + rotation: {x: -0, y: -8.811665e-29, z: 6.6174484e-22, w: 1} + scale: {x: 0.95139265, y: 0.95139265, z: 0.95139265} + - name: mixamorig:HeadTop_End + parentName: mixamorig:Head + position: {x: -1.5009823e-15, y: 0.16043971, z: -0.00000002074769} + rotation: {x: -0.00000006465881, y: 0.0000000646588, z: 4.1807628e-15, w: 1} + scale: {x: 1, y: 1, z: 1} + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 1 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 3 + humanoidOversampling: 1 + avatarSetup: 1 + addHumanoidExtraRootOnlyWhenUsingAvatar: 1 + remapMaterialsIfMaterialImportModeIsNone: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scared_mixamo.fbx + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scenes.meta b/Assets/External/Rokoko/Scenes.meta new file mode 100644 index 00000000..35b67425 --- /dev/null +++ b/Assets/External/Rokoko/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c60823a4bc8e94644b7be6544524e375 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/Scenes/RokokoPluginExampleScene.unity b/Assets/External/Rokoko/Scenes/RokokoPluginExampleScene.unity new file mode 100644 index 00000000..0af7fde0 --- /dev/null +++ b/Assets/External/Rokoko/Scenes/RokokoPluginExampleScene.unity @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:94dd47217ec2b1abe4058c949b7b04bf4460296a663cf6fed6e2db12f7dbc949 +size 48531 diff --git a/Assets/External/Rokoko/Scenes/RokokoPluginExampleScene.unity.meta b/Assets/External/Rokoko/Scenes/RokokoPluginExampleScene.unity.meta new file mode 100644 index 00000000..0a63a77f --- /dev/null +++ b/Assets/External/Rokoko/Scenes/RokokoPluginExampleScene.unity.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +guid: 39c928cd83eadf94dbb0246812856c50 +timeCreated: 1495451914 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scenes/RokokoPluginExampleScene.unity + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_CustomActors.unity b/Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_CustomActors.unity new file mode 100644 index 00000000..a89c6782 --- /dev/null +++ b/Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_CustomActors.unity @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:21dba9a642781f9bdc2b44841473c98180b88b19ec18bd1d993740d9d60a8ea7 +size 122341 diff --git a/Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_CustomActors.unity.meta b/Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_CustomActors.unity.meta new file mode 100644 index 00000000..54bca35e --- /dev/null +++ b/Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_CustomActors.unity.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +guid: 9bbf3850d36255447872fa09883079f7 +timeCreated: 1495451914 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_CustomActors.unity + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_CustomActorsSettings.lighting b/Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_CustomActorsSettings.lighting new file mode 100644 index 00000000..3cfc742f --- /dev/null +++ b/Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_CustomActorsSettings.lighting @@ -0,0 +1,64 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!850595691 &4890085278179872738 +LightingSettings: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: RokokoPluginExampleScene_CustomActorsSettings + serializedVersion: 4 + m_GIWorkflowMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 1 + m_RealtimeEnvironmentLighting: 1 + m_BounceScale: 1 + m_AlbedoBoost: 1 + m_IndirectOutputScale: 0.06 + m_UsingShadowmask: 0 + m_BakeBackend: 0 + m_LightmapMaxSize: 1024 + m_BakeResolution: 40 + m_Padding: 2 + m_LightmapCompression: 3 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAO: 0 + m_MixedBakeMode: 1 + m_LightmapsBakeMode: 1 + m_FilterMode: 1 + m_LightmapParameters: {fileID: 15204, guid: 0000000000000000f000000000000000, type: 0} + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_RealtimeResolution: 2 + m_ForceWhiteAlbedo: 0 + m_ForceUpdates: 0 + m_FinalGather: 0 + m_FinalGatherRayCount: 256 + m_FinalGatherFiltering: 1 + m_PVRCulling: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVREnvironmentSampleCount: 500 + m_PVREnvironmentReferencePointCount: 2048 + m_LightProbeSampleCountMultiplier: 4 + m_PVRBounces: 2 + m_PVRMinBounces: 2 + m_PVREnvironmentMIS: 0 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_PVRTiledBaking: 0 diff --git a/Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_CustomActorsSettings.lighting.meta b/Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_CustomActorsSettings.lighting.meta new file mode 100644 index 00000000..cc696b81 --- /dev/null +++ b/Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_CustomActorsSettings.lighting.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +guid: eb9b09d13157371409b54a1cd26c7a89 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 4890085278179872738 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_CustomActorsSettings.lighting + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_CustomCharacter.unity b/Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_CustomCharacter.unity new file mode 100644 index 00000000..b761c54c --- /dev/null +++ b/Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_CustomCharacter.unity @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f81d612d6c59f8d172aa60d7e4eb7778696d817f1d9758a64bbc8451d533fde3 +size 126157 diff --git a/Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_CustomCharacter.unity.meta b/Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_CustomCharacter.unity.meta new file mode 100644 index 00000000..75d4b67e --- /dev/null +++ b/Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_CustomCharacter.unity.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: b96d8b765d6e2094fa4c28de7d0d9154 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_CustomCharacter.unity + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_DriftCorrection.unity b/Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_DriftCorrection.unity new file mode 100644 index 00000000..3cd73f50 --- /dev/null +++ b/Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_DriftCorrection.unity @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e42c6d8800ecd03aba3f5f414be311eea1cedbfda120ae7c6c4a46893a8e4324 +size 122341 diff --git a/Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_DriftCorrection.unity.meta b/Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_DriftCorrection.unity.meta new file mode 100644 index 00000000..fe17fa32 --- /dev/null +++ b/Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_DriftCorrection.unity.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: febc4bc1f8bdf9048ace337c41422d1b +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scenes/RokokoPluginExampleScene_DriftCorrection.unity + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts.meta b/Assets/External/Rokoko/Scripts.meta new file mode 100644 index 00000000..305566fd --- /dev/null +++ b/Assets/External/Rokoko/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8eafea70406ce3b4aa2eeec06db40b2a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/Scripts/Core.meta b/Assets/External/Rokoko/Scripts/Core.meta new file mode 100644 index 00000000..332934b7 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Core.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d7417c9a13b2bd14ab1fea1d7ffa8e0a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/Scripts/Core/ARKitBlendshapes.cs b/Assets/External/Rokoko/Scripts/Core/ARKitBlendshapes.cs new file mode 100644 index 00000000..2777229f --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Core/ARKitBlendshapes.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Rokoko.Core +{ + [System.Serializable] + public enum BlendShapes + { + eyeBlinkLeft = 0, + eyeLookDownLeft = 1, + eyeLookInLeft = 2, + eyeLookOutLeft = 3, + eyeLookUpLeft = 4, + eyeSquintLeft = 5, + eyeWideLeft = 6, + eyeBlinkRight = 7, + eyeLookDownRight = 8, + eyeLookInRight = 9, + eyeLookOutRight = 10, + eyeLookUpRight = 11, + eyeSquintRight = 12, + eyeWideRight = 13, + jawForward = 14, + jawLeft = 15, + jawRight = 16, + jawOpen = 17, + mouthClose = 18, + mouthFunnel = 19, + mouthPucker = 20, + mouthLeft = 21, + mouthRight = 22, + mouthSmileLeft = 23, + mouthSmileRight = 24, + mouthFrownLeft = 25, + mouthFrownRight = 26, + mouthDimpleLeft = 27, + mouthDimpleRight = 28, + mouthStretchLeft = 29, + mouthStretchRight = 30, + mouthRollLower = 31, + mouthRollUpper = 32, + mouthShrugLower = 33, + mouthShrugUpper = 34, + mouthPressLeft = 35, + mouthPressRight = 36, + mouthLowerDownLeft = 37, + mouthLowerDownRight = 38, + mouthUpperUpLeft = 39, + mouthUpperUpRight = 40, + browDownLeft = 41, + browDownRight = 42, + browInnerUp = 43, + browOuterUpLeft = 44, + browOuterUpRight = 45, + cheekPuff = 46, + cheekSquintLeft = 47, + cheekSquintRight = 48, + noseSneerLeft = 49, + noseSneerRight = 50, + tongueOut = 51, + size = 52 + } +} diff --git a/Assets/External/Rokoko/Scripts/Core/ARKitBlendshapes.cs.meta b/Assets/External/Rokoko/Scripts/Core/ARKitBlendshapes.cs.meta new file mode 100644 index 00000000..f98258bb --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Core/ARKitBlendshapes.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 9f43a84310e40244c970e95e1d934b1a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Core/ARKitBlendshapes.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Core/CommandAPI.meta b/Assets/External/Rokoko/Scripts/Core/CommandAPI.meta new file mode 100644 index 00000000..57b07e35 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Core/CommandAPI.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 721c3fac4cc3fbe4188ec6ec27cb4708 +folderAsset: yes +timeCreated: 1564996317 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/Scripts/Core/CommandAPI/CalibrateRequestData.cs b/Assets/External/Rokoko/Scripts/Core/CommandAPI/CalibrateRequestData.cs new file mode 100644 index 00000000..139e05cd --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Core/CommandAPI/CalibrateRequestData.cs @@ -0,0 +1,63 @@ +using UnityEngine; + +namespace Rokoko.CommandAPI +{ + public enum BalancedNewtonPose + { + // tpose + TPose = 0, + + // straight-arms-down + StraightArmsDown = 1, + + // straight-arms-forward + StraightArmsForward = 2, + } + + public class CalibrateRequestData + { + [SerializeField] private string device_id; // the live input device hubName that the command should target + + /// + /// Count down in seconds before calibration is executed. -1 will use default setting. + /// + [SerializeField] private int countdown_delay = -1; // countdown in seconds + + /// + /// Skip Smartsuit Pro calibration. + /// + [SerializeField] private bool skip_suit = false; // should we skip suit from a processing (calibration) + + /// + /// Skip Smartgloves calibration. + /// + [SerializeField] private bool skip_gloves = false; // should we skip gloves from a processing (calibration) + + /// + /// + /// + [SerializeField] private bool use_custom_pose = false; + + // useCustomPose is not Set, pose will be changed calibration + [SerializeField] private BalancedNewtonPose pose = BalancedNewtonPose.StraightArmsDown; + + // public members + + public string DeviceId { get => device_id; set => device_id = value; } + public int CountDownDelay { get => countdown_delay; set => countdown_delay = value; } + public bool SkipSuit { get => skip_suit; set => skip_suit = value; } + public bool SkipGloves { get => skip_gloves; set => skip_gloves = value; } + public bool UseCustomPose { get => use_custom_pose; set => use_custom_pose = value; } + public BalancedNewtonPose Pose { get => pose; set => pose = value; } + + public override string ToString() + { + return DeviceId; + } + + public string ToJson() + { + return JsonUtility.ToJson(this); + } + } +} \ No newline at end of file diff --git a/Assets/External/Rokoko/Scripts/Core/CommandAPI/CalibrateRequestData.cs.meta b/Assets/External/Rokoko/Scripts/Core/CommandAPI/CalibrateRequestData.cs.meta new file mode 100644 index 00000000..eb217218 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Core/CommandAPI/CalibrateRequestData.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: c24db3c2889d1834e8281156d81a2e47 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Core/CommandAPI/CalibrateRequestData.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Core/CommandAPI/InfoRequestData.cs b/Assets/External/Rokoko/Scripts/Core/CommandAPI/InfoRequestData.cs new file mode 100644 index 00000000..a972ec8d --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Core/CommandAPI/InfoRequestData.cs @@ -0,0 +1,30 @@ +using UnityEngine; + +namespace Rokoko.CommandAPI +{ + public class InfoRequestData + { + [SerializeField] private bool devices_info = true; // return a list of scene input devices names + [SerializeField] private bool clips_info = true; // return a list of scene clip names + [SerializeField] private bool actors_info = false; // return a list of scene actor names + [SerializeField] private bool characters_info = false; // return a list of scene character names + + // public members + + public bool DoDevicesInfo { get => devices_info; set => devices_info = value; } + public bool DoClipsInfo { get => clips_info; set => clips_info = value; } + public bool DoActorsInfo { get => actors_info; set => actors_info = value; } + public bool DoCharactersInfo { get => characters_info; set => characters_info = value; } + + + public override string ToString() + { + return $"{DoDevicesInfo}, {DoClipsInfo}, {DoActorsInfo}, {DoCharactersInfo}"; + } + + public string ToJson() + { + return JsonUtility.ToJson(this); + } + } +} \ No newline at end of file diff --git a/Assets/External/Rokoko/Scripts/Core/CommandAPI/InfoRequestData.cs.meta b/Assets/External/Rokoko/Scripts/Core/CommandAPI/InfoRequestData.cs.meta new file mode 100644 index 00000000..797dfa76 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Core/CommandAPI/InfoRequestData.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 3f377ed4cb6af8a4fbbc2574919a49b4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Core/CommandAPI/InfoRequestData.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Core/CommandAPI/LivestreamRequestData.cs b/Assets/External/Rokoko/Scripts/Core/CommandAPI/LivestreamRequestData.cs new file mode 100644 index 00000000..5834985f --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Core/CommandAPI/LivestreamRequestData.cs @@ -0,0 +1,23 @@ +using UnityEngine; + +namespace Rokoko.CommandAPI +{ + public class LivestreamRequestData + { + [SerializeField] private bool enabled = true; // control a state of a custom live stream target + + // public members + + public bool Enabled { get => enabled; set => enabled = value; } + + public override string ToString() + { + return $"{Enabled}"; + } + + public string ToJson() + { + return JsonUtility.ToJson(this); + } + } +} \ No newline at end of file diff --git a/Assets/External/Rokoko/Scripts/Core/CommandAPI/LivestreamRequestData.cs.meta b/Assets/External/Rokoko/Scripts/Core/CommandAPI/LivestreamRequestData.cs.meta new file mode 100644 index 00000000..010adf20 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Core/CommandAPI/LivestreamRequestData.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 6f7120b96083d6b428b292676b191d01 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Core/CommandAPI/LivestreamRequestData.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Core/CommandAPI/PlaybackRequestData.cs b/Assets/External/Rokoko/Scripts/Core/CommandAPI/PlaybackRequestData.cs new file mode 100644 index 00000000..be5fc965 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Core/CommandAPI/PlaybackRequestData.cs @@ -0,0 +1,43 @@ +using UnityEngine; +using System; + +namespace Rokoko.CommandAPI +{ + [Flags] + public enum CommandAPIPlaybackChange : int + { + None = 0, + IsPlaying = 1, + CurrentTime = 2, + GoToFirstFrame = 4, + GoToLastFrame = 8, + PlaybackSpeed = 16, + }; + + + public class PlaybackRequestData + { + [SerializeField] private bool is_playing = false; // defines the timeline play / pause state + [SerializeField] private double current_time = 0.0; // defines a current time on a timeline + [SerializeField] private float playback_speed = 1.0f;// defines a playback speed multiplier + [SerializeField] private CommandAPIPlaybackChange change_flag; + + // public members + + public bool IsPlaying { get => is_playing; set => is_playing = value; } + public double CurrentTime { get => current_time; set => current_time = value; } + public float PlaybackSpeed { get => playback_speed; set => playback_speed = value; } + public CommandAPIPlaybackChange ChangeFlag { get => change_flag; set => change_flag = value; } + + + public override string ToString() + { + return $"{IsPlaying}, {CurrentTime}, {PlaybackSpeed}, {ChangeFlag}"; + } + + public string ToJson() + { + return JsonUtility.ToJson(this); + } + } +} \ No newline at end of file diff --git a/Assets/External/Rokoko/Scripts/Core/CommandAPI/PlaybackRequestData.cs.meta b/Assets/External/Rokoko/Scripts/Core/CommandAPI/PlaybackRequestData.cs.meta new file mode 100644 index 00000000..3b2d31f1 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Core/CommandAPI/PlaybackRequestData.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: c917bc2391c5c7b4a99a645b00f893d2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Core/CommandAPI/PlaybackRequestData.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Core/CommandAPI/RecordingRequestData.cs b/Assets/External/Rokoko/Scripts/Core/CommandAPI/RecordingRequestData.cs new file mode 100644 index 00000000..a2cc051d --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Core/CommandAPI/RecordingRequestData.cs @@ -0,0 +1,30 @@ +using UnityEngine; + +namespace Rokoko.CommandAPI +{ + public class RecordingRequestData + { + [SerializeField] private string filename = ""; // actor clip name or filename for recording + [SerializeField] private string time = "00:00:00:00"; // recording start/stop time in SMPTE format + [SerializeField] private float frame_rate = 30.0f; + [SerializeField] private bool back_to_live = false; + + // public members + + public string Filename { get => filename; set => filename = value; } + public string Time { get => time; set => time = value; } + public float FrameRate { get => frame_rate; set => frame_rate = value; } + public bool BackToLive { get => back_to_live; set => back_to_live = value; } + + + public override string ToString() + { + return $"{Filename}, {Time}, {FrameRate}, {BackToLive}"; + } + + public string ToJson() + { + return JsonUtility.ToJson(this); + } + } +} \ No newline at end of file diff --git a/Assets/External/Rokoko/Scripts/Core/CommandAPI/RecordingRequestData.cs.meta b/Assets/External/Rokoko/Scripts/Core/CommandAPI/RecordingRequestData.cs.meta new file mode 100644 index 00000000..7d4afee2 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Core/CommandAPI/RecordingRequestData.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 8920424d8d5d2df4d93ee8ec0078a52b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Core/CommandAPI/RecordingRequestData.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Core/CommandAPI/RequestData.cs b/Assets/External/Rokoko/Scripts/Core/CommandAPI/RequestData.cs new file mode 100644 index 00000000..dc95ce51 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Core/CommandAPI/RequestData.cs @@ -0,0 +1,21 @@ +using UnityEngine; + +namespace Rokoko.CommandAPI +{ + public class RequestData + { + public string smartsuit = ""; + public float countdown_delay = 4; + public string filename = ""; + + public override string ToString() + { + return smartsuit + "," + countdown_delay + ", " + filename; + } + + public string ToJson() + { + return JsonUtility.ToJson(this); + } + } +} \ No newline at end of file diff --git a/Assets/External/Rokoko/Scripts/Core/CommandAPI/RequestData.cs.meta b/Assets/External/Rokoko/Scripts/Core/CommandAPI/RequestData.cs.meta new file mode 100644 index 00000000..e7f9dd81 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Core/CommandAPI/RequestData.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: d5ec1713e30442a19275b49b0572d01b +timeCreated: 1552057825 +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Core/CommandAPI/RequestData.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Core/CommandAPI/ResetActorRequestData.cs b/Assets/External/Rokoko/Scripts/Core/CommandAPI/ResetActorRequestData.cs new file mode 100644 index 00000000..b137ad2d --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Core/CommandAPI/ResetActorRequestData.cs @@ -0,0 +1,21 @@ +using UnityEngine; + +namespace Rokoko.CommandAPI +{ + public class ResetActorRequestData + { + [SerializeField] private string device_id = ""; + + public string DeviceId { get => device_id; set => device_id = value; } + + public override string ToString() + { + return DeviceId; + } + + public string ToJson() + { + return JsonUtility.ToJson(this); + } + } +} \ No newline at end of file diff --git a/Assets/External/Rokoko/Scripts/Core/CommandAPI/ResetActorRequestData.cs.meta b/Assets/External/Rokoko/Scripts/Core/CommandAPI/ResetActorRequestData.cs.meta new file mode 100644 index 00000000..42a735f8 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Core/CommandAPI/ResetActorRequestData.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: aaa297b495b9e8542b01ab24f0359765 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Core/CommandAPI/ResetActorRequestData.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Core/CommandAPI/StudioCommandAPI.cs b/Assets/External/Rokoko/Scripts/Core/CommandAPI/StudioCommandAPI.cs new file mode 100644 index 00000000..70948e7e --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Core/CommandAPI/StudioCommandAPI.cs @@ -0,0 +1,188 @@ +using UnityEngine; +using UnityEngine.UI; + +namespace Rokoko.CommandAPI +{ + public class StudioCommandAPI : StudioCommandAPIBase + { + [Header("Show CommandAPI response (Optional)")] + [SerializeField] private Text responseText = null; + + [Header("The IP address of Studio. Leave default for same machine")] + public string ipAddress = "127.0.0.1"; + + [Header("Common Parameters")] + [Tooltip("The actor name or hardware device id in the scene")] + [SerializeField] public string deviceId; + + [Header("Calibration Parameters")] + [Tooltip("The calibration countdown delay")] + [SerializeField] public int countDownDelay = 3; + + [Tooltip("The calibration skip suit")] + [SerializeField] public bool calibrationSkipSuit = false; + + [Tooltip("The calibration skip gloves")] + [SerializeField] public bool calibrationSkipGloves = false; + + [Header("Recording Parameters")] + [Tooltip("Recording Clip Name")] + [SerializeField] public string clipName = "NewClip"; + + [Tooltip("Recording Start / Stop Time (SMPTE)")] + [SerializeField] public string recordingTime = "00:00:00:00"; + + [Tooltip("Return To Live Mode When Recording Is Done")] + [SerializeField] public bool backToLive = false; + + [Header("Tracker Parameters")] + [SerializeField] public string BoneAttached = ""; + [SerializeField] public float TrackerTimeout = 2f; + [SerializeField] public bool IsQueryOnly = false; + + [SerializeField] public Transform TrackerTransform; + + [Header("Playback Parameters")] + [SerializeField] public bool IsPlaying = true; + + [Header("Livestream Parameters")] + [SerializeField] public bool IsStreaming = true; + + [Header("Info Parameters")] + [SerializeField] public bool RequestDevicesInfo = true; + [SerializeField] public bool RequestClipsInfo = true; + [SerializeField] public bool RequestActorsInfo = true; + [SerializeField] public bool RequestCharactersInfo = true; + + protected override string IP => ipAddress; + protected override RequestData GetRequestData() => new RequestData(); + protected override ResetActorRequestData GetResetActorRequestData() + { + var data = new ResetActorRequestData() {DeviceId = deviceId}; + if (debug) + { + Debug.Log(data.ToJson()); + } + return data; + } + + protected override CalibrateRequestData GetCalibrateRequestData() + { + var data = new CalibrateRequestData() + { + DeviceId = deviceId, + CountDownDelay = countDownDelay, + SkipSuit = calibrationSkipSuit, + SkipGloves = calibrationSkipGloves + }; + if (debug) + { + Debug.Log(data.ToJson()); + } + return data; + } + + protected override RecordingRequestData GetRecordingRequestData() + { + var data = new RecordingRequestData() + { + Filename = clipName, + Time = recordingTime, + BackToLive = backToLive + }; + if (debug) + { + Debug.Log(data.ToJson()); + } + return data; + } + + protected override TrackerRequestData GetTrackerRequestData() + { + var data = new TrackerRequestData() + { + DeviceId = deviceId, + BoneAttached = BoneAttached, + Position = TrackerTransform?.position ?? Vector3.zero, + Rotation = TrackerTransform?.rotation ?? Quaternion.identity, + Timeout = TrackerTimeout, + IsQueryOnly = IsQueryOnly + }; + if (debug) + { + Debug.Log(data.ToJson()); + } + return data; + } + + protected override PlaybackRequestData GetPlaybackRequestData() + { + var data = new PlaybackRequestData() + { + IsPlaying = IsPlaying, + CurrentTime = 0.0, + PlaybackSpeed = 1.0f, + ChangeFlag = CommandAPIPlaybackChange.IsPlaying + }; + if (debug) + { + Debug.Log(data.ToJson()); + } + return data; + } + + protected override LivestreamRequestData GetLivestreamRequestData() + { + var data = new LivestreamRequestData() + { + Enabled = IsStreaming + }; + if (debug) + { + Debug.Log(data.ToJson()); + } + return data; + } + + protected override InfoRequestData GetInfoRequestData() + { + var data = new InfoRequestData() + { + DoDevicesInfo = RequestDevicesInfo, + DoClipsInfo = RequestClipsInfo, + DoActorsInfo = RequestActorsInfo, + DoCharactersInfo = RequestCharactersInfo + }; + if (debug) + { + Debug.Log(data.ToJson()); + } + return data; + } + + private void Start() + { + SetStatusText(""); + } + + protected override void OnCommmandResponse(ResponseMessage response) + { + base.OnCommmandResponse(response); + SetStatusText(response.description); + } + + protected override void OnCommmandError(string error) + { + base.OnCommmandError(error); + SetStatusText($"{error}\nPlease make sure Rokoko Studio is running and Command API is enabled (Menu->Settings->Command API->Enabled).\nCheck also the receiving port and API key in both Rokoko Studio and Unity plugin."); + } + + private void SetStatusText(string text) + { + if (responseText == null) return; + responseText.transform.parent.gameObject.SetActive(!string.IsNullOrEmpty(text)); + responseText.text = text; + LayoutRebuilder.ForceRebuildLayoutImmediate(responseText.transform.parent as RectTransform); + } + } +} \ No newline at end of file diff --git a/Assets/External/Rokoko/Scripts/Core/CommandAPI/StudioCommandAPI.cs.meta b/Assets/External/Rokoko/Scripts/Core/CommandAPI/StudioCommandAPI.cs.meta new file mode 100644 index 00000000..63a3ae19 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Core/CommandAPI/StudioCommandAPI.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: f38fe44d6bfb49dbabd93aea7da287ed +timeCreated: 1565078235 +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Core/CommandAPI/StudioCommandAPI.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Core/CommandAPI/StudioCommandAPIBase.cs b/Assets/External/Rokoko/Scripts/Core/CommandAPI/StudioCommandAPIBase.cs new file mode 100644 index 00000000..5c2947e0 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Core/CommandAPI/StudioCommandAPIBase.cs @@ -0,0 +1,151 @@ +using System.Collections; +using System.Collections.Generic; +using System.Threading.Tasks; +using UnityEngine; +using UnityEngine.Networking; + +namespace Rokoko.CommandAPI +{ + /// + /// This component provides access to Studio's Command API. + /// + public abstract class StudioCommandAPIBase : MonoBehaviour + { + [Tooltip("The api key as defined in Studio. Settings->Command API->API key")] + public string apiKey; + + [Tooltip("The port number as defined in Studio. Settings->Command API->Listen port")] + public int port; + + [Header("Log extra info")] + public bool debug; + + protected abstract string IP { get; } + + public bool IsTrackerRequestInProgress = false; + + // legacy only commands + [ContextMenu("Unicast")] + public async void Unicast() => + await SendRequest("unicast", GetRequestData().ToJson()); + + [ContextMenu("Broadcast")] + public async void Broadcast() => + await SendRequest("broadcast", GetRequestData().ToJson()); + + [ContextMenu("Restart Smartsuit")] + public async void RestartSmartsuit() + => await SendRequest("Restart", GetRequestData().ToJson()); + + // commands that are compatible with Studio and Studio Legacy + + [ContextMenu("Start Recording")] + public async void StartRecording() => + await SendRequest("recording/start", GetRecordingRequestData().ToJson()); + + [ContextMenu("Stop Recording")] + public async void StopRecording() => + await SendRequest("recording/stop", GetRecordingRequestData().ToJson()); + + [ContextMenu("Calibrate all")] + public async void CalibrateAll() => + await SendRequest("calibrate", GetCalibrateRequestData().ToJson()); + + [ContextMenu("Reset Actor")] + public async void ResetActor() + => await SendRequest("resetactor", GetResetActorRequestData().ToJson()); + + // commands which are not presented in Studio Legacy + + [ContextMenu("Tracker")] + public async void Tracker() => + await SendRequest("tracker", GetTrackerRequestData().ToJson()); + + [ContextMenu("Info")] + public async void Info() => + await SendRequest("info", GetInfoRequestData().ToJson()); + + [ContextMenu("Playback")] + public async void PlaybackPlay() => + await SendRequest("playback", GetPlaybackRequestData().ToJson()); + + [ContextMenu("Livestream")] + public async void ToggleLiveStream() => + await SendRequest("livestream", GetLivestreamRequestData().ToJson()); + + + private Task SendRequest(string endpoint, string json) + { + var tcs = new TaskCompletionSource(); + StartCoroutine(SendRequestEnum(endpoint, json, tcs)); + return tcs.Task; + } + + protected abstract RequestData GetRequestData(); + protected abstract CalibrateRequestData GetCalibrateRequestData(); + protected abstract ResetActorRequestData GetResetActorRequestData(); + protected abstract RecordingRequestData GetRecordingRequestData(); + protected abstract TrackerRequestData GetTrackerRequestData(); + protected abstract PlaybackRequestData GetPlaybackRequestData(); + protected abstract LivestreamRequestData GetLivestreamRequestData(); + protected abstract InfoRequestData GetInfoRequestData(); + + private IEnumerator SendRequestEnum(string endpoint, string json, TaskCompletionSource task) + { + IsTrackerRequestInProgress = true; + + string url = $"http://{IP}:{port}/v1/{apiKey}/{endpoint}"; + if (debug) + { + Debug.Log("Sending request: " + url, this.transform); + Debug.Log("Sending data: " + json, this.transform); + } + + // convert json string to byte + byte[] formData = System.Text.Encoding.UTF8.GetBytes(json); + UnityWebRequest request = new UnityWebRequest(url, UnityWebRequest.kHttpVerbPOST); + UploadHandlerRaw uploadHandler = new UploadHandlerRaw(formData); + request.uploadHandler = uploadHandler; + request.downloadHandler = new DownloadHandlerBuffer(); + request.SetRequestHeader("Content-Type", "application/json"); + yield return request.SendWebRequest(); + + string body = request.downloadHandler.text; + if (request.result != UnityWebRequest.Result.ConnectionError) + { + if (debug) + Debug.Log($"Response: {request.responseCode}: {body}", this.transform); + OnCommmandResponse(JsonUtility.FromJson(body)); + } + else + { + if (debug) + Debug.LogWarning($"There was an error sending request: {request.error}\n{body}", this.transform); + OnCommmandError(request.error); + } + task.SetResult(body); + request.Dispose(); + uploadHandler.Dispose(); + IsTrackerRequestInProgress = false; + } + + protected virtual void OnCommmandResponse(ResponseMessage response) + { + + } + + protected virtual void OnCommmandError(string error) + { + + } + } + + [System.Serializable] + public class ResponseMessage + { + public string description; + public string response_code; + public long startTime; + public dynamic[] parameters; + } +} \ No newline at end of file diff --git a/Assets/External/Rokoko/Scripts/Core/CommandAPI/StudioCommandAPIBase.cs.meta b/Assets/External/Rokoko/Scripts/Core/CommandAPI/StudioCommandAPIBase.cs.meta new file mode 100644 index 00000000..c31bd4b5 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Core/CommandAPI/StudioCommandAPIBase.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 23be0de9580d445683a1b786461b328d +timeCreated: 1565078385 +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Core/CommandAPI/StudioCommandAPIBase.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Core/CommandAPI/TrackerRequestData.cs b/Assets/External/Rokoko/Scripts/Core/CommandAPI/TrackerRequestData.cs new file mode 100644 index 00000000..4411f6c8 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Core/CommandAPI/TrackerRequestData.cs @@ -0,0 +1,75 @@ +using UnityEngine; + +namespace Rokoko.CommandAPI +{ + public class TrackerRequestData + { + // the struct is used to serialize attributes the same way as System.Numberics do + [System.Serializable] + private struct TrackerVector3 + { + [SerializeField] public float X; + [SerializeField] public float Y; + [SerializeField] public float Z; + + public TrackerVector3(float x, float y, float z) + { + X = x; + Y = y; + Z = z; + } + } + [System.Serializable] + private struct TrackerQuaternion + { + [SerializeField] public float X; + [SerializeField] public float Y; + [SerializeField] public float Z; + [SerializeField] public float W; + [SerializeField] public bool IsIdentity; + + public TrackerQuaternion(float x, float y, float z, float w) + { + X = x; + Y = y; + Z = z; + W = w; + IsIdentity = false; + } + } + + // tracker attributes + + [SerializeField] private string device_id = ""; + [SerializeField] private string bone_attached = ""; + [SerializeField] private TrackerVector3 position; + [SerializeField] private TrackerQuaternion rotation; + [SerializeField] private float timeout = 2f; + [SerializeField] private bool is_query_only = false; + + + // public members + + public string DeviceId { get => device_id; set => device_id = value; } + public string BoneAttached { get => bone_attached; set => bone_attached = value; } + public Vector3 Position { + get => new Vector3(position.X, position.Y, position.Z); + set => position = new TrackerVector3(value.x, value.y, value.z); } + public Quaternion Rotation { + get => new Quaternion(rotation.X, rotation.Y, rotation.Z, rotation.W); + set => rotation = new TrackerQuaternion(value.x, value.y, value.z, value.w); } + public float Timeout { get => timeout; set => timeout = value; } + public bool IsQueryOnly { get => is_query_only; set => is_query_only = value; } + + + public override string ToString() + { + return $"{DeviceId}, {BoneAttached}, {Position}, {Rotation}, {Timeout}"; + } + + public string ToJson() + { + return JsonUtility.ToJson(this); + } + } +} \ No newline at end of file diff --git a/Assets/External/Rokoko/Scripts/Core/CommandAPI/TrackerRequestData.cs.meta b/Assets/External/Rokoko/Scripts/Core/CommandAPI/TrackerRequestData.cs.meta new file mode 100644 index 00000000..98298b81 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Core/CommandAPI/TrackerRequestData.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 4ba10db8e030fa44da4ccae2d8caea44 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Core/CommandAPI/TrackerRequestData.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Core/JsonLiveSerializerV3.cs b/Assets/External/Rokoko/Scripts/Core/JsonLiveSerializerV3.cs new file mode 100644 index 00000000..f6be07d9 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Core/JsonLiveSerializerV3.cs @@ -0,0 +1,266 @@ +using System.Collections.Generic; +using UnityEngine; + +namespace Rokoko.Core +{ + #region Data Structs + + [System.Serializable] + public class LiveFrame_v4 + { + // Header + public float version; + // Target fps + public float fps; + public SceneFrame scene; + } + + [System.Serializable] + public struct SceneFrame + { + public float timestamp; + public ActorFrame[] actors; + public CharacterFrame[] characters; + public PropFrame[] props; + } + + [System.Serializable] + public struct ActorFrame + { + public string name; + public int[] color; + public Meta meta; + public Dimensions dimensions; + + public BodyFrame body; + public FaceFrame face; + + [System.Serializable] + public struct Meta + { + public bool hasGloves; + public bool hasLeftGlove; + public bool hasRightGlove; + public bool hasBody; + public bool hasFace; + } + + [System.Serializable] + public struct Dimensions + { + public float totalHeight; + public float hipHeight; + } + } + + [System.Serializable] + public class CharacterFrame + { + public string name; + public CharacterJointFrame[] joints; + public BlendshapesFrame blendshapes; + } + + [System.Serializable] + public class BlendshapesFrame + { + public string[] names; + public float[] values; + } + + [System.Serializable] + public class PropFrame + { + public string name; + public int[] color; + public int type; + public Vector3Frame position; + public Vector4Frame rotation; + } + + + [System.Serializable] + public class BodyFrame + { + public ActorJointFrame hip; + public ActorJointFrame spine; + public ActorJointFrame chest; + public ActorJointFrame neck; + public ActorJointFrame head; + public ActorJointFrame leftShoulder; + public ActorJointFrame leftUpperArm; + public ActorJointFrame leftLowerArm; + public ActorJointFrame leftHand; + public ActorJointFrame rightShoulder; + public ActorJointFrame rightUpperArm; + public ActorJointFrame rightLowerArm; + public ActorJointFrame rightHand; + + public ActorJointFrame leftUpLeg; + public ActorJointFrame leftLeg; + public ActorJointFrame leftFoot; + public ActorJointFrame leftToe; + public ActorJointFrame leftToeEnd; + + public ActorJointFrame rightUpLeg; + public ActorJointFrame rightLeg; + public ActorJointFrame rightFoot; + public ActorJointFrame rightToe; + public ActorJointFrame rightToeEnd; + + + public ActorJointFrame leftThumbProximal; + public ActorJointFrame leftThumbMedial; + public ActorJointFrame leftThumbDistal; + public ActorJointFrame leftThumbTip; + + public ActorJointFrame leftIndexProximal; + public ActorJointFrame leftIndexMedial; + public ActorJointFrame leftIndexDistal; + public ActorJointFrame leftIndexTip; + + public ActorJointFrame leftMiddleProximal; + public ActorJointFrame leftMiddleMedial; + public ActorJointFrame leftMiddleDistal; + public ActorJointFrame leftMiddleTip; + + public ActorJointFrame leftRingProximal; + public ActorJointFrame leftRingMedial; + public ActorJointFrame leftRingDistal; + public ActorJointFrame leftRingTip; + + public ActorJointFrame leftLittleProximal; + public ActorJointFrame leftLittleMedial; + public ActorJointFrame leftLittleDistal; + public ActorJointFrame leftLittleTip; + + + public ActorJointFrame rightThumbProximal; + public ActorJointFrame rightThumbMedial; + public ActorJointFrame rightThumbDistal; + public ActorJointFrame rightThumbTip; + + public ActorJointFrame rightIndexProximal; + public ActorJointFrame rightIndexMedial; + public ActorJointFrame rightIndexDistal; + public ActorJointFrame rightIndexTip; + + public ActorJointFrame rightMiddleProximal; + public ActorJointFrame rightMiddleMedial; + public ActorJointFrame rightMiddleDistal; + public ActorJointFrame rightMiddleTip; + public ActorJointFrame rightRingProximal; + public ActorJointFrame rightRingMedial; + public ActorJointFrame rightRingDistal; + public ActorJointFrame rightRingTip; + + public ActorJointFrame rightLittleProximal; + public ActorJointFrame rightLittleMedial; + public ActorJointFrame rightLittleDistal; + public ActorJointFrame rightLittleTip; + } + + [System.Serializable] + public class FaceFrame + { + public string faceId; + public float eyeBlinkLeft; + public float eyeLookDownLeft; + public float eyeLookInLeft; + public float eyeLookOutLeft; + public float eyeLookUpLeft; + public float eyeSquintLeft; + public float eyeWideLeft; + public float eyeBlinkRight; + public float eyeLookDownRight; + public float eyeLookInRight; + public float eyeLookOutRight; + public float eyeLookUpRight; + public float eyeSquintRight; + public float eyeWideRight; + public float jawForward; + public float jawLeft; + public float jawRight; + public float jawOpen; + public float mouthClose; + public float mouthFunnel; + public float mouthPucker; + public float mouthLeft; + public float mouthRight; + public float mouthSmileLeft; + public float mouthSmileRight; + public float mouthFrownLeft; + public float mouthFrownRight; + public float mouthDimpleLeft; + public float mouthDimpleRight; + public float mouthStretchLeft; + public float mouthStretchRight; + public float mouthRollLower; + public float mouthRollUpper; + public float mouthShrugLower; + public float mouthShrugUpper; + public float mouthPressLeft; + public float mouthPressRight; + public float mouthLowerDownLeft; + public float mouthLowerDownRight; + public float mouthUpperUpLeft; + public float mouthUpperUpRight; + public float browDownLeft; + public float browDownRight; + public float browInnerUp; + public float browOuterUpLeft; + public float browOuterUpRight; + public float cheekPuff; + public float cheekSquintLeft; + public float cheekSquintRight; + public float noseSneerLeft; + public float noseSneerRight; + public float tongueOut; + } + + [System.Serializable] + public struct Vector3Frame + { + public float x; + public float y; + public float z; + + public override string ToString() => $"VF3: {x}, {y}, {z} :"; + } + + [System.Serializable] + public struct Vector4Frame + { + public float x; + public float y; + public float z; + public float w; + + public override string ToString() => $"VF4: {x}, {y}, {z}, {w} :"; + } + + [System.Serializable] + public struct ActorJointFrame + { + public Vector3Frame position; + public Vector4Frame rotation; + } + + [System.Serializable] + public struct CharacterJointFrame + { + public string name; + public int parent; //!< parent index in a chracter frame joints array (-1 for the root) + public Vector3Frame position; + public Vector4Frame rotation; + } + + #endregion + + public enum PropType + { + NORMAL = 0, + CAMERA = 1, + STICK = 2 + } +} \ No newline at end of file diff --git a/Assets/External/Rokoko/Scripts/Core/JsonLiveSerializerV3.cs.meta b/Assets/External/Rokoko/Scripts/Core/JsonLiveSerializerV3.cs.meta new file mode 100644 index 00000000..dd4b558f --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Core/JsonLiveSerializerV3.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 61943ed9a14442b4aa24885f7e8a735e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Core/JsonLiveSerializerV3.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Core/LZ4Wrapper.cs b/Assets/External/Rokoko/Scripts/Core/LZ4Wrapper.cs new file mode 100644 index 00000000..e2ea8e75 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Core/LZ4Wrapper.cs @@ -0,0 +1,79 @@ +using System; +using System.Runtime.InteropServices; + +namespace Rokoko.Core +{ + public class LZ4Wrapper + { + public static class LZ4_API + { +#if (UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR + private const string LUADLL = "__Internal"; +#else + private const string LUADLL = "lz4"; +#endif + + [DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)] + public static extern int Unity_LZ4_compress(IntPtr src, int srcSize, IntPtr dst, int dstCapacity, int compressionLevel); + + [DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)] + public static extern int Unity_LZ4_compressSize(int srcSize, int compressionLevel); + + [DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)] + public static extern int Unity_LZ4_uncompressSize(IntPtr srcBuffer, int srcSize); + + [DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)] + public static extern int Unity_LZ4_decompress(IntPtr src, int srcSize, IntPtr dst, int dstCapacity); + } + + public static byte[] Compress(byte[] input, int compressionLevel = 3) + { + byte[] result = null; + + if (input != null && input.Length > 0) + { + int maxSize = LZ4_API.Unity_LZ4_compressSize(input.Length, compressionLevel); + if (maxSize > 0) + { + var buffer = new byte[maxSize]; + var srcHandle = GCHandle.Alloc(input, GCHandleType.Pinned); + var dstHandle = GCHandle.Alloc(buffer, GCHandleType.Pinned); + var actualSize = LZ4_API.Unity_LZ4_compress(srcHandle.AddrOfPinnedObject(), input.Length, dstHandle.AddrOfPinnedObject(), maxSize, compressionLevel); + + if (actualSize > 0) + { + result = new byte[actualSize]; + Array.Copy(buffer, result, actualSize); + } + + srcHandle.Free(); + dstHandle.Free(); + } + } + + return result; + } + + public static byte[] Decompress(byte[] input) + { + byte[] result = null; + + if (input != null && input.Length > 0) + { + var srcHandle = GCHandle.Alloc(input, GCHandleType.Pinned); + var uncompressSize = LZ4_API.Unity_LZ4_uncompressSize(srcHandle.AddrOfPinnedObject(), input.Length); + result = new byte[uncompressSize]; + var dstHandle = GCHandle.Alloc(result, GCHandleType.Pinned); + if (LZ4_API.Unity_LZ4_decompress(srcHandle.AddrOfPinnedObject(), input.Length, dstHandle.AddrOfPinnedObject(), result.Length) != 0) + { + result = null; + } + + srcHandle.Free(); + dstHandle.Free(); + } + + return result; + } + } +} \ No newline at end of file diff --git a/Assets/External/Rokoko/Scripts/Core/LZ4Wrapper.cs.meta b/Assets/External/Rokoko/Scripts/Core/LZ4Wrapper.cs.meta new file mode 100644 index 00000000..03ba1d95 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Core/LZ4Wrapper.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 8b437a01c2f9fde489b7a18b6bac93d7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Core/LZ4Wrapper.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Core/StudioReceiver.cs b/Assets/External/Rokoko/Scripts/Core/StudioReceiver.cs new file mode 100644 index 00000000..f0359119 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Core/StudioReceiver.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Net; +using UnityEngine; + +namespace Rokoko.Core +{ + public class StudioReceiver : UDPReceiver + { + public event EventHandler onStudioDataReceived; + public bool useLZ4Compression = true; + public bool verbose = false; + + protected override void OnDataReceived(byte[] data, IPEndPoint endPoint) + { + LiveFrame_v4 liveFrame_V4 = null; + try + { + base.OnDataReceived(data, endPoint); + byte[] uncompressed; + + if (useLZ4Compression) + { + // Decompress LZ4 + uncompressed = LZ4Wrapper.Decompress(data); + if (uncompressed == null || uncompressed.Length == 0) + { + Debug.LogError("Incoming data are in bad format. Please ensure you are using JSON v3 as forward data format"); + return; + } + } + else + { + uncompressed = data; + } + + // Convert from Json + string text = System.Text.Encoding.UTF8.GetString(uncompressed); + if (verbose) + { + Debug.Log(text); + } + liveFrame_V4 = JsonUtility.FromJson(text); + + if (liveFrame_V4 == null) + { + Debug.LogError("Incoming data are in bad format. Please ensure you are using JSON v3 as forward data format"); + return; + } + + if (verbose) + { + int numberOfActors = (liveFrame_V4.scene.actors != null) ? liveFrame_V4.scene.actors.Length : 0; + int numberOfChars = (liveFrame_V4.scene.characters != null) ? liveFrame_V4.scene.characters.Length : 0; + + if (numberOfActors == 0 && numberOfChars == 0) + { + Debug.LogError("Incoming data has no actors and no characters in the stream"); + } + } + } + catch { } + + onStudioDataReceived?.Invoke(this, liveFrame_V4); + } + } +} \ No newline at end of file diff --git a/Assets/External/Rokoko/Scripts/Core/StudioReceiver.cs.meta b/Assets/External/Rokoko/Scripts/Core/StudioReceiver.cs.meta new file mode 100644 index 00000000..eb5d098c --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Core/StudioReceiver.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 8cb1306ef28465d49b3d63bc97885931 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Core/StudioReceiver.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Core/UDPReceiver.cs b/Assets/External/Rokoko/Scripts/Core/UDPReceiver.cs new file mode 100644 index 00000000..ec8169f0 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Core/UDPReceiver.cs @@ -0,0 +1,109 @@ +using System.Net; +using System.Net.Sockets; +using System.Threading; +using UnityEngine; + +namespace Rokoko.Core +{ + public class UDPReceiver + { + public int sendPortNumber = 14043; + public int receivePortNumber = 14043; + public int bufferSize = 65000; + + private UdpClient client; + private Thread thread; + + public virtual void Initialize() + { + try + { + client = new UdpClient(receivePortNumber); + client.Client.SendBufferSize = bufferSize; + } + catch (SocketException) + { + Debug.LogError($"Seem like port:{receivePortNumber} is already in use. Is plugin running already in other application?"); + } + catch(System.Exception ex) + { + throw ex; + } + } + + public virtual void StartListening() + { + if (client == null) + { + Debug.LogError("UDPReceiver - Client isn't initialized."); + return; + } + + if (thread != null) + { + Debug.LogWarning("UDPReceiver - Cannot start listening. Thread is already listening"); + return; + } + + StartListeningThread(); + } + + public virtual void StopListening() + { + thread?.Abort(); + client?.Close(); + } + + public virtual void Dispose() + { + StopListening(); + client?.Dispose(); + client = null; + } + + public void Send(string ipAddress, byte[] data) + { + Send(ipAddress, data, sendPortNumber); + } + + public void Send(string ipAddress, byte[] data, int portNumber) + { + client?.Send(data, data.Length, new IPEndPoint(IPAddress.Parse(ipAddress), portNumber)); + } + + public void Send(IPEndPoint endPoint, byte[] data) + { + client?.Send(data, data.Length, endPoint); + } + + public bool IsListening() => thread != null; + + protected virtual void OnDataReceived(byte[] data, IPEndPoint endPoint) { } + + private void StartListeningThread() + { + thread = new Thread(ListenToUDP); + thread.IsBackground = true; + thread.Start(); + } + + private void ListenToUDP() + { + while (client != null) + { + try + { + IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, receivePortNumber); + byte[] data = client.Receive(ref endpoint); + OnDataReceived(data, endpoint); + } + catch (ThreadAbortException) { } + catch (SocketException) { } + catch (System.Exception ex) + { + Debug.Log(ex.Message); + } + } + } + } +} diff --git a/Assets/External/Rokoko/Scripts/Core/UDPReceiver.cs.meta b/Assets/External/Rokoko/Scripts/Core/UDPReceiver.cs.meta new file mode 100644 index 00000000..35e3748b --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Core/UDPReceiver.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 9af01aaa3a63e7a4499c28b22dd1b20d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Core/UDPReceiver.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Mono.meta b/Assets/External/Rokoko/Scripts/Mono.meta new file mode 100644 index 00000000..6801a5a6 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9fd28f925f7e38846913c7631653e97a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/Scripts/Mono/Inputs.meta b/Assets/External/Rokoko/Scripts/Mono/Inputs.meta new file mode 100644 index 00000000..2fc218d1 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/Inputs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0b9e800521674004693e0a38816ed885 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/Scripts/Mono/Inputs/Actor.cs b/Assets/External/Rokoko/Scripts/Mono/Inputs/Actor.cs new file mode 100644 index 00000000..28179da4 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/Inputs/Actor.cs @@ -0,0 +1,510 @@ +using Rokoko.Core; +using Rokoko.Helper; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; + +namespace Rokoko.Inputs +{ + public class Actor : MonoBehaviour + { + [System.Serializable] + public enum BoneMappingEnum + { + Animator, + Custom + } + + [System.Serializable] + public enum RotationSpace + { + Offset, + World, + Self + } + + [System.Serializable] + public enum PoseApplicationScope + { + All, // Apply to all bones + HandsAndFingers, // Apply to hands (wrists) and all fingers + FingersOnly // Apply to fingers only + } + + [HideInInspector] public string profileName = "DemoProfile"; + + [HideInInspector] public BoneMappingEnum boneMapping; + [HideInInspector] public Animator animator; + [HideInInspector] public HumanBoneMapping customBoneMapping; + + [Header("Convert Space")] + [Tooltip("Convert Studio data to Unity position space")] + public Space positionSpace = Space.Self; + [Tooltip("Convert Studio data to Unity rotation space")] + public RotationSpace rotationSpace = RotationSpace.Offset; + + [Space(10)] + [Header("Pose Application")] + [Tooltip("Select which bones to apply motion capture data to")] + public PoseApplicationScope poseScope = PoseApplicationScope.All; + + [Space(10)] + [Tooltip("Calculate Model's height comparing to Actor's and position the Hips accordingly.\nGreat tool to align with the floor")] + public bool adjustHipHeightBasedOnStudioActor = false; + + [Space(10)] + [Header("Thumb Offset")] + [Tooltip("Apply additional rotation offset to thumb proximal bones after all updates")] + public bool applyThumbOffset = true; + [Tooltip("Additional rotation offset for left thumb proximal bone (in degrees)")] + public Vector3 leftThumbProximalOffset = new Vector3(0, -30, -30); + [Tooltip("Additional rotation offset for right thumb proximal bone (in degrees)")] + public Vector3 rightThumbProximalOffset = new Vector3(0, 30, 30); + + [HideInInspector] public Face face = null; + + [Header("Log extra info")] + public bool debug = false; + + [HideInInspector] + public HumanTPoseDictionary characterTPose = new HumanTPoseDictionary(); + + [HideInInspector] + public bool isValidTpose = false; + + protected Dictionary animatorHumanBones = new Dictionary(); + private Dictionary offsets = new Dictionary(); + + private float hipHeight = 0; + + #region Initialize + + protected virtual void Awake() + { + if(animator == null) + { + Debug.LogError($"Actor {this.name} isn't configured", this.transform); + return; + } + + // OptitrackSkeletonAnimator_Mingle 컴포넌트에서 스켈레톤 이름 가져오기 시도 + var optitrackComponent = this.GetComponent("OptitrackSkeletonAnimator_Mingle"); + if (optitrackComponent != null) + { + // Reflection을 사용하여 SkeletonAssetName 속성 가져오기 + var skeletonNameField = optitrackComponent.GetType().GetField("SkeletonAssetName"); + if (skeletonNameField != null && skeletonNameField.GetValue(optitrackComponent) is string skeletonName) + { + profileName = skeletonName; + } + } + + if (!animator.isHuman) + { + Debug.LogError("Model is not marked as Humanoid. Please go in model inspector, under Rig tab and select AnimationType as Humanoid.", this.transform); + return; + } + + InitializeAnimatorHumanBones(); + InitializeBoneOffsets(); + + // Get the Hip height independent of parent transformations + hipHeight = GetBone(HumanBodyBones.Hips).parent.InverseTransformVector(GetBone(HumanBodyBones.Hips).localPosition).y; + hipHeight = Mathf.Abs(hipHeight); + + if (characterTPose.Count == 0) + Debug.LogError($"Character {this.name} is not set to TPose. Please ensure you assign a valid TPose in Editor before playing", this.transform); + } + + /// + /// Register Actor override in StudioManager. + /// + private void Start() + { + if (animator != null && !animator.isHuman) return; + + if (!string.IsNullOrEmpty(profileName)) + StudioManager.AddActorOverride(this); + } + + [ContextMenu("CalcualteTPose")] + public void CalculateTPose() + { + InitializeAnimatorHumanBones(); + InitializeCharacterTPose(); + + isValidTpose = IsValidTPose(); + } + + private void InitializeBonesIfNeeded() + { + if (boneMapping == BoneMappingEnum.Animator && animatorHumanBones.Count == 0) + InitializeAnimatorHumanBones(); + } + + /// + /// Store Character's T Pose. + /// + protected void InitializeCharacterTPose() + { + characterTPose.Clear(); + foreach (HumanBodyBones bone in RokokoHelper.HumanBodyBonesArray) + { + if (bone == HumanBodyBones.LastBone) break; + Transform boneTransform = GetBone(bone); + + if (boneTransform == null) continue; + + characterTPose.Add(bone, boneTransform.rotation); + } + } + + /// + /// Calculate Character's offset based on its T Pose and Newton's T Pose. + /// + protected void InitializeBoneOffsets() + { + // Calculate offsets based on Smartsuit T pose + offsets = CalculateRotationOffsets(); + } + + /// + /// Cache the bone transforms from Animator. + /// + protected void InitializeAnimatorHumanBones() + { + if (boneMapping != BoneMappingEnum.Animator) return; + if (animator == null || !animator.isHuman) return; + animatorHumanBones.Clear(); + + foreach (HumanBodyBones bone in RokokoHelper.HumanBodyBonesArray) + { + if (bone == HumanBodyBones.LastBone) break; + animatorHumanBones.Add(bone, animator.GetBoneTransform(bone)); + } + } + + #endregion + + #region Public Methods + + /// + /// Update Skeleton and Face data based on ActorFrame. + /// + public virtual void UpdateActor(ActorFrame actorFrame) + { + if (animator == null || !animator.isHuman) return; + + profileName = actorFrame.name; + + bool updateBody = actorFrame.meta.hasBody || actorFrame.meta.hasGloves; + + // Update skeleton from data + if (updateBody) + UpdateSkeleton(actorFrame); + + // Update face from data + if (actorFrame.meta.hasFace) + face?.UpdateFace(actorFrame.face); + } + + /// + /// Create Idle/Default Actor. + /// + public virtual void CreateIdle(string actorName) + { + this.profileName = actorName; + } + + public float GetActorHeight() + { + InitializeBonesIfNeeded(); + + Transform head = GetBone(HumanBodyBones.Head); + Transform foot = GetBone(HumanBodyBones.LeftFoot); + if (head == null || foot == null) + return 1.8f; + + // Add space for head mesh + return Vector3.Distance(head.position, foot.position) + 0.25f; + } + + #endregion + + #region Internal Logic + + private bool IsValidTPose() + { + InitializeBonesIfNeeded(); + + Transform rightHand = GetBone(HumanBodyBones.RightHand); + Transform leftHand = GetBone(HumanBodyBones.LeftHand); + + Transform spine = GetBone(HumanBodyBones.Spine); + Transform chest = GetBone(HumanBodyBones.Chest); + + if(rightHand == null || leftHand == null || spine == null || chest == null) + { + Debug.LogError("Cant validate actor height. Bone is missing", this.transform); + return false; + } + + Vector3 armsDirection = rightHand.position - leftHand.position; + armsDirection.Normalize(); + + Vector3 spineDirection = chest.position - spine.position; + spineDirection.Normalize(); + + return Vector3.Dot(armsDirection, Vector3.right) > 0.99f && + Vector3.Dot(spineDirection, Vector3.up) > 0.99f; + } + + /// + /// Get Transform from a given HumanBodyBones. + /// + private Transform GetBone(HumanBodyBones bone) + { + switch (boneMapping) + { + case BoneMappingEnum.Animator: + return animatorHumanBones[bone]; + case BoneMappingEnum.Custom: + return customBoneMapping.customBodyBones[(int)bone]; + } + + return null; + } + + /// + /// Update Humanoid Skeleton based on BodyData. + /// + protected void UpdateSkeleton(ActorFrame actorFrame) + { + foreach (HumanBodyBones bone in RokokoHelper.HumanBodyBonesArray) + { + if (bone == HumanBodyBones.LastBone) break; + + // Skip bones that are not in the selected scope + if (!ShouldApplyToBone(bone)) + continue; + + ActorJointFrame? boneFrame = actorFrame.body.GetBoneFrame(bone); + if (boneFrame != null) + { + bool shouldUpdatePosition = bone == HumanBodyBones.Hips; + + Quaternion worldRotation = boneFrame.Value.rotation.ToQuaternion(); + Vector3 worldPosition = boneFrame.Value.position.ToVector3(); + + // Offset Hip bone + if (shouldUpdatePosition && adjustHipHeightBasedOnStudioActor) + worldPosition = new Vector3(worldPosition.x, worldPosition.y - (actorFrame.dimensions.hipHeight - hipHeight), worldPosition.z); + + UpdateBone(bone, worldPosition, worldRotation, shouldUpdatePosition, positionSpace, rotationSpace); + } + } + + // Apply thumb offsets after all bone updates are complete + if (applyThumbOffset) + { + ApplyThumbOffsets(); + } + } + + /// + /// Determine if a bone should be included based on the selected pose scope. + /// + private bool ShouldApplyToBone(HumanBodyBones bone) + { + switch (poseScope) + { + case PoseApplicationScope.All: + return true; + + case PoseApplicationScope.HandsAndFingers: + return IsHandOrFingerBone(bone); + + case PoseApplicationScope.FingersOnly: + return IsFingerBone(bone); + + default: + return true; + } + } + + /// + /// Check if the bone is a hand (wrist) or finger bone. + /// + private bool IsHandOrFingerBone(HumanBodyBones bone) + { + return bone == HumanBodyBones.LeftHand || bone == HumanBodyBones.RightHand || IsFingerBone(bone); + } + + /// + /// Check if the bone is a finger bone. + /// + private bool IsFingerBone(HumanBodyBones bone) + { + return bone == HumanBodyBones.LeftThumbProximal || bone == HumanBodyBones.LeftThumbIntermediate || bone == HumanBodyBones.LeftThumbDistal || + bone == HumanBodyBones.LeftIndexProximal || bone == HumanBodyBones.LeftIndexIntermediate || bone == HumanBodyBones.LeftIndexDistal || + bone == HumanBodyBones.LeftMiddleProximal || bone == HumanBodyBones.LeftMiddleIntermediate || bone == HumanBodyBones.LeftMiddleDistal || + bone == HumanBodyBones.LeftRingProximal || bone == HumanBodyBones.LeftRingIntermediate || bone == HumanBodyBones.LeftRingDistal || + bone == HumanBodyBones.LeftLittleProximal || bone == HumanBodyBones.LeftLittleIntermediate || bone == HumanBodyBones.LeftLittleDistal || + bone == HumanBodyBones.RightThumbProximal || bone == HumanBodyBones.RightThumbIntermediate || bone == HumanBodyBones.RightThumbDistal || + bone == HumanBodyBones.RightIndexProximal || bone == HumanBodyBones.RightIndexIntermediate || bone == HumanBodyBones.RightIndexDistal || + bone == HumanBodyBones.RightMiddleProximal || bone == HumanBodyBones.RightMiddleIntermediate || bone == HumanBodyBones.RightMiddleDistal || + bone == HumanBodyBones.RightRingProximal || bone == HumanBodyBones.RightRingIntermediate || bone == HumanBodyBones.RightRingDistal || + bone == HumanBodyBones.RightLittleProximal || bone == HumanBodyBones.RightLittleIntermediate || bone == HumanBodyBones.RightLittleDistal; + } + + /// + /// Apply additional rotation offsets to thumb proximal bones. + /// + protected void ApplyThumbOffsets() + { + // Apply left thumb offset + Transform leftThumbTransform = GetBone(HumanBodyBones.LeftThumbProximal); + if (leftThumbTransform != null) + { + Quaternion leftOffset = Quaternion.Euler(leftThumbProximalOffset); + leftThumbTransform.rotation *= leftOffset; + } + + // Apply right thumb offset + Transform rightThumbTransform = GetBone(HumanBodyBones.RightThumbProximal); + if (rightThumbTransform != null) + { + Quaternion rightOffset = Quaternion.Euler(rightThumbProximalOffset); + rightThumbTransform.rotation *= rightOffset; + } + } + + /// + /// Update Human bone. + /// + protected void UpdateBone(HumanBodyBones bone, Vector3 worldPosition, Quaternion worldRotation, bool updatePosition, Space positionSpace, RotationSpace rotationSpace) + { + // Find Humanoid bone + Transform boneTransform = GetBone(bone); + + // Check if bone is valid + if (boneTransform == null) + { + if (debug) + Debug.LogWarning($"Couldn't find Transform for bone:{bone} in {boneMapping}Mapping component", this.transform); + return; + } + + // Update position + if (updatePosition) + { + if (positionSpace == Space.World || boneTransform.parent == null) + { + boneTransform.position = worldPosition; + } + else + { + boneTransform.position = boneTransform.parent.rotation * worldPosition + boneTransform.parent.position; + } + } + + // Update Rotation + if (rotationSpace == RotationSpace.World) + { + boneTransform.rotation = worldRotation; + } + else if (rotationSpace == RotationSpace.Self) + { + if (transform.parent != null) + boneTransform.rotation = this.transform.parent.rotation * worldRotation; + else + boneTransform.rotation = worldRotation; + } + else + { + boneTransform.rotation = GetBone(HumanBodyBones.Hips).parent.rotation * worldRotation * offsets[bone]; + } + } + + #endregion + + /// + /// Get the rotational difference between 2 humanoid T poses. + /// + private Dictionary CalculateRotationOffsets() + { + Dictionary offsets = new Dictionary(); + foreach (HumanBodyBones bone in RokokoHelper.HumanBodyBonesArray) + { + if (!characterTPose.Contains(bone)) continue; + Quaternion rotation = Quaternion.Inverse(SmartsuitTPose[bone]) * characterTPose[bone]; + + offsets.Add(bone, rotation); + } + return offsets; + } + + /// + /// Get Smartsuit T pose data + /// + private static Dictionary SmartsuitTPose = new Dictionary() { + {HumanBodyBones.Hips, new Quaternion(0.000f, 0.000f, 0.000f, 1.000f)}, + {HumanBodyBones.LeftUpperLeg, new Quaternion(0.000f, 0.707f, 0.000f, 0.707f)}, + {HumanBodyBones.RightUpperLeg, new Quaternion(0.000f, -0.707f, 0.000f, 0.707f)}, + {HumanBodyBones.LeftLowerLeg, new Quaternion(0.000f, 0.707f, 0.000f, 0.707f)}, + {HumanBodyBones.RightLowerLeg, new Quaternion(0.000f, -0.707f, 0.000f, 0.707f)}, + {HumanBodyBones.LeftFoot, new Quaternion(0.000f, 0.707f, -0.707f, 0.000f)}, + {HumanBodyBones.RightFoot, new Quaternion(0.000f, -0.707f, 0.707f, 0.000f)}, + {HumanBodyBones.Spine, new Quaternion(0.000f, 0.000f, 1.000f, 0.000f)}, + {HumanBodyBones.Chest, new Quaternion(0.000f, 0.000f, 1.000f, 0.000f)}, + {HumanBodyBones.Neck, new Quaternion(0.000f, 0.000f, 1.000f, 0.000f)}, + {HumanBodyBones.Head, new Quaternion(0.000f, 0.000f, 1.000f, 0.000f)}, + {HumanBodyBones.LeftShoulder, new Quaternion(0.000f, 0.000f, 0.707f, -0.707f)}, + {HumanBodyBones.RightShoulder, new Quaternion(0.000f, 0.000f, 0.707f, 0.707f)}, + {HumanBodyBones.LeftUpperArm, new Quaternion(-0.500f, -0.500f, 0.500f, -0.500f)}, + {HumanBodyBones.RightUpperArm, new Quaternion(0.500f, -0.500f, 0.500f, 0.500f)}, + {HumanBodyBones.LeftLowerArm, new Quaternion(-0.500f, -0.500f, 0.500f, -0.500f)}, + {HumanBodyBones.RightLowerArm, new Quaternion(0.500f, -0.500f, 0.500f, 0.500f)}, + {HumanBodyBones.LeftHand, new Quaternion(-0.500f, -0.500f, 0.500f, -0.500f)}, + {HumanBodyBones.RightHand, new Quaternion(0.500f, -0.500f, 0.500f, 0.500f)}, + {HumanBodyBones.LeftToes, new Quaternion(0.000f, 0.707f, -0.707f, 0.000f)}, + {HumanBodyBones.RightToes, new Quaternion(0.000f, -0.707f, 0.707f, 0.000f)}, + {HumanBodyBones.LeftEye, new Quaternion(0.000f, 0.000f, 0.000f, 0.000f)}, + {HumanBodyBones.RightEye, new Quaternion(0.000f, 0.000f, 0.000f, 0.000f)}, + {HumanBodyBones.Jaw, new Quaternion(0.000f, 0.000f, 0.000f, 0.000f)}, + {HumanBodyBones.LeftThumbProximal, new Quaternion(-0.561f, -0.701f, 0.430f, -0.092f)}, + {HumanBodyBones.LeftThumbIntermediate, new Quaternion(-0.653f, -0.653f, 0.271f, -0.271f)}, + {HumanBodyBones.LeftThumbDistal, new Quaternion(-0.653f, -0.653f, 0.271f, -0.271f)}, + {HumanBodyBones.LeftIndexProximal, new Quaternion(-0.500f, -0.500f, 0.500f, -0.500f)}, + {HumanBodyBones.LeftIndexIntermediate, new Quaternion(-0.500f, -0.500f, 0.500f, -0.500f)}, + {HumanBodyBones.LeftIndexDistal, new Quaternion(-0.500f, -0.500f, 0.500f, -0.500f)}, + {HumanBodyBones.LeftMiddleProximal, new Quaternion(-0.500f, -0.500f, 0.500f, -0.500f)}, + {HumanBodyBones.LeftMiddleIntermediate, new Quaternion(-0.500f, -0.500f, 0.500f, -0.500f)}, + {HumanBodyBones.LeftMiddleDistal, new Quaternion(-0.500f, -0.500f, 0.500f, -0.500f)}, + {HumanBodyBones.LeftRingProximal, new Quaternion(-0.500f, -0.500f, 0.500f, -0.500f)}, + {HumanBodyBones.LeftRingIntermediate, new Quaternion(-0.500f, -0.500f, 0.500f, -0.500f)}, + {HumanBodyBones.LeftRingDistal, new Quaternion(-0.500f, -0.500f, 0.500f, -0.500f)}, + {HumanBodyBones.LeftLittleProximal, new Quaternion(-0.500f, -0.500f, 0.500f, -0.500f)}, + {HumanBodyBones.LeftLittleIntermediate, new Quaternion(-0.500f, -0.500f, 0.500f, -0.500f)}, + {HumanBodyBones.LeftLittleDistal, new Quaternion(-0.500f, -0.500f, 0.500f, -0.500f)}, + {HumanBodyBones.RightThumbProximal, new Quaternion(0.561f, -0.701f, 0.430f, 0.092f)}, + {HumanBodyBones.RightThumbIntermediate, new Quaternion(0.653f, -0.653f, 0.271f, 0.271f)}, + {HumanBodyBones.RightThumbDistal, new Quaternion(0.653f, -0.653f, 0.271f, 0.271f)}, + {HumanBodyBones.RightIndexProximal, new Quaternion(0.500f, -0.500f, 0.500f, 0.500f)}, + {HumanBodyBones.RightIndexIntermediate, new Quaternion(0.500f, -0.500f, 0.500f, 0.500f)}, + {HumanBodyBones.RightIndexDistal, new Quaternion(0.500f, -0.500f, 0.500f, 0.500f)}, + {HumanBodyBones.RightMiddleProximal, new Quaternion(0.500f, -0.500f, 0.500f, 0.500f)}, + {HumanBodyBones.RightMiddleIntermediate, new Quaternion(0.500f, -0.500f, 0.500f, 0.500f)}, + {HumanBodyBones.RightMiddleDistal, new Quaternion(0.500f, -0.500f, 0.500f, 0.500f)}, + {HumanBodyBones.RightRingProximal, new Quaternion(0.500f, -0.500f, 0.500f, 0.500f)}, + {HumanBodyBones.RightRingIntermediate, new Quaternion(0.500f, -0.500f, 0.500f, 0.500f)}, + {HumanBodyBones.RightRingDistal, new Quaternion(0.500f, -0.500f, 0.500f, 0.500f)}, + {HumanBodyBones.RightLittleProximal, new Quaternion(0.500f, -0.500f, 0.500f, 0.500f)}, + {HumanBodyBones.RightLittleIntermediate, new Quaternion(0.500f, -0.500f, 0.500f, 0.500f)}, + {HumanBodyBones.RightLittleDistal, new Quaternion(0.500f, -0.500f, 0.500f, 0.500f)}, + {HumanBodyBones.UpperChest, new Quaternion(0.000f, 0.000f, 1.000f, 0.000f)} + }; + } +} \ No newline at end of file diff --git a/Assets/External/Rokoko/Scripts/Mono/Inputs/Actor.cs.meta b/Assets/External/Rokoko/Scripts/Mono/Inputs/Actor.cs.meta new file mode 100644 index 00000000..ce11fe37 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/Inputs/Actor.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 0b3d830ef66b485459e15992199096b7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Mono/Inputs/Actor.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Mono/Inputs/ActorNewton.cs b/Assets/External/Rokoko/Scripts/Mono/Inputs/ActorNewton.cs new file mode 100644 index 00000000..5fc4bf47 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/Inputs/ActorNewton.cs @@ -0,0 +1,91 @@ +using Rokoko.Core; +using Rokoko.Helper; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace Rokoko.Inputs +{ + public class ActorNewton : Actor + { + private const int HEAD_TO_MATERIAL_INDEX = 5; + private const int JOINT_TO_MATERIAL_INDEX = 1; + + [Header("Newton materials")] + [SerializeField] protected Renderer meshRenderer = null; + [SerializeField] private Material bodyMaterial = null; + [SerializeField] private Material faceInvisibleMaterial = null; + public bool autoHideFaceWhenInactive = false; + + protected Material[] meshMaterials; + + #region Initialize + + protected override void Awake() + { + base.Awake(); + InitializeMaterials(); + } + + private void InitializeMaterials() + { + // Clone the material, so not to affect other objects + bodyMaterial = Material.Instantiate(bodyMaterial); + meshMaterials = new Material[meshRenderer.materials.Length]; + for (int i = 0; i < meshMaterials.Length; i++) + { + // Keep joint material as source + if (i == JOINT_TO_MATERIAL_INDEX) + meshMaterials[i] = meshRenderer.materials[i]; + else + meshMaterials[i] = bodyMaterial; + } + meshRenderer.materials = meshMaterials; + } + + #endregion + + #region Public Methods + + public override void CreateIdle(string actorName) + { + base.CreateIdle(actorName); + + if (autoHideFaceWhenInactive) + face?.gameObject.SetActive(false); + } + + public override void UpdateActor(ActorFrame actorFrame) + { + base.UpdateActor(actorFrame); + + bool updateBody = actorFrame.meta.hasBody || actorFrame.meta.hasGloves; + + // Enable/Disable body renderer + meshRenderer.enabled = updateBody; + + // Update material color and visibility + UpdateMaterialColors(actorFrame); + + // Enable/Disable face renderer + if (autoHideFaceWhenInactive) + face?.gameObject.SetActive(actorFrame.meta.hasFace); + } + + #endregion + + #region Internal Logic + + private void UpdateMaterialColors(ActorFrame actorFrame) + { + bodyMaterial.color = actorFrame.color.ToColor(); + meshMaterials[HEAD_TO_MATERIAL_INDEX] = (actorFrame.meta.hasFace) ? faceInvisibleMaterial : bodyMaterial; + meshRenderer.materials = meshMaterials; + + face?.SetColor(actorFrame.color.ToColor()); + } + + #endregion + + } +} \ No newline at end of file diff --git a/Assets/External/Rokoko/Scripts/Mono/Inputs/ActorNewton.cs.meta b/Assets/External/Rokoko/Scripts/Mono/Inputs/ActorNewton.cs.meta new file mode 100644 index 00000000..9d8d266e --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/Inputs/ActorNewton.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 7694c1eb6726a2d49a01558f46c8ef83 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Mono/Inputs/ActorNewton.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Mono/Inputs/BlendShapesMapping.cs b/Assets/External/Rokoko/Scripts/Mono/Inputs/BlendShapesMapping.cs new file mode 100644 index 00000000..1aa9a773 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/Inputs/BlendShapesMapping.cs @@ -0,0 +1,13 @@ +using Rokoko.Core; +using Rokoko.Helper; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace Rokoko.Inputs +{ + public class BlendShapesMapping : MonoBehaviour + { + public BlendshapesDictionary blendshapeNames = new BlendshapesDictionary(); + } +} \ No newline at end of file diff --git a/Assets/External/Rokoko/Scripts/Mono/Inputs/BlendShapesMapping.cs.meta b/Assets/External/Rokoko/Scripts/Mono/Inputs/BlendShapesMapping.cs.meta new file mode 100644 index 00000000..41ca0a7b --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/Inputs/BlendShapesMapping.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 07a3f22e5c105474e9725d5438558a99 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Mono/Inputs/BlendShapesMapping.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Mono/Inputs/Character.cs b/Assets/External/Rokoko/Scripts/Mono/Inputs/Character.cs new file mode 100644 index 00000000..111b83da --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/Inputs/Character.cs @@ -0,0 +1,183 @@ +using Rokoko.Core; +using Rokoko.Helper; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; + +namespace Rokoko.Inputs +{ + public class Character : MonoBehaviour + { + [System.Serializable] + public enum RotationSpace + { + Offset, + World, + Self + } + + [HideInInspector] + public string profileName = ""; + + [HideInInspector] public Animator animator; + + [Header("Convert Space")] + [Tooltip("Convert Studio data to Unity position space")] + public Space positionSpace = Space.World; + [Tooltip("Convert Studio data to Unity rotation space")] + public RotationSpace rotationSpace = RotationSpace.World; + + [Tooltip("A rotation pre rotation applied")] + public Vector3 PreRotation = new Vector3(0.0f, 0.0f, 0.0f); + + [Tooltip("A rotation post rotation applied")] + public Vector3 PostRotation = new Vector3(0.0f, 0.0f, 0.0f); + + [Space(10)] + [Tooltip("Calculate Model's height comparing to Actor's and position the Hips accordingly.\nGreat tool to align with the floor")] + public bool adjustHipHeightBasedOnStudioActor = false; + + public string hipsName = "pelvis"; + + [HideInInspector] public Face face = null; + + [Header("Log extra info")] + public bool debug = false; + + + private Dictionary _skeletonJoints = new Dictionary(); + + #region Initialize + + protected virtual void Awake() + { + if(animator == null) + { + Debug.LogError($"Character {this.name} isn't configured", this.transform); + //return; + } + + InitializeSkeletonJoints(); + } + + private void InitializeSkeletonJoints() + { + _skeletonJoints.Clear(); + Transform[] transforms = GetComponentsInChildren(); + for (int i=0; i() != null) + continue; + + _skeletonJoints.Add(transforms[i].name, transforms[i]); + } + } + + /// + /// Register Actor override in StudioManager. + /// + private void Start() + { + //if (animator != null && !animator.isHuman) return; + + if (!string.IsNullOrEmpty(profileName)) + StudioManager.AddCharacterOverride(this); + } + + + #endregion + + #region Public Methods + + /// + /// Update Skeleton and Face data based on ActorFrame. + /// + public virtual void UpdateCharacter(CharacterFrame frame) + { + //if (animator == null || !animator.isHuman) return; + + profileName = frame.name; + + // Update skeleton from data + UpdateSkeleton(frame); + + if (frame.blendshapes != null && frame.blendshapes.names != null && frame.blendshapes.names.Length > 0) + { + face?.UpdateFace(frame.blendshapes.names, frame.blendshapes.values); + } + else if (debug) + { + Debug.LogError($"Character {this.name} face has no blendshapes"); + } + } + + /// + /// Create Idle/Default Actor. + /// + public virtual void CreateIdle(string actorName) + { + this.profileName = actorName; + } + + #endregion + + #region Internal Logic + + + /// + /// Update Humanoid Skeleton based on BodyData. + /// + protected void UpdateSkeleton(CharacterFrame frame) + { + for (int i=0; i + /// Update Human bone. + /// + protected void UpdateBone(Transform boneTransform, Vector3 worldPosition, Quaternion worldRotation, bool updatePosition, Space positionSpace, RotationSpace rotationSpace) + { + // Update position + if (updatePosition) + { + if (positionSpace == Space.World || boneTransform.parent == null) + { + boneTransform.position = worldPosition; + } + else + { + boneTransform.position = boneTransform.parent.rotation * worldPosition + boneTransform.parent.position; + } + } + + // Update Rotation + if (rotationSpace == RotationSpace.World) + { + boneTransform.rotation = Quaternion.Euler(PreRotation.x, PreRotation.y, PreRotation.z) * worldRotation * Quaternion.Euler(PostRotation.x, PostRotation.y, PostRotation.z); + } + else if (rotationSpace == RotationSpace.Self) + { + if (transform.parent != null) + boneTransform.rotation = this.transform.parent.rotation * worldRotation; + else + boneTransform.rotation = worldRotation; + } + } + + #endregion + + } +} \ No newline at end of file diff --git a/Assets/External/Rokoko/Scripts/Mono/Inputs/Character.cs.meta b/Assets/External/Rokoko/Scripts/Mono/Inputs/Character.cs.meta new file mode 100644 index 00000000..6b264ff9 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/Inputs/Character.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 8b7631c1f06f4144abfa5da7ebc0f80c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Mono/Inputs/Character.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Mono/Inputs/Face.cs b/Assets/External/Rokoko/Scripts/Mono/Inputs/Face.cs new file mode 100644 index 00000000..3667703c --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/Inputs/Face.cs @@ -0,0 +1,111 @@ +using Rokoko.Core; +using Rokoko.Helper; +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace Rokoko.Inputs +{ + public class Face : MonoBehaviour + { + [System.Serializable] + public enum FaceMappingEnum + { + ARKit, + Custom + } + + private const int HEAD_TO_MATERIAL_INDEX = 3; + + [HideInInspector] public FaceMappingEnum blendshapeMapping; + [HideInInspector] public BlendShapesMapping blendshapeCustomMap; + + [HideInInspector] public SkinnedMeshRenderer meshRenderer = null; + + [Header("Log extra info")] + public bool debug = false; + + private Dictionary blendshapeNamesToIndex = new Dictionary(); + + private void Start() + { + if (meshRenderer == null) + { + Debug.LogError("Unassigned SkinnedMeshRenderer for face", this.transform); + return; + } + + blendshapeNamesToIndex = meshRenderer.sharedMesh.GetAllBlendshapes(); + } + + public void UpdateFace(FaceFrame faceFrame) + { + if (meshRenderer == null) return; + + float[] blendshapeValues = faceFrame.GetValues(); + for (int i = 0; i < RokokoHelper.BlendshapesArray.Length; i++) + { + // Get blendshape name + string blendShapeName; + + // Set default blendshape name + if (blendshapeMapping == FaceMappingEnum.ARKit) + { + blendShapeName = RokokoHelper.BlendshapesArray[i].ToString(); + } + // Get custom blendshape name + else + { + blendShapeName = blendshapeCustomMap.blendshapeNames[RokokoHelper.BlendshapesArray[i]]; + } + + int blendshapeIndex = GetBlendshapeIndex(blendShapeName); + if (blendshapeIndex >= 0) + meshRenderer.SetBlendShapeWeight(blendshapeIndex, blendshapeValues[i]); + else + { + if (debug) + Debug.LogWarning($"Couldn't find blendshape name:{blendShapeName} in Mesh blendshapes (count:{meshRenderer.sharedMesh.blendShapeCount})", this.transform); + } + } + } + + public void UpdateFace(string[] names, float[] blendshapeValues) + { + if (meshRenderer == null) return; + + for (int i = 0; i < names.Length; ++i) + { + // Get blendshape name + string blendShapeName = names[i]; + + int blendshapeIndex = GetBlendshapeIndex(blendShapeName); + if (blendshapeIndex >= 0) + meshRenderer.SetBlendShapeWeight(blendshapeIndex, blendshapeValues[i]); + else + { + if (debug) + Debug.LogWarning($"Couldn't find blendshape name:{blendShapeName} in Mesh blendshapes (count:{meshRenderer.sharedMesh.blendShapeCount})", this.transform); + } + } + } + + private int GetBlendshapeIndex(string blendshape) + { + foreach (string blendshapeKey in blendshapeNamesToIndex.Keys) + { + if (blendshapeKey.Contains(blendshape.ToLower())) + return blendshapeNamesToIndex[blendshapeKey]; + } + return -1; + } + + public void SetColor(Color color) + { + if (meshRenderer == null) return; + + meshRenderer.materials[HEAD_TO_MATERIAL_INDEX].color = color; + } + } +} \ No newline at end of file diff --git a/Assets/External/Rokoko/Scripts/Mono/Inputs/Face.cs.meta b/Assets/External/Rokoko/Scripts/Mono/Inputs/Face.cs.meta new file mode 100644 index 00000000..6754e660 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/Inputs/Face.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: b6f1b7bab29ae9c4ab510759d0fbaa91 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Mono/Inputs/Face.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Mono/Inputs/HumanBoneMapping.cs b/Assets/External/Rokoko/Scripts/Mono/Inputs/HumanBoneMapping.cs new file mode 100644 index 00000000..fff24d06 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/Inputs/HumanBoneMapping.cs @@ -0,0 +1,11 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace Rokoko.Inputs +{ + public class HumanBoneMapping : MonoBehaviour + { + public Transform[] customBodyBones = new Transform[0]; + } +} \ No newline at end of file diff --git a/Assets/External/Rokoko/Scripts/Mono/Inputs/HumanBoneMapping.cs.meta b/Assets/External/Rokoko/Scripts/Mono/Inputs/HumanBoneMapping.cs.meta new file mode 100644 index 00000000..cccec490 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/Inputs/HumanBoneMapping.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 4a162b99fb9dfe542b5844d7b3d7c9fe +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Mono/Inputs/HumanBoneMapping.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Mono/Inputs/Prop.cs b/Assets/External/Rokoko/Scripts/Mono/Inputs/Prop.cs new file mode 100644 index 00000000..b13ed19c --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/Inputs/Prop.cs @@ -0,0 +1,42 @@ +using Rokoko.Core; +using Rokoko.Helper; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace Rokoko.Inputs +{ + public class Prop : MonoBehaviour + { + [HideInInspector] public string propName; + public Space positionSpace = Space.Self; + public Space rotationSpace = Space.Self; + + protected virtual void Start() + { + if (!string.IsNullOrEmpty(propName)) + StudioManager.AddPropOverride(this); + } + + public virtual void UpdateProp(PropFrame propFrame) + { + propName = propFrame.name; + + if (positionSpace == Space.World) + this.transform.position = propFrame.position.ToVector3(); + else + this.transform.localPosition = propFrame.position.ToVector3(); + + Quaternion worldRotation = propFrame.rotation.ToQuaternion(); + if (rotationSpace == Space.World) + this.transform.rotation = worldRotation; + else + { + if (transform.parent != null) + this.transform.rotation = Quaternion.Inverse(transform.parent.rotation) * worldRotation; + else + this.transform.rotation = worldRotation; + } + } + } +} \ No newline at end of file diff --git a/Assets/External/Rokoko/Scripts/Mono/Inputs/Prop.cs.meta b/Assets/External/Rokoko/Scripts/Mono/Inputs/Prop.cs.meta new file mode 100644 index 00000000..3b6c4577 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/Inputs/Prop.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 8274508f93c440949969e644e7b64e65 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Mono/Inputs/Prop.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Mono/Inputs/PropColor.cs b/Assets/External/Rokoko/Scripts/Mono/Inputs/PropColor.cs new file mode 100644 index 00000000..717ea412 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/Inputs/PropColor.cs @@ -0,0 +1,21 @@ +using Rokoko.Core; +using Rokoko.Helper; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace Rokoko.Inputs +{ + public class PropColor : Prop + { + [HideInInspector] public MeshRenderer meshRenderer; + + public override void UpdateProp(PropFrame propFrame) + { + base.UpdateProp(propFrame); + + if (meshRenderer != null) + meshRenderer.material.color = propFrame.color.ToColor(); + } + } +} \ No newline at end of file diff --git a/Assets/External/Rokoko/Scripts/Mono/Inputs/PropColor.cs.meta b/Assets/External/Rokoko/Scripts/Mono/Inputs/PropColor.cs.meta new file mode 100644 index 00000000..650c2a58 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/Inputs/PropColor.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 93bc1b702e5f6fa4c9d905909f4741e6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Mono/Inputs/PropColor.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Mono/PrefabInstancer.cs b/Assets/External/Rokoko/Scripts/Mono/PrefabInstancer.cs new file mode 100644 index 00000000..72a3f5dd --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/PrefabInstancer.cs @@ -0,0 +1,46 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace Rokoko +{ + public class PrefabInstancer where P : MonoBehaviour + { + private PrefabPool

pool; + private Dictionary objects; + + public PrefabInstancer(P prefab, Transform container, int poolNumber = 0) + { + pool = new PrefabPool

(prefab, container, poolNumber); + objects = new Dictionary(); + } + + public P this[T key] + { + get + { + if (!objects.ContainsKey(key)) + objects.Add(key, pool.Dequeue()); + return objects[key]; + } + } + + public bool ContainsKey(T key) => objects.ContainsKey(key); + + public bool ContainsValue(P item) => objects.ContainsValue(item); + + public IEnumerable Keys => objects.Keys; + + public IEnumerable Values => objects.Values; + + public int Count => objects.Count; + + public void Remove(T key) + { + if (!ContainsKey(key)) return; + P item = objects[key]; + objects.Remove(key); + pool.Enqueue(item); + } + } +} \ No newline at end of file diff --git a/Assets/External/Rokoko/Scripts/Mono/PrefabInstancer.cs.meta b/Assets/External/Rokoko/Scripts/Mono/PrefabInstancer.cs.meta new file mode 100644 index 00000000..9f3e543a --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/PrefabInstancer.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: ded564a0c7575434ebb9c2faf540099d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Mono/PrefabInstancer.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Mono/PrefabPool.cs b/Assets/External/Rokoko/Scripts/Mono/PrefabPool.cs new file mode 100644 index 00000000..4c3dcd89 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/PrefabPool.cs @@ -0,0 +1,53 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace Rokoko +{ + public class PrefabPool where T : MonoBehaviour + { + public int poolNumber = 3; + public T prefab; + public Transform container; + + private Queue pool = new Queue(); + + public PrefabPool(T prefab, Transform container, int poolNumber = 3) + { + this.prefab = prefab; + this.container = container; + this.poolNumber = poolNumber; + + for (int i = 0; i < poolNumber; i++) + { + Enqueue(InstantiatePrefab()); + } + } + + public T Dequeue() + { + if (pool.Count == 0) + Enqueue(InstantiatePrefab()); + T instance = pool.Dequeue(); + instance.gameObject.SetActive(true); + return instance; + } + + public void Enqueue(T instance) + { + pool.Enqueue(instance); + instance.gameObject.SetActive(false); + instance.name = prefab.name; + } + + private T InstantiatePrefab() + { + T instance = GameObject.Instantiate(prefab); + instance.transform.SetParent(container); + instance.transform.position = Vector3.zero; + instance.transform.rotation = Quaternion.identity; + instance.name = prefab.name; + return instance; + } + } +} \ No newline at end of file diff --git a/Assets/External/Rokoko/Scripts/Mono/PrefabPool.cs.meta b/Assets/External/Rokoko/Scripts/Mono/PrefabPool.cs.meta new file mode 100644 index 00000000..0459559c --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/PrefabPool.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 47b981a3ed34dc64b9ab5ae02663b220 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Mono/PrefabPool.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Mono/RokokoHelper.cs b/Assets/External/Rokoko/Scripts/Mono/RokokoHelper.cs new file mode 100644 index 00000000..c00e5ccc --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/RokokoHelper.cs @@ -0,0 +1,344 @@ +using Rokoko.Core; +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace Rokoko.Helper +{ + public static class RokokoHelper + { + public static Vector3 ToVector3(this Vector3Frame vec3) + { + return new Vector3(vec3.x, vec3.y, vec3.z); + } + + public static Quaternion ToQuaternion(this Vector4Frame vec4) + { + return new Quaternion(vec4.x, vec4.y, vec4.z, vec4.w); + } + + public static string ToLowerFirstChar(this string input) + { + string newString = input; + if (!String.IsNullOrEmpty(newString) && Char.IsUpper(newString[0])) + newString = Char.ToLower(newString[0]) + newString.Substring(1); + return newString; + } + + public static string ToUpperFirstChar(this string input) + { + string newString = input; + if (!String.IsNullOrEmpty(newString) && Char.IsLower(newString[0])) + newString = Char.ToUpper(newString[0]) + newString.Substring(1); + return newString; + } + + public static ActorJointFrame? GetBoneFrame(this BodyFrame frame, HumanBodyBones bone) + { + switch (bone) + { + case HumanBodyBones.Hips: + return frame.hip; + case HumanBodyBones.LeftUpperLeg: + return frame.leftUpLeg; + case HumanBodyBones.RightUpperLeg: + return frame.rightUpLeg; + case HumanBodyBones.LeftLowerLeg: + return frame.leftLeg; + case HumanBodyBones.RightLowerLeg: + return frame.rightLeg; + case HumanBodyBones.LeftFoot: + return frame.leftFoot; + case HumanBodyBones.RightFoot: + return frame.rightFoot; + case HumanBodyBones.Spine: + return frame.spine; + //case HumanBodyBones.Chest: + // return frame.chest; + case HumanBodyBones.Neck: + return frame.neck; + case HumanBodyBones.Head: + return frame.head; + case HumanBodyBones.LeftShoulder: + return frame.leftShoulder; + case HumanBodyBones.RightShoulder: + return frame.rightShoulder; + case HumanBodyBones.LeftUpperArm: + return frame.leftUpperArm; + case HumanBodyBones.RightUpperArm: + return frame.rightUpperArm; + case HumanBodyBones.LeftLowerArm: + return frame.leftLowerArm; + case HumanBodyBones.RightLowerArm: + return frame.rightLowerArm; + case HumanBodyBones.LeftHand: + return frame.leftHand; + case HumanBodyBones.RightHand: + return frame.rightHand; + case HumanBodyBones.LeftToes: + return frame.leftToe; + case HumanBodyBones.RightToes: + return frame.rightToe; + //case HumanBodyBones.LeftEye: + // return frame.leftEye; + //case HumanBodyBones.RightEye: + // return frame.rightEye; + //case HumanBodyBones.Jaw: + // return frame.jaw; + case HumanBodyBones.LeftThumbProximal: + return frame.leftThumbProximal; + case HumanBodyBones.LeftThumbIntermediate: + return frame.leftThumbMedial; + case HumanBodyBones.LeftThumbDistal: + return frame.leftThumbDistal; + case HumanBodyBones.LeftIndexProximal: + return frame.leftIndexProximal; + case HumanBodyBones.LeftIndexIntermediate: + return frame.leftIndexMedial; + case HumanBodyBones.LeftIndexDistal: + return frame.leftIndexDistal; + case HumanBodyBones.LeftMiddleProximal: + return frame.leftMiddleProximal; + case HumanBodyBones.LeftMiddleIntermediate: + return frame.leftMiddleMedial; + case HumanBodyBones.LeftMiddleDistal: + return frame.leftMiddleDistal; + case HumanBodyBones.LeftRingProximal: + return frame.leftRingProximal; + case HumanBodyBones.LeftRingIntermediate: + return frame.leftRingMedial; + case HumanBodyBones.LeftRingDistal: + return frame.leftRingDistal; + case HumanBodyBones.LeftLittleProximal: + return frame.leftLittleProximal; + case HumanBodyBones.LeftLittleIntermediate: + return frame.leftLittleMedial; + case HumanBodyBones.LeftLittleDistal: + return frame.leftLittleDistal; + case HumanBodyBones.RightThumbProximal: + return frame.rightThumbProximal; + case HumanBodyBones.RightThumbIntermediate: + return frame.rightThumbMedial; + case HumanBodyBones.RightThumbDistal: + return frame.rightThumbDistal; + case HumanBodyBones.RightIndexProximal: + return frame.rightIndexProximal; + case HumanBodyBones.RightIndexIntermediate: + return frame.rightIndexMedial; + case HumanBodyBones.RightIndexDistal: + return frame.rightIndexDistal; + case HumanBodyBones.RightMiddleProximal: + return frame.rightMiddleProximal; + case HumanBodyBones.RightMiddleIntermediate: + return frame.rightMiddleMedial; + case HumanBodyBones.RightMiddleDistal: + return frame.rightMiddleDistal; + case HumanBodyBones.RightRingProximal: + return frame.rightRingProximal; + case HumanBodyBones.RightRingIntermediate: + return frame.rightRingMedial; + case HumanBodyBones.RightRingDistal: + return frame.rightRingDistal; + case HumanBodyBones.RightLittleProximal: + return frame.rightLittleProximal; + case HumanBodyBones.RightLittleIntermediate: + return frame.rightLittleMedial; + case HumanBodyBones.RightLittleDistal: + return frame.rightLittleDistal; + case HumanBodyBones.UpperChest: + return frame.chest; + } + + return null; + } + + public static Color ToColor(this int[] color) + { + if (color == null || color.Length != 3) + return Color.white; + return new Color((float)color[0] / 255f, (float)color[1] / 255f, (float)color[2] / 255f); + } + + public static void DestroyChildren(this Transform transform) + { + List children = new List(); + foreach (Transform child in transform) + children.Add(child); + + foreach (Transform child in children) + GameObject.Destroy(child.gameObject); + } + + ///

+ /// Check if actor name is present in live data + /// + public static bool HasProfile(this LiveFrame_v4 frame, string profileName) + { + for (int i = 0; i < frame.scene.actors.Length; i++) + { + if (frame.scene.actors[i].name == profileName) + return true; + } + return false; + } + + /// + /// Check if character name is present in live data + /// + public static bool HasCharacter(this LiveFrame_v4 frame, string profileName) + { + for (int i = 0; i < frame.scene.characters.Length; i++) + { + if (frame.scene.characters[i].name == profileName) + return true; + } + return false; + } + + /// + /// Check if prop name is present in live data + /// + public static bool HasProp(this LiveFrame_v4 frame, string propName) + { + for (int i = 0; i < frame.scene.props.Length; i++) + { + if (frame.scene.props[i].name == propName) + return true; + } + return false; + } + + public static float[] GetValues(this FaceFrame faceFrame) + { + var values = new float[(int)BlendShapes.size]; + values[(int)BlendShapes.eyeBlinkLeft] = faceFrame.eyeBlinkLeft; + values[(int)BlendShapes.eyeLookDownLeft] = faceFrame.eyeLookDownLeft; + values[(int)BlendShapes.eyeLookInLeft] = faceFrame.eyeLookInLeft; + values[(int)BlendShapes.eyeLookOutLeft] = faceFrame.eyeLookOutLeft; + values[(int)BlendShapes.eyeLookUpLeft] = faceFrame.eyeLookUpLeft; + values[(int)BlendShapes.eyeSquintLeft] = faceFrame.eyeSquintLeft; + values[(int)BlendShapes.eyeWideLeft] = faceFrame.eyeWideLeft; + values[(int)BlendShapes.eyeBlinkRight] = faceFrame.eyeBlinkRight; + values[(int)BlendShapes.eyeLookDownRight] = faceFrame.eyeLookDownRight; + values[(int)BlendShapes.eyeLookInRight] = faceFrame.eyeLookInRight; + values[(int)BlendShapes.eyeLookOutRight] = faceFrame.eyeLookOutRight; + values[(int)BlendShapes.eyeLookUpRight] = faceFrame.eyeLookUpRight; + values[(int)BlendShapes.eyeSquintRight] = faceFrame.eyeSquintRight; + values[(int)BlendShapes.eyeWideRight] = faceFrame.eyeWideRight; + values[(int)BlendShapes.jawForward] = faceFrame.jawForward; + values[(int)BlendShapes.jawLeft] = faceFrame.jawLeft; + values[(int)BlendShapes.jawRight] = faceFrame.jawRight; + values[(int)BlendShapes.jawOpen] = faceFrame.jawOpen; + values[(int)BlendShapes.mouthClose] = faceFrame.mouthClose; + values[(int)BlendShapes.mouthFunnel] = faceFrame.mouthFunnel; + values[(int)BlendShapes.mouthPucker] = faceFrame.mouthPucker; + values[(int)BlendShapes.mouthLeft] = faceFrame.mouthLeft; + values[(int)BlendShapes.mouthRight] = faceFrame.mouthRight; + values[(int)BlendShapes.mouthSmileLeft] = faceFrame.mouthSmileLeft; + values[(int)BlendShapes.mouthSmileRight] = faceFrame.mouthSmileRight; + values[(int)BlendShapes.mouthFrownLeft] = faceFrame.mouthFrownLeft; + values[(int)BlendShapes.mouthFrownRight] = faceFrame.mouthFrownRight; + values[(int)BlendShapes.mouthDimpleLeft] = faceFrame.mouthDimpleLeft; + values[(int)BlendShapes.mouthDimpleRight] = faceFrame.mouthDimpleRight; + values[(int)BlendShapes.mouthStretchLeft] = faceFrame.mouthStretchLeft; + values[(int)BlendShapes.mouthStretchRight] = faceFrame.mouthStretchRight; + values[(int)BlendShapes.mouthRollLower] = faceFrame.mouthRollLower; + values[(int)BlendShapes.mouthRollUpper] = faceFrame.mouthRollUpper; + values[(int)BlendShapes.mouthShrugLower] = faceFrame.mouthShrugLower; + values[(int)BlendShapes.mouthShrugUpper] = faceFrame.mouthShrugUpper; + values[(int)BlendShapes.mouthPressLeft] = faceFrame.mouthPressLeft; + values[(int)BlendShapes.mouthPressRight] = faceFrame.mouthPressRight; + values[(int)BlendShapes.mouthLowerDownLeft] = faceFrame.mouthLowerDownLeft; + values[(int)BlendShapes.mouthLowerDownRight] = faceFrame.mouthLowerDownRight; + values[(int)BlendShapes.mouthUpperUpLeft] = faceFrame.mouthUpperUpLeft; + values[(int)BlendShapes.mouthUpperUpRight] = faceFrame.mouthUpperUpRight; + values[(int)BlendShapes.browDownLeft] = faceFrame.browDownLeft; + values[(int)BlendShapes.browDownRight] = faceFrame.browDownRight; + values[(int)BlendShapes.browInnerUp] = faceFrame.browInnerUp; + values[(int)BlendShapes.browOuterUpLeft] = faceFrame.browOuterUpLeft; + values[(int)BlendShapes.browOuterUpRight] = faceFrame.browOuterUpRight; + values[(int)BlendShapes.cheekPuff] = faceFrame.cheekPuff; + values[(int)BlendShapes.cheekSquintLeft] = faceFrame.cheekSquintLeft; + values[(int)BlendShapes.cheekSquintRight] = faceFrame.cheekSquintRight; + values[(int)BlendShapes.noseSneerLeft] = faceFrame.noseSneerLeft; + values[(int)BlendShapes.noseSneerRight] = faceFrame.noseSneerRight; + values[(int)BlendShapes.tongueOut] = faceFrame.tongueOut; + + return values; + } + + public static Dictionary GetAllBlendshapes(this Mesh mesh) + { + Dictionary blendshapeNamesToIndex = new Dictionary(); + for (int i = 0; i < mesh.blendShapeCount; i++) + { + blendshapeNamesToIndex.Add(mesh.GetBlendShapeName(i).ToLower(), i); + } + return blendshapeNamesToIndex; + } + + /// + /// Get all missing blendshapes comparing to ARKit 52 blendshapes + /// + public static List GetAllMissingBlendshapes(this Mesh mesh) + { + List missingBlendshapes = new List(); + List blendshapeNames = new List(mesh.GetAllBlendshapes().Keys); + for (int i = 0; i < BlendshapesArray.Length; i++) + { + string arkitName = BlendshapesArray[i].ToString(); + if (!blendshapeNames.Contains(arkitName.ToLower())) + missingBlendshapes.Add(arkitName); + } + + return missingBlendshapes; + } + + private static BlendShapes[] _BlendshapesArray = null; + public static BlendShapes[] BlendshapesArray + { + get + { + if (_BlendshapesArray == null) + { + _BlendshapesArray = new BlendShapes[(int)BlendShapes.size]; + for (int i = 0; i < _BlendshapesArray.Length; i++) + { + _BlendshapesArray[i] = (BlendShapes)i; + } + } + + return _BlendshapesArray; + } + } + + private static HumanBodyBones[] _HumanBodyBonesArray = null; + + public static HumanBodyBones[] HumanBodyBonesArray + { + get + { + if (_HumanBodyBonesArray == null) + { + _HumanBodyBonesArray = new HumanBodyBones[(int)HumanBodyBones.LastBone]; + for (int i = 0; i < _HumanBodyBonesArray.Length; i++) + _HumanBodyBonesArray[i] = (HumanBodyBones)i; + } + return _HumanBodyBonesArray; + } + } + + public static void Destroy(GameObject gameObject) + { + if (Application.isPlaying) + GameObject.Destroy(gameObject); + else + GameObject.DestroyImmediate(gameObject); + +#if UNITY_EDITOR + if (!Application.isPlaying) + UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(UnityEngine.SceneManagement.SceneManager.GetActiveScene()); +#endif + } + } +} \ No newline at end of file diff --git a/Assets/External/Rokoko/Scripts/Mono/RokokoHelper.cs.meta b/Assets/External/Rokoko/Scripts/Mono/RokokoHelper.cs.meta new file mode 100644 index 00000000..cc89a1e5 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/RokokoHelper.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 5fb415e868ac58149ae137d5bd2d006a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Mono/RokokoHelper.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Mono/Serializable.meta b/Assets/External/Rokoko/Scripts/Mono/Serializable.meta new file mode 100644 index 00000000..fe19255d --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/Serializable.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 363721fc8fef7dc40a9243ec4954d2af +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/Scripts/Mono/Serializable/BlendshapesDictionary.cs b/Assets/External/Rokoko/Scripts/Mono/Serializable/BlendshapesDictionary.cs new file mode 100644 index 00000000..7c3df5d7 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/Serializable/BlendshapesDictionary.cs @@ -0,0 +1,7 @@ +using Rokoko.Core; + +/// +/// Create a simple serialized version of a Dictionary in order to able to persist in Editor play mode. +/// +[System.Serializable] +public class BlendshapesDictionary : SerializableDictionary { } diff --git a/Assets/External/Rokoko/Scripts/Mono/Serializable/BlendshapesDictionary.cs.meta b/Assets/External/Rokoko/Scripts/Mono/Serializable/BlendshapesDictionary.cs.meta new file mode 100644 index 00000000..0b70cd5e --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/Serializable/BlendshapesDictionary.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 9681c86ca06b0de479fcf425d8560c3b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Mono/Serializable/BlendshapesDictionary.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Mono/Serializable/HumanTPoseDictionary.cs b/Assets/External/Rokoko/Scripts/Mono/Serializable/HumanTPoseDictionary.cs new file mode 100644 index 00000000..992317c6 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/Serializable/HumanTPoseDictionary.cs @@ -0,0 +1,8 @@ +using System; +using UnityEngine; + +/// +/// Create a simple serialized version of a Dictionary in order to able to persist in Editor play mode. +/// +[System.Serializable] +public class HumanTPoseDictionary : SerializableDictionary { } diff --git a/Assets/External/Rokoko/Scripts/Mono/Serializable/HumanTPoseDictionary.cs.meta b/Assets/External/Rokoko/Scripts/Mono/Serializable/HumanTPoseDictionary.cs.meta new file mode 100644 index 00000000..df6e876e --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/Serializable/HumanTPoseDictionary.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 9a32ea12a419b4544a5ef5263af08a26 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Mono/Serializable/HumanTPoseDictionary.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Mono/Serializable/SerializableDictionary.cs b/Assets/External/Rokoko/Scripts/Mono/Serializable/SerializableDictionary.cs new file mode 100644 index 00000000..26804dbc --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/Serializable/SerializableDictionary.cs @@ -0,0 +1,63 @@ +using Rokoko.Core; +using System.Collections; +using System.Collections.Generic; + +/// +/// Create a simple serialized version of a Dictionary in order to able to persist in Editor play mode. +/// +[System.Serializable] +public abstract class SerializableDictionary +{ + public List keys = new List(); + public List values = new List(); + + public void Add(TKey key, TValue value) + { + if (keys.Contains(key)) + throw new System.Exception("Key already exists"); + keys.Add(key); + values.Add(value); + } + + public TValue this[TKey key] + { + get + { + if (!keys.Contains(key)) + throw new System.Exception("Key doesn't exists"); + return values[keys.IndexOf(key)]; + } + set + { + if (!keys.Contains(key)) + throw new System.Exception("Key doesn't exists"); + + int index = keys.IndexOf(key); + values[index] = value; + } + + } + + public KeyValuePair this[int index] + { + get + { + if (keys.Count < index) + throw new System.IndexOutOfRangeException(); + return new KeyValuePair(keys[index], values[index]); + } + } + + public bool Contains(TKey key) + { + return keys.Contains(key); + } + + public void Clear() + { + keys.Clear(); + values.Clear(); + } + + public int Count => keys.Count; +} diff --git a/Assets/External/Rokoko/Scripts/Mono/Serializable/SerializableDictionary.cs.meta b/Assets/External/Rokoko/Scripts/Mono/Serializable/SerializableDictionary.cs.meta new file mode 100644 index 00000000..d856cef1 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/Serializable/SerializableDictionary.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 40cfb04b525907c409046edb971ff8f1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Mono/Serializable/SerializableDictionary.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Mono/StudioManager.cs b/Assets/External/Rokoko/Scripts/Mono/StudioManager.cs new file mode 100644 index 00000000..55a90ec6 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/StudioManager.cs @@ -0,0 +1,342 @@ +using Rokoko; +using Rokoko.Core; +using Rokoko.CommandAPI; +using Rokoko.Helper; +using Rokoko.Inputs; +using Rokoko.UI; +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace Rokoko +{ + public class StudioManager : MonoBehaviour + { + private const string ACTOR_DEMO_IDLE_NAME = "ActorIdle"; + + private static StudioManager instance; + + [Header("Network")] + [Tooltip("ReceivePort must match Studio Live Stream port settings")] + public int receivePort = 14043; + + [Tooltip("Use LZ4 compression stream")] + public bool useLZ4Compression = true; + + [Tooltip("Log the stream frame information")] + public bool receiverVerbose = false; + + [Header("Default Inputs - Used when no overrides found (Optional)")] + [Tooltip("Actor Prefab to create actors when no overrides found")] + public Actor actorPrefab; + [Tooltip("Character Prefab to create characters when no overrides found")] + public Character characterPrefab; + [Tooltip("Prop Prefab to create props when no overrides found")] + public Prop propPrefab; + + [Header("UI (Optional)")] + public UIHierarchyManager uiManager; + + [Header("Command API (Optional)")] + public StudioCommandAPI CommandAPI; + public bool AutoSendTrackerCommands; + + [Header("Input Overrides - Automatically updated")] + public List actorOverrides = new List(); + public List characterOverrides = new List(); + public List propOverrides = new List(); + + [Header("Extra Behiavours")] + public bool autoGenerateInputsWhenNoOverridesFound = false; + public bool showDefaultActorWhenNoData = false; + + private StudioReceiver studioReceiver; + private PrefabInstancer actors; + private PrefabInstancer characters; + private PrefabInstancer props; + + private object actionsOnMainThread = new object(); + private List packetsToProcess = new List(); + + #region MonoBehaviour + + private void Awake() + { + if (instance == null) + instance = this; + } + + // Start is called before the first frame update + private IEnumerator Start() + { + studioReceiver = new StudioReceiver(); + studioReceiver.receivePortNumber = receivePort; + studioReceiver.useLZ4Compression = useLZ4Compression; + studioReceiver.verbose = receiverVerbose; + studioReceiver.Initialize(); + studioReceiver.StartListening(); + studioReceiver.onStudioDataReceived += StudioReceiver_onStudioDataReceived; + + if (actorPrefab != null) + actors = new PrefabInstancer(actorPrefab, this.transform); + if (characterPrefab != null) + characters = new PrefabInstancer(characterPrefab, this.transform); + if (propPrefab != null) + props = new PrefabInstancer(propPrefab, this.transform); + + yield return null; + + if (actorOverrides.Count == 0 && characterOverrides.Count == 0) + { + Debug.Log("No custom characters found. Will generate scene from default ones"); + } + } + + private void Update() + { + // Run all actions inside Unity's main thread + lock (actionsOnMainThread) + { + if (packetsToProcess.Count > 0) + { + ProcessLiveFrame(packetsToProcess[packetsToProcess.Count-1]); + packetsToProcess.Clear(); + } + } + } + + private void FixedUpdate() + { + if (AutoSendTrackerCommands && CommandAPI != null) + { + if (!CommandAPI.IsTrackerRequestInProgress) + { + CommandAPI.Tracker(); + } + } + } + + private void OnDestroy() + { + studioReceiver.Dispose(); + } + + #endregion + + private void StudioReceiver_onStudioDataReceived(object sender, LiveFrame_v4 e) + { + lock (actionsOnMainThread) + packetsToProcess.Add(e); + } + + /// + /// Main process logic of live data + /// + private void ProcessLiveFrame(LiveFrame_v4 frame) + { + int numberOfActors = frame?.scene.actors?.Length ?? 0; + int numberOfCharacters = frame?.scene.characters?.Length ?? 0; + + if (numberOfActors == 0 && numberOfCharacters == 0) + return; + + // Update each actor from live data + for (int i = 0; i < numberOfActors; i++) + { + ActorFrame actorFrame = frame.scene.actors[i]; + + List actorOverrides = GetActorOverride(actorFrame.name); + // Update custom actors if any + if (actorOverrides.Count > 0) + { + for (int a = 0; a < actorOverrides.Count; a++) + { + actorOverrides[a].UpdateActor(actorFrame); + } + } + // Update default actor + else if (autoGenerateInputsWhenNoOverridesFound && actors != null) + { + actors[actorFrame.name].UpdateActor(actorFrame); + } + } + + // Update each character from live data + for (int i = 0; i < numberOfCharacters; i++) + { + CharacterFrame charFrame = frame.scene.characters[i]; + + List characterOverrides = GetCharacterOverride(charFrame.name); + // Update custom characters if any + if (characterOverrides.Count > 0) + { + for (int a = 0; a < characterOverrides.Count; a++) + { + characterOverrides[a].UpdateCharacter(charFrame); + } + } + // Update default character + else if (autoGenerateInputsWhenNoOverridesFound && characters != null) + { + characters[charFrame.name].UpdateCharacter(charFrame); + } + } + + // Update each prop from live data + if (frame.scene.props != null) + { + for (int i = 0; i < frame.scene.props.Length; i++) + { + PropFrame propFrame = frame.scene.props[i]; + + List propOverrides = GetPropOverride(propFrame.name); + // Update custom props if any + if (propOverrides.Count > 0) + { + for (int a = 0; a < propOverrides.Count; a++) + { + propOverrides[a].UpdateProp(propFrame); + } + } + // Update default prop + else if (autoGenerateInputsWhenNoOverridesFound && props != null) + { + props[propFrame.name].UpdateProp(propFrame); + } + } + } + + // Remove all default Actors that doesn't exist in data + ClearUnusedDefaultInputs(frame); + + // Show default character + UpdateDefaultActorWhenIdle(); + + // Update Hierarchy UI + uiManager?.UpdateHierarchy(frame); + } + + /// + /// Show default T pose character when not playback data + /// + private void UpdateDefaultActorWhenIdle() + { + if (!showDefaultActorWhenNoData) return; + if (actors == null || props == null) // || characters == null) + return; + + // Create default actor + if (actors.Count == 0 && props.Count == 0) + { + actors[ACTOR_DEMO_IDLE_NAME].CreateIdle(ACTOR_DEMO_IDLE_NAME); + } + // No need to update + else if (actors.Count == 1 && actors.ContainsKey(ACTOR_DEMO_IDLE_NAME)) + { + + } + // Remove default actor when playback data available + else + { + actors.Remove(ACTOR_DEMO_IDLE_NAME); + } + } + + /// + /// Remove all default Actors that doesn't exist in data + /// + private void ClearUnusedDefaultInputs(LiveFrame_v4 frame) + { + if (actors != null) + { + foreach (Actor actor in new List((IEnumerable)actors.Values)) + { + // Don't remove idle demo + if (actor.profileName == ACTOR_DEMO_IDLE_NAME) continue; + + if (!frame.HasProfile(actor.profileName)) + actors.Remove(actor.profileName); + } + } + + if (characters != null) + { + foreach (Character character in new List((IEnumerable)characters.Values)) + { + // Don't remove idle demo + if (character.profileName == ACTOR_DEMO_IDLE_NAME) continue; + + if (!frame.HasCharacter(character.profileName)) + characters.Remove(character.profileName); + } + } + + if (props != null) + { + foreach (Prop prop in new List((IEnumerable)props.Values)) + { + if (!frame.HasProp(prop.propName)) + props.Remove(prop.propName); + } + } + } + + public List GetActorOverride(string profileName) + { + List overrides = new List(); + for (int i = 0; i < actorOverrides.Count; i++) + { + if (profileName.ToLower() == actorOverrides[i].profileName.ToLower()) + overrides.Add(actorOverrides[i]); + } + return overrides; + } + + public List GetCharacterOverride(string profileName) + { + List overrides = new List(); + for (int i = 0; i < characterOverrides.Count; i++) + { + if (characterOverrides[i] == null) + continue; + + if (profileName.ToLower() == characterOverrides[i].profileName.ToLower()) + overrides.Add(characterOverrides[i]); + } + return overrides; + } + + public List GetPropOverride(string profileName) + { + List overrides = new List(); + for (int i = 0; i < propOverrides.Count; i++) + { + if (profileName.ToLower() == propOverrides[i].propName.ToLower()) + overrides.Add(propOverrides[i]); + } + return overrides; + } + + public static void AddActorOverride(Actor actor) + { + if (instance == null) return; + if (instance.actorOverrides.Contains(actor)) return; + instance.actorOverrides.Add(actor); + } + + public static void AddCharacterOverride(Character character) + { + if (instance == null) return; + if (instance.characterOverrides.Contains(character)) return; + instance.characterOverrides.Add(character); + } + + public static void AddPropOverride(Prop prop) + { + if (instance == null) return; + if (instance.propOverrides.Contains(prop)) return; + instance.propOverrides.Add(prop); + } + } +} \ No newline at end of file diff --git a/Assets/External/Rokoko/Scripts/Mono/StudioManager.cs.meta b/Assets/External/Rokoko/Scripts/Mono/StudioManager.cs.meta new file mode 100644 index 00000000..797d33af --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/StudioManager.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: de63a1dd9ec769e4080fd4da352fac11 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Mono/StudioManager.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Mono/TPoseGuideGameComponent.cs b/Assets/External/Rokoko/Scripts/Mono/TPoseGuideGameComponent.cs new file mode 100644 index 00000000..13a999ac --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/TPoseGuideGameComponent.cs @@ -0,0 +1,48 @@ +using Rokoko.Helper; +using UnityEngine; +using UnityEngine.SceneManagement; + +namespace Rokoko +{ + [ExecuteInEditMode] + public class TPoseGuideGameComponent : MonoBehaviour + { + public Transform followTarget; + public Vector3 followOffset = Vector3.zero; + + private void Awake() + { + SceneManager.activeSceneChanged += SceneManager_activeSceneChanged; + +#if !UNITY_EDITOR + RokokoHelper.Destroy(this.gameObject); +#endif + } + + private void Start() + { + + } + + private void SceneManager_activeSceneChanged(Scene arg0, Scene arg1) + { +#if UNITY_EDITOR + if (!Application.isPlaying) + { + RokokoHelper.Destroy(this.gameObject); + } +#endif + } + + // Update is called once per frame + void Update() + { + this.transform.rotation = Quaternion.LookRotation(Vector3.up * -1); + + if(followTarget != null) + { + this.transform.position = followTarget.transform.position + followOffset; + } + } + } +} \ No newline at end of file diff --git a/Assets/External/Rokoko/Scripts/Mono/TPoseGuideGameComponent.cs.meta b/Assets/External/Rokoko/Scripts/Mono/TPoseGuideGameComponent.cs.meta new file mode 100644 index 00000000..daf52e20 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/TPoseGuideGameComponent.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 4296b318fcf88b240a52b1fbe7be783e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Mono/TPoseGuideGameComponent.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Mono/UI.meta b/Assets/External/Rokoko/Scripts/Mono/UI.meta new file mode 100644 index 00000000..108691ae --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/UI.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7e6ff7aa69142344db48e66a446c3b21 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/Scripts/Mono/UI/InputHierarchyRow.cs b/Assets/External/Rokoko/Scripts/Mono/UI/InputHierarchyRow.cs new file mode 100644 index 00000000..44545377 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/UI/InputHierarchyRow.cs @@ -0,0 +1,63 @@ +using Rokoko.Core; +using Rokoko.Helper; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.UI; + +namespace Rokoko.UI +{ + public class InputHierarchyRow : MonoBehaviour + { + public string profileName { get; private set; } + + [Header("Actor")] + [SerializeField] private GameObject actorPanel = null; + [SerializeField] private Image profileImage = null; + [SerializeField] private Text profileText = null; + [SerializeField] private Image faceImage = null; + [SerializeField] private Image suitImage = null; + [SerializeField] private Image leftGloveImage = null; + [SerializeField] private Image rightGloveImage = null; + [SerializeField] private Color inactiveColor = Color.gray; + + [Header("Prop")] + [SerializeField] private GameObject propPanel = null; + [SerializeField] private Image propImage = null; + [SerializeField] private Text propText = null; + + public void UpdateRow(ActorFrame actorFrame) + { + actorPanel.SetActive(true); + propPanel.SetActive(false); + + profileName = actorFrame.name; + profileImage.color = actorFrame.color.ToColor(); + profileText.text = actorFrame.name; + faceImage.color = actorFrame.meta.hasFace ? Color.white : inactiveColor; + suitImage.color = actorFrame.meta.hasBody ? Color.white : inactiveColor; + leftGloveImage.color = actorFrame.meta.hasLeftGlove ? Color.white : inactiveColor; + rightGloveImage.color = actorFrame.meta.hasRightGlove ? Color.white : inactiveColor; + } + + public void UpdateRow(CharacterFrame charFrame) + { + actorPanel.SetActive(false); + propPanel.SetActive(true); + + profileName = charFrame.name; + //propImage.color = propFrame.color.ToColor(); + propText.text = charFrame.name; + } + + public void UpdateRow(PropFrame propFrame) + { + actorPanel.SetActive(false); + propPanel.SetActive(true); + + profileName = propFrame.name; + propImage.color = propFrame.color.ToColor(); + propText.text = propFrame.name; + } + } +} \ No newline at end of file diff --git a/Assets/External/Rokoko/Scripts/Mono/UI/InputHierarchyRow.cs.meta b/Assets/External/Rokoko/Scripts/Mono/UI/InputHierarchyRow.cs.meta new file mode 100644 index 00000000..76ffe4ad --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/UI/InputHierarchyRow.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 1ad284b4954ca4e4e87c771f198afd80 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Mono/UI/InputHierarchyRow.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Mono/UI/UIHierarchyManager.cs b/Assets/External/Rokoko/Scripts/Mono/UI/UIHierarchyManager.cs new file mode 100644 index 00000000..75c2d8dc --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/UI/UIHierarchyManager.cs @@ -0,0 +1,88 @@ +using Rokoko.Core; +using Rokoko.Helper; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.UI; + +namespace Rokoko.UI +{ + public class UIHierarchyManager : MonoBehaviour + { + [SerializeField] private InputHierarchyRow rowPrefab = null; + [SerializeField] private Transform prefabContainer = null; + + private PrefabInstancer rows; + + // Start is called before the first frame update + void Start() + { + // Destroy children before PrefabInstancer creates the pool + prefabContainer.DestroyChildren(); + + rows = new PrefabInstancer(rowPrefab, prefabContainer, 3); + } + + public void UpdateHierarchy(LiveFrame_v4 dataFrame) + { + // Check if UI needs rebuild + bool forceLayoutUpdate = false; + + // Update each actor from live data + for (int i = 0; i < dataFrame.scene.actors.Length; i++) + { + ActorFrame actorFrame = dataFrame.scene.actors[i]; + string profileName = actorFrame.name; + + // If profile doesn't exist, mark for rebuild + if (forceLayoutUpdate == false && !rows.ContainsKey(profileName)) + forceLayoutUpdate = true; + + rows[profileName].UpdateRow(actorFrame); + } + + // Update each actor from live data + for (int i = 0; i < dataFrame.scene.characters.Length; i++) + { + CharacterFrame charFrame = dataFrame.scene.characters[i]; + string profileName = charFrame.name; + + // If profile doesn't exist, mark for rebuild + if (forceLayoutUpdate == false && !rows.ContainsKey(profileName)) + forceLayoutUpdate = true; + + rows[profileName].UpdateRow(charFrame); + } + + // Update each prop from live data + for (int i = 0; i < dataFrame.scene.props.Length; i++) + { + PropFrame propFrame = dataFrame.scene.props[i]; + string profileName = propFrame.name; + + // If profile doesn't exist, mark for rebuild + if (forceLayoutUpdate == false && !rows.ContainsKey(profileName)) + forceLayoutUpdate = true; + + rows[profileName].UpdateRow(propFrame); + } + + ClearUnusedInputRows(dataFrame); + + if (forceLayoutUpdate) + LayoutRebuilder.ForceRebuildLayoutImmediate(prefabContainer as RectTransform); + } + + /// + /// Remove all rows that no longer exists in live data + /// + private void ClearUnusedInputRows(LiveFrame_v4 frame) + { + foreach (InputHierarchyRow row in new List((IEnumerable)rows.Values)) + { + if (!frame.HasProfile(row.profileName) && !frame.HasProp(row.profileName) && !frame.HasCharacter(row.profileName)) + rows.Remove(row.profileName); + } + } + } +} \ No newline at end of file diff --git a/Assets/External/Rokoko/Scripts/Mono/UI/UIHierarchyManager.cs.meta b/Assets/External/Rokoko/Scripts/Mono/UI/UIHierarchyManager.cs.meta new file mode 100644 index 00000000..315d24e2 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Mono/UI/UIHierarchyManager.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 0726fb4ef719b9d46a2afcc8c682dc54 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Mono/UI/UIHierarchyManager.cs + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Plugins.meta b/Assets/External/Rokoko/Scripts/Plugins.meta new file mode 100644 index 00000000..9070f333 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bbb359d9a38c1004bbe87c4f14822488 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/Scripts/Plugins/LZ4.meta b/Assets/External/Rokoko/Scripts/Plugins/LZ4.meta new file mode 100644 index 00000000..87e98093 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Plugins/LZ4.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 26a3fe8611eb3a44aa1ae9081871b540 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android.meta b/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android.meta new file mode 100644 index 00000000..a229d9a9 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 82985f460b91d5d4ba2aa833b74fef35 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs.meta b/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs.meta new file mode 100644 index 00000000..c24562f1 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ea56c1cd6eae28e479bc6dd92c6898f0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/arm64-v8a.meta b/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/arm64-v8a.meta new file mode 100644 index 00000000..f003678e --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/arm64-v8a.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5261e97e6db9c3c49bf370285d19c389 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/arm64-v8a/liblz4.so b/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/arm64-v8a/liblz4.so new file mode 100644 index 00000000..09cf40ea --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/arm64-v8a/liblz4.so @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7059713511df34b30a9d14697602eb9e43aed0c2218fb95468e0607fd786aff7 +size 185528 diff --git a/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/arm64-v8a/liblz4.so.meta b/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/arm64-v8a/liblz4.so.meta new file mode 100644 index 00000000..3ab40b5c --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/arm64-v8a/liblz4.so.meta @@ -0,0 +1,34 @@ +fileFormatVersion: 2 +guid: 2034ecf0466b4e74f87f5c2418b9ca6a +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/arm64-v8a/liblz4.so + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/armeabi-v7a.meta b/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/armeabi-v7a.meta new file mode 100644 index 00000000..61d32574 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/armeabi-v7a.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ff5c59bfbd7cdc145932e75bd2c77813 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/armeabi-v7a/liblz4.so b/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/armeabi-v7a/liblz4.so new file mode 100644 index 00000000..d019fa11 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/armeabi-v7a/liblz4.so @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a8cf87aded6d6311fa92c5f004cd3333d66d8caf96b49cfa2f94d30e90c737b6 +size 184968 diff --git a/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/armeabi-v7a/liblz4.so.meta b/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/armeabi-v7a/liblz4.so.meta new file mode 100644 index 00000000..57ef8eea --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/armeabi-v7a/liblz4.so.meta @@ -0,0 +1,34 @@ +fileFormatVersion: 2 +guid: 64661c496f7cc0a418cbe44f3c5df8d4 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/armeabi-v7a/liblz4.so + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/x86.meta b/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/x86.meta new file mode 100644 index 00000000..57c0d572 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/x86.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fd93f2258a54c1341a561817c9d7221c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/x86/liblz4.so b/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/x86/liblz4.so new file mode 100644 index 00000000..5e8d176c --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/x86/liblz4.so @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:74b245ef940b45656ec7c53277680155a306b40ca63630ea31cf09397204c6fd +size 153592 diff --git a/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/x86/liblz4.so.meta b/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/x86/liblz4.so.meta new file mode 100644 index 00000000..df4c30c6 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/x86/liblz4.so.meta @@ -0,0 +1,34 @@ +fileFormatVersion: 2 +guid: 334dff52187feb849ab4ea932a1b7b73 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Plugins/LZ4/Android/libs/x86/liblz4.so + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Plugins/LZ4/iOS.meta b/Assets/External/Rokoko/Scripts/Plugins/LZ4/iOS.meta new file mode 100644 index 00000000..83801bf9 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Plugins/LZ4/iOS.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dd770c574097d3e4ea6aeddfb5b6da48 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/Scripts/Plugins/LZ4/iOS/liblz4.a b/Assets/External/Rokoko/Scripts/Plugins/LZ4/iOS/liblz4.a new file mode 100644 index 00000000..0f9892c9 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Plugins/LZ4/iOS/liblz4.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:45b8c1919c3591414f58a1544d947718288836f061d2bcd8c465a9ef771ca2df +size 3762480 diff --git a/Assets/External/Rokoko/Scripts/Plugins/LZ4/iOS/liblz4.a.meta b/Assets/External/Rokoko/Scripts/Plugins/LZ4/iOS/liblz4.a.meta new file mode 100644 index 00000000..45fa228a --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Plugins/LZ4/iOS/liblz4.a.meta @@ -0,0 +1,34 @@ +fileFormatVersion: 2 +guid: 8cd1870f720ab8c4c92c3ca9afc19937 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 98045 + packageName: Rokoko Live + packageVersion: 2.0.2 + assetPath: Assets/External/Rokoko/Scripts/Plugins/LZ4/iOS/liblz4.a + uploadId: 616054 diff --git a/Assets/External/Rokoko/Scripts/Plugins/LZ4/lz4.bundle.meta b/Assets/External/Rokoko/Scripts/Plugins/LZ4/lz4.bundle.meta new file mode 100644 index 00000000..d5a8d742 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Plugins/LZ4/lz4.bundle.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: be0bf098585b39345bbd41d178618e0e +folderAsset: yes +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/Scripts/Plugins/LZ4/lz4.bundle/Contents.meta b/Assets/External/Rokoko/Scripts/Plugins/LZ4/lz4.bundle/Contents.meta new file mode 100644 index 00000000..473c2ad9 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Plugins/LZ4/lz4.bundle/Contents.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6182d450d1495714b9e59291998ad771 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/Scripts/Plugins/LZ4/lz4.bundle/Contents/MacOS.meta b/Assets/External/Rokoko/Scripts/Plugins/LZ4/lz4.bundle/Contents/MacOS.meta new file mode 100644 index 00000000..50f698a7 --- /dev/null +++ b/Assets/External/Rokoko/Scripts/Plugins/LZ4/lz4.bundle/Contents/MacOS.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2ffd7822eee55dc42aeef4cb60e1f1b5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Rokoko/Scripts/Plugins/LZ4/lz4.bundle/Contents/MacOS/lz4 b/Assets/External/Rokoko/Scripts/Plugins/LZ4/lz4.bundle/Contents/MacOS/lz4 new file mode 100644 index 0000000000000000000000000000000000000000..eef5f96fa6dabbba82413cfed01ab8ffed5aeca3 GIT binary patch literal 418692 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 eJ*GCD;KVDDO+}a poseClips = new List(); + private string searchText = ""; + private bool showCreateNew = false; + private string newPoseName = "New Pose"; + + [MenuItem("Window/Animation/Human Pose Manager")] + static void ShowWindow() + { + var window = GetWindow("Human Pose Manager"); + window.Show(); + } + + void OnEnable() + { + RefreshPoseList(); + } + + void RefreshPoseList() + { + // Find all HumanPoseClip assets in the project + string[] guids = AssetDatabase.FindAssets("t:HumanPoseClip"); + poseClips = guids + .Select(guid => AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guid))) + .Where(clip => clip != null) + .ToList(); + } + + void OnGUI() + { + EditorGUILayout.Space(10); + + // Target Animator Selection + using (new EditorGUILayout.HorizontalScope()) + { + targetAnimator = (Animator)EditorGUILayout.ObjectField("Target Humanoid", targetAnimator, typeof(Animator), true); + + if (targetAnimator != lastAnimator) + { + poseHandler = null; + lastAnimator = targetAnimator; + } + } + + if (targetAnimator != null && !targetAnimator.isHuman) + { + EditorGUILayout.HelpBox("Selected animator must be humanoid!", MessageType.Warning); + return; + } + + EditorGUILayout.Space(10); + + // Search Bar + using (new EditorGUILayout.HorizontalScope()) + { + searchText = EditorGUILayout.TextField("Search", searchText, EditorStyles.toolbarSearchField); + if (GUILayout.Button("Refresh", GUILayout.Width(60))) + { + RefreshPoseList(); + } + } + + EditorGUILayout.Space(10); + + // Create New Pose Section + using (new EditorGUILayout.VerticalScope(EditorStyles.helpBox)) + { + showCreateNew = EditorGUILayout.Foldout(showCreateNew, "Create New Pose", true); + if (showCreateNew) + { + EditorGUI.indentLevel++; + newPoseName = EditorGUILayout.TextField("Pose Name", newPoseName); + + using (new EditorGUI.DisabledScope(targetAnimator == null || !targetAnimator.isHuman)) + { + if (GUILayout.Button("Capture Current Pose")) + { + CreateNewPoseFromCurrent(); + } + } + EditorGUI.indentLevel--; + } + } + + EditorGUILayout.Space(10); + + // Pose List + EditorGUILayout.LabelField("Available Poses", EditorStyles.boldLabel); + scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition); + + var filteredPoses = poseClips + .Where(p => string.IsNullOrEmpty(searchText) || + p.name.ToLower().Contains(searchText.ToLower())) + .ToList(); + + foreach (var pose in filteredPoses) + { + DrawPoseEntry(pose); + } + + EditorGUILayout.EndScrollView(); + } + + void DrawPoseEntry(HumanPoseClip pose) + { + using (new EditorGUILayout.VerticalScope(EditorStyles.helpBox)) + { + // Pose name and buttons + using (new EditorGUILayout.HorizontalScope()) + { + EditorGUILayout.LabelField(pose.name, EditorStyles.boldLabel); + + using (new EditorGUI.DisabledScope(targetAnimator == null || !targetAnimator.isHuman)) + { + if (GUILayout.Button("Apply", GUILayout.Width(60))) + { + ApplyPose(pose); + } + if (GUILayout.Button("Update", GUILayout.Width(60))) + { + UpdatePose(pose); + } + } + + if (GUILayout.Button("Select", GUILayout.Width(60))) + { + Selection.activeObject = pose; + } + } + } + } + + void CreateNewPoseFromCurrent() + { + if (targetAnimator == null || !targetAnimator.isHuman) return; + + // Ensure animator is properly initialized + PrepareAnimator(); + + // Create new pose asset + var newPose = CreateInstance(); + + // Capture current pose + CreatePoseHandler(); + + var pose = new HumanPose(); + poseHandler.GetHumanPose(ref pose); + newPose.ApplyPose(ref pose); + + // Save asset + string path = EditorUtility.SaveFilePanel( + "Save Pose Asset", + "Assets", + newPoseName + ".asset", + "asset" + ); + + if (string.IsNullOrEmpty(path)) return; + + path = FileUtil.GetProjectRelativePath(path); + AssetDatabase.CreateAsset(newPose, path); + AssetDatabase.SaveAssets(); + + RefreshPoseList(); + newPoseName = "New Pose"; + } + + void ApplyPose(HumanPoseClip clip) + { + if (targetAnimator == null || !targetAnimator.isHuman) return; + + // Ensure animator is properly initialized + PrepareAnimator(); + + // Record undo before applying + Undo.RegisterFullObjectHierarchyUndo(targetAnimator.gameObject, "Apply Pose"); + + CreatePoseHandler(); + + var pose = clip.GetPose(); + + // Apply the pose + poseHandler.SetHumanPose(ref pose); + + // Force update the animator + ForceAnimatorUpdate(); + + EditorUtility.SetDirty(targetAnimator.gameObject); + SceneView.RepaintAll(); + } + + void UpdatePose(HumanPoseClip clip) + { + if (targetAnimator == null || !targetAnimator.isHuman) return; + + // Ensure animator is properly initialized + PrepareAnimator(); + + CreatePoseHandler(); + + var pose = new HumanPose(); + poseHandler.GetHumanPose(ref pose); + + Undo.RecordObject(clip, "Update Pose"); + clip.ApplyPose(ref pose); + EditorUtility.SetDirty(clip); + AssetDatabase.SaveAssets(); + } + + void PrepareAnimator() + { + if (targetAnimator == null) return; + + // Ensure the animator is enabled and active + targetAnimator.enabled = true; + + // Force animator to update + targetAnimator.Rebind(); + targetAnimator.Update(0); + } + + void CreatePoseHandler() + { + if (poseHandler == null) + { + poseHandler = new HumanPoseHandler(targetAnimator.avatar, targetAnimator.transform); + } + } + + void ForceAnimatorUpdate() + { + if (targetAnimator == null) return; + + // Force the animator to update its internal state + targetAnimator.Update(0); + + // Also update the transform hierarchy + targetAnimator.transform.hasChanged = true; + + // Force a physics update if needed + if (targetAnimator.updateMode == AnimatorUpdateMode.Fixed) + { + targetAnimator.Update(Time.fixedDeltaTime); + } + } + } +} \ No newline at end of file diff --git a/Assets/External/UniGLTF/Editor/UniHumanoid/HumanPoseWindow.cs.meta b/Assets/External/UniGLTF/Editor/UniHumanoid/HumanPoseWindow.cs.meta new file mode 100644 index 00000000..56268420 --- /dev/null +++ b/Assets/External/UniGLTF/Editor/UniHumanoid/HumanPoseWindow.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: faaa48d88f3baf94b89ba5238f36d967 \ No newline at end of file diff --git a/Assets/Scripts/KindRetargeting/CustomRetargetingScript.cs b/Assets/Scripts/KindRetargeting/CustomRetargetingScript.cs index ebecf14a..9b2a5afb 100644 --- a/Assets/Scripts/KindRetargeting/CustomRetargetingScript.cs +++ b/Assets/Scripts/KindRetargeting/CustomRetargetingScript.cs @@ -943,7 +943,7 @@ namespace KindRetargeting /// 지정된 Animator의 포즈를 T-포즈로 설정합니다. /// /// T-포즈를 설정할 Animator - public static void SetTPose(Animator animator) + public void SetTPose(Animator animator) { if (animator == null || animator.avatar == null) return; @@ -957,6 +957,16 @@ namespace KindRetargeting { var pose = humanPoseClip.GetPose(); HumanPoseTransfer.SetPose(avatar, transform, pose); + + // 소스 아바타의 UpperChest 본 로컬 포지션 초기화 + if (animator == sourceAnimator) + { + Transform upperChest = animator.GetBoneTransform(HumanBodyBones.UpperChest); + if (upperChest != null) + { + upperChest.localPosition = Vector3.zero; + } + } } else { @@ -1054,16 +1064,21 @@ namespace KindRetargeting return; } - sourceAnimator.transform.localRotation = new Quaternion(0, 0, 0, 0); - - // T-포즈로 복 + // T-포즈로 복원 SetTPose(sourceAnimator); SetTPose(targetAnimator); + // 소스 아바타의 UpperChest 본 로컬 포지션 초기화 + Transform upperChest = sourceAnimator.GetBoneTransform(HumanBodyBones.UpperChest); + if (upperChest != null) + { + upperChest.localPosition = Vector3.zero; + } + // HumanPoseHandler 초기화 InitializeHumanPoseHandlers(); - // 회전 오프셋 로 계산 + // 회전 오프셋 다시 계산 CalculateRotationOffsets(); Debug.Log("포즈와 회전 오프셋이 재설정되었습니다."); diff --git a/Assets/Scripts/KindRetargeting/Editor/LimbWeightControllerEditor.cs b/Assets/Scripts/KindRetargeting/Editor/LimbWeightControllerEditor.cs index 8db94858..8229cfc4 100644 --- a/Assets/Scripts/KindRetargeting/Editor/LimbWeightControllerEditor.cs +++ b/Assets/Scripts/KindRetargeting/Editor/LimbWeightControllerEditor.cs @@ -18,6 +18,8 @@ namespace KindRetargeting SerializedProperty groundHipsMaxHeight; SerializedProperty footHeightMinThreshold; SerializedProperty footHeightMaxThreshold; + SerializedProperty enableLeftArmIK; + SerializedProperty enableRightArmIK; private bool showDistanceSettings = true; private bool showWeightSettings = true; @@ -25,6 +27,7 @@ namespace KindRetargeting private bool showReferences = true; private bool showGroundHipsSettings = true; private bool showFootHeightSettings = true; + private bool showIKActivationSettings = true; protected override void OnEnable() { @@ -45,6 +48,8 @@ namespace KindRetargeting groundHipsMaxHeight = serializedObject.FindProperty("groundHipsMaxHeight"); footHeightMinThreshold = serializedObject.FindProperty("footHeightMinThreshold"); footHeightMaxThreshold = serializedObject.FindProperty("footHeightMaxThreshold"); + enableLeftArmIK = serializedObject.FindProperty("enableLeftArmIK"); + enableRightArmIK = serializedObject.FindProperty("enableRightArmIK"); } } @@ -59,6 +64,16 @@ namespace KindRetargeting EditorGUILayout.Space(10); GUI.backgroundColor = new Color(0.8f, 0.9f, 1f); + showIKActivationSettings = EditorGUILayout.Foldout(showIKActivationSettings, "IK 활성화 설정", true); + if (showIKActivationSettings) + { + EditorGUI.indentLevel++; + EditorGUILayout.PropertyField(enableLeftArmIK, new GUIContent("왼팔 IK 활성화")); + EditorGUILayout.PropertyField(enableRightArmIK, new GUIContent("오른팔 IK 활성화")); + EditorGUI.indentLevel--; + } + + EditorGUILayout.Space(5); showDistanceSettings = EditorGUILayout.Foldout(showDistanceSettings, "거리 기반 가중치 설정", true); if (showDistanceSettings) { diff --git a/Assets/Scripts/KindRetargeting/LimbWeightController.cs b/Assets/Scripts/KindRetargeting/LimbWeightController.cs index 7221f485..8f07d12e 100644 --- a/Assets/Scripts/KindRetargeting/LimbWeightController.cs +++ b/Assets/Scripts/KindRetargeting/LimbWeightController.cs @@ -28,6 +28,10 @@ namespace KindRetargeting [SerializeField, Range(0.1f, 0.5f)] public float footHeightMinThreshold = 0.2f; // 최소 높이 (가중치 1) [SerializeField, Range(0.5f, 1.0f)] public float footHeightMaxThreshold = 0.5f; // 최대 높이 (가중치 0) + [Header("IK 활성화 설정")] + [SerializeField] public bool enableLeftArmIK = true; // 왼팔 IK 활성화 여부 + [SerializeField] public bool enableRightArmIK = true; // 오른팔 IK 활성화 여부 + private FullBodyInverseKinematics_RND fbik; private CustomRetargetingScript crs; @@ -418,12 +422,13 @@ namespace KindRetargeting { if (fbik.solver.leftArm.target != null) { - fbik.solver.leftArm.positionWeight = MasterleftArmEndWeights; - fbik.solver.leftArm.rotationWeight = MasterleftArmEndWeights; + float finalLeftArmWeight = enableLeftArmIK ? MasterleftArmEndWeights : 0f; + fbik.solver.leftArm.positionWeight = finalLeftArmWeight; + fbik.solver.leftArm.rotationWeight = finalLeftArmWeight; } if (fbik.solver.leftArm.bendGoal != null) - fbik.solver.leftArm.bendGoalWeight = MasterleftArmEndWeights; + fbik.solver.leftArm.bendGoalWeight = enableLeftArmIK ? MasterleftArmEndWeights : 0f; } // 오른쪽 팔 가중치 적용 @@ -431,12 +436,13 @@ namespace KindRetargeting { if (fbik.solver.rightArm.target != null) { - fbik.solver.rightArm.positionWeight = MasterrightArmEndWeights; - fbik.solver.rightArm.rotationWeight = MasterrightArmEndWeights; + float finalRightArmWeight = enableRightArmIK ? MasterrightArmEndWeights : 0f; + fbik.solver.rightArm.positionWeight = finalRightArmWeight; + fbik.solver.rightArm.rotationWeight = finalRightArmWeight; } if (fbik.solver.rightArm.bendGoal != null) - fbik.solver.rightArm.bendGoalWeight = MasterrightArmEndWeights; + fbik.solver.rightArm.bendGoalWeight = enableRightArmIK ? MasterrightArmEndWeights : 0f; } // 왼쪽 다리 가중치 적용 diff --git a/Assets/Scripts/KindRetargeting/PropLocationController.cs b/Assets/Scripts/KindRetargeting/PropLocationController.cs index 0455ae72..b6048dfb 100644 --- a/Assets/Scripts/KindRetargeting/PropLocationController.cs +++ b/Assets/Scripts/KindRetargeting/PropLocationController.cs @@ -1,5 +1,6 @@ using UnityEngine; using System.Collections.Generic; +using UniHumanoid; namespace KindRetargeting { @@ -22,10 +23,30 @@ namespace KindRetargeting CreateTargets(); } + public void SetTPose(Animator animator) + { + if (animator == null || animator.avatar == null) + return; + + Avatar avatar = animator.avatar; + Transform transform = animator.transform; + + // HumanPoseClip에 저장된 T-포즈 데이터를 로드하여 적용 + var humanPoseClip = Resources.Load(HumanPoseClip.TPoseResourcePath); + if (humanPoseClip != null) + { + var pose = humanPoseClip.GetPose(); + HumanPoseTransfer.SetPose(avatar, transform, pose); + } + else + { + Debug.LogWarning("T-Pose 데이터가 존재하지 않습니다."); + } + } private void CreateTargets() { Animator animator = GetComponent(); - KindRetargeting.CustomRetargetingScript.SetTPose(animator); + SetTPose(animator); // 왼손 타겟 및 오프셋 설정 Transform leftHandBone = animator.GetBoneTransform(HumanBodyBones.LeftHand); @@ -36,12 +57,12 @@ namespace KindRetargeting leftTarget.transform.parent = leftHandBone; // 왼손 본에 직접 부모 설정 leftHandTargetOffset.target = leftTarget.transform; leftTarget.transform.position = leftHandBone.position + new Vector3(-0.039f, -0.022f, 0f); - leftTarget.transform.rotation = Quaternion.Euler( 90f, 0f, 0f); - + leftTarget.transform.rotation = Quaternion.Euler(90f, 0f, 0f); + GameObject leftOffset = new GameObject("Left_Hand_Offset"); leftOffset.transform.parent = leftTarget.transform; leftHandTargetOffset.offset = leftOffset.transform; - + // 로컬 포지션과 로테이션 설정 leftHandTargetOffset.offset.localPosition = Vector3.zero; leftHandTargetOffset.offset.localRotation = Quaternion.identity; @@ -57,11 +78,11 @@ namespace KindRetargeting rightHandTargetOffset.target = rightTarget.transform; rightTarget.transform.position = rightHandBone.position + new Vector3(0.039f, -0.022f, 0f); rightTarget.transform.rotation = Quaternion.Euler(90f, 0f, 0f); - + GameObject rightOffset = new GameObject("Right_Hand_Offset"); rightOffset.transform.parent = rightTarget.transform; rightHandTargetOffset.offset = rightOffset.transform; - + // 로컬 포지션과 로테이션 설정 rightHandTargetOffset.offset.localPosition = Vector3.zero; rightHandTargetOffset.offset.localRotation = Quaternion.identity; @@ -77,11 +98,11 @@ namespace KindRetargeting headTargetOffset.target = headTarget.transform; headTarget.transform.position = headBone.position + new Vector3(0f, 0.16f, 0f); headTarget.transform.rotation = Quaternion.Euler(0f, 0f, 0f); - + GameObject headOffset = new GameObject("Head_Offset"); headOffset.transform.parent = headTarget.transform; headTargetOffset.offset = headOffset.transform; - + // 기본 오프셋 설정 headTargetOffset.offset.localPosition = Vector3.zero; headTargetOffset.offset.localRotation = Quaternion.identity;