Load Level with Loading Screen error GetShadowIndex() == 0

Hello everyone. I have a C++ function in MyGameInstance that loads a level then shows a UMG loading screen using MoviePlayer. It works, but shows an error in the logs:

Error Log
LogOutputDevice: Error: === Handled ensure: ===

LogOutputDevice: Error:

LogOutputDevice: Error: Ensure condition failed: GetShadowIndex() == 0 [File:D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Public\HAL\IConsoleManager.h] [Line: 1610]

LogOutputDevice: Error:

LogOutputDevice: Error: Stack:

LogOutputDevice: Error: [Callstack] 0x00007ffd11b115f8 UnrealEditor-UMG.dll!UUserWidget::NativeTick() [D:\build\++UE5\Sync\Engine\Source\Runtime\UMG\Private\UserWidget.cpp:1854]

LogOutputDevice: Error: [Callstack] 0x00007ffd11b34596 UnrealEditor-UMG.dll!SObjectWidget::Tick() [D:\build\++UE5\Sync\Engine\Source\Runtime\UMG\Private\Slate\SObjectWidget.cpp:126]

LogOutputDevice: Error: [Callstack] 0x00007ffd1690b3b1 UnrealEditor-SlateCore.dll!SWidget::Paint() [D:\build\++UE5\Sync\Engine\Source\Runtime\SlateCore\Private\Widgets\SWidget.cpp:1445]

LogOutputDevice: Error: [Callstack] 0x00007ffd168d58af UnrealEditor-SlateCore.dll!SCompoundWidget::OnPaint() [D:\build\++UE5\Sync\Engine\Source\Runtime\SlateCore\Private\Widgets\SCompoundWidget.cpp:46]

LogOutputDevice: Error: [Callstack] 0x00007ffd1582b37b UnrealEditor-Slate.dll!SBorder::OnPaint() [D:\build\++UE5\Sync\Engine\Source\Runtime\Slate\Private\Widgets\Layout\SBorder.cpp:131]

LogOutputDevice: Error: [Callstack] 0x00007ffd1690bf1c UnrealEditor-SlateCore.dll!SWidget::Paint() [D:\build\++UE5\Sync\Engine\Source\Runtime\SlateCore\Private\Widgets\SWidget.cpp:1579]

LogOutputDevice: Error: [Callstack] 0x00007ffd168d7858 UnrealEditor-SlateCore.dll!SPanel::PaintArrangedChildren() [D:\build\++UE5\Sync\Engine\Source\Runtime\SlateCore\Private\Widgets\SPanel.cpp:34]

LogOutputDevice: Error: [Callstack] 0x00007ffd168d64da UnrealEditor-SlateCore.dll!SPanel::OnPaint() [D:\build\++UE5\Sync\Engine\Source\Runtime\SlateCore\Private\Widgets\SPanel.cpp:15]

LogOutputDevice: Error: [Callstack] 0x00007ffd1690bf1c UnrealEditor-SlateCore.dll!SWidget::Paint() [D:\build\++UE5\Sync\Engine\Source\Runtime\SlateCore\Private\Widgets\SWidget.cpp:1579]

LogOutputDevice: Error: [Callstack] 0x00007ffd168d637f UnrealEditor-SlateCore.dll!SOverlay::OnPaint() [D:\build\++UE5\Sync\Engine\Source\Runtime\SlateCore\Private\Widgets\SOverlay.cpp:209]

LogOutputDevice: Error: [Callstack] 0x00007ffd1690bf1c UnrealEditor-SlateCore.dll!SWidget::Paint() [D:\build\++UE5\Sync\Engine\Source\Runtime\SlateCore\Private\Widgets\SWidget.cpp:1579]

LogOutputDevice: Error: [Callstack] 0x00007ffd168d58af UnrealEditor-SlateCore.dll!SCompoundWidget::OnPaint() [D:\build\++UE5\Sync\Engine\Source\Runtime\SlateCore\Private\Widgets\SCompoundWidget.cpp:46]

LogOutputDevice: Error: [Callstack] 0x00007ffd1582b37b UnrealEditor-Slate.dll!SBorder::OnPaint() [D:\build\++UE5\Sync\Engine\Source\Runtime\Slate\Private\Widgets\Layout\SBorder.cpp:131]

