API Reference

Types are in the CrimsonLoadingScreen runtime module unless noted. BP (pure) = pure Blueprint node; BP = Blueprint-callable with exec pins; C++ only = no Blueprint node.

UCrimsonLoadingScreenManager

UGameInstanceSubsystem + FTickableGameObject. Never creates on dedicated servers. Obtain: Blueprint uses the subsystem getter node (search Crimson Loading Screen Manager); C++ uses static UCrimsonLoadingScreenManager* Get(const UObject* WorldContextObject) (C++ only).

MemberAccessDescription
GetCurrentTip() / GetCurrentTipCategory()BP (pure)Tip FText / FGameplayTag picked for this load; empty/invalid without a TipsCollection
GetCurrentBackground()BP (pure)UMaterialInterface* picked for this load; null without a BackgroundCollection
GetShowcaseRenderTarget()BP (pure)The configured render target; null unless `bUseLivePreview` is on AND a host has declared `SetShowcaseLive(true)`
SetShowcaseLive(bool)BPDeclared by the showcase host while its capture is actively writing the render target; gates the getter above
IsShowcaseLive()BP (pure)True while a showcase host has declared itself live
OnShowcaseLiveChanged / On Showcase Live ChangedDelegate (native + BP)(bool bLive) - fires on every actual change. The built-in showcase goes live several frames after the widget is built (the stage level streams in first), so widgets re-run their content pass on this rather than only at construct time.
OnShowcaseRosterChanged / On Showcase Roster ChangedDelegate (native + BP)(const TArray<FCrimsonLoadingCharacterInfo>& Roster) - fires when a new companion is registered or a companion is removed while the screen is up. Never fires while the screen is hidden.
GetCachedShowcaseRoster()BP (pure)const TArray<FCrimsonLoadingCharacterInfo>& - what this load is presenting: the registered primary at index 0, then companions in registration order. Empty when nothing is registered or the showcase is suppressed. A snapshot, safe while the pawns are gone.
ClearCachedCharacterInfo()BPRetracts the registered primary and every companion, so the next loading screen shows its normal presentation. Call on a character switch or when leaving a session.
UpdateCachedCharacterInfo(CharacterInfo)BPRegisters the local player's character - the showcase primary, roster index 0, and the only way character data reaches the showcase. Lives on the game instance, so it survives every travel. Invalid descriptions are ignored. Never rebuilds a screen that is already up.
AddShowcaseCompanion(CompanionId, CharacterInfo)BPRegisters a second, third, ... character under a key you own. Re-adding an id replaces that look in place; a None id or invalid info is ignored. A new id registered while the screen is up rebuilds the roster and fires OnShowcaseRosterChanged.
RemoveShowcaseCompanion(CompanionId)BPDrops one companion registration. Unknown ids are ignored.
ClearShowcaseCompanions()BPDrops every companion registration, leaving the primary.
SetNextLoadPresentation(Presentation, bPersistAcrossLoads)BPPer-load overrides (suppress showcase, background/widget/tip category); one-shot unless persistent
ClearLoadPresentation()BPDrop any active presentation overrides
GetLoadPresentation()BP (pure)The FCrimsonLoadingPresentation the current/next screen will use
GetLoadingScreenDisplayStatus()BP (pure)True while the widget is on the viewport
GetDebugReasonForShowingOrHidingLoadingScreen()BP (pure)Human-readable current show/hide reason
OnLoadingScreenVisibilityChangedC++ only (native multicast)(bool bIsVisible) - fires on show (before widget creation) and hide
OnLoadingScreenContentReadyC++ only (native multicast)(const TArray<FCrimsonLoadingCharacterInfo>& Roster) - fires just before the screen becomes visible, after the cinematic actors are notified
On Loading Screen Visibility Changed (OnLoadingScreenVisibilityChangedBP)BP (assignable)Blueprint mirror of the native visibility delegate
On Loading Screen Content Ready (OnLoadingScreenContentReadyBP)BP (assignable)Blueprint mirror of the native content-ready delegate
RegisterLoadingProcessor / UnregisterLoadingProcessorC++ onlyAdd/remove an external ICrimsonLoadingProcessInterface vote (stored weakly)
GetShaderPrecompileState()BlueprintPureECrimsonShaderPrecompileState. Reveal shader UI only on Precompiling.
GetShaderPrecompileProgress()BlueprintPure0..1. Advisory - the bar can stall below 1.0; completion is delegate-driven.
GetShaderPrecompilePSOsRemaining()BlueprintPureOutstanding PSOs. Clamped to a minimum of 1 by the engine while precompiling.
GetShaderPrecompilePSOsTotal()BlueprintPureBatch size. Estimated if the precompile began before the plugin module loaded.
IsBlockingOnShaderPrecompile()BlueprintPureTrue while the shader gate specifically is holding the screen.
RequestBlockUntilShaderPrecompileComplete()BlueprintCallableHold until the batch finishes. Only meaningful in BackgroundThenBlockOnPlay; no-op once complete.
OnShaderPrecompileProgress / ...BPDelegate(float Progress, int32 Remaining, int32 Total). Fires when the outstanding count changes.
OnShaderPrecompileComplete / ...BPDelegateFires once when the batch finishes.

