/** * @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/SGHapticGloveQuickCalibration.h" #include "SGHapticGloveCalibrationSequenceImplCast.h" #include "Runtime/Launch/Resources/Version.h" #include "SGCoreImpl/SGExportedFunctions.h" #include "SGInterop/SGIC_FSGHandPoseImpl.h" #include "SGInterop/SGIC_FSGHandProfileImpl.h" #include "SGInterop/SGIC_FSGSensorRangeImpl.h" #include "SGInterop/SGIC_FString.h" #include "SGInterop/SGIC_TArray_FVector.h" #include "SGInterop/SGIC_TSharedPtr_FSGHapticGloveImpl.h" #include "SGInterop/SGIC_TSharedPtr_FSGHapticGloveQuickCalibrationImpl.h" #include "SGUtils/SGArrayUtils.h" struct USGHapticGloveQuickCalibration::FImpl { /************************ * Member variables ************************/ /************************ * Owner object ************************/ USGHapticGloveQuickCalibration* Owner; /************************ * Constructor / Destructor ************************/ explicit FImpl(USGHapticGloveQuickCalibration* InOwner); ~FImpl(); /************************ * Default copy constructor & copy assignment operator ************************/ FImpl(const FImpl& Rhs) = default; FImpl& operator=(const FImpl& Rhs) = default; /************************ * Methods ************************/ void SyncUProperties(); void SyncImplObject(); }; USGHapticGloveQuickCalibration* USGHapticGloveQuickCalibration::NewHapticGloveQuickCalibration(UObject* Outer, const FSGHapticGloveQuickCalibrationImpl& HapticGloveQuickCalibration) { USGHapticGloveQuickCalibration* Instance = NewObject(Outer); Instance->SetHapticGloveCalibrationSequenceImpl(HapticGloveQuickCalibration); return Instance; } USGHapticGloveQuickCalibration* USGHapticGloveQuickCalibration::NewHapticGloveQuickCalibration(UObject* Outer, TSharedRef HapticGloveQuickCalibration) { USGHapticGloveQuickCalibration* Instance = NewObject(Outer); Instance->SetHapticGloveCalibrationSequenceImpl(MoveTemp(HapticGloveQuickCalibration)); return Instance; } USGHapticGloveQuickCalibration* USGHapticGloveQuickCalibration::NewHapticGloveQuickCalibration(UObject* Outer) { FSGIC_TSharedPtr_FSGHapticGloveQuickCalibrationImpl OutSharedPtrContainer; SGCoreImpl_FSGHapticGloveQuickCalibrationImpl_ctor_MakeShared(&OutSharedPtrContainer); return NewHapticGloveQuickCalibration(Outer, OutSharedPtrContainer.Ptr.ToSharedRef()); } USGHapticGloveQuickCalibration* USGHapticGloveQuickCalibration::NewHapticGloveQuickCalibration(UObject* Outer, const USGHapticGlove* GloveToCalibrate, float AutoEndTimeout) { FSGIC_TSharedPtr_FSGHapticGloveQuickCalibrationImpl OutSharedPtrContainer; FSGIC_TSharedPtr_FSGHapticGloveImpl GloveToCalibrateContainer{GloveToCalibrate->ToHapticGloveImpl()}; SGCoreImpl_FSGHapticGloveQuickCalibrationImpl_ctor_GloveToCalibrate_AutoEndTimeout_MakeShared( &OutSharedPtrContainer, &GloveToCalibrateContainer, AutoEndTimeout); return NewHapticGloveQuickCalibration(Outer, OutSharedPtrContainer.Ptr.ToSharedRef()); } float USGHapticGloveQuickCalibration::GetDefaultAutoEndTimeout() { return SGCoreImpl_FSGHapticGloveQuickCalibrationImpl_GetDefaultAutoEndTimeout(); } USGHapticGloveQuickCalibration::USGHapticGloveQuickCalibration() : 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_FSGHapticGloveQuickCalibrationImpl OutSharedPtrContainer; SGCoreImpl_FSGHapticGloveQuickCalibrationImpl_ctor_MakeShared(&OutSharedPtrContainer); SetHapticGloveCalibrationSequenceImpl(OutSharedPtrContainer.Ptr.ToSharedRef()); Pimpl->SyncUProperties(); } USGHapticGloveQuickCalibration::USGHapticGloveQuickCalibration( const USGHapticGlove* GloveToCalibrate, const float AutoEndTimeout) : USGHapticGloveCalibrationSequence(GloveToCalibrate), #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_TSharedPtr_FSGHapticGloveImpl GloveToCalibrateContainer{GloveToCalibrate->ToHapticGloveImpl()}; SGCoreImpl_FSGHapticGloveQuickCalibrationImpl_ctor_GloveToCalibrate_AutoEndTimeout_MakeShared( &OutSharedPtrContainer, &GloveToCalibrateContainer, AutoEndTimeout); SetHapticGloveCalibrationSequenceImpl(OutSharedPtrContainer.Ptr.ToSharedRef()); Pimpl->SyncUProperties(); } USGHapticGloveQuickCalibration::USGHapticGloveQuickCalibration( const FSGHapticGloveQuickCalibrationImpl& HapticGloveQuickCalibrationImpl) : USGHapticGloveCalibrationSequence(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->SyncUProperties(); } USGHapticGloveQuickCalibration::USGHapticGloveQuickCalibration( TSharedRef HapticGloveQuickCalibrationImpl) : USGHapticGloveCalibrationSequence(MoveTemp(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->SyncUProperties(); } USGHapticGloveQuickCalibration::~USGHapticGloveQuickCalibration() = default; TSharedRef USGHapticGloveQuickCalibration::ToHapticGloveQuickCalibrationImpl() const { SyncImplObject(); return FSGHapticGloveCalibrationSequenceImplCast::ToHapticGloveQuickCalibrationImpl( ToHapticGloveCalibrationSequenceImpl()); } void USGHapticGloveQuickCalibration::SyncImplObject() const { Super::SyncImplObject(); Pimpl->SyncImplObject(); } void USGHapticGloveQuickCalibration::SyncUProperties() { Super::SyncUProperties(); Pimpl->SyncUProperties(); } float USGHapticGloveQuickCalibration::GetAutoEndTimeout() const { FSGIC_TSharedPtr_FSGHapticGloveQuickCalibrationImpl InstanceContainer{ToHapticGloveQuickCalibrationImpl()}; return SGCoreImpl_FSGHapticGloveQuickCalibrationImpl_GetAutoEndTimeout(&InstanceContainer); } int32 USGHapticGloveQuickCalibration::GetSmoothingSamples() const { SyncImplObject(); FSGIC_TSharedPtr_FSGHapticGloveQuickCalibrationImpl InstanceContainer{ToHapticGloveQuickCalibrationImpl()}; return SGCoreImpl_FSGHapticGloveQuickCalibrationImpl_GetSmoothingSamples(&InstanceContainer); } USGSensorRange* USGHapticGloveQuickCalibration::GetSensorRange(UObject* Outer) const { SyncImplObject(); FSGIC_TSharedPtr_FSGHapticGloveQuickCalibrationImpl InstanceContainer{ToHapticGloveQuickCalibrationImpl()}; FSGIC_FSGSensorRangeImpl OutRangeContainer; SGCoreImpl_FSGHapticGloveQuickCalibrationImpl_GetSensorRange(&InstanceContainer, &OutRangeContainer); return USGSensorRange::NewSensorRange(Outer, MoveTemp(OutRangeContainer.SensorRangeImpl)); } USGHandProfile* USGHapticGloveQuickCalibration::GetTemporaryProfile(UObject* Outer) const { SyncImplObject(); FSGIC_TSharedPtr_FSGHapticGloveQuickCalibrationImpl InstanceContainer{ToHapticGloveQuickCalibrationImpl()}; FSGIC_FSGHandProfileImpl OutProfileContainer; SGCoreImpl_FSGHapticGloveQuickCalibrationImpl_GetTemporaryProfile(&InstanceContainer, &OutProfileContainer); return USGHandProfile::NewHandProfile(Outer, MoveTemp(OutProfileContainer.HandProfileImpl)); } bool USGHapticGloveQuickCalibration::CanAnimate() const { SyncImplObject(); FSGIC_TSharedPtr_FSGHapticGloveQuickCalibrationImpl InstanceContainer{ToHapticGloveQuickCalibrationImpl()}; return SGCoreImpl_FSGHapticGloveQuickCalibrationImpl_CanAnimate(&InstanceContainer); } bool USGHapticGloveQuickCalibration::AutoCompleted() const { SyncImplObject(); FSGIC_TSharedPtr_FSGHapticGloveQuickCalibrationImpl InstanceContainer{ToHapticGloveQuickCalibrationImpl()}; return SGCoreImpl_FSGHapticGloveQuickCalibrationImpl_AutoCompleted(&InstanceContainer); } void USGHapticGloveQuickCalibration::Reset() { SyncImplObject(); FSGIC_TSharedPtr_FSGHapticGloveQuickCalibrationImpl InstanceContainer{ToHapticGloveQuickCalibrationImpl()}; SGCoreImpl_FSGHapticGloveQuickCalibrationImpl_Reset(&InstanceContainer); SyncUProperties(); } void USGHapticGloveQuickCalibration::Update(const float DeltaSeconds) { SyncImplObject(); FSGIC_TSharedPtr_FSGHapticGloveQuickCalibrationImpl InstanceContainer{ToHapticGloveQuickCalibrationImpl()}; SGCoreImpl_FSGHapticGloveQuickCalibrationImpl_Update(&InstanceContainer, DeltaSeconds); SyncUProperties(); } void USGHapticGloveQuickCalibration::AddDataPoint(const TArray& CalibrationPoints) { SyncImplObject(); FSGIC_TSharedPtr_FSGHapticGloveQuickCalibrationImpl InstanceContainer{ToHapticGloveQuickCalibrationImpl()}; FSGIC_TArray_FVector CalibrationPointsContainer{CalibrationPoints}; SGCoreImpl_FSGHapticGloveQuickCalibrationImpl_AddDataPoint(&InstanceContainer, &CalibrationPointsContainer); SyncUProperties(); } void USGHapticGloveQuickCalibration::ConfirmCurrentStep() { SyncImplObject(); FSGIC_TSharedPtr_FSGHapticGloveQuickCalibrationImpl InstanceContainer{ToHapticGloveQuickCalibrationImpl()}; SGCoreImpl_FSGHapticGloveQuickCalibrationImpl_ConfirmCurrentStep(&InstanceContainer); SyncUProperties(); } bool USGHapticGloveQuickCalibration::CompileRange(UObject* Outer, USGSensorRange*& OutSensorRange) const { SyncImplObject(); FSGIC_TSharedPtr_FSGHapticGloveQuickCalibrationImpl InstanceContainer{ToHapticGloveQuickCalibrationImpl()}; FSGIC_FSGSensorRangeImpl OutSensorRangeContainer; const bool bResult = SGCoreImpl_FSGHapticGloveQuickCalibrationImpl_CompileRange( &InstanceContainer, &OutSensorRangeContainer); OutSensorRange = USGSensorRange::NewSensorRange(Outer, MoveTemp(OutSensorRangeContainer.SensorRangeImpl)); return bResult; } bool USGHapticGloveQuickCalibration::GetHandPose(UObject* Outer, const bool bRightHanded, USGHandPose*& OutCurrentHandPose) const { SyncImplObject(); FSGIC_TSharedPtr_FSGHapticGloveQuickCalibrationImpl InstanceContainer{ToHapticGloveQuickCalibrationImpl()}; FSGIC_FSGHandPoseImpl OutCurrentHandPoseContainer; const bool bResult = SGCoreImpl_FSGHapticGloveQuickCalibrationImpl_GetHandPose( &InstanceContainer, bRightHanded, &OutCurrentHandPoseContainer); OutCurrentHandPose = USGHandPose::NewHandPose(Outer, MoveTemp(OutCurrentHandPoseContainer.HandPoseImpl)); return bResult; } FString USGHapticGloveQuickCalibration::GetCurrentInstruction(const FString& NextStepKey) const { SyncImplObject(); FSGIC_TSharedPtr_FSGHapticGloveQuickCalibrationImpl InstanceContainer{ToHapticGloveQuickCalibrationImpl()}; FSGIC_FString OutInstructionContainer; FSGIC_FString NextStepKeyContainer{NextStepKey}; SGCoreImpl_FSGHapticGloveQuickCalibrationImpl_GetCurrentInstruction( &InstanceContainer, &OutInstructionContainer, &NextStepKeyContainer); return MoveTemp(OutInstructionContainer.String); } USGHapticGloveQuickCalibration::FImpl::FImpl(USGHapticGloveQuickCalibration* InOwner) : Owner(InOwner) { } USGHapticGloveQuickCalibration::FImpl::~FImpl() = default; void USGHapticGloveQuickCalibration::FImplDeleter::operator()(const FImpl* P) const { delete P; } void USGHapticGloveQuickCalibration::FImpl::SyncUProperties() { } void USGHapticGloveQuickCalibration::FImpl::SyncImplObject() { }