@godot-scene-web/canvas-effects 0.1.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/LICENSE +21 -0
- package/dist/webgl.d.mts +409 -0
- package/dist/webgl.d.mts.map +1 -0
- package/dist/webgl.mjs +2298 -0
- package/dist/webgl.mjs.map +1 -0
- package/dist/webgpu.d.mts +335 -0
- package/dist/webgpu.d.mts.map +1 -0
- package/dist/webgpu.mjs +1349 -0
- package/dist/webgpu.mjs.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webgl.mjs","names":["compileProgram","compileProgram"],"sources":["../src/particle-webgl.ts","../src/shader-webgl.ts","../src/webgl.ts"],"sourcesContent":["// Instanced WebGL renderer for one particle system: a single\n// `gl.drawArraysInstanced` of a unit quad with per-instance center/scale/rotation/\n// color/frame from the `InstanceBuffer`. Per-particle continuous color/alpha tint\n// (color_ramp over life) is a one-line `texture() * v_color` here — the reason WebGL\n// beats Canvas2D for this. Runs on the SHARED GL context (`../webgl/shared-gl`) so all\n// systems + shaders share one context; the runtime blits the result to each node's\n// 2D canvas (same pattern as the shader runtime).\n//\n// PREMULTIPLIED OUTPUT IS THE CONTRACT, not a choice. The shared canvas declares\n// `premultipliedAlpha: true`, so every fragment here writes `(rgb·a, a)`: the MIX fragment\n// multiplies before it returns and blends `ONE / ONE_MINUS_SRC_ALPHA`, and the additive resolve\n// presents the accumulated total as `(light, cov)`. Both halves of each pairing are load-bearing\n// and neither errors on its own — a premultiplied fragment under a src-alpha blend\n// double-multiplies, a straight one under this blend halos — which is why the fragment text and\n// `blendFactorsFor` are asserted TOGETHER in `particles-render.test.ts`. It is the same contract\n// `./render-webgpu.ts` states in WGSL, deliberately expression for expression.\n\n/** A borrowed GL context and quad. Core never creates or owns either resource. */\nexport interface ParticleGl {\n gl: WebGL2RenderingContext;\n quad: WebGLBuffer;\n}\n\nfunction compileProgram(\n gl: WebGL2RenderingContext,\n vertexSource: string,\n fragmentSource: string,\n): WebGLProgram | null {\n const vertex = gl.createShader(gl.VERTEX_SHADER);\n const fragment = gl.createShader(gl.FRAGMENT_SHADER);\n if (!vertex || !fragment) {\n if (vertex) gl.deleteShader(vertex);\n if (fragment) gl.deleteShader(fragment);\n return null;\n }\n gl.shaderSource(vertex, vertexSource);\n gl.shaderSource(fragment, fragmentSource);\n gl.compileShader(vertex);\n gl.compileShader(fragment);\n if (\n !gl.getShaderParameter(vertex, gl.COMPILE_STATUS) ||\n !gl.getShaderParameter(fragment, gl.COMPILE_STATUS)\n ) {\n gl.deleteShader(vertex);\n gl.deleteShader(fragment);\n return null;\n }\n const program = gl.createProgram();\n if (!program) {\n gl.deleteShader(vertex);\n gl.deleteShader(fragment);\n return null;\n }\n gl.attachShader(program, vertex);\n gl.attachShader(program, fragment);\n gl.linkProgram(program);\n gl.deleteShader(vertex);\n gl.deleteShader(fragment);\n if (gl.getProgramParameter(program, gl.LINK_STATUS)) return program;\n gl.deleteProgram(program);\n return null;\n}\n\nimport {\n INSTANCE_STRIDE,\n type InstanceBuffer,\n} from \"@godot-scene-web/effects/particles\";\n\ninterface InstanceGpuAllocation {\n buffer: WebGLBuffer;\n bytes: number;\n}\n\n/** GPU residency is deliberately external to the portable instance data. */\nconst instanceAllocations = new WeakMap<\n WebGL2RenderingContext,\n WeakMap<InstanceBuffer, InstanceGpuAllocation>\n>();\n\nfunction allocationsFor(\n gl: WebGL2RenderingContext,\n): WeakMap<InstanceBuffer, InstanceGpuAllocation> {\n let allocations = instanceAllocations.get(gl);\n if (!allocations) {\n allocations = new WeakMap();\n instanceAllocations.set(gl, allocations);\n }\n return allocations;\n}\n\nfunction uploadInstances(\n gl: WebGL2RenderingContext,\n instances: InstanceBuffer,\n): WebGLBuffer | null {\n const allocations = allocationsFor(gl);\n let allocation = allocations.get(instances);\n if (!allocation) {\n const buffer = gl.createBuffer();\n if (!buffer) return null;\n allocation = { buffer, bytes: 0 };\n allocations.set(instances, allocation);\n }\n gl.bindBuffer(gl.ARRAY_BUFFER, allocation.buffer);\n if (instances.data.byteLength > allocation.bytes) {\n gl.bufferData(gl.ARRAY_BUFFER, instances.data, gl.DYNAMIC_DRAW);\n allocation.bytes = instances.data.byteLength;\n } else {\n gl.bufferSubData(\n gl.ARRAY_BUFFER,\n 0,\n instances.data,\n 0,\n instances.count * INSTANCE_STRIDE,\n );\n }\n return allocation.buffer;\n}\n\n/** Release one portable buffer's WebGL allocation on its owning borrowed context. */\nexport function disposeParticleInstanceBuffer(\n gl: WebGL2RenderingContext,\n instances: InstanceBuffer,\n): void {\n const allocations = instanceAllocations.get(gl);\n const allocation = allocations?.get(instances);\n if (!allocation) return;\n gl.deleteBuffer(allocation.buffer);\n allocations?.delete(instances);\n}\n\n/** Context-loss path: forget driver names without issuing GL commands. */\nexport function invalidateParticleInstanceBuffer(\n gl: WebGL2RenderingContext,\n instances: InstanceBuffer,\n): void {\n instanceAllocations.get(gl)?.delete(instances);\n}\n\nconst VERTEX_SRC = `#version 300 es\nlayout(location = 0) in vec2 a_corner; // unit quad corner, [-0.5, 0.5]\nlayout(location = 1) in vec2 a_center; // particle center, device px\nlayout(location = 2) in vec2 a_scale; // sprite size, device px (base * scale)\nlayout(location = 3) in float a_rotation;\nlayout(location = 4) in vec4 a_color;\nlayout(location = 5) in float a_frame;\nuniform vec2 u_viewport; // canvas size, device px\nuniform float u_hframes;\nuniform float u_vframes;\nout vec2 v_uv;\nout vec2 v_quad;\nout vec2 v_cell;\nout vec4 v_color;\nvoid main() {\n float c = cos(a_rotation);\n float s = sin(a_rotation);\n vec2 rotated = vec2(a_corner.x * c - a_corner.y * s, a_corner.x * s + a_corner.y * c);\n vec2 px = a_center + rotated * a_scale;\n vec2 clip = (px / u_viewport) * 2.0 - 1.0;\n clip.y = -clip.y; // canvas Y-down -> clip Y-up\n gl_Position = vec4(clip, 0.0, 1.0);\n vec2 uv01 = a_corner + 0.5; // 0..1 across the SPRITE quad\n vec2 cell = vec2(mod(a_frame, u_hframes), floor(a_frame / u_hframes));\n v_uv = (cell + uv01) / vec2(u_hframes, u_vframes);\n // The flipbook cell INDEX, so a fragment that re-derives its own sprite-local UV (the polar remap) can map\n // it back into the same cell instead of over the whole sheet.\n v_cell = cell;\n // Quad-local 0..1, INDEPENDENT of the flipbook grid: the untextured dot is drawn from this.\n // Deriving it from the atlas-mapped v_uv put the dot's center at the SHEET's center, so any\n // grid > 1x1 left the fallback dot off-center and clipped to a sliver of one cell.\n v_quad = uv01;\n v_color = a_color;\n}`;\n\n// Exported for the coverage tests only (jsdom has no GL, so the fragment's ORDERING invariants — coverage read\n// PRE-LUT, the mask sampled over the quad — are asserted against the source). Not re-exported by the package.\nexport const FRAGMENT_SRC = `#version 300 es\nprecision mediump float;\nuniform sampler2D u_texture;\nuniform sampler2D u_lutTex; // per-TEXEL color LUT, 1px tall (see u_lut)\nuniform sampler2D u_maskTex; // quad-shaped coverage mask, unit 2 (see u_mask)\n// The flipbook grid, ALSO declared in the vertex stage: a uniform shared across stages must match in type AND\n// PRECISION, and the vertex stage's float default is highp while this one's is mediump — declaring these as a\n// plain float here fails to LINK (silently: no particle program, so no particle canvases at all).\nuniform highp float u_hframes;\nuniform highp float u_vframes;\nuniform int u_textured;\nuniform int u_lut; // 1 = recolor through the LUT, indexed by the source RED channel\nuniform int u_additive; // 1 = additive: emit the particle's LIGHT (Godot ADD: src.rgb * src.a)\nuniform int u_alphaFromRed; // 1 = coverage comes from the source RED channel, not its alpha\nuniform int u_erode; // 1 = apply the constant-erosion smoothstep below\nuniform vec2 u_erodeFactors; // (threshold, softness) for that smoothstep\nuniform int u_mask; // 1 = multiply coverage by u_maskTex's red, sampled over the QUAD\nuniform int u_uvPolar; // 1 = sample the sheet through Godot's polar_coordinates remap\nin vec2 v_uv;\nin vec2 v_quad;\nin vec2 v_cell;\nin vec4 v_color;\nout vec4 fragColor;\nvoid main() {\n vec2 uv = v_uv;\n if (u_uvPolar == 1) {\n // Godot polar_coordinates(UV, vec2(0.5), 1, 1) (shaders/vfx/_util/polar_coordinates.gdshaderinc):\n // x = radius from the sprite center (0..1.41 at the corners), y = the angle mapped to 0..1, both wrapped.\n // A radial sheet (common_ring_polar_a) is a RING only through this; sampled flat it is a vertical BAR.\n vec2 dir = v_quad - 0.5;\n float radius = length(dir) * 2.0;\n float angle = atan(dir.y, dir.x) * (1.0 / (3.1416 * 2.0));\n uv = (v_cell + mod(vec2(radius, angle), 1.0)) / vec2(u_hframes, u_vframes);\n }\n vec4 tex;\n if (u_textured == 1) {\n tex = texture(u_texture, uv);\n } else {\n // Soft round dot when the system has no texture — measured across the QUAD, not the\n // atlas-mapped UV, so it stays centered whatever the (meaningless, textureless) grid is.\n float r = length(v_quad - 0.5) * 2.0;\n tex = vec4(1.0, 1.0, 1.0, 1.0 - smoothstep(0.7, 1.0, r));\n }\n // COVERAGE — taken PRE-LUT, because the LUT is a color lookup INDEXED by that same red channel: reading it\n // afterwards would sample the LUT's own (usually white) output instead of the sheet's shape. STS2's\n // grayscale VFX sheets are alpha-less PNGs, so tex.a is 1.0 everywhere and the alpha branch draws a SQUARE.\n float coverage = u_alphaFromRed == 1 ? tex.r : tex.a;\n if (u_lut == 1) {\n // Godot's VFX particle-shader family: COLOR = vec4(texture(lut, texture_color.rr).rgb,\n // alpha) * vertex_color. The sprite sheet is a single-channel MASK, so its own RGB is\n // meaningless (it reads as a red/orange block); the LUT holds the real colors. Sampled\n // AFTER the texture/dot resolve so both branches are recolored, and the source ALPHA is\n // preserved untouched — only RGB comes from the LUT.\n tex = vec4(texture(u_lutTex, vec2(tex.r, 0.5)).rgb, tex.a);\n }\n if (u_erode == 1) {\n // Godot erosion_from_factors(vec2(threshold, softness), coverage) — a CONSTANT erosion curve, i.e. the\n // threshold does not sweep over the particle's life (see ParticleSpecConfig.alphaErode).\n coverage = smoothstep(u_erodeFactors.x, u_erodeFactors.x + u_erodeFactors.y, coverage);\n }\n if (u_mask == 1) {\n // Godot's mask sampler reads the sprite's own UV, NOT the flipbook cell — it shapes the whole quad.\n coverage *= texture(u_maskTex, v_quad).r;\n }\n tex.a = coverage;\n vec4 col = tex * v_color;\n if (u_additive == 1) {\n // Additive sprites contribute light = color x alpha (Godot BLEND_MODE_ADD adds\n // src.rgb * src.a to the framebuffer, nothing where light is 0 -- so an opaque-black\n // glow background or an alpha-shaped sprite's transparent area both add nothing).\n // Emit that light RAW and SUM it across particles (blendFunc ONE, ONE into the\n // accumulator FBO); the resolve pass then derives the per-pixel TOTAL's peak-channel\n // coverage ONCE and presents the pair premultiplied. Normalizing per PARTICLE here\n // (the old path) amplified every faint texel to full brightness and let overlaps\n // clamp to white while stacking coverage -- a subtle 5-particle fog rendered as an\n // opaque white haze wall.\n fragColor = vec4(col.rgb * tex.a * v_color.a, 0.0);\n } else {\n // PREMULTIPLIED, under blendFactorsFor(0)'s ONE / ONE_MINUS_SRC_ALPHA -- the shared canvas\n // declares premultipliedAlpha: true (../webgl/shared-gl.ts) and this is that contract.\n // Algebraically identical to emitting straight col under SRC_ALPHA / ONE_MINUS_SRC_ALPHA\n // (both land col.rgb*col.a + dst*(1-col.a)), and written THIS way so the fragment and the\n // canvas state the same thing -- the same pairing render-webgpu.ts's fs_particles uses, since\n // a GPUCanvasContext has no straight-alpha mode to differ with.\n fragColor = vec4(col.rgb * col.a, col.a);\n }\n}`;\n\n// Resolve pass for additive systems: read the summed light accumulated in the FBO and PRESENT it,\n// premultiplied, as the canvas contract requires: color = the light itself, alpha = its peak\n// channel. Source-over then contributes `light + dst * (1 - peak)` -- the closest source-over\n// approximation of Godot's pure `light + dst`, applied to the per-pixel TOTAL (not per particle).\n//\n// NO DIVISION, and therefore no `cov > 0` guard: a premultiplied canvas wants `(light, cov)`\n// directly. (It used to resolve `(light / cov, cov)` for a straight-alpha canvas, where the blit\n// into the node canvas multiplied by cov again and put `light` back -- correct, but only because\n// two mistakes cancelled. The same expression as render-webgpu.ts's fs_resolve.)\nconst RESOLVE_VERTEX_SRC = `#version 300 es\nlayout(location = 0) in vec2 a_pos; // full-screen clip-space quad (shared-gl quad buffer)\nvoid main() {\n gl_Position = vec4(a_pos, 0.0, 1.0);\n}`;\n\n// Exported for the same reason `FRAGMENT_SRC` is: jsdom has no GL, so the alpha contract this pass\n// states — `(light, cov)`, no divide, no guard — is asserted against the SOURCE.\nexport const RESOLVE_FRAGMENT_SRC = `#version 300 es\nprecision mediump float;\nuniform sampler2D u_accum;\nout vec4 fragColor;\nvoid main() {\n // Same viewport rect + origin as the accumulate pass, so fragment coords match texels.\n vec3 light = texelFetch(u_accum, ivec2(gl_FragCoord.xy), 0).rgb;\n float cov = max(max(light.r, light.g), light.b);\n fragColor = vec4(light, cov);\n}`;\n\n// The light-accumulation render target for additive systems: particles sum their raw\n// light here (blendFunc ONE, ONE), then the resolve pass normalizes the total into the\n// default framebuffer. Grow-only (like the shared canvas) to avoid realloc thrash.\ninterface AccumTarget {\n fbo: WebGLFramebuffer;\n texture: WebGLTexture;\n width: number;\n height: number;\n}\n\nexport interface ParticleProgram {\n program: WebGLProgram;\n cornerBuffer: WebGLBuffer;\n uViewport: WebGLUniformLocation | null;\n uHframes: WebGLUniformLocation | null;\n uVframes: WebGLUniformLocation | null;\n uTexture: WebGLUniformLocation | null;\n uLutTex: WebGLUniformLocation | null;\n uMaskTex: WebGLUniformLocation | null;\n uTextured: WebGLUniformLocation | null;\n uLut: WebGLUniformLocation | null;\n uAdditive: WebGLUniformLocation | null;\n uAlphaFromRed: WebGLUniformLocation | null;\n uErode: WebGLUniformLocation | null;\n uErodeFactors: WebGLUniformLocation | null;\n uMask: WebGLUniformLocation | null;\n uUvPolar: WebGLUniformLocation | null;\n /** Additive resolve pass (normalize summed light -> straight color + coverage). */\n resolveProgram: WebGLProgram;\n uAccum: WebGLUniformLocation | null;\n accum: AccumTarget | null;\n}\n\n// Compiled once per page (the programs + the static unit-quad corner buffer are\n// context-global), cached at module scope. `null` cached on compile failure so the\n// runtime falls back to the static preview.\ninterface CachedProgram {\n program: ParticleProgram | null;\n refs: number;\n pinned: boolean;\n}\nconst cached = new WeakMap<WebGL2RenderingContext, CachedProgram>();\n\nexport function getParticleProgram(\n gl: WebGL2RenderingContext,\n): ParticleProgram | null {\n const existing = cached.get(gl);\n if (existing) {\n existing.pinned = true;\n return existing.program;\n }\n const program = compileProgram(gl, VERTEX_SRC, FRAGMENT_SRC);\n const resolveProgram = compileProgram(\n gl,\n RESOLVE_VERTEX_SRC,\n RESOLVE_FRAGMENT_SRC,\n );\n if (!program || !resolveProgram) {\n if (program) gl.deleteProgram(program);\n if (resolveProgram) gl.deleteProgram(resolveProgram);\n cached.set(gl, { program: null, refs: 0, pinned: true });\n return null;\n }\n const cornerBuffer = gl.createBuffer();\n if (!cornerBuffer) {\n gl.deleteProgram(program);\n gl.deleteProgram(resolveProgram);\n cached.set(gl, { program: null, refs: 0, pinned: true });\n return null;\n }\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerBuffer);\n // Unit quad [-0.5, 0.5] as a TRIANGLE_STRIP.\n gl.bufferData(\n gl.ARRAY_BUFFER,\n new Float32Array([-0.5, -0.5, 0.5, -0.5, -0.5, 0.5, 0.5, 0.5]),\n gl.STATIC_DRAW,\n );\n const result: ParticleProgram = {\n program,\n cornerBuffer,\n uViewport: gl.getUniformLocation(program, \"u_viewport\"),\n uHframes: gl.getUniformLocation(program, \"u_hframes\"),\n uVframes: gl.getUniformLocation(program, \"u_vframes\"),\n uTexture: gl.getUniformLocation(program, \"u_texture\"),\n uLutTex: gl.getUniformLocation(program, \"u_lutTex\"),\n uMaskTex: gl.getUniformLocation(program, \"u_maskTex\"),\n uTextured: gl.getUniformLocation(program, \"u_textured\"),\n uLut: gl.getUniformLocation(program, \"u_lut\"),\n uAdditive: gl.getUniformLocation(program, \"u_additive\"),\n uAlphaFromRed: gl.getUniformLocation(program, \"u_alphaFromRed\"),\n uErode: gl.getUniformLocation(program, \"u_erode\"),\n uErodeFactors: gl.getUniformLocation(program, \"u_erodeFactors\"),\n uMask: gl.getUniformLocation(program, \"u_mask\"),\n uUvPolar: gl.getUniformLocation(program, \"u_uvPolar\"),\n resolveProgram,\n uAccum: gl.getUniformLocation(resolveProgram, \"u_accum\"),\n accum: null,\n };\n cached.set(gl, { program: result, refs: 0, pinned: true });\n return result;\n}\n\n/** Acquire a shared program lease for a producer that will later release it. */\nexport function acquireParticleProgram(\n gl: WebGL2RenderingContext,\n): ParticleProgram | null {\n const entry = cached.get(gl);\n if (entry) {\n if (!entry.program) return null;\n entry.refs += 1;\n return entry.program;\n }\n // Construct without pinning: a headless-only context may release its final lease.\n const program = getParticleProgram(gl);\n const created = cached.get(gl)!;\n created.pinned = false;\n created.refs = 1;\n return program;\n}\n\nfunction destroyCachedProgram(\n gl: WebGL2RenderingContext,\n program: ParticleProgram,\n): void {\n gl.deleteProgram(program.program);\n gl.deleteProgram(program.resolveProgram);\n gl.deleteBuffer(program.cornerBuffer);\n if (program.accum) {\n gl.deleteFramebuffer(program.accum.fbo);\n gl.deleteTexture(program.accum.texture);\n }\n}\n\n/** Release a producer lease. Pinned HTML consumers keep their shared program alive. */\nexport function releaseParticleProgram(\n gl: WebGL2RenderingContext,\n contextLost = false,\n): void {\n const entry = cached.get(gl);\n if (!entry) return;\n entry.refs = Math.max(0, entry.refs - 1);\n if (entry.refs !== 0 || entry.pinned) return;\n cached.delete(gl);\n if (entry.program && !contextLost) destroyCachedProgram(gl, entry.program);\n}\n\n/** Drop one context's cached renderer after ordinary invalidation or context loss. */\nexport function invalidateParticleProgram(\n gl: WebGL2RenderingContext,\n contextLost = false,\n): void {\n const entry = cached.get(gl);\n if (entry && !contextLost && entry.refs > 0) return;\n cached.delete(gl);\n if (!entry?.program || contextLost) return;\n destroyCachedProgram(gl, entry.program);\n}\n\n// Ensure the accumulation FBO covers (w, h), growing (never shrinking) its texture —\n// the same grow-only policy as the shared canvas, for the same realloc-cost reason.\nfunction ensureAccumTarget(\n gl: WebGL2RenderingContext,\n program: ParticleProgram,\n w: number,\n h: number,\n): AccumTarget | null {\n let accum = program.accum;\n if (!accum) {\n const fbo = gl.createFramebuffer();\n const texture = gl.createTexture();\n if (!fbo || !texture) {\n if (fbo) gl.deleteFramebuffer(fbo);\n if (texture) gl.deleteTexture(texture);\n return null;\n }\n accum = {\n fbo,\n texture,\n width: 0,\n height: 0,\n };\n program.accum = accum;\n }\n if (accum.width < w || accum.height < h) {\n const width = Math.max(accum.width, w);\n const height = Math.max(accum.height, h);\n gl.bindTexture(gl.TEXTURE_2D, accum.texture);\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n width,\n height,\n 0,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n null,\n );\n // texelFetch sampling — filtering is irrelevant, but the texture must be complete.\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.bindFramebuffer(gl.FRAMEBUFFER, accum.fbo);\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n accum.texture,\n 0,\n );\n if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) !== gl.FRAMEBUFFER_COMPLETE) {\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.deleteFramebuffer(accum.fbo);\n gl.deleteTexture(accum.texture);\n program.accum = null;\n return null;\n }\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n accum.width = width;\n accum.height = height;\n }\n return accum;\n}\n\nexport interface DrawParticlesOptions {\n texture: WebGLTexture | null;\n textured: boolean;\n /**\n * Baked per-texel color LUT (1px-tall RGBA ramp) bound on texture unit 1, or null.\n * Present => the fragment shader replaces each texel's RGB with `lut(texel.r)`, keeping\n * the source alpha. See `ParticleSpecConfig.colorLut`.\n */\n lutTexture?: WebGLTexture | null;\n /**\n * Quad-shaped coverage mask bound on texture unit 2, or null. Present => the fragment multiplies coverage by\n * its RED channel (`ParticleSpecConfig.maskUrl`). A still-loading texture is the shared 1x1 TRANSPARENT\n * placeholder, so the system stays invisible until it decodes — the same \"no mask, no particle\" the game shows.\n */\n maskTexture?: WebGLTexture | null;\n hframes: number;\n vframes: number;\n blendMode: number;\n viewportW: number;\n viewportH: number;\n /** The rect the pixels actually LAND in (≤ viewportW/H): the caller's clamped `gl.viewport`\n * when the shared drawing buffer couldn't hold the full viewportW×H (see\n * `ensureSharedDrawSize`). `viewportW/H` stay the px coordinate DOMAIN (the vertex NDC\n * mapping divides by them), so a smaller target scales the draw down; the caller's blit\n * scales it back up. Defaults to viewportW/H — a healthy buffer changes nothing. */\n targetW?: number;\n targetH?: number;\n /** Non-default destination for a borrowed-stage additive resolve. */\n targetFramebuffer?: WebGLFramebuffer | null;\n /**\n * Add the resolved light into an already-painted destination rather than\n * overwriting a freshly cleared particle surface. This is required when an\n * additive system is an ordered pass in a shared canvas framebuffer.\n */\n additiveResolveIntoExisting?: boolean;\n /** `ParticleSpecConfig.alphaFromRed`: coverage from the source RED channel, pre-LUT. */\n alphaFromRed?: boolean;\n /** `ParticleSpecConfig.alphaErode`: constant-erosion smoothstep applied to coverage. */\n erode?: { threshold: number; softness: number } | null;\n /** `ParticleSpecConfig.uvPolar`: sample the sheet through Godot's polar_coordinates remap. */\n uvPolar?: boolean;\n}\n\n/** Allocate additive accumulation storage before a caller mutates simulation state. */\nexport function prepareParticleDraw(\n gl: WebGL2RenderingContext,\n program: ParticleProgram,\n opts: DrawParticlesOptions,\n): boolean {\n if (opts.blendMode !== 1) return true;\n const targetW = opts.targetW ?? opts.viewportW;\n const targetH = opts.targetH ?? opts.viewportH;\n return ensureAccumTarget(gl, program, targetW, targetH) !== null;\n}\n\n// GL blend factors for a CanvasItemMaterial blend mode, as the SEPARATE four Godot uses:\n// [srcRGB, dstRGB, srcAlpha, dstAlpha]. Pure + GL-free (returns enum NAMES) so it is\n// unit-testable; `drawParticles` maps names -> gl[name] onto `blendFuncSeparate`.\n// 1 = add (glow); everything else => standard alpha \"mix\".\n//\n// SEPARATE, not one pair for both channels, because Godot's canvas blending is separate and\n// both of its backends agree — GLES3 `rasterizer_canvas_gles3.cpp:755-762` (BLEND_MODE_MIX,\n// transparent-render-target branch) and RD `material_storage.cpp:655-663`\n// (`blend_mode_to_blend_attachment`, BLEND_MODE_MIX) both give the ALPHA channel src factor\n// ONE. Applying SRC_ALPHA to alpha as well — as this did — lands a covered pixel near a^2\n// instead of a, which shows up wherever alpha is partial: soft sprite edges and overlaps.\n// The canvas composites source-over onto the page, so that alpha is a real coverage value the\n// page sees, not an internal detail.\nexport function blendFactorsFor(\n blendMode: number,\n): [string, string, string, string] {\n // 1 = add (glow): the fragment shader emits the particle's raw LIGHT (color x alpha,\n // see FRAGMENT_SRC / u_additive) and overlapping particles must SUM it — Godot's\n // BLEND_MODE_ADD — inside the accumulation FBO. The resolve pass then converts the\n // per-pixel total to straight color + coverage alpha for the source-over canvas.\n // (Normalizing per particle with source-over accumulation clamped overlaps to white.)\n //\n // ONE on all four rather than Godot's `(SRC_ALPHA, ONE, SRC_ALPHA, ONE)`: this fragment has\n // already done the src.rgb * src.a itself, and it writes alpha 0 — the accumulator's alpha\n // channel carries nothing, and the resolve's `texelFetch(...).rgb` never reads it.\n if (blendMode === 1) return [\"ONE\", \"ONE\", \"ONE\", \"ONE\"];\n // MIX: the PREMULTIPLIED form. The fragment already carries `rgb * a` (see FRAGMENT_SRC), so the\n // source contributes its light unscaled and the destination is attenuated by the coverage the\n // source claims: `dst' = src.rgb*src.a + dst*(1 - src.a)`, and the same pair on alpha for\n // Godot's separate-alpha `ONE`. Exactly what `SRC_ALPHA / ONE_MINUS_SRC_ALPHA` computes over a\n // STRAIGHT source — the choice between the two forms is not arithmetic, it is which contract the\n // canvas is declared under, and this one matches `premultipliedAlpha: true`. It is also\n // `render-webgpu.ts`'s `PREMULTIPLIED_BLEND` verbatim, so both backends say one thing.\n return [\"ONE\", \"ONE_MINUS_SRC_ALPHA\", \"ONE\", \"ONE_MINUS_SRC_ALPHA\"];\n}\n\nconst INSTANCE_ATTRS: Array<{ loc: number; size: number; offset: number }> = [\n { loc: 1, size: 2, offset: 0 }, // a_center\n { loc: 2, size: 2, offset: 2 }, // a_scale\n { loc: 3, size: 1, offset: 4 }, // a_rotation\n { loc: 4, size: 4, offset: 5 }, // a_color\n { loc: 5, size: 1, offset: 9 }, // a_frame\n];\n\n// Draw one system's instances into the (already sized + viewport'd + cleared) shared\n// canvas. Additive systems (blendMode 1) render in two passes: SUM the raw per-particle\n// light into the accumulation FBO (Godot ADD semantics), then resolve the total into the\n// default framebuffer as straight color + coverage alpha. Restores attrib divisors\n// afterwards so the shared shader runtime, which uses the default VAO, is unaffected.\nexport function drawParticles(\n sharedGl: ParticleGl,\n program: ParticleProgram,\n buffer: InstanceBuffer,\n opts: DrawParticlesOptions,\n): boolean {\n const { gl } = sharedGl;\n if (buffer.count <= 0) return true;\n const instanceGpuBuffer = uploadInstances(gl, buffer);\n if (!instanceGpuBuffer) return false;\n\n const additive = opts.blendMode === 1;\n // Where the pixels land (the caller's clamped viewport); viewportW/H remain the coordinate\n // domain. Identical unless the shared drawing buffer capped the draw (see DrawParticlesOptions).\n const targetW = opts.targetW ?? opts.viewportW;\n const targetH = opts.targetH ?? opts.viewportH;\n if (additive) {\n // Accumulate light offscreen; same viewport rect/origin as the default framebuffer,\n // so the resolve pass can map fragment coords to accumulator texels 1:1.\n if (!prepareParticleDraw(gl, program, opts)) return false;\n const accum = program.accum!;\n gl.bindFramebuffer(gl.FRAMEBUFFER, accum.fbo);\n gl.viewport(0, 0, targetW, targetH);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n }\n\n gl.useProgram(program.program);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, program.cornerBuffer);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(0, 0);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, instanceGpuBuffer);\n const strideBytes = INSTANCE_STRIDE * 4;\n for (let index = 0; index < INSTANCE_ATTRS.length; index += 1) {\n const attr = INSTANCE_ATTRS[index];\n gl.enableVertexAttribArray(attr.loc);\n gl.vertexAttribPointer(\n attr.loc,\n attr.size,\n gl.FLOAT,\n false,\n strideBytes,\n attr.offset * 4,\n );\n gl.vertexAttribDivisor(attr.loc, 1);\n }\n\n if (program.uViewport) {\n gl.uniform2f(program.uViewport, opts.viewportW, opts.viewportH);\n }\n const textured = Boolean(opts.textured && opts.texture);\n const hframes = textured ? Math.max(1, opts.hframes) : 1;\n const vframes = textured ? Math.max(1, opts.vframes) : 1;\n if (program.uHframes) gl.uniform1f(program.uHframes, hframes);\n if (program.uVframes) gl.uniform1f(program.uVframes, vframes);\n if (program.uTextured) {\n gl.uniform1i(program.uTextured, textured ? 1 : 0);\n }\n if (program.uAdditive) {\n gl.uniform1i(program.uAdditive, additive ? 1 : 0);\n }\n // Coverage semantics (see ParticleSpecConfig). Written EVERY draw — the program is shared across systems, so\n // a flag left on by the previous system would otherwise leak into this one.\n if (program.uAlphaFromRed) {\n gl.uniform1i(program.uAlphaFromRed, opts.alphaFromRed ? 1 : 0);\n }\n const erode = opts.erode ?? null;\n if (program.uErode) gl.uniform1i(program.uErode, erode ? 1 : 0);\n if (program.uErodeFactors) {\n gl.uniform2f(\n program.uErodeFactors,\n erode ? erode.threshold : 0,\n erode ? erode.softness : 0,\n );\n }\n if (program.uUvPolar) {\n gl.uniform1i(program.uUvPolar, opts.uvPolar ? 1 : 0);\n }\n gl.activeTexture(gl.TEXTURE0);\n if (opts.texture && program.uTexture) {\n gl.bindTexture(gl.TEXTURE_2D, opts.texture);\n gl.uniform1i(program.uTexture, 0);\n } else {\n // Unbind explicitly: a previous resolve pass left the accumulator on TEXTURE0, and\n // sampling it while it is the render target is a feedback loop (undefined behavior).\n gl.bindTexture(gl.TEXTURE_2D, null);\n }\n // Unit 1 = the color LUT. Bound (or explicitly unbound) every draw, since the unit is\n // shared with whatever the previous system left there.\n const lut = opts.lutTexture ?? null;\n gl.activeTexture(gl.TEXTURE1);\n gl.bindTexture(gl.TEXTURE_2D, lut);\n if (program.uLutTex) gl.uniform1i(program.uLutTex, 1);\n if (program.uLut) gl.uniform1i(program.uLut, lut ? 1 : 0);\n // Unit 2 = the quad coverage mask. Same shared-unit discipline as the LUT: bound (or explicitly unbound) on\n // every draw, never left to whatever the previous system put there.\n const mask = opts.maskTexture ?? null;\n gl.activeTexture(gl.TEXTURE2);\n gl.bindTexture(gl.TEXTURE_2D, mask);\n if (program.uMaskTex) gl.uniform1i(program.uMaskTex, 2);\n if (program.uMask) gl.uniform1i(program.uMask, mask ? 1 : 0);\n // Back to unit 0 for the caller / the next system (the resolve pass and the shared shader runtime both\n // assume TEXTURE0 is the active unit).\n gl.activeTexture(gl.TEXTURE0);\n\n gl.enable(gl.BLEND);\n gl.blendEquation(gl.FUNC_ADD);\n if (additive) gl.blendFuncSeparate(gl.ONE, gl.ONE, gl.ONE, gl.ONE);\n else\n gl.blendFuncSeparate(\n gl.ONE,\n gl.ONE_MINUS_SRC_ALPHA,\n gl.ONE,\n gl.ONE_MINUS_SRC_ALPHA,\n );\n gl.disable(gl.DEPTH_TEST);\n\n gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, buffer.count);\n\n // Leave the default VAO clean for the shader runtime (it uses attrib 0 only).\n for (let index = 0; index < INSTANCE_ATTRS.length; index += 1) {\n const attr = INSTANCE_ATTRS[index];\n gl.vertexAttribDivisor(attr.loc, 0);\n gl.disableVertexAttribArray(attr.loc);\n }\n\n if (additive && program.accum) {\n // Resolve the summed light. A standalone particle surface was just cleared,\n // so it overwrites. An ordered direct pass instead adds the light into the\n // painter target, preserving the scene already behind it.\n gl.bindFramebuffer(gl.FRAMEBUFFER, opts.targetFramebuffer ?? null);\n gl.viewport(0, 0, targetW, targetH);\n gl.useProgram(program.resolveProgram);\n gl.bindBuffer(gl.ARRAY_BUFFER, sharedGl.quad);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(0, 0);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, program.accum.texture);\n if (program.uAccum) gl.uniform1i(program.uAccum, 0);\n if (opts.additiveResolveIntoExisting) {\n gl.enable(gl.BLEND);\n gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD);\n gl.blendFuncSeparate(gl.ONE, gl.ONE, gl.ONE, gl.ONE);\n } else gl.disable(gl.BLEND);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n // Blend state is left as it lies. There is no \"ambient\" state on the shared context to\n // restore to: every consumer sets its own before drawing — this function does at the top of\n // its blend block, and the shader backend disables BLEND in its preamble.\n }\n return true;\n}\n","import type { ShaderUniform } from \"@godot-scene-web/effects/shaders\";\n\n/** Allocate the shared clip-space quad used by full-surface shader draws. */\nexport function createWebglFullscreenQuad(\n gl: WebGL2RenderingContext,\n): WebGLBuffer | null {\n const quad = gl.createBuffer();\n if (!quad) return null;\n gl.bindBuffer(gl.ARRAY_BUFFER, quad);\n gl.bufferData(\n gl.ARRAY_BUFFER,\n new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]),\n gl.STATIC_DRAW,\n );\n return quad;\n}\n\nexport function createWebglTexture(\n gl: WebGL2RenderingContext,\n): WebGLTexture | null {\n return gl.createTexture();\n}\n\nfunction setTextureSampling(\n gl: WebGL2RenderingContext,\n repeat: boolean,\n nearest = false,\n): void {\n const wrap = repeat ? gl.REPEAT : gl.CLAMP_TO_EDGE;\n const filter = nearest ? gl.NEAREST : gl.LINEAR;\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, wrap);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, wrap);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);\n}\n\n/** Upload bytes, an image, or a canvas with Godot's top-left UV convention. */\nexport function uploadWebglTexture(\n gl: WebGL2RenderingContext,\n texture: WebGLTexture,\n source: TexImageSource | Uint8Array,\n width?: number,\n height?: number,\n opts: { repeat?: boolean; nearest?: boolean } = {},\n): void {\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);\n if (source instanceof Uint8Array) {\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n width ?? 1,\n height ?? 1,\n 0,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n source,\n );\n } else {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);\n }\n setTextureSampling(gl, opts.repeat === true, opts.nearest === true);\n}\n\nexport function createWebglPlaceholderTexture(\n gl: WebGL2RenderingContext,\n repeat: boolean,\n): WebGLTexture | null {\n const texture = createWebglTexture(gl);\n if (texture)\n uploadWebglTexture(gl, texture, new Uint8Array([0, 0, 0, 0]), 1, 1, {\n repeat,\n });\n return texture;\n}\n\n// Program status queries can stall on driver compilation. This DOM-free layer owns the\n// KHR_parallel_shader_compile completion probe and a shared poll for every borrowed context.\nexport interface PendingProgram {\n ready(): boolean;\n finish(): WebGLProgram | null;\n}\n\nconst COMPILE_POLL_MS = 1;\nconst COMPILE_MAX_WAIT_MS = 3000;\nconst parallelCompileExts = new WeakMap<\n WebGL2RenderingContext,\n { COMPLETION_STATUS_KHR: number } | null\n>();\n\nfunction parallelCompileExt(\n gl: WebGL2RenderingContext,\n): { COMPLETION_STATUS_KHR: number } | null {\n const cached = parallelCompileExts.get(gl);\n if (cached !== undefined) return cached;\n let ext: { COMPLETION_STATUS_KHR: number } | null = null;\n try {\n const found = gl.getExtension(\"KHR_parallel_shader_compile\") as {\n COMPLETION_STATUS_KHR?: number;\n } | null;\n ext =\n found && typeof found.COMPLETION_STATUS_KHR === \"number\"\n ? { COMPLETION_STATUS_KHR: found.COMPLETION_STATUS_KHR }\n : null;\n } catch {\n ext = null;\n }\n parallelCompileExts.set(gl, ext);\n return ext;\n}\n\nconst FAILED_PROGRAM: PendingProgram = {\n ready: () => true,\n finish: () => null,\n};\n\n/** Kick compilation and linking without synchronously asking the driver for status. */\nexport function startProgram(\n gl: WebGL2RenderingContext,\n vertexSrc: string,\n fragmentSrc: string,\n beforeLink?: (program: WebGLProgram) => void,\n): PendingProgram {\n const vs = startShader(gl, gl.VERTEX_SHADER, vertexSrc);\n const fs = startShader(gl, gl.FRAGMENT_SHADER, fragmentSrc);\n if (!vs || !fs) {\n if (vs) gl.deleteShader(vs);\n if (fs) gl.deleteShader(fs);\n return FAILED_PROGRAM;\n }\n const program = gl.createProgram();\n if (!program) {\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n return FAILED_PROGRAM;\n }\n gl.attachShader(program, vs);\n gl.attachShader(program, fs);\n beforeLink?.(program);\n gl.linkProgram(program);\n const ext = parallelCompileExt(gl);\n let completed = false;\n return {\n ready(): boolean {\n if (completed || !ext) return true;\n completed =\n gl.getProgramParameter(program, ext.COMPLETION_STATUS_KHR) === true;\n return completed;\n },\n finish(): WebGLProgram | null {\n if (gl.getProgramParameter(program, gl.LINK_STATUS)) {\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n return program;\n }\n let compileFailed = false;\n for (const shader of [vs, fs]) {\n if (gl.getShaderParameter(shader, gl.COMPILE_STATUS)) continue;\n compileFailed = true;\n console.warn(\n \"[gsw webgl] shader compile failed:\",\n gl.getShaderInfoLog(shader),\n );\n }\n if (!compileFailed)\n console.warn(\n \"[gsw webgl] program link failed:\",\n gl.getProgramInfoLog(program),\n );\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n gl.deleteProgram(program);\n return null;\n },\n };\n}\n\n/** Compile and link synchronously for callers that cannot yield. */\nexport function compileProgram(\n gl: WebGL2RenderingContext,\n vertexSrc: string,\n fragmentSrc: string,\n beforeLink?: (program: WebGLProgram) => void,\n): WebGLProgram | null {\n return startProgram(gl, vertexSrc, fragmentSrc, beforeLink).finish();\n}\n\ninterface CompileWaiter {\n pending: PendingProgram;\n deadline: number;\n wake: () => void;\n}\nconst compileWaiters = new Set<CompileWaiter>();\nlet compilePollTimer: ReturnType<typeof setTimeout> | null = null;\nfunction performanceNow(): number {\n return typeof performance !== \"undefined\" && performance.now\n ? performance.now()\n : 0;\n}\nfunction pollCompiles(): void {\n compilePollTimer = null;\n const now = performanceNow();\n for (const waiter of [...compileWaiters]) {\n if (!waiter.pending.ready() && now < waiter.deadline) continue;\n compileWaiters.delete(waiter);\n waiter.wake();\n }\n if (compileWaiters.size > 0) scheduleCompilePoll();\n}\nfunction scheduleCompilePoll(): void {\n if (compilePollTimer === null)\n compilePollTimer = setTimeout(pollCompiles, COMPILE_POLL_MS);\n}\n\n/** Finish when the parallel-compile extension says its status query will not block. */\nexport async function compileProgramAsync(\n gl: WebGL2RenderingContext,\n vertexSrc: string,\n fragmentSrc: string,\n beforeLink?: (program: WebGLProgram) => void,\n): Promise<WebGLProgram | null> {\n const pending = startProgram(gl, vertexSrc, fragmentSrc, beforeLink);\n if (!pending.ready() && typeof setTimeout === \"function\") {\n await new Promise<void>((wake) => {\n compileWaiters.add({\n pending,\n deadline: performanceNow() + COMPILE_MAX_WAIT_MS,\n wake,\n });\n scheduleCompilePoll();\n });\n }\n return pending.finish();\n}\n\n/** Fully precomputed GPU frame. HTML adapters calculate DOM geometry/captures first. */\nexport interface WebglGodotShaderFrame {\n readonly program: WebGLProgram;\n readonly locations: ReadonlyMap<string, WebGLUniformLocation | null>;\n readonly uniforms: readonly ShaderUniform[];\n readonly quad: WebGLBuffer;\n readonly width: number;\n readonly height: number;\n readonly texture: WebGLTexture | null;\n readonly time?: number;\n readonly texturePixelSize?: readonly [number, number];\n readonly modulate: readonly [number, number, number, number];\n readonly uvFit: readonly [number, number];\n readonly uvWindow: readonly [number, number, number, number];\n readonly screenOrigin?: readonly [number, number];\n readonly screenSize?: readonly [number, number];\n readonly screenTexture?: WebGLTexture;\n readonly screenTextureUnit?: number;\n readonly screenPixelSize?: readonly [number, number];\n readonly samplers: readonly {\n name: string;\n unit: number;\n texture: WebGLTexture | null;\n }[];\n readonly params: Readonly<Record<string, number | readonly number[]>>;\n readonly paramKinds: Readonly<Record<string, string>>;\n}\n\n/** Execute one Godot shader frame in a borrowed context; no DOM, scheduling, or capture work. */\nexport function drawGodotWebglShaderFrame(\n gl: WebGL2RenderingContext,\n frame: WebglGodotShaderFrame,\n): void {\n const loc = (name: string) => frame.locations.get(name) ?? null;\n const one = (name: string, value: number) => {\n const l = loc(name);\n if (l) gl.uniform1f(l, value);\n };\n const two = (name: string, value: readonly number[]) => {\n const l = loc(name);\n if (l) gl.uniform2f(l, value[0] ?? 0, value[1] ?? 0);\n };\n const four = (name: string, value: readonly number[]) => {\n const l = loc(name);\n if (l)\n gl.uniform4f(\n l,\n value[0] ?? 0,\n value[1] ?? 0,\n value[2] ?? 0,\n value[3] ?? 0,\n );\n };\n gl.viewport(0, 0, frame.width, frame.height);\n gl.disable(gl.SCISSOR_TEST);\n gl.disable(gl.DEPTH_TEST);\n gl.disable(gl.BLEND);\n gl.useProgram(frame.program);\n gl.bindBuffer(gl.ARRAY_BUFFER, frame.quad);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, frame.texture);\n {\n const l = loc(\"TEXTURE\");\n if (l) gl.uniform1i(l, 0);\n }\n if (frame.time !== undefined) one(\"TIME\", frame.time);\n if (frame.texturePixelSize) two(\"TEXTURE_PIXEL_SIZE\", frame.texturePixelSize);\n four(\"MODULATE\", frame.modulate);\n two(\"_godot_uv_fit\", frame.uvFit);\n four(\"_godot_uv_window\", frame.uvWindow);\n if (frame.screenOrigin) two(\"_godot_screen_origin\", frame.screenOrigin);\n if (frame.screenSize) two(\"_godot_screen_size\", frame.screenSize);\n if (frame.screenTexture) {\n const unit = frame.screenTextureUnit ?? 1;\n gl.activeTexture(gl.TEXTURE0 + unit);\n gl.bindTexture(gl.TEXTURE_2D, frame.screenTexture);\n const l = loc(\"SCREEN_TEXTURE\");\n if (l) gl.uniform1i(l, unit);\n }\n if (frame.screenPixelSize) two(\"SCREEN_PIXEL_SIZE\", frame.screenPixelSize);\n for (const sampler of frame.samplers) {\n gl.activeTexture(gl.TEXTURE0 + sampler.unit);\n gl.bindTexture(gl.TEXTURE_2D, sampler.texture);\n const l = loc(sampler.name);\n if (l) gl.uniform1i(l, sampler.unit);\n }\n for (const uniform of frame.uniforms)\n uploadGodotShaderUniform(\n gl,\n loc(uniform.name),\n uniform,\n frame.params[uniform.name],\n frame.paramKinds[uniform.name],\n );\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n}\n\n/** Exact Godot scalar/vector/array upload rules. Callers retain their own binding model. */\nexport function uploadGodotShaderUniform(\n gl: WebGL2RenderingContext,\n location: WebGLUniformLocation | null,\n uniform: ShaderUniform,\n raw: number | readonly number[] | undefined,\n paramKind?: string,\n): void {\n if (!location) return;\n const value = raw ?? uniform.default;\n const values = Array.isArray(value) ? [...value] : [];\n const pad = (length: number) => {\n const out = values.slice(0, length);\n while (out.length < length) out.push(0);\n return out;\n };\n if (uniform.arrayLength) {\n const n = uniform.arrayLength;\n if (uniform.type === \"float\")\n gl.uniform1fv(location, new Float32Array(pad(n)));\n else if (uniform.type === \"int\" || uniform.type === \"bool\")\n gl.uniform1iv(location, new Int32Array(pad(n).map(Math.round)));\n else if (uniform.type === \"vec2\")\n gl.uniform2fv(location, new Float32Array(pad(n * 2)));\n else if (uniform.type === \"vec3\") {\n const flat =\n paramKind === \"PackedColorArray\" && values.length % 4 === 0\n ? values.filter((_, i) => i % 4 !== 3)\n : values;\n while (flat.length < n * 3) flat.push(0);\n gl.uniform3fv(location, new Float32Array(flat.slice(0, n * 3)));\n } else if (uniform.type === \"vec4\")\n gl.uniform4fv(location, new Float32Array(pad(n * 4)));\n return;\n }\n if (uniform.type === \"float\")\n gl.uniform1f(location, typeof value === \"number\" ? value : 0);\n else if (uniform.type === \"int\" || uniform.type === \"bool\")\n gl.uniform1i(location, typeof value === \"number\" ? Math.round(value) : 0);\n else if (uniform.type === \"vec2\")\n gl.uniform2f(location, values[0] ?? 0, values[1] ?? 0);\n else if (uniform.type === \"vec3\")\n gl.uniform3f(location, values[0] ?? 0, values[1] ?? 0, values[2] ?? 0);\n else if (uniform.type === \"vec4\")\n gl.uniform4f(\n location,\n values[0] ?? 0,\n values[1] ?? 0,\n values[2] ?? 0,\n values[3] ?? 0,\n );\n}\n\nfunction startShader(\n gl: WebGL2RenderingContext,\n type: number,\n source: string,\n): WebGLShader | null {\n const shader = gl.createShader(type);\n if (!shader) return null;\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n return shader;\n}\n\n/** Clear a supplied framebuffer's draw region; callers control its lifetime and binding. */\nexport function clearWebglSurface(\n gl: WebGL2RenderingContext,\n width: number,\n height: number,\n scissorToViewport = false,\n): void {\n gl.viewport(0, 0, width, height);\n if (scissorToViewport) {\n gl.enable(gl.SCISSOR_TEST);\n gl.scissor(0, 0, width, height);\n }\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n if (scissorToViewport) gl.disable(gl.SCISSOR_TEST);\n}\n\n/** Release an owned texture. Borrowed texture handles must not be passed here. */\nexport function deleteWebglTexture(\n gl: WebGL2RenderingContext,\n texture: WebGLTexture | null,\n): void {\n gl.deleteTexture(texture);\n}\n","/**\n * DOM-free effect targets for a canvas stage.\n *\n * This module deliberately accepts an already-created WebGL2 context. It never\n * asks for a canvas, creates an element, or schedules a frame: the caller owns\n * the stage, painter ordering, and clock. The small raw-GLSL and procedural\n * particle subsets below are useful without claiming to be a Godot material or\n * GPUParticles interpreter.\n */\n\nimport {\n createParticleState,\n InstanceBuffer,\n normalizeParticleRenderConfig,\n type ParticleRenderConfig,\n type ParticleSystemState,\n packParticleInstances,\n preprocessParticles,\n simulateParticles,\n} from \"@godot-scene-web/effects/particles\";\nimport {\n type GodotBlendMode,\n type ShaderUniform,\n type TranspiledShader,\n transpileGodotShader,\n UnsupportedShaderError,\n} from \"@godot-scene-web/effects/shaders\";\nimport {\n acquireParticleProgram,\n disposeParticleInstanceBuffer,\n drawParticles,\n invalidateParticleInstanceBuffer,\n type ParticleProgram,\n prepareParticleDraw,\n releaseParticleProgram,\n} from \"./particle-webgl\";\n\nexport {\n blendFactorsFor,\n disposeParticleInstanceBuffer,\n drawParticles,\n getParticleProgram,\n invalidateParticleInstanceBuffer,\n prepareParticleDraw,\n} from \"./particle-webgl\";\nexport {\n clearWebglSurface,\n compileProgram,\n compileProgramAsync,\n createWebglFullscreenQuad,\n createWebglPlaceholderTexture,\n createWebglTexture,\n deleteWebglTexture,\n drawGodotWebglShaderFrame,\n type PendingProgram,\n startProgram,\n uploadGodotShaderUniform,\n uploadWebglTexture,\n type WebglGodotShaderFrame,\n} from \"./shader-webgl\";\n\nexport type HeadlessEffectDiagnosticCode =\n | \"CONTEXT_LOST\"\n | \"DISPOSED\"\n | \"INVALID_DIMENSIONS\"\n | \"INVALID_RENDER_INPUT\"\n | \"RESOURCE_ALLOCATION_FAILED\"\n | \"FRAMEBUFFER_INCOMPLETE\"\n | \"SHADER_COMPILE_FAILED\"\n | \"UNSUPPORTED_SHADER_FEATURE\"\n | \"UNSUPPORTED_PARTICLE_FEATURE\"\n | \"SCREEN_TEXTURE_REQUIRED\"\n | \"FOREIGN_TARGET\";\n\nexport interface HeadlessEffectDiagnostic {\n readonly code: HeadlessEffectDiagnosticCode;\n readonly message: string;\n /** The exact requested capability where a typed producer declines it. */\n readonly feature?: string;\n}\n\nexport type HeadlessEffectResult<T> =\n | { readonly ok: true; readonly value: T }\n | { readonly ok: false; readonly diagnostic: HeadlessEffectDiagnostic };\n\n/** An RGBA8 texture/FBO pair owned by one {@link HeadlessEffectsStage}. */\nexport interface HeadlessEffectTarget {\n readonly texture: WebGLTexture | null;\n readonly framebuffer: WebGLFramebuffer | null;\n readonly width: number;\n readonly height: number;\n}\n\n/** A same-context read-only source. Borrowed cache textures are never deleted by this stage. */\n/** A live texture from this WebGL context. Resource decoding stays with the host. */\nexport interface WebglTextureInput {\n readonly texture: WebGLTexture;\n readonly width: number;\n readonly height: number;\n}\n\nexport type HeadlessTextureInput = HeadlessEffectTarget | WebglTextureInput;\n\n/**\n * The framebuffer supplied by a host at a precise painter position. This is a\n * GPU contract, deliberately free of DrawList and HTML binding objects.\n */\nexport interface WebglEffectTargetContext {\n readonly framebuffer: WebGLFramebuffer | null;\n readonly width: number;\n readonly height: number;\n readonly damage?: unknown;\n readonly scissor: Readonly<{\n x: number;\n y: number;\n width: number;\n height: number;\n }>;\n}\n\nexport type HeadlessShaderFeature =\n | \"screen-texture\"\n | \"time\"\n | \"delta\"\n | \"seed\"\n | \"external-textures\"\n | \"multiple-render-targets\"\n | \"transform-feedback\"\n | \"godot-source\";\n\nexport type HeadlessUniformValue =\n | number\n | readonly [number, number]\n | readonly [number, number, number]\n | readonly [number, number, number, number];\n\n/**\n * A complete GLSL ES 3 fragment pass. It receives `v_uv`; optional uniforms\n * are `u_time`, `u_delta`, `u_seed`, `u_resolution`, and (when declared in\n * `features`) `u_screenTexture`. Application uniforms are numeric scalars or\n * vec2/3/4 values. Other textures and Godot shader-language translation are\n * intentionally refused rather than guessed.\n */\nexport interface HeadlessShaderPass {\n /** Fragment output MUST be premultiplied RGBA, matching the canvas stage contract. */\n readonly fragmentSource: string;\n readonly features?: readonly HeadlessShaderFeature[];\n readonly uniforms?: Readonly<Record<string, HeadlessUniformValue>>;\n}\n\nexport interface HeadlessShaderRenderInput {\n readonly time: number;\n readonly delta: number;\n readonly seed?: number;\n /** Snapshot of the accumulated painter target at this exact caller-selected position. */\n readonly screenTexture?: HeadlessEffectTarget;\n}\n\nexport interface HeadlessShaderProducer {\n readonly target: HeadlessEffectTarget;\n /** Compile and cache the GPU pass before the caller’s frame-critical path. */\n warmUp(): HeadlessEffectResult<void>;\n resize(width: number, height: number): HeadlessEffectResult<void>;\n render(\n input: HeadlessShaderRenderInput,\n ): HeadlessEffectResult<HeadlessEffectTarget>;\n /** Execute by snapshotting an executor's current framebuffer, then replace it. */\n renderScreen(\n input: HeadlessShaderRenderInput,\n context: WebglEffectTargetContext,\n ): HeadlessEffectResult<void>;\n /** Delete ordinary live-context resources; the producer remains reusable. */\n invalidate(): void;\n /** Context-loss only: discard names without issuing GL calls. */\n invalidateContextLoss(): void;\n dispose(): void;\n}\n\n/** Numeric values accepted by the existing Godot shader compiler. */\nexport type HeadlessGodotShaderValue = number | readonly number[];\n\n/**\n * DOM-free inputs for the same canvas_item compiler used by the HTML runtime.\n * Textures deliberately name stage targets, never URLs: loading/decoding is an\n * HTML concern and an unresolved source is a typed refusal instead of a blank\n * approximation.\n */\nexport interface HeadlessGodotShaderPass {\n readonly source: string;\n readonly texture?: HeadlessTextureInput;\n readonly samplers?: Readonly<Record<string, HeadlessTextureInput>>;\n readonly uniforms?: Readonly<Record<string, HeadlessGodotShaderValue>>;\n readonly modulate?: readonly [number, number, number, number];\n readonly uvFit?: readonly [number, number];\n readonly uvWindow?: readonly [number, number, number, number];\n}\n\nexport interface HeadlessGodotShaderRenderInput\n extends HeadlessShaderRenderInput {\n /** Node rect in normalized stage coordinates, for SCREEN_UV. */\n readonly screenRect?: readonly [number, number, number, number];\n}\n\nexport interface HeadlessGodotShaderProducer {\n readonly target: HeadlessEffectTarget;\n /** The source render_mode blend, for the caller's surrounding canvas draw. */\n readonly blend: GodotBlendMode;\n warmUp(): HeadlessEffectResult<void>;\n resize(width: number, height: number): HeadlessEffectResult<void>;\n render(\n input: HeadlessGodotShaderRenderInput,\n ): HeadlessEffectResult<HeadlessEffectTarget>;\n renderScreen(\n input: HeadlessGodotShaderRenderInput,\n context: WebglEffectTargetContext,\n ): HeadlessEffectResult<void>;\n invalidate(): void;\n invalidateContextLoss(): void;\n dispose(): void;\n}\n\nexport interface HeadlessParticleFeatures {\n /** Only a point emitter is implemented in this first reusable GPU path. */\n readonly emissionShape?: \"point\" | \"box\" | \"circle\";\n readonly collision?: boolean;\n readonly attractors?: boolean;\n readonly textureAtlas?: boolean;\n}\n\n/** Deterministic, stateless procedural point-particle subset. */\nexport interface HeadlessParticleParameters {\n readonly maxParticles: number;\n readonly emissionRate: number;\n readonly lifetimeSeconds: number;\n readonly position: readonly [number, number];\n readonly directionRadians: number;\n readonly spreadRadians: number;\n readonly speedMin: number;\n readonly speedMax: number;\n readonly gravity: readonly [number, number];\n /** Straight RGBA 0..1; the GPU pass premultiplies before writing to its target. */\n readonly startColor: readonly [number, number, number, number];\n /** Straight RGBA 0..1; the GPU pass premultiplies before writing to its target. */\n readonly endColor: readonly [number, number, number, number];\n readonly startSizePx: number;\n readonly endSizePx: number;\n readonly features?: HeadlessParticleFeatures;\n}\n\nexport interface HeadlessParticleRenderInput {\n readonly time: number;\n readonly delta: number;\n readonly seed: number;\n}\n\nexport interface HeadlessParticleProducer {\n readonly target: HeadlessEffectTarget;\n /** Compile and cache the GPU pass before the caller’s frame-critical path. */\n warmUp(): HeadlessEffectResult<void>;\n resize(width: number, height: number): HeadlessEffectResult<void>;\n /** Re-evaluates from explicit inputs; it owns neither stateful simulation nor a timer. */\n render(\n input: HeadlessParticleRenderInput,\n ): HeadlessEffectResult<HeadlessEffectTarget>;\n invalidate(): void;\n invalidateContextLoss(): void;\n dispose(): void;\n}\n\n/** Caller-owned semantic storage. Supplying this keeps particle state and bytes reusable across producers. */\nexport interface GodotParticleScratch {\n /** Render-only fields intentionally live beside the portable simulation state. */\n readonly config: ParticleRenderConfig;\n readonly state: ParticleSystemState;\n readonly instances: InstanceBuffer;\n}\n\n/** Allocate reusable, DOM-free simulation and instance storage for a normalized Godot particle spec. */\nexport function createGodotParticleScratch(\n config: ParticleRenderConfig | Partial<ParticleRenderConfig>,\n maxInstances?: number,\n): GodotParticleScratch {\n const normalized = normalizeParticleRenderConfig(config);\n return {\n config: normalized,\n state: createParticleState(normalized, maxInstances),\n instances: new InstanceBuffer(\n Math.max(1, maxInstances ?? normalized.amount),\n ),\n };\n}\n\n/** Explicit live stage textures; no URL decoding, loading, or foreign GL texture ownership is accepted. */\nexport interface HeadlessGodotParticlePass {\n /** Omit when scratch is supplied: then scratch owns the normalized config. */\n readonly config?: ParticleRenderConfig | Partial<ParticleRenderConfig>;\n readonly spriteTexture?: HeadlessTextureInput;\n readonly lutTexture?: HeadlessTextureInput;\n readonly maskTexture?: HeadlessTextureInput;\n /** Declared material capabilities are refused rather than silently approximated. */\n readonly features?: Readonly<{\n collision?: boolean;\n attractors?: boolean;\n trails?: boolean;\n customMaterial?: boolean;\n }>;\n readonly scratch?: GodotParticleScratch;\n}\n\nexport interface HeadlessGodotParticleRenderInput {\n /** Renderer-selected local emitter placement; never part of simulation state. */\n readonly origin?: readonly [number, number];\n readonly time: number;\n readonly delta: number;\n readonly emitting: boolean;\n /** Reset state at this exact caller-selected frame; no producer clock is consulted. */\n readonly restart?: boolean;\n}\n\n/**\n * Per-draw local-to-framebuffer similarity transform in Godot Transform2D\n * order `[xx, xy, yx, yy, originX, originY]`. Omit for identity. A direct\n * particle pass refuses skew and non-uniform scale rather than deforming a\n * sprite whose renderer only has scalar rotation and independent local size.\n */\nexport interface HeadlessGodotParticleDirectRenderInput\n extends HeadlessGodotParticleRenderInput {\n readonly transform?: readonly [\n number,\n number,\n number,\n number,\n number,\n number,\n ];\n /**\n * Straight inherited CanvasItem RGBA. Each component multiplies the matching\n * particle instance component before the shared renderer premultiplies it.\n */\n readonly modulate?: readonly [number, number, number, number];\n}\n\nexport interface HeadlessGodotParticleProducer {\n readonly target: HeadlessEffectTarget;\n readonly scratch: GodotParticleScratch;\n warmUp(): HeadlessEffectResult<void>;\n resize(width: number, height: number): HeadlessEffectResult<void>;\n render(\n input: HeadlessGodotParticleRenderInput,\n ): HeadlessEffectResult<HeadlessEffectTarget>;\n invalidate(): void;\n invalidateContextLoss(): void;\n dispose(): void;\n}\n\n/**\n * A Godot-particle producer that paints into the canvas executor's live target.\n * It allocates no per-system target texture or compositor FBO.\n */\nexport interface HeadlessGodotParticleDirectPass {\n readonly scratch: GodotParticleScratch;\n warmUp(): HeadlessEffectResult<void>;\n draw(\n input: HeadlessGodotParticleDirectRenderInput,\n context: WebglEffectTargetContext,\n ): HeadlessEffectResult<void>;\n invalidate(): void;\n invalidateContextLoss(): void;\n dispose(): void;\n}\n\n/** Explicit painter-position copy of an accumulated target. */\nexport interface HeadlessScreenSampleCommand {\n readonly source: HeadlessEffectTarget;\n readonly destination: HeadlessEffectTarget;\n readonly filter?: \"nearest\" | \"linear\";\n}\n\nexport interface HeadlessEffectsStage {\n readonly gl: WebGL2RenderingContext;\n createShaderProducer(\n pass: HeadlessShaderPass,\n width: number,\n height: number,\n ): HeadlessEffectResult<HeadlessShaderProducer>;\n /** Compile the shared Godot canvas_item semantic engine without DOM ownership. */\n createGodotShaderProducer(\n pass: HeadlessGodotShaderPass,\n width: number,\n height: number,\n ): HeadlessEffectResult<HeadlessGodotShaderProducer>;\n createParticleProducer(\n parameters: HeadlessParticleParameters,\n width: number,\n height: number,\n ): HeadlessEffectResult<HeadlessParticleProducer>;\n createGodotParticleProducer(\n pass: HeadlessGodotParticlePass,\n width: number,\n height: number,\n ): HeadlessEffectResult<HeadlessGodotParticleProducer>;\n /** Create a direct painter pass; it never creates a system target or copy surface. */\n createGodotParticleDirectPass(\n pass: HeadlessGodotParticlePass,\n ): HeadlessEffectResult<HeadlessGodotParticleDirectPass>;\n /**\n * Execute a copy at the call site’s draw-list position. A same-target copy is\n * routed through a stage-owned snapshot, never a read/write feedback loop.\n */\n executeScreenSample(\n command: HeadlessScreenSampleCommand,\n ): HeadlessEffectResult<void>;\n /** Delete ordinary live-context resources; producers remain reusable. */\n invalidate(): void;\n /** Drop dead GL handles after context loss without issuing delete calls. */\n invalidateContextLoss(): void;\n /** Delete every stage-owned GL handle while the context is live. */\n dispose(): void;\n}\n\ninterface MutableTarget extends HeadlessEffectTarget {\n texture: WebGLTexture | null;\n framebuffer: WebGLFramebuffer | null;\n width: number;\n height: number;\n}\n\ninterface ProgramState {\n program: WebGLProgram;\n vao: WebGLVertexArrayObject;\n locations: Map<string, WebGLUniformLocation | null>;\n}\n\nconst FULLSCREEN_VERTEX = `#version 300 es\nout vec2 v_uv;\nconst vec2 POSITIONS[3] = vec2[3](vec2(-1.0, -1.0), vec2(3.0, -1.0), vec2(-1.0, 3.0));\nvoid main() {\n vec2 position = POSITIONS[gl_VertexID];\n v_uv = position * 0.5 + 0.5;\n gl_Position = vec4(position, 0.0, 1.0);\n}`;\n\nconst GODOT_DEFAULT_FIT: readonly [number, number] = [1, 1];\nconst GODOT_DEFAULT_WINDOW: readonly [number, number, number, number] = [\n 0, 0, 1, 1,\n];\nconst GODOT_DEFAULT_MODULATE: readonly [number, number, number, number] = [\n 1, 1, 1, 1,\n];\nconst GODOT_DEFAULT_SCREEN_RECT: readonly [number, number, number, number] = [\n 0, 0, 1, 1,\n];\n\nconst PARTICLE_VERTEX = `#version 300 es\nuniform float u_time;\nuniform float u_delta;\nuniform float u_seed;\nuniform float u_lifetime;\nuniform float u_emission_rate;\nuniform float u_max_particles;\nuniform vec2 u_position;\nuniform float u_direction;\nuniform float u_spread;\nuniform vec2 u_speed;\nuniform vec2 u_gravity;\nuniform vec2 u_resolution;\nuniform vec2 u_size;\nout float v_progress;\nout float v_alive;\nfloat hash(float value) { return fract(sin(value) * 43758.5453123); }\nvoid main() {\n float id = float(gl_VertexID);\n float emission = max(u_emission_rate, 0.0001);\n float active = min(u_max_particles, ceil(emission * u_lifetime));\n float period = active / emission;\n float now = max(0.0, u_time + u_delta);\n float birth = floor((now * emission - id) / active) * period + id / emission;\n float age = now - birth;\n float effectiveLifetime = min(u_lifetime, period);\n float progress = clamp(age / effectiveLifetime, 0.0, 1.0);\n float angle = u_direction + (hash(id + u_seed) - 0.5) * u_spread;\n float speed = mix(u_speed.x, u_speed.y, hash(id * 7.0 + u_seed));\n vec2 velocity = vec2(cos(angle), sin(angle)) * speed;\n vec2 pixel = u_position + velocity * age + 0.5 * u_gravity * age * age;\n vec2 clip = pixel / u_resolution * 2.0 - 1.0;\n gl_Position = vec4(clip * vec2(1.0, -1.0), 0.0, 1.0);\n gl_PointSize = mix(u_size.x, u_size.y, progress);\n v_progress = progress;\n v_alive = step(0.0, birth) * step(0.0, age) * step(age, effectiveLifetime);\n}`;\n\n/** Safe ceiling for the stateless point-particle subset. Larger systems are refused. */\nexport const MAX_HEADLESS_PARTICLES = 16_384;\n\nconst PARTICLE_FRAGMENT = `#version 300 es\nprecision highp float;\nuniform vec4 u_start_color;\nuniform vec4 u_end_color;\nin float v_progress;\nin float v_alive;\nout vec4 fragColor;\nvoid main() {\n if (v_alive < 0.5) discard;\n vec2 centered = gl_PointCoord * 2.0 - 1.0;\n float coverage = smoothstep(1.0, 0.7, dot(centered, centered));\n vec4 color = mix(u_start_color, u_end_color, v_progress);\n fragColor = vec4(color.rgb * color.a, color.a) * coverage;\n}`;\n\nfunction ok<T>(value: T): HeadlessEffectResult<T> {\n return { ok: true, value };\n}\n\nfunction fail<T>(\n code: HeadlessEffectDiagnosticCode,\n message: string,\n feature?: string,\n): HeadlessEffectResult<T> {\n return { ok: false, diagnostic: { code, message, feature } };\n}\n\nfunction targetDimensions(\n width: number,\n height: number,\n): [number, number] | null {\n if (\n !Number.isFinite(width) ||\n !Number.isFinite(height) ||\n width <= 0 ||\n height <= 0\n ) {\n return null;\n }\n return [Math.max(1, Math.round(width)), Math.max(1, Math.round(height))];\n}\n\ninterface DirectParticleTransform {\n readonly xx: number;\n readonly xy: number;\n readonly yx: number;\n readonly yy: number;\n readonly originX: number;\n readonly originY: number;\n readonly scale: number;\n readonly rotation: number;\n}\n\nfunction directParticleTransform(\n transform: HeadlessGodotParticleDirectRenderInput[\"transform\"],\n): DirectParticleTransform | null {\n const values = transform ?? [1, 0, 0, 1, 0, 0];\n if (!values.every(Number.isFinite)) return null;\n const [xx, xy, yx, yy, originX, originY] = values;\n const xLength = Math.hypot(xx, xy);\n const yLength = Math.hypot(yx, yy);\n const tolerance = Math.max(1, xLength * yLength) * 1e-6;\n if (\n xLength <= 1e-9 ||\n Math.abs(xLength - yLength) > tolerance ||\n Math.abs(xx * yx + xy * yy) > tolerance ||\n xx * yy - xy * yx <= 0\n )\n return null;\n return {\n xx,\n xy,\n yx,\n yy,\n originX,\n originY,\n scale: xLength,\n rotation: Math.atan2(xy, xx),\n };\n}\n\nfunction directParticleModulate(\n modulate: HeadlessGodotParticleDirectRenderInput[\"modulate\"],\n): readonly [number, number, number, number] | null {\n const value = modulate ?? [1, 1, 1, 1];\n return value.every(Number.isFinite)\n ? [value[0], value[1], value[2], value[3]]\n : null;\n}\n\nfunction compileProgram(\n gl: WebGL2RenderingContext,\n vertexSource: string,\n fragmentSource: string,\n): HeadlessEffectResult<ProgramState> {\n const vertex = gl.createShader(gl.VERTEX_SHADER);\n const fragment = gl.createShader(gl.FRAGMENT_SHADER);\n if (!vertex || !fragment) {\n if (vertex) gl.deleteShader(vertex);\n if (fragment) gl.deleteShader(fragment);\n return fail(\n \"RESOURCE_ALLOCATION_FAILED\",\n \"WebGL could not allocate an effect shader.\",\n );\n }\n gl.shaderSource(vertex, vertexSource);\n gl.shaderSource(fragment, fragmentSource);\n gl.compileShader(vertex);\n gl.compileShader(fragment);\n if (\n !gl.getShaderParameter(vertex, gl.COMPILE_STATUS) ||\n !gl.getShaderParameter(fragment, gl.COMPILE_STATUS)\n ) {\n const log =\n gl.getShaderInfoLog(vertex) ||\n gl.getShaderInfoLog(fragment) ||\n \"unknown compiler error\";\n gl.deleteShader(vertex);\n gl.deleteShader(fragment);\n return fail(\"SHADER_COMPILE_FAILED\", log);\n }\n const program = gl.createProgram();\n if (!program) {\n gl.deleteShader(vertex);\n gl.deleteShader(fragment);\n return fail(\n \"RESOURCE_ALLOCATION_FAILED\",\n \"WebGL could not allocate an effect program.\",\n );\n }\n gl.attachShader(program, vertex);\n gl.attachShader(program, fragment);\n gl.linkProgram(program);\n gl.deleteShader(vertex);\n gl.deleteShader(fragment);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n const log = gl.getProgramInfoLog(program) || \"unknown linker error\";\n gl.deleteProgram(program);\n return fail(\"SHADER_COMPILE_FAILED\", log);\n }\n const vao = gl.createVertexArray();\n if (!vao) {\n gl.deleteProgram(program);\n return fail(\n \"RESOURCE_ALLOCATION_FAILED\",\n \"WebGL could not allocate an effect vertex array.\",\n );\n }\n return ok({ program, vao, locations: new Map() });\n}\n\nfunction destroyProgram(\n gl: WebGL2RenderingContext,\n program: ProgramState | null,\n): void {\n if (!program) return;\n gl.deleteVertexArray(program.vao);\n gl.deleteProgram(program.program);\n}\n\nfunction shaderDiagnostic(\n pass: HeadlessShaderPass,\n): HeadlessEffectDiagnostic | null {\n const known = new Set<string>([\n \"screen-texture\",\n \"time\",\n \"delta\",\n \"seed\",\n \"external-textures\",\n \"multiple-render-targets\",\n \"transform-feedback\",\n \"godot-source\",\n ]);\n const seen = new Set<string>();\n for (const feature of pass.features ?? []) {\n if (!known.has(feature))\n return {\n code: \"UNSUPPORTED_SHADER_FEATURE\",\n message: `Unknown headless shader capability ${feature}.`,\n feature,\n };\n if (seen.has(feature))\n return {\n code: \"UNSUPPORTED_SHADER_FEATURE\",\n message: `Duplicate headless shader capability ${feature}.`,\n feature,\n };\n seen.add(feature);\n }\n for (const [name, value] of Object.entries(pass.uniforms ?? {})) {\n const components = typeof value === \"number\" ? [value] : value;\n if (\n !/^[_a-zA-Z][_a-zA-Z0-9]*$/.test(name) ||\n (typeof value !== \"number\" && (value.length < 2 || value.length > 4)) ||\n !Array.from(components).every(Number.isFinite)\n ) {\n return {\n code: \"UNSUPPORTED_SHADER_FEATURE\",\n message:\n \"Shader uniform names and values must be finite GLSL scalar/vector values.\",\n feature: `uniform:${name}`,\n };\n }\n }\n const unsupported = new Set<HeadlessShaderFeature>([\n \"external-textures\",\n \"multiple-render-targets\",\n \"transform-feedback\",\n \"godot-source\",\n ]);\n const requested = pass.features?.find((feature) => unsupported.has(feature));\n if (requested) {\n return {\n code: \"UNSUPPORTED_SHADER_FEATURE\",\n message: `Headless shader passes do not support ${requested}.`,\n feature: requested,\n };\n }\n if (\n !/^\\s*#version\\s+300\\s+es\\b/m.test(pass.fragmentSource) ||\n !/\\bvoid\\s+main\\s*\\(/.test(pass.fragmentSource)\n ) {\n return {\n code: \"UNSUPPORTED_SHADER_FEATURE\",\n message:\n \"A headless shader pass must be a complete GLSL ES 3 fragment shader.\",\n feature: \"raw-glsl300es\",\n };\n }\n const samplers = [\n ...pass.fragmentSource.matchAll(/uniform\\s+sampler\\w+\\s+(\\w+)/g),\n ].map((match) => match[1]);\n if (samplers.some((name) => name !== \"u_screenTexture\")) {\n return {\n code: \"UNSUPPORTED_SHADER_FEATURE\",\n message:\n \"Only the explicit u_screenTexture sampler is supported by this headless pass.\",\n feature: \"external-textures\",\n };\n }\n if (\n samplers.includes(\"u_screenTexture\") &&\n !pass.features?.includes(\"screen-texture\")\n ) {\n return {\n code: \"UNSUPPORTED_SHADER_FEATURE\",\n message:\n \"u_screenTexture requires the explicit screen-texture capability declaration.\",\n feature: \"screen-texture\",\n };\n }\n return null;\n}\n\nfunction particleDiagnostic(\n parameters: HeadlessParticleParameters,\n): HeadlessEffectDiagnostic | null {\n const features = parameters.features;\n if (features?.emissionShape && features.emissionShape !== \"point\") {\n return {\n code: \"UNSUPPORTED_PARTICLE_FEATURE\",\n message: \"Only point particle emission is supported.\",\n feature: `emissionShape:${features.emissionShape}`,\n };\n }\n for (const feature of [\"collision\", \"attractors\", \"textureAtlas\"] as const) {\n if (features?.[feature]) {\n return {\n code: \"UNSUPPORTED_PARTICLE_FEATURE\",\n message: `Particle ${feature} is not supported by the stateless headless path.`,\n feature,\n };\n }\n }\n const numbers = [\n parameters.maxParticles,\n parameters.emissionRate,\n parameters.lifetimeSeconds,\n parameters.position[0],\n parameters.position[1],\n parameters.directionRadians,\n parameters.spreadRadians,\n parameters.speedMin,\n parameters.speedMax,\n parameters.gravity[0],\n parameters.gravity[1],\n parameters.startSizePx,\n parameters.endSizePx,\n ...parameters.startColor,\n ...parameters.endColor,\n ];\n if (!numbers.every(Number.isFinite)) {\n return {\n code: \"UNSUPPORTED_PARTICLE_FEATURE\",\n message: \"Particle parameters must all be finite numbers.\",\n feature: \"parameters\",\n };\n }\n if (\n !Number.isInteger(parameters.maxParticles) ||\n parameters.maxParticles <= 0 ||\n parameters.maxParticles > MAX_HEADLESS_PARTICLES ||\n parameters.emissionRate <= 0 ||\n parameters.lifetimeSeconds <= 0 ||\n parameters.speedMin < 0 ||\n parameters.speedMax < parameters.speedMin ||\n parameters.startSizePx < 0 ||\n parameters.endSizePx < 0 ||\n parameters.startColor.some((value) => value < 0 || value > 1) ||\n parameters.endColor.some((value) => value < 0 || value > 1)\n ) {\n return {\n code: \"UNSUPPORTED_PARTICLE_FEATURE\",\n message: \"Particle counts, emission rate, and lifetime must be positive.\",\n feature: \"parameters\",\n };\n }\n return null;\n}\n\nfunction renderInputDiagnostic(\n input: HeadlessShaderRenderInput | HeadlessParticleRenderInput,\n): HeadlessEffectDiagnostic | null {\n if (\n !Number.isFinite(input.time) ||\n !Number.isFinite(input.delta) ||\n input.time < 0 ||\n input.delta < 0 ||\n (\"seed\" in input &&\n input.seed !== undefined &&\n !Number.isFinite(input.seed))\n ) {\n return {\n code: \"INVALID_RENDER_INPUT\",\n message:\n \"Effect time, delta, and seed must be finite; time and delta must be non-negative.\",\n feature: \"render-input\",\n };\n }\n return null;\n}\n\nfunction applyGodotBlend(\n gl: WebGL2RenderingContext,\n blend: GodotBlendMode,\n): void {\n gl.enable(gl.BLEND);\n if (blend === \"sub\") {\n gl.blendEquationSeparate(gl.FUNC_REVERSE_SUBTRACT, gl.FUNC_ADD);\n gl.blendFuncSeparate(gl.ONE, gl.ONE, gl.ONE, gl.ONE);\n return;\n }\n gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD);\n if (blend === \"add\") {\n gl.blendFuncSeparate(gl.ONE, gl.ONE, gl.ONE, gl.ONE);\n return;\n }\n if (blend === \"mul\") {\n gl.blendFuncSeparate(gl.DST_COLOR, gl.ZERO, gl.DST_ALPHA, gl.ZERO);\n return;\n }\n gl.blendFuncSeparate(\n gl.ONE,\n gl.ONE_MINUS_SRC_ALPHA,\n gl.ONE,\n gl.ONE_MINUS_SRC_ALPHA,\n );\n}\n\n/** Create a DOM-free owner for effect FBOs and their ordered GPU passes. */\nexport function createHeadlessEffectsStage(\n gl: WebGL2RenderingContext,\n): HeadlessEffectsStage {\n const targets = new Set<MutableTarget>();\n const invalidatables = new Set<{\n invalidate(): void;\n invalidateContextLoss(): void;\n dispose(): void;\n }>();\n let disposed = false;\n let snapshot: MutableTarget | null = null;\n let opaqueWhite: MutableTarget | null = null;\n let opaqueWhiteFilled = false;\n let opaqueWhiteResult: HeadlessEffectResult<MutableTarget> | null = null;\n\n function state<T>(): HeadlessEffectResult<T> | null {\n if (disposed)\n return fail(\"DISPOSED\", \"The headless effects stage has been disposed.\");\n if (gl.isContextLost())\n return fail(\n \"CONTEXT_LOST\",\n \"The WebGL context is lost; invalidate and wait for restoration.\",\n );\n return null;\n }\n\n function makeTarget(): MutableTarget {\n const target: MutableTarget = {\n texture: null,\n framebuffer: null,\n width: 0,\n height: 0,\n };\n targets.add(target);\n return target;\n }\n\n function discardTarget(target: MutableTarget, callGl: boolean): void {\n if (callGl) {\n if (target.framebuffer) gl.deleteFramebuffer(target.framebuffer);\n if (target.texture) gl.deleteTexture(target.texture);\n }\n target.texture = null;\n target.framebuffer = null;\n target.width = 0;\n target.height = 0;\n }\n\n function resizeTarget(\n target: MutableTarget,\n width: number,\n height: number,\n ): HeadlessEffectResult<void> {\n const current = state<void>();\n if (current) return current;\n const dimensions = targetDimensions(width, height);\n if (!dimensions)\n return fail(\n \"INVALID_DIMENSIONS\",\n \"Effect targets need finite dimensions greater than zero.\",\n );\n const [nextWidth, nextHeight] = dimensions;\n if (\n target.texture &&\n target.framebuffer &&\n target.width === nextWidth &&\n target.height === nextHeight\n )\n return ok(undefined);\n const texture = gl.createTexture();\n const framebuffer = gl.createFramebuffer();\n if (!texture || !framebuffer) {\n if (texture) gl.deleteTexture(texture);\n if (framebuffer) gl.deleteFramebuffer(framebuffer);\n return fail(\n \"RESOURCE_ALLOCATION_FAILED\",\n \"WebGL could not allocate an RGBA8 effect target.\",\n );\n }\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA8,\n nextWidth,\n nextHeight,\n 0,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n null,\n );\n gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n texture,\n 0,\n );\n const complete =\n gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE;\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n if (!complete) {\n gl.deleteFramebuffer(framebuffer);\n gl.deleteTexture(texture);\n return fail(\n \"FRAMEBUFFER_INCOMPLETE\",\n \"WebGL rejected the RGBA8 effect framebuffer.\",\n );\n }\n discardTarget(target, true);\n target.texture = texture;\n target.framebuffer = framebuffer;\n target.width = nextWidth;\n target.height = nextHeight;\n return ok(undefined);\n }\n\n function copy(\n source: MutableTarget,\n destination: MutableTarget,\n filter: \"nearest\" | \"linear\",\n ): void {\n const previousRead = gl.getParameter(\n gl.READ_FRAMEBUFFER_BINDING,\n ) as WebGLFramebuffer | null;\n const previousDraw = gl.getParameter(\n gl.DRAW_FRAMEBUFFER_BINDING,\n ) as WebGLFramebuffer | null;\n try {\n gl.disable(gl.SCISSOR_TEST);\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, source.framebuffer);\n gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, destination.framebuffer);\n gl.blitFramebuffer(\n 0,\n 0,\n source.width,\n source.height,\n 0,\n 0,\n destination.width,\n destination.height,\n gl.COLOR_BUFFER_BIT,\n filter === \"linear\" ? gl.LINEAR : gl.NEAREST,\n );\n } finally {\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, previousRead);\n gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, previousDraw);\n }\n }\n\n function snapshotFor(\n target: MutableTarget,\n ): HeadlessEffectResult<MutableTarget> {\n if (!snapshot) snapshot = makeTarget();\n const resized = resizeTarget(snapshot, target.width, target.height);\n if (!resized.ok) return resized;\n copy(target, snapshot, \"nearest\");\n return ok(snapshot);\n }\n\n /** A stage-owned, opaque TEXTURE fallback for ColorRect/pure-fill shaders. */\n function whiteTarget(): HeadlessEffectResult<MutableTarget> {\n if (!opaqueWhite) opaqueWhite = makeTarget();\n if (!opaqueWhite.texture || !opaqueWhite.framebuffer) {\n const resized = resizeTarget(opaqueWhite, 1, 1);\n if (!resized.ok) return resized;\n opaqueWhiteFilled = false;\n }\n if (opaqueWhiteFilled && opaqueWhiteResult) return opaqueWhiteResult;\n const previous = gl.getParameter(\n gl.FRAMEBUFFER_BINDING,\n ) as WebGLFramebuffer | null;\n try {\n gl.bindFramebuffer(gl.FRAMEBUFFER, opaqueWhite.framebuffer);\n gl.viewport(0, 0, 1, 1);\n gl.disable(gl.SCISSOR_TEST);\n gl.clearColor(1, 1, 1, 1);\n gl.clear(gl.COLOR_BUFFER_BIT);\n opaqueWhiteFilled = true;\n opaqueWhiteResult = ok(opaqueWhite);\n } finally {\n gl.bindFramebuffer(gl.FRAMEBUFFER, previous);\n }\n return ok(opaqueWhite);\n }\n\n function snapshotFramebuffer(\n framebuffer: WebGLFramebuffer | null,\n width: number,\n height: number,\n ): HeadlessEffectResult<MutableTarget> {\n if (!snapshot) snapshot = makeTarget();\n const resized = resizeTarget(snapshot, width, height);\n if (!resized.ok) return resized;\n const previousRead = gl.getParameter(\n gl.READ_FRAMEBUFFER_BINDING,\n ) as WebGLFramebuffer | null;\n const previousDraw = gl.getParameter(\n gl.DRAW_FRAMEBUFFER_BINDING,\n ) as WebGLFramebuffer | null;\n try {\n gl.disable(gl.SCISSOR_TEST);\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, framebuffer);\n gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, snapshot.framebuffer);\n gl.blitFramebuffer(\n 0,\n 0,\n width,\n height,\n 0,\n 0,\n width,\n height,\n gl.COLOR_BUFFER_BIT,\n gl.NEAREST,\n );\n } finally {\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, previousRead);\n gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, previousDraw);\n }\n return ok(snapshot);\n }\n\n function targetFor(value: HeadlessEffectTarget): MutableTarget | null {\n return targets.has(value as MutableTarget)\n ? (value as MutableTarget)\n : null;\n }\n\n interface TextureBinding {\n readonly texture: WebGLTexture;\n readonly width: number;\n readonly height: number;\n readonly owned: MutableTarget | null;\n }\n\n function textureInputFor(value: HeadlessTextureInput): TextureBinding | null {\n const owned = targetFor(value as HeadlessEffectTarget);\n if (owned?.texture && owned.width > 0 && owned.height > 0)\n return {\n texture: owned.texture,\n width: owned.width,\n height: owned.height,\n owned,\n };\n const borrowed = value as WebglTextureInput;\n if (\n !borrowed.texture ||\n !Number.isFinite(borrowed.width) ||\n !Number.isFinite(borrowed.height) ||\n borrowed.width <= 0 ||\n borrowed.height <= 0\n )\n return null;\n return {\n texture: borrowed.texture,\n width: borrowed.width,\n height: borrowed.height,\n owned: null,\n };\n }\n\n function uniformLocation(\n program: ProgramState,\n name: string,\n ): WebGLUniformLocation | null {\n const known = program.locations.get(name);\n if (known !== undefined) return known;\n if (program.locations.has(name)) return null;\n const location = gl.getUniformLocation(program.program, name);\n program.locations.set(name, location);\n return location;\n }\n\n function applyUniform(\n program: ProgramState,\n name: string,\n value: HeadlessUniformValue,\n ): void {\n const location = uniformLocation(program, name);\n if (location === null) return;\n if (typeof value === \"number\") gl.uniform1f(location, value);\n else if (value.length === 2) gl.uniform2f(location, value[0], value[1]);\n else if (value.length === 3)\n gl.uniform3f(location, value[0], value[1], value[2]);\n else gl.uniform4f(location, value[0], value[1], value[2], value[3]);\n }\n\n function createShaderProducer(\n pass: HeadlessShaderPass,\n width: number,\n height: number,\n ): HeadlessEffectResult<HeadlessShaderProducer> {\n const invalid = state<HeadlessShaderProducer>();\n if (invalid) return invalid;\n const diagnostic = shaderDiagnostic(pass);\n if (diagnostic) return { ok: false, diagnostic };\n const target = makeTarget();\n const allocated = resizeTarget(target, width, height);\n if (!allocated.ok) {\n targets.delete(target);\n return allocated;\n }\n let requestedWidth = target.width;\n let requestedHeight = target.height;\n const resolution: [number, number] = [target.width, target.height];\n const uniformEntries = Object.entries(pass.uniforms ?? {});\n const rendered = ok<HeadlessEffectTarget>(target);\n let program: ProgramState | null = null;\n let producerDisposed = false;\n const needsScreen = pass.features?.includes(\"screen-texture\") === true;\n function ensureProgram(): HeadlessEffectResult<ProgramState> {\n if (program) return ok(program);\n const compiled = compileProgram(\n gl,\n FULLSCREEN_VERTEX,\n pass.fragmentSource,\n );\n if (compiled.ok) program = compiled.value;\n return compiled;\n }\n const producer: HeadlessShaderProducer = {\n target,\n warmUp() {\n const current = state<void>();\n if (current) return current;\n if (producerDisposed)\n return fail(\"DISPOSED\", \"The shader producer has been disposed.\");\n const ready = ensureProgram();\n return ready.ok ? ok(undefined) : ready;\n },\n resize(nextWidth, nextHeight) {\n if (producerDisposed)\n return fail(\"DISPOSED\", \"The shader producer has been disposed.\");\n const resized = resizeTarget(target, nextWidth, nextHeight);\n if (resized.ok) {\n requestedWidth = target.width;\n requestedHeight = target.height;\n resolution[0] = target.width;\n resolution[1] = target.height;\n }\n return resized;\n },\n render(input) {\n const inputDiagnostic = renderInputDiagnostic(input);\n if (inputDiagnostic) return { ok: false, diagnostic: inputDiagnostic };\n const current = state<HeadlessEffectTarget>();\n if (current) return current;\n if (producerDisposed)\n return fail(\"DISPOSED\", \"The shader producer has been disposed.\");\n if (!target.texture || !target.framebuffer) {\n const reallocated = resizeTarget(\n target,\n requestedWidth,\n requestedHeight,\n );\n if (!reallocated.ok) return reallocated;\n }\n let screen: MutableTarget | null = null;\n if (needsScreen) {\n if (!input.screenTexture)\n return fail(\n \"SCREEN_TEXTURE_REQUIRED\",\n \"This shader pass declared screen-texture but no accumulated target was supplied.\",\n );\n screen = targetFor(input.screenTexture);\n if (!screen?.texture || !screen.framebuffer)\n return fail(\n \"FOREIGN_TARGET\",\n \"screenTexture must be a live target owned by this headless effects stage.\",\n );\n if (screen === target) {\n const captured = snapshotFor(screen);\n if (!captured.ok) return captured;\n screen = captured.value;\n }\n }\n const ready = ensureProgram();\n if (!ready.ok) return ready;\n const previousFramebuffer = gl.getParameter(\n gl.FRAMEBUFFER_BINDING,\n ) as WebGLFramebuffer | null;\n try {\n gl.bindFramebuffer(gl.FRAMEBUFFER, target.framebuffer);\n gl.viewport(0, 0, target.width, target.height);\n gl.disable(gl.SCISSOR_TEST);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n gl.useProgram(ready.value.program);\n gl.bindVertexArray(ready.value.vao);\n applyUniform(ready.value, \"u_time\", input.time);\n applyUniform(ready.value, \"u_delta\", input.delta);\n applyUniform(ready.value, \"u_seed\", input.seed ?? 0);\n applyUniform(ready.value, \"u_resolution\", resolution);\n for (const [name, value] of uniformEntries)\n applyUniform(ready.value, name, value);\n if (screen) {\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, screen.texture);\n const location = uniformLocation(ready.value, \"u_screenTexture\");\n if (location) gl.uniform1i(location, 0);\n }\n gl.drawArrays(gl.TRIANGLES, 0, 3);\n gl.bindVertexArray(null);\n return rendered;\n } finally {\n gl.bindFramebuffer(gl.FRAMEBUFFER, previousFramebuffer);\n }\n },\n renderScreen(input, context) {\n const inputDiagnostic = renderInputDiagnostic(input);\n if (inputDiagnostic) return { ok: false, diagnostic: inputDiagnostic };\n if (!needsScreen)\n return fail(\n \"UNSUPPORTED_SHADER_FEATURE\",\n \"Only a screen-texture pass can be recorded as a screen effect.\",\n \"screen-texture\",\n );\n if (context.damage)\n return fail(\n \"UNSUPPORTED_SHADER_FEATURE\",\n \"Screen-dependent effects decline partial damage execution.\",\n \"partial-damage\",\n );\n const resized = producer.resize(context.width, context.height);\n if (!resized.ok) return resized;\n const captured = snapshotFramebuffer(\n context.framebuffer,\n context.width,\n context.height,\n );\n if (!captured.ok) return captured;\n const renderedScreen = producer.render({\n time: input.time,\n delta: input.delta,\n seed: input.seed,\n screenTexture: captured.value,\n });\n if (!renderedScreen.ok) return renderedScreen;\n const previousRead = gl.getParameter(\n gl.READ_FRAMEBUFFER_BINDING,\n ) as WebGLFramebuffer | null;\n const previousDraw = gl.getParameter(\n gl.DRAW_FRAMEBUFFER_BINDING,\n ) as WebGLFramebuffer | null;\n try {\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, target.framebuffer);\n gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, context.framebuffer);\n // A screen pass is a full-target replacement, but its active canvas\n // clip still bounds where that replacement may write.\n gl.enable(gl.SCISSOR_TEST);\n gl.scissor(\n context.scissor.x,\n context.scissor.y,\n context.scissor.width,\n context.scissor.height,\n );\n gl.blitFramebuffer(\n 0,\n 0,\n target.width,\n target.height,\n 0,\n 0,\n context.width,\n context.height,\n gl.COLOR_BUFFER_BIT,\n gl.NEAREST,\n );\n } finally {\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, previousRead);\n gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, previousDraw);\n }\n return ok(undefined);\n },\n invalidate() {\n destroyProgram(gl, program);\n program = null;\n discardTarget(target, true);\n },\n invalidateContextLoss() {\n program = null;\n discardTarget(target, false);\n },\n dispose() {\n if (!producerDisposed) {\n producerDisposed = true;\n destroyProgram(gl, program);\n program = null;\n discardTarget(target, true);\n targets.delete(target);\n invalidatables.delete(producer);\n }\n },\n };\n invalidatables.add(producer);\n return ok(producer);\n }\n\n function createGodotShaderProducer(\n pass: HeadlessGodotShaderPass,\n width: number,\n height: number,\n ): HeadlessEffectResult<HeadlessGodotShaderProducer> {\n const invalid = state<HeadlessGodotShaderProducer>();\n if (invalid) return invalid;\n let transpiled: TranspiledShader;\n try {\n transpiled = transpileGodotShader(pass.source);\n } catch (error) {\n return fail(\n \"UNSUPPORTED_SHADER_FEATURE\",\n error instanceof UnsupportedShaderError\n ? error.message\n : `Godot shader transpilation failed: ${error instanceof Error ? error.message : String(error)}`,\n \"godot-source\",\n );\n }\n const suppliedSamplers = { ...(pass.samplers ?? {}) };\n for (const sampler of transpiled.samplers) {\n if (!suppliedSamplers[sampler.name])\n return fail(\n \"UNSUPPORTED_SHADER_FEATURE\",\n `Godot sampler ${sampler.name} needs an explicit stage-owned target.`,\n `sampler:${sampler.name}`,\n );\n if (sampler.repeat)\n return fail(\n \"UNSUPPORTED_SHADER_FEATURE\",\n `Godot sampler ${sampler.name} requests repeat sampling, which stage targets cannot mutate.`,\n `sampler:${sampler.name}:repeat`,\n );\n }\n for (const uniform of transpiled.uniforms) {\n if (\n uniform.arrayLength ||\n ![\"float\", \"int\", \"bool\", \"vec2\", \"vec3\", \"vec4\"].includes(uniform.type)\n )\n return fail(\n \"UNSUPPORTED_SHADER_FEATURE\",\n `Godot uniform ${uniform.name} (${uniform.type}) is not supported headlessly.`,\n `uniform:${uniform.name}`,\n );\n }\n const componentCount = (type: string): number =>\n type === \"vec2\" ? 2 : type === \"vec3\" ? 3 : type === \"vec4\" ? 4 : 1;\n const uniformValues: Record<string, HeadlessGodotShaderValue> = {};\n for (const uniform of transpiled.uniforms) {\n const raw = pass.uniforms?.[uniform.name] ?? uniform.default;\n if (raw === undefined) continue;\n const expected = componentCount(uniform.type);\n const values = typeof raw === \"number\" ? null : raw;\n if (\n (expected === 1 && typeof raw !== \"number\") ||\n (expected !== 1 && (!values || values.length !== expected)) ||\n (typeof raw === \"number\" && !Number.isFinite(raw)) ||\n (values && !values.every(Number.isFinite))\n )\n return fail(\n \"UNSUPPORTED_SHADER_FEATURE\",\n `Godot uniform ${uniform.name} must be ${expected} finite numeric component${expected === 1 ? \"\" : \"s\"}.`,\n `uniform:${uniform.name}`,\n );\n uniformValues[uniform.name] = typeof raw === \"number\" ? raw : [...raw];\n }\n const fit: [number, number] = [...(pass.uvFit ?? GODOT_DEFAULT_FIT)];\n const window: [number, number, number, number] = [\n ...(pass.uvWindow ?? GODOT_DEFAULT_WINDOW),\n ];\n const modulate: [number, number, number, number] = [\n ...(pass.modulate ?? GODOT_DEFAULT_MODULATE),\n ];\n if (\n !fit.every(Number.isFinite) ||\n !window.every(Number.isFinite) ||\n !modulate.every(Number.isFinite)\n )\n return fail(\n \"UNSUPPORTED_SHADER_FEATURE\",\n \"Godot shader fit, window, and modulate values must be finite.\",\n \"render-parameters\",\n );\n const target = makeTarget();\n const allocated = resizeTarget(target, width, height);\n if (!allocated.ok) {\n targets.delete(target);\n return allocated;\n }\n let requestedWidth = target.width;\n let requestedHeight = target.height;\n let program: ProgramState | null = null;\n let producerDisposed = false;\n const rendered = ok<HeadlessEffectTarget>(target);\n const noScreen = ok<MutableTarget | null>(null);\n const texturePixelSize: [number, number] = [1, 1];\n const screenPixelSize: [number, number] = [1, 1];\n const screenOrigin: [number, number] = [0, 0];\n const screenSize: [number, number] = [1, 1];\n const ensureProgram = (): HeadlessEffectResult<ProgramState> => {\n if (program) return ok(program);\n const compiled = compileProgram(\n gl,\n FULLSCREEN_VERTEX,\n transpiled.fragmentGlsl,\n );\n if (compiled.ok) program = compiled.value;\n return compiled;\n };\n const stageTarget = (\n value: HeadlessTextureInput | undefined,\n label: string,\n ): HeadlessEffectResult<TextureBinding | null> => {\n if (!value) return ok(null);\n const texture = textureInputFor(value);\n return texture\n ? ok(texture)\n : fail(\n \"FOREIGN_TARGET\",\n `${label} must be a live same-context stage target or texture handle.`,\n );\n };\n const suppliedTexture = stageTarget(pass.texture, \"TEXTURE\");\n if (!suppliedTexture.ok) {\n discardTarget(target, true);\n targets.delete(target);\n return suppliedTexture;\n }\n const baseTexture = suppliedTexture.value;\n const samplerTargets: TextureBinding[] = [];\n for (const sampler of transpiled.samplers) {\n const supplied = stageTarget(\n suppliedSamplers[sampler.name],\n `sampler:${sampler.name}`,\n );\n if (!supplied.ok || !supplied.value) {\n discardTarget(target, true);\n targets.delete(target);\n return supplied.ok\n ? fail(\n \"UNSUPPORTED_SHADER_FEATURE\",\n `Godot sampler ${sampler.name} needs an explicit target.`,\n `sampler:${sampler.name}`,\n )\n : supplied;\n }\n samplerTargets.push(supplied.value);\n }\n const applyGodotUniform = (\n p: ProgramState,\n uniform: ShaderUniform,\n ): void => {\n const raw = uniformValues[uniform.name];\n const loc = uniformLocation(p, uniform.name);\n if (!loc) return;\n if (typeof raw === \"number\") {\n if (uniform.type === \"float\") gl.uniform1f(loc, raw);\n else if (uniform.type === \"int\" || uniform.type === \"bool\")\n gl.uniform1i(loc, Math.round(raw));\n return;\n }\n const values = raw ?? [];\n if (uniform.type === \"float\") gl.uniform1f(loc, 0);\n else if (uniform.type === \"int\" || uniform.type === \"bool\")\n gl.uniform1i(loc, 0);\n else if (uniform.type === \"vec2\")\n gl.uniform2f(loc, values[0] ?? 0, values[1] ?? 0);\n else if (uniform.type === \"vec3\")\n gl.uniform3f(loc, values[0] ?? 0, values[1] ?? 0, values[2] ?? 0);\n else\n gl.uniform4f(\n loc,\n values[0] ?? 0,\n values[1] ?? 0,\n values[2] ?? 0,\n values[3] ?? 0,\n );\n };\n const liveDependencies = ok(undefined);\n const dependenciesLive = (): HeadlessEffectResult<void> => {\n if (\n baseTexture &&\n (baseTexture.owned\n ? !targets.has(baseTexture.owned) ||\n !baseTexture.owned.texture ||\n !baseTexture.owned.framebuffer\n : typeof gl.isTexture === \"function\" &&\n !gl.isTexture(baseTexture.texture))\n )\n return fail(\n \"FOREIGN_TARGET\",\n \"A Godot shader dependency is no longer a live stage-owned target.\",\n \"dependency\",\n );\n for (let i = 0; i < samplerTargets.length; i += 1) {\n const dependency = samplerTargets[i];\n if (\n dependency.owned\n ? !targets.has(dependency.owned) ||\n !dependency.owned.texture ||\n !dependency.owned.framebuffer\n : typeof gl.isTexture === \"function\" &&\n !gl.isTexture(dependency.texture)\n )\n return fail(\n \"FOREIGN_TARGET\",\n \"A Godot shader dependency is no longer a live stage-owned target.\",\n \"dependency\",\n );\n }\n return liveDependencies;\n };\n const producer: HeadlessGodotShaderProducer = {\n target,\n blend: transpiled.blend,\n warmUp() {\n const current = state<void>();\n if (current) return current;\n if (producerDisposed)\n return fail(\n \"DISPOSED\",\n \"The Godot shader producer has been disposed.\",\n );\n const ready = ensureProgram();\n return ready.ok ? ok(undefined) : ready;\n },\n resize(nextWidth, nextHeight) {\n if (producerDisposed)\n return fail(\n \"DISPOSED\",\n \"The Godot shader producer has been disposed.\",\n );\n const resized = resizeTarget(target, nextWidth, nextHeight);\n if (resized.ok) {\n requestedWidth = target.width;\n requestedHeight = target.height;\n }\n return resized;\n },\n render(input) {\n const inputDiagnostic = renderInputDiagnostic(input);\n if (inputDiagnostic) return { ok: false, diagnostic: inputDiagnostic };\n if (input.screenRect && !input.screenRect.every(Number.isFinite))\n return fail(\n \"INVALID_RENDER_INPUT\",\n \"Godot screenRect values must be finite.\",\n \"screen-rect\",\n );\n const current = state<HeadlessEffectTarget>();\n if (current) return current;\n if (producerDisposed)\n return fail(\n \"DISPOSED\",\n \"The Godot shader producer has been disposed.\",\n );\n if (!target.texture || !target.framebuffer) {\n const resized = resizeTarget(target, requestedWidth, requestedHeight);\n if (!resized.ok) return resized;\n }\n const dependencies = dependenciesLive();\n if (!dependencies.ok) return dependencies;\n const white = baseTexture ? null : whiteTarget();\n if (white && !white.ok) return white;\n const texture = baseTexture ?? white?.value;\n const screen = transpiled.usesScreenTexture\n ? stageTarget(input.screenTexture, \"SCREEN_TEXTURE\")\n : noScreen;\n if (!screen.ok) return screen;\n if (transpiled.usesScreenTexture && !screen.value)\n return fail(\n \"SCREEN_TEXTURE_REQUIRED\",\n \"This Godot shader samples SCREEN_TEXTURE but no accumulated target was supplied.\",\n );\n const screenTarget =\n screen.value === target ? snapshotFor(target) : screen;\n if (!screenTarget.ok) return screenTarget;\n const ready = ensureProgram();\n if (!ready.ok) return ready;\n const previous = gl.getParameter(\n gl.FRAMEBUFFER_BINDING,\n ) as WebGLFramebuffer | null;\n try {\n gl.bindFramebuffer(gl.FRAMEBUFFER, target.framebuffer);\n gl.viewport(0, 0, target.width, target.height);\n gl.disable(gl.SCISSOR_TEST);\n gl.disable(gl.BLEND);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.useProgram(ready.value.program);\n gl.bindVertexArray(ready.value.vao);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, texture?.texture ?? null);\n const textureLoc = uniformLocation(ready.value, \"TEXTURE\");\n if (textureLoc) gl.uniform1i(textureLoc, 0);\n if (transpiled.usesTime)\n applyUniform(ready.value, \"TIME\", input.time);\n if (transpiled.usesTexturePixelSize) {\n texturePixelSize[0] = 1 / Math.max(1, texture?.width ?? 1);\n texturePixelSize[1] = 1 / Math.max(1, texture?.height ?? 1);\n applyUniform(ready.value, \"TEXTURE_PIXEL_SIZE\", texturePixelSize);\n }\n applyUniform(ready.value, \"MODULATE\", modulate);\n applyUniform(ready.value, \"_godot_uv_fit\", fit);\n applyUniform(ready.value, \"_godot_uv_window\", window);\n const rect = input.screenRect ?? GODOT_DEFAULT_SCREEN_RECT;\n if (transpiled.usesScreenUv) {\n screenOrigin[0] = rect[0];\n screenOrigin[1] = rect[1];\n screenSize[0] = rect[2];\n screenSize[1] = rect[3];\n applyUniform(ready.value, \"_godot_screen_origin\", screenOrigin);\n applyUniform(ready.value, \"_godot_screen_size\", screenSize);\n }\n if (screenTarget.value) {\n gl.activeTexture(gl.TEXTURE0 + 1);\n gl.bindTexture(gl.TEXTURE_2D, screenTarget.value.texture);\n const loc = uniformLocation(ready.value, \"SCREEN_TEXTURE\");\n if (loc) gl.uniform1i(loc, 1);\n }\n if (transpiled.usesScreenPixelSize) {\n screenPixelSize[0] =\n 1 / Math.max(1, screenTarget.value?.width ?? target.width);\n screenPixelSize[1] =\n 1 / Math.max(1, screenTarget.value?.height ?? target.height);\n applyUniform(ready.value, \"SCREEN_PIXEL_SIZE\", screenPixelSize);\n }\n let unit = 2;\n for (let i = 0; i < transpiled.samplers.length; i += 1) {\n const sampler = transpiled.samplers[i];\n const value = samplerTargets[i];\n gl.activeTexture(gl.TEXTURE0 + unit);\n gl.bindTexture(gl.TEXTURE_2D, value.texture);\n const loc = uniformLocation(ready.value, sampler.name);\n if (loc) gl.uniform1i(loc, unit++);\n }\n for (const uniform of transpiled.uniforms)\n applyGodotUniform(ready.value, uniform);\n gl.drawArrays(gl.TRIANGLES, 0, 3);\n gl.bindVertexArray(null);\n return rendered;\n } finally {\n gl.bindFramebuffer(gl.FRAMEBUFFER, previous);\n }\n },\n renderScreen(input, context) {\n if (!transpiled.usesScreenTexture)\n return fail(\n \"UNSUPPORTED_SHADER_FEATURE\",\n \"Only a Godot SCREEN_TEXTURE shader can be recorded as a screen effect.\",\n \"screen-texture\",\n );\n if (context.damage)\n return fail(\n \"UNSUPPORTED_SHADER_FEATURE\",\n \"Screen-dependent effects decline partial damage execution.\",\n \"partial-damage\",\n );\n const dependencies = dependenciesLive();\n if (!dependencies.ok) return dependencies;\n const rect = input.screenRect;\n if (\n !rect?.every(Number.isFinite) ||\n rect[0] < 0 ||\n rect[1] < 0 ||\n rect[2] <= 0 ||\n rect[3] <= 0 ||\n rect[0] + rect[2] > 1 ||\n rect[1] + rect[3] > 1\n )\n return fail(\n \"UNSUPPORTED_SHADER_FEATURE\",\n \"Screen shaders need a finite, normalized axis-aligned screenRect.\",\n \"screen-rect\",\n );\n const resized = producer.resize(context.width, context.height);\n if (!resized.ok) return resized;\n const captured = snapshotFramebuffer(\n context.framebuffer,\n context.width,\n context.height,\n );\n if (!captured.ok) return captured;\n // Reconstruct the whole target first; the node draw below only changes its\n // own painter rectangle and blends over these accumulated pixels.\n copy(captured.value, target, \"nearest\");\n const x = Math.round(rect[0] * context.width);\n const x1 = Math.round((rect[0] + rect[2]) * context.width);\n const topY = Math.round(rect[1] * context.height);\n const bottomY = Math.round((rect[1] + rect[3]) * context.height);\n const y = context.height - bottomY;\n const width = x1 - x;\n const height = bottomY - topY;\n const left = Math.max(x, context.scissor.x);\n const bottom = Math.max(y, context.scissor.y);\n const right = Math.min(x1, context.scissor.x + context.scissor.width);\n const top = Math.min(\n context.height - topY,\n context.scissor.y + context.scissor.height,\n );\n if (right <= left || top <= bottom) return ok(undefined);\n const ready = ensureProgram();\n if (!ready.ok) return ready;\n const white = baseTexture ? null : whiteTarget();\n if (white && !white.ok) return white;\n const texture = baseTexture ?? white?.value;\n const previous = gl.getParameter(\n gl.FRAMEBUFFER_BINDING,\n ) as WebGLFramebuffer | null;\n try {\n gl.bindFramebuffer(gl.FRAMEBUFFER, target.framebuffer);\n gl.viewport(x, y, width, height);\n gl.enable(gl.SCISSOR_TEST);\n gl.scissor(left, bottom, right - left, top - bottom);\n applyGodotBlend(gl, transpiled.blend);\n gl.useProgram(ready.value.program);\n gl.bindVertexArray(ready.value.vao);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, texture?.texture ?? null);\n const textureLoc = uniformLocation(ready.value, \"TEXTURE\");\n if (textureLoc) gl.uniform1i(textureLoc, 0);\n if (transpiled.usesTime)\n applyUniform(ready.value, \"TIME\", input.time);\n if (transpiled.usesTexturePixelSize) {\n texturePixelSize[0] = 1 / Math.max(1, texture?.width ?? 1);\n texturePixelSize[1] = 1 / Math.max(1, texture?.height ?? 1);\n applyUniform(ready.value, \"TEXTURE_PIXEL_SIZE\", texturePixelSize);\n }\n applyUniform(ready.value, \"MODULATE\", modulate);\n applyUniform(ready.value, \"_godot_uv_fit\", fit);\n applyUniform(ready.value, \"_godot_uv_window\", window);\n screenOrigin[0] = rect[0];\n screenOrigin[1] = rect[1];\n screenSize[0] = rect[2];\n screenSize[1] = rect[3];\n if (transpiled.usesScreenUv) {\n applyUniform(ready.value, \"_godot_screen_origin\", screenOrigin);\n applyUniform(ready.value, \"_godot_screen_size\", screenSize);\n }\n gl.activeTexture(gl.TEXTURE0 + 1);\n gl.bindTexture(gl.TEXTURE_2D, captured.value.texture);\n const screenLoc = uniformLocation(ready.value, \"SCREEN_TEXTURE\");\n if (screenLoc) gl.uniform1i(screenLoc, 1);\n if (transpiled.usesScreenPixelSize) {\n screenPixelSize[0] = 1 / context.width;\n screenPixelSize[1] = 1 / context.height;\n applyUniform(ready.value, \"SCREEN_PIXEL_SIZE\", screenPixelSize);\n }\n let unit = 2;\n for (let i = 0; i < transpiled.samplers.length; i += 1) {\n const sampler = transpiled.samplers[i];\n gl.activeTexture(gl.TEXTURE0 + unit);\n gl.bindTexture(gl.TEXTURE_2D, samplerTargets[i].texture);\n const loc = uniformLocation(ready.value, sampler.name);\n if (loc) gl.uniform1i(loc, unit++);\n }\n for (const uniform of transpiled.uniforms)\n applyGodotUniform(ready.value, uniform);\n gl.drawArrays(gl.TRIANGLES, 0, 3);\n gl.bindVertexArray(null);\n } finally {\n gl.bindFramebuffer(gl.FRAMEBUFFER, previous);\n }\n const previousRead = gl.getParameter(\n gl.READ_FRAMEBUFFER_BINDING,\n ) as WebGLFramebuffer | null;\n const previousDraw = gl.getParameter(\n gl.DRAW_FRAMEBUFFER_BINDING,\n ) as WebGLFramebuffer | null;\n try {\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, target.framebuffer);\n gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, context.framebuffer);\n gl.enable(gl.SCISSOR_TEST);\n gl.scissor(\n context.scissor.x,\n context.scissor.y,\n context.scissor.width,\n context.scissor.height,\n );\n gl.blitFramebuffer(\n 0,\n 0,\n target.width,\n target.height,\n 0,\n 0,\n context.width,\n context.height,\n gl.COLOR_BUFFER_BIT,\n gl.NEAREST,\n );\n } finally {\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, previousRead);\n gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, previousDraw);\n }\n return ok(undefined);\n },\n invalidate() {\n destroyProgram(gl, program);\n program = null;\n discardTarget(target, true);\n },\n invalidateContextLoss() {\n program = null;\n discardTarget(target, false);\n },\n dispose() {\n if (!producerDisposed) {\n producerDisposed = true;\n destroyProgram(gl, program);\n program = null;\n discardTarget(target, true);\n targets.delete(target);\n invalidatables.delete(producer);\n }\n },\n };\n invalidatables.add(producer);\n return ok(producer);\n }\n\n function createParticleProducer(\n parameters: HeadlessParticleParameters,\n width: number,\n height: number,\n ): HeadlessEffectResult<HeadlessParticleProducer> {\n const invalid = state<HeadlessParticleProducer>();\n if (invalid) return invalid;\n const diagnostic = particleDiagnostic(parameters);\n if (diagnostic) return { ok: false, diagnostic };\n const target = makeTarget();\n const allocated = resizeTarget(target, width, height);\n if (!allocated.ok) {\n targets.delete(target);\n return allocated;\n }\n let requestedWidth = target.width;\n let requestedHeight = target.height;\n const resolution: [number, number] = [target.width, target.height];\n const speed: [number, number] = [parameters.speedMin, parameters.speedMax];\n const size: [number, number] = [\n parameters.startSizePx,\n parameters.endSizePx,\n ];\n const rendered = ok<HeadlessEffectTarget>(target);\n let program: ProgramState | null = null;\n let producerDisposed = false;\n const count = Math.min(\n Math.floor(parameters.maxParticles),\n Math.max(\n 1,\n Math.ceil(parameters.emissionRate * parameters.lifetimeSeconds),\n ),\n );\n function ensureProgram(): HeadlessEffectResult<ProgramState> {\n if (program) return ok(program);\n const compiled = compileProgram(gl, PARTICLE_VERTEX, PARTICLE_FRAGMENT);\n if (compiled.ok) program = compiled.value;\n return compiled;\n }\n const producer: HeadlessParticleProducer = {\n target,\n warmUp() {\n const current = state<void>();\n if (current) return current;\n if (producerDisposed)\n return fail(\"DISPOSED\", \"The particle producer has been disposed.\");\n const ready = ensureProgram();\n return ready.ok ? ok(undefined) : ready;\n },\n resize(nextWidth, nextHeight) {\n if (producerDisposed)\n return fail(\"DISPOSED\", \"The particle producer has been disposed.\");\n const resized = resizeTarget(target, nextWidth, nextHeight);\n if (resized.ok) {\n requestedWidth = target.width;\n requestedHeight = target.height;\n resolution[0] = target.width;\n resolution[1] = target.height;\n }\n return resized;\n },\n render(input) {\n const inputDiagnostic = renderInputDiagnostic(input);\n if (inputDiagnostic) return { ok: false, diagnostic: inputDiagnostic };\n const current = state<HeadlessEffectTarget>();\n if (current) return current;\n if (producerDisposed)\n return fail(\"DISPOSED\", \"The particle producer has been disposed.\");\n if (!target.framebuffer) {\n const reallocated = resizeTarget(\n target,\n requestedWidth,\n requestedHeight,\n );\n if (!reallocated.ok) return reallocated;\n }\n const ready = ensureProgram();\n if (!ready.ok) return ready;\n const previousFramebuffer = gl.getParameter(\n gl.FRAMEBUFFER_BINDING,\n ) as WebGLFramebuffer | null;\n try {\n gl.bindFramebuffer(gl.FRAMEBUFFER, target.framebuffer);\n gl.viewport(0, 0, target.width, target.height);\n gl.disable(gl.SCISSOR_TEST);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n gl.useProgram(ready.value.program);\n gl.bindVertexArray(ready.value.vao);\n applyUniform(ready.value, \"u_time\", input.time);\n applyUniform(ready.value, \"u_delta\", input.delta);\n applyUniform(ready.value, \"u_seed\", input.seed);\n applyUniform(ready.value, \"u_lifetime\", parameters.lifetimeSeconds);\n applyUniform(ready.value, \"u_emission_rate\", parameters.emissionRate);\n applyUniform(ready.value, \"u_max_particles\", parameters.maxParticles);\n applyUniform(ready.value, \"u_position\", parameters.position);\n applyUniform(ready.value, \"u_direction\", parameters.directionRadians);\n applyUniform(ready.value, \"u_spread\", parameters.spreadRadians);\n applyUniform(ready.value, \"u_speed\", speed);\n applyUniform(ready.value, \"u_gravity\", parameters.gravity);\n applyUniform(ready.value, \"u_resolution\", resolution);\n applyUniform(ready.value, \"u_size\", size);\n applyUniform(ready.value, \"u_start_color\", parameters.startColor);\n applyUniform(ready.value, \"u_end_color\", parameters.endColor);\n gl.drawArrays(gl.POINTS, 0, count);\n gl.bindVertexArray(null);\n return rendered;\n } finally {\n gl.bindFramebuffer(gl.FRAMEBUFFER, previousFramebuffer);\n }\n },\n invalidate() {\n destroyProgram(gl, program);\n program = null;\n discardTarget(target, true);\n },\n invalidateContextLoss() {\n program = null;\n discardTarget(target, false);\n },\n dispose() {\n if (!producerDisposed) {\n producerDisposed = true;\n destroyProgram(gl, program);\n program = null;\n discardTarget(target, true);\n targets.delete(target);\n invalidatables.delete(producer);\n }\n },\n };\n invalidatables.add(producer);\n return ok(producer);\n }\n\n function createGodotParticleProducer(\n pass: HeadlessGodotParticlePass,\n width: number,\n height: number,\n ): HeadlessEffectResult<HeadlessGodotParticleProducer> {\n const invalid = state<HeadlessGodotParticleProducer>();\n if (invalid) return invalid;\n if (!pass.config && !pass.scratch)\n return fail(\n \"UNSUPPORTED_PARTICLE_FEATURE\",\n \"A particle pass needs config or caller-owned scratch.\",\n \"config\",\n );\n if (pass.scratch && pass.config)\n return fail(\n \"UNSUPPORTED_PARTICLE_FEATURE\",\n \"When scratch is supplied, omit config: scratch is the semantic owner.\",\n \"scratch-config\",\n );\n const config = pass.scratch\n ? pass.scratch.config\n : normalizeParticleRenderConfig(pass.config!);\n const sprite = pass.spriteTexture\n ? textureInputFor(pass.spriteTexture)\n : null;\n const lut = pass.lutTexture ? textureInputFor(pass.lutTexture) : null;\n const mask = pass.maskTexture ? textureInputFor(pass.maskTexture) : null;\n if (pass.spriteTexture && !sprite)\n return fail(\n \"FOREIGN_TARGET\",\n \"A textured particle system needs a live sprite target owned by this stage.\",\n \"sprite-texture\",\n );\n if ((pass.lutTexture && !lut) || (pass.maskTexture && !mask))\n return fail(\n \"FOREIGN_TARGET\",\n \"Particle auxiliary textures must be live targets owned by this stage.\",\n \"auxiliary-texture\",\n );\n const unsupported = (\n [\"collision\", \"attractors\", \"trails\", \"customMaterial\"] as const\n ).find((feature) => pass.features?.[feature]);\n if (unsupported)\n return fail(\n \"UNSUPPORTED_PARTICLE_FEATURE\",\n `Headless Godot particles do not support ${unsupported}.`,\n unsupported,\n );\n // Material/collision effects cannot be reconstructed from a flat particle spec.\n if (config.emissionShape === 4 || config.emissionShape === 5)\n return fail(\n \"UNSUPPORTED_PARTICLE_FEATURE\",\n \"Point-list and directed-point emission require their authored point data.\",\n \"emission-shape\",\n );\n const scratch = pass.scratch ?? createGodotParticleScratch(config);\n const ownsScratch = !pass.scratch;\n if (scratch.instances.data.length / 10 < scratch.state.count)\n return fail(\n \"UNSUPPORTED_PARTICLE_FEATURE\",\n \"Scratch cannot hold the configured particle count.\",\n \"scratch-capacity\",\n );\n const target = makeTarget();\n const allocated = resizeTarget(target, width, height);\n if (!allocated.ok) {\n targets.delete(target);\n return allocated;\n }\n const semanticConfig = scratch.config;\n const packing = {\n state: scratch.state,\n config: semanticConfig,\n instances: scratch.instances,\n textureWidth: 0,\n textureHeight: 0,\n origin: undefined as readonly [number, number] | undefined,\n transform: undefined as DirectParticleTransform | undefined,\n modulate: undefined as\n | readonly [number, number, number, number]\n | undefined,\n };\n let requestedWidth = target.width,\n requestedHeight = target.height;\n let program: ParticleProgram | null = null;\n let quad: WebGLBuffer | null = null;\n let producerDisposed = false;\n let lastTime: number | null = null;\n let preprocessed = false;\n const rendered = ok<HeadlessEffectTarget>(target);\n const warmed = ok(undefined);\n const particleGl: { gl: WebGL2RenderingContext; quad: WebGLBuffer | null } =\n { gl, quad: null };\n const drawOptions = {\n texture: sprite?.texture ?? null,\n textured: Boolean(sprite),\n lutTexture: lut?.texture ?? null,\n maskTexture: mask?.texture ?? null,\n hframes: semanticConfig.hframes,\n vframes: semanticConfig.vframes,\n blendMode: semanticConfig.blendMode,\n viewportW: target.width,\n viewportH: target.height,\n alphaFromRed: semanticConfig.alphaFromRed,\n erode: semanticConfig.alphaErode,\n uvPolar: semanticConfig.uvPolar,\n targetFramebuffer: target.framebuffer,\n };\n const ensure = (): HeadlessEffectResult<ParticleProgram> => {\n if (program) return readyResult!;\n const compiled = acquireParticleProgram(gl);\n if (!compiled)\n return fail(\n \"SHADER_COMPILE_FAILED\",\n \"WebGL could not compile the shared Godot particle renderer.\",\n );\n quad = gl.createBuffer();\n if (!quad) {\n releaseParticleProgram(gl);\n return fail(\n \"RESOURCE_ALLOCATION_FAILED\",\n \"WebGL could not allocate the particle resolve quad.\",\n );\n }\n gl.bindBuffer(gl.ARRAY_BUFFER, quad);\n gl.bufferData(\n gl.ARRAY_BUFFER,\n new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]),\n gl.STATIC_DRAW,\n );\n program = compiled;\n particleGl.quad = quad;\n readyResult = ok(compiled);\n return readyResult;\n };\n let readyResult: HeadlessEffectResult<ParticleProgram> | null = null;\n const dependencyLive = (value: TextureBinding | null): boolean =>\n !(\n value &&\n (value.owned\n ? !targets.has(value.owned) ||\n !value.owned.texture ||\n !value.owned.framebuffer\n : typeof gl.isTexture === \"function\" && !gl.isTexture(value.texture))\n );\n const reset = (): void => {\n const s = scratch.state;\n s.time = 0;\n s.cycle = 0;\n s.remainder = 0;\n s.emitting = true;\n for (let index = 0; index < s.particles.length; index += 1)\n s.particles[index].active = false;\n };\n // This is authored particle state, not a DOM-runtime convenience. Match\n // the direct painter path so target-backed ambient/flipbook effects begin\n // at Godot's pre-simulated phase instead of an empty fresh emitter.\n const preprocess = (): void => {\n if (preprocessed) return;\n preprocessParticles(scratch.state);\n preprocessed = true;\n };\n const producer: HeadlessGodotParticleProducer = {\n target,\n scratch,\n warmUp() {\n const current = state<void>();\n if (current) return current;\n if (producerDisposed)\n return fail(\n \"DISPOSED\",\n \"The Godot particle producer has been disposed.\",\n );\n const ready = ensure();\n if (!ready.ok) return ready;\n if (!prepareParticleDraw(gl, ready.value, drawOptions) || false)\n return fail(\n \"RESOURCE_ALLOCATION_FAILED\",\n \"WebGL could not prepare particle draw resources.\",\n );\n return warmed;\n },\n resize(nextWidth, nextHeight) {\n if (producerDisposed)\n return fail(\n \"DISPOSED\",\n \"The Godot particle producer has been disposed.\",\n );\n const resized = resizeTarget(target, nextWidth, nextHeight);\n if (resized.ok) {\n requestedWidth = target.width;\n requestedHeight = target.height;\n drawOptions.viewportW = target.width;\n drawOptions.viewportH = target.height;\n drawOptions.targetFramebuffer = target.framebuffer;\n }\n return resized;\n },\n render(input) {\n if (\n (input.origin !== undefined &&\n (input.origin.length !== 2 ||\n !input.origin.every(Number.isFinite))) ||\n !Number.isFinite(input.time) ||\n !Number.isFinite(input.delta) ||\n input.time < 0 ||\n input.delta < 0\n )\n return fail(\n \"INVALID_RENDER_INPUT\",\n \"Particle time and delta must be finite and non-negative.\",\n \"render-input\",\n );\n if (!input.restart && lastTime !== null) {\n if (input.time < lastTime)\n return fail(\n \"INVALID_RENDER_INPUT\",\n \"Particle time must be monotonic unless restart is set.\",\n \"time\",\n );\n if (Math.abs(input.delta - (input.time - lastTime)) > 1e-6)\n return fail(\n \"INVALID_RENDER_INPUT\",\n \"Particle delta must reconcile with caller time.\",\n \"time-delta\",\n );\n }\n const current = state<HeadlessEffectTarget>();\n if (current) return current;\n if (producerDisposed)\n return fail(\n \"DISPOSED\",\n \"The Godot particle producer has been disposed.\",\n );\n if (!target.texture || !target.framebuffer) {\n const resized = resizeTarget(target, requestedWidth, requestedHeight);\n if (!resized.ok) return resized;\n }\n if (!dependencyLive(sprite))\n return fail(\n \"FOREIGN_TARGET\",\n \"Particle sprite texture is no longer live.\",\n \"sprite-texture\",\n );\n if (!dependencyLive(lut))\n return fail(\n \"FOREIGN_TARGET\",\n \"Particle LUT texture is no longer live.\",\n \"lut-texture\",\n );\n if (!dependencyLive(mask))\n return fail(\n \"FOREIGN_TARGET\",\n \"Particle mask texture is no longer live.\",\n \"mask-texture\",\n );\n const ready = ensure();\n if (!ready.ok) return ready;\n drawOptions.viewportW = target.width;\n drawOptions.viewportH = target.height;\n drawOptions.targetFramebuffer = target.framebuffer;\n if (!prepareParticleDraw(gl, ready.value, drawOptions))\n return fail(\n \"RESOURCE_ALLOCATION_FAILED\",\n \"WebGL could not allocate the additive particle target.\",\n );\n if (input.restart) {\n reset();\n preprocessed = false;\n }\n preprocess();\n scratch.state.emitting = input.emitting;\n simulateParticles(scratch.state, input.delta);\n lastTime = input.time;\n const buffer = scratch.instances;\n packing.textureWidth =\n semanticConfig.textureWidth > 0\n ? semanticConfig.textureWidth\n : (sprite?.width ?? 16);\n packing.textureHeight =\n semanticConfig.textureHeight > 0\n ? semanticConfig.textureHeight\n : (sprite?.height ?? 16);\n packing.origin = input.origin;\n packParticleInstances(packing);\n const previous = gl.getParameter(\n gl.FRAMEBUFFER_BINDING,\n ) as WebGLFramebuffer | null;\n try {\n gl.bindFramebuffer(gl.FRAMEBUFFER, target.framebuffer);\n gl.viewport(0, 0, target.width, target.height);\n gl.disable(gl.SCISSOR_TEST);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n if (buffer.count === 0) return rendered;\n const drawn = drawParticles(\n particleGl as { gl: WebGL2RenderingContext; quad: WebGLBuffer },\n ready.value,\n buffer,\n drawOptions,\n );\n if (!drawn)\n return fail(\n \"RESOURCE_ALLOCATION_FAILED\",\n \"WebGL could not allocate the additive particle target.\",\n );\n return rendered;\n } finally {\n gl.bindFramebuffer(gl.FRAMEBUFFER, previous);\n }\n },\n // Program and caller scratch are shared/borrowed; this producer only owns its target and resolve quad.\n invalidate() {\n if (program) releaseParticleProgram(gl);\n program = null;\n if (quad) gl.deleteBuffer(quad);\n quad = null;\n if (ownsScratch) disposeParticleInstanceBuffer(gl, scratch.instances);\n discardTarget(target, true);\n },\n invalidateContextLoss() {\n if (program) releaseParticleProgram(gl, true);\n program = null;\n quad = null;\n invalidateParticleInstanceBuffer(gl, scratch.instances);\n discardTarget(target, false);\n },\n dispose() {\n if (!producerDisposed) {\n producerDisposed = true;\n producer.invalidate();\n targets.delete(target);\n invalidatables.delete(producer);\n }\n },\n };\n invalidatables.add(producer);\n return ok(producer);\n }\n\n function createGodotParticleDirectPass(\n pass: HeadlessGodotParticlePass,\n ): HeadlessEffectResult<HeadlessGodotParticleDirectPass> {\n const invalid = state<HeadlessGodotParticleDirectPass>();\n if (invalid) return invalid;\n if (!pass.config && !pass.scratch)\n return fail(\n \"UNSUPPORTED_PARTICLE_FEATURE\",\n \"A particle pass needs config or caller-owned scratch.\",\n \"config\",\n );\n if (pass.scratch && pass.config)\n return fail(\n \"UNSUPPORTED_PARTICLE_FEATURE\",\n \"When scratch is supplied, omit config: scratch is the semantic owner.\",\n \"scratch-config\",\n );\n const config = pass.scratch\n ? pass.scratch.config\n : normalizeParticleRenderConfig(pass.config!);\n const sprite = pass.spriteTexture\n ? textureInputFor(pass.spriteTexture)\n : null;\n const lut = pass.lutTexture ? textureInputFor(pass.lutTexture) : null;\n const mask = pass.maskTexture ? textureInputFor(pass.maskTexture) : null;\n if (pass.spriteTexture && !sprite)\n return fail(\n \"FOREIGN_TARGET\",\n \"A textured particle system needs a live sprite target owned by this stage.\",\n \"sprite-texture\",\n );\n if ((pass.lutTexture && !lut) || (pass.maskTexture && !mask))\n return fail(\n \"FOREIGN_TARGET\",\n \"Particle auxiliary textures must be live targets owned by this stage.\",\n \"auxiliary-texture\",\n );\n const unsupported = (\n [\"collision\", \"attractors\", \"trails\", \"customMaterial\"] as const\n ).find((feature) => pass.features?.[feature]);\n if (unsupported)\n return fail(\n \"UNSUPPORTED_PARTICLE_FEATURE\",\n `Headless Godot particles do not support ${unsupported}.`,\n unsupported,\n );\n if (config.emissionShape === 4 || config.emissionShape === 5)\n return fail(\n \"UNSUPPORTED_PARTICLE_FEATURE\",\n \"Point-list and directed-point emission require their authored point data.\",\n \"emission-shape\",\n );\n const scratch = pass.scratch ?? createGodotParticleScratch(config);\n const ownsScratch = !pass.scratch;\n if (scratch.instances.data.length / 10 < scratch.state.count)\n return fail(\n \"UNSUPPORTED_PARTICLE_FEATURE\",\n \"Scratch cannot hold the configured particle count.\",\n \"scratch-capacity\",\n );\n\n const semanticConfig = scratch.config;\n const packing = {\n state: scratch.state,\n config: semanticConfig,\n instances: scratch.instances,\n textureWidth: 0,\n textureHeight: 0,\n origin: undefined as readonly [number, number] | undefined,\n transform: undefined as DirectParticleTransform | undefined,\n modulate: undefined as\n | readonly [number, number, number, number]\n | undefined,\n };\n let program: ParticleProgram | null = null;\n let quad: WebGLBuffer | null = null;\n let disposedProducer = false;\n let preprocessed = false;\n let lastTime: number | null = null;\n const particleGl: { gl: WebGL2RenderingContext; quad: WebGLBuffer | null } =\n { gl, quad: null };\n const drawOptions = {\n texture: sprite?.texture ?? null,\n textured: Boolean(sprite),\n lutTexture: lut?.texture ?? null,\n maskTexture: mask?.texture ?? null,\n hframes: semanticConfig.hframes,\n vframes: semanticConfig.vframes,\n blendMode: semanticConfig.blendMode,\n viewportW: 1,\n viewportH: 1,\n alphaFromRed: semanticConfig.alphaFromRed,\n erode: semanticConfig.alphaErode,\n uvPolar: semanticConfig.uvPolar,\n targetFramebuffer: null as WebGLFramebuffer | null,\n additiveResolveIntoExisting: true,\n };\n let readyResult: HeadlessEffectResult<ParticleProgram> | null = null;\n const ensure = (): HeadlessEffectResult<ParticleProgram> => {\n if (program) return readyResult!;\n const compiled = acquireParticleProgram(gl);\n if (!compiled)\n return fail(\n \"SHADER_COMPILE_FAILED\",\n \"WebGL could not compile the shared Godot particle renderer.\",\n );\n quad = gl.createBuffer();\n if (!quad) {\n releaseParticleProgram(gl);\n return fail(\n \"RESOURCE_ALLOCATION_FAILED\",\n \"WebGL could not allocate the particle resolve quad.\",\n );\n }\n gl.bindBuffer(gl.ARRAY_BUFFER, quad);\n gl.bufferData(\n gl.ARRAY_BUFFER,\n new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]),\n gl.STATIC_DRAW,\n );\n program = compiled;\n particleGl.quad = quad;\n readyResult = ok(compiled);\n return readyResult;\n };\n const dependencyLive = (value: TextureBinding | null): boolean =>\n !(\n value &&\n (value.owned\n ? !targets.has(value.owned) ||\n !value.owned.texture ||\n !value.owned.framebuffer\n : typeof gl.isTexture === \"function\" && !gl.isTexture(value.texture))\n );\n const reset = (): void => {\n const state = scratch.state;\n state.time = 0;\n state.cycle = 0;\n state.remainder = 0;\n state.emitting = true;\n for (const particle of state.particles) particle.active = false;\n };\n const preprocess = (): void => {\n if (preprocessed) return;\n preprocessParticles(scratch.state);\n preprocessed = true;\n };\n const producer: HeadlessGodotParticleDirectPass = {\n scratch,\n warmUp() {\n const current = state<void>();\n if (current) return current;\n if (disposedProducer)\n return fail(\"DISPOSED\", \"The Godot particle pass has been disposed.\");\n const ready = ensure();\n if (!ready.ok) return ready;\n if (!prepareParticleDraw(gl, ready.value, drawOptions) || false)\n return fail(\n \"RESOURCE_ALLOCATION_FAILED\",\n \"WebGL could not prepare particle draw resources.\",\n );\n preprocess();\n return ok(undefined);\n },\n draw(input, context) {\n if (\n (input.origin !== undefined &&\n (input.origin.length !== 2 ||\n !input.origin.every(Number.isFinite))) ||\n !Number.isFinite(input.time) ||\n !Number.isFinite(input.delta) ||\n input.time < 0 ||\n input.delta < 0 ||\n !Number.isFinite(context.width) ||\n !Number.isFinite(context.height) ||\n context.width <= 0 ||\n context.height <= 0\n )\n return fail(\n \"INVALID_RENDER_INPUT\",\n \"Particle time, delta, and target dimensions must be finite and positive.\",\n \"render-input\",\n );\n const transform = directParticleTransform(input.transform);\n if (!transform)\n return fail(\n \"UNSUPPORTED_PARTICLE_FEATURE\",\n \"Direct particles require a finite uniform-scale rotation and translation transform.\",\n \"transform\",\n );\n const modulate = directParticleModulate(input.modulate);\n if (!modulate)\n return fail(\n \"INVALID_RENDER_INPUT\",\n \"Direct particle modulation components must be finite.\",\n \"modulate\",\n );\n if (!input.restart && lastTime !== null) {\n if (input.time < lastTime)\n return fail(\n \"INVALID_RENDER_INPUT\",\n \"Particle time must be monotonic unless restart is set.\",\n \"time\",\n );\n if (Math.abs(input.delta - (input.time - lastTime)) > 1e-6)\n return fail(\n \"INVALID_RENDER_INPUT\",\n \"Particle delta must reconcile with caller time.\",\n \"time-delta\",\n );\n }\n const current = state<void>();\n if (current) return current;\n if (disposedProducer)\n return fail(\"DISPOSED\", \"The Godot particle pass has been disposed.\");\n if (!dependencyLive(sprite))\n return fail(\n \"FOREIGN_TARGET\",\n \"Particle sprite texture is no longer live.\",\n \"sprite-texture\",\n );\n if (!dependencyLive(lut))\n return fail(\n \"FOREIGN_TARGET\",\n \"Particle LUT texture is no longer live.\",\n \"lut-texture\",\n );\n if (!dependencyLive(mask))\n return fail(\n \"FOREIGN_TARGET\",\n \"Particle mask texture is no longer live.\",\n \"mask-texture\",\n );\n const ready = ensure();\n if (!ready.ok) return ready;\n drawOptions.viewportW = Math.floor(context.width);\n drawOptions.viewportH = Math.floor(context.height);\n drawOptions.targetFramebuffer = context.framebuffer;\n if (!prepareParticleDraw(gl, ready.value, drawOptions))\n return fail(\n \"RESOURCE_ALLOCATION_FAILED\",\n \"WebGL could not allocate the shared additive particle target.\",\n );\n if (input.restart) {\n reset();\n preprocessed = false;\n }\n preprocess();\n scratch.state.emitting = input.emitting;\n simulateParticles(scratch.state, input.delta);\n lastTime = input.time;\n const buffer = scratch.instances;\n packing.textureWidth =\n semanticConfig.textureWidth > 0\n ? semanticConfig.textureWidth\n : (sprite?.width ?? 16);\n packing.textureHeight =\n semanticConfig.textureHeight > 0\n ? semanticConfig.textureHeight\n : (sprite?.height ?? 16);\n packing.origin = input.origin;\n packing.transform = transform;\n packing.modulate = modulate;\n packParticleInstances(packing);\n if (buffer.count === 0) return ok(undefined);\n gl.bindFramebuffer(gl.FRAMEBUFFER, context.framebuffer);\n gl.viewport(0, 0, drawOptions.viewportW, drawOptions.viewportH);\n const drawn = drawParticles(\n particleGl as { gl: WebGL2RenderingContext; quad: WebGLBuffer },\n ready.value,\n buffer,\n drawOptions,\n );\n return drawn\n ? ok(undefined)\n : fail(\n \"RESOURCE_ALLOCATION_FAILED\",\n \"WebGL could not draw the shared particle pass.\",\n );\n },\n invalidate() {\n if (program) releaseParticleProgram(gl);\n program = null;\n readyResult = null;\n if (quad) gl.deleteBuffer(quad);\n quad = null;\n particleGl.quad = null;\n if (ownsScratch) disposeParticleInstanceBuffer(gl, scratch.instances);\n },\n invalidateContextLoss() {\n if (program) releaseParticleProgram(gl, true);\n program = null;\n readyResult = null;\n quad = null;\n particleGl.quad = null;\n invalidateParticleInstanceBuffer(gl, scratch.instances);\n },\n dispose() {\n if (disposedProducer) return;\n disposedProducer = true;\n producer.invalidate();\n invalidatables.delete(producer);\n },\n };\n invalidatables.add(producer);\n return ok(producer);\n }\n\n return {\n gl,\n createShaderProducer,\n createGodotShaderProducer,\n createParticleProducer,\n createGodotParticleProducer,\n createGodotParticleDirectPass,\n executeScreenSample(command) {\n const current = state<void>();\n if (current) return current;\n const source = targetFor(command.source);\n const destination = targetFor(command.destination);\n if (\n !source?.texture ||\n !source.framebuffer ||\n !destination?.texture ||\n !destination.framebuffer\n ) {\n return fail(\n \"FOREIGN_TARGET\",\n \"Screen sample commands require live targets owned by this headless effects stage.\",\n );\n }\n if (source === destination) {\n const captured = snapshotFor(source);\n if (!captured.ok) return captured;\n copy(captured.value, destination, command.filter ?? \"nearest\");\n } else copy(source, destination, command.filter ?? \"nearest\");\n return ok(undefined);\n },\n invalidate() {\n for (const item of [...invalidatables]) item.invalidate();\n if (snapshot) discardTarget(snapshot, true);\n if (opaqueWhite) discardTarget(opaqueWhite, true);\n opaqueWhiteFilled = false;\n opaqueWhiteResult = null;\n },\n invalidateContextLoss() {\n for (const item of [...invalidatables]) item.invalidateContextLoss();\n if (snapshot) discardTarget(snapshot, false);\n if (opaqueWhite) discardTarget(opaqueWhite, false);\n opaqueWhiteFilled = false;\n opaqueWhiteResult = null;\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n for (const item of [...invalidatables]) item.dispose();\n if (snapshot) discardTarget(snapshot, true);\n if (opaqueWhite) discardTarget(opaqueWhite, true);\n snapshot = null;\n opaqueWhite = null;\n opaqueWhiteFilled = false;\n opaqueWhiteResult = null;\n targets.clear();\n },\n };\n}\n"],"mappings":"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"}
|