From 528243f8492d151e08e1ab6d819704415ad99b3b Mon Sep 17 00:00:00 2001 From: Mamadou Babaei Date: Thu, 6 Jun 2024 17:26:51 +0200 Subject: [PATCH] fix a bug where sgpawn hand's finger collider interact with the world when the hand is not mesh visible --- CHANGELOG.md | 1 + .../SenseGlove/GameFramework/SGPawn.cpp | 226 +++++++----------- 2 files changed, 84 insertions(+), 143 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a52c319..8d55a433 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ This is a minor release focusing mainly on bringing OpenXR-compatible hand track - Added FSGVirtualHandAnimInstanceProxy::GetMotionControllerData usable only by child classes. - USGVirtualHandComponent introduced new uproperties AnimationBoneRotationCorrectionOffset and bAnimationShouldApplyBoneLocation with their equivalent getters and setters. - Added USGVirtualHandComponent::GetMotionControllerData(). +- Added USGVirtualHandComponent::OnHandVisibilityChanged() event in order to notify other components/actors whenever the virtual hand mesh appears or disappears (for example, this could happen when a glove is connected/disconnected). - Added USGWristTrackerComponent::GetMotionControllerData(). - Added USGWristTrackerComponent::OnWristDeviceVisualTypeChanged event in order to be able to notify other components/actors whenever the wrist-tracking device switches between hand tracking or motion controllers. - Added the SenseGloveDebugKismet module in order to allow drawing of debugging gizmos and virtual hands from Blueprint. diff --git a/Source/SenseGlove/Private/SenseGlove/GameFramework/SGPawn.cpp b/Source/SenseGlove/Private/SenseGlove/GameFramework/SGPawn.cpp index d2738509..39ac3fbc 100644 --- a/Source/SenseGlove/Private/SenseGlove/GameFramework/SGPawn.cpp +++ b/Source/SenseGlove/Private/SenseGlove/GameFramework/SGPawn.cpp @@ -118,6 +118,9 @@ struct ASGPawn::FImpl void UpdateRightHandLocationAndRotation( const FVector& Location, const FRotator& Rotation, const bool bUpdateVirtualHand); + void SetFingerColliderCollisionEnabled(USphereComponent* Collider, bool bEnabled) const; + void SetAllFingersColliderCollisionEnabled(bool bRight, bool bEnabled) const; + FORCEINLINE void RegisterLeftHandOverlappedActor(const AActor* Actor) const { Owner->LeftHandOverlappedActors.AddUnique(Actor); @@ -254,15 +257,7 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer) LeftThumbFingertipGrabCollider->SetCanEverAffectNavigation(false); LeftThumbFingertipGrabCollider->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_Owner; LeftThumbFingertipGrabCollider->SetCollisionObjectType(ECC_Pawn); - LeftThumbFingertipGrabCollider->SetCollisionEnabled(ECollisionEnabled::QueryOnly); - LeftThumbFingertipGrabCollider->SetCollisionResponseToAllChannels(ECR_Overlap); - LeftThumbFingertipGrabCollider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap); - LeftThumbFingertipGrabCollider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap); - LeftThumbFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap); - LeftThumbFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap); - LeftThumbFingertipGrabCollider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap); - LeftThumbFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap); - LeftThumbFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap); + Pimpl->SetFingerColliderCollisionEnabled(LeftThumbFingertipGrabCollider, true); LeftIndexFingertipGrabCollider = ObjectInitializer.CreateDefaultSubobject( this, TEXT("LeftIndexFingertipGrabCollider")); @@ -274,15 +269,7 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer) LeftIndexFingertipGrabCollider->SetCanEverAffectNavigation(false); LeftIndexFingertipGrabCollider->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_Owner; LeftIndexFingertipGrabCollider->SetCollisionObjectType(ECC_Pawn); - LeftIndexFingertipGrabCollider->SetCollisionEnabled(ECollisionEnabled::QueryOnly); - LeftIndexFingertipGrabCollider->SetCollisionResponseToAllChannels(ECR_Overlap); - LeftIndexFingertipGrabCollider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap); - LeftIndexFingertipGrabCollider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap); - LeftIndexFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap); - LeftIndexFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap); - LeftIndexFingertipGrabCollider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap); - LeftIndexFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap); - LeftIndexFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap); + Pimpl->SetFingerColliderCollisionEnabled(LeftIndexFingertipGrabCollider, true); LeftMiddleFingertipGrabCollider = ObjectInitializer.CreateDefaultSubobject( this, TEXT("LeftMiddleFingertipGrabCollider")); @@ -294,15 +281,7 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer) LeftMiddleFingertipGrabCollider->SetCanEverAffectNavigation(false); LeftMiddleFingertipGrabCollider->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_Owner; LeftMiddleFingertipGrabCollider->SetCollisionObjectType(ECC_Pawn); - LeftMiddleFingertipGrabCollider->SetCollisionEnabled(ECollisionEnabled::QueryOnly); - LeftMiddleFingertipGrabCollider->SetCollisionResponseToAllChannels(ECR_Overlap); - LeftMiddleFingertipGrabCollider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap); - LeftMiddleFingertipGrabCollider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap); - LeftMiddleFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap); - LeftMiddleFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap); - LeftMiddleFingertipGrabCollider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap); - LeftMiddleFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap); - LeftMiddleFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap); + Pimpl->SetFingerColliderCollisionEnabled(LeftMiddleFingertipGrabCollider, true); LeftThumbFingertipTouchCollider = ObjectInitializer.CreateDefaultSubobject( this, TEXT("LeftThumbFingertipTouchCollider")); @@ -314,15 +293,7 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer) LeftThumbFingertipTouchCollider->SetCanEverAffectNavigation(false); LeftThumbFingertipTouchCollider->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_Owner; LeftThumbFingertipTouchCollider->SetCollisionObjectType(ECC_Pawn); - LeftThumbFingertipTouchCollider->SetCollisionEnabled(ECollisionEnabled::QueryOnly); - LeftThumbFingertipTouchCollider->SetCollisionResponseToAllChannels(ECR_Overlap); - LeftThumbFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap); - LeftThumbFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap); - LeftThumbFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap); - LeftThumbFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap); - LeftThumbFingertipTouchCollider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap); - LeftThumbFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap); - LeftThumbFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap); + Pimpl->SetFingerColliderCollisionEnabled(LeftThumbFingertipTouchCollider, true); LeftIndexFingertipTouchCollider = ObjectInitializer.CreateDefaultSubobject( this, TEXT("LeftIndexFingertipTouchCollider")); @@ -334,15 +305,7 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer) LeftIndexFingertipTouchCollider->SetCanEverAffectNavigation(false); LeftIndexFingertipTouchCollider->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_Owner; LeftIndexFingertipTouchCollider->SetCollisionObjectType(ECC_Pawn); - LeftIndexFingertipTouchCollider->SetCollisionEnabled(ECollisionEnabled::QueryOnly); - LeftIndexFingertipTouchCollider->SetCollisionResponseToAllChannels(ECR_Overlap); - LeftIndexFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap); - LeftIndexFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap); - LeftIndexFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap); - LeftIndexFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap); - LeftIndexFingertipTouchCollider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap); - LeftIndexFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap); - LeftIndexFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap); + Pimpl->SetFingerColliderCollisionEnabled(LeftIndexFingertipTouchCollider, true); LeftMiddleFingertipTouchCollider = ObjectInitializer.CreateDefaultSubobject( this, TEXT("LeftMiddleFingertipTouchCollider")); @@ -355,14 +318,7 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer) LeftMiddleFingertipTouchCollider->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_Owner; LeftMiddleFingertipTouchCollider->SetCollisionObjectType(ECC_Pawn); LeftMiddleFingertipTouchCollider->SetCollisionEnabled(ECollisionEnabled::QueryOnly); - LeftMiddleFingertipTouchCollider->SetCollisionResponseToAllChannels(ECR_Overlap); - LeftMiddleFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap); - LeftMiddleFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap); - LeftMiddleFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap); - LeftMiddleFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap); - LeftMiddleFingertipTouchCollider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap); - LeftMiddleFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap); - LeftMiddleFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap); + Pimpl->SetFingerColliderCollisionEnabled(LeftMiddleFingertipTouchCollider, true); LeftRingFingertipTouchCollider = ObjectInitializer.CreateDefaultSubobject( this, TEXT("LeftRingFingertipTouchCollider")); @@ -374,15 +330,7 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer) LeftRingFingertipTouchCollider->SetCanEverAffectNavigation(false); LeftRingFingertipTouchCollider->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_Owner; LeftRingFingertipTouchCollider->SetCollisionObjectType(ECC_Pawn); - LeftRingFingertipTouchCollider->SetCollisionEnabled(ECollisionEnabled::QueryOnly); - LeftRingFingertipTouchCollider->SetCollisionResponseToAllChannels(ECR_Overlap); - LeftRingFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap); - LeftRingFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap); - LeftRingFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap); - LeftRingFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap); - LeftRingFingertipTouchCollider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap); - LeftRingFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap); - LeftRingFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap); + Pimpl->SetFingerColliderCollisionEnabled(LeftRingFingertipTouchCollider, true); LeftPinkyFingertipTouchCollider = ObjectInitializer.CreateDefaultSubobject( this, TEXT("LeftPinkyFingertipTouchCollider")); @@ -394,15 +342,7 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer) LeftPinkyFingertipTouchCollider->SetCanEverAffectNavigation(false); LeftPinkyFingertipTouchCollider->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_Owner; LeftPinkyFingertipTouchCollider->SetCollisionObjectType(ECC_Pawn); - LeftPinkyFingertipTouchCollider->SetCollisionEnabled(ECollisionEnabled::QueryOnly); - LeftPinkyFingertipTouchCollider->SetCollisionResponseToAllChannels(ECR_Overlap); - LeftPinkyFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap); - LeftPinkyFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap); - LeftPinkyFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap); - LeftPinkyFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap); - LeftPinkyFingertipTouchCollider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap); - LeftPinkyFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap); - LeftPinkyFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap); + Pimpl->SetFingerColliderCollisionEnabled(LeftPinkyFingertipTouchCollider, true); WristTrackerRight = ObjectInitializer.CreateDefaultSubobject( this, TEXT("WristTrackerRight")); @@ -476,15 +416,7 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer) RightThumbFingertipGrabCollider->SetCanEverAffectNavigation(false); RightThumbFingertipGrabCollider->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_Owner; RightThumbFingertipGrabCollider->SetCollisionObjectType(ECC_Pawn); - RightThumbFingertipGrabCollider->SetCollisionEnabled(ECollisionEnabled::QueryOnly); - RightThumbFingertipGrabCollider->SetCollisionResponseToAllChannels(ECR_Overlap); - RightThumbFingertipGrabCollider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap); - RightThumbFingertipGrabCollider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap); - RightThumbFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap); - RightThumbFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap); - RightThumbFingertipGrabCollider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap); - RightThumbFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap); - RightThumbFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap); + Pimpl->SetFingerColliderCollisionEnabled(RightThumbFingertipGrabCollider, true); RightIndexFingertipGrabCollider = ObjectInitializer.CreateDefaultSubobject( this, TEXT("RightIndexFingertipGrabCollider")); @@ -496,15 +428,7 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer) RightIndexFingertipGrabCollider->SetCanEverAffectNavigation(false); RightIndexFingertipGrabCollider->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_Owner; RightIndexFingertipGrabCollider->SetCollisionObjectType(ECC_Pawn); - RightIndexFingertipGrabCollider->SetCollisionEnabled(ECollisionEnabled::QueryOnly); - RightIndexFingertipGrabCollider->SetCollisionResponseToAllChannels(ECR_Overlap); - RightIndexFingertipGrabCollider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap); - RightIndexFingertipGrabCollider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap); - RightIndexFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap); - RightIndexFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap); - RightIndexFingertipGrabCollider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap); - RightIndexFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap); - RightIndexFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap); + Pimpl->SetFingerColliderCollisionEnabled(RightIndexFingertipGrabCollider, true); RightMiddleFingertipGrabCollider = ObjectInitializer.CreateDefaultSubobject( this, TEXT("RightMiddleFingertipGrabCollider")); @@ -516,15 +440,7 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer) RightMiddleFingertipGrabCollider->SetCanEverAffectNavigation(false); RightMiddleFingertipGrabCollider->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_Owner; RightMiddleFingertipGrabCollider->SetCollisionObjectType(ECC_Pawn); - RightMiddleFingertipGrabCollider->SetCollisionEnabled(ECollisionEnabled::QueryOnly); - RightMiddleFingertipGrabCollider->SetCollisionResponseToAllChannels(ECR_Overlap); - RightMiddleFingertipGrabCollider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap); - RightMiddleFingertipGrabCollider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap); - RightMiddleFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap); - RightMiddleFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap); - RightMiddleFingertipGrabCollider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap); - RightMiddleFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap); - RightMiddleFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap); + Pimpl->SetFingerColliderCollisionEnabled(RightMiddleFingertipGrabCollider, true); RightThumbFingertipTouchCollider = ObjectInitializer.CreateDefaultSubobject( this, TEXT("RightThumbFingertipTouchCollider")); @@ -536,15 +452,7 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer) RightThumbFingertipTouchCollider->SetCanEverAffectNavigation(false); RightThumbFingertipTouchCollider->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_Owner; RightThumbFingertipTouchCollider->SetCollisionObjectType(ECC_Pawn); - RightThumbFingertipTouchCollider->SetCollisionEnabled(ECollisionEnabled::QueryOnly); - RightThumbFingertipTouchCollider->SetCollisionResponseToAllChannels(ECR_Overlap); - RightThumbFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap); - RightThumbFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap); - RightThumbFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap); - RightThumbFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap); - RightThumbFingertipTouchCollider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap); - RightThumbFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap); - RightThumbFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap); + Pimpl->SetFingerColliderCollisionEnabled(RightThumbFingertipTouchCollider, true); RightIndexFingertipTouchCollider = ObjectInitializer.CreateDefaultSubobject( this, TEXT("RightIndexFingertipTouchCollider")); @@ -556,15 +464,7 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer) RightIndexFingertipTouchCollider->SetCanEverAffectNavigation(false); RightIndexFingertipTouchCollider->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_Owner; RightIndexFingertipTouchCollider->SetCollisionObjectType(ECC_Pawn); - RightIndexFingertipTouchCollider->SetCollisionEnabled(ECollisionEnabled::QueryOnly); - RightIndexFingertipTouchCollider->SetCollisionResponseToAllChannels(ECR_Overlap); - RightIndexFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap); - RightIndexFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap); - RightIndexFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap); - RightIndexFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap); - RightIndexFingertipTouchCollider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap); - RightIndexFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap); - RightIndexFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap); + Pimpl->SetFingerColliderCollisionEnabled(RightIndexFingertipTouchCollider, true); RightMiddleFingertipTouchCollider = ObjectInitializer.CreateDefaultSubobject( this, TEXT("RightMiddleFingertipTouchCollider")); @@ -576,15 +476,7 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer) RightMiddleFingertipTouchCollider->SetCanEverAffectNavigation(false); RightMiddleFingertipTouchCollider->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_Owner; RightMiddleFingertipTouchCollider->SetCollisionObjectType(ECC_Pawn); - RightMiddleFingertipTouchCollider->SetCollisionEnabled(ECollisionEnabled::QueryOnly); - RightMiddleFingertipTouchCollider->SetCollisionResponseToAllChannels(ECR_Overlap); - RightMiddleFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap); - RightMiddleFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap); - RightMiddleFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap); - RightMiddleFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap); - RightMiddleFingertipTouchCollider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap); - RightMiddleFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap); - RightMiddleFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap); + Pimpl->SetFingerColliderCollisionEnabled(RightMiddleFingertipTouchCollider, true); RightRingFingertipTouchCollider = ObjectInitializer.CreateDefaultSubobject( this, TEXT("RightRingFingertipTouchCollider")); @@ -596,15 +488,7 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer) RightRingFingertipTouchCollider->SetCanEverAffectNavigation(false); RightRingFingertipTouchCollider->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_Owner; RightRingFingertipTouchCollider->SetCollisionObjectType(ECC_Pawn); - RightRingFingertipTouchCollider->SetCollisionEnabled(ECollisionEnabled::QueryOnly); - RightRingFingertipTouchCollider->SetCollisionResponseToAllChannels(ECR_Overlap); - RightRingFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap); - RightRingFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap); - RightRingFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap); - RightRingFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap); - RightRingFingertipTouchCollider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap); - RightRingFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap); - RightRingFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap); + Pimpl->SetFingerColliderCollisionEnabled(RightRingFingertipTouchCollider, true); RightPinkyFingertipTouchCollider = ObjectInitializer.CreateDefaultSubobject( this, TEXT("RightPinkyFingertipTouchCollider")); @@ -616,15 +500,7 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer) RightPinkyFingertipTouchCollider->SetCanEverAffectNavigation(false); RightPinkyFingertipTouchCollider->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_Owner; RightPinkyFingertipTouchCollider->SetCollisionObjectType(ECC_Pawn); - RightPinkyFingertipTouchCollider->SetCollisionEnabled(ECollisionEnabled::QueryOnly); - RightPinkyFingertipTouchCollider->SetCollisionResponseToAllChannels(ECR_Overlap); - RightPinkyFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap); - RightPinkyFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap); - RightPinkyFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap); - RightPinkyFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap); - RightPinkyFingertipTouchCollider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap); - RightPinkyFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap); - RightPinkyFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap); + Pimpl->SetFingerColliderCollisionEnabled(RightPinkyFingertipTouchCollider, true); MaxNumberOfHandVelocitySamples = 10; @@ -702,6 +578,16 @@ void ASGPawn::BeginPlay() Pimpl->UpdateRightHandRotation(Rotation, !Pimpl->IsRightHandOverlappingWithAnyActor()); }); + HandLeft->OnHandVisibilityChanged().AddWeakLambda(this, [&](const bool bNewVisibility)-> void + { + Pimpl->SetAllFingersColliderCollisionEnabled(false, bNewVisibility); + }); + + HandRight->OnHandVisibilityChanged().AddWeakLambda(this, [&](const bool bNewVisibility)-> void + { + Pimpl->SetAllFingersColliderCollisionEnabled(true, bNewVisibility); + }); + Pimpl->BindRealHandsOverlapEvents(); Pimpl->BindFingerGrabOverlapEvents(); @@ -1904,6 +1790,60 @@ void ASGPawn::FImpl::UpdateRightHandLocationAndRotation( UpdateRightHandRotation(Rotation, bUpdateVirtualHand); } +void ASGPawn::FImpl::SetFingerColliderCollisionEnabled(USphereComponent* Collider, const bool bEnabled) const +{ + if (!ensureAlwaysMsgf(IsValid(Collider), TEXT("Invalid collider object!"))) + { + return; + } + + if (bEnabled) + { + Collider->SetGenerateOverlapEvents(true); + Collider->SetCollisionEnabled(ECollisionEnabled::QueryOnly); + Collider->SetCollisionResponseToAllChannels(ECR_Overlap); + Collider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap); + Collider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap); + Collider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap); + Collider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap); + Collider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap); + Collider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap); + Collider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap); + } + else + { + Collider->SetGenerateOverlapEvents(false); + Collider->SetCollisionEnabled(ECollisionEnabled::NoCollision); + Collider->SetCollisionResponseToAllChannels(ECR_Ignore); + } +} + +void ASGPawn::FImpl::SetAllFingersColliderCollisionEnabled(const bool bRight, const bool bEnabled) const +{ + if (bRight) + { + SetFingerColliderCollisionEnabled(Owner->RightThumbFingertipGrabCollider, bEnabled); + SetFingerColliderCollisionEnabled(Owner->RightThumbFingertipTouchCollider, bEnabled); + SetFingerColliderCollisionEnabled(Owner->RightIndexFingertipGrabCollider, bEnabled); + SetFingerColliderCollisionEnabled(Owner->RightIndexFingertipTouchCollider, bEnabled); + SetFingerColliderCollisionEnabled(Owner->RightMiddleFingertipGrabCollider, bEnabled); + SetFingerColliderCollisionEnabled(Owner->RightMiddleFingertipTouchCollider, bEnabled); + SetFingerColliderCollisionEnabled(Owner->RightRingFingertipTouchCollider, bEnabled); + SetFingerColliderCollisionEnabled(Owner->RightPinkyFingertipTouchCollider, bEnabled); + } + else + { + SetFingerColliderCollisionEnabled(Owner->LeftThumbFingertipGrabCollider, bEnabled); + SetFingerColliderCollisionEnabled(Owner->LeftThumbFingertipTouchCollider, bEnabled); + SetFingerColliderCollisionEnabled(Owner->LeftIndexFingertipGrabCollider, bEnabled); + SetFingerColliderCollisionEnabled(Owner->LeftIndexFingertipTouchCollider, bEnabled); + SetFingerColliderCollisionEnabled(Owner->LeftMiddleFingertipGrabCollider, bEnabled); + SetFingerColliderCollisionEnabled(Owner->LeftMiddleFingertipTouchCollider, bEnabled); + SetFingerColliderCollisionEnabled(Owner->LeftRingFingertipTouchCollider, bEnabled); + SetFingerColliderCollisionEnabled(Owner->LeftPinkyFingertipTouchCollider, bEnabled); + } +} + void ASGPawn::FImpl::DisableActorPhysics(const AActor* Actor) const { UPrimitiveComponent* ActorRootComponent{Cast(Actor->GetRootComponent())};