Files
suaveplan/openspec/archive/2026-04-19-enterprise-random-family/specs/noise-functions/spec.md
2026-05-27 23:29:53 +01:00

59 lines
2.8 KiB
Markdown

# Capability: noise-functions
## ADDED Requirements
### Package identity
- REQ-NOISE-001: Package name `@suaveplan/noise`, `packages/universal/noise`.
- REQ-NOISE-002: Runtime deps: `@suaveplan/error`, `tslib`. Zero PRNG deps — noise uses its own internal seeded hash permutation tables.
- REQ-NOISE-003: `"sideEffects": false`.
### Output contract
- REQ-NOISE-010: All noise functions return values normalised to `[-1, 1]` except Worley which returns `[0, 1]` distance values.
- REQ-NOISE-011: All noise functions accept `seed: number` as first parameter. Same seed + same coordinates always returns same value.
### Perlin noise
- REQ-NOISE-020: Exports `perlin2(seed: number, x: number, y: number): number`.
- REQ-NOISE-021: Exports `perlin3(seed: number, x: number, y: number, z: number): number`.
### Simplex noise
- REQ-NOISE-030: Exports `simplex2(seed: number, x: number, y: number): number`.
- REQ-NOISE-031: Exports `simplex3(seed: number, x: number, y: number, z: number): number`.
- REQ-NOISE-032: Exports `simplex4(seed: number, x: number, y: number, z: number, w: number): number`.
### Value noise
- REQ-NOISE-040: Exports `value2(seed: number, x: number, y: number): number`.
- REQ-NOISE-041: Exports `value3(seed: number, x: number, y: number, z: number): number`.
### Worley / cell noise
- REQ-NOISE-050: Exports `WorleyMode = "F1" | "F2" | "F1-F2"`.
- REQ-NOISE-051: Exports `worley2(seed: number, x: number, y: number, mode?: WorleyMode): number`. Default mode `"F1"`.
- REQ-NOISE-052: Exports `worley3(seed: number, x: number, y: number, z: number, mode?: WorleyMode): number`.
### Fractional Brownian Motion
- REQ-NOISE-060: Exports `FbmOptions = { octaves?: number; lacunarity?: number; gain?: number }`. Defaults: `octaves=6, lacunarity=2.0, gain=0.5`.
- REQ-NOISE-061: Exports `fbm2(noiseFn: (seed, x, y) => number, seed: number, x: number, y: number, opts?: FbmOptions): number`.
- REQ-NOISE-062: Exports `fbm3(noiseFn: (seed, x, y, z) => number, seed: number, x: number, y: number, z: number, opts?: FbmOptions): number`.
### Blue noise / Poisson disk sampling
- REQ-NOISE-070: Exports `blueNoiseSample(width: number, height: number, minDistance: number, opts?: { seed?: number; rng?: Rng; maxSamples?: number }): [number, number][]`.
- REQ-NOISE-071: Uses Bridson's algorithm. Default `maxSamples = 100_000`; throws `NoiseError("NOISE.BLUE.SAMPLE_LIMIT_EXCEEDED")` if exceeded.
### Error surface
- REQ-NOISE-080: Exports `NoiseError extends SuaveplanError<NoiseCode>`.
- REQ-NOISE-081: Codes: `NOISE.BLUE.SAMPLE_LIMIT_EXCEEDED`, `NOISE.FBM.INVALID_OCTAVES`.
### Quality
- REQ-NOISE-090: 100% statement + branch coverage.
- REQ-NOISE-091: fast-check: determinism (same seed+coords → same output), output range `[-1,1]` (or `[0,1]` for Worley).
- REQ-NOISE-092: mitata benchmarks: each function at 1k and 100k evaluations.