Replace rasterized overhead nameplates with native GPU text and geometry
Continuation of full GPU UI replacement rooted in tsk_nxnkyedc6c. Keep work on the existing feature/integrate-vulkan-gui worktree unless explicitly split later. Preserve the current nameplate information, world positioning, distance/top-edge sizing, brackets, health/organization bands, depth occlusion and pale-backdrop panel behavior; do not redesign it or use CPU LOS as an occlusion approximation. Baseline investigation confirmed PRK.Client/UI/NameplateScene.cs called PRK.GraphicsEngine/UI/TargetIndicatorArt.Rasterize before this replacement. It CPU-rasterizes outlined text and masks at a fixed 4x scale, uploads array textures and renders them as world sprites in the display-overlay pass. This is outside the replaced retained GuiView path but remains player-visible UI text; the full replacement must not be called complete while it remains. Reuse PRK.Fonts/PRK.Fonts.Vulkan layout/coverage and existing world billboard/depth/display-overlay infrastructure. Choose either native projected text/geometry with proper depth/backdrop bindings or GPU-rendered physical-size artifacts with provable 1:1 composition; do not resample a fixed-size cached text bitmap. Shared GPU texture ownership/descriptor/frame-slot integration may be needed; keep its lifetime explicit rather than copying resource systems. Existing NameplateTests provide layout/behavior controls. Final visual comparisons can wait until implementation is ready, per user request. Additional verified seams: nameplate_fragment.glsl samples art/mask layers and reuses scene_display.glsl via the display-overlay descriptor set (scene color/depth). It averages nine displayed-scene samples at 12-pixel spacing, applies panel opacity 0.6 * smoothstep(0.45, 0.8, luminance), and preserves world depth occlusion through the material pipeline. Existing native GUI pipelines deliberately disable depth for retained 2D rendering, so a projected native world-text path needs an explicit compatible depth/backdrop binding, not a global GUI depth toggle. A GPU artifact route would instead need an explicit borrowed-GPU-image/descriptor lifecycle and physical-size 1:1 composition; engine TextureManager currently expects uploaded owned textures. Do not fake either seam with CPU readback or cached bitmap resampling. NameplateScene also selects system Arial Bold, unlike the new deterministic regular/italic retained catalog; provide a licensed bold face if migrating it. Implemented and verified in the existing worktree after checkpoint commit 9b635a77b; follow-up changes are uncommitted. NameplateScene now preserves camera-facing placement, distance sizing and top-edge adjustment while projecting actual physical sizes into GuiWorldCanvas/GuiWorldOverlay. NameplatePainter emits native bold outlined text, source-image brackets, health geometry and separate rounded name/organization bands. The distinct reverse-depth GUI pipelines use the real composite depth attachment without writes; the scene-aware primitive shader retains the existing nine-sample displayed-scene luminance-dependent panels through explicit borrowed engine/scene descriptor layouts. Glyph/image preparation, frame-slot commit/discard, bounded caching and retirement reuse the existing GUI/font backend. No per-plate text bitmap, texture swap or fixed raster scale remains. Removed TargetIndicatorArt, the old nameplate shader and all TestSupport/LegacyGui renderer/surface/font/blob/window-cache code. Existing visual/content/input tests now use shared validation-enabled native Vulkan targets and GPU readback; useful coverage was migrated rather than disabled. Removed every remaining UI SKFont/SKTypeface measurement path (tooltips, confirmations, mission columns, character creation), sharing native font geometry. Bundled licensed Liberation Sans Bold; removed unused Berkeley Mono/Cantarell/Roboto assets. Subpixel world text now supports FreeType's 1/64-pixel size units rather than a clamped 1-pixel placeholder; oversized runs still use explicit native budgets/refusals. Verified: full client solution Debug build zero warnings/errors; 718 graphics tests; 4,179 client tests with 44 existing asset/audio skips; 32 actual Vulkan tests with one opt-in AA benchmark skipped. Actual display-overlay text/backdrop and resize cases pass with 1/3 frame slots. New real-GPU depth test fails when text depth is disabled (267 hidden glyph pixels become visible) and when primitive depth is disabled; restored green. Subpixel-size test was red under the old one-pixel restriction and passes with native support. Native CTest plus ASan/UBSan pass. Native AOT real-engine fixture, installed RX9070 front-end/Lua/nameplate acceptance, Lua UI AOT suite and production Linux Native AOT publish all pass. Installed tests verify stable world glyph uploads across unchanged frames and UI-scale changes; inspected final screenshot .dev-data/gui/native-nameplates-final/native-140.png. Relevant fixes exposed by validation: offscreen projections are clipped before constructing bounded GUI rectangles; startup water-foam rollback now reclaims directly before a retirement sink exists, preserving original construction errors. Native package copying is unconditional so switching dev/release packages cannot retain a newer-timestamp wrong library. Rebuilt pinned static Linux package after an initial ICU environment mismatch. Combined window/headless AA tests exposed existing global anisotropy-dependent fixture sampling; TextureOptions now allows explicitly disabling anisotropy and those known-linear fixtures request it. Combined tests pass without exclusions or weakened AA assertions. No performance improvement is claimed; HDR/mixed-monitor DPI, platform execution/signing and broad production workloads remain root-level gates. Windows VM testing stays paused; do not start it. User now explicitly requests finishing this nameplate replacement and removing the old Skia system after the retained-UI checkpoint commit 9b635a77b. Remove TestSupport/LegacyGui and migrate its useful rendering behavior checks to the native GPU path, rather than retaining a parallel legacy painter or discarding useful coverage. Keep unrelated image decoding uses separate. No feature review was requested.
Checklist
3 of 3 complete- Render overhead labels, organization text, brackets, health bands and backdrop panels through native font/GPU geometry at their actual projected physical sizes, with no CPU text raster/texture replacement path.
- Preserve billboard placement, distance/top-edge sizing, world depth occlusion and pale-backdrop behavior; validate descriptor, atlas/target replacement and cancellation lifetimes with real frames in flight.
- Run relevant nameplate/graphics/client tests, actual Vulkan and Native AOT checks, then final installed visual/input verification; remove TargetIndicatorArt CPU rasterization only after replacement passes.
- Area
- Project Rubi-Ka
- Project
- engines
- Kind
- Feature
- Task ID
tsk_23s9wcf4rf- Updated