From ffa96ac40b64c0caa3df341b8ce7346aa8c7f48f Mon Sep 17 00:00:00 2001
From: "jonathan.ehret" <ehret@vr.rwth-aachen.de>
Date: Fri, 7 Jul 2023 14:48:19 +0200
Subject: [PATCH] add the possibility to force fading

---
 .../Private/HUD/SFFadeHandler.cpp             |  7 ++++---
 .../Private/SFGameInstance.cpp                | 19 ++++++++++---------
 .../Public/HUD/SFFadeHandler.h                |  2 +-
 .../Public/SFGameInstance.h                   | 12 ++++++++----
 4 files changed, 23 insertions(+), 17 deletions(-)

diff --git a/Source/StudyFrameworkPlugin/Private/HUD/SFFadeHandler.cpp b/Source/StudyFrameworkPlugin/Private/HUD/SFFadeHandler.cpp
index c156127..e4d4fb4 100644
--- a/Source/StudyFrameworkPlugin/Private/HUD/SFFadeHandler.cpp
+++ b/Source/StudyFrameworkPlugin/Private/HUD/SFFadeHandler.cpp
@@ -93,7 +93,7 @@ void USFFadeHandler::Tick()
 	}
 }
 
-void USFFadeHandler::FadeToLevel(const FString& NextLevelName, const bool bStartFadeFadedOut)
+void USFFadeHandler::FadeToLevel(const FString& NextLevelName, bool bForceFade, const bool bStartFadeFadedOut)
 {
 	if (GetCameraManager() == nullptr)
 	{
@@ -124,7 +124,8 @@ void USFFadeHandler::FadeToLevel(const FString& NextLevelName, const bool bStart
 		FadeState = EFadeState::FadingOut;
 	}
 	else if (USFGameInstance::Get()->GetStudySetup()->bNoFadingOnSameMap 
-		&& CurrentLevelName == FPackageName::GetShortName(NextLevelName))
+		&& CurrentLevelName == FPackageName::GetShortName(NextLevelName)
+		&& !bForceFade)
 	{
 		//bNoFadingOnSameMap and fade to same map, so no fading, but pretend we "faded in"
 		FadeState = EFadeState::FadingIn;
@@ -157,7 +158,7 @@ void USFFadeHandler::FadeIn()
 
 void USFFadeHandler::FadeOut()
 {
-	FadeToLevel("");
+	FadeToLevel("", true);
 }
 
 
diff --git a/Source/StudyFrameworkPlugin/Private/SFGameInstance.cpp b/Source/StudyFrameworkPlugin/Private/SFGameInstance.cpp
index a905cab..02a8ef1 100644
--- a/Source/StudyFrameworkPlugin/Private/SFGameInstance.cpp
+++ b/Source/StudyFrameworkPlugin/Private/SFGameInstance.cpp
@@ -412,7 +412,7 @@ void USFGameInstance::EndStudy()
 }
 
 
-bool USFGameInstance::NextCondition(bool bForced /*=false*/)
+bool USFGameInstance::NextCondition(bool bForced /*=false*/, bool bForceFade /*= false*/)
 {
 	// Check if is already fading
 	if (FadeHandler->GetIsFading() && !FadeHandler->GetIsFadedOutWaitingForLevel())
@@ -428,10 +428,10 @@ bool USFGameInstance::NextCondition(bool bForced /*=false*/)
 		EndStudy();
 		return false;
 	}
-	return GoToCondition(NextCondition, bForced);
+	return GoToCondition(NextCondition, bForced, bForceFade);
 }
 
-bool USFGameInstance::GoToCondition(const USFCondition* Condition, bool bForced /*=false*/)
+bool USFGameInstance::GoToCondition(const USFCondition* Condition, bool bForced /*=false*/, bool bForceFade /*= false*/)
 {
 	// Check if is already fading
 	if (FadeHandler->GetIsFading() && !FadeHandler->GetIsFadedOutWaitingForLevel())
@@ -445,16 +445,16 @@ bool USFGameInstance::GoToCondition(const USFCondition* Condition, bool bForced
 		FSFLoggingUtils::Log("[USFGameInstance::GoToCondition()]: Could not load next condition.", true);
 		return false;
 	}
-	GoToConditionSynced(Condition->UniqueName, bForced);
+	GoToConditionSynced(Condition->UniqueName, bForced, bForceFade);
 	return true;
 }
 