LogOutputDevice: Error: [Callstack] 0x00007ffd1690bf1c UnrealEditor-SlateCore.dll!SWidget::Paint() [D:\build\++UE5\Sync\Engine\Source\Runtime\SlateCore\Private\Widgets\SWidget.cpp:1579]

LogOutputDevice: Error: [Callstack] 0x00007ffd168d7858 UnrealEditor-SlateCore.dll!SPanel::PaintArrangedChildren() [D:\build\++UE5\Sync\Engine\Source\Runtime\SlateCore\Private\Widgets\SPanel.cpp:34]

LogOutputDevice: Error: [Callstack] 0x00007ffd168d64da UnrealEditor-SlateCore.dll!SPanel::OnPaint() [D:\build\++UE5\Sync\Engine\Source\Runtime\SlateCore\Private\Widgets\SPanel.cpp:15]

LogOutputDevice: Error: [Callstack] 0x00007ffd1690bf1c UnrealEditor-SlateCore.dll!SWidget::Paint() [D:\build\++UE5\Sync\Engine\Source\Runtime\SlateCore\Private\Widgets\SWidget.cpp:1579]

LogOutputDevice: Error: [Callstack] 0x00007ffd168d637f UnrealEditor-SlateCore.dll!SOverlay::OnPaint() [D:\build\++UE5\Sync\Engine\Source\Runtime\SlateCore\Private\Widgets\SOverlay.cpp:209]

LogOutputDevice: Error: [Callstack] 0x00007ffd1690bf1c UnrealEditor-SlateCore.dll!SWidget::Paint() [D:\build\++UE5\Sync\Engine\Source\Runtime\SlateCore\Private\Widgets\SWidget.cpp:1579]

LogOutputDevice: Error: [Callstack] 0x00007ffd168d58af UnrealEditor-SlateCore.dll!SCompoundWidget::OnPaint() [D:\build\++UE5\Sync\Engine\Source\Runtime\SlateCore\Private\Widgets\SCompoundWidget.cpp:46]

LogOutputDevice: Error: [Callstack] 0x00007ffd158a6ce5 UnrealEditor-Slate.dll!SVirtualWindow::OnPaint() [D:\build\++UE5\Sync\Engine\Source\Runtime\Slate\Private\Widgets\SVirtualWindow.cpp:83]

LogOutputDevice: Error: [Callstack] 0x00007ffd1690bf1c UnrealEditor-SlateCore.dll!SWidget::Paint() [D:\build\++UE5\Sync\Engine\Source\Runtime\SlateCore\Private\Widgets\SWidget.cpp:1579]

LogOutputDevice: Error: [Callstack] 0x00007ffd3a6b53d9 UnrealEditor-MoviePlayer.dll!FMoviePlayerWidgetRenderer::DrawWindow() [D:\build\++UE5\Sync\Engine\Source\Runtime\MoviePlayer\Private\DefaultGameMoviePlayer.cpp:1026]

LogOutputDevice: Error: [Callstack] 0x00007ffd3a6c0c88 UnrealEditor-MoviePlayer.dll!FSlateLoadingSynchronizationMechanism::SlateThreadRunMainLoop() [D:\build\++UE5\Sync\Engine\Source\Runtime\MoviePlayer\Private\MoviePlayerThreading.cpp:170]

LogOutputDevice: Error: [Callstack] 0x00007ffd3a6bf4fc UnrealEditor-MoviePlayer.dll!FSlateLoadingThreadTask::Run() [D:\build\++UE5\Sync\Engine\Source\Runtime\MoviePlayer\Private\MoviePlayerThreading.cpp:211]

LogOutputDevice: Error: [Callstack] 0x00007ffd1bf3c0ad UnrealEditor-Core.dll!FRunnableThreadWin::Run() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Private\Windows\WindowsRunnableThread.cpp:159]

LogOutputDevice: Error: [Callstack] 0x00007ffd1bf335cf UnrealEditor-Core.dll!FRunnableThreadWin::GuardedRun() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Private\Windows\WindowsRunnableThread.cpp:79]

LogOutputDevice: Error: [Callstack] 0x00007ffd568a7374 KERNEL32.DLL!UnknownFunction []

LogOutputDevice: Error: [Callstack] 0x00007ffd5777cc91 ntdll.dll!UnknownFunction []

Here is the code:

