diff --git a/Source/DisplayClusterExtensions/Private/VirtualRealityPawn.cpp b/Source/DisplayClusterExtensions/Private/VirtualRealityPawn.cpp index f5ff0c74e48c461c15daf77da5b69c9154dc6e83..c9c719b38331a72d7f8f1bcadd57b4f2dc95c924 100644 --- a/Source/DisplayClusterExtensions/Private/VirtualRealityPawn.cpp +++ b/Source/DisplayClusterExtensions/Private/VirtualRealityPawn.cpp @@ -1,6 +1,8 @@ #include "VirtualRealityPawn.h" +#include "Camera/CameraComponent.h" #include "Cluster/IDisplayClusterClusterManager.h" +#include "Engine/Engine.h" #include "Engine/World.h" #include "Game/IDisplayClusterGameManager.h" #include "GameFramework/InputSettings.h" @@ -8,11 +10,7 @@ #include "Kismet/GameplayStatics.h" #include "DisplayClusterSettings.h" #include "IDisplayCluster.h" - -#include "IDisplayClusterConfigManager.h" -#include "IXRTrackingSystem.h" -#include "Engine/Engine.h" -#include "Camera/CameraComponent.h" +#include "VirtualRealityUtilities.h" AVirtualRealityPawn::AVirtualRealityPawn(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { @@ -51,7 +49,7 @@ AVirtualRealityPawn::AVirtualRealityPawn(const FObjectInitializer& ObjectInitial void AVirtualRealityPawn::OnForward_Implementation(float Value) { // Check if this function triggers correctly on ROLV. - if (RightHand && (NavigationMode == EVRNavigationModes::nav_mode_fly || IsDesktopMode() || IsHeadMountedMode())) + if (RightHand && (NavigationMode == EVRNavigationModes::nav_mode_fly || UVirtualRealityUtilities::IsDesktopMode() || UVirtualRealityUtilities::IsHeadMountedMode())) { AddMovementInput(RightHand->GetForwardVector(), Value); } @@ -59,7 +57,7 @@ void AVirtualRealityPawn::OnForward_Implementation(float Value) void AVirtualRealityPawn::OnRight_Implementation(float Value) { - if (RightHand && (NavigationMode == EVRNavigationModes::nav_mode_fly || IsDesktopMode() || IsHeadMountedMode())) + if (RightHand && (NavigationMode == EVRNavigationModes::nav_mode_fly || UVirtualRealityUtilities::IsDesktopMode() || UVirtualRealityUtilities::IsHeadMountedMode())) { AddMovementInput(RightHand->GetRightVector(), Value); } @@ -85,7 +83,7 @@ void AVirtualRealityPawn::OnTurnRate_Implementation(float Rate) void AVirtualRealityPawn::OnLookUpRate_Implementation(float Rate) { - if (IsRoomMountedMode()) + if (UVirtualRealityUtilities::IsRoomMountedMode()) { // User-centered projection causes simulation sickness on look up interaction hence not implemented. } @@ -103,31 +101,6 @@ void AVirtualRealityPawn::OnAction_Implementation(bool Pressed, int32 Index) { } -bool AVirtualRealityPawn::IsDesktopMode() -{ - return !IsRoomMountedMode() && !IsHeadMountedMode(); -} - -bool AVirtualRealityPawn::IsRoomMountedMode() -{ - return IDisplayCluster::Get().GetOperationMode() == EDisplayClusterOperationMode::Cluster; -} - -bool AVirtualRealityPawn::IsHeadMountedMode() -{ - return GEngine->XRSystem.IsValid() && GEngine->XRSystem->IsHeadTrackingAllowed(); -} - -FString AVirtualRealityPawn::GetNodeName() -{ - return IsRoomMountedMode() ? IDisplayCluster::Get().GetClusterMgr()->GetNodeId() : FString(TEXT("Localhost")); -} - -float AVirtualRealityPawn::GetEyeDistance() -{ - return IDisplayCluster::Get().GetConfigMgr()->GetConfigStereo().EyeDist; -} - float AVirtualRealityPawn::GetBaseTurnRate() const { return BaseTurnRate; @@ -203,19 +176,14 @@ USceneComponent* AVirtualRealityPawn::GetShutterGlassesComponent() return ShutterGlasses; } -UDisplayClusterSceneComponent* AVirtualRealityPawn::GetClusterComponent(const FString& Name) -{ - return IDisplayCluster::Get().GetGameMgr()->GetNodeById(Name); -} - void AVirtualRealityPawn::ClusterExecute(const FString& Command) { - FDisplayClusterClusterEvent event; - event.Name = "NDisplayCMD: " + Command; - event.Type = "NDisplayCMD"; - event.Category = "VRPawn"; - event.Parameters.Add("Command", Command); - IDisplayCluster::Get().GetClusterMgr()->EmitClusterEvent(event, false); + FDisplayClusterClusterEvent event; + event.Name = "NDisplayCMD: " + Command; + event.Type = "NDisplayCMD"; + event.Category = "VRPawn"; + event.Parameters.Add("Command", Command); + IDisplayCluster::Get().GetClusterMgr()->EmitClusterEvent(event, false); } void AVirtualRealityPawn::HandleClusterEvent(const FDisplayClusterClusterEvent& Event) @@ -243,14 +211,14 @@ void AVirtualRealityPawn::BeginPlay() BaseTurnRate = Settings->RotationSpeed; } - if (IsRoomMountedMode()) + if (UVirtualRealityUtilities::IsRoomMountedMode()) { UInputSettings::GetInputSettings()->RemoveAxisMapping(FInputAxisKeyMapping("TurnRate", EKeys::MouseX)); UInputSettings::GetInputSettings()->RemoveAxisMapping(FInputAxisKeyMapping("LookUpRate", EKeys::MouseY)); InitRoomMountedComponentReferences(); } - else if (IsHeadMountedMode()) + else if (UVirtualRealityUtilities::IsHeadMountedMode()) { UInputSettings::GetInputSettings()->RemoveAxisMapping(FInputAxisKeyMapping("TurnRate", EKeys::MouseX)); UInputSettings::GetInputSettings()->RemoveAxisMapping(FInputAxisKeyMapping("LookUpRate", EKeys::MouseY)); @@ -334,20 +302,20 @@ UPawnMovementComponent* AVirtualRealityPawn::GetMovementComponent() const void AVirtualRealityPawn::InitRoomMountedComponentReferences() { - if (!IsRoomMountedMode()) return; + if (!UVirtualRealityUtilities::IsRoomMountedMode()) return; //check whether the nodes already exist (otherwise GetClusterComponent() returns nullptr and prints a warning) and assign them - if (!TrackingOrigin) TrackingOrigin = GetClusterComponent("cave_origin"); - if (!TrackingOrigin) TrackingOrigin = GetClusterComponent("rolv_origin"); - if (!CaveCenter) CaveCenter = GetClusterComponent("cave_center"); + if (!TrackingOrigin) TrackingOrigin = UVirtualRealityUtilities::GetClusterComponent("cave_origin"); + if (!TrackingOrigin) TrackingOrigin = UVirtualRealityUtilities::GetClusterComponent("rolv_origin"); + if (!CaveCenter) CaveCenter = UVirtualRealityUtilities::GetClusterComponent("cave_center"); if (!ShutterGlasses) { - ShutterGlasses = GetClusterComponent("shutter_glasses"); + ShutterGlasses = UVirtualRealityUtilities::GetClusterComponent("shutter_glasses"); Head->AttachToComponent(ShutterGlasses, FAttachmentTransformRules::KeepRelativeTransform); } if (!Flystick) { - Flystick = GetClusterComponent("flystick"); + Flystick = UVirtualRealityUtilities::GetClusterComponent("flystick"); if (AttachRightHandInCAVE == EAttachementType::AT_FLYSTICK) RightHand->AttachToComponent(Flystick, FAttachmentTransformRules::KeepRelativeTransform); if (AttachLeftHandInCAVE == EAttachementType::AT_FLYSTICK) @@ -355,46 +323,14 @@ void AVirtualRealityPawn::InitRoomMountedComponentReferences() } if (!LeftHandTarget) { - LeftHandTarget = GetClusterComponent("left_hand_target"); + LeftHandTarget = UVirtualRealityUtilities::GetClusterComponent("left_hand_target"); if (AttachLeftHandInCAVE == EAttachementType::AT_HANDTARGET) LeftHand->AttachToComponent(LeftHandTarget, FAttachmentTransformRules::KeepRelativeTransform); } if (!RightHandTarget) { - RightHandTarget = GetClusterComponent("right_hand_target"); + RightHandTarget = UVirtualRealityUtilities::GetClusterComponent("right_hand_target"); if (AttachRightHandInCAVE == EAttachementType::AT_HANDTARGET) RightHand->AttachToComponent(RightHandTarget, FAttachmentTransformRules::KeepRelativeTransform); } } - - -EEyeType AVirtualRealityPawn::GetNodeEyeType() -{ - FDisplayClusterConfigClusterNode CurrentNodeConfig; - IDisplayCluster::Get().GetConfigMgr()->GetClusterNode(GetNodeName(), CurrentNodeConfig); - - FString s = CurrentNodeConfig.ToString(); - - if (s.Contains("mono_eye")) - { - TArray<FString> stringArray; - int32 count = s.ParseIntoArray(stringArray, TEXT(",")); - for (int x = 0; x < count; x++) - { - if (!stringArray[x].Contains("mono_eye")) continue; - if (stringArray[x].Contains("left")) - { - return EEyeType::ET_STEREO_LEFT; - } - if (stringArray[x].Contains("right")) - { - return EEyeType::ET_STEREO_RIGHT; - } - } - } - else - { - return EEyeType::ET_MONO; - } - return EEyeType::ET_MONO; -} \ No newline at end of file diff --git a/Source/DisplayClusterExtensions/Private/VirtualRealityUtilities.cpp b/Source/DisplayClusterExtensions/Private/VirtualRealityUtilities.cpp new file mode 100644 index 0000000000000000000000000000000000000000..30a85dd360f560bdc7772418b0e3a653b2a2dfb8 --- /dev/null +++ b/Source/DisplayClusterExtensions/Private/VirtualRealityUtilities.cpp @@ -0,0 +1,66 @@ +#include "VirtualRealityUtilities.h" + +#include "Cluster/IDisplayClusterClusterManager.h" +#include "Engine/Engine.h" +#include "Game/IDisplayClusterGameManager.h" +#include "IDisplayCluster.h" +#include "IDisplayClusterConfigManager.h" +#include "IXRTrackingSystem.h" + +bool UVirtualRealityUtilities::IsDesktopMode() +{ + return !IsRoomMountedMode() && !IsHeadMountedMode(); +} +bool UVirtualRealityUtilities::IsRoomMountedMode() +{ + return IDisplayCluster::Get().GetOperationMode() == EDisplayClusterOperationMode::Cluster; +} +bool UVirtualRealityUtilities::IsHeadMountedMode() +{ + return GEngine->XRSystem.IsValid() && GEngine->XRSystem->IsHeadTrackingAllowed(); +} + +FString UVirtualRealityUtilities::GetNodeName() +{ + return IsRoomMountedMode() ? IDisplayCluster::Get().GetClusterMgr()->GetNodeId() : FString(TEXT("Localhost")); +} +float UVirtualRealityUtilities::GetEyeDistance() +{ + return IDisplayCluster::Get().GetConfigMgr()->GetConfigStereo().EyeDist; +} + +EEyeType UVirtualRealityUtilities::GetNodeEyeType() +{ + FDisplayClusterConfigClusterNode CurrentNodeConfig; + IDisplayCluster::Get().GetConfigMgr()->GetClusterNode(GetNodeName(), CurrentNodeConfig); + + FString s = CurrentNodeConfig.ToString(); + + if (s.Contains("mono_eye")) + { + TArray<FString> stringArray; + int32 count = s.ParseIntoArray(stringArray, TEXT(",")); + for (int x = 0; x < count; x++) + { + if (!stringArray[x].Contains("mono_eye")) continue; + if (stringArray[x].Contains("left")) + { + return EEyeType::ET_STEREO_LEFT; + } + if (stringArray[x].Contains("right")) + { + return EEyeType::ET_STEREO_RIGHT; + } + } + } + else + { + return EEyeType::ET_MONO; + } + return EEyeType::ET_MONO; +} + +UDisplayClusterSceneComponent* UVirtualRealityUtilities::GetClusterComponent(const FString& Name) +{ + return IDisplayCluster::Get().GetGameMgr()->GetNodeById(Name); +} diff --git a/Source/DisplayClusterExtensions/Public/VirtualRealityPawn.h b/Source/DisplayClusterExtensions/Public/VirtualRealityPawn.h index dc2da91a950fcb9db4ffa20efb1d6fcc9b865e08..d5b3b4c8db035bbd1e0095f25d570de5940d0620 100644 --- a/Source/DisplayClusterExtensions/Public/VirtualRealityPawn.h +++ b/Source/DisplayClusterExtensions/Public/VirtualRealityPawn.h @@ -1,13 +1,13 @@ #pragma once -#include "GameFramework/FloatingPawnMovement.h" -#include "GameFramework/PawnMovementComponent.h" -#include "GameFramework/RotatingMovementComponent.h" #include "CoreMinimal.h" +#include "Cluster/DisplayClusterClusterEvent.h" +#include "Cluster/IDisplayClusterClusterManager.h" #include "DisplayClusterPawn.h" #include "DisplayClusterSceneComponent.h" -#include "Cluster/IDisplayClusterClusterManager.h" -#include "Cluster/DisplayClusterClusterEvent.h" +#include "GameFramework/FloatingPawnMovement.h" +#include "GameFramework/PawnMovementComponent.h" +#include "GameFramework/RotatingMovementComponent.h" #include "MotionControllerComponent.h" #include "VirtualRealityPawn.generated.h" @@ -18,14 +18,6 @@ enum class EVRNavigationModes : uint8 nav_mode_fly UMETA(DisplayName = "Navigation Mode Fly") }; -UENUM(BlueprintType) -enum class EEyeType : uint8 -{ - ET_MONO UMETA(DisplayName = "mono"), - ET_STEREO_RIGHT UMETA(DisplayName = "stero_right"), - ET_STEREO_LEFT UMETA(DisplayName = "stereo_left") -}; - UENUM(BlueprintType) enum class EAttachementType : uint8 { @@ -47,16 +39,6 @@ public: UFUNCTION(BlueprintNativeEvent, BlueprintCallable, BlueprintCallable, Category = "Pawn") void OnFire(bool Pressed); UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Pawn") void OnAction(bool Pressed, int32 Index); - UFUNCTION(BlueprintPure, Category = "Pawn") static bool IsDesktopMode(); - UFUNCTION(BlueprintPure, Category = "Pawn") static bool IsRoomMountedMode(); - UFUNCTION(BlueprintPure, Category = "Pawn") static bool IsHeadMountedMode(); - - - UFUNCTION(BlueprintPure, Category = "Pawn") static FString GetNodeName(); - UFUNCTION(BlueprintPure, Category = "Pawn") static float GetEyeDistance(); - - UFUNCTION(BlueprintPure, Category = "Pawn") static EEyeType GetNodeEyeType(); - UFUNCTION(Category = "Pawn") float GetBaseTurnRate() const; UFUNCTION(Category = "Pawn") void SetBaseTurnRate(float Value); UFUNCTION(Category = "Pawn") UFloatingPawnMovement* GetFloatingPawnMovement(); @@ -79,14 +61,10 @@ private: UFUNCTION(Category = "Pawn") USceneComponent* GetShutterGlassesComponent(); public: - - //Get Compenent of Display Cluster by it's name, which is specified in the nDisplay config - UFUNCTION(BlueprintPure, BlueprintCallable, Category = "Pawn") static UDisplayClusterSceneComponent* GetClusterComponent(const FString& Name); - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Pawn") EVRNavigationModes NavigationMode = EVRNavigationModes::nav_mode_fly; - //Execute specified console command on all nDisplayCluster Nodes - UFUNCTION(Exec, BlueprintCallable, Category = "DisplayCluster") static void ClusterExecute(const FString& Command); + //Execute specified console command on all nDisplayCluster Nodes + UFUNCTION(Exec, BlueprintCallable, Category = "DisplayCluster") static void ClusterExecute(const FString& Command); private: FOnClusterEventListener ClusterEventListenerDelegate; @@ -132,7 +110,6 @@ protected: // Holding the Shutter Glasses Component that is attached to this Pawn UPROPERTY() USceneComponent* ShutterGlasses = nullptr; - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Pawn") bool ShowHMDControllers = true; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Pawn") EAttachementType AttachRightHandInCAVE = EAttachementType::AT_FLYSTICK; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Pawn") EAttachementType AttachLeftHandInCAVE = EAttachementType::AT_NONE; diff --git a/Source/DisplayClusterExtensions/Public/VirtualRealityUtilities.h b/Source/DisplayClusterExtensions/Public/VirtualRealityUtilities.h new file mode 100644 index 0000000000000000000000000000000000000000..1aef9acc66c039c996c28bb32a1ee830108f2730 --- /dev/null +++ b/Source/DisplayClusterExtensions/Public/VirtualRealityUtilities.h @@ -0,0 +1,33 @@ +#pragma once + +#include "CoreMinimal.h" +#include "DisplayClusterSceneComponent.h" +#include "Kismet/BlueprintFunctionLibrary.h" +#include "VirtualRealityUtilities.generated.h" + +UENUM(BlueprintType) +enum class EEyeType : uint8 +{ + ET_MONO UMETA(DisplayName = "mono"), + ET_STEREO_RIGHT UMETA(DisplayName = "stero_right"), + ET_STEREO_LEFT UMETA(DisplayName = "stereo_left") +}; + +UCLASS() +class DISPLAYCLUSTEREXTENSIONS_API UVirtualRealityUtilities : public UBlueprintFunctionLibrary +{ + GENERATED_BODY() + +public: + UFUNCTION(BlueprintPure, Category = "DisplayCluster") static bool IsDesktopMode(); + UFUNCTION(BlueprintPure, Category = "DisplayCluster") static bool IsRoomMountedMode(); + UFUNCTION(BlueprintPure, Category = "DisplayCluster") static bool IsHeadMountedMode(); + + UFUNCTION(BlueprintPure, Category = "DisplayCluster") static FString GetNodeName(); + UFUNCTION(BlueprintPure, Category = "DisplayCluster") static float GetEyeDistance(); + + UFUNCTION(BlueprintPure, Category = "DisplayCluster") static EEyeType GetNodeEyeType(); + + //Get Compenent of Display Cluster by it's name, which is specified in the nDisplay config + UFUNCTION(BlueprintPure, BlueprintCallable, Category = "DisplayCluster") static UDisplayClusterSceneComponent* GetClusterComponent(const FString& Name); +};