From 9f8d5afca3eea4d23aafb5bb6faf87c851603f8d Mon Sep 17 00:00:00 2001 From: Mamadou Babaei Date: Mon, 8 Jul 2024 19:55:24 +0200 Subject: [PATCH] do not reigger OnGrabStateUpdated and OnTouchStateUpdated at all when the hand mesh is not valid or visible and also some other extra measures to make sure even if they are triggered they won't affect anything --- CHANGELOG.md | 2 +- .../Components/SGVirtualHandComponent.cpp | 6 +- .../SenseGlove/GameFramework/SGPawn.cpp | 591 ++++++++++++++---- .../GameFramework/SGPlayerController.cpp | 52 +- 4 files changed, 519 insertions(+), 132 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7cbf25dc..269879d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,7 +34,7 @@ This is a minor release focusing mainly on bringing OpenXR-compatible hand track ### Fixed -- Fixed a bug when the virtual hand inside the game is not visible but still have collisions with other objects inside the scene. +- Fixed a bug when the virtual hand inside the game is not visible but still collides with other objects inside the scene, mistakenly triggering events like OnGrabStateUpdated and OnTouchStateUpdated. - Fix various wrong Kismet script names and their class exports. ### Changed diff --git a/Source/SenseGlove/Private/SenseGlove/Components/SGVirtualHandComponent.cpp b/Source/SenseGlove/Private/SenseGlove/Components/SGVirtualHandComponent.cpp index f1d78b9b..c62fbe47 100644 --- a/Source/SenseGlove/Private/SenseGlove/Components/SGVirtualHandComponent.cpp +++ b/Source/SenseGlove/Private/SenseGlove/Components/SGVirtualHandComponent.cpp @@ -616,14 +616,14 @@ void USGVirtualHandComponent::FImpl::UpdateVisibility() bGotMotionControllerData && MotionControllerData.bValid && MotionControllerData.DeviceVisualType == EXRVisualType::Hand; - const bool bIsHandVisible = Owner->GetVisibleFlag(); + const bool bHandVisible = Owner->IsVisible(); const bool bShouldBeVisibleWhenHandDataUnavailable = Owner->IsVisibleWhenHandDataUnavailable(); bool bSetNewVisibility = false; if (bHandDataAvailable) { - if (bIsHandVisible) + if (bHandVisible) { bSetNewVisibility = false; } @@ -634,7 +634,7 @@ void USGVirtualHandComponent::FImpl::UpdateVisibility() } else { - if (bIsHandVisible) + if (bHandVisible) { if (bShouldBeVisibleWhenHandDataUnavailable) { diff --git a/Source/SenseGlove/Private/SenseGlove/GameFramework/SGPawn.cpp b/Source/SenseGlove/Private/SenseGlove/GameFramework/SGPawn.cpp index 8351f3f3..4208fe92 100644 --- a/Source/SenseGlove/Private/SenseGlove/GameFramework/SGPawn.cpp +++ b/Source/SenseGlove/Private/SenseGlove/GameFramework/SGPawn.cpp @@ -725,11 +725,24 @@ void ASGPawn::OnLeftThumbFingertipGrabColliderOverlapBegins( (void) bFromSweep; (void) SweepResult; - if (USGGrabComponent::IsGrabbable(OtherActor)) + if (!IsValid(LeftHandGrabState.Hand)) { - LeftHandGrabState.ActorThumbCanGrab = OtherActor; - Pimpl->TriggerGrabStateUpdatedEvent(LeftHandGrabState); + return; } + + const bool bHandVisible = LeftHandGrabState.Hand->IsVisible(); + if (!bHandVisible) + { + return; + } + + if (!USGGrabComponent::IsGrabbable(OtherActor)) + { + return; + } + + LeftHandGrabState.ActorThumbCanGrab = OtherActor; + Pimpl->TriggerGrabStateUpdatedEvent(LeftHandGrabState); } void ASGPawn::OnLeftThumbFingertipGrabColliderOverlapEnds( @@ -742,11 +755,18 @@ void ASGPawn::OnLeftThumbFingertipGrabColliderOverlapEnds( (void) OtherComp; (void) OtherBodyIndex; - if (LeftHandGrabState.ActorThumbCanGrab == OtherActor) + if (!IsValid(LeftHandGrabState.Hand)) { - LeftHandGrabState.ActorThumbCanGrab = nullptr; - Pimpl->TriggerGrabStateUpdatedEvent(LeftHandGrabState); + return; } + + if (LeftHandGrabState.ActorThumbCanGrab != OtherActor) + { + return; + } + + LeftHandGrabState.ActorThumbCanGrab = nullptr; + Pimpl->TriggerGrabStateUpdatedEvent(LeftHandGrabState); } void ASGPawn::OnLeftIndexFingertipGrabColliderOverlapBegins( @@ -763,11 +783,24 @@ void ASGPawn::OnLeftIndexFingertipGrabColliderOverlapBegins( (void) bFromSweep; (void) SweepResult; - if (USGGrabComponent::IsGrabbable(OtherActor)) + if (!IsValid(LeftHandGrabState.Hand)) { - LeftHandGrabState.ActorIndexCanGrab = OtherActor; - Pimpl->TriggerGrabStateUpdatedEvent(LeftHandGrabState); + return; } + + const bool bHandVisible = LeftHandGrabState.Hand->IsVisible(); + if (!bHandVisible) + { + return; + } + + if (!USGGrabComponent::IsGrabbable(OtherActor)) + { + return; + } + + LeftHandGrabState.ActorIndexCanGrab = OtherActor; + Pimpl->TriggerGrabStateUpdatedEvent(LeftHandGrabState); } void ASGPawn::OnLeftIndexFingertipGrabColliderOverlapEnds( @@ -780,11 +813,18 @@ void ASGPawn::OnLeftIndexFingertipGrabColliderOverlapEnds( (void) OtherComp; (void) OtherBodyIndex; - if (LeftHandGrabState.ActorIndexCanGrab == OtherActor) + if (!IsValid(LeftHandGrabState.Hand)) { - LeftHandGrabState.ActorIndexCanGrab = nullptr; - Pimpl->TriggerGrabStateUpdatedEvent(LeftHandGrabState); + return; } + + if (LeftHandGrabState.ActorIndexCanGrab != OtherActor) + { + return; + } + + LeftHandGrabState.ActorIndexCanGrab = nullptr; + Pimpl->TriggerGrabStateUpdatedEvent(LeftHandGrabState); } void ASGPawn::OnLeftMiddleFingertipGrabColliderOverlapBegins( @@ -801,11 +841,24 @@ void ASGPawn::OnLeftMiddleFingertipGrabColliderOverlapBegins( (void) bFromSweep; (void) SweepResult; - if (USGGrabComponent::IsGrabbable(OtherActor)) + if (!IsValid(LeftHandGrabState.Hand)) { - LeftHandGrabState.ActorMiddleCanGrab = OtherActor; - Pimpl->TriggerGrabStateUpdatedEvent(LeftHandGrabState); + return; } + + const bool bHandVisible = LeftHandGrabState.Hand->IsVisible(); + if (!bHandVisible) + { + return; + } + + if (!USGGrabComponent::IsGrabbable(OtherActor)) + { + return; + } + + LeftHandGrabState.ActorMiddleCanGrab = OtherActor; + Pimpl->TriggerGrabStateUpdatedEvent(LeftHandGrabState); } void ASGPawn::OnLeftMiddleFingertipGrabColliderOverlapEnds( @@ -818,11 +871,18 @@ void ASGPawn::OnLeftMiddleFingertipGrabColliderOverlapEnds( (void) OtherComp; (void) OtherBodyIndex; - if (LeftHandGrabState.ActorMiddleCanGrab == OtherActor) + if (!IsValid(LeftHandGrabState.Hand)) { - LeftHandGrabState.ActorMiddleCanGrab = nullptr; - Pimpl->TriggerGrabStateUpdatedEvent(LeftHandGrabState); + return; } + + if (LeftHandGrabState.ActorMiddleCanGrab != OtherActor) + { + return; + } + + LeftHandGrabState.ActorMiddleCanGrab = nullptr; + Pimpl->TriggerGrabStateUpdatedEvent(LeftHandGrabState); } void ASGPawn::OnLeftThumbFingertipTouchColliderOverlapBegins( @@ -839,12 +899,25 @@ void ASGPawn::OnLeftThumbFingertipTouchColliderOverlapBegins( (void) bFromSweep; (void) SweepResult; - if (USGTouchComponent::IsTouchable(OtherActor)) + if (!IsValid(LeftHandTouchState.Hand)) { - LeftHandTouchState.ActorThumbTouching = OtherActor; - Pimpl->TriggerTouchStateUpdatedEvent(LeftHandTouchState); - Pimpl->TriggerBeginTouch(LeftHandTouchState.Hand, OtherActor); + return; } + + const bool bHandVisible = LeftHandTouchState.Hand->IsVisible(); + if (!bHandVisible) + { + return; + } + + if (!USGTouchComponent::IsTouchable(OtherActor)) + { + return; + } + + LeftHandTouchState.ActorThumbTouching = OtherActor; + Pimpl->TriggerTouchStateUpdatedEvent(LeftHandTouchState); + Pimpl->TriggerBeginTouch(LeftHandTouchState.Hand, OtherActor); } void ASGPawn::OnLeftThumbFingertipTouchColliderOverlapEnds( @@ -857,12 +930,19 @@ void ASGPawn::OnLeftThumbFingertipTouchColliderOverlapEnds( (void) OtherComp; (void) OtherBodyIndex; - if (LeftHandTouchState.ActorThumbTouching == OtherActor) + if (!IsValid(LeftHandTouchState.Hand)) { - LeftHandTouchState.ActorThumbTouching = nullptr; - Pimpl->TriggerTouchStateUpdatedEvent(LeftHandTouchState); - Pimpl->TriggerEndTouch(LeftHandTouchState.Hand, OtherActor); + return; } + + if (LeftHandTouchState.ActorThumbTouching != OtherActor) + { + return; + } + + LeftHandTouchState.ActorThumbTouching = nullptr; + Pimpl->TriggerTouchStateUpdatedEvent(LeftHandTouchState); + Pimpl->TriggerEndTouch(LeftHandTouchState.Hand, OtherActor); } void ASGPawn::OnLeftIndexFingertipTouchColliderOverlapBegins( @@ -879,12 +959,25 @@ void ASGPawn::OnLeftIndexFingertipTouchColliderOverlapBegins( (void) bFromSweep; (void) SweepResult; - if (USGTouchComponent::IsTouchable(OtherActor)) + if (!IsValid(LeftHandTouchState.Hand)) { - LeftHandTouchState.ActorIndexTouching = OtherActor; - Pimpl->TriggerTouchStateUpdatedEvent(LeftHandTouchState); - Pimpl->TriggerBeginTouch(LeftHandTouchState.Hand, OtherActor); + return; } + + const bool bHandVisible = LeftHandTouchState.Hand->IsVisible(); + if (!bHandVisible) + { + return; + } + + if (!USGTouchComponent::IsTouchable(OtherActor)) + { + return; + } + + LeftHandTouchState.ActorIndexTouching = OtherActor; + Pimpl->TriggerTouchStateUpdatedEvent(LeftHandTouchState); + Pimpl->TriggerBeginTouch(LeftHandTouchState.Hand, OtherActor); } void ASGPawn::OnLeftIndexFingertipTouchColliderOverlapEnds( @@ -897,12 +990,19 @@ void ASGPawn::OnLeftIndexFingertipTouchColliderOverlapEnds( (void) OtherComp; (void) OtherBodyIndex; - if (LeftHandTouchState.ActorIndexTouching == OtherActor) + if (!IsValid(LeftHandTouchState.Hand)) { - LeftHandTouchState.ActorIndexTouching = nullptr; - Pimpl->TriggerTouchStateUpdatedEvent(LeftHandTouchState); - Pimpl->TriggerEndTouch(LeftHandTouchState.Hand, OtherActor); + return; } + + if (LeftHandTouchState.ActorIndexTouching != OtherActor) + { + return; + } + + LeftHandTouchState.ActorIndexTouching = nullptr; + Pimpl->TriggerTouchStateUpdatedEvent(LeftHandTouchState); + Pimpl->TriggerEndTouch(LeftHandTouchState.Hand, OtherActor); } void ASGPawn::OnLeftMiddleFingertipTouchColliderOverlapBegins( @@ -919,12 +1019,25 @@ void ASGPawn::OnLeftMiddleFingertipTouchColliderOverlapBegins( (void) bFromSweep; (void) SweepResult; - if (USGTouchComponent::IsTouchable(OtherActor)) + if (!IsValid(LeftHandTouchState.Hand)) { - LeftHandTouchState.ActorMiddleTouching = OtherActor; - Pimpl->TriggerTouchStateUpdatedEvent(LeftHandTouchState); - Pimpl->TriggerBeginTouch(LeftHandTouchState.Hand, OtherActor); + return; } + + const bool bHandVisible = LeftHandTouchState.Hand->IsVisible(); + if (!bHandVisible) + { + return; + } + + if (!USGTouchComponent::IsTouchable(OtherActor)) + { + return; + } + + LeftHandTouchState.ActorMiddleTouching = OtherActor; + Pimpl->TriggerTouchStateUpdatedEvent(LeftHandTouchState); + Pimpl->TriggerBeginTouch(LeftHandTouchState.Hand, OtherActor); } void ASGPawn::OnLeftMiddleFingertipTouchColliderOverlapEnds( @@ -937,12 +1050,19 @@ void ASGPawn::OnLeftMiddleFingertipTouchColliderOverlapEnds( (void) OtherComp; (void) OtherBodyIndex; - if (LeftHandTouchState.ActorMiddleTouching == OtherActor) + if (!IsValid(LeftHandTouchState.Hand)) { - LeftHandTouchState.ActorMiddleTouching = nullptr; - Pimpl->TriggerTouchStateUpdatedEvent(LeftHandTouchState); - Pimpl->TriggerEndTouch(LeftHandTouchState.Hand, OtherActor); + return; } + + if (LeftHandTouchState.ActorMiddleTouching != OtherActor) + { + return; + } + + LeftHandTouchState.ActorMiddleTouching = nullptr; + Pimpl->TriggerTouchStateUpdatedEvent(LeftHandTouchState); + Pimpl->TriggerEndTouch(LeftHandTouchState.Hand, OtherActor); } void ASGPawn::OnLeftRingFingertipTouchColliderOverlapBegins( @@ -959,12 +1079,25 @@ void ASGPawn::OnLeftRingFingertipTouchColliderOverlapBegins( (void) bFromSweep; (void) SweepResult; - if (USGTouchComponent::IsTouchable(OtherActor)) + if (!IsValid(LeftHandTouchState.Hand)) { - LeftHandTouchState.ActorRingTouching = OtherActor; - Pimpl->TriggerTouchStateUpdatedEvent(LeftHandTouchState); - Pimpl->TriggerBeginTouch(LeftHandTouchState.Hand, OtherActor); + return; } + + const bool bHandVisible = LeftHandTouchState.Hand->IsVisible(); + if (!bHandVisible) + { + return; + } + + if (!USGTouchComponent::IsTouchable(OtherActor)) + { + return; + } + + LeftHandTouchState.ActorRingTouching = OtherActor; + Pimpl->TriggerTouchStateUpdatedEvent(LeftHandTouchState); + Pimpl->TriggerBeginTouch(LeftHandTouchState.Hand, OtherActor); } void ASGPawn::OnLeftRingFingertipTouchColliderOverlapEnds( @@ -977,12 +1110,19 @@ void ASGPawn::OnLeftRingFingertipTouchColliderOverlapEnds( (void) OtherComp; (void) OtherBodyIndex; - if (LeftHandTouchState.ActorRingTouching == OtherActor) + if (!IsValid(LeftHandTouchState.Hand)) { - LeftHandTouchState.ActorRingTouching = nullptr; - Pimpl->TriggerTouchStateUpdatedEvent(LeftHandTouchState); - Pimpl->TriggerEndTouch(LeftHandTouchState.Hand, OtherActor); + return; } + + if (LeftHandTouchState.ActorRingTouching != OtherActor) + { + return; + } + + LeftHandTouchState.ActorRingTouching = nullptr; + Pimpl->TriggerTouchStateUpdatedEvent(LeftHandTouchState); + Pimpl->TriggerEndTouch(LeftHandTouchState.Hand, OtherActor); } void ASGPawn::OnLeftPinkyFingertipTouchColliderOverlapBegins( @@ -999,12 +1139,25 @@ void ASGPawn::OnLeftPinkyFingertipTouchColliderOverlapBegins( (void) bFromSweep; (void) SweepResult; - if (USGTouchComponent::IsTouchable(OtherActor)) + if (!IsValid(LeftHandTouchState.Hand)) { - LeftHandTouchState.ActorPinkyTouching = OtherActor; - Pimpl->TriggerTouchStateUpdatedEvent(LeftHandTouchState); - Pimpl->TriggerBeginTouch(LeftHandTouchState.Hand, OtherActor); + return; } + + const bool bHandVisible = LeftHandTouchState.Hand->IsVisible(); + if (!bHandVisible) + { + return; + } + + if (!USGTouchComponent::IsTouchable(OtherActor)) + { + return; + } + + LeftHandTouchState.ActorPinkyTouching = OtherActor; + Pimpl->TriggerTouchStateUpdatedEvent(LeftHandTouchState); + Pimpl->TriggerBeginTouch(LeftHandTouchState.Hand, OtherActor); } void ASGPawn::OnLeftPinkyFingertipTouchColliderOverlapEnds( @@ -1017,12 +1170,19 @@ void ASGPawn::OnLeftPinkyFingertipTouchColliderOverlapEnds( (void) OtherComp; (void) OtherBodyIndex; - if (LeftHandTouchState.ActorPinkyTouching == OtherActor) + if (!IsValid(LeftHandTouchState.Hand)) { - LeftHandTouchState.ActorPinkyTouching = nullptr; - Pimpl->TriggerTouchStateUpdatedEvent(LeftHandTouchState); - Pimpl->TriggerEndTouch(LeftHandTouchState.Hand, OtherActor); + return; } + + if (LeftHandTouchState.ActorPinkyTouching != OtherActor) + { + return; + } + + LeftHandTouchState.ActorPinkyTouching = nullptr; + Pimpl->TriggerTouchStateUpdatedEvent(LeftHandTouchState); + Pimpl->TriggerEndTouch(LeftHandTouchState.Hand, OtherActor); } void ASGPawn::OnRightThumbFingertipGrabColliderOverlapBegins( @@ -1039,11 +1199,24 @@ void ASGPawn::OnRightThumbFingertipGrabColliderOverlapBegins( (void) bFromSweep; (void) SweepResult; - if (USGGrabComponent::IsGrabbable(OtherActor)) + if (!IsValid(RightHandGrabState.Hand)) { - RightHandGrabState.ActorThumbCanGrab = OtherActor; - Pimpl->TriggerGrabStateUpdatedEvent(RightHandGrabState); + return; } + + const bool bHandVisible = RightHandGrabState.Hand->IsVisible(); + if (!bHandVisible) + { + return; + } + + if (!USGGrabComponent::IsGrabbable(OtherActor)) + { + return; + } + + RightHandGrabState.ActorThumbCanGrab = OtherActor; + Pimpl->TriggerGrabStateUpdatedEvent(RightHandGrabState); } void ASGPawn::OnRightThumbFingertipGrabColliderOverlapEnds( @@ -1056,11 +1229,18 @@ void ASGPawn::OnRightThumbFingertipGrabColliderOverlapEnds( (void) OtherComp; (void) OtherBodyIndex; - if (RightHandGrabState.ActorThumbCanGrab == OtherActor) + if (!IsValid(RightHandGrabState.Hand)) { - RightHandGrabState.ActorThumbCanGrab = nullptr; - Pimpl->TriggerGrabStateUpdatedEvent(RightHandGrabState); + return; } + + if (RightHandGrabState.ActorThumbCanGrab != OtherActor) + { + return; + } + + RightHandGrabState.ActorThumbCanGrab = nullptr; + Pimpl->TriggerGrabStateUpdatedEvent(RightHandGrabState); } void ASGPawn::OnRightIndexFingertipGrabColliderOverlapBegins( @@ -1077,11 +1257,24 @@ void ASGPawn::OnRightIndexFingertipGrabColliderOverlapBegins( (void) bFromSweep; (void) SweepResult; - if (USGGrabComponent::IsGrabbable(OtherActor)) + if (!IsValid(RightHandGrabState.Hand)) { - RightHandGrabState.ActorIndexCanGrab = OtherActor; - Pimpl->TriggerGrabStateUpdatedEvent(RightHandGrabState); + return; } + + const bool bHandVisible = RightHandGrabState.Hand->IsVisible(); + if (!bHandVisible) + { + return; + } + + if (!USGGrabComponent::IsGrabbable(OtherActor)) + { + return; + } + + RightHandGrabState.ActorIndexCanGrab = OtherActor; + Pimpl->TriggerGrabStateUpdatedEvent(RightHandGrabState); } void ASGPawn::OnRightIndexFingertipGrabColliderOverlapEnds( @@ -1094,11 +1287,18 @@ void ASGPawn::OnRightIndexFingertipGrabColliderOverlapEnds( (void) OtherComp; (void) OtherBodyIndex; - if (RightHandGrabState.ActorThumbCanGrab == OtherActor) + if (!IsValid(RightHandGrabState.Hand)) { - RightHandGrabState.ActorIndexCanGrab = nullptr; - Pimpl->TriggerGrabStateUpdatedEvent(RightHandGrabState); + return; } + + if (RightHandGrabState.ActorThumbCanGrab != OtherActor) + { + return; + } + + RightHandGrabState.ActorIndexCanGrab = nullptr; + Pimpl->TriggerGrabStateUpdatedEvent(RightHandGrabState); } void ASGPawn::OnRightMiddleFingertipGrabColliderOverlapBegins( @@ -1115,11 +1315,24 @@ void ASGPawn::OnRightMiddleFingertipGrabColliderOverlapBegins( (void) bFromSweep; (void) SweepResult; - if (USGGrabComponent::IsGrabbable(OtherActor)) + if (!IsValid(RightHandGrabState.Hand)) { - RightHandGrabState.ActorMiddleCanGrab = OtherActor; - Pimpl->TriggerGrabStateUpdatedEvent(RightHandGrabState); + return; } + + const bool bHandVisible = RightHandGrabState.Hand->IsVisible(); + if (!bHandVisible) + { + return; + } + + if (!USGGrabComponent::IsGrabbable(OtherActor)) + { + return; + } + + RightHandGrabState.ActorMiddleCanGrab = OtherActor; + Pimpl->TriggerGrabStateUpdatedEvent(RightHandGrabState); } void ASGPawn::OnRightMiddleFingertipGrabColliderOverlapEnds( @@ -1132,11 +1345,18 @@ void ASGPawn::OnRightMiddleFingertipGrabColliderOverlapEnds( (void) OtherComp; (void) OtherBodyIndex; - if (RightHandGrabState.ActorMiddleCanGrab == OtherActor) + if (!IsValid(RightHandGrabState.Hand)) { - RightHandGrabState.ActorMiddleCanGrab = nullptr; - Pimpl->TriggerGrabStateUpdatedEvent(RightHandGrabState); + return; } + + if (RightHandGrabState.ActorMiddleCanGrab != OtherActor) + { + return; + } + + RightHandGrabState.ActorMiddleCanGrab = nullptr; + Pimpl->TriggerGrabStateUpdatedEvent(RightHandGrabState); } void ASGPawn::OnRightThumbFingertipTouchColliderOverlapBegins( @@ -1153,12 +1373,25 @@ void ASGPawn::OnRightThumbFingertipTouchColliderOverlapBegins( (void) bFromSweep; (void) SweepResult; - if (USGTouchComponent::IsTouchable(OtherActor)) + if (!IsValid(RightHandTouchState.Hand)) { - RightHandTouchState.ActorThumbTouching = OtherActor; - Pimpl->TriggerTouchStateUpdatedEvent(RightHandTouchState); - Pimpl->TriggerBeginTouch(RightHandTouchState.Hand, OtherActor); + return; } + + const bool bHandVisible = RightHandTouchState.Hand->IsVisible(); + if (!bHandVisible) + { + return; + } + + if (!USGTouchComponent::IsTouchable(OtherActor)) + { + return; + } + + RightHandTouchState.ActorThumbTouching = OtherActor; + Pimpl->TriggerTouchStateUpdatedEvent(RightHandTouchState); + Pimpl->TriggerBeginTouch(RightHandTouchState.Hand, OtherActor); } void ASGPawn::OnRightThumbFingertipTouchColliderOverlapEnds( @@ -1171,12 +1404,19 @@ void ASGPawn::OnRightThumbFingertipTouchColliderOverlapEnds( (void) OtherComp; (void) OtherBodyIndex; - if (RightHandTouchState.ActorThumbTouching == OtherActor) + if (!IsValid(RightHandTouchState.Hand)) { - RightHandTouchState.ActorThumbTouching = nullptr; - Pimpl->TriggerTouchStateUpdatedEvent(RightHandTouchState); - Pimpl->TriggerEndTouch(RightHandTouchState.Hand, OtherActor); + return; } + + if (RightHandTouchState.ActorThumbTouching != OtherActor) + { + return; + } + + RightHandTouchState.ActorThumbTouching = nullptr; + Pimpl->TriggerTouchStateUpdatedEvent(RightHandTouchState); + Pimpl->TriggerEndTouch(RightHandTouchState.Hand, OtherActor); } void ASGPawn::OnRightIndexFingertipTouchColliderOverlapBegins( @@ -1193,12 +1433,25 @@ void ASGPawn::OnRightIndexFingertipTouchColliderOverlapBegins( (void) bFromSweep; (void) SweepResult; - if (USGTouchComponent::IsTouchable(OtherActor)) + if (!IsValid(RightHandTouchState.Hand)) { - RightHandTouchState.ActorIndexTouching = OtherActor; - Pimpl->TriggerTouchStateUpdatedEvent(RightHandTouchState); - Pimpl->TriggerBeginTouch(RightHandTouchState.Hand, OtherActor); + return; } + + const bool bHandVisible = RightHandTouchState.Hand->IsVisible(); + if (!bHandVisible) + { + return; + } + + if (!USGTouchComponent::IsTouchable(OtherActor)) + { + return; + } + + RightHandTouchState.ActorIndexTouching = OtherActor; + Pimpl->TriggerTouchStateUpdatedEvent(RightHandTouchState); + Pimpl->TriggerBeginTouch(RightHandTouchState.Hand, OtherActor); } void ASGPawn::OnRightIndexFingertipTouchColliderOverlapEnds( @@ -1211,12 +1464,19 @@ void ASGPawn::OnRightIndexFingertipTouchColliderOverlapEnds( (void) OtherComp; (void) OtherBodyIndex; - if (RightHandTouchState.ActorIndexTouching == OtherActor) + if (!IsValid(RightHandTouchState.Hand)) { - RightHandTouchState.ActorIndexTouching = nullptr; - Pimpl->TriggerTouchStateUpdatedEvent(RightHandTouchState); - Pimpl->TriggerEndTouch(RightHandTouchState.Hand, OtherActor); + return; } + + if (RightHandTouchState.ActorIndexTouching != OtherActor) + { + return; + } + + RightHandTouchState.ActorIndexTouching = nullptr; + Pimpl->TriggerTouchStateUpdatedEvent(RightHandTouchState); + Pimpl->TriggerEndTouch(RightHandTouchState.Hand, OtherActor); } void ASGPawn::OnRightMiddleFingertipTouchColliderOverlapBegins( @@ -1233,12 +1493,25 @@ void ASGPawn::OnRightMiddleFingertipTouchColliderOverlapBegins( (void) bFromSweep; (void) SweepResult; - if (USGTouchComponent::IsTouchable(OtherActor)) + if (!IsValid(RightHandTouchState.Hand)) { - RightHandTouchState.ActorMiddleTouching = OtherActor; - Pimpl->TriggerTouchStateUpdatedEvent(RightHandTouchState); - Pimpl->TriggerBeginTouch(RightHandTouchState.Hand, OtherActor); + return; } + + const bool bHandVisible = RightHandTouchState.Hand->IsVisible(); + if (!bHandVisible) + { + return; + } + + if (!USGTouchComponent::IsTouchable(OtherActor)) + { + return; + } + + RightHandTouchState.ActorMiddleTouching = OtherActor; + Pimpl->TriggerTouchStateUpdatedEvent(RightHandTouchState); + Pimpl->TriggerBeginTouch(RightHandTouchState.Hand, OtherActor); } void ASGPawn::OnRightMiddleFingertipTouchColliderOverlapEnds( @@ -1251,12 +1524,19 @@ void ASGPawn::OnRightMiddleFingertipTouchColliderOverlapEnds( (void) OtherComp; (void) OtherBodyIndex; - if (RightHandTouchState.ActorMiddleTouching == OtherActor) + if (!IsValid(RightHandTouchState.Hand)) { - RightHandTouchState.ActorMiddleTouching = nullptr; - Pimpl->TriggerTouchStateUpdatedEvent(RightHandTouchState); - Pimpl->TriggerEndTouch(RightHandTouchState.Hand, OtherActor); + return; } + + if (RightHandTouchState.ActorMiddleTouching != OtherActor) + { + return; + } + + RightHandTouchState.ActorMiddleTouching = nullptr; + Pimpl->TriggerTouchStateUpdatedEvent(RightHandTouchState); + Pimpl->TriggerEndTouch(RightHandTouchState.Hand, OtherActor); } void ASGPawn::OnRightRingFingertipTouchColliderOverlapBegins( @@ -1273,12 +1553,25 @@ void ASGPawn::OnRightRingFingertipTouchColliderOverlapBegins( (void) bFromSweep; (void) SweepResult; - if (USGTouchComponent::IsTouchable(OtherActor)) + if (!IsValid(RightHandTouchState.Hand)) { - RightHandTouchState.ActorRingTouching = OtherActor; - Pimpl->TriggerTouchStateUpdatedEvent(RightHandTouchState); - Pimpl->TriggerBeginTouch(RightHandTouchState.Hand, OtherActor); + return; } + + const bool bHandVisible = RightHandTouchState.Hand->IsVisible(); + if (!bHandVisible) + { + return; + } + + if (!USGTouchComponent::IsTouchable(OtherActor)) + { + return; + } + + RightHandTouchState.ActorRingTouching = OtherActor; + Pimpl->TriggerTouchStateUpdatedEvent(RightHandTouchState); + Pimpl->TriggerBeginTouch(RightHandTouchState.Hand, OtherActor); } void ASGPawn::OnRightRingFingertipTouchColliderOverlapEnds( @@ -1291,12 +1584,19 @@ void ASGPawn::OnRightRingFingertipTouchColliderOverlapEnds( (void) OtherComp; (void) OtherBodyIndex; - if (RightHandTouchState.ActorRingTouching == OtherActor) + if (!IsValid(RightHandTouchState.Hand)) { - RightHandTouchState.ActorRingTouching = nullptr; - Pimpl->TriggerTouchStateUpdatedEvent(RightHandTouchState); - Pimpl->TriggerEndTouch(RightHandTouchState.Hand, OtherActor); + return; } + + if (RightHandTouchState.ActorRingTouching != OtherActor) + { + return; + } + + RightHandTouchState.ActorRingTouching = nullptr; + Pimpl->TriggerTouchStateUpdatedEvent(RightHandTouchState); + Pimpl->TriggerEndTouch(RightHandTouchState.Hand, OtherActor); } void ASGPawn::OnRightPinkyFingertipTouchColliderOverlapBegins( @@ -1313,12 +1613,25 @@ void ASGPawn::OnRightPinkyFingertipTouchColliderOverlapBegins( (void) bFromSweep; (void) SweepResult; - if (USGTouchComponent::IsTouchable(OtherActor)) + if (!IsValid(RightHandTouchState.Hand)) { - RightHandTouchState.ActorPinkyTouching = OtherActor; - Pimpl->TriggerTouchStateUpdatedEvent(RightHandTouchState); - Pimpl->TriggerBeginTouch(RightHandTouchState.Hand, OtherActor); + return; } + + const bool bHandVisible = RightHandTouchState.Hand->IsVisible(); + if (!bHandVisible) + { + return; + } + + if (!USGTouchComponent::IsTouchable(OtherActor)) + { + return; + } + + RightHandTouchState.ActorPinkyTouching = OtherActor; + Pimpl->TriggerTouchStateUpdatedEvent(RightHandTouchState); + Pimpl->TriggerBeginTouch(RightHandTouchState.Hand, OtherActor); } void ASGPawn::OnRightPinkyFingertipTouchColliderOverlapEnds( @@ -1331,34 +1644,51 @@ void ASGPawn::OnRightPinkyFingertipTouchColliderOverlapEnds( (void) OtherComp; (void) OtherBodyIndex; - if (RightHandTouchState.ActorPinkyTouching == OtherActor) + if (!IsValid(RightHandTouchState.Hand)) { - RightHandTouchState.ActorPinkyTouching = nullptr; - Pimpl->TriggerTouchStateUpdatedEvent(RightHandTouchState); - Pimpl->TriggerEndTouch(RightHandTouchState.Hand, OtherActor); + return; } + + if (RightHandTouchState.ActorPinkyTouching != OtherActor) + { + return; + } + + RightHandTouchState.ActorPinkyTouching = nullptr; + Pimpl->TriggerTouchStateUpdatedEvent(RightHandTouchState); + Pimpl->TriggerEndTouch(RightHandTouchState.Hand, OtherActor); } bool ASGPawn::IsLeftHandGrabbing(AActor*& OutActor) const { - if (IsValid(LeftHandGrabState.GrabbedActor)) + if (!IsValid(LeftHandGrabState.Hand)) { - OutActor = LeftHandGrabState.GrabbedActor; - return true; + return false; } - return false; + if (!IsValid(LeftHandGrabState.GrabbedActor)) + { + return false; + } + + OutActor = LeftHandGrabState.GrabbedActor; + return true; } bool ASGPawn::IsRightHandGrabbing(AActor*& OutActor) const { - if (IsValid(RightHandGrabState.GrabbedActor)) + if (!IsValid(RightHandGrabState.Hand)) { - OutActor = RightHandGrabState.GrabbedActor; - return true; + return false; } - return false; + if (!IsValid(RightHandGrabState.GrabbedActor)) + { + return false; + } + + OutActor = RightHandGrabState.GrabbedActor; + return true; } bool ASGPawn::IsGrabbing(const USGVirtualHandComponent* Hand, AActor*& OutActor) const @@ -1368,13 +1698,24 @@ bool ASGPawn::IsGrabbing(const USGVirtualHandComponent* Hand, AActor*& OutActor) void ASGPawn::Grab(USGVirtualHandComponent* Hand, AActor* Actor) { + if (!ensureAlwaysMsgf(IsValid(Hand), TEXT("%s"), TEXT("ERROR: invalid hand!"))) + { + return; + } + + const bool bHandVisible = Hand->IsVisible(); + if (!bHandVisible) + { + return; + } + if (!ensureAlwaysMsgf(IsValid(Actor), TEXT("%s"), TEXT("ERROR: invalid actor!"))) { return; } const USGGrabComponent* GrabComponent{USGGrabComponent::GetGrabComponent(Actor)}; - if (!GrabComponent) + if (!IsValid(GrabComponent)) { return; } diff --git a/Source/SenseGlove/Private/SenseGlove/GameFramework/SGPlayerController.cpp b/Source/SenseGlove/Private/SenseGlove/GameFramework/SGPlayerController.cpp index 2bf701fc..ab8ae78a 100644 --- a/Source/SenseGlove/Private/SenseGlove/GameFramework/SGPlayerController.cpp +++ b/Source/SenseGlove/Private/SenseGlove/GameFramework/SGPlayerController.cpp @@ -266,6 +266,16 @@ void ASGPlayerController::BeginPlay() return; } + const bool bHandVisible = GrabState.Hand->IsVisible(); + if (!bHandVisible) + { + if (SGPawn->IsGrabbing(GrabState.Hand)) + { + SGPawn->Release(GrabState.Hand); + } + return; + } + if (SGPawn->IsGrabbing(GrabState.Hand)) { if (!IsValid(GrabState.ActorThumbCanGrab) || @@ -287,6 +297,28 @@ void ASGPlayerController::BeginPlay() SGPawn->OnTouchStateUpdated().AddWeakLambda( this, [= SG_CAPTURE_THIS](const FSGTouchState& TouchState) -> void { + if (!IsValid(SGPawn)) + { + return; + } + + if (!IsValid(TouchState.Hand)) + { + return; + } + + const bool bHandVisible = TouchState.Hand->IsVisible(); + if (!bHandVisible) + { + return; + } + + const bool bGloveConnected = TouchState.Hand->IsGloveConnected(); + if (!bGloveConnected) + { + return; + } + Pimpl->UpdateHapticsFeedback(TouchState); }); } @@ -313,6 +345,12 @@ void ASGPlayerController::FImpl::UpdateHapticsFeedback(const FSGTouchState& Touc return; } + const bool bGloveConnected = Glove->IsConnected() + if (!bGloveConnected) + { + return; + } + // Queue the Force-Feedback command... TArray ForceFeedbackLevels{ GetForceFeedbackLevels( @@ -342,11 +380,19 @@ void ASGPlayerController::FImpl::UpdateHapticsFeedback(const FSGTouchState& Touc FTimerDelegate TouchVibrotactileStopHandler; TouchVibrotactileStopHandler.BindLambda([= SG_CAPTURE_THIS]()-> void { - if (IsValid(Glove)) + if (!IsValid(Glove)) { - Glove->QueueVibroLevels(VibrotactileOffCommand); - Glove->SendHaptics(); + return; } + + const bool bGloveConnected = Glove->IsConnected(); + if (!bGloveConnected) + { + return; + } + + Glove->QueueVibroLevels(VibrotactileOffCommand); + Glove->SendHaptics(); }); Owner->GetWorldTimerManager().SetTimer(