From ae688f71a9b3432b8cc1501f3b8140f2d7ed2ede Mon Sep 17 00:00:00 2001 From: Mamadou Babaei Date: Mon, 26 Feb 2024 18:46:46 +0100 Subject: [PATCH] try to add a solution for glove type-casting in higher levels of the api --- .../GameFramework/SGPlayerController.cpp | 44 +++++++++++------- .../Private/SGCore/SGHapticGlove.cpp | 45 +++++++++++++++++++ .../Public/SGCore/SGHapticGlove.h | 13 ++++++ 3 files changed, 85 insertions(+), 17 deletions(-) diff --git a/Source/SenseGlove/Private/SenseGlove/GameFramework/SGPlayerController.cpp b/Source/SenseGlove/Private/SenseGlove/GameFramework/SGPlayerController.cpp index ea585a22..fc2efc64 100644 --- a/Source/SenseGlove/Private/SenseGlove/GameFramework/SGPlayerController.cpp +++ b/Source/SenseGlove/Private/SenseGlove/GameFramework/SGPlayerController.cpp @@ -329,11 +329,20 @@ void ASGPlayerController::FImpl::UpdateHapticsFeedback(const FSGTouchState& Touc }; Glove->QueueForceFeedbackLevels(MoveTemp(ForceFeedbackLevels)); - USGNovaGlove* NovaGlove = Cast(Glove); - USGNova2Glove* Nova2Glove = Cast(Glove); + USGNova2Glove* Nova2Glove = nullptr; + if (Glove->IsANova2Glove()) + { + Nova2Glove = Glove->AsNova2Glove(Owner); + } - // Queue the Vibrotactile command if a Nova or Nova 2 glove... - if (IsValid(NovaGlove) || IsValid(Nova2Glove)) + USGNovaGlove* NovaGlove = nullptr; + if (Glove->IsANovaGlove()) + { + NovaGlove = Glove->AsNovaGlove(Owner); + } + + // Queue the Vibrotactile command if a Nova 2 or Nova glove... + if (IsValid(Nova2Glove) || IsValid(NovaGlove)) { TArray VibrotactileLevels{ GetVibrotactileLevels( @@ -341,23 +350,24 @@ void ASGPlayerController::FImpl::UpdateHapticsFeedback(const FSGTouchState& Touc TouchState.ActorRingTouching, TouchState.ActorPinkyTouching) }; - if (IsValid(NovaGlove)) - { - NovaGlove->QueueVibroLevels(MoveTemp(VibrotactileLevels)); - } - // Queue the Vibrotactile command if a Nova 2 glove... if (IsValid(Nova2Glove)) { /// TODO } + + // Queue the Vibrotactile command if a Nova glove... + if (IsValid(NovaGlove)) + { + NovaGlove->QueueVibroLevels(MoveTemp(VibrotactileLevels)); + } } // Send the haptics commands! Glove->SendHaptics(); - // Stop the Vibrotactile command after the timeout if a Nova or Nova 2 glove. - if (IsValid(NovaGlove) || IsValid(Nova2Glove)) + // Stop the Vibrotactile command after the timeout if a Nova 2 or Nova glove. + if (IsValid(Nova2Glove) || IsValid(NovaGlove)) { const float VibrotactileDuration = FImpl::GetVibrotactileDuration( TouchState.ActorThumbTouching, TouchState.ActorIndexTouching, TouchState.ActorMiddleTouching, @@ -368,18 +378,18 @@ void ASGPlayerController::FImpl::UpdateHapticsFeedback(const FSGTouchState& Touc FTimerDelegate TouchVibrotactileStopHandler; TouchVibrotactileStopHandler.BindLambda([= SG_CAPTURE_THIS]()-> void { + // Stop the Vibrotactile command after the timeout if a Nova 2 Glove. + if (IsValid(Nova2Glove)) + { + // TODO + } + // Stop the Vibrotactile command after the timeout if a Nova Glove. if (IsValid(NovaGlove)) { NovaGlove->QueueVibroLevels(VibrotactileOffCommand); NovaGlove->SendHaptics(); } - - // Stop the Vibrotactile command after the timeout if a Nova 2 Glove. - if (IsValid(Nova2Glove)) - { - // TODO - } }); Owner->GetWorldTimerManager().SetTimer( diff --git a/Source/SenseGloveCore/Private/SGCore/SGHapticGlove.cpp b/Source/SenseGloveCore/Private/SGCore/SGHapticGlove.cpp index 12a08621..23dddd2d 100644 --- a/Source/SenseGloveCore/Private/SGCore/SGHapticGlove.cpp +++ b/Source/SenseGloveCore/Private/SGCore/SGHapticGlove.cpp @@ -38,6 +38,9 @@ #include "SGCore/SGBasicHandModel.h" #include "SGCore/SGCustomWaveform.h" #include "SGCore/SGDeviceImplCast.h" +#include "SGCore/SGNova2Glove.h" +#include "SGCore/SGNovaGlove.h" +#include "SGCore/SGSenseGlove.h" #include "SGCoreImpl/SGBasicHandModelImpl.h" #include "SGCoreImpl/SGCustomWaveformImpl.h" #include "SGCoreImpl/SGDeviceImpl.h" @@ -202,6 +205,48 @@ TSharedRef USGHapticGlove::ToHapticGloveImpl() const return FSGDeviceImplCast::ToHapticGloveImpl(ToSGDeviceImpl()); } +bool USGHapticGlove::IsANova2Glove() const +{ + const TSharedPtr Nova2Glove = + StaticCastSharedPtr(ToHapticGloveImpl().ToSharedPtr()); + return Nova2Glove.IsValid(); +} + +USGNova2Glove* USGHapticGlove::AsNova2Glove(UObject* Outer) const +{ + USGNova2Glove* Instance = NewObject(Outer); + Instance->SetSGDeviceImpl(ToHapticGloveImpl()); + return Instance; +} + +bool USGHapticGlove::IsANovaGlove() const +{ + const TSharedPtr NovaGlove = + StaticCastSharedPtr(ToHapticGloveImpl().ToSharedPtr()); + return NovaGlove.IsValid(); +} + +USGNovaGlove* USGHapticGlove::AsNovaGlove(UObject* Outer) const +{ + USGNovaGlove* Instance = NewObject(Outer); + Instance->SetSGDeviceImpl(ToHapticGloveImpl()); + return Instance; +} + +bool USGHapticGlove::IsASenseGlove() const +{ + const TSharedPtr SenseGlove = + StaticCastSharedPtr(ToHapticGloveImpl().ToSharedPtr()); + return SenseGlove.IsValid(); +} + +USGSenseGlove* USGHapticGlove::AsSenseGlove(UObject* Outer) const +{ + USGSenseGlove* Instance = NewObject(Outer); + Instance->SetSGDeviceImpl(ToHapticGloveImpl()); + return Instance; +} + ESGDeviceType USGHapticGlove::GetDeviceType() const { FSGIC_TSharedPtr_FSGHapticGloveImpl InstanceContainer{ToHapticGloveImpl()}; diff --git a/Source/SenseGloveCore/Public/SGCore/SGHapticGlove.h b/Source/SenseGloveCore/Public/SGCore/SGHapticGlove.h index 068d43e4..9a64b4d9 100644 --- a/Source/SenseGloveCore/Public/SGCore/SGHapticGlove.h +++ b/Source/SenseGloveCore/Public/SGCore/SGHapticGlove.h @@ -58,6 +58,9 @@ class FSGNova2GloveImpl; class FSGSenseGloveImpl; class USGBasicHandModel; class USGCustomWaveform; +class USGNova2Glove; +class USGNovaGlove; +class USGSenseGlove; /** * A glove developed by SenseGlove, that has hand tracking and/or haptic feedback functionality. @@ -186,6 +189,16 @@ public: */ TSharedRef ToHapticGloveImpl() const; +public: + bool IsANova2Glove() const; + USGNova2Glove* AsNova2Glove(UObject* Outer) const; + + bool IsANovaGlove() const; + USGNovaGlove* AsNovaGlove(UObject* Outer) const; + + bool IsASenseGlove() const; + USGSenseGlove* AsSenseGlove(UObject* Outer) const; + public: /** * Get the DeviceType enumerator of this device; used to check if its a SenseGlove/Nova/etc.