Ideas needed for possible in-game recording options

#include "MyActorComponent.h"

UMyActorComponent::UMyActorComponent()
{
    this->MovieSceneCapture = CreateDefaultSubobject<UMovieSceneCapture>("MovieSceneCapture");

    if (!this->MovieSceneCapture)
    {
        UE_LOG(LogMyActorComponent, Fatal, TEXT("UMyActorComponent: MovieSceneCapture failed to be created"));
    }

    this->MovieSceneCapture->bUseSeparateProcess = true;

}

void UMyActorComponent::BeginPlay()
{
    Super::BeginPlay();

    this->InitializeSceneCapture();
}

void UMyActorComponent::EndPlay(const EEndPlayReason::Type EndPlayReason)
{
    if (this->MovieSceneCapture)
    {
        this->MovieSceneCapture->Finalize();
    }
    else
    {
        UE_LOG(LogMyActorComponent, Error, TEXT("EndPlay: MovieSceneCapture was invalid"));
    }

    Super::EndPlay(EndPlayReason);
}

void UMyActorComponent::InitializeSceneCaptureSettings()
{
    APlayerController* PlayerController = Cast<APlayerController>(this->GetOwner());

    if (!PlayerController)
    {
        UE_LOG(LogMyActorComponent, Error, TEXT("InitializeSceneCaptureSettings: Could not cast owner's controller to APlayerController"));

        return;
    }

    int32 ViewportSizeX = 0;
    int32 ViewportSizeY = 0;

    PlayerController->GetViewportSize(ViewportSizeX, ViewportSizeY);

    if (!this->MovieSceneCapture)
    {
        UE_LOG(LogMyActorComponent, Error, TEXT("InitializeSceneCaptureSettings: MovieSceneCapture was invalid"));

        return;
    }

    const TSharedPtr<IPlugin> Plugin = IPluginManager::Get().FindPlugin("MyPlugin");

    if (!Plugin)
    {
        UE_LOG(LogMyActorComponent, Error, TEXT("InitializeSceneCaptureSettings: Could not find plugin"));

        return;
    }

    FDirectoryPath PluginDirectoryPath = FDirectoryPath();
    PluginDirectoryPath.Path           = Plugin->GetContentDir();

    this->MovieSceneCapture->Settings.OutputDirectory          = PluginDirectoryPath;
    this->MovieSceneCapture->Settings.bOverwriteExisting       = false;
    this->MovieSceneCapture->Settings.bUseRelativeFrameNumbers = false;
    this->MovieSceneCapture->Settings.HandleFrames             = 60;
    this->MovieSceneCapture->Settings.bEnableTextureStreaming  = true;
    this->MovieSceneCapture->Settings.Resolution               = FCaptureResolution(ViewportSizeX, ViewportSizeY);
    this->MovieSceneCapture->Settings.bAllowMovement           = true;
    this->MovieSceneCapture->Settings.bAllowTurning            = true;
    this->MovieSceneCapture->Settings.bShowPlayer              = true;
    this->MovieSceneCapture->Settings.bShowHUD                 = true;
}

void UMyActorComponent::InitializeSceneCapture()
{
    const UWorld* World = this->GetWorld();

    if (!World)
    {
        UE_LOG(LogMyActorComponent, Error, TEXT("InitializeSceneCapture: World was invalid"));

        return;
    }

    UGameViewportClient* GameViewportClient = World->GetGameViewport();

    if (!GameViewportClient)
    {
        UE_LOG(LogMyActorComponent, Error, TEXT("InitializeSceneCapture: Unable to get GameViewport"));

        return;
    }

    TSharedPtr<SViewport> GameViewportWidget = GameViewportClient->GetGameViewportWidget();

    if (!GameViewportWidget)
    {
        UE_LOG(LogMyActorComponent, Error, TEXT("InitializeSceneCapture: Unable to get GameViewport widget"));

        return;
    }

    TSharedPtr<FSceneViewport> SceneViewportPtr = MakeShareable(new FSceneViewport(GameViewportClient, GameViewportWidget));

    if (!SceneViewportPtr)
    {
        UE_LOG(LogMyActorComponent, Error, TEXT("InitializeSceneCapture: Unable to create pointer to TSharedPtr<FSceneViewport>"));

        return;
    }

    if (!this->MovieSceneCapture)
    {
        UE_LOG(LogMyActorComponent, Error, TEXT("InitializeSceneCapture: MovieSceneCapture was invalid"));

        return;
    }

    this->InitializeSceneCaptureSettings();

    this->MovieSceneCapture->Initialize(SceneViewportPtr, 0);
    this->MovieSceneCapture->StartWarmup();
    this->MovieSceneCapture->StartCapture();
}
1 Like