RLS Studios
ProjectsPatreonCommunityDocsAbout
Join Patreon
BeamNG Modding Docs

Guides

Reference

server/commands - Camera & Input Commandsge_utils - Game Engine Utility Functionsmain.lua - GE Lua Entry Point & Game Loopmap.lua - Navigation Graph (AI Road Map)screenshot.lua - Screenshot Systemserver/server - Level Loading & Game ServerserverConnection - Client-Server Connection Manager`setSpawnpoint` - Default Spawn Point Persistence`simTimeAuthority` - Simulation Time & Bullet Time Control`spawn` - Vehicle Spawning & Safe Placement`suspensionFrequencyTester` - Suspension Natural Frequency Analysis
ui/ambientSound - Ambient Sound Stream PlayerUI Apps ManagerUI AudioBindings LegendCamera Distance AppConsole (consoleNG)Credits MusicExternal App (WebSocket UI Server)Fade ScreenGame BlurGameplay App ContainersGrid SelectorLivery EditorMessages DebuggerMessages/Tasks App ContainersMission InfoPolice InfoTop BarUI ModsUI Navigation / MapVehicle Paint EditorVehicle Vicinity AppUI Visibility

UI

Resources

BeamNG Game Engine Lua Cheat SheetGE Developer RecipesMCP Server Setup

// RLS.STUDIOS=true

Premium Mods for BeamNG.drive. Career systems, custom vehicles, and immersive gameplay experiences.

Index

HomeProjectsPatreon

Socials

DiscordPatreon (RLS)Patreon (Vehicles)

© 2026 RLS Studios. All rights reserved.

Modding since 2024

API ReferenceGE Extensionsui

Fade Screen

Screen fade transition system - fade to/from black with optional loading screen content.

Screen fade transition system - fade to/from black with optional loading screen content.


Overview

ui_fadeScreen provides fade-to-black and fade-from-black transitions used during level loading, mission starts, and scene changes. It communicates with the UI via LoadingScreen guihook and manages global audio fading.

Extension path: lua/ge/extensions/ui/fadeScreen.lua


Exports (M)

FunctionSignatureDescription
fadeToBlack / start(fade?, screenData?, args?)Fades to black over fade seconds. Shows optional screen content.
fadeFromBlack / stop(fade?, args?)Fades from black over fade seconds.
fadeSequence / cycle(fadeIn?, pause?, fadeOut?, screenData?, args?)Full fade cycle: in → pause → out.
onScreenFadeStateDelayed(state)Receives UI fade state callbacks with frame delay.
onGuiUpdate()Processes delayed fade state transitions.

Internals

Fade To Black

local function fadeToBlack(fade, screenData, args)
  fade = fade or 1
  guihooks.trigger("LoadingScreen", {
    active = true,
    custom = {
      fadeIn = fade,
      pause = -1,        -- infinite pause (stays black)
      fadeOut = 0,
      data = screenData  -- optional {image, title, text}
    }
  })
  -- Audio fade
  SFXSystem.setGlobalParameter("g_FadeTimeMS", fade * 1000)
  SFXSystem.setGlobalParameter("g_GameLoading", 1)
end

Fade From Black

local function fadeFromBlack(fade, args)
  fade = fade or 1
  guihooks.trigger("LoadingScreen", {
    active = false,
    custom = { fadeOut = fade }
  })
  SFXSystem.setGlobalParameter("g_FadeTimeMS", fade * 1000)
  SFXSystem.setGlobalParameter("g_GameLoading", 0)
end

Fade Sequence

A full cycle (fade in → pause → fade out):

ui_fadeScreen.cycle(1, 2, 1, {title = "Loading..."})
-- Fades to black in 1s, pauses 2s, fades back in 1s

The pause phase triggers onScreenFadeState(1) → delayed callback → onScreenFadeState(2) → auto-calls fadeFromBlack.

Frame Delay

State transitions are delayed by delayFrames (default 3) to ensure the screen is fully black before proceeding:

local function onGuiUpdate()
  if delayedData[1] then
    if delayCounter <= 0 then
      for _, state in ipairs(delayedData) do
        extensions.hook("onScreenFadeState", state)
      end
    end
    delayCounter = delayCounter - 1
  end
end

Audio Integration

Both fadeToBlack and fadeFromBlack control global audio:

  • g_FadeTimeMS - Fade duration in milliseconds
  • g_GameLoading - 1 = mute during fade, 0 = unmute

Can be disabled with args.useGlobalAudioFade = false.

Headless Mode

In headless mode, fade states are triggered immediately without UI:

if headless_mode then
  extensions.hook("onScreenFadeState", 1)
end

onScreenFadeState Hook

Other extensions can listen for fade state changes by implementing onScreenFadeState in their own module (this is a hook, not an export of fadeScreen):

StateMeaningTriggered By
1Fading to black (animation started)fadeToBlack() (headless) or UI callback
2Fully black (screen hidden)UI callback via onScreenFadeStateDelayed (3-frame delay)
3Fading from black (animation started)fadeFromBlack() (headless) or UI callback
-- Usage in your extension:
local function onScreenFadeState(state)
  if state == 2 then
    -- Screen is fully black - safe to do visual changes
    -- (teleport, swap vehicles, change scene)
    doHiddenWork()
  end
end
M.onScreenFadeState = onScreenFadeState

Real-world examples from source:

  • career/modules/inventory.lua - Swaps vehicles while screen is black
  • core/recoveryPrompt.lua - Teleports vehicle during recovery
  • ui/vehicleSelector/vehicleOperations.lua - Spawns/changes vehicles

How It Works

  1. System calls fadeToBlack(1) to start a 1-second fade
  2. UI receives LoadingScreen guihook and renders the fade overlay
  3. When fully black, UI triggers onScreenFadeStateDelayed(2) callback
  4. After 3 frame delay, onScreenFadeState(2) hook fires for gameplay code
  5. For sequences, fadeFromBlack is auto-called after the pause phase

Additional Exports

The following exports are available but not yet documented in detail:

  • M.cycle
  • M.delayFrames
  • M.fadeFromBlack
  • M.fadeSequence
  • M.fadeToBlack
  • M.onGuiUpdate
  • M.onScreenFadeStateDelayed
  • M.start
  • M.stop

External App (WebSocket UI Server)

Serves the BeamNG UI over a local WebSocket server for external device access.

Game Blur

Screen blur rectangle system - manages groups of blur regions rendered each frame via the `ScreenBlurFX` post-effect.

On this page

OverviewExports (M)InternalsFade To BlackFade From BlackFade SequenceFrame DelayAudio IntegrationHeadless ModeonScreenFadeState HookHow It WorksAdditional Exports