How-To: Live Render Target Preview

Goal: replace the static background with the live character showcase - the registered characters rendered in 3D, captured into a render target, displayed as the widget's background.

The plugin hosts the scene for you. UCrimsonShowcaseSubsystem creates its own small world (a pocket world) when the loading screen appears and destroys it when the screen hides, so the showcase survives every travel type - a non-seamless map load, a client joining a server, a return to the main menu. You do not build a showcase level, you do not set a transition map, and you do not need seamless travel.

Prerequisites
Quick Start is done, and you can reach the manager (How-To: Get the Building Blocks step 1). You also need a character registered - How-To: Showcase the Player's Character - or there is nothing for the showcase to render and the widget correctly keeps its background material.

1. Create the render target

Content Browser right-click -> Materials & Textures... -> Render Target. Name it RT_Showcase and set its size (1920x1080 is plenty). Its aspect ratio is a framing decision: the showcase derives the vertical field of view from it and fits the characters to that frame.

Verify
The asset exists and opens in the texture editor. It is black - nothing writes it yet.

2. Enable live preview in Project Settings

In Project Settings -> Crimson -> Crimson Loading Screen -> Cinematic Preview, tick Use Live Preview and set Showcase Render Target to RT_Showcase (the field only unlocks once the checkbox is on). Those two settings are the entire requirement.

Project Settings -> Crimson -> Crimson Loading Screen -> Cinematic Preview: Use Live Preview ticked, Showcase Render Target = RT_Showcase.
Live preview keeps the world rendering
Normally the manager disables world rendering during loading to give the GPU to streaming. With bUseLivePreview on, world rendering stays enabled so the capture keeps updating - which costs GPU during loads. Keep the showcase scene lightweight.
Verify
The two settings persist under [/Script/CrimsonLoadingScreen.CrimsonLoadingScreenSettings] in DefaultGame.ini. (Get Showcase Render Target still returns null at this point - see step 3.)

3. Understand when the target goes live

Get Showcase Render Target returns null until a showcase host calls Set Showcase Live (true), in addition to bUseLivePreview and the assigned asset. Without that gate, a load with no running capture would show a stale or black frame instead of falling back to the background material.

The built-in showcase makes that call itself - but not immediately. It bootstraps its pocket world, streams the optional stage level in asynchronously, resolves or spawns the stage, applies the roster, captures one frame, and only then declares itself live. That lands a few frames after the widget was built, which is why the manager fires On Showcase Live Changed on every actual change: a widget that reads the target once in Construct gets null and never looks again.

Manager memberWhat it tells you
Get Showcase Render TargetThe target to display, or null when nothing is writing it
Is Showcase LiveTrue while a host is actively capturing
On Showcase Live ChangedFires with the new value every time that flips - bind this
Set Showcase Live (bLive)Called by the host. You only call it when you write the target yourself (see step 5)
Verify
Force a screen with CrimsonLoadingScreen.AlwaysShow 1 while a character is registered: the log prints Showcase live: true, then Showcase: pocket world active with N character(s) on the built-in studio stage.

4. Display the render target in the widget

Make one base material M_ShowcaseBackground: a Texture Sample Parameter 2D named RenderTarget into Emissive Color, Material Domain = User Interface. The widget wraps it in a dynamic instance and plugs in the live target - falling back to the background material whenever the showcase is not live. Apply it from a handler bound to On Showcase Live Changed so both directions are covered.

Event On Initialized -> Get CrimsonLoadingScreenManager -> Bind Event to On Showcase Live Changed -> a Custom Event with a bool bLive input that calls your Apply Background function (call it from Event Construct too, for the case where the showcase is already live).

Apply Background: Get Showcase Render Target -> Is Valid (Branch). Valid: Create Dynamic Material Instance (Parent = M_ShowcaseBackground) -> Set Texture Parameter Value (Parameter Name = RenderTarget, Value = the render target) -> Set Brush from Material on BackgroundImage. Not valid: Get Current Background -> Set Brush from Material.

Cross-fade here
Because the handler runs in both directions, it is the natural place to fade between the material background and the live stage rather than cutting.
Verify
Travel between maps with a character registered: the loading screen shows the character lit by the built-in studio rig against a black background, slowly turning on the turntable. With nothing registered you get the background material instead - both are correct outcomes.

5. Write the target yourself instead (optional)

ICrimsonLoadingCinematicInterface is the hook for presenting the roster your own way - a Sequencer flyover, a bespoke capture rig, a purely 2D treatment. Implement it on an actor that already exists in the world when the screen opens; the manager notifies implementors through an actor iterator over the current world.

A director that writes the showcase render target itself must call Set Showcase Live (true) from On Loading Screen Started. That notification runs before the built-in showcase activates, and the pocket world stands down when it finds the target already claimed - which is what keeps two writers off one render target. A director that stays silent is overwritten by the built-in showcase.

In your director Blueprint: Class Settings -> Interfaces -> Add -> Crimson Loading Cinematic Interface. Implement Event On Loading Screen Started (it hands you a Roster array of Crimson Loading Character Info) -> start your capture -> Get CrimsonLoadingScreenManager -> Set Showcase Live (bLive = true). Event On Loading Screen Ended -> stop the capture -> Set Showcase Live (bLive = false).

A director must already exist in the world
On Loading Screen Started is sent to actors in the world that is current when the screen opens. An actor in a level that loads later never receives it. This is one of the reasons the built-in showcase uses a pocket world instead: it has no world-lifetime problem to work around.
Verify
The log prints Showcase: a custom director already owns the render target - the pocket world stays off. and Is Showcase Live is true while your capture runs.

See also

  • How-To: Showcase the Player's Character - describe and register the character the showcase renders.
  • How-To: Author a Stage Level - replace the black void with a set you built.
  • How-To: Show Multiple Characters - put a whole roster on the screen.
  • Concept: The Cinematic Preview Pipeline - how the pieces talk to each other and when.