# 139 — Mirror Surface Actor (`BP_Mirror`)

## Purpose
Standard planar mirror surface. Designer configures mode, dirt layers, steam parameters, and surface aging. Extends `BP_PlanarCaptureActor` with default mirror configuration.

## Dependencies
- **Requires:** `BP_PlanarCaptureActor` (137), `BPC_PlanarCapture` (136)
- **Required By:** `BP_HorrorMirror` (142) — extends this for horror features
- **Engine/Plugin Requirements:** M_CaptureSurface_Master material, MPC_CaptureSurface

## Class Info
| Property | Value |
|----------|-------|
| **Parent Class** | `BP_PlanarCaptureActor` (C++ `ABP_PlanarCaptureActor`) |
| **Class Type** | Blueprint Actor |
| **Asset Path** | `Content/Framework/Capture/BP_Mirror.uasset` |
| **C++ Status** | 🔵 BP Spec Only — extends C++ parent |
| **BP Asset** | Create in editor: `BP_Mirror` |

## 1. Configuration (Class Defaults)

| Variable | Value | Description |
|----------|-------|-------------|
| `CaptureComponent.CaptureMode` | `Mirror` | Fixed to Mirror mode |
| `bStartEnabled` | `true` | Active by default |
| `bDestructible` | `false` | Can be shattered (override per instance) |
| `SurfaceMPC` | `MPC_CaptureSurface` | Assign the global MPC |

### Mirror-Specific Properties (Set via `SetSurfaceMPCParameter`)
| Parameter | Default | Range | Description |
|-----------|---------|-------|-------------|
| `DirtOpacity` | 0.0 | 0.0–1.0 | Dirt/scratch layer intensity |
| `SteamIntensity` | 0.0 | 0.0–1.0 | Steam fog visibility |
| `CondensationFlow` | 0.0 | 0.0–1.0 | Condensation rivulet normal intensity |
| `SurfaceAge` | 0.0 | 0.0–1.0 | Oxidation/yellowing tint |

## 2. Material Setup
| Slot | Material Instance | Description |
|------|------------------|-------------|
| SurfaceMesh[0] | `MI_Mirror_Clean` | Default clean mirror |

Pre-configured material instances to assign per mirror:
- `MI_Mirror_Clean` — Pristine mirror, no effects
- `MI_Mirror_Dirty` — DirtOpacity preset at 0.4
- `MI_Mirror_Steam` — SteamIntensity preset at 0.6, animated noise enabled

## 3. Event Graph

### Event BeginPlay
```
Event BeginPlay
  ├─ Parent: BeginPlay (registers with manager)
  ├─ Set CaptureComponent.CaptureMode = Mirror
  ├─ Set SurfaceMaterial(MI_Mirror_Clean)  // or designer-chosen MI
  └─ [If bStartEnabled] EnableSurface()
```

### Event: SetMirrorDirtLevel(Level: float)
```
SetMirrorDirtLevel(Level)
  ├─ Clamp Level to 0.0–1.0
  ├─ Call SetSurfaceMPCParameter("DirtOpacity", Level)
  └─ [If Level > threshold] Swap material to MI_Mirror_Dirty
```

### Event: SetMirrorSteamLevel(Level: float)
```
SetMirrorSteamLevel(Level)
  ├─ Clamp Level to 0.0–1.0
  ├─ Call SetSurfaceMPCParameter("SteamIntensity", Level)
  └─ Call SetSurfaceMPCParameter("CondensationFlow", Level * 0.5)
```

## 4. Communication Matrix
| Target | Method | What |
|--------|--------|------|
| `SS_PlanarCaptureManager` | Direct (inherited) | Registration |
| `BPC_PlanarCapture` | Direct (inherited) | Capture driving |
| `MPC_CaptureSurface` | SetScalarParameterValue (via PushMPCParameters) | Visual parameters |
| `SS_AudioManager` (132) | Direct (on shatter) | Shatter sound |

## 5. Manual Implementation Guide

### 5.1 Create BP_Mirror
1. Create Blueprint Class: Parent = `BP_PlanarCaptureActor`, Name = `BP_Mirror`
2. Open Class Defaults, set `CaptureComponent.CaptureMode` to `Mirror`
3. In Components: select `SurfaceMesh`, assign a plane mesh (e.g., `SM_Plane_200x200`)
4. Assign `MI_Mirror_Clean` to SurfaceMesh material slot 0
5. Set `SurfaceMPC` to `MPC_CaptureSurface`

### 5.2 Add Steam/Dirt Controls
1. In Event Graph, create custom event `SetMirrorDirtLevel(Float)`
2. Wire: `SetSurfaceMPCParameter("DirtOpacity", Level)`
3. Create custom event `SetMirrorSteamLevel(Float)`
4. Wire: `SetSurfaceMPCParameter("SteamIntensity", Level)` + `SetSurfaceMPCParameter("CondensationFlow", Level * 0.5)`

### 5.3 Level Placement
1. Drag `BP_Mirror` into level
2. Rotate so surface normal faces toward player viewing area
3. Set `SurfaceDisplayName` for debug identification
4. Adjust `ProximityTrigger.BoxExtent` to cover expected viewing area

## 6. Build Checklist
- [ ] Create BP_Mirror Blueprint child
- [ ] Assign plane mesh and MI_Mirror_Clean material
- [ ] Set CaptureMode=Mirror in defaults
- [ ] Assign MPC_CaptureSurface reference
- [ ] Test: place in level, walk up, verify reflection appears
- [ ] Test: walk away, verify quality drops to Off
- [ ] Test: call SetMirrorDirtLevel/SetMirrorSteamLevel from gameplay code
