LifePlay-Revival/Docs/Migration/25_Video_Quality.md
2026-10-08 08:56:02 +02:00

137 lines
10 KiB
Markdown

# 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.