/** * @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/SGNovaGloveInfo.h" #include "Runtime/Launch/Resources/Version.h" #include "SGCoreImpl/SGExportedFunctions.h" #include "SGInterop/SGIC_FQuat.h" #include "SGInterop/SGIC_FSGNovaGloveInfoImpl.h" #include "SGInterop/SGIC_FString.h" struct USGNovaGloveInfo::FImpl { /************************ * Member variables ************************/ FSGNovaGloveInfoImpl NovaGloveInfoImpl; /************************ * Owner object ************************/ USGNovaGloveInfo* Owner; /************************ * Constructor / Destructor ************************/ explicit FImpl(USGNovaGloveInfo* InOwner); ~FImpl(); /************************ * Default copy constructor & copy assignment operator ************************/ FImpl(const FImpl& Rhs) = default; FImpl& operator=(const FImpl& Rhs) = default; /************************ * Methods ************************/ void SyncUProperties(); void SyncImplObject(); }; USGNovaGloveInfo* USGNovaGloveInfo::NewNovaGloveInfo(UObject* Outer, const FSGNovaGloveInfoImpl& NovaGloveInfoImpl) { USGNovaGloveInfo* Instance = NewObject(Outer); Instance->SetNovaGloveInfoImpl(NovaGloveInfoImpl); return Instance; } USGNovaGloveInfo* USGNovaGloveInfo::NewNovaGloveInfo(UObject* Outer) { FSGIC_FSGNovaGloveInfoImpl OutNovaGloveInfoImplContainer; SGCoreImpl_FSGNovaGloveInfoImpl_ctor(&OutNovaGloveInfoImplContainer); return NewNovaGloveInfo(Outer, MoveTemp(OutNovaGloveInfoImplContainer.NovaGloveInfoImpl)); } USGNovaGloveInfo* USGNovaGloveInfo::NewNovaGloveInfo(UObject* Outer, const FString& DeviceId, const FString& HardwareVersion, int32 FirmwareVersion, int32 SubFirmwareVersion, bool bRightHanded, const FQuat& ImuCorrection, int32 NumberOfSensors) { FSGIC_FSGNovaGloveInfoImpl OutNovaGloveInfoImplContainer; FSGIC_FString DeviceIdContainer{DeviceId}; FSGIC_FString HardwareVersionContainer{HardwareVersion}; FSGIC_FQuat ImuCorrectionContainer{ImuCorrection}; SGCoreImpl_FSGNovaGloveInfoImpl_ctor_DeviceId_HardwareVersion_FirmwareVersion_SubFirmwareVersion_bRightHanded_ImuCorrection_NumberOfSensors( &OutNovaGloveInfoImplContainer, &DeviceIdContainer, &HardwareVersionContainer, FirmwareVersion, SubFirmwareVersion, bRightHanded, &ImuCorrectionContainer, NumberOfSensors); return NewNovaGloveInfo(Outer, MoveTemp(OutNovaGloveInfoImplContainer.NovaGloveInfoImpl)); } bool USGNovaGloveInfo::Parse(UObject* Outer, const FString& ConstantsString, USGNovaGloveInfo*& OutGloveInfo) { FSGIC_FString ConstantsStringContainer{ConstantsString}; FSGIC_FSGNovaGloveInfoImpl OutGloveInfoImplContainer; const bool bResult = SGCoreImpl_FSGNovaGloveInfoImpl_Parse(&ConstantsStringContainer, &OutGloveInfoImplContainer); if (bResult) { OutGloveInfo = NewNovaGloveInfo(Outer, MoveTemp(OutGloveInfoImplContainer.NovaGloveInfoImpl)); } return bResult; } USGNovaGloveInfo* USGNovaGloveInfo::Deserialize(UObject* Outer, const FString& SerializedString) { FSGIC_FString SerializedStringContainer{SerializedString}; FSGIC_FSGNovaGloveInfoImpl OutNovaGloveInfoImplContainer; SGCoreImpl_FSGNovaGloveInfoImpl_Deserialize(&OutNovaGloveInfoImplContainer, &SerializedStringContainer); return NewNovaGloveInfo(Outer, MoveTemp(OutNovaGloveInfoImplContainer.NovaGloveInfoImpl)); } USGNovaGloveInfo::USGNovaGloveInfo() : #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_FSGNovaGloveInfoImpl OutNovaGloveInfoImplContainer; SGCoreImpl_FSGNovaGloveInfoImpl_ctor(&OutNovaGloveInfoImplContainer); Pimpl->NovaGloveInfoImpl = MoveTemp(OutNovaGloveInfoImplContainer.NovaGloveInfoImpl); Pimpl->SyncUProperties(); } USGNovaGloveInfo::USGNovaGloveInfo( const FString& DeviceId, const FString& HardwareVersion, const int32 FirmwareVersion, const int32 SubFirmwareVersion, const bool bRightHanded, const FQuat& ImuCorrection, const int32 NumberOfSensors) : #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_FSGNovaGloveInfoImpl OutNovaGloveInfoImplContainer; FSGIC_FString DeviceIdContainer{DeviceId}; FSGIC_FString HardwareVersionContainer{HardwareVersion}; FSGIC_FQuat ImuCorrectionContainer{ImuCorrection}; SGCoreImpl_FSGNovaGloveInfoImpl_ctor_DeviceId_HardwareVersion_FirmwareVersion_SubFirmwareVersion_bRightHanded_ImuCorrection_NumberOfSensors( &OutNovaGloveInfoImplContainer, &DeviceIdContainer, &HardwareVersionContainer, FirmwareVersion, SubFirmwareVersion, bRightHanded, &ImuCorrectionContainer, NumberOfSensors); Pimpl->NovaGloveInfoImpl = MoveTemp(OutNovaGloveInfoImplContainer.NovaGloveInfoImpl); Pimpl->SyncUProperties(); } USGNovaGloveInfo::USGNovaGloveInfo(const FSGNovaGloveInfoImpl& NovaGloveInfoImpl) : #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 ) */ { SetNovaGloveInfoImpl(NovaGloveInfoImpl); Pimpl->SyncUProperties(); } USGNovaGloveInfo::~USGNovaGloveInfo() = default; void USGNovaGloveInfo::SetNovaGloveInfoImpl(const FSGNovaGloveInfoImpl& NovaGloveInfoImpl) { FSGIC_FSGNovaGloveInfoImpl OutNovaGloveInfoContainer; FSGIC_FSGNovaGloveInfoImpl RhsContainer{NovaGloveInfoImpl}; SGCoreImpl_FSGNovaGloveInfoImpl_ctor_copy(&OutNovaGloveInfoContainer, &RhsContainer); Pimpl->NovaGloveInfoImpl = MoveTemp(OutNovaGloveInfoContainer.NovaGloveInfoImpl); } const FSGNovaGloveInfoImpl& USGNovaGloveInfo::ToNovaGloveInfoImpl() const { Pimpl->SyncImplObject(); return Pimpl->NovaGloveInfoImpl; } FSGNovaGloveInfoImpl& USGNovaGloveInfo::ToNovaGloveInfoImpl() { Pimpl->SyncImplObject(); return Pimpl->NovaGloveInfoImpl; } FString USGNovaGloveInfo::GetDeviceId() const { FSGIC_FSGNovaGloveInfoImpl InstanceContainer{ToNovaGloveInfoImpl()}; FSGIC_FString OutIdContainer; SGCoreImpl_FSGNovaGloveInfoImpl_GetDeviceId(&InstanceContainer, &OutIdContainer); return MoveTemp(OutIdContainer.String); } FString USGNovaGloveInfo::GetHardwareVersion() const { FSGIC_FSGNovaGloveInfoImpl InstanceContainer{ToNovaGloveInfoImpl()}; FSGIC_FString OutVersionContainer; SGCoreImpl_FSGNovaGloveInfoImpl_GetHardwareVersion(&InstanceContainer, &OutVersionContainer); return MoveTemp(OutVersionContainer.String); } int32 USGNovaGloveInfo::GetFirmwareVersion() const { FSGIC_FSGNovaGloveInfoImpl InstanceContainer{ToNovaGloveInfoImpl()}; return SGCoreImpl_FSGNovaGloveInfoImpl_GetFirmwareVersion(&InstanceContainer); } int32 USGNovaGloveInfo::GetSubFirmwareVersion() const { FSGIC_FSGNovaGloveInfoImpl InstanceContainer{ToNovaGloveInfoImpl()}; return SGCoreImpl_FSGNovaGloveInfoImpl_GetSubFirmwareVersion(&InstanceContainer); } bool USGNovaGloveInfo::IsRight() const { FSGIC_FSGNovaGloveInfoImpl InstanceContainer{ToNovaGloveInfoImpl()}; return SGCoreImpl_FSGNovaGloveInfoImpl_IsRight(&InstanceContainer); } FQuat USGNovaGloveInfo::GetImuCorrectionQ() const { FSGIC_FSGNovaGloveInfoImpl InstanceContainer{ToNovaGloveInfoImpl()}; FSGIC_FQuat OutCorrectionContainer; SGCoreImpl_FSGNovaGloveInfoImpl_GetImuCorrection(&InstanceContainer, &OutCorrectionContainer); return MoveTemp(OutCorrectionContainer.Quat); } FRotator USGNovaGloveInfo::GetImuCorrection() const { FSGIC_FSGNovaGloveInfoImpl InstanceContainer{ToNovaGloveInfoImpl()}; FSGIC_FQuat OutCorrectionContainer; SGCoreImpl_FSGNovaGloveInfoImpl_GetImuCorrection(&InstanceContainer, &OutCorrectionContainer); return OutCorrectionContainer.Quat.Rotator(); } int32 USGNovaGloveInfo::GetNumberOfSensors() const { FSGIC_FSGNovaGloveInfoImpl InstanceContainer{ToNovaGloveInfoImpl()}; return SGCoreImpl_FSGNovaGloveInfoImpl_GetNumberOfSensors(&InstanceContainer); } bool USGNovaGloveInfo::Equals(const USGNovaGloveInfo* NovaGloveInfo) const { Pimpl->SyncImplObject(); FSGIC_FSGNovaGloveInfoImpl InstanceContainer{ToNovaGloveInfoImpl()}; FSGIC_FSGNovaGloveInfoImpl NovaGloveInfoImplContainer{NovaGloveInfo->ToNovaGloveInfoImpl()}; return SGCoreImpl_FSGNovaGloveInfoImpl_Equals(&InstanceContainer, &NovaGloveInfoImplContainer); } FString USGNovaGloveInfo::ToString() const { Pimpl->SyncImplObject(); FSGIC_FSGNovaGloveInfoImpl InstanceContainer{ToNovaGloveInfoImpl()}; FSGIC_FString OutStringContainer; SGCoreImpl_FSGNovaGloveInfoImpl_ToString(&InstanceContainer, &OutStringContainer); return MoveTemp(OutStringContainer.String); } FString USGNovaGloveInfo::SGSerialize() const { Pimpl->SyncImplObject(); FSGIC_FSGNovaGloveInfoImpl InstanceContainer{ToNovaGloveInfoImpl()}; FSGIC_FString OutStringContainer; SGCoreImpl_FSGNovaGloveInfoImpl_Serialize(&InstanceContainer, &OutStringContainer); return MoveTemp(OutStringContainer.String); } USGNovaGloveInfo::FImpl::FImpl(USGNovaGloveInfo* InOwner) : Owner(InOwner) { } USGNovaGloveInfo::FImpl::~FImpl() = default; void USGNovaGloveInfo::FImplDeleter::operator()(const FImpl* P) const { delete P; } void USGNovaGloveInfo::FImpl::SyncUProperties() { } void USGNovaGloveInfo::FImpl::SyncImplObject() { }