initial Commit

This commit is contained in:
2026-07-02 17:29:08 +02:00
commit 4082d1960b
42 changed files with 7867 additions and 0 deletions

4
.gitignore vendored Normal file
View File

@@ -0,0 +1,4 @@
.vs/
.vsconfig
Binaries/
Intermediate/

0
Config/DefaultEditor.ini Normal file
View File

84
Config/DefaultEngine.ini Normal file
View File

@@ -0,0 +1,84 @@
[/Script/EngineSettings.GameMapsSettings]
GameDefaultMap=/Engine/Maps/Templates/OpenWorld
[/Script/Engine.RendererSettings]
r.AllowStaticLighting=False
r.GenerateMeshDistanceFields=True
r.DynamicGlobalIlluminationMethod=1
r.ReflectionMethod=1
r.SkinCache.CompileShaders=True
r.RayTracing=True
r.RayTracing.RayTracingProxies.ProjectEnabled=True
r.Substrate=True
r.Substrate.ProjectGBufferFormat=0
r.Shadow.Virtual.Enable=1
r.DefaultFeature.AutoExposure.ExtendDefaultLuminanceRange=True
r.DefaultFeature.LocalExposure.HighlightContrastScale=0.8
r.DefaultFeature.LocalExposure.ShadowContrastScale=0.8
[/Script/WindowsTargetPlatform.WindowsTargetSettings]
DefaultGraphicsRHI=DefaultGraphicsRHI_DX12
DefaultGraphicsRHI=DefaultGraphicsRHI_DX12
-D3D12TargetedShaderFormats=PCD3D_SM5
+D3D12TargetedShaderFormats=PCD3D_SM6
-D3D11TargetedShaderFormats=PCD3D_SM5
+D3D11TargetedShaderFormats=PCD3D_SM5
Compiler=Default
AudioSampleRate=48000
AudioCallbackBufferFrameSize=1024
AudioNumBuffersToEnqueue=1
AudioMaxChannels=0
AudioNumSourceWorkers=4
SpatializationPlugin=
SourceDataOverridePlugin=
ReverbPlugin=
OcclusionPlugin=
CompressionOverrides=(bOverrideCompressionTimes=False,DurationThreshold=5.000000,MaxNumRandomBranches=0,SoundCueQualityIndex=0)
CacheSizeKB=65536
MaxChunkSizeOverrideKB=0
bResampleForDevice=False
MaxSampleRate=48000.000000
HighSampleRate=32000.000000
MedSampleRate=24000.000000
LowSampleRate=12000.000000
MinSampleRate=8000.000000
CompressionQualityModifier=1.000000
AutoStreamingThreshold=0.000000
SoundCueCookQualityIndex=-1
[/Script/LinuxTargetPlatform.LinuxTargetSettings]
-TargetedRHIs=SF_VULKAN_SM5
+TargetedRHIs=SF_VULKAN_SM6
[/Script/MacTargetPlatform.MacTargetSettings]
-TargetedRHIs=SF_METAL_SM5
+TargetedRHIs=SF_METAL_SM6
[/Script/HardwareTargeting.HardwareTargetingSettings]
TargetedHardwareClass=EHardwareClass::Desktop
DefaultGraphicsPerformance=EGraphicsPreset::Maximum
[/Script/WorldPartitionEditor.WorldPartitionEditorSettings]
CommandletClass=Class'/Script/UnrealEd.WorldPartitionConvertCommandlet'
[/Script/Engine.UserInterfaceSettings]
bAuthorizeAutomaticWidgetVariableCreation=False
FontDPIPreset=Standard
FontDPI=72
[/Script/Engine.Engine]
+ActiveGameNameRedirects=(OldGameName="TP_Blank",NewGameName="/Script/PS_Replay")
+ActiveGameNameRedirects=(OldGameName="/Script/TP_Blank",NewGameName="/Script/PS_Replay")

6
Config/DefaultGame.ini Normal file
View File

@@ -0,0 +1,6 @@
[/Script/CommonUI.CommonUISettings]
CommonButtonAcceptKeyHandling=TriggerClick
[/Script/EngineSettings.GeneralProjectSettings]
ProjectID=602745A74504534FD4858694961F9541

84
Config/DefaultInput.ini Normal file
View File

