LifePlay-Revival/Docs/Migration/etat/VQ/VQ2/VQ2-IMPL-H.md

57 lines
3.3 KiB
Markdown
Raw Normal View History

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