add more documentation

This commit is contained in:
Mamadou Babaei
2022-11-18 15:02:38 +01:00
parent ff8cd3b4b6
commit fd4c0082ab
39 changed files with 2167 additions and 68 deletions
@@ -29,7 +29,7 @@
*
* @section DESCRIPTION
*
*
* An interface to get calibration to / from disk.
*/
@@ -44,37 +44,83 @@
class USGHapticGlove;
/**
* A glove developed by SenseGlove, that has hand tracking and/or haptic feedback functionality.
*/
USTRUCT()
struct SENSEGLOVECORE_API FSGHapticGloveHandProfiles
{
GENERATED_BODY()
public:
/**
* Returns the directory where our HandProfiles are stored.
*/
static FString GetProfileDirectory();
/**
* Set the directory where our HandProfiles are stored.
*/
static void SetProfileDirectory(const FString& Directory);
/**
* Access the latest Left Hand Profile from disk.
*/
static void GetLeftHandProfile(UObject* Outer, USGHandProfile*& OutHandProfile);
/**
* Sets the newest Left Hand Profile - also stores it on disk.
*/
static void SetLeftHandProfile(const USGHandProfile* HandProfile);
/**
* Access the latest Right Hand Profile from disk.
*/
static void GetRightHandProfile(UObject* Outer, USGHandProfile*& OutHandProfile);
/**
* Sets the newest Right Hand Profile - also stores it on disk.
*/
static void SetRightHandProfile(const USGHandProfile* HandProfile);
/**
* Retrieve a left- or right handed profile.
*/
static void GetProfile(UObject* Outer, bool bRightHanded, USGHandProfile*& OutHandProfile);
/**
* Store a profile in the global variables and on disk. The profile determines if this is a left or right hand.
*/
static void SetProfile(const USGHandProfile* HandProfile);
/**
* Store a profile in the global variables and on disk. You determine if this is a left or right hand.
*/
static void SetProfile(const USGHandProfile* HandProfile, bool bRightHanded);
/**
* Restore both profiles back to their default values.
*/
static void RestoreDefaults();
/**
* Restore the left- or right hand profiles back to their default values.
*/
static void RestoreDefaults(bool bRightHanded);
/**
* Load the latest profiles from disk. Automatically called when you first try to access a profile.
* Exposed so you can force-reload profiles.
*/
static void TryLoadingFromDisk();
/**
* Stores the last sensor range of a glove.
*/
static bool SaveLastRange(const USGSensorRange* CurrentRange, const USGHapticGlove* ForGlove);
/**
* Loads the last sensor range of a glove.
*/
static bool LoadLastRange(UObject* Outer, const USGHapticGlove* ForGlove, USGSensorRange*& OutLastRange);
};
};
@@ -45,6 +45,9 @@
class FSGHapticGloveQuickCalibrationImpl;
/**
*
*/
UCLASS(BlueprintType)
class SENSEGLOVECORE_API USGHapticGloveQuickCalibration final : public USGHapticGloveCalibrationSequence
{
@@ -57,14 +60,24 @@ public:
static USGHapticGloveQuickCalibration* NewHapticGloveQuickCalibration(
UObject* Outer, TSharedRef<FSGHapticGloveQuickCalibrationImpl> HapticGloveQuickCalibration);
public:
/**
*
*/
static USGHapticGloveQuickCalibration* NewHapticGloveQuickCalibration(UObject* Outer);
/**
* Create a new instance of a QuickCalibration for Haptic Gloves.
*/
static USGHapticGloveQuickCalibration* NewHapticGloveQuickCalibration(
UObject* Outer,
const USGHapticGlove* GloveToCalibrate,
float AutoEndTimeout = GetDefaultAutoEndTimeout());
public:
/**
* Default time in seconds, to end this sequence. 15 seconds is very quick for some people.
*/
static float GetDefaultAutoEndTimeout();
private:
@@ -79,8 +92,14 @@ private:
FImplDeleter PimplDeleter;
public:
/**
*
*/
USGHapticGloveQuickCalibration();
/**
* Create a new instance of a QuickCalibration for Haptic Gloves.
*/
explicit USGHapticGloveQuickCalibration(const USGHapticGlove* GloveToCalibrate,
float AutoEndTimeout = GetDefaultAutoEndTimeout());
@@ -121,31 +140,70 @@ protected:
virtual void SyncUProperties() override;
public:
/**
* Time, in seconds, after which this sequence stops gathering data. Based on the deltaSeconds variable passed in the Update() function.
*/
float GetAutoEndTimeout() const;
/**
* When compiling the final profile, we use a Weighted Moving Average filter with this period to filer out some outliers.
*/
int32 GetSmoothingSamples() const;
/**
* The min/max values recorded during this calibration sequence.
*/
USGSensorRange* GetSensorRange(UObject* Outer) const;
/**
* A temporary profile to apply the sensorRange to. Used to generate a 'preview' HandPose.
*/
USGHandProfile* GetTemporaryProfile(UObject* Outer) const;
/**
* Determines if the user has moved enough so that we can animate.
*/
bool CanAnimate() const;
public:
/**
* This sequence autocompletes after its autoEndTime has elapsed.
*/
bool AutoCompleted() const;
public:
/**
* Resets data points, min/max ranges and profile.
*/
void Reset();
/**
* Update this calibration sequence with new data. We use deltaSeconds to check for things like stability.
*/
void Update(float DeltaSeconds);
/**
* Add a new datapoint to this sequence's collection. Updates the range and profile used to generate a preview.
*/
void AddDataPoint(const TArray<FVector>& CalibrationData);
/**
* After we confirm the current step, we're basically done.
*/
void ConfirmCurrentStep();
/**
* Compile a sensor range from the data points collected while the sequence was running. Smoothed by a Moving Average Filter.
*/
bool CompileRange(UObject* Outer, USGSensorRange*& OutSensorRange) const;
/**
* Returns a 'preview' of what a HandPose with this sequence's current settings would look like.
*/
bool GetHandPose(UObject* Outer, bool bRightHanded, USGHandPose*& OutCurrentHandPose) const;
/**
* Retrieve instructions on what to do during the current step.
*/
FString GetCurrentInstruction(const FString& NextStepKey = FString{""}) const;
};
};
@@ -29,7 +29,8 @@
*
* @section DESCRIPTION
*
*
* Data class containing all variables to map an input value from one range to
* another.
*/
@@ -47,6 +48,9 @@
class FSGInterpolationSetImpl;
/**
* Set of variables to map a value from one range to the next.
*/
UCLASS(BlueprintType)
class SENSEGLOVECORE_API USGInterpolationSet final : public UObject
{
@@ -57,14 +61,26 @@ public:
UObject* Outer, const FSGInterpolationSetImpl& InterpolationSetImpl);
public:
/**
* Creates a basic interpolation set, without limits.
*/
static USGInterpolationSet* NewInterpolationSet(UObject* Outer);
/**
* Create a new interpolation set without limits.
*/
static USGInterpolationSet* NewInterpolationSet(UObject* Outer, float From1, float From2, float To1, float To2);
/**
* Create a new interpolation set with limits.
*/
static USGInterpolationSet* NewInterpolationSet(
UObject* Outer, float From1, float From2, float To1, float To2, float Min, float Max);
public:
/**
* Convert a string notation of an InterpolationSet into a new class instance.
*/
static USGInterpolationSet* Deserialize(UObject* Outer, const FString& SerializedString);
private:
@@ -79,10 +95,19 @@ private:
FImplDeleter PimplDeleter;
public:
/**
* Creates a basic interpolation set, without limits.
*/
USGInterpolationSet();
/**
* Create a new interpolation set without limits.
*/
USGInterpolationSet(float From1, float From2, float To1, float To2);
/**
* Create a new interpolation set with limits.
*/
USGInterpolationSet(float From1, float From2, float To1, float To2, float Min, float Max);
public:
@@ -110,40 +135,91 @@ public:
const FSGInterpolationSetImpl& ToInterpolationSetImpl() const;
public:
/**
* First value of input range.
*/
float GetX0() const;
/**
*
*/
void SetX0(float X0);
/**
* Second value of input range.
*/
float GetX1() const;
/**
*
*/
void SetX1(float X1);
/**
* First value of output range.
*/
float GetY0() const;
/**
*
*/
void SetY0(float Y0);
/**
* Second value of output range.
*/
float GetY1() const;
/**
*
*/
void SetY1(float Y1);
/**
* Minimum range of the output value.
*/
float GetMin() const;
/**
*
*/
void SetMin(float Min);
/**
* Maximum range of the output value.
*/
float GetMax() const;
/**
*
*/
void SetMax(float Max);
public:
/**
* Calculate an output value in range [x0...x1] to [y0..y1]
*/
float Get(float Value, bool bLimit, bool bNormalizeAngle = false) const;
public:
/**
* Returns true if this InterpolationSet has the same values as another set.
*/
bool Equals(const USGInterpolationSet* InterpolationSet) const;
public:
/**
*
*/
FString ToString() const;
/**
*
*/
FString ToString(bool bLimits) const;
/**
* Convert this InterpolationSet into a string notation so it can be stored on disk.
*/
FString SGSerialize() const;
};
};
@@ -29,7 +29,7 @@
*
* @section DESCRIPTION
*
*
* Contains kinematic formulae and wrappers for Sense Glove mathematics.
*/
@@ -44,27 +44,44 @@
#include "SGJointKinematics.generated.h"
/**
*
*/
USTRUCT()
struct SENSEGLOVECORE_API FSGJointKinematics
{
GENERATED_BODY()
public:
/**
* Perform forward Kinematics on a set of joints, defined by a start position- and rotation,
* joint angles and the lengths in between. Outputs the calculated positions and rotations.
*/
static bool ForwardKinematics(
const FVector& StartPosition, const FQuat& StartRotation,
const TArray<FVector>& JointLengths, const TArray<FVector>& JointAngles,
TArray<FVector>& OutNewPositions, TArray<FQuat>& OutNewRotations);
/**
* Perform forward Kinematics on a set of joints, defined by a start position- and rotation,
* joint angles and the lengths in between. Outputs the calculated positions and rotations.
*/
static bool ForwardKinematics(
const FVector& StartPosition, const FRotator& StartRotation,
const TArray<FVector>& JointLengths, const TArray<FVector>& JointAngles,
TArray<FVector>& OutNewPositions, TArray<FRotator>& OutNewRotations);
/**
* Calculate positions and rotations of a finger based on input angles and profile.
*/
static bool ForwardKinematics(
const USGBasicHandModel* Profile, ESGFinger Finger, const TArray<FVector>& JointAngles,
TArray<FVector>& OutNewPositions, TArray<FQuat>& OutNewRotations);
/**
* Calculate positions and rotations of a finger based on input angles and profile.
*/
static bool ForwardKinematics(
const USGBasicHandModel* Profile, ESGFinger Finger, const TArray<FVector>& JointAngles,
TArray<FVector>& OutNewPositions, TArray<FRotator>& OutNewRotations);
};
};
@@ -29,7 +29,7 @@
*
* @section DESCRIPTION
*
*
* Information about the SGCore C++ Library.
*/
@@ -29,7 +29,8 @@
*
* @section DESCRIPTION
*
*
* An interface for the "Nova" - a soft glove.
* Contains methods for Kinematics, Haptics and Serialization.
*/
@@ -55,6 +56,9 @@ class USGBuzzCommand;
class USGForceFeedbackCommand;
class USGThumperCommand;
/**
* A soft glove with Force- and Vibrotactile Feedback and limited tracking.
*/
UCLASS(BlueprintType)
class SENSEGLOVECORE_API USGNovaGlove final : public USGHapticGlove
{
@@ -66,59 +70,113 @@ public:
static USGNovaGlove* NewNovaGlove(UObject* Outer, TSharedRef<FSGNovaGloveImpl> NovaGloveImpl);
public:
/**
*
*/
static USGNovaGlove* NewNovaGlove(UObject* Outer);
/**
*
*/
static USGNovaGlove* NewNovaGlove(UObject* Outer, const USGNovaGloveInfo& DeviceInfo);
public:
/**
* Byte indicating a new Nova haptic command.
*/
static ANSICHAR GetHapticsByte();
/**
* Minimum calibration value distance until we apply the range.
*/
static FVector GetMinCalibrationRange();
public:
/**
* Calculate a Hand Pose based on a HandMode; sensor data from a Nova, and a UserProfile.
*/
static USGHandPose* CalculateHandPose(UObject* Outer,
const USGBasicHandModel* HandModel,
const USGNovaGloveSensorData* NovaData,
const USGNovaGloveHandProfile* Profile);
public:
/**
* Deserializes a Nova from its ConstantsString. Returns a nullptr if unsuccessful.
*/
static USGDevice* Parse(UObject* Outer, const FString& ConstantsString);
/**
* Retrieve all Nova's.
*/
static TArray<USGNovaGlove*> GetNovaGloves(UObject* Outer);
/**
* Retrieve the first connected Nova there is.
*/
static bool GetNovaGlove(UObject* Outer, USGNovaGlove*& OutGlove);
/**
* Retrieve the first (connected) right or left handed Nova.
*/
static bool GetNovaGlove(UObject* Outer, bool bRightHanded, USGNovaGlove*& OutGlove);
public:
/**
* Convert a SenseGlove GlovePose into calibrationValues.
*/
static TArray<FVector> GetCalibrationValues(const USGNovaGloveSensorData* SensorData);
/**
*
*/
static void CalibrateInterpolation(UObject* Outer,
const TArray<FVector>& MinValues, const TArray<FVector>& MaxValues,
USGNovaGloveHandProfile*& OutProfile);
public:
/**
* Retrieve the location of the glove origin, based on a reference location without requiring an object reference.
*/
static void CalculateGloveLocation(const FVector& ReferencePosition, const FQuat& ReferenceRotation,
ESGPositionalTrackingHardware TrackingHardware, bool bRightHanded,
FVector& OutGlovePosition, FQuat& OutGloveRotation);
/**
* Retrieve the location of the glove origin, based on a reference location without requiring an object reference.
*/
static void CalculateGloveLocation(const FVector& ReferencePosition, const FRotator& ReferenceRotation,
ESGPositionalTrackingHardware TrackingHardware, bool bRightHanded,
FVector& OutGlovePosition, FRotator& OutGloveRotation);
/**
* Retrieve the location of the wrist, based on a reference location and default glove-hand offsets, without needing an object reference.
*/
static void CalculateWristLocation(const FVector& ReferencePosition, const FQuat& ReferenceRotation,
ESGPositionalTrackingHardware TrackingHardware, bool bRightHanded,
FVector& OutWristPosition, FQuat& OutWristRotation);
/**
* Retrieve the location of the wrist, based on a reference location and default glove-hand offsets, without needing an object reference.
*/
static void CalculateWristLocation(const FVector& ReferencePosition, const FRotator& ReferenceRotation,
ESGPositionalTrackingHardware TrackingHardware, bool bRightHanded,
FVector& OutWristPosition, FRotator& OutWristRotation);
public:
/**
* Converts a thumper command into bytes that the Nova can understand.
*/
static FString ToBytes(const USGThumperCommand* ThumperCommand);
/**
* Converts a force-feedback command into bytes that the Nova can understand.
*/
static FString ToBytes(const USGForceFeedbackCommand* ForceFeedbackCommand);
/**
* Converts a buzz-motor command into bytes that the Nova can understand.
*/
static FString ToBytes(const USGBuzzCommand* BuzzCommand);
private:
@@ -193,78 +251,156 @@ protected:
virtual void SyncUProperties() override;
public:
/**
* Return the DeviceType of this Nova.
*/
virtual ESGDeviceType GetDeviceType() const override;
/**
* Returns this device's unique identifier.
*/
virtual FString GetDeviceId() const override;
/**
* Access this device's hardware designation.
*/
virtual FString GetHardwareVersion() const override;
/**
* Access this device's main firmware version. (ex: v3.2 -> 3).
*/
virtual int32 GetFirmwareVersion() const override;
/**
* Access this device's sub-firmware version. (ex: v3.2 -> 2).
*/
virtual int32 GetSubFirmwareVersion() const override;
public:
/**
* Returns true if this device operates on a battery.
*/
virtual bool HasBattery() const override;
/**
* Returns true if this device is currently charging.
*/
virtual bool IsCharging() override;
/**
* Returns the device's battery level, as a value between 0 (empty) and 1 (full).
*/
virtual bool GetBatteryLevel(float& OutBatteryLevel) override;
public:
/**
* Get the latest Sensor Data from this Sense Glove.
*/
bool GetSensorData(UObject* Outer, USGNovaGloveSensorData*& OutSensorData);
/**
* Retrieve Nova rotation.
*/
virtual bool GetImuRotation(FQuat& OutImu) override;
/**
* Retrieve Nova rotation.
*/
virtual bool GetImuRotation(FRotator& OutImu) override;
/// HACK
/// 'FSGNovaGlove::GetHandPose' hides overloaded virtual functions [-Werror,-Woverloaded-virtual]
/// tell the compiler we want both the GetHandPose from FSGHapticGlove and FSGNovaGlove
/// tell the compiler we want both the GetHandPose from USGHapticGlove and USGNovaGlove
using USGHapticGlove::GetHandPose;
/**
* Retrieve a new hand pose using this glove, based on (calibrated) user data.
*/
bool GetHandPose(UObject* Outer, const USGBasicHandModel* HandModel, const USGNovaGloveHandProfile* Profile,
USGHandPose*& OutHandPose);
/**
* Retrieve a new hand pose using this glove, based on (calibrated) user data.
*/
virtual bool GetHandPose(UObject* Outer, const USGBasicHandModel* HandGeometry, const USGHandProfile* HandProfile,
USGHandPose*& OutHandPose) override;
/**
* Calculate the HandPose of this Device, taking into account user values, but not hand geometry.
*/
virtual bool GetHandPose(UObject* Outer, const USGHandProfile* HandProfile, USGHandPose*& OutHandPose) override;
public:
/**
* Send all available haptics to a Nova.
*/
virtual void SendHaptics(const USGForceFeedbackCommand* ForceFeedbackCommand,
const USGBuzzCommand* BuzzCommand,
const USGThumperCommand* ThumperCommand) override;
/**
* Send Haptic Commands to this Glove.
*/
virtual void SendHaptics(const USGForceFeedbackCommand* ForceFeedbackCommand) override;
/**
* Send Haptic Commands to this Glove.
*/
virtual void SendHaptics(const USGBuzzCommand* BuzzCommand) override;
/**
* Send Haptic Commands to this Glove.
*/
virtual void SendHaptics(const USGThumperCommand* ThumperCommand) override;
public:
/**
* Retrieve calibration values of this glove, as an array of size 5, containing x (roll), y (flexion), z (abduction) values.
*/
virtual bool GetCalibrationValues(TArray<FVector>& OutValues) override;
/**
* Applies the calibration range of this Nova a HandProfile.
*/
virtual void ApplyCalibration(UObject* Outer, USGHandProfile*& OutProfile) const override;
/**
* Applies the calibration range of this SenseGlove to a NovaGloveHandProfile.
*/
void ApplyCalibration(UObject* Outer, USGNovaGloveHandProfile*& OutProfile) const;
public:
/**
* Retrieve the location of the glove origin, based on a reference location.
*/
virtual void GetGloveLocation(const FVector& ReferencePosition, const FQuat& ReferenceRotation,
ESGPositionalTrackingHardware TrackingHardware,
FVector& OutGlovePosition, FQuat& OutGloveRotation) const override;
/**
* Retrieve the location of the glove origin, based on a reference location.
*/
virtual void GetGloveLocation(const FVector& ReferencePosition, const FRotator& ReferenceRotation,
ESGPositionalTrackingHardware TrackingHardware,
FVector& OutGlovePosition, FRotator& OutGloveRotation) const override;
/**
* Retrieve the location of the wrist, based on a reference location and default glove-hand offsets.
*/
virtual void GetWristLocation(const FVector& ReferencePosition, const FQuat& ReferenceRotation,
ESGPositionalTrackingHardware TrackingHardware,
FVector& OutWristPosition, FQuat& OutWristRotation) const override;
/**
* Retrieve the location of the wrist, based on a reference location and default glove-hand offsets.
*/
virtual void GetWristLocation(const FVector& ReferencePosition, const FRotator& ReferenceRotation,
ESGPositionalTrackingHardware TrackingHardware,
FVector& OutWristPosition, FRotator& OutWristRotation) const override;
public:
/**
* Create a string representation of this device for reporting purposes.
*/
virtual FString ToString() const override;
};
};
@@ -42,21 +42,30 @@
#include "SGNovaGloveCalibration.generated.h"
/**
*
*/
USTRUCT()
struct SENSEGLOVECORE_API FSGNovaGloveCalibration
{
GENERATED_BODY()
public:
/**
* Apply a glove's default interpolation values to a profile, using the 'default' hand angles from calibration.
*/
static void ApplyDefaultCalibrationInterpolationValues(
const TArray<FVector>& RetractedValues,
const TArray<FVector>& ExtendedValues,
const USGNovaGloveHandProfile* Profile);
/**
* Apply a set of sensor-to-joint-angle interpolations to a nova profile.
*/
static void ApplyInterpolationValues(
const TArray<FVector>& RetractedValues,
const TArray<FVector>& ExtendedValues,
const TArray<TArray<FVector>>& RetractedAngles,
const TArray<TArray<FVector>>& ExtendedAngles,
const USGNovaGloveHandProfile* Profile);
};
};
@@ -29,7 +29,7 @@
*
* @section DESCRIPTION
*
*
* Nova SensorData, parsed from rae string representations.
*/
@@ -49,6 +49,9 @@
class FSGNovaGloveSensorDataImpl;
/**
* Sensor Data coming from a Nova, converted into useful values.
*/
UCLASS(BlueprintType)
class SENSEGLOVECORE_API USGNovaGloveSensorData final : public UObject
{
@@ -59,21 +62,39 @@ public:
UObject* Outer, const FSGNovaGloveSensorDataImpl& NovaGloveSensorDataImpl);
public:
/**
* Default constructor for NovaGloveSensorData.
*/
static USGNovaGloveSensorData* NewNovaGloveSensorData(UObject* Outer);
/**
* Create a new instance of a NovaGloveSensorData.
*/
static USGNovaGloveSensorData* NewNovaGloveSensorData(
UObject* Outer, const TArray<FVector>& Values, int32 ParsedValues,
const FQuat& ImuRotation, bool bImuParsed, float BatteryLevel, bool bCharging);
/**
* Create a new instance of a NovaGloveSensorData.
*/
static USGNovaGloveSensorData* NewNovaGloveSensorData(
UObject* Outer, const TArray<FVector>& Values, int32 ParsedValues,
const FRotator& ImuRotation, bool bImuParsed, float BatteryLevel, bool bCharging);
public:
/**
* Returns a NovaGloveSensorData without any values.
*/
static USGNovaGloveSensorData* Empty(UObject* Outer);
/**
* Parse the bytes as they come in from the device into useable values.
*/
static USGNovaGloveSensorData* Parse(UObject* Outer, const FString& RawData, const USGNovaGloveInfo* GloveInfo);
/**
* Convert this sensor data into ta string representation.
*/
static USGNovaGloveSensorData* Deserialize(UObject* Outer, const FString& SerializedString);
private:
@@ -88,11 +109,20 @@ private:
FImplDeleter PimplDeleter;
public:
/**
* Default constructor for NovaGloveSensorData.
*/
USGNovaGloveSensorData();
/**
* Create a new instance of a NovaGloveSensorData.
*/
USGNovaGloveSensorData(const TArray<FVector>& Values, int32 ParsedValues,
const FQuat& ImuRotation, bool bImuParsed, float BatteryLevel, bool bCharging);
/**
* Create a new instance of a NovaGloveSensorData.
*/
USGNovaGloveSensorData(const TArray<FVector>& Values, int32 ParsedValues,
const FRotator& ImuRotation, bool bImuParsed, float BatteryLevel, bool bCharging);
@@ -121,25 +151,55 @@ public:
const FSGNovaGloveSensorDataImpl& ToNovaGloveSensorDataImpl() const;
public:
/**
* Pronation/Supination, Flexion/Extension and Abduction/Adduction values for each finger.
*/
TArray<FVector> GetSensorValues() const;
/**
* Quaternion rotation relative to magnetic north.
*/
FQuat GetImuRotationQ() const;
/**
* Rotation relative to magnetic north.
*/
FRotator GetImuRotation() const;
/**
* The number of values that were parsed from the sensor string.
*/
int32 GetParsedValues() const;
/**
* Whether the IMU values were all successfully parsed, or not.
*/
bool IsImuParsed() const;
/**
* A value between 0..1 that represents the battery level of this Nova Glove (0 .. 100%). Returns -1 if the value wasn't received.
*/
float GetBatteryLevel() const;
/**
* Returns true if this NovaGlove is connected to a power source
*/
bool IsCharging() const;
public:
/**
* Returns true if this sensor data contains the same values as another.
*/
bool Equals(const USGNovaGloveSensorData* NovaGloveSensorData) const;
public:
/**
* Create a readable string representation of this Sensor Data
*/
FString ToString() const;
/**
* Convert this sensor data into a string so it can be stored on disk.
*/
FString SGSerialize() const;
};
};
@@ -40,21 +40,42 @@
#include "SGSenseCom.generated.h"
/**
*
*/
USTRUCT()
struct SENSEGLOVECORE_API FSGSenseCom
{
GENERATED_BODY()
public:
/**
* Registers current process as the latest SenseCom build.
*/
static bool RegisterExe();
/**
* Register a particular path as the SenseGlove executable location.
*/
static bool RegisterExe(const FString& ExePath);
/**
* Retrieve the location of SenseGlove executable.
*/
static bool GetExePath(FString& OutExePath);
/**
* Returns true if SenseCom scanning is active.
*/
static bool ScanningActive();
/**
* Returns the directory of the current process.
*/
static bool GetCurrentExeDirectory(FString& OutDirectory);
/**
* Force-starts the SenseCom application if it is active on the system.
*/
static bool StartupSenseCom();
};
};
@@ -447,14 +447,14 @@ public:
FVector& OutWristPosition, FQuat& OutWristRotation) const override;
/**
*
* Retrieve the location of the wrist, based on a reference location and default glove-hand offsets.
*/
virtual void GetWristLocation(const FVector& ReferencePosition, const FRotator& ReferenceRotation,
ESGPositionalTrackingHardware TrackingHardware,
FVector& OutWristPosition, FRotator& OutWristRotation) const override;
/**
*
* Retrieve the location of the wrist, based on a reference location and default glove-hand offsets.
*/
void GetWristLocation(const FVector& ReferencePosition, const FQuat& ReferenceRotation,
ESGPositionalTrackingHardware TrackingHardware,
@@ -463,7 +463,7 @@ public:
FVector& OutWristPosition, FQuat& OutWristRotation) const;
/**
*
* Retrieve the location of the wrist, based on a reference location and default glove-hand offsets.
*/
void GetWristLocation(const FVector& ReferencePosition, const FRotator& ReferenceRotation,
ESGPositionalTrackingHardware TrackingHardware,
@@ -473,7 +473,7 @@ public:
public:
/**
*
* Create a string representation of this device for reporting purposes.
*/
virtual FString ToString() const override;
};
@@ -29,7 +29,8 @@
*
* @section DESCRIPTION
*
*
* Input for Sense Glove kinematics to calculate a HandPose.
* Output of calibration algorithms.
*/
@@ -49,6 +50,9 @@
class FSGSenseGloveHandProfileImpl;
/**
* Contains everything a Sense Glove needs to calculate a HandPose.
*/
UCLASS(BlueprintType)
class SENSEGLOVECORE_API USGSenseGloveHandProfile final : public UObject
{
@@ -59,18 +63,33 @@ public:
UObject* Outer, const FSGSenseGloveHandProfileImpl& SenseGloveHandProfileImpl);
public:
/**
* The basic constructor.
*/
static USGSenseGloveHandProfile* NewSenseGloveHandProfile(UObject* Outer);
/**
* Create a new Hand Profile for the Sense Glove.
*/
static USGSenseGloveHandProfile* NewSenseGloveHandProfile(
UObject* Outer, bool bRightHanded, const USGHandInterpolator* Interpolator,
ESGThumbSolver ThumbSolver, ESGFingerSolver FingerSolver, const TArray<FVector>& FingerThimbleOffset);
public:
/**
* Retrieve a 'new' profile, for either a left or right hand.
*/
static USGSenseGloveHandProfile* Default(UObject* Outer, bool bRightHanded);
/**
* Deserialize a HandProfile back into usable values.
*/
static USGSenseGloveHandProfile* Deserialize(UObject* Outer, const FString& SerializedString);
public:
/**
* Default offset from thimble to fingertip.
*/
static FVector GetDefaultThimbleOffset();
private:
@@ -85,8 +104,14 @@ private:
FImplDeleter PimplDeleter;
public:
/**
* The basic constructor.
*/
USGSenseGloveHandProfile();
/**
* Create a new Hand Profile for the Sense Glove.
*/
USGSenseGloveHandProfile(bool bRightHanded, const USGHandInterpolator* Interpolator,
ESGThumbSolver ThumbSolver, ESGFingerSolver FingerSolver,
const TArray<FVector>& FingerThimbleOffset);
@@ -116,21 +141,45 @@ public:
const FSGSenseGloveHandProfileImpl& ToSenseGloveHandProfileImpl() const;
public:
/**
* Check whether this profile has been created for a right hand (true) or left hand (false).
*/
bool IsRight() const;
/**
* Interpolation set to estimate joint angles.
*/
USGHandInterpolator* GetInterpolationSet(UObject* Outer) const;
/**
* Solver property that determines _how_ HandPoses are calculated.
*/
ESGThumbSolver GetThumbSolver() const;
/**
* Solver property that determines _how_ finger poses are calculated.
*/
ESGFingerSolver GetFingerSolver() const;
/**
* Offset from thimble to fingertip, used for Inverse Kinematics.
*/
TArray<FVector> GetFingerThimbleOffset() const;
public:
/**
*
*/
bool Equals(const USGSenseGloveHandProfile* SenseGloveHandProfile) const;
/**
* Reset calibration on this profile.
*/
void Reset();
public:
/**
* Serialize this HandProfile into a string representation.
*/
FString SGSerialize() const;
};
};
@@ -29,7 +29,7 @@
*
* @section DESCRIPTION
*
*
* Glove information taken from the Sense Glove.
*/
@@ -49,6 +49,9 @@
class FSGSenseGloveInfoImpl;
/**
* Glove Information taken from a SenseGlove. Contains everything from unique ID, firmware version, etc.
*/
UCLASS(BlueprintType)
class SENSEGLOVECORE_API USGSenseGloveInfo final : public UObject
{
@@ -59,8 +62,14 @@ public:
UObject* Outer, const FSGSenseGloveInfoImpl& SenseGloveInfoImpl);
public:
/**
* The default constructor.
*/
static USGSenseGloveInfo* NewSenseGloveInfo(UObject* Outer);
/**
* Create a new Sense Glove device model.
*/
static USGSenseGloveInfo* NewSenseGloveInfo(
UObject* Outer, const FString& DeviceId,
const FString& HardwareVersion, int32 FirmwareVersion, int32 SubFirmwareVersion,
@@ -68,6 +77,9 @@ public:
const TArray<FVector>& StartPositions, const TArray<FQuat>& StartRotations,
const TArray<TArray<FVector>>& GloveLengths, const TArray<bool>& Functions);
/**
* Create a new Sense Glove device model.
*/
static USGSenseGloveInfo* NewSenseGloveInfo(
UObject* Outer, const FString& DeviceId,
const FString& HardwareVersion, int32 FirmwareVersion, int32 SubFirmwareVersion,
@@ -75,6 +87,9 @@ public:
const TArray<FVector>& StartPositions, const TArray<FRotator>& StartRotations,
const TArray<TArray<FVector>>& GloveLengths, const TArray<bool>& Functions);
/**
* Create a new Sense Glove device model.
*/
static USGSenseGloveInfo* NewSenseGloveInfo(
UObject* Outer, const FString& DeviceId,
const FString& HardwareVersion, int32 FirmwareVersion, int32 SubFirmwareVersion,
@@ -82,6 +97,9 @@ public:
const TArray<FVector>& StartPositions, const TArray<FQuat>& StartRotations,
const TArray<FSGVectorArray>& GloveLengths, const TArray<bool>& Functions);
/**
* Create a new Sense Glove device model.
*/
static USGSenseGloveInfo* NewSenseGloveInfo(
UObject* Outer, const FString& DeviceId,
const FString& HardwareVersion, int32 FirmwareVersion, int32 SubFirmwareVersion,
@@ -90,9 +108,15 @@ public:
const TArray<FSGVectorArray>& GloveLengths, const TArray<bool>& Functions);
public:
/**
* Create an instance of the SGModel from its string representation.
*/
static bool Parse(UObject* Outer, const FString& ConstantsString, USGSenseGloveInfo*& OutGloveInfo,
bool bUpdateOldModels = true);
/**
* Deserialize a HandProfile back into usable values.
*/
static USGSenseGloveInfo* Deserialize(UObject* Outer, const FString& SerializedString);
private:
@@ -107,26 +131,41 @@ private:
FImplDeleter PimplDeleter;
public:
/**
* The default constructor.
*/
USGSenseGloveInfo();
/**
* Create a new Sense Glove device model.
*/
USGSenseGloveInfo(const FString& DeviceId,
const FString& HardwareVersion, int32 FirmwareVersion, int32 SubFirmwareVersion,
bool bRightHanded, int32 NumberOfSensors, const FQuat& ImuCorrection,
const TArray<FVector>& StartPositions, const TArray<FQuat>& StartRotations,
const TArray<TArray<FVector>>& GloveLengths, const TArray<bool>& Functions);
/**
* Create a new Sense Glove device model.
*/
USGSenseGloveInfo(const FString& DeviceId,
const FString& HardwareVersion, int32 FirmwareVersion, int32 SubFirmwareVersion,
bool bRightHanded, int32 NumberOfSensors, const FRotator& ImuCorrection,
const TArray<FVector>& StartPositions, const TArray<FRotator>& StartRotations,
const TArray<TArray<FVector>>& GloveLengths, const TArray<bool>& Functions);
/**
* Create a new Sense Glove device model.
*/
USGSenseGloveInfo(const FString& DeviceId,
const FString& HardwareVersion, int32 FirmwareVersion, int32 SubFirmwareVersion,
bool bRightHanded, int32 NumberOfSensors, const FQuat& ImuCorrection,
const TArray<FVector>& StartPositions, const TArray<FQuat>& StartRotations,
const TArray<FSGVectorArray>& GloveLengths, const TArray<bool>& Functions);
/**
* Create a new Sense Glove device model.
*/
USGSenseGloveInfo(const FString& DeviceId,
const FString& HardwareVersion, int32 FirmwareVersion, int32 SubFirmwareVersion,
bool bRightHanded, int32 NumberOfSensors, const FRotator& ImuCorrection,
@@ -164,50 +203,116 @@ protected:
FSGSenseGloveInfoImpl& ToSenseGloveInfoImpl();
public:
/**
* Unique identifier of this device.
*/
FString GetDeviceId() const;
/**
* Hardware (sub) version of this Sense Glove Device.
*/
FString GetHardwareVersion() const;
/**
* Firmware version running on the device's MicroController.
*/
int32 GetFirmwareVersion() const;
/**
* Sub-Firmware version running on the device's MicroController.
*/
int32 GetSubFirmwareVersion() const;
/**
* Check if this Sense Glove belongs to a left or right hand.
*/
bool IsRight() const;
/**
* The number of Sensors in this SenseGlove.
*/
int32 GetNumberOfSensors() const;
/**
* The IMU correction of this Sense Glove.
*/
FQuat GetImuCorrectionQ() const;
/**
* The IMU correction of this Sense Glove.
*/
FRotator GetImuCorrection() const;
/**
* The starting positions of each Sense Glove finger, relative to the glove origin.
*/
TArray<FVector> GetStartPositions() const;
/**
* The starting rotations of each Sense Glove finger, relative to the glove origin.
*/
TArray<FQuat> GetStartRotationsQ() const;
/**
* The starting rotations of each Sense Glove finger, relative to the glove origin.
*/
TArray<FRotator> GetStartRotations() const;
/**
* The lengths of each Sense Glove finger section, in cm.
*/
TArray<TArray<FVector>> GetGloveLengths() const;
/**
* Whether this device has a specific function (T/F).
*/
TArray<bool> GetFunctions() const;
public:
/**
* The starting position of one Sense Glove finger, relative to the glove origin.
*/
FVector GetStartPosition(ESGFinger Finger) const;
/**
* The starting rotation of one Sense Glove finger, relative to the glove origin.
*/
FQuat GetStartRotationQ(ESGFinger Finger) const;
/**
* The starting rotation of one Sense Glove finger, relative to the glove origin.
*/
FRotator GetStartRotation(ESGFinger Finger) const;
/**
* The lengths of one Sense Glove finger's sections, in cm.
*/
TArray<FVector> GetGloveLengths(ESGFinger Finger) const;
public:
/**
* Place incoming sensor data into the right format, according to this glove's model.
*/
TArray<TArray<FVector>> ToGloveAngles(const TArray<TArray<float>>& SensorAngles) const;
/**
* Returns true if this SG_Model has the same values as another.
*/
bool Equals(const USGSenseGloveInfo* SenseGloveInfo) const;
public:
/**
* Create a string representation for logging. If shortNotation is false, all values are reported.
*/
FString ToString() const;
/**
* Create a string representation for fast logging.
*/
FString ToString(bool bShortNotation) const;
/**
* Serialize this HandProfile into a string representation.
*/
FString SGSerialize() const;
};
};
@@ -29,7 +29,8 @@
*
* @section DESCRIPTION
*
*
* Contains position and rotation data of a SenseGlove's exoskeleton, along
* with accessors for relevant variables.
*/
@@ -55,6 +56,9 @@
class FSGSenseGlovePoseImpl;
/**
* Represents a pose of a Sense Glove exoskeleton.
*/
UCLASS(BlueprintType)
class SENSEGLOVECORE_API USGSenseGlovePose final : public UObject
{
@@ -65,31 +69,52 @@ public:
UObject* Outer, const FSGSenseGlovePoseImpl& SenseGlovePoseImpl);
public:
/**
* The basic constructor.
*/
static USGSenseGlovePose* NewSenseGlovePose(UObject* Outer);
/**
* Creates a new instance of a SenseGlovePose.
*/
static USGSenseGlovePose* NewSenseGlovePose(UObject* Outer, bool bRightHanded,
const TArray<TArray<FVector>>& JointPositions,
const TArray<TArray<FQuat>>& JointRotations,
const TArray<TArray<FVector>>& GloveAngles);
/**
* Creates a new instance of a SenseGlovePose.
*/
static USGSenseGlovePose* NewSenseGlovePose(UObject* Outer, bool bRightHanded,
const TArray<TArray<FVector>>& JointPositions,
const TArray<TArray<FRotator>>& JointRotations,
const TArray<TArray<FVector>>& GloveAngles);
/**
* Creates a new instance of a SenseGlovePose.
*/
static USGSenseGlovePose* NewSenseGlovePose(UObject* Outer, bool bRightHanded,
const TArray<FSGVectorArray>& JointPositions,
const TArray<FSGQuatArray>& JointRotations,
const TArray<FSGVectorArray>& GloveAngles);
/**
* Creates a new instance of a SenseGlovePose.
*/
static USGSenseGlovePose* NewSenseGlovePose(UObject* Outer, bool bRightHanded,
const TArray<FSGVectorArray>& JointPositions,
const TArray<FSGRotatorArray>& JointRotations,
const TArray<FSGVectorArray>& GloveAngles);
public:
/**
* Returns an idle pose for the Sense Glove if no data can be found.
*/
static USGSenseGlovePose* IdlePose(UObject* Outer, const USGSenseGloveInfo* GloveInfo);
/**
* Deserialize a GlovePose back into usable values.
*/
static USGSenseGlovePose* Deserialize(UObject* Outer, const FString& SerializedString);
private:
@@ -104,23 +129,38 @@ private:
FImplDeleter PimplDeleter;
public:
/**
* The basic constructor.
*/
USGSenseGlovePose();
/**
* Creates a new instance of a SenseGlovePose.
*/
USGSenseGlovePose(bool bRightHanded,
const TArray<TArray<FVector>>& JointPositions,
const TArray<TArray<FQuat>>& JointRotations,
const TArray<TArray<FVector>>& GloveAngles);
/**
* Creates a new instance of a SenseGlovePose.
*/
USGSenseGlovePose(bool bRightHanded,
const TArray<TArray<FVector>>& JointPositions,
const TArray<TArray<FRotator>>& JointRotations,
const TArray<TArray<FVector>>& GloveAngles);
/**
* Creates a new instance of a SenseGlovePose.
*/
USGSenseGlovePose(bool bRightHanded,
const TArray<FSGVectorArray>& JointPositions,
const TArray<FSGQuatArray>& JointRotations,
const TArray<FSGVectorArray>& GloveAngles);
/**
* Creates a new instance of a SenseGlovePose.
*/
USGSenseGlovePose(bool bRightHanded,
const TArray<FSGVectorArray>& JointPositions,
const TArray<FSGRotatorArray>& JointRotations,
@@ -151,33 +191,77 @@ public:
const FSGSenseGlovePoseImpl& ToSenseGlovePoseImpl() const;
public:
/**
* Whether this Glove Pose was created for be a right- or left hand, or not.
*/
bool IsRight() const;
/**
* Positions of each glove joint, relative to the Glove's Origin.
*/
TArray<TArray<FVector>> GetJointPositions() const;
/**
* Quaternion rotation of each glove joint, relative to the Glove Origin.
*/
TArray<TArray<FQuat>> GetJointRotationsQ() const;
/**
* Rotation of each glove joint, relative to the Glove Origin.
*/
TArray<TArray<FRotator>> GetJointRotations() const;
/**
* Glove joint angles in euler notation, relative to the last segment.
*
* @remarks Essentially sensor angles, though placed in their proper xyz notation.
*/
TArray<TArray<FVector>> GetGloveAngles() const;
public:
/**
* The position of the tip of the 'thimbles', the furthest link on each glove link.
*/
TArray<FVector> GetThimblePositions() const;
/**
* The (quaternion) rotation of the 'thimbles', the furthest link on each link.
*/
TArray<FQuat> GetThimbleRotationsQ() const;
/**
* The rotation of the 'thimbles', the furthest link on each link.
*/
TArray<FRotator> GetThimbleRotations() const;
/**
* Sum of the Sensor angles in each (xyz) direction. "Total Pronation / Flexion / Abduction".
*/
TArray<FVector> GetTotalGloveAngles() const;
/**
* Calculate fingertip positions based on a user profile.
*/
TArray<FVector> CalculateFingerTips(const USGSenseGloveHandProfile* SenseGloveHandProfile) const;
/**
* Calculate fingertip positions, knowing the offset between thimble and fingertips.
*/
TArray<FVector> CalculateFingerTips(const TArray<FVector>& FingerOffsets) const;
/**
* Returns true if this glove pose equals another.
*/
bool Equals(const USGSenseGlovePose* SenseGlovePose) const;
public:
/**
* Returns a user-friendly string representation of this GlovePose for reporting.
*/
FString ToString(bool bShortFormat = false) const;
/**
* Serialize this GlovePose into a string representation.
*/
FString SGSerialize() const;
};
};
@@ -29,7 +29,7 @@
*
* @section DESCRIPTION
*
*
* Parsed sensor data coming form a Sense Glove.
*/
@@ -50,6 +50,9 @@
class FSGSenseGloveSensorDataImpl;
/**
* Sense Glove Sensor Data, parsed from a sensor string.
*/
UCLASS(BlueprintType)
class SENSEGLOVECORE_API USGSenseGloveSensorData final : public UObject
{
@@ -60,29 +63,53 @@ public:
UObject* Outer, const FSGSenseGloveSensorDataImpl& SenseGloveSensorDataImpl);
public:
/**
* The basic constructor.
*/
static USGSenseGloveSensorData* NewSenseGloveSensorData(UObject* Outer);
/**
* Create a new instance of a Sense Glove Sensor Data class.
*/
static USGSenseGloveSensorData* NewSenseGloveSensorData(
UObject* Outer, const TArray<TArray<float>>& SensorAngles,
const FQuat& ImuRotation, int32 ParsedValues, bool bImuParsed);
/**
* Create a new instance of a Sense Glove Sensor Data class.
*/
static USGSenseGloveSensorData* NewSenseGloveSensorData(
UObject* Outer, const TArray<TArray<float>>& SensorAngles,
const FRotator& ImuRotation, int32 ParsedValues, bool bImuParsed);
/**
* Create a new instance of a Sense Glove Sensor Data class.
*/
static USGSenseGloveSensorData* NewSenseGloveSensorData(
UObject* Outer, const TArray<FSGFloatArray>& SensorAngles,
const FQuat& ImuRotation, int32 ParsedValues, bool bImuParsed);
/**
* Create a new instance of a Sense Glove Sensor Data class.
*/
static USGSenseGloveSensorData* NewSenseGloveSensorData(
UObject* Outer, const TArray<FSGFloatArray>& SensorAngles,
const FRotator& ImuRotation, int32 ParsedValues, bool bImuParsed);
public:
/**
* Returns sensor data with no values.
*/
static USGSenseGloveSensorData* Empty(UObject* Outer);
/**
* Deserialize Sense Glove sensor data from a raw char[] received through IPC.
*/
static USGSenseGloveSensorData* Parse(UObject* Outer, const FString& RawData, const USGSenseGloveInfo* GloveInfo);
/**
* Deserialize a HandProfile back into useable values.
*/
static USGSenseGloveSensorData* Deserialize(UObject* Outer, const FString& SerializedString);
private:
@@ -97,17 +124,32 @@ private:
FImplDeleter PimplDeleter;
public:
/**
* The basic constructor.
*/
USGSenseGloveSensorData();
/**
* Create a new instance of a Sense Glove Sensor Data class.
*/
USGSenseGloveSensorData(const TArray<TArray<float>>& SensorAngles,
const FQuat& ImuRotation, int32 ParsedValues, bool bImuParsed);
/**
* Create a new instance of a Sense Glove Sensor Data class.
*/
USGSenseGloveSensorData(const TArray<TArray<float>>& SensorAngles,
const FRotator& ImuRotation, int32 ParsedValues, bool bImuParsed);
/**
* Create a new instance of a Sense Glove Sensor Data class.
*/
USGSenseGloveSensorData(const TArray<FSGFloatArray>& SensorAngles,
const FQuat& ImuRotation, int32 ParsedValues, bool bImuParsed);
/**
* Create a new instance of a Sense Glove Sensor Data class.
*/
USGSenseGloveSensorData(const TArray<FSGFloatArray>& SensorAngles,
const FRotator& ImuRotation, int32 ParsedValues, bool bImuParsed);
@@ -136,26 +178,56 @@ public:
const FSGSenseGloveSensorDataImpl& ToSenseGloveSensorDataImpl() const;
public:
/**
* Glove angles in radians, sorted by finger, from proximal to distal.
*/
TArray<TArray<float>> GetSensorAngles() const;
/**
*
*/
FQuat GetImuRotationQ() const;
/**
*
*/
FRotator GetImuRotation() const;
/**
* Check how many values have been parsed from the Sensor String.
*/
int32 GetParsedValues() const;
/**
* Check if the IMU was properly parsed.
*/
bool IsImuParsed() const;
public:
/**
* Get the glove angles of a specific finger segment.
*/
TArray<float> GetSensorAngles(ESGFinger Finger) const;
/**
* Returns all glove angles in a sequence, without splitting them per finger.
*/
TArray<float> GetAngleSequence() const;
public:
/**
* Returns true if the values of both data are equal.
*/
bool Equals(const USGSenseGloveSensorData* SenseGloveSensorData) const;
public:
/**
* Retrieve a simple representation of this sensor data for debugging purposes.
*/
FString ToString() const;
/**
* Serialize this HandProfile into a string representation.
*/
FString SGSerialize() const;
};
};
@@ -29,7 +29,7 @@
*
* @section DESCRIPTION
*
*
* Contains enumerators and classes to aid in Sense Glove Deserialization.
*/
@@ -45,35 +45,76 @@
#include "SGSenseGloveVars.generated.h"
/**
* "Database" class containing Sense Glove internal variables.
*/
USTRUCT()
struct SENSEGLOVECORE_API FSGSenseGloveVars
{
GENERATED_BODY()
public:
/**
* Retrieve a basic ConstantsString for a Sense Glove of a specific Hardware Version. Used for debugging / unit tests.
*
* @returns Returns an empty string when an invalid glove version is requested.
*/
static FString GetStandardConstantsString(const FString& HardwareVersion, float FirmwareVersion, bool bRightHanded);
/**
* Retrieve an example sensor string of a Sense Glove with a particular hardware- and firmware version.
*/
static FString GetSensorString(const FString& HardwareVersion, float FirmwareVersion);
/**
* Retrieve the starting positions of a particular Sense Glove.
*/
static TArray<FVector> GetStartPositions(const FString& HardwareVersion, bool bRightHanded);
/**
* Retrieve the starting rotations of a particular Sense Glove.
*/
static TArray<FQuat> GetStartRotationsQ(const FString& HardwareVersion, bool bRightHanded);
/**
* Retrieve the starting rotations of a particular Sense Glove.
*/
static TArray<FRotator> GetStartRotations(const FString& HardwareVersion, bool bRightHanded);
/**
* Retrieve the glove finger lengths of a particular Sense Glove.
*/
static TArray<TArray<FVector>> GetGloveLengths(const FString& HardwareVersion);
/**
* Get the number of sensors of a SenseGlove.
*/
static int32 GetSensors(const FString& HardwareVersion);
/**
* Get the default IMUCorrection for the SenseGlove.
*/
static FQuat GetImuCorrectionQ(const FString& HardwareVersion, int32 FirmwareVersion, int32 SubFirmwareVersion);
/**
* Get the default IMUCorrection for the SenseGlove.
*/
static FRotator GetImuCorrection(const FString& HardwareVersion, int32 FirmwareVersion, int32 SubFirmwareVersion);
/**
* Check all functionality of a SenseGlove.
*/
static TArray<bool> GetFunctions(const FString& HardwareVersion, int32 FirmwareVersion, int32 SubFirmwareVersion);
/**
* Generate a custom glove info.
*/
static USGSenseGloveInfo* GenerateGloveModel(UObject* Outer, const FString& HardwareVersion, int32 FirmwareVersion,
int32 SubFirmwareVersion, bool bRightHanded);
/**
* Generate a custom glove info.
*/
static USGSenseGloveInfo* GenerateGloveModel(UObject* Outer, const FString& HardwareVersion, int32 FirmwareVersion,
int32 SubFirmwareVersion, bool bRightHanded, const FString& CustomId);
};
};
@@ -46,6 +46,9 @@
class FSGSensorRangeImpl;
/**
*
*/
UCLASS(BlueprintType)
class SENSEGLOVECORE_API USGSensorRange final : public UObject
{
@@ -56,18 +59,36 @@ public:
UObject* Outer, const FSGSensorRangeImpl& SensorRangeImpl);
public:
/**
* Create a new instance of a SensorRange with values at 0, 0.
*/
static USGSensorRange* NewSensorRange(UObject* Outer);
/**
* Create a new SensorRange with predefined Min/Max values.
*/
static USGSensorRange* NewSensorRange(UObject* Outer,
const TArray<FVector>& MinValues, const TArray<FVector>& MaxValues);
public:
/**
* Generates a Sensor Range where minimum values are float.MaxValue and maximum values are float.MinValue.
*/
static USGSensorRange* ForCalibration(UObject* Outer);
/**
* Convert a serialized SensorRange back into the appropriate class.
*/
static USGSensorRange* Deserialize(UObject* Outer, const FString& SerializedString);
/**
* Evaluate maxValues so that it contains the highest x, y, and z values between currentValues and maxValues.
*/
static void CheckMax(const FVector CurrentValues, FVector& OutMaxValues);
/**
* Evaluate minValues so that it contains the lowest x, y, and z values between currentValues and minValues.
*/
static void CheckMin(const FVector& CurrentValues, FVector& OutMinValues);
private:
@@ -82,8 +103,14 @@ private:
FImplDeleter PimplDeleter;
public:
/**
* Create a new instance of a SensorRange with values at 0, 0.
*/
USGSensorRange();
/**
* Create a new SensorRange with predefined Min/Max values.
*/
USGSensorRange(const TArray<FVector>& MinValues, const TArray<FVector>& MaxValues);
public:
@@ -111,25 +138,55 @@ public:
const FSGSensorRangeImpl& ToSensorRangeImpl() const;
public:
/**
* Access the lowest values values of this range.
*/
TArray<FVector> GetMinValues() const;
/**
* Set the lowest values values of this range.
*/
void SetMinValues(const TArray<FVector>& Values);
/**
* Access the highest values values of this range.
*/
TArray<FVector> GetMaxValues() const;
/**
* Set the highest values values of this range.
*/
void SetMaxValues(const TArray<FVector>& Values);
/**
* Access the difference between min and max values.
*/
TArray<FVector> GetRange() const;
public:
/**
* Update the Range based on the current MinValues and MaxValues.
*/
void UpdateRange();
/**
* In otherValues are greater/smaller than this current range, update them.
*/
void CheckForExtremes(const TArray<FVector>& OtherValues);
public:
/**
* Report the Range value of this SensorRange, separated by a comma.
*/
FString RangeString(bool bYOnly = true) const;
/**
* Convert this SensorRange into a string rotation [min ... max].
*/
FString ToString(bool bYOnly = true) const;
/**
* Serialize this SensorRange into a string representation, that can be deserialized later.
*/
FString SGSerialize() const;
};
};
@@ -29,7 +29,7 @@
*
* @section DESCRIPTION
*
*
* Thumper command.
*/
@@ -44,6 +44,9 @@
class FSGThumperCommandImpl;
/**
*
*/
UCLASS(BlueprintType)
class SENSEGLOVECORE_API USGThumperCommand : public UObject
{
@@ -53,11 +56,20 @@ public:
static USGThumperCommand* NewThumperCommand(UObject* Outer, const FSGThumperCommandImpl& ThumperCommandImpl);
public:
/**
* Empty constructor for inheritance.
*/
static USGThumperCommand* NewThumperCommand(UObject* Outer);
/**
* Create a new Thumper Command.
*/
static USGThumperCommand* NewThumperCommand(UObject* Outer, int32 Magnitude);
public:
/**
* A command that turns off all force feedback on the Sense Glove.
*/
static USGThumperCommand* Off(UObject* Outer);
private:
@@ -72,7 +84,14 @@ private:
FImplDeleter PimplDeleter;
public:
/**
* Empty constructor for inheritance.
*/
USGThumperCommand();
/**
* Create a new Thumper Command.
*/
explicit USGThumperCommand(int32 Magnitude);
public:
@@ -100,14 +119,29 @@ public:
const FSGThumperCommandImpl& ToThumperCommandImpl() const;
public:
/**
* Thumper intensity, a level between 0 and 100.
*/
int32 GetMagnitude() const;
/**
*
*/
void SetMagnitude(int32 Magnitude);
public:
/**
* Duplicate the Thumper command.
*/
USGThumperCommand* Copy(UObject* Outer) const;
/**
* Merge two ThumperCommands into one.
*/
USGThumperCommand* Merge(UObject* Outer, const USGThumperCommand* ThumperCommand) const;
/**
*
*/
bool Equals(const USGThumperCommand* ThumperCommand) const;
};
};
@@ -29,7 +29,7 @@
*
* @section DESCRIPTION
*
*
* Buzz Motor with timing parameters.
*/
@@ -46,6 +46,11 @@
class FSGTimedBuzzCommandImpl;
/**
* Buzz motor commands that is meant to stop after a few milliseconds.
*
* @remarks Intended use; this.levels indicates the actual command.
*/
UCLASS(BlueprintType)
class SENSEGLOVECORE_API USGTimedBuzzCommand : public USGBuzzCommand
{
@@ -59,12 +64,21 @@ public:
UObject* Outer, TSharedRef<FSGTimedBuzzCommandImpl> TimedBuzzCommandImpl);
public:
/**
* Empty constructor for inheritance.
*/
static USGTimedBuzzCommand* NewTimedBuzzCommand(UObject* Outer);
/**
* Create a new TimeBuzzCommand for a single finger.
*/
static USGTimedBuzzCommand* NewTimedBuzzCommand(
UObject* Outer,
ESGFinger Finger, int32 Magnitude, float DurationSeconds, float StartTimeSeconds = 0.0f);
/**
* Create a new buzz motor command that expires after timing_ms.
*/
static USGTimedBuzzCommand* NewTimedBuzzCommand(
UObject* Outer,
const USGBuzzCommand* BaseCommand, float DurationSeconds, float StartTimeSeconds = 0.0f);
@@ -81,8 +95,19 @@ private:
FImplDeleter PimplDeleter;
public:
/**
* Empty constructor for inheritance.
*/
USGTimedBuzzCommand();
/**
* Create a new TimeBuzzCommand for a single finger.
*/
USGTimedBuzzCommand(ESGFinger Finger, int32 Magnitude, float DurationSeconds, float StartTimeSeconds = 0.0f);
/**
* Create a new buzz motor command that expires after timing_ms.
*/
USGTimedBuzzCommand(const USGBuzzCommand* BaseCommand, float DurationSeconds, float StartTimeSeconds = 0.0f);
public:
@@ -121,25 +146,61 @@ protected:
virtual void SyncUProperties() override;
public:
/**
* Copy this Buzz Command's values into a new object.
*/
USGBuzzCommand* Copy(UObject* Outer) const;
/**
* Merges this base command with another command.
*/
USGBuzzCommand* Merge(UObject* Outer, const USGBuzzCommand* BuzzCommand) const;
public:
/**
* Access the base command, which indicates the buzz levels to keep untill time elapses.
*/
USGBuzzCommand* GetBaseCommand(UObject* Outer) const;
/**
*
*/
int32 GetMagnitude() const;
/**
* The total time [milliseconds] each buzz motor should be vibrating for.
*/
float GetDuration() const;
/**
* The time elapsed since the command was sent [milliseconds].
*/
float GetElapsedTime() const;
/**
* Check if this timed command's timing has elapsed.
*/
bool HasTimeElapsed() const;
/**
* Represents how far this effect is in its playtime; [0...1], where 0 means at the start, and 1 means at the end.
*
* @param bClamp01 Optional parameter; ensures this value is always between 0 and 1.
*/
float NormalizedTime(bool bClamp01 = true) const;
/**
* Reset the timings of this BuzzCommand, allowing us to re-use it.
*/
void ResetTiming();
/**
* Update the elapsed time to check if the buzz motors should stop.
*/
void UpdateTiming(float DeltaSeconds);
/**
*
*/
FString ToString() const;
};
};
@@ -46,6 +46,9 @@
class FSGTimedThumpCommandImpl;
/**
*
*/
UCLASS(BlueprintType)
class SENSEGLOVECORE_API USGTimedThumpCommand final : public UObject
{
@@ -56,11 +59,20 @@ public:
UObject* Outer, const FSGTimedThumpCommandImpl& TimedThumpCommandImpl);
public:
/**
* Internal, empty, for extended classes.
*/
static USGTimedThumpCommand* NewTimedThumpCommand(UObject* Outer);
/**
* Create a new Timed Thumper Command.
*/
static USGTimedThumpCommand* NewTimedThumpCommand(
UObject* Outer, int32 Magnitude, float DurationSeconds, float StartTimeSeconds = 0.0f);
/**
* Create a new Timed Thumper Command.
*/
static USGTimedThumpCommand* NewTimedThumpCommand(
UObject* Outer, const USGThumperCommand* BaseCommand, float DurationSeconds, float StartTimeSeconds = 0.0f);
@@ -76,8 +88,19 @@ private:
FImplDeleter PimplDeleter;
public:
/**
* Internal, empty, for extended classes.
*/
USGTimedThumpCommand();
/**
* Create a new Timed Thumper Command.
*/
USGTimedThumpCommand(int32 Magnitude, float DurationSeconds, float StartTimeSeconds = 0.0f);
/**
* Create a new Timed Thumper Command.
*/
USGTimedThumpCommand(const USGThumperCommand* BaseCommand, float DurationSeconds, float StartTimeSeconds = 0.0f);
public:
@@ -105,28 +128,61 @@ public:
const FSGTimedThumpCommandImpl& ToTimedThumpCommandImpl() const;
public:
/**
* Magnitude in %.
*/
int32 GetMagnitude() const;
/**
*
*/
void SetMagnitude(int32 Magnitude);
/**
* Duration in seconds.
*/
float GetDuration() const;
/**
*
*/
void SetDuration(float Duration);
/**
* The elapsed time so far.
*/
float GetElapsedTime() const;
/**
*
*/
void SetElapsedTime(float ElapsedTime);
public:
/**
* Returns true if the timed command has elapsed.
*/
bool HasTimeElapsed() const;
public:
/**
* Copy the parameters of this ThumperCommand into another instance.
*/
USGTimedThumpCommand* Copy(UObject* Outer, bool bCopyElapsed = true) const;
/**
* Update the timing on this Thumper Command.
*/
void Update(float DeltaSeconds);
/**
*
*/
bool Equals(const USGTimedThumpCommand* TimedThumpCommand) const;
public:
/**
*
*/
FString ToString() const;
};
};
@@ -44,107 +44,241 @@
#include "SGTracking.generated.h"
/**
*
*/
USTRUCT()
struct SENSEGLOVECORE_API FSGTracking
{
GENERATED_BODY()
public:
/**
* Knowing a position & rotation in 3D space, calculate a relative location based on offsets.
*/
static void CalculateLocation(
const FVector& TrackedPosition, const FQuat& TrackedRotation,
const FVector& PositionOffset, const FQuat& RotationOffset,
FVector& OutNewPosition, FQuat& OutNewRotation);
/**
* Knowing a position & rotation in 3D space, calculate a relative location based on offsets.
*/
static void CalculateLocation(
const FVector& TrackedPosition, const FRotator& TrackedRotation,
const FVector& PositionOffset, const FRotator& RotationOffset,
FVector& OutNewPosition, FRotator& OutNewRotation);
/**
* Positional offset from each finger to the glove origin.
*/
static TArray<FVector> GetSenseGloveFingerToGlovePositionOrigin();
/**
*
*/
static TArray<FQuat> GetSenseGloveFingerToGloveRotationOriginQ();
/**
*
*/
static TArray<FRotator> GetSenseGloveFingerToGloveRotationOrigin();
/**
* Default position offset from glove origin to wrist location, in cm.
*/
static FVector GetSenseGloveWristPositionOffset();
/**
* Default rotation offset from glove origin to wrist location.
*/
static FQuat GetSenseGloveWristRotationOffsetQ();
/**
* Default rotation offset from glove origin to wrist location.
*/
static FRotator GetSenseGloveWristRotationOffset();
/**
* Get the position and rotation offsets to go from the glove origin to the mounted position.
* @remarks Based on CAD. needs to be inverted when going from tracker to glove origin.
*/
static void GetSenseGloveMountOffset(bool bRightHanded, ESGFinger ToFinger,
FVector& OutIPosition, FQuat& OutIRotation);
/**
* Get the position and rotation offsets to go from the glove origin to the mounted position.
* @remarks Based on CAD. needs to be inverted when going from tracker to glove origin.
*/
static void GetSenseGloveMountOffset(bool bRightHanded, ESGFinger ToFinger,
FVector& OutIPosition, FRotator& OutIRotation);
/**
* Get the offset to get from the TrackedHardware to a SenseGlove mounting location. Combined with Glove-Mount offset to get the glove location.
*/
static void GetSenseGloveTrackerMountOffset(ESGPositionalTrackingHardware Hardware, bool bRightHanded,
FVector& OutPositionOffset, FQuat& OutRotationOffset);
/**
* Get the offset to get from the TrackedHardware to a SenseGlove mounting location. Combined with Glove-Mount offset to get the glove location.
*/
static void GetSenseGloveTrackerMountOffset(ESGPositionalTrackingHardware Hardware, bool bRightHanded,
FVector& OutPositionOffset, FRotator& OutRotationOffset);
/**
* Vive Tracker origin to Finger rotational offset.
*/
static FVector GetSenseGloveViveToAttachPosition();
/**
* Vive Tracker origin to Finger rotational offset.
*/
static FQuat GetSenseGloveViveToAttachRotationQ();
/**
* Vive Tracker origin to Finger rotational offset.
*/
static FRotator GetSenseGloveViveToAttachRotation();
/**
* Oculus Touch origin to Finger rotational offset.
*/
static FVector GetSenseGloveOculusTouchToAttachPosition();
/**
* Oculus Touch origin to Finger rotational offset.
*/
static FQuat GetSenseGloveOculusTouchToAttachRotationQ();
/**
* Oculus Touch origin to Finger rotational offset.
*/
static FRotator GetSenseGloveOculusTouchToAttachRotation();
/**
* Positional offset between Nova Glove Origin and Wrist.
*/
static FVector GetNovaToWristPositionOffset();
/**
* Rotational offset between Nova Glove Origin and Wrist.
*/
static FQuat GetNovaToWristRotationOffsetQ();
/**
* Rotational offset between Nova Glove Origin and Wrist.
*/
static FRotator GetNovaToWristRotationOffset();
/**
* Returns the Offsets that will bring us from the Nova origin to the wrist position.
*/
static void GetNovaGloveWristOffset(bool bRightHanded, FVector& OutPositionOffset, FQuat& OutRotationOffset);
/**
* Returns the Offsets that will bring us from the Nova origin to the wrist position.
*/
static void GetNovaGloveWristOffset(bool bRightHanded, FVector& OutPositionOffset, FRotator& OutRotationOffset);
/**
*
*/
static FVector GetRightNovaViveToAttachPosition();
/**
*
*/
static FQuat GetRightNovaViveToAttachRotationQ();
/**
*
*/
static FRotator GetRightNovaViveToAttachRotation();
/**
*
*/
static FVector GetLeftNovaViveToAttachPosition();
/**
*
*/
static FQuat GetLeftNovaViveToAttachRotationQ();
/**
*
*/
static FRotator GetLeftNovaViveToAttachRotation();
/**
*
*/
static FVector GetRightNovaQuest2ToAttachPosition();
/**
*
*/
static FQuat GetRightNovaQuest2ToAttachRotationQ();
/**
*
*/
static FRotator GetRightNovaQuest2ToAttachRotation();
/**
*
*/
static FVector GetLeftNovaQuest2ToAttachPosition();
/**
*
*/
static FQuat GetLeftNovaQuest2ToAttachRotationQ();
/**
*
*/
static FRotator GetLeftNovaQuest2ToAttachRotation();
/**
* @remarks Left is a mirror, so we only need R pos.
*/
static FVector GetRightNovaPico2ToAttachPosition();
/**
*
*/
static FQuat GetRightNovaPico2ToAttachRotationQ();
/**
*
*/
static FRotator GetRightNovaPico2ToAttachRotation();
/**
*
*/
static FQuat GetLeftNovaPico2ToAttachRotationQ();
/**
*
*/
static FRotator GetLeftNovaPico2ToAttachRotation();
/**
* Retrieves Offsets for a particular device.
*/
static void GetNovaGloveTrackerOffset(ESGPositionalTrackingHardware Hardware, bool bRightHanded,
FVector& OutPositionOffset, FQuat& OutRotationOffset);
/**
* Retrieves Offsets for a particular device.
*/
static void GetNovaGloveTrackerOffset(ESGPositionalTrackingHardware Hardware, bool bRightHanded,
FVector& OutPositionOffset, FRotator& OutRotationOffset);
/**
*
*/
static FString ToString(ESGPositionalTrackingHardware Hardware);
};
};
@@ -29,7 +29,7 @@
*
* @section DESCRIPTION
*
*
* An interface to get calibration to / from disk.
*/
@@ -43,57 +43,103 @@ class USGHandProfile;
class USGHapticGlove;
class USGSensorRange;
/**
* A glove developed by SenseGlove, that has hand tracking and/or haptic feedback functionality.
*/
UCLASS(meta=(ScriptName = "SesneGloveHapticGloveHandProfilesKismetLibrary"))
class SENSEGLOVECOREKISMET_API USGHapticGloveHandProfilesKismetLibrary final : public USGBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
/**
* Returns the directory where our HandProfiles are stored.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Haptic Glove Hand Profiles")
static FString GetProfileDirectory();
/**
* Set the directory where our HandProfiles are stored.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Haptic Glove Hand Profiles")
static void SetProfileDirectory(const FString& Directory);
/**
* Access the latest Left Hand Profile from disk.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Haptic Glove Hand Profiles",
meta=(WorldContext="WorldContextObject"))
static void GetLeftHandProfile(UObject* WorldContextObject, USGHandProfile*& OutHandProfile);
/**
* Sets the newest Left Hand Profile - also stores it on disk.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Haptic Glove Hand Profiles")
static void SetLeftHandProfile(const USGHandProfile* HandProfile);
/**
* Access the latest Right Hand Profile from disk.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Haptic Glove Hand Profiles",
meta=(WorldContext="WorldContextObject"))
static void GetRightHandProfile(UObject* WorldContextObject, USGHandProfile*& OutHandProfile);
/**
* Sets the newest Right Hand Profile - also stores it on disk.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Haptic Glove Hand Profiles")
static void SetRightHandProfile(const USGHandProfile* HandProfile);
/**
* Retrieve a left- or right handed profile.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Haptic Glove Hand Profiles",
meta=(WorldContext="WorldContextObject"))
static void GetProfile(UObject* WorldContextObject, bool bRightHanded, USGHandProfile*& OutHandProfile);
/**
* Store a profile in the global variables and on disk. The profile determines if this is a left or right hand.
*/
UFUNCTION(BlueprintCallable, DisplayName="Set Profile", Category="SenseGlove | Core | Haptic Glove Hand Profiles")
static void SetProfile_HP(const USGHandProfile* HandProfile);
/**
* Store a profile in the global variables and on disk. You determine if this is a left or right hand.
*/
UFUNCTION(BlueprintCallable, DisplayName="Set Profile", Category="SenseGlove | Core | Haptic Glove Hand Profiles")
static void SetProfile_HP_bRH(const USGHandProfile* HandProfile, bool bRightHanded);
/**
* Restore both profiles back to their default values.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Haptic Glove Hand Profiles")
static void RestoreDefaults();
/**
* Restore the left- or right hand profiles back to their default values.
*/
UFUNCTION(BlueprintCallable, DisplayName="Restore Defaults",
Category="SenseGlove | Core | Haptic Glove Hand Profiles")
static void RestoreDefaults_bRH(bool bRightHanded);
/**
* Load the latest profiles from disk. Automatically called when you first try to access a profile.
* Exposed so you can force-reload profiles.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Haptic Glove Hand Profiles")
static void TryLoadingFromDisk();
/**
* Stores the last sensor range of a glove.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Haptic Glove Hand Profiles")
static bool SaveLastRange(const USGSensorRange* CurrentRange, const USGHapticGlove* ForGlove);
/**
* Loads the last sensor range of a glove.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Haptic Glove Hand Profiles",
meta=(WorldContext="WorldContextObject"))
static bool LoadLastRange(UObject* WorldContextObject,
const USGHapticGlove* ForGlove, USGSensorRange*& OutLastRange);
};
};
@@ -41,16 +41,25 @@
#include "SGHapticGloveQuickCalibrationKismetLibrary.generated.h"
/**
*
*/
UCLASS(meta=(ScriptName = "SesneGloveHapticGloveQuickCalibrationKismetLibrary"))
class SENSEGLOVECOREKISMET_API USGHapticGloveQuickCalibrationKismetLibrary final : public USGBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
/**
*
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Calibration | Haptic Glove Quick Calibration",
meta=(WorldContext="WorldContextObject"))
static USGHapticGloveQuickCalibration* MakeHapticGloveQuickCalibration(UObject* WorldContextObject);
/**
* Create a new instance of a QuickCalibration for Haptic Gloves.
*/
UFUNCTION(BlueprintCallable, DisplayName="Make Haptic Glove Quick Calibration",
Category="SenseGlove | Core | Calibration | Haptic Glove Quick Calibration",
meta=(WorldContext="WorldContextObject"))
@@ -59,57 +68,99 @@ public:
const USGHapticGlove* GloveToCalibrate,
float AutoEndTimeout);
/**
* Default time in seconds, to end this sequence. 15 seconds is very quick for some people.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Calibration | Haptic Glove Quick Calibration")
static float GetDefaultAutoEndTimeout();
/**
* Time, in seconds, after which this sequence stops gathering data. Based on the deltaSeconds variable passed in the Update() function.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Calibration | Haptic Glove Quick Calibration")
static float GetAutoEndTimeout(const USGHapticGloveQuickCalibration* HapticGloveQuickCalibration);
/**
* When compiling the final profile, we use a Weighted Moving Average filter with this period to filer out some outliers.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Calibration | Haptic Glove Quick Calibration")
static int32 GetSmoothingSamples(const USGHapticGloveQuickCalibration* HapticGloveQuickCalibration);
/**
* The min/max values recorded during this calibration sequence.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Calibration | Haptic Glove Quick Calibration",
meta=(WorldContext="WorldContextObject"))
static USGSensorRange* GetSensorRange(UObject* WorldContextObject,
const USGHapticGloveQuickCalibration* HapticGloveQuickCalibration);
/**
* A temporary profile to apply the sensorRange to. Used to generate a 'preview' HandPose.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Calibration | Haptic Glove Quick Calibration",
meta=(WorldContext="WorldContextObject"))
static USGHandProfile* GetTemporaryProfile(UObject* WorldContextObject,
const USGHapticGloveQuickCalibration* HapticGloveQuickCalibration);
/**
* Determines if the user has moved enough so that we can animate.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Calibration | Haptic Glove Quick Calibration")
static bool CanAnimate(const USGHapticGloveQuickCalibration* HapticGloveQuickCalibration);
/**
* This sequence autocompletes after its autoEndTime has elapsed.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Calibration | Haptic Glove Quick Calibration")
static bool AutoCompleted(const USGHapticGloveQuickCalibration* HapticGloveQuickCalibration);
/**
* Resets data points, min/max ranges and profile.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Calibration | Haptic Glove Quick Calibration")
static void Reset(USGHapticGloveQuickCalibration* HapticGloveQuickCalibration);
/**
* Update this calibration sequence with new data. We use deltaSeconds to check for things like stability.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Calibration | Haptic Glove Quick Calibration")
static void Update(USGHapticGloveQuickCalibration* HapticGloveQuickCalibration, float DeltaSeconds);
/**
* Add a new datapoint to this sequence's collection. Updates the range and profile used to generate a preview.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Calibration | Haptic Glove Quick Calibration")
static void AddDataPoint(USGHapticGloveQuickCalibration* HapticGloveQuickCalibration,
const TArray<FVector>& CalibrationData);
/**
* After we confirm the current step, we're basically done.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Calibration | Haptic Glove Quick Calibration")
static void ConfirmCurrentStep(USGHapticGloveQuickCalibration* HapticGloveQuickCalibration);
/**
* Compile a sensor range from the data points collected while the sequence was running. Smoothed by a Moving Average Filter.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Calibration | Haptic Glove Quick Calibration",
meta=(WorldContext="WorldContextObject"))
static bool CompileRange(UObject* WorldContextObject,
const USGHapticGloveQuickCalibration* HapticGloveQuickCalibration,
USGSensorRange*& OutSensorRange);
/**
* Returns a 'preview' of what a HandPose with this sequence's current settings would look like.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Calibration | Haptic Glove Quick Calibration",
meta=(WorldContext="WorldContextObject"))
static bool GetHandPose(UObject* WorldContextObject,
const USGHapticGloveQuickCalibration* HapticGloveQuickCalibration, bool bRightHanded,
USGHandPose*& OutCurrentHandPose);
/**
* Retrieve instructions on what to do during the current step.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Calibration | Haptic Glove Quick Calibration")
static FString GetCurrentInstruction(const USGHapticGloveQuickCalibration* HapticGloveQuickCalibration,
const FString& NextStepKey = "");
};
};
@@ -29,7 +29,8 @@
*
* @section DESCRIPTION
*
*
* Data class containing all variables to map an input value from one range to
* another.
*/
@@ -41,79 +42,145 @@
class USGInterpolationSet;
/**
* Set of variables to map a value from one range to the next.
*/
UCLASS(meta=(ScriptName = "SesneGloveInterpolationSetKismetLibrary"))
class SENSEGLOVECOREKISMET_API USGInterpolationSetKismetLibrary final : public USGBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
/**
* Creates a basic interpolation set, without limits.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Kinematics | Interpolation Set",
meta=(WorldContext="WorldContextObject"))
static USGInterpolationSet* MakeInterpolationSet(UObject* WorldContextObject);
/**
* Create a new interpolation set without limits.
*/
UFUNCTION(BlueprintCallable, DisplayName="Make Interpolation Set",
Category="SenseGlove | Core | Kinematics | Interpolation Set", meta=(WorldContext="WorldContextObject"))
static USGInterpolationSet* MakeInterpolationSet_F1_F2_T1_T2(
UObject* WorldContextObject, float From1, float From2, float To1, float To2);
/**
* Create a new interpolation set with limits.
*/
UFUNCTION(BlueprintCallable, DisplayName="Make Interpolation Set",
Category="SenseGlove | Core | Kinematics | Interpolation Set", meta=(WorldContext="WorldContextObject"))
static USGInterpolationSet* MakeInterpolationSet_F1_F2_T1_T2_M_M(
UObject* WorldContextObject, float From1, float From2, float To1, float To2, float Min, float Max);
/**
* Convert a string notation of an InterpolationSet into a new class instance.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Kinematics | Interpolation Set",
meta=(WorldContext="WorldContextObject"))
static USGInterpolationSet* Deserialize(UObject* WorldContextObject, const FString& SerializedString);
/**
* First value of input range.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Kinematics | Interpolation Set")
static float GetX0(const USGInterpolationSet* InterpolationSet);
/**
*
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Kinematics | Interpolation Set")
static void SetX0(UPARAM(ref) USGInterpolationSet* InterpolationSet, float X0);
/**
* Second value of input range.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Kinematics | Interpolation Set")
float GetX1(const USGInterpolationSet* InterpolationSet);
/**
*
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Kinematics | Interpolation Set")
static void SetX1(UPARAM(ref) USGInterpolationSet* InterpolationSet, float X1);
/**
* First value of output range.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Kinematics | Interpolation Set")
static float GetY0(const USGInterpolationSet* InterpolationSet);
/**
*
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Kinematics | Interpolation Set")
static void SetY0(UPARAM(ref) USGInterpolationSet* InterpolationSet, float Y0);
/**
* Second value of output range.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Kinematics | Interpolation Set")
static float GetY1(const USGInterpolationSet* InterpolationSet);
/**
*
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Kinematics | Interpolation Set")
static void SetY1(UPARAM(ref) USGInterpolationSet* InterpolationSet, float Y1);
/**
* Minimum range of the output value.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Kinematics | Interpolation Set")
static float GetMin(const USGInterpolationSet* InterpolationSet);
/**
*
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Kinematics | Interpolation Set")
static void SetMin(UPARAM(ref) USGInterpolationSet* InterpolationSet, float Min);
/**
* Maximum range of the output value.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Kinematics | Interpolation Set")
static float GetMax(const USGInterpolationSet* InterpolationSet);
/**
*
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Kinematics | Interpolation Set")
static void SetMax(UPARAM(ref) USGInterpolationSet* InterpolationSet, float Max);
/**
* Calculate an output value in range [x0...x1] to [y0..y1]
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Kinematics | Interpolation Set")
static int32 Get(const USGInterpolationSet* InterpolationSet, float Value, bool bLimit,
bool bNormalizeAngle = false);
/**
* Returns true if this InterpolationSet has the same values as another set.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Kinematics | Interpolation Set")
static bool Equals(const USGInterpolationSet* A, const USGInterpolationSet* B);
/**
*
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Kinematics | Interpolation Set")
static FString ToString(const USGInterpolationSet* InterpolationSet);
/**
*
*/
UFUNCTION(BlueprintPure, DisplayName="To String", Category="SenseGlove | Core | Kinematics | Interpolation Set")
static FString ToString_bL(const USGInterpolationSet* InterpolationSet, bool bLimits);
/**
* Convert this InterpolationSet into a string notation so it can be stored on disk.
*/
UFUNCTION(BlueprintPure, DisplayName="Serialize", Category="SenseGlove | Core | Kinematics | Interpolation Set")
static FString SGSerialize(const USGInterpolationSet* InterpolationSet);
};
};
@@ -29,7 +29,7 @@
*
* @section DESCRIPTION
*
*
* Contains kinematic formulae and wrappers for Sense Glove mathematics.
*/
@@ -45,12 +45,19 @@
#include "SGJointKinematicsKismetLibrary.generated.h"
/**
*
*/
UCLASS(meta=(ScriptName = "SesneGloveJointKinematicsKismetLibrary"))
class SENSEGLOVECOREKISMET_API USGJointKinematicsKismetLibrary final : public USGBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
/**
* Perform forward Kinematics on a set of joints, defined by a start position- and rotation,
* joint angles and the lengths in between. Outputs the calculated positions and rotations.
*/
UFUNCTION(BlueprintCallable, DisplayName="Forward Kinematics",
Category="SenseGlove | Core | Kinematics | Joint Kinematics")
static bool ForwardKinematics_SP_FQuat_SR_JL_JA_OutNP_TArrayFQuat_OutNR(
@@ -58,6 +65,10 @@ public:
const TArray<FVector>& JointLengths, const TArray<FVector>& JointAngles,
TArray<FVector>& OutNewPositions, TArray<FQuat>& OutNewRotations);
/**
* Perform forward Kinematics on a set of joints, defined by a start position- and rotation,
* joint angles and the lengths in between. Outputs the calculated positions and rotations.
*/
UFUNCTION(BlueprintCallable, DisplayName="Forward Kinematics",
Category="SenseGlove | Core | Kinematics | Joint Kinematics")
static bool
@@ -66,15 +77,21 @@ public:
const TArray<FVector>& JointLengths, const TArray<FVector>& JointAngles,
TArray<FVector>& OutNewPositions, TArray<FRotator>& OutNewRotations);
/**
* Calculate positions and rotations of a finger based on input angles and profile.
*/
UFUNCTION(BlueprintCallable, DisplayName="Forward Kinematics",
Category="SenseGlove | Core | Kinematics | Joint Kinematics")
static bool ForwardKinematics_P_F_JA_OutNP_TArrayFQuat_OutNR(
const USGBasicHandModel* Profile, ESGFinger Finger, const TArray<FVector>& JointAngles,
TArray<FVector>& OutNewPositions, TArray<FQuat>& OutNewRotations);
/**
* Calculate positions and rotations of a finger based on input angles and profile.
*/
UFUNCTION(BlueprintCallable, DisplayName="Forward Kinematics",
Category="SenseGlove | Core | Kinematics | Joint Kinematics")
static bool ForwardKinematics_P_F_JA_OutNP_TArrayFRotator_OutNR(
const USGBasicHandModel* Profile, ESGFinger Finger, const TArray<FVector>& JointAngles,
TArray<FVector>& OutNewPositions, TArray<FRotator>& OutNewRotations);
};
};
@@ -29,7 +29,7 @@
*
* @section DESCRIPTION
*
*
* Information about the SGCore C++ Library.
*/
@@ -42,6 +42,9 @@
#include "SGLibraryKismetLibrary.generated.h"
/**
* Provides information about this C++ Library.
*/
UCLASS(meta=(ScriptName = "SesneGloveLibraryKismetLibrary"))
class SENSEGLOVECOREKISMET_API USGLibraryKismetLibrary final : public USGBlueprintFunctionLibrary
{
@@ -71,4 +74,4 @@ public:
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Library")
static FString GetSGConnectVersion();
};
};
@@ -45,18 +45,27 @@
class USGNovaGloveHandProfile;
/**
*
*/
UCLASS(meta=(ScriptName = "SesneGloveNovaGloveCalibrationKismetLibrary"))
class SENSEGLOVECOREKISMET_API USGNovaGloveCalibrationKismetLibrary final : public USGBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
/**
* Apply a glove's default interpolation values to a profile, using the 'default' hand angles from calibration.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Calibration | Nova Glove Calibration")
static void ApplyDefaultCalibrationInterpolationValues(
const TArray<FVector>& RetractedValues,
const TArray<FVector>& ExtendedValues,
const USGNovaGloveHandProfile* Profile);
/**
* Apply a set of sensor-to-joint-angle interpolations to a nova profile.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Calibration | Nova Glove Calibration")
static void ApplyInterpolationValues(
const TArray<FVector>& RetractedValues,
@@ -64,4 +73,4 @@ public:
const TArray<FSGVectorArray>& RetractedAngles,
const TArray<FSGVectorArray>& ExtendedAngles,
const USGNovaGloveHandProfile* Profile);
};
};
@@ -29,7 +29,8 @@
*
* @section DESCRIPTION
*
*
* An interface for the "Nova" - a soft glove.
* Contains methods for Kinematics, Haptics and Serialization.
*/
@@ -51,18 +52,30 @@ class USGNovaGloveHandProfile;
class USGNovaGloveSensorData;
class USGThumperCommand;
/**
* A soft glove with Force- and Vibrotactile Feedback and limited tracking.
*/
UCLASS(meta=(ScriptName = "SesneGloveNovaGloveKismetLibrary"))
class SENSEGLOVECOREKISMET_API USGNovaGloveKismetLibrary final : public USGBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
/**
* Byte indicating a new Nova haptic command.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Nova | Nova Glove")
static FString GetHapticsByte();
/**
* Minimum calibration value distance until we apply the range.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Nova | Nova Glove")
static FVector GetMinCalibrationRange();
/**
* Calculate a Hand Pose based on a HandMode; sensor data from a Nova, and a UserProfile.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Nova | Nova Glove",
meta=(WorldContext="WorldContextObject"))
static USGHandPose* CalculateHandPose(UObject* WorldContextObject,
@@ -70,32 +83,53 @@ public:
const USGNovaGloveSensorData* NovaData,
const USGNovaGloveHandProfile* Profile);
/**
* Deserializes a Nova from its ConstantsString. Returns a nullptr if unsuccessful.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Nova | Nova Glove",
meta=(WorldContext="WorldContextObject"))
static USGDevice* Parse(UObject* WorldContextObject, const FString& ConstantsString);
/**
* Retrieve all Nova's.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Nova | Nova Glove",
meta=(WorldContext="WorldContextObject"))
static TArray<USGNovaGlove*> GetNovaGloves(UObject* WorldContextObject);
/**
* Retrieve the first connected Nova there is.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Nova Glove", Category="SenseGlove | Core | Nova | Nova Glove",
meta=(WorldContext="WorldContextObject"))
static bool GetNovaGlove_OutG(UObject* WorldContextObject, USGNovaGlove*& OutGlove);
/**
* Retrieve the first (connected) right or left handed Nova.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Nova Glove", Category="SenseGlove | Core | Nova | Nova Glove",
meta=(WorldContext="WorldContextObject"))
static bool GetNovaGlove_bRH_OutG(UObject* WorldContextObject,
bool bRightHanded, USGNovaGlove*& OutGlove);
/**
* Convert a SenseGlove GlovePose into calibrationValues.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Calibration Values", Category="SenseGlove | Core | Nova | Nova Glove")
static TArray<FVector> GetCalibrationValues_SD(const USGNovaGloveSensorData* SensorData);
/**
*
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Nova | Nova Glove",
meta=(WorldContext="WorldContextObject"))
static void CalibrateInterpolation(UObject* WorldContextObject,
const TArray<FVector>& MinValues, const TArray<FVector>& MaxValues,
USGNovaGloveHandProfile*& OutProfile);
/**
* Retrieve the location of the glove origin, based on a reference location without requiring an object reference.
*/
UFUNCTION(BlueprintCallable, DisplayName="Calculate Glove Location",
Category="SenseGlove | Core | Nova | Nova Glove")
static void CalculateGloveLocation_RP_FQuat_RR_TH_bRH_OutGP_OutGR(
@@ -103,6 +137,9 @@ public:
ESGPositionalTrackingHardware TrackingHardware, bool bRightHanded,
FVector& OutGlovePosition, FQuat& OutGloveRotation);
/**
* Retrieve the location of the glove origin, based on a reference location without requiring an object reference.
*/
UFUNCTION(BlueprintCallable, DisplayName="Calculate Glove Location",
Category="SenseGlove | Core | Nova | Nova Glove")
static void CalculateGloveLocation_RP_FRotator_RR_TH_bRH_OutGP_OutGR(
@@ -110,6 +147,9 @@ public:
ESGPositionalTrackingHardware TrackingHardware, bool bRightHanded,
FVector& OutGlovePosition, FRotator& OutGloveRotation);
/**
* Retrieve the location of the wrist, based on a reference location and default glove-hand offsets, without needing an object reference.
*/
UFUNCTION(BlueprintCallable, DisplayName="Calculate Wrist Location",
Category="SenseGlove | Core | Nova | Nova Glove")
static void CalculateWristLocation_RP_FQuat_RR_TH_bRH_OutWP_OutWR(
@@ -117,6 +157,9 @@ public:
ESGPositionalTrackingHardware TrackingHardware, bool bRightHanded,
FVector& OutWristPosition, FQuat& OutWristRotation);
/**
* Retrieve the location of the wrist, based on a reference location and default glove-hand offsets, without needing an object reference.
*/
UFUNCTION(BlueprintCallable, DisplayName="Calculate Wrist Location",
Category="SenseGlove | Core | Nova | Nova Glove")
static void CalculateWristLocation_RP_FRotator_RR_TH_bRH_OutWP_OutWR(
@@ -124,50 +167,95 @@ public:
ESGPositionalTrackingHardware TrackingHardware, bool bRightHanded,
FVector& OutWristPosition, FRotator& OutWristRotation);
/**
* Converts a thumper command into bytes that the Nova can understand.
*/
UFUNCTION(BlueprintCallable, DisplayName="To Bytes", Category="SenseGlove | Core | Nova | Nova Glove")
static FString ToBytes_TC(const USGThumperCommand* ThumperCommand);
/**
* Converts a force-feedback command into bytes that the Nova can understand.
*/
UFUNCTION(BlueprintCallable, DisplayName="To Bytes", Category="SenseGlove | Core | Nova | Nova Glove")
static FString ToBytes_FFC(const USGForceFeedbackCommand* ForceFeedbackCommand);
/**
* Converts a buzz-motor command into bytes that the Nova can understand.
*/
UFUNCTION(BlueprintCallable, DisplayName="To Bytes", Category="SenseGlove | Core | Nova | Nova Glove")
static FString ToBytes_BC(const USGBuzzCommand* BuzzCommand);
/**
* Return the DeviceType of this Nova.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Nova | Nova Glove")
static ESGDeviceType GetDeviceType(const USGNovaGlove* NovaGlove);
/**
* Returns this device's unique identifier.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Nova | Nova Glove")
static FString GetDeviceId(const USGNovaGlove* NovaGlove);
/**
* Access this device's hardware designation.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Nova | Nova Glove")
static FString GetHardwareVersion(const USGNovaGlove* NovaGlove);
/**
* Access this device's main firmware version. (ex: v3.2 -> 3).
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Nova | Nova Glove")
static int32 GetFirmwareVersion(const USGNovaGlove* NovaGlove);
/**
* Access this device's sub-firmware version. (ex: v3.2 -> 2).
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Nova | Nova Glove")
static int32 GetSubFirmwareVersion(const USGNovaGlove* NovaGlove);
/**
* Returns true if this device operates on a battery.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Nova | Nova Glove")
static bool HasBattery(const USGNovaGlove* NovaGlove);
/**
* Returns true if this device is currently charging.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Nova | Nova Glove")
static bool IsCharging(UPARAM(ref) USGNovaGlove* NovaGlove);
/**
* Returns the device's battery level, as a value between 0 (empty) and 1 (full).
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Nova | Nova Glove")
static bool GetBatteryLevel(UPARAM(ref) USGNovaGlove* NovaGlove, float& OutBatteryLevel);
/**
* Get the latest Sensor Data from this Sense Glove.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Nova | Nova Glove",
meta=(WorldContext="WorldContextObject"))
static bool GetSensorData(UObject* WorldContextObject,
UPARAM(ref) USGNovaGlove* NovaGlove, USGNovaGloveSensorData*& OutSensorData);
/**
* Retrieve Nova rotation.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Imu Rotation", Category="SenseGlove | Core | Nova | Nova Glove")
static bool GetImuRotation_FQuat_OutI(UPARAM(ref) USGNovaGlove* NovaGlove, FQuat& OutImu);
/**
* Retrieve Nova rotation.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Imu Rotation", Category="SenseGlove | Core | Nova | Nova Glove")
static bool GetImuRotation_FRotator_OutI(UPARAM(ref) USGNovaGlove* NovaGlove, FRotator& OutImu);
/**
* Retrieve a new hand pose using this glove, based on (calibrated) user data.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Hand Pose", Category="SenseGlove | Core | Nova | Nova Glove",
meta=(WorldContext="WorldContextObject"))
static bool GetHandPose_HM_P_OutHP(UObject* WorldContextObject,
@@ -176,6 +264,9 @@ public:
const USGNovaGloveHandProfile* Profile,
USGHandPose*& OutHandPose);
/**
* Retrieve a new hand pose using this glove, based on (calibrated) user data.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Hand Pose", Category="SenseGlove | Core | Nova | Nova Glove",
meta=(WorldContext="WorldContextObject"))
static bool GetHandPose_HG_HP_OutHP(UObject* WorldContextObject,
@@ -184,6 +275,9 @@ public:
const USGHandProfile* HandProfile,
USGHandPose*& OutHandPose);
/**
* Calculate the HandPose of this Device, taking into account user values, but not hand geometry.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Hand Pose", Category="SenseGlove | Core | Nova | Nova Glove",
meta=(WorldContext="WorldContextObject"))
static bool GetHandPose_HP_OutHP(UObject* WorldContextObject,
@@ -191,16 +285,28 @@ public:
const USGHandProfile* HandProfile,
USGHandPose*& OutHandPose);
/**
* Send all available haptics to a Nova.
*/
UFUNCTION(BlueprintCallable, DisplayName="Send Haptics", Category="SenseGlove | Core | Nova | Nova Glove")
static void SendHaptics_FFC(UPARAM(ref) USGNovaGlove* NovaGlove,
const USGForceFeedbackCommand* ForceFeedbackCommand);
/**
* Send Haptic Commands to this Glove.
*/
UFUNCTION(BlueprintCallable, DisplayName="Send Haptics", Category="SenseGlove | Core | Nova | Nova Glove")
static void SendHaptics_BC(UPARAM(ref) USGNovaGlove* NovaGlove, const USGBuzzCommand* BuzzCommand);
/**
* Send Haptic Commands to this Glove.
*/
UFUNCTION(BlueprintCallable, DisplayName="Send Haptics", Category="SenseGlove | Core | Nova | Nova Glove")
static void SendHaptics_TC(UPARAM(ref) USGNovaGlove* NovaGlove, const USGThumperCommand* ThumperCommand);
/**
* Send Haptic Commands to this Glove.
*/
UFUNCTION(BlueprintCallable, DisplayName="Send Haptics", Category="SenseGlove | Core | Nova | Nova Glove")
static void SendHaptics_FFC_BC_TC(
UPARAM(ref) USGNovaGlove* NovaGlove,
@@ -208,21 +314,33 @@ public:
const USGBuzzCommand* BuzzCommand,
const USGThumperCommand* ThumperCommand);
/**
* Retrieve calibration values of this glove, as an array of size 5, containing x (roll), y (flexion), z (abduction) values.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Calibration Values", Category="SenseGlove | Core | Nova | Nova Glove")
static bool GetCalibrationValues_OutV(UPARAM(ref) USGNovaGlove* NovaGlove, TArray<FVector>& OutValues);
/**
* Applies the calibration range of this Nova a HandProfile.
*/
UFUNCTION(BlueprintPure, DisplayName="Apply Calibration", Category="SenseGlove | Core | Nova | Nova Glove",
meta=(WorldContext="WorldContextObject"))
static void ApplyCalibration_USGHandProfile_OutP(UObject* WorldContextObject,
const USGNovaGlove* NovaGlove,
USGHandProfile*& OutProfile);
/**
* Applies the calibration range of this SenseGlove to a NovaGloveHandProfile.
*/
UFUNCTION(BlueprintPure, DisplayName="Apply Calibration", Category="SenseGlove | Core | Nova | Nova Glove",
meta=(WorldContext="WorldContextObject"))
static void ApplyCalibration_USGNovaGloveHandProfile_OutP(UObject* WorldContextObject,
const USGNovaGlove* NovaGlove,
USGNovaGloveHandProfile*& OutProfile);
/**
* Retrieve the location of the glove origin, based on a reference location.
*/
UFUNCTION(BlueprintPure, DisplayName="Get Glove Location", Category="SenseGlove | Core | Nova | Nova Glove")
static void GetGloveLocation_RP_FQuat_RR_TH_OutGP_FQuat_OutGR(
const USGNovaGlove* NovaGlove,
@@ -230,6 +348,9 @@ public:
ESGPositionalTrackingHardware TrackingHardware,
FVector& OutGlovePosition, FQuat& OutGloveRotation);
/**
* Retrieve the location of the glove origin, based on a reference location.
*/
UFUNCTION(BlueprintPure, DisplayName="Get Glove Location", Category="SenseGlove | Core | Nova | Nova Glove")
static void GetGloveLocation_RP_FRotator_RR_TH_OutGP_FRotator_OutGR(
const USGNovaGlove* NovaGlove,
@@ -237,6 +358,9 @@ public:
ESGPositionalTrackingHardware TrackingHardware,
FVector& OutGlovePosition, FRotator& OutGloveRotation);
/**
* Retrieve the location of the wrist, based on a reference location and default glove-hand offsets.
*/
UFUNCTION(BlueprintPure, DisplayName="Get Wrist Location", Category="SenseGlove | Core | Nova | Nova Glove")
static void GetWristLocation_RP_FQuat_RR_TH_OutWP_FQuat_OutWR(
const USGNovaGlove* NovaGlove,
@@ -244,6 +368,9 @@ public:
ESGPositionalTrackingHardware TrackingHardware,
FVector& OutWristPosition, FQuat& OutWristRotation);
/**
* Retrieve the location of the wrist, based on a reference location and default glove-hand offsets.
*/
UFUNCTION(BlueprintPure, DisplayName="Get Wrist Location", Category="SenseGlove | Core | Nova | Nova Glove")
static void GetWristLocation_RP_FRotator_RR_TH_OutWP_FRotator_OutWR(
const USGNovaGlove* NovaGlove,
@@ -251,6 +378,9 @@ public:
ESGPositionalTrackingHardware TrackingHardware,
FVector& OutWristPosition, FRotator& OutWristRotation);
/**
* Create a string representation of this device for reporting purposes.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Nova | Nova Glove")
static FString ToString(const USGNovaGlove* NovaGlove);
};
};
@@ -29,7 +29,7 @@
*
* @section DESCRIPTION
*
*
* Nova SensorData, parsed from rae string representations.
*/
@@ -42,70 +42,121 @@
class USGNovaGloveInfo;
class USGNovaGloveSensorData;
/**
* Sensor Data coming from a Nova, converted into useful values.
*/
UCLASS(meta=(ScriptName = "SesneGloveNovaGloveSensorDataKismetLibrary"))
class SENSEGLOVECOREKISMET_API USGNovaGloveSensorDataKismetLibrary final : public USGBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
/**
* Default constructor for NovaGloveSensorData.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Nova | Nova Glove Sensor Data",
meta=(WorldContext="WorldContextObject"))
static USGNovaGloveSensorData* MakeNovaGloveSensorData(UObject* WorldContextObject);
/**
* Create a new instance of a NovaGloveSensorData.
*/
UFUNCTION(BlueprintCallable, DisplayName="Make Nova Glove Sensor Data",
Category="SenseGlove | Core | Nova | Nova Glove Sensor Data", meta=(WorldContext="WorldContextObject"))
static USGNovaGloveSensorData* MakeNovaGloveSensorData_V_PV_FQuat_IR_bIP_BL_bC(
UObject* WorldContextObject, const TArray<FVector>& Values, int32 ParsedValues,
const FQuat& ImuRotation, bool bImuParsed, float BatteryLevel, bool bCharging);
/**
* Create a new instance of a NovaGloveSensorData.
*/
UFUNCTION(BlueprintCallable, DisplayName="Make Nova Glove Sensor Data",
Category="SenseGlove | Core | Nova | Nova Glove Sensor Data", meta=(WorldContext="WorldContextObject"))
static USGNovaGloveSensorData* MakeNovaGloveSensorData_V_PV_FRotator_IR_bIP_BL_b(
UObject* WorldContextObject, const TArray<FVector>& Values, int32 ParsedValues,
const FRotator& ImuRotation, bool bImuParsed, float BatteryLevel, bool bCharging);
/**
* Returns a NovaGloveSensorData without any values.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Nova | Nova Glove Sensor Data",
meta=(WorldContext="WorldContextObject"))
static USGNovaGloveSensorData* Empty(UObject* WorldContextObject);
/**
* Parse the bytes as they come in from the device into useable values.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Nova | Nova Glove Sensor Data",
meta=(WorldContext="WorldContextObject"))
static USGNovaGloveSensorData* Parse(UObject* WorldContextObject,
const FString& RawData, const USGNovaGloveInfo* GloveInfo);
/**
* Convert this sensor data into ta string representation.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Nova | Nova Glove Sensor Data",
meta=(WorldContext="WorldContextObject"))
static USGNovaGloveSensorData* Deserialize(UObject* WorldContextObject, const FString& SerializedString);
/**
* Pronation/Supination, Flexion/Extension and Abduction/Adduction values for each finger.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Nova | Nova Glove Sensor Data")
static TArray<FVector> GetSensorValues(const USGNovaGloveSensorData* NovaGloveSensorData);
/**
* Quaternion rotation relative to magnetic north.
*/
UFUNCTION(BlueprintPure, DisplayName="Get Imu Rotation",
Category="SenseGlove | Core | Nova | Nova Glove Sensor Data")
static FQuat GetImuRotation_FQuat(const USGNovaGloveSensorData* NovaGloveSensorData);
/**
* Rotation relative to magnetic north.
*/
UFUNCTION(BlueprintPure, DisplayName="Get Imu Rotation",
Category="SenseGlove | Core | Nova | Nova Glove Sensor Data")
static FRotator GetImuRotation_FRotator(const USGNovaGloveSensorData* NovaGloveSensorData);
/**
* The number of values that were parsed from the sensor string.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Nova | Nova Glove Sensor Data")
static int32 GetParsedValues(const USGNovaGloveSensorData* NovaGloveSensorData);
/**
* Whether the IMU values were all successfully parsed, or not.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Nova | Nova Glove Sensor Data")
static bool IsImuParsed(const USGNovaGloveSensorData* NovaGloveSensorData);
/**
* A value between 0..1 that represents the battery level of this Nova Glove (0 .. 100%). Returns -1 if the value wasn't received.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Nova | Nova Glove Sensor Data")
static float GetBatteryLevel(const USGNovaGloveSensorData* NovaGloveSensorData);
/**
* Returns true if this NovaGlove is connected to a power source
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Nova | Nova Glove Sensor Data")
static bool IsCharging(const USGNovaGloveSensorData* NovaGloveSensorData);
/**
* Returns true if this sensor data contains the same values as another.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Nova | Nova Glove Sensor Data")
static bool Equals(const USGNovaGloveSensorData* A, const USGNovaGloveSensorData* B);
/**
* Create a readable string representation of this Sensor Data
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Nova | Nova Glove Sensor Data")
static FString ToString(const USGNovaGloveSensorData* NovaGloveSensorData);
/**
* Convert this sensor data into a string so it can be stored on disk.
*/
UFUNCTION(BlueprintPure, DisplayName="Serialize", Category="SenseGlove | Core | Nova | Nova Glove Sensor Data")
static FString SGSerialize(const USGNovaGloveSensorData* NovaGloveSensorData);
};
};
@@ -43,27 +43,48 @@
#include "SGSenseComKismetLibrary.generated.h"
/**
*
*/
UCLASS(meta=(ScriptName = "SesneGloveSenseComKismetLibrary"))
class SENSEGLOVECOREKISMET_API USGSenseComKismetLibrary final : public USGBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
/**
* Registers current process as the latest SenseCom build.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | SenseCom")
static bool RegisterExe();
/**
* Register a particular path as the SenseGlove executable location.
*/
UFUNCTION(BlueprintCallable, DisplayName="Register Exe", Category="SenseGlove | Core | SenseCom")
static bool RegisterExe_EP(const FString& ExePath);
/**
* Retrieve the location of SenseGlove executable.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | SenseCom")
static bool GetExePath(FString& OutExePath);
/**
* Returns true if SenseCom scanning is active.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | SenseCom")
static bool ScanningActive();
/**
* Returns the directory of the current process.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | SenseCom")
static bool GetCurrentExeDirectory(FString& OutDirectory);
/**
* Force-starts the SenseCom application if it is active on the system.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | SenseCom")
static bool StartupSenseCom();
};
};
@@ -29,7 +29,8 @@
*
* @section DESCRIPTION
*
*
* Input for Sense Glove kinematics to calculate a HandPose.
* Output of calibration algorithms.
*/
@@ -43,56 +44,98 @@
class USGHandInterpolator;
class USGSenseGloveHandProfile;
/**
* Contains everything a Sense Glove needs to calculate a HandPose.
*/
UCLASS(meta=(ScriptName = "SesneGloveSenseGloveHandProfileKismetLibrary"))
class SENSEGLOVECOREKISMET_API USGSenseGloveHandProfileKismetLibrary final : public USGBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
/**
* The basic constructor.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | SG | Sense Glove Hand Profile",
meta=(WorldContext="WorldContextObject"))
static USGSenseGloveHandProfile* MakeSenseGloveHandProfile(UObject* WorldContextObject);
/**
* Create a new Hand Profile for the Sense Glove.
*/
UFUNCTION(BlueprintCallable, DisplayName="Make Sense Glove Hand Profile",
Category="SenseGlove | Core | SG | Sense Glove Hand Profile", meta=(WorldContext="WorldContextObject"))
static USGSenseGloveHandProfile* MakeSenseGloveHandProfile_bRH_I_TS_FS_FTO(
UObject* WorldContextObject, bool bRightHanded, const USGHandInterpolator* Interpolator,
ESGThumbSolver ThumbSolver, ESGFingerSolver FingerSolver, const TArray<FVector>& FingerThimbleOffset);
/**
* Retrieve a 'new' profile, for either a left or right hand.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | SG | Sense Glove Hand Profile",
meta=(WorldContext="WorldContextObject"))
static USGSenseGloveHandProfile* Default(UObject* WorldContextObject, bool bRightHanded);
/**
* Deserialize a HandProfile back into usable values.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | SG | Sense Glove Hand Profile",
meta=(WorldContext="WorldContextObject"))
static USGSenseGloveHandProfile* Deserialize(UObject* WorldContextObject, const FString& SerializedString);
/**
* Default offset from thimble to fingertip.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | SG | Sense Glove Hand Profile")
static FVector GetDefaultThimbleOffset();
/**
* Check whether this profile has been created for a right hand (true) or left hand (false).
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Hand Profile")
static bool IsRight(const USGSenseGloveHandProfile* SenseGloveHandProfile);
/**
* Interpolation set to estimate joint angles.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Hand Profile",
meta=(WorldContext="WorldContextObject"))
static USGHandInterpolator* GetInterpolationSet(UObject* WorldContextObject,
const USGSenseGloveHandProfile* SenseGloveHandProfile);
/**
* Solver property that determines _how_ HandPoses are calculated.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Hand Profile")
static ESGThumbSolver GetThumbSolver(const USGSenseGloveHandProfile* SenseGloveHandProfile);
/**
* Solver property that determines _how_ finger poses are calculated.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Hand Profile")
static ESGFingerSolver GetFingerSolver(const USGSenseGloveHandProfile* SenseGloveHandProfile);
/**
* Offset from thimble to fingertip, used for Inverse Kinematics.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Hand Profile")
static TArray<FVector> GetFingerThimbleOffset(const USGSenseGloveHandProfile* SenseGloveHandProfile);
/**
*
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Hand Profile")
static bool Equals(const USGSenseGloveHandProfile* A, const USGSenseGloveHandProfile* B);
/**
* Reset calibration on this profile.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | SG | Sense Glove Hand Profile")
static void Reset(UPARAM(ref) USGSenseGloveHandProfile* SenseGloveHandProfile);
/**
* Serialize this HandProfile into a string representation.
*/
UFUNCTION(BlueprintPure, DisplayName="Serialize", Category="SenseGlove | Core | SG | Sense Glove Hand Profile")
static FString SGSerialize(const USGSenseGloveHandProfile* SenseGloveHandProfile);
};
};
@@ -29,7 +29,7 @@
*
* @section DESCRIPTION
*
*
* Glove information taken from the Sense Glove.
*/
@@ -44,16 +44,25 @@
class USGSenseGloveInfo;
/**
* Glove Information taken from a SenseGlove. Contains everything from unique ID, firmware version, etc.
*/
UCLASS(meta=(ScriptName = "SesneGloveSenseGloveInfoKismetLibrary"))
class SENSEGLOVECOREKISMET_API USGSenseGloveInfoKismetLibrary final : public USGBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
/**
* The default constructor.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | SG | Sense Glove Info",
meta=(WorldContext="WorldContextObject"))
static USGSenseGloveInfo* MakeSenseGloveInfo(UObject* WorldContextObject);
/**
* Create a new Sense Glove device model.
*/
UFUNCTION(BlueprintCallable, DisplayName="Make Sense Glove Info",
Category="SenseGlove | Core | SG | Sense Glove Info", meta=(WorldContext="WorldContextObject"))
static USGSenseGloveInfo* MakeSenseGloveInfo_DI_HV_FV_SFV_bRH_NOS_FQuat_IC_SP_TArrayFQuat_SR_GL_F(
@@ -63,6 +72,9 @@ public:
const TArray<FVector>& StartPositions, const TArray<FQuat>& StartRotations,
const TArray<FSGVectorArray>& GloveLengths, const TArray<bool>& Functions);
/**
* Create a new Sense Glove device model.
*/
UFUNCTION(BlueprintCallable, DisplayName="Make Sense Glove Info",
Category="SenseGlove | Core | SG | Sense Glove Info", meta=(WorldContext="WorldContextObject"))
static USGSenseGloveInfo* MakeSenseGloveInfo_DI_HV_FV_SFV_bRH_NOS_FRotator_IC_SP_TArrayFRotator_SR_GL_F(
@@ -72,80 +84,152 @@ public:
const TArray<FVector>& StartPositions, const TArray<FRotator>& StartRotations,
const TArray<FSGVectorArray>& GloveLengths, const TArray<bool>& Functions);
/**
* Create an instance of the SGModel from its string representation.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | SG | Sense Glove Info",
meta=(WorldContext="WorldContextObject"))
static bool Parse(UObject* WorldContextObject,
const FString& ConstantsString, USGSenseGloveInfo*& OutGloveInfo,
bool bUpdateOldModels = true);
/**
* Deserialize a HandProfile back into usable values.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | SG | Sense Glove Info",
meta=(WorldContext="WorldContextObject"))
static USGSenseGloveInfo* Deserialize(UObject* WorldContextObject, const FString& SerializedString);
/**
* Unique identifier of this device.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Info")
static FString GetDeviceId(const USGSenseGloveInfo* SenseGloveInfo);
/**
* Hardware (sub) version of this Sense Glove Device.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Info")
static FString GetHardwareVersion(const USGSenseGloveInfo* SenseGloveInfo);
/**
* Firmware version running on the device's MicroController.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Info")
static int32 GetFirmwareVersion(const USGSenseGloveInfo* SenseGloveInfo);
/**
* Sub-Firmware version running on the device's MicroController.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Info")
static int32 GetSubFirmwareVersion(const USGSenseGloveInfo* SenseGloveInfo);
/**
* Check if this Sense Glove belongs to a left or right hand.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Info")
static bool IsRight(const USGSenseGloveInfo* SenseGloveInfo);
/**
* The number of Sensors in this SenseGlove.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Info")
static int32 GetNumberOfSensors(const USGSenseGloveInfo* SenseGloveInfo);
/**
* The IMU correction of this Sense Glove.
*/
UFUNCTION(BlueprintPure, DisplayName="Get Imu Correction", Category="SenseGlove | Core | SG | Sense Glove Info")
static FQuat GetImuCorrection_FQuat(const USGSenseGloveInfo* SenseGloveInfo);
/**
* The IMU correction of this Sense Glove.
*/
UFUNCTION(BlueprintPure, DisplayName="Get Imu Correction", Category="SenseGlove | Core | SG | Sense Glove Info")
static FRotator GetImuCorrection_FRotator(const USGSenseGloveInfo* SenseGloveInfo);
/**
* The starting positions of each Sense Glove finger, relative to the glove origin.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Info")
static TArray<FVector> GetStartPositions(const USGSenseGloveInfo* SenseGloveInfo);
/**
* The starting rotations of each Sense Glove finger, relative to the glove origin.
*/
UFUNCTION(BlueprintPure, DisplayName="Get Start Rotations", Category="SenseGlove | Core | SG | Sense Glove Info")
static TArray<FQuat> GetStartRotations_TArrayFQuat(const USGSenseGloveInfo* SenseGloveInfo);
/**
* The starting rotations of each Sense Glove finger, relative to the glove origin.
*/
UFUNCTION(BlueprintPure, DisplayName="Get Start Rotations", Category="SenseGlove | Core | SG | Sense Glove Info")
static TArray<FRotator> GetStartRotations_TArrayFRotator(const USGSenseGloveInfo* SenseGloveInfo);
/**
* The lengths of each Sense Glove finger section, in cm.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Info")
static TArray<FSGVectorArray> GetGloveLengths(const USGSenseGloveInfo* SenseGloveInfo);
/**
* Whether this device has a specific function (T/F).
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Info")
static TArray<bool> GetFunctions(const USGSenseGloveInfo* SenseGloveInfo);
/**
* The starting position of one Sense Glove finger, relative to the glove origin.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Info")
static FVector GetStartPosition(const USGSenseGloveInfo* SenseGloveInfo, ESGFinger Finger);
/**
* The starting rotation of one Sense Glove finger, relative to the glove origin.
*/
UFUNCTION(BlueprintPure, DisplayName="Get Start Rotation", Category="SenseGlove | Core | SG | Sense Glove Info")
static FQuat GetStartRotation_FQuat(const USGSenseGloveInfo* SenseGloveInfo, ESGFinger Finger);
/**
* The starting rotation of one Sense Glove finger, relative to the glove origin.
*/
UFUNCTION(BlueprintPure, DisplayName="Get Start Rotation", Category="SenseGlove | Core | SG | Sense Glove Info")
static FRotator GetStartRotation_FRotator(const USGSenseGloveInfo* SenseGloveInfo, ESGFinger Finger);
/**
* The lengths of one Sense Glove finger's sections, in cm.
*/
UFUNCTION(BlueprintPure, DisplayName="Get Glove Lengths", Category="SenseGlove | Core | SG | Sense Glove Info")
static TArray<FVector> GetGloveLengths_F(const USGSenseGloveInfo* SenseGloveInfo, ESGFinger Finger);
/**
* Place incoming sensor data into the right format, according to this glove's model.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Info")
static TArray<FSGVectorArray> ToGloveAngles(const USGSenseGloveInfo* SenseGloveInfo,
const TArray<FSGFloatArray>& SensorAngles);
/**
* Returns true if this SG_Model has the same values as another.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Info")
static bool Equals(const USGSenseGloveInfo* A, const USGSenseGloveInfo* B);
/**
* Create a string representation for logging. If shortNotation is false, all values are reported.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Info")
static FString ToString(const USGSenseGloveInfo* SenseGloveInfo);
/**
* Create a string representation for fast logging.
*/
UFUNCTION(BlueprintPure, DisplayName="To String", Category="SenseGlove | Core | SG | Sense Glove Info")
static FString ToString_bSN(const USGSenseGloveInfo* SenseGloveInfo, bool bShortNotation);
/**
* Serialize this HandProfile into a string representation.
*/
UFUNCTION(BlueprintPure, DisplayName="Serialize", Category="SenseGlove | Core | SG | Sense Glove Info")
static FString SGSerialize(const USGSenseGloveInfo* SenseGloveInfo);
};
};
@@ -29,7 +29,8 @@
*
* @section DESCRIPTION
*
*
* Contains position and rotation data of a SenseGlove's exoskeleton, along
* with accessors for relevant variables.
*/
@@ -46,16 +47,25 @@ class USGSenseGloveHandProfile;
class USGSenseGloveInfo;
class USGSenseGlovePose;
/**
* Represents a pose of a Sense Glove exoskeleton.
*/
UCLASS(meta=(ScriptName = "SesneGloveSenseGlovePoseKismetLibrary"))
class SENSEGLOVECOREKISMET_API USGSenseGlovePoseKismetLibrary final : public USGBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
/**
* The basic constructor.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | SG | Sense Glove Pose",
meta=(WorldContext="WorldContextObject"))
static USGSenseGlovePose* MakeSenseGlovePose(UObject* WorldContextObject);
/**
* Creates a new instance of a SenseGlovePose.
*/
UFUNCTION(BlueprintCallable, DisplayName="Make Sense Glove Pose",
Category="SenseGlove | Core | SG | Sense Glove Pose", meta=(WorldContext="WorldContextObject"))
static USGSenseGlovePose* MakeSenseGlovePose_bRH_JP_TArrayFSGQuatArray_JR_GA(
@@ -64,6 +74,9 @@ public:
const TArray<FSGQuatArray>& JointRotations,
const TArray<FSGVectorArray>& GloveAngles);
/**
* Creates a new instance of a SenseGlovePose.
*/
UFUNCTION(BlueprintCallable, DisplayName="Make Sense Glove Pose",
Category="SenseGlove | Core | SG | Sense Glove Pose", meta=(WorldContext="WorldContextObject"))
static USGSenseGlovePose* MakeSenseGlovePose_bRH_JP_TArrayFSGRotatorArray_JR_GA(
@@ -72,56 +85,106 @@ public:
const TArray<FSGRotatorArray>& JointRotations,
const TArray<FSGVectorArray>& GloveAngles);
/**
* Returns an idle pose for the Sense Glove if no data can be found.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | SG | Sense Glove Pose",
meta=(WorldContext="WorldContextObject"))
static USGSenseGlovePose* IdlePose(UObject* WorldContextObject, const USGSenseGloveInfo* GloveInfo);
/**
* Deserialize a GlovePose back into usable values.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | SG | Sense Glove Pose",
meta=(WorldContext="WorldContextObject"))
static USGSenseGlovePose* Deserialize(UObject* WorldContextObject, const FString& SerializedString);
/**
* Whether this Glove Pose was created for be a right- or left hand, or not.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Pose")
static bool IsRight(const USGSenseGlovePose* SenseGlovePose);
/**
* Positions of each glove joint, relative to the Glove's Origin.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Pose")
static TArray<FSGVectorArray> GetJointPositions(const USGSenseGlovePose* SenseGlovePose);
/**
* Quaternion rotation of each glove joint, relative to the Glove Origin.
*/
UFUNCTION(BlueprintPure, DisplayName="Get Joint Rotations", Category="SenseGlove | Core | SG | Sense Glove Pose")
static TArray<FSGQuatArray> GetJointRotations_TArrayFSGQuatArray(const USGSenseGlovePose* SenseGlovePose);
/**
* Rotation of each glove joint, relative to the Glove Origin.
*/
UFUNCTION(BlueprintPure, DisplayName="Get Joint Rotations", Category="SenseGlove | Core | SG | Sense Glove Pose")
static TArray<FSGRotatorArray> GetJointRotations_TArrayFSGRotatorArray(const USGSenseGlovePose* SenseGlovePose);
/**
* Glove joint angles in euler notation, relative to the last segment.
*
* @remarks Essentially sensor angles, though placed in their proper xyz notation.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Pose")
static TArray<FSGVectorArray> GetGloveAngles(const USGSenseGlovePose* SenseGlovePose);
/**
* The position of the tip of the 'thimbles', the furthest link on each glove link.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Pose")
static TArray<FVector> GetThimblePositions(const USGSenseGlovePose* SenseGlovePose);
/**
* The (quaternion) rotation of the 'thimbles', the furthest link on each link.
*/
UFUNCTION(BlueprintPure, DisplayName="Get Thimble Rotations", Category="SenseGlove | Core | SG | Sense Glove Pose")
static TArray<FQuat> GetThimbleRotations_FQuat(const USGSenseGlovePose* SenseGlovePose);
/**
* The rotation of the 'thimbles', the furthest link on each link.
*/
UFUNCTION(BlueprintPure, DisplayName="Get Thimble Rotations", Category="SenseGlove | Core | SG | Sense Glove Pose")
static TArray<FRotator> GetThimbleRotations_FRotator(const USGSenseGlovePose* SenseGlovePose);
/**
* Sum of the Sensor angles in each (xyz) direction. "Total Pronation / Flexion / Abduction".
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Pose")
static TArray<FVector> GetTotalGloveAngles(const USGSenseGlovePose* SenseGlovePose);
/**
* Calculate fingertip positions based on a user profile.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Pose")
static TArray<FVector> CalculateFingerTips_SenseGloveHandProfileImpl(
const USGSenseGlovePose* SenseGlovePose,
const USGSenseGloveHandProfile* SenseGloveHandProfile);
/**
* Calculate fingertip positions, knowing the offset between thimble and fingertips.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Pose")
static TArray<FVector> CalculateFingerTips_FingerOffsets(const USGSenseGlovePose* SenseGlovePose,
const TArray<FVector>& FingerOffsets);
/**
* Returns true if this glove pose equals another.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Pose")
static bool Equals(const USGSenseGlovePose* A, const USGSenseGlovePose* B);
/**
* Returns a user-friendly string representation of this GlovePose for reporting.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Pose")
static FString ToString(const USGSenseGlovePose* SenseGlovePose, bool bShortFormat = false);
/**
* Serialize this GlovePose into a string representation.
*/
UFUNCTION(BlueprintPure, DisplayName="Serialize", Category="SenseGlove | Core | SG | Sense Glove Pose")
static FString SGSerialize(const USGSenseGlovePose* SenseGlovePose);
};
};
@@ -29,7 +29,7 @@
*
* @section DESCRIPTION
*
*
* Parsed sensor data coming form a Sense Glove.
*/
@@ -44,71 +44,122 @@
class USGSenseGloveInfo;
class USGSenseGloveSensorData;
/**
* Sense Glove Sensor Data, parsed from a sensor string.
*/
UCLASS(meta=(ScriptName = "SesneGloveSenseGloveSensorDataKismetLibrary"))
class SENSEGLOVECOREKISMET_API USGSenseGloveSensorDataKismetLibrary final : public USGBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
/**
* The basic constructor.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | SG | Sense Glove Sensor Data",
meta=(WorldContext="WorldContextObject"))
static USGSenseGloveSensorData* MakeSenseGloveSensorData(UObject* WorldContextObject);
/**
* Create a new instance of a Sense Glove Sensor Data class.
*/
UFUNCTION(BlueprintCallable, DisplayName="Make Sense Glove Sensor Data",
Category="SenseGlove | Core | SG | Sense Glove Sensor Data", meta=(WorldContext="WorldContextObject"))
static USGSenseGloveSensorData* MakeSenseGloveSensorData_SA_FQuatImuRotation_PV_bIP(
UObject* WorldContextObject,
const TArray<FSGFloatArray>& SensorAngles, const FQuat& ImuRotation, int32 ParsedValues, bool bImuParsed);
/**
* Create a new instance of a Sense Glove Sensor Data class.
*/
UFUNCTION(BlueprintCallable, DisplayName="Make Sense Glove Sensor Data",
Category="SenseGlove | Core | SG | Sense Glove Sensor Data", meta=(WorldContext="WorldContextObject"))
static USGSenseGloveSensorData* MakeSenseGloveSensorData_SA_FRotatorImuRotation_PV_bIP(
UObject* WorldContextObject,
const TArray<FSGFloatArray>& SensorAngles, const FRotator& ImuRotation, int32 ParsedValues, bool bImuParsed);
/**
* Returns sensor data with no values.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | SG | Sense Glove Sensor Data",
meta=(WorldContext="WorldContextObject"))
static USGSenseGloveSensorData* Empty(UObject* WorldContextObject);
/**
* Deserialize Sense Glove sensor data from a raw char[] received through IPC.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | SG | Sense Glove Sensor Data",
meta=(WorldContext="WorldContextObject"))
static USGSenseGloveSensorData* Parse(UObject* WorldContextObject,
const FString& RawData, const USGSenseGloveInfo* GloveInfo);
/**
* Deserialize a HandProfile back into useable values.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | SG | Sense Glove Sensor Data",
meta=(WorldContext="WorldContextObject"))
static USGSenseGloveSensorData* Deserialize(UObject* WorldContextObject, const FString& SerializedString);
/**
* Glove angles in radians, sorted by finger, from proximal to distal.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Sensor Data")
static TArray<FSGFloatArray> GetSensorAngles(const USGSenseGloveSensorData* SenseGloveSensorData);
/**
*
*/
UFUNCTION(BlueprintPure, DisplayName="Get Imu Rotation",
Category="SenseGlove | Core | SG | Sense Glove Sensor Data")
static FQuat GetImuRotation_FQuat(const USGSenseGloveSensorData* SenseGloveSensorData);
/**
*
*/
UFUNCTION(BlueprintPure, DisplayName="Get Imu Rotation",
Category="SenseGlove | Core | SG | Sense Glove Sensor Data")
static FRotator GetImuRotation_FRotator(const USGSenseGloveSensorData* SenseGloveSensorData);
/**
* Check how many values have been parsed from the Sensor String.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Sensor Data")
static int32 GetParsedValues(const USGSenseGloveSensorData* SenseGloveSensorData);
/**
* Check if the IMU was properly parsed.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Sensor Data")
static bool IsImuParsed(const USGSenseGloveSensorData* SenseGloveSensorData);
/**
* Get the glove angles of a specific finger segment.
*/
UFUNCTION(BlueprintPure, DisplayName="Get Sensor Angles",
Category="SenseGlove | Core | SG | Sense Glove Sensor Data")
static TArray<float> GetSensorAngles_F(const USGSenseGloveSensorData* SenseGloveSensorData, ESGFinger Finger);
/**
* Returns all glove angles in a sequence, without splitting them per finger.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Sensor Data")
static TArray<float> GetAngleSequence(const USGSenseGloveSensorData* SenseGloveSensorData);
/**
* Returns true if the values of both data are equal.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Sensor Data")
static bool Equals(const USGSenseGloveSensorData* A, const USGSenseGloveSensorData* B);
/**
* Retrieve a simple representation of this sensor data for debugging purposes.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | SG | Sense Glove Sensor Data")
static FString ToString(const USGSenseGloveSensorData* SenseGloveSensorData);
/**
* Serialize this HandProfile into a string representation.
*/
UFUNCTION(BlueprintPure, DisplayName="Serialize", Category="SenseGlove | Core | SG | Sense Glove Sensor Data")
static FString SGSerialize(const USGSenseGloveSensorData* SenseGloveSensorData);
};
};
@@ -29,7 +29,7 @@
*
* @section DESCRIPTION
*
*
* Contains enumerators and classes to aid in Sense Glove Deserialization.
*/
@@ -48,56 +48,97 @@
class USGSenseGloveInfo;
/**
* "Database" class containing Sense Glove internal variables.
*/
UCLASS(meta=(ScriptName = "SesneGloveVarsKismetLibrary"))
class SENSEGLOVECOREKISMET_API USGSenseGloveVarsKismetLibrary final : public USGBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
/**
* Retrieve a basic ConstantsString for a Sense Glove of a specific Hardware Version. Used for debugging / unit tests.
*
* @returns Returns an empty string when an invalid glove version is requested.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | SG | Sense Glove Vars")
static FString GetStandardConstantsString(const FString& HardwareVersion, float FirmwareVersion, bool bRightHanded);
/**
* Retrieve an example sensor string of a Sense Glove with a particular hardware- and firmware version.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | SG | Sense Glove Vars")
static FString GetSensorString(const FString& HardwareVersion, float FirmwareVersion);
/**
* Retrieve the starting positions of a particular Sense Glove.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | SG | Sense Glove Vars")
static TArray<FVector> GetStartPositions(const FString& HardwareVersion, bool bRightHanded);
/**
* Retrieve the starting rotations of a particular Sense Glove.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Start Rotations",
Category="SenseGlove | Core | SG | Sense Glove Vars")
static TArray<FQuat> GetStartRotations_TArrayFQuat(const FString& HardwareVersion, bool bRightHanded);
/**
* Retrieve the starting rotations of a particular Sense Glove.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Start Rotations",
Category="SenseGlove | Core | SG | Sense Glove Vars")
static TArray<FRotator> GetStartRotations_TArrayFRotator(const FString& HardwareVersion, bool bRightHanded);
/**
* Retrieve the glove finger lengths of a particular Sense Glove.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | SG | Sense Glove Vars")
static TArray<FSGVectorArray> GetGloveLengths(const FString& HardwareVersion);
/**
* Get the number of sensors of a SenseGlove.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | SG | Sense Glove Vars")
static int32 GetSensors(const FString& HardwareVersion);
/**
* Get the default IMUCorrection for the SenseGlove.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Imu Correction", Category="SenseGlove | Core | SG | Sense Glove Vars")
static FQuat GetImuCorrection_FQuat(const FString& HardwareVersion,
int32 FirmwareVersion, int32 SubFirmwareVersion);
/**
* Get the default IMUCorrection for the SenseGlove.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Imu Correction", Category="SenseGlove | Core | SG | Sense Glove Vars")
static FRotator GetImuCorrection_FRotator(const FString& HardwareVersion,
int32 FirmwareVersion, int32 SubFirmwareVersion);
/**
* Check all functionality of a SenseGlove.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | SG | Sense Glove Vars")
static TArray<bool> GetFunctions(const FString& HardwareVersion, int32 FirmwareVersion, int32 SubFirmwareVersion);
/**
* Generate a custom glove info.
*/
UFUNCTION(BlueprintCallable, DisplayName="GenerateGloveModel", Category="SenseGlove | Core | SG | Sense Glove Vars",
meta=(WorldContext="WorldContextObject"))
static USGSenseGloveInfo* GenerateGloveModel_HV_FV_SFV_bRH(
UObject* WorldContextObject,
const FString& HardwareVersion, int32 FirmwareVersion, int32 SubFirmwareVersion, bool bRightHanded);
/**
* Generate a custom glove info.
*/
UFUNCTION(BlueprintCallable, DisplayName="GenerateGloveModel", Category="SenseGlove | Core | SG | Sense Glove Vars",
meta=(WorldContext="WorldContextObject"))
static USGSenseGloveInfo* GenerateGloveModel_HV_FV_SFV_bRH_CI(
UObject* WorldContextObject,
const FString& HardwareVersion, int32 FirmwareVersion, int32 SubFirmwareVersion, bool bRightHanded,
const FString& CustomId);
};
};
@@ -41,62 +41,113 @@
class USGSensorRange;
/**
*
*/
UCLASS(meta=(ScriptName = "SesneGloveSensorRangeKismetLibrary"))
class SENSEGLOVECOREKISMET_API USGSensorRangeKismetLibrary final : public USGBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
/**
* Create a new instance of a SensorRange with values at 0, 0.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Calibration | Sensor Range",
meta=(WorldContext="WorldContextObject"))
static USGSensorRange* MakeSensorRange(UObject* WorldContextObject);
/**
* Create a new SensorRange with predefined Min/Max values.
*/
UFUNCTION(BlueprintCallable, DisplayName="Make Sensor Range",
Category="SenseGlove | Core | Calibration | Sensor Range", meta=(WorldContext="WorldContextObject"))
static USGSensorRange* MakeSensorRange_MV_MV(
UObject* WorldContextObject, const TArray<FVector>& MinValues, const TArray<FVector>& MaxValues);
/**
* Generates a Sensor Range where minimum values are float.MaxValue and maximum values are float.MinValue.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Calibration | Sensor Range",
meta=(WorldContext="WorldContextObject"))
static USGSensorRange* ForCalibration(UObject* WorldContextObject);
/**
* Convert a serialized SensorRange back into the appropriate class.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Calibration | Sensor Range",
meta=(WorldContext="WorldContextObject"))
static USGSensorRange* Deserialize(UObject* WorldContextObject, const FString& SerializedString);
/**
* Evaluate maxValues so that it contains the highest x, y, and z values between currentValues and maxValues.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Calibration | Sensor Range")
static void CheckMax(const FVector CurrentValues, FVector& OutMaxValues);
/**
* Evaluate minValues so that it contains the lowest x, y, and z values between currentValues and minValues.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Calibration | Sensor Range")
static void CheckMin(const FVector& CurrentValues, FVector& OutMinValues);
/**
* Access the lowest values values of this range.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Calibration | Sensor Range")
static TArray<FVector> GetMinValues(const USGSensorRange* SensorRange);
/**
* Set the lowest values values of this range.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Calibration | Sensor Range")
static void SetMinValues(UPARAM(ref) USGSensorRange* SensorRange, const TArray<FVector>& Values);
/**
* Access the highest values values of this range.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Calibration | Sensor Range")
static TArray<FVector> GetMaxValues(const USGSensorRange* SensorRange);
/**
* Set the highest values values of this range.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Calibration | Sensor Range")
static void SetMaxValues(UPARAM(ref) USGSensorRange* SensorRange, const TArray<FVector>& Values);
/**
* Access the difference between min and max values.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Calibration | Sensor Range")
static TArray<FVector> GetRange(const USGSensorRange* SensorRange);
/**
* Update the Range based on the current MinValues and MaxValues.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Calibration | Sensor Range")
static void UpdateRange(UPARAM(ref) USGSensorRange* SensorRange);
/**
* In otherValues are greater/smaller than this current range, update them.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Calibration | Sensor Range")
static void CheckForExtremes(UPARAM(ref) USGSensorRange* SensorRange, const TArray<FVector>& OtherValues);
/**
* Report the Range value of this SensorRange, separated by a comma.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Calibration | Sensor Range")
static FString RangeString(const USGSensorRange* SensorRange, bool bYOnly = true);
/**
* Convert this SensorRange into a string rotation [min ... max].
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Calibration | Sensor Range")
static FString ToString(const USGSensorRange* SensorRange, bool bYOnly = true);
/**
* Serialize this SensorRange into a string representation, that can be deserialized later.
*/
UFUNCTION(BlueprintPure, DisplayName="Serialize", Category="SenseGlove | Core | Calibration | Sensor Range")
static FString SGSerialize(const USGSensorRange* SensorRange);
};
};
@@ -29,7 +29,7 @@
*
* @section DESCRIPTION
*
*
* Thumper command.
*/
@@ -41,39 +41,66 @@
class USGThumperCommand;
/**
*
*/
UCLASS(meta=(ScriptName = "SesneGloveThumperCommandKismetLibrary"))
class SENSEGLOVECOREKISMET_API USGThumperCommandKismetLibrary final : public USGBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
/**
* Empty constructor for inheritance.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Haptics | Thumper Command",
meta=(WorldContext="WorldContextObject"))
static USGThumperCommand* MakeThumperCommand(UObject* WorldContextObject);
/**
* Create a new Thumper Command.
*/
UFUNCTION(BlueprintCallable, DisplayName="Make Thumper Command",
Category="SenseGlove | Core | Haptics | Thumper Command", meta=(WorldContext="WorldContextObject"))
static USGThumperCommand* MakeThumperCommand_M(UObject* WorldContextObject, int32 Magnitude);
/**
* A command that turns off all force feedback on the Sense Glove.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Haptics | Thumper Command",
meta=(WorldContext="WorldContextObject"))
static USGThumperCommand* Off(UObject* WorldContextObject);
/**
* Thumper intensity, a level between 0 and 100.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Haptics | Thumper Command")
static int32 GetMagnitude(const USGThumperCommand* ThumperCommand);
/**
*
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Haptics | Thumper Command")
static void SetMagnitude(USGThumperCommand* ThumperCommand, int32 Magnitude);
/**
* Duplicate the Thumper command.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Haptics | Thumper Command",
meta=(WorldContext="WorldContextObject"))
static USGThumperCommand* Copy(UObject* WorldContextObject, const USGThumperCommand* ThumperCommand);
/**
* Merge two ThumperCommands into one.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Haptics | Thumper Command",
meta=(WorldContext="WorldContextObject"))
static USGThumperCommand* Merge(UObject* WorldContextObject,
const USGThumperCommand* A, const USGThumperCommand* B);
/**
*
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Haptics | Thumper Command")
static bool Equals(const USGThumperCommand* A, const USGThumperCommand* B);
};
};
@@ -29,7 +29,7 @@
*
* @section DESCRIPTION
*
*
* Buzz Motor with timing parameters.
*/
@@ -43,62 +43,111 @@
class USGBuzzCommand;
class USGTimedBuzzCommand;
/**
* Buzz motor commands that is meant to stop after a few milliseconds.
*
* @remarks Intended use; this.levels indicates the actual command.
*/
UCLASS(meta=(ScriptName = "SesneGloveTimedBuzzCommandKismetLibrary"))
class SENSEGLOVECOREKISMET_API USGTimedBuzzCommandKismetLibrary final : public USGBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
/**
* Empty constructor for inheritance.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Haptics | Timed Buzz Command",
meta=(WorldContext="WorldContextObject"))
static USGTimedBuzzCommand* MakeTimedBuzzCommand(UObject* WorldContextObject);
/**
* Create a new TimeBuzzCommand for a single finger.
*/
UFUNCTION(BlueprintPure, DisplayName="Make Timed Buzz Command",
Category="SenseGlove | Core | Haptics | Timed Buzz Command", meta=(WorldContext="WorldContextObject"))
static USGTimedBuzzCommand* MakeTimedBuzzCommand_F_M_DS_STS(
UObject* WorldContextObject,
ESGFinger Finger, int32 Magnitude, float DurationSeconds, float StartTimeSeconds = 0.0f);
/**
* Create a new buzz motor command that expires after timing_ms.
*/
UFUNCTION(BlueprintPure, DisplayName="Make Timed Buzz Command",
Category="SenseGlove | Core | Haptics | Timed Buzz Command", meta=(WorldContext="WorldContextObject"))
static USGTimedBuzzCommand* MakeTimedBuzzCommand_BC_DS_STS(
UObject* WorldContextObject,
const USGBuzzCommand* BaseCommand, float DurationSeconds, float StartTimeSeconds = 0.0f);
/**
* Copy this Buzz Command's values into a new object.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Haptics | Timed Buzz Command",
meta=(WorldContext="WorldContextObject"))
static USGBuzzCommand* Copy(UObject* WorldContextObject, const USGTimedBuzzCommand* TimedBuzzCommand);
/**
* Merges this base command with another command.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Haptics | Timed Buzz Command",
meta=(WorldContext="WorldContextObject"))
static USGBuzzCommand* Merge(UObject* WorldContextObject, const USGTimedBuzzCommand* A, const USGBuzzCommand* B);
/**
* Access the base command, which indicates the buzz levels to keep untill time elapses.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Haptics | Timed Buzz Command",
meta=(WorldContext="WorldContextObject"))
static USGBuzzCommand* GetBaseCommand(UObject* WorldContextObject,
const USGTimedBuzzCommand* TimedBuzzCommand);
/**
*
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Haptics | Timed Buzz Command")
static int32 GetMagnitude(const USGTimedBuzzCommand* TimedBuzzCommand);
/**
* The total time [milliseconds] each buzz motor should be vibrating for.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Haptics | Timed Buzz Command")
static float GetDuration(const USGTimedBuzzCommand* TimedBuzzCommand);
/**
* The time elapsed since the command was sent [milliseconds].
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Haptics | Timed Buzz Command")
static float GetElapsedTime(const USGTimedBuzzCommand* TimedBuzzCommand);
/**
* Check if this timed command's timing has elapsed.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Haptics | Timed Buzz Command")
static bool HasTimeElapsed(const USGTimedBuzzCommand* TimedBuzzCommand);
/**
* Represents how far this effect is in its playtime; [0...1], where 0 means at the start, and 1 means at the end.
*
* @param bClamp01 Optional parameter; ensures this value is always between 0 and 1.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Haptics | Timed Buzz Command")
static float NormalizedTime(const USGTimedBuzzCommand* TimedBuzzCommand, bool bClamp01 = true);
/**
* Reset the timings of this BuzzCommand, allowing us to re-use it.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Haptics | Timed Buzz Command")
static void ResetTiming(UPARAM(ref) USGTimedBuzzCommand* TimedBuzzCommand);
/**
* Update the elapsed time to check if the buzz motors should stop.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Haptics | Timed Buzz Command")
static void UpdateTiming(UPARAM(ref) USGTimedBuzzCommand* TimedBuzzCommand, float DeltaSeconds);
/**
*
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Haptics | Timed Buzz Command")
static FString ToString(const USGTimedBuzzCommand* TimedBuzzCommand);
};
};
@@ -42,59 +42,104 @@
class USGThumperCommand;
class USGTimedThumpCommand;
/**
*
*/
UCLASS(meta=(ScriptName = "SesneGloveTimedThumpCommandKismetLibrary"))
class SENSEGLOVECOREKISMET_API USGTimedThumpCommandKismetLibrary final : public USGBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
/**
* Internal, empty, for extended classes.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Haptics | Timed Thump Command",
meta=(WorldContext="WorldContextObject"))
static USGTimedThumpCommand* MakeTimedThumpCommand(UObject* WorldContextObject);
/**
* Create a new Timed Thumper Command.
*/
UFUNCTION(BlueprintCallable, DisplayName="Make Timed Thump Command",
Category="SenseGlove | Core | Haptics | Timed Thump Command", meta=(WorldContext="WorldContextObject"))
static USGTimedThumpCommand* MakeTimedThumpCommand_M_DS_STS(
UObject* WorldContextObject, int32 Magnitude, float DurationSeconds, float StartTimeSeconds = 0.0f);
/**
* Create a new Timed Thumper Command.
*/
UFUNCTION(BlueprintCallable, DisplayName="Make Timed Thump Command",
Category="SenseGlove | Core | Haptics | Timed Thump Command", meta=(WorldContext="WorldContextObject"))
static USGTimedThumpCommand* MakeTimedThumpCommand_BC_DS_STS(
UObject* WorldContextObject,
const USGThumperCommand* BaseCommand, float DurationSeconds, float StartTimeSeconds = 0.0f);
/**
* Magnitude in %.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Haptics | Timed Thump Command")
static int32 GetMagnitude(const USGTimedThumpCommand* TimedThumpCommand);
/**
*
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Haptics | Timed Thump Command")
static void SetMagnitude(UPARAM(ref) USGTimedThumpCommand* TimedThumpCommand, int32 Magnitude);
/**
* Duration in seconds.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Haptics | Timed Thump Command")
static float GetDuration(const USGTimedThumpCommand* TimedThumpCommand);
/**
*
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Haptics | Timed Thump Command")
static void SetDuration(UPARAM(ref) USGTimedThumpCommand* TimedThumpCommand, float Duration);
/**
* The elapsed time so far.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Haptics | Timed Thump Command")
static float GetElapsedTime(const USGTimedThumpCommand* TimedThumpCommand);
/**
*
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Haptics | Timed Thump Command")
static void SetElapsedTime(UPARAM(ref) USGTimedThumpCommand* TimedThumpCommand, float ElapsedTime);
/**
* Returns true if the timed command has elapsed.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Haptics | Timed Thump Command")
static bool HasTimeElapsed(const USGTimedThumpCommand* TimedThumpCommand);
/**
* Copy the parameters of this ThumperCommand into another instance.
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Haptics | Timed Thump Command",
meta=(WorldContext="WorldContextObject"))
static USGTimedThumpCommand* Copy(
UObject* WorldContextObject, const USGTimedThumpCommand* TimedThumpCommand, bool bCopyElapsed = false);
/**
* Update the timing on this Thumper Command.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Haptics | Timed Thump Command")
static void Update(UPARAM(ref) USGTimedThumpCommand* TimedThumpCommand, float DeltaSeconds);
/**
*
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Haptics | Timed Thump Command")
static bool Equals(const USGTimedThumpCommand* A, const USGTimedThumpCommand* B);
/**
*
*/
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Haptics | Timed Thump Command")
static FString ToString(const USGTimedThumpCommand* TimedThumpCommand);
};
};
@@ -45,180 +45,314 @@
#include "SGTrackingKismetLibrary.generated.h"
/**
*
*/
UCLASS(meta=(ScriptName = "SesneGloveTrackingKismetLibrary"))
class SENSEGLOVECOREKISMET_API USGTrackingKismetLibrary final : public USGBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
/**
* Knowing a position & rotation in 3D space, calculate a relative location based on offsets.
*/
UFUNCTION(BlueprintCallable, DisplayName="Calculate Location", Category="SenseGlove | Core | Tracking")
static void CalculateLocation_TP_FQuat_TR_PO_FQuat_RO_OutNP_FQuat_OutNR(
const FVector& TrackedPosition, const FQuat& TrackedRotation,
const FVector& PositionOffset, const FQuat& RotationOffset,
FVector& OutNewPosition, FQuat& OutNewRotation);
/**
* Knowing a position & rotation in 3D space, calculate a relative location based on offsets.
*/
UFUNCTION(BlueprintCallable, DisplayName="Calculate Location", Category="SenseGlove | Core | Tracking")
static void CalculateLocation_TP_FRotator_TR_PO_FRotator_RO_OutNP_FRotator_OutNR(
const FVector& TrackedPosition, const FRotator& TrackedRotation,
const FVector& PositionOffset, const FRotator& RotationOffset,
FVector& OutNewPosition, FRotator& OutNewRotation);
/**
* Positional offset from each finger to the glove origin.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Tracking")
static TArray<FVector> GetSenseGloveFingerToGlovePositionOrigin();
/**
*
*/
UFUNCTION(BlueprintCallable, DisplayName="Get SenseGlove Finger To Glove Rotation Origin",
Category="SenseGlove | Core | Tracking")
static TArray<FQuat> GetSenseGloveFingerToGloveRotationOrigin_TArrayFQuat();
/**
*
*/
UFUNCTION(BlueprintCallable, DisplayName="Get SenseGlove Finger To Glove Rotation Origin",
Category="SenseGlove | Core | Tracking")
static TArray<FRotator> GetSenseGloveFingerToGloveRotationOrigin_TArrayFRotator();
/**
* Default position offset from glove origin to wrist location, in cm.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Tracking")
static FVector GetSenseGloveWristPositionOffset();
/**
* Default rotation offset from glove origin to wrist location.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get SenseGlove Wrist Rotation Offset",
Category="SenseGlove | Core | Tracking")
static FQuat GetSenseGloveWristRotationOffset_FQuat();
/**
* Default rotation offset from glove origin to wrist location.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get SenseGlove Wrist Rotation Offset",
Category="SenseGlove | Core | Tracking")
static FRotator GetSenseGloveWristRotationOffset_FRotator();
/**
* Get the position and rotation offsets to go from the glove origin to the mounted position.
* @remarks Based on CAD. needs to be inverted when going from tracker to glove origin.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get SenseGlove Mount Offset", Category="SenseGlove | Core | Tracking")
static void GetSenseGloveMountOffset_bRH_TF_OutIP_FQuat_OutIR(
bool bRightHanded, ESGFinger ToFinger, FVector& OutIPosition, FQuat& OutIRotation);
/**
* Get the position and rotation offsets to go from the glove origin to the mounted position.
* @remarks Based on CAD. needs to be inverted when going from tracker to glove origin.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get SenseGlove Mount Offset", Category="SenseGlove | Core | Tracking")
static void GetSenseGloveMountOffset_bRH_TF_OutIP_FRotator_OutIR(
bool bRightHanded, ESGFinger ToFinger, FVector& OutIPosition, FRotator& OutIRotation);
/**
* 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",
Category="SenseGlove | Core | Tracking")
static void GetSenseGloveTrackerMountOffset_H_bRH_OutPO_FQuat_OutRO(
ESGPositionalTrackingHardware Hardware, bool bRightHanded,
FVector& OutPositionOffset, FQuat& OutRotationOffset);
/**
* 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",
Category="SenseGlove | Core | Tracking")
static void GetSenseGloveTrackerMountOffset_H_bRH_OutPO_FRotator_OutRO(
ESGPositionalTrackingHardware Hardware, bool bRightHanded,
FVector& OutPositionOffset, FRotator& OutRotationOffset);
/**
* Vive Tracker origin to Finger rotational offset.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Tracking")
static FVector GetSenseGloveViveToAttachPosition();
/**
* Vive Tracker origin to Finger rotational offset.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get SenseGlove Vive To Attach Rotation",
Category="SenseGlove | Core | Tracking")
static FQuat GetSenseGloveViveToAttachRotation_FQuat();
/**
* Vive Tracker origin to Finger rotational offset.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get SenseGlove Vive To Attach Rotation",
Category="SenseGlove | Core | Tracking")
static FRotator GetSenseGloveViveToAttachRotation_FRotator();
/**
* Oculus Touch origin to Finger rotational offset.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Tracking")
static FVector GetSenseGloveOculusTouchToAttachPosition();
/**
* Oculus Touch origin to Finger rotational offset.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get SenseGlove Oculus Touch To Attach Rotation",
Category="SenseGlove | Core | Tracking")
static FQuat GetSenseGloveOculusTouchToAttachRotation_FQuat();
/**
* Oculus Touch origin to Finger rotational offset.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get SenseGlove Oculus Touch To Attach Rotation",
Category="SenseGlove | Core | Tracking")
static FRotator GetSenseGloveOculusTouchToAttachRotation_FRotator();
/**
* Positional offset between Nova Glove Origin and Wrist.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Tracking")
static FVector GetNovaToWristPositionOffset();
/**
* Rotational offset between Nova Glove Origin and Wrist.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Nove 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",
Category="SenseGlove | Core | Tracking")
static FRotator GetNovaToWristRotationOffset_FRotator();
/**
* Returns the Offsets that will bring us from the Nova origin to the wrist position.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Nova Glove Wrist Offset", Category="SenseGlove | Core | Tracking")
static void GetNovaGloveWristOffset_bRH_OutPO_FQuat_OutRO(
bool bRightHanded, FVector& OutPositionOffset, FQuat& OutRotationOffset);
/**
* Returns the Offsets that will bring us from the Nova origin to the wrist position.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Nova Glove Wrist Offset", Category="SenseGlove | Core | Tracking")
static void GetNovaGloveWristOffset_bRH_OutPO_FRotator_OutRO(
bool bRightHanded, FVector& OutPositionOffset, FRotator& OutRotationOffset);
/**
*
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Tracking")
static FVector GetRightNovaViveToAttachPosition();
/**
*
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Right Nova Vive To Attach Rotation",
Category="SenseGlove | Core | Tracking")
static FQuat GetRightNovaViveToAttachRotation_FQuat();
/**
*
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Right Nova Vive To Attach Rotation",
Category="SenseGlove | Core | Tracking")
static FRotator GetRightNovaViveToAttachRotation_FRotator();
/**
*
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Tracking")
static FVector GetLeftNovaViveToAttachPosition();
/**
*
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Left Nova Vive To Attach Rotation",
Category="SenseGlove | Core | Tracking")
static FQuat GetLeftNovaViveToAttachRotation_FQuat();
/**
*
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Left Nova Vive To Attach Rotation",
Category="SenseGlove | Core | Tracking")
static FRotator GetLeftNovaViveToAttachRotation_FRotator();
/**
*
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Tracking")
static FVector GetRightNovaQuest2ToAttachPosition();
/**
*
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Right Nova Quest 2 To Attach Rotation",
Category="SenseGlove | Core | Tracking")
static FQuat GetRightNovaQuest2ToAttachRotation_FQuat();
/**
*
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Right Nova Quest 2 To Attach Rotation",
Category="SenseGlove | Core | Tracking")
static FRotator GetRightNovaQuest2ToAttachRotation_FRotator();
/**
*
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Tracking")
static FVector GetLeftNovaQuest2ToAttachPosition();
/**
*
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Left Nova Quest 2 To Attach Rotation",
Category="SenseGlove | Core | Tracking")
static FQuat GetLeftNovaQuest2ToAttachRotation_FQuat();
/**
*
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Left Nova Quest 2 To Attach Rotation",
Category="SenseGlove | Core | Tracking")
static FRotator GetLeftNovaQuest2ToAttachRotation_FRotator();
/**
* @remarks Left is a mirror, so we only need R pos.
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Tracking")
static FVector GetRightNovaPico2ToAttachPosition();
/**
*
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Right Nova Pico 2 To Attach Rotation",
Category="SenseGlove | Core | Tracking")
static FQuat GetRightNovaPico2ToAttachRotation_FQuat();
/**
*
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Right Nova Pico 2 To Attach Rotation",
Category="SenseGlove | Core | Tracking")
static FRotator GetRightNovaPico2ToAttachRotation_FRotator();
/**
*
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Left Nova Pico 2 To Attach Rotation",
Category="SenseGlove | Core | Tracking")
static FQuat GetLeftNovaPico2ToAttachRotation_FQuat();
/**
*
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Left Nova Pico 2 To Attach Rotation",
Category="SenseGlove | Core | Tracking")
static FRotator GetLeftNovaPico2ToAttachRotation_FRotator();
/**
* Retrieves Offsets for a particular device.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Nova Glove Tracker Offset", Category="SenseGlove | Core | Tracking")
static void GetNovaGloveTrackerOffset_H_bRH_OutPO_FQuat_OutRO(
ESGPositionalTrackingHardware Hardware, bool bRightHanded,
FVector& OutPositionOffset, FQuat& OutRotationOffset);
/**
* Retrieves Offsets for a particular device.
*/
UFUNCTION(BlueprintCallable, DisplayName="Get Nova Glove Tracker Offset", Category="SenseGlove | Core | Tracking")
static void GetNovaGloveTrackerOffset_H_bRH_OutPO_FRotator_OutRO(
ESGPositionalTrackingHardware Hardware, bool bRightHanded,
FVector& OutPositionOffset, FRotator& OutRotationOffset);
/**
*
*/
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Tracking")
static FString ToString(ESGPositionalTrackingHardware Hardware);
};
};