Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c0ed6f0554
|
||
|
|
15aaf4f73c
|
||
|
|
e5c11adec3
|
||
|
|
5075b0bc17
|
@@ -5,6 +5,18 @@ All notable changes to this project will be documented in this file.
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [2.3.1] - 2024-11-27
|
||||
|
||||
This patch release addresses a few issues with SenseGlove Sockets Editor.
|
||||
|
||||
### Fixed
|
||||
|
||||
- Additional minor fixes and improvements that may not be listed here.
|
||||
|
||||
### Changed
|
||||
|
||||
- The SenseGlove Sockets Editor now calculates hand bone reference transforms using the current virtual hand mesh being edited, rather than the reference mesh, when adding SenseGlove sockets.
|
||||
|
||||
## [2.3.0] - 2024-11-13
|
||||
|
||||
This minor release includes some improvements and adds official Unreal Engine `5.5` Fab support.
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
|
||||
| | **Windows (MSVC 2017)** | **Windows (MSVC 2019)** | **Windows (MSVC 2022)** | **Linux x86-64 (Native Toolchain)** | **Linux AArch64 (Native Toolchain)** | **Meta Quest Stand-alone (Android NDK)** | **HTC VIVE Stand-alone (Android NDK)** | **Fab** | **Azure DevOps Version** |
|
||||
|:--------:|:-----------------------:|:-----------------------:|:-----------------------:|:-----------------------------------:|:------------------------------------:|:----------------------------------------:|:--------------------------------------:|:--------:|:------------------------:|
|
||||
| **5.5** | ❌ | ❌ | ✅ v2.3.x | ✅ v2.3.x | ✅ v2.3.x | ✅ v2.3.x (r25b) | ❓ | ✅ v2.3.0 | ✅ v2.3.0 |
|
||||
| **5.4** | ❌ | ❌ | ✅ v2.3.x | ✅ v2.3.x | ✅ v2.3.x | ✅ v2.3.x (r25b) | ❓ | ✅ v2.3.0 | ✅ v2.3.0 |
|
||||
| **5.3** | ❌ | ✅ v2.3.x | ✅ v2.3.x | ✅ v2.3.x | ✅ v2.3.x | ✅ v2.3.x (r25b) | ❓ | ✅ v2.3.0 | ✅ v2.3.0 |
|
||||
| **5.2** | ❌ | ✅ v2.3.x | ✅ v2.3.x | ✅ v2.3.x | ✅ v2.3.x | ✅ v2.3.x (r25b) | ❓ | ✅ v2.3.0 | ✅ v2.3.0 |
|
||||
| **5.5** | ❌ | ❌ | ✅ v2.3.x | ✅ v2.3.x | ✅ v2.3.x | ✅ v2.3.x (r25b) | ❓ | ✅ v2.3.1 | ✅ v2.3.1 |
|
||||
| **5.4** | ❌ | ❌ | ✅ v2.3.x | ✅ v2.3.x | ✅ v2.3.x | ✅ v2.3.x (r25b) | ❓ | ✅ v2.3.1 | ✅ v2.3.1 |
|
||||
| **5.3** | ❌ | ✅ v2.3.x | ✅ v2.3.x | ✅ v2.3.x | ✅ v2.3.x | ✅ v2.3.x (r25b) | ❓ | ✅ v2.3.1 | ✅ v2.3.1 |
|
||||
| **5.2** | ❌ | ✅ v2.3.x | ✅ v2.3.x | ✅ v2.3.x | ✅ v2.3.x | ✅ v2.3.x (r25b) | ❓ | ✅ v2.3.1 | ✅ v2.3.1 |
|
||||
| **5.1** | ❌ | ⚠️ v2.0.x | ⚠️ v2.0.x | ⚠️ v2.0.x | ⚠️ v2.0.x | ⚠️ v2.0.x (r25b) | ❓ | ⚠️ v2.0.0 | ⚠️ v2.0.2 |
|
||||
| **5.0** | ❌ | ⚠️ v1.6.x | ⚠️ v1.6.x | ⚠️ v1.6.x | ⚠️ v1.6.x | ⚠️ v1.6.x (r21e) | ❓ | ⚠️ v1.6.1 | ⚠️ v1.6.1 |
|
||||
| **4.27** | ⚠️ v1.4.x | ⚠️ v1.4.x | ⚠️ v1.4.x | ⚠️ v1.4.x | ⚠️ v1.4.x | ⚠️ v1.4.x (r21e) | ❓ | ⚠️ v1.3.1 | ⚠️ v1.4.3 |
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"FileVersion": 3,
|
||||
"Version": 1,
|
||||
"VersionName": "2.3.0",
|
||||
"VersionName": "2.3.1",
|
||||
"FriendlyName": "SenseGlove",
|
||||
"Description": "Integrating the SenseGlove haptic controller into Unreal Engine",
|
||||
"Category": "Virtual Reality",
|
||||
|
||||
@@ -99,7 +99,7 @@ struct FSGAssetUtils::FImpl
|
||||
static bool IsLeftHandMesh(const ISkeletalMeshEditor* SkeletalMeshEditor, const USkeletalMesh* SkeletalMesh);
|
||||
static bool IsRightHandMesh(const ISkeletalMeshEditor* SkeletalMeshEditor, const USkeletalMesh* SkeletalMesh);
|
||||
|
||||
static FTransform GetHandBoneBoneRefTransform(bool bRight, const FName& BoneName);
|
||||
static FTransform GetHandBoneRefTransform(const USkeletalMesh* SkeletalMesh, const FName& BoneName);
|
||||
|
||||
static bool AddSocket(
|
||||
const ISkeletalMeshEditor* SkeletalMeshEditor, USkeletalMesh* SkeletalMesh,
|
||||
@@ -310,48 +310,32 @@ bool FSGAssetUtils::FImpl::IsRightHandMesh(
|
||||
return true;
|
||||
}
|
||||
|
||||
FTransform FSGAssetUtils::FImpl::GetHandBoneBoneRefTransform(const bool bRight, const FName& BoneName)
|
||||
FTransform FSGAssetUtils::FImpl::GetHandBoneRefTransform(
|
||||
const USkeletalMesh* SkeletalMesh, const FName& BoneName)
|
||||
{
|
||||
const FSGVirtualHandMeshSettings& MeshSettings{GetVirtualHandSettings().MeshSettings};
|
||||
|
||||
const TSoftObjectPtr<USkeletalMesh>& HandMesh{
|
||||
bRight
|
||||
? MeshSettings.LeftHandReferenceMesh
|
||||
: MeshSettings.RightHandReferenceMesh
|
||||
};
|
||||
|
||||
if (HandMesh.IsValid())
|
||||
if (!ensureAlwaysMsgf(IsValid(SkeletalMesh), TEXT("Invalid SkeletalMesh")))
|
||||
{
|
||||
const FReferenceSkeleton& ReferenceSkeleton{HandMesh->GetRefSkeleton()};
|
||||
const int32 BoneIndex = ReferenceSkeleton.FindBoneIndex(BoneName);
|
||||
|
||||
if (BoneIndex == INDEX_NONE)
|
||||
{
|
||||
SGLOG_WARNING(FString::Printf(TEXT("Could not find a bone index for the '%s' joint!"),
|
||||
*BoneName.ToString()));
|
||||
}
|
||||
|
||||
const TArray<FTransform> Transforms{ReferenceSkeleton.GetRefBonePose()};
|
||||
ensureAlwaysMsgf(Transforms.Num() > 0 && Transforms.Num() > BoneIndex,
|
||||
TEXT("Invalid bone index '%d' or no transforms found!"), BoneIndex);
|
||||
|
||||
const FTransform& Transform{Transforms[BoneIndex]};
|
||||
return Transform;
|
||||
return FTransform::Identity;
|
||||
}
|
||||
|
||||
ensureAlwaysMsgf(
|
||||
bRight
|
||||
? MeshSettings.RightHandDefaultReferenceBoneTransforms.Contains(BoneName)
|
||||
: MeshSettings.LeftHandDefaultReferenceBoneTransforms.Contains(BoneName),
|
||||
TEXT("Invalid bone name '%s'!"), *BoneName.ToString());
|
||||
const FReferenceSkeleton& ReferenceSkeleton{SkeletalMesh->GetRefSkeleton()};
|
||||
|
||||
const FTransform& Transform{
|
||||
bRight
|
||||
? MeshSettings.RightHandDefaultReferenceBoneTransforms[BoneName]
|
||||
: MeshSettings.LeftHandDefaultReferenceBoneTransforms[BoneName]
|
||||
};
|
||||
const int32 BoneIndex = ReferenceSkeleton.FindBoneIndex(BoneName);
|
||||
if (!ensureAlwaysMsgf(BoneIndex != INDEX_NONE,
|
||||
TEXT("Could not find a bone index for the '%s' joint!"), *BoneName.ToString()))
|
||||
{
|
||||
return FTransform::Identity;
|
||||
}
|
||||
|
||||
const TArray<FTransform> Transforms{ReferenceSkeleton.GetRefBonePose()};
|
||||
if (!ensureAlwaysMsgf(Transforms.Num() > 0 && Transforms.Num() > BoneIndex,
|
||||
TEXT("Invalid bone index '%d' or no transforms found!"), BoneIndex))
|
||||
{
|
||||
return FTransform::Identity;
|
||||
}
|
||||
|
||||
const FTransform& Transform{Transforms[BoneIndex]};
|
||||
return Transform;
|
||||
|
||||
}
|
||||
|
||||
bool FSGAssetUtils::FImpl::AddSocket(
|
||||
@@ -468,7 +452,7 @@ bool FSGAssetUtils::FImpl::AddFingertipColliderSocket(
|
||||
};
|
||||
|
||||
FTransform SocketTransform{
|
||||
GetHandBoneBoneRefTransform(bRight, BoneName)
|
||||
GetHandBoneRefTransform(SkeletalMesh, BoneName)
|
||||
};
|
||||
|
||||
const bool bAddedSocket = AddSocket(
|
||||
@@ -490,7 +474,7 @@ bool FSGAssetUtils::FImpl::AddGrabThumbColliderSocket(
|
||||
const FSGVirtualHandGrabSettings GrabSettings{GetVirtualHandGrabSettings()};
|
||||
const FName& SocketName{GrabSettings.ThumbColliderSocketName};
|
||||
return AddFingertipColliderSocket(SkeletalMeshEditor, SkeletalMesh,
|
||||
bRight, EHandKeypoint::ThumbDistal, SocketName);
|
||||
bRight, EHandKeypoint::ThumbDistal, SocketName);
|
||||
}
|
||||
|
||||
bool FSGAssetUtils::FImpl::AddGrabIndexColliderSocket(
|
||||
@@ -499,7 +483,7 @@ bool FSGAssetUtils::FImpl::AddGrabIndexColliderSocket(
|
||||
const FSGVirtualHandGrabSettings GrabSettings{GetVirtualHandGrabSettings()};
|
||||
const FName& SocketName{GrabSettings.IndexColliderSocketName};
|
||||
return AddFingertipColliderSocket(SkeletalMeshEditor, SkeletalMesh,
|
||||
bRight, EHandKeypoint::IndexDistal, SocketName);
|
||||
bRight, EHandKeypoint::IndexDistal, SocketName);
|
||||
}
|
||||
|
||||
bool FSGAssetUtils::FImpl::AddGrabMiddleColliderSocket(
|
||||
@@ -508,7 +492,7 @@ bool FSGAssetUtils::FImpl::AddGrabMiddleColliderSocket(
|
||||
const FSGVirtualHandGrabSettings GrabSettings{GetVirtualHandGrabSettings()};
|
||||
const FName& SocketName{GrabSettings.MiddleColliderSocketName};
|
||||
return AddFingertipColliderSocket(SkeletalMeshEditor, SkeletalMesh,
|
||||
bRight, EHandKeypoint::MiddleDistal, SocketName);
|
||||
bRight, EHandKeypoint::MiddleDistal, SocketName);
|
||||
}
|
||||
|
||||
bool FSGAssetUtils::FImpl::AddTouchThumbColliderSocket(
|
||||
@@ -517,7 +501,7 @@ bool FSGAssetUtils::FImpl::AddTouchThumbColliderSocket(
|
||||
const FSGVirtualHandTouchSettings TouchSettings{GetVirtualHandTouchSettings()};
|
||||
const FName& SocketName{TouchSettings.ThumbColliderSocketName};
|
||||
return AddFingertipColliderSocket(SkeletalMeshEditor, SkeletalMesh,
|
||||
bRight, EHandKeypoint::ThumbDistal, SocketName);
|
||||
bRight, EHandKeypoint::ThumbDistal, SocketName);
|
||||
}
|
||||
|
||||
bool FSGAssetUtils::FImpl::AddTouchIndexColliderSocket(
|
||||
@@ -526,7 +510,7 @@ bool FSGAssetUtils::FImpl::AddTouchIndexColliderSocket(
|
||||
const FSGVirtualHandTouchSettings TouchSettings{GetVirtualHandTouchSettings()};
|
||||
const FName& SocketName{TouchSettings.IndexColliderSocketName};
|
||||
return AddFingertipColliderSocket(SkeletalMeshEditor, SkeletalMesh,
|
||||
bRight, EHandKeypoint::IndexDistal, SocketName);
|
||||
bRight, EHandKeypoint::IndexDistal, SocketName);
|
||||
}
|
||||
|
||||
bool FSGAssetUtils::FImpl::AddTouchMiddleColliderSocket(
|
||||
@@ -535,7 +519,7 @@ bool FSGAssetUtils::FImpl::AddTouchMiddleColliderSocket(
|
||||
const FSGVirtualHandTouchSettings TouchSettings{GetVirtualHandTouchSettings()};
|
||||
const FName& SocketName{TouchSettings.MiddleColliderSocketName};
|
||||
return AddFingertipColliderSocket(SkeletalMeshEditor, SkeletalMesh,
|
||||
bRight, EHandKeypoint::MiddleDistal, SocketName);
|
||||
bRight, EHandKeypoint::MiddleDistal, SocketName);
|
||||
}
|
||||
|
||||
bool FSGAssetUtils::FImpl::AddTouchRingColliderSocket(
|
||||
@@ -544,7 +528,7 @@ bool FSGAssetUtils::FImpl::AddTouchRingColliderSocket(
|
||||
const FSGVirtualHandTouchSettings TouchSettings{GetVirtualHandTouchSettings()};
|
||||
const FName& SocketName{TouchSettings.RingColliderSocketName};
|
||||
return AddFingertipColliderSocket(SkeletalMeshEditor, SkeletalMesh,
|
||||
bRight, EHandKeypoint::RingDistal, SocketName);
|
||||
bRight, EHandKeypoint::RingDistal, SocketName);
|
||||
}
|
||||
|
||||
bool FSGAssetUtils::FImpl::AddTouchLittleColliderSocket(
|
||||
@@ -553,7 +537,7 @@ bool FSGAssetUtils::FImpl::AddTouchLittleColliderSocket(
|
||||
const FSGVirtualHandTouchSettings TouchSettings{GetVirtualHandTouchSettings()};
|
||||
const FName& SocketName{TouchSettings.PinkyColliderSocketName};
|
||||
return AddFingertipColliderSocket(SkeletalMeshEditor, SkeletalMesh,
|
||||
bRight, EHandKeypoint::LittleDistal, SocketName);
|
||||
bRight, EHandKeypoint::LittleDistal, SocketName);
|
||||
}
|
||||
|
||||
bool FSGAssetUtils::FImpl::AddSenseGloveSockets(const ISkeletalMeshEditor* SkeletalMeshEditor,
|
||||
@@ -651,7 +635,6 @@ bool FSGAssetUtils::FImpl::AddSenseGloveSockets(const ISkeletalMeshEditor* Skele
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
const bool TouchLittleCollider = AddTouchLittleColliderSocket(
|
||||
SkeletalMeshEditor, SkeletalMesh, bIsRight);
|
||||
if (!TouchLittleCollider)
|
||||
@@ -661,7 +644,6 @@ bool FSGAssetUtils::FImpl::AddSenseGloveSockets(const ISkeletalMeshEditor* Skele
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -786,7 +768,6 @@ bool FSGAssetUtils::FImpl::AddSenseGloveSockets(USkeletalMesh* SkeletalMesh, USk
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool FSGAssetUtils::FImpl::ClearExistingSockets(USkeletalMesh* SkeletalMesh, USkeleton* Skeleton)
|
||||
{
|
||||
if (!ensureAlwaysMsgf(IsValid(SkeletalMesh), TEXT("Invalid SkeletalMesh!")))
|
||||
|
||||
Reference in New Issue
Block a user