From 2d81882c7746fa09a51041460265c1b73d35971f Mon Sep 17 00:00:00 2001 From: KINDNICK <68893236+KINDNICK@users.noreply.github.com> Date: Thu, 21 Aug 2025 02:30:35 +0900 Subject: [PATCH] =?UTF-8?q?Add=20:=20=EC=98=B5=ED=8B=B0=ED=8A=B8=EB=9E=99?= =?UTF-8?q?=20=EC=9E=A5=EA=B0=91=20=EC=8B=9C=EC=8A=A4=ED=85=9C=20=EA=B5=AC?= =?UTF-8?q?=EC=B6=95=EC=97=90=20=ED=95=84=EC=9A=94=ED=95=9C=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Optitrack Rokoko Glove/.vscode/settings.json | 3 + .../ExampleGloveAdapterSingleton.cpp | 282 ++ .../ExampleGloveAdapterSingleton.h | 159 + .../GloveDeviceExample/ExampleGloveData.csv | 3 + .../GloveDeviceExample/ExampleGloveDevice.cpp | 311 ++ .../GloveDeviceExample/ExampleGloveDevice.h | 86 + .../GloveDeviceExample/GloveDataFormat.h | 83 + .../GloveDeviceExample/GloveDeviceBase.cpp | 258 ++ .../GloveDeviceExample/GloveDeviceBase.h | 180 ++ .../GloveDeviceExample.vcxproj | 135 + .../GloveDeviceExample.vcxproj.filters | 60 + .../GloveDeviceExample/HardwareSimulator.cpp | 185 ++ .../GloveDeviceExample/HardwareSimulator.h | 111 + .../GloveDeviceExample/dllcommon.h | 12 + .../GloveDeviceExample/dllmain.cpp | 103 + .../GloveDeviceExample/readme.txt | 3 + .../x64/Debug/GloveDeviceExample.dll.recipe | 11 + ...DeviceExample.vcxproj.FileListAbsolute.txt | 0 .../Rokoko Unity Scripts/Core.meta | 8 + .../Core/ARKitBlendshapes.cs | 66 + .../Core/ARKitBlendshapes.cs.meta | 11 + .../Rokoko Unity Scripts/Core/CommandAPI.meta | 9 + .../Core/CommandAPI/CalibrateRequestData.cs | 63 + .../CommandAPI/CalibrateRequestData.cs.meta | 11 + .../Core/CommandAPI/InfoRequestData.cs | 30 + .../Core/CommandAPI/InfoRequestData.cs.meta | 11 + .../Core/CommandAPI/LivestreamRequestData.cs | 23 + .../CommandAPI/LivestreamRequestData.cs.meta | 11 + .../Core/CommandAPI/PlaybackRequestData.cs | 43 + .../CommandAPI/PlaybackRequestData.cs.meta | 11 + .../Core/CommandAPI/RecordingRequestData.cs | 30 + .../CommandAPI/RecordingRequestData.cs.meta | 11 + .../Core/CommandAPI/RequestData.cs | 21 + .../Core/CommandAPI/RequestData.cs.meta | 3 + .../Core/CommandAPI/ResetActorRequestData.cs | 21 + .../CommandAPI/ResetActorRequestData.cs.meta | 11 + .../Core/CommandAPI/StudioCommandAPI.cs | 188 ++ .../Core/CommandAPI/StudioCommandAPI.cs.meta | 3 + .../Core/CommandAPI/StudioCommandAPIBase.cs | 151 + .../CommandAPI/StudioCommandAPIBase.cs.meta | 3 + .../Core/CommandAPI/TrackerRequestData.cs | 75 + .../CommandAPI/TrackerRequestData.cs.meta | 11 + .../Core/JsonLiveSerializerV3.cs | 266 ++ .../Core/JsonLiveSerializerV3.cs.meta | 11 + .../Rokoko Unity Scripts/Core/LZ4Wrapper.cs | 79 + .../Core/LZ4Wrapper.cs.meta | 11 + .../Core/StudioReceiver.cs | 68 + .../Core/StudioReceiver.cs.meta | 11 + .../Rokoko Unity Scripts/Core/UDPReceiver.cs | 109 + .../Core/UDPReceiver.cs.meta | 11 + .../Rokoko Unity Scripts/Mono.meta | 8 + .../Rokoko Unity Scripts/Mono/Inputs.meta | 8 + .../Rokoko Unity Scripts/Mono/Inputs/Actor.cs | 397 +++ .../Mono/Inputs/Actor.cs.meta | 11 + .../Mono/Inputs/ActorNewton.cs | 91 + .../Mono/Inputs/ActorNewton.cs.meta | 11 + .../Mono/Inputs/BlendShapesMapping.cs | 13 + .../Mono/Inputs/BlendShapesMapping.cs.meta | 11 + .../Mono/Inputs/Character.cs | 183 ++ .../Mono/Inputs/Character.cs.meta | 11 + .../Rokoko Unity Scripts/Mono/Inputs/Face.cs | 111 + .../Mono/Inputs/Face.cs.meta | 11 + .../Mono/Inputs/HumanBoneMapping.cs | 11 + .../Mono/Inputs/HumanBoneMapping.cs.meta | 11 + .../Rokoko Unity Scripts/Mono/Inputs/Prop.cs | 42 + .../Mono/Inputs/Prop.cs.meta | 11 + .../Mono/Inputs/PropColor.cs | 21 + .../Mono/Inputs/PropColor.cs.meta | 11 + .../Mono/PrefabInstancer.cs | 46 + .../Mono/PrefabInstancer.cs.meta | 11 + .../Rokoko Unity Scripts/Mono/PrefabPool.cs | 53 + .../Mono/PrefabPool.cs.meta | 11 + .../Rokoko Unity Scripts/Mono/RokokoHelper.cs | 344 +++ .../Mono/RokokoHelper.cs.meta | 11 + .../Mono/Serializable.meta | 8 + .../Serializable/BlendshapesDictionary.cs | 7 + .../BlendshapesDictionary.cs.meta | 11 + .../Mono/Serializable/HumanTPoseDictionary.cs | 8 + .../Serializable/HumanTPoseDictionary.cs.meta | 11 + .../Serializable/SerializableDictionary.cs | 63 + .../SerializableDictionary.cs.meta | 11 + .../Mono/StudioManager.cs | 342 +++ .../Mono/StudioManager.cs.meta | 11 + .../Mono/TPoseGuideGameComponent.cs | 48 + .../Mono/TPoseGuideGameComponent.cs.meta | 11 + .../Rokoko Unity Scripts/Mono/UI.meta | 8 + .../Mono/UI/InputHierarchyRow.cs | 63 + .../Mono/UI/InputHierarchyRow.cs.meta | 11 + .../Mono/UI/UIHierarchyManager.cs | 88 + .../Mono/UI/UIHierarchyManager.cs.meta | 11 + .../Rokoko Unity Scripts/Plugins.meta | 8 + .../Rokoko Unity Scripts/Plugins/LZ4.meta | 8 + .../Plugins/LZ4/Android.meta | 8 + .../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 | 27 + .../Plugins/LZ4/Android/libs/armeabi-v7a.meta | 8 + .../LZ4/Android/libs/armeabi-v7a/liblz4.so | 3 + .../Android/libs/armeabi-v7a/liblz4.so.meta | 27 + .../Plugins/LZ4/Android/libs/x86.meta | 8 + .../Plugins/LZ4/Android/libs/x86/liblz4.so | 3 + .../LZ4/Android/libs/x86/liblz4.so.meta | 27 + .../Rokoko Unity Scripts/Plugins/LZ4/iOS.meta | 8 + .../Plugins/LZ4/iOS/liblz4.a | 3 + .../Plugins/LZ4/iOS/liblz4.a.meta | 27 + .../Plugins/LZ4/lz4.bundle.meta | 33 + .../LZ4/lz4.bundle/Contents/Info.plist | 46 + .../Plugins/LZ4/lz4.bundle/Contents/MacOS/lz4 | Bin 0 -> 388992 bytes .../Contents/_CodeSignature/CodeResources | 115 + .../Plugins/LZ4/x86_64.meta | 8 + .../Plugins/LZ4/x86_64/lz4.dll | 3 + .../Plugins/LZ4/x86_64/lz4.dll.meta | 27 + .../RokokoAssembly.asmdef | 3 + .../RokokoAssembly.asmdef.meta | 7 + .../ExampleGloveAdapterSingleton.cpp | 733 +++++ .../ExampleGloveAdapterSingleton.h | 227 ++ .../RokokoGloveDevice/ExampleGloveData.csv | 3 + .../RokokoGloveDevice/ExampleGloveDevice.cpp | 311 ++ .../RokokoGloveDevice/ExampleGloveDevice.h | 86 + .../RokokoGloveDevice/GloveDataFormat.h | 83 + .../RokokoGloveDevice/GloveDeviceBase.cpp | 258 ++ .../RokokoGloveDevice/GloveDeviceBase.h | 180 ++ .../RokokoGloveDevice/HardwareSimulator.cpp | 185 ++ .../RokokoGloveDevice/HardwareSimulator.h | 111 + .../RokokoGloveDevice/LZ4Wrapper.cpp | 100 + .../RokokoGloveDevice/LZ4Wrapper.h | 56 + .../RokokoGloveDevice/RokokoData.h | 116 + .../RokokoGloveDevice/RokokoDataConverter.cpp | 213 ++ .../RokokoGloveDevice/RokokoDataConverter.h | 116 + .../RokokoGloveDevice/RokokoDataParser.cpp | 225 ++ .../RokokoGloveDevice/RokokoDataParser.h | 85 + .../RokokoGloveDevice.vcxproj | 149 + .../RokokoGloveDevice.vcxproj.filters | 90 + .../RokokoGloveDevice/RokokoUDPReceiver.cpp | 254 ++ .../RokokoGloveDevice/RokokoUDPReceiver.h | 139 + .../RokokoGloveDevice/dllcommon.h | 12 + .../RokokoGloveDevice/dllmain.cpp | 103 + .../RokokoGloveDevice/lz4.c | 2722 +++++++++++++++++ .../RokokoGloveDevice/lz4.h | 842 +++++ .../RokokoGloveDevice/lz4.zip | 3 + .../RokokoGloveDevice/readme.txt | 3 + .../Debug/ExampleGloveAdapterSingleton.obj | 3 + .../x64/Debug/ExampleGloveDevice.obj | 3 + .../x64/Debug/GloveDeviceBase.obj | 3 + .../x64/Debug/LZ4Wrapper.obj | 3 + .../x64/Debug/RokokoDataConverter.obj | 3 + .../x64/Debug/RokokoDataParser.obj | 3 + .../RokokoGl.513E58BC.tlog/CL.command.1.tlog | Bin 0 -> 11178 bytes .../RokokoGl.513E58BC.tlog/CL.read.1.tlog | Bin 0 -> 244130 bytes .../RokokoGl.513E58BC.tlog/CL.write.1.tlog | Bin 0 -> 8194 bytes .../CopyFile.command.1.tlog | 2 + .../CopyFile.read.1.tlog | 1 + .../CopyFile.write.1.tlog | 2 + .../RokokoGloveDevice.lastbuildstate | 2 + .../RokokoGloveDevice.write.1u.tlog | Bin 0 -> 622 bytes .../link.command.1.tlog | Bin 0 -> 4442 bytes .../RokokoGl.513E58BC.tlog/link.read.1.tlog | Bin 0 -> 8270 bytes .../RokokoGl.513E58BC.tlog/link.write.1.tlog | Bin 0 -> 2684 bytes .../x64/Debug/RokokoGloveDevice.dll.recipe | 11 + .../x64/Debug/RokokoGloveDevice.ilk | Bin 0 -> 3417520 bytes ...koGloveDevice.vcxproj.FileListAbsolute.txt | 0 .../x64/Debug/RokokoUDPReceiver.obj | 3 + .../RokokoGloveDevice/x64/Debug/dllmain.obj | 3 + .../RokokoGloveDevice/x64/Debug/lz4.obj | 3 + .../RokokoGloveDevice/x64/Debug/vc142.idb | Bin 0 -> 617472 bytes .../SimpleDeviceExample/ExampleDevice.cpp | 337 ++ .../SimpleDeviceExample/ExampleDevice.h | 82 + .../SimpleDeviceExample.vcxproj | 119 + .../SimpleDeviceExample.vcxproj.filters | 36 + .../SimpleDeviceExample/dllcommon.h | 12 + .../SimpleDeviceExample/dllmain.cpp | 94 + .../SimpleDeviceExample/readme.txt | 3 + .../x64/Debug/ExampleDevice.obj | 3 + .../SimpleDe.CBF66948.tlog/CL.command.1.tlog | Bin 0 -> 2426 bytes .../SimpleDe.CBF66948.tlog/CL.read.1.tlog | Bin 0 -> 58472 bytes .../SimpleDe.CBF66948.tlog/CL.write.1.tlog | Bin 0 -> 1718 bytes .../SimpleDeviceExample.lastbuildstate | 2 + .../SimpleDeviceExample.write.1u.tlog | Bin 0 -> 638 bytes .../link.command.1.tlog | Bin 0 -> 2382 bytes .../SimpleDe.CBF66948.tlog/link.read.1.tlog | Bin 0 -> 4910 bytes .../SimpleDe.CBF66948.tlog/link.write.1.tlog | Bin 0 -> 1096 bytes .../SimpleDe.CBF66948.tlog/unsuccessfulbuild | 0 .../x64/Debug/SimpleDeviceExample.dll.recipe | 11 + .../x64/Debug/SimpleDeviceExample.ilk | Bin 0 -> 1057968 bytes ...DeviceExample.vcxproj.FileListAbsolute.txt | 0 .../SimpleDeviceExample/x64/Debug/dllmain.obj | 3 + .../SimpleDeviceExample/x64/Debug/vc142.idb | Bin 0 -> 453632 bytes .../x64/Debug/ExampleGloveData.csv | 3 + .../x64/Debug/GloveDeviceExample.exp | Bin 0 -> 1088 bytes .../x64/Debug/GloveDeviceExample.lib | Bin 0 -> 2412 bytes .../x64/Debug/RokokoGloveDevice.dll | 3 + .../x64/Debug/RokokoGloveDevice.exp | Bin 0 -> 1114 bytes .../x64/Debug/RokokoGloveDevice.lib | Bin 0 -> 2394 bytes .../x64/Debug/SimpleDeviceExample.dll | 3 + .../x64/Debug/SimpleDeviceExample.exp | Bin 0 -> 1120 bytes .../x64/Debug/SimpleDeviceExample.lib | Bin 0 -> 2424 bytes 197 files changed, 14124 insertions(+) create mode 100644 Optitrack Rokoko Glove/.vscode/settings.json create mode 100644 Optitrack Rokoko Glove/GloveDeviceExample/ExampleGloveAdapterSingleton.cpp create mode 100644 Optitrack Rokoko Glove/GloveDeviceExample/ExampleGloveAdapterSingleton.h create mode 100644 Optitrack Rokoko Glove/GloveDeviceExample/ExampleGloveData.csv create mode 100644 Optitrack Rokoko Glove/GloveDeviceExample/ExampleGloveDevice.cpp create mode 100644 Optitrack Rokoko Glove/GloveDeviceExample/ExampleGloveDevice.h create mode 100644 Optitrack Rokoko Glove/GloveDeviceExample/GloveDataFormat.h create mode 100644 Optitrack Rokoko Glove/GloveDeviceExample/GloveDeviceBase.cpp create mode 100644 Optitrack Rokoko Glove/GloveDeviceExample/GloveDeviceBase.h create mode 100644 Optitrack Rokoko Glove/GloveDeviceExample/GloveDeviceExample.vcxproj create mode 100644 Optitrack Rokoko Glove/GloveDeviceExample/GloveDeviceExample.vcxproj.filters create mode 100644 Optitrack Rokoko Glove/GloveDeviceExample/HardwareSimulator.cpp create mode 100644 Optitrack Rokoko Glove/GloveDeviceExample/HardwareSimulator.h create mode 100644 Optitrack Rokoko Glove/GloveDeviceExample/dllcommon.h create mode 100644 Optitrack Rokoko Glove/GloveDeviceExample/dllmain.cpp create mode 100644 Optitrack Rokoko Glove/GloveDeviceExample/readme.txt create mode 100644 Optitrack Rokoko Glove/GloveDeviceExample/x64/Debug/GloveDeviceExample.dll.recipe create mode 100644 Optitrack Rokoko Glove/GloveDeviceExample/x64/Debug/GloveDeviceExample.vcxproj.FileListAbsolute.txt create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Core.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/ARKitBlendshapes.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/ARKitBlendshapes.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/CalibrateRequestData.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/CalibrateRequestData.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/InfoRequestData.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/InfoRequestData.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/LivestreamRequestData.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/LivestreamRequestData.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/PlaybackRequestData.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/PlaybackRequestData.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/RecordingRequestData.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/RecordingRequestData.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/RequestData.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/RequestData.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/ResetActorRequestData.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/ResetActorRequestData.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/StudioCommandAPI.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/StudioCommandAPI.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/StudioCommandAPIBase.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/StudioCommandAPIBase.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/TrackerRequestData.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/TrackerRequestData.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/JsonLiveSerializerV3.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/JsonLiveSerializerV3.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/LZ4Wrapper.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/LZ4Wrapper.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/StudioReceiver.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/StudioReceiver.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/UDPReceiver.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/UDPReceiver.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/Actor.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/Actor.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/ActorNewton.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/ActorNewton.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/BlendShapesMapping.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/BlendShapesMapping.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/Character.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/Character.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/Face.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/Face.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/HumanBoneMapping.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/HumanBoneMapping.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/Prop.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/Prop.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/PropColor.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/PropColor.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/PrefabInstancer.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/PrefabInstancer.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/PrefabPool.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/PrefabPool.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/RokokoHelper.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/RokokoHelper.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Serializable.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Serializable/BlendshapesDictionary.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Serializable/BlendshapesDictionary.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Serializable/HumanTPoseDictionary.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Serializable/HumanTPoseDictionary.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Serializable/SerializableDictionary.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Serializable/SerializableDictionary.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/StudioManager.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/StudioManager.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/TPoseGuideGameComponent.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/TPoseGuideGameComponent.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/UI.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/UI/InputHierarchyRow.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/UI/InputHierarchyRow.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/UI/UIHierarchyManager.cs create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/UI/UIHierarchyManager.cs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs/arm64-v8a.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs/arm64-v8a/liblz4.so create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs/arm64-v8a/liblz4.so.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs/armeabi-v7a.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs/armeabi-v7a/liblz4.so create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs/armeabi-v7a/liblz4.so.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs/x86.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs/x86/liblz4.so create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs/x86/liblz4.so.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/iOS.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/iOS/liblz4.a create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/iOS/liblz4.a.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/lz4.bundle.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/lz4.bundle/Contents/Info.plist create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/lz4.bundle/Contents/MacOS/lz4 create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/lz4.bundle/Contents/_CodeSignature/CodeResources create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/x86_64.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/x86_64/lz4.dll create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/x86_64/lz4.dll.meta create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/RokokoAssembly.asmdef create mode 100644 Optitrack Rokoko Glove/Rokoko Unity Scripts/RokokoAssembly.asmdef.meta create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/ExampleGloveAdapterSingleton.cpp create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/ExampleGloveAdapterSingleton.h create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/ExampleGloveData.csv create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/ExampleGloveDevice.cpp create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/ExampleGloveDevice.h create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/GloveDataFormat.h create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/GloveDeviceBase.cpp create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/GloveDeviceBase.h create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/HardwareSimulator.cpp create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/HardwareSimulator.h create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/LZ4Wrapper.cpp create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/LZ4Wrapper.h create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/RokokoData.h create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/RokokoDataConverter.cpp create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/RokokoDataConverter.h create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/RokokoDataParser.cpp create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/RokokoDataParser.h create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/RokokoGloveDevice.vcxproj create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/RokokoGloveDevice.vcxproj.filters create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/RokokoUDPReceiver.cpp create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/RokokoUDPReceiver.h create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/dllcommon.h create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/dllmain.cpp create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/lz4.c create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/lz4.h create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/lz4.zip create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/readme.txt create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/ExampleGloveAdapterSingleton.obj create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/ExampleGloveDevice.obj create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/GloveDeviceBase.obj create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/LZ4Wrapper.obj create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoDataConverter.obj create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoDataParser.obj create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/CL.command.1.tlog create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/CL.read.1.tlog create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/CL.write.1.tlog create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/CopyFile.command.1.tlog create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/CopyFile.read.1.tlog create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/CopyFile.write.1.tlog create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/RokokoGloveDevice.lastbuildstate create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/RokokoGloveDevice.write.1u.tlog create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/link.command.1.tlog create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/link.read.1.tlog create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/link.write.1.tlog create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGloveDevice.dll.recipe create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGloveDevice.ilk create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGloveDevice.vcxproj.FileListAbsolute.txt create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoUDPReceiver.obj create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/dllmain.obj create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/lz4.obj create mode 100644 Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/vc142.idb create mode 100644 Optitrack Rokoko Glove/SimpleDeviceExample/ExampleDevice.cpp create mode 100644 Optitrack Rokoko Glove/SimpleDeviceExample/ExampleDevice.h create mode 100644 Optitrack Rokoko Glove/SimpleDeviceExample/SimpleDeviceExample.vcxproj create mode 100644 Optitrack Rokoko Glove/SimpleDeviceExample/SimpleDeviceExample.vcxproj.filters create mode 100644 Optitrack Rokoko Glove/SimpleDeviceExample/dllcommon.h create mode 100644 Optitrack Rokoko Glove/SimpleDeviceExample/dllmain.cpp create mode 100644 Optitrack Rokoko Glove/SimpleDeviceExample/readme.txt create mode 100644 Optitrack Rokoko Glove/SimpleDeviceExample/x64/Debug/ExampleDevice.obj create mode 100644 Optitrack Rokoko Glove/SimpleDeviceExample/x64/Debug/SimpleDe.CBF66948.tlog/CL.command.1.tlog create mode 100644 Optitrack Rokoko Glove/SimpleDeviceExample/x64/Debug/SimpleDe.CBF66948.tlog/CL.read.1.tlog create mode 100644 Optitrack Rokoko Glove/SimpleDeviceExample/x64/Debug/SimpleDe.CBF66948.tlog/CL.write.1.tlog create mode 100644 Optitrack Rokoko Glove/SimpleDeviceExample/x64/Debug/SimpleDe.CBF66948.tlog/SimpleDeviceExample.lastbuildstate create mode 100644 Optitrack Rokoko Glove/SimpleDeviceExample/x64/Debug/SimpleDe.CBF66948.tlog/SimpleDeviceExample.write.1u.tlog create mode 100644 Optitrack Rokoko Glove/SimpleDeviceExample/x64/Debug/SimpleDe.CBF66948.tlog/link.command.1.tlog create mode 100644 Optitrack Rokoko Glove/SimpleDeviceExample/x64/Debug/SimpleDe.CBF66948.tlog/link.read.1.tlog create mode 100644 Optitrack Rokoko Glove/SimpleDeviceExample/x64/Debug/SimpleDe.CBF66948.tlog/link.write.1.tlog create mode 100644 Optitrack Rokoko Glove/SimpleDeviceExample/x64/Debug/SimpleDe.CBF66948.tlog/unsuccessfulbuild create mode 100644 Optitrack Rokoko Glove/SimpleDeviceExample/x64/Debug/SimpleDeviceExample.dll.recipe create mode 100644 Optitrack Rokoko Glove/SimpleDeviceExample/x64/Debug/SimpleDeviceExample.ilk create mode 100644 Optitrack Rokoko Glove/SimpleDeviceExample/x64/Debug/SimpleDeviceExample.vcxproj.FileListAbsolute.txt create mode 100644 Optitrack Rokoko Glove/SimpleDeviceExample/x64/Debug/dllmain.obj create mode 100644 Optitrack Rokoko Glove/SimpleDeviceExample/x64/Debug/vc142.idb create mode 100644 Optitrack Rokoko Glove/x64/Debug/ExampleGloveData.csv create mode 100644 Optitrack Rokoko Glove/x64/Debug/GloveDeviceExample.exp create mode 100644 Optitrack Rokoko Glove/x64/Debug/GloveDeviceExample.lib create mode 100644 Optitrack Rokoko Glove/x64/Debug/RokokoGloveDevice.dll create mode 100644 Optitrack Rokoko Glove/x64/Debug/RokokoGloveDevice.exp create mode 100644 Optitrack Rokoko Glove/x64/Debug/RokokoGloveDevice.lib create mode 100644 Optitrack Rokoko Glove/x64/Debug/SimpleDeviceExample.dll create mode 100644 Optitrack Rokoko Glove/x64/Debug/SimpleDeviceExample.exp create mode 100644 Optitrack Rokoko Glove/x64/Debug/SimpleDeviceExample.lib diff --git a/Optitrack Rokoko Glove/.vscode/settings.json b/Optitrack Rokoko Glove/.vscode/settings.json new file mode 100644 index 000000000..ff6eed53a --- /dev/null +++ b/Optitrack Rokoko Glove/.vscode/settings.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:924dfafac2c37db14913aa28c56ab40c45563e41347c8aeff076178d65cc06fd +size 1917 diff --git a/Optitrack Rokoko Glove/GloveDeviceExample/ExampleGloveAdapterSingleton.cpp b/Optitrack Rokoko Glove/GloveDeviceExample/ExampleGloveAdapterSingleton.cpp new file mode 100644 index 000000000..388f97bfd --- /dev/null +++ b/Optitrack Rokoko Glove/GloveDeviceExample/ExampleGloveAdapterSingleton.cpp @@ -0,0 +1,282 @@ +//====================================================================================================== +// Copyright 2023, NaturalPoint Inc. +//====================================================================================================== + +#include +#include +#include + +// Peripheral Import +#include "ExampleGloveAdapterSingleton.h" +#include "IDeviceManager.h" +#include "ExampleGloveDevice.h" +using namespace AnalogSystem; + +// Simulated Device +#define SIM_DEVICE_COUNT 2 +#define SIM_DEVICE_RATE 100 + + +OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::ExampleGloveAdapterSingleton(AnalogSystem::IDeviceManager* pDeviceManager) +{ + s_Instance = this; + mDeviceManager = pDeviceManager; + mGloveSimulator = new SimulatedPluginDevices::HardwareSimulator(); + mGloveDataMutex = new std::recursive_mutex(); + mDetectedDevices.clear(); + mLatestGloveData.clear(); + + // start detection thread + mDetectionThread = std::thread(&ExampleGloveAdapterSingleton::DoDetectionThread, this); +} + + +OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::~ExampleGloveAdapterSingleton() +{ + mDetectedDevices.clear(); + mLatestGloveData.clear(); + delete mGloveDataMutex; + bIsConnected = false; + bIsDetecting = false; + s_Instance = nullptr; + + if (mDetectionThread.joinable()) + { + mDetectionThread.join(); + } + + mGloveSimulator->Shutdown(); + delete mGloveSimulator; +} + + +bool OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::ClientShutdown() +{ + bIsConnected = false; + bIsDetecting = false; + + if (mGloveSimulator != nullptr) + { + mGloveSimulator->Shutdown(); + } + return false; +} + +/////////////////////////////////////////////////////////////////////////////// +// +// Glove Host Detection Thread +// +void OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::DoDetectionThread() +{ + while (!bIsConnected && bIsDetecting) + { + // Try reconnecting + if (s_Instance->mConnectionAttemptCount < s_Instance->kMaxConnectionAttempt) { + bIsConnected = ConnectToHost(); + s_Instance->mConnectionAttemptCount++; + } + else { + bIsDetecting = false; + NotifyConnectionFail(); + } + std::this_thread::sleep_for(std::chrono::milliseconds(20000)); + } +} + + +/////////////////////////////////////////////////////////////////////////////// +// +// SDK Helper Functions +// +bool OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::ConnectToHost() +{ + // Check if glove server address is defined in Motive's settings. + if ((mServerAddress.empty())) { + char* szServerAddress = new char[MAX_PATH]; + if (mDeviceManager->GetProperty("Glove Server Address", &szServerAddress)) + { + std::string str(szServerAddress); + mServerAddress = str; + } + delete[] szServerAddress; + } + + /* + * [Glove SDK Placeholder] + * SDK call to connect to the host at 'mServerAddress'. + */ + bIsConnected = true; + + + StartSimulatedHardware(1); + RegisterSDKCallbacks(); + + return true; +} + + +bool OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::IsConnected() +{ + return bIsConnected; +} + +void OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::SetLatestData(const sGloveDeviceData& gloveFingerData) +{ + s_Instance->mLatestGloveData[gloveFingerData.gloveId] = gloveFingerData; +} + +void OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::SetDeviceManager(AnalogSystem::IDeviceManager* pDeviceManager) +{ + if (s_Instance == nullptr) return; + if (pDeviceManager != nullptr) + { + s_Instance->mDeviceManager = pDeviceManager; + } +} + +void OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::SetLatestDeviceInfo(const sGloveDeviceBaseInfo& deviceInfo) +{ + s_Instance->mLatestDeviceInfo[deviceInfo.gloveId] = deviceInfo; +} + +bool OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::GetLatestData(const uint64_t mDeviceSerial, sGloveDeviceData& gloveFingerData) +{ + if (s_Instance == nullptr || !s_Instance -> bIsConnected) return false; + + bool res = false; + if (s_Instance->mGloveDataMutex->try_lock()) { + // Iterate through the glove data table and update + auto iter = s_Instance->mLatestGloveData.find(mDeviceSerial); + if (iter != s_Instance->mLatestGloveData.end()) + { + gloveFingerData = iter->second; + res = true; + } + s_Instance->mGloveDataMutex->unlock(); + } + return res; +} + + +void OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::CreateNewGloveDevice(sGloveDeviceBaseInfo& deviceInfo) +{ + uint64_t gloveId = deviceInfo.gloveId; + std::string deviceName = "ExampleGlove_" + std::to_string(deviceInfo.gloveId); + + // Create device factory using the name/id/serial/client. + std::unique_ptr pDF = + std::make_unique(deviceName, deviceInfo); + pDF->mDeviceIndex = s_Instance->mCurrentDeviceIndex; + s_Instance->mDeviceManager->AddDevice(std::move(pDF)); + s_Instance->mCurrentDeviceIndex++; + + return; +} + +void OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::NotifyConnectionFail() +{ + char* szServerAddress = new char[MAX_PATH]; + char szMessage[MAX_PATH]; + if (s_Instance->mDeviceManager->GetProperty("Glove Server Address", &szServerAddress)) { + if (!(strlen(szServerAddress) == 0)) + { + sprintf_s(szMessage, "[ExampleGlove] Glove host not found on %s", szServerAddress); + s_Instance->mDeviceManager->MessageToHost(szMessage, MessageType_StatusInfo); + } + else + { + sprintf_s(szMessage, "[ExampleGlove] Glove host not found on localhost"); + s_Instance->mDeviceManager->MessageToHost(szMessage, MessageType_StatusInfo); + } + } + delete[] szServerAddress; +} + +/////////////////////////////////////////////////////////////////////////////// +// +// [Glove SDK Placeholder] SDK callbacks +// +/* +* Methods in this section starts the device SDK and registers the callbacks. +*/ +void OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::StartSimulatedHardware(int deviceCount) +{ + mGloveSimulator->StartData(); +} + +void OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::RegisterSDKCallbacks() +{ + s_Instance->mGloveSimulator->RegisterFrameDataCallback(OnDataCallback); + s_Instance->mGloveSimulator->RegisterDeviceInfoCallback(OnDeviceInfoCallback); + + // Add simulated glove devices + s_Instance->mGloveSimulator->AddSimulatedGlove(1, 15, 1); // Create left glove + s_Instance->mGloveSimulator->AddSimulatedGlove(2, 15, 2); // Create right glove +} + +void OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::OnDataCallback(std::vector& gloveAllFingerData) +{ + if (s_Instance == nullptr) return; + + /* + * [Glove SDK Placeholder] + * Data update callbacks to Keep the latest glove data map up-to-date. + */ + s_Instance->mGloveDataMutex->lock(); + for (auto gloveFingerData : gloveAllFingerData) { + // Convert simulated data into glove data format. + sGloveDeviceData newGloveData = ConvertDataFormat(gloveFingerData); + s_Instance->SetLatestData(newGloveData); + } + s_Instance->mGloveDataMutex->unlock(); +} + +void OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::OnDeviceInfoCallback(std::vector& newGloveInfo) +{ + if (s_Instance == nullptr) return; + + // Create new gloves + for (SimulatedPluginDevices::SimulatedDeviceInfo glove : newGloveInfo) + { + s_Instance->mDeviceManager->MessageToHost(" [ExampleGloveDevice] New device(s) detected.", MessageType_StatusInfo); + sGloveDeviceBaseInfo newGloveDevice = ConvertDeviceInfoFormat(glove); + s_Instance->CreateNewGloveDevice(newGloveDevice); + } +} + +sGloveDeviceBaseInfo OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::ConvertDeviceInfoFormat(SimulatedPluginDevices::SimulatedDeviceInfo& glove) +{ + sGloveDeviceBaseInfo ret; + + ret.battery = glove.mBattery; + ret.gloveId = glove.mDeviceSerial; + ret.signalStrength = glove.mSignalStrength; + ret.handSide = (glove.mHandSide == 1) ? eGloveHandSide::Left : + (glove.mHandSide == 2) ? eGloveHandSide::Right : + eGloveHandSide::Unknown; + + return ret; +} + +sGloveDeviceData OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::ConvertDataFormat(const SimulatedPluginDevices::SimulatedGloveFrameData& gloveFrameData) +{ + sGloveDeviceData ret; + ret.gloveId = gloveFrameData.mDeviceSerial; + ret.timestamp = 0; + + sFingerNode defaultNodes = { 0, 0, 0, 1 }; + ret.nodes = std::vector(15, defaultNodes); + + int node_iter = 0; + for (auto& fingerNode : ret.nodes) + { + fingerNode.node_id = node_iter; + fingerNode.quat_w = gloveFrameData.gloveFingerData[node_iter].quat_w; + fingerNode.quat_x = gloveFrameData.gloveFingerData[node_iter].quat_x; + fingerNode.quat_y = gloveFrameData.gloveFingerData[node_iter].quat_y; + fingerNode.quat_z = gloveFrameData.gloveFingerData[node_iter].quat_z; + node_iter++; + } + + return ret; +} \ No newline at end of file diff --git a/Optitrack Rokoko Glove/GloveDeviceExample/ExampleGloveAdapterSingleton.h b/Optitrack Rokoko Glove/GloveDeviceExample/ExampleGloveAdapterSingleton.h new file mode 100644 index 000000000..5ebbfda19 --- /dev/null +++ b/Optitrack Rokoko Glove/GloveDeviceExample/ExampleGloveAdapterSingleton.h @@ -0,0 +1,159 @@ +////====================================================================================================== +//// Copyright 2023, NaturalPoint Inc. +////====================================================================================================== +/** + * ExampleGloveAdapterSingleton class is an adapter class provided to demonstrate how communication between plugin device and + * the glove SDK can be managed. A singleton instance of this class manages interaction between plugin device and the glove + * device SDK. The adapter instance also stores a keeps the latest data and device info map that stores the currently detected device serials + * and the latest frame data so that corresponding glove device can poll from it. Please note that this is provided only as an example, and + * there could be other ways to set this up. + */ + + +#pragma once +#include +#include +#include +#include +#include +#include + +// OptiTrack Peripheral Device API +#include "AnalogChannelDescriptor.h" +#include "GloveDataFormat.h" +#include "HardwareSimulator.h" + +namespace OptiTrackPluginDevices +{ + namespace ExampleDevice + { + class ExampleGloveAdapterSingleton; + + static ExampleGloveAdapterSingleton* s_Instance = nullptr; + static std::unique_ptr gGloveAdapter; + + + /** + * This is an example glove adapter (singleton) class provided to demonstrate how glove data can be populated. + * This adapter class is reponsible for all interaction with the device SDK, and populating the glove data. + * Glove data for multiple glove devices should get aggregated in here. + */ + class ExampleGloveAdapterSingleton + { + friend class ExampleGloveDevice; + + public: + ExampleGloveAdapterSingleton(AnalogSystem::IDeviceManager* pDeviceManager); + ~ExampleGloveAdapterSingleton(); + + // Singleton design pattern + ExampleGloveAdapterSingleton(const ExampleGloveAdapterSingleton&) = delete; // Should not be cloneable + ExampleGloveAdapterSingleton& operator=(const ExampleGloveAdapterSingleton& other) = delete; // Shounot be assignable + + + /** + * Should call the shutdown from the plugin SDK. In this case, shutsdown the simulator + */ + bool ClientShutdown(); + + /** + * Detection thread for connecting to the glove server. + */ + void DoDetectionThread(); + std::thread mDetectionThread; + unsigned int mConnectionAttemptCount = 0; + const unsigned int kMaxConnectionAttempt = 10; + + + /** + * Connect to the glove host. + */ + bool ConnectToHost(); + + private: + /** + * Returns whether detector is connected to Glove Host. + */ + bool IsConnected(); + + /** + * Saves the latest data to the map + */ + void SetLatestData(const sGloveDeviceData& gloveFingerData); + + /** + * Pointer to device manager for additional operations + */ + void SetDeviceManager(AnalogSystem::IDeviceManager* pDeviceManager); + + /** + * Saves the latest glove data to the map + */ + void SetLatestDeviceInfo(const sGloveDeviceBaseInfo& deviceInfo); + + + /** + * Gets the latest data for device with given unique serial + */ + bool GetLatestData(const std::uint64_t mDeviceSerial, sGloveDeviceData& gloveFingerData); + + /** + * Creates new device by instantiating the factory and transferring it to Motive + */ + void CreateNewGloveDevice(sGloveDeviceBaseInfo& deviceInfo); + + /** + * Prints error into Motive. + */ + void NotifyConnectionFail(); + + bool bIsConnected = false; + bool bIsDetecting = true; + int mCurrentDeviceIndex = 0; + std::string mServerAddress = ""; + + + /** + * [Glove SDK Placeholder] + * Example data map for storing aggregated device data. + */ + uint16_t mDeviceCount = 0; + std::vector mDetectedDevices; + std::unordered_map mLatestGloveData; + std::unordered_map mLatestDeviceInfo; + + /** + * [Glove SDK Placeholder] + * The following methods are sample callback functions as a demonstration of how this adapter could + * Communicate with plugin SDK. It receives aggregated frame data through the data callback. + */ + bool bIsSimulating; + void StartSimulatedHardware(int deviceCount); + static void RegisterSDKCallbacks(); + static void OnDataCallback(std::vector& gloveFingerData); + static void OnDeviceInfoCallback(std::vector& newGloveInfo); + static sGloveDeviceBaseInfo ConvertDeviceInfoFormat(SimulatedPluginDevices::SimulatedDeviceInfo& glove); + static sGloveDeviceData ConvertDataFormat(const SimulatedPluginDevices::SimulatedGloveFrameData& glove); + + protected: + + /** + * [Glove SDK Simulator] + * Instance of simulator + */ + SimulatedPluginDevices::HardwareSimulator* mGloveSimulator; + + /** + * [Glove SDK Placeholder] + * Example glove data mutex + */ + std::recursive_mutex* mGloveDataMutex; + + /** + * Pointer to device manager in Motive for reporting error messages. + */ + AnalogSystem::IDeviceManager* mDeviceManager; + }; + } + +} \ No newline at end of file diff --git a/Optitrack Rokoko Glove/GloveDeviceExample/ExampleGloveData.csv b/Optitrack Rokoko Glove/GloveDeviceExample/ExampleGloveData.csv new file mode 100644 index 000000000..21e484c78 --- /dev/null +++ b/Optitrack Rokoko Glove/GloveDeviceExample/ExampleGloveData.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:816498d40aca6a7060d48313bd1946b20553894715095670b14192d4639bdce5 +size 549783 diff --git a/Optitrack Rokoko Glove/GloveDeviceExample/ExampleGloveDevice.cpp b/Optitrack Rokoko Glove/GloveDeviceExample/ExampleGloveDevice.cpp new file mode 100644 index 000000000..dbb24ec1c --- /dev/null +++ b/Optitrack Rokoko Glove/GloveDeviceExample/ExampleGloveDevice.cpp @@ -0,0 +1,311 @@ +//====================================================================================================== +// Copyright 2022, NaturalPoint Inc. +//====================================================================================================== + +#pragma once +#include "ExampleGloveDevice.h" +#include "ExampleGloveAdapterSingleton.h" + +// OptiTrack Peripheral Device API +#include "AnalogChannelDescriptor.h" +#include "IDeviceManager.h" +using namespace AnalogSystem; +using namespace OptiTrackPluginDevices; +using namespace GloveDeviceProperties; +using namespace ExampleDevice; + + +/////////////////////////////////////////////////////////////////////////////// +// +// Device Helper: Initialization and Shutdown +// +void OptiTrackPluginDevices::ExampleDevice::ExampleGlove_EnumerateDeviceFactories(IDeviceManager* pDeviceManager, std::list>& dfs) +{ + // Start server detection + if (gGloveAdapter == nullptr) { + gGloveAdapter = std::make_unique(pDeviceManager); + } +} + +void OptiTrackPluginDevices::ExampleDevice::ExampleGlove_Shutdown() +{ + if (gGloveAdapter != nullptr) + { + gGloveAdapter->ClientShutdown(); + gGloveAdapter.reset(); + } +} + + +/////////////////////////////////////////////////////////////////////////////// +// +// Example Glove Device Factory +// +const char* OptiTrackPluginDevices::ExampleDevice::ExampleGloveDeviceFactory::Name() const +{ + return "ExampleGloveDevice"; +} + +std::unique_ptr OptiTrackPluginDevices::ExampleDevice::ExampleGloveDeviceFactory::Create() const +{ + ExampleGloveDevice* pDevice = new ExampleGloveDevice(mDeviceSerial, mDeviceInfo); + SetCommonGloveDeviceProperties(pDevice); + SetQuaternionDataChannels(pDevice); + + // Transfer ownership to host + std::unique_ptr ptrDevice(pDevice); + return ptrDevice; +} + + +/////////////////////////////////////////////////////////////////////////////// +// +// Example Glove Device +// +OptiTrackPluginDevices::ExampleDevice::ExampleGloveDevice::ExampleGloveDevice(uint32_t serial, sGloveDeviceBaseInfo deviceInfo) +{ + mDeviceInfo = deviceInfo; + mDeviceSerial = deviceInfo.gloveId; + bIsEnabled = true; +} + + +bool OptiTrackPluginDevices::ExampleDevice::ExampleGloveDevice::Configure() +{ + bool success = Deconfigure(); + if (!success) + return false; + + // update device's buffer allocation based on current channel and data type configuration + success = cPluginDevice::Configure(); + if (!success) + return false; + + bIsConfigured = success; + DeviceManager()->MessageToHost(this, "", MessageType_RequestRestart); + return success; +} + +bool OptiTrackPluginDevices::ExampleDevice::ExampleGloveDevice::Deconfigure() +{ + bool success = cPluginDevice::Deconfigure(); + + return success; +} + +bool OptiTrackPluginDevices::ExampleDevice::ExampleGloveDevice::StartCapture() +{ + bool success = cPluginDevice::StartCapture(); + + bIsCollecting = true; + mCollectionThread = CreateThread(nullptr, 0, CollectionThread, this, 0, nullptr); + if (mCollectionThread == nullptr) + { + return false; + bIsCollecting = false; + } + + return success; +} + +bool OptiTrackPluginDevices::ExampleDevice::ExampleGloveDevice::StopCapture() +{ + bool success = cPluginDevice::StopCapture(); + + // REQUIRED: Stop collecting data. Terminate hardware device polling thread + bIsCollecting = false; + DWORD waitResult = WaitForSingleObject(mCollectionThread, 1000); + if (waitResult == WAIT_OBJECT_0) + { + CloseHandle(mCollectionThread); + mCollectionThread = NULL; + success = true; + } + else if (waitResult == WAIT_TIMEOUT) + { + BOOL result = TerminateThread(mCollectionThread, 0); + success = (result == TRUE); + } + else + { + success = false; + } + return success; +} + +void OptiTrackPluginDevices::ExampleDevice::ExampleGloveDevice::OnPropertyChanged(const char* propertyName) +{ + cPluginDevice::OnPropertyChanged(propertyName); + + if (strcmp(propertyName, kEnabledPropName) == 0) + { + // Update device enabled state + GetProperty(kEnabledPropName, bIsEnabled); + } + else if (strcmp(propertyName, kRatePropName) == 0) + { + // Update device capture rate + GetProperty(kRatePropName, mDeviceRateFPS); + mRequestedRateMS = (1.0f / mDeviceRateFPS) * 1000.0f; + } + else if (strcmp(propertyName, kDataStatePropName) == 0) + { + int deviceState = 0; + GetProperty(kDataStatePropName, deviceState); + if (deviceState != DeviceDataState::DeviceState_ReceivingData) + { + // if not receiving data, disable battery state and signal strength + mBatteryLevel = GloveDeviceProp_BatteryUninitialized; + SetProperty(GloveDeviceProp_Battery, mBatteryLevel); + mSignalStrength = GloveDeviceProp_SignalStrengthUnitialized; + SetProperty(GloveDeviceProp_SignalStrength, mSignalStrength); + } + } + else if (strcmp(propertyName, GloveDeviceProp_Solver) == 0) + { + // Route solver type to device user data for interpreting in pipeline + int solver = 0; + GetProperty(GloveDeviceProp_Solver, solver); + SetProperty(cPluginDeviceBase::kUserDataPropName, solver); + } +} + +unsigned long __stdcall OptiTrackPluginDevices::ExampleDevice::ExampleGloveDevice::CollectionThread(LPVOID Context) +{ + ExampleGloveDevice* pThis = static_cast(Context); + return pThis->DoCollectionThread(); +} + +unsigned long OptiTrackPluginDevices::ExampleDevice::ExampleGloveDevice::DoCollectionThread() +{ + /* Collection Thread - + Motive's 15 channel glove data channel format for finger node rotations: + 1 = Thumb MP 1 (w,x,y,z) + 2 = Thumb PIP 2 + 3 = Thumb DIP 3 + 4 = Index MP 1 + 5 = Index PIP 2 + 6 = Index DIP 3 + 7 = Middle MP 1 + 8 = Middle PIP 2 + 9 = Middle DIP 3 + 10 = Ring MP 1 + 11 = Ring PIP 2 + 12 = Ring DIP 3 + 13 = Pinky MP 1 + 14 = Pinky PIP 2 + 15 = Pinky DIP 3 + + Hand joint orientation respects right-handed coordinate system. + For left hand, +X is pointed towards the finger tip. + For right hand, +X is pointer towards the wrist or the body. + */ + + // timers used for frame and ui updates + std::chrono::high_resolution_clock::time_point frameTimerStart, frameTimerEnd; + std::chrono::high_resolution_clock::time_point uiTimerStart, uiTimerEnd; + std::chrono::milliseconds actualFrameDurationMS; + double adjustment = 0.0; + double durationDeltaMS = 0.0; + + + // Glove device parameters (rate / battery / signal) + GetProperty(kEnabledPropName, bIsEnabled); + GetProperty(GloveDeviceProp_Battery, mBatteryLevel); + GetProperty(GloveDeviceProp_SignalStrength, mSignalStrength); + GetProperty(kRatePropName, mDeviceRateFPS); + mRequestedRateMS = (1.0f / mDeviceRateFPS) * 1000.0f; + + // Initialize glove handedness + InitializeGloveProperty(); + + //glove channel data arrray to be copied + float gloveChannelData[kGloveAnalogChannelCount]; + + // Collection thread + uiTimerStart = std::chrono::high_resolution_clock::now(); + while (bIsCollecting) + { + frameTimerStart = std::chrono::high_resolution_clock::now(); + int deviceFrameID = this->FrameCounter(); + + // Skip disabled devices + bool isDeviceEnabled = false; + GetProperty(kEnabledPropName, isDeviceEnabled); + if (!isDeviceEnabled) continue; + + // Poll latest glove data from the adapter + sGloveDeviceData t_data; + bool isGloveDataAvailable = gGloveAdapter->GetLatestData(mDeviceInfo.gloveId, t_data); + + if (isGloveDataAvailable) + { + if (!bIsInitialized) { + InitializeGloveProperty(); + } + + // Update ui every 5 secs (too frequent can cause unnecessary slowdowns) + uiTimerEnd = std::chrono::high_resolution_clock::now(); + auto elapsedTime = std::chrono::duration_cast(uiTimerEnd - uiTimerStart); + if (elapsedTime.count() > 5) + { + UpdateGloveProperty(mDeviceInfo); + uiTimerStart = std::chrono::high_resolution_clock::now(); + } + + // Frame Begin: get frame from device buffer + AnalogFrame* pFrame = this->BeginFrameUpdate(deviceFrameID); + if (pFrame) + { + // fill in frame header + int flags = 0; + + // Iterate through each bone and populate channel data. + // Skip the first bone, hand base, as it's driven from rigid body transform instead. + for (int i = 0; i < 15; i++) + { + int nodeChannelIndex = i * 4; + gloveChannelData[nodeChannelIndex] = t_data.nodes.at(i).quat_w; //w + gloveChannelData[nodeChannelIndex + 1] = t_data.nodes.at(i).quat_x; //x + gloveChannelData[nodeChannelIndex + 2] = t_data.nodes.at(i).quat_y; //y + gloveChannelData[nodeChannelIndex + 3] = t_data.nodes.at(i).quat_z; //z + } + + pFrame->SetID(deviceFrameID); + pFrame->SetFlag(flags); + //pFrame->SetTimestamp((double)mLastGloveDataTimebstamp.time); + ::memcpy(pFrame->ChannelData(), &gloveChannelData[0], kGloveAnalogChannelCount * sizeof(float)); + EndFrameUpdate(); + this->SetFrameCounter(deviceFrameID + 1); + } + + + // End frame update. Sleep the thread for the remaining frame period. + std::this_thread::sleep_for(std::chrono::milliseconds((int)(mRequestedRateMS - adjustment))); + frameTimerEnd = std::chrono::high_resolution_clock::now(); + actualFrameDurationMS = std::chrono::duration_cast(frameTimerEnd - frameTimerStart); + durationDeltaMS = actualFrameDurationMS.count() - mRequestedRateMS; + + // estimating adjustment to prevent oscillation on sleep duration. + if (durationDeltaMS > 1.0) + adjustment = -1.0; + else if (durationDeltaMS > 2.0) + adjustment = -2.0; + else if (durationDeltaMS > 3.0) + adjustment = -3.0; + else if (durationDeltaMS < -3.0) + adjustment = -3.0; + else if (durationDeltaMS < -2.0) + adjustment = 2.0; + else if (durationDeltaMS < -1.0) + adjustment = 1.0; + else + adjustment = 0.0; + if (fabs(adjustment) > 1.0) + { + this->LogError(MessageType_StatusInfo, "[Example Device] Device timing resolution off by %3.1f ms (requested:%3.1f, actual:%3.1f)", durationDeltaMS, mRequestedRateMS, (double) actualFrameDurationMS.count()); + } + } + } + return 0; +} diff --git a/Optitrack Rokoko Glove/GloveDeviceExample/ExampleGloveDevice.h b/Optitrack Rokoko Glove/GloveDeviceExample/ExampleGloveDevice.h new file mode 100644 index 000000000..a7a6d3a7e --- /dev/null +++ b/Optitrack Rokoko Glove/GloveDeviceExample/ExampleGloveDevice.h @@ -0,0 +1,86 @@ +//====================================================================================================== +// Copyright 2023, NaturalPoint Inc. +//====================================================================================================== +/** + * This is an example glove device provided to demonstrate how a plugin device can be set up as a glove device + * in Motive. This class derives from GloveDeviceBase class which contains basic setups required by gloves. + */ + +#pragma once +#include +#include + +// OptiTrack Peripheral Device API +#include "dllcommon.h" +#include "GloveDeviceBase.h" +#include "GloveDataFormat.h" +#include "ExampleGloveAdapterSingleton.h" + +namespace OptiTrackPluginDevices +{ + namespace ExampleDevice{ + + class ExampleGloveDevice; + class ExampleGloveDeviceFactory; + + void ExampleGlove_EnumerateDeviceFactories(AnalogSystem::IDeviceManager* pDeviceManager, std::list>& dfs); + void ExampleGlove_Shutdown(); + + + /** + * For creating a device in Motive, a factory class must be created first. This example class inherits from the + * parent glove device factory where common glove functionalities and configurations are set. + */ + class ExampleGloveDeviceFactory : public OptiTrackPluginDevices::GloveDeviceFactoryBase + { + public: + ExampleGloveDeviceFactory(std::string deviceName, sGloveDeviceBaseInfo deviceInfo) : + GloveDeviceFactoryBase(deviceName.c_str(), deviceInfo.gloveId), mDeviceInfo(deviceInfo) + { + } + + /** + * Return device factory name + */ + virtual const char* Name() const override; + + /** + * The following method gets called by Motive. It creates and returns a new instance of device and transfers ownership to Motive. + */ + std::unique_ptr Create() const override; + + private: + sGloveDeviceBaseInfo mDeviceInfo; + }; + + + /** + * ExampleGloveDevice inherits from GloveDeviceBase and demonstrates how a glove plugin device can be created. + * Each device gets their own collection thread where they populate the channel data. This class is inherited from the parent + * GloveDeviceBase class where the basic glove setup is shown. + */ + class ExampleGloveDevice : public OptiTrackPluginDevices::GloveDeviceBase + { + public: + ExampleGloveDevice(uint32_t serial, sGloveDeviceBaseInfo deviceInfo); + virtual ~ExampleGloveDevice() = default; + + // IDevice implementation + virtual bool Configure(); + virtual bool Deconfigure(); + virtual bool StartCapture(); + virtual bool StopCapture(); + virtual void OnPropertyChanged(const char* propertyName); + + private: + + + /** + * Collection thread for populating glove analog data channels + */ + static unsigned long __stdcall CollectionThread(LPVOID Context); + unsigned long DoCollectionThread() override; + void* mCollectionThread = nullptr; + }; + } +} diff --git a/Optitrack Rokoko Glove/GloveDeviceExample/GloveDataFormat.h b/Optitrack Rokoko Glove/GloveDeviceExample/GloveDataFormat.h new file mode 100644 index 000000000..d434bca84 --- /dev/null +++ b/Optitrack Rokoko Glove/GloveDeviceExample/GloveDataFormat.h @@ -0,0 +1,83 @@ +//====================================================================================================== +// Copyright 2023, NaturalPoint Inc. +//====================================================================================================== +/** + * This includes common glove data formats referenced in Motive. + */ + + +#pragma once +#include +#include +#include +#include + +enum class eGloveHandSide : int +{ + Unknown = 0, + Left = 1, + Right = 2 +}; + + +struct sGloveDataTimestamp +{ + uint8_t hour = 0; + uint8_t minute = 0; + uint32_t seconds = 0; + uint32_t nanoseconds = 0; + double t = 0; + sGloveDataTimestamp(uint32_t s, uint32_t n) : seconds(s), nanoseconds(n) { t = double(seconds) + double(nanoseconds) * 0.000000001; } + sGloveDataTimestamp(double time) { t = time; } + sGloveDataTimestamp() : t(0.0) {} + + bool operator >(const sGloveDataTimestamp& x) + { + return this->t > x.t; + } + bool operator <(const sGloveDataTimestamp& x) + { + return this->t < x.t; + } + bool operator ==(const sGloveDataTimestamp& x) + { + return this->t == x.t; + } + + sGloveDataTimestamp operator -(const sGloveDataTimestamp& x) + { + return sGloveDataTimestamp(this->t - x.t); + } + + operator const double() { + return t; + } +}; + +struct sFingerNode { + int node_id; + float quat_x; + float quat_y; + float quat_z; + float quat_w; +}; + +struct sGloveDeviceData { + uint64_t gloveId = 0; + std::vector nodes; + sGloveDataTimestamp timestamp; +}; + +struct sGloveDeviceBaseInfo +{ + uint32_t gloveId = 0; // device serial id + int battery = 0 ; + int signalStrength= 0; + eGloveHandSide handSide = eGloveHandSide::Unknown; +}; + + + + + + diff --git a/Optitrack Rokoko Glove/GloveDeviceExample/GloveDeviceBase.cpp b/Optitrack Rokoko Glove/GloveDeviceExample/GloveDeviceBase.cpp new file mode 100644 index 000000000..9700f47fd --- /dev/null +++ b/Optitrack Rokoko Glove/GloveDeviceExample/GloveDeviceBase.cpp @@ -0,0 +1,258 @@ +//====================================================================================================== +// Copyright 2022, NaturalPoint Inc. +//====================================================================================================== +#include "dllcommon.h" +#include "GloveDeviceBase.h" + +// Optitrack Peripheral Device API +#include "AnalogChannelDescriptor.h" +#include "IDeviceManager.h" +#include "GloveDataFormat.h" +using namespace AnalogSystem; +using namespace OptiTrackPluginDevices; +using namespace GloveDeviceProperties; + +OptiTrackPluginDevices::GloveDeviceBase::GloveDeviceBase() +{ + this->SetCommonDeviceProperties(); + this->SetCommonGloveDeviceProperties(); +} + +void OptiTrackPluginDevices::GloveDeviceBase::SetCommonDeviceProperties() +{ + // Set appropriate default property values (and set advanced state) + ModifyProperty(cPluginDeviceBase::kModelPropName, true, true, false); + ModifyProperty(cPluginDeviceBase::kOrderPropName, true, false, true); + ModifyProperty(cPluginDeviceBase::kDisplayNamePropName, false, false, false); + + // Reveal glove related prop name + ModifyProperty(cPluginDeviceBase::kAssetPropName, false, false, false); // name of the paired skeleton asset + + // hide default properties that aren't relevant to glove device + ModifyProperty(cPluginDeviceBase::kSyncModePropName, true, true, true); + ModifyProperty(cPluginDeviceBase::kSyncStatusPropName, true, true, true); + ModifyProperty(cPluginDeviceBase::kUseExternalClockPropName, true, true, true); + ModifyProperty(cPluginDeviceBase::kMocapRateMultiplePropName, true, true, true); + ModifyProperty(cPluginDeviceBase::kScalePropName, true, true, true); + ModifyProperty(cPluginDeviceBase::kCalOffsetPropName, true, true, true); + ModifyProperty(cPluginDeviceBase::kCalSquareRotationPropName, true, true, true); + ModifyProperty(cPluginDeviceBase::kUserDataPropName, true, true, true); + ModifyProperty(cPluginDeviceBase::kZeroPropName, true, true, true); + ModifyProperty(cPluginDeviceBase::kGroupNamePropName, true, true, true); + + // hide advanced properties + ModifyProperty(cPluginDeviceBase::kConnectedPropName, true, false, true); + ModifyProperty(cPluginDeviceBase::kNamePropName, true, false, true); + ModifyProperty(cPluginDeviceBase::kChannelCountPropName, true, false, true); + ModifyProperty(cPluginDeviceBase::kAppRunModePropName, true, false, true); + ModifyProperty(cPluginDeviceBase::kMocapSyncFramePropName, true, false, true); + ModifyProperty(cPluginDeviceBase::kSyncFramePropName, true, false, true); + ModifyProperty(cPluginDeviceBase::kNeedDeviceSyncFramePropName, false, false, true); + ModifyProperty(cPluginDeviceBase::kNeedMocapSyncFramePropName, false, false, true); + ModifyProperty(cPluginDeviceBase::kUseDriftCorrectionPropName, false, false, true); + ModifyProperty(cPluginDeviceBase::kMasterSerialPropName, true, false, true); + ModifyProperty(cPluginDeviceBase::kDriftCorrectionPropName, true, false , true); + SetProperty(cPluginDeviceBase::kEnabledPropName, true); + SetProperty(cPluginDeviceBase::kConnectedPropName, true); + SetProperty(cPluginDeviceBase::kMocapRateMultiplePropName, 1); +} + +void OptiTrackPluginDevices::GloveDeviceBase::SetCommonGloveDeviceProperties() +{ + // Add glove related properties + AddProperty(GloveDeviceProperties::GloveDeviceProp_HandSide, GloveHandSide, kHandSideCount, 0, "Settings", false); + AddProperty(GloveDeviceProperties::GloveDeviceProp_Battery, GloveDeviceProp_BatteryUninitialized, "Settings", false); + AddProperty(GloveDeviceProperties::GloveDeviceProp_SignalStrength, GloveDeviceProp_SignalStrengthUnitialized, "Settings", false); + //AddProperty(GloveDeviceProperties::GloveDeviceProp_Reconnect, false, "Settings", false); + + // Modify property visibility + ModifyProperty(GloveDeviceProperties::GloveDeviceProp_SignalStrength, true, false, false, false); + ModifyProperty(GloveDeviceProperties::GloveDeviceProp_HandSide, true, false, false); + ModifyProperty(GloveDeviceProperties::GloveDeviceProp_Battery, true, false, false, false); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// Setter: Glove Device +// +void OptiTrackPluginDevices::GloveDeviceBase::SetDeviceRate(int rate) +{ + mDeviceRateFPS = rate; + mRequestedRateMS = (1.0f / mDeviceRateFPS) * 1000.0f; + return; +} + +void OptiTrackPluginDevices::GloveDeviceBase::SetHandSide(eGloveHandSide side) +{ + mHandSide = side; + return; +} + +void OptiTrackPluginDevices::GloveDeviceBase::SetEnabled(bool enabled) +{ + bIsEnabled = enabled; +} + +void OptiTrackPluginDevices::GloveDeviceBase::SetCollecting(bool collecting) +{ + bIsCollecting = collecting; +} + +bool OptiTrackPluginDevices::GloveDeviceBase::SetDeviceSerial(std::string serial) +{ + mDeviceSerial = serial; + // Set device serial property + return false; +} + +bool OptiTrackPluginDevices::GloveDeviceBase::SetDeviceData(sGloveDeviceData data) +{ + mLastGloveData = data; + return true; +} + +bool OptiTrackPluginDevices::GloveDeviceBase::SetBatteryLevel(int level) +{ + if (SetProperty(GloveDeviceProperties::GloveDeviceProp_Battery, (int)level)) + { + mBatteryLevel = level; + return true; + } + return false; +} + +bool OptiTrackPluginDevices::GloveDeviceBase::SetSignalStrength(int signal) +{ + if (SetProperty(GloveDeviceProperties::GloveDeviceProp_SignalStrength, (int)signal)) + { + mSignalStrength = signal; + return true; + } + return false; +} + +void OptiTrackPluginDevices::GloveDeviceBase::InitializeGloveProperty() +{ + if (mDeviceInfo.handSide == eGloveHandSide::Left) + { + SetProperty(GloveDeviceProperties::GloveDeviceProp_HandSide, 1); + SetProperty(cPluginDeviceBase::kOrderPropName, 1); + bIsInitialized = true; + } + else if (mDeviceInfo.handSide == eGloveHandSide::Right) + { + SetProperty(GloveDeviceProperties::GloveDeviceProp_HandSide, 2); + SetProperty(cPluginDeviceBase::kOrderPropName, 2); + bIsInitialized = true; + } + return; +} + + +void OptiTrackPluginDevices::GloveDeviceBase::UpdateGloveProperty(const sGloveDeviceBaseInfo& deviceInfo) +{ + // update glove property when the device is receiving data. + int deviceState = 0; + GetProperty(kDataStatePropName, deviceState); + if (deviceState == DeviceDataState::DeviceState_ReceivingData) + { + if (mSignalStrength != 1) + { + mSignalStrength = deviceInfo.signalStrength; + double signal = fabs(mSignalStrength); + SetProperty(GloveDeviceProp_SignalStrength, (int)signal); + } + SetProperty(GloveDeviceProp_SignalStrength, -100); + + if (mBatteryLevel != deviceInfo.battery) + { + mBatteryLevel = (int)(deviceInfo.battery); //Battery level percentage. + SetProperty(GloveDeviceProp_Battery, (int)mBatteryLevel); + } + } +} + + +/////////////////////////////////////////////////////////////////////////////// +// +// Glove Device Factory +// +void OptiTrackPluginDevices::GloveDeviceFactoryBase::SetCommonGloveDeviceProperties(GloveDeviceBase* pDevice) const +{ + // REQUIRED: Set device name/model/serial + pDevice->SetProperty(cPluginDeviceBase::kNamePropName, (char*)DeviceName()); + pDevice->SetProperty(cPluginDeviceBase::kDisplayNamePropName, (char*)DeviceName()); + pDevice->SetProperty(cPluginDeviceBase::kModelPropName, "Glove Model"); // model + char mDeviceSerial[MAX_PATH]; + sprintf_s(mDeviceSerial, "%s-serial", DeviceName()); + pDevice->SetProperty(cPluginDeviceBase::kSerialPropName, mDeviceSerial); // device serial (must be unique!) + pDevice->SetProperty(cPluginDeviceBase::kDeviceTypePropName, (long)DeviceType_Glove); // set device type as glove + pDevice->SetProperty(cPluginDeviceBase::kRatePropName, 120.0); // glove sampling rate + pDevice->SetProperty(cPluginDeviceBase::kUseDriftCorrectionPropName, true); // drift correction to fetch most recent data. + pDevice->SetProperty(cPluginDeviceBase::kOrderPropName, (int) eGloveHandSide::Unknown); // device order: (0 = uninitialized, 1=left, 2=right) +} + + +void OptiTrackPluginDevices::GloveDeviceFactoryBase::SetDeviceIndex(int t_index) +{ + mDeviceIndex = t_index; + return; +} + +void OptiTrackPluginDevices::GloveDeviceFactoryBase::SetQuaternionDataChannels(GloveDeviceBase* pDevice) const +{ + // Set glove data channels: + // 5 fingers * 3 joints per finger * 4 floats per quat (x/y/z/w) = 60 channels + int channelIndex; + int gloveAnalogChannelCount = 60; + char szChannelNames[MAX_PATH]; + + // add channels + for (int i = 0; i < gloveAnalogChannelCount; i++) + { + int finger = i / 12; // 12 channels per finger + switch (finger) + { + case 0: sprintf_s(szChannelNames, "T"); break; + case 1: sprintf_s(szChannelNames, "I"); break; + case 2: sprintf_s(szChannelNames, "M"); break; + case 3: sprintf_s(szChannelNames, "R"); break; + case 4: sprintf_s(szChannelNames, "P"); break; + } + + int joint = (i / 4) % 3; // 3 joints per finger + switch (joint) + { + case 0: sprintf_s(szChannelNames, "%s-MCP", szChannelNames); break; + case 1: sprintf_s(szChannelNames, "%s-PIP", szChannelNames); break; + case 2: sprintf_s(szChannelNames, "%s-DIP", szChannelNames); break; + } + + int axis = i % 4; // 4 floats per joint + switch (axis) + { + case 0: sprintf_s(szChannelNames, "%s W", szChannelNames); break; + case 1: sprintf_s(szChannelNames, "%s X", szChannelNames); break; + case 2: sprintf_s(szChannelNames, "%s Y", szChannelNames); break; + case 3: sprintf_s(szChannelNames, "%s Z", szChannelNames); break; + } + channelIndex = pDevice->AddChannelDescriptor(szChannelNames, ChannelType_Float); + + } + + // enable all channels by default + for (int i = 0; i <= channelIndex; i++) + { + // data channel enabled by default + pDevice->ChannelDescriptor(i)->SetProperty(ChannelProp_Enabled, true); + + // hide unused channel properties + pDevice->ChannelDescriptor(i)->ModifyProperty(ChannelProp_Units, true, true); + pDevice->ChannelDescriptor(i)->ModifyProperty(ChannelProp_Name, true, true); + pDevice->ChannelDescriptor(i)->ModifyProperty(ChannelProp_MinVoltage, true, true); + pDevice->ChannelDescriptor(i)->ModifyProperty(ChannelProp_MaxVoltage, true, true); + pDevice->ChannelDescriptor(i)->ModifyProperty(ChannelProp_TerminalName, true, true); + pDevice->ChannelDescriptor(i)->ModifyProperty(ChannelProp_TerminalType, true, true); + pDevice->ChannelDescriptor(i)->ModifyProperty(ChannelProp_MaxVoltage, true, true); + } +} \ No newline at end of file diff --git a/Optitrack Rokoko Glove/GloveDeviceExample/GloveDeviceBase.h b/Optitrack Rokoko Glove/GloveDeviceExample/GloveDeviceBase.h new file mode 100644 index 000000000..cac502cc7 --- /dev/null +++ b/Optitrack Rokoko Glove/GloveDeviceExample/GloveDeviceBase.h @@ -0,0 +1,180 @@ +//====================================================================================================== +// Copyright 2023, NaturalPoint Inc. +//====================================================================================================== +/** + * GloveDeviceBase/GloveDeviceFactory class extends the cPluginDeviceBase and configures data channels and device properties required + * by a glove device in Motive. The purpose of this class is to abstract out setups needed for creating glove device as demonstrated + * in the ExampleGloveDevice. When developing a glove plugin to animate fingers in Motive, the following class can be inherited if needed. + */ + +#include +#include +#include +#include + +// OptiTrack Peripheral Device API +#include "PluginDevice.h" +#include "PluginDeviceFactory.h" +#include "GloveDataFormat.h" + +namespace OptiTrackPluginDevices +{ + class GloveDeviceBase; + class GloveDeviceFactoryBase; + + /** + * Common glove device properties used in Motive. + */ + namespace GloveDeviceProperties + { + static const int kHandSideCount = 3; + static const char* GloveHandSide[kHandSideCount] = + { + "Uninitialized", + "Left", + "Right" + }; + // Glove type needs to be set at the device level (0 = uninitialized, 1 = left, 2 = right) + static const char* GloveDeviceProp_HandSide = "Hand Side"; + static const char* GloveDeviceProp_Battery = "Battery"; + static const char* GloveDeviceProp_SignalStrength = "Signal Strength"; + static const char* GloveDeviceProp_ServerAddress = "Server Address"; + static const char* GloveDeviceProp_Reconnect = "Reconnect"; + static const char* GloveDeviceProp_Solver = "Glove Solver"; + static const int GloveDeviceProp_BatteryUninitialized = -1; + static const int GloveDeviceProp_SignalStrengthUnitialized = -1; + static const int kGloveAnalogChannelCount = 60; + } + + /** + * GloveDeviceFactory class demonstrates how plugin device factory can be set up for creating a glove device in Motive. + * To create a device in Motive, an instance of PLuginDeviceFactory must be created per each device, and then, its ownership must be + * transferred to Motive by using Create method. The GloveDeviceFactory inherits from PLuginDeviceFactory and demonstrates common + * glove properties and data channels can be configured; which is demonstrated in this base class. + */ + class GloveDeviceFactoryBase : public AnalogSystem::PluginDeviceFactory + { + public: + GloveDeviceFactoryBase(std::string deviceName, uint32_t serial) : + AnalogSystem::PluginDeviceFactory(deviceName.c_str()), mDeviceSerial(serial) {} + + uint32_t mDeviceSerial = -1; + int mDeviceIndex = 0; + + protected: + void SetDeviceIndex(int t_index); + + /** + * Sets up quaternion data channels for delivering local rotation of the finger nodes. + * Motive skeleton's hand consists of total 15 finger nodes, 3 per each finger. + * These data channels will get populated by the collection thread running on each device. + * Quaternion values are expected, resulting in total 60 float channels (15 finger nodes * 4 quat floats / node). + * Local rotation data is expected, and both hand data expects right-handed coordinate system with +x axis + * pointing towards the finger tip for left hand and towards the wrist/body for right hand. + */ + void SetQuaternionDataChannels(GloveDeviceBase* pDevice) const; + + /** + * Set Common Glove device properties + */ + void SetCommonGloveDeviceProperties(GloveDeviceBase* pDevice) const; + }; + + /** + * cGloveDeviceBase class is an example class which glove devices could inherit from. + * This class includes basic setups and configurations for glove devices in Motive. + */ + class GloveDeviceBase : public AnalogSystem::cPluginDevice + { + friend class GloveDeviceFactoryBase; + + public: + GloveDeviceBase(); + ~GloveDeviceBase() = default; + + void SetCommonDeviceProperties(); + void SetCommonGloveDeviceProperties(); + + protected: + // Device status + bool bIsEnabled = false; + bool bIsCollecting = false; + bool bIsInitialized = false; + bool bIsConfigured = false; + + // Device info + sGloveDeviceBaseInfo mGloveInfo; + std::string mDeviceSerial = ""; + eGloveHandSide mHandSide = eGloveHandSide::Unknown; + int mBatteryLevel = 0; + int mSignalStrength = 0; + double mDeviceRateFPS = 0; + double mRequestedRateMS = 0.0; + + // Glove data + sGloveDeviceData mLastGloveData; + + // Collection thread must be created on the device class. Defined in ExampleGloveDevice class. + virtual unsigned long DoCollectionThread() = 0; + + /** + * Configure device rate + */ + void SetDeviceRate(int rate); + + /** + * Configure hand side + */ + void SetHandSide(eGloveHandSide side); + + /** + * Enable or disable device + */ + void SetEnabled(bool enabled); + + /** + * Set collection status + */ + void SetCollecting(bool collecting); + + /** + * Set device serial string each device must have unique serial + */ + bool SetDeviceSerial(std::string serial); + + /** + * Set device data + */ + bool SetDeviceData(sGloveDeviceData data); + + /** + * Set device battery level (1-100) + */ + bool SetBatteryLevel(int level); + + /** + * Sets the signal stregth (1-128) + */ + bool SetSignalStrength(int signal); + + + bool IsEnabled() { return bIsEnabled; }; + bool IsCollecting() { return bIsCollecting; }; + int GetSignalStrength() { return mSignalStrength; } + int GetBatteryLevel() { return mBatteryLevel; } + double GetDeviceRate() { return mDeviceRateFPS; } + sGloveDeviceData GetLastestData() { return mLastGloveData; }; + + /** + * Initialize the properties for the glove device + */ + void InitializeGloveProperty(); + + /** + * Updates the device properties. Gets called periodically within collection thread. + * Mainly updates the battery level and signal strength. + */ + void UpdateGloveProperty(const sGloveDeviceBaseInfo& deviceInfo); + sGloveDeviceBaseInfo mDeviceInfo; + }; +} diff --git a/Optitrack Rokoko Glove/GloveDeviceExample/GloveDeviceExample.vcxproj b/Optitrack Rokoko Glove/GloveDeviceExample/GloveDeviceExample.vcxproj new file mode 100644 index 000000000..1547b996d --- /dev/null +++ b/Optitrack Rokoko Glove/GloveDeviceExample/GloveDeviceExample.vcxproj @@ -0,0 +1,135 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {DCD02920-D0DA-490D-86F2-3C2C9256A6B7} + Win32Proj + OptiTrackPeripheralExample + 8.1 + GloveDeviceExample + + + + DynamicLibrary + true + v142 + Unicode + + + DynamicLibrary + false + v142 + true + Unicode + + + + + + + + + + + + + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + C:\Program Files\OptiTrack\Motive\Motive.exe + WindowsLocalDebugger + + + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + C:\Program Files\OptiTrack\Motive\Motive.exe + WindowsLocalDebugger + + + + if not exist "C:/Program Files/OptiTrack/Motive/devices" mkdir "C:/Program Files/OptiTrack/Motive/devices" +copy "$(OutDir)GloveDeviceExample.dll" "C:/Program Files/OptiTrack/Motive/devices" +copy "$(OutDir)ExampleGloveData.csv" "C:/Program Files/OptiTrack/Motive/devices" + + + + + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;ANALOGSYSTEM_IMPORTS;OPTITRACKPERIPHERALEXAMPLE_EXPORTS;%(PreprocessorDefinitions) + false + ..\..\include;%(AdditionalIncludeDirectories) + + + Windows + true + NotSet + PeripheralImport.lib;%(AdditionalDependencies) + ..\..\lib;%(AdditionalLibraryDirectories) + + + false + + + + + Level3 + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;_USRDLL;OPTITRACKPERIPHERALEXAMPLE_EXPORTS;ANALOGSYSTEM_IMPORTS;%(PreprocessorDefinitions) + ..\..\include;%(AdditionalIncludeDirectories) + + + Windows + true + true + true + PeripheralImport.lib;%(AdditionalDependencies) + ..\..\lib;%(AdditionalLibraryDirectories) + + + + + + + + + + + + + false + + + false + + + + + + + + + + + + + + Document + + + + + + \ No newline at end of file diff --git a/Optitrack Rokoko Glove/GloveDeviceExample/GloveDeviceExample.vcxproj.filters b/Optitrack Rokoko Glove/GloveDeviceExample/GloveDeviceExample.vcxproj.filters new file mode 100644 index 000000000..477cafb30 --- /dev/null +++ b/Optitrack Rokoko Glove/GloveDeviceExample/GloveDeviceExample.vcxproj.filters @@ -0,0 +1,60 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + + + + + \ No newline at end of file diff --git a/Optitrack Rokoko Glove/GloveDeviceExample/HardwareSimulator.cpp b/Optitrack Rokoko Glove/GloveDeviceExample/HardwareSimulator.cpp new file mode 100644 index 000000000..d6add29c2 --- /dev/null +++ b/Optitrack Rokoko Glove/GloveDeviceExample/HardwareSimulator.cpp @@ -0,0 +1,185 @@ +//====================================================================================================== +// Copyright 2023, NaturalPoint Inc. +//====================================================================================================== +#include "HardwareSimulator.h" +#include +#include +#include +#include + +using namespace std; + +SimulatedPluginDevices::HardwareSimulator::HardwareSimulator() +{} + +SimulatedPluginDevices::HardwareSimulator::~HardwareSimulator() +{ + bIsRunning = false; + if (mUpdateThread.joinable()) { + mUpdateThread.join(); + } +} + +void SimulatedPluginDevices::HardwareSimulator::StartData() +{ + bIsRunning = true; + mUpdateThread = std::thread(&HardwareSimulator::ReadDataFromCSV, this); +} + +void SimulatedPluginDevices::HardwareSimulator::Shutdown() +{ + bIsRunning = false; + if (mUpdateThread.joinable()) + { + mUpdateThread.join(); + } +} + +void SimulatedPluginDevices::HardwareSimulator::RegisterDeviceInfoCallback(std::function&)> device_info_callback) +{ + mOnDeviceInfoUpdate = device_info_callback; +} + +void SimulatedPluginDevices::HardwareSimulator::NotifyDataCallback() +{ + if (mOnFrameDataUpdate) + { + mOnFrameDataUpdate(mSimulatedFrameDataSet); + } +} + +void SimulatedPluginDevices::HardwareSimulator::NotifyInfoCallback() +{ + if (mOnDeviceInfoUpdate) + { + mOnDeviceInfoUpdate(mNewDeviceInfo); + mNewDeviceInfo.clear(); + } +} + +void SimulatedPluginDevices::HardwareSimulator::AddSimulatedGlove(int deviceId, int nodeCount, int handedness) +{ + SimulatedDeviceInfo device(deviceId, nodeCount, handedness); + mSimulatedDeviceInfoSet.push_back(device); + mNewDeviceInfo.push_back(device); + mSimulatedFrameDataSet.push_back(SimulatedGloveFrameData(device.mDeviceSerial, device.mNodeCount)); + NotifyInfoCallback(); +} + +void SimulatedPluginDevices::HardwareSimulator::RegisterFrameDataCallback(std::function&)> data_callback) +{ + mOnFrameDataUpdate = data_callback; +} + + +/** + * [Example] Simply read each frame data from the provided csv file and update the data callback. + */ +bool SimulatedPluginDevices::HardwareSimulator::ReadDataFromCSV() +{ + double mRequestedRateMS = (1.0f / mDataSampleRate) * 1000.0f; + std::string filename = GetExePath() + "\\devices\\ExampleGloveData.csv"; + + // Read the provided example CSV file (60 channels) + std::ifstream fin(filename); + if (!fin.is_open()) + { + // Failed to open the device + return false; + } + + bool isFirstLine = true; + std::vector field_names; + + // loop through lines of data + std::string lineRead; + while (bIsRunning) + { + std::vector frame_data; + std::vector jointData; + + if (fin.eof()) + { + //loop back to begining + fin.clear(); + fin.seekg(0, std::ios::beg); + isFirstLine = true; + } + + std::getline(fin, lineRead); + std::stringstream lineStream(lineRead); + + // Read comma-separated values + std::string val; + std::getline(lineStream, val, ','); // skip first column + while (getline(lineStream, val, ',')) + { + if (isFirstLine) + { + field_names.push_back(val); + } + else + { + try + { + float val_f = std::stof(val); + jointData.push_back(val_f); + + } + catch (const std::exception* e) + { + // error converting the value. Terminate + return false; + } + + if (jointData.size() == 4) + { + SimulatedFingerData finger; + // next finger joint + finger.quat_w = jointData.at(0); + finger.quat_x = jointData.at(1); + finger.quat_y = jointData.at(2); + finger.quat_z = jointData.at(3); + frame_data.push_back(finger); + jointData.clear(); + } + } + } + + if (isFirstLine) + isFirstLine = false; + else { + if (frame_data.size() != 0) + { + UpdateAllDevicesWithData(frame_data); + } + } + + // End of a line sleep + std::this_thread::sleep_for(std::chrono::milliseconds((int)mRequestedRateMS)); + } + return true; +} + +void SimulatedPluginDevices::HardwareSimulator::UpdateAllDevicesWithData(std::vector& data) +{ + mDataLock.lock(); + // Loop through list of data instances in the frame data vector and update all instances + for (auto& gloveDevice : mSimulatedFrameDataSet) + { + // Set all finger data + gloveDevice.gloveFingerData = data; + } + NotifyDataCallback(); + mDataLock.unlock(); +} + +std::string SimulatedPluginDevices::HardwareSimulator::GetExePath() +{ + std::string path; + char buffer[MAX_PATH]; + GetModuleFileNameA(NULL, buffer, MAX_PATH); + string::size_type pos = string(buffer).find_last_of("\\/"); + path = string(buffer).substr(0, pos)/*+"\\system.exe"*/; + return path; +} \ No newline at end of file diff --git a/Optitrack Rokoko Glove/GloveDeviceExample/HardwareSimulator.h b/Optitrack Rokoko Glove/GloveDeviceExample/HardwareSimulator.h new file mode 100644 index 000000000..6a1deada8 --- /dev/null +++ b/Optitrack Rokoko Glove/GloveDeviceExample/HardwareSimulator.h @@ -0,0 +1,111 @@ +////====================================================================================================== +//// Copyright 2023, NaturalPoint Inc. +////====================================================================================================== +/* +* SimulatedHardware class is used for demonstrating third-party glove SDK DLL to simulate a third-party hardware. +* For the purpose of the example glove device, the finger tracking data is read from the csv file. +*/ +#pragma once +#define DATA_SAMPLERATE 120 + +#include +#include +#include +#include +#include +#include + +namespace SimulatedPluginDevices { + + class HardwareSimulator; + + struct SimulatedFingerData + { + float quat_x = 0; + float quat_y = 0; + float quat_z = 0; + float quat_w = 0; + float pos_x = 0; + float pos_y = 0; + float pos_z = 0; + + SimulatedFingerData() {}; + SimulatedFingerData(float x, float y, float z, float w) : + quat_x(x), quat_y(y), quat_z(z), quat_w(w) {} + }; + + struct SimulatedGloveFrameData { + int mDeviceSerial = 0; + int mChannelCount = 0; + int kChannelPerNode = 4; + int mNodeCount = 0; + + std::vector gloveFingerData; // for glove data + + SimulatedGloveFrameData() {} + SimulatedGloveFrameData(int deviceSerial, int nodeCount) : + mDeviceSerial(deviceSerial), + mNodeCount(nodeCount) + { + mChannelCount = mNodeCount * kChannelPerNode; + gloveFingerData.resize(mNodeCount); + } + }; + + struct SimulatedDeviceInfo { + int mDeviceSerial = 0; // device serial id + int mBattery = 100; + int mSignalStrength = 100; + int mHandSide = 0; + int mNodeCount = 0; + int mChannelCount = 0; + int kChannelPerNode = 4; + + SimulatedDeviceInfo() {} + SimulatedDeviceInfo(int deviceSerial, int channelCount): + mDeviceSerial(deviceSerial), mChannelCount(channelCount) + {} + SimulatedDeviceInfo(int deviceSerial, int nodeCount, int handSide) : + mDeviceSerial(deviceSerial), mHandSide(handSide), mNodeCount(nodeCount) + { + mChannelCount = nodeCount * kChannelPerNode; + } + }; + + /// + /// Simple simulator for outputting sine wave channel data. + /// + class HardwareSimulator { + public: + HardwareSimulator(); + ~HardwareSimulator(); + + void AddSimulatedGlove(int deviceId, int nodeCount, int handedness); + void RegisterFrameDataCallback(std::function&)> data_callback); + void RegisterDeviceInfoCallback(std::function&)> device_info_callback); + void StartData(); + void Shutdown(); + + private: + bool bIsRunning = false; + std::thread mUpdateThread; + + void NotifyDataCallback(); + void NotifyInfoCallback(); + bool ReadDataFromCSV(); + static std::string GetExePath(); + + void UpdateAllDevicesWithData(std::vector& data); + + std::vector mSimulatedFrameDataSet; + std::vector mSimulatedDeviceInfoSet; + std::vector mNewDeviceInfo; + std::function&)> mOnFrameDataUpdate; + std::function&)> mOnDeviceInfoUpdate; + + const double mDataSampleRate = DATA_SAMPLERATE; + + protected: + std::recursive_mutex mDataLock; + }; +} \ No newline at end of file diff --git a/Optitrack Rokoko Glove/GloveDeviceExample/dllcommon.h b/Optitrack Rokoko Glove/GloveDeviceExample/dllcommon.h new file mode 100644 index 000000000..71f9b68bd --- /dev/null +++ b/Optitrack Rokoko Glove/GloveDeviceExample/dllcommon.h @@ -0,0 +1,12 @@ +//====================================================================================================== +// Copyright 2016, NaturalPoint Inc. +//====================================================================================================== + +// windows +#include +#define _CRTDBG_MAP_ALLOC +#include +#include +#define WIN32_LEAN_AND_MEAN +#include + diff --git a/Optitrack Rokoko Glove/GloveDeviceExample/dllmain.cpp b/Optitrack Rokoko Glove/GloveDeviceExample/dllmain.cpp new file mode 100644 index 000000000..31ce0fe66 --- /dev/null +++ b/Optitrack Rokoko Glove/GloveDeviceExample/dllmain.cpp @@ -0,0 +1,103 @@ +//====================================================================================================== +// Copyright 2016, NaturalPoint Inc. +//====================================================================================================== +// +// dllmain.cpp : Defines the entry point for the DLL application. +// + +#include "dllcommon.h" + +// stl +#include +#include +using namespace std; + +// OptiTrack Peripheral Device API +#include "IDeviceManager.h" +using namespace AnalogSystem; + +// local devices +#include "ExampleGloveDevice.h" +using namespace OptiTrackPluginDevices; + +int hostVersionMajor, hostVersionMinor, hostVersionRevision; + +#ifdef OPTITRACKPERIPHERALEXAMPLE_EXPORTS +#define OPTITRACKPERIPHERALEXAMPLE_API __declspec(dllexport) +#else +#define OPTITRACKPERIPHERALEXAMPLE_API __declspec(dllimport) +#endif + + +#ifdef __cplusplus +extern "C" { +#endif + +using namespace OptiTrackPluginDevices; +using namespace ExampleDevice; + + +/** + * Defines the version information of the plugin DLL within Motive. + */ +OPTITRACKPERIPHERALEXAMPLE_API void DLLVersion(int hostMajor, int hostMinor, int hostRevision, int& dllMajor, int& dllMinor, int& dllRevision) +{ + hostVersionMajor = hostMajor; + hostVersionMajor = hostMinor; + hostVersionMajor = hostRevision; + + // report this peripheral device's version to host + dllMajor = 1; + dllMinor = 0; + dllRevision = 0; +} + +/** + * Motive calls the following method on application start up. This register device factories with Motive + * so that the device can be instantiated when it's ready (1 factory per device) + */ +OPTITRACKPERIPHERALEXAMPLE_API int DLLEnumerateDeviceFactories(IDeviceManager* pDeviceManager) +{ + + list> availDFs; + + ExampleDevice::ExampleGlove_EnumerateDeviceFactories(pDeviceManager, availDFs); + for (list>::iterator iter = availDFs.begin(); iter != availDFs.end(); iter++) { + // transfers ownership of device factory to host + pDeviceManager->AddDevice(std::move(*iter)); + } + + return (int)availDFs.size(); +} + +/** + * The following method gets called on application shutdown. Proper shutdown should happen here; +* including termination of the process of the DLL and memory unload. + */ +OPTITRACKPERIPHERALEXAMPLE_API int PluginDLLUnload(IDeviceManager* pDeviceManager) +{ + // OPTIONAL: perform device DLL shutdown here + ExampleGlove_Shutdown(); + return 0; +} + +#ifdef __cplusplus +} +#endif + + +BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) +{ + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + break; + case DLL_THREAD_ATTACH: + break; + case DLL_THREAD_DETACH: + break; + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} diff --git a/Optitrack Rokoko Glove/GloveDeviceExample/readme.txt b/Optitrack Rokoko Glove/GloveDeviceExample/readme.txt new file mode 100644 index 000000000..5161b3d09 --- /dev/null +++ b/Optitrack Rokoko Glove/GloveDeviceExample/readme.txt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:359874042b2232244d3f73037a76b79b1b57f52d0b5f5892ab23b40305f2a48c +size 1734 diff --git a/Optitrack Rokoko Glove/GloveDeviceExample/x64/Debug/GloveDeviceExample.dll.recipe b/Optitrack Rokoko Glove/GloveDeviceExample/x64/Debug/GloveDeviceExample.dll.recipe new file mode 100644 index 000000000..3bafc959e --- /dev/null +++ b/Optitrack Rokoko Glove/GloveDeviceExample/x64/Debug/GloveDeviceExample.dll.recipe @@ -0,0 +1,11 @@ + + + + + C:\Program Files\OptiTrack\Motive\PeripheralAPI\example\x64\Debug\GloveDeviceExample.dll + + + + + + \ No newline at end of file diff --git a/Optitrack Rokoko Glove/GloveDeviceExample/x64/Debug/GloveDeviceExample.vcxproj.FileListAbsolute.txt b/Optitrack Rokoko Glove/GloveDeviceExample/x64/Debug/GloveDeviceExample.vcxproj.FileListAbsolute.txt new file mode 100644 index 000000000..e69de29bb diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core.meta new file mode 100644 index 000000000..332934b71 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d7417c9a13b2bd14ab1fea1d7ffa8e0a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/ARKitBlendshapes.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/ARKitBlendshapes.cs new file mode 100644 index 000000000..2777229ff --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/ARKitBlendshapes.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/ARKitBlendshapes.cs.meta new file mode 100644 index 000000000..9f3c5da8b --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/ARKitBlendshapes.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9f43a84310e40244c970e95e1d934b1a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI.meta new file mode 100644 index 000000000..ef7e6e92d --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 721c3fac4cc3fbe4188ec6ec27cb4708 +folderAsset: yes +timeCreated: 1564996317 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/CalibrateRequestData.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/CalibrateRequestData.cs new file mode 100644 index 000000000..139e05cd5 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/CalibrateRequestData.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/CalibrateRequestData.cs.meta new file mode 100644 index 000000000..7a6a6c69a --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/CalibrateRequestData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8982b58c0932ebd4eb488b92e43b178f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/InfoRequestData.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/InfoRequestData.cs new file mode 100644 index 000000000..a972ec8d0 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/InfoRequestData.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/InfoRequestData.cs.meta new file mode 100644 index 000000000..0e8c004c4 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/InfoRequestData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9029de61abd14c54194939b0c16fc45f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/LivestreamRequestData.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/LivestreamRequestData.cs new file mode 100644 index 000000000..5834985f5 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/LivestreamRequestData.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/LivestreamRequestData.cs.meta new file mode 100644 index 000000000..eb42acbc9 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/LivestreamRequestData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6f300f4cf7bd8a44bb2bb5453228193e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/PlaybackRequestData.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/PlaybackRequestData.cs new file mode 100644 index 000000000..be5fc9657 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/PlaybackRequestData.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/PlaybackRequestData.cs.meta new file mode 100644 index 000000000..3dd7fac09 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/PlaybackRequestData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 617231f45130160448cfef6a1670c3ff +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/RecordingRequestData.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/RecordingRequestData.cs new file mode 100644 index 000000000..a2cc051db --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/RecordingRequestData.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/RecordingRequestData.cs.meta new file mode 100644 index 000000000..b82176957 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/RecordingRequestData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d8f171d10619acd4193a50877e3a6856 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/RequestData.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/RequestData.cs new file mode 100644 index 000000000..dc95ce515 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/RequestData.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/RequestData.cs.meta new file mode 100644 index 000000000..a43720bfc --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/RequestData.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d5ec1713e30442a19275b49b0572d01b +timeCreated: 1552057825 \ No newline at end of file diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/ResetActorRequestData.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/ResetActorRequestData.cs new file mode 100644 index 000000000..b137ad2d6 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/ResetActorRequestData.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/ResetActorRequestData.cs.meta new file mode 100644 index 000000000..bac819f7f --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/ResetActorRequestData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8aa37890ebb422840868b7ece59e5570 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/StudioCommandAPI.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/StudioCommandAPI.cs new file mode 100644 index 000000000..70948e7e4 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/StudioCommandAPI.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/StudioCommandAPI.cs.meta new file mode 100644 index 000000000..1c1fd3396 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/StudioCommandAPI.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f38fe44d6bfb49dbabd93aea7da287ed +timeCreated: 1565078235 \ No newline at end of file diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/StudioCommandAPIBase.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/StudioCommandAPIBase.cs new file mode 100644 index 000000000..5c2947e00 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/StudioCommandAPIBase.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/StudioCommandAPIBase.cs.meta new file mode 100644 index 000000000..8b06017f9 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/StudioCommandAPIBase.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 23be0de9580d445683a1b786461b328d +timeCreated: 1565078385 \ No newline at end of file diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/TrackerRequestData.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/TrackerRequestData.cs new file mode 100644 index 000000000..4411f6c82 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/TrackerRequestData.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/TrackerRequestData.cs.meta new file mode 100644 index 000000000..0da218d94 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/CommandAPI/TrackerRequestData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dd7aa49a68dc87441bc55e7e5d2db0d8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/JsonLiveSerializerV3.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/JsonLiveSerializerV3.cs new file mode 100644 index 000000000..f6be07d90 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/JsonLiveSerializerV3.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/JsonLiveSerializerV3.cs.meta new file mode 100644 index 000000000..4a8e56783 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/JsonLiveSerializerV3.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 61943ed9a14442b4aa24885f7e8a735e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/LZ4Wrapper.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/LZ4Wrapper.cs new file mode 100644 index 000000000..e2ea8e752 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/LZ4Wrapper.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/LZ4Wrapper.cs.meta new file mode 100644 index 000000000..c366f3eab --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/LZ4Wrapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8b437a01c2f9fde489b7a18b6bac93d7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/StudioReceiver.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/StudioReceiver.cs new file mode 100644 index 000000000..f0359119d --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/StudioReceiver.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/StudioReceiver.cs.meta new file mode 100644 index 000000000..250d15832 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/StudioReceiver.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8cb1306ef28465d49b3d63bc97885931 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/UDPReceiver.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/UDPReceiver.cs new file mode 100644 index 000000000..ec8169f01 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/UDPReceiver.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/UDPReceiver.cs.meta new file mode 100644 index 000000000..e79ad368e --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Core/UDPReceiver.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9af01aaa3a63e7a4499c28b22dd1b20d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono.meta new file mode 100644 index 000000000..6801a5a69 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9fd28f925f7e38846913c7631653e97a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs.meta new file mode 100644 index 000000000..2fc218d10 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0b9e800521674004693e0a38816ed885 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/Actor.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/Actor.cs new file mode 100644 index 000000000..b4d0574f1 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/Actor.cs @@ -0,0 +1,397 @@ +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 + } + + [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)] + [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; + + [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; + } + + 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; + 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); + } + } + } + + /// + /// 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/Actor.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/Actor.cs.meta new file mode 100644 index 000000000..dd97febbc --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/Actor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0b3d830ef66b485459e15992199096b7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/ActorNewton.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/ActorNewton.cs new file mode 100644 index 000000000..5fc4bf471 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/ActorNewton.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/ActorNewton.cs.meta new file mode 100644 index 000000000..501ead62f --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/ActorNewton.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7694c1eb6726a2d49a01558f46c8ef83 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/BlendShapesMapping.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/BlendShapesMapping.cs new file mode 100644 index 000000000..1aa9a7731 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/BlendShapesMapping.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/BlendShapesMapping.cs.meta new file mode 100644 index 000000000..0fb0b28ed --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/BlendShapesMapping.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 07a3f22e5c105474e9725d5438558a99 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/Character.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/Character.cs new file mode 100644 index 000000000..111b83dad --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/Character.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/Character.cs.meta new file mode 100644 index 000000000..9af6d2ae0 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/Character.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 78192e8160352b7458fd2bc8ec3501ce +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/Face.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/Face.cs new file mode 100644 index 000000000..3667703c2 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/Face.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/Face.cs.meta new file mode 100644 index 000000000..adab01c0a --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/Face.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b6f1b7bab29ae9c4ab510759d0fbaa91 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/HumanBoneMapping.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/HumanBoneMapping.cs new file mode 100644 index 000000000..fff24d066 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/HumanBoneMapping.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/HumanBoneMapping.cs.meta new file mode 100644 index 000000000..f2eba44dc --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/HumanBoneMapping.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4a162b99fb9dfe542b5844d7b3d7c9fe +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/Prop.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/Prop.cs new file mode 100644 index 000000000..b13ed19c6 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/Prop.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/Prop.cs.meta new file mode 100644 index 000000000..e81e384f2 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/Prop.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8274508f93c440949969e644e7b64e65 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/PropColor.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/PropColor.cs new file mode 100644 index 000000000..717ea4123 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/PropColor.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/PropColor.cs.meta new file mode 100644 index 000000000..2f2e87847 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Inputs/PropColor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 93bc1b702e5f6fa4c9d905909f4741e6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/PrefabInstancer.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/PrefabInstancer.cs new file mode 100644 index 000000000..72a3f5dd6 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/PrefabInstancer.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/PrefabInstancer.cs.meta new file mode 100644 index 000000000..3972edc8e --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/PrefabInstancer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ded564a0c7575434ebb9c2faf540099d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/PrefabPool.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/PrefabPool.cs new file mode 100644 index 000000000..4c3dcd89a --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/PrefabPool.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/PrefabPool.cs.meta new file mode 100644 index 000000000..dfd0a4202 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/PrefabPool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 47b981a3ed34dc64b9ab5ae02663b220 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/RokokoHelper.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/RokokoHelper.cs new file mode 100644 index 000000000..c00e5ccc3 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/RokokoHelper.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/RokokoHelper.cs.meta new file mode 100644 index 000000000..a44fd391e --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/RokokoHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5fb415e868ac58149ae137d5bd2d006a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Serializable.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Serializable.meta new file mode 100644 index 000000000..fe19255d9 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Serializable.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 363721fc8fef7dc40a9243ec4954d2af +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Serializable/BlendshapesDictionary.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Serializable/BlendshapesDictionary.cs new file mode 100644 index 000000000..7c3df5d7c --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Serializable/BlendshapesDictionary.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Serializable/BlendshapesDictionary.cs.meta new file mode 100644 index 000000000..feb53ae5e --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Serializable/BlendshapesDictionary.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9681c86ca06b0de479fcf425d8560c3b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Serializable/HumanTPoseDictionary.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Serializable/HumanTPoseDictionary.cs new file mode 100644 index 000000000..992317c6b --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Serializable/HumanTPoseDictionary.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Serializable/HumanTPoseDictionary.cs.meta new file mode 100644 index 000000000..8193f3bdb --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Serializable/HumanTPoseDictionary.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9a32ea12a419b4544a5ef5263af08a26 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Serializable/SerializableDictionary.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Serializable/SerializableDictionary.cs new file mode 100644 index 000000000..26804dbcc --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Serializable/SerializableDictionary.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Serializable/SerializableDictionary.cs.meta new file mode 100644 index 000000000..47614b36f --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/Serializable/SerializableDictionary.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 40cfb04b525907c409046edb971ff8f1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/StudioManager.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/StudioManager.cs new file mode 100644 index 000000000..55a90ec64 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/StudioManager.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/StudioManager.cs.meta new file mode 100644 index 000000000..bc4ad1db4 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/StudioManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: de63a1dd9ec769e4080fd4da352fac11 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/TPoseGuideGameComponent.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/TPoseGuideGameComponent.cs new file mode 100644 index 000000000..13a999ac1 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/TPoseGuideGameComponent.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/TPoseGuideGameComponent.cs.meta new file mode 100644 index 000000000..0b97381ae --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/TPoseGuideGameComponent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4296b318fcf88b240a52b1fbe7be783e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/UI.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/UI.meta new file mode 100644 index 000000000..108691aea --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/UI.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7e6ff7aa69142344db48e66a446c3b21 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/UI/InputHierarchyRow.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/UI/InputHierarchyRow.cs new file mode 100644 index 000000000..44545377a --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/UI/InputHierarchyRow.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/UI/InputHierarchyRow.cs.meta new file mode 100644 index 000000000..cbbd46e6d --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/UI/InputHierarchyRow.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1ad284b4954ca4e4e87c771f198afd80 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/UI/UIHierarchyManager.cs b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/UI/UIHierarchyManager.cs new file mode 100644 index 000000000..75c2d8dcb --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/UI/UIHierarchyManager.cs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/UI/UIHierarchyManager.cs.meta new file mode 100644 index 000000000..584a968c5 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Mono/UI/UIHierarchyManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0726fb4ef719b9d46a2afcc8c682dc54 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins.meta new file mode 100644 index 000000000..9070f333a --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bbb359d9a38c1004bbe87c4f14822488 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4.meta new file mode 100644 index 000000000..87e980937 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 26a3fe8611eb3a44aa1ae9081871b540 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android.meta new file mode 100644 index 000000000..a229d9a9a --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 82985f460b91d5d4ba2aa833b74fef35 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs.meta new file mode 100644 index 000000000..c24562f1f --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ea56c1cd6eae28e479bc6dd92c6898f0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs/arm64-v8a.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs/arm64-v8a.meta new file mode 100644 index 000000000..f003678e4 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs/arm64-v8a/liblz4.so b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs/arm64-v8a/liblz4.so new file mode 100644 index 000000000..09cf40ea1 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs/arm64-v8a/liblz4.so.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs/arm64-v8a/liblz4.so.meta new file mode 100644 index 000000000..3867593cc --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs/arm64-v8a/liblz4.so.meta @@ -0,0 +1,27 @@ +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: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs/armeabi-v7a.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs/armeabi-v7a.meta new file mode 100644 index 000000000..61d32574c --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs/armeabi-v7a/liblz4.so b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs/armeabi-v7a/liblz4.so new file mode 100644 index 000000000..d019fa116 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs/armeabi-v7a/liblz4.so.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs/armeabi-v7a/liblz4.so.meta new file mode 100644 index 000000000..6595b0d31 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs/armeabi-v7a/liblz4.so.meta @@ -0,0 +1,27 @@ +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: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs/x86.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs/x86.meta new file mode 100644 index 000000000..57c0d572f --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs/x86/liblz4.so b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs/x86/liblz4.so new file mode 100644 index 000000000..5e8d176c7 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs/x86/liblz4.so.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs/x86/liblz4.so.meta new file mode 100644 index 000000000..9fb020b24 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/Android/libs/x86/liblz4.so.meta @@ -0,0 +1,27 @@ +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: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/iOS.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/iOS.meta new file mode 100644 index 000000000..83801bf94 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/iOS.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dd770c574097d3e4ea6aeddfb5b6da48 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/iOS/liblz4.a b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/iOS/liblz4.a new file mode 100644 index 000000000..0f9892c9a --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/iOS/liblz4.a.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/iOS/liblz4.a.meta new file mode 100644 index 000000000..c37cc48b1 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/iOS/liblz4.a.meta @@ -0,0 +1,27 @@ +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: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/lz4.bundle.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/lz4.bundle.meta new file mode 100644 index 000000000..d5a8d7429 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity 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/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/lz4.bundle/Contents/Info.plist b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/lz4.bundle/Contents/Info.plist new file mode 100644 index 000000000..d1d7f3ceb --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/lz4.bundle/Contents/Info.plist @@ -0,0 +1,46 @@ + + + + + BuildMachineOSBuild + 21D62 + CFBundleDevelopmentRegion + English + CFBundleExecutable + lz4 + CFBundleInfoDictionaryVersion + 6.0 + CFBundleLongVersionString + + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleSupportedPlatforms + + MacOSX + + CSResourcesFileMapped + + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 13C100 + DTPlatformName + macosx + DTPlatformVersion + 12.1 + DTSDKBuild + 21C46 + DTSDKName + macosx12.1 + DTXcode + 1321 + DTXcodeBuild + 13C100 + LSMinimumSystemVersion + 12.1 + NSHumanReadableCopyright + + + diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/lz4.bundle/Contents/MacOS/lz4 b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/lz4.bundle/Contents/MacOS/lz4 new file mode 100644 index 0000000000000000000000000000000000000000..ee9e530a55d52ecd70179f1b372f632953372015 GIT binary patch literal 388992 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

u}IKD-_+}h2rmzE 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

N%w zgZ_ctd^4egg(q6wy;5{M*z!(5*M1i|cKjE5cVV-e!TLIf|6|U`t|5luOM@QDJV=H| z8pQk(f1SBbd@RuiKX~9ZRH>i+6KoaO2R3cG{qTG;FY8zruqjVJ%iiyHqnlUu{;J?{ zyyA};_rD;0@8~b0zmwSCJ|_Fy*u#w$yrFG_ z4R=|$AU9I+ZA$>FzxMF=^`{KWnKDP6Fi8-9( z2uTY8zjAlR`X8C|dSNEMXuE<}rw4ZRrGZz%PoBQZhb_9>o3f)0e~=+*(zXHkq5TG% zSbNUqHTbLZZlRgpV#7pHiC7A0v`4HCAvy63D^j($EEM(vj!mC;SQ41>J z(<<3}JF}SaRiS>HZ=Cb%y7c^Z$e~{B&Qs)kAM$r>%ObH8I+cchIE%lmAT7QG#*fR;aYp_N5r{r z%lR32#%kbuk#{bDciaQ7h~2)oBHiR2$E2&?HPG#z5=WsEam5T**+giR9TRNPb78uF z-5;H}?In1|jm+r+M_5|IPduXvMyftFf5vX^A?n~AC#JBciaxnBJp2e1k>-SNDgRMY zZN75&2EdEe9!{#2m^}Se%QQKg^HK60zK`J<-c&7pS=E@6)pD(-zKboFH`BBp5 zeER<-?OQXTv#)=)@SKjcjePTIgT$vQ8Hz8Pp{h4J@eyCbbGF1rwS@HpyIgN4V0{(5 z=xnqo8*4axr@&`9zj7fjU!O}H3vZKweaIf{7%s9#wc{&iz_t>5BOm*%{`j%!|7^

+vOcwfGhhEpliv2m)<LjQe%Gh-RVm%FHz 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

?kHU*^W^7~#=f=e+ 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 + + + + files + + files2 + + rules + + ^Resources/ + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Resources/Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ + + nested + + weight + 10 + + ^.* + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^Resources/ + + weight + 20 + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Resources/Base\.lproj/ + + weight + 1010 + + ^[^/]+$ + + nested + + weight + 10 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/x86_64.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/x86_64.meta new file mode 100644 index 000000000..dbf0890b9 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/x86_64.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0b36efa71b5d9f444940eb00ad416ece +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/x86_64/lz4.dll b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/x86_64/lz4.dll new file mode 100644 index 000000000..eda7abe07 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/x86_64/lz4.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d7bb0b1b32a13c6b0e1ff9742c2e3aec8934d411c7dec141672e929189260b29 +size 1071104 diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/x86_64/lz4.dll.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/x86_64/lz4.dll.meta new file mode 100644 index 000000000..590e982d7 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/Plugins/LZ4/x86_64/lz4.dll.meta @@ -0,0 +1,27 @@ +fileFormatVersion: 2 +guid: e521e00f91993534799438ee73ee065a +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: diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/RokokoAssembly.asmdef b/Optitrack Rokoko Glove/Rokoko Unity Scripts/RokokoAssembly.asmdef new file mode 100644 index 000000000..da2573d13 --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/RokokoAssembly.asmdef @@ -0,0 +1,3 @@ +{ + "name": "Rokoko" +} diff --git a/Optitrack Rokoko Glove/Rokoko Unity Scripts/RokokoAssembly.asmdef.meta b/Optitrack Rokoko Glove/Rokoko Unity Scripts/RokokoAssembly.asmdef.meta new file mode 100644 index 000000000..bd58ac20e --- /dev/null +++ b/Optitrack Rokoko Glove/Rokoko Unity Scripts/RokokoAssembly.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c0283c4bf59b9ad4aa5b4622e1c041a8 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/ExampleGloveAdapterSingleton.cpp b/Optitrack Rokoko Glove/RokokoGloveDevice/ExampleGloveAdapterSingleton.cpp new file mode 100644 index 000000000..4e2c28b29 --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/ExampleGloveAdapterSingleton.cpp @@ -0,0 +1,733 @@ +//====================================================================================================== +// Copyright 2023, NaturalPoint Inc. +// Modified 2025 for Rokoko Glove Integration +//====================================================================================================== + +#include +#include +#define WIN32_LEAN_AND_MEAN +#include + +// Peripheral Import +#include "ExampleGloveAdapterSingleton.h" +#include "IDeviceManager.h" +#include "ExampleGloveDevice.h" +#include "LZ4Wrapper.h" +using namespace AnalogSystem; + +// Rokoko Integration - 기존 시뮬레이션 관련 정의를 주석 처리 +// #define SIM_DEVICE_COUNT 2 +// #define SIM_DEVICE_RATE 100 + + +OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::ExampleGloveAdapterSingleton(AnalogSystem::IDeviceManager* pDeviceManager) +{ + s_Instance = this; + mDeviceManager = pDeviceManager; + + // 기존 시뮬레이션 코드를 주석 처리 (로코코 통신으로 대체) + // mGloveSimulator = new SimulatedPluginDevices::HardwareSimulator(); + + mGloveDataMutex = new std::recursive_mutex(); + mDetectedDevices.clear(); + mLatestGloveData.clear(); + + // start detection thread + mDetectionThread = std::thread(&ExampleGloveAdapterSingleton::DoDetectionThread, this); +} + + +OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::~ExampleGloveAdapterSingleton() +{ + mDetectedDevices.clear(); + mLatestGloveData.clear(); + delete mGloveDataMutex; + bIsConnected = false; + bIsDetecting = false; + s_Instance = nullptr; + + if (mDetectionThread.joinable()) + { + mDetectionThread.join(); + } + + // 기존 시뮬레이션 코드를 주석 처리 + // mGloveSimulator->Shutdown(); + // delete mGloveSimulator; + + // 로코코 연결 해제 + DisconnectFromRokoko(); +} + + +bool OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::ClientShutdown() +{ + bIsConnected = false; + bIsDetecting = false; + + // 기존 시뮬레이션 코드를 주석 처리 + // if (mGloveSimulator != nullptr) + // { + // mGloveSimulator->Shutdown(); + // } + + // 로코코 연결 해제 + DisconnectFromRokoko(); + + return false; +} + +/////////////////////////////////////////////////////////////////////////////// +// +// Rokoko Glove Host Detection Thread +// +void OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::DoDetectionThread() +{ + while (!bIsConnected && bIsDetecting) + { + // Try reconnecting + if (s_Instance->mConnectionAttemptCount < s_Instance->kMaxConnectionAttempt) { + bIsConnected = ConnectToHost(); + s_Instance->mConnectionAttemptCount++; + } + else { + bIsDetecting = false; + NotifyConnectionFail(); + } + std::this_thread::sleep_for(std::chrono::milliseconds(20000)); + } +} + + +/////////////////////////////////////////////////////////////////////////////// +// +// Rokoko Integration - Connection Management +// +bool OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::ConnectToHost() +{ + // Check if glove server address is defined in Motive's settings. + if ((mServerAddress.empty())) { + char* szServerAddress = new char[MAX_PATH]; + if (mDeviceManager->GetProperty("Glove Server Address", &szServerAddress)) + { + std::string str(szServerAddress); + mServerAddress = str; + } + delete[] szServerAddress; + } + + /* + * [Glove SDK Placeholder] + * SDK call to connect to the host at 'mServerAddress'. + */ + bIsConnected = true; + + // 로코코 UDP 통신 시작 + if (ConnectToRokoko()) { + if (mDeviceManager) { + mDeviceManager->MessageToHost("[RokokoGlove] Successfully connected to Rokoko Studio", MessageType_StatusInfo); + } + return true; + } else { + if (mDeviceManager) { + mDeviceManager->MessageToHost("[RokokoGlove] Failed to connect to Rokoko Studio", MessageType_StatusInfo); + } + // 로코코 연결 실패 시 연결 실패로 처리 + bIsConnected = false; + return false; + } +} + +bool OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::ConnectToRokoko() +{ + try { + // 로코코 UDP 리시버 초기화 + mRokokoReceiver = std::make_unique(); + + // UDP 리시버 초기화 (포트 14043) + if (!mRokokoReceiver->Initialize(14043)) { + // 에러 메시지 출력 + std::string errorMsg = "Failed to initialize Rokoko UDP receiver: " + mRokokoReceiver->GetLastError(); + if (mDeviceManager) { + mDeviceManager->MessageToHost(errorMsg.c_str(), MessageType_StatusInfo); + } + return false; + } + + // 데이터 콜백 설정 + mRokokoReceiver->SetDataCallback([this](const std::vector& data, const std::string& senderIP) { + this->OnRokokoDataReceived(data, senderIP); + }); + + // UDP 수신 시작 + if (!mRokokoReceiver->StartListening()) { + std::string errorMsg = "Failed to start Rokoko UDP listening: " + mRokokoReceiver->GetLastError(); + if (mDeviceManager) { + mDeviceManager->MessageToHost(errorMsg.c_str(), MessageType_StatusInfo); + } + return false; + } + + bIsRokokoConnected = true; + + // 로코코 장치 동적 감지 및 생성 + DetectAndCreateRokokoDevices(); + + // 성공 메시지 출력 + if (mDeviceManager) { + mDeviceManager->MessageToHost("Successfully connected to Rokoko Studio via UDP on port 14043", MessageType_StatusInfo); + } + + return true; + + } catch (...) { + if (mDeviceManager) { + mDeviceManager->MessageToHost("Exception occurred while connecting to Rokoko", MessageType_StatusInfo); + } + return false; + } +} + +void OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::DisconnectFromRokoko() +{ + if (mRokokoReceiver) { + mRokokoReceiver->StopListening(); + mRokokoReceiver.reset(); + } + bIsRokokoConnected = false; + + if (mDeviceManager) { + mDeviceManager->MessageToHost("Disconnected from Rokoko Studio", MessageType_StatusInfo); + } +} + + +bool OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::IsConnected() +{ + return bIsConnected; +} + +void OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::SetLatestData(const sGloveDeviceData& gloveFingerData) +{ + s_Instance->mLatestGloveData[gloveFingerData.gloveId] = gloveFingerData; +} + +void OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::SetDeviceManager(AnalogSystem::IDeviceManager* pDeviceManager) +{ + if (s_Instance == nullptr) return; + if (pDeviceManager != nullptr) + { + s_Instance->mDeviceManager = pDeviceManager; + } +} + +void OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::SetLatestDeviceInfo(const sGloveDeviceBaseInfo& deviceInfo) +{ + s_Instance->mLatestDeviceInfo[deviceInfo.gloveId] = deviceInfo; +} + +bool OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::GetLatestData(const uint64_t mDeviceSerial, sGloveDeviceData& gloveFingerData) +{ + if (s_Instance == nullptr || !s_Instance -> bIsConnected) return false; + + bool res = false; + if (s_Instance->mGloveDataMutex->try_lock()) { + // Iterate through the glove data table and update + auto iter = s_Instance->mLatestGloveData.find(mDeviceSerial); + if (iter != s_Instance->mLatestGloveData.end()) + { + gloveFingerData = iter->second; + res = true; + } + s_Instance->mGloveDataMutex->unlock(); + } + return res; +} + + +void OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::CreateNewGloveDevice(sGloveDeviceBaseInfo& deviceInfo) +{ + uint64_t gloveId = deviceInfo.gloveId; + std::string deviceName = "RokokoGlove_" + std::to_string(deviceInfo.gloveId); // 이름을 RokokoGlove로 변경 + + // Create device factory using the name/id/serial/client. + std::unique_ptr pDF = + std::make_unique(deviceName, deviceInfo); + pDF->mDeviceIndex = s_Instance->mCurrentDeviceIndex; + s_Instance->mDeviceManager->AddDevice(std::move(pDF)); + s_Instance->mCurrentDeviceIndex++; + + // 로코코 장치 생성 성공 메시지 + if (s_Instance->mDeviceManager) { + std::string successMsg = "[RokokoGlove] Created new device: " + deviceName; + s_Instance->mDeviceManager->MessageToHost(successMsg.c_str(), MessageType_StatusInfo); + } + + return; +} + +void OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::NotifyConnectionFail() +{ + char* szServerAddress = new char[MAX_PATH]; + char szMessage[MAX_PATH]; + if (mDeviceManager->GetProperty("Glove Server Address", &szServerAddress)) { + if (!(strlen(szServerAddress) == 0)) + { + sprintf_s(szMessage, "[RokokoGlove] Failed to connect to Rokoko Studio on %s", szServerAddress); + mDeviceManager->MessageToHost(szMessage, MessageType_StatusInfo); + } + else + { + sprintf_s(szMessage, "[RokokoGlove] Failed to connect to Rokoko Studio on localhost"); + mDeviceManager->MessageToHost(szMessage, MessageType_StatusInfo); + } + } + delete[] szServerAddress; +} + +/////////////////////////////////////////////////////////////////////////////// +// +// Legacy Simulation Support (Commented Out) +// +/* +* Methods in this section were used for simulated hardware. +* Now replaced by Rokoko UDP communication. +*/ +void OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::StartSimulatedHardware(int deviceCount) +{ + // mGloveSimulator->StartData(); // 기존 시뮬레이션 코드를 주석 처리 +} + +void OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::RegisterSDKCallbacks() +{ + // s_Instance->mGloveSimulator->RegisterFrameDataCallback(OnDataCallback); // 기존 시뮬레이션 코드를 주석 처리 + // s_Instance->mGloveSimulator->RegisterDeviceInfoCallback(OnDeviceInfoCallback); // 기존 시뮬레이션 코드를 주석 처리 + + // Add simulated glove devices + // s_Instance->mGloveSimulator->AddSimulatedGlove(1, 15, 1); // 기존 시뮬레이션 코드를 주석 처리 + // s_Instance->mGloveSimulator->AddSimulatedGlove(2, 15, 2); // 기존 시뮬레이션 코드를 주석 처리 +} + +void OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::OnDataCallback(std::vector& gloveAllFingerData) +{ + // 기존 시뮬레이션 콜백을 주석 처리 (로코코 UDP 데이터 처리로 대체) + /* + if (s_Instance == nullptr) return; + + // [Glove SDK Placeholder] + // Data update callbacks to Keep the latest glove data map up-to-date. + s_Instance->mGloveDataMutex->lock(); + for (auto gloveFingerData : gloveAllFingerData) { + // Convert simulated data into glove data format. + sGloveDeviceData newGloveData = ConvertDataFormat(gloveFingerData); + s_Instance->SetLatestData(newGloveData); + } + s_Instance->mGloveDataMutex->unlock(); + */ + + // 로코코 UDP 데이터는 OnRokokoDataReceived에서 처리됨 +} + +void OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::OnDeviceInfoCallback(std::vector& newGloveInfo) +{ + // 기존 시뮬레이션 콜백을 주석 처리 (로코코 장치 정보로 대체) + /* + if (s_Instance == nullptr) return; + + // Create new gloves + for (SimulatedPluginDevices::SimulatedDeviceInfo glove : newGloveInfo) + { + s_Instance->mDeviceManager->MessageToHost(" [ExampleGloveDevice] New device(s) detected.", MessageType_StatusInfo); + sGloveDeviceBaseInfo newGloveDevice = ConvertDeviceInfoFormat(glove); + s_Instance->CreateNewGloveDevice(newGloveDevice); + } + */ + + // 로코코 장치 정보는 ConnectToRokoko에서 처리됨 +} + +/////////////////////////////////////////////////////////////////////////////// +// +// Legacy Data Conversion (Commented Out) +// +/* +* Methods in this section were used for converting simulated data. +* Now replaced by Rokoko data conversion. +*/ +sGloveDeviceBaseInfo OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::ConvertDeviceInfoFormat(SimulatedPluginDevices::SimulatedDeviceInfo& glove) +{ + // 기존 시뮬레이션 데이터 변환을 주석 처리 (로코코 데이터로 대체) + /* + sGloveDeviceBaseInfo ret; + + ret.battery = glove.mBattery; + ret.gloveId = glove.mDeviceSerial; + ret.signalStrength = glove.mSignalStrength; + ret.handSide = (glove.mHandSide == 1) ? eGloveHandSide::Left : + (glove.mHandSide == 2) ? eGloveHandSide::Right : + eGloveHandSide::Unknown; + + return ret; + */ + + // 로코코 장치 정보는 기본값으로 설정 + sGloveDeviceBaseInfo ret; + ret.battery = 100; // 기본 배터리 100% + ret.gloveId = 1; // 기본 장갑 ID + ret.signalStrength = 100; // 기본 신호 강도 100% + ret.handSide = eGloveHandSide::Left; // 기본 왼손 + + return ret; +} + +sGloveDeviceData OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::ConvertDataFormat(const SimulatedPluginDevices::SimulatedGloveFrameData& gloveFrameData) +{ + // 기존 시뮬레이션 데이터 변환을 주석 처리 (로코코 데이터로 대체) + /* + sGloveDeviceData ret; + ret.gloveId = gloveFrameData.mDeviceSerial; + ret.timestamp = 0; + + sFingerNode defaultNodes = { 0, 0, 0, 1 }; + ret.nodes = std::vector(15, defaultNodes); + + int node_iter = 0; + for (auto& fingerNode : ret.nodes) + { + fingerNode.node_id = node_iter; + fingerNode.quat_w = gloveFrameData.gloveFingerData[node_iter].quat_w; + fingerNode.quat_x = gloveFrameData.gloveFingerData[node_iter].quat_x; + fingerNode.quat_y = gloveFrameData.gloveFingerData[node_iter].quat_y; + fingerNode.quat_z = gloveFrameData.gloveFingerData[node_iter].quat_z; + node_iter++; + } + + return ret; + */ + + // 로코코 데이터는 ProcessRokokoData에서 처리됨 + // 기본 빈 데이터 반환 + sGloveDeviceData ret; + ret.gloveId = 1; + ret.timestamp = 0; + ret.nodes.clear(); + + return ret; +} + +/////////////////////////////////////////////////////////////////////////////// +// +// Rokoko Integration - UDP Data Processing +// +/* +* Methods in this section handle Rokoko UDP data reception and processing. +*/ + +void OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::OnRokokoDataReceived(const std::vector& data, const std::string& senderIP) +{ + if (s_Instance == nullptr) return; + + try { + // 로코코 데이터 처리 + s_Instance->ProcessRokokoData(data); + + // 디버그 정보 출력 (OptiTrack에서 확인 가능) + if (s_Instance->mDeviceManager) { + std::string debugMsg = "[RokokoGlove] Received " + std::to_string(data.size()) + " bytes from " + senderIP; + s_Instance->mDeviceManager->MessageToHost(debugMsg.c_str(), MessageType_StatusInfo); + } + + } catch (...) { + if (s_Instance->mDeviceManager) { + s_Instance->mDeviceManager->MessageToHost("[RokokoGlove] Error processing received data", MessageType_StatusInfo); + } + } +} + +void OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::ProcessRokokoData(const std::vector& data) +{ + try { + // 1단계: LZ4 압축 해제 (필요한 경우) + std::vector decompressedData; + if (RokokoIntegration::LZ4Wrapper::IsValidLZ4Data(data.data(), static_cast(data.size()))) { + decompressedData = RokokoIntegration::LZ4Wrapper::Decompress(data.data(), static_cast(data.size())); + if (decompressedData.empty()) { + if (mDeviceManager) { + mDeviceManager->MessageToHost("[RokokoGlove] LZ4 decompression failed", MessageType_StatusInfo); + } + return; + } + } else { + // LZ4 압축이 아닌 경우 원본 데이터 사용 + decompressedData = data; + } + + // 2단계: JSON 문자열로 변환 + std::string jsonString(decompressedData.begin(), decompressedData.end()); + + // 3단계: JSON 파싱하여 Rokoko 데이터 구조로 변환 + RokokoData::LiveFrame_v4 rokokoFrame; + if (!RokokoIntegration::RokokoDataParser::ParseLiveFrame(jsonString, rokokoFrame)) { + if (mDeviceManager) { + mDeviceManager->MessageToHost("[RokokoGlove] JSON parsing failed", MessageType_StatusInfo); + } + return; + } + + // 4단계: 다중 장치 데이터 처리 (왼손, 오른손) + ProcessMultipleDeviceData(rokokoFrame); + + // 5단계: 최신 프레임 업데이트 + mLastRokokoFrame = rokokoFrame; + + // 성공 메시지 출력 + if (mDeviceManager) { + mDeviceManager->MessageToHost("[RokokoGlove] Successfully processed Rokoko data", MessageType_StatusInfo); + } + + } catch (const std::exception& e) { + if (mDeviceManager) { + std::string errorMsg = "[RokokoGlove] Exception: " + std::string(e.what()); + mDeviceManager->MessageToHost(errorMsg.c_str(), MessageType_StatusInfo); + } + } catch (...) { + if (mDeviceManager) { + mDeviceManager->MessageToHost("[RokokoGlove] Unknown exception occurred", MessageType_StatusInfo); + } + } +} + +/////////////////////////////////////////////////////////////////////////////// +// +// Device Information Management +// +/* +* Methods in this section handle device information updates and management. +*/ + +void OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::UpdateDeviceInfo(uint64_t deviceId) +{ + try { + // 장치 정보 업데이트 (배터리, 신호 강도 등) + auto deviceInfoIter = mLatestDeviceInfo.find(deviceId); + if (deviceInfoIter != mLatestDeviceInfo.end()) { + // 기존 장치 정보 업데이트 + sGloveDeviceBaseInfo& deviceInfo = deviceInfoIter->second; + + // 배터리 상태 업데이트 (실제로는 Rokoko 데이터에서 가져와야 함) + deviceInfo.battery = 100; // 기본값 + + // 신호 강도 업데이트 (UDP 연결 상태 기반) + if (bIsRokokoConnected) { + deviceInfo.signalStrength = 100; // 연결됨 + } else { + deviceInfo.signalStrength = 0; // 연결 안됨 + } + + // 장치 정보 저장 + SetLatestDeviceInfo(deviceInfo); + } + + } catch (...) { + if (mDeviceManager) { + mDeviceManager->MessageToHost("[RokokoGlove] Error updating device info", MessageType_StatusInfo); + } + } +} + +/////////////////////////////////////////////////////////////////////////////// +// +// Dynamic Device Detection and Management +// +/* +* Methods in this section handle dynamic device detection and multi-device data processing. +*/ + +void OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::DetectAndCreateRokokoDevices() +{ + try { + // 기존 장치 정보 초기화 + mDetectedDevices.clear(); + mLatestGloveData.clear(); + mLatestDeviceInfo.clear(); + + // 왼손 장치 생성 + sGloveDeviceBaseInfo leftHandInfo; + leftHandInfo.gloveId = 1; + leftHandInfo.handSide = eGloveHandSide::Left; + leftHandInfo.battery = 100; + leftHandInfo.signalStrength = 100; + CreateNewGloveDevice(leftHandInfo); + SetLatestDeviceInfo(leftHandInfo); + mDetectedDevices.push_back(1); + + // 오른손 장치 생성 + sGloveDeviceBaseInfo rightHandInfo; + rightHandInfo.gloveId = 2; + rightHandInfo.handSide = eGloveHandSide::Right; + rightHandInfo.battery = 100; + rightHandInfo.signalStrength = 100; + CreateNewGloveDevice(rightHandInfo); + SetLatestDeviceInfo(rightHandInfo); + mDetectedDevices.push_back(2); + + // 장치 감지 완료 메시지 + if (mDeviceManager) { + std::string msg = "[RokokoGlove] Detected " + std::to_string(mDetectedDevices.size()) + " devices (Left & Right Hand)"; + mDeviceManager->MessageToHost(msg.c_str(), MessageType_StatusInfo); + } + + } catch (...) { + if (mDeviceManager) { + mDeviceManager->MessageToHost("[RokokoGlove] Error during device detection", MessageType_StatusInfo); + } + } +} + +void OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::ProcessMultipleDeviceData(const RokokoData::LiveFrame_v4& rokokoFrame) +{ + try { + // 검증: actors가 존재하는지 확인 + if (rokokoFrame.scene.actors.empty()) { + if (mDeviceManager) { + mDeviceManager->MessageToHost("[RokokoGlove] No actors found in frame", MessageType_StatusInfo); + } + return; + } + + const auto& actor = rokokoFrame.scene.actors[0]; + + // 왼손 데이터 처리 + if (ProcessHandData(actor.body, 1, eGloveHandSide::Left)) { + UpdateDeviceInfo(1); + } + + // 오른손 데이터 처리 + if (ProcessHandData(actor.body, 2, eGloveHandSide::Right)) { + UpdateDeviceInfo(2); + } + + } catch (const std::exception& e) { + if (mDeviceManager) { + std::string errorMsg = "[RokokoGlove] Exception in multi-device processing: " + std::string(e.what()); + mDeviceManager->MessageToHost(errorMsg.c_str(), MessageType_StatusInfo); + } + } catch (...) { + if (mDeviceManager) { + mDeviceManager->MessageToHost("[RokokoGlove] Unknown exception in multi-device processing", MessageType_StatusInfo); + } + } +} + +bool OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::ProcessHandData(const RokokoData::Body& body, uint64_t deviceId, eGloveHandSide handSide) +{ + try { + // 손가락 데이터를 OptiTrack 형식으로 변환 + sGloveDeviceData optiTrackData; + optiTrackData.gloveId = deviceId; + optiTrackData.timestamp = 0.0; + optiTrackData.nodes.resize(15); // 5개 손가락 × 3개 관절 + + // 손가락별 데이터 매핑 + if (handSide == eGloveHandSide::Left) { + // 왼손 데이터 매핑 + MapLeftHandJoints(body, optiTrackData.nodes); + } else { + // 오른손 데이터 매핑 + MapRightHandJoints(body, optiTrackData.nodes); + } + + // 노드 ID 설정 + for (int i = 0; i < 15; i++) { + optiTrackData.nodes[i].node_id = i; + } + + // 데이터 유효성 검사 + if (!RokokoIntegration::RokokoDataConverter::ValidateOptiTrackData(optiTrackData)) { + if (mDeviceManager) { + std::string errorMsg = "[RokokoGlove] Data validation failed for device " + std::to_string(deviceId); + mDeviceManager->MessageToHost(errorMsg.c_str(), MessageType_StatusInfo); + } + return false; + } + + // OptiTrack 데이터 저장 + mGloveDataMutex->lock(); + SetLatestData(optiTrackData); + mGloveDataMutex->unlock(); + + return true; + + } catch (...) { + if (mDeviceManager) { + std::string errorMsg = "[RokokoGlove] Error processing hand data for device " + std::to_string(deviceId); + mDeviceManager->MessageToHost(errorMsg.c_str(), MessageType_StatusInfo); + } + return false; + } +} + +void OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::MapLeftHandJoints(const RokokoData::Body& body, std::vector& nodes) +{ + // 엄지손가락 (Thumb) + if (body.leftThumbMedial) MapJoint(*body.leftThumbMedial, nodes[0]); // MP + if (body.leftThumbDistal) MapJoint(*body.leftThumbDistal, nodes[1]); // PIP + if (body.leftThumbTip) MapJoint(*body.leftThumbTip, nodes[2]); // DIP + + // 검지손가락 (Index) + if (body.leftIndexMedial) MapJoint(*body.leftIndexMedial, nodes[3]); // MP + if (body.leftIndexDistal) MapJoint(*body.leftIndexDistal, nodes[4]); // PIP + if (body.leftIndexTip) MapJoint(*body.leftIndexTip, nodes[5]); // DIP + + // 중지손가락 (Middle) + if (body.leftMiddleMedial) MapJoint(*body.leftMiddleMedial, nodes[6]); // MP + if (body.leftMiddleDistal) MapJoint(*body.leftMiddleDistal, nodes[7]); // PIP + if (body.leftMiddleTip) MapJoint(*body.leftMiddleTip, nodes[8]); // DIP + + // 약지손가락 (Ring) + if (body.leftRingMedial) MapJoint(*body.leftRingMedial, nodes[9]); // MP + if (body.leftRingDistal) MapJoint(*body.leftRingDistal, nodes[10]); // PIP + if (body.leftRingTip) MapJoint(*body.leftRingTip, nodes[11]); // DIP + + // 새끼손가락 (Little) + if (body.leftLittleMedial) MapJoint(*body.leftLittleMedial, nodes[12]); // MP + if (body.leftLittleDistal) MapJoint(*body.leftLittleDistal, nodes[13]); // PIP + if (body.leftLittleTip) MapJoint(*body.leftLittleTip, nodes[14]); // DIP +} + +void OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::MapRightHandJoints(const RokokoData::Body& body, std::vector& nodes) +{ + // 엄지손가락 (Thumb) + if (body.rightThumbMedial) MapJoint(*body.rightThumbMedial, nodes[0]); // MP + if (body.rightThumbDistal) MapJoint(*body.rightThumbDistal, nodes[1]); // PIP + if (body.rightThumbTip) MapJoint(*body.rightThumbTip, nodes[2]); // DIP + + // 검지손가락 (Index) + if (body.rightIndexMedial) MapJoint(*body.rightIndexMedial, nodes[3]); // MP + if (body.rightIndexDistal) MapJoint(*body.rightIndexDistal, nodes[4]); // PIP + if (body.rightIndexTip) MapJoint(*body.rightIndexTip, nodes[5]); // DIP + + // 중지손가락 (Middle) + if (body.rightMiddleMedial) MapJoint(*body.rightMiddleMedial, nodes[6]); // MP + if (body.rightMiddleDistal) MapJoint(*body.rightMiddleDistal, nodes[7]); // PIP + if (body.rightMiddleTip) MapJoint(*body.rightMiddleTip, nodes[8]); // DIP + + // 약지손가락 (Ring) + if (body.rightRingMedial) MapJoint(*body.rightRingMedial, nodes[9]); // MP + if (body.rightRingDistal) MapJoint(*body.rightRingDistal, nodes[10]); // PIP + if (body.rightRingTip) MapJoint(*body.rightRingTip, nodes[11]); // DIP + + // 새끼손가락 (Little) + if (body.rightLittleMedial) MapJoint(*body.rightLittleMedial, nodes[12]); // MP + if (body.rightLittleDistal) MapJoint(*body.rightLittleDistal, nodes[13]); // PIP + if (body.rightLittleTip) MapJoint(*body.rightLittleTip, nodes[14]); // DIP +} + +void OptiTrackPluginDevices::ExampleDevice::ExampleGloveAdapterSingleton::MapJoint(const RokokoData::ActorJointFrame& rokokoJoint, sFingerNode& optiTrackNode) +{ + // 쿼터니언 변환 + optiTrackNode.quat_w = rokokoJoint.rotation.w; + optiTrackNode.quat_x = rokokoJoint.rotation.x; + optiTrackNode.quat_y = rokokoJoint.rotation.y; + optiTrackNode.quat_z = rokokoJoint.rotation.z; +} \ No newline at end of file diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/ExampleGloveAdapterSingleton.h b/Optitrack Rokoko Glove/RokokoGloveDevice/ExampleGloveAdapterSingleton.h new file mode 100644 index 000000000..6f35ad9c0 --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/ExampleGloveAdapterSingleton.h @@ -0,0 +1,227 @@ +////====================================================================================================== +//// Copyright 2023, NaturalPoint Inc. +////====================================================================================================== +/** + * ExampleGloveAdapterSingleton class is an adapter class provided to demonstrate how communication between plugin device and + * the glove SDK can be managed. A singleton instance of this class manages interaction between plugin device and the glove + * device SDK. The adapter instance also stores a keeps the latest data and device info map that stores the currently detected device serials + * and the latest frame data so that corresponding glove device can poll from it. Please note that this is provided only as an example, and + * there could be other ways to set this up. + */ + + +#pragma once +#include +#include +#include +#include +#include +#include + +// OptiTrack Peripheral Device API +#include "AnalogChannelDescriptor.h" +#include "GloveDataFormat.h" +#include "HardwareSimulator.h" + +// Rokoko Integration +#include "RokokoData.h" +#include "RokokoUDPReceiver.h" +#include "RokokoDataParser.h" +#include "RokokoDataConverter.h" + +namespace OptiTrackPluginDevices +{ + namespace ExampleDevice + { + class ExampleGloveAdapterSingleton; + + static ExampleGloveAdapterSingleton* s_Instance = nullptr; + static std::unique_ptr gGloveAdapter; + + + /** + * This is an example glove adapter (singleton) class provided to demonstrate how glove data can be populated. + * This adapter class is reponsible for all interaction with the device SDK, and populating the glove data. + * Glove data for multiple glove devices should get aggregated in here. + */ + class ExampleGloveAdapterSingleton + { + friend class ExampleGloveDevice; + + public: + ExampleGloveAdapterSingleton(AnalogSystem::IDeviceManager* pDeviceManager); + ~ExampleGloveAdapterSingleton(); + + // Singleton design pattern + ExampleGloveAdapterSingleton(const ExampleGloveAdapterSingleton&) = delete; // Should not be cloneable + ExampleGloveAdapterSingleton& operator=(const ExampleGloveAdapterSingleton& other) = delete; // Shounot be assignable + + + /** + * Should call the shutdown from the plugin SDK. In this case, shutsdown the simulator + */ + bool ClientShutdown(); + + /** + * Detection thread for connecting to the glove server. + */ + void DoDetectionThread(); + std::thread mDetectionThread; + unsigned int mConnectionAttemptCount = 0; + const unsigned int kMaxConnectionAttempt = 10; + + + /** + * Connect to the glove host. + */ + bool ConnectToHost(); + + /** + * Connect to Rokoko Studio via UDP. + */ + bool ConnectToRokoko(); + + /** + * Disconnect from Rokoko Studio. + */ + void DisconnectFromRokoko(); + + private: + /** + * Returns whether detector is connected to Glove Host. + */ + bool IsConnected(); + + /** + * Saves the latest data to the map + */ + void SetLatestData(const sGloveDeviceData& gloveFingerData); + + /** + * Pointer to device manager for additional operations + */ + void SetDeviceManager(AnalogSystem::IDeviceManager* pDeviceManager); + + /** + * Saves the latest glove data to the map + */ + void SetLatestDeviceInfo(const sGloveDeviceBaseInfo& deviceInfo); + + + /** + * Gets the latest data for device with given unique serial + */ + bool GetLatestData(const std::uint64_t mDeviceSerial, sGloveDeviceData& gloveFingerData); + + /** + * Creates new device by instantiating the factory and transferring it to Motive + */ + void CreateNewGloveDevice(sGloveDeviceBaseInfo& deviceInfo); + + /** + * Prints error into Motive. + */ + void NotifyConnectionFail(); + + bool bIsConnected = false; + bool bIsDetecting = true; + int mCurrentDeviceIndex = 0; + std::string mServerAddress = ""; + + + /** + * [Glove SDK Placeholder] + * Example data map for storing aggregated device data. + */ + uint16_t mDeviceCount = 0; + std::vector mDetectedDevices; + std::unordered_map mLatestGloveData; + std::unordered_map mLatestDeviceInfo; + + /** + * Rokoko integration members + */ + std::unique_ptr mRokokoReceiver; + bool bIsRokokoConnected = false; + RokokoData::LiveFrame_v4 mLastRokokoFrame; + + /** + * [Legacy Glove SDK Placeholder - Commented Out] + * The following methods were sample callback functions for simulated hardware. + * Now replaced by Rokoko UDP communication. + */ + // bool bIsSimulating; + void StartSimulatedHardware(int deviceCount); // Legacy support + static void RegisterSDKCallbacks(); // Legacy support + static void OnDataCallback(std::vector& gloveFingerData); // Legacy support + static void OnDeviceInfoCallback(std::vector& newGloveInfo); // Legacy support + static sGloveDeviceBaseInfo ConvertDeviceInfoFormat(SimulatedPluginDevices::SimulatedDeviceInfo& glove); // Legacy support + static sGloveDeviceData ConvertDataFormat(const SimulatedPluginDevices::SimulatedGloveFrameData& glove); // Legacy support + + /** + * Rokoko UDP data callback function. + */ + void OnRokokoDataReceived(const std::vector& data, const std::string& senderIP); + + /** + * Process received Rokoko data and convert to OptiTrack format. + */ + void ProcessRokokoData(const std::vector& data); + + /** + * Update device information (battery, signal strength, etc.) + */ + void UpdateDeviceInfo(uint64_t deviceId); + + /** + * Detect and create Rokoko devices dynamically + */ + void DetectAndCreateRokokoDevices(); + + /** + * Process data for multiple devices (left/right hand) + */ + void ProcessMultipleDeviceData(const RokokoData::LiveFrame_v4& rokokoFrame); + + /** + * Process hand data for a specific device + */ + bool ProcessHandData(const RokokoData::Body& body, uint64_t deviceId, eGloveHandSide handSide); + + /** + * Map left hand joints from Rokoko data + */ + void MapLeftHandJoints(const RokokoData::Body& body, std::vector& nodes); + + /** + * Map right hand joints from Rokoko data + */ + void MapRightHandJoints(const RokokoData::Body& body, std::vector& nodes); + + /** + * Map individual joint data + */ + void MapJoint(const RokokoData::ActorJointFrame& rokokoJoint, sFingerNode& optiTrackNode); + + protected: + + /** + * [Legacy Glove SDK Simulator - Commented Out] + * Instance of simulator (now replaced by Rokoko integration) + */ + // SimulatedPluginDevices::HardwareSimulator* mGloveSimulator; + + /** + * [Glove SDK Placeholder] + * Example glove data mutex + */ + std::recursive_mutex* mGloveDataMutex; + + /** + * Pointer to device manager in Motive for reporting error messages. + */ + AnalogSystem::IDeviceManager* mDeviceManager; + }; + } + +} \ No newline at end of file diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/ExampleGloveData.csv b/Optitrack Rokoko Glove/RokokoGloveDevice/ExampleGloveData.csv new file mode 100644 index 000000000..21e484c78 --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/ExampleGloveData.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:816498d40aca6a7060d48313bd1946b20553894715095670b14192d4639bdce5 +size 549783 diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/ExampleGloveDevice.cpp b/Optitrack Rokoko Glove/RokokoGloveDevice/ExampleGloveDevice.cpp new file mode 100644 index 000000000..dbb24ec1c --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/ExampleGloveDevice.cpp @@ -0,0 +1,311 @@ +//====================================================================================================== +// Copyright 2022, NaturalPoint Inc. +//====================================================================================================== + +#pragma once +#include "ExampleGloveDevice.h" +#include "ExampleGloveAdapterSingleton.h" + +// OptiTrack Peripheral Device API +#include "AnalogChannelDescriptor.h" +#include "IDeviceManager.h" +using namespace AnalogSystem; +using namespace OptiTrackPluginDevices; +using namespace GloveDeviceProperties; +using namespace ExampleDevice; + + +/////////////////////////////////////////////////////////////////////////////// +// +// Device Helper: Initialization and Shutdown +// +void OptiTrackPluginDevices::ExampleDevice::ExampleGlove_EnumerateDeviceFactories(IDeviceManager* pDeviceManager, std::list>& dfs) +{ + // Start server detection + if (gGloveAdapter == nullptr) { + gGloveAdapter = std::make_unique(pDeviceManager); + } +} + +void OptiTrackPluginDevices::ExampleDevice::ExampleGlove_Shutdown() +{ + if (gGloveAdapter != nullptr) + { + gGloveAdapter->ClientShutdown(); + gGloveAdapter.reset(); + } +} + + +/////////////////////////////////////////////////////////////////////////////// +// +// Example Glove Device Factory +// +const char* OptiTrackPluginDevices::ExampleDevice::ExampleGloveDeviceFactory::Name() const +{ + return "ExampleGloveDevice"; +} + +std::unique_ptr OptiTrackPluginDevices::ExampleDevice::ExampleGloveDeviceFactory::Create() const +{ + ExampleGloveDevice* pDevice = new ExampleGloveDevice(mDeviceSerial, mDeviceInfo); + SetCommonGloveDeviceProperties(pDevice); + SetQuaternionDataChannels(pDevice); + + // Transfer ownership to host + std::unique_ptr ptrDevice(pDevice); + return ptrDevice; +} + + +/////////////////////////////////////////////////////////////////////////////// +// +// Example Glove Device +// +OptiTrackPluginDevices::ExampleDevice::ExampleGloveDevice::ExampleGloveDevice(uint32_t serial, sGloveDeviceBaseInfo deviceInfo) +{ + mDeviceInfo = deviceInfo; + mDeviceSerial = deviceInfo.gloveId; + bIsEnabled = true; +} + + +bool OptiTrackPluginDevices::ExampleDevice::ExampleGloveDevice::Configure() +{ + bool success = Deconfigure(); + if (!success) + return false; + + // update device's buffer allocation based on current channel and data type configuration + success = cPluginDevice::Configure(); + if (!success) + return false; + + bIsConfigured = success; + DeviceManager()->MessageToHost(this, "", MessageType_RequestRestart); + return success; +} + +bool OptiTrackPluginDevices::ExampleDevice::ExampleGloveDevice::Deconfigure() +{ + bool success = cPluginDevice::Deconfigure(); + + return success; +} + +bool OptiTrackPluginDevices::ExampleDevice::ExampleGloveDevice::StartCapture() +{ + bool success = cPluginDevice::StartCapture(); + + bIsCollecting = true; + mCollectionThread = CreateThread(nullptr, 0, CollectionThread, this, 0, nullptr); + if (mCollectionThread == nullptr) + { + return false; + bIsCollecting = false; + } + + return success; +} + +bool OptiTrackPluginDevices::ExampleDevice::ExampleGloveDevice::StopCapture() +{ + bool success = cPluginDevice::StopCapture(); + + // REQUIRED: Stop collecting data. Terminate hardware device polling thread + bIsCollecting = false; + DWORD waitResult = WaitForSingleObject(mCollectionThread, 1000); + if (waitResult == WAIT_OBJECT_0) + { + CloseHandle(mCollectionThread); + mCollectionThread = NULL; + success = true; + } + else if (waitResult == WAIT_TIMEOUT) + { + BOOL result = TerminateThread(mCollectionThread, 0); + success = (result == TRUE); + } + else + { + success = false; + } + return success; +} + +void OptiTrackPluginDevices::ExampleDevice::ExampleGloveDevice::OnPropertyChanged(const char* propertyName) +{ + cPluginDevice::OnPropertyChanged(propertyName); + + if (strcmp(propertyName, kEnabledPropName) == 0) + { + // Update device enabled state + GetProperty(kEnabledPropName, bIsEnabled); + } + else if (strcmp(propertyName, kRatePropName) == 0) + { + // Update device capture rate + GetProperty(kRatePropName, mDeviceRateFPS); + mRequestedRateMS = (1.0f / mDeviceRateFPS) * 1000.0f; + } + else if (strcmp(propertyName, kDataStatePropName) == 0) + { + int deviceState = 0; + GetProperty(kDataStatePropName, deviceState); + if (deviceState != DeviceDataState::DeviceState_ReceivingData) + { + // if not receiving data, disable battery state and signal strength + mBatteryLevel = GloveDeviceProp_BatteryUninitialized; + SetProperty(GloveDeviceProp_Battery, mBatteryLevel); + mSignalStrength = GloveDeviceProp_SignalStrengthUnitialized; + SetProperty(GloveDeviceProp_SignalStrength, mSignalStrength); + } + } + else if (strcmp(propertyName, GloveDeviceProp_Solver) == 0) + { + // Route solver type to device user data for interpreting in pipeline + int solver = 0; + GetProperty(GloveDeviceProp_Solver, solver); + SetProperty(cPluginDeviceBase::kUserDataPropName, solver); + } +} + +unsigned long __stdcall OptiTrackPluginDevices::ExampleDevice::ExampleGloveDevice::CollectionThread(LPVOID Context) +{ + ExampleGloveDevice* pThis = static_cast(Context); + return pThis->DoCollectionThread(); +} + +unsigned long OptiTrackPluginDevices::ExampleDevice::ExampleGloveDevice::DoCollectionThread() +{ + /* Collection Thread - + Motive's 15 channel glove data channel format for finger node rotations: + 1 = Thumb MP 1 (w,x,y,z) + 2 = Thumb PIP 2 + 3 = Thumb DIP 3 + 4 = Index MP 1 + 5 = Index PIP 2 + 6 = Index DIP 3 + 7 = Middle MP 1 + 8 = Middle PIP 2 + 9 = Middle DIP 3 + 10 = Ring MP 1 + 11 = Ring PIP 2 + 12 = Ring DIP 3 + 13 = Pinky MP 1 + 14 = Pinky PIP 2 + 15 = Pinky DIP 3 + + Hand joint orientation respects right-handed coordinate system. + For left hand, +X is pointed towards the finger tip. + For right hand, +X is pointer towards the wrist or the body. + */ + + // timers used for frame and ui updates + std::chrono::high_resolution_clock::time_point frameTimerStart, frameTimerEnd; + std::chrono::high_resolution_clock::time_point uiTimerStart, uiTimerEnd; + std::chrono::milliseconds actualFrameDurationMS; + double adjustment = 0.0; + double durationDeltaMS = 0.0; + + + // Glove device parameters (rate / battery / signal) + GetProperty(kEnabledPropName, bIsEnabled); + GetProperty(GloveDeviceProp_Battery, mBatteryLevel); + GetProperty(GloveDeviceProp_SignalStrength, mSignalStrength); + GetProperty(kRatePropName, mDeviceRateFPS); + mRequestedRateMS = (1.0f / mDeviceRateFPS) * 1000.0f; + + // Initialize glove handedness + InitializeGloveProperty(); + + //glove channel data arrray to be copied + float gloveChannelData[kGloveAnalogChannelCount]; + + // Collection thread + uiTimerStart = std::chrono::high_resolution_clock::now(); + while (bIsCollecting) + { + frameTimerStart = std::chrono::high_resolution_clock::now(); + int deviceFrameID = this->FrameCounter(); + + // Skip disabled devices + bool isDeviceEnabled = false; + GetProperty(kEnabledPropName, isDeviceEnabled); + if (!isDeviceEnabled) continue; + + // Poll latest glove data from the adapter + sGloveDeviceData t_data; + bool isGloveDataAvailable = gGloveAdapter->GetLatestData(mDeviceInfo.gloveId, t_data); + + if (isGloveDataAvailable) + { + if (!bIsInitialized) { + InitializeGloveProperty(); + } + + // Update ui every 5 secs (too frequent can cause unnecessary slowdowns) + uiTimerEnd = std::chrono::high_resolution_clock::now(); + auto elapsedTime = std::chrono::duration_cast(uiTimerEnd - uiTimerStart); + if (elapsedTime.count() > 5) + { + UpdateGloveProperty(mDeviceInfo); + uiTimerStart = std::chrono::high_resolution_clock::now(); + } + + // Frame Begin: get frame from device buffer + AnalogFrame* pFrame = this->BeginFrameUpdate(deviceFrameID); + if (pFrame) + { + // fill in frame header + int flags = 0; + + // Iterate through each bone and populate channel data. + // Skip the first bone, hand base, as it's driven from rigid body transform instead. + for (int i = 0; i < 15; i++) + { + int nodeChannelIndex = i * 4; + gloveChannelData[nodeChannelIndex] = t_data.nodes.at(i).quat_w; //w + gloveChannelData[nodeChannelIndex + 1] = t_data.nodes.at(i).quat_x; //x + gloveChannelData[nodeChannelIndex + 2] = t_data.nodes.at(i).quat_y; //y + gloveChannelData[nodeChannelIndex + 3] = t_data.nodes.at(i).quat_z; //z + } + + pFrame->SetID(deviceFrameID); + pFrame->SetFlag(flags); + //pFrame->SetTimestamp((double)mLastGloveDataTimebstamp.time); + ::memcpy(pFrame->ChannelData(), &gloveChannelData[0], kGloveAnalogChannelCount * sizeof(float)); + EndFrameUpdate(); + this->SetFrameCounter(deviceFrameID + 1); + } + + + // End frame update. Sleep the thread for the remaining frame period. + std::this_thread::sleep_for(std::chrono::milliseconds((int)(mRequestedRateMS - adjustment))); + frameTimerEnd = std::chrono::high_resolution_clock::now(); + actualFrameDurationMS = std::chrono::duration_cast(frameTimerEnd - frameTimerStart); + durationDeltaMS = actualFrameDurationMS.count() - mRequestedRateMS; + + // estimating adjustment to prevent oscillation on sleep duration. + if (durationDeltaMS > 1.0) + adjustment = -1.0; + else if (durationDeltaMS > 2.0) + adjustment = -2.0; + else if (durationDeltaMS > 3.0) + adjustment = -3.0; + else if (durationDeltaMS < -3.0) + adjustment = -3.0; + else if (durationDeltaMS < -2.0) + adjustment = 2.0; + else if (durationDeltaMS < -1.0) + adjustment = 1.0; + else + adjustment = 0.0; + if (fabs(adjustment) > 1.0) + { + this->LogError(MessageType_StatusInfo, "[Example Device] Device timing resolution off by %3.1f ms (requested:%3.1f, actual:%3.1f)", durationDeltaMS, mRequestedRateMS, (double) actualFrameDurationMS.count()); + } + } + } + return 0; +} diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/ExampleGloveDevice.h b/Optitrack Rokoko Glove/RokokoGloveDevice/ExampleGloveDevice.h new file mode 100644 index 000000000..a7a6d3a7e --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/ExampleGloveDevice.h @@ -0,0 +1,86 @@ +//====================================================================================================== +// Copyright 2023, NaturalPoint Inc. +//====================================================================================================== +/** + * This is an example glove device provided to demonstrate how a plugin device can be set up as a glove device + * in Motive. This class derives from GloveDeviceBase class which contains basic setups required by gloves. + */ + +#pragma once +#include +#include + +// OptiTrack Peripheral Device API +#include "dllcommon.h" +#include "GloveDeviceBase.h" +#include "GloveDataFormat.h" +#include "ExampleGloveAdapterSingleton.h" + +namespace OptiTrackPluginDevices +{ + namespace ExampleDevice{ + + class ExampleGloveDevice; + class ExampleGloveDeviceFactory; + + void ExampleGlove_EnumerateDeviceFactories(AnalogSystem::IDeviceManager* pDeviceManager, std::list>& dfs); + void ExampleGlove_Shutdown(); + + + /** + * For creating a device in Motive, a factory class must be created first. This example class inherits from the + * parent glove device factory where common glove functionalities and configurations are set. + */ + class ExampleGloveDeviceFactory : public OptiTrackPluginDevices::GloveDeviceFactoryBase + { + public: + ExampleGloveDeviceFactory(std::string deviceName, sGloveDeviceBaseInfo deviceInfo) : + GloveDeviceFactoryBase(deviceName.c_str(), deviceInfo.gloveId), mDeviceInfo(deviceInfo) + { + } + + /** + * Return device factory name + */ + virtual const char* Name() const override; + + /** + * The following method gets called by Motive. It creates and returns a new instance of device and transfers ownership to Motive. + */ + std::unique_ptr Create() const override; + + private: + sGloveDeviceBaseInfo mDeviceInfo; + }; + + + /** + * ExampleGloveDevice inherits from GloveDeviceBase and demonstrates how a glove plugin device can be created. + * Each device gets their own collection thread where they populate the channel data. This class is inherited from the parent + * GloveDeviceBase class where the basic glove setup is shown. + */ + class ExampleGloveDevice : public OptiTrackPluginDevices::GloveDeviceBase + { + public: + ExampleGloveDevice(uint32_t serial, sGloveDeviceBaseInfo deviceInfo); + virtual ~ExampleGloveDevice() = default; + + // IDevice implementation + virtual bool Configure(); + virtual bool Deconfigure(); + virtual bool StartCapture(); + virtual bool StopCapture(); + virtual void OnPropertyChanged(const char* propertyName); + + private: + + + /** + * Collection thread for populating glove analog data channels + */ + static unsigned long __stdcall CollectionThread(LPVOID Context); + unsigned long DoCollectionThread() override; + void* mCollectionThread = nullptr; + }; + } +} diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/GloveDataFormat.h b/Optitrack Rokoko Glove/RokokoGloveDevice/GloveDataFormat.h new file mode 100644 index 000000000..d434bca84 --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/GloveDataFormat.h @@ -0,0 +1,83 @@ +//====================================================================================================== +// Copyright 2023, NaturalPoint Inc. +//====================================================================================================== +/** + * This includes common glove data formats referenced in Motive. + */ + + +#pragma once +#include +#include +#include +#include + +enum class eGloveHandSide : int +{ + Unknown = 0, + Left = 1, + Right = 2 +}; + + +struct sGloveDataTimestamp +{ + uint8_t hour = 0; + uint8_t minute = 0; + uint32_t seconds = 0; + uint32_t nanoseconds = 0; + double t = 0; + sGloveDataTimestamp(uint32_t s, uint32_t n) : seconds(s), nanoseconds(n) { t = double(seconds) + double(nanoseconds) * 0.000000001; } + sGloveDataTimestamp(double time) { t = time; } + sGloveDataTimestamp() : t(0.0) {} + + bool operator >(const sGloveDataTimestamp& x) + { + return this->t > x.t; + } + bool operator <(const sGloveDataTimestamp& x) + { + return this->t < x.t; + } + bool operator ==(const sGloveDataTimestamp& x) + { + return this->t == x.t; + } + + sGloveDataTimestamp operator -(const sGloveDataTimestamp& x) + { + return sGloveDataTimestamp(this->t - x.t); + } + + operator const double() { + return t; + } +}; + +struct sFingerNode { + int node_id; + float quat_x; + float quat_y; + float quat_z; + float quat_w; +}; + +struct sGloveDeviceData { + uint64_t gloveId = 0; + std::vector nodes; + sGloveDataTimestamp timestamp; +}; + +struct sGloveDeviceBaseInfo +{ + uint32_t gloveId = 0; // device serial id + int battery = 0 ; + int signalStrength= 0; + eGloveHandSide handSide = eGloveHandSide::Unknown; +}; + + + + + + diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/GloveDeviceBase.cpp b/Optitrack Rokoko Glove/RokokoGloveDevice/GloveDeviceBase.cpp new file mode 100644 index 000000000..9700f47fd --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/GloveDeviceBase.cpp @@ -0,0 +1,258 @@ +//====================================================================================================== +// Copyright 2022, NaturalPoint Inc. +//====================================================================================================== +#include "dllcommon.h" +#include "GloveDeviceBase.h" + +// Optitrack Peripheral Device API +#include "AnalogChannelDescriptor.h" +#include "IDeviceManager.h" +#include "GloveDataFormat.h" +using namespace AnalogSystem; +using namespace OptiTrackPluginDevices; +using namespace GloveDeviceProperties; + +OptiTrackPluginDevices::GloveDeviceBase::GloveDeviceBase() +{ + this->SetCommonDeviceProperties(); + this->SetCommonGloveDeviceProperties(); +} + +void OptiTrackPluginDevices::GloveDeviceBase::SetCommonDeviceProperties() +{ + // Set appropriate default property values (and set advanced state) + ModifyProperty(cPluginDeviceBase::kModelPropName, true, true, false); + ModifyProperty(cPluginDeviceBase::kOrderPropName, true, false, true); + ModifyProperty(cPluginDeviceBase::kDisplayNamePropName, false, false, false); + + // Reveal glove related prop name + ModifyProperty(cPluginDeviceBase::kAssetPropName, false, false, false); // name of the paired skeleton asset + + // hide default properties that aren't relevant to glove device + ModifyProperty(cPluginDeviceBase::kSyncModePropName, true, true, true); + ModifyProperty(cPluginDeviceBase::kSyncStatusPropName, true, true, true); + ModifyProperty(cPluginDeviceBase::kUseExternalClockPropName, true, true, true); + ModifyProperty(cPluginDeviceBase::kMocapRateMultiplePropName, true, true, true); + ModifyProperty(cPluginDeviceBase::kScalePropName, true, true, true); + ModifyProperty(cPluginDeviceBase::kCalOffsetPropName, true, true, true); + ModifyProperty(cPluginDeviceBase::kCalSquareRotationPropName, true, true, true); + ModifyProperty(cPluginDeviceBase::kUserDataPropName, true, true, true); + ModifyProperty(cPluginDeviceBase::kZeroPropName, true, true, true); + ModifyProperty(cPluginDeviceBase::kGroupNamePropName, true, true, true); + + // hide advanced properties + ModifyProperty(cPluginDeviceBase::kConnectedPropName, true, false, true); + ModifyProperty(cPluginDeviceBase::kNamePropName, true, false, true); + ModifyProperty(cPluginDeviceBase::kChannelCountPropName, true, false, true); + ModifyProperty(cPluginDeviceBase::kAppRunModePropName, true, false, true); + ModifyProperty(cPluginDeviceBase::kMocapSyncFramePropName, true, false, true); + ModifyProperty(cPluginDeviceBase::kSyncFramePropName, true, false, true); + ModifyProperty(cPluginDeviceBase::kNeedDeviceSyncFramePropName, false, false, true); + ModifyProperty(cPluginDeviceBase::kNeedMocapSyncFramePropName, false, false, true); + ModifyProperty(cPluginDeviceBase::kUseDriftCorrectionPropName, false, false, true); + ModifyProperty(cPluginDeviceBase::kMasterSerialPropName, true, false, true); + ModifyProperty(cPluginDeviceBase::kDriftCorrectionPropName, true, false , true); + SetProperty(cPluginDeviceBase::kEnabledPropName, true); + SetProperty(cPluginDeviceBase::kConnectedPropName, true); + SetProperty(cPluginDeviceBase::kMocapRateMultiplePropName, 1); +} + +void OptiTrackPluginDevices::GloveDeviceBase::SetCommonGloveDeviceProperties() +{ + // Add glove related properties + AddProperty(GloveDeviceProperties::GloveDeviceProp_HandSide, GloveHandSide, kHandSideCount, 0, "Settings", false); + AddProperty(GloveDeviceProperties::GloveDeviceProp_Battery, GloveDeviceProp_BatteryUninitialized, "Settings", false); + AddProperty(GloveDeviceProperties::GloveDeviceProp_SignalStrength, GloveDeviceProp_SignalStrengthUnitialized, "Settings", false); + //AddProperty(GloveDeviceProperties::GloveDeviceProp_Reconnect, false, "Settings", false); + + // Modify property visibility + ModifyProperty(GloveDeviceProperties::GloveDeviceProp_SignalStrength, true, false, false, false); + ModifyProperty(GloveDeviceProperties::GloveDeviceProp_HandSide, true, false, false); + ModifyProperty(GloveDeviceProperties::GloveDeviceProp_Battery, true, false, false, false); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// Setter: Glove Device +// +void OptiTrackPluginDevices::GloveDeviceBase::SetDeviceRate(int rate) +{ + mDeviceRateFPS = rate; + mRequestedRateMS = (1.0f / mDeviceRateFPS) * 1000.0f; + return; +} + +void OptiTrackPluginDevices::GloveDeviceBase::SetHandSide(eGloveHandSide side) +{ + mHandSide = side; + return; +} + +void OptiTrackPluginDevices::GloveDeviceBase::SetEnabled(bool enabled) +{ + bIsEnabled = enabled; +} + +void OptiTrackPluginDevices::GloveDeviceBase::SetCollecting(bool collecting) +{ + bIsCollecting = collecting; +} + +bool OptiTrackPluginDevices::GloveDeviceBase::SetDeviceSerial(std::string serial) +{ + mDeviceSerial = serial; + // Set device serial property + return false; +} + +bool OptiTrackPluginDevices::GloveDeviceBase::SetDeviceData(sGloveDeviceData data) +{ + mLastGloveData = data; + return true; +} + +bool OptiTrackPluginDevices::GloveDeviceBase::SetBatteryLevel(int level) +{ + if (SetProperty(GloveDeviceProperties::GloveDeviceProp_Battery, (int)level)) + { + mBatteryLevel = level; + return true; + } + return false; +} + +bool OptiTrackPluginDevices::GloveDeviceBase::SetSignalStrength(int signal) +{ + if (SetProperty(GloveDeviceProperties::GloveDeviceProp_SignalStrength, (int)signal)) + { + mSignalStrength = signal; + return true; + } + return false; +} + +void OptiTrackPluginDevices::GloveDeviceBase::InitializeGloveProperty() +{ + if (mDeviceInfo.handSide == eGloveHandSide::Left) + { + SetProperty(GloveDeviceProperties::GloveDeviceProp_HandSide, 1); + SetProperty(cPluginDeviceBase::kOrderPropName, 1); + bIsInitialized = true; + } + else if (mDeviceInfo.handSide == eGloveHandSide::Right) + { + SetProperty(GloveDeviceProperties::GloveDeviceProp_HandSide, 2); + SetProperty(cPluginDeviceBase::kOrderPropName, 2); + bIsInitialized = true; + } + return; +} + + +void OptiTrackPluginDevices::GloveDeviceBase::UpdateGloveProperty(const sGloveDeviceBaseInfo& deviceInfo) +{ + // update glove property when the device is receiving data. + int deviceState = 0; + GetProperty(kDataStatePropName, deviceState); + if (deviceState == DeviceDataState::DeviceState_ReceivingData) + { + if (mSignalStrength != 1) + { + mSignalStrength = deviceInfo.signalStrength; + double signal = fabs(mSignalStrength); + SetProperty(GloveDeviceProp_SignalStrength, (int)signal); + } + SetProperty(GloveDeviceProp_SignalStrength, -100); + + if (mBatteryLevel != deviceInfo.battery) + { + mBatteryLevel = (int)(deviceInfo.battery); //Battery level percentage. + SetProperty(GloveDeviceProp_Battery, (int)mBatteryLevel); + } + } +} + + +/////////////////////////////////////////////////////////////////////////////// +// +// Glove Device Factory +// +void OptiTrackPluginDevices::GloveDeviceFactoryBase::SetCommonGloveDeviceProperties(GloveDeviceBase* pDevice) const +{ + // REQUIRED: Set device name/model/serial + pDevice->SetProperty(cPluginDeviceBase::kNamePropName, (char*)DeviceName()); + pDevice->SetProperty(cPluginDeviceBase::kDisplayNamePropName, (char*)DeviceName()); + pDevice->SetProperty(cPluginDeviceBase::kModelPropName, "Glove Model"); // model + char mDeviceSerial[MAX_PATH]; + sprintf_s(mDeviceSerial, "%s-serial", DeviceName()); + pDevice->SetProperty(cPluginDeviceBase::kSerialPropName, mDeviceSerial); // device serial (must be unique!) + pDevice->SetProperty(cPluginDeviceBase::kDeviceTypePropName, (long)DeviceType_Glove); // set device type as glove + pDevice->SetProperty(cPluginDeviceBase::kRatePropName, 120.0); // glove sampling rate + pDevice->SetProperty(cPluginDeviceBase::kUseDriftCorrectionPropName, true); // drift correction to fetch most recent data. + pDevice->SetProperty(cPluginDeviceBase::kOrderPropName, (int) eGloveHandSide::Unknown); // device order: (0 = uninitialized, 1=left, 2=right) +} + + +void OptiTrackPluginDevices::GloveDeviceFactoryBase::SetDeviceIndex(int t_index) +{ + mDeviceIndex = t_index; + return; +} + +void OptiTrackPluginDevices::GloveDeviceFactoryBase::SetQuaternionDataChannels(GloveDeviceBase* pDevice) const +{ + // Set glove data channels: + // 5 fingers * 3 joints per finger * 4 floats per quat (x/y/z/w) = 60 channels + int channelIndex; + int gloveAnalogChannelCount = 60; + char szChannelNames[MAX_PATH]; + + // add channels + for (int i = 0; i < gloveAnalogChannelCount; i++) + { + int finger = i / 12; // 12 channels per finger + switch (finger) + { + case 0: sprintf_s(szChannelNames, "T"); break; + case 1: sprintf_s(szChannelNames, "I"); break; + case 2: sprintf_s(szChannelNames, "M"); break; + case 3: sprintf_s(szChannelNames, "R"); break; + case 4: sprintf_s(szChannelNames, "P"); break; + } + + int joint = (i / 4) % 3; // 3 joints per finger + switch (joint) + { + case 0: sprintf_s(szChannelNames, "%s-MCP", szChannelNames); break; + case 1: sprintf_s(szChannelNames, "%s-PIP", szChannelNames); break; + case 2: sprintf_s(szChannelNames, "%s-DIP", szChannelNames); break; + } + + int axis = i % 4; // 4 floats per joint + switch (axis) + { + case 0: sprintf_s(szChannelNames, "%s W", szChannelNames); break; + case 1: sprintf_s(szChannelNames, "%s X", szChannelNames); break; + case 2: sprintf_s(szChannelNames, "%s Y", szChannelNames); break; + case 3: sprintf_s(szChannelNames, "%s Z", szChannelNames); break; + } + channelIndex = pDevice->AddChannelDescriptor(szChannelNames, ChannelType_Float); + + } + + // enable all channels by default + for (int i = 0; i <= channelIndex; i++) + { + // data channel enabled by default + pDevice->ChannelDescriptor(i)->SetProperty(ChannelProp_Enabled, true); + + // hide unused channel properties + pDevice->ChannelDescriptor(i)->ModifyProperty(ChannelProp_Units, true, true); + pDevice->ChannelDescriptor(i)->ModifyProperty(ChannelProp_Name, true, true); + pDevice->ChannelDescriptor(i)->ModifyProperty(ChannelProp_MinVoltage, true, true); + pDevice->ChannelDescriptor(i)->ModifyProperty(ChannelProp_MaxVoltage, true, true); + pDevice->ChannelDescriptor(i)->ModifyProperty(ChannelProp_TerminalName, true, true); + pDevice->ChannelDescriptor(i)->ModifyProperty(ChannelProp_TerminalType, true, true); + pDevice->ChannelDescriptor(i)->ModifyProperty(ChannelProp_MaxVoltage, true, true); + } +} \ No newline at end of file diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/GloveDeviceBase.h b/Optitrack Rokoko Glove/RokokoGloveDevice/GloveDeviceBase.h new file mode 100644 index 000000000..cac502cc7 --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/GloveDeviceBase.h @@ -0,0 +1,180 @@ +//====================================================================================================== +// Copyright 2023, NaturalPoint Inc. +//====================================================================================================== +/** + * GloveDeviceBase/GloveDeviceFactory class extends the cPluginDeviceBase and configures data channels and device properties required + * by a glove device in Motive. The purpose of this class is to abstract out setups needed for creating glove device as demonstrated + * in the ExampleGloveDevice. When developing a glove plugin to animate fingers in Motive, the following class can be inherited if needed. + */ + +#include +#include +#include +#include + +// OptiTrack Peripheral Device API +#include "PluginDevice.h" +#include "PluginDeviceFactory.h" +#include "GloveDataFormat.h" + +namespace OptiTrackPluginDevices +{ + class GloveDeviceBase; + class GloveDeviceFactoryBase; + + /** + * Common glove device properties used in Motive. + */ + namespace GloveDeviceProperties + { + static const int kHandSideCount = 3; + static const char* GloveHandSide[kHandSideCount] = + { + "Uninitialized", + "Left", + "Right" + }; + // Glove type needs to be set at the device level (0 = uninitialized, 1 = left, 2 = right) + static const char* GloveDeviceProp_HandSide = "Hand Side"; + static const char* GloveDeviceProp_Battery = "Battery"; + static const char* GloveDeviceProp_SignalStrength = "Signal Strength"; + static const char* GloveDeviceProp_ServerAddress = "Server Address"; + static const char* GloveDeviceProp_Reconnect = "Reconnect"; + static const char* GloveDeviceProp_Solver = "Glove Solver"; + static const int GloveDeviceProp_BatteryUninitialized = -1; + static const int GloveDeviceProp_SignalStrengthUnitialized = -1; + static const int kGloveAnalogChannelCount = 60; + } + + /** + * GloveDeviceFactory class demonstrates how plugin device factory can be set up for creating a glove device in Motive. + * To create a device in Motive, an instance of PLuginDeviceFactory must be created per each device, and then, its ownership must be + * transferred to Motive by using Create method. The GloveDeviceFactory inherits from PLuginDeviceFactory and demonstrates common + * glove properties and data channels can be configured; which is demonstrated in this base class. + */ + class GloveDeviceFactoryBase : public AnalogSystem::PluginDeviceFactory + { + public: + GloveDeviceFactoryBase(std::string deviceName, uint32_t serial) : + AnalogSystem::PluginDeviceFactory(deviceName.c_str()), mDeviceSerial(serial) {} + + uint32_t mDeviceSerial = -1; + int mDeviceIndex = 0; + + protected: + void SetDeviceIndex(int t_index); + + /** + * Sets up quaternion data channels for delivering local rotation of the finger nodes. + * Motive skeleton's hand consists of total 15 finger nodes, 3 per each finger. + * These data channels will get populated by the collection thread running on each device. + * Quaternion values are expected, resulting in total 60 float channels (15 finger nodes * 4 quat floats / node). + * Local rotation data is expected, and both hand data expects right-handed coordinate system with +x axis + * pointing towards the finger tip for left hand and towards the wrist/body for right hand. + */ + void SetQuaternionDataChannels(GloveDeviceBase* pDevice) const; + + /** + * Set Common Glove device properties + */ + void SetCommonGloveDeviceProperties(GloveDeviceBase* pDevice) const; + }; + + /** + * cGloveDeviceBase class is an example class which glove devices could inherit from. + * This class includes basic setups and configurations for glove devices in Motive. + */ + class GloveDeviceBase : public AnalogSystem::cPluginDevice + { + friend class GloveDeviceFactoryBase; + + public: + GloveDeviceBase(); + ~GloveDeviceBase() = default; + + void SetCommonDeviceProperties(); + void SetCommonGloveDeviceProperties(); + + protected: + // Device status + bool bIsEnabled = false; + bool bIsCollecting = false; + bool bIsInitialized = false; + bool bIsConfigured = false; + + // Device info + sGloveDeviceBaseInfo mGloveInfo; + std::string mDeviceSerial = ""; + eGloveHandSide mHandSide = eGloveHandSide::Unknown; + int mBatteryLevel = 0; + int mSignalStrength = 0; + double mDeviceRateFPS = 0; + double mRequestedRateMS = 0.0; + + // Glove data + sGloveDeviceData mLastGloveData; + + // Collection thread must be created on the device class. Defined in ExampleGloveDevice class. + virtual unsigned long DoCollectionThread() = 0; + + /** + * Configure device rate + */ + void SetDeviceRate(int rate); + + /** + * Configure hand side + */ + void SetHandSide(eGloveHandSide side); + + /** + * Enable or disable device + */ + void SetEnabled(bool enabled); + + /** + * Set collection status + */ + void SetCollecting(bool collecting); + + /** + * Set device serial string each device must have unique serial + */ + bool SetDeviceSerial(std::string serial); + + /** + * Set device data + */ + bool SetDeviceData(sGloveDeviceData data); + + /** + * Set device battery level (1-100) + */ + bool SetBatteryLevel(int level); + + /** + * Sets the signal stregth (1-128) + */ + bool SetSignalStrength(int signal); + + + bool IsEnabled() { return bIsEnabled; }; + bool IsCollecting() { return bIsCollecting; }; + int GetSignalStrength() { return mSignalStrength; } + int GetBatteryLevel() { return mBatteryLevel; } + double GetDeviceRate() { return mDeviceRateFPS; } + sGloveDeviceData GetLastestData() { return mLastGloveData; }; + + /** + * Initialize the properties for the glove device + */ + void InitializeGloveProperty(); + + /** + * Updates the device properties. Gets called periodically within collection thread. + * Mainly updates the battery level and signal strength. + */ + void UpdateGloveProperty(const sGloveDeviceBaseInfo& deviceInfo); + sGloveDeviceBaseInfo mDeviceInfo; + }; +} diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/HardwareSimulator.cpp b/Optitrack Rokoko Glove/RokokoGloveDevice/HardwareSimulator.cpp new file mode 100644 index 000000000..d6add29c2 --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/HardwareSimulator.cpp @@ -0,0 +1,185 @@ +//====================================================================================================== +// Copyright 2023, NaturalPoint Inc. +//====================================================================================================== +#include "HardwareSimulator.h" +#include +#include +#include +#include + +using namespace std; + +SimulatedPluginDevices::HardwareSimulator::HardwareSimulator() +{} + +SimulatedPluginDevices::HardwareSimulator::~HardwareSimulator() +{ + bIsRunning = false; + if (mUpdateThread.joinable()) { + mUpdateThread.join(); + } +} + +void SimulatedPluginDevices::HardwareSimulator::StartData() +{ + bIsRunning = true; + mUpdateThread = std::thread(&HardwareSimulator::ReadDataFromCSV, this); +} + +void SimulatedPluginDevices::HardwareSimulator::Shutdown() +{ + bIsRunning = false; + if (mUpdateThread.joinable()) + { + mUpdateThread.join(); + } +} + +void SimulatedPluginDevices::HardwareSimulator::RegisterDeviceInfoCallback(std::function&)> device_info_callback) +{ + mOnDeviceInfoUpdate = device_info_callback; +} + +void SimulatedPluginDevices::HardwareSimulator::NotifyDataCallback() +{ + if (mOnFrameDataUpdate) + { + mOnFrameDataUpdate(mSimulatedFrameDataSet); + } +} + +void SimulatedPluginDevices::HardwareSimulator::NotifyInfoCallback() +{ + if (mOnDeviceInfoUpdate) + { + mOnDeviceInfoUpdate(mNewDeviceInfo); + mNewDeviceInfo.clear(); + } +} + +void SimulatedPluginDevices::HardwareSimulator::AddSimulatedGlove(int deviceId, int nodeCount, int handedness) +{ + SimulatedDeviceInfo device(deviceId, nodeCount, handedness); + mSimulatedDeviceInfoSet.push_back(device); + mNewDeviceInfo.push_back(device); + mSimulatedFrameDataSet.push_back(SimulatedGloveFrameData(device.mDeviceSerial, device.mNodeCount)); + NotifyInfoCallback(); +} + +void SimulatedPluginDevices::HardwareSimulator::RegisterFrameDataCallback(std::function&)> data_callback) +{ + mOnFrameDataUpdate = data_callback; +} + + +/** + * [Example] Simply read each frame data from the provided csv file and update the data callback. + */ +bool SimulatedPluginDevices::HardwareSimulator::ReadDataFromCSV() +{ + double mRequestedRateMS = (1.0f / mDataSampleRate) * 1000.0f; + std::string filename = GetExePath() + "\\devices\\ExampleGloveData.csv"; + + // Read the provided example CSV file (60 channels) + std::ifstream fin(filename); + if (!fin.is_open()) + { + // Failed to open the device + return false; + } + + bool isFirstLine = true; + std::vector field_names; + + // loop through lines of data + std::string lineRead; + while (bIsRunning) + { + std::vector frame_data; + std::vector jointData; + + if (fin.eof()) + { + //loop back to begining + fin.clear(); + fin.seekg(0, std::ios::beg); + isFirstLine = true; + } + + std::getline(fin, lineRead); + std::stringstream lineStream(lineRead); + + // Read comma-separated values + std::string val; + std::getline(lineStream, val, ','); // skip first column + while (getline(lineStream, val, ',')) + { + if (isFirstLine) + { + field_names.push_back(val); + } + else + { + try + { + float val_f = std::stof(val); + jointData.push_back(val_f); + + } + catch (const std::exception* e) + { + // error converting the value. Terminate + return false; + } + + if (jointData.size() == 4) + { + SimulatedFingerData finger; + // next finger joint + finger.quat_w = jointData.at(0); + finger.quat_x = jointData.at(1); + finger.quat_y = jointData.at(2); + finger.quat_z = jointData.at(3); + frame_data.push_back(finger); + jointData.clear(); + } + } + } + + if (isFirstLine) + isFirstLine = false; + else { + if (frame_data.size() != 0) + { + UpdateAllDevicesWithData(frame_data); + } + } + + // End of a line sleep + std::this_thread::sleep_for(std::chrono::milliseconds((int)mRequestedRateMS)); + } + return true; +} + +void SimulatedPluginDevices::HardwareSimulator::UpdateAllDevicesWithData(std::vector& data) +{ + mDataLock.lock(); + // Loop through list of data instances in the frame data vector and update all instances + for (auto& gloveDevice : mSimulatedFrameDataSet) + { + // Set all finger data + gloveDevice.gloveFingerData = data; + } + NotifyDataCallback(); + mDataLock.unlock(); +} + +std::string SimulatedPluginDevices::HardwareSimulator::GetExePath() +{ + std::string path; + char buffer[MAX_PATH]; + GetModuleFileNameA(NULL, buffer, MAX_PATH); + string::size_type pos = string(buffer).find_last_of("\\/"); + path = string(buffer).substr(0, pos)/*+"\\system.exe"*/; + return path; +} \ No newline at end of file diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/HardwareSimulator.h b/Optitrack Rokoko Glove/RokokoGloveDevice/HardwareSimulator.h new file mode 100644 index 000000000..6a1deada8 --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/HardwareSimulator.h @@ -0,0 +1,111 @@ +////====================================================================================================== +//// Copyright 2023, NaturalPoint Inc. +////====================================================================================================== +/* +* SimulatedHardware class is used for demonstrating third-party glove SDK DLL to simulate a third-party hardware. +* For the purpose of the example glove device, the finger tracking data is read from the csv file. +*/ +#pragma once +#define DATA_SAMPLERATE 120 + +#include +#include +#include +#include +#include +#include + +namespace SimulatedPluginDevices { + + class HardwareSimulator; + + struct SimulatedFingerData + { + float quat_x = 0; + float quat_y = 0; + float quat_z = 0; + float quat_w = 0; + float pos_x = 0; + float pos_y = 0; + float pos_z = 0; + + SimulatedFingerData() {}; + SimulatedFingerData(float x, float y, float z, float w) : + quat_x(x), quat_y(y), quat_z(z), quat_w(w) {} + }; + + struct SimulatedGloveFrameData { + int mDeviceSerial = 0; + int mChannelCount = 0; + int kChannelPerNode = 4; + int mNodeCount = 0; + + std::vector gloveFingerData; // for glove data + + SimulatedGloveFrameData() {} + SimulatedGloveFrameData(int deviceSerial, int nodeCount) : + mDeviceSerial(deviceSerial), + mNodeCount(nodeCount) + { + mChannelCount = mNodeCount * kChannelPerNode; + gloveFingerData.resize(mNodeCount); + } + }; + + struct SimulatedDeviceInfo { + int mDeviceSerial = 0; // device serial id + int mBattery = 100; + int mSignalStrength = 100; + int mHandSide = 0; + int mNodeCount = 0; + int mChannelCount = 0; + int kChannelPerNode = 4; + + SimulatedDeviceInfo() {} + SimulatedDeviceInfo(int deviceSerial, int channelCount): + mDeviceSerial(deviceSerial), mChannelCount(channelCount) + {} + SimulatedDeviceInfo(int deviceSerial, int nodeCount, int handSide) : + mDeviceSerial(deviceSerial), mHandSide(handSide), mNodeCount(nodeCount) + { + mChannelCount = nodeCount * kChannelPerNode; + } + }; + + ///

+ /// Simple simulator for outputting sine wave channel data. + /// + class HardwareSimulator { + public: + HardwareSimulator(); + ~HardwareSimulator(); + + void AddSimulatedGlove(int deviceId, int nodeCount, int handedness); + void RegisterFrameDataCallback(std::function&)> data_callback); + void RegisterDeviceInfoCallback(std::function&)> device_info_callback); + void StartData(); + void Shutdown(); + + private: + bool bIsRunning = false; + std::thread mUpdateThread; + + void NotifyDataCallback(); + void NotifyInfoCallback(); + bool ReadDataFromCSV(); + static std::string GetExePath(); + + void UpdateAllDevicesWithData(std::vector& data); + + std::vector mSimulatedFrameDataSet; + std::vector mSimulatedDeviceInfoSet; + std::vector mNewDeviceInfo; + std::function&)> mOnFrameDataUpdate; + std::function&)> mOnDeviceInfoUpdate; + + const double mDataSampleRate = DATA_SAMPLERATE; + + protected: + std::recursive_mutex mDataLock; + }; +} \ No newline at end of file diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/LZ4Wrapper.cpp b/Optitrack Rokoko Glove/RokokoGloveDevice/LZ4Wrapper.cpp new file mode 100644 index 000000000..8623e5e74 --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/LZ4Wrapper.cpp @@ -0,0 +1,100 @@ +//====================================================================================================== +// Copyright 2025, Rokoko Glove OptiTrack Integration +//====================================================================================================== + +#include "LZ4Wrapper.h" +#include "lz4.h" +#include +#include + +namespace RokokoIntegration +{ + std::vector LZ4Wrapper::Decompress(const uint8_t* compressedData, int compressedSize) + { + try { + // 입력 데이터 검증 + if (!compressedData || compressedSize <= 0) { + return {}; + } + + // LZ4 데이터 유효성 검사 + if (!IsValidLZ4Data(compressedData, compressedSize)) { + return {}; + } + + // 압축 해제된 크기 추정 + int decompressedSize = GetDecompressedSize(compressedData, compressedSize); + if (decompressedSize <= 0) { + return {}; + } + + // 크기 유효성 검사 + if (!ValidateDecompressedSize(compressedSize, decompressedSize)) { + return {}; + } + + // 압축 해제 실행 + std::vector decompressed(decompressedSize); + int actualSize = LZ4_decompress_safe( + reinterpret_cast(compressedData), + reinterpret_cast(decompressed.data()), + compressedSize, + decompressedSize + ); + + // 압축 해제 결과 검증 + if (actualSize != decompressedSize) { + return {}; + } + + return decompressed; + + } catch (...) { + // 모든 예외 상황에서 안전하게 빈 벡터 반환 + return {}; + } + } + + bool LZ4Wrapper::IsValidLZ4Data(const uint8_t* data, int size) + { + if (!data || size < 4) { + return false; + } + + // LZ4 매직 넘버 확인 (간단한 검증) + // 실제로는 더 정교한 검증이 필요할 수 있음 + return true; + } + + int LZ4Wrapper::GetDecompressedSize(const uint8_t* compressedData, int compressedSize) + { + try { + // LZ4에서 압축 해제된 크기 추정 + int decompressedSize = LZ4_decompress_safe( + reinterpret_cast(compressedData), + nullptr, + compressedSize, + 0 + ); + return decompressedSize; + + } catch (...) { + return -1; + } + } + + bool LZ4Wrapper::ValidateDecompressedSize(int compressedSize, int decompressedSize) + { + // 압축 해제된 크기가 합리적인 범위인지 확인 + if (decompressedSize <= 0 || decompressedSize > MAX_DECOMPRESSED_SIZE) { + return false; + } + + // 압축률이 합리적인지 확인 (일반적으로 1:1 ~ 1:10) + if (decompressedSize < compressedSize || decompressedSize > compressedSize * 10) { + return false; + } + + return true; + } +} diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/LZ4Wrapper.h b/Optitrack Rokoko Glove/RokokoGloveDevice/LZ4Wrapper.h new file mode 100644 index 000000000..50e6ac237 --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/LZ4Wrapper.h @@ -0,0 +1,56 @@ +//====================================================================================================== +// Copyright 2025, Rokoko Glove OptiTrack Integration +//====================================================================================================== +/** + * LZ4Wrapper class provides LZ4 decompression functionality for Rokoko glove data. + * This wrapper handles safe decompression and validation of compressed data. + */ + +#pragma once +#include +#include + +namespace RokokoIntegration +{ + class LZ4Wrapper + { + public: + /** + * Decompresses LZ4 compressed data + * @param compressedData Pointer to compressed data + * @param compressedSize Size of compressed data + * @return Decompressed data as vector, empty if decompression fails + */ + static std::vector Decompress(const uint8_t* compressedData, int compressedSize); + + /** + * Validates if the data appears to be valid LZ4 compressed data + * @param data Pointer to data to validate + * @param size Size of data + * @return true if data appears to be valid LZ4 data + */ + static bool IsValidLZ4Data(const uint8_t* data, int size); + + /** + * Gets the decompressed size from LZ4 header + * @param compressedData Pointer to compressed data + * @param compressedSize Size of compressed data + * @return Decompressed size, -1 if invalid + */ + static int GetDecompressedSize(const uint8_t* compressedData, int compressedSize); + + private: + /** + * Validates decompressed size is reasonable + * @param compressedSize Size of compressed data + * @param decompressedSize Size of decompressed data + * @return true if sizes are reasonable + */ + static bool ValidateDecompressedSize(int compressedSize, int decompressedSize); + + /** + * Maximum reasonable decompressed size (10MB) + */ + static const int MAX_DECOMPRESSED_SIZE = 10 * 1024 * 1024; + }; +} diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/RokokoData.h b/Optitrack Rokoko Glove/RokokoGloveDevice/RokokoData.h new file mode 100644 index 000000000..b4abbf0ef --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/RokokoData.h @@ -0,0 +1,116 @@ +//====================================================================================================== +// Copyright 2025, Rokoko Glove OptiTrack Integration +//====================================================================================================== +/** + * RokokoData.h defines the data structures for Rokoko Studio LiveFrame_v4 format. + * These structures match the JSON format used by Rokoko Unity scripts. + */ + +#pragma once +#include +#include +#include + +namespace RokokoData +{ + // Vector3 structure for position data + struct Vector3Frame + { + float x = 0.0f; + float y = 0.0f; + float z = 0.0f; + }; + + // Vector4 structure for quaternion rotation data + struct Vector4Frame + { + float x = 0.0f; + float y = 0.0f; + float z = 0.0f; + float w = 1.0f; + }; + + // Actor joint frame containing position and rotation + struct ActorJointFrame + { + Vector3Frame position; + Vector4Frame rotation; + }; + + // Body structure containing finger joints + struct Body + { + // Left hand finger joints + std::shared_ptr leftThumbProximal; + std::shared_ptr leftThumbMedial; + std::shared_ptr leftThumbDistal; + std::shared_ptr leftThumbTip; + + std::shared_ptr leftIndexProximal; + std::shared_ptr leftIndexMedial; + std::shared_ptr leftIndexDistal; + std::shared_ptr leftIndexTip; + + std::shared_ptr leftMiddleProximal; + std::shared_ptr leftMiddleMedial; + std::shared_ptr leftMiddleDistal; + std::shared_ptr leftMiddleTip; + + std::shared_ptr leftRingProximal; + std::shared_ptr leftRingMedial; + std::shared_ptr leftRingDistal; + std::shared_ptr leftRingTip; + + std::shared_ptr leftLittleProximal; + std::shared_ptr leftLittleMedial; + std::shared_ptr leftLittleDistal; + std::shared_ptr leftLittleTip; + + // Right hand finger joints (similar structure) + std::shared_ptr rightThumbProximal; + std::shared_ptr rightThumbMedial; + std::shared_ptr rightThumbDistal; + std::shared_ptr rightThumbTip; + + std::shared_ptr rightIndexProximal; + std::shared_ptr rightIndexMedial; + std::shared_ptr rightIndexDistal; + std::shared_ptr rightIndexTip; + + std::shared_ptr rightMiddleProximal; + std::shared_ptr rightMiddleMedial; + std::shared_ptr rightMiddleDistal; + std::shared_ptr rightMiddleTip; + + std::shared_ptr rightRingProximal; + std::shared_ptr rightRingMedial; + std::shared_ptr rightRingDistal; + std::shared_ptr rightRingTip; + + std::shared_ptr rightLittleProximal; + std::shared_ptr rightLittleMedial; + std::shared_ptr rightLittleDistal; + std::shared_ptr rightLittleTip; + }; + + // Actor data structure + struct ActorData + { + std::string id; + std::string name; + Body body; + }; + + // Scene structure containing actors + struct SceneFrame + { + std::vector actors; + }; + + // Main LiveFrame_v4 structure + struct LiveFrame_v4 + { + double timestamp = 0.0; + SceneFrame scene; + }; +} diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/RokokoDataConverter.cpp b/Optitrack Rokoko Glove/RokokoGloveDevice/RokokoDataConverter.cpp new file mode 100644 index 000000000..f0798fc66 --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/RokokoDataConverter.cpp @@ -0,0 +1,213 @@ +//====================================================================================================== +// Copyright 2025, Rokoko Glove OptiTrack Integration +//====================================================================================================== + +#include "RokokoDataConverter.h" +#include "RokokoData.h" +#include +#include +#include + +namespace RokokoIntegration +{ + // 정적 상수는 헤더에서 inline으로 정의됨 + + sGloveDeviceData RokokoDataConverter::ConvertRokokoToOptiTrack(const RokokoData::LiveFrame_v4& rokokoFrame) + { + sGloveDeviceData optiTrackData; + + try { + // 기본 데이터 설정 + optiTrackData.gloveId = 1; // 기본 장갑 ID + optiTrackData.timestamp = 0.0; // 타임스탬프는 나중에 설정 + + // 15개 OptiTrack 관절 노드 초기화 + optiTrackData.nodes.resize(TOTAL_OPTITRACK_JOINTS); + + // 검증: actors가 존재하는지 확인 + if (rokokoFrame.scene.actors.empty()) { + optiTrackData.nodes.clear(); + return optiTrackData; + } + + const auto& actor = rokokoFrame.scene.actors[0]; + + // 손가락별 데이터 매핑 (왼손) + // 엄지손가락 (Thumb) + if (actor.body.leftThumbMedial) ConvertJoint(*actor.body.leftThumbMedial, optiTrackData.nodes[0]); // MP + if (actor.body.leftThumbDistal) ConvertJoint(*actor.body.leftThumbDistal, optiTrackData.nodes[1]); // PIP + if (actor.body.leftThumbTip) ConvertJoint(*actor.body.leftThumbTip, optiTrackData.nodes[2]); // DIP + + // 검지손가락 (Index) + if (actor.body.leftIndexMedial) ConvertJoint(*actor.body.leftIndexMedial, optiTrackData.nodes[3]); // MP + if (actor.body.leftIndexDistal) ConvertJoint(*actor.body.leftIndexDistal, optiTrackData.nodes[4]); // PIP + if (actor.body.leftIndexTip) ConvertJoint(*actor.body.leftIndexTip, optiTrackData.nodes[5]); // DIP + + // 중지손가락 (Middle) + if (actor.body.leftMiddleMedial) ConvertJoint(*actor.body.leftMiddleMedial, optiTrackData.nodes[6]); // MP + if (actor.body.leftMiddleDistal) ConvertJoint(*actor.body.leftMiddleDistal, optiTrackData.nodes[7]); // PIP + if (actor.body.leftMiddleTip) ConvertJoint(*actor.body.leftMiddleTip, optiTrackData.nodes[8]); // DIP + + // 약지손가락 (Ring) + if (actor.body.leftRingMedial) ConvertJoint(*actor.body.leftRingMedial, optiTrackData.nodes[9]); // MP + if (actor.body.leftRingDistal) ConvertJoint(*actor.body.leftRingDistal, optiTrackData.nodes[10]); // PIP + if (actor.body.leftRingTip) ConvertJoint(*actor.body.leftRingTip, optiTrackData.nodes[11]); // DIP + + // 새끼손가락 (Little) + if (actor.body.leftLittleMedial) ConvertJoint(*actor.body.leftLittleMedial, optiTrackData.nodes[12]); // MP + if (actor.body.leftLittleDistal) ConvertJoint(*actor.body.leftLittleDistal, optiTrackData.nodes[13]); // PIP + if (actor.body.leftLittleTip) ConvertJoint(*actor.body.leftLittleTip, optiTrackData.nodes[14]); // DIP + + // 노드 ID 설정 + for (int i = 0; i < TOTAL_OPTITRACK_JOINTS; i++) { + optiTrackData.nodes[i].node_id = i; + } + + } catch (...) { + // 에러 발생 시 빈 데이터 반환 + optiTrackData.nodes.clear(); + } + + return optiTrackData; + } + + bool RokokoDataConverter::ConvertJoint(const RokokoData::ActorJointFrame& rokokoJoint, sFingerNode& optiTrackNode) + { + try { + // 쿼터니언 변환 + ConvertQuaternion(rokokoJoint.rotation, + optiTrackNode.quat_w, + optiTrackNode.quat_x, + optiTrackNode.quat_y, + optiTrackNode.quat_z); + + // 쿼터니언 정규화 + NormalizeQuaternion(optiTrackNode.quat_w, + optiTrackNode.quat_x, + optiTrackNode.quat_y, + optiTrackNode.quat_z); + + // 쿼터니언 유효성 검사 + if (!ValidateQuaternion(optiTrackNode.quat_w, + optiTrackNode.quat_x, + optiTrackNode.quat_y, + optiTrackNode.quat_z)) { + return false; + } + + return true; + + } catch (...) { + return false; + } + } + + bool RokokoDataConverter::ValidateOptiTrackData(const sGloveDeviceData& gloveData) + { + // 기본 검증 + if (gloveData.nodes.size() != TOTAL_OPTITRACK_JOINTS) { + return false; + } + + // 각 노드 검증 + for (const auto& node : gloveData.nodes) { + if (!ValidateQuaternion(node.quat_w, node.quat_x, node.quat_y, node.quat_z)) { + return false; + } + } + + return true; + } + + std::string RokokoDataConverter::GetMappingInfo() + { + std::ostringstream oss; + oss << "Rokoko to OptiTrack Finger Joint Mapping:\n"; + oss << "Total Rokoko joints: " << TOTAL_ROKOKO_JOINTS << " (4 per finger)\n"; + oss << "Total OptiTrack joints: " << TOTAL_OPTITRACK_JOINTS << " (3 per finger)\n"; + oss << "Mapping removes proximal joints and keeps:\n"; + oss << " - Medial (MP): Metacarpophalangeal\n"; + oss << " - Distal (PIP): Proximal Interphalangeal\n"; + oss << " - Tip (DIP): Distal Interphalangeal\n"; + + return oss.str(); + } + + void RokokoDataConverter::MapFingerJoints(const std::vector& rokokoFingers, + std::vector& optiTrackNodes) + { + if (rokokoFingers.size() != TOTAL_ROKOKO_JOINTS || optiTrackNodes.size() != TOTAL_OPTITRACK_JOINTS) { + return; + } + + // 매핑 테이블을 사용하여 관절 변환 + for (int i = 0; i < TOTAL_OPTITRACK_JOINTS; i++) { + int rokokoIndex = JOINT_MAPPING[i]; + if (rokokoIndex >= 0 && rokokoIndex < TOTAL_ROKOKO_JOINTS) { + ConvertJoint(rokokoFingers[rokokoIndex], optiTrackNodes[i]); + } + } + } + + void RokokoDataConverter::ConvertQuaternion(const RokokoData::Vector4Frame& rokokoQuat, + float& quat_w, float& quat_x, float& quat_y, float& quat_z) + { + // Rokoko 쿼터니언을 OptiTrack 형식으로 복사 + quat_w = rokokoQuat.w; + quat_x = rokokoQuat.x; + quat_y = rokokoQuat.y; + quat_z = rokokoQuat.z; + } + + void RokokoDataConverter::NormalizeQuaternion(float& w, float& x, float& y, float& z) + { + float length = std::sqrt(w * w + x * x + y * y + z * z); + + if (length > 0.0f) { + float invLength = 1.0f / length; + w *= invLength; + x *= invLength; + y *= invLength; + z *= invLength; + } else { + // 유효하지 않은 쿼터니언인 경우 기본값 설정 + w = 1.0f; + x = 0.0f; + y = 0.0f; + z = 0.0f; + } + } + + bool RokokoDataConverter::ValidateQuaternion(float w, float x, float y, float z) + { + // NaN 체크 + if (std::isnan(w) || std::isnan(x) || std::isnan(y) || std::isnan(z)) { + return false; + } + + // 무한대 체크 + if (std::isinf(w) || std::isinf(x) || std::isinf(y) || std::isinf(z)) { + return false; + } + + // 쿼터니언 길이 체크 (정규화된 경우 1.0에 가까워야 함) + float length = std::sqrt(w * w + x * x + y * y + z * z); + if (std::abs(length - 1.0f) > 0.1f) { + return false; + } + + return true; + } + + void RokokoDataConverter::ApplyHandCoordinateSystem(bool isLeftHand, float& x, float& y, float& z) + { + // 좌우손 좌표계 변환 + if (isLeftHand) { + // 왼손: +X축이 손가락 끝 방향 + // 변환 없음 (기본값) + } else { + // 오른손: +X축이 손목/몸 방향 + x = -x; // X축 반전 + } + } +} diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/RokokoDataConverter.h b/Optitrack Rokoko Glove/RokokoGloveDevice/RokokoDataConverter.h new file mode 100644 index 000000000..960725901 --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/RokokoDataConverter.h @@ -0,0 +1,116 @@ +//====================================================================================================== +// Copyright 2025, Rokoko Glove OptiTrack Integration +//====================================================================================================== +/** + * RokokoDataConverter class provides data conversion functionality from Rokoko format to OptiTrack format. + * This converter handles the mapping of 20 Rokoko finger joints to 15 OptiTrack finger joints. + */ + +#pragma once +#include +#include +#include "GloveDataFormat.h" + +// Forward declarations +namespace RokokoData +{ + struct Vector3Frame; + struct Vector4Frame; + struct ActorJointFrame; + struct ActorData; + struct LiveFrame_v4; +} + +namespace RokokoIntegration +{ + class RokokoDataConverter + { + public: + /** + * Converts Rokoko LiveFrame_v4 data to OptiTrack glove data format + * @param rokokoFrame Input Rokoko frame data + * @return Converted OptiTrack glove data + */ + static sGloveDeviceData ConvertRokokoToOptiTrack(const RokokoData::LiveFrame_v4& rokokoFrame); + + /** + * Converts Rokoko finger joint data to OptiTrack finger node format + * @param rokokoJoint Input Rokoko joint data + * @param optiTrackNode Output OptiTrack node data + * @return true if conversion successful + */ + static bool ConvertJoint(const RokokoData::ActorJointFrame& rokokoJoint, sFingerNode& optiTrackNode); + + /** + * Validates converted OptiTrack data + * @param gloveData Data to validate + * @return true if data is valid + */ + static bool ValidateOptiTrackData(const sGloveDeviceData& gloveData); + + /** + * Gets the mapping information for debugging + * @return String containing mapping details + */ + static std::string GetMappingInfo(); + + private: + /** + * Maps Rokoko finger joints to OptiTrack format + * Maps 20 Rokoko joints (4 per finger) to 15 OptiTrack joints (3 per finger) + * Removes proximal joints and keeps medial, distal, tip + */ + static void MapFingerJoints(const std::vector& rokokoFingers, + std::vector& optiTrackNodes); + + /** + * Converts quaternion from Rokoko format to OptiTrack format + * @param rokokoQuat Input Rokoko quaternion + * @param optiTrackQuat Output OptiTrack quaternion + */ + static void ConvertQuaternion(const RokokoData::Vector4Frame& rokokoQuat, + float& quat_w, float& quat_x, float& quat_y, float& quat_z); + + /** + * Normalizes quaternion values + * @param w, x, y, z Quaternion components (modified in place) + */ + static void NormalizeQuaternion(float& w, float& x, float& y, float& z); + + /** + * Validates quaternion values + * @param w, x, y, z Quaternion components + * @return true if quaternion is valid + */ + static bool ValidateQuaternion(float w, float x, float y, float z); + + /** + * Applies coordinate system conversion for left/right hands + * @param isLeftHand true if left hand, false if right hand + * @param x, y, z Position coordinates (modified in place) + */ + static void ApplyHandCoordinateSystem(bool isLeftHand, float& x, float& y, float& z); + + // Finger mapping constants + static inline const int ROKOKO_JOINTS_PER_FINGER = 4; // Proximal, Medial, Distal, Tip + static inline const int OPTITRACK_JOINTS_PER_FINGER = 3; // MP, PIP, DIP + static inline const int TOTAL_FINGERS = 5; // Thumb, Index, Middle, Ring, Little + static inline const int TOTAL_ROKOKO_JOINTS = TOTAL_FINGERS * ROKOKO_JOINTS_PER_FINGER; // 20 + static inline const int TOTAL_OPTITRACK_JOINTS = TOTAL_FINGERS * OPTITRACK_JOINTS_PER_FINGER; // 15 + + // Joint mapping table: Rokoko index -> OptiTrack index + // Removes proximal joints (index 0, 4, 8, 12, 16) + static inline const int JOINT_MAPPING[15] = { + // Thumb: Medial(1), Distal(2), Tip(3) -> MP(0), PIP(1), DIP(2) + 1, 2, 3, + // Index: Medial(5), Distal(6), Tip(7) -> MP(3), PIP(4), DIP(5) + 5, 6, 7, + // Middle: Medial(9), Distal(10), Tip(11) -> MP(6), PIP(7), DIP(8) + 9, 10, 11, + // Ring: Medial(13), Distal(14), Tip(15) -> MP(9), PIP(10), DIP(11) + 13, 14, 15, + // Little: Medial(17), Distal(18), Tip(19) -> MP(12), PIP(13), DIP(14) + 17, 18, 19 + }; + }; +} diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/RokokoDataParser.cpp b/Optitrack Rokoko Glove/RokokoGloveDevice/RokokoDataParser.cpp new file mode 100644 index 000000000..54338487a --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/RokokoDataParser.cpp @@ -0,0 +1,225 @@ +//====================================================================================================== +// Copyright 2025, Rokoko Glove OptiTrack Integration +//====================================================================================================== + +#include "RokokoDataParser.h" +#include "RokokoData.h" +#include +#include +#include +#include + +namespace RokokoIntegration +{ + bool RokokoDataParser::ParseLiveFrame(const std::string& jsonString, RokokoData::LiveFrame_v4& frame) + { + try { + // 간단한 JSON 파싱 구현 (실제로는 nlohmann/json 라이브러리 사용 권장) + // 현재는 기본 구조만 생성 + + // 기본 프레임 데이터 초기화 + frame.scene.actors.clear(); + frame.scene.actors.push_back(RokokoData::ActorData()); + + // 기본 손가락 데이터 구조 생성 + auto& actor = frame.scene.actors[0]; + + // 왼손 데이터 초기화 (모든 손가락) + // 엄지 + actor.body.leftThumbMedial = std::make_shared(); + actor.body.leftThumbDistal = std::make_shared(); + actor.body.leftThumbTip = std::make_shared(); + // 검지 + actor.body.leftIndexMedial = std::make_shared(); + actor.body.leftIndexDistal = std::make_shared(); + actor.body.leftIndexTip = std::make_shared(); + // 중지 + actor.body.leftMiddleMedial = std::make_shared(); + actor.body.leftMiddleDistal = std::make_shared(); + actor.body.leftMiddleTip = std::make_shared(); + // 약지 + actor.body.leftRingMedial = std::make_shared(); + actor.body.leftRingDistal = std::make_shared(); + actor.body.leftRingTip = std::make_shared(); + // 새끼 + actor.body.leftLittleMedial = std::make_shared(); + actor.body.leftLittleDistal = std::make_shared(); + actor.body.leftLittleTip = std::make_shared(); + + // 오른손 데이터 초기화 (모든 손가락) + // 엄지 + actor.body.rightThumbMedial = std::make_shared(); + actor.body.rightThumbDistal = std::make_shared(); + actor.body.rightThumbTip = std::make_shared(); + // 검지 + actor.body.rightIndexMedial = std::make_shared(); + actor.body.rightIndexDistal = std::make_shared(); + actor.body.rightIndexTip = std::make_shared(); + // 중지 + actor.body.rightMiddleMedial = std::make_shared(); + actor.body.rightMiddleDistal = std::make_shared(); + actor.body.rightMiddleTip = std::make_shared(); + // 약지 + actor.body.rightRingMedial = std::make_shared(); + actor.body.rightRingDistal = std::make_shared(); + actor.body.rightRingTip = std::make_shared(); + // 새끼 + actor.body.rightLittleMedial = std::make_shared(); + actor.body.rightLittleDistal = std::make_shared(); + actor.body.rightLittleTip = std::make_shared(); + + // 기본 쿼터니언 값 설정 (정규화된 단위 쿼터니언) + RokokoData::Vector4Frame defaultRotation = {1.0f, 0.0f, 0.0f, 0.0f}; + + // 왼손 기본값 설정 + actor.body.leftThumbMedial->rotation = defaultRotation; + actor.body.leftThumbDistal->rotation = defaultRotation; + actor.body.leftThumbTip->rotation = defaultRotation; + actor.body.leftIndexMedial->rotation = defaultRotation; + actor.body.leftIndexDistal->rotation = defaultRotation; + actor.body.leftIndexTip->rotation = defaultRotation; + actor.body.leftMiddleMedial->rotation = defaultRotation; + actor.body.leftMiddleDistal->rotation = defaultRotation; + actor.body.leftMiddleTip->rotation = defaultRotation; + actor.body.leftRingMedial->rotation = defaultRotation; + actor.body.leftRingDistal->rotation = defaultRotation; + actor.body.leftRingTip->rotation = defaultRotation; + actor.body.leftLittleMedial->rotation = defaultRotation; + actor.body.leftLittleDistal->rotation = defaultRotation; + actor.body.leftLittleTip->rotation = defaultRotation; + + // 오른손 기본값 설정 + actor.body.rightThumbMedial->rotation = defaultRotation; + actor.body.rightThumbDistal->rotation = defaultRotation; + actor.body.rightThumbTip->rotation = defaultRotation; + actor.body.rightIndexMedial->rotation = defaultRotation; + actor.body.rightIndexDistal->rotation = defaultRotation; + actor.body.rightIndexTip->rotation = defaultRotation; + actor.body.rightMiddleMedial->rotation = defaultRotation; + actor.body.rightMiddleDistal->rotation = defaultRotation; + actor.body.rightMiddleTip->rotation = defaultRotation; + actor.body.rightRingMedial->rotation = defaultRotation; + actor.body.rightRingDistal->rotation = defaultRotation; + actor.body.rightRingTip->rotation = defaultRotation; + actor.body.rightLittleMedial->rotation = defaultRotation; + actor.body.rightLittleDistal->rotation = defaultRotation; + actor.body.rightLittleTip->rotation = defaultRotation; + + return true; + + } catch (...) { + return false; + } + } + + bool RokokoDataParser::ValidateFrameData(const RokokoData::LiveFrame_v4& frame) + { + try { + // 기본 검증 + if (frame.scene.actors.empty()) { + return false; + } + + const auto& actor = frame.scene.actors[0]; + + // 손가락 데이터 검증 + if (!actor.body.leftThumbMedial || !actor.body.leftThumbDistal || !actor.body.leftThumbTip) { + return false; + } + + return true; + + } catch (...) { + return false; + } + } + + bool RokokoDataParser::ExtractFingerData(const RokokoData::LiveFrame_v4& frame, + std::vector& leftHandFingers, + std::vector& rightHandFingers) + { + try { + leftHandFingers.clear(); + rightHandFingers.clear(); + + if (frame.scene.actors.empty()) { + return false; + } + + const auto& actor = frame.scene.actors[0]; + + // 왼손 데이터 추출 + if (actor.body.leftThumbMedial) { + leftHandFingers.push_back(*actor.body.leftThumbMedial); + } + if (actor.body.leftThumbDistal) { + leftHandFingers.push_back(*actor.body.leftThumbDistal); + } + if (actor.body.leftThumbTip) { + leftHandFingers.push_back(*actor.body.leftThumbTip); + } + + // 오른손 데이터는 현재 구현되지 않음 (기본값 사용) + // 실제 구현에서는 actor.body.rightThumb* 데이터 사용 + + return true; + + } catch (...) { + return false; + } + } + + bool RokokoDataParser::ParseActorData(const void* actorJson, RokokoData::ActorData& actor) + { + // 현재는 기본 구현만 제공 + // 실제 JSON 파싱 라이브러리 사용 시 구현 + return true; + } + + bool RokokoDataParser::ParseFingerData(const void* fingerJson, RokokoData::ActorJointFrame& finger) + { + // 현재는 기본 구현만 제공 + // 실제 JSON 파싱 라이브러리 사용 시 구현 + return true; + } + + bool RokokoDataParser::ValidateQuaternion(float x, float y, float z, float w) + { + // NaN 체크 + if (std::isnan(x) || std::isnan(y) || std::isnan(z) || std::isnan(w)) { + return false; + } + + // 무한대 체크 + if (std::isinf(x) || std::isinf(y) || std::isinf(z) || std::isinf(w)) { + return false; + } + + // 쿼터니언 길이 체크 (정규화된 경우 1.0에 가까워야 함) + float length = std::sqrt(x * x + y * y + z * z + w * w); + if (std::abs(length - 1.0f) > 0.1f) { + return false; + } + + return true; + } + + void RokokoDataParser::NormalizeQuaternion(float& x, float& y, float& z, float& w) + { + float length = std::sqrt(x * x + y * y + z * z + w * w); + + if (length > 0.0f) { + float invLength = 1.0f / length; + x *= invLength; + y *= invLength; + z *= invLength; + w *= invLength; + } else { + // 유효하지 않은 쿼터니언인 경우 기본값 설정 + x = 0.0f; + y = 0.0f; + z = 0.0f; + w = 1.0f; + } + } +} diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/RokokoDataParser.h b/Optitrack Rokoko Glove/RokokoGloveDevice/RokokoDataParser.h new file mode 100644 index 000000000..7d5ef00cf --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/RokokoDataParser.h @@ -0,0 +1,85 @@ +//====================================================================================================== +// Copyright 2025, Rokoko Glove OptiTrack Integration +//====================================================================================================== +/** + * RokokoDataParser class provides JSON parsing functionality for Rokoko glove data. + * This parser handles the LiveFrame_v4 JSON format from Rokoko Studio. + */ + +#pragma once +#include +#include +#include + +// Forward declarations for JSON data structures +namespace RokokoData +{ + struct Vector3Frame; + struct Vector4Frame; + struct ActorJointFrame; + struct ActorData; + struct LiveFrame_v4; +} + +namespace RokokoIntegration +{ + class RokokoDataParser + { + public: + /** + * Parses LiveFrame_v4 JSON data + * @param jsonString JSON string to parse + * @param frame Output frame data structure + * @return true if parsing successful + */ + static bool ParseLiveFrame(const std::string& jsonString, RokokoData::LiveFrame_v4& frame); + + /** + * Validates parsed frame data + * @param frame Frame data to validate + * @return true if frame data is valid + */ + static bool ValidateFrameData(const RokokoData::LiveFrame_v4& frame); + + /** + * Extracts finger joint data from frame + * @param frame Input frame data + * @param leftHandFingers Output left hand finger data + * @param rightHandFingers Output right hand finger data + * @return true if extraction successful + */ + static bool ExtractFingerData(const RokokoData::LiveFrame_v4& frame, + std::vector& leftHandFingers, + std::vector& rightHandFingers); + + private: + /** + * Parses actor data from JSON + * @param actorJson JSON object containing actor data + * @param actor Output actor data structure + * @return true if parsing successful + */ + static bool ParseActorData(const void* actorJson, RokokoData::ActorData& actor); + + /** + * Parses finger joint data from JSON + * @param fingerJson JSON object containing finger data + * @param finger Output finger data structure + * @return true if parsing successful + */ + static bool ParseFingerData(const void* fingerJson, RokokoData::ActorJointFrame& finger); + + /** + * Validates quaternion values + * @param x, y, z, w Quaternion components + * @return true if quaternion is valid + */ + static bool ValidateQuaternion(float x, float y, float z, float w); + + /** + * Normalizes quaternion values + * @param x, y, z, w Quaternion components (modified in place) + */ + static void NormalizeQuaternion(float& x, float& y, float& z, float& w); + }; +} diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/RokokoGloveDevice.vcxproj b/Optitrack Rokoko Glove/RokokoGloveDevice/RokokoGloveDevice.vcxproj new file mode 100644 index 000000000..e2c634afb --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/RokokoGloveDevice.vcxproj @@ -0,0 +1,149 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {513E58BC-64D4-4E29-8AF8-90F5D408C1ED} + Win32Proj + OptiTrackPeripheralExample + 8.1 + RokokoGloveDevice + + + + DynamicLibrary + true + v142 + Unicode + + + DynamicLibrary + false + v142 + true + Unicode + + + + + + + + + + + + + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + C:\Program Files\OptiTrack\Motive\Motive.exe + WindowsLocalDebugger + + + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + C:\Program Files\OptiTrack\Motive\Motive.exe + WindowsLocalDebugger + + + + + + Level3 + Disabled + stdcpp17 + WIN32;_DEBUG;_WINDOWS;_USRDLL;ANALOGSYSTEM_IMPORTS;OPTITRACKPERIPHERALEXAMPLE_EXPORTS;%(PreprocessorDefinitions) + false + ..\..\include;%(AdditionalIncludeDirectories) + + + Windows + true + NotSet + PeripheralImport.lib;ws2_32.lib;%(AdditionalDependencies) + ..\..\lib;%(AdditionalLibraryDirectories) + + + false + + + + + Level3 + MaxSpeed + true + true + stdcpp17 + WIN32;NDEBUG;_WINDOWS;_USRDLL;OPTITRACKPERIPHERALEXAMPLE_EXPORTS;ANALOGSYSTEM_IMPORTS;%(PreprocessorDefinitions) + ..\..\include;%(AdditionalIncludeDirectories) + + + Windows + true + true + true + PeripheralImport.lib;ws2_32.lib;%(AdditionalDependencies) + ..\..\lib;%(AdditionalLibraryDirectories) + + + + + + + + + + + + + + + + + + false + + + false + + + + + + + + + + + + + + + + + + Document + + + + + + \ No newline at end of file diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/RokokoGloveDevice.vcxproj.filters b/Optitrack Rokoko Glove/RokokoGloveDevice/RokokoGloveDevice.vcxproj.filters new file mode 100644 index 000000000..974cb17f7 --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/RokokoGloveDevice.vcxproj.filters @@ -0,0 +1,90 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + + + + + \ No newline at end of file diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/RokokoUDPReceiver.cpp b/Optitrack Rokoko Glove/RokokoGloveDevice/RokokoUDPReceiver.cpp new file mode 100644 index 000000000..f447e4046 --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/RokokoUDPReceiver.cpp @@ -0,0 +1,254 @@ +//====================================================================================================== +// Copyright 2025, Rokoko Glove OptiTrack Integration +//====================================================================================================== + +#include "RokokoUDPReceiver.h" +#include +#include +#include + +namespace RokokoIntegration +{ + RokokoUDPReceiver::RokokoUDPReceiver() + : mSocket(INVALID_SOCKET) + , mIsRunning(false) + , mIsListening(false) + , mPacketsReceived(0) + , mBytesReceived(0) + , mLastPacketTime(0.0) + , mPort(14043) + , mBufferSize(65000) + { + } + + RokokoUDPReceiver::~RokokoUDPReceiver() + { + StopListening(); + CloseSocket(); + } + + bool RokokoUDPReceiver::Initialize(int port) + { + try { + mPort = port; + + // Winsock 초기화 + WSADATA wsaData; + if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { + SetError("WSAStartup failed"); + return false; + } + + // UDP 소켓 생성 + mSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (mSocket == INVALID_SOCKET) { + SetError("Failed to create UDP socket"); + WSACleanup(); + return false; + } + + // 소켓 옵션 설정 + int sendBufferSize = mBufferSize; + if (setsockopt(mSocket, SOL_SOCKET, SO_SNDBUF, + (char*)&sendBufferSize, sizeof(sendBufferSize)) == SOCKET_ERROR) { + SetError("Failed to set send buffer size"); + CloseSocket(); + return false; + } + + // 주소 구조체 설정 + struct sockaddr_in serverAddr; + serverAddr.sin_family = AF_INET; + serverAddr.sin_port = htons(mPort); + serverAddr.sin_addr.s_addr = INADDR_ANY; + + // 소켓 바인딩 + if (bind(mSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) { + std::ostringstream oss; + oss << "Failed to bind to port " << mPort << ". Port may be in use."; + SetError(oss.str()); + CloseSocket(); + return false; + } + + // 논블로킹 모드 설정 + u_long mode = 1; + if (ioctlsocket(mSocket, FIONBIO, &mode) == SOCKET_ERROR) { + SetError("Failed to set non-blocking mode"); + CloseSocket(); + return false; + } + + return true; + + } catch (...) { + SetError("Exception during UDP initialization"); + return false; + } + } + + bool RokokoUDPReceiver::StartListening() + { + if (mSocket == INVALID_SOCKET) { + SetError("UDP socket not initialized"); + return false; + } + + if (mIsListening) { + SetError("Already listening"); + return false; + } + + try { + mIsRunning = true; + mIsListening = true; + + // 수신 스레드 시작 + mReceiveThread = std::thread(&RokokoUDPReceiver::ReceiveThread, this); + + return true; + + } catch (...) { + SetError("Exception starting receive thread"); + mIsRunning = false; + mIsListening = false; + return false; + } + } + + void RokokoUDPReceiver::StopListening() + { + mIsRunning = false; + mIsListening = false; + + if (mReceiveThread.joinable()) { + mReceiveThread.join(); + } + } + + void RokokoUDPReceiver::SetDataCallback(std::function&, const std::string&)> callback) + { + mDataCallback = callback; + } + + bool RokokoUDPReceiver::IsListening() const + { + return mIsListening; + } + + bool RokokoUDPReceiver::IsConnected() const + { + return mIsListening && mPacketsReceived > 0; + } + + std::string RokokoUDPReceiver::GetLastError() const + { + std::lock_guard lock(mErrorMutex); + return mLastError; + } + + void RokokoUDPReceiver::GetStatistics(uint64_t& packetsReceived, uint64_t& bytesReceived, double& lastPacketTime) const + { + std::lock_guard lock(mStatsMutex); + packetsReceived = mPacketsReceived; + bytesReceived = mBytesReceived; + lastPacketTime = mLastPacketTime; + } + + void RokokoUDPReceiver::ReceiveThread() + { + std::vector buffer(mBufferSize); + + while (mIsRunning) { + try { + struct sockaddr_in senderAddr; + int senderAddrSize = sizeof(senderAddr); + + // UDP 데이터 수신 + int bytesReceived = recvfrom(mSocket, + reinterpret_cast(buffer.data()), + mBufferSize, + 0, + (struct sockaddr*)&senderAddr, + &senderAddrSize); + + if (bytesReceived > 0) { + // 발신자 IP 주소 추출 + char senderIP[INET_ADDRSTRLEN]; + inet_ntop(AF_INET, &senderAddr.sin_addr, senderIP, INET_ADDRSTRLEN); + std::string senderIPStr(senderIP); + + // 데이터 처리 + ProcessIncomingData(buffer.data(), bytesReceived, senderIPStr); + + // 통계 업데이트 + UpdateStatistics(bytesReceived); + + } else if (bytesReceived == SOCKET_ERROR) { + int error = WSAGetLastError(); + if (error != WSAEWOULDBLOCK) { + // 실제 에러인 경우 + std::ostringstream oss; + oss << "UDP receive error: " << error; + SetError(oss.str()); + break; + } + } + + // CPU 사용률 조절 + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + + } catch (...) { + SetError("Exception in receive thread"); + break; + } + } + + mIsListening = false; + } + + void RokokoUDPReceiver::ProcessIncomingData(const uint8_t* data, int size, const std::string& senderIP) + { + if (mDataCallback && data && size > 0) { + try { + // 데이터를 벡터로 복사 + std::vector dataCopy(data, data + size); + + // 콜백 호출 + mDataCallback(dataCopy, senderIP); + + } catch (...) { + SetError("Exception in data callback"); + } + } + } + + void RokokoUDPReceiver::SetError(const std::string& error) + { + std::lock_guard lock(mErrorMutex); + mLastError = error; + + // 에러 로깅 (OptiTrack에서 확인 가능) + std::cerr << "[RokokoUDPReceiver] Error: " << error << std::endl; + } + + void RokokoUDPReceiver::UpdateStatistics(int packetSize) + { + std::lock_guard lock(mStatsMutex); + mPacketsReceived++; + mBytesReceived += packetSize; + mLastPacketTime = std::chrono::duration_cast( + std::chrono::high_resolution_clock::now().time_since_epoch() + ).count() / 1000.0; + } + + void RokokoUDPReceiver::CloseSocket() + { + if (mSocket != INVALID_SOCKET) { + closesocket(mSocket); + mSocket = INVALID_SOCKET; + } + + WSACleanup(); + } +} diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/RokokoUDPReceiver.h b/Optitrack Rokoko Glove/RokokoGloveDevice/RokokoUDPReceiver.h new file mode 100644 index 000000000..892470a33 --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/RokokoUDPReceiver.h @@ -0,0 +1,139 @@ +//====================================================================================================== +// Copyright 2025, Rokoko Glove OptiTrack Integration +//====================================================================================================== +/** + * RokokoUDPReceiver class provides UDP communication functionality for receiving Rokoko glove data. + * This receiver handles UDP socket communication and data reception from Rokoko Studio. + */ + +#pragma once +#include +#include +#include +#include +#include +#include +#include + +namespace RokokoIntegration +{ + class RokokoUDPReceiver + { + public: + /** + * Constructor + */ + RokokoUDPReceiver(); + + /** + * Destructor + */ + ~RokokoUDPReceiver(); + + /** + * Initializes UDP receiver + * @param port UDP port to listen on (default: 14043) + * @return true if initialization successful + */ + bool Initialize(int port = 14043); + + /** + * Starts listening for UDP data + * @return true if started successfully + */ + bool StartListening(); + + /** + * Stops listening for UDP data + */ + void StopListening(); + + /** + * Sets callback function for received data + * @param callback Function to call when data is received + */ + void SetDataCallback(std::function&, const std::string&)> callback); + + /** + * Checks if receiver is currently listening + * @return true if listening + */ + bool IsListening() const; + + /** + * Gets the current connection status + * @return true if connected and receiving data + */ + bool IsConnected() const; + + /** + * Gets the last error message + * @return Error message string + */ + std::string GetLastError() const; + + /** + * Gets connection statistics + * @param packetsReceived Number of packets received + * @param bytesReceived Total bytes received + * @param lastPacketTime Timestamp of last packet + */ + void GetStatistics(uint64_t& packetsReceived, uint64_t& bytesReceived, double& lastPacketTime) const; + + private: + // UDP socket + SOCKET mSocket; + + // Thread management + std::thread mReceiveThread; + std::atomic mIsRunning; + std::atomic mIsListening; + + // Data callback + std::function&, const std::string&)> mDataCallback; + + // Statistics + mutable std::mutex mStatsMutex; + uint64_t mPacketsReceived; + uint64_t mBytesReceived; + double mLastPacketTime; + + // Error handling + mutable std::mutex mErrorMutex; + std::string mLastError; + + // Configuration + int mPort; + int mBufferSize; + + /** + * Main receive thread function + */ + void ReceiveThread(); + + /** + * Processes incoming UDP data + * @param data Received data + * @param size Size of received data + * @param senderIP IP address of sender + */ + void ProcessIncomingData(const uint8_t* data, int size, const std::string& senderIP); + + /** + * Sets error message + * @param error Error message + */ + void SetError(const std::string& error); + + /** + * Updates statistics + * @param packetSize Size of received packet + */ + void UpdateStatistics(int packetSize); + + /** + * Closes UDP socket + */ + void CloseSocket(); + }; +} diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/dllcommon.h b/Optitrack Rokoko Glove/RokokoGloveDevice/dllcommon.h new file mode 100644 index 000000000..71f9b68bd --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/dllcommon.h @@ -0,0 +1,12 @@ +//====================================================================================================== +// Copyright 2016, NaturalPoint Inc. +//====================================================================================================== + +// windows +#include +#define _CRTDBG_MAP_ALLOC +#include +#include +#define WIN32_LEAN_AND_MEAN +#include + diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/dllmain.cpp b/Optitrack Rokoko Glove/RokokoGloveDevice/dllmain.cpp new file mode 100644 index 000000000..31ce0fe66 --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/dllmain.cpp @@ -0,0 +1,103 @@ +//====================================================================================================== +// Copyright 2016, NaturalPoint Inc. +//====================================================================================================== +// +// dllmain.cpp : Defines the entry point for the DLL application. +// + +#include "dllcommon.h" + +// stl +#include +#include +using namespace std; + +// OptiTrack Peripheral Device API +#include "IDeviceManager.h" +using namespace AnalogSystem; + +// local devices +#include "ExampleGloveDevice.h" +using namespace OptiTrackPluginDevices; + +int hostVersionMajor, hostVersionMinor, hostVersionRevision; + +#ifdef OPTITRACKPERIPHERALEXAMPLE_EXPORTS +#define OPTITRACKPERIPHERALEXAMPLE_API __declspec(dllexport) +#else +#define OPTITRACKPERIPHERALEXAMPLE_API __declspec(dllimport) +#endif + + +#ifdef __cplusplus +extern "C" { +#endif + +using namespace OptiTrackPluginDevices; +using namespace ExampleDevice; + + +/** + * Defines the version information of the plugin DLL within Motive. + */ +OPTITRACKPERIPHERALEXAMPLE_API void DLLVersion(int hostMajor, int hostMinor, int hostRevision, int& dllMajor, int& dllMinor, int& dllRevision) +{ + hostVersionMajor = hostMajor; + hostVersionMajor = hostMinor; + hostVersionMajor = hostRevision; + + // report this peripheral device's version to host + dllMajor = 1; + dllMinor = 0; + dllRevision = 0; +} + +/** + * Motive calls the following method on application start up. This register device factories with Motive + * so that the device can be instantiated when it's ready (1 factory per device) + */ +OPTITRACKPERIPHERALEXAMPLE_API int DLLEnumerateDeviceFactories(IDeviceManager* pDeviceManager) +{ + + list> availDFs; + + ExampleDevice::ExampleGlove_EnumerateDeviceFactories(pDeviceManager, availDFs); + for (list>::iterator iter = availDFs.begin(); iter != availDFs.end(); iter++) { + // transfers ownership of device factory to host + pDeviceManager->AddDevice(std::move(*iter)); + } + + return (int)availDFs.size(); +} + +/** + * The following method gets called on application shutdown. Proper shutdown should happen here; +* including termination of the process of the DLL and memory unload. + */ +OPTITRACKPERIPHERALEXAMPLE_API int PluginDLLUnload(IDeviceManager* pDeviceManager) +{ + // OPTIONAL: perform device DLL shutdown here + ExampleGlove_Shutdown(); + return 0; +} + +#ifdef __cplusplus +} +#endif + + +BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) +{ + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + break; + case DLL_THREAD_ATTACH: + break; + case DLL_THREAD_DETACH: + break; + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/lz4.c b/Optitrack Rokoko Glove/RokokoGloveDevice/lz4.c new file mode 100644 index 000000000..654bfdf32 --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/lz4.c @@ -0,0 +1,2722 @@ +/* + LZ4 - Fast LZ compression algorithm + Copyright (C) 2011-2020, Yann Collet. + + BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + You can contact the author at : + - LZ4 homepage : http://www.lz4.org + - LZ4 source repository : https://github.com/lz4/lz4 +*/ + +/*-************************************ +* Tuning parameters +**************************************/ +/* + * LZ4_HEAPMODE : + * Select how default compression functions will allocate memory for their hash table, + * in memory stack (0:default, fastest), or in memory heap (1:requires malloc()). + */ +#ifndef LZ4_HEAPMODE +# define LZ4_HEAPMODE 0 +#endif + +/* + * LZ4_ACCELERATION_DEFAULT : + * Select "acceleration" for LZ4_compress_fast() when parameter value <= 0 + */ +#define LZ4_ACCELERATION_DEFAULT 1 +/* + * LZ4_ACCELERATION_MAX : + * Any "acceleration" value higher than this threshold + * get treated as LZ4_ACCELERATION_MAX instead (fix #876) + */ +#define LZ4_ACCELERATION_MAX 65537 + + +/*-************************************ +* CPU Feature Detection +**************************************/ +/* LZ4_FORCE_MEMORY_ACCESS + * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable. + * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal. + * The below switch allow to select different access method for improved performance. + * Method 0 (default) : use `memcpy()`. Safe and portable. + * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable). + * This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`. + * Method 2 : direct access. This method is portable but violate C standard. + * It can generate buggy code on targets which assembly generation depends on alignment. + * But in some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6) + * See https://fastcompression.blogspot.fr/2015/08/accessing-unaligned-memory.html for details. + * Prefer these methods in priority order (0 > 1 > 2) + */ +#ifndef LZ4_FORCE_MEMORY_ACCESS /* can be defined externally */ +# if defined(__GNUC__) && \ + ( defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) \ + || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) ) +# define LZ4_FORCE_MEMORY_ACCESS 2 +# elif (defined(__INTEL_COMPILER) && !defined(_WIN32)) || defined(__GNUC__) +# define LZ4_FORCE_MEMORY_ACCESS 1 +# endif +#endif + +/* + * LZ4_FORCE_SW_BITCOUNT + * Define this parameter if your target system or compiler does not support hardware bit count + */ +#if defined(_MSC_VER) && defined(_WIN32_WCE) /* Visual Studio for WinCE doesn't support Hardware bit count */ +# undef LZ4_FORCE_SW_BITCOUNT /* avoid double def */ +# define LZ4_FORCE_SW_BITCOUNT +#endif + + + +/*-************************************ +* Dependency +**************************************/ +/* + * LZ4_SRC_INCLUDED: + * Amalgamation flag, whether lz4.c is included + */ +#ifndef LZ4_SRC_INCLUDED +# define LZ4_SRC_INCLUDED 1 +#endif + +#ifndef LZ4_STATIC_LINKING_ONLY +#define LZ4_STATIC_LINKING_ONLY +#endif + +#ifndef LZ4_DISABLE_DEPRECATE_WARNINGS +#define LZ4_DISABLE_DEPRECATE_WARNINGS /* due to LZ4_decompress_safe_withPrefix64k */ +#endif + +#define LZ4_STATIC_LINKING_ONLY /* LZ4_DISTANCE_MAX */ +#include "lz4.h" +/* see also "memory routines" below */ + + +/*-************************************ +* Compiler Options +**************************************/ +#if defined(_MSC_VER) && (_MSC_VER >= 1400) /* Visual Studio 2005+ */ +# include /* only present in VS2005+ */ +# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */ +# pragma warning(disable : 6237) /* disable: C6237: conditional expression is always 0 */ +#endif /* _MSC_VER */ + +#ifndef LZ4_FORCE_INLINE +# ifdef _MSC_VER /* Visual Studio */ +# define LZ4_FORCE_INLINE static __forceinline +# else +# if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */ +# ifdef __GNUC__ +# define LZ4_FORCE_INLINE static inline __attribute__((always_inline)) +# else +# define LZ4_FORCE_INLINE static inline +# endif +# else +# define LZ4_FORCE_INLINE static +# endif /* __STDC_VERSION__ */ +# endif /* _MSC_VER */ +#endif /* LZ4_FORCE_INLINE */ + +/* LZ4_FORCE_O2 and LZ4_FORCE_INLINE + * gcc on ppc64le generates an unrolled SIMDized loop for LZ4_wildCopy8, + * together with a simple 8-byte copy loop as a fall-back path. + * However, this optimization hurts the decompression speed by >30%, + * because the execution does not go to the optimized loop + * for typical compressible data, and all of the preamble checks + * before going to the fall-back path become useless overhead. + * This optimization happens only with the -O3 flag, and -O2 generates + * a simple 8-byte copy loop. + * With gcc on ppc64le, all of the LZ4_decompress_* and LZ4_wildCopy8 + * functions are annotated with __attribute__((optimize("O2"))), + * and also LZ4_wildCopy8 is forcibly inlined, so that the O2 attribute + * of LZ4_wildCopy8 does not affect the compression speed. + */ +#if defined(__PPC64__) && defined(__LITTLE_ENDIAN__) && defined(__GNUC__) && !defined(__clang__) +# define LZ4_FORCE_O2 __attribute__((optimize("O2"))) +# undef LZ4_FORCE_INLINE +# define LZ4_FORCE_INLINE static __inline __attribute__((optimize("O2"),always_inline)) +#else +# define LZ4_FORCE_O2 +#endif + +#if (defined(__GNUC__) && (__GNUC__ >= 3)) || (defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 800)) || defined(__clang__) +# define expect(expr,value) (__builtin_expect ((expr),(value)) ) +#else +# define expect(expr,value) (expr) +#endif + +#ifndef likely +#define likely(expr) expect((expr) != 0, 1) +#endif +#ifndef unlikely +#define unlikely(expr) expect((expr) != 0, 0) +#endif + +/* Should the alignment test prove unreliable, for some reason, + * it can be disabled by setting LZ4_ALIGN_TEST to 0 */ +#ifndef LZ4_ALIGN_TEST /* can be externally provided */ +# define LZ4_ALIGN_TEST 1 +#endif + + +/*-************************************ +* Memory routines +**************************************/ + +/*! LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION : + * Disable relatively high-level LZ4/HC functions that use dynamic memory + * allocation functions (malloc(), calloc(), free()). + * + * Note that this is a compile-time switch. And since it disables + * public/stable LZ4 v1 API functions, we don't recommend using this + * symbol to generate a library for distribution. + * + * The following public functions are removed when this symbol is defined. + * - lz4 : LZ4_createStream, LZ4_freeStream, + * LZ4_createStreamDecode, LZ4_freeStreamDecode, LZ4_create (deprecated) + * - lz4hc : LZ4_createStreamHC, LZ4_freeStreamHC, + * LZ4_createHC (deprecated), LZ4_freeHC (deprecated) + * - lz4frame, lz4file : All LZ4F_* functions + */ +#if defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) +# define ALLOC(s) lz4_error_memory_allocation_is_disabled +# define ALLOC_AND_ZERO(s) lz4_error_memory_allocation_is_disabled +# define FREEMEM(p) lz4_error_memory_allocation_is_disabled +#elif defined(LZ4_USER_MEMORY_FUNCTIONS) +/* memory management functions can be customized by user project. + * Below functions must exist somewhere in the Project + * and be available at link time */ +void* LZ4_malloc(size_t s); +void* LZ4_calloc(size_t n, size_t s); +void LZ4_free(void* p); +# define ALLOC(s) LZ4_malloc(s) +# define ALLOC_AND_ZERO(s) LZ4_calloc(1,s) +# define FREEMEM(p) LZ4_free(p) +#else +# include /* malloc, calloc, free */ +# define ALLOC(s) malloc(s) +# define ALLOC_AND_ZERO(s) calloc(1,s) +# define FREEMEM(p) free(p) +#endif + +#if ! LZ4_FREESTANDING +# include /* memset, memcpy */ +#endif +#if !defined(LZ4_memset) +# define LZ4_memset(p,v,s) memset((p),(v),(s)) +#endif +#define MEM_INIT(p,v,s) LZ4_memset((p),(v),(s)) + + +/*-************************************ +* Common Constants +**************************************/ +#define MINMATCH 4 + +#define WILDCOPYLENGTH 8 +#define LASTLITERALS 5 /* see ../doc/lz4_Block_format.md#parsing-restrictions */ +#define MFLIMIT 12 /* see ../doc/lz4_Block_format.md#parsing-restrictions */ +#define MATCH_SAFEGUARD_DISTANCE ((2*WILDCOPYLENGTH) - MINMATCH) /* ensure it's possible to write 2 x wildcopyLength without overflowing output buffer */ +#define FASTLOOP_SAFE_DISTANCE 64 +static const int LZ4_minLength = (MFLIMIT+1); + +#define KB *(1 <<10) +#define MB *(1 <<20) +#define GB *(1U<<30) + +#define LZ4_DISTANCE_ABSOLUTE_MAX 65535 +#if (LZ4_DISTANCE_MAX > LZ4_DISTANCE_ABSOLUTE_MAX) /* max supported by LZ4 format */ +# error "LZ4_DISTANCE_MAX is too big : must be <= 65535" +#endif + +#define ML_BITS 4 +#define ML_MASK ((1U<=1) +# include +#else +# ifndef assert +# define assert(condition) ((void)0) +# endif +#endif + +#define LZ4_STATIC_ASSERT(c) { enum { LZ4_static_assert = 1/(int)(!!(c)) }; } /* use after variable declarations */ + +#if defined(LZ4_DEBUG) && (LZ4_DEBUG>=2) +# include + static int g_debuglog_enable = 1; +# define DEBUGLOG(l, ...) { \ + if ((g_debuglog_enable) && (l<=LZ4_DEBUG)) { \ + fprintf(stderr, __FILE__ ": "); \ + fprintf(stderr, __VA_ARGS__); \ + fprintf(stderr, " \n"); \ + } } +#else +# define DEBUGLOG(l, ...) {} /* disabled */ +#endif + +static int LZ4_isAligned(const void* ptr, size_t alignment) +{ + return ((size_t)ptr & (alignment -1)) == 0; +} + + +/*-************************************ +* Types +**************************************/ +#include +#if defined(__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) +# include + typedef uint8_t BYTE; + typedef uint16_t U16; + typedef uint32_t U32; + typedef int32_t S32; + typedef uint64_t U64; + typedef uintptr_t uptrval; +#else +# if UINT_MAX != 4294967295UL +# error "LZ4 code (when not C++ or C99) assumes that sizeof(int) == 4" +# endif + typedef unsigned char BYTE; + typedef unsigned short U16; + typedef unsigned int U32; + typedef signed int S32; + typedef unsigned long long U64; + typedef size_t uptrval; /* generally true, except OpenVMS-64 */ +#endif + +#if defined(__x86_64__) + typedef U64 reg_t; /* 64-bits in x32 mode */ +#else + typedef size_t reg_t; /* 32-bits in x32 mode */ +#endif + +typedef enum { + notLimited = 0, + limitedOutput = 1, + fillOutput = 2 +} limitedOutput_directive; + + +/*-************************************ +* Reading and writing into memory +**************************************/ + +/** + * LZ4 relies on memcpy with a constant size being inlined. In freestanding + * environments, the compiler can't assume the implementation of memcpy() is + * standard compliant, so it can't apply its specialized memcpy() inlining + * logic. When possible, use __builtin_memcpy() to tell the compiler to analyze + * memcpy() as if it were standard compliant, so it can inline it in freestanding + * environments. This is needed when decompressing the Linux Kernel, for example. + */ +#if !defined(LZ4_memcpy) +# if defined(__GNUC__) && (__GNUC__ >= 4) +# define LZ4_memcpy(dst, src, size) __builtin_memcpy(dst, src, size) +# else +# define LZ4_memcpy(dst, src, size) memcpy(dst, src, size) +# endif +#endif + +#if !defined(LZ4_memmove) +# if defined(__GNUC__) && (__GNUC__ >= 4) +# define LZ4_memmove __builtin_memmove +# else +# define LZ4_memmove memmove +# endif +#endif + +static unsigned LZ4_isLittleEndian(void) +{ + const union { U32 u; BYTE c[4]; } one = { 1 }; /* don't use static : performance detrimental */ + return one.c[0]; +} + + +#if defined(LZ4_FORCE_MEMORY_ACCESS) && (LZ4_FORCE_MEMORY_ACCESS==2) +/* lie to the compiler about data alignment; use with caution */ + +static U16 LZ4_read16(const void* memPtr) { return *(const U16*) memPtr; } +static U32 LZ4_read32(const void* memPtr) { return *(const U32*) memPtr; } +static reg_t LZ4_read_ARCH(const void* memPtr) { return *(const reg_t*) memPtr; } + +static void LZ4_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; } +static void LZ4_write32(void* memPtr, U32 value) { *(U32*)memPtr = value; } + +#elif defined(LZ4_FORCE_MEMORY_ACCESS) && (LZ4_FORCE_MEMORY_ACCESS==1) + +/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */ +/* currently only defined for gcc and icc */ +typedef union { U16 u16; U32 u32; reg_t uArch; } __attribute__((packed)) LZ4_unalign; + +static U16 LZ4_read16(const void* ptr) { return ((const LZ4_unalign*)ptr)->u16; } +static U32 LZ4_read32(const void* ptr) { return ((const LZ4_unalign*)ptr)->u32; } +static reg_t LZ4_read_ARCH(const void* ptr) { return ((const LZ4_unalign*)ptr)->uArch; } + +static void LZ4_write16(void* memPtr, U16 value) { ((LZ4_unalign*)memPtr)->u16 = value; } +static void LZ4_write32(void* memPtr, U32 value) { ((LZ4_unalign*)memPtr)->u32 = value; } + +#else /* safe and portable access using memcpy() */ + +static U16 LZ4_read16(const void* memPtr) +{ + U16 val; LZ4_memcpy(&val, memPtr, sizeof(val)); return val; +} + +static U32 LZ4_read32(const void* memPtr) +{ + U32 val; LZ4_memcpy(&val, memPtr, sizeof(val)); return val; +} + +static reg_t LZ4_read_ARCH(const void* memPtr) +{ + reg_t val; LZ4_memcpy(&val, memPtr, sizeof(val)); return val; +} + +static void LZ4_write16(void* memPtr, U16 value) +{ + LZ4_memcpy(memPtr, &value, sizeof(value)); +} + +static void LZ4_write32(void* memPtr, U32 value) +{ + LZ4_memcpy(memPtr, &value, sizeof(value)); +} + +#endif /* LZ4_FORCE_MEMORY_ACCESS */ + + +static U16 LZ4_readLE16(const void* memPtr) +{ + if (LZ4_isLittleEndian()) { + return LZ4_read16(memPtr); + } else { + const BYTE* p = (const BYTE*)memPtr; + return (U16)((U16)p[0] + (p[1]<<8)); + } +} + +static void LZ4_writeLE16(void* memPtr, U16 value) +{ + if (LZ4_isLittleEndian()) { + LZ4_write16(memPtr, value); + } else { + BYTE* p = (BYTE*)memPtr; + p[0] = (BYTE) value; + p[1] = (BYTE)(value>>8); + } +} + +/* customized variant of memcpy, which can overwrite up to 8 bytes beyond dstEnd */ +LZ4_FORCE_INLINE +void LZ4_wildCopy8(void* dstPtr, const void* srcPtr, void* dstEnd) +{ + BYTE* d = (BYTE*)dstPtr; + const BYTE* s = (const BYTE*)srcPtr; + BYTE* const e = (BYTE*)dstEnd; + + do { LZ4_memcpy(d,s,8); d+=8; s+=8; } while (d= 16. */ +LZ4_FORCE_INLINE void +LZ4_wildCopy32(void* dstPtr, const void* srcPtr, void* dstEnd) +{ + BYTE* d = (BYTE*)dstPtr; + const BYTE* s = (const BYTE*)srcPtr; + BYTE* const e = (BYTE*)dstEnd; + + do { LZ4_memcpy(d,s,16); LZ4_memcpy(d+16,s+16,16); d+=32; s+=32; } while (d= dstPtr + MINMATCH + * - there is at least 8 bytes available to write after dstEnd */ +LZ4_FORCE_INLINE void +LZ4_memcpy_using_offset(BYTE* dstPtr, const BYTE* srcPtr, BYTE* dstEnd, const size_t offset) +{ + BYTE v[8]; + + assert(dstEnd >= dstPtr + MINMATCH); + + switch(offset) { + case 1: + MEM_INIT(v, *srcPtr, 8); + break; + case 2: + LZ4_memcpy(v, srcPtr, 2); + LZ4_memcpy(&v[2], srcPtr, 2); +#if defined(_MSC_VER) && (_MSC_VER <= 1933) /* MSVC 2022 ver 17.3 or earlier */ +# pragma warning(push) +# pragma warning(disable : 6385) /* warning C6385: Reading invalid data from 'v'. */ +#endif + LZ4_memcpy(&v[4], v, 4); +#if defined(_MSC_VER) && (_MSC_VER <= 1933) /* MSVC 2022 ver 17.3 or earlier */ +# pragma warning(pop) +#endif + break; + case 4: + LZ4_memcpy(v, srcPtr, 4); + LZ4_memcpy(&v[4], srcPtr, 4); + break; + default: + LZ4_memcpy_using_offset_base(dstPtr, srcPtr, dstEnd, offset); + return; + } + + LZ4_memcpy(dstPtr, v, 8); + dstPtr += 8; + while (dstPtr < dstEnd) { + LZ4_memcpy(dstPtr, v, 8); + dstPtr += 8; + } +} +#endif + + +/*-************************************ +* Common functions +**************************************/ +static unsigned LZ4_NbCommonBytes (reg_t val) +{ + assert(val != 0); + if (LZ4_isLittleEndian()) { + if (sizeof(val) == 8) { +# if defined(_MSC_VER) && (_MSC_VER >= 1800) && (defined(_M_AMD64) && !defined(_M_ARM64EC)) && !defined(LZ4_FORCE_SW_BITCOUNT) +/*-************************************************************************************************* +* ARM64EC is a Microsoft-designed ARM64 ABI compatible with AMD64 applications on ARM64 Windows 11. +* The ARM64EC ABI does not support AVX/AVX2/AVX512 instructions, nor their relevant intrinsics +* including _tzcnt_u64. Therefore, we need to neuter the _tzcnt_u64 code path for ARM64EC. +****************************************************************************************************/ +# if defined(__clang__) && (__clang_major__ < 10) + /* Avoid undefined clang-cl intrinsics issue. + * See https://github.com/lz4/lz4/pull/1017 for details. */ + return (unsigned)__builtin_ia32_tzcnt_u64(val) >> 3; +# else + /* x64 CPUS without BMI support interpret `TZCNT` as `REP BSF` */ + return (unsigned)_tzcnt_u64(val) >> 3; +# endif +# elif defined(_MSC_VER) && defined(_WIN64) && !defined(LZ4_FORCE_SW_BITCOUNT) + unsigned long r = 0; + _BitScanForward64(&r, (U64)val); + return (unsigned)r >> 3; +# elif (defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 3) || \ + ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))))) && \ + !defined(LZ4_FORCE_SW_BITCOUNT) + return (unsigned)__builtin_ctzll((U64)val) >> 3; +# else + const U64 m = 0x0101010101010101ULL; + val ^= val - 1; + return (unsigned)(((U64)((val & (m - 1)) * m)) >> 56); +# endif + } else /* 32 bits */ { +# if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(LZ4_FORCE_SW_BITCOUNT) + unsigned long r; + _BitScanForward(&r, (U32)val); + return (unsigned)r >> 3; +# elif (defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 3) || \ + ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))))) && \ + !defined(__TINYC__) && !defined(LZ4_FORCE_SW_BITCOUNT) + return (unsigned)__builtin_ctz((U32)val) >> 3; +# else + const U32 m = 0x01010101; + return (unsigned)((((val - 1) ^ val) & (m - 1)) * m) >> 24; +# endif + } + } else /* Big Endian CPU */ { + if (sizeof(val)==8) { +# if (defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 3) || \ + ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))))) && \ + !defined(__TINYC__) && !defined(LZ4_FORCE_SW_BITCOUNT) + return (unsigned)__builtin_clzll((U64)val) >> 3; +# else +#if 1 + /* this method is probably faster, + * but adds a 128 bytes lookup table */ + static const unsigned char ctz7_tab[128] = { + 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + }; + U64 const mask = 0x0101010101010101ULL; + U64 const t = (((val >> 8) - mask) | val) & mask; + return ctz7_tab[(t * 0x0080402010080402ULL) >> 57]; +#else + /* this method doesn't consume memory space like the previous one, + * but it contains several branches, + * that may end up slowing execution */ + static const U32 by32 = sizeof(val)*4; /* 32 on 64 bits (goal), 16 on 32 bits. + Just to avoid some static analyzer complaining about shift by 32 on 32-bits target. + Note that this code path is never triggered in 32-bits mode. */ + unsigned r; + if (!(val>>by32)) { r=4; } else { r=0; val>>=by32; } + if (!(val>>16)) { r+=2; val>>=8; } else { val>>=24; } + r += (!val); + return r; +#endif +# endif + } else /* 32 bits */ { +# if (defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 3) || \ + ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))))) && \ + !defined(LZ4_FORCE_SW_BITCOUNT) + return (unsigned)__builtin_clz((U32)val) >> 3; +# else + val >>= 8; + val = ((((val + 0x00FFFF00) | 0x00FFFFFF) + val) | + (val + 0x00FF0000)) >> 24; + return (unsigned)val ^ 3; +# endif + } + } +} + + +#define STEPSIZE sizeof(reg_t) +LZ4_FORCE_INLINE +unsigned LZ4_count(const BYTE* pIn, const BYTE* pMatch, const BYTE* pInLimit) +{ + const BYTE* const pStart = pIn; + + if (likely(pIn < pInLimit-(STEPSIZE-1))) { + reg_t const diff = LZ4_read_ARCH(pMatch) ^ LZ4_read_ARCH(pIn); + if (!diff) { + pIn+=STEPSIZE; pMatch+=STEPSIZE; + } else { + return LZ4_NbCommonBytes(diff); + } } + + while (likely(pIn < pInLimit-(STEPSIZE-1))) { + reg_t const diff = LZ4_read_ARCH(pMatch) ^ LZ4_read_ARCH(pIn); + if (!diff) { pIn+=STEPSIZE; pMatch+=STEPSIZE; continue; } + pIn += LZ4_NbCommonBytes(diff); + return (unsigned)(pIn - pStart); + } + + if ((STEPSIZE==8) && (pIn<(pInLimit-3)) && (LZ4_read32(pMatch) == LZ4_read32(pIn))) { pIn+=4; pMatch+=4; } + if ((pIn<(pInLimit-1)) && (LZ4_read16(pMatch) == LZ4_read16(pIn))) { pIn+=2; pMatch+=2; } + if ((pIn compression run slower on incompressible data */ + + +/*-************************************ +* Local Structures and types +**************************************/ +typedef enum { clearedTable = 0, byPtr, byU32, byU16 } tableType_t; + +/** + * This enum distinguishes several different modes of accessing previous + * content in the stream. + * + * - noDict : There is no preceding content. + * - withPrefix64k : Table entries up to ctx->dictSize before the current blob + * blob being compressed are valid and refer to the preceding + * content (of length ctx->dictSize), which is available + * contiguously preceding in memory the content currently + * being compressed. + * - usingExtDict : Like withPrefix64k, but the preceding content is somewhere + * else in memory, starting at ctx->dictionary with length + * ctx->dictSize. + * - usingDictCtx : Everything concerning the preceding content is + * in a separate context, pointed to by ctx->dictCtx. + * ctx->dictionary, ctx->dictSize, and table entries + * in the current context that refer to positions + * preceding the beginning of the current compression are + * ignored. Instead, ctx->dictCtx->dictionary and ctx->dictCtx + * ->dictSize describe the location and size of the preceding + * content, and matches are found by looking in the ctx + * ->dictCtx->hashTable. + */ +typedef enum { noDict = 0, withPrefix64k, usingExtDict, usingDictCtx } dict_directive; +typedef enum { noDictIssue = 0, dictSmall } dictIssue_directive; + + +/*-************************************ +* Local Utils +**************************************/ +int LZ4_versionNumber (void) { return LZ4_VERSION_NUMBER; } +const char* LZ4_versionString(void) { return LZ4_VERSION_STRING; } +int LZ4_compressBound(int isize) { return LZ4_COMPRESSBOUND(isize); } +int LZ4_sizeofState(void) { return sizeof(LZ4_stream_t); } + + +/*-**************************************** +* Internal Definitions, used only in Tests +*******************************************/ +#if defined (__cplusplus) +extern "C" { +#endif + +int LZ4_compress_forceExtDict (LZ4_stream_t* LZ4_dict, const char* source, char* dest, int srcSize); + +int LZ4_decompress_safe_forceExtDict(const char* source, char* dest, + int compressedSize, int maxOutputSize, + const void* dictStart, size_t dictSize); +int LZ4_decompress_safe_partial_forceExtDict(const char* source, char* dest, + int compressedSize, int targetOutputSize, int dstCapacity, + const void* dictStart, size_t dictSize); +#if defined (__cplusplus) +} +#endif + +/*-****************************** +* Compression functions +********************************/ +LZ4_FORCE_INLINE U32 LZ4_hash4(U32 sequence, tableType_t const tableType) +{ + if (tableType == byU16) + return ((sequence * 2654435761U) >> ((MINMATCH*8)-(LZ4_HASHLOG+1))); + else + return ((sequence * 2654435761U) >> ((MINMATCH*8)-LZ4_HASHLOG)); +} + +LZ4_FORCE_INLINE U32 LZ4_hash5(U64 sequence, tableType_t const tableType) +{ + const U32 hashLog = (tableType == byU16) ? LZ4_HASHLOG+1 : LZ4_HASHLOG; + if (LZ4_isLittleEndian()) { + const U64 prime5bytes = 889523592379ULL; + return (U32)(((sequence << 24) * prime5bytes) >> (64 - hashLog)); + } else { + const U64 prime8bytes = 11400714785074694791ULL; + return (U32)(((sequence >> 24) * prime8bytes) >> (64 - hashLog)); + } +} + +LZ4_FORCE_INLINE U32 LZ4_hashPosition(const void* const p, tableType_t const tableType) +{ + if ((sizeof(reg_t)==8) && (tableType != byU16)) return LZ4_hash5(LZ4_read_ARCH(p), tableType); + return LZ4_hash4(LZ4_read32(p), tableType); +} + +LZ4_FORCE_INLINE void LZ4_clearHash(U32 h, void* tableBase, tableType_t const tableType) +{ + switch (tableType) + { + default: /* fallthrough */ + case clearedTable: { /* illegal! */ assert(0); return; } + case byPtr: { const BYTE** hashTable = (const BYTE**)tableBase; hashTable[h] = NULL; return; } + case byU32: { U32* hashTable = (U32*) tableBase; hashTable[h] = 0; return; } + case byU16: { U16* hashTable = (U16*) tableBase; hashTable[h] = 0; return; } + } +} + +LZ4_FORCE_INLINE void LZ4_putIndexOnHash(U32 idx, U32 h, void* tableBase, tableType_t const tableType) +{ + switch (tableType) + { + default: /* fallthrough */ + case clearedTable: /* fallthrough */ + case byPtr: { /* illegal! */ assert(0); return; } + case byU32: { U32* hashTable = (U32*) tableBase; hashTable[h] = idx; return; } + case byU16: { U16* hashTable = (U16*) tableBase; assert(idx < 65536); hashTable[h] = (U16)idx; return; } + } +} + +LZ4_FORCE_INLINE void LZ4_putPositionOnHash(const BYTE* p, U32 h, + void* tableBase, tableType_t const tableType, + const BYTE* srcBase) +{ + switch (tableType) + { + case clearedTable: { /* illegal! */ assert(0); return; } + case byPtr: { const BYTE** hashTable = (const BYTE**)tableBase; hashTable[h] = p; return; } + case byU32: { U32* hashTable = (U32*) tableBase; hashTable[h] = (U32)(p-srcBase); return; } + case byU16: { U16* hashTable = (U16*) tableBase; hashTable[h] = (U16)(p-srcBase); return; } + } +} + +LZ4_FORCE_INLINE void LZ4_putPosition(const BYTE* p, void* tableBase, tableType_t tableType, const BYTE* srcBase) +{ + U32 const h = LZ4_hashPosition(p, tableType); + LZ4_putPositionOnHash(p, h, tableBase, tableType, srcBase); +} + +/* LZ4_getIndexOnHash() : + * Index of match position registered in hash table. + * hash position must be calculated by using base+index, or dictBase+index. + * Assumption 1 : only valid if tableType == byU32 or byU16. + * Assumption 2 : h is presumed valid (within limits of hash table) + */ +LZ4_FORCE_INLINE U32 LZ4_getIndexOnHash(U32 h, const void* tableBase, tableType_t tableType) +{ + LZ4_STATIC_ASSERT(LZ4_MEMORY_USAGE > 2); + if (tableType == byU32) { + const U32* const hashTable = (const U32*) tableBase; + assert(h < (1U << (LZ4_MEMORY_USAGE-2))); + return hashTable[h]; + } + if (tableType == byU16) { + const U16* const hashTable = (const U16*) tableBase; + assert(h < (1U << (LZ4_MEMORY_USAGE-1))); + return hashTable[h]; + } + assert(0); return 0; /* forbidden case */ +} + +static const BYTE* LZ4_getPositionOnHash(U32 h, const void* tableBase, tableType_t tableType, const BYTE* srcBase) +{ + if (tableType == byPtr) { const BYTE* const* hashTable = (const BYTE* const*) tableBase; return hashTable[h]; } + if (tableType == byU32) { const U32* const hashTable = (const U32*) tableBase; return hashTable[h] + srcBase; } + { const U16* const hashTable = (const U16*) tableBase; return hashTable[h] + srcBase; } /* default, to ensure a return */ +} + +LZ4_FORCE_INLINE const BYTE* +LZ4_getPosition(const BYTE* p, + const void* tableBase, tableType_t tableType, + const BYTE* srcBase) +{ + U32 const h = LZ4_hashPosition(p, tableType); + return LZ4_getPositionOnHash(h, tableBase, tableType, srcBase); +} + +LZ4_FORCE_INLINE void +LZ4_prepareTable(LZ4_stream_t_internal* const cctx, + const int inputSize, + const tableType_t tableType) { + /* If the table hasn't been used, it's guaranteed to be zeroed out, and is + * therefore safe to use no matter what mode we're in. Otherwise, we figure + * out if it's safe to leave as is or whether it needs to be reset. + */ + if ((tableType_t)cctx->tableType != clearedTable) { + assert(inputSize >= 0); + if ((tableType_t)cctx->tableType != tableType + || ((tableType == byU16) && cctx->currentOffset + (unsigned)inputSize >= 0xFFFFU) + || ((tableType == byU32) && cctx->currentOffset > 1 GB) + || tableType == byPtr + || inputSize >= 4 KB) + { + DEBUGLOG(4, "LZ4_prepareTable: Resetting table in %p", cctx); + MEM_INIT(cctx->hashTable, 0, LZ4_HASHTABLESIZE); + cctx->currentOffset = 0; + cctx->tableType = (U32)clearedTable; + } else { + DEBUGLOG(4, "LZ4_prepareTable: Re-use hash table (no reset)"); + } + } + + /* Adding a gap, so all previous entries are > LZ4_DISTANCE_MAX back, + * is faster than compressing without a gap. + * However, compressing with currentOffset == 0 is faster still, + * so we preserve that case. + */ + if (cctx->currentOffset != 0 && tableType == byU32) { + DEBUGLOG(5, "LZ4_prepareTable: adding 64KB to currentOffset"); + cctx->currentOffset += 64 KB; + } + + /* Finally, clear history */ + cctx->dictCtx = NULL; + cctx->dictionary = NULL; + cctx->dictSize = 0; +} + +/** LZ4_compress_generic() : + * inlined, to ensure branches are decided at compilation time. + * Presumed already validated at this stage: + * - source != NULL + * - inputSize > 0 + */ +LZ4_FORCE_INLINE int LZ4_compress_generic_validated( + LZ4_stream_t_internal* const cctx, + const char* const source, + char* const dest, + const int inputSize, + int* inputConsumed, /* only written when outputDirective == fillOutput */ + const int maxOutputSize, + const limitedOutput_directive outputDirective, + const tableType_t tableType, + const dict_directive dictDirective, + const dictIssue_directive dictIssue, + const int acceleration) +{ + int result; + const BYTE* ip = (const BYTE*) source; + + U32 const startIndex = cctx->currentOffset; + const BYTE* base = (const BYTE*) source - startIndex; + const BYTE* lowLimit; + + const LZ4_stream_t_internal* dictCtx = (const LZ4_stream_t_internal*) cctx->dictCtx; + const BYTE* const dictionary = + dictDirective == usingDictCtx ? dictCtx->dictionary : cctx->dictionary; + const U32 dictSize = + dictDirective == usingDictCtx ? dictCtx->dictSize : cctx->dictSize; + const U32 dictDelta = (dictDirective == usingDictCtx) ? startIndex - dictCtx->currentOffset : 0; /* make indexes in dictCtx comparable with index in current context */ + + int const maybe_extMem = (dictDirective == usingExtDict) || (dictDirective == usingDictCtx); + U32 const prefixIdxLimit = startIndex - dictSize; /* used when dictDirective == dictSmall */ + const BYTE* const dictEnd = dictionary ? dictionary + dictSize : dictionary; + const BYTE* anchor = (const BYTE*) source; + const BYTE* const iend = ip + inputSize; + const BYTE* const mflimitPlusOne = iend - MFLIMIT + 1; + const BYTE* const matchlimit = iend - LASTLITERALS; + + /* the dictCtx currentOffset is indexed on the start of the dictionary, + * while a dictionary in the current context precedes the currentOffset */ + const BYTE* dictBase = (dictionary == NULL) ? NULL : + (dictDirective == usingDictCtx) ? + dictionary + dictSize - dictCtx->currentOffset : + dictionary + dictSize - startIndex; + + BYTE* op = (BYTE*) dest; + BYTE* const olimit = op + maxOutputSize; + + U32 offset = 0; + U32 forwardH; + + DEBUGLOG(5, "LZ4_compress_generic_validated: srcSize=%i, tableType=%u", inputSize, tableType); + assert(ip != NULL); + /* If init conditions are not met, we don't have to mark stream + * as having dirty context, since no action was taken yet */ + if (outputDirective == fillOutput && maxOutputSize < 1) { return 0; } /* Impossible to store anything */ + if ((tableType == byU16) && (inputSize>=LZ4_64Klimit)) { return 0; } /* Size too large (not within 64K limit) */ + if (tableType==byPtr) assert(dictDirective==noDict); /* only supported use case with byPtr */ + assert(acceleration >= 1); + + lowLimit = (const BYTE*)source - (dictDirective == withPrefix64k ? dictSize : 0); + + /* Update context state */ + if (dictDirective == usingDictCtx) { + /* Subsequent linked blocks can't use the dictionary. */ + /* Instead, they use the block we just compressed. */ + cctx->dictCtx = NULL; + cctx->dictSize = (U32)inputSize; + } else { + cctx->dictSize += (U32)inputSize; + } + cctx->currentOffset += (U32)inputSize; + cctx->tableType = (U32)tableType; + + if (inputSizehashTable, tableType, base); + ip++; forwardH = LZ4_hashPosition(ip, tableType); + + /* Main Loop */ + for ( ; ; ) { + const BYTE* match; + BYTE* token; + const BYTE* filledIp; + + /* Find a match */ + if (tableType == byPtr) { + const BYTE* forwardIp = ip; + int step = 1; + int searchMatchNb = acceleration << LZ4_skipTrigger; + do { + U32 const h = forwardH; + ip = forwardIp; + forwardIp += step; + step = (searchMatchNb++ >> LZ4_skipTrigger); + + if (unlikely(forwardIp > mflimitPlusOne)) goto _last_literals; + assert(ip < mflimitPlusOne); + + match = LZ4_getPositionOnHash(h, cctx->hashTable, tableType, base); + forwardH = LZ4_hashPosition(forwardIp, tableType); + LZ4_putPositionOnHash(ip, h, cctx->hashTable, tableType, base); + + } while ( (match+LZ4_DISTANCE_MAX < ip) + || (LZ4_read32(match) != LZ4_read32(ip)) ); + + } else { /* byU32, byU16 */ + + const BYTE* forwardIp = ip; + int step = 1; + int searchMatchNb = acceleration << LZ4_skipTrigger; + do { + U32 const h = forwardH; + U32 const current = (U32)(forwardIp - base); + U32 matchIndex = LZ4_getIndexOnHash(h, cctx->hashTable, tableType); + assert(matchIndex <= current); + assert(forwardIp - base < (ptrdiff_t)(2 GB - 1)); + ip = forwardIp; + forwardIp += step; + step = (searchMatchNb++ >> LZ4_skipTrigger); + + if (unlikely(forwardIp > mflimitPlusOne)) goto _last_literals; + assert(ip < mflimitPlusOne); + + if (dictDirective == usingDictCtx) { + if (matchIndex < startIndex) { + /* there was no match, try the dictionary */ + assert(tableType == byU32); + matchIndex = LZ4_getIndexOnHash(h, dictCtx->hashTable, byU32); + match = dictBase + matchIndex; + matchIndex += dictDelta; /* make dictCtx index comparable with current context */ + lowLimit = dictionary; + } else { + match = base + matchIndex; + lowLimit = (const BYTE*)source; + } + } else if (dictDirective == usingExtDict) { + if (matchIndex < startIndex) { + DEBUGLOG(7, "extDict candidate: matchIndex=%5u < startIndex=%5u", matchIndex, startIndex); + assert(startIndex - matchIndex >= MINMATCH); + assert(dictBase); + match = dictBase + matchIndex; + lowLimit = dictionary; + } else { + match = base + matchIndex; + lowLimit = (const BYTE*)source; + } + } else { /* single continuous memory segment */ + match = base + matchIndex; + } + forwardH = LZ4_hashPosition(forwardIp, tableType); + LZ4_putIndexOnHash(current, h, cctx->hashTable, tableType); + + DEBUGLOG(7, "candidate at pos=%u (offset=%u \n", matchIndex, current - matchIndex); + if ((dictIssue == dictSmall) && (matchIndex < prefixIdxLimit)) { continue; } /* match outside of valid area */ + assert(matchIndex < current); + if ( ((tableType != byU16) || (LZ4_DISTANCE_MAX < LZ4_DISTANCE_ABSOLUTE_MAX)) + && (matchIndex+LZ4_DISTANCE_MAX < current)) { + continue; + } /* too far */ + assert((current - matchIndex) <= LZ4_DISTANCE_MAX); /* match now expected within distance */ + + if (LZ4_read32(match) == LZ4_read32(ip)) { + if (maybe_extMem) offset = current - matchIndex; + break; /* match found */ + } + + } while(1); + } + + /* Catch up */ + filledIp = ip; + while (((ip>anchor) & (match > lowLimit)) && (unlikely(ip[-1]==match[-1]))) { ip--; match--; } + + /* Encode Literals */ + { unsigned const litLength = (unsigned)(ip - anchor); + token = op++; + if ((outputDirective == limitedOutput) && /* Check output buffer overflow */ + (unlikely(op + litLength + (2 + 1 + LASTLITERALS) + (litLength/255) > olimit)) ) { + return 0; /* cannot compress within `dst` budget. Stored indexes in hash table are nonetheless fine */ + } + if ((outputDirective == fillOutput) && + (unlikely(op + (litLength+240)/255 /* litlen */ + litLength /* literals */ + 2 /* offset */ + 1 /* token */ + MFLIMIT - MINMATCH /* min last literals so last match is <= end - MFLIMIT */ > olimit))) { + op--; + goto _last_literals; + } + if (litLength >= RUN_MASK) { + int len = (int)(litLength - RUN_MASK); + *token = (RUN_MASK<= 255 ; len-=255) *op++ = 255; + *op++ = (BYTE)len; + } + else *token = (BYTE)(litLength< olimit)) { + /* the match was too close to the end, rewind and go to last literals */ + op = token; + goto _last_literals; + } + + /* Encode Offset */ + if (maybe_extMem) { /* static test */ + DEBUGLOG(6, " with offset=%u (ext if > %i)", offset, (int)(ip - (const BYTE*)source)); + assert(offset <= LZ4_DISTANCE_MAX && offset > 0); + LZ4_writeLE16(op, (U16)offset); op+=2; + } else { + DEBUGLOG(6, " with offset=%u (same segment)", (U32)(ip - match)); + assert(ip-match <= LZ4_DISTANCE_MAX); + LZ4_writeLE16(op, (U16)(ip - match)); op+=2; + } + + /* Encode MatchLength */ + { unsigned matchCode; + + if ( (dictDirective==usingExtDict || dictDirective==usingDictCtx) + && (lowLimit==dictionary) /* match within extDict */ ) { + const BYTE* limit = ip + (dictEnd-match); + assert(dictEnd > match); + if (limit > matchlimit) limit = matchlimit; + matchCode = LZ4_count(ip+MINMATCH, match+MINMATCH, limit); + ip += (size_t)matchCode + MINMATCH; + if (ip==limit) { + unsigned const more = LZ4_count(limit, (const BYTE*)source, matchlimit); + matchCode += more; + ip += more; + } + DEBUGLOG(6, " with matchLength=%u starting in extDict", matchCode+MINMATCH); + } else { + matchCode = LZ4_count(ip+MINMATCH, match+MINMATCH, matchlimit); + ip += (size_t)matchCode + MINMATCH; + DEBUGLOG(6, " with matchLength=%u", matchCode+MINMATCH); + } + + if ((outputDirective) && /* Check output buffer overflow */ + (unlikely(op + (1 + LASTLITERALS) + (matchCode+240)/255 > olimit)) ) { + if (outputDirective == fillOutput) { + /* Match description too long : reduce it */ + U32 newMatchCode = 15 /* in token */ - 1 /* to avoid needing a zero byte */ + ((U32)(olimit - op) - 1 - LASTLITERALS) * 255; + ip -= matchCode - newMatchCode; + assert(newMatchCode < matchCode); + matchCode = newMatchCode; + if (unlikely(ip <= filledIp)) { + /* We have already filled up to filledIp so if ip ends up less than filledIp + * we have positions in the hash table beyond the current position. This is + * a problem if we reuse the hash table. So we have to remove these positions + * from the hash table. + */ + const BYTE* ptr; + DEBUGLOG(5, "Clearing %u positions", (U32)(filledIp - ip)); + for (ptr = ip; ptr <= filledIp; ++ptr) { + U32 const h = LZ4_hashPosition(ptr, tableType); + LZ4_clearHash(h, cctx->hashTable, tableType); + } + } + } else { + assert(outputDirective == limitedOutput); + return 0; /* cannot compress within `dst` budget. Stored indexes in hash table are nonetheless fine */ + } + } + if (matchCode >= ML_MASK) { + *token += ML_MASK; + matchCode -= ML_MASK; + LZ4_write32(op, 0xFFFFFFFF); + while (matchCode >= 4*255) { + op+=4; + LZ4_write32(op, 0xFFFFFFFF); + matchCode -= 4*255; + } + op += matchCode / 255; + *op++ = (BYTE)(matchCode % 255); + } else + *token += (BYTE)(matchCode); + } + /* Ensure we have enough space for the last literals. */ + assert(!(outputDirective == fillOutput && op + 1 + LASTLITERALS > olimit)); + + anchor = ip; + + /* Test end of chunk */ + if (ip >= mflimitPlusOne) break; + + /* Fill table */ + LZ4_putPosition(ip-2, cctx->hashTable, tableType, base); + + /* Test next position */ + if (tableType == byPtr) { + + match = LZ4_getPosition(ip, cctx->hashTable, tableType, base); + LZ4_putPosition(ip, cctx->hashTable, tableType, base); + if ( (match+LZ4_DISTANCE_MAX >= ip) + && (LZ4_read32(match) == LZ4_read32(ip)) ) + { token=op++; *token=0; goto _next_match; } + + } else { /* byU32, byU16 */ + + U32 const h = LZ4_hashPosition(ip, tableType); + U32 const current = (U32)(ip-base); + U32 matchIndex = LZ4_getIndexOnHash(h, cctx->hashTable, tableType); + assert(matchIndex < current); + if (dictDirective == usingDictCtx) { + if (matchIndex < startIndex) { + /* there was no match, try the dictionary */ + matchIndex = LZ4_getIndexOnHash(h, dictCtx->hashTable, byU32); + match = dictBase + matchIndex; + lowLimit = dictionary; /* required for match length counter */ + matchIndex += dictDelta; + } else { + match = base + matchIndex; + lowLimit = (const BYTE*)source; /* required for match length counter */ + } + } else if (dictDirective==usingExtDict) { + if (matchIndex < startIndex) { + assert(dictBase); + match = dictBase + matchIndex; + lowLimit = dictionary; /* required for match length counter */ + } else { + match = base + matchIndex; + lowLimit = (const BYTE*)source; /* required for match length counter */ + } + } else { /* single memory segment */ + match = base + matchIndex; + } + LZ4_putIndexOnHash(current, h, cctx->hashTable, tableType); + assert(matchIndex < current); + if ( ((dictIssue==dictSmall) ? (matchIndex >= prefixIdxLimit) : 1) + && (((tableType==byU16) && (LZ4_DISTANCE_MAX == LZ4_DISTANCE_ABSOLUTE_MAX)) ? 1 : (matchIndex+LZ4_DISTANCE_MAX >= current)) + && (LZ4_read32(match) == LZ4_read32(ip)) ) { + token=op++; + *token=0; + if (maybe_extMem) offset = current - matchIndex; + DEBUGLOG(6, "seq.start:%i, literals=%u, match.start:%i", + (int)(anchor-(const BYTE*)source), 0, (int)(ip-(const BYTE*)source)); + goto _next_match; + } + } + + /* Prepare next loop */ + forwardH = LZ4_hashPosition(++ip, tableType); + + } + +_last_literals: + /* Encode Last Literals */ + { size_t lastRun = (size_t)(iend - anchor); + if ( (outputDirective) && /* Check output buffer overflow */ + (op + lastRun + 1 + ((lastRun+255-RUN_MASK)/255) > olimit)) { + if (outputDirective == fillOutput) { + /* adapt lastRun to fill 'dst' */ + assert(olimit >= op); + lastRun = (size_t)(olimit-op) - 1/*token*/; + lastRun -= (lastRun + 256 - RUN_MASK) / 256; /*additional length tokens*/ + } else { + assert(outputDirective == limitedOutput); + return 0; /* cannot compress within `dst` budget. Stored indexes in hash table are nonetheless fine */ + } + } + DEBUGLOG(6, "Final literal run : %i literals", (int)lastRun); + if (lastRun >= RUN_MASK) { + size_t accumulator = lastRun - RUN_MASK; + *op++ = RUN_MASK << ML_BITS; + for(; accumulator >= 255 ; accumulator-=255) *op++ = 255; + *op++ = (BYTE) accumulator; + } else { + *op++ = (BYTE)(lastRun< 0); + DEBUGLOG(5, "LZ4_compress_generic: compressed %i bytes into %i bytes", inputSize, result); + return result; +} + +/** LZ4_compress_generic() : + * inlined, to ensure branches are decided at compilation time; + * takes care of src == (NULL, 0) + * and forward the rest to LZ4_compress_generic_validated */ +LZ4_FORCE_INLINE int LZ4_compress_generic( + LZ4_stream_t_internal* const cctx, + const char* const src, + char* const dst, + const int srcSize, + int *inputConsumed, /* only written when outputDirective == fillOutput */ + const int dstCapacity, + const limitedOutput_directive outputDirective, + const tableType_t tableType, + const dict_directive dictDirective, + const dictIssue_directive dictIssue, + const int acceleration) +{ + DEBUGLOG(5, "LZ4_compress_generic: srcSize=%i, dstCapacity=%i", + srcSize, dstCapacity); + + if ((U32)srcSize > (U32)LZ4_MAX_INPUT_SIZE) { return 0; } /* Unsupported srcSize, too large (or negative) */ + if (srcSize == 0) { /* src == NULL supported if srcSize == 0 */ + if (outputDirective != notLimited && dstCapacity <= 0) return 0; /* no output, can't write anything */ + DEBUGLOG(5, "Generating an empty block"); + assert(outputDirective == notLimited || dstCapacity >= 1); + assert(dst != NULL); + dst[0] = 0; + if (outputDirective == fillOutput) { + assert (inputConsumed != NULL); + *inputConsumed = 0; + } + return 1; + } + assert(src != NULL); + + return LZ4_compress_generic_validated(cctx, src, dst, srcSize, + inputConsumed, /* only written into if outputDirective == fillOutput */ + dstCapacity, outputDirective, + tableType, dictDirective, dictIssue, acceleration); +} + + +int LZ4_compress_fast_extState(void* state, const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration) +{ + LZ4_stream_t_internal* const ctx = & LZ4_initStream(state, sizeof(LZ4_stream_t)) -> internal_donotuse; + assert(ctx != NULL); + if (acceleration < 1) acceleration = LZ4_ACCELERATION_DEFAULT; + if (acceleration > LZ4_ACCELERATION_MAX) acceleration = LZ4_ACCELERATION_MAX; + if (maxOutputSize >= LZ4_compressBound(inputSize)) { + if (inputSize < LZ4_64Klimit) { + return LZ4_compress_generic(ctx, source, dest, inputSize, NULL, 0, notLimited, byU16, noDict, noDictIssue, acceleration); + } else { + const tableType_t tableType = ((sizeof(void*)==4) && ((uptrval)source > LZ4_DISTANCE_MAX)) ? byPtr : byU32; + return LZ4_compress_generic(ctx, source, dest, inputSize, NULL, 0, notLimited, tableType, noDict, noDictIssue, acceleration); + } + } else { + if (inputSize < LZ4_64Klimit) { + return LZ4_compress_generic(ctx, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, byU16, noDict, noDictIssue, acceleration); + } else { + const tableType_t tableType = ((sizeof(void*)==4) && ((uptrval)source > LZ4_DISTANCE_MAX)) ? byPtr : byU32; + return LZ4_compress_generic(ctx, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, noDict, noDictIssue, acceleration); + } + } +} + +/** + * LZ4_compress_fast_extState_fastReset() : + * A variant of LZ4_compress_fast_extState(). + * + * Using this variant avoids an expensive initialization step. It is only safe + * to call if the state buffer is known to be correctly initialized already + * (see comment in lz4.h on LZ4_resetStream_fast() for a definition of + * "correctly initialized"). + */ +int LZ4_compress_fast_extState_fastReset(void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration) +{ + LZ4_stream_t_internal* ctx = &((LZ4_stream_t*)state)->internal_donotuse; + if (acceleration < 1) acceleration = LZ4_ACCELERATION_DEFAULT; + if (acceleration > LZ4_ACCELERATION_MAX) acceleration = LZ4_ACCELERATION_MAX; + + if (dstCapacity >= LZ4_compressBound(srcSize)) { + if (srcSize < LZ4_64Klimit) { + const tableType_t tableType = byU16; + LZ4_prepareTable(ctx, srcSize, tableType); + if (ctx->currentOffset) { + return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, 0, notLimited, tableType, noDict, dictSmall, acceleration); + } else { + return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, 0, notLimited, tableType, noDict, noDictIssue, acceleration); + } + } else { + const tableType_t tableType = ((sizeof(void*)==4) && ((uptrval)src > LZ4_DISTANCE_MAX)) ? byPtr : byU32; + LZ4_prepareTable(ctx, srcSize, tableType); + return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, 0, notLimited, tableType, noDict, noDictIssue, acceleration); + } + } else { + if (srcSize < LZ4_64Klimit) { + const tableType_t tableType = byU16; + LZ4_prepareTable(ctx, srcSize, tableType); + if (ctx->currentOffset) { + return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, dstCapacity, limitedOutput, tableType, noDict, dictSmall, acceleration); + } else { + return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, dstCapacity, limitedOutput, tableType, noDict, noDictIssue, acceleration); + } + } else { + const tableType_t tableType = ((sizeof(void*)==4) && ((uptrval)src > LZ4_DISTANCE_MAX)) ? byPtr : byU32; + LZ4_prepareTable(ctx, srcSize, tableType); + return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, dstCapacity, limitedOutput, tableType, noDict, noDictIssue, acceleration); + } + } +} + + +int LZ4_compress_fast(const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration) +{ + int result; +#if (LZ4_HEAPMODE) + LZ4_stream_t* ctxPtr = (LZ4_stream_t*)ALLOC(sizeof(LZ4_stream_t)); /* malloc-calloc always properly aligned */ + if (ctxPtr == NULL) return 0; +#else + LZ4_stream_t ctx; + LZ4_stream_t* const ctxPtr = &ctx; +#endif + result = LZ4_compress_fast_extState(ctxPtr, source, dest, inputSize, maxOutputSize, acceleration); + +#if (LZ4_HEAPMODE) + FREEMEM(ctxPtr); +#endif + return result; +} + + +int LZ4_compress_default(const char* src, char* dst, int srcSize, int maxOutputSize) +{ + return LZ4_compress_fast(src, dst, srcSize, maxOutputSize, 1); +} + + +/* Note!: This function leaves the stream in an unclean/broken state! + * It is not safe to subsequently use the same state with a _fastReset() or + * _continue() call without resetting it. */ +static int LZ4_compress_destSize_extState (LZ4_stream_t* state, const char* src, char* dst, int* srcSizePtr, int targetDstSize) +{ + void* const s = LZ4_initStream(state, sizeof (*state)); + assert(s != NULL); (void)s; + + if (targetDstSize >= LZ4_compressBound(*srcSizePtr)) { /* compression success is guaranteed */ + return LZ4_compress_fast_extState(state, src, dst, *srcSizePtr, targetDstSize, 1); + } else { + if (*srcSizePtr < LZ4_64Klimit) { + return LZ4_compress_generic(&state->internal_donotuse, src, dst, *srcSizePtr, srcSizePtr, targetDstSize, fillOutput, byU16, noDict, noDictIssue, 1); + } else { + tableType_t const addrMode = ((sizeof(void*)==4) && ((uptrval)src > LZ4_DISTANCE_MAX)) ? byPtr : byU32; + return LZ4_compress_generic(&state->internal_donotuse, src, dst, *srcSizePtr, srcSizePtr, targetDstSize, fillOutput, addrMode, noDict, noDictIssue, 1); + } } +} + + +int LZ4_compress_destSize(const char* src, char* dst, int* srcSizePtr, int targetDstSize) +{ +#if (LZ4_HEAPMODE) + LZ4_stream_t* ctx = (LZ4_stream_t*)ALLOC(sizeof(LZ4_stream_t)); /* malloc-calloc always properly aligned */ + if (ctx == NULL) return 0; +#else + LZ4_stream_t ctxBody; + LZ4_stream_t* ctx = &ctxBody; +#endif + + int result = LZ4_compress_destSize_extState(ctx, src, dst, srcSizePtr, targetDstSize); + +#if (LZ4_HEAPMODE) + FREEMEM(ctx); +#endif + return result; +} + + + +/*-****************************** +* Streaming functions +********************************/ + +#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) +LZ4_stream_t* LZ4_createStream(void) +{ + LZ4_stream_t* const lz4s = (LZ4_stream_t*)ALLOC(sizeof(LZ4_stream_t)); + LZ4_STATIC_ASSERT(sizeof(LZ4_stream_t) >= sizeof(LZ4_stream_t_internal)); + DEBUGLOG(4, "LZ4_createStream %p", lz4s); + if (lz4s == NULL) return NULL; + LZ4_initStream(lz4s, sizeof(*lz4s)); + return lz4s; +} +#endif + +static size_t LZ4_stream_t_alignment(void) +{ +#if LZ4_ALIGN_TEST + typedef struct { char c; LZ4_stream_t t; } t_a; + return sizeof(t_a) - sizeof(LZ4_stream_t); +#else + return 1; /* effectively disabled */ +#endif +} + +LZ4_stream_t* LZ4_initStream (void* buffer, size_t size) +{ + DEBUGLOG(5, "LZ4_initStream"); + if (buffer == NULL) { return NULL; } + if (size < sizeof(LZ4_stream_t)) { return NULL; } + if (!LZ4_isAligned(buffer, LZ4_stream_t_alignment())) return NULL; + MEM_INIT(buffer, 0, sizeof(LZ4_stream_t_internal)); + return (LZ4_stream_t*)buffer; +} + +/* resetStream is now deprecated, + * prefer initStream() which is more general */ +void LZ4_resetStream (LZ4_stream_t* LZ4_stream) +{ + DEBUGLOG(5, "LZ4_resetStream (ctx:%p)", LZ4_stream); + MEM_INIT(LZ4_stream, 0, sizeof(LZ4_stream_t_internal)); +} + +void LZ4_resetStream_fast(LZ4_stream_t* ctx) { + LZ4_prepareTable(&(ctx->internal_donotuse), 0, byU32); +} + +#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) +int LZ4_freeStream (LZ4_stream_t* LZ4_stream) +{ + if (!LZ4_stream) return 0; /* support free on NULL */ + DEBUGLOG(5, "LZ4_freeStream %p", LZ4_stream); + FREEMEM(LZ4_stream); + return (0); +} +#endif + + +#define HASH_UNIT sizeof(reg_t) +int LZ4_loadDict (LZ4_stream_t* LZ4_dict, const char* dictionary, int dictSize) +{ + LZ4_stream_t_internal* dict = &LZ4_dict->internal_donotuse; + const tableType_t tableType = byU32; + const BYTE* p = (const BYTE*)dictionary; + const BYTE* const dictEnd = p + dictSize; + const BYTE* base; + + DEBUGLOG(4, "LZ4_loadDict (%i bytes from %p into %p)", dictSize, dictionary, LZ4_dict); + + /* It's necessary to reset the context, + * and not just continue it with prepareTable() + * to avoid any risk of generating overflowing matchIndex + * when compressing using this dictionary */ + LZ4_resetStream(LZ4_dict); + + /* We always increment the offset by 64 KB, since, if the dict is longer, + * we truncate it to the last 64k, and if it's shorter, we still want to + * advance by a whole window length so we can provide the guarantee that + * there are only valid offsets in the window, which allows an optimization + * in LZ4_compress_fast_continue() where it uses noDictIssue even when the + * dictionary isn't a full 64k. */ + dict->currentOffset += 64 KB; + + if (dictSize < (int)HASH_UNIT) { + return 0; + } + + if ((dictEnd - p) > 64 KB) p = dictEnd - 64 KB; + base = dictEnd - dict->currentOffset; + dict->dictionary = p; + dict->dictSize = (U32)(dictEnd - p); + dict->tableType = (U32)tableType; + + while (p <= dictEnd-HASH_UNIT) { + LZ4_putPosition(p, dict->hashTable, tableType, base); + p+=3; + } + + return (int)dict->dictSize; +} + +void LZ4_attach_dictionary(LZ4_stream_t* workingStream, const LZ4_stream_t* dictionaryStream) +{ + const LZ4_stream_t_internal* dictCtx = (dictionaryStream == NULL) ? NULL : + &(dictionaryStream->internal_donotuse); + + DEBUGLOG(4, "LZ4_attach_dictionary (%p, %p, size %u)", + workingStream, dictionaryStream, + dictCtx != NULL ? dictCtx->dictSize : 0); + + if (dictCtx != NULL) { + /* If the current offset is zero, we will never look in the + * external dictionary context, since there is no value a table + * entry can take that indicate a miss. In that case, we need + * to bump the offset to something non-zero. + */ + if (workingStream->internal_donotuse.currentOffset == 0) { + workingStream->internal_donotuse.currentOffset = 64 KB; + } + + /* Don't actually attach an empty dictionary. + */ + if (dictCtx->dictSize == 0) { + dictCtx = NULL; + } + } + workingStream->internal_donotuse.dictCtx = dictCtx; +} + + +static void LZ4_renormDictT(LZ4_stream_t_internal* LZ4_dict, int nextSize) +{ + assert(nextSize >= 0); + if (LZ4_dict->currentOffset + (unsigned)nextSize > 0x80000000) { /* potential ptrdiff_t overflow (32-bits mode) */ + /* rescale hash table */ + U32 const delta = LZ4_dict->currentOffset - 64 KB; + const BYTE* dictEnd = LZ4_dict->dictionary + LZ4_dict->dictSize; + int i; + DEBUGLOG(4, "LZ4_renormDictT"); + for (i=0; ihashTable[i] < delta) LZ4_dict->hashTable[i]=0; + else LZ4_dict->hashTable[i] -= delta; + } + LZ4_dict->currentOffset = 64 KB; + if (LZ4_dict->dictSize > 64 KB) LZ4_dict->dictSize = 64 KB; + LZ4_dict->dictionary = dictEnd - LZ4_dict->dictSize; + } +} + + +int LZ4_compress_fast_continue (LZ4_stream_t* LZ4_stream, + const char* source, char* dest, + int inputSize, int maxOutputSize, + int acceleration) +{ + const tableType_t tableType = byU32; + LZ4_stream_t_internal* const streamPtr = &LZ4_stream->internal_donotuse; + const char* dictEnd = streamPtr->dictSize ? (const char*)streamPtr->dictionary + streamPtr->dictSize : NULL; + + DEBUGLOG(5, "LZ4_compress_fast_continue (inputSize=%i, dictSize=%u)", inputSize, streamPtr->dictSize); + + LZ4_renormDictT(streamPtr, inputSize); /* fix index overflow */ + if (acceleration < 1) acceleration = LZ4_ACCELERATION_DEFAULT; + if (acceleration > LZ4_ACCELERATION_MAX) acceleration = LZ4_ACCELERATION_MAX; + + /* invalidate tiny dictionaries */ + if ( (streamPtr->dictSize < 4) /* tiny dictionary : not enough for a hash */ + && (dictEnd != source) /* prefix mode */ + && (inputSize > 0) /* tolerance : don't lose history, in case next invocation would use prefix mode */ + && (streamPtr->dictCtx == NULL) /* usingDictCtx */ + ) { + DEBUGLOG(5, "LZ4_compress_fast_continue: dictSize(%u) at addr:%p is too small", streamPtr->dictSize, streamPtr->dictionary); + /* remove dictionary existence from history, to employ faster prefix mode */ + streamPtr->dictSize = 0; + streamPtr->dictionary = (const BYTE*)source; + dictEnd = source; + } + + /* Check overlapping input/dictionary space */ + { const char* const sourceEnd = source + inputSize; + if ((sourceEnd > (const char*)streamPtr->dictionary) && (sourceEnd < dictEnd)) { + streamPtr->dictSize = (U32)(dictEnd - sourceEnd); + if (streamPtr->dictSize > 64 KB) streamPtr->dictSize = 64 KB; + if (streamPtr->dictSize < 4) streamPtr->dictSize = 0; + streamPtr->dictionary = (const BYTE*)dictEnd - streamPtr->dictSize; + } + } + + /* prefix mode : source data follows dictionary */ + if (dictEnd == source) { + if ((streamPtr->dictSize < 64 KB) && (streamPtr->dictSize < streamPtr->currentOffset)) + return LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, withPrefix64k, dictSmall, acceleration); + else + return LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, withPrefix64k, noDictIssue, acceleration); + } + + /* external dictionary mode */ + { int result; + if (streamPtr->dictCtx) { + /* We depend here on the fact that dictCtx'es (produced by + * LZ4_loadDict) guarantee that their tables contain no references + * to offsets between dictCtx->currentOffset - 64 KB and + * dictCtx->currentOffset - dictCtx->dictSize. This makes it safe + * to use noDictIssue even when the dict isn't a full 64 KB. + */ + if (inputSize > 4 KB) { + /* For compressing large blobs, it is faster to pay the setup + * cost to copy the dictionary's tables into the active context, + * so that the compression loop is only looking into one table. + */ + LZ4_memcpy(streamPtr, streamPtr->dictCtx, sizeof(*streamPtr)); + result = LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, usingExtDict, noDictIssue, acceleration); + } else { + result = LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, usingDictCtx, noDictIssue, acceleration); + } + } else { /* small data <= 4 KB */ + if ((streamPtr->dictSize < 64 KB) && (streamPtr->dictSize < streamPtr->currentOffset)) { + result = LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, usingExtDict, dictSmall, acceleration); + } else { + result = LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, usingExtDict, noDictIssue, acceleration); + } + } + streamPtr->dictionary = (const BYTE*)source; + streamPtr->dictSize = (U32)inputSize; + return result; + } +} + + +/* Hidden debug function, to force-test external dictionary mode */ +int LZ4_compress_forceExtDict (LZ4_stream_t* LZ4_dict, const char* source, char* dest, int srcSize) +{ + LZ4_stream_t_internal* streamPtr = &LZ4_dict->internal_donotuse; + int result; + + LZ4_renormDictT(streamPtr, srcSize); + + if ((streamPtr->dictSize < 64 KB) && (streamPtr->dictSize < streamPtr->currentOffset)) { + result = LZ4_compress_generic(streamPtr, source, dest, srcSize, NULL, 0, notLimited, byU32, usingExtDict, dictSmall, 1); + } else { + result = LZ4_compress_generic(streamPtr, source, dest, srcSize, NULL, 0, notLimited, byU32, usingExtDict, noDictIssue, 1); + } + + streamPtr->dictionary = (const BYTE*)source; + streamPtr->dictSize = (U32)srcSize; + + return result; +} + + +/*! LZ4_saveDict() : + * If previously compressed data block is not guaranteed to remain available at its memory location, + * save it into a safer place (char* safeBuffer). + * Note : no need to call LZ4_loadDict() afterwards, dictionary is immediately usable, + * one can therefore call LZ4_compress_fast_continue() right after. + * @return : saved dictionary size in bytes (necessarily <= dictSize), or 0 if error. + */ +int LZ4_saveDict (LZ4_stream_t* LZ4_dict, char* safeBuffer, int dictSize) +{ + LZ4_stream_t_internal* const dict = &LZ4_dict->internal_donotuse; + + DEBUGLOG(5, "LZ4_saveDict : dictSize=%i, safeBuffer=%p", dictSize, safeBuffer); + + if ((U32)dictSize > 64 KB) { dictSize = 64 KB; } /* useless to define a dictionary > 64 KB */ + if ((U32)dictSize > dict->dictSize) { dictSize = (int)dict->dictSize; } + + if (safeBuffer == NULL) assert(dictSize == 0); + if (dictSize > 0) { + const BYTE* const previousDictEnd = dict->dictionary + dict->dictSize; + assert(dict->dictionary); + LZ4_memmove(safeBuffer, previousDictEnd - dictSize, (size_t)dictSize); + } + + dict->dictionary = (const BYTE*)safeBuffer; + dict->dictSize = (U32)dictSize; + + return dictSize; +} + + + +/*-******************************* + * Decompression functions + ********************************/ + +typedef enum { decode_full_block = 0, partial_decode = 1 } earlyEnd_directive; + +#undef MIN +#define MIN(a,b) ( (a) < (b) ? (a) : (b) ) + + +/* variant for decompress_unsafe() + * does not know end of input + * presumes input is well formed + * note : will consume at least one byte */ +size_t read_long_length_no_check(const BYTE** pp) +{ + size_t b, l = 0; + do { b = **pp; (*pp)++; l += b; } while (b==255); + DEBUGLOG(6, "read_long_length_no_check: +length=%zu using %zu input bytes", l, l/255 + 1) + return l; +} + +/* core decoder variant for LZ4_decompress_fast*() + * for legacy support only : these entry points are deprecated. + * - Presumes input is correctly formed (no defense vs malformed inputs) + * - Does not know input size (presume input buffer is "large enough") + * - Decompress a full block (only) + * @return : nb of bytes read from input. + * Note : this variant is not optimized for speed, just for maintenance. + * the goal is to remove support of decompress_fast*() variants by v2.0 +**/ +LZ4_FORCE_INLINE int +LZ4_decompress_unsafe_generic( + const BYTE* const istart, + BYTE* const ostart, + int decompressedSize, + + size_t prefixSize, + const BYTE* const dictStart, /* only if dict==usingExtDict */ + const size_t dictSize /* note: =0 if dictStart==NULL */ + ) +{ + const BYTE* ip = istart; + BYTE* op = (BYTE*)ostart; + BYTE* const oend = ostart + decompressedSize; + const BYTE* const prefixStart = ostart - prefixSize; + + DEBUGLOG(5, "LZ4_decompress_unsafe_generic"); + if (dictStart == NULL) assert(dictSize == 0); + + while (1) { + /* start new sequence */ + unsigned token = *ip++; + + /* literals */ + { size_t ll = token >> ML_BITS; + if (ll==15) { + /* long literal length */ + ll += read_long_length_no_check(&ip); + } + if ((size_t)(oend-op) < ll) return -1; /* output buffer overflow */ + LZ4_memmove(op, ip, ll); /* support in-place decompression */ + op += ll; + ip += ll; + if ((size_t)(oend-op) < MFLIMIT) { + if (op==oend) break; /* end of block */ + DEBUGLOG(5, "invalid: literals end at distance %zi from end of block", oend-op); + /* incorrect end of block : + * last match must start at least MFLIMIT==12 bytes before end of output block */ + return -1; + } } + + /* match */ + { size_t ml = token & 15; + size_t const offset = LZ4_readLE16(ip); + ip+=2; + + if (ml==15) { + /* long literal length */ + ml += read_long_length_no_check(&ip); + } + ml += MINMATCH; + + if ((size_t)(oend-op) < ml) return -1; /* output buffer overflow */ + + { const BYTE* match = op - offset; + + /* out of range */ + if (offset > (size_t)(op - prefixStart) + dictSize) { + DEBUGLOG(6, "offset out of range"); + return -1; + } + + /* check special case : extDict */ + if (offset > (size_t)(op - prefixStart)) { + /* extDict scenario */ + const BYTE* const dictEnd = dictStart + dictSize; + const BYTE* extMatch = dictEnd - (offset - (size_t)(op-prefixStart)); + size_t const extml = (size_t)(dictEnd - extMatch); + if (extml > ml) { + /* match entirely within extDict */ + LZ4_memmove(op, extMatch, ml); + op += ml; + ml = 0; + } else { + /* match split between extDict & prefix */ + LZ4_memmove(op, extMatch, extml); + op += extml; + ml -= extml; + } + match = prefixStart; + } + + /* match copy - slow variant, supporting overlap copy */ + { size_t u; + for (u=0; u= ipmax before start of loop. Returns initial_error if so. + * @error (output) - error code. Must be set to 0 before call. +**/ +typedef size_t Rvl_t; +static const Rvl_t rvl_error = (Rvl_t)(-1); +LZ4_FORCE_INLINE Rvl_t +read_variable_length(const BYTE** ip, const BYTE* ilimit, + int initial_check) +{ + Rvl_t s, length = 0; + assert(ip != NULL); + assert(*ip != NULL); + assert(ilimit != NULL); + if (initial_check && unlikely((*ip) >= ilimit)) { /* read limit reached */ + return rvl_error; + } + do { + s = **ip; + (*ip)++; + length += s; + if (unlikely((*ip) > ilimit)) { /* read limit reached */ + return rvl_error; + } + /* accumulator overflow detection (32-bit mode only) */ + if ((sizeof(length)<8) && unlikely(length > ((Rvl_t)(-1)/2)) ) { + return rvl_error; + } + } while (s==255); + + return length; +} + +/*! LZ4_decompress_generic() : + * This generic decompression function covers all use cases. + * It shall be instantiated several times, using different sets of directives. + * Note that it is important for performance that this function really get inlined, + * in order to remove useless branches during compilation optimization. + */ +LZ4_FORCE_INLINE int +LZ4_decompress_generic( + const char* const src, + char* const dst, + int srcSize, + int outputSize, /* If endOnInput==endOnInputSize, this value is `dstCapacity` */ + + earlyEnd_directive partialDecoding, /* full, partial */ + dict_directive dict, /* noDict, withPrefix64k, usingExtDict */ + const BYTE* const lowPrefix, /* always <= dst, == dst when no prefix */ + const BYTE* const dictStart, /* only if dict==usingExtDict */ + const size_t dictSize /* note : = 0 if noDict */ + ) +{ + if ((src == NULL) || (outputSize < 0)) { return -1; } + + { const BYTE* ip = (const BYTE*) src; + const BYTE* const iend = ip + srcSize; + + BYTE* op = (BYTE*) dst; + BYTE* const oend = op + outputSize; + BYTE* cpy; + + const BYTE* const dictEnd = (dictStart == NULL) ? NULL : dictStart + dictSize; + + const int checkOffset = (dictSize < (int)(64 KB)); + + + /* Set up the "end" pointers for the shortcut. */ + const BYTE* const shortiend = iend - 14 /*maxLL*/ - 2 /*offset*/; + const BYTE* const shortoend = oend - 14 /*maxLL*/ - 18 /*maxML*/; + + const BYTE* match; + size_t offset; + unsigned token; + size_t length; + + + DEBUGLOG(5, "LZ4_decompress_generic (srcSize:%i, dstSize:%i)", srcSize, outputSize); + + /* Special cases */ + assert(lowPrefix <= op); + if (unlikely(outputSize==0)) { + /* Empty output buffer */ + if (partialDecoding) return 0; + return ((srcSize==1) && (*ip==0)) ? 0 : -1; + } + if (unlikely(srcSize==0)) { return -1; } + + /* LZ4_FAST_DEC_LOOP: + * designed for modern OoO performance cpus, + * where copying reliably 32-bytes is preferable to an unpredictable branch. + * note : fast loop may show a regression for some client arm chips. */ +#if LZ4_FAST_DEC_LOOP + if ((oend - op) < FASTLOOP_SAFE_DISTANCE) { + DEBUGLOG(6, "skip fast decode loop"); + goto safe_decode; + } + + /* Fast loop : decode sequences as long as output < oend-FASTLOOP_SAFE_DISTANCE */ + while (1) { + /* Main fastloop assertion: We can always wildcopy FASTLOOP_SAFE_DISTANCE */ + assert(oend - op >= FASTLOOP_SAFE_DISTANCE); + assert(ip < iend); + token = *ip++; + length = token >> ML_BITS; /* literal length */ + + /* decode literal length */ + if (length == RUN_MASK) { + size_t const addl = read_variable_length(&ip, iend-RUN_MASK, 1); + if (addl == rvl_error) { goto _output_error; } + length += addl; + if (unlikely((uptrval)(op)+length<(uptrval)(op))) { goto _output_error; } /* overflow detection */ + if (unlikely((uptrval)(ip)+length<(uptrval)(ip))) { goto _output_error; } /* overflow detection */ + + /* copy literals */ + cpy = op+length; + LZ4_STATIC_ASSERT(MFLIMIT >= WILDCOPYLENGTH); + if ((cpy>oend-32) || (ip+length>iend-32)) { goto safe_literal_copy; } + LZ4_wildCopy32(op, ip, cpy); + ip += length; op = cpy; + } else { + cpy = op+length; + DEBUGLOG(7, "copy %u bytes in a 16-bytes stripe", (unsigned)length); + /* We don't need to check oend, since we check it once for each loop below */ + if (ip > iend-(16 + 1/*max lit + offset + nextToken*/)) { goto safe_literal_copy; } + /* Literals can only be <= 14, but hope compilers optimize better when copy by a register size */ + LZ4_memcpy(op, ip, 16); + ip += length; op = cpy; + } + + /* get offset */ + offset = LZ4_readLE16(ip); ip+=2; + match = op - offset; + assert(match <= op); /* overflow check */ + + /* get matchlength */ + length = token & ML_MASK; + + if (length == ML_MASK) { + size_t const addl = read_variable_length(&ip, iend - LASTLITERALS + 1, 0); + if (addl == rvl_error) { goto _output_error; } + length += addl; + length += MINMATCH; + if (unlikely((uptrval)(op)+length<(uptrval)op)) { goto _output_error; } /* overflow detection */ + if ((checkOffset) && (unlikely(match + dictSize < lowPrefix))) { goto _output_error; } /* Error : offset outside buffers */ + if (op + length >= oend - FASTLOOP_SAFE_DISTANCE) { + goto safe_match_copy; + } + } else { + length += MINMATCH; + if (op + length >= oend - FASTLOOP_SAFE_DISTANCE) { + goto safe_match_copy; + } + + /* Fastpath check: skip LZ4_wildCopy32 when true */ + if ((dict == withPrefix64k) || (match >= lowPrefix)) { + if (offset >= 8) { + assert(match >= lowPrefix); + assert(match <= op); + assert(op + 18 <= oend); + + LZ4_memcpy(op, match, 8); + LZ4_memcpy(op+8, match+8, 8); + LZ4_memcpy(op+16, match+16, 2); + op += length; + continue; + } } } + + if (checkOffset && (unlikely(match + dictSize < lowPrefix))) { goto _output_error; } /* Error : offset outside buffers */ + /* match starting within external dictionary */ + if ((dict==usingExtDict) && (match < lowPrefix)) { + assert(dictEnd != NULL); + if (unlikely(op+length > oend-LASTLITERALS)) { + if (partialDecoding) { + DEBUGLOG(7, "partialDecoding: dictionary match, close to dstEnd"); + length = MIN(length, (size_t)(oend-op)); + } else { + goto _output_error; /* end-of-block condition violated */ + } } + + if (length <= (size_t)(lowPrefix-match)) { + /* match fits entirely within external dictionary : just copy */ + LZ4_memmove(op, dictEnd - (lowPrefix-match), length); + op += length; + } else { + /* match stretches into both external dictionary and current block */ + size_t const copySize = (size_t)(lowPrefix - match); + size_t const restSize = length - copySize; + LZ4_memcpy(op, dictEnd - copySize, copySize); + op += copySize; + if (restSize > (size_t)(op - lowPrefix)) { /* overlap copy */ + BYTE* const endOfMatch = op + restSize; + const BYTE* copyFrom = lowPrefix; + while (op < endOfMatch) { *op++ = *copyFrom++; } + } else { + LZ4_memcpy(op, lowPrefix, restSize); + op += restSize; + } } + continue; + } + + /* copy match within block */ + cpy = op + length; + + assert((op <= oend) && (oend-op >= 32)); + if (unlikely(offset<16)) { + LZ4_memcpy_using_offset(op, match, cpy, offset); + } else { + LZ4_wildCopy32(op, match, cpy); + } + + op = cpy; /* wildcopy correction */ + } + safe_decode: +#endif + + /* Main Loop : decode remaining sequences where output < FASTLOOP_SAFE_DISTANCE */ + while (1) { + assert(ip < iend); + token = *ip++; + length = token >> ML_BITS; /* literal length */ + + /* A two-stage shortcut for the most common case: + * 1) If the literal length is 0..14, and there is enough space, + * enter the shortcut and copy 16 bytes on behalf of the literals + * (in the fast mode, only 8 bytes can be safely copied this way). + * 2) Further if the match length is 4..18, copy 18 bytes in a similar + * manner; but we ensure that there's enough space in the output for + * those 18 bytes earlier, upon entering the shortcut (in other words, + * there is a combined check for both stages). + */ + if ( (length != RUN_MASK) + /* strictly "less than" on input, to re-enter the loop with at least one byte */ + && likely((ip < shortiend) & (op <= shortoend)) ) { + /* Copy the literals */ + LZ4_memcpy(op, ip, 16); + op += length; ip += length; + + /* The second stage: prepare for match copying, decode full info. + * If it doesn't work out, the info won't be wasted. */ + length = token & ML_MASK; /* match length */ + offset = LZ4_readLE16(ip); ip += 2; + match = op - offset; + assert(match <= op); /* check overflow */ + + /* Do not deal with overlapping matches. */ + if ( (length != ML_MASK) + && (offset >= 8) + && (dict==withPrefix64k || match >= lowPrefix) ) { + /* Copy the match. */ + LZ4_memcpy(op + 0, match + 0, 8); + LZ4_memcpy(op + 8, match + 8, 8); + LZ4_memcpy(op +16, match +16, 2); + op += length + MINMATCH; + /* Both stages worked, load the next token. */ + continue; + } + + /* The second stage didn't work out, but the info is ready. + * Propel it right to the point of match copying. */ + goto _copy_match; + } + + /* decode literal length */ + if (length == RUN_MASK) { + size_t const addl = read_variable_length(&ip, iend-RUN_MASK, 1); + if (addl == rvl_error) { goto _output_error; } + length += addl; + if (unlikely((uptrval)(op)+length<(uptrval)(op))) { goto _output_error; } /* overflow detection */ + if (unlikely((uptrval)(ip)+length<(uptrval)(ip))) { goto _output_error; } /* overflow detection */ + } + + /* copy literals */ + cpy = op+length; +#if LZ4_FAST_DEC_LOOP + safe_literal_copy: +#endif + LZ4_STATIC_ASSERT(MFLIMIT >= WILDCOPYLENGTH); + if ((cpy>oend-MFLIMIT) || (ip+length>iend-(2+1+LASTLITERALS))) { + /* We've either hit the input parsing restriction or the output parsing restriction. + * In the normal scenario, decoding a full block, it must be the last sequence, + * otherwise it's an error (invalid input or dimensions). + * In partialDecoding scenario, it's necessary to ensure there is no buffer overflow. + */ + if (partialDecoding) { + /* Since we are partial decoding we may be in this block because of the output parsing + * restriction, which is not valid since the output buffer is allowed to be undersized. + */ + DEBUGLOG(7, "partialDecoding: copying literals, close to input or output end") + DEBUGLOG(7, "partialDecoding: literal length = %u", (unsigned)length); + DEBUGLOG(7, "partialDecoding: remaining space in dstBuffer : %i", (int)(oend - op)); + DEBUGLOG(7, "partialDecoding: remaining space in srcBuffer : %i", (int)(iend - ip)); + /* Finishing in the middle of a literals segment, + * due to lack of input. + */ + if (ip+length > iend) { + length = (size_t)(iend-ip); + cpy = op + length; + } + /* Finishing in the middle of a literals segment, + * due to lack of output space. + */ + if (cpy > oend) { + cpy = oend; + assert(op<=oend); + length = (size_t)(oend-op); + } + } else { + /* We must be on the last sequence (or invalid) because of the parsing limitations + * so check that we exactly consume the input and don't overrun the output buffer. + */ + if ((ip+length != iend) || (cpy > oend)) { + DEBUGLOG(6, "should have been last run of literals") + DEBUGLOG(6, "ip(%p) + length(%i) = %p != iend (%p)", ip, (int)length, ip+length, iend); + DEBUGLOG(6, "or cpy(%p) > oend(%p)", cpy, oend); + goto _output_error; + } + } + LZ4_memmove(op, ip, length); /* supports overlapping memory regions, for in-place decompression scenarios */ + ip += length; + op += length; + /* Necessarily EOF when !partialDecoding. + * When partialDecoding, it is EOF if we've either + * filled the output buffer or + * can't proceed with reading an offset for following match. + */ + if (!partialDecoding || (cpy == oend) || (ip >= (iend-2))) { + break; + } + } else { + LZ4_wildCopy8(op, ip, cpy); /* can overwrite up to 8 bytes beyond cpy */ + ip += length; op = cpy; + } + + /* get offset */ + offset = LZ4_readLE16(ip); ip+=2; + match = op - offset; + + /* get matchlength */ + length = token & ML_MASK; + + _copy_match: + if (length == ML_MASK) { + size_t const addl = read_variable_length(&ip, iend - LASTLITERALS + 1, 0); + if (addl == rvl_error) { goto _output_error; } + length += addl; + if (unlikely((uptrval)(op)+length<(uptrval)op)) goto _output_error; /* overflow detection */ + } + length += MINMATCH; + +#if LZ4_FAST_DEC_LOOP + safe_match_copy: +#endif + if ((checkOffset) && (unlikely(match + dictSize < lowPrefix))) goto _output_error; /* Error : offset outside buffers */ + /* match starting within external dictionary */ + if ((dict==usingExtDict) && (match < lowPrefix)) { + assert(dictEnd != NULL); + if (unlikely(op+length > oend-LASTLITERALS)) { + if (partialDecoding) length = MIN(length, (size_t)(oend-op)); + else goto _output_error; /* doesn't respect parsing restriction */ + } + + if (length <= (size_t)(lowPrefix-match)) { + /* match fits entirely within external dictionary : just copy */ + LZ4_memmove(op, dictEnd - (lowPrefix-match), length); + op += length; + } else { + /* match stretches into both external dictionary and current block */ + size_t const copySize = (size_t)(lowPrefix - match); + size_t const restSize = length - copySize; + LZ4_memcpy(op, dictEnd - copySize, copySize); + op += copySize; + if (restSize > (size_t)(op - lowPrefix)) { /* overlap copy */ + BYTE* const endOfMatch = op + restSize; + const BYTE* copyFrom = lowPrefix; + while (op < endOfMatch) *op++ = *copyFrom++; + } else { + LZ4_memcpy(op, lowPrefix, restSize); + op += restSize; + } } + continue; + } + assert(match >= lowPrefix); + + /* copy match within block */ + cpy = op + length; + + /* partialDecoding : may end anywhere within the block */ + assert(op<=oend); + if (partialDecoding && (cpy > oend-MATCH_SAFEGUARD_DISTANCE)) { + size_t const mlen = MIN(length, (size_t)(oend-op)); + const BYTE* const matchEnd = match + mlen; + BYTE* const copyEnd = op + mlen; + if (matchEnd > op) { /* overlap copy */ + while (op < copyEnd) { *op++ = *match++; } + } else { + LZ4_memcpy(op, match, mlen); + } + op = copyEnd; + if (op == oend) { break; } + continue; + } + + if (unlikely(offset<8)) { + LZ4_write32(op, 0); /* silence msan warning when offset==0 */ + op[0] = match[0]; + op[1] = match[1]; + op[2] = match[2]; + op[3] = match[3]; + match += inc32table[offset]; + LZ4_memcpy(op+4, match, 4); + match -= dec64table[offset]; + } else { + LZ4_memcpy(op, match, 8); + match += 8; + } + op += 8; + + if (unlikely(cpy > oend-MATCH_SAFEGUARD_DISTANCE)) { + BYTE* const oCopyLimit = oend - (WILDCOPYLENGTH-1); + if (cpy > oend-LASTLITERALS) { goto _output_error; } /* Error : last LASTLITERALS bytes must be literals (uncompressed) */ + if (op < oCopyLimit) { + LZ4_wildCopy8(op, match, oCopyLimit); + match += oCopyLimit - op; + op = oCopyLimit; + } + while (op < cpy) { *op++ = *match++; } + } else { + LZ4_memcpy(op, match, 8); + if (length > 16) { LZ4_wildCopy8(op+8, match+8, cpy); } + } + op = cpy; /* wildcopy correction */ + } + + /* end of decoding */ + DEBUGLOG(5, "decoded %i bytes", (int) (((char*)op)-dst)); + return (int) (((char*)op)-dst); /* Nb of output bytes decoded */ + + /* Overflow error detected */ + _output_error: + return (int) (-(((const char*)ip)-src))-1; + } +} + + +/*===== Instantiate the API decoding functions. =====*/ + +LZ4_FORCE_O2 +int LZ4_decompress_safe(const char* source, char* dest, int compressedSize, int maxDecompressedSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxDecompressedSize, + decode_full_block, noDict, + (BYTE*)dest, NULL, 0); +} + +LZ4_FORCE_O2 +int LZ4_decompress_safe_partial(const char* src, char* dst, int compressedSize, int targetOutputSize, int dstCapacity) +{ + dstCapacity = MIN(targetOutputSize, dstCapacity); + return LZ4_decompress_generic(src, dst, compressedSize, dstCapacity, + partial_decode, + noDict, (BYTE*)dst, NULL, 0); +} + +LZ4_FORCE_O2 +int LZ4_decompress_fast(const char* source, char* dest, int originalSize) +{ + DEBUGLOG(5, "LZ4_decompress_fast"); + return LZ4_decompress_unsafe_generic( + (const BYTE*)source, (BYTE*)dest, originalSize, + 0, NULL, 0); +} + +/*===== Instantiate a few more decoding cases, used more than once. =====*/ + +LZ4_FORCE_O2 /* Exported, an obsolete API function. */ +int LZ4_decompress_safe_withPrefix64k(const char* source, char* dest, int compressedSize, int maxOutputSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, + decode_full_block, withPrefix64k, + (BYTE*)dest - 64 KB, NULL, 0); +} + +LZ4_FORCE_O2 +static int LZ4_decompress_safe_partial_withPrefix64k(const char* source, char* dest, int compressedSize, int targetOutputSize, int dstCapacity) +{ + dstCapacity = MIN(targetOutputSize, dstCapacity); + return LZ4_decompress_generic(source, dest, compressedSize, dstCapacity, + partial_decode, withPrefix64k, + (BYTE*)dest - 64 KB, NULL, 0); +} + +/* Another obsolete API function, paired with the previous one. */ +int LZ4_decompress_fast_withPrefix64k(const char* source, char* dest, int originalSize) +{ + return LZ4_decompress_unsafe_generic( + (const BYTE*)source, (BYTE*)dest, originalSize, + 64 KB, NULL, 0); +} + +LZ4_FORCE_O2 +static int LZ4_decompress_safe_withSmallPrefix(const char* source, char* dest, int compressedSize, int maxOutputSize, + size_t prefixSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, + decode_full_block, noDict, + (BYTE*)dest-prefixSize, NULL, 0); +} + +LZ4_FORCE_O2 +static int LZ4_decompress_safe_partial_withSmallPrefix(const char* source, char* dest, int compressedSize, int targetOutputSize, int dstCapacity, + size_t prefixSize) +{ + dstCapacity = MIN(targetOutputSize, dstCapacity); + return LZ4_decompress_generic(source, dest, compressedSize, dstCapacity, + partial_decode, noDict, + (BYTE*)dest-prefixSize, NULL, 0); +} + +LZ4_FORCE_O2 +int LZ4_decompress_safe_forceExtDict(const char* source, char* dest, + int compressedSize, int maxOutputSize, + const void* dictStart, size_t dictSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, + decode_full_block, usingExtDict, + (BYTE*)dest, (const BYTE*)dictStart, dictSize); +} + +LZ4_FORCE_O2 +int LZ4_decompress_safe_partial_forceExtDict(const char* source, char* dest, + int compressedSize, int targetOutputSize, int dstCapacity, + const void* dictStart, size_t dictSize) +{ + dstCapacity = MIN(targetOutputSize, dstCapacity); + return LZ4_decompress_generic(source, dest, compressedSize, dstCapacity, + partial_decode, usingExtDict, + (BYTE*)dest, (const BYTE*)dictStart, dictSize); +} + +LZ4_FORCE_O2 +static int LZ4_decompress_fast_extDict(const char* source, char* dest, int originalSize, + const void* dictStart, size_t dictSize) +{ + return LZ4_decompress_unsafe_generic( + (const BYTE*)source, (BYTE*)dest, originalSize, + 0, (const BYTE*)dictStart, dictSize); +} + +/* The "double dictionary" mode, for use with e.g. ring buffers: the first part + * of the dictionary is passed as prefix, and the second via dictStart + dictSize. + * These routines are used only once, in LZ4_decompress_*_continue(). + */ +LZ4_FORCE_INLINE +int LZ4_decompress_safe_doubleDict(const char* source, char* dest, int compressedSize, int maxOutputSize, + size_t prefixSize, const void* dictStart, size_t dictSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, + decode_full_block, usingExtDict, + (BYTE*)dest-prefixSize, (const BYTE*)dictStart, dictSize); +} + +/*===== streaming decompression functions =====*/ + +#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) +LZ4_streamDecode_t* LZ4_createStreamDecode(void) +{ + LZ4_STATIC_ASSERT(sizeof(LZ4_streamDecode_t) >= sizeof(LZ4_streamDecode_t_internal)); + return (LZ4_streamDecode_t*) ALLOC_AND_ZERO(sizeof(LZ4_streamDecode_t)); +} + +int LZ4_freeStreamDecode (LZ4_streamDecode_t* LZ4_stream) +{ + if (LZ4_stream == NULL) { return 0; } /* support free on NULL */ + FREEMEM(LZ4_stream); + return 0; +} +#endif + +/*! LZ4_setStreamDecode() : + * Use this function to instruct where to find the dictionary. + * This function is not necessary if previous data is still available where it was decoded. + * Loading a size of 0 is allowed (same effect as no dictionary). + * @return : 1 if OK, 0 if error + */ +int LZ4_setStreamDecode (LZ4_streamDecode_t* LZ4_streamDecode, const char* dictionary, int dictSize) +{ + LZ4_streamDecode_t_internal* lz4sd = &LZ4_streamDecode->internal_donotuse; + lz4sd->prefixSize = (size_t)dictSize; + if (dictSize) { + assert(dictionary != NULL); + lz4sd->prefixEnd = (const BYTE*) dictionary + dictSize; + } else { + lz4sd->prefixEnd = (const BYTE*) dictionary; + } + lz4sd->externalDict = NULL; + lz4sd->extDictSize = 0; + return 1; +} + +/*! LZ4_decoderRingBufferSize() : + * when setting a ring buffer for streaming decompression (optional scenario), + * provides the minimum size of this ring buffer + * to be compatible with any source respecting maxBlockSize condition. + * Note : in a ring buffer scenario, + * blocks are presumed decompressed next to each other. + * When not enough space remains for next block (remainingSize < maxBlockSize), + * decoding resumes from beginning of ring buffer. + * @return : minimum ring buffer size, + * or 0 if there is an error (invalid maxBlockSize). + */ +int LZ4_decoderRingBufferSize(int maxBlockSize) +{ + if (maxBlockSize < 0) return 0; + if (maxBlockSize > LZ4_MAX_INPUT_SIZE) return 0; + if (maxBlockSize < 16) maxBlockSize = 16; + return LZ4_DECODER_RING_BUFFER_SIZE(maxBlockSize); +} + +/* +*_continue() : + These decoding functions allow decompression of multiple blocks in "streaming" mode. + Previously decoded blocks must still be available at the memory position where they were decoded. + If it's not possible, save the relevant part of decoded data into a safe buffer, + and indicate where it stands using LZ4_setStreamDecode() +*/ +LZ4_FORCE_O2 +int LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* source, char* dest, int compressedSize, int maxOutputSize) +{ + LZ4_streamDecode_t_internal* lz4sd = &LZ4_streamDecode->internal_donotuse; + int result; + + if (lz4sd->prefixSize == 0) { + /* The first call, no dictionary yet. */ + assert(lz4sd->extDictSize == 0); + result = LZ4_decompress_safe(source, dest, compressedSize, maxOutputSize); + if (result <= 0) return result; + lz4sd->prefixSize = (size_t)result; + lz4sd->prefixEnd = (BYTE*)dest + result; + } else if (lz4sd->prefixEnd == (BYTE*)dest) { + /* They're rolling the current segment. */ + if (lz4sd->prefixSize >= 64 KB - 1) + result = LZ4_decompress_safe_withPrefix64k(source, dest, compressedSize, maxOutputSize); + else if (lz4sd->extDictSize == 0) + result = LZ4_decompress_safe_withSmallPrefix(source, dest, compressedSize, maxOutputSize, + lz4sd->prefixSize); + else + result = LZ4_decompress_safe_doubleDict(source, dest, compressedSize, maxOutputSize, + lz4sd->prefixSize, lz4sd->externalDict, lz4sd->extDictSize); + if (result <= 0) return result; + lz4sd->prefixSize += (size_t)result; + lz4sd->prefixEnd += result; + } else { + /* The buffer wraps around, or they're switching to another buffer. */ + lz4sd->extDictSize = lz4sd->prefixSize; + lz4sd->externalDict = lz4sd->prefixEnd - lz4sd->extDictSize; + result = LZ4_decompress_safe_forceExtDict(source, dest, compressedSize, maxOutputSize, + lz4sd->externalDict, lz4sd->extDictSize); + if (result <= 0) return result; + lz4sd->prefixSize = (size_t)result; + lz4sd->prefixEnd = (BYTE*)dest + result; + } + + return result; +} + +LZ4_FORCE_O2 int +LZ4_decompress_fast_continue (LZ4_streamDecode_t* LZ4_streamDecode, + const char* source, char* dest, int originalSize) +{ + LZ4_streamDecode_t_internal* const lz4sd = + (assert(LZ4_streamDecode!=NULL), &LZ4_streamDecode->internal_donotuse); + int result; + + DEBUGLOG(5, "LZ4_decompress_fast_continue (toDecodeSize=%i)", originalSize); + assert(originalSize >= 0); + + if (lz4sd->prefixSize == 0) { + DEBUGLOG(5, "first invocation : no prefix nor extDict"); + assert(lz4sd->extDictSize == 0); + result = LZ4_decompress_fast(source, dest, originalSize); + if (result <= 0) return result; + lz4sd->prefixSize = (size_t)originalSize; + lz4sd->prefixEnd = (BYTE*)dest + originalSize; + } else if (lz4sd->prefixEnd == (BYTE*)dest) { + DEBUGLOG(5, "continue using existing prefix"); + result = LZ4_decompress_unsafe_generic( + (const BYTE*)source, (BYTE*)dest, originalSize, + lz4sd->prefixSize, + lz4sd->externalDict, lz4sd->extDictSize); + if (result <= 0) return result; + lz4sd->prefixSize += (size_t)originalSize; + lz4sd->prefixEnd += originalSize; + } else { + DEBUGLOG(5, "prefix becomes extDict"); + lz4sd->extDictSize = lz4sd->prefixSize; + lz4sd->externalDict = lz4sd->prefixEnd - lz4sd->extDictSize; + result = LZ4_decompress_fast_extDict(source, dest, originalSize, + lz4sd->externalDict, lz4sd->extDictSize); + if (result <= 0) return result; + lz4sd->prefixSize = (size_t)originalSize; + lz4sd->prefixEnd = (BYTE*)dest + originalSize; + } + + return result; +} + + +/* +Advanced decoding functions : +*_usingDict() : + These decoding functions work the same as "_continue" ones, + the dictionary must be explicitly provided within parameters +*/ + +int LZ4_decompress_safe_usingDict(const char* source, char* dest, int compressedSize, int maxOutputSize, const char* dictStart, int dictSize) +{ + if (dictSize==0) + return LZ4_decompress_safe(source, dest, compressedSize, maxOutputSize); + if (dictStart+dictSize == dest) { + if (dictSize >= 64 KB - 1) { + return LZ4_decompress_safe_withPrefix64k(source, dest, compressedSize, maxOutputSize); + } + assert(dictSize >= 0); + return LZ4_decompress_safe_withSmallPrefix(source, dest, compressedSize, maxOutputSize, (size_t)dictSize); + } + assert(dictSize >= 0); + return LZ4_decompress_safe_forceExtDict(source, dest, compressedSize, maxOutputSize, dictStart, (size_t)dictSize); +} + +int LZ4_decompress_safe_partial_usingDict(const char* source, char* dest, int compressedSize, int targetOutputSize, int dstCapacity, const char* dictStart, int dictSize) +{ + if (dictSize==0) + return LZ4_decompress_safe_partial(source, dest, compressedSize, targetOutputSize, dstCapacity); + if (dictStart+dictSize == dest) { + if (dictSize >= 64 KB - 1) { + return LZ4_decompress_safe_partial_withPrefix64k(source, dest, compressedSize, targetOutputSize, dstCapacity); + } + assert(dictSize >= 0); + return LZ4_decompress_safe_partial_withSmallPrefix(source, dest, compressedSize, targetOutputSize, dstCapacity, (size_t)dictSize); + } + assert(dictSize >= 0); + return LZ4_decompress_safe_partial_forceExtDict(source, dest, compressedSize, targetOutputSize, dstCapacity, dictStart, (size_t)dictSize); +} + +int LZ4_decompress_fast_usingDict(const char* source, char* dest, int originalSize, const char* dictStart, int dictSize) +{ + if (dictSize==0 || dictStart+dictSize == dest) + return LZ4_decompress_unsafe_generic( + (const BYTE*)source, (BYTE*)dest, originalSize, + (size_t)dictSize, NULL, 0); + assert(dictSize >= 0); + return LZ4_decompress_fast_extDict(source, dest, originalSize, dictStart, (size_t)dictSize); +} + + +/*=************************************************* +* Obsolete Functions +***************************************************/ +/* obsolete compression functions */ +int LZ4_compress_limitedOutput(const char* source, char* dest, int inputSize, int maxOutputSize) +{ + return LZ4_compress_default(source, dest, inputSize, maxOutputSize); +} +int LZ4_compress(const char* src, char* dest, int srcSize) +{ + return LZ4_compress_default(src, dest, srcSize, LZ4_compressBound(srcSize)); +} +int LZ4_compress_limitedOutput_withState (void* state, const char* src, char* dst, int srcSize, int dstSize) +{ + return LZ4_compress_fast_extState(state, src, dst, srcSize, dstSize, 1); +} +int LZ4_compress_withState (void* state, const char* src, char* dst, int srcSize) +{ + return LZ4_compress_fast_extState(state, src, dst, srcSize, LZ4_compressBound(srcSize), 1); +} +int LZ4_compress_limitedOutput_continue (LZ4_stream_t* LZ4_stream, const char* src, char* dst, int srcSize, int dstCapacity) +{ + return LZ4_compress_fast_continue(LZ4_stream, src, dst, srcSize, dstCapacity, 1); +} +int LZ4_compress_continue (LZ4_stream_t* LZ4_stream, const char* source, char* dest, int inputSize) +{ + return LZ4_compress_fast_continue(LZ4_stream, source, dest, inputSize, LZ4_compressBound(inputSize), 1); +} + +/* +These decompression functions are deprecated and should no longer be used. +They are only provided here for compatibility with older user programs. +- LZ4_uncompress is totally equivalent to LZ4_decompress_fast +- LZ4_uncompress_unknownOutputSize is totally equivalent to LZ4_decompress_safe +*/ +int LZ4_uncompress (const char* source, char* dest, int outputSize) +{ + return LZ4_decompress_fast(source, dest, outputSize); +} +int LZ4_uncompress_unknownOutputSize (const char* source, char* dest, int isize, int maxOutputSize) +{ + return LZ4_decompress_safe(source, dest, isize, maxOutputSize); +} + +/* Obsolete Streaming functions */ + +int LZ4_sizeofStreamState(void) { return sizeof(LZ4_stream_t); } + +int LZ4_resetStreamState(void* state, char* inputBuffer) +{ + (void)inputBuffer; + LZ4_resetStream((LZ4_stream_t*)state); + return 0; +} + +#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) +void* LZ4_create (char* inputBuffer) +{ + (void)inputBuffer; + return LZ4_createStream(); +} +#endif + +char* LZ4_slideInputBuffer (void* state) +{ + /* avoid const char * -> char * conversion warning */ + return (char *)(uptrval)((LZ4_stream_t*)state)->internal_donotuse.dictionary; +} + +#endif /* LZ4_COMMONDEFS_ONLY */ diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/lz4.h b/Optitrack Rokoko Glove/RokokoGloveDevice/lz4.h new file mode 100644 index 000000000..491c6087c --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/lz4.h @@ -0,0 +1,842 @@ +/* + * LZ4 - Fast LZ compression algorithm + * Header File + * Copyright (C) 2011-2020, Yann Collet. + + BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + You can contact the author at : + - LZ4 homepage : http://www.lz4.org + - LZ4 source repository : https://github.com/lz4/lz4 +*/ +#if defined (__cplusplus) +extern "C" { +#endif + +#ifndef LZ4_H_2983827168210 +#define LZ4_H_2983827168210 + +/* --- Dependency --- */ +#include /* size_t */ + + +/** + Introduction + + LZ4 is lossless compression algorithm, providing compression speed >500 MB/s per core, + scalable with multi-cores CPU. It features an extremely fast decoder, with speed in + multiple GB/s per core, typically reaching RAM speed limits on multi-core systems. + + The LZ4 compression library provides in-memory compression and decompression functions. + It gives full buffer control to user. + Compression can be done in: + - a single step (described as Simple Functions) + - a single step, reusing a context (described in Advanced Functions) + - unbounded multiple steps (described as Streaming compression) + + lz4.h generates and decodes LZ4-compressed blocks (doc/lz4_Block_format.md). + Decompressing such a compressed block requires additional metadata. + Exact metadata depends on exact decompression function. + For the typical case of LZ4_decompress_safe(), + metadata includes block's compressed size, and maximum bound of decompressed size. + Each application is free to encode and pass such metadata in whichever way it wants. + + lz4.h only handle blocks, it can not generate Frames. + + Blocks are different from Frames (doc/lz4_Frame_format.md). + Frames bundle both blocks and metadata in a specified manner. + Embedding metadata is required for compressed data to be self-contained and portable. + Frame format is delivered through a companion API, declared in lz4frame.h. + The `lz4` CLI can only manage frames. +*/ + +/*^*************************************************************** +* Export parameters +*****************************************************************/ +/* +* LZ4_DLL_EXPORT : +* Enable exporting of functions when building a Windows DLL +* LZ4LIB_VISIBILITY : +* Control library symbols visibility. +*/ +#ifndef LZ4LIB_VISIBILITY +# if defined(__GNUC__) && (__GNUC__ >= 4) +# define LZ4LIB_VISIBILITY __attribute__ ((visibility ("default"))) +# else +# define LZ4LIB_VISIBILITY +# endif +#endif +#if defined(LZ4_DLL_EXPORT) && (LZ4_DLL_EXPORT==1) +# define LZ4LIB_API __declspec(dllexport) LZ4LIB_VISIBILITY +#elif defined(LZ4_DLL_IMPORT) && (LZ4_DLL_IMPORT==1) +# define LZ4LIB_API __declspec(dllimport) LZ4LIB_VISIBILITY /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/ +#else +# define LZ4LIB_API LZ4LIB_VISIBILITY +#endif + +/*! LZ4_FREESTANDING : + * When this macro is set to 1, it enables "freestanding mode" that is + * suitable for typical freestanding environment which doesn't support + * standard C library. + * + * - LZ4_FREESTANDING is a compile-time switch. + * - It requires the following macros to be defined: + * LZ4_memcpy, LZ4_memmove, LZ4_memset. + * - It only enables LZ4/HC functions which don't use heap. + * All LZ4F_* functions are not supported. + * - See tests/freestanding.c to check its basic setup. + */ +#if defined(LZ4_FREESTANDING) && (LZ4_FREESTANDING == 1) +# define LZ4_HEAPMODE 0 +# define LZ4HC_HEAPMODE 0 +# define LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION 1 +# if !defined(LZ4_memcpy) +# error "LZ4_FREESTANDING requires macro 'LZ4_memcpy'." +# endif +# if !defined(LZ4_memset) +# error "LZ4_FREESTANDING requires macro 'LZ4_memset'." +# endif +# if !defined(LZ4_memmove) +# error "LZ4_FREESTANDING requires macro 'LZ4_memmove'." +# endif +#elif ! defined(LZ4_FREESTANDING) +# define LZ4_FREESTANDING 0 +#endif + + +/*------ Version ------*/ +#define LZ4_VERSION_MAJOR 1 /* for breaking interface changes */ +#define LZ4_VERSION_MINOR 9 /* for new (non-breaking) interface capabilities */ +#define LZ4_VERSION_RELEASE 4 /* for tweaks, bug-fixes, or development */ + +#define LZ4_VERSION_NUMBER (LZ4_VERSION_MAJOR *100*100 + LZ4_VERSION_MINOR *100 + LZ4_VERSION_RELEASE) + +#define LZ4_LIB_VERSION LZ4_VERSION_MAJOR.LZ4_VERSION_MINOR.LZ4_VERSION_RELEASE +#define LZ4_QUOTE(str) #str +#define LZ4_EXPAND_AND_QUOTE(str) LZ4_QUOTE(str) +#define LZ4_VERSION_STRING LZ4_EXPAND_AND_QUOTE(LZ4_LIB_VERSION) /* requires v1.7.3+ */ + +LZ4LIB_API int LZ4_versionNumber (void); /**< library version number; useful to check dll version; requires v1.3.0+ */ +LZ4LIB_API const char* LZ4_versionString (void); /**< library version string; useful to check dll version; requires v1.7.5+ */ + + +/*-************************************ +* Tuning parameter +**************************************/ +#define LZ4_MEMORY_USAGE_MIN 10 +#define LZ4_MEMORY_USAGE_DEFAULT 14 +#define LZ4_MEMORY_USAGE_MAX 20 + +/*! + * LZ4_MEMORY_USAGE : + * Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; ) + * Increasing memory usage improves compression ratio, at the cost of speed. + * Reduced memory usage may improve speed at the cost of ratio, thanks to better cache locality. + * Default value is 14, for 16KB, which nicely fits into Intel x86 L1 cache + */ +#ifndef LZ4_MEMORY_USAGE +# define LZ4_MEMORY_USAGE LZ4_MEMORY_USAGE_DEFAULT +#endif + +#if (LZ4_MEMORY_USAGE < LZ4_MEMORY_USAGE_MIN) +# error "LZ4_MEMORY_USAGE is too small !" +#endif + +#if (LZ4_MEMORY_USAGE > LZ4_MEMORY_USAGE_MAX) +# error "LZ4_MEMORY_USAGE is too large !" +#endif + +/*-************************************ +* Simple Functions +**************************************/ +/*! LZ4_compress_default() : + * Compresses 'srcSize' bytes from buffer 'src' + * into already allocated 'dst' buffer of size 'dstCapacity'. + * Compression is guaranteed to succeed if 'dstCapacity' >= LZ4_compressBound(srcSize). + * It also runs faster, so it's a recommended setting. + * If the function cannot compress 'src' into a more limited 'dst' budget, + * compression stops *immediately*, and the function result is zero. + * In which case, 'dst' content is undefined (invalid). + * srcSize : max supported value is LZ4_MAX_INPUT_SIZE. + * dstCapacity : size of buffer 'dst' (which must be already allocated) + * @return : the number of bytes written into buffer 'dst' (necessarily <= dstCapacity) + * or 0 if compression fails + * Note : This function is protected against buffer overflow scenarios (never writes outside 'dst' buffer, nor read outside 'source' buffer). + */ +LZ4LIB_API int LZ4_compress_default(const char* src, char* dst, int srcSize, int dstCapacity); + +/*! LZ4_decompress_safe() : + * compressedSize : is the exact complete size of the compressed block. + * dstCapacity : is the size of destination buffer (which must be already allocated), presumed an upper bound of decompressed size. + * @return : the number of bytes decompressed into destination buffer (necessarily <= dstCapacity) + * If destination buffer is not large enough, decoding will stop and output an error code (negative value). + * If the source stream is detected malformed, the function will stop decoding and return a negative result. + * Note 1 : This function is protected against malicious data packets : + * it will never writes outside 'dst' buffer, nor read outside 'source' buffer, + * even if the compressed block is maliciously modified to order the decoder to do these actions. + * In such case, the decoder stops immediately, and considers the compressed block malformed. + * Note 2 : compressedSize and dstCapacity must be provided to the function, the compressed block does not contain them. + * The implementation is free to send / store / derive this information in whichever way is most beneficial. + * If there is a need for a different format which bundles together both compressed data and its metadata, consider looking at lz4frame.h instead. + */ +LZ4LIB_API int LZ4_decompress_safe (const char* src, char* dst, int compressedSize, int dstCapacity); + + +/*-************************************ +* Advanced Functions +**************************************/ +#define LZ4_MAX_INPUT_SIZE 0x7E000000 /* 2 113 929 216 bytes */ +#define LZ4_COMPRESSBOUND(isize) ((unsigned)(isize) > (unsigned)LZ4_MAX_INPUT_SIZE ? 0 : (isize) + ((isize)/255) + 16) + +/*! LZ4_compressBound() : + Provides the maximum size that LZ4 compression may output in a "worst case" scenario (input data not compressible) + This function is primarily useful for memory allocation purposes (destination buffer size). + Macro LZ4_COMPRESSBOUND() is also provided for compilation-time evaluation (stack memory allocation for example). + Note that LZ4_compress_default() compresses faster when dstCapacity is >= LZ4_compressBound(srcSize) + inputSize : max supported value is LZ4_MAX_INPUT_SIZE + return : maximum output size in a "worst case" scenario + or 0, if input size is incorrect (too large or negative) +*/ +LZ4LIB_API int LZ4_compressBound(int inputSize); + +/*! LZ4_compress_fast() : + Same as LZ4_compress_default(), but allows selection of "acceleration" factor. + The larger the acceleration value, the faster the algorithm, but also the lesser the compression. + It's a trade-off. It can be fine tuned, with each successive value providing roughly +~3% to speed. + An acceleration value of "1" is the same as regular LZ4_compress_default() + Values <= 0 will be replaced by LZ4_ACCELERATION_DEFAULT (currently == 1, see lz4.c). + Values > LZ4_ACCELERATION_MAX will be replaced by LZ4_ACCELERATION_MAX (currently == 65537, see lz4.c). +*/ +LZ4LIB_API int LZ4_compress_fast (const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); + + +/*! LZ4_compress_fast_extState() : + * Same as LZ4_compress_fast(), using an externally allocated memory space for its state. + * Use LZ4_sizeofState() to know how much memory must be allocated, + * and allocate it on 8-bytes boundaries (using `malloc()` typically). + * Then, provide this buffer as `void* state` to compression function. + */ +LZ4LIB_API int LZ4_sizeofState(void); +LZ4LIB_API int LZ4_compress_fast_extState (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); + + +/*! LZ4_compress_destSize() : + * Reverse the logic : compresses as much data as possible from 'src' buffer + * into already allocated buffer 'dst', of size >= 'targetDestSize'. + * This function either compresses the entire 'src' content into 'dst' if it's large enough, + * or fill 'dst' buffer completely with as much data as possible from 'src'. + * note: acceleration parameter is fixed to "default". + * + * *srcSizePtr : will be modified to indicate how many bytes where read from 'src' to fill 'dst'. + * New value is necessarily <= input value. + * @return : Nb bytes written into 'dst' (necessarily <= targetDestSize) + * or 0 if compression fails. + * + * Note : from v1.8.2 to v1.9.1, this function had a bug (fixed un v1.9.2+): + * the produced compressed content could, in specific circumstances, + * require to be decompressed into a destination buffer larger + * by at least 1 byte than the content to decompress. + * If an application uses `LZ4_compress_destSize()`, + * it's highly recommended to update liblz4 to v1.9.2 or better. + * If this can't be done or ensured, + * the receiving decompression function should provide + * a dstCapacity which is > decompressedSize, by at least 1 byte. + * See https://github.com/lz4/lz4/issues/859 for details + */ +LZ4LIB_API int LZ4_compress_destSize (const char* src, char* dst, int* srcSizePtr, int targetDstSize); + + +/*! LZ4_decompress_safe_partial() : + * Decompress an LZ4 compressed block, of size 'srcSize' at position 'src', + * into destination buffer 'dst' of size 'dstCapacity'. + * Up to 'targetOutputSize' bytes will be decoded. + * The function stops decoding on reaching this objective. + * This can be useful to boost performance + * whenever only the beginning of a block is required. + * + * @return : the number of bytes decoded in `dst` (necessarily <= targetOutputSize) + * If source stream is detected malformed, function returns a negative result. + * + * Note 1 : @return can be < targetOutputSize, if compressed block contains less data. + * + * Note 2 : targetOutputSize must be <= dstCapacity + * + * Note 3 : this function effectively stops decoding on reaching targetOutputSize, + * so dstCapacity is kind of redundant. + * This is because in older versions of this function, + * decoding operation would still write complete sequences. + * Therefore, there was no guarantee that it would stop writing at exactly targetOutputSize, + * it could write more bytes, though only up to dstCapacity. + * Some "margin" used to be required for this operation to work properly. + * Thankfully, this is no longer necessary. + * The function nonetheless keeps the same signature, in an effort to preserve API compatibility. + * + * Note 4 : If srcSize is the exact size of the block, + * then targetOutputSize can be any value, + * including larger than the block's decompressed size. + * The function will, at most, generate block's decompressed size. + * + * Note 5 : If srcSize is _larger_ than block's compressed size, + * then targetOutputSize **MUST** be <= block's decompressed size. + * Otherwise, *silent corruption will occur*. + */ +LZ4LIB_API int LZ4_decompress_safe_partial (const char* src, char* dst, int srcSize, int targetOutputSize, int dstCapacity); + + +/*-********************************************* +* Streaming Compression Functions +***********************************************/ +typedef union LZ4_stream_u LZ4_stream_t; /* incomplete type (defined later) */ + +/** + Note about RC_INVOKED + + - RC_INVOKED is predefined symbol of rc.exe (the resource compiler which is part of MSVC/Visual Studio). + https://docs.microsoft.com/en-us/windows/win32/menurc/predefined-macros + + - Since rc.exe is a legacy compiler, it truncates long symbol (> 30 chars) + and reports warning "RC4011: identifier truncated". + + - To eliminate the warning, we surround long preprocessor symbol with + "#if !defined(RC_INVOKED) ... #endif" block that means + "skip this block when rc.exe is trying to read it". +*/ +#if !defined(RC_INVOKED) /* https://docs.microsoft.com/en-us/windows/win32/menurc/predefined-macros */ +#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) +LZ4LIB_API LZ4_stream_t* LZ4_createStream(void); +LZ4LIB_API int LZ4_freeStream (LZ4_stream_t* streamPtr); +#endif /* !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) */ +#endif + +/*! LZ4_resetStream_fast() : v1.9.0+ + * Use this to prepare an LZ4_stream_t for a new chain of dependent blocks + * (e.g., LZ4_compress_fast_continue()). + * + * An LZ4_stream_t must be initialized once before usage. + * This is automatically done when created by LZ4_createStream(). + * However, should the LZ4_stream_t be simply declared on stack (for example), + * it's necessary to initialize it first, using LZ4_initStream(). + * + * After init, start any new stream with LZ4_resetStream_fast(). + * A same LZ4_stream_t can be re-used multiple times consecutively + * and compress multiple streams, + * provided that it starts each new stream with LZ4_resetStream_fast(). + * + * LZ4_resetStream_fast() is much faster than LZ4_initStream(), + * but is not compatible with memory regions containing garbage data. + * + * Note: it's only useful to call LZ4_resetStream_fast() + * in the context of streaming compression. + * The *extState* functions perform their own resets. + * Invoking LZ4_resetStream_fast() before is redundant, and even counterproductive. + */ +LZ4LIB_API void LZ4_resetStream_fast (LZ4_stream_t* streamPtr); + +/*! LZ4_loadDict() : + * Use this function to reference a static dictionary into LZ4_stream_t. + * The dictionary must remain available during compression. + * LZ4_loadDict() triggers a reset, so any previous data will be forgotten. + * The same dictionary will have to be loaded on decompression side for successful decoding. + * Dictionary are useful for better compression of small data (KB range). + * While LZ4 accept any input as dictionary, + * results are generally better when using Zstandard's Dictionary Builder. + * Loading a size of 0 is allowed, and is the same as reset. + * @return : loaded dictionary size, in bytes (necessarily <= 64 KB) + */ +LZ4LIB_API int LZ4_loadDict (LZ4_stream_t* streamPtr, const char* dictionary, int dictSize); + +/*! LZ4_compress_fast_continue() : + * Compress 'src' content using data from previously compressed blocks, for better compression ratio. + * 'dst' buffer must be already allocated. + * If dstCapacity >= LZ4_compressBound(srcSize), compression is guaranteed to succeed, and runs faster. + * + * @return : size of compressed block + * or 0 if there is an error (typically, cannot fit into 'dst'). + * + * Note 1 : Each invocation to LZ4_compress_fast_continue() generates a new block. + * Each block has precise boundaries. + * Each block must be decompressed separately, calling LZ4_decompress_*() with relevant metadata. + * It's not possible to append blocks together and expect a single invocation of LZ4_decompress_*() to decompress them together. + * + * Note 2 : The previous 64KB of source data is __assumed__ to remain present, unmodified, at same address in memory ! + * + * Note 3 : When input is structured as a double-buffer, each buffer can have any size, including < 64 KB. + * Make sure that buffers are separated, by at least one byte. + * This construction ensures that each block only depends on previous block. + * + * Note 4 : If input buffer is a ring-buffer, it can have any size, including < 64 KB. + * + * Note 5 : After an error, the stream status is undefined (invalid), it can only be reset or freed. + */ +LZ4LIB_API int LZ4_compress_fast_continue (LZ4_stream_t* streamPtr, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); + +/*! LZ4_saveDict() : + * If last 64KB data cannot be guaranteed to remain available at its current memory location, + * save it into a safer place (char* safeBuffer). + * This is schematically equivalent to a memcpy() followed by LZ4_loadDict(), + * but is much faster, because LZ4_saveDict() doesn't need to rebuild tables. + * @return : saved dictionary size in bytes (necessarily <= maxDictSize), or 0 if error. + */ +LZ4LIB_API int LZ4_saveDict (LZ4_stream_t* streamPtr, char* safeBuffer, int maxDictSize); + + +/*-********************************************** +* Streaming Decompression Functions +* Bufferless synchronous API +************************************************/ +typedef union LZ4_streamDecode_u LZ4_streamDecode_t; /* tracking context */ + +/*! LZ4_createStreamDecode() and LZ4_freeStreamDecode() : + * creation / destruction of streaming decompression tracking context. + * A tracking context can be re-used multiple times. + */ +#if !defined(RC_INVOKED) /* https://docs.microsoft.com/en-us/windows/win32/menurc/predefined-macros */ +#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) +LZ4LIB_API LZ4_streamDecode_t* LZ4_createStreamDecode(void); +LZ4LIB_API int LZ4_freeStreamDecode (LZ4_streamDecode_t* LZ4_stream); +#endif /* !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) */ +#endif + +/*! LZ4_setStreamDecode() : + * An LZ4_streamDecode_t context can be allocated once and re-used multiple times. + * Use this function to start decompression of a new stream of blocks. + * A dictionary can optionally be set. Use NULL or size 0 for a reset order. + * Dictionary is presumed stable : it must remain accessible and unmodified during next decompression. + * @return : 1 if OK, 0 if error + */ +LZ4LIB_API int LZ4_setStreamDecode (LZ4_streamDecode_t* LZ4_streamDecode, const char* dictionary, int dictSize); + +/*! LZ4_decoderRingBufferSize() : v1.8.2+ + * Note : in a ring buffer scenario (optional), + * blocks are presumed decompressed next to each other + * up to the moment there is not enough remaining space for next block (remainingSize < maxBlockSize), + * at which stage it resumes from beginning of ring buffer. + * When setting such a ring buffer for streaming decompression, + * provides the minimum size of this ring buffer + * to be compatible with any source respecting maxBlockSize condition. + * @return : minimum ring buffer size, + * or 0 if there is an error (invalid maxBlockSize). + */ +LZ4LIB_API int LZ4_decoderRingBufferSize(int maxBlockSize); +#define LZ4_DECODER_RING_BUFFER_SIZE(maxBlockSize) (65536 + 14 + (maxBlockSize)) /* for static allocation; maxBlockSize presumed valid */ + +/*! LZ4_decompress_*_continue() : + * These decoding functions allow decompression of consecutive blocks in "streaming" mode. + * A block is an unsplittable entity, it must be presented entirely to a decompression function. + * Decompression functions only accepts one block at a time. + * The last 64KB of previously decoded data *must* remain available and unmodified at the memory position where they were decoded. + * If less than 64KB of data has been decoded, all the data must be present. + * + * Special : if decompression side sets a ring buffer, it must respect one of the following conditions : + * - Decompression buffer size is _at least_ LZ4_decoderRingBufferSize(maxBlockSize). + * maxBlockSize is the maximum size of any single block. It can have any value > 16 bytes. + * In which case, encoding and decoding buffers do not need to be synchronized. + * Actually, data can be produced by any source compliant with LZ4 format specification, and respecting maxBlockSize. + * - Synchronized mode : + * Decompression buffer size is _exactly_ the same as compression buffer size, + * and follows exactly same update rule (block boundaries at same positions), + * and decoding function is provided with exact decompressed size of each block (exception for last block of the stream), + * _then_ decoding & encoding ring buffer can have any size, including small ones ( < 64 KB). + * - Decompression buffer is larger than encoding buffer, by a minimum of maxBlockSize more bytes. + * In which case, encoding and decoding buffers do not need to be synchronized, + * and encoding ring buffer can have any size, including small ones ( < 64 KB). + * + * Whenever these conditions are not possible, + * save the last 64KB of decoded data into a safe buffer where it can't be modified during decompression, + * then indicate where this data is saved using LZ4_setStreamDecode(), before decompressing next block. +*/ +LZ4LIB_API int +LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode, + const char* src, char* dst, + int srcSize, int dstCapacity); + + +/*! LZ4_decompress_*_usingDict() : + * These decoding functions work the same as + * a combination of LZ4_setStreamDecode() followed by LZ4_decompress_*_continue() + * They are stand-alone, and don't need an LZ4_streamDecode_t structure. + * Dictionary is presumed stable : it must remain accessible and unmodified during decompression. + * Performance tip : Decompression speed can be substantially increased + * when dst == dictStart + dictSize. + */ +LZ4LIB_API int +LZ4_decompress_safe_usingDict(const char* src, char* dst, + int srcSize, int dstCapacity, + const char* dictStart, int dictSize); + +LZ4LIB_API int +LZ4_decompress_safe_partial_usingDict(const char* src, char* dst, + int compressedSize, + int targetOutputSize, int maxOutputSize, + const char* dictStart, int dictSize); + +#endif /* LZ4_H_2983827168210 */ + + +/*^************************************* + * !!!!!! STATIC LINKING ONLY !!!!!! + ***************************************/ + +/*-**************************************************************************** + * Experimental section + * + * Symbols declared in this section must be considered unstable. Their + * signatures or semantics may change, or they may be removed altogether in the + * future. They are therefore only safe to depend on when the caller is + * statically linked against the library. + * + * To protect against unsafe usage, not only are the declarations guarded, + * the definitions are hidden by default + * when building LZ4 as a shared/dynamic library. + * + * In order to access these declarations, + * define LZ4_STATIC_LINKING_ONLY in your application + * before including LZ4's headers. + * + * In order to make their implementations accessible dynamically, you must + * define LZ4_PUBLISH_STATIC_FUNCTIONS when building the LZ4 library. + ******************************************************************************/ + +#ifdef LZ4_STATIC_LINKING_ONLY + +#ifndef LZ4_STATIC_3504398509 +#define LZ4_STATIC_3504398509 + +#ifdef LZ4_PUBLISH_STATIC_FUNCTIONS +#define LZ4LIB_STATIC_API LZ4LIB_API +#else +#define LZ4LIB_STATIC_API +#endif + + +/*! LZ4_compress_fast_extState_fastReset() : + * A variant of LZ4_compress_fast_extState(). + * + * Using this variant avoids an expensive initialization step. + * It is only safe to call if the state buffer is known to be correctly initialized already + * (see above comment on LZ4_resetStream_fast() for a definition of "correctly initialized"). + * From a high level, the difference is that + * this function initializes the provided state with a call to something like LZ4_resetStream_fast() + * while LZ4_compress_fast_extState() starts with a call to LZ4_resetStream(). + */ +LZ4LIB_STATIC_API int LZ4_compress_fast_extState_fastReset (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); + +/*! LZ4_attach_dictionary() : + * This is an experimental API that allows + * efficient use of a static dictionary many times. + * + * Rather than re-loading the dictionary buffer into a working context before + * each compression, or copying a pre-loaded dictionary's LZ4_stream_t into a + * working LZ4_stream_t, this function introduces a no-copy setup mechanism, + * in which the working stream references the dictionary stream in-place. + * + * Several assumptions are made about the state of the dictionary stream. + * Currently, only streams which have been prepared by LZ4_loadDict() should + * be expected to work. + * + * Alternatively, the provided dictionaryStream may be NULL, + * in which case any existing dictionary stream is unset. + * + * If a dictionary is provided, it replaces any pre-existing stream history. + * The dictionary contents are the only history that can be referenced and + * logically immediately precede the data compressed in the first subsequent + * compression call. + * + * The dictionary will only remain attached to the working stream through the + * first compression call, at the end of which it is cleared. The dictionary + * stream (and source buffer) must remain in-place / accessible / unchanged + * through the completion of the first compression call on the stream. + */ +LZ4LIB_STATIC_API void +LZ4_attach_dictionary(LZ4_stream_t* workingStream, + const LZ4_stream_t* dictionaryStream); + + +/*! In-place compression and decompression + * + * It's possible to have input and output sharing the same buffer, + * for highly constrained memory environments. + * In both cases, it requires input to lay at the end of the buffer, + * and decompression to start at beginning of the buffer. + * Buffer size must feature some margin, hence be larger than final size. + * + * |<------------------------buffer--------------------------------->| + * |<-----------compressed data--------->| + * |<-----------decompressed size------------------>| + * |<----margin---->| + * + * This technique is more useful for decompression, + * since decompressed size is typically larger, + * and margin is short. + * + * In-place decompression will work inside any buffer + * which size is >= LZ4_DECOMPRESS_INPLACE_BUFFER_SIZE(decompressedSize). + * This presumes that decompressedSize > compressedSize. + * Otherwise, it means compression actually expanded data, + * and it would be more efficient to store such data with a flag indicating it's not compressed. + * This can happen when data is not compressible (already compressed, or encrypted). + * + * For in-place compression, margin is larger, as it must be able to cope with both + * history preservation, requiring input data to remain unmodified up to LZ4_DISTANCE_MAX, + * and data expansion, which can happen when input is not compressible. + * As a consequence, buffer size requirements are much higher, + * and memory savings offered by in-place compression are more limited. + * + * There are ways to limit this cost for compression : + * - Reduce history size, by modifying LZ4_DISTANCE_MAX. + * Note that it is a compile-time constant, so all compressions will apply this limit. + * Lower values will reduce compression ratio, except when input_size < LZ4_DISTANCE_MAX, + * so it's a reasonable trick when inputs are known to be small. + * - Require the compressor to deliver a "maximum compressed size". + * This is the `dstCapacity` parameter in `LZ4_compress*()`. + * When this size is < LZ4_COMPRESSBOUND(inputSize), then compression can fail, + * in which case, the return code will be 0 (zero). + * The caller must be ready for these cases to happen, + * and typically design a backup scheme to send data uncompressed. + * The combination of both techniques can significantly reduce + * the amount of margin required for in-place compression. + * + * In-place compression can work in any buffer + * which size is >= (maxCompressedSize) + * with maxCompressedSize == LZ4_COMPRESSBOUND(srcSize) for guaranteed compression success. + * LZ4_COMPRESS_INPLACE_BUFFER_SIZE() depends on both maxCompressedSize and LZ4_DISTANCE_MAX, + * so it's possible to reduce memory requirements by playing with them. + */ + +#define LZ4_DECOMPRESS_INPLACE_MARGIN(compressedSize) (((compressedSize) >> 8) + 32) +#define LZ4_DECOMPRESS_INPLACE_BUFFER_SIZE(decompressedSize) ((decompressedSize) + LZ4_DECOMPRESS_INPLACE_MARGIN(decompressedSize)) /**< note: presumes that compressedSize < decompressedSize. note2: margin is overestimated a bit, since it could use compressedSize instead */ + +#ifndef LZ4_DISTANCE_MAX /* history window size; can be user-defined at compile time */ +# define LZ4_DISTANCE_MAX 65535 /* set to maximum value by default */ +#endif + +#define LZ4_COMPRESS_INPLACE_MARGIN (LZ4_DISTANCE_MAX + 32) /* LZ4_DISTANCE_MAX can be safely replaced by srcSize when it's smaller */ +#define LZ4_COMPRESS_INPLACE_BUFFER_SIZE(maxCompressedSize) ((maxCompressedSize) + LZ4_COMPRESS_INPLACE_MARGIN) /**< maxCompressedSize is generally LZ4_COMPRESSBOUND(inputSize), but can be set to any lower value, with the risk that compression can fail (return code 0(zero)) */ + +#endif /* LZ4_STATIC_3504398509 */ +#endif /* LZ4_STATIC_LINKING_ONLY */ + + + +#ifndef LZ4_H_98237428734687 +#define LZ4_H_98237428734687 + +/*-************************************************************ + * Private Definitions + ************************************************************** + * Do not use these definitions directly. + * They are only exposed to allow static allocation of `LZ4_stream_t` and `LZ4_streamDecode_t`. + * Accessing members will expose user code to API and/or ABI break in future versions of the library. + **************************************************************/ +#define LZ4_HASHLOG (LZ4_MEMORY_USAGE-2) +#define LZ4_HASHTABLESIZE (1 << LZ4_MEMORY_USAGE) +#define LZ4_HASH_SIZE_U32 (1 << LZ4_HASHLOG) /* required as macro for static allocation */ + +#if defined(__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) +# include + typedef int8_t LZ4_i8; + typedef uint8_t LZ4_byte; + typedef uint16_t LZ4_u16; + typedef uint32_t LZ4_u32; +#else + typedef signed char LZ4_i8; + typedef unsigned char LZ4_byte; + typedef unsigned short LZ4_u16; + typedef unsigned int LZ4_u32; +#endif + +/*! LZ4_stream_t : + * Never ever use below internal definitions directly ! + * These definitions are not API/ABI safe, and may change in future versions. + * If you need static allocation, declare or allocate an LZ4_stream_t object. +**/ + +typedef struct LZ4_stream_t_internal LZ4_stream_t_internal; +struct LZ4_stream_t_internal { + LZ4_u32 hashTable[LZ4_HASH_SIZE_U32]; + const LZ4_byte* dictionary; + const LZ4_stream_t_internal* dictCtx; + LZ4_u32 currentOffset; + LZ4_u32 tableType; + LZ4_u32 dictSize; + /* Implicit padding to ensure structure is aligned */ +}; + +#define LZ4_STREAM_MINSIZE ((1UL << LZ4_MEMORY_USAGE) + 32) /* static size, for inter-version compatibility */ +union LZ4_stream_u { + char minStateSize[LZ4_STREAM_MINSIZE]; + LZ4_stream_t_internal internal_donotuse; +}; /* previously typedef'd to LZ4_stream_t */ + + +/*! LZ4_initStream() : v1.9.0+ + * An LZ4_stream_t structure must be initialized at least once. + * This is automatically done when invoking LZ4_createStream(), + * but it's not when the structure is simply declared on stack (for example). + * + * Use LZ4_initStream() to properly initialize a newly declared LZ4_stream_t. + * It can also initialize any arbitrary buffer of sufficient size, + * and will @return a pointer of proper type upon initialization. + * + * Note : initialization fails if size and alignment conditions are not respected. + * In which case, the function will @return NULL. + * Note2: An LZ4_stream_t structure guarantees correct alignment and size. + * Note3: Before v1.9.0, use LZ4_resetStream() instead +**/ +LZ4LIB_API LZ4_stream_t* LZ4_initStream (void* buffer, size_t size); + + +/*! LZ4_streamDecode_t : + * Never ever use below internal definitions directly ! + * These definitions are not API/ABI safe, and may change in future versions. + * If you need static allocation, declare or allocate an LZ4_streamDecode_t object. +**/ +typedef struct { + const LZ4_byte* externalDict; + const LZ4_byte* prefixEnd; + size_t extDictSize; + size_t prefixSize; +} LZ4_streamDecode_t_internal; + +#define LZ4_STREAMDECODE_MINSIZE 32 +union LZ4_streamDecode_u { + char minStateSize[LZ4_STREAMDECODE_MINSIZE]; + LZ4_streamDecode_t_internal internal_donotuse; +} ; /* previously typedef'd to LZ4_streamDecode_t */ + + + +/*-************************************ +* Obsolete Functions +**************************************/ + +/*! Deprecation warnings + * + * Deprecated functions make the compiler generate a warning when invoked. + * This is meant to invite users to update their source code. + * Should deprecation warnings be a problem, it is generally possible to disable them, + * typically with -Wno-deprecated-declarations for gcc + * or _CRT_SECURE_NO_WARNINGS in Visual. + * + * Another method is to define LZ4_DISABLE_DEPRECATE_WARNINGS + * before including the header file. + */ +#ifdef LZ4_DISABLE_DEPRECATE_WARNINGS +# define LZ4_DEPRECATED(message) /* disable deprecation warnings */ +#else +# if defined (__cplusplus) && (__cplusplus >= 201402) /* C++14 or greater */ +# define LZ4_DEPRECATED(message) [[deprecated(message)]] +# elif defined(_MSC_VER) +# define LZ4_DEPRECATED(message) __declspec(deprecated(message)) +# elif defined(__clang__) || (defined(__GNUC__) && (__GNUC__ * 10 + __GNUC_MINOR__ >= 45)) +# define LZ4_DEPRECATED(message) __attribute__((deprecated(message))) +# elif defined(__GNUC__) && (__GNUC__ * 10 + __GNUC_MINOR__ >= 31) +# define LZ4_DEPRECATED(message) __attribute__((deprecated)) +# else +# pragma message("WARNING: LZ4_DEPRECATED needs custom implementation for this compiler") +# define LZ4_DEPRECATED(message) /* disabled */ +# endif +#endif /* LZ4_DISABLE_DEPRECATE_WARNINGS */ + +/*! Obsolete compression functions (since v1.7.3) */ +LZ4_DEPRECATED("use LZ4_compress_default() instead") LZ4LIB_API int LZ4_compress (const char* src, char* dest, int srcSize); +LZ4_DEPRECATED("use LZ4_compress_default() instead") LZ4LIB_API int LZ4_compress_limitedOutput (const char* src, char* dest, int srcSize, int maxOutputSize); +LZ4_DEPRECATED("use LZ4_compress_fast_extState() instead") LZ4LIB_API int LZ4_compress_withState (void* state, const char* source, char* dest, int inputSize); +LZ4_DEPRECATED("use LZ4_compress_fast_extState() instead") LZ4LIB_API int LZ4_compress_limitedOutput_withState (void* state, const char* source, char* dest, int inputSize, int maxOutputSize); +LZ4_DEPRECATED("use LZ4_compress_fast_continue() instead") LZ4LIB_API int LZ4_compress_continue (LZ4_stream_t* LZ4_streamPtr, const char* source, char* dest, int inputSize); +LZ4_DEPRECATED("use LZ4_compress_fast_continue() instead") LZ4LIB_API int LZ4_compress_limitedOutput_continue (LZ4_stream_t* LZ4_streamPtr, const char* source, char* dest, int inputSize, int maxOutputSize); + +/*! Obsolete decompression functions (since v1.8.0) */ +LZ4_DEPRECATED("use LZ4_decompress_fast() instead") LZ4LIB_API int LZ4_uncompress (const char* source, char* dest, int outputSize); +LZ4_DEPRECATED("use LZ4_decompress_safe() instead") LZ4LIB_API int LZ4_uncompress_unknownOutputSize (const char* source, char* dest, int isize, int maxOutputSize); + +/* Obsolete streaming functions (since v1.7.0) + * degraded functionality; do not use! + * + * In order to perform streaming compression, these functions depended on data + * that is no longer tracked in the state. They have been preserved as well as + * possible: using them will still produce a correct output. However, they don't + * actually retain any history between compression calls. The compression ratio + * achieved will therefore be no better than compressing each chunk + * independently. + */ +LZ4_DEPRECATED("Use LZ4_createStream() instead") LZ4LIB_API void* LZ4_create (char* inputBuffer); +LZ4_DEPRECATED("Use LZ4_createStream() instead") LZ4LIB_API int LZ4_sizeofStreamState(void); +LZ4_DEPRECATED("Use LZ4_resetStream() instead") LZ4LIB_API int LZ4_resetStreamState(void* state, char* inputBuffer); +LZ4_DEPRECATED("Use LZ4_saveDict() instead") LZ4LIB_API char* LZ4_slideInputBuffer (void* state); + +/*! Obsolete streaming decoding functions (since v1.7.0) */ +LZ4_DEPRECATED("use LZ4_decompress_safe_usingDict() instead") LZ4LIB_API int LZ4_decompress_safe_withPrefix64k (const char* src, char* dst, int compressedSize, int maxDstSize); +LZ4_DEPRECATED("use LZ4_decompress_fast_usingDict() instead") LZ4LIB_API int LZ4_decompress_fast_withPrefix64k (const char* src, char* dst, int originalSize); + +/*! Obsolete LZ4_decompress_fast variants (since v1.9.0) : + * These functions used to be faster than LZ4_decompress_safe(), + * but this is no longer the case. They are now slower. + * This is because LZ4_decompress_fast() doesn't know the input size, + * and therefore must progress more cautiously into the input buffer to not read beyond the end of block. + * On top of that `LZ4_decompress_fast()` is not protected vs malformed or malicious inputs, making it a security liability. + * As a consequence, LZ4_decompress_fast() is strongly discouraged, and deprecated. + * + * The last remaining LZ4_decompress_fast() specificity is that + * it can decompress a block without knowing its compressed size. + * Such functionality can be achieved in a more secure manner + * by employing LZ4_decompress_safe_partial(). + * + * Parameters: + * originalSize : is the uncompressed size to regenerate. + * `dst` must be already allocated, its size must be >= 'originalSize' bytes. + * @return : number of bytes read from source buffer (== compressed size). + * The function expects to finish at block's end exactly. + * If the source stream is detected malformed, the function stops decoding and returns a negative result. + * note : LZ4_decompress_fast*() requires originalSize. Thanks to this information, it never writes past the output buffer. + * However, since it doesn't know its 'src' size, it may read an unknown amount of input, past input buffer bounds. + * Also, since match offsets are not validated, match reads from 'src' may underflow too. + * These issues never happen if input (compressed) data is correct. + * But they may happen if input data is invalid (error or intentional tampering). + * As a consequence, use these functions in trusted environments with trusted data **only**. + */ +LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe() instead") +LZ4LIB_API int LZ4_decompress_fast (const char* src, char* dst, int originalSize); +LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe_continue() instead") +LZ4LIB_API int LZ4_decompress_fast_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* src, char* dst, int originalSize); +LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe_usingDict() instead") +LZ4LIB_API int LZ4_decompress_fast_usingDict (const char* src, char* dst, int originalSize, const char* dictStart, int dictSize); + +/*! LZ4_resetStream() : + * An LZ4_stream_t structure must be initialized at least once. + * This is done with LZ4_initStream(), or LZ4_resetStream(). + * Consider switching to LZ4_initStream(), + * invoking LZ4_resetStream() will trigger deprecation warnings in the future. + */ +LZ4LIB_API void LZ4_resetStream (LZ4_stream_t* streamPtr); + + +#endif /* LZ4_H_98237428734687 */ + + +#if defined (__cplusplus) +} +#endif diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/lz4.zip b/Optitrack Rokoko Glove/RokokoGloveDevice/lz4.zip new file mode 100644 index 000000000..6ed72c9ab --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/lz4.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37e63d56fb9cbe2e430c7f737a404cd4b98637b05e1467459d5c8fe1a4364cc3 +size 462886 diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/readme.txt b/Optitrack Rokoko Glove/RokokoGloveDevice/readme.txt new file mode 100644 index 000000000..5161b3d09 --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/readme.txt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:359874042b2232244d3f73037a76b79b1b57f52d0b5f5892ab23b40305f2a48c +size 1734 diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/ExampleGloveAdapterSingleton.obj b/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/ExampleGloveAdapterSingleton.obj new file mode 100644 index 000000000..eb625e2b7 --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/ExampleGloveAdapterSingleton.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2bcc5341ff6326f2e644dac6941ceae06ffe113f020d4979d420d1d13567565d +size 1900385 diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/ExampleGloveDevice.obj b/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/ExampleGloveDevice.obj new file mode 100644 index 000000000..a64bd2a63 --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/ExampleGloveDevice.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5e828db2ae2584af3aa2382a807e639350239607b54e3e1317f14f121dbe23ac +size 411123 diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/GloveDeviceBase.obj b/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/GloveDeviceBase.obj new file mode 100644 index 000000000..e758fcb3f --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/GloveDeviceBase.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba3436308df0b6cd5bd9da32aad30a949aee5ff01b804ead4f611c8afb07f7c0 +size 368143 diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/LZ4Wrapper.obj b/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/LZ4Wrapper.obj new file mode 100644 index 000000000..764b25268 --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/LZ4Wrapper.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f57f67431c5e5c23f44a3a5c9785f204269c47e10b20c8853287abf491eeb27 +size 169548 diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoDataConverter.obj b/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoDataConverter.obj new file mode 100644 index 000000000..22293387e --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoDataConverter.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ec59716322b316b1bca098666afe786abce44a88683bd8e49571e5385d72d16 +size 408468 diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoDataParser.obj b/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoDataParser.obj new file mode 100644 index 000000000..17d345955 --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoDataParser.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:156f16eafecd6b0b8bb5a9b47e3a58364ee96e47030faa04b96612c5b80c4c50 +size 379349 diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/CL.command.1.tlog b/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/CL.command.1.tlog new file mode 100644 index 0000000000000000000000000000000000000000..1b64c85ae02d08c4cdd4fb4cd6e044816dfb3f88 GIT binary patch literal 11178 zcmeI2-*3}E49ES9#DBm8>g&YNHUy||ZIYJKU!m>VQbkl~>!4C8RksQLH=g*%fR8W9 zmaxJ=LV^&h%H`^_efHV;Di`0^FR#Rtszh=uLkVO+8_5e=PZ~0!-ZG>y5?7_o3%*o>@mB? z+-WS;`R?revQ!;@4-JZma$0-PDrd;0)d$14w5n;9)qK6xDy#ovWi^X& zw_!oC5l+tz^pdx@xYlZWRNJH49<>~M)Ll6Db3`Z(+Qs{CMKe1K*W*;3orQ}}JN}Dr SY=7(2TYLtySf}3d&-FJ6&R~B4 literal 0 HcmV?d00001 diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/CL.read.1.tlog b/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/CL.read.1.tlog new file mode 100644 index 0000000000000000000000000000000000000000..030b673af293589ad96875e1c65e04b0ec2b8fa6 GIT binary patch literal 244130 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 Sd~W4`o7Hjd*v~e%ul)rn2I)lr literal 0 HcmV?d00001 diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/CopyFile.command.1.tlog b/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/CopyFile.command.1.tlog new file mode 100644 index 000000000..9be77f598 --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/CopyFile.command.1.tlog @@ -0,0 +1,2 @@ +^C:\USERS\QSCFT\ONEDRIVE\문서\OPTITRACK\MOTIVE\PERIPHERALAPI\EXAMPLE\ROKOKOGLOVEDEVICE\EXAMPLEGLOVEDATA.CSV +C:\Users\qscft\OneDrive\문서\OptiTrack\Motive\PeripheralAPI\example\x64\Debug\ExampleGloveData.csv diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/CopyFile.read.1.tlog b/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/CopyFile.read.1.tlog new file mode 100644 index 000000000..120ee5e56 --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/CopyFile.read.1.tlog @@ -0,0 +1 @@ +^C:\USERS\QSCFT\ONEDRIVE\문서\OPTITRACK\MOTIVE\PERIPHERALAPI\EXAMPLE\ROKOKOGLOVEDEVICE\EXAMPLEGLOVEDATA.CSV diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/CopyFile.write.1.tlog b/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/CopyFile.write.1.tlog new file mode 100644 index 000000000..849c02ff0 --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/CopyFile.write.1.tlog @@ -0,0 +1,2 @@ +^C:\USERS\QSCFT\ONEDRIVE\문서\OPTITRACK\MOTIVE\PERIPHERALAPI\EXAMPLE\ROKOKOGLOVEDEVICE\EXAMPLEGLOVEDATA.CSV +C:\USERS\QSCFT\ONEDRIVE\문서\OPTITRACK\MOTIVE\PERIPHERALAPI\EXAMPLE\X64\DEBUG\EXAMPLEGLOVEDATA.CSV diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/RokokoGloveDevice.lastbuildstate b/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/RokokoGloveDevice.lastbuildstate new file mode 100644 index 000000000..ca77c90af --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/RokokoGloveDevice.lastbuildstate @@ -0,0 +1,2 @@ +PlatformToolSet=v142:VCToolArchitecture=Native64Bit:VCToolsVersion=14.29.30133:TargetPlatformVersion=8.1:VcpkgTriplet=x64-windows: +Debug|x64|C:\Users\qscft\OneDrive\문서\OptiTrack\Motive\PeripheralAPI\example\| diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/RokokoGloveDevice.write.1u.tlog b/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/RokokoGloveDevice.write.1u.tlog new file mode 100644 index 0000000000000000000000000000000000000000..4698b933646a3d77284e503d641f8ca0549a2ad0 GIT binary patch literal 622 zcmdUsy$ZrW5QM*4@C|&1R3c(02E;-PqFoT;5%o;;;$O(SS@~k>#Ul%1b_G{`@|*eO7gK*# zJ>wiqhzBfY2-9?`s=NAMU0473{#<liS?&f?MuO_rIu|O_jdvqs^JK2TttOSa*wf~jxBPvPmOAvysNFskFZ-v`21t90EtXrv7+0;|#sXdyZZq%r?Ie4{FtQ`KjxoU6LqTfffe ze9YZ-$QvRse^sBa)6^66?a`I3Y~(ZFRvyVsc`28mzJT&x-a-8Uts|f0E%LAVZQx&; zM0M|R)Hxx8Y0W6@c>9rQ$rS@Y1do=$U48<{s*(5r literal 0 HcmV?d00001 diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/link.read.1.tlog b/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/link.read.1.tlog new file mode 100644 index 0000000000000000000000000000000000000000..693ff8ac6e87fc468ef4e5a9404e275778f54ab6 GIT binary patch literal 8270 zcmds+%Wl&^6ozMw#2c{45*9=xEvT?d95*$w6B9dWi7a>#-i#G527Lca2RoH3T2Pho zsIoJjThEzu|L51wFD5Y`Ok;MYGO5|}ZpaT`2OOD`b)+$ zo~@ZNd&NjWuln4)((acr@5;7jCTC{Jc*FM%?Sik|?zv^<>h@XEx3POH7~3;Hv2$+B zJ9Exj_0FMpY1=uo3--#ObIiKA`Dnfkny2HlX-{JY=Q_U{{v{`ItkIMnNhxmbySfku zr>$hWyv>oZEHMrqb92CEW8&r7`nwW4loiIoS=al@$J9KD^(pe?+gpzlFRvy1%A>|9 z(H(K4gum3rQ5T(C&3$g3og`Z3#IHFKye~`0Y-X^rnl~oGX=Y2Oc-av7ly?+nM4pn_ zC|J>cNnUY5p74sDuWf`}F!vhSj>s>Rtth{_z-}k}dK%o!J?qBijQ$<_Htgi`4XvJ< zuZ&C?KQ%QgtEI}x@<1r^nPV8|vqamoKu*T#RfUdk_{#&(9(nbG6UwolFyy7Ic8?{i zE(n97%GN8YE5e{hnv(`a%M1@$2SU*fS~7I#^qzSG6?0-~C|cvFNwBPbiYg*#LY&+4 zE{Tq+r@L*{mzB*0WedUpd`x_OC$=8ftNe#>KDGIPh8nw)3NZ}lL| zLboQm;SlxOUAHbHd+SlLn`ju>EKE8oDjHCTH#}2Xu9_>Dw`Qz1pXpNu*U)wqr?Q-a z^{#hfvDm434~1v!GT|+}!)I(B@$f5zwA7ExtwZJ~4sKKrE|9p;uN2unrt%3CvH97$epRo3=UEjvK-#nSSGXMYp literal 0 HcmV?d00001 diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/link.write.1.tlog b/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGl.513E58BC.tlog/link.write.1.tlog new file mode 100644 index 0000000000000000000000000000000000000000..47acec860411621d63c1580ee7ae17540ec97e84 GIT binary patch literal 2684 zcmds(OHKnZ42J)8C2qhOxYlRFEI_qpby?`N-TTN zcae8!uP_a=arU(w)6ojgDVE9GOU6l;HNtBdHO+`_sT&c#%IoO4IuAGZPP0i@%kka4 eol)mh%E0g9zmVSg$NYt&gd$9yB61sZr}zcvD4`Gl literal 0 HcmV?d00001 diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGloveDevice.dll.recipe b/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGloveDevice.dll.recipe new file mode 100644 index 000000000..339ec9848 --- /dev/null +++ b/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGloveDevice.dll.recipe @@ -0,0 +1,11 @@ + + + + + C:\Users\qscft\OneDrive\문서\OptiTrack\Motive\PeripheralAPI\example\x64\Debug\RokokoGloveDevice.dll + + + + + + \ No newline at end of file diff --git a/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGloveDevice.ilk b/Optitrack Rokoko Glove/RokokoGloveDevice/x64/Debug/RokokoGloveDevice.ilk new file mode 100644 index 0000000000000000000000000000000000000000..87b69ffa756e125e097bf9741af2e8c445e227be GIT binary patch literal 3417520 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
    Y>w=STib#y?Zwhj*XyO@7<_(Qnc7uQE1& zoGS3cdt~9q{BhMA7iFxUAb$?ypCj7g%4`GZ;hU?Cq~T;lJmfB12dd_8}6gnV$vET8`j%pW)0adO7_JD79Ic4>D&+UN01*ie;gt3!;809+P<70^T*X+3^MjFilDokPmKm zZ|%oCzS!oE-T6PIidS@S|Nr$~W8BHvaJ+BR_2Z*e39!U7dX`{4{@Dd%gLks!8A<`BjX+O5lfgpYlz9 z+xS0RqWSCD{BfDU5ATtMAM?ixZusFC&X4?n@dpAwyt{?+{$=BLH`C*X)-c__Vu2st z1Iky7ynZl$*=Xd#~pFcjkfWXWq2ilrr^*{P1V( zzlL2OJ79ZZ{gAx7Z2#r_2i&&Ww<`Cj-)5@l9{H~){Mm)-;=9)cet7prYyYZm=K1^W zGdby(pFHcnt)%=`%2(ghD&)gUNck#*Z}lV2c%T2j>E|QLR~O%XB;4kmx{d-byZ8PRdwADiaGh4hGgpFTgEwYKgb)bT6p%AVs-cn^u+^keORCeZxl z#kBv)5&U4kbq+}RxgYdDmt1||*$NT-F69ql{6hqOv};89edYI0)BJgiKVRTSySo4A zoqyBR}`3^!mWuw|ib6h|gt3=jr_1E(g31ozi%Ea^7OE=lAlspLmew&nG{s zf6f>Dpj`vv=h-T6*2#ZVsmJ4%79^hofPdsKel~62k%AwztHbJ(x9=)rCO@t6M;&xj z#`+}k_e=Qo^?~~d{Akyh`R9Ga3%T3vq4M9{;=%*eqse~=<*V`eAwoX9cn7BK%ll7^ z&&M2g>6udg5tOff=OcuCaEB~kkUyd$F^ONtf{Db^(9bNz9$&c#a#tVMn zJs^J5kF9_6&(`@>tbZsH{Gje*iy!oFpZz-da`h{LANlIFUjP0DwX1h<|NQvdX@2C} zt`9`JhAf}Auljzzb@Lnfsy@|bUcU$L&LREdcQ@%9KfL=azc2h|zKtK=BbKj!Q~6)` z3CH)1AKu-f)K6ddk?*tm_l5e0_ki-v`nS&SX6o_za5lg5g!+f~*uvjQ^Sk9mRY?iL zk5Bni8UIv)AKtw~wI7q;w*Q80n!lLM@5T%K@E%gWYE|wZ^SfVO+IN_G5B$ilVf-}$ zKfF7K$^55W`dPEe#fE(MNzGr${Fe*-@a|K-%HjM4BcAwEy|&dCA0#iE`3;P}LEwk? z$ii>+f0?fTIdjwFONGD>@9yDp{iFZ9^!qP2QNIWHL&|Sr{7nKsya$xu*ZPT1(EK4g zKR89;hxhou@NcpHb0OzP{zAsTP~eAmuUM`h+vleu`uhtL*!t=;fgj#O%2$lMesKTu zMHjtN%lVPt!T37_et36|koj%>k5{Sdzlp7n)d>9X?o+)$<7*MBJ+|F;YL@E+Uvss2yjVdBx;Kk_RWe}%vg@7^(T{n-46Cu{yrw*Pht{O}%9 zzF9vw{;sujyJVaK|H!Xq{M7dcAJO&Wvhh#W@Sf|#@a|K-$&c~p-P`P) z@%eG&*E0TEfgj!@3%||3|Apos$Ht$71b%pTJ-Pld{ycBeD#>-?@Q?hE@rMFGya$wT z)_+ib`&i`+8}efse@Zd^9hj*Xy z6(i?I{alo_!IqpK`JIfvQ{ad9$ii=%zl8OgKVbex3HS)aQ2dHf3uxpe$CR^W&C*uszgbHceF)N=pG&td#I z0zbTakFKQods3^#lH=J{o#E=SO}4<1Y~S;oUi*fBZ4sU&Uj` zuTp^@-hIlq@z447KN;7bAb$+wA0zO?d(=;UzgYWkdm*i#2?9U7yC=%^5C26k-ZPH- zN4|QkxAjAK4_LnX9@~cf%YQ=ezv}B$zHR*w-eZ=}>&N^#X1>S#dxC#>_fC@Q$2NZO z@6-NgHm3f4!9To*l&^R>|M~5&CgbL~khj-^xncr6b{xZ#9#_GR8;D>jg@=bo!|0aL7W%x&a3*&DQ_~AY3Cx1-! zU&-pfQQ(JncYN>lf9uXeZdJb<>IeCY8UJE|AKnAX?`!>g@96p;#p=IV;D`6v!jJkd z_lKUr`H>$p{#f9Lcki_R)la;-uAdptru%Os@WXpZ`DXp#_&e*C$CLBS-ToxZ~T!A0n zBMZN6{|&d+{6%d1+#&G8yL*OQ|M2hReRTz|ALNf@{38W^cn>JwtbZH7zmevj#KzAn z1%7ys{|o=Y{=awR{Ky~6_{R$T@a~n#^<(3AkI?+f*!Xkc4n5aT;60>#vwq-zyMm`P z_Fv?WWBlU;et37zl=*G-AMUC7t62RH5%}TVr+kxteEG^{>b230uRN(9vHv2!obi_n z{O}%G_-+3EZ8X2f>OWWDhj;g^-s^w*X*2KQ{K&6j{8a)!ya$xu*ZOxI&0optf4IO8 z@9}@(pHsU@X8%L^0pkw@et7rJmg~pnKc@PRS^c{LKfH&OuN?F759)u_2|Jy}{Ug7Q z@z)9b@a{~I`EB*@@1^}$v-%$+@WZ=L`6fU5|EG4||5475{6@y#DDcC3WZ}2n|1kbT)BR1_3zU7q?(O?$^?FR4=GK0_@ZP90R1QOS2F&U z0zbSv6J>sz|L`DPKa-gMNdiB-`;>3;qkguSKII_w9{7=;y=P~{~fgj!j%I|Cad(Y_c|1!3IJ5}I^_t?UZzaP3v z`J#;b10dgJ{I0+c@7}-U`mxo2xViSfj2*uMfgj#O$~Wr={r{Qg-Y|vxM}86GFB16S z-8oO@x7B|{f4_AAJAYa$@WZ=L`6fU7pZeGu$#n#%f8>`k{!)P--re(Mew%+kSNo5d z|9XKR-UG@v`Qd-X7i}5WKOnz`U0+=zTwm?eb>Z&6HGgi`58&58zmoOOa|AzVSN{UduQGZ6eC&CPr>fWf zdEE4^)T7CNW5Q4OUlsV#uHK|HU;Pf)aDDX|6Gt4TUNiG=r~K8s-n(7MhnJA$OV?Ky zZLx3-DgSQDSHJV!LO!@1=11jVvt3^e|25RU>iW+bAs^fU)sNYK+ODrge%^|7{@x_C zFX}#~e8tV%7uQ#BwQ!Y;&rcyg`8|8Nz8aq!aW6{SH~AjRKWN{W>OZ%HeSV?2=jRt9 z>UW|`<^8L9;h4?TkNV`4U6cE0BHzo_`&T{rSNm7J;2-VkU8wWT{p-P(4_cw}Z&+HY zJ|fj!pU5A``kz+8KlZE0PyKNJ`1>-Cud(G~DgQ01&o#T=d`sX*-Gs!iGNk=$(-+_S zx0L?@<*WVc10f$?9L6v0Uq^jko2;Xo{y(OCwex)}a(x=7uvUg?O$y|`(nR}S^e|&#r}2ces5+R-;tmEZoTYZ5%oJxb6P*i z_gMacA7_1C{~hEe&F4ktn*Djw)vwsU*~telJ-B#1V0hAYe@MDoBKKI?VpnS zl8j%l>_qh*_>n&#I~_j{n9_6njCOS{micYthj>+e{%GE7DSs^Rqg{Qe0*}&iIE5{O}%7eqZayc}Lez)~l)iY=Ix%V+%j(=ZIxbCF^kDM}8sW zFBJIU-MgfJ^%Jh9>!*d)PmaJ3?;+(Y$J{^a=i*&{$vFNZzl8CZ2>kHw(DBjqZ>xW| zUDr<&yZ$F%;D>jg@=gBtMt`4NH}LBZ&M5UB{3E}N@s|nw@a|qF`=4<0UdeG+Wvi__ ze}wj5(UjKDNP!>T1Ikw!-2aZ_Zy&5)8+?1+W9re&uVLep8ex3m(zq(TTJz_2W$-b? z$5S3l)+OKF?z@M0e*B~MU%~uT2!7D6vBgi`^WWB}Tx{S+{`hB7KZSxHw5wMs_YY4L zIn!0Pb8U?pf^_>qel_E-7WmPwA?2I(X*<4z4{JZUtbZ#K_|dM;h;XShO(onb-Yz;fRd!A@Z9Uf3v_3@3Dp7w!RVWqWgzw ztbZsM_~G5VQm&s-9|g(hizj8}RdfHyZ)5yz0zbTmlyBCL?fzr_&)R=HFZEv`@WZ=P zCG%I`TwJHP>syb@=--gv$@n`3et7pO-{iN|zq_6GzwC{ae~Q2l?~#Qc^*{8REzjfr zkw0*Kov+5X1F!8lK7@DoD!Kk`{Biz2vecZSaY4#IP2h+3fbtb1uYd5b^4l)8>b>s% zneuZOe~!Qp@3Dp7cK^M2f6ZV1QOaK<@WZ=D$1jtA>(5U}K36vH(B}&>_$j}D@fQgE z@a|mGKmYD+x_*YtPx29yHeR1g{9~_BudVgN^$qIL%s(;V*Y}q@QQ$|rx-6fs58(cOuazIQ zp_G3r%Rg1fhnIlzl^?#@*56|CU&iXQOvnefcdcBXw!a@8KcJ8Ai=RsCbDrQIbs18= zV(0$HJbBtm_1ep;&OKc{cKfIN3dUa{@WYF9oy>po+P_|;avzp7=MevACq^V z@>LG!pStwW!*YH?-cmqJ*0fa$m<99M}6<5os)S6{2;%X@izEg+BKkjmBHJ0S^WFH>b0TAmu9YS5Pv7*?-cmauCayR_W9gky!Mm#MA|<)0zcZ- zyGiaJUg%tHBgKEA>ttLXi~NBb==@~-*>wwE^Zq389#XzppVsl`FPcAO{__NWcz3F0 z{;W%Ll5yu9m4_tr0JLvR`8kX~N8pEdpYlz9+x*MDQjg!Vnp6J;0zbS*7XBA%zH3qb zPriAJjQI=l3y5EhuL=Zycz18se$4UJP3tX8&dYwfYjMWU*CpZRXeKT6<-ckdS2 zKkm;q`KmjT<9xS&%0D>a*W;^$1%7xBh+nyo##fVno$-!(&&)rZdVD&Rr@Q=E2Zk7FeH&pMfewWLK-hs<$ik2L%N1Wg^@#dC(7wp8VEh#VKfJrsw4Xln zPt*JZ+5D?i;D`5s@)aZR|8afb-me~$(f|9DU(NWd1%7ysE&M0GcEe@rXJUgN_gc+g z%Iar=zz^@T0g$P5AV)&nIH9Y z`?gv@TfYsa=;K#Weac@Y@WXp#;m7@l-yZY(TAUyG&5XZU z;D>kjcDep--}&F`@BL$$yU?*Zj2Mqd9IKYV+`i5b`DAis_Aw+a049$WZr{ZD+l zuAfn?er5>#@a_e@*UwGo?e!q{kNi%?-zo6Jdr0|a{n+?jx<69goV0#s3jFZy+|fJ# zBMatLaDLtN)lj|1$IWl)pjXhxf?BU;SEmw&GsvfM=59 z81`S}tM_{Qd@j7Zccy;S_t-Y%ha2nlL-lpNeLff71D4P0-~2gdeh%}WBlw5+nDR~k zw)%-D>iTbH_1`G?hj;I;)DP!J|GBK9@DKI7fFJn<#Gi~m1%7xBDc>A_4&49yWZhwK z#lH0!`M1;j<*BrOngxD%k7mgHxIXjeug~3G%0D>ar}3x25AP1km&TvxT;F=Rlz%wO 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

    &M-7 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 k$ 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