# Epics and Stories — HS_DollyCam ## Epic Map ``` Epic 1: Core Camera Engine (HS_CamEngineCore.lsl) Epic 2: Tour Runtime (HS_CamEngineTour.lsl) Epic 3: Playlist Engine (HS_CamPlaylist.lsl) Epic 4: Chat Commands (HS_CamController.lsl) Epic 5: Menu UI (HS_CamMenu.lsl) Epic 6: Visual Markers (HS_CamMarkers.lsl) Epic 7: FOV Control (HS_CamFov.lsl) Epic 8: Tour Commands Helper (HS_CamTourCommands.lsl) Epic 9: Configuration (HS_CamEngine.properties) Epic 10: Documentation (AGENTS.md, manuals) ``` --- ## Epic 1: Core Camera Engine (`HS_CamEngineCore.lsl`) > Low-level camera interface. Manages permissions, `llSetCameraParams`, Follow/Lock math. | Story ID | Story | Status | |----------|-------|--------| | 1.1 | As a user, I can request camera control via `/88 cam on` and release it via `/88 cam off` | Done | | 1.2 | As a user, I can move the camera smoothly to a target position with configurable duration | Done | | 1.3 | As a user, I can lock the camera to a target (position or object UUID) | Done | | 1.4 | As a user, I can follow a target object in World/Local/Yaw coordinate frame | Done | | 1.5 | As a developer, the engine dumps configuration via `CE_EVT_CFG_DUMP` for consumption by Playlist/TourEngine | Done | | 1.6 | As the system, `CE_INT_SET_CAM` hot path uses direct separator lookup (no `llParseString2List`) | Done | | 1.7 | As the system, Follow/Lock mutual exclusion is enforced (enabling one disables the other) | Done | --- ## Epic 2: Tour Runtime (`HS_CamEngineTour.lsl`) > High-frequency multi-waypoint tour playback. Catmull-Rom splines, trapezoidal motion, ~30Hz throttling. | Story ID | Story | Status | |----------|-------|--------| | 2.1 | As a user, I can run a continuous tour across multiple presets with spline interpolation | Done | | 2.2 | As a user, I can specify linear interpolation mode for tours | Done | | 2.3 | As the system, tour frames are throttled to ~30Hz via `tour_cam_min_interval` | Done | | 2.4 | As the system, segment caching avoids repeated `llList2Vector` lookups during timer playback | Done | | 2.5 | As a user, tour waypoints can have specific hold times and weights | Done | | 2.6 | As a user, FOV ramps between waypoints are supported in tours | Done | | 2.7 | As the system, `startfirst` mode flag allows tours to begin from first preset without camera state roundtrip | Done | | 2.8 | As the system, active tour lists stay in script memory (not Linkset Data) for performance | Done | --- ## Epic 3: Playlist Engine (`HS_CamPlaylist.lsl`) > Notecard-driven playlist playback. Reads inventory notecards, executes commands sequentially. | Story ID | Story | Status | |----------|-------|--------| | 3.1 | As a user, I can play a playlist from an inventory notecard: `/88 play [gap_ms]` | Done | | 3.2 | As a user, my notecard supports `moveto`, `goto`, `load`, `wait`, `tour...endtour`, `dollyzoom`, `fov`, `lock`, `follow` commands | Done | | 3.3 | As a user, tour blocks in notecards build a single continuous payload sent to TourEngine | Done | | 3.4 | As a user, compact notecard tours (`tour [mode] `) avoid slow multi-line reads | Done | | 3.5 | As the system, playlist chains moves on `MOVE_DONE` unless a `wait` line appears after `moveto` (early cut) | Done | | 3.6 | As the system, `loadPreset()` uses targeted field parsing instead of full string splitting | Done | | 3.7 | As the system, notecard reading uses `llGetNotecardLineSync` with `NAK` fallback | Done | | 3.8 | As a user, I can stop any active playlist with `/88 stop` | Done | --- ## Epic 4: Chat Commands (`HS_CamController.lsl`) > Central command router. Preset management, state persistence, command dispatch. | Story ID | Story | Status | |----------|-------|--------| | 4.1 | As a user, I can save the current camera as a numbered preset: `/88 save ` | Done | | 4.2 | As a user, I can load a preset instantly: `/88 load ` | Done | | 4.3 | As a user, I can smoothly move to a preset: `/88 moveto [ms]` | Done | | 4.4 | As a user, I can delete a preset: `/88 del ` | Done | | 4.5 | As a user, I can list all saved presets: `/88 list [from] [count]` | Done | | 4.6 | As a user, I can get help with all available commands: `/88 help` | Done | | 4.7 | As a user, presets are stored in Linkset Data with keys `P1`, `P2`, … | Done | | 4.8 | As a user, Follow/Lock state persists across script resets | Done | | 4.9 | As a user, marker visibility state persists across script resets | Done | | 4.10 | As the system, all commands are restricted to the object owner | Done | | 4.11 | As a demo user, saving is limited to `DEMO_MAX_SLOTS` when `DEMO_MODE=TRUE` | Done | | 4.12 | As a user, the HUD auto-hides during animated moves to prevent flicker | Done | --- ## Epic 5: Menu UI (`HS_CamMenu.lsl`) > Dialog menus for common workflows. Secondary to notecard playlist. | Story ID | Story | Status | |----------|-------|--------| | 5.1 | As a user, I can touch the HUD to open a menu with Save/MoveTo/Load/Play/Tour/Follow/Lock buttons | Done | | 5.2 | As a user, the menu shows page state (pagination for many presets/targets) | Done | | 5.3 | As a user, the menu can list nearby avatars/objects as follow/lock targets | Done | | 5.4 | As a user, menu-built tours are forwarded to TourCommands via `PH_CMD_TOURRUN` | Done | | 5.5 | As a user, menu Follow/Lock actions are mutually exclusive | Done | --- ## Epic 6: Visual Markers (`HS_CamMarkers.lsl`) > Marker pyramids rezzed at preset positions for visual navigation. | Story ID | Story | Status | |----------|-------|--------| | 6.1 | As a user, I can rez N marker pyramids at preset positions: `/88 show cams [N]` | Done | | 6.2 | As a user, I can remove all markers: `/88 hide cams` | Done | | 6.3 | As a user, clicking a marker pyramid loads and moves to the corresponding preset | Done | | 6.4 | As a user, marker count is limited to 1–30 | Done | | 6.5 | As a user, marker state (shown/hidden, count) persists across script resets | Done | | 6.6 | As the system, marker communication uses `llRegionSayTo` when target key is known | Done | --- ## Epic 7: FOV Control (`HS_CamFov.lsl`) > Field of View adjustment via RLVa. | Story ID | Story | Status | |----------|-------|--------| | 7.1 | As a user, I can set the viewer FOV in radians: `/88 fov ` | Done | | 7.2 | As a user, I can set the viewer FOV in degrees: `/88 fovdeg ` | Done | | 7.3 | As a user, FOV values are clamped to 10°–179° range | Done | | 7.4 | As a user, FOV commands are no-ops if RLVa is disabled (graceful degradation) | Done | | 7.5 | As the system, FOV state syncs across scripts when presets are loaded/saved | Done | --- ## Epic 8: Tour Commands Helper (`HS_CamTourCommands.lsl`) > Secondary tour command builder. Absorbs memory pressure from chat/menu one-shot tours. | Story ID | Story | Status | |----------|-------|--------| | 8.1 | As a user, I can run a one-liner tour: `/88 tour [mode] ...` | Done | | 8.2 | As a user, I can run a dolly zoom: `/88 dollyzoom [mode] ` | Done | | 8.3 | As a user, menu-built tours are handled without adding memory pressure to Playlist | Done | | 8.4 | As the system, tour parsing uses targeted preset helpers (no full `llParseString2List`) | Done | --- ## Epic 9: Configuration (`HS_CamEngine.properties`) > Engine configuration parameters. | Story ID | Story | Status | |----------|-------|--------| | 9.1 | As a developer, I can tune `move_step`, `follow_step`, `default_move_ms`, `default_focus_dist` | Done | | 9.2 | As a developer, I can tune move/follow lag values (`move_pos_lag`, `move_focus_lag`, etc.) | Done | | 9.3 | As a developer, I can tune tour parameters (`tour_cam_min_interval`, `tour_pos_epsilon`, `tour_max_points`) | Done | | 9.4 | As a developer, I can tune position/focus thresholds (`pos_threshold`, `focus_threshold`) | Done | | 9.5 | As a developer, `follow_predict=0.10` controls follow prediction offset | Done | --- ## Epic 10: Documentation > Project documentation for AI agents and developers. | Story ID | Story | Status | |----------|-------|--------| | 10.1 | As a developer, I can read `AGENTS.md` for detailed component docs and communication constants | Done | | 10.2 | As a developer, I can read `project-context.md` for AI agent rules | Done | | 10.3 | As a developer, I can read `docs/system_architecture.md` for high-level architecture | Done | | 10.4 | As a user, I can read `HS_DollyCam_Manual` for setup and usage instructions | Done | | 10.5 | As a user, I can read `HS_DollyCam_Manual_FOV_Extension` for FOV-specific documentation | Done | --- ## Future Epic Candidates (Not Yet Implemented) | Epic | Description | |------|-------------| | **Epic F1: Preset Export/Import** — Export presets to notecard, import from notecard | | **Epic F2: Tour Preset Save** — Save current tour configuration as a reusable preset | | **Epic F3: Multi-Object HUD** — Split Controller into smaller prims for reduced memory pressure | | **Epic F4: Tour Preview** — Play tour at reduced speed for preview before full-speed playback | | **Epic F5: Marker Customization** — Customize marker color/size/transparency | | **Epic F6: Tour Editor Notecard** — Generate/edit playlist notecards from menu | | **Epic F7: Camera State Dump** — Export current camera position/focus as a notecard command | | **Epic F8: Tour Loop Mode** — Loop tours continuously with configurable repeat count |