@@ -0,0 +1,84 @@
[/Script/Engine.InputSettings]
-AxisConfig=(AxisKeyName="Gamepad_LeftX",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f))
-AxisConfig=(AxisKeyName="Gamepad_LeftY",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f))
-AxisConfig=(AxisKeyName="Gamepad_RightX",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f))
-AxisConfig=(AxisKeyName="Gamepad_RightY",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f))
-AxisConfig=(AxisKeyName="MouseX",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f))
-AxisConfig=(AxisKeyName="MouseY",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f))
-AxisConfig=(AxisKeyName="Mouse2D",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f))
+AxisConfig=(AxisKeyName="Gamepad_LeftX",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_LeftY",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_RightX",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_RightY",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MouseX",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MouseY",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Mouse2D",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MouseWheelAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_LeftTriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_RightTriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_Special_Left_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_Special_Left_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Vive_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Vive_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Vive_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Vive_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Vive_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Vive_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Left_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Right_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Grip_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Grip_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
bAltEnterTogglesFullscreen=True
bF11TogglesFullscreen=True
bUseMouseForTouch=False
bEnableMouseSmoothing=True
bEnableFOVScaling=True
bCaptureMouseOnLaunch=True
bEnableLegacyInputScales=True
bEnableMotionControls=True
bFilterInputByPlatformUser=False
bShouldFlushPressedKeysOnViewportFocusLost=True
bAlwaysShowTouchInterface=False
bShowConsoleOnFourFingerTap=True
bEnableGestureRecognizer=False
bUseAutocorrect=False
DefaultViewportMouseCaptureMode=CapturePermanently_IncludingInitialMouseDown
DefaultViewportMouseLockMode=LockOnCapture
FOVScale=0.011110
DoubleClickTime=0.200000
DefaultPlayerInputClass=/Script/EnhancedInput.EnhancedPlayerInput
DefaultInputComponentClass=/Script/EnhancedInput.EnhancedInputComponent
DefaultTouchInterface=/Engine/MobileResources/HUD/DefaultVirtualJoysticks.DefaultVirtualJoysticks
-ConsoleKeys=Tilde
+ConsoleKeys=Tilde

3440
PS_Replay.sln Normal file

File diff suppressed because it is too large Load Diff

22
PS_Replay.uproject Normal file
View File

@@ -0,0 +1,22 @@
{
"FileVersion": 3,
"EngineAssociation": "5.7",
"Category": "",
"Description": "",
"Modules": [
{
"Name": "PS_Replay",
"Type": "Runtime",
"LoadingPhase": "Default"
}
],
"Plugins": [
{
"Name": "ModelingToolsEditorMode",
"Enabled": true,
"TargetAllowList": [
"Editor"
]
}
]
}

View File

@@ -0,0 +1,28 @@
{
"FileVersion": 3,
"Version": 1,
"VersionName": "1.0",
"FriendlyName": "ReplaySystem",
"Description": "Exposes the Unreal replay system to blueprints",
"Category": "Replay",
"CreatedBy": "TareE",
"CreatedByURL": "https://www.oyintare.dev/",
"DocsURL": "https://replay.oyintare.dev/",
"MarketplaceURL": "com.epicgames.launcher://ue/marketplace/product/1b0cbe31111d482baaf531d187651e7f",
"SupportURL": "",
"CanContainContent": true,
"Installed": true,
"Modules": [
{
"Name": "ReplaySystem",
"Type": "Runtime",
"LoadingPhase": "EarliestPossible",
"PlatformAllowList": [
"Win64",
"Mac",
"Linux",
"Android"
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@@ -0,0 +1,24 @@
// Copyright 2020-Present Oyintare Ebelo. All Rights Reserved.
#include "DeleteReplayObject.h"
#include "NetworkReplayStreaming.h"
void UDeleteReplayObject::DeleteReplay(const FString& ReplayName)
{
EnumerateStreamsPtr = FNetworkReplayStreaming::Get().GetFactory().CreateReplayStreamer();
OnDeleteFinishedStreamCompleteDel = FDeleteFinishedStreamCallback::CreateUObject(this, &UDeleteReplayObject::OnDeleteFinishedStreamComplete);
if (EnumerateStreamsPtr.Get())
{
EnumerateStreamsPtr.Get()->DeleteFinishedStream(ReplayName, OnDeleteFinishedStreamCompleteDel);
}
}
void UDeleteReplayObject::OnDeleteFinishedStreamComplete(const FDeleteFinishedStreamResult& Result)
{
const bool WasSuccessful = Result.WasSuccessful();
OnDeleteComplete.Broadcast(WasSuccessful);
}

View File

@@ -0,0 +1,45 @@
// Copyright 2020-Present Oyintare Ebelo. All Rights Reserved.
#include "GetSavedReplaysObject.h"
#include "ReplayStructs.h"
#include "ReplayObject.h"
#include "NetworkReplayStreaming.h"
void UGetSavedReplaysObject::GetSavedReplays()
{
EnumerateStreamsPtr = FNetworkReplayStreaming::Get().GetFactory().CreateReplayStreamer();
EnumerateStreamsCallbackDel = FEnumerateStreamsCallback::CreateUObject(this, &UGetSavedReplaysObject::OnEnumerateStreamsComplete);
if (EnumerateStreamsPtr.Get())
{
EnumerateStreamsPtr.Get()->EnumerateStreams(FNetworkReplayVersion(), INDEX_NONE, FString(), TArray<FString>(), EnumerateStreamsCallbackDel);
}
}
void UGetSavedReplaysObject::OnEnumerateStreamsComplete(const FEnumerateStreamsResult& Result)
{
TArray<UReplayObject* > Replays;
TArray<FNetworkReplayStreamInfo> StreamInfos = Result.FoundStreams;
for (FNetworkReplayStreamInfo StreamInfo : StreamInfos)
{
FReplayInfo ReplayInfoTemp;
ReplayInfoTemp.FriendlyName = StreamInfo.FriendlyName;
ReplayInfoTemp.ActualName = StreamInfo.Name;
ReplayInfoTemp.RecordDate = StreamInfo.Timestamp;
ReplayInfoTemp.LengthInMS = StreamInfo.LengthInMS;
const float SizeInKb = StreamInfo.SizeInBytes / 1024.0f;
ReplayInfoTemp.SizeInMb = SizeInKb / 1024.0f;
UReplayObject* ReplayObj = NewObject<UReplayObject>();
ReplayObj->ReplayInfo = ReplayInfoTemp;
Replays.Add(ReplayObj);
}
OnGetReplaysComplete.Broadcast(Replays);
}

View File

@@ -0,0 +1,118 @@
// Copyright 2020-Present Oyintare Ebelo. All Rights Reserved.
#include "GoToTimeObject.h"
#include "Engine.h"
#include "ReplayPlayerController.h"
#include "ReplaySystemBPLibrary.h"
#include "Engine/DemoNetDriver.h"
#include "Kismet/GameplayStatics.h"
#include "Kismet/KismetMathLibrary.h"
// Sets default values
UGoToTimeObject::UGoToTimeObject()
{
}
void UGoToTimeObject::GoToTime(UObject* WorldContextObject, float TimeToGoTo,bool bRetainPauseState)
{
if (const UWorld* World = GEngine->GetWorldFromContextObjectChecked(WorldContextObject))
{
if (const AWorldSettings* WorldSettings = World->GetWorldSettings())
{
// clamp time just in case
const float ClampedTime = UKismetMathLibrary::FClamp(TimeToGoTo,0.0f,UReplaySystemBPLibrary::GetReplayLength(WorldContextObject));
if (UDemoNetDriver* DemoDriver = UReplaySystemBPLibrary::GetDemoDriver(World))
{
if (DemoDriver && DemoDriver->ServerConnection && DemoDriver->ServerConnection->PlayerController && DemoDriver->ServerConnection->PlayerController->PlayerState)
{
if(const AReplayPlayerController * ReplayPC = Cast<AReplayPlayerController>(DemoDriver->ServerConnection->PlayerController))
{
if(ReplayPC->bIsSpectating)
{
if(const AActor* ActorBeingSpectated = Cast<AActor>(ReplayPC->GetViewTarget()))
{
const FNetworkGUID ActorBeingSpectatedGUID = DemoDriver->GetGUIDForActor(ActorBeingSpectated);
DemoDriver->AddNonQueuedGUIDForScrubbing(ActorBeingSpectatedGUID);
}
}
if(const AActor* ActorPossessed = Cast<AActor>(ReplayPC->GetPawn()))
{
const FNetworkGUID SpectatorPawnGUID = DemoDriver->GetGUIDForActor(ActorPossessed);
DemoDriver->AddNonQueuedGUIDForScrubbing(SpectatorPawnGUID);
}
}
else
{
if(const APlayerController * PC = Cast<APlayerController>(DemoDriver->ServerConnection->PlayerController))
{
if(const AActor* ActorPossessed = Cast<AActor>(PC->GetPawn()))
{
const FNetworkGUID SpectatorPawnGUID = DemoDriver->GetGUIDForActor(ActorPossessed);
DemoDriver->AddNonQueuedGUIDForScrubbing(SpectatorPawnGUID);
}
}
}
for ( FActorIterator It( World->GetWorld()); It; ++It )
{
if ( It->bAlwaysRelevant )
{
const FNetworkGUID ActorGUID = DemoDriver->GetGUIDForActor(*It);
DemoDriver->AddNonQueuedGUIDForScrubbing(ActorGUID);
}
}
bRetainPauseStateBeforeMove = bRetainPauseState;
WCO = WorldContextObject;
if(WorldSettings->GetPauserPlayerState())
{
bPauseStateBeforeMove = true;
}
OnGoToTimeDelegate = FOnGotoTimeDelegate::CreateUObject(this,&UGoToTimeObject::OnGoToTimeProcessed);
DemoDriver->GotoTimeInSeconds(ClampedTime,OnGoToTimeDelegate);
}
}
}
}
}
void UGoToTimeObject::OnGoToTimeProcessed(bool bWasSuccessful)
{
const UObject* WorldContext = WCO;
if (const UWorld* World = GEngine->GetWorldFromContextObjectChecked(WorldContext))
{
if (AWorldSettings* WorldSettings = World->GetWorldSettings())
{
if (UDemoNetDriver* DemoDriver = UReplaySystemBPLibrary::GetDemoDriver(World))
{
if(OnGotoTimeComplete.IsBound())
{
OnGotoTimeComplete.Broadcast(bWasSuccessful);
}
if(bRetainPauseStateBeforeMove && !bPauseStateBeforeMove == false)
{
UReplaySystemBPLibrary::PausePlayback(WCO);
}
if( AReplayPlayerController* ReplayPC = Cast<AReplayPlayerController>(UGameplayStatics::GetPlayerController(World,0)))
{
ReplayPC->OnGoToTime(UReplaySystemBPLibrary::GetCurrentReplayTime(WCO));
ReplayPC->OnStopSpectateActor();
}
}
}
}
}

View File

@@ -0,0 +1,32 @@
// Copyright 2020-Present Oyintare Ebelo. All Rights Reserved.
#include "ModifyReplayObject.h"
#include "NetworkReplayStreaming.h"
void UModifyReplayObject::RenameReplay(const FString& ReplayName, const FString& NewName, const int32 UserIndex,bool bIsNormalName)
{
EnumerateStreamsPtr = FNetworkReplayStreaming::Get().GetFactory().CreateReplayStreamer();
OnRenameReplayCompleteDel = FRenameReplayCallback::CreateUObject(this, &UModifyReplayObject::OnRenameReplayComplete);
if (EnumerateStreamsPtr.Get())
{
if (bIsNormalName)
{
EnumerateStreamsPtr.Get()->RenameReplay(ReplayName,NewName,UserIndex, OnRenameReplayCompleteDel);
}
else
{
EnumerateStreamsPtr.Get()->RenameReplayFriendlyName(ReplayName, NewName,UserIndex, OnRenameReplayCompleteDel);
}
}
}
void UModifyReplayObject::OnRenameReplayComplete(const FRenameReplayResult& Result)
{
bool WasSuccessful = Result.WasSuccessful();
//OnRenameComplete.Broadcast(WasSuccessful);
}

View File

@@ -0,0 +1,32 @@
// Copyright 2020-Present Oyintare Ebelo. All Rights Reserved.
#include "RenameReplayObject.h"
#include "NetworkReplayStreaming.h"
void URenameReplayObject::RenameReplay(const FString& ReplayName, const FString& NewName, const int32 UserIndex,bool bIsNormalName)
{
EnumerateStreamsPtr = FNetworkReplayStreaming::Get().GetFactory().CreateReplayStreamer();
OnRenameReplayCompleteDel = FRenameReplayCallback::CreateUObject(this, &URenameReplayObject::OnRenameReplayComplete);
if (EnumerateStreamsPtr.Get())
{
if (bIsNormalName)
{
EnumerateStreamsPtr.Get()->RenameReplay(ReplayName,NewName,UserIndex, OnRenameReplayCompleteDel);
}
else
{
EnumerateStreamsPtr.Get()->RenameReplayFriendlyName(ReplayName, NewName,UserIndex, OnRenameReplayCompleteDel);
}
}
}
void URenameReplayObject::OnRenameReplayComplete(const FRenameReplayResult& Result)
{
bool WasSuccessful = Result.WasSuccessful();
OnRenameComplete.Broadcast(WasSuccessful);
}

View File

@@ -0,0 +1,984 @@
// Copyright 2020-Present Oyintare Ebelo. All Rights Reserved.
#include "ReplayDataObject.h"
#include "Kismet/KismetStringLibrary.h"
#include "HAL/FileManagerGeneric.h"
#include "ReplayStructs.h"
#include "Kismet/KismetTextLibrary.h"
void UReplayDataObject::AddBooleanData(FString Name,bool Data)
{
FReplayBoolData StructVar;
StructVar.Name = Name;
StructVar.Value = Data;
if(const int Index = DoesBooleanDataExist(Name) != -1)
{
boolData[Index] = StructVar;
}
else
{
boolData.Add(StructVar);
}
}
void UReplayDataObject::AddByteData(FString Name,TArray<uint8> Data)
{
FReplayByteData StructVar;
StructVar.Name = Name;
StructVar.Value = Data;
if(const int Index = DoesByteDataExist(Name) != -1)
{
byteData[Index] = StructVar;
}
else
{
byteData.Add(StructVar);
}
}
void UReplayDataObject::AddIntegerData(FString Name,int Data)
{
FReplayIntData StructVar;
StructVar.Name = Name;
StructVar.Value = Data;
if(const int Index = DoesIntegerDataExist(Name) != -1)
{
intData[Index] = StructVar;
}
else
{
intData.Add(StructVar);
}
}
void UReplayDataObject::AddInteger64Data(FString Name,int64 Data)
{
FReplayInt64Data StructVar;
StructVar.Name = Name;
StructVar.Value = Data;
if(const int Index = DoesInteger64DataExist(Name) != -1)
{
int64Data[Index] = StructVar;
}
else
{
int64Data.Add(StructVar);
}
}
void UReplayDataObject::AddFloatData(FString Name,float Data)
{
FReplayFloatData StructVar;
StructVar.Name = Name;
StructVar.Value = Data;
if(const int Index = DoesFloatDataExist(Name) != -1)
{
floatData[Index] = StructVar;
}
else
{
floatData.Add(StructVar);
}
}
void UReplayDataObject::AddNameData(FString Name,FName Data)
{
FReplayNameData StructVar;
StructVar.Name = Name;
StructVar.Value = Data;
if(const int Index = DoesNameDataExist(Name) != -1)
{
nameData[Index] = StructVar;
}
else
{
nameData.Add(StructVar);
}
}
void UReplayDataObject::AddStringData(FString Name,FString Data)
{
FReplayStringData StructVar;
StructVar.Name = Name;
StructVar.Value = Data;
if(const int Index = DoesStringDataExist(Name) != -1)
{
stringData[Index] = StructVar;
}
else
{
stringData.Add(StructVar);
}
}
void UReplayDataObject::AddTextData(FString Name,FText Data)
{
FReplayTextData StructVar;
StructVar.Name = Name;
StructVar.Value = Data;
if(const int Index = DoesTextDataExist(Name) != -1)
{
textData[Index] = StructVar;
}
else
{
textData.Add(StructVar);
}
}
void UReplayDataObject::AddVectorData(FString Name,FVector Data)
{
FReplayVectorData StructVar;
StructVar.Name = Name;
StructVar.Value = Data;
if(const int Index = DoesVectorDataExist(Name) != -1)
{
vectorData[Index] = StructVar;
}
else
{
vectorData.Add(StructVar);
}
}
void UReplayDataObject::AddRotatorData(FString Name,FRotator Data)
{
FReplayRotatorData StructVar;
StructVar.Name = Name;
StructVar.Value = Data;
if(const int Index = DoesRotatorDataExist(Name) != -1)
{
rotatorData[Index] = StructVar;
}
else
{
rotatorData.Add(StructVar);
}
}
void UReplayDataObject::AddTransformData(FString Name,FTransform Data)
{
FReplayTransformData StructVar;
StructVar.Name = Name;
StructVar.Value = Data;
if(const int Index = DoesTransformDataExist(Name) != -1)
{
transformData[Index] = StructVar;
}
else
{
transformData.Add(StructVar);
}
}
int UReplayDataObject::DoesBooleanDataExist (FString Name)
{
for (int i = 0; i < boolData.Num(); ++i)
{
if (boolData[i].Name == Name)
{
return i;
}
}
return -1;
}
int UReplayDataObject::DoesByteDataExist (FString Name)
{
for (int i = 0; i < byteData.Num(); ++i)
{
if (byteData[i].Name == Name)
{
return i;
}
}
return -1;
}
int UReplayDataObject::DoesIntegerDataExist (FString Name)
{
for (int i = 0; i < intData.Num(); ++i)
{
if (intData[i].Name == Name)
{
return i;
}
}
return -1;
}
int UReplayDataObject::DoesInteger64DataExist (FString Name)
{
for (int i = 0; i < int64Data.Num(); ++i)
{
if (int64Data[i].Name == Name)
{
return i;
}
}
return -1;
}
int UReplayDataObject::DoesFloatDataExist (FString Name)
{
for (int i = 0; i < floatData.Num(); ++i)
{
if (floatData[i].Name == Name)
{
return i;
}
}
return -1;
}
int UReplayDataObject::DoesNameDataExist (FString Name)
{
for (int i = 0; i < nameData.Num(); ++i)
{
if (nameData[i].Name == Name)
{
return i;
}
}
return -1;
}
int UReplayDataObject::DoesStringDataExist (FString Name)
{
for (int i = 0; i < stringData.Num(); ++i)
{
if (stringData[i].Name == Name)
{
return i;
}
}
return -1;
}
int UReplayDataObject::DoesTextDataExist (FString Name)
{
for (int i = 0; i < textData.Num(); ++i)
{
if (textData[i].Name == Name)
{
return i;
}
}
return -1;
}
int UReplayDataObject::DoesVectorDataExist (FString Name)
{
for (int i = 0; i < vectorData.Num(); ++i)
{
if (vectorData[i].Name == Name)
{
return i;
}
}
return -1;
}
int UReplayDataObject::DoesRotatorDataExist (FString Name)
{
for (int i = 0; i < stringData.Num(); ++i)
{
if (stringData[i].Name == Name)
{
return i;
}
}
return -1;
}
int UReplayDataObject::DoesTransformDataExist (FString Name)
{
for (int i = 0; i < transformData.Num(); ++i)
{
if (transformData[i].Name == Name)
{
return i;
}
}
return -1;
}
void UReplayDataObject::RemoveBooleanData(FString Name)
{
if (const int Index = DoesBooleanDataExist(Name) != -1)
{
boolData.RemoveAt(Index);
}
}
void UReplayDataObject::RemoveByteData(FString Name)
{
if (const int Index = DoesByteDataExist(Name) != -1)
{
byteData.RemoveAt(Index);
}
}
void UReplayDataObject::RemoveIntegerData(FString Name)
{
if (const int Index = DoesIntegerDataExist(Name) != -1)
{
intData.RemoveAt(Index);
}
}
void UReplayDataObject::RemoveInteger64Data(FString Name)
{
if (const int Index = DoesInteger64DataExist(Name) != -1)
{
int64Data.RemoveAt(Index);
}
}
void UReplayDataObject::RemoveFloatData(FString Name)
{
if (const int Index = DoesFloatDataExist(Name) != -1)
{
floatData.RemoveAt(Index);
}
}
void UReplayDataObject::RemoveNameData(FString Name)
{
if (const int Index = DoesNameDataExist(Name) != -1)
{
nameData.RemoveAt(Index);
}
}
void UReplayDataObject::RemoveStringData(FString Name)
{
if (const int Index = DoesStringDataExist(Name) != -1)
{
stringData.RemoveAt(Index);
}
}
void UReplayDataObject::RemoveTextData(FString Name)
{
if (const int Index = DoesTextDataExist(Name) != -1)
{
textData.RemoveAt(Index);
}
}
void UReplayDataObject::RemoveVectorData(FString Name)
{
if (const int Index = DoesVectorDataExist(Name) != -1)
{
vectorData.RemoveAt(Index);
}
}
void UReplayDataObject::RemoveRotatorData(FString Name)
{
if (const int Index = DoesRotatorDataExist(Name) != -1)
{
rotatorData.RemoveAt(Index);
}
}
void UReplayDataObject::RemoveTransformData(FString Name)
{
if (const int Index = DoesTransformDataExist(Name) != -1)
{
transformData.RemoveAt(Index);
}
}
bool UReplayDataObject::GetBooleanData(FString Name)
{
bool bReturnValue = false;
for (FReplayBoolData Data : boolData)
{
if (Data.Name == Name)
{
return Data.Value;
}
}
return bReturnValue;
}
TArray<uint8> UReplayDataObject::GetByteData(FString Name)
{
TArray<uint8> ReturnValue;
for (FReplayByteData Data : byteData)
{
if (Data.Name == Name)
{
return Data.Value;
}
}
return ReturnValue;
}
int UReplayDataObject::GetIntegerData(FString Name)
{
int ReturnValue = 0;
for (FReplayIntData Data : intData)
{
if (Data.Name == Name)
{
return Data.Value;
}
}
return ReturnValue;
}
int64 UReplayDataObject::GetInteger64Data(FString Name)
{
int64 ReturnValue = 0;
for (FReplayInt64Data Data : int64Data)
{
if (Data.Name == Name)
{
return Data.Value;
}
}
return ReturnValue;
}
float UReplayDataObject::GetFloatData(FString Name)
{
float ReturnValue = 0.0;
for (FReplayFloatData Data : floatData)
{
if (Data.Name == Name)
{
return Data.Value;
}
}
return ReturnValue;
}
FName UReplayDataObject::GetNameData(FString Name)
{
FName ReturnValue = "";
for (FReplayNameData Data : nameData)
{
if (Data.Name == Name)
{
return Data.Value;
}
}
return ReturnValue;
}
FString UReplayDataObject::GetStringData(FString Name)
{
FString ReturnValue = "";
for (FReplayStringData Data : stringData)
{
if (Data.Name == Name)
{
return Data.Value;
}
}
return ReturnValue;
}
FText UReplayDataObject::GetTextData(FString Name)
{
FText ReturnValue;
for (FReplayTextData Data : textData)
{
if (Data.Name == Name)
{
return Data.Value;
}
}
return ReturnValue;
}
FVector UReplayDataObject::GetVectorData(FString Name)
{
FVector ReturnValue = FVector();
for (FReplayVectorData Data : vectorData)
{
if (Data.Name == Name)
{
return Data.Value;
}
}
return ReturnValue;
}
FRotator UReplayDataObject::GetRotatorData(FString Name)
{
FRotator ReturnValue = FRotator();
for (FReplayRotatorData Data : rotatorData)
{
if (Data.Name == Name)
{
return Data.Value;
}
}
return ReturnValue;
}
FTransform UReplayDataObject::GetTransformData(FString Name)
{
FTransform ReturnValue = FTransform();
for (FReplayTransformData Data : transformData)
{
if (Data.Name == Name)
{
return Data.Value;
}
}
return ReturnValue;
}
FString UReplayDataObject::SaveReplayMetaDataToString()
{
//First Write all structs into strings
TArray<FString> BoolArray;
for (FReplayBoolData Data : boolData)
{
FString DataName = Data.Name;
FString DataValue = UKismetStringLibrary::Conv_BoolToString(Data.Value);
BoolArray.Add(DataName + DataValuesSeperator + DataValue);
}
TArray<FString> ByteArray;
for (FReplayByteData Data : byteData)
{
FString DataName = Data.Name;
FString DataValue;
FUTF8ToTCHAR Src = FUTF8ToTCHAR((const ANSICHAR*) (Data.Value.GetData() + 0), Data.Value.Num());
DataValue.AppendChars(Src.Get(), Src.Length());
ByteArray.Add(DataName + DataValuesSeperator + DataValue);
}
TArray<FString> IntArray;
for (FReplayIntData Data : intData)
{
FString DataName = Data.Name;
FString DataValue = UKismetStringLibrary::Conv_IntToString(Data.Value);
IntArray.Add(DataName + DataValuesSeperator + DataValue);
}
TArray<FString> Int64Array;
for (FReplayInt64Data Data : int64Data)
{
FString DataName = Data.Name;
FString DataValue = UKismetStringLibrary::Conv_IntToString(Data.Value);
Int64Array.Add(DataName + DataValuesSeperator + DataValue);
}
TArray<FString> FloatArray;
for (FReplayFloatData Data : floatData)
{
FString DataName = Data.Name;
#if ENGINE_MAJOR_VERSION <= 4
FString DataValue = UKismetStringLibrary::Conv_FloatToString(Data.Value);
#else
FString DataValue = FString::SanitizeFloat(Data.Value);
#endif
FloatArray.Add(DataName + DataValuesSeperator + DataValue);
}
TArray<FString> NameArray;
for (FReplayNameData Data : nameData)
{
FString DataName = Data.Name;
FString DataValue = UKismetStringLibrary::Conv_NameToString(Data.Value);
NameArray.Add(DataName + DataValuesSeperator + DataValue);
}
TArray<FString> StringArray;
for (FReplayStringData Data : stringData)
{
FString DataName = Data.Name;
FString DataValue = Data.Value;
StringArray.Add(DataName + DataValuesSeperator + DataValue);
}
TArray<FString> TextArray;
for (FReplayTextData Data : textData)
{
FString DataName = Data.Name;
FString DataValue = UKismetTextLibrary::Conv_TextToString(Data.Value);
TextArray.Add(DataName + DataValuesSeperator + DataValue);
}
TArray<FString> VectorArray;
for (FReplayVectorData Data : vectorData)
{
FString DataName = Data.Name;
FString DataValue = UKismetStringLibrary::Conv_VectorToString(Data.Value);
VectorArray.Add(DataName + DataValuesSeperator + DataValue);
}
TArray<FString> RotatorArray;
for (FReplayRotatorData Data : rotatorData)
{
FString DataName = Data.Name;
FString DataValue = UKismetStringLibrary::Conv_RotatorToString(Data.Value);
RotatorArray.Add(DataName + DataValuesSeperator + DataValue);
}
TArray<FString> TransformArray;
for (FReplayTransformData Data : transformData)
{
FString DataName = Data.Name;
FString DataVectorPart = UKismetStringLibrary::Conv_VectorToString(Data.Value.GetLocation());
FString DataRotatorPart = UKismetStringLibrary::Conv_RotatorToString(Data.Value.GetRotation().Rotator());
FString DataScalePart = UKismetStringLibrary::Conv_VectorToString(Data.Value.GetScale3D());
TArray<FString> DataValues;
DataValues.Add(DataVectorPart);
DataValues.Add(DataRotatorPart);
DataValues.Add(DataScalePart);
FString DataValue = UKismetStringLibrary::JoinStringArray(DataValues,transformDataSeperator);
TransformArray.Add(DataName + DataValuesSeperator + DataValue);
}
FString BoolArrayAsSingleString = UKismetStringLibrary::JoinStringArray(BoolArray, DataArraySeperator);
FString ByteArrayAsSingleString = UKismetStringLibrary::JoinStringArray(ByteArray, DataArraySeperator);
FString IntArrayAsSingleString = UKismetStringLibrary::JoinStringArray(IntArray, DataArraySeperator);
FString Int64ArrayAsSingleString = UKismetStringLibrary::JoinStringArray(Int64Array, DataArraySeperator);
FString FloatArrayAsSingleString = UKismetStringLibrary::JoinStringArray(FloatArray, DataArraySeperator);
FString NameArrayAsSingleString = UKismetStringLibrary::JoinStringArray(NameArray, DataArraySeperator);
FString StringArrayAsSingleString = UKismetStringLibrary::JoinStringArray(StringArray, DataArraySeperator);
FString TextArrayAsSingleString = UKismetStringLibrary::JoinStringArray(TextArray, DataArraySeperator);
FString VectorArrayAsSingleString = UKismetStringLibrary::JoinStringArray(VectorArray, DataArraySeperator);
FString RotatorArrayAsSingleString = UKismetStringLibrary::JoinStringArray(RotatorArray, DataArraySeperator);
FString TransformArrayAsSingleString = UKismetStringLibrary::JoinStringArray(TransformArray, DataArraySeperator);
TArray<FString> FinalStringArray;
FinalStringArray.Add(boolDataIdentifier + DataIdentifierSeperator + BoolArrayAsSingleString);
FinalStringArray.Add(byteDataIdentifier + DataIdentifierSeperator + ByteArrayAsSingleString);
FinalStringArray.Add(intDataIdentifier + DataIdentifierSeperator + IntArrayAsSingleString);
FinalStringArray.Add(int64DataIdentifier + DataIdentifierSeperator + Int64ArrayAsSingleString);
FinalStringArray.Add(floatDataIdentifier + DataIdentifierSeperator + FloatArrayAsSingleString);
FinalStringArray.Add(nameDataIdentifier + DataIdentifierSeperator + NameArrayAsSingleString);
FinalStringArray.Add(stringDataIdentifier + DataIdentifierSeperator + StringArrayAsSingleString);
FinalStringArray.Add(textDataIdentifier + DataIdentifierSeperator + TextArrayAsSingleString);
FinalStringArray.Add(vectorDataIdentifier + DataIdentifierSeperator + VectorArrayAsSingleString);
FinalStringArray.Add(rotatorDataIdentifier + DataIdentifierSeperator + RotatorArrayAsSingleString);
FinalStringArray.Add(transformDataIdentifier + DataIdentifierSeperator + TransformArrayAsSingleString);
FString FinalString = UKismetStringLibrary::JoinStringArray(FinalStringArray, FinalArraySeperator);
return FinalString;
}
bool UReplayDataObject::LoadReplayMetaDataFromString(FString StringDataToParse)
{
boolData.Empty();
byteData.Empty();
intData.Empty();
int64Data.Empty();
floatData.Empty();
nameData.Empty();
stringData.Empty();
textData.Empty();
vectorData.Empty();
rotatorData.Empty();
transformData.Empty();
TArray<FString> LoadedStringArray = UKismetStringLibrary::ParseIntoArray(StringDataToParse, FinalArraySeperator);
for (FString Field : LoadedStringArray)
{
FString DataIdentifier;
FString DataPart;
UKismetStringLibrary::Split(Field,DataIdentifierSeperator,DataIdentifier,DataPart);
TArray<FString> DataArray = UKismetStringLibrary::ParseIntoArray(DataPart,DataArraySeperator);
for (FString DataItem : DataArray)
{
if (DataIdentifier == boolDataIdentifier)
{
FReplayBoolData LoadedData;
FString Name;
FString Value;
UKismetStringLibrary::Split(DataItem,DataValuesSeperator,Name, Value);
LoadedData.Name = Name;
if(Value == "true")
{
LoadedData.Value = true;
}
AddBooleanData(LoadedData.Name,LoadedData.Value);
}
if (DataIdentifier == byteDataIdentifier)
{
FReplayByteData LoadedData;
FString Name;
FString Value;
UKismetStringLibrary::Split(DataItem,DataValuesSeperator,Name, Value);
LoadedData.Name = Name;
TArray<uint8> ByteArray;
if(!(Value.Len() <= 0))
{
FTCHARToUTF8 Src = FTCHARToUTF8(Value.GetCharArray().GetData());
ByteArray.Append((uint8*) Src.Get(), Src.Length());
}
LoadedData.Value = ByteArray;
AddByteData(LoadedData.Name,LoadedData.Value);
}
if (DataIdentifier == intDataIdentifier)
{
FReplayIntData LoadedData;
FString Name;
FString Value;
UKismetStringLibrary::Split(DataItem,DataValuesSeperator,Name, Value);
LoadedData.Name = Name;
LoadedData.Value = UKismetStringLibrary::Conv_StringToInt(Value);
AddIntegerData(LoadedData.Name,LoadedData.Value);
}
if (DataIdentifier == int64DataIdentifier)
{
FReplayInt64Data LoadedData;
FString Name;
FString Value;
UKismetStringLibrary::Split(DataItem,DataValuesSeperator,Name, Value);
LoadedData.Name = Name;
LoadedData.Value = UKismetStringLibrary::Conv_StringToInt(Value);
AddInteger64Data(LoadedData.Name,LoadedData.Value);
}
if (DataIdentifier == floatDataIdentifier)
{
FReplayFloatData LoadedData;
FString Name;
FString Value;
UKismetStringLibrary::Split(DataItem,DataValuesSeperator,Name, Value);
LoadedData.Name = Name;
#if ENGINE_MAJOR_VERSION <= 4
LoadedData.Value = UKismetStringLibrary::Conv_StringToFloat(Value);
#else
LexFromString(LoadedData.Value,*Value);
#endif
AddFloatData(LoadedData.Name,LoadedData.Value);
}
if (DataIdentifier == nameDataIdentifier)
{
FReplayNameData LoadedData;
FString Name;
FString Value;
UKismetStringLibrary::Split(DataItem,DataValuesSeperator,Name, Value);
LoadedData.Name = Name;
LoadedData.Value = UKismetStringLibrary::Conv_StringToName(Value);
AddNameData(LoadedData.Name,LoadedData.Value);
}
if (DataIdentifier == stringDataIdentifier)
{
FReplayStringData LoadedData;
FString Name;
FString Value;
UKismetStringLibrary::Split(DataItem,DataValuesSeperator,Name, Value);
LoadedData.Name = Name;
LoadedData.Value = Value;
AddStringData(LoadedData.Name,LoadedData.Value);
}
if (DataIdentifier == textDataIdentifier)
{
FReplayTextData LoadedData;
FString Name;
FString Value;
UKismetStringLibrary::Split(DataItem,DataValuesSeperator,Name, Value);
LoadedData.Name = Name;
LoadedData.Value = UKismetTextLibrary::Conv_StringToText(Value);
AddTextData(LoadedData.Name,LoadedData.Value);
}
if (DataIdentifier == vectorDataIdentifier)
{
FReplayVectorData LoadedData;
FString Name;
FString Value;
UKismetStringLibrary::Split(DataItem,DataValuesSeperator,Name, Value);
LoadedData.Name = Name;
FVector ConvertedValue;
bool bWasSuccessful;
UKismetStringLibrary::Conv_StringToVector(Value,ConvertedValue,bWasSuccessful);
LoadedData.Value = ConvertedValue;
AddVectorData(LoadedData.Name,LoadedData.Value);
}
if (DataIdentifier == rotatorDataIdentifier)
{
FReplayRotatorData LoadedData;
FString Name;
FString Value;
UKismetStringLibrary::Split(DataItem,DataValuesSeperator,Name, Value);
LoadedData.Name = Name;
FRotator ConvertedValue;
bool bWasSuccessful;
UKismetStringLibrary::Conv_StringToRotator(Value,ConvertedValue,bWasSuccessful);
LoadedData.Value = ConvertedValue;
AddRotatorData(LoadedData.Name,LoadedData.Value);
}
if (DataIdentifier == transformDataIdentifier)
{
FReplayTransformData LoadedData;
FString Name;
FString Value;
UKismetStringLibrary::Split(DataItem,DataValuesSeperator,Name, Value);
LoadedData.Name = Name;
TArray<FString> DataComponents = UKismetStringLibrary::ParseIntoArray(Value,transformDataSeperator);
FVector ConvertedVectorValue;
bool bWasSuccessful;
UKismetStringLibrary::Conv_StringToVector(DataComponents[0],ConvertedVectorValue,bWasSuccessful);
FRotator ConvertedRotatorValue;
UKismetStringLibrary::Conv_StringToRotator(DataComponents[1],ConvertedRotatorValue,bWasSuccessful);
FVector ConvertedScaleValue;
UKismetStringLibrary::Conv_StringToVector(DataComponents[2],ConvertedScaleValue,bWasSuccessful);
LoadedData.Value = FTransform(ConvertedRotatorValue,ConvertedVectorValue,ConvertedScaleValue);
AddTransformData(LoadedData.Name,LoadedData.Value);
}
}
}
return true;
}

View File

@@ -0,0 +1,48 @@
// Copyright 2020-Present Oyintare Ebelo. All Rights Reserved.
#include "ReplayObject.h"
#include "ReplayDataObject.h"
#include "NetworkReplayStreaming.h"
#include "HAL/FileManagerGeneric.h"
#include "Engine/DemoNetDriver.h"
void UReplayObject::RequestEvents(FString Group,int UserIndex)
{
const TSharedPtr<INetworkReplayStreamer> EnumerateStreamsPtr = FNetworkReplayStreaming::Get().GetFactory().CreateReplayStreamer();
EnumerateEventsDel = FEnumerateEventsCallback::CreateUObject(this, &UReplayObject::OnEnumerateEventsComplete);
if (EnumerateStreamsPtr.Get())
{
EnumerateStreamsPtr.Get()->EnumerateEvents(ReplayInfo.ActualName,Group,UserIndex, EnumerateEventsDel);
}
}
void UReplayObject::OnEnumerateEventsComplete(const FEnumerateEventsResult& Results)
{
TArray<FReplayEvent> ReplayEvents;
if(Results.WasSuccessful())
{
for(FReplayEventListItem EventItem : Results.ReplayEventList.ReplayEvents)
{
FReplayEvent ReplayEventTemp;
ReplayEventTemp.EventID = EventItem.ID;
ReplayEventTemp.Group = EventItem.Group;
ReplayEventTemp.TimeInMs = (int32)EventItem.Time1;
UReplayDataObject* DataObject = NewObject<UReplayDataObject>();
DataObject->LoadReplayMetaDataFromString(EventItem.Metadata);
ReplayEventTemp.Data = DataObject;
ReplayEvents.Add(ReplayEventTemp);
}
}
OnRequestEventsComplete.Broadcast(ReplayEvents);
}

View File

@@ -0,0 +1,10 @@
// Copyright 2020-Present Oyintare Ebelo. All Rights Reserved.
#include "ReplayPlayerController.h"
AReplayPlayerController::AReplayPlayerController()
{
bShouldPerformFullTickWhenPaused = true;
SetTickableWhenPaused(true);
}

View File

@@ -0,0 +1,24 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#include "ReplaySystem.h"
DEFINE_LOG_CATEGORY(LogReplaySystem);
#define LOCTEXT_NAMESPACE "FReplaySystemModule"
void FReplaySystemModule::StartupModule()
{
// This code will execute after your module is loaded into memory; the exact timing is specified in the .uplugin file per-module
}
void FReplaySystemModule::ShutdownModule()
{
// This function may be called during shutdown to clean up your module. For modules that support dynamic reloading,
// we call this function before unloading the module.
}
#undef LOCTEXT_NAMESPACE
IMPLEMENT_MODULE(FReplaySystemModule, ReplaySystem)

View File

@@ -0,0 +1,490 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#include "ReplaySystemBPLibrary.h"
#include "Engine/World.h"
#include "GameFramework/WorldSettings.h"
#include "Engine/DemoNetDriver.h"
#include "NetworkReplayStreaming.h"
#include "Engine/GameInstance.h"
#include "Engine/Engine.h"
#include "DeleteReplayObject.h"
#include "GetSavedReplaysObject.h"
#include "GoToTimeObject.h"
#include "RenameReplayObject.h"
#include "ReplayDataObject.h"
#include "ReplayPlayerController.h"
#include "Containers/UnrealString.h"
#include "RequestEventsObject.h"
#include "Kismet/GameplayStatics.h"
#include "Kismet/KismetMathLibrary.h"
UReplaySystemBPLibrary::UReplaySystemBPLibrary(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
}
void UReplaySystemBPLibrary::SetReplaySavePath(UObject* WorldContextObject, const FString& Path)
{
if (UWorld* World = GEngine->GetWorldFromContextObjectChecked(WorldContextObject))
{
if (const TSharedPtr<INetworkReplayStreamer> EnumerateStreamsPtr = FNetworkReplayStreaming::Get().GetFactory().
CreateReplayStreamer())
{
EnumerateStreamsPtr->SetDemoPath(Path);
}
}
}
FString UReplaySystemBPLibrary::GetReplaySavePath(UObject* WorldContextObject)
{
FString Path = "";
if (UWorld* World = GEngine->GetWorldFromContextObjectChecked(WorldContextObject))
{
if (const TSharedPtr<INetworkReplayStreamer> EnumerateStreamsPtr = FNetworkReplayStreaming::Get().GetFactory().
CreateReplayStreamer())
{
EnumerateStreamsPtr->GetDemoPath(Path);
}
}
return Path;
}
void UReplaySystemBPLibrary::RecordReplay(UObject* WorldContextObject, const FString& ReplayName,
const FString& ReplayFriendlyName)
{
if (const UWorld* World = GEngine->GetWorldFromContextObjectChecked(WorldContextObject))
{
if (UGameInstance* GI = Cast<UGameInstance>(World->GetGameInstance()))
{
const TArray<FString> Options;
GI->StartRecordingReplay(ReplayName, ReplayFriendlyName, Options);
}
}
}
void UReplaySystemBPLibrary::StopRecordingReplay(UObject* WorldContextObject)
{
if (const UWorld* World = GEngine->GetWorldFromContextObjectChecked(WorldContextObject))
{
if (IsRecordingReplay(WorldContextObject))
{
if (UGameInstance* GI = Cast<UGameInstance>(World->GetGameInstance()))
{
GI->StopRecordingReplay();
}
}
}
}
bool UReplaySystemBPLibrary::IsRecordingReplay(UObject* WorldContextObject)
{
if (UWorld* World = GEngine->GetWorldFromContextObjectChecked(WorldContextObject))
{
if (World != nullptr && GetDemoDriver(World) != nullptr)
{
return GetDemoDriver(World)->IsRecording();
}
}
return false;
}
UDeleteReplayObject* UReplaySystemBPLibrary::DeleteReplay(UObject* WorldContextObject, const FString& ReplayName)
{
if (UWorld* World = GEngine->GetWorldFromContextObjectChecked(WorldContextObject))
{
if (UDeleteReplayObject* ReplayDeleteObj = NewObject<UDeleteReplayObject>())
{
ReplayDeleteObj->DeleteReplay(ReplayName);
return ReplayDeleteObj;
}
}
return nullptr;
}
URenameReplayObject* UReplaySystemBPLibrary::RenameReplay(UObject* WorldContextObject, const FString& ReplayName,
const FString& NewReplayName, const int32 UserIndex)
{
if (UWorld* World = GEngine->GetWorldFromContextObjectChecked(WorldContextObject))
{
if (URenameReplayObject* ReplayRenameObj = NewObject<URenameReplayObject>())
{
ReplayRenameObj->RenameReplay(ReplayName, NewReplayName, UserIndex, true);
return ReplayRenameObj;
}
}
return nullptr;
}
URenameReplayObject* UReplaySystemBPLibrary::RenameReplayFriendly(UObject* WorldContextObject,
const FString& ReplayName,
const FString& NewFriendlyReplayName,
const int32 UserIndex)
{
if (UWorld* World = GEngine->GetWorldFromContextObjectChecked(WorldContextObject))
{
if (URenameReplayObject* ReplayRenameObj = NewObject<URenameReplayObject>())
{
ReplayRenameObj->RenameReplay(ReplayName, NewFriendlyReplayName, UserIndex, false);
return ReplayRenameObj;
}
}
return nullptr;
}
UGetSavedReplaysObject* UReplaySystemBPLibrary::GetSavedReplays(UObject* WorldContextObject)
{
if (UWorld* World = GEngine->GetWorldFromContextObjectChecked(WorldContextObject))
{
if (UGetSavedReplaysObject* SavedReplaysObj = NewObject<UGetSavedReplaysObject>())
{
SavedReplaysObj->GetSavedReplays();
return SavedReplaysObj;
}
}
return nullptr;
}
bool UReplaySystemBPLibrary::PlayRecordedReplay(UObject* WorldContextObject, const FString& ReplayName)
{
if (const UWorld* World = GEngine->GetWorldFromContextObjectChecked(WorldContextObject))
{
if (UGameInstance* GI = Cast<UGameInstance>(World->GetGameInstance()))
{
const TArray<FString> Options;
return GI->PlayReplay(ReplayName, nullptr, Options);
}
}
return false;
}
UGoToTimeObject* UReplaySystemBPLibrary::RestartReplayPlayback(UObject* WorldContextObject)
{
UGoToTimeObject* GoToTimeObject = NewObject<UGoToTimeObject>();
if (!GoToTimeObject)
{
return nullptr;
}
GoToTimeObject->GoToTime(WorldContextObject, 0.0f, false);
return GoToTimeObject;
}
UGoToTimeObject* UReplaySystemBPLibrary::GoToSpecificTime(UObject* WorldContextObject, float TimeToGoTo,
bool bRetainCurrentPauseState)
{
UGoToTimeObject* GoToTimeObject = NewObject<UGoToTimeObject>();
if (!GoToTimeObject)
{
return nullptr;
}
GoToTimeObject->GoToTime(WorldContextObject, TimeToGoTo, bRetainCurrentPauseState);
return GoToTimeObject;
}
void UReplaySystemBPLibrary::PausePlayback(UObject* WorldContextObject)
{
if (UWorld* World = GEngine->GetWorldFromContextObjectChecked(WorldContextObject))
{
if (AWorldSettings* WorldSettings = World->GetWorldSettings())
{
if (const UDemoNetDriver* DemoDriver = GetDemoDriver(World))
{
if (DemoDriver && DemoDriver->ServerConnection && DemoDriver->ServerConnection->PlayerController && DemoDriver->ServerConnection->PlayerController->PlayerState)
{
World->bIsCameraMoveableWhenPaused = true;
WorldSettings->SetPauserPlayerState(DemoDriver->ServerConnection->PlayerController->PlayerState);
if (AReplayPlayerController* ReplayPC = Cast<AReplayPlayerController>(
UGameplayStatics::GetPlayerController(World, 0)))
{
ReplayPC->OnTogglePause(true);
}
}
}
}
}
}
void UReplaySystemBPLibrary::ResumePlayback(UObject* WorldContextObject)
{
if (const UWorld* World = GEngine->GetWorldFromContextObjectChecked(WorldContextObject))
{
if (AWorldSettings* WorldSettings = World->GetWorldSettings())
{
WorldSettings->SetPauserPlayerState(nullptr);
if (AReplayPlayerController* ReplayPC = Cast<AReplayPlayerController>(
UGameplayStatics::GetPlayerController(World, 0)))
{
ReplayPC->OnTogglePause(false);
}
}
}
}
void UReplaySystemBPLibrary::SetPlaybackSpeed(UObject* WorldContextObject, float Speed)
{
if (const UWorld* World = GEngine->GetWorldFromContextObjectChecked(WorldContextObject))
{
if (AWorldSettings* WorldSettings = World->GetWorldSettings())
{
WorldSettings->DemoPlayTimeDilation = Speed;
}
}
}
float UReplaySystemBPLibrary::GetPlaybackSpeed(UObject* WorldContextObject)
{
if (const UWorld* World = GEngine->GetWorldFromContextObjectChecked(WorldContextObject))
{
if (const AWorldSettings* WorldSettings = World->GetWorldSettings())
{
return WorldSettings->DemoPlayTimeDilation;
}
}
return 1.0f;
}
float UReplaySystemBPLibrary::GetCurrentReplayTime(UObject* WorldContextObject)
{
if (UWorld* World = GEngine->GetWorldFromContextObjectChecked(WorldContextObject))
{
if (const UDemoNetDriver* DemoDriver = GetDemoDriver(World))
{
return DemoDriver->GetDemoCurrentTime();
}
else
{
return 0.0f;
}
}
return 0.0f;
}
float UReplaySystemBPLibrary::GetReplayLength(UObject* WorldContextObject)
{
if (UWorld* World = GEngine->GetWorldFromContextObjectChecked(WorldContextObject))
{
if (const UDemoNetDriver* DemoDriver = GetDemoDriver(World))
{
if (IsRecordingReplay(WorldContextObject))
{
return DemoDriver->AccumulatedRecordTime;
}
if (IsPlayingReplay(WorldContextObject))
{
return DemoDriver->GetDemoTotalTime();
}
}
}
return 0.0f;
}
bool UReplaySystemBPLibrary::IsPlayingReplay(UObject* WorldContextObject)
{
if (UWorld* World = GEngine->GetWorldFromContextObjectChecked(WorldContextObject))
{
if (const UDemoNetDriver* DemoDriver = GetDemoDriver(World))
{
return DemoDriver->IsPlaying();
}
}
return false;
}
bool UReplaySystemBPLibrary::IsReplayPlaybackPaused(UObject* WorldContextObject)
{
if (const UWorld* World = GEngine->GetWorldFromContextObjectChecked(WorldContextObject))
{
if (IsPlayingReplay(WorldContextObject))
{
if (const AWorldSettings* WorldSettings = World->GetWorldSettings())
{
return WorldSettings->GetPauserPlayerState() != nullptr;
}
}
}
return false;
}
FString UReplaySystemBPLibrary::GetActiveReplayName(UObject* WorldContextObject)
{
if (UWorld* World = GEngine->GetWorldFromContextObjectChecked(WorldContextObject))
{
if (World != nullptr && GetDemoDriver(World) != nullptr)
{
return GetDemoDriver(World)->GetActiveReplayName();
}
}
return "None";
}
bool UReplaySystemBPLibrary::AddEventToActiveReplay(UObject* WorldContextObject, const FString& EventName,
const FString& Group, UReplayDataObject* DataObject)
{
if (UWorld* World = GEngine->GetWorldFromContextObjectChecked(WorldContextObject))
{
if (IsRecordingReplay(WorldContextObject))
{
if (World != nullptr && GetDemoDriver(World) != nullptr)
{
FString EmptyString = "";
const TArray<uint8> Data;
if (DataObject)
{
FString ReplayDataString = DataObject->SaveReplayMetaDataToString();
EmptyString = ReplayDataString;
}
GetDemoDriver(World)->AddOrUpdateEvent(EventName, Group, EmptyString, Data);
return true;
}
}
}
return false;
}
URequestEventsObject* UReplaySystemBPLibrary::RequestActiveReplayEvents(UObject* WorldContextObject, FString Group,
int UserIndex)
{
if (UWorld* World = GEngine->GetWorldFromContextObjectChecked(WorldContextObject))
{
if (!IsRecordingReplay(WorldContextObject) && IsPlayingReplay(WorldContextObject))
{
if (URequestEventsObject* RequestEventsObject = NewObject<URequestEventsObject>())
{
RequestEventsObject->RequestEvents(GetActiveReplayName(WorldContextObject), Group, UserIndex);
return RequestEventsObject;
}
}
}
return nullptr;
}
UReplayDataObject* UReplaySystemBPLibrary::CreateReplayDataObject()
{
UReplayDataObject* DataObject = NewObject<UReplayDataObject>();
return DataObject;
}
float UReplaySystemBPLibrary::MsToSeconds(const int32 MS)
{
#if ENGINE_MAJOR_VERSION <= 4
const float MsAsFloat = UKismetMathLibrary::Conv_IntToFloat(MS);
#else
const float MsAsFloat = UKismetMathLibrary::Conv_IntToDouble(MS);
#endif
const float MsAsSeconds = MsAsFloat / 1000;
return MsAsSeconds;
}
void UReplaySystemBPLibrary::SpectateActor(UObject* WorldContextObject, AActor* Actor, FBlendSettings BlendSettings)
{
if (const UWorld* World = GEngine->GetWorldFromContextObjectChecked(WorldContextObject))
{
if (!Actor)
{
return;
}
if (UGameplayStatics::GetPlayerController(World, 0))
{
if (APlayerController* PC = UGameplayStatics::GetPlayerController(World, 0))
{
if (!PC->IsLocalController())
{
return;
}
//Everything from here is happening only locally/on the client
PC->SetViewTargetWithBlend(Actor, BlendSettings.BlendTime, BlendSettings.BlendFunction,
BlendSettings.BlendExponent, BlendSettings.bLockOutgoing);
if (AReplayPlayerController* ReplayPC = Cast<AReplayPlayerController>(
UGameplayStatics::GetPlayerController(World, 0)))
{
ReplayPC->OnSpectateActor(Actor);
ReplayPC->bIsSpectating = true;
}
}
}
}
}
void UReplaySystemBPLibrary::StopSpectating(UObject* WorldContextObject, FBlendSettings BlendSettings)
{
if (const UWorld* World = GEngine->GetWorldFromContextObjectChecked(WorldContextObject))
{
if (UGameplayStatics::GetPlayerController(World, 0))
{
if (APlayerController* PC = UGameplayStatics::GetPlayerController(World, 0))
{
if (!PC->IsLocalController())
{
return;
}
//Everything from here is happening only locally/on the client
PC->SetViewTargetWithBlend(PC->GetPawn(), BlendSettings.BlendTime, BlendSettings.BlendFunction,
BlendSettings.BlendExponent, BlendSettings.bLockOutgoing);
if (AReplayPlayerController* ReplayPC = Cast<AReplayPlayerController>(
UGameplayStatics::GetPlayerController(World, 0)))
{
ReplayPC->OnStopSpectateActor();
ReplayPC->bIsSpectating = false;
}
}
}
}
}
UDemoNetDriver* UReplaySystemBPLibrary::GetDemoDriver(const UObject* WorldContextObject)
{
if (UWorld* World = GEngine->GetWorldFromContextObjectChecked(WorldContextObject))
{
#if ENGINE_MAJOR_VERSION > 4
return World->GetDemoNetDriver();
#elif ENGINE_MINOR_VERSION >= 26
return World->GetDemoNetDriver();
#elif ENGINE_MINOR_VERSION < 26
return World->DemoNetDriver;
#endif
}
return nullptr;
}
void UReplaySystemBPLibrary::SetMaxRecordHz(UObject* WorldContextObject, float Hz)
{
if (const UWorld* World = GEngine->GetWorldFromContextObjectChecked(WorldContextObject))
{
if (UGameplayStatics::GetPlayerController(World, 0))
{
#if ENGINE_MAJOR_VERSION <= 4
FString Command = "demo.recordhz " + UKismetStringLibrary::Conv_FloatToString(Hz);
#else
FString Command = "demo.recordhz " + FString::SanitizeFloat(Hz);
#endif
UGameplayStatics::GetPlayerController(World, 0)->ConsoleCommand(Command);
}
}
}
float UReplaySystemBPLibrary::GetMaxRecordHz()
{
static const auto CVar = IConsoleManager::Get().FindConsoleVariable(TEXT("demo.recordhz"));
const float value = CVar->GetFloat();
return value;
}

View File

@@ -0,0 +1,47 @@
// Copyright 2020-Present Oyintare Ebelo. All Rights Reserved.
#include "RequestEventsObject.h"
#include "ReplayStructs.h"
#include "ReplayObject.h"
#include "NetworkReplayStreaming.h"
#include "ReplayDataObject.h"
void URequestEventsObject::RequestEvents(FString ReplayName,FString Group, int UserIndex)
{
const TSharedPtr<INetworkReplayStreamer> EnumerateStreamsPtr = FNetworkReplayStreaming::Get().GetFactory().CreateReplayStreamer();
EnumerateEventsDel = FEnumerateEventsCallback::CreateUObject(this, &URequestEventsObject::OnEnumerateEventsComplete);
if (EnumerateStreamsPtr.Get())
{
EnumerateStreamsPtr.Get()->EnumerateEvents(ReplayName,Group,UserIndex, EnumerateEventsDel);
}
}
void URequestEventsObject::OnEnumerateEventsComplete(const FEnumerateEventsResult& Results)
{
TArray<FReplayEvent> ReplayEvents;
if(Results.WasSuccessful())
{
for(FReplayEventListItem EventItem : Results.ReplayEventList.ReplayEvents)
{
FReplayEvent ReplayEventTemp;
ReplayEventTemp.EventID = EventItem.ID;
ReplayEventTemp.Group = EventItem.Group;
ReplayEventTemp.TimeInMs = static_cast<int32>(EventItem.Time1);
UReplayDataObject* DataObject = NewObject<UReplayDataObject>();
DataObject->LoadReplayMetaDataFromString(EventItem.Metadata);
ReplayEventTemp.Data = DataObject;
ReplayEvents.Add(ReplayEventTemp);
}
}
OnRequestEventsComplete.Broadcast(ReplayEvents);
}

View File

@@ -0,0 +1,35 @@
// Copyright 2020-Present Oyintare Ebelo. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "NetworkReplayStreaming.h"
#include "ReplayDelegates.h"
#include "DeleteReplayObject.generated.h"
/**
*
*/
UCLASS(BlueprintType, Blueprintable)
class REPLAYSYSTEM_API UDeleteReplayObject : public UObject
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintAssignable, Category = "Replay")
FOnDeleteComplete OnDeleteComplete;
void DeleteReplay(const FString& ReplayName);
TSharedPtr<INetworkReplayStreamer> EnumerateStreamsPtr;
FDeleteFinishedStreamCallback OnDeleteFinishedStreamCompleteDel;
void OnDeleteFinishedStreamComplete(const FDeleteFinishedStreamResult& Result);
};

View File

@@ -0,0 +1,37 @@
// Copyright 2020-Present Oyintare Ebelo. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "ReplayObject.h"
#include "NetworkReplayStreaming.h"
#include "GetSavedReplaysObject.generated.h"
/**
*
*/
UCLASS(BlueprintType, Blueprintable)
class REPLAYSYSTEM_API UGetSavedReplaysObject : public UObject
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintAssignable, Category = "Replay")
FOnGetReplaysComplete OnGetReplaysComplete;
void GetSavedReplays();
TSharedPtr<INetworkReplayStreamer> EnumerateStreamsPtr;
FEnumerateStreamsCallback EnumerateStreamsCallbackDel;
/** Called when we get results from the replay streaming interface */
void OnEnumerateStreamsComplete(const FEnumerateStreamsResult& Result);
};

View File

@@ -0,0 +1,43 @@
// Copyright 2020-Present Oyintare Ebelo. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "ReplayDelegates.h"
#include "Engine.h"
#include "Engine/DemoNetDriver.h"
#include "GoToTimeObject.generated.h"
UCLASS()
class REPLAYSYSTEM_API UGoToTimeObject : public UObject
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
UGoToTimeObject();
protected:
public:
UPROPERTY(BlueprintAssignable)
FOnGotoTimeComplete OnGotoTimeComplete;
void GoToTime(UObject* WorldContextObject,float TimeToGoTo,bool bRetainPauseState);
UPROPERTY()
UObject* WCO;
bool bPauseStateBeforeMove = false;
bool bRetainPauseStateBeforeMove = false;
FOnGotoTimeDelegate OnGoToTimeDelegate;
void OnGoToTimeProcessed(bool bWasSuccessful);
};

