From 4030b25c0db44ceb13f48e72ed0ebb46ffeb48ad Mon Sep 17 00:00:00 2001
From: David Gilbert <gilbert@vr.rwth-aachen.de>
Date: Fri, 6 Dec 2024 12:59:18 +0100
Subject: [PATCH 01/19] fix(pawn, package): Re-saves pawn to rewrite reference
 to BP_CaveSetup

---
 Content/Pawn/Base/BP_RWTHVRPawn_Base.uasset | Bin 27162 -> 27162 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)

diff --git a/Content/Pawn/Base/BP_RWTHVRPawn_Base.uasset b/Content/Pawn/Base/BP_RWTHVRPawn_Base.uasset
index cba6c2e1875f45603f51e234dbb9b066017654f9..2c222f4e0156fee460bd421a3c52ed19b0784754 100644
GIT binary patch
delta 41
ycmbPrg>lvu#tl0e1rop2Jq=}ucUm#yutWMu!)KFEGAgjLFsR;=+x(7ECj$V8#Sv@(

delta 41
ycmbPrg>lvu#tl0e1w!w(olL%Q$Z?BA*wza!A&)1YWK>{fX7K9a+x(7ECj$VOuMyb*

-- 
GitLab


From 3b51382488237e200544cda9e270fe457067836a Mon Sep 17 00:00:00 2001
From: David Gilbert <gilbert@vr.rwth-aachen.de>
Date: Tue, 7 Jan 2025 10:49:04 +0100
Subject: [PATCH 02/19] chore(pawn, cave): Improves logging when unsupported
 player state is chosen for Cluster Attachment.

---
 Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp b/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp
index 812e83ea..f6f9f1c0 100644
--- a/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp
+++ b/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp
@@ -84,6 +84,12 @@ void ARWTHVRPawn::NotifyControllerChanged()
 				AttachClustertoPawn();
 			}
 		}
+		else
+		{
+			UE_LOGFMT(Toolkit, Warning,
+					  "ARWTHVRPawn: PlayerState is not a subclass of ARWTHVRPlayerState. Cluster attachment only works "
+					  "with correct PlayerStates!");
+		}
 	}
 }
 
-- 
GitLab


From 777346340566420c5a31a10887c5cab76e9d183e Mon Sep 17 00:00:00 2001
From: David Gilbert <gilbert@vr.rwth-aachen.de>
Date: Thu, 9 Jan 2025 13:41:23 +0100
Subject: [PATCH 03/19] fix(chore): Updates default pawn nav mode to ghost

---
 Content/Pawn/BP_RWTHVRPawn_Default.uasset | Bin 57410 -> 57971 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)

diff --git a/Content/Pawn/BP_RWTHVRPawn_Default.uasset b/Content/Pawn/BP_RWTHVRPawn_Default.uasset
index 145ddf5f938d0a3612c7a609aafa75a30d82063f..98bd1d8298820e85ce83fa1eaf0cee4f8d04c159 100644
GIT binary patch
delta 16704
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

delta 16140
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

-- 
GitLab


From 66f8cf349a50e062ea1b0fa6490f821473e6487f Mon Sep 17 00:00:00 2001
From: David Gilbert <gilbert@vr.rwth-aachen.de>
Date: Fri, 24 Jan 2025 14:35:50 +0100
Subject: [PATCH 04/19] fix(pawn): Sets basepawn nav mode to ghost as well.

---
 Content/Pawn/Base/BP_RWTHVRPawn_Base.uasset | Bin 27162 -> 27319 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)

diff --git a/Content/Pawn/Base/BP_RWTHVRPawn_Base.uasset b/Content/Pawn/Base/BP_RWTHVRPawn_Base.uasset
index 2c222f4e0156fee460bd421a3c52ed19b0784754..435be5fe5966d3796891186bfc38247df833f47b 100644
GIT binary patch
delta 6144
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
D2cXMJ

delta 5885
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
N7c~6fGr1zm9ss=dpv3?H

-- 
GitLab


