# VQ2-IMPL-H — Implémentation `ULPVideoQualitySubsystem` **Fiches :** VQ2-T2 (+ VQ2-T3 `CategoryOf`) **Rôle :** A-IMPL-H **Date :** 07 octobre 2026 **Spec :** `VQ2-SPEC.md` ## Modèle | | Modèle | |---|---| | Prévu | `claude-fable-5-1-thinking-high` (bloqué par policy) | | Attendu (consigne) | `claude-sonnet-5-5-high` (M2+, repli M3) | | **Réel** | `claude-sonnet-5-5-high` (Claude Sonnet 5.5) | ## Fichiers | Fichier | Action | |---|---| | `Source/LifePlay/LPVideoQualitySubsystem.h` | Nouveau : `FLPVideoLevels`, `ULPVideoQualitySubsystem` | | `Source/LifePlay/LPVideoQualitySubsystem.cpp` | Nouveau : SetLevels, RefreshWidgets, Load, Save, EnsureControls, Tick, ApplyToScalability | | `Source/LifePlay/LPSettingsSubsystem.cpp` | `CategoryOf` + `ApplyRows` (T3) | `LifePlay.Build.cs` et `LPColorGradeSubsystem.*` inchangés. ## Réalisé - Widgets `LPVideoOverall`, `LPVideoShadows`, `LPVideoTextures`, `LPVideoEffects`, `LPVideoAA`, `LPVideoRecommended`, insérés via `InsertChildAt` avant le premier `LPColor*` (repli `AddChild` + réordonnancement des `LPColor*`). - `ApplyToScalability()` : `Scalability::GetQualityLevels()` puis écriture de 4 champs seulement (`ShadowQuality`, `TextureQuality`, `EffectsQuality`, `AntiAliasingQuality`), `SetQualityLevels(Q, true)`, relecture et repli `sg.*` en `ECVF_SetByConsole` (R1). - Persistance `Saved/Config/Windows/LPVideoQuality.ini` (`Version=1`, `Overall`, `Shadows`, `Textures`, `Effects`, `AA`) ; `Overall` recalculé par `Normalize()` au `Load()`. - Recommended : stub = niveau 2 (High), log `Video : Recommended = stub (High) ; VRAM prevue en VQ3`. - `EnsureControls()` met aussi `ShadowQuality`, `PostProcessQuality`, `PostProcessAAQuality` en `Collapsed`. - T3 `LPSettingsSubsystem.cpp` : - `CategoryOf` : `LPVideo*` → `TabVideo` ; `ShadowQuality`, `PostProcessQuality`, `PostProcessAAQuality` → `TabHidden` (-2) ; `BackButton` → `TabAlways` (-1). - `ApplyRows` : `bShow = Category == TabAlways || (Category != TabHidden && ActiveTab != TabKeyboard && Category == ActiveTab)` ; -1 toujours visible, -2 toujours replié. - Grep : `CategoryOf` n'a qu'un seul appelant (`ApplyRows`). ## Écarts / choix par rapport à la spec - **Drapeau `bConfigured`** : sans INI et sans action du joueur, `ApplyToScalability()` ne fait rien (état moteur préservé, §6.2 « aucun changement »). Les niveaux affichés sont alors relus depuis Scalability à chaque injection du menu. Dès qu'un INI existe ou que `SetLevels` est appelé, les déclencheurs a/b/c réappliquent les niveaux. - Pas de `Save()` à l'initialisation. - `AddRow` : signature adaptée (`ERow`, widget de ligne en sortie) car l'insertion se fait après création des 6 lignes. - Pas de delegate `OnControlsInjected` (Q2) : `ULPSettingsSubsystem::Tick` rappelle `ApplyRows()` quand `GetChildrenCount()` change (à confirmer en VQ2-VAL). ## Build Commande : ``` D:\Game\Launcher\Engine\UE_5.5\Engine\Build\Build.bat -> Engine\Build\BatchFiles\Build.bat LifePlayEditor Win64 Development -Project="D:\Game\LifePlay-master 5.5\LifePlay.uproject" ``` Résultat : **compile OK** (UHT sans erreur, `UnrealEditor-LifePlay.dll` relié, exit code 0, aucun warning/erreur sur les fichiers VQ2). Non testé en exécution (VQ2-VAL).