UCrimsonLoadingScreenSettings

UDeveloperSettings (Config=Game, DefaultConfig): Project Settings -> Crimson -> Crimson Loading Screen, persisted to DefaultGame.ini under [/Script/CrimsonLoadingScreen.CrimsonLoadingScreenSettings]. Not Blueprint-exposed - runtime values surface through the manager getters. C++: GetDefault<UCrimsonLoadingScreenSettings>().

PropertySectionTypeDefaultNotes
LoadingScreenWidgetDisplayFSoftClassPath (UUserWidget)emptyFalls back to SThrobber + error log when unset/unloadable
LoadingScreenZOrderDisplayint3210000Viewport Z-order of the widget
HoldLoadingScreenAdditionalSecsTimingfloat (s)2.0Seeds the hold CVar at startup; console/cmdline CVar set overrides; skipped in editor unless the Debugging toggle is on
LoadingScreenHeartbeatHangDurationTimingfloat (s)0.0Non-zero = hang detector fires after this much continuous visibility; 0 = off
LogLoadingScreenHeartbeatIntervalTimingfloat (s)5.0Seconds between 'still showing because...' log lines; 0 = off
TipsCollectionTipsTSoftObjectPtr<UCrimsonLoadingTipsCollection>nullNull = no tip text
bPickNewTipEachLoadTipsbooltruefalse = one tip per session
TipCategoryFilterTipsFGameplayTagemptyWhen set, only matching-Category tips are candidates
BackgroundCollectionBackgroundsTSoftObjectPtr<UCrimsonLoadingBackgroundCollection>nullNull = no background
bPickNewBackgroundEachLoadBackgroundsbooltruefalse = one background per session
bUseLivePreviewCinematic PreviewboolfalseMaster switch for the showcase. Keeps world rendering ON during loads so the capture keeps updating; unlocks the fields below.
ShowcaseRenderTargetCinematic PreviewTSoftObjectPtr<UTextureRenderTarget2D>nullEditCondition: bUseLivePreview. Its size sets the preview's aspect ratio, which the automatic framing fits the characters to.
ShowcaseStageLevelCinematic PreviewTSoftObjectPtr<UWorld>nullOptional level streamed into the pocket world as the set. Unset = the built-in studio stage in an empty world, which is also the fallback when the level cannot be used. Plain non-World-Partition maps only.
ShowcaseStageClassCinematic PreviewTSoftClassPtr<ACrimsonShowcaseStage>ACrimsonShowcaseStageStage spawned when the stage level does not place one itself. Subclass it to change the built-in lighting, framing or formation defaults.
MaxShowcaseCharactersCinematic Previewint328Most characters presented at once; the primary is always first. Clamped to a minimum of 1.
ShowcaseStageLoadTimeoutSecsCinematic Previewfloat (s)10.0How long to wait for ShowcaseStageLevel to become visible before falling back to the built-in studio stage. Minimum 0.5.
bForceTickLoadingScreenEvenInEditorDebuggingbooltrueForce one Slate tick on show in PIE so the widget appears immediately
bHoldLoadingScreenAdditionalSecsEvenInEditorDebuggingbool (Transient)falseApply the hold delay in PIE; not saved to config
bEnableShaderPrecompileGateShader PrecompilationbooltrueMaster switch for all PSO precompile handling.
ShaderPrecompileGateModeShader PrecompilationECrimsonShaderPrecompileGateModeBlockUntilCompleteWhether and when a precompile holds the screen.
ShaderPrecompileGraceSecsShader Precompilationfloat2.0Hold silently this long before revealing shader UI.
MaxShaderPrecompileBlockSecsShader Precompilationfloat0.0Hard cap on the hold; 0 means none. Backstop only.
bRunShaderPrecompileGateInEditorShader PrecompilationboolfalseEditor never opens a bundled cache; use SimulateSecs instead.
bHoldForRuntimePSOPrecacheRuntime PSO PrecacheboolfalseDrain outstanding precache requests before the screen hides.
RuntimePSOPrecacheMinPriorityRuntime PSO PrecacheECrimsonPSOPrecacheWaitPriorityHighAndAboveFeeds r.PSOPrecaching.MinPriorityForActivePrecacheRequests.
RuntimePSOPrecacheThresholdRuntime PSO Precacheint320Outstanding requests tolerated before hiding.
MaxRuntimePSOPrecacheWaitSecsRuntime PSO Precachefloat10.0Cap on the drain. Not optional.