From 0f95bcd7602b466ed294fc3a419a9cc73fadcacc Mon Sep 17 00:00:00 2001
From: David Gilbert <gilbert@vr.rwth-aachen.de>
Date: Mon, 3 Feb 2025 09:14:54 +0100
Subject: [PATCH 05/19] fix(utilities): Fixes problem with check for HMD, now
 using new Unreal internal function.

---
 Source/RWTHVRToolkit/Private/Utility/RWTHVRUtilities.cpp | 5 ++---
 Source/RWTHVRToolkit/RWTHVRToolkit.Build.cs              | 2 +-
 2 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/Source/RWTHVRToolkit/Private/Utility/RWTHVRUtilities.cpp b/Source/RWTHVRToolkit/Private/Utility/RWTHVRUtilities.cpp
index 0ac047f0..4e7403fc 100644
--- a/Source/RWTHVRToolkit/Private/Utility/RWTHVRUtilities.cpp
+++ b/Source/RWTHVRToolkit/Private/Utility/RWTHVRUtilities.cpp
@@ -1,6 +1,7 @@
 #include "Utility/RWTHVRUtilities.h"
 
 #include "AudioDevice.h"
+#include "HeadMountedDisplayFunctionLibrary.h"
 #include "IHeadMountedDisplay.h"
 #include "IXRTrackingSystem.h"
 #include "Engine/Engine.h"
@@ -18,9 +19,7 @@ bool URWTHVRUtilities::IsDesktopMode() { return !IsRoomMountedMode() && !IsHeadM
 
 bool URWTHVRUtilities::IsHeadMountedMode()
 {
-	// In editor builds: checks for EdEngine->IsVRPreviewActive()
-	// In packaged builds: checks for `-vr` in commandline or bStartInVR in UGeneralProjectSettings
-	return FAudioDevice::CanUseVRAudioDevice();
+	return UHeadMountedDisplayFunctionLibrary::IsHeadMountedDisplayEnabled();
 }
 
 bool URWTHVRUtilities::IsRoomMountedMode()
diff --git a/Source/RWTHVRToolkit/RWTHVRToolkit.Build.cs b/Source/RWTHVRToolkit/RWTHVRToolkit.Build.cs
index a949553a..3ca3534e 100644
--- a/Source/RWTHVRToolkit/RWTHVRToolkit.Build.cs
+++ b/Source/RWTHVRToolkit/RWTHVRToolkit.Build.cs
@@ -38,7 +38,7 @@ public class RWTHVRToolkit : ModuleRules
 		PrivateDependencyModuleNames.AddRange(
 			new string[]
 			{
-				"NetCore"
+				"NetCore", "XRBase"
 			}
 		);
 		if (Target.bBuildEditor == true)
-- 
GitLab


From 1ce174ce76b7a449eb98d136f847d5c20c583c24 Mon Sep 17 00:00:00 2001
From: David Gilbert <gilbert@vr.rwth-aachen.de>
Date: Mon, 3 Feb 2025 10:06:40 +0100
Subject: [PATCH 06/19] fix(pawn): Fixes issue with setting player type to hmd,
 it was never actually set.

---
 Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp b/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp
index f6f9f1c0..ba4519c6 100644
--- a/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp
+++ b/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp
@@ -122,14 +122,18 @@ void ARWTHVRPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponen
 	if (ARWTHVRPlayerState* State = GetPlayerState<ARWTHVRPlayerState>())
 	{
 		// Might not be properly synced yet?
-		const EPlayerType Type = State->GetPlayerType();
+		EPlayerType Type = State->GetPlayerType();
 
 		// Don't do anything with the type if it's been set to clustertype or anything.
 		// This is already being done when connecting to the server.
 		const bool bClusterType = Type == EPlayerType::nDisplayPrimary || Type == EPlayerType::nDisplaySecondary;
-
-		if (!bClusterType && URWTHVRUtilities::IsHeadMountedMode())
+		
+		if (!bClusterType)
 		{
+			if (URWTHVRUtilities::IsHeadMountedMode())
+				Type = EPlayerType::HMD;
+			
+			UE_LOGFMT(Toolkit, Display, "Pawn: Requesting Player Type {T}...", StaticCast<int8>(Type));
 			// Could be too early to call this RPC...
 			State->RequestSetPlayerType(Type);
 		}
-- 
GitLab


From b82a2022d66b35311dce7fb7946e5d5fbc8478c9 Mon Sep 17 00:00:00 2001
From: David Gilbert <gilbert@vr.rwth-aachen.de>
Date: Wed, 19 Mar 2025 13:15:07 +0100
Subject: [PATCH 07/19] style: fixes clang format issues in pawn and utilities

---
 Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp         | 4 ++--
 Source/RWTHVRToolkit/Private/Utility/RWTHVRUtilities.cpp | 7 ++-----
 2 files changed, 4 insertions(+), 7 deletions(-)

diff --git a/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp b/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp
index ba4519c6..96e490aa 100644
--- a/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp
+++ b/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp
@@ -127,12 +127,12 @@ void ARWTHVRPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponen
 		// Don't do anything with the type if it's been set to clustertype or anything.
 		// This is already being done when connecting to the server.
 		const bool bClusterType = Type == EPlayerType::nDisplayPrimary || Type == EPlayerType::nDisplaySecondary;
-		
+
 		if (!bClusterType)
 		{
 			if (URWTHVRUtilities::IsHeadMountedMode())
 				Type = EPlayerType::HMD;
-			
+
 			UE_LOGFMT(Toolkit, Display, "Pawn: Requesting Player Type {T}...", StaticCast<int8>(Type));
 			// Could be too early to call this RPC...
 			State->RequestSetPlayerType(Type);
diff --git a/Source/RWTHVRToolkit/Private/Utility/RWTHVRUtilities.cpp b/Source/RWTHVRToolkit/Private/Utility/RWTHVRUtilities.cpp
index 4e7403fc..af8fc108 100644
--- a/Source/RWTHVRToolkit/Private/Utility/RWTHVRUtilities.cpp
+++ b/Source/RWTHVRToolkit/Private/Utility/RWTHVRUtilities.cpp
@@ -17,10 +17,7 @@ DEFINE_LOG_CATEGORY(Toolkit);
 
 bool URWTHVRUtilities::IsDesktopMode() { return !IsRoomMountedMode() && !IsHeadMountedMode(); }
 
-bool URWTHVRUtilities::IsHeadMountedMode()
-{
-	return UHeadMountedDisplayFunctionLibrary::IsHeadMountedDisplayEnabled();
-}
+bool URWTHVRUtilities::IsHeadMountedMode() { return UHeadMountedDisplayFunctionLibrary::IsHeadMountedDisplayEnabled(); }
 
 bool URWTHVRUtilities::IsRoomMountedMode()
 {
@@ -37,7 +34,7 @@ bool URWTHVRUtilities::IsPrimaryNode()
 	return URWTHVRClusterUtilities::IsPrimaryNode();
 #else
 	return false;
-#endif	
+#endif
 }
 
 float URWTHVRUtilities::GetEyeDistance()
-- 
GitLab


From 75b578cad14a69ec1527aeb2c17c859291da96fd Mon Sep 17 00:00:00 2001
From: David Gilbert <gilbert@vr.rwth-aachen.de>
Date: Wed, 19 Mar 2025 15:43:56 +0100
Subject: [PATCH 08/19] fix(replication): Makes ClientTransformReplication use
 relative position and rotation.

---
 .../Private/Core/ClientTransformReplication.cpp              | 4 ++--
 .../RWTHVRToolkit/Public/Core/ClientTransformReplication.h   | 5 ++++-
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/Source/RWTHVRToolkit/Private/Core/ClientTransformReplication.cpp b/Source/RWTHVRToolkit/Private/Core/ClientTransformReplication.cpp
index 0bce9302..011c8337 100644
--- a/Source/RWTHVRToolkit/Private/Core/ClientTransformReplication.cpp
+++ b/Source/RWTHVRToolkit/Private/Core/ClientTransformReplication.cpp
@@ -26,8 +26,8 @@ void UClientTransformReplication::UpdateState(float DeltaTime)
 		// Only do this if we actually replicate the actor
 		if (GetIsReplicated())
 		{
-			const FVector Loc = OwningActor->GetActorLocation();
-			const FRotator Rot = OwningActor->GetActorRotation();
+			const FVector Loc = OwningActor->GetRootComponent()->GetRelativeLocation();
+			const FRotator Rot = OwningActor->GetRootComponent()->GetRelativeRotation();
 
 			// Only update state if the local state changed
 			if (!Loc.Equals(ReplicatedTransform.Position) || !Rot.Equals(ReplicatedTransform.Rotation))
diff --git a/Source/RWTHVRToolkit/Public/Core/ClientTransformReplication.h b/Source/RWTHVRToolkit/Public/Core/ClientTransformReplication.h
index ac364067..c31ed9bd 100644
--- a/Source/RWTHVRToolkit/Public/Core/ClientTransformReplication.h
+++ b/Source/RWTHVRToolkit/Public/Core/ClientTransformReplication.h
@@ -56,7 +56,10 @@ protected:
 		// For now, directly apply the transforms:
 		auto* OwningActor = GetOwner();
 		if (OwningActor && OwningActor->HasValidRootComponent())
-			OwningActor->SetActorLocationAndRotation(ReplicatedTransform.Position, ReplicatedTransform.Rotation);
+		{
+			OwningActor->SetActorRelativeLocation(ReplicatedTransform.Position);
+			OwningActor->SetActorRelativeRotation(ReplicatedTransform.Rotation);
+		}
 	}
 
 	// Unreliable Server RPC that sends the transform from owning client to the server
-- 
GitLab


From ec48445925c9bf656934887a1f557e3429aceb7f Mon Sep 17 00:00:00 2001
From: David Gilbert <gilbert@vr.rwth-aachen.de>
Date: Sat, 29 Mar 2025 11:57:05 +0100
Subject: [PATCH 09/19] hotfix(interaction): fixes crash that can happen when a
 previously grabbed item gets destroyed

---
 .../Interaction/Interactors/DirectInteractionComponent.cpp | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/Source/RWTHVRToolkit/Private/Interaction/Interactors/DirectInteractionComponent.cpp b/Source/RWTHVRToolkit/Private/Interaction/Interactors/DirectInteractionComponent.cpp
index 18e51581..f759b37b 100644
--- a/Source/RWTHVRToolkit/Private/Interaction/Interactors/DirectInteractionComponent.cpp
+++ b/Source/RWTHVRToolkit/Private/Interaction/Interactors/DirectInteractionComponent.cpp
@@ -70,6 +70,13 @@ void UDirectInteractionComponent::TickComponent(float DeltaTime, ELevelTick Tick
 	// Call hover end events on all components that were previously in range, but not anymore
 	for (UInteractableComponent* PrevInteractableComp : PreviousInteractableComponentsInRange)
 	{
+		// It can happen that a previous component was destroyed
+		if (!PrevInteractableComp || !PrevInteractableComp->IsValidLowLevel())
+		{
+			ComponentsToRemove.Add(PrevInteractableComp); // might have to use indices here
+			continue;
+		}
+		
 		if (!CurrentInteractableCompsInRange.Contains(PrevInteractableComp))
 		{
 			ComponentsToRemove.AddUnique(PrevInteractableComp);
-- 
GitLab


From 8dd3010c03bbd82aa1d6df3e4c40d6d6a8469db7 Mon Sep 17 00:00:00 2001
From: Kris Helwig <helwig@vr.rwth-aachen.de>
Date: Tue, 8 Apr 2025 13:03:11 +0200
Subject: [PATCH 10/19] refactor(pawn): changes from a delegate approach to an
 interface approach

---
 Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp b/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp
index dc9c9022..31874d9f 100644
--- a/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp
+++ b/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp
@@ -18,6 +18,10 @@
 #include "Utility/RWTHVRUtilities.h"
 
 #if PLATFORM_SUPPORTS_CLUSTER
+#include "DisplayClusterRootActor.h"
+#include "ScalableConfigInterface.h"
+#include "IDisplayCluster.h"
+#include "Game/IDisplayClusterGameManager.h"
 #include "Components/DisplayClusterSceneComponentSyncParent.h"
 #endif
 
@@ -85,7 +89,16 @@ void ARWTHVRPawn::SetScale(float NewScale)
 	FVector NewScaleVector = FVector(UniformScale, UniformScale, UniformScale);
 	GetWorldSettings()->WorldToMeters = InitialWorldToMeters * UniformScale;
 	SetActorRelativeScale3D(NewScaleVector);
-	OnScaleChanged.Broadcast(OldScale, NewScale);
+	
+#if PLATFORM_SUPPORTS_CLUSTER
+	const ARWTHVRPlayerState* State = GetPlayerState<ARWTHVRPlayerState>();
+	if (URWTHVRUtilities::IsHeadMountedMode() && State && State->GetCorrespondingClusterActor())
+	{
+		const auto ClusterRootActor = IDisplayCluster::Get().GetGameMgr()->GetRootActor();
+		IScalableConfigInterface* ConfigInterface = Cast<IScalableConfigInterface>(ClusterRootActor);
+		ConfigInterface->OnScaleChanged(NewScale);
+	}
+#endif
 }
 
 float ARWTHVRPawn::GetScale() { return UniformScale; }
-- 
GitLab


From 043d07fa7933e1873f87c21b9eb91d2dc8cba97f Mon Sep 17 00:00:00 2001
From: Kris Tabea Helwig <helwig@vr.rwth-aachen.de>
Date: Tue, 8 Apr 2025 13:50:07 +0200
Subject: [PATCH 11/19] Sets correct branch

---
 .gitlab-ci.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 93d693e4..dce45555 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -83,7 +83,7 @@ Generate_Project:
         RUN_SETUP: "false"
         GEN_DEPENDENCIES: "(
             [master@UnrealDTrackPlugin]='https://github.com/VRGroupRWTH/UnrealDTrackPlugin.git'
-            [dev/5.4@RWTHVRCluster]='https://git-ce.rwth-aachen.de/vr-vis/VR-Group/unreal-development/plugins/rwth-vr-cluster-plugin.git'
+            [feature/scaling@RWTHVRCluster]='https://git-ce.rwth-aachen.de/vr-vis/VR-Group/unreal-development/plugins/rwth-vr-cluster-plugin.git'
             )"
 
 Generate_Project_Without_Cluster:
-- 
GitLab


From a5eeaa493ded672a665d49c74918845afd131fbc Mon Sep 17 00:00:00 2001
From: Kris Helwig <helwig@vr.rwth-aachen.de>
Date: Tue, 8 Apr 2025 16:29:31 +0200
Subject: [PATCH 12/19] clang

---
 Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp b/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp
index 31874d9f..b79168b6 100644
--- a/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp
+++ b/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp
@@ -89,7 +89,7 @@ void ARWTHVRPawn::SetScale(float NewScale)
 	FVector NewScaleVector = FVector(UniformScale, UniformScale, UniformScale);
 	GetWorldSettings()->WorldToMeters = InitialWorldToMeters * UniformScale;
 	SetActorRelativeScale3D(NewScaleVector);
-	
+
 #if PLATFORM_SUPPORTS_CLUSTER
 	const ARWTHVRPlayerState* State = GetPlayerState<ARWTHVRPlayerState>();
 	if (URWTHVRUtilities::IsHeadMountedMode() && State && State->GetCorrespondingClusterActor())
-- 
GitLab


From 193a009aab78ea8af1f4415ffe5d022b546b14ec Mon Sep 17 00:00:00 2001
From: Kris Helwig <helwig@vr.rwth-aachen.de>
Date: Fri, 11 Apr 2025 09:45:06 +0200
Subject: [PATCH 13/19] Fix(Pawn): Fixed config interface casting

---
 .../RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp | 22 ++++++++++++++-----
 1 file changed, 17 insertions(+), 5 deletions(-)

diff --git a/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp b/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp
index b79168b6..8f0ecb46 100644
--- a/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp
+++ b/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp
@@ -84,7 +84,6 @@ void ARWTHVRPawn::Tick(float DeltaSeconds)
  */
 void ARWTHVRPawn::SetScale(float NewScale)
 {
-	FVector OldScale = GetActorScale();
 	UniformScale = NewScale;
 	FVector NewScaleVector = FVector(UniformScale, UniformScale, UniformScale);
 	GetWorldSettings()->WorldToMeters = InitialWorldToMeters * UniformScale;
@@ -92,11 +91,24 @@ void ARWTHVRPawn::SetScale(float NewScale)
 
 #if PLATFORM_SUPPORTS_CLUSTER
 	const ARWTHVRPlayerState* State = GetPlayerState<ARWTHVRPlayerState>();
-	if (URWTHVRUtilities::IsHeadMountedMode() && State && State->GetCorrespondingClusterActor())
+	if (URWTHVRUtilities::IsRoomMountedMode() && State && State->GetCorrespondingClusterActor())
 	{
-		const auto ClusterRootActor = IDisplayCluster::Get().GetGameMgr()->GetRootActor();
-		IScalableConfigInterface* ConfigInterface = Cast<IScalableConfigInterface>(ClusterRootActor);
-		ConfigInterface->OnScaleChanged(NewScale);
+		if (const auto GameMgr = IDisplayCluster::Get().GetGameMgr())
+		{
+			if (const auto ClusterRootActor = GameMgr->GetRootActor())
+			{
+				if (ClusterRootActor->Implements<UScalableConfigInterface>())
+				{
+					IScalableConfigInterface::Execute_OnScaleChanged(ClusterRootActor, NewScale);
+				}
+				else
+				{
+					UE_LOGFMT(Toolkit, Warning,
+							  "The ClusterRootActor {0} does not implement the ScalableConfigInterface. Scaling the Pawn on the cluster will lead to unintended behavior.",
+							  ClusterRootActor->GetName());
+				}
+			}
+		}
 	}
 #endif
 }
-- 
GitLab


From bbed2d2c4c47e59ea760d42cb7456623bc162c57 Mon Sep 17 00:00:00 2001
From: Kris Helwig <helwig@vr.rwth-aachen.de>
Date: Fri, 11 Apr 2025 09:48:14 +0200
Subject: [PATCH 14/19] clang(Pawn)

---
 Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp b/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp
index 8f0ecb46..9becddbd 100644
--- a/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp
+++ b/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp
@@ -104,7 +104,8 @@ void ARWTHVRPawn::SetScale(float NewScale)
 				else
 				{
 					UE_LOGFMT(Toolkit, Warning,
-							  "The ClusterRootActor {0} does not implement the ScalableConfigInterface. Scaling the Pawn on the cluster will lead to unintended behavior.",
+							  "The ClusterRootActor {0} does not implement the ScalableConfigInterface. Scaling the "
+							  "Pawn on the cluster will lead to unintended behavior.",
 							  ClusterRootActor->GetName());
 				}
 			}
-- 
GitLab


From 8df591ea3e4e131dbae822820461d6a5c5ebc28d Mon Sep 17 00:00:00 2001
From: David Gilbert <gilbert@vr.rwth-aachen.de>
Date: Mon, 28 Apr 2025 08:42:31 +0200
Subject: [PATCH 15/19] style(interaction): Makes clang formatting happy.

---
 .../Interaction/Interactors/DirectInteractionComponent.cpp      | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Source/RWTHVRToolkit/Private/Interaction/Interactors/DirectInteractionComponent.cpp b/Source/RWTHVRToolkit/Private/Interaction/Interactors/DirectInteractionComponent.cpp
index f759b37b..fac35ab8 100644
--- a/Source/RWTHVRToolkit/Private/Interaction/Interactors/DirectInteractionComponent.cpp
+++ b/Source/RWTHVRToolkit/Private/Interaction/Interactors/DirectInteractionComponent.cpp
@@ -76,7 +76,7 @@ void UDirectInteractionComponent::TickComponent(float DeltaTime, ELevelTick Tick
 			ComponentsToRemove.Add(PrevInteractableComp); // might have to use indices here
 			continue;
 		}
-		
+
 		if (!CurrentInteractableCompsInRange.Contains(PrevInteractableComp))
 		{
 			ComponentsToRemove.AddUnique(PrevInteractableComp);
-- 
GitLab


From 01a12211c2261f05b4b1af206b390cc380c91459 Mon Sep 17 00:00:00 2001
From: Kris Helwig <helwig@vr.rwth-aachen.de>
Date: Thu, 12 Jun 2025 09:36:16 +0200
Subject: [PATCH 16/19] docs(pawn): updates comment for clarity

---
 Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp b/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp
index 9becddbd..3298a60c 100644
--- a/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp
+++ b/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp
@@ -79,7 +79,7 @@ void ARWTHVRPawn::Tick(float DeltaSeconds)
 }
 
 /*
- *	Scales the Pawn while also adjusting the WorldToMeters ratio to adjust for pupillary distance.
+ *	Scales the Pawn while also adjusting the WorldToMeters ratio for size relative movement speed.
  *	Only supports uniform scaling.
  */
 void ARWTHVRPawn::SetScale(float NewScale)
-- 
GitLab


From 794e5ac7d495d76174e2a22958a9495b76cda537 Mon Sep 17 00:00:00 2001
From: Kris Helwig <helwig@vr.rwth-aachen.de>
Date: Thu, 12 Jun 2025 10:48:22 +0200
Subject: [PATCH 17/19] fix(pawn): removes worldtometers scaling

---
 Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp | 10 ++--------
 Source/RWTHVRToolkit/Public/Pawn/RWTHVRPawn.h    |  1 -
 2 files changed, 2 insertions(+), 9 deletions(-)

diff --git a/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp b/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp
index 3298a60c..f8d78c33 100644
--- a/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp
+++ b/Source/RWTHVRToolkit/Private/Pawn/RWTHVRPawn.cpp
@@ -60,11 +60,7 @@ ARWTHVRPawn::ARWTHVRPawn(const FObjectInitializer& ObjectInitializer) : Super(Ob
 		});
 }
 
-void ARWTHVRPawn::BeginPlay()
-{
-	Super::BeginPlay();
-	InitialWorldToMeters = GetWorldSettings()->WorldToMeters;
-}
+void ARWTHVRPawn::BeginPlay() { Super::BeginPlay(); }
 
 void ARWTHVRPawn::Tick(float DeltaSeconds)
 {
@@ -79,14 +75,12 @@ void ARWTHVRPawn::Tick(float DeltaSeconds)
 }
 
 /*
- *	Scales the Pawn while also adjusting the WorldToMeters ratio for size relative movement speed.
- *	Only supports uniform scaling.
+ *	Scales the Pawn. Only supports uniform scaling.
  */
 void ARWTHVRPawn::SetScale(float NewScale)
 {
 	UniformScale = NewScale;
 	FVector NewScaleVector = FVector(UniformScale, UniformScale, UniformScale);
-	GetWorldSettings()->WorldToMeters = InitialWorldToMeters * UniformScale;
 	SetActorRelativeScale3D(NewScaleVector);
 
 #if PLATFORM_SUPPORTS_CLUSTER
diff --git a/Source/RWTHVRToolkit/Public/Pawn/RWTHVRPawn.h b/Source/RWTHVRToolkit/Public/Pawn/RWTHVRPawn.h
index 40eb174f..dcd506b1 100644
--- a/Source/RWTHVRToolkit/Public/Pawn/RWTHVRPawn.h
+++ b/Source/RWTHVRToolkit/Public/Pawn/RWTHVRPawn.h
@@ -122,6 +122,5 @@ protected:
 
 private:
 	UInputComponent* ActivePlayerInputComponent;
-	float InitialWorldToMeters;
 	float UniformScale;
 };
-- 
GitLab


From 594b471789873da5c9abeac3baec641cdfe8a416 Mon Sep 17 00:00:00 2001
From: Kris Tabea Helwig <helwig@vr.rwth-aachen.de>
Date: Thu, 12 Jun 2025 13:16:01 +0200
Subject: [PATCH 18/19] Edit .gitlab-ci.yml

---
 .gitlab-ci.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index dce45555..93d693e4 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -83,7 +83,7 @@ Generate_Project:
         RUN_SETUP: "false"
         GEN_DEPENDENCIES: "(
             [master@UnrealDTrackPlugin]='https://github.com/VRGroupRWTH/UnrealDTrackPlugin.git'
-            [feature/scaling@RWTHVRCluster]='https://git-ce.rwth-aachen.de/vr-vis/VR-Group/unreal-development/plugins/rwth-vr-cluster-plugin.git'
+            [dev/5.4@RWTHVRCluster]='https://git-ce.rwth-aachen.de/vr-vis/VR-Group/unreal-development/plugins/rwth-vr-cluster-plugin.git'
             )"
 
 Generate_Project_Without_Cluster:
