| Automatic show/hide | UCrimsonLoadingScreenManager | Game-instance subsystem; evaluates 18 conditions every frame and manages the widget - no manual calls |
| Project settings | UCrimsonLoadingScreenSettings | Widget class, hold delay, tips, backgrounds, live preview - Project Settings -> Crimson -> Crimson Loading Screen |
| Hold votes | ICrimsonLoadingProcessInterface, UCrimsonLoadingProcessTask | Game code keeps the screen up until it is really ready (data replication, async loads) |
| Tips | UCrimsonLoadingTipsCollection, FCrimsonLoadingTip | Weighted random tip per load, optionally filtered by a FGameplayTag category |
| Backgrounds | UCrimsonLoadingBackgroundCollection | Random UMaterialInterface background per load (soft references, loaded on demand) |
| Character showcase | ICrimsonLoadingCharacterProvider, FCrimsonLoadingCharacterInfo | Your game describes a character's meshes, materials and anim class; the plugin renders it |
| Showcase host | UCrimsonShowcaseSubsystem, ACrimsonShowcaseStage | The plugin's own pocket world renders the characters and captures them - survives non-seamless loads and client joins, with no transition map and no seamless travel |
| Stage level | ACrimsonShowcaseSlot, ACrimsonShowcaseCamera, ShowcaseStageLevel | Author your own set as an ordinary level: standing marks per character and camera shots per head count. Unset = a built-in studio stage in an empty world. |
| Custom director | ICrimsonLoadingCinematicInterface | Optional. Present the roster your own way - a Sequencer flyover, a bespoke rig - by claiming the render target before the built-in host activates. |
| Character registration | UpdateCachedCharacterInfo, AddShowcaseCompanion, GetCachedShowcaseRoster | Register the local player and any companions. The only source the showcase has, and it outlives travel - so loads with no reachable pawn still showcase. Nothing registered means the normal loading screen. |
| Live preview | bUseLivePreview + GetShowcaseRenderTarget() + OnShowcaseLiveChanged | The capture's render target becomes the widget background - world rendering stays on, and the widget is told when the capture actually starts and stops |
| Per-load presentation | FCrimsonLoadingPresentation, SetNextLoadPresentation | One-shot overrides for a specific load: suppress the showcase, force a background or widget class, filter tips |
| Events | Native delegates + Blueprint-assignable mirrors | React to visibility changes and content-ready from Blueprint or C++ |
| Input + performance | FLoadingScreenInputPreProcessor, performance hooks | Input eaten in packaged builds; shader cache to Fast batch mode, world rendering off, hitch detector suspended |
| Debug tooling | CVars, -NoLoadingScreen, GetDebugReasonForShowingOrHidingLoadingScreen | Force the screen on, log the show reason every frame or on a heartbeat, read the current reason from Blueprint or C++ |
| Shader precompile progress | ECrimsonShaderPrecompileState | Optional. Holds the screen while Unreal precompiles bundled PSOs after a game or driver update, with an "Optimizing shaders NN%" bar |