View File

@@ -0,0 +1,35 @@
// Copyright 2020-Present Oyintare Ebelo. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "NetworkReplayStreaming.h"
#include "ReplayDelegates.h"
#include "ModifyReplayObject.generated.h"
/**
*
*/
UCLASS(BlueprintType, Blueprintable)
class REPLAYSYSTEM_API UModifyReplayObject : public UObject
{
GENERATED_BODY()
public:
//UPROPERTY(BlueprintAssignable, Category = "Replay")
//FOnModifyReplayComplete OnRenameComplete;
void RenameReplay(const FString& ReplayName, const FString& NewName, const int32 UserIndex, bool bIsNormalName);
TSharedPtr<INetworkReplayStreamer> EnumerateStreamsPtr;
FRenameReplayCallback OnRenameReplayCompleteDel;
void OnRenameReplayComplete(const FRenameReplayResult& Result);
};

View File

@@ -0,0 +1,35 @@
// Copyright 2020-Present Oyintare Ebelo. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "NetworkReplayStreaming.h"
#include "ReplayDelegates.h"
#include "RenameReplayObject.generated.h"
/**
*
*/
UCLASS(BlueprintType, Blueprintable)
class REPLAYSYSTEM_API URenameReplayObject : public UObject
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintAssignable, Category = "Replay")
FOnRenameReplayComplete OnRenameComplete;
void RenameReplay(const FString& ReplayName, const FString& NewName, const int32 UserIndex, bool bIsNormalName);
TSharedPtr<INetworkReplayStreamer> EnumerateStreamsPtr;
FRenameReplayCallback OnRenameReplayCompleteDel;
void OnRenameReplayComplete(const FRenameReplayResult& Result);
};

View File

@@ -0,0 +1,242 @@
#pragma once
#include "CoreMinimal.h"
#include "ReplayStructs.h"
#include "ReplayDataObject.generated.h"
/**
*
*/
UCLASS(BlueprintType, Blueprintable)
class REPLAYSYSTEM_API UReplayDataObject : public UObject
{
GENERATED_BODY()
public:
FString DataPlaceHolder = "---PlaceHolderValue---";
FString DataArraySeperator = "---DataArray---";
FString DataValuesSeperator = "---DataValue---";
FString FinalArraySeperator = "---FinalArraySep---";
FString NewLineReplacer = " ---NewLineRep--- ";
FString NewLineReplacerR = " ---NEWLINE-R--- ";
FString boolDataIdentifier = "---BoolI---";
FString byteDataIdentifier = "---ByteI---";
FString intDataIdentifier = "---IntI---";
FString int64DataIdentifier = "---Int64I---";
FString floatDataIdentifier = "---FloatI---";
FString nameDataIdentifier = "---NameI---";
FString stringDataIdentifier = "---StringI---";
FString textDataIdentifier = "---TextI---";
FString vectorDataIdentifier = "---VectorI---";
FString rotatorDataIdentifier = "---RotatorI---";
FString transformDataIdentifier = "---TransformI---";
FString DataIdentifierSeperator = "---IdentifierSep---";
FString transformDataSeperator = "---TransformDataSep---";
UPROPERTY(BlueprintReadOnly, Category = "DataObject")
TArray<FReplayBoolData> boolData;
UPROPERTY(BlueprintReadOnly, Category = "DataObject")
TArray<FReplayByteData> byteData;
UPROPERTY(BlueprintReadOnly, Category = "DataObject")
TArray<FReplayIntData> intData;
UPROPERTY(BlueprintReadOnly, Category = "DataObject")
TArray<FReplayInt64Data> int64Data;
UPROPERTY(BlueprintReadOnly, Category = "DataObject")
TArray<FReplayFloatData> floatData;
UPROPERTY(BlueprintReadOnly, Category = "DataObject")
TArray<FReplayNameData> nameData;
UPROPERTY(BlueprintReadOnly, Category = "DataObject")
TArray<FReplayStringData> stringData;
UPROPERTY(BlueprintReadOnly, Category = "DataObject")
TArray<FReplayTextData> textData;
UPROPERTY(BlueprintReadOnly, Category = "DataObject")
TArray<FReplayVectorData> vectorData;
UPROPERTY(BlueprintReadOnly, Category = "DataObject")
TArray<FReplayRotatorData> rotatorData;
UPROPERTY(BlueprintReadOnly, Category = "DataObject")
TArray<FReplayTransformData> transformData;
UFUNCTION(BlueprintCallable,BlueprintPure, Category = "DataObject")
int DoesBooleanDataExist (FString Name);
UFUNCTION(BlueprintCallable,BlueprintPure, Category = "DataObject")
int DoesByteDataExist (FString Name);
UFUNCTION(BlueprintCallable,BlueprintPure, Category = "DataObject")
int DoesIntegerDataExist (FString Name);
UFUNCTION(BlueprintCallable,BlueprintPure, Category = "DataObject")
int DoesInteger64DataExist (FString Name);
UFUNCTION(BlueprintCallable,BlueprintPure, Category = "DataObject")
int DoesFloatDataExist (FString Name);
UFUNCTION(BlueprintCallable,BlueprintPure, Category = "DataObject")
int DoesNameDataExist (FString Name);
UFUNCTION(BlueprintCallable,BlueprintPure, Category = "DataObject")
int DoesStringDataExist (FString Name);
UFUNCTION(BlueprintCallable,BlueprintPure, Category = "DataObject")
int DoesTextDataExist (FString Name);
UFUNCTION(BlueprintCallable,BlueprintPure, Category = "DataObject")
int DoesVectorDataExist (FString Name);
UFUNCTION(BlueprintCallable,BlueprintPure, Category = "DataObject")
int DoesRotatorDataExist (FString Name);
UFUNCTION(BlueprintCallable,BlueprintPure, Category = "DataObject")
int DoesTransformDataExist (FString Name);
// Adds or updates data of the specified type (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
void AddBooleanData(FString Name,bool Data);
// Adds or updates data of the specified type (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
void AddByteData(FString Name,TArray<uint8> Data);
// Adds or updates data of the specified type (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
void AddIntegerData(FString Name,int Data);
// Adds or updates data of the specified type (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
void AddInteger64Data(FString Name,int64 Data);
// Adds or updates data of the specified type (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
void AddFloatData(FString Name,float Data);
// Adds or updates data of the specified type (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
void AddNameData(FString Name,FName Data);
// Adds or updates data of the specified type (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
void AddStringData(FString Name,FString Data);
// Adds or updates data of the specified type (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
void AddTextData(FString Name,FText Data);
// Adds or updates data of the specified type (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
void AddVectorData(FString Name,FVector Data);
// Adds or updates data of the specified type (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
void AddRotatorData(FString Name,FRotator Data);
// Adds or updates data of the specified type (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
void AddTransformData(FString Name,FTransform Data);
// Removes data of the specified type (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
void RemoveBooleanData(FString Name);
// Removes data of the specified type (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
void RemoveByteData(FString Name);
// Removes data of the specified type (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
void RemoveIntegerData(FString Name);
// Removes data of the specified type (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
void RemoveInteger64Data(FString Name);
// Removes data of the specified type (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
void RemoveFloatData(FString Name);
// Removes data of the specified type (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
void RemoveNameData(FString Name);
// Removes data of the specified type (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
void RemoveStringData(FString Name);
// Removes data of the specified type (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
void RemoveTextData(FString Name);
// Removes data of the specified type (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
void RemoveVectorData(FString Name);
// Removes data of the specified type (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
void RemoveRotatorData(FString Name);
// Removes data of the specified type (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
void RemoveTransformData(FString Name);
// Returns the stored value if it exists (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
bool GetBooleanData(FString Name);
// Returns the stored value if it exists (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
TArray<uint8> GetByteData(FString Name);
// Returns the stored value if it exists (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
int GetIntegerData(FString Name);
// Returns the stored value if it exists (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
int64 GetInteger64Data(FString Name);
// Returns the stored value if it exists (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
float GetFloatData(FString Name);
// Returns the stored value if it exists (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
FName GetNameData(FString Name);
// Returns the stored value if it exists (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
FString GetStringData(FString Name);
// Returns the stored value if it exists (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
FText GetTextData(FString Name);
// Returns the stored value if it exists (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
FVector GetVectorData(FString Name);
// Returns the stored value if it exists (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
FRotator GetRotatorData(FString Name);
// Returns the stored value if it exists (Case Sensitive)
UFUNCTION(BlueprintCallable, Category = "DataObject")
FTransform GetTransformData(FString Name);
/*Used Internaly to Create/Save meta data for a replay*/
UFUNCTION(Category = "DataObject")
FString SaveReplayMetaDataToString();
/*Used Internaly to Load a meta data for a replay*/
UFUNCTION(Category = "DataObject")
bool LoadReplayMetaDataFromString(FString StringDataToParse);
};