MyGameInstance.h:

  1. This macro delays the execution of the program. Its purpose is to give time for texture streaming.
#define DELAY(time, block)\
	{\
		FTimerHandle TimerHandle;\
		GetWorld()->GetTimerManager().SetTimer(TimerHandle, [&]()block, time, false);\
	}
  1. This is the function that loads the level and shows UMG loading screen.
UFUNCTION(BlueprintCallable, meta = (WorldContext = WorldContextObject), Category = "Utility|LoadingScreen")
    void LoadLevelWithLoadingScreen(const UObject* WorldContextObject, FName LevelName, bool bAbsolute, FString LevelOptions, TSubclassOf<class UUserWidget> LoadingScreenWidget, bool bUseMovies, TArray<FString> StringPaths, bool bUseAudio, USoundBase* SoundFile, float VolumeMultiplier);
  1. This function runs when level is loaded:
void OnLevelLoaded(UWorld* InLoadedWorld);

MyGameInstance.cpp:

void UMyGameInstance::LoadLevelWithLoadingScreen(const UObject* WorldContextObject, FName LevelName, bool bAbsolute, FString LevelOptions, TSubclassOf<class UUserWidget> LoadingScreenWidget, bool bUseMovies, TArray<FString> StringPaths, bool bUseAudio, USoundBase* SoundFile, float VolumeMultiplier)
{
    if(!IsValid(WorldContextObject))
    {
        UE_LOG(LogTemp, Error, TEXT("WorldContext is not valid!"));
        return;
    }
    UE_LOG(LogTemp, Warning, TEXT("WorldContextObject is valid."));

    UWorld* World = WorldContextObject->GetWorld();
    if(!IsValid(World))
    {
        UE_LOG(LogTemp, Error, TEXT("GetWorld for World is not valid!"));
        return;
    }
    UE_LOG(LogTemp, Warning, TEXT("GetWorld is valid."));
    UE_LOG(LogTemp, Warning, TEXT("GetMapName: %s"), *World->GetMapName());

    FCoreUObjectDelegates::PostLoadMapWithWorld.AddUObject(this, &UMyGameInstance::OnLevelLoaded);
    UE_LOG(LogTemp, Warning, TEXT("PostLoadMapWithWorld delegate has passed!"));

    if(bUseAudio)
    {
        UGameplayStatics::SpawnSound2D(World, SoundFile, VolumeMultiplier, 1.0f, 0.0f, nullptr, true, false);
    }

    UGameplayStatics::OpenLevel(World, LevelName, bAbsolute, LevelOptions);

    if(!IsRunningDedicatedServer())
    {
        UE_LOG(LogTemp, Warning, TEXT("We are not a dedicated server."));
        UE_LOG(LogTemp, Warning, TEXT("GetMapName: %s"), *World->GetMapName());

        FLoadingScreenAttributes LoadingScreen;
        //LoadingScreen.bAllowEngineTick = true;
        LoadingScreen.bAutoCompleteWhenLoadingCompletes = false;
        LoadingScreen.bMoviesAreSkippable = false;

        if(bUseMovies)
        {
            LoadingScreen.MoviePaths = StringPaths;
        }
        else
        {
            UUserWidget* Widget = CreateWidget<UUserWidget>(World, LoadingScreenWidget);
            if(!IsValid(Widget))
            {
                UE_LOG(LogTemp, Error, TEXT("Widget to show in loading screen is not valid!"));
                return;
            }

            LoadingScreen.WidgetLoadingScreen = Widget->TakeWidget();

            GetMoviePlayer()->SetupLoadingScreen(LoadingScreen);
            UE_LOG(LogTemp, Warning, TEXT("Showing loading screen successfully."));
        }
    }
}

void UMyGameInstance::OnLevelLoaded(UWorld* InLoadedWorld)
{
    //this will trigger the code within the {} after a 2 second delay
    DELAY(2.0, 
    {
        if(GetMoviePlayer()->IsLoadingFinished())
        {
                GetMoviePlayer()->Shutdown();
        }
    })
}

Hi, did you find the solution for this issue?

Hello, unfortunately I have stopped working on this issue for now, leaving it for some time later. In the meantime, you can check a plug-in called “Async Loading Screen“ on the marketplace that serves the same purpose. It is open source so you can build on top of it as you see fit until we figure this out.

Sources: