# 135 — Room Acoustic Preset Data Asset (`DA_RoomAcousticPreset`)

## Purpose
Data Asset that defines the acoustic properties of a room or environment. Contains reverb parameters (density, decay time, wet/dry mix), occlusion settings, and per-bus application flags. Used by `BP_RoomAudioZone` and `SS_AudioManager` to configure room reverb when the player enters a new acoustic zone.

## Dependencies
- **Requires:** `SS_AudioManager` (132 — applies reverb to buses), `BP_RoomAudioZone` (133 — assigns preset to zone volume)
- **Required By:** `BP_RoomAudioZone` (133 — direct assignment), `SS_AudioManager` (132 — room transition interpolation), Sound Design Team (primary editor target)
- **Engine/Plugin Requirements:** MetaSounds plugin (reverb parameters), GameplayTags plugin

## Class Info
| Property | Value |
|----------|-------|
| **Parent Class** | `PrimaryDataAsset` |
| **Class Type** | Data Asset |
| **Asset Path** | `Content/Framework/Audio/RoomPresets/DA_RoomAcousticPreset.uasset` |
| **Implements Interfaces** | *(none)* |

---

## 1. Enums

*Uses E_AudioBusCategory from `SS_AudioManager` (132).*

---

## 2. Structs

*Uses `S_RoomAcousticProfile` from `SS_AudioManager` (132). Field reference:*

| Field | Type | Description |
|-------|------|-------------|
| `RoomPresetName` | `FName` | Identifier for this room preset |
| `ReverbDensity` | `Float` (0–1) | How dense the reverb reflections are |
| `ReverbDecayTime` | `Float` (seconds) | RT60 decay time |
| `ReverbWetLevel` | `Float` (0–1) | Wet/dry mix for reverb |
| `ReflectionsDelay` | `Float` (ms) | Pre-delay before reflections start |
| `RoomSizeScale` | `Float` (0.5–3.0) | Perceived room size |
| `OcclusionMultiplier` | `Float` (0–1) | How much walls occlude sound (0=open, 1=blocked) |
| `LowPassCutoff` | `Float` (Hz) | Low-pass filter cutoff (simulates wall filtering) |
| `bApplyToSFX` | `Boolean` | Apply reverb to SFX bus |
| `bApplyToAmbience` | `Boolean` | Apply reverb to Ambience bus |
| `bApplyToDialogue` | `Boolean` | Apply reverb to Dialogue bus |
| `TransitionTime` | `Float` (seconds) | Crossfade time when entering this room |

---

## 3. Variables

### Acoustic Profile (Instance Editable)

| Variable | Type | Default | Category | Description |
|----------|------|---------|----------|-------------|
| `AcousticProfile` | `S_RoomAcousticProfile` | *(preset-specific)* | `Acoustic` | Complete acoustic profile struct (see below for per-preset values) |

### Meta (Instance Editable)

| Variable | Type | Default | Category | Description |
|----------|------|---------|----------|-------------|
| `PresetDisplayName` | `Text` | `"Unnamed Preset"` | `Meta` | Human-readable name shown in editor dropdowns |
| `PresetDescription` | `Text` | `""` | `Meta` | Description of what this preset is for |
| `bIsDefaultFallback` | `Boolean` | `false` | `Meta` | Is this the default/fallback preset? (Outdoor should be true) |

---

## 4. Default Preset Values

### `DA_RP_Outdoor` (Default Fallback)
| Field | Value |
|-------|-------|
| `RoomPresetName` | `Outdoor` |
| `ReverbDensity` | `0.05` |
| `ReverbDecayTime` | `0.3` |
| `ReverbWetLevel` | `0.05` |
| `ReflectionsDelay` | `5.0` |
| `RoomSizeScale` | `3.0` (max — open space) |
| `OcclusionMultiplier` | `0.0` (no occlusion) |
| `LowPassCutoff` | `20000` (no filtering) |
| `bApplyToSFX` | `true` |
| `bApplyToAmbience` | `true` |
| `bApplyToDialogue` | `true` |
| `TransitionTime` | `1.0` |

### `DA_RP_SmallRoom`
| Field | Value |
|-------|-------|
| `RoomPresetName` | `SmallRoom` |
| `ReverbDensity` | `0.4` |
| `ReverbDecayTime` | `0.6` |
| `ReverbWetLevel` | `0.25` |
| `ReflectionsDelay` | `15.0` |
| `RoomSizeScale` | `0.8` |
| `OcclusionMultiplier` | `0.3` |
| `LowPassCutoff` | `8000` |
| `bApplyToSFX` | `true` |
| `bApplyToAmbience` | `true` |
| `bApplyToDialogue` | `true` |
| `TransitionTime` | `1.5` |

