LifePlay.uproject : SupportedTargetPlatforms Win64 sur LPAnimCore, origine non revendiquee, range ici. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
16 KiB
VQ0-CART — Cartographie des réglages classés Video dans Settings
Fiche : VQ0-T1
Rôle : A-CART
Date : 07 octobre 2026
Workspace : d:\Game\LifePlay-master 5.5
Statut : Validé — cartographie complète
1. Contexte et Objectifs
Dans le cadre du chantier VQ0 (Refonte et rationalisation des réglages Vidéo / Graphismes), l'objectif de cette cartographie est d'auditer et répertorier l'ensemble des éléments d'interface qui se retrouvent classés sous l'onglet Video du panneau des réglages (MainMenu.SettingsScrollBox).
Le système actuel repose sur deux mécanismes complémentaires :
ULPSettingsSubsystem(introduit en CHG-158, ajusté en CHG-160) : organise les widgets existants du BlueprintMainMenuen onglets dynamiques (General,Audio,Video,Keyboard,Lewd,Misc) sans modifier les Blueprints.ULPColorGradeSubsystem(introduit en CHG-161, stylisé en CHG-163) : injecte dynamiquement des curseurs de colorimétrie post-traitement (LPColor*) au bas de la listeSettingsScrollBox.
2. Analyse de LPSettingsSubsystem.cpp
2.1 Méthode de classification : CategoryOf
La fonction LPSettingsUi::CategoryOf(const UWidget* Widget) inspecte chaque enfant de SettingsScrollBox pour déterminer son onglet de destination.
L'aiguillage vers l'onglet Video (TabVideo = 2) s'opère selon deux règles successives :
-
Règle explicite par préfixe :
if (Widget && Widget->GetName().StartsWith(TEXT("LPColor"))) { return TabVideo; }Tout widget dont le nom C++/UMG commence par
LPColorest immédiatement dirigé versTabVideo. -
Règle textuelle par mots-clés (
RowText) : Si le widget ne commence pas parLPColoret n'a pas été capturé par les mots-clés Audio (volume,audio,sound,music),CategoryOfconvertit le texte extrait en minuscules et teste les motifs suivants :if (Text.Contains(TEXT("fps")) || Text.Contains(TEXT("screen")) || Text.Contains(TEXT("shadow")) || Text.Contains(TEXT("quality")) || Text.Contains(TEXT("fullscreen")) || Text.Contains(TEXT("window")) || Text.Contains(TEXT("toon")) || Text.Contains(TEXT("depth of field")) || Text.Contains(TEXT("censor")) || Text.Contains(TEXT("morph")) || Text.Contains(TEXT("dog")) || Text.Contains(TEXT("jiggle")) || Text.Contains(TEXT("resolution")) || Text.Contains(TEXT("vsync")) || Text.Contains(TEXT("brightness"))) { return TabVideo; }
2.2 Extraction du texte : RowText
La fonction RowText(const UWidget* Widget) cumule tout le texte associé à la ligne :
- La propriété réflexive
SettingText(FTextProperty), utilisée par les UserWidgetsSettingSlideretSettingCheckbox. - L'infobulle native (
Widget->GetToolTipText()). - Une exploration récursive en profondeur de tous les sous-widgets (
UTextBlock::GetText(),UUserWidget::GetRootWidget(),UPanelWidget::GetChildAt()).
2.3 Mécanisme EnsureTabs et ApplyRows
-
EnsureTabs(UScrollBox* Scroll):- Identifie le parent
UCanvasPaneldeSettingsScrollBox. - Crée la barre d'onglets
LPSettingsTabs(UHorizontalBox) au-dessus de la boîte de défilement (décalage Y de -46 px). - Crée les boutons d'onglets :
General,Audio,Video,Keyboard,Lewd,Misc. - Instancie
LPSettingsKeyboard(UNativeWidgetHost) pour héberger la page dédiée au remappage clavier (ULPKeyboardSubsystem). - Active l'onglet initial
TabGeneral(0) et exécuteApplyRows().
- Identifie le parent
-
ApplyRows():- Met à jour la couleur du texte des onglets (doré
(1.0, 0.92, 0.45)pour l'onglet actif, gris clair(0.75, 0.75, 0.75)pour les inactifs). - Parcourt tous les enfants directs de
SettingsScrollBox:- Masque le widget legacy
LPKeyboardRow(Visibility = Collapsed). - Applique
RenameVolumes(renommeVolume - SexenVolume - DialogueetVolume - Sex MoansenVolume - SFX). - Évalue
Category = CategoryOf(Child). - Si
Category < 0(ex. boutonBackButton), le widget reste visible en permanence. - Si
Category == ActiveTab(et que l'on n'est pas sur l'onglet Keyboard), le widget est rendu Visible, sinon Collapsed.
- Masque le widget legacy
- Si l'onglet actif est
TabKeyboard, la listeSettingsScrollBoxn'affiche aucune ligne métier et l'hôteKeyboardHostaffiche l'arbre Slate natif deULPKeyboardSubsystem.
- Met à jour la couleur du texte des onglets (doré
3. Analyse de LPColorGradeSubsystem
ULPColorGradeSubsystem est un UGameInstanceSubsystem qui gère un volume de post-traitement global non borné (APostProcessVolume, bUnbound = true, priorité 100.0).
Dans EnsureControls(), il vérifie la présence de LPColorBrightness dans SettingsScrollBox. S'il est absent, il injecte 5 lignes créées dynamiquement en C++ via AddRow :
| Nom widget | Libellé | Type | Min | Max | Pas | Défaut | Handler C++ | Info-bulle / Rôle | Propriété FPostProcessSettings |
|---|---|---|---|---|---|---|---|---|---|
LPColorBrightness |
Brightness | Slider + Readout | -2.0 | 2.0 | 0.05 | 0.0 | OnBrightnessChanged |
Exposure compensation. -1 is twice as dark, +1 is twice as bright. | AutoExposureBias |
LPColorSaturation |
Saturation | Slider + Readout | 0.0 | 2.0 | 0.05 | 1.0 | OnSaturationChanged |
Color intensity. 1 is unchanged, 0 is gray. | ColorSaturation (XYZ) |
LPColorContrast |
Contrast | Slider + Readout | 0.0 | 2.0 | 0.05 | 1.0 | OnContrastChanged |
Range between light and dark. 1 is unchanged. | ColorContrast (XYZ) |
LPColorWhiteBalance |
White Balance | Slider + Readout | 1500 | 15000 | 50.0 | 6500.0 | OnWhiteBalanceChanged |
Color temperature in kelvin. 6500 is daylight. | WhiteTemp (TEMP_WhiteBalance) |
LPColorTint |
Tint | Slider + Readout | -1.0 | 1.0 | 0.01 | 0.0 | OnTintChanged |
Magenta to green. 0 is unchanged. | WhiteTint |
Caractéristiques d'injection :
- Insertion :
Scroll->AddChild(Row)— les widgets sont systématiquement ajoutés à la fin de la liste d'enfants deSettingsScrollBox. - Héritage du style :
LPColorGrade::FindLookinspecte les lignes existantes pour copier la police (Regular 20avec contour noir de 2 px) et le style Slate du curseur (FSliderStylecopié depuisSettingSlider). - Persistance : Écrit et relit
Saved/Config/Windows/LPColorGrade.ini(section[LPColorGrade]), sans aucune dépendance enversGameSettings.sav.
4. Relevé historique et analyse des modifications (Docs / Journal)
L'analyse de Docs/Migration/Journal_Modifications.md et des historiques de commits montre la genèse des réglages :
- CHG-156 (2026-10-05) : Ajout initial d'un bouton Clavier directement dans
SettingsScrollBox. - CHG-158 (2026-10-05) : Séparation en 6 onglets au-dessus de
SettingsScrollBoxviaLPSettingsSubsystem; les lignes existantes du Blueprint sont classées selon leur texte parCategoryOf. - CHG-159 (2026-10-05) : Bouton
Settingsréintégré au menu titre sousMod ManagerviaLPSettingsTitleButton. - CHG-160 (2026-10-05) : Ordre final des onglets (
General,Audio,Video,Keyboard,Lewd,Misc), renommage des libellés audio crus. - CHG-161 (2026-10-05) :
LPColorGradeSubsystem: correction de l'image brûlée/trop blanche via Color Grading natif Unreal (exposition et balance des blancs) plutôt qu'un pipeline externe. - CHG-163 (2026-10-05) : Harmonisation graphique des curseurs et polices sur
SettingSlider.
5. Cartographie exhaustive des lignes classées "Video"
L'inspection directe des binaires d'assets (MainMenu.uasset, SettingSlider.uasset, SettingCheckbox.uasset, GameSettings.uasset) permet d'établir la liste complète des widgets dirigés vers l'onglet Video :
| Nom widget UMG | Libellé affiché (SettingText / Text) |
Type UMG | Source | Mot-clé CategoryOf |
Rôle technique / Variable sous-jacente |
|---|---|---|---|---|---|
FullscreenButton (avec FullscreenText) |
Fullscreen (bascule Borderless Window / Windowed) |
UButton + UTextBlock |
BP (MainMenu) |
fullscreen, window |
Bascule le mode fenêtré (EWindowMode, GameUserSettings) |
PostProcessAAQuality |
AA Quality |
SettingSlider_C |
BP (MainMenu) |
quality |
Qualité de l'anti-aliasing (r.PostProcessAAQuality) |
PostProcessQuality |
PP Quality (FPS intensive) |
SettingSlider_C |
BP (MainMenu) |
quality, fps, depth of field (tooltip) |
Évolutivité post-traitement globale (sg.PostProcessQuality) |
ScreenPercentage |
Screen Percentage |
SettingSlider_C |
BP (MainMenu) |
screen, resolution (tooltip) |
Échelle de résolution 3D interne (r.ScreenPercentage) |
ShadowQuality |
Shadow Quality |
SettingSlider_C |
BP (MainMenu) |
shadow, quality, resolution (tooltip) |
Évolutivité des ombres (sg.ShadowQuality) |
ShowFPS |
Show FPS (Show Frame Per Second) |
SettingCheckbox_C |
BP (MainMenu) |
fps |
Affichage du compteur d'images/sec (stat FPS) |
ToonShading |
Toon Shading |
SettingCheckbox_C |
BP (MainMenu) |
toon |
Matériau de post-traitement Cel-Shading 2D |
Censore |
YouTube Censore |
SettingCheckbox_C |
BP (MainMenu) |
censor |
Pixellisation mosaïque de censure vidéo/SFW |
CPUSkinning |
Tick If Morphs Don't Work |
SettingCheckbox_C |
BP (MainMenu) |
morph |
Force le calcul des morph targets sur CPU (r.MorphTarget.Mode) |
DisableFurEffect |
Invisible Dog Fix |
SettingCheckbox_C |
BP (MainMenu) |
dog |
Contournement de rendu du pelage des chiens (cartes graphiques instables) |
SpinBoxPhysicsMult (avec TextBlock_13) |
Boob Jiggle Strength |
UHorizontalBox + USpinBox |
BP (MainMenu) |
jiggle |
Multiplicateur physique pour la dynamique secondaire de poitrine |
SpinBox_0 (avec TextBlock_14) |
Depth of Field Strength |
UHorizontalBox + USpinBox |
BP (MainMenu) |
depth of field |
Intensité du flou de profondeur de champ dans les chambres |
ShadeDepth (avec TextBlock_16) |
Toon Shade Depth |
UHorizontalBox + USpinBox |
BP (MainMenu) |
toon |
Seuil de profondeur pour le rendu Toon Shading |
NewAnimationsOnly (Cas litigieux) |
New Animations Only |
SettingCheckbox_C |
BP (MainMenu) |
quality (involontaire via tooltip) |
Conflit : Filtrage d'animations capturé par Video à cause de l'infobulle |
LPColorBrightness |
Brightness |
UHorizontalBox + USlider |
LPColor |
LPColor* (et brightness) |
Compensation d'exposition globale (AutoExposureBias) |
LPColorSaturation |
Saturation |
UHorizontalBox + USlider |
LPColor |
LPColor* |
Saturation colorimétrique (ColorSaturation) |
LPColorContrast |
Contrast |
UHorizontalBox + USlider |
LPColor |
LPColor* |
Contraste de l'image (ColorContrast) |
LPColorWhiteBalance |
White Balance |
UHorizontalBox + USlider |
LPColor |
LPColor* |
Température des blancs (WhiteTemp, Kelvin) |
LPColorTint |
Tint |
UHorizontalBox + USlider |
LPColor |
LPColor* |
Teinte magenta/vert (WhiteTint) |
6. Analyse des conflits potentiels
6.1 Conflit quality
- Faux-positif
NewAnimationsOnly:- Le widget
NewAnimationsOnlyest une option de gameplay/animation (« Avoid using the old converted animations... »). - Son infobulle se termine par : « For those that prefer quality to quantity. »
- Comme
RowTextagrège l'infobulle et quequalityest testé dansTabVideoavant le mot-cléanimationdeTabGeneral, cette case se retrouve classée à tort dans l'onglet Video !
- Le widget
- Ambiguïté sur les paramètres d'évolutivité (Scalability) :
- Les réglages BP existants utilisent
PP Quality(sg.PostProcessQuality) etAA Quality(r.PostProcessAAQuality). - L'introduction de nouveaux réglages
LPVideo*gérant la qualité globale (Overall Quality) ou d'autres sous-groupes (Texture Quality,Effects Quality,View Distance Quality) risque de créer une confusion ou une double commande avec les curseurs BP actuels.
- Les réglages BP existants utilisent
6.2 Conflit shadow
- Redondance directe sur la qualité des ombres :
- Le Blueprint fournit déjà
ShadowQuality(sg.ShadowQualityviaSettingSlider). - Si
LPVideo*injecte un curseur ou sélecteur d'ombres sans masquer ou synchroniser le widget BP existant, les deux widgets entreront en concurrence directe.
- Le Blueprint fournit déjà
- Homonymie
ShadeDepth:- Le widget
ShadeDepthporte le libelléToon Shade Depth. Bien qu'il contienne la racine shade, il est actuellement capté par le mot-clétoon. Il ne règle pas les ombres géométriques mais le seuil de découpe du cel-shading.
- Le widget
6.3 Conflit brightness
- Concurrence sur la luminosité et la luminance d'affichage :
LPColorBrightnessagit surAutoExposureBias(valeur neutre 0.0, plage [-2.0, 2.0]) dans un volume de post-traitement non borné.- Si
LPVideo*introduit un réglage standard de luminosité d'écran (ex. Gammar.Color.Mid, courbe de gamma d'affichage ou compensation d'exposition), il y aura un conflit de superposition avecLPColorBrightness. - Il conviendra soit de fusionner la notion d'exposition/luminosité sous une bannière unique, soit de clairement distinguer
Brightness (Exposition 3D)deGamma d'affichage.
7. Proposition d'emplacement d'injection pour LPVideo*
7.1 Recommandation : Injection AVANT LPColor*
L'injection des futurs composants LPVideo* doit se positionner AVANT les lignes LPColor*, pour les raisons suivantes :
-
Hiérarchie ergonomique standard de l'industrie :
- Dans tous les jeux vidéo modernes sous Unreal Engine, la structure conventionnelle du menu Vidéo / Affichage est :
- Affichage / Écran : Mode fenêtré, Résolution d'écran, VSync, Limite FPS.
- Qualité graphique / Évolutivité : Préréglage global, Échelle de rendu, Ombres, Post-traitement, Anti-Aliasing, Textures.
- Effets visuels spécifiques : Cel-Shading, Profondeur de champ, Flou de mouvement.
- Étalonnage / Colorimétrie (Calibration) : Luminosité/Exposition, Contraste, Saturation, Balance des blancs.
- Placer
LPColor*en queue de menu respecte cette logique naturelle où l'étalonnage colorimétrique constitue la section finale de réglage fin de l'image.
- Dans tous les jeux vidéo modernes sous Unreal Engine, la structure conventionnelle du menu Vidéo / Affichage est :
-
Cohérence d'implémentation technique :
LPColorGradeSubsystems'exécute déjà en ajoutant ses lignes à la fin (Scroll->AddChild(Row)).- En faisant injecter
LPVideo*en amont (soit au-dessus deLPColor*, soit à l'emplacement des curseurs BP queLPVideoviendra remplacer ou compléter),LPColor*conservera son statut naturel de bloc de calibration terminal. - Si des options BP existantes (
ShadowQuality,PostProcessQuality,PostProcessAAQuality,ScreenPercentage) sont retirées ou remplacées parLPVideo*, celles-ci doivent être masquées (SetVisibility(ESlateVisibility::Collapsed)) par le sous-système au moment de l'injection deLPVideo*.
8. Synthèse récapitulative
| Périmètre | Nombre de lignes | Origine | Statut |
|---|---|---|---|
| Réglages d'affichage BP | 1 (FullscreenButton) |
Blueprint MainMenu |
Valide, à conserver en tête de menu |
| Curseurs Scalability BP | 4 (ScreenPercentage, PostProcessQuality, PostProcessAAQuality, ShadowQuality) |
Blueprint MainMenu |
Fonctionnels mais redondants avec un futur menu vidéo complet |
| Cases à cocher / Effets BP | 4 (ShowFPS, ToonShading, Censore, CPUSkinning, DisableFurEffect) |
Blueprint MainMenu |
Spécifiques LifePlay, à conserver |
| SpinBoxes secondaires BP | 3 (Boob Jiggle Strength, Depth of Field Strength, Toon Shade Depth) |
Blueprint MainMenu |
Réglages visuels spécifiques |
| Faux-positif à corriger | 1 (NewAnimationsOnly) |
Blueprint MainMenu |
À reclasser dans TabGeneral (conflit mot-clé quality) |
| Lignes Color Grading C++ | 5 (LPColorBrightness, Saturation, Contrast, WhiteBalance, Tint) |
LPColorGradeSubsystem |
Valides, stables, à maintenir en bloc terminal |
Emplacement LPVideo* |
Nouveau bloc | LPVideo* (C++) |
À intercaler entre les réglages BP et le bloc LPColor* |