View File

@@ -0,0 +1,27 @@
// Copyright 2020-Present Oyintare Ebelo. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "ReplayStructs.h"
#include "ReplayDelegates.generated.h"
class UReplayObject;
class APawn;
UDELEGATE()
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnRequestEventsComplete,const TArray<FReplayEvent>&, Events);
UDELEGATE()
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnRenameReplayComplete, bool, bWasSuccessful);
UDELEGATE()
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnGetReplaysComplete,const TArray<UReplayObject *> &, Replays);
UDELEGATE()
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnDeleteComplete, bool, bWasSuccessful);
UDELEGATE()
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnGotoTimeComplete, const bool ,bWasSuccessful);
UDELEGATE()
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnReplayComplete);

View File

@@ -0,0 +1,51 @@
// Copyright 2020-Present Oyintare Ebelo. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "NetworkReplayStreaming.h"
#include "ReplayDelegates.h"
#include "ReplayStructs.h"
#include "ReplayObject.generated.h"
/**
*
*/
class UReplayDataObject;
UCLASS(BlueprintType, Blueprintable)
class REPLAYSYSTEM_API UReplayObject : public UObject
{
GENERATED_BODY()
public:
UPROPERTY()
UWorld* World = nullptr;
UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Replay)
FReplayInfo ReplayInfo;
// called once the events have been gotten
UPROPERTY(BlueprintAssignable, Category = "Replay|Events")
FOnRequestEventsComplete OnRequestEventsComplete;
/**
* Gets the events of a loaded replay
* @param Group
* @param UserIndex
*/
UFUNCTION(BlueprintCallable, Category = "Replay")
void RequestEvents(FString Group,int UserIndex);
FEnumerateEventsCallback EnumerateEventsDel;
void OnEnumerateEventsComplete(const FEnumerateEventsResult& Results);
};

View File

@@ -0,0 +1,39 @@
// Copyright 2020-Present Oyintare Ebelo. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/PlayerController.h"
#include "ReplayPlayerController.generated.h"
/**
*
*/
UCLASS()
class REPLAYSYSTEM_API AReplayPlayerController : public APlayerController
{
GENERATED_BODY()
AReplayPlayerController();
public:
UFUNCTION(BlueprintImplementableEvent,Category="Replay")
void OnGoToTime(float currentTime);
/**
* true means paused
* @param PauseState
*/
UFUNCTION(BlueprintImplementableEvent,Category="Replay")
void OnTogglePause(bool PauseState);
UFUNCTION(BlueprintImplementableEvent,Category="Replay")
void OnSpectateActor(AActor* Actor);
UFUNCTION(BlueprintImplementableEvent,Category="Replay")
void OnStopSpectateActor();
bool bIsSpectating = false;
};

View File

@@ -0,0 +1,371 @@
// Copyright 2020-Present Oyintare Ebelo. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Camera/PlayerCameraManager.h"
#include "Curves/CurveVector.h"
#include "ReplayStructs.generated.h"
class UReplayDataObject;
class UCurveVector;
class FNetworkGUID;
USTRUCT(BlueprintType)
struct FReplayInfo
{
GENERATED_USTRUCT_BODY()
public:
//The UI name of the replay
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
FString FriendlyName;
//The actual name of the replay on disk
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
FString ActualName;
//The date the replay was recorded
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
FDateTime RecordDate;
//The length of the replay in milliseconds
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
int32 LengthInMS = 0;
//The size of the replay in Mb
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
float SizeInMb = 0.0f;
};
USTRUCT(BlueprintType)
struct FBlendSettings
{
GENERATED_USTRUCT_BODY()
public:
//The time taken to blend
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
float BlendTime = 0.2f;
//Cubic, Linear etc functions for blending
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
TEnumAsByte<EViewTargetBlendFunction> BlendFunction = EViewTargetBlendFunction::VTBlend_Linear;
///Exponent used by certain blend functions to control the blend
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
float BlendExponent = 0;
//If true, lock outgoing view target to last frame's camera position for the remainder of the blend
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
bool bLockOutgoing = false;
};
USTRUCT(BlueprintType)
struct FReplayEvent
{
GENERATED_USTRUCT_BODY()
public:
//The Event ID
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
FString EventID;
//The group this event belongs to
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
FString Group;
// The time the event was added at in milliseconds
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
int32 TimeInMs = 0;
//The event data
UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Replay)
UReplayDataObject* Data=nullptr;
};
USTRUCT(BlueprintType)
struct FReplayBoolData
{
GENERATED_USTRUCT_BODY()
public:
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
FString Name;
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
bool Value = true;
FORCEINLINE bool operator<(const FReplayBoolData& Other) const
{
return Name < Other.Name;
}
FORCEINLINE bool operator==(const FReplayBoolData& Other) const
{
return Name == Other.Name;
}
};
USTRUCT(BlueprintType)
struct FReplayByteData
{
GENERATED_USTRUCT_BODY()
public:
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
FString Name;
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
TArray<uint8> Value;
FORCEINLINE bool operator<(const FReplayByteData& Other) const
{
return Name < Other.Name;
}
FORCEINLINE bool operator==(const FReplayByteData& Other) const
{
return Name == Other.Name;
}
};
USTRUCT(BlueprintType)
struct FReplayIntData
{
GENERATED_USTRUCT_BODY()
public:
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
FString Name;
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
int Value=0;
FORCEINLINE bool operator<(const FReplayIntData& Other) const
{
return Name < Other.Name;
}
FORCEINLINE bool operator==(const FReplayIntData& Other) const
{
return Name == Other.Name;
}
};
USTRUCT(BlueprintType)
struct FReplayInt64Data
{
GENERATED_USTRUCT_BODY()
public:
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
FString Name;
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
int64 Value = 0;
FORCEINLINE bool operator<(const FReplayInt64Data& Other) const
{
return Name < Other.Name;
}
FORCEINLINE bool operator==(const FReplayInt64Data& Other) const
{
return Name == Other.Name;
}
};
USTRUCT(BlueprintType)
struct FReplayFloatData
{
GENERATED_USTRUCT_BODY()
public:
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
FString Name;
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
float Value = 0.0f;
FORCEINLINE bool operator<(const FReplayFloatData& Other) const
{
return Name < Other.Name;
}
FORCEINLINE bool operator==(const FReplayFloatData& Other) const
{
return Name == Other.Name;
}
};
USTRUCT(BlueprintType)
struct FReplayNameData
{
GENERATED_USTRUCT_BODY()
public:
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
FString Name;
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
FName Value;
FORCEINLINE bool operator<(const FReplayNameData& Other) const
{
return Name < Other.Name;
}
FORCEINLINE bool operator==(const FReplayNameData& Other) const
{
return Name == Other.Name;
}
};
USTRUCT(BlueprintType)
struct FReplayStringData
{
GENERATED_USTRUCT_BODY()
public:
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
FString Name;
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
FString Value;
FORCEINLINE bool operator<(const FReplayStringData& Other) const
{
return Name < Other.Name;
}
FORCEINLINE bool operator==(const FReplayStringData& Other) const
{
return Name == Other.Name;
}
};
USTRUCT(BlueprintType)
struct FReplayTextData
{
GENERATED_USTRUCT_BODY()
public:
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
FString Name;
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
FText Value;
FORCEINLINE bool operator<(const FReplayTextData& Other) const
{
return Name < Other.Name;
}
FORCEINLINE bool operator==(const FReplayTextData& Other) const
{
return Name == Other.Name;
}
};
USTRUCT(BlueprintType)
struct FReplayVectorData
{
GENERATED_USTRUCT_BODY()
public:
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
FString Name;
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
FVector Value = FVector(0.0f, 0.0f, 0.0f);
FORCEINLINE bool operator<(const FReplayVectorData& Other) const
{
return Name < Other.Name;
}
FORCEINLINE bool operator==(const FReplayVectorData& Other) const
{
return Name == Other.Name;
}
};
USTRUCT(BlueprintType)
struct FReplayRotatorData
{
GENERATED_USTRUCT_BODY()
public:
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
FString Name;
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
FRotator Value = FRotator(0.0f, 0.0f, 0.0f);
FORCEINLINE bool operator<(const FReplayRotatorData& Other) const
{
return Name < Other.Name;
}
FORCEINLINE bool operator==(const FReplayRotatorData& Other) const
{
return Name == Other.Name;
}
};
USTRUCT(BlueprintType)
struct FReplayTransformData
{
GENERATED_USTRUCT_BODY()
public:
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
FString Name;
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
FTransform Value;
FORCEINLINE bool operator<(const FReplayTransformData& Other) const
{
return Name < Other.Name;
}
FORCEINLINE bool operator==(const FReplayTransformData& Other) const
{
return Name == Other.Name;
}
};
USTRUCT(BlueprintType)
struct FReplayObjectData
{
GENERATED_USTRUCT_BODY()
public:
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
FString Name;
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Replay)
UObject* Value=nullptr;
FORCEINLINE bool operator<(const FReplayObjectData& Other) const
{
return Name < Other.Name;
}
FORCEINLINE bool operator==(const FReplayObjectData& Other) const
{
return Name == Other.Name;
}
};

View File

@@ -0,0 +1,15 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
DECLARE_LOG_CATEGORY_EXTERN(LogReplaySystem, Log, All);
class FReplaySystemModule : public IModuleInterface
{
public:
/** IModuleInterface implementation */
virtual void StartupModule() override;
virtual void ShutdownModule() override;
};

View File

