Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cc4ec2c9e9
|
||
|
|
f32450a948
|
||
|
|
8d307f32a4
|
||
|
|
f971cbdb6e
|
||
|
|
88ef165191
|
||
|
|
b558b90889
|
||
|
|
19893dc167
|
||
|
|
d4440fbe16
|
||
|
|
9515ed01d1
|
||
|
|
1714f25b46
|
||
|
|
bf90a9d9fb
|
||
|
|
9160b22e31
|
||
|
|
c78dd0fd86
|
||
|
|
4e362468cc
|
||
|
|
7352089aab
|
||
|
|
9427506851
|
||
|
|
f493e5b0fe
|
||
|
|
5ffbaa9a66
|
||
|
|
0f04fea5c2
|
||
|
|
350d6bac44
|
||
|
|
7c3c0bd6a9
|
||
|
|
dbd0dd23d2
|
||
|
|
848dc5545a
|
||
|
|
aeccb102eb
|
||
|
|
57718c9594
|
||
|
|
bbf98fc1ac
|
||
|
|
462db47578
|
||
|
|
a1e23f430a
|
||
|
|
77b89fc0a3
|
||
|
|
c98f16a28a
|
||
|
|
2724a8dc7f
|
||
|
|
d380fea8da
|
||
|
|
9208adf7c7
|
||
|
|
585f035dfb
|
||
|
|
6fbe4df85c
|
||
|
|
f2b0aa5b63
|
||
|
|
4c6861b850
|
||
|
|
c6dbe1df13
|
||
|
|
abc3a145b5
|
||
|
|
9c4cc7ab13
|
||
|
|
f0beaf1f96
|
||
|
|
18f1d22321
|
||
|
|
9f04f41644
|
||
|
|
b40babc9ee
|
||
|
|
88d3dfa444
|
||
|
|
f74b31a65a
|
||
|
|
f4bfba18f7
|
@@ -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
|
||||
@@ -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
@@ -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,141 @@ 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.2] - 2026-07-21
|
||||
|
||||
This patch release attempts to resolve Microsoft Windows/MSVC build issues affecting Unreal Engine `5.8` Fab Store submissions for the `v2.9.x` release series.
|
||||
|
||||
### Fixed
|
||||
|
||||
- Another attempt at resolving build issues that affect Fab Store submissions caused by the following toolset mismatch: `MSIL .netmodule or module compiled with /GL found; restarting link with /LTCG; add /LTCG to the link command line to improve linker performance fatal error C1900: Il mismatch between 'P1' version '20250730' and 'P2' version '20240319'; LINK : fatal error LNK1257: code generation failed`.
|
||||
|
||||
### Changed
|
||||
|
||||
- Now, instead of forcing specific Windows binaries built with any specific MSVC toolset for third-party libraries based on the engine version, the third-party modules' `.Build.cs` files directly check the compiler version and select the corresponding binaries built for that specific toolset. The reason for enforcing this behavior is that, for UE `5.8` Fab builds, Fab Store appears to build its binaries against `v143: 14.44.35207` rather than `v145: 14.50.35717` when both toolsets are installed simultaneously. On local UE installations, when only `v143: 14.44.35207` is installed, the build can similarly fail due to a toolset mismatch. As a result, from this release onwards, the enforced binary selection behavior will be the default on all supported engine versions.
|
||||
- Bumped the SenseGlove libraries to `v2.400.5-0e7a41d01`.
|
||||
- Updated 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 `v2.400.5-0e7a41d01`.
|
||||
|
||||
## [2.9.1] - 2026-07-17
|
||||
|
||||
This patch release addresses `v2.9.x` build issues on Microsoft Windows and MSVC.
|
||||
|
||||
### Fixed
|
||||
|
||||
- Attempt at fixing build issues in certain MSVC configurations that also affects Fab Store submissions due to: `MSIL .netmodule or module compiled with /GL found; restarting link with /LTCG; add /LTCG to the link command line to improve linker performance fatal error C1900: Il mismatch between 'P1' version '20250730' and 'P2' version '20240319'; LINK : fatal error LNK1257: code generation failed`.
|
||||
- Fix `ThirdParty/SGBleThirdPartyLibs`'s module `.Build.cs` warnings.
|
||||
|
||||
### Changed
|
||||
|
||||
- Bumped the SenseGlove libraries to `v2.400.3-28889647d`.
|
||||
- Updated 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 `v2.400.3-28889647d`.
|
||||
|
||||
## [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 +298,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.2 | ✅ v2.9.2 |
|
||||
| **5.7** | ❌ | ❌ | ✅ v2.9.x | ✅ v2.9.x | ✅ v2.9.x | ✅ v2.9.x | ✅ v2.9.x (r25b) | ❓ | ✅ v2.9.2 | ✅ v2.9.2 |
|
||||
| **5.6** | ❌ | ❌ | ✅ v2.9.x | ❌ | ✅ v2.9.x | ✅ v2.9.x | ✅ v2.9.x (r25b) | ❓ | ✅ v2.9.2 | ✅ v2.9.2 |
|
||||
| **5.5** | ❌ | ❌ | ⚠️ v2.9.x | ❌ | ⚠️ v2.9.x | ⚠️ v2.9.x | ⚠️ v2.9.x (r25b) | ❓ | ⚠️ v2.9.2 | ⚠️ v2.9.2 |
|
||||
| **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.
|
||||
|
||||