-- 
GitLab


From 673359eb41b9be55aaea9c9d9206337f989ebee2 Mon Sep 17 00:00:00 2001
From: David Gilbert <david.gilbert@rwth-aachen.de>
Date: Wed, 18 Jun 2025 09:55:26 +0200
Subject: [PATCH 19/19] ci: also adds input variables to CI

---
 .gitlab-ci.yml | 44 ++++++++++++++++++++++++++++++--------------
 1 file changed, 30 insertions(+), 14 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 93d693e4..e63ad670 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -3,6 +3,30 @@
 # Virtual Reality & Immersive Visualisation Group.
 #-------------------------------------------------------------------------------
 
+spec:
+  inputs:
+    unreal_version:
+      description: The Unreal Engine version in the form of "major.minor"
+      type: string
+      regex: \d+\.\d+
+      default: "5.4"
+    build_type:
+      description: The game build type.
+      type: string
+      options: ["DebugGame", "Shipping"]
+      default: "DebugGame"
+    number_of_old_versions:
+      description: How many successful pipeline builds of this branch should be stored on the cluster.
+      type: number
+      default: 3
+    custom_ndisplay_config:
+      description: Custom nDisplay config stored on the cluster filesystem.
+      type: string
+      default: ""
+
+---
+
+
 # The include file can be change to either be removed or reference a specific commit.
 
 include:
