bump the senseglove unreal engine plugin to v2.9.0

This commit is contained in:
Mamadou Babaei
2026-07-13 22:01:24 +02:00
parent fbb1e8636c
commit 37b1a3c0ab
676 changed files with 3631 additions and 1274 deletions
+6
View File
@@ -50,3 +50,9 @@ Handbook/dist/**/* filter=lfs diff=lfs merge=lfs -text
# LFS: sgum-packager Linux and Windows binaries
Packager/sgum-packager filter=lfs diff=lfs merge=lfs -text
Packager/sgum-packager.exe filter=lfs diff=lfs merge=lfs -text
# LFS: sgfakeshm-connect-client abd sgfakeshm-core-client Linux and Windows binaries
Tuning/sgfakeshm-connect-client filter=lfs diff=lfs merge=lfs -text
Tuning/sgfakeshm-connect-client.exe filter=lfs diff=lfs merge=lfs -text
Tuning/sgfakeshm-core-client filter=lfs diff=lfs merge=lfs -text
Tuning/sgfakeshm-core-client.exe filter=lfs diff=lfs merge=lfs -text
+4 -4
View File
@@ -123,7 +123,7 @@ SG_PLUGIN_PLATFORM_SUPPORT_MATRIX_FILE := $(SG_PLUGIN_DIR)/PLATFORM_SUPPORT_M
# Rust/Cargo Settings
################################################################################
RUST_TOOLCHAIN_VERSION := 1.93.0
RUST_TOOLCHAIN_VERSION := 1.96.1
################################################################################
# Version and Build Information
@@ -373,8 +373,8 @@ install-build-deps:
@echo "Installing build dependencies if they have not already been installed..."
@rustup install $(RUST_TOOLCHAIN_VERSION)
@rustup override set $(RUST_TOOLCHAIN_VERSION)
@cargo install mdbook --version "0.5.2" --locked
@cargo install xq --vers "^0.4" --locked
@cargo install mdbook --version "0.5.4" --locked
@cargo install xq --vers "^0.5" --locked
@cargo install mdbook-pdf --vers "0.1.13" --locked
ifeq ($(SG_BUILD_PLATFORM),$(SG_BUILD_PLATFORM_LINUX))
@echo "Installing mdbook-pdf-outline..."
@@ -382,7 +382,7 @@ ifeq ($(SG_BUILD_PLATFORM),$(SG_BUILD_PLATFORM_LINUX))
&& . $(SG_LINUX_PYTHON_VENV_BIN_DIR)/activate \
&& pip install mdbook-pdf-outline 2>/dev/null
endif # ($(SG_BUILD_PLATFORM),$(SG_BUILD_PLATFORM_LINUX))
@cargo install --git https://github.com/Michael-F-Bryan/mdbook-epub --rev 21a1c8134134201a2d555313447c96e56e2a8996 --locked
@cargo install mdbook-epub --vers "0.5.4" --locked
################################################################################
# Make Targets - mdBook
+11 -1
View File
@@ -25,6 +25,7 @@ Welcom to the SenseGlove Unreal Engine Handbook!
- [Connect to Nova gloves using Blueman Bluetooth Manager](getting-started/sensecom/bluetooth-serial/gnu-linux/blueman-bluetooth-manager.md)
- [Connect to Nova gloves using Command-line](getting-started/sensecom/bluetooth-serial/gnu-linux/command-line.md)
- [SenseCom on Microsoft Windows](getting-started/sensecom/bluetooth-serial/microsoft-windows.md)
- [FakeShm Module Tuning](getting-started/sensecom/fakeshm-tuning/README.md)
- [Enabling XR_EXT_hand_tracking on VR Headsets](getting-started/enabling-xr-ext-hand-tracking-vr-headsets/README.md)
- [PCVR Mode](getting-started/enabling-xr-ext-hand-tracking-vr-headsets/pcvr-mode/README.md)
- [Standalone Mode](getting-started/enabling-xr-ext-hand-tracking-vr-headsets/standalone-mode/README.md)
@@ -102,11 +103,20 @@ Welcom to the SenseGlove Unreal Engine Handbook!
- [SenseGlove Unreal Engine Plugin License](license/senseglove-unreal-engine-plugin.md)
- [SenseGlove Unreal Engine Handbook License](license/senseglove-unreal-engine-handbook.md)
- [Third-Party Licenses](license/third-party.md)
- [Argh Frustration-free Command-line Processing Library License](license/argh-command-line-processing-library.md)
- [SenseGlove SDK License](license/senseglove-sdk.md)
- [SGBLE and SGBLExx Rust Dependencies Licenses](license/sgble-sgblexx-rust-dependencies.md)
- [Boost C++ Libraries License](license/boost-cpp-libraries.md)
- [c4core C++ Library Licence](license/c4core-library.md)
- [c4project CMake Scripts Licence](license/c4project-cmake-scripts.md)
- [Debug Break Library Licence](license/debugbreak-library.md)
- [fast_float Number Parsing Library](license/fast-float-number-parsing-library.md)
- [FlatBuffers Memory Efficient Serialization Library Licence](license/flatbuffers-serialization-library.md)
- [{fmt} Formatting Library License](license/fmt-formatting-library.md)
- [Loguru Logging Library License](license/loguru-loggin-library.md)
- [FTXUI Functional Terminal (X) User Interface Library](license/ftxui-functional-tui-library.md)
- [Loguru Logging Library License](license/loguru-logging-library.md)
- [nanomsg-next-generation Lightweight Brokerless Messaging Library License](license/nng-messaging-library.md)
- [Rapid YAML Parsing and Emitting Library](license/rapidyaml-parsing-emitting-library.md)
- [Serial Communication Library License](license/serial-communication-library.md)
-----------
@@ -5,6 +5,113 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [2.9.0] - 2026-07-13
This minor release introduces a major IPC overhaul, significant inter-process communication performance improvements and bug fixes, along with Unreal Engine `5.8` and Microsoft Visual Studio 2026 support. This release also introduces breaking Blueprint API changes.
### Added
- Added support for Unreal Engine `5.8`.
- Added support for Microsoft Visual Studio 2026 to allow building UE `5.7` and `5.8` projects with the latest Visual Studio version.
- Added support for MSVC Toolsets `v145: 14.50.35717` (UE `5.8`) and `v143: 14.44.35207` (UE `5.8` and `5.7`). Previously, the plugin shipped only `v143: 14.38.33130`, which has now been declared out of support by Microsoft. `14.38.33130` binaries are still shipped, as it remains Epic Games' preferred MSVC toolchain for building UE `5.5` and `5.6` on Microsoft Windows.
- Added support for the new SenseGlove inter-process communication module `SGFakeShm`, enabling communication with SenseCom via `IPC` (named pipes on Microsoft Windows and Unix Domain Sockets on GNU/Linux) and `TCP over loopback/localhost` mechanisms, in addition to the previously supported `Boost::SharedMem`. This release also reduces `Boost::SharedMem` latency and increases data throughput, which should help improve frame rate and overall performance. Please note that communication over SharedMem is still blocking (non-async) in nature, so in enterprise environments where security software typically restricts `SharedMem` access, or in cases of conflicts with other applications, we recommend using either `IPC` or `TCP`. These transports have been implemented from scratch using an asynchronous, non-blocking architecture, although the new SenseCom also supports optional blocking communication modes and additional configuration tweaks if desired. `IPC` and `TCP over loopback` are also typically less restricted than `SharedMem` in enterprise environments and generally provide significantly lower latency. This helps maintain smooth frame rates by decoupling rendering and data exchange with SenseCom. Furthermore, the new SenseGlove UE plugin and SenseCom remain backward compatible with older releases of SenseCom and the UE plugin without requiring any specific configuration. They can automatically detect and fall back to the legacy `SharedMem` transport.
- Added [nanomsg/nng](https://github.com/nanomsg/nng) third-party library binaries for Microsoft Windows and GNU/Linux. This is a requirement of the `SGFakeShm` module.
- Added [google/flatbuffers](https://github.com/google/flatbuffers) third-party library binaries for Microsoft Windows and GNU/Linux. This is a requirement of the `SGFakeShm` module.
- Added [biojppm/rapidyaml](https://github.com/biojppm/rapidyaml) third-party library binaries for Microsoft Windows and GNU/Linux. This is a requirement of the `SGFakeShm` module.
- Added `SGCore`'s `Library::IsInitialized()`, `Library::Initialize()`, and `Library::Terminate()` wrapper functions to SenseGlove UE C++ and Blueprint API that are required for the underlying `SGCore` and `SGFakeShm` initialization and termination and automatically initialize or terminate the library at the relevant module's startup or shutdown, eliminating the need for manual initialization or termination by plugin users.
- Added third-party module `SGFakeShmThirdPartyLibs`.
- Added third-party module `SGFlatBuffersThirdPartyLibs`.
- Added third-party module `SGNngThirdPartyLibs`.
- Added third-party module `SGRapidYamlThirdPartyLibs`.
- Added `SGBuildHacks/SGInclude_Core_DeviceTypes`.
- Added missing `ESGBackendType::AndroidStrings` enumerator.
- Added missing SenseGlove API Blueprint function `USGLibraryKismetLibrary::GetBackendType()`.
- Added the [Microsoft Windows and GNU/Linux binary distribution of **SenseGlove FakeShm Module Tuning Utilities**](https://dev.azure.com/SenseGlove/_git/SenseGlove-Unreal?path=/Tuning&version=GBmaster&_a=contents) to the SenseGlove Unreal Engine Plugin repository on Microsoft Azure repositories. These binaries are not part of the [official plugin release via the Fab Store](https://www.fab.com/listings/62bcdd2a-0bb1-4f34-b7b8-c5e7c9313099).
### Fixed
- This release ships a revamped version of the SenseGlove libraries with numerous bug fixes, multithreading improvements, SharedMem performance enhancements, BTSerial fixes, and many other improvements.
- Fix the wrong Blueprint `DisplayName` UPROPERTY specifier for `USGDeviceKismetLibrary::GetHapticChannelCount()`.
- Fix the wrong Blueprint `DisplayName` UPROPERTY specifier for `USGDeviceKismetLibrary::GetHapticChannelCount_CT()`.
- Fix the wrong Blueprint `DisplayName` UPROPERTY specifier for `USGHapticGloveKismetLibrary::EndCalibration()`.
- Fix the wrong Blueprint `DisplayName` UPROPERTY specifier for `USGHapticGloveKismetLibrary::GetCalibrationInstruction()`.
- Fix the wrong Blueprint `DisplayName` UPROPERTY specifier for `USGHapticGloveKismetLibrary::GetCalibrationState()`.
- Fix the wrong Blueprint `DisplayName` UPROPERTY specifier for `USGHapticGloveKismetLibrary::GetHandAngles()`.
- Fix the wrong Blueprint `DisplayName` UPROPERTY specifier for `USGHapticGloveKismetLibrary::ResetCalibration()`.
- Fix the wrong Blueprint `DisplayName` UPROPERTY specifier for `USGHapticGloveKismetLibrary::SetHandGeometry()`.
- Fix the wrong Blueprint `DisplayName` UPROPERTY specifier for `USGNova2GloveKismetLibrary::GetHandAngles()`.
- Fix the wrong Blueprint `DisplayName` UPROPERTY specifier for `USGNovaGloveKismetLibrary::GetHandAngles()`.
- Fix the wrong Blueprint `DisplayName` UPROPERTY specifier for `USGSenseGloveKismetLibrary::CalculateHandPose()`.
- Fix the wrong Blueprint `DisplayName` UPROPERTY specifier for `USGSenseGloveVarsKismetLibrary::GenerateGloveModel_HV_FV_SFV_bRH()`.
- Fix the wrong Blueprint `DisplayName` UPROPERTY specifier for `USGSenseGloveVarsKismetLibrary::GenerateGloveModel_HV_FV_SFV_bRH_CI()`.
- Fix the wrong Blueprint `DisplayName` UPROPERTY specifier for `USGTrackingKismetLibrary::GetNovaToWristRotationOffset_FQuat()`.
- Fix the wrong Blueprint `DisplayName` UPROPERTY specifier for `USGTrackingKismetLibrary::GetNovaToWristRotationOffset_FRotator()`.
- Fix the wrong Blueprint `DisplayName` UPROPERTY specifier for `USGTrackingKismetLibrary::GetRightNovaQuestProToAttachRotation_FQuat()`.
- Fix the wrong Blueprint `DisplayName` UPROPERTY specifier for `USGTrackingKismetLibrary::GetRightNovaViveFocus3ToAttachRotation_FRotator()`.
- Fix the wrong Blueprint `DisplayName` UPROPERTY specifier for `USGTrackingKismetLibrary::GetSenseGloveTrackerMountOffset_H_bRH_OutPO_FQuat_OutRO()`.
- Fix the wrong Blueprint `DisplayName` UPROPERTY specifier for `USGTrackingKismetLibrary::GetSenseGloveTrackerMountOffset_H_bRH_OutPO_FRotator_OutRO()`.
- Fix the wrong Blueprint `Category` UPROPERTY specifier for `USGNova2GloveKismetLibrary::SendHaptics()`.
- Fix the wrong Blueprint `Category` UPROPERTY specifier for `USGNovaGloveKismetLibrary::SendHaptics()`.
- Fix `USGHandInterpolatorKismetLibrary::InterpolateHandAngles()` Blueprint access by making it static and removing its erroneous `const` qualifier.
- Fix `SGCustomWaveformKismetLibrary::GetWaveType()` Blueprint access by making it static.
- Fix `SGDeviceKismetLibrary::FirmwareNewerThan_FM_FS_bI()` Blueprint access by making it static.
- Fix `SGInterpolationSetKismetLibrary::GetX1()` Blueprint access by making it static.
- Some code quality and build time optimizations by removing redundant headers and relying on more forward declarations where/when possible.
- Additional minor fixes and improvements that may not be listed here.
### Changed
- Bumped the SenseGlove libraries to `v2.400.1-302a8aa67`. This release introduces new Inter-Process Communication (IPC) capabilities and delivers significant improvements and bug fixes, particularly in multithreaded code. The new `FakeShm` back-end significantly improves the performance of the existing `SharedMem` transport while retaining compatibility with older releases of SenseCom. It also introduces two new transports (communication mechanisms), namely `IPC` and `TCP`, on both GNU/Linux and Microsoft Windows.
- The `ThirdParty/lib/windows` directory structure has been revamped to support multiple MSVC toolsets/toolchains and the distribution of binaries built for every MSVC configuration supported by Epic Games on supported engine/plugin versions.
- The following third-party binaries/libraries are no longer distributed or linked on Android: `SGBleThirdPartyLibs`, `SGConnectShmThirdPartyLibs`, `SGCoreShmThirdPartyLibs`, `SGSerialThirdPartyLibs`, and `SGWjwwoodSerialThirdPartyLibs`. This helps keep the plugin and generated Android APKs smaller while also reducing linking and build times.
- `SenseGloveConnectImpl` module exported C functions have been renamed from `SGConnect_Init()`, `SGConnect_Dispose()`, and `SGConnect_GetLibraryVersion()` to `SGConnectImpl_Init()`, `SGConnectImpl_Dispose()`, and `SGConnectImpl_GetLibraryVersion()` respectively, as the underlying `SGConnect` library exports functions with the exact same names. This change resolves link-time issues caused by duplicate symbols. This should not affect the existing SenseGlove Blueprint or C++ APIs, as these functions are used internally.
- Changed `USGBasicHandModelKismetLibrary::SetStartJointPosition_uint8_F_P()` from `BlueprintPure` to `BlueprintCallable`.
- Changed `USGThresholdCommandKismetLibrary::GetActiveFingers()` from `BlueprintCallable` to `BlueprintPure`.
- Renamed `USGHandLayerKismetLibrary::GetWristLocation_bRH_FQuat_RR_TH_OutWP_OutWR()` to `USGHandLayerKismetLibrary::GetWristLocation_bRH_RP_FQuat_RR_TH_OutWP_OutWR()` to adhere to the standard SenseGlove name mangling.
### Removed
- Removed SenseGlove library binaries built with Epic Native/Cross Toolchains `v22` from the distributed third-party binaries shipped with the plugin. Support for the `v22` toolchain, which was previously used to build UE `5.3` and `5.4` Linux dependencies, has been dropped since plugin release `v2.8.0`.
- Removed `btleplug` Android dependencies, as the SenseGlove libraries for Android no longer rely on `btleplug` for BLE communication.
- Removed invalid `WorldContext` Blueprint metadata from `USGThresholdCommandKismetLibrary::GetFingerActive()`.
- Removed invalid `WorldContext` Blueprint metadata from `USGThresholdCommandKismetLibrary::GetThreshold()`.
### Deprecated
- This is the last minor release to support Unreal Engine `5.5` and its support will be removed from the next minor or major releases.
### Documentation
- Added the [SenseCom > FakeShm Module Tuning](../getting-started/sensecom/fakeshm-tuning/) documentation section.
- List a new [OpenXR Hand Interactions System From Scratch (Pure Blueprint)](https://gitlab.com/senseglove-unreal-engine-public/senseglove-unreal-openxr-hand-from-scratch-bp-demo) demo and its companion [Video Documentation: Building OpenXR Hand Interactions from Scratch in Unreal Engine](https://www.youtube.com/watch?v=J18c99vl6dE) inside the [Extra Resources](../appendix/extra-resources.html#developer-spotlight-demos) section.
- Added [The c4core C++ Library Licence](../license/c4core-library.html) section.
- Added [The c4project CMake Scripts Licence](../license/c4project-cmake-scripts.html) section.
- Added [The Debug Break Library Licence](../license/debugbreak-library.html) section.
- Added [The fast_float Number Parsing Library Licence](../license/fast-float-number-parsing-library.html) section.
- Added [FlatBuffers Memory Efficient Serialization Library Licence](../license/flatbuffers-serialization-library.html) section.
- Added [nanomsg-next-generation Lightweight Brokerless Messaging Library License](../license/nng-messaging-library.html) section.
- Added [The Rapid YAML Parsing and Emitting Library Licence](../license/rapidyaml-parsing-emitting-library.html) section.
- Fixed a typo in the URL of the [Loguru Logging Library License](../license/loguru-logging-library.html) section.
- Updated the [SGBLE and SGBLExx Rust Dependencies License](../license/sgble-sgblexx-rust-dependencies.html) section.
- Updated the [Plugin Directory Structure](./directory-structure.html) section to reflect the recent changes.
- Updated the [Platform Support Matrix](./platform-support-matrix.html) section to reflect the recent changes.
- Additional minor fixes and improvements that may not be listed here.
- Fix `USGBetaDevice::Parse()` and `USGBetaDeviceKismetLibrary::Parse()` documentation.
- Fix swapped in-header documentation for `USGHapticGlove::ResetCalibration()` and `USGHapticGlove::EndCalibration()`.
- Fix incorrect class description in `USGSenseGloveSensorNormalizer` and `USGSenseGloveSensorNormalizerKismetLibrary`.
- Bumped [mdBook](https://rust-lang.github.io/mdBook/) crate to `v0.5.4`
- Bumped the [Michael-F-Bryan/mdbook-epub](https://github.com/Michael-F-Bryan/mdbook-epub) crate to `v0.5.4`.
- Bumped [HollowMan6/mdbook-pdf](https://github.com/HollowMan6/mdbook-pdf) to `v0.1.13`.
- Bumped Handbook's Rust toolchain to `v1.96.1`.
## [2.8.1] - 2026-05-11
This patch release brings minor non-breaking improvements for Blueprint and the Unreal Editor.
### Fixed
- Fix inconsistent Unreal Engine Blueprint `UFUNCTION` category paths in `Nova` and `Nova 2` Kismet libraries.
## [2.8.0] - 2026-02-24
This minor release introduces high-level haptics and hand-tracking components, simplifies OpenXR integration around `FXRHandTrackingState`, and removes legacy `FXRMotionControllerData` APIs. It also includes ABI-breaking changes, Unreal Engine deprecations, documentation expansions, and various internal improvements.
@@ -163,7 +270,7 @@ This minor release focuses on delivering performance improvements, made possible
### Documentation
- Added [{fmt} Formatting Library License](../license/fmt-formatting-library.html) section.
- Added [Loguru Logging Library License](../license/loguru-loggin-library.html) section.
- Added [Loguru Logging Library License](../license/loguru-logging-library.html) section.
- Updated [Setting up the Touch System](../getting-started/setup-touch-system/index.html) section to reflect the recent touch system changes.
- Added [a third-party tutorial to the Android Standalone Mode Deployment](../misc/android-standalone-deployment/third-party-tutorials/) section for UE `5.7` which provides a one-click Android development and build environment setup, instructions on how to setup and use the new UE `5.7` project launcher, and how to enabled OpenXR hand-tracking support on Meta Quest and HTC VIVE devices.
@@ -159,7 +159,23 @@
│ │
│ └── windows
│ │
│ ├── v143 (Microsoft Visual Studio 2022 dependencies)
│ ├── v143-1438 (Microsoft Visual Studio 2022 dependencies for UE 5.5 and 5.6)
│ │ │
│ │ └── x86-64 (dependencies targeting Microsoft Windows x86-64 architecture)
│ │ │
│ │ ├── debug
│ │ │
│ │ └── release
│ │
│ ├── v143-1444 (Microsoft Visual Studio 2022 dependencies for UE 5.7 and 5.8)
│ │ │
│ │ └── x86-64 (dependencies targeting Microsoft Windows x86-64 architecture)
│ │ │
│ │ ├── debug
│ │ │
│ │ └── release
│ │
│ ├── v145-1450 (Microsoft Visual Studio 2026 dependencies for UE 5.8)
│ │ │
│ │ └── x86-64 (dependencies targeting Microsoft Windows x86-64 architecture)
│ │ │
@@ -9,6 +9,12 @@ There are various resources available for older versions of the SenseGlove Unrea
- [Example C++ API Project (only compatible with early `v1.x.x` releases)](https://dev.azure.com/SenseGlove/_git/SenseGlove-Unreal-SGPlaygroundCpp)
- [Example Blueprint API Project (only compatible with early `v1.x.x` releases)](https://dev.azure.com/SenseGlove/_git/SenseGlove-Unreal-SGPlaygroundBP)
### Developer Spotlight Demos
- OpenXR Hand Interactions System From Scratch (Pure Blueprint)
- [Source Code Repository](https://gitlab.com/senseglove-unreal-engine-public/senseglove-unreal-openxr-hand-from-scratch-bp-demo)
- [Video Documentation: Building OpenXR Hand Interactions from Scratch in Unreal Engine](https://youtu.be/J18c99vl6dE)
### Third-Party OpenXR Integration Demos
- [A VRExpansionPlugin Integration Demo for UE `5.4`](https://dev.azure.com/SenseGlove/_git/SGVRETemplate)
@@ -1,6 +1,6 @@
## Planned Features Completion Status
### Implemented as of v2.8.x
### Implemented as of v2.9.x
- [X] SenseGlove Unreal Engine Handbook, a comprehensive guide to the SenseGlove Unreal Engine Plugin accessible online via [unreal.docs.senseglove.com](http://unreal.docs.senseglove.com/), and also in PDF and EPUB formats.
- [X] Full SenseGlove low-level core API access through Unreal C++.
@@ -45,7 +45,7 @@
- [X] A highly convenient OpenXR hand-tracking data provider component to easily feed SenseGlove data to your own custom or third-party hand-manipulation systems.
- [X] A highly convenient haptics component to easily add haptics to your own custom or third-party hand-manipulation systems.
### Upcoming features planned for the v2.9.x release
### Upcoming features planned for the v2.10.x release
### Planned features long-term
@@ -1,21 +1,22 @@
## Platform Support Matrix
| | **Windows (MSVC 2017)** | **Windows (MSVC 2019)** | **Windows (MSVC 2022)** | **Linux x86-64 (Native Toolchain)** | **Linux AArch64 (Native Toolchain)** | **Meta Quest Standalone (Android NDK)** | **HTC VIVE Standalone (Android NDK)** | **Fab** | **Azure DevOps Version** |
|:--------:|-------------------------|-------------------------|-------------------------|:-----------------------------------:|:------------------------------------:|:---------------------------------------:|:-------------------------------------:|:--------:|:------------------------:|
| **5.7** | ❌ | ❌ | ✅ v2.8.x | ✅ v2.8.x | ✅ v2.8.x | ✅ v2.8.x (r25b) | | ✅ v2.8.0 | ✅ v2.8.0 |
| **5.6** | ❌ | ❌ | ✅ v2.8.x | ✅ v2.8.x | ✅ v2.8.x | ✅ v2.8.x (r25b) | | ✅ v2.8.0 | ✅ v2.8.0 |
| **5.5** | ❌ | ❌ | ✅ v2.8.x | ✅ v2.8.x | ✅ v2.8.x | ✅ v2.8.x (r25b) | | ✅ v2.8.0 | ✅ v2.8.0 |
| **5.4** | ❌ | ❌ | ⚠️ v2.7.x | ⚠️ v2.7.x | ⚠️ v2.7.x | ⚠️ v2.7.x (r25b) | ⚠️ v2.7.x (r25b) | ⚠️ v2.7.3 | ⚠️ v2.7.3 |
| **5.3** | ❌ | ⚠️ v2.6.x | ⚠️ v2.6.x | ⚠️ v2.6.x | ⚠️ v2.6.x | ⚠️ v2.6.x (r25b) | ⚠️ v2.6.x (r25b) | ⚠️ v2.6.3 | ⚠️ v2.6.3 |
| **5.2** | ❌ | ⚠️ v2.4.x | ⚠️ v2.4.x | ⚠️ v2.4.x | ⚠️ v2.4.x | ⚠️ v2.4.x (r25b) | | ⚠️ v2.4.2 | ⚠️ v2.4.2 |
| **5.1** | ❌ | ⚠️ v2.0.x | ⚠️ v2.0.x | ⚠️ v2.0.x | ⚠️ v2.0.x | ⚠️ v2.0.x (r25b) | | ⚠️ v2.0.0 | ⚠️ v2.0.2 |
| **5.0** | ❌ | ⚠️ v1.6.x | ⚠️ v1.6.x | ⚠️ v1.6.x | ⚠️ v1.6.x | ⚠️ v1.6.x (r21e) | | ⚠️ v1.6.1 | ⚠️ v1.6.1 |
| **4.27** | ⚠️ v1.4.x | ⚠️ v1.4.x | ⚠️ v1.4.x | ⚠️ v1.4.x | ⚠️ v1.4.x | ⚠️ v1.4.x (r21e) | | ⚠️ v1.3.1 | ⚠️ v1.4.3 |
| **4.26** | ⚠️ v1.0.x | ⚠️ v1.0.x | | ⚠️ v1.0.x | | | | ❌ | ⚠️ v1.0.4 |
| **4.25** | ⚠️ v1.0.x | ⚠️ v1.0.x | ❌ | ⚠️ v1.0.x | ❌ | ❌ | | ❌ | ⚠️ v1.0.4 |
| **4.24** | ⚠️ v1.0.x | ⚠️ v1.0.x | ❌ | ⚠️ v1.0.x | ❌ | ❌ | | ❌ | ⚠️ v1.0.4 |
| **4.23** | ⚠️ v1.0.x | ⚠️ v1.0.x | ❌ | ⚠️ v1.0.x | ❌ | ❌ | | ❌ | ⚠️ v1.0.4 |
| **4.22** | ⚠️ v1.0.x | ⚠️ v1.0.x | ❌ | ⚠️ v1.0.x | ❌ | ❌ | | ❌ | ⚠️ v1.0.4 |
| | **Windows (MSVC 2017)** | **Windows (MSVC 2019)** | **Windows (MSVC 2022)** | **Windows (MSVC 2026)** | **Linux x86-64 (Native Toolchain)** | **Linux AArch64 (Native Toolchain)** | **Meta Quest Standalone (Android NDK)** | **HTC VIVE Standalone (Android NDK)** | **Fab** | **Azure DevOps Version** |
|:--------:|:-----------------------:|:-----------------------:|:-----------------------:|:-----------------------:|:-----------------------------------:|:------------------------------------:|:---------------------------------------:|---------------------------------------|----------|--------------------------|
| **5.8** | ❌ | ❌ | ✅ v2.9.x | ✅ v2.9.x | ✅ v2.9.x | ✅ v2.9.x | ✅ v2.9.x (r25b) | | ✅ v2.9.0 | ✅ v2.9.0 |
| **5.7** | ❌ | ❌ | ✅ v2.9.x | ✅ v2.9.x | ✅ v2.9.x | ✅ v2.9.x | ✅ v2.9.x (r25b) | | ✅ v2.9.0 | ✅ v2.9.0 |
| **5.6** | ❌ | ❌ | ✅ v2.9.x | ❌ | ✅ v2.9.x | ✅ v2.9.x | ✅ v2.9.x (r25b) | | ✅ v2.9.0 | ✅ v2.9.0 |
| **5.5** | ❌ | ❌ | ⚠️ v2.9.x | ❌ | ⚠️ v2.9.x | ⚠️ v2.9.x | ⚠️ v2.9.x (r25b) | | ⚠️ v2.9.0 | ⚠️ v2.9.0 |
| **5.4** | ❌ | ❌ | ⚠️ v2.7.x | | ⚠️ v2.7.x | ⚠️ v2.7.x | ⚠️ v2.7.x (r25b) | ⚠️ v2.7.x (r25b) | ⚠️ v2.7.3 | ⚠️ v2.7.3 |
| **5.3** | ❌ | ⚠️ v2.6.x | ⚠️ v2.6.x | ❌ | ⚠️ v2.6.x | ⚠️ v2.6.x | ⚠️ v2.6.x (r25b) | ⚠️ v2.6.x (r25b) | ⚠️ v2.6.3 | ⚠️ v2.6.3 |
| **5.2** | ❌ | ⚠️ v2.4.x | ⚠️ v2.4.x | ❌ | ⚠️ v2.4.x | ⚠️ v2.4.x | ⚠️ v2.4.x (r25b) | | ⚠️ v2.4.2 | ⚠️ v2.4.2 |
| **5.1** | ❌ | ⚠️ v2.0.x | ⚠️ v2.0.x | ❌ | ⚠️ v2.0.x | ⚠️ v2.0.x | ⚠️ v2.0.x (r25b) | | ⚠️ v2.0.0 | ⚠️ v2.0.2 |
| **5.0** | ❌ | ⚠️ v1.6.x | ⚠️ v1.6.x | | ⚠️ v1.6.x | ⚠️ v1.6.x | ⚠️ v1.6.x (r21e) | | ⚠️ v1.6.1 | ⚠️ v1.6.1 |
| **4.27** | ⚠️ v1.4.x | ⚠️ v1.4.x | ⚠️ v1.4.x | ❌ | ⚠️ v1.4.x | ⚠️ v1.4.x | ⚠️ v1.4.x (r21e) | | ⚠️ v1.3.1 | ⚠️ v1.4.3 |
| **4.26** | ⚠️ v1.0.x | ⚠️ v1.0.x | ❌ | ❌ | ⚠️ v1.0.x | ❌ | ❌ | ❌ | ❌ | ⚠️ v1.0.4 |
| **4.25** | ⚠️ v1.0.x | ⚠️ v1.0.x | ❌ | | ⚠️ v1.0.x | ❌ | ❌ | ❌ | ❌ | ⚠️ v1.0.4 |
| **4.24** | ⚠️ v1.0.x | ⚠️ v1.0.x | ❌ | | ⚠️ v1.0.x | ❌ | ❌ | ❌ | ❌ | ⚠️ v1.0.4 |
| **4.23** | ⚠️ v1.0.x | ⚠️ v1.0.x | ❌ | | ⚠️ v1.0.x | ❌ | ❌ | ❌ | ❌ | ⚠️ v1.0.4 |
| **4.22** | ⚠️ v1.0.x | ⚠️ v1.0.x | ❌ | | ⚠️ v1.0.x | ❌ | ❌ | ❌ | ❌ | ⚠️ v1.0.4 |
* <code>✅</code> Supported
* <code>⚠️</code> End-of-life (EOL) release that is not supported anymore and might be lacking features
@@ -0,0 +1,449 @@
# SenseGlove FakeShm Module Tuning
Starting with **SenseGlove Libraries `v2.400.0-023e6b23c`**, which is at the heart of **SenseCom v1.10.x** and the **SenseGlove Unreal Engine Plugin v2.9.x**, SenseGlove has introduced a completely new communication backend called **`SGFakeShm`**.
Despite its name, `SGFakeShm` is **not** another shared memory implementation. Instead, it is a modern communication layer that supports multiple transports to imitate the legacy `SharedMem` behavior using alternative transports and mechanisms on both Microsoft Windows and GNU/Linux, while retaining full compatibility with the existing Shared Memory implementation.
The new module was designed to significantly improve latency, throughput, and frame rate stability while maintaining backward and forward compatibility with previous or future releases of SenseCom or the UE plugin.
## Overview
Prior to this release, communication between SenseCom and applications such as Unreal Engine or Unity relied exclusively on **Boost Shared Memory**.
While the legacy Shared Memory provides good performance, it has several drawbacks:
- Communication is fundamentally blocking.
- Enterprise security software frequently interferes with Shared Memory.
- Multiple applications competing for Shared Memory can negatively impact performance.
- Due to its blocking/synchronous nature of the legacy `SharedMem` implementation, rendering and communication become more tightly coupled, potentially reducing frame rate where Boost `SharedMem` becomes the bottleneck.
The new `SGFakeShm` backend addresses these limitations by introducing two additional communication mechanisms/transports:
- **IPC**
- Named Pipes on Microsoft Windows.
- Unix Domain Sockets on GNU/Linux.
- **TCP over loopback (localhost)**
Unlike the legacy Shared Memory implementation, both `IPC` and `TCP` transports support a fully asynchronous, non-blocking architecture, unless explicitly forced to fall back to synchronous/blocking mode via the user-exposed configuration.
This allows communication to happen independently from rendering, reducing stalls and improving frame time consistency.
## Backward and Forward Compatibility
One of the design goals of `SGFakeShm` was **complete backward and forward compatibility**.
Even if your application is still using an **older Unreal Engine plugin**, simply upgrading **SenseCom** allows you to benefit from the improvements made to the Shared Memory transport. The opposite is also correct, you can pair old SenseCom with newer UE plugin that relies on `SGFakeShm` and both still should function as expected.
> [!NOTE]
> If a new version of SenseCom or the UE plugin paired with a version that lacks
> support for `SGFakeShm`, using the default settings, it will always
> automatically fall back to the legacy `SharedMem`. Thus, we recommend using
> the recent versions of both SenseCom and the UE plugin with support for
> `SGFakeShm` to be able to fully utilize the new capabilities and improvements
> including the new IPC and TCP transports. Otherwise, due to lack of support
> from one party in such setups where one side lacks `SGFakeShm` support, `IPC`
> or `TCP` won't function as expected.
Since the preferred transport is only chosen and configured **centrally via SenseCom** and also the exchanged configurations are versioned, Unreal and Unity plugins automatically detect and follow the selected transport and their enforced settings; as a result the setting only needs to be changed in one place and no configuration from the plugin side is required at all.
This ability allows the plugins or applications to remain forward compatible with SenseCom when future versions are released, thus enables SenseCom to deliver further tweaking and performance improvements in the future.
## Shared Memory Improvements
Although Shared Memory remains a blocking transport by design, it has received numerous internal optimizations. The new implementation provides:
- Reduced latency.
- Higher throughput.
- Various bug fixes.
In our benchmarking, we observed that the legacy `SharedMem` overhaul has dramatically improved its performance and stability, boosting throughput from only `a few KB/s` to roughly `7.5 GB/s` in certain configurations, compared to the previous implementation.
Applications that still prefer to use `SharedMem` over `IPC` (**Named Pipes** on Microsoft Windows and **Unix Domain Sockets** on GNU/Linux), will therefore still benefit from upgrading SenseCom and the UE plugin, even without adopting the newer `IPC` or `TCP` transports.
These improvements are specifically designed to eliminate bottlenecks and improve reliability in demanding enterprise environments where shared memory can be impacted by security software.
## Transport Configuration
Transport configuration is done in two parts:
- Choosing an IPC mechanism via SenseCom settings.
- Optionally, tweaking and tuning the desired transport for your hardware, operating system, and use case via `sgfakeshm-params.yml`.
### Choosing a Transport via SenseCom Settings
In order to choose an IPC transport/mechanism:
1. Open the click on the hamburger button inside the main SenseCom user interface.
2. From the open menu, choose `Settings`.
3. Navigate to the end of the settings section.
4. Click on the `IPC Method` combo box.
5. Choose your desired IPC method.
![SenseCom Settings - Choosing an IPC Transport/Mechanism](sensecom-sgfakeshm-choosing-ipc-transport.png "SenseCom Settings - Choosing an IPC Transport/Mechanism")
> [!TIP]
> You do not have to close or restart SenseCom, Unreal Editor, or your
> simulation to choose or change an an IPC method and its settings.
>
> Once a new IPC method is selected, both SenseCom and your simulation should
> be able to pick it up almost instantaneously.
### Parameter Tuning
Every `SGFakeShm` supported transport, `IPC`, `TCP`, and `SharedMem` exposes certain configurations and parameters that can further be tweaked to acheive optimal performance. While we provide sane defaults that should work well for most people out of the box, there is no single configuration that is optimal for every system, hardware, or use case. Every operating system schedules threads differently. Likewise, different communication mechanisms have different performance characteristics. For example:
- Microsoft Windows generally benefits from slightly larger timeout values.
- GNU/Linux often performs best with much lower timeout values.
- `IPC` and `TCP` transports behave differently under high load. For example, while both work best when the `SocketReceiveNonBlocking` parameter set to `true`, their behavior differ from each other depending on the value set for `SocketSendNonBlocking`. Our benchmarking with a `10K` payload size reveals, on our test hardware, IPC performs better when the value for this parameter is set to `false`, while TCP performs better when it's been set to `true`.
- Desktop applications and VR applications often have different latency requirements.
- Low-power embedded devices may prefer lower CPU usage over absolute minimum latency.
As a result, the default configuration shipped with SenseCom has been carefully selected to provide excellent performance for the vast majority of users. So, most users **do not really need to modify these values**.
However, advanced users who wish to squeeze every last bit of performance out of their particular hardware can optionally do so.
### Some Notes Regarding Latency and Throughput
In our benchmarks and on our test hardware, using the payload size of `1 MB`, `SharedMem` consistently acheived the follwoing stats:
- Read Throughput: roughly `7.5 GB/s`.
- Write Throughput: roughly `4.0 GB/s`.
- Smoothed Latency on Microsoft Windows: roughly `15 ms`.
- Smoothed Latency on GNU/Linux: roughly `5 ms`.
The same benchmark via the `TCP` transport and using fine-tuned settings consistently yielded:
- Read Throughput: roughly `2.1 GB/s`.
- Write Throughput: roughly `2.1 GB/s`.
- Smoothed Latency on Microsoft Windows: roughly `70 μs`.
- Smoothed Latency on GNU/Linux: roughly `40 μs`.
The same benchmark via the `IPC` transport and using fine-tuned settings consistently yielded:
- Read Throughput: roughly `2.2 GB/s`.
- Write Throughput: roughly `2.2 GB/s`.
- Smoothed Latency on Microsoft Windows: roughly `100 μs`.
- Smoothed Latency on GNU/Linux: roughly `50 μs`.
> [!IMPORTANT]
> While various payload sizes are supported, e.g., `1 KB`, `10 KB`, `100 KB`,
> `1 MB`, and `10 MB`, we recommend tuning your SenseCom installation by
> choosing the `10 KB` payload size.
>
> The reason for this recommendation is, typically the SenseCom payload size
> falls somewhere in between `1 KB` to `10 KB`. Thus, tuning using `10 KB`
> payload size will be as close as possible to real-world SenseCom usage in
> production.
> [!NOTE]
> Regardless of the payload size on Microsoft Windows, in our tests, Boost
> `SharedMem` latency mostly stayed above `15 ms`. Due to its blocking nature,
> this makes it less suitable for simulations that need to exceed `60 FPS`,
> especially when `SharedMem` is restricted or throttled by security software.
> Since the rendering thread will be blocked while waiting on `SharedMem`, if
> the latency rises above `1000 / 60 = 16.6666666667 ms`, the framerate will
> suffer and you may experience jitter or lag, regardless of how powerful your
> hardware is.
>
> Also, there have been some reports that when `SharedMem` is throttled, even if
> your simulation is not running, this could still cause jitter inside the Unreal
> Editor itself.
>
> In this case, we recommend switching to `IPC` or `TCP` due to their low
> latency. Despite their lower throughput compared to Boost `SharedMem`, the
> latency of these alternative transports is in the realm of microseconds,
> making them significantly faster than Boost `SharedMem`, whose latency is
> measured in milliseconds.
### Benchmarking and Tuning Utilities
To assist advanced users, SenseGlove provides two simple yet powerful benchmarking applications with versatile benchmarking capabilities:
- **sgfakeshm-connect-client**
- **sgfakeshm-core-client**
These utilities are distributed through the [**SenseGlove Unreal Engine Plugin Azure DevOps repository**](https://dev.azure.com/SenseGlove/_git/SenseGlove-Unreal) and are **not included in the [official Fab Store release](ttps://www.fab.com/listings/62bcdd2a-0bb1-4f34-b7b8-c5e7c9313099)**.
The utilities allow developers to:
- Benchmark latency.
- Benchmark throughput.
- Compare IPC, TCP and Shared Memory performance side by side.
- Experiment with different parameter values
- Optimize configurations for a specific operating system or hardware.
- Tune parameters for particular workloads.
Because communication performance depends on the operating system, CPU scheduler, hardware and transport type, these tools provide the easiest way to determine the optimal settings for your own environment.
#### sgfakeshm-connect-client
`sgfakeshm-connect-client` is the main benchmarking application, which acts like SenseCom. Between the two applications, the transport configuration happens on this app.
![SGFakeShm Benchmarking and Tuning Utilities - sgfakeshm-connect-client running on GNU/Linux](sgfakeshm-connect-client-gnu-linux.png "SGFakeShm Benchmarking and Tuning Utilities - sgfakeshm-connect-client running on GNU/Linux")
![SGFakeShm Benchmarking and Tuning Utilities - sgfakeshm-connect-client running on Microsoft Windows](sgfakeshm-connect-client-microsoft-windows.png "SGFakeShm Benchmarking and Tuning Utilities - sgfakeshm-connect-client running on Microsoft Windows")
`sgfakeshm-connect-client` supports the following keyboard shortcuts:
- `ESC`, `Q`, or `Ctrl+C` to exit the application.
- `1` to toggle and enable or disable the `TCP` transport.
- `2` to toggle and enable or disable the `IPC` transport.
- `3` to toggle and enable or disable the `SharedMem` transport.
- `S` to switch between various predefined payload sizes, e.g., `1 KB`, `10 KB`, `100 KB`, `1 MB`, and `10 MB`.
It also supports the following command-line parameters in order to change the tuning parameters via command-line:
```sh
$ ./sgfakeshm-connect-client --help
Usage:
sgfakeshm-connect-client [options]
Options:
--help or -h
--tcp <yes|no>
--ipc <yes|no>
--sharedmem <yes|no>
--socket-receive-nonblocking <yes|no>
--socket-receive-timeout-ms <int32>
--socket-send-nonblocking <yes|no>
--socket-send-timeout-ms <int32>
--socket-reconnect-time-min-ms <int32>
--socket-reconnect-time-max-ms <int32>
--worker-retry-interval-ms <uint64>
--heartbeat-interval-ms <uint64>
--liveness-timeout-ms <uint64>
--latency-smoothing-window-ms <uint64>
--throughput-smoothing-window-ms <uint64>
--shared-mem-heartbeat-block-size <uint32>
--shared-mem-liveness-timeout-ms <uint64>
```
It is however, much faster and easier to modify the configuration file instead of passing arguments to `sgfakeshm-connect-client` as [it supports hot reloading](#hot-reloading).
The following symbols indicate:
- ✅: the specific transport is enabled.
- ❌: the specific transport is disabled.
- 🟢: the specific transport is connected and `./sgfakeshm-core-client` is prensent on the other side.
- 🔴: the specific transport is disconnected and `./sgfakeshm-core-client` might not be prensent on the other side.
#### sgfakeshm-core-client
`sgfakeshm-core-client` is the companion benchmarking application, which acts like your Unreal Engine or Unity plugin, and consists of two tabs. The first one is the `Benchmark` tab to verify the benchmarking latency and throughput from the second peer app, and the second one is the `Tuning Info` tab to verify if the `sgfakeshm-connect-client`-enforced optimizations have indeed been applied.
![SGFakeShm Benchmarking and Tuning Utilities - sgfakeshm-core-client running on GNU/Linux - Benchmark Tab](sgfakeshm-core-client-benchmark-tab-gnu-linux.png "SGFakeShm Benchmarking and Tuning Utilities - sgfakeshm-core-client running on GNU/Linux - Benchmark Tab")
![SGFakeShm Benchmarking and Tuning Utilities - sgfakeshm-core-client running on GNU/Linux - Tuning Info Tab](sgfakeshm-core-client-tuning-info-tab-gnu-linux.png "SGFakeShm Benchmarking and Tuning Utilities - sgfakeshm-core-client running on GNU/Linux - Tuning Info Tab")
![SGFakeShm Benchmarking and Tuning Utilities - sgfakeshm-core-client running on Microsoft Windows](sgfakeshm-core-client-microsoft-windows.png "SGFakeShm Benchmarking and Tuning Utilities - sgfakeshm-core-client running on Microsoft Windows")
`sgfakeshm-core-client` supports the following keyboard shortcuts:
- `ESC`, `Q`, or `Ctrl+C` to exit the application.
- `S` to toggle between various predefined payload sizes, e.g., `1 KB`, `10 KB`, `100 KB`, `1 MB`, and `10 MB`.
- `B` to switch to the `Benchmark` tab.
- `T` to switch to the `Tuning Info` tab.
The following symbols indicate:
- ✅: the specific transport is enabled.
- ❌: the specific transport is disabled.
- 🟢: the specific transport is connected and `./sgfakeshm-connect-client` is prensent on the other side.
- 🔴: the specific transport is disconnected and `./sgfakeshm-connect-client` might not be prensent on the other side.
### Important Benchmarking Limitation
The benchmarking utilities use the **NNG `Pair0` protocol** for `IPC` and `TCP` transports.
`Pair0` is intentionally designed as a **one-to-one communication protocol**, meaning that only one peer (one listener and one dialer) may exist and run at any given time.
Because of this limitation:
- **Never run multiple instances of `sgfakeshm-connect-client` simultaneously.**
Likewise:
- **Never run multiple instances of `sgfakeshm-core-client` simultaneously.**
Running multiple instances of either application at the same time will cause the benchmark applications to fail or crash because they attempt to establish multiple `Pair0` connections.
So, this means at the time of benchmarking no instances of SenseCom or UE or Unity plugins should be running either.
### The Configuration File
Depending on the platform **`SGFakeShm`-dependant applications** (such as SenseCom, UE plugin, or the benchmarking/tuning apps) are running on, all tuning parameters are generated or loaded from:
- `${XDG_CONFIG_HOME:-$HOME/.config}/SenseGlove/sgfakeshm-params.yml` on GNU/Linux, which typically equates to `~/.config/SenseGlove/sgfakeshm-params.yml`.
- `%USERPROFILE%\Documents\SenseGlove\sgfakeshm-params.yml` on Microsoft Windows.
When SenseCom or `sgfakeshm-connect-client` start:
- If the file does **not** exist, it will automatically be generated.
- If the file exists and its version matches the currently supported version, its values override the built-in and hardcoded defaults.
- If the file format is not a valid YAML, or it contains invalid values, or the file version does not match a version that is shipped with the current `SGFakeShm` version, the existing file is preserved by renaming it to `sgfakeshm-params.yml.YYYY-MM-DD-hh-mm-ss`, and then a new configuration file containing the latest defaults is then generated automatically.
This approach allows users to preserve previous configurations while safely switching between various versions, whether old or new.
### Hot Reloading
One particularly useful feature is that the configuration file supports **hot reloading**.
Whenever the file is saved:
- SenseCom automatically detects the changes.
- The configuration is reloaded.
- The new parameters take effect immediately.
Restarting SenseCom or applications using the SenseGlove libraries is therefore unnecessary.
This makes iterative tuning significantly easier.
### Exposed Tuning Parameters
The generated `sgfakeshm-params.yml` file always contains generic documentation, along with a detailed explanation of every exposed tuning parameter and its default value. The following is the latest version of `sgfakeshm-params.yml` generated by the latest release of `SGFakeShm` at the time of writing:
```yaml
# File name used for tweaking and tuning the FakeShm parameters.
# When this file does not exist it will be generated by the SGConnectShm upon
# initialization or reconfiguration and gets populated from the hardcoded values
# below.
# If it does indeed exist and file version matches the version supported by the
# current release of the SenseGlove libraries, the parameter values in this file
# will override the hardcoded values from the libraries.
# If the file has invalid values, or the version number does not match, it will
# be renamed to sgfakeshm-params.yml.YYYY-MM-DD-hh-mm-ss to
# preserve the user's chosen values and a new file will be generated containing
# the updated values or newly introduced parameters.
#
# NOTE: This file supports hot-reloading upon saving the file. Thus, you do
# not have to close SenseCom or plugin's relying on SenseGlove libraries in
# order to apply the changes. The changes will be picked up automatically
# as soon as a file change is detected.
# The current version of the the default tuning parameters configuration
# file.
#
# Existing tuning configuration files are only loaded when their version
# matches the version supported by the current FakeShm implementation.
# Otherwise, the existing file is backed up with a timestamped filename
# and a new file containing the current default parameters is generated.
#
# Please do not change this value if you want your changes to persist.
Version: 1
# If enabled, socket receive operations are performed in non-blocking
# mode.
# nng_recvmsg will return immediately if no message is available:
# - NNG_EAGAIN is returned instead of blocking
# This improves responsiveness but may increase CPU usage due to
# polling.
# When disabled, SocketReceiveTimeout controls blocking behavior.
SocketReceiveNonBlocking: true
# Receive timeout for the NNG socket in milliseconds.
# Controls how long nng_recvmsg blocks while waiting for a message.
# If no message is received within this interval, the call returns
# with a timeout, allowing the worker thread to wake up periodically
# to:
# - send heartbeats
# - detect peer liveness
# - respond to shutdown requests
# Lower values increase responsiveness but may slightly increase CPU
# usage.
# This only is taken into account when SocketReceiveNonBlocking is
# disabled.
SocketReceiveTimeout: 1
# If enabled, socket send operations are performed in non-blocking
# mode.
# nng_sendmsg will return immediately if the message cannot be sent:
# - NNG_EAGAIN is returned instead of blocking
# Useful for low-latency systems where blocking is undesirable.
SocketSendNonBlocking: false
# Send timeout for the NNG socket in milliseconds.
# Controls how long nng_sendmsg blocks while attempting to send a
# message.
# If the message cannot be sent within this interval, the call returns
# with a timeout error, allowing the system to avoid long blocking
# stalls.
# This only is taken into account when SocketSendNonBlocking is
# disabled.
SocketSendTimeout: 1
# This is the minimum amount of time (milliseconds) to wait before
# attempting to establish a connection after a previous attempt has
# failed. This can be set on a socket, but it can also be overridden
# on an individual dialer. The option is irrelevant for listeners.
SocketReconnectTimeMin: 1
# This is the maximum amount of time (milliseconds) to wait before
# attempting to establish a connection after a previous attempt has
# failed. If this is non-zero, then the time between successive
# connection attempts will start at the value of
# SocketReconnectTimeMin, and grow exponentially, until it reaches
# this value. If this value is zero, then no exponential back-off
# between connection attempts is done, and each attempt will wait the
# time specified by SocketReconnectTimeMin. This can be set on a
# socket, but it can also be overridden on an individual dialer. The
# option is irrelevant for listeners.
SocketReconnectTimeMax: 10
# FakeShm transport worker retry interval in milliseconds.
# Applied when:
# - no peer is connected
# - socket returns no data (timeout / EAGAIN)
# Prevents busy-waiting loops and reduces CPU usage while idle.
WorkerRetryInterval: 1
# FakeShm transport heartbeat interval in milliseconds.
# Determines how often heartbeat messages are sent to the peer to:
# - maintain connection activity
# - update last-seen timestamps
# Lower values improve liveness detection but increase traffic
# overhead.
HeartbeatInterval: 1
# FakeShm IPC and TCP transports liveness timeout in milliseconds.
# Defines how long a peer can remain silent before being considered
# dead.
# Compared against the timestamp of the last received message.
# If exceeded, the peer is treated as disconnected/unresponsive.
LivenessTimeout: 5
# Latency smoothing window in milliseconds.
# Defines the time range over which latency samples are accumulated
# to compute a rolling average (smoothed latency).
# Larger values produce more stable results but react slower to
# changes.
LatencySmoothingWindow: 1000
# Throughput smoothing window in milliseconds.
# Defines the time range over which throughput snapshots are
# accumulated to compute a rolling average (smoothed snapshots).
# Larger values produce more stable results but react slower to
# changes.
ThroughputSmoothingWindow: 1000
# The legacy Boost SharedMem heartbeat block size.
SharedMemHeartbeatBlockSize: 1024
# FakeShm SharedMem liveness timeout in milliseconds.
# Defines how long a peer can remain silent before being considered
# dead.
# Compared against the timestamp of the last received message.
# If exceeded, the peer is treated as disconnected/unresponsive.
SharedMemLivenessTimeout: 50
```
@@ -0,0 +1,30 @@
# The Argh Frustration-free Command-line Processing Library Licence
```
Copyright (c) 2016, Adi Shavit
All rights reserved.
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.
* Neither the name of nor the names of its contributors may be used to
endorse or promote products derived from this software without specific
prior written permission.
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.
```
@@ -0,0 +1,23 @@
# c4core C++ Library License
```
Copyright (c) 2018, Joao Paulo Magalhaes <dev@jpmag.me>
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
```
@@ -0,0 +1,23 @@
# c4project CMake Scripts License
```
Copyright (c) 2018, Joao Paulo Magalhaes <dev@jpmag.me>
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
```
@@ -0,0 +1,27 @@
# Debug Break Library License
```
Copyright (c) 2011-2016, Scott Tsai
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. 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 HOLDER 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.
```
@@ -0,0 +1,250 @@
# fast_float Number Parsing Library License
```
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
Copyright 2021 The fast_float authors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
```
```
Boost Software License - Version 1.0 - August 17th, 2003
Permission is hereby granted, free of charge, to any person or organization
obtaining a copy of the software and accompanying documentation covered by
this license (the "Software") to use, reproduce, display, distribute,
execute, and transmit the Software, and to prepare derivative works of the
Software, and to permit third-parties to whom the Software is furnished to
do so, all subject to the following:
The copyright notices in the Software and this entire statement, including
the above license grant, this restriction and the following disclaimer,
must be included in all copies of the Software, in whole or in part, and
all derivative works of the Software, unless such copies or derivative
works are solely in the form of machine-executable object code generated by
a source language processor.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
```
```
MIT License
Copyright (c) 2021 The fast_float authors
Permission is hereby granted, free of charge, to any
person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the
Software without restriction, including without
limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software
is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice
shall be included in all copies or substantial portions
of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
```
@@ -0,0 +1,206 @@
# FlatBuffers Memory Efficient Serialization Library Licence
```
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
```
@@ -0,0 +1,25 @@
# The FTXUI Functional Terminal (X) User Interface Library Licence
```
The MIT License
Copyright (c) 2019 Arthur Sonzogni.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
```
@@ -0,0 +1,26 @@
# nanomsg-next-generation Lightweight Brokerless Messaging Library
```
The MIT License
Copyright 2021 Staysail Systems, Inc. <info@staysail.tech>
Copyright 2018 Capitar IT Group BV <info@capitar.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
```
@@ -0,0 +1,23 @@
# Rapid YAML Parsing and Emitting Library License
```
Copyright (c) 2018, Joao Paulo Magalhaes <dev@jpmag.me>
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
```
@@ -7,28 +7,29 @@ Some dependencies, like `r-efi`, are dual-licensed and allow permissive use. The
Below is a comprehensive list of all third-party crates and their corresponding licenses used in SGBLE and SGBLExx:
```
(MIT OR Apache-2.0) AND OFL-1.1 AND Ubuntu-font-1.0 (1): epaint_default_fonts
(MIT OR Apache-2.0) AND Unicode-3.0 (1): unicode-ident
(Apache-2.0 OR MIT) AND OFL-1.1 AND Ubuntu-font-1.0 (1): epaint_default_fonts
(Apache-2.0 OR MIT) AND Unicode-3.0 (1): unicode-ident
0BSD OR Apache-2.0 OR MIT (1): adler2
Apache-2.0 (15): ab_glyph, ab_glyph_rasterizer, accesskit_winit, codespan-reporting, dpi, gethostname, gl_generator, glutin, glutin_egl_sys, glutin_glx_sys, glutin_wgl_sys, khronos_api, owned_ttf_parser, spirv, winit
Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT (7): linux-raw-sys, linux-raw-sys, rustix, rustix, wasi, wasi, wit-bindgen-rt
Apache-2.0 OR BSD-2-Clause OR MIT (4): zerocopy, zerocopy, zerocopy-derive, zerocopy-derive
Apache-2.0 (14): ab_glyph, ab_glyph_rasterizer, accesskit_winit, codespan-reporting, gethostname, gl_generator, glutin, glutin_egl_sys, glutin_glx_sys, glutin_wgl_sys, khronos_api, owned_ttf_parser, spirv, winit
Apache-2.0 AND MIT (1): dpi
Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT (7): linux-raw-sys, linux-raw-sys, rustix, rustix, wasi, wasip2, wit-bindgen
Apache-2.0 OR BSD-2-Clause OR MIT (2): zerocopy, zerocopy-derive
Apache-2.0 OR BSD-3-Clause (2): moxcms, pxfm
Apache-2.0 OR BSD-3-Clause OR MIT (3): btleplug, num_enum, num_enum_derive
Apache-2.0 OR BSL-1.0 (1): ryu
Apache-2.0 OR LGPL-2.1-or-later OR MIT (1): r-efi
Apache-2.0 OR MIT (286): accesskit, accesskit_atspi_common, accesskit_consumer, accesskit_macos, accesskit_unix, accesskit_windows, addr2line, ahash, android-activity, android_log-sys, android_logger, android_system_properties, anstream, anstyle, anstyle-parse, anstyle-query, anstyle-wincon, arboard, arrayvec, as-raw-xcb-connection, ash, async-broadcast, async-channel, async-executor, async-fs, async-io, async-lock, async-process, async-recursion, async-signal, async-task, async-trait, atomic-waker, atspi, atspi-common, atspi-connection, atspi-proxies, autocfg, backtrace, bit-set, bit-vec, bitflags, bitflags, block-buffer, blocking, bluez-async, bluez-generated, bumpalo, cc, cesu8, cfg-if, cgl, clap, clap_builder, clap_lex, colorchoice, concurrent-queue, core-foundation, core-foundation, core-foundation-sys, core-graphics, core-graphics-types, cpufeatures, crc32fast, crossbeam-utils, crypto-common, ctor, ctor-proc-macro, dbus, dbus-tokio, digest, displaydoc, document-features, downcast-rs, dtor, dtor-proc-macro, ecolor, eframe, egui, egui-wgpu, egui-winit, egui_glow, either, emath, enumflags2, enumflags2_derive, env_filter, env_logger, epaint, equivalent, errno, event-listener, event-listener-strategy, fastrand, fdeflate, flate2, foreign-types, foreign-types-macros, foreign-types-shared, form_urlencoded, futures, futures-channel, futures-core, futures-executor, futures-io, futures-lite, futures-macro, futures-sink, futures-task, futures-util, getrandom, getrandom, gimli, gpu-alloc, gpu-alloc-types, gpu-descriptor, gpu-descriptor-types, hashbrown, heck, heck, hermit-abi, hermit-abi, hex, home, humantime, idna, idna_adapter, image, immutable-chunkmap, indexmap, is_terminal_polyfill, itertools, itoa, jni, jni, jni-sys, jobserver, jpeg-decoder, js-sys, khronos-egl, lazy_static, libc, libdbus-sys, litrs, lock_api, log, memmap2, metal, naga, ndk, ndk-context, ndk-sys, ndk-sys, nohash-hasher, num-traits, object, once_cell, ordered-stream, parking, parking_lot, parking_lot_core, paste, percent-encoding, pin-project, pin-project-internal, pin-project-lite, pin-utils, piper, pkg-config, png, polling, ppv-lite86, pretty_env_logger, proc-macro-crate, proc-macro2, profiling, quote, rand, rand, rand_chacha, rand_chacha, rand_core, rand_core, regex, regex-automata, regex-syntax, renderdoc-sys, rustc-demangle, rustc-hash, rustversion, scoped-tls, scopeguard, serde, serde_derive, serde_json, serde_repr, serde_spanned, sha1, shlex, signal-hook-registry, smallvec, smol_str, socket2, stable_deref_trait, static_assertions, syn, tempfile, thiserror, thiserror, thiserror-impl, thiserror-impl, thread_local, toml, toml_datetime, toml_edit, ttf-parser, type-map, typenum, unicode-segmentation, unicode-width, unicode-xid, url, utf16_iter, utf8_iter, utf8parse, uuid, version_check, wasm-bindgen, wasm-bindgen-backend, wasm-bindgen-futures, wasm-bindgen-macro, wasm-bindgen-macro-support, wasm-bindgen-shared, web-sys, web-time, webbrowser, weezl, wgpu, wgpu-core, wgpu-hal, wgpu-types, winapi, winapi-i686-pc-windows-gnu, winapi-x86_64-pc-windows-gnu, windows, windows, windows-core, windows-core, windows-implement, windows-implement, windows-interface, windows-interface, windows-result, windows-result, windows-strings, windows-sys, windows-sys, windows-sys, windows-targets, windows-targets, windows-targets, windows_aarch64_gnullvm, windows_aarch64_gnullvm, windows_aarch64_gnullvm, windows_aarch64_msvc, windows_aarch64_msvc, windows_aarch64_msvc, windows_i686_gnu, windows_i686_gnu, windows_i686_gnu, windows_i686_gnullvm, windows_i686_msvc, windows_i686_msvc, windows_i686_msvc, windows_x86_64_gnu, windows_x86_64_gnu, windows_x86_64_gnu, windows_x86_64_gnullvm, windows_x86_64_gnullvm, windows_x86_64_gnullvm, windows_x86_64_msvc, windows_x86_64_msvc, windows_x86_64_msvc, write16, x11rb, x11rb-protocol
Apache-2.0 OR MIT OR Zlib (12): bytemuck, bytemuck_derive, cursor-icon, glow, miniz_oxide, objc2-app-kit, objc2-core-bluetooth, objc2-core-foundation, objc2-core-graphics, objc2-io-surface, raw-window-handle, xkeysym
Apache-2.0 OR GPL-2.0 (1): self_cell
Apache-2.0 OR LGPL-2.1-or-later OR MIT (2): r-efi, r-efi
Apache-2.0 OR MIT (285): accesskit, accesskit_atspi_common, accesskit_consumer, accesskit_consumer, accesskit_consumer, accesskit_macos, accesskit_unix, accesskit_windows, ahash, allocator-api2, android-activity, android_system_properties, anstream, anstyle, anstyle-parse, anstyle-query, anstyle-wincon, arboard, arrayvec, as-raw-xcb-connection, ash, async-broadcast, async-channel, async-executor, async-io, async-lock, async-process, async-recursion, async-signal, async-task, async-trait, atomic-waker, atspi, atspi-common, atspi-proxies, autocfg, bit-set, bit-vec, bitflags, bitflags, blocking, bluez-async, bluez-generated, bumpalo, cc, cesu8, cfg-if, cgl, clap, clap_builder, clap_lex, color, colorchoice, concurrent-queue, core-foundation, core-foundation, core-foundation-sys, core-graphics, core-graphics-types, crc32fast, crossbeam-utils, ctor, dbus, dbus-tokio, displaydoc, document-features, downcast-rs, ecolor, eframe, egui, egui-wgpu, egui-winit, egui_glow, either, emath, enumflags2, enumflags2_derive, env_logger, epaint, equivalent, errno, euclid, event-listener, event-listener-strategy, fastrand, fdeflate, fearless_simd, find-msvc-tools, flate2, font-types, foreign-types, foreign-types-macros, foreign-types-shared, form_urlencoded, futures, futures-channel, futures-core, futures-executor, futures-io, futures-lite, futures-macro, futures-sink, futures-task, futures-util, getrandom, getrandom, gpu-allocator, gpu-descriptor, gpu-descriptor-types, half, hashbrown, hashbrown, hashbrown, hashbrown, heck, hermit-abi, hex, humantime, idna, idna_adapter, image, indexmap, is_terminal_polyfill, itertools, itoa, jni, jni, jni-macros, jni-sys, jni-sys, jni-sys-macros, jobserver, js-sys, khronos-egl, kurbo, lazy_static, libc, libdbus-sys, linebender_resource_handle, link-section, linktime-proc-macro, litrs, lock_api, log, memmap2, naga, ndk, ndk-context, ndk-sys, nohash-hasher, num-traits, once_cell, once_cell_polyfill, ordered-stream, parking, parking_lot, parking_lot_core, peniko, percent-encoding, pin-project, pin-project-internal, pin-project-lite, piper, pkg-config, plain, png, polling, pollster, polycool, portable-atomic, portable-atomic-util, presser, pretty_env_logger, proc-macro-crate, proc-macro2, profiling, quick-error, quote, range-alloc, raw-window-metal, read-fonts, regex, regex-automata, regex-syntax, renderdoc-sys, rustc-hash, rustc-hash, rustc_version, rustversion, scoped-tls, scopeguard, semver, serde, serde_core, serde_derive, serde_json, serde_repr, serde_spanned, shlex, signal-hook-registry, simd_cesu8, simdutf8, siphasher, skrifa, smallvec, smol_str, socket2, stable_deref_trait, static_assertions, syn, tempfile, thiserror, thiserror, thiserror-impl, thiserror-impl, toml, toml_datetime, toml_datetime, toml_edit, toml_parser, toml_writer, ttf-parser, type-map, unicode-segmentation, unicode-width, url, utf8_iter, utf8parse, uuid, vello_common, vello_cpu, version_check, wasm-bindgen, wasm-bindgen-futures, wasm-bindgen-macro, wasm-bindgen-macro-support, wasm-bindgen-shared, web-sys, web-time, webbrowser, weezl, wgpu, wgpu-core, wgpu-core-deps-apple, wgpu-core-deps-emscripten, wgpu-core-deps-wasm, wgpu-core-deps-windows-linux-android, wgpu-hal, wgpu-naga-bridge, wgpu-types, windows, windows-collections, windows-core, windows-future, windows-implement, windows-interface, windows-link, windows-numerics, windows-result, windows-strings, windows-sys, windows-sys, windows-sys, windows-sys, windows-targets, windows-targets, windows-threading, windows_aarch64_gnullvm, windows_aarch64_gnullvm, windows_aarch64_msvc, windows_aarch64_msvc, windows_i686_gnu, windows_i686_gnu, windows_i686_gnullvm, windows_i686_gnullvm, windows_i686_msvc, windows_i686_msvc, windows_x86_64_gnu, windows_x86_64_gnu, windows_x86_64_gnullvm, windows_x86_64_gnullvm, windows_x86_64_msvc, windows_x86_64_msvc, x11rb, x11rb-protocol
Apache-2.0 OR MIT OR Zlib (17): bytemuck, bytemuck_derive, cursor-icon, dispatch2, glow, miniz_oxide, objc2-app-kit, objc2-core-foundation, objc2-core-graphics, objc2-io-surface, objc2-metal, objc2-quartz-core, objc2-ui-kit, raw-window-handle, xkeysym, zune-core, zune-jpeg
BSD-2-Clause (1): arrayref
BSD-3-Clause (3): jni-utils, tiny-skia, tiny-skia-path
BSD-3-Clause (2): tiny-skia, tiny-skia-path
BSL-1.0 (2): clipboard-win, error-code
CC0-1.0 (1): hexf-parse
ISC (1): libloading
MIT (91): android-properties, block, block2, block2, bytes, calloop, calloop-wayland-source, cfg_aliases, combine, dashmap, dispatch, dlib, endi, generic-array, glutin-winit, is-terminal, libredox, malloc_buf, memoffset, mio, nix, objc, objc-sys, objc2, objc2, objc2-app-kit, objc2-cloud-kit, objc2-contacts, objc2-core-data, objc2-core-image, objc2-core-location, objc2-encode, objc2-foundation, objc2-foundation, objc2-link-presentation, objc2-metal, objc2-quartz-core, objc2-symbols, objc2-ui-kit, objc2-uniform-type-identifiers, objc2-user-notifications, orbclient, ordered-float, quick-xml, quick-xml, redox_syscall, redox_syscall, sctk-adwaita, serde-xml-rs, simd-adler32, slab, smithay-client-toolkit, smithay-clipboard, strict-num, strsim, strum, strum_macros, synstructure, tiff, tokio, tokio-macros, tokio-stream, tokio-util, tracing, tracing-attributes, tracing-core, uds_windows, wayland-backend, wayland-client, wayland-csd-frame, wayland-cursor, wayland-protocols, wayland-protocols-plasma, wayland-protocols-wlr, wayland-scanner, wayland-sys, winnow, x11-dl, xcursor, xdg-home, xkbcommon-dl, xml-rs, zbus, zbus-lockstep, zbus-lockstep-macros, zbus_macros, zbus_names, zbus_xml, zvariant, zvariant_derive, zvariant_utils
MIT (99): android-properties, block2, block2, bytes, calloop, calloop, calloop-wayland-source, calloop-wayland-source, cfg_aliases, combine, crunchy, dashmap, dispatch, dlib, endi, fax, glutin-winit, is-terminal, libm, libredox, memoffset, mio, objc-sys, objc2, objc2, objc2-app-kit, objc2-cloud-kit, objc2-contacts, objc2-core-bluetooth, objc2-core-data, objc2-core-image, objc2-core-location, objc2-encode, objc2-foundation, objc2-foundation, objc2-link-presentation, objc2-metal, objc2-quartz-core, objc2-symbols, objc2-ui-kit, objc2-uniform-type-identifiers, objc2-user-notifications, orbclient, ordered-float, phf, phf_generator, phf_macros, phf_shared, quick-xml, redox_syscall, redox_syscall, redox_syscall, sctk-adwaita, serde-xml-rs, simd-adler32, slab, smithay-client-toolkit, smithay-client-toolkit, smithay-clipboard, strict-num, strsim, synstructure, tiff, tokio, tokio-macros, tokio-stream, tokio-util, tracing, tracing-attributes, tracing-core, uds_windows, wayland-backend, wayland-client, wayland-csd-frame, wayland-cursor, wayland-protocols, wayland-protocols-experimental, wayland-protocols-misc, wayland-protocols-plasma, wayland-protocols-wlr, wayland-scanner, wayland-sys, winnow, winnow, x11-dl, xcursor, xkbcommon-dl, xml, xml-rs, zbus, zbus-lockstep, zbus-lockstep-macros, zbus_macros, zbus_names, zbus_xml, zmij, zvariant, zvariant_derive, zvariant_utils
MIT OR Unlicense (7): aho-corasick, byteorder-lite, memchr, same-file, termcolor, walkdir, winapi-util
MPL-2.0 (1): cbindgen
N/A (2): sgble, sgblueman
Unicode-3.0 (19): icu_collections, icu_locid, icu_locid_transform, icu_locid_transform_data, icu_normalizer, icu_normalizer_data, icu_properties, icu_properties_data, icu_provider, icu_provider_macros, litemap, tinystr, writeable, yoke, yoke-derive, zerofrom, zerofrom-derive, zerovec, zerovec-derive
Zlib (2): foldhash, slotmap
Unicode-3.0 (18): icu_collections, icu_locale_core, icu_normalizer, icu_normalizer_data, icu_properties, icu_properties_data, icu_provider, litemap, potential_utf, tinystr, writeable, yoke, yoke-derive, zerofrom, zerofrom-derive, zerotrie, zerovec, zerovec-derive
Zlib (3): foldhash, foldhash, slotmap
```
For detailed terms of use, please refer to the license files in each project's upstream repository.
@@ -6,9 +6,20 @@ The following third-party software are used and shipped with the SenseGlove Unre
- [The SenseGlove SDK (a.k.a. SenseGlove Backend Libraries, or SenseGlove Core Libraries)](senseglove-sdk.md)
- [SGBLE and SGBLExx Rust Dependencies](sgble-sgblexx-rust-dependencies.md)
- [The Argh Frustration-free Command-line Processing Library](argh-command-line-processing-library.md)
- [The Boost C++ Libraries](boost-cpp-libraries.md)
- [The c4core C++ Library](c4core-library.md)
- [The c4project CMake Scripts](c4project-cmake-scripts.md)
- [The Debug Break Library](debugbreak-library.md)
- [The fast_float Number Parsing Library](fast-float-number-parsing-library.md)
- [The FlatBuffers Memory Efficient Serialization Library](flatbuffers-serialization-library.md)
- [The {fmt} Formatting Library](fmt-formatting-library.md)
- [The Loguru Logging Library License](loguru-loggin-library.md)
- [The FTXUI Functional Terminal (X) User Interface Library](ftxui-functional-tui-library.md)
- [The Loguru Logging Library](loguru-logging-library.md)
- [The nanomsg-next-generation Lightweight Brokerless Messaging Library](nng-messaging-library.md)
- [The Rapid YAML Parsing and Emitting Library](rapidyaml-parsing-emitting-library.md)
- [The Serial Communication Library](serial-communication-library.md)
__NOTE__: **FTXUI** and **Argh** are only used by [the SenseGlove FakeShm Module Tuning Utilities, `sgfakeshm-connect-client` and `sgfakeshm-core-client`](https://dev.azure.com/SenseGlove/_git/SenseGlove-Unreal?path=/Tuning&version=GBmaster&_a=contents) distributed as separate binaries via [the SenseGlove Unreal Engine Plugin Microsoft Azure DevOps repository](https://dev.azure.com/SenseGlove/_git/SenseGlove-Unreal). Since these utilities are not part of [the official release of the SenseGlove Unreal Engine Plugin via the Fab Store](https://www.fab.com/listings/62bcdd2a-0bb1-4f34-b7b8-c5e7c9313099), their respective licensing terms won't apply to the SenseGlove SDK or the UE plugin.
For more information consult their own respective open-source licenses, please.
@@ -21,6 +21,7 @@ This section covers the basics of the SenseGlove Unreal Engine Plugin:
- [Connect to Nova gloves using Blueman Bluetooth Manager](../getting-started/sensecom/bluetooth-serial/gnu-linux/blueman-bluetooth-manager.md)
- [Connect to Nova gloves using Command-line](../getting-started/sensecom/bluetooth-serial/gnu-linux/command-line.md)
- [SenseCom on Microsoft Windows](../getting-started/sensecom/bluetooth-serial/microsoft-windows.md)
- [FakeShm Module Tuning](../getting-started/sensecom/fakeshm-tuning/)
- [Enabling XR_EXT_hand_tracking on VR Headsets](../getting-started/enabling-xr-ext-hand-tracking-vr-headsets/)
- [PCVR Mode](../getting-started/enabling-xr-ext-hand-tracking-vr-headsets/pcvr-mode/)
- [Standalone Mode](../getting-started/enabling-xr-ext-hand-tracking-vr-headsets/standalone-mode/)
@@ -110,7 +111,16 @@ The appendix contains various extra useful information:
- [Third-Party Licenses](../license/third-party.md)
- [SenseGlove SDK License](../license/senseglove-sdk.md)
- [SGBLE and SGBLExx Rust Dependencies Licenses](../license/sgble-sgblexx-rust-dependencies.md)
- [Argh Frustration-free Command-line Processing Library License](../license/argh-command-line-processing-library.md)
- [Boost C++ Libraries License](../license/boost-cpp-libraries.md)
- [c4core C++ Library Licence](../license/c4core-library.md)
- [c4project CMake Scripts Licence](../license/c4project-cmake-scripts.md)
- [Debug Break Library Licence](../license/debugbreak-library.md)
- [fast_float Number Parsing Library](../license/fast-float-number-parsing-library.md)
- [FlatBuffers Memory Efficient Serialization Library Licence](../license/flatbuffers-serialization-library.md)
- [{fmt} Formatting Library License](../license/fmt-formatting-library.md)
- [Loguru Logging Library License](../license/loguru-loggin-library.md)
- [FTXUI Functional Terminal (X) User Interface Library](../license/ftxui-functional-tui-library.md)
- [Loguru Logging Library License](../license/loguru-logging-library.md)
- [nanomsg-next-generation Lightweight Brokerless Messaging Library License](../license/nng-messaging-library.md)
- [Rapid YAML Parsing and Emitting Library](../license/rapidyaml-parsing-emitting-library.md)
- [Serial Communication Library License](../license/serial-communication-library.md)
@@ -42,6 +42,7 @@ Deploy:
PasswordEnvVar: SGUM_PACKAGER_REPOSITORY_PASSWORD
Branches:
- "5.8"
- "5.7"
- "5.6"
- "5.5"
@@ -56,6 +57,7 @@ Deploy:
- Handbook
- Packager
- README.md
- Tuning
Git:
@@ -184,6 +186,11 @@ Rocket:
EnginePaths:
- Branch: "5.8"
Path:
Linux: "/opt/UE58"
Windows: "C:\\OPT\\UE_5.8"
- Branch: "5.7"
Path:
Linux: "/opt/UE57"
@@ -201,6 +208,11 @@ Rocket:
NDKPaths:
- Branch: "5.8"
Path:
Linux: "/opt/android/sdk/ndk/27.2.12479018"
Windows: "%LOCALAPPDATA%\\Android\\Sdk\\ndk\\27.2.12479018"
- Branch: "5.7"
Path:
Linux: "/opt/android/sdk/ndk/27.2.12479018"
+1 -1
View File
@@ -1,7 +1,7 @@
{
"FileVersion": 3,
"Version": 1,
"VersionName": "2.8.0",
"VersionName": "2.9.0",
"FriendlyName": "SenseGlove",
"Description": "Integrating the SenseGlove haptic controller into Unreal Engine",
"Category": "Virtual Reality",
@@ -36,6 +36,7 @@
#include "SenseGlove/Engine/SGGameInstance.h"
#include "Engine/Engine.h"
#include "UObject/Class.h"
#include "SenseGlove/GameFramework/SGGameUserSettings.h"
#include "SGLog/SGLog.h"
@@ -45,13 +46,8 @@ void USGGameInstance::SG_GetEngineScalabilitySettings()
const USGGameUserSettings* GameUserSettings{USGGameUserSettings::GetInstance()};
ensureAlwaysMsgf(GameUserSettings, TEXT("Invalid GameUserSettings!"));
static UEnum* EnumPtr{StaticEnum<ESGEngineScalabilitySettings>()};
ensureAlwaysMsgf(EnumPtr, TEXT("Failed to find the ESGEngineScalabilitySettings enum!"));
const ESGEngineScalabilitySettings Scalability = GameUserSettings->GetEngineScalabilitySettings();
const FName ScalabilityName{
EnumPtr->GetNameByValue(static_cast<int64>(Scalability))
};
const FName ScalabilityName{UEnum::GetValueAsName(Scalability)};
SGLOG("Get Engine Scalability Settings", ScalabilityName);
}
@@ -61,14 +57,9 @@ void USGGameInstance::SG_SetEngineScalabilitySettings(const ESGEngineScalability
USGGameUserSettings* GameUserSettings{USGGameUserSettings::GetInstance()};
ensureAlwaysMsgf(GameUserSettings, TEXT("Invalid GameUserSettings!"));
static UEnum* EnumPtr{StaticEnum<ESGEngineScalabilitySettings>()};
ensureAlwaysMsgf(EnumPtr, TEXT("Failed to find the ESGEngineScalabilitySettings enum!"));
GameUserSettings->SetEngineScalabilitySettings(Scalability);
const FName ScalabilityName{
EnumPtr->GetNameByValue(static_cast<int64>(Scalability))
};
const FName ScalabilityName{UEnum::GetValueAsName(Scalability)};
SGLOG("Set Engine Scalability Settings", ScalabilityName);
}
@@ -38,6 +38,7 @@
#include "Engine/Engine.h"
#include "GameMapsSettings.h"
#include "Misc/CoreDelegates.h"
#include "Runtime/Launch/Resources/Version.h"
#include "SGLog/SGLog.h"
#include "SenseGlove/Engine/SGGameInstance.h"
@@ -51,8 +52,13 @@ void FSenseGloveModule::StartupModule()
{
SGLOG("Starting up the SenseGlove module...");
#if ENGINE_MAJOR_VERSION >= 5 && ENGINE_MINOR_VERSION >= 8
OnPostEngineInitHandle = FCoreDelegates::GetOnPostEngineInit().AddRaw(
this, &FSenseGloveModule::OnPostEngineInit);
#else /* ENGINE_MAJOR_VERSION >= 5 && ENGINE_MINOR_VERSION >= 8 */
OnPostEngineInitHandle = FCoreDelegates::OnPostEngineInit.AddRaw(
this, &FSenseGloveModule::OnPostEngineInit);
#endif /* ENGINE_MAJOR_VERSION >= 5 && ENGINE_MINOR_VERSION >= 8 */
}
void FSenseGloveModule::PreUnloadCallback()
@@ -69,7 +75,11 @@ void FSenseGloveModule::ShutdownModule()
{
SGLOG("Shutting down the SenseGlove module...");
#if ENGINE_MAJOR_VERSION >= 5 && ENGINE_MINOR_VERSION >= 8
FCoreDelegates::GetOnPostEngineInit().Remove(OnPostEngineInitHandle);
#else /* ENGINE_MAJOR_VERSION >= 5 && ENGINE_MINOR_VERSION >= 8 */
FCoreDelegates::OnPostEngineInit.Remove(OnPostEngineInitHandle);
#endif /* ENGINE_MAJOR_VERSION >= 5 && ENGINE_MINOR_VERSION >= 8 */
}
void FSenseGloveModule::OnPostEngineInit() const
@@ -36,6 +36,7 @@
#include "SenseGloveAndroidModule.h"
#include "Misc/CoreDelegates.h"
#include "Runtime/Launch/Resources/Version.h"
#include "SGAndroid/SGAndroidPermissions.h"
#include "SGAndroid/SGConnectJNI.h"
@@ -48,8 +49,13 @@ void FSenseGloveAndroidModule::StartupModule()
{
SGLOG("Starting up the SenseGloveAndroid module...");
#if ENGINE_MAJOR_VERSION >= 5 && ENGINE_MINOR_VERSION >= 8
OnPostEngineInitHandle = FCoreDelegates::GetOnPostEngineInit().AddRaw(
this, &FSenseGloveAndroidModule::OnPostEngineInit);
#else /* ENGINE_MAJOR_VERSION >= 5 && ENGINE_MINOR_VERSION >= 8 */
OnPostEngineInitHandle = FCoreDelegates::OnPostEngineInit.AddRaw(
this, &FSenseGloveAndroidModule::OnPostEngineInit);
#endif /* ENGINE_MAJOR_VERSION >= 5 && ENGINE_MINOR_VERSION >= 8 */
}
void FSenseGloveAndroidModule::PreUnloadCallback()
@@ -0,0 +1,36 @@
/**
* @file
*
* @author Mamadou Babaei <mamadou@senseglove.com>
*
* @section LICENSE
*
* (The MIT License)
*
* Copyright (c) 2020 - 2026 SenseGlove
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* @section DESCRIPTION
*
*
*/
#include "SGBuildHacks/SGInclude_Core_DeviceTypes.h"
@@ -0,0 +1,44 @@
/**
* @file
*
* @author Mamadou Babaei <mamadou@senseglove.com>
*
* @section LICENSE
*
* (The MIT License)
*
* Copyright (c) 2020 - 2026 SenseGlove
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* @section DESCRIPTION
*
*
*/
#include "HAL/Platform.h"
#include "SGBuildHacks/SGUndef_TEXT.h"
THIRD_PARTY_INCLUDES_START
#include "SenseGlove/Core/DeviceTypes.hpp"
THIRD_PARTY_INCLUDES_END
#include "SGBuildHacks/SGRestore_TEXT.h"
@@ -40,17 +40,17 @@
int32 FSGConnect::Init()
{
return SGConnect_Init();
return SGConnectImpl_Init();
}
int32 FSGConnect::Dispose()
{
return SGConnect_Dispose();
return SGConnectImpl_Dispose();
}
FString FSGConnect::GetLibraryVersion()
{
FSGIC_FString Container;
SGConnect_GetLibraryVersion(&Container);
SGConnectImpl_GetLibraryVersion(&Container);
return Container.String;
}
@@ -78,17 +78,17 @@ int32 SGConnectImpl_Android_Initialize(
* SGConnectImpl.h
******************************************************************************/
int32 SGConnect_Init()
int32 SGConnectImpl_Init()
{
return FSGConnectImpl::Init();
}
int32 SGConnect_Dispose()
int32 SGConnectImpl_Dispose()
{
return FSGConnectImpl::Dispose();
}
void SGConnect_GetLibraryVersion(void* OutVersion)
void SGConnectImpl_GetLibraryVersion(void* OutVersion)
{
StaticCast<FSGIC_FString*>(OutVersion)->String = FSGConnectImpl::GetLibraryVersion();
}
@@ -80,9 +80,9 @@ SENSEGLOVECONNECTIMPL_PUBLIC_API int32 SGConnectImpl_Android_Initialize(
* SGConnectImpl.h
******************************************************************************/
SENSEGLOVECONNECTIMPL_PUBLIC_API int32 SGConnect_Init();
SENSEGLOVECONNECTIMPL_PUBLIC_API int32 SGConnect_Dispose();
SENSEGLOVECONNECTIMPL_PUBLIC_API void SGConnect_GetLibraryVersion(void* OutVersion);
SENSEGLOVECONNECTIMPL_PUBLIC_API int32 SGConnectImpl_Init();
SENSEGLOVECONNECTIMPL_PUBLIC_API int32 SGConnectImpl_Dispose();
SENSEGLOVECONNECTIMPL_PUBLIC_API void SGConnectImpl_GetLibraryVersion(void* OutVersion);
/*******************************************************************************
******************************************************************************/
@@ -40,6 +40,11 @@ public class SenseGloveConnectImpl : ModuleRules
{
public SenseGloveConnectImpl(ReadOnlyTargetRules Target) : base(Target)
{
bool bIsLinux = Target.Platform == UnrealTargetPlatform.Linux;
bool bIsLinuxArm64 = Target.Platform == UnrealTargetPlatform.LinuxArm64;
bool bIsWin64 = Target.IsInPlatformGroup(UnrealPlatformGroup.Windows) &&
Target.WindowsPlatform.Architecture == UnrealArch.X64;
PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
bEnableExceptions = false;
@@ -57,17 +62,32 @@ public class SenseGloveConnectImpl : ModuleRules
PrivateDependencyModuleNames.AddRange(
new string[]
{
"SGBleThirdPartyLibs",
"SGCommonThirdPartyLibs",
"SGConnectShmThirdPartyLibs",
"SGConnectThirdPartyLibs",
"SGSerialThirdPartyLibs",
"SGFmtThirdPartyLibs",
"SGLogThirdPartyLibs",
"SGLoguruThirdPartyLibs",
"SGWjwwoodSerialThirdPartyLibs",
}
);
if (bIsLinux || bIsLinuxArm64 || bIsWin64)
{
PrivateDependencyModuleNames.AddRange(
new string[]
{
"SGBleThirdPartyLibs",
"SGConnectShmThirdPartyLibs",
"SGCoreShmThirdPartyLibs",
"SGFakeShmThirdPartyLibs",
"SGFlatBuffersThirdPartyLibs",
"SGNngThirdPartyLibs",
"SGRapidYamlThirdPartyLibs",
"SGSerialThirdPartyLibs",
"SGWjwwoodSerialThirdPartyLibs",
}
);
}
PrivateDependencyModuleNames.AddRange(
new string[]
{
@@ -39,6 +39,27 @@
#include "SGInterop/SGIC_ESGBackendType.h"
#include "SGInterop/SGIC_FString.h"
bool FSGLibrary::IsInitialized()
{
return SGCoreImpl_FSGLibraryImpl_IsInitialized();
}
bool FSGLibrary::Initialize(FString& OutError)
{
FSGIC_FString Container;
const bool bResult = SGCoreImpl_FSGLibraryImpl_Initialize(&Container);
OutError = MoveTemp(Container.String);
return bResult;
}
bool FSGLibrary::Terminate(FString& OutError)
{
FSGIC_FString Container;
const bool bResult = SGCoreImpl_FSGLibraryImpl_Terminate(&Container);
OutError = MoveTemp(Container.String);
return bResult;
}
FString FSGLibrary::GetVersion()
{
FSGIC_FString Container;
@@ -43,8 +43,34 @@
void FSenseGloveCoreModule::StartupModule()
{
SGLOG("Starting up the SenseGloveCore module...");
SGLOG(FString::Printf(TEXT("The Unreal Engine implementation of '%s' has been loaded successfully!"),
SGLOG(FString::Printf(TEXT("Initializing '%s'..."),
*FSGLibrary::GetVersion()));
const bool bInitializedAlready = FSGLibrary::IsInitialized();
if (!ensureAlwaysMsgf(!bInitializedAlready, TEXT("Failed to initialize SGCore!")))
{
SGLOG_FATAL(FString::Printf(TEXT("Failed to initialize '%s': it has already been initialized!"),
*FSGLibrary::GetVersion()));
}
else
{
FString Error;
const bool bInitialized = FSGLibrary::Initialize(Error);
if (bInitialized)
{
SGLOG(FString::Printf(TEXT("'%s' has been initialized successfully!"),
*FSGLibrary::GetVersion()));
SGLOG(FString::Printf(TEXT("The Unreal Engine implementation of '%s' has been loaded successfully!"),
*FSGLibrary::GetVersion()));
}
else
{
SGLOG_FATAL(FString::Printf(TEXT("Failed to initialize '%s'!"),
*FSGLibrary::GetVersion()));
}
}
}
void FSenseGloveCoreModule::PreUnloadCallback()
@@ -60,6 +86,34 @@ void FSenseGloveCoreModule::PostLoadCallback()
void FSenseGloveCoreModule::ShutdownModule()
{
SGLOG("Shutting down the SenseGloveCore module...");
SGLOG(FString::Printf(TEXT("Terminating '%s'..."),
*FSGLibrary::GetVersion()));
const bool bInitialized = FSGLibrary::IsInitialized();
if (!ensureAlwaysMsgf(bInitialized, TEXT("Failed to terminate SGCore!")))
{
SGLOG_FATAL(FString::Printf(TEXT("Failed to terminate '%s': it has not been initialized yet!"),
*FSGLibrary::GetVersion()));
}
else
{
FString Error;
const bool bTerminated = FSGLibrary::Terminate(Error);
if (bTerminated)
{
SGLOG(FString::Printf(TEXT("'%s' has been terminated successfully!"),
*FSGLibrary::GetVersion()));
SGLOG(FString::Printf(TEXT("The Unreal Engine implementation of '%s' has been shutdown successfully!"),
*FSGLibrary::GetVersion()));
}
else
{
SGLOG_FATAL(FString::Printf(TEXT("Failed to terminate '%s'!"),
*FSGLibrary::GetVersion()));
}
}
}
#undef LOCTEXT_NAMESPACE
@@ -81,7 +81,7 @@ public:
public:
/**
* Deserialize a beta device from its basic constants string. Returns nullptr is unsuccessful.
* Deserialize a beta device from its basic constants string. Returns nullptr if unsuccessful.
*/
static USGBetaDevice* Parse(UObject* Outer, const FString& String);
@@ -262,12 +262,12 @@ public:
virtual ESGHapticGloveCalibrationState GetCalibrationState() const;
/**
* Resets internal calibration of the Haptic Glove.
* Force-End any form of calibration manually, if any is still running.
*/
virtual void EndCalibration();
/**
* Force-End any form of calibration manually, if any is still running.
* Resets internal calibration of the Haptic Glove.
*/
virtual void ResetCalibration();
@@ -51,6 +51,10 @@ struct SENSEGLOVECORE_API FSGLibrary
GENERATED_BODY()
public:
static bool IsInitialized();
static bool Initialize(FString& OutError);
static bool Terminate(FString& OutError);
/**
* The version of this C++ Library in string representation.
*/
@@ -47,7 +47,7 @@
class FSGSenseGloveSensorNormalizerImpl;
/**
* Internal class to hold 'Threshold Commands' for specific fingers. Can be sent to a Device, or used internally.
* Acts as a sort of 'in between' handProfile. This class converts SG Dk1 Angles into 'normalized data' - between 0 .. 1.
*/
UCLASS(BlueprintType)
class SENSEGLOVECORE_API USGSenseGloveSensorNormalizer final : public UObject
@@ -37,11 +37,10 @@
#include "SGBuildHacks/SGInclude_Core_CustomWaveform.h"
#include "SGBuildHacks/SGInclude_Core_DeviceTypes.h"
#include "SGBuildHacks/SGInclude_Core_Fingers.h"
#include "SGBuildHacks/SGInclude_Core_HapticChannelInfo.h"
#include "SGBuildHacks/SGInclude_Core_HapticGlove.h"
#include "SGBuildHacks/SGInclude_Core_Library.h"
#include "SGBuildHacks/SGInclude_Core_NormalizationState.h"
#include "SGBuildHacks/SGInclude_Core_Nova2Glove.h"
#include "SGBuildHacks/SGInclude_Core_Nova2GloveSensorData.h"
#include "SGBuildHacks/SGInclude_Core_NovaGlove.h"
@@ -2776,6 +2776,25 @@ bool SGCoreImpl_FSGJointKinematicsImpl_ForwardKinematics_Profile_Finger_JointAng
* SGLibraryImpl.h
******************************************************************************/
bool SGCoreImpl_FSGLibraryImpl_IsInitialized()
{
return FSGLibraryImpl::IsInitialized();
}
bool SGCoreImpl_FSGLibraryImpl_Initialize(
void* OutError)
{
return FSGLibraryImpl::Initialize(
StaticCast<FSGIC_FString*>(OutError)->String);
}
bool SGCoreImpl_FSGLibraryImpl_Terminate(
void* OutError)
{
return FSGLibraryImpl::Terminate(
StaticCast<FSGIC_FString*>(OutError)->String);
}
void SGCoreImpl_FSGLibraryImpl_Version(
void* OutVersion)
{
@@ -35,11 +35,34 @@
#include "SGCoreImpl/SGLibraryImpl.h"
#include <string>
#include "Containers/StringConv.h"
#include "SGBuildHacks/SGInclude_Core_Library.h"
#include "SGCoreImpl/SGCoreEnumCast.h"
bool FSGLibraryImpl::IsInitialized()
{
return FLibraryType::IsInitialized();
}
bool FSGLibraryImpl::Initialize(FString& OutError)
{
std::string Error;
const bool bResult = FLibraryType::Initialize(Error);
OutError = UTF8_TO_TCHAR(Error.c_str());
return bResult;
}
bool FSGLibraryImpl::Terminate(FString& OutError)
{
std::string Error;
const bool bResult = FLibraryType::Terminate(Error);
OutError = UTF8_TO_TCHAR(Error.c_str());
return bResult;
}
FString FSGLibraryImpl::Version()
{
const FString Version(UTF8_TO_TCHAR(FLibraryType::Version().c_str()));
@@ -1409,6 +1409,14 @@ SGCoreImpl_FSGJointKinematicsImpl_ForwardKinematics_Profile_Finger_JointAngles_O
* SGLibraryImpl.h
******************************************************************************/
SENSEGLOVECOREIMPL_PUBLIC_API bool SGCoreImpl_FSGLibraryImpl_IsInitialized();
SENSEGLOVECOREIMPL_PUBLIC_API bool SGCoreImpl_FSGLibraryImpl_Initialize(
void* OutError);
SENSEGLOVECOREIMPL_PUBLIC_API bool SGCoreImpl_FSGLibraryImpl_Terminate(
void* OutError);
SENSEGLOVECOREIMPL_PUBLIC_API void SGCoreImpl_FSGLibraryImpl_Version(
void* OutVersion);
@@ -50,6 +50,10 @@ public:
typedef SGCore::Library FLibraryType;
public:
static bool IsInitialized();
static bool Initialize(FString& OutError);
static bool Terminate(FString& OutError);
static FString Version();
static ESGBackendType GetBackendType();
@@ -40,6 +40,11 @@ public class SenseGloveCoreImpl : ModuleRules
{
public SenseGloveCoreImpl(ReadOnlyTargetRules Target) : base(Target)
{
bool bIsLinux = Target.Platform == UnrealTargetPlatform.Linux;
bool bIsLinuxArm64 = Target.Platform == UnrealTargetPlatform.LinuxArm64;
bool bIsWin64 = Target.IsInPlatformGroup(UnrealPlatformGroup.Windows) &&
Target.WindowsPlatform.Architecture == UnrealArch.X64;
PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
bEnableExceptions = false;
@@ -58,7 +63,6 @@ public class SenseGloveCoreImpl : ModuleRules
new string[]
{
"SGCommonThirdPartyLibs",
"SGCoreShmThirdPartyLibs",
"SGCoreThirdPartyLibs",
"SGLogThirdPartyLibs",
"SGFmtThirdPartyLibs",
@@ -66,6 +70,21 @@ public class SenseGloveCoreImpl : ModuleRules
}
);
if (bIsLinux || bIsLinuxArm64 || bIsWin64)
{
PrivateDependencyModuleNames.AddRange(
new string[]
{
"SGConnectShmThirdPartyLibs",
"SGCoreShmThirdPartyLibs",
"SGFakeShmThirdPartyLibs",
"SGFlatBuffersThirdPartyLibs",
"SGNngThirdPartyLibs",
"SGRapidYamlThirdPartyLibs",
}
);
}
PrivateDependencyModuleNames.AddRange(
new string[]
{
@@ -71,7 +71,7 @@ float USGHandInterpolatorKismetLibrary::CalculateAngle_M_ESGFingerMovement_V_bAL
TArray<FSGVectorArray> USGHandInterpolatorKismetLibrary::InterpolateHandAngles(
const USGHandInterpolator* HandInterpolator,
const TArray<FSGFloatArray>& Flexions, const TArray<float>& Abductions, const float CmcTwist) const
const TArray<FSGFloatArray>& Flexions, const TArray<float>& Abductions, const float CmcTwist)
{
TArray<TArray<float>> FlexionsNestedArray{
FSGArrayUtils::FromNestedBPArray<
@@ -91,7 +91,7 @@ bool USGHandLayerKismetLibrary::GetHandPose(UObject* WorldContextObject,
return FSGHandLayer::GetHandPose(WorldContextObject, bRightHanded, OutHandPose);
}
void USGHandLayerKismetLibrary::GetWristLocation_bRH_FQuat_RR_TH_OutWP_OutWR(
void USGHandLayerKismetLibrary::GetWristLocation_bRH_RP_FQuat_RR_TH_OutWP_OutWR(
const bool bRightHanded,
const FVector& ReferencePosition, const FQuat& ReferenceRotation,
ESGPositionalTrackingHardware TrackingHardware,
@@ -35,6 +35,7 @@
#include "SGCoreKismet/SGJointKinematicsKismetLibrary.h"
#include "SGCore/SGBasicHandModel.h"
#include "SGCore/SGJointKinematics.h"
bool USGJointKinematicsKismetLibrary::ForwardKinematics_SP_FQuat_SR_JL_JA_OutNP_TArrayFQuat_OutNR(
@@ -37,6 +37,21 @@
#include "SGCore/SGLibrary.h"
bool USGLibraryKismetLibrary::IsInitialized()
{
return FSGLibrary::IsInitialized();
}
bool USGLibraryKismetLibrary::Initialize(FString& OutError)
{
return FSGLibrary::Initialize(OutError);
}
bool USGLibraryKismetLibrary::Terminate(FString& OutError)
{
return FSGLibrary::Terminate(OutError);
}
FString USGLibraryKismetLibrary::GetVersion()
{
return FSGLibrary::GetVersion();
@@ -47,6 +62,11 @@ FString USGLibraryKismetLibrary::GetBackendVersion()
return FSGLibrary::GetBackendVersion();
}
ESGBackendType USGLibraryKismetLibrary::GetBackendType()
{
return FSGLibrary::GetBackendType();
}
FString USGLibraryKismetLibrary::GetSGConnectVersion()
{
return FSGLibrary::GetSGConnectVersion();
@@ -39,6 +39,8 @@
#include "SGCore/SGHandInterpolator.h"
#include "SGCore/SGHandPose.h"
#include "SGCore/SGSenseGlove.h"
#include "SGCore/SGSenseGlovePose.h"
#include "SGCore/SGSenseGloveSensorData.h"
#include "SGCore/SGSenseGloveSensorNormalizer.h"
#include "SGUtils/SGArrayUtils.h"
@@ -196,7 +196,7 @@ public:
/**
*
*/
UFUNCTION(BlueprintPure, DisplayName="Set Start Joint Position",
UFUNCTION(BlueprintCallable, DisplayName="Set Start Joint Position",
Category="SenseGlove | Core | Kinematics | Basic Hand Model")
static void SetStartJointPosition_uint8_F_P(UPARAM(ref) USGBasicHandModel* BasicHandModel, uint8 Finger,
const FVector& Position);
@@ -55,7 +55,7 @@ class SENSEGLOVECOREKISMET_API USGBetaDeviceKismetLibrary final : public USGBlue
public:
/**
* Deserialize a beta device from its basic constants string. Returns nullptr is unsuccessful.
* Deserialize a beta device from its basic constants string. Returns nullptr if unsuccessful.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Beta Device", meta=(WorldContext="WorldContextObject"))
static USGBetaDevice* Parse(UObject* WorldContextObject, const FString& String);
@@ -101,7 +101,7 @@ public:
* Get the Type of waveform pattern that is used.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | CV | Custom Waveform")
ESGWaveformType GetWaveType(const USGCustomWaveform* CustomWaveform);
static ESGWaveformType GetWaveType(const USGCustomWaveform* CustomWaveform);
/**
* Set the Type of waveform pattern that is used.
@@ -132,8 +132,8 @@ public:
* @param bInclusive
*/
UFUNCTION(BlueprintPure, DisplayName="Firmware Newer Than", Category="SenseGlove | Core | SGDevice")
bool FirmwareNewerThan_FM_FS_bI(const USGDevice* SGDevice,
int32 FirmwareMain, int32 FirmwareSub, bool bInclusive);
static bool FirmwareNewerThan_FM_FS_bI(const USGDevice* SGDevice,
int32 FirmwareMain, int32 FirmwareSub, bool bInclusive);
/**
* Returns true if this glove's firmware is older than certain version.
@@ -221,14 +221,14 @@ public:
/**
* The number of haptic channels this device can support.
*/
UFUNCTION(BlueprintPure, DisplayName="Get Haptic Channel Index", Category="SenseGlove | Core | SGDevice")
UFUNCTION(BlueprintPure, DisplayName="Get Haptic Channel Count", Category="SenseGlove | Core | SGDevice")
static int32 GetHapticChannelCount(const USGDevice* SGDevice);
/**
* How many channels of a specific type this SGDevice possesses.
* @param ChannelType
*/
UFUNCTION(BlueprintPure, DisplayName="Get Haptic Channel Index", Category="SenseGlove | Core | SGDevice")
UFUNCTION(BlueprintPure, DisplayName="Get Haptic Channel Count", Category="SenseGlove | Core | SGDevice")
static int32 GetHapticChannelCount_CT(const USGDevice* SGDevice, ESGHapticChannelType ChannelType);
/**
@@ -99,9 +99,10 @@ public:
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Kinematics | Hand Interpolator",
meta=(WorldContext="WorldContextObject"))
TArray<FSGVectorArray> InterpolateHandAngles(const USGHandInterpolator* HandInterpolator,
const TArray<FSGFloatArray>& Flexions, const TArray<float>& Abductions,
float CmcTwist) const;
static TArray<FSGVectorArray> InterpolateHandAngles(const USGHandInterpolator* HandInterpolator,
const TArray<FSGFloatArray>& Flexions,
const TArray<float>& Abductions,
float CmcTwist);
/**
* Check if this handInterpolator matches another.
@@ -123,7 +123,7 @@ public:
* Calculate the Wrist Location of the chosen hand, based on a reference location and tracking hardware.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Wrist Location", Category="SenseGlove | Core | Hand Layer")
static void GetWristLocation_bRH_FQuat_RR_TH_OutWP_OutWR(
static void GetWristLocation_bRH_RP_FQuat_RR_TH_OutWP_OutWR(
bool bRightHanded,
const FVector& ReferencePosition, const FQuat& ReferenceRotation,
ESGPositionalTrackingHardware TrackingHardware,
@@ -161,7 +161,7 @@ public:
* Returns the Hand Angles calculated by this Nova 2 Glove. Used for input for HandPoses, but can be used in and of
* itself.
*/
UFUNCTION(BlueprintPure, DisplayName="Get Imu Rotation", Category="SenseGlove | Core | Haptic Glove")
UFUNCTION(BlueprintPure, DisplayName="Get Hand Angles", Category="SenseGlove | Core | Haptic Glove")
static bool GetHandAngles(const USGHapticGlove* HapticGlove, TArray<FSGVectorArray>& OutHandAngles);
/**
@@ -173,31 +173,31 @@ public:
/**
*
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Imu Rotation", Category="SenseGlove | Core | Haptic Glove")
UFUNCTION(BlueprintCallable, DisplayName="Set Hand Geometry", Category="SenseGlove | Core | Haptic Glove")
static void SetHandGeometry(UPARAM(ref) USGHapticGlove* HapticGlove, const USGBasicHandModel* HandGeometry);
/**
* Returns the HapticGlove's state of calibration for its on-board sensors.
*/
UFUNCTION(BlueprintPure, DisplayName="Get Imu Rotation", Category="SenseGlove | Core | Haptic Glove")
UFUNCTION(BlueprintPure, DisplayName="Get Calibration State", Category="SenseGlove | Core | Haptic Glove")
static ESGHapticGloveCalibrationState GetCalibrationState(const USGHapticGlove* HapticGlove);
/**
* Resets internal calibration of the Haptic Glove.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Imu Rotation", Category="SenseGlove | Core | Haptic Glove")
static void EndCalibration(UPARAM(ref) USGHapticGlove* HapticGlove);
/**
* Force-End any form of calibration manually, if any is still running.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Imu Rotation", Category="SenseGlove | Core | Haptic Glove")
UFUNCTION(BlueprintCallable, DisplayName="End Calibration", Category="SenseGlove | Core | Haptic Glove")
static void EndCalibration(UPARAM(ref) USGHapticGlove* HapticGlove);
/**
* Resets internal calibration of the Haptic Glove.
*/
UFUNCTION(BlueprintCallable, DisplayName="Reset Calibration", Category="SenseGlove | Core | Haptic Glove")
static void ResetCalibration(UPARAM(ref) USGHapticGlove* HapticGlove);
/**
* Retrieve the current calibration instruction.
*/
UFUNCTION(BlueprintPure, DisplayName="Get Imu Rotation", Category="SenseGlove | Core | Haptic Glove")
UFUNCTION(BlueprintPure, DisplayName="Get Calibration Instruction", Category="SenseGlove | Core | Haptic Glove")
static FString GetCalibrationInstruction(const USGHapticGlove* HapticGlove);
/**
@@ -97,7 +97,7 @@ public:
* Second value of input range.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Kinematics | Interpolation Set")
float GetX1(const USGInterpolationSet* InterpolationSet);
static float GetX1(const USGInterpolationSet* InterpolationSet);
/**
*
@@ -39,12 +39,13 @@
#include "Math/Quat.h"
#include "Math/Vector.h"
#include "SGCore/SGBasicHandModel.h"
#include "SGKismet/SGBlueprintFunctionLibrary.h"
#include "SGTypes/SGCoreTypes.h"
#include "SGJointKinematicsKismetLibrary.generated.h"
class USGBasicHandModel;
/**
*
*/
@@ -51,6 +51,15 @@ class SENSEGLOVECOREKISMET_API USGLibraryKismetLibrary final : public USGBluepri
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Library")
static bool IsInitialized();
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Library")
static bool Initialize(FString& OutError);
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Library")
static bool Terminate(FString& OutError);
/**
* The version of this C++ Library in string representation.
*/
@@ -63,6 +72,12 @@ public:
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Library")
static FString GetBackendVersion();
/**
* Check what back-end connections are used for this version of SGConnect.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Library")
static ESGBackendType GetBackendType();
/**
* If possible, check what version of SGConnect is paired with this API.
*/
@@ -261,57 +261,57 @@ public:
*
* @param OutHandAngles
*/
UFUNCTION(BlueprintPure, DisplayName="Get Hand Pose", Category="SenseGlove | Core | Nova | Nova 2 Glove",
UFUNCTION(BlueprintPure, DisplayName="Get Hand Angles", Category="SenseGlove | Core | Nova | Nova 2 Glove",
meta=(WorldContext="WorldContextObject"))
static bool GetHandAngles(const USGNova2Glove* Nova2Glove, TArray<FSGVectorArray>& OutHandAngles);
/*
* Retrieve the calibration status of this Nova 2.0 Glove.
*/
UFUNCTION(BlueprintPure, Category="Nova2Glove | Core | Nova | Nova 2 Glove")
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Nova | Nova 2 Glove")
static ESGHapticGloveCalibrationState GetCalibrationState(const USGNova2Glove* Nova2Glove);
/*
* Completes sensor Normalization on the Nova 2.0's end.
*/
UFUNCTION(BlueprintCallable, Category="Nova2Glove | Core | Nova | Nova 2 Glove")
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Nova | Nova 2 Glove")
static void EndCalibration(UPARAM(ref) USGNova2Glove* Nova2Glove);
/*
* Completes sensor Normalization on the Nova 2.0's end.
*/
UFUNCTION(BlueprintCallable, Category="Nova2Glove | Core | Nova | Nova 2 Glove")
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Nova | Nova 2 Glove")
static void ResetCalibration(UPARAM(ref) USGNova2Glove* Nova2Glove);
public:
/*
* Stop all haptic feedback effects playing on this device.
*/
UFUNCTION(BlueprintCallable, Category="Nova2Glove | Core | Nova | Nova 2 Glove")
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Nova | Nova 2 Glove")
static void StopHaptics(UPARAM(ref) USGNova2Glove* Nova2Glove);
/**
* Stop only all vibrotactile feedback.
*/
UFUNCTION(BlueprintCallable, Category="Nova2Glove | Core | Nova | Nova 2 Glove")
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Nova | Nova 2 Glove")
static void StopVibrations(UPARAM(ref) USGNova2Glove* Nova2Glove);
/**
* Flush all streaming haptic effects on the different fingers to the Nova 2.0 Glove.
*/
UFUNCTION(BlueprintCallable, Category="Nova2Glove | Core | SG | Nova 2 Glove")
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Nova | Nova 2 Glove")
static bool SendHaptics(UPARAM(ref) USGNova2Glove* Nova2Glove);
/**
* Returns true if this Glove supports the chosen haptic location.
*/
UFUNCTION(BlueprintPure, Category="Nova2Glove | Core | Nova | Nova 2 Glove")
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Nova | Nova 2 Glove")
static bool SupportsCustomWaveform(const USGNova2Glove* Nova2Glove, ESGHapticLocation AtLocation);
/**
* Send a custom waveform to the Nova 2.0.
*/
UFUNCTION(BlueprintCallable, Category="Nova2Glove | Core | Nova | Nova 2 Glove")
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Nova | Nova 2 Glove")
static bool SendCustomWaveform(UPARAM(ref) USGNova2Glove* Nova2Glove,
USGCustomWaveform* OutWaveform, ESGHapticLocation Location);
@@ -320,13 +320,13 @@ public:
*
* @remarks Devices that 'only' have on/off FFB will treat any value > 0.0 as 1.0.
*/
UFUNCTION(BlueprintCallable, Category="Nova2Glove | Core | Nova | Nova 2 Glove")
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Nova | Nova 2 Glove")
static bool QueueForceFeedbackLevels(UPARAM(ref) USGNova2Glove* Nova2Glove, const TArray<float>& Levels01);
/**
* Set the Force-Feedback value of a particular finger to a specific level.
*/
UFUNCTION(BlueprintCallable, Category="Nova2Glove | Core | Nova | Nova 2 Glove")
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Nova | Nova 2 Glove")
static bool QueueForceFeedbackLevel(UPARAM(ref) USGNova2Glove* Nova2Glove, int32 Finger, float Level01);
/**
@@ -334,14 +334,14 @@ public:
*
* @remarks Devices that 'only' have on/off FFB will treat any value > 0.0 as 1.0.
*/
UFUNCTION(BlueprintCallable, Category="Nova2Glove | Core | Nova | Nova 2 Glove")
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Nova | Nova 2 Glove")
static bool QueueVibroLevels(UPARAM(ref) USGNova2Glove* Nova2Glove, const TArray<float>& Amplitudes);
/**
* Queue a command to set the (continuous) vibration level at a specific location to a set amplitude. This is to
* support backwards compatibility for older plugins. Use of Customwaveforms is encouraged.
*/
UFUNCTION(BlueprintCallable, Category="Nova2Glove | Core | Nova | Nova 2 Glove")
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Nova | Nova 2 Glove")
static bool QueueVibroLevel(UPARAM(ref) USGNova2Glove* Nova2Glove, ESGHapticLocation Location, float Level01);
/**
@@ -281,39 +281,39 @@ public:
*
* @param OutHandAngles
*/
UFUNCTION(BlueprintPure, DisplayName="Get Hand Pose", Category="SenseGlove | Core | Nova | Nova Glove",
UFUNCTION(BlueprintPure, DisplayName="Get Hand Angles", Category="SenseGlove | Core | Nova | Nova Glove",
meta=(WorldContext="WorldContextObject"))
static bool GetHandAngles(const USGNovaGlove* NovaGlove, TArray<FSGVectorArray>& OutHandAngles);
/*
* Retrieve the calibration status of this Nova Glove.
*/
UFUNCTION(BlueprintPure, Category="NovaGlove | Core | Nova | Nova Glove")
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Nova | Nova Glove")
static ESGHapticGloveCalibrationState GetCalibrationState(const USGNovaGlove* NovaGlove);
/*
* Completes sensor Normalization on the Nova's end.
*/
UFUNCTION(BlueprintCallable, Category="NovaGlove | Core | Nova | Nova Glove")
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Nova | Nova Glove")
static void EndCalibration(UPARAM(ref) USGNovaGlove* NovaGlove);
/*
* Completes sensor Normalization on the Nova's end.
*/
UFUNCTION(BlueprintCallable, Category="NovaGlove | Core | Nova | Nova Glove")
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Nova | Nova Glove")
static void ResetCalibration(UPARAM(ref) USGNovaGlove* NovaGlove);
public:
/*
* Stop all haptic feedback effects playing on this device.
*/
UFUNCTION(BlueprintCallable, Category="NovaGlove | Core | Nova | Nova Glove")
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Nova | Nova Glove")
static void StopHaptics(UPARAM(ref) USGNovaGlove* NovaGlove);
/**
* Stop only all vibrotactile feedback.
*/
UFUNCTION(BlueprintCallable, Category="NovaGlove | Core | Nova | Nova Glove")
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Nova | Nova Glove")
static void StopVibrations(UPARAM(ref) USGNovaGlove* NovaGlove);
/**
@@ -324,19 +324,19 @@ public:
*
* @remarks Generic function across any Haptic Interface in SGCore.
*/
UFUNCTION(BlueprintCallable, Category="NovaGlove | Core | SG | Nova Glove")
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Nova | Nova Glove")
static bool SendHaptics(UPARAM(ref) USGNovaGlove* NovaGlove);
/**
* Returns true if this Glove supports the chosen haptic location.
*/
UFUNCTION(BlueprintPure, Category="NovaGlove | Core | Nova | Nova Glove")
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Nova | Nova Glove")
static bool SupportsCustomWaveform(const USGNovaGlove* NovaGlove, ESGHapticLocation AtLocation);
/**
* Send a custom waveform to the Nova.
*/
UFUNCTION(BlueprintCallable, Category="NovaGlove | Core | Nova | Nova Glove")
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Nova | Nova Glove")
static bool SendCustomWaveform(UPARAM(ref) USGNovaGlove* NovaGlove,
USGCustomWaveform* OutWaveform, ESGHapticLocation Location);
@@ -345,13 +345,13 @@ public:
*
* @remarks Devices that 'only' have on/off FFB will treat any value > 0.0 as 1.0.
*/
UFUNCTION(BlueprintCallable, Category="NovaGlove | Core | Nova | Nova Glove")
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Nova | Nova Glove")
static bool QueueForceFeedbackLevels(UPARAM(ref) USGNovaGlove* NovaGlove, const TArray<float>& Levels01);
/**
* Set the Force-Feedback value of a particular finger to a specific level.
*/
UFUNCTION(BlueprintCallable, Category="NovaGlove | Core | Nova | Nova Glove")
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Nova | Nova Glove")
static bool QueueForceFeedbackLevel(UPARAM(ref) USGNovaGlove* NovaGlove, int32 Finger, float Level01);
/**
@@ -39,7 +39,6 @@
#include "HAL/Platform.h"
#include "SGKismet/SGBlueprintFunctionLibrary.h"
#include "SGTypes/SGVectorArray.h"
#include "SGSenseComKismetLibrary.generated.h"
@@ -36,10 +36,6 @@
#pragma once
#include "SGCore/SGHandPose.h"
#include "SGCore/SGSenseGlove.h"
#include "SGCore/SGSenseGlovePose.h"
#include "SGCore/SGSenseGloveSensorData.h"
#include "SGKismet/SGBlueprintFunctionLibrary.h"
#include "SGTypes/SGVectorArray.h"
@@ -49,6 +45,8 @@ class USGDevice;
class USGHandInterpolator;
class USGHandPose;
class USGSenseGlove;
class USGSenseGlovePose;
class USGSenseGloveSensorData;
class USGSenseGloveSensorNormalizer;
/**
@@ -192,7 +190,7 @@ public:
*
* @remarks Use this when you already have a GlovePose.
*/
UFUNCTION(BlueprintCallable, DisplayName="Calculate Glove Pose", Category="SenseGlove | Core | SG | Sense Glove",
UFUNCTION(BlueprintCallable, DisplayName="Calculate Hand Pose", Category="SenseGlove | Core | SG | Sense Glove",
meta=(WorldContext="WorldContextObject"))
static void CalculateHandPose(
UObject* WorldContextObject,
@@ -43,8 +43,7 @@
class USGSenseGloveSensorNormalizer;
/**
* Interface for Nova 2.0 Gloves. A soft glove with detachable force-feedback and sensor module, and active contact
* feedback in the front strap.
* Acts as a sort of 'in between' handProfile. This class converts SG Dk1 Angles into 'normalized data' - between 0 .. 1.
*/
UCLASS(meta=(ScriptName = "SenseGloveSenseGloveSensorNormalizerKismetLibrary"))
class SENSEGLOVECOREKISMET_API USGSenseGloveSensorNormalizerKismetLibrary final : public USGBlueprintFunctionLibrary
@@ -126,7 +126,7 @@ public:
/**
* Generate a custom glove info.
*/
UFUNCTION(BlueprintCallable, DisplayName="GenerateGloveModel", Category="SenseGlove | Core | SG | Sense Glove Vars",
UFUNCTION(BlueprintCallable, DisplayName="Generate Glove Model", Category="SenseGlove | Core | SG | Sense Glove Vars",
meta=(WorldContext="WorldContextObject"))
static USGSenseGloveInfo* GenerateGloveModel_HV_FV_SFV_bRH(
UObject* WorldContextObject,
@@ -135,7 +135,7 @@ public:
/**
* Generate a custom glove info.
*/
UFUNCTION(BlueprintCallable, DisplayName="GenerateGloveModel", Category="SenseGlove | Core | SG | Sense Glove Vars",
UFUNCTION(BlueprintCallable, DisplayName="Generate Glove Model", Category="SenseGlove | Core | SG | Sense Glove Vars",
meta=(WorldContext="WorldContextObject"))
static USGSenseGloveInfo* GenerateGloveModel_HV_FV_SFV_bRH_CI(
UObject* WorldContextObject,
@@ -72,8 +72,7 @@ public:
/**
* Retrieve the threshold of a particular finger.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Haptics | Threshold Command",
meta=(WorldContext="WorldContextObject"))
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Haptics | Threshold Command")
static float GetThreshold(const USGThresholdCommand* ThresholdCommand, int32 Finger);
/**
@@ -96,11 +95,10 @@ public:
/**
* If true, the threshold on a finger should be active.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Haptics | Threshold Command",
meta=(WorldContext="WorldContextObject"))
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Haptics | Threshold Command")
static bool GetFingerActive(const USGThresholdCommand* ThresholdCommand, int32 Finger);
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Haptics | Threshold Command")
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Haptics | Threshold Command")
static TArray<bool> GetActiveFingers(const USGThresholdCommand* ThresholdCommand);
/**
@@ -132,7 +132,7 @@ public:
* Get the offset to get from the TrackedHardware to a SenseGlove mounting location. Combined with Glove-Mount
* offset to get the glove location.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get SenseGlove Tracker Mouunt Offset",
UFUNCTION(BlueprintCallable, DisplayName="Get SenseGlove Tracker Mount Offset",
Category="SenseGlove | Core | Tracking")
static void GetSenseGloveTrackerMountOffset_H_bRH_OutPO_FQuat_OutRO(
ESGPositionalTrackingHardware Hardware, bool bRightHanded,
@@ -142,7 +142,7 @@ public:
* Get the offset to get from the TrackedHardware to a SenseGlove mounting location. Combined with Glove-Mount
* offset to get the glove location.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get SenseGlove Tracker Mouunt Offset",
UFUNCTION(BlueprintCallable, DisplayName="Get SenseGlove Tracker Mount Offset",
Category="SenseGlove | Core | Tracking")
static void GetSenseGloveTrackerMountOffset_H_bRH_OutPO_FRotator_OutRO(
ESGPositionalTrackingHardware Hardware, bool bRightHanded,
@@ -197,14 +197,14 @@ public:
/**
* Rotational offset between Nova Glove Origin and Wrist.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Nove To Wrist Rotation Offset",
UFUNCTION(BlueprintCallable, DisplayName="Get Nova To Wrist Rotation Offset",
Category="SenseGlove | Core | Tracking")
static FQuat GetNovaToWristRotationOffset_FQuat();
/**
* Rotational offset between Nova Glove Origin and Wrist.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Nove To Wrist Rotation Offset",
UFUNCTION(BlueprintCallable, DisplayName="Get Nova To Wrist Rotation Offset",
Category="SenseGlove | Core | Tracking")
static FRotator GetNovaToWristRotationOffset_FRotator();
@@ -331,7 +331,7 @@ public:
/**
*
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Right Nova Quest Pro To To Attach Rotation",
UFUNCTION(BlueprintCallable, DisplayName="Get Right Nova Quest Pro To Attach Rotation",
Category="SenseGlove | Core | Tracking")
static FQuat GetRightNovaQuestProToAttachRotation_FQuat();
@@ -378,7 +378,7 @@ public:
/**
*
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Right Nova Vive Focus 3 To Attach Rotattion",
UFUNCTION(BlueprintCallable, DisplayName="Get Right Nova Vive Focus 3 To Attach Rotation",
Category="SenseGlove | Core | Tracking")
static FRotator GetRightNovaViveFocus3ToAttachRotation_FRotator();
@@ -50,6 +50,8 @@
#include "Misc/Optional.h"
#include "Misc/Timespan.h"
#include "OpenXRCore.h"
#include "Runtime/Launch/Resources/Version.h"
#include "UObject/Class.h"
#include "SGCore/SGHapticGlove.h"
#include "SGLog/SGLog.h"
@@ -60,7 +62,6 @@
#include "SGTypes/SGCoreTypes.h"
#include "SGTypes/SGTrackingTypes.h"
#include "SGUtils/SGEngineUtils.h"
#include "SGUtils/SGPluginUtils.h"
struct FSGXRTracker::FImpl
{
@@ -731,12 +732,10 @@ FName FSGXRTracker::FImpl::GetControllerHandEnumName(const EControllerHand Contr
FName FSGXRTracker::FImpl::GetOpenXRPositionalTrackingProviderEnumName(
const ESGOpenXRPositionalTrackingProvider OpenXRPositionalTrackingProvider)
{
static UEnum* EnumPtr{StaticEnum<ESGOpenXRPositionalTrackingProvider>()};
ensureAlwaysMsgf(EnumPtr, TEXT("Failed to find the ESGOpenXRPositionalTrackingProvider enum!"));
static const int32 EnumNameLength = FString{TEXT("ESGOpenXRPositionalTrackingProvider::")}.Len();
const FName EnumItemName{
EnumPtr->GetNameByValue(static_cast<int64>(OpenXRPositionalTrackingProvider))
UEnum::GetValueAsName(OpenXRPositionalTrackingProvider)
};
const FString EnumItemString{EnumItemName.ToString()};
const int32 EnumItemStringLength = EnumItemString.Len();
@@ -40,7 +40,6 @@
#include "IInputDevice.h"
#include "IOpenXRExtensionPlugin.h"
#include "Math/MathFwd.h"
#include "Runtime/Launch/Resources/Version.h"
#include "Templates/UniquePtr.h"
#include "UObject/NameTypes.h"
#include "XRMotionControllerBase.h"
@@ -38,6 +38,8 @@
#include "HAL/Platform.h"
#include "UObject/ObjectMacros.h"
#include "SGCoreTypes.generated.h"
UENUM(BlueprintType)
enum class ESGBackendType : uint8
{
@@ -46,6 +48,9 @@ enum class ESGBackendType : uint8
/* Back-end info comes from shared memory on the device. */
SharedMemory UMETA(DisplayName = "Shared Memory"),
/* Back-end data comes from an Android library. */
AndroidStrings,
};
/* Connection type of this device, as detected by the SGConnect library. */
@@ -39,6 +39,8 @@
#include "HAL/Platform.h"
#include "UObject/ObjectMacros.h"
#include "SGDebugTypes.generated.h"
/**
* Determines the debug virtual hand drawing mode.
*/
@@ -38,6 +38,8 @@
#include "HAL/Platform.h"
#include "UObject/ObjectMacros.h"
#include "SGTrackingTypes.generated.h"
/**
* The Head-mounted Display device enum to determine the HMD device type.
*/
@@ -38,6 +38,8 @@
#include "HAL/Platform.h"
#include "UObject/ObjectMacros.h"
#include "SGTypes.generated.h"
/**
* The engine scalability settings.
*/
@@ -51,31 +51,13 @@ public class SGBleThirdPartyLibs : ModuleRules
string LibraryPathAnroidX64 = "";
string LibraryName = "sgble";
bool bIsAndroid = Target.IsInPlatformGroup(UnrealPlatformGroup.Android);
bool bIsLinux = Target.Platform == UnrealTargetPlatform.Linux;
bool bIsLinuxArm64 = Target.Platform == UnrealTargetPlatform.LinuxArm64;
bool bIsWin64 = Target.IsInPlatformGroup(UnrealPlatformGroup.Windows) &&
Target.WindowsPlatform.Architecture == UnrealArch.X64;
bool bIsDebugBuild = (Target.Configuration == UnrealTargetConfiguration.Debug);
if (bIsAndroid)
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "android"));
#if UE_5_6_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "r27c"));
#elif UE_5_5_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "r25b"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
LibraryPathAnroidAArch64 = Path.GetFullPath(Path.Combine(LibraryPath, "aarch64"));
LibraryPathAnroidX64 = Path.GetFullPath(Path.Combine(LibraryPath, "x86-64"));
LibraryName = string.Format("lib{0}.a", LibraryName);
}
else if (bIsLinux)
if (bIsLinux)
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "linux"));
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "rustc"));
@@ -107,40 +89,18 @@ public class SGBleThirdPartyLibs : ModuleRules
string IncludePath = Path.GetFullPath(Path.Combine(ThirdPartyDirectory, "include"));
PrivateIncludePaths.Add(IncludePath);
if (bIsAndroid)
if (bIsDebugBuild)
{
if (bIsDebugBuild)
{
LibraryPathAnroidAArch64 = Path.GetFullPath(Path.Combine(LibraryPathAnroidAArch64, "debug"));
LibraryPathAnroidX64 = Path.GetFullPath(Path.Combine(LibraryPathAnroidX64, "debug"));
}
else
{
LibraryPathAnroidAArch64 = Path.GetFullPath(Path.Combine(LibraryPathAnroidAArch64, "release"));
LibraryPathAnroidX64 = Path.GetFullPath(Path.Combine(LibraryPathAnroidX64, "release"));
}
LibraryPathAnroidAArch64 = Path.GetFullPath(Path.Combine(LibraryPathAnroidAArch64, LibraryName));
LibraryPathAnroidX64 = Path.GetFullPath(Path.Combine(LibraryPathAnroidX64, LibraryName));
PublicAdditionalLibraries.Add(LibraryPathAnroidAArch64);
PublicAdditionalLibraries.Add(LibraryPathAnroidX64);
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "debug"));
}
else
{
if (bIsDebugBuild)
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "debug"));
}
else
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "release"));
}
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, LibraryName));
PublicAdditionalLibraries.Add(LibraryPath);
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "release"));
}
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, LibraryName));
PublicAdditionalLibraries.Add(LibraryPath);
if (bIsWin64)
{
PublicAdditionalLibraries.AddRange(new string[]
@@ -116,8 +116,25 @@ public class SGCommonThirdPartyLibs : ModuleRules
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "windows"));
switch (Target.WindowsPlatform.Compiler)
{
#if UE_5_7_OR_LATER
case WindowsCompiler.VisualStudio2026:
#if UE_5_8_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v145-1450"));
#elif UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
break;
#endif
case WindowsCompiler.VisualStudio2022:
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143"));
#if UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
#elif UE_5_5_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1438"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
break;
default:
Debug.Assert(false, "Unsupported engine version or compiler!");
@@ -47,35 +47,15 @@ public class SGConnectShmThirdPartyLibs : ModuleRules
string ThirdPartyDirectory = Path.GetFullPath(Path.Combine(ModuleDirectory, ".."));
string LibraryPath = Path.GetFullPath(Path.Combine(ThirdPartyDirectory, "lib"));
string LibraryPathAnroidAArch64 = "";
string LibraryPathAnroidX64 = "";
string LibraryName = "sgconnectshm";
bool bIsAndroid = Target.IsInPlatformGroup(UnrealPlatformGroup.Android);
bool bIsLinux = Target.Platform == UnrealTargetPlatform.Linux;
bool bIsLinuxArm64 = Target.Platform == UnrealTargetPlatform.LinuxArm64;
bool bIsWin64 = Target.IsInPlatformGroup(UnrealPlatformGroup.Windows) &&
Target.WindowsPlatform.Architecture == UnrealArch.X64;
bool bIsDebugBuild = (Target.Configuration == UnrealTargetConfiguration.Debug);
if (bIsAndroid)
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "android"));
#if UE_5_6_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "r27c"));
#elif UE_5_5_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "r25b"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
LibraryPathAnroidAArch64 = Path.GetFullPath(Path.Combine(LibraryPath, "aarch64"));
LibraryPathAnroidX64 = Path.GetFullPath(Path.Combine(LibraryPath, "x86-64"));
LibraryName = string.Format("lib{0}.a", LibraryName);
}
else if (bIsLinux)
if (bIsLinux)
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "linux"));
@@ -116,8 +96,25 @@ public class SGConnectShmThirdPartyLibs : ModuleRules
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "windows"));
switch (Target.WindowsPlatform.Compiler)
{
#if UE_5_7_OR_LATER
case WindowsCompiler.VisualStudio2026:
#if UE_5_8_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v145-1450"));
#elif UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
break;
#endif
case WindowsCompiler.VisualStudio2022:
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143"));
#if UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
#elif UE_5_5_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1438"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
break;
default:
Debug.Assert(false, "Unsupported engine version or compiler!");
@@ -136,38 +133,16 @@ public class SGConnectShmThirdPartyLibs : ModuleRules
string IncludePath = Path.GetFullPath(Path.Combine(ThirdPartyDirectory, "include"));
PrivateIncludePaths.Add(IncludePath);
if (bIsAndroid)
if (bIsDebugBuild)
{
if (bIsDebugBuild)
{
LibraryPathAnroidAArch64 = Path.GetFullPath(Path.Combine(LibraryPathAnroidAArch64, "debug"));
LibraryPathAnroidX64 = Path.GetFullPath(Path.Combine(LibraryPathAnroidX64, "debug"));
}
else
{
LibraryPathAnroidAArch64 = Path.GetFullPath(Path.Combine(LibraryPathAnroidAArch64, "release"));
LibraryPathAnroidX64 = Path.GetFullPath(Path.Combine(LibraryPathAnroidX64, "release"));
}
LibraryPathAnroidAArch64 = Path.GetFullPath(Path.Combine(LibraryPathAnroidAArch64, LibraryName));
LibraryPathAnroidX64 = Path.GetFullPath(Path.Combine(LibraryPathAnroidX64, LibraryName));
PublicAdditionalLibraries.Add(LibraryPathAnroidAArch64);
PublicAdditionalLibraries.Add(LibraryPathAnroidX64);
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "debug"));
}
else
{
if (bIsDebugBuild)
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "debug"));
}
else
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "release"));
}
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, LibraryName));
PublicAdditionalLibraries.Add(LibraryPath);
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "release"));
}
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, LibraryName));
PublicAdditionalLibraries.Add(LibraryPath);
}
}
@@ -116,8 +116,25 @@ public class SGConnectThirdPartyLibs : ModuleRules
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "windows"));
switch (Target.WindowsPlatform.Compiler)
{
#if UE_5_7_OR_LATER
case WindowsCompiler.VisualStudio2026:
#if UE_5_8_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v145-1450"));
#elif UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
break;
#endif
case WindowsCompiler.VisualStudio2022:
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143"));
#if UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
#elif UE_5_5_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1438"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
break;
default:
Debug.Assert(false, "Unsupported engine version or compiler!");
@@ -47,35 +47,15 @@ public class SGCoreShmThirdPartyLibs : ModuleRules
string ThirdPartyDirectory = Path.GetFullPath(Path.Combine(ModuleDirectory, ".."));
string LibraryPath = Path.GetFullPath(Path.Combine(ThirdPartyDirectory, "lib"));
string LibraryPathAnroidAArch64 = "";
string LibraryPathAnroidX64 = "";
string LibraryName = "sgcoreshm";
bool bIsAndroid = Target.IsInPlatformGroup(UnrealPlatformGroup.Android);
bool bIsLinux = Target.Platform == UnrealTargetPlatform.Linux;
bool bIsLinuxArm64 = Target.Platform == UnrealTargetPlatform.LinuxArm64;
bool bIsWin64 = Target.IsInPlatformGroup(UnrealPlatformGroup.Windows) &&
Target.WindowsPlatform.Architecture == UnrealArch.X64;
bool bIsDebugBuild = (Target.Configuration == UnrealTargetConfiguration.Debug);
if (bIsAndroid)
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "android"));
#if UE_5_6_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "r27c"));
#elif UE_5_5_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "r25b"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
LibraryPathAnroidAArch64 = Path.GetFullPath(Path.Combine(LibraryPath, "aarch64"));
LibraryPathAnroidX64 = Path.GetFullPath(Path.Combine(LibraryPath, "x86-64"));
LibraryName = string.Format("lib{0}.a", LibraryName);
}
else if (bIsLinux)
if (bIsLinux)
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "linux"));
@@ -116,8 +96,25 @@ public class SGCoreShmThirdPartyLibs : ModuleRules
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "windows"));
switch (Target.WindowsPlatform.Compiler)
{
#if UE_5_7_OR_LATER
case WindowsCompiler.VisualStudio2026:
#if UE_5_8_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v145-1450"));
#elif UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
break;
#endif
case WindowsCompiler.VisualStudio2022:
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143"));
#if UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
#elif UE_5_5_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1438"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
break;
default:
Debug.Assert(false, "Unsupported engine version or compiler!");
@@ -136,38 +133,16 @@ public class SGCoreShmThirdPartyLibs : ModuleRules
string IncludePath = Path.GetFullPath(Path.Combine(ThirdPartyDirectory, "include"));
PrivateIncludePaths.Add(IncludePath);
if (bIsAndroid)
if (bIsDebugBuild)
{
if (bIsDebugBuild)
{
LibraryPathAnroidAArch64 = Path.GetFullPath(Path.Combine(LibraryPathAnroidAArch64, "debug"));
LibraryPathAnroidX64 = Path.GetFullPath(Path.Combine(LibraryPathAnroidX64, "debug"));
}
else
{
LibraryPathAnroidAArch64 = Path.GetFullPath(Path.Combine(LibraryPathAnroidAArch64, "release"));
LibraryPathAnroidX64 = Path.GetFullPath(Path.Combine(LibraryPathAnroidX64, "release"));
}
LibraryPathAnroidAArch64 = Path.GetFullPath(Path.Combine(LibraryPathAnroidAArch64, LibraryName));
LibraryPathAnroidX64 = Path.GetFullPath(Path.Combine(LibraryPathAnroidX64, LibraryName));
PublicAdditionalLibraries.Add(LibraryPathAnroidAArch64);
PublicAdditionalLibraries.Add(LibraryPathAnroidX64);
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "debug"));
}
else
{
if (bIsDebugBuild)
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "debug"));
}
else
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "release"));
}
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, LibraryName));
PublicAdditionalLibraries.Add(LibraryPath);
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "release"));
}
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, LibraryName));
PublicAdditionalLibraries.Add(LibraryPath);
}
}
@@ -116,8 +116,25 @@ public class SGCoreThirdPartyLibs : ModuleRules
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "windows"));
switch (Target.WindowsPlatform.Compiler)
{
#if UE_5_7_OR_LATER
case WindowsCompiler.VisualStudio2026:
#if UE_5_8_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v145-1450"));
#elif UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
break;
#endif
case WindowsCompiler.VisualStudio2022:
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143"));
#if UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
#elif UE_5_5_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1438"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
break;
default:
Debug.Assert(false, "Unsupported engine version or compiler!");
@@ -0,0 +1,148 @@
/**
* @file
*
* @author Mamadou Babaei <mamadou@senseglove.com>
*
* @section LICENSE
*
* (The MIT License)
*
* Copyright (c) 2020 - 2026 SenseGlove
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* @section DESCRIPTION
*
*
*/
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using UnrealBuildTool;
public class SGFakeShmThirdPartyLibs : ModuleRules
{
public SGFakeShmThirdPartyLibs(ReadOnlyTargetRules Target) : base(Target)
{
Type = ModuleType.External;
string ThirdPartyDirectory = Path.GetFullPath(Path.Combine(ModuleDirectory, ".."));
string LibraryPath = Path.GetFullPath(Path.Combine(ThirdPartyDirectory, "lib"));
string LibraryName = "sgfakeshm";
bool bIsLinux = Target.Platform == UnrealTargetPlatform.Linux;
bool bIsLinuxArm64 = Target.Platform == UnrealTargetPlatform.LinuxArm64;
bool bIsWin64 = Target.IsInPlatformGroup(UnrealPlatformGroup.Windows) &&
Target.WindowsPlatform.Architecture == UnrealArch.X64;
bool bIsDebugBuild = (Target.Configuration == UnrealTargetConfiguration.Debug);
if (bIsLinux)
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "linux"));
#if UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v26"));
#elif UE_5_6_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v25"));
#elif UE_5_5_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v23"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "x86-64"));
LibraryName = string.Format("lib{0}.a", LibraryName);
}
else if (bIsLinuxArm64)
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "linux"));
#if UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v26"));
#elif UE_5_6_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v25"));
#elif UE_5_5_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v23"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "aarch64"));
LibraryName = string.Format("lib{0}.a", LibraryName);
}
else if (bIsWin64)
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "windows"));
switch (Target.WindowsPlatform.Compiler)
{
#if UE_5_7_OR_LATER
case WindowsCompiler.VisualStudio2026:
#if UE_5_8_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v145-1450"));
#elif UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
break;
#endif
case WindowsCompiler.VisualStudio2022:
#if UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
#elif UE_5_5_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1438"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
break;
default:
Debug.Assert(false, "Unsupported engine version or compiler!");
break;
}
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "x86-64"));
LibraryName = string.Format("{0}.lib", LibraryName);
}
else
{
Debug.Assert(false, "Unsupported platform!");
}
string IncludePath = Path.GetFullPath(Path.Combine(ThirdPartyDirectory, "include"));
PrivateIncludePaths.Add(IncludePath);
if (bIsDebugBuild)
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "debug"));
}
else
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "release"));
}
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, LibraryName));
PublicAdditionalLibraries.Add(LibraryPath);
}
}
@@ -0,0 +1,148 @@
/**
* @file
*
* @author Mamadou Babaei <mamadou@senseglove.com>
*
* @section LICENSE
*
* (The MIT License)
*
* Copyright (c) 2020 - 2026 SenseGlove
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* @section DESCRIPTION
*
*
*/
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using UnrealBuildTool;
public class SGFlatBuffersThirdPartyLibs : ModuleRules
{
public SGFlatBuffersThirdPartyLibs(ReadOnlyTargetRules Target) : base(Target)
{
Type = ModuleType.External;
string ThirdPartyDirectory = Path.GetFullPath(Path.Combine(ModuleDirectory, ".."));
string LibraryPath = Path.GetFullPath(Path.Combine(ThirdPartyDirectory, "lib"));
string LibraryName = "flatbuffers";
bool bIsLinux = Target.Platform == UnrealTargetPlatform.Linux;
bool bIsLinuxArm64 = Target.Platform == UnrealTargetPlatform.LinuxArm64;
bool bIsWin64 = Target.IsInPlatformGroup(UnrealPlatformGroup.Windows) &&
Target.WindowsPlatform.Architecture == UnrealArch.X64;
bool bIsDebugBuild = (Target.Configuration == UnrealTargetConfiguration.Debug);
if (bIsLinux)
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "linux"));
#if UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v26"));
#elif UE_5_6_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v25"));
#elif UE_5_5_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v23"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "x86-64"));
LibraryName = string.Format("lib{0}.a", LibraryName);
}
else if (bIsLinuxArm64)
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "linux"));
#if UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v26"));
#elif UE_5_6_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v25"));
#elif UE_5_5_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v23"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "aarch64"));
LibraryName = string.Format("lib{0}.a", LibraryName);
}
else if (bIsWin64)
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "windows"));
switch (Target.WindowsPlatform.Compiler)
{
#if UE_5_7_OR_LATER
case WindowsCompiler.VisualStudio2026:
#if UE_5_8_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v145-1450"));
#elif UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
break;
#endif
case WindowsCompiler.VisualStudio2022:
#if UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
#elif UE_5_5_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1438"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
break;
default:
Debug.Assert(false, "Unsupported engine version or compiler!");
break;
}
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "x86-64"));
LibraryName = string.Format("{0}.lib", LibraryName);
}
else
{
Debug.Assert(false, "Unsupported platform!");
}
string IncludePath = Path.GetFullPath(Path.Combine(ThirdPartyDirectory, "include"));
PrivateIncludePaths.Add(IncludePath);
if (bIsDebugBuild)
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "debug"));
}
else
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "release"));
}
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, LibraryName));
PublicAdditionalLibraries.Add(LibraryPath);
}
}
@@ -121,8 +121,25 @@ public class SGFmtThirdPartyLibs : ModuleRules
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "windows"));
switch (Target.WindowsPlatform.Compiler)
{
#if UE_5_7_OR_LATER
case WindowsCompiler.VisualStudio2026:
#if UE_5_8_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v145-1450"));
#elif UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
break;
#endif
case WindowsCompiler.VisualStudio2022:
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143"));
#if UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
#elif UE_5_5_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1438"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
break;
default:
Debug.Assert(false, "Unsupported engine version or compiler!");
@@ -116,8 +116,25 @@ public class SGLogThirdPartyLibs : ModuleRules
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "windows"));
switch (Target.WindowsPlatform.Compiler)
{
#if UE_5_7_OR_LATER
case WindowsCompiler.VisualStudio2026:
#if UE_5_8_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v145-1450"));
#elif UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
break;
#endif
case WindowsCompiler.VisualStudio2022:
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143"));
#if UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
#elif UE_5_5_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1438"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
break;
default:
Debug.Assert(false, "Unsupported engine version or compiler!");
@@ -121,8 +121,25 @@ public class SGLoguruThirdPartyLibs : ModuleRules
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "windows"));
switch (Target.WindowsPlatform.Compiler)
{
#if UE_5_7_OR_LATER
case WindowsCompiler.VisualStudio2026:
#if UE_5_8_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v145-1450"));
#elif UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
break;
#endif
case WindowsCompiler.VisualStudio2022:
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143"));
#if UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
#elif UE_5_5_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1438"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
break;
default:
Debug.Assert(false, "Unsupported engine version or compiler!");
@@ -0,0 +1,148 @@
/**
* @file
*
* @author Mamadou Babaei <mamadou@senseglove.com>
*
* @section LICENSE
*
* (The MIT License)
*
* Copyright (c) 2020 - 2026 SenseGlove
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* @section DESCRIPTION
*
*
*/
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using UnrealBuildTool;
public class SGNngThirdPartyLibs : ModuleRules
{
public SGNngThirdPartyLibs(ReadOnlyTargetRules Target) : base(Target)
{
Type = ModuleType.External;
string ThirdPartyDirectory = Path.GetFullPath(Path.Combine(ModuleDirectory, ".."));
string LibraryPath = Path.GetFullPath(Path.Combine(ThirdPartyDirectory, "lib"));
string LibraryName = "nng";
bool bIsLinux = Target.Platform == UnrealTargetPlatform.Linux;
bool bIsLinuxArm64 = Target.Platform == UnrealTargetPlatform.LinuxArm64;
bool bIsWin64 = Target.IsInPlatformGroup(UnrealPlatformGroup.Windows) &&
Target.WindowsPlatform.Architecture == UnrealArch.X64;
bool bIsDebugBuild = (Target.Configuration == UnrealTargetConfiguration.Debug);
if (bIsLinux)
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "linux"));
#if UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v26"));
#elif UE_5_6_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v25"));
#elif UE_5_5_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v23"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "x86-64"));
LibraryName = string.Format("lib{0}.a", LibraryName);
}
else if (bIsLinuxArm64)
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "linux"));
#if UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v26"));
#elif UE_5_6_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v25"));
#elif UE_5_5_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v23"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "aarch64"));
LibraryName = string.Format("lib{0}.a", LibraryName);
}
else if (bIsWin64)
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "windows"));
switch (Target.WindowsPlatform.Compiler)
{
#if UE_5_7_OR_LATER
case WindowsCompiler.VisualStudio2026:
#if UE_5_8_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v145-1450"));
#elif UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
break;
#endif
case WindowsCompiler.VisualStudio2022:
#if UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
#elif UE_5_5_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1438"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
break;
default:
Debug.Assert(false, "Unsupported engine version or compiler!");
break;
}
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "x86-64"));
LibraryName = string.Format("{0}.lib", LibraryName);
}
else
{
Debug.Assert(false, "Unsupported platform!");
}
string IncludePath = Path.GetFullPath(Path.Combine(ThirdPartyDirectory, "include"));
PrivateIncludePaths.Add(IncludePath);
if (bIsDebugBuild)
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "debug"));
}
else
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "release"));
}
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, LibraryName));
PublicAdditionalLibraries.Add(LibraryPath);
}
}
@@ -0,0 +1,155 @@
/**
* @file
*
* @author Mamadou Babaei <mamadou@senseglove.com>
*
* @section LICENSE
*
* (The MIT License)
*
* Copyright (c) 2020 - 2026 SenseGlove
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* @section DESCRIPTION
*
*
*/
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using UnrealBuildTool;
public class SGRapidYamlThirdPartyLibs : ModuleRules
{
public SGRapidYamlThirdPartyLibs(ReadOnlyTargetRules Target) : base(Target)
{
Type = ModuleType.External;
string ThirdPartyDirectory = Path.GetFullPath(Path.Combine(ModuleDirectory, ".."));
string LibraryPath = Path.GetFullPath(Path.Combine(ThirdPartyDirectory, "lib"));
string C4CoreLibraryName = "c4core";
string RymlLibraryName = "ryml";
bool bIsLinux = Target.Platform == UnrealTargetPlatform.Linux;
bool bIsLinuxArm64 = Target.Platform == UnrealTargetPlatform.LinuxArm64;
bool bIsWin64 = Target.IsInPlatformGroup(UnrealPlatformGroup.Windows) &&
Target.WindowsPlatform.Architecture == UnrealArch.X64;
bool bIsDebugBuild = (Target.Configuration == UnrealTargetConfiguration.Debug);
if (bIsLinux)
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "linux"));
#if UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v26"));
#elif UE_5_6_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v25"));
#elif UE_5_5_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v23"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "x86-64"));
C4CoreLibraryName = string.Format("lib{0}.a", C4CoreLibraryName);
RymlLibraryName = string.Format("lib{0}.a", RymlLibraryName);
}
else if (bIsLinuxArm64)
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "linux"));
#if UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v26"));
#elif UE_5_6_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v25"));
#elif UE_5_5_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v23"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "aarch64"));
C4CoreLibraryName = string.Format("lib{0}.a", C4CoreLibraryName);
RymlLibraryName = string.Format("lib{0}.a", RymlLibraryName);
}
else if (bIsWin64)
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "windows"));
switch (Target.WindowsPlatform.Compiler)
{
#if UE_5_7_OR_LATER
case WindowsCompiler.VisualStudio2026:
#if UE_5_8_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v145-1450"));
#elif UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
break;
#endif
case WindowsCompiler.VisualStudio2022:
#if UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
#elif UE_5_5_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1438"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
break;
default:
Debug.Assert(false, "Unsupported engine version or compiler!");
break;
}
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "x86-64"));
C4CoreLibraryName = string.Format("{0}.lib", C4CoreLibraryName);
RymlLibraryName = string.Format("{0}.lib", RymlLibraryName);
}
else
{
Debug.Assert(false, "Unsupported platform!");
}
string IncludePath = Path.GetFullPath(Path.Combine(ThirdPartyDirectory, "include"));
PrivateIncludePaths.Add(IncludePath);
if (bIsDebugBuild)
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "debug"));
}
else
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "release"));
}
string C4CoreLibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, C4CoreLibraryName));
PublicAdditionalLibraries.Add(C4CoreLibraryPath);
string RymlLibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, RymlLibraryName));
PublicAdditionalLibraries.Add(RymlLibraryPath);
}
}
@@ -47,35 +47,15 @@ public class SGSerialThirdPartyLibs : ModuleRules
string ThirdPartyDirectory = Path.GetFullPath(Path.Combine(ModuleDirectory, ".."));
string LibraryPath = Path.GetFullPath(Path.Combine(ThirdPartyDirectory, "lib"));
string LibraryPathAnroidAArch64 = "";
string LibraryPathAnroidX64 = "";
string LibraryName = "sgserial";
bool bIsAndroid = Target.IsInPlatformGroup(UnrealPlatformGroup.Android);
bool bIsLinux = Target.Platform == UnrealTargetPlatform.Linux;
bool bIsLinuxArm64 = Target.Platform == UnrealTargetPlatform.LinuxArm64;
bool bIsWin64 = Target.IsInPlatformGroup(UnrealPlatformGroup.Windows) &&
Target.WindowsPlatform.Architecture == UnrealArch.X64;
bool bIsDebugBuild = (Target.Configuration == UnrealTargetConfiguration.Debug);
if (bIsAndroid)
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "android"));
#if UE_5_6_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "r27c"));
#elif UE_5_5_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "r25b"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
LibraryPathAnroidAArch64 = Path.GetFullPath(Path.Combine(LibraryPath, "aarch64"));
LibraryPathAnroidX64 = Path.GetFullPath(Path.Combine(LibraryPath, "x86-64"));
LibraryName = string.Format("lib{0}.a", LibraryName);
}
else if (bIsLinux)
if (bIsLinux)
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "linux"));
@@ -116,8 +96,25 @@ public class SGSerialThirdPartyLibs : ModuleRules
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "windows"));
switch (Target.WindowsPlatform.Compiler)
{
#if UE_5_7_OR_LATER
case WindowsCompiler.VisualStudio2026:
#if UE_5_8_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v145-1450"));
#elif UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
break;
#endif
case WindowsCompiler.VisualStudio2022:
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143"));
#if UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
#elif UE_5_5_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1438"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
break;
default:
Debug.Assert(false, "Unsupported engine version or compiler!");
@@ -136,38 +133,16 @@ public class SGSerialThirdPartyLibs : ModuleRules
string IncludePath = Path.GetFullPath(Path.Combine(ThirdPartyDirectory, "include"));
PrivateIncludePaths.Add(IncludePath);
if (bIsAndroid)
if (bIsDebugBuild)
{
if (bIsDebugBuild)
{
LibraryPathAnroidAArch64 = Path.GetFullPath(Path.Combine(LibraryPathAnroidAArch64, "debug"));
LibraryPathAnroidX64 = Path.GetFullPath(Path.Combine(LibraryPathAnroidX64, "debug"));
}
else
{
LibraryPathAnroidAArch64 = Path.GetFullPath(Path.Combine(LibraryPathAnroidAArch64, "release"));
LibraryPathAnroidX64 = Path.GetFullPath(Path.Combine(LibraryPathAnroidX64, "release"));
}
LibraryPathAnroidAArch64 = Path.GetFullPath(Path.Combine(LibraryPathAnroidAArch64, LibraryName));
LibraryPathAnroidX64 = Path.GetFullPath(Path.Combine(LibraryPathAnroidX64, LibraryName));
PublicAdditionalLibraries.Add(LibraryPathAnroidAArch64);
PublicAdditionalLibraries.Add(LibraryPathAnroidX64);
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "debug"));
}
else
{
if (bIsDebugBuild)
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "debug"));
}
else
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "release"));
}
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, LibraryName));
PublicAdditionalLibraries.Add(LibraryPath);
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "release"));
}
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, LibraryName));
PublicAdditionalLibraries.Add(LibraryPath);
}
}
@@ -47,35 +47,15 @@ public class SGWjwwoodSerialThirdPartyLibs : ModuleRules
string ThirdPartyDirectory = Path.GetFullPath(Path.Combine(ModuleDirectory, ".."));
string LibraryPath = Path.GetFullPath(Path.Combine(ThirdPartyDirectory, "lib"));
string LibraryPathAnroidAArch64 = "";
string LibraryPathAnroidX64 = "";
string LibraryName = "serial";
bool bIsAndroid = Target.IsInPlatformGroup(UnrealPlatformGroup.Android);
bool bIsLinux = Target.Platform == UnrealTargetPlatform.Linux;
bool bIsLinuxArm64 = Target.Platform == UnrealTargetPlatform.LinuxArm64;
bool bIsWin64 = Target.IsInPlatformGroup(UnrealPlatformGroup.Windows) &&
Target.WindowsPlatform.Architecture == UnrealArch.X64;
bool bIsDebugBuild = (Target.Configuration == UnrealTargetConfiguration.Debug);
if (bIsAndroid)
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "android"));
#if UE_5_6_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "r27c"));
#elif UE_5_5_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "r25b"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
LibraryPathAnroidAArch64 = Path.GetFullPath(Path.Combine(LibraryPath, "aarch64"));
LibraryPathAnroidX64 = Path.GetFullPath(Path.Combine(LibraryPath, "x86-64"));
LibraryName = string.Format("lib{0}.a", LibraryName);
}
else if (bIsLinux)
if (bIsLinux)
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "linux"));
@@ -116,8 +96,25 @@ public class SGWjwwoodSerialThirdPartyLibs : ModuleRules
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "windows"));
switch (Target.WindowsPlatform.Compiler)
{
#if UE_5_7_OR_LATER
case WindowsCompiler.VisualStudio2026:
#if UE_5_8_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v145-1450"));
#elif UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
break;
#endif
case WindowsCompiler.VisualStudio2022:
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143"));
#if UE_5_7_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
#elif UE_5_5_OR_LATER
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1438"));
#else
Debug.Assert(false, "Unsupported engine version or compiler!");
#endif
break;
default:
Debug.Assert(false, "Unsupported engine version or compiler!");
@@ -136,38 +133,16 @@ public class SGWjwwoodSerialThirdPartyLibs : ModuleRules
string IncludePath = Path.GetFullPath(Path.Combine(ThirdPartyDirectory, "include"));
PrivateIncludePaths.Add(IncludePath);
if (bIsAndroid)
if (bIsDebugBuild)
{
if (bIsDebugBuild)
{
LibraryPathAnroidAArch64 = Path.GetFullPath(Path.Combine(LibraryPathAnroidAArch64, "debug"));
LibraryPathAnroidX64 = Path.GetFullPath(Path.Combine(LibraryPathAnroidX64, "debug"));
}
else
{
LibraryPathAnroidAArch64 = Path.GetFullPath(Path.Combine(LibraryPathAnroidAArch64, "release"));
LibraryPathAnroidX64 = Path.GetFullPath(Path.Combine(LibraryPathAnroidX64, "release"));
}
LibraryPathAnroidAArch64 = Path.GetFullPath(Path.Combine(LibraryPathAnroidAArch64, LibraryName));
LibraryPathAnroidX64 = Path.GetFullPath(Path.Combine(LibraryPathAnroidX64, LibraryName));
PublicAdditionalLibraries.Add(LibraryPathAnroidAArch64);
PublicAdditionalLibraries.Add(LibraryPathAnroidX64);
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "debug"));
}
else
{
if (bIsDebugBuild)
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "debug"));
}
else
{
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "release"));
}
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, LibraryName));
PublicAdditionalLibraries.Add(LibraryPath);
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "release"));
}
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, LibraryName));
PublicAdditionalLibraries.Add(LibraryPath);
}
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More