|
||||
|
||||
> [!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-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-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
|
||||
```
|
||||
LFS
BIN
Binary file not shown.
BIN
Binary file not shown.
LFS
BIN
Binary file not shown.
BIN
Binary file not shown.
LFS
BIN
Binary file not shown.
BIN
Binary file not shown.
@@ -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 (15): 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, unicode-general-category, 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 (288): 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, glifo, gpu-allocator, gpu-descriptor, gpu-descriptor-types, guillotiere, 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, 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 (100): android-properties, block2, block2, bytes, calloop, calloop, calloop-wayland-source, calloop-wayland-source, cfg_aliases, combine, crunchy, dashmap, dispatch, dlib, endi, fax, glutin-winit, harfrust, 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.
|
||||
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"
|
||||
|
||||
+2
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"FileVersion": 3,
|
||||
"Version": 1,
|
||||
"VersionName": "2.8.0",
|
||||
"VersionName": "2.9.2",
|
||||
"FriendlyName": "SenseGlove",
|
||||
"Description": "Integrating the SenseGlove haptic controller into Unreal Engine",
|
||||
"Category": "Virtual Reality",
|
||||
@@ -10,6 +10,7 @@
|
||||
"DocsURL": "https://unreal.docs.senseglove.com/",
|
||||
"MarketplaceURL": "com.epicgames.launcher://ue/marketplace/product/5e1d408f517b4966a269ec1035de0b9e",
|
||||
"SupportURL": "https://www.senseglove.com/support/",
|
||||
"EngineVersion": "5.8.0",
|
||||
"CanContainContent": true,
|
||||
"IsBetaVersion": false,
|
||||
"IsExperimentalVersion": false,
|
||||
|
||||
@@ -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[]
|
||||
{
|
||||
|
||||
+1
-1
@@ -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,
|
||||
|
||||
+1
-2
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -47,35 +47,15 @@ public class SGBleThirdPartyLibs : ModuleRules
|
||||
|
||||
string ThirdPartyDirectory = Path.GetFullPath(Path.Combine(ModuleDirectory, ".."));
|
||||
string LibraryPath = Path.GetFullPath(Path.Combine(ThirdPartyDirectory, "lib"));
|
||||
string LibraryPathAnroidAArch64 = "";
|
||||
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 +87,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[]
|
||||
@@ -154,4 +112,4 @@ public class SGBleThirdPartyLibs : ModuleRules
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -114,14 +114,25 @@ public class SGCommonThirdPartyLibs : ModuleRules
|
||||
else if (bIsWin64)
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "windows"));
|
||||
switch (Target.WindowsPlatform.Compiler)
|
||||
|
||||
Version compilerVersion = Version.Parse(Target.WindowsPlatform.CompilerVersion.ToString());
|
||||
string toolsetVersion = $"{compilerVersion.Major}.{compilerVersion.Minor:D2}";
|
||||
|
||||
if (toolsetVersion == "14.50")
|
||||
{
|
||||
case WindowsCompiler.VisualStudio2022:
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143"));
|
||||
break;
|
||||
default:
|
||||
Debug.Assert(false, "Unsupported engine version or compiler!");
|
||||
break;
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v145-1450"));
|
||||
}
|
||||
else if (toolsetVersion == "14.44")
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
|
||||
}
|
||||
else if (toolsetVersion == "14.38")
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1438"));
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Assert(false, "Unsupported MSVC toolset!");
|
||||
}
|
||||
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "x86-64"));
|
||||
|
||||
+25
-56
@@ -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"));
|
||||
|
||||
@@ -114,14 +94,25 @@ public class SGConnectShmThirdPartyLibs : ModuleRules
|
||||
else if (bIsWin64)
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "windows"));
|
||||
switch (Target.WindowsPlatform.Compiler)
|
||||
|
||||
Version compilerVersion = Version.Parse(Target.WindowsPlatform.CompilerVersion.ToString());
|
||||
string toolsetVersion = $"{compilerVersion.Major}.{compilerVersion.Minor:D2}";
|
||||
|
||||
if (toolsetVersion == "14.50")
|
||||
{
|
||||
case WindowsCompiler.VisualStudio2022:
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143"));
|
||||
break;
|
||||
default:
|
||||
Debug.Assert(false, "Unsupported engine version or compiler!");
|
||||
break;
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v145-1450"));
|
||||
}
|
||||
else if (toolsetVersion == "14.44")
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
|
||||
}
|
||||
else if (toolsetVersion == "14.38")
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1438"));
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Assert(false, "Unsupported MSVC toolset!");
|
||||
}
|
||||
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "x86-64"));
|
||||
@@ -136,38 +127,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);
|
||||
}
|
||||
}
|
||||
+18
-7
@@ -114,14 +114,25 @@ public class SGConnectThirdPartyLibs : ModuleRules
|
||||
else if (bIsWin64)
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "windows"));
|
||||
switch (Target.WindowsPlatform.Compiler)
|
||||
|
||||
Version compilerVersion = Version.Parse(Target.WindowsPlatform.CompilerVersion.ToString());
|
||||
string toolsetVersion = $"{compilerVersion.Major}.{compilerVersion.Minor:D2}";
|
||||
|
||||
if (toolsetVersion == "14.50")
|
||||
{
|
||||
case WindowsCompiler.VisualStudio2022:
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143"));
|
||||
break;
|
||||
default:
|
||||
Debug.Assert(false, "Unsupported engine version or compiler!");
|
||||
break;
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v145-1450"));
|
||||
}
|
||||
else if (toolsetVersion == "14.44")
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
|
||||
}
|
||||
else if (toolsetVersion == "14.38")
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1438"));
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Assert(false, "Unsupported MSVC toolset!");
|
||||
}
|
||||
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "x86-64"));
|
||||
|
||||
+25
-56
@@ -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"));
|
||||
|
||||
@@ -114,14 +94,25 @@ public class SGCoreShmThirdPartyLibs : ModuleRules
|
||||
else if (bIsWin64)
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "windows"));
|
||||
switch (Target.WindowsPlatform.Compiler)
|
||||
|
||||
Version compilerVersion = Version.Parse(Target.WindowsPlatform.CompilerVersion.ToString());
|
||||
string toolsetVersion = $"{compilerVersion.Major}.{compilerVersion.Minor:D2}";
|
||||
|
||||
if (toolsetVersion == "14.50")
|
||||
{
|
||||
case WindowsCompiler.VisualStudio2022:
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143"));
|
||||
break;
|
||||
default:
|
||||
Debug.Assert(false, "Unsupported engine version or compiler!");
|
||||
break;
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v145-1450"));
|
||||
}
|
||||
else if (toolsetVersion == "14.44")
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
|
||||
}
|
||||
else if (toolsetVersion == "14.38")
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1438"));
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Assert(false, "Unsupported MSVC toolset!");
|
||||
}
|
||||
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "x86-64"));
|
||||
@@ -136,38 +127,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);
|
||||
}
|
||||
}
|
||||
@@ -114,14 +114,25 @@ public class SGCoreThirdPartyLibs : ModuleRules
|
||||
else if (bIsWin64)
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "windows"));
|
||||
switch (Target.WindowsPlatform.Compiler)
|
||||
|
||||
Version compilerVersion = Version.Parse(Target.WindowsPlatform.CompilerVersion.ToString());
|
||||
string toolsetVersion = $"{compilerVersion.Major}.{compilerVersion.Minor:D2}";
|
||||
|
||||
if (toolsetVersion == "14.50")
|
||||
{
|
||||
case WindowsCompiler.VisualStudio2022:
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143"));
|
||||
break;
|
||||
default:
|
||||
Debug.Assert(false, "Unsupported engine version or compiler!");
|
||||
break;
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v145-1450"));
|
||||
}
|
||||
else if (toolsetVersion == "14.44")
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
|
||||
}
|
||||
else if (toolsetVersion == "14.38")
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1438"));
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Assert(false, "Unsupported MSVC toolset!");
|
||||
}
|
||||
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "x86-64"));
|
||||
|
||||
@@ -0,0 +1,142 @@
|
||||
/**
|
||||
* @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"));
|
||||
|
||||
Version compilerVersion = Version.Parse(Target.WindowsPlatform.CompilerVersion.ToString());
|
||||
string toolsetVersion = $"{compilerVersion.Major}.{compilerVersion.Minor:D2}";
|
||||
|
||||
if (toolsetVersion == "14.50")
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v145-1450"));
|
||||
}
|
||||
else if (toolsetVersion == "14.44")
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
|
||||
}
|
||||
else if (toolsetVersion == "14.38")
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1438"));
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Assert(false, "Unsupported MSVC toolset!");
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
+142
@@ -0,0 +1,142 @@
|
||||
/**
|
||||
* @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"));
|
||||
|
||||
Version compilerVersion = Version.Parse(Target.WindowsPlatform.CompilerVersion.ToString());
|
||||
string toolsetVersion = $"{compilerVersion.Major}.{compilerVersion.Minor:D2}";
|
||||
|
||||
if (toolsetVersion == "14.50")
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v145-1450"));
|
||||
}
|
||||
else if (toolsetVersion == "14.44")
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
|
||||
}
|
||||
else if (toolsetVersion == "14.38")
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1438"));
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Assert(false, "Unsupported MSVC toolset!");
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -119,14 +119,25 @@ public class SGFmtThirdPartyLibs : ModuleRules
|
||||
else if (bIsWin64)
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "windows"));
|
||||
switch (Target.WindowsPlatform.Compiler)
|
||||
|
||||
Version compilerVersion = Version.Parse(Target.WindowsPlatform.CompilerVersion.ToString());
|
||||
string toolsetVersion = $"{compilerVersion.Major}.{compilerVersion.Minor:D2}";
|
||||
|
||||
if (toolsetVersion == "14.50")
|
||||
{
|
||||
case WindowsCompiler.VisualStudio2022:
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143"));
|
||||
break;
|
||||
default:
|
||||
Debug.Assert(false, "Unsupported engine version or compiler!");
|
||||
break;
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v145-1450"));
|
||||
}
|
||||
else if (toolsetVersion == "14.44")
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
|
||||
}
|
||||
else if (toolsetVersion == "14.38")
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1438"));
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Assert(false, "Unsupported MSVC toolset!");
|
||||
}
|
||||
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "x86-64"));
|
||||
|
||||
@@ -114,14 +114,25 @@ public class SGLogThirdPartyLibs : ModuleRules
|
||||
else if (bIsWin64)
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "windows"));
|
||||
switch (Target.WindowsPlatform.Compiler)
|
||||
|
||||
Version compilerVersion = Version.Parse(Target.WindowsPlatform.CompilerVersion.ToString());
|
||||
string toolsetVersion = $"{compilerVersion.Major}.{compilerVersion.Minor:D2}";
|
||||
|
||||
if (toolsetVersion == "14.50")
|
||||
{
|
||||
case WindowsCompiler.VisualStudio2022:
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143"));
|
||||
break;
|
||||
default:
|
||||
Debug.Assert(false, "Unsupported engine version or compiler!");
|
||||
break;
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v145-1450"));
|
||||
}
|
||||
else if (toolsetVersion == "14.44")
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
|
||||
}
|
||||
else if (toolsetVersion == "14.38")
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1438"));
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Assert(false, "Unsupported MSVC toolset!");
|
||||
}
|
||||
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "x86-64"));
|
||||
|
||||
@@ -119,14 +119,25 @@ public class SGLoguruThirdPartyLibs : ModuleRules
|
||||
else if (bIsWin64)
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "windows"));
|
||||
switch (Target.WindowsPlatform.Compiler)
|
||||
|
||||
Version compilerVersion = Version.Parse(Target.WindowsPlatform.CompilerVersion.ToString());
|
||||
string toolsetVersion = $"{compilerVersion.Major}.{compilerVersion.Minor:D2}";
|
||||
|
||||
if (toolsetVersion == "14.50")
|
||||
{
|
||||
case WindowsCompiler.VisualStudio2022:
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143"));
|
||||
break;
|
||||
default:
|
||||
Debug.Assert(false, "Unsupported engine version or compiler!");
|
||||
break;
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v145-1450"));
|
||||
}
|
||||
else if (toolsetVersion == "14.44")
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
|
||||
}
|
||||
else if (toolsetVersion == "14.38")
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1438"));
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Assert(false, "Unsupported MSVC toolset!");
|
||||
}
|
||||
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "x86-64"));
|
||||
|
||||
@@ -0,0 +1,142 @@
|
||||
/**
|
||||
* @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"));
|
||||
|
||||
Version compilerVersion = Version.Parse(Target.WindowsPlatform.CompilerVersion.ToString());
|
||||
string toolsetVersion = $"{compilerVersion.Major}.{compilerVersion.Minor:D2}";
|
||||
|
||||
if (toolsetVersion == "14.50")
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v145-1450"));
|
||||
}
|
||||
else if (toolsetVersion == "14.44")
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
|
||||
}
|
||||
else if (toolsetVersion == "14.38")
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1438"));
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Assert(false, "Unsupported MSVC toolset!");
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
+149
@@ -0,0 +1,149 @@
|
||||
/**
|
||||
* @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"));
|
||||
|
||||
Version compilerVersion = Version.Parse(Target.WindowsPlatform.CompilerVersion.ToString());
|
||||
string toolsetVersion = $"{compilerVersion.Major}.{compilerVersion.Minor:D2}";
|
||||
|
||||
if (toolsetVersion == "14.50")
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v145-1450"));
|
||||
}
|
||||
else if (toolsetVersion == "14.44")
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
|
||||
}
|
||||
else if (toolsetVersion == "14.38")
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1438"));
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Assert(false, "Unsupported MSVC toolset!");
|
||||
}
|
||||
|
||||
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"));
|
||||
|
||||
@@ -114,14 +94,25 @@ public class SGSerialThirdPartyLibs : ModuleRules
|
||||
else if (bIsWin64)
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "windows"));
|
||||
switch (Target.WindowsPlatform.Compiler)
|
||||
|
||||
Version compilerVersion = Version.Parse(Target.WindowsPlatform.CompilerVersion.ToString());
|
||||
string toolsetVersion = $"{compilerVersion.Major}.{compilerVersion.Minor:D2}";
|
||||
|
||||
if (toolsetVersion == "14.50")
|
||||
{
|
||||
case WindowsCompiler.VisualStudio2022:
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143"));
|
||||
break;
|
||||
default:
|
||||
Debug.Assert(false, "Unsupported engine version or compiler!");
|
||||
break;
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v145-1450"));
|
||||
}
|
||||
else if (toolsetVersion == "14.44")
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
|
||||
}
|
||||
else if (toolsetVersion == "14.38")
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1438"));
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Assert(false, "Unsupported MSVC toolset!");
|
||||
}
|
||||
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "x86-64"));
|
||||
@@ -136,38 +127,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);
|
||||
}
|
||||
}
|
||||
+25
-56
@@ -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"));
|
||||
|
||||
@@ -114,14 +94,25 @@ public class SGWjwwoodSerialThirdPartyLibs : ModuleRules
|
||||
else if (bIsWin64)
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "windows"));
|
||||
switch (Target.WindowsPlatform.Compiler)
|
||||
|
||||
Version compilerVersion = Version.Parse(Target.WindowsPlatform.CompilerVersion.ToString());
|
||||
string toolsetVersion = $"{compilerVersion.Major}.{compilerVersion.Minor:D2}";
|
||||
|
||||
if (toolsetVersion == "14.50")
|
||||
{
|
||||
case WindowsCompiler.VisualStudio2022:
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143"));
|
||||
break;
|
||||
default:
|
||||
Debug.Assert(false, "Unsupported engine version or compiler!");
|
||||
break;
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v145-1450"));
|
||||
}
|
||||
else if (toolsetVersion == "14.44")
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1444"));
|
||||
}
|
||||
else if (toolsetVersion == "14.38")
|
||||
{
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "v143-1438"));
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Assert(false, "Unsupported MSVC toolset!");
|
||||
}
|
||||
|
||||
LibraryPath = Path.GetFullPath(Path.Combine(LibraryPath, "x86-64"));
|
||||
@@ -136,38 +127,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);
|
||||
}
|
||||
}
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user