import type { FishMarineLife } from "../../domain/models/OceanModels.js"; import type { IFishRenderer } from "../contracts/IFishRenderer.js"; import type { IFishEffectRenderer } from "../contracts/IFishEffectRenderer.js"; import type { IFishFaceRenderer } from "../contracts/IFishFaceRenderer.js"; import type { IFishFinRenderer } from "../contracts/IFishFinRenderer.js"; import type { IFishPatternRenderer } from "../contracts/IFishPatternRenderer.js"; import type { IFishBodyRenderer } from "../contracts/IFishBodyRenderer.js"; /** * Fish Rendering Orchestrator * * Coordinates specialized rendering services to draw anatomically accurate procedural fish: * - Body shapes (FishBodyRenderer) * - Fins with physics (FishFinRenderer) * - Patterns and textures (FishPatternRenderer) * - Facial features (FishFaceRenderer) * - Effects like bioluminescence (FishEffectRenderer) */ export declare class FishRenderer implements IFishRenderer { private effectRenderer; private faceRenderer; private finRenderer; private patternRenderer; private bodyRenderer; private bodyOutlineCalculator; constructor(effectRenderer: IFishEffectRenderer, faceRenderer: IFishFaceRenderer, finRenderer: IFishFinRenderer, patternRenderer: IFishPatternRenderer, bodyRenderer: IFishBodyRenderer); /** Reused offscreen layer for depth-band grading; sized on demand. */ private bandLayer?; drawFish(ctx: CanvasRenderingContext2D, fish: FishMarineLife[]): void; private drawFishByMode; /** * Draw fish in depth bands, grading each band as a unit. * * Atmospheric perspective — not size — is the dominant depth cue underwater: * distant subjects lose contrast and saturation and go soft as scattered * light accumulates between them and the viewer. Applying that needs the * fish pixels in isolation (a fog wash composited 'source-atop' over the main * canvas would tint the water and everything already drawn into it), so each * band renders to an offscreen layer, gets tinted/blurred/faded there, and is * composited back. * * Banded rather than per-fish so the cost is a fixed handful of layer * composites per frame instead of one offscreen buffer per fish. */ private drawFishGraded; private getBandLayer; /** * Calculate depth-based rendering modifiers from z value. * Uses DEPTH_TRANSITION constants for consistency. */ private getDepthModifiers; /** * Draw fish using spine chain data for organic body shape */ private drawSpineChainFish; /** * Create temporary SpineChain object from joint data */ private createTempSpineFromJoints; private drawSingleFish; /** * Wobble configuration matching FishWobbleAnimator */ private static readonly WOBBLE_CONFIGS; /** * Calculate wobble offset from fish state */ private calculateWobbleOffset; } //# sourceMappingURL=FishRenderer.d.ts.map