try to add a solution for glove type-casting in higher levels of the api

This commit is contained in:
Mamadou Babaei
2024-03-22 21:03:49 +01:00
parent 121776964a
commit 46813b44ec
3 changed files with 85 additions and 17 deletions
@@ -329,11 +329,20 @@ void ASGPlayerController::FImpl::UpdateHapticsFeedback(const FSGTouchState& Touc
};
Glove->QueueForceFeedbackLevels(MoveTemp(ForceFeedbackLevels));
USGNovaGlove* NovaGlove = Cast<USGNovaGlove>(Glove);
USGNova2Glove* Nova2Glove = Cast<USGNova2Glove>(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<float> 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(
@@ -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<FSGHapticGloveImpl> USGHapticGlove::ToHapticGloveImpl() const
return FSGDeviceImplCast::ToHapticGloveImpl(ToSGDeviceImpl());
}
bool USGHapticGlove::IsANova2Glove() const
{
const TSharedPtr<FSGNova2GloveImpl> Nova2Glove =
StaticCastSharedPtr<FSGNova2GloveImpl>(ToHapticGloveImpl().ToSharedPtr());
return Nova2Glove.IsValid();
}
USGNova2Glove* USGHapticGlove::AsNova2Glove(UObject* Outer) const
{
USGNova2Glove* Instance = NewObject<USGNova2Glove>(Outer);
Instance->SetSGDeviceImpl(ToHapticGloveImpl());
return Instance;
}
bool USGHapticGlove::IsANovaGlove() const
{
const TSharedPtr<FSGNovaGloveImpl> NovaGlove =
StaticCastSharedPtr<FSGNovaGloveImpl>(ToHapticGloveImpl().ToSharedPtr());
return NovaGlove.IsValid();
}
USGNovaGlove* USGHapticGlove::AsNovaGlove(UObject* Outer) const
{
USGNovaGlove* Instance = NewObject<USGNovaGlove>(Outer);
Instance->SetSGDeviceImpl(ToHapticGloveImpl());
return Instance;
}
bool USGHapticGlove::IsASenseGlove() const
{
const TSharedPtr<FSGSenseGloveImpl> SenseGlove =
StaticCastSharedPtr<FSGSenseGloveImpl>(ToHapticGloveImpl().ToSharedPtr());
return SenseGlove.IsValid();
}
USGSenseGlove* USGHapticGlove::AsSenseGlove(UObject* Outer) const
{
USGSenseGlove* Instance = NewObject<USGSenseGlove>(Outer);
Instance->SetSGDeviceImpl(ToHapticGloveImpl());
return Instance;
}
ESGDeviceType USGHapticGlove::GetDeviceType() const
{
FSGIC_TSharedPtr_FSGHapticGloveImpl InstanceContainer{ToHapticGloveImpl()};
@@ -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<FSGHapticGloveImpl> 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.