@adatechnology/game-fluids 0.0.0-stage → 0.1.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/data/liquids.json","../src/liquids.ts","../src/math.ts","../src/landing.ts","../src/locale.ts","../src/shapes.ts","../src/stains.ts","../src/world.ts","../src/data/item-uses.json","../src/item-use.ts"],"sourcesContent":["export { createFluids } from './world'\nexport { LIQUIDS } from './liquids'\nexport { ITEM_USES, createItemUse } from './item-use'\nexport type { HandTransform } from './item-use'\nexport { describeEvent, locales, resolveStrings } from './locale'\nexport type { FluidLocale, FluidStrings } from './locale'\nexport { ballistic, sampleStream } from './landing'\nexport { SAMPLES as STAIN_SAMPLES, stainDirection } from './stains'\nexport type {\n ContainerSpec,\n ContainerState,\n FluidEvent,\n FluidOptions,\n FluidWorld,\n ItemUseDef,\n ItemUsePlayer,\n LiquidDef,\n LiquidId,\n Quat,\n StainState,\n StreamCause,\n StreamState,\n SurfaceSpec,\n TapSpec,\n TapState,\n Vec3,\n} from './types'\n","[\n {\n \"id\": \"water\",\n \"color\": 11064558,\n \"opacity\": 0.35,\n \"stainColor\": 7309206,\n \"viscosity\": 1,\n \"density\": 1000,\n \"dryTime\": 600,\n \"gloss\": 0.9,\n \"drink\": {\n \"thirst\": 100,\n \"effects\": []\n },\n \"tags\": [\n \"drink\",\n \"clear\"\n ]\n },\n {\n \"id\": \"coffee\",\n \"color\": 3875604,\n \"opacity\": 0.95,\n \"stainColor\": 2824202,\n \"viscosity\": 1.5,\n \"density\": 1005,\n \"dryTime\": 900,\n \"gloss\": 0.8,\n \"leavesMark\": true,\n \"steamC\": 60,\n \"drink\": {\n \"thirst\": 80,\n \"effects\": [\n \"caffeine\"\n ]\n },\n \"tags\": [\n \"drink\",\n \"hot\"\n ]\n },\n {\n \"id\": \"tea\",\n \"color\": 9063188,\n \"opacity\": 0.8,\n \"stainColor\": 6961682,\n \"viscosity\": 1.4,\n \"density\": 1005,\n \"dryTime\": 800,\n \"gloss\": 0.8,\n \"leavesMark\": true,\n \"steamC\": 60,\n \"drink\": {\n \"thirst\": 90,\n \"effects\": []\n },\n \"tags\": [\n \"drink\",\n \"hot\"\n ]\n },\n {\n \"id\": \"milk\",\n \"color\": 16052712,\n \"opacity\": 0.98,\n \"stainColor\": 14473160,\n \"viscosity\": 2,\n \"density\": 1030,\n \"dryTime\": 900,\n \"gloss\": 0.5,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 70,\n \"effects\": []\n },\n \"tags\": [\n \"drink\"\n ]\n },\n {\n \"id\": \"soda\",\n \"color\": 3808530,\n \"opacity\": 0.85,\n \"stainColor\": 2757901,\n \"viscosity\": 1.3,\n \"density\": 1040,\n \"dryTime\": 1200,\n \"gloss\": 0.85,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 60,\n \"effects\": []\n },\n \"tags\": [\n \"drink\",\n \"sticky\"\n ]\n },\n {\n \"id\": \"juice\",\n \"color\": 15239467,\n \"opacity\": 0.9,\n \"stainColor\": 12741916,\n \"viscosity\": 2,\n \"density\": 1045,\n \"dryTime\": 1100,\n \"gloss\": 0.8,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 75,\n \"effects\": []\n },\n \"tags\": [\n \"drink\",\n \"sticky\"\n ]\n },\n {\n \"id\": \"beer\",\n \"color\": 14259740,\n \"opacity\": 0.8,\n \"stainColor\": 11039764,\n \"viscosity\": 1.4,\n \"density\": 1010,\n \"dryTime\": 900,\n \"gloss\": 0.8,\n \"drink\": {\n \"thirst\": 50,\n \"effects\": [\n \"alcohol\"\n ]\n },\n \"tags\": [\n \"drink\",\n \"alcohol\"\n ]\n },\n {\n \"id\": \"wine\",\n \"color\": 7016223,\n \"opacity\": 0.9,\n \"stainColor\": 5048854,\n \"viscosity\": 1.6,\n \"density\": 990,\n \"dryTime\": 800,\n \"gloss\": 0.85,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 40,\n \"effects\": [\n \"alcohol\"\n ]\n },\n \"tags\": [\n \"drink\",\n \"alcohol\"\n ]\n },\n {\n \"id\": \"spirits\",\n \"color\": 13214042,\n \"opacity\": 0.6,\n \"stainColor\": 10320959,\n \"viscosity\": 1.8,\n \"density\": 940,\n \"dryTime\": 200,\n \"gloss\": 0.85,\n \"flammable\": true,\n \"drink\": {\n \"thirst\": 5,\n \"effects\": [\n \"alcohol\"\n ]\n },\n \"tags\": [\n \"drink\",\n \"alcohol\"\n ]\n },\n {\n \"id\": \"fuel\",\n \"color\": 14926682,\n \"opacity\": 0.6,\n \"stainColor\": 7232298,\n \"viscosity\": 0.6,\n \"density\": 740,\n \"dryTime\": 120,\n \"gloss\": 0.95,\n \"leavesMark\": true,\n \"flammable\": true,\n \"drink\": {\n \"thirst\": 0,\n \"effects\": [\n \"poison\"\n ]\n },\n \"tags\": [\n \"fuel\",\n \"gasoline\"\n ]\n },\n {\n \"id\": \"diesel\",\n \"color\": 12098094,\n \"opacity\": 0.8,\n \"stainColor\": 5917208,\n \"viscosity\": 3,\n \"density\": 830,\n \"dryTime\": 3600,\n \"gloss\": 0.95,\n \"leavesMark\": true,\n \"flammable\": true,\n \"drink\": {\n \"thirst\": 0,\n \"effects\": [\n \"poison\"\n ]\n },\n \"tags\": [\n \"fuel\"\n ]\n },\n {\n \"id\": \"motor_oil\",\n \"color\": 3877388,\n \"opacity\": 0.95,\n \"stainColor\": 1840134,\n \"viscosity\": 100,\n \"density\": 880,\n \"dryTime\": 0,\n \"gloss\": 1,\n \"leavesMark\": true,\n \"flammable\": true,\n \"drink\": {\n \"thirst\": 0,\n \"effects\": [\n \"poison\"\n ]\n },\n \"tags\": [\n \"oil\"\n ]\n },\n {\n \"id\": \"cooking_oil\",\n \"color\": 14267708,\n \"opacity\": 0.85,\n \"stainColor\": 11110698,\n \"viscosity\": 60,\n \"density\": 920,\n \"dryTime\": 0,\n \"gloss\": 1,\n \"leavesMark\": true,\n \"flammable\": true,\n \"drink\": {\n \"thirst\": 0,\n \"effects\": [\n \"poison\"\n ]\n },\n \"tags\": [\n \"oil\",\n \"food\"\n ]\n },\n {\n \"id\": \"blood\",\n \"color\": 7997964,\n \"opacity\": 0.92,\n \"stainColor\": 4850950,\n \"viscosity\": 4,\n \"density\": 1060,\n \"dryTime\": 1200,\n \"gloss\": 0.75,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 10,\n \"effects\": [\n \"disgust\"\n ]\n },\n \"tags\": [\n \"organic\"\n ]\n },\n {\n \"id\": \"sap\",\n \"color\": 13146940,\n \"opacity\": 0.8,\n \"stainColor\": 10122282,\n \"viscosity\": 200,\n \"density\": 1100,\n \"dryTime\": 3600,\n \"gloss\": 0.8,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 20,\n \"effects\": []\n },\n \"tags\": [\n \"organic\",\n \"sticky\"\n ]\n },\n {\n \"id\": \"acid\",\n \"color\": 10146378,\n \"opacity\": 0.6,\n \"stainColor\": 7313970,\n \"viscosity\": 1.5,\n \"density\": 1200,\n \"dryTime\": 900,\n \"gloss\": 0.9,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 0,\n \"effects\": [\n \"poison\"\n ]\n },\n \"tags\": [\n \"corrosive\"\n ]\n },\n {\n \"id\": \"paint\",\n \"color\": 11740715,\n \"opacity\": 0.98,\n \"stainColor\": 9050655,\n \"viscosity\": 300,\n \"density\": 1300,\n \"dryTime\": 1800,\n \"gloss\": 0.6,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 0,\n \"effects\": [\n \"poison\"\n ]\n },\n \"tags\": [\n \"paint\"\n ]\n },\n {\n \"id\": \"bleach\",\n \"color\": 15134688,\n \"opacity\": 0.7,\n \"stainColor\": 13621446,\n \"viscosity\": 1.2,\n \"density\": 1100,\n \"dryTime\": 900,\n \"gloss\": 0.85,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 0,\n \"effects\": [\n \"poison\"\n ]\n },\n \"tags\": [\n \"corrosive\"\n ]\n },\n {\n \"id\": \"honey\",\n \"color\": 14193162,\n \"opacity\": 0.9,\n \"stainColor\": 12089350,\n \"viscosity\": 3000,\n \"density\": 1420,\n \"dryTime\": 14400,\n \"gloss\": 0.95,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 10,\n \"effects\": []\n },\n \"tags\": [\n \"drink\",\n \"sticky\"\n ]\n }\n]","import liquidsData from './data/liquids.json'\nimport type { LiquidDef } from './types'\n\n/**\n * Built-in liquids (data in `data/liquids.json`; colours are `0xRRGGBB` stored as integers).\n * Viscosity is relative to water, density in kg/m³, `dryTime` in seconds for a thin film at 20 °C (0 = never dries).\n */\nexport const LIQUIDS: LiquidDef[] = liquidsData as unknown as LiquidDef[]\n","import type { Quat, Vec3 } from './types'\n\nexport const GRAVITY = 9.81\nexport const EPS = 1e-7\n\nexport const clamp = (v: number, lo: number, hi: number): number => (v < lo ? lo : v > hi ? hi : v)\nexport const lerp = (a: number, b: number, t: number): number => a + (b - a) * t\n\nexport const add = (a: Vec3, b: Vec3): Vec3 => [a[0] + b[0], a[1] + b[1], a[2] + b[2]]\nexport const sub = (a: Vec3, b: Vec3): Vec3 => [a[0] - b[0], a[1] - b[1], a[2] - b[2]]\nexport const scale = (a: Vec3, s: number): Vec3 => [a[0] * s, a[1] * s, a[2] * s]\nexport const dot = (a: Vec3, b: Vec3): number => a[0] * b[0] + a[1] * b[1] + a[2] * b[2]\nexport const cross = (a: Vec3, b: Vec3): Vec3 => [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]]\nexport const length = (a: Vec3): number => Math.hypot(a[0], a[1], a[2])\nexport const distance = (a: Vec3, b: Vec3): number => Math.hypot(a[0] - b[0], a[1] - b[1], a[2] - b[2])\nexport const normalize = (a: Vec3, fallback: Vec3 = [0, 1, 0]): Vec3 => {\n const l = length(a)\n return l < 1e-9 ? [fallback[0], fallback[1], fallback[2]] : [a[0] / l, a[1] / l, a[2] / l]\n}\nexport const copy3 = (a: Vec3): Vec3 => [a[0], a[1], a[2]]\nexport const lerp3 = (a: Vec3, b: Vec3, t: number): Vec3 => [lerp(a[0], b[0], t), lerp(a[1], b[1], t), lerp(a[2], b[2], t)]\n\n/** Rotate `v` by the unit quaternion `q` (x, y, z, w). */\nexport const quatRotate = (q: Quat, v: Vec3): Vec3 => {\n const u: Vec3 = [q[0], q[1], q[2]]\n const c1 = cross(u, v)\n const c2 = cross(u, c1)\n return [v[0] + 2 * (q[3] * c1[0] + c2[0]), v[1] + 2 * (q[3] * c1[1] + c2[1]), v[2] + 2 * (q[3] * c1[2] + c2[2])]\n}\nexport const quatConjugate = (q: Quat): Quat => [-q[0], -q[1], -q[2], q[3]]\nexport const quatMultiply = (a: Quat, b: Quat): Quat => [\n a[3] * b[0] + a[0] * b[3] + a[1] * b[2] - a[2] * b[1],\n a[3] * b[1] - a[0] * b[2] + a[1] * b[3] + a[2] * b[0],\n a[3] * b[2] + a[0] * b[1] - a[1] * b[0] + a[2] * b[3],\n a[3] * b[3] - a[0] * b[0] - a[1] * b[1] - a[2] * b[2],\n]\nexport const quatNormalize = (q: Quat): Quat => {\n const l = Math.hypot(q[0], q[1], q[2], q[3])\n return l < 1e-9 ? [0, 0, 0, 1] : [q[0] / l, q[1] / l, q[2] / l, q[3] / l]\n}\n/** Quaternion from Euler angles in XYZ order (the same convention as three.js). */\nexport const quatFromEuler = (x: number, y: number, z: number): Quat => {\n const c1 = Math.cos(x / 2)\n const c2 = Math.cos(y / 2)\n const c3 = Math.cos(z / 2)\n const s1 = Math.sin(x / 2)\n const s2 = Math.sin(y / 2)\n const s3 = Math.sin(z / 2)\n return [s1 * c2 * c3 + c1 * s2 * s3, c1 * s2 * c3 - s1 * c2 * s3, c1 * c2 * s3 + s1 * s2 * c3, c1 * c2 * c3 - s1 * s2 * s3]\n}\n\n/** Small seeded generator (mulberry32). Its whole state is one integer, so it serialises trivially. */\nexport class Rng {\n state: number\n constructor(seed: number) {\n this.state = (Math.imul((seed | 0) ^ 0x9e3779b9, 0x85ebca6b) >>> 0) || 1\n }\n next(): number {\n this.state = (this.state + 0x6d2b79f5) >>> 0\n let t = this.state\n t = Math.imul(t ^ (t >>> 15), t | 1)\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61)\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n}\n","import type { StreamState, Vec3 } from './types'\nimport { dot, sub } from './math'\nimport type { Basis } from './stains'\n\nexport const GROUND_ID = 'ground'\n/** Longest flight simulated for a stream before it counts as landing nowhere. */\nexport const MAX_FLIGHT = 3\n\n/** Position of a ballistic jet `t` seconds after leaving its origin. */\nexport const ballistic = (origin: Vec3, velocity: Vec3, gravity: number, t: number): Vec3 => [\n origin[0] + velocity[0] * t,\n origin[1] + velocity[1] * t - 0.5 * gravity * t * t,\n origin[2] + velocity[2] * t,\n]\n\n/** Point of a stream's path `t` seconds after its origin (use with `StreamState.flightTime` and the world's `gravity`). */\nexport const sampleStream = (stream: Pick<StreamState, 'origin' | 'velocity'>, gravity: number, t: number): Vec3 =>\n ballistic(stream.origin, stream.velocity, gravity, t)\n\nexport interface LandingSurface extends Basis {\n id: string\n point: Vec3\n half: [number, number]\n}\n\nexport interface Hit {\n t: number\n point: Vec3\n normal: Vec3\n surface: string\n /** Velocity of the jet at impact. */\n velocity: Vec3\n}\n\nconst velocityAt = (velocity: Vec3, gravity: number, t: number): Vec3 => [velocity[0], velocity[1] - gravity * t, velocity[2]]\n\n/** First thing a jet hits: an authored surface (plane with half extents) or else the ground. */\nexport const trace = (\n surfaces: Iterable<LandingSurface>,\n groundAt: (x: number, z: number) => number,\n origin: Vec3,\n velocity: Vec3,\n gravity: number,\n): Hit | null => {\n let best: Hit | null = null\n for (const s of surfaces) {\n const n = s.normal\n const c = dot(n, sub(origin, s.point))\n if (c < -0.005) continue\n const a = -0.5 * gravity * n[1]\n const b = dot(n, velocity)\n let t = Infinity\n if (Math.abs(a) < 1e-9) {\n if (b < -1e-9) t = -c / b\n } else {\n const disc = b * b - 4 * a * c\n if (disc >= 0) {\n const sq = Math.sqrt(disc)\n for (const root of [(-b - sq) / (2 * a), (-b + sq) / (2 * a)]) {\n if (root >= -1e-6 && b + 2 * a * root < 0 && root < t) t = root\n }\n }\n }\n if (!Number.isFinite(t) || t > MAX_FLIGHT) continue\n t = Math.max(0, t)\n if (best && t >= best.t) continue\n const p = ballistic(origin, velocity, gravity, t)\n const rel = sub(p, s.point)\n if (Math.abs(dot(rel, s.t1)) > s.half[0] || Math.abs(dot(rel, s.t2)) > s.half[1]) continue\n best = { t, point: p, normal: n, surface: s.id, velocity: velocityAt(velocity, gravity, t) }\n }\n\n // Ground: march the path and refine the crossing.\n const step = 0.02\n let prevT = 0\n const startOver = origin[1] - groundAt(origin[0], origin[2])\n const limit = best ? best.t : MAX_FLIGHT\n if (startOver <= 0) {\n return best && best.t <= 0 ? best : { t: 0, point: [origin[0], groundAt(origin[0], origin[2]), origin[2]], normal: [0, 1, 0], surface: GROUND_ID, velocity }\n }\n for (let t = step; t <= limit + step; t += step) {\n const tt = Math.min(t, limit)\n const p = ballistic(origin, velocity, gravity, tt)\n const over = p[1] - groundAt(p[0], p[2])\n if (over <= 0) {\n let lo = prevT\n let hi = tt\n for (let i = 0; i < 18; i++) {\n const mid = (lo + hi) / 2\n const q = ballistic(origin, velocity, gravity, mid)\n if (q[1] - groundAt(q[0], q[2]) > 0) lo = mid\n else hi = mid\n }\n if (best && hi >= best.t - 1e-3) return best\n const q = ballistic(origin, velocity, gravity, hi)\n return { t: hi, point: [q[0], groundAt(q[0], q[2]), q[2]], normal: [0, 1, 0], surface: GROUND_ID, velocity: velocityAt(velocity, gravity, hi) }\n }\n prevT = tt\n if (tt >= limit) break\n }\n return best\n}\n","import type { FluidEvent, LiquidId } from './types'\n\n/** Locales shipped with the package. Unknown locales fall back to `en`. */\nexport type FluidLocale = 'en' | 'pt-BR'\n\nexport interface FluidStrings {\n /** Display name per liquid id (unknown ids fall back to the id itself). */\n liquids: Record<LiquidId, string>\n /** Short label per event type. */\n events: Record<FluidEvent['type'], string>\n on: string\n off: string\n}\n\nexport const locales: Record<FluidLocale, FluidStrings> = {\n en: {\n liquids: {\n water: 'water',\n coffee: 'coffee',\n tea: 'tea',\n milk: 'milk',\n soda: 'soda',\n juice: 'juice',\n beer: 'beer',\n wine: 'wine',\n spirits: 'spirits',\n fuel: 'gasoline',\n diesel: 'diesel',\n motor_oil: 'motor oil',\n cooking_oil: 'cooking oil',\n blood: 'blood',\n sap: 'sap',\n acid: 'acid',\n paint: 'paint',\n bleach: 'bleach',\n honey: 'honey',\n },\n events: {\n fill: 'filled',\n pour: 'poured',\n spill: 'spilled',\n leak: 'leaking',\n drink: 'drank',\n empty: 'emptied',\n stream_end: 'stream ended',\n splash: 'splash',\n stain: 'stain',\n dried: 'dried',\n steam: 'steam',\n mix: 'mixed',\n tap: 'tap',\n },\n on: 'on',\n off: 'off',\n },\n 'pt-BR': {\n liquids: {\n water: 'água',\n coffee: 'café',\n tea: 'chá',\n milk: 'leite',\n soda: 'refrigerante',\n juice: 'suco',\n beer: 'cerveja',\n wine: 'vinho',\n spirits: 'destilado',\n fuel: 'gasolina',\n diesel: 'diesel',\n motor_oil: 'óleo de motor',\n cooking_oil: 'óleo de cozinha',\n blood: 'sangue',\n sap: 'seiva',\n acid: 'ácido',\n paint: 'tinta',\n bleach: 'água sanitária',\n honey: 'mel',\n },\n events: {\n fill: 'encheu',\n pour: 'despejou',\n spill: 'derramou',\n leak: 'vazando',\n drink: 'bebeu',\n empty: 'esvaziou',\n stream_end: 'parou de escorrer',\n splash: 'respingo',\n stain: 'mancha',\n dried: 'secou',\n steam: 'vapor',\n mix: 'misturou',\n tap: 'torneira',\n },\n on: 'ligado',\n off: 'desligado',\n },\n}\n\nexport const resolveStrings = (locale: string | undefined): FluidStrings => locales[(locale as FluidLocale) ?? 'en'] ?? locales.en\n\nconst fmt = (n: number): string => `${(Math.round(n * 1000) / 1000).toString()} l`\nconst pt = (p: [number, number, number]): string => `(${p.map((v) => Math.round(v * 100) / 100).join(', ')})`\n\n/** One-line description of an event for logs and debug panels, e.g. `drank: coffee 0.03 l`. */\nexport const describeEvent = (strings: FluidStrings, event: FluidEvent): string => {\n const label = strings.events[event.type]\n const name = (id: LiquidId) => strings.liquids[id] ?? id\n switch (event.type) {\n case 'fill':\n return `${label}: ${event.container} ${name(event.liquid)} ${fmt(event.liters)}`\n case 'pour':\n case 'spill':\n return `${label}: ${event.container} ${name(event.liquid)} ${fmt(event.rate)}/s`\n case 'leak':\n return `${label}: ${event.container} ${name(event.liquid)} ${fmt(event.rate)}/s ${pt(event.point)}`\n case 'drink':\n return `${label}: ${event.container} ${name(event.liquid)} ${fmt(event.liters)}${event.effects.length ? ` [${event.effects.join(', ')}]` : ''}${event.burn ? ' !' : ''}`\n case 'empty':\n return `${label}: ${event.container}`\n case 'stream_end':\n return `${label}: ${event.stream}`\n case 'splash':\n return `${label}: ${name(event.liquid)} ${pt(event.point)}`\n case 'stain':\n return `${label}: ${event.stain} ${name(event.liquid)} ${event.surface} ${pt(event.point)}`\n case 'dried':\n return `${label}: ${event.stain}${event.mark ? ' (mark)' : ''}`\n case 'steam':\n return `${label}: ${event.container} ${event.on ? strings.on : strings.off}`\n case 'mix':\n return `${label}: ${event.container} ${name(event.from)} -> ${name(event.into)}`\n case 'tap':\n return `${label}: ${event.tap} ${event.on ? strings.on : strings.off}`\n }\n}\n","import type { ContainerSpec, Vec3 } from './types'\nimport { clamp, normalize } from './math'\n\nexport type Shape = ContainerSpec['shape']\n\n/** Sample columns of a container's inner volume: equal-weight (x, z) positions with the full height `h`. */\nexport interface Columns {\n x: Float64Array\n z: Float64Array\n h: number\n /** Radius (cylinder) or half extents (box) used for the extent of a plane. */\n kind: 'cylinder' | 'box'\n r: number\n hx: number\n hz: number\n}\n\nconst RINGS = 8\nconst SEGMENTS = 16\nconst GRID = 12\n\nexport const makeColumns = (shape: Shape): Columns => {\n if (shape.kind === 'cylinder') {\n const x = new Float64Array(RINGS * SEGMENTS)\n const z = new Float64Array(RINGS * SEGMENTS)\n let n = 0\n for (let k = 0; k < RINGS; k++) {\n const rr = shape.radius * Math.sqrt((k + 0.5) / RINGS)\n for (let m = 0; m < SEGMENTS; m++) {\n // Offset every other ring so the samples do not line up radially.\n const a = ((m + (k % 2) * 0.5) / SEGMENTS) * Math.PI * 2\n x[n] = Math.cos(a) * rr\n z[n] = Math.sin(a) * rr\n n++\n }\n }\n return { x, z, h: shape.height, kind: 'cylinder', r: shape.radius, hx: shape.radius, hz: shape.radius }\n }\n const [sx, sy, sz] = shape.size\n const x = new Float64Array(GRID * GRID)\n const z = new Float64Array(GRID * GRID)\n let n = 0\n for (let i = 0; i < GRID; i++) {\n for (let j = 0; j < GRID; j++) {\n x[n] = ((i + 0.5) / GRID - 0.5) * sx\n z[n] = ((j + 0.5) / GRID - 0.5) * sz\n n++\n }\n }\n return { x, z, h: sy, kind: 'box', r: Math.hypot(sx, sz) / 2, hx: sx / 2, hz: sz / 2 }\n}\n\n/** Range of `u · p` over the container: below `lo` it is empty, above `hi` it is full. */\nexport const planeRange = (c: Columns, u: Vec3): [number, number] => {\n const horizontal = c.kind === 'cylinder' ? c.r * Math.hypot(u[0], u[2]) : Math.abs(u[0]) * c.hx + Math.abs(u[2]) * c.hz\n const top = u[1] * c.h\n return [-horizontal + Math.min(0, top), horizontal + Math.max(0, top)]\n}\n\n/** Fraction (0..1) of the inner volume with `u · p <= d` (the liquid for a surface plane with normal `u` at offset `d`). */\nexport const planeFraction = (c: Columns, u: Vec3, d: number): number => {\n const uy = u[1]\n let total = 0\n const n = c.x.length\n for (let i = 0; i < n; i++) {\n const s0 = u[0] * c.x[i] + u[2] * c.z[i]\n let len: number\n if (uy > 1e-6) len = clamp((d - s0) / uy, 0, c.h)\n else if (uy < -1e-6) len = c.h - clamp((d - s0) / uy, 0, c.h)\n else len = s0 <= d ? c.h : 0\n total += len\n }\n return total / (n * c.h)\n}\n\n/** Plane offset `d` along unit normal `u` for which the liquid takes the volume fraction `f`. */\nexport const levelFor = (c: Columns, u: Vec3, f: number): number => {\n const [lo0, hi0] = planeRange(c, u)\n if (f <= 0) return lo0\n if (f >= 1) return hi0\n if (Math.abs(u[0]) + Math.abs(u[2]) < 1e-9) {\n return u[1] > 0 ? f * c.h * u[1] : u[1] * c.h - f * c.h * u[1]\n }\n let lo = lo0\n let hi = hi0\n for (let i = 0; i < 28; i++) {\n const mid = (lo + hi) / 2\n if (planeFraction(c, u, mid) < f) lo = mid\n else hi = mid\n }\n return (lo + hi) / 2\n}\n\n/** Radius of the lip circle (the opening); a closed spec (`opening` 0) uses half the container width once opened. */\nexport const lipRadius = (shape: Shape, opening: number): number => {\n const limit = shape.kind === 'cylinder' ? shape.radius : Math.min(shape.size[0], shape.size[2]) / 2\n return opening > 0 ? Math.min(opening, limit) : limit * 0.5\n}\n\nexport const shapeHeight = (shape: Shape): number => (shape.kind === 'cylinder' ? shape.height : shape.size[1])\n\nexport interface Lip {\n /** Lowest lip point along the surface normal, container space. */\n point: Vec3\n /** Centre of the lip circle, container space. */\n center: Vec3\n /** Outward direction (container space, horizontal in the container frame) the liquid leaves along, or null when upright. */\n outward: Vec3 | null\n /** `u · point`: the surface offset above which the liquid spills. */\n level: number\n}\n\nexport const lipOf = (shape: Shape, opening: number, u: Vec3): Lip => {\n const h = shapeHeight(shape)\n const ro = lipRadius(shape, opening)\n const center: Vec3 = [0, h, 0]\n const uh = Math.hypot(u[0], u[2])\n if (uh < 1e-6) return { point: center, center, outward: null, level: u[1] * h }\n const out: Vec3 = normalize([-u[0], 0, -u[2]])\n const point: Vec3 = [out[0] * ro, h, out[2] * ro]\n return { point, center, outward: out, level: u[0] * point[0] + u[1] * point[1] + u[2] * point[2] }\n}\n","import type { LiquidDef, StainState, Vec3 } from './types'\nimport { Rng, add, clamp, cross, dot, length, normalize, scale, sub } from './math'\n\n/** Number of radial samples of the flow front. */\nexport const SAMPLES = 16\n\nconst COS: number[] = []\nconst SIN: number[] = []\nfor (let i = 0; i < SAMPLES; i++) {\n COS.push(Math.cos((i / SAMPLES) * Math.PI * 2))\n SIN.push(Math.sin((i / SAMPLES) * Math.PI * 2))\n}\n\n/** Orthonormal frame of a surface: `normal`, `t1` (tangent) and `t2 = normal × t1`. */\nexport interface Basis {\n normal: Vec3\n t1: Vec3\n t2: Vec3\n}\n\nexport const makeBasis = (normalIn: Vec3, tangentIn?: Vec3): Basis => {\n const normal = normalize(normalIn)\n const ref: Vec3 = tangentIn && length(tangentIn) > 1e-6 ? tangentIn : Math.abs(normal[1]) > 0.9 ? [1, 0, 0] : [0, 1, 0]\n const t1 = normalize(sub(ref, scale(normal, dot(ref, normal))), [1, 0, 0])\n return { normal, t1, t2: cross(normal, t1) }\n}\n\n/** What a stain needs to know about the surface it lies on. */\nexport interface StainSurface extends Basis {\n point: Vec3\n half: [number, number]\n porosity: number\n}\n\nexport interface StainInt extends StainState {\n normal: Vec3\n tangent: Vec3\n noise: number[]\n /** Seconds since the last inflow. */\n sinceInflow: number\n /** Drying progress 0..1. */\n dry: number\n mark: boolean\n age: number\n}\n\n/** Direction (world space) of radial sample `i` on a surface frame. */\nexport const sampleDir = (b: Basis, i: number): Vec3 => [\n b.t1[0] * COS[i] + b.t2[0] * SIN[i],\n b.t1[1] * COS[i] + b.t2[1] * SIN[i],\n b.t1[2] * COS[i] + b.t2[2] * SIN[i],\n]\n\nexport const stainArea = (front: number[]): number => {\n let a = 0\n for (let i = 0; i < SAMPLES; i++) a += front[i] * front[(i + 1) % SAMPLES]\n return 0.5 * Math.sin((Math.PI * 2) / SAMPLES) * a\n}\n\nexport const meanRadius = (front: number[]): number => front.reduce((s, v) => s + v, 0) / front.length\n\n/** Thickness (m) a puddle of this liquid cannot get thinner than: 1 mm for water, thicker for viscous liquids. */\nexport const minFilm = (def: LiquidDef): number => 0.001 * (1 + 0.8 * Math.log10(Math.max(1, def.viscosity)))\n\n/** Per-direction growth multipliers: low harmonics plus smoothed seeded noise, so the outline is never a disc. */\nexport const makeNoise = (rng: Rng): number[] => {\n const amp = [0.12 + rng.next() * 0.18, 0.08 + rng.next() * 0.14, 0.05 + rng.next() * 0.08]\n const phase = [rng.next() * Math.PI * 2, rng.next() * Math.PI * 2, rng.next() * Math.PI * 2]\n const raw: number[] = []\n for (let i = 0; i < SAMPLES; i++) {\n const a = (i / SAMPLES) * Math.PI * 2\n let v = 1 + (rng.next() - 0.5) * 0.3\n for (let k = 0; k < 3; k++) v += amp[k] * Math.sin((k + 2) * a + phase[k])\n raw.push(v)\n }\n const out = raw.map((v, i) => 0.25 * raw[(i + SAMPLES - 1) % SAMPLES] + 0.5 * v + 0.25 * raw[(i + 1) % SAMPLES])\n return out.map((v) => clamp(v, 0.45, 1.7))\n}\n\n/** Horizontal run direction on a surface (downhill, unit, in the plane) and the slope strength 0..1 (sin of the angle). */\nexport const downhill = (normal: Vec3): { dir: Vec3; slope: number } => {\n const d = add([0, -1, 0], scale(normal, normal[1]))\n const slope = length(d)\n return slope < 1e-6 ? { dir: [0, 0, 0], slope: 0 } : { dir: scale(d, 1 / slope), slope }\n}\n\n/** Creates a stain at `center` (on the surface) with a small starting front. */\nexport const createStain = (\n id: string,\n surfaceId: string,\n def: LiquidDef,\n basis: Basis,\n center: Vec3,\n liters: number,\n rng: Rng,\n): StainInt => {\n const r0 = clamp(Math.sqrt(liters / 1000 / minFilm(def) / Math.PI) * 0.4, 0.012, 0.12)\n return {\n id,\n surface: surfaceId,\n liquid: def.id,\n center: [center[0], center[1], center[2]],\n front: new Array(SAMPLES).fill(r0),\n liters,\n soaked: 0,\n wetness: 1,\n wetRadius: 1,\n normal: basis.normal,\n tangent: basis.t1,\n noise: makeNoise(rng),\n sinceInflow: 0,\n dry: 0,\n mark: false,\n age: 0,\n }\n}\n\n/** Adds liquid to a stain (rewets a dried mark). `velocity` makes the front stretch the way the liquid came in. */\nexport const addInflow = (s: StainInt, liters: number, velocity: Vec3 | null): void => {\n s.liters += liters\n s.sinceInflow = 0\n if (s.dry > 0 || s.mark) {\n s.dry = 0\n s.mark = false\n s.wetness = 1\n s.wetRadius = 1\n }\n if (velocity) {\n const n = s.normal\n const tangential = sub(velocity, scale(n, dot(velocity, n)))\n if (length(tangential) > 0.2) s.flow = normalize(tangential)\n }\n}\n\n/** Moves the centre towards an inflow point without moving the outline. */\nexport const nudgeCenter = (s: StainInt, point: Vec3, weight: number, basis: Basis): void => {\n const delta = scale(sub(point, s.center), weight)\n if (length(delta) < 1e-6) return\n s.center = add(s.center, delta)\n for (let i = 0; i < SAMPLES; i++) s.front[i] = Math.max(0.008, s.front[i] - dot(delta, sampleDir(basis, i)))\n}\n\nexport type StainStatus = 'alive' | 'dried_mark' | 'dried_gone'\n\n/** Largest radius along each sample direction before the centre's surface rectangle ends. */\nconst edgeLimit = (s: StainInt, surface: StainSurface, i: number): number => {\n if (!Number.isFinite(surface.half[0]) && !Number.isFinite(surface.half[1])) return Infinity\n const rel = sub(s.center, surface.point)\n const cx = dot(rel, surface.t1)\n const cy = dot(rel, surface.t2)\n let limit = Infinity\n if (COS[i] > 1e-6) limit = Math.min(limit, (surface.half[0] - cx) / COS[i])\n else if (COS[i] < -1e-6) limit = Math.min(limit, (-surface.half[0] - cx) / COS[i])\n if (SIN[i] > 1e-6) limit = Math.min(limit, (surface.half[1] - cy) / SIN[i])\n else if (SIN[i] < -1e-6) limit = Math.min(limit, (-surface.half[1] - cy) / SIN[i])\n return Math.max(0.01, limit)\n}\n\n/**\n * Advances a stain: the front grows (faster downhill, with seeded noise, tapering as the area approaches what the liquid can cover at its\n * minimum film thickness), porous surfaces soak the pool, and once the inflow stopped the stain dries from the edge in.\n */\nexport const stepStain = (s: StainInt, def: LiquidDef, surface: StainSurface, ambientC: number, dt: number): StainStatus => {\n s.age += dt\n s.sinceInflow += dt\n const basis: Basis = surface\n const { dir: down, slope } = downhill(s.normal)\n\n // Soak into porous surfaces.\n if (s.liters > 0 && surface.porosity > 0) {\n const soak = Math.min(s.liters, surface.porosity * 0.2 * stainArea(s.front) * dt)\n s.liters -= soak\n s.soaked += soak\n }\n\n // Grow the flow front.\n if (s.liters > 1e-7 && s.wetness > 0) {\n const area = stainArea(s.front)\n const cover = s.liters / 1000 / (minFilm(def) * (1 - 0.7 * slope))\n if (area < cover) {\n const taper = clamp(1 - area / cover, 0, 1)\n const v0 = (0.02 + 0.2 * Math.sqrt(s.liters)) / Math.sqrt(Math.max(1, def.viscosity))\n const delta: number[] = []\n for (let i = 0; i < SAMPLES; i++) {\n let m = s.noise[i]\n if (s.flow) m *= 1 + 0.5 * Math.max(0, dot(sampleDir(basis, i), s.flow))\n if (slope > 0.02) {\n const a = dot(sampleDir(basis, i), down)\n m *= a > 0 ? 1 + 14 * slope * a : Math.max(0.1, 1 + 2.5 * slope * a)\n }\n delta.push(Math.max(0, Math.min(s.front[i] + v0 * m * taper * dt, edgeLimit(s, surface, i)) - s.front[i]))\n }\n // Never overshoot the area the liquid can cover: scale the growth (not the outline) down to fit.\n let lambda = 1\n const apply = (k: number) => s.front.map((r, i) => r + delta[i] * k)\n if (stainArea(apply(1)) > cover) {\n let lo = 0\n let hi = 1\n for (let i = 0; i < 14; i++) {\n const mid = (lo + hi) / 2\n if (stainArea(apply(mid)) > cover) hi = mid\n else lo = mid\n }\n lambda = lo\n }\n s.front = apply(lambda)\n }\n }\n\n // Dry from the edge in once the inflow stopped.\n if (s.sinceInflow > 1 && def.dryTime > 0 && s.dry < 1) {\n const warm = Math.pow(2, (ambientC - 20) / 12)\n const ds = (dt * warm * (1 + 0.5 * surface.porosity)) / def.dryTime\n const before = s.dry\n s.dry = Math.min(1, s.dry + ds)\n if (before < 1) s.liters *= 1 - (s.dry - before) / (1 - before)\n s.wetness = 1 - s.dry\n s.wetRadius = Math.sqrt(Math.max(0, 1 - s.dry))\n if (s.dry >= 1) {\n s.liters = 0\n s.wetness = 0\n s.wetRadius = 0\n if (def.leavesMark) {\n s.mark = true\n return 'dried_mark'\n }\n return 'dried_gone'\n }\n }\n return 'alive'\n}\n\n/** Unit direction (world space) of front sample `i` of a stain, from its `normal` and `tangent`. */\nexport const stainDirection = (s: Pick<StainState, 'normal' | 'tangent'>, i: number): Vec3 => sampleDir(makeBasis(s.normal ?? [0, 1, 0], s.tangent), i)\n","import { LIQUIDS } from './liquids'\nimport { GROUND_ID, MAX_FLIGHT, ballistic, trace } from './landing'\nimport type { Hit, LandingSurface } from './landing'\nimport { describeEvent, resolveStrings } from './locale'\nimport { GRAVITY, Rng, add, clamp, copy3, cross, distance, dot, length, normalize, quatConjugate, quatRotate, scale } from './math'\nimport { levelFor, lipOf, lipRadius, makeColumns, planeFraction, planeRange, shapeHeight } from './shapes'\nimport type { Columns } from './shapes'\nimport { addInflow, createStain, makeBasis, meanRadius, nudgeCenter, stepStain } from './stains'\nimport type { Basis, StainInt, StainSurface } from './stains'\nimport type {\n ContainerSpec,\n ContainerState,\n FluidEvent,\n FluidOptions,\n FluidWorld,\n LiquidDef,\n LiquidId,\n Quat,\n StainState,\n StreamCause,\n StreamState,\n SurfaceSpec,\n Vec3,\n} from './types'\n\ninterface Hole {\n point: Vec3\n normal: Vec3\n diameter: number\n}\n\ninterface ContainerInt {\n id: string\n spec: ContainerSpec\n cols: Columns\n liquid: LiquidId | null\n liters: number\n temperature: number\n closed: boolean\n position: Vec3\n rotation: Quat\n velocity: Vec3\n prevVelocity: Vec3\n hasPrev: boolean\n holes: Hole[]\n /** Slosh of the liquid surface: tilt offsets and their rates (x, z, vx, vz). */\n slosh: [number, number, number, number]\n /** Surface normal in world space (up plus slosh) and in container space, and the surface offset along it. */\n normal: Vec3\n u: Vec3\n d: number\n steaming: boolean\n outflow: number\n /** Stream key (`spill`, `pour`, `leak:<n>`) to stream id. */\n streams: Record<string, string>\n pourRate: number\n pourTTL: number\n pourVisual: boolean\n lastMix: number\n}\n\ninterface TapInt {\n id: string\n position: Vec3\n direction: Vec3\n liquid: LiquidId\n rate: number\n temperature: number\n on: boolean\n stream?: string\n}\n\ninterface StreamInt extends StreamState {\n key: string\n lastSplash: number\n visualOnly: boolean\n temperature: number\n}\n\ninterface SurfaceInt extends SurfaceSpec, StainSurface {}\n\ninterface Snapshot {\n version: 1\n time: number\n rng: number\n counters: { container: number; stream: number; stain: number; tap?: number }\n taps?: TapInt[]\n containers: Array<Omit<ContainerInt, 'cols'>>\n surfaces: SurfaceSpec[]\n streams: StreamInt[]\n stains: StainInt[]\n}\n\nconst GROUND_POROSITY = 0.2\nconst MAX_STEP = 0.1\nconst MAX_SUBSTEPS = 50\nconst MAX_HOLES = 32\n\nconst clone = <T>(v: T): T => JSON.parse(JSON.stringify(v)) as T\n\nexport function createFluids(options: FluidOptions = {}): FluidWorld {\n const strings = resolveStrings(options.locale)\n const liquids = new Map<LiquidId, LiquidDef>()\n for (const def of LIQUIDS) liquids.set(def.id, def)\n for (const def of options.liquids ?? []) liquids.set(def.id, def)\n const ambientC = options.ambientC ?? 20\n const gravity = options.gravity ?? GRAVITY\n const groundAt = options.groundAt ?? (() => 0)\n const mergeDistance = options.mergeDistance ?? 0.15\n const maxStains = options.maxStains ?? 64\n\n let rng = new Rng(options.seed ?? 1)\n let time = 0\n const counters = { container: 0, stream: 0, stain: 0, tap: 0 }\n let containers = new Map<string, ContainerInt>()\n let surfaces = new Map<string, SurfaceInt>()\n let streams = new Map<string, StreamInt>()\n let taps = new Map<string, TapInt>()\n let stains = new Map<string, StainInt>()\n const listeners = new Map<string, Set<(e: FluidEvent) => void>>()\n let queue: FluidEvent[] = []\n /** Only events produced by `update` are queued and returned by it; direct calls just notify the listeners. */\n let updating = false\n\n const groundSurface: StainSurface = {\n normal: [0, 1, 0],\n t1: [1, 0, 0],\n t2: [0, 0, -1],\n point: [0, 0, 0],\n half: [Infinity, Infinity],\n porosity: GROUND_POROSITY,\n }\n\n // ---- events ----\n\n const emit = (e: FluidEvent): void => {\n if (updating) queue.push(e)\n options.onEvent?.(e)\n listeners.get(e.type)?.forEach((fn) => fn(e))\n listeners.get('*')?.forEach((fn) => fn(e))\n }\n\n // ---- helpers ----\n\n const toWorld = (c: ContainerInt, p: Vec3): Vec3 => add(c.position, quatRotate(c.rotation, p))\n const defOf = (c: ContainerInt): LiquidDef | null => (c.liquid ? (liquids.get(c.liquid) ?? null) : null)\n const viscScale = (def: LiquidDef): number => 1 / Math.sqrt(Math.max(1, def.viscosity))\n\n const refreshLevel = (c: ContainerInt): void => {\n c.normal = normalize([c.slosh[0], 1, c.slosh[1]])\n c.u = normalize(quatRotate(quatConjugate(c.rotation), c.normal))\n c.d = levelFor(c.cols, c.u, c.spec.capacity > 0 ? c.liters / c.spec.capacity : 0)\n }\n\n const surfaceFor = (id: string): StainSurface => (id === GROUND_ID ? groundSurface : (surfaces.get(id) ?? groundSurface))\n\n const landingSurfaces = (): LandingSurface[] => {\n const list: LandingSurface[] = []\n for (const [id, s] of surfaces) list.push({ id, normal: s.normal, t1: s.t1, t2: s.t2, point: s.point, half: s.half })\n return list\n }\n\n const stopStream = (id: string): void => {\n const s = streams.get(id)\n if (!s) return\n streams.delete(id)\n const c = s.container ? containers.get(s.container) : undefined\n if (c) delete c.streams[s.key]\n const tap = s.tap ? taps.get(s.tap) : undefined\n if (tap && tap.stream === id) tap.stream = undefined\n emit({ type: 'stream_end', stream: id })\n }\n\n const endStreamKey = (c: ContainerInt, key: string): void => {\n const id = c.streams[key]\n if (id) stopStream(id)\n }\n\n /** Create or update the stream under `key` of a container; creating one emits the matching cause event. */\n const syncStream = (\n c: ContainerInt,\n key: string,\n cause: StreamCause,\n rate: number,\n origin: Vec3,\n velocity: Vec3,\n visualOnly = false,\n ): void => {\n if (rate < 1e-5 || !c.liquid) {\n endStreamKey(c, key)\n return\n }\n const existing = c.streams[key] ? streams.get(c.streams[key]) : undefined\n if (existing) {\n existing.rate = rate\n existing.origin = origin\n existing.velocity = velocity\n existing.thin = rate < 0.04\n existing.visualOnly = visualOnly\n existing.temperature = c.temperature\n return\n }\n const id = `stream_${++counters.stream}`\n const stream: StreamInt = {\n id,\n liquid: c.liquid,\n cause,\n container: c.id,\n origin,\n velocity,\n rate,\n landing: null,\n thin: rate < 0.04,\n flightTime: MAX_FLIGHT,\n key,\n lastSplash: -1,\n visualOnly,\n temperature: c.temperature,\n }\n streams.set(id, stream)\n c.streams[key] = id\n if (cause === 'leak') emit({ type: 'leak', container: c.id, liquid: c.liquid, rate, stream: id, point: copy3(origin) })\n else if (cause === 'spill') emit({ type: 'spill', container: c.id, liquid: c.liquid, rate, stream: id })\n else emit({ type: 'pour', container: c.id, liquid: c.liquid, rate, stream: id })\n }\n\n /** Speed (m/s) at which a tap's liquid leaves the nozzle. */\n const TAP_SPEED = 1.2\n\n /** Create or update the `tap` stream of a tap that is on; end it when it is off. */\n const syncTap = (t: TapInt): void => {\n if (!t.on || t.rate < 1e-5 || !liquids.has(t.liquid)) {\n if (t.stream) stopStream(t.stream)\n return\n }\n const velocity: Vec3 = [t.direction[0] * TAP_SPEED, t.direction[1] * TAP_SPEED, t.direction[2] * TAP_SPEED]\n const existing = t.stream ? streams.get(t.stream) : undefined\n if (existing) {\n existing.rate = t.rate\n existing.thin = t.rate < 0.04\n existing.temperature = t.temperature\n existing.velocity = velocity\n return\n }\n const id = `stream_${++counters.stream}`\n streams.set(id, {\n id,\n liquid: t.liquid,\n cause: 'tap',\n tap: t.id,\n origin: copy3(t.position),\n velocity,\n rate: t.rate,\n landing: null,\n thin: t.rate < 0.04,\n flightTime: MAX_FLIGHT,\n key: `tap:${t.id}`,\n lastSplash: -1,\n visualOnly: false,\n temperature: t.temperature,\n })\n t.stream = id\n }\n\n /** Where and how fast the liquid leaves over the lowest lip point. */\n const lipFlow = (c: ContainerInt, head: number): { origin: Vec3; velocity: Vec3 } => {\n const lip = lipOf(c.spec.shape, c.spec.opening, c.u)\n const origin = toWorld(c, lip.point)\n let dir: Vec3 = [1, 0, 0]\n const horizontal = (v: Vec3): Vec3 | null => (Math.hypot(v[0], v[2]) > 1e-3 ? normalize([v[0], 0, v[2]]) : null)\n if (lip.outward) dir = horizontal(quatRotate(c.rotation, lip.outward)) ?? horizontal(quatRotate(c.rotation, [1, 0, 0])) ?? dir\n else dir = horizontal(quatRotate(c.rotation, [1, 0, 0])) ?? dir\n const speed = clamp(0.3 + 0.5 * Math.sqrt(2 * gravity * Math.max(0, head)), 0.2, 2.5)\n return { origin, velocity: [dir[0] * speed, -0.1, dir[2] * speed] }\n }\n\n const removeLiters = (c: ContainerInt, amount: number): void => {\n c.liters = Math.max(0, c.liters - amount)\n }\n\n /** Clear a container that ran out and emit `empty` once. */\n const settle = (c: ContainerInt): void => {\n if (c.liquid && c.liters <= 1e-6) {\n c.liters = 0\n c.liquid = null\n emit({ type: 'empty', container: c.id })\n }\n }\n\n const fillInternal = (c: ContainerInt, liquid: LiquidId, liters: number, temperature: number | undefined, announce: boolean): number => {\n if (!(liters > 0) || !liquids.has(liquid)) return 0\n const room = c.spec.capacity - c.liters\n const accepted = Math.min(liters, Math.max(0, room))\n if (accepted <= 0) return 0\n const t = temperature ?? ambientC\n if (c.liquid && c.liquid !== liquid && c.liters > 1e-6) {\n const incomingWins = accepted > c.liters\n const into = incomingWins ? liquid : c.liquid\n const from = incomingWins ? c.liquid : liquid\n if (announce || time - c.lastMix > 0.5) {\n c.lastMix = time\n emit({ type: 'mix', container: c.id, from, into })\n }\n c.liquid = into\n } else if (!c.liquid || c.liters <= 1e-6) {\n c.liquid = liquid\n }\n c.temperature = c.liters > 1e-6 ? (c.temperature * c.liters + t * accepted) / (c.liters + accepted) : t\n c.liters += accepted\n if (announce) emit({ type: 'fill', container: c.id, liquid, liters: accepted })\n return accepted\n }\n\n // ---- stains ----\n\n const stainAt = (surfaceId: string, liquid: LiquidId, point: Vec3): StainInt | null => {\n let best: StainInt | null = null\n let bestD = Infinity\n for (const s of stains.values()) {\n if (s.surface !== surfaceId || s.liquid !== liquid) continue\n const d = distance(point, s.center)\n if (d < mergeDistance + 0.5 * meanRadius(s.front) && d < bestD) {\n best = s\n bestD = d\n }\n }\n return best\n }\n\n const evictStain = (): void => {\n let victim: StainInt | null = null\n for (const s of stains.values()) {\n const rank = (x: StainInt) => (x.wetness <= 0 ? 0 : 1) * 1e9 - x.age\n if (!victim || rank(s) < rank(victim)) victim = s\n }\n if (victim) stains.delete(victim.id)\n }\n\n const deposit = (liquid: LiquidId, hit: Pick<Hit, 'point' | 'surface' | 'normal'>, liters: number, velocity: Vec3 | null): void => {\n const def = liquids.get(liquid)\n if (!def || liters <= 0) return\n let s = stainAt(hit.surface, liquid, hit.point)\n if (s) {\n const basis: Basis = { normal: s.normal, t1: s.tangent, t2: cross(s.normal, s.tangent) }\n nudgeCenter(s, hit.point, clamp((liters / (s.liters + liters)) * 0.5, 0, 0.5), basis)\n addInflow(s, liters, velocity)\n return\n }\n while (stains.size >= maxStains) evictStain()\n const surface = surfaceFor(hit.surface)\n const basis: Basis = hit.surface === GROUND_ID ? makeBasis(hit.normal) : surface\n s = createStain(`stain_${++counters.stain}`, hit.surface, def, basis, hit.point, liters, rng)\n if (velocity) addInflow(s, 0, velocity)\n s.sinceInflow = 0\n stains.set(s.id, s)\n emit({ type: 'stain', stain: s.id, surface: hit.surface, liquid, point: copy3(hit.point) })\n }\n\n // ---- streams ----\n\n const lipCenterWorld = (c: ContainerInt): Vec3 => toWorld(c, [0, shapeHeight(c.spec.shape), 0])\n\n /** A container whose opening the jet passes through before it lands (pouring into a cup). */\n const catcher = (s: StreamInt, landingT: number): { container: ContainerInt; t: number; point: Vec3 } | null => {\n let best: { container: ContainerInt; t: number; point: Vec3 } | null = null\n for (const oc of containers.values()) {\n if (oc.id === s.container || oc.closed || oc.liters >= oc.spec.capacity) continue\n const lip = lipCenterWorld(oc)\n const disc = s.velocity[1] * s.velocity[1] - 2 * gravity * (lip[1] - s.origin[1])\n if (disc < 0) continue\n const t = (s.velocity[1] + Math.sqrt(disc)) / gravity\n if (t <= 0 || t >= landingT || (best && t >= best.t)) continue\n const p = ballistic(s.origin, s.velocity, gravity, t)\n if (Math.hypot(p[0] - lip[0], p[2] - lip[2]) <= lipRadius(oc.spec.shape, oc.spec.opening) + 0.01) best = { container: oc, t, point: p }\n }\n return best\n }\n\n const stepStream = (s: StreamInt, dt: number): void => {\n const hit = trace(landingSurfaces(), groundAt, s.origin, s.velocity, gravity)\n const caught = catcher(s, hit ? hit.t : MAX_FLIGHT)\n if (caught) {\n s.landing = caught.point\n s.flightTime = caught.t\n if (!s.visualOnly) fillInternal(caught.container, s.liquid, s.rate * dt, s.temperature, false)\n return\n }\n s.landing = hit ? copy3(hit.point) : null\n s.flightTime = hit ? hit.t : MAX_FLIGHT\n if (!hit || s.visualOnly) return\n const speed = length(hit.velocity)\n if (time - s.lastSplash >= 0.12) {\n s.lastSplash = time\n emit({ type: 'splash', liquid: s.liquid, point: copy3(hit.point), intensity: clamp(0.15 + s.rate * 1.2 + speed * 0.05, 0, 1) })\n }\n deposit(s.liquid, hit, s.rate * dt, hit.velocity)\n }\n\n // ---- containers ----\n\n const spillRate = (c: ContainerInt, def: LiquidDef, h: number): number => {\n const ro = lipRadius(c.spec.shape, c.spec.opening)\n const area = 2 * ro * Math.min(h, ro)\n return Math.max(0.6 * area * Math.sqrt(2 * gravity * h) * 1000 * viscScale(def), 0.004)\n }\n\n const steamThreshold = (def: LiquidDef): number => def.steamC ?? (def.drink && def.drink.thirst > 0 ? 60 : Infinity)\n\n const stepContainer = (c: ContainerInt, dt: number): void => {\n // Slosh: the surface tilts towards the horizontal acceleration and settles with a damped spring.\n if (c.hasPrev && dt > 0) {\n const ax = (c.velocity[0] - c.prevVelocity[0]) / dt\n const az = (c.velocity[2] - c.prevVelocity[2]) / dt\n const tx = clamp(ax / gravity, -0.35, 0.35)\n const tz = clamp(az / gravity, -0.35, 0.35)\n const w = 9\n const z = 0.12\n c.slosh[2] += (w * w * (tx - c.slosh[0]) - 2 * z * w * c.slosh[2]) * dt\n c.slosh[3] += (w * w * (tz - c.slosh[1]) - 2 * z * w * c.slosh[3]) * dt\n } else {\n c.slosh[2] *= 0.5\n c.slosh[3] *= 0.5\n }\n c.slosh[0] += c.slosh[2] * dt\n c.slosh[1] += c.slosh[3] * dt\n if (Math.abs(c.slosh[0]) + Math.abs(c.slosh[1]) + Math.abs(c.slosh[2]) + Math.abs(c.slosh[3]) < 1e-5) c.slosh = [0, 0, 0, 0]\n c.prevVelocity = copy3(c.velocity)\n c.hasPrev = true\n\n // Cooling towards ambient (insulated containers 10× slower).\n if (c.temperature !== ambientC) {\n const tau = (600 + 2400 * c.liters) * (c.spec.insulated ? 10 : 1)\n c.temperature = ambientC + (c.temperature - ambientC) * Math.exp(-dt / tau)\n if (Math.abs(c.temperature - ambientC) < 0.01) c.temperature = ambientC\n }\n\n refreshLevel(c)\n const def = defOf(c)\n\n const steaming = !!def && c.liters > 1e-6 && !c.closed && c.temperature > steamThreshold(def)\n if (steaming !== c.steaming) {\n c.steaming = steaming\n emit({ type: 'steam', container: c.id, on: steaming })\n }\n\n c.outflow = 0\n if (!def || c.liters <= 1e-6) {\n for (const key of Object.keys(c.streams)) endStreamKey(c, key)\n c.pourTTL = 0\n settle(c)\n return\n }\n\n // Pour (driven by `pour()`), else spill over the lip when the tilted surface rises above it.\n if (c.pourTTL > 0) {\n c.pourTTL -= dt\n if (c.pourTTL > 0) {\n const flow = lipFlow(c, 0.05)\n syncStream(c, 'pour', 'pour', c.pourRate, flow.origin, flow.velocity, c.pourVisual)\n c.outflow += c.pourRate\n } else endStreamKey(c, 'pour')\n endStreamKey(c, 'spill')\n } else {\n endStreamKey(c, 'pour')\n const lip = lipOf(c.spec.shape, c.spec.opening, c.u)\n const h = c.d - lip.level\n let handled = false\n if (!c.closed && h > 1e-5) {\n const excess = c.liters - c.spec.capacity * planeFraction(c.cols, c.u, lip.level)\n if (excess > 1e-6) {\n const rate = Math.min(spillRate(c, def, h), excess / Math.max(dt, 1e-6))\n removeLiters(c, Math.min(rate * dt, excess, c.liters))\n const flow = lipFlow(c, h)\n syncStream(c, 'spill', 'spill', rate, flow.origin, flow.velocity)\n c.outflow += rate\n handled = true\n }\n }\n if (!handled) endStreamKey(c, 'spill')\n }\n\n // Holes leak by Torricelli with the head above each hole.\n for (let i = 0; i < c.holes.length; i++) {\n const hole = c.holes[i]\n const key = `leak:${i}`\n const hh = dot(c.u, hole.point)\n const head = c.d - hh\n if (c.liters > 1e-6 && head > 1e-4) {\n const area = Math.PI * (hole.diameter / 2) ** 2\n const natural = 0.6 * area * Math.sqrt(2 * gravity * head) * 1000 * viscScale(def)\n const avail = c.liters - c.spec.capacity * planeFraction(c.cols, c.u, hh)\n if (avail > 1e-7) {\n const rate = Math.min(natural, avail / Math.max(dt, 1e-6))\n removeLiters(c, Math.min(rate * dt, avail))\n const nW = normalize(quatRotate(c.rotation, hole.normal))\n const v = Math.min(3, 0.6 * Math.sqrt(2 * gravity * head))\n syncStream(c, key, 'leak', rate, toWorld(c, hole.point), [nW[0] * v, nW[1] * v - 0.05, nW[2] * v])\n c.outflow += rate\n continue\n }\n }\n endStreamKey(c, key)\n }\n if (c.holes.length > 0 || c.outflow > 0) refreshLevel(c)\n settle(c)\n }\n\n const step = (dt: number): void => {\n time += dt\n for (const c of [...containers.values()]) stepContainer(c, dt)\n for (const s of [...streams.values()]) stepStream(s, dt)\n for (const st of [...stains.values()]) {\n const def = liquids.get(st.liquid)\n if (!def) continue\n const status = stepStain(st, def, surfaceFor(st.surface), ambientC, dt)\n if (status === 'dried_mark') emit({ type: 'dried', stain: st.id, mark: true })\n else if (status === 'dried_gone') {\n stains.delete(st.id)\n emit({ type: 'dried', stain: st.id, mark: false })\n }\n }\n }\n\n // ---- public state views ----\n\n const stateOf = (c: ContainerInt): ContainerState => ({\n id: c.id,\n liquid: c.liquid,\n liters: c.liters,\n capacity: c.spec.capacity,\n temperature: c.temperature,\n closed: c.closed,\n surfaceHeight: c.liters > 0 ? c.d : 0,\n surfacePoint: add(c.position, scale(c.normal, c.liters > 0 ? c.d : 0)),\n surfaceNormal: copy3(c.normal),\n holes: c.holes.map((h) => ({ point: copy3(h.point), normal: copy3(h.normal), diameter: h.diameter })),\n outflow: c.outflow,\n steaming: c.steaming,\n shape: c.spec.shape,\n lipRadius: lipRadius(c.spec.shape, c.spec.opening),\n position: copy3(c.position),\n rotation: [...c.rotation] as Quat,\n })\n\n const streamView = (s: StreamInt): StreamState => ({\n id: s.id,\n liquid: s.liquid,\n cause: s.cause,\n container: s.container,\n tap: s.tap,\n origin: copy3(s.origin),\n velocity: copy3(s.velocity),\n rate: s.rate,\n landing: s.landing ? copy3(s.landing) : null,\n thin: s.thin,\n flightTime: s.flightTime,\n })\n\n const stainView = (s: StainInt): StainState => ({\n id: s.id,\n surface: s.surface,\n liquid: s.liquid,\n center: copy3(s.center),\n front: [...s.front],\n liters: s.liters,\n soaked: s.soaked,\n wetness: s.wetness,\n wetRadius: s.wetRadius,\n normal: copy3(s.normal),\n tangent: copy3(s.tangent),\n flow: s.flow ? copy3(s.flow) : undefined,\n mark: s.mark,\n age: s.age,\n })\n\n // ---- world API ----\n\n const world: FluidWorld = {\n liquids,\n gravity,\n describe: (event) => describeEvent(strings, event),\n\n addContainer(spec, opts = {}) {\n const id = opts.id ?? `container_${++counters.container}`\n if (containers.has(id)) world.removeContainer(id)\n const liquid = spec.liquid && liquids.has(spec.liquid) ? spec.liquid : null\n const liters = liquid ? clamp(spec.liters ?? 0, 0, spec.capacity) : 0\n const c: ContainerInt = {\n id,\n spec: clone(spec),\n cols: makeColumns(spec.shape),\n liquid: liters > 0 ? liquid : null,\n liters,\n temperature: spec.temperature ?? ambientC,\n closed: spec.closed ?? spec.opening <= 0,\n position: copy3(opts.position ?? [0, 0, 0]),\n rotation: opts.rotation ? ([...opts.rotation] as Quat) : [0, 0, 0, 1],\n velocity: [0, 0, 0],\n prevVelocity: [0, 0, 0],\n hasPrev: false,\n holes: [],\n slosh: [0, 0, 0, 0],\n normal: [0, 1, 0],\n u: [0, 1, 0],\n d: 0,\n steaming: false,\n outflow: 0,\n streams: {},\n pourRate: 0,\n pourTTL: 0,\n pourVisual: false,\n lastMix: -10,\n }\n containers.set(id, c)\n refreshLevel(c)\n return id\n },\n\n addTap(spec) {\n const id = spec.id ?? `tap_${++counters.tap}`\n if (taps.has(id)) world.removeTap(id)\n const d = spec.direction ?? [0, -1, 0]\n const len = Math.hypot(d[0], d[1], d[2]) || 1\n const t: TapInt = {\n id,\n position: copy3(spec.position),\n direction: [d[0] / len, d[1] / len, d[2] / len],\n liquid: spec.liquid,\n rate: Math.max(0, spec.rate),\n temperature: spec.temperature ?? ambientC,\n on: false,\n }\n taps.set(id, t)\n if (spec.on ?? true) world.setTap(id, true)\n return id\n },\n\n setTap(id, on, rate) {\n const t = taps.get(id)\n if (!t) return\n if (rate !== undefined) t.rate = Math.max(0, rate)\n const changed = t.on !== on\n t.on = on\n syncTap(t)\n if (changed) emit({ type: 'tap', tap: id, on })\n },\n\n removeTap(id) {\n const t = taps.get(id)\n if (!t) return\n t.on = false\n syncTap(t)\n taps.delete(id)\n },\n\n taps: () => [...taps.values()].map((t) => ({ id: t.id, position: copy3(t.position), direction: copy3(t.direction), liquid: t.liquid, rate: t.rate, temperature: t.temperature, on: t.on, stream: t.stream })),\n\n removeContainer(id) {\n const c = containers.get(id)\n if (!c) return\n for (const key of Object.keys(c.streams)) endStreamKey(c, key)\n containers.delete(id)\n },\n\n setTransform(id, position, rotation, velocity) {\n const c = containers.get(id)\n if (!c) return\n c.position = copy3(position)\n c.rotation = [...rotation] as Quat\n if (velocity) c.velocity = copy3(velocity)\n refreshLevel(c)\n },\n\n open(id) {\n const c = containers.get(id)\n if (c) c.closed = false\n },\n\n close(id) {\n const c = containers.get(id)\n if (!c) return\n c.closed = true\n for (const key of ['pour', 'spill']) endStreamKey(c, key)\n c.pourTTL = 0\n },\n\n fill(id, liquid, liters, temperature) {\n const c = containers.get(id)\n if (!c || c.closed) return 0\n const accepted = fillInternal(c, liquid, liters, temperature, true)\n refreshLevel(c)\n return accepted\n },\n\n pour(id, dt, into) {\n const c = containers.get(id)\n const def = c ? defOf(c) : null\n if (!c || !def || c.closed || c.liters <= 1e-6 || !(dt > 0)) return 0\n refreshLevel(c)\n const lip = lipOf(c.spec.shape, c.spec.opening, c.u)\n const depth = Math.max(0, c.d - planeRange(c.cols, c.u)[0])\n const head = Math.max(c.d - lip.level, 0.02 + 0.5 * depth)\n const ro = lipRadius(c.spec.shape, c.spec.opening)\n const natural = 0.6 * Math.PI * ro * ro * Math.sqrt(2 * gravity * head) * 1000\n const rate = Math.min(natural, 0.15 + 12 * ro) * viscScale(def)\n const out = Math.min(rate * dt, c.liters)\n const target = into ? containers.get(into) : undefined\n let delivered = out\n if (target) {\n delivered = fillInternal(target, c.liquid as LiquidId, out, c.temperature, false)\n refreshLevel(target)\n const overflow = out - delivered\n if (overflow > 1e-6) {\n const flow = lipFlow(c, head)\n const hit = trace(landingSurfaces(), groundAt, flow.origin, flow.velocity, gravity)\n if (hit) deposit(c.liquid as LiquidId, hit, overflow, hit.velocity)\n }\n }\n removeLiters(c, out)\n c.pourRate = out / dt\n c.pourTTL = Math.max(0.12, dt * 1.5)\n c.pourVisual = !!target\n const flow = lipFlow(c, head)\n syncStream(c, 'pour', 'pour', c.pourRate, flow.origin, flow.velocity, c.pourVisual)\n refreshLevel(c)\n settle(c)\n return out\n },\n\n drink(id, liters) {\n const c = containers.get(id)\n const def = c ? defOf(c) : null\n if (!c || !def || c.closed || c.liters <= 1e-6 || !(liters > 0)) return null\n const amount = Math.min(liters, c.liters)\n removeLiters(c, amount)\n const event: Extract<FluidEvent, { type: 'drink' }> = {\n type: 'drink',\n container: c.id,\n liquid: def.id,\n liters: amount,\n temperature: c.temperature,\n thirst: (def.drink?.thirst ?? 0) * amount,\n effects: [...(def.drink?.effects ?? [])],\n burn: c.temperature > 65,\n }\n emit(event)\n refreshLevel(c)\n settle(c)\n return event\n },\n\n puncture(id, point, normal, diameter) {\n const c = containers.get(id)\n if (!c || !(diameter > 0) || c.holes.length >= MAX_HOLES) return\n c.holes.push({ point: copy3(point), normal: normalize(normal), diameter })\n },\n\n heat(id, deltaC) {\n const c = containers.get(id)\n if (c) c.temperature = clamp(c.temperature + deltaC, -50, 1000)\n },\n\n addSurface(spec) {\n const basis = makeBasis(spec.normal, spec.tangent)\n surfaces.set(spec.id, {\n ...clone(spec),\n ...basis,\n point: copy3(spec.point),\n half: [spec.halfSize[0], spec.halfSize[1]],\n })\n },\n\n removeSurface(id) {\n surfaces.delete(id)\n for (const s of [...stains.values()]) if (s.surface === id) stains.delete(s.id)\n },\n\n splash(liquid, point, liters, velocity) {\n if (!liquids.has(liquid) || !(liters > 0)) return\n const v: Vec3 = velocity ?? [0, -0.1, 0]\n const origin = add(point, [0, 0.02, 0])\n const hit = trace(landingSurfaces(), groundAt, origin, v, gravity)\n if (!hit) return\n emit({ type: 'splash', liquid, point: copy3(hit.point), intensity: clamp(0.3 + liters * 2, 0, 1) })\n deposit(liquid, hit, liters, length(v) > 0.3 ? hit.velocity : null)\n },\n\n clearStains(point, radius) {\n for (const s of [...stains.values()]) {\n if (distance(point, s.center) <= radius + 0.5 * meanRadius(s.front)) {\n stains.delete(s.id)\n emit({ type: 'dried', stain: s.id, mark: false })\n }\n }\n },\n\n update(dt) {\n if (dt > 0) {\n const n = clamp(Math.ceil(dt / MAX_STEP), 1, MAX_SUBSTEPS)\n updating = true\n try {\n for (let i = 0; i < n; i++) step(dt / n)\n } finally {\n updating = false\n }\n }\n const out = queue\n queue = []\n return out\n },\n\n container: (id) => {\n const c = containers.get(id)\n return c ? stateOf(c) : null\n },\n containers: () => [...containers.values()].map(stateOf),\n streams: () => [...streams.values()].map(streamView),\n stains: () => [...stains.values()].map(stainView),\n\n on(type, fn) {\n let set = listeners.get(type)\n if (!set) listeners.set(type, (set = new Set()))\n set.add(fn)\n return () => {\n set?.delete(fn)\n }\n },\n\n serialize() {\n const snapshot: Snapshot = {\n version: 1,\n time,\n rng: rng.state,\n counters: { ...counters },\n containers: [...containers.values()].map((c) => {\n const { cols: _cols, ...rest } = c\n return clone(rest)\n }),\n surfaces: [...surfaces.values()].map((s) => clone({ id: s.id, point: s.point, normal: s.normal, halfSize: s.half, tangent: s.t1, porosity: s.porosity })),\n streams: [...streams.values()].map((s) => clone(s)),\n taps: [...taps.values()].map((t) => clone(t)),\n stains: [...stains.values()].map((s) => clone(s)),\n }\n return snapshot\n },\n\n load(input) {\n const snap = clone(input) as Snapshot\n if (!snap || snap.version !== 1) throw new Error('game-fluids: unsupported snapshot')\n time = snap.time\n rng = new Rng(0)\n rng.state = snap.rng\n counters.container = snap.counters.container\n counters.stream = snap.counters.stream\n counters.stain = snap.counters.stain\n containers = new Map()\n for (const raw of snap.containers) containers.set(raw.id, { ...raw, cols: makeColumns(raw.spec.shape) })\n surfaces = new Map()\n for (const s of snap.surfaces) world.addSurface(s)\n counters.tap = snap.counters.tap ?? 0\n streams = new Map(snap.streams.map((s) => [s.id, s]))\n taps = new Map((snap.taps ?? []).map((t) => [t.id, t]))\n stains = new Map(snap.stains.map((s) => [s.id, s]))\n queue = []\n },\n }\n\n return world\n}\n","[\n {\n \"id\": \"sip\",\n \"duration\": 1.2,\n \"keys\": [\n {\n \"t\": 0,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.35,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.45,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n -0.9,\n 0,\n 0\n ],\n \"action\": \"drink\",\n \"rate\": 0.06\n },\n {\n \"t\": 0.95,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n -0.9,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 1.2,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n }\n ]\n },\n {\n \"id\": \"drink\",\n \"duration\": 2.5,\n \"keys\": [\n {\n \"t\": 0,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.5,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.8,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n -1.22,\n 0,\n 0\n ],\n \"action\": \"drink\",\n \"rate\": 0.1667\n },\n {\n \"t\": 2.0,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n -1.22,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 2.5,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n }\n ]\n },\n {\n \"id\": \"chug\",\n \"duration\": 4,\n \"keys\": [\n {\n \"t\": 0,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.5,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.9,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n -1.45,\n 0,\n 0\n ],\n \"action\": \"drink\",\n \"rate\": 0.2\n },\n {\n \"t\": 3.4,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n -1.45,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 4,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n }\n ]\n },\n {\n \"id\": \"pour\",\n \"duration\": 3,\n \"keys\": [\n {\n \"t\": 0,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.4,\n \"position\": [\n 0.1,\n 0.0,\n -0.35\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.8,\n \"position\": [\n 0.1,\n 0.0,\n -0.35\n ],\n \"rotation\": [\n -1.745,\n 0,\n 0\n ],\n \"action\": \"pour\",\n \"rate\": 1\n },\n {\n \"t\": 2.4,\n \"position\": [\n 0.1,\n 0.0,\n -0.35\n ],\n \"rotation\": [\n -1.745,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 3,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n }\n ]\n },\n {\n \"id\": \"pour_out\",\n \"duration\": 4,\n \"keys\": [\n {\n \"t\": 0,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.5,\n \"position\": [\n 0.1,\n 0.1,\n -0.35\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 1.0,\n \"position\": [\n 0.1,\n 0.1,\n -0.35\n ],\n \"rotation\": [\n -2.2,\n 0,\n 0\n ],\n \"action\": \"pour\",\n \"rate\": 40\n },\n {\n \"t\": 3.2,\n \"position\": [\n 0.1,\n 0.1,\n -0.35\n ],\n \"rotation\": [\n -2.2,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 4,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n }\n ]\n },\n {\n \"id\": \"open\",\n \"duration\": 1,\n \"keys\": [\n {\n \"t\": 0,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.25,\n \"position\": [\n 0.1,\n 0,\n -0.3\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"open\"\n },\n {\n \"t\": 0.7,\n \"position\": [\n 0.1,\n 0,\n -0.3\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 1,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n }\n ]\n },\n {\n \"id\": \"close\",\n \"duration\": 1,\n \"keys\": [\n {\n \"t\": 0,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.25,\n \"position\": [\n 0.1,\n 0,\n -0.3\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"close\"\n },\n {\n \"t\": 0.7,\n \"position\": [\n 0.1,\n 0,\n -0.3\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 1,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n }\n ]\n }\n]","import itemUsesData from './data/item-uses.json'\nimport { lerp3, quatFromEuler, quatMultiply, quatRotate, add } from './math'\nimport type { FluidEvent, FluidWorld, ItemUseDef, ItemUsePlayer, Quat, Vec3 } from './types'\n\n/** Built-in scripted uses of a held item (data in `data/item-uses.json`): `sip`, `drink`, `chug`, `pour`, `pour_out`, `open`, `close`. */\nexport const ITEM_USES: ItemUseDef[] = itemUsesData as unknown as ItemUseDef[]\n\n/** World transform of the hand (or any holder) the item pose is relative to. */\nexport type HandTransform = () => { position: Vec3; rotation: Quat }\n\nconst DEFAULT_DRINK_RATE = 0.1\n\n/**\n * Plays an item use on a container: interpolates the keys, applies `drink` (rate × dt litres) and `pour` (`world.pour`, `rate` multiplies the\n * time) while the current key has that action, and fires `open` / `close` once when their key is reached. When `getHandTransform` is given, the\n * container's world transform follows hand ∘ pose every update; otherwise the host animates the viewmodel from `pose()`.\n */\nexport function createItemUse(world: FluidWorld, containerId: string, def: ItemUseDef, getHandTransform?: HandTransform): ItemUsePlayer {\n const keys = [...def.keys].sort((a, b) => a.t - b.t)\n let time = 0\n let done = keys.length === 0 || def.duration <= 0\n let checked = false\n let lastPos: Vec3 | null = null\n const fired = new Set<number>()\n\n const pose = (): { position: Vec3; rotation: Vec3 } => {\n if (keys.length === 0) return { position: [0, 0, 0], rotation: [0, 0, 0] }\n if (time <= keys[0].t) return { position: [...keys[0].position], rotation: [...keys[0].rotation] }\n for (let i = 0; i < keys.length - 1; i++) {\n const a = keys[i]\n const b = keys[i + 1]\n if (time <= b.t) {\n const k = b.t > a.t ? (time - a.t) / (b.t - a.t) : 1\n return { position: lerp3(a.position, b.position, k), rotation: lerp3(a.rotation, b.rotation, k) }\n }\n }\n const last = keys[keys.length - 1]\n return { position: [...last.position], rotation: [...last.rotation] }\n }\n\n const follow = (dt: number): void => {\n if (!getHandTransform) return\n const hand = getHandTransform()\n const p = pose()\n const position = add(hand.position, quatRotate(hand.rotation, p.position))\n const rotation = quatMultiply(hand.rotation, quatFromEuler(p.rotation[0], p.rotation[1], p.rotation[2]))\n const velocity: Vec3 | undefined =\n lastPos && dt > 0 ? [(position[0] - lastPos[0]) / dt, (position[1] - lastPos[1]) / dt, (position[2] - lastPos[2]) / dt] : undefined\n lastPos = position\n world.setTransform(containerId, position, rotation, velocity)\n }\n\n const player: ItemUsePlayer = {\n def,\n get time() {\n return time\n },\n get done() {\n return done\n },\n pose,\n update(dt) {\n if (done) return []\n const events: FluidEvent[] = []\n const off = world.on('*', (e) => events.push(e))\n try {\n if (!checked) {\n checked = true\n const state = world.container(containerId)\n if (!state || (def.liquids && def.liquids.length > 0 && (!state.liquid || !def.liquids.includes(state.liquid)))) {\n done = true\n return events\n }\n }\n const start = time\n const end = Math.min(def.duration, time + Math.max(0, dt))\n for (let i = 0; i < keys.length && !done; i++) {\n const key = keys[i]\n const spanStart = key.t\n const spanEnd = i + 1 < keys.length ? keys[i + 1].t : def.duration\n if ((key.action === 'open' || key.action === 'close') && !fired.has(i) && end >= spanStart) {\n fired.add(i)\n if (key.action === 'open') world.open(containerId)\n else world.close(containerId)\n }\n const overlap = Math.min(end, spanEnd) - Math.max(start, spanStart)\n if (overlap <= 0) continue\n if (key.action === 'drink') {\n const ev = world.drink(containerId, (key.rate ?? DEFAULT_DRINK_RATE) * overlap)\n const left = world.container(containerId)\n if (!ev || !left || left.liters <= 1e-6) {\n time = def.duration\n done = true\n }\n } else if (key.action === 'pour') {\n world.pour(containerId, overlap * (key.rate ?? 1))\n }\n }\n if (!done) {\n time = end\n done = time >= def.duration\n }\n follow(dt)\n } finally {\n off()\n }\n return events\n },\n cancel() {\n done = true\n },\n }\n return player\n}\n"],"mappings":"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","names":["q","x","z","n","basis","flow"]}