From 331b022a4620c1662a64ceb734af532dafcc1dbc Mon Sep 17 00:00:00 2001 From: Mamadou Babaei Date: Mon, 26 Feb 2024 20:03:54 +0100 Subject: [PATCH] another attempt at improving the glove casts --- .../Private/SGCore/SGDevice.cpp | 61 +++++++++++++++++++ .../Private/SGCore/SGHapticGlove.cpp | 23 ------- .../SenseGloveCore/Public/SGCore/SGDevice.h | 17 ++++++ .../Public/SGCore/SGHapticGlove.h | 10 --- .../Private/SGCoreImpl/SGDeviceImpl.cpp | 18 ++++-- .../SGCoreImpl/SGExportedFunctions.cpp | 6 ++ .../Public/SGCoreImpl/SGDeviceImpl.h | 1 + .../Public/SGCoreImpl/SGExportedFunctions.h | 3 + 8 files changed, 101 insertions(+), 38 deletions(-) diff --git a/Source/SenseGloveCore/Private/SGCore/SGDevice.cpp b/Source/SenseGloveCore/Private/SGCore/SGDevice.cpp index 764939b4..1c91236a 100644 --- a/Source/SenseGloveCore/Private/SGCore/SGDevice.cpp +++ b/Source/SenseGloveCore/Private/SGCore/SGDevice.cpp @@ -37,6 +37,11 @@ #include "Engine/Engine.h" +#include "SGCore/SGBetaDevice.h" +#include "SGCore/SGHapticGlove.h" +#include "SGCore/SGNovaGlove.h" +#include "SGCore/SGNova2Glove.h" +#include "SGCore/SGSenseGlove.h" #include "SGCoreImpl/SGBetaDeviceImpl.h" #include "SGCoreImpl/SGDeviceImpl.h" #include "SGCoreImpl/SGExportedFunctions.h" @@ -315,6 +320,12 @@ bool USGDevice::IsABetaDevice() const return SGCoreImpl_FSGDeviceImpl_IsABetaDevice(&InstanceContainer); } +bool USGDevice::IsAHapticGlove() const +{ + FSGIC_TSharedPtr_FSGDeviceImpl InstanceContainer{ToSGDeviceImpl()}; + return SGCoreImpl_FSGDeviceImpl_IsAHapticGlove(&InstanceContainer); +} + bool USGDevice::IsANova2Glove() const { FSGIC_TSharedPtr_FSGDeviceImpl InstanceContainer{ToSGDeviceImpl()}; @@ -333,6 +344,56 @@ bool USGDevice::IsASenseGlove() const return SGCoreImpl_FSGDeviceImpl_IsASenseGlove(&InstanceContainer); } +USGBetaDevice* USGDevice::AsBetaDevice(UObject* Outer) const +{ + FSGIC_TSharedPtr_FSGDeviceImpl InstanceContainer{ToSGDeviceImpl()}; + FSGIC_TSharedPtr_FSGBetaDeviceImpl OutSharedPtr; + SGCoreImpl_FSGDeviceImpl_ToBetaDeviceImplRef(&InstanceContainer, &OutSharedPtr); + USGBetaDevice* BetaDevice = NewObject(Outer); + BetaDevice->SetSGDeviceImpl(*OutSharedPtr.Ptr.Get()); + return BetaDevice; +} + +USGHapticGlove* USGDevice::AsHapticGlove(UObject* Outer) const +{ + FSGIC_TSharedPtr_FSGDeviceImpl InstanceContainer{ToSGDeviceImpl()}; + FSGIC_TSharedPtr_FSGHapticGloveImpl OutSharedPtr; + SGCoreImpl_FSGDeviceImpl_ToHapticGloveImplRef(&InstanceContainer, &OutSharedPtr); + USGHapticGlove* HapticGlove = NewObject(Outer); + HapticGlove->SetSGDeviceImpl(*OutSharedPtr.Ptr.Get()); + return HapticGlove; +} + +USGNova2Glove* USGDevice::AsNova2Glove(UObject* Outer) const +{ + FSGIC_TSharedPtr_FSGDeviceImpl InstanceContainer{ToSGDeviceImpl()}; + FSGIC_TSharedPtr_FSGNova2GloveImpl OutSharedPtr; + SGCoreImpl_FSGDeviceImpl_ToNova2GloveImplRef(&InstanceContainer, &OutSharedPtr); + USGNova2Glove* Nova2Glove = NewObject(Outer); + Nova2Glove->SetSGDeviceImpl(*OutSharedPtr.Ptr.Get()); + return Nova2Glove; +} + +USGNovaGlove* USGDevice::AsNovaGlove(UObject* Outer) const +{ + FSGIC_TSharedPtr_FSGDeviceImpl InstanceContainer{ToSGDeviceImpl()}; + FSGIC_TSharedPtr_FSGNovaGloveImpl OutSharedPtr; + SGCoreImpl_FSGDeviceImpl_ToNovaGloveImplRef(&InstanceContainer, &OutSharedPtr); + USGNovaGlove* NovaGlove = NewObject(Outer); + NovaGlove->SetSGDeviceImpl(*OutSharedPtr.Ptr.Get()); + return NovaGlove; +} + +USGSenseGlove* USGDevice::AsSenseGlove(UObject* Outer) const +{ + FSGIC_TSharedPtr_FSGDeviceImpl InstanceContainer{ToSGDeviceImpl()}; + FSGIC_TSharedPtr_FSGSenseGloveImpl OutSharedPtr; + SGCoreImpl_FSGDeviceImpl_ToSenseGloveImplRef(&InstanceContainer, &OutSharedPtr); + USGSenseGlove* SenseGlove = NewObject(Outer); + SenseGlove->SetSGDeviceImpl(*OutSharedPtr.Ptr.Get()); + return SenseGlove; +} + ESGDeviceType USGDevice::GetDeviceType() const { FSGIC_TSharedPtr_FSGDeviceImpl InstanceContainer{ToSGDeviceImpl()}; diff --git a/Source/SenseGloveCore/Private/SGCore/SGHapticGlove.cpp b/Source/SenseGloveCore/Private/SGCore/SGHapticGlove.cpp index d9d9c4b0..5add87c8 100644 --- a/Source/SenseGloveCore/Private/SGCore/SGHapticGlove.cpp +++ b/Source/SenseGloveCore/Private/SGCore/SGHapticGlove.cpp @@ -38,8 +38,6 @@ #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" @@ -205,27 +203,6 @@ TSharedRef USGHapticGlove::ToHapticGloveImpl() const return FSGDeviceImplCast::ToHapticGloveImpl(ToSGDeviceImpl()); } -USGNova2Glove* USGHapticGlove::AsNova2Glove(UObject* Outer) const -{ - USGNova2Glove* Instance = NewObject(Outer); - Instance->SetSGDeviceImpl(ToHapticGloveImpl()); - return Instance; -} - -USGNovaGlove* USGHapticGlove::AsNovaGlove(UObject* Outer) const -{ - USGNovaGlove* Instance = NewObject(Outer); - Instance->SetSGDeviceImpl(ToHapticGloveImpl()); - return Instance; -} - -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/SGDevice.h b/Source/SenseGloveCore/Public/SGCore/SGDevice.h index e8c45e84..b7c5392a 100644 --- a/Source/SenseGloveCore/Public/SGCore/SGDevice.h +++ b/Source/SenseGloveCore/Public/SGCore/SGDevice.h @@ -54,6 +54,11 @@ class FSGNovaGloveImpl; class FSGNova2GloveImpl; class FSGSenseGloveImpl; class USGHapticChannelInfo; +class USGBetaDevice; +class USGHapticGlove; +class USGNova2Glove; +class USGNovaGlove; +class USGSenseGlove; /** * @@ -254,10 +259,22 @@ public: public: bool IsABetaDevice() const; + bool IsAHapticGlove() const; bool IsANova2Glove() const; bool IsANovaGlove() const; bool IsASenseGlove() const; +public: + USGBetaDevice* AsBetaDevice(UObject* Outer) const; + + USGHapticGlove* AsHapticGlove(UObject* Outer) const; + + USGNova2Glove* AsNova2Glove(UObject* Outer) const; + + USGNovaGlove* AsNovaGlove(UObject* Outer) const; + + USGSenseGlove* AsSenseGlove(UObject* Outer) const; + public: /** * Check which DeviceType this class belongs to. diff --git a/Source/SenseGloveCore/Public/SGCore/SGHapticGlove.h b/Source/SenseGloveCore/Public/SGCore/SGHapticGlove.h index 717dcd5b..068d43e4 100644 --- a/Source/SenseGloveCore/Public/SGCore/SGHapticGlove.h +++ b/Source/SenseGloveCore/Public/SGCore/SGHapticGlove.h @@ -58,9 +58,6 @@ 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. @@ -189,13 +186,6 @@ public: */ TSharedRef ToHapticGloveImpl() const; -public: - USGNova2Glove* AsNova2Glove(UObject* Outer) const; - - USGNovaGlove* AsNovaGlove(UObject* Outer) const; - - USGSenseGlove* AsSenseGlove(UObject* Outer) const; - public: /** * Get the DeviceType enumerator of this device; used to check if its a SenseGlove/Nova/etc. diff --git a/Source/SenseGloveCoreImpl/Private/SGCoreImpl/SGDeviceImpl.cpp b/Source/SenseGloveCoreImpl/Private/SGCoreImpl/SGDeviceImpl.cpp index 1831e63f..38fccca5 100644 --- a/Source/SenseGloveCoreImpl/Private/SGCoreImpl/SGDeviceImpl.cpp +++ b/Source/SenseGloveCoreImpl/Private/SGCoreImpl/SGDeviceImpl.cpp @@ -151,35 +151,35 @@ TSharedRef FSGDeviceImpl::ToSGDeviceImplRef() TSharedRef FSGDeviceImpl::ToBetaDeviceImplRef() { - FSGBetaDeviceImpl* BetaDevice(dynamic_cast(this)); + FSGBetaDeviceImpl* BetaDevice{dynamic_cast(this)}; ensureAlwaysMsgf(BetaDevice, TEXT("Invalid BetaDevice!")); return SharedThis(BetaDevice); } TSharedRef FSGDeviceImpl::ToHapticGloveImplRef() { - FSGHapticGloveImpl* HapticGlove(dynamic_cast(this)); + FSGHapticGloveImpl* HapticGlove{dynamic_cast(this)}; ensureAlwaysMsgf(HapticGlove, TEXT("Invalid HapticGlove!")); return SharedThis(HapticGlove); } TSharedRef FSGDeviceImpl::ToNova2GloveImplRef() { - FSGNova2GloveImpl* Nova2Glove(dynamic_cast(this)); + FSGNova2GloveImpl* Nova2Glove{dynamic_cast(this)}; ensureAlwaysMsgf(Nova2Glove, TEXT("Invalid Nova2Glove!")); return SharedThis(Nova2Glove); } TSharedRef FSGDeviceImpl::ToNovaGloveImplRef() { - FSGNovaGloveImpl* NovaGlove(dynamic_cast(this)); + FSGNovaGloveImpl* NovaGlove{dynamic_cast(this)}; ensureAlwaysMsgf(NovaGlove, TEXT("Invalid NovaGlove!")); return SharedThis(NovaGlove); } TSharedRef FSGDeviceImpl::ToSenseGloveImplRef() { - FSGSenseGloveImpl* SenseGlove(dynamic_cast(this)); + FSGSenseGloveImpl* SenseGlove{dynamic_cast(this)}; ensureAlwaysMsgf(SenseGlove, TEXT("Invalid SenseGlove!")); return SharedThis(SenseGlove); } @@ -192,6 +192,14 @@ bool FSGDeviceImpl::IsABetaDevice() const return BetaDevice != nullptr; } +bool FSGDeviceImpl::IsAHapticGlove() const +{ + const FSGHapticGloveImpl::FHapticGlovePtrType HapticGlove{ + std::dynamic_pointer_cast(ToSGDevicePtr()) + }; + return HapticGlove != nullptr; +} + bool FSGDeviceImpl::IsANova2Glove() const { const FSGNova2GloveImpl::FNova2GlovePtrType Nova2Glove{ diff --git a/Source/SenseGloveCoreImpl/Private/SGCoreImpl/SGExportedFunctions.cpp b/Source/SenseGloveCoreImpl/Private/SGCoreImpl/SGExportedFunctions.cpp index 8c779fa6..191c54d7 100644 --- a/Source/SenseGloveCoreImpl/Private/SGCoreImpl/SGExportedFunctions.cpp +++ b/Source/SenseGloveCoreImpl/Private/SGCoreImpl/SGExportedFunctions.cpp @@ -1078,6 +1078,12 @@ bool SGCoreImpl_FSGDeviceImpl_IsABetaDevice( return StaticCast(Instance)->Ptr->IsABetaDevice(); } +bool SGCoreImpl_FSGDeviceImpl_IsAHapticGlove( + void* Instance) +{ + return StaticCast(Instance)->Ptr->IsAHapticGlove(); +} + bool SGCoreImpl_FSGDeviceImpl_IsANova2Glove( void* Instance) { diff --git a/Source/SenseGloveCoreImpl/Public/SGCoreImpl/SGDeviceImpl.h b/Source/SenseGloveCoreImpl/Public/SGCoreImpl/SGDeviceImpl.h index c9778b04..2278a159 100644 --- a/Source/SenseGloveCoreImpl/Public/SGCoreImpl/SGDeviceImpl.h +++ b/Source/SenseGloveCoreImpl/Public/SGCoreImpl/SGDeviceImpl.h @@ -168,6 +168,7 @@ public: public: bool IsABetaDevice() const; + bool IsAHapticGlove() const; bool IsANova2Glove() const; bool IsANovaGlove() const; bool IsASenseGlove() const; diff --git a/Source/SenseGloveCoreImpl/Public/SGCoreImpl/SGExportedFunctions.h b/Source/SenseGloveCoreImpl/Public/SGCoreImpl/SGExportedFunctions.h index 76b394b1..b66ce7c0 100644 --- a/Source/SenseGloveCoreImpl/Public/SGCoreImpl/SGExportedFunctions.h +++ b/Source/SenseGloveCoreImpl/Public/SGCoreImpl/SGExportedFunctions.h @@ -556,6 +556,9 @@ SENSEGLOVECOREIMPL_PUBLIC_API void SGCoreImpl_FSGDeviceImpl_ToSenseGloveImplRef( SENSEGLOVECOREIMPL_PUBLIC_API bool SGCoreImpl_FSGDeviceImpl_IsABetaDevice( void* Instance); +SENSEGLOVECOREIMPL_PUBLIC_API bool SGCoreImpl_FSGDeviceImpl_IsAHapticGlove( + void* Instance); + SENSEGLOVECOREIMPL_PUBLIC_API bool SGCoreImpl_FSGDeviceImpl_IsANova2Glove( void* Instance);