Hold votes

TypeKindDescription
ICrimsonLoadingProcessInterfaceUInterfaceC++ only to implement (plain virtual ShouldShowLoadingScreen(FString& OutReason)). Auto-polled on GameState, local PlayerControllers, and all their components; other objects register via the manager. Static helper ShouldShowLoadingScreen(UObject*, FString&) tests any object.
UCrimsonLoadingProcessTaskUObject + the interfaceBP: CreateLoadingScreenProcessTask(WorldContextObject, Reason) (static factory - keep the returned reference in a variable!), Unregister(), SetShowLoadingScreenReason(Reason). Held weakly by the manager: dropping every reference lets GC release the hold automatically.

Tips & backgrounds

TypeKindDescription
FCrimsonLoadingTipStruct (BlueprintType)Text (FText), Category (FGameplayTag), Weight (float, min 0.01, default 1.0). All read-only in BP.
UCrimsonLoadingTipsCollectionUDataAssetTips array. BP: GetRandomTip(CategoryFilter, OutTip) - weighted random, category-filtered, returns false when nothing matches.
UCrimsonLoadingBackgroundCollectionUDataAssetBackgrounds - TArray<TSoftObjectPtr<UMaterialInterface>>, loaded on demand per pick.

Cinematic preview

TypeKindDescription
ICrimsonLoadingCharacterProviderUInterface (BP-implementable)GetLoadingCharacterInfo(OutInfo) -> bool - BlueprintNativeEvent. Implement on the object that owns the authoritative appearance data (usually an equipment or appearance component on the pawn) and have the caller register the result. The manager does not search for implementors.
ICrimsonLoadingCinematicInterfaceUInterface (BP-implementable)OnLoadingScreenStarted(const TArray<FCrimsonLoadingCharacterInfo>& Roster) / OnLoadingScreenEnded() - BlueprintNativeEvents; sent to every actor in the current world on show/hide. A director that writes the render target itself must call SetShowcaseLive(true) from the started event, which makes the built-in showcase stand down.
FCrimsonLoadingCharacterInfoStruct (BlueprintType)MeshComponents, AdditionalActors - both readable and writable in BP. C++-only helpers: IsValid() (a leader with a mesh exists), GetLeaderComponent().
FCrimsonLoadingMeshComponentStruct (BlueprintType)SlotName, Mesh (null = empty slot), Materials, AnimInstanceClass (leader only), bIsLeader, RelativeTransform. All BP-writable.
FCrimsonLoadingActorEntryStruct (BlueprintType)ActorTypeTag, Mesh (skeletal), StaticMesh (static - the usual case for equipment visuals; a valid entry sets exactly one of the two), Materials, AnimInstanceClass, AttachSocketName (None = free placement), RelativeTransform. All BP-writable. C++-only IsValid() (true when either mesh is set).
FCrimsonLoadingShowcaseCompanionStruct (BlueprintType)One companion registration: CompanionId (your key; None is rejected) and Info. Both BP-writable. You rarely build one by hand - AddShowcaseCompanion takes the two fields.
UCrimsonShowcaseSubsystemUGameInstanceSubsystemThe built-in showcase host. Creates the pocket world, streams ShowcaseStageLevel, resolves or spawns the stage, ticks and captures at 30 Hz, and tears it all down on hide. Never creates on a dedicated server. BP (pure): IsShowcaseActive(). Everything else is internal - it is driven by the manager's delegates, not called.
ACrimsonShowcaseStageAActor (Blueprintable)The set. BP: ApplyRoster(Roster), ClearShowcase(), SetRenderTarget(RenderTarget), CaptureFrame(), SetStudioSetupEnabled(bEnabled). Editable defaults: TurntableSpeed (18), CameraDistance (800), CameraHeight (120), LookAtHeight (95), CameraFOV (32), FramingPadding (1.15), FormationLateralStep (75), FormationRowDepth (120), FormationFrontRowInset (30), FormationArcDepthPerStep (8), FormationYawPerStep (3), bStudioSetupEnabled (true).
ACrimsonShowcaseSlotAActor (Blueprintable)A standing mark in a stage level. SlotIndex (0 is the primary) plus a transform and an editor-only facing arrow. Used only when the level holds at least as many slots as characters.
ACrimsonShowcaseCameraACameraActor (Blueprintable)An authored shot in a stage level. CharacterCount (the exact head count; 0 = any count) and bAutoFit (keep the angle and lens, dolly to fit). The chosen camera hands the capture its field of view and post-process settings.