@@ -0,0 +1,308 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "Kismet/BlueprintFunctionLibrary.h"
#include "CoreMinimal.h"
#include "NetworkReplayStreaming.h"
#include "ReplayStructs.h"
#include "ReplaySystemBPLibrary.generated.h"
/*
* Function library class.
* Each function in it is expected to be static and represents blueprint node that can be called in any blueprint.
*
* When declaring function you can define metadata for the node. Key function specifiers will be BlueprintPure and BlueprintCallable.
* BlueprintPure - means the function does not affect the owning object in any way and thus creates a node without Exec pins.
* BlueprintCallable - makes a function which can be executed in Blueprints - Thus it has Exec pins.
* DisplayName - full name of the node, shown when you mouse over the node and in the blueprint drop down menu.
* Its lets you name the node using characters not allowed in C++ function names.
* CompactNodeTitle - the word(s) that appear on the node.
* Keywords - the list of keywords that helps you to find node when you search for it using Blueprint drop-down menu.
* Good example is "Print String" node which you can find also by using keyword "log".
* Category - the category your node will be under in the Blueprint drop-down menu.
*
* For more info on custom blueprint nodes visit documentation:
* https://wiki.unrealengine.com/Custom_Blueprint_Node_Creation
*/
class UGoToTimeObject;
class UDeleteReplayObject;
class UGetSavedReplaysObject;
class URenameReplayObject;
class UReplayDataObject;
class UReplayObject;
class URequestEventsObject;
class UInstantReplayObject;
UCLASS()
class UReplaySystemBPLibrary : public UBlueprintFunctionLibrary
{
GENERATED_UCLASS_BODY()
public:
/**
* Sets the path for all replays (Does not copy existing replays over)
* @param WorldContextObject
* @param Path New path
*/
UFUNCTION(BlueprintCallable, Category = "ReplaySystem", meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject"))
static void SetReplaySavePath(UObject* WorldContextObject, const FString& Path);
/**
* Gets the current path where replays are stored
* @param WorldContextObject
* @return Path
*/
UFUNCTION(BlueprintCallable,BlueprintPure,Category = "ReplaySystem", meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject"))
static FString GetReplaySavePath(UObject* WorldContextObject);
/**
* Starts recording a replay
* @param WorldContextObject
* @param ReplayName The name to save the replay as on disk (Used internally)
* @param ReplayFriendlyName The Ui friendly name of the replay (Used by you or users)
*/
UFUNCTION(BlueprintCallable, Category = "ReplaySystem|Recording", meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject"))
static void RecordReplay(UObject* WorldContextObject, const FString& ReplayName,
const FString& ReplayFriendlyName);
/**
* Stop recording a replay
* @param WorldContextObject
* @return
*/
UFUNCTION(BlueprintCallable, Category = "ReplaySystem|Recording", meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject"))
static void StopRecordingReplay(UObject* WorldContextObject);
/**
* Finds out if a replay is being recorded
* @param WorldContextObject
* @return
*/
UFUNCTION(BlueprintCallable,BlueprintPure, Category = "ReplaySystem", meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject"))
static bool IsRecordingReplay(UObject* WorldContextObject);
/**
* Delete a replay
* @param WorldContextObject
* @param ReplayName The name the replay is saved as on disk
* @return
*/
UFUNCTION(BlueprintCallable, Category = "ReplaySystem", meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject"))
static UDeleteReplayObject* DeleteReplay(UObject* WorldContextObject, const FString& ReplayName);
/**
* Changes the name a replay is saved as on the disk
* @param WorldContextObject
* @param ReplayName The current name on disk of this replay
* @param NewReplayName New name to save as on disk
* @param UserIndex
* @return
*/
UFUNCTION(BlueprintCallable, Category = "ReplaySystem", meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject"))
static URenameReplayObject* RenameReplay(UObject* WorldContextObject, const FString& ReplayName, const FString& NewReplayName, const int32 UserIndex);
/**
* Changes the friendly name of a replay
* @param WorldContextObject
* @param ReplayName The current name on disk of this replay
* @param NewFriendlyReplayName New friendly to give it
* @param UserIndex
* @return
*/
UFUNCTION(BlueprintCallable, Category = "ReplaySystem", meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject"))
static URenameReplayObject* RenameReplayFriendly(UObject* WorldContextObject, const FString& ReplayName, const FString& NewFriendlyReplayName, const int32 UserIndex);
/**
* Get all the saved replays
* @param WorldContextObject
* @return
*/
UFUNCTION(BlueprintCallable, Category = "ReplaySystem", meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject"))
static UGetSavedReplaysObject* GetSavedReplays(UObject* WorldContextObject);
/**
* Play a recorded replay
* @param WorldContextObject
* @param ReplayName
* @return
*/
UFUNCTION(BlueprintCallable, Category = "ReplaySystem|Playback", meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject"))
static bool PlayRecordedReplay(UObject* WorldContextObject, const FString& ReplayName);
/**
* Restart the currently playing replay
* @param WorldContextObject
*/
UFUNCTION(BlueprintCallable, Category = "ReplaySystem|Playback", meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject"))
static UGoToTimeObject* RestartReplayPlayback(UObject* WorldContextObject);
/**
* Goto a specific time in the replay
* @param WorldContextObject
* @param TimeToGoTo Time in seconds to goto
* @param bRetainCurrentPauseState Use this on a need basis as it can cause some physics issues
*/
UFUNCTION(BlueprintCallable, Category = "ReplaySystem|Playback", meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject"))
static UGoToTimeObject* GoToSpecificTime(UObject* WorldContextObject, float TimeToGoTo,
bool bRetainCurrentPauseState);
/**
* Pause the replay playback
* @param WorldContextObject
*/
UFUNCTION(BlueprintCallable, Category = "ReplaySystem|Playback", meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject"))
static void PausePlayback(UObject* WorldContextObject);
/**
* Resume the replay playback
* @param WorldContextObject
*/
UFUNCTION(BlueprintCallable, Category = "ReplaySystem|Playback", meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject"))
static void ResumePlayback(UObject* WorldContextObject);
/**
* Sets the Playback speed of the replay
* @param WorldContextObject Set the playback speed of the replay
* @param Speed Like time dilation 0.1,1,10
*/
UFUNCTION(BlueprintCallable, Category = "ReplaySystem|Playback", meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject"))
static void SetPlaybackSpeed(UObject* WorldContextObject, float Speed);
/**
* Get the playback speed of the replay
* @param WorldContextObject
* @return
*/
UFUNCTION(BlueprintCallable,BlueprintPure, Category = "ReplaySystem|Playback", meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject"))
static float GetPlaybackSpeed(UObject* WorldContextObject);
/**
* Get the current time in seconds of the replay
* @param WorldContextObject
* @return
*/
UFUNCTION(BlueprintCallable, BlueprintPure, Category = "ReplaySystem|Playback", meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject"))
static float GetCurrentReplayTime(UObject* WorldContextObject);
/**
* Get the total length in seconds of the replay currently playing or being recorded
* @param WorldContextObject
* @return
*/
UFUNCTION(BlueprintCallable, BlueprintPure, Category = "ReplaySystem|Playback", meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject"))
static float GetReplayLength(UObject* WorldContextObject);
/**
* returns true if a replay is being played
* @param WorldContextObject
* @return
*/
UFUNCTION(BlueprintCallable,BlueprintPure, Category = "ReplaySystem", meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject"))
static bool IsPlayingReplay(UObject* WorldContextObject);
/**
* Returns true of the replay has been paused
* @param WorldContextObject
* @return
*/
UFUNCTION(BlueprintCallable,BlueprintPure, Category = "ReplaySystem", meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject"))
static bool IsReplayPlaybackPaused(UObject* WorldContextObject);
/**
* Gets the name on disk/memory of the replay currently playing or being recorded
* @param WorldContextObject
* @return
*/
UFUNCTION(BlueprintCallable,BlueprintPure, Category = "ReplaySystem", meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject"))
static FString GetActiveReplayName(UObject* WorldContextObject);
/**
* Adds or Updates said event in the replay currently being recorded
* @param WorldContextObject
* @param EventName The name of the event
* @param Group The group this event belongs to
* @param DataObject optional object containing extra data
* @return
*/
UFUNCTION(BlueprintCallable, Category = "ReplaySystem", meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject"))
static bool AddEventToActiveReplay(UObject* WorldContextObject,const FString& EventName, const FString& Group, UReplayDataObject* DataObject);
/**
* Gets the Events of the replay currently playing
* @param WorldContextObject
* @param Group The group name
* @param UserIndex
* @return
*/
UFUNCTION(BlueprintCallable, Category = "ReplaySystem", meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject"))
static URequestEventsObject* RequestActiveReplayEvents(UObject* WorldContextObject,FString Group,int UserIndex);
/**
* Creates a data object for storing event meta data for a replay
* @return
*/
UFUNCTION(BlueprintCallable, Category = "ReplaySystem")
static UReplayDataObject* CreateReplayDataObject();
static UReplayDataObject* LoadEventFromByteData(TArray<uint8> Bytes);
/**
* Helper function to convert milliseconds to seconds
* @param MS
* @return
*/
UFUNCTION(BlueprintCallable,BlueprintPure, Category = "ReplaySystem|Utilities")
static float MsToSeconds(const int32 MS);
/**
* Just sets the view target of the controller to the specified actor
* @param WorldContextObject
* @param Actor The pawn to spectate
*/
UFUNCTION(BlueprintCallable,Category= "ReplaySystem",meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject"))
static void SpectateActor(UObject* WorldContextObject, AActor* Actor, FBlendSettings BlendSettings);
/**
* Just sets the view target of the controller back to the possessed pawn
* @param WorldContextObject
* @param BlendSettings
*/
UFUNCTION(BlueprintCallable,Category= "ReplaySystem",meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject"))
static void StopSpectating(UObject* WorldContextObject,FBlendSettings BlendSettings);
UFUNCTION(Category= "ReplaySystem",meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject"))
static UDemoNetDriver* GetDemoDriver(const UObject* WorldContextObject);
/**
*Set the maximum number of frames recorded per second by the replay
*/
UFUNCTION(BlueprintCallable,Category= "ReplaySystem",meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject"))
static void SetMaxRecordHz(UObject* WorldContextObject,float Hz = 8.0f);
/**
* Get the maximum number of frames recorded per second by the replay
*/
UFUNCTION(BlueprintCallable,Category= "ReplaySystem")
static float GetMaxRecordHz();
};

View File

@@ -0,0 +1,33 @@
// Copyright 2020-Present Oyintare Ebelo. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "NetworkReplayStreaming.h"
#include "ReplayDelegates.h"
#include "RequestEventsObject.generated.h"
/**
*
*/
UCLASS(BlueprintType, Blueprintable)
class REPLAYSYSTEM_API URequestEventsObject : public UObject
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintAssignable, Category = "Replay|Events")
FOnRequestEventsComplete OnRequestEventsComplete;
void RequestEvents(FString ReplayName,FString Group,int UserIndex);
FEnumerateEventsCallback EnumerateEventsDel;
void OnEnumerateEventsComplete(const FEnumerateEventsResult& Results);
};

View File

@@ -0,0 +1,54 @@
// Copyright 2020-Present Oyintare Ebelo. All Rights Reserved.
using UnrealBuildTool;
public class ReplaySystem : ModuleRules
{
public ReplaySystem(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
PublicIncludePaths.AddRange(
new string[] {
// ... add public include paths required here ...
}
);
PrivateIncludePaths.AddRange(
new string[] {
// ... add other private include paths required here ...
}
);
PublicDependencyModuleNames.AddRange(
new string[]
{
"Core",
"NetworkReplayStreaming",
"Json",
"JsonUtilities",
// ... add other public dependencies that you statically link with here ...
}
);
PrivateDependencyModuleNames.AddRange(
new string[]
{
"CoreUObject",
"Engine",
"Slate",
"SlateCore",
// ... add private dependencies that you statically link with here ...
}
);
DynamicallyLoadedModuleNames.AddRange(
new string[] {
}
);
}
}

View File

@@ -0,0 +1,9 @@
[CrashReportClient]
bHideLogFilesOption=false
bHideAllowToBeContactedOption=false
bIsAllowedToCloseWithoutSending=true
bIsAllowedToSendWithoutDetailedInfo=true
CrashConfigPurgeDays=2
Stall.RecordDump=false
Ensure.RecordDump=true

943
Saved/Logs/PS_Replay.log Normal file
View File

@@ -0,0 +1,943 @@
Log file open, 07/02/26 17:26:45
LogWindows: Failed to load 'aqProf.dll' (GetLastError=126)
LogWindows: File 'aqProf.dll' does not exist
LogProfilingDebugging: Loading WinPixEventRuntime.dll for PIX profiling (from ../../../Engine/Binaries/ThirdParty/Windows/WinPixEventRuntime/x64).
LogWindows: Failed to load 'VtuneApi.dll' (GetLastError=126)
LogWindows: File 'VtuneApi.dll' does not exist
LogWindows: Failed to load 'VtuneApi32e.dll' (GetLastError=126)
LogWindows: File 'VtuneApi32e.dll' does not exist
LogWindows: Started CrashReportClient (pid=38828)
LogWindows: Enabling Tpause support
LogWindows: Custom abort handler registered for crash reporting.
LogInit: Display: Running engine for game: PS_Replay
LogCore: UTS: Unreal Trace Server launched successfully
LogTrace: Initializing trace...
LogCore: Display: Requested channels: 'cpu,gpu,frame,log,bookmark,screenshot,region'
LogCore: No trace connection. Tracing to in-memory cache.
LogTrace: Display: Control listening on port 35583
LogTrace: Finished trace initialization.
LogCsvProfiler: Display: Metadata set : platform="Windows"
LogCsvProfiler: Display: Metadata set : config="Development"
LogCsvProfiler: Display: Metadata set : buildversion="++UE5+Release-5.7-CL-51494982"
LogCsvProfiler: Display: Metadata set : engineversion="5.7.4-51494982+++UE5+Release-5.7"
LogCsvProfiler: Display: Metadata set : enginereleaseversion="5.7.4"
LogCsvProfiler: Display: Metadata set : os="Windows 11 (25H2) [10.0.26200.7171] "
LogCsvProfiler: Display: Metadata set : cpu="GenuineIntel|12th Gen Intel(R) Core(TM) i9-12900H"
LogCsvProfiler: Display: Metadata set : pgoenabled="0"
LogCsvProfiler: Display: Metadata set : pgoprofilingenabled="0"
LogCsvProfiler: Display: Metadata set : ltoenabled="0"
LogCsvProfiler: Display: Metadata set : asan="0"
LogCsvProfiler: Display: Metadata set : mergedmodules="0"
LogCsvProfiler: Display: Metadata set : commandline="" C:\ASTERION\GIT\PS_ReplaySystem\PS_Replay\PS_Replay.uproject -AUTH_LOGIN=unused -AUTH_PASSWORD=9fa71e90c40a4dc88f1ea09d29826566 -AUTH_TYPE=exchangecode -epicapp=UE_5.7 -epicenv=Prod -EpicPortal -epicusername=Asterion_VR -epicuserid=2f7b7ff5607d4cd796afc096af9aba6f -epiclocale=fr -epicsandboxid=ue""
LogCsvProfiler: Display: Metadata set : loginid="5440aecf4e36dfe9905193a4742566fb"
LogCsvProfiler: Display: Metadata set : llm="0"
LogStats: Stats thread started at 0.433571
LogCsvProfiler: Display: Metadata set : systemresolution.resx="1280"
LogCsvProfiler: Display: Metadata set : systemresolution.resy="720"
LogICUInternationalization: ICU TimeZone Detection - Raw Offset: +1:00, Platform Override: ''
LogInit: Session CrashGUID >====================================================
Session CrashGUID > UECC-Windows-36F8C42B45F3F6FAC0605DBD9FB7DC47
Session CrashGUID >====================================================
LogConfig: No local boot hotfix file found at: [../../../../../../ASTERION/GIT/PS_ReplaySystem/PS_Replay/Saved/PersistentDownloadDir/HotfixForNextBoot.txt]
LogAudio: Display: Pre-Initializing Audio Device Manager...
LogAudio: Display: AudioInfo: 'OPUS' Registered
LogAudioDebug: Display: Lib vorbis DLL was dynamically loaded.
LogAudio: Display: AudioInfo: 'OGG' Registered
LogAudio: Display: AudioInfo: 'ADPCM' Registered
LogAudio: Display: AudioInfo: 'PCM' Registered
LogAudio: Display: AudioInfo: 'BINKA' Registered
LogAudio: Display: AudioInfo: 'RADA' Registered
LogAudio: Display: Audio Device Manager Pre-Initialized
LogPluginManager: Looking for build plugins target receipt
LogAssetRegistry: Display: No AssetDiscovery cache present at ../../../../../../ASTERION/GIT/PS_ReplaySystem/PS_Replay/Intermediate/CachedAssetRegistryDiscovery.bin. AssetRegistry discovery of files will be uncached.
LogPluginManager: Found matching target receipt: ../../../../../../ASTERION/GIT/PS_ReplaySystem/PS_Replay/Binaries/Win64/PS_ReplayEditor.target
LogPluginManager: Looking for enabled plugins target receipt
LogPluginManager: Found matching target receipt: ../../../../../../ASTERION/GIT/PS_ReplaySystem/PS_Replay/Binaries/Win64/PS_ReplayEditor.target
LogConfig: Display: Loading Android ini files took 0.09 seconds
LogConfig: Display: Loading VulkanPC ini files took 0.10 seconds
LogConfig: Display: Loading Mac ini files took 0.10 seconds
LogConfig: Display: Loading IOS ini files took 0.11 seconds
LogConfig: Display: Loading Unix ini files took 0.11 seconds
LogPluginManager: Mounting Engine plugin AudioInsights
LogPluginManager: Mounting Engine plugin BaseMaterial
LogPluginManager: Mounting Engine plugin Bridge
LogPluginManager: Mounting Engine plugin ChaosCloth
LogPluginManager: Mounting Engine plugin ChaosInsights
LogPluginManager: Mounting Engine plugin ChaosVD
LogPluginManager: Mounting Engine plugin CmdLinkServer
LogPluginManager: Mounting Engine plugin EnhancedInput
LogPluginManager: Mounting Engine plugin Fab
LogPluginManager: Mounting Engine plugin IoStoreInsights
LogPluginManager: Mounting Engine plugin MassInsights
LogPluginManager: Mounting Engine plugin MeshPainting
LogPluginManager: Mounting Engine plugin RenderGraphInsights
LogPluginManager: Mounting Engine plugin TraceUtilities
LogPluginManager: Mounting Engine plugin UbaController
LogPluginManager: Mounting Engine plugin WorldMetrics
LogPluginManager: Mounting Engine plugin XGEController
LogPluginManager: Mounting Engine plugin CameraShakePreviewer
LogPluginManager: Mounting Engine plugin GameplayCameras
LogPluginManager: Mounting Engine plugin EngineCameras
LogPluginManager: Mounting Engine plugin CompositeCore
LogPluginManager: Mounting Engine plugin AssetManagerEditor
LogPluginManager: Mounting Engine plugin ChangelistReview
LogPluginManager: Mounting Engine plugin BlueprintHeaderView
LogPluginManager: Mounting Engine plugin CurveEditorTools
LogPluginManager: Mounting Engine plugin ColorGrading
LogPluginManager: Mounting Engine plugin DataValidation
LogConfig: Display: Loading TVOS ini files took 0.13 seconds
LogPluginManager: Mounting Engine plugin EditorScriptingUtilities
LogConfig: Display: Loading Windows ini files took 0.13 seconds
LogPluginManager: Mounting Engine plugin EditorDebugTools
LogPluginManager: Mounting Engine plugin FacialAnimation
LogPluginManager: Mounting Engine plugin CryptoKeys
LogPluginManager: Mounting Engine plugin EngineAssetDefinitions
LogPluginManager: Mounting Engine plugin GameplayTagsEditor
LogPluginManager: Mounting Engine plugin MacGraphicsSwitching
LogPluginManager: Mounting Engine plugin MaterialAnalyzer
LogConfig: Display: Loading VisionOS ini files took 0.13 seconds
LogPluginManager: Mounting Engine plugin MeshLODToolset
LogPluginManager: Mounting Engine plugin ModelingToolsEditorMode
LogPluginManager: Mounting Engine plugin MobileLauncherProfileWizard
LogPluginManager: Mounting Engine plugin PluginBrowser
LogPluginManager: Mounting Engine plugin SequencerAnimTools
LogPluginManager: Mounting Engine plugin ProxyLODPlugin
LogPluginManager: Mounting Engine plugin GeometryMode
LogConfig: Display: Loading Linux ini files took 0.14 seconds
LogPluginManager: Mounting Engine plugin SpeedTreeImporter
LogPluginManager: Mounting Engine plugin StylusInput
LogPluginManager: Mounting Engine plugin UMGWidgetPreview
LogPluginManager: Mounting Engine plugin UVEditor
LogPluginManager: Mounting Engine plugin WorldPartitionHLODUtilities
LogPluginManager: Mounting Engine plugin AdvancedRenamer
LogPluginManager: Mounting Engine plugin AutomationUtils
LogPluginManager: Mounting Engine plugin BackChannel
LogPluginManager: Mounting Engine plugin ChaosCaching
LogPluginManager: Mounting Engine plugin ChaosEditor
LogPluginManager: Mounting Engine plugin ChaosNiagara
LogPluginManager: Mounting Engine plugin ChaosSolverPlugin
LogPluginManager: Mounting Engine plugin ChaosUserDataPT
LogPluginManager: Mounting Engine plugin CharacterAI
LogPluginManager: Mounting Engine plugin EditorDataStorage
LogPluginManager: Mounting Engine plugin EditorDataStorageFeatures
LogPluginManager: Mounting Engine plugin EditorPerformance
LogPluginManager: Mounting Engine plugin EditorTelemetry
LogPluginManager: Mounting Engine plugin Fracture
LogPluginManager: Mounting Engine plugin FullBodyIK
LogPluginManager: Mounting Engine plugin GeometryCollectionPlugin
LogPluginManager: Mounting Engine plugin GeometryFlow
LogPluginManager: Mounting Engine plugin GlobalConfigurationData
LogPluginManager: Mounting Engine plugin LevelSequenceNavigatorBridge
LogPluginManager: Mounting Engine plugin LocalizableMessage
LogPluginManager: Mounting Engine plugin LowLevelNetTrace
LogPluginManager: Mounting Engine plugin MeshModelingToolsetExp
LogPluginManager: Mounting Engine plugin Dataflow
LogPluginManager: Mounting Engine plugin GeometryDataflow
LogPluginManager: Mounting Engine plugin NFORDenoise
LogPluginManager: Mounting Engine plugin PlanarCut
LogPluginManager: Mounting Engine plugin PlatformCrypto
LogPluginManager: Mounting Engine plugin PythonScriptPlugin
LogPluginManager: Mounting Engine plugin RuntimeTelemetry
LogPluginManager: Mounting Engine plugin SequenceNavigator
LogPluginManager: Mounting Engine plugin ToolPresets
LogPluginManager: Mounting Engine plugin TcpMessaging
LogPluginManager: Mounting Engine plugin UdpMessaging
LogPluginManager: Mounting Engine plugin ActorLayerUtilities
LogPluginManager: Mounting Engine plugin AndroidDeviceProfileSelector
LogPluginManager: Mounting Engine plugin AndroidFileServer
LogPluginManager: Mounting Engine plugin AndroidMoviePlayer
LogPluginManager: Mounting Engine plugin AndroidPermission
LogPluginManager: Mounting Engine plugin AppleImageUtils
LogPluginManager: Mounting Engine plugin AppleMoviePlayer
LogPluginManager: Mounting Engine plugin ArchVisCharacter
LogPluginManager: Mounting Engine plugin AssetTags
LogPluginManager: Mounting Engine plugin AudioCapture
LogPluginManager: Mounting Engine plugin AudioSynesthesia
LogPluginManager: Mounting Engine plugin AudioWidgets
LogPluginManager: Mounting Engine plugin CableComponent
LogPluginManager: Mounting Engine plugin ChunkDownloader
LogPluginManager: Mounting Engine plugin CustomMeshComponent
LogPluginManager: Mounting Engine plugin ComputeFramework
LogPluginManager: Mounting Engine plugin ExampleDeviceProfileSelector
LogPluginManager: Mounting Engine plugin GeometryCache
LogPluginManager: Mounting Engine plugin GeometryProcessing
LogPluginManager: Mounting Engine plugin GoogleCloudMessaging
LogPluginManager: Mounting Engine plugin GooglePAD
LogPluginManager: Mounting Engine plugin HairStrands
LogPluginManager: Mounting Engine plugin LinuxDeviceProfileSelector
LogPluginManager: Mounting Engine plugin LocationServicesBPLibrary
LogPluginManager: Mounting Engine plugin MeshModelingToolset
LogPluginManager: Mounting Engine plugin Metasound
LogPluginManager: Mounting Engine plugin MobilePatchingUtils
LogPluginManager: Mounting Engine plugin MsQuic
LogPluginManager: Mounting Engine plugin ProceduralMeshComponent
LogPluginManager: Mounting Engine plugin PropertyBindingUtils
LogPluginManager: Mounting Engine plugin ResonanceAudio
LogPluginManager: Mounting Engine plugin RigVM
LogPluginManager: Mounting Engine plugin SignificanceManager
LogPluginManager: Mounting Engine plugin PropertyAccessEditor
LogPluginManager: Mounting Engine plugin SoundFields
LogPluginManager: Mounting Engine plugin StateTree
LogPluginManager: Mounting Engine plugin Synthesis
LogPluginManager: Mounting Engine plugin WaveTable
LogPluginManager: Mounting Engine plugin WebMMoviePlayer
LogPluginManager: Mounting Engine plugin WindowsMoviePlayer
LogPluginManager: Mounting Engine plugin WindowsDeviceProfileSelector
LogPluginManager: Mounting Engine plugin AnimationSharing
LogPluginManager: Mounting Engine plugin CodeLiteSourceCodeAccess
LogPluginManager: Mounting Engine plugin GitSourceControl
LogPluginManager: Mounting Engine plugin GPUReshape
LogPluginManager: Mounting Engine plugin KDevelopSourceCodeAccess
LogPluginManager: Mounting Engine plugin N10XSourceCodeAccess
LogPluginManager: Mounting Engine plugin NamingTokens
LogPluginManager: Mounting Engine plugin NullSourceCodeAccess
LogPluginManager: Mounting Engine plugin PerforceSourceControl
LogPluginManager: Mounting Engine plugin PixWinPlugin
LogPluginManager: Mounting Engine plugin PlasticSourceControl
LogPluginManager: Mounting Engine plugin PluginUtils
LogPluginManager: Mounting Engine plugin ProjectLauncher
LogPluginManager: Mounting Engine plugin RiderSourceCodeAccess
LogPluginManager: Mounting Engine plugin IOSDeviceProfileSelector
LogPluginManager: Mounting Engine plugin SubversionSourceControl
LogPluginManager: Mounting Engine plugin RenderDocPlugin
LogPluginManager: Mounting Engine plugin TextureFormatOodle
LogPluginManager: Mounting Engine plugin VisualStudioCodeSourceCodeAccess
LogPluginManager: Mounting Engine plugin UObjectPlugin
LogPluginManager: Mounting Engine plugin VisualStudioSourceCodeAccess
LogPluginManager: Mounting Engine plugin Cascade
LogPluginManager: Mounting Engine plugin XCodeSourceCodeAccess
LogPluginManager: Mounting Engine plugin Niagara
LogPluginManager: Mounting Engine plugin NiagaraPreviewContent
LogPluginManager: Mounting Engine plugin NiagaraSimCaching
LogPluginManager: Mounting Engine plugin InterchangeAssets
LogPluginManager: Mounting Engine plugin InterchangeEditor
LogPluginManager: Mounting Engine plugin Interchange
LogPluginManager: Mounting Engine plugin MetaHumanSDK
LogPluginManager: Mounting Engine plugin OnlineBase
LogPluginManager: Mounting Engine plugin OnlineServices
LogPluginManager: Mounting Engine plugin EOSShared
LogPluginManager: Mounting Engine plugin OnlineSubsystem
LogPluginManager: Mounting Engine plugin OnlineSubsystemNull
LogPluginManager: Mounting Engine plugin InterchangeTests
LogPluginManager: Mounting Engine plugin InputDebugging
LogPluginManager: Mounting Engine plugin LauncherChunkInstaller
LogPluginManager: Mounting Engine plugin Takes
LogPluginManager: Mounting Engine plugin Paper2D
LogPluginManager: Mounting Engine plugin EnvironmentQueryEditor
LogPluginManager: Mounting Engine plugin AISupport
LogPluginManager: Mounting Engine plugin ACLPlugin
LogPluginManager: Mounting Engine plugin AnimationData
LogPluginManager: Mounting Engine plugin AnimationModifierLibrary
LogPluginManager: Mounting Engine plugin BlendSpaceMotionAnalysis
LogPluginManager: Mounting Engine plugin ControlRig
LogPluginManager: Mounting Engine plugin ControlRigSpline
LogPluginManager: Mounting Engine plugin ControlRigModules
LogPluginManager: Mounting Engine plugin DeformerGraph
LogPluginManager: Mounting Engine plugin EaseCurveTool
LogPluginManager: Mounting Engine plugin GameplayInsights
LogPluginManager: Mounting Engine plugin IKRig
LogPluginManager: Mounting Engine plugin RigLogic
LogPluginManager: Mounting Engine plugin SkeletalMeshModelingTools
LogPluginManager: Mounting Engine plugin TweeningUtils
LogPluginManager: Mounting Engine plugin OodleNetwork
LogPluginManager: Mounting Engine plugin DatasmithContent
LogPluginManager: Mounting Engine plugin GLTFExporter
LogPluginManager: Mounting Engine plugin VariantManager
LogPluginManager: Mounting Engine plugin VariantManagerContent
LogPluginManager: Mounting Engine plugin AlembicImporter
LogPluginManager: Mounting Engine plugin AndroidMedia
LogPluginManager: Mounting Engine plugin AvfMedia
LogPluginManager: Mounting Engine plugin SkeletalReduction
LogPluginManager: Mounting Engine plugin ImgMedia
LogPluginManager: Mounting Engine plugin MediaCompositing
LogPluginManager: Mounting Engine plugin MediaPlayerEditor
LogPluginManager: Mounting Engine plugin MediaPlate
LogPluginManager: Mounting Engine plugin WebMMedia
LogPluginManager: Mounting Engine plugin WmfMedia
LogPluginManager: Mounting Engine plugin LevelSequenceEditor
LogPluginManager: Mounting Engine plugin SequencerScripting
LogPluginManager: Mounting Engine plugin SequenceValidator
LogPluginManager: Mounting Engine plugin TemplateSequence
LogPluginManager: Mounting Engine plugin NNEDenoiser
LogPluginManager: Mounting Engine plugin NNERuntimeORT
LogPluginManager: Mounting Engine plugin DumpGPUServices
LogPluginManager: Mounting Engine plugin CLionSourceCodeAccess
LogPluginManager: Mounting Engine plugin PropertyAccessNode
LogPluginManager: Mounting Engine plugin OnlineSubsystemUtils
LogPluginManager: Mounting Engine plugin ActorSequence
LogPluginManager: Mounting Engine plugin PortableObjectFileDataSource
LogPluginManager: Mounting Engine plugin ContentBrowserAssetDataSource
LogPluginManager: Mounting Engine plugin ContentBrowserClassDataSource
LogPluginManager: Mounting Engine plugin ContentBrowserFileDataSource
LogPluginManager: Mounting Engine plugin BaseCharacterFXEditor
LogPluginManager: Mounting Engine plugin ObjectMixer
LogPluginManager: Mounting Engine plugin LightMixer
LogPluginManager: Mounting Engine plugin OnlineSubsystemGooglePlay
LogPluginManager: Mounting Engine plugin XInputDevice
LogPluginManager: Mounting Engine plugin OnlineSubsystemIOS
LogPluginManager: Mounting Project plugin ReplaySystem
SourceControl: Revision control is disabled
SourceControl: Revision control is disabled
SourceControl: Revision control is disabled
LogConfig: Applying CVar settings from Section [/Script/CompositeCore.CompositeCorePluginSettings] File [Engine]
LogStudioTelemetry: Started StudioTelemetry Session
LogNFORDenoise: NFORDenoise function starting up
LogStudioTelemetry: Started StudioTelemetry Session
LogWindows: Failed to load 'WinPixGpuCapturer.dll' (GetLastError=126)
LogWindows: File 'WinPixGpuCapturer.dll' does not exist
PixWinPlugin: PIX capture plugin failed to initialize! Check that the process is launched from PIX.
LogConfig: Applying CVar settings from Section [/Script/RenderDocPlugin.RenderDocPluginSettings] File [Engine]
RenderDocPlugin: Display: RenderDoc plugin will not be loaded. Use '-AttachRenderDoc' on the cmd line or enable 'renderdoc.AutoAttach' in the plugin settings.
LogEOSShared: Loaded "C:/Program Files/Epic Games/UE_5.7/Engine/Binaries/Win64/EOSSDK-Win64-Shipping.dll"
LogEOSShared: FEOSSDKManager::Initialize Initializing EOSSDK Version:1.19.0.3-49960398
LogInit: Using libcurl 8.12.1
LogInit: - built for Windows
LogInit: - supports SSL with OpenSSL/1.1.1t
LogInit: - supports HTTP deflate (compression) using libz 1.3
LogInit: - other features:
LogInit: CURL_VERSION_SSL
LogInit: CURL_VERSION_LIBZ
LogInit: CURL_VERSION_IPV6
LogInit: CURL_VERSION_ASYNCHDNS
LogInit: CURL_VERSION_LARGEFILE
LogInit: CURL_VERSION_TLSAUTH_SRP
LogInit: CURL_VERSION_HTTP2
LogInit: CurlRequestOptions (configurable via config and command line):
LogInit: - bVerifyPeer = true - Libcurl will verify peer certificate
LogInit: - bUseHttpProxy = false - Libcurl will NOT use HTTP proxy
LogInit: - CVarHttpCurlReuseConnectionEnabled = true - Libcurl will reuse connections
LogInit: - MaxHostConnections = 16 - Libcurl will limit the number of connections to a host
LogInit: - LocalHostAddr = Default
LogInit: - BufferSize = 65536
LogInit: CreateHttpThread using FCurlMultiPollEventLoopHttpThread
LogInit: Creating http thread with maximum 256 concurrent requests
LogInit: WinSock: version 1.1 (2.2), MaxSocks=32767, MaxUdp=65467
LogOnline: OSS: Created online subsystem instance for: NULL
LogOnline: OSS: TryLoadSubsystemAndSetDefault: Loaded subsystem for type [NULL]
LogInit: ExecutableName: UnrealEditor.exe
LogInit: Build: ++UE5+Release-5.7-CL-51494982
LogInit: Platform=WindowsEditor
LogInit: MachineId=5440aecf4e36dfe9905193a4742566fb
LogInit: DeviceId=
LogInit: Engine Version: 5.7.4-51494982+++UE5+Release-5.7
LogInit: Compatible Engine Version: 5.7.0-47537391+++UE5+Release-5.7
LogInit: Net CL: 47537391
LogInit: OS: Windows 11 (25H2) [10.0.26200.7171] (), CPU: 12th Gen Intel(R) Core(TM) i9-12900H, GPU: Intel(R) Iris(R) Xe Graphics
LogInit: CPU Model ID: 69a3, microcode revision: 43b
LogInit: Compiled (64-bit): Mar 6 2026 12:43:05
LogInit: Architecture: x64
LogInit: Compiled with Visual C++: 19.44.35223.00
LogInit: Build Configuration: Development
LogInit: Branch Name: ++UE5+Release-5.7
LogInit: Command Line: -AUTH_LOGIN=unused -AUTH_PASSWORD=9fa71e90c40a4dc88f1ea09d29826566 -AUTH_TYPE=exchangecode -epicapp=UE_5.7 -epicenv=Prod -EpicPortal -epicusername=Asterion_VR -epicuserid=2f7b7ff5607d4cd796afc096af9aba6f -epiclocale=fr -epicsandboxid=ue
LogInit: Base Directory: C:/Program Files/Epic Games/UE_5.7/Engine/Binaries/Win64/
LogInit: Allocator: Mimalloc
LogInit: Installed Engine Build: 1
LogInit: This binary is optimized with LTO: no, PGO: no, instrumented for PGO data collection: no
LogDevObjectVersion: Number of dev versions registered: 36
LogDevObjectVersion: Dev-Blueprints (B0D832E4-1F89-4F0D-ACCF-7EB736FD4AA2): 10
LogDevObjectVersion: Dev-Build (E1C64328-A22C-4D53-A36C-8E866417BD8C): 0
LogDevObjectVersion: Dev-Core (375EC13C-06E4-48FB-B500-84F0262A717E): 4
LogDevObjectVersion: Dev-Editor (E4B068ED-F494-42E9-A231-DA0B2E46BB41): 40
LogDevObjectVersion: Dev-Framework (CFFC743F-43B0-4480-9391-14DF171D2073): 37
LogDevObjectVersion: Dev-Mobile (B02B49B5-BB20-44E9-A304-32B752E40360): 3
LogDevObjectVersion: Dev-Networking (A4E4105C-59A1-49B5-A7C5-40C4547EDFEE): 0
LogDevObjectVersion: Dev-Online (39C831C9-5AE6-47DC-9A44-9C173E1C8E7C): 0
LogDevObjectVersion: Dev-Physics (78F01B33-EBEA-4F98-B9B4-84EACCB95AA2): 20
LogDevObjectVersion: Dev-Platform (6631380F-2D4D-43E0-8009-CF276956A95A): 0
LogDevObjectVersion: Dev-Rendering (12F88B9F-8875-4AFC-A67C-D90C383ABD29): 49
LogDevObjectVersion: Dev-Sequencer (7B5AE74C-D270-4C10-A958-57980B212A5A): 13
LogDevObjectVersion: Dev-VR (D7296918-1DD6-4BDD-9DE2-64A83CC13884): 3
LogDevObjectVersion: Dev-LoadTimes (C2A15278-BFE7-4AFE-6C17-90FF531DF755): 1
LogDevObjectVersion: Private-Geometry (6EACA3D4-40EC-4CC1-B786-8BED09428FC5): 3
LogDevObjectVersion: Dev-AnimPhys (29E575DD-E0A3-4627-9D10-D276232CDCEA): 17
LogDevObjectVersion: Dev-Anim (AF43A65D-7FD3-4947-9873-3E8ED9C1BB05): 15
LogDevObjectVersion: Dev-ReflectionCapture (6B266CEC-1EC7-4B8F-A30B-E4D90942FC07): 1
LogDevObjectVersion: Dev-Automation (0DF73D61-A23F-47EA-B727-89E90C41499A): 1
LogDevObjectVersion: FortniteMain (601D1886-AC64-4F84-AA16-D3DE0DEAC7D6): 225
LogDevObjectVersion: FortniteValkyrie (8DBC2C5B-54A7-43E0-A768-FCBB7DA29060): 8
LogDevObjectVersion: FortniteSeason (5B4C06B7-2463-4AF8-805B-BF70CDF5D0DD): 15
LogDevObjectVersion: FortniteRelease (E7086368-6B23-4C58-8439-1B7016265E91): 17
LogDevObjectVersion: Dev-Enterprise (9DFFBCD6-494F-0158-E221-12823C92A888): 11
LogDevObjectVersion: Dev-Niagara (F2AED0AC-9AFE-416F-8664-AA7FFA26D6FC): 1
LogDevObjectVersion: Dev-Destruction (174F1F0B-B4C6-45A5-B13F-2EE8D0FB917D): 10
LogDevObjectVersion: Dev-Physics-Ext (35F94A83-E258-406C-A318-09F59610247C): 41
LogDevObjectVersion: Dev-PhysicsMaterial-Chaos (B68FC16E-8B1B-42E2-B453-215C058844FE): 1
LogDevObjectVersion: Dev-CineCamera (B2E18506-4273-CFC2-A54E-F4BB758BBA07): 1
LogDevObjectVersion: Dev-VirtualProduction (64F58936-FD1B-42BA-BA96-7289D5D0FA4E): 1
LogDevObjectVersion: UE5-Main (697DD581-E64F-41AB-AA4A-51ECBEB7B628): 121
LogDevObjectVersion: UE5-Release (D89B5E42-24BD-4D46-8412-ACA8DF641779): 61
LogDevObjectVersion: UE5-SpecialProject (59DA5D52-1232-4948-B878-597870B8E98B): 9
LogDevObjectVersion: Dev-MediaFramework (6F0ED827-A609-4895-9C91-998D90180EA4): 2
LogDevObjectVersion: Dev-NaniteResearch (30D58BE3-95EA-4282-A6E3-B159D8EBB06A): 1
LogDevObjectVersion: Dev-ComputeFramework (6304A3E7-0059-4F59-8CFC-21BD7721FD4E): 0
LogInit: Presizing for max 25165824 objects, including 0 objects not considered by GC.
LogInit: Object subsystem initialized
LogConfig: Set CVar [[con.DebugEarlyDefault:1]]
[2026.07.02-15.26.46:244][ 0]LogConfig: CVar [[con.DebugLateDefault:1]] deferred - dummy variable created
[2026.07.02-15.26.46:244][ 0]LogConfig: CVar [[con.DebugLateCheat:1]] deferred - dummy variable created
[2026.07.02-15.26.46:244][ 0]LogConfig: CVar [[LogNamedEventFilters:Frame *]] deferred - dummy variable created
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[r.setres:1280x720]]
[2026.07.02-15.26.46:244][ 0]LogConfig: CVar [[framepro.ScopeMinTimeMicroseconds:10]] deferred - dummy variable created
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[fx.NiagaraAllowRuntimeScalabilityChanges:1]]
[2026.07.02-15.26.46:244][ 0]LogConfig: CVar [[QualityLevelMapping:high]] deferred - dummy variable created
[2026.07.02-15.26.46:244][ 0]LogConfig: CVar [[r.Occlusion.SingleRHIThreadStall:1]] deferred - dummy variable created
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[r.Nanite.Streaming.ReservedResources:1]]
[2026.07.02-15.26.46:244][ 0]LogConfig: CVar [[D3D12.Bindless.ResourceDescriptorHeapSize:32768]] deferred - dummy variable created
[2026.07.02-15.26.46:244][ 0]LogConfig: CVar [[D3D12.Bindless.SamplerDescriptorHeapSize:2048]] deferred - dummy variable created
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[r.PSOPrecache.GlobalShaders:1]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[r.VRS.EnableSoftware:1]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[r.VRS.ContrastAdaptiveShading:1]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[r.VSync:0]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Applying CVar settings from Section [/Script/Engine.RendererSettings] File [Engine]
[2026.07.02-15.26.46:244][ 0]LogConfig: CVar [[VisualizeCalibrationColorMaterialPath:/Engine/EngineMaterials/PPM_DefaultCalibrationColor.PPM_DefaultCalibrationColor]] deferred - dummy variable created
[2026.07.02-15.26.46:244][ 0]LogConfig: CVar [[VisualizeCalibrationGrayscaleMaterialPath:/Engine/EngineMaterials/PPM_DefaultCalibrationGrayscale.PPM_DefaultCalibrationGrayscale]] deferred - dummy variable created
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[r.GPUCrashDebugging:0]]
[2026.07.02-15.26.46:244][ 0]LogConfig: CVar [[MaxSkinBones:(Default=65536,PerPlatform=(("Mobile", 256)))]] deferred - dummy variable created
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[r.Shaders.RemoveUnusedInterpolators:1]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[r.Shadow.DetectVertexShaderLayerAtRuntime:1]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[r.Substrate.RoughDiffuse:1]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[r.Substrate.SheenQuality:1]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[r.Substrate.ShadingQuality:1]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[r.Substrate.TileCoord8bits:0]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[r.Substrate.Glints:1]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[r.Substrate.ClosuresPerPixel:4]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[r.Refraction.Blur:1]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[r.AllowStaticLighting:0]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[r.GenerateMeshDistanceFields:1]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[r.DynamicGlobalIlluminationMethod:1]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[r.ReflectionMethod:1]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[r.SkinCache.CompileShaders:1]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[r.RayTracing:1]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[r.RayTracing.RayTracingProxies.ProjectEnabled:1]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[r.Substrate:1]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[r.Substrate.ProjectGBufferFormat:0]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[r.Shadow.Virtual.Enable:1]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[r.DefaultFeature.AutoExposure.ExtendDefaultLuminanceRange:1]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[r.DefaultFeature.LocalExposure.HighlightContrastScale:0.8]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[r.DefaultFeature.LocalExposure.ShadowContrastScale:0.8]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Applying CVar settings from Section [/Script/Engine.RendererOverrideSettings] File [Engine]
[2026.07.02-15.26.46:244][ 0]LogConfig: Applying CVar settings from Section [/Script/Engine.StreamingSettings] File [Engine]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[s.MinBulkDataSizeForAsyncLoading:131072]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[s.AsyncLoadingThreadEnabled:1]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[s.EventDrivenLoaderEnabled:1]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[s.WarnIfTimeLimitExceeded:0]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[s.TimeLimitExceededMultiplier:1.5]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[s.TimeLimitExceededMinTime:0.005]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[s.UseBackgroundLevelStreaming:1]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[s.PriorityAsyncLoadingExtraTime:15.0]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[s.LevelStreamingActorsUpdateTimeLimit:5.0]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[s.PriorityLevelStreamingActorsUpdateExtraTime:5.0]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[s.LevelStreamingComponentsRegistrationGranularity:10]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[s.UnregisterComponentsTimeLimit:1.0]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[s.LevelStreamingComponentsUnregistrationGranularity:5]]
[2026.07.02-15.26.46:244][ 0]LogConfig: CVar [[s.MaxPackageSummarySize:16384]] deferred - dummy variable created
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[s.FlushStreamingOnExit:1]]
[2026.07.02-15.26.46:244][ 0]LogConfig: CVar [[FixedBootOrder:/Script/Engine/Default__SoundBase]] deferred - dummy variable created
[2026.07.02-15.26.46:244][ 0]LogConfig: CVar [[FixedBootOrder:/Script/Engine/Default__MaterialInterface]] deferred - dummy variable created
[2026.07.02-15.26.46:244][ 0]LogConfig: CVar [[FixedBootOrder:/Script/Engine/Default__DeviceProfileManager]] deferred - dummy variable created
[2026.07.02-15.26.46:244][ 0]LogConfig: Applying CVar settings from Section [/Script/Engine.GarbageCollectionSettings] File [Engine]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[gc.MaxObjectsNotConsideredByGC:1]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[gc.FlushStreamingOnGC:0]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[gc.NumRetriesBeforeForcingGC:10]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[gc.AllowParallelGC:1]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[gc.TimeBetweenPurgingPendingKillObjects:61.1]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[gc.MaxObjectsInEditor:25165824]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[gc.IncrementalBeginDestroyEnabled:1]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[gc.CreateGCClusters:1]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[gc.MinGCClusterSize:5]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[gc.AssetClustreringEnabled:0]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[gc.ActorClusteringEnabled:0]]
[2026.07.02-15.26.46:244][ 0]LogConfig: Set CVar [[gc.VerifyUObjectsAreNotFGCObjects:0]]
[2026.07.02-15.26.46:245][ 0]LogConfig: Set CVar [[gc.GarbageEliminationEnabled:1]]
[2026.07.02-15.26.46:245][ 0]LogConfig: Applying CVar settings from Section [/Script/Engine.NetworkSettings] File [Engine]
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[NetworkEmulationProfiles:(ProfileName="Average",ToolTip="Simulates average internet conditions")]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[NetworkEmulationProfiles:(ProfileName="Bad",ToolTip="Simulates laggy internet conditions")]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[NetworkEmulationProfiles:(ProfileName="BufferBloat",ToolTip="Simulates a connection affected by buffer bloat (in and out)")]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: Applying CVar settings from Section [/Script/UnrealEd.CookerSettings] File [Engine]
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[DefaultASTCQualityBySpeed:2]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[DefaultASTCQualityBySize:3]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[DefaultASTCQualityBySizeHQ:4]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[ClassesExcludedOnDedicatedServer:WidgetBlueprint]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[ClassesExcludedOnDedicatedServer:GroupActor]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[ClassesExcludedOnDedicatedServer:MetaData]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[ClassesExcludedOnDedicatedServer:ObjectRedirector]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[ClassesExcludedOnDedicatedServer:NavMeshRenderingComponent]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[ClassesExcludedOnDedicatedServer:ReflectionCaptureComponent]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[ClassesExcludedOnDedicatedServer:TextRenderComponent]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[ClassesExcludedOnDedicatedServer:Font]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[ClassesExcludedOnDedicatedServer:InterpCurveEdSetup]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[ClassesExcludedOnDedicatedServer:MaterialExpression]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[ClassesExcludedOnDedicatedServer:NiagaraEmitter]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[ClassesExcludedOnDedicatedServer:NiagaraScript]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[ClassesExcludedOnDedicatedServer:ParticleEmitter]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[ClassesExcludedOnDedicatedServer:ParticleLODLevel]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[ClassesExcludedOnDedicatedServer:ParticleModule]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[ClassesExcludedOnDedicatedServer:SubUVAnimation]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[ClassesExcludedOnDedicatedServer:SoundNode]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[ClassesExcludedOnDedicatedServer:GameplayEffectUIData]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[ClassesExcludedOnDedicatedServer:AmbientSound]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[ClassesExcludedOnDedicatedClient:WidgetBlueprint]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[ClassesExcludedOnDedicatedClient:GroupActor]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[ClassesExcludedOnDedicatedClient:MetaData]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[ClassesExcludedOnDedicatedClient:ObjectRedirector]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[ClassesExcludedOnDedicatedClient:InterpCurveEdSetup]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[VersionedIntRValues:r.AllowStaticLighting]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[VersionedIntRValues:r.MaterialEditor.LWCTruncateMode]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[VersionedIntRValues:r.VelocityOutputPass]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[VersionedIntRValues:r.SelectiveBasePassOutputs]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[VersionedIntRValues:r.DBuffer]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[VersionedIntRValues:r.Mobile.DBuffer]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[VersionedIntRValues:r.Shaders.Symbols]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[VersionedIntRValues:r.Shaders.GenerateSymbols]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[VersionedIntRValues:r.Shaders.WriteSymbols]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[VersionedIntRValues:r.Shaders.AllowUniqueSymbols]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[VersionedIntRValues:r.Shaders.ExtraData]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[VersionedIntRValues:r.Shaders.Optimize]] deferred - dummy variable created
[2026.07.02-15.26.46:245][ 0]LogConfig: CVar [[VersionedIntRValues:r.CompileShadersForDevelopment]] deferred - dummy variable created
[2026.07.02-15.26.46:246][ 0]LogConfig: CVar [[VersionedIntRValues:r.MobileHDR]] deferred - dummy variable created
[2026.07.02-15.26.46:246][ 0]LogConfig: CVar [[VersionedIntRValues:r.UsePreExposure]] deferred - dummy variable created
[2026.07.02-15.26.46:246][ 0]LogCsvProfiler: Display: Metadata set : systemresolution.resx="1536"
[2026.07.02-15.26.46:246][ 0]LogCsvProfiler: Display: Metadata set : systemresolution.resy="864"
[2026.07.02-15.26.46:247][ 0]LogConfig: Applying CVar settings from Section [ViewDistanceQuality@3] File [Scalability]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.SkeletalMeshLODBias:0]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.ViewDistanceScale:1.0]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Applying CVar settings from Section [AntiAliasingQuality@3] File [Scalability]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.FXAA.Quality:4]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.TemporalAA.Quality:2]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.TSR.History.R11G11B10:1]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.TSR.History.ScreenPercentage:200]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.TSR.History.UpdateQuality:3]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.TSR.ShadingRejection.Flickering:1]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.TSR.RejectionAntiAliasingQuality:2]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.TSR.ReprojectionField:1]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.TSR.Resurrection:1]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Applying CVar settings from Section [ShadowQuality@3] File [Scalability]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.LightFunctionQuality:1]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.ShadowQuality:5]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Shadow.CSM.MaxCascades:10]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Shadow.MaxResolution:2048]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Shadow.MaxCSMResolution:2048]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Shadow.RadiusThreshold:0.01]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Shadow.DistanceScale:1.0]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Shadow.CSM.TransitionScale:1.0]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Shadow.PreShadowResolutionFactor:1.0]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.DistanceFieldShadowing:1]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.VolumetricFog:1]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.VolumetricFog.GridPixelSize:8]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.VolumetricFog.GridSizeZ:128]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.VolumetricFog.HistoryMissSupersampleCount:4]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.LightMaxDrawDistanceScale:1]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.CapsuleShadows:1]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Shadow.Virtual.MaxPhysicalPages:4096]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Shadow.Virtual.ResolutionLodBiasDirectional:-1.5]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Shadow.Virtual.ResolutionLodBiasDirectionalMoving:-1.5]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Shadow.Virtual.ResolutionLodBiasLocal:0.0]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Shadow.Virtual.ResolutionLodBiasLocalMoving:1.0]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Shadow.Virtual.SMRT.RayCountDirectional:8]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Shadow.Virtual.SMRT.SamplesPerRayDirectional:4]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Shadow.Virtual.SMRT.RayCountLocal:8]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Shadow.Virtual.SMRT.SamplesPerRayLocal:4]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Shadow.Virtual.MarkCoarsePagesLocal:1]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Applying CVar settings from Section [GlobalIlluminationQuality@3] File [Scalability]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.DistanceFieldAO:1]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.SkylightIntensityMultiplier:1.0]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.AOQuality:2]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Lumen.DiffuseIndirect.Allow:1]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.LumenScene.DirectLighting.MaxLightsPerTile:8]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.LumenScene.DirectLighting.UpdateFactor:32]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.LumenScene.Radiosity.UpdateFactor:64]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.LumenScene.Radiosity.ProbeSpacing:4]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.LumenScene.Radiosity.HemisphereProbeResolution:4]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Lumen.TraceMeshSDFs.Allow:1]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Lumen.ScreenProbeGather.RadianceCache.ProbeResolution:32]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Lumen.ScreenProbeGather.RadianceCache.NumProbesToTraceBudget:100]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Lumen.ScreenProbeGather.DownsampleFactor:16]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Lumen.ScreenProbeGather.NumAdaptiveProbes:8]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Lumen.ScreenProbeGather.TracingOctahedronResolution:8]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Lumen.ScreenProbeGather.IrradianceFormat:0]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Lumen.ScreenProbeGather.StochasticInterpolation:0]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Lumen.ScreenProbeGather.FullResolutionJitterWidth:1]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Lumen.ScreenProbeGather.TwoSidedFoliageBackfaceDiffuse:1]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Lumen.ScreenProbeGather.ScreenTraces.HZBTraversal.FullResDepth:1]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Lumen.ScreenProbeGather.ShortRangeAO.BentNormal:1]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Lumen.ScreenProbeGather.ShortRangeAO.HorizonSearch.HZB:0]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Lumen.ScreenProbeGather.ShortRangeAO.HorizonSearch.ForegroundSampleRejectPower:1]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Lumen.TranslucencyVolume.GridPixelSize:32]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Lumen.TranslucencyVolume.TraceFromVolume:1]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Lumen.TranslucencyVolume.TracingOctahedronResolution:3]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Lumen.TranslucencyVolume.RadianceCache.ProbeResolution:8]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Lumen.TranslucencyVolume.RadianceCache.NumProbesToTraceBudget:70]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.RayTracing.Scene.BuildMode:1]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Applying CVar settings from Section [ReflectionQuality@3] File [Scalability]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.SSR.Quality:3]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.SSR.HalfResSceneColor:0]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Lumen.Reflections.Allow:1]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Lumen.Reflections.DownsampleFactor:1]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Lumen.Reflections.MaxRoughnessToTraceForFoliage:0.4]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Lumen.ScreenProbeGather.MaxRoughnessToEvaluateRoughSpecularForFoliage:0.8]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Lumen.Reflections.ScreenSpaceReconstruction.NumSamples:5]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Lumen.Reflections.ScreenSpaceReconstruction.MinWeight:0]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Lumen.TranslucencyReflections.FrontLayer.Allow:1]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Lumen.TranslucencyReflections.FrontLayer.Enable:0]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Applying CVar settings from Section [PostProcessQuality@3] File [Scalability]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.MotionBlurQuality:4]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.MotionBlur.HalfResGather:0]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.AmbientOcclusionMipLevelFactor:0.4]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.AmbientOcclusionMaxQuality:100]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.AmbientOcclusionLevels:-1]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.AmbientOcclusionRadiusScale:1.0]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.DepthOfFieldQuality:2]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.RenderTargetPoolMin:400]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.LensFlareQuality:2]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.SceneColorFringeQuality:1]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.EyeAdaptationQuality:2]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.BloomQuality:5]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Bloom.ScreenPercentage:50.000]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.FastBlurThreshold:100]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Upscale.Quality:3]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.LightShaftQuality:1]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Filter.SizeScale:1]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.Tonemapper.Quality:5]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.DOF.Gather.ResolutionDivisor:2 ; lower gathering resolution]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.DOF.Gather.AccumulatorQuality:1 ; higher gathering accumulator quality]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.DOF.Gather.PostfilterMethod:1 ; Median3x3 postfilering method]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.DOF.Gather.EnableBokehSettings:0 ; no bokeh simulation when gathering]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.DOF.Gather.RingCount:4 ; medium number of samples when gathering]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.DOF.Scatter.ForegroundCompositing:1 ; additive foreground scattering]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.DOF.Scatter.BackgroundCompositing:2 ; additive background scattering]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.DOF.Scatter.EnableBokehSettings:1 ; bokeh simulation when scattering]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.DOF.Scatter.MaxSpriteRatio:0.1 ; only a maximum of 10% of scattered bokeh]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.DOF.Recombine.Quality:1 ; cheap slight out of focus]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.DOF.Recombine.EnableBokehSettings:0 ; no bokeh simulation on slight out of focus]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.DOF.TemporalAAQuality:1 ; more stable temporal accumulation]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.DOF.Kernel.MaxForegroundRadius:0.025]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Set CVar [[r.DOF.Kernel.MaxBackgroundRadius:0.025]]
[2026.07.02-15.26.46:247][ 0]LogConfig: Applying CVar settings from Section [TextureQuality@3] File [Scalability]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.Streaming.MipBias:0]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.Streaming.AmortizeCPUToGPUCopy:0]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.Streaming.MaxNumTexturesToStreamPerFrame:0]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.Streaming.Boost:1]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.MaxAnisotropy:8]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.VT.MaxAnisotropy:8]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.Streaming.LimitPoolSizeToVRAM:0]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.Streaming.PoolSize:1000]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.Streaming.MaxEffectiveScreenSize:0]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Applying CVar settings from Section [EffectsQuality@3] File [Scalability]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.TranslucencyLightingVolume.Dim:64]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.RefractionQuality:2]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.SceneColorFormat:4]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.DetailMode:3]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.TranslucencyLightingVolume.Blur:1]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.MaterialQualityLevel:1 ; High quality]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.SSS.Scale:1]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.SSS.SampleSet:2]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.SSS.Quality:1]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.SSS.HalfRes:0]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.SSGI.Quality:3]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.EmitterSpawnRateScale:1.0]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.ParticleLightQuality:2]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.SkyAtmosphere.AerialPerspectiveLUT.FastApplyOnOpaque:1 ; Always have FastSkyLUT 1 in this case to avoid wrong sky]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.SkyAtmosphere.AerialPerspectiveLUT.SampleCountMaxPerSlice:4]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.SkyAtmosphere.AerialPerspectiveLUT.DepthResolution:16.0]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.SkyAtmosphere.FastSkyLUT:1]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.SkyAtmosphere.FastSkyLUT.SampleCountMin:4.0]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.SkyAtmosphere.FastSkyLUT.SampleCountMax:128.0]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.SkyAtmosphere.SampleCountMin:4.0]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.SkyAtmosphere.SampleCountMax:128.0]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.SkyAtmosphere.TransmittanceLUT.UseSmallFormat:0]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.SkyAtmosphere.TransmittanceLUT.SampleCount:10.0]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.SkyAtmosphere.MultiScatteringLUT.SampleCount:15.0]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[fx.Niagara.QualityLevel:3]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.Refraction.OffsetQuality:1]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.HeterogeneousVolumes.DownsampleFactor:2]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.HeterogeneousVolumes.MaxStepCount:256]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.HeterogeneousVolumes.Shadows.Resolution:512]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.HeterogeneousVolumes.Shadows.Precision:0]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.HeterogeneousVolumes.UseExistenceMask:0]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Applying CVar settings from Section [FoliageQuality@3] File [Scalability]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[foliage.DensityScale:1.0]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[grass.DensityScale:1.0]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Applying CVar settings from Section [ShadingQuality@3] File [Scalability]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.HairStrands.SkyLighting.IntegrationType:2]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.HairStrands.SkyAO.SampleCount:4]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.HairStrands.Visibility.MSAA.SamplePerPixel:4]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Set CVar [[r.AnisotropicMaterials:1]]
[2026.07.02-15.26.46:248][ 0]LogConfig: Applying CVar settings from Section [LandscapeQuality@3] File [Scalability]
[2026.07.02-15.26.46:252][ 0]LogRHI: Using Default RHI: D3D12
[2026.07.02-15.26.46:252][ 0]LogRHI: Using Highest Feature Level of D3D12: SM6
[2026.07.02-15.26.46:252][ 0]LogRHI: Loading RHI module D3D12RHI
[2026.07.02-15.26.46:255][ 0]LogD3D12RHI: Loading WinPixEventRuntime.dll for PIX profiling (from ../../../Engine/Binaries/ThirdParty/Windows/WinPixEventRuntime/x64).
[2026.07.02-15.26.46:255][ 0]LogRHI: Checking if RHI D3D12 with Feature Level SM6 is supported by your system.
[2026.07.02-15.26.46:740][ 0]LogD3D12RHI: Found D3D12 adapter 0: NVIDIA GeForce RTX 3080 Ti Laptop GPU (VendorId: 10de, DeviceId: 2460, SubSysId: b271028, Revision: 00a1
[2026.07.02-15.26.46:740][ 0]LogD3D12RHI: Max supported Feature Level 12_2, shader model 6.7, binding tier 3, wave ops supported, atomic64 supported
[2026.07.02-15.26.46:740][ 0]LogD3D12RHI: Adapter has 16173MB of dedicated video memory, 0MB of dedicated system memory, and 16219MB of shared system memory, 1 output[s], UMA:false
[2026.07.02-15.26.46:740][ 0]LogD3D12RHI: Driver Version: 596.36 (internal:32.0.15.9636, unified:596.36)
[2026.07.02-15.26.46:740][ 0]LogD3D12RHI: Driver Date: 4-23-2026
[2026.07.02-15.26.46:822][ 0]LogD3D12RHI: Intel Extensions Framework not supported by driver. Please check if a driver update is available.
[2026.07.02-15.26.46:841][ 0]LogD3D12RHI: Found D3D12 adapter 1: Intel(R) Iris(R) Xe Graphics (VendorId: 8086, DeviceId: 46a6, SubSysId: b271028, Revision: 000c
[2026.07.02-15.26.46:841][ 0]LogD3D12RHI: Max supported Feature Level 12_1, shader model 6.7, binding tier 3, wave ops supported, atomic64 unsupported
[2026.07.02-15.26.46:841][ 0]LogD3D12RHI: Adapter has 128MB of dedicated video memory, 0MB of dedicated system memory, and 16219MB of shared system memory, 0 output[s], UMA:true
[2026.07.02-15.26.46:841][ 0]LogD3D12RHI: Driver Version: 32.0.101.7084 (internal:32.0.101.7084, unified:101.7084)
[2026.07.02-15.26.46:841][ 0]LogD3D12RHI: Driver Date: 1-15-2026
[2026.07.02-15.26.46:849][ 0]LogD3D12RHI: Found D3D12 adapter 2: Microsoft Basic Render Driver (VendorId: 1414, DeviceId: 008c, SubSysId: 0000, Revision: 0000
[2026.07.02-15.26.46:849][ 0]LogD3D12RHI: Max supported Feature Level 12_1, shader model 6.7, binding tier 3, wave ops supported, atomic64 supported
[2026.07.02-15.26.46:849][ 0]LogD3D12RHI: Adapter has 0MB of dedicated video memory, 0MB of dedicated system memory, and 16219MB of shared system memory, 0 output[s], UMA:true
[2026.07.02-15.26.46:850][ 0]LogD3D12RHI: D3D10Warp Version: 10.0.26100.7019
[2026.07.02-15.26.46:850][ 0]LogD3D12RHI: DirectX Agility SDK runtime found.
[2026.07.02-15.26.46:850][ 0]LogD3D12RHI: Chosen D3D12 Adapter Id = 0
[2026.07.02-15.26.46:850][ 0]LogRHI: RHI D3D12 with Feature Level SM6 is supported and will be used.
[2026.07.02-15.26.46:850][ 0]LogInit: Selected Device Profile: [WindowsEditor]
[2026.07.02-15.26.46:850][ 0]LogHAL: Display: Platform has ~ 32 GB [34015080448 / 34359738368 / 32], which maps to Largest [LargestMinGB=32, LargerMinGB=12, DefaultMinGB=8, SmallerMinGB=6, SmallestMinGB=0)
[2026.07.02-15.26.46:851][ 0]LogDeviceProfileManager: Going up to parent DeviceProfile [Windows]
[2026.07.02-15.26.46:851][ 0]LogDeviceProfileManager: Going up to parent DeviceProfile []
[2026.07.02-15.26.46:851][ 0]LogDeviceProfileManager: Pushing Device Profile CVar: [[UI.SlateSDFText.RasterizationMode:Bitmap -> Msdf]]
[2026.07.02-15.26.46:851][ 0]LogDeviceProfileManager: Pushing Device Profile CVar: [[UI.SlateSDFText.ResolutionLevel:2 -> 2]]
[2026.07.02-15.26.46:851][ 0]LogConfig: Applying CVar settings from Section [Startup] File [../../../Engine/Config/ConsoleVariables.ini]
[2026.07.02-15.26.46:851][ 0]LogConfig: Set CVar [[r.DumpShaderDebugInfo:2]]
[2026.07.02-15.26.46:851][ 0]LogConfig: Set CVar [[p.chaos.AllowCreatePhysxBodies:1]]
[2026.07.02-15.26.46:851][ 0]LogConfig: Set CVar [[fx.SkipVectorVMBackendOptimizations:1]]
[2026.07.02-15.26.46:851][ 0]LogConfig: Applying CVar settings from Section [Startup_Windows] File [../../../Engine/Config/ConsoleVariables.ini]
[2026.07.02-15.26.46:851][ 0]LogConfig: Applying CVar settings from Section [ConsoleVariables] File [Engine]
[2026.07.02-15.26.46:851][ 0]LogConfig: Set CVar [[WindowsApplication.UseWorkerThreadForRawInput:0]]
[2026.07.02-15.26.46:851][ 0]LogConfig: Applying CVar settings from Section [ConsoleVariables] File [C:/ASTERION/GIT/PS_ReplaySystem/PS_Replay/Saved/Config/WindowsEditor/Editor.ini]
[2026.07.02-15.26.46:851][ 0]LogInit: Computer: ASTERION_VR_01
[2026.07.02-15.26.46:851][ 0]LogInit: User: jfoucher
[2026.07.02-15.26.46:851][ 0]LogInit: CPU Page size=4096, Cores=14
[2026.07.02-15.26.46:851][ 0]LogInit: High frequency timer resolution =10.000000 MHz
[2026.07.02-15.26.46:851][ 0]LogInit: Handheld Device: 0
[2026.07.02-15.26.46:851][ 0]LogMemory: Process is running as part of a Windows Job with separate resource limits
[2026.07.02-15.26.46:851][ 0]LogMemory: Memory total: Physical=31.7GB (32GB approx) Virtual=65.2GB
[2026.07.02-15.26.46:851][ 0]LogMemory: Platform Memory Stats for WindowsEditor
[2026.07.02-15.26.46:851][ 0]LogMemory: Process Physical Memory: 583.54 MB used, 628.89 MB peak
[2026.07.02-15.26.46:851][ 0]LogMemory: Process Virtual Memory: 593.23 MB used, 593.23 MB peak
[2026.07.02-15.26.46:851][ 0]LogMemory: Physical Memory: 21035.20 MB used, 11404.11 MB free, 32439.31 MB total
[2026.07.02-15.26.46:851][ 0]LogMemory: Virtual Memory: 37920.27 MB used, 28839.77 MB free, 66760.05 MB total
[2026.07.02-15.26.46:851][ 0]LogCsvProfiler: Display: Metadata set : extradevelopmentmemorymb="0"
[2026.07.02-15.26.46:854][ 0]LogWindows: WindowsPlatformFeatures enabled
[2026.07.02-15.26.46:856][ 0]LogSpline: Registered spline type: TypeId=0x54E3AD22, Impl=MultiSpline, Value=Vector
[2026.07.02-15.26.46:856][ 0]LogChaosDD: Chaos Debug Draw Startup
[2026.07.02-15.26.46:856][ 0]LogInit: Physics initialised using underlying interface: Chaos
[2026.07.02-15.26.46:857][ 0]LogInit: Overriding language with editor language configuration option (en).
[2026.07.02-15.26.46:857][ 0]LogInit: Using OS detected locale (fr-FR).
[2026.07.02-15.26.46:867][ 0]LogInit: Setting process to per monitor DPI aware
[2026.07.02-15.26.47:606][ 0]LogWindowsTextInputMethodSystem: Available input methods:
[2026.07.02-15.26.47:606][ 0]LogWindowsTextInputMethodSystem: - Français (France) - (Keyboard).
[2026.07.02-15.26.47:606][ 0]LogWindowsTextInputMethodSystem: - Français (France) - Correction de lentrée tactile (TSF IME).
[2026.07.02-15.26.47:606][ 0]LogWindowsTextInputMethodSystem: Activated input method: Français (France) - (Keyboard).
[2026.07.02-15.26.47:616][ 0]LogWindowsTouchpad: Display: CacheForceMaxTouchpadSensitivityMode SetMaxTouchpadSensitivity
[2026.07.02-15.26.47:624][ 0]LogObj: Display: Attempting to load config data for Default__SlateThemeManager before the Class has been constructed/registered/linked (likely during module loading or early startup). This will result in the load silently failing and should be fixed.
[2026.07.02-15.26.47:629][ 0]LogSlate: New Slate User Created. Platform User Id 0, User Index 0, Is Virtual User: 0
[2026.07.02-15.26.47:629][ 0]LogSlate: Slate User Registered. User Index 0, Is Virtual User: 0
[2026.07.02-15.26.47:809][ 0]LogRHI: Using Default RHI: D3D12
[2026.07.02-15.26.47:809][ 0]LogRHI: Using Highest Feature Level of D3D12: SM6
[2026.07.02-15.26.47:809][ 0]LogRHI: Loading RHI module D3D12RHI
[2026.07.02-15.26.47:809][ 0]LogRHI: Checking if RHI D3D12 with Feature Level SM6 is supported by your system.
[2026.07.02-15.26.47:809][ 0]LogRHI: RHI D3D12 with Feature Level SM6 is supported and will be used.
[2026.07.02-15.26.47:809][ 0]LogD3D12RHI: Integrated GPU (iGPU): false
[2026.07.02-15.26.47:809][ 0]LogD3D12RHI: Display: Creating D3D12 RHI with Max Feature Level SM6
[2026.07.02-15.26.47:811][ 0]LogWindows: Attached monitors:
[2026.07.02-15.26.47:811][ 0]LogWindows: resolution: 1920x1080, work area: (0, 0) -> (1920, 1020), device: '\\.\DISPLAY1' [PRIMARY]
[2026.07.02-15.26.47:811][ 0]LogWindows: Found 1 attached monitors.
[2026.07.02-15.26.47:811][ 0]LogWindows: Gathering driver information using Windows Setup API
[2026.07.02-15.26.47:811][ 0]LogRHI: RHI Adapter Info:
[2026.07.02-15.26.47:811][ 0]LogRHI: Name: NVIDIA GeForce RTX 3080 Ti Laptop GPU
[2026.07.02-15.26.47:811][ 0]LogRHI: Driver Version: 596.36 (internal:32.0.15.9636, unified:596.36)
[2026.07.02-15.26.47:811][ 0]LogRHI: Driver Date: 4-23-2026
[2026.07.02-15.26.47:811][ 0]LogD3D12RHI: GPU DeviceId: 0x2460 (for the marketing name, search the web for "GPU Device Id")
[2026.07.02-15.26.47:811][ 0]LogD3D12RHI: InitD3DDevice: -D3DDebug = off -D3D12GPUValidation = off
[2026.07.02-15.26.47:949][ 0]LogNvidiaAftermath: Aftermath initialized
[2026.07.02-15.26.47:949][ 0]LogD3D12RHI: Emitting draw events for PIX profiling.
[2026.07.02-15.26.48:201][ 0]LogNvidiaAftermath: Aftermath enabled. Active feature flags:
[2026.07.02-15.26.48:201][ 0]LogNvidiaAftermath: - Feature: EnableResourceTracking
[2026.07.02-15.26.48:201][ 0]LogD3D12RHI: ID3D12Device1 is supported.
[2026.07.02-15.26.48:201][ 0]LogD3D12RHI: ID3D12Device2 is supported.
[2026.07.02-15.26.48:202][ 0]LogD3D12RHI: ID3D12Device3 is supported.
[2026.07.02-15.26.48:202][ 0]LogD3D12RHI: ID3D12Device4 is supported.
[2026.07.02-15.26.48:202][ 0]LogD3D12RHI: ID3D12Device5 is supported.
[2026.07.02-15.26.48:202][ 0]LogD3D12RHI: ID3D12Device6 is supported.
[2026.07.02-15.26.48:202][ 0]LogD3D12RHI: ID3D12Device7 is supported.
[2026.07.02-15.26.48:202][ 0]LogD3D12RHI: ID3D12Device8 is supported.
[2026.07.02-15.26.48:202][ 0]LogD3D12RHI: ID3D12Device9 is supported.
[2026.07.02-15.26.48:202][ 0]LogD3D12RHI: ID3D12Device10 is supported.
[2026.07.02-15.26.48:202][ 0]LogD3D12RHI: ID3D12Device11 is supported.
[2026.07.02-15.26.48:202][ 0]LogD3D12RHI: ID3D12Device12 is supported.
[2026.07.02-15.26.48:202][ 0]LogD3D12RHI: Bindless is supported. MaxNonSamplerDescriptors: 1000000, MaxSamplerDescriptors: 2048
[2026.07.02-15.26.48:202][ 0]LogD3D12RHI: Stencil ref from pixel shader is not supported
[2026.07.02-15.26.48:202][ 0]LogD3D12RHI: Raster order views are supported
[2026.07.02-15.26.48:202][ 0]LogD3D12RHI: Wave Operations are supported (wave size: min=32 max=32).
[2026.07.02-15.26.48:202][ 0]LogD3D12RHI: Legacy Barriers Present in Build: Yes
[2026.07.02-15.26.48:202][ 0]LogD3D12RHI: Enhanced Barriers Present in Build: Yes
[2026.07.02-15.26.48:202][ 0]LogD3D12RHI: Enhanced Barriers Driver Support: Yes
[2026.07.02-15.26.48:202][ 0]LogD3D12RHI: Preferred Barrier Implementation Type: Legacy
[2026.07.02-15.26.48:202][ 0]LogD3D12RHI: Chosen Barrier Implementation: D3D12LegacyBarriers
[2026.07.02-15.26.48:202][ 0]LogD3D12RHI: D3D12 ray tracing tier 1.1 and bindless resources are supported.
[2026.07.02-15.26.48:202][ 0]LogD3D12RHI: Mesh shader tier 1.0 is supported
[2026.07.02-15.26.48:202][ 0]LogD3D12RHI: AtomicInt64OnTypedResource is supported
[2026.07.02-15.26.48:202][ 0]LogD3D12RHI: AtomicInt64OnGroupShared is supported
[2026.07.02-15.26.48:202][ 0]LogD3D12RHI: AtomicInt64OnDescriptorHeapResource is supported
[2026.07.02-15.26.48:202][ 0]LogD3D12RHI: Shader Model 6.6 atomic64 is supported
[2026.07.02-15.26.48:202][ 0]LogD3D12RHI: Work Graphs are supported
[2026.07.02-15.26.48:202][ 0]LogD3D12RHI: Bindless is enabled (Configuration=RayTracing). Initializing allocators with 32768 Resource and 2048 Sampler descriptors
[2026.07.02-15.26.48:282][ 0]LogD3D12RHI: [GPUBreadCrumb] Successfully setup breadcrumb resource for DiagnosticBuffer (Queue: 0x000002280F235380)
[2026.07.02-15.26.48:283][ 0]LogD3D12RHI: [GPUBreadCrumb] Successfully setup breadcrumb resource for DiagnosticBuffer (Queue: 0x000002280F235640)
[2026.07.02-15.26.48:283][ 0]LogD3D12RHI: [GPUBreadCrumb] Successfully setup breadcrumb resource for DiagnosticBuffer (Queue: 0x000002280F235900)
[2026.07.02-15.26.48:283][ 0]LogD3D12RHI: Display: Not using pipeline state disk cache per r.D3D12.PSO.DiskCache=0
[2026.07.02-15.26.48:283][ 0]LogD3D12RHI: Display: Not using driver-optimized pipeline state disk cache per r.D3D12.PSO.DriverOptimizedDiskCache=0
[2026.07.02-15.26.48:401][ 0]LogD3D12RHI: NVIDIA Shader Execution Reordering NOT supported!
[2026.07.02-15.26.48:401][ 0]LogD3D12RHI: NVIDIA Ray Tracing Cluster Operations supported and enabled
[2026.07.02-15.26.48:401][ 0]LogD3D12RHI: NVIDIA Extended ray tracing pipeline state applied.
[2026.07.02-15.26.48:401][ 0]LogRHI: Texture pool is 9705 MB (70% of 13864 MB)
[2026.07.02-15.26.48:401][ 0]LogD3D12RHI: Async texture creation enabled
[2026.07.02-15.26.48:401][ 0]LogD3D12RHI: RHI has support for 64 bit atomics
[2026.07.02-15.26.48:421][ 0]LogVRS: Current RHI supports per-draw and screenspace Variable Rate Shading
[2026.07.02-15.26.48:424][ 0]LogCsvProfiler: Display: Metadata set : verbatimrhiname="D3D12"
[2026.07.02-15.26.48:424][ 0]LogCsvProfiler: Display: Metadata set : rhiname="D3D12"
[2026.07.02-15.26.48:424][ 0]LogCsvProfiler: Display: Metadata set : rhifeaturelevel="SM6"
[2026.07.02-15.26.48:424][ 0]LogCsvProfiler: Display: Metadata set : shaderplatform="PCD3D_SM6"
[2026.07.02-15.26.48:424][ 0]LogInit: Initializing FReadOnlyCVARCache
[2026.07.02-15.26.48:428][ 0]LogTurnkeySupport: Running Turnkey SDK detection: ' -ScriptsForProject="C:/ASTERION/GIT/PS_ReplaySystem/PS_Replay/PS_Replay.uproject" Turnkey -utf8output -WaitForUATMutex -command=VerifySdk -ReportFilename="C:/ASTERION/GIT/PS_ReplaySystem/PS_Replay/Intermediate/TurnkeyReport_0.log" -log="C:/ASTERION/GIT/PS_ReplaySystem/PS_Replay/Intermediate/TurnkeyLog_0.log" -project="C:/ASTERION/GIT/PS_ReplaySystem/PS_Replay/PS_Replay.uproject" -platform=all'
[2026.07.02-15.26.48:428][ 0]LogMonitoredProcess: Running Serialized UAT: [ cmd.exe /c ""C:/Program Files/Epic Games/UE_5.7/Engine/Build/BatchFiles/RunUAT.bat" -ScriptsForProject="C:/ASTERION/GIT/PS_ReplaySystem/PS_Replay/PS_Replay.uproject" Turnkey -utf8output -WaitForUATMutex -command=VerifySdk -ReportFilename="C:/ASTERION/GIT/PS_ReplaySystem/PS_Replay/Intermediate/TurnkeyReport_0.log" -log="C:/ASTERION/GIT/PS_ReplaySystem/PS_Replay/Intermediate/TurnkeyLog_0.log" -project="C:/ASTERION/GIT/PS_ReplaySystem/PS_Replay/PS_Replay.uproject" -platform=all" ]
[2026.07.02-15.26.48:443][ 0]LogTextureFormatASTC: Display: ASTCEnc version 5.0.1 library loaded
[2026.07.02-15.26.48:443][ 0]LogTextureFormatManager: Display: Loaded Base TextureFormat: TextureFormatASTC
[2026.07.02-15.26.48:443][ 0]LogTextureFormatManager: Display: Loaded Base TextureFormat: TextureFormatDXT
[2026.07.02-15.26.48:443][ 0]LogTextureFormatManager: Display: Loaded Base TextureFormat: TextureFormatETC2
[2026.07.02-15.26.48:443][ 0]LogTextureFormatManager: Display: Loaded Base TextureFormat: TextureFormatIntelISPCTexComp
[2026.07.02-15.26.48:443][ 0]LogTextureFormatManager: Display: Loaded Base TextureFormat: TextureFormatUncompressed
[2026.07.02-15.26.48:443][ 0]LogTextureFormatOodle: Display: Oodle Texture TFO init; latest sdk version = 2.9.14
[2026.07.02-15.26.48:443][ 0]LogTextureFormatOodle: Display: Oodle Texture loading DLL: oo2tex_win64_2.9.14.dll
[2026.07.02-15.26.48:444][ 0]LogTextureFormatOodle: Display: Oodle Texture loading DLL: oo2tex_win64_2.9.5.dll
[2026.07.02-15.26.48:444][ 0]LogTextureFormatManager: Display: Loaded Base TextureFormat: TextureFormatOodle
[2026.07.02-15.26.48:480][ 0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'Android'
[2026.07.02-15.26.48:480][ 0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'Android_ASTC'
[2026.07.02-15.26.48:480][ 0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'Android_DXT'
[2026.07.02-15.26.48:480][ 0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'Android_ETC2'
[2026.07.02-15.26.48:480][ 0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'Android_OpenXR'
[2026.07.02-15.26.48:480][ 0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'AndroidClient'
[2026.07.02-15.26.48:480][ 0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'Android_ASTCClient'
[2026.07.02-15.26.48:480][ 0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'Android_DXTClient'
[2026.07.02-15.26.48:480][ 0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'Android_ETC2Client'
[2026.07.02-15.26.48:480][ 0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'Android_OpenXRClient'
[2026.07.02-15.26.48:480][ 0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'Android_Multi'
[2026.07.02-15.26.48:480][ 0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'Android_MultiClient'
[2026.07.02-15.26.48:503][ 0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'IOS'
[2026.07.02-15.26.48:503][ 0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'IOSClient'
[2026.07.02-15.26.48:527][ 0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'Linux'
[2026.07.02-15.26.48:527][ 0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'LinuxEditor'
[2026.07.02-15.26.48:527][ 0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'LinuxServer'
[2026.07.02-15.26.48:527][ 0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'LinuxClient'
[2026.07.02-15.26.48:549][ 0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'Mac'
[2026.07.02-15.26.48:549][ 0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'MacEditor'
[2026.07.02-15.26.48:549][ 0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'MacServer'
[2026.07.02-15.26.48:549][ 0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'MacClient'
[2026.07.02-15.26.48:570][ 0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'TVOS'
[2026.07.02-15.26.48:570][ 0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'TVOSClient'
[2026.07.02-15.26.48:592][ 0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'Windows'
[2026.07.02-15.26.48:592][ 0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'WindowsEditor'
[2026.07.02-15.26.48:592][ 0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'WindowsServer'
[2026.07.02-15.26.48:592][ 0]LogTargetPlatformManager: Display: Loaded TargetPlatform 'WindowsClient'
[2026.07.02-15.26.48:592][ 0]LogTargetPlatformManager: Display: Building Assets For WindowsEditor
[2026.07.02-15.26.48:636][ 0]LogTargetPlatformManager: Unable to find shader format SF_METAL_ES3_1_IOS from hinted modules, loading all potential format modules to find it
[2026.07.02-15.26.48:644][ 0]LogTargetPlatformManager: Loaded format module MetalShaderFormat
[2026.07.02-15.26.48:644][ 0]LogTargetPlatformManager: SF_METAL_ES3_1_IOS
[2026.07.02-15.26.48:644][ 0]LogTargetPlatformManager: SF_METAL_SM5_IOS
[2026.07.02-15.26.48:644][ 0]LogTargetPlatformManager: SF_METAL_ES3_1_TVOS
[2026.07.02-15.26.48:644][ 0]LogTargetPlatformManager: SF_METAL_SM5_TVOS
[2026.07.02-15.26.48:644][ 0]LogTargetPlatformManager: SF_METAL_SM5
[2026.07.02-15.26.48:644][ 0]LogTargetPlatformManager: SF_METAL_SM6
[2026.07.02-15.26.48:644][ 0]LogTargetPlatformManager: SF_METAL_SIM
[2026.07.02-15.26.48:644][ 0]LogTargetPlatformManager: SF_METAL_ES3_1
[2026.07.02-15.26.48:644][ 0]LogTargetPlatformManager: Loaded format module ShaderFormatD3D
[2026.07.02-15.26.48:644][ 0]LogTargetPlatformManager: PCD3D_SM6
[2026.07.02-15.26.48:644][ 0]LogTargetPlatformManager: PCD3D_SM5
[2026.07.02-15.26.48:644][ 0]LogTargetPlatformManager: PCD3D_ES31
[2026.07.02-15.26.48:644][ 0]LogTargetPlatformManager: Loaded format module ShaderFormatOpenGL
[2026.07.02-15.26.48:644][ 0]LogTargetPlatformManager: GLSL_150_ES31
[2026.07.02-15.26.48:644][ 0]LogTargetPlatformManager: GLSL_ES3_1_ANDROID
[2026.07.02-15.26.48:644][ 0]LogTargetPlatformManager: Loaded format module ShaderFormatVectorVM
[2026.07.02-15.26.48:644][ 0]LogTargetPlatformManager: VVM_1_0
[2026.07.02-15.26.48:644][ 0]LogTargetPlatformManager: Loaded format module VulkanShaderFormat
[2026.07.02-15.26.48:644][ 0]LogTargetPlatformManager: SF_VULKAN_SM5
[2026.07.02-15.26.48:644][ 0]LogTargetPlatformManager: SF_VULKAN_ES31_ANDROID
[2026.07.02-15.26.48:644][ 0]LogTargetPlatformManager: SF_VULKAN_ES31
[2026.07.02-15.26.48:644][ 0]LogTargetPlatformManager: SF_VULKAN_SM5_ANDROID
[2026.07.02-15.26.48:644][ 0]LogTargetPlatformManager: SF_VULKAN_SM6
[2026.07.02-15.26.48:644][ 0]LogRendererCore: Ray tracing is enabled (dynamic). Reason: r.RayTracing=1 and r.RayTracing.EnableOnDemand=1.
[2026.07.02-15.26.48:644][ 0]LogRendererCore: Ray tracing shaders are enabled.
[2026.07.02-15.26.48:647][ 0]LogDerivedDataCache: Display: Memory: Max Cache Size: -1 MB
[2026.07.02-15.26.48:647][ 0]LogDerivedDataCache: FDerivedDataBackendGraph: Pak pak cache file ../../../../../../ASTERION/GIT/PS_ReplaySystem/PS_Replay/DerivedDataCache/DDC.ddp not found, will not use a pak cache.
[2026.07.02-15.26.48:647][ 0]LogDerivedDataCache: Unable to find inner node Pak for hierarchy Hierarchy.
[2026.07.02-15.26.48:647][ 0]LogDerivedDataCache: FDerivedDataBackendGraph: CompressedPak pak cache file ../../../../../../ASTERION/GIT/PS_ReplaySystem/PS_Replay/DerivedDataCache/Compressed.ddp not found, will not use a pak cache.
[2026.07.02-15.26.48:647][ 0]LogDerivedDataCache: Unable to find inner node CompressedPak for hierarchy Hierarchy.
[2026.07.02-15.26.48:998][ 0]LogDerivedDataCache: Display: ../../../Engine/DerivedDataCache/Compressed.ddp: Opened pak cache for reading. (1729 MiB)
[2026.07.02-15.26.48:998][ 0]LogDerivedDataCache: FDerivedDataBackendGraph: EnterprisePak pak cache file ../../../Enterprise/DerivedDataCache/Compressed.ddp not found, will not use a pak cache.
[2026.07.02-15.26.48:998][ 0]LogDerivedDataCache: Unable to find inner node EnterprisePak for hierarchy Hierarchy.
[2026.07.02-15.26.48:998][ 0]LogZenServiceInstance: Found registry key GlobalDataCachePath UE-LocalDataCachePath=C:/TEMP/UE_DDC
[2026.07.02-15.26.48:998][ 0]LogZenServiceInstance: Found registry key GlobalDataCachePath UE-LocalDataCachePath=C:/TEMP/UE_DDC
[2026.07.02-15.26.48:998][ 0]LogZenServiceInstance: Found local data cache path=C:/TEMP/UE_DDC
[2026.07.02-15.26.48:999][ 0]LogZenServiceInstance: Display: Launching zen utility 'C:/Program Files/Epic Games/UE_5.7/Engine/Binaries/Win64/zen.exe service status'.
[2026.07.02-15.26.49:153][ 0]LogZenServiceInstance: Display: Launching zen utility 'C:/Program Files/Epic Games/UE_5.7/Engine/Binaries/Win64/zen.exe service status'.
[2026.07.02-15.26.49:359][ 0]LogZenServiceInstance: Display: Read zen version cache file from 'C:/Users/j_foucher/AppData/Local/UnrealEngine/5.7/Saved/Zen/zen.version', version: '5.7.6-202510061608-windows-x64-release-9a1ebb9'
[2026.07.02-15.26.49:359][ 0]LogZenServiceInstance: InTree version at 'C:/Program Files/Epic Games/UE_5.7/Engine/Binaries/Win64/zenserver.exe' is '5.7.6-202510061608-windows-x64-release-9a1ebb9'
[2026.07.02-15.26.49:359][ 0]LogZenServiceInstance: Display: Read zen version cache file from 'C:/Users/j_foucher/AppData/Local/UnrealEngine/Common/Zen/Install/zen.version', version: '5.8.13-202605190912-windows-x64-release-094f62c2'
[2026.07.02-15.26.49:359][ 0]LogZenServiceInstance: Installed version at 'C:/Users/j_foucher/AppData/Local/UnrealEngine/Common/Zen/Install/zenserver.exe' is '5.8.13-202605190912-windows-x64-release-094f62c2'
[2026.07.02-15.26.49:359][ 0]LogZenServiceInstance: Display: Installed service at 'C:/Users/j_foucher/AppData/Local/UnrealEngine/Common/Zen/Install/zenserver.exe' is up to date
[2026.07.02-15.26.49:360][ 0]LogZenServiceInstance: No current process using the data dir found, launching a new instance
[2026.07.02-15.26.49:360][ 0]LogZenServiceInstance: Display: Launching executable 'C:/Users/j_foucher/AppData/Local/UnrealEngine/Common/Zen/Install/zenserver.exe', working dir 'C:/Users/j_foucher/AppData/Local/UnrealEngine/Common/Zen/Install', data dir 'C:/TEMP/UE_DDC/Zen', args '--port 8558 --data-dir C:\TEMP\UE_DDC\Zen --http asio --gc-cache-duration-seconds 1209600 --gc-interval-seconds 21600 --gc-low-diskspace-threshold 2147483648 --cache-bucket-limit-overwrites --quiet --http-forceloopback --owner-pid 65908 --child-id Zen_65908_Startup'
[2026.07.02-15.26.49:667][ 0]LogZenServiceInstance: Display: Unreal Zen Storage Server HTTP service at http://[::1]:8558 status: OK!.
[2026.07.02-15.26.49:667][ 0]LogZenServiceInstance: Local ZenServer AutoLaunch initialization completed in 0.309 seconds
[2026.07.02-15.26.49:671][ 0]LogDerivedDataCache: Display: ZenLocal: Using ZenServer HTTP service at [::1] with namespace ue.ddc status: OK!.
[2026.07.02-15.26.49:671][ 0]LogDerivedDataCache: Local: Found registry key GlobalDataCachePath UE-LocalDataCachePath=C:/TEMP/UE_DDC
[2026.07.02-15.26.49:684][ 0]LogDerivedDataCache: C:/TEMP/UE_DDC: Speed tests took 0.01 seconds.
[2026.07.02-15.26.49:684][ 0]LogDerivedDataCache: Display: C:/TEMP/UE_DDC: Performance: Latency=0.03ms. RandomReadSpeed=745.60MBs, RandomWriteSpeed=83.60MBs. Assigned SpeedClass 'Local'
[2026.07.02-15.26.49:685][ 0]LogDerivedDataCache: Local: Using data cache path C:/TEMP/UE_DDC: DeleteOnly
[2026.07.02-15.26.49:685][ 0]LogDerivedDataCache: ZenShared: Disabled because Host is set to 'None'
[2026.07.02-15.26.49:685][ 0]LogDerivedDataCache: Unable to find inner node ZenShared for hierarchy Hierarchy.
[2026.07.02-15.26.49:686][ 0]LogDerivedDataCache: Shared: Disabled because no path is configured.
[2026.07.02-15.26.49:686][ 0]LogDerivedDataCache: Unable to find inner node Shared for hierarchy Hierarchy.
[2026.07.02-15.26.49:686][ 0]LogDerivedDataCache: Cloud: Disabled because Host is set to 'None'
[2026.07.02-15.26.49:686][ 0]LogDerivedDataCache: Unable to find inner node Cloud for hierarchy Hierarchy.
[2026.07.02-15.26.49:687][ 0]LogShaderCompilers: Guid format shader working directory is -7 characters bigger than the processId version (../../../../../../ASTERION/GIT/PS_ReplaySystem/PS_Replay/Intermediate/Shaders/WorkingDirectory/65908/).
[2026.07.02-15.26.49:687][ 0]LogShaderCompilers: Cleaned the shader compiler working directory 'C:/Users/j_foucher/AppData/Local/Temp/UnrealShaderWorkingDir/6C1F154C4299414049C699AC100A95B8/'.
[2026.07.02-15.26.49:688][ 0]LogXGEController: Cannot use XGE Controller as Incredibuild is not installed on this machine.
[2026.07.02-15.26.49:688][ 0]LogUbaHorde: Display: UBA/Horde Configuration [Uba.Provider.Horde]: Not Enabled
[2026.07.02-15.26.49:688][ 0]LogShaderCompilers: Display: No distributed shader compiler controller found
[2026.07.02-15.26.49:688][ 0]LogShaderCompilers: Display: Using 10 local workers for shader compilation
[2026.07.02-15.26.49:691][ 0]LogShaderCompilers: Display: Compiling shader autogen file: ../../../../../../ASTERION/GIT/PS_ReplaySystem/PS_Replay/Intermediate/ShaderAutogen/PCD3D_SM6/AutogenShaderHeaders.ush
[2026.07.02-15.26.49:691][ 0]LogShaderCompilers: Display: Failed to delete old shader autogen file: ../../../../../../ASTERION/GIT/PS_ReplaySystem/PS_Replay/Intermediate/ShaderAutogen/PCD3D_SM6/AutogenShaderHeaders.ush
[2026.07.02-15.26.49:692][ 0]LogTurnkeySupport: Completed SDK detection: ExitCode = 0
[2026.07.02-15.26.49:692][ 0]LogShaderCompilers: Display: Shader autogen file written: ../../../../../../ASTERION/GIT/PS_ReplaySystem/PS_Replay/Intermediate/ShaderAutogen/PCD3D_SM6/AutogenShaderHeaders.ush
[2026.07.02-15.26.52:775][ 0]LogSlate: Using FreeType 2.10.0
[2026.07.02-15.26.52:775][ 0]LogSlate: SlateFontServices - WITH_FREETYPE: 1, WITH_HARFBUZZ: 1
[2026.07.02-15.26.52:790][ 0]LogStreaming: Warning: Failed to read file '../../../Engine/Platforms/VisionOS/Content/Editor/Slate/Launcher/Platform_VisionOS_24x.png' error.
[2026.07.02-15.26.52:790][ 0]LogSlate: Could not load file for Slate resource: [../../../Engine/Platforms/VisionOS/Content/Editor/Slate/Launcher/Platform_VisionOS_24x.png] file: [../../../Engine/Platforms/VisionOS/Content/Editor/Slate/Launcher/Platform_VisionOS_24x.png]
[2026.07.02-15.26.52:790][ 0]LogStreaming: Warning: Failed to read file '../../../Engine/Platforms/VisionOS/Content/Editor/Slate/Launcher/Platform_VisionOS_128x.png' error.
[2026.07.02-15.26.52:790][ 0]LogSlate: Could not load file for Slate resource: [../../../Engine/Platforms/VisionOS/Content/Editor/Slate/Launcher/Platform_VisionOS_128x.png] file: [../../../Engine/Platforms/VisionOS/Content/Editor/Slate/Launcher/Platform_VisionOS_128x.png]
[2026.07.02-15.26.52:824][ 0]LogAssetRegistry: FAssetRegistry took 0.0046 seconds to start up
[2026.07.02-15.26.52:827][ 0]LogEditorDomain: Display: EditorDomain is Disabled
[2026.07.02-15.26.52:917][ 0]LogAssetRegistry: Display: AssetDataGatherer spent 0.000s loading caches ../../../../../../ASTERION/GIT/PS_ReplaySystem/PS_Replay/Intermediate/CachedAssetRegistry_*.bin.
[2026.07.02-15.26.53:337][ 0]LogDeviceProfileManager: Display: Deviceprofile LinuxArm64Editor not found.
[2026.07.02-15.26.53:337][ 0]LogDeviceProfileManager: Display: Deviceprofile LinuxArm64 not found.
[2026.07.02-15.26.53:421][ 0]LogDeviceProfileManager: Active device profile: [00000228F31E1E00][00000228F3212800 82] WindowsEditor
[2026.07.02-15.26.53:421][ 0]LogCsvProfiler: Display: Metadata set : deviceprofile="WindowsEditor"
[2026.07.02-15.26.53:428][ 0]LogStreaming: Display: FlushAsyncLoading(1): 1 QueuedPackages, 0 AsyncPackages
[2026.07.02-15.26.53:430][ 0]LogTextureEncodingSettings: Display: Texture Encode Speed: FinalIfAvailable (editor).
[2026.07.02-15.26.53:430][ 0]LogTextureEncodingSettings: Display: Oodle Texture Encode Speed settings: Fast: RDO Off Lambda=0, Effort=Normal Final: RDO Off Lambda=0, Effort=Normal
[2026.07.02-15.26.53:430][ 0]LogTextureEncodingSettings: Display: Shared linear texture encoding: Disabled
[2026.07.02-15.26.53:446][ 0]LogTurnkeySupport: Turnkey Platform: Android: (Status=Valid, MinAllowed_Sdk=r27c, MaxAllowed_Sdk=r28c, Current_Sdk=r27c, Allowed_AutoSdk=r27c, Current_AutoSdk=, Flags="InstalledSdk_ValidVersionExists, Support_FullSdk, Sdk_HasBestVersion")
[2026.07.02-15.26.53:446][ 0]LogTurnkeySupport: Turnkey Platform: Win64: (Status=Valid, MinAllowed_Sdk=10.0.19041.0, MaxAllowed_Sdk=10.9.99999.0, Current_Sdk=10.0.22621.0, Allowed_AutoSdk=10.0.22621.0, Current_AutoSdk=, Flags="InstalledSdk_ValidVersionExists, Sdk_HasBestVersion")
[2026.07.02-15.26.53:448][ 0]LogTurnkeySupport: Running Turnkey device detection: ' -ScriptsForProject="C:/ASTERION/GIT/PS_ReplaySystem/PS_Replay/PS_Replay.uproject" Turnkey -utf8output -WaitForUATMutex -command=VerifySdk -ReportFilename="C:/ASTERION/GIT/PS_ReplaySystem/PS_Replay/Intermediate/TurnkeyReport_1.log" -log="C:/ASTERION/GIT/PS_ReplaySystem/PS_Replay/Intermediate/TurnkeyLog_1.log" -project="C:/ASTERION/GIT/PS_ReplaySystem/PS_Replay/PS_Replay.uproject" -Device=Win64@ASTERION_VR_01'
[2026.07.02-15.26.53:448][ 0]LogMonitoredProcess: Running Serialized UAT: [ cmd.exe /c ""C:/Program Files/Epic Games/UE_5.7/Engine/Build/BatchFiles/RunUAT.bat" -ScriptsForProject="C:/ASTERION/GIT/PS_ReplaySystem/PS_Replay/PS_Replay.uproject" Turnkey -utf8output -WaitForUATMutex -command=VerifySdk -ReportFilename="C:/ASTERION/GIT/PS_ReplaySystem/PS_Replay/Intermediate/TurnkeyReport_1.log" -log="C:/ASTERION/GIT/PS_ReplaySystem/PS_Replay/Intermediate/TurnkeyLog_1.log" -project="C:/ASTERION/GIT/PS_ReplaySystem/PS_Replay/PS_Replay.uproject" -Device=Win64@ASTERION_VR_01" -nocompile -nocompileuat ]
[2026.07.02-15.26.53:498][ 0]LogStreaming: Display: Flushing package /Engine/Functions/Engine_MaterialFunctions01/Shading/PowerToRoughness (state: WaitingForIo) recursively from another package /Engine/EngineMaterials/DefaultTextMaterialOpaque (state: CreateLinkerLoadExports) will result in a partially loaded package to avoid a deadlock.
[2026.07.02-15.26.53:498][ 0]LogStreaming: Display: Package /Engine/EngineMaterials/DefaultTextMaterialOpaque is adding a dynamic import to package /Engine/Functions/Engine_MaterialFunctions01/Shading/PowerToRoughness because of a recursive sync load
[2026.07.02-15.26.53:499][ 0]LogStreaming: Display: Flushing package /Engine/Functions/Engine_MaterialFunctions01/Shading/PowerToRoughness (state: DeferredPostLoad) recursively from another package /Engine/EngineMaterials/DefaultTextMaterialOpaque (state: CreateLinkerLoadExports) will result in a partially loaded package to avoid a deadlock.
[2026.07.02-15.26.53:499][ 0]LogStreaming: Display: Flushing package /Engine/Functions/Engine_MaterialFunctions01/Shading/ConvertFromDiffSpec (state: WaitingForIo) recursively from another package /Engine/EngineMaterials/DefaultTextMaterialOpaque (state: CreateLinkerLoadExports) will result in a partially loaded package to avoid a deadlock.
[2026.07.02-15.26.53:501][ 0]LogStreaming: Display: Package /Engine/EngineMaterials/DefaultTextMaterialOpaque is adding a dynamic import to package /Engine/Functions/Engine_MaterialFunctions01/Shading/ConvertFromDiffSpec because of a recursive sync load
[2026.07.02-15.26.53:501][ 0]LogStreaming: Display: Flushing package /Engine/Functions/Engine_MaterialFunctions01/Shading/ConvertFromDiffSpec (state: DeferredPostLoad) recursively from another package /Engine/EngineMaterials/DefaultTextMaterialOpaque (state: CreateLinkerLoadExports) will result in a partially loaded package to avoid a deadlock.
[2026.07.02-15.26.53:502][ 0]LogStreaming: Display: Flushing package /Engine/EngineMaterials/WorldGridMaterial (state: WaitingForIo) recursively from another package /Engine/EngineMaterials/DefaultTextMaterialOpaque (state: CreateLinkerLoadExports) will result in a partially loaded package to avoid a deadlock.
[2026.07.02-15.26.53:508][ 0]LogStreaming: Display: Flushing package /Engine/EngineMaterials/DefaultDeferredDecalMaterial (state: WaitingForIo) recursively from another package /Engine/EngineMaterials/WorldGridMaterial (state: CreateLinkerLoadExports) will result in a partially loaded package to avoid a deadlock.
[2026.07.02-15.26.53:510][ 0]LogStreaming: Display: Flushing package /Engine/EngineMaterials/DefaultLightFunctionMaterial (state: WaitingForIo) recursively from another package /Engine/EngineMaterials/DefaultDeferredDecalMaterial (state: CreateLinkerLoadExports) will result in a partially loaded package to avoid a deadlock.
[2026.07.02-15.26.53:511][ 0]LogStreaming: Display: Flushing package /Engine/EngineMaterials/DefaultPostProcessMaterial (state: WaitingForIo) recursively from another package /Engine/EngineMaterials/DefaultLightFunctionMaterial (state: CreateLinkerLoadExports) will result in a partially loaded package to avoid a deadlock.
[2026.07.02-15.26.53:515][ 0]LogStreaming: Display: Package /Engine/EngineMaterials/DefaultLightFunctionMaterial is adding a dynamic import to package /Engine/EngineMaterials/DefaultPostProcessMaterial because of a recursive sync load
[2026.07.02-15.26.53:515][ 0]LogStreaming: Display: Flushing package /Engine/EngineMaterials/DefaultPostProcessMaterial (state: DeferredPostLoad) recursively from another package /Engine/EngineMaterials/DefaultLightFunctionMaterial (state: CreateLinkerLoadExports) will result in a partially loaded package to avoid a deadlock.
[2026.07.02-15.27.08:258][ 0]LogTurnkeySupport: Completed device detection: Code = 0

View File

@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8" ?>
<Configuration xmlns="https://www.unrealengine.com/BuildConfiguration">
</Configuration>

View File

@@ -0,0 +1,15 @@
// Copyright Epic Games, Inc. All Rights Reserved.
using UnrealBuildTool;
using System.Collections.Generic;
public class PS_ReplayTarget : TargetRules
{
public PS_ReplayTarget(TargetInfo Target) : base(Target)
{
Type = TargetType.Game;
DefaultBuildSettings = BuildSettingsVersion.V6;
IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_7;
ExtraModuleNames.Add("PS_Replay");
}
}

View File

@@ -0,0 +1,23 @@
// Copyright Epic Games, Inc. All Rights Reserved.
using UnrealBuildTool;
public class PS_Replay : ModuleRules
{
public PS_Replay(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "EnhancedInput" });
PrivateDependencyModuleNames.AddRange(new string[] { });
// Uncomment if you are using Slate UI
// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
// Uncomment if you are using online features
// PrivateDependencyModuleNames.Add("OnlineSubsystem");
// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
}
}

View File

@@ -0,0 +1,6 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#include "PS_Replay.h"
#include "Modules/ModuleManager.h"
IMPLEMENT_PRIMARY_GAME_MODULE( FDefaultGameModuleImpl, PS_Replay, "PS_Replay" );

View File

@@ -0,0 +1,6 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"

View File

@@ -0,0 +1,15 @@
// Copyright Epic Games, Inc. All Rights Reserved.
using UnrealBuildTool;
using System.Collections.Generic;
public class PS_ReplayEditorTarget : TargetRules
{
public PS_ReplayEditorTarget( TargetInfo Target) : base(Target)
{
Type = TargetType.Editor;
DefaultBuildSettings = BuildSettingsVersion.V6;
IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_7;
ExtraModuleNames.Add("PS_Replay");
}
}