{"version":3,"sources":["../src/asc/prelude.ts","../src/asc/generic.ts","../src/asc/ops.ts"],"names":["tx","ty","tz"],"mappings":"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","file":"chunk-ZMUDWCLQ.cjs","sourcesContent":["export function asPrelude(): string {\n  return `/* @generated */\n// Simple bump allocator using wasm memory\nlet __heap: usize = (memory.size() as usize) << 16; // pages -> bytes\nexport function alloc(bytes: i32): usize {\n  let ptr = __heap;\n  let need = ptr + <usize>bytes;\n  let pagesNeeded = <i32>((need + 0xFFFF) >>> 16);\n  let have = memory.size();\n  if (pagesNeeded > have) memory.grow(pagesNeeded - have);\n  __heap = need;\n  return ptr;\n}\n`;\n}\n","import { asPrelude } from './prelude';\n\nexport function genericASModuleSource(): string {\n  return `${asPrelude()}/* @generated generic kernels */\n\n// ---- mat4 helpers ----\n\n// write translation from SoA into a mat4 column 3 (offset offT = off + 12)\nexport function mat4_setTranslation_SoA(\n  base: usize, count: i32, strideF: i32, offTF: i32,\n  tx: usize, ty: usize, tz: usize\n): void {\n  for (let i = 0; i < count; i++) {\n    const li = <usize>((i * strideF + offTF) << 2);\n    const ii = <usize>(i << 2);\n    store<f32>(base + li + 0, load<f32>(tx + ii));\n    store<f32>(base + li + 4, load<f32>(ty + ii));\n    store<f32>(base + li + 8, load<f32>(tz + ii));\n  }\n}\n\n// multiply the 3×3 part by per-instance scale s[i]\nexport function mat4_uniformScale_FromArray(\n  base: usize, count: i32, strideF: i32, offF: i32, sPtr: usize\n): void {\n  for (let i = 0; i < count; i++) {\n    const m = base + <usize>(((i * strideF + offF) << 2));\n    const s = load<f32>(sPtr + <usize>(i << 2));\n    // row0 (col 0..2)\n    store<f32>(m +  0, load<f32>(m +  0) * s);\n    store<f32>(m +  4, load<f32>(m +  4) * s);\n    store<f32>(m +  8, load<f32>(m +  8) * s);\n    // row1\n    store<f32>(m + 16, load<f32>(m + 16) * s);\n    store<f32>(m + 20, load<f32>(m + 20) * s);\n    store<f32>(m + 24, load<f32>(m + 24) * s);\n    // row2\n    store<f32>(m + 32, load<f32>(m + 32) * s);\n    store<f32>(m + 36, load<f32>(m + 36) * s);\n    store<f32>(m + 40, load<f32>(m + 40) * s);\n  }\n}\n\n// absolute scale: write baseR (seeded 3×3) * s[i] into the 3×3\n// baseR points to N*12 f32 (three padded rows)\nexport function mat4_uniformScaleAbs_FromArray(\n  base: usize, count: i32, strideF: i32, offF: i32, sPtr: usize, baseR: usize\n): void {\n  for (let i = 0; i < count; i++) {\n    const m = base + <usize>(((i * strideF + offF) << 2));\n    const bi = baseR + <usize>((i * 12) << 2);\n    const s = load<f32>(sPtr + <usize>(i << 2));\n    // row0\n    store<f32>(m +  0, load<f32>(bi +  0) * s);\n    store<f32>(m +  4, load<f32>(bi +  4) * s);\n    store<f32>(m +  8, load<f32>(bi +  8) * s);\n    // row1\n    store<f32>(m + 16, load<f32>(bi + 16) * s);\n    store<f32>(m + 20, load<f32>(bi + 20) * s);\n    store<f32>(m + 24, load<f32>(bi + 24) * s);\n    // row2\n    store<f32>(m + 32, load<f32>(bi + 32) * s);\n    store<f32>(m + 36, load<f32>(bi + 36) * s);\n    store<f32>(m + 40, load<f32>(bi + 40) * s);\n  }\n}\n\n// ---- vec4 helpers ----\n\nexport function vec4_setRGBA_SoA(\n  base: usize, count: i32, strideF: i32, offF: i32,\n  rp: usize, gp: usize, bp: usize, ap: usize\n): void {\n  for (let i = 0; i < count; i++) {\n    const c = base + <usize>(((i * strideF + offF) << 2));\n    const ii = <usize>(i << 2);\n    store<f32>(c +  0, load<f32>(rp + ii));\n    store<f32>(c +  4, load<f32>(gp + ii));\n    store<f32>(c +  8, load<f32>(bp + ii));\n    store<f32>(c + 12, load<f32>(ap + ii));\n  }\n}\n\nexport function vec4_mulRGBA(\n  base: usize, count: i32, strideF: i32, offF: i32,\n  r: f32, g: f32, b: f32, a: f32\n): void {\n  for (let i = 0; i < count; i++) {\n    const c = base + <usize>(((i * strideF + offF) << 2));\n    store<f32>(c +  0, load<f32>(c +  0) * r);\n    store<f32>(c +  4, load<f32>(c +  4) * g);\n    store<f32>(c +  8, load<f32>(c +  8) * b);\n    store<f32>(c + 12, load<f32>(c + 12) * a);\n  }\n}\n\nexport function vec4_setXYZ_SoA(\n  base: usize, count: i32, strideF: i32, offF: i32,\n  tx: usize, ty: usize, tz: usize, setWToOne: i32\n): void {\n  for (let i = 0; i < count; i++) {\n    const v = base + <usize>(((i * strideF + offF) << 2));\n    const ii = <usize>(i << 2);\n    store<f32>(v +  0, load<f32>(tx + ii));\n    store<f32>(v +  4, load<f32>(ty + ii));\n    store<f32>(v +  8, load<f32>(tz + ii));\n    if (setWToOne) store<f32>(v + 12, 1.0);\n  }\n}\n\n// Write scalar field from array\nexport function f32_set_FromArray(\n  base: usize, count: i32, strideF: i32, offF: i32, src: usize\n): void {\n  for (let i = 0; i < count; i++) {\n    const dst = base + <usize>(((i * strideF + offF) << 2));\n    const s   = load<f32>(src + <usize>(i << 2));\n    store<f32>(dst, s);\n  }\n}\n\nexport let gTime: f32 = 0.0;\nexport function resetTime(): void { gTime = 0.0; }\n\n// ---- fast trig (range-reduced) ---------------------------------------------\nconst PI  : f32 = 3.141592653589793;\nconst TAU : f32 = 6.283185307179586;\nconst HPI : f32 = 1.5707963267948966;\nconst INV_TAU: f32 = 1.0 / TAU;\n\n// Range-reduce to [-PI, PI] using cheap integer wrap\n@inline function wrapPI(x: f32): f32 {\n  let k = <i32>(x * INV_TAU);   // truncate toward 0\n  x -= f32(k) * TAU;\n  if (x >  PI)  x -= TAU;\n  if (x < -PI)  x += TAU;\n  return x;\n}\n\n// Fast sine (parabolic + correction), max err ~1e-3 on [-PI, PI]\n@inline function sinFast(x: f32): f32 {\n  x = wrapPI(x);\n  const B: f32 = 1.2732395447351628;   // 4/PI\n  const C: f32 = 0.4052847345693511;   // 4/PI^2\n  const P: f32 = 0.225;\n  let y = x * (B - C * Mathf.abs(x));\n  return y + P * (y * Mathf.abs(y) - y);\n}\n\n@inline function cosFast(x: f32): f32 {\n  return sinFast(x + HPI);\n}\n\nexport function orbitDelta(\n  base: usize, count: i32, strideF: i32,\n  offTransF: i32, offColorF: i32,\n  deltaTime: f32, phaseStep: f32,\n  radMin: f32, radRange: f32, wobbleAmp: f32\n): void {\n  if (deltaTime == 0.0) return;\n\n  let t0: f32 = gTime;\n  let t1: f32 = t0 + deltaTime;\n  let tm: f32 = t0 + 0.5 * deltaTime;\n\n  // global (per-frame) factorPools for delta identities\n  // cos(B)-cos(A) = -2 sin((A+B)/2) * sin((B-A)/2)\n  // sin(B)-sin(A) =  2 cos((A+B)/2) * sin((B-A)/2)\n  const s_quarterX: f32 = sinFast(0.25 * deltaTime);  // for 0.5*t terms\n  const s_halfY   : f32 = sinFast(0.45 * deltaTime);  // for 0.9*t terms\n\n  // hue sweep constants (120° shifts)\n  const COS120: f32 = -0.5;\n  const SIN120: f32 =  0.8660254037844386;\n  const COLOR_SPEED: f32 = 0.15;\n  const PHASE_COLOR: f32 = 0.10;\n\n  for (let i = 0; i < count; i++) {\n    const ph  = f32(i) * phaseStep;\n    const rad = radMin + radRange * (f32(i) * 0.61803 % 1.0);\n\n    // --- X/Z move (freq 0.5): mid angle once\n    const midXZ: f32 = 0.5 * tm + ph;\n    const sMid: f32  = sinFast(midXZ);\n    const cMid: f32  = cosFast(midXZ);\n\n    const dx: f32 = rad * (-2.0 * sMid * s_quarterX); // cos delta\n    const dz: f32 = rad * ( 2.0 * cMid * s_quarterX); // sin delta\n\n    // --- Y move (freq 0.9, phase 2*ph): mid angle once\n    const midY: f32 = 0.9 * tm + 2.0 * ph;\n    const dy: f32   = 0.8 * (2.0 * cosFast(midY) * s_halfY);\n\n    // apply translation delta\n    const tv: usize = base + <usize>(((i * strideF + offTransF) << 2));\n    store<f32>(tv +  0, load<f32>(tv +  0) + dx);\n    store<f32>(tv +  4, load<f32>(tv +  4) + dy);\n    store<f32>(tv +  8, load<f32>(tv +  8) + dz);\n\n    // --- color: compute cos/sin once at hue, derive 120° and 240°\n    const hue = t1 * COLOR_SPEED + ph * PHASE_COLOR;\n    const a   = TAU * hue;\n    const c0  = cosFast(a);\n    const s0  = sinFast(a);\n\n    // cos(a+120) = c0*COS120 - s0*SIN120\n    // cos(a+240) = c0*COS120 + s0*SIN120\n    const r: f32 = 0.5 + 0.5 * c0;\n    const g: f32 = 0.5 + 0.5 * (c0 * COS120 - s0 * SIN120);\n    const b: f32 = 0.5 + 0.5 * (c0 * COS120 + s0 * SIN120);\n\n    // brightness pulse in alpha\n    const pulse: f32 = 0.65 + 0.35 * sinFast(t1 * 0.7 + ph * 0.5);\n\n    const cv: usize = base + <usize>(((i * strideF + offColorF) << 2));\n    store<f32>(cv +  0, r);\n    store<f32>(cv +  4, g);\n    store<f32>(cv +  8, b);\n    store<f32>(cv + 12, pulse);\n  }\n\n  gTime = t1;\n}\n`;\n}\n","export function buildOpsForParent(parentSchema: any, exports: any) {\n  const ops: any = {};\n  for (const [arrField, meta] of Object.entries(parentSchema.structArrays)) {\n    const child = (meta as any).schema;\n    const stride = child.headerFloatCount | 0;\n    const entry: any = { vec4: {} };\n    for (const cf of child.fields) {\n      if (cf?.type?.arrayOf) continue;\n      const tOff = child.fields.find((f: any) => f.name === 'translation')?.headerFloatOffset | 0;\n      const cOff = child.fields.find((f: any) => f.name === 'color')?.headerFloatOffset | 0;\n\n      // Orbit delta\n      entry.orbitDelta = (\n        base: number,\n        count: number,\n        deltaTime: number,\n        phaseStep: number,\n        radMin: number,\n        radRange: number,\n        wobbleAmp: number\n      ) =>\n        exports.orbitDelta(\n          base,\n          count | 0,\n          stride | 0,\n          tOff | 0,\n          cOff | 0,\n          deltaTime,\n          phaseStep,\n          radMin,\n          radRange,\n          wobbleAmp\n        );\n      // mat4 family\n      if (cf.type === 'mat4') {\n        const off = cf.headerFloatOffset | 0;\n        const offT = off + 12; // translation slot in our packed mat4\n\n        entry.mat4[cf.name] = {\n          setTransSoA: (base: number, count: number, tx: number, ty: number, tz: number) =>\n            exports.mat4_setTranslation_SoA(base, count | 0, stride | 0, offT | 0, tx, ty, tz),\n\n          uniformScale: (base: number, count: number, sPtr: number) =>\n            exports.mat4_uniformScale_FromArray(base, count | 0, stride | 0, off | 0, sPtr),\n\n          uniformScaleAbs: (base: number, count: number, sPtr: number, baseR: number) =>\n            exports.mat4_uniformScaleAbs_FromArray(\n              base,\n              count | 0,\n              stride | 0,\n              off | 0,\n              sPtr,\n              baseR\n            ),\n        };\n\n        // convenient “first mat4” shorthands for legacy callsites\n        if (!entry.setTransSoA) {\n          entry.setTransSoA = entry.mat4[cf.name].setTransSoA;\n          entry.uniformScale = entry.mat4[cf.name].uniformScale;\n          entry.uniformScaleA = entry.mat4[cf.name].uniformScaleAbs;\n        }\n      }\n\n      // vec4 family\n      if (cf.type === 'vec4') {\n        const off = cf.headerFloatOffset | 0;\n\n        entry.vec4[cf.name] = {\n          setColorSoA: (\n            base: number,\n            count: number,\n            rp: number,\n            gp: number,\n            bp: number,\n            ap: number\n          ) => exports.vec4_setRGBA_SoA(base, count | 0, stride | 0, off | 0, rp, gp, bp, ap),\n\n          mulColor: (base: number, count: number, r: number, g: number, b: number, a: number) =>\n            exports.vec4_mulRGBA(base, count | 0, stride | 0, off | 0, r, g, b, a),\n        };\n\n        entry.setColorSoA ??= entry.vec4[cf.name].setColorSoA;\n      }\n    }\n\n    // Optional cull wrappers if kernels present\n    const tx = child.fields.find((f: any) => f.name === 'translation')?.headerFloatOffset ?? 0;\n    const ty = tx + 1,\n      tz = tx + 2;\n    const scale = child.fields.find((f: any) => f.name === 'scale')?.headerFloatOffset ?? -1;\n    const vis = child.fields.find((f: any) => f.name === 'visibleSlot')?.headerFloatOffset ?? -1;\n\n    if (exports.frustumCullCompactAoS && scale >= 0 && vis >= 0) {\n      entry.cull = entry.cull ?? {};\n      entry.cull.frustumCompact = (\n        base: number,\n        count: number,\n        planesPtr: number,\n        outDrawIds: number,\n        outVisibleCountPtr: number,\n        baseRadius: number\n      ) =>\n        exports.frustumCullCompactAoS(\n          base,\n          count | 0,\n          stride | 0,\n          tx | 0,\n          ty | 0,\n          tz | 0,\n          scale | 0,\n          vis | 0,\n          planesPtr,\n          outDrawIds,\n          outVisibleCountPtr,\n          baseRadius\n        );\n    }\n\n    ops[arrField] = entry;\n\n    ops[arrField] = entry;\n  }\n  return ops;\n}\n"]}