# 25 — Qualité vidéo et réglages graphiques (chantier VQ) > **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**). > > Cartographie validée : `etat/VQ/VQ0/VQ0-CART.md` (VQ0-T1), preuve : `etat/VQ/VQ0/VQ0-VAL.md` (VQ0-T2, PASS). ## 1. Périmètre V1 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 | | `LPColorGradeSubsystem` | Color grading post-process ; **indépendant** (`LPColorGrade.ini`) | `Source/LifePlay/LPColorGradeSubsystem.cpp` | 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) : 1. `LPSettingsSubsystem::EnsureTabs` — structure d'onglets prête. 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*` | | Blueprint masqués | `ShadowQuality`, `PostProcessQuality`, `PostProcessAAQuality` (`TabHidden` dans `CategoryOf`) | | 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` : < 4 Go → 0 Low ; < 6 → 1 Med ; < 10 → 2 High ; sinon 3 Epic. VRAM inconnue (0, -1, pas de RHI) → 2 High. Puis `SetLevels(FromOverall(niveau), true)` et journal `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. Preuves : `etat/VQ/VQ2/VQ2-VAL.md`, `etat/VQ/VQ3/VQ3-IMPL-H.md`, `etat/VQ/VQ3/VQ3-VAL.md`. ## 3. Ancrage rendu L7c 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 : | Clé | Valeur jouée | Fichier | |---|---|---| | `r.DynamicGlobalIlluminationMethod` | `0` | `Config/DefaultEngine.ini` | | `r.ReflectionMethod` | `2` (SSR) | idem | | `r.Shadow.Virtual.Enable` | `0` | idem | | `DefaultGraphicsRHI` | D3D12 | idem | 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`). ## 5. Conflits Blueprint — note V1 | Conflit | Widgets / leviers | Traitement V1 proposé | |---|---|---| | **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) | | **Faux-positif onglet** | `NewAnimationsOnly` | Corriger classification (General) — indépendant des CVars | ## 6. Prochaines fiches (hors VQ0) | Fiche | Contenu attendu | |---|---| | VQ1-SPEC | API `LPVideo*`, liste des CVars, persistance (ini dédié vs `GameUserSettings`) | | VQ1-IMPL | Module C++, masquage BP, tests menu Video | | VQ1-VAL | PASS/FAIL en jeu + non-régression L7c | ## 7. Documents liés - `etat/VQ/VQ0/VQ0-CART.md` — inventaire exhaustif onglet Video - `etat/VQ/VQ0/VQ0-VAL.md` — validation amont - `14_Interface_V1.4.md` — menu principal (contexte UI) - `10_Protocole_Operations.md` — déroulé de lot avant code - `etat/VQ/VQ1/VQ1-SPEC.md` §8, `etat/VQ/VQ2/VQ2-SPEC.md` §13 — critères d'acceptation d'origine - `etat/VQ/VQ4/VQ4-VAL.md` — validation finale V1 (PASS, BLOCKED-UI manuel) - `26_Eval_Agents_VideoQuality.md` + `etat/VQ/VQ5/VQ5-VAL.md` — évaluation des agents VQ5 (GO conditionnel ; écarts Epic de `DefaultScalability.ini`) ## 8. Acceptation V1 (clôture VQ4, 2026-10-07) 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). - [x] `Config/DefaultEngine.ini` inchangé : L7c intact (GI 0, SSR, VSM 0, TAA, D3D12). - [x] Aucune cvar L7c dans le code `LPVideoQualitySubsystem.*`. - [ ] Niveau 3 en jeu : GI dynamique, VSM et méthode d'AA inchangés (BLOCKED-UI). ### 8.2 Code et classement - [x] `LPVideoQualitySubsystem.h/.cpp` compilent ; DLL `UnrealEditor-LifePlay.dll` postérieure aux sources. - [x] `SetLevels` : Overall → 4 niveaux (`FromOverall`) ; niveau individuel → `Normalize` (Overall ou `Custom`). - [x] `Recommended` : VRAM dédiée (`< 4` Low, `< 6` Med, `< 10` High, sinon Epic ; inconnue = High). - [x] `CategoryOf` : `LPVideo*` et `LPColor*` → Video ; `ShadowQuality`, `PostProcessQuality`, `PostProcessAAQuality` → `TabHidden`. - [x] `LPColorGradeSubsystem` non modifié. - [x] Démarrage `-nullrhi` : exit 0, lecture des niveaux depuis Scalability, aucun avertissement vidéo. ### 8.3 Menu Settings (test manuel) - [ ] Six lignes `LPVideo*` avant `LPColor*` ; trois curseurs BP masqués après changement d'onglet (BLOCKED-UI). - [ ] Overall 0→3 : les 4 curseurs suivent ; un curseur individuel → `Custom` (BLOCKED-UI). - [ ] `Recommended` : niveau conforme au GPU, journal VRAM (BLOCKED-UI). - [ ] Relance : niveaux relus depuis `Saved/Config/Windows/LPVideoQuality.ini` (BLOCKED-UI). ### 8.4 Limites connues V1 - GPU intégré : VRAM dédiée faible, donc Low ou Med ; `SharedSystemMemory` volontairement ignorée. - `PostProcessQuality` n'est plus pilotable par le joueur (masqué, hors des 4 groupes) ; `ScreenPercentage` reste en Blueprint.