Cockpit MFD displays, flight HUD and cockpit lighting/exposure in the gamespace UE 5.8 project - UCockpitDisplayComponent / USpaceCockpitDisplays render targets, MFD pages (F1/F2, space.MfdPage, CyclePage), centre column radar and self status, USpaceFlightHud (space.Hud, fonts in Content/UI/Fonts), cockpit key/fill lights, CockpitExposureBias, display readability (font >= 26). Load when changing or debugging anything drawn on cockpit screens or the HUD, cockpit lights/exposure, TSR ghosting/blur on displays, or when running test_cockpit_displays.py, test_cockpit_frame.py, test_flight_hud_sc1c.py or the Shots presets cockpit*, mfd_pages, hud, display_sharpness.
Install
npx skillscat add michaelkocandrle/gamespace/cockpit-displays Install via the SkillsCat registry.
Kokpit: displeje (MFD), letový HUD, světla a expozice
Týká se letového kokpitu s živými displeji (kód je obecný pro každou loď; dnes je má Wayfarer: skleněné
MFD a střední sloupek v kokpitu v2). Starý interiér Steadfastu má jen statické hologramové obrazovky
(Tools/Assets/draw_holo_screens.py, M_KitHolo). Postup WORKFLOW kap. 7, nástrahy 9.2 a)–i), 9.3 a);
historie v archivu Docs/HANDOFF.md (body 23–33, 72).
Soubory
| Co | Kde |
|---|---|
| Komponenta displejů (RT, stránky, světla displejů) | Source/gamespace/CockpitDisplayComponent.{h,cpp} |
HUD + widget displejů (USpaceFlightHud, podtřída USpaceCockpitDisplays) |
Source/gamespace/SpaceFlightHud.{h,cpp} |
Textový debug HUD, cvar space.Hud |
Source/gamespace/SpaceDebugHUD.cpp |
| Kokpitová kamera, světla, expozice, přiblížení | Source/gamespace/SpaceshipPawn.{h,cpp} |
Hodnoty lodi (světla, cockpit_displays, emissive obrazovek) |
ArtSource/Ships/<Loď>/<Loď>_setup.json |
| Písma | Content/UI/Fonts/ (Rajdhani-Medium/SemiBold, ShareTechMono-Regular + OFL licence), Custom/ |
| Vstup MFD | Content/Input/IA_MfdLeft, IA_MfdRight; přidává Tools/Assets/add_mfd_input.py |
| Testy | Tools/Tests/test_cockpit_displays.py, test_cockpit_frame.py (loď z Tools/Tests/ship_under_test.py; bez modelu SKIP), test_flight_hud_sc1c.py, test_flight_hud_sc3.py (značka dráhy letu) |
| Snímky | Tools/Shots/cockpit*.json, mfd_pages.json, hud.json, display_sharpness.json |
| Reference SC | Docs/UI/ (hlavně Screenshot 2026-09-17 201854.png), ArtSource/Reference/Mood/sc_cockpit_*.webp (lokálně) |
Jak displeje fungují
UCockpitDisplayComponentkreslí widgetUSpaceCockpitDisplayspřesFWidgetRendererdo render
targetu, ten jde jakoScreenTexturedo MID slotu*_Screens(MI_Ship_<Loď>_Screens, unlit,
masked, pixel animation). V editoru jsou obrazovky černé – obsah vznikne až za běhu.- Skleněné panely (Wayfarer, 25. 9. 2026):
M_Ship_Screenodděluje obsah od skla prahem jasu (GlassThreshold0,07,ContentRamp20). Svítící pixely jsou neprůhledné, prázdné sklo průhledné (GlassOpacity0 = čiré, >0 = dither blue noise). Dál má jemné řádky (ScanRows380 rad ≈ 60 řádků,ScanDepth0,06) a fresnelův lesk (SheenColor).- Panel stojí 2 cm (střed 1,5 cm) před deskou na čtyřech stojkách, s rámečkem 7 mm a světelnou hranou (
hs_cockpit.glass_panel). - Za sklem je matná deska
IntScreenBack(masterM_Ship_ScreenBack, pixel animation). - Průsvitný materiál ne: 19. 9. zdvojoval řádky, protože nemá hloubku ani velocity. Masked hloubku i velocity zapisuje a řazení s kabinou neřeší.
- Komponenta
Screensnevrhá stín (import_ship.py, hlídá test). Maskovaný materiál vrhá stín podle masky a slunce kreslilo písmena jako tmavou posunutou kopii na desku za sklem. Vypadalo to jako duch TSR nebo odraz. - Zvažovaný jeden široký střední panel (plátno 1330 × 490) nezaveden: dvojice MFD drží rozpočet písma a střed patří hologramu (krok 6).
- Panel stojí 2 cm (střed 1,5 cm) před deskou na čtyřech stojkách, s rámečkem 7 mm a světelnou hranou (
USpaceCockpitDisplaysje podtřídaUSpaceFlightHud: stejné názvy widgetů a stejnéApplyState.
Nový údaj tedy obvykle = stav vFSpaceFlightHudState(make_state) + widget vBuildTree.- Plátno 1330 × 490 px: vlevo FLIGHT 0–560, vpravo STATUS 560–1120, střední sloupek 1120–1330
(radar 0–259, self status 259–490). Každý displej má v receptutexture_rect/texture_size, stejná
hustota pixelů na cm skla všude. Otvory v rámu jsou v receptu jakocorners(nerect), plocha
sahá ~5 mm pod rámeček (grow_m), řez AI skla 6 mm (cut_depth_m). - Velikost RT = velikost displeje na obrazovce:
ScreenShareAt880,155 × šířka okna ×Oversample1,25.
Měřítko jen ze šířky okna (ne z FOV), přestavba jen při změně měřítka > 0,099 (9.2 c). - Dvě frekvence: stav (čísla)
StateRateHz– v setupucockpit_displays.state_rate_hz5
(C++ default je 12, platí setup); kresleníUpdateRateHz60. Během změny se čísla kvantují
(rychlost po 10 m/s, G po 0,5), přesná až v klidu (USpaceCockpitDisplays::Steady/SteadyState,
prahy 0,5 m/s a 0,05 G za aktualizaci). Důvod: TSR prolíná čísla měněná každý snímek (9.2 b). - Trvalé okno: kreslí se přes
FWidgetRenderer::DrawWindowdo jednohoDrawWindow, nikdyDrawWidgetkaždý snímek (9.2 g). Platí pro každý další widget kreslený do RT. - Světla displejů: Rect lighty na socketech
Display_*(3 cm před sklem), 8 cd
(display_light_intensity_cd), barva 0,4/0,75/1, dosahDisplayLightRadiusCm160. Malé displeje
svítí úměrně ploše (ScreenRect). Nestínují. - Kreslí se jen v pohledu z kokpitu. Displeje svítí i s vypnutým HUD (jsou součást lodi).
Stránky MFD
- Vlevo FLIGHT → THRUSTERS → NAVIGATION, vpravo STATUS → CONTACTS → SELF STATUS,
UWidgetSwitcher
(kreslí se jen zobrazená; po zrychlení FLIGHT/STATUS ~1,0 ms, ostatní 0,6–1,0 ms za snímek). - Klávesy: F1 levý, F2 pravý, Alt+F1/F2 zpět (Shift = boost, proto ne Shift).
[]jen pro US
klávesnici – na české klávesnici autora nejsou samostatné klávesy. Enginové debug bindy F1/F2
(wireframe/unlit) odebíráConfig/DefaultInput.ini(-DebugExecBindings). - Kód:
UCockpitDisplayComponent::CyclePage(Display, Direction),SetPage(Display, Page),USpaceCockpitDisplays::PageTitles,SetPages. Konzolespace.MfdPage <levý 0-2> <pravý 0-2>. - Nová stránka: titulek do
PageTitles, widgety do pole stránek vScreen(...)vBuildTree.
Jen se skutečnými daty – zbraně, štíty, energie, chlazení hra nemá a nic se nepředstírá
(proto chybí i tlačítka PWR/WPN/THR/SHLD/COOL; přijdou se SC-6). - Skryté řádky seznamů skrývej i s jejich linkou (řádek a linka v jednom boxu).
Střední sloupek (RADAR, SELF STATUS)
- RADAR
USpaceHudRadar: shora, nos nahoru, dosahRadarRangeM5 km (kruhy po třetinách), výseč FOV 88°.
Kontakty zUSpaceCockpitDisplays::MakeRadarContacts5×/s (pawny a static meshe s kolizí v dosahu,
max 24); tělesa jen jako písmeno na okraji a jen do 60° nad/pod rovinou křídel. - SELF STATUS
USpaceHudShipStatus: obrys z kolizních hullů lodi (obecné pro každou loď), motory ze
socketůEngine_*podle tahu, podvozek zGear_*(jantarově při pohybu), dole GEAR, tah %, LANDED. - Vypnout:
space.CockpitCentre 0. Snímky-Preset cockpit_centre; obrazovky jsou malé, vyřízni a zvětši
oblast ~745–855 × 630–880 px (1600 × 900).
Čitelnost (rozpočet písma)
- Z oka (~1,3–1,5 m od desky) je MFD na 1080p ~0,4 své velikosti v návrhu (560 px → ~230 px).
- Minimum písma 26 na MFD, 21 na malých displejích sloupku (RadarRange, RadarHeading, ShipGear,
ShipThrust), vše ≥ 16. Velká čísla: rychlost ≥ 96, G ≥ 56, režim ≥ 60. Hlídátest_cockpit_displays.py. - Obsah přidávej jen s tímto rozpočtem; detail patří do přiblížení: držet Z nebo prostřední tlačítko
myši (ASpaceshipPawn::SetDashboardFocus, konzolespace.DashboardFocus 1/0) – hlava 15 cm k desce,
~19° dolů, FOV ~44°, letový HUD se schová. Poloha ze socketůDisplay_*. - Text se nezalamuje ani neořezává. Přetečení (hodnota přes záložku stránky) uvidíš jen na snímku.
- RT nemá mipmapy: pod ~1600 px šířky okna může písmo zrnit (9.2 f).
Letový HUD
USpaceFlightHudcelý v C++ (bez widget Blueprintu). Rozložení změřené z SC při 1080p od středu,
paleta ledově azurová, Rajdhani Medium se slabým azurovým obrysem. Kreslené prvkyUSpaceHudSymbol,USpaceHudTape,USpaceHudLadder,USpaceHudGauge,USpaceHudLamp(+ radar/ship status pro displeje).space.Hud: 0 vypnuto, 1 jen letový HUD (výchozí), 2 + kompaktní text, 3 + plný debug text.
Klávesa H cykluje, menu nastavení to ukládá. Ve snímku pole"hud": 0–3.- HUD v kokpitu i zvenku stejný (záměr, jako SC hledí); podrobnosti nesou MFD.
- Značka dráhy letu (SC-3) se počítá v
USpaceFlightHud::ApplyViewz ohniskové délky, v jednotkách 1080p
plátna; testtest_flight_hud_sc3.py. - Čáry: všechny přes
SpaceHudStyle::PaintLinedo fronty, kořen (NativePaint) je vydá seřazené
podle vrstvy a tloušťky. V kreslených widgetech jedna tloušťka a jedna vrstva pro všechny čáry,GlowLines(3 dávky na čáru) jen na pár krátkých prvků. Barva dávku nerozbíjí.
Písmo
- TTF v
Content/UI/Fonts, stagujeConfig/DefaultGame.ini:+DirectoriesToAlwaysStageAsUFS=(Path="UI/Fonts")– cesta relativní ke Content (sContent/UI/Fonts
se nestagovalo nic a HUD v balíčku padal na Roboto, 9.3 a).Tools/Package.ps1písmo v buildu kontroluje. - Vlastní písmo: první
.ttf/.otf(podle jména) vContent/UI/Fonts/Custom/(v.gitignore) použije HUD
i displeje (CustomFont()vSpaceFlightHud.cpp); pak znovu zabalit. - Písmo ze Star Citizen nevytahujeme ani nestahujeme z neoficiálních zdrojů. Jména v UI naše (Veyra,
Keth, Orun, Halcyon), ne ze SC.
Světla a expozice kokpitu
- Key + fill (setup první stíhačky, dobrý výchozí bod):
cockpit_light_intensity_cd1,5, offset [80, 0, −10], radius 250 cm,
source radius 12 cm;cockpit_fill_intensity_cd0,8, offset [−15, 0, 12]. Bez stínů, pod střechou
canopy. Posouvají se s okem (cockpit_eyeve snímcích).- 12 / 5 cd = plošně šedá deska; bez světel černá (slunce dovnitř nesvítí). Většinu světla dávají displeje.
- Ladění: pole snímku
cockpit_light[key, fill],display_light,interior_tint; v kóduASpaceshipPawn::DebugSetCockpitLighting(Key, Fill, Display, InteriorTint). Presetcockpit_light. - Interiér kokpitu
base_color_tint0,6 (tmavý jako v SC). Hodnoty trupu (space.ShipMat) interiér nedědí. - Wayfarer po kroku 7 (25. 9. 2026): obložení tmavý grafit, krém jen na ostění,
cockpit_light_intensity_cd2,5,frame_wash_cd4, ostrůvky nad konzolemi (console_pool_cd3). Hologram lodi (M_Ship_Holo) nad levým MFD. - Wayfarer (koncept A, 25. 9. 2026): setup
pawn.cockpit_exposure_bias−0,2 EV a emise displejů 2,05
(= 2,9 / 2^0,5): natřený kokpit musí číst ve dne i v noci. Displeje v descehs_cockpit.py(stylwrap). - Expozice: kokpitová kamera má vlastní
ASpaceshipPawn::CockpitExposureBias= −0,7 EV (výchozí C++) (ve skoku
quantum se prolíná naQuantumExposureBias−0,8 a expozice se připíchne). Cíl proti SC: střední jas
kokpitu nad planetou ~0,10–0,19, ve vesmíru ~0,05 (tmavý kokpit, jasné displeje).- Displeje jsou emisivní a s expozicí tmavnou →
MI_Ship_<Loď>_Screens.emissive_strength
2,9 = 1,8 × 2^0,7. Změníš-li bias, přepočítej emissive stejně (jinak tmavé / kvetoucí písmo;
efektivní jas nad ~3 = bílé písmo kvete a rozmazává se). - Sklo displejů (
ESpaceHudSymbol::MfdGlass) tmavé, obsah jasný. - Za běhu:
space.Post AutoExposureBias <EV>(presetcockpit_look: 0 / −0,5 / −1 / −1,5),
vlastnost lodispace.Ship CockpitExposureBias <EV>(neukládá se; co sedí, zapiš do kódu/setupu).
- Displeje jsou emisivní a s expozicí tmavnou →
Testy a snímky
Testy vždy nástrojem PowerShell (bash rozbije $PSScriptRoot), commandlet nic nekreslí:
.\Tools\run_editor_python.ps1 Tools\Tests\test_cockpit_displays.py # slot, RT, velikost, světla, stav, písmo >= 26
.\Tools\run_editor_python.ps1 Tools\Tests\test_cockpit_frame.py # oko, deska pod horizontem, vzdálenost
.\Tools\run_editor_python.ps1 Tools\Tests\test_flight_hud_sc1c.py # strom HUD, make_state/apply_state, space.HudBěhem kroku rychlá smyčka -Editor (čeká na shadery, 9.2 e), na konci kroku zabalená hra:
.\Tools\Shots.ps1 -Preset cockpit -Editor # během kroku (~2 min)
.\Tools\Shots.ps1 -Preset cockpit -Package # na konci kroku: zabalí (~5 min) a vyfotí
.\Tools\Shots.ps1 -Preset mfd_pages # levý MFD ~495–710 × 640–825, pravý ~893–1105 × 640–825 px
.\Tools\Shots.ps1 -Preset cockpit_look -Width 1920 -Height 1080 # expozice; autor hraje 1080pPresety: cockpit (oko, displeje, rám), cockpit_light, cockpit_centre, cockpit_look,mfd_pages, hud (HUD ve všech situacích), display_sharpness (displeje za rychlého letu).
Pole snímku pro kokpit: cockpit_eye, hide_hull, hide_canopy, cockpit_light, display_light,interior_tint, hud, console (např. ["space.MfdPage 1 2"]).
Výřezy si zvětši a slož do jednoho listu (PIL ve scratchpadu) proti referenci z Docs/UI/.
Měření: stat SpaceCockpit (stav a kreslení displejů), stat SpaceHud (prvky, „Line batches“), stat unit
(zkontroluj RenderRes – ostrost bez 100 % rozlišení nehodnoť, 9.2 i). A/B přepínačespace.CockpitKeepWindow 0/1, space.HudLineBatch 0/1. Profilování přes Unreal Insights bez GUI:
WORKFLOW 9.2, odstavec „Profilování zabalené hry“.
Další konzole: space.CockpitPitch <°> (sklon pohledu, setup cockpit_view_pitch_deg 0),space.CameraShake <násobitel>, space.CockpitCentre 0/1.
Nástrahy (příznak → příčina → řešení)
- Kokpit a displeje se za rychlého letu rozmazávají a „trhají“ → Nanite dává meshi letícímu s kamerou
špatné motion vectory, TSR míchá z nesprávného místa → interiér bez Nanite (no_nanite_partsv setupu,
hlídátest_import_ship_plan.py), kokpitová kameraMotionBlurAmount 0. Ověřenídisplay_sharpness. - Duchy čísel (dvě desítky přes sebe) → TSR prolíná číslo měněné každý snímek → opaque + pixel
animation, stav 5 Hz, kvantování během změny. Nepomohlo: translucent + responsive AA (zdvojené řádky),
průhlednost po TSR (rozmazané), TSR cvary, mipmapy RT. Zbývá krátce při afterburneru / tvrdém brzdění. - Blikání displejů a hitch při boostu → RT se přestavoval kvůli FOV kicku → měřítko jen ze šířky okna,
práh 0,099. - Po přidání kreslených prvků spadne kokpit z ~64 na ~31 FPS, herní vlákno +6–17 ms, GPU beze změny →
SlateAddLineElements: každá změna tloušťky/vrstvy = nová dávka, a nové okno při každém kreslení =
realokace pole → trvalé okno + jedna tloušťka/vrstva + fronta čar (9.2 g). - HUD v balíčku v Roboto → špatná cesta stage fontů →
Path="UI/Fonts"(9.3 a). - Kokpit šedý / vybledlý → příliš silná key/fill světla (12 cd) nebo expozice → světla ze setupu, bias −0,7.
- Displeje vybledlé od oblohy → lit sklo odráželo denní oblohu → obrazovky unlit.
- Materiál zůstal translucent po reimportu →
_fresh_materialznovu použije asset se starými
vlastnostmi → blend mode vždy nastav explicitně (9.2 d). - F1/F2 přepne wireframe/unlit místo stránky (Development build) → enginové debug bindy → odebrat v
DefaultInput.ini(už je). - Konzole v poli
consoleplatí do konce běhu → A/B zdědí nastavení → každý snímek začni návratem na
výchozí hodnoty, první snímek zahoď; FPS hodnoť sesettle≥ 2 s (9.2 h). - Kolize jmen v unity buildu (
ModeColorv HUDu vsSpaceDebugHUD.cpp) → konstanty v souborech
pojmenovávej jedinečně.
Pravidla
- Na displeje ani HUD nic nepředstírat: jen data, která hra opravdu má.
- AI malované ciferníky nejdou přečíst – obsah obrazovek vždy kreslit (živě v RT, nebo skriptem).
- Po vizuální opravě přidej do testu kontrolu, která by chybu zachytila.
- Hotovo = test zelený + snímek zkontrolovaný proti referenci (při předání ze zabalené hry).