Add branded PRK.Client loading screen with animated player preview
Replace the loading window/spinner/progress/status/cancel UI with the homepage-style warm ink/brown gradient, Project Rubi-Ka title and selected player's live animated model. Worktree: /home/mathias/Projects/worktrees/engines-client-loading-screen, branch feature/client-loading-screen. No commit requested or created. Implemented behavior: - Title left, player right; narrow windows stack the model below the title. Reversible smoothstep 250 ms fades preserve the backdrop above destination screens. Offline mode hides immediately; initial account connection has no player and shows title/gradient only. - Reuse the character-selection CharacterVisualProvider, retain it after entering the world, refresh cached appearance on each loading entry, and choose relaxed idle or equipped-weapon-appropriate combat idle once per load. No actual gameplay attacks, sound or combat events are triggered. - CharacterPreviewRenderer draws only that body and attached gear into a fixed 512×768 RGBA/depth target per frame slot with independent camera and studio lighting. Preview-only bodies are excluded from world/shadow snapshots; their attachments retain animated transforms but are hidden from world culling. The game camera and world lighting are not modified by the offscreen preview. - Following the user's live report of fade lag/late models and disappearing heads, the fade now uses a separately cached GPU UI overlay capped at 1600×900. The main UI has only a non-painted input-capture placeholder; opacity is a fragment push constant, not a GuiView opacity change, so fade steps do not repaint/upload either UI surface. The overlay is rasterized/uploaded at zero opacity before loading, and character-selection frames warm the model target/material pipelines at zero opacity. Foreground windows/overlays put the backdrop below the regular interface and temporarily suppress the model; cursor stays last. Targets/pipelines are reused until GPU-safe shutdown and participate in swapchain-format replacement. - Retained preview attachment meshes now hold reference-counted MeshLoader cache leases, owned by each committed/pending VisualResources set and released on replacement/disposal. WorldManager.Unload calls MeshLoader.ClearCache; previously that evicted static head/gear geometry still used by the retained preview. ClearCache now evicts only unretained entries, preventing head loss while allowing normal eviction after release. Cache lookup/retention/eviction is synchronized. Unpublished visual candidates release resources/leases on failure. - The earlier static hero asset and embedding were removed. UI_XML.md describes ownership and presentation. Validation: - 3,506 non-install client tests pass (54 skipped), 686 non-install graphics tests pass; production Release client build has zero warnings/errors; git diff --check clean. - Three new native GPU pixel tests pass on RX9070/RADV with Vulkan synchronization validation, covering 1–3 frame slots, skinned geometry, attached gear, transparent background, depth, half/full fade alpha, model movement, attachment-buffer growth, exclusion of unrelated meshes, restoring world visibility and resource cleanup. Twelve existing upload/target/readback regressions also pass. - A hidden real-window integration test passes through the full RendererVulkan path, including asynchronous source loading, zero-opacity preview preparation, cached backdrop prewarming, opacity/order changes with no CPU repaint, preview/world isolation, hide/show, resize and shutdown with no live allocator owners or validation errors. The final combined 16-test native run passes with synchronization validation on RX9070/RADV. - Preview framing/pose policy and UI layout/fade/foreground suppression have deterministic unit tests. Dedicated shader sources compile with host glslc. Tests use synthetic skeletal geometry; no logged-in gameplay/player-appearance screenshot or live zoning session was exercised. A new install-dependent regression passed against a real Solitus female head (40629), mounting the user's installation read-only and writing the temporary RDB patch outside it: repeated world-cache clears preserve geometry while either preview lease lives, duplicate release is safe, and geometry becomes evictable after the last release. Broader install suites remain excluded. A separate CPU regression confirms all 14 intermediate fade steps cause zero paint damage on both the static overlay and main interface. Await the user's live recheck of fade responsiveness/timing and intact heads across zoning; no measured live frame-time improvement is claimed. - Docker builds/tests run as UID/GID 1000; no root-owned worktree artifacts remain. Earlier clipboard-image previews are historical and no longer represent the model-based screen.
Checklist
5 of 6 complete- Verify rendering, resizing, idle redraw behavior, cleanup and screen transitions with tests and a client build; inspect a rendered preview.
- Replace loading controls with an opaque static gradient and supplied transparent artwork; preserve connection-screen routing and resize behavior.
- Place Project Rubi-Ka branding left of the hero (stack on narrow screens), add reversible 250 ms fades above destination screens, and validate layout, transitions and previews.
- Render the selected character and attachments in an isolated, bounded GPU preview with weapon-aware random idle/combat stance; retain across loads, exclude from world passes, preserve fades and validate lifecycle/native rendering.
- Fix reported fade stalls/late appearance and disappearing head: GPU-only cached-overlay fade, preview prewarming, attachment-cache retention across world unload; reproduce and verify with regressions/native tests.
- Verify the user's live client now shows the loading model promptly, fades smoothly, and retains its head/gear across entering the world and zoning.
- Area
- Project Rubi-Ka
- Project
- engines
- Kind
- Feature
- Task ID
tsk_5aqff59mjm- Updated