Add DA_RenderPipelineProfile and Platform Render Profiles documentation

- Introduced DA_RenderPipelineProfile data asset to define rendering pipeline configurations for various platforms and quality tiers.
- Documented enums, structs, variables, and default preset tables for render settings.
- Created a comprehensive developer guide for setting up platform-specific render profiles, including file structure, profile creation, and integration with upscalers.
- Included validation rules, console variable references, and testing matrices for ensuring compliance with platform requirements.
This commit is contained in:
Lefteris Notas
2026-05-22 18:10:24 +03:00
parent 14441c000c
commit dc9c1a6b98
19 changed files with 1449 additions and 83 deletions

View File

@@ -141,7 +141,7 @@ docs/
enhanced-input-system.md
bpc-statemanager.md # NEW — State Manager implementation checklist
```
**Total: 148 numbered Blueprint files + 5 enums + 5 Data Assets + 11 Data Table CSVs + TEMPLATE.md + AUDIT_REPORT.md + INDEX.md + 13 developer docs + 9 architecture docs + 1 audit report + 1 haptics game example = 193 files in 20 directory groups**
**Total: 149 numbered Blueprint files + 2 supplementary + 5 enums + 5 Data Assets + 11 Data Table CSVs + TEMPLATE.md + AUDIT_REPORT.md + INDEX.md + 13 developer docs + 9 architecture docs + 1 audit report + 1 haptics game example = 196 files in 20 directory groups**
## Naming Conventions
| Prefix | Type |
@@ -193,13 +193,14 @@ docs/
- **Phase 9:** Adaptive & Atmosphere (10-adaptive, 15 systems)
- **Phase 10:** Data Assets (14-data-assets, 16 systems)
- **Phase 11:** Meta/Progression (11-meta, 2 systems)
- **Phase 12:** Settings/Platform (12-settings, 3 systems — includes BPC_HapticsController 148)
- **Phase 12:** Settings/Platform (12-settings, 5 systems — includes BPC_HapticsController 148, BPC_RenderPipelineManager 149)
- **Phase 13:** Polish (13-polish, 9 systems)
- **Phase 14:** State Management (BPC_StateManager + 4 enums + 3 structs + DA_StateGatingTable — 130, 131)
- **Phase 15:** MetaSounds Audio (SS_AudioManager + BP_RoomAudioZone + DA_AudioSettings + DA_RoomAcousticPreset — 132-135)
- **Phase 16:** Multiplayer Networking — All systems updated with `HasAuthority()` gates, `Server_` RPCs, `RepNotify` handlers, and client prediction patterns. See [`docs/architecture/multiplayer-networking.md`](docs/architecture/multiplayer-networking.md).
- **Phase 17:** Planar Capture System — Mirrors, portals, monitors, horror surfaces. C++ core (136-138) + Blueprint actors (139-143) + Material/MPC (144-145) + Data Assets (146-147). See [`docs/architecture/planar-capture-system.md`](docs/architecture/planar-capture-system.md).
- **Phase 18:** Haptics Controller — BPC_HapticsController (148) for GameplayTag-driven force feedback, DualSense adaptive triggers, heartbeat pulse. See [`docs/blueprints/12-settings/148_BPC_HapticsController.md`](docs/blueprints/12-settings/148_BPC_HapticsController.md).
- **Phase 19:** Render Pipeline Manager — BPC_RenderPipelineManager (149) + DA_RenderPipelineProfile for per-platform quality presets, Lumen/Baked switching, upscaling (DLSS/FSR/PSSR), Nanite/LOD. Planar capture system integration. See [`docs/blueprints/12-settings/149_BPC_RenderPipelineManager.md`](docs/blueprints/12-settings/149_BPC_RenderPipelineManager.md) and [`docs/developer/platform-render-profiles.md`](docs/developer/platform-render-profiles.md).
## Key Communication Rules
1. Gameplay Tags + Subsystem lookup (global, decoupled)
@@ -256,4 +257,5 @@ No PR is accepted without these files being current. This ensures the animator,
- **Phase 14-15:** COMPLETE State Management (130-131) + MetaSounds Audio (132-135) blueprint specs created
- **Phase 16:** IN PROGRESS Multiplayer Networking: all 135 blueprint specs being updated with replication stubs, RPC definitions, and server-authoritative patterns. Developer docs updated. Architecture doc created at [`docs/architecture/multiplayer-networking.md`](docs/architecture/multiplayer-networking.md)
- **Phase 18:** COMPLETE Haptics Controller (148) blueprint spec created with full Manual Implementation Guide, DA_HapticProfile (121) enhanced, game example (`docs/game/haptics-example.md`) created. All developer docs and indexes updated.
- **Remaining:** Cross-reference pass across all 148 files; deprecated BPC_AudioAtmosphereController (95) references to update; Planar Capture System (Phase 17) C++ written, blueprint specs created, pending UE5 editor compile and BP child creation
- **Phase 19:** COMPLETE Render Pipeline Manager (149) + DA_RenderPipelineProfile created. Quality preset system with Lumen/Baked switching, per-platform profiles (PS5/PS4/Xbox/Switch/PC/SteamDeck), upscaling integration (DLSS/FSR/PSSR/TSR). Platform render profiles developer guide created. PlanarCapture system updated for pipeline compatibility. All docs updated.
- **Remaining:** Cross-reference pass across all 149 files; deprecated BPC_AudioAtmosphereController (95) references to update; Planar Capture System (Phase 17) C++ written, blueprint specs created, pending UE5 editor compile and BP child creation

View File

@@ -4113,9 +4113,11 @@ Build these first. Everything else depends on them.
✓ Physics drag/throw
✓ Subtitles + localisation hooks
✓ Hiding spots
✓ 16 Data Asset types (item, equipment, encounter, atmosphere, scare, haptic, etc.)
✓ 16 Data Asset types (item, equipment, encounter, atmosphere, scare, haptic, render pipeline, etc.)
✓ Server-authoritative multiplayer networking (HasAuthority gates, Server_ RPCs, RepNotify)
✓ Central state authority — systems never check each other directly
✓ Per-platform render pipeline (Lumen/Baked, Nanite/LOD, DLSS/FSR/TSR/PSSR upscaling)
✓ Quality preset system (Low→Cinematic) with platform-aware profiles
```
---
@@ -4123,5 +4125,5 @@ Build these first. Everything else depends on them.
*End of Reusable UE5 Modular Game Framework v2.0*
*Framework designed for generic use. All system names are project-agnostic.*
*Override in /Game/ folder. Never modify /Framework/ core assets.*
*C++ source: 22 classes in Source/PG_Framework/ | BP specs: 148 numbered files in docs/blueprints/*
*C++ source: 22 classes in Source/PG_Framework/ | BP specs: 149 numbered files + 2 supplementary in docs/blueprints/*
*Companion docs: docs/checklists/ (build order, status), docs/developer/ (per-category references), docs/architecture/ (state management, audio, networking, animation, sound)*

View File

@@ -2,20 +2,20 @@
**Parent:** `UUserWidget`
**Used by:** `SS_UIManager.PushMenu("SettingsMenu")`
**Depends On:** `SS_UIManager`, `SS_SettingsSystem`
**Depends On:** `SS_UIManager`, `SS_SettingsSystem`, `BPC_RenderPipelineManager`
---
### Purpose
Full settings screen with sections: Audio, Video/Graphics, Gameplay, Controls, Accessibility.
Full settings screen with tabs: Video/Graphics, Audio, Gameplay, Controls, Accessibility. The Video tab includes quality presets with platform-aware render pipeline options, upscaling configuration, individual feature toggles, and visual warnings for settings that require a level reload.
### Enums (local or global)
```cpp
```
E_SettingsTab
{
Audio,
Video,
Audio,
Gameplay,
Controls,
Accessibility
@@ -29,75 +29,215 @@ E_SettingsTab
| `ActiveTab` | `E_SettingsTab` | Currently visible tab |
| `TabButtons` | Array of `Button` | Tab navigation buttons |
| `TabPanels` | Array of `PanelWidget` | Tab content panels |
| `ReloadWarningBanner` | `Border` | Warning banner for reload-required settings |
**Audio Tab Children:**
---
### Video Tab Children (EXPANDED — was 5, now 25+)
**Quality Preset:**
| Name | Type | Description |
|------|------|-------------|
| `QualityPresetDropdown` | `ComboBoxString` | Low, Medium, High, Ultra, Cinematic, Custom |
| `PresetDescriptionText` | `RichTextBlock` | Describes what each preset changes |
| `ReloadWarningIcon` | `Image` | ⚠ icon visible when preset change requires reload |
**Display:**
| Name | Type | Description |
|------|------|-------------|
| `ResolutionScaleSlider` | `Slider` | 25%200% screen percentage |
| `ResolutionScaleValue` | `TextBlock` | Shows current % |
| `WindowModeDropdown` | `ComboBoxString` | Fullscreen, Windowed Fullscreen, Windowed |
| `VSyncToggle` | `CheckBox` | On/Off |
| `FrameRateLimitSlider` | `Slider` | 30240 FPS |
| `BrightnessSlider` | `Slider` | 0.52.0 gamma |
| `HDRToggle` | `CheckBox` | HDR output (if display supports) |
**Render Pipeline (⚠ reload required section):**
| Name | Type | Description |
|------|------|-------------|
| `GlobalIlluminationDropdown` | `ComboBoxString` | Lumen, Baked Lightmass, SSGI, Off |
| `ShadowMethodDropdown` | `ComboBoxString` | Virtual Shadow Maps, Cascaded, Distance Field, Off |
| `ReflectionMethodDropdown` | `ComboBoxString` | Lumen, Screen Space, Captures, Off |
| `MeshStrategyDropdown` | `ComboBoxString` | Nanite, Traditional LOD, Proxy Geometry |
| `PipelineReloadBanner` | `Border` | "These settings require a level transition to apply" |
**Upscaling:**
| Name | Type | Description |
|------|------|-------------|
| `UpscalerMethodDropdown` | `ComboBoxString` | TSR, DLSS, FSR, PSSR, XeSS, NIS, TAAU, Off |
| `UpscalerQualityDropdown` | `ComboBoxString` | Ultra Performance, Performance, Balanced, Quality, Ultra Quality |
| `DynamicResolutionToggle` | `CheckBox` | Enable dynamic resolution scaling |
| `DynamicResTargetSlider` | `Slider` | Target FPS for dynamic resolution |
**Scalability Sliders:**
| Name | Type | Description |
|------|------|-------------|
| `ShadowQualitySlider` | `Slider` | 0=NONE, 1=LOW, 2=MED, 3=HIGH, 4=EPIC |
| `TextureQualitySlider` | `Slider` | 03 |
| `PostProcessQualitySlider` | `Slider` | 03 |
| `ViewDistanceQualitySlider` | `Slider` | 03 |
| `FoliageQualitySlider` | `Slider` | 03 |
| `AntiAliasingQualitySlider` | `Slider` | 03 |
**Post-Process Toggles:**
| Name | Type | Description |
|------|------|-------------|
| `MotionBlurToggle` | `CheckBox` | On/Off |
| `DepthOfFieldToggle` | `CheckBox` | On/Off |
| `VolumetricCloudsToggle` | `CheckBox` | On/Off |
| `HWRTToggle` | `CheckBox` | Hardware Ray Tracing (⚠ reload) — only visible on supported platforms |
**Texture:**
| Name | Type | Description |
|------|------|-------------|
| `TexturePoolSizeSlider` | `Slider` | 5128192 MB |
**Actions:**
| Name | Type | Description |
|------|------|-------------|
| `ApplyButton` | `Button` | Apply all pending changes |
| `RevertButton` | `Button` | Revert to last applied state |
| `ResetDefaultsButton` | `Button` | Reset all video settings to platform defaults |
---
### Audio Tab Children
| Name | Type | Description |
|------|------|-------------|
| `MasterVolumeSlider` | `Slider` | 0-100 |
| `SFXVolumeSlider` | `Slider` | 0-100 |
| `MusicVolumeSlider` | `Slider` | 0-100 |
| `VoiceVolumeSlider` | `Slider` | 0-100 |
| `MasterVolumeSlider` | `Slider` | 0100 |
| `SFXVolumeSlider` | `Slider` | 0100 |
| `MusicVolumeSlider` | `Slider` | 0100 |
| `VoiceVolumeSlider` | `Slider` | 0100 |
| `AmbientVolumeSlider` | `Slider` | 0100 |
| `UIVolumeSlider` | `Slider` | 0100 |
| `SpatialAudioToggle` | `CheckBox` | On/Off |
| `AudioQualityDropdown` | `ComboBoxString` | Low, Medium, High |
| `SubtitlesToggle` | `CheckBox` | On/Off |
**Video Tab Children:**
| Name | Type | Description |
|------|------|-------------|
| `ResolutionDropdown` | `ComboBoxString` | Available resolutions |
| `WindowModeDropdown` | `ComboBoxString` | Fullscreen, Windowed, Borderless |
| `VSyncToggle` | `CheckBox` | On/Off |
| `QualityPresetDropdown` | `ComboBoxString` | Low, Medium, High, Epic |
| `BrightnessSlider` | `Slider` | 0.5-2.0 gamma |
**Gameplay Tab Children:**
### Gameplay Tab Children
| Name | Type | Description |
|------|------|-------------|
| `InvertYAxisToggle` | `CheckBox` | On/Off |
| `SensitivitySlider` | `Slider` | Mouse sensitivity 0.1-5.0 |
| `HoldDurationToggle` | `CheckBox` | Tap vs Hold for interactions |
| `AutoPickupToggle` | `CheckBox` | On/Off |
| `CrosshairToggle` | `CheckBox` | Show crosshair |
| `SensitivityXSlider` | `Slider` | Mouse sensitivity X |
| `SensitivityYSlider` | `Slider` | Mouse sensitivity Y |
| `FOVSlider` | `Slider` | 70120 degrees |
| `HeadBobToggle` | `CheckBox` | Camera head bob |
| `AutoPickupToggle` | `CheckBox` | Auto-pickup items |
| `CrosshairTypeDropdown` | `ComboBoxString` | Default, Dot, Cross, Off |
**Controls Tab Children:**
### Controls Tab Children
| Name | Type | Description |
|------|------|-------------|
| `ActionMappingsList` | `ListView` | Key binding rows |
| `ResetDefaultsButton` | `Button` | Reset all bindings |
**Accessibility Tab Children:**
### Accessibility Tab Children
| Name | Type | Description |
|------|------|-------------|
| `SubtitleSizeDropdown` | `ComboBoxString` | Small, Medium, Large |
| `SubtitleBackgroundOpacity` | `Slider` | 0-100% |
| `SubtitleBackgroundOpacity` | `Slider` | 0100% |
| `ColorblindModeDropdown` | `ComboBoxString` | None, Protanopia, Deuteranopia, Tritanopia |
| `HighContrastUIToggle` | `CheckBox` | On/Off |
| `CameraShakeIntensity` | `Slider` | 0-100% |
| `MotionBlurToggle` | `CheckBox` | On/Off |
| `CameraShakeIntensity` | `Slider` | 0100% |
| `ScreenShakeToggle` | `CheckBox` | Enable/disable screen shake |
| `ReducedMotionToggle` | `CheckBox` | Reduce UI animations |
| `LargeTextToggle` | `CheckBox` | Enlarge all UI text |
| `TextToSpeechToggle` | `CheckBox` | TTS for UI elements |
| `DisableFlashToggle` | `CheckBox` | Prevent strobe effects |
| `HapticsEnabledToggle` | `CheckBox` | Enable controller vibration |
| `HapticsIntensitySlider` | `Slider` | Vibration intensity 0100% |
| `AdaptiveTriggersToggle` | `CheckBox` | PS5 DualSense adaptive triggers |
| `ControllerSpeakerToggle` | `CheckBox` | PS5 controller speaker |
---
### Functions
| Name | Inputs | Outputs | Description |
|------|--------|---------|-------------|
| `OnConstruct` | — | — | Populate dropdowns from system, load saved settings |
| `OnConstruct` | — | — | Populate dropdowns, load saved settings, query available upscalers |
| `SwitchTab` | Tab: `E_SettingsTab` | — | Show selected panel, hide others |
| `OnQualityPresetChanged` | NewPreset: Name | — | Update all controls to reflect preset, show reload warning if needed |
| `OnPipelineSettingChanged` | SettingName: Name | — | Show reload banner if setting requires level reload |
| `OnSettingChanged` | SettingName: FName, Value: Generic | — | Write to SS_SettingsSystem |
| `SaveSettings` | — | — | SS_SettingsSystem.SaveToDisk |
| `ApplyVideoSettings` | — | — | Apply resolution, window mode, quality |
| `ResetToDefaults` | — | — | Load default values, re-populate UI |
| `ApplyVideoSettings` | — | — | SS_SettingsSystem.ApplyGraphicsSettings → BPC_RenderPipelineManager |
| `ResetToDefaults` | — | — | Load platform defaults, re-populate UI |
| `OnBack` | — | — | SaveSettings, SS_UIManager.PopMenu |
| `RebindKey` | ActionName: FName | — | Listen for next key press, map to action |
| `QueryAvailableUpscalers` | — | TArray<E_UpscalerMethod> | Calls BPC_RenderPipelineManager.GetAvailableUpscalers() |
| `ShowReloadWarning` | — | — | Display "⚠ Some settings will apply on next level load" banner |
| `HideReloadWarning` | — | — | Dismiss the reload warning banner |
| `UpdatePresetDescription` | Preset: Name | — | Show FPS target, resolution, GI method for preset |
| `OnHoverSetting` | SettingName: Name | — | Show tooltip explaining what this setting does |
| `RevertToApplied` | — | — | Revert UI controls to last-applied state |
---
### Quality Preset Descriptions (shown in `PresetDescriptionText`)
| Preset | Description |
|--------|-------------|
| **Low** | Performance mode. Baked lighting, CSM shadows, LOD meshes. Target: 60 FPS on consoles, 120 FPS on PC. |
| **Medium** | Balanced. Lumen Low GI, VSM shadows, Nanite enabled, TSR upscaling. Target: 60 FPS. |
| **High** | Quality mode. Full Lumen GI, high-quality VSM, Nanite, DLSS/FSR Quality upscaling. Target: 60 FPS. |
| **Ultra** | Maximum fidelity. Lumen Ultra, full VSM, Nanite, DLSS/PSSR upscaling. Target: 60 FPS (30 on base consoles). |
| **Cinematic** | Cinematic quality. Lumen + HWRT, path tracing available, highest upscaling quality. Target: 30 FPS. |
| **Custom** | Manually configured settings. Performance impact varies. |
---
### Communications With
| Target System | Method | Why |
|--------------|--------|-----|
| [`SS_UIManager`](44_SS_UIManager.md) | Push/Pop | Menu lifecycle |
| `SS_SettingsSystem` | Function calls | Read/write settings |
| `SS_SettingsSystem` | Function calls | Read/write all settings |
| `BPC_RenderPipelineManager` (149) | Function calls | Query available upscalers, check reload requirements |
### Blueprint Flow — Video Tab
```
[OnConstruct]
├─ Populate QualityPresetDropdown
├─ Read SS_SettingsSystem.GetSettingFloat("QualityPreset") → set dropdown
├─ Call BPC_RenderPipelineManager.GetAvailableUpscalers() → populate upscaler dropdown
│ └─ Filter: only show upscalers supported on this platform
├─ Read all saved settings from SS_SettingsSystem → populate sliders/toggles
└─ Call UpdatePresetDescription based on active preset
[OnQualityPresetChanged(NewPreset)]
├─ Call BPC_RenderPipelineManager.RequiresReloadForPresetChange(NewPreset)
├─ If TRUE: ShowReloadWarning()
├─ If FALSE: HideReloadWarning()
├─ Set all sliders/toggles to match the preset defaults
├─ UpdatePresetDescription(NewPreset)
└─ SS_SettingsSystem.SetSettingDropdown("QualityPreset", NewPreset)
[OnPipelineSettingChanged(SettingName)]
├─ Check if setting is in "reload required" list:
│ [GlobalIllumination, ShadowMethod, ReflectionMethod, MeshStrategy, HWRT]
├─ If changed from current: ShowReloadWarning()
└─ Else: HideReloadWarning()
[ApplyVideoSettings]
├─ SS_SettingsSystem.ApplyGraphicsSettings()
├─ If reload warning visible AND game is in session:
│ └─ SS_SettingsSystem.SaveSettings()
│ └─ Show notification: "Settings applied. Render pipeline changes will take effect on next level load."
├─ Else if in Main Menu:
│ └─ Apply immediately (no reload needed for menu)
└─ HideReloadWarning()
```
### Reuse Notes
- The tab panel pattern can be extended for mod settings or developer menus by adding new tab entries
- Split from original bundled `36_WBP_MenuWidgets.md` per Clean Slate refactoring plan
- All controls marked `⚠ reload` call `OnPipelineSettingChanged` to show the warning banner
- The Video tab queries `BPC_RenderPipelineManager` at construction to know which upscalers are available
- Preset selection acts as a "quick-config" — sets all sliders/toggles to preset defaults, then user can fine-tune
- When Custom preset is selected, all individual controls are enabled; other presets lock controls to their defaults

View File

@@ -8,6 +8,8 @@
`ActorComponent`
### Dependencies
- [`BPC_RenderPipelineManager`](../12-settings/149_BPC_RenderPipelineManager.md) — **Delegates all CVar application** (GI, shadows, upscaling, Nanite, quality tiers)
- [`DA_RenderPipelineProfile`](../14-data-assets/DA_RenderPipelineProfile.md) — Reads render config per platform + quality tier
- [`BPC_LightingManager`](65_BPC_LightingManager.md) — Controls light quality
- [`BPC_AudioManager`](66_BPC_AudioManager.md) — Controls audio quality
- [`BPC_VFXManager`](67_BPC_VFXManager.md) — Controls particle LOD
@@ -16,7 +18,7 @@
- [`GI_GameFramework`](../01-core/04_GI_GameFramework.md) — Frame time measurement
### Purpose
Automatically adjusts graphics, audio, and gameplay quality settings based on real-time performance metrics (frame time, draw calls, memory usage). Provides a unified interface for all other systems to scale their quality without direct awareness of the hardware. Supports manual user override via Settings menu and adaptive automatic mode. Maintains a performance budget that is dynamically allocated across subsystems.
Automatically adjusts rendering, audio, and gameplay quality settings based on real-time performance metrics (frame time, draw calls, memory usage). **Delegates all render pipeline CVar changes to `BPC_RenderPipelineManager`** — this component focuses on monitoring performance and deciding WHEN to change quality tiers. The RenderPipelineManager handles the HOW (which CVars to execute, whether a reload is needed). Supports manual user override via Settings menu and adaptive automatic mode. Maintains a performance budget that is dynamically allocated across subsystems.
### Enums
@@ -128,13 +130,15 @@ Automatically adjusts graphics, audio, and gameplay quality settings based on re
└─► If CurrentQualityLevel == Level: return
└─► TargetQualityLevel = Level
└─► bIsScalingInProgress = true
└─► ApplyScalerSettings(Level)
└─► For each subsystem:
BPC_LightingManager: SetParticleLOD mapped to QualityLevel
└─► Delegate to BPC_RenderPipelineManager.ApplyQualityPreset(PresetName)
→ RenderPipelineManager handles ALL CVar application
→ Reads DA_RenderPipelineProfile for current platform
→ Returns whether reload is required
└─► For each non-render subsystem:
BPC_LightingManager: Reduce dynamic light count
BPC_AudioManager: Reduce active layers and spatial audio
BPC_VFXManager: SetParticleLOD mapped to QualityLevel
BPC_AtmosphereController: Reduce preset complexity
└─► Apply UE console variables for resolution, shadows, textures, foliage
└─► bIsScalingInProgress = false
└─► CurrentQualityLevel = TargetQualityLevel
└─► OnQualityLevelChanged.Broadcast(CurrentQualityLevel)
@@ -215,6 +219,7 @@ Automatically adjusts graphics, audio, and gameplay quality settings based on re
| Target | Method | Why |
|--------|--------|-----|
| [`BPC_RenderPipelineManager`](../12-settings/149_BPC_RenderPipelineManager.md) | Direct call | **All render CVar application** — delegates quality tier to pipeline manager |
| [`GI_GameFramework`](../01-core/04_GI_GameFramework.md) | Direct call | Frame time data source |
| [`SS_SaveManager`](../05-saveload/28_SS_SaveManager.md) | Direct call | Save/load settings |
| [`BPC_LightingManager`](65_BPC_LightingManager.md) | Get from player | Light quality reduction |

View File

@@ -9,7 +9,7 @@
### Dependencies
- [`GI_GameFramework`](../01-core/04_GI_GameFramework.md) — Game instance reference
- [`BPC_PerformanceScaler`](../10-adaptive/69_BPC_PerformanceScaler.md) — Quality settings bridge
- [`BPC_RenderPipelineManager`](149_BPC_RenderPipelineManager.md) — Quality pipeline bridge (NEW)
- [`SS_SaveManager`](../05-saveload/28_SS_SaveManager.md) — Persist settings
- [`WBP_SettingsUI`](../06-ui/44_WBP_SettingsUI.md) — UI to read/write settings
@@ -116,8 +116,9 @@ Centralized settings manager that stores, applies, and persists all player-confi
[ApplySettings]
└─► ApplyGraphicsSettings():
Get "ResolutionScale", "ShadowQuality", etc.
Pass to BPC_PerformanceScaler.SetQualityLevel
Get "QualityPreset", "ResolutionScale", "UpscalerMethod", etc.
Pass to BPC_RenderPipelineManager.ApplyQualityPreset(QualityPreset)
→ RenderPipelineManager handles ALL CVars, reload detection, platform selection
└─► ApplyAudioSettings():
Get "MasterVolume", "SFXVolume", etc.
Pass to BPC_AudioManager volume modifiers
@@ -146,18 +147,31 @@ Centralized settings manager that stores, applies, and persists all player-confi
[RegisterDefaultSettings]
└─► Graphics category:
ResolutionScale Float 1.0 [0.51.5]
ShadowQuality Int 2 [03]
TextureQuality Int 2 [03]
PostProcessQuality Int 2 [03]
AntiAliasing Dropdown [TSR, TAA, FXAA, Off]
VSync Bool true
FrameRateLimit Int 60 [30240]
GlobalIllumination Dropdown [Lumen, SSGI, Off]
MotionBlur Bool true
DepthOfField Bool true
FoliageQuality Int 2 [03]
ViewDistance Int 2 [03]
QualityPreset Dropdown [Low, Medium, High, Ultra, Cinematic, Custom]
GlobalIllumination Dropdown [Lumen, Baked, SSGI, Off] ⚠ reload
ShadowMethod Dropdown [VSM, CSM, DFShadows, Off] ⚠ reload
ReflectionMethod Dropdown [Lumen, SSR, Captures, Off] ⚠ reload
MeshStrategy Dropdown [Nanite, LOD, Proxy] ⚠ reload
UpscalerMethod Dropdown [TSR, DLSS, FSR, PSSR, XeSS, NIS, TAAU, Off]
UpscalerQuality Dropdown [UltraPerf, Perf, Balanced, Quality, UltraQuality]
ResolutionScale Float 1.0 [0.252.0]
DynamicResolution Bool false
DynamicResTargetFPS Int 60 [30120]
ShadowQuality Int 2 [04]
TextureQuality Int 2 [03]
PostProcessQuality Int 2 [03]
ViewDistanceQuality Int 2 [03]
FoliageQuality Int 2 [03]
AntiAliasingQuality Int 2 [03]
VSync Bool true
FrameRateLimit Int 60 [30240]
MotionBlur Bool true
DepthOfField Bool true
VolumetricClouds Bool true
HW_RayTracing Bool false ⚠ reload
Brightness Float 1.0 [0.52.0]
HDR Bool false (if display supports)
TexturePoolSizeMB Int 2048 [5128192]
└─► Audio category:
MasterVolume Float 1.0 [01]
SFXVolume Float 1.0 [01]
@@ -205,7 +219,8 @@ Centralized settings manager that stores, applies, and persists all player-confi
| Target | Method | Why |
|--------|--------|-----|
| [`BPC_PerformanceScaler`](../10-adaptive/69_BPC_PerformanceScaler.md) | Cast to player | Graphics settings |
| [`BPC_RenderPipelineManager`](149_BPC_RenderPipelineManager.md) | Direct call | Graphics pipeline settings |
| [`BPC_PerformanceScaler`](../10-adaptive/69_BPC_PerformanceScaler.md) | Direct call | Adaptive quality bridging |
| [`BPC_AudioManager`](../10-adaptive/66_BPC_AudioManager.md) | Cast to player | Audio settings |
| [`BPC_Movement`](../02-player/14_BPC_Movement.md) | Cast to player | Gameplay settings |
| [`SS_SaveManager`](../05-saveload/28_SS_SaveManager.md) | Direct call | Persistence |

View File

@@ -0,0 +1,432 @@
# 149 — Render Pipeline Manager (`BPC_RenderPipelineManager`)
> **Blueprint-Only Implementation** — UE 5.55.7 supports all render pipeline configuration from Blueprints via `Execute Console Command` and `UGameUserSettings` API calls. This component wraps the complexity of per-platform render pipeline selection, upscaler configuration, and pre-level-load CVar application behind a simple `ApplyQualityPreset(PresetName)` interface.
---
## Purpose
Central authority for render pipeline configuration. Reads `DA_RenderPipelineProfile` Data Assets to determine the appropriate rendering method (Lumen vs Baked Lightmass), shadow system (VSM vs CSM), upscaler (DLSS/FSR/TSR/PSSR), and mesh strategy (Nanite vs LOD) for the current platform and quality preset. Applies settings via UE5 console variables, coordinates with `BPC_PerformanceScaler` for runtime quality tier adjustments, and broadcasts pipeline changes so dependent systems (Planar Capture, Audio, UI) can adapt.
## Dependencies
- **Requires:** [`DA_RenderPipelineProfile`](../14-data-assets/DA_RenderPipelineProfile.md) (render configs), [`SS_SettingsSystem`](105_SS_SettingsSystem.md) (saved quality preferences), [`GI_GameFramework`](../01-core/04_GI_GameFramework.md) (game phase for pre-load apply)
- **Required By:** [`BPC_PerformanceScaler`](../10-adaptive/91_BPC_PerformanceScaler.md) (delegates CVar application), [`SS_PlanarCaptureManager`](../17-capture/138_SS_PlanarCaptureManager.md) (capture quality cap on pipeline change), [`WBP_SettingsMenu`](../06-ui/57_WBP_SettingsMenu.md) (Video tab quality controls)
- **Engine/Plugin Requirements:** DLSS Plugin (optional), FSR Plugin (optional), XeSS Plugin (optional), GameplayTags, Enhanced Input
## Class Info
| Property | Value |
|----------|-------|
| **Parent Class** | `ActorComponent` |
| **Class Type** | Blueprint Component |
| **Asset Path** | `Content/Framework/Settings/BPC_RenderPipelineManager` |
| **Implements Interfaces** | None |
| **Attachment** | Player Controller (`PC_CoreController`) |
---
## 1. Enums
*See [`DA_RenderPipelineProfile`](../14-data-assets/DA_RenderPipelineProfile.md) for: `ERenderPipelineMethod`, `EShadowMethod`, `EReflectionMethod`, `EUpscalerMethod`, `EMeshStrategy`, `EPlatformFamily`.*
### `ERenderPipelineChangeType`
| Value | Description |
|-------|-------------|
| `NonDestructive = 0` | Change is safe at runtime (resolution, texture quality, FPS cap) |
| `RequiresLevelReload = 1` | Change requires reloading the current level (GI method, Nanite, shadow method) |
| `RequiresEngineRestart = 2` | Change requires full engine restart (HWRT toggle on some platforms) |
---
## 2. Structs
### `SActivePipelineState`
| Field | Type | Description |
|-------|------|-------------|
| `Platform` | `EPlatformFamily` | Detected platform |
| `ActivePreset` | `FName` | Currently applied quality preset name |
| `PendingPreset` | `FName` | Queued preset awaiting reload |
| `ActivePipelineProfile` | `DA_RenderPipelineProfile` | Currently loaded profile Data Asset |
| `bPipelineApplied` | `bool` | Whether full pipeline has been applied |
| `bPendingReloadRequired` | `bool` | Whether a level reload is needed to apply changes |
| `AppliedConfig` | `SRenderPipelineConfig` | Currently active render config values |
---
## 3. Variables
### Configuration (Instance Editable)
| Variable | Type | Default | Category | Description |
|----------|------|---------|----------|-------------|
| `PlatformProfileMap` | `TMap<EPlatformFamily, DA_RenderPipelineProfile>` | `Empty` | `Config` | One Data Asset per platform family |
| `DefaultQualityPreset` | `FName` | `Medium` | `Config` | Preset to use on first launch |
| `bApplyPipelineOnBeginPlay` | `bool` | `true` | `Config` | Automatically apply pipeline on BeginPlay |
| `bAutoDetectPlatform` | `bool` | `true` | `Config` | Auto-detect platform at startup |
### Internal (Private)
| Variable | Type | Default | Category | Description |
|----------|------|---------|----------|-------------|
| `ActivePipeline` | `DA_RenderPipelineProfile` | `None` | `State` | Currently active profile |
| `ActiveState` | `SActivePipelineState` | — | `State` | Full current pipeline state |
| `DetectedPlatform` | `EPlatformFamily` | `PC_High` | `State` | Auto-detected platform |
| `bIsInitialized` | `bool` | `false` | `State` | Whether Initialize completed |
| `CachedPlayerController` | `APlayerController` | `None` | `Cache` | Owner PC reference |
| `bReloadNeededOnNextLevel` | `bool` | `false` | `State` | Reload flag for next level load |
---
## 4. Functions
### Public Functions
#### `Initialize` → `void`
- **Description:** Detects platform, loads the appropriate `DA_RenderPipelineProfile`, reads saved quality from `SS_SettingsSystem`, and applies initial pipeline settings.
- **Flow:**
1. Get Owner → Cast to PlayerController → cache
2. If `bAutoDetectPlatform`: call `DetectPlatform()` → set `DetectedPlatform`
3. Lookup `DA_RenderPipelineProfile` from `PlatformProfileMap` by `DetectedPlatform`
4. If not found: log error, fallback to `PC_High` profile
5. Read `SS_SettingsSystem.GetSettingFloat("QualityPreset")` → resolve preset name
6. If no saved setting: use `DefaultQualityPreset`
7. Call `ApplyQualityPreset(PresetName)`
8. Bind to `SS_SettingsSystem.OnSettingChanged` → listen for quality changes
9. Bind to `GI_GameFramework.OnGamePhaseChanged` → apply pending reloads on level change
10. Set `bIsInitialized = true`
11. Broadcast `OnPipelineManagerInitialized`
#### `ApplyQualityPreset` → `ERenderPipelineChangeType`
- **Description:** Apply a quality preset by name. Returns whether a level reload is needed.
- **Parameters:**
| Param | Type | Description |
|-------|------|-------------|
| `PresetName` | `FName` | Quality preset to apply ("Low", "Medium", "High", "Ultra", "Cinematic") |
| `bForceApply` | `bool` | Force re-apply even if already active |
- **Flow:**
1. Validate `bIsInitialized` and `ActivePipeline` is valid
2. Lookup `SRenderPipelineConfig` from `ActivePipeline.QualityPresets[PresetName]`
3. If not found: log error, return
4. Compare with `ActiveState.AppliedConfig`:
- If identical and not `bForceApply`: return `NonDestructive`
5. Determine change type:
- If `GIMethod`, `ShadowMethod`, or `MeshStrategy` changed → `RequiresLevelReload`
- Otherwise → `NonDestructive`
6. If `RequiresLevelReload` and game is mid-session:
- Store as `PendingPreset`, set `bReloadNeededOnNextLevel = true`
- Show UI notification "Settings will apply on next level load"
- Broadcast `OnPipelineReloadRequired`
- Return `RequiresLevelReload`
7. If safe to apply now: call `ApplyRenderConfig(PresetName, Config)`
8. Save to `SS_SettingsSystem.SetSetting("QualityPreset", PresetName)`
9. Broadcast `OnRenderPipelineChanged(PresetName, ChangeType)`
10. Return change type
#### `ApplyRenderConfig` → `void`
- **Description:** Executes console commands to apply a render configuration immediately.
- **Parameters:**
| Param | Type | Description |
|-------|------|-------------|
| `PresetName` | `FName` | Preset being applied |
| `Config` | `SRenderPipelineConfig` | Configuration to apply |
- **Flow:**
1. Execute console commands for GI method:
```
ExecuteConsoleCommand("r.DynamicGlobalIlluminationMethod {GIMethod}")
ExecuteConsoleCommand("r.Lumen.DiffuseIndirect.Allow {LumenAllowed}")
```
2. Execute shadow commands:
```
ExecuteConsoleCommand("r.Shadow.Virtual.Enable {VSMEnabled}")
ExecuteConsoleCommand("sg.ShadowQuality {ShadowQuality}")
```
3. Execute upscaling commands:
```
ExecuteConsoleCommand("r.ScreenPercentage {ResolutionScale*100}")
ExecuteConsoleCommand("r.TemporalAA.Upsampling {TSREnabled}")
// DLSS/FSR plugin-specific commands
```
4. Execute mesh/Nanite commands:
```
ExecuteConsoleCommand("r.Nanite {NaniteEnabled}")
ExecuteConsoleCommand("r.StaticMeshLODDistanceScale {LODScale}")
```
5. Execute scalability groups:
```
ExecuteConsoleCommand("sg.TextureQuality {TextureQuality}")
ExecuteConsoleCommand("sg.PostProcessQuality {PostProcessQuality}")
ExecuteConsoleCommand("sg.ViewDistanceQuality {ViewDistanceQuality}")
ExecuteConsoleCommand("sg.FoliageQuality {FoliageQuality}")
ExecuteConsoleCommand("sg.AntiAliasingQuality {AntiAliasingQuality}")
```
6. Execute post-process toggles:
```
ExecuteConsoleCommand("r.MotionBlurQuality {MotionBlur}")
ExecuteConsoleCommand("r.DepthOfFieldQuality {DoF}")
```
7. Execute platform-specific overrides from `SPlatformRenderDefaults.ConsoleVariables`
8. Set `ActiveState.AppliedConfig = Config`
9. Set `ActiveState.ActivePreset = PresetName`
10. Set `bReloadNeededOnNextLevel = false`
#### `ApplyPendingReload` → `void`
- **Description:** Called on level transition or game restart. Applies queued pipeline changes.
- **Flow:**
1. If `bReloadNeededOnNextLevel == false`: return
2. Get `SRenderPipelineConfig` for `ActiveState.PendingPreset`
3. Call `ApplyRenderConfig(PendingPreset, Config)`
4. Broadcast `OnRenderPipelineChanged(PendingPreset, RequiresLevelReload)`
#### `DetectPlatform` → `EPlatformFamily`
- **Description:** Auto-detect the current platform and GPU capability.
- **Flow:**
1. Check `UGameplayStatics::GetPlatformName()`:
- "PS5" → detect if Pro → `PS5_Pro` or `PS5`
- "PS4" → `PS4`
- "XboxOne" → `Xbox_One`
- "XSX" or "XboxSeries" → `Xbox_Series`
- "Switch" → `Switch`
- "Win64" → check GPU:
```cpp
IPlatformFile& PlatformFile = FPlatformFileManager::GetPlatformFile();
// Check GPU name via GRHIAdapterName
// RTX 2000+ / RX 6000+ → PC_High
// GTX 9001600 / iGPU → PC_Low
```
2. Store result in `DetectedPlatform`
3. Return platform
#### `SetUpscalerMethod` → `void`
- **Description:** Override the upscaler independently of quality preset.
- **Parameters:** `Method` (EUpscalerMethod), `Quality` (int32)
- **Flow:** Updates only the upscaler CVars without touching other settings.
#### `GetActiveUpscaler` → `EUpscalerMethod`
- **Description:** Returns the currently active upscaler. Read-only.
#### `GetActivePipelineConfig` → `SRenderPipelineConfig`
- **Description:** Returns a copy of the currently applied render config. Read-only.
#### `IsNaniteEnabled` → `bool`
- **Description:** Quick check if Nanite is currently active.
#### `IsLumenEnabled` → `bool`
- **Description:** Quick check if Lumen GI is currently active.
#### `RequiresReloadForPresetChange` → `bool`
- **Description:** Check if switching from current preset to a new one would require a level reload.
- **Parameters:** `NewPresetName` (FName)
#### `GetAvailableUpscalers` → `TArray<EUpscalerMethod>`
- **Description:** Returns which upscalers are available (based on installed plugins + platform).
#### `SetDynamicResolutionTarget` → `void`
- **Description:** Enable/disable dynamic resolution scaling.
- **Parameters:** `TargetFrameTimeMs` (float), `bEnabled` (bool)
---
## 5. Event Dispatchers
| Dispatcher | Parameters | Bind Access | Description |
|------------|-----------|-------------|-------------|
| `OnPipelineManagerInitialized` | — | `Public` | Fired after Initialize completes |
| `OnRenderPipelineChanged` | `FName PresetName`, `ERenderPipelineChangeType ChangeType` | `Public` | Fired when pipeline configuration changes |
| `OnPipelineReloadRequired` | `FName PendingPreset` | `Public` | Fired when a change requires level reload — UI shows warning |
| `OnPipelineApplied` | `FName PresetName` | `Public` | Fired after all CVars have been executed |
| `OnUpscalerChanged` | `EUpscalerMethod NewMethod`, `int32 Quality` | `Public` | Fired when upscaler is changed |
| `OnPlatformDetected` | `EPlatformFamily Platform` | `Public` | Fired after platform detection |
---
## 6. Overridden Events
### Event: `BeginPlay`
- **Description:** Startup. Calls `Initialize()` then conditionally applies pipeline.
- **Flow:**
1. Call `Initialize()`
2. If `bApplyPipelineOnBeginPlay`: apply the default/saved preset
3. If game phase is `MainMenu` (not in-game): pipeline can be applied immediately (no reload warning needed)
### Event: `OnGamePhaseChanged` (bound to `GI_GameFramework`)
- **Description:** When transitioning from MainMenu to InGame or between levels, apply any pending pipeline changes.
- **Flow:**
1. If `bReloadNeededOnNextLevel`: call `ApplyPendingReload()`
2. Notify `SS_PlanarCaptureManager` of new pipeline state
---
## 7. Blueprint Graph Logic Flow
```mermaid
flowchart TD
A[BeginPlay / GI_GameFramework.OnGamePhaseChanged] --> B[Initialize]
B --> C[DetectPlatform]
C --> D[Load DA_RenderPipelineProfile for platform]
D --> E[Read saved QualityPreset from SS_SettingsSystem]
E --> F[ApplyQualityPreset PresetName]
G[User changes quality in settings] --> H[WBP_SettingsMenu → SS_SettingsSystem.SetSetting]
H --> I[SS_SettingsSystem.OnSettingChanged → BPC_RenderPipelineManager]
I --> J[ApplyQualityPreset NewPresetName]
J --> K{NonDestructive?}
K -->|Yes| L[ApplyRenderConfig immediately]
K -->|No - Needs Reload| M[Store as PendingPreset]
M --> N[Show UI Warning: 'Settings apply on next level']
M --> O[Broadcast OnPipelineReloadRequired]
L --> P[Broadcast OnRenderPipelineChanged]
Q[Level Transition / GamePhase change] --> R{Reload pending?}
R -->|Yes| S[ApplyPendingReload]
S --> T[ApplyRenderConfig with pending preset]
T --> P
P --> U[Notify SS_PlanarCaptureManager]
U --> V[PlanarCapture: adjust GlobalQualityCap]
```
---
## 8. Communication Matrix
| Who Talks | How | What Is Sent |
|-----------|-----|-------------|
| `WBP_SettingsMenu` | `Indirect (SS_SettingsSystem)` | User selects quality preset → `SetSetting("QualityPreset", "High")` |
| `SS_SettingsSystem` | `Dispatcher` | `OnSettingChanged("QualityPreset")` → `BPC_RenderPipelineManager.ApplyQualityPreset()` |
| `BPC_PerformanceScaler` | `Function Call` | `BPC_RenderPipelineManager.ApplyQualityPreset()` for adaptive scaling |
| `BPC_RenderPipelineManager` | `Dispatcher` | `OnRenderPipelineChanged(PresetName)` → `SS_PlanarCaptureManager.AdjustGlobalQualityCap()` |
| `BPC_RenderPipelineManager` | `Dispatcher` | `OnPipelineReloadRequired(PendingPreset)` → `WBP_SettingsMenu.ShowReloadWarning()` |
| `SS_PlanarCaptureManager` | `Function Call` | `BPC_RenderPipelineManager.IsLumenEnabled()` — adjusts capture Lumen budget |
| `WBP_NotificationToast` | `Dispatcher` | `OnPipelineReloadRequired` → show "Settings will apply on next area" toast |
| `BPC_AudioAtmosphereController` | `Dispatcher` | `OnRenderPipelineChanged` → adjust audio quality budget |
---
## 9. Integration with Planar Capture System
When `BPC_RenderPipelineManager` applies a render pipeline change:
1. If Lumen is **disabled** (baked lightmass mode):
- `SS_PlanarCaptureManager` auto-caps `GlobalQualityCap` to `Medium` (no Hero tier Lumen captures)
- All `BPC_PlanarCapture` instances set `bEnableLumen = false` on their quality profiles
- Capture frame budget is increased (no Lumen overhead → can run more captures at higher FPS)
2. If Nanite is **disabled** (traditional LOD mode):
- Captures render faster (no Nanite rasterization overhead in capture pass)
- `SS_PlanarCaptureManager` can increase `GlobalQualityCap` by one tier
3. If upscaler is **active** (DLSS/FSR/TSR):
- Main view renders at lower internal resolution
- Planar captures render at configured quality tier resolution (independent of upscaler)
4. `BPC_PlanarCapture.ApplyQualityTier()` checks `BPC_RenderPipelineManager.IsLumenEnabled()`:
```
If !IsLumenEnabled() AND profile.bEnableLumen:
Force bEnableLumen = false // Prevent capture from trying to enable Lumen
```
---
## 10. Validation / Testing Checklist
- [ ] `DetectPlatform` correctly identifies PS5, PS4, Xbox Series, Xbox One, PC_High, PC_Low
- [ ] `ApplyQualityPreset("Low")` sets GI to None/Baked, switches to CSM, disables Nanite
- [ ] `ApplyQualityPreset("High")` sets GI to Lumen, switches to VSM, enables Nanite
- [ ] Switching from High→Low mid-game shows "requires level reload" warning
- [ ] Switching from High→Low in Main Menu applies immediately (no warning needed)
- [ ] Switching Low→High mid-game: PendingPreset stored, applies on next level load
- [ ] Planar capture budget adjusts: lower cap when Lumen is on, higher when off
- [ ] DLSS is available on PC_High with NVIDIA GPU — shows in `GetAvailableUpscalers()`
- [ ] FSR is available on all platforms — always in available list
- [ ] PSSR only available when `DetectedPlatform == PS5_Pro`
- [ ] NIS is available on Switch — fallback on non-NVIDIA PC
- [ ] `SetUpscalerMethod` independently changes upscaler without affecting other settings
- [ ] `GetActivePipelineConfig()` returns current state accurately after apply
- [ ] Edge case: `PlatformProfileMap` missing platform → logs error, falls back to `PC_High`
- [ ] Edge case: Invalid preset name → logs warning, no CVars changed
- [ ] Edge case: Console variable execution fails → logs error per failed CVar, continues
- [ ] Edge case: Hot-swap GPU (eGPU) → `DetectPlatform` called again, pipeline may change
---
## 11. Manual Implementation Guide
### 11.1 Class Setup
1. Create Blueprint Class: parent `ActorComponent`, name `BPC_RenderPipelineManager`
2. Path: `Content/Framework/Settings/`
3. Add all variables, enums, structs, and event dispatchers from this spec
### 11.2 Key UE5 Nodes
| Node | Where to Find | Used For |
|------|---------------|----------|
| `Execute Console Command` | Right-click → "Execute Console Command" | Applying all CVar changes |
| `Get Platform Name` | Right-click → "Get Platform Name" | Platform detection |
| `Get Game User Settings` | Right-click → "Get Game User Settings" | Accessing scalability API |
| `Set Overall Scalability Level` | On GameUserSettings | Bulk quality tier application |
| `Get Game Instance` → `Get Subsystem(SS_SettingsSystem)` | Subsystem access | Reading/writing quality setting |
| `Get Game Instance` → `Get Subsystem(SS_PlanarCaptureManager)` | Subsystem access | Adjust capture budget |
| `Switch on EPlatformFamily` | Right-click → "Switch" | Platform-specific logic |
| `Make SRenderPipelineConfig` | Right-click → "Make Struct" | Building config structs |
### 11.3 Node-by-Node: ApplyRenderConfig
```
[Function: ApplyRenderConfig(PresetName, Config)]
Step 1: Get Owner → Cast to PlayerController → cache
Step 2: Break SRenderPipelineConfig → get all fields
Step 3: Switch on Config.GIMethod:
Lumen_GI → ExecuteConsoleCommand("r.DynamicGlobalIlluminationMethod 1")
ExecuteConsoleCommand("r.Lumen.Reflections.Allow 1")
Baked_Lightmass → ExecuteConsoleCommand("r.DynamicGlobalIlluminationMethod 0")
ExecuteConsoleCommand("r.Lumen.Reflections.Allow 0")
SSGI → ExecuteConsoleCommand("r.DynamicGlobalIlluminationMethod 2")
None → ExecuteConsoleCommand("r.DynamicGlobalIlluminationMethod 0")
Step 4: ExecuteConsoleCommand("r.Shadow.Virtual.Enable {VSM?1:0}")
Step 5: ExecuteConsoleCommand("sg.ShadowQuality {ShadowQuality}")
Step 6: ExecuteConsoleCommand("r.ScreenPercentage {ResolutionScale*100}")
Step 7: Switch on Config.Upscaler:
TSR → ExecuteConsoleCommand("r.TemporalAA.Upsampling 1")
DLSS → ExecuteConsoleCommand("r.NGX.DLSS.Enable 1")
ExecuteConsoleCommand("r.NGX.DLSS.Quality {UpscalerQuality}")
FSR → ExecuteConsoleCommand("r.FidelityFX.FSR2.Enabled 1")
NIS → ExecuteConsoleCommand("r.NIS.Enable 1")
Step 8: ExecuteConsoleCommand("r.Nanite {NaniteEnabled?1:0}")
Step 9: Execute Console Command "sg.TextureQuality {TextureQuality}"
Execute Console Command "sg.PostProcessQuality {PostProcessQuality}"
Execute Console Command "sg.ViewDistanceQuality {ViewDistanceQuality}"
Execute Console Command "sg.FoliageQuality {FoliageQuality}"
Step 10: ExecuteConsoleCommand("r.MotionBlurQuality {MotionBlur?2:0}")
Step 11: ExecuteConsoleCommand("r.DepthOfFieldQuality {DoF?2:0}")
Step 12: Set ActiveState.AppliedConfig = Config
Step 13: Set ActiveState.ActivePreset = PresetName
Step 14: Set bReloadNeededOnNextLevel = false
Step 15: Broadcast OnPipelineApplied(PresetName)
```
### 11.4 Networking
- **Local client only.** Render pipeline is per-client hardware. No replication.
- On listen servers: the server-host player runs their own render pipeline; other clients run theirs.
---
## 12. Blueprint Build Checklist
- [ ] Create Blueprint class: `BPC_RenderPipelineManager` (parent: `ActorComponent`)
- [ ] Add enums: `ERenderPipelineMethod`, `EShadowMethod`, `EReflectionMethod`, `EUpscalerMethod`, `EMeshStrategy`, `EPlatformFamily`, `ERenderPipelineChangeType`
- [ ] Add structs: `SRenderPipelineConfig`, `SPlatformRenderDefaults`, `SActivePipelineState`
- [ ] Add all variables from Section 3
- [ ] Build `BeginPlay` → `Initialize` chain
- [ ] Implement `DetectPlatform` with Switch on Platform Name
- [ ] Implement `ApplyQualityPreset` with reload detection logic
- [ ] Implement `ApplyRenderConfig` with full CVar execution
- [ ] Implement `ApplyPendingReload` bound to `GI_GameFramework.OnGamePhaseChanged`
- [ ] Implement `SetUpscalerMethod` / `GetAvailableUpscalers` / `IsLumenEnabled` / `IsNaniteEnabled`
- [ ] Create all 6 event dispatchers
- [ ] Bind to `SS_SettingsSystem.OnSettingChanged` (QualityPreset key)
- [ ] Bind to `GI_GameFramework.OnGamePhaseChanged`
- [ ] Create at least one `DA_RenderPipelineProfile` instance per target platform
- [ ] Test: Low preset disables Lumen, Nanite, switches to CSM
- [ ] Test: High preset enables Lumen, Nanite, VSM
- [ ] Test: Mid-session pipeline switch shows reload warning
- [ ] Test: Main Menu pipeline switch applies immediately
- [ ] Test: Planar capture quality cap adjusts on pipeline change
---
*Blueprint Spec: Render Pipeline Manager. Conforms to TEMPLATE.md v2.0 — part of the UE5 Modular Game Framework, SETTINGS layer.*

View File

@@ -52,6 +52,7 @@ The Modular Game Framework uses `UDataAsset` (and subclass `UPrimaryDataAsset` w
| 12 | `DA_RoomMutation` | Adaptive | `BPC_AdaptiveEnvironmentDirector` |
| 13 | `DA_BehaviourVariant` | AI | `BPC_BehaviourVariantSelector` |
| 14 | `DA_HapticProfile` | Settings | `BPC_HapticsController` (148) |
| 15 | `DA_RenderPipelineProfile` | Settings | `BPC_RenderPipelineManager` (149) |
| 15 | `DA_AdaptationRule` | Adaptive | `BPC_DifficultyManager` |
| 16 | `DA_EquipmentConfig` | Inventory | `BPC_EquipmentSlotSystem` |
| 17 | `DA_PuzzleData` | Interaction | `BP_PuzzleDeviceActor` |

View File

@@ -0,0 +1,298 @@
# DA_RenderPipelineProfile — Data Asset
**Parent Class:** `UPrimaryDataAsset`
**Dependencies:** [`BPC_RenderPipelineManager`](../12-settings/149_BPC_RenderPipelineManager.md)
**Purpose:** Defines a complete rendering pipeline configuration for a specific quality tier on a specific platform family. Each profile maps quality presets (Low/Medium/High/Ultra/Cinematic) to concrete UE5 render settings: global illumination method, shadow method, reflection method, anti-aliasing, upscaling, Nanite/LOD strategy, and post-process presets. Designers configure these per-platform so PS4 gets baked light + CSM shadows while PS5 gets Lumen + Virtual Shadow Maps.
---
## Design Rationale
UE5's rendering pipeline is **not runtime-switchable** for certain features (Lumen ON/OFF, Nanite ON/OFF). These must be configured before the engine initializes or before a level loads. This Data Asset serves as the single source of truth for the render pipeline configuration. `BPC_RenderPipelineManager` reads the appropriate profile based on the player's quality selection and platform, then applies console variables through UE5's `IConsoleManager` or `UGameUserSettings` scalability API.
---
## 1. Enums
### `ERenderPipelineMethod`
| Value | Description |
|-------|-------------|
| `Lumen_GI = 0` | Lumen Global Illumination + Reflection |
| `Baked_Lightmass = 1` | Static baked lightmaps + reflection captures |
| `SSGI = 2` | Screen-space global illumination (mid-range fallback) |
| `None = 3` | No GI — unlit or emissive-only |
### `EShadowMethod`
| Value | Description |
|-------|-------------|
| `VirtualShadowMaps = 0` | UE5 Virtual Shadow Maps (Nanite-compatible) |
| `CascadedShadowMaps = 1` | Traditional CSM (low-end compatible) |
| `DistanceFieldShadows = 2` | Ray-traced distance field shadows |
| `None = 3` | No dynamic shadows |
### `EReflectionMethod`
| Value | Description |
|-------|-------------|
| `Lumen_Reflections = 0` | Lumen reflection system |
| `ScreenSpace = 1` | Screen-space reflections (SSR) |
| `ReflectionCaptures = 2` | Static sphere/box reflection captures (baked) |
| `None = 3` | No reflections |
### `EUpscalerMethod`
| Value | Description |
|-------|-------------|
| `TSR = 0` | Temporal Super Resolution (UE5 built-in) |
| `DLSS = 1` | NVIDIA DLSS 3 (requires plugin + RTX GPU) |
| `FSR = 2` | AMD FidelityFX Super Resolution 2/3 |
| `PSSR = 3` | PlayStation Spectral Super Resolution (PS5 Pro only) |
| `XeSS = 4` | Intel Xe Super Sampling |
| `NIS = 5` | NVIDIA Image Scaling (vendor-agnostic) |
| `None = 6` | Native resolution — no upscaling |
| `TAAU = 7` | Temporal Anti-Aliasing Upsample (legacy) |
### `EMeshStrategy`
| Value | Description |
|-------|-------------|
| `Nanite = 0` | Nanite virtualized geometry (UE5 only) |
| `Traditional_LOD = 1` | Standard static mesh LODs |
| `ProxyGeometry = 2` | HLOD/proxy geometry for distant objects |
### `EPlatformFamily`
| Value | Description | Default Render Method |
|-------|-------------|----------------------|
| `PC_High = 0` | PC with RTX 2000+ / RX 6000+ | Lumen + Nanite |
| `PC_Low = 1` | PC with GTX 9001600 / iGPU | Baked + CSM |
| `PS5 = 2` | PlayStation 5 | Lumen + Nanite |
| `PS5_Pro = 3` | PlayStation 5 Pro (PSSR support) | Lumen + Nanite + PSSR |
| `PS4 = 4` | PlayStation 4 / PS4 Pro | Baked + CSM + TAAU |
| `Xbox_Series = 5` | Xbox Series X\|S | Lumen + Nanite |
| `Xbox_One = 6` | Xbox One / One X | Baked + CSM + TAAU |
| `Switch_2 = 7` | Nintendo Switch 2 (when available) | Baked + CSM + FSR |
| `Switch = 8` | Nintendo Switch | Baked + ProxyGeometry + NIS |
| `SteamDeck = 9` | Steam Deck / handheld PC | Baked/SSGI + CSM + FSR |
---
## 2. Structs
### `SRenderPipelineConfig`
| Field | Type | Description |
|-------|------|-------------|
| `QualityPresetName` | `FName` | Identifier ("Low", "Medium", "High", "Ultra", "Cinematic") |
| `GIMethod` | `ERenderPipelineMethod` | Global illumination method |
| `ShadowMethod` | `EShadowMethod` | Shadow rendering method |
| `ReflectionMethod` | `EReflectionMethod` | Reflection rendering method |
| `Upscaler` | `EUpscalerMethod` | Upscaling method |
| `UpscalerQuality` | `int32` | Upscaler quality tier (0=Performance, 1=Balanced, 2=Quality, 3=UltraQuality) |
| `MeshStrategy` | `EMeshStrategy` | Geometry rendering strategy |
| `ResolutionScale` | `float` | Screen percentage (0.51.0) |
| `DynamicResolutionTarget` | `float` | Target ms for dynamic resolution (0=disabled) |
| `ShadowQuality` | `int32` | Shadow resolution/distance tier (0=NONE, 1=LOW, 2=MED, 3=HIGH, 4=EPIC) |
| `TextureQuality` | `int32` | Texture streaming pool tier (03) |
| `PostProcessQuality` | `int32` | Post-process complexity (03) |
| `ViewDistanceQuality` | `int32` | View distance tier (03) |
| `FoliageQuality` | `int32` | Foliage density tier (03) |
| `AntiAliasingQuality` | `int32` | AA quality tier (03) |
| `bEnableMotionBlur` | `bool` | Motion blur toggle |
| `bEnableDepthOfField` | `bool` | Depth of field toggle |
| `bEnableVolumetricClouds` | `bool` | Volumetric cloud rendering |
| `bEnableVirtualTextures` | `bool` | Runtime virtual textures |
| `bEnableHWRT` | `bool` | Hardware ray tracing (requires RT-capable GPU) |
| `bRequiresLevelReload` | `bool` | TRUE if this setting requires a level reload to take effect |
| `TargetFPS` | `int32` | Frame rate target (0=unlimited) |
| `bEnableVSync` | `bool` | Vertical sync |
| `Description` | `FText` | Human-readable description for settings UI |
### `SPlatformRenderDefaults`
| Field | Type | Description |
|-------|------|-------------|
| `Platform` | `EPlatformFamily` | Target platform |
| `DefaultQualityPreset` | `FName` | Preset to use on first launch ("Medium" for most) |
| `SupportedPipelines` | `TArray<ERenderPipelineMethod>` | Which GI methods this platform supports |
| `SupportedUpscalers` | `TArray<EUpscalerMethod>` | Which upscalers this platform supports |
| `MaxResolutionScale` | `float` | Maximum resolution scale (e.g., 1.0 for PS5, 0.7 for Switch) |
| `MaxFPS` | `int32` | Maximum recommended FPS target |
| `VRAMBudget_MB` | `int32` | Typical VRAM budget for this platform |
| `bSupportsNanite` | `bool` | Platform supports Nanite |
| `bSupportsLumen` | `bool` | Platform supports Lumen |
| `bSupportsHWRT` | `bool` | Platform supports hardware ray tracing |
| `ConsoleVariables` | `TMap<FString, FString>` | Additional platform-specific CVar overrides |
---
## 3. Variables
### Configuration (Instance Editable)
| Variable | Type | Default | Category | Description |
|----------|------|---------|----------|-------------|
| `PlatformFamily` | `EPlatformFamily` | `PC_High` | `Config` | Which platform this profile targets |
| `PlatformDefaults` | `SPlatformRenderDefaults` | — | `Config` | Platform-specific capabilities and defaults |
| `QualityPresets` | `TMap<FName, SRenderPipelineConfig>` | `Empty` | `Config` | Maps quality preset names to render configs |
| `bAllowDynamicPresetSwitch` | `bool` | `true` | `Config` | Whether quality can change without level reload |
| `bAutoDetectPlatform` | `bool` | `true` | `Config` | Auto-detect platform at startup |
---
## 4. Default Preset Tables (Per-Platform)
### PS5 (EPlatformFamily::PS5) — Target: 60 FPS
| Preset | Resolution % | GI | Shadows | Reflections | Upscaler | Mesh | FPS |
|--------|------------|-----|---------|-------------|----------|------|-----|
| Low | 70% | Baked | CSM | Captures | TSR Perf | LOD | 60 |
| Medium | 85% | Lumen Low | VSM Low | Lumen Low | TSR Balanced | Nanite | 60 |
| High | 100% | Lumen High | VSM High | Lumen High | TSR Quality | Nanite | 60 |
| Ultra | 100% | Lumen Ultra | VSM Ultra | Lumen Ultra | PSSR | Nanite | 60 |
| Cinematic | 100% | Lumen + HWRT | VSM + RT | Lumen + RT | PSSR | Nanite | 30 |
### PS4 (EPlatformFamily::PS4) — Target: 30 FPS
| Preset | Resolution % | GI | Shadows | Reflections | Upscaler | Mesh | FPS |
|--------|------------|-----|---------|-------------|----------|------|-----|
| Low | 60% | None | CSM Low | None | TAAU | Proxy | 30 |
| Medium | 75% | Baked | CSM Medium | Captures | TAAU | LOD | 30 |
| High | 90% | Baked | CSM High | Captures + SSR | TAAU | LOD | 30 |
### PC_High (RTX 3080+) — Target: 120 FPS
| Preset | Resolution % | GI | Shadows | Reflections | Upscaler | Mesh | FPS |
|--------|------------|-----|---------|-------------|----------|------|-----|
| Low | 70% | SSGI | CSM | SSR | DLSS Perf | LOD | 120 |
| Medium | 85% | Lumen Low | VSM | Lumen Low | DLSS Balanced | Nanite | 120 |
| High | 100% | Lumen High | VSM | Lumen High | DLSS Quality | Nanite | 120 |
| Ultra | 100% | Lumen Ultra | VSM Ultra | Lumen Ultra | DLSS Quality | Nanite | 120 |
| Cinematic | 120% | Lumen + HWRT | VSM + RT | Lumen + RT | DLSS UltraQ | Nanite | 60 |
### PC_Low (GTX 1060 / integrated) — Target: 30 FPS
| Preset | Resolution % | GI | Shadows | Reflections | Upscaler | Mesh | FPS |
|--------|------------|-----|---------|-------------|----------|------|-----|
| Low | 50% | None | CSM Low | None | FSR Perf | Proxy | 30 |
| Medium | 65% | Baked | CSM Medium | Captures | FSR Balanced | LOD | 30 |
| High | 80% | SSGI | CSM High | SSR | FSR Quality | LOD | 30 |
### Switch (EPlatformFamily::Switch) — Target: 30 FPS
| Preset | Resolution % | GI | Shadows | Reflections | Upscaler | Mesh | FPS |
|--------|------------|-----|---------|-------------|----------|------|-----|
| Low | 40% | None | CSM Low | None | NIS | Proxy | 30 |
| Medium | 55% | Baked | CSM Med | Captures | NIS | LOD | 30 |
| High | 70% | Baked | CSM High | Captures | FSR | LOD | 30 |
### Xbox_Series (EPlatformFamily::Xbox_Series) — Target: 60 FPS
| Preset | Resolution % | GI | Shadows | Reflections | Upscaler | Mesh | FPS |
|--------|------------|-----|---------|-------------|----------|------|-----|
| Low | 70% | Baked | CSM | Captures | FSR Perf | LOD | 60 |
| Medium | 85% | Lumen Low | VSM Low | Lumen Low | FSR Balanced | Nanite | 60 |
| High | 100% | Lumen High | VSM High | Lumen High | FSR Quality | Nanite | 60 |
| Ultra | 100% | Lumen Ultra | VSM Ultra | Lumen Ultra | FSR Quality | Nanite | 60 |
---
## 5. Functions
*This Data Asset has no Blueprint functions. All data retrieval is performed by `BPC_RenderPipelineManager` reading the struct tables directly.*
---
## 6. Console Variable Reference (per setting)
When `BPC_RenderPipelineManager` applies a `SRenderPipelineConfig`, it sets these UE5 console variables:
```
[Global Illumination]
r.DynamicGlobalIlluminationMethod <0=None, 1=Lumen, 2=SSGI, 3=Plugin>
r.Lumen.Reflections.Allow <0/1>
r.Lumen.DiffuseIndirect.Allow <0/1>
r.Lumen.TranslucencyVolume <0/1>
[Shadows]
r.Shadow.Virtual.Enable <0/1>
r.Shadow.CSM.MaxCascades <0-4>
sg.ShadowQuality <0-4>
[Reflections]
r.ReflectionMethod <0=None, 1=Lumen, 2=SSR>
r.SSR.Quality <0-4>
[Upscaling]
r.TemporalAA.Upsampling <0/1>
r.TSR.History.ScreenPercentage <50-200>
r.NGX.DLSS.Enable <0/1> (DLSS plugin)
r.FidelityFX.FSR2.Enabled <0/1> (FSR plugin)
r.FidelityFX.FI.Enabled <0/1>
[Mesh / Nanite]
r.Nanite <0/1>
r.Nanite.MaxPixelsPerEdge <1-4>
r.StaticMeshLODDistanceScale <0.5-3.0>
[Post Process]
sg.PostProcessQuality <0-3>
r.MotionBlurQuality <0-4>
r.DepthOfFieldQuality <0-4>
[Textures]
sg.TextureQuality <0-3>
r.Streaming.PoolSize <MB value>
[View Distance]
sg.ViewDistanceQuality <0-3>
r.ViewDistanceScale <0.5-3.0>
foliage.LODDistanceScale <0.5-3.0>
[Volumetrics]
r.VolumetricCloud <0/1>
r.VolumetricFog <0/1>
[Hardware RT]
r.RayTracing <0/1>
r.RayTracing.Shadows <0/1>
r.RayTracing.Reflections <0/1>
```
---
## 7. Integration with Planar Capture System
The Planar Capture System (`BPC_PlanarCapture`, system 136) uses `SceneCapture2D` components that capture the world from a separate camera. These captures respect the **world's current render state**, meaning:
| Main Pipeline Setting | Effect on Planar Capture |
|----------------------|-------------------------|
| Lumen GI ON | Capture shows Lumen-lit scene (if `bEnableLumen` on capture profile) |
| Baked Lightmass | Capture shows baked lighting — SceneCapture2D picks this up naturally |
| Nanite ON | Captures render Nanite geometry (significant cost — bump down capture quality tier) |
| Traditional LOD | Captures use standard LOD — lower cost |
| VSM ON | Capture benefits from VSM (if capture profile enables shadows) |
| CSM | Capture uses CSM — lower cost but lower quality |
**Key rule:** When the main pipeline switches to **Baked Lightmass**, the Planar Capture System's quality tier profiles should also use `bEnableLumen = false` to prevent the capture from trying to enable Lumen on a world that doesn't use it. `BPC_RenderPipelineManager` broadcasts `OnRenderPipelineChanged` which `SS_PlanarCaptureManager` binds to, adjusting its `GlobalQualityCap` accordingly.
See [`BPC_RenderPipelineManager`](../12-settings/149_BPC_RenderPipelineManager.md) for the full integration spec.
---
## 8. Validation Rules
- At least one quality preset must be defined
- All preset names must be unique
- `bRequiresLevelReload` must be TRUE for profile changes that modify `GIMethod`, `ShadowMethod`, or `MeshStrategy` from the current value
- Platform family must not be `Unknown` (use auto-detection as fallback)
- ResolutionScale must be 0.252.0
- Upscaler must be in `SupportedUpscalers` for the target platform
---
## 9. Consumed By
- [`BPC_RenderPipelineManager`](../12-settings/149_BPC_RenderPipelineManager.md) — reads profiles at init and on quality change
- [`BPC_PerformanceScaler`](../10-adaptive/91_BPC_PerformanceScaler.md) — delegates quality-tier CVar application
- [`SS_PlanarCaptureManager`](../17-capture/138_SS_PlanarCaptureManager.md) — adjusts capture quality cap on pipeline change
## 10. Reuse Notes
- Platform profiles are Data Asset instances — designers create `DA_RPP_PS5`, `DA_RPP_PS4`, `DA_RPP_PC_High`, `DA_RPP_PC_Low`, etc.
- The `bRequiresLevelReload` flag is critical — UI must display a "requires restart" warning when the player changes a pipeline-affecting setting (GI method, shadow method, Nanite toggle).
- Upscaler plugins (DLSS, FSR, XeSS) must be enabled in `Project Settings → Plugins`. If a plugin is missing, the system falls back to the next available upscaler.
- For console certification: each platform must have a `DA_RenderPipelineProfile` instance that meets Sony/Microsoft/Nintendo TRC requirements (minimum FPS target, resolution floor).
- The `ConsoleVariables` override map on `SPlatformRenderDefaults` allows per-platform tweaks without modifying the quality preset structs.

View File

@@ -4,7 +4,7 @@
Core capture component managing `USceneCaptureComponent2D` lifecycle for mirrors, portals, monitors, and horror surfaces. All camera math, render target management, and per-frame capture decisions happen here in C++ for performance.
## Dependencies
- **Requires:** `SS_PlanarCaptureManager` (138) for quality tier assignment and RT pool, `UPlanarCaptureCameraUtils` for camera math
- **Requires:** `SS_PlanarCaptureManager` (138) for quality tier assignment and RT pool, `UPlanarCaptureCameraUtils` for camera math, [`BPC_RenderPipelineManager`](../12-settings/149_BPC_RenderPipelineManager.md) for global Lumen/Nanite state awareness
- **Required By:** `BP_PlanarCaptureActor` (137) — owned by parent actor
- **Engine/Plugin Requirements:** Renderer, RenderCore modules
@@ -41,7 +41,8 @@ Core capture component managing `USceneCaptureComponent2D` lifecycle for mirrors
| `bEnableFog` | bool | false | Exponential height fog toggle |
| `bEnableBloom` | bool | false | Bloom toggle |
| `bEnableAO` | bool | false | Ambient occlusion toggle |
| `bEnableLumen` | bool | false | Lumen GI toggle (expensive) |
| `bEnableLumen` | bool | false | Lumen GI toggle (expensive — auto-disabled if global pipeline has Lumen OFF) |
| `bEnableNanite` | bool | false | Nanite in capture (expensive — auto-disabled if global pipeline has Nanite OFF) |
| `bEnableMotionBlur` | bool | false | Motion blur toggle |
| `bEnableClipPlane` | bool | true | Oblique near-plane toggle |
| `DelayedFrameCount` | int32 | 0 | Horror delayed frame ring buffer size |
@@ -123,7 +124,8 @@ Core capture component managing `USceneCaptureComponent2D` lifecycle for mirrors
## 6. Communication Matrix
| Target System | Method | What |
|---------------|--------|------|
| `SS_PlanarCaptureManager` | Direct (cached reference) | RT requests, quality tier reception |
| `SS_PlanarCaptureManager` | Direct (cached reference) | RT requests, quality tier reception, pipeline state |
| `BPC_RenderPipelineManager` (149) | Direct (cached reference) | Query `IsLumenEnabled()`, `IsNaniteEnabled()` — auto-disable incompatible features |
| `BP_PlanarCaptureActor` | Direct (owner) | Surface mesh, MPC reference |
| `UPlanarCaptureCameraUtils` | Static function calls | Mirror/portal/oblique math |
| `USceneCaptureComponent2D` | Direct (owns) | Full lifecycle control |

View File

@@ -115,6 +115,8 @@ These systems appear in the Plan but may need explicit spec files or are covered
- `BPC_MetaProgressionSystem` — Not yet created; Master Section 11.5
- `BPC_RunSummarySystem` — Already exists at `05-saveload/43_BPC_RunHistoryTracker.md` (may need rename or separate file)
- `BPC_HapticsController` — ✅ Created (system 148); `docs/blueprints/12-settings/148_BPC_HapticsController.md`
- `BPC_RenderPipelineManager` — ✅ Created (system 149); `docs/blueprints/12-settings/149_BPC_RenderPipelineManager.md`
- `DA_RenderPipelineProfile` — ✅ Created (supplementary); `docs/blueprints/14-data-assets/DA_RenderPipelineProfile.md`
- `BPC_PlatformServiceAbstraction` — Not yet created; Master Section 12.3
---

View File

@@ -1,6 +1,6 @@
# Master Blueprint Index — UE5 Modular Game Framework
**Version:** 3.5 | **Generated:** 2026-05-22 | **Total Files:** 148 numbered + 1 starter + 1 supplementary (150 total specs) | **C++:** 27 source files (15 full + 10 stubs + 2 utility)
**Version:** 3.6 | **Generated:** 2026-05-22 | **Total Files:** 149 numbered + 1 starter + 2 supplementary (152 total specs) | **C++:** 27 source files (15 full + 10 stubs + 2 utility)
This document is the canonical index of every Blueprint specification file in the framework. Each entry links to its full spec document and includes: file name, asset type, parent class, purpose summary, and key dependencies.
@@ -49,9 +49,9 @@ docs/blueprints/
├── 09-ai/ ← AI, Perception & Encounters (9 files)
├── 10-adaptive/ ← Adaptive Environment, Atmosphere & Scare (15 files)
├── 11-meta/ ← Achievements, Progression & Meta (2 files)
├── 12-settings/ ← Settings, Accessibility, Haptics & Platform (3 files)
├── 12-settings/ ← Settings, Accessibility, Haptics, Render Pipeline & Platform (5 files)
├── 13-polish/ ← Tutorial, Loading, Credits, Debug (9 files)
├── 14-data-assets/ ← Data Asset definitions (16 files)
├── 14-data-assets/ ← Data Asset definitions (17 files + 1 supplementary)
├── 15-input/ ← Enhanced Input System (1 file)
├── 16-state/ ← State Management (2 files)
└── 17-capture/ ← Planar Capture System (12 files)
@@ -182,6 +182,7 @@ docs/blueprints/
| 104 | [`104_BPC_AccessibilitySettings`](12-settings/104_BPC_AccessibilitySettings.md) | `BPC_` Component | `ActorComponent` | Accessibility; subtitles, colorblind, controller remap, difficulty | 12-settings |
| 105 | [`105_SS_SettingsSystem`](12-settings/105_SS_SettingsSystem.md) | `SS_` Subsystem | `GameInstanceSubsystem` | Settings subsystem; persistent settings, apply, reset, platform | 12-settings |
| 148 | [`148_BPC_HapticsController`](12-settings/148_BPC_HapticsController.md) | `BPC_` Component | `ActorComponent` | Haptics controller; GameplayTag-driven force feedback, DualSense triggers, heartbeat pulse | 12-settings |
| 149 | [`149_BPC_RenderPipelineManager`](12-settings/149_BPC_RenderPipelineManager.md) | `BPC_` Component | `ActorComponent` | Render pipeline manager; quality presets, per-platform GI/shaders/upscaling, planarcapture aware | 12-settings |
| — | — | — | — | — | — |
| 106 | [`106_BPC_AnalyticsTracker`](13-polish/106_BPC_AnalyticsTracker.md) | `BPC_` Component | `ActorComponent` | Analytics; event tracking, session metrics, telemetry | 13-polish |
| 107 | [`107_BPC_DevCheatManager`](13-polish/107_BPC_DevCheatManager.md) | `BPC_` Component | `ActorComponent` | Developer cheats; god mode, noclip, give item, teleport | 13-polish |
@@ -200,6 +201,7 @@ docs/blueprints/
| 119 | [`119_DA_EncounterData`](14-data-assets/119_DA_EncounterData.md) | `DA_` Data Asset | `PrimaryDataAsset` | Encounter definition; enemy groups, spawn rules, difficulty | 14-data-assets |
| 120 | [`120_DA_EquipmentConfig`](14-data-assets/120_DA_EquipmentConfig.md) | `DA_` Data Asset | `PrimaryDataAsset` | Equipment configuration; weapon stats, armor, haptics | 14-data-assets |
| 121 | [`121_DA_HapticProfile`](14-data-assets/121_DA_HapticProfile.md) | `DA_` Data Asset | `PrimaryDataAsset` | Haptic/force feedback profile | 14-data-assets |
| — | [`DA_RenderPipelineProfile`](14-data-assets/DA_RenderPipelineProfile.md) | `DA_` Data Asset | `PrimaryDataAsset` | Render pipeline config; quality presets, GI/shadows/upscaling/Nanite per platform | 14-data-assets |
| 122 | [`122_DA_InteractionData`](14-data-assets/122_DA_InteractionData.md) | `DA_` Data Asset | `PrimaryDataAsset` | Interaction definition; prompt text, duration, icon, conditions | 14-data-assets |
| 123 | [`123_DA_ObjectiveData`](14-data-assets/123_DA_ObjectiveData.md) | `DA_` Data Asset | `PrimaryDataAsset` | Objective/quest data; description, prerequisites, rewards | 14-data-assets |
| 124 | [`124_DA_PuzzleData`](14-data-assets/124_DA_PuzzleData.md) | `DA_` Data Asset | `PrimaryDataAsset` | Puzzle definition; solution, steps, hints, rewards | 14-data-assets |
@@ -235,10 +237,10 @@ docs/blueprints/
| Prefix | Type | Count |
|--------|------|-------|
| `BPC_` | Blueprint Component | 81 |
| `BPC_` | Blueprint Component | 82 |
| `BP_` | Blueprint Actor | 11 |
| `WBP_` | Widget Blueprint | 14 |
| `DA_` | Data Asset | 19 |
| `DA_` | Data Asset | 20 |
| `SS_` | GameInstance Subsystem | 7 |
| `GI_` | Game Instance | 2 |
| `GM_` | Game Mode | 1 |
@@ -248,7 +250,7 @@ docs/blueprints/
| `AI_` | AI Controller | 1 |
| `BB_` | Blackboard | 1 |
| `E_` | Enum | 5 |
| **Total** | | **159** |
| **Total** | | **161** |
---
@@ -266,6 +268,7 @@ Below are the most cross-referenced systems — these are the ones the State Man
| `BPC_StateManager` (130) | EVERY system (central query point) |
| `SS_AudioManager` (132) | ALL systems that play audio, BP_RoomAudioZone, WBP_SettingsMenu, BPC_StateManager (heart rate → audio) |
| `BPC_HapticsController` (148) | HealthSystem, FirearmSystem, MeleeSystem, ScareEventSystem, PhysicsDrag, MovementState, ReloadSystem, DeathHandling, Staminasystem, StateManager → heartbeat, AccessibilitySettings |
| `BPC_RenderPipelineManager` (149) | PerformanceScaler (delegates CVars), SettingsSystem (quality persistence), PlanarCaptureManager (budget adjustment), SettingsMenu (upscaler query), AtmosphereController |
| `ABP_GASP` (external) | StateManager (overlay + action intensity), MovementState, Hiding, Stamina, Embodiment |
---
@@ -328,7 +331,7 @@ Below are the most cross-referenced systems — these are the ones the State Man
---
*Master Blueprint Index v3.5 — The single reference document for every file in the framework. Now 148 files with State Management, MetaSounds Audio, Multiplayer Networking, Planar Capture System, and Haptics Controller support.*
*Master Blueprint Index v3.6 — The single reference document for every file in the framework. Now 149 files + 2 supplementary with State Management, MetaSounds Audio, Multiplayer Networking, Planar Capture System, Haptics Controller, and Render Pipeline Manager support.*
---

View File

@@ -182,6 +182,7 @@ Abbreviations:
|---|--------|-----|---------|----------|
| 102-114 | All 13 systems | 🔵 | ✅ | BP children + widget BPs |
| 148 | `BPC_HapticsController` | 🔵 (Blueprint-only) | ✅ | ⬜ BP child attach to PlayerController |
| 149 | `BPC_RenderPipelineManager` | 🔵 (Blueprint-only) | ✅ | ⬜ BP child attach to PlayerController |
### Data Assets (14-data-assets — 16 systems)

View File

@@ -725,6 +725,7 @@ All 16 are Data Asset definitions. No code — create Data Asset instances per c
| 104 | `BPC_AccessibilitySettings` | BP child | Accessibility: colorblind, subtitle, control remapping, TTS |
| 105 | `SS_SettingsSystem` | BP child of GameInstanceSubsystem | Settings persistence: save/load config to disk, apply on boot |
| 148 | `BPC_HapticsController` | BP child of ActorComponent | Haptics: GameplayTag-driven force feedback, DualSense triggers, heartbeat pulse |
| 149 | `BPC_RenderPipelineManager` | BP child of ActorComponent | Render pipeline: quality presets, GI/shadows/upscaling per platform, PlanarCapture aware |
---

View File

@@ -13,13 +13,14 @@
---
# 12 — Settings, Accessibility, Haptics & Platform Systems (Systems 104-105, 148)
# 12 — Settings, Accessibility, Haptics, Render Pipeline & Platform Systems (Systems 104-105, 148-149)
| # | System | Asset Type | Role |
|---|--------|-----------|------|
| 104 | `BPC_AccessibilitySettings` | Component | Accessibility; subtitles, colorblind, controller remap |
| 105 | `SS_SettingsSystem` | Subsystem | Settings subsystem; persistent settings, apply, reset |
| 148 | `BPC_HapticsController` | Component | Haptics controller; GameplayTag-driven force feedback, DualSense triggers, heartbeat pulse |
| 149 | `BPC_RenderPipelineManager` | Component | Render pipeline manager; quality presets, per-platform GI/shadows/upscaling, PlanarCapture aware |
**104 BPC_AccessibilitySettings:** Manages accessibility features: subtitle toggle/size, colorblind mode selection (protanopia/deuteranopia/tritanopia), controller remapping, difficulty presets, hold-to-confirm toggle, camera shake reduction. Settings persisted via `SS_SettingsSystem`.
@@ -27,6 +28,8 @@
**148 BPC_HapticsController:** ActorComponent attached to the Player Controller. Central abstraction for all controller vibration and force feedback. Systems trigger haptics by GameplayTag (e.g., `Haptic.Damage.Heavy`) — never calling raw UE5 `Play Force Feedback` nodes. Handles platform detection (Xbox rumble, PS5 DualSense adaptive triggers, PC generic gamepad), respects accessibility toggle, manages effect priority/conflict resolution, and drives the continuous heartbeat pulse from `BPC_StateManager.GetCurrentHeartRate()`. Uses `DA_HapticProfile` Data Assets for all effect definitions.
**149 BPC_RenderPipelineManager:** ActorComponent attached to the Player Controller. Central authority for UE5 render pipeline configuration. Reads `DA_RenderPipelineProfile` Data Assets to determine the appropriate rendering method (Lumen vs Baked Lightmass), shadow system (VSM vs CSM), upscaler (DLSS/FSR/TSR/PSSR), and mesh strategy (Nanite vs LOD) for the current platform and quality preset. Applies settings via UE5 console variables, coordinates with `BPC_PerformanceScaler` for runtime quality tier adjustments, and broadcasts pipeline changes so the Planar Capture system can adjust its quality budget. Handles reload-required detection for destructive pipeline changes (GI method, shadow method, Nanite toggle).
---
# 13 — Polish: Tutorial, Loading, Credits & Debug Systems (Systems 106-114)
@@ -111,7 +114,7 @@
---
*Developer Reference v1.1 — Categories 11-16 Systems (including Haptics). Companion to docs/blueprints/ specs.*
*Developer Reference v1.2 — Categories 11-16 Systems (including Haptics + Render Pipeline). Companion to docs/blueprints/ specs.*
---
@@ -125,6 +128,7 @@
| `BPC_AccessibilitySettings` | **Local per-client** each player's accessibility preferences |
| `SS_SettingsSystem` | Settings save per-client; key bindings are local |
| `BPC_HapticsController` | **Local client only** haptics are cosmetic, never replicated. No `HasAuthority()` needed. |
| `BPC_RenderPipelineManager` | **Local client only** render pipeline is per-client hardware. No replication. |
### Category 13: Polish
| System | Authority |

View File

@@ -1,6 +1,6 @@
# Developer Reference — UE5 Modular Game Framework
**Version:** 1.7 | **Generated:** 2026-05-22 | **Files:** 20 (1 index + 2 overview + 1 migration + 1 integration + 1 prototype + 1 starter + 10 category docs + 1 combined + 1 capture + 1 haptics) | **C++:** 15 full + 10 stubs = 25 systems
**Version:** 1.8 | **Generated:** 2026-05-22 | **Files:** 21 (1 index + 3 overview + 1 migration + 1 integration + 1 prototype + 1 starter + 10 category docs + 1 combined + 1 capture + 1 render) | **C++:** 15 full + 10 stubs = 25 systems
This directory contains developer-facing reference documentation for every system in the framework. Unlike the blueprint spec files (which define *what* to build), these documents explain *how each system works internally* — the data flow, state machines, integration points, and design rationale. Use these when you need to understand a system's behavior to implement, debug, or extend it.
@@ -32,11 +32,11 @@ docs/developer/
├── 08-weapons-systems.md ← Weapons, equipment & damage (systems 69-79)
├── 09-ai-systems.md ← AI, perception & encounters (systems 80-88)
├── 10-adaptive-systems.md ← Adaptive environment & atmosphere (systems 89-101, 132-133)
├── 11-16-systems.md ← Meta, Settings, Polish, Data Assets, Input, State (systems 102-135)
├── 11-16-systems.md ← Meta, Settings, Polish, Data Assets, Input, State (systems 102-135, 148-149)
└── 17-capture-systems.md ← Planar Capture System — Mirrors, Portals, Monitors, Horror (systems 136-147)
## Haptics Reference
- **18-haptics-system.md** — Haptics Controller — Force feedback, DualSense triggers, heartbeat pulse, platform profiles (system 148)
## Render Pipeline Reference (NEW)
- **platform-render-profiles.md** — Render pipeline setup guide: Lumen vs Baked, upscalers (DLSS/FSR/PSSR), per-platform quality presets (systems 149 + DA_RenderPipelineProfile)
- **game/haptics-example.md** — Project Void haptics walkthrough — wiring all game systems, platform tuning, testing checklist
```
@@ -182,6 +182,8 @@ docs/developer/
| 134 | `DA_AudioSettings` | Data Assets | Audio bus/settings config |
| 135 | `DA_RoomAcousticPreset` | Data Assets | Room acoustic profile |
| 148 | `BPC_HapticsController` | Settings | Haptics controller — force feedback, DualSense triggers, heartbeat pulse |
| 149 | `BPC_RenderPipelineManager` | Settings | Render pipeline manager — quality presets, GI/shadows/upscaling per platform |
| — | `DA_RenderPipelineProfile` | Data Assets | Render pipeline config — per-platform quality tier render settings |
## How to Use These Docs

View File

@@ -36,7 +36,10 @@ Direct Reference │ Interface Calls
│ LAYER 8: POLISH & META │
│ Tutorials, Loading, Credits, Analytics, Achievements │
├────────────────────────────────────────────────────────────────┤
│ LAYER 7.5: HAPTICS
│ LAYER 7.5: RENDER PIPELINE
│ Quality presets, Lumen/Baked, upscaling, platform profiles │
├────────────────────────────────────────────────────────────────┤
│ LAYER 7: HAPTICS │
│ Controller vibration, DualSense triggers, heartbeat pulse │
├────────────────────────────────────────────────────────────────┤
│ LAYER 7: ADAPTIVE │
@@ -92,7 +95,10 @@ All input goes through `SS_EnhancedInputManager`. Context switching uses priorit
### 8. GameplayTag-Driven Haptics
All controller vibration routes through `BPC_HapticsController` on the Player Controller. Gameplay systems trigger haptics by GameplayTag (e.g., `Haptic.Damage.Heavy`) — never calling raw `Play Force Feedback` nodes. The component detects platform (Xbox rumble vs PS5 DualSense adaptive triggers), respects accessibility toggles, and manages effect priority. Heartbeat pulse is driven by `BPC_StateManager.GetCurrentHeartRate()`.
### 9. Force Stack for State Overrides
### 9. Per-Platform Render Pipeline
All render quality decisions route through `BPC_RenderPipelineManager`. The system reads `DA_RenderPipelineProfile` Data Assets to determine Lumen vs Baked Lightmass, Virtual Shadow Maps vs Cascaded Shadow Maps, Nanite vs traditional LODs, and the appropriate upscaler (DLSS/FSR/TSR/PSSR) for the detected platform and selected quality preset. Destructive pipeline changes (GI method, shadow method) are queued and applied on level load. The Planar Capture system adjusts its quality budget based on the active pipeline.
### 10. Force Stack for State Overrides
Death, cutscenes, void space push state onto a stack. `RestorePreviousState()` pops back — the player returns to exactly their previous state after a forced interruption.
---
@@ -150,13 +156,13 @@ The 16 build phases follow dependency order:
| `WBP_` Widget Blueprints | 14 | HUDController, InventoryMenu, MainMenu |
| `DA_` Data Assets | 18 | ItemData, EquipmentConfig, AtmosphereProfile |
| `SS_` GameInstance Subsystems | 7 | SaveManager, UIManager, AudioManager |
| `BPC_` Components (haptics) | 1 | HapticsController (PlayerController) |
| `BPC_` Components (settings) | 2 | HapticsController, RenderPipelineManager |
| `GI_` Game Instances | 2 | GameFramework, GameTagRegistry |
| `I_` Interfaces | 3 | InterfaceLibrary, HidingSpot, Persistable |
| `GM_` GameMode, `GS_` GameState | 2 | CoreGameMode, CoreGameState |
| `FL_` Function Library | 1 | GameUtilities |
| `AI_` Controller, `BB_` Blackboard | 2 | BaseAgentController, AgentBoard |
| **TOTAL** | **141** | |
| **TOTAL** | **142** | |
---

View File

@@ -0,0 +1,383 @@
# Platform Render Profiles — Developer Guide
**Version:** 1.0 | **Target UE:** 5.55.7 | **Systems:** BPC_RenderPipelineManager (149) + DA_RenderPipelineProfile
---
## Purpose
This guide covers setting up per-platform render pipeline configurations in a UE5 project using the Modular Game Framework's render profile system. It explains how to configure Lumen vs baked lighting, Nanite vs traditional LODs, shadow systems, upscalers, and platform-specific constraints — all driven by `DA_RenderPipelineProfile` Data Assets.
---
## Core Concept
UE5's rendering pipeline features (Lumen GI, Nanite, Virtual Shadow Maps) are **not runtime-switchable** — they must be set before the engine initializes or before a level loads. The framework's solution:
1. **Data Asset** (`DA_RenderPipelineProfile`) — Defines render configs per quality tier per platform
2. **Manager** (`BPC_RenderPipelineManager`) — Reads profiles, applies CVars, handles reload requirements
3. **Settings** (`SS_SettingsSystem`) — Persists player's quality choice
4. **UI** (`WBP_SettingsMenu`) — Exposes quality controls with warnings for destructive changes
---
## 1. Creating DA_RenderPipelineProfile Instances
### File Structure
```
Content/Game/DataAssets/RenderProfiles/
├── DA_RPP_PS5.uasset ← PlayStation 5 profile
├── DA_RPP_PS5_Pro.uasset ← PS5 Pro (PSSR support)
├── DA_RPP_PS4.uasset ← PS4 / PS4 Pro
├── DA_RPP_Xbox_Series.uasset ← Xbox Series X|S
├── DA_RPP_Xbox_One.uasset ← Xbox One / One X
├── DA_RPP_PC_High.uasset ← PC: RTX 2000+ / RX 6000+
├── DA_RPP_PC_Low.uasset ← PC: GTX 900-1600 / iGPU
├── DA_RPP_SteamDeck.uasset ← Steam Deck
├── DA_RPP_Switch.uasset ← Nintendo Switch
└── DA_RPP_Switch_2.uasset ← Switch 2 (future)
```
### Profile Creation Walkthrough (PS5 Example)
1. Content Browser → `Content/Game/DataAssets/RenderProfiles/`
2. Right-click → **Miscellaneous → Data Asset**
3. Select class: `DA_RenderPipelineProfile`
4. Name: `DA_RPP_PS5`
5. Open the asset, configure:
**Platform Defaults:**
| Field | Value |
|-------|-------|
| `Platform` | `PS5` |
| `DefaultQualityPreset` | `Medium` |
| `SupportedPipelines` | `[Lumen_GI, Baked_Lightmass, SSGI]` |
| `SupportedUpscalers` | `[TSR, PSSR, FSR]` |
| `MaxResolutionScale` | `1.0` |
| `MaxFPS` | `120` |
| `VRAMBudget_MB` | `14336` |
| `bSupportsNanite` | `true` |
| `bSupportsLumen` | `true` |
| `bSupportsHWRT` | `true` |
**Quality Presets:**
Add 5 entries to the `QualityPresets` map:
| Key (FName) | Config |
|-------------|--------|
| `Low` | GIMethod=Baked, Shadow=CSM, Reflection=Captures, Upscaler=TSR(Perf), Mesh=LOD, Resolution=0.70, FPS=60 |
| `Medium` | GIMethod=Lumen_Low, Shadow=VSM_Low, Reflection=Lumen_Low, Upscaler=TSR(Balanced), Mesh=Nanite, Resolution=0.85, FPS=60 |
| `High` | GIMethod=Lumen_High, Shadow=VSM_High, Reflection=Lumen_High, Upscaler=TSR(Quality), Mesh=Nanite, Resolution=1.0, FPS=60 |
| `Ultra` | GIMethod=Lumen_Ultra, Shadow=VSM_Ultra, Reflection=Lumen_Ultra, Upscaler=PSSR, Mesh=Nanite, Resolution=1.0, FPS=60 |
| `Cinematic` | GIMethod=Lumen+HWRT, Shadow=VSM+RT, Reflection=Lumen+RT, Upscaler=PSSR, Mesh=Nanite, Resolution=1.0, FPS=30 |
**Key detail:** The "Low" preset uses `bRequiresLevelReload = true` because it switches from Lumen→Baked and Nanite→LOD. Medium→High does NOT require reload (both use Lumen+Nanite, only quality differs).
---
## 2. Render Pipeline Method Decision Tree
```
START: Which platform is the player on?
├─ PS5 / Xbox Series / PC_High
│ ├─ Player chooses "Low" → Baked Lightmass + CSM + LOD meshes
│ │ └─ Goal: 60 FPS on base console, 120 FPS on Pro/PC
│ ├─ Player chooses "Medium/High" → Lumen + VSM + Nanite
│ │ └─ Goal: 60 FPS at 85-100% resolution
│ └─ Player chooses "Ultra/Cinematic" → Lumen + HWRT + Nanite + PSSR/DLSS
│ └─ Goal: Max quality, 30-60 FPS
├─ PS4 / Xbox_One
│ └─ ALL presets → Baked Lightmass + CSM + LOD meshes
│ └─ These platforms do NOT support Lumen/Nanite
│ └─ Upscaler: TAAU (built-in, lightweight)
│ └─ Goal: 30 FPS at 60-90% resolution
├─ Switch
│ └─ ALL presets → Baked Lightmass + CSM + ProxyGeometry/LOD
│ └─ Upscaler: NIS (lightweight) or FSR
│ └─ Goal: 30 FPS at 40-70% resolution (docked) / 30 FPS at 30-55% (handheld)
└─ SteamDeck
└─ Low/Medium → Baked/SSGI + CSM + LOD
└─ High → SSGI + CSM + LOD
└─ Upscaler: FSR
└─ Goal: 40-60 FPS at 70-85% resolution
```
---
## 3. Upscaler Integration Guide
### 3.1 Available Upscalers and Requirements
| Upscaler | Plugin Required | Platforms | Quality | Notes |
|----------|----------------|-----------|---------|-------|
| **TSR** (Temporal Super Resolution) | Built-in UE5 | ALL | Good | Default choice. No plugin needed. Works everywhere. |
| **DLSS 3** | NVIDIA DLSS Plugin | PC (RTX 2000+) | Excellent | Best upscaling quality. Frame Gen available on RTX 4000+. |
| **FSR 2/3** | AMD FSR Plugin | ALL (cross-vendor) | Good | Works on all GPUs including consoles and Switch. |
| **PSSR** | PS5 SDK Plugin | PS5 Pro only | Excellent | Hardware-accelerated ML upscaling. PS5 Pro exclusive. |
| **XeSS** | Intel XeSS Plugin | PC (Arc, RTX, RX 6000+) | Very Good | Intel's ML upscaler. Works on Intel Arc + NVIDIA + AMD. |
| **NIS** | NVIDIA Plugin (or built-in) | ALL (cross-vendor) | Acceptable | Lightweight spatial upscaler. Good for Switch/low-end. |
| **TAAU** | Built-in UE5 | ALL | Legacy | Gen-4/Gen-5 TAA upsampling. Fallback for all platforms. |
### 3.2 Setting Up DLSS (PC High Profile)
1. Install the **NVIDIA DLSS** plugin from the UE Marketplace or NVIDIA Developer site
2. Enable in `Edit → Plugins → NVIDIA DLSS`
3. In `DA_RPP_PC_High`:
- Add `DLSS` to `SupportedUpscalers`
- Set default upscaler to `DLSS`
4. Console commands the manager sets when DLSS is active:
```
r.NGX.DLSS.Enable 1
r.NGX.DLSS.Quality {0=UltraPerf, 1=Perf, 2=Balanced, 3=Quality, 4=UltraQuality}
r.NGX.DLSS.DilateMotionVectors 1
r.NGX.DLSS.Reflections 1
r.NGX.DLSS.WaterReflections 1
```
### 3.3 Setting Up FSR 2 (Cross-Platform Profile)
1. Install **AMD FidelityFX FSR 2** plugin
2. Enable in plugins
3. Console commands:
```
r.FidelityFX.FSR2.Enabled 1
r.FidelityFX.FSR2.QualityMode {0=Quality, 1=Balanced, 2=Performance, 3=UltraPerformance}
r.FidelityFX.FI.Enabled 1 ← Frame Interpolation (FSR 3)
```
### 3.4 Upscaler Fallback Chain
`BPC_RenderPipelineManager.GetAvailableUpscalers()` implements a priority-ordered fallback:
```
Primary: DLSS (if RTX GPU detected)
Fallback 1: TSR (always available)
Fallback 2: FSR (if plugin installed)
Fallback 3: NIS (cross-vendor lightweight)
Fallback 4: TAAU (always available, legacy)
```
---
## 4. Baked Lighting Fallback Configuration
When a platform/profile selects `Baked_Lightmass` as the GI method:
### 4.1 Level Preparation for Baked Lighting
1. Set all primary lights to **Static** (not Stationary, not Movable)
2. Build lighting: `Build → Build Lighting Only`
3. Ensure lightmap UVs exist on all static meshes
4. Configure `World Settings → Lightmass Settings`:
- `Static Lighting Level Scale`: 1.0
- `Num Indirect Lighting Bounces`: 310
- `Indirect Lighting Quality`: 1.04.0
5. Place `Lightmass Importance Volumes` around playable areas
### 4.2 Reflection Setup for Baked Mode
When Lumen Reflections are off:
1. Place `Sphere Reflection Captures` throughout the level
2. Place `Box Reflection Captures` in interior rooms
3. Set capture resolution: 128256 (performance) or 512 (quality)
4. Build reflections: `Build → Build Reflection Captures`
### 4.3 Console Variables for Baked Mode
```
r.DynamicGlobalIlluminationMethod 0 ← Disable Lumen
r.Lumen.Reflections.Allow 0 ← Disable Lumen reflections
r.Shadow.Virtual.Enable 0 ← Disable VSM, use CSM
r.SSR.Quality 2 ← Enable screen-space reflections (fallback)
r.ReflectionMethod 2 ← Use reflection captures
```
### 4.4 Mesh LOD Fallback
When Nanite is disabled:
```
r.Nanite 0 ← Disable Nanite
r.StaticMeshLODDistanceScale 1.0 ← Maintain normal LOD distances
r.SkeletalMeshLODBias 0 ← No LOD bias for skeletal meshes
```
Ensure all static meshes have:
- LODs generated (LOD0 = full detail, LOD1 = 50%, LOD2 = 25%, LOD3 = 10%)
- `LODForCollision` set appropriately
- `MinLOD` not locked to 0
---
## 5. Planar Capture System Compatibility
### How Pipeline Changes Affect Captures
| Pipeline Change | Impact on Planar Captures | Mitigation |
|----------------|--------------------------|------------|
| Lumen → Baked | Capture renders baked lighting (looks correct). No Lumen overhead → faster captures. | `SS_PlanarCaptureManager` increases `GlobalQualityCap` by 1 tier |
| Baked → Lumen | Capture now includes Lumen GI (if capture profile allows). Higher cost. | `SS_PlanarCaptureManager` caps `GlobalQualityCap` to `Medium` or lower |
| Nanite → LOD | Faster capture render. No Nanite rasterization cost. | `SS_PlanarCaptureManager` increases budget |
| LOD → Nanite | Slower capture. Nanite in SceneCapture2D adds cost. | `SS_PlanarCaptureManager` reduces `MaxRegisteredSurfaces` |
| CSM → VSM | Higher quality shadows in captures. Minor cost increase. | No budget change needed |
| Upscaler change | **No impact** — captures render at native quality tier resolution | — |
### Capture Budget Adjustment Logic (in SS_PlanarCaptureManager)
```cpp
void SS_PlanarCaptureManager::AdjustBudgetForPipeline(const SRenderPipelineConfig& Config)
{
if (Config.GIMethod == ERenderPipelineMethod::Baked_Lightmass)
{
// Lumen is off — captures are cheaper, allow higher quality
GlobalQualityCap = EPlanarCaptureQualityTier::High;
MaxRegisteredSurfaces = DefaultMaxSurfaces * 1.5;
}
else if (Config.GIMethod == ERenderPipelineMethod::Lumen_GI)
{
// Lumen is on — captures are expensive
GlobalQualityCap = EPlanarCaptureQualityTier::Medium;
MaxRegisteredSurfaces = DefaultMaxSurfaces;
}
if (Config.MeshStrategy == EMeshStrategy::Nanite)
{
// Nanite in captures adds cost — reduce quality slightly
if (GlobalQualityCap > EPlanarCaptureQualityTier::Medium)
GlobalQualityCap = EPlanarCaptureQualityTier::Medium;
}
}
```
### Per-Capture Lumen Toggle
In `BPC_PlanarCapture.ApplyQualityTier()`:
```cpp
// If global pipeline has Lumen OFF, force capture Lumen OFF
if (!RenderPipelineManager->IsLumenEnabled())
{
QualityProfile.bEnableLumen = false;
}
```
---
## 6. Settings Menu Integration
### Video/Graphics Tab Layout (WBP_SettingsMenu enhancement)
```
┌────────────────────────────────────────────┐
│ VIDEO / GRAPHICS │
│ │
│ QUALITY PRESET [Low ▼] │
│ ⚠ Changing to Low requires level reload │
│ │
│ ──────── ADVANCED ──────── │
│ Resolution Scale [========|===] 85% │
│ Window Mode [Fullscreen ▼] │
│ VSync [✓] │
│ Frame Rate Limit [====|======] 60 FPS │
│ │
│ Global Illumination [Lumen ▼] ⚠ reload │
│ Shadow Method [VSM ▼] ⚠ reload │
│ Reflections [Lumen ▼] ⚠ reload │
│ Mesh Quality [Nanite ▼] ⚠ reload │
│ │
│ Upscaler [DLSS ▼] │
│ Upscaler Quality [Quality ▼] │
│ │
│ Texture Quality [====|======] High │
│ Post Process [====|======] High │
│ Shadows [====|======] High │
│ View Distance [====|======] High │
│ Foliage [====|======] High │
│ Anti-Aliasing [====|======] High │
│ │
│ Motion Blur [✓] │
│ Depth of Field [✓] │
│ │
│ Brightness [======|====] 1.0 │
│ HDR [✓] (if supported) │
│ │
│ [Apply] [Reset to Defaults] │
└────────────────────────────────────────────┘
```
Features labeled `⚠ reload` require a level transition to take effect. The UI shows a warning banner when any of these are changed.
---
## 7. Platform Certification Notes
### Sony PlayStation TRC Requirements
- **Minimum FPS:** PS5 must maintain 60 FPS in performance mode, 30 FPS in quality mode
- **Resolution Floor:** PS5 must render at ≥ 1080p internal before upscaling
- **PS4:** Must maintain 30 FPS, ≥ 720p internal
- **PSSR:** Must be listed as available upscaler on PS5 Pro
- **HDR:** Must support HDR10 output if display supports it
### Microsoft Xbox Requirements
- **Xbox Series X:** Must support 60 FPS performance mode + 30 FPS quality mode
- **Xbox Series S:** May target 30 FPS in quality mode
- **VRR:** Should support Variable Refresh Rate on HDMI 2.1 displays
- **Quick Resume:** Must save render pipeline state for Quick Resume compatibility
### Nintendo Switch Requirements
- **Handheld:** Must maintain ≥ 30 FPS at native 720p panel
- **Docked:** Must maintain ≥ 30 FPS at ≥ 720p internal (upscaled to 1080p)
- **Dynamic Resolution:** Strongly recommended for maintaining frame rate
- **Memory:** VRAM budget must be ≤ ~3.25 GB (4 GB total, 0.75 GB reserved)
---
## 8. Testing Matrix
| Platform | Low Preset | Medium | High | Ultra | Validate |
|----------|-----------|--------|------|-------|----------|
| PS5 | Baked+CSM+LOD | Lumen+VSM+Nanite | Lumen+VSM+Nanite | Lumen+VSM+Nanite | Check 60 FPS at all tiers |
| PS4 | Baked+CSM+LOD | Baked+CSM+LOD | Baked+CSM+LOD | N/A | Check 30 FPS floor |
| Xbox Series X | Baked+CSM+LOD | Lumen+VSM+Nanite | Lumen+VSM+Nanite | Lumen+VSM+Nanite | Check VRR support |
| Xbox One | Baked+CSM+Proxy | Baked+CSM+LOD | Baked+CSM+LOD | N/A | Check 30 FPS floor |
| Switch (docked) | Baked+CSM+Proxy | Baked+CSM+LOD | Baked+CSM+LOD | N/A | Dynamic res active |
| Switch (handheld) | Baked+CSM+Proxy | Baked+CSM+LOD | N/A | N/A | 30 FPS at 720p |
| PC High (RTX 3080) | SSGI+CSM+LOD | Lumen+VSM+Nanite | Lumen+VSM+Nanite | Lumen+HWRT+Nanite | DLSS working |
| PC Low (GTX 1060) | Baked+CSM+Proxy | Baked+CSM+LOD | SSGI+CSM+LOD | N/A | FSR working |
| SteamDeck | Baked+CSM+LOD | SSGI+CSM+LOD | SSGI+CSM+LOD | N/A | FSR working, 40 FPS |
---
## 9. Quick Reference: Console Variables
| Setting | CVar | Values |
|---------|------|--------|
| **GI Method** | `r.DynamicGlobalIlluminationMethod` | 0=Off, 1=Lumen, 2=SSGI |
| **Lumen Reflections** | `r.Lumen.Reflections.Allow` | 0/1 |
| **Lumen Diffuse** | `r.Lumen.DiffuseIndirect.Allow` | 0/1 |
| **Shadow Method** | `r.Shadow.Virtual.Enable` | 0=CSM, 1=VSM |
| **Shadow Quality** | `sg.ShadowQuality` | 0=NONE, 1=LOW, 2=MED, 3=HIGH, 4=EPIC |
| **Reflections** | `r.ReflectionMethod` | 0=None, 1=Lumen, 2=SSR |
| **SSR Quality** | `r.SSR.Quality` | 0-4 |
| **Nanite** | `r.Nanite` | 0/1 |
| **TSR** | `r.TemporalAA.Upsampling` | 0/1 |
| **Screen %** | `r.ScreenPercentage` | 25200 |
| **Texture Quality** | `sg.TextureQuality` | 03 |
| **Post Process** | `sg.PostProcessQuality` | 03 |
| **View Distance** | `sg.ViewDistanceQuality` | 03 |
| **Foliage** | `sg.FoliageQuality` | 03 |
| **AA Quality** | `sg.AntiAliasingQuality` | 03 |
| **Motion Blur** | `r.MotionBlurQuality` | 0=NONE, 2=MED, 4=EPIC |
| **DoF** | `r.DepthOfFieldQuality` | 0=NONE, 2=MED, 4=EPIC |
| **Volumetric Clouds** | `r.VolumetricCloud` | 0/1 |
| **Virtual Textures** | `r.VT.Enable` | 0/1 |
| **Ray Tracing** | `r.RayTracing` | 0/1 |
| **Texture Pool** | `r.Streaming.PoolSize` | MB value |
| **LOD Scale** | `r.StaticMeshLODDistanceScale` | 0.53.0 |
| **Foliage LOD** | `foliage.LODDistanceScale` | 0.53.0 |
---
*Platform Render Profiles Guide v1.0 — Part of the UE5 Modular Game Framework developer docs. Systems: BPC_RenderPipelineManager (149), DA_RenderPipelineProfile.*

View File

@@ -1,6 +1,6 @@
# Project Setup & Migration Guide — UE5 Modular Game Framework
**Version:** 1.0 | **Target UE:** 5.55.7
**Version:** 1.1 | **Target UE:** 5.55.7
This guide covers everything you need to configure when migrating the framework into a new or existing UE5 project. Follow these steps in order.
@@ -17,6 +17,9 @@ Enable these in `Edit → Plugins`:
| `GameplayTags` | Gameplay | All tag-driven state management (enabled by default) |
| `Motion Warping` | Animation | `BPC_ContextualTraversalSystem` vault/mantle |
| `Gameplay Abilities` | Gameplay | *(optional — only if using GAS for combat layer)* |
| `NVIDIA DLSS` | Rendering | *(optional — DLSS super resolution, FrameGen on RTX)* |
| `AMD FidelityFX FSR` | Rendering | *(optional — FSR 2/3 super resolution on all platforms)* |
| `Intel XeSS` | Rendering | *(optional — XeSS ML upscaling)* |
### 1.2 Framework Files to Copy
Copy these folders into your project's `Content/` directory:
@@ -370,7 +373,69 @@ The framework boot order on a fresh project launch:
---
## 11. Updating This Document
## 11. Render Pipeline Setup (NEW)
> **Reference:** [`docs/developer/platform-render-profiles.md`](platform-render-profiles.md) for the full guide.
### 11.1 Create Per-Platform Render Profiles
```
Content/Game/DataAssets/RenderProfiles/
├── DA_RPP_PS5.uasset
├── DA_RPP_PS4.uasset
├── DA_RPP_Xbox_Series.uasset
├── DA_RPP_Xbox_One.uasset
├── DA_RPP_PC_High.uasset
├── DA_RPP_PC_Low.uasset
├── DA_RPP_SteamDeck.uasset
└── DA_RPP_Switch.uasset
```
### 11.2 Configure Default CVars for Baked Lighting Fallback
In `Config/DefaultEngine.ini`:
```ini
[ConsoleVariables]
; Low-end fallback defaults (overridden by RenderPipelineManager for high-end)
r.DynamicGlobalIlluminationMethod=1 ; 1=Lumen (default for UE5)
r.Shadow.Virtual.Enable=1 ; 1=VSM (default)
r.Nanite=1 ; 1=Nanite (default)
; On PS4/Switch, these are overridden by platform .ini
```
### 11.3 Platform-Specific Config INIs
Create `Config/PS4/PS4Engine.ini`:
```ini
[ConsoleVariables]
r.DynamicGlobalIlluminationMethod=0 ; Disable Lumen on PS4
r.Shadow.Virtual.Enable=0 ; Use CSM on PS4
r.Nanite=0 ; Use LODs on PS4
sg.ShadowQuality=2 ; Medium shadows
sg.TextureQuality=2 ; Medium textures
r.ScreenPercentage=75 ; 75% resolution
r.Upscale.Quality=2 ; TAAU quality
```
Create `Config/Switch/SwitchEngine.ini`:
```ini
[ConsoleVariables]
r.DynamicGlobalIlluminationMethod=0
r.Shadow.Virtual.Enable=0
r.Nanite=0
sg.ShadowQuality=1 ; Low shadows on Switch
sg.TextureQuality=1 ; Low textures
r.ScreenPercentage=50 ; 50% resolution (docked)
r.Upscale.Quality=3 ; NIS quality
r.Streaming.PoolSize=768 ; 768MB texture pool (3.25GB RAM - system)
```
### 11.4 Set Up Baked Lightmaps for Low-End Levels
For levels that need to support Low/Medium quality presets on PS4/Switch:
1. Duplicate your level: `L_Asylum_WardA_Baked` (baked lighting variant)
2. Set all lights to **Static** (not Stationary/Movable)
3. Build lighting: `Build → Build Lighting Only`
4. Place `Lightmass Importance Volume` and `Reflection Captures`
5. Sub-level loading: on PS4/Switch, stream the baked variant; on PS5/PC, stream the Lumen variant
## 12. Updating This Document
When adding new framework systems that require Project Settings changes:

View File

@@ -583,12 +583,13 @@ Each game asset proves a specific framework system works. Below: every framework
| 102 | BPC_ProgressStatTracker | Total playtime, collectibles found, enemies killed |
| 103 | SS_AchievementSystem | "First Light" (flashlight), "Untouchable" (no-damage run) |
### 12-settings (Settings — 3 systems)
### 12-settings (Settings — 5 systems)
| # | Framework System | Demonstrated By |
|---|----------------|----------------|
| 104 | BPC_AccessibilitySettings | Subtitle toggle, colorblind mode, controller remap |
| 105 | SS_SettingsSystem | Audio/Video/Controls persistent settings |
| 148 | BPC_HapticsController | Controller vibration: damage, weapon fire, heartbeat, footsteps, scares. Attached to PC_HorrorController |
| 149 | BPC_RenderPipelineManager | Quality presets (Low→Cinematic), Lumen/Baked switching, DLSS/FSR/TSR upscaling. PlanarCapture budget aware |
### 13-polish (Polish — 9 systems)
| # | Framework System | Demonstrated By |
@@ -693,6 +694,7 @@ Each `docs/game/` file explains how to build a specific section of the prototype
| [`polish-loading-credits.md`](polish-loading-credits.md) | Tutorials, loading screen, credits, debug, analytics | 19, 20 |
| [`state-gating-examples.md`](state-gating-examples.md) | DA_StateGatingTable game-specific rules | 14 |
| [`haptics-example.md`](haptics-example.md) | Controller haptics — damage, weapons, heartbeat, scares, platform tuning | 5, 10, 13, 14 |
| [`render-profiles-example.md`](render-profiles-example.md) | Render pipeline — per-platform quality presets, Lumen vs Baked, upscaling setup | 5, 12, 14 |
---