/** * @file * * @author Mamadou Babaei * * @section LICENSE * * (The MIT License) * * Copyright (c) 2020 - 2022 SenseGlove * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * * @section DESCRIPTION * * */ #include "SGCore/SGHapticGloveCalibrationSequence.h" #include "Runtime/Launch/Resources/Version.h" #include "SGCore/SGCalibrationDataPoint.h" #include "SGCore/SGHandPose.h" #include "SGCore/SGHandProfile.h" #include "SGCore/SGHapticGlove.h" #include "SGCore/SGSensorRange.h" #include "SGCoreImpl/SGExportedFunctions.h" #include "SGInterop/SGIC_ESGDeviceType.h" #include "SGInterop/SGIC_FSGHandPoseImpl.h" #include "SGInterop/SGIC_FSGHandProfileImpl.h" #include "SGInterop/SGIC_FSGHapticGloveCalibrationSequenceImpl.h" #include "SGInterop/SGIC_FSGHapticGloveQuickCalibrationImpl.h" #include "SGInterop/SGIC_FSGSensorRangeImpl.h" #include "SGInterop/SGIC_FString.h" #include "SGInterop/SGIC_TArray_FSGCalibrationDataPointImpl.h" #include "SGInterop/SGIC_TArray_FVector.h" #include "SGInterop/SGIC_TSharedPtr_FSGHapticGloveImpl.h" #include "SGInterop/SGIC_TSharedPtr_FSGHapticGloveCalibrationSequenceImpl.h" #include "SGInterop/SGIC_TSharedPtr_FSGHapticGloveQuickCalibrationImpl.h" #include "SGUtils/SGArrayUtils.h" struct USGHapticGloveCalibrationSequence::FImpl { /************************ * Member variables ************************/ TSharedPtr HapticGloveCalibrationSequenceImpl; /************************ * Owner object ************************/ USGHapticGloveCalibrationSequence* Owner; /************************ * Constructor / Destructor ************************/ explicit FImpl(USGHapticGloveCalibrationSequence* InOwner); ~FImpl(); /************************ * Default copy constructor & copy assignment operator ************************/ FImpl(const FImpl& Rhs) = default; FImpl& operator=(const FImpl& Rhs) = default; /************************ * Methods ************************/ void SyncUProperties(); void SyncImplObject(); }; USGHapticGloveCalibrationSequence* USGHapticGloveCalibrationSequence::NewHapticGloveCalibrationSequence(UObject* Outer, const FSGHapticGloveCalibrationSequenceImpl& HapticGloveCalibrationSequence) { USGHapticGloveCalibrationSequence* Instance = NewObject(Outer); Instance->SetHapticGloveCalibrationSequenceImpl(HapticGloveCalibrationSequence); return Instance; } USGHapticGloveCalibrationSequence* USGHapticGloveCalibrationSequence::NewHapticGloveCalibrationSequence(UObject* Outer, TSharedRef HapticGloveCalibrationSequence) { USGHapticGloveCalibrationSequence* Instance = NewObject(Outer); Instance->SetHapticGloveCalibrationSequenceImpl(MoveTemp(HapticGloveCalibrationSequence)); return Instance; } USGHapticGloveCalibrationSequence* USGHapticGloveCalibrationSequence::NewHapticGloveCalibrationSequence(UObject* Outer) { FSGIC_TSharedPtr_FSGHapticGloveCalibrationSequenceImpl OutSharedPtrContainer; SGCoreImpl_FSGHapticGloveCalibrationSequenceImpl_ctor_MakeShared(&OutSharedPtrContainer); return NewHapticGloveCalibrationSequence(Outer, OutSharedPtrContainer.Ptr.ToSharedRef()); } USGHapticGloveCalibrationSequence* USGHapticGloveCalibrationSequence::NewHapticGloveCalibrationSequence(UObject* Outer, const USGHapticGlove* LinkedGlove) { FSGIC_TSharedPtr_FSGHapticGloveCalibrationSequenceImpl OutSharedPtrContainer; FSGIC_TSharedPtr_FSGHapticGloveImpl LinkedGloveContainer{LinkedGlove->ToHapticGloveImpl()}; SGCoreImpl_FSGHapticGloveCalibrationSequenceImpl_ctor_LinkedGlove_MakeShared( &OutSharedPtrContainer, &LinkedGloveContainer); return NewHapticGloveCalibrationSequence(Outer, OutSharedPtrContainer.Ptr.ToSharedRef()); } int32 USGHapticGloveCalibrationSequence::GetMaxDataPoints() { return SGCoreImpl_FSGHapticGloveCalibrationSequenceImpl_GetMaxDataPoints(); } bool USGHapticGloveCalibrationSequence::CompileProfile(UObject* Outer, const USGSensorRange* SensorRange, const ESGDeviceType ForDevice, const bool bRightHanded, USGHandProfile*& OutProfile) { FSGIC_FSGSensorRangeImpl SensorRangeContainer{SensorRange->ToSensorRangeImpl()}; FSGIC_ESGDeviceType ForDeviceContainer{ForDevice}; FSGIC_FSGHandProfileImpl OutProfileContainer; const bool bResult = SGCoreImpl_FSGHapticGloveCalibrationSequenceImpl_CompileProfile_SensorRange_ForDevice_bRightHanded_OutProfile( &SensorRangeContainer, &ForDeviceContainer, bRightHanded, &OutProfileContainer); if (bResult) { OutProfile = USGHandProfile::NewHandProfile(Outer, MoveTemp(OutProfileContainer.HandProfileImpl)); } return bResult; } USGHapticGloveCalibrationSequence::USGHapticGloveCalibrationSequence() : #if ENGINE_MAJOR_VERSION == 5 || ( ENGINE_MAJOR_VERSION == 4 && ENGINE_MINOR_VERSION > 24 ) Pimpl(TUniquePtr(new FImpl{this}, PimplDeleter)) #else Pimpl(TUniquePtr(new FImpl{this})) #endif /* ENGINE_MAJOR_VERSION == 5 || ( ENGINE_MAJOR_VERSION == 4 && ENGINE_MINOR_VERSION > 24 ) */ { FSGIC_TSharedPtr_FSGHapticGloveCalibrationSequenceImpl OutSharedPtrContainer; SGCoreImpl_FSGHapticGloveCalibrationSequenceImpl_ctor_MakeShared(&OutSharedPtrContainer); Pimpl->HapticGloveCalibrationSequenceImpl = MoveTemp(OutSharedPtrContainer.Ptr); Pimpl->SyncUProperties(); } USGHapticGloveCalibrationSequence::USGHapticGloveCalibrationSequence(const USGHapticGlove* LinkedGlove) : #if ENGINE_MAJOR_VERSION == 5 || ( ENGINE_MAJOR_VERSION == 4 && ENGINE_MINOR_VERSION > 24 ) Pimpl(TUniquePtr(new FImpl{this}, PimplDeleter)) #else Pimpl(TUniquePtr(new FImpl{this})) #endif /* ENGINE_MAJOR_VERSION == 5 || ( ENGINE_MAJOR_VERSION == 4 && ENGINE_MINOR_VERSION > 24 ) */ { FSGIC_TSharedPtr_FSGHapticGloveCalibrationSequenceImpl OutSharedPtrContainer; FSGIC_TSharedPtr_FSGHapticGloveImpl LinkedGloveContainer{LinkedGlove->ToHapticGloveImpl()}; SGCoreImpl_FSGHapticGloveCalibrationSequenceImpl_ctor_LinkedGlove_MakeShared( &OutSharedPtrContainer, &LinkedGloveContainer); Pimpl->HapticGloveCalibrationSequenceImpl = MoveTemp(OutSharedPtrContainer.Ptr); Pimpl->SyncUProperties(); } USGHapticGloveCalibrationSequence::USGHapticGloveCalibrationSequence( const FSGHapticGloveCalibrationSequenceImpl& HapticGloveCalibrationSequenceImpl) : #if ENGINE_MAJOR_VERSION == 5 || ( ENGINE_MAJOR_VERSION == 4 && ENGINE_MINOR_VERSION > 24 ) Pimpl(TUniquePtr(new FImpl{this}, PimplDeleter)) #else Pimpl(TUniquePtr(new FImpl{this})) #endif /* ENGINE_MAJOR_VERSION == 5 || ( ENGINE_MAJOR_VERSION == 4 && ENGINE_MINOR_VERSION > 24 ) */ { FSGIC_TSharedPtr_FSGHapticGloveCalibrationSequenceImpl OutSharedPtrContainer; FSGIC_FSGHapticGloveCalibrationSequenceImpl RhsContainer{HapticGloveCalibrationSequenceImpl}; SGCoreImpl_FSGHapticGloveCalibrationSequenceImpl_ctor_copy_MakeShared( &OutSharedPtrContainer, &RhsContainer); Pimpl->HapticGloveCalibrationSequenceImpl = MoveTemp(OutSharedPtrContainer.Ptr); Pimpl->SyncUProperties(); } USGHapticGloveCalibrationSequence::USGHapticGloveCalibrationSequence( const FSGHapticGloveQuickCalibrationImpl& HapticGloveQuickCalibrationImpl) : #if ENGINE_MAJOR_VERSION == 5 || ( ENGINE_MAJOR_VERSION == 4 && ENGINE_MINOR_VERSION > 24 ) Pimpl(TUniquePtr(new FImpl{this}, PimplDeleter)) #else Pimpl(TUniquePtr(new FImpl{this})) #endif /* ENGINE_MAJOR_VERSION == 5 || ( ENGINE_MAJOR_VERSION == 4 && ENGINE_MINOR_VERSION > 24 ) */ { FSGIC_TSharedPtr_FSGHapticGloveQuickCalibrationImpl OutSharedPtrContainer; FSGIC_FSGHapticGloveQuickCalibrationImpl RhsContainer{HapticGloveQuickCalibrationImpl}; SGCoreImpl_FSGHapticGloveQuickCalibrationImpl_ctor_copy_MakeShared( &OutSharedPtrContainer, &RhsContainer); Pimpl->HapticGloveCalibrationSequenceImpl = MoveTemp(OutSharedPtrContainer.Ptr); Pimpl->SyncUProperties(); } USGHapticGloveCalibrationSequence::USGHapticGloveCalibrationSequence( TSharedRef HapticGloveCalibrationSequenceImpl) : #if ENGINE_MAJOR_VERSION == 5 || ( ENGINE_MAJOR_VERSION == 4 && ENGINE_MINOR_VERSION > 24 ) Pimpl(TUniquePtr(new FImpl{this}, PimplDeleter)) #else Pimpl(TUniquePtr(new FImpl{this})) #endif /* ENGINE_MAJOR_VERSION == 5 || ( ENGINE_MAJOR_VERSION == 4 && ENGINE_MINOR_VERSION > 24 ) */ { Pimpl->HapticGloveCalibrationSequenceImpl = MoveTemp(HapticGloveCalibrationSequenceImpl); Pimpl->SyncUProperties(); } USGHapticGloveCalibrationSequence::USGHapticGloveCalibrationSequence( TSharedRef HapticGloveQuickCalibrationImpl) : #if ENGINE_MAJOR_VERSION == 5 || ( ENGINE_MAJOR_VERSION == 4 && ENGINE_MINOR_VERSION > 24 ) Pimpl(TUniquePtr(new FImpl{this}, PimplDeleter)) #else Pimpl(TUniquePtr(new FImpl{this})) #endif /* ENGINE_MAJOR_VERSION == 5 || ( ENGINE_MAJOR_VERSION == 4 && ENGINE_MINOR_VERSION > 24 ) */ { Pimpl->HapticGloveCalibrationSequenceImpl = MoveTemp(HapticGloveQuickCalibrationImpl); Pimpl->SyncUProperties(); } USGHapticGloveCalibrationSequence::~USGHapticGloveCalibrationSequence() = default; void USGHapticGloveCalibrationSequence::SetHapticGloveCalibrationSequenceImpl( const FSGHapticGloveCalibrationSequenceImpl& HapticGloveCalibrationSequenceImpl) { FSGIC_TSharedPtr_FSGHapticGloveCalibrationSequenceImpl OutSharedPtrContainer; FSGIC_FSGHapticGloveCalibrationSequenceImpl RhsContainer{HapticGloveCalibrationSequenceImpl}; SGCoreImpl_FSGHapticGloveCalibrationSequenceImpl_ctor_copy_MakeShared(&OutSharedPtrContainer, &RhsContainer); Pimpl->HapticGloveCalibrationSequenceImpl = MoveTemp(OutSharedPtrContainer.Ptr); } void USGHapticGloveCalibrationSequence::SetHapticGloveCalibrationSequenceImpl( const FSGHapticGloveQuickCalibrationImpl& HapticGloveQuickCalibrationImpl) { FSGIC_TSharedPtr_FSGHapticGloveQuickCalibrationImpl OutSharedPtrContainer; FSGIC_FSGHapticGloveQuickCalibrationImpl RhsContainer{HapticGloveQuickCalibrationImpl}; SGCoreImpl_FSGHapticGloveQuickCalibrationImpl_ctor_copy_MakeShared(&OutSharedPtrContainer, &RhsContainer); Pimpl->HapticGloveCalibrationSequenceImpl = MoveTemp(OutSharedPtrContainer.Ptr); } void USGHapticGloveCalibrationSequence::SetHapticGloveCalibrationSequenceImpl( TSharedRef HapticGloveCalibrationSequenceImpl) { Pimpl->HapticGloveCalibrationSequenceImpl = MoveTemp(HapticGloveCalibrationSequenceImpl); } void USGHapticGloveCalibrationSequence::SetHapticGloveCalibrationSequenceImpl( TSharedRef HapticGloveQuickCalibrationImpl) { Pimpl->HapticGloveCalibrationSequenceImpl = MoveTemp(HapticGloveQuickCalibrationImpl); } TSharedRef USGHapticGloveCalibrationSequence::ToHapticGloveCalibrationSequenceImpl() const { SyncImplObject(); return Pimpl->HapticGloveCalibrationSequenceImpl.ToSharedRef(); } void USGHapticGloveCalibrationSequence::SyncImplObject() const { Pimpl->SyncImplObject(); } void USGHapticGloveCalibrationSequence::SyncUProperties() { Pimpl->SyncUProperties(); } USGHapticGlove* USGHapticGloveCalibrationSequence::GetLinkedGlove(UObject* Outer) const { SyncImplObject(); FSGIC_TSharedPtr_FSGHapticGloveCalibrationSequenceImpl InstanceContainer{ToHapticGloveCalibrationSequenceImpl()}; FSGIC_TSharedPtr_FSGHapticGloveImpl OutGloveContainer; SGCoreImpl_FSGHapticGloveCalibrationSequenceImpl_GetLinkedGlove(&InstanceContainer, &OutGloveContainer); return USGHapticGlove::NewHapticGlove(Outer, OutGloveContainer.Ptr.ToSharedRef()); } void USGHapticGloveCalibrationSequence::SetLinkedGlove(const USGHapticGlove* LinkedGlove) { SyncImplObject(); FSGIC_TSharedPtr_FSGHapticGloveCalibrationSequenceImpl InstanceContainer{ToHapticGloveCalibrationSequenceImpl()}; FSGIC_TSharedPtr_FSGHapticGloveImpl LinkedGloveContainer{LinkedGlove->ToHapticGloveImpl()}; SGCoreImpl_FSGHapticGloveCalibrationSequenceImpl_SetLinkedGlove(&InstanceContainer, &LinkedGloveContainer); SyncUProperties(); } TArray USGHapticGloveCalibrationSequence::GetCalibrationPoints(UObject* Outer) const { SyncImplObject(); FSGIC_TSharedPtr_FSGHapticGloveCalibrationSequenceImpl InstanceContainer{ToHapticGloveCalibrationSequenceImpl()}; FSGIC_TArray_FSGCalibrationDataPointImpl OutPoints; SGCoreImpl_FSGHapticGloveCalibrationSequenceImpl_GetCalibrationPoints(&InstanceContainer, &OutPoints); TArray Points{ FSGArrayUtils::FromImplType( Outer, MoveTemp(OutPoints.Array)) }; return MoveTemp(Points); } float USGHapticGloveCalibrationSequence::GetElapsedTime() const { SyncImplObject(); FSGIC_TSharedPtr_FSGHapticGloveCalibrationSequenceImpl InstanceContainer{ToHapticGloveCalibrationSequenceImpl()}; return SGCoreImpl_FSGHapticGloveCalibrationSequenceImpl_GetElapsedTime(&InstanceContainer); } bool USGHapticGloveCalibrationSequence::IsManuallyCompleted() const { SyncImplObject(); FSGIC_TSharedPtr_FSGHapticGloveCalibrationSequenceImpl InstanceContainer{ToHapticGloveCalibrationSequenceImpl()}; return SGCoreImpl_FSGHapticGloveCalibrationSequenceImpl_IsManuallyCompleted(&InstanceContainer); } int32 USGHapticGloveCalibrationSequence::GetCurrentStage() const { SyncImplObject(); FSGIC_TSharedPtr_FSGHapticGloveCalibrationSequenceImpl InstanceContainer{ToHapticGloveCalibrationSequenceImpl()}; return SGCoreImpl_FSGHapticGloveCalibrationSequenceImpl_GetCurrentStage(&InstanceContainer); } SIZE_T USGHapticGloveCalibrationSequence::GetCalibrationPointsCount() const { SyncImplObject(); FSGIC_TSharedPtr_FSGHapticGloveCalibrationSequenceImpl InstanceContainer{ToHapticGloveCalibrationSequenceImpl()}; return SGCoreImpl_FSGHapticGloveCalibrationSequenceImpl_GetCalibrationPointsCount(&InstanceContainer); } bool USGHapticGloveCalibrationSequence::AutoCompleted() const { SyncImplObject(); FSGIC_TSharedPtr_FSGHapticGloveCalibrationSequenceImpl InstanceContainer{ToHapticGloveCalibrationSequenceImpl()}; return SGCoreImpl_FSGHapticGloveCalibrationSequenceImpl_AutoCompleted(&InstanceContainer); } bool USGHapticGloveCalibrationSequence::Completed() const { SyncImplObject(); FSGIC_TSharedPtr_FSGHapticGloveCalibrationSequenceImpl InstanceContainer{ToHapticGloveCalibrationSequenceImpl()}; return SGCoreImpl_FSGHapticGloveCalibrationSequenceImpl_Completed(&InstanceContainer); } void USGHapticGloveCalibrationSequence::Reset() { SyncImplObject(); FSGIC_TSharedPtr_FSGHapticGloveCalibrationSequenceImpl InstanceContainer{ToHapticGloveCalibrationSequenceImpl()}; SGCoreImpl_FSGHapticGloveCalibrationSequenceImpl_Reset(&InstanceContainer); SyncUProperties(); } void USGHapticGloveCalibrationSequence::AddDataPoint(const TArray& CalibrationPoints) { SyncImplObject(); FSGIC_TSharedPtr_FSGHapticGloveCalibrationSequenceImpl InstanceContainer{ToHapticGloveCalibrationSequenceImpl()}; FSGIC_TArray_FVector CalibrationPointsContainer{CalibrationPoints}; SGCoreImpl_FSGHapticGloveCalibrationSequenceImpl_AddDataPoint(&InstanceContainer, &CalibrationPointsContainer); SyncUProperties(); } void USGHapticGloveCalibrationSequence::Update(const float DeltaSeconds) { SyncImplObject(); FSGIC_TSharedPtr_FSGHapticGloveCalibrationSequenceImpl InstanceContainer{ToHapticGloveCalibrationSequenceImpl()}; SGCoreImpl_FSGHapticGloveCalibrationSequenceImpl_Update(&InstanceContainer, DeltaSeconds); SyncUProperties(); } void USGHapticGloveCalibrationSequence::ConfirmCurrentStep() { SyncImplObject(); FSGIC_TSharedPtr_FSGHapticGloveCalibrationSequenceImpl InstanceContainer{ToHapticGloveCalibrationSequenceImpl()}; SGCoreImpl_FSGHapticGloveCalibrationSequenceImpl_ConfirmCurrentStep(&InstanceContainer); SyncUProperties(); } bool USGHapticGloveCalibrationSequence::CompileRange(UObject* Outer, USGSensorRange*& OutSensorRange) const { SyncImplObject(); FSGIC_TSharedPtr_FSGHapticGloveCalibrationSequenceImpl InstanceContainer{ToHapticGloveCalibrationSequenceImpl()}; FSGIC_FSGSensorRangeImpl OutSensorRangeContainer; const bool bResult = SGCoreImpl_FSGHapticGloveCalibrationSequenceImpl_CompileRange( &InstanceContainer, &OutSensorRangeContainer); if (bResult) { OutSensorRange = USGSensorRange::NewSensorRange(Outer, MoveTemp(OutSensorRangeContainer.SensorRangeImpl)); } return bResult; } bool USGHapticGloveCalibrationSequence::CompileProfile(UObject* Outer, const ESGDeviceType ForDevice, const bool bRightHanded, USGHandProfile*& OutProfile) const { SyncImplObject(); FSGIC_TSharedPtr_FSGHapticGloveCalibrationSequenceImpl InstanceContainer{ToHapticGloveCalibrationSequenceImpl()}; FSGIC_ESGDeviceType ForDeviceContainer{ForDevice}; FSGIC_FSGHandProfileImpl OutProfileContainer; const bool bResult = SGCoreImpl_FSGHapticGloveCalibrationSequenceImpl_CompileProfile_ForDevice_bRightHanded_OutProfile( &InstanceContainer, &ForDeviceContainer, bRightHanded, &OutProfileContainer); if (bResult) { OutProfile = USGHandProfile::NewHandProfile(Outer, MoveTemp(OutProfileContainer.HandProfileImpl)); } return bResult; } bool USGHapticGloveCalibrationSequence::GetHandPose(UObject* Outer, USGHandPose*& OutCurrentHandPose) const { SyncImplObject(); FSGIC_TSharedPtr_FSGHapticGloveCalibrationSequenceImpl InstanceContainer{ToHapticGloveCalibrationSequenceImpl()}; FSGIC_FSGHandPoseImpl OutCurrentHandPoseContainer; const bool bResult = SGCoreImpl_FSGHapticGloveCalibrationSequenceImpl_GetHandPose_OutCurrentHandPose( &InstanceContainer, &OutCurrentHandPoseContainer); if (bResult) { OutCurrentHandPose = USGHandPose::NewHandPose(Outer, MoveTemp(OutCurrentHandPoseContainer.HandPoseImpl)); } return bResult; } bool USGHapticGloveCalibrationSequence::GetHandPose(UObject* Outer, const bool bRightHanded, USGHandPose*& OutCurrentHandPose) const { SyncImplObject(); FSGIC_TSharedPtr_FSGHapticGloveCalibrationSequenceImpl InstanceContainer{ToHapticGloveCalibrationSequenceImpl()}; FSGIC_FSGHandPoseImpl OutCurrentHandPoseContainer; const bool bResult = SGCoreImpl_FSGHapticGloveCalibrationSequenceImpl_GetHandPose_bRightHanded_OutCurrentHandPose( &InstanceContainer, bRightHanded, &OutCurrentHandPoseContainer); if (bResult) { OutCurrentHandPose = USGHandPose::NewHandPose(Outer, MoveTemp(OutCurrentHandPoseContainer.HandPoseImpl)); } return bResult; } FString USGHapticGloveCalibrationSequence::GetCurrentInstruction(const FString& NextStepKey) const { SyncImplObject(); FSGIC_TSharedPtr_FSGHapticGloveCalibrationSequenceImpl InstanceContainer{ToHapticGloveCalibrationSequenceImpl()}; FSGIC_FString OutInstructionContainer; FSGIC_FString NextStepKeyContainer{NextStepKey}; SGCoreImpl_FSGHapticGloveCalibrationSequenceImpl_GetCurrentInstruction( &InstanceContainer, &OutInstructionContainer, &NextStepKeyContainer); return MoveTemp(OutInstructionContainer.String); } USGHapticGloveCalibrationSequence::FImpl::FImpl(USGHapticGloveCalibrationSequence* InOwner) : Owner(InOwner) { } USGHapticGloveCalibrationSequence::FImpl::~FImpl() = default; void USGHapticGloveCalibrationSequence::FImplDeleter::operator()(const FImpl* P) const { delete P; } void USGHapticGloveCalibrationSequence::FImpl::SyncUProperties() { } void USGHapticGloveCalibrationSequence::FImpl::SyncImplObject() { }