## ADDED Requirements ### Requirement: Render a moonlit ripple water panel inside the three.js canvas pipeline The system SHALL provide a shader-driven moonlit water panel component that renders inside the existing tresjs/three preview pipeline. #### Scenario: Render the default panel - **WHEN** the component is rendered with default parameters - **THEN** it MUST display a visible water-like surface with autonomous ripple motion - **AND** it MUST render through three.js-side shader logic rather than DOM or CSS animation ### Requirement: Preserve the reference panel's moonlit water identity The component MUST preserve shader-friendly equivalents of the reference effect's moon reflection, layered ripple motion, dark-water shading, and Fresnel-style edge response. #### Scenario: Show autonomous moonlit ripple motion - **WHEN** the component animation is running - **THEN** the surface MUST show continuous ripple motion and a visible moonlit highlight without requiring user interaction #### Scenario: Read as water rather than a generic glow plane - **WHEN** the panel is visible in preview - **THEN** the shading MUST communicate reflective water depth and edge lighting instead of a flat single-color surface ### Requirement: Preserve key public tuning controls from the reference The component MUST expose shader-friendly controls for ripple speed, moon glow, camera tilt, and wave intensity, and it MUST update the rendered result without requiring a remount. #### Scenario: Adjust the preserved reference-style controls - **WHEN** a developer changes ripple speed, moon glow, camera tilt, or wave intensity - **THEN** the visible motion, highlight emphasis, and perspective bias MUST update on the existing component instance ### Requirement: Exclude interaction-driven ripple behavior The first version MUST NOT implement click, pointer, hover, drag, or touch-driven ripple behavior from the reference page. #### Scenario: Ignore preview interaction - **WHEN** a user moves, clicks, or drags in preview - **THEN** the panel MUST continue its default autonomous animation without interaction-specific visual response ### Requirement: Default to a ground-ready square plane with safe parameter bounds The component MUST use a square plane geometry controlled by a single size value, default to a floor-like orientation, and clamp invalid numeric values to safe ranges. #### Scenario: Load the default square panel - **WHEN** the component is loaded from the service registry defaults - **THEN** it MUST appear aligned for ground placement without requiring manual rotation - **AND** it MUST use equal surface dimensions rather than a rectangular default plane #### Scenario: Clamp invalid values - **WHEN** a developer passes invalid or extreme numeric values for size, ripple speed, moon glow, camera tilt, wave intensity, Fresnel strength, or opacity - **THEN** the component MUST clamp or fallback to safe values and continue rendering ### Requirement: Keep shader source component-scoped and register through the service config Shader source code MUST be stored under `src/shader/moonlitRippleWaterPanelComponent/`, and the component MUST be available through `src/dcsConfig.ts` with usable defaults, config controls, preview metadata, and default placement. #### Scenario: Organize shader files - **WHEN** the component introduces custom shader logic - **THEN** the shader source MUST be read from component-scoped vertex and fragment files instead of inline shader strings #### Scenario: Load from the component registry - **WHEN** the dynamic component service loads its configured component list - **THEN** the moonlit ripple water panel component MUST be available without modifying generic preview view files