-void USFGameInstance::GoToConditionSynced(FString ConditionName, bool bForced)
+void USFGameInstance::GoToConditionSynced(FString ConditionName, bool bForced, bool bForceFade)
 {
 	const EDisplayClusterOperationMode OperationMode = IDisplayCluster::Get().GetOperationMode();
 	if (OperationMode != EDisplayClusterOperationMode::Cluster)
 	{
-		HandleGoToConditionSynced(ConditionName, bForced);
+		HandleGoToConditionSynced(ConditionName, bForced, bForceFade);
 	}
 	else
 	{
@@ -467,6 +467,7 @@ void USFGameInstance::GoToConditionSynced(FString ConditionName, bool bForced)
 		TMap<FString, FString> Params;
 		Params.Add("ConditionName", ConditionName);
 		Params.Add("bForced", bForced ?"true":"false");
+		Params.Add("bForceFade", bForceFade ? "true" : "false");
 		ClusterEvent.Parameters = Params;
 		ClusterEvent.bShouldDiscardOnRepeat = true;
 
@@ -479,13 +480,13 @@ void USFGameInstance::HandleClusterEvent(const FDisplayClusterClusterEventJson&
 		//now we actually react on all cluster nodes:
 		if(Event.Name == "GoToConditionSynced")
 		{
-			HandleGoToConditionSynced(Event.Parameters["ConditionName"], Event.Parameters["bForced"] == "true");
+			HandleGoToConditionSynced(Event.Parameters["ConditionName"], Event.Parameters["bForced"] == "true", Event.Parameters["bForceFade"] == "true");
 		}
 	}
 }
 
 
-void USFGameInstance::HandleGoToConditionSynced(FString ConditionName, bool bForced)
+void USFGameInstance::HandleGoToConditionSynced(FString ConditionName, bool bForced, bool bForceFade)
 {
 	USFCondition* NextCondition = nullptr;
 	for (USFCondition* Condition : Participant->GetAllConditions())
@@ -556,7 +557,7 @@ void USFGameInstance::HandleGoToConditionSynced(FString ConditionName, bool bFor
 		}
 		else
 		{
-			FadeHandler->FadeToLevel(NextCondition->Map);
+			FadeHandler->FadeToLevel(NextCondition->Map, bForceFade);
 		}
 		UpdateHUD("Fading out");
 	}
diff --git a/Source/StudyFrameworkPlugin/Public/HUD/SFFadeHandler.h b/Source/StudyFrameworkPlugin/Public/HUD/SFFadeHandler.h
index b8ef4e3..82f579f 100644
--- a/Source/StudyFrameworkPlugin/Public/HUD/SFFadeHandler.h
+++ b/Source/StudyFrameworkPlugin/Public/HUD/SFFadeHandler.h
@@ -45,7 +45,7 @@ class STUDYFRAMEWORKPLUGIN_API USFFadeHandler : public UObject
 public:
 	void Tick();
 
-	void FadeToLevel(const FString& LevelName, bool bStartFadedOut = false);
+	void FadeToLevel(const FString& LevelName, bool bForceFade, bool bStartFadedOut = false);
 	void FadeIn();
 	void FadeOut();
 	float FadeTimeRemaining() const;
diff --git a/Source/StudyFrameworkPlugin/Public/SFGameInstance.h b/Source/StudyFrameworkPlugin/Public/SFGameInstance.h
index 1c28cf8..cb6622b 100644
--- a/Source/StudyFrameworkPlugin/Public/SFGameInstance.h
+++ b/Source/StudyFrameworkPlugin/Public/SFGameInstance.h
@@ -51,13 +51,17 @@ public:
 
 	//Fade to the next condition (use this to proceed in the study once condition is done)
 	//bForce also goes to the next condition if the current condition was not finished (not all required dependent variables gathered)
+	//bForceFade: unless specified differently in the StudySetup it is faded between every two conditions, if bNoFadingOnSameMap is set to false,
+	//            bForceFade forces to fade anyways between two conditions on the same map and has not effect otherwise 
 	UFUNCTION(BlueprintCallable)
-	bool NextCondition(bool bForce = false);
+	bool NextCondition(bool bForce = false, bool bForceFade = false);
 
 	//This method can be used to jump to a specific condition (DO NOT USE during normal study run)
 	//bForce also goes to the next condition if the current condition was not finished (not all required dependent variables gathered)
+	//bForceFade: unless specified differently in the StudySetup it is faded between every two conditions, if bNoFadingOnSameMap is set to false,
+	//            bForceFade forces to fade anyways between two conditions on the same map and has not effect otherwise 
 	UFUNCTION(BlueprintCallable)
-	bool GoToCondition(const USFCondition* Condition, bool bForce = false);
+	bool GoToCondition(const USFCondition* Condition, bool bForce = false, bool bForceFade = false);
 
 	//Whether the study was started already
 	UFUNCTION(BlueprintCallable)
@@ -173,8 +177,8 @@ protected:
 	void EndStudy();
 
 	//we use cluster events so GoToConditionSynced can not run out of sync when using nDisplay in cluster mode
-	void GoToConditionSynced(FString ConditionName, bool bForced); //send the cluster event
-	void HandleGoToConditionSynced(FString ConditionName, bool bForced); //process the cluter event
+	void GoToConditionSynced(FString ConditionName, bool bForced, bool bForceFade); //send the cluster event
+	void HandleGoToConditionSynced(FString ConditionName, bool bForced, bool bForceFade); //process the cluter event
 	FOnClusterEventJsonListener ClusterEventListenerDelegate;
 	void HandleClusterEvent(const FDisplayClusterClusterEventJson& Event);
 
-- 
GitLab