@flare-engine/math 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +56 -1
- package/dist/index.d.mts +96 -4
- package/dist/index.d.mts.map +1 -1
- package/dist/index.d.ts +96 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +267 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +256 -5
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/circle.ts","../src/scalar.ts","../src/color.ts","../src/easings.ts","../src/intersection.ts","../src/mat3.ts","../src/random.ts","../src/rect.ts","../src/reward.ts","../src/transform2d.ts","../src/vec2.ts"],"sourcesContent":["import type { Rect } from './rect.js';\nimport type { Vec2 } from './vec2.js';\n\n/** Circle shape: center position + radius. */\nexport type Circle = { x: number; y: number; radius: number };\n\nexport const Circle = {\n /** Returns true if point is inside or on the circle. */\n contains(c: Circle, p: Vec2): boolean {\n const dx = p.x - c.x;\n const dy = p.y - c.y;\n return dx * dx + dy * dy <= c.radius * c.radius;\n },\n\n /** Returns true if two circles overlap (share area). */\n intersects(a: Circle, b: Circle): boolean {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const distSq = dx * dx + dy * dy;\n const radSum = a.radius + b.radius;\n return distSq < radSum * radSum;\n },\n\n /** Returns true if a circle and rect overlap. */\n intersectsRect(c: Circle, r: Rect): boolean {\n // Find closest point on rect to circle center\n const closestX = c.x < r.x ? r.x : c.x > r.x + r.width ? r.x + r.width : c.x;\n const closestY = c.y < r.y ? r.y : c.y > r.y + r.height ? r.y + r.height : c.y;\n const dx = c.x - closestX;\n const dy = c.y - closestY;\n return dx * dx + dy * dy <= c.radius * c.radius;\n },\n} as const;\n","/** Clamps value between min and max. */\nexport function clamp(value: number, min: number, max: number): number {\n return value < min ? min : value > max ? max : value;\n}\n\n/** Linearly interpolates between a and b by t (unclamped). */\nexport function lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n\n/** Returns the interpolation factor of value between a and b. */\nexport function inverseLerp(a: number, b: number, value: number): number {\n const range = b - a;\n if (range === 0) return 0;\n return (value - a) / range;\n}\n\n/** Maps value from [inMin, inMax] to [outMin, outMax]. */\nexport function map(\n value: number,\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n): number {\n return lerp(outMin, outMax, inverseLerp(inMin, inMax, value));\n}\n\nconst DEG_TO_RAD = Math.PI / 180;\nconst RAD_TO_DEG = 180 / Math.PI;\n\n/** Converts degrees to radians. */\nexport function degToRad(degrees: number): number {\n return degrees * DEG_TO_RAD;\n}\n\n/** Converts radians to degrees. */\nexport function radToDeg(radians: number): number {\n return radians * RAD_TO_DEG;\n}\n\n/** Returns true if a and b are approximately equal within epsilon. */\nexport function approxEquals(a: number, b: number, epsilon = 1e-6): boolean {\n return Math.abs(a - b) <= epsilon;\n}\n\n/** Wraps value into [min, max) range. */\nexport function wrap(value: number, min: number, max: number): number {\n const range = max - min;\n if (range === 0) return min;\n return min + ((((value - min) % range) + range) % range);\n}\n\n/** PingPong — bounces value back and forth in [0, length]. */\nexport function pingPong(t: number, length: number): number {\n if (length === 0) return 0;\n const tt = wrap(t, 0, length * 2);\n return length - Math.abs(tt - length);\n}\n\n/** Hermite smooth interpolation (0→1) with zero first-derivative at edges. */\nexport function smoothStep(edge0: number, edge1: number, x: number): number {\n const range = edge1 - edge0;\n if (range === 0) return x >= edge1 ? 1 : 0;\n const t = clamp((x - edge0) / range, 0, 1);\n return t * t * (3 - 2 * t);\n}\n\n/** Returns -1, 0, or 1. Unlike Math.sign, returns 0 for NaN. */\nexport function sign(value: number): number {\n if (Number.isNaN(value)) return 0;\n return value > 0 ? 1 : value < 0 ? -1 : 0;\n}\n\n/** Shortest signed angle delta a - b, wrapped to [-pi, pi] (closed both ends — strict comparisons\n * leave exact +/-pi unwrapped). Branch form (single +/-2pi correction)\n * — byte-identical to hand-rolled aim/homing turn math; do NOT swap for a modulo form (it shifts\n * results by ULPs at the +/-pi boundary). */\nexport function angleDelta(a: number, b: number): number {\n let diff = a - b;\n if (diff > Math.PI) diff -= 2 * Math.PI;\n else if (diff < -Math.PI) diff += 2 * Math.PI;\n return diff;\n}\n\n/** Rotates angle cur toward target by at most maxStep radians, shortest direction. Returns the new\n * angle (NOT re-wrapped). Branch-form step clamp — byte-identical to hand-rolled homing steering. */\nexport function rotateTowards(cur: number, target: number, maxStep: number): number {\n const diff = angleDelta(target, cur);\n const turn = diff > maxStep ? maxStep : diff < -maxStep ? -maxStep : diff;\n return cur + turn;\n}\n","import { clamp } from './scalar.js';\n\n/** RGBA color with components normalized to 0-1. */\nexport type Color = { r: number; g: number; b: number; a: number };\n\n/** OKLab perceptual color space (L 0-1, a and b unbounded in practice ±0.5). */\nexport type Oklab = { L: number; a: number; b: number };\n\n/** OKLCH polar form of OKLab (L 0-1, C >= 0, h degrees [0,360)). */\nexport type Oklch = { L: number; C: number; h: number };\n\n/**\n * Converts a single sRGB channel to linear light.\n * The 0.04045 threshold (modern WCAG errata) is numerically identical to the\n * older 0.03928 for 8-bit inputs and is shared by OKLab and WCAG luminance.\n */\nfunction srgbToLinear(c: number): number {\n return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n}\n\n/** Converts a single linear-light channel back to sRGB. */\nfunction linearToSrgb(c: number): number {\n return c <= 0.0031308 ? 12.92 * c : 1.055 * c ** (1 / 2.4) - 0.055;\n}\n\nexport const Color = {\n WHITE: { r: 1, g: 1, b: 1, a: 1 } as Color,\n BLACK: { r: 0, g: 0, b: 0, a: 1 } as Color,\n TRANSPARENT: { r: 0, g: 0, b: 0, a: 0 } as Color,\n\n /** Creates a Color from normalized 0-1 components. */\n create(r = 0, g = 0, b = 0, a = 1): Color {\n return { r, g, b, a };\n },\n\n /** Parses a hex string (#RGB, #RGBA, #RRGGBB, #RRGGBBAA). */\n fromHex(hex: string): Color {\n // Strip leading #\n let h = hex.startsWith('#') ? hex.slice(1) : hex;\n\n if (h.length === 3) {\n h = h[0]! + h[0]! + h[1]! + h[1]! + h[2]! + h[2]!;\n } else if (h.length === 4) {\n h = h[0]! + h[0]! + h[1]! + h[1]! + h[2]! + h[2]! + h[3]! + h[3]!;\n }\n\n const r = Number.parseInt(h.slice(0, 2), 16) / 255;\n const g = Number.parseInt(h.slice(2, 4), 16) / 255;\n const b = Number.parseInt(h.slice(4, 6), 16) / 255;\n const a = h.length >= 8 ? Number.parseInt(h.slice(6, 8), 16) / 255 : 1;\n return { r, g, b, a };\n },\n\n /** Converts to hex string #RRGGBB or #RRGGBBAA if alpha < 1. */\n toHex(c: Color): string {\n const r = Math.round(clamp(c.r, 0, 1) * 255)\n .toString(16)\n .padStart(2, '0');\n const g = Math.round(clamp(c.g, 0, 1) * 255)\n .toString(16)\n .padStart(2, '0');\n const b = Math.round(clamp(c.b, 0, 1) * 255)\n .toString(16)\n .padStart(2, '0');\n if (c.a < 1) {\n const a = Math.round(clamp(c.a, 0, 1) * 255)\n .toString(16)\n .padStart(2, '0');\n return `#${r}${g}${b}${a}`;\n }\n return `#${r}${g}${b}`;\n },\n\n /** Linearly interpolates between two colors. */\n lerp(a: Color, b: Color, t: number): Color {\n return {\n r: a.r + (b.r - a.r) * t,\n g: a.g + (b.g - a.g) * t,\n b: a.b + (b.b - a.b) * t,\n a: a.a + (b.a - a.a) * t,\n };\n },\n\n /** Component-wise multiplication. */\n multiply(a: Color, b: Color): Color {\n return {\n r: a.r * b.r,\n g: a.g * b.g,\n b: a.b * b.b,\n a: a.a * b.a,\n };\n },\n\n /**\n * Converts to a Skia-compatible color number (0xAARRGGBB).\n * Compatible with @shopify/react-native-skia Skia.Color() format.\n */\n toSkColor(c: Color): number {\n const r = Math.round(clamp(c.r, 0, 1) * 255) & 0xff;\n const g = Math.round(clamp(c.g, 0, 1) * 255) & 0xff;\n const b = Math.round(clamp(c.b, 0, 1) * 255) & 0xff;\n const a = Math.round(clamp(c.a, 0, 1) * 255) & 0xff;\n return ((a << 24) | (r << 16) | (g << 8) | b) >>> 0;\n },\n\n /** Converts sRGB Color to OKLab. Alpha is dropped. */\n toOklab(c: Color): Oklab {\n const rl = srgbToLinear(c.r);\n const gl = srgbToLinear(c.g);\n const bl = srgbToLinear(c.b);\n\n const l = 0.4122214708 * rl + 0.5363325363 * gl + 0.0514459929 * bl;\n const m = 0.2119034982 * rl + 0.6806995451 * gl + 0.1073969566 * bl;\n const s = 0.0883024619 * rl + 0.2817188376 * gl + 0.6299787005 * bl;\n\n const l_ = Math.cbrt(l);\n const m_ = Math.cbrt(m);\n const s_ = Math.cbrt(s);\n\n return {\n L: 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_,\n a: 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_,\n b: 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_,\n };\n },\n\n /**\n * Converts OKLab to sRGB Color. Out-of-gamut results are clamped to [0,1];\n * round-trips are exact only for in-gamut colors.\n */\n fromOklab(lab: Oklab, alpha = 1): Color {\n const l_ = lab.L + 0.3963377774 * lab.a + 0.2158037573 * lab.b;\n const m_ = lab.L - 0.1055613458 * lab.a - 0.0638541728 * lab.b;\n const s_ = lab.L - 0.0894841775 * lab.a - 1.291485548 * lab.b;\n\n const l = l_ ** 3;\n const m = m_ ** 3;\n const s = s_ ** 3;\n\n const rl = 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s;\n const gl = -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s;\n const bl = -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s;\n\n return {\n r: clamp(linearToSrgb(rl), 0, 1),\n g: clamp(linearToSrgb(gl), 0, 1),\n b: clamp(linearToSrgb(bl), 0, 1),\n a: alpha,\n };\n },\n\n /** Converts sRGB Color to OKLCH (polar OKLab). Achromatic colors get h = 0. */\n toOklch(c: Color): Oklch {\n const lab = Color.toOklab(c);\n const C = Math.hypot(lab.a, lab.b);\n const h = C < 1e-7 ? 0 : ((Math.atan2(lab.b, lab.a) * 180) / Math.PI + 360) % 360;\n return { L: lab.L, C, h };\n },\n\n /**\n * Converts OKLCH to sRGB Color. Hue is wrapped via ((h%360)+360)%360.\n * Out-of-gamut results are clamped; round-trips exact only in-gamut.\n */\n fromOklch(lch: Oklch, alpha = 1): Color {\n const hWrapped = ((lch.h % 360) + 360) % 360;\n const hRad = (hWrapped * Math.PI) / 180;\n return Color.fromOklab(\n { L: lch.L, a: lch.C * Math.cos(hRad), b: lch.C * Math.sin(hRad) },\n alpha,\n );\n },\n\n /** Euclidean distance in OKLab space between two sRGB colors. */\n deltaEOk(a: Color, b: Color): number {\n return Color.deltaEOkLab(Color.toOklab(a), Color.toOklab(b));\n },\n\n /** Euclidean distance between two OKLab values. */\n deltaEOkLab(a: Oklab, b: Oklab): number {\n return Math.hypot(a.L - b.L, a.a - b.a, a.b - b.b);\n },\n\n /** WCAG 2.x relative luminance. White = 1, black = 0. */\n relativeLuminance(c: Color): number {\n return 0.2126 * srgbToLinear(c.r) + 0.7152 * srgbToLinear(c.g) + 0.0722 * srgbToLinear(c.b);\n },\n\n /** WCAG 2.x contrast ratio. Order-independent; range [1, 21]. */\n contrastRatio(fg: Color, bg: Color): number {\n const l1 = Color.relativeLuminance(fg);\n const l2 = Color.relativeLuminance(bg);\n const lMax = Math.max(l1, l2);\n const lMin = Math.min(l1, l2);\n return (lMax + 0.05) / (lMin + 0.05);\n },\n} as const;\n","// Easing functions — all (t: number) => number, t in [0,1]\n// Robert Penner easings + spring, bounce, elastic variants.\n// Tree-shakeable named exports.\n\nconst PI = Math.PI;\nconst HALF_PI = PI / 2;\nconst TAU = PI * 2;\n\n// ─── Linear ─────────────────────────────────────────────────\nexport function linear(t: number): number {\n return t;\n}\n\n// ─── Step ───────────────────────────────────────────────────\nexport function step(t: number): number {\n return t < 1 ? 0 : 1;\n}\n\n// ─── Quad ───────────────────────────────────────────────────\nexport function easeInQuad(t: number): number {\n return t * t;\n}\nexport function easeOutQuad(t: number): number {\n return t * (2 - t);\n}\nexport function easeInOutQuad(t: number): number {\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n}\n\n// ─── Cubic ──────────────────────────────────────────────────\nexport function easeInCubic(t: number): number {\n return t * t * t;\n}\nexport function easeOutCubic(t: number): number {\n const t1 = t - 1;\n return t1 * t1 * t1 + 1;\n}\nexport function easeInOutCubic(t: number): number {\n return t < 0.5 ? 4 * t * t * t : 1 + (t - 1) * (2 * t - 2) * (2 * t - 2);\n}\n\n// ─── Quart ──────────────────────────────────────────────────\nexport function easeInQuart(t: number): number {\n return t * t * t * t;\n}\nexport function easeOutQuart(t: number): number {\n const t1 = t - 1;\n return 1 - t1 * t1 * t1 * t1;\n}\nexport function easeInOutQuart(t: number): number {\n const t1 = t - 1;\n return t < 0.5 ? 8 * t * t * t * t : 1 - 8 * t1 * t1 * t1 * t1;\n}\n\n// ─── Quint ──────────────────────────────────────────────────\nexport function easeInQuint(t: number): number {\n return t * t * t * t * t;\n}\nexport function easeOutQuint(t: number): number {\n const t1 = t - 1;\n return 1 + t1 * t1 * t1 * t1 * t1;\n}\nexport function easeInOutQuint(t: number): number {\n const t1 = t - 1;\n return t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * t1 * t1 * t1 * t1 * t1;\n}\n\n// ─── Sine ───────────────────────────────────────────────────\nexport function easeInSine(t: number): number {\n return 1 - Math.cos(t * HALF_PI);\n}\nexport function easeOutSine(t: number): number {\n return Math.sin(t * HALF_PI);\n}\nexport function easeInOutSine(t: number): number {\n return 0.5 * (1 - Math.cos(PI * t));\n}\n\n// ─── Expo ───────────────────────────────────────────────────\nexport function easeInExpo(t: number): number {\n return t === 0 ? 0 : 2 ** (10 * (t - 1));\n}\nexport function easeOutExpo(t: number): number {\n return t === 1 ? 1 : 1 - 2 ** (-10 * t);\n}\nexport function easeInOutExpo(t: number): number {\n if (t === 0) return 0;\n if (t === 1) return 1;\n return t < 0.5 ? 0.5 * 2 ** (20 * t - 10) : 1 - 0.5 * 2 ** (-20 * t + 10);\n}\n\n// ─── Circ ───────────────────────────────────────────────────\nexport function easeInCirc(t: number): number {\n return 1 - Math.sqrt(1 - t * t);\n}\nexport function easeOutCirc(t: number): number {\n const t1 = t - 1;\n return Math.sqrt(1 - t1 * t1);\n}\nexport function easeInOutCirc(t: number): number {\n return t < 0.5\n ? 0.5 * (1 - Math.sqrt(1 - 4 * t * t))\n : 0.5 * (Math.sqrt(1 - (2 * t - 2) * (2 * t - 2)) + 1);\n}\n\n// ─── Back ───────────────────────────────────────────────────\nconst S = 1.70158;\nconst S2 = S * 1.525;\n\nexport function easeInBack(t: number): number {\n return t * t * ((S + 1) * t - S);\n}\nexport function easeOutBack(t: number): number {\n const t1 = t - 1;\n return t1 * t1 * ((S + 1) * t1 + S) + 1;\n}\nexport function easeInOutBack(t: number): number {\n if (t < 0.5) {\n const t2 = 2 * t;\n return 0.5 * (t2 * t2 * ((S2 + 1) * t2 - S2));\n }\n const t2 = 2 * t - 2;\n return 0.5 * (t2 * t2 * ((S2 + 1) * t2 + S2) + 2);\n}\n\n// ─── Elastic ────────────────────────────────────────────────\nexport function easeInElastic(t: number): number {\n if (t === 0 || t === 1) return t;\n return -(2 ** (10 * t - 10)) * Math.sin((t * 10 - 10.75) * (TAU / 3));\n}\nexport function easeOutElastic(t: number): number {\n if (t === 0 || t === 1) return t;\n return 2 ** (-10 * t) * Math.sin((t * 10 - 0.75) * (TAU / 3)) + 1;\n}\nexport function easeInOutElastic(t: number): number {\n if (t === 0 || t === 1) return t;\n const p = TAU / 4.5;\n return t < 0.5\n ? -0.5 * 2 ** (20 * t - 10) * Math.sin((20 * t - 11.125) * p)\n : 0.5 * 2 ** (-20 * t + 10) * Math.sin((20 * t - 11.125) * p) + 1;\n}\n\n// ─── Bounce ─────────────────────────────────────────────────\nexport function easeOutBounce(t: number): number {\n if (t < 1 / 2.75) {\n return 7.5625 * t * t;\n }\n if (t < 2 / 2.75) {\n const t2 = t - 1.5 / 2.75;\n return 7.5625 * t2 * t2 + 0.75;\n }\n if (t < 2.5 / 2.75) {\n const t2 = t - 2.25 / 2.75;\n return 7.5625 * t2 * t2 + 0.9375;\n }\n const t2 = t - 2.625 / 2.75;\n return 7.5625 * t2 * t2 + 0.984375;\n}\nexport function easeInBounce(t: number): number {\n return 1 - easeOutBounce(1 - t);\n}\nexport function easeInOutBounce(t: number): number {\n return t < 0.5 ? 0.5 * easeInBounce(t * 2) : 0.5 * easeOutBounce(t * 2 - 1) + 0.5;\n}\n\n// ─── Spring ─────────────────────────────────────────────────\nexport function springIn(t: number): number {\n return t * t * ((1.70158 + 1) * t - 1.70158);\n}\nexport function springOut(t: number): number {\n const t1 = t - 1;\n return t1 * t1 * ((1.70158 + 1) * t1 + 1.70158) + 1;\n}\nexport function springInOut(t: number): number {\n if (t < 0.5) {\n const t2 = 2 * t;\n return 0.5 * t2 * t2 * ((S2 + 1) * t2 - S2);\n }\n const t2 = 2 * t - 2;\n return 0.5 * (t2 * t2 * ((S2 + 1) * t2 + S2) + 2);\n}\n\n// ─── Type ───────────────────────────────────────────────────\nexport type EasingFn = (t: number) => number;\n","import type { Circle } from './circle.js';\nimport type { Rect } from './rect.js';\nimport type { Vec2 } from './vec2.js';\n\n/** Returns true if point is inside rect (inclusive). */\nexport function pointInRect(p: Vec2, r: Rect): boolean {\n return p.x >= r.x && p.x <= r.x + r.width && p.y >= r.y && p.y <= r.y + r.height;\n}\n\n/** Returns true if point is inside circle (inclusive). */\nexport function pointInCircle(p: Vec2, c: Circle): boolean {\n const dx = p.x - c.x;\n const dy = p.y - c.y;\n return dx * dx + dy * dy <= c.radius * c.radius;\n}\n\n/** Returns true if two rects overlap. */\nexport function rectVsRect(a: Rect, b: Rect): boolean {\n return a.x < b.x + b.width && a.x + a.width > b.x && a.y < b.y + b.height && a.y + a.height > b.y;\n}\n\n/** Returns true if rect and circle overlap. */\nexport function rectVsCircle(r: Rect, c: Circle): boolean {\n const closestX = c.x < r.x ? r.x : c.x > r.x + r.width ? r.x + r.width : c.x;\n const closestY = c.y < r.y ? r.y : c.y > r.y + r.height ? r.y + r.height : c.y;\n const dx = c.x - closestX;\n const dy = c.y - closestY;\n return dx * dx + dy * dy <= c.radius * c.radius;\n}\n\n/** Returns true if two circles overlap. */\nexport function circleVsCircle(a: Circle, b: Circle): boolean {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const radSum = a.radius + b.radius;\n return dx * dx + dy * dy < radSum * radSum;\n}\n\n/** Line segment intersection with AABB. Uses Liang-Barsky algorithm. */\nexport function lineVsRect(x1: number, y1: number, x2: number, y2: number, r: Rect): boolean {\n const dx = x2 - x1;\n const dy = y2 - y1;\n\n let tMin = 0;\n let tMax = 1;\n\n // Check each edge\n const edges = [\n { p: -dx, q: x1 - r.x },\n { p: dx, q: r.x + r.width - x1 },\n { p: -dy, q: y1 - r.y },\n { p: dy, q: r.y + r.height - y1 },\n ];\n\n for (const { p, q } of edges) {\n if (Math.abs(p) < 1e-12) {\n // Parallel to edge\n if (q < 0) return false;\n } else {\n const t = q / p;\n if (p < 0) {\n if (t > tMax) return false;\n if (t > tMin) tMin = t;\n } else {\n if (t < tMin) return false;\n if (t < tMax) tMax = t;\n }\n }\n }\n\n return tMin <= tMax;\n}\n\n/** Line segment intersection with circle. */\nexport function lineVsCircle(x1: number, y1: number, x2: number, y2: number, c: Circle): boolean {\n const dx = x2 - x1;\n const dy = y2 - y1;\n const fx = x1 - c.x;\n const fy = y1 - c.y;\n\n const a = dx * dx + dy * dy;\n const b = 2 * (fx * dx + fy * dy);\n const cc = fx * fx + fy * fy - c.radius * c.radius;\n\n // Zero-length segment: just a point-in-circle test\n if (a < 1e-12) {\n return cc <= 0;\n }\n\n let discriminant = b * b - 4 * a * cc;\n if (discriminant < 0) return false;\n\n discriminant = Math.sqrt(discriminant);\n const t1 = (-b - discriminant) / (2 * a);\n const t2 = (-b + discriminant) / (2 * a);\n\n // Check if any intersection is within segment [0, 1]\n if (t1 >= 0 && t1 <= 1) return true;\n if (t2 >= 0 && t2 <= 1) return true;\n // Segment fully inside circle\n if (t1 < 0 && t2 > 1) return true;\n\n return false;\n}\n\n/** Ray intersection with AABB. Returns t (distance) or null if no hit. */\nexport function rayVsRect(\n originX: number,\n originY: number,\n dirX: number,\n dirY: number,\n r: Rect,\n): number | null {\n const invDx = dirX !== 0 ? 1 / dirX : Number.POSITIVE_INFINITY;\n const invDy = dirY !== 0 ? 1 / dirY : Number.POSITIVE_INFINITY;\n\n const tx1 = (r.x - originX) * invDx;\n const tx2 = (r.x + r.width - originX) * invDx;\n const ty1 = (r.y - originY) * invDy;\n const ty2 = (r.y + r.height - originY) * invDy;\n\n const tMin = Math.max(Math.min(tx1, tx2), Math.min(ty1, ty2));\n const tMax = Math.min(Math.max(tx1, tx2), Math.max(ty1, ty2));\n\n if (tMax < 0 || tMin > tMax) return null;\n\n return tMin >= 0 ? tMin : tMax;\n}\n","import type { Transform2D } from './transform2d.js';\n\n/**\n * 3x3 matrix stored in column-major order on Float32Array.\n * Layout: [m00, m10, m20, m01, m11, m21, m02, m12, m22]\n *\n * | m00 m01 m02 | indices: | 0 3 6 |\n * | m10 m11 m12 | | 1 4 7 |\n * | m20 m21 m22 | | 2 5 8 |\n */\nexport type Mat3 = Float32Array;\n\nexport const Mat3 = {\n /** Creates a new identity matrix. */\n create(): Mat3 {\n const m = new Float32Array(9);\n m[0] = 1;\n m[4] = 1;\n m[8] = 1;\n return m;\n },\n\n /** Sets m to identity. */\n identity(m: Mat3): Mat3 {\n m[0] = 1;\n m[1] = 0;\n m[2] = 0;\n m[3] = 0;\n m[4] = 1;\n m[5] = 0;\n m[6] = 0;\n m[7] = 0;\n m[8] = 1;\n return m;\n },\n\n /** Multiplies a * b, writes into out (or allocates). */\n multiply(a: Mat3, b: Mat3, out?: Mat3): Mat3 {\n const a00 = a[0]!,\n a01 = a[3]!,\n a02 = a[6]!;\n const a10 = a[1]!,\n a11 = a[4]!,\n a12 = a[7]!;\n const a20 = a[2]!,\n a21 = a[5]!,\n a22 = a[8]!;\n\n const b00 = b[0]!,\n b01 = b[3]!,\n b02 = b[6]!;\n const b10 = b[1]!,\n b11 = b[4]!,\n b12 = b[7]!;\n const b20 = b[2]!,\n b21 = b[5]!,\n b22 = b[8]!;\n\n const o = out ?? new Float32Array(9);\n o[0] = a00 * b00 + a01 * b10 + a02 * b20;\n o[1] = a10 * b00 + a11 * b10 + a12 * b20;\n o[2] = a20 * b00 + a21 * b10 + a22 * b20;\n o[3] = a00 * b01 + a01 * b11 + a02 * b21;\n o[4] = a10 * b01 + a11 * b11 + a12 * b21;\n o[5] = a20 * b01 + a21 * b11 + a22 * b21;\n o[6] = a00 * b02 + a01 * b12 + a02 * b22;\n o[7] = a10 * b02 + a11 * b12 + a12 * b22;\n o[8] = a20 * b02 + a21 * b12 + a22 * b22;\n return o;\n },\n\n /** Creates a translation matrix. */\n translate(tx: number, ty: number, out?: Mat3): Mat3 {\n const m = out ?? new Float32Array(9);\n m[0] = 1;\n m[1] = 0;\n m[2] = 0;\n m[3] = 0;\n m[4] = 1;\n m[5] = 0;\n m[6] = tx;\n m[7] = ty;\n m[8] = 1;\n return m;\n },\n\n /** Creates a rotation matrix (radians). */\n rotate(angle: number, out?: Mat3): Mat3 {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n const m = out ?? new Float32Array(9);\n m[0] = c;\n m[1] = s;\n m[2] = 0;\n m[3] = -s;\n m[4] = c;\n m[5] = 0;\n m[6] = 0;\n m[7] = 0;\n m[8] = 1;\n return m;\n },\n\n /** Creates a scale matrix. */\n scale(sx: number, sy: number, out?: Mat3): Mat3 {\n const m = out ?? new Float32Array(9);\n m[0] = sx;\n m[1] = 0;\n m[2] = 0;\n m[3] = 0;\n m[4] = sy;\n m[5] = 0;\n m[6] = 0;\n m[7] = 0;\n m[8] = 1;\n return m;\n },\n\n /** Inverts the matrix. Returns null if singular. */\n invert(m: Mat3, out?: Mat3): Mat3 | null {\n const a00 = m[0]!,\n a01 = m[3]!,\n a02 = m[6]!;\n const a10 = m[1]!,\n a11 = m[4]!,\n a12 = m[7]!;\n const a20 = m[2]!,\n a21 = m[5]!,\n a22 = m[8]!;\n\n const det =\n a00 * (a11 * a22 - a12 * a21) - a01 * (a10 * a22 - a12 * a20) + a02 * (a10 * a21 - a11 * a20);\n\n if (Math.abs(det) < 1e-8) return null;\n\n const invDet = 1 / det;\n const o = out ?? new Float32Array(9);\n o[0] = (a11 * a22 - a12 * a21) * invDet;\n o[1] = (a12 * a20 - a10 * a22) * invDet;\n o[2] = (a10 * a21 - a11 * a20) * invDet;\n o[3] = (a02 * a21 - a01 * a22) * invDet;\n o[4] = (a00 * a22 - a02 * a20) * invDet;\n o[5] = (a01 * a20 - a00 * a21) * invDet;\n o[6] = (a01 * a12 - a02 * a11) * invDet;\n o[7] = (a02 * a10 - a00 * a12) * invDet;\n o[8] = (a00 * a11 - a01 * a10) * invDet;\n return o;\n },\n\n /** Builds a matrix from a Transform2D (TRS order: translate * rotate * scale). */\n fromTransform(t: Transform2D, out?: Mat3): Mat3 {\n const c = Math.cos(t.rotation);\n const s = Math.sin(t.rotation);\n const sx = t.scale.x;\n const sy = t.scale.y;\n const m = out ?? new Float32Array(9);\n m[0] = c * sx;\n m[1] = s * sx;\n m[2] = 0;\n m[3] = -s * sy;\n m[4] = c * sy;\n m[5] = 0;\n m[6] = t.position.x;\n m[7] = t.position.y;\n m[8] = 1;\n return m;\n },\n} as const;\n","import type { Rect } from './rect.js';\nimport type { Vec2 } from './vec2.js';\n\n/** Seeded PRNG using mulberry32 algorithm. */\nexport class SeededRNG {\n private state: number;\n\n constructor(seed: number) {\n this.state = seed | 0;\n }\n\n /** Returns a float in [0, 1). */\n next(): number {\n this.state = (this.state + 0x6d2b79f5) | 0;\n let t = Math.imul(this.state ^ (this.state >>> 15), 1 | this.state);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n }\n\n /** Returns a float in [min, max). */\n float(min: number, max: number): number {\n return min + this.next() * (max - min);\n }\n\n /** Returns an integer in [min, max] (inclusive). */\n int(min: number, max: number): number {\n return Math.floor(this.float(min, max + 1));\n }\n}\n\n/** Returns a random float in [min, max). */\nexport function randomFloat(min: number, max: number): number {\n return min + Math.random() * (max - min);\n}\n\n/** Returns a random integer in [min, max] (inclusive). */\nexport function randomInt(min: number, max: number): number {\n return Math.floor(randomFloat(min, max + 1));\n}\n\n/** Returns a random Vec2 within a rect. */\nexport function randomVec2InRect(r: Rect): Vec2 {\n return {\n x: r.x + Math.random() * r.width,\n y: r.y + Math.random() * r.height,\n };\n}\n\n/** Returns a random point inside a circle (uniform distribution). */\nexport function randomPointInCircle(cx: number, cy: number, radius: number): Vec2 {\n // Use sqrt for uniform distribution\n const r = radius * Math.sqrt(Math.random());\n const angle = Math.random() * Math.PI * 2;\n return {\n x: cx + r * Math.cos(angle),\n y: cy + r * Math.sin(angle),\n };\n}\n\n/** Fisher-Yates shuffle (in-place). Returns the array. */\nexport function shuffle<T>(array: T[]): T[] {\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n const tmp = array[i]!;\n array[i] = array[j]!;\n array[j] = tmp;\n }\n return array;\n}\n\n/** Returns a random element from the array. */\nexport function choose<T>(array: readonly T[]): T | undefined {\n if (array.length === 0) return undefined;\n return array[Math.floor(Math.random() * array.length)];\n}\n\n/**\n * Picks an index from a weight array using a cumulative walk.\n * `roll01` must be in [0, 1); returns 0 for an empty or all-zero array.\n */\nexport function weightedIndex(weights: readonly number[], roll01: number): number {\n let total = 0;\n for (let i = 0; i < weights.length; i++) total += weights[i] ?? 0;\n if (total <= 0) return 0;\n const target = roll01 * total;\n let acc = 0;\n for (let i = 0; i < weights.length; i++) {\n acc += weights[i] ?? 0;\n if (target < acc) return i;\n }\n return weights.length - 1;\n}\n\n/**\n * Picks an index from `items` using a per-item weight accessor.\n * `roll01` must be in [0, 1); returns 0 for an empty or all-zero-weight array.\n */\nexport function weightedIndexBy<T>(\n items: readonly T[],\n weight: (item: T) => number,\n roll01: number,\n): number {\n let total = 0;\n for (let i = 0; i < items.length; i++) total += weight(items[i] as T);\n if (total <= 0) return 0;\n const target = roll01 * total;\n let acc = 0;\n for (let i = 0; i < items.length; i++) {\n acc += weight(items[i] as T);\n if (target < acc) return i;\n }\n return items.length - 1;\n}\n\n/**\n * Picks an item from `items` using a per-item weight accessor.\n * Returns `undefined` for an empty array; returns the last item on float-edge.\n */\nexport function weightedPick<T>(\n items: readonly T[],\n weight: (item: T) => number,\n roll01: number,\n): T | undefined {\n if (items.length === 0) return undefined;\n return items[weightedIndexBy(items, weight, roll01)];\n}\n\n/**\n * 32-bit avalanche finalizer (lowbias32). Mixes `seed` so that adjacent seeds\n * decorrelate into different output values. Returns an unsigned 32-bit integer.\n *\n * Constants from https://nullprogram.com/blog/2018/07/31/ (lowbias32).\n */\nexport function hashU32(seed: number): number {\n let h = (seed | 0) >>> 0;\n h = Math.imul(h ^ (h >>> 16), 0x45d9f3b) >>> 0;\n h = Math.imul(h ^ (h >>> 16), 0x45d9f3b) >>> 0;\n return (h ^ (h >>> 16)) >>> 0;\n}\n\n/**\n * Deterministically maps `seed` to an index in [0, count).\n * Single-entry pools short-circuit to 0. Uses `hashU32` to decorrelate\n * adjacent seeds before the modulo.\n */\nexport function seededIndex(seed: number, count: number): number {\n if (count <= 1) return 0;\n return hashU32(seed) % count;\n}\n","import type { Vec2 } from './vec2.js';\n\n/** Axis-aligned bounding box. */\nexport type Rect = { x: number; y: number; width: number; height: number };\n\nexport const Rect = {\n /** Returns true if point is inside rect (inclusive). */\n contains(r: Rect, p: Vec2): boolean {\n return p.x >= r.x && p.x <= r.x + r.width && p.y >= r.y && p.y <= r.y + r.height;\n },\n\n /** Returns true if two rects overlap (share area). */\n intersects(a: Rect, b: Rect): boolean {\n return (\n a.x < b.x + b.width && a.x + a.width > b.x && a.y < b.y + b.height && a.y + a.height > b.y\n );\n },\n\n /** Returns the overlapping rect, or null if no overlap. */\n intersection(a: Rect, b: Rect): Rect | null {\n const x = Math.max(a.x, b.x);\n const y = Math.max(a.y, b.y);\n const right = Math.min(a.x + a.width, b.x + b.width);\n const bottom = Math.min(a.y + a.height, b.y + b.height);\n if (right <= x || bottom <= y) return null;\n return { x, y, width: right - x, height: bottom - y };\n },\n\n /** Returns the smallest rect containing both rects. */\n union(a: Rect, b: Rect): Rect {\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n const right = Math.max(a.x + a.width, b.x + b.width);\n const bottom = Math.max(a.y + a.height, b.y + b.height);\n return { x, y, width: right - x, height: bottom - y };\n },\n\n /** Creates a rect from an array of points (bounding box). */\n fromPoints(points: readonly Vec2[]): Rect {\n if (points.length === 0) return { x: 0, y: 0, width: 0, height: 0 };\n let minX = points[0]!.x;\n let minY = points[0]!.y;\n let maxX = minX;\n let maxY = minY;\n for (let i = 1; i < points.length; i++) {\n const p = points[i]!;\n if (p.x < minX) minX = p.x;\n if (p.y < minY) minY = p.y;\n if (p.x > maxX) maxX = p.x;\n if (p.y > maxY) maxY = p.y;\n }\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n },\n\n /** Returns the center point of the rect. */\n center(r: Rect): Vec2 {\n return { x: r.x + r.width * 0.5, y: r.y + r.height * 0.5 };\n },\n\n /** Returns a new rect expanded by amount on each side. */\n expand(r: Rect, amount: number): Rect {\n return {\n x: r.x - amount,\n y: r.y - amount,\n width: r.width + amount * 2,\n height: r.height + amount * 2,\n };\n },\n} as const;\n","/**\n * Timed-window and capped-bonus math — pure, zero-alloc scoring helpers.\n */\n\n/**\n * Bonus pay floored to an integer: `pay × min(frac, capFrac)`.\n * `frac` is the current multiplier (e.g. `streak * fracPerStep`);\n * `capFrac` bounds the multiplier so it cannot grow unboundedly.\n * Returns 0 for zero or negative `pay`.\n */\nexport function cappedBonus(pay: number, frac: number, capFrac: number): number {\n if (pay <= 0) return 0;\n return Math.floor(pay * Math.min(frac, capFrac));\n}\n\n/**\n * Advances a timed streak counter. A new event within `windowSec` of `lastT`\n * increments `prev`; a gap (or `lastT < 0` meaning \"no prior event\") resets\n * to 1. Pure — the caller stores the returned value and stamps the new time.\n * `elapsed` is the monotonic clock at the new event.\n */\nexport function advanceWindowedStreak(\n prev: number,\n elapsed: number,\n lastT: number,\n windowSec: number,\n): number {\n if (lastT >= 0 && elapsed - lastT <= windowSec) return prev + 1;\n return 1;\n}\n\n/**\n * Returns true when a streak window has lapsed: a window was open (`lastT >= 0`)\n * and more than `windowSec` seconds have passed since `lastT`.\n * `lastT < 0` means no event has ever occurred — never expired.\n */\nexport function windowExpired(elapsed: number, lastT: number, windowSec: number): boolean {\n return lastT >= 0 && elapsed - lastT > windowSec;\n}\n\n/**\n * How many more events may be awarded in the current window given `awarded`\n * already counted. Clamped to 0 — never negative.\n */\nexport function remainingInWindow(awarded: number, capPerWindow: number): number {\n return Math.max(0, capPerWindow - awarded);\n}\n","import type { Vec2 } from './vec2.js';\n\n/** 2D transform: position, rotation (radians), and scale. */\nexport type Transform2D = {\n position: Vec2;\n rotation: number;\n scale: Vec2;\n};\n\nexport const Transform2D = {\n /** Creates an identity transform. */\n identity(): Transform2D {\n return { position: { x: 0, y: 0 }, rotation: 0, scale: { x: 1, y: 1 } };\n },\n\n /** Creates a transform from components. */\n create(x = 0, y = 0, rotation = 0, scaleX = 1, scaleY = 1): Transform2D {\n return {\n position: { x, y },\n rotation,\n scale: { x: scaleX, y: scaleY },\n };\n },\n\n /** Transforms a local-space point to world-space. */\n localToWorld(t: Transform2D, point: Vec2): Vec2 {\n const c = Math.cos(t.rotation);\n const s = Math.sin(t.rotation);\n const sx = point.x * t.scale.x;\n const sy = point.y * t.scale.y;\n return {\n x: sx * c - sy * s + t.position.x,\n y: sx * s + sy * c + t.position.y,\n };\n },\n\n /** Transforms a world-space point to local-space. */\n worldToLocal(t: Transform2D, point: Vec2): Vec2 {\n const dx = point.x - t.position.x;\n const dy = point.y - t.position.y;\n const c = Math.cos(-t.rotation);\n const s = Math.sin(-t.rotation);\n const rx = dx * c - dy * s;\n const ry = dx * s + dy * c;\n return {\n x: t.scale.x !== 0 ? rx / t.scale.x : 0,\n y: t.scale.y !== 0 ? ry / t.scale.y : 0,\n };\n },\n\n /** Returns a copy of the transform. */\n clone(t: Transform2D): Transform2D {\n return {\n position: { x: t.position.x, y: t.position.y },\n rotation: t.rotation,\n scale: { x: t.scale.x, y: t.scale.y },\n };\n },\n} as const;\n","import { approxEquals, rotateTowards } from './scalar.js';\n\n/** Vec2 plain object type — no class, no GC pressure. */\nexport type Vec2 = { x: number; y: number };\n\n/** Creates a Vec2 plain object. */\nexport function vec2(x = 0, y = 0): Vec2 {\n return { x, y };\n}\n\n// ─── Static namespace ───────────────────────────────────────────\n\nexport const Vec2 = {\n /** Returns { 0, 0 }. */\n zero(): Vec2 {\n return { x: 0, y: 0 };\n },\n /** Returns { 1, 1 }. */\n one(): Vec2 {\n return { x: 1, y: 1 };\n },\n /** Returns { 0, -1 }. */\n up(): Vec2 {\n return { x: 0, y: -1 };\n },\n /** Returns { 0, 1 }. */\n down(): Vec2 {\n return { x: 0, y: 1 };\n },\n /** Returns { -1, 0 }. */\n left(): Vec2 {\n return { x: -1, y: 0 };\n },\n /** Returns { 1, 0 }. */\n right(): Vec2 {\n return { x: 1, y: 0 };\n },\n\n /** Component-wise addition. Writes into out if provided. */\n add(a: Vec2, b: Vec2, out?: Vec2): Vec2 {\n if (out) {\n out.x = a.x + b.x;\n out.y = a.y + b.y;\n return out;\n }\n return { x: a.x + b.x, y: a.y + b.y };\n },\n\n /** Component-wise subtraction a - b. */\n sub(a: Vec2, b: Vec2, out?: Vec2): Vec2 {\n if (out) {\n out.x = a.x - b.x;\n out.y = a.y - b.y;\n return out;\n }\n return { x: a.x - b.x, y: a.y - b.y };\n },\n\n /** Scales a vector by a scalar. */\n scale(v: Vec2, s: number, out?: Vec2): Vec2 {\n if (out) {\n out.x = v.x * s;\n out.y = v.y * s;\n return out;\n }\n return { x: v.x * s, y: v.y * s };\n },\n\n /** Returns a unit vector. Returns zero vector if length is 0. */\n normalize(v: Vec2, out?: Vec2): Vec2 {\n const len = Math.sqrt(v.x * v.x + v.y * v.y);\n if (len === 0) {\n if (out) {\n out.x = 0;\n out.y = 0;\n return out;\n }\n return { x: 0, y: 0 };\n }\n const inv = 1 / len;\n if (out) {\n out.x = v.x * inv;\n out.y = v.y * inv;\n return out;\n }\n return { x: v.x * inv, y: v.y * inv };\n },\n\n /** Zero-alloc; writes into `out`. Mandatory `out` so callers avoid temporaries in hot paths. */\n normalizeOut(dx: number, dy: number, speed: number, out: Vec2): Vec2 {\n const len = Math.sqrt(dx * dx + dy * dy);\n if (len <= 1e-6) {\n out.x = 0;\n out.y = 0;\n return out;\n }\n const inv = speed / len;\n out.x = dx * inv;\n out.y = dy * inv;\n return out;\n },\n\n /** Dot product. */\n dot(a: Vec2, b: Vec2): number {\n return a.x * b.x + a.y * b.y;\n },\n\n /** 2D cross product (z-component of the 3D cross). */\n cross(a: Vec2, b: Vec2): number {\n return a.x * b.y - a.y * b.x;\n },\n\n /** Perpendicular: (-y, x). In this engine's y-down screen space this is a 90° clockwise turn,\n * matching the Skia rotation convention used by `@flare-engine/render`. Writes into out if\n * provided. */\n perp(v: Vec2, out?: Vec2): Vec2 {\n const x = -v.y;\n const y = v.x;\n if (out) {\n out.x = x;\n out.y = y;\n return out;\n }\n return { x, y };\n },\n\n /** Scalar × vector cross product: s × v = (-s·y, s·x). Writes into out if provided. */\n crossSV(s: number, v: Vec2, out?: Vec2): Vec2 {\n const x = -s * v.y;\n const y = s * v.x;\n if (out) {\n out.x = x;\n out.y = y;\n return out;\n }\n return { x, y };\n },\n\n /** Linearly interpolates between a and b (unclamped). */\n lerp(a: Vec2, b: Vec2, t: number, out?: Vec2): Vec2 {\n const x = a.x + (b.x - a.x) * t;\n const y = a.y + (b.y - a.y) * t;\n if (out) {\n out.x = x;\n out.y = y;\n return out;\n }\n return { x, y };\n },\n\n /** Spherical linear interpolation for unit vectors. */\n slerp(a: Vec2, b: Vec2, t: number, out?: Vec2): Vec2 {\n let d = a.x * b.x + a.y * b.y;\n // Clamp dot to [-1, 1] for numerical safety\n d = d < -1 ? -1 : d > 1 ? 1 : d;\n const theta = Math.acos(d);\n if (theta < 1e-6) {\n return Vec2.lerp(a, b, t, out);\n }\n const sinTheta = Math.sin(theta);\n const wa = Math.sin((1 - t) * theta) / sinTheta;\n const wb = Math.sin(t * theta) / sinTheta;\n const x = a.x * wa + b.x * wb;\n const y = a.y * wa + b.y * wb;\n if (out) {\n out.x = x;\n out.y = y;\n return out;\n }\n return { x, y };\n },\n\n /** Euclidean distance between two points. */\n distance(a: Vec2, b: Vec2): number {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n return Math.sqrt(dx * dx + dy * dy);\n },\n\n /** Squared distance (avoids sqrt). */\n distanceSq(a: Vec2, b: Vec2): number {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n return dx * dx + dy * dy;\n },\n\n /** Length of a vector. */\n length(v: Vec2): number {\n return Math.sqrt(v.x * v.x + v.y * v.y);\n },\n\n /** Squared length (avoids sqrt). */\n lengthSq(v: Vec2): number {\n return v.x * v.x + v.y * v.y;\n },\n\n /** Angle of vector in radians (atan2). */\n angle(v: Vec2): number {\n return Math.atan2(v.y, v.x);\n },\n\n /** Rotates a vector by angle (radians) around origin. */\n rotate(v: Vec2, angle: number, out?: Vec2): Vec2 {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n const x = v.x * c - v.y * s;\n const y = v.x * s + v.y * c;\n if (out) {\n out.x = x;\n out.y = y;\n return out;\n }\n return { x, y };\n },\n\n /** Component-wise approximate equality. */\n equals(a: Vec2, b: Vec2, epsilon = 1e-6): boolean {\n return approxEquals(a.x, b.x, epsilon) && approxEquals(a.y, b.y, epsilon);\n },\n\n /** Returns a copy of the vector. */\n clone(v: Vec2): Vec2 {\n return { x: v.x, y: v.y };\n },\n\n /** Clamps the length of a vector to maxLength. */\n clampLength(v: Vec2, maxLength: number, out?: Vec2): Vec2 {\n const lenSq = v.x * v.x + v.y * v.y;\n if (lenSq <= maxLength * maxLength) {\n if (out) {\n out.x = v.x;\n out.y = v.y;\n return out;\n }\n return { x: v.x, y: v.y };\n }\n const len = Math.sqrt(lenSq);\n const inv = maxLength / len;\n if (out) {\n out.x = v.x * inv;\n out.y = v.y * inv;\n return out;\n }\n return { x: v.x * inv, y: v.y * inv };\n },\n\n /** Zero-alloc homing steer: rotate velocity (vx,vy) toward direction (dx,dy) by at most maxStep\n * radians, preserving speed; writes into out. Mandatory out. Byte-identical to hand-rolled\n * homing-bullet steering (Math.hypot speed + atan2 + branch-form turn + cos/sin * speed). */\n turnVelocityToward(\n vx: number,\n vy: number,\n dx: number,\n dy: number,\n maxStep: number,\n out: Vec2,\n ): Vec2 {\n const speed = Math.hypot(vx, vy);\n const newAng = rotateTowards(Math.atan2(vy, vx), Math.atan2(dy, dx), maxStep);\n out.x = Math.cos(newAng) * speed;\n out.y = Math.sin(newAng) * speed;\n return out;\n },\n} as const;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/circle.ts","../src/scalar.ts","../src/color.ts","../src/curves.ts","../src/easings.ts","../src/intersection.ts","../src/mat3.ts","../src/random.ts","../src/rect.ts","../src/reward.ts","../src/transform2d.ts","../src/vec2.ts"],"sourcesContent":["import type { Rect } from './rect.js';\nimport type { Vec2 } from './vec2.js';\n\n/** Circle shape: center position + radius. */\nexport type Circle = { x: number; y: number; radius: number };\n\nexport const Circle = {\n /** Returns true if point is inside or on the circle. */\n contains(c: Circle, p: Vec2): boolean {\n const dx = p.x - c.x;\n const dy = p.y - c.y;\n return dx * dx + dy * dy <= c.radius * c.radius;\n },\n\n /** Returns true if two circles overlap (share area). */\n intersects(a: Circle, b: Circle): boolean {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const distSq = dx * dx + dy * dy;\n const radSum = a.radius + b.radius;\n return distSq < radSum * radSum;\n },\n\n /** Returns true if a circle and rect overlap. */\n intersectsRect(c: Circle, r: Rect): boolean {\n // Find closest point on rect to circle center\n const closestX = c.x < r.x ? r.x : c.x > r.x + r.width ? r.x + r.width : c.x;\n const closestY = c.y < r.y ? r.y : c.y > r.y + r.height ? r.y + r.height : c.y;\n const dx = c.x - closestX;\n const dy = c.y - closestY;\n return dx * dx + dy * dy <= c.radius * c.radius;\n },\n} as const;\n","/** Clamps value between min and max. */\nexport function clamp(value: number, min: number, max: number): number {\n return value < min ? min : value > max ? max : value;\n}\n\n/** Linearly interpolates between a and b by t (unclamped). */\nexport function lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n\n/** Returns the interpolation factor of value between a and b. */\nexport function inverseLerp(a: number, b: number, value: number): number {\n const range = b - a;\n if (range === 0) return 0;\n return (value - a) / range;\n}\n\n/** Maps value from [inMin, inMax] to [outMin, outMax]. */\nexport function map(\n value: number,\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n): number {\n return lerp(outMin, outMax, inverseLerp(inMin, inMax, value));\n}\n\nconst DEG_TO_RAD = Math.PI / 180;\nconst RAD_TO_DEG = 180 / Math.PI;\n\n/** Converts degrees to radians. */\nexport function degToRad(degrees: number): number {\n return degrees * DEG_TO_RAD;\n}\n\n/** Converts radians to degrees. */\nexport function radToDeg(radians: number): number {\n return radians * RAD_TO_DEG;\n}\n\n/** Returns true if a and b are approximately equal within epsilon. */\nexport function approxEquals(a: number, b: number, epsilon = 1e-6): boolean {\n return Math.abs(a - b) <= epsilon;\n}\n\n/** Wraps value into [min, max) range. */\nexport function wrap(value: number, min: number, max: number): number {\n const range = max - min;\n if (range === 0) return min;\n return min + ((((value - min) % range) + range) % range);\n}\n\n/** PingPong — bounces value back and forth in [0, length]. */\nexport function pingPong(t: number, length: number): number {\n if (length === 0) return 0;\n const tt = wrap(t, 0, length * 2);\n return length - Math.abs(tt - length);\n}\n\n/** Hermite smooth interpolation (0→1) with zero first-derivative at edges. */\nexport function smoothStep(edge0: number, edge1: number, x: number): number {\n const range = edge1 - edge0;\n if (range === 0) return x >= edge1 ? 1 : 0;\n const t = clamp((x - edge0) / range, 0, 1);\n return t * t * (3 - 2 * t);\n}\n\n/** Returns -1, 0, or 1. Unlike Math.sign, returns 0 for NaN. */\nexport function sign(value: number): number {\n if (Number.isNaN(value)) return 0;\n return value > 0 ? 1 : value < 0 ? -1 : 0;\n}\n\n/** Shortest signed angle delta a - b, wrapped to [-pi, pi] (closed both ends — strict comparisons\n * leave exact +/-pi unwrapped). Branch form (single +/-2pi correction)\n * — byte-identical to hand-rolled aim/homing turn math; do NOT swap for a modulo form (it shifts\n * results by ULPs at the +/-pi boundary). */\nexport function angleDelta(a: number, b: number): number {\n let diff = a - b;\n if (diff > Math.PI) diff -= 2 * Math.PI;\n else if (diff < -Math.PI) diff += 2 * Math.PI;\n return diff;\n}\n\n/** Rotates angle cur toward target by at most maxStep radians, shortest direction. Returns the new\n * angle (NOT re-wrapped). Branch-form step clamp — byte-identical to hand-rolled homing steering. */\nexport function rotateTowards(cur: number, target: number, maxStep: number): number {\n const diff = angleDelta(target, cur);\n const turn = diff > maxStep ? maxStep : diff < -maxStep ? -maxStep : diff;\n return cur + turn;\n}\n","import { clamp } from './scalar.js';\n\n/** RGBA color with components normalized to 0-1. */\nexport type Color = { r: number; g: number; b: number; a: number };\n\n/** OKLab perceptual color space (L 0-1, a and b unbounded in practice ±0.5). */\nexport type Oklab = { L: number; a: number; b: number };\n\n/** OKLCH polar form of OKLab (L 0-1, C >= 0, h degrees [0,360)). */\nexport type Oklch = { L: number; C: number; h: number };\n\n/**\n * Converts a single sRGB channel to linear light.\n * The 0.04045 threshold (modern WCAG errata) is numerically identical to the\n * older 0.03928 for 8-bit inputs and is shared by OKLab and WCAG luminance.\n */\nfunction srgbToLinear(c: number): number {\n return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n}\n\n/** Converts a single linear-light channel back to sRGB. */\nfunction linearToSrgb(c: number): number {\n return c <= 0.0031308 ? 12.92 * c : 1.055 * c ** (1 / 2.4) - 0.055;\n}\n\nexport const Color = {\n WHITE: { r: 1, g: 1, b: 1, a: 1 } as Color,\n BLACK: { r: 0, g: 0, b: 0, a: 1 } as Color,\n TRANSPARENT: { r: 0, g: 0, b: 0, a: 0 } as Color,\n\n /** Creates a Color from normalized 0-1 components. */\n create(r = 0, g = 0, b = 0, a = 1): Color {\n return { r, g, b, a };\n },\n\n /** Parses a hex string (#RGB, #RGBA, #RRGGBB, #RRGGBBAA). */\n fromHex(hex: string): Color {\n // Strip leading #\n let h = hex.startsWith('#') ? hex.slice(1) : hex;\n\n if (h.length === 3) {\n h = h[0]! + h[0]! + h[1]! + h[1]! + h[2]! + h[2]!;\n } else if (h.length === 4) {\n h = h[0]! + h[0]! + h[1]! + h[1]! + h[2]! + h[2]! + h[3]! + h[3]!;\n }\n\n const r = Number.parseInt(h.slice(0, 2), 16) / 255;\n const g = Number.parseInt(h.slice(2, 4), 16) / 255;\n const b = Number.parseInt(h.slice(4, 6), 16) / 255;\n const a = h.length >= 8 ? Number.parseInt(h.slice(6, 8), 16) / 255 : 1;\n return { r, g, b, a };\n },\n\n /** Converts to hex string #RRGGBB or #RRGGBBAA if alpha < 1. */\n toHex(c: Color): string {\n const r = Math.round(clamp(c.r, 0, 1) * 255)\n .toString(16)\n .padStart(2, '0');\n const g = Math.round(clamp(c.g, 0, 1) * 255)\n .toString(16)\n .padStart(2, '0');\n const b = Math.round(clamp(c.b, 0, 1) * 255)\n .toString(16)\n .padStart(2, '0');\n if (c.a < 1) {\n const a = Math.round(clamp(c.a, 0, 1) * 255)\n .toString(16)\n .padStart(2, '0');\n return `#${r}${g}${b}${a}`;\n }\n return `#${r}${g}${b}`;\n },\n\n /** Linearly interpolates between two colors. */\n lerp(a: Color, b: Color, t: number): Color {\n return {\n r: a.r + (b.r - a.r) * t,\n g: a.g + (b.g - a.g) * t,\n b: a.b + (b.b - a.b) * t,\n a: a.a + (b.a - a.a) * t,\n };\n },\n\n /** Component-wise multiplication. */\n multiply(a: Color, b: Color): Color {\n return {\n r: a.r * b.r,\n g: a.g * b.g,\n b: a.b * b.b,\n a: a.a * b.a,\n };\n },\n\n /**\n * Converts to a Skia-compatible color number (0xAARRGGBB).\n * Compatible with @shopify/react-native-skia Skia.Color() format.\n */\n toSkColor(c: Color): number {\n const r = Math.round(clamp(c.r, 0, 1) * 255) & 0xff;\n const g = Math.round(clamp(c.g, 0, 1) * 255) & 0xff;\n const b = Math.round(clamp(c.b, 0, 1) * 255) & 0xff;\n const a = Math.round(clamp(c.a, 0, 1) * 255) & 0xff;\n return ((a << 24) | (r << 16) | (g << 8) | b) >>> 0;\n },\n\n /** Converts sRGB Color to OKLab. Alpha is dropped. */\n toOklab(c: Color): Oklab {\n const rl = srgbToLinear(c.r);\n const gl = srgbToLinear(c.g);\n const bl = srgbToLinear(c.b);\n\n const l = 0.4122214708 * rl + 0.5363325363 * gl + 0.0514459929 * bl;\n const m = 0.2119034982 * rl + 0.6806995451 * gl + 0.1073969566 * bl;\n const s = 0.0883024619 * rl + 0.2817188376 * gl + 0.6299787005 * bl;\n\n const l_ = Math.cbrt(l);\n const m_ = Math.cbrt(m);\n const s_ = Math.cbrt(s);\n\n return {\n L: 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_,\n a: 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_,\n b: 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_,\n };\n },\n\n /**\n * Converts OKLab to sRGB Color. Out-of-gamut results are clamped to [0,1];\n * round-trips are exact only for in-gamut colors.\n */\n fromOklab(lab: Oklab, alpha = 1): Color {\n const l_ = lab.L + 0.3963377774 * lab.a + 0.2158037573 * lab.b;\n const m_ = lab.L - 0.1055613458 * lab.a - 0.0638541728 * lab.b;\n const s_ = lab.L - 0.0894841775 * lab.a - 1.291485548 * lab.b;\n\n const l = l_ ** 3;\n const m = m_ ** 3;\n const s = s_ ** 3;\n\n const rl = 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s;\n const gl = -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s;\n const bl = -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s;\n\n return {\n r: clamp(linearToSrgb(rl), 0, 1),\n g: clamp(linearToSrgb(gl), 0, 1),\n b: clamp(linearToSrgb(bl), 0, 1),\n a: alpha,\n };\n },\n\n /** Converts sRGB Color to OKLCH (polar OKLab). Achromatic colors get h = 0. */\n toOklch(c: Color): Oklch {\n const lab = Color.toOklab(c);\n const C = Math.hypot(lab.a, lab.b);\n const h = C < 1e-7 ? 0 : ((Math.atan2(lab.b, lab.a) * 180) / Math.PI + 360) % 360;\n return { L: lab.L, C, h };\n },\n\n /**\n * Converts OKLCH to sRGB Color. Hue is wrapped via ((h%360)+360)%360.\n * Out-of-gamut results are clamped; round-trips exact only in-gamut.\n */\n fromOklch(lch: Oklch, alpha = 1): Color {\n const hWrapped = ((lch.h % 360) + 360) % 360;\n const hRad = (hWrapped * Math.PI) / 180;\n return Color.fromOklab(\n { L: lch.L, a: lch.C * Math.cos(hRad), b: lch.C * Math.sin(hRad) },\n alpha,\n );\n },\n\n /** Euclidean distance in OKLab space between two sRGB colors. */\n deltaEOk(a: Color, b: Color): number {\n return Color.deltaEOkLab(Color.toOklab(a), Color.toOklab(b));\n },\n\n /** Euclidean distance between two OKLab values. */\n deltaEOkLab(a: Oklab, b: Oklab): number {\n return Math.hypot(a.L - b.L, a.a - b.a, a.b - b.b);\n },\n\n /** WCAG 2.x relative luminance. White = 1, black = 0. */\n relativeLuminance(c: Color): number {\n return 0.2126 * srgbToLinear(c.r) + 0.7152 * srgbToLinear(c.g) + 0.0722 * srgbToLinear(c.b);\n },\n\n /** WCAG 2.x contrast ratio. Order-independent; range [1, 21]. */\n contrastRatio(fg: Color, bg: Color): number {\n const l1 = Color.relativeLuminance(fg);\n const l2 = Color.relativeLuminance(bg);\n const lMax = Math.max(l1, l2);\n const lMin = Math.min(l1, l2);\n return (lMax + 0.05) / (lMin + 0.05);\n },\n} as const;\n","import type { Vec2 } from './vec2.js';\n\n/**\n * Parametric curves — quadratic/cubic Bézier and Catmull-Rom — plus approximate\n * arc length for each.\n *\n * Every sampler comes in two forms, per the repo's hot-path convention: an\n * allocating one returning a fresh `Vec2`, and an `…Into` one writing to a\n * caller-owned buffer. Sampling a path each frame is exactly the case the\n * `…Into` forms exist for.\n *\n * Control points are passed as loose numbers rather than `Vec2` objects so a\n * caller holding coordinates in a `Float32Array` — the documented storage for\n * bulk numeric data — can sample without building temporaries first.\n */\n\n/** Quadratic Bézier at `t`, writing into `out`. `t` is clamped to [0, 1]. */\nexport function bezier2Into(\n p0x: number,\n p0y: number,\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n t: number,\n out: Vec2,\n): Vec2 {\n const u = t < 0 ? 0 : t > 1 ? 1 : t;\n const v = 1 - u;\n // Expanded Bernstein form: two multiplies fewer than nested lerps, and no\n // intermediate points to allocate.\n const a = v * v;\n const b = 2 * v * u;\n const c = u * u;\n out.x = a * p0x + b * p1x + c * p2x;\n out.y = a * p0y + b * p1y + c * p2y;\n return out;\n}\n\n/** Quadratic Bézier at `t`. Allocates — see `bezier2Into` for the hot path. */\nexport function bezier2(\n p0x: number,\n p0y: number,\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n t: number,\n): Vec2 {\n return bezier2Into(p0x, p0y, p1x, p1y, p2x, p2y, t, { x: 0, y: 0 });\n}\n\n/** Cubic Bézier at `t`, writing into `out`. `t` is clamped to [0, 1]. */\nexport function bezier3Into(\n p0x: number,\n p0y: number,\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n t: number,\n out: Vec2,\n): Vec2 {\n const u = t < 0 ? 0 : t > 1 ? 1 : t;\n const v = 1 - u;\n const vv = v * v;\n const uu = u * u;\n const a = vv * v;\n const b = 3 * vv * u;\n const c = 3 * v * uu;\n const d = uu * u;\n out.x = a * p0x + b * p1x + c * p2x + d * p3x;\n out.y = a * p0y + b * p1y + c * p2y + d * p3y;\n return out;\n}\n\n/** Cubic Bézier at `t`. Allocates — see `bezier3Into` for the hot path. */\nexport function bezier3(\n p0x: number,\n p0y: number,\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n t: number,\n): Vec2 {\n return bezier3Into(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y, t, { x: 0, y: 0 });\n}\n\n/**\n * Centripetal-free (uniform) Catmull-Rom spline at `t`, writing into `out`.\n *\n * The curve passes **through** `p1` and `p2`; `p0` and `p3` are the neighbouring\n * control points that set the tangents, and `t` runs from `p1` (0) to `p2` (1).\n * That interpolating property is the reason to reach for this over a Bézier when\n * a path must hit its waypoints exactly.\n */\nexport function catmullRomInto(\n p0x: number,\n p0y: number,\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n t: number,\n out: Vec2,\n): Vec2 {\n const u = t < 0 ? 0 : t > 1 ? 1 : t;\n const uu = u * u;\n const uuu = uu * u;\n out.x =\n 0.5 *\n (2 * p1x +\n (-p0x + p2x) * u +\n (2 * p0x - 5 * p1x + 4 * p2x - p3x) * uu +\n (-p0x + 3 * p1x - 3 * p2x + p3x) * uuu);\n out.y =\n 0.5 *\n (2 * p1y +\n (-p0y + p2y) * u +\n (2 * p0y - 5 * p1y + 4 * p2y - p3y) * uu +\n (-p0y + 3 * p1y - 3 * p2y + p3y) * uuu);\n return out;\n}\n\n/** Catmull-Rom at `t`. Allocates — see `catmullRomInto` for the hot path. */\nexport function catmullRom(\n p0x: number,\n p0y: number,\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n t: number,\n): Vec2 {\n return catmullRomInto(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y, t, { x: 0, y: 0 });\n}\n\n/** Scratch buffer for the length helpers — they are not reentrant, which is\n * fine because they do not call user code. */\nconst _scratch: Vec2 = { x: 0, y: 0 };\n\n/**\n * Approximate arc length by sampling `segments` chords.\n *\n * Always an **underestimate**: a chord is the shortest path between its\n * endpoints, so a polyline through the curve is never longer than the curve.\n * Error falls roughly with the square of `segments`; 16 is a reasonable default\n * for UI paths, more for anything a camera follows closely.\n */\nexport function bezier2Length(\n p0x: number,\n p0y: number,\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n segments = 16,\n): number {\n const n = segments < 1 ? 1 : segments | 0;\n let total = 0;\n let px = p0x;\n let py = p0y;\n for (let i = 1; i <= n; i++) {\n bezier2Into(p0x, p0y, p1x, p1y, p2x, p2y, i / n, _scratch);\n total += Math.hypot(_scratch.x - px, _scratch.y - py);\n px = _scratch.x;\n py = _scratch.y;\n }\n return total;\n}\n\n/** Approximate arc length of a cubic Bézier. See `bezier2Length`. */\nexport function bezier3Length(\n p0x: number,\n p0y: number,\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n segments = 16,\n): number {\n const n = segments < 1 ? 1 : segments | 0;\n let total = 0;\n let px = p0x;\n let py = p0y;\n for (let i = 1; i <= n; i++) {\n bezier3Into(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y, i / n, _scratch);\n total += Math.hypot(_scratch.x - px, _scratch.y - py);\n px = _scratch.x;\n py = _scratch.y;\n }\n return total;\n}\n\n/**\n * Approximate arc length of the Catmull-Rom span between `p1` and `p2`.\n * See `bezier2Length` for the accuracy note.\n */\nexport function catmullRomLength(\n p0x: number,\n p0y: number,\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n segments = 16,\n): number {\n const n = segments < 1 ? 1 : segments | 0;\n let total = 0;\n let px = p1x;\n let py = p1y;\n for (let i = 1; i <= n; i++) {\n catmullRomInto(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y, i / n, _scratch);\n total += Math.hypot(_scratch.x - px, _scratch.y - py);\n px = _scratch.x;\n py = _scratch.y;\n }\n return total;\n}\n","// Easing functions — all (t: number) => number, t in [0,1]\n// Robert Penner easings + spring, bounce, elastic variants.\n// Tree-shakeable named exports.\n\nconst PI = Math.PI;\nconst HALF_PI = PI / 2;\nconst TAU = PI * 2;\n\n// ─── Linear ─────────────────────────────────────────────────\nexport function linear(t: number): number {\n return t;\n}\n\n// ─── Step ───────────────────────────────────────────────────\nexport function step(t: number): number {\n return t < 1 ? 0 : 1;\n}\n\n// ─── Quad ───────────────────────────────────────────────────\nexport function easeInQuad(t: number): number {\n return t * t;\n}\nexport function easeOutQuad(t: number): number {\n return t * (2 - t);\n}\nexport function easeInOutQuad(t: number): number {\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n}\n\n// ─── Cubic ──────────────────────────────────────────────────\nexport function easeInCubic(t: number): number {\n return t * t * t;\n}\nexport function easeOutCubic(t: number): number {\n const t1 = t - 1;\n return t1 * t1 * t1 + 1;\n}\nexport function easeInOutCubic(t: number): number {\n return t < 0.5 ? 4 * t * t * t : 1 + (t - 1) * (2 * t - 2) * (2 * t - 2);\n}\n\n// ─── Quart ──────────────────────────────────────────────────\nexport function easeInQuart(t: number): number {\n return t * t * t * t;\n}\nexport function easeOutQuart(t: number): number {\n const t1 = t - 1;\n return 1 - t1 * t1 * t1 * t1;\n}\nexport function easeInOutQuart(t: number): number {\n const t1 = t - 1;\n return t < 0.5 ? 8 * t * t * t * t : 1 - 8 * t1 * t1 * t1 * t1;\n}\n\n// ─── Quint ──────────────────────────────────────────────────\nexport function easeInQuint(t: number): number {\n return t * t * t * t * t;\n}\nexport function easeOutQuint(t: number): number {\n const t1 = t - 1;\n return 1 + t1 * t1 * t1 * t1 * t1;\n}\nexport function easeInOutQuint(t: number): number {\n const t1 = t - 1;\n return t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * t1 * t1 * t1 * t1 * t1;\n}\n\n// ─── Sine ───────────────────────────────────────────────────\nexport function easeInSine(t: number): number {\n return 1 - Math.cos(t * HALF_PI);\n}\nexport function easeOutSine(t: number): number {\n return Math.sin(t * HALF_PI);\n}\nexport function easeInOutSine(t: number): number {\n return 0.5 * (1 - Math.cos(PI * t));\n}\n\n// ─── Expo ───────────────────────────────────────────────────\nexport function easeInExpo(t: number): number {\n return t === 0 ? 0 : 2 ** (10 * (t - 1));\n}\nexport function easeOutExpo(t: number): number {\n return t === 1 ? 1 : 1 - 2 ** (-10 * t);\n}\nexport function easeInOutExpo(t: number): number {\n if (t === 0) return 0;\n if (t === 1) return 1;\n return t < 0.5 ? 0.5 * 2 ** (20 * t - 10) : 1 - 0.5 * 2 ** (-20 * t + 10);\n}\n\n// ─── Circ ───────────────────────────────────────────────────\nexport function easeInCirc(t: number): number {\n return 1 - Math.sqrt(1 - t * t);\n}\nexport function easeOutCirc(t: number): number {\n const t1 = t - 1;\n return Math.sqrt(1 - t1 * t1);\n}\nexport function easeInOutCirc(t: number): number {\n return t < 0.5\n ? 0.5 * (1 - Math.sqrt(1 - 4 * t * t))\n : 0.5 * (Math.sqrt(1 - (2 * t - 2) * (2 * t - 2)) + 1);\n}\n\n// ─── Back ───────────────────────────────────────────────────\nconst S = 1.70158;\nconst S2 = S * 1.525;\n\nexport function easeInBack(t: number): number {\n return t * t * ((S + 1) * t - S);\n}\nexport function easeOutBack(t: number): number {\n const t1 = t - 1;\n return t1 * t1 * ((S + 1) * t1 + S) + 1;\n}\nexport function easeInOutBack(t: number): number {\n if (t < 0.5) {\n const t2 = 2 * t;\n return 0.5 * (t2 * t2 * ((S2 + 1) * t2 - S2));\n }\n const t2 = 2 * t - 2;\n return 0.5 * (t2 * t2 * ((S2 + 1) * t2 + S2) + 2);\n}\n\n// ─── Elastic ────────────────────────────────────────────────\nexport function easeInElastic(t: number): number {\n if (t === 0 || t === 1) return t;\n return -(2 ** (10 * t - 10)) * Math.sin((t * 10 - 10.75) * (TAU / 3));\n}\nexport function easeOutElastic(t: number): number {\n if (t === 0 || t === 1) return t;\n return 2 ** (-10 * t) * Math.sin((t * 10 - 0.75) * (TAU / 3)) + 1;\n}\nexport function easeInOutElastic(t: number): number {\n if (t === 0 || t === 1) return t;\n const p = TAU / 4.5;\n return t < 0.5\n ? -0.5 * 2 ** (20 * t - 10) * Math.sin((20 * t - 11.125) * p)\n : 0.5 * 2 ** (-20 * t + 10) * Math.sin((20 * t - 11.125) * p) + 1;\n}\n\n// ─── Bounce ─────────────────────────────────────────────────\nexport function easeOutBounce(t: number): number {\n if (t < 1 / 2.75) {\n return 7.5625 * t * t;\n }\n if (t < 2 / 2.75) {\n const t2 = t - 1.5 / 2.75;\n return 7.5625 * t2 * t2 + 0.75;\n }\n if (t < 2.5 / 2.75) {\n const t2 = t - 2.25 / 2.75;\n return 7.5625 * t2 * t2 + 0.9375;\n }\n const t2 = t - 2.625 / 2.75;\n return 7.5625 * t2 * t2 + 0.984375;\n}\nexport function easeInBounce(t: number): number {\n return 1 - easeOutBounce(1 - t);\n}\nexport function easeInOutBounce(t: number): number {\n return t < 0.5 ? 0.5 * easeInBounce(t * 2) : 0.5 * easeOutBounce(t * 2 - 1) + 0.5;\n}\n\n// ─── Spring ─────────────────────────────────────────────────\nexport function springIn(t: number): number {\n return t * t * ((1.70158 + 1) * t - 1.70158);\n}\nexport function springOut(t: number): number {\n const t1 = t - 1;\n return t1 * t1 * ((1.70158 + 1) * t1 + 1.70158) + 1;\n}\nexport function springInOut(t: number): number {\n if (t < 0.5) {\n const t2 = 2 * t;\n return 0.5 * t2 * t2 * ((S2 + 1) * t2 - S2);\n }\n const t2 = 2 * t - 2;\n return 0.5 * (t2 * t2 * ((S2 + 1) * t2 + S2) + 2);\n}\n\n// ─── Type ───────────────────────────────────────────────────\nexport type EasingFn = (t: number) => number;\n","import type { Circle } from './circle.js';\nimport type { Rect } from './rect.js';\nimport type { Vec2 } from './vec2.js';\n\n/** Returns true if point is inside rect (inclusive). */\nexport function pointInRect(p: Vec2, r: Rect): boolean {\n return p.x >= r.x && p.x <= r.x + r.width && p.y >= r.y && p.y <= r.y + r.height;\n}\n\n/** Returns true if point is inside circle (inclusive). */\nexport function pointInCircle(p: Vec2, c: Circle): boolean {\n const dx = p.x - c.x;\n const dy = p.y - c.y;\n return dx * dx + dy * dy <= c.radius * c.radius;\n}\n\n/** Returns true if two rects overlap. */\nexport function rectVsRect(a: Rect, b: Rect): boolean {\n return a.x < b.x + b.width && a.x + a.width > b.x && a.y < b.y + b.height && a.y + a.height > b.y;\n}\n\n/** Returns true if rect and circle overlap. */\nexport function rectVsCircle(r: Rect, c: Circle): boolean {\n const closestX = c.x < r.x ? r.x : c.x > r.x + r.width ? r.x + r.width : c.x;\n const closestY = c.y < r.y ? r.y : c.y > r.y + r.height ? r.y + r.height : c.y;\n const dx = c.x - closestX;\n const dy = c.y - closestY;\n return dx * dx + dy * dy <= c.radius * c.radius;\n}\n\n/** Returns true if two circles overlap. */\nexport function circleVsCircle(a: Circle, b: Circle): boolean {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const radSum = a.radius + b.radius;\n return dx * dx + dy * dy < radSum * radSum;\n}\n\n/** Line segment intersection with AABB. Uses Liang-Barsky algorithm. */\nexport function lineVsRect(x1: number, y1: number, x2: number, y2: number, r: Rect): boolean {\n const dx = x2 - x1;\n const dy = y2 - y1;\n\n let tMin = 0;\n let tMax = 1;\n\n // Check each edge\n const edges = [\n { p: -dx, q: x1 - r.x },\n { p: dx, q: r.x + r.width - x1 },\n { p: -dy, q: y1 - r.y },\n { p: dy, q: r.y + r.height - y1 },\n ];\n\n for (const { p, q } of edges) {\n if (Math.abs(p) < 1e-12) {\n // Parallel to edge\n if (q < 0) return false;\n } else {\n const t = q / p;\n if (p < 0) {\n if (t > tMax) return false;\n if (t > tMin) tMin = t;\n } else {\n if (t < tMin) return false;\n if (t < tMax) tMax = t;\n }\n }\n }\n\n return tMin <= tMax;\n}\n\n/** Line segment intersection with circle. */\nexport function lineVsCircle(x1: number, y1: number, x2: number, y2: number, c: Circle): boolean {\n const dx = x2 - x1;\n const dy = y2 - y1;\n const fx = x1 - c.x;\n const fy = y1 - c.y;\n\n const a = dx * dx + dy * dy;\n const b = 2 * (fx * dx + fy * dy);\n const cc = fx * fx + fy * fy - c.radius * c.radius;\n\n // Zero-length segment: just a point-in-circle test\n if (a < 1e-12) {\n return cc <= 0;\n }\n\n let discriminant = b * b - 4 * a * cc;\n if (discriminant < 0) return false;\n\n discriminant = Math.sqrt(discriminant);\n const t1 = (-b - discriminant) / (2 * a);\n const t2 = (-b + discriminant) / (2 * a);\n\n // Check if any intersection is within segment [0, 1]\n if (t1 >= 0 && t1 <= 1) return true;\n if (t2 >= 0 && t2 <= 1) return true;\n // Segment fully inside circle\n if (t1 < 0 && t2 > 1) return true;\n\n return false;\n}\n\n/** Ray intersection with AABB. Returns t (distance) or null if no hit. */\nexport function rayVsRect(\n originX: number,\n originY: number,\n dirX: number,\n dirY: number,\n r: Rect,\n): number | null {\n const invDx = dirX !== 0 ? 1 / dirX : Number.POSITIVE_INFINITY;\n const invDy = dirY !== 0 ? 1 / dirY : Number.POSITIVE_INFINITY;\n\n const tx1 = (r.x - originX) * invDx;\n const tx2 = (r.x + r.width - originX) * invDx;\n const ty1 = (r.y - originY) * invDy;\n const ty2 = (r.y + r.height - originY) * invDy;\n\n const tMin = Math.max(Math.min(tx1, tx2), Math.min(ty1, ty2));\n const tMax = Math.min(Math.max(tx1, tx2), Math.max(ty1, ty2));\n\n if (tMax < 0 || tMin > tMax) return null;\n\n return tMin >= 0 ? tMin : tMax;\n}\n\n/**\n * Is `p` on the segment `a`→`b`? Assumes neither is degenerate.\n */\nfunction pointOnSegment(\n px: number,\n py: number,\n ax: number,\n ay: number,\n bx: number,\n by: number,\n): boolean {\n if ((px - ax) * (by - ay) - (py - ay) * (bx - ax) !== 0) return false;\n const dot = (px - ax) * (bx - ax) + (py - ay) * (by - ay);\n if (dot < 0) return false;\n const len2 = (bx - ax) * (bx - ax) + (by - ay) * (by - ay);\n return dot <= len2;\n}\n\n/**\n * Do two segments intersect, including collinear overlap?\n *\n * The companion to `segmentIntersection`: that returns *where* two segments\n * cross and is `null` when there is no single crossing point, which includes\n * collinear segments lying on top of each other. Those genuinely do intersect,\n * so a caller who only needs the yes/no answer asks here instead.\n */\nexport function segmentsIntersect(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n x3: number,\n y3: number,\n x4: number,\n y4: number,\n): boolean {\n const d1x = x2 - x1;\n const d1y = y2 - y1;\n const d2x = x4 - x3;\n const d2y = y4 - y3;\n const denom = d1x * d2y - d1y * d2x;\n const ex = x3 - x1;\n const ey = y3 - y1;\n\n if (denom === 0) {\n // A zero-length segment makes both `denom` and the collinearity test\n // trivially 0, so it would otherwise be judged collinear with everything\n // and then overlap-tested on one axis while the other is ignored.\n const aPoint = d1x === 0 && d1y === 0;\n const bPoint = d2x === 0 && d2y === 0;\n if (aPoint && bPoint) return x1 === x3 && y1 === y3;\n if (aPoint) return pointOnSegment(x1, y1, x3, y3, x4, y4);\n if (bPoint) return pointOnSegment(x3, y3, x1, y1, x2, y2);\n // Parallel. Collinear only if the offset between origins is parallel too.\n if (ex * d1y - ey * d1x !== 0) return false;\n // Collinear: overlap iff the projected intervals overlap. Project onto the\n // dominant axis to stay exact for vertical segments.\n const useX = Math.abs(d1x) >= Math.abs(d1y);\n const aMin = useX ? Math.min(x1, x2) : Math.min(y1, y2);\n const aMax = useX ? Math.max(x1, x2) : Math.max(y1, y2);\n const bMin = useX ? Math.min(x3, x4) : Math.min(y3, y4);\n const bMax = useX ? Math.max(x3, x4) : Math.max(y3, y4);\n return aMin <= bMax && bMin <= aMax;\n }\n\n const t = (ex * d2y - ey * d2x) / denom;\n const u = (ex * d1y - ey * d1x) / denom;\n return t >= 0 && t <= 1 && u >= 0 && u <= 1;\n}\n\n/**\n * Where two segments cross, written into `out`.\n *\n * Returns `null` when there is no **single** crossing point — segments that miss\n * each other, are parallel, or are collinear. Collinear overlap is the case\n * worth knowing about: the segments do intersect, at infinitely many points, so\n * there is no one answer to write into `out`. Use `segmentsIntersect` when the\n * yes/no answer is what you need.\n *\n * `out` is left untouched when the result is `null`.\n */\nexport function segmentIntersectionInto(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n x3: number,\n y3: number,\n x4: number,\n y4: number,\n out: Vec2,\n): Vec2 | null {\n const d1x = x2 - x1;\n const d1y = y2 - y1;\n const d2x = x4 - x3;\n const d2y = y4 - y3;\n const denom = d1x * d2y - d1y * d2x;\n if (denom === 0) {\n // A degenerate segment lying on the other one *does* have a unique\n // intersection — itself — so answer it rather than reporting no hit.\n const aPoint = d1x === 0 && d1y === 0;\n const bPoint = d2x === 0 && d2y === 0;\n if (aPoint && !bPoint && pointOnSegment(x1, y1, x3, y3, x4, y4)) {\n out.x = x1;\n out.y = y1;\n return out;\n }\n if (bPoint && !aPoint && pointOnSegment(x3, y3, x1, y1, x2, y2)) {\n out.x = x3;\n out.y = y3;\n return out;\n }\n if (aPoint && bPoint && x1 === x3 && y1 === y3) {\n out.x = x1;\n out.y = y1;\n return out;\n }\n return null; // parallel, or collinear with no unique point\n }\n\n const ex = x3 - x1;\n const ey = y3 - y1;\n const t = (ex * d2y - ey * d2x) / denom;\n if (t < 0 || t > 1) return null;\n const u = (ex * d1y - ey * d1x) / denom;\n if (u < 0 || u > 1) return null;\n\n out.x = x1 + t * d1x;\n out.y = y1 + t * d1y;\n return out;\n}\n\n/**\n * Where two segments cross. Allocates — see `segmentIntersectionInto` for the\n * hot path.\n */\nexport function segmentIntersection(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n x3: number,\n y3: number,\n x4: number,\n y4: number,\n): Vec2 | null {\n return segmentIntersectionInto(x1, y1, x2, y2, x3, y3, x4, y4, { x: 0, y: 0 });\n}\n","import type { Transform2D } from './transform2d.js';\n\n/**\n * 3x3 matrix stored in column-major order on Float32Array.\n * Layout: [m00, m10, m20, m01, m11, m21, m02, m12, m22]\n *\n * | m00 m01 m02 | indices: | 0 3 6 |\n * | m10 m11 m12 | | 1 4 7 |\n * | m20 m21 m22 | | 2 5 8 |\n */\nexport type Mat3 = Float32Array;\n\nexport const Mat3 = {\n /** Creates a new identity matrix. */\n create(): Mat3 {\n const m = new Float32Array(9);\n m[0] = 1;\n m[4] = 1;\n m[8] = 1;\n return m;\n },\n\n /** Sets m to identity. */\n identity(m: Mat3): Mat3 {\n m[0] = 1;\n m[1] = 0;\n m[2] = 0;\n m[3] = 0;\n m[4] = 1;\n m[5] = 0;\n m[6] = 0;\n m[7] = 0;\n m[8] = 1;\n return m;\n },\n\n /** Multiplies a * b, writes into out (or allocates). */\n multiply(a: Mat3, b: Mat3, out?: Mat3): Mat3 {\n const a00 = a[0]!,\n a01 = a[3]!,\n a02 = a[6]!;\n const a10 = a[1]!,\n a11 = a[4]!,\n a12 = a[7]!;\n const a20 = a[2]!,\n a21 = a[5]!,\n a22 = a[8]!;\n\n const b00 = b[0]!,\n b01 = b[3]!,\n b02 = b[6]!;\n const b10 = b[1]!,\n b11 = b[4]!,\n b12 = b[7]!;\n const b20 = b[2]!,\n b21 = b[5]!,\n b22 = b[8]!;\n\n const o = out ?? new Float32Array(9);\n o[0] = a00 * b00 + a01 * b10 + a02 * b20;\n o[1] = a10 * b00 + a11 * b10 + a12 * b20;\n o[2] = a20 * b00 + a21 * b10 + a22 * b20;\n o[3] = a00 * b01 + a01 * b11 + a02 * b21;\n o[4] = a10 * b01 + a11 * b11 + a12 * b21;\n o[5] = a20 * b01 + a21 * b11 + a22 * b21;\n o[6] = a00 * b02 + a01 * b12 + a02 * b22;\n o[7] = a10 * b02 + a11 * b12 + a12 * b22;\n o[8] = a20 * b02 + a21 * b12 + a22 * b22;\n return o;\n },\n\n /** Creates a translation matrix. */\n translate(tx: number, ty: number, out?: Mat3): Mat3 {\n const m = out ?? new Float32Array(9);\n m[0] = 1;\n m[1] = 0;\n m[2] = 0;\n m[3] = 0;\n m[4] = 1;\n m[5] = 0;\n m[6] = tx;\n m[7] = ty;\n m[8] = 1;\n return m;\n },\n\n /** Creates a rotation matrix (radians). */\n rotate(angle: number, out?: Mat3): Mat3 {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n const m = out ?? new Float32Array(9);\n m[0] = c;\n m[1] = s;\n m[2] = 0;\n m[3] = -s;\n m[4] = c;\n m[5] = 0;\n m[6] = 0;\n m[7] = 0;\n m[8] = 1;\n return m;\n },\n\n /** Creates a scale matrix. */\n scale(sx: number, sy: number, out?: Mat3): Mat3 {\n const m = out ?? new Float32Array(9);\n m[0] = sx;\n m[1] = 0;\n m[2] = 0;\n m[3] = 0;\n m[4] = sy;\n m[5] = 0;\n m[6] = 0;\n m[7] = 0;\n m[8] = 1;\n return m;\n },\n\n /** Inverts the matrix. Returns null if singular. */\n invert(m: Mat3, out?: Mat3): Mat3 | null {\n const a00 = m[0]!,\n a01 = m[3]!,\n a02 = m[6]!;\n const a10 = m[1]!,\n a11 = m[4]!,\n a12 = m[7]!;\n const a20 = m[2]!,\n a21 = m[5]!,\n a22 = m[8]!;\n\n const det =\n a00 * (a11 * a22 - a12 * a21) - a01 * (a10 * a22 - a12 * a20) + a02 * (a10 * a21 - a11 * a20);\n\n if (Math.abs(det) < 1e-8) return null;\n\n const invDet = 1 / det;\n const o = out ?? new Float32Array(9);\n o[0] = (a11 * a22 - a12 * a21) * invDet;\n o[1] = (a12 * a20 - a10 * a22) * invDet;\n o[2] = (a10 * a21 - a11 * a20) * invDet;\n o[3] = (a02 * a21 - a01 * a22) * invDet;\n o[4] = (a00 * a22 - a02 * a20) * invDet;\n o[5] = (a01 * a20 - a00 * a21) * invDet;\n o[6] = (a01 * a12 - a02 * a11) * invDet;\n o[7] = (a02 * a10 - a00 * a12) * invDet;\n o[8] = (a00 * a11 - a01 * a10) * invDet;\n return o;\n },\n\n /** Builds a matrix from a Transform2D (TRS order: translate * rotate * scale). */\n fromTransform(t: Transform2D, out?: Mat3): Mat3 {\n const c = Math.cos(t.rotation);\n const s = Math.sin(t.rotation);\n const sx = t.scale.x;\n const sy = t.scale.y;\n const m = out ?? new Float32Array(9);\n m[0] = c * sx;\n m[1] = s * sx;\n m[2] = 0;\n m[3] = -s * sy;\n m[4] = c * sy;\n m[5] = 0;\n m[6] = t.position.x;\n m[7] = t.position.y;\n m[8] = 1;\n return m;\n },\n} as const;\n","import type { Rect } from './rect.js';\nimport type { Vec2 } from './vec2.js';\n\n/** Seeded PRNG using mulberry32 algorithm. */\nexport class SeededRNG {\n private state: number;\n\n constructor(seed: number) {\n this.state = seed | 0;\n }\n\n /** Returns a float in [0, 1). */\n next(): number {\n this.state = (this.state + 0x6d2b79f5) | 0;\n let t = Math.imul(this.state ^ (this.state >>> 15), 1 | this.state);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n }\n\n /** Returns a float in [min, max). */\n float(min: number, max: number): number {\n return min + this.next() * (max - min);\n }\n\n /** Returns an integer in [min, max] (inclusive). */\n int(min: number, max: number): number {\n return Math.floor(this.float(min, max + 1));\n }\n\n /**\n * The generator's entire internal state, as a single int32.\n *\n * Enough to resume the exact sequence later, which is what makes a save file\n * or a replay reproducible: store this alongside the save, hand it back to\n * `setState`, and the next `next()` returns what it would have returned.\n */\n getState(): number {\n return this.state;\n }\n\n /**\n * Restore a state previously read from `getState`.\n *\n * Coerced to int32 exactly as the constructor coerces a seed, so any number\n * is accepted and a round-trip through JSON is safe.\n */\n setState(state: number): void {\n this.state = state | 0;\n }\n}\n\n/** Returns a random float in [min, max). */\nexport function randomFloat(min: number, max: number): number {\n return min + Math.random() * (max - min);\n}\n\n/** Returns a random integer in [min, max] (inclusive). */\nexport function randomInt(min: number, max: number): number {\n return Math.floor(randomFloat(min, max + 1));\n}\n\n/** Returns a random Vec2 within a rect. */\nexport function randomVec2InRect(r: Rect): Vec2 {\n return {\n x: r.x + Math.random() * r.width,\n y: r.y + Math.random() * r.height,\n };\n}\n\n/** Returns a random point inside a circle (uniform distribution). */\nexport function randomPointInCircle(cx: number, cy: number, radius: number): Vec2 {\n // Use sqrt for uniform distribution\n const r = radius * Math.sqrt(Math.random());\n const angle = Math.random() * Math.PI * 2;\n return {\n x: cx + r * Math.cos(angle),\n y: cy + r * Math.sin(angle),\n };\n}\n\n/** Fisher-Yates shuffle (in-place). Returns the array. */\nexport function shuffle<T>(array: T[]): T[] {\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n const tmp = array[i]!;\n array[i] = array[j]!;\n array[j] = tmp;\n }\n return array;\n}\n\n/** Returns a random element from the array. */\nexport function choose<T>(array: readonly T[]): T | undefined {\n if (array.length === 0) return undefined;\n return array[Math.floor(Math.random() * array.length)];\n}\n\n/**\n * Picks an index from a weight array using a cumulative walk.\n * `roll01` must be in [0, 1); returns 0 for an empty or all-zero array.\n */\nexport function weightedIndex(weights: readonly number[], roll01: number): number {\n let total = 0;\n for (let i = 0; i < weights.length; i++) total += weights[i] ?? 0;\n if (total <= 0) return 0;\n const target = roll01 * total;\n let acc = 0;\n for (let i = 0; i < weights.length; i++) {\n acc += weights[i] ?? 0;\n if (target < acc) return i;\n }\n return weights.length - 1;\n}\n\n/**\n * Picks an index from `items` using a per-item weight accessor.\n * `roll01` must be in [0, 1); returns 0 for an empty or all-zero-weight array.\n */\nexport function weightedIndexBy<T>(\n items: readonly T[],\n weight: (item: T) => number,\n roll01: number,\n): number {\n let total = 0;\n for (let i = 0; i < items.length; i++) total += weight(items[i] as T);\n if (total <= 0) return 0;\n const target = roll01 * total;\n let acc = 0;\n for (let i = 0; i < items.length; i++) {\n acc += weight(items[i] as T);\n if (target < acc) return i;\n }\n return items.length - 1;\n}\n\n/**\n * Picks an item from `items` using a per-item weight accessor.\n * Returns `undefined` for an empty array; returns the last item on float-edge.\n */\nexport function weightedPick<T>(\n items: readonly T[],\n weight: (item: T) => number,\n roll01: number,\n): T | undefined {\n if (items.length === 0) return undefined;\n return items[weightedIndexBy(items, weight, roll01)];\n}\n\n/**\n * 32-bit avalanche finalizer (lowbias32). Mixes `seed` so that adjacent seeds\n * decorrelate into different output values. Returns an unsigned 32-bit integer.\n *\n * Constants from https://nullprogram.com/blog/2018/07/31/ (lowbias32).\n */\nexport function hashU32(seed: number): number {\n let h = (seed | 0) >>> 0;\n h = Math.imul(h ^ (h >>> 16), 0x45d9f3b) >>> 0;\n h = Math.imul(h ^ (h >>> 16), 0x45d9f3b) >>> 0;\n return (h ^ (h >>> 16)) >>> 0;\n}\n\n/**\n * Deterministically maps `seed` to an index in [0, count).\n * Single-entry pools short-circuit to 0. Uses `hashU32` to decorrelate\n * adjacent seeds before the modulo.\n */\nexport function seededIndex(seed: number, count: number): number {\n if (count <= 1) return 0;\n return hashU32(seed) % count;\n}\n","import type { Vec2 } from './vec2.js';\n\n/** Axis-aligned bounding box. */\nexport type Rect = { x: number; y: number; width: number; height: number };\n\nexport const Rect = {\n /** Returns true if point is inside rect (inclusive). */\n contains(r: Rect, p: Vec2): boolean {\n return p.x >= r.x && p.x <= r.x + r.width && p.y >= r.y && p.y <= r.y + r.height;\n },\n\n /** Returns true if two rects overlap (share area). */\n intersects(a: Rect, b: Rect): boolean {\n return (\n a.x < b.x + b.width && a.x + a.width > b.x && a.y < b.y + b.height && a.y + a.height > b.y\n );\n },\n\n /** Returns the overlapping rect, or null if no overlap. */\n intersection(a: Rect, b: Rect): Rect | null {\n const x = Math.max(a.x, b.x);\n const y = Math.max(a.y, b.y);\n const right = Math.min(a.x + a.width, b.x + b.width);\n const bottom = Math.min(a.y + a.height, b.y + b.height);\n if (right <= x || bottom <= y) return null;\n return { x, y, width: right - x, height: bottom - y };\n },\n\n /** Returns the smallest rect containing both rects. */\n union(a: Rect, b: Rect): Rect {\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n const right = Math.max(a.x + a.width, b.x + b.width);\n const bottom = Math.max(a.y + a.height, b.y + b.height);\n return { x, y, width: right - x, height: bottom - y };\n },\n\n /** Creates a rect from an array of points (bounding box). */\n fromPoints(points: readonly Vec2[]): Rect {\n if (points.length === 0) return { x: 0, y: 0, width: 0, height: 0 };\n let minX = points[0]!.x;\n let minY = points[0]!.y;\n let maxX = minX;\n let maxY = minY;\n for (let i = 1; i < points.length; i++) {\n const p = points[i]!;\n if (p.x < minX) minX = p.x;\n if (p.y < minY) minY = p.y;\n if (p.x > maxX) maxX = p.x;\n if (p.y > maxY) maxY = p.y;\n }\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n },\n\n /** Returns the center point of the rect. */\n center(r: Rect): Vec2 {\n return { x: r.x + r.width * 0.5, y: r.y + r.height * 0.5 };\n },\n\n /** Returns a new rect expanded by amount on each side. */\n expand(r: Rect, amount: number): Rect {\n return {\n x: r.x - amount,\n y: r.y - amount,\n width: r.width + amount * 2,\n height: r.height + amount * 2,\n };\n },\n} as const;\n","/**\n * Timed-window and capped-bonus math — pure, zero-alloc scoring helpers.\n */\n\n/**\n * Bonus pay floored to an integer: `pay × min(frac, capFrac)`.\n * `frac` is the current multiplier (e.g. `streak * fracPerStep`);\n * `capFrac` bounds the multiplier so it cannot grow unboundedly.\n * Returns 0 for zero or negative `pay`.\n */\nexport function cappedBonus(pay: number, frac: number, capFrac: number): number {\n if (pay <= 0) return 0;\n return Math.floor(pay * Math.min(frac, capFrac));\n}\n\n/**\n * Advances a timed streak counter. A new event within `windowSec` of `lastT`\n * increments `prev`; a gap (or `lastT < 0` meaning \"no prior event\") resets\n * to 1. Pure — the caller stores the returned value and stamps the new time.\n * `elapsed` is the monotonic clock at the new event.\n */\nexport function advanceWindowedStreak(\n prev: number,\n elapsed: number,\n lastT: number,\n windowSec: number,\n): number {\n if (lastT >= 0 && elapsed - lastT <= windowSec) return prev + 1;\n return 1;\n}\n\n/**\n * Returns true when a streak window has lapsed: a window was open (`lastT >= 0`)\n * and more than `windowSec` seconds have passed since `lastT`.\n * `lastT < 0` means no event has ever occurred — never expired.\n */\nexport function windowExpired(elapsed: number, lastT: number, windowSec: number): boolean {\n return lastT >= 0 && elapsed - lastT > windowSec;\n}\n\n/**\n * How many more events may be awarded in the current window given `awarded`\n * already counted. Clamped to 0 — never negative.\n */\nexport function remainingInWindow(awarded: number, capPerWindow: number): number {\n return Math.max(0, capPerWindow - awarded);\n}\n","import type { Vec2 } from './vec2.js';\n\n/** 2D transform: position, rotation (radians), and scale. */\nexport type Transform2D = {\n position: Vec2;\n rotation: number;\n scale: Vec2;\n};\n\nexport const Transform2D = {\n /** Creates an identity transform. */\n identity(): Transform2D {\n return { position: { x: 0, y: 0 }, rotation: 0, scale: { x: 1, y: 1 } };\n },\n\n /** Creates a transform from components. */\n create(x = 0, y = 0, rotation = 0, scaleX = 1, scaleY = 1): Transform2D {\n return {\n position: { x, y },\n rotation,\n scale: { x: scaleX, y: scaleY },\n };\n },\n\n /** Transforms a local-space point to world-space. */\n localToWorld(t: Transform2D, point: Vec2): Vec2 {\n const c = Math.cos(t.rotation);\n const s = Math.sin(t.rotation);\n const sx = point.x * t.scale.x;\n const sy = point.y * t.scale.y;\n return {\n x: sx * c - sy * s + t.position.x,\n y: sx * s + sy * c + t.position.y,\n };\n },\n\n /** Transforms a world-space point to local-space. */\n worldToLocal(t: Transform2D, point: Vec2): Vec2 {\n const dx = point.x - t.position.x;\n const dy = point.y - t.position.y;\n const c = Math.cos(-t.rotation);\n const s = Math.sin(-t.rotation);\n const rx = dx * c - dy * s;\n const ry = dx * s + dy * c;\n return {\n x: t.scale.x !== 0 ? rx / t.scale.x : 0,\n y: t.scale.y !== 0 ? ry / t.scale.y : 0,\n };\n },\n\n /** Returns a copy of the transform. */\n clone(t: Transform2D): Transform2D {\n return {\n position: { x: t.position.x, y: t.position.y },\n rotation: t.rotation,\n scale: { x: t.scale.x, y: t.scale.y },\n };\n },\n} as const;\n","import { approxEquals, rotateTowards } from './scalar.js';\n\n/** Vec2 plain object type — no class, no GC pressure. */\nexport type Vec2 = { x: number; y: number };\n\n/** Creates a Vec2 plain object. */\nexport function vec2(x = 0, y = 0): Vec2 {\n return { x, y };\n}\n\n// ─── Static namespace ───────────────────────────────────────────\n\nexport const Vec2 = {\n /** Returns { 0, 0 }. */\n zero(): Vec2 {\n return { x: 0, y: 0 };\n },\n /** Returns { 1, 1 }. */\n one(): Vec2 {\n return { x: 1, y: 1 };\n },\n /** Returns { 0, -1 }. */\n up(): Vec2 {\n return { x: 0, y: -1 };\n },\n /** Returns { 0, 1 }. */\n down(): Vec2 {\n return { x: 0, y: 1 };\n },\n /** Returns { -1, 0 }. */\n left(): Vec2 {\n return { x: -1, y: 0 };\n },\n /** Returns { 1, 0 }. */\n right(): Vec2 {\n return { x: 1, y: 0 };\n },\n\n /** Component-wise addition. Writes into out if provided. */\n add(a: Vec2, b: Vec2, out?: Vec2): Vec2 {\n if (out) {\n out.x = a.x + b.x;\n out.y = a.y + b.y;\n return out;\n }\n return { x: a.x + b.x, y: a.y + b.y };\n },\n\n /** Component-wise subtraction a - b. */\n sub(a: Vec2, b: Vec2, out?: Vec2): Vec2 {\n if (out) {\n out.x = a.x - b.x;\n out.y = a.y - b.y;\n return out;\n }\n return { x: a.x - b.x, y: a.y - b.y };\n },\n\n /** Scales a vector by a scalar. */\n scale(v: Vec2, s: number, out?: Vec2): Vec2 {\n if (out) {\n out.x = v.x * s;\n out.y = v.y * s;\n return out;\n }\n return { x: v.x * s, y: v.y * s };\n },\n\n /** Returns a unit vector. Returns zero vector if length is 0. */\n normalize(v: Vec2, out?: Vec2): Vec2 {\n const len = Math.sqrt(v.x * v.x + v.y * v.y);\n if (len === 0) {\n if (out) {\n out.x = 0;\n out.y = 0;\n return out;\n }\n return { x: 0, y: 0 };\n }\n const inv = 1 / len;\n if (out) {\n out.x = v.x * inv;\n out.y = v.y * inv;\n return out;\n }\n return { x: v.x * inv, y: v.y * inv };\n },\n\n /** The direction of `(dx, dy)` scaled to `length`; writes zeros when `(dx, dy)` is shorter than\n * 1e-6. Zero-alloc, mandatory `out`; scalar components so hot paths need no temporary Vec2. */\n scaleToLengthInto(dx: number, dy: number, length: number, out: Vec2): Vec2 {\n const len = Math.sqrt(dx * dx + dy * dy);\n if (len <= 1e-6) {\n out.x = 0;\n out.y = 0;\n return out;\n }\n const inv = length / len;\n out.x = dx * inv;\n out.y = dy * inv;\n return out;\n },\n\n /** Dot product. */\n dot(a: Vec2, b: Vec2): number {\n return a.x * b.x + a.y * b.y;\n },\n\n /** 2D cross product (z-component of the 3D cross). */\n cross(a: Vec2, b: Vec2): number {\n return a.x * b.y - a.y * b.x;\n },\n\n /** Perpendicular: (-y, x). In this engine's y-down screen space this is a 90° clockwise turn,\n * matching the Skia rotation convention used by `@flare-engine/render`. Writes into out if\n * provided. */\n perp(v: Vec2, out?: Vec2): Vec2 {\n const x = -v.y;\n const y = v.x;\n if (out) {\n out.x = x;\n out.y = y;\n return out;\n }\n return { x, y };\n },\n\n /** Scalar × vector cross product: s × v = (-s·y, s·x). Writes into out if provided. */\n crossSV(s: number, v: Vec2, out?: Vec2): Vec2 {\n const x = -s * v.y;\n const y = s * v.x;\n if (out) {\n out.x = x;\n out.y = y;\n return out;\n }\n return { x, y };\n },\n\n /** Linearly interpolates between a and b (unclamped). */\n lerp(a: Vec2, b: Vec2, t: number, out?: Vec2): Vec2 {\n const x = a.x + (b.x - a.x) * t;\n const y = a.y + (b.y - a.y) * t;\n if (out) {\n out.x = x;\n out.y = y;\n return out;\n }\n return { x, y };\n },\n\n /** Spherical linear interpolation for unit vectors. */\n slerp(a: Vec2, b: Vec2, t: number, out?: Vec2): Vec2 {\n let d = a.x * b.x + a.y * b.y;\n // Clamp dot to [-1, 1] for numerical safety\n d = d < -1 ? -1 : d > 1 ? 1 : d;\n const theta = Math.acos(d);\n if (theta < 1e-6) {\n return Vec2.lerp(a, b, t, out);\n }\n const sinTheta = Math.sin(theta);\n const wa = Math.sin((1 - t) * theta) / sinTheta;\n const wb = Math.sin(t * theta) / sinTheta;\n const x = a.x * wa + b.x * wb;\n const y = a.y * wa + b.y * wb;\n if (out) {\n out.x = x;\n out.y = y;\n return out;\n }\n return { x, y };\n },\n\n /** Euclidean distance between two points. */\n distance(a: Vec2, b: Vec2): number {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n return Math.sqrt(dx * dx + dy * dy);\n },\n\n /** Squared distance (avoids sqrt). */\n distanceSq(a: Vec2, b: Vec2): number {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n return dx * dx + dy * dy;\n },\n\n /** Length of a vector. */\n length(v: Vec2): number {\n return Math.sqrt(v.x * v.x + v.y * v.y);\n },\n\n /** Squared length (avoids sqrt). */\n lengthSq(v: Vec2): number {\n return v.x * v.x + v.y * v.y;\n },\n\n /** Angle of vector in radians (atan2). */\n angle(v: Vec2): number {\n return Math.atan2(v.y, v.x);\n },\n\n /** Rotates a vector by angle (radians) around origin. */\n rotate(v: Vec2, angle: number, out?: Vec2): Vec2 {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n const x = v.x * c - v.y * s;\n const y = v.x * s + v.y * c;\n if (out) {\n out.x = x;\n out.y = y;\n return out;\n }\n return { x, y };\n },\n\n /** Component-wise approximate equality. */\n equals(a: Vec2, b: Vec2, epsilon = 1e-6): boolean {\n return approxEquals(a.x, b.x, epsilon) && approxEquals(a.y, b.y, epsilon);\n },\n\n /** Returns a copy of the vector. */\n clone(v: Vec2): Vec2 {\n return { x: v.x, y: v.y };\n },\n\n /** Clamps the length of a vector to maxLength. */\n clampLength(v: Vec2, maxLength: number, out?: Vec2): Vec2 {\n const lenSq = v.x * v.x + v.y * v.y;\n if (lenSq <= maxLength * maxLength) {\n if (out) {\n out.x = v.x;\n out.y = v.y;\n return out;\n }\n return { x: v.x, y: v.y };\n }\n const len = Math.sqrt(lenSq);\n const inv = maxLength / len;\n if (out) {\n out.x = v.x * inv;\n out.y = v.y * inv;\n return out;\n }\n return { x: v.x * inv, y: v.y * inv };\n },\n\n /** Zero-alloc homing steer: rotate velocity (vx,vy) toward direction (dx,dy) by at most maxStep\n * radians, preserving speed; writes into out. Mandatory out. Byte-identical to hand-rolled\n * homing-bullet steering (Math.hypot speed + atan2 + branch-form turn + cos/sin * speed). */\n turnVelocityTowardInto(\n vx: number,\n vy: number,\n dx: number,\n dy: number,\n maxStep: number,\n out: Vec2,\n ): Vec2 {\n const speed = Math.hypot(vx, vy);\n const newAng = rotateTowards(Math.atan2(vy, vx), Math.atan2(dy, dx), maxStep);\n out.x = Math.cos(newAng) * speed;\n out.y = Math.sin(newAng) * speed;\n return out;\n },\n} as const;\n"],"mappings":"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"}
|