/** * @file * * @author Mamadou Babaei * * @section LICENSE * * (The MIT License) * * Copyright (c) 2020 - 2023 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 "SGSettings/SGSettings.h" #include "Engine/Engine.h" #include "SGLog/SGLog.h" #include "SGCore/SGTracking.h" struct USGSettings::FImpl { /************************ * Static methods ************************/ /************************ * Owner object ************************/ USGSettings* Owner; /************************ * Constructor / Destructor ************************/ explicit FImpl(USGSettings* InOwner); ~FImpl(); /************************ * Default copy constructor & copy assignment operator ************************/ FImpl(const FImpl& Rhs) = default; FImpl& operator=(const FImpl& Rhs) = default; /************************ * Methods ************************/ void ResetHardwareOffsetValuesToZero(); }; USGSettings* USGSettings::GetInstance() { USGSettings* Instance{GEngine->GetEngineSubsystem()}; return Instance; } USGSettings::USGSettings() : Pimpl(TUniquePtr(new FImpl{this}, PimplDeleter)) { HardwareOffset = ESGPositionalTrackingHardware::None; Pimpl->ResetHardwareOffsetValuesToZero(); bDrawDebugWristTrackerGizmo = false; DebugWristTrackerGizmoLength = 1.0f; DebugWristTrackerGizmoXAxisColor = FColor::Red; DebugWristTrackerGizmoYAxisColor = FColor::Green; DebugWristTrackerGizmoZAxisColor = FColor::Blue; bDebugWristTrackerGizmoPersistentLines = false; DebugWristTrackerGizmoLifeTimeModifier = 1.1f; DebugWristTrackerGizmoDepthPriority = 0; DebugWristTrackerGizmoThickness = 1.0f; } const FVector& USGSettings::GetHardwareLocationOffsetLeftHand() const { ensureAlwaysMsgf( HardwareOffset == ESGPositionalTrackingHardware::Custom, TEXT( "Getting HardwareLocationOffsetLeftHand is only permitted when HardwareOffset is set to Custom!")); return HardwareLocationOffsetLeftHand; } void USGSettings::SetHardwareLocationOffsetLeftHand(const FVector& InHardwareLocationOffsetLeftHand) { ensureAlwaysMsgf( HardwareOffset == ESGPositionalTrackingHardware::Custom, TEXT( "Setting HardwareLocationOffsetLeftHand is only permitted when HardwareOffset is set to Custom!")); HardwareLocationOffsetLeftHand = InHardwareLocationOffsetLeftHand; } const FVector& USGSettings::GetHardwareLocationOffsetRightHand() const { ensureAlwaysMsgf( HardwareOffset == ESGPositionalTrackingHardware::Custom, TEXT( "Getting HardwareLocationOffsetRightHand is only permitted when HardwareOffset is set to Custom!")); return HardwareLocationOffsetRightHand; } void USGSettings::SetHardwareLocationOffsetRightHand(const FVector& InHardwareLocationOffsetRightHand) { ensureAlwaysMsgf( HardwareOffset == ESGPositionalTrackingHardware::Custom, TEXT( "Setting HardwareLocationOffsetRightHand is only permitted when HardwareOffset is set to Custom!")); HardwareLocationOffsetRightHand = InHardwareLocationOffsetRightHand; } const FRotator& USGSettings::GetHardwareRotationOffsetLeftHand() const { ensureAlwaysMsgf( HardwareOffset == ESGPositionalTrackingHardware::Custom, TEXT( "Getting HardwareRotationOffsetLeftHand is only permitted when HardwareOffset is set to Custom!")); return HardwareRotationOffsetLeftHand; } void USGSettings::SetHardwareRotationOffsetLeftHand(const FRotator& InHardwareRotationOffsetLeftHand) { ensureAlwaysMsgf( HardwareOffset == ESGPositionalTrackingHardware::Custom, TEXT("Setting HardwareRotationOffsetRightHand is only permitted when HardwareOffset is set to Custom!")); HardwareRotationOffsetLeftHand = InHardwareRotationOffsetLeftHand; } const FRotator& USGSettings::GetHardwareRotationOffsetRightHand() const { ensureAlwaysMsgf( HardwareOffset == ESGPositionalTrackingHardware::Custom, TEXT("Getting HardwareRotationOffsetRightHand is only permitted when HardwareOffset is set to Custom!")); return HardwareRotationOffsetRightHand; } void USGSettings::SetHardwareRotationOffsetRightHand(const FRotator& InHardwareRotationOffsetRightHand) { ensureAlwaysMsgf( HardwareOffset == ESGPositionalTrackingHardware::Custom, TEXT("Setting HardwareRotationOffsetRightHand is only permitted when HardwareOffset is set to Custom!")); HardwareRotationOffsetRightHand = InHardwareRotationOffsetRightHand; } float USGSettings::GetDebugWristTrackerGizmoLength() const { ensureAlwaysMsgf( bDrawDebugWristTrackerGizmo, TEXT("Getting DebugWristTrackerGizmoLength is only permitted when HardwareOffset is set to Custom!")); return DebugWristTrackerGizmoLength; } void USGSettings::SetDebugWristTrackerGizmoLength(const float InDebugWristTrackerGizmoLength) { ensureAlwaysMsgf( bDrawDebugWristTrackerGizmo, TEXT("Setting DebugWristTrackerGizmoLength is only permitted when HardwareOffset is set to Custom!")); DebugWristTrackerGizmoLength = InDebugWristTrackerGizmoLength; } const FLinearColor& USGSettings::GetDebugWristTrackerGizmoXAxisColor() const { ensureAlwaysMsgf( bDrawDebugWristTrackerGizmo, TEXT("Getting DebugWristTrackerGizmoXAxisColor is only permitted when HardwareOffset is set to Custom!")); return DebugWristTrackerGizmoXAxisColor; } void USGSettings::SetDebugWristTrackerGizmoXAxisColor(const FLinearColor& InDebugWristTrackerGizmoXAxisColor) { ensureAlwaysMsgf( bDrawDebugWristTrackerGizmo, TEXT("Setting DebugWristTrackerGizmoXAxisColor is only permitted when HardwareOffset is set to Custom!")); DebugWristTrackerGizmoXAxisColor = InDebugWristTrackerGizmoXAxisColor; } const FLinearColor& USGSettings::GetDebugWristTrackerGizmoYAxisColor() const { ensureAlwaysMsgf( bDrawDebugWristTrackerGizmo, TEXT("Getting DebugWristTrackerGizmoYAxisColor is only permitted when HardwareOffset is set to Custom!")); return DebugWristTrackerGizmoXAxisColor; } void USGSettings::SetDebugWristTrackerGizmoYAxisColor(const FLinearColor& InDebugWristTrackerGizmoYAxisColor) { ensureAlwaysMsgf( bDrawDebugWristTrackerGizmo, TEXT("Setting DebugWristTrackerGizmoYAxisColor is only permitted when HardwareOffset is set to Custom!")); DebugWristTrackerGizmoYAxisColor = InDebugWristTrackerGizmoYAxisColor; } const FLinearColor& USGSettings::GetDebugWristTrackerGizmoZAxisColor() const { ensureAlwaysMsgf( bDrawDebugWristTrackerGizmo, TEXT("Getting DebugWristTrackerGizmoZAxisColor is only permitted when HardwareOffset is set to Custom!")); return DebugWristTrackerGizmoZAxisColor; } void USGSettings::SetDebugWristTrackerGizmoZAxisColor(const FLinearColor& InDebugWristTrackerGizmoZAxisColor) { ensureAlwaysMsgf( bDrawDebugWristTrackerGizmo, TEXT("Setting DebugWristTrackerGizmoZAxisColor is only permitted when HardwareOffset is set to Custom!")); DebugWristTrackerGizmoZAxisColor = InDebugWristTrackerGizmoZAxisColor; } bool USGSettings::GetDebugWristTrackerGizmoPersistentLines() const { ensureAlwaysMsgf( bDrawDebugWristTrackerGizmo, TEXT("Getting bDebugWristTrackerGizmoPersistentLines is only permitted when HardwareOffset is set to Custom!")); return !!bDebugWristTrackerGizmoPersistentLines; } void USGSettings::SetDebugWristTrackerGizmoPersistentLines(const bool bInDebugWristTrackerGizmoPersistentLines) { ensureAlwaysMsgf( bDrawDebugWristTrackerGizmo, TEXT("Setting bDebugWristTrackerGizmoPersistentLines is only permitted when HardwareOffset is set to Custom!")); bDebugWristTrackerGizmoPersistentLines = bInDebugWristTrackerGizmoPersistentLines; } float USGSettings::GetDebugWristTrackerGizmoLifeTimeModifier() const { ensureAlwaysMsgf( bDrawDebugWristTrackerGizmo, TEXT("Getting DebugWristTrackerGizmoLifeTimeModifier is only permitted when HardwareOffset is set to Custom!")); return DebugWristTrackerGizmoLifeTimeModifier; } void USGSettings::SetDebugWristTrackerGizmoLifeTimeModifier(const float InDebugWristTrackerGizmoLifeTimeModifier) { ensureAlwaysMsgf( bDrawDebugWristTrackerGizmo, TEXT("Setting DebugWristTrackerGizmoLifeTimeModifier is only permitted when HardwareOffset is set to Custom!")); DebugWristTrackerGizmoLifeTimeModifier = InDebugWristTrackerGizmoLifeTimeModifier; } uint8 USGSettings::GetDebugWristTrackerGizmoDepthPriority() const { ensureAlwaysMsgf( bDrawDebugWristTrackerGizmo, TEXT("Getting DebugWristTrackerGizmoDepthPriority is only permitted when HardwareOffset is set to Custom!")); return DebugWristTrackerGizmoDepthPriority; } void USGSettings::SetDebugWristTrackerGizmoDepthPriority(const uint8 InDebugWristTrackerGizmoDepthPriority) { ensureAlwaysMsgf( bDrawDebugWristTrackerGizmo, TEXT("Setting is only permitted when HardwareOffset is set to Custom!")); DebugWristTrackerGizmoDepthPriority = InDebugWristTrackerGizmoDepthPriority; } float USGSettings::GetDebugWristTrackerGizmoThickness() const { ensureAlwaysMsgf( bDrawDebugWristTrackerGizmo, TEXT("Getting DebugWristTrackerGizmoThickness is only permitted when HardwareOffset is set to Custom!")); return DebugWristTrackerGizmoThickness; } void USGSettings::SetDebugWristTrackerGizmoThickness(const float InDebugWristTrackerGizmoThickness) { ensureAlwaysMsgf( bDrawDebugWristTrackerGizmo, TEXT("Setting DebugWristTrackerGizmoThickness is only permitted when HardwareOffset is set to Custom!")); DebugWristTrackerGizmoThickness = InDebugWristTrackerGizmoThickness; } bool USGSettings::ShouldCreateSubsystem(UObject* Outer) const { return true; } void USGSettings::Initialize(FSubsystemCollectionBase& Collection) { SGLOG("Initializing the SenseGlove settings singleton with the engine lifetime..."); Super::Initialize(Collection); SGLOG("Initializing the SenseGlove settings singleton with the engine lifetime..."); SGLOG("The SenseGlove settings singleton has been successfully initialized with the engine lifetime!"); } void USGSettings::Deinitialize() { SGLOG("De-initializing the SenseGlove settings singleton due to the engine lifetime expiration..."); Super::Deinitialize(); Pimpl.Release(); SGLOG("The SenseGlove settings singleton has been successfully de-initialized!"); } #if WITH_EDITOR bool USGSettings::CanEditChange(const FProperty* InProperty) const { bool bCanEditChange = Super::CanEditChange(InProperty); /*const FName PropertyName{InProperty ? InProperty->GetFName() : NAME_None}; if (PropertyName == GET_MEMBER_NAME_CHECKED(USGSettings, HardwareOffset)) { return HardwareOffset == ESGPositionalTrackingHardware::Custom; }*/ return bCanEditChange; } #endif /* WITH_EDITOR */ #if WITH_EDITOR void USGSettings::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) { Super::PostEditChangeProperty(PropertyChangedEvent); const FName PropertyName{ PropertyChangedEvent.Property ? PropertyChangedEvent.Property->GetFName() : NAME_None }; if (PropertyName == GET_MEMBER_NAME_CHECKED(USGSettings, HardwareOffset)) { Pimpl->ResetHardwareOffsetValuesToZero(); return; } } #endif /* WITH_EDITOR */ USGSettings::FImpl::FImpl(USGSettings* InOwner) : Owner(InOwner) { } USGSettings::FImpl::~FImpl() = default; void USGSettings::FImpl::ResetHardwareOffsetValuesToZero() { Owner->HardwareLocationOffsetLeftHand = FVector::ZeroVector; Owner->HardwareLocationOffsetRightHand = FVector::ZeroVector; Owner->HardwareRotationOffsetLeftHand = FRotator::ZeroRotator; Owner->HardwareRotationOffsetRightHand = FRotator::ZeroRotator; } void USGSettings::FImplDeleter::operator()(const FImpl* P) const { delete P; }