Per-load presentation

TypeKindDescription
FCrimsonLoadingPresentationStruct (BlueprintType)bSuppressShowcase (bool), BackgroundOverride (TSoftObjectPtr<UMaterialInterface>), WidgetOverride (TSoftClassPtr<UUserWidget>), TipCategoryOverride (FGameplayTag). All BP-writable; every field optional - unset keeps project-settings behavior. Applied via SetNextLoadPresentation; a one-shot presentation is cleared when the screen it styled hides.

Console variables & flags

NameDefaultDescription
CrimsonLoadingScreen.HoldLoadingScreenAdditionalSecsseeded from the Project Setting (2.0)Post-load hold in seconds; console/cmdline set overrides the setting
CrimsonLoadingScreen.LogLoadingScreenReasonEveryFramefalsePrint the show/hide reason every frame - first tool for a stuck screen
CrimsonLoadingScreen.AlwaysShowfalsePin the screen up for widget iteration
CrimsonLoadingScreen.Showcase.DebugCompanions0Duplicate the registered primary this many times into the roster at show time, so slot placement and framing can be tested with one player. Clamped by MaxShowcaseCharacters. Pair with AlwaysShow 1.
-NoLoadingScreen (command line)-Suppress the loading screen entirely; non-shipping builds only
CrimsonLoadingScreen.ShaderPrecompile.Disable0Disable all PSO precompile handling, overriding project settings.
CrimsonLoadingScreen.ShaderPrecompile.LogProgress0Log precompile progress whenever the outstanding count changes.
CrimsonLoadingScreen.ShaderPrecompile.SimulateSecs0Simulate an N-second precompile so the UI can be authored in PIE. Self-clearing.

Editor tooling & logging

ItemDescription
Log category LogCrimsonLoadingScreenAll manager and showcase activity: show/hide reasons, widget load errors, visible-duration summaries, roster registrations, stage-level streaming and its fallbacks, and pocket-world creation and teardown.
Cook hookCrimsonLoadingScreenEditor adds ShowcaseStageLevel's package to the cook through FGameDelegates::GetModifyCookDelegate(), so the setting stays folder-agnostic - a soft path in a settings ini is otherwise invisible to the cooker. It also logs a warning at editor startup when the setting points at a package that is not on disk.

Shader precompilation types

TypeKindDescription
ECrimsonShaderPrecompileStateUENUMIdle / Warming / Precompiling / Complete. Warming is inside the grace period - show nothing.
ECrimsonShaderPrecompileGateModeUENUMBlockUntilComplete / BackgroundThenBlockOnPlay / NeverBlock.
ECrimsonPSOPrecacheWaitPriorityUENUMAll / MediumAndAbove / HighAndAbove / HighestOnly.
FCrimsonShaderPrecompileMonitorPrivate classModule-owned observer of FShaderPipelineCache. Not public API; reach it via the manager.

Modules

ModuleTypeNotes
CrimsonLoadingScreenRuntimeEverything above except the editor tooling. Public deps: Core, CoreUObject, Engine, GameplayTags - Engine is public because the showcase actors derive from AActor and ACameraActor in public headers.
CrimsonLoadingScreenEditorEditorThe cook hook that adds ShowcaseStageLevel's package to the cook, and the startup warning when that package is missing. Never ships in packaged builds.