### `DA_RP_LargeHall`
| Field | Value |
|-------|-------|
| `RoomPresetName` | `LargeHall` |
| `ReverbDensity` | `0.7` |
| `ReverbDecayTime` | `3.0` |
| `ReverbWetLevel` | `0.5` |
| `ReflectionsDelay` | `40.0` |
| `RoomSizeScale` | `2.5` |
| `OcclusionMultiplier` | `0.1` |
| `LowPassCutoff` | `10000` |
| `bApplyToSFX` | `true` |
| `bApplyToAmbience` | `true` |
| `bApplyToDialogue` | `true` |
| `TransitionTime` | `2.0` |

### `DA_RP_Cave`
| Field | Value |
|-------|-------|
| `RoomPresetName` | `Cave` |
| `ReverbDensity` | `0.8` |
| `ReverbDecayTime` | `4.5` |
| `ReverbWetLevel` | `0.65` |
| `ReflectionsDelay` | `60.0` |
| `RoomSizeScale` | `2.0` |
| `OcclusionMultiplier` | `0.6` |
| `LowPassCutoff` | `4000` |
| `bApplyToSFX` | `true` |
| `bApplyToAmbience` | `true` |
| `bApplyToDialogue` | `true` |
| `TransitionTime` | `2.5` |

### `DA_RP_VoidSpace`
| Field | Value |
|-------|-------|
| `RoomPresetName` | `VoidSpace` |
| `ReverbDensity` | `0.15` |
| `ReverbDecayTime` | `8.0` |
| `ReverbWetLevel` | `0.8` |
| `ReflectionsDelay` | `120.0` |
| `RoomSizeScale` | `3.0` |
| `OcclusionMultiplier` | `0.0` (ethereal — no occlusion) |
| `LowPassCutoff` | `3000` |
| `bApplyToSFX` | `true` |
| `bApplyToAmbience` | `true` |
| `bApplyToDialogue` | `true` |
| `TransitionTime` | `3.0` (dramatic slow transition) |

### `DA_RP_Industrial`
| Field | Value |
|-------|-------|
| `RoomPresetName` | `Industrial` |
| `ReverbDensity` | `0.6` |
| `ReverbDecayTime` | `2.0` |
| `ReverbWetLevel` | `0.4` |
| `ReflectionsDelay` | `25.0` |
| `RoomSizeScale` | `2.2` |
| `OcclusionMultiplier` | `0.4` |
| `LowPassCutoff` | `6000` |
| `bApplyToSFX` | `true` |
| `bApplyToAmbience` | `true` |
| `bApplyToDialogue` | `true` |
| `TransitionTime` | `1.5` |

### `DA_RP_Bathroom`
| Field | Value |
|-------|-------|
| `RoomPresetName` | `Bathroom` |
| `ReverbDensity` | `0.9` |
| `ReverbDecayTime` | `1.2` |
| `ReverbWetLevel` | `0.55` |
| `ReflectionsDelay` | `8.0` |
| `RoomSizeScale` | `0.6` |
| `OcclusionMultiplier` | `0.7` |
| `LowPassCutoff` | `7000` |
| `bApplyToSFX` | `true` |
| `bApplyToAmbience` | `true` |
| `bApplyToDialogue` | `true` |
| `TransitionTime` | `1.0` |

---

## 5. Functions

### Public Functions

#### `GetProfileName` → `FName`
- **Description:** Returns the `RoomPresetName` from the acoustic profile. Used for debug display and logging.
- **Parameters:** *(none)*
- **Blueprint Authority:** Any (Pure)

#### `GetTransitionTime` → `Float`
- **Description:** Returns the crossfade duration. Used by `SS_AudioManager` for transition interpolation.
- **Parameters:** *(none)*
- **Blueprint Authority:** Any (Pure)

#### `ShouldApplyToBus` → `Boolean`
- **Description:** Returns whether this preset should apply reverb to a specific bus category.
- **Parameters:**
  | Param | Type | Description |
  |-------|------|-------------|
  | `Bus` | `E_AudioBusCategory` | Which bus to check |
- **Blueprint Authority:** Any (Pure)

---

## 6. Blueprint Graph Logic Flow

### Room Preset Application (in SS_AudioManager)

```mermaid
flowchart TD
    A[Enter Room Audio Zone] --> B[BP_RoomAudioZone.OnBeginOverlap]
    B --> C[SS_AudioManager.SetRoomPreset: DA_RoomAcousticPreset]
    C --> D[Read AcousticProfile fields]
    D --> E{bApplyToSFX?}
    E -->|Yes| F[Apply reverb to SFX Bus]
    E -->|No| G[Skip SFX Bus]
    F --> H{bApplyToAmbience?}
    G --> H
    H -->|Yes| I[Apply reverb to Ambience Bus]
    H -->|No| J[Skip Ambience Bus]
    I --> K{bApplyToDialogue?}
    J --> K
    K -->|Yes| L[Apply reverb to Dialogue Bus]
    K -->|No| M[Skip Dialogue Bus]
    L --> N[Begin crossfade over TransitionTime]
    M --> N
    N --> O[Room transition complete]
```

---

## 7. Data Asset Edibility Notes

