migrate the static getworld to sgengineutils
This commit is contained in:
@@ -26,6 +26,7 @@ This is a minor release focusing mainly on bringing OpenXR-compatible hand track
|
||||
- Added USGWristTrackerComponent::OnWristDeviceVisualTypeChanged event in order to be able to notify other components/actors whenever the wrist-tracking device switches between hand tracking or motion controllers.
|
||||
- Added the SenseGloveDebugKismet module in order to allow drawing of debugging gizmos and virtual hands from Blueprint.
|
||||
- Added a new static Draw() method overload to DebugGizmo which allows passing an FQuat instead of a FRotator.
|
||||
- Added SGEngineUtils.
|
||||
- Introduced the SGInitializationSettings in order to control how the plugin is initialized.
|
||||
- Introduced the SGGameUserSettings for managing Engine Scalability Settings through the SenseGlove plugin.
|
||||
|
||||
|
||||
@@ -35,15 +35,9 @@
|
||||
|
||||
#include "SGTracking/SGGloveTracker.h"
|
||||
|
||||
#if WITH_EDITOR
|
||||
#include "Editor.h"
|
||||
#endif /* WITH_EDITOR */
|
||||
#include "Engine/Engine.h"
|
||||
#include "Engine/TimerHandle.h"
|
||||
#include "Engine/World.h"
|
||||
#if WITH_EDITOR
|
||||
#include "Subsystems/UnrealEditorSubsystem.h"
|
||||
#endif /* WITH_EDITOR */
|
||||
#include "TimerManager.h"
|
||||
|
||||
#include "SGBackend/SGBackend.h"
|
||||
@@ -52,6 +46,7 @@
|
||||
#include "SGLog/SGLog.h"
|
||||
#include "SGSettings/SGSettings.h"
|
||||
#include "SGSettings/SGTrackingSettings.h"
|
||||
#include "SGUtils/SGEngineUtils.h"
|
||||
|
||||
struct USGGloveTracker::FImpl
|
||||
{
|
||||
@@ -59,8 +54,6 @@ struct USGGloveTracker::FImpl
|
||||
* Static methods
|
||||
************************/
|
||||
|
||||
static UWorld* GetWorld();
|
||||
|
||||
FORCEINLINE static float GetGloveConnectivityCheckInterval()
|
||||
{
|
||||
const USGSettings* Settings{USGSettings::GetInstance()};
|
||||
@@ -101,90 +94,9 @@ struct USGGloveTracker::FImpl
|
||||
void UpdateGloves() const;
|
||||
};
|
||||
|
||||
UWorld* USGGloveTracker::FImpl::GetWorld()
|
||||
{
|
||||
UWorld* World{nullptr};
|
||||
|
||||
#if WITH_EDITOR
|
||||
if (GIsEditor)
|
||||
{
|
||||
if (IsValid(GEditor))
|
||||
{
|
||||
const bool bIsPIE = GPlayInEditorID != -1;
|
||||
if (!bIsPIE)
|
||||
{
|
||||
const FWorldContext* WorldContext{GEditor->GetPIEWorldContext(1)};
|
||||
if (WorldContext)
|
||||
{
|
||||
World = WorldContext->World();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
const FWorldContext* WorldContext{GEditor->GetPIEWorldContext(GPlayInEditorID)};
|
||||
if (WorldContext)
|
||||
{
|
||||
World = WorldContext->World();
|
||||
}
|
||||
}
|
||||
|
||||
/// NOTE
|
||||
// IsInGameThread() check is to avoid EngineScriptHelpers::CheckIfInEditorAndPIE emitting:
|
||||
// "You are not on the main thread."
|
||||
// !(GEditor->PlayWorld || GIsPlayInEditorWorld) check is to avoid
|
||||
// EngineScriptHelpers::CheckIfInEditorAndPIE emitting:
|
||||
// The Editor is currently in a play mode.
|
||||
if (!IsValid(World) && IsInGameThread() && !(GEditor->PlayWorld || GIsPlayInEditorWorld))
|
||||
{
|
||||
UUnrealEditorSubsystem* UnrealEditorSubsystem{GEditor->GetEditorSubsystem<UUnrealEditorSubsystem>()};
|
||||
if (IsValid(UnrealEditorSubsystem))
|
||||
{
|
||||
/// NOTE
|
||||
// This is exactly UnrealEditorSubsystem->GetEditorWorld() without all the annoying warnings that
|
||||
// pollutes the logs. It's safe since we've already done all the checks.
|
||||
World = GEditor->GetEditorWorldContext(false).World();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!IsValid(World) && IsValid(GEngine))
|
||||
{
|
||||
const UGameViewportClient* Viewport{GEngine->GameViewport};
|
||||
if (IsValid(Viewport))
|
||||
{
|
||||
World = Viewport->GetWorld();
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (IsValid(GEngine))
|
||||
{
|
||||
World = GEngine->GetCurrentPlayWorld(nullptr);
|
||||
}
|
||||
}
|
||||
#else /* WITH_EDITOR */
|
||||
if (IsValid(GEngine))
|
||||
{
|
||||
World = GEngine->GetCurrentPlayWorld(nullptr);
|
||||
}
|
||||
#endif /* WITH_EDITOR */
|
||||
|
||||
if (!IsValid(World) && IsValid(GEngine))
|
||||
{
|
||||
UEngineSubsystem* EngineSubsystem{GEngine->GetEngineSubsystem<UEngineSubsystem>()};
|
||||
if (IsValid(EngineSubsystem))
|
||||
{
|
||||
World = EngineSubsystem->GetWorld();
|
||||
}
|
||||
}
|
||||
|
||||
return World;
|
||||
}
|
||||
|
||||
USGGloveTracker* USGGloveTracker::GetInstance()
|
||||
{
|
||||
UWorld* World{FImpl::GetWorld()};
|
||||
UWorld* World{FSGEngineUtils::GetWorld()};
|
||||
USGGloveTracker* Instance{IsValid(World) ? World->GetSubsystem<USGGloveTracker>() : nullptr};
|
||||
return Instance;
|
||||
}
|
||||
|
||||
@@ -37,9 +37,6 @@
|
||||
|
||||
#include "Containers/Array.h"
|
||||
#include "Containers/Map.h"
|
||||
#if WITH_EDITOR
|
||||
#include "Editor.h"
|
||||
#endif /* WITH_EDITOR */
|
||||
#include "Engine/Engine.h"
|
||||
#include "Engine/SkeletalMesh.h"
|
||||
#include "Engine/World.h"
|
||||
@@ -49,9 +46,6 @@
|
||||
#include "OpenXRCore.h"
|
||||
#include "OpenXRHMD/Private/OpenXRHMD.h"
|
||||
#include "Runtime/Launch/Resources/Version.h"
|
||||
#if WITH_EDITOR
|
||||
#include "Subsystems/UnrealEditorSubsystem.h"
|
||||
#endif /* WITH_EDITOR */
|
||||
|
||||
#include "SGBackend/SGBackend.h"
|
||||
#include "SGCore/SGHapticGlove.h"
|
||||
@@ -62,6 +56,7 @@
|
||||
#include "SGTracking/SGXRHandState.h"
|
||||
#include "SGTypes/SGCoreTypes.h"
|
||||
#include "SGTypes/SGTrackingTypes.h"
|
||||
#include "SGUtils/SGEngineUtils.h"
|
||||
|
||||
#if ENGINE_MAJOR_VERSION >= 5 && ENGINE_MINOR_VERSION <= 3
|
||||
void EnumerateOpenXRApiLayers(TArray<XrApiLayerProperties>& OutProperties)
|
||||
@@ -90,8 +85,6 @@ struct FSGXRTracker::FImpl
|
||||
* Static methods
|
||||
************************/
|
||||
|
||||
static UWorld* GetWorld();
|
||||
|
||||
FORCEINLINE static bool ShouldFallbackToHandTrackingIfNoGloveDetected()
|
||||
{
|
||||
const USGSettings* Settings{USGSettings::GetInstance()};
|
||||
@@ -511,87 +504,6 @@ struct FSGXRTracker::FImpl
|
||||
bool UpdateSGHandState(const EControllerHand DeviceHand, FSGXRHandState& OutHandState) const;
|
||||
};
|
||||
|
||||
UWorld* FSGXRTracker::FImpl::GetWorld()
|
||||
{
|
||||
UWorld* World{nullptr};
|
||||
|
||||
#if WITH_EDITOR
|
||||
if (GIsEditor)
|
||||
{
|
||||
if (IsValid(GEditor))
|
||||
{
|
||||
const bool bIsPIE = GPlayInEditorID != -1;
|
||||
if (!bIsPIE)
|
||||
{
|
||||
const FWorldContext* WorldContext{GEditor->GetPIEWorldContext(1)};
|
||||
if (WorldContext)
|
||||
{
|
||||
World = WorldContext->World();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
const FWorldContext* WorldContext{GEditor->GetPIEWorldContext(GPlayInEditorID)};
|
||||
if (WorldContext)
|
||||
{
|
||||
World = WorldContext->World();
|
||||
}
|
||||
}
|
||||
|
||||
/// NOTE
|
||||
// IsInGameThread() check is to avoid EngineScriptHelpers::CheckIfInEditorAndPIE emitting:
|
||||
// "You are not on the main thread."
|
||||
// !(GEditor->PlayWorld || GIsPlayInEditorWorld) check is to avoid
|
||||
// EngineScriptHelpers::CheckIfInEditorAndPIE emitting:
|
||||
// The Editor is currently in a play mode.
|
||||
if (!IsValid(World) && IsInGameThread() && !(GEditor->PlayWorld || GIsPlayInEditorWorld))
|
||||
{
|
||||
UUnrealEditorSubsystem* UnrealEditorSubsystem{GEditor->GetEditorSubsystem<UUnrealEditorSubsystem>()};
|
||||
if (IsValid(UnrealEditorSubsystem))
|
||||
{
|
||||
/// NOTE
|
||||
// This is exactly UnrealEditorSubsystem->GetEditorWorld() without all the annoying warnings that
|
||||
// pollutes the logs. It's safe since we've already done all the checks.
|
||||
World = GEditor->GetEditorWorldContext(false).World();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!IsValid(World) && IsValid(GEngine))
|
||||
{
|
||||
const UGameViewportClient* Viewport{GEngine->GameViewport};
|
||||
if (IsValid(Viewport))
|
||||
{
|
||||
World = Viewport->GetWorld();
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (IsValid(GEngine))
|
||||
{
|
||||
World = GEngine->GetCurrentPlayWorld(nullptr);
|
||||
}
|
||||
}
|
||||
#else /* WITH_EDITOR */
|
||||
if (IsValid(GEngine))
|
||||
{
|
||||
World = GEngine->GetCurrentPlayWorld(nullptr);
|
||||
}
|
||||
#endif /* WITH_EDITOR */
|
||||
|
||||
if (!IsValid(World) && IsValid(GEngine))
|
||||
{
|
||||
UEngineSubsystem* EngineSubsystem{GEngine->GetEngineSubsystem<UEngineSubsystem>()};
|
||||
if (IsValid(EngineSubsystem))
|
||||
{
|
||||
World = EngineSubsystem->GetWorld();
|
||||
}
|
||||
}
|
||||
|
||||
return World;
|
||||
}
|
||||
|
||||
ESGPositionalTrackingHardware FSGXRTracker::FImpl::GetPositionalTrackingHardware()
|
||||
{
|
||||
ESGPositionalTrackingHardware TrackerHardware = GetWristTrackingSettings().TrackingHardware;
|
||||
@@ -748,7 +660,7 @@ USGBasicHandModel* FSGXRTracker::FImpl::GetHandModel(const bool bRight)
|
||||
const TArray<FVector> StartPositions{GetFingerStartPositions(bRight)};
|
||||
const TArray<FQuat> StartRotations{GetFingerStartRotations(bRight)};
|
||||
|
||||
UWorld* World{GetWorld()};
|
||||
UWorld* World{FSGEngineUtils::GetWorld()};
|
||||
|
||||
USGBasicHandModel* HandModel{
|
||||
USGBasicHandModel::NewBasicHandModel(World, bRight, FingerLengths, StartPositions, StartRotations)
|
||||
@@ -765,7 +677,7 @@ USGHandPose* FSGXRTracker::FImpl::GetHandPose(const bool bRight)
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
UWorld* World{GetWorld()};
|
||||
UWorld* World{FSGEngineUtils::GetWorld()};
|
||||
const USGBasicHandModel* HandModel{GetHandModel(bRight)};
|
||||
USGHandPose* HandPose{nullptr};
|
||||
|
||||
@@ -1536,7 +1448,7 @@ bool FSGXRTracker::FImpl::GetOpenXRHandTrackingWristTransform(
|
||||
return false;
|
||||
}
|
||||
|
||||
UWorld* World{GetWorld()};
|
||||
UWorld* World{FSGEngineUtils::GetWorld()};
|
||||
|
||||
FXRMotionControllerData MotionControllerData;
|
||||
XRTrackingSystem->GetMotionControllerData(World, DeviceHand, MotionControllerData);
|
||||
@@ -1561,7 +1473,7 @@ bool FSGXRTracker::FImpl::GetOpenXRWristTransform(
|
||||
{
|
||||
static constexpr int32 CurrentPlayerControllerIndex = 0;
|
||||
|
||||
const UWorld* World{GetWorld()};
|
||||
const UWorld* World{FSGEngineUtils::GetWorld()};
|
||||
const float WorldToMetersScale = World ? World->GetWorldSettings()->WorldToMeters : 100.0f;
|
||||
|
||||
FVector TrackerLocation;
|
||||
|
||||
@@ -67,20 +67,11 @@ public class SenseGloveTracking : ModuleRules
|
||||
"SenseGloveCore",
|
||||
"SenseGloveLog",
|
||||
"SenseGloveSettings",
|
||||
"SenseGloveUtils",
|
||||
"SenseGloveTypes",
|
||||
}
|
||||
);
|
||||
|
||||
if (Target.bBuildEditor)
|
||||
{
|
||||
PrivateDependencyModuleNames.AddRange(
|
||||
new string[]
|
||||
{
|
||||
"UnrealEd",
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
PrivateIncludePathModuleNames.AddRange(
|
||||
new string[]
|
||||
{
|
||||
|
||||
@@ -0,0 +1,128 @@
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* @author Mamadou Babaei <mamadou@senseglove.com>
|
||||
*
|
||||
* @section LICENSE
|
||||
*
|
||||
* (The MIT License)
|
||||
*
|
||||
* Copyright (c) 2020 - 2024 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 "SGUtils/SGEngineUtils.h"
|
||||
|
||||
#if WITH_EDITOR
|
||||
#include "Editor.h"
|
||||
#endif /* WITH_EDITOR */
|
||||
#include "Engine/Engine.h"
|
||||
#include "Engine/GameViewportClient.h"
|
||||
#include "Engine/World.h"
|
||||
#include "Subsystems/EngineSubsystem.h"
|
||||
#if WITH_EDITOR
|
||||
#include "Subsystems/UnrealEditorSubsystem.h"
|
||||
#endif /* WITH_EDITOR */
|
||||
|
||||
UWorld* FSGEngineUtils::GetWorld()
|
||||
{
|
||||
UWorld* World{nullptr};
|
||||
|
||||
#if WITH_EDITOR
|
||||
if (GIsEditor)
|
||||
{
|
||||
if (IsValid(GEditor))
|
||||
{
|
||||
const bool bIsPIE = GPlayInEditorID != -1;
|
||||
if (!bIsPIE)
|
||||
{
|
||||
const FWorldContext* WorldContext{GEditor->GetPIEWorldContext(1)};
|
||||
if (WorldContext)
|
||||
{
|
||||
World = WorldContext->World();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
const FWorldContext* WorldContext{GEditor->GetPIEWorldContext(GPlayInEditorID)};
|
||||
if (WorldContext)
|
||||
{
|
||||
World = WorldContext->World();
|
||||
}
|
||||
}
|
||||
|
||||
/// NOTE
|
||||
// IsInGameThread() check is to avoid EngineScriptHelpers::CheckIfInEditorAndPIE emitting:
|
||||
// "You are not on the main thread."
|
||||
// !(GEditor->PlayWorld || GIsPlayInEditorWorld) check is to avoid
|
||||
// EngineScriptHelpers::CheckIfInEditorAndPIE emitting:
|
||||
// The Editor is currently in a play mode.
|
||||
if (!IsValid(World) && IsInGameThread() && !(GEditor->PlayWorld || GIsPlayInEditorWorld))
|
||||
{
|
||||
UUnrealEditorSubsystem* UnrealEditorSubsystem{GEditor->GetEditorSubsystem<UUnrealEditorSubsystem>()};
|
||||
if (IsValid(UnrealEditorSubsystem))
|
||||
{
|
||||
/// NOTE
|
||||
// This is exactly UnrealEditorSubsystem->GetEditorWorld() without all the annoying warnings that
|
||||
// pollutes the logs. It's safe since we've already done all the checks.
|
||||
World = GEditor->GetEditorWorldContext(false).World();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!IsValid(World) && IsValid(GEngine))
|
||||
{
|
||||
const UGameViewportClient* Viewport{GEngine->GameViewport};
|
||||
if (IsValid(Viewport))
|
||||
{
|
||||
World = Viewport->GetWorld();
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (IsValid(GEngine))
|
||||
{
|
||||
World = GEngine->GetCurrentPlayWorld(nullptr);
|
||||
}
|
||||
}
|
||||
#else /* WITH_EDITOR */
|
||||
if (IsValid(GEngine))
|
||||
{
|
||||
World = GEngine->GetCurrentPlayWorld(nullptr);
|
||||
}
|
||||
#endif /* WITH_EDITOR */
|
||||
|
||||
if (!IsValid(World) && IsValid(GEngine))
|
||||
{
|
||||
UEngineSubsystem* EngineSubsystem{GEngine->GetEngineSubsystem<UEngineSubsystem>()};
|
||||
if (IsValid(EngineSubsystem))
|
||||
{
|
||||
World = EngineSubsystem->GetWorld();
|
||||
}
|
||||
}
|
||||
|
||||
return World;
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* @author Mamadou Babaei <mamadou@senseglove.com>
|
||||
*
|
||||
* @section LICENSE
|
||||
*
|
||||
* (The MIT License)
|
||||
*
|
||||
* Copyright (c) 2020 - 2024 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
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
class UWorld;
|
||||
|
||||
class SENSEGLOVEUTILS_API FSGEngineUtils final
|
||||
{
|
||||
public:
|
||||
static UWorld* GetWorld();
|
||||
};
|
||||
@@ -52,5 +52,15 @@ public class SenseGloveUtils : ModuleRules
|
||||
"SenseGloveTypes",
|
||||
}
|
||||
);
|
||||
|
||||
if (Target.bBuildEditor)
|
||||
{
|
||||
PrivateDependencyModuleNames.AddRange(
|
||||
new string[]
|
||||
{
|
||||
"UnrealEd",
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user