@forgeax/engine-vfx 0.1.27 → 0.1.29

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.
Files changed (53) hide show
  1. package/README.md +62 -14
  2. package/dist/assets/particle-effect-decoder.d.ts.map +1 -1
  3. package/dist/authoring-descriptor.d.ts +4 -4
  4. package/dist/authoring-descriptor.d.ts.map +1 -1
  5. package/dist/code-source-v3.d.ts +101 -0
  6. package/dist/code-source-v3.d.ts.map +1 -0
  7. package/dist/code-source.d.ts +12 -11
  8. package/dist/code-source.d.ts.map +1 -1
  9. package/dist/data-interface.d.ts +17 -1
  10. package/dist/data-interface.d.ts.map +1 -1
  11. package/dist/effect-contract.d.ts +11 -1
  12. package/dist/effect-contract.d.ts.map +1 -1
  13. package/dist/gpu-loader.d.ts +5 -5
  14. package/dist/gpu-loader.d.ts.map +1 -1
  15. package/dist/gpu-program.d.ts +52 -27
  16. package/dist/gpu-program.d.ts.map +1 -1
  17. package/dist/gpu-runtime.d.ts +32 -7
  18. package/dist/gpu-runtime.d.ts.map +1 -1
  19. package/dist/index.d.ts +10 -6
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.mjs +647 -117
  22. package/dist/index.mjs.map +1 -1
  23. package/dist/particle-layout.d.ts +62 -0
  24. package/dist/particle-layout.d.ts.map +1 -0
  25. package/package.json +5 -5
  26. package/src/__tests__/authoring-descriptor.unit.test.ts +18 -8
  27. package/src/__tests__/channel-input.unit.test.ts +4 -1
  28. package/src/__tests__/channel-overflow-policy-owner.test-d.ts +2 -2
  29. package/src/__tests__/code-source-v2.unit.test.ts +15 -14
  30. package/src/__tests__/data-interface-contract.unit.test.ts +41 -2
  31. package/src/__tests__/effect-contract.unit.test.ts +6 -3
  32. package/src/__tests__/gpu-program-simulation-culling-owner.test-d.ts +6 -6
  33. package/src/__tests__/gpu-reflection-vocabulary-owner.test-d.ts +2 -2
  34. package/src/__tests__/gpu-runtime.integration.test.ts +244 -11
  35. package/src/__tests__/instance-public-api.unit.test.ts +4 -1
  36. package/src/__tests__/instance.unit.test.ts +4 -1
  37. package/src/__tests__/loader-v1-rejection.unit.test.ts +14 -14
  38. package/src/__tests__/player-reflection.unit.test.ts +2 -2
  39. package/src/__tests__/player-type.test-d.ts +4 -1
  40. package/src/__tests__/renderer-source.unit.test.ts +6 -6
  41. package/src/__tests__/replay-canonical.unit.test.ts +4 -1
  42. package/src/__tests__/vfx-data-interface-vocabulary-owner.test-d.ts +3 -8
  43. package/src/assets/particle-effect-decoder.ts +4 -3
  44. package/src/authoring-descriptor.ts +26 -28
  45. package/src/code-source-v3.ts +460 -0
  46. package/src/code-source.ts +23 -27
  47. package/src/data-interface.ts +66 -1
  48. package/src/effect-contract.ts +73 -20
  49. package/src/gpu-loader.ts +61 -35
  50. package/src/gpu-program.ts +57 -35
  51. package/src/gpu-runtime.ts +115 -42
  52. package/src/index.ts +53 -9
  53. package/src/particle-layout.ts +214 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/assets/particle-effect-decoder.ts","../src/authoring-descriptor.ts","../src/code-source.ts","../src/data-interface.ts","../src/effect-contract.ts","../src/gpu-program.ts","../src/gpu-loader.ts","../src/instance.ts","../src/player.ts","../src/gpu-runtime.ts"],"names":["err","ok","fields","value","field","failure","record","fingerprint","world"],"mappings":"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","file":"index.mjs","sourcesContent":["import {\n type AssetDecoderContribution,\n type AssetKind,\n err,\n ok,\n type ParticleEffectAsset,\n} from '@forgeax/engine-types';\n\nexport const particleEffectContribution: AssetDecoderContribution<\n ParticleEffectAsset,\n 'particle-effect'\n> = {\n kind: { kind: 'particle-effect' } as AssetKind<ParticleEffectAsset, 'particle-effect'>,\n consumer: 'VfxGpuRuntime',\n decoder: {\n async decode({ envelope }) {\n const payload = envelope.payload;\n if (\n payload.kind === 'particle-effect' &&\n payload.schemaVersion === 2 &&\n payload.emitters.length === payload.program.emitters.length &&\n payload.programFingerprint === payload.program.fingerprint\n ) {\n return ok(payload);\n }\n return err({\n code: 'asset-package-invalid',\n expected: 'a schema v2 particle payload matching its cooked program',\n hint: 'recook the particle effect atomically with its GPU program',\n detail: { guid: envelope.guid, reason: 'particle owner validation failed' },\n });\n },\n },\n};\n","import type { VfxGpuEffectAsset, VfxGpuEmitterProgram } from './gpu-program.js';\n\nexport type VfxAuthoringValue =\n | null\n | string\n | number\n | boolean\n | readonly VfxAuthoringValue[]\n | { readonly [key: string]: VfxAuthoringValue };\n\nexport interface VfxAuthoringFieldDescriptor {\n readonly path: string;\n readonly label: string;\n readonly value: VfxAuthoringValue;\n readonly valueType: 'text' | 'number' | 'boolean' | 'vector' | 'object';\n}\n\nexport type VfxAuthoringNodeRole =\n | 'emitter'\n | 'program'\n | 'parameters'\n | 'custom'\n | 'stage'\n | 'channel'\n | 'event'\n | 'renderer';\n\nexport interface VfxAuthoringNodeDescriptor {\n readonly id: string;\n readonly role: VfxAuthoringNodeRole;\n readonly label: string;\n readonly sourcePath: string;\n readonly fields: readonly VfxAuthoringFieldDescriptor[];\n readonly children: readonly VfxAuthoringNodeDescriptor[];\n}\n\nexport interface VfxAuthoringEmitterDescriptor extends VfxAuthoringNodeDescriptor {\n readonly role: 'emitter';\n readonly module: string;\n}\n\nexport interface VfxAuthoringTimelineDescriptor {\n readonly emitterId: string;\n readonly rate: number;\n readonly bursts: readonly { readonly time: number; readonly count: number }[];\n readonly loopDuration?: number;\n}\n\nexport interface VfxAuthoringDependencyDescriptor {\n readonly kind: 'asset' | 'module' | 'data-interface';\n readonly identity: string;\n readonly sourcePath: string;\n}\n\nexport interface VfxAuthoringCapabilityDescriptor {\n readonly id: string;\n readonly state: 'executable' | 'partial' | 'unavailable';\n readonly reason?: string;\n}\n\nexport interface VfxAuthoringDescriptor {\n readonly version: 1;\n readonly assetGuid: string;\n readonly schemaVersion: 2;\n readonly artifactFingerprint: string;\n readonly emitters: readonly VfxAuthoringEmitterDescriptor[];\n readonly timeline: readonly VfxAuthoringTimelineDescriptor[];\n readonly dependencies: readonly VfxAuthoringDependencyDescriptor[];\n readonly capabilities: readonly VfxAuthoringCapabilityDescriptor[];\n}\n\nconst CAPABILITIES: readonly VfxAuthoringCapabilityDescriptor[] = Object.freeze([\n Object.freeze({ id: 'wgsl-behavior', state: 'executable' }),\n Object.freeze({ id: 'multi-emitter', state: 'executable' }),\n Object.freeze({ id: 'deterministic-replay', state: 'executable' }),\n Object.freeze({ id: 'emitter-visibility', state: 'executable' }),\n Object.freeze({\n id: 'runtime-parameters',\n state: 'partial',\n reason: 'reflected and packed, but not yet bound to managed author WGSL',\n }),\n Object.freeze({\n id: 'custom-attributes',\n state: 'partial',\n reason: 'reflected without executable per-particle custom storage',\n }),\n Object.freeze({\n id: 'data-interfaces',\n state: 'partial',\n reason: 'requirements resolve provider readiness without author resource bindings',\n }),\n]);\n\n/** Narrow an AssetRegistry payload without making editor consumers duplicate\n * the cooked program shape. This deliberately validates the stable producer\n * discriminants only; detailed artifact validation remains the pack loader's\n * responsibility. */\nexport function isVfxGpuEffectAsset(value: unknown): value is VfxGpuEffectAsset {\n if (typeof value !== 'object' || value === null) return false;\n const candidate = value as Partial<VfxGpuEffectAsset>;\n return (\n candidate.kind === 'particle-effect' &&\n candidate.schemaVersion === 2 &&\n typeof candidate.guid === 'string' &&\n candidate.guid.length > 0 &&\n typeof candidate.program === 'object' &&\n candidate.program !== null &&\n candidate.program.format === 'forgeax-vfx-program-2' &&\n typeof candidate.program.fingerprint === 'string' &&\n Array.isArray(candidate.program.emitters)\n );\n}\n\nfunction label(path: string): string {\n const leaf = path.split('.').at(-1) ?? path;\n return leaf.replaceAll(/([a-z])([A-Z])/g, '$1 $2').replace(/^./, (value) => value.toUpperCase());\n}\n\nfunction authoringValue(value: unknown): VfxAuthoringValue {\n if (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return value;\n }\n if (Array.isArray(value)) return Object.freeze(value.map(authoringValue));\n if (typeof value === 'object') {\n const out: Record<string, VfxAuthoringValue> = {};\n for (const [key, child] of Object.entries(value)) out[key] = authoringValue(child);\n return Object.freeze(out);\n }\n return String(value);\n}\n\nfunction valueType(value: VfxAuthoringValue): VfxAuthoringFieldDescriptor['valueType'] {\n if (typeof value === 'number') return 'number';\n if (typeof value === 'boolean') return 'boolean';\n if (Array.isArray(value) && value.every((entry) => typeof entry === 'number')) return 'vector';\n if (typeof value === 'object' && value !== null) return 'object';\n return 'text';\n}\n\nfunction field(path: string, value: unknown): VfxAuthoringFieldDescriptor {\n const normalized = authoringValue(value);\n return Object.freeze({\n path,\n label: label(path),\n value: normalized,\n valueType: valueType(normalized),\n });\n}\n\nfunction fields(\n path: string,\n value: object,\n omit: readonly string[] = [],\n): readonly VfxAuthoringFieldDescriptor[] {\n const excluded = new Set(omit);\n return Object.freeze(\n Object.entries(value)\n .filter(([key, child]) => !excluded.has(key) && child !== undefined)\n .map(([key, child]) => field(`${path}.${key}`, child)),\n );\n}\n\nfunction node(\n input: Omit<VfxAuthoringNodeDescriptor, 'children'> & {\n readonly children?: readonly VfxAuthoringNodeDescriptor[];\n },\n): VfxAuthoringNodeDescriptor {\n return Object.freeze({ ...input, children: Object.freeze([...(input.children ?? [])]) });\n}\n\nfunction reflectionNodes(\n emitter: VfxGpuEmitterProgram,\n path: string,\n): VfxAuthoringNodeDescriptor[] {\n const nodes: VfxAuthoringNodeDescriptor[] = [];\n const layout = emitter.reflection.layout;\n if (layout !== undefined && layout.parameters.fields.length > 0) {\n nodes.push(\n node({\n id: `parameters:${emitter.id}`,\n role: 'parameters',\n label: layout.parameters.name,\n sourcePath: `${path}.program`,\n fields: Object.freeze(\n layout.parameters.fields.map((entry) =>\n field(`parameters.${entry.name}`, {\n type: entry.type,\n offset: entry.offset,\n size: entry.size,\n alignment: entry.alignment,\n defaultValue: entry.defaultValue ?? null,\n }),\n ),\n ),\n }),\n );\n }\n if (layout !== undefined && layout.custom.fields.length > 0) {\n nodes.push(\n node({\n id: `custom:${emitter.id}`,\n role: 'custom',\n label: layout.custom.name,\n sourcePath: `${path}.program`,\n fields: Object.freeze(\n layout.custom.fields.map((entry) =>\n field(`custom.${entry.name}`, {\n type: entry.type,\n offset: entry.offset,\n size: entry.size,\n alignment: entry.alignment,\n defaultValue: entry.defaultValue ?? null,\n }),\n ),\n ),\n }),\n );\n }\n for (const stage of emitter.reflection.stages ?? []) {\n nodes.push(\n node({\n id: `stage:${emitter.id}:${stage.id}`,\n role: 'stage',\n label: stage.id,\n sourcePath: `${path}.program`,\n fields: fields(`stages.${stage.id}`, stage, ['id', 'entryPoint']),\n }),\n );\n }\n return nodes;\n}\n\nfunction emitterNode(emitter: VfxGpuEmitterProgram, index: number): VfxAuthoringEmitterDescriptor {\n const path = `emitters[${index}]`;\n const children: VfxAuthoringNodeDescriptor[] = [\n node({\n id: `program:${emitter.id}`,\n role: 'program',\n label: emitter.module,\n sourcePath: `${path}.program.module`,\n fields: Object.freeze([\n field(`${path}.program.module`, emitter.module),\n field(`${path}.program.imports`, emitter.reflection.imports),\n ]),\n }),\n ...reflectionNodes(emitter, path),\n ...(emitter.channels ?? []).map((channel, channelIndex) =>\n node({\n id: `channel:${emitter.id}:${channel.id}`,\n role: 'channel',\n label: channel.id,\n sourcePath: `${path}.channels[${channelIndex}]`,\n fields: fields(`${path}.channels[${channelIndex}]`, channel, ['id']),\n }),\n ),\n ...(emitter.events ?? []).map((event, eventIndex) =>\n node({\n id: `event:${emitter.id}:${event.id}`,\n role: 'event',\n label: event.id,\n sourcePath: `${path}.events[${eventIndex}]`,\n fields: fields(`${path}.events[${eventIndex}]`, event, ['id']),\n }),\n ),\n ...emitter.renderers.map((renderer, rendererIndex) =>\n node({\n id: `renderer:${emitter.id}:${rendererIndex}`,\n role: 'renderer',\n label: `${renderer.kind} renderer`,\n sourcePath: `${path}.renderers[${rendererIndex}]`,\n fields: fields(`${path}.renderers[${rendererIndex}]`, renderer, ['kind']),\n }),\n ),\n ];\n return Object.freeze({\n id: `emitter:${emitter.id}`,\n role: 'emitter',\n label: emitter.id,\n module: emitter.module,\n sourcePath: path,\n fields: Object.freeze([\n field(`${path}.capacity`, emitter.capacity),\n field(`${path}.space`, emitter.space),\n field(`${path}.bounds`, emitter.bounds),\n field(`${path}.simulationWhenCulled`, emitter.simulationWhenCulled),\n ]),\n children: Object.freeze(children),\n });\n}\n\nfunction dependencies(effect: VfxGpuEffectAsset): readonly VfxAuthoringDependencyDescriptor[] {\n const entries: VfxAuthoringDependencyDescriptor[] = [];\n const seen = new Set<string>();\n const add = (entry: VfxAuthoringDependencyDescriptor): void => {\n const key = `${entry.kind}:${entry.identity}`;\n if (seen.has(key)) return;\n seen.add(key);\n entries.push(Object.freeze(entry));\n };\n for (const [emitterIndex, emitter] of effect.program.emitters.entries()) {\n const path = `emitters[${emitterIndex}]`;\n add({ kind: 'module', identity: emitter.module, sourcePath: `${path}.program.module` });\n for (const identity of emitter.reflection.imports) {\n add({ kind: 'module', identity, sourcePath: `${path}.program.imports` });\n }\n for (const [rendererIndex, renderer] of emitter.renderers.entries()) {\n add({\n kind: 'asset',\n identity: renderer.material,\n sourcePath: `${path}.renderers[${rendererIndex}].material`,\n });\n if (renderer.kind === 'mesh') {\n add({\n kind: 'asset',\n identity: renderer.mesh,\n sourcePath: `${path}.renderers[${rendererIndex}].mesh`,\n });\n }\n }\n for (const requirement of emitter.reflection.dataInterfaces ?? []) {\n add({ kind: 'data-interface', identity: requirement.token, sourcePath: `${path}.program` });\n }\n }\n return Object.freeze(entries);\n}\n\n/** Project the cooked runtime asset into a compiler-free, UI-neutral authoring read model. */\nexport function describeVfxGpuEffect(effect: VfxGpuEffectAsset): VfxAuthoringDescriptor {\n return Object.freeze({\n version: 1,\n assetGuid: effect.guid,\n schemaVersion: 2,\n artifactFingerprint: effect.program.fingerprint,\n emitters: Object.freeze(effect.program.emitters.map(emitterNode)),\n timeline: Object.freeze(\n effect.program.emitters.map((emitter) =>\n Object.freeze({\n emitterId: emitter.id,\n rate: emitter.schedule.rate,\n bursts: Object.freeze([...(emitter.schedule.bursts ?? [])]),\n ...(emitter.schedule.loopDuration === undefined\n ? {}\n : { loopDuration: emitter.schedule.loopDuration }),\n }),\n ),\n ),\n dependencies: dependencies(effect),\n capabilities: CAPABILITIES,\n });\n}\n","import { err, ok, type Result } from '@forgeax/engine-types';\n\n/** Engine-owned seed module used by newly-authored particle effects. */\nexport const PARTICLE_CODE_DEFAULT_MODULE_ID = 'forgeax_vfx::default' as const;\n\nexport type ParticleBoundsSource =\n | {\n readonly kind: 'aabb';\n readonly min: readonly [number, number, number];\n readonly max: readonly [number, number, number];\n }\n | {\n readonly kind: 'sphere';\n readonly center: readonly [number, number, number];\n readonly radius: number;\n };\n\nexport type ParticleRendererOverflowPolicy = 'drop-newest' | 'drop-oldest';\nexport type ParticleRendererSorting = 'none' | 'emitter' | 'back-to-front';\n\nexport interface ParticleTextureSheetSource {\n readonly columns: number;\n readonly rows: number;\n readonly frameRate: number;\n readonly frameCount?: number;\n}\n\nexport interface ParticleSoftParticleSource {\n readonly fadeDistance: number;\n}\n\nexport type ParticleRendererSource =\n | {\n readonly kind: 'billboard';\n readonly material: string;\n readonly blend?: 'additive' | 'alpha' | 'opaque-cutout';\n readonly enabled?: boolean;\n readonly capacity?: number;\n readonly overflow?: ParticleRendererOverflowPolicy;\n readonly textureSheet?: ParticleTextureSheetSource;\n readonly pivot?: readonly [number, number];\n readonly softParticle?: ParticleSoftParticleSource;\n readonly sorting?: ParticleRendererSorting;\n }\n | {\n readonly kind: 'mesh';\n readonly material: string;\n readonly mesh: string;\n readonly submesh?: number;\n readonly enabled?: boolean;\n }\n | {\n readonly kind: 'ribbon';\n readonly material: string;\n readonly stripKey: 'alive-index';\n readonly capacity: number;\n readonly overflow?: ParticleRendererOverflowPolicy;\n readonly enabled?: boolean;\n readonly width?: number;\n }\n | {\n readonly kind: 'trail';\n readonly material: string;\n readonly historyLength: number;\n readonly capacity: number;\n readonly overflow?: ParticleRendererOverflowPolicy;\n readonly enabled?: boolean;\n readonly width?: number;\n }\n | {\n readonly kind: 'beam';\n readonly material: string;\n readonly endpointField: 'velocity';\n readonly capacity: number;\n readonly overflow?: ParticleRendererOverflowPolicy;\n readonly enabled?: boolean;\n readonly width?: number;\n };\n\nexport type ParticleChannelOverflowPolicy = ParticleRendererOverflowPolicy;\n\nexport type ParticleStageDomain = 'particle';\nexport type ParticleStageResourceAccess = 'read' | 'write' | 'read-write';\n\nexport interface ParticleStageResourceSource {\n readonly name: string;\n readonly access: ParticleStageResourceAccess;\n}\n\nexport interface ParticleStageSource {\n readonly id: string;\n readonly entry: string;\n readonly domain: ParticleStageDomain;\n readonly resources: readonly ParticleStageResourceSource[];\n readonly dependsOn: readonly string[];\n readonly iterationBudget: number;\n}\n\nexport const PARTICLE_STAGE_RESOURCE_NAMES = Object.freeze([\n 'particles',\n 'runtime',\n 'aliveIndices',\n 'counters',\n 'indirect',\n 'scratch',\n 'billboardInstances',\n 'channelInputs',\n 'events',\n 'eventCounters',\n] as const);\n\nexport interface ParticleChannelSource {\n readonly id: string;\n readonly payload?: 'impact';\n readonly capacity: number;\n readonly overflow: ParticleChannelOverflowPolicy;\n}\n\nexport interface ParticleEventSource {\n readonly id: string;\n readonly channel: string;\n readonly subEmitter: string;\n readonly fanOut: number;\n readonly recursionDepth: number;\n}\n\nexport interface ParticleEmitterSourceV2 {\n readonly id: string;\n readonly capacity: number;\n readonly backend: { readonly required: 'gpu' };\n readonly space: 'local' | 'world';\n readonly bounds: ParticleBoundsSource;\n readonly schedule: {\n readonly rate: number;\n readonly bursts?: readonly { readonly time: number; readonly count: number }[];\n readonly loopDuration?: number;\n };\n readonly program: { readonly module: string };\n readonly renderers: readonly ParticleRendererSource[];\n readonly channels?: readonly ParticleChannelSource[];\n readonly events?: readonly ParticleEventSource[];\n readonly simulationWhenCulled?: 'continue' | 'pause' | 'restart-on-visible';\n}\n\nexport interface ParticleEffectRootSourceV2 {\n readonly schemaVersion: 2;\n readonly emitters: readonly ParticleEmitterSourceV2[];\n}\n\nexport type ParticleEffectSourceV2 = ParticleEffectRootSourceV2;\n\nexport interface ParticleCodeSourceInvalidDetail {\n readonly path: string;\n readonly emitterId?: string;\n readonly stageId?: string;\n readonly resource?: string;\n}\n\nexport interface ParticleCodeSourceError {\n readonly code:\n | 'vfx-source-invalid'\n | 'vfx-source-version-unsupported'\n | 'vfx-source-channel-invalid'\n | 'vfx-source-event-invalid'\n | 'vfx-source-stage-invalid'\n | 'vfx-source-renderer-invalid';\n readonly expected: string;\n readonly hint: string;\n readonly detail: ParticleCodeSourceInvalidDetail;\n}\n\nfunction invalid(\n path: string,\n expected: string,\n emitterId?: string,\n code: ParticleCodeSourceError['code'] = 'vfx-source-invalid',\n): Result<never, ParticleCodeSourceError> {\n return err({\n code,\n expected,\n hint: `repair ${path} and recook the particle effect`,\n detail: emitterId === undefined ? { path } : { path, emitterId },\n });\n}\n\nfunction eventInvalid(\n code: 'vfx-source-channel-invalid' | 'vfx-source-event-invalid',\n path: string,\n expected: string,\n emitterId?: string,\n): Result<never, ParticleCodeSourceError> {\n return invalid(path, expected, emitterId, code);\n}\n\nfunction record(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction finite(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value);\n}\n\nfunction positiveInteger(value: unknown): value is number {\n return finite(value) && Number.isInteger(value) && value > 0;\n}\n\nfunction nonNegativeInteger(value: unknown): value is number {\n return finite(value) && Number.isInteger(value) && value >= 0;\n}\n\nfunction text(value: unknown): value is string {\n return typeof value === 'string' && value.length > 0;\n}\n\nfunction vector(value: unknown, size: number): value is readonly number[] {\n return Array.isArray(value) && value.length === size && value.every(finite);\n}\n\nfunction allowed(value: Record<string, unknown>, keys: readonly string[]): string | undefined {\n const set = new Set(keys);\n return Object.keys(value).find((key) => !set.has(key));\n}\n\nfunction stageInvalid(\n path: string,\n expected: string,\n stageId?: string,\n resource?: string,\n): Result<never, ParticleCodeSourceError> {\n return err({\n code: 'vfx-source-stage-invalid',\n expected,\n hint: `repair stage ${path} and recook the stage declaration`,\n detail: {\n path,\n ...(stageId === undefined ? {} : { stageId }),\n ...(resource === undefined ? {} : { resource }),\n },\n });\n}\n\nconst STAGE_FIELDS = ['entry', 'domain', 'resources', 'dependsOn', 'iterationBudget'] as const;\nconst STAGE_RESOURCE_NAMES = new Set<string>(PARTICLE_STAGE_RESOURCE_NAMES);\n\nfunction parseStageResources(\n value: string,\n path: string,\n stageId: string,\n): Result<readonly ParticleStageResourceSource[], ParticleCodeSourceError> {\n if (value.length === 0)\n return stageInvalid(path, 'at least one explicit stage resource', stageId);\n const resources: ParticleStageResourceSource[] = [];\n const names = new Set<string>();\n for (const item of value.split(',')) {\n const [name, access, extra] = item.split(':');\n if (\n name === undefined ||\n access === undefined ||\n extra !== undefined ||\n !STAGE_RESOURCE_NAMES.has(name) ||\n (access !== 'read' && access !== 'write' && access !== 'read-write') ||\n names.has(name)\n ) {\n return stageInvalid(\n path,\n 'known resources with unique read, write, or read-write access',\n stageId,\n name,\n );\n }\n names.add(name);\n resources.push({ name, access });\n }\n return ok(Object.freeze(resources));\n}\n\n/** Parse compiler-owned stage metadata from authored WGSL comments. */\nexport function parseVfxStageDeclarations(\n source: string,\n): Result<readonly ParticleStageSource[], ParticleCodeSourceError> {\n const stages: ParticleStageSource[] = [];\n const ids = new Set<string>();\n const pattern = /^\\s*\\/\\/\\s*#vfx\\s+stage\\s+([^\\s]+)\\s+(.+)$/gm;\n for (const match of source.matchAll(pattern)) {\n const id = match[1];\n const fieldsText = match[2];\n if (id === undefined || fieldsText === undefined || !/^[A-Za-z_]\\w*$/.test(id) || ids.has(id)) {\n return stageInvalid(\n `stage.${id ?? 'unknown'}`,\n 'a unique stage id and supported stage declaration',\n id,\n );\n }\n const fields: Record<string, string> = {};\n for (const token of fieldsText.trim().split(/\\s+/)) {\n const separator = token.indexOf('=');\n const key = separator < 0 ? undefined : token.slice(0, separator);\n const value = separator < 0 ? undefined : token.slice(separator + 1);\n if (\n key === undefined ||\n value === undefined ||\n !STAGE_FIELDS.includes(key as (typeof STAGE_FIELDS)[number]) ||\n fields[key] !== undefined\n ) {\n return stageInvalid(\n `stage.${id}`,\n 'a supported stage declaration with entry, domain, resources, dependsOn, and iterationBudget fields',\n id,\n );\n }\n fields[key] = value;\n }\n const entry = fields.entry;\n const domain = fields.domain;\n const resourcesValue = fields.resources;\n const dependsOnValue = fields.dependsOn;\n const budgetValue = fields.iterationBudget;\n if (\n entry === undefined ||\n !/^[A-Za-z_]\\w*$/.test(entry) ||\n entry.startsWith('forgeax_vfx_') ||\n domain !== 'particle' ||\n resourcesValue === undefined ||\n dependsOnValue === undefined ||\n budgetValue === undefined\n ) {\n return stageInvalid(\n `stage.${id}`,\n 'a particle-domain stage with an author entry and explicit fields',\n id,\n );\n }\n const resources = parseStageResources(resourcesValue, `stage.${id}.resources`, id);\n if (!resources.ok) return resources;\n const iterationBudget = Number(budgetValue);\n if (!Number.isInteger(iterationBudget) || iterationBudget < 1 || iterationBudget > 64) {\n return stageInvalid(\n `stage.${id}.iterationBudget`,\n 'an integer iteration budget from 1 through 64',\n id,\n );\n }\n const dependsOn =\n dependsOnValue === 'none'\n ? []\n : dependsOnValue.split(',').filter((dependency) => dependency.length > 0);\n if (dependsOn.some((dependency) => !/^[A-Za-z_]\\w*$/.test(dependency))) {\n return stageInvalid(`stage.${id}.dependsOn`, 'stage identifiers or none', id);\n }\n ids.add(id);\n stages.push({\n id,\n entry,\n domain: 'particle',\n resources: resources.value,\n dependsOn: Object.freeze(dependsOn),\n iterationBudget,\n });\n }\n return ok(Object.freeze(stages));\n}\n\nfunction parseEmitter(\n value: unknown,\n index: number,\n ids: Set<string>,\n): Result<ParticleEmitterSourceV2, ParticleCodeSourceError> {\n const path = `emitters[${index}]`;\n if (!record(value)) return invalid(path, 'a v2 emitter object');\n const extra = allowed(value, [\n 'id',\n 'capacity',\n 'backend',\n 'space',\n 'bounds',\n 'schedule',\n 'program',\n 'renderers',\n 'channels',\n 'events',\n 'simulationWhenCulled',\n ]);\n if (extra !== undefined) return invalid(`${path}.${extra}`, 'a v2 emitter field');\n if (!text(value.id) || ids.has(value.id)) return invalid(`${path}.id`, 'a unique non-empty id');\n const id = value.id;\n ids.add(id);\n if (!positiveInteger(value.capacity))\n return invalid(`${path}.capacity`, 'a positive integer', id);\n if (!record(value.backend) || value.backend.required !== 'gpu') {\n return invalid(`${path}.backend`, \"the explicit policy { required: 'gpu' }\", id);\n }\n const backendExtra = allowed(value.backend, ['required']);\n if (backendExtra !== undefined) {\n return invalid(`${path}.backend.${backendExtra}`, 'the required GPU policy', id);\n }\n if (value.space !== 'local' && value.space !== 'world') {\n return invalid(`${path}.space`, 'local or world', id);\n }\n if (!record(value.bounds)) return invalid(`${path}.bounds`, 'fixed aabb or sphere bounds', id);\n const boundsExtra = allowed(\n value.bounds,\n value.bounds.kind === 'aabb'\n ? ['kind', 'min', 'max']\n : value.bounds.kind === 'sphere'\n ? ['kind', 'center', 'radius']\n : ['kind'],\n );\n if (boundsExtra !== undefined) {\n return invalid(`${path}.bounds.${boundsExtra}`, 'a supported bounds field', id);\n }\n const boundsOk =\n (value.bounds.kind === 'aabb' && vector(value.bounds.min, 3) && vector(value.bounds.max, 3)) ||\n (value.bounds.kind === 'sphere' &&\n vector(value.bounds.center, 3) &&\n finite(value.bounds.radius) &&\n value.bounds.radius > 0);\n if (!boundsOk) return invalid(`${path}.bounds`, 'valid fixed aabb or sphere bounds', id);\n if (!record(value.schedule) || !finite(value.schedule.rate) || value.schedule.rate < 0) {\n return invalid(`${path}.schedule`, 'a non-negative spawn schedule', id);\n }\n const scheduleExtra = allowed(value.schedule, ['rate', 'bursts', 'loopDuration']);\n if (scheduleExtra !== undefined) {\n return invalid(`${path}.schedule.${scheduleExtra}`, 'a supported schedule field', id);\n }\n if (\n value.schedule.bursts !== undefined &&\n (!Array.isArray(value.schedule.bursts) ||\n value.schedule.bursts.some(\n (burst) =>\n !record(burst) || !finite(burst.time) || burst.time < 0 || !positiveInteger(burst.count),\n ))\n ) {\n return invalid(`${path}.schedule.bursts`, 'non-negative timed positive bursts', id);\n }\n if (Array.isArray(value.schedule.bursts)) {\n for (const [burstIndex, burst] of value.schedule.bursts.entries()) {\n if (!record(burst)) continue;\n const burstExtra = allowed(burst, ['time', 'count']);\n if (burstExtra !== undefined) {\n return invalid(\n `${path}.schedule.bursts[${burstIndex}].${burstExtra}`,\n 'a supported burst field',\n id,\n );\n }\n }\n }\n if (\n value.schedule.loopDuration !== undefined &&\n (!finite(value.schedule.loopDuration) || value.schedule.loopDuration <= 0)\n ) {\n return invalid(`${path}.schedule.loopDuration`, 'a positive finite duration', id);\n }\n if (!record(value.program) || !text(value.program.module)) {\n return invalid(`${path}.program.module`, 'a WGSL module identity', id);\n }\n const programExtra = allowed(value.program, ['module']);\n if (programExtra !== undefined) {\n return invalid(`${path}.program.${programExtra}`, 'a supported program field', id);\n }\n if (!Array.isArray(value.renderers) || value.renderers.length === 0) {\n return invalid(`${path}.renderers`, 'at least one renderer', id);\n }\n for (const [rendererIndex, renderer] of value.renderers.entries()) {\n const rendererPath = `${path}.renderers[${rendererIndex}]`;\n if (!record(renderer) || !text(renderer.material) || !text(renderer.kind))\n return invalid(\n rendererPath,\n 'a supported renderer object',\n id,\n 'vfx-source-renderer-invalid',\n );\n const common = ['kind', 'material', 'enabled', 'capacity', 'overflow', 'width'] as const;\n const rendererExtra = allowed(\n renderer,\n renderer.kind === 'billboard'\n ? [...common, 'blend', 'textureSheet', 'pivot', 'softParticle', 'sorting']\n : renderer.kind === 'mesh'\n ? ['kind', 'material', 'mesh', 'submesh', 'enabled']\n : renderer.kind === 'ribbon'\n ? [...common, 'stripKey']\n : renderer.kind === 'trail'\n ? [...common, 'historyLength']\n : renderer.kind === 'beam'\n ? [...common, 'endpointField']\n : ['kind'],\n );\n if (rendererExtra !== undefined)\n return invalid(\n `${rendererPath}.${rendererExtra}`,\n 'a supported renderer field',\n id,\n 'vfx-source-renderer-invalid',\n );\n if (renderer.kind === 'mesh') {\n if (\n !text(renderer.mesh) ||\n (renderer.submesh !== undefined && !nonNegativeInteger(renderer.submesh))\n )\n return invalid(\n rendererPath,\n 'a mesh renderer with a non-negative submesh',\n id,\n 'vfx-source-renderer-invalid',\n );\n continue;\n }\n if (renderer.enabled !== undefined && typeof renderer.enabled !== 'boolean')\n return invalid(\n `${rendererPath}.enabled`,\n 'a boolean enabled flag',\n id,\n 'vfx-source-renderer-invalid',\n );\n if (\n renderer.capacity !== undefined &&\n (!positiveInteger(renderer.capacity) || renderer.capacity > 65536)\n )\n return invalid(\n `${rendererPath}.capacity`,\n 'a positive capacity no greater than 65536',\n id,\n 'vfx-source-renderer-invalid',\n );\n if (\n renderer.overflow !== undefined &&\n renderer.overflow !== 'drop-newest' &&\n renderer.overflow !== 'drop-oldest'\n )\n return invalid(\n `${rendererPath}.overflow`,\n 'drop-newest or drop-oldest',\n id,\n 'vfx-source-renderer-invalid',\n );\n if (renderer.width !== undefined && (!finite(renderer.width) || renderer.width <= 0))\n return invalid(\n `${rendererPath}.width`,\n 'a positive finite width',\n id,\n 'vfx-source-renderer-invalid',\n );\n if (renderer.kind === 'billboard') {\n if (\n renderer.blend !== undefined &&\n renderer.blend !== 'additive' &&\n renderer.blend !== 'alpha' &&\n renderer.blend !== 'opaque-cutout'\n )\n return invalid(\n `${rendererPath}.blend`,\n 'additive, alpha, or opaque-cutout',\n id,\n 'vfx-source-renderer-invalid',\n );\n if (\n renderer.sorting !== undefined &&\n renderer.sorting !== 'none' &&\n renderer.sorting !== 'emitter' &&\n renderer.sorting !== 'back-to-front'\n )\n return invalid(\n `${rendererPath}.sorting`,\n 'none, emitter, or back-to-front',\n id,\n 'vfx-source-renderer-invalid',\n );\n if (\n renderer.pivot !== undefined &&\n (!vector(renderer.pivot, 2) || renderer.pivot.some((value) => value < -1 || value > 1))\n )\n return invalid(\n `${rendererPath}.pivot`,\n 'two finite values in the -1..1 range',\n id,\n 'vfx-source-renderer-invalid',\n );\n if (renderer.textureSheet !== undefined && !record(renderer.textureSheet))\n return invalid(\n `${rendererPath}.textureSheet`,\n 'a texture sheet object',\n id,\n 'vfx-source-renderer-invalid',\n );\n if (renderer.textureSheet !== undefined && record(renderer.textureSheet)) {\n const sheet = renderer.textureSheet;\n const sheetExtra = allowed(sheet, ['columns', 'rows', 'frameRate', 'frameCount']);\n if (\n sheetExtra !== undefined ||\n !positiveInteger(sheet.columns) ||\n !positiveInteger(sheet.rows) ||\n sheet.columns > 64 ||\n sheet.rows > 64 ||\n !finite(sheet.frameRate) ||\n sheet.frameRate < 0 ||\n (sheet.frameCount !== undefined &&\n (!positiveInteger(sheet.frameCount) || sheet.frameCount > sheet.columns * sheet.rows))\n )\n return invalid(\n `${rendererPath}.textureSheet`,\n 'a bounded texture sheet declaration',\n id,\n 'vfx-source-renderer-invalid',\n );\n }\n if (renderer.softParticle !== undefined && !record(renderer.softParticle))\n return invalid(\n `${rendererPath}.softParticle`,\n 'a soft-particle object',\n id,\n 'vfx-source-renderer-invalid',\n );\n if (renderer.softParticle !== undefined && record(renderer.softParticle)) {\n const softExtra = allowed(renderer.softParticle, ['fadeDistance']);\n if (\n softExtra !== undefined ||\n !finite(renderer.softParticle.fadeDistance) ||\n renderer.softParticle.fadeDistance <= 0\n )\n return invalid(\n `${rendererPath}.softParticle`,\n 'a positive scene-depth fade distance',\n id,\n 'vfx-source-renderer-invalid',\n );\n }\n } else if (renderer.kind === 'ribbon') {\n if (renderer.stripKey !== 'alive-index' || !positiveInteger(renderer.capacity))\n return invalid(\n rendererPath,\n \"stripKey 'alive-index' and positive capacity\",\n id,\n 'vfx-source-renderer-invalid',\n );\n } else if (renderer.kind === 'trail') {\n if (\n !positiveInteger(renderer.historyLength) ||\n renderer.historyLength > 256 ||\n !positiveInteger(renderer.capacity)\n )\n return invalid(\n rendererPath,\n 'a bounded trail historyLength and positive capacity',\n id,\n 'vfx-source-renderer-invalid',\n );\n } else if (renderer.kind === 'beam') {\n if (renderer.endpointField !== 'velocity' || !positiveInteger(renderer.capacity))\n return invalid(\n rendererPath,\n \"endpointField 'velocity' and positive capacity\",\n id,\n 'vfx-source-renderer-invalid',\n );\n } else {\n return invalid(\n rendererPath,\n 'billboard, mesh, ribbon, trail, or beam',\n id,\n 'vfx-source-renderer-invalid',\n );\n }\n }\n if (value.channels !== undefined) {\n if (!Array.isArray(value.channels) || value.channels.length === 0) {\n return eventInvalid(\n 'vfx-source-channel-invalid',\n `${path}.channels`,\n 'a non-empty bounded channel list',\n id,\n );\n }\n const channelIds = new Set<string>();\n for (const [channelIndex, channel] of value.channels.entries()) {\n const channelPath = `${path}.channels[${channelIndex}]`;\n if (!record(channel)) {\n return eventInvalid('vfx-source-channel-invalid', channelPath, 'a channel object', id);\n }\n const channelExtra = allowed(channel, ['id', 'payload', 'capacity', 'overflow']);\n if (channelExtra !== undefined) {\n return eventInvalid(\n 'vfx-source-channel-invalid',\n `${channelPath}.${channelExtra}`,\n 'a supported channel field',\n id,\n );\n }\n if (!text(channel.id) || channelIds.has(channel.id)) {\n return eventInvalid(\n 'vfx-source-channel-invalid',\n `${channelPath}.id`,\n 'a unique non-empty channel id',\n id,\n );\n }\n if (\n !positiveInteger(channel.capacity) ||\n channel.capacity > 65536 ||\n (channel.payload !== undefined && channel.payload !== 'impact') ||\n (channel.overflow !== 'drop-newest' && channel.overflow !== 'drop-oldest')\n ) {\n return eventInvalid(\n 'vfx-source-channel-invalid',\n channelPath,\n 'an impact channel with capacity 1..65536 and explicit overflow policy',\n id,\n );\n }\n channelIds.add(channel.id);\n }\n }\n if (value.events !== undefined) {\n if (!Array.isArray(value.events)) {\n return eventInvalid('vfx-source-event-invalid', `${path}.events`, 'an event list', id);\n }\n const eventIds = new Set<string>();\n for (const [eventIndex, event] of value.events.entries()) {\n const eventPath = `${path}.events[${eventIndex}]`;\n if (!record(event)) {\n return eventInvalid('vfx-source-event-invalid', eventPath, 'an event object', id);\n }\n const eventExtra = allowed(event, [\n 'id',\n 'channel',\n 'subEmitter',\n 'fanOut',\n 'recursionDepth',\n ]);\n if (eventExtra !== undefined) {\n return eventInvalid(\n 'vfx-source-event-invalid',\n `${eventPath}.${eventExtra}`,\n 'a supported event field',\n id,\n );\n }\n if (!text(event.id) || eventIds.has(event.id)) {\n return eventInvalid('vfx-source-event-invalid', `${eventPath}.id`, 'a unique event id', id);\n }\n if (\n !text(event.channel) ||\n !text(event.subEmitter) ||\n !positiveInteger(event.fanOut) ||\n event.fanOut > 16 ||\n !positiveInteger(event.recursionDepth) ||\n event.recursionDepth > 8\n ) {\n return eventInvalid(\n 'vfx-source-event-invalid',\n eventPath,\n 'an event with bounded fanOut 1..16 and recursionDepth 1..8',\n id,\n );\n }\n eventIds.add(event.id);\n }\n }\n if (\n value.simulationWhenCulled !== undefined &&\n value.simulationWhenCulled !== 'continue' &&\n value.simulationWhenCulled !== 'pause' &&\n value.simulationWhenCulled !== 'restart-on-visible'\n ) {\n return invalid(`${path}.simulationWhenCulled`, 'continue, pause, or restart-on-visible', id);\n }\n return ok(value as unknown as ParticleEmitterSourceV2);\n}\n\nexport function parseParticleEffectSourceV2(\n value: unknown,\n): Result<ParticleEffectSourceV2, ParticleCodeSourceError> {\n if (!record(value)) return invalid('$', 'a particle effect source object');\n if (value.schemaVersion !== 2) {\n return err({\n code: 'vfx-source-version-unsupported',\n expected: 'ParticleEffectSource schemaVersion 2',\n hint: 'migrate code behavior to WGSL and recook; v1 is not interpreted at runtime',\n detail: { path: 'schemaVersion' },\n });\n }\n const extra = allowed(value, ['schemaVersion', 'emitters']);\n if (extra !== undefined) return invalid(extra, 'a root field: emitters');\n if (!Array.isArray(value.emitters) || value.emitters.length === 0) {\n return invalid('emitters', 'at least one v2 emitter');\n }\n const ids = new Set<string>();\n const emitters: ParticleEmitterSourceV2[] = [];\n for (const [index, emitter] of value.emitters.entries()) {\n const parsed = parseEmitter(emitter, index, ids);\n if (!parsed.ok) return parsed;\n emitters.push(parsed.value);\n }\n const emitterIds = new Set(emitters.map((emitter) => emitter.id));\n for (const emitter of emitters) {\n const channels = new Set((emitter.channels ?? []).map((channel) => channel.id));\n for (const event of emitter.events ?? []) {\n if (!channels.has(event.channel)) {\n return eventInvalid(\n 'vfx-source-event-invalid',\n `emitters[${emitters.indexOf(emitter)}].events.${event.id}.channel`,\n 'the id of a channel declared on the same emitter',\n emitter.id,\n );\n }\n if (!emitterIds.has(event.subEmitter)) {\n return eventInvalid(\n 'vfx-source-event-invalid',\n `emitters[${emitters.indexOf(emitter)}].events.${event.id}.subEmitter`,\n 'the id of an emitter in the same cooked effect',\n emitter.id,\n );\n }\n }\n }\n return ok(\n Object.freeze({\n schemaVersion: 2,\n emitters: Object.freeze(emitters),\n }),\n );\n}\n\nexport function defineParticleEffectSourceV2<T extends ParticleEffectSourceV2>(source: T): T {\n const parsed = parseParticleEffectSourceV2(source);\n if (!parsed.ok) throw new TypeError(`${parsed.error.code}: ${parsed.error.expected}`);\n return source;\n}\n","import { err, ok, type Result } from '@forgeax/engine-types';\n\nexport type VfxDataInterfaceKind = keyof VfxDataInterfaceBindingTypeByKind;\n\nexport type VfxDataInterfaceToken = `vfx:${VfxDataInterfaceKind}`;\n\nexport type VfxDataInterfaceBindingType = VfxDataInterfaceBindingTypeByKind[VfxDataInterfaceKind];\n\ntype VfxDataInterfaceBindingTypeByKind = {\n readonly camera: 'uniform';\n readonly 'scene-depth': 'sampled-depth';\n readonly noise: 'sampled-float';\n readonly channel: 'storage-read';\n};\n\nexport type VfxDataInterfaceLifetime = 'generation';\n\nexport interface VfxDataInterfaceRequirement {\n readonly token: VfxDataInterfaceToken;\n readonly kind: VfxDataInterfaceKind;\n readonly binding: number;\n readonly bindingType: VfxDataInterfaceBindingType;\n readonly lifetime: VfxDataInterfaceLifetime;\n}\n\nexport interface VfxDataInterfaceResource {\n readonly token: VfxDataInterfaceToken;\n readonly kind: VfxDataInterfaceKind;\n readonly bindingType: VfxDataInterfaceBindingType;\n readonly generation: number;\n}\n\nexport interface VfxDataInterfaceErrorDetail {\n readonly token: VfxDataInterfaceToken;\n readonly providerId?: string;\n readonly expectedGeneration?: number;\n readonly actualGeneration?: number;\n readonly expectedBindingType?: VfxDataInterfaceBindingType;\n readonly actualBindingType?: VfxDataInterfaceBindingType;\n}\n\nexport interface VfxDataInterfaceError {\n readonly code:\n | 'vfx-data-interface-missing'\n | 'vfx-data-interface-wrong-type'\n | 'vfx-data-interface-stale'\n | 'vfx-data-interface-duplicate';\n readonly expected: string;\n readonly hint: string;\n readonly detail: VfxDataInterfaceErrorDetail;\n}\n\nexport type VfxDataInterfaceProvider<K extends VfxDataInterfaceKind = VfxDataInterfaceKind> = {\n readonly id: string;\n readonly token: `vfx:${K}`;\n readonly kind: K;\n readonly bindingType: VfxDataInterfaceBindingTypeByKind[K];\n readonly provide: (generation: number) => Result<VfxDataInterfaceResource, VfxDataInterfaceError>;\n};\n\nexport interface VfxDataInterfaceResolution {\n readonly generation: number;\n readonly readiness: 'ready';\n readonly resources: readonly VfxDataInterfaceResource[];\n}\n\nfunction failure(\n code: VfxDataInterfaceError['code'],\n requirement: VfxDataInterfaceRequirement,\n expected: string,\n hint: string,\n detail: Omit<VfxDataInterfaceErrorDetail, 'token'> = {},\n): VfxDataInterfaceError {\n return { code, expected, hint, detail: { token: requirement.token, ...detail } };\n}\n\nexport function resolveVfxDataInterfaces(\n requirements: readonly VfxDataInterfaceRequirement[],\n providers: readonly VfxDataInterfaceProvider[],\n generation: number,\n): Result<VfxDataInterfaceResolution, VfxDataInterfaceError> {\n const byToken = new Map<VfxDataInterfaceToken, VfxDataInterfaceProvider>();\n for (const provider of providers) {\n const prior = byToken.get(provider.token);\n if (prior !== undefined) {\n const requirement = requirements.find((entry) => entry.token === provider.token) ?? {\n token: provider.token,\n kind: provider.kind,\n binding: -1,\n bindingType: provider.bindingType,\n lifetime: 'generation',\n };\n return err(\n failure(\n 'vfx-data-interface-duplicate',\n requirement,\n 'at most one provider for each reflected Data Interface token',\n `remove duplicate providers ${prior.id} and ${provider.id} and retry`,\n { providerId: provider.id },\n ),\n );\n }\n byToken.set(provider.token, provider);\n }\n\n const resources: VfxDataInterfaceResource[] = [];\n for (const requirement of requirements) {\n const provider = byToken.get(requirement.token);\n if (provider === undefined) {\n return err(\n failure(\n 'vfx-data-interface-missing',\n requirement,\n `a registered ${requirement.kind} provider for ${requirement.token}`,\n `register ${requirement.token} for generation ${generation} before starting the effect`,\n ),\n );\n }\n if (provider.kind !== requirement.kind || provider.bindingType !== requirement.bindingType) {\n return err(\n failure(\n 'vfx-data-interface-wrong-type',\n requirement,\n `${requirement.kind} with ${requirement.bindingType} binding semantics`,\n `replace provider ${provider.id} with a ${requirement.token} provider matching reflection`,\n {\n providerId: provider.id,\n expectedBindingType: requirement.bindingType,\n actualBindingType: provider.bindingType,\n },\n ),\n );\n }\n const provided = provider.provide(generation);\n if (!provided.ok) return provided;\n const resource = provided.value;\n if (resource.token !== requirement.token || resource.kind !== requirement.kind) {\n return err(\n failure(\n 'vfx-data-interface-wrong-type',\n requirement,\n `${requirement.kind} resource for ${requirement.token}`,\n `repair provider ${provider.id} so its resource matches its reflected token`,\n { providerId: provider.id },\n ),\n );\n }\n if (resource.bindingType !== requirement.bindingType) {\n return err(\n failure(\n 'vfx-data-interface-wrong-type',\n requirement,\n `resource binding type ${requirement.bindingType}`,\n `repair provider ${provider.id} resource binding metadata`,\n {\n providerId: provider.id,\n expectedBindingType: requirement.bindingType,\n actualBindingType: resource.bindingType,\n },\n ),\n );\n }\n if (resource.generation !== generation) {\n return err(\n failure(\n 'vfx-data-interface-stale',\n requirement,\n `a resource from generation ${generation}`,\n `refresh provider ${provider.id} for generation ${generation} before rendering`,\n {\n providerId: provider.id,\n expectedGeneration: generation,\n actualGeneration: resource.generation,\n },\n ),\n );\n }\n resources.push(resource);\n }\n return ok({ generation, readiness: 'ready', resources: Object.freeze(resources) });\n}\n","import { err, ok, type Result } from '@forgeax/engine-types';\nimport type { VfxDataInterfaceRequirement } from './data-interface.js';\n\nexport type VfxValue = number | readonly number[];\nexport type VfxValueMap = Readonly<Record<string, VfxValue>>;\n\nexport interface VfxReflectedField {\n readonly name: string;\n readonly type: VfxValueType;\n readonly offset: number;\n readonly size: number;\n readonly alignment: number;\n readonly defaultValue?: VfxValue;\n}\n\nexport interface VfxReflectedStruct {\n readonly name: string;\n readonly fields: readonly VfxReflectedField[];\n readonly size: number;\n readonly alignment: number;\n}\n\nexport interface VfxEffectReflection {\n readonly version: 1;\n readonly parameters: VfxReflectedStruct;\n readonly custom: VfxReflectedStruct;\n readonly dataInterfaces?: readonly VfxDataInterfaceRequirement[];\n readonly fingerprint: string;\n}\n\nexport interface VfxEffectContractErrorDetail {\n readonly path: string;\n readonly actual?: unknown;\n}\n\nexport interface VfxEffectContractError {\n readonly code:\n | 'vfx-value-unknown-field'\n | 'vfx-value-type-mismatch'\n | 'vfx-value-not-finite'\n | 'vfx-reflection-invalid';\n readonly expected: string;\n readonly hint: string;\n readonly detail: VfxEffectContractErrorDetail;\n}\n\nexport interface VfxEffectContract<Values extends VfxValueMap = VfxValueMap> {\n readonly reflection: VfxEffectReflection;\n readonly fingerprint: string;\n readonly packedSize: number;\n readonly defaults: Values;\n createValues(initial?: Partial<Values>): Result<Values, VfxEffectContractError>;\n validateValues(values: VfxValueMap): Result<Values, VfxEffectContractError>;\n pack(values: Values): Result<Uint8Array, VfxEffectContractError>;\n}\n\nconst VECTOR_LENGTH = {\n f32: 1,\n i32: 1,\n u32: 1,\n 'vec2<f32>': 2,\n 'vec3<f32>': 3,\n 'vec4<f32>': 4,\n};\n\nexport type VfxValueType = keyof typeof VECTOR_LENGTH;\n\nfunction fieldList(reflection: VfxEffectReflection): readonly VfxReflectedField[] {\n return [...reflection.parameters.fields, ...reflection.custom.fields];\n}\n\nfunction zeroValue(type: VfxValueType): VfxValue {\n const length = VECTOR_LENGTH[type];\n return length === 1 ? 0 : Array.from({ length }, () => 0);\n}\n\nfunction valueMatches(type: VfxValueType, value: unknown): boolean {\n const length = VECTOR_LENGTH[type];\n if (length === 1) return typeof value === 'number' && Number.isFinite(value);\n return (\n Array.isArray(value) &&\n value.length === length &&\n value.every((component) => typeof component === 'number' && Number.isFinite(component))\n );\n}\n\nfunction fail(\n code: VfxEffectContractError['code'],\n path: string,\n expected: string,\n hint: string,\n actual?: unknown,\n): Result<never, VfxEffectContractError> {\n return err({\n code,\n expected,\n hint,\n detail: actual === undefined ? { path } : { path, actual },\n });\n}\n\nfunction validateReflection(reflection: VfxEffectReflection): Result<true, VfxEffectContractError> {\n if (\n reflection.version !== 1 ||\n typeof reflection.fingerprint !== 'string' ||\n !reflection.fingerprint.startsWith('sha256:')\n ) {\n return fail(\n 'vfx-reflection-invalid',\n 'reflection',\n 'a version 1 reflection with a sha256 fingerprint',\n 'recook the effect with the current VFX compiler',\n );\n }\n const names = new Set<string>();\n for (const field of fieldList(reflection)) {\n if (names.has(field.name)) {\n return fail(\n 'vfx-reflection-invalid',\n field.name,\n 'unique field names across parameters and custom data',\n 'rename the duplicate WGSL field and recook',\n );\n }\n names.add(field.name);\n }\n return ok(true);\n}\n\nfunction defaultsFor<Values extends VfxValueMap>(reflection: VfxEffectReflection): Values {\n const defaults: Record<string, VfxValue> = {};\n for (const field of fieldList(reflection)) {\n defaults[field.name] =\n field.defaultValue === undefined ? zeroValue(field.type) : field.defaultValue;\n }\n return Object.freeze(defaults) as Values;\n}\n\nfunction validateMap<Values extends VfxValueMap>(\n reflection: VfxEffectReflection,\n values: VfxValueMap,\n): Result<Values, VfxEffectContractError> {\n const fields = new Map(fieldList(reflection).map((field) => [field.name, field]));\n for (const name of Object.keys(values)) {\n const field = fields.get(name);\n if (field === undefined) {\n return fail(\n 'vfx-value-unknown-field',\n name,\n 'a field declared by VfxParameters or VfxCustom',\n `remove ${name} or declare it in the authored WGSL struct`,\n values[name],\n );\n }\n if (!valueMatches(field.type, values[name])) {\n return fail(\n 'vfx-value-type-mismatch',\n name,\n field.type,\n `provide ${name} as ${field.type}`,\n values[name],\n );\n }\n }\n return ok(Object.freeze({ ...values }) as Values);\n}\n\nfunction writeValue(view: DataView, offset: number, type: VfxValueType, value: VfxValue): void {\n const values = typeof value === 'number' ? [value] : value;\n for (let index = 0; index < values.length; index += 1) {\n const component = values[index] ?? 0;\n if (type === 'i32') view.setInt32(offset + index * 4, component, true);\n else if (type === 'u32') view.setUint32(offset + index * 4, component, true);\n else view.setFloat32(offset + index * 4, component, true);\n }\n}\n\nexport function createVfxEffectContract<Values extends VfxValueMap = VfxValueMap>(\n reflection: VfxEffectReflection,\n): VfxEffectContract<Values> {\n const checked = validateReflection(reflection);\n if (!checked.ok) throw new TypeError(checked.error.hint);\n const defaults = defaultsFor<Values>(reflection);\n const fields = fieldList(reflection);\n const customBase = reflection.parameters.size;\n const packedSize = customBase + reflection.custom.size;\n return {\n reflection,\n fingerprint: reflection.fingerprint,\n packedSize,\n defaults,\n createValues(initial = {} as Partial<Values>) {\n const merged = { ...defaults, ...initial };\n return validateMap<Values>(reflection, merged);\n },\n validateValues(values) {\n return validateMap<Values>(reflection, values);\n },\n pack(values) {\n const checkedValues = validateMap<Values>(reflection, values);\n if (!checkedValues.ok) return checkedValues;\n const bytes = new Uint8Array(packedSize);\n const view = new DataView(bytes.buffer);\n for (const field of fields) {\n const value = checkedValues.value[field.name];\n if (value === undefined) continue;\n const base = reflection.parameters.fields.includes(field) ? 0 : customBase;\n writeValue(view, base + field.offset, field.type, value);\n }\n return ok(bytes);\n },\n };\n}\n\nexport function validateVfxEffectValues(\n reflection: VfxEffectReflection,\n values: VfxValueMap,\n): Result<VfxValueMap, VfxEffectContractError> {\n return validateMap(reflection, values);\n}\n","import type {\n BindGroupLayoutDescriptor,\n ParticleEffectAsset,\n ParticleEffectProgram,\n ParticleEffectProgramEmitter,\n} from '@forgeax/engine-types';\nimport type {\n ParticleChannelSource,\n ParticleEmitterSourceV2,\n ParticleEventSource,\n ParticleRendererOverflowPolicy,\n ParticleRendererSorting,\n ParticleRendererSource,\n ParticleStageDomain,\n ParticleStageResourceAccess,\n} from './code-source.js';\nimport type { VfxDataInterfaceRequirement } from './data-interface.js';\nimport type { VfxEffectReflection } from './effect-contract.js';\n\nexport const VFX_GPU_PROGRAM_FORMAT = 'forgeax-vfx-program-2' as const;\nexport const VFX_GPU_PROGRAM_ARTIFACT_KEY = 'particle-effect/program.json' as const;\n\nexport interface VfxGpuStageReflection {\n readonly id: string;\n readonly entry: string;\n readonly entryPoint: string;\n readonly domain: ParticleStageDomain;\n readonly resources: readonly {\n readonly name: string;\n readonly access: ParticleStageResourceAccess;\n }[];\n readonly dependsOn: readonly string[];\n readonly iterationBudget: number;\n}\n\nexport interface VfxGpuRendererReflection {\n readonly topology: ParticleRendererSource['kind'];\n readonly resource: string;\n readonly capacity: number;\n readonly overflow: ParticleRendererOverflowPolicy;\n readonly enabled: boolean;\n readonly shaderInputs: readonly string[];\n readonly textureSheet?: {\n readonly columns: number;\n readonly rows: number;\n readonly frameRate: number;\n readonly frameCount: number;\n };\n readonly pivot?: readonly [number, number];\n readonly softParticle?: { readonly fadeDistance: number; readonly requiresDepth: true };\n readonly sorting?: ParticleRendererSorting;\n readonly stripKey?: 'alive-index';\n readonly historyLength?: number;\n readonly endpointField?: 'velocity';\n}\n\nexport interface VfxGpuProgramReflection {\n readonly hooks: readonly ['vfx_spawn', 'vfx_update'];\n readonly imports: readonly string[];\n readonly resources: readonly string[];\n readonly entryPoints: readonly string[];\n readonly bindings: readonly BindGroupLayoutDescriptor[];\n readonly layout?: VfxEffectReflection;\n readonly dataInterfaces?: readonly VfxDataInterfaceRequirement[];\n readonly eventChannels?: readonly ParticleChannelSource[];\n readonly events?: readonly ParticleEventSource[];\n readonly eventEntryPoint?: 'forgeax_vfx_event_main';\n readonly stages?: readonly VfxGpuStageReflection[];\n readonly renderers?: readonly VfxGpuRendererReflection[];\n}\n\nexport interface VfxGpuEmitterProgram\n extends Omit<\n ParticleEffectProgramEmitter,\n 'schedule' | 'bounds' | 'renderers' | 'reflection' | 'channels' | 'events'\n > {\n readonly id: string;\n readonly module: string;\n readonly capacity: number;\n readonly backend: ParticleEmitterSourceV2['backend'];\n readonly space: ParticleEmitterSourceV2['space'];\n readonly schedule: ParticleEmitterSourceV2['schedule'];\n readonly bounds: ParticleEmitterSourceV2['bounds'];\n readonly renderers: ParticleEmitterSourceV2['renderers'];\n readonly channels?: readonly ParticleChannelSource[];\n readonly events?: readonly ParticleEventSource[];\n readonly simulationWhenCulled: NonNullable<ParticleEmitterSourceV2['simulationWhenCulled']>;\n readonly wgsl: string;\n readonly reflection: VfxGpuProgramReflection;\n}\n\nexport interface VfxGpuProgram extends Omit<ParticleEffectProgram, 'emitters'> {\n readonly format: typeof VFX_GPU_PROGRAM_FORMAT;\n readonly fingerprint: string;\n readonly emitters: readonly VfxGpuEmitterProgram[];\n}\n\nexport interface VfxGpuEffectAsset extends ParticleEffectAsset {\n readonly guid: string;\n readonly program: VfxGpuProgram;\n}\n","import type {\n AssetRegistry as LegacyAssetRegistry,\n RuntimeAssetRegistry,\n} from '@forgeax/engine-assets-runtime';\nimport type {\n AssetDecoderContribution,\n AssetKind,\n AssetLoadError,\n LoadContext,\n Result,\n} from '@forgeax/engine-types';\nimport { err, ok } from '@forgeax/engine-types';\nimport {\n VFX_GPU_PROGRAM_ARTIFACT_KEY,\n VFX_GPU_PROGRAM_FORMAT,\n type VfxGpuEffectAsset,\n type VfxGpuEmitterProgram,\n} from './gpu-program.js';\n\nexport interface VfxGpuAssetError {\n readonly code:\n | 'vfx-asset-v2-invalid'\n | 'vfx-asset-v2-program-missing'\n | 'vfx-asset-v2-fingerprint-mismatch';\n readonly expected: string;\n readonly hint: string;\n readonly detail: { readonly guid: string; readonly path: string };\n}\n\ninterface PackLoaderInput {\n readonly guid: string;\n readonly kind: string;\n readonly payload: Record<string, unknown>;\n readonly artifacts: Readonly<\n Record<\n string,\n {\n readonly descriptor: { readonly path: string; readonly mediaType: string };\n readonly bytes: Uint8Array;\n }\n >\n >;\n}\n\nfunction failure(\n code: VfxGpuAssetError['code'],\n guid: string,\n path: string,\n expected: string,\n hint: string,\n): Result<never, VfxGpuAssetError> {\n return err({ code, expected, hint, detail: { guid, path } });\n}\n\nfunction record(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction hex(bytes: ArrayBuffer): string {\n return [...new Uint8Array(bytes)].map((value) => value.toString(16).padStart(2, '0')).join('');\n}\n\nasync function fingerprint(bytes: Uint8Array): Promise<string> {\n const source = bytes.buffer.slice(\n bytes.byteOffset,\n bytes.byteOffset + bytes.byteLength,\n ) as ArrayBuffer;\n return `sha256:${hex(await globalThis.crypto.subtle.digest('SHA-256', source))}`;\n}\n\nfunction validReflectionLayout(value: unknown): boolean {\n if (value === undefined) return true;\n if (!record(value) || value.version !== 1) return false;\n if (!record(value.parameters) || !Array.isArray(value.parameters.fields)) return false;\n if (!record(value.custom) || !Array.isArray(value.custom.fields)) return false;\n return typeof value.fingerprint === 'string' && value.fingerprint.startsWith('sha256:');\n}\n\nfunction stableLayouts(emitters: readonly VfxGpuEmitterProgram[]): boolean {\n const fingerprints = emitters\n .map((emitter) => emitter.reflection.layout?.fingerprint)\n .filter((fingerprint): fingerprint is string => fingerprint !== undefined);\n return fingerprints.every((fingerprint) => fingerprint === fingerprints[0]);\n}\n\nfunction validEmitter(value: unknown): value is VfxGpuEmitterProgram {\n const reflection = record(value) && record(value.reflection) ? value.reflection : undefined;\n const layout = reflection !== undefined ? reflection.layout : undefined;\n return (\n record(value) &&\n typeof value.id === 'string' &&\n typeof value.module === 'string' &&\n value.module.length > 0 &&\n Number.isInteger(value.capacity) &&\n (value.capacity as number) > 0 &&\n record(value.backend) &&\n value.backend.required === 'gpu' &&\n Object.keys(value.backend).length === 1 &&\n typeof value.wgsl === 'string' &&\n value.wgsl.length > 0 &&\n record(value.reflection) &&\n validReflectionLayout(layout) &&\n Array.isArray(value.reflection.entryPoints) &&\n value.reflection.entryPoints.includes('forgeax_vfx_spawn_main') &&\n value.reflection.entryPoints.includes('forgeax_vfx_compact_main') &&\n value.reflection.entryPoints.includes('forgeax_vfx_billboard_main') &&\n value.reflection.entryPoints.includes('forgeax_vfx_mesh_main') &&\n value.reflection.entryPoints.includes('forgeax_vfx_ribbon_main') &&\n value.reflection.entryPoints.includes('forgeax_vfx_trail_main') &&\n value.reflection.entryPoints.includes('forgeax_vfx_beam_main')\n );\n}\n\nexport const vfxGpuEffectPackLoader = {\n kind: 'particle-effect',\n async load(\n input: PackLoaderInput,\n _context: LoadContext,\n ): Promise<Result<VfxGpuEffectAsset, VfxGpuAssetError>> {\n if (\n input.payload.kind !== 'particle-effect' ||\n input.payload.schemaVersion !== 2 ||\n !Array.isArray(input.payload.emitters) ||\n typeof input.payload.programFingerprint !== 'string' ||\n !record(input.payload.program)\n ) {\n return failure(\n 'vfx-asset-v2-invalid',\n input.guid,\n 'payload',\n 'a schemaVersion 2 particle payload with its complete program and fingerprint',\n 'migrate behavior to WGSL and recook; the runtime does not interpret v1',\n );\n }\n const artifact = input.artifacts[VFX_GPU_PROGRAM_ARTIFACT_KEY];\n if (artifact === undefined) {\n return failure(\n 'vfx-asset-v2-program-missing',\n input.guid,\n VFX_GPU_PROGRAM_ARTIFACT_KEY,\n 'the asset-local cooked VFX program',\n 'recook the particle effect and retry the load',\n );\n }\n let decoded: unknown;\n try {\n decoded = JSON.parse(new TextDecoder().decode(artifact.bytes));\n } catch {\n return failure(\n 'vfx-asset-v2-invalid',\n input.guid,\n VFX_GPU_PROGRAM_ARTIFACT_KEY,\n 'canonical JSON program bytes',\n 'recook the particle effect and retry the load',\n );\n }\n if (\n !record(decoded) ||\n decoded.format !== VFX_GPU_PROGRAM_FORMAT ||\n !Array.isArray(decoded.emitters) ||\n !decoded.emitters.every(validEmitter) ||\n !stableLayouts(decoded.emitters as VfxGpuEmitterProgram[])\n ) {\n return failure(\n 'vfx-asset-v2-invalid',\n input.guid,\n VFX_GPU_PROGRAM_ARTIFACT_KEY,\n `a ${VFX_GPU_PROGRAM_FORMAT} managed GPU program`,\n 'recook with the current VFX compiler ABI',\n );\n }\n const decodedEmitters = decoded.emitters as VfxGpuEmitterProgram[];\n if (\n input.payload.program.format !== VFX_GPU_PROGRAM_FORMAT ||\n input.payload.program.fingerprint !== input.payload.programFingerprint ||\n !Array.isArray(input.payload.program.emitters)\n ) {\n return failure(\n 'vfx-asset-v2-invalid',\n input.guid,\n 'payload.program',\n 'the complete canonical program matching payload.programFingerprint',\n 'recook the particle effect atomically',\n );\n }\n const actualFingerprint = await fingerprint(artifact.bytes);\n if (actualFingerprint !== input.payload.programFingerprint) {\n return failure(\n 'vfx-asset-v2-fingerprint-mismatch',\n input.guid,\n 'payload.programFingerprint',\n 'payload and program artifact fingerprints to match',\n 'cold-cook the particle asset so payload and artifact publish atomically',\n );\n }\n const emitters = input.payload.emitters.map((value) => {\n if (!record(value) || typeof value.id !== 'string' || !Number.isInteger(value.capacity)) {\n return undefined;\n }\n return { id: value.id, capacity: value.capacity as number };\n });\n if (\n emitters.some((value) => value === undefined) ||\n emitters.length !== decodedEmitters.length ||\n emitters.some(\n (value, index) =>\n value?.id !== decodedEmitters[index]?.id ||\n value?.capacity !== decodedEmitters[index]?.capacity,\n )\n ) {\n return failure(\n 'vfx-asset-v2-invalid',\n input.guid,\n 'payload.emitters',\n 'payload emitter identities and capacities to match the program',\n 'recook the particle effect atomically',\n );\n }\n return ok(\n Object.freeze({\n guid: input.guid,\n kind: 'particle-effect',\n schemaVersion: 2,\n programFingerprint: actualFingerprint,\n emitters: Object.freeze(emitters as { id: string; capacity: number }[]),\n program: Object.freeze({\n format: VFX_GPU_PROGRAM_FORMAT,\n fingerprint: actualFingerprint,\n emitters: Object.freeze(decodedEmitters),\n }),\n }),\n );\n },\n};\n\n/** VFX owner decoder contribution for the core registry's typed map. */\nexport const vfxGpuEffectContribution: AssetDecoderContribution<\n VfxGpuEffectAsset,\n 'particle-effect'\n> = {\n kind: { kind: 'particle-effect' } as AssetKind<VfxGpuEffectAsset, 'particle-effect'>,\n consumer: 'VfxGpuRuntime',\n decoder: {\n async decode({ envelope, artifacts }) {\n const descriptor = envelope.artifacts[VFX_GPU_PROGRAM_ARTIFACT_KEY];\n const bytes = descriptor === undefined ? undefined : await artifacts.read(descriptor);\n if (bytes !== undefined && !bytes.ok) return bytes;\n const result = await vfxGpuEffectPackLoader.load(\n {\n guid: envelope.guid,\n kind: envelope.kind,\n payload: envelope.payload as unknown as Record<string, unknown>,\n artifacts:\n bytes === undefined || descriptor === undefined\n ? {}\n : {\n [VFX_GPU_PROGRAM_ARTIFACT_KEY]: {\n descriptor: { path: descriptor.path, mediaType: descriptor.mediaType },\n bytes: bytes.value,\n },\n },\n },\n {} as LoadContext,\n );\n if (result.ok) return result;\n const error: AssetLoadError = {\n code: 'asset-package-invalid',\n expected: result.error.expected,\n hint: result.error.hint,\n detail: { guid: envelope.guid, reason: result.error.code },\n };\n return err(error);\n },\n },\n};\n\nexport async function loadVfxGpuEffect(\n registry: LegacyAssetRegistry | RuntimeAssetRegistry,\n guid: string,\n): Promise<Result<VfxGpuEffectAsset, unknown>> {\n if ('load' in registry) {\n return registry.load(guid, vfxGpuEffectContribution.kind);\n }\n let parsed: ReturnType<LegacyAssetRegistry['parseGuid']>;\n try {\n parsed = registry.parseGuid(guid);\n } catch (error) {\n return err(error);\n }\n return registry.loadByGuid<VfxGpuEffectAsset>(parsed);\n}\n","import { err, ok, type Result } from '@forgeax/engine-types';\nimport type { ParticleChannelSource } from './code-source.js';\nimport type {\n VfxEffectContract,\n VfxEffectContractError,\n VfxValue,\n VfxValueMap,\n VfxValueType,\n} from './effect-contract.js';\n\nexport interface VfxChannelPayload {\n readonly position: readonly [number, number, number];\n readonly strength: number;\n}\n\nexport interface VfxChannelInput {\n readonly channel: string;\n readonly payload: VfxChannelPayload;\n readonly sequence: number;\n readonly tick?: number;\n}\n\nexport interface VfxChannelCounters {\n readonly queued: number;\n readonly produced: number;\n readonly consumed: number;\n readonly dropped: number;\n readonly overflow: number;\n readonly fanOut: number;\n readonly recursionDepth: number;\n readonly lastSequence: number;\n}\n\nexport interface VfxInstanceParent<Values extends VfxValueMap> {\n readonly fingerprint: string;\n readonly defaults: Values;\n}\n\nexport interface VfxInstanceOptions<Values extends VfxValueMap> {\n readonly parent?: VfxInstanceParent<Values>;\n readonly initialValues?: Partial<Values>;\n readonly channels?: readonly ParticleChannelSource[];\n}\n\nexport interface VfxInstanceCommitOptions {\n readonly seed: number;\n readonly tick: number;\n}\n\nexport interface VfxReplayInput<Values extends VfxValueMap> {\n readonly seed: number;\n readonly tick: number;\n readonly generation: number;\n readonly sequence: number;\n readonly fingerprint: string;\n readonly payload: Uint8Array;\n readonly values: Values;\n readonly channelInputs: readonly VfxChannelInput[];\n readonly droppedCount: number;\n}\n\nexport interface VfxInstanceCommit<Values extends VfxValueMap> {\n readonly seed: number;\n readonly tick: number;\n readonly generation: number;\n readonly sequence: number;\n readonly values: Values;\n readonly parameterBlock: Uint8Array;\n readonly canonicalPayload: Uint8Array;\n readonly replayInput: VfxReplayInput<Values>;\n readonly patchCount: number;\n readonly channelInputs: readonly VfxChannelInput[];\n readonly droppedCount: number;\n}\n\nexport interface VfxInstanceError {\n readonly code:\n | VfxEffectContractError['code']\n | 'vfx-instance-parent-mismatch'\n | 'vfx-instance-replay-mismatch'\n | 'vfx-channel-invalid'\n | 'vfx-channel-overflow';\n readonly expected: string;\n readonly hint: string;\n readonly detail: { readonly path: string; readonly actual?: unknown };\n}\n\ntype InstanceResult<T> = Result<T, VfxInstanceError>;\n\nfunction failure(\n code: VfxInstanceError['code'],\n path: string,\n expected: string,\n hint: string,\n actual?: unknown,\n): InstanceResult<never> {\n return err({\n code,\n expected,\n hint,\n detail: actual === undefined ? { path } : { path, actual },\n });\n}\n\nfunction allFields<Values extends VfxValueMap>(\n contract: VfxEffectContract<Values>,\n): readonly { readonly name: string; readonly type: VfxValueType }[] {\n return [...contract.reflection.parameters.fields, ...contract.reflection.custom.fields];\n}\n\nfunction normalizeValue(type: VfxValueType, value: VfxValue): VfxValue {\n const normalize = (component: number): number => {\n if (type === 'i32' || type === 'u32') return Math.trunc(component);\n return Math.fround(component);\n };\n return typeof value === 'number' ? normalize(value) : value.map(normalize);\n}\n\nfunction canonicalBytes<Values extends VfxValueMap>(\n contract: VfxEffectContract<Values>,\n values: Values,\n): Uint8Array {\n const fields = allFields(contract)\n .map((field) => ({ name: field.name, type: field.type, value: values[field.name] }))\n .sort((left, right) => left.name.localeCompare(right.name))\n .map((field) => ({\n name: field.name,\n type: field.type,\n value: field.value === undefined ? undefined : normalizeValue(field.type, field.value),\n }));\n return new TextEncoder().encode(JSON.stringify({ fields }));\n}\n\nfunction sameBytes(left: Uint8Array, right: Uint8Array): boolean {\n if (left.length !== right.length) return false;\n for (let index = 0; index < left.length; index += 1) {\n if (left[index] !== right[index]) return false;\n }\n return true;\n}\n\nfunction cloneValue(value: VfxValue): VfxValue {\n return typeof value === 'number' ? value : [...value];\n}\n\nfunction cloneValues<Values extends VfxValueMap>(values: Values): Values {\n const clone: Record<string, VfxValue> = {};\n for (const [name, value] of Object.entries(values)) clone[name] = cloneValue(value);\n return Object.freeze(clone) as Values;\n}\n\nfunction cloneBytes(bytes: Uint8Array): Uint8Array {\n return bytes.slice();\n}\n\nfunction validChannelPayload(payload: unknown): payload is VfxChannelPayload {\n if (payload === null || typeof payload !== 'object' || Array.isArray(payload)) return false;\n const value = payload as Record<string, unknown>;\n const position = value.position;\n return (\n Array.isArray(position) &&\n position.length === 3 &&\n position.every((component) => typeof component === 'number' && Number.isFinite(component)) &&\n typeof value.strength === 'number' &&\n Number.isFinite(value.strength)\n );\n}\n\nfunction withTick(input: VfxChannelInput, tick: number): VfxChannelInput {\n const result = { ...input } as VfxChannelInput & { tick: number };\n Object.defineProperty(result, 'tick', { value: tick, enumerable: false });\n return Object.freeze(result);\n}\n\nexport class ParticleEffectInstance<Values extends VfxValueMap = VfxValueMap> {\n readonly contract: VfxEffectContract<Values>;\n #values: Values;\n #generation = 0;\n #sequence = 0;\n #pendingPatches: Partial<Values>[] = [];\n #pendingChannels: VfxChannelInput[] = [];\n #channelCapacities = new Map<string, number>([['impact', 32]]);\n #droppedCount = 0;\n\n constructor(contract: VfxEffectContract<Values>, options: VfxInstanceOptions<Values> = {}) {\n this.contract = contract;\n if (\n options.parent?.fingerprint !== undefined &&\n options.parent.fingerprint !== contract.fingerprint\n ) {\n throw new TypeError(\n `ParticleEffectInstance parent fingerprint ${options.parent.fingerprint} does not match ${contract.fingerprint}`,\n );\n }\n const parentDefaults = options.parent?.defaults ?? contract.defaults;\n const initial = { ...parentDefaults, ...options.initialValues };\n const checked = contract.createValues(initial);\n if (!checked.ok) throw new TypeError(checked.error.hint);\n this.#values = cloneValues(checked.value);\n for (const channel of options.channels ?? []) {\n this.#channelCapacities.set(channel.id, channel.capacity);\n }\n }\n\n get values(): Values {\n return this.#values;\n }\n\n get generation(): number {\n return this.#generation;\n }\n\n get pendingPatchCount(): number {\n return this.#pendingPatches.length;\n }\n\n setChannelCapacity(channel: string, capacity: number): void {\n if (!Number.isInteger(capacity) || capacity <= 0) {\n throw new RangeError('channel capacity must be a positive integer');\n }\n this.#channelCapacities.set(channel, capacity);\n }\n\n submit(input: VfxChannelInput): InstanceResult<void> {\n if (\n typeof input.channel !== 'string' ||\n input.channel.length === 0 ||\n !Number.isInteger(input.sequence) ||\n input.sequence < 0 ||\n !validChannelPayload(input.payload)\n ) {\n return failure(\n 'vfx-channel-invalid',\n `channels.${input.channel || 'unknown'}`,\n 'a named channel with a finite impact payload and non-negative integer sequence',\n 'repair the typed channel payload before the next FixedUpdate',\n );\n }\n const capacity = this.#channelCapacities.get(input.channel) ?? 32;\n if (this.#pendingChannels.length >= capacity) {\n this.#droppedCount += 1;\n return failure(\n 'vfx-channel-overflow',\n `channels.${input.channel}`,\n `at most ${capacity} pending inputs for this channel`,\n 'reduce the input rate or increase the reflected channel capacity and recook',\n input.sequence,\n );\n }\n this.#pendingChannels.push(\n Object.freeze({\n channel: input.channel,\n payload: Object.freeze({\n position: [...input.payload.position] as [number, number, number],\n strength: input.payload.strength,\n }),\n sequence: input.sequence,\n }),\n );\n return ok(undefined);\n }\n\n patch(patch: Partial<Values>): InstanceResult<void> {\n const candidate: VfxValueMap = { ...this.#values, ...patch };\n const checked = this.contract.validateValues(candidate);\n if (!checked.ok) return checked;\n this.#pendingPatches.push(Object.freeze({ ...patch }));\n return ok(undefined);\n }\n\n commit(options: VfxInstanceCommitOptions): InstanceResult<VfxInstanceCommit<Values>> {\n const candidate: VfxValueMap = { ...this.#values };\n for (const patch of this.#pendingPatches) Object.assign(candidate, patch);\n const checked = this.contract.validateValues(candidate);\n if (!checked.ok) return checked;\n const nextValues = cloneValues(checked.value);\n const packed = this.contract.pack(nextValues);\n if (!packed.ok) return packed;\n const patchCount = this.#pendingPatches.length;\n const droppedCount = this.#droppedCount;\n const channelInputs = Object.freeze(\n [...this.#pendingChannels]\n .sort((left, right) => left.sequence - right.sequence)\n .map((input) => withTick(input, options.tick)),\n );\n this.#pendingPatches = [];\n this.#pendingChannels = [];\n this.#droppedCount = 0;\n if (patchCount > 0) this.#generation += 1;\n this.#values = nextValues;\n const canonicalPayload = canonicalBytes(this.contract, nextValues);\n const sequence = this.#sequence++;\n const replayInput: VfxReplayInput<Values> = Object.freeze({\n seed: options.seed,\n tick: options.tick,\n generation: this.#generation,\n sequence,\n fingerprint: this.contract.fingerprint,\n payload: cloneBytes(canonicalPayload),\n values: nextValues,\n channelInputs,\n droppedCount,\n });\n return ok({\n seed: options.seed,\n tick: options.tick,\n generation: this.#generation,\n sequence,\n values: nextValues,\n parameterBlock: cloneBytes(packed.value),\n canonicalPayload,\n replayInput,\n patchCount,\n channelInputs,\n droppedCount,\n });\n }\n\n replay(input: VfxReplayInput<Values>): InstanceResult<VfxInstanceCommit<Values>> {\n if (input.fingerprint !== this.contract.fingerprint) {\n return failure(\n 'vfx-instance-replay-mismatch',\n 'replay.fingerprint',\n this.contract.fingerprint,\n 'replay the input with the matching cooked effect contract',\n input.fingerprint,\n );\n }\n const checked = this.contract.validateValues(input.values);\n if (!checked.ok) return checked;\n const canonicalPayload = canonicalBytes(this.contract, checked.value);\n if (!sameBytes(canonicalPayload, input.payload)) {\n return failure(\n 'vfx-instance-replay-mismatch',\n 'replay.payload',\n 'canonical payload bytes for replay.values',\n 'record and replay normalized values from the same fixed-tick input',\n );\n }\n const packed = this.contract.pack(checked.value);\n if (!packed.ok) return packed;\n this.#values = cloneValues(checked.value);\n this.#generation = input.generation;\n this.#sequence = Math.max(this.#sequence, input.sequence + 1);\n this.#pendingPatches = [];\n this.#pendingChannels = [...input.channelInputs].map((channel) =>\n withTick(channel, input.tick),\n );\n this.#droppedCount = 0;\n const values = this.#values;\n const replayInput: VfxReplayInput<Values> = Object.freeze({\n ...input,\n payload: cloneBytes(input.payload),\n values,\n channelInputs: this.#pendingChannels,\n droppedCount: input.droppedCount,\n });\n return ok({\n seed: input.seed,\n tick: input.tick,\n generation: input.generation,\n sequence: input.sequence,\n values,\n parameterBlock: cloneBytes(packed.value),\n canonicalPayload,\n replayInput,\n patchCount: 0,\n channelInputs: this.#pendingChannels,\n droppedCount: input.droppedCount,\n });\n }\n}\n\nexport function createParticleEffectInstance<Values extends VfxValueMap>(\n contract: VfxEffectContract<Values>,\n options: VfxInstanceOptions<Values> = {},\n): ParticleEffectInstance<Values> {\n return new ParticleEffectInstance(contract, options);\n}\n","import { defineComponent, type SchemaOf, type ShapeOf } from '@forgeax/engine-ecs';\nimport type { VfxValueMap } from './effect-contract.js';\nimport type { ParticleEffectInstance } from './instance.js';\n\n/** ECS author intent for one shared particle effect. */\nexport const ParticleEffectPlayer = defineComponent('ParticleEffectPlayer', {\n // The VFX render owner re-resolves the compiled effect on the target world;\n // playback intent remains portable simulation state.\n effect: { type: 'shared<ParticleEffectAsset>' },\n playing: { type: 'bool', default: true },\n seed: { type: 'u32', default: 0 },\n timeScale: { type: 'f32', default: 1 },\n});\n\n/** The four serializable fields stored by {@link ParticleEffectPlayer}. */\nexport type ParticleEffectPlayerData = ShapeOf<SchemaOf<typeof ParticleEffectPlayer>>;\n\n/** Runtime-owned typed values associated with a player without extending ECS storage. */\nexport interface ParticleEffectPlayerBinding<Values extends VfxValueMap = VfxValueMap> {\n readonly instance: ParticleEffectInstance<Values>;\n}\n","import { Entity, type EntityHandle, FixedTime, FixedUpdate, type World } from '@forgeax/engine-ecs';\nimport type { Plugin } from '@forgeax/engine-plugin';\nimport { type Handle, toShared } from '@forgeax/engine-types';\nimport type { ParticleEventSource } from './code-source.js';\nimport type { VfxValueMap } from './effect-contract.js';\nimport { createVfxEffectContract, type VfxEffectReflection } from './effect-contract.js';\nimport type { VfxGpuEffectAsset, VfxGpuEmitterProgram } from './gpu-program.js';\nimport {\n ParticleEffectInstance,\n type VfxChannelCounters,\n type VfxReplayInput,\n} from './instance.js';\nimport { ParticleEffectPlayer } from './player.js';\n\nexport const VFX_GPU_RUNTIME_RESOURCE_KEY = 'VfxGpuRuntime';\n\nexport interface VfxInspectSnapshotInput {\n readonly layoutFingerprint: string;\n readonly parameterGeneration: number;\n readonly patchCount: number;\n readonly dataInterfaces?: unknown;\n readonly channels?: unknown;\n readonly stages?: unknown;\n readonly renderers?: unknown;\n readonly hmr?: unknown;\n readonly gpuTiming?: unknown;\n readonly error?: {\n readonly code: string;\n readonly expected: string;\n readonly hint: string;\n readonly detail: unknown;\n };\n}\n\nexport function createVfxInspectSnapshot(input: VfxInspectSnapshotInput) {\n return {\n layout: { fingerprint: input.layoutFingerprint },\n values: { generation: input.parameterGeneration, patchCount: input.patchCount },\n ...(input.dataInterfaces === undefined ? {} : { dataInterfaces: input.dataInterfaces }),\n ...(input.channels === undefined ? {} : { channels: input.channels }),\n ...(input.stages === undefined ? {} : { stages: input.stages }),\n ...(input.renderers === undefined ? {} : { renderers: input.renderers }),\n ...(input.hmr === undefined ? {} : { hmr: input.hmr }),\n ...(input.gpuTiming === undefined ? {} : { gpuTiming: input.gpuTiming }),\n ...(input.error === undefined ? {} : { error: input.error }),\n } as const;\n}\n\nexport interface VfxGpuTickIntent {\n readonly sequence: number;\n readonly player: EntityHandle;\n readonly emitter: VfxGpuEmitterProgram;\n readonly programFingerprint: string;\n readonly reset: boolean;\n readonly fixedDelta: number;\n /** Effect-relative fixed tick. Resets to zero for replay and restart-on-visible. */\n readonly phaseTick: number;\n /** World-global FixedTime tick retained for renderer ring selection and correlation. */\n readonly tick: number;\n readonly seed: number;\n readonly playCycle: number;\n readonly spawnCount: number;\n readonly firstParticleId: number;\n readonly instanceGeneration: number;\n readonly instancePatchCount: number;\n readonly parameterBlock: Uint8Array;\n readonly canonicalPayload: Uint8Array;\n readonly replayInput: VfxReplayInput<VfxValueMap>;\n readonly channelInputs: VfxReplayInput<VfxValueMap>['channelInputs'];\n readonly eventCounters: VfxChannelCounters;\n}\n\nexport interface VfxGpuEmitterInspectSnapshot {\n readonly id: string;\n readonly module: string;\n readonly capacity: number;\n /** Renderer-owned camera-frustum result. This is not an editor mute/isolate control. */\n readonly cameraVisible: boolean;\n /** Session-only preview mask. False suppresses both simulation and retained rendering. */\n readonly sessionEnabled: boolean;\n readonly phaseTick: number | null;\n readonly tick: number | null;\n readonly playCycle: number | null;\n readonly spawnCount: number;\n readonly firstParticleId: number;\n readonly reset: boolean;\n readonly schedule: VfxGpuEmitterProgram['schedule'];\n readonly bounds: VfxGpuEmitterProgram['bounds'];\n readonly simulationWhenCulled: VfxGpuEmitterProgram['simulationWhenCulled'];\n readonly renderers: readonly {\n readonly index: number;\n readonly kind: VfxGpuEmitterProgram['renderers'][number]['kind'];\n readonly enabled: boolean;\n }[];\n readonly stages: readonly string[];\n readonly dataInterfaces: readonly string[];\n}\n\nexport interface VfxGpuCommittedInspectSnapshot {\n readonly sequence: number;\n readonly tick: number;\n readonly phaseTick: number;\n readonly playCycle: number;\n readonly spawnCount: number;\n readonly firstParticleId: number;\n readonly reset: boolean;\n readonly instanceGeneration: number;\n readonly instancePatchCount: number;\n}\n\nexport interface VfxGpuPlayerInspectSnapshot {\n readonly player: EntityHandle;\n readonly assetGuid: string;\n readonly programFingerprint: string;\n readonly seed: number;\n readonly fixedDelta: number;\n readonly playing: boolean;\n readonly values: {\n readonly layoutFingerprint: string;\n readonly generation: number;\n readonly pendingPatchCount: number;\n };\n readonly queuedIntents: number;\n readonly queuedTicks: number;\n readonly lastCommitted: VfxGpuCommittedInspectSnapshot | null;\n readonly channels: VfxChannelCounters;\n readonly emitters: readonly VfxGpuEmitterInspectSnapshot[];\n readonly diagnostics: readonly VfxGpuRuntimeDiagnostic[];\n}\n\nexport interface VfxGpuRuntimeDiagnostic {\n readonly code:\n | 'vfx-intent-queue-overflow'\n | 'vfx-effect-unavailable'\n | 'vfx-player-invalid'\n | 'vfx-instance-commit-failed';\n readonly expected: string;\n readonly hint: string;\n readonly detail: { readonly player: EntityHandle; readonly maxQueuedTicks?: number };\n}\n\ninterface PlayerState {\n effect: Handle<'ParticleEffectAsset', 'shared'>;\n assetGuid: string;\n programFingerprint: string;\n emitters: readonly VfxGpuEmitterProgram[];\n seed: number;\n playing: boolean;\n playCycle: number;\n elapsed: number[];\n rateRemainders: number[];\n nextParticleIds: number[];\n playCycles: number[];\n cameraVisible: boolean[];\n phaseTicks: number[];\n hasCommitted: boolean;\n}\n\nfunction eventCounters(\n intent: Pick<VfxGpuTickIntent, 'channelInputs' | 'emitter'>,\n dropped: number,\n eventSources: readonly ParticleEventSource[],\n): VfxChannelCounters {\n const inputs = intent.channelInputs;\n const events = [...(intent.emitter.events ?? []), ...eventSources];\n return Object.freeze({\n queued: inputs.length,\n produced: (intent.emitter.events?.length ?? 0) > 0 ? inputs.length : 0,\n consumed:\n eventSources.length > 0\n ? inputs.length * eventSources.reduce((total, event) => total + event.fanOut, 0)\n : 0,\n dropped,\n overflow: dropped > 0 ? 1 : 0,\n fanOut: events.reduce((total, event) => total + event.fanOut, 0),\n recursionDepth: events.reduce((depth, event) => Math.max(depth, event.recursionDepth), 0),\n lastSequence: inputs.at(-1)?.sequence ?? -1,\n });\n}\n\nexport interface VfxGpuRuntimeOptions {\n readonly maxQueuedTicks?: number;\n}\n\nexport class VfxGpuRuntime {\n readonly #maxQueuedTicks: number;\n readonly #players = new Map<EntityHandle, PlayerState>();\n readonly #instances = new Map<EntityHandle, ParticleEffectInstance>();\n readonly #seen = new Set<EntityHandle>();\n readonly #intents: VfxGpuTickIntent[] = [];\n readonly #diagnostics: VfxGpuRuntimeDiagnostic[] = [];\n readonly #lastCommitted = new Map<EntityHandle, VfxGpuTickIntent>();\n readonly #lastCommittedByEmitter = new Map<EntityHandle, Map<string, VfxGpuTickIntent>>();\n readonly #eventCounters = new Map<EntityHandle, VfxChannelCounters>();\n readonly #cameraVisibility = new Map<string, boolean>();\n readonly #sessionEnabled = new Map<string, boolean>();\n readonly #replayRequests = new Set<EntityHandle>();\n readonly #replayInputs = new Map<EntityHandle, VfxReplayInput<VfxValueMap>>();\n #sequence = 0;\n #renderGeneration = 0;\n\n constructor(options: VfxGpuRuntimeOptions = {}) {\n this.#maxQueuedTicks = options.maxQueuedTicks ?? 8;\n }\n\n /** Resource generation owned by the current VFX render attachment. */\n get renderGeneration(): number {\n return this.#renderGeneration;\n }\n\n snapshot(): readonly VfxGpuTickIntent[] {\n return this.#intents;\n }\n\n diagnostics(): readonly VfxGpuRuntimeDiagnostic[] {\n return this.#diagnostics;\n }\n\n lastCommitted(player: EntityHandle): VfxGpuTickIntent | undefined {\n return this.#lastCommitted.get(player);\n }\n\n inspectPlayers(): readonly VfxGpuPlayerInspectSnapshot[] {\n return Object.freeze(\n [...this.#players.keys()]\n .sort((left, right) => Number(left) - Number(right))\n .flatMap((player) => {\n const snapshot = this.inspectPlayer(player);\n return snapshot === undefined ? [] : [snapshot];\n }),\n );\n }\n\n inspectPlayer(player: EntityHandle): VfxGpuPlayerInspectSnapshot | undefined {\n const state = this.#players.get(player);\n if (state === undefined) return undefined;\n const instance = this.#instances.get(player);\n const latest = state.emitters.map((emitter) => this.#latestIntent(player, emitter.id));\n const lastIntent = latest.reduce<VfxGpuTickIntent | undefined>(\n (current, intent) =>\n intent !== undefined && (current === undefined || intent.sequence > current.sequence)\n ? intent\n : current,\n undefined,\n );\n const layoutFingerprint =\n state.emitters.find((emitter) => emitter.reflection.layout !== undefined)?.reflection.layout\n ?.fingerprint ?? state.programFingerprint;\n const lastCommitted = this.#lastCommitted.get(player);\n const queuedTicks = new Set<number>();\n let queuedIntents = 0;\n for (const intent of this.#intents) {\n if (intent.player !== player) continue;\n queuedIntents += 1;\n queuedTicks.add(intent.tick);\n }\n return Object.freeze({\n player,\n assetGuid: state.assetGuid,\n programFingerprint: state.programFingerprint,\n seed: lastIntent?.seed ?? state.seed,\n fixedDelta: lastIntent?.fixedDelta ?? 0,\n playing: state.playing,\n values: Object.freeze({\n layoutFingerprint,\n generation: instance?.generation ?? lastIntent?.instanceGeneration ?? 0,\n pendingPatchCount: instance?.pendingPatchCount ?? 0,\n }),\n queuedIntents,\n queuedTicks: queuedTicks.size,\n lastCommitted:\n lastCommitted === undefined\n ? null\n : Object.freeze({\n sequence: lastCommitted.sequence,\n tick: lastCommitted.tick,\n phaseTick: lastCommitted.phaseTick,\n playCycle: lastCommitted.playCycle,\n spawnCount: lastCommitted.spawnCount,\n firstParticleId: lastCommitted.firstParticleId,\n reset: lastCommitted.reset,\n instanceGeneration: lastCommitted.instanceGeneration,\n instancePatchCount: lastCommitted.instancePatchCount,\n }),\n channels: this.eventCounters(player),\n emitters: Object.freeze(\n state.emitters.map((emitter, index) => {\n const intent = latest[index];\n return Object.freeze({\n id: emitter.id,\n module: emitter.module,\n capacity: emitter.capacity,\n cameraVisible: this.#cameraVisibility.get(`${player}:${emitter.id}`) ?? true,\n sessionEnabled: this.isEmitterSessionEnabled(player, emitter.id),\n phaseTick: intent?.phaseTick ?? null,\n tick: intent?.tick ?? null,\n playCycle: intent?.playCycle ?? null,\n spawnCount: intent?.spawnCount ?? 0,\n firstParticleId: intent?.firstParticleId ?? 0,\n reset: intent?.reset ?? false,\n schedule: emitter.schedule,\n bounds: emitter.bounds,\n simulationWhenCulled: emitter.simulationWhenCulled,\n renderers: Object.freeze(\n emitter.renderers.map((renderer, rendererIndex) =>\n Object.freeze({\n index: rendererIndex,\n kind: renderer.kind,\n enabled: renderer.enabled ?? true,\n }),\n ),\n ),\n stages: Object.freeze((emitter.reflection.stages ?? []).map((stage) => stage.id)),\n dataInterfaces: Object.freeze(\n (emitter.reflection.dataInterfaces ?? []).map((requirement) => requirement.token),\n ),\n });\n }),\n ),\n diagnostics: Object.freeze(\n this.#diagnostics.filter((diagnostic) => diagnostic.detail.player === player),\n ),\n });\n }\n\n eventCounters(player: EntityHandle): VfxChannelCounters {\n return (\n this.#eventCounters.get(player) ??\n this.#lastCommitted.get(player)?.eventCounters ?? {\n queued: 0,\n produced: 0,\n consumed: 0,\n dropped: 0,\n overflow: 0,\n fanOut: 0,\n recursionDepth: 0,\n lastSequence: -1,\n }\n );\n }\n\n markEventDispatched(player: EntityHandle, counters: VfxChannelCounters): void {\n const prior = this.#eventCounters.get(player);\n if (counters.produced === 0 && prior !== undefined) {\n this.#eventCounters.set(\n player,\n Object.freeze({\n ...prior,\n queued: 0,\n consumed: Math.max(prior.consumed, counters.consumed),\n }),\n );\n return;\n }\n this.#eventCounters.set(\n player,\n Object.freeze({ ...counters, queued: 0, consumed: counters.produced }),\n );\n }\n\n hasPlayer(player: EntityHandle): boolean {\n return this.#players.has(player);\n }\n\n attachInstance(player: EntityHandle, instance: ParticleEffectInstance): void {\n this.#instances.set(player, instance);\n }\n\n detachInstance(player: EntityHandle): void {\n this.#instances.delete(player);\n }\n\n getInstance(player: EntityHandle): ParticleEffectInstance | undefined {\n return this.#instances.get(player);\n }\n\n setEmitterCameraVisibility(player: EntityHandle, emitterId: string, visible: boolean): void {\n this.#cameraVisibility.set(`${player}:${emitterId}`, visible);\n }\n\n setEmitterSessionEnabled(player: EntityHandle, emitterId: string, enabled: boolean): void {\n this.#sessionEnabled.set(`${player}:${emitterId}`, enabled);\n }\n\n isEmitterSessionEnabled(player: EntityHandle, emitterId: string): boolean {\n return this.#sessionEnabled.get(`${player}:${emitterId}`) ?? true;\n }\n\n /** Restart from tick zero without changing authored `ParticleEffectPlayer.playing`. */\n replay(player: EntityHandle, input?: VfxReplayInput<VfxValueMap>): void {\n this.#discardQueuedIntents(player);\n this.#clearDiagnostics(player, 'vfx-intent-queue-overflow');\n this.#replayInputs.delete(player);\n if (input === undefined) {\n this.#instances.delete(player);\n } else {\n this.#replayInputs.set(player, input);\n }\n this.#replayRequests.add(player);\n }\n\n commit(sequence: number): void {\n const committedPlayers = new Set<EntityHandle>();\n for (const intent of this.#intents) {\n if (intent.sequence > sequence) break;\n const state = this.#players.get(intent.player);\n if (state !== undefined) state.hasCommitted = true;\n this.#lastCommitted.set(intent.player, intent);\n let emitters = this.#lastCommittedByEmitter.get(intent.player);\n if (emitters === undefined) {\n emitters = new Map();\n this.#lastCommittedByEmitter.set(intent.player, emitters);\n }\n emitters.set(intent.emitter.id, intent);\n committedPlayers.add(intent.player);\n }\n const retained = this.#intents.findIndex((intent) => intent.sequence > sequence);\n if (retained < 0) this.#intents.length = 0;\n else if (retained > 0) this.#intents.splice(0, retained);\n for (const player of committedPlayers) {\n this.#clearDiagnostics(player, 'vfx-intent-queue-overflow');\n }\n }\n\n reset(player: EntityHandle): void {\n this.#discardQueuedIntents(player);\n this.#clearDiagnostics(player);\n this.#players.delete(player);\n this.#instances.delete(player);\n this.#replayRequests.delete(player);\n this.#lastCommitted.delete(player);\n this.#lastCommittedByEmitter.delete(player);\n this.#eventCounters.delete(player);\n this.#replayInputs.delete(player);\n const prefix = `${player}:`;\n for (const key of this.#cameraVisibility.keys()) {\n if (key.startsWith(prefix)) this.#cameraVisibility.delete(key);\n }\n for (const key of this.#sessionEnabled.keys()) {\n if (key.startsWith(prefix)) this.#sessionEnabled.delete(key);\n }\n }\n\n /**\n * Drop every generation-owned VFX runtime value after device recovery.\n * Authored ParticleEffectPlayer state remains the restart source on the next\n * FixedUpdate; no queued intent or stale instance crosses the boundary.\n */\n recover(): void {\n this.#renderGeneration += 1;\n this.#players.clear();\n this.#instances.clear();\n this.#seen.clear();\n this.#intents.length = 0;\n this.#diagnostics.length = 0;\n this.#lastCommitted.clear();\n this.#lastCommittedByEmitter.clear();\n this.#eventCounters.clear();\n this.#cameraVisibility.clear();\n this.#sessionEnabled.clear();\n this.#replayRequests.clear();\n this.#replayInputs.clear();\n }\n\n #report(diagnostic: VfxGpuRuntimeDiagnostic): void {\n const alreadyActive = this.#diagnostics.some(\n (prior) => prior.code === diagnostic.code && prior.detail.player === diagnostic.detail.player,\n );\n if (alreadyActive) return;\n if (this.#diagnostics.length === 64) this.#diagnostics.shift();\n this.#diagnostics.push(diagnostic);\n }\n\n #clearDiagnostics(player: EntityHandle, code?: VfxGpuRuntimeDiagnostic['code']): void {\n for (let index = this.#diagnostics.length - 1; index >= 0; index -= 1) {\n const diagnostic = this.#diagnostics[index];\n if (\n diagnostic?.detail.player === player &&\n (code === undefined || diagnostic.code === code)\n ) {\n this.#diagnostics.splice(index, 1);\n }\n }\n }\n\n #discardQueuedIntents(player: EntityHandle): void {\n let retained = 0;\n for (const intent of this.#intents) {\n if (intent.player !== player) {\n this.#intents[retained] = intent;\n retained += 1;\n }\n }\n this.#intents.length = retained;\n }\n\n advance(\n world: World,\n tick: number,\n fixedDelta: number,\n players: readonly {\n readonly player: EntityHandle;\n readonly effect: Handle<'ParticleEffectAsset', 'shared'>;\n readonly playing: boolean;\n readonly seed: number;\n readonly timeScale: number;\n }[],\n ): void {\n this.#seen.clear();\n for (const input of players) {\n this.#seen.add(input.player);\n if (!Number.isFinite(input.timeScale) || input.timeScale < 0) {\n this.#report({\n code: 'vfx-player-invalid',\n expected: 'a finite non-negative particle timeScale',\n hint: 'repair ParticleEffectPlayer.timeScale and restart the player',\n detail: { player: input.player },\n });\n continue;\n }\n this.#clearDiagnostics(input.player, 'vfx-player-invalid');\n const resolved = world.sharedRefs.resolve<'ParticleEffectAsset', VfxGpuEffectAsset>(\n input.effect,\n );\n if (!resolved.ok || resolved.value.schemaVersion !== 2) {\n this.#report({\n code: 'vfx-effect-unavailable',\n expected: 'a loaded schemaVersion 2 GPU particle effect',\n hint: 'load and recook the effect before the first FixedUpdate',\n detail: { player: input.player },\n });\n continue;\n }\n this.#clearDiagnostics(input.player, 'vfx-effect-unavailable');\n const previous = this.#players.get(input.player);\n const replayRequested = this.#replayRequests.delete(input.player);\n const restart =\n previous === undefined ||\n previous.effect !== input.effect ||\n previous.seed !== input.seed ||\n replayRequested ||\n (!previous.playing && input.playing);\n const state = restart\n ? {\n effect: input.effect,\n assetGuid: resolved.value.guid,\n programFingerprint: resolved.value.program.fingerprint,\n emitters: resolved.value.program.emitters,\n seed: input.seed,\n playing: input.playing,\n playCycle: (previous?.playCycle ?? -1) + 1,\n elapsed: resolved.value.program.emitters.map(() => 0),\n rateRemainders: resolved.value.program.emitters.map(() => 0),\n nextParticleIds: resolved.value.program.emitters.map(() => 0),\n playCycles: resolved.value.program.emitters.map(() => (previous?.playCycle ?? -1) + 1),\n cameraVisible: resolved.value.program.emitters.map(() => true),\n phaseTicks: resolved.value.program.emitters.map(() => 0),\n hasCommitted: false,\n }\n : previous;\n this.#players.set(input.player, state);\n // Replay is a one-FixedUpdate request, not a second persistent play-state\n // authority. Inspection always returns the authored player state after\n // the requested reset intent has been emitted.\n state.playing = input.playing;\n if (!input.playing && !replayRequested) continue;\n const queuedForPlayer = this.#intents.reduce(\n (count, intent) => count + (intent.player === input.player ? 1 : 0),\n 0,\n );\n if (\n queuedForPlayer >=\n this.#maxQueuedTicks * Math.max(1, resolved.value.program.emitters.length)\n ) {\n if (state.hasCommitted) {\n this.#report({\n code: 'vfx-intent-queue-overflow',\n expected: `at most ${this.#maxQueuedTicks} unconsumed fixed ticks`,\n hint: 'recover or restart the renderer; VFX does not silently discard simulation ticks',\n detail: { player: input.player, maxQueuedTicks: this.#maxQueuedTicks },\n });\n }\n continue;\n }\n const instance =\n this.#instances.get(input.player) ?? this.#createInstance(input.player, resolved.value);\n if (instance === undefined) continue;\n const hasActiveEmitter = resolved.value.program.emitters.some((emitter) => {\n if (!this.isEmitterSessionEnabled(input.player, emitter.id)) return false;\n const cameraVisible = this.#cameraVisibility.get(`${input.player}:${emitter.id}`) ?? true;\n return cameraVisible || emitter.simulationWhenCulled === 'continue';\n });\n if (!hasActiveEmitter) {\n for (const [index, emitter] of resolved.value.program.emitters.entries()) {\n state.cameraVisible[index] =\n this.#cameraVisibility.get(`${input.player}:${emitter.id}`) ?? true;\n }\n continue;\n }\n const replayInput = this.#replayInputs.get(input.player);\n this.#replayInputs.delete(input.player);\n const committed =\n replayInput === undefined\n ? instance.commit({ seed: input.seed, tick })\n : instance.replay(replayInput);\n if (!committed.ok) {\n this.#report({\n code: 'vfx-instance-commit-failed',\n expected: 'the current typed instance values to pack into the reflected GPU block',\n hint: 'repair the instance patch and retry at the next FixedUpdate',\n detail: { player: input.player },\n });\n continue;\n }\n const delta = fixedDelta * input.timeScale;\n const committedChannels = committed.value.channelInputs;\n for (const [index, emitter] of resolved.value.program.emitters.entries()) {\n const cameraVisible = this.#cameraVisibility.get(`${input.player}:${emitter.id}`) ?? true;\n const becameVisible = cameraVisible && state.cameraVisible[index] === false;\n state.cameraVisible[index] = cameraVisible;\n if (!this.isEmitterSessionEnabled(input.player, emitter.id)) continue;\n if (!cameraVisible && emitter.simulationWhenCulled !== 'continue') continue;\n const visibilityRestart =\n becameVisible && emitter.simulationWhenCulled === 'restart-on-visible';\n if (visibilityRestart) {\n state.elapsed[index] = 0;\n state.rateRemainders[index] = 0;\n state.nextParticleIds[index] = 0;\n state.playCycles[index] = (state.playCycles[index] ?? state.playCycle) + 1;\n state.phaseTicks[index] = 0;\n }\n const previousElapsed = state.elapsed[index] ?? 0;\n const scheduled = spawnCount(\n emitter,\n previousElapsed,\n previousElapsed + delta,\n restart || visibilityRestart,\n state.rateRemainders[index] ?? 0,\n );\n state.rateRemainders[index] = scheduled.remainder;\n const firstParticleId = state.nextParticleIds[index] ?? 0;\n state.nextParticleIds[index] = firstParticleId + scheduled.count;\n const consumesEvent = resolved.value.program.emitters.some((source) =>\n (source.events ?? []).some((event) => event.subEmitter === emitter.id),\n );\n const eventSources = resolved.value.program.emitters.flatMap((source) =>\n (source.events ?? []).filter((event) => event.subEmitter === emitter.id),\n );\n const channelInputs =\n (emitter.events?.length ?? 0) > 0 || consumesEvent ? committedChannels : [];\n const phaseTick = state.phaseTicks[index] ?? 0;\n this.#intents.push(\n Object.freeze({\n sequence: this.#sequence++,\n player: input.player,\n emitter,\n programFingerprint: resolved.value.program.fingerprint,\n reset: restart || visibilityRestart,\n fixedDelta: delta,\n phaseTick,\n tick,\n seed: input.seed,\n playCycle: state.playCycles[index] ?? state.playCycle,\n spawnCount: scheduled.count,\n firstParticleId,\n instanceGeneration: committed.value.generation,\n instancePatchCount: committed.value.patchCount,\n parameterBlock: committed.value.parameterBlock,\n canonicalPayload: committed.value.canonicalPayload,\n replayInput: committed.value.replayInput,\n channelInputs,\n eventCounters: eventCounters(\n { channelInputs, emitter },\n channelInputs.length === 0 ? 0 : committed.value.droppedCount,\n eventSources,\n ),\n }),\n );\n state.elapsed[index] = previousElapsed + delta;\n state.phaseTicks[index] = phaseTick + 1;\n }\n }\n for (const player of this.#players.keys()) {\n if (!this.#seen.has(player)) this.reset(player);\n }\n }\n\n #createInstance(\n player: EntityHandle,\n effect: VfxGpuEffectAsset,\n ): ParticleEffectInstance | undefined {\n const layout = effect.program.emitters.find(\n (emitter) => emitter.reflection.layout !== undefined,\n )?.reflection.layout;\n const reflection: VfxEffectReflection = layout ?? {\n version: 1,\n parameters: { name: 'VfxParameters', fields: [], size: 0, alignment: 1 },\n custom: { name: 'VfxCustom', fields: [], size: 0, alignment: 1 },\n fingerprint: effect.program.fingerprint.startsWith('sha256:')\n ? effect.program.fingerprint\n : `sha256:${effect.program.fingerprint}`,\n };\n try {\n const instance = new ParticleEffectInstance(createVfxEffectContract(reflection), {\n channels: effect.program.emitters.flatMap((emitter) => emitter.channels ?? []),\n });\n this.#instances.set(player, instance);\n return instance;\n } catch {\n this.#report({\n code: 'vfx-instance-commit-failed',\n expected: 'a valid reflected VFX instance contract',\n hint: 'recook the effect with a valid reflection layout before starting the player',\n detail: { player },\n });\n return undefined;\n }\n }\n\n #latestIntent(player: EntityHandle, emitterId: string): VfxGpuTickIntent | undefined {\n let latest = this.#lastCommittedByEmitter.get(player)?.get(emitterId);\n for (let index = this.#intents.length - 1; index >= 0; index -= 1) {\n const intent = this.#intents[index];\n if (intent?.player !== player || intent.emitter.id !== emitterId) continue;\n if (latest === undefined || intent.sequence > latest.sequence) latest = intent;\n break;\n }\n return latest;\n }\n}\n\nfunction spawnCount(\n emitter: VfxGpuEmitterProgram,\n previous: number,\n next: number,\n firstTick: boolean,\n priorRemainder: number,\n): { readonly count: number; readonly remainder: number } {\n const exactRate = emitter.schedule.rate * Math.max(0, next - previous) + priorRemainder;\n let count = Math.floor(exactRate);\n const loop = emitter.schedule.loopDuration;\n for (const burst of emitter.schedule.bursts ?? []) {\n if (loop === undefined) {\n if ((firstTick && burst.time === 0) || (burst.time > previous && burst.time <= next)) {\n count += burst.count;\n }\n continue;\n }\n const firstOccurrence = Math.max(0, Math.floor((previous - burst.time) / loop) + 1);\n const lastOccurrence = Math.floor((next - burst.time) / loop);\n const occurrences = Math.max(0, lastOccurrence - firstOccurrence + 1);\n count += occurrences * burst.count;\n if (firstTick && burst.time === 0) count += burst.count;\n }\n return { count, remainder: exactRate - Math.floor(exactRate) };\n}\n\nexport function vfxGpuRuntimePlugin(options: VfxGpuRuntimeOptions = {}): Plugin {\n const rows: {\n player: EntityHandle;\n effect: Handle<'ParticleEffectAsset', 'shared'>;\n playing: boolean;\n seed: number;\n timeScale: number;\n }[] = [];\n return {\n name: 'vfx-gpu-runtime',\n inject: ['world'],\n apply(ctx) {\n const world = ctx.world;\n if (world.hasResource(VFX_GPU_RUNTIME_RESOURCE_KEY)) {\n throw new TypeError(`${VFX_GPU_RUNTIME_RESOURCE_KEY} already exists`);\n }\n const runtime = new VfxGpuRuntime(options);\n ctx.effect(() => {\n world.insertResource(VFX_GPU_RUNTIME_RESOURCE_KEY, runtime);\n return () => {\n world.removeResource(VFX_GPU_RUNTIME_RESOURCE_KEY);\n };\n }, 'vfx/runtime-resource');\n ctx.effect(() => {\n world\n .addSystem(FixedUpdate, {\n name: 'vfx-gpu-runtime',\n queries: [{ with: [Entity, ParticleEffectPlayer] }],\n fn: (world, queryResults) => {\n rows.length = 0;\n for (const row of queryResults[0]) {\n const player = row.get(ParticleEffectPlayer);\n rows.push({\n player: row.entity,\n effect: toShared<'ParticleEffectAsset'>(player.effect),\n playing: player.playing,\n seed: player.seed,\n timeScale: player.timeScale,\n });\n }\n const fixed = world.getResource(FixedTime);\n runtime.advance(world, fixed.tick, fixed.delta, rows);\n },\n })\n .unwrap();\n return () => world.removeSystem(FixedUpdate, 'vfx-gpu-runtime');\n }, 'vfx/tick-system');\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/assets/particle-effect-decoder.ts","../src/authoring-descriptor.ts","../src/code-source.ts","../src/code-source-v3.ts","../src/data-interface.ts","../src/effect-contract.ts","../src/gpu-program.ts","../src/gpu-loader.ts","../src/instance.ts","../src/player.ts","../src/gpu-runtime.ts","../src/particle-layout.ts"],"names":["err","extra","ok","fields","value","record","allowed","field","parsed","fail","failure","fingerprint","world","finite"],"mappings":"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","file":"index.mjs","sourcesContent":["import {\n type AssetDecoderContribution,\n type AssetKind,\n err,\n ok,\n type ParticleEffectAsset,\n} from '@forgeax/engine-types';\n\nexport const particleEffectContribution: AssetDecoderContribution<\n ParticleEffectAsset,\n 'particle-effect'\n> = {\n kind: { kind: 'particle-effect' } as AssetKind<ParticleEffectAsset, 'particle-effect'>,\n consumer: 'VfxGpuRuntime',\n decoder: {\n async decode({ envelope }) {\n const payload = envelope.payload;\n if (\n payload.kind === 'particle-effect' &&\n payload.schemaVersion === 3 &&\n payload.program.format === 'forgeax-vfx-program-3' &&\n payload.emitters.length === payload.program.emitters.length &&\n payload.programFingerprint === payload.program.fingerprint\n ) {\n return ok(payload);\n }\n return err({\n code: 'asset-package-invalid',\n expected: 'a schemaVersion 3 particle payload matching its cooked Program v3',\n hint: 'cold-cook the legacy payload with the Program v3 compiler and publish atomically',\n detail: { guid: envelope.guid, reason: 'particle owner validation failed' },\n });\n },\n },\n};\n","import type { VfxGpuEffectAssetAny, VfxGpuEmitterProgramAny } from './gpu-program.js';\n\nexport type VfxAuthoringValue =\n | null\n | string\n | number\n | boolean\n | readonly VfxAuthoringValue[]\n | { readonly [key: string]: VfxAuthoringValue };\n\nexport interface VfxAuthoringFieldDescriptor {\n readonly path: string;\n readonly label: string;\n readonly value: VfxAuthoringValue;\n readonly valueType: 'text' | 'number' | 'boolean' | 'vector' | 'object';\n}\n\nexport type VfxAuthoringNodeRole =\n | 'emitter'\n | 'program'\n | 'parameters'\n | 'custom'\n | 'stage'\n | 'channel'\n | 'event'\n | 'renderer';\n\nexport interface VfxAuthoringNodeDescriptor {\n readonly id: string;\n readonly role: VfxAuthoringNodeRole;\n readonly label: string;\n readonly sourcePath: string;\n readonly fields: readonly VfxAuthoringFieldDescriptor[];\n readonly children: readonly VfxAuthoringNodeDescriptor[];\n}\n\nexport interface VfxAuthoringEmitterDescriptor extends VfxAuthoringNodeDescriptor {\n readonly role: 'emitter';\n readonly module: string;\n}\n\nexport interface VfxAuthoringTimelineDescriptor {\n readonly emitterId: string;\n readonly rate: number;\n readonly bursts: readonly { readonly time: number; readonly count: number }[];\n readonly loopDuration?: number;\n}\n\nexport interface VfxAuthoringDependencyDescriptor {\n readonly kind: 'asset' | 'module' | 'data-interface';\n readonly identity: string;\n readonly sourcePath: string;\n}\n\nexport interface VfxAuthoringCapabilityDescriptor {\n readonly id: string;\n readonly state: 'executable' | 'partial' | 'unavailable';\n readonly reason?: string;\n}\n\nexport interface VfxAuthoringDescriptor {\n readonly version: 1;\n readonly assetGuid: string;\n readonly schemaVersion: 3;\n readonly artifactFingerprint: string;\n readonly emitters: readonly VfxAuthoringEmitterDescriptor[];\n readonly timeline: readonly VfxAuthoringTimelineDescriptor[];\n readonly dependencies: readonly VfxAuthoringDependencyDescriptor[];\n readonly capabilities: readonly VfxAuthoringCapabilityDescriptor[];\n}\n\nconst V3_CAPABILITIES: readonly VfxAuthoringCapabilityDescriptor[] = Object.freeze([\n Object.freeze({ id: 'wgsl-behavior', state: 'executable' }),\n Object.freeze({ id: 'multi-emitter', state: 'executable' }),\n Object.freeze({ id: 'deterministic-replay', state: 'executable' }),\n Object.freeze({ id: 'emitter-visibility', state: 'executable' }),\n Object.freeze({ id: 'runtime-parameters', state: 'executable' }),\n Object.freeze({ id: 'custom-attributes', state: 'executable' }),\n Object.freeze({ id: 'renderer-semantics', state: 'executable' }),\n Object.freeze({ id: 'material-particle-inputs', state: 'executable' }),\n Object.freeze({\n id: 'data-interfaces',\n state: 'partial',\n reason: 'camera, single-sample scene depth, and noise require generation-owned providers',\n }),\n]);\n\n/** Narrow an AssetRegistry payload without making editor consumers duplicate\n * the cooked program shape. This deliberately validates the stable producer\n * discriminants only; detailed artifact validation remains the pack loader's\n * responsibility. */\nexport function isVfxGpuEffectAsset(value: unknown): value is VfxGpuEffectAssetAny {\n if (typeof value !== 'object' || value === null) return false;\n const candidate = value as Partial<VfxGpuEffectAssetAny>;\n const program = candidate.program;\n return (\n candidate.kind === 'particle-effect' &&\n candidate.schemaVersion === 3 &&\n typeof candidate.guid === 'string' &&\n candidate.guid.length > 0 &&\n typeof program === 'object' &&\n program !== null &&\n program.format === 'forgeax-vfx-program-3' &&\n typeof program.fingerprint === 'string' &&\n Array.isArray(program.emitters)\n );\n}\n\nfunction label(path: string): string {\n const leaf = path.split('.').at(-1) ?? path;\n return leaf.replaceAll(/([a-z])([A-Z])/g, '$1 $2').replace(/^./, (value) => value.toUpperCase());\n}\n\nfunction authoringValue(value: unknown): VfxAuthoringValue {\n if (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return value;\n }\n if (Array.isArray(value)) return Object.freeze(value.map(authoringValue));\n if (typeof value === 'object') {\n const out: Record<string, VfxAuthoringValue> = {};\n for (const [key, child] of Object.entries(value)) out[key] = authoringValue(child);\n return Object.freeze(out);\n }\n return String(value);\n}\n\nfunction valueType(value: VfxAuthoringValue): VfxAuthoringFieldDescriptor['valueType'] {\n if (typeof value === 'number') return 'number';\n if (typeof value === 'boolean') return 'boolean';\n if (Array.isArray(value) && value.every((entry) => typeof entry === 'number')) return 'vector';\n if (typeof value === 'object' && value !== null) return 'object';\n return 'text';\n}\n\nfunction field(path: string, value: unknown): VfxAuthoringFieldDescriptor {\n const normalized = authoringValue(value);\n return Object.freeze({\n path,\n label: label(path),\n value: normalized,\n valueType: valueType(normalized),\n });\n}\n\nfunction fields(\n path: string,\n value: object,\n omit: readonly string[] = [],\n): readonly VfxAuthoringFieldDescriptor[] {\n const excluded = new Set(omit);\n return Object.freeze(\n Object.entries(value)\n .filter(([key, child]) => !excluded.has(key) && child !== undefined)\n .map(([key, child]) => field(`${path}.${key}`, child)),\n );\n}\n\nfunction node(\n input: Omit<VfxAuthoringNodeDescriptor, 'children'> & {\n readonly children?: readonly VfxAuthoringNodeDescriptor[];\n },\n): VfxAuthoringNodeDescriptor {\n return Object.freeze({ ...input, children: Object.freeze([...(input.children ?? [])]) });\n}\n\nfunction reflectionNodes(\n emitter: VfxGpuEmitterProgramAny,\n path: string,\n): VfxAuthoringNodeDescriptor[] {\n const nodes: VfxAuthoringNodeDescriptor[] = [];\n const layout = emitter.reflection.layout;\n if (layout !== undefined && layout.parameters.fields.length > 0) {\n nodes.push(\n node({\n id: `parameters:${emitter.id}`,\n role: 'parameters',\n label: layout.parameters.name,\n sourcePath: `${path}.program`,\n fields: Object.freeze(\n layout.parameters.fields.map((entry) =>\n field(`parameters.${entry.name}`, {\n type: entry.type,\n offset: entry.offset,\n size: entry.size,\n alignment: entry.alignment,\n defaultValue: entry.defaultValue ?? null,\n }),\n ),\n ),\n }),\n );\n }\n if (layout !== undefined && layout.custom.fields.length > 0) {\n nodes.push(\n node({\n id: `custom:${emitter.id}`,\n role: 'custom',\n label: layout.custom.name,\n sourcePath: `${path}.program`,\n fields: Object.freeze(\n layout.custom.fields.map((entry) =>\n field(`custom.${entry.name}`, {\n type: entry.type,\n offset: entry.offset,\n size: entry.size,\n alignment: entry.alignment,\n defaultValue: entry.defaultValue ?? null,\n }),\n ),\n ),\n }),\n );\n }\n for (const stage of emitter.reflection.stages ?? []) {\n nodes.push(\n node({\n id: `stage:${emitter.id}:${stage.id}`,\n role: 'stage',\n label: stage.id,\n sourcePath: `${path}.program`,\n fields: fields(`stages.${stage.id}`, stage, ['id', 'entryPoint']),\n }),\n );\n }\n return nodes;\n}\n\nfunction emitterNode(\n emitter: VfxGpuEmitterProgramAny,\n index: number,\n): VfxAuthoringEmitterDescriptor {\n const path = `emitters[${index}]`;\n const children: VfxAuthoringNodeDescriptor[] = [\n node({\n id: `program:${emitter.id}`,\n role: 'program',\n label: emitter.module,\n sourcePath: `${path}.program.module`,\n fields: Object.freeze([\n field(`${path}.program.module`, emitter.module),\n field(`${path}.program.imports`, emitter.reflection.imports),\n ]),\n }),\n ...reflectionNodes(emitter, path),\n ...(emitter.channels ?? []).map((channel, channelIndex) =>\n node({\n id: `channel:${emitter.id}:${channel.id}`,\n role: 'channel',\n label: channel.id,\n sourcePath: `${path}.channels[${channelIndex}]`,\n fields: fields(`${path}.channels[${channelIndex}]`, channel, ['id']),\n }),\n ),\n ...(emitter.events ?? []).map((event, eventIndex) =>\n node({\n id: `event:${emitter.id}:${event.id}`,\n role: 'event',\n label: event.id,\n sourcePath: `${path}.events[${eventIndex}]`,\n fields: fields(`${path}.events[${eventIndex}]`, event, ['id']),\n }),\n ),\n ...emitter.renderers.map((renderer, rendererIndex) =>\n node({\n id: `renderer:${emitter.id}:${rendererIndex}`,\n role: 'renderer',\n label: `${renderer.kind} renderer`,\n sourcePath: `${path}.renderers[${rendererIndex}]`,\n fields: fields(`${path}.renderers[${rendererIndex}]`, renderer, ['kind']),\n }),\n ),\n ];\n return Object.freeze({\n id: `emitter:${emitter.id}`,\n role: 'emitter',\n label: emitter.id,\n module: emitter.module,\n sourcePath: path,\n fields: Object.freeze([\n field(`${path}.capacity`, emitter.capacity),\n field(`${path}.space`, emitter.space),\n field(`${path}.bounds`, emitter.bounds),\n field(`${path}.simulationWhenCulled`, emitter.simulationWhenCulled),\n ]),\n children: Object.freeze(children),\n });\n}\n\nfunction dependencies(effect: VfxGpuEffectAssetAny): readonly VfxAuthoringDependencyDescriptor[] {\n const entries: VfxAuthoringDependencyDescriptor[] = [];\n const seen = new Set<string>();\n const add = (entry: VfxAuthoringDependencyDescriptor): void => {\n const key = `${entry.kind}:${entry.identity}`;\n if (seen.has(key)) return;\n seen.add(key);\n entries.push(Object.freeze(entry));\n };\n for (const [emitterIndex, emitter] of effect.program.emitters.entries()) {\n const path = `emitters[${emitterIndex}]`;\n add({ kind: 'module', identity: emitter.module, sourcePath: `${path}.program.module` });\n for (const identity of emitter.reflection.imports) {\n add({ kind: 'module', identity, sourcePath: `${path}.program.imports` });\n }\n for (const [rendererIndex, renderer] of emitter.renderers.entries()) {\n add({\n kind: 'asset',\n identity: renderer.material,\n sourcePath: `${path}.renderers[${rendererIndex}].material`,\n });\n if (renderer.kind === 'mesh') {\n add({\n kind: 'asset',\n identity: renderer.mesh,\n sourcePath: `${path}.renderers[${rendererIndex}].mesh`,\n });\n }\n }\n for (const requirement of emitter.reflection.dataInterfaces ?? []) {\n add({ kind: 'data-interface', identity: requirement.token, sourcePath: `${path}.program` });\n }\n }\n return Object.freeze(entries);\n}\n\n/** Project the cooked runtime asset into a compiler-free, UI-neutral authoring read model. */\nexport function describeVfxGpuEffect(effect: VfxGpuEffectAssetAny): VfxAuthoringDescriptor {\n return Object.freeze({\n version: 1,\n assetGuid: effect.guid,\n schemaVersion: effect.schemaVersion,\n artifactFingerprint: effect.program.fingerprint,\n emitters: Object.freeze(effect.program.emitters.map(emitterNode)),\n timeline: Object.freeze(\n effect.program.emitters.map((emitter) =>\n Object.freeze({\n emitterId: emitter.id,\n rate: emitter.schedule.rate,\n bursts: Object.freeze([...(emitter.schedule.bursts ?? [])]),\n ...(emitter.schedule.loopDuration === undefined\n ? {}\n : { loopDuration: emitter.schedule.loopDuration }),\n }),\n ),\n ),\n dependencies: dependencies(effect),\n capabilities: V3_CAPABILITIES,\n });\n}\n","import { err, ok, type Result } from '@forgeax/engine-types';\n\n/** Engine-owned seed module used by newly-authored particle effects. */\nexport const PARTICLE_CODE_DEFAULT_MODULE_ID = 'forgeax_vfx::default' as const;\n\nexport type ParticleBoundsSource =\n | {\n readonly kind: 'aabb';\n readonly min: readonly [number, number, number];\n readonly max: readonly [number, number, number];\n }\n | {\n readonly kind: 'sphere';\n readonly center: readonly [number, number, number];\n readonly radius: number;\n };\n\nexport type ParticleRendererOverflowPolicy = 'drop-newest' | 'drop-oldest';\n/** Internal structural projection used while validating the v3 source. */\nexport type ParticleRendererSortingStructure = 'none' | 'emitter' | 'back-to-front';\n\nexport interface ParticleTextureSheetSource {\n readonly columns: number;\n readonly rows: number;\n readonly frameRate: number;\n readonly frameCount?: number;\n}\n\nexport interface ParticleSoftParticleSource {\n readonly fadeDistance: number;\n}\n\nexport type ParticleRendererSourceStructure =\n | {\n readonly kind: 'billboard';\n readonly material: string;\n readonly blend?: 'additive' | 'alpha' | 'opaque-cutout';\n readonly enabled?: boolean;\n readonly capacity?: number;\n readonly overflow?: ParticleRendererOverflowPolicy;\n readonly textureSheet?: ParticleTextureSheetSource;\n readonly pivot?: readonly [number, number];\n readonly softParticle?: ParticleSoftParticleSource;\n readonly sorting?: ParticleRendererSortingStructure;\n }\n | {\n readonly kind: 'mesh';\n readonly material: string;\n readonly mesh: string;\n readonly submesh?: number;\n readonly enabled?: boolean;\n }\n | {\n readonly kind: 'ribbon';\n readonly material: string;\n readonly stripKey: 'alive-index';\n readonly capacity: number;\n readonly overflow?: ParticleRendererOverflowPolicy;\n readonly enabled?: boolean;\n readonly width?: number;\n }\n | {\n readonly kind: 'trail';\n readonly material: string;\n readonly historyLength: number;\n readonly capacity: number;\n readonly overflow?: ParticleRendererOverflowPolicy;\n readonly enabled?: boolean;\n readonly width?: number;\n }\n | {\n readonly kind: 'beam';\n readonly material: string;\n readonly endpointField: 'velocity';\n readonly capacity: number;\n readonly overflow?: ParticleRendererOverflowPolicy;\n readonly enabled?: boolean;\n readonly width?: number;\n };\n\nexport type ParticleChannelOverflowPolicy = ParticleRendererOverflowPolicy;\n\nexport type ParticleStageDomain = 'particle';\nexport type ParticleStageResourceAccess = 'read' | 'write' | 'read-write';\n\nexport interface ParticleStageResourceSource {\n readonly name: string;\n readonly access: ParticleStageResourceAccess;\n}\n\nexport interface ParticleStageSource {\n readonly id: string;\n readonly entry: string;\n readonly domain: ParticleStageDomain;\n readonly resources: readonly ParticleStageResourceSource[];\n readonly dependsOn: readonly string[];\n readonly iterationBudget: number;\n}\n\nexport const PARTICLE_STAGE_RESOURCE_NAMES = Object.freeze([\n 'particles',\n 'runtime',\n 'aliveIndices',\n 'counters',\n 'indirect',\n 'scratch',\n 'billboardInstances',\n 'channelInputs',\n 'events',\n 'eventCounters',\n] as const);\n\nexport interface ParticleChannelSource {\n readonly id: string;\n readonly payload?: 'impact';\n readonly capacity: number;\n readonly overflow: ParticleChannelOverflowPolicy;\n}\n\nexport interface ParticleEventSource {\n readonly id: string;\n readonly channel: string;\n readonly subEmitter: string;\n readonly fanOut: number;\n readonly recursionDepth: number;\n}\n\nexport interface ParticleEmitterSourceStructure {\n readonly id: string;\n readonly capacity: number;\n readonly backend: { readonly required: 'gpu' };\n readonly space: 'local' | 'world';\n readonly bounds: ParticleBoundsSource;\n readonly schedule: {\n readonly rate: number;\n readonly bursts?: readonly { readonly time: number; readonly count: number }[];\n readonly loopDuration?: number;\n };\n readonly program: { readonly module: string };\n readonly renderers: readonly ParticleRendererSourceStructure[];\n readonly channels?: readonly ParticleChannelSource[];\n readonly events?: readonly ParticleEventSource[];\n readonly simulationWhenCulled?: 'continue' | 'pause' | 'restart-on-visible';\n}\n\nexport interface ParticleEffectRootSourceStructure {\n readonly schemaVersion: 3;\n readonly emitters: readonly ParticleEmitterSourceStructure[];\n}\n\nexport type ParticleEffectSourceStructure = ParticleEffectRootSourceStructure;\n\nexport interface ParticleCodeSourceInvalidDetail {\n readonly path: string;\n readonly emitterId?: string;\n readonly stageId?: string;\n readonly resource?: string;\n}\n\nexport interface ParticleCodeSourceError {\n readonly code:\n | 'vfx-source-invalid'\n | 'vfx-source-version-unsupported'\n | 'vfx-source-channel-invalid'\n | 'vfx-source-event-invalid'\n | 'vfx-source-stage-invalid'\n | 'vfx-source-renderer-invalid';\n readonly expected: string;\n readonly hint: string;\n readonly detail: ParticleCodeSourceInvalidDetail;\n}\n\nfunction invalid(\n path: string,\n expected: string,\n emitterId?: string,\n code: ParticleCodeSourceError['code'] = 'vfx-source-invalid',\n): Result<never, ParticleCodeSourceError> {\n return err({\n code,\n expected,\n hint: `repair ${path} and recook the particle effect`,\n detail: emitterId === undefined ? { path } : { path, emitterId },\n });\n}\n\nfunction eventInvalid(\n code: 'vfx-source-channel-invalid' | 'vfx-source-event-invalid',\n path: string,\n expected: string,\n emitterId?: string,\n): Result<never, ParticleCodeSourceError> {\n return invalid(path, expected, emitterId, code);\n}\n\nfunction record(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction finite(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value);\n}\n\nfunction positiveInteger(value: unknown): value is number {\n return finite(value) && Number.isInteger(value) && value > 0;\n}\n\nfunction nonNegativeInteger(value: unknown): value is number {\n return finite(value) && Number.isInteger(value) && value >= 0;\n}\n\nfunction text(value: unknown): value is string {\n return typeof value === 'string' && value.length > 0;\n}\n\nfunction vector(value: unknown, size: number): value is readonly number[] {\n return Array.isArray(value) && value.length === size && value.every(finite);\n}\n\nfunction allowed(value: Record<string, unknown>, keys: readonly string[]): string | undefined {\n const set = new Set(keys);\n return Object.keys(value).find((key) => !set.has(key));\n}\n\nfunction stageInvalid(\n path: string,\n expected: string,\n stageId?: string,\n resource?: string,\n): Result<never, ParticleCodeSourceError> {\n return err({\n code: 'vfx-source-stage-invalid',\n expected,\n hint: `repair stage ${path} and recook the stage declaration`,\n detail: {\n path,\n ...(stageId === undefined ? {} : { stageId }),\n ...(resource === undefined ? {} : { resource }),\n },\n });\n}\n\nconst STAGE_FIELDS = ['entry', 'domain', 'resources', 'dependsOn', 'iterationBudget'] as const;\nconst STAGE_RESOURCE_NAMES = new Set<string>(PARTICLE_STAGE_RESOURCE_NAMES);\n\nfunction parseStageResources(\n value: string,\n path: string,\n stageId: string,\n): Result<readonly ParticleStageResourceSource[], ParticleCodeSourceError> {\n if (value.length === 0)\n return stageInvalid(path, 'at least one explicit stage resource', stageId);\n const resources: ParticleStageResourceSource[] = [];\n const names = new Set<string>();\n for (const item of value.split(',')) {\n const [name, access, extra] = item.split(':');\n if (\n name === undefined ||\n access === undefined ||\n extra !== undefined ||\n !STAGE_RESOURCE_NAMES.has(name) ||\n (access !== 'read' && access !== 'write' && access !== 'read-write') ||\n names.has(name)\n ) {\n return stageInvalid(\n path,\n 'known resources with unique read, write, or read-write access',\n stageId,\n name,\n );\n }\n names.add(name);\n resources.push({ name, access });\n }\n return ok(Object.freeze(resources));\n}\n\n/** Parse compiler-owned stage metadata from authored WGSL comments. */\nexport function parseVfxStageDeclarations(\n source: string,\n): Result<readonly ParticleStageSource[], ParticleCodeSourceError> {\n const stages: ParticleStageSource[] = [];\n const ids = new Set<string>();\n const pattern = /^\\s*\\/\\/\\s*#vfx\\s+stage\\s+([^\\s]+)\\s+(.+)$/gm;\n for (const match of source.matchAll(pattern)) {\n const id = match[1];\n const fieldsText = match[2];\n if (id === undefined || fieldsText === undefined || !/^[A-Za-z_]\\w*$/.test(id) || ids.has(id)) {\n return stageInvalid(\n `stage.${id ?? 'unknown'}`,\n 'a unique stage id and supported stage declaration',\n id,\n );\n }\n const fields: Record<string, string> = {};\n for (const token of fieldsText.trim().split(/\\s+/)) {\n const separator = token.indexOf('=');\n const key = separator < 0 ? undefined : token.slice(0, separator);\n const value = separator < 0 ? undefined : token.slice(separator + 1);\n if (\n key === undefined ||\n value === undefined ||\n !STAGE_FIELDS.includes(key as (typeof STAGE_FIELDS)[number]) ||\n fields[key] !== undefined\n ) {\n return stageInvalid(\n `stage.${id}`,\n 'a supported stage declaration with entry, domain, resources, dependsOn, and iterationBudget fields',\n id,\n );\n }\n fields[key] = value;\n }\n const entry = fields.entry;\n const domain = fields.domain;\n const resourcesValue = fields.resources;\n const dependsOnValue = fields.dependsOn;\n const budgetValue = fields.iterationBudget;\n if (\n entry === undefined ||\n !/^[A-Za-z_]\\w*$/.test(entry) ||\n entry.startsWith('forgeax_vfx_') ||\n domain !== 'particle' ||\n resourcesValue === undefined ||\n dependsOnValue === undefined ||\n budgetValue === undefined\n ) {\n return stageInvalid(\n `stage.${id}`,\n 'a particle-domain stage with an author entry and explicit fields',\n id,\n );\n }\n const resources = parseStageResources(resourcesValue, `stage.${id}.resources`, id);\n if (!resources.ok) return resources;\n const iterationBudget = Number(budgetValue);\n if (!Number.isInteger(iterationBudget) || iterationBudget < 1 || iterationBudget > 64) {\n return stageInvalid(\n `stage.${id}.iterationBudget`,\n 'an integer iteration budget from 1 through 64',\n id,\n );\n }\n const dependsOn =\n dependsOnValue === 'none'\n ? []\n : dependsOnValue.split(',').filter((dependency) => dependency.length > 0);\n if (dependsOn.some((dependency) => !/^[A-Za-z_]\\w*$/.test(dependency))) {\n return stageInvalid(`stage.${id}.dependsOn`, 'stage identifiers or none', id);\n }\n ids.add(id);\n stages.push({\n id,\n entry,\n domain: 'particle',\n resources: resources.value,\n dependsOn: Object.freeze(dependsOn),\n iterationBudget,\n });\n }\n return ok(Object.freeze(stages));\n}\n\nfunction parseEmitter(\n value: unknown,\n index: number,\n ids: Set<string>,\n): Result<ParticleEmitterSourceStructure, ParticleCodeSourceError> {\n const path = `emitters[${index}]`;\n if (!record(value)) return invalid(path, 'a Program v3 emitter object');\n const extra = allowed(value, [\n 'id',\n 'capacity',\n 'backend',\n 'space',\n 'bounds',\n 'schedule',\n 'program',\n 'renderers',\n 'channels',\n 'events',\n 'simulationWhenCulled',\n ]);\n if (extra !== undefined) return invalid(`${path}.${extra}`, 'a Program v3 emitter field');\n if (!text(value.id) || ids.has(value.id)) return invalid(`${path}.id`, 'a unique non-empty id');\n const id = value.id;\n ids.add(id);\n if (!positiveInteger(value.capacity))\n return invalid(`${path}.capacity`, 'a positive integer', id);\n if (!record(value.backend) || value.backend.required !== 'gpu') {\n return invalid(`${path}.backend`, \"the explicit policy { required: 'gpu' }\", id);\n }\n const backendExtra = allowed(value.backend, ['required']);\n if (backendExtra !== undefined) {\n return invalid(`${path}.backend.${backendExtra}`, 'the required GPU policy', id);\n }\n if (value.space !== 'local' && value.space !== 'world') {\n return invalid(`${path}.space`, 'local or world', id);\n }\n if (!record(value.bounds)) return invalid(`${path}.bounds`, 'fixed aabb or sphere bounds', id);\n const boundsExtra = allowed(\n value.bounds,\n value.bounds.kind === 'aabb'\n ? ['kind', 'min', 'max']\n : value.bounds.kind === 'sphere'\n ? ['kind', 'center', 'radius']\n : ['kind'],\n );\n if (boundsExtra !== undefined) {\n return invalid(`${path}.bounds.${boundsExtra}`, 'a supported bounds field', id);\n }\n const boundsOk =\n (value.bounds.kind === 'aabb' && vector(value.bounds.min, 3) && vector(value.bounds.max, 3)) ||\n (value.bounds.kind === 'sphere' &&\n vector(value.bounds.center, 3) &&\n finite(value.bounds.radius) &&\n value.bounds.radius > 0);\n if (!boundsOk) return invalid(`${path}.bounds`, 'valid fixed aabb or sphere bounds', id);\n if (!record(value.schedule) || !finite(value.schedule.rate) || value.schedule.rate < 0) {\n return invalid(`${path}.schedule`, 'a non-negative spawn schedule', id);\n }\n const scheduleExtra = allowed(value.schedule, ['rate', 'bursts', 'loopDuration']);\n if (scheduleExtra !== undefined) {\n return invalid(`${path}.schedule.${scheduleExtra}`, 'a supported schedule field', id);\n }\n if (\n value.schedule.bursts !== undefined &&\n (!Array.isArray(value.schedule.bursts) ||\n value.schedule.bursts.some(\n (burst) =>\n !record(burst) || !finite(burst.time) || burst.time < 0 || !positiveInteger(burst.count),\n ))\n ) {\n return invalid(`${path}.schedule.bursts`, 'non-negative timed positive bursts', id);\n }\n if (Array.isArray(value.schedule.bursts)) {\n for (const [burstIndex, burst] of value.schedule.bursts.entries()) {\n if (!record(burst)) continue;\n const burstExtra = allowed(burst, ['time', 'count']);\n if (burstExtra !== undefined) {\n return invalid(\n `${path}.schedule.bursts[${burstIndex}].${burstExtra}`,\n 'a supported burst field',\n id,\n );\n }\n }\n }\n if (\n value.schedule.loopDuration !== undefined &&\n (!finite(value.schedule.loopDuration) || value.schedule.loopDuration <= 0)\n ) {\n return invalid(`${path}.schedule.loopDuration`, 'a positive finite duration', id);\n }\n if (!record(value.program) || !text(value.program.module)) {\n return invalid(`${path}.program.module`, 'a WGSL module identity', id);\n }\n const programExtra = allowed(value.program, ['module']);\n if (programExtra !== undefined) {\n return invalid(`${path}.program.${programExtra}`, 'a supported program field', id);\n }\n if (!Array.isArray(value.renderers) || value.renderers.length === 0) {\n return invalid(`${path}.renderers`, 'at least one renderer', id);\n }\n for (const [rendererIndex, renderer] of value.renderers.entries()) {\n const rendererPath = `${path}.renderers[${rendererIndex}]`;\n if (!record(renderer) || !text(renderer.material) || !text(renderer.kind))\n return invalid(\n rendererPath,\n 'a supported renderer object',\n id,\n 'vfx-source-renderer-invalid',\n );\n const common = ['kind', 'material', 'enabled', 'capacity', 'overflow', 'width'] as const;\n const rendererExtra = allowed(\n renderer,\n renderer.kind === 'billboard'\n ? [...common, 'blend', 'textureSheet', 'pivot', 'softParticle', 'sorting']\n : renderer.kind === 'mesh'\n ? ['kind', 'material', 'mesh', 'submesh', 'enabled']\n : renderer.kind === 'ribbon'\n ? [...common, 'stripKey']\n : renderer.kind === 'trail'\n ? [...common, 'historyLength']\n : renderer.kind === 'beam'\n ? [...common, 'endpointField']\n : ['kind'],\n );\n if (rendererExtra !== undefined)\n return invalid(\n `${rendererPath}.${rendererExtra}`,\n 'a supported renderer field',\n id,\n 'vfx-source-renderer-invalid',\n );\n if (renderer.kind === 'mesh') {\n if (\n !text(renderer.mesh) ||\n (renderer.submesh !== undefined && !nonNegativeInteger(renderer.submesh))\n )\n return invalid(\n rendererPath,\n 'a mesh renderer with a non-negative submesh',\n id,\n 'vfx-source-renderer-invalid',\n );\n continue;\n }\n if (renderer.enabled !== undefined && typeof renderer.enabled !== 'boolean')\n return invalid(\n `${rendererPath}.enabled`,\n 'a boolean enabled flag',\n id,\n 'vfx-source-renderer-invalid',\n );\n if (\n renderer.capacity !== undefined &&\n (!positiveInteger(renderer.capacity) || renderer.capacity > 65536)\n )\n return invalid(\n `${rendererPath}.capacity`,\n 'a positive capacity no greater than 65536',\n id,\n 'vfx-source-renderer-invalid',\n );\n if (\n renderer.overflow !== undefined &&\n renderer.overflow !== 'drop-newest' &&\n renderer.overflow !== 'drop-oldest'\n )\n return invalid(\n `${rendererPath}.overflow`,\n 'drop-newest or drop-oldest',\n id,\n 'vfx-source-renderer-invalid',\n );\n if (renderer.width !== undefined && (!finite(renderer.width) || renderer.width <= 0))\n return invalid(\n `${rendererPath}.width`,\n 'a positive finite width',\n id,\n 'vfx-source-renderer-invalid',\n );\n if (renderer.kind === 'billboard') {\n if (\n renderer.blend !== undefined &&\n renderer.blend !== 'additive' &&\n renderer.blend !== 'alpha' &&\n renderer.blend !== 'opaque-cutout'\n )\n return invalid(\n `${rendererPath}.blend`,\n 'additive, alpha, or opaque-cutout',\n id,\n 'vfx-source-renderer-invalid',\n );\n if (\n renderer.sorting !== undefined &&\n renderer.sorting !== 'none' &&\n renderer.sorting !== 'emitter' &&\n renderer.sorting !== 'back-to-front'\n )\n return invalid(\n `${rendererPath}.sorting`,\n 'none, emitter, or back-to-front',\n id,\n 'vfx-source-renderer-invalid',\n );\n if (\n renderer.pivot !== undefined &&\n (!vector(renderer.pivot, 2) || renderer.pivot.some((value) => value < -1 || value > 1))\n )\n return invalid(\n `${rendererPath}.pivot`,\n 'two finite values in the -1..1 range',\n id,\n 'vfx-source-renderer-invalid',\n );\n if (renderer.textureSheet !== undefined && !record(renderer.textureSheet))\n return invalid(\n `${rendererPath}.textureSheet`,\n 'a texture sheet object',\n id,\n 'vfx-source-renderer-invalid',\n );\n if (renderer.textureSheet !== undefined && record(renderer.textureSheet)) {\n const sheet = renderer.textureSheet;\n const sheetExtra = allowed(sheet, ['columns', 'rows', 'frameRate', 'frameCount']);\n if (\n sheetExtra !== undefined ||\n !positiveInteger(sheet.columns) ||\n !positiveInteger(sheet.rows) ||\n sheet.columns > 64 ||\n sheet.rows > 64 ||\n !finite(sheet.frameRate) ||\n sheet.frameRate < 0 ||\n (sheet.frameCount !== undefined &&\n (!positiveInteger(sheet.frameCount) || sheet.frameCount > sheet.columns * sheet.rows))\n )\n return invalid(\n `${rendererPath}.textureSheet`,\n 'a bounded texture sheet declaration',\n id,\n 'vfx-source-renderer-invalid',\n );\n }\n if (renderer.softParticle !== undefined && !record(renderer.softParticle))\n return invalid(\n `${rendererPath}.softParticle`,\n 'a soft-particle object',\n id,\n 'vfx-source-renderer-invalid',\n );\n if (renderer.softParticle !== undefined && record(renderer.softParticle)) {\n const softExtra = allowed(renderer.softParticle, ['fadeDistance']);\n if (\n softExtra !== undefined ||\n !finite(renderer.softParticle.fadeDistance) ||\n renderer.softParticle.fadeDistance <= 0\n )\n return invalid(\n `${rendererPath}.softParticle`,\n 'a positive scene-depth fade distance',\n id,\n 'vfx-source-renderer-invalid',\n );\n }\n } else if (renderer.kind === 'ribbon') {\n if (renderer.stripKey !== 'alive-index' || !positiveInteger(renderer.capacity))\n return invalid(\n rendererPath,\n \"stripKey 'alive-index' and positive capacity\",\n id,\n 'vfx-source-renderer-invalid',\n );\n } else if (renderer.kind === 'trail') {\n if (\n !positiveInteger(renderer.historyLength) ||\n renderer.historyLength > 256 ||\n !positiveInteger(renderer.capacity)\n )\n return invalid(\n rendererPath,\n 'a bounded trail historyLength and positive capacity',\n id,\n 'vfx-source-renderer-invalid',\n );\n } else if (renderer.kind === 'beam') {\n if (renderer.endpointField !== 'velocity' || !positiveInteger(renderer.capacity))\n return invalid(\n rendererPath,\n \"endpointField 'velocity' and positive capacity\",\n id,\n 'vfx-source-renderer-invalid',\n );\n } else {\n return invalid(\n rendererPath,\n 'billboard, mesh, ribbon, trail, or beam',\n id,\n 'vfx-source-renderer-invalid',\n );\n }\n }\n if (value.channels !== undefined) {\n if (!Array.isArray(value.channels) || value.channels.length === 0) {\n return eventInvalid(\n 'vfx-source-channel-invalid',\n `${path}.channels`,\n 'a non-empty bounded channel list',\n id,\n );\n }\n const channelIds = new Set<string>();\n for (const [channelIndex, channel] of value.channels.entries()) {\n const channelPath = `${path}.channels[${channelIndex}]`;\n if (!record(channel)) {\n return eventInvalid('vfx-source-channel-invalid', channelPath, 'a channel object', id);\n }\n const channelExtra = allowed(channel, ['id', 'payload', 'capacity', 'overflow']);\n if (channelExtra !== undefined) {\n return eventInvalid(\n 'vfx-source-channel-invalid',\n `${channelPath}.${channelExtra}`,\n 'a supported channel field',\n id,\n );\n }\n if (!text(channel.id) || channelIds.has(channel.id)) {\n return eventInvalid(\n 'vfx-source-channel-invalid',\n `${channelPath}.id`,\n 'a unique non-empty channel id',\n id,\n );\n }\n if (\n !positiveInteger(channel.capacity) ||\n channel.capacity > 65536 ||\n (channel.payload !== undefined && channel.payload !== 'impact') ||\n (channel.overflow !== 'drop-newest' && channel.overflow !== 'drop-oldest')\n ) {\n return eventInvalid(\n 'vfx-source-channel-invalid',\n channelPath,\n 'an impact channel with capacity 1..65536 and explicit overflow policy',\n id,\n );\n }\n channelIds.add(channel.id);\n }\n }\n if (value.events !== undefined) {\n if (!Array.isArray(value.events)) {\n return eventInvalid('vfx-source-event-invalid', `${path}.events`, 'an event list', id);\n }\n const eventIds = new Set<string>();\n for (const [eventIndex, event] of value.events.entries()) {\n const eventPath = `${path}.events[${eventIndex}]`;\n if (!record(event)) {\n return eventInvalid('vfx-source-event-invalid', eventPath, 'an event object', id);\n }\n const eventExtra = allowed(event, [\n 'id',\n 'channel',\n 'subEmitter',\n 'fanOut',\n 'recursionDepth',\n ]);\n if (eventExtra !== undefined) {\n return eventInvalid(\n 'vfx-source-event-invalid',\n `${eventPath}.${eventExtra}`,\n 'a supported event field',\n id,\n );\n }\n if (!text(event.id) || eventIds.has(event.id)) {\n return eventInvalid('vfx-source-event-invalid', `${eventPath}.id`, 'a unique event id', id);\n }\n if (\n !text(event.channel) ||\n !text(event.subEmitter) ||\n !positiveInteger(event.fanOut) ||\n event.fanOut > 16 ||\n !positiveInteger(event.recursionDepth) ||\n event.recursionDepth > 8\n ) {\n return eventInvalid(\n 'vfx-source-event-invalid',\n eventPath,\n 'an event with bounded fanOut 1..16 and recursionDepth 1..8',\n id,\n );\n }\n eventIds.add(event.id);\n }\n }\n if (\n value.simulationWhenCulled !== undefined &&\n value.simulationWhenCulled !== 'continue' &&\n value.simulationWhenCulled !== 'pause' &&\n value.simulationWhenCulled !== 'restart-on-visible'\n ) {\n return invalid(`${path}.simulationWhenCulled`, 'continue, pause, or restart-on-visible', id);\n }\n return ok(value as unknown as ParticleEmitterSourceStructure);\n}\n\n/** Validate the fields shared by the canonical Program v3 source parser. */\nexport function parseParticleEffectSourceStructure(\n value: unknown,\n): Result<ParticleEffectSourceStructure, ParticleCodeSourceError> {\n if (!record(value)) return invalid('$', 'a particle effect source object');\n if (value.schemaVersion !== 3) {\n return err({\n code: 'vfx-source-version-unsupported',\n expected: 'ParticleEffectSource schemaVersion 3',\n hint: 'cold-cook the source with the Program v3 compiler; older versions are not executable',\n detail: { path: 'schemaVersion' },\n });\n }\n const extra = allowed(value, ['schemaVersion', 'emitters']);\n if (extra !== undefined) return invalid(extra, 'a root field: emitters');\n if (!Array.isArray(value.emitters) || value.emitters.length === 0) {\n return invalid('emitters', 'at least one Program v3 emitter');\n }\n const ids = new Set<string>();\n const emitters: ParticleEmitterSourceStructure[] = [];\n for (const [index, emitter] of value.emitters.entries()) {\n const parsed = parseEmitter(emitter, index, ids);\n if (!parsed.ok) return parsed;\n emitters.push(parsed.value);\n }\n const emitterIds = new Set(emitters.map((emitter) => emitter.id));\n for (const emitter of emitters) {\n const channels = new Set((emitter.channels ?? []).map((channel) => channel.id));\n for (const event of emitter.events ?? []) {\n if (!channels.has(event.channel)) {\n return eventInvalid(\n 'vfx-source-event-invalid',\n `emitters[${emitters.indexOf(emitter)}].events.${event.id}.channel`,\n 'the id of a channel declared on the same emitter',\n emitter.id,\n );\n }\n if (!emitterIds.has(event.subEmitter)) {\n return eventInvalid(\n 'vfx-source-event-invalid',\n `emitters[${emitters.indexOf(emitter)}].events.${event.id}.subEmitter`,\n 'the id of an emitter in the same cooked effect',\n emitter.id,\n );\n }\n }\n }\n return ok(\n Object.freeze({\n schemaVersion: 3,\n emitters: Object.freeze(emitters),\n }),\n );\n}\n","import { err, ok, type Result } from '@forgeax/engine-types';\nimport {\n type ParticleBoundsSource,\n type ParticleChannelSource,\n type ParticleCodeSourceError,\n type ParticleEmitterSourceStructure,\n type ParticleEventSource,\n type ParticleRendererOverflowPolicy,\n parseParticleEffectSourceStructure,\n} from './code-source.js';\nimport type { VfxParticleCoreAttribute } from './particle-layout.js';\n\n/** Renderer sorting modes in Program v3. Segment topology order is unaffected. */\nexport type ParticleRendererSortingV3 =\n | 'none'\n | 'view-depth'\n | 'view-distance'\n | 'custom-ascending'\n | 'custom-descending';\n\nexport type ParticleAttributeRef =\n | { readonly source: 'core'; readonly name: VfxParticleCoreAttribute }\n | { readonly source: 'custom'; readonly name: string };\n\n/**\n * Renderer fields with a concrete Program v3 projection. Keep this union\n * execution-backed; renderer.materialInputs is the separate material bridge.\n */\nexport type ParticleRendererSemantic =\n | 'position'\n | 'color'\n | 'size'\n | 'rotation'\n | 'subImage'\n | 'age'\n | 'sort'\n | 'orientation'\n | 'scale'\n | 'visibility'\n | 'width'\n | 'taper'\n | 'endpoint';\n\nexport type ParticleRendererSemanticMap = Readonly<\n Partial<Record<ParticleRendererSemantic, ParticleAttributeRef>>\n>;\n\nexport interface ParticleRendererSourceV3Base {\n readonly material: string;\n readonly enabled?: boolean;\n readonly capacity?: number;\n readonly overflow?: ParticleRendererOverflowPolicy;\n readonly width?: number;\n readonly attributes?: ParticleRendererSemanticMap;\n /** Names must match the cooked MaterialShaderArtifact particleInputs declaration. */\n readonly materialInputs?: readonly string[];\n}\n\nexport type ParticleRendererSourceV3 =\n | (ParticleRendererSourceV3Base & {\n readonly kind: 'billboard';\n readonly blend?: 'additive' | 'alpha' | 'opaque-cutout';\n readonly textureSheet?: {\n readonly columns: number;\n readonly rows: number;\n readonly frameRate: number;\n readonly frameCount?: number;\n };\n readonly pivot?: readonly [number, number];\n readonly softParticle?: { readonly fadeDistance: number };\n readonly sorting?: ParticleRendererSortingV3;\n })\n | (ParticleRendererSourceV3Base & {\n readonly kind: 'mesh';\n readonly mesh: string;\n readonly submesh?: number;\n readonly lighting?: 'unlit' | 'standard';\n readonly castShadows?: boolean;\n readonly receiveShadows?: boolean;\n })\n | (ParticleRendererSourceV3Base & {\n readonly kind: 'ribbon';\n readonly stripKey: 'alive-index';\n readonly capacity: number;\n readonly twist?: number;\n readonly facing?: 'camera' | 'velocity' | 'custom';\n })\n | (ParticleRendererSourceV3Base & {\n readonly kind: 'trail';\n readonly historyLength: number;\n readonly capacity: number;\n readonly taper?: number;\n })\n | (ParticleRendererSourceV3Base & {\n readonly kind: 'beam';\n readonly endpointField: 'velocity';\n readonly capacity: number;\n readonly taper?: number;\n });\n\nexport interface ParticleEmitterSourceV3 {\n readonly id: string;\n readonly capacity: number;\n readonly backend: { readonly required: 'gpu' };\n readonly space: 'local' | 'world';\n readonly bounds: ParticleBoundsSource;\n readonly schedule: ParticleEmitterSourceStructure['schedule'];\n readonly program: { readonly module: string };\n readonly renderers: readonly ParticleRendererSourceV3[];\n /** Existing channels/events are intentionally carried unchanged into v3. */\n readonly channels?: readonly ParticleChannelSource[];\n readonly events?: readonly ParticleEventSource[];\n readonly simulationWhenCulled?: ParticleEmitterSourceStructure['simulationWhenCulled'];\n}\n\nexport interface ParticleEffectRootSourceV3 {\n readonly schemaVersion: 3;\n readonly emitters: readonly ParticleEmitterSourceV3[];\n}\n\nexport type ParticleEffectSourceV3 = ParticleEffectRootSourceV3;\n\n/**\n * Renderer semantic vocabulary shared by source validation and compiler\n * reflection. Keeping the allowed keys here prevents a parser/compiler drift\n * where a typo is accepted by one boundary and ignored by the other.\n */\nexport const PARTICLE_RENDERER_SEMANTICS: Readonly<\n Record<ParticleRendererSourceV3['kind'], readonly ParticleRendererSemantic[]>\n> = Object.freeze({\n billboard: Object.freeze([\n 'position',\n 'color',\n 'size',\n 'rotation',\n 'age',\n 'subImage',\n 'sort',\n 'visibility',\n ] as const),\n mesh: Object.freeze(['position', 'color', 'orientation', 'scale', 'visibility'] as const),\n ribbon: Object.freeze(['position', 'color', 'width'] as const),\n trail: Object.freeze(['position', 'color', 'width', 'taper'] as const),\n beam: Object.freeze(['position', 'endpoint', 'color', 'width'] as const),\n});\n\nfunction coreAttribute(name: VfxParticleCoreAttribute): ParticleAttributeRef {\n return { source: 'core', name };\n}\n\n/** Default mapping for fields with implicit runtime behavior; overrides merge in the compiler. */\nexport function defaultParticleRendererAttributes(\n kind: ParticleRendererSourceV3['kind'],\n): ParticleRendererSemanticMap {\n switch (kind) {\n case 'billboard':\n return {\n position: coreAttribute('position'),\n color: coreAttribute('color'),\n size: coreAttribute('sprite_size'),\n rotation: coreAttribute('sprite_rotation'),\n age: coreAttribute('age'),\n visibility: coreAttribute('alive'),\n };\n case 'mesh':\n return {\n position: coreAttribute('position'),\n color: coreAttribute('color'),\n orientation: coreAttribute('mesh_orientation'),\n scale: coreAttribute('mesh_scale'),\n visibility: coreAttribute('alive'),\n };\n case 'ribbon':\n return {\n position: coreAttribute('position'),\n color: coreAttribute('color'),\n };\n case 'trail':\n return {\n position: coreAttribute('position'),\n color: coreAttribute('color'),\n };\n case 'beam':\n return {\n position: coreAttribute('position'),\n endpoint: coreAttribute('velocity'),\n color: coreAttribute('color'),\n };\n }\n}\n\nfunction record(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction fail(path: string, expected: string): Result<never, ParticleCodeSourceError> {\n return err({\n code: 'vfx-source-invalid',\n expected,\n hint: `repair ${path} and recook the Program v3 particle effect`,\n detail: { path },\n });\n}\n\nfunction extra(value: Record<string, unknown>, allowed: readonly string[]): string | undefined {\n const keys = new Set(allowed);\n return Object.keys(value).find((key) => !keys.has(key));\n}\n\nconst CORE_NAMES = new Set<VfxParticleCoreAttribute>([\n 'position',\n 'age',\n 'velocity',\n 'lifetime',\n 'color',\n 'sprite_size',\n 'sprite_rotation',\n 'sub_image',\n 'mesh_orientation',\n 'mesh_scale',\n 'material_random',\n 'id',\n 'alive',\n]);\n\nfunction validateAttributes(\n value: unknown,\n path: string,\n): Result<ParticleRendererSemanticMap | undefined, ParticleCodeSourceError> {\n if (value === undefined) return ok(undefined);\n if (!record(value)) return fail(path, 'a semantic-to-attribute object');\n for (const [semantic, reference] of Object.entries(value)) {\n if (!record(reference) || (reference.source !== 'core' && reference.source !== 'custom')) {\n return fail(`${path}.${semantic}`, \"{ source: 'core' | 'custom', name: string }\");\n }\n if (typeof reference.name !== 'string' || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(reference.name)) {\n return fail(`${path}.${semantic}.name`, 'a non-empty identifier');\n }\n if (\n reference.source === 'core' &&\n !CORE_NAMES.has(reference.name as VfxParticleCoreAttribute)\n ) {\n return fail(`${path}.${semantic}.name`, 'a VfxParticle core attribute');\n }\n const referenceExtra = extra(reference, ['source', 'name']);\n if (referenceExtra !== undefined)\n return fail(`${path}.${semantic}.${referenceExtra}`, 'source and name only');\n }\n return ok(value as ParticleRendererSemanticMap);\n}\n\nfunction validateMaterialInputs(\n value: unknown,\n path: string,\n): Result<readonly string[] | undefined, ParticleCodeSourceError> {\n if (value === undefined) return ok(undefined);\n if (\n !Array.isArray(value) ||\n value.length > 4 ||\n value.some((entry) => typeof entry !== 'string' || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(entry))\n ) {\n return fail(path, 'at most four unique particle input names');\n }\n if (new Set(value).size !== value.length) return fail(path, 'unique particle input names');\n return ok(Object.freeze([...value]));\n}\n\nfunction rendererAllowed(kind: string): readonly string[] {\n const common = [\n 'kind',\n 'material',\n 'enabled',\n 'capacity',\n 'overflow',\n 'width',\n 'attributes',\n 'materialInputs',\n ];\n switch (kind) {\n case 'billboard':\n return [...common, 'blend', 'textureSheet', 'pivot', 'softParticle', 'sorting'];\n case 'mesh':\n return [\n 'kind',\n 'material',\n 'mesh',\n 'submesh',\n 'enabled',\n 'attributes',\n 'materialInputs',\n 'lighting',\n 'castShadows',\n 'receiveShadows',\n ];\n case 'ribbon':\n return [...common, 'stripKey', 'twist', 'facing'];\n case 'trail':\n return [...common, 'historyLength', 'taper'];\n case 'beam':\n return [...common, 'endpointField', 'taper'];\n default:\n return ['kind'];\n }\n}\n\nfunction asStructureRenderer(value: Record<string, unknown>): Record<string, unknown> {\n const common = ['kind', 'material', 'enabled', 'capacity', 'overflow', 'width'] as const;\n const result: Record<string, unknown> = {};\n for (const key of common) if (value[key] !== undefined) result[key] = value[key];\n switch (value.kind) {\n case 'billboard':\n for (const key of ['blend', 'textureSheet', 'pivot', 'softParticle'] as const)\n if (value[key] !== undefined) result[key] = value[key];\n if (value.sorting === 'view-depth' || value.sorting === 'view-distance')\n result.sorting = 'back-to-front';\n else if (value.sorting === 'custom-ascending' || value.sorting === 'custom-descending')\n result.sorting = 'emitter';\n else if (value.sorting !== undefined) result.sorting = value.sorting;\n break;\n case 'mesh':\n for (const key of ['mesh', 'submesh'] as const)\n if (value[key] !== undefined) result[key] = value[key];\n break;\n case 'ribbon':\n result.stripKey = value.stripKey;\n break;\n case 'trail':\n result.historyLength = value.historyLength;\n break;\n case 'beam':\n result.endpointField = value.endpointField;\n break;\n }\n return result;\n}\n\nfunction validateRenderer(\n value: unknown,\n emitterIndex: number,\n index: number,\n): Result<ParticleRendererSourceV3, ParticleCodeSourceError> {\n const path = `emitters[${emitterIndex}].renderers[${index}]`;\n if (!record(value) || typeof value.kind !== 'string' || typeof value.material !== 'string') {\n return fail(path, 'a Program v3 renderer object');\n }\n const unknown = extra(value, rendererAllowed(value.kind));\n if (unknown !== undefined)\n return fail(`${path}.${unknown}`, 'a supported Program v3 renderer field');\n if (value.lighting !== undefined && value.lighting !== 'unlit' && value.lighting !== 'standard')\n return fail(`${path}.lighting`, 'unlit or standard');\n for (const field of ['castShadows', 'receiveShadows'] as const) {\n if (value[field] !== undefined && typeof value[field] !== 'boolean')\n return fail(`${path}.${field}`, 'a boolean');\n }\n for (const field of ['twist', 'taper'] as const) {\n if (\n value[field] !== undefined &&\n (typeof value[field] !== 'number' || !Number.isFinite(value[field]))\n )\n return fail(`${path}.${field}`, 'a finite number');\n }\n if (\n value.facing !== undefined &&\n value.facing !== 'camera' &&\n value.facing !== 'velocity' &&\n value.facing !== 'custom'\n )\n return fail(`${path}.facing`, 'camera, velocity, or custom');\n if (\n value.sorting !== undefined &&\n value.kind === 'billboard' &&\n !['none', 'view-depth', 'view-distance', 'custom-ascending', 'custom-descending'].includes(\n value.sorting as string,\n )\n )\n return fail(`${path}.sorting`, 'a Program v3 sorting mode');\n const attrs = validateAttributes(value.attributes, `${path}.attributes`);\n if (!attrs.ok) return attrs;\n if (attrs.value !== undefined) {\n for (const semantic of Object.keys(attrs.value)) {\n if (\n !PARTICLE_RENDERER_SEMANTICS[value.kind as ParticleRendererSourceV3['kind']]?.includes(\n semantic as ParticleRendererSemantic,\n )\n ) {\n return fail(\n `${path}.attributes.${semantic}`,\n 'a semantic supported by this renderer topology',\n );\n }\n }\n }\n const inputs = validateMaterialInputs(value.materialInputs, `${path}.materialInputs`);\n if (!inputs.ok) return inputs;\n return ok({\n ...(value as unknown as ParticleRendererSourceV3),\n ...(attrs.value === undefined ? {} : { attributes: attrs.value }),\n ...(inputs.value === undefined ? {} : { materialInputs: inputs.value }),\n });\n}\n\n/** Parse the single Program v3 source shape. Older source versions are rejected. */\nexport function parseParticleEffectSourceV3(\n value: unknown,\n): Result<ParticleEffectSourceV3, ParticleCodeSourceError> {\n if (!record(value)) return fail('$', 'a Program v3 particle effect source object');\n if (value.schemaVersion !== 3) {\n return err({\n code: 'vfx-source-version-unsupported',\n expected: 'ParticleEffectSource schemaVersion 3',\n hint: 'cold-cook the source with the Program v3 compiler; older versions are not executable',\n detail: { path: 'schemaVersion' },\n });\n }\n const rootExtra = extra(value, ['schemaVersion', 'emitters']);\n if (rootExtra !== undefined) return fail(rootExtra, 'schemaVersion and emitters only');\n if (!Array.isArray(value.emitters) || value.emitters.length === 0)\n return fail('emitters', 'at least one Program v3 emitter');\n const renderers = new Map<string, readonly ParticleRendererSourceV3[]>();\n for (const [emitterIndex, emitter] of value.emitters.entries()) {\n if (record(emitter) && Array.isArray(emitter.renderers)) {\n const parsed: ParticleRendererSourceV3[] = [];\n for (const [index, renderer] of emitter.renderers.entries()) {\n const result = validateRenderer(renderer, emitterIndex, index);\n if (!result.ok) return result;\n parsed.push(result.value);\n }\n renderers.set(typeof emitter.id === 'string' ? emitter.id : String(renderers.size), parsed);\n }\n }\n // Reuse the established bounds/schedule/channel/event validator after removing\n // renderer-only v3 fields. Renderer semantics have already been checked above.\n const structuralInput = {\n schemaVersion: 3,\n emitters: value.emitters.map((emitter) => {\n if (!record(emitter)) return emitter;\n return {\n ...emitter,\n renderers: Array.isArray(emitter.renderers)\n ? emitter.renderers.map((renderer) =>\n record(renderer) ? asStructureRenderer(renderer) : renderer,\n )\n : emitter.renderers,\n };\n }),\n };\n const parsed = parseParticleEffectSourceStructure(structuralInput);\n if (!parsed.ok) return parsed;\n const emitters: ParticleEmitterSourceV3[] = parsed.value.emitters.map((emitter) => ({\n ...emitter,\n renderers: renderers.get(emitter.id) ?? [],\n }));\n return ok(Object.freeze({ schemaVersion: 3, emitters: Object.freeze(emitters) }));\n}\n\nexport function defineParticleEffectSourceV3<T extends ParticleEffectSourceV3>(source: T): T {\n const parsed = parseParticleEffectSourceV3(source);\n if (!parsed.ok) throw new TypeError(`${parsed.error.code}: ${parsed.error.expected}`);\n return source;\n}\n","import { err, ok, type Result } from '@forgeax/engine-types';\n\nexport type VfxDataInterfaceKind = keyof VfxDataInterfaceBindingTypeByKind;\n\nexport type VfxDataInterfaceToken = `vfx:${VfxDataInterfaceKind}`;\n\nexport type VfxDataInterfaceBindingType = VfxDataInterfaceBindingTypeByKind[VfxDataInterfaceKind];\n\nexport type VfxDataInterfaceResourceKind = 'buffer' | 'texture-view' | 'sampler';\n\ntype VfxDataInterfaceBindingTypeByKind = {\n readonly camera: 'uniform';\n readonly 'scene-depth': 'sampled-depth';\n readonly noise: 'sampled-float';\n};\n\nexport type VfxDataInterfaceLifetime = 'generation';\n\nexport interface VfxDataInterfaceRequirement {\n readonly token: VfxDataInterfaceToken;\n readonly kind: VfxDataInterfaceKind;\n readonly binding: number;\n readonly bindingType: VfxDataInterfaceBindingType;\n readonly lifetime: VfxDataInterfaceLifetime;\n /** Scene-depth composition is intentionally proven only for single-sample targets. */\n readonly sampleCount?: 1;\n}\n\nexport interface VfxDataInterfaceResource {\n readonly token: VfxDataInterfaceToken;\n readonly kind: VfxDataInterfaceKind;\n readonly bindingType: VfxDataInterfaceBindingType;\n readonly generation: number;\n readonly sampleCount?: number;\n /**\n * Provider-owned opaque resource. Render owners refine this to their typed\n * prepared-resource reference; VFX never inspects a backend handle.\n */\n readonly resource?: {\n readonly kind: 'buffer' | 'texture-view' | 'sampler';\n readonly value: unknown;\n /** Required when a provider supplies an external buffer to a compute bind group. */\n readonly size?: number;\n readonly usage?: 'uniform' | 'storage';\n };\n}\n\nexport interface VfxDataInterfaceErrorDetail {\n readonly token: VfxDataInterfaceToken;\n readonly providerId?: string;\n readonly expectedGeneration?: number;\n readonly actualGeneration?: number;\n readonly expectedBindingType?: VfxDataInterfaceBindingType;\n readonly actualBindingType?: VfxDataInterfaceBindingType;\n readonly expectedResourceKind?: VfxDataInterfaceResourceKind;\n readonly actualResourceKind?: VfxDataInterfaceResourceKind;\n}\n\nexport interface VfxDataInterfaceError {\n readonly code:\n | 'vfx-data-interface-missing'\n | 'vfx-data-interface-wrong-type'\n | 'vfx-data-interface-stale'\n | 'vfx-data-interface-duplicate';\n readonly expected: string;\n readonly hint: string;\n readonly detail: VfxDataInterfaceErrorDetail;\n}\n\nexport type VfxDataInterfaceProvider<K extends VfxDataInterfaceKind = VfxDataInterfaceKind> = {\n readonly id: string;\n readonly token: `vfx:${K}`;\n readonly kind: K;\n readonly bindingType: VfxDataInterfaceBindingTypeByKind[K];\n readonly provide: (generation: number) => Result<VfxDataInterfaceResource, VfxDataInterfaceError>;\n};\n\nexport interface VfxDataInterfaceResolution {\n readonly generation: number;\n readonly readiness: 'ready';\n readonly resources: readonly VfxDataInterfaceResource[];\n}\n\nfunction expectedResourceKind(kind: VfxDataInterfaceKind): VfxDataInterfaceResourceKind {\n switch (kind) {\n case 'camera':\n return 'buffer';\n case 'scene-depth':\n case 'noise':\n return 'texture-view';\n }\n}\n\nfunction failure(\n code: VfxDataInterfaceError['code'],\n requirement: VfxDataInterfaceRequirement,\n expected: string,\n hint: string,\n detail: Omit<VfxDataInterfaceErrorDetail, 'token'> = {},\n): VfxDataInterfaceError {\n return { code, expected, hint, detail: { token: requirement.token, ...detail } };\n}\n\nexport function resolveVfxDataInterfaces(\n requirements: readonly VfxDataInterfaceRequirement[],\n providers: readonly VfxDataInterfaceProvider[],\n generation: number,\n): Result<VfxDataInterfaceResolution, VfxDataInterfaceError> {\n const byToken = new Map<VfxDataInterfaceToken, VfxDataInterfaceProvider>();\n for (const provider of providers) {\n const prior = byToken.get(provider.token);\n if (prior !== undefined) {\n const requirement = requirements.find((entry) => entry.token === provider.token) ?? {\n token: provider.token,\n kind: provider.kind,\n binding: -1,\n bindingType: provider.bindingType,\n lifetime: 'generation',\n };\n return err(\n failure(\n 'vfx-data-interface-duplicate',\n requirement,\n 'at most one provider for each reflected Data Interface token',\n `remove duplicate providers ${prior.id} and ${provider.id} and retry`,\n { providerId: provider.id },\n ),\n );\n }\n byToken.set(provider.token, provider);\n }\n\n const resources: VfxDataInterfaceResource[] = [];\n for (const requirement of requirements) {\n const provider = byToken.get(requirement.token);\n if (provider === undefined) {\n return err(\n failure(\n 'vfx-data-interface-missing',\n requirement,\n `a registered ${requirement.kind} provider for ${requirement.token}`,\n `register ${requirement.token} for generation ${generation} before starting the effect`,\n ),\n );\n }\n if (provider.kind !== requirement.kind || provider.bindingType !== requirement.bindingType) {\n return err(\n failure(\n 'vfx-data-interface-wrong-type',\n requirement,\n `${requirement.kind} with ${requirement.bindingType} binding semantics`,\n `replace provider ${provider.id} with a ${requirement.token} provider matching reflection`,\n {\n providerId: provider.id,\n expectedBindingType: requirement.bindingType,\n actualBindingType: provider.bindingType,\n },\n ),\n );\n }\n const provided = provider.provide(generation);\n if (!provided.ok) return provided;\n const resource = provided.value;\n if (resource.token !== requirement.token || resource.kind !== requirement.kind) {\n return err(\n failure(\n 'vfx-data-interface-wrong-type',\n requirement,\n `${requirement.kind} resource for ${requirement.token}`,\n `repair provider ${provider.id} so its resource matches its reflected token`,\n { providerId: provider.id },\n ),\n );\n }\n if (resource.bindingType !== requirement.bindingType) {\n return err(\n failure(\n 'vfx-data-interface-wrong-type',\n requirement,\n `resource binding type ${requirement.bindingType}`,\n `repair provider ${provider.id} resource binding metadata`,\n {\n providerId: provider.id,\n expectedBindingType: requirement.bindingType,\n actualBindingType: resource.bindingType,\n },\n ),\n );\n }\n const expectedKind = expectedResourceKind(requirement.kind);\n if (resource.resource === undefined) {\n return err(\n failure(\n 'vfx-data-interface-missing',\n requirement,\n `${requirement.kind} backed by a resident ${expectedKind} resource`,\n `refresh provider ${provider.id} with a generation-owned resource before dispatch`,\n { providerId: provider.id, expectedResourceKind: expectedKind },\n ),\n );\n }\n if (resource.resource.kind !== expectedKind) {\n return err(\n failure(\n 'vfx-data-interface-wrong-type',\n requirement,\n `${requirement.kind} backed by a ${expectedKind} resource`,\n `repair provider ${provider.id} so its opaque resource matches the reflected binding kind`,\n {\n providerId: provider.id,\n expectedResourceKind: expectedKind,\n actualResourceKind: resource.resource.kind,\n },\n ),\n );\n }\n if (requirement.sampleCount !== undefined && resource.sampleCount !== requirement.sampleCount) {\n return err(\n failure(\n 'vfx-data-interface-wrong-type',\n requirement,\n `a scene-depth resource with sampleCount=${requirement.sampleCount}`,\n `provide a single-sample scene depth target for ${provider.id}; MSAA resolve is not implicit`,\n { providerId: provider.id },\n ),\n );\n }\n if (resource.generation !== generation) {\n return err(\n failure(\n 'vfx-data-interface-stale',\n requirement,\n `a resource from generation ${generation}`,\n `refresh provider ${provider.id} for generation ${generation} before rendering`,\n {\n providerId: provider.id,\n expectedGeneration: generation,\n actualGeneration: resource.generation,\n },\n ),\n );\n }\n resources.push(resource);\n }\n return ok({ generation, readiness: 'ready', resources: Object.freeze(resources) });\n}\n","import { err, ok, type Result } from '@forgeax/engine-types';\nimport type { VfxDataInterfaceRequirement } from './data-interface.js';\nimport type { VfxCustomLayout, VfxParticleCoreLayout } from './particle-layout.js';\n\nexport type VfxValue = number | readonly number[];\nexport type VfxValueMap = Readonly<Record<string, VfxValue>>;\n\nexport interface VfxReflectedField {\n readonly name: string;\n readonly type: VfxValueType;\n readonly offset: number;\n readonly size: number;\n readonly alignment: number;\n readonly defaultValue?: VfxValue;\n}\n\nexport interface VfxReflectedStruct {\n readonly name: string;\n readonly fields: readonly VfxReflectedField[];\n readonly size: number;\n readonly alignment: number;\n}\n\nexport interface VfxEffectReflection {\n /** The single executable particle data ABI. */\n readonly version: 3;\n readonly parameters: VfxReflectedStruct;\n readonly custom: VfxReflectedStruct;\n readonly core: VfxParticleCoreLayout;\n readonly customLayout: VfxCustomLayout;\n readonly dataInterfaces?: readonly VfxDataInterfaceRequirement[];\n readonly fingerprint: string;\n}\n\nexport interface VfxEffectContractErrorDetail {\n readonly path: string;\n readonly actual?: unknown;\n}\n\nexport interface VfxEffectContractError {\n readonly code:\n | 'vfx-value-unknown-field'\n | 'vfx-value-type-mismatch'\n | 'vfx-value-not-finite'\n | 'vfx-reflection-invalid';\n readonly expected: string;\n readonly hint: string;\n readonly detail: VfxEffectContractErrorDetail;\n}\n\nexport interface VfxEffectContract<Values extends VfxValueMap = VfxValueMap> {\n readonly reflection: VfxEffectReflection;\n readonly fingerprint: string;\n readonly packedSize: number;\n /** Bytes in the effect-instance Parameters uniform. */\n readonly parameterSize: number;\n /** Bytes in one persistent per-particle Custom record. */\n readonly customStride: number;\n readonly defaults: Values;\n createValues(initial?: Partial<Values>): Result<Values, VfxEffectContractError>;\n validateValues(values: VfxValueMap): Result<Values, VfxEffectContractError>;\n pack(values: Values): Result<Uint8Array, VfxEffectContractError>;\n packParameters(values: Values): Result<Uint8Array, VfxEffectContractError>;\n packCustom(values: VfxValueMap): Result<Uint8Array, VfxEffectContractError>;\n}\n\nconst VECTOR_LENGTH = {\n f32: 1,\n i32: 1,\n u32: 1,\n 'vec2<f32>': 2,\n 'vec3<f32>': 3,\n 'vec4<f32>': 4,\n};\n\nexport type VfxValueType = keyof typeof VECTOR_LENGTH;\n\nfunction fieldList(\n reflection: VfxEffectReflection,\n includeCustom = false,\n): readonly VfxReflectedField[] {\n return includeCustom\n ? [...reflection.parameters.fields, ...reflection.custom.fields]\n : reflection.parameters.fields;\n}\n\nfunction zeroValue(type: VfxValueType): VfxValue {\n const length = VECTOR_LENGTH[type];\n return length === 1 ? 0 : Array.from({ length }, () => 0);\n}\n\nfunction valueMatches(type: VfxValueType, value: unknown): boolean {\n const length = VECTOR_LENGTH[type];\n if (length === 1) return typeof value === 'number' && Number.isFinite(value);\n return (\n Array.isArray(value) &&\n value.length === length &&\n value.every((component) => typeof component === 'number' && Number.isFinite(component))\n );\n}\n\nfunction fail(\n code: VfxEffectContractError['code'],\n path: string,\n expected: string,\n hint: string,\n actual?: unknown,\n): Result<never, VfxEffectContractError> {\n return err({\n code,\n expected,\n hint,\n detail: actual === undefined ? { path } : { path, actual },\n });\n}\n\nfunction validateReflection(reflection: VfxEffectReflection): Result<true, VfxEffectContractError> {\n if (\n reflection.version !== 3 ||\n typeof reflection.fingerprint !== 'string' ||\n !reflection.fingerprint.startsWith('sha256:')\n ) {\n return fail(\n 'vfx-reflection-invalid',\n 'reflection',\n 'a version 3 reflection with a sha256 fingerprint',\n 'recook the effect with the current VFX compiler',\n );\n }\n if (\n reflection.core.name !== 'VfxParticle' ||\n reflection.core.stride !== 112 ||\n reflection.core.fields.length === 0 ||\n reflection.customLayout.name !== 'VfxCustom' ||\n reflection.customLayout.stride < 0 ||\n reflection.customLayout.lanes < 0\n ) {\n return fail(\n 'vfx-reflection-invalid',\n 'reflection.core',\n 'Program v3 Core and Custom layouts derived from the particle schema',\n 'recook the effect with the current VFX compiler',\n );\n }\n const names = new Set<string>();\n for (const field of fieldList(reflection)) {\n if (names.has(field.name)) {\n return fail(\n 'vfx-reflection-invalid',\n field.name,\n 'unique field names across parameters and custom data',\n 'rename the duplicate WGSL field and recook',\n );\n }\n names.add(field.name);\n }\n return ok(true);\n}\n\nfunction defaultsFor<Values extends VfxValueMap>(reflection: VfxEffectReflection): Values {\n const defaults: Record<string, VfxValue> = {};\n for (const field of fieldList(reflection)) {\n defaults[field.name] =\n field.defaultValue === undefined ? zeroValue(field.type) : field.defaultValue;\n }\n return Object.freeze(defaults) as Values;\n}\n\nfunction validateMap<Values extends VfxValueMap>(\n reflection: VfxEffectReflection,\n values: VfxValueMap,\n): Result<Values, VfxEffectContractError> {\n return validateMapAgainstFields<Values>(fieldList(reflection), values);\n}\n\nfunction validateMapAgainstFields<Values extends VfxValueMap>(\n reflectedFields: readonly VfxReflectedField[],\n values: VfxValueMap,\n): Result<Values, VfxEffectContractError> {\n const fields = new Map(reflectedFields.map((field) => [field.name, field]));\n for (const name of Object.keys(values)) {\n const field = fields.get(name);\n if (field === undefined) {\n return fail(\n 'vfx-value-unknown-field',\n name,\n 'a field declared by the selected VFX data scope',\n `remove ${name} or declare it in the authored WGSL struct`,\n values[name],\n );\n }\n if (!valueMatches(field.type, values[name])) {\n return fail(\n 'vfx-value-type-mismatch',\n name,\n field.type,\n `provide ${name} as ${field.type}`,\n values[name],\n );\n }\n }\n return ok(Object.freeze({ ...values }) as Values);\n}\n\nfunction writeValue(view: DataView, offset: number, type: VfxValueType, value: VfxValue): void {\n const values = typeof value === 'number' ? [value] : value;\n for (let index = 0; index < values.length; index += 1) {\n const component = values[index] ?? 0;\n if (type === 'i32') view.setInt32(offset + index * 4, component, true);\n else if (type === 'u32') view.setUint32(offset + index * 4, component, true);\n else view.setFloat32(offset + index * 4, component, true);\n }\n}\n\nexport function createVfxEffectContract<Values extends VfxValueMap = VfxValueMap>(\n reflection: VfxEffectReflection,\n): VfxEffectContract<Values> {\n const checked = validateReflection(reflection);\n if (!checked.ok) throw new TypeError(checked.error.hint);\n const defaults = defaultsFor<Values>(reflection);\n const customBase = reflection.parameters.size;\n const parameterSize = reflection.parameters.size;\n const customStride = reflection.customLayout.stride;\n const packedSize = customBase;\n const packFields = (\n values: VfxValueMap,\n selected: readonly VfxReflectedField[],\n size: number,\n baseOffset: number,\n ): Result<Uint8Array, VfxEffectContractError> => {\n const checkedValues = validateMapAgainstFields<Values>(selected, values);\n if (!checkedValues.ok) return checkedValues;\n const bytes = new Uint8Array(size);\n const view = new DataView(bytes.buffer);\n for (const field of selected) {\n const value = checkedValues.value[field.name];\n if (value === undefined) continue;\n writeValue(view, baseOffset + field.offset, field.type, value);\n }\n return ok(bytes);\n };\n return {\n reflection,\n fingerprint: reflection.fingerprint,\n packedSize,\n parameterSize: reflection.parameters.size,\n customStride,\n defaults,\n createValues(initial = {} as Partial<Values>) {\n const merged = { ...defaults, ...initial };\n return validateMap<Values>(reflection, merged);\n },\n validateValues(values) {\n return validateMap<Values>(reflection, values);\n },\n pack(values) {\n return packFields(values, reflection.parameters.fields, parameterSize, 0);\n },\n packParameters(values) {\n return packFields(values, reflection.parameters.fields, parameterSize, 0);\n },\n packCustom(values) {\n return packFields(values, reflection.custom.fields, customStride, 0);\n },\n };\n}\n\nexport function validateVfxEffectValues(\n reflection: VfxEffectReflection,\n values: VfxValueMap,\n): Result<VfxValueMap, VfxEffectContractError> {\n return validateMap(reflection, values);\n}\n","import type {\n BindGroupLayoutDescriptor,\n MaterialParticleInput,\n ParticleEffectAssetV3,\n ParticleEffectProgramEmitter,\n ParticleEffectProgramV3,\n} from '@forgeax/engine-types';\nimport type {\n ParticleChannelSource,\n ParticleEventSource,\n ParticleStageDomain,\n ParticleStageResourceAccess,\n} from './code-source.js';\nimport type {\n ParticleEmitterSourceV3,\n ParticleRendererSemanticMap,\n ParticleRendererSortingV3,\n ParticleRendererSourceV3,\n} from './code-source-v3.js';\nimport type { VfxDataInterfaceRequirement } from './data-interface.js';\nimport type { VfxEffectReflection } from './effect-contract.js';\n\n/** The only cooked GPU program ABI exposed by the runtime. */\nexport const VFX_GPU_PROGRAM_FORMAT = 'forgeax-vfx-program-3' as const;\nexport const VFX_GPU_PROGRAM_FORMAT_V3 = VFX_GPU_PROGRAM_FORMAT;\nexport const VFX_GPU_PROGRAM_ARTIFACT_KEY = 'particle-effect/program.json' as const;\n\nexport interface VfxGpuStageReflection {\n readonly id: string;\n readonly entry: string;\n readonly entryPoint: string;\n readonly domain: ParticleStageDomain;\n readonly resources: readonly {\n readonly name: string;\n readonly access: ParticleStageResourceAccess;\n }[];\n readonly dependsOn: readonly string[];\n readonly iterationBudget: number;\n}\n\n/** Reflection of one executable renderer projection. */\nexport interface VfxGpuRendererReflectionV3 {\n readonly topology: ParticleRendererSourceV3['kind'];\n readonly resource: string;\n readonly capacity: number;\n readonly overflow: 'drop-newest' | 'drop-oldest';\n readonly enabled: boolean;\n readonly shaderInputs: readonly string[];\n readonly attributes: ParticleRendererSemanticMap;\n readonly materialInputs: readonly string[];\n readonly materialInputDefinitions?: readonly MaterialParticleInput[];\n readonly textureSheet?: {\n readonly columns: number;\n readonly rows: number;\n readonly frameRate: number;\n readonly frameCount: number;\n };\n readonly pivot?: readonly [number, number];\n readonly softParticle?: { readonly fadeDistance: number; readonly requiresDepth: true };\n readonly sorting?: ParticleRendererSortingV3;\n readonly stripKey?: 'alive-index';\n readonly historyLength?: number;\n readonly endpointField?: 'velocity';\n readonly lighting?: 'unlit' | 'standard';\n readonly castShadows: boolean;\n readonly receiveShadows: boolean;\n}\n\nexport interface VfxGpuProgramReflectionV3 {\n readonly hooks: readonly ['vfx_spawn', 'vfx_update'];\n readonly imports: readonly string[];\n readonly resources: readonly string[];\n readonly entryPoints: readonly string[];\n readonly bindings: readonly BindGroupLayoutDescriptor[];\n readonly layout: VfxEffectReflection;\n readonly dataInterfaces: readonly VfxDataInterfaceRequirement[];\n readonly eventChannels: readonly ParticleChannelSource[];\n readonly events: readonly ParticleEventSource[];\n readonly eventEntryPoint: 'forgeax_vfx_event_main';\n readonly stages: readonly VfxGpuStageReflection[];\n readonly renderers: readonly VfxGpuRendererReflectionV3[];\n}\n\nexport interface VfxGpuEmitterProgramV3\n extends Omit<ParticleEffectProgramEmitter, 'renderers' | 'reflection'> {\n readonly id: string;\n readonly module: string;\n readonly capacity: number;\n readonly backend: ParticleEmitterSourceV3['backend'];\n readonly space: ParticleEmitterSourceV3['space'];\n readonly schedule: ParticleEmitterSourceV3['schedule'];\n readonly bounds: ParticleEmitterSourceV3['bounds'];\n readonly renderers: readonly ParticleRendererSourceV3[];\n readonly channels?: readonly ParticleChannelSource[];\n readonly events?: readonly ParticleEventSource[];\n readonly simulationWhenCulled: NonNullable<ParticleEmitterSourceV3['simulationWhenCulled']>;\n readonly wgsl: string;\n readonly reflection: VfxGpuProgramReflectionV3;\n}\n\nexport interface VfxGpuProgramV3 extends Omit<ParticleEffectProgramV3, 'emitters'> {\n readonly format: typeof VFX_GPU_PROGRAM_FORMAT;\n readonly fingerprint: string;\n readonly emitters: readonly VfxGpuEmitterProgramV3[];\n}\n\nexport interface VfxGpuEffectAssetV3 extends Omit<ParticleEffectAssetV3, 'program'> {\n readonly guid: string;\n readonly kind: 'particle-effect';\n readonly schemaVersion: 3;\n readonly programFingerprint: string;\n readonly emitters: readonly { readonly id: string; readonly capacity: number }[];\n readonly program: VfxGpuProgramV3;\n}\n\n/** Public names point at the same one-cut Program v3 shapes. */\nexport type VfxGpuRendererReflection = VfxGpuRendererReflectionV3;\nexport type VfxGpuProgramReflection = VfxGpuProgramReflectionV3;\nexport type VfxGpuEmitterProgram = VfxGpuEmitterProgramV3;\nexport type VfxGpuProgram = VfxGpuProgramV3;\nexport type VfxGpuEffectAsset = VfxGpuEffectAssetV3;\nexport type VfxGpuEmitterProgramAny = VfxGpuEmitterProgramV3;\nexport type VfxGpuEffectAssetAny = VfxGpuEffectAssetV3;\n","import type {\n AssetRegistry as LegacyAssetRegistry,\n RuntimeAssetRegistry,\n} from '@forgeax/engine-assets-runtime';\nimport type {\n AssetDecoderContribution,\n AssetKind,\n AssetLoadError,\n LoadContext,\n Result,\n} from '@forgeax/engine-types';\nimport { err, ok } from '@forgeax/engine-types';\nimport {\n VFX_GPU_PROGRAM_ARTIFACT_KEY,\n VFX_GPU_PROGRAM_FORMAT_V3,\n type VfxGpuEffectAssetAny,\n type VfxGpuEmitterProgramV3,\n} from './gpu-program.js';\n\nexport interface VfxGpuAssetError {\n readonly code:\n | 'vfx-asset-version-unsupported'\n | 'vfx-asset-v3-invalid'\n | 'vfx-asset-v3-program-missing'\n | 'vfx-asset-v3-fingerprint-mismatch';\n readonly expected: string;\n readonly hint: string;\n readonly detail: { readonly guid: string; readonly path: string };\n}\n\ninterface PackLoaderInput {\n readonly guid: string;\n readonly kind: string;\n readonly payload: Record<string, unknown>;\n readonly artifacts: Readonly<\n Record<\n string,\n {\n readonly descriptor: { readonly path: string; readonly mediaType: string };\n readonly bytes: Uint8Array;\n }\n >\n >;\n}\n\nfunction failure(\n code: VfxGpuAssetError['code'],\n guid: string,\n path: string,\n expected: string,\n hint: string,\n): Result<never, VfxGpuAssetError> {\n return err({ code, expected, hint, detail: { guid, path } });\n}\n\nfunction record(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction hex(bytes: ArrayBuffer): string {\n return [...new Uint8Array(bytes)].map((value) => value.toString(16).padStart(2, '0')).join('');\n}\n\nasync function fingerprint(bytes: Uint8Array): Promise<string> {\n const source = bytes.buffer.slice(\n bytes.byteOffset,\n bytes.byteOffset + bytes.byteLength,\n ) as ArrayBuffer;\n return `sha256:${hex(await globalThis.crypto.subtle.digest('SHA-256', source))}`;\n}\n\nfunction validReflectionLayout(value: unknown): boolean {\n if (value === undefined) return true;\n if (!record(value) || value.version !== 3) return false;\n if (!record(value.parameters) || !Array.isArray(value.parameters.fields)) return false;\n if (!record(value.custom) || !Array.isArray(value.custom.fields)) return false;\n if (value.version === 3) {\n if (!record(value.core) || value.core.name !== 'VfxParticle' || value.core.stride !== 112) {\n return false;\n }\n if (!record(value.customLayout) || value.customLayout.name !== 'VfxCustom') return false;\n }\n return typeof value.fingerprint === 'string' && value.fingerprint.startsWith('sha256:');\n}\n\nfunction stableLayouts(emitters: readonly VfxGpuEmitterProgramV3[]): boolean {\n const fingerprints = emitters\n .map((emitter) => emitter.reflection.layout?.fingerprint)\n .filter((fingerprint): fingerprint is string => fingerprint !== undefined);\n return fingerprints.every((fingerprint) => fingerprint === fingerprints[0]);\n}\n\nfunction validEmitter(value: unknown): boolean {\n const reflection = record(value) && record(value.reflection) ? value.reflection : undefined;\n const layout = reflection !== undefined ? reflection.layout : undefined;\n return (\n record(value) &&\n typeof value.id === 'string' &&\n typeof value.module === 'string' &&\n value.module.length > 0 &&\n Number.isInteger(value.capacity) &&\n (value.capacity as number) > 0 &&\n record(value.backend) &&\n value.backend.required === 'gpu' &&\n Object.keys(value.backend).length === 1 &&\n typeof value.wgsl === 'string' &&\n value.wgsl.length > 0 &&\n record(value.reflection) &&\n validReflectionLayout(layout) &&\n Array.isArray(value.reflection.entryPoints) &&\n value.reflection.entryPoints.includes('forgeax_vfx_spawn_main') &&\n value.reflection.entryPoints.includes('forgeax_vfx_compact_main') &&\n value.reflection.entryPoints.includes('forgeax_vfx_billboard_main') &&\n value.reflection.entryPoints.includes('forgeax_vfx_mesh_main') &&\n value.reflection.entryPoints.includes('forgeax_vfx_ribbon_main') &&\n value.reflection.entryPoints.includes('forgeax_vfx_trail_main') &&\n value.reflection.entryPoints.includes('forgeax_vfx_beam_main') &&\n layout !== undefined &&\n record(layout) &&\n Array.isArray(reflection?.bindings) &&\n Array.isArray(reflection?.dataInterfaces) &&\n Array.isArray(reflection?.renderers) &&\n Array.isArray(reflection?.resources)\n );\n}\n\nexport const vfxGpuEffectPackLoader = {\n kind: 'particle-effect',\n async load(\n input: PackLoaderInput,\n _context: LoadContext,\n ): Promise<Result<VfxGpuEffectAssetAny, VfxGpuAssetError>> {\n const schemaVersion = input.payload.schemaVersion;\n if (schemaVersion !== 3) {\n return failure(\n 'vfx-asset-version-unsupported',\n input.guid,\n 'schemaVersion',\n 'schemaVersion 3 / forgeax-vfx-program-3',\n 'cold-cook the older source and publish a Program v3 payload; older versions are not executable',\n );\n }\n const invalidCode = 'vfx-asset-v3-invalid' as const;\n const missingCode = 'vfx-asset-v3-program-missing' as const;\n const fingerprintCode = 'vfx-asset-v3-fingerprint-mismatch' as const;\n const expectedFormat = VFX_GPU_PROGRAM_FORMAT_V3;\n if (\n input.payload.kind !== 'particle-effect' ||\n !Array.isArray(input.payload.emitters) ||\n typeof input.payload.programFingerprint !== 'string' ||\n !record(input.payload.program)\n ) {\n return failure(\n invalidCode,\n input.guid,\n 'payload',\n 'a schemaVersion 3 particle payload with its complete Program v3 and fingerprint',\n 'cold-cook the source with the current VFX compiler and retry the load',\n );\n }\n const artifact = input.artifacts[VFX_GPU_PROGRAM_ARTIFACT_KEY];\n if (artifact === undefined) {\n return failure(\n missingCode,\n input.guid,\n VFX_GPU_PROGRAM_ARTIFACT_KEY,\n 'the asset-local cooked VFX program',\n 'recook the particle effect and retry the load',\n );\n }\n let decoded: unknown;\n try {\n decoded = JSON.parse(new TextDecoder().decode(artifact.bytes));\n } catch {\n return failure(\n invalidCode,\n input.guid,\n VFX_GPU_PROGRAM_ARTIFACT_KEY,\n 'canonical JSON program bytes',\n 'recook the particle effect and retry the load',\n );\n }\n if (\n !record(decoded) ||\n decoded.format !== expectedFormat ||\n !Array.isArray(decoded.emitters) ||\n !decoded.emitters.every((emitter) => validEmitter(emitter)) ||\n !stableLayouts(decoded.emitters as VfxGpuEmitterProgramV3[])\n ) {\n return failure(\n invalidCode,\n input.guid,\n VFX_GPU_PROGRAM_ARTIFACT_KEY,\n `a ${expectedFormat} managed GPU program`,\n 'recook with the current VFX compiler ABI',\n );\n }\n const decodedEmitters = decoded.emitters as VfxGpuEmitterProgramV3[];\n if (\n input.payload.program.format !== expectedFormat ||\n input.payload.program.fingerprint !== input.payload.programFingerprint ||\n !Array.isArray(input.payload.program.emitters)\n ) {\n return failure(\n invalidCode,\n input.guid,\n 'payload.program',\n 'the complete canonical program matching payload.programFingerprint',\n 'recook the particle effect atomically',\n );\n }\n const actualFingerprint = await fingerprint(artifact.bytes);\n if (actualFingerprint !== input.payload.programFingerprint) {\n return failure(\n fingerprintCode,\n input.guid,\n 'payload.programFingerprint',\n 'payload and program artifact fingerprints to match',\n 'cold-cook the particle asset so payload and artifact publish atomically',\n );\n }\n const emitters = input.payload.emitters.map((value) => {\n if (!record(value) || typeof value.id !== 'string' || !Number.isInteger(value.capacity)) {\n return undefined;\n }\n return { id: value.id, capacity: value.capacity as number };\n });\n if (\n emitters.some((value) => value === undefined) ||\n emitters.length !== decodedEmitters.length ||\n emitters.some(\n (value, index) =>\n value?.id !== decodedEmitters[index]?.id ||\n value?.capacity !== decodedEmitters[index]?.capacity,\n )\n ) {\n return failure(\n invalidCode,\n input.guid,\n 'payload.emitters',\n 'payload emitter identities and capacities to match the program',\n 'recook the particle effect atomically',\n );\n }\n return ok(\n Object.freeze({\n guid: input.guid,\n kind: 'particle-effect' as const,\n schemaVersion: 3,\n programFingerprint: actualFingerprint,\n emitters: Object.freeze(emitters as { id: string; capacity: number }[]),\n program: Object.freeze({\n format: expectedFormat,\n fingerprint: actualFingerprint,\n emitters: Object.freeze(decodedEmitters),\n }),\n }) as VfxGpuEffectAssetAny,\n );\n },\n};\n\n/** VFX owner decoder contribution for the core registry's typed map. */\nexport const vfxGpuEffectContribution: AssetDecoderContribution<\n VfxGpuEffectAssetAny,\n 'particle-effect'\n> = {\n kind: { kind: 'particle-effect' } as AssetKind<VfxGpuEffectAssetAny, 'particle-effect'>,\n consumer: 'VfxGpuRuntime',\n decoder: {\n async decode({ envelope, artifacts }) {\n const descriptor = envelope.artifacts[VFX_GPU_PROGRAM_ARTIFACT_KEY];\n const bytes = descriptor === undefined ? undefined : await artifacts.read(descriptor);\n if (bytes !== undefined && !bytes.ok) return bytes;\n const result = await vfxGpuEffectPackLoader.load(\n {\n guid: envelope.guid,\n kind: envelope.kind,\n payload: envelope.payload as unknown as Record<string, unknown>,\n artifacts:\n bytes === undefined || descriptor === undefined\n ? {}\n : {\n [VFX_GPU_PROGRAM_ARTIFACT_KEY]: {\n descriptor: { path: descriptor.path, mediaType: descriptor.mediaType },\n bytes: bytes.value,\n },\n },\n },\n {} as LoadContext,\n );\n if (result.ok) return result;\n const error: AssetLoadError = {\n code: 'asset-package-invalid',\n expected: result.error.expected,\n hint: result.error.hint,\n detail: { guid: envelope.guid, reason: result.error.code },\n };\n return err(error);\n },\n },\n};\n\nexport async function loadVfxGpuEffect(\n registry: LegacyAssetRegistry | RuntimeAssetRegistry,\n guid: string,\n): Promise<Result<VfxGpuEffectAssetAny, unknown>> {\n if ('load' in registry) {\n return registry.load(guid, vfxGpuEffectContribution.kind);\n }\n let parsed: ReturnType<LegacyAssetRegistry['parseGuid']>;\n try {\n parsed = registry.parseGuid(guid);\n } catch (error) {\n return err(error);\n }\n return registry.loadByGuid<VfxGpuEffectAssetAny>(parsed);\n}\n","import { err, ok, type Result } from '@forgeax/engine-types';\nimport type { ParticleChannelSource } from './code-source.js';\nimport type {\n VfxEffectContract,\n VfxEffectContractError,\n VfxValue,\n VfxValueMap,\n VfxValueType,\n} from './effect-contract.js';\n\nexport interface VfxChannelPayload {\n readonly position: readonly [number, number, number];\n readonly strength: number;\n}\n\nexport interface VfxChannelInput {\n readonly channel: string;\n readonly payload: VfxChannelPayload;\n readonly sequence: number;\n readonly tick?: number;\n}\n\nexport interface VfxChannelCounters {\n readonly queued: number;\n readonly produced: number;\n readonly consumed: number;\n readonly dropped: number;\n readonly overflow: number;\n readonly fanOut: number;\n readonly recursionDepth: number;\n readonly lastSequence: number;\n}\n\nexport interface VfxInstanceParent<Values extends VfxValueMap> {\n readonly fingerprint: string;\n readonly defaults: Values;\n}\n\nexport interface VfxInstanceOptions<Values extends VfxValueMap> {\n readonly parent?: VfxInstanceParent<Values>;\n readonly initialValues?: Partial<Values>;\n readonly channels?: readonly ParticleChannelSource[];\n}\n\nexport interface VfxInstanceCommitOptions {\n readonly seed: number;\n readonly tick: number;\n}\n\nexport interface VfxReplayInput<Values extends VfxValueMap> {\n readonly seed: number;\n readonly tick: number;\n readonly generation: number;\n readonly sequence: number;\n readonly fingerprint: string;\n readonly payload: Uint8Array;\n readonly values: Values;\n readonly channelInputs: readonly VfxChannelInput[];\n readonly droppedCount: number;\n}\n\nexport interface VfxInstanceCommit<Values extends VfxValueMap> {\n readonly seed: number;\n readonly tick: number;\n readonly generation: number;\n readonly sequence: number;\n readonly values: Values;\n readonly parameterBlock: Uint8Array;\n readonly canonicalPayload: Uint8Array;\n readonly replayInput: VfxReplayInput<Values>;\n readonly patchCount: number;\n readonly channelInputs: readonly VfxChannelInput[];\n readonly droppedCount: number;\n}\n\nexport interface VfxInstanceError {\n readonly code:\n | VfxEffectContractError['code']\n | 'vfx-instance-parent-mismatch'\n | 'vfx-instance-replay-mismatch'\n | 'vfx-channel-invalid'\n | 'vfx-channel-overflow';\n readonly expected: string;\n readonly hint: string;\n readonly detail: { readonly path: string; readonly actual?: unknown };\n}\n\ntype InstanceResult<T> = Result<T, VfxInstanceError>;\n\nfunction failure(\n code: VfxInstanceError['code'],\n path: string,\n expected: string,\n hint: string,\n actual?: unknown,\n): InstanceResult<never> {\n return err({\n code,\n expected,\n hint,\n detail: actual === undefined ? { path } : { path, actual },\n });\n}\n\nfunction allFields<Values extends VfxValueMap>(\n contract: VfxEffectContract<Values>,\n): readonly { readonly name: string; readonly type: VfxValueType }[] {\n return [...contract.reflection.parameters.fields, ...contract.reflection.custom.fields];\n}\n\nfunction normalizeValue(type: VfxValueType, value: VfxValue): VfxValue {\n const normalize = (component: number): number => {\n if (type === 'i32' || type === 'u32') return Math.trunc(component);\n return Math.fround(component);\n };\n return typeof value === 'number' ? normalize(value) : value.map(normalize);\n}\n\nfunction canonicalBytes<Values extends VfxValueMap>(\n contract: VfxEffectContract<Values>,\n values: Values,\n): Uint8Array {\n const fields = allFields(contract)\n .map((field) => ({ name: field.name, type: field.type, value: values[field.name] }))\n .sort((left, right) => left.name.localeCompare(right.name))\n .map((field) => ({\n name: field.name,\n type: field.type,\n value: field.value === undefined ? undefined : normalizeValue(field.type, field.value),\n }));\n return new TextEncoder().encode(JSON.stringify({ fields }));\n}\n\nfunction sameBytes(left: Uint8Array, right: Uint8Array): boolean {\n if (left.length !== right.length) return false;\n for (let index = 0; index < left.length; index += 1) {\n if (left[index] !== right[index]) return false;\n }\n return true;\n}\n\nfunction cloneValue(value: VfxValue): VfxValue {\n return typeof value === 'number' ? value : [...value];\n}\n\nfunction cloneValues<Values extends VfxValueMap>(values: Values): Values {\n const clone: Record<string, VfxValue> = {};\n for (const [name, value] of Object.entries(values)) clone[name] = cloneValue(value);\n return Object.freeze(clone) as Values;\n}\n\nfunction cloneBytes(bytes: Uint8Array): Uint8Array {\n return bytes.slice();\n}\n\nfunction validChannelPayload(payload: unknown): payload is VfxChannelPayload {\n if (payload === null || typeof payload !== 'object' || Array.isArray(payload)) return false;\n const value = payload as Record<string, unknown>;\n const position = value.position;\n return (\n Array.isArray(position) &&\n position.length === 3 &&\n position.every((component) => typeof component === 'number' && Number.isFinite(component)) &&\n typeof value.strength === 'number' &&\n Number.isFinite(value.strength)\n );\n}\n\nfunction withTick(input: VfxChannelInput, tick: number): VfxChannelInput {\n const result = { ...input } as VfxChannelInput & { tick: number };\n Object.defineProperty(result, 'tick', { value: tick, enumerable: false });\n return Object.freeze(result);\n}\n\nexport class ParticleEffectInstance<Values extends VfxValueMap = VfxValueMap> {\n readonly contract: VfxEffectContract<Values>;\n #values: Values;\n #generation = 0;\n #sequence = 0;\n #pendingPatches: Partial<Values>[] = [];\n #pendingChannels: VfxChannelInput[] = [];\n #channelCapacities = new Map<string, number>([['impact', 32]]);\n #droppedCount = 0;\n\n constructor(contract: VfxEffectContract<Values>, options: VfxInstanceOptions<Values> = {}) {\n this.contract = contract;\n if (\n options.parent?.fingerprint !== undefined &&\n options.parent.fingerprint !== contract.fingerprint\n ) {\n throw new TypeError(\n `ParticleEffectInstance parent fingerprint ${options.parent.fingerprint} does not match ${contract.fingerprint}`,\n );\n }\n const parentDefaults = options.parent?.defaults ?? contract.defaults;\n const initial = { ...parentDefaults, ...options.initialValues };\n const checked = contract.createValues(initial);\n if (!checked.ok) throw new TypeError(checked.error.hint);\n this.#values = cloneValues(checked.value);\n for (const channel of options.channels ?? []) {\n this.#channelCapacities.set(channel.id, channel.capacity);\n }\n }\n\n get values(): Values {\n return this.#values;\n }\n\n get generation(): number {\n return this.#generation;\n }\n\n get pendingPatchCount(): number {\n return this.#pendingPatches.length;\n }\n\n setChannelCapacity(channel: string, capacity: number): void {\n if (!Number.isInteger(capacity) || capacity <= 0) {\n throw new RangeError('channel capacity must be a positive integer');\n }\n this.#channelCapacities.set(channel, capacity);\n }\n\n submit(input: VfxChannelInput): InstanceResult<void> {\n if (\n typeof input.channel !== 'string' ||\n input.channel.length === 0 ||\n !Number.isInteger(input.sequence) ||\n input.sequence < 0 ||\n !validChannelPayload(input.payload)\n ) {\n return failure(\n 'vfx-channel-invalid',\n `channels.${input.channel || 'unknown'}`,\n 'a named channel with a finite impact payload and non-negative integer sequence',\n 'repair the typed channel payload before the next FixedUpdate',\n );\n }\n const capacity = this.#channelCapacities.get(input.channel) ?? 32;\n if (this.#pendingChannels.length >= capacity) {\n this.#droppedCount += 1;\n return failure(\n 'vfx-channel-overflow',\n `channels.${input.channel}`,\n `at most ${capacity} pending inputs for this channel`,\n 'reduce the input rate or increase the reflected channel capacity and recook',\n input.sequence,\n );\n }\n this.#pendingChannels.push(\n Object.freeze({\n channel: input.channel,\n payload: Object.freeze({\n position: [...input.payload.position] as [number, number, number],\n strength: input.payload.strength,\n }),\n sequence: input.sequence,\n }),\n );\n return ok(undefined);\n }\n\n patch(patch: Partial<Values>): InstanceResult<void> {\n const candidate: VfxValueMap = { ...this.#values, ...patch };\n const checked = this.contract.validateValues(candidate);\n if (!checked.ok) return checked;\n this.#pendingPatches.push(Object.freeze({ ...patch }));\n return ok(undefined);\n }\n\n commit(options: VfxInstanceCommitOptions): InstanceResult<VfxInstanceCommit<Values>> {\n const candidate: VfxValueMap = { ...this.#values };\n for (const patch of this.#pendingPatches) Object.assign(candidate, patch);\n const checked = this.contract.validateValues(candidate);\n if (!checked.ok) return checked;\n const nextValues = cloneValues(checked.value);\n const packed = this.contract.pack(nextValues);\n if (!packed.ok) return packed;\n const patchCount = this.#pendingPatches.length;\n const droppedCount = this.#droppedCount;\n const channelInputs = Object.freeze(\n [...this.#pendingChannels]\n .sort((left, right) => left.sequence - right.sequence)\n .map((input) => withTick(input, options.tick)),\n );\n this.#pendingPatches = [];\n this.#pendingChannels = [];\n this.#droppedCount = 0;\n if (patchCount > 0) this.#generation += 1;\n this.#values = nextValues;\n const canonicalPayload = canonicalBytes(this.contract, nextValues);\n const sequence = this.#sequence++;\n const replayInput: VfxReplayInput<Values> = Object.freeze({\n seed: options.seed,\n tick: options.tick,\n generation: this.#generation,\n sequence,\n fingerprint: this.contract.fingerprint,\n payload: cloneBytes(canonicalPayload),\n values: nextValues,\n channelInputs,\n droppedCount,\n });\n return ok({\n seed: options.seed,\n tick: options.tick,\n generation: this.#generation,\n sequence,\n values: nextValues,\n parameterBlock: cloneBytes(packed.value),\n canonicalPayload,\n replayInput,\n patchCount,\n channelInputs,\n droppedCount,\n });\n }\n\n replay(input: VfxReplayInput<Values>): InstanceResult<VfxInstanceCommit<Values>> {\n if (input.fingerprint !== this.contract.fingerprint) {\n return failure(\n 'vfx-instance-replay-mismatch',\n 'replay.fingerprint',\n this.contract.fingerprint,\n 'replay the input with the matching cooked effect contract',\n input.fingerprint,\n );\n }\n const checked = this.contract.validateValues(input.values);\n if (!checked.ok) return checked;\n const canonicalPayload = canonicalBytes(this.contract, checked.value);\n if (!sameBytes(canonicalPayload, input.payload)) {\n return failure(\n 'vfx-instance-replay-mismatch',\n 'replay.payload',\n 'canonical payload bytes for replay.values',\n 'record and replay normalized values from the same fixed-tick input',\n );\n }\n const packed = this.contract.pack(checked.value);\n if (!packed.ok) return packed;\n this.#values = cloneValues(checked.value);\n this.#generation = input.generation;\n this.#sequence = Math.max(this.#sequence, input.sequence + 1);\n this.#pendingPatches = [];\n this.#pendingChannels = [...input.channelInputs].map((channel) =>\n withTick(channel, input.tick),\n );\n this.#droppedCount = 0;\n const values = this.#values;\n const replayInput: VfxReplayInput<Values> = Object.freeze({\n ...input,\n payload: cloneBytes(input.payload),\n values,\n channelInputs: this.#pendingChannels,\n droppedCount: input.droppedCount,\n });\n return ok({\n seed: input.seed,\n tick: input.tick,\n generation: input.generation,\n sequence: input.sequence,\n values,\n parameterBlock: cloneBytes(packed.value),\n canonicalPayload,\n replayInput,\n patchCount: 0,\n channelInputs: this.#pendingChannels,\n droppedCount: input.droppedCount,\n });\n }\n}\n\nexport function createParticleEffectInstance<Values extends VfxValueMap>(\n contract: VfxEffectContract<Values>,\n options: VfxInstanceOptions<Values> = {},\n): ParticleEffectInstance<Values> {\n return new ParticleEffectInstance(contract, options);\n}\n","import { defineComponent, type SchemaOf, type ShapeOf } from '@forgeax/engine-ecs';\nimport type { VfxValueMap } from './effect-contract.js';\nimport type { ParticleEffectInstance } from './instance.js';\n\n/** ECS author intent for one shared particle effect. */\nexport const ParticleEffectPlayer = defineComponent('ParticleEffectPlayer', {\n // The VFX render owner re-resolves the compiled effect on the target world;\n // playback intent remains portable simulation state.\n effect: { type: 'shared<ParticleEffectAsset>' },\n playing: { type: 'bool', default: true },\n seed: { type: 'u32', default: 0 },\n timeScale: { type: 'f32', default: 1 },\n});\n\n/** The four serializable fields stored by {@link ParticleEffectPlayer}. */\nexport type ParticleEffectPlayerData = ShapeOf<SchemaOf<typeof ParticleEffectPlayer>>;\n\n/** Runtime-owned typed values associated with a player without extending ECS storage. */\nexport interface ParticleEffectPlayerBinding<Values extends VfxValueMap = VfxValueMap> {\n readonly instance: ParticleEffectInstance<Values>;\n}\n","import { Entity, type EntityHandle, FixedTime, FixedUpdate, type World } from '@forgeax/engine-ecs';\nimport type { Plugin } from '@forgeax/engine-plugin';\nimport { type Handle, toShared } from '@forgeax/engine-types';\nimport type { ParticleEventSource } from './code-source.js';\nimport type { VfxValueMap } from './effect-contract.js';\nimport { createVfxEffectContract, type VfxEffectReflection } from './effect-contract.js';\nimport type { VfxGpuEffectAssetAny, VfxGpuEmitterProgramAny } from './gpu-program.js';\nimport {\n ParticleEffectInstance,\n type VfxChannelCounters,\n type VfxReplayInput,\n} from './instance.js';\nimport { ParticleEffectPlayer } from './player.js';\n\nexport const VFX_GPU_RUNTIME_RESOURCE_KEY = 'VfxGpuRuntime';\n\nexport interface VfxInspectSnapshotInput {\n readonly layoutFingerprint: string;\n readonly parameterGeneration: number;\n readonly patchCount: number;\n readonly dataInterfaces?: unknown;\n readonly channels?: unknown;\n readonly stages?: unknown;\n readonly renderers?: unknown;\n readonly hmr?: unknown;\n readonly gpuTiming?: unknown;\n readonly error?: {\n readonly code: string;\n readonly expected: string;\n readonly hint: string;\n readonly detail: unknown;\n };\n}\n\nexport function createVfxInspectSnapshot(input: VfxInspectSnapshotInput) {\n return {\n layout: { fingerprint: input.layoutFingerprint },\n values: { generation: input.parameterGeneration, patchCount: input.patchCount },\n ...(input.dataInterfaces === undefined ? {} : { dataInterfaces: input.dataInterfaces }),\n ...(input.channels === undefined ? {} : { channels: input.channels }),\n ...(input.stages === undefined ? {} : { stages: input.stages }),\n ...(input.renderers === undefined ? {} : { renderers: input.renderers }),\n ...(input.hmr === undefined ? {} : { hmr: input.hmr }),\n ...(input.gpuTiming === undefined ? {} : { gpuTiming: input.gpuTiming }),\n ...(input.error === undefined ? {} : { error: input.error }),\n } as const;\n}\n\nexport interface VfxGpuTickIntent {\n readonly sequence: number;\n readonly player: EntityHandle;\n readonly emitter: VfxGpuEmitterProgramAny;\n readonly programFingerprint: string;\n readonly reset: boolean;\n readonly fixedDelta: number;\n /** Effect-relative fixed tick. Resets to zero for replay and restart-on-visible. */\n readonly phaseTick: number;\n /** World-global FixedTime tick retained for renderer ring selection and correlation. */\n readonly tick: number;\n readonly seed: number;\n readonly playCycle: number;\n readonly spawnCount: number;\n readonly firstParticleId: number;\n readonly instanceGeneration: number;\n readonly instancePatchCount: number;\n readonly parameterBlock: Uint8Array;\n readonly canonicalPayload: Uint8Array;\n readonly replayInput: VfxReplayInput<VfxValueMap>;\n readonly channelInputs: VfxReplayInput<VfxValueMap>['channelInputs'];\n readonly eventCounters: VfxChannelCounters;\n}\n\nexport interface VfxGpuEmitterInspectSnapshot {\n readonly id: string;\n readonly module: string;\n readonly capacity: number;\n /** Renderer-owned camera-frustum result. This is not an editor mute/isolate control. */\n readonly cameraVisible: boolean;\n /** Session-only preview mask. False suppresses both simulation and retained rendering. */\n readonly sessionEnabled: boolean;\n readonly phaseTick: number | null;\n readonly tick: number | null;\n readonly playCycle: number | null;\n readonly spawnCount: number;\n readonly firstParticleId: number;\n readonly reset: boolean;\n readonly schedule: VfxGpuEmitterProgramAny['schedule'];\n readonly bounds: VfxGpuEmitterProgramAny['bounds'];\n readonly simulationWhenCulled: VfxGpuEmitterProgramAny['simulationWhenCulled'];\n readonly renderers: readonly {\n readonly index: number;\n readonly kind: VfxGpuEmitterProgramAny['renderers'][number]['kind'];\n readonly enabled: boolean;\n }[];\n readonly stages: readonly string[];\n readonly dataInterfaces: readonly string[];\n}\n\n/** Renderer-facing source view used to refresh culling without a queued tick. */\nexport interface VfxGpuEmitterSource {\n readonly player: EntityHandle;\n readonly emitter: VfxGpuEmitterProgramAny;\n}\n\nexport interface VfxGpuCommittedInspectSnapshot {\n readonly sequence: number;\n readonly tick: number;\n readonly phaseTick: number;\n readonly playCycle: number;\n readonly spawnCount: number;\n readonly firstParticleId: number;\n readonly reset: boolean;\n readonly instanceGeneration: number;\n readonly instancePatchCount: number;\n}\n\nexport interface VfxGpuPlayerInspectSnapshot {\n readonly player: EntityHandle;\n readonly assetGuid: string;\n readonly programFingerprint: string;\n readonly seed: number;\n readonly fixedDelta: number;\n readonly playing: boolean;\n readonly values: {\n readonly layoutFingerprint: string;\n readonly generation: number;\n readonly pendingPatchCount: number;\n };\n readonly queuedIntents: number;\n readonly queuedTicks: number;\n readonly lastCommitted: VfxGpuCommittedInspectSnapshot | null;\n readonly channels: VfxChannelCounters;\n readonly emitters: readonly VfxGpuEmitterInspectSnapshot[];\n readonly diagnostics: readonly VfxGpuRuntimeDiagnostic[];\n}\n\nexport interface VfxGpuRuntimeDiagnostic {\n readonly code:\n | 'vfx-intent-queue-overflow'\n | 'vfx-effect-unavailable'\n | 'vfx-player-invalid'\n | 'vfx-instance-commit-failed';\n readonly expected: string;\n readonly hint: string;\n readonly detail: { readonly player: EntityHandle; readonly maxQueuedTicks?: number };\n}\n\ninterface PlayerState {\n effect: Handle<'ParticleEffectAsset', 'shared'>;\n assetGuid: string;\n programFingerprint: string;\n emitters: readonly VfxGpuEmitterProgramAny[];\n seed: number;\n playing: boolean;\n playCycle: number;\n elapsed: number[];\n rateRemainders: number[];\n nextParticleIds: number[];\n playCycles: number[];\n cameraVisible: boolean[];\n phaseTicks: number[];\n hasCommitted: boolean;\n pendingResets: boolean[];\n}\n\nfunction eventCounters(\n intent: Pick<VfxGpuTickIntent, 'channelInputs' | 'emitter'>,\n dropped: number,\n eventSources: readonly ParticleEventSource[],\n): VfxChannelCounters {\n const inputs = intent.channelInputs;\n const events = [...(intent.emitter.events ?? []), ...eventSources];\n return Object.freeze({\n queued: inputs.length,\n produced: (intent.emitter.events?.length ?? 0) > 0 ? inputs.length : 0,\n consumed:\n eventSources.length > 0\n ? inputs.length * eventSources.reduce((total, event) => total + event.fanOut, 0)\n : 0,\n dropped,\n overflow: dropped > 0 ? 1 : 0,\n fanOut: events.reduce((total, event) => total + event.fanOut, 0),\n recursionDepth: events.reduce((depth, event) => Math.max(depth, event.recursionDepth), 0),\n lastSequence: inputs.at(-1)?.sequence ?? -1,\n });\n}\n\nexport interface VfxGpuRuntimeOptions {\n readonly maxQueuedTicks?: number;\n}\n\nexport class VfxGpuRuntime {\n readonly #maxQueuedTicks: number;\n readonly #players = new Map<EntityHandle, PlayerState>();\n readonly #instances = new Map<EntityHandle, ParticleEffectInstance>();\n readonly #seen = new Set<EntityHandle>();\n readonly #intents: VfxGpuTickIntent[] = [];\n readonly #diagnostics: VfxGpuRuntimeDiagnostic[] = [];\n readonly #lastCommitted = new Map<EntityHandle, VfxGpuTickIntent>();\n readonly #lastCommittedByEmitter = new Map<EntityHandle, Map<string, VfxGpuTickIntent>>();\n readonly #eventCounters = new Map<EntityHandle, VfxChannelCounters>();\n readonly #cameraVisibility = new Map<string, boolean>();\n readonly #sessionEnabled = new Map<string, boolean>();\n readonly #replayRequests = new Set<EntityHandle>();\n readonly #replayInputs = new Map<EntityHandle, VfxReplayInput<VfxValueMap>>();\n #sequence = 0;\n #renderGeneration = 0;\n\n constructor(options: VfxGpuRuntimeOptions = {}) {\n this.#maxQueuedTicks = options.maxQueuedTicks ?? 8;\n }\n\n /** Resource generation owned by the current VFX render attachment. */\n get renderGeneration(): number {\n return this.#renderGeneration;\n }\n\n snapshot(): readonly VfxGpuTickIntent[] {\n return this.#intents;\n }\n\n diagnostics(): readonly VfxGpuRuntimeDiagnostic[] {\n return this.#diagnostics;\n }\n\n /**\n * Visit every live emitter source. The renderer uses this on render frames\n * where pause/restart culling has no pending simulation intent, so a camera\n * move back into the bounds can refresh visibility before the next tick.\n */\n forEachEmitterSource(visitor: (source: VfxGpuEmitterSource) => void): void {\n for (const [player, state] of this.#players) {\n for (const emitter of state.emitters) visitor({ player, emitter });\n }\n }\n\n lastCommitted(player: EntityHandle): VfxGpuTickIntent | undefined {\n return this.#lastCommitted.get(player);\n }\n\n /**\n * Return the last submitted fixed-tick state for one emitter. Renderers\n * retain this projection between fixed ticks; simulation intents are a\n * queue, while a drawable emitter remains live until the player is reset.\n */\n lastCommittedEmitter(player: EntityHandle, emitterId: string): VfxGpuTickIntent | undefined {\n return this.#lastCommittedByEmitter.get(player)?.get(emitterId);\n }\n\n inspectPlayers(): readonly VfxGpuPlayerInspectSnapshot[] {\n return Object.freeze(\n [...this.#players.keys()]\n .sort((left, right) => Number(left) - Number(right))\n .flatMap((player) => {\n const snapshot = this.inspectPlayer(player);\n return snapshot === undefined ? [] : [snapshot];\n }),\n );\n }\n\n inspectPlayer(player: EntityHandle): VfxGpuPlayerInspectSnapshot | undefined {\n const state = this.#players.get(player);\n if (state === undefined) return undefined;\n const instance = this.#instances.get(player);\n const latest = state.emitters.map((emitter) => this.#latestIntent(player, emitter.id));\n const lastIntent = latest.reduce<VfxGpuTickIntent | undefined>(\n (current, intent) =>\n intent !== undefined && (current === undefined || intent.sequence > current.sequence)\n ? intent\n : current,\n undefined,\n );\n const layoutFingerprint =\n state.emitters.find((emitter) => emitter.reflection.layout !== undefined)?.reflection.layout\n ?.fingerprint ?? state.programFingerprint;\n const lastCommitted = this.#lastCommitted.get(player);\n const queuedTicks = new Set<number>();\n let queuedIntents = 0;\n for (const intent of this.#intents) {\n if (intent.player !== player) continue;\n queuedIntents += 1;\n queuedTicks.add(intent.tick);\n }\n return Object.freeze({\n player,\n assetGuid: state.assetGuid,\n programFingerprint: state.programFingerprint,\n seed: lastIntent?.seed ?? state.seed,\n fixedDelta: lastIntent?.fixedDelta ?? 0,\n playing: state.playing,\n values: Object.freeze({\n layoutFingerprint,\n generation: instance?.generation ?? lastIntent?.instanceGeneration ?? 0,\n pendingPatchCount: instance?.pendingPatchCount ?? 0,\n }),\n queuedIntents,\n queuedTicks: queuedTicks.size,\n lastCommitted:\n lastCommitted === undefined\n ? null\n : Object.freeze({\n sequence: lastCommitted.sequence,\n tick: lastCommitted.tick,\n phaseTick: lastCommitted.phaseTick,\n playCycle: lastCommitted.playCycle,\n spawnCount: lastCommitted.spawnCount,\n firstParticleId: lastCommitted.firstParticleId,\n reset: lastCommitted.reset,\n instanceGeneration: lastCommitted.instanceGeneration,\n instancePatchCount: lastCommitted.instancePatchCount,\n }),\n channels: this.eventCounters(player),\n emitters: Object.freeze(\n state.emitters.map((emitter, index) => {\n const intent = latest[index];\n return Object.freeze({\n id: emitter.id,\n module: emitter.module,\n capacity: emitter.capacity,\n cameraVisible: this.#cameraVisibility.get(`${player}:${emitter.id}`) ?? true,\n sessionEnabled: this.isEmitterSessionEnabled(player, emitter.id),\n phaseTick: intent?.phaseTick ?? null,\n tick: intent?.tick ?? null,\n playCycle: intent?.playCycle ?? null,\n spawnCount: intent?.spawnCount ?? 0,\n firstParticleId: intent?.firstParticleId ?? 0,\n reset: intent?.reset ?? false,\n schedule: emitter.schedule,\n bounds: emitter.bounds,\n simulationWhenCulled: emitter.simulationWhenCulled,\n renderers: Object.freeze(\n emitter.renderers.map((renderer, rendererIndex) =>\n Object.freeze({\n index: rendererIndex,\n kind: renderer.kind,\n enabled: renderer.enabled ?? true,\n }),\n ),\n ),\n stages: Object.freeze((emitter.reflection.stages ?? []).map((stage) => stage.id)),\n dataInterfaces: Object.freeze(\n (emitter.reflection.dataInterfaces ?? []).map((requirement) => requirement.token),\n ),\n });\n }),\n ),\n diagnostics: Object.freeze(\n this.#diagnostics.filter((diagnostic) => diagnostic.detail.player === player),\n ),\n });\n }\n\n eventCounters(player: EntityHandle): VfxChannelCounters {\n return (\n this.#eventCounters.get(player) ??\n this.#lastCommitted.get(player)?.eventCounters ?? {\n queued: 0,\n produced: 0,\n consumed: 0,\n dropped: 0,\n overflow: 0,\n fanOut: 0,\n recursionDepth: 0,\n lastSequence: -1,\n }\n );\n }\n\n markEventDispatched(player: EntityHandle, counters: VfxChannelCounters): void {\n const prior = this.#eventCounters.get(player);\n if (counters.produced === 0 && prior !== undefined) {\n this.#eventCounters.set(\n player,\n Object.freeze({\n ...prior,\n queued: 0,\n consumed: Math.max(prior.consumed, counters.consumed),\n }),\n );\n return;\n }\n this.#eventCounters.set(\n player,\n Object.freeze({ ...counters, queued: 0, consumed: counters.produced }),\n );\n }\n\n hasPlayer(player: EntityHandle): boolean {\n return this.#players.has(player);\n }\n\n attachInstance(player: EntityHandle, instance: ParticleEffectInstance): void {\n this.#instances.set(player, instance);\n }\n\n detachInstance(player: EntityHandle): void {\n this.#instances.delete(player);\n }\n\n getInstance(player: EntityHandle): ParticleEffectInstance | undefined {\n return this.#instances.get(player);\n }\n\n setEmitterCameraVisibility(player: EntityHandle, emitterId: string, visible: boolean): void {\n this.#cameraVisibility.set(`${player}:${emitterId}`, visible);\n }\n\n setEmitterSessionEnabled(player: EntityHandle, emitterId: string, enabled: boolean): void {\n this.#sessionEnabled.set(`${player}:${emitterId}`, enabled);\n }\n\n isEmitterSessionEnabled(player: EntityHandle, emitterId: string): boolean {\n return this.#sessionEnabled.get(`${player}:${emitterId}`) ?? true;\n }\n\n /** Restart from tick zero without changing authored `ParticleEffectPlayer.playing`. */\n replay(player: EntityHandle, input?: VfxReplayInput<VfxValueMap>): void {\n this.#discardQueuedIntents(player);\n this.#clearDiagnostics(player, 'vfx-intent-queue-overflow');\n this.#replayInputs.delete(player);\n if (input === undefined) {\n this.#instances.delete(player);\n } else {\n this.#replayInputs.set(player, input);\n }\n this.#replayRequests.add(player);\n }\n\n /**\n * Acknowledge queued intents. A scalar acknowledges the contiguous prefix;\n * an array acknowledges only those terminal sequences, which lets unrelated\n * player/emitter streams progress while another stream is deferred. When the\n * renderer supplies `publishedSequences`, only intents that reached GPU\n * submission update the retained last-committed projection; skipped intents\n * are queue acknowledgements, not new GPU state.\n */\n commit(sequence: number | readonly number[], publishedSequences?: readonly number[]): void {\n const prefix = typeof sequence === 'number' ? sequence : undefined;\n const acknowledged = typeof sequence === 'number' ? undefined : new Set(sequence);\n const published = publishedSequences === undefined ? undefined : new Set(publishedSequences);\n const committedPlayers = new Set<EntityHandle>();\n const retained: VfxGpuTickIntent[] = [];\n for (const intent of this.#intents) {\n const shouldAcknowledge =\n prefix === undefined\n ? acknowledged?.has(intent.sequence) === true\n : intent.sequence <= prefix;\n if (!shouldAcknowledge) {\n retained.push(intent);\n continue;\n }\n const state = this.#players.get(intent.player);\n committedPlayers.add(intent.player);\n if (published === undefined || published.has(intent.sequence)) {\n if (state !== undefined) state.hasCommitted = true;\n const priorCommitted = this.#lastCommitted.get(intent.player);\n if (priorCommitted === undefined || priorCommitted.sequence < intent.sequence) {\n this.#lastCommitted.set(intent.player, intent);\n }\n let emitters = this.#lastCommittedByEmitter.get(intent.player);\n if (emitters === undefined) {\n emitters = new Map();\n this.#lastCommittedByEmitter.set(intent.player, emitters);\n }\n const priorEmitter = emitters.get(intent.emitter.id);\n if (priorEmitter === undefined || priorEmitter.sequence < intent.sequence) {\n emitters.set(intent.emitter.id, intent);\n }\n }\n }\n this.#intents.splice(0, this.#intents.length, ...retained);\n for (const player of committedPlayers) {\n this.#clearDiagnostics(player, 'vfx-intent-queue-overflow');\n }\n }\n\n reset(player: EntityHandle): void {\n this.#discardQueuedIntents(player);\n this.#clearDiagnostics(player);\n this.#players.delete(player);\n this.#instances.delete(player);\n this.#replayRequests.delete(player);\n this.#lastCommitted.delete(player);\n this.#lastCommittedByEmitter.delete(player);\n this.#eventCounters.delete(player);\n this.#replayInputs.delete(player);\n const prefix = `${player}:`;\n for (const key of this.#cameraVisibility.keys()) {\n if (key.startsWith(prefix)) this.#cameraVisibility.delete(key);\n }\n for (const key of this.#sessionEnabled.keys()) {\n if (key.startsWith(prefix)) this.#sessionEnabled.delete(key);\n }\n }\n\n /**\n * Drop every generation-owned VFX runtime value after device recovery.\n * Authored ParticleEffectPlayer state remains the restart source on the next\n * FixedUpdate; no queued intent or stale instance crosses the boundary.\n */\n recover(): void {\n this.#renderGeneration += 1;\n this.#players.clear();\n this.#instances.clear();\n this.#seen.clear();\n this.#intents.length = 0;\n this.#diagnostics.length = 0;\n this.#lastCommitted.clear();\n this.#lastCommittedByEmitter.clear();\n this.#eventCounters.clear();\n this.#cameraVisibility.clear();\n this.#sessionEnabled.clear();\n this.#replayRequests.clear();\n this.#replayInputs.clear();\n }\n\n #report(diagnostic: VfxGpuRuntimeDiagnostic): void {\n const alreadyActive = this.#diagnostics.some(\n (prior) => prior.code === diagnostic.code && prior.detail.player === diagnostic.detail.player,\n );\n if (alreadyActive) return;\n if (this.#diagnostics.length === 64) this.#diagnostics.shift();\n this.#diagnostics.push(diagnostic);\n }\n\n #clearDiagnostics(player: EntityHandle, code?: VfxGpuRuntimeDiagnostic['code']): void {\n for (let index = this.#diagnostics.length - 1; index >= 0; index -= 1) {\n const diagnostic = this.#diagnostics[index];\n if (\n diagnostic?.detail.player === player &&\n (code === undefined || diagnostic.code === code)\n ) {\n this.#diagnostics.splice(index, 1);\n }\n }\n }\n\n #discardQueuedIntents(player: EntityHandle): void {\n let retained = 0;\n for (const intent of this.#intents) {\n if (intent.player !== player) {\n this.#intents[retained] = intent;\n retained += 1;\n }\n }\n this.#intents.length = retained;\n }\n\n advance(\n world: World,\n tick: number,\n fixedDelta: number,\n players: readonly {\n readonly player: EntityHandle;\n readonly effect: Handle<'ParticleEffectAsset', 'shared'>;\n readonly playing: boolean;\n readonly seed: number;\n readonly timeScale: number;\n }[],\n ): void {\n this.#seen.clear();\n for (const input of players) {\n this.#seen.add(input.player);\n if (!Number.isFinite(input.timeScale) || input.timeScale < 0) {\n this.#report({\n code: 'vfx-player-invalid',\n expected: 'a finite non-negative particle timeScale',\n hint: 'repair ParticleEffectPlayer.timeScale and restart the player',\n detail: { player: input.player },\n });\n continue;\n }\n this.#clearDiagnostics(input.player, 'vfx-player-invalid');\n const resolved = world.sharedRefs.resolve<'ParticleEffectAsset', VfxGpuEffectAssetAny>(\n input.effect,\n );\n if (!resolved.ok || resolved.value.schemaVersion !== 3) {\n this.#report({\n code: 'vfx-effect-unavailable',\n expected: 'a loaded schemaVersion 3 GPU particle effect',\n hint: 'cold-cook the legacy effect as Program v3 before the first FixedUpdate',\n detail: { player: input.player },\n });\n continue;\n }\n this.#clearDiagnostics(input.player, 'vfx-effect-unavailable');\n const previous = this.#players.get(input.player);\n const replayRequested = this.#replayRequests.delete(input.player);\n const restartRequested =\n previous === undefined ||\n previous.effect !== input.effect ||\n previous.seed !== input.seed ||\n replayRequested ||\n (!previous.playing && input.playing);\n const restart = restartRequested;\n const state = restartRequested\n ? {\n effect: input.effect,\n assetGuid: resolved.value.guid,\n programFingerprint: resolved.value.program.fingerprint,\n emitters: resolved.value.program.emitters,\n seed: input.seed,\n playing: input.playing,\n playCycle: (previous?.playCycle ?? -1) + 1,\n elapsed: resolved.value.program.emitters.map(() => 0),\n rateRemainders: resolved.value.program.emitters.map(() => 0),\n nextParticleIds: resolved.value.program.emitters.map(() => 0),\n playCycles: resolved.value.program.emitters.map(() => (previous?.playCycle ?? -1) + 1),\n cameraVisible: resolved.value.program.emitters.map(() => true),\n phaseTicks: resolved.value.program.emitters.map(() => 0),\n hasCommitted: false,\n pendingResets: resolved.value.program.emitters.map(() => false),\n }\n : previous;\n this.#players.set(input.player, state);\n // Replay is a one-FixedUpdate request, not a second persistent play-state\n // authority. Inspection always returns the authored player state after\n // the requested reset intent has been emitted.\n state.playing = input.playing;\n if (!input.playing && !replayRequested) {\n if (restart) state.pendingResets.fill(true);\n continue;\n }\n const queuedForPlayer = this.#intents.reduce(\n (count, intent) => count + (intent.player === input.player ? 1 : 0),\n 0,\n );\n if (\n queuedForPlayer >=\n this.#maxQueuedTicks * Math.max(1, resolved.value.program.emitters.length)\n ) {\n if (restart) state.pendingResets.fill(true);\n if (state.hasCommitted) {\n this.#report({\n code: 'vfx-intent-queue-overflow',\n expected: `at most ${this.#maxQueuedTicks} unconsumed fixed ticks`,\n hint: 'recover or restart the renderer; VFX does not silently discard simulation ticks',\n detail: { player: input.player, maxQueuedTicks: this.#maxQueuedTicks },\n });\n }\n continue;\n }\n const instance =\n this.#instances.get(input.player) ?? this.#createInstance(input.player, resolved.value);\n if (instance === undefined) {\n if (restart) state.pendingResets.fill(true);\n continue;\n }\n const hasActiveEmitter = resolved.value.program.emitters.some((emitter) => {\n if (!this.isEmitterSessionEnabled(input.player, emitter.id)) return false;\n const cameraVisible = this.#cameraVisibility.get(`${input.player}:${emitter.id}`) ?? true;\n return cameraVisible || emitter.simulationWhenCulled === 'continue';\n });\n if (!hasActiveEmitter) {\n if (restart) state.pendingResets.fill(true);\n for (const [index, emitter] of resolved.value.program.emitters.entries()) {\n state.cameraVisible[index] =\n this.#cameraVisibility.get(`${input.player}:${emitter.id}`) ?? true;\n }\n continue;\n }\n const replayInput = this.#replayInputs.get(input.player);\n this.#replayInputs.delete(input.player);\n const committed =\n replayInput === undefined\n ? instance.commit({ seed: input.seed, tick })\n : instance.replay(replayInput);\n if (!committed.ok) {\n if (restart) state.pendingResets.fill(true);\n this.#report({\n code: 'vfx-instance-commit-failed',\n expected: 'the current typed instance values to pack into the reflected GPU block',\n hint: 'repair the instance patch and retry at the next FixedUpdate',\n detail: { player: input.player },\n });\n continue;\n }\n const delta = fixedDelta * input.timeScale;\n const committedChannels = committed.value.channelInputs;\n for (const [index, emitter] of resolved.value.program.emitters.entries()) {\n const cameraVisible = this.#cameraVisibility.get(`${input.player}:${emitter.id}`) ?? true;\n const becameVisible = cameraVisible && state.cameraVisible[index] === false;\n state.cameraVisible[index] = cameraVisible;\n const emitterRestart = restart || state.pendingResets[index] === true;\n if (!this.isEmitterSessionEnabled(input.player, emitter.id)) {\n if (emitterRestart) state.pendingResets[index] = true;\n continue;\n }\n if (!cameraVisible && emitter.simulationWhenCulled !== 'continue') {\n if (emitterRestart) state.pendingResets[index] = true;\n continue;\n }\n const visibilityRestart =\n becameVisible && emitter.simulationWhenCulled === 'restart-on-visible';\n if (visibilityRestart) {\n state.elapsed[index] = 0;\n state.rateRemainders[index] = 0;\n state.nextParticleIds[index] = 0;\n state.playCycles[index] = (state.playCycles[index] ?? state.playCycle) + 1;\n state.phaseTicks[index] = 0;\n }\n const previousElapsed = state.elapsed[index] ?? 0;\n const scheduled = spawnCount(\n emitter,\n previousElapsed,\n previousElapsed + delta,\n emitterRestart || visibilityRestart,\n state.rateRemainders[index] ?? 0,\n );\n state.rateRemainders[index] = scheduled.remainder;\n const firstParticleId = state.nextParticleIds[index] ?? 0;\n state.nextParticleIds[index] = firstParticleId + scheduled.count;\n const consumesEvent = resolved.value.program.emitters.some((source) =>\n (source.events ?? []).some((event) => event.subEmitter === emitter.id),\n );\n const eventSources = resolved.value.program.emitters.flatMap((source) =>\n (source.events ?? []).filter((event) => event.subEmitter === emitter.id),\n );\n const channelInputs =\n (emitter.events?.length ?? 0) > 0 || consumesEvent ? committedChannels : [];\n const phaseTick = state.phaseTicks[index] ?? 0;\n this.#intents.push(\n Object.freeze({\n sequence: this.#sequence++,\n player: input.player,\n emitter,\n programFingerprint: resolved.value.program.fingerprint,\n reset: emitterRestart || visibilityRestart,\n fixedDelta: delta,\n phaseTick,\n tick,\n seed: input.seed,\n playCycle: state.playCycles[index] ?? state.playCycle,\n spawnCount: scheduled.count,\n firstParticleId,\n instanceGeneration: committed.value.generation,\n instancePatchCount: committed.value.patchCount,\n parameterBlock: committed.value.parameterBlock,\n canonicalPayload: committed.value.canonicalPayload,\n replayInput: committed.value.replayInput,\n channelInputs,\n eventCounters: eventCounters(\n { channelInputs, emitter },\n channelInputs.length === 0 ? 0 : committed.value.droppedCount,\n eventSources,\n ),\n }),\n );\n state.elapsed[index] = previousElapsed + delta;\n state.phaseTicks[index] = phaseTick + 1;\n state.pendingResets[index] = false;\n }\n }\n for (const player of this.#players.keys()) {\n if (!this.#seen.has(player)) this.reset(player);\n }\n }\n\n #createInstance(\n player: EntityHandle,\n effect: VfxGpuEffectAssetAny,\n ): ParticleEffectInstance | undefined {\n const layout = effect.program.emitters.find(\n (emitter) => emitter.reflection.layout !== undefined,\n )?.reflection.layout;\n if (layout === undefined) {\n this.#report({\n code: 'vfx-effect-unavailable',\n expected: 'a Program v3 emitter reflection layout',\n hint: 'recook the effect with Program v3 reflection before starting the player',\n detail: { player },\n });\n return undefined;\n }\n const reflection: VfxEffectReflection = layout;\n try {\n const instance = new ParticleEffectInstance(createVfxEffectContract(reflection), {\n channels: effect.program.emitters.flatMap((emitter) => emitter.channels ?? []),\n });\n this.#instances.set(player, instance);\n return instance;\n } catch {\n this.#report({\n code: 'vfx-instance-commit-failed',\n expected: 'a valid reflected VFX instance contract',\n hint: 'recook the effect with a valid reflection layout before starting the player',\n detail: { player },\n });\n return undefined;\n }\n }\n\n #latestIntent(player: EntityHandle, emitterId: string): VfxGpuTickIntent | undefined {\n let latest = this.#lastCommittedByEmitter.get(player)?.get(emitterId);\n for (let index = this.#intents.length - 1; index >= 0; index -= 1) {\n const intent = this.#intents[index];\n if (intent?.player !== player || intent.emitter.id !== emitterId) continue;\n if (latest === undefined || intent.sequence > latest.sequence) latest = intent;\n break;\n }\n return latest;\n }\n}\n\nfunction spawnCount(\n emitter: VfxGpuEmitterProgramAny,\n previous: number,\n next: number,\n firstTick: boolean,\n priorRemainder: number,\n): { readonly count: number; readonly remainder: number } {\n const exactRate = emitter.schedule.rate * Math.max(0, next - previous) + priorRemainder;\n let count = Math.floor(exactRate);\n const loop = emitter.schedule.loopDuration;\n for (const burst of emitter.schedule.bursts ?? []) {\n if (loop === undefined) {\n if ((firstTick && burst.time === 0) || (burst.time > previous && burst.time <= next)) {\n count += burst.count;\n }\n continue;\n }\n const firstOccurrence = Math.max(0, Math.floor((previous - burst.time) / loop) + 1);\n const lastOccurrence = Math.floor((next - burst.time) / loop);\n const occurrences = Math.max(0, lastOccurrence - firstOccurrence + 1);\n count += occurrences * burst.count;\n if (firstTick && burst.time === 0) count += burst.count;\n }\n return { count, remainder: exactRate - Math.floor(exactRate) };\n}\n\nexport function vfxGpuRuntimePlugin(options: VfxGpuRuntimeOptions = {}): Plugin {\n const rows: {\n player: EntityHandle;\n effect: Handle<'ParticleEffectAsset', 'shared'>;\n playing: boolean;\n seed: number;\n timeScale: number;\n }[] = [];\n return {\n name: 'vfx-gpu-runtime',\n inject: ['world'],\n apply(ctx) {\n const world = ctx.world;\n if (world.hasResource(VFX_GPU_RUNTIME_RESOURCE_KEY)) {\n throw new TypeError(`${VFX_GPU_RUNTIME_RESOURCE_KEY} already exists`);\n }\n const runtime = new VfxGpuRuntime(options);\n ctx.effect(() => {\n world.insertResource(VFX_GPU_RUNTIME_RESOURCE_KEY, runtime);\n return () => {\n world.removeResource(VFX_GPU_RUNTIME_RESOURCE_KEY);\n };\n }, 'vfx/runtime-resource');\n ctx.effect(() => {\n world\n .addSystem(FixedUpdate, {\n name: 'vfx-gpu-runtime',\n queries: [{ with: [Entity, ParticleEffectPlayer] }],\n fn: (world, queryResults) => {\n rows.length = 0;\n for (const row of queryResults[0]) {\n const player = row.get(ParticleEffectPlayer);\n rows.push({\n player: row.entity,\n effect: toShared<'ParticleEffectAsset'>(player.effect),\n playing: player.playing,\n seed: player.seed,\n timeScale: player.timeScale,\n });\n }\n const fixed = world.getResource(FixedTime);\n runtime.advance(world, fixed.tick, fixed.delta, rows);\n },\n })\n .unwrap();\n return () => world.removeSystem(FixedUpdate, 'vfx-gpu-runtime');\n }, 'vfx/tick-system');\n },\n };\n}\n","import type { VfxReflectedField, VfxReflectedStruct, VfxValueType } from './effect-contract.js';\n\n/**\n * The particle core is a storage-buffer ABI, not a convenient object shape.\n * Keep its fields in one ordered schema so WGSL, host-side allocation and\n * renderer projections all consume the same offsets.\n */\nexport type VfxParticleCoreAttribute =\n | 'position'\n | 'age'\n | 'velocity'\n | 'lifetime'\n | 'color'\n | 'sprite_size'\n | 'sprite_rotation'\n | 'sub_image'\n | 'mesh_orientation'\n | 'mesh_scale'\n | 'material_random'\n | 'id'\n | 'alive';\n\nexport interface VfxParticleCoreField {\n readonly name: VfxParticleCoreAttribute;\n readonly type: VfxValueType | 'u32';\n readonly offset: number;\n readonly size: number;\n readonly alignment: number;\n}\n\nexport interface VfxParticleCoreLayout {\n readonly name: 'VfxParticle';\n readonly fields: readonly VfxParticleCoreField[];\n readonly size: number;\n readonly alignment: 16;\n readonly stride: number;\n readonly fingerprint: string;\n}\n\nconst CORE_FIELDS: readonly VfxParticleCoreField[] = Object.freeze([\n { name: 'position', type: 'vec3<f32>', offset: 0, size: 12, alignment: 16 },\n { name: 'age', type: 'f32', offset: 12, size: 4, alignment: 4 },\n { name: 'velocity', type: 'vec3<f32>', offset: 16, size: 12, alignment: 16 },\n { name: 'lifetime', type: 'f32', offset: 28, size: 4, alignment: 4 },\n { name: 'color', type: 'vec4<f32>', offset: 32, size: 16, alignment: 16 },\n { name: 'sprite_size', type: 'vec2<f32>', offset: 48, size: 8, alignment: 8 },\n { name: 'sprite_rotation', type: 'f32', offset: 56, size: 4, alignment: 4 },\n { name: 'sub_image', type: 'f32', offset: 60, size: 4, alignment: 4 },\n { name: 'mesh_orientation', type: 'vec4<f32>', offset: 64, size: 16, alignment: 16 },\n { name: 'mesh_scale', type: 'vec3<f32>', offset: 80, size: 12, alignment: 16 },\n { name: 'material_random', type: 'f32', offset: 92, size: 4, alignment: 4 },\n { name: 'id', type: 'u32', offset: 96, size: 4, alignment: 4 },\n { name: 'alive', type: 'u32', offset: 100, size: 4, alignment: 4 },\n]);\n\n/** Program v3 core layout. The 112-byte stride includes WGSL's final 16-byte alignment. */\nexport const VFX_PARTICLE_CORE_LAYOUT: VfxParticleCoreLayout = Object.freeze({\n name: 'VfxParticle',\n fields: CORE_FIELDS,\n size: 112,\n alignment: 16,\n stride: 112,\n fingerprint: 'sha256:9e3c1566f6d0600cedb94bd3c4b76c4e7c456fd563b37065220d4e33cf83c777',\n});\n\nexport const VFX_PARTICLE_CORE_STRIDE = VFX_PARTICLE_CORE_LAYOUT.stride;\n\nconst CORE_FIELD_BY_NAME = new Map(CORE_FIELDS.map((field) => [field.name, field]));\n\nexport function vfxParticleCoreField(name: VfxParticleCoreAttribute): VfxParticleCoreField {\n // The table is closed above; this branch makes an accidental edit fail loudly in development.\n const field = CORE_FIELD_BY_NAME.get(name);\n if (field === undefined) throw new Error(`unknown VFX particle core field ${name}`);\n return field;\n}\n\n/** WGSL declaration generated from the core schema. */\nexport function vfxParticleCoreWgsl(): string {\n return [\n 'struct VfxParticle {',\n ...CORE_FIELDS.map((field) => ` ${field.name}: ${field.type},`),\n '}',\n ].join('\\n');\n}\n\n/** Effect-level data is intentionally separate from per-particle custom data. */\nexport interface VfxParametersLayout extends VfxReflectedStruct {\n readonly name: 'VfxParameters';\n}\n\nexport interface VfxCustomLayout extends VfxReflectedStruct {\n readonly name: 'VfxCustom';\n /** Array stride for `array<VfxCustom>` in the persistent GPU storage buffer. */\n readonly stride: number;\n /** Number of vec4-equivalent lanes consumed by the custom record. */\n readonly lanes: number;\n}\n\nconst VALUE_LAYOUT: Readonly<\n Record<VfxValueType, { readonly alignment: number; readonly size: number }>\n> = {\n f32: { alignment: 4, size: 4 },\n i32: { alignment: 4, size: 4 },\n u32: { alignment: 4, size: 4 },\n 'vec2<f32>': { alignment: 8, size: 8 },\n 'vec3<f32>': { alignment: 16, size: 12 },\n 'vec4<f32>': { alignment: 16, size: 16 },\n};\n\nfunction alignUp(value: number, alignment: number): number {\n return Math.ceil(value / alignment) * alignment;\n}\n\n/** Re-derive custom offsets from reflected fields and reject the bounded renderer budget. */\nexport function deriveVfxCustomLayout(struct: VfxReflectedStruct, maxLanes = 4): VfxCustomLayout {\n if (struct.name !== 'VfxCustom') {\n throw new TypeError(`expected VfxCustom reflection, received ${struct.name}`);\n }\n const fields: VfxReflectedField[] = [];\n let offset = 0;\n let alignment = 1;\n for (const field of struct.fields) {\n const layout = VALUE_LAYOUT[field.type];\n offset = alignUp(offset, layout.alignment);\n fields.push({ ...field, offset, size: layout.size, alignment: layout.alignment });\n offset += layout.size;\n alignment = Math.max(alignment, layout.alignment);\n }\n const size = fields.length === 0 ? 0 : alignUp(offset, alignment);\n // Storage arrays use the WGSL struct alignment, not uniform/vec4 lane\n // alignment. Lanes are a budget unit only, never an alternate GPU ABI.\n const stride = size;\n const lanes = Math.ceil(stride / 16);\n if (lanes > maxLanes) {\n throw new RangeError(`VfxCustom consumes ${lanes} vec4 lanes; maximum is ${maxLanes}`);\n }\n return Object.freeze({\n name: 'VfxCustom',\n fields: Object.freeze(fields),\n size,\n alignment,\n stride,\n lanes,\n });\n}\n\nexport type VfxParticleCoreValue =\n | readonly [number, number, number]\n | readonly [number, number, number, number]\n | readonly [number, number]\n | number;\n\nexport interface VfxParticleCoreValues {\n readonly position: readonly [number, number, number];\n readonly age: number;\n readonly velocity: readonly [number, number, number];\n readonly lifetime: number;\n readonly color: readonly [number, number, number, number];\n readonly sprite_size: readonly [number, number];\n readonly sprite_rotation: number;\n readonly sub_image: number;\n readonly mesh_orientation: readonly [number, number, number, number];\n readonly mesh_scale: readonly [number, number, number];\n readonly material_random: number;\n readonly id: number;\n readonly alive: number;\n}\n\nfunction finite(value: number): boolean {\n return Number.isFinite(value);\n}\n\n/** Pack a core record using schema offsets. This is for inspection/replay fixtures, not a particle mirror. */\nexport function encodeVfxParticleCore(value: VfxParticleCoreValues): Uint8Array {\n const bytes = new Uint8Array(VFX_PARTICLE_CORE_STRIDE);\n const view = new DataView(bytes.buffer);\n const write = (name: VfxParticleCoreAttribute, values: readonly number[]): void => {\n const field = vfxParticleCoreField(name);\n for (const component of values) {\n if (!finite(component)) throw new TypeError(`non-finite VFX particle field ${name}`);\n if (\n field.type === 'u32' &&\n (!Number.isInteger(component) || component < 0 || component > 0xffffffff)\n ) {\n throw new RangeError(`u32 VFX particle field ${name} is outside its valid range`);\n }\n }\n for (let index = 0; index < values.length; index += 1) {\n const component = values[index] ?? 0;\n if (field.type === 'u32') view.setUint32(field.offset + index * 4, component, true);\n else view.setFloat32(field.offset + index * 4, component, true);\n }\n };\n write('position', value.position);\n write('age', [value.age]);\n write('velocity', value.velocity);\n write('lifetime', [value.lifetime]);\n write('color', value.color);\n write('sprite_size', value.sprite_size);\n write('sprite_rotation', [value.sprite_rotation]);\n write('sub_image', [value.sub_image]);\n write('mesh_orientation', value.mesh_orientation);\n write('mesh_scale', value.mesh_scale);\n write('material_random', [value.material_random]);\n write('id', [value.id]);\n write('alive', [value.alive]);\n return bytes;\n}\n\n/** Return the normalized age used by all renderer semantic projections. */\nexport function normalizedVfxParticleAge(age: number, lifetime: number): number {\n if (!finite(age) || !finite(lifetime) || lifetime <= 0) return 0;\n return Math.min(1, Math.max(0, age / lifetime));\n}\n"]}