# VQ4-VAL — Validation finale V1 du chantier Video Quality **Fiche :** VQ4-T1 **Rôle :** A-VAL **Date :** 07 octobre 2026 **Entrée :** `VQ1-SPEC.md` §8, `VQ2-SPEC.md` §13, `VQ2-VAL.md`, `VQ3-VAL.md` ## Modèle | | Modèle | |---|---| | Attendu | `claude-sonnet-5-5-high` | | **Réel** | `claude-sonnet-5-5-high` (Claude Sonnet 5.5) | ## Verdict : **PASS** (avec **BLOCKED-UI** sur le test manuel Settings, inchangé depuis VQ2 / VQ3) ## 1. Critères rejoués (code) | # | Critère | Résultat | Preuve | |---|---|---|---| | 1 | `SetLevels` : sync Overall ↔ 4 curseurs | **PASS** | `LPVideoQualitySubsystem.cpp` l.289-303 : `bFromOverall && Overall >= 0` → `FromOverall` (4 groupes alignés), sinon `Normalize()` (Overall = niveau commun, sinon `-1` Custom). Enchaîne `ApplyToScalability`, `RefreshWidgets`, `Save`. Les 5 handlers `OnOverall/Shadows/Textures/Effects/AAChanged` (l.331-382) passent par `SetLevels`, avec garde `bRefreshing` contre la boucle. | | 2 | Recommended : VRAM | **PASS** | `QueryDedicatedVideoMemoryBytes` (garde `GDynamicRHI`, `RHIGetTextureMemoryStats`, `DedicatedVideoMemory`, `max(.., 0)`) l.36-44. `LevelFromVramGB` l.48-66 : ≤ 0 → 2 High ; < 4 → 0 ; < 6 → 1 ; < 10 → 2 ; sinon 3. `OnRecommendedClicked` l.384-398 : journal + `SetLevels(FromOverall(Level), true)`. | | 3 | `CategoryOf` : `LPVideo*` → Video | **PASS** | `LPSettingsSubsystem.cpp` l.153 : `StartsWith("LPColor") \|\| StartsWith("LPVideo")` → `TabVideo`. | | 4 | `CategoryOf` : `TabHidden` | **PASS** | l.41 `TabHidden = -2` ; l.146-151 : `ShadowQuality`, `PostProcessQuality`, `PostProcessAAQuality` → `TabHidden`. `ApplyRows` l.599 exclut `TabHidden`. | | 5 | `LPColor*` toujours `CategoryOf` Video | **PASS** | Même branche l.153 ; `LPColorGradeSubsystem.*` non modifié (`git status` : seuls `LPSettingsSubsystem.cpp`, `LifePlay.Build.cs`, `DefaultScalability.ini` et `LPVideoQualitySubsystem.*` bougent). | | 6 | `DefaultScalability.ini` : structure | **PASS** | 16 sections, uniquement `[ShadowQuality@0..3]`, `[TextureQuality@0..3]`, `[EffectsQuality@0..3]`, `[AntiAliasingQuality@0..3]`. | | 7 | `DefaultScalability.ini` : cvars L7c interdites | **PASS** | Voir §2 (0 occurrence). | | 8 | `DefaultEngine.ini` inchangé (L7c) | **PASS** | `git status` / `git diff --stat Config/DefaultEngine.ini` : vide. Valeurs L7c toujours présentes : `r.AntiAliasingMethod=2` (l.17), `r.DynamicGlobalIlluminationMethod=0` (l.22), `r.ReflectionMethod=2` (l.23), `r.Shadow.Virtual.Enable=0` (l.24), `DefaultGraphicsRHI_DX12` (l.129). | | 9 | Aucune cvar L7c dans le code VQ | **PASS** | `rg -i "Virtual\|Lumen\|AntiAliasingMethod\|ReflectionMethod"` sur `LPVideoQualitySubsystem.*` : seuls les mots-clés C++ `virtual` (`.h` l.55-56, faux positifs). | ## 2. Grep `DefaultScalability.ini` (re-exécuté) Commande (insensible à la casse) : ``` rg -n -i "Virtual|Lumen|GlobalIllumination|AntiAliasingMethod|ReflectionMethod|SSR|DynamicGlobal|ScreenSpaceReflection|r\.Shadow\.Virtual|DefaultFeature" Config/DefaultScalability.ini ``` Résultat : **0 occurrence** (exit 1). Les cvars écrites par le fichier sont exactement : `fx.Niagara.QualityLevel`, `r.DetailMode`, `r.MaxAnisotropy`, `r.PostProcessAAQuality`, `r.RefractionQuality`, `r.Shadow.CSM.MaxCascades`, `r.Shadow.CSM.TransitionScale`, `r.Shadow.DistanceScale`, `r.Shadow.MaxCSMResolution`, `r.Shadow.MaxResolution`, `r.Shadow.PreShadowResolutionFactor`, `r.Shadow.RadiusThreshold`, `r.SSS.SampleSet`, `r.SSS.Scale`, `r.Streaming.MaxEffectiveScreenSize`, `r.Streaming.MipBias`, `r.Streaming.PoolSize`, `r.TranslucencyLightingVolumeDim`. Aucune ne touche GI, VSM, méthode d'AA ou reflets. ## 3. Smoke `-nullrhi` et DLL | Contrôle | Résultat | |---|---| | `UnrealEditor-LifePlay.dll` | 23:29:07, postérieur à tous les sources (`LPVideoQualitySubsystem.cpp` 23:28:32, `.h` 23:21:19, `LPSettingsSubsystem.cpp` 23:20:54) : **à jour** | | Démarrage | `UnrealEditor-Cmd.exe LifePlay.uproject -game -nullrhi -nosound -unattended -nosplash -ExecCmds="quit"` : **exit 0**, 44 s. Journal : `Saved/Logs/VQ4VAL.log` | | Ligne vidéo | `LogLifePlay: Display: Video : pas de .../LPVideoQuality.ini, niveaux lus depuis Scalability (Overall 3, Shadows 3, Textures 3, Effects 3, AA 3)` | | Couleur | `Couleur : relu Brightness 0.00, ... depuis .../LPColorGrade.ini` (sous-système couleur intact) | | Warnings / Errors vidéo | aucun. Seule `Error` : `LogPlayerController: InputMode:UIOnly ... Non-Focusable widget` (déjà vue en VQ2/VQ3, sans lien) | Le smoke ne couvre que le démarrage : le menu Settings n'est pas ouvert, donc pas de ligne `controles ajoutes`. ## 4. BLOCKED-UI (non automatisable ici) À faire à la main, hors clôture documentaire : 1. Settings > Video : 6 lignes `LPVideo*` avant `LPColor*` ; `ShadowQuality`, `PostProcessQuality`, `PostProcessAAQuality` masqués, y compris après aller-retour d'onglet. 2. Overall 0→3 : les 4 curseurs suivent ; un curseur individuel → `Custom`. 3. `Recommended` : journal `VRAM dediee detectee X Go`, niveau conforme aux seuils (GPU intégré : Low/Med, limite documentée). 4. Relance : `Video : relu Overall N, ...` depuis `LPVideoQuality.ini`. 5. En jeu, niveau 3 : GI dynamique, VSM et AA (TAA) inchangés ; lecture console `sg.*` / `r.*`. ## 5. Synthèse | Critère | Statut | |---|---| | `SetLevels` sync | PASS | | Recommended VRAM | PASS | | `CategoryOf` `LPVideo*` + `TabHidden` | PASS | | `DefaultScalability.ini` sans cvars L7c | PASS (grep : 0) | | `LPColor*` toujours Video | PASS | | `DefaultEngine.ini` inchangé | PASS | | DLL récente + smoke `-nullrhi` | PASS | | Test manuel Settings | BLOCKED-UI |