> **V1 close — VQ4, 2026-10-07** (voir §8 Acceptation). Ébauche initiale VQ0-T3 : documentation de cadrage pour la V1 du chantier **VQ** (rationalisation de l'onglet **Video**).
La **V1 du chantier VQ** vise un socle C++ **`ULPVideoQualitySubsystem`** (nom provisoire) qui :
1.**Injecte** un bloc de réglages `LPVideo*` dans `MainMenu.SettingsScrollBox`, **avant** les cinq lignes `LPColor*` (`LPColorGradeSubsystem`).
2.**Ne remplace pas** en V1 l'intégralité du menu Video Blueprint : les lignes LifePlay spécifiques (Toon, censure, morphs, jiggle, DoF, etc.) restent telles qu'elles sont classées par `LPSettingsSubsystem`.
3.**Prépare la sync** avec `UGameUserSettings` et les groupes Scalability Unreal pour les curseurs déjà présents en Blueprint (`ShadowQuality`, `PostProcessQuality`, `PostProcessAAQuality`, `ScreenPercentage`) — soit en les **pilotant** depuis C++, soit en **masquant** le widget BP et en exposant un contrôle unique `LPVideo*`.
4.**Corrige** le faux-positif `NewAnimationsOnly` (classé Video à cause du mot « quality » dans l'infobulle) — lot connexe sur `CategoryOf` ou renommage/tooltip BP ; peut être livré dans le même lot ou immédiatement avant.
Hors périmètre V1 : résolution / mode fenêtré avancé au-delà de `FullscreenButton`, presets « Ultra / Cinematic », motion blur, DLSS/FSR, profils par machine, migration de `GameSettings.sav`.
## 2. Synchronisation (sync)
| Couche | Rôle V1 | Fichier / API |
|---|---|---|
| Blueprint existant | Curseurs Scalability et cases à cocher ; écriture historique via le flux Blueprint / `GameSettings` | `Content/UI/MainMenu.uasset` |
| `LPSettingsSubsystem` | Classement onglet Video (`CategoryOf`, `ApplyRows`) ; ne modifie pas les valeurs graphiques | `Source/LifePlay/LPSettingsSubsystem.cpp` |
| Futur `LPVideo*` | Source de vérité **affichée** pour les leviers retenus ; applique `Scalability::` / `GEngine->Exec` / `GameUserSettings` ; relit à l'ouverture du menu | À créer |
Règle V1 : **une seule commande visible par CVar Scalability** — si un `LPVideo*` expose `Shadow Quality`, le `SettingSlider` BP `ShadowQuality` doit être `Collapsed` (ou synchronisé bidirectionnellement sans boucle ; préférer masquage + sync à l'injection).
Ordre d'initialisation recommandé (tick ou première ouverture des réglages) :
2.`LPVideoQualitySubsystem::EnsureControls` — insertion **avant** le premier enfant dont le nom commence par `LPColor`.
3.`LPColorGradeSubsystem::EnsureControls` — ajout en queue si absent (comportement actuel).
### 2.1 État après VQ2 / VQ3 (2026-10-07)
`ULPVideoQualitySubsystem` (`Source/LifePlay/LPVideoQualitySubsystem.*`) est en place ; la ligne « Futur `LPVideo*` » du tableau ci-dessus est donc réalisée.
| Sujet | Comportement |
|---|---|
| Lignes injectées | `LPVideoOverall`, `LPVideoShadows`, `LPVideoTextures`, `LPVideoEffects`, `LPVideoAA`, `LPVideoRecommended`, insérées avant le premier `LPColor*` |
| Application | `Scalability::SetQualityLevels` sur 4 groupes seulement (`sg.ShadowQuality`, `sg.TextureQuality`, `sg.EffectsQuality`, `sg.AntiAliasingQuality`), relecture et repli console |
| Overall | Curseur Overall → `FromOverall` : les 4 curseurs s'alignent. Un curseur individuel → `Normalize()` : Overall = niveau commun, sinon `Custom` (-1) |
| Persistance | `Saved/Config/Windows/LPVideoQuality.ini` (`Version`, `Overall`, `Shadows`, `Textures`, `Effects`, `AA`), relu à l'initialisation ; sans INI ni action du joueur, l'état moteur est conservé |
| **Recommended (VQ3)** | Lit `DedicatedVideoMemory` via `RHIGetTextureMemoryStats` : <4Go→0Low;<6→1Med;<10→2High;sinon3Epic.VRAMinconnue(0,-1,pasdeRHI)→2High.Puis`SetLevels(FromOverall(niveau), true)`etjournal`Video : Recommended = ... VRAM dediee detectee X Go`|
Limite connue : un GPU intégré annonce une VRAM dédiée faible (partage avec la RAM système) et obtient donc Low ou Med ; `SharedSystemMemory` n'est volontairement pas pris en compte.
Les valeurs de rendu **validées en jeu** (lot **L7c**, CHG-049) restent la baseline visuelle ; les réglages Video ne doivent pas les écraser implicitement :
Référence : `07_Architecture_5.5.md`, `04_Cahier_Des_Charges.md` (L7c), `Journal_Modifications.md` (CHG-049). Toute évolution VQ post-V1 qui touche ces clés exige une campagne de validation jour/nuit comparable à L7c/L7d.
## 4. Injection UI : avant `LPColor*`
**Motif ergonomique** : affichage / scalabilité / effets LifePlay d'abord ; **étalonnage colorimétrique** (`LPColor*`) en fin d'onglet Video (cf. CART §7).
**Motif technique** : aujourd'hui `ULPColorGradeSubsystem::AddRow` appelle `Scroll->AddChild(Row)` — les lignes `LPColor*` sont toujours **dernières**. Le futur sous-système doit :
- repérer l'index du premier enfant `LPColor*` (ou `GetChildrenCount()` si absent) ;
- utiliser `UScrollBox::InsertChildAt(Index, Row)` (ou équivalent) pour le bloc `LPVideo*` ;
- laisser `LPColorGradeSubsystem` inchangé en V1 (append) pour minimiser le diff.
Widgets injectés : préfixe de nom **`LPVideo`** (classification Video garantie par le même mécanisme que `LPColor*`, ou règle dédiée dans `CategoryOf`).
| **Ombres** | BP `ShadowQuality` (`sg.ShadowQuality`) vs futur `LPVideoShadow*` | Un seul contrôle visible ; masquer BP si C++ prend le relais |
| **Post-process** | BP `PostProcessQuality` (`sg.PostProcessQuality`) vs preset global `LPVideo*` | Idem ; documenter que « PP Quality (FPS intensive) » reste le libellé utilisateur jusqu'à refonte textes |
| **Anti-aliasing** | BP `PostProcessAAQuality` (`r.PostProcessAAQuality`) vs `LPVideoAA*` | Idem |
| **Échelle interne** | BP `ScreenPercentage` vs `LPVideo*` render scale | Sync sur `r.ScreenPercentage` / `GameUserSettings` selon API retenue |
| **Luminosité** | `LPColorBrightness` (`AutoExposureBias`) vs gamma écran | **Ne pas** fusionner en V1 ; distinct « exposition 3D » (Color) vs futur gamma (Video) |
Statut : **V1 close, PASS** (`etat/VQ/VQ4/VQ4-VAL.md`). Les cases cochées sont prouvées par relecture du code, grep et démarrage `-nullrhi`. Les cases non cochées exigent le menu Settings ouvert en jeu (**BLOCKED-UI**), à faire à la main ; elles ne bloquent pas la clôture.
### 8.1 Configuration et non-régression L7c
- [x]`Config/DefaultScalability.ini` ne contient que `[ShadowQuality@0..3]`, `[TextureQuality@0..3]`, `[EffectsQuality@0..3]`, `[AntiAliasingQuality@0..3]` (16 sections).
- [x] Aucune occurrence de `Virtual`, `Lumen`, `GlobalIllumination`, `AntiAliasingMethod`, `ReflectionMethod`, `SSR` dans `DefaultScalability.ini` (grep insensible à la casse, 0 hit).