@@ -41,8 +65,9 @@ include:
 # Use the CUSTOM_NDISPLAY_CONFIG variable in case you need a custom ndisplay config. These are always located in /home/vrdemo/configs/ndisplay.
 
 variables:
-    UNREAL_VERSION: "5.4"
-    CUSTOM_NDISPLAY_CONFIG: "aixcave_5_4.ndisplay"
+    UNREAL_VERSION: $[[ inputs.unreal_version ]]
+    NUMBER_OF_OLD_VERSIONS: $[[ inputs.number_of_old_versions ]]
+    CUSTOM_NDISPLAY_CONFIG: $[[ inputs.custom_ndisplay_config ]]
 
 stages:
   - analyze
@@ -113,7 +138,7 @@ Build_Windows:
         GIT_STRATEGY: none   
         GIT_CHECKOUT: "false"
         # CLIENT_CONFIG: "Shipping"
-        CLIENT_CONFIG: "DebugGame"
+        CLIENT_CONFIG: $[[ inputs.build_type ]]
     needs:
         - job: "Generate_Project"
           artifacts: true
@@ -134,7 +159,7 @@ Build_Linux:
         GIT_STRATEGY: none   
         GIT_CHECKOUT: "false"
         # CLIENT_CONFIG: "Shipping"
-        CLIENT_CONFIG: "DebugGame"
+        CLIENT_CONFIG: $[[ inputs.build_type ]]
     needs:
         - job: "Generate_Project"
           artifacts: true
@@ -146,16 +171,7 @@ Build_Linux_Without_Cluster:
     needs:
         - job: "Generate_Project_Without_Cluster"
           artifacts: true
-
-# Deploys to vrdev
-.Deploy_Windows:
-    rules: 
-      - if: $CI_PIPELINE_SOURCE == "web"
-      - if: $CI_PIPELINE_SOURCE == "schedule"
-    extends: .Deploy_VRDev_
-    needs:
-        - job: "Build_Windows"
-          artifacts: true          
+             
 
 # Deploys to vrdemo instead of av006de. Use extends: .Deploy_CAVE_ to deploy to legacy av006de
 Deploy_CAVE:
-- 
GitLab