diff --git a/Source/SenseGlove/Private/SenseGlove/GameFramework/SGPlayerController.cpp b/Source/SenseGlove/Private/SenseGlove/GameFramework/SGPlayerController.cpp index 04f09ab2..be8e6d53 100644 --- a/Source/SenseGlove/Private/SenseGlove/GameFramework/SGPlayerController.cpp +++ b/Source/SenseGlove/Private/SenseGlove/GameFramework/SGPlayerController.cpp @@ -254,25 +254,31 @@ void ASGPlayerController::BeginPlay() const USGBuzzCommand* BuzzCommand{Pimpl->GetBuzzCommand( ActorThumbTouching, ActorIndexTouching, ActorMiddleTouching, ActorRingTouching, ActorPinkyTouching)}; - Glove->SendHaptics(BuzzCommand); - - const float Duration = FImpl::GetBuzzDuration( - ActorThumbTouching, ActorIndexTouching, ActorMiddleTouching, ActorRingTouching, ActorPinkyTouching); - - GetWorldTimerManager().ClearTimer(Pimpl->TouchBuzzStopTimer); - - FTimerDelegate TouchBuzzStopHandler; - TouchBuzzStopHandler.BindLambda([=]()-> void + if (IsValid(BuzzCommand)) { - Glove->SendHaptics(USGBuzzCommand::Off(this)); - }); + Glove->SendHaptics(BuzzCommand); - GetWorldTimerManager().SetTimer( - Pimpl->TouchBuzzStopTimer, TouchBuzzStopHandler, Duration, false, -1.0f); + const float Duration = FImpl::GetBuzzDuration( + ActorThumbTouching, ActorIndexTouching, ActorMiddleTouching, ActorRingTouching, ActorPinkyTouching); + + GetWorldTimerManager().ClearTimer(Pimpl->TouchBuzzStopTimer); + + FTimerDelegate TouchBuzzStopHandler; + TouchBuzzStopHandler.BindLambda([=]()-> void + { + Glove->SendHaptics(USGBuzzCommand::Off(this)); + }); + + GetWorldTimerManager().SetTimer( + Pimpl->TouchBuzzStopTimer, TouchBuzzStopHandler, Duration, false, -1.0f); + } const USGForceFeedbackCommand* ForceFeedbackCommand{Pimpl->GetForceFeedbackCommand( ActorThumbTouching, ActorIndexTouching, ActorMiddleTouching, ActorRingTouching, ActorPinkyTouching)}; - Glove->SendHaptics(ForceFeedbackCommand); + if (IsValid(ForceFeedbackCommand)) + { + Glove->SendHaptics(ForceFeedbackCommand); + } }); } @@ -283,12 +289,24 @@ ASGPlayerController::FImpl::FImpl(ASGPlayerController* InOwner) ASGPlayerController::FImpl::~FImpl() = default; -USGBuzzCommand* ASGPlayerController::FImpl::GetBuzzCommand(const AActor* ActorThumbTouching, - const AActor* ActorIndexTouching, - const AActor* ActorMiddleTouching, - const AActor* ActorRingTouching, - const AActor* ActorPinkyTouching) const +USGBuzzCommand* ASGPlayerController::FImpl::GetBuzzCommand( + const AActor* ActorThumbTouching, + const AActor* ActorIndexTouching, + const AActor* ActorMiddleTouching, + const AActor* ActorRingTouching, + const AActor* ActorPinkyTouching) const { + const int32 ThumbBuzzLevel = GetBuzzLevel(ActorThumbTouching); + const int32 IndexBuzzLevel = GetBuzzLevel(ActorIndexTouching); + const int32 MiddleBuzzLevel = GetBuzzLevel(ActorMiddleTouching); + const int32 RingBuzzLevel = GetBuzzLevel(ActorRingTouching); + const int32 PinkyBuzzLevel = GetBuzzLevel(ActorThumbTouching); + + if (ThumbBuzzLevel <= 0 && IndexBuzzLevel <= 0 && MiddleBuzzLevel <= 0 && RingBuzzLevel <= 0 && PinkyBuzzLevel <= 0) + { + return nullptr; + } + USGBuzzCommand* BuzzCommand = USGBuzzCommand::NewBuzzCommand( Owner, GetBuzzLevel(ActorThumbTouching), @@ -297,15 +315,29 @@ USGBuzzCommand* ASGPlayerController::FImpl::GetBuzzCommand(const AActor* ActorTh GetBuzzLevel(ActorRingTouching), GetBuzzLevel(ActorPinkyTouching) ); + return BuzzCommand; } -USGForceFeedbackCommand* ASGPlayerController::FImpl::GetForceFeedbackCommand(const AActor* ActorThumbTouching, - const AActor* ActorIndexTouching, - const AActor* ActorMiddleTouching, - const AActor* ActorRingTouching, - const AActor* ActorPinkyTouching) const +USGForceFeedbackCommand* ASGPlayerController::FImpl::GetForceFeedbackCommand( + const AActor* ActorThumbTouching, + const AActor* ActorIndexTouching, + const AActor* ActorMiddleTouching, + const AActor* ActorRingTouching, + const AActor* ActorPinkyTouching) const { + const int32 ThumbForceFeedbackLevel = GetForceFeedbackLevel(ActorThumbTouching); + const int32 IndexForceFeedbackLevel = GetForceFeedbackLevel(ActorIndexTouching); + const int32 MiddleForceFeedbackLevel = GetForceFeedbackLevel(ActorMiddleTouching); + const int32 RingForceFeedbackLevel = GetForceFeedbackLevel(ActorRingTouching); + const int32 PinkyForceFeedbackLevel = GetForceFeedbackLevel(ActorThumbTouching); + + if (ThumbForceFeedbackLevel <= 0 && IndexForceFeedbackLevel <= 0 && MiddleForceFeedbackLevel <= 0 + && RingForceFeedbackLevel <= 0 && PinkyForceFeedbackLevel <= 0) + { + return nullptr; + } + USGForceFeedbackCommand* ForceFeedbackCommand = USGForceFeedbackCommand::NewForceFeedbackCommand( Owner, GetForceFeedbackLevel(ActorThumbTouching), @@ -314,6 +346,7 @@ USGForceFeedbackCommand* ASGPlayerController::FImpl::GetForceFeedbackCommand(con GetForceFeedbackLevel(ActorRingTouching), GetForceFeedbackLevel(ActorPinkyTouching) ); + return ForceFeedbackCommand; }