introduce the senseglove unreal engine handbook

This commit is contained in:
Mamadou Babaei
2024-08-16 16:37:27 +02:00
parent a3c7ab41b8
commit f05c11b8a7
25 changed files with 1005 additions and 304 deletions
+4
View File
@@ -125,3 +125,7 @@ DerivedDataCache/*
# Do not ignore anything inside the ThirdParty directory at all
!Source/ThirdParty/**/*
# The Handbook
Documentation/
Handbook/book/
+34
View File
@@ -0,0 +1,34 @@
#
# author: Mamadou Babaei <mamadou@senseglove.com>
#
# (The MIT License)
#
# Copyright (c) 2020 - 2024 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.
#
# pmake might add -J (private)
FLAGS=${.MAKEFLAGS:C/\-J ([0-9]+,?)+//W}
all: .DEFAULT
.DEFAULT:
@which gmake > /dev/null 2>&1 || \
(echo "BSD Make is not supported; The build requires GNU Make." && exit 1)
@gmake ${.FLAGS} ${.TARGETS}
+313
View File
@@ -0,0 +1,313 @@
#
# author: Mamadou Babaei <mamadou@senseglove.com>
#
# (The MIT License)
#
# Copyright (c) 2020 - 2024 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.
#
################################################################################
# Generic Settings
################################################################################
SG_PROJECT_NAME := The SenseGlove Unreal Engine Handbook
SG_HANDBOOK_DIR := $(CURDIR)
SG_HANDBOOK_SRC_DIR := $(SG_HANDBOOK_DIR)/src
SG_PLUGIN_DIR := $(realpath $(SG_HANDBOOK_DIR)/..)
SG_PLUGIN_RESOURCES_DIR := $(SG_PLUGIN_DIR)/Resources
SG_PLUGIN_FILE := $(SG_PLUGIN_DIR)/SenseGlove.uplugin
SG_DOCUMENTATION_DIR := $(SG_PLUGIN_DIR)/Documentation
################################################################################
# Platform Detection
################################################################################
SG_BUILD_ARCH_AMD64 := amd64
SG_BUILD_PLATFORM_LINUX := linux
SG_BUILD_PLATFORM_WINDOWS := windows
ifeq ($(OS),Windows_NT)
SG_BUILD_PLATFORM := $(SG_BUILD_PLATFORM_WINDOWS)
# Running a 32-bit (x86) Command Prompt sets PROCESSOR_ARCHITECTURE to x86,
# and instead defines PROCESSOR_ARCHITEW6432 for 64-bit Windows detection.
ifeq ($(PROCESSOR_ARCHITEW6432),AMD64)
SG_BUILD_ARCH := $(SG_BUILD_ARCH_AMD64)
else # ($(PROCESSOR_ARCHITEW6432),AMD64)
ifeq ($(PROCESSOR_ARCHITECTURE),AMD64)
SG_BUILD_ARCH := $(SG_BUILD_ARCH_AMD64)
endif # ($(PROCESSOR_ARCHITECTURE),AMD64)
endif # ($(PROCESSOR_ARCHITEW6432),AMD64)
else # ($(OS),Windows_NT)
SG_PLATFORM_UNAME := $(shell uname -s)
ifeq ($(SG_PLATFORM_UNAME),Linux)
SG_BUILD_PLATFORM := $(SG_BUILD_PLATFORM_LINUX)
SG_PLATFORM_UNAME_ARCH := $(shell uname -m)
endif # ($(SG_PLATFORM_UNAME),Linux)
ifeq ($(SG_PLATFORM_UNAME_ARCH),x86_64)
SG_BUILD_ARCH := $(SG_BUILD_ARCH_AMD64)
endif # ($(SG_PLATFORM_UNAME_ARCH),x86_64)
endif # ($(OS),Windows_NT)
################################################################################
# Target Settings - mdbook
################################################################################
SG_MDBOOK_HOST := "localhost"
SG_MDBOOK_PORT := "8000"
SG_MDBOOK_SRC_DIR := "${SG_HANDBOOK_DIR}/src"
SG_MDBOOK_DEST_DIR := "${SG_DOCUMENTATION_DIR}"
SG_MDBOOK_WATCHER := "poll"
SG_PLUGIN_CHANGELOG_FILE := $(SG_PLUGIN_DIR)/CHANGELOG.md
SG_PLUGIN_DIRECTORY_STRUCTURE_FILE := $(SG_PLUGIN_DIR)/DIRECTORY_STRUCTURE.md
SG_PLUGIN_LICENSE_FILE := $(SG_PLUGIN_DIR)/LICENSE.md
SG_PLUGIN_LICENSE_THIRD_PARTY_FILE := $(SG_PLUGIN_DIR)/LICENSE_THIRD_PARTY.md
SG_PLUGIN_PLANNED_FEATURES_COMPLETION_STATUS_FILE := $(SG_PLUGIN_DIR)/PLANNED_FEATURES_COMPLETION_STATUS.md
SG_PLUGIN_PLATFORM_SUPPORT_MATRIX_FILE := $(SG_PLUGIN_DIR)/PLATFORM_SUPPORT_MATRIX.md
################################################################################
# Version and Build Information
################################################################################
SG_GIT_TREE_STATE_DIRTY := dirty
SG_GIT_BRANCH := $(shell git rev-parse --abbrev-ref HEAD 2>/dev/null)
SG_GIT_TAG := $(shell git describe --tags --abbrev=0 2>/dev/null)
SG_GIT_COMMIT := $(shell git rev-parse --short HEAD 2>/dev/null)
SG_GIT_COMMIT_NUMS_SINCE_TAG := $(shell git rev-list --count HEAD ^`git describe --tags --abbrev=0 2>/dev/null` 2>/dev/null)
SG_GIT_TREE_STATE := $(shell test -n "`git status --porcelain 2>/dev/null`" && echo "dirty" || echo "clean")
SG_PLUGIN_VERSION := $(shell grep -o '"VersionName": "[^"]*"' ${SG_PLUGIN_FILE} | awk -F'"' '{print "v" $$4}')
ifeq ($(strip $(SG_GIT_COMMIT_NUMS_SINCE_TAG)),)
SG_GIT_COMMIT_NUMS_SINCE_TAG := 0
endif # ($(strip $(SG_GIT_COMMIT_NUMS_SINCE_TAG)),)
ifneq ($(strip $(SG_GIT_TAG)),)
SG_GIT_VERSION := $(SG_GIT_TAG)
endif # ($(strip $(SG_GIT_TAG)),)
SG_GIT_VERSION_MAJOR := $(shell echo $(SG_GIT_TAG) | cut -d '.' -f 1 | tr -d -c 0-9)
ifeq ($(SG_GIT_VERSION_MAJOR),)
SG_GIT_VERSION_MAJOR := 0
endif # ($(SG_GIT_VERSION_MAJOR),)
SG_GIT_VERSION_MINOR := $(shell echo $(SG_GIT_TAG) | cut -d '.' -f 2 | tr -d -c 0-9)
ifeq ($(SG_GIT_VERSION_MINOR),)
SG_GIT_VERSION_MINOR := 0
endif # ($(SG_GIT_VERSION_MINOR),)
SG_GIT_VERSION_PATCH := $(shell echo $(SG_GIT_TAG) | cut -d '.' -f 3 | tr -d -c 0-9)
ifeq ($(SG_GIT_VERSION_PATCH),)
SG_GIT_VERSION_PATCH := 0
endif # ($(SG_GIT_VERSION_PATCH),)
SG_PLUGIN_VERSION_MAJOR := $(shell echo $(SG_PLUGIN_VERSION) | cut -d '.' -f 1 | tr -d -c 0-9)
ifeq ($(SG_PLUGIN_VERSION_MAJOR),)
SG_PLUGIN_VERSION_MAJOR := 0
endif
SG_PLUGIN_VERSION_MINOR := $(shell echo $(SG_PLUGIN_VERSION) | cut -d '.' -f 2 | tr -d -c 0-9)
ifeq ($(SG_PLUGIN_VERSION_MINOR),)
SG_PLUGIN_VERSION_MINOR := 0
endif # ($(SG_PLUGIN_VERSION_MINOR),)
SG_PLUGIN_VERSION_PATCH := $(shell echo $(SG_PLUGIN_VERSION) | cut -d '.' -f 3 | tr -d -c 0-9)
ifeq ($(SG_PLUGIN_VERSION_PATCH),)
SG_PLUGIN_VERSION_PATCH := 0
endif # ($(SG_PLUGIN_VERSION_PATCH),)
SG_BUILD_HOST := $(shell hostname)
SG_BUILD_TIME := $(shell date '+%a %b %d, %Y %H:%M %Z %z')
ifeq ($(strip $(SG_GIT_BRANCH)),dev)
ifeq ($(strip $(SG_GIT_VERSION)),)
SG_HANDBOOK_REVISION := next
endif # ($(strip $(SG_GIT_VERSION)),)
endif # ($(strip $(SG_GIT_BRANCH)),dev)
ifeq ($(strip $(SG_GIT_BRANCH)),HEAD)
ifeq ($(strip $(SG_GIT_COMMIT_NUMS_SINCE_TAG)),0)
ifeq ($(strip $(SG_GIT_TREE_STATE)),clean)
ifeq ($(strip $(SG_GIT_VERSION)),$(strip $(SG_PLUGIN_VERSION)))
SG_HANDBOOK_REVISION := SG_PLUGIN_VERSION_MAJOR.SG_PLUGIN_VERSION_MINOR
endif # ($(strip $(SG_GIT_VERSION)),$(strip $(SG_PLUGIN_VERSION)))
endif # ($(strip $(SG_GIT_TREE_STATE)),clean)
endif # ($(strip $(SG_GIT_COMMIT_NUMS_SINCE_TAG)),0)
endif # ($(strip $(SG_GIT_BRANCH)),HEAD)
ifeq ($(strip $(SG_GIT_BRANCH)),master)
ifeq ($(strip $(SG_GIT_COMMIT_NUMS_SINCE_TAG)),0)
ifeq ($(strip $(SG_GIT_TREE_STATE)),clean)
ifeq ($(strip $(SG_GIT_VERSION)),$(strip $(SG_PLUGIN_VERSION)))
SG_HANDBOOK_REVISION := SG_PLUGIN_VERSION_MAJOR.SG_PLUGIN_VERSION_MINOR
endif # ($(strip $(SG_GIT_VERSION)),$(strip $(SG_PLUGIN_VERSION)))
endif # ($(strip $(SG_GIT_TREE_STATE)),clean)
endif # ($(strip $(SG_GIT_COMMIT_NUMS_SINCE_TAG)),0)
endif # ($(strip $(SG_GIT_BRANCH)),master)
ifeq ($(strip $(SG_HANDBOOK_REVISION)),)
SG_HANDBOOK_REVISION := mismatched
endif # ($(strip $(SG_HANDBOOK_REVISION)),)
################################################################################
# Make Targets - All
################################################################################
.PHONY: all
all: help
################################################################################
# Make Targets - Misc
################################################################################
.PHONY: help
help:
@echo ""
@echo "Available make targets:"
@echo ""
@echo " - make build"
@echo " - make clean"
@echo " - make deploy"
@echo " - make help"
@echo " - make info"
@echo " - make serve"
@echo ""
.PHONY: info
info:
@echo ""
@echo "Building $(SG_PROJECT_NAME)..."
@echo ""
@echo " - Handbook Revision : $(SG_HANDBOOK_REVISION)"
@echo " - Git Branch : $(SG_GIT_BRANCH)"
@echo " - Git Tag : $(SG_GIT_TAG)"
@echo " - Git Commit : $(SG_GIT_COMMIT)"
@echo " - Git Commits Since Tag : $(SG_GIT_COMMIT_NUMS_SINCE_TAG)"
@echo " - Git Tree State : $(SG_GIT_TREE_STATE)"
@echo " - Git Version : $(SG_GIT_VERSION)"
@echo " - Git Version Major : $(SG_GIT_VERSION_MAJOR)"
@echo " - Git Version Minor : $(SG_GIT_VERSION_MINOR)"
@echo " - Git Version Patch : $(SG_GIT_VERSION_PATCH)"
@echo " - Plugin Version : $(SG_PLUGIN_VERSION)"
@echo " - Plugin Version Major : $(SG_PLUGIN_VERSION_MAJOR)"
@echo " - Plugin Version Minor : $(SG_PLUGIN_VERSION_MINOR)"
@echo " - Plugin Version Patch : $(SG_PLUGIN_VERSION_PATCH)"
@echo " - Build Host : $(SG_BUILD_HOST)"
@echo " - Build Time : $(SG_BUILD_TIME)"
@echo ""
.PHONY: clean
clean:
@echo "Cleaning up $(SG_PROJECT_NAME)..."
@rm -rf "$(SG_MDBOOK_DEST_DIR)"
@echo "$(SG_PROJECT_NAME) has been cleaned up successfully!"
.PHONY: install-build-deps
install-build-deps:
@echo "Installing build dependencies if they have not already been installed..."
@cargo install mdbook --vers "^0.4" --locked
@cargo install xq --locked
################################################################################
# Make Targets - mdBook
################################################################################
.PHONY: prepare
prepare:
@echo "Preparing the handbook $(SG_HANDBOOK_DIR)..."
prepare: prepare-src
prepare: prepare-dest
.PHONY: prepare-dest
prepare-dest:
@echo "Preparing the handbook target dir $(SG_MDBOOK_DEST_DIR)..."
.PHONY: prepare-src
prepare-src:
@echo "Preparing the handbook source dir $(SG_MDBOOK_SRC_DIR)..."
.PHONY: verify-build-type
verify-build-type:
ifeq ($(SG_HANDBOOK_REVISION), next)
@echo "Building an unstable handbook for the next release..."
else # ($(SG_HANDBOOK_REVISION), next)
ifeq ($(SG_HANDBOOK_REVISION), mismatched)
@echo ""
@echo "Failed to verify the handbook build due to some discrepancies. Please verify the following:"
@echo ""
@echo "If you're building a release handbook:"
@echo " - You are either on a release tag, e.g. v2.1.0, or on the master branch."
@echo " - No commit has been made since the targeted tag."
@echo " - The Git tree state is clean."
@echo " - The Git version and plugin version match each other."
@echo ""
@echo "If you're building an unstable handbook for the next release:"
@echo " - You're building from the dev branch."
@echo " - The Git version value evaluates to empty."
@echo ""
@exit 1
else # ($(SG_HANDBOOK_REVISION), mismatched)
@echo "Building a release handbook: $(SG_HANDBOOK_REVISION)..."
endif # ($(SG_HANDBOOK_REVISION), mismatched)
endif # ($(SG_HANDBOOK_REVISION), next)
.PHONY: serve
serve: info
serve: install-build-deps
serve: prepare
serve:
@echo "Serving $(SG_HANDBOOK_DIR)..."
@env SG_PROJECT_NAME='$(SG_PROJECT_NAME)' \
SG_HANDBOOK_REVISION='$(SG_HANDBOOK_REVISION)' \
SG_GIT_BRANCH='$(SG_GIT_BRANCH)' \
SG_GIT_TAG='$(SG_GIT_TAG)' \
SG_GIT_COMMIT='$(SG_GIT_COMMIT)' \
SG_GIT_COMMIT_NUMS_SINCE_TAG='$(SG_GIT_COMMIT_NUMS_SINCE_TAG)' \
SG_GIT_TREE_STATE='$(SG_GIT_TREE_STATE)' \
SG_GIT_VERSION='$(SG_GIT_VERSION)' \
SG_GIT_VERSION_MAJOR='$(SG_GIT_VERSION_MAJOR)' \
SG_GIT_VERSION_MINOR='$(SG_GIT_VERSION_MINOR)' \
SG_GIT_VERSION_PATCH='$(SG_GIT_VERSION_PATCH)' \
SG_PLUGIN_VERSION='$(SG_PLUGIN_VERSION)' \
SG_PLUGIN_VERSION_MAJOR='$(SG_PLUGIN_VERSION_MAJOR)' \
SG_PLUGIN_VERSION_MINOR='$(SG_PLUGIN_VERSION_MINOR)' \
SG_PLUGIN_VERSION_PATCH='$(SG_PLUGIN_VERSION_PATCH)' \
SG_BUILD_HOST='$(SG_BUILD_HOST)' \
SG_BUILD_TIME='$(SG_BUILD_TIME)' \
mdbook serve \
-n $(SG_MDBOOK_HOST) \
-p $(SG_MDBOOK_PORT) \
--watcher $(SG_MDBOOK_WATCHER) \
--dest-dir $(SG_MDBOOK_DEST_DIR)
.PHONY: build
build: info
build: install-build-deps
build: prepare
build: verify-build-type
build:
.PHONY: deploy
deploy: clean
deploy: build
deploy:
+64
View File
@@ -0,0 +1,64 @@
# The SenseGlove Unreal Engine Handbook
## Prerequisites
- GNU Make
- Git
- The Rust Toolchain
### Microsoft Windows Prerequisites Installation Notes
- Download and install [Git Bash for Windows](https://gitforwindows.org/).
- Download and install [the Rust Toolchain](https://rustup.rs/).
- Download [a without-guile binary build of GNU Make for Windows from ezwinports](https://sourceforge.net/projects/ezwinports/files/), e.g. <code>make-4.4.1-without-guile-w32-bin.zip</code>.
- <code>make-\*-without-guile-w32-bin.zip/*</code> contents should be extracted and copied to your <code>Git\\mingw64\\</code>, e.g. <code>C:\\Program Files\\Git\\mingw64\\</code>, merging the folders, WITHOUT overwriting/replacing any existing files.
- After Git Bash installation, the changes to environment variables require a reboot. In order for these changes to take effect reboot the system, then proceed to the build section.
## How to preview, build, and deploy?
In order to generate the handbook, on either GNU/Linux and Microsoft Windows everything is done through running the <code>make</code> command. Simply entering the <code>make</code> or <code>make help</code> inside your desired terminal will show you all the available make targets:
```sh
$ make help
Available make targets:
- make build
- make clean
- make deploy
- make help
- make info
- make serve
```
### make info
This target prints the build and version information.
### make clean
This target cleans up the output directory for the generated handbook, which is the <code>/Documentation</code> folder.
### make serve
This tatget could be used for viewing or live-previwing the handbook while editing simultaneously editing it. Simply run this tatget and leave your terminal open and inside your web browser of choice head to <code>http://localhost:8000/</code>. You can modify the handbook source code inside any text editor and upon saving your web browser will refresh in realtime once a change is detected.
### make build
This tatget builds the final handbook and outputs it to the <code>/Documentation</code> folder.
If you're building a release handbook, please make sure:
- You are either on a release tag, e.g. v2.1.0, or on the master branch.
- No commit has been made since the targeted tag.
- The Git tree state is clean.
- The Git version and plugin version match each other.
If you're building an unstable handbook for the next release, please make sure:
- You're building from the dev branch.
- The Git version value evaluates to empty.
### make deploy
This tatget is used to build and upload the final draft of the handbook. This tatget first runs the <code>clean</code> target and then the <code>build</code> target; and only then attempts to upload the content. Thus, any rule that applies to the <code>build</code> target, will apply to this target as well.
+84
View File
@@ -0,0 +1,84 @@
#!/usr/bin/env sh
#
# author: Mamadou Babaei <mamadou@senseglove.com>
#
# (The MIT License)
#
# Copyright (c) 2020 - 2024 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.
#
if [ "$1" = "supports" ]
then
exit 0
fi
readonly JSON_INPUT=$(cat)
readonly CONTEXT=$(echo "${JSON_INPUT}" | xq '.[0]')
readonly BOOK=$(echo "${JSON_INPUT}" | xq '.[1]')
escape_string() {
printf '%s' "$1" | sed -e 's/\\/\\\\/g' -e 's/"/\\"/g'
}
SG_PROJECT_NAME_ESCAPED=$(escape_string "${SG_PROJECT_NAME}")
SG_HANDBOOK_REVISION_ESCAPED=$(escape_string "${SG_HANDBOOK_REVISION}")
SG_GIT_BRANCH_ESCAPED=$(escape_string "${SG_GIT_BRANCH}")
SG_GIT_TAG_ESCAPED=$(escape_string "${SG_GIT_TAG}")
SG_GIT_COMMIT_ESCAPED=$(escape_string "${SG_GIT_COMMIT}")
SG_GIT_COMMIT_NUMS_SINCE_TAG_ESCAPED=$(escape_string "${SG_GIT_COMMIT_NUMS_SINCE_TAG}")
SG_GIT_TREE_STATE_ESCAPED=$(escape_string "${SG_GIT_TREE_STATE}")
SG_GIT_VERSION_ESCAPED=$(escape_string "${SG_GIT_VERSION}")
SG_GIT_VERSION_MAJOR_ESCAPED=$(escape_string "${SG_GIT_VERSION_MAJOR}")
SG_GIT_VERSION_MINOR_ESCAPED=$(escape_string "${SG_GIT_VERSION_MINOR}")
SG_GIT_VERSION_PATCH_ESCAPED=$(escape_string "${SG_GIT_VERSION_PATCH}")
SG_PLUGIN_VERSION_ESCAPED=$(escape_string "${SG_PLUGIN_VERSION}")
SG_PLUGIN_VERSION_MAJOR_ESCAPED=$(escape_string "${SG_PLUGIN_VERSION_MAJOR}")
SG_PLUGIN_VERSION_MINOR_ESCAPED=$(escape_string "${SG_PLUGIN_VERSION_MINOR}")
SG_PLUGIN_VERSION_PATCH_ESCAPED=$(escape_string "${SG_PLUGIN_VERSION_PATCH}")
SG_BUILD_HOST_ESCAPED=$(escape_string "${SG_BUILD_HOST}")
SG_BUILD_TIME_ESCAPED=$(escape_string "${SG_BUILD_TIME}")
PARSED_BOOK=$(echo "${BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-project-name }}\"; \"${SG_PROJECT_NAME_ESCAPED}\")")
PARSED_BOOK=$(echo "${PARSED_BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-handbook-revision }}\"; \"${SG_HANDBOOK_REVISION_ESCAPED}\")")
PARSED_BOOK=$(echo "${PARSED_BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-git-branch }}\"; \"${SG_GIT_BRANCH_ESCAPED}\")")
PARSED_BOOK=$(echo "${PARSED_BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-git-tag }}\"; \"${SG_GIT_TAG_ESCAPED}\")")
PARSED_BOOK=$(echo "${PARSED_BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-git-commit }}\"; \"${SG_GIT_COMMIT_ESCAPED}\")")
PARSED_BOOK=$(echo "${PARSED_BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-git-commit-nums-since-tag }}\"; \"${SG_GIT_COMMIT_NUMS_SINCE_TAG_ESCAPED}\")")
PARSED_BOOK=$(echo "${PARSED_BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-git-tree-state }}\"; \"${SG_GIT_TREE_STATE_ESCAPED}\")")
PARSED_BOOK=$(echo "${PARSED_BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-git-version }}\"; \"${SG_GIT_VERSION_ESCAPED}\")")
PARSED_BOOK=$(echo "${PARSED_BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-git-version-major }}\"; \"${SG_GIT_VERSION_MAJOR_ESCAPED}\")")
PARSED_BOOK=$(echo "${PARSED_BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-git-version-minor }}\"; \"${SG_GIT_VERSION_MINOR_ESCAPED}\")")
PARSED_BOOK=$(echo "${PARSED_BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-git-version-patch }}\"; \"${SG_GIT_VERSION_PATCH_ESCAPED}\")")
PARSED_BOOK=$(echo "${PARSED_BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-plugin-version }}\"; \"${SG_PLUGIN_VERSION_ESCAPED}\")")
PARSED_BOOK=$(echo "${PARSED_BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-plugin-version-major }}\"; \"${SG_PLUGIN_VERSION_MAJOR_ESCAPED}\")")
PARSED_BOOK=$(echo "${PARSED_BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-plugin-version-minor }}\"; \"${SG_PLUGIN_VERSION_MINOR_ESCAPED}\")")
PARSED_BOOK=$(echo "${PARSED_BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-plugin-version-patch }}\"; \"${SG_PLUGIN_VERSION_PATCH_ESCAPED}\")")
PARSED_BOOK=$(echo "${PARSED_BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-build-host }}\"; \"${SG_BUILD_HOST_ESCAPED}\")")
PARSED_BOOK=$(echo "${PARSED_BOOK}" | xq "(.sections[] | select(has(\"Chapter\")) | .Chapter.content) |= sub(\"{{ #sg-build-time }}\"; \"${SG_BUILD_TIME_ESCAPED}\")")
# For debugging purpose only!
#echo "CONTEXT: ${CONTEXT}" >&2
#echo "BOOK: ${BOOK}" >&2
#echo "PARSED_BOOK: ${PARSED_BOOK}" >&2
echo "${PARSED_BOOK}" | xq '.'
+86
View File
@@ -0,0 +1,86 @@
#
# author: Mamadou Babaei <mamadou@senseglove.com>
#
# (The MIT License)
#
# Copyright (c) 2020 - 2024 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.
#
[book]
authors = ["Mamadou Babaei"]
description = "Welcome to the SenseGlove Unreal Engine documentation!"
language = "en"
multilingual = false
src = "src"
text-direction = "ltr"
title = "The SenseGlove Unreal Engine Handbook"
[build]
build-dir = "book"
create-missing = false
extra-watch-dirs = ["assets"]
use-default-preprocessors = true
[preprocessor.index]
[preprocessor.links]
[preprocessor.senseglove]
after = [ "index", "links" ]
command = "sh ./bin/sg-preprocessor.sh"
[output.html]
additional-css = ["styles/custom.css"]
additional-js = []
cname = "unreal.docs.senseglove.com"
copy-fonts = true
default-theme = "navy"
edit-url-template = "https://dev.azure.com/SenseGlove/_git/SenseGlove-Unreal?path=/Handbook/{path}"
git-repository-url = "https://dev.azure.com/SenseGlove/_git/SenseGlove-Unreal"
git-repository-icon = "fa-git"
input-404 = "404.md"
mathjax-support = false
no-section-label = false
preferred-dark-theme = "navy"
site-url = "/example-book/"
smart-punctuation = false
theme = ""
[output.html.fold]
enable = false
level = 0
[output.html.print]
enable = true
page-break = true
[output.html.search]
boost-hierarchy = 1
boost-paragraph = 1
boost-title = 2
copy-js = true
enable = true
expand = true
heading-split-level = 3
limit-results = 128
teaser-word-count = 64
use-boolean-and = true
+8
View File
@@ -0,0 +1,8 @@
# Oops! Document not found (404)
It seems the page you're looking for doesn't exist. Here are a few options to help you get back on track:
- Check the URL: Make sure the web address is correct.
- Return to the [home page]({{cname}}): Start from the beginning.
- Search the book: Use the search function to find what you need.
- If you believe this is an error, please contact support.
+3
View File
@@ -0,0 +1,3 @@
# Introduction
![SenseGlove](assets/senseglove.png "SenseGlove")
+29
View File
@@ -0,0 +1,29 @@
Welcom to the SenseGlove Unreal Engine Handbook!
# 📄 Welcome
- [Introduction](README.md)
# 📝 Overview
- [Platform Support Matrix](overview/platform-support-matrix.md)
- [Planned Features Completion Status](overview/planned-features-completion-status.md)
- [Changelog](overview/changelog.md)
- [Directory Structure](overview/directory-structure.md)
# 🚀 Getting Started
- [Installation](getting-started/installation.md)
- [Plugin Version](getting-started/plugin-version.md)
# 📜 License
- [SenseGlove Unreal Engine Plugin License](license/senseglove-unreal-engine-plugin.md)
- [Third-Party Licenses](license/third-party.md)
- [SenseGlove SDK License](license/senseglove-sdk.md)
- [Boost C++ Libraries](license/boost-cpp-libraries.md)
- [Serial Communication Library License](license/serial-communication-library.md)
-----------
- [Build Information](misc/build-information.md)
+27
View File
@@ -0,0 +1,27 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="49" height="49" viewBox="0 0 49 49">
<defs>
<clipPath id="clip-path">
<rect id="Rectangle_3457" data-name="Rectangle 3457" width="49" height="49" transform="translate(-19814 -14509)" fill="#fff" stroke="#707070" stroke-width="1"/>
</clipPath>
</defs>
<g id="Mask_Group_58" data-name="Mask Group 58" transform="translate(19814 14509)" clip-path="url(#clip-path)">
<g id="Group_6820" data-name="Group 6820" transform="translate(-19894.215 -14191.005)">
<path id="Path_1" data-name="Path 1" d="M165.213-278.073v.01l2.838,4.887v-20.042a1.763,1.763,0,0,0,.373-1.087,1.789,1.789,0,0,0-1.792-1.784,1.789,1.789,0,0,0-1.792,1.784,1.763,1.763,0,0,0,.373,1.087Zm1.419-17.273a1.044,1.044,0,0,1,1.045,1.041,1.047,1.047,0,0,1-1.045,1.041,1.048,1.048,0,0,1-1.045-1.041,1.044,1.044,0,0,1,1.045-1.041" transform="translate(-59.636 -11.578)" fill="#009ddd"/>
<path id="Path_2" data-name="Path 2" d="M141.324-290.4h2.838v-16.725a1.771,1.771,0,0,0,.373-1.087,1.792,1.792,0,0,0-1.792-1.784,1.793,1.793,0,0,0-1.8,1.784,1.76,1.76,0,0,0,.378,1.092Zm1.419-18.853a1.043,1.043,0,0,1,1.041,1.041.88.88,0,0,1-.033.251,1.044,1.044,0,0,1-1.008.79,1.045,1.045,0,0,1-1.013-.79.88.88,0,0,1-.033-.251,1.044,1.044,0,0,1,1.045-1.041" transform="translate(-39.742)" fill="#009ddd"/>
<path id="Path_3" data-name="Path 3" d="M117.452-275.563h2.838v-13.742a1.773,1.773,0,0,0,.373-1.088,1.789,1.789,0,0,0-1.792-1.784,1.789,1.789,0,0,0-1.792,1.784,1.773,1.773,0,0,0,.373,1.088Zm1.419-15.87a1.044,1.044,0,0,1,1.045,1.041,1.044,1.044,0,0,1-1.045,1.041,1.047,1.047,0,0,1-1.045-1.041,1.047,1.047,0,0,1,1.045-1.041" transform="translate(-19.87 -14.835)" fill="#009ddd"/>
<path id="Path_4" data-name="Path 4" d="M179.111-210.924a1.758,1.758,0,0,0-.835-1.082,1.844,1.844,0,0,0-2.45.655,1.738,1.738,0,0,0-.219,1.129l-4.835,8.353v0l-.215.371L169-198.807l-1.932,3.336h3.258l7.738-13.343a1.8,1.8,0,0,0,.868-.753,1.77,1.77,0,0,0,.177-1.357m-.854,1.027a1.08,1.08,0,0,1-1.4.339,1.033,1.033,0,0,1-.4-1.38.158.158,0,0,1,.019-.042,1.049,1.049,0,0,1,.905-.52,1.033,1.033,0,0,1,.523.139,1.019,1.019,0,0,1,.485.632,1.017,1.017,0,0,1-.1.79l-.028.042" transform="translate(-61.493 -81.398)" fill="#009ddd"/>
<path id="Path_5" data-name="Path 5" d="M93.587-259.542l2.837-4.887v-12.418a1.748,1.748,0,0,0,.374-1.083,1.789,1.789,0,0,0-1.792-1.784,1.789,1.789,0,0,0-1.792,1.784,1.749,1.749,0,0,0,.373,1.083Zm1.419-19.429a1.047,1.047,0,0,1,1.045,1.04,1.047,1.047,0,0,1-1.045,1.041,1.044,1.044,0,0,1-1.045-1.041,1.044,1.044,0,0,1,1.045-1.04" transform="translate(0 -25.212)" fill="#009ddd"/>
<path id="Path_6" data-name="Path 6" d="M106.565-188.485H99.149l-3.706,6.393,3.706,6.393h7.416l3.706-6.393Z" transform="translate(-1.856 -101.17)" fill="#009ddd"/>
<path id="Path_7" data-name="Path 7" d="M322.423-232.868l.971-2.169a8.393,8.393,0,0,0,4.984,1.654c2.352,0,3.344-.838,3.344-1.955,0-3.244-8.976-1.117-8.976-6.7,0-2.427,1.942-4.489,6.085-4.489a9.587,9.587,0,0,1,5.027,1.331l-.884,2.17a8.411,8.411,0,0,0-4.163-1.182c-2.331,0-3.28.9-3.28,2.04,0,3.2,8.954,1.117,8.954,6.637,0,2.406-1.963,4.467-6.105,4.467a9.757,9.757,0,0,1-5.955-1.8" transform="translate(-190.841 -52.843)" fill="#fff"/>
<path id="Path_8" data-name="Path 8" d="M448.223-232.552v2.341H436.9v-15.034h11.025v2.342H439.7v3.909h7.292v2.3H439.7v4.146Z" transform="translate(-286.153 -53.911)" fill="#fff"/>
<path id="Path_9" data-name="Path 9" d="M562.462-245.245v15.034h-2.308l-8.329-10.181v10.181h-2.782v-15.034h2.308l8.329,10.181v-10.181Z" transform="translate(-379.527 -53.911)" fill="#fff"/>
<path id="Path_10" data-name="Path 10" d="M671.633-232.868l.971-2.169a8.39,8.39,0,0,0,4.984,1.654c2.352,0,3.344-.838,3.344-1.955,0-3.244-8.976-1.117-8.976-6.7,0-2.427,1.942-4.489,6.085-4.489a9.584,9.584,0,0,1,5.027,1.331l-.884,2.17a8.415,8.415,0,0,0-4.163-1.182c-2.331,0-3.28.9-3.28,2.04,0,3.2,8.954,1.117,8.954,6.637,0,2.406-1.963,4.467-6.105,4.467a9.756,9.756,0,0,1-5.955-1.8" transform="translate(-481.597 -52.843)" fill="#fff"/>
<path id="Path_11" data-name="Path 11" d="M797.432-232.552v2.341H786.1v-15.034H797.13v2.342h-8.221v3.909H796.2v2.3h-7.292v4.146Z" transform="translate(-576.907 -53.911)" fill="#fff"/>
<path id="Path_12" data-name="Path 12" d="M902.808-238.968h2.655v5.992a9.6,9.6,0,0,1-5.913,1.912c-4.682,0-8.134-3.244-8.134-7.733s3.452-7.731,8.178-7.731a7.821,7.821,0,0,1,6.062,2.448l-1.768,1.718a5.617,5.617,0,0,0-4.165-1.718,5.157,5.157,0,0,0-5.481,5.283,5.187,5.187,0,0,0,5.459,5.284,6.118,6.118,0,0,0,3.107-.772Z" transform="translate(-664.59 -52.843)" fill="#fff"/>
<path id="Path_13" data-name="Path 13" d="M1023.16-245.245h2.8v12.671h7.9v2.363h-10.7Z" transform="translate(-774.281 -53.911)" fill="#fff"/>
<path id="Path_14" data-name="Path 14" d="M1118.035-238.8c0-4.445,3.452-7.731,8.134-7.731s8.135,3.264,8.135,7.731-3.453,7.733-8.135,7.733-8.134-3.286-8.134-7.733m13.443,0a5.136,5.136,0,0,0-5.309-5.283,5.135,5.135,0,0,0-5.307,5.283,5.134,5.134,0,0,0,5.307,5.284,5.136,5.136,0,0,0,5.309-5.284" transform="translate(-853.275 -52.843)" fill="#fff"/>
<path id="Path_15" data-name="Path 15" d="M1259.158-245.245l-6.581,15.034h-2.762l-6.6-15.034h3.041l5.028,11.6,5.069-11.6Z" transform="translate(-957.499 -53.911)" fill="#fff"/>
<path id="Path_16" data-name="Path 16" d="M1385.118-232.552v2.341h-11.327v-15.034h11.025v2.342h-8.22v3.909h7.292v2.3h-7.292v4.146Z" transform="translate(-1066.219 -53.911)" fill="#fff"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.4 KiB

@@ -0,0 +1 @@
# Installation
@@ -0,0 +1 @@
# Plugin Version
@@ -0,0 +1,27 @@
# Boost C++ Libraries 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.
```
+32
View File
@@ -0,0 +1,32 @@
# SenseGlove SDK License
```
SENSEGLOVE SDK LICENSE
Purchase of the Product does not entitle you to ownership or a license to any
software generated by SenseGlove for use with the Product (the “Software”).
To the extent that SenseGlove, in its sole discretion, grants you access to any
such Software, the Software is licensed by us or by the relevant licensor/owner
subject to the relevant end-user license agreement or other license terms
included with the Product and/or on the SenseGlove Websites including the Github
page of SenseGlove (the “License Terms“).
Specifically, SenseGlove shall have sole discretion to determine and change the
availability, nature, features, content, versioning of any Software that it
makes available to you, for download through the the Github page of SenseGlove
or otherwise (including the SenseGlove software developer kit (“SDK”)).
Purchase of a Product does not entitle you to access to any specific features,
content or version of the SDK, including and especially versions of the SDK that
have not yet been made available to the public. SenseGlove will have no
obligation to provide any updates or upgrades to any Software it makes available
to you, but in the event that it does, such updates, upgrades and any
documentation will be subject to the License Terms available at
https://www.senseglove.com/solutions/.
Except to the extent expressly provided by us in writing or under the License
Terms, the Software is provided “AS IS” without any warranties, terms or
conditions as to quality, fitness for purpose, non-infringement, performance or
correspondence with description and we do not offer any warranties or guarantees
in relation to the Software installation, configuration or error/defect
correction.
```
@@ -26,4 +26,4 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
```
Please note that while the SenseGlove plug-in for Unreal Engine is made available under the [MIT License](LICENSE.md), it utilizes a few third-party libraries with permissive free licenses as well, in order to power various components. For a list of these libraries and their own respective open-source licenses take a look at [LICENSE-THIRD-PARTY.md](LICENSE-THIRD-PARTY.md), please.
Please note that while the SenseGlove Unreal Engine Plugin is made available under the MIT License, it utilizes a few third-party libraries with permissive free licenses as well, in order to power various components. For a list of these libraries and their own respective open-source licenses take a look at [the third-party licenses](third-party.md), please.
@@ -0,0 +1,22 @@
# Serial Communication Library License
```
Copyright (c) 2012 William Woodall, John Harrison
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.
```
+11
View File
@@ -0,0 +1,11 @@
# Third Party Licenses
Please note that while the SenseGlove Unreal Engine Plugin is made available under the [MIT License](senseglove-unreal-engine-plugin.md), it utilizes a few third-party libraries with permissive free licenses as well, in order to power various components.
The following third-party software are used and shipped with the SenseGlove Unreal Engine Plugin:
- [The SenseGlove SDK (a.k.a. SenseGlove Backend Libraries, or SenseGlove Core Libraries)](senseglove-sdk.md)
- [The Boost C++ Libraries](boost-cpp-libraries.md)
- [The Serial Communication Library](serial-communication-library.md)
For more information consult their own respective open-source licenses, please.
+20
View File
@@ -0,0 +1,20 @@
# Build Information
| | {{ #sg-project-name }} |
|-----------------------|-------------------------------------|
| Handbook Revision | {{ #sg-handbook-revision }} |
| Git Branch | {{ #sg-git-branch }} |
| Git Tag | {{ #sg-git-tag }} |
| Git Commit | {{ #sg-git-commit }} |
| Git Commits Since Tag | {{ #sg-git-commit-nums-since-tag }} |
| Git Tree State | {{ #sg-git-tree-state }} |
| Git Version | {{ #sg-git-version }} |
| Git Version Major | {{ #sg-git-version-major }} |
| Git Version Minor | {{ #sg-git-version-minor }} |
| Git Version Patch | {{ #sg-git-version-patch }} |
| Plugin Version | {{ #sg-plugin-version }} |
| Plugin Version Major | {{ #sg-plugin-version-major }} |
| Plugin Version Minor | {{ #sg-plugin-version-minor }} |
| Plugin Version Patch | {{ #sg-plugin-version-patch }} |
| Build Host | {{ #sg-build-host }} |
| Build Time | {{ #sg-build-time }} |
@@ -7,11 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [2.0.8] - 2024-07-15
This is a minor release focusing mainly on bringing OpenXR-compatible hand tracking support (XR_EXT_hand_tracking) and Head-mounted Display automatic detection for adjusting wrist tracker offsets automatically at runtime.
This is a minor release focusing mainly on bringing OpenXR-compatible hand tracking support (<code>XR_EXT_hand_tracking</code>) and Head-mounted Display automatic detection for adjusting wrist tracker offsets automatically at runtime.
### Added
- Added SenseGloveTracking and SenseGloveTrackingKismet modules which provide OpenXR-compatible hand tracking by implementing XR_EXT_hand_tracking support, HMD auto-detection, and SenseGlove device tracking.
- Added SenseGloveTracking and SenseGloveTrackingKismet modules which provide OpenXR-compatible hand tracking by implementing <code>XR_EXT_hand_tracking</code> support, HMD auto-detection, and SenseGlove device tracking.
- Added the SenseGlove grab/touch sockets one-click-setup ability on any Epic-compliant virtual hand mesh from within the Unreal Editor's Content Browser, Skeleton Editor, or Skeletal Mesh Editor by extending the Unreal Editor.
- A fallback to HMD and wrist tracker hardware auto-detection mechanism has been added to be triggered in situations when automatic detection of the wrist tracker hardware is desired, e.g., either by not setting it explicitly, or setting it to the default None value. Please note that this is still highly experimental and HTC VIVE Focus 3 and HTC XR Elite cannot be distinguished in the current iteration. Though, since the tracker devices and offsets for both headsets are the same in the end it does not make a difference if both headsets are detected as each other.
- Added the FSGHMDTracker utility class, exposed to both C++ and Blueprint, in order to easily gather information about the HMD device at runtime.
@@ -31,6 +31,7 @@ This is a minor release focusing mainly on bringing OpenXR-compatible hand track
- Introduced the FSGInitializationSettings in order to control how the plugin is initialized.
- Introduced the FSGGameUserSettings for managing the Engine Scalability Settings through the SenseGlove plugin in order to change the graphics settings on the fly.
- Added support for Android API level 32 in addition to API level 29.
- Introduced the SenseGlove Unreal Engine Handbook as an attempt at documenting the SenseGlove Unreal Engine Plugin.
### Fixed
@@ -50,6 +51,12 @@ This is a minor release focusing mainly on bringing OpenXR-compatible hand track
- FSGVirtualHandAnimInstanceProxy now relies on FXRMotionControllerData to animate the hands instead of a TMap of bone names and rotations which allows it to also apply the bone locations.
- FSGDebugVirtualHand::Draw now accepts a FXRMotionControllerData parameter instead of all WristLocation, WristRotation, JointPositions, and JointRotations parameters.
- Updated the Directory Structure section of the main README file to reflect the latest toolchain support status.
- The <code>/CHANGELOG.md</code> file has been migrated to <code>/Handbook/src/overview/changelog.md</code>
- The <code>/LICENSE.md</code> file has been migrated to <code>/Handbook/src/license/senseglove-unreal-engine-plugin.md</code>
- The <code>/LICENSE-THIRD-PARTY.md</code> file has been migrated to <code>/Handbook/src/license/third-party.md</code> and every third-party component's license has been split; adding <code>/Handbook/src/license/senseglove-sdk.md</code> for the SenseGlove SDK, <code>/Handbook/src/license/boost-cpp-libraries.md</code> for the Boost C++ Libraries, and <code>/Handbook/src/license/serial-communication-library.md</code> for the Serial Communication Library.
- The Platform Support Matrix section of the main README file has been migrated to <code>/Handbook/src/overview/platform-support-matrix.md</code>.
- The Planned Features Completion Status section of the main README file has been migrated to <code>/Handbook/src/overview/planned-features-completion-status.md</code>.
- The Directory Structure section of the main README file has been migrated to <code>/Handbook/src/overview/directory-structure.md</code>.
### Removed
@@ -0,0 +1,139 @@
# Directory Structure
```
/
├── Config
├── Documentation (this will be generated by running the <code>make</code> command inside the Handbook directory)
├── Handbook (this is the mdBook source code, used to generate the Documentation folder and not distributed to the Unreal Engine Marketplace)
├── Resources
└── Source (various plug-in modules)
├── SenseGlove (the UE-specific high-level API)
├── SenseGloveAndroid (the Android-specific module)
├── SenseGloveBackend (responsible for initialization and deinitialization of the backend libraries)
├── SenseGloveBackendKismet (exposes Blueprints-specific functionality from the SenseGloveBackend module)
├── SenseGloveBuildHacks (uses Exceptions and RTTI, internally used for compiler-specific build hacks)
├── SenseGloveConnect (exposes part of the SGConnect low-level API to C++)
├── SenseGloveConnectImpl (uses Exceptions and RTTI, intended for internal use only)
├── SenseGloveConnectKismet (SGConnect functionality exposed to Blueprints)
├── SenseGloveCore (exposes part of the SGCoreCpp low-level API to C++)
├── SenseGloveCoreImpl (uses Exceptions and RTTI, intended for internal use only)
├── SenseGloveCoreKismet (SGCoreCpp functionality exposed to Blueprints)
├── SenseGloveDebug (a utility debug module)
├── SenseGloveDebugKismet (exposes Blueprints-specific functionality from the SenseGloveDebug module)
├── SenseGloveEditor (the Editor module)
├── SenseGloveInterop (internally used for interoperability between RTTI disabled/enabled modules)
├── SenseGloveKismet (exposes Blueprints-specific functionality from the SenseGlove module)
├── SenseGloveLog (the internal log module)
├── SenseGloveSettings (the plugin's settings manager)
├── SenseGloveSettingsKismet (exposes Blueprints-specific functionality from the SenseGloveSettings module)
├── SenseGloveTracking (provides XR_EXT_hand_tracking support, HMD auto-detection, and SenseGlove device tracking)
├── SenseGloveTrackingKismet (exposes Blueprints-specific functionality from the SenseGloveTracking module)
├── SenseGloveTypes (exposes various enums from the backend libraries and also types from the SenseGlove module)
├── SenseGloveUtils (the internal utility module)
└── ThirdParty (3rd-party dependencies)
├── android (.jar file Java libraries for Android)
├── include (header files)
│ │
│ ├── boost
│ │
│ ├── SenseGlove
│ │ │
│ │ ├── Connect (SGConnect headers)
│ │ │
│ │ └── Core (SGCoreCpp headers)
│ │
│ └── serial
└── lib (platform-specific pre-built binary dependencies)
├── android
│ │
│ └── r25b (Android NDK r25b dependencies for UE 5.1+)
│ │
│ ├── arm64 (64-bit ARM variant of Android)
│ │ │
│ │ ├── debug
│ │ │
│ │ └── release
│ │
│ └── x64 (64-bit x86-64 variant of Android)
│ │
│ ├── debug
│ │
│ └── release
├── linux
│ │
│ ├── v21 (UE 5.2 Linux dependencies)
│ │ │
│ │ ├── aarch64 (dependencies targeting AArch64 Linux architecture)
│ │ │ │
│ │ │ ├── debug
│ │ │ │
│ │ │ └── release
│ │ │
│ │ └── x86-64 (dependencies targeting x86-64 Linux architecture)
│ │ │
│ │ ├── debug
│ │ │
│ │ └── release
│ │
│ └── v22 (UE 5.3 and 5.4 Linux dependencies)
│ │
│ ├── aarch64 (dependencies targeting AArch64 Linux architecture)
│ │ │
│ │ ├── debug
│ │ │
│ │ └── release
│ │
│ └── x86-64 (dependencies targeting x86-64 Linux architecture)
│ │
│ ├── debug
│ │
│ └── release
└── win64
├── msvc142 (Microsoft Visual Studio 2019 dependencies)
│ │
│ ├── debug
│ │
│ └── release
└── msvc143 (Microsoft Visual Studio 2022 dependencies)
├── debug
└── release
```
@@ -0,0 +1,52 @@
## Planned Features Completion Status
### Implemented as of v2.1.0
- [X] Full SenseGlove low-level core API access through Unreal C++.
- [X] Full SenseGlove low-level core API access through Blueprint.
- [X] DK 1 Support.
- [X] Nova 1 Support.
- [X] Nova 2 Support.
- [X] Support for Microsoft Windows as a development platform.
- [X] Support for GNU/Linux as a development platform.
- [X] Support for Microsoft Windows as a deployment platform.
- [X] Support for GNU/Linux x64 as a deployment platform.
- [X] Support for GNU/Linux AArch64 as a deployment platform.
- [X] Support for Android as a deployment platform.
- [X] Support for Oculus Quest 2 and Oculus Quest Pro.
- [X] Support for HTC VIVE Pro and HTC VIVE Focus 3.
- [X] Support for HTC VIVE Trackers and HTC VIVE Wrist Trackers.
- [X] On-device calibration for Android without the need for SenseCom.
- [X] Haptic feedback including force feedback, buzz, and thumper commands.
- [X] A customizable Grab component that could be added to any actor.
- [X] A customizable Touch component that could be added to any actor.
- [X] Ability to grab, release, and throw objects around.
- [X] Separation of the real and virtual hand rendering.
- [X] An out-of-the-box customizable SGPawn with the ability to be extended in C++ and Blueprint.
- [X] Easy wrist/hand tracking debugging using the SenseGlove Debug module.
- [X] A generic Settings module with the ability to override settings.
- [X] C++/Blueprint interaction events such as OnGrabStateUpdated, OnTouchStateUpdated, OnActorGrabbed, OnActorReleased, OnActorBeginTouch, and OnActorEndTouch.
- [X] A fallback to HMD and wrist tracker hardware auto-detection mechanism when automatic detection of the wrist tracker hardware is desired.
- [X] OpenXR-compatible hand tracking (XR_EXT_hand_tracking) support.
- [X] FXRMotionControllerData compatible hand animation system.
- [X] FXRMotionControllerData compatible wrist tracking system.
- [X] FXRMotionControllerData compatible hand interaction manipulation system.
- [X] Ability to fallback to hand tracking when a glove is not present and use the bare hands for interactions, or a combination of glove and hand tracking if no motion controller input is detected.
- [X] The SenseGlove grab/touch sockets one-click-setup ability on any Epic-compliant virtual hand mesh from within the Unreal Editor's Content Browser, Skeleton Editor, or Skeletal Mesh Editor.
- [X] A flexible virtual hand animation system that can take the mesh bone's transforms into account for a more reliable hand animation.
- [X] Ability to manage the Engine Scalability Settings through the SenseGlove plugin in order to change the graphics settings on the fly.
### Upcoming features planned for the v2.2.0 release
### Planned features long-term
- [ ] Get tracking input from sources other than a SenseGlove device.
- [ ] Be able to assign behaviors to different objects (meshes) in the scene (e.g. Slider, Hinge, basic Grabables, etc).
- [ ] Make it so developers can define or extend their own behavior(s) to an object through Code / Blueprints (e.g. I want a car door that is like a slider, but follows a path rather than a straight line).
- [ ] Make the hand(s) able to push around physics-driven objects (for as much as their behaviors allow) (in backlog).
- [ ] Be able to grab objects with up to 2 hands (and move them around with both hands at the same time in a way that seems realistic).
- [ ] Ensure that our virtual hands (and the objects they hold) do not phase through other physics objects (e.g. walls and tables).
- [ ] Allow other scripts to force a grab and/or release to occur (for example, when you place it apart at the designated location, it gets removed from your hand and snaps into place).
- [ ] Have some form of weight simulation by making certain objects harder to push, lowering manipulation speed, or making objects only moveable with two hands.
- [ ] (Optional) Make it so the fingers of your virtual hands do not clip inside the meshes you are holding (certain people see this as an indicator of how fast the Force-Feedback activates - but it's basically just rendering).
@@ -0,0 +1,27 @@
## Platform Support Matrix
| | **Windows (MSVC 2017)** | **Windows (MSVC 2019)** | **Windows (MSVC 2022)** | **Linux x86-64 (Native Toolchain)** | **Linux AArch64 (Native Toolchain)** | **Meta Quest Stand-alone (Android NDK)** | **HTC VIVE stand-alone (Android NDK)** | **UE Marketplace Version** | **Azure DevOps Version** |
|:--------:|:-----------------------:|:-----------------------:|:-----------------------:|:-----------------------------------:|:------------------------------------:|:----------------------------------------:|:--------------------------------------:|:--------------------------:|:------------------------:|
| **5.4** | ❌ | ❌ | ✅ v2.0.x | ✅ v2.0.x | ✅ v2.0.x | ✅ v2.0.x (r25b) | ❓ | ✅ v2.0.7 | ✅ v2.0.7 |
| **5.3** | ❌ | ✅ v2.0.x | ✅ v2.0.x | ✅ v2.0.x | ✅ v2.0.x | ✅ v2.0.x (r25b) | ❓ | ✅ v2.0.7 | ✅ v2.0.7 |
| **5.2** | ❌ | ✅ v2.0.x | ✅ v2.0.x | ✅ v2.0.x | ✅ v2.0.x | ✅ v2.0.x (r25b) | ❓ | ✅ v2.0.7 | ✅ v2.0.7 |
| **5.1** | ❌ | ⚠️ v2.0.x | ⚠️ v2.0.x | ⚠️ v2.0.x | ⚠️ v2.0.x | ⚠️ v2.0.x (r25b) | ❓ | ⚠️ v2.0.1 | ⚠️ 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> Not supported by the latest release and might be lacking features
* <code>❌</code> Not supported at all
* <code>❓</code> Unknown or untested
Remarks:
* Per [Epic's Marketplace Guidelines](https://www.unrealengine.com/en-US/marketplace-guidelines) in regards to Code Plugins (sections 2.6.3.d and 3.1.b), we are only able to distribute or update the SenseGlove plugin for the last 3 stable versions of Unreal Engine. As a result, we won't be able to publish updates or bug fixes for the older versions of the Engine except on rare occasions and only through our official repository on Microsoft Azure DevOps.
* All third-party libraries on Windows built against Windows SDK 10.0.
* Oculus and VIVE support is only provided through the recommended Android NDK versions by Epic Games.
* [wjwwood/serial](https://github.com/wjwwood/serial) requires Android NDK API Level 28+ in order to be built successfully.
* All third-party libraries target Android NDK API Level 29, thus any project relying on the plug-in should be build with the same NDK API Level.
View File
-87
View File
@@ -1,87 +0,0 @@
# Third Party Licenses
Please note that while the SenseGlove plug-in for Unreal Engine is made available under the [MIT License](LICENSE.md), it utilizes a few third-party libraries with permissive free licenses as well, in order to power various components. For a list of these libraries and their own respective open-source licenses take a look at [LICENSE-THIRD-PARTY.md](LICENSE-THIRD-PARTY.md), please.
### SenseGlove SDK
```
SENSEGLOVE SDK LICENSE
Purchase of the Product does not entitle you to ownership or a license to any
software generated by SenseGlove for use with the Product (the “Software”).
To the extent that SenseGlove, in its sole discretion, grants you access to any
such Software, the Software is licensed by us or by the relevant licensor/owner
subject to the relevant end-user license agreement or other license terms
included with the Product and/or on the SenseGlove Websites including the Github
page of SenseGlove (the “License Terms“).
Specifically, SenseGlove shall have sole discretion to determine and change the
availability, nature, features, content, versioning of any Software that it
makes available to you, for download through the the Github page of SenseGlove
or otherwise (including the SenseGlove software developer kit (“SDK”)).
Purchase of a Product does not entitle you to access to any specific features,
content or version of the SDK, including and especially versions of the SDK that
have not yet been made available to the public. SenseGlove will have no
obligation to provide any updates or upgrades to any Software it makes available
to you, but in the event that it does, such updates, upgrades and any
documentation will be subject to the License Terms available at
https://www.senseglove.com/solutions/.
Except to the extent expressly provided by us in writing or under the License
Terms, the Software is provided “AS IS” without any warranties, terms or
conditions as to quality, fitness for purpose, non-infringement, performance or
correspondence with description and we do not offer any warranties or guarantees
in relation to the Software installation, configuration or error/defect
correction.
```
## Boost C++ Libraries 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.
```
## Serial Communication Library License
```
Copyright (c) 2012 William Woodall, John Harrison
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.
```
+11 -214
View File
@@ -4,38 +4,6 @@
This repository relies on Git LFS for storing binary blobs (e.g. third-party libraries). Sadly, there is a known issue with Microsoft Azure public LFS repositories that requires credential for LFS checkouts on https (LFS ssh checkouts are not supported at all). Unless, you are part of SenseGlove organization on Microsoft Azure there is no easy way to fully clone this repository using Git. Thus, the best way to download this repository is to use the 'kebab' (three vertical dots) menu next to the clone button, in order to download the whole repository including LFS objects as a unified zip file.
## Platform Support Matrix
| | **Windows (MSVC 2017)** | **Windows (MSVC 2019)** | **Windows (MSVC 2022)** | **Linux x86-64 (Native Toolchain)** | **Linux AArch64 (Native Toolchain)** | **Meta Quest Stand-alone (Android NDK)** | **HTC VIVE stand-alone (Android NDK)** | **UE Marketplace Version** | **Azure DevOps Version** |
|:--------:|:-----------------------:|:-----------------------:|:-----------------------:|:-----------------------------------:|:------------------------------------:|:----------------------------------------:|:--------------------------------------:|:--------------------------:|:------------------------:|
| **5.4** | ❌ | ❌ | ✅ v2.0.x | ✅ v2.0.x | ✅ v2.0.x | ✅ v2.0.x (r25b) | ❓ | ✅ v2.0.7 | ✅ v2.0.7 |
| **5.3** | ❌ | ✅ v2.0.x | ✅ v2.0.x | ✅ v2.0.x | ✅ v2.0.x | ✅ v2.0.x (r25b) | ❓ | ✅ v2.0.7 | ✅ v2.0.7 |
| **5.2** | ❌ | ✅ v2.0.x | ✅ v2.0.x | ✅ v2.0.x | ✅ v2.0.x | ✅ v2.0.x (r25b) | ❓ | ✅ v2.0.7 | ✅ v2.0.7 |
| **5.1** | ❌ | ⚠️ v2.0.x | ⚠️ v2.0.x | ⚠️ v2.0.x | ⚠️ v2.0.x | ⚠️ v2.0.x (r25b) | ❓ | ⚠️ v2.0.1 | ⚠️ 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> Not supported by the latest release and might be lacking features
* <code>❌</code> Not supported at all
* <code>❓</code> Unknown or untested
Remarks:
* Per [Epic's Marketplace Guidelines](https://www.unrealengine.com/en-US/marketplace-guidelines) in regards to Code Plugins (sections 2.6.3.d and 3.1.b), we are only able to distribute or update the SenseGlove plugin for the last 3 stable versions of Unreal Engine. As a result, we won't be able to publish updates or bug fixes for the older versions of the Engine except on rare occasions and only through our official repository on Microsoft Azure DevOps.
* All third-party libraries on Windows built against Windows SDK 10.0.
* Oculus and VIVE support is only provided through the recommended Android NDK versions by Epic Games.
* [wjwwood/serial](https://github.com/wjwwood/serial) requires Android NDK API Level 28+ in order to be built successfully.
* All third-party libraries target Android NDK API Level 29, thus any project relying on the plug-in should be build with the same NDK API Level.
## Changelog
We maintain [a detailed changelog for this project](CHANGELOG.md) as well. Please consult the changelog before upgrading to any newer release.
## Documentation
[The Blueprints documentation is hosted on SenseGlove Docs](https://senseglove.gitlab.io/unreal-blueprint-docs/).
@@ -52,201 +20,30 @@ The following modules are intended to be used by the C++ users of this plugin:
Please note that modules postfixed with **Impl** are intended for interal use and are discouraged to be used by the users of the API. The modules postfixed with **Kismet** are exposing the functionality of the equivalent modules to Blueprints. For other modules descriptions, please see [the Directory Structure section](#directory-structure).
## Planned Features Completion Status
## Overview
### Implemented as of v2.1.0
### Platform Support Matrix
- [X] Full SenseGlove low-level core API access through Unreal C++.
- [X] Full SenseGlove low-level core API access through Blueprint.
- [X] DK 1 Support.
- [X] Nova 1 Support.
- [X] Nova 2 Support.
- [X] Support for Microsoft Windows as a development platform.
- [X] Support for GNU/Linux as a development platform.
- [X] Support for Microsoft Windows as a deployment platform.
- [X] Support for GNU/Linux x64 as a deployment platform.
- [X] Support for GNU/Linux AArch64 as a deployment platform.
- [X] Support for Android as a deployment platform.
- [X] Support for Oculus Quest 2 and Oculus Quest Pro.
- [X] Support for HTC VIVE Pro and HTC VIVE Focus 3.
- [X] Support for HTC VIVE Trackers and HTC VIVE Wrist Trackers.
- [X] On-device calibration for Android without the need for SenseCom.
- [X] Haptic feedback including force feedback, buzz, and thumper commands.
- [X] A customizable Grab component that could be added to any actor.
- [X] A customizable Touch component that could be added to any actor.
- [X] Ability to grab, release, and throw objects around.
- [X] Separation of the real and virtual hand rendering.
- [X] An out-of-the-box customizable SGPawn with the ability to be extended in C++ and Blueprint.
- [X] Easy wrist/hand tracking debugging using the SenseGlove Debug module.
- [X] A generic Settings module with the ability to override settings.
- [X] C++/Blueprint interaction events such as OnGrabStateUpdated, OnTouchStateUpdated, OnActorGrabbed, OnActorReleased, OnActorBeginTouch, and OnActorEndTouch.
- [X] A fallback to HMD and wrist tracker hardware auto-detection mechanism when automatic detection of the wrist tracker hardware is desired.
- [X] OpenXR-compatible hand tracking (XR_EXT_hand_tracking) support.
- [X] FXRMotionControllerData compatible hand animation system.
- [X] FXRMotionControllerData compatible wrist tracking system.
- [X] FXRMotionControllerData compatible hand interaction manipulation system.
- [X] Ability to fallback to hand tracking when a glove is not present and use the bare hands for interactions, or a combination of glove and hand tracking if no motion controller input is detected.
- [X] The SenseGlove grab/touch sockets one-click-setup ability on any Epic-compliant virtual hand mesh from within the Unreal Editor's Content Browser, Skeleton Editor, or Skeletal Mesh Editor.
- [X] A flexible virtual hand animation system that can take the mesh bone's transforms into account for a more reliable hand animation.
- [X] Ability to manage the Engine Scalability Settings through the SenseGlove plugin in order to change the graphics settings on the fly.
We maintain [a platform support matrix](Handbook/src/overview/platform-support-matrix.md) which constantly changes as we move forward towards our development goals.
### Upcoming features planned for the v2.2.0 release
### Planned Features Completion Status
We also maintain [a list of planned features and their completion status](Handbook/src/overview/planned-features-completion-status.md) as a kind of roadmap for this plugin.
### Planned features long-term
### Changelog
- [ ] Get tracking input from sources other than a SenseGlove device.
- [ ] Be able to assign behaviors to different objects (meshes) in the scene (e.g. Slider, Hinge, basic Grabables, etc).
- [ ] Make it so developers can define or extend their own behavior(s) to an object through Code / Blueprints (e.g. I want a car door that is like a slider, but follows a path rather than a straight line).
- [ ] Make the hand(s) able to push around physics-driven objects (for as much as their behaviors allow) (in backlog).
- [ ] Be able to grab objects with up to 2 hands (and move them around with both hands at the same time in a way that seems realistic).
- [ ] Ensure that our virtual hands (and the objects they hold) do not phase through other physics objects (e.g. walls and tables).
- [ ] Allow other scripts to force a grab and/or release to occur (for example, when you place it apart at the designated location, it gets removed from your hand and snaps into place).
- [ ] Have some form of weight simulation by making certain objects harder to push, lowering manipulation speed, or making objects only moveable with two hands.
- [ ] (Optional) Make it so the fingers of your virtual hands do not clip inside the meshes you are holding (certain people see this as an indicator of how fast the Force-Feedback activates - but it's basically just rendering).
We maintain [a detailed changelog for this project](Handbook/src/overview/changelog.md) as well. Please consult the changelog before upgrading to any newer release.
## Directory Structure
### Directory Structure
```
/
├── Config
├── Resources
└── Source (various plug-in modules)
├── SenseGlove (the UE-specific high-level API)
├── SenseGloveAndroid (the Android-specific module)
├── SenseGloveBackend (responsible for initialization and deinitialization of the backend libraries)
├── SenseGloveBackendKismet (exposes Blueprints-specific functionality from the SenseGloveBackend module)
├── SenseGloveBuildHacks (uses Exceptions and RTTI, internally used for compiler-specific build hacks)
├── SenseGloveConnect (exposes part of the SGConnect low-level API to C++)
├── SenseGloveConnectImpl (uses Exceptions and RTTI, intended for internal use only)
├── SenseGloveConnectKismet (SGConnect functionality exposed to Blueprints)
├── SenseGloveCore (exposes part of the SGCoreCpp low-level API to C++)
├── SenseGloveCoreImpl (uses Exceptions and RTTI, intended for internal use only)
├── SenseGloveCoreKismet (SGCoreCpp functionality exposed to Blueprints)
├── SenseGloveDebug (a utility debug module)
├── SenseGloveDebugKismet (exposes Blueprints-specific functionality from the SenseGloveDebug module)
├── SenseGloveEditor (the Editor module)
├── SenseGloveInterop (internally used for interoperability between RTTI disabled/enabled modules)
├── SenseGloveKismet (exposes Blueprints-specific functionality from the SenseGlove module)
├── SenseGloveLog (the internal log module)
├── SenseGloveSettings (the plugin's settings manager)
├── SenseGloveSettingsKismet (exposes Blueprints-specific functionality from the SenseGloveSettings module)
├── SenseGloveTracking (provides XR_EXT_hand_tracking support, HMD auto-detection, and SenseGlove device tracking)
├── SenseGloveTrackingKismet (exposes Blueprints-specific functionality from the SenseGloveTracking module)
├── SenseGloveTypes (exposes various enums from the backend libraries and also types from the SenseGlove module)
├── SenseGloveUtils (the internal utility module)
└── ThirdParty (3rd-party dependencies)
├── android (.jar file Java libraries for Android)
├── include (header files)
│ │
│ ├── boost
│ │
│ ├── SenseGlove
│ │ │
│ │ ├── Connect (SGConnect headers)
│ │ │
│ │ └── Core (SGCoreCpp headers)
│ │
│ └── serial
└── lib (platform-specific pre-built binary dependencies)
├── android
│ │
│ └── r25b (Android NDK r25b dependencies for UE 5.1+)
│ │
│ ├── arm64 (64-bit ARM variant of Android)
│ │ │
│ │ ├── debug
│ │ │
│ │ └── release
│ │
│ └── x64 (64-bit x86-64 variant of Android)
│ │
│ ├── debug
│ │
│ └── release
├── linux
│ │
│ ├── v21 (UE 5.2 Linux dependencies)
│ │ │
│ │ ├── aarch64 (dependencies targeting AArch64 Linux architecture)
│ │ │ │
│ │ │ ├── debug
│ │ │ │
│ │ │ └── release
│ │ │
│ │ └── x86-64 (dependencies targeting x86-64 Linux architecture)
│ │ │
│ │ ├── debug
│ │ │
│ │ └── release
│ │
│ └── v22 (UE 5.3 and 5.4 Linux dependencies)
│ │
│ ├── aarch64 (dependencies targeting AArch64 Linux architecture)
│ │ │
│ │ ├── debug
│ │ │
│ │ └── release
│ │
│ └── x86-64 (dependencies targeting x86-64 Linux architecture)
│ │
│ ├── debug
│ │
│ └── release
└── win64
├── msvc142 (Microsoft Visual Studio 2019 dependencies)
│ │
│ ├── debug
│ │
│ └── release
└── msvc143 (Microsoft Visual Studio 2022 dependencies)
├── debug
└── release
```
For the list of modules, directory structure, and how this plugin is organized please visit [the directory structure section](Handbook/src/overview/directory-structure.md).
## Licenses
### SenseGlove Unreal Engine Plug-in License
The SenseGlove plug-in for Unreal Engine is licensed under the terms of the [MIT License](LICENSE.md).
The SenseGlove plug-in for Unreal Engine is licensed under the terms of the [MIT License](Handbook/src/license/senseglove-unreal-engine-plugin.md).
### Third-Party Licenses
Please note that while the SenseGlove plug-in for Unreal Engine is made available under the [MIT License](LICENSE.md), it utilizes a few third-party libraries with permissive free licenses as well, in order to power various components. For a list of these libraries and their own respective open-source licenses take a look at [LICENSE-THIRD-PARTY.md](LICENSE-THIRD-PARTY.md), please.
Please note that while the SenseGlove Unreal Engine Plugin is made available under the MIT License, it utilizes a few third-party libraries with permissive free licenses as well, in order to power various components. For a list of these libraries and their own respective open-source licenses take a look at [the third-party licenses](Handbook/src/license/third-party.md), please.