Files
UE5-Modular-Game-Framework/docs/checklists/planar-capture-system.md
Lefteris Notas 0a2d08b2ad Add Planar Capture System implementation checklist and developer reference
- Created a comprehensive implementation checklist for the Planar Capture System (Systems 136-147) detailing tasks across multiple phases including C++ core, material foundation, Blueprint actors, data assets, integration, and performance testing.
- Added a developer reference document outlining the architecture, data flow, state machine, budget enforcement, render target pooling, horror features, integration points, multiplayer networking, performance characteristics, debugging methods, and build order for the capture systems.
- Introduced examples of capture surface usage in the Project Void horror game, including specific implementations for mirrors, monitors, portals, and fake windows, along with a checklist for integration tasks.
2026-05-22 15:36:08 +03:00

198 lines
9.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Planar Capture System — Implementation Checklist
**Version:** 1.0 | **Phase:** 17 | **Systems:** 136-147 (12 systems)
Use this checklist to track implementation of the Planar Capture System. Each checkbox represents a discrete task.
---
## Phase 17a — C++ Core (Systems 136-138)
### C++ Files to Create
- [ ] `Source/PG_Framework/Public/Capture/PlanarCaptureCommon.h` — enums, structs, quality profiles
- [ ] `Source/PG_Framework/Private/Capture/PlanarCaptureCommon.cpp` — compilation stub
- [ ] `Source/PG_Framework/Public/Capture/PlanarCaptureCameraUtils.h` — static math library
- [ ] `Source/PG_Framework/Private/Capture/PlanarCaptureCameraUtils.cpp` — mirror/portal/oblique math
- [ ] `Source/PG_Framework/Public/Capture/BPC_PlanarCapture.h` — component header
- [ ] `Source/PG_Framework/Private/Capture/BPC_PlanarCapture.cpp` — component implementation
- [ ] `Source/PG_Framework/Public/Capture/BP_PlanarCaptureActor.h` — actor header
- [ ] `Source/PG_Framework/Private/Capture/BP_PlanarCaptureActor.cpp` — actor implementation
- [ ] `Source/PG_Framework/Public/Capture/SS_PlanarCaptureManager.h` — subsystem header
- [ ] `Source/PG_Framework/Private/Capture/SS_PlanarCaptureManager.cpp` — subsystem implementation
### Build Configuration
- [ ] Update `PG_Framework.Build.cs` — add `"Renderer"` and `"RenderCore"` to PublicDependencyModuleNames
- [ ] Update `PG_Framework.h` — include `Capture/PlanarCaptureCommon.h`
- [ ] Compile and fix any errors
- [ ] Verify module loads in UE5 editor
### Initial Testing
- [ ] Spawn `BP_PlanarCaptureActor` in test level (use Blueprint child with mesh)
- [ ] Verify `SS_PlanarCaptureManager` is auto-created by engine
- [ ] Verify `BPC_PlanarCapture` initializes without crash
- [ ] Verify `RegisterSurface` logs to output log
- [ ] Test `CaptureNow()` — verify no crash during capture
- [ ] Test `ShutdownCapture()` — verify RT returned to pool
---
## Phase 17b — Material Foundation (Systems 144, 145, 147)
### M_CaptureSurface_Master
- [ ] Create Material: Name=`M_CaptureSurface_Master`, Domain=Surface, ShadingModel=Unlit
- [ ] Build Layer 0: Texture Sample Parameter "CaptureTexture" with UV flip branch (bIsMirror static switch)
- [ ] Build Layer 1: Condensation normal (Panner + Normal Strength driven by DistortionAmplitude MPC)
- [ ] Build Layer 2: Fresnel edge fade (CameraVector · VertexNormal)
- [ ] Build Layer 3: Dirt/scratch multiply (DirtMask × DirtOpacity, tinted by SurfaceAge)
- [ ] Build Layer 4: Steam/fog lerp (animated noise × SteamIntensity)
- [ ] Build Layer 5: Steam emissive glow (noise × SteamEmissiveIntensity → Emissive Color)
- [ ] Build Layer 6: Text reveal mask (TextRevealMask × TextRevealProgress)
- [ ] Build Layer 7: Mirror darkness (multiply by 1.0 - MirrorDarkness)
- [ ] Build Layer 8: Wrong reflection crossfade (lerp NormalRT ↔ DelayedRT by WrongReflectionBlend)
- [ ] Add bIsMirror static switch (true = UV flip)
- [ ] Add bEnableHorrorLayers static switch (false = Layers 6-8 compiled out)
- [ ] Add 10 MPC Collection Parameter nodes referencing MPC_CaptureSurface
- [ ] Compile → zero material errors
### MPC_CaptureSurface
- [ ] Create Material Parameter Collection: `MPC_CaptureSurface`
- [ ] Add 10 scalar parameters: SteamIntensity(default 0), DirtOpacity(0), CondensationFlow(0), DistortionAmplitude(0), MirrorDarkness(0), WrongReflectionBlend(0), TextRevealProgress(0), SteamEmissiveIntensity(0), DelayedReflectionBlend(0), SurfaceAge(0)
- [ ] Add 2 vector parameters: SurfaceTintColor(1,1,1,1), SteamColor(0.8,0.85,0.9,1)
### Material Instances
- [ ] Create `MI_Mirror_Clean` — bIsMirror=true, bEnableHorrorLayers=false
- [ ] Create `MI_Mirror_Dirty` — DirtOpacity=0.4, SurfaceAge=0.3
- [ ] Create `MI_Mirror_Steam` — SteamIntensity=0.6, CondensationFlow=0.5
- [ ] Create `MI_Mirror_Horror` — bEnableHorrorLayers=true
- [ ] Create `MI_Portal_Standard` — bIsMirror=false
- [ ] Create `MI_Monitor_Security` — bIsMirror=false
- [ ] Create `MI_FakeWindow_Interior` — bIsMirror=false
---
## Phase 17c — Blueprint Actors (Systems 139-143)
### BP_Mirror (139)
- [ ] Create Blueprint: Parent=`BP_PlanarCaptureActor`, Name=`BP_Mirror`
- [ ] Set `CaptureComponent.CaptureMode = Mirror` in Class Defaults
- [ ] Assign plane mesh to `SurfaceMesh`
- [ ] Assign `MI_Mirror_Clean` to SurfaceMesh Material[0]
- [ ] Set `SurfaceMPC` = `MPC_CaptureSurface`
- [ ] Add custom events: `SetMirrorDirtLevel(Float)`, `SetMirrorSteamLevel(Float)`
- [ ] Test: place in level, walk up, verify reflection renders
### BP_Portal (140)
- [ ] Create Blueprint: Parent=`BP_PlanarCaptureActor`, Name=`BP_Portal`
- [ ] Add `TeleportTrigger` BoxComponent
- [ ] Set `CaptureComponent.CaptureMode = Portal`
- [ ] Assign `MI_Portal_Standard` to SurfaceMesh
- [ ] Implement `OnPortalOverlap` event with `HasAuthority` gate
- [ ] Implement `Server_TeleportThroughPortal` RPC
- [ ] Add `LinkedTargetSurface` variable (set per instance)
- [ ] Test: place source + target portals, verify view renders and teleport works
### BP_Monitor (141)
- [ ] Create Blueprint: Parent=`BP_PlanarCaptureActor`, Name=`BP_Monitor`
- [ ] Set `CaptureComponent.CaptureMode = Monitor, CaptureFOV = 70`
- [ ] Override QualityProfiles[0].CaptureInterval = 0.2 (5fps)
- [ ] Assign `MI_Monitor_Security` to SurfaceMesh
- [ ] Add `bPoweredOn`, `StaticNoiseIntensity`, `FlickerCurve` variables
- [ ] Implement `PowerOn()`, `PowerOff()`, `SetStaticNoise()` functions
- [ ] Place CameraActor in level, assign to `FixedCameraActor`
- [ ] Test: power on/off cycle, static noise, scanline appearance
### BP_HorrorMirror (142)
- [ ] Create Blueprint: Parent=`BP_Mirror`, Name=`BP_HorrorMirror`
- [ ] Set `CaptureComponent.CaptureMode = HorrorMirror`
- [ ] Hero tier: set `DelayedFrameCount = 5`
- [ ] Place `WrongReflectionActor` (Metahuman/ghost) hidden in level
- [ ] Create Float Curves: `Curve_WrongReflectionBlend`, `Curve_MirrorDarkness`, `Curve_UVDistortion`
- [ ] Build `HorrorScareTimeline` with 4 tracks
- [ ] Implement `TriggerHorrorScare()` event
- [ ] Wire to `BPC_ScareEventSystem.TriggerScareEvent()`
- [ ] Wire audio to `SS_AudioManager.PlaySoundAtLocation()`
- [ ] Test: trigger scare, verify wrong reflection appears and fades, MPC params return to zero
### BP_FakeWindow (143)
- [ ] Create Blueprint: Parent=`BP_PlanarCaptureActor`, Name=`BP_FakeWindow`
- [ ] Set `CaptureComponent.CaptureMode = FakeWindow, CaptureFOV = 100`
- [ ] Assign `MI_FakeWindow_Interior` to SurfaceMesh
- [ ] Create sublevel with view room + SceneCaptureCamera
- [ ] Implement `CheckPlayerDistance` timer for sublevel streaming
- [ ] Implement `SetWeatherOverlay(Weather)` function
- [ ] Test: sublevel streams in/out based on distance
---
## Phase 17d — Data Asset (System 146)
### DA_PlanarCaptureProfile
- [ ] Create Data Asset: `DA_PlanarCaptureProfile` (PrimaryDataAsset or custom C++ class)
- [ ] Add variables: DefaultMode, QualityProfileOverrides, ShowOnly/Hidden actors, bStartEnabled, bDestructible, material override
- [ ] Create profile instances: `DA_HeroMirror`, `DA_SecurityMonitor`, `DA_HorrorMirror_ScareReady`
- [ ] Add `CaptureProfile` variable to `BP_PlanarCaptureActor` (Instance Editable, Expose on Spawn)
- [ ] Wire BeginPlay to apply profile
---
## Phase 17e — Integration
### Scare System Integration
- [ ] `BP_HorrorMirror.TriggerHorrorScare()``BPC_ScareEventSystem.TriggerScareEvent(Tag)` (101)
- [ ] Create `DA_ScareEvent` instance for mirror apparition scare (references existing 127 pattern)
### Audio Integration
- [ ] All sound triggers route through `SS_AudioManager` (132)
- [ ] Mirror shatter: `SS_AudioManager.PlaySoundAtLocation()`
- [ ] Portal whoosh: `SS_AudioManager.PlaySoundAtLocation()`
- [ ] Monitor static/hum: `SS_AudioManager.PlaySoundAtLocation()`
### State Manager Integration
- [ ] Portal teleport: `BPC_StateManager.IsActionPermitted(Teleport Tag)` (130)
- [ ] Horror scare: `BPC_StateManager.IsActionPermitted(Scare Tag)` before triggering
- [ ] Add `Framework.Action.Teleport`, `Framework.Action.Scare` tags to GameplayTag data tables
### Persistence Integration
- [ ] `BP_PlanarCaptureActor` implements `I_Persistable` (36)
- [ ] `CollectState()`: save bIsDestroyed, DirtOpacity, SteamIntensity, SurfaceAge
- [ ] `RestoreState()`: apply saved state, update MPC params
### Input Integration
- [ ] Portal transition pushes inspection input context via `SS_EnhancedInputManager` (128)
### Camera Integration
- [ ] Portal transition applies FOV animation via `BPC_CameraStateLayer` (14) (optional)
---
## Phase 17f — Polish & Performance
- [ ] Performance test: 1 mirror @ Hero → GPU profiling baseline
- [ ] Performance test: 3 mirrors @ High → verify budget enforcement
- [ ] Performance test: 10 mirrors, walk around → verify quality tiers scale correctly
- [ ] Edge case: mirror behind wall → verify frustum cull sets Off
- [ ] Edge case: player very far → verify distance sets Off
- [ ] Edge case: mirror destroyed during scene capture → no crash
- [ ] Edge case: rapid enable/disable cycle → no RT leak
- [ ] Memory test: verify RT pool releases all targets on level unload
- [ ] Multiplayer test: server destroys mirror, verify clients disable
- [ ] Multiplayer test: two players look at same mirror, verify both see correct reflection
---
## Documentation Verification
- [ ] `docs/blueprints/17-capture/` — 12 spec files created and reviewed
- [ ] `docs/blueprints/INDEX.md` — updated with 17-capture section
- [ ] `docs/developer/INDEX.md` — updated with 17-capture-systems entry
- [ ] `docs/developer/17-capture-systems.md` — developer reference created
- [ ] `CONTEXT.md` — Phase 17 added to Build Order, directory structure updated
- [ ] `UE5_Modular_Game_Framework.md` — systems 136-147 documented
- [ ] `docs/architecture/planar-capture-system.md` — architecture spec created
- [ ] `docs/architecture/blueprint-limitations-workarounds.md` — SceneCapture2D C++ workarounds added
- [ ] `docs/checklists/cpp-blueprint-status.md` — 12 new systems added to status grid
---
*Planar Capture System Checklist v1.0 — Track each checkbox as you implement.*