### Sound Designer Workflow
1. Create a new Data Asset: `Miscellaneous → Data Asset → DA_RoomAcousticPreset`
2. Name it with the `DA_RP_` prefix (e.g., `DA_RP_ConcertHall`)
3. Fill in the `AcousticProfile` struct with desired reverb values
4. Set `PresetDisplayName` and `PresetDescription` for editor clarity
5. Set `TransitionTime` based on how dramatic the room change should feel
6. Assign the preset to `BP_RoomAudioZone.RoomPreset` in level

### Creating a New Room Preset
1. Duplicate the closest existing preset (e.g., copy `DA_RP_SmallRoom` for a closet)
2. Adjust values:
   - Smaller room → higher `ReverbDensity`, lower `ReverbDecayTime`, lower `RoomSizeScale`
   - Larger room → lower `ReverbDensity`, higher `ReverbDecayTime`, higher `RoomSizeScale`
   - Outdoor → near-zero `ReverbWetLevel`, minimal `ReflectionsDelay`
   - Cave/underground → high `ReverbDecayTime`, high `OcclusionMultiplier`, low `LowPassCutoff`
3. Use `bApplyToSFX` / `bApplyToAmbience` / `bApplyToDialogue` to selectively apply reverb (e.g., dialogue through a radio should NOT get room reverb)

### Tuning Guidelines
| Parameter | Small Room | Medium Room | Large Hall | Outdoor | Cave |
|-----------|-----------|-------------|------------|---------|------|
| `ReverbDensity` | 0.4–0.6 | 0.3–0.5 | 0.6–0.8 | 0.0–0.1 | 0.7–0.9 |
| `ReverbDecayTime` | 0.3–0.8s | 0.8–2.0s | 2.0–4.0s | 0.1–0.5s | 3.0–6.0s |
| `ReverbWetLevel` | 0.15–0.3 | 0.2–0.4 | 0.4–0.6 | 0.0–0.1 | 0.5–0.8 |
| `ReflectionsDelay` | 5–20ms | 15–40ms | 30–60ms | 2–10ms | 40–80ms |
| `RoomSizeScale` | 0.5–1.0 | 1.0–2.0 | 2.0–3.0 | 3.0 | 1.5–2.5 |
| `LowPassCutoff` | 5000–10000Hz | 6000–12000Hz | 8000–16000Hz | 20000Hz | 2000–5000Hz |

---

## 8. Communication Matrix

| Who Talks | How | What Is Sent |
|-----------|-----|-------------|
| `BP_RoomAudioZone` (133) | `Direct: Reference` | Holds a `DA_RoomAcousticPreset` as `RoomPreset` variable |
| `SS_AudioManager` (132) | `Function Call: SetRoomPreset(Preset)` | Receives preset, interpolates reverb parameters |
| `SS_AudioManager` (132) | `Function Call: PopRoomPreset()` | Restores previous preset from stack |
| Sound Design Team | Data Asset Editor | Edits reverb profiles, transition times |

---

## 9. Validation / Testing Checklist

- [ ] All 7 default presets exist in `Content/Framework/Audio/RoomPresets/`
- [ ] Each preset has a unique `RoomPresetName`
- [ ] `ReverbDensity`, `ReverbWetLevel`, `OcclusionMultiplier` values between 0.0 and 1.0
- [ ] `ReverbDecayTime` > 0.1 (minimum audible)
- [ ] `ReflectionsDelay` between 0 and 200ms
- [ ] `RoomSizeScale` between 0.5 and 3.0
- [ ] `LowPassCutoff` between 1000 and 20000 Hz
- [ ] `TransitionTime` between 0.5 and 5.0 seconds
- [ ] `bApplyToSFX` is true for all presets (SFX should always get room reverb)
- [ ] `DA_RP_Outdoor` has `bIsDefaultFallback = true`
- [ ] `DA_RP_VoidSpace` has longer `TransitionTime` (dramatic effect)
- [ ] At least one preset has `bApplyToDialogue = false` (for testing isolated dialogue bus)
- [ ] Edge case: Switching to a preset with `TransitionTime = 0` applies instantly
- [ ] Edge case: `RoomSizeScale = 3.0` (Outdoor) — no audible "room" reflection artifacts
- [ ] Edge case: `ReverbDecayTime = 8.0` (VoidSpace) — long tail sounds ethereal, not glitchy

---

## 10. Reuse Notes

- Create as many presets as needed per level. Presets are small Data Assets — negligible memory cost.
- `bApplyToAmbience = false` is useful for "music-only" zones (e.g., boss arenas where ambient reverb would muddy the music).
- `bApplyToDialogue = false` is useful for radio/phone conversations — the EQ toggle on the Dialogue bus handles the "radio voice" effect, not room reverb.
- The `TransitionTime` field should be tuned carefully: too fast sounds abrupt; too slow feels laggy. 1.0–1.5s is a safe default.
- For open-world streaming, assign the outdoor preset as the global default and place room zones only around enclosed spaces — this minimizes active zone overlap.

---

*Blueprint Spec: DA_RoomAcousticPreset — Room acoustic profile Data Asset. Architecture document: [`metasounds-audio-system.md`](../../architecture/metasounds-audio-system.md)*
