@cazala/party 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/runtimes/webgpu/shaders.ts","../src/runtimes/webgpu/gpu-resources.ts","../src/runtimes/webgpu/particle-store.ts","../src/view.ts","../src/oscillators.ts","../src/interfaces.ts","../src/module.ts","../src/runtimes/webgpu/builders/program.ts","../src/runtimes/webgpu/module-registry.ts","../src/runtimes/webgpu/spacial-grid.ts","../src/runtimes/webgpu/simulation-pipeline.ts","../src/runtimes/webgpu/builders/render-pass.ts","../src/runtimes/webgpu/render-pipeline.ts","../src/runtimes/webgpu/engine.ts","../src/runtimes/cpu/spatial-grid.ts","../src/vector.ts","../src/particle.ts","../src/runtimes/cpu/engine.ts","../src/engine.ts","../src/spawner.ts","../src/modules/forces/environment.ts","../src/modules/forces/boundary.ts","../src/modules/forces/collisions.ts","../src/modules/forces/fluids.ts","../src/modules/forces/behavior.ts","../src/modules/forces/sensors.ts","../src/modules/forces/interaction.ts","../src/modules/forces/joints.ts","../src/modules/forces/grab.ts","../src/modules/render/trails.ts","../src/modules/render/lines.ts","../src/modules/render/particles.ts"],"sourcesContent":["/**\n * Presentation shader (copy)\n *\n * Minimal fullscreen copy shader used to present the rendered scene texture to the canvas.\n * A small pipeline built with this WGSL is cached per canvas format.\n */\nexport const copyShaderWGSL = `\nstruct VertexOutput {\n @builtin(position) position: vec4<f32>,\n @location(0) uv: vec2<f32>,\n}\n\n@group(0) @binding(0) var source_texture: texture_2d<f32>;\n@group(0) @binding(1) var source_sampler: sampler;\n\n@vertex\nfn vs_main(@builtin(vertex_index) vertex_index: u32) -> VertexOutput {\n var out: VertexOutput;\n let positions = array<vec2<f32>, 4>(\n vec2<f32>(-1.0, -1.0),\n vec2<f32>( 1.0, -1.0),\n vec2<f32>(-1.0, 1.0),\n vec2<f32>( 1.0, 1.0)\n );\n let uvs = array<vec2<f32>, 4>(\n vec2<f32>(0.0, 1.0),\n vec2<f32>(1.0, 1.0),\n vec2<f32>(0.0, 0.0),\n vec2<f32>(1.0, 0.0)\n );\n let index = vertex_index % 4u;\n out.position = vec4<f32>(positions[index], 0.0, 1.0);\n out.uv = uvs[index];\n return out;\n}\n\n@fragment\nfn fs_main(@location(0) uv: vec2<f32>) -> @location(0) vec4<f32> {\n return textureSample(source_texture, source_sampler, uv);\n}`;\n","/**\n * GPUResources\n *\n * Low-level WebGPU resource manager. Responsible for:\n * - Adapter/device/context acquisition and canvas configuration\n * - Creation and caching of GPU buffers, textures, bind group layouts, and pipelines\n * - Managing ping-pong scene textures and a small shader cache keyed by WGSL hashes\n * - Building compute pipeline layouts from the generated Program and creating per-pass pipelines\n * - Providing helpers to write CPU data into GPU buffers and to create bind groups\n * - Cleaning up all GPU objects on dispose\n */\nimport { copyShaderWGSL } from \"./shaders\";\nimport type { Program, ModuleUniformLayout } from \"./builders/program\";\nimport { ViewSnapshot } from \"../../view\";\n\nexport interface SceneTextures {\n a: GPUTexture;\n b: GPUTexture;\n viewA: GPUTextureView;\n viewB: GPUTextureView;\n sampler: GPUSampler;\n}\n\nexport type ModuleUniformBuffer = {\n buffer: GPUBuffer;\n layout: ModuleUniformLayout;\n};\n\nexport interface SimulationPipelines {\n gridClear?: GPUComputePipeline;\n gridBuild?: GPUComputePipeline;\n state?: GPUComputePipeline;\n apply?: GPUComputePipeline;\n integrate?: GPUComputePipeline;\n constrain?: GPUComputePipeline;\n correct?: GPUComputePipeline;\n main?: GPUComputePipeline; // fallback main\n}\n\nexport class GPUResources {\n private particleBuffer: GPUBuffer | null = null;\n private moduleUniformBuffers: ModuleUniformBuffer[] = [];\n private combinedArrayStorageBuffers: Map<string, GPUBuffer> = new Map(); // moduleName -> combined buffer\n private arrayStorageBuffers: Map<string, GPUBuffer> = new Map();\n private arrayLengthBuffers: Map<string, GPUBuffer> = new Map();\n private renderUniformBuffer: GPUBuffer | null = null;\n private renderBindGroupLayoutCache: Map<string, GPUBindGroupLayout> | null =\n null;\n private computeBindGroupLayout: GPUBindGroupLayout | null = null;\n private computePipelineLayout: GPUPipelineLayout | null = null;\n private simulationPipelines: SimulationPipelines = {};\n private gridCountsBuffer: GPUBuffer | null = null;\n private gridIndicesBuffer: GPUBuffer | null = null;\n private simStateBuffer: GPUBuffer | null = null;\n private scene: SceneTextures | null = null;\n private currentScene: \"A\" | \"B\" = \"A\";\n private sceneSize: { width: number; height: number } | null = null;\n private copyPipelines: Map<string, GPURenderPipeline> = new Map();\n private simUniformCache: Float32Array | null = null;\n private fullscreenPipelines: Map<string, GPURenderPipeline> = new Map();\n private imageComputePipelines: Map<string, GPUComputePipeline> = new Map();\n private hashWGSL(code: string): string {\n // djb2\n let h = 5381;\n for (let i = 0; i < code.length; i++)\n h = ((h << 5) + h) ^ code.charCodeAt(i);\n return (h >>> 0).toString(36);\n }\n\n public canvas: HTMLCanvasElement;\n public requiredFeatures: GPUFeatureName[] = [];\n public device: GPUDevice | null = null;\n public context: GPUCanvasContext | null = null;\n public adapter: GPUAdapter | null = null;\n public format: GPUTextureFormat = \"bgra8unorm\";\n\n // Tracks an in-flight dispose so we can (a) avoid overlapping cleanups and\n // (b) wait for cleanup before re-initializing on rapid reloads.\n private disposePromise: Promise<void> | null = null;\n\n constructor(options: {\n canvas: HTMLCanvasElement;\n requiredFeatures?: GPUFeatureName[];\n }) {\n this.canvas = options.canvas;\n this.requiredFeatures = options.requiredFeatures || [];\n }\n\n async initialize(): Promise<void> {\n if (this.isInitialized()) return;\n if (!navigator.gpu) {\n throw new Error(\"WebGPU not supported\");\n }\n\n // If we're in the middle of disposing (common during rapid reloads / runtime toggles),\n // wait for it to finish before requesting a new adapter/device.\n if (this.disposePromise) {\n try {\n await this.disposePromise;\n } catch {\n // ignore\n }\n }\n\n // Safari workaround: Ensure canvas is visible and has dimensions before WebGPU initialization\n // Safari requires the canvas to be properly sized and in the DOM before getting WebGPU context\n if (this.canvas.width === 0 || this.canvas.height === 0) {\n // Set minimum dimensions if canvas has no size\n const rect = this.canvas.getBoundingClientRect();\n if (rect.width > 0 && rect.height > 0) {\n this.canvas.width = rect.width;\n this.canvas.height = rect.height;\n } else {\n // Fallback to reasonable defaults\n this.canvas.width = 800;\n this.canvas.height = 600;\n }\n }\n\n // Helper function to add timeout to async operations\n const withTimeout = <T>(\n promise: Promise<T>,\n timeoutMs: number,\n operation: string\n ): Promise<T> => {\n return Promise.race([\n promise,\n new Promise<T>((_, reject) =>\n setTimeout(\n () => reject(new Error(`WebGPU ${operation} timed out after ${timeoutMs}ms`)),\n timeoutMs\n )\n ),\n ]);\n };\n\n try {\n // Step 1: Request adapter with timeout\n this.adapter = await withTimeout(\n navigator.gpu.requestAdapter(),\n 5000,\n \"adapter request\"\n );\n\n if (!this.adapter) {\n throw new Error(\"Failed to get WebGPU adapter\");\n }\n\n // Step 2: Request device with timeout\n // Request the maximum buffer size limit to avoid buffer size errors\n const maxBufferSize = this.adapter.limits.maxBufferSize || this.adapter.limits.maxStorageBufferBindingSize;\n this.device = await withTimeout(\n this.adapter.requestDevice({\n requiredFeatures: this.requiredFeatures || [],\n requiredLimits: {\n maxStorageBufferBindingSize: this.adapter.limits.maxStorageBufferBindingSize,\n maxBufferSize: maxBufferSize,\n },\n }),\n 5000,\n \"device request\"\n );\n\n // Step 3: Get WebGPU context\n this.context = this.canvas.getContext(\"webgpu\");\n if (!this.context) {\n throw new Error(\"Failed to get WebGPU context\");\n }\n\n // Step 4: Get preferred format\n // Note: getPreferredCanvasFormat() is synchronous, so we can't timeout it\n // If it hangs, the browser is likely in a bad state\n try {\n this.format = navigator.gpu.getPreferredCanvasFormat();\n } catch (error) {\n // Safari fallback: use a default format if getPreferredCanvasFormat fails\n console.warn(\"[WebGPU] getPreferredCanvasFormat failed, using fallback format:\", error);\n this.format = \"bgra8unorm\"; // Default format\n }\n\n // Step 5: Configure context\n this.context.configure({\n device: this.device,\n format: this.format,\n alphaMode: \"premultiplied\",\n });\n } catch (error) {\n console.error(\"[WebGPU] Initialization failed:\", error);\n // Clean up any partial state\n this.adapter = null;\n this.device = null;\n this.context = null;\n throw error;\n }\n }\n\n /**\n * Starts disposal (idempotent) and returns a promise you can await *optionally*.\n * We keep the public destroy()/dispose() calls synchronous to avoid breaking runtime toggle,\n * but callers that care (like runtime toggle) can await this promise.\n */\n isInitialized(): boolean {\n return this.device !== null && this.context !== null;\n }\n\n getDevice(): GPUDevice {\n if (!this.device) throw new Error(\"Device not initialized\");\n return this.device;\n }\n\n getContext(): GPUCanvasContext {\n if (!this.context) throw new Error(\"Context not initialized\");\n return this.context;\n }\n\n getParticleBuffer(): GPUBuffer | null {\n return this.particleBuffer;\n }\n\n getModuleUniformBuffers(): ModuleUniformBuffer[] {\n return this.moduleUniformBuffers;\n }\n\n getRenderUniformBuffer(): GPUBuffer | null {\n return this.renderUniformBuffer;\n }\n\n getGridCountsBuffer(): GPUBuffer | null {\n return this.gridCountsBuffer;\n }\n\n getGridIndicesBuffer(): GPUBuffer | null {\n return this.gridIndicesBuffer;\n }\n\n getSimStateBuffer(): GPUBuffer | null {\n return this.simStateBuffer;\n }\n\n createParticleBuffer(maxParticles: number, floatsPerParticle: number): void {\n const size = maxParticles * floatsPerParticle * 4;\n this.particleBuffer?.destroy();\n this.particleBuffer = this.getDevice().createBuffer({\n size,\n usage:\n GPUBufferUsage.STORAGE |\n GPUBufferUsage.COPY_DST |\n GPUBufferUsage.COPY_SRC,\n });\n }\n\n writeParticleSlice(offsetFloats: number, data: Float32Array): void {\n if (!this.particleBuffer) return;\n this.getDevice().queue.writeBuffer(\n this.particleBuffer,\n offsetFloats * 4,\n data.buffer,\n data.byteOffset,\n data.byteLength\n );\n }\n\n writeParticleBuffer(data: Float32Array): void {\n if (!this.particleBuffer) return;\n this.getDevice().queue.writeBuffer(\n this.particleBuffer,\n 0,\n data.buffer,\n data.byteOffset,\n data.byteLength\n );\n }\n\n /**\n * Reads particle data back from GPU to CPU\n */\n async readParticleBuffer(sizeFloats: number): Promise<Float32Array> {\n if (!this.particleBuffer) {\n throw new Error(\"Particle buffer not initialized\");\n }\n\n const sizeBytes = sizeFloats * 4;\n\n // Create staging buffer for readback\n const stagingBuffer = this.getDevice().createBuffer({\n size: sizeBytes,\n usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,\n });\n\n try {\n // Copy from particle buffer to staging buffer\n const encoder = this.getDevice().createCommandEncoder();\n encoder.copyBufferToBuffer(\n this.particleBuffer,\n 0,\n stagingBuffer,\n 0,\n sizeBytes\n );\n\n // Submit commands and wait for completion\n this.getDevice().queue.submit([encoder.finish()]);\n await this.getDevice().queue.onSubmittedWorkDone();\n\n // Map and read the staging buffer\n await stagingBuffer.mapAsync(GPUMapMode.READ);\n const arrayBuffer = stagingBuffer.getMappedRange();\n const data = new Float32Array(arrayBuffer.slice(0));\n stagingBuffer.unmap();\n\n return data;\n } finally {\n stagingBuffer.destroy();\n }\n }\n\n createModuleUniformBuffers(layouts: ModuleUniformLayout[]): void {\n // Destroy old\n this.moduleUniformBuffers.forEach(({ buffer }) => buffer.destroy());\n this.moduleUniformBuffers = layouts.map((layout) => ({\n buffer: this.getDevice().createBuffer({\n size: layout.sizeBytes,\n usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n }),\n layout: layout,\n }));\n }\n\n createRenderUniformBuffer(byteSize: number): void {\n this.renderUniformBuffer?.destroy();\n this.renderUniformBuffer = this.getDevice().createBuffer({\n size: byteSize,\n usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n });\n }\n\n writeRenderUniforms(snapshot: ViewSnapshot): void {\n const data = new Float32Array([\n snapshot.width,\n snapshot.height,\n snapshot.cx,\n snapshot.cy,\n snapshot.zoom,\n 0,\n ]);\n if (!this.renderUniformBuffer) return;\n this.getDevice().queue.writeBuffer(\n this.renderUniformBuffer,\n 0,\n data.buffer,\n data.byteOffset,\n data.byteLength\n );\n }\n\n writeModuleUniform(index: number, data: ArrayBufferView, offset = 0): void {\n const muf = this.moduleUniformBuffers[index];\n if (!muf) return;\n this.getDevice().queue.writeBuffer(\n muf.buffer,\n offset,\n data.buffer,\n data.byteOffset,\n data.byteLength\n );\n }\n\n /**\n * Writes simulation uniforms (dt, count, simStride) into the internal\n * 'simulation' uniform buffer using the provided Program's layout.\n */\n writeSimulationUniform(\n program: Program,\n values: {\n dt?: number;\n count?: number;\n simStride?: number;\n maxSize?: number;\n iteration?: number;\n maxNeighbors?: number;\n maxParticles?: number;\n }\n ): void {\n const idx = program.layouts.findIndex((l) => l.moduleName === \"simulation\");\n if (idx === -1) return;\n const layout = program.layouts[idx];\n const map = layout.mapping as Record<string, { flatIndex: number }>;\n // Start from cache to preserve previously written fields across partial updates\n const data =\n this.simUniformCache?.length === layout.vec4Count * 4\n ? new Float32Array(this.simUniformCache)\n : new Float32Array(layout.vec4Count * 4);\n if (values.dt !== undefined && map.dt) data[map.dt.flatIndex] = values.dt;\n if (values.count !== undefined && map.count)\n data[map.count.flatIndex] = values.count;\n if (values.simStride !== undefined && map.simStride)\n data[map.simStride.flatIndex] = values.simStride;\n if (values.maxSize !== undefined && map.maxSize)\n data[map.maxSize.flatIndex] = values.maxSize;\n if (values.iteration !== undefined && map.iteration)\n data[map.iteration.flatIndex] = values.iteration;\n if (values.maxNeighbors !== undefined && map.maxNeighbors)\n data[map.maxNeighbors.flatIndex] = values.maxNeighbors;\n if (values.maxParticles !== undefined && map.maxParticles)\n data[map.maxParticles.flatIndex] = values.maxParticles;\n this.writeModuleUniform(idx, data);\n this.simUniformCache = data;\n }\n\n ensureSceneTextures(width: number, height: number): void {\n // Validate dimensions (must be within unsigned long range: 0 to 2^32-1)\n // Also clamp to reasonable maximum to avoid GPU memory issues\n const maxDimension = 16384; // Reasonable max texture size\n const validWidth = Math.max(1, Math.min(Math.floor(width), maxDimension));\n const validHeight = Math.max(1, Math.min(Math.floor(height), maxDimension));\n \n if (width !== validWidth || height !== validHeight) {\n console.warn(\n `[WebGPU] Texture dimensions clamped from ${width}x${height} to ${validWidth}x${validHeight}`\n );\n }\n\n const needInit = !this.scene;\n const changed =\n !this.sceneSize ||\n this.sceneSize.width !== validWidth ||\n this.sceneSize.height !== validHeight;\n if (!needInit && !changed) return;\n\n // Destroy old textures if present\n if (this.scene) {\n this.scene.a.destroy();\n this.scene.b.destroy();\n }\n\n const texDesc: GPUTextureDescriptor = {\n size: { width: validWidth, height: validHeight, depthOrArrayLayers: 1 },\n format: \"rgba8unorm\",\n usage:\n GPUTextureUsage.STORAGE_BINDING |\n GPUTextureUsage.TEXTURE_BINDING |\n GPUTextureUsage.COPY_DST |\n GPUTextureUsage.RENDER_ATTACHMENT,\n };\n const a = this.getDevice().createTexture(texDesc);\n const b = this.getDevice().createTexture(texDesc);\n const viewA = a.createView();\n const viewB = b.createView();\n const sampler = this.getDevice().createSampler({\n magFilter: \"linear\",\n minFilter: \"linear\",\n addressModeU: \"clamp-to-edge\",\n addressModeV: \"clamp-to-edge\",\n });\n this.scene = { a, b, viewA, viewB, sampler };\n this.sceneSize = { width: validWidth, height: validHeight };\n this.currentScene = \"A\";\n }\n\n createGridStorage(totalCells: number, maxPerCell: number): void {\n const countsSize = totalCells * 4;\n const indicesSize = totalCells * maxPerCell * 4;\n this.gridCountsBuffer?.destroy();\n this.gridIndicesBuffer?.destroy();\n this.gridCountsBuffer = this.getDevice().createBuffer({\n size: countsSize,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n this.gridIndicesBuffer = this.getDevice().createBuffer({\n size: indicesSize,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n }\n\n createSimStateBuffer(maxParticles: number, strideFloats: number): void {\n const size = maxParticles * strideFloats * 4;\n this.simStateBuffer?.destroy();\n this.simStateBuffer = this.getDevice().createBuffer({\n size,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n }\n\n getCurrentSceneTextureView(): GPUTextureView {\n if (!this.scene) throw new Error(\"Scene textures not initialized\");\n return this.currentScene === \"A\" ? this.scene.viewA : this.scene.viewB;\n }\n\n getOtherSceneTextureView(): GPUTextureView {\n if (!this.scene) throw new Error(\"Scene textures not initialized\");\n return this.currentScene === \"A\" ? this.scene.viewB : this.scene.viewA;\n }\n\n getSceneSampler(): GPUSampler {\n if (!this.scene) throw new Error(\"Scene textures not initialized\");\n return this.scene.sampler;\n }\n\n swapSceneTextures(): void {\n this.currentScene = this.currentScene === \"A\" ? \"B\" : \"A\";\n }\n\n getRenderBindGroupLayout(\n arrayInputs?: string[],\n fragmentParticleAccess?: boolean\n ): GPUBindGroupLayout {\n // Create a cache key based on array inputs and fragment access\n const cacheKey = arrayInputs\n ? `render_${arrayInputs.sort().join(\"_\")}_frag_${\n fragmentParticleAccess || false\n }`\n : `render_basic_frag_${fragmentParticleAccess || false}`;\n\n // Check if we have a cached layout for this configuration\n if (!this.renderBindGroupLayoutCache) {\n this.renderBindGroupLayoutCache = new Map();\n }\n\n const cached = this.renderBindGroupLayoutCache.get(cacheKey);\n if (cached) return cached;\n\n const entries: GPUBindGroupLayoutEntry[] = [\n {\n binding: 0,\n visibility: fragmentParticleAccess\n ? GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT\n : GPUShaderStage.VERTEX,\n buffer: { type: \"read-only-storage\" },\n },\n {\n binding: 1,\n visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n {\n binding: 2,\n visibility: GPUShaderStage.FRAGMENT,\n texture: { sampleType: \"float\" },\n },\n {\n binding: 3,\n visibility: GPUShaderStage.FRAGMENT,\n sampler: {},\n },\n {\n binding: 4,\n visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n ];\n\n // Add single combined array storage buffer entry if module has arrays\n if (arrayInputs && arrayInputs.length > 0) {\n entries.push({\n binding: 5,\n visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n buffer: { type: \"read-only-storage\" },\n });\n }\n\n const layout = this.getDevice().createBindGroupLayout({ entries });\n this.renderBindGroupLayoutCache.set(cacheKey, layout);\n return layout;\n }\n\n buildComputeLayouts(compute: Program): void {\n const entries: GPUBindGroupLayoutEntry[] = [];\n entries.push({\n binding: 0,\n visibility: GPUShaderStage.COMPUTE,\n buffer: { type: \"storage\" },\n });\n for (const layout of compute.layouts) {\n // Only include internal and force-module uniforms in compute bind group layout\n if (\n layout.moduleName === \"simulation\" ||\n layout.moduleName === \"grid\" ||\n layout.moduleRole === \"force\"\n ) {\n entries.push({\n binding: layout.bindingIndex,\n visibility: GPUShaderStage.COMPUTE,\n buffer: { type: \"uniform\" },\n });\n }\n }\n // Add combined array storage buffer bindings (one per module)\n if (compute.extraBindings.arrays) {\n for (const [_moduleName, bindings] of Object.entries(\n compute.extraBindings.arrays\n )) {\n entries.push({\n binding: bindings.arrayBinding,\n visibility: GPUShaderStage.COMPUTE,\n buffer: { type: \"read-only-storage\" },\n });\n // Length is now stored in main uniform buffer, no separate binding needed\n }\n }\n if (compute.extraBindings.grid) {\n entries.push({\n binding: compute.extraBindings.grid.countsBinding,\n visibility: GPUShaderStage.COMPUTE,\n buffer: { type: \"storage\" },\n });\n entries.push({\n binding: compute.extraBindings.grid.indicesBinding,\n visibility: GPUShaderStage.COMPUTE,\n buffer: { type: \"storage\" },\n });\n }\n if (compute.extraBindings.simState) {\n entries.push({\n binding: compute.extraBindings.simState.stateBinding,\n visibility: GPUShaderStage.COMPUTE,\n buffer: { type: \"storage\" },\n });\n }\n if (compute.extraBindings.sceneTexture) {\n entries.push({\n binding: compute.extraBindings.sceneTexture.textureBinding,\n visibility: GPUShaderStage.COMPUTE,\n texture: { sampleType: \"float\" },\n });\n }\n this.computeBindGroupLayout = this.getDevice().createBindGroupLayout({\n entries,\n });\n this.computePipelineLayout = this.getDevice().createPipelineLayout({\n bindGroupLayouts: [this.computeBindGroupLayout],\n });\n }\n\n getComputeBindGroupLayout(): GPUBindGroupLayout {\n if (!this.computeBindGroupLayout)\n throw new Error(\"Compute bind group layout not built\");\n return this.computeBindGroupLayout;\n }\n\n buildComputePipelines(code: string): void {\n if (!this.computeBindGroupLayout || !this.computePipelineLayout) return;\n const module = this.getDevice().createShaderModule({ code });\n const createComputePipelineForEntry = (\n entryPoint: string\n ): GPUComputePipeline =>\n this.getDevice().createComputePipeline({\n layout: this.computePipelineLayout!,\n compute: { module, entryPoint },\n });\n const safeCreateComputePipelineForEntry = (\n entryPoint: string\n ): GPUComputePipeline | undefined => {\n try {\n return createComputePipelineForEntry(entryPoint);\n } catch {\n return undefined;\n }\n };\n this.simulationPipelines = {\n main: safeCreateComputePipelineForEntry(\"main\"),\n gridClear: safeCreateComputePipelineForEntry(\"grid_clear\"),\n gridBuild: safeCreateComputePipelineForEntry(\"grid_build\"),\n state: safeCreateComputePipelineForEntry(\"state_pass\"),\n apply: safeCreateComputePipelineForEntry(\"apply_pass\"),\n integrate: safeCreateComputePipelineForEntry(\"integrate_pass\"),\n constrain: safeCreateComputePipelineForEntry(\"constrain_pass\"),\n correct: safeCreateComputePipelineForEntry(\"correct_pass\"),\n };\n }\n\n getSimulationPipelines(): SimulationPipelines {\n return this.simulationPipelines;\n }\n\n getCopyPipeline(format: GPUTextureFormat): GPURenderPipeline {\n const key = `copy:${format}`;\n const existing = this.copyPipelines.get(key);\n if (existing) return existing;\n const copyBindGroupLayout = this.getDevice().createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: GPUShaderStage.FRAGMENT,\n texture: { sampleType: \"float\" },\n },\n {\n binding: 1,\n visibility: GPUShaderStage.FRAGMENT,\n sampler: {},\n },\n ],\n });\n const layout = this.getDevice().createPipelineLayout({\n bindGroupLayouts: [copyBindGroupLayout],\n });\n const shaderModule = this.getDevice().createShaderModule({\n code: copyShaderWGSL,\n });\n const pipeline = this.getDevice().createRenderPipeline({\n layout,\n vertex: { module: shaderModule, entryPoint: \"vs_main\" },\n fragment: {\n module: shaderModule,\n entryPoint: \"fs_main\",\n targets: [\n {\n format,\n // No blending: present should overwrite canvas with scene texture\n },\n ],\n },\n primitive: { topology: \"triangle-strip\" },\n });\n this.copyPipelines.set(key, pipeline);\n return pipeline;\n }\n\n getOrCreateFullscreenRenderPipeline(\n shaderCode: string,\n arrayInputs?: string[],\n fragmentParticleAccess?: boolean\n ): GPURenderPipeline {\n const arrayKey = arrayInputs?.sort().join(\"_\") || \"\";\n const key = `fs:${this.hashWGSL(shaderCode)}:${arrayKey}:frag_${\n fragmentParticleAccess || false\n }`;\n const cached = this.fullscreenPipelines.get(key);\n if (cached) return cached;\n const shaderModule = this.getDevice().createShaderModule({\n code: shaderCode,\n });\n const pipeline = this.getDevice().createRenderPipeline({\n layout: this.getDevice().createPipelineLayout({\n bindGroupLayouts: [\n this.getRenderBindGroupLayout(arrayInputs, fragmentParticleAccess),\n ],\n }),\n vertex: { module: shaderModule, entryPoint: \"vs_main\" },\n fragment: {\n module: shaderModule,\n entryPoint: \"fs_main\",\n targets: [\n {\n format: \"rgba8unorm\",\n blend: {\n color: {\n srcFactor: \"src-alpha\",\n dstFactor: \"one-minus-src-alpha\",\n },\n alpha: { srcFactor: \"one\", dstFactor: \"one-minus-src-alpha\" },\n },\n },\n ],\n },\n primitive: { topology: \"triangle-strip\" },\n });\n this.fullscreenPipelines.set(key, pipeline);\n return pipeline;\n }\n\n getOrCreateImageComputePipeline(shaderCode: string): GPUComputePipeline {\n const key = `imgc:${this.hashWGSL(shaderCode)}`;\n const cached = this.imageComputePipelines.get(key);\n if (cached) return cached;\n const shaderModule = this.getDevice().createShaderModule({\n code: shaderCode,\n });\n const pipeline = this.getDevice().createComputePipeline({\n layout: \"auto\",\n compute: { module: shaderModule, entryPoint: \"cs_main\" },\n });\n this.imageComputePipelines.set(key, pipeline);\n return pipeline;\n }\n\n createFullscreenBindGroup(\n particleBuffer: GPUBuffer,\n renderUniformBuffer: GPUBuffer,\n readSceneView: GPUTextureView,\n sceneSampler: GPUSampler,\n moduleUniformBuffer: GPUBuffer,\n moduleName: string,\n arrayInputs?: string[],\n fragmentParticleAccess?: boolean\n ): GPUBindGroup {\n const entries: GPUBindGroupEntry[] = [\n { binding: 0, resource: { buffer: particleBuffer } },\n { binding: 1, resource: { buffer: renderUniformBuffer } },\n { binding: 2, resource: readSceneView },\n { binding: 3, resource: sceneSampler },\n { binding: 4, resource: { buffer: moduleUniformBuffer } },\n ];\n\n // Add combined array storage buffer entry if module has arrays\n if (arrayInputs && arrayInputs.length > 0) {\n const combinedArrayBuffer =\n this.combinedArrayStorageBuffers.get(moduleName);\n if (combinedArrayBuffer) {\n entries.push({\n binding: 5,\n resource: { buffer: combinedArrayBuffer },\n });\n }\n }\n\n return this.getDevice().createBindGroup({\n layout: this.getRenderBindGroupLayout(\n arrayInputs,\n fragmentParticleAccess\n ),\n entries,\n });\n }\n\n createComputeBindGroup(compute: Program): GPUBindGroup {\n if (!this.computeBindGroupLayout) {\n throw new Error(\"Compute bind group layout not built\");\n }\n if (!this.particleBuffer || this.moduleUniformBuffers.some((b) => !b)) {\n throw new Error(\"Buffers not ready\");\n }\n const entries: GPUBindGroupEntry[] = [\n { binding: 0, resource: { buffer: this.particleBuffer } },\n // Include only uniforms required by compute (internal + force modules)\n ...compute.layouts\n .filter(\n (l) =>\n l.moduleName === \"simulation\" ||\n l.moduleName === \"grid\" ||\n l.moduleRole === \"force\"\n )\n .map((layout) => {\n const muf = this.moduleUniformBuffers.find(\n (b) => b.layout.moduleName === layout.moduleName\n )!;\n return {\n binding: layout.bindingIndex,\n resource: { buffer: muf.buffer },\n };\n }),\n ];\n\n // Add combined array storage buffer bindings (one per module)\n if (compute.extraBindings.arrays) {\n for (const [moduleName, bindings] of Object.entries(\n compute.extraBindings.arrays\n )) {\n const combinedArrayBuffer =\n this.combinedArrayStorageBuffers.get(moduleName);\n\n if (combinedArrayBuffer) {\n entries.push({\n binding: bindings.arrayBinding,\n resource: { buffer: combinedArrayBuffer },\n });\n // Length is now stored in main uniform buffer, no separate binding needed\n }\n }\n }\n if (\n compute.extraBindings.grid &&\n this.gridCountsBuffer &&\n this.gridIndicesBuffer\n ) {\n entries.push(\n {\n binding: compute.extraBindings.grid.countsBinding,\n resource: { buffer: this.gridCountsBuffer },\n },\n {\n binding: compute.extraBindings.grid.indicesBinding,\n resource: { buffer: this.gridIndicesBuffer },\n }\n );\n }\n if (compute.extraBindings.simState && this.simStateBuffer) {\n entries.push({\n binding: compute.extraBindings.simState.stateBinding,\n resource: { buffer: this.simStateBuffer },\n });\n }\n if (compute.extraBindings.sceneTexture) {\n entries.push({\n binding: compute.extraBindings.sceneTexture.textureBinding,\n resource: this.getCurrentSceneTextureView(),\n });\n }\n return this.getDevice().createBindGroup({\n layout: this.computeBindGroupLayout,\n entries,\n });\n }\n\n createImageComputeBindGroup(\n pipeline: GPUComputePipeline,\n readView: GPUTextureView,\n writeView: GPUTextureView,\n moduleUniformBuffer: GPUBuffer,\n moduleName: string,\n arrayInputs?: string[]\n ): GPUBindGroup {\n const layout = pipeline.getBindGroupLayout(0);\n const entries: GPUBindGroupEntry[] = [\n { binding: 0, resource: readView },\n { binding: 1, resource: writeView },\n { binding: 2, resource: { buffer: moduleUniformBuffer } },\n ];\n\n // Add combined array storage buffer entry if module has arrays\n if (arrayInputs && arrayInputs.length > 0) {\n const combinedArrayBuffer =\n this.combinedArrayStorageBuffers.get(moduleName);\n if (combinedArrayBuffer) {\n entries.push({\n binding: 3,\n resource: { buffer: combinedArrayBuffer },\n });\n }\n }\n\n return this.getDevice().createBindGroup({\n layout,\n entries,\n });\n }\n\n /**\n * Create combined array storage buffer for a module's array inputs\n */\n createCombinedArrayStorageBuffer(\n moduleName: string,\n arrayInputs: string[]\n ): void {\n // Clean up old combined buffer for this module\n const existingBuffer = this.combinedArrayStorageBuffers.get(moduleName);\n if (existingBuffer) {\n existingBuffer.destroy();\n this.combinedArrayStorageBuffers.delete(moduleName);\n }\n\n // Only create buffer if module has array inputs\n if (arrayInputs.length > 0) {\n // Create combined array storage buffer (initial size 2MB, will grow as needed)\n const combinedBuffer = this.getDevice().createBuffer({\n size: 2 * 1024 * 1024, // 2MB initial size\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n\n this.combinedArrayStorageBuffers.set(moduleName, combinedBuffer);\n }\n }\n\n /**\n * Create array storage buffers for a module's array inputs\n */\n createArrayStorageBuffers(moduleName: string, arrayInputs: string[]): void {\n // Clean up old buffers for this module\n this.arrayStorageBuffers.forEach((buffer, key) => {\n if (key.startsWith(`${moduleName}_`)) {\n buffer.destroy();\n this.arrayStorageBuffers.delete(key);\n }\n });\n this.arrayLengthBuffers.forEach((buffer, key) => {\n if (key.startsWith(`${moduleName}_`)) {\n buffer.destroy();\n this.arrayLengthBuffers.delete(key);\n }\n });\n\n // Create new buffers\n arrayInputs.forEach((arrayKey) => {\n const storageKey = `${moduleName}_${arrayKey}`;\n\n // Create array storage buffer (initial size 1MB, will grow as needed)\n const arrayBuffer = this.getDevice().createBuffer({\n size: 1024 * 1024, // 1MB initial size\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n\n // Length is now stored in main uniform buffer, no separate buffer needed\n this.arrayStorageBuffers.set(storageKey, arrayBuffer);\n });\n }\n\n /**\n * Write combined array data to storage buffer\n */\n writeCombinedArrayStorage(\n moduleName: string,\n arrayDataMap: Record<string, number[]>,\n arrayOffsets: Record<string, number>\n ): void {\n const combinedBuffer = this.combinedArrayStorageBuffers.get(moduleName);\n if (!combinedBuffer) {\n console.warn(`Combined array storage buffer not found for ${moduleName}`);\n return;\n }\n\n // Calculate total size needed\n let maxOffset = 0;\n for (const [arrayKey, data] of Object.entries(arrayDataMap)) {\n const offset = arrayOffsets[arrayKey] || 0;\n maxOffset = Math.max(maxOffset, offset + data.length);\n }\n\n const requiredSize = maxOffset * 4; // 4 bytes per float\n\n // Check if we need to resize the buffer\n if (requiredSize > combinedBuffer.size) {\n // Recreate with larger size\n combinedBuffer.destroy();\n const newSize = Math.max(requiredSize, combinedBuffer.size * 2);\n const newBuffer = this.getDevice().createBuffer({\n size: newSize,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n this.combinedArrayStorageBuffers.set(moduleName, newBuffer);\n\n // Write all array data to new buffer\n for (const [arrayKey, data] of Object.entries(arrayDataMap)) {\n const offset = arrayOffsets[arrayKey] || 0;\n const arrayData = new Float32Array(data);\n this.getDevice().queue.writeBuffer(\n newBuffer,\n offset * 4, // byte offset\n arrayData.buffer,\n arrayData.byteOffset,\n arrayData.byteLength\n );\n }\n } else {\n // Write array data to existing buffer\n for (const [arrayKey, data] of Object.entries(arrayDataMap)) {\n const offset = arrayOffsets[arrayKey] || 0;\n const arrayData = new Float32Array(data);\n this.getDevice().queue.writeBuffer(\n combinedBuffer,\n offset * 4, // byte offset\n arrayData.buffer,\n arrayData.byteOffset,\n arrayData.byteLength\n );\n }\n }\n }\n\n /**\n * Write array data to storage buffer\n */\n writeArrayStorage(\n moduleName: string,\n arrayKey: string,\n data: number[]\n ): void {\n const storageKey = `${moduleName}_${arrayKey}`;\n const arrayBuffer = this.arrayStorageBuffers.get(storageKey);\n\n if (!arrayBuffer) {\n console.warn(`Array storage buffer not found for ${storageKey}`);\n return;\n }\n\n // Check if we need to resize the buffer\n const requiredSize = data.length * 4;\n if (requiredSize > arrayBuffer.size) {\n // Recreate with larger size\n arrayBuffer.destroy();\n const newSize = Math.max(requiredSize, arrayBuffer.size * 2);\n const newBuffer = this.getDevice().createBuffer({\n size: newSize,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n this.arrayStorageBuffers.set(storageKey, newBuffer);\n\n // Write data to new buffer\n const arrayData = new Float32Array(data);\n this.getDevice().queue.writeBuffer(\n newBuffer,\n 0,\n arrayData.buffer,\n arrayData.byteOffset,\n arrayData.byteLength\n );\n } else {\n // Write data to existing buffer\n const arrayData = new Float32Array(data);\n this.getDevice().queue.writeBuffer(\n arrayBuffer,\n 0,\n arrayData.buffer,\n arrayData.byteOffset,\n arrayData.byteLength\n );\n }\n\n // Length is now written to the main uniform buffer by the module registry\n }\n\n /**\n * Get array storage buffer for a module's array input\n */\n getArrayStorageBuffer(\n moduleName: string,\n arrayKey: string\n ): GPUBuffer | undefined {\n return this.arrayStorageBuffers.get(`${moduleName}_${arrayKey}`);\n }\n\n /**\n * Get array length buffer for a module's array input\n */\n getArrayLengthBuffer(\n moduleName: string,\n arrayKey: string\n ): GPUBuffer | undefined {\n return this.arrayLengthBuffers.get(`${moduleName}_${arrayKey}_length`);\n }\n\n dispose(): Promise<void> {\n if (this.disposePromise) return this.disposePromise;\n this.disposePromise = this.disposeAsync().finally(() => {\n this.disposePromise = null;\n });\n return this.disposePromise;\n }\n\n private async disposeAsync(): Promise<void> {\n // Basic cleanup - just destroy buffers and textures\n this.particleBuffer?.destroy();\n this.moduleUniformBuffers.forEach((muf) => muf.buffer.destroy());\n this.combinedArrayStorageBuffers.forEach((buffer) => buffer.destroy());\n this.arrayStorageBuffers.forEach((buffer) => buffer.destroy());\n this.arrayLengthBuffers.forEach((buffer) => buffer.destroy());\n this.renderUniformBuffer?.destroy();\n this.gridCountsBuffer?.destroy();\n this.gridIndicesBuffer?.destroy();\n this.simStateBuffer?.destroy();\n this.particleBuffer = null;\n this.moduleUniformBuffers = [];\n this.combinedArrayStorageBuffers.clear();\n this.arrayStorageBuffers.clear();\n this.arrayLengthBuffers.clear();\n this.renderUniformBuffer = null;\n this.renderBindGroupLayoutCache?.clear();\n this.renderBindGroupLayoutCache = null;\n this.gridCountsBuffer = null;\n this.gridIndicesBuffer = null;\n this.simStateBuffer = null;\n if (this.scene) {\n this.scene.a.destroy();\n this.scene.b.destroy();\n this.scene = null;\n }\n this.sceneSize = null;\n this.copyPipelines.clear();\n this.fullscreenPipelines.clear();\n this.imageComputePipelines.clear();\n this.computeBindGroupLayout = null;\n this.computePipelineLayout = null;\n\n // Key fix for reload perf degradation:\n // Wait briefly for any queued work to complete before tearing down the context/device.\n // This prevents Chrome GPU-process resource buildup from overlapping device lifetimes.\n if (this.device) {\n try {\n await Promise.race([\n this.device.queue.onSubmittedWorkDone(),\n new Promise((resolve) => setTimeout(resolve, 150)),\n ]);\n } catch {\n // ignore\n }\n }\n\n if (this.context) {\n try {\n this.context.unconfigure();\n } catch (error) {\n console.warn(\"[WebGPU] Error unconfiguring context:\", error);\n }\n }\n\n // Give the browser a tick to process unconfigure before destroying the device.\n await new Promise((resolve) => setTimeout(resolve, 0));\n\n if (this.device) {\n try {\n this.device.destroy();\n } catch (error) {\n console.warn(\"[WebGPU] Error destroying device:\", error);\n }\n }\n\n this.context = null;\n this.device = null;\n this.adapter = null;\n }\n}\n","/**\n * ParticleStore\n *\n * CPU-side SoA-like packed Float32Array for particle attributes with helpers\n * to set/add/read particles and to synchronize active slices to the GPU\n * storage buffer owned by GPUResources.\n *\n * Layout (floatsPerParticle=12):\n * [pos.x, pos.y, vel.x, vel.y, ax, ay, size, mass, color.r, color.g, color.b, color.a]\n */\nimport { GPUResources } from \"./gpu-resources\";\nimport { IParticle } from \"../../interfaces\";\n\n/**\n * CPU-side particle storage and synchronization to GPU storage buffer.\n */\nexport class ParticleStore {\n private readonly maxParticles: number;\n private readonly floatsPerParticle: number;\n private readonly data: Float32Array;\n private count: number = 0;\n\n constructor(maxParticles: number, floatsPerParticle = 12) {\n this.maxParticles = Math.max(0, Math.floor(maxParticles));\n this.floatsPerParticle = Math.max(1, Math.floor(floatsPerParticle));\n this.data = new Float32Array(this.maxParticles * this.floatsPerParticle);\n }\n\n setParticles(list: IParticle[]): void {\n const n = Math.min(list.length, this.maxParticles);\n for (let i = 0; i < n; i++) this.writeAtIndex(i, list[i]);\n this.count = n;\n }\n\n addParticle(p: IParticle): void {\n if (this.count >= this.maxParticles) return;\n this.writeAtIndex(this.count, p);\n this.count++;\n }\n\n clear(): void {\n this.count = 0;\n }\n\n getCount(): number {\n return this.count;\n }\n\n getParticles(): IParticle[] {\n const particles: IParticle[] = [];\n for (let i = 0; i < this.count; i++) {\n particles.push(this.getParticle(i));\n }\n return particles;\n }\n\n getParticle(index: number): IParticle {\n const base = index * this.floatsPerParticle;\n return {\n position: { x: this.data[base + 0], y: this.data[base + 1] },\n velocity: { x: this.data[base + 2], y: this.data[base + 3] },\n size: this.data[base + 6],\n mass: this.data[base + 7],\n color: {\n r: this.data[base + 8],\n g: this.data[base + 9],\n b: this.data[base + 10],\n a: this.data[base + 11],\n },\n };\n }\n\n /**\n * Writes the currently active particle slice to the GPU particle buffer.\n * Assumes the GPU storage buffer has already been created with matching capacity.\n */\n syncToGPU(resources: GPUResources): void {\n if (this.count === 0) return;\n const slice = this.data.subarray(0, this.count * this.floatsPerParticle);\n resources.writeParticleBuffer(slice);\n }\n\n /**\n * Reads particle data back from GPU to CPU, updating the local data array.\n * This ensures getParticles() returns current GPU simulation state.\n */\n async syncFromGPU(resources: GPUResources): Promise<void> {\n if (this.count === 0) return;\n \n const sizeFloats = this.count * this.floatsPerParticle;\n try {\n const gpuData = await resources.readParticleBuffer(sizeFloats);\n \n // Update our CPU-side data with fresh GPU data\n this.data.set(gpuData.subarray(0, sizeFloats));\n \n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Internal: encode one particle into the CPU buffer at a given index.\n */\n private writeAtIndex(index: number, particle: IParticle): void {\n const base = index * this.floatsPerParticle;\n // Layout: pos2, vel2, accel2, size, mass, color4\n this.data[base + 0] = particle.position.x;\n this.data[base + 1] = particle.position.y;\n this.data[base + 2] = particle.velocity.x;\n this.data[base + 3] = particle.velocity.y;\n this.data[base + 4] = 0; // ax\n this.data[base + 5] = 0; // ay\n this.data[base + 6] = particle.size ?? 5;\n this.data[base + 7] = particle.mass ?? 1;\n const c = particle.color ?? { r: 1, g: 1, b: 1, a: 1 };\n this.data[base + 8] = c.r;\n this.data[base + 9] = c.g;\n this.data[base + 10] = c.b;\n this.data[base + 11] = c.a;\n }\n}\n","/**\n * ViewController\n *\n * Tracks canvas size, camera position, and zoom. Provides snapshot and writes\n * render uniforms consumed by render passes (canvas size, camera, zoom).\n * Also enforces simple zoom limits based on canvas size to avoid excessive\n * grid allocation and texture usage.\n */\n\nexport interface ViewSnapshot {\n width: number;\n height: number;\n cx: number;\n cy: number;\n zoom: number;\n}\n\nexport class View {\n private width: number;\n private height: number;\n private cameraX: number = 0;\n private cameraY: number = 0;\n private zoom: number = 1;\n private minZoom: number = 0.01;\n private maxZoom: number = 5;\n\n constructor(width: number, height: number) {\n this.width = Math.max(1, Math.floor(width));\n this.height = Math.max(1, Math.floor(height));\n }\n\n setSize(width: number, height: number): void {\n this.width = Math.max(1, Math.floor(width));\n this.height = Math.max(1, Math.floor(height));\n }\n\n getSize(): { width: number; height: number } {\n return { width: this.width, height: this.height };\n }\n\n setCamera(x: number, y: number): void {\n this.cameraX = x;\n this.cameraY = y;\n }\n\n getCamera(): { x: number; y: number } {\n return { x: this.cameraX, y: this.cameraY };\n }\n\n setZoom(zoom: number): void {\n const size = this.getSize();\n const maxBytes = 120 * 1024 * 1024; // safety threshold below typical 128MB default\n const minZoomByGrid = Math.sqrt((4 * size.width * size.height) / maxBytes);\n const minZoom = Math.max(0.01, minZoomByGrid);\n const clamped = Math.max(minZoom, Math.min(zoom, this.maxZoom));\n this.zoom = clamped;\n }\n\n getZoom(): number {\n return this.zoom;\n }\n\n /**\n * Optional: allow external systems (e.g., GridSystem) to update zoom limits.\n */\n setZoomLimits(minZoom: number, maxZoom: number): void {\n this.minZoom = Math.max(0.0001, minZoom);\n this.maxZoom = Math.max(this.minZoom, maxZoom);\n this.setZoom(this.zoom);\n }\n\n getSnapshot(): ViewSnapshot {\n return {\n width: this.width,\n height: this.height,\n cx: this.cameraX,\n cy: this.cameraY,\n zoom: this.zoom,\n };\n }\n}\n","export type OscillatorKey = string; // `${moduleName}:${inputName}`\n\nexport interface AddOscillatorOptions {\n curveExponent?: number; // default 2\n jitter?: boolean | number; // false | true (0.8–1.2) | explicit multiplier\n initialDirection?: -1 | 1; // seed desired direction\n currentValue?: number; // optional starting value to preserve continuity on start\n phaseOffset?: number; // exact phase offset to preserve when restoring from session\n}\n\nexport interface OscillatorConfigInternal {\n moduleName: string;\n inputName: string;\n min: number;\n max: number;\n speedHz: number;\n curveExponent: number;\n jitterMultiplier: number;\n phaseOffset: number;\n lastValue: number;\n lastDirection: -1 | 0 | 1;\n active: boolean;\n}\n\nexport interface OscillatorPublicConfig {\n moduleName: string;\n inputName: string;\n min: number;\n max: number;\n speedHz: number;\n curveExponent: number;\n jitterMultiplier: number;\n phaseOffset: number;\n lastDirection: -1 | 0 | 1;\n lastValue: number;\n active: boolean;\n}\n\nfunction fnv1a32(str: string): number {\n let hash = 0x811c9dc5;\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i);\n hash = (hash >>> 0) * 0x01000193;\n hash >>>= 0;\n }\n return hash >>> 0;\n}\n\nfunction hashToUnitInterval(input: string): number {\n return fnv1a32(input) / 4294967296; // 2^32\n}\n\nexport class OscillatorManager {\n private keyToIndex: Map<OscillatorKey, number> = new Map();\n private oscillators: OscillatorConfigInternal[] = [];\n private elapsedSeconds: number = 0;\n private setInput: (\n moduleName: string,\n inputName: string,\n value: number\n ) => void;\n private listeners: Map<OscillatorKey, Set<(value: number) => void>> =\n new Map();\n\n constructor(\n setInput: (moduleName: string, inputName: string, value: number) => void\n ) {\n this.setInput = setInput;\n }\n\n private static makeKey(moduleName: string, inputName: string): OscillatorKey {\n return `${moduleName}:${inputName}`;\n }\n\n addOscillator(params: {\n moduleName: string;\n inputName: string;\n min: number;\n max: number;\n speedHz: number;\n options?: AddOscillatorOptions;\n }): OscillatorKey {\n const { moduleName, inputName, min, max, speedHz } = params;\n const opts = params.options ?? {};\n const key = OscillatorManager.makeKey(moduleName, inputName);\n\n const jitterMultiplier =\n typeof opts.jitter === \"number\"\n ? Math.max(0, opts.jitter)\n : opts.jitter === true\n ? 0.8 + 0.4 * hashToUnitInterval(key)\n : 1;\n\n const curveExponent = opts.curveExponent ?? 2;\n\n // Use provided initialDirection, or preserve direction if overwriting, or default to 0\n let lastDirection: -1 | 0 | 1 = opts.initialDirection ?? 0;\n const existingIndex = this.keyToIndex.get(key);\n if (existingIndex !== undefined && opts.initialDirection === undefined) {\n // Only preserve existing direction if no explicit initialDirection was provided\n lastDirection = this.oscillators[existingIndex].lastDirection;\n }\n\n const config: OscillatorConfigInternal = {\n moduleName,\n inputName,\n min,\n max,\n speedHz,\n curveExponent,\n jitterMultiplier,\n phaseOffset: opts.phaseOffset ?? 0,\n lastValue: typeof opts.currentValue === \"number\" ? opts.currentValue : 0,\n lastDirection,\n active: true,\n };\n\n if (existingIndex !== undefined) {\n this.oscillators[existingIndex] = config;\n // Only recalculate phase offset if not explicitly provided\n if (opts.phaseOffset === undefined) {\n this.recalculatePhaseOffset(this.oscillators[existingIndex]);\n }\n return key;\n }\n\n const index = this.oscillators.length;\n this.oscillators.push(config);\n this.keyToIndex.set(key, index);\n // Only recalculate phase offset if not explicitly provided\n if (opts.phaseOffset === undefined) {\n this.recalculatePhaseOffset(this.oscillators[index]);\n }\n return key;\n }\n\n removeOscillator(moduleName: string, inputName: string): void {\n const key = OscillatorManager.makeKey(moduleName, inputName);\n const index = this.keyToIndex.get(key);\n if (index === undefined) return;\n const lastIndex = this.oscillators.length - 1;\n // swap-remove\n [this.oscillators[index], this.oscillators[lastIndex]] = [\n this.oscillators[lastIndex],\n this.oscillators[index],\n ];\n const moved = this.oscillators[index];\n const movedKey = OscillatorManager.makeKey(\n moved.moduleName,\n moved.inputName\n );\n this.keyToIndex.set(movedKey, index);\n this.oscillators.pop();\n this.keyToIndex.delete(key);\n }\n\n updateOscillatorSpeed(\n moduleName: string,\n inputName: string,\n speedHz: number\n ): void {\n const key = OscillatorManager.makeKey(moduleName, inputName);\n const index = this.keyToIndex.get(key);\n if (index === undefined) return;\n this.oscillators[index].speedHz = speedHz;\n this.recalculatePhaseOffset(this.oscillators[index]);\n }\n\n updateOscillatorBounds(\n moduleName: string,\n inputName: string,\n min: number,\n max: number\n ): void {\n const key = OscillatorManager.makeKey(moduleName, inputName);\n const index = this.keyToIndex.get(key);\n if (index === undefined) return;\n this.oscillators[index].min = min;\n this.oscillators[index].max = max;\n this.recalculatePhaseOffset(this.oscillators[index]);\n }\n\n hasOscillator(moduleName: string, inputName: string): boolean {\n return this.keyToIndex.has(\n OscillatorManager.makeKey(moduleName, inputName)\n );\n }\n\n getOscillator(\n moduleName: string,\n inputName: string\n ): OscillatorPublicConfig | undefined {\n const key = OscillatorManager.makeKey(moduleName, inputName);\n const index = this.keyToIndex.get(key);\n if (index === undefined) return undefined;\n const cfg = this.oscillators[index];\n return {\n moduleName: cfg.moduleName,\n inputName: cfg.inputName,\n min: cfg.min,\n max: cfg.max,\n speedHz: cfg.speedHz,\n curveExponent: cfg.curveExponent,\n jitterMultiplier: cfg.jitterMultiplier,\n phaseOffset: cfg.phaseOffset,\n lastDirection: cfg.lastDirection,\n lastValue: cfg.lastValue,\n active: cfg.active,\n };\n }\n\n clear(): void {\n this.keyToIndex.clear();\n this.oscillators = [];\n this.elapsedSeconds = 0;\n this.listeners.clear();\n }\n\n getElapsedSeconds(): number {\n return this.elapsedSeconds;\n }\n\n setElapsedSeconds(seconds: number): void {\n this.elapsedSeconds = Math.max(0, Number.isFinite(seconds) ? seconds : 0);\n }\n\n clearModule(moduleName: string): void {\n const indicesToRemove: number[] = [];\n for (let i = 0; i < this.oscillators.length; i++) {\n if (this.oscillators[i].moduleName === moduleName) {\n indicesToRemove.push(i);\n }\n }\n\n // Remove in reverse order to maintain indices\n for (let i = indicesToRemove.length - 1; i >= 0; i--) {\n const index = indicesToRemove[i];\n const osc = this.oscillators[index];\n const key = OscillatorManager.makeKey(osc.moduleName, osc.inputName);\n\n // Remove from keyToIndex map\n this.keyToIndex.delete(key);\n\n // Remove from listeners\n this.listeners.delete(key);\n\n // Swap-remove from oscillators array\n const lastIndex = this.oscillators.length - 1;\n if (index !== lastIndex) {\n this.oscillators[index] = this.oscillators[lastIndex];\n const moved = this.oscillators[index];\n const movedKey = OscillatorManager.makeKey(\n moved.moduleName,\n moved.inputName\n );\n this.keyToIndex.set(movedKey, index);\n }\n this.oscillators.pop();\n }\n }\n\n updateAll(dtSeconds: number): void {\n if (dtSeconds <= 0 || this.oscillators.length === 0) return;\n this.elapsedSeconds += dtSeconds;\n\n for (let i = 0; i < this.oscillators.length; i++) {\n const o = this.oscillators[i];\n if (!o.active) continue;\n\n const range = o.max - o.min;\n const center = o.min + range / 2;\n const amplitude = range / 2;\n if (amplitude <= 0) {\n this.setInput(o.moduleName, o.inputName, center);\n o.lastValue = center;\n o.lastDirection = 0;\n continue;\n }\n\n const effectiveHz = o.speedHz * o.jitterMultiplier;\n const phase =\n this.elapsedSeconds * effectiveHz * 2 * Math.PI + o.phaseOffset;\n const s = Math.sin(phase);\n const k = o.curveExponent;\n const curve = Math.sign(s) * Math.pow(Math.abs(s), k);\n const value = center + curve * amplitude;\n const clamped = Math.max(o.min, Math.min(o.max, value));\n\n const delta = clamped - o.lastValue;\n if (Math.abs(delta) > 1e-9) {\n o.lastDirection = delta > 0 ? 1 : -1;\n }\n o.lastValue = clamped;\n this.setInput(o.moduleName, o.inputName, clamped);\n const key = OscillatorManager.makeKey(o.moduleName, o.inputName);\n const fns = this.listeners.get(key);\n if (fns) {\n for (const fn of fns) {\n try {\n fn(clamped);\n } catch {}\n }\n }\n }\n }\n\n private recalculatePhaseOffset(o: OscillatorConfigInternal): void {\n const range = o.max - o.min;\n const center = o.min + range / 2;\n const amplitude = range / 2;\n if (amplitude <= 0) {\n o.phaseOffset = 0;\n return;\n }\n const normalizedValue = (o.lastValue - center) / amplitude;\n const clampedNormalized = Math.max(-1, Math.min(1, normalizedValue));\n // inverse of sign(sin) * |sin|^k\n let targetSin: number;\n if (Math.abs(clampedNormalized) < 1e-10) {\n targetSin = 0;\n } else {\n targetSin =\n Math.sign(clampedNormalized) *\n Math.pow(Math.abs(clampedNormalized), 1 / o.curveExponent);\n }\n targetSin = Math.max(-1, Math.min(1, targetSin));\n const asinVal = Math.asin(targetSin);\n const candidate0 = asinVal; // [-pi/2, pi/2]\n const candidate1 = Math.PI - asinVal;\n const desiredDir = o.lastDirection;\n const cos0 = Math.cos(candidate0);\n let targetPhase = candidate0;\n if (desiredDir < 0) {\n targetPhase = cos0 < 0 ? candidate0 : candidate1;\n } else if (desiredDir > 0) {\n targetPhase = cos0 >= 0 ? candidate0 : candidate1;\n }\n // Account for current elapsed time so new speed/bounds continue from current position\n const effectiveHz = o.speedHz * o.jitterMultiplier;\n const elapsedPhase = this.elapsedSeconds * effectiveHz * 2 * Math.PI;\n o.phaseOffset = targetPhase - elapsedPhase;\n if (Math.abs(Math.cos(o.phaseOffset)) < 1e-6) {\n const epsilon = 1e-3;\n o.phaseOffset += (desiredDir >= 0 ? 1 : -1) * epsilon;\n }\n // Normalize to [-pi, pi] to avoid drift\n if (o.phaseOffset > Math.PI || o.phaseOffset < -Math.PI) {\n o.phaseOffset = ((o.phaseOffset + Math.PI) % (2 * Math.PI)) - Math.PI;\n }\n }\n\n addOscillatorListener(\n moduleName: string,\n inputName: string,\n handler: (value: number) => void\n ): void {\n const key = OscillatorManager.makeKey(moduleName, inputName);\n let set = this.listeners.get(key);\n if (!set) {\n set = new Set();\n this.listeners.set(key, set);\n }\n set.add(handler);\n }\n\n removeOscillatorListener(\n moduleName: string,\n inputName: string,\n handler: (value: number) => void\n ): void {\n const key = OscillatorManager.makeKey(moduleName, inputName);\n const set = this.listeners.get(key);\n if (!set) return;\n set.delete(handler);\n if (set.size === 0) this.listeners.delete(key);\n }\n\n setOscillatorState(\n moduleName: string,\n inputName: string,\n lastValue: number,\n lastDirection: -1 | 0 | 1\n ): boolean {\n const key = OscillatorManager.makeKey(moduleName, inputName);\n const index = this.keyToIndex.get(key);\n if (index === undefined) return false;\n\n const osc = this.oscillators[index];\n osc.lastValue = lastValue;\n osc.lastDirection = lastDirection;\n // Recompute phase immediately; elapsedSeconds should be restored by loader\n this.recalculatePhaseOffset(osc);\n // Also set the module value to match immediately\n this.setInput(moduleName, inputName, lastValue);\n\n return true;\n }\n}\n","import { View } from \"./view\";\nimport type { Module } from \"./module\";\nimport { OscillatorManager, AddOscillatorOptions } from \"./oscillators\";\n\nexport interface IParticle {\n position: { x: number; y: number };\n velocity: { x: number; y: number };\n size: number;\n mass: number;\n color: {\n r: number;\n g: number;\n b: number;\n a: number;\n };\n}\n\nexport interface IEngine {\n initialize(): Promise<void>;\n play(): void;\n pause(): void;\n stop(): void;\n toggle(): void;\n isPlaying(): boolean;\n destroy(): Promise<void>;\n getSize(): { width: number; height: number };\n setSize(width: number, height: number): void;\n setCamera(x: number, y: number): void;\n getCamera(): { x: number; y: number };\n setZoom(z: number): void;\n getZoom(): number;\n addParticle(p: IParticle): void;\n setParticles(p: IParticle[]): void;\n getParticles(): Promise<IParticle[]>;\n getParticle(index: number): Promise<IParticle>;\n clear(): void;\n getCount(): number;\n getFPS(): number;\n export(): Record<string, Record<string, number>>;\n import(settings: Record<string, Record<string, number>>): void;\n\n // Configuration getters and setters\n getClearColor(): { r: number; g: number; b: number; a: number };\n setClearColor(color: { r: number; g: number; b: number; a: number }): void;\n getCellSize(): number;\n setCellSize(size: number): void;\n getMaxNeighbors(): number;\n setMaxNeighbors(size: number): void;\n getMaxParticles(): number | null;\n setMaxParticles(value: number | null): void;\n getConstrainIterations(): number;\n setConstrainIterations(iterations: number): void;\n getModule(name: string): Module | undefined;\n\n // Oscillator API\n addOscillator(params: {\n moduleName: string;\n inputName: string;\n min: number;\n max: number;\n speedHz: number;\n options?: AddOscillatorOptions;\n }): string;\n removeOscillator(moduleName: string, inputName: string): void;\n updateOscillatorSpeed(\n moduleName: string,\n inputName: string,\n speedHz: number\n ): void;\n updateOscillatorBounds(\n moduleName: string,\n inputName: string,\n min: number,\n max: number\n ): void;\n hasOscillator(moduleName: string, inputName: string): boolean;\n getOscillator(\n moduleName: string,\n inputName: string\n ):\n | {\n moduleName: string;\n inputName: string;\n min: number;\n max: number;\n speedHz: number;\n curveExponent: number;\n jitterMultiplier: number;\n phaseOffset: number;\n lastDirection: -1 | 0 | 1;\n lastValue: number;\n active: boolean;\n }\n | undefined;\n clearOscillators(): void;\n clearModuleOscillators(moduleName: string): void;\n addOscillatorListener(\n moduleName: string,\n inputName: string,\n handler: (value: number) => void\n ): void;\n removeOscillatorListener(\n moduleName: string,\n inputName: string,\n handler: (value: number) => void\n ): void;\n setOscillatorState(\n moduleName: string,\n inputName: string,\n lastValue: number,\n lastDirection: -1 | 0 | 1\n ): boolean;\n getOscillatorsElapsedSeconds(): number;\n setOscillatorsElapsedSeconds(seconds: number): void;\n}\n\nexport abstract class AbstractEngine implements IEngine {\n protected playing: boolean = false;\n protected lastTime: number = 0;\n protected fpsEstimate: number = 60;\n protected fpsSmoothing: number = 0.15;\n protected constrainIterations: number;\n protected clearColor: { r: number; g: number; b: number; a: number };\n protected cellSize: number;\n protected maxNeighbors: number;\n protected maxParticles: number | null = null;\n protected view: View;\n protected modules: Module[];\n protected maxSize: number = 0;\n protected oscillatorManager: OscillatorManager;\n\n constructor(options: {\n canvas: HTMLCanvasElement;\n forces: Module[];\n render: Module[];\n constrainIterations?: number;\n clearColor?: { r: number; g: number; b: number; a: number };\n cellSize?: number;\n maxNeighbors?: number;\n }) {\n this.view = new View(options.canvas.width, options.canvas.height);\n this.modules = [...options.forces, ...options.render];\n this.constrainIterations = options.constrainIterations ?? 5;\n this.clearColor = options.clearColor ?? { r: 0, g: 0, b: 0, a: 1 };\n this.cellSize = options.cellSize ?? 16;\n this.maxNeighbors = options.maxNeighbors ?? 100;\n // Initialize oscillator manager with a setter bound to module input writes\n this.oscillatorManager = new OscillatorManager(\n (moduleName: string, inputName: string, value: number) => {\n const module = this.getModule(moduleName);\n if (!module) return;\n // Write input and notify settings change\n (module as Module<any, Record<string, number>>).write({\n [inputName]: value,\n } as Record<string, number>);\n this.onModuleSettingsChanged();\n }\n );\n }\n\n // Abstract methods that must be implemented by subclasses\n abstract initialize(): Promise<void>;\n abstract destroy(): Promise<void>;\n abstract setSize(width: number, height: number): void;\n abstract addParticle(p: IParticle): void;\n abstract setParticles(p: IParticle[]): void;\n abstract getParticles(): Promise<IParticle[]>;\n abstract getParticle(index: number): Promise<IParticle>;\n abstract clear(): void;\n abstract getCount(): number;\n\n // Protected abstract methods for animation loop\n protected abstract startAnimationLoop(): void;\n protected abstract stopAnimationLoop(): void;\n\n // Common implementations\n play(): void {\n if (this.playing) return;\n this.playing = true;\n this.lastTime = performance.now();\n this.startAnimationLoop();\n }\n\n pause(): void {\n this.playing = false;\n }\n\n stop(): void {\n this.pause();\n this.stopAnimationLoop();\n }\n\n toggle(): void {\n this.playing ? this.pause() : this.play();\n }\n\n isPlaying(): boolean {\n return this.playing;\n }\n\n getSize(): { width: number; height: number } {\n return this.view.getSize();\n }\n\n setCamera(x: number, y: number): void {\n this.view.setCamera(x, y);\n this.onViewChanged();\n }\n\n getCamera(): { x: number; y: number } {\n return this.view.getCamera();\n }\n\n setZoom(z: number): void {\n this.view.setZoom(z);\n this.onViewChanged();\n }\n\n getZoom(): number {\n return this.view.getZoom();\n }\n\n getFPS(): number {\n return this.fpsEstimate;\n }\n\n // Oscillator API implementations\n addOscillator(params: {\n moduleName: string;\n inputName: string;\n min: number;\n max: number;\n speedHz: number;\n options?: AddOscillatorOptions;\n }): string {\n return this.oscillatorManager.addOscillator(params);\n }\n removeOscillator(moduleName: string, inputName: string): void {\n this.oscillatorManager.removeOscillator(moduleName, inputName);\n }\n updateOscillatorSpeed(\n moduleName: string,\n inputName: string,\n speedHz: number\n ): void {\n this.oscillatorManager.updateOscillatorSpeed(\n moduleName,\n inputName,\n speedHz\n );\n }\n updateOscillatorBounds(\n moduleName: string,\n inputName: string,\n min: number,\n max: number\n ): void {\n this.oscillatorManager.updateOscillatorBounds(\n moduleName,\n inputName,\n min,\n max\n );\n }\n hasOscillator(moduleName: string, inputName: string): boolean {\n return this.oscillatorManager.hasOscillator(moduleName, inputName);\n }\n getOscillator(moduleName: string, inputName: string) {\n return this.oscillatorManager.getOscillator(moduleName, inputName);\n }\n clearOscillators(): void {\n this.oscillatorManager.clear();\n }\n clearModuleOscillators(moduleName: string): void {\n this.oscillatorManager.clearModule(moduleName);\n }\n addOscillatorListener(\n moduleName: string,\n inputName: string,\n handler: (value: number) => void\n ): void {\n this.oscillatorManager.addOscillatorListener(\n moduleName,\n inputName,\n handler\n );\n }\n removeOscillatorListener(\n moduleName: string,\n inputName: string,\n handler: (value: number) => void\n ): void {\n this.oscillatorManager.removeOscillatorListener(\n moduleName,\n inputName,\n handler\n );\n }\n setOscillatorState(\n moduleName: string,\n inputName: string,\n lastValue: number,\n lastDirection: -1 | 0 | 1\n ): boolean {\n return this.oscillatorManager.setOscillatorState(\n moduleName,\n inputName,\n lastValue,\n lastDirection\n );\n }\n\n getOscillatorsElapsedSeconds(): number {\n return this.oscillatorManager.getElapsedSeconds();\n }\n\n setOscillatorsElapsedSeconds(seconds: number): void {\n this.oscillatorManager.setElapsedSeconds(seconds);\n }\n\n export(): Record<string, Record<string, number>> {\n const settings: Record<string, Record<string, number>> = {};\n for (const module of this.modules) {\n const moduleData = module.read();\n // Include the enabled state in the exported data\n settings[module.name] = {\n ...(moduleData as Record<string, number>),\n enabled: module.isEnabled() ? 1 : 0,\n };\n }\n return settings;\n }\n\n import(settings: Record<string, Record<string, number>>): void {\n for (const module of this.modules) {\n if (settings[module.name]) {\n const moduleSettings = settings[module.name];\n\n // Restore enabled state if present\n if (\"enabled\" in moduleSettings) {\n module.setEnabled(moduleSettings.enabled === 1);\n }\n\n // Restore other settings\n module.write(moduleSettings);\n }\n }\n this.onModuleSettingsChanged();\n }\n\n // Protected helper methods\n protected updateFPS(dt: number): void {\n if (dt > 0) {\n // Clamp dt to a minimum to prevent unrealistic FPS values\n // Minimum dt corresponds to maximum FPS (e.g., 1/144 = ~0.0069s for 144 FPS max)\n const minDt = 1 / 144; // Cap at 144 FPS maximum\n const clampedDt = Math.max(dt, minDt);\n const instantFps = 1 / clampedDt;\n this.fpsEstimate =\n this.fpsEstimate * (1 - this.fpsSmoothing) +\n instantFps * this.fpsSmoothing;\n }\n }\n\n protected updateOscillators(dt: number): void {\n if (!this.playing) return; // follow global pause\n this.oscillatorManager.updateAll(dt);\n }\n\n protected getTimeDelta(): number {\n const now = performance.now();\n const dt = Math.min(now - this.lastTime, 100) / 1000; // clamp to 100ms\n this.lastTime = now;\n return dt;\n }\n\n // Hook methods for subclasses\n protected onViewChanged(): void {\n // Override in subclasses if needed\n }\n\n protected onModuleSettingsChanged(): void {\n // Override in subclasses if needed\n }\n\n // Configuration getters and setters\n getClearColor(): { r: number; g: number; b: number; a: number } {\n return { ...this.clearColor };\n }\n\n setClearColor(color: { r: number; g: number; b: number; a: number }): void {\n this.clearColor = { ...color };\n this.onClearColorChanged();\n }\n\n getCellSize(): number {\n return this.cellSize;\n }\n\n setCellSize(size: number): void {\n if (size <= 0) {\n throw new Error(\"Cell size must be greater than 0\");\n }\n this.cellSize = size;\n this.onCellSizeChanged();\n }\n\n getMaxNeighbors(): number {\n return this.maxNeighbors;\n }\n\n setMaxNeighbors(size: number): void {\n if (size <= 0) {\n throw new Error(\"Max neighbors must be greater than 0\");\n }\n this.maxNeighbors = size;\n this.onMaxNeighborsChanged();\n }\n\n getMaxParticles(): number | null {\n return this.maxParticles;\n }\n\n setMaxParticles(value: number | null): void {\n if (value !== null && value < 0) {\n throw new Error(\"Max particles must be non-negative or null\");\n }\n this.maxParticles = value;\n this.onMaxParticlesChanged();\n }\n\n getConstrainIterations(): number {\n return this.constrainIterations;\n }\n\n setConstrainIterations(iterations: number): void {\n if (iterations < 0) {\n throw new Error(\"Constrain iterations must be non-negative\");\n }\n this.constrainIterations = iterations;\n this.onConstrainIterationsChanged();\n }\n\n // MaxSize tracking\n getMaxSize(): number {\n return this.maxSize;\n }\n\n protected updateMaxSize(size: number): void {\n this.maxSize = Math.max(this.maxSize, size);\n }\n\n protected resetMaxSize(): void {\n this.maxSize = 0;\n }\n\n // Protected hooks for subclasses to override\n protected onClearColorChanged(): void {\n // Override in subclasses if needed\n }\n\n protected onCellSizeChanged(): void {\n // Override in subclasses if needed\n }\n\n protected onConstrainIterationsChanged(): void {\n // Override in subclasses if needed\n }\n\n protected onMaxNeighborsChanged(): void {\n // Override in subclasses if needed\n }\n\n protected onMaxParticlesChanged(): void {\n // Override in subclasses if needed\n }\n\n getModule<T extends Module>(name: string): T | undefined {\n return this.modules.find((module) => module.name === name) as T | undefined;\n }\n}\n","import { Particle } from \"./particle\";\nimport { View } from \"./view\";\n\n/**\n * Module descriptors and base Module class\n *\n * Defines the type-level contract for modules and the DSL surface used by the\n * WGSL builders. A `Module` instance provides a `descriptor()` which declares:\n * - role: `system`, `force`, or `render`\n * - bindings: uniform fields exposed to CPU and populated into GPU uniform buffers\n * - for system/force modules: optional global/state/apply/constrain/correct hooks\n * - for render modules: one or more passes (fullscreen or compute) with their bindings\n *\n * The base `Module` offers uniform writer/reader plumbing and enabled toggling,\n * and module authors extend it to implement their descriptor and any runtime API.\n */\nexport enum ModuleRole {\n Force = \"force\",\n Render = \"render\",\n}\n\nexport enum DataType {\n NUMBER = \"number\",\n ARRAY = \"array\",\n}\n\nexport abstract class Module<\n Name extends string = string,\n Inputs extends Record<string, number | number[]> = Record<\n string,\n number | number[]\n >,\n StateKeys extends string = any\n> {\n abstract readonly name: Name;\n abstract readonly role: ModuleRole;\n abstract readonly inputs: { [K in keyof Inputs]: DataType };\n\n private _state: Partial<Inputs> = {};\n private _writer:\n | ((values: Partial<Inputs & { enabled: number }>) => void)\n | null = (values: Partial<Inputs>) => {\n for (const key of Object.keys(values)) {\n const val = values[key as keyof Inputs];\n if (typeof val === \"number\") {\n this._state[key as keyof Inputs] = val as Inputs[keyof Inputs];\n } else if (Array.isArray(val)) {\n this._state[key as keyof Inputs] = [...val] as Inputs[keyof Inputs];\n }\n }\n };\n private _reader: (() => Partial<Inputs>) | null = () => {\n return { ...this._state };\n };\n private _enabled: boolean = true;\n\n attachUniformWriter(\n writer: (values: Partial<Record<string, number | number[]>>) => void\n ): void {\n const values = this.read();\n this._writer = writer;\n writer({ ...values, enabled: this._enabled ? 1 : 0 });\n }\n\n attachUniformReader(reader: () => Partial<Inputs>): void {\n this._reader = reader;\n }\n\n public write(values: Partial<Inputs>): void {\n // Binding keys are narrowed by the generic; cast to the writer's accepted shape\n this._writer?.(values as unknown as Partial<Inputs & { enabled: number }>);\n }\n\n public read(): Partial<Inputs> {\n const vals = this._reader?.() as unknown as Partial<Inputs>;\n return vals || {};\n }\n\n public readValue(key: keyof Inputs | \"enabled\"): number {\n const vals = this._reader?.() as unknown as Partial<\n Record<keyof Inputs | \"enabled\", number | number[]>\n >;\n const val = vals[key];\n return typeof val === \"number\" ? val : 0;\n }\n\n public readArray(key: keyof Inputs | \"enabled\"): number[] {\n const vals = this._reader?.() as unknown as Partial<\n Record<keyof Inputs | \"enabled\", number | number[]>\n >;\n const val = vals[key];\n return Array.isArray(val) ? val : [];\n }\n\n isEnabled(): boolean {\n return this._enabled;\n }\n\n setEnabled(enabled: boolean): void {\n this._enabled = !!enabled;\n // Propagate to GPU uniform if available\n if (this._writer) {\n this._writer({ enabled: this._enabled ? 1 : 0 } as unknown as Partial<\n Inputs & { enabled: number }\n >);\n }\n }\n\n abstract webgpu(): WebGPUDescriptor<Inputs, StateKeys>;\n abstract cpu(): CPUDescriptor<Inputs, StateKeys>;\n}\n\nexport interface WebGPUForceDescriptor<\n Inputs extends Record<string, number | number[]> = Record<\n string,\n number | number[]\n >,\n StateKeys extends string | number | symbol = string\n> {\n states?: readonly StateKeys[];\n global?: (args: {\n getUniform: (id: keyof Inputs, index?: number | string) => string;\n getLength: (id: keyof Inputs) => string;\n }) => string;\n state?: (args: {\n particleVar: string;\n dtVar: string;\n maxSizeVar: string;\n getUniform: (id: keyof Inputs, index?: number | string) => string;\n getLength: (id: keyof Inputs) => string;\n setState: (name: StateKeys, valueExpr: string) => string;\n }) => string;\n apply?: (args: {\n particleVar: string;\n dtVar: string;\n maxSizeVar: string;\n getUniform: (id: keyof Inputs, index?: number | string) => string;\n getLength: (id: keyof Inputs) => string;\n getState: (name: StateKeys, pidVar?: string) => string;\n }) => string;\n constrain?: (args: {\n particleVar: string;\n dtVar: string;\n maxSizeVar: string;\n getUniform: (id: keyof Inputs, index?: number | string) => string;\n getLength: (id: keyof Inputs) => string;\n getState: (name: StateKeys, pidVar?: string) => string;\n }) => string;\n correct?: (args: {\n particleVar: string;\n dtVar: string;\n maxSizeVar: string;\n prevPosVar: string;\n postPosVar: string;\n getUniform: (id: keyof Inputs, index?: number | string) => string;\n getLength: (id: keyof Inputs) => string;\n getState: (name: StateKeys, pidVar?: string) => string;\n }) => string;\n}\n\nexport type FullscreenRenderPass<\n Inputs extends Record<string, number | number[]> = Record<\n string,\n number | number[]\n >\n> = {\n kind: RenderPassKind.Fullscreen;\n vertex?: (args: {\n getUniform: (\n id: keyof Inputs | \"canvasWidth\" | \"canvasHeight\",\n index?: number | string\n ) => string;\n getLength: (id: keyof Inputs) => string;\n }) => string;\n globals?: (args: {\n getUniform: (id: keyof Inputs, index?: number | string) => string;\n getLength: (id: keyof Inputs) => string;\n }) => string;\n fragment: (args: {\n getUniform: (\n id:\n | keyof Inputs\n | \"canvasWidth\"\n | \"canvasHeight\"\n | \"clearColorR\"\n | \"clearColorG\"\n | \"clearColorB\",\n index?: number | string\n ) => string;\n getLength: (id: keyof Inputs) => string;\n sampleScene: (uvExpr: string) => string;\n }) => string;\n bindings: (keyof Inputs)[];\n readsScene?: boolean;\n writesScene?: true;\n instanced?: boolean;\n // Optional: override instance count by the length of this array input\n instanceFrom?: keyof Inputs;\n};\n\nexport enum RenderPassKind {\n Fullscreen = \"fullscreen\",\n Compute = \"compute\",\n}\n\nexport type ComputeRenderPass<\n Inputs extends Record<string, number | number[]> = Record<\n string,\n number | number[]\n >\n> = {\n kind: RenderPassKind.Compute;\n kernel: (args: {\n getUniform: (\n id:\n | keyof Inputs\n | \"canvasWidth\"\n | \"canvasHeight\"\n | \"clearColorR\"\n | \"clearColorG\"\n | \"clearColorB\",\n index?: number | string\n ) => string;\n getLength: (id: keyof Inputs) => string;\n readScene: (coordsExpr: string) => string;\n writeScene: (coordsExpr: string, colorExpr: string) => string;\n }) => string;\n bindings: (keyof Inputs)[];\n readsScene?: boolean;\n writesScene?: true;\n workgroupSize?: [number, number, number];\n globals?: (args: {\n getUniform: (id: keyof Inputs, index?: number | string) => string;\n getLength: (id: keyof Inputs) => string;\n }) => string;\n};\n\nexport type RenderPass<\n Inputs extends Record<string, number | number[]> = Record<\n string,\n number | number[]\n >\n> = FullscreenRenderPass<Inputs> | ComputeRenderPass<Inputs>;\n\nexport interface WebGPURenderDescriptor<\n Inputs extends Record<string, number | number[]> = Record<\n string,\n number | number[]\n >\n> {\n passes: Array<RenderPass<Inputs>>;\n}\n\nexport type WebGPUDescriptor<\n Inputs extends Record<string, number | number[]> = Record<\n string,\n number | number[]\n >,\n StateKeys extends string | number | symbol = string\n> = WebGPUForceDescriptor<Inputs, StateKeys> | WebGPURenderDescriptor<Inputs>;\n\nexport interface CPUForceDescriptor<\n Inputs extends Record<string, number | number[]> = Record<\n string,\n number | number[]\n >,\n StateKeys extends string | number | symbol = never\n> {\n states?: readonly StateKeys[];\n state?: (args: {\n particle: Particle;\n getNeighbors: (\n position: { x: number; y: number },\n radius: number\n ) => Particle[];\n dt: number;\n input: Inputs;\n setState: (name: StateKeys, value: number) => void;\n view: View;\n index: number;\n particles: Particle[];\n getImageData: (\n x: number,\n y: number,\n width: number,\n height: number\n ) => ImageData | null;\n }) => void;\n apply?: (args: {\n particle: Particle;\n getNeighbors: (\n position: { x: number; y: number },\n radius: number\n ) => Particle[];\n dt: number;\n maxSize: number;\n input: Inputs;\n getState: (name: StateKeys, pid?: number) => number;\n view: View;\n index: number;\n particles: Particle[];\n getImageData: (\n x: number,\n y: number,\n width: number,\n height: number\n ) => ImageData | null;\n }) => void;\n constrain?: (args: {\n particle: Particle;\n getNeighbors: (\n position: { x: number; y: number },\n radius: number\n ) => Particle[];\n dt: number;\n maxSize: number;\n input: Inputs;\n getState: (name: StateKeys, pid?: number) => number;\n view: View;\n index: number;\n particles: Particle[];\n getImageData: (\n x: number,\n y: number,\n width: number,\n height: number\n ) => ImageData | null;\n }) => void;\n correct?: (args: {\n particle: Particle;\n getNeighbors: (\n position: { x: number; y: number },\n radius: number\n ) => Particle[];\n dt: number;\n maxSize: number;\n prevPos: { x: number; y: number };\n postPos: { x: number; y: number };\n input: Inputs;\n getState: (name: StateKeys, pid?: number) => number;\n view: View;\n index: number;\n particles: Particle[];\n getImageData: (\n x: number,\n y: number,\n width: number,\n height: number\n ) => ImageData | null;\n }) => void;\n}\n\nexport interface CPURenderUtils {\n formatColor(color: { r: number; g: number; b: number; a: number }): string;\n drawCircle(\n x: number,\n y: number,\n radius: number,\n color: { r: number; g: number; b: number; a: number }\n ): void;\n drawRect(\n x: number,\n y: number,\n width: number,\n height: number,\n color: { r: number; g: number; b: number; a: number }\n ): void;\n}\n\nexport enum CanvasComposition {\n // Module needs a clear canvas to work properly (default for most render modules)\n RequiresClear = \"requiresClear\",\n // Module handles its own background/clearing (e.g. trails with fade)\n HandlesBackground = \"handlesBackground\",\n // Module renders on top of whatever is there (additive effects)\n Additive = \"additive\",\n}\n\nexport interface CPURenderDescriptor<\n Inputs extends Record<string, number | number[]> = Record<\n string,\n number | number[]\n >\n> {\n // How this module composes with the canvas background\n composition?: CanvasComposition;\n\n // Optional setup phase (called once per frame before particles)\n setup?: (args: {\n context: CanvasRenderingContext2D;\n input: Inputs;\n view: View;\n clearColor: { r: number; g: number; b: number; a: number };\n utils: CPURenderUtils;\n particles: Particle[];\n }) => void;\n\n // Optional per-particle rendering (called for each visible particle with transformed coordinates)\n render?: (args: {\n context: CanvasRenderingContext2D;\n particle: Particle;\n screenX: number;\n screenY: number;\n screenSize: number;\n input: Inputs;\n utils: CPURenderUtils;\n }) => void;\n\n // Optional teardown phase (called once per frame after all particles)\n teardown?: (args: {\n context: CanvasRenderingContext2D;\n input: Inputs;\n utils: CPURenderUtils;\n }) => void;\n}\n\nexport type CPUDescriptor<\n Inputs extends Record<string, number | number[]> = Record<\n string,\n number | number[]\n >,\n StateKeys extends string | number | symbol = string\n> = CPUForceDescriptor<Inputs, StateKeys> | CPURenderDescriptor<Inputs>;\n","/**\n * Module Builder (Program generator)\n *\n * Builds a single WGSL Program from a list of `Module` instances by:\n * - Creating a packed uniform layout per module and mapping named fields to `vec4` slots\n * - Emitting internal global helpers (simulation/grid) and optional force module globals\n * - Generating optional state/apply/constrain/correct functions for force modules\n * - Defining simulation entrypoints and grid entrypoints (inlined internally)\n * - Assigning extra bind group bindings (grid, sim state, scene texture)\n *\n * Output:\n * - `Program.code`: complete WGSL source for all compute passes\n * - `Program.layouts`: uniform layout/offset metadata for writing uniforms from CPU\n * - `Program.simStateStride`: size of the shared SIM_STATE row per particle\n * - `Program.extraBindings`: indices for additional buffers/textures bound by pipelines\n */\nimport {\n Module,\n ModuleRole,\n DataType,\n WebGPUForceDescriptor,\n} from \"../../../module\";\n\nexport const PARTICLE_STRUCT = `\nstruct Particle {\n position: vec2<f32>,\n velocity: vec2<f32>,\n acceleration: vec2<f32>,\n size: f32,\n mass: f32,\n color: vec4<f32>,\n}`;\n\nexport const STORAGE_DECL = `@group(0) @binding(0) var<storage, read_write> particles: array<Particle>;`;\n\nfunction cap(s: string): string {\n return s ? s[0].toUpperCase() + s.slice(1) : s;\n}\n\nexport interface ModuleUniformLayout {\n moduleName: string;\n moduleRole: ModuleRole;\n bindingIndex: number;\n uniformsVar: string;\n structName: string;\n sizeBytes: number;\n vec4Count: number;\n mapping: Record<\n string,\n { flatIndex: number; expr: string; offsetExpr?: string }\n >;\n}\n\nexport interface Program {\n code: string;\n layouts: ModuleUniformLayout[];\n simStateStride: number;\n extraBindings: {\n grid?: { countsBinding: number; indicesBinding: number };\n simState?: { stateBinding: number };\n sceneTexture?: { textureBinding: number };\n arrays?: Record<string, { arrayBinding: number; lengthBinding: number }>; // moduleName_arrayKey -> bindings\n };\n}\n\nexport function buildProgram(modules: readonly Module[]): Program {\n const descriptors = modules.map((m) => m.webgpu());\n\n const layouts: ModuleUniformLayout[] = [];\n const uniformDecls: string[] = [];\n // 1) Internal simulation uniforms at binding(1)\n const pushUniformLayout = (\n name: string,\n fieldIds: readonly string[],\n bindingIndex: number\n ) => {\n const uniformsVar = `${name}_uniforms`;\n const structName = `Uniforms_${cap(name)}`;\n const idsLocal = [...fieldIds] as string[];\n const vec4Count = Math.max(1, Math.ceil(idsLocal.length / 4));\n const mapping: Record<\n string,\n { flatIndex: number; expr: string; offsetExpr?: string }\n > = {};\n idsLocal.forEach((id, i) => {\n const v = Math.floor(i / 4),\n c = i % 4;\n const comp = c === 0 ? \"x\" : c === 1 ? \"y\" : c === 2 ? \"z\" : \"w\";\n mapping[id] = {\n flatIndex: v * 4 + c,\n expr: `${uniformsVar}.v${v}.${comp}`,\n };\n });\n const structWGSL = `struct ${structName} {\\n${Array.from(\n { length: vec4Count },\n (_, i) => ` v${i}: vec4<f32>,`\n ).join(\"\\n\")}\\n}`;\n const varDecl = `@group(0) @binding(${bindingIndex}) var<uniform> ${uniformsVar}: ${structName};`;\n layouts.push({\n moduleName: name,\n moduleRole: ModuleRole.Force as ModuleRole, // internal; role unused for gating\n bindingIndex,\n uniformsVar,\n structName,\n sizeBytes: vec4Count * 16,\n vec4Count,\n mapping,\n });\n uniformDecls.push(structWGSL, varDecl);\n };\n\n // Internal: simulation + grid\n pushUniformLayout(\n \"simulation\",\n [\n \"dt\",\n \"count\",\n \"simStride\",\n \"maxSize\",\n \"iteration\",\n \"maxNeighbors\",\n \"maxParticles\",\n ] as const,\n 1\n );\n pushUniformLayout(\n \"grid\",\n [\n \"minX\",\n \"minY\",\n \"maxX\",\n \"maxY\",\n \"cols\",\n \"rows\",\n \"cellSize\",\n \"maxPerCell\",\n ] as const,\n 2\n );\n\n // 2) User module uniforms start at binding(3)\n let nextBindingIndex = 3;\n const arrayDecls: string[] = [];\n const arrayBindings: Record<\n string,\n { arrayBinding: number; lengthBinding: number; combinedArrayVar?: string }\n > = {};\n\n modules.forEach((module) => {\n const uniformsVar = `${module.name}_uniforms`;\n const structName = `Uniforms_${cap(module.name)}`;\n\n // Separate number inputs (including enabled) from array inputs\n const numberInputs = Object.entries(module.inputs)\n .filter(([_, type]) => type === DataType.NUMBER)\n .map(([key, _]) => key);\n const arrayInputs = Object.entries(module.inputs)\n .filter(([_, type]) => type === DataType.ARRAY)\n .map(([key, _]) => key);\n\n // Add enabled and array lengths as number inputs\n const arrayLengthInputs = arrayInputs.map((key) => `${key}_length`);\n const allNumberInputs = [...numberInputs, \"enabled\", ...arrayLengthInputs];\n\n // Create uniform buffer for number inputs\n const bindingIndex = nextBindingIndex++;\n const vec4Count = Math.max(1, Math.ceil(allNumberInputs.length / 4));\n const mapping: Record<\n string,\n { flatIndex: number; expr: string; offsetExpr?: string }\n > = {};\n\n allNumberInputs.forEach((id, i) => {\n const v = Math.floor(i / 4),\n c = i % 4;\n const comp = c === 0 ? \"x\" : c === 1 ? \"y\" : c === 2 ? \"z\" : \"w\";\n mapping[id] = {\n flatIndex: v * 4 + c,\n expr: `${uniformsVar}.v${v}.${comp}`,\n };\n });\n\n const structWGSL = `struct ${structName} {\\n${Array.from(\n { length: vec4Count },\n (_, i) => ` v${i}: vec4<f32>,`\n ).join(\"\\n\")}\\n}`;\n const varDecl = `@group(0) @binding(${bindingIndex}) var<uniform> ${uniformsVar}: ${structName};`;\n\n layouts.push({\n moduleName: module.name,\n moduleRole: module.role,\n bindingIndex,\n uniformsVar,\n structName,\n sizeBytes: vec4Count * 16,\n vec4Count,\n mapping,\n });\n uniformDecls.push(structWGSL, varDecl);\n\n // Create combined storage buffer for all array inputs of this module\n if (arrayInputs.length > 0) {\n const arrayBinding = nextBindingIndex++;\n const combinedArrayVar = `${module.name}_arrays`;\n\n // Add combined array storage buffer declaration\n arrayDecls.push(\n `@group(0) @binding(${arrayBinding}) var<storage, read> ${combinedArrayVar}: array<f32>;`\n );\n\n // Add offset uniforms for each array in the combined buffer\n let offsetIndex = allNumberInputs.length;\n arrayInputs.forEach((arrayKey) => {\n const offsetKey = `${arrayKey}_offset`;\n const offsetMapping = {\n flatIndex: offsetIndex,\n expr: `${uniformsVar}.v${Math.floor(offsetIndex / 4)}.${\n [\"x\", \"y\", \"z\", \"w\"][offsetIndex % 4]\n }`,\n };\n mapping[offsetKey] = offsetMapping;\n offsetIndex++;\n });\n\n // Update vec4Count to include offset fields\n const totalNumberInputs = allNumberInputs.length + arrayInputs.length;\n const updatedVec4Count = Math.max(1, Math.ceil(totalNumberInputs / 4));\n\n // Re-generate the struct with additional offset fields\n const updatedStructWGSL = `struct ${structName} {\\n${Array.from(\n { length: updatedVec4Count },\n (_, i) => ` v${i}: vec4<f32>,`\n ).join(\"\\n\")}\\n}`;\n\n // Update the layout\n layouts[layouts.length - 1].vec4Count = updatedVec4Count;\n layouts[layouts.length - 1].sizeBytes = updatedVec4Count * 16;\n\n // Replace the last struct declaration\n uniformDecls[uniformDecls.length - 2] = updatedStructWGSL;\n\n // Track combined array binding for this module\n arrayBindings[module.name] = {\n arrayBinding,\n lengthBinding: -1, // No separate binding, using main uniform\n combinedArrayVar,\n };\n\n arrayInputs.forEach((arrayKey) => {\n // Length is stored in the main uniform buffer\n const lengthKey = `${arrayKey}_length`;\n const lengthMapping = mapping[lengthKey];\n const lengthExpr = lengthMapping ? lengthMapping.expr : \"0u\";\n\n // Offset is also stored in the main uniform buffer\n const offsetKey = `${arrayKey}_offset`;\n const offsetMapping = mapping[offsetKey];\n const offsetExpr = offsetMapping ? offsetMapping.expr : \"0u\";\n\n // Add array mappings for getUniform access (base expression without index)\n mapping[arrayKey] = {\n flatIndex: -1, // Not in uniform buffer\n expr: combinedArrayVar, // Base array reference, offset will be added by getUniform\n offsetExpr, // Store offset expression for getUniform to use\n };\n\n // Ensure length mapping exists\n if (!mapping[lengthKey] || mapping[lengthKey].flatIndex === -1) {\n mapping[lengthKey] = {\n flatIndex: -1,\n expr: lengthExpr,\n };\n }\n });\n }\n });\n\n const dtExpr = layouts.find((l) => l.moduleName === \"simulation\")!.mapping.dt\n .expr;\n const countExpr = layouts.find((l) => l.moduleName === \"simulation\")!.mapping\n .count.expr;\n const maxParticlesExpr = layouts.find((l) => l.moduleName === \"simulation\")!.mapping\n .maxParticles.expr;\n const maxSizeExpr = layouts.find((l) => l.moduleName === \"simulation\")!\n .mapping.maxSize.expr;\n \n // Effective count is min(count, maxParticles) when maxParticles >= 0 (not null)\n // We use -1 as the sentinel value for null in the shader\n // select(if_false, if_true, condition) - returns if_true when condition is true\n const effectiveCountExpr = `select(u32(${countExpr}), min(u32(${countExpr}), u32(${maxParticlesExpr})), ${maxParticlesExpr} >= 0.0)`;\n\n const baseState = [\"prevX\", \"prevY\", \"posIntX\", \"posIntY\"] as const;\n const stateSlots: Record<string, number> = {};\n baseState.forEach((k, i) => (stateSlots[k] = i));\n let nextSlot = baseState.length;\n const localSlots: Record<string, Record<string, number>> = {};\n modules.forEach((module, idx) => {\n localSlots[module.name] = {};\n if (module.role === ModuleRole.Force) {\n const descriptor = descriptors[idx] as WebGPUForceDescriptor;\n descriptor.states?.forEach((field) => {\n const key = `${module.name}.${field}`;\n if (stateSlots[key] === undefined) stateSlots[key] = nextSlot++;\n localSlots[module.name][field] = stateSlots[key];\n });\n }\n });\n const SIM_STATE_STRIDE_VAL = nextSlot;\n\n // Grid and system bindings come after all module bindings (including arrays)\n const gridCountsBinding = nextBindingIndex++;\n const gridIndicesBinding = nextBindingIndex++;\n const simStateBinding = nextBindingIndex++;\n const sceneTextureBinding = nextBindingIndex++;\n const gridDecls = [\n `@group(0) @binding(${gridCountsBinding}) var<storage, read_write> GRID_COUNTS: array<atomic<u32>>;`,\n `@group(0) @binding(${gridIndicesBinding}) var<storage, read_write> GRID_INDICES: array<u32>;`,\n `@group(0) @binding(${simStateBinding}) var<storage, read_write> SIM_STATE: array<f32>;`,\n `@group(0) @binding(${sceneTextureBinding}) var scene_texture: texture_2d<f32>;`,\n ...arrayDecls,\n ];\n\n const makeGetUniformAndLength = (module: Module) => {\n const layout = layouts.find((l) => l.moduleName === module.name)!;\n const getUniform = (id: string, index?: number | string) => {\n const mapping = layout.mapping[id];\n if (!mapping) return \"0.0\";\n\n // Check if this is an array input\n if (module.inputs[id] === DataType.ARRAY) {\n if (index !== undefined) {\n // Use combined array with offset\n const offsetExpr = mapping.offsetExpr || \"0u\";\n return `${mapping.expr}[u32(${offsetExpr}) + u32(${index})]`;\n } else {\n // Return the array variable name itself for direct access\n return mapping.expr;\n }\n } else {\n // Regular number input\n return mapping.expr;\n }\n };\n const getLength = (id: string) => {\n if (module.inputs[id] === DataType.ARRAY) {\n const lengthMapping = layout.mapping[`${id}_length`];\n return `u32(${lengthMapping?.expr ?? \"0.0\"})`;\n }\n return \"0u\";\n };\n return { getUniform, getLength };\n };\n\n const globals: string[] = [];\n // Internal simulation helpers\n const simLayout = layouts.find((l) => l.moduleName === \"simulation\")!;\n const gridLayout = layouts.find((l) => l.moduleName === \"grid\")!;\n globals.push(`// Internal simulation helpers`);\n globals.push(\n `fn SIM_STATE_STRIDE() -> u32 { return u32(${simLayout.mapping.simStride.expr}); }\nfn SIM_COUNT() -> u32 { return ${effectiveCountExpr}; }\nfn SIM_ITERATION() -> u32 { return u32(${simLayout.mapping.iteration.expr}); }\nfn SIM_MAX_NEIGHBORS() -> u32 { return u32(${simLayout.mapping.maxNeighbors.expr}); }\nfn sim_state_index(pid: u32, slot: u32) -> u32 { return pid * SIM_STATE_STRIDE() + slot; }\nfn sim_state_read(pid: u32, slot: u32) -> f32 { return SIM_STATE[sim_state_index(pid, slot)]; }\nfn sim_state_write(pid: u32, slot: u32, value: f32) { SIM_STATE[sim_state_index(pid, slot)] = value; }`\n );\n // Internal grid helpers\n globals.push(`// Internal grid helpers`);\n globals.push(\n `const NEIGHBOR_NONE: u32 = 0xffffffffu;\nfn GRID_COLS() -> u32 { return u32(${gridLayout.mapping.cols.expr}); }\nfn GRID_ROWS() -> u32 { return u32(${gridLayout.mapping.rows.expr}); }\nfn GRID_MINX() -> f32 { return ${gridLayout.mapping.minX.expr}; }\nfn GRID_MINY() -> f32 { return ${gridLayout.mapping.minY.expr}; }\nfn GRID_MAXX() -> f32 { return ${gridLayout.mapping.maxX.expr}; }\nfn GRID_MAXY() -> f32 { return ${gridLayout.mapping.maxY.expr}; }\nfn GRID_CELL_SIZE() -> f32 { return ${gridLayout.mapping.cellSize.expr}; }\nfn GRID_MAX_PER_CELL() -> u32 { return u32(${gridLayout.mapping.maxPerCell.expr}); }\nfn grid_cell_index(pos: vec2<f32>) -> u32 { let col = i32(floor((pos.x - GRID_MINX()) / GRID_CELL_SIZE())); let row = i32(floor((pos.y - GRID_MINY()) / GRID_CELL_SIZE())); let c = max(0, min(col, i32(GRID_COLS()) - 1)); let r = max(0, min(row, i32(GRID_ROWS()) - 1)); return u32(r) * GRID_COLS() + u32(c); }\nfn grid_cell_index_from_rc(r: i32, c: i32) -> u32 { let rr = max(0, min(r, i32(GRID_ROWS()) - 1)); let cc = max(0, min(c, i32(GRID_COLS()) - 1)); return u32(rr) * GRID_COLS() + u32(cc); }\nstruct NeighborIter { cx: i32, cy: i32, r: i32, c: i32, k: u32, reach: i32, maxK: u32, base: u32, emitted: u32, maxEmit: u32 }\nfn neighbor_iter_init(pos: vec2<f32>, radius: f32) -> NeighborIter { let cx = i32(floor((pos.x - GRID_MINX()) / GRID_CELL_SIZE())); let cy = i32(floor((pos.y - GRID_MINY()) / GRID_CELL_SIZE())); let reach = max(1, i32(ceil(radius / GRID_CELL_SIZE()))); var it: NeighborIter; it.cx = cx; it.cy = cy; it.reach = reach; it.r = cy - reach; it.c = cx - reach; let firstCell = grid_cell_index_from_rc(it.r, it.c); let cnt = atomicLoad(&GRID_COUNTS[firstCell]); it.maxK = min(cnt, GRID_MAX_PER_CELL()); it.base = firstCell * GRID_MAX_PER_CELL(); it.k = 0u; it.emitted = 0u; it.maxEmit = max(1u, SIM_MAX_NEIGHBORS()); return it; }\nfn neighbor_iter_next(it: ptr<function, NeighborIter>, selfIndex: u32) -> u32 { loop { if ((*it).emitted >= (*it).maxEmit) { return NEIGHBOR_NONE; } if ((*it).r > (*it).cy + (*it).reach) { return NEIGHBOR_NONE; } if ((*it).k < (*it).maxK) { let id = GRID_INDICES[(*it).base + (*it).k]; (*it).k = (*it).k + 1u; if (id != selfIndex) { (*it).emitted = (*it).emitted + 1u; return id; } else { continue; } } (*it).c = (*it).c + 1; if ((*it).c > (*it).cx + (*it).reach) { (*it).c = (*it).cx - (*it).reach; (*it).r = (*it).r + 1; } if ((*it).r > (*it).cy + (*it).reach) { return NEIGHBOR_NONE; } let cell = grid_cell_index_from_rc((*it).r, (*it).c); let cnt = atomicLoad(&GRID_COUNTS[cell]); (*it).maxK = min(cnt, GRID_MAX_PER_CELL()); (*it).base = cell * GRID_MAX_PER_CELL(); (*it).k = 0u; } }`\n );\n\n // Optional: allow force modules to inject globals\n const addGlobal = (module: Module, descriptor: WebGPUForceDescriptor) => {\n if (module.role !== ModuleRole.Force) return;\n if (!descriptor.global) return;\n const { getUniform, getLength } = makeGetUniformAndLength(module);\n const code = descriptor.global({ getUniform, getLength });\n if (code && code.trim()) {\n globals.push(`// Global for ${module.name}`);\n globals.push(code.trim());\n }\n };\n modules\n .filter((m) => m.role === ModuleRole.Force)\n .forEach((m, idx) =>\n addGlobal(m, descriptors[idx] as WebGPUForceDescriptor)\n );\n\n const systemEntrypoints: string[] = [];\n systemEntrypoints.push(`@compute @workgroup_size(64)\nfn grid_clear(@builtin(global_invocation_id) global_id: vec3<u32>) {\n let idx = global_id.x;\n let total = GRID_COLS() * GRID_ROWS();\n if (idx < total) {\n atomicStore(&GRID_COUNTS[idx], 0u);\n }\n}`);\n systemEntrypoints.push(`@compute @workgroup_size(64)\nfn grid_build(@builtin(global_invocation_id) global_id: vec3<u32>) {\n let i = global_id.x;\n let count = SIM_COUNT();\n if (i >= count) { return; }\n let p = particles[i];\n if (p.mass == 0.0) { return; }\n let minX = GRID_MINX();\n let maxX = GRID_MAXX();\n let minY = GRID_MINY();\n let maxY = GRID_MAXY();\n let pad = GRID_CELL_SIZE() * 2.0;\n if (p.position.x + p.size < minX - pad || p.position.x - p.size > maxX + pad || p.position.y + p.size < minY - pad || p.position.y - p.size > maxY + pad) {\n return;\n }\n let cell = grid_cell_index(p.position);\n let offset = atomicAdd(&GRID_COUNTS[cell], 1u);\n if (offset < GRID_MAX_PER_CELL()) {\n let base = cell * GRID_MAX_PER_CELL();\n GRID_INDICES[base + offset] = i;\n }\n}`);\n\n const moduleFns: string[] = [];\n const stateStmts: string[] = [];\n const applyStmts: string[] = [];\n const constrainStmts: string[] = [];\n const correctStmts: string[] = [];\n const fn = (kind: string, name: string) => `${kind}_${name}`;\n const makeGetSet = (modName: string) => {\n const get = (name: string, pidVar = \"index\") => {\n const slot =\n stateSlots[name] !== undefined\n ? stateSlots[name]\n : localSlots[modName]?.[name];\n return slot === undefined\n ? \"0.0\"\n : `sim_state_read(u32(${pidVar}), ${slot}u)`;\n };\n const set = (name: string, val: string, pidVar = \"index\") => {\n const slot =\n stateSlots[name] !== undefined\n ? stateSlots[name]\n : localSlots[modName]?.[name];\n return slot === undefined\n ? \"\"\n : `sim_state_write(u32(${pidVar}), ${slot}u, ${val})`;\n };\n return { get, set };\n };\n\n modules.forEach((module, idx) => {\n if (module.role !== ModuleRole.Force) return;\n const descriptor = descriptors[idx] as WebGPUForceDescriptor;\n if (!descriptor.state) return;\n const layout = layouts.find((l) => l.moduleName === module.name)!;\n const { set } = makeGetSet(module.name);\n const { getUniform, getLength } = makeGetUniformAndLength(module);\n const body = descriptor.state({\n particleVar: \"particle\",\n dtVar: dtExpr,\n maxSizeVar: maxSizeExpr,\n getUniform,\n getLength,\n setState: set,\n });\n if (body && body.trim()) {\n const enabled = layout.mapping.enabled.expr;\n const name = fn(\"state\", module.name);\n moduleFns.push(\n `fn ${name}(particle: ptr<function, Particle>, index: u32) {\\n ${body.trim()}\\n}`\n );\n stateStmts.push(`if (${enabled} != 0.0) { ${name}(&particle, index); }`);\n }\n });\n\n modules.forEach((module, idx) => {\n if (module.role !== ModuleRole.Force) return;\n const descriptor = descriptors[idx] as WebGPUForceDescriptor;\n if (!descriptor.apply) return;\n const layout = layouts.find((l) => l.moduleName === module.name)!;\n const { get } = makeGetSet(module.name);\n const { getUniform, getLength } = makeGetUniformAndLength(module);\n const body = descriptor.apply({\n particleVar: \"particle\",\n dtVar: dtExpr,\n maxSizeVar: maxSizeExpr,\n getUniform,\n getLength,\n getState: get,\n });\n if (body && body.trim()) {\n const enabled = layout.mapping.enabled.expr;\n const name = fn(\"apply\", module.name);\n moduleFns.push(\n `fn ${name}(particle: ptr<function, Particle>, index: u32) {\\n ${body.trim()}\\n}`\n );\n applyStmts.push(`if (${enabled} != 0.0) { ${name}(&particle, index); }`);\n }\n });\n\n modules.forEach((module, idx) => {\n if (module.role !== ModuleRole.Force) return;\n const descriptor = descriptors[idx] as WebGPUForceDescriptor;\n if (!descriptor.constrain) return;\n const layout = layouts.find((l) => l.moduleName === module.name)!;\n const { get } = makeGetSet(module.name);\n const { getUniform, getLength } = makeGetUniformAndLength(module);\n const body = descriptor.constrain({\n particleVar: \"particle\",\n dtVar: dtExpr,\n maxSizeVar: maxSizeExpr,\n getUniform,\n getLength,\n getState: get,\n });\n if (body && body.trim()) {\n const enabled = layout.mapping.enabled.expr;\n const name = fn(\"constrain\", module.name);\n moduleFns.push(\n `fn ${name}(particle: ptr<function, Particle>, index: u32) {\\n ${body.trim()}\\n}`\n );\n constrainStmts.push(\n `if (${enabled} != 0.0) { ${name}(&particle, index); }`\n );\n }\n });\n\n modules.forEach((module, idx) => {\n if (module.role !== ModuleRole.Force) return;\n const descriptor = descriptors[idx] as WebGPUForceDescriptor;\n if (!descriptor.correct) return;\n const layout = layouts.find((l) => l.moduleName === module.name)!;\n const { get } = makeGetSet(module.name);\n const { getUniform, getLength } = makeGetUniformAndLength(module);\n const body = descriptor.correct({\n particleVar: \"particle\",\n dtVar: dtExpr,\n maxSizeVar: maxSizeExpr,\n prevPosVar: \"prevPos\",\n postPosVar: \"postPos\",\n getUniform,\n getLength,\n getState: get,\n });\n if (body && body.trim()) {\n const enabled = layout.mapping.enabled.expr;\n const name = fn(\"correct\", module.name);\n const functionCode = `fn ${name}(particle: ptr<function, Particle>, index: u32, prevPos: vec2<f32>, postPos: vec2<f32>) {\\n ${body.trim()}\\n}`;\n const callStatement = `if (${enabled} != 0.0) { ${name}(&particle, index, prevPos, postPos); }`;\n\n moduleFns.push(functionCode);\n correctStmts.push(callStatement);\n }\n });\n\n const statePass = `@compute @workgroup_size(64)\\nfn state_pass(@builtin(global_invocation_id) gid: vec3<u32>) {\\n let index = gid.x;\\n let count = ${effectiveCountExpr};\\n if (index >= count) { return; }\\n var particle = particles[index];\\n if (particle.mass <= 0.0) { return; }\\n ${stateStmts.join(\n \"\\n \"\n )}\\n particles[index] = particle;\\n}`;\n const applyPass = `@compute @workgroup_size(64)\\nfn apply_pass(@builtin(global_invocation_id) gid: vec3<u32>) {\\n let index = gid.x;\\n let count = ${effectiveCountExpr};\\n if (index >= count) { return; }\\n var particle = particles[index];\\n if (particle.mass <= 0.0) { return; }\\n ${applyStmts.join(\n \"\\n \"\n )}\\n particles[index] = particle;\\n}`;\n const integratePass = `@compute @workgroup_size(64)\\nfn integrate_pass(@builtin(global_invocation_id) gid: vec3<u32>) {\\n let index = gid.x;\\n let count = ${effectiveCountExpr};\\n if (index >= count) { return; }\\n var particle = particles[index];\\n if (particle.mass <= 0.0) { return; }\\n sim_state_write(index, 0u, particle.position.x);\\n sim_state_write(index, 1u, particle.position.y);\\n particle.velocity += particle.acceleration * ${dtExpr};\\n particle.position += particle.velocity * ${dtExpr};\\n sim_state_write(index, 2u, particle.position.x);\\n sim_state_write(index, 3u, particle.position.y);\\n particle.acceleration = vec2<f32>(0.0, 0.0);\\n particles[index] = particle;\\n}`;\n const constrainPass = `@compute @workgroup_size(64)\\nfn constrain_pass(@builtin(global_invocation_id) gid: vec3<u32>) {\\n let index = gid.x;\\n let count = ${effectiveCountExpr};\\n if (index >= count) { return; }\\n var particle = particles[index];\\n if (particle.mass <= 0.0) { return; }\\n ${constrainStmts.join(\n \"\\n \"\n )}\\n particles[index] = particle;\\n}`;\n const correctPass = `@compute @workgroup_size(64)\\nfn correct_pass(@builtin(global_invocation_id) gid: vec3<u32>) {\\n let index = gid.x;\\n let count = ${effectiveCountExpr};\\n if (index >= count) { return; }\\n var particle = particles[index];\\n if (particle.mass <= 0.0) { return; }\\n \\n // Compute position variables from integration state\\n let prevPos = vec2<f32>(sim_state_read(index, 0u), sim_state_read(index, 1u));\\n let postPos = vec2<f32>(sim_state_read(index, 2u), sim_state_read(index, 3u));\\n \\n ${correctStmts.join(\n \"\\n \"\n )}\\n particles[index] = particle;\\n}`;\n const mainPass = `@compute @workgroup_size(64)\\nfn main(@builtin(global_invocation_id) _gid: vec3<u32>) {}`;\n\n const code = [\n PARTICLE_STRUCT,\n STORAGE_DECL,\n ...uniformDecls,\n ...gridDecls,\n ...globals,\n ...systemEntrypoints,\n ...moduleFns,\n statePass,\n applyPass,\n integratePass,\n constrainPass,\n correctPass,\n mainPass,\n ].join(\"\\n\\n\");\n\n return {\n code,\n layouts,\n simStateStride: SIM_STATE_STRIDE_VAL,\n extraBindings: {\n grid: {\n countsBinding: gridCountsBinding,\n indicesBinding: gridIndicesBinding,\n },\n simState: { stateBinding: simStateBinding },\n sceneTexture: { textureBinding: sceneTextureBinding },\n arrays: Object.keys(arrayBindings).length > 0 ? arrayBindings : undefined,\n },\n };\n}\n","/**\n * ModuleRegistry\n *\n * Central registry for modules. It builds the combined WGSL Program and manages\n * per-module uniform state on the CPU, mirroring it into GPU uniform buffers.\n *\n * Key behaviors:\n * - Builds `Program` via the builders (uniform layouts + generated WGSL code)\n * - Allocates module uniform buffers and seeds default CPU-side uniform values\n * - Attaches uniform writers/readers to each Module instance\n * - Exposes helpers to get enabled render descriptors for the render pipeline\n * - Flushes uniform state to GPU upon writes and on initialization\n */\nimport type { GPUResources } from \"./gpu-resources\";\nimport { buildProgram, type Program } from \"./builders/program\";\nimport {\n Module,\n ModuleRole,\n type WebGPURenderDescriptor,\n DataType,\n} from \"../../module\";\n\n/**\n * Manages module enablement/state, builds the Program, and exposes uniform writers/readers.\n */\nexport class ModuleRegistry {\n private readonly modules: readonly Module[];\n private program: Program | null = null;\n private moduleUniformState: Record<string, number>[] = [];\n private moduleArrayState: Record<string, Record<string, number[]>> = {};\n private nameToIndex: Map<string, number> = new Map();\n private resources: GPUResources | null = null;\n\n constructor(modules: readonly Module[]) {\n this.modules = modules;\n }\n\n /**\n * Build WGSL program and allocate per-module uniform buffers.\n * Also seeds CPU-side uniform state and attaches writers/readers to modules.\n */\n initialize(resources: GPUResources): void {\n this.resources = resources;\n this.program = buildProgram(this.modules);\n // Rebuild name -> layout index map using Program layouts (includes internal first)\n this.nameToIndex = new Map();\n this.program.layouts.forEach((layout, i) =>\n this.nameToIndex.set(layout.moduleName, i)\n );\n resources.createModuleUniformBuffers(this.program.layouts);\n\n // Create array storage buffers for modules with array inputs\n this.modules.forEach((module) => {\n const arrayInputs = Object.entries(module.inputs)\n .filter(([_, type]) => type === DataType.ARRAY)\n .map(([key, _]) => key);\n\n if (arrayInputs.length > 0) {\n resources.createCombinedArrayStorageBuffer(module.name, arrayInputs);\n this.moduleArrayState[module.name] = {};\n arrayInputs.forEach((arrayKey) => {\n this.moduleArrayState[module.name][arrayKey] = [];\n });\n }\n });\n\n // Initialize CPU-side uniform state for each module\n this.moduleUniformState = this.program.layouts.map((layout) => {\n const state: Record<string, number> = {};\n for (const key of Object.keys(layout.mapping)) {\n // Only initialize number inputs (not array references)\n if (layout.mapping[key].flatIndex !== -1) {\n state[key] = 0;\n }\n }\n if (layout.moduleName !== \"simulation\" && \"enabled\" in layout.mapping) {\n state[\"enabled\"] = 1;\n }\n return state;\n });\n\n // Seed simStride if present on the simulation layout\n const simIdx = this.program.layouts.findIndex(\n (l) => l.moduleName === \"simulation\"\n );\n if (simIdx !== -1 && this.program.layouts[simIdx].mapping[\"simStride\"]) {\n this.moduleUniformState[simIdx][\"simStride\"] =\n this.program.simStateStride;\n }\n\n // Attach per-module uniform writers/readers\n this.modules.forEach((mod) => {\n const name = mod.name;\n mod.attachUniformWriter((values) =>\n this.writeModuleUniform(name, values)\n );\n mod.attachUniformReader(() => this.readModuleUniform(name));\n });\n }\n\n getProgram(): Program {\n if (!this.program) throw new Error(\"Program not initialized\");\n return this.program;\n }\n\n /** Returns a writer for the given module name. */\n getUniformWriter(\n name: string\n ): (values: Partial<Record<string, number | number[]>>) => void {\n return (values) => this.writeModuleUniform(name, values);\n }\n\n /** Returns a reader for the given module name. */\n getUniformReader(\n name: string\n ): () => Partial<Record<string, number | number[]>> {\n return () => this.readModuleUniform(name);\n }\n\n /** Filter enabled render module descriptors for the render pipeline. */\n getEnabledRenderDescriptors(): WebGPURenderDescriptor[] {\n return this.modules\n .map((m) => m.webgpu())\n .filter(\n (_descriptor, idx): _descriptor is WebGPURenderDescriptor =>\n this.modules[idx].role === ModuleRole.Render &&\n this.modules[idx].isEnabled()\n );\n }\n\n /** Get enabled render modules for the render pipeline.\n * Includes any module that provides render passes in its descriptor, regardless of role.\n */\n getEnabledRenderModules(): Module[] {\n return this.modules.filter((module, idx) => {\n if (!module.isEnabled()) return false;\n const descriptor = this.modules[idx].webgpu() as WebGPURenderDescriptor;\n return !!(\n descriptor &&\n descriptor.passes &&\n descriptor.passes.length > 0\n );\n });\n }\n\n /** Get all modules. */\n getModules(): readonly Module[] {\n return this.modules;\n }\n\n /** Write the current CPU state for all module uniforms to GPU buffers. */\n writeAllModuleUniforms(): void {\n if (!this.resources || !this.program) return;\n for (let i = 0; i < this.program.layouts.length; i++) {\n const name = this.program.layouts[i].moduleName;\n if (name === \"simulation\" || name === \"grid\") continue; // internal uniforms are managed elsewhere\n this.flushModuleUniform(i);\n }\n }\n\n // Internal helpers\n private readModuleUniform(\n name: string\n ): Partial<Record<string, number | number[]>> {\n const idx = this.getModuleIndex(name);\n const result: Partial<Record<string, number | number[]>> = {\n ...(this.moduleUniformState[idx] || {}),\n };\n\n // Add array state if present\n if (this.moduleArrayState[name]) {\n Object.assign(result, this.moduleArrayState[name]);\n }\n\n return result;\n }\n\n private writeModuleUniform(\n name: string,\n values: Partial<Record<string, number | number[]>>\n ): void {\n if (!this.program || !this.resources) return;\n const idx = this.getModuleIndex(name);\n const state = this.moduleUniformState[idx];\n\n // First pass: collect array updates and update state\n const arrayDataMap: Record<string, number[]> = {};\n let hasArrayUpdate = false;\n\n for (const [key, value] of Object.entries(values)) {\n if (Array.isArray(value)) {\n // Handle array inputs\n if (this.moduleArrayState[name]) {\n this.moduleArrayState[name][key] = [...value];\n arrayDataMap[key] = value;\n\n // Store array length in uniform state\n state[`${key}_length`] = value.length;\n hasArrayUpdate = true;\n }\n } else if (typeof value === \"number\") {\n // Handle number inputs\n state[key] = value;\n }\n }\n\n // Second pass: recalculate all offsets for this module if any array changed\n const arrayOffsets: Record<string, number> = {};\n if (hasArrayUpdate && this.moduleArrayState[name]) {\n // Get all array keys in a consistent order (alphabetical)\n const arrayKeys = Object.keys(this.moduleArrayState[name]).sort();\n let currentOffset = 0;\n\n for (const arrayKey of arrayKeys) {\n arrayOffsets[arrayKey] = currentOffset;\n state[`${arrayKey}_offset`] = currentOffset;\n currentOffset += this.moduleArrayState[name][arrayKey].length;\n }\n\n // Need to write all arrays, not just the ones that changed\n for (const arrayKey of arrayKeys) {\n if (!arrayDataMap[arrayKey]) {\n arrayDataMap[arrayKey] = this.moduleArrayState[name][arrayKey];\n }\n }\n }\n\n // Write combined array data if there are array updates\n if (hasArrayUpdate && Object.keys(arrayDataMap).length > 0) {\n this.resources.writeCombinedArrayStorage(\n name,\n arrayDataMap,\n arrayOffsets\n );\n }\n\n this.flushModuleUniform(idx);\n }\n\n private flushModuleUniform(index: number): void {\n if (!this.resources || !this.program) return;\n const layout = this.program.layouts[index];\n const state = this.moduleUniformState[index];\n const data = new Float32Array(layout.vec4Count * 4);\n for (const [key, map] of Object.entries(layout.mapping)) {\n data[(map as { flatIndex: number }).flatIndex] = state[key] ?? 0;\n }\n\n this.resources.writeModuleUniform(index, data);\n }\n\n private getModuleIndex(name: string): number {\n const idx = this.nameToIndex.get(name);\n if (idx === undefined) throw new Error(`Unknown module: ${name}`);\n return idx;\n }\n}\n","/**\n * GridSystem\n *\n * Maintains a world-aligned uniform grid based on the current view snapshot.\n * Allocates GPU storage for per-cell counts/indices and writes grid uniforms\n * into the `grid` system module's uniform buffer. Exposes resizeIfNeeded to\n * keep grid state synchronized with camera/zoom/size changes.\n */\nimport type { Program } from \"./builders/program\";\nimport type { GPUResources } from \"./gpu-resources\";\nimport type { ViewSnapshot } from \"../../view\";\n\nexport class SpacialGrid {\n private cols: number = 0;\n private rows: number = 0;\n private cellSize: number;\n private maxPerCell: number = 256;\n private lastView: ViewSnapshot | null = null;\n\n constructor(cellSize: number = 16) {\n this.cellSize = cellSize;\n }\n\n configure(\n view: ViewSnapshot,\n resources: GPUResources,\n program: Program\n ): void {\n const { minX, minY, maxX, maxY, cols, rows } = this.computeGrid(view);\n this.cols = cols;\n this.rows = rows;\n // Recreate storage to match grid dimensions\n resources.createGridStorage(cols * rows, this.maxPerCell);\n // Write grid uniforms\n this.writeUniforms(resources, program, {\n minX,\n minY,\n maxX,\n maxY,\n cols,\n rows,\n cellSize: this.cellSize,\n maxPerCell: this.maxPerCell,\n });\n this.lastView = { ...view };\n }\n\n resizeIfNeeded(\n view: ViewSnapshot,\n resources: GPUResources,\n program: Program\n ): void {\n if (\n this.lastView &&\n this.lastView.width === view.width &&\n this.lastView.height === view.height &&\n this.lastView.cx === view.cx &&\n this.lastView.cy === view.cy &&\n this.lastView.zoom === view.zoom\n ) {\n return;\n }\n this.configure(view, resources, program);\n }\n\n getCellCount(): number {\n return this.cols * this.rows;\n }\n\n getCellSize(): number {\n return this.cellSize;\n }\n\n setCellSize(cellSize: number): void {\n if (cellSize <= 0) {\n throw new Error(\"Cell size must be greater than 0\");\n }\n this.cellSize = cellSize;\n // Clear last view to force reconfiguration on next resizeIfNeeded/configure call\n this.lastView = null;\n }\n\n private computeGrid(view: ViewSnapshot): {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n cols: number;\n rows: number;\n } {\n const zoom = Math.max(view.zoom, 0.0001);\n const halfW = view.width / (2 * zoom);\n const halfH = view.height / (2 * zoom);\n const minX = view.cx - halfW;\n const maxX = view.cx + halfW;\n const minY = view.cy - halfH;\n const maxY = view.cy + halfH;\n const cols = Math.max(1, Math.ceil((maxX - minX) / this.cellSize));\n const rows = Math.max(1, Math.ceil((maxY - minY) / this.cellSize));\n return { minX, minY, maxX, maxY, cols, rows };\n }\n\n private writeUniforms(\n resources: GPUResources,\n program: Program,\n grid: {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n cols: number;\n rows: number;\n cellSize: number;\n maxPerCell: number;\n }\n ): void {\n const gridIdx = program.layouts.findIndex((l) => l.moduleName === \"grid\");\n if (gridIdx === -1) return;\n const layout = program.layouts[gridIdx];\n const values = new Float32Array(layout.vec4Count * 4);\n const mapping = layout.mapping as Record<string, { flatIndex: number }>;\n values[mapping.minX.flatIndex] = grid.minX;\n values[mapping.minY.flatIndex] = grid.minY;\n values[mapping.maxX.flatIndex] = grid.maxX;\n values[mapping.maxY.flatIndex] = grid.maxY;\n values[mapping.cols.flatIndex] = grid.cols;\n values[mapping.rows.flatIndex] = grid.rows;\n values[mapping.cellSize.flatIndex] = grid.cellSize;\n values[mapping.maxPerCell.flatIndex] = grid.maxPerCell;\n resources.writeModuleUniform(gridIdx, values);\n }\n}\n","/**\n * SimulationPipeline\n *\n * Wraps the compute side of the program. Builds compute layouts/pipelines from the\n * generated WGSL and runs the available passes in sequence each frame:\n * - grid_clear, grid_build (if present)\n * - state_pass, apply_pass, integrate_pass, constrain_pass (N iterations), correct_pass\n * If specialized passes are not present, falls back to `main`.\n */\nimport type { Program } from \"./builders/program\";\nimport type { GPUResources } from \"./gpu-resources\";\n\nexport class SimulationPipeline {\n private program: Program | null = null;\n\n initialize(resources: GPUResources, program: Program): void {\n this.program = program;\n resources.buildComputeLayouts(program);\n resources.buildComputePipelines(program.code);\n }\n\n runPasses(\n encoder: GPUCommandEncoder,\n resources: GPUResources,\n params: {\n particleCount: number;\n gridCellCount: number;\n workgroupSize: number;\n constrainIterations?: number;\n }\n ): void {\n if (!this.program) throw new Error(\"SimulationPipeline not initialized\");\n const bindGroup = resources.createComputeBindGroup(this.program);\n const groups = Math.ceil(params.particleCount / params.workgroupSize);\n const pipelines = resources.getSimulationPipelines();\n\n if (pipelines.gridClear && params.gridCellCount > 0) {\n const pass = encoder.beginComputePass();\n pass.setBindGroup(0, bindGroup);\n pass.setPipeline(pipelines.gridClear);\n const clearGroups = Math.ceil(\n params.gridCellCount / params.workgroupSize\n );\n if (clearGroups > 0) pass.dispatchWorkgroups(clearGroups);\n pass.end();\n }\n\n if (pipelines.gridBuild && params.particleCount > 0) {\n const pass = encoder.beginComputePass();\n pass.setBindGroup(0, bindGroup);\n pass.setPipeline(pipelines.gridBuild);\n const buildGroups = Math.ceil(\n params.particleCount / params.workgroupSize\n );\n if (buildGroups > 0) pass.dispatchWorkgroups(buildGroups);\n pass.end();\n }\n\n if (\n pipelines.state &&\n pipelines.apply &&\n pipelines.integrate &&\n pipelines.constrain &&\n pipelines.correct\n ) {\n if (groups > 0 && pipelines.state) {\n const pass = encoder.beginComputePass();\n pass.setBindGroup(0, bindGroup);\n pass.setPipeline(pipelines.state);\n pass.dispatchWorkgroups(groups);\n pass.end();\n }\n\n if (groups > 0 && pipelines.apply) {\n const pass = encoder.beginComputePass();\n pass.setBindGroup(0, bindGroup);\n pass.setPipeline(pipelines.apply);\n pass.dispatchWorkgroups(groups);\n pass.end();\n }\n\n if (groups > 0 && pipelines.integrate) {\n const pass = encoder.beginComputePass();\n pass.setBindGroup(0, bindGroup);\n pass.setPipeline(pipelines.integrate);\n pass.dispatchWorkgroups(groups);\n pass.end();\n }\n\n if (groups > 0 && pipelines.constrain) {\n const iterations = Math.max(1, params.constrainIterations ?? 1);\n for (let i = 0; i < iterations; i++) {\n // update simulation iteration uniform each loop\n resources.writeSimulationUniform(this.program, { iteration: i });\n const pass = encoder.beginComputePass();\n pass.setBindGroup(0, bindGroup);\n pass.setPipeline(pipelines.constrain);\n pass.dispatchWorkgroups(groups);\n pass.end();\n }\n }\n\n if (groups > 0 && pipelines.correct) {\n const pass = encoder.beginComputePass();\n pass.setBindGroup(0, bindGroup);\n pass.setPipeline(pipelines.correct);\n pass.dispatchWorkgroups(groups);\n pass.end();\n }\n return;\n }\n\n if (pipelines.main && groups > 0) {\n const simPass = encoder.beginComputePass();\n simPass.setBindGroup(0, bindGroup);\n simPass.setPipeline(pipelines.main);\n simPass.dispatchWorkgroups(groups);\n simPass.end();\n }\n }\n}\n","/**\n * Render Pass Builder\n *\n * Translates `RenderModuleDescriptor` passes into standalone WGSL programs:\n * - Fullscreen (raster) pass: draws a screen-aligned quad; optionally instanced per particle\n * - Compute image pass: reads from an input scene texture and writes to an output scene texture\n *\n * Provides helpers to resolve module uniforms (`getUniform`), sample/read/write scene\n * textures, and injects default vertex logic for instanced vs non-instanced fullscreen draws.\n */\nimport type { FullscreenRenderPass, ComputeRenderPass } from \"../../../module\";\nimport { DataType } from \"../../../module\";\nimport { ModuleUniformLayout } from \"./program\";\n\n// --- Internal helpers to reduce duplication ---\nfunction buildModuleUniformStruct(\n moduleName: string,\n layout: ModuleUniformLayout\n): string {\n const vec4Count = layout.vec4Count;\n const structFields = Array.from(\n { length: vec4Count },\n (_, k) => ` v${k}: vec4<f32>,`\n ).join(\"\\n\");\n return `struct Uniforms_${moduleName} {\\n${structFields}\\n}`;\n}\n\nfunction makeGetUniformExpr<Inputs extends Record<string, number | number[]>>(\n layout: ModuleUniformLayout,\n moduleName: string,\n moduleInputs: Record<keyof Inputs, DataType>\n): (id: keyof Inputs, index?: number | string) => string {\n return (id: keyof Inputs, index?: number | string) => {\n const mapping = layout.mapping[id as string];\n if (!mapping) return \"0.0\";\n\n // Check if this is an array input\n if (moduleInputs[id] === DataType.ARRAY) {\n if (index !== undefined) {\n // Use combined array with offset\n const offsetExpr =\n mapping.offsetExpr?.replace(\n `${moduleName}_uniforms`,\n `module_uniforms`\n ) || \"0u\";\n return `${moduleName}_arrays[u32(${offsetExpr}) + u32(${index})]`;\n } else {\n // Return the array variable name itself for direct access\n return `${moduleName}_arrays`;\n }\n } else {\n // Replace the uniform variable name for render passes\n const expr = mapping.expr.replace(\n `${moduleName}_uniforms`,\n `module_uniforms`\n );\n // Regular number input\n return expr;\n }\n };\n}\n\nfunction makeGetLengthExpr<Inputs extends Record<string, number | number[]>>(\n layout: ModuleUniformLayout,\n moduleName: string,\n moduleInputs: Record<keyof Inputs, DataType>\n): (id: keyof Inputs) => string {\n return (id: keyof Inputs) => {\n if (moduleInputs[id] === DataType.ARRAY) {\n const lengthMapping = layout.mapping[`${id.toString()}_length`];\n if (lengthMapping) {\n const expr = lengthMapping.expr.replace(\n `${moduleName}_uniforms`,\n `module_uniforms`\n );\n return `u32(${expr})`;\n }\n }\n return \"0u\";\n };\n}\n\nfunction getUniformForFullscreen<\n Inputs extends Record<string, number | number[]>\n>(\n lookupExpr: (id: keyof Inputs, index?: number | string) => string,\n clearColor: { r: number; g: number; b: number; a: number }\n): (id: keyof Inputs, index?: number | string) => string {\n const toFloatLiteral = (n: number) =>\n Number.isInteger(n) ? `${n}.0` : `${n}`;\n const cr = toFloatLiteral(clearColor.r);\n const cg = toFloatLiteral(clearColor.g);\n const cb = toFloatLiteral(clearColor.b);\n return (id: keyof Inputs, index?: number | string) =>\n id === \"canvasWidth\"\n ? \"render_uniforms.canvas_size.x\"\n : id === \"canvasHeight\"\n ? \"render_uniforms.canvas_size.y\"\n : id === \"clearColorR\"\n ? cr\n : id === \"clearColorG\"\n ? cg\n : id === \"clearColorB\"\n ? cb\n : lookupExpr(id, index);\n}\n\nfunction getUniformForCompute<Inputs extends Record<string, number | number[]>>(\n lookupExpr: (id: keyof Inputs, index?: number | string) => string,\n clearColor: { r: number; g: number; b: number; a: number }\n): (id: keyof Inputs, index?: number | string) => string {\n const toFloatLiteral = (n: number) =>\n Number.isInteger(n) ? `${n}.0` : `${n}`;\n const cr = toFloatLiteral(clearColor.r);\n const cg = toFloatLiteral(clearColor.g);\n const cb = toFloatLiteral(clearColor.b);\n return (id: keyof Inputs, index?: number | string) =>\n id === \"canvasWidth\"\n ? \"f32(textureDimensions(input_texture).x)\"\n : id === \"canvasHeight\"\n ? \"f32(textureDimensions(input_texture).y)\"\n : id === \"clearColorR\"\n ? cr\n : id === \"clearColorG\"\n ? cg\n : id === \"clearColorB\"\n ? cb\n : lookupExpr(id, index);\n}\n\nfunction moduleUniformBindingDecl(\n moduleName: string,\n bindingIndex: number\n): string {\n return `@group(0) @binding(${bindingIndex}) var<uniform> module_uniforms: Uniforms_${moduleName};`;\n}\n\nexport function buildFullscreenPassWGSL<\n Inputs extends Record<string, number | number[]> = Record<\n string,\n number | number[]\n >\n>(\n pass: FullscreenRenderPass<Inputs>,\n moduleName: string,\n layout: ModuleUniformLayout,\n moduleInputs: Record<keyof Inputs, DataType>,\n clearColor: { r: number; g: number; b: number; a: number }\n): string {\n // build WGSL\n const struct = buildModuleUniformStruct(moduleName, layout);\n const uniformExpr = makeGetUniformExpr<Inputs>(\n layout,\n moduleName,\n moduleInputs\n );\n const lengthExpr = makeGetLengthExpr<Inputs>(\n layout,\n moduleName,\n moduleInputs\n );\n\n const instanced = pass.instanced ?? true;\n const useParticleInVertex =\n instanced && !(\"instanceFrom\" in pass && pass.instanceFrom);\n\n const fragment = pass.fragment({\n getUniform: getUniformForFullscreen<Inputs>(uniformExpr, clearColor),\n getLength: lengthExpr,\n sampleScene: (uvExpr: string) =>\n `textureSampleLevel(scene_texture, scene_sampler, ${uvExpr}, 0.0)`,\n });\n\n // Vertex hook and defaults\n const vertexBodyHook = pass.vertex\n ? pass.vertex({\n getUniform: getUniformForFullscreen<Inputs>(uniformExpr, clearColor),\n getLength: lengthExpr,\n })\n : null;\n\n // Default vertex bodies for instanced and non-instanced modes\n const defaultVertexBodyInstanced = `\n li = i & 3u;\n let qp = qpos[li];\n // World position relative to camera, scaled by zoom\n let wp = (particle.position - render_uniforms.camera_position) * render_uniforms.zoom;\n // Convert to NDC\n let ndc = vec2<f32>(\n wp.x * 2.0 / render_uniforms.canvas_size.x,\n -wp.y * 2.0 / render_uniforms.canvas_size.y\n );\n // Quad size in NDC units\n let s = vec2<f32>(\n qp.x * particle.size * render_uniforms.zoom * 2.0 / render_uniforms.canvas_size.x,\n -qp.y * particle.size * render_uniforms.zoom * 2.0 / render_uniforms.canvas_size.y\n );\n out.position = vec4<f32>(ndc + s, 0.0, 1.0);\n`;\n\n const defaultVertexBodyNonInstanced = `\n li = i & 3u;\n out.position = vec4<f32>(qpos[li], 0.0, 1.0);\n`;\n\n const vertexBody =\n vertexBodyHook ??\n (instanced ? defaultVertexBodyInstanced : defaultVertexBodyNonInstanced);\n\n // Generate array storage buffer declarations for array inputs\n const arrayInputs = Object.entries(moduleInputs)\n .filter(([_, type]) => type === DataType.ARRAY)\n .map(([key, _]) => key);\n\n const arrayDeclarations =\n arrayInputs.length > 0\n ? `@group(0) @binding(5) var<storage, read> ${moduleName}_arrays: array<f32>;`\n : \"\";\n\n const code = `\nstruct Particle {\n position: vec2<f32>, velocity: vec2<f32>, acceleration: vec2<f32>,\n size: f32, mass: f32, color: vec4<f32>,\n}\nstruct RenderUniforms { canvas_size: vec2<f32>, camera_position: vec2<f32>, zoom: f32, _pad: f32 }\nstruct VertexOutput { @builtin(position) position: vec4<f32>, @location(0) uv: vec2<f32>, @location(1) color: vec4<f32>, @location(2) @interpolate(flat) index: u32, @location(3) @interpolate(flat) mass: f32 }\n@group(0) @binding(0) var<storage, read> particles: array<Particle>;\n@group(0) @binding(1) var<uniform> render_uniforms: RenderUniforms;\n@group(0) @binding(2) var scene_texture: texture_2d<f32>;\n@group(0) @binding(3) var scene_sampler: sampler;\n@vertex fn vs_main(@builtin(vertex_index) i: u32, @builtin(instance_index) inst: u32) -> VertexOutput {\n var out: VertexOutput;\n let qpos = array<vec2<f32>,4>(vec2<f32>(-1,-1),vec2<f32>(1,-1),vec2<f32>(-1,1),vec2<f32>(1,1));\n let quv = array<vec2<f32>,4>(vec2<f32>(0,1),vec2<f32>(1,1),vec2<f32>(0,0),vec2<f32>(1,0));\n // Provide common inputs for hook body\n let instance_index = inst;\n var particle: Particle = ${\n useParticleInVertex\n ? `particles[inst]`\n : `Particle(vec2<f32>(0.0), vec2<f32>(0.0), vec2<f32>(0.0), 0.0, 0.0, vec4<f32>(1.0))`\n };\n ${\n useParticleInVertex\n ? `if (particle.mass == 0.0) { out.position = vec4<f32>(2,2,1,1); out.uv = vec2<f32>(0,0); out.color = vec4<f32>(0); return out; }`\n : ``\n }\n // Sensible defaults; hook or defaults may overwrite\n var li: u32 = i & 3u;\n out.uv = quv[li];\n out.index = instance_index;\n out.color = ${useParticleInVertex ? `particle.color` : `vec4<f32>(1.0)`};\n // Pass pinned flag to fragment (1 if mass < 0)\n ${useParticleInVertex ? `out.mass = particle.mass;` : `out.mass = 0.0;`}\n${vertexBody}\n return out;\n}\n@fragment fn fs_main(@location(0) uv: vec2<f32>, @location(1) color: vec4<f32>, @location(2) @interpolate(flat) index: u32, @location(3) @interpolate(flat) mass: f32, @builtin(position) frag_coord: vec4<f32>) -> @location(0) vec4<f32> ${fragment}`;\n\n return `${struct}\\n${moduleUniformBindingDecl(\n moduleName,\n 4\n )}\\n${arrayDeclarations}\\n${code}`;\n}\n\nexport function buildComputeImagePassWGSL<\n Inputs extends Record<string, number | number[]> = Record<\n string,\n number | number[]\n >\n>(\n pass: ComputeRenderPass<Inputs>,\n moduleName: string,\n layout: ModuleUniformLayout,\n moduleInputs: Record<keyof Inputs, DataType>,\n clearColor: { r: number; g: number; b: number; a: number },\n workgroup: [number, number, number] = [8, 8, 1]\n): string {\n // struct and uniform lookup\n const struct = buildModuleUniformStruct(moduleName, layout);\n const uniformExpr = makeGetUniformExpr<Inputs>(\n layout,\n moduleName,\n moduleInputs\n );\n const lengthExpr = makeGetLengthExpr<Inputs>(\n layout,\n moduleName,\n moduleInputs\n );\n\n // Generate array storage buffer declarations for array inputs\n const arrayInputs = Object.entries(moduleInputs)\n .filter(([_, type]) => type === DataType.ARRAY)\n .map(([key, _]) => key);\n\n const arrayDeclarations =\n arrayInputs.length > 0\n ? `@group(0) @binding(3) var<storage, read> ${moduleName}_arrays: array<f32>;`\n : \"\";\n\n // kernel\n const kernelBody = pass.kernel({\n getUniform: getUniformForCompute<Inputs>(uniformExpr, clearColor),\n getLength: lengthExpr,\n readScene: (coordsExpr: string) =>\n `textureLoad(input_texture, ${coordsExpr}, 0)`,\n writeScene: (coordsExpr: string, colorExpr: string) =>\n `textureStore(output_texture, ${coordsExpr}, ${colorExpr})`,\n });\n\n // code\n const code = `\n@group(0) @binding(0) var input_texture: texture_2d<f32>;\n@group(0) @binding(1) var output_texture: texture_storage_2d<rgba8unorm, write>;\n@compute @workgroup_size(${workgroup[0]}, ${workgroup[1]}, ${workgroup[2]})\nfn cs_main(@builtin(global_invocation_id) gid: vec3<u32>) {\n let coords = vec2<i32>(i32(gid.x), i32(gid.y));\n let dims = textureDimensions(input_texture);\n if (coords.x >= i32(dims.x) || coords.y >= i32(dims.y)) { return; }\n ${kernelBody}\n}`;\n\n return `${struct}\\n${moduleUniformBindingDecl(\n moduleName,\n 2\n )}\\n${arrayDeclarations}\\n${code}`;\n}\n","/**\n * RenderPipeline\n *\n * Manages scene render targets (ping-pong textures) and executes a sequence of\n * render module passes. Two pass types are supported:\n * - Fullscreen (raster) passes: draw a screen-aligned quad, optionally instanced per particle\n * - Compute image passes: read from a scene texture and write to the other scene texture\n *\n * The pipeline resolves each module's uniform layout, binds particle/render uniforms\n * and module uniforms, and handles ping-pong view swapping when a pass writes the scene.\n * Finally, it presents the last written scene view to the canvas using a cached copy pipeline.\n */\nimport type { ModuleUniformLayout, Program } from \"./builders/program\";\nimport type { GPUResources } from \"./gpu-resources\";\nimport {\n Module,\n ComputeRenderPass,\n RenderPassKind,\n DataType,\n type FullscreenRenderPass,\n type WebGPURenderDescriptor,\n} from \"../../module\";\nimport {\n buildComputeImagePassWGSL,\n buildFullscreenPassWGSL,\n} from \"./builders/render-pass\";\n\n/**\n * Run a fullscreen rasterization pass that draws a screen-aligned quad.\n *\n * Builds WGSL program via the render DSL, acquires (or creates) a cached\n * pipeline, binds particle + render uniforms + module uniforms, and draws.\n */\n\n/**\n * Run a compute image pass that reads from `currentView` and writes into `otherView`.\n *\n * This uses a compute pipeline generated from the DSL. If the pass is marked\n * as writing the scene, the caller will swap the views afterwards.\n */\n\nexport class RenderPipeline {\n ensureTargets(resources: GPUResources, width: number, height: number): void {\n resources.ensureSceneTextures(width, height);\n }\n\n clearTargets(\n resources: GPUResources,\n color: { r: number; g: number; b: number; a: number } = {\n r: 0,\n g: 0,\n b: 0,\n a: 0,\n }\n ): void {\n try {\n const encoder = resources.getDevice().createCommandEncoder();\n const passA = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: resources.getCurrentSceneTextureView(),\n clearValue: { r: color.r, g: color.g, b: color.b, a: 0 },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n passA.end();\n const passB = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: resources.getOtherSceneTextureView(),\n clearValue: { r: color.r, g: color.g, b: color.b, a: 0 },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n passB.end();\n resources.getDevice().queue.submit([encoder.finish()]);\n } catch (_) {\n // ignore if textures not ready\n }\n }\n\n runPasses(\n encoder: GPUCommandEncoder,\n modules: Module[],\n program: Program,\n resources: GPUResources,\n viewSize: { width: number; height: number },\n particleCount: number,\n clearColor: { r: number; g: number; b: number; a: number }\n ): GPUTextureView {\n let currentView = resources.getCurrentSceneTextureView();\n let otherView = resources.getOtherSceneTextureView();\n let lastWritten: GPUTextureView | null = null;\n let anyWrites = false;\n\n for (let i = 0; i < modules.length; i++) {\n const module = modules[i];\n const descriptor = module.webgpu() as WebGPURenderDescriptor;\n if (!descriptor.passes || descriptor.passes.length === 0) continue;\n for (const pass of descriptor.passes) {\n // Resolve the uniform layout for this module\n const layout = program.layouts.find(\n (l) => l.moduleName === module.name\n )!;\n // Snapshot the views state for this pass\n const views = { currentView, otherView, anyWrites };\n let wrote: \"current\" | \"other\" | null = null;\n if (pass.kind === RenderPassKind.Fullscreen) {\n // Fullscreen raster pass (quad). Can write the scene directly to current view\n this.runFullscreenPass(\n encoder,\n module,\n layout,\n pass as FullscreenRenderPass,\n views,\n resources,\n particleCount,\n clearColor\n );\n wrote = pass.writesScene ? \"current\" : null;\n }\n if (pass.kind === RenderPassKind.Compute) {\n // Compute image pass. Writes into other view; if it writes the scene we ping-pong swap\n this.runComputePass(\n encoder,\n module,\n layout,\n pass as ComputeRenderPass,\n views,\n resources,\n viewSize,\n clearColor\n );\n wrote = pass.writesScene ? \"other\" : null;\n }\n\n // Update ping-pong state based on where this pass wrote the scene\n if (wrote === \"current\") {\n lastWritten = currentView;\n anyWrites = true;\n } else if (wrote === \"other\") {\n lastWritten = otherView;\n anyWrites = true;\n const tmp = currentView;\n currentView = otherView;\n otherView = tmp;\n }\n }\n }\n // If no render pass wrote to the scene this frame, explicitly clear the current view\n if (!anyWrites) {\n const pass = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: currentView,\n clearValue: clearColor,\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n pass.end();\n lastWritten = currentView;\n }\n\n // Return the last written (or cleared) view\n return lastWritten ?? currentView;\n }\n\n present(\n encoder: GPUCommandEncoder,\n resources: GPUResources,\n sourceView?: GPUTextureView\n ): void {\n const pipeline = resources.getCopyPipeline(resources.format);\n const bindGroup = resources.getDevice().createBindGroup({\n layout: pipeline.getBindGroupLayout(0),\n entries: [\n {\n binding: 0,\n resource: sourceView ?? resources.getCurrentSceneTextureView(),\n },\n { binding: 1, resource: resources.getSceneSampler() },\n ],\n });\n const canvasView = resources.getContext().getCurrentTexture().createView();\n const pass = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: canvasView,\n clearValue: { r: 0, g: 0, b: 0, a: 1 },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n pass.setPipeline(pipeline);\n pass.setBindGroup(0, bindGroup);\n pass.draw(4, 1);\n pass.end();\n }\n\n private runFullscreenPass(\n encoder: GPUCommandEncoder,\n module: Module,\n layout: ModuleUniformLayout,\n pass: FullscreenRenderPass,\n views: {\n currentView: GPUTextureView;\n otherView: GPUTextureView;\n anyWrites: boolean;\n },\n resources: GPUResources,\n particleCount: number,\n clearColor: { r: number; g: number; b: number; a: number }\n ): void {\n // Generate WGSL for the fullscreen pass\n const wgsl = buildFullscreenPassWGSL(\n pass as FullscreenRenderPass,\n module.name,\n layout,\n module.inputs,\n clearColor\n );\n\n // Get array inputs for this module\n const arrayInputs = Object.entries(module.inputs)\n .filter(([_, type]) => type === DataType.ARRAY)\n .map(([key, _]) => key);\n\n // Check if this is a non-instanced pass that needs fragment particle access\n const fragmentParticleAccess = pass.instanced === false;\n\n // Acquire or create a cached render pipeline for the generated WGSL\n const pipeline = resources.getOrCreateFullscreenRenderPipeline(\n wgsl,\n arrayInputs,\n fragmentParticleAccess\n );\n\n // Create bind group with particle data, global render uniforms, scene sampler/texture, and module uniforms\n const bindGroup = resources.createFullscreenBindGroup(\n resources.getParticleBuffer()!,\n resources.getRenderUniformBuffer()!,\n views.otherView,\n resources.getSceneSampler(),\n resources\n .getModuleUniformBuffers()\n .find((muf) => muf.layout.moduleName === module.name)!.buffer,\n module.name,\n arrayInputs,\n fragmentParticleAccess\n );\n\n // Begin render pass targeting the current view. Clear only on the very first write\n const renderPass = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: views.currentView,\n clearValue: clearColor,\n loadOp: views.anyWrites ? \"load\" : \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n renderPass.setPipeline(pipeline);\n renderPass.setBindGroup(0, bindGroup);\n const instanced = pass.instanced ?? true;\n // Support instanceFrom to drive instance count from an array input length\n let instanceCount = particleCount;\n if (pass.instanceFrom) {\n const inputs = module.read();\n const arr = (inputs[pass.instanceFrom] as number[]) || [];\n instanceCount = arr.length >>> 0;\n }\n // Draw\n if (instanced && instanceCount > 0) {\n renderPass.draw(4, instanceCount);\n } else if (!instanced) {\n renderPass.draw(4, 1);\n }\n\n renderPass.end();\n }\n\n private runComputePass(\n encoder: GPUCommandEncoder,\n module: Module,\n layout: ModuleUniformLayout,\n pass: ComputeRenderPass,\n views: {\n currentView: GPUTextureView;\n otherView: GPUTextureView;\n anyWrites: boolean;\n },\n resources: GPUResources,\n size: { width: number; height: number },\n clearColor: { r: number; g: number; b: number; a: number }\n ): void {\n // Generate WGSL for the compute pass\n const wgsl = buildComputeImagePassWGSL(\n pass as ComputeRenderPass,\n module.name,\n layout,\n module.inputs,\n clearColor\n );\n\n // Get array inputs for this module\n const arrayInputs = Object.entries(module.inputs)\n .filter(([_, type]) => type === DataType.ARRAY)\n .map(([key, _]) => key);\n\n // Acquire or create a cached compute pipeline\n const pipeline = resources.getOrCreateImageComputePipeline(wgsl);\n const muf = resources\n .getModuleUniformBuffers()\n .find((muf) => muf.layout.moduleName === module.name)!;\n // Bind current/other scene views and module uniforms\n const bindGroup = resources.createImageComputeBindGroup(\n pipeline,\n views.currentView,\n views.otherView,\n muf.buffer,\n module.name,\n arrayInputs\n );\n const canvasSize = size;\n // Compute dispatch size (assuming 8x8 threadgroups)\n const workgroupsX = Math.ceil(canvasSize.width / 8);\n const workgroupsY = Math.ceil(canvasSize.height / 8);\n const cp = encoder.beginComputePass();\n cp.setPipeline(pipeline);\n cp.setBindGroup(0, bindGroup);\n cp.dispatchWorkgroups(workgroupsX, workgroupsY);\n cp.end();\n }\n}\n","/**\n * WebGPU Engine\n *\n * High-level orchestrator that wires together GPU resources, the simulation pipeline,\n * the render pipeline, the spatial grid, and the view controller. It owns the main\n * animation loop and exposes a minimal API for sizing, camera/zoom control, particle\n * data management, and play/pause lifecycle.\n *\n * Responsibilities:\n * - Initialize GPU device/context and allocate core buffers via GPUResources\n * - Build the WGSL program and per-module uniform buffers via ModuleRegistry\n * - Initialize compute (simulation) and render pipelines\n * - Maintain and sync the spatial grid to match the current view/camera\n * - Drive per-frame simulation passes and render passes into ping-pong scene textures\n * - Present the final texture to the canvas, tracking an EMA FPS estimate\n */\nimport type { Module } from \"../../module\";\nimport { GPUResources } from \"./gpu-resources\";\nimport { ParticleStore } from \"./particle-store\";\nimport { AbstractEngine, IParticle } from \"../../interfaces\";\nimport { ModuleRegistry } from \"./module-registry\";\nimport { SpacialGrid } from \"./spacial-grid\";\nimport { SimulationPipeline } from \"./simulation-pipeline\";\nimport { RenderPipeline } from \"./render-pipeline\";\n\nexport class WebGPUEngine extends AbstractEngine {\n private resources: GPUResources;\n private particles: ParticleStore;\n private registry: ModuleRegistry;\n private sim: SimulationPipeline;\n private render: RenderPipeline;\n private grid: SpacialGrid;\n private bufferMaxParticles: number; // Buffer allocation size (separate from effective maxParticles)\n private workgroupSize: number;\n private simStrideValue: number = 0;\n private shouldSyncNextTick: boolean = false;\n private animationId: number | null = null;\n private didSwapchainWarmup: boolean = false;\n\n constructor(options: {\n canvas: HTMLCanvasElement;\n forces: Module[];\n render: Module[];\n constrainIterations?: number;\n clearColor?: { r: number; g: number; b: number; a: number };\n cellSize?: number;\n maxParticles?: number;\n workgroupSize?: number;\n maxNeighbors?: number;\n }) {\n super({\n ...options,\n constrainIterations: options.constrainIterations ?? 50,\n });\n // Buffer allocation size (separate from effective maxParticles limit)\n this.bufferMaxParticles = options.maxParticles ?? 100000;\n // Set effective maxParticles limit (null means no limit)\n this.setMaxParticles(options.maxParticles ?? null);\n this.workgroupSize = options.workgroupSize ?? 64;\n this.resources = new GPUResources({ canvas: options.canvas });\n this.particles = new ParticleStore(this.bufferMaxParticles, 12);\n this.registry = new ModuleRegistry([...options.forces, ...options.render]);\n this.sim = new SimulationPipeline();\n this.render = new RenderPipeline();\n this.grid = new SpacialGrid(this.cellSize);\n }\n\n async initialize(): Promise<void> {\n await this.resources.initialize();\n\n // Core buffers\n this.resources.createParticleBuffer(this.bufferMaxParticles, 12);\n this.resources.createRenderUniformBuffer(24);\n\n // Build program + module uniform buffers\n this.registry.initialize(this.resources);\n const program = this.registry.getProgram();\n if (program.extraBindings.simState) {\n this.resources.createSimStateBuffer(this.bufferMaxParticles, 4);\n }\n\n // Build compute pipelines\n this.sim.initialize(this.resources, program);\n\n // Ensure scene textures\n const size = this.view.getSize();\n this.resources.canvas.width = size.width;\n this.resources.canvas.height = size.height;\n this.render.ensureTargets(this.resources, size.width, size.height);\n\n // Safari/WebKit workaround:\n // On WebKit's WebGPU implementation, the first present can stay blank until the canvas\n // experiences a \"real\" resize (even 1px). Apps have been working around this by\n // jiggling size once after starting. We do it here, once, after the final canvas size\n // is set and before the first present.\n await this.warmupSwapchainIfNeeded(size.width, size.height);\n\n // Configure grid storage + uniforms\n this.grid.configure(this.view.getSnapshot(), this.resources, program);\n\n // Seed module uniforms on GPU\n this.registry.writeAllModuleUniforms();\n\n // Cache sim stride value\n this.simStrideValue = program.simStateStride;\n }\n\n // Implement abstract methods for animation loop\n protected startAnimationLoop(): void {\n if (this.animationId) {\n cancelAnimationFrame(this.animationId);\n this.animationId = null;\n }\n this.animate();\n }\n\n protected stopAnimationLoop(): void {\n // WebGPU doesn't need to cancel requestAnimationFrame explicitly\n // since it's handled in the animate method\n }\n\n async destroy(): Promise<void> {\n this.pause();\n // Stop animation loop to prevent using destroyed resources\n if (this.animationId !== null) {\n cancelAnimationFrame(this.animationId);\n this.animationId = null;\n }\n await this.resources.dispose();\n }\n\n // Override setSize to also update WebGPU-specific resources\n setSize(width: number, height: number): void {\n this.view.setSize(width, height);\n this.resources.canvas.width = width;\n this.resources.canvas.height = height;\n this.render.ensureTargets(this.resources, width, height);\n this.grid.resizeIfNeeded(\n this.view.getSnapshot(),\n this.resources,\n this.registry.getProgram()\n );\n }\n\n // Override onViewChanged to update grid when view changes\n protected onViewChanged(): void {\n this.grid.resizeIfNeeded(\n this.view.getSnapshot(),\n this.resources,\n this.registry.getProgram()\n );\n }\n\n setParticles(p: IParticle[]): void {\n this.particles.setParticles(p);\n this.particles.syncToGPU(this.resources);\n // Update maxSize tracking\n this.resetMaxSize();\n for (const particle of p) {\n this.updateMaxSize(particle.size);\n }\n }\n\n async addParticle(p: IParticle): Promise<void> {\n await this.particles.syncFromGPU(this.resources);\n this.particles.addParticle(p);\n this.particles.syncToGPU(this.resources);\n // Update maxSize tracking\n this.updateMaxSize(p.size);\n }\n\n /**\n * Forces GPU-to-CPU synchronization and returns current particle data.\n * Use this when you need the most up-to-date particle positions from GPU.\n */\n async getParticles(): Promise<IParticle[]> {\n await this.particles.syncFromGPU(this.resources);\n return this.particles.getParticles();\n }\n\n async getParticle(index: number): Promise<IParticle> {\n await this.particles.syncFromGPU(this.resources);\n return this.particles.getParticle(index);\n }\n\n getCount(): number {\n const actualCount = this.particles.getCount();\n if (this.maxParticles === null) {\n return actualCount;\n }\n return Math.min(actualCount, this.maxParticles);\n }\n\n clear(): void {\n this.particles.clear();\n // Clear scene textures proactively\n this.render.clearTargets(this.resources, this.clearColor);\n // Reset maxSize tracking\n this.resetMaxSize();\n // Sync module uniforms to GPU (important for grab module reset)\n this.registry.writeAllModuleUniforms();\n }\n\n private animate = async (): Promise<void> => {\n const dt = this.getTimeDelta();\n this.updateFPS(dt);\n\n // Write view uniforms\n const snapshot = this.view.getSnapshot();\n this.resources.writeRenderUniforms(snapshot);\n\n // Keep grid/world extents in sync with current view\n this.grid.resizeIfNeeded(\n this.view.getSnapshot(),\n this.resources,\n this.registry.getProgram()\n );\n\n // Encode command buffer\n const encoder = this.resources.getDevice().createCommandEncoder();\n\n // Only run simulation/oscillators when playing\n if (this.playing) {\n // Update engine-owned oscillators before simulation uniforms are written\n this.updateOscillators(dt);\n // Update simulation uniforms (dt, count, simStride, maxSize, maxParticles)\n const actualCount = this.particles.getCount();\n this.resources.writeSimulationUniform(this.registry.getProgram(), {\n dt,\n count: actualCount,\n simStride: this.simStrideValue,\n maxSize: this.getMaxSize(),\n iteration: 0,\n maxNeighbors: this.getMaxNeighbors(),\n maxParticles: this.maxParticles ?? -1, // Use -1 as sentinel for null\n });\n\n // Run simulation passes\n this.sim.runPasses(encoder, this.resources, {\n particleCount: this.getCount(), // Use effective count\n gridCellCount: this.grid.getCellCount(),\n workgroupSize: this.workgroupSize,\n constrainIterations: this.constrainIterations,\n });\n\n if (this.shouldSyncNextTick) {\n // Sync to GPU on next tick\n this.waitForNextTick().then(() =>\n this.particles.syncToGPU(this.resources)\n );\n this.shouldSyncNextTick = false;\n }\n } else {\n // When paused, handle particle sync but skip simulation\n if (!this.shouldSyncNextTick) {\n this.shouldSyncNextTick = true;\n await this.particles.syncFromGPU(this.resources);\n }\n }\n\n const particleCount = this.getCount(); // Use effective count\n\n // Always run render passes to keep displaying current state\n const lastView = this.render.runPasses(\n encoder,\n this.registry.getEnabledRenderModules(),\n this.registry.getProgram(),\n this.resources,\n this.view.getSize(),\n particleCount,\n this.clearColor\n );\n\n this.render.present(encoder, this.resources, lastView);\n this.resources.getDevice().queue.submit([encoder.finish()]);\n\n // Continue animation loop regardless of playing state\n this.animationId = requestAnimationFrame(this.animate);\n };\n\n private waitForNextTick(): Promise<void> {\n return new Promise((resolve) => {\n requestAnimationFrame(() => {\n resolve();\n });\n });\n }\n\n private isWebKitWebGPU(): boolean {\n // We specifically want WebKit's WebGPU, not Chromium/Blink.\n // - On iOS, *all* browsers use WebKit, so we treat them as WebKit.\n // - On macOS, Safari is WebKit; Chrome/Edge/Opera are not (even though their UA includes \"AppleWebKit\").\n try {\n if (typeof navigator === \"undefined\") return false;\n const ua = navigator.userAgent || \"\";\n const isIOS = /iPad|iPhone|iPod/.test(ua);\n if (isIOS) return true;\n const isAppleWebKit = /AppleWebKit\\//.test(ua);\n const isSafari = /Safari\\//.test(ua);\n const isChromiumLike = /(Chrome|Chromium|Edg|OPR)\\//.test(ua);\n return isAppleWebKit && isSafari && !isChromiumLike;\n } catch {\n return false;\n }\n }\n\n private async warmupSwapchainIfNeeded(\n width: number,\n height: number\n ): Promise<void> {\n if (this.didSwapchainWarmup) return;\n if (!this.isWebKitWebGPU()) return;\n if (height <= 1) return;\n\n this.didSwapchainWarmup = true;\n\n // 1px \"resize\" to force WebKit to fully bind the swapchain/currentTexture.\n // We wait a couple of animation frames to match real-world workarounds that proved reliable.\n try {\n this.resources.canvas.width = width;\n this.resources.canvas.height = height - 1;\n await this.waitForNextTick();\n this.resources.canvas.width = width;\n this.resources.canvas.height = height;\n await this.waitForNextTick();\n // Re-ensure targets (idempotent) in case any implementation ties resources to canvas size.\n this.render.ensureTargets(this.resources, width, height);\n } catch {\n // If anything goes wrong, fail open: rendering may still work on other browsers.\n }\n }\n\n // Override export to use module registry\n export(): Record<string, Record<string, number>> {\n const settings: Record<string, Record<string, number>> = {};\n for (const module of this.registry.getModules()) {\n const moduleData = module.read();\n settings[module.name] = moduleData as Record<string, number>;\n }\n return settings;\n }\n\n // Override onModuleSettingsChanged to sync to GPU\n protected onModuleSettingsChanged(): void {\n this.registry.writeAllModuleUniforms();\n }\n\n // Handle configuration changes\n protected onClearColorChanged(): void {\n // Clear color changes don't require any immediate system updates\n // The new color will be used in the next render pass\n }\n\n protected onCellSizeChanged(): void {\n // Update spatial grid with new cell size\n this.grid.setCellSize(this.cellSize);\n\n // If initialized, reconfigure the grid with current view\n if (this.resources && this.view) {\n try {\n const program = this.registry.getProgram();\n this.grid.configure(this.view.getSnapshot(), this.resources, program);\n } catch (error) {\n // Ignore if not fully initialized yet\n }\n }\n }\n\n protected onConstrainIterationsChanged(): void {\n // Constrain iterations changes don't require any immediate system updates\n // The new value will be used in the next simulation pass\n }\n\n protected onMaxNeighborsChanged(): void {\n // Max neighbors affects only simulation-side neighbor iterator cap; no immediate rebuild needed\n }\n\n protected onMaxParticlesChanged(): void {\n // Max particles affects effective count; no immediate rebuild needed\n }\n}\n","import { Particle } from \"../../particle\";\nimport { Vector } from \"../../vector\";\n\nexport interface SpatialGridOptions {\n width: number;\n height: number;\n cellSize: number;\n}\n\nexport class SpatialGrid {\n private width: number;\n private height: number;\n private cellSize: number;\n private cols!: number;\n private rows!: number;\n private grid!: Particle[][][];\n\n // Dynamic bounds that match current camera view\n private minX!: number;\n private minY!: number;\n private maxX!: number;\n private maxY!: number;\n // Camera tracking\n private cameraX: number = 0;\n private cameraY: number = 0;\n private zoom: number = 1;\n\n // Track particles for incremental updates\n private particlePositions: Map<number, { col: number; row: number }> =\n new Map();\n\n constructor(options: SpatialGridOptions) {\n this.width = options.width;\n this.height = options.height;\n this.cellSize = options.cellSize;\n\n // Initialize with default camera view (canvas coordinates)\n this.updateBounds(0, 0, 1);\n }\n\n private updateBounds(cameraX: number, cameraY: number, zoom: number): void {\n this.cameraX = cameraX;\n this.cameraY = cameraY;\n this.zoom = zoom;\n\n // Calculate visible world bounds\n const worldLeft = -cameraX / zoom;\n const worldTop = -cameraY / zoom;\n const worldRight = (this.width - cameraX) / zoom;\n const worldBottom = (this.height - cameraY) / zoom;\n\n // Add padding around visible area to catch particles just outside view\n const padding = (Math.max(this.width, this.height) / zoom) * 0.5; // 50% padding\n this.minX = worldLeft - padding;\n this.minY = worldTop - padding;\n this.maxX = worldRight + padding;\n this.maxY = worldBottom + padding;\n\n // Recalculate grid dimensions (ensure at least 1x1 to avoid undefined rows/cols)\n this.cols = Math.max(1, Math.ceil((this.maxX - this.minX) / this.cellSize));\n this.rows = Math.max(1, Math.ceil((this.maxY - this.minY) / this.cellSize));\n\n this.initializeGrid();\n }\n\n setCamera(cameraX: number, cameraY: number, zoom: number): void {\n // Only update if camera changed significantly to avoid constant grid rebuilding\n const threshold = this.cellSize * 0.5; // Half a cell\n const zoomThreshold = 0.1;\n\n if (\n Math.abs(this.cameraX - cameraX) > threshold ||\n Math.abs(this.cameraY - cameraY) > threshold ||\n Math.abs(this.zoom - zoom) > zoomThreshold\n ) {\n this.updateBounds(cameraX, cameraY, zoom);\n }\n }\n\n private initializeGrid(): void {\n this.grid = [];\n for (let row = 0; row < this.rows; row++) {\n this.grid[row] = [];\n for (let col = 0; col < this.cols; col++) {\n this.grid[row][col] = [];\n }\n }\n }\n\n clear(): void {\n for (let row = 0; row < this.rows; row++) {\n this.grid[row] = [];\n for (let col = 0; col < this.cols; col++) {\n this.grid[row][col] = [];\n }\n }\n // Clear particle position tracking\n this.particlePositions.clear();\n }\n\n /**\n * Incrementally clear only cells that contained particles\n * Much more efficient than full clear for sparse grids\n */\n clearIncremental(_particles: Particle[]): void {\n // Only clear cells that actually contained particles\n const cellsToClean = new Set<string>();\n\n // Collect cells that need clearing from previous particle positions\n for (const [, position] of this.particlePositions) {\n const key = `${position.row}-${position.col}`;\n cellsToClean.add(key);\n }\n\n // Clear only those cells\n for (const key of cellsToClean) {\n const [row, col] = key.split(\"-\").map(Number);\n if (row >= 0 && row < this.rows && col >= 0 && col < this.cols) {\n this.grid[row][col] = [];\n }\n }\n\n // Clear particle position tracking\n this.particlePositions.clear();\n }\n\n insert(particle: Particle): void {\n // Convert world coordinates to grid coordinates with offset\n const col = Math.floor((particle.position.x - this.minX) / this.cellSize);\n const row = Math.floor((particle.position.y - this.minY) / this.cellSize);\n\n // Clamp to grid bounds\n const clampedCol = Math.max(0, Math.min(col, this.cols - 1));\n const clampedRow = Math.max(0, Math.min(row, this.rows - 1));\n\n // Insert particle into grid\n // Safety: ensure row/col arrays exist (defensive against any transient zero-dimension states)\n if (!this.grid[clampedRow]) this.grid[clampedRow] = [];\n if (!this.grid[clampedRow][clampedCol])\n this.grid[clampedRow][clampedCol] = [];\n this.grid[clampedRow][clampedCol].push(particle);\n\n // Track particle position for incremental updates\n this.particlePositions.set(particle.id, {\n col: clampedCol,\n row: clampedRow,\n });\n }\n\n getParticles(\n point: Vector,\n radius: number,\n maxNeighbors?: number\n ): Particle[] {\n const neighbors: Particle[] = [];\n // Convert world coordinates to grid coordinates with offset\n const centerCol = Math.floor((point.x - this.minX) / this.cellSize);\n const centerRow = Math.floor((point.y - this.minY) / this.cellSize);\n\n // Calculate how many cells to check in each direction\n const cellRadius = Math.ceil(radius / this.cellSize);\n\n for (\n let row = centerRow - cellRadius;\n row <= centerRow + cellRadius;\n row++\n ) {\n if (maxNeighbors !== undefined && neighbors.length >= maxNeighbors) {\n return neighbors;\n }\n for (\n let col = centerCol - cellRadius;\n col <= centerCol + cellRadius;\n col++\n ) {\n if (maxNeighbors !== undefined && neighbors.length >= maxNeighbors) {\n return neighbors;\n }\n if (row >= 0 && row < this.rows && col >= 0 && col < this.cols) {\n const cellParticles = this.grid[row][col];\n for (const candidate of cellParticles) {\n const distance = point.distance(candidate.position);\n if (distance < radius) {\n neighbors.push(candidate);\n if (\n maxNeighbors !== undefined &&\n neighbors.length >= maxNeighbors\n ) {\n return neighbors;\n }\n }\n }\n }\n }\n }\n\n return neighbors;\n }\n\n getCellParticleCount(col: number, row: number): number {\n if (row >= 0 && row < this.rows && col >= 0 && col < this.cols) {\n return this.grid[row][col].length;\n }\n return 0;\n }\n\n getGridDimensions(): { cols: number; rows: number; cellSize: number } {\n return {\n cols: this.cols,\n rows: this.rows,\n cellSize: this.cellSize,\n };\n }\n\n getGridBounds(): { minX: number; minY: number; maxX: number; maxY: number } {\n return {\n minX: this.minX,\n minY: this.minY,\n maxX: this.maxX,\n maxY: this.maxY,\n };\n }\n\n getSize(): { width: number; height: number } {\n return {\n width: this.width,\n height: this.height,\n };\n }\n\n setSize(width: number, height: number): void {\n this.width = width;\n this.height = height;\n\n // Update bounds with current camera settings\n this.updateBounds(this.cameraX, this.cameraY, this.zoom);\n }\n\n getCellSize(): number {\n return this.cellSize;\n }\n\n setCellSize(cellSize: number): void {\n this.cellSize = cellSize;\n // Update bounds with new cell size\n this.updateBounds(this.cameraX, this.cameraY, this.zoom);\n }\n\n getAllParticles(): Particle[] {\n const allParticles: Particle[] = [];\n for (let row = 0; row < this.rows; row++) {\n for (let col = 0; col < this.cols; col++) {\n allParticles.push(...this.grid[row][col]);\n }\n }\n return allParticles;\n }\n}\n","export class Vector {\n constructor(public x: number = 0, public y: number = 0) {}\n\n add(vector: Vector): Vector {\n this.x += vector.x;\n this.y += vector.y;\n return this;\n }\n\n subtract(vector: Vector): Vector {\n this.x -= vector.x;\n this.y -= vector.y;\n return this;\n }\n\n multiply(scalar: number): Vector {\n this.x *= scalar;\n this.y *= scalar;\n return this;\n }\n\n divide(scalar: number): Vector {\n if (scalar === 0) throw new Error(\"Cannot divide by zero\");\n this.x /= scalar;\n this.y /= scalar;\n return this;\n }\n\n magnitude(): number {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n }\n\n normalize(): Vector {\n const mag = this.magnitude();\n if (mag === 0) {\n this.x = 0;\n this.y = 0;\n } else {\n this.x /= mag;\n this.y /= mag;\n }\n return this;\n }\n\n limit(max: number): Vector {\n const mag = this.magnitude();\n if (mag > max) {\n this.normalize().multiply(max);\n }\n return this;\n }\n\n dot(vector: Vector): number {\n return this.x * vector.x + this.y * vector.y;\n }\n\n distance(vector: Vector): number {\n const dx = this.x - vector.x;\n const dy = this.y - vector.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n\n direction(vector: Vector): Vector {\n const distance = this.distance(vector);\n return new Vector(\n (vector.x - this.x) / distance,\n (vector.y - this.y) / distance\n );\n }\n\n clone(): Vector {\n return new Vector(this.x, this.y);\n }\n\n set(x: number, y: number): Vector {\n this.x = x;\n this.y = y;\n return this;\n }\n\n zero(): Vector {\n this.x = 0;\n this.y = 0;\n return this;\n }\n\n static random(min: number = -1, max: number = 1): Vector {\n return new Vector(\n Math.random() * (max - min) + min,\n Math.random() * (max - min) + min\n );\n }\n\n static zero(): Vector {\n return new Vector(0, 0);\n }\n\n /**\n * Create a Vector2D from an angle in radians\n * @param angle Angle in radians (0 = right, π/2 = down, π = left, 3π/2 = up)\n * @param magnitude Length of the vector (default: 1)\n */\n static fromAngle(angle: number, magnitude: number = 1): Vector {\n return new Vector(Math.cos(angle) * magnitude, Math.sin(angle) * magnitude);\n }\n\n /**\n * Create a Vector2D from an angle in degrees\n * @param angle Angle in degrees (0° = right, 90° = down, 180° = left, 270° = up)\n * @param magnitude Length of the vector (default: 1)\n */\n static fromAngleDegrees(angle: number, magnitude: number = 1): Vector {\n const angleInRadians = (angle * Math.PI) / 180;\n return new Vector(\n Math.cos(angleInRadians) * magnitude,\n Math.sin(angleInRadians) * magnitude\n );\n }\n\n /**\n * Convert degrees to radians\n * @param degrees Angle in degrees\n * @returns Angle in radians\n */\n static degreesToRadians(degrees: number): number {\n return (degrees * Math.PI) / 180;\n }\n\n /**\n * Convert radians to degrees\n * @param radians Angle in radians\n * @returns Angle in degrees\n */\n static radiansToDegrees(radians: number): number {\n return (radians * 180) / Math.PI;\n }\n\n toJSON(): { x: number; y: number } {\n return { x: this.x, y: this.y };\n }\n}\n\n/**\n * Convert degrees to radians\n * @param degrees Angle in degrees\n * @returns Angle in radians\n */\nexport function degToRad(degrees: number): number {\n return (degrees * Math.PI) / 180;\n}\n\n/**\n * Convert radians to degrees\n * @param radians Angle in radians\n * @returns Angle in degrees\n */\nexport function radToDeg(radians: number): number {\n return (radians * 180) / Math.PI;\n}\n","import { IParticle } from \"./interfaces\";\nimport { Vector } from \"./vector\";\n\nlet idCounter = 0;\n\nexport class Particle implements IParticle {\n public id: number;\n public position: Vector;\n public velocity: Vector;\n public acceleration: Vector;\n public size: number;\n public mass: number;\n public color: { r: number; g: number; b: number; a: number };\n\n constructor(options: IParticle) {\n this.id = idCounter++;\n this.position = new Vector(options.position.x, options.position.y);\n this.velocity = new Vector(options.velocity.x, options.velocity.y);\n this.acceleration = new Vector(0, 0);\n this.size = options.size;\n this.mass = options.mass;\n this.color = options.color;\n }\n\n toJSON(): IParticle {\n return {\n position: this.position.toJSON(),\n velocity: this.velocity.toJSON(),\n size: this.size,\n mass: this.mass,\n color: this.color,\n };\n }\n}\n","import { AbstractEngine, IParticle } from \"../../interfaces\";\nimport {\n Module,\n ModuleRole,\n CanvasComposition,\n CPURenderDescriptor,\n CPUForceDescriptor,\n} from \"../../module\";\nimport { SpatialGrid } from \"./spatial-grid\";\nimport { Particle } from \"../../particle\";\nimport { Vector } from \"../../vector\";\n\nexport class CPUEngine extends AbstractEngine {\n private particles: Particle[] = [];\n private canvas: HTMLCanvasElement;\n private grid: SpatialGrid;\n private animationId: number | null = null;\n\n constructor(options: {\n canvas: HTMLCanvasElement;\n forces: Module[];\n render: Module[];\n constrainIterations?: number;\n clearColor?: { r: number; g: number; b: number; a: number };\n cellSize?: number;\n }) {\n super(options);\n this.canvas = options.canvas;\n this.grid = new SpatialGrid({\n width: this.canvas.width,\n height: this.canvas.height,\n cellSize: this.cellSize,\n });\n }\n\n initialize(): Promise<void> {\n return Promise.resolve();\n }\n\n // Implement abstract methods for animation loop\n protected startAnimationLoop(): void {\n if (this.animationId) {\n cancelAnimationFrame(this.animationId);\n this.animationId = null;\n }\n this.animate();\n }\n\n protected stopAnimationLoop(): void {\n if (this.animationId) {\n cancelAnimationFrame(this.animationId);\n this.animationId = null;\n }\n }\n\n /**\n * Resets animation timing to prevent large deltaTime spikes.\n * Useful when starting after engine restoration or long pauses.\n */\n public resetTiming(): void {\n this.lastTime = performance.now();\n }\n\n /**\n * Resets the simulation to its initial state.\n *\n * This method:\n * - Pauses the simulation\n * - Clears all particles\n * - Resets timing and FPS data\n * - Clears force-specific caches\n */\n public reset(): void {\n this.pause();\n // Ensure animation frame is properly cancelled\n if (this.animationId) {\n cancelAnimationFrame(this.animationId);\n this.animationId = null;\n }\n this.particles = [];\n this.lastTime = 0;\n // Clear FPS tracking data\n this.fpsEstimate = 60;\n }\n\n clear(): void {\n this.particles = [];\n this.grid.clear();\n this.fpsEstimate = 60;\n // Reset maxSize tracking\n this.resetMaxSize();\n }\n\n getCount(): number {\n const actualCount = this.particles.length;\n if (this.maxParticles === null) {\n return actualCount;\n }\n return Math.min(actualCount, this.maxParticles);\n }\n\n protected getEffectiveCount(): number {\n return this.getCount();\n }\n\n // Override setSize to also update spatial grid\n setSize(width: number, height: number): void {\n this.view.setSize(width, height);\n this.grid.setSize(width, height);\n }\n\n setParticles(particle: IParticle[]): void {\n this.particles = particle.map((p) => new Particle(p));\n // Update maxSize tracking\n this.resetMaxSize();\n for (const p of particle) {\n this.updateMaxSize(p.size);\n }\n }\n\n addParticle(particle: IParticle): void {\n this.particles.push(new Particle(particle));\n // Update maxSize tracking\n this.updateMaxSize(particle.size);\n }\n\n getParticles(): Promise<IParticle[]> {\n return Promise.resolve(this.particles.map((p) => p.toJSON()));\n }\n\n getParticle(index: number): Promise<IParticle> {\n return Promise.resolve(this.particles[index]);\n }\n\n destroy(): Promise<void> {\n this.pause();\n this.particles = [];\n this.grid.clear();\n return Promise.resolve();\n }\n\n // Handle configuration changes\n protected onClearColorChanged(): void {\n // Clear color changes don't require any immediate system updates\n // The new color will be used in the next render pass\n }\n\n protected onCellSizeChanged(): void {\n // Rebuild spatial grid with new cell size\n this.grid.setCellSize(this.cellSize);\n }\n\n protected onConstrainIterationsChanged(): void {\n // Constrain iterations changes don't require any immediate system updates\n // The new value will be used in the next simulation pass\n }\n\n protected onMaxNeighborsChanged(): void {\n // No additional state to update on CPU when max neighbors changes\n }\n\n protected onMaxParticlesChanged(): void {\n // No additional state to update on CPU when max particles changes\n }\n\n private animate = (): void => {\n const dt = this.getTimeDelta();\n this.updateFPS(dt);\n\n if (this.playing) {\n // Update engine-owned oscillators before module updates\n this.updateOscillators(dt);\n this.update(dt);\n }\n\n this.render();\n\n this.animationId = requestAnimationFrame(this.animate);\n };\n\n private getNeighbors(position: { x: number; y: number }, radius: number) {\n return this.grid.getParticles(\n new Vector(position.x, position.y),\n radius,\n this.getMaxNeighbors()\n );\n }\n\n private getImageData(\n x: number,\n y: number,\n width: number,\n height: number\n ): ImageData | null {\n try {\n const context = this.canvas.getContext(\"2d\")!;\n\n // Clamp to canvas bounds\n const clampedX = Math.max(0, Math.min(x, this.canvas.width));\n const clampedY = Math.max(0, Math.min(y, this.canvas.height));\n const clampedWidth = Math.max(\n 0,\n Math.min(width, this.canvas.width - clampedX)\n );\n const clampedHeight = Math.max(\n 0,\n Math.min(height, this.canvas.height - clampedY)\n );\n\n if (clampedWidth <= 0 || clampedHeight <= 0) {\n return null;\n }\n\n return context.getImageData(\n clampedX,\n clampedY,\n clampedWidth,\n clampedHeight\n );\n } catch (error) {\n return null;\n }\n }\n\n private update(dt: number): void {\n const effectiveCount = this.getEffectiveCount();\n \n // Update spatial grid with current particle positions and camera\n this.grid.setCamera(\n this.view.getCamera().x,\n this.view.getCamera().y,\n this.view.getZoom()\n );\n this.grid.clear();\n for (let i = 0; i < effectiveCount; i++) {\n this.grid.insert(this.particles[i]);\n }\n\n // Global state for modules that need it\n const globalState: Record<number, Record<string, number>> = {};\n\n // Position tracking for correct pass\n const positionState: Map<\n number,\n { prev: { x: number; y: number }; post: { x: number; y: number } }\n > = new Map();\n\n // Get neighbors function\n const getNeighbors = (position: { x: number; y: number }, radius: number) =>\n this.getNeighbors(position, radius);\n\n // Image data access function\n const getImageData = (\n x: number,\n y: number,\n width: number,\n height: number\n ) => this.getImageData(x, y, width, height);\n\n // First pass: state computation for all modules\n for (const module of this.modules) {\n try {\n // Skip disabled modules\n if (!module.isEnabled()) continue;\n if (module.role === ModuleRole.Force) {\n const force = module.cpu() as CPUForceDescriptor;\n if (force.state) {\n const input: Record<string, number | number[]> = {};\n for (const key of Object.keys(module.inputs)) {\n const value = module.read()[key];\n input[key] = value ?? 0;\n }\n // Always add enabled\n input.enabled = module.isEnabled() ? 1 : 0;\n\n for (let pi = 0; pi < effectiveCount; pi++) {\n const particle = this.particles[pi];\n if (particle.mass <= 0) continue;\n const setState = (name: string, value: number) => {\n if (!globalState[particle.id]) {\n globalState[particle.id] = {};\n }\n globalState[particle.id][name] = value;\n };\n\n force.state({\n particle: particle,\n dt,\n getNeighbors,\n input,\n setState,\n view: this.view,\n index: pi,\n particles: this.particles,\n getImageData,\n });\n }\n }\n }\n } catch (error) {}\n }\n\n // Second pass: apply forces for all modules\n for (const module of this.modules) {\n try {\n // Skip disabled modules\n if (!module.isEnabled()) continue;\n if (module.role === ModuleRole.Force) {\n const force = module.cpu() as CPUForceDescriptor;\n if (force.apply) {\n const input: Record<string, number | number[]> = {};\n for (const key of Object.keys(module.inputs)) {\n const value = module.read()[key];\n input[key] = value ?? 0;\n }\n // Always add enabled\n input.enabled = module.isEnabled() ? 1 : 0;\n\n for (let pi = 0; pi < effectiveCount; pi++) {\n const particle = this.particles[pi];\n if (particle.mass <= 0) continue;\n const getState = (name: string, pid?: number) => {\n return globalState[pid ?? particle.id]?.[name] ?? 0;\n };\n\n force.apply({\n particle: particle,\n dt,\n maxSize: this.getMaxSize(),\n getNeighbors,\n input,\n getState,\n view: this.view,\n index: pi,\n particles: this.particles,\n getImageData,\n });\n }\n }\n }\n } catch (error) {}\n }\n\n // Third pass: integration (once per particle)\n for (let i = 0; i < effectiveCount; i++) {\n const particle = this.particles[i];\n if (particle.mass <= 0) continue;\n // Capture position before integration\n const prevPos = { x: particle.position.x, y: particle.position.y };\n\n particle.velocity.add(particle.acceleration.clone().multiply(dt));\n particle.position.add(particle.velocity.clone().multiply(dt));\n particle.acceleration.zero();\n\n // Capture position after integration\n const postPos = { x: particle.position.x, y: particle.position.y };\n positionState.set(particle.id, { prev: prevPos, post: postPos });\n }\n\n // Fourth pass: constraints for all modules (multiple iterations)\n const iterations = Math.max(1, this.constrainIterations);\n for (let iter = 0; iter < iterations; iter++) {\n for (const module of this.modules) {\n try {\n // Skip disabled modules\n if (!module.isEnabled()) continue;\n if (module.role === ModuleRole.Force) {\n const force = module.cpu() as CPUForceDescriptor;\n if (force.constrain) {\n const input: Record<string, number | number[]> = {};\n for (const key of Object.keys(module.inputs)) {\n const value = module.read()[key];\n input[key] = value ?? 0;\n }\n // Always add enabled\n input.enabled = module.isEnabled() ? 1 : 0;\n for (let pi = 0; pi < effectiveCount; pi++) {\n const particle = this.particles[pi];\n if (particle.mass <= 0) continue;\n const getState = (name: string, pid?: number) => {\n return globalState[pid ?? particle.id]?.[name] ?? 0;\n };\n\n force.constrain({\n particle: particle,\n getNeighbors,\n dt: dt,\n maxSize: this.getMaxSize(),\n input,\n getState,\n view: this.view,\n index: pi,\n particles: this.particles,\n getImageData,\n });\n }\n }\n }\n } catch (error) {}\n }\n }\n\n // Fifth pass: corrections for all modules\n for (const module of this.modules) {\n try {\n // Skip disabled modules\n if (!module.isEnabled()) continue;\n if (module.role === ModuleRole.Force) {\n const force = module.cpu() as CPUForceDescriptor;\n if (force.correct) {\n const input: Record<string, number | number[]> = {};\n for (const key of Object.keys(module.inputs)) {\n const value = module.read()[key];\n input[key] = value ?? 0;\n }\n // Always add enabled\n input.enabled = module.isEnabled() ? 1 : 0;\n\n for (let index = 0; index < effectiveCount; index++) {\n const particle = this.particles[index];\n if (particle.mass <= 0) continue;\n const getState = (name: string, pid?: number) => {\n return globalState[pid ?? particle.id]?.[name] ?? 0;\n };\n\n const positions = positionState.get(particle.id);\n const prevPos = positions?.prev ?? {\n x: particle.position.x,\n y: particle.position.y,\n };\n const postPos = positions?.post ?? {\n x: particle.position.x,\n y: particle.position.y,\n };\n\n force.correct({\n particle: particle,\n getNeighbors,\n dt: dt,\n maxSize: this.getMaxSize(),\n prevPos,\n postPos,\n input,\n getState,\n view: this.view,\n index,\n particles: this.particles,\n getImageData,\n });\n }\n }\n }\n } catch (error) {}\n }\n }\n\n private createRenderUtils(context: CanvasRenderingContext2D) {\n return {\n formatColor: (color: {\n r: number;\n g: number;\n b: number;\n a: number;\n }): string => {\n return `rgba(${color.r * 255}, ${color.g * 255}, ${color.b * 255}, ${\n color.a\n })`;\n },\n drawCircle: (\n x: number,\n y: number,\n radius: number,\n color: { r: number; g: number; b: number; a: number }\n ): void => {\n context.fillStyle = `rgba(${color.r * 255}, ${color.g * 255}, ${\n color.b * 255\n }, ${color.a})`;\n context.beginPath();\n context.arc(x, y, radius, 0, Math.PI * 2);\n context.fill();\n },\n drawRect: (\n x: number,\n y: number,\n width: number,\n height: number,\n color: { r: number; g: number; b: number; a: number }\n ): void => {\n context.fillStyle = `rgba(${color.r * 255}, ${color.g * 255}, ${\n color.b * 255\n }, ${color.a})`;\n context.fillRect(x, y, width, height);\n },\n };\n }\n\n private render(): void {\n const context = this.canvas.getContext(\"2d\")!;\n\n // Get camera and canvas info for coordinate transformation\n const camera = this.view.getCamera();\n const zoom = this.view.getZoom();\n const size = this.view.getSize();\n const centerX = size.width / 2;\n const centerY = size.height / 2;\n const utils = this.createRenderUtils(context);\n\n // Check composition requirements of enabled render modules\n const hasBackgroundHandler = this.modules.some((module) => {\n if (!module.isEnabled() || module.role !== ModuleRole.Render)\n return false;\n const descriptor = module.cpu() as CPURenderDescriptor;\n return descriptor.composition === CanvasComposition.HandlesBackground;\n });\n\n // Determine if there are any enabled renderers\n const hasEnabledRenderer = this.modules.some(\n (module) => module.isEnabled() && module.role === ModuleRole.Render\n );\n\n // Only clear canvas if no module handles background AND either some module requires clearing\n // or there are no enabled renderers (to avoid leaving a stale frame on canvas)\n if (!hasBackgroundHandler) {\n const needsClearing = this.modules.some((module) => {\n if (!module.isEnabled() || module.role !== ModuleRole.Render)\n return false;\n const descriptor = module.cpu() as CPURenderDescriptor;\n return descriptor.composition === CanvasComposition.RequiresClear;\n });\n\n if (needsClearing || !hasEnabledRenderer) {\n context.fillStyle = `rgba(${this.clearColor.r * 255}, ${\n this.clearColor.g * 255\n }, ${this.clearColor.b * 255}, ${this.clearColor.a})`;\n context.fillRect(0, 0, context.canvas.width, context.canvas.height);\n }\n }\n\n for (const module of this.modules) {\n try {\n // Skip disabled modules\n if (!module.isEnabled()) continue;\n if (module.role === ModuleRole.Render) {\n const descriptor = module.cpu() as CPURenderDescriptor;\n const render = descriptor;\n // input\n const input: Record<string, number | number[]> = {};\n for (const key of Object.keys(module.inputs)) {\n const value = module.read()[key];\n input[key] = value ?? 0;\n }\n // Always add enabled\n input.enabled = module.isEnabled() ? 1 : 0;\n\n // Setup phase\n render.setup?.({\n context,\n input,\n view: this.view,\n clearColor: this.clearColor,\n utils,\n particles: this.particles,\n });\n\n // Render each visible particle\n const effectiveCount = this.getEffectiveCount();\n for (let i = 0; i < effectiveCount; i++) {\n const particle = this.particles[i];\n if (particle.mass == 0) continue;\n\n // Transform world position to screen position\n const worldX = (particle.position.x - camera.x) * zoom;\n const worldY = (particle.position.y - camera.y) * zoom;\n const screenX = centerX + worldX;\n const screenY = centerY + worldY;\n const screenSize = particle.size * zoom;\n\n // Skip rendering if particle is outside canvas bounds (culling)\n if (\n screenX + screenSize < 0 ||\n screenX - screenSize > size.width ||\n screenY + screenSize < 0 ||\n screenY - screenSize > size.height\n ) {\n continue;\n }\n\n render.render?.({\n context,\n particle,\n screenX,\n screenY,\n screenSize,\n input,\n utils,\n });\n }\n\n // Teardown phase\n render.teardown?.({\n context,\n input,\n utils,\n });\n }\n } catch (error) {}\n }\n }\n}\n","import { IEngine, IParticle } from \"./interfaces\";\nimport { Module } from \"./module\";\nimport { WebGPUEngine } from \"./runtimes/webgpu/engine\";\nimport { CPUEngine } from \"./runtimes/cpu/engine\";\n\nexport type EngineOptions = {\n canvas: HTMLCanvasElement;\n forces: Module<string, any>[];\n render: Module<string, any>[];\n runtime: \"cpu\" | \"webgpu\" | \"auto\";\n constrainIterations?: number;\n clearColor?: { r: number; g: number; b: number; a: number };\n cellSize?: number;\n maxParticles?: number;\n workgroupSize?: number;\n maxNeighbors?: number;\n};\n\nexport class Engine implements IEngine {\n private engine: IEngine;\n private actualRuntime: \"cpu\" | \"webgpu\"; // The actual runtime being used\n private preferredRuntime: \"cpu\" | \"webgpu\" | \"auto\"; // The requested runtime (can be 'auto')\n private originalOptions: EngineOptions; // Store original options for fallback\n\n constructor(options: EngineOptions) {\n this.preferredRuntime = options.runtime;\n this.originalOptions = { ...options }; // Store original options for fallback\n\n // Determine actual runtime to use\n let targetRuntime: \"cpu\" | \"webgpu\" | \"auto\";\n if (options.runtime === \"auto\") {\n // Synchronous check - we'll handle WebGPU availability in initialize()\n targetRuntime = \"webgpu\"; // Default to WebGPU for auto, fallback to CPU if it fails\n } else {\n targetRuntime = options.runtime;\n }\n\n this.actualRuntime = targetRuntime;\n\n if (targetRuntime === \"webgpu\") {\n this.engine = new WebGPUEngine(options);\n } else {\n this.engine = new CPUEngine(options);\n }\n }\n\n // Delegate all methods to the concrete engine implementation\n async initialize(): Promise<void> {\n try {\n await this.engine.initialize();\n } catch (error) {\n // Handle fallback for auto mode or WebGPU failures\n if (this.preferredRuntime === \"auto\" && this.actualRuntime === \"webgpu\") {\n console.warn(\n \"WebGPU initialization failed, falling back to CPU runtime:\",\n error\n );\n\n // Destroy the failed WebGPU engine\n try {\n await this.engine.destroy();\n } catch (destroyError) {\n console.warn(\"Error destroying failed WebGPU engine:\", destroyError);\n }\n\n // Create CPU engine with same options\n this.actualRuntime = \"cpu\";\n const fallbackOptions = {\n ...this.originalOptions,\n runtime: \"cpu\",\n };\n this.engine = new CPUEngine(fallbackOptions);\n\n // Initialize the CPU engine\n await this.engine.initialize();\n } else {\n throw error; // Re-throw if not auto mode or already CPU\n }\n }\n\n // Log runtime selection for auto mode\n if (this.preferredRuntime === \"auto\") {\n if (this.actualRuntime === \"cpu\") {\n console.warn(\n \"Auto runtime selection: Using CPU (WebGPU not available or failed)\"\n );\n }\n }\n }\n\n // Get the actual runtime being used (cpu or webgpu)\n getActualRuntime(): \"cpu\" | \"webgpu\" {\n return this.actualRuntime;\n }\n play(): void {\n this.engine.play();\n }\n pause(): void {\n this.engine.pause();\n }\n stop(): void {\n this.engine.stop();\n }\n destroy(): Promise<void> {\n return this.engine.destroy();\n }\n\n isPlaying(): boolean {\n return this.engine.isPlaying();\n }\n toggle(): void {\n this.engine.toggle();\n }\n getSize(): { width: number; height: number } {\n return this.engine.getSize();\n }\n setSize(width: number, height: number): void {\n this.engine.setSize(width, height);\n }\n setCamera(x: number, y: number): void {\n this.engine.setCamera(x, y);\n }\n getCamera(): { x: number; y: number } {\n return this.engine.getCamera();\n }\n setZoom(z: number): void {\n this.engine.setZoom(z);\n }\n getZoom(): number {\n return this.engine.getZoom();\n }\n // Oscillator API passthroughs\n addOscillator(params: {\n moduleName: string;\n inputName: string;\n min: number;\n max: number;\n speedHz: number;\n options?: any;\n }): string {\n return this.engine.addOscillator(params);\n }\n removeOscillator(moduleName: string, inputName: string): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this.engine as any).removeOscillator(moduleName, inputName);\n }\n updateOscillatorSpeed(\n moduleName: string,\n inputName: string,\n speedHz: number\n ): void {\n this.engine.updateOscillatorSpeed(moduleName, inputName, speedHz);\n }\n updateOscillatorBounds(\n moduleName: string,\n inputName: string,\n min: number,\n max: number\n ): void {\n this.engine.updateOscillatorBounds(moduleName, inputName, min, max);\n }\n hasOscillator(moduleName: string, inputName: string): boolean {\n return this.engine.hasOscillator(moduleName, inputName);\n }\n getOscillator(moduleName: string, inputName: string) {\n return this.engine.getOscillator(moduleName, inputName);\n }\n clearOscillators(): void {\n this.engine.clearOscillators();\n }\n clearModuleOscillators(moduleName: string): void {\n this.engine.clearModuleOscillators(moduleName);\n }\n addOscillatorListener(\n moduleName: string,\n inputName: string,\n handler: (value: number) => void\n ): void {\n this.engine.addOscillatorListener(moduleName, inputName, handler);\n }\n removeOscillatorListener(\n moduleName: string,\n inputName: string,\n handler: (value: number) => void\n ): void {\n this.engine.removeOscillatorListener(moduleName, inputName, handler);\n }\n setOscillatorState(\n moduleName: string,\n inputName: string,\n lastValue: number,\n lastDirection: -1 | 0 | 1\n ): boolean {\n return this.engine.setOscillatorState(\n moduleName,\n inputName,\n lastValue,\n lastDirection\n );\n }\n getOscillatorsElapsedSeconds(): number {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (this.engine as any).getOscillatorsElapsedSeconds();\n }\n setOscillatorsElapsedSeconds(seconds: number): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this.engine as any).setOscillatorsElapsedSeconds(seconds);\n }\n setParticles(p: IParticle[]): void {\n this.engine.setParticles(p);\n }\n addParticle(p: IParticle): void {\n this.engine.addParticle(p);\n }\n getParticles(): Promise<IParticle[]> {\n return this.engine.getParticles();\n }\n getParticle(index: number): Promise<IParticle> {\n return this.engine.getParticle(index);\n }\n // Helpers for pinning/unpinning\n async pinParticles(indexes: number[]): Promise<void> {\n const particles = await this.getParticles();\n for (const idx of indexes) {\n if (particles[idx]) particles[idx].mass = -1;\n }\n this.setParticles(particles);\n }\n async unpinParticles(indexes: number[]): Promise<void> {\n const particles = await this.getParticles();\n for (const idx of indexes) {\n if (particles[idx]) {\n const size = particles[idx].size;\n // Derive mass from size deterministically (simple proportional mapping)\n particles[idx].mass = Math.max(0.1, size);\n }\n }\n this.setParticles(particles);\n }\n async unpinAll(): Promise<void> {\n const particles = await this.getParticles();\n for (let i = 0; i < particles.length; i++) {\n if (particles[i].mass < 0) {\n const size = particles[i].size;\n particles[i].mass = Math.max(0.1, size);\n }\n }\n this.setParticles(particles);\n }\n clear(): void {\n this.engine.clear();\n }\n getCount(): number {\n return this.engine.getCount();\n }\n getFPS(): number {\n return this.engine.getFPS();\n }\n export(): Record<string, Record<string, number>> {\n return this.engine.export();\n }\n import(settings: Record<string, Record<string, number>>): void {\n this.engine.import(settings);\n }\n\n // Configuration getters and setters\n getClearColor(): { r: number; g: number; b: number; a: number } {\n return this.engine.getClearColor();\n }\n setClearColor(color: { r: number; g: number; b: number; a: number }): void {\n this.engine.setClearColor(color);\n }\n getCellSize(): number {\n return this.engine.getCellSize();\n }\n setCellSize(size: number): void {\n this.engine.setCellSize(size);\n }\n getConstrainIterations(): number {\n return this.engine.getConstrainIterations();\n }\n setConstrainIterations(iterations: number): void {\n this.engine.setConstrainIterations(iterations);\n }\n getMaxNeighbors(): number {\n return this.engine.getMaxNeighbors();\n }\n setMaxNeighbors(size: number): void {\n this.engine.setMaxNeighbors(size);\n }\n getMaxParticles(): number | null {\n return this.engine.getMaxParticles();\n }\n setMaxParticles(value: number | null): void {\n this.engine.setMaxParticles(value);\n }\n getModule(name: string): Module | undefined {\n return this.engine.getModule(name);\n }\n\n // Check if a module is supported by the current runtime\n isSupported(module: Module): boolean {\n try {\n if (this.actualRuntime === \"webgpu\") {\n // For WebGPU, check if the module has a webgpu() method that doesn't throw\n module.webgpu();\n return true;\n } else {\n // For CPU, check if the module has a cpu() method that doesn't throw\n module.cpu();\n return true;\n }\n } catch (error) {\n // If the method throws \"Not implemented\" or any other error, the module is not supported\n return false;\n }\n }\n}\n","/**\n * Spawner\n *\n * Utility for generating initial `IParticle[]` configurations for common\n * shapes (grid, random, circle, donut, square) with optional initial velocity\n * presets (random/in/out/clockwise/counter-clockwise/custom). Also includes\n * lightweight color parsing helpers.\n */\nimport { IParticle } from \"./interfaces\";\n\nexport type VelocityDirection =\n | \"random\"\n | \"in\"\n | \"out\"\n | \"custom\"\n | \"clockwise\"\n | \"counter-clockwise\";\n\nexport interface VelocityConfig {\n speed: number;\n direction: VelocityDirection;\n angle?: number; // radians for custom\n}\n\nexport interface SpawnOptions {\n count: number;\n shape: \"grid\" | \"random\" | \"circle\" | \"donut\" | \"square\";\n center: { x: number; y: number };\n colors?: string[];\n spacing?: number; // grid\n radius?: number; // circle/donut outer\n innerRadius?: number; // donut inner\n squareSize?: number; // square size\n cornerRadius?: number; // square corner radius\n size?: number; // particle size\n mass?: number; // particle mass\n bounds?: { width: number; height: number }; // random\n velocity?: VelocityConfig;\n}\n\nfunction calculateVelocity(\n position: { x: number; y: number },\n center: { x: number; y: number },\n cfg?: VelocityConfig\n): { vx: number; vy: number } {\n if (!cfg || cfg.speed === 0) return { vx: 0, vy: 0 };\n\n const speed = cfg.speed;\n let angle = 0;\n\n switch (cfg.direction) {\n case \"random\":\n angle = Math.random() * Math.PI * 2;\n break;\n case \"in\": {\n const dx = center.x - position.x;\n const dy = center.y - position.y;\n angle = Math.atan2(dy, dx);\n break;\n }\n case \"out\": {\n const dx = position.x - center.x;\n const dy = position.y - center.y;\n angle = Math.atan2(dy, dx);\n break;\n }\n case \"clockwise\": {\n const dx = position.x - center.x;\n const dy = position.y - center.y;\n angle = Math.atan2(-dx, dy);\n break;\n }\n case \"counter-clockwise\": {\n const dx = position.x - center.x;\n const dy = position.y - center.y;\n angle = Math.atan2(dx, -dy);\n break;\n }\n case \"custom\":\n angle = cfg.angle || 0;\n break;\n }\n\n return { vx: speed * Math.cos(angle), vy: speed * Math.sin(angle) };\n}\n\nexport class Spawner {\n initParticles(options: SpawnOptions): IParticle[] {\n const {\n count,\n shape,\n center,\n spacing = 25,\n radius = 100,\n innerRadius = 50,\n squareSize = 200,\n cornerRadius = 0,\n size = 5,\n mass = 1,\n bounds,\n velocity,\n colors,\n } = options;\n\n const particles: IParticle[] = [];\n\n if (count <= 0) return particles;\n\n const toColor = (\n hex: string\n ): { r: number; g: number; b: number; a: number } => {\n let h = hex.trim();\n if (h.startsWith(\"#\")) h = h.slice(1);\n if (h.length === 3) {\n const r = parseInt(h[0] + h[0], 16);\n const g = parseInt(h[1] + h[1], 16);\n const b = parseInt(h[2] + h[2], 16);\n return { r: r / 255, g: g / 255, b: b / 255, a: 1 };\n }\n if (h.length >= 6) {\n const r = parseInt(h.slice(0, 2), 16);\n const g = parseInt(h.slice(2, 4), 16);\n const b = parseInt(h.slice(4, 6), 16);\n return { r: r / 255, g: g / 255, b: b / 255, a: 1 };\n }\n return { r: 1, g: 1, b: 1, a: 1 };\n };\n\n const getColor = () => {\n if (!colors || colors.length === 0) return { r: 1, g: 1, b: 1, a: 1 };\n return toColor(colors[Math.floor(Math.random() * colors.length)]);\n };\n\n if (shape === \"grid\") {\n const cols = Math.ceil(Math.sqrt(count));\n const rows = Math.ceil(count / cols);\n const totalW = (cols - 1) * spacing;\n const totalH = (rows - 1) * spacing;\n const startX = center.x - totalW / 2;\n const startY = center.y - totalH / 2;\n\n for (let i = 0; i < count; i++) {\n const col = i % cols;\n const row = Math.floor(i / cols);\n const x = startX + col * spacing;\n const y = startY + row * spacing;\n const { vx, vy } = calculateVelocity({ x, y }, center, velocity);\n particles.push({\n position: { x, y },\n velocity: { x: vx, y: vy },\n size,\n mass,\n color: getColor(),\n });\n }\n return particles;\n }\n\n if (shape === \"random\") {\n const w = bounds?.width ?? radius * 2;\n const h = bounds?.height ?? radius * 2;\n const left = center.x - w / 2;\n const top = center.y - h / 2;\n for (let i = 0; i < count; i++) {\n const x = left + Math.random() * w;\n const y = top + Math.random() * h;\n const { vx, vy } = calculateVelocity({ x, y }, center, velocity);\n particles.push({\n position: { x, y },\n velocity: { x: vx, y: vy },\n size,\n mass,\n color: getColor(),\n });\n }\n return particles;\n }\n\n if (shape === \"circle\") {\n for (let i = 0; i < count; i++) {\n const angle = (i / count) * Math.PI * 2;\n const x = center.x + Math.cos(angle) * radius;\n const y = center.y + Math.sin(angle) * radius;\n const { vx, vy } = calculateVelocity({ x, y }, center, velocity);\n particles.push({\n position: { x, y },\n velocity: { x: vx, y: vy },\n size,\n mass,\n color: getColor(),\n });\n }\n return particles;\n }\n\n if (shape === \"donut\") {\n for (let i = 0; i < count; i++) {\n const ringR = innerRadius + Math.random() * (radius - innerRadius);\n const angle = Math.random() * Math.PI * 2;\n const x = center.x + Math.cos(angle) * ringR;\n const y = center.y + Math.sin(angle) * ringR;\n const { vx, vy } = calculateVelocity({ x, y }, center, velocity);\n particles.push({\n position: { x, y },\n velocity: { x: vx, y: vy },\n size,\n mass,\n color: getColor(),\n });\n }\n return particles;\n }\n\n if (shape === \"square\") {\n const half = squareSize / 2;\n const r = Math.max(0, Math.min(cornerRadius, half));\n const straight = Math.max(0, squareSize - 2 * r); // length of each straight segment\n const cornerArcLen = r > 0 ? (Math.PI * r) / 2 : 0; // quarter circle arc length\n const totalPerimeter = 4 * straight + 4 * cornerArcLen;\n\n // Helper to compute point on straight sides\n const posOnSide = (\n side: \"top\" | \"right\" | \"bottom\" | \"left\",\n t: number\n ) => {\n // t in [0,1] along straight portion\n const offset = (t - 0.5) * straight;\n switch (side) {\n case \"top\":\n return { x: center.x + offset, y: center.y - half };\n case \"right\":\n return { x: center.x + half, y: center.y + offset };\n case \"bottom\":\n return { x: center.x - offset, y: center.y + half };\n case \"left\":\n return { x: center.x - half, y: center.y - offset };\n }\n };\n\n // Helper to compute point on rounded corner\n const posOnCorner = (\n corner: \"top-right\" | \"bottom-right\" | \"bottom-left\" | \"top-left\",\n t: number\n ) => {\n // t in [0,1] around quarter circle\n const cornerCenterOffset = half - r;\n let cx = center.x;\n let cy = center.y;\n let startAngle = 0;\n switch (corner) {\n case \"top-right\":\n cx = center.x + cornerCenterOffset;\n cy = center.y - cornerCenterOffset;\n startAngle = 1.5 * Math.PI; // from up to right\n break;\n case \"bottom-right\":\n cx = center.x + cornerCenterOffset;\n cy = center.y + cornerCenterOffset;\n startAngle = 0; // from right to down\n break;\n case \"bottom-left\":\n cx = center.x - cornerCenterOffset;\n cy = center.y + cornerCenterOffset;\n startAngle = 0.5 * Math.PI; // from down to left\n break;\n case \"top-left\":\n cx = center.x - cornerCenterOffset;\n cy = center.y - cornerCenterOffset;\n startAngle = Math.PI; // from left to up\n break;\n }\n const ang = startAngle + t * (Math.PI / 2);\n return { x: cx + r * Math.cos(ang), y: cy + r * Math.sin(ang) };\n };\n\n for (let i = 0; i < count; i++) {\n const d = Math.random() * totalPerimeter;\n let rem = d;\n\n // top side straight\n if (straight > 0 && rem <= straight) {\n const t = rem / straight;\n const p = posOnSide(\"top\", t);\n const { vx, vy } = calculateVelocity(p, center, velocity);\n particles.push({\n position: { x: p.x, y: p.y },\n velocity: { x: vx, y: vy },\n size,\n mass,\n color: getColor(),\n });\n continue;\n }\n rem -= straight;\n\n // top-right corner\n if (cornerArcLen > 0 && rem <= cornerArcLen) {\n const t = rem / cornerArcLen;\n const p = posOnCorner(\"top-right\", t);\n const { vx, vy } = calculateVelocity(p, center, velocity);\n particles.push({\n position: { x: p.x, y: p.y },\n velocity: { x: vx, y: vy },\n size,\n mass,\n color: getColor(),\n });\n continue;\n }\n rem -= cornerArcLen;\n\n // right side straight\n if (straight > 0 && rem <= straight) {\n const t = rem / straight;\n const p = posOnSide(\"right\", t);\n const { vx, vy } = calculateVelocity(p, center, velocity);\n particles.push({\n position: { x: p.x, y: p.y },\n velocity: { x: vx, y: vy },\n size,\n mass,\n color: getColor(),\n });\n continue;\n }\n rem -= straight;\n\n // bottom-right corner\n if (cornerArcLen > 0 && rem <= cornerArcLen) {\n const t = rem / cornerArcLen;\n const p = posOnCorner(\"bottom-right\", t);\n const { vx, vy } = calculateVelocity(p, center, velocity);\n particles.push({\n position: { x: p.x, y: p.y },\n velocity: { x: vx, y: vy },\n size,\n mass,\n color: getColor(),\n });\n continue;\n }\n rem -= cornerArcLen;\n\n // bottom side straight\n if (straight > 0 && rem <= straight) {\n const t = rem / straight;\n const p = posOnSide(\"bottom\", t);\n const { vx, vy } = calculateVelocity(p, center, velocity);\n particles.push({\n position: { x: p.x, y: p.y },\n velocity: { x: vx, y: vy },\n size,\n mass,\n color: getColor(),\n });\n continue;\n }\n rem -= straight;\n\n // bottom-left corner\n if (cornerArcLen > 0 && rem <= cornerArcLen) {\n const t = rem / cornerArcLen;\n const p = posOnCorner(\"bottom-left\", t);\n const { vx, vy } = calculateVelocity(p, center, velocity);\n particles.push({\n position: { x: p.x, y: p.y },\n velocity: { x: vx, y: vy },\n size,\n mass,\n color: getColor(),\n });\n continue;\n }\n rem -= cornerArcLen;\n\n // left side straight\n if (straight > 0 && rem <= straight) {\n const t = rem / straight;\n const p = posOnSide(\"left\", t);\n const { vx, vy } = calculateVelocity(p, center, velocity);\n particles.push({\n position: { x: p.x, y: p.y },\n velocity: { x: vx, y: vy },\n size,\n mass,\n color: getColor(),\n });\n continue;\n }\n rem -= straight;\n\n // top-left corner (fallback)\n const t = cornerArcLen > 0 ? rem / cornerArcLen : 0;\n const p =\n cornerArcLen > 0\n ? posOnCorner(\"top-left\", t)\n : { x: center.x - half, y: center.y - half };\n const { vx, vy } = calculateVelocity(p, center, velocity);\n particles.push({\n position: { x: p.x, y: p.y },\n velocity: { x: vx, y: vy },\n size,\n mass,\n color: getColor(),\n });\n }\n return particles;\n }\n\n return particles;\n }\n}\n","/**\n * Environment (Force Module)\n *\n * Applies global influences: gravity (fixed/inwards/outwards/custom), inertia,\n * friction, and velocity damping. Gravity direction can be vector- or mode-driven,\n * with center computed from grid extents for inwards/outwards.\n */\nimport { Vector } from \"../../vector\";\nimport {\n Module,\n type WebGPUDescriptor,\n ModuleRole,\n CPUDescriptor,\n DataType,\n} from \"../../module\";\n\nexport const DEFAULT_ENVIRONMENT_GRAVITY_STRENGTH = 0;\nexport const DEFAULT_ENVIRONMENT_GRAVITY_DIRECTION: GravityDirection = \"down\";\nexport const DEFAULT_ENVIRONMENT_GRAVITY_ANGLE = Math.PI / 2; // radians, default down\nexport const DEFAULT_ENVIRONMENT_INERTIA = 0;\nexport const DEFAULT_ENVIRONMENT_FRICTION = 0;\nexport const DEFAULT_ENVIRONMENT_DAMPING = 0;\n\nexport type GravityDirection =\n | \"up\"\n | \"down\"\n | \"left\"\n | \"right\"\n | \"inwards\"\n | \"outwards\"\n | \"custom\";\n\ntype EnvironmentInputs = {\n gravityStrength: number;\n dirX: number;\n dirY: number;\n inertia: number;\n friction: number;\n damping: number;\n mode: number;\n};\n\nexport class Environment extends Module<\"environment\", EnvironmentInputs> {\n readonly name = \"environment\" as const;\n readonly role = ModuleRole.Force;\n readonly inputs = {\n gravityStrength: DataType.NUMBER,\n dirX: DataType.NUMBER,\n dirY: DataType.NUMBER,\n inertia: DataType.NUMBER,\n friction: DataType.NUMBER,\n damping: DataType.NUMBER,\n mode: DataType.NUMBER,\n } as const;\n\n private gravityDirection: GravityDirection = \"down\";\n private gravityAngle: number = Math.PI / 2; // radians, default down\n\n constructor(opts?: {\n enabled?: boolean;\n gravityStrength?: number;\n dirX?: number;\n dirY?: number;\n inertia?: number;\n friction?: number;\n damping?: number;\n gravityDirection?: GravityDirection;\n gravityAngle?: number; // radians, only used when direction is custom\n }) {\n super();\n\n this.gravityDirection =\n opts?.gravityDirection ?? DEFAULT_ENVIRONMENT_GRAVITY_DIRECTION;\n this.gravityAngle = opts?.gravityAngle ?? DEFAULT_ENVIRONMENT_GRAVITY_ANGLE;\n\n // Initialize direction\n const initial = this.directionFromOptions(\n this.gravityDirection,\n this.gravityAngle,\n opts?.dirX,\n opts?.dirY\n );\n\n this.write({\n gravityStrength:\n opts?.gravityStrength ?? DEFAULT_ENVIRONMENT_GRAVITY_STRENGTH,\n dirX: initial.x,\n dirY: initial.y,\n inertia: opts?.inertia ?? DEFAULT_ENVIRONMENT_INERTIA,\n friction: opts?.friction ?? DEFAULT_ENVIRONMENT_FRICTION,\n damping: opts?.damping ?? DEFAULT_ENVIRONMENT_DAMPING,\n mode:\n this.gravityDirection === \"inwards\"\n ? 1\n : this.gravityDirection === \"outwards\"\n ? 2\n : 0,\n });\n if (opts?.enabled !== undefined) {\n this.setEnabled(!!opts.enabled);\n }\n }\n\n private directionFromOptions(\n dir: GravityDirection,\n angleRad: number,\n dirXOverride?: number,\n dirYOverride?: number\n ): { x: number; y: number } {\n // If explicit vector provided, use it\n if (dirXOverride !== undefined || dirYOverride !== undefined) {\n return { x: dirXOverride ?? 0, y: dirYOverride ?? 0 };\n }\n switch (dir) {\n case \"up\":\n return { x: 0, y: -1 };\n case \"down\":\n return { x: 0, y: 1 };\n case \"left\":\n return { x: -1, y: 0 };\n case \"right\":\n return { x: 1, y: 0 };\n case \"inwards\":\n // Approximate as downward for now (screen space inward not available here)\n return { x: 0, y: 1 };\n case \"outwards\":\n // Approximate as upward for now\n return { x: 0, y: -1 };\n case \"custom\":\n default: {\n const x = Math.cos(angleRad);\n const y = Math.sin(angleRad);\n return { x, y };\n }\n }\n }\n\n setGravityStrength(value: number): void {\n this.write({ gravityStrength: value });\n }\n setDirection(x: number, y: number): void {\n this.write({ dirX: x, dirY: y });\n }\n setGravityDirection(direction: GravityDirection): void {\n this.gravityDirection = direction;\n const v = this.directionFromOptions(\n this.gravityDirection,\n this.gravityAngle\n );\n this.setDirection(v.x, v.y);\n this.write({\n mode: direction === \"inwards\" ? 1 : direction === \"outwards\" ? 2 : 0,\n });\n }\n setGravityAngle(angleRadians: number): void {\n this.gravityAngle = angleRadians;\n if (this.gravityDirection === \"custom\") {\n const v = this.directionFromOptions(\"custom\", this.gravityAngle);\n this.setDirection(v.x, v.y);\n }\n }\n setInertia(value: number): void {\n this.write({ inertia: value });\n }\n setFriction(value: number): void {\n this.write({ friction: value });\n }\n setDamping(value: number): void {\n this.write({ damping: value });\n }\n\n getGravityStrength(): number {\n return this.readValue(\"gravityStrength\");\n }\n getDirX(): number {\n return this.readValue(\"dirX\");\n }\n getDirY(): number {\n return this.readValue(\"dirY\");\n }\n getInertia(): number {\n return this.readValue(\"inertia\");\n }\n getFriction(): number {\n return this.readValue(\"friction\");\n }\n getDamping(): number {\n return this.readValue(\"damping\");\n }\n getMode(): number {\n return this.readValue(\"mode\");\n }\n\n webgpu(): WebGPUDescriptor<EnvironmentInputs> {\n return {\n apply: ({ particleVar, dtVar, getUniform }) => `\n // Gravity as force: acceleration += dir * strength\n let mode = ${getUniform(\"mode\")};\n var gdir = vec2<f32>(${getUniform(\"dirX\")}, ${getUniform(\"dirY\")});\n if (mode == 1.0) {\n let cx = (GRID_MINX() + GRID_MAXX()) * 0.5;\n let cy = (GRID_MINY() + GRID_MAXY()) * 0.5;\n gdir = vec2<f32>(cx, cy) - ${particleVar}.position;\n } else if (mode == 2.0) {\n let cx = (GRID_MINX() + GRID_MAXX()) * 0.5;\n let cy = (GRID_MINY() + GRID_MAXY()) * 0.5;\n gdir = ${particleVar}.position - vec2<f32>(cx, cy);\n }\n let glen = length(gdir);\n if (glen > 0.0) {\n ${particleVar}.acceleration += (gdir / glen) * ${getUniform(\n \"gravityStrength\"\n )};\n }\n\n // Inertia: acceleration += velocity * dt * inertia\n let inertia = ${getUniform(\"inertia\")};\n if (inertia > 0.0) {\n ${particleVar}.acceleration += ${particleVar}.velocity * (${dtVar}) * inertia;\n }\n\n // Friction: acceleration += -velocity * friction\n let friction = ${getUniform(\"friction\")};\n if (friction > 0.0) {\n ${particleVar}.acceleration += -${particleVar}.velocity * friction;\n }\n\n // Damping: directly scale velocity (post-force effect in CPU code)\n let damping = ${getUniform(\"damping\")};\n if (damping != 0.0) {\n ${particleVar}.velocity *= (1.0 - damping * 0.2);\n }\n`,\n };\n }\n\n cpu(): CPUDescriptor<EnvironmentInputs> {\n return {\n apply: ({ particle, dt, input, view }) => {\n const gdir = new Vector(input.dirX, input.dirY);\n\n if (input.mode === 1) {\n // Inwards gravity: center is camera position (matches WebGPU grid center)\n const camera = view.getCamera();\n gdir.set(camera.x, camera.y).subtract(particle.position);\n } else if (input.mode === 2) {\n // Outwards gravity: center is camera position (matches WebGPU grid center)\n const camera = view.getCamera();\n gdir.set(\n particle.position.x - camera.x,\n particle.position.y - camera.y\n );\n }\n const glen = gdir.magnitude();\n if (glen > 0) {\n const gravityForce = gdir\n .clone()\n .divide(glen)\n .multiply(input.gravityStrength);\n particle.acceleration.add(gravityForce);\n }\n\n // Inertia: acceleration += velocity * dt * inertia\n const inertia = input.inertia;\n if (inertia > 0) {\n const inertiaForce = particle.velocity.clone().multiply(dt * inertia);\n particle.acceleration.add(inertiaForce);\n }\n\n // Friction: acceleration += -velocity * friction\n const friction = input.friction;\n if (friction > 0) {\n const frictionForce = particle.velocity.clone().multiply(-friction);\n particle.acceleration.add(frictionForce);\n }\n\n // Damping: directly scale velocity (post-force effect in CPU code)\n const damping = input.damping;\n if (damping !== 0) {\n particle.velocity.multiply(1 - damping * 0.2);\n }\n },\n };\n }\n}\n","/**\n * Boundary (Force Module)\n *\n * Enforces world bounds using the grid extents. Modes:\n * - bounce: reflect with restitution and tangential friction\n * - warp: wrap to the opposite side once fully outside\n * - kill: set mass=0 to cull particle when fully outside\n * - none: no constraint (repel still optional)\n * Supports optional repel force near edges.\n */\nimport {\n Module,\n type WebGPUDescriptor,\n ModuleRole,\n CPUDescriptor,\n DataType,\n} from \"../../module\";\nimport { Vector } from \"../../vector\";\n\nexport type BoundaryMode = \"bounce\" | \"warp\" | \"kill\" | \"none\";\n\nexport const DEFAULT_BOUNDARY_RESTITUTION = 0.9;\nexport const DEFAULT_BOUNDARY_FRICTION = 0.1;\nexport const DEFAULT_BOUNDARY_MODE: BoundaryMode = \"bounce\";\nexport const DEFAULT_BOUNDARY_REPEL_DISTANCE = 0.0;\nexport const DEFAULT_BOUNDARY_REPEL_STRENGTH = 0.0;\n\ntype BoundaryInputs = {\n restitution: number;\n friction: number;\n mode: number;\n repelDistance: number;\n repelStrength: number;\n};\n\nexport class Boundary extends Module<\"boundary\", BoundaryInputs> {\n readonly name = \"boundary\" as const;\n readonly role = ModuleRole.Force;\n readonly inputs = {\n restitution: DataType.NUMBER,\n friction: DataType.NUMBER,\n mode: DataType.NUMBER,\n repelDistance: DataType.NUMBER,\n repelStrength: DataType.NUMBER,\n } as const;\n\n constructor(opts?: {\n enabled?: boolean;\n restitution?: number;\n friction?: number;\n mode?: BoundaryMode;\n repelDistance?: number;\n repelStrength?: number;\n }) {\n super();\n const mode = opts?.mode ?? DEFAULT_BOUNDARY_MODE;\n this.write({\n restitution: opts?.restitution ?? DEFAULT_BOUNDARY_RESTITUTION,\n friction: opts?.friction ?? DEFAULT_BOUNDARY_FRICTION,\n mode: this.modeToUniform(mode),\n repelDistance: opts?.repelDistance ?? DEFAULT_BOUNDARY_REPEL_DISTANCE,\n repelStrength: opts?.repelStrength ?? DEFAULT_BOUNDARY_REPEL_STRENGTH,\n });\n if (opts?.enabled !== undefined) {\n this.setEnabled(!!opts.enabled);\n }\n }\n\n setRestitution(value: number): void {\n this.write({ restitution: value });\n }\n\n setFriction(value: number): void {\n this.write({ friction: value });\n }\n\n setMode(mode: BoundaryMode): void {\n this.write({ mode: this.modeToUniform(mode) });\n }\n\n setRepelDistance(value: number): void {\n this.write({ repelDistance: value });\n }\n\n setRepelStrength(value: number): void {\n this.write({ repelStrength: value });\n }\n\n getRestitution(): number {\n return this.readValue(\"restitution\");\n }\n getFriction(): number {\n return this.readValue(\"friction\");\n }\n getMode(): number {\n return this.readValue(\"mode\");\n }\n getRepelDistance(): number {\n return this.readValue(\"repelDistance\");\n }\n getRepelStrength(): number {\n return this.readValue(\"repelStrength\");\n }\n\n private modeToUniform(mode: BoundaryMode): number {\n switch (mode) {\n case \"bounce\":\n return 0;\n case \"warp\":\n return 1;\n case \"kill\":\n return 2;\n case \"none\":\n return 3;\n default:\n return 0;\n }\n }\n\n webgpu(): WebGPUDescriptor<BoundaryInputs> {\n return {\n apply: ({ particleVar, getUniform }) => `{\n // Bounce using global grid extents\n let halfSize = ${particleVar}.size;\n let minX = GRID_MINX();\n let maxX = GRID_MAXX();\n let minY = GRID_MINY();\n let maxY = GRID_MAXY();\n let bounce = ${getUniform(\"restitution\")};\n let friction = ${getUniform(\"friction\")};\n let mode = ${getUniform(\"mode\")};\n let repelDist = ${getUniform(\"repelDistance\")};\n let repelStrength = ${getUniform(\"repelStrength\")};\n\n // Repel force applied for all modes\n if (repelStrength > 0.0) {\n let distLeft = (${particleVar}.position.x - halfSize) - minX;\n let distRight = maxX - (${particleVar}.position.x + halfSize);\n let distTop = (${particleVar}.position.y - halfSize) - minY;\n let distBottom = maxY - (${particleVar}.position.y + halfSize);\n\n var fx = 0.0;\n var fy = 0.0;\n if (repelDist <= 0.0) {\n if (distLeft < 0.0) { fx += repelStrength; }\n if (distRight < 0.0) { fx -= repelStrength; }\n if (distTop < 0.0) { fy += repelStrength; }\n if (distBottom < 0.0) { fy -= repelStrength; }\n } else {\n // Outside of bounds: apply full-strength push back in\n if (distLeft < 0.0) { fx += repelStrength; }\n if (distRight < 0.0) { fx -= repelStrength; }\n if (distTop < 0.0) { fy += repelStrength; }\n if (distBottom < 0.0) { fy -= repelStrength; }\n\n // Inside within repel distance: scale by proximity\n if (distLeft < repelDist && distLeft > 0.0) {\n let ratio = (repelDist - distLeft) / repelDist;\n fx += ratio * repelStrength;\n }\n if (distRight < repelDist && distRight > 0.0) {\n let ratio = (repelDist - distRight) / repelDist;\n fx -= ratio * repelStrength;\n }\n if (distTop < repelDist && distTop > 0.0) {\n let ratio = (repelDist - distTop) / repelDist;\n fy += ratio * repelStrength;\n }\n if (distBottom < repelDist && distBottom > 0.0) {\n let ratio = (repelDist - distBottom) / repelDist;\n fy -= ratio * repelStrength;\n }\n }\n ${particleVar}.acceleration += vec2<f32>(fx, fy);\n }\n\n if (mode == 0.0) {\n // bounce\n // X axis\n if (${particleVar}.position.x - halfSize < minX) {\n ${particleVar}.position.x = minX + halfSize;\n ${particleVar}.velocity.x = -${particleVar}.velocity.x * bounce;\n ${particleVar}.velocity.y *= max(0.0, 1.0 - friction);\n } else if (${particleVar}.position.x + halfSize > maxX) {\n ${particleVar}.position.x = maxX - halfSize;\n ${particleVar}.velocity.x = -${particleVar}.velocity.x * bounce;\n ${particleVar}.velocity.y *= max(0.0, 1.0 - friction);\n }\n\n // Y axis\n if (${particleVar}.position.y - halfSize < minY) {\n ${particleVar}.position.y = minY + halfSize;\n ${particleVar}.velocity.y = -${particleVar}.velocity.y * bounce;\n ${particleVar}.velocity.x *= max(0.0, 1.0 - friction);\n } else if (${particleVar}.position.y + halfSize > maxY) {\n ${particleVar}.position.y = maxY - halfSize;\n ${particleVar}.velocity.y = -${particleVar}.velocity.y * bounce;\n ${particleVar}.velocity.x *= max(0.0, 1.0 - friction);\n }\n } else if (mode == 1.0) {\n // warp\n // Only warp once the particle is fully outside the bounds\n let eps = 1.0; // spawn just outside the opposite edge so it slides in\n if (${particleVar}.position.x + halfSize < minX) {\n ${particleVar}.position.x = maxX + halfSize + eps;\n } else if (${particleVar}.position.x - halfSize > maxX) {\n ${particleVar}.position.x = minX - halfSize - eps;\n }\n if (${particleVar}.position.y + halfSize < minY) {\n ${particleVar}.position.y = maxY + halfSize + eps;\n } else if (${particleVar}.position.y - halfSize > maxY) {\n ${particleVar}.position.y = minY - halfSize - eps;\n }\n } else if (mode == 2.0) {\n // kill\n // Only kill once the particle is fully outside the bounds\n if (${particleVar}.position.x - halfSize < minX) {\n ${particleVar}.position.x = minX - halfSize * 4;\n ${particleVar}.mass = 0.0;\n } else if (${particleVar}.position.x + halfSize > maxX) {\n ${particleVar}.position.x = maxX + halfSize * 4;\n ${particleVar}.mass = 0.0;\n }\n if (${particleVar}.position.y - halfSize < minY) {\n ${particleVar}.position.y = minY - halfSize * 4;\n ${particleVar}.mass = 0.0;\n } else if (${particleVar}.position.y + halfSize > maxY) {\n ${particleVar}.position.y = maxY + halfSize * 4;\n ${particleVar}.mass = 0.0;\n } \n } else if (mode == 3.0) {\n // none: no boundary constraints; repel force above still applies\n }\n}`,\n };\n }\n\n cpu(): CPUDescriptor<BoundaryInputs> {\n return {\n apply: ({ particle, input, view }) => {\n // Calculate world bounds similar to WebGPU grid system\n const camera = view.getCamera();\n const zoom = Math.max(view.getZoom(), 0.0001);\n const size = view.getSize();\n const halfW = size.width / (2 * zoom);\n const halfH = size.height / (2 * zoom);\n const minX = camera.x - halfW;\n const maxX = camera.x + halfW;\n const minY = camera.y - halfH;\n const maxY = camera.y + halfH;\n const halfSize = particle.size;\n const bounce = input.restitution;\n const friction = input.friction;\n const mode = input.mode;\n const repelDist = input.repelDistance;\n const repelStrength = input.repelStrength;\n\n // Repel force applied for all modes\n if (repelStrength > 0) {\n const distLeft = particle.position.x - halfSize - minX;\n const distRight = maxX - (particle.position.x + halfSize);\n const distTop = particle.position.y - halfSize - minY;\n const distBottom = maxY - (particle.position.y + halfSize);\n\n let fx = 0;\n let fy = 0;\n\n if (repelDist <= 0) {\n if (distLeft < 0) fx += repelStrength;\n if (distRight < 0) fx -= repelStrength;\n if (distTop < 0) fy += repelStrength;\n if (distBottom < 0) fy -= repelStrength;\n } else {\n // Outside of bounds: apply full-strength push back in\n if (distLeft < 0) fx += repelStrength;\n if (distRight < 0) fx -= repelStrength;\n if (distTop < 0) fy += repelStrength;\n if (distBottom < 0) fy -= repelStrength;\n\n // Inside within repel distance: scale by proximity\n if (distLeft < repelDist && distLeft > 0) {\n const ratio = (repelDist - distLeft) / repelDist;\n fx += ratio * repelStrength;\n }\n if (distRight < repelDist && distRight > 0) {\n const ratio = (repelDist - distRight) / repelDist;\n fx -= ratio * repelStrength;\n }\n if (distTop < repelDist && distTop > 0) {\n const ratio = (repelDist - distTop) / repelDist;\n fy += ratio * repelStrength;\n }\n if (distBottom < repelDist && distBottom > 0) {\n const ratio = (repelDist - distBottom) / repelDist;\n fy -= ratio * repelStrength;\n }\n }\n\n particle.acceleration.add(new Vector(fx, fy));\n }\n\n if (mode === 0) {\n // bounce\n // X axis\n if (particle.position.x - halfSize < minX) {\n particle.position.x = minX + halfSize;\n particle.velocity.x = -particle.velocity.x * bounce;\n particle.velocity.y *= Math.max(0, 1 - friction);\n } else if (particle.position.x + halfSize > maxX) {\n particle.position.x = maxX - halfSize;\n particle.velocity.x = -particle.velocity.x * bounce;\n particle.velocity.y *= Math.max(0, 1 - friction);\n }\n\n // Y axis\n if (particle.position.y - halfSize < minY) {\n particle.position.y = minY + halfSize;\n particle.velocity.y = -particle.velocity.y * bounce;\n particle.velocity.x *= Math.max(0, 1 - friction);\n } else if (particle.position.y + halfSize > maxY) {\n particle.position.y = maxY - halfSize;\n particle.velocity.y = -particle.velocity.y * bounce;\n particle.velocity.x *= Math.max(0, 1 - friction);\n }\n } else if (mode === 1) {\n // warp\n // Only warp once the particle is fully outside the bounds\n const eps = 1; // spawn just outside the opposite edge so it slides in\n if (particle.position.x + halfSize < minX) {\n particle.position.x = maxX + halfSize + eps;\n } else if (particle.position.x - halfSize > maxX) {\n particle.position.x = minX - halfSize - eps;\n }\n if (particle.position.y + halfSize < minY) {\n particle.position.y = maxY + halfSize + eps;\n } else if (particle.position.y - halfSize > maxY) {\n particle.position.y = minY - halfSize - eps;\n }\n } else if (mode === 2) {\n // kill\n // Only kill once the particle is fully outside the bounds\n if (\n particle.position.x + halfSize < minX ||\n particle.position.x - halfSize > maxX ||\n particle.position.y + halfSize < minY ||\n particle.position.y - halfSize > maxY\n ) {\n particle.mass = 0;\n }\n } else if (mode === 3) {\n // none: no boundary constraints; repel force above still applies\n }\n },\n };\n }\n}\n","/**\n * Collisions (Force Module)\n *\n * Simple pairwise collision response using the spatial grid for neighbor queries.\n * Uses a two-phase approach: pick deepest overlap neighbor (to reduce bias), then\n * correct position and apply a bounce impulse along the contact normal.\n * Velocity response in apply() is commented out; constraint/correct handle stability.\n *\n * Special handling: When particles are at identical positions (e.g., from boundary\n * repositioning), they are separated with a small pseudo-random offset to prevent\n * them from being stuck together permanently.\n */\nimport {\n Module,\n type WebGPUDescriptor,\n ModuleRole,\n CPUDescriptor,\n DataType,\n} from \"../../module\";\nimport { Particle } from \"../../particle\";\n\nexport const DEFAULT_COLLISIONS_RESTITUTION = 0.8;\n\n// Simple, brute-force elastic collision response applied only to current particle\ntype CollisionsInputs = {\n restitution: number;\n};\n\nexport class Collisions extends Module<\"collisions\", CollisionsInputs> {\n readonly name = \"collisions\" as const;\n readonly role = ModuleRole.Force;\n readonly inputs = {\n restitution: DataType.NUMBER,\n } as const;\n\n constructor(opts?: { enabled?: boolean; restitution?: number }) {\n super();\n this.write({\n restitution: opts?.restitution ?? DEFAULT_COLLISIONS_RESTITUTION,\n });\n if (opts?.enabled !== undefined) {\n this.setEnabled(!!opts.enabled);\n }\n }\n\n setRestitution(value: number): void {\n this.write({ restitution: value });\n }\n\n getRestitution(): number {\n return this.readValue(\"restitution\");\n }\n\n webgpu(): WebGPUDescriptor<CollisionsInputs> {\n return {\n constrain: ({ particleVar, maxSizeVar, getUniform }) => `\n // Pass 1: find deepest overlap neighbor to reduce scan-order bias\n var it = neighbor_iter_init(${particleVar}.position, ${particleVar}.size + ${maxSizeVar} + 1);\n var bestJ: u32 = NEIGHBOR_NONE;\n var bestN: vec2<f32> = vec2<f32>(0.0, 0.0);\n var bestOverlap: f32 = 0.0;\n var identicalPositionJ: u32 = NEIGHBOR_NONE;\n loop {\n let j = neighbor_iter_next(&it, index);\n if (j == NEIGHBOR_NONE) { break; }\n var other = particles[j];\n // Skip removed neighbors; treat pinned as infinite mass later\n if (other.mass == 0.0) { continue; }\n let r = other.size + ${particleVar}.size;\n let delta = ${particleVar}.position - other.position;\n let dist2 = dot(delta, delta);\n \n // Special case: particles at identical positions\n if (dist2 <= 0.000001) {\n identicalPositionJ = j;\n } else if (dist2 > 0.0001 && dist2 < r*r) {\n let dist = sqrt(dist2);\n let overlap = r - dist;\n if (overlap > bestOverlap) {\n bestOverlap = overlap;\n bestJ = j;\n bestN = delta / dist;\n }\n }\n }\n\n // Handle particles at identical positions first\n if (identicalPositionJ != NEIGHBOR_NONE) {\n var other = particles[identicalPositionJ];\n \n // Generate pseudo-random separation direction based on particle indices\n let seed = f32(index * 73 + identicalPositionJ * 37);\n let h = seed * 0.01234567;\n let angle = fract(sin(h) * 43758.5453) * 6.283185307; // 0 to 2*PI\n let sepDist = (other.size + ${particleVar}.size) * 0.51; // Slightly more than touching\n \n let separationX = cos(angle) * sepDist;\n let separationY = sin(angle) * sepDist;\n \n ${particleVar}.position = ${particleVar}.position + vec2<f32>(separationX, separationY);\n }\n\n if (bestJ != NEIGHBOR_NONE) {\n var other = particles[bestJ];\n var n = bestN;\n\n // Pseudo-random helpers based on world position to avoid index-order bias\n let h1 = dot(${particleVar}.position, vec2<f32>(12.9898, 78.233));\n let rand1 = fract(sin(h1) * 43758.5453);\n let h2 = dot(${particleVar}.position, vec2<f32>(93.9898, 67.345));\n let rand2 = fract(sin(h2) * 15731.7431);\n\n // Symmetry breaking: if nearly vertical or horizontal alignment, slightly rotate normal by tiny random angle\n let ax = abs(n.x);\n let ay = abs(n.y);\n if (ax < 0.03 || ay < 0.03) {\n let angle = (rand1 - 0.5) * 0.3;\n let ca = cos(angle);\n let sa = sin(angle);\n let nx = n.x * ca - n.y * sa;\n let ny = n.x * sa + n.y * ca;\n n = normalize(vec2<f32>(nx, ny));\n }\n\n // Position correction (move current particle only). We do not write to 'other'.\n var c1 = n * (bestOverlap * 0.55);\n // Tiny tangential jitter with zero-mean using rand2 to reduce directional bias\n let t = vec2<f32>(-n.y, n.x);\n let jitterAmp = (rand2 - 0.5) * min(bestOverlap * 0.1, 0.5);\n let jitter = t * jitterAmp;\n c1 = c1 + jitter;\n ${particleVar}.position = ${particleVar}.position + c1;\n\n // Impulse-based bounce to conserve kinetic energy along contact normal\n let v1 = ${particleVar}.velocity;\n let v2 = other.velocity;\n let m1 = ${particleVar}.mass;\n let m2 = other.mass;\n let e = ${getUniform(\"restitution\")};\n let relN = dot(v1 - v2, n);\n if (relN < 0.0) {\n // Treat pinned (mass < 0) as infinite mass: zero inverse mass\n let invM1 = select(0.0, 1.0 / max(m1, 1e-6), m1 > 0.0);\n let invM2 = select(0.0, 1.0 / max(m2, 1e-6), m2 > 0.0);\n let invSum = max(invM1 + invM2, 1e-6);\n let j = -(1.0 + e) * relN / invSum;\n let dv = min(j * invM1, 1000.0);\n ${particleVar}.velocity = v1 + n * dv;\n }\n }\n`,\n correct: ({ particleVar, dtVar, prevPosVar, postPosVar }) => `\n // Position-based velocity correction from integration state\n let disp = ${particleVar}.position - ${prevPosVar};\n let disp2 = dot(disp, disp);\n let corr = ${particleVar}.position - ${postPosVar};\n let corr2 = dot(corr, corr);\n if (corr2 > 0.0 && ${dtVar} > 0.0) {\n let corrLenInv = inverseSqrt(corr2);\n let corrDir = corr * corrLenInv;\n let corrVel = corr / ${dtVar};\n let corrVelAlong = dot(corrVel, corrDir);\n let vNBefore = dot(${particleVar}.velocity, corrDir);\n let vNAfterCandidate = vNBefore + corrVelAlong;\n let vNAfter = select(vNBefore, vNAfterCandidate, abs(vNAfterCandidate) < abs(vNBefore));\n ${particleVar}.velocity = ${particleVar}.velocity + corrDir * (vNAfter - vNBefore);\n }\n let v2_total = dot(${particleVar}.velocity, ${particleVar}.velocity);\n if (disp2 < 1e-8 && v2_total < 0.5) {\n ${particleVar}.velocity = vec2<f32>(0.0, 0.0);\n }\n`,\n };\n }\n\n cpu(): CPUDescriptor<CollisionsInputs> {\n // Helper function equivalent to GLSL fract()\n const fract = (x: number) => x - Math.floor(x);\n\n return {\n constrain: ({ particle, getNeighbors, input, maxSize }) => {\n // Find deepest overlap neighbor to reduce scan-order bias\n const searchRadius = particle.size + maxSize + 1;\n const neighbors = getNeighbors(particle.position, searchRadius);\n\n let bestOverlap = 0;\n let bestOther: any = null;\n let bestN = { x: 0, y: 0 };\n let identicalPositionOther: Particle | null = null;\n\n for (const other of neighbors) {\n if (other.id === particle.id) continue;\n // Skip removed neighbors; treat pinned as infinite mass later\n if (other.mass === 0) continue;\n\n const r = other.size + particle.size;\n const deltaX = particle.position.x - other.position.x;\n const deltaY = particle.position.y - other.position.y;\n const dist2 = deltaX * deltaX + deltaY * deltaY;\n\n // Special case: particles at identical positions\n if (dist2 <= 0.000001) {\n identicalPositionOther = other;\n } else if (dist2 > 0.0001 && dist2 < r * r) {\n const dist = Math.sqrt(dist2);\n const overlap = r - dist;\n if (overlap > bestOverlap) {\n bestOverlap = overlap;\n bestOther = other;\n bestN = { x: deltaX / dist, y: deltaY / dist };\n }\n }\n }\n\n // Handle particles at identical positions first\n if (identicalPositionOther) {\n // Generate pseudo-random separation direction based on particle IDs (matching WebGPU logic)\n const seed = particle.id * 73 + identicalPositionOther.id * 37;\n const h = seed * 0.01234567;\n const angle = fract(Math.sin(h) * 43758.5453) * 6.283185307; // 0 to 2*PI\n const sepDist = (identicalPositionOther.size + particle.size) * 0.51; // Slightly more than touching\n\n const separationX = Math.cos(angle) * sepDist;\n const separationY = Math.sin(angle) * sepDist;\n\n particle.position.x += separationX;\n particle.position.y += separationY;\n }\n\n if (bestOther) {\n const n = bestN;\n\n // Pseudo-random helpers based on world position to avoid index-order bias\n const h1 =\n particle.position.x * 12.9898 + particle.position.y * 78.233;\n const rand1 = fract(Math.sin(h1) * 43758.5453);\n const h2 =\n particle.position.x * 93.9898 + particle.position.y * 67.345;\n const rand2 = fract(Math.sin(h2) * 15731.7431);\n\n // Symmetry breaking: if nearly vertical or horizontal alignment, slightly rotate normal\n const ax = Math.abs(n.x);\n const ay = Math.abs(n.y);\n if (ax < 0.03 || ay < 0.03) {\n const angle = (rand1 - 0.5) * 0.3;\n const ca = Math.cos(angle);\n const sa = Math.sin(angle);\n const nx = n.x * ca - n.y * sa;\n const ny = n.x * sa + n.y * ca;\n const len = Math.sqrt(nx * nx + ny * ny);\n if (len > 0) {\n n.x = nx / len;\n n.y = ny / len;\n }\n }\n\n // Position correction (move current particle only)\n const c1x = n.x * (bestOverlap * 0.55);\n const c1y = n.y * (bestOverlap * 0.55);\n\n // Tiny tangential jitter with zero-mean using rand2 to reduce directional bias\n const tx = -n.y;\n const ty = n.x;\n const jitterAmp = (rand2 - 0.5) * Math.min(bestOverlap * 0.1, 0.5);\n const jitterX = tx * jitterAmp;\n const jitterY = ty * jitterAmp;\n\n particle.position.x += c1x + jitterX;\n particle.position.y += c1y + jitterY;\n\n // Impulse-based bounce to conserve kinetic energy along contact normal\n const v1x = particle.velocity.x;\n const v1y = particle.velocity.y;\n const v2x = bestOther.velocity.x;\n const v2y = bestOther.velocity.y;\n const m1 = particle.mass;\n const m2 = bestOther.mass;\n const e = input.restitution;\n const relN = (v1x - v2x) * n.x + (v1y - v2y) * n.y;\n\n if (relN < 0) {\n // Treat pinned (mass < 0) as infinite mass: zero inverse mass\n const invM1 = m1 > 0 ? 1 / Math.max(m1, 1e-6) : 0;\n const invM2 = m2 > 0 ? 1 / Math.max(m2, 1e-6) : 0;\n const invSum = Math.max(invM1 + invM2, 1e-6);\n const j = (-(1 + e) * relN) / invSum;\n const dv = Math.min(j * invM1, 1000);\n particle.velocity.x = v1x + n.x * dv;\n particle.velocity.y = v1y + n.y * dv;\n }\n }\n },\n correct: ({ particle, dt, prevPos, postPos }) => {\n const dispX = particle.position.x - prevPos.x;\n const dispY = particle.position.y - prevPos.y;\n const disp2 = dispX * dispX + dispY * dispY;\n\n const corrX = particle.position.x - postPos.x;\n const corrY = particle.position.y - postPos.y;\n const corr2 = corrX * corrX + corrY * corrY;\n\n if (corr2 > 0.0 && dt > 0.0) {\n const corrLenInv = 1.0 / Math.sqrt(corr2);\n const corrDirX = corrX * corrLenInv;\n const corrDirY = corrY * corrLenInv;\n const corrVelX = corrX / dt;\n const corrVelY = corrY / dt;\n const corrVelAlong = corrVelX * corrDirX + corrVelY * corrDirY;\n const vNBefore =\n particle.velocity.x * corrDirX + particle.velocity.y * corrDirY;\n const vNAfterCandidate = vNBefore + corrVelAlong;\n const vNAfter =\n Math.abs(vNAfterCandidate) < Math.abs(vNBefore)\n ? vNAfterCandidate\n : vNBefore;\n\n particle.velocity.x =\n particle.velocity.x + corrDirX * (vNAfter - vNBefore);\n particle.velocity.y =\n particle.velocity.y + corrDirY * (vNAfter - vNBefore);\n }\n\n const v2_total =\n particle.velocity.x * particle.velocity.x +\n particle.velocity.y * particle.velocity.y;\n if (disp2 < 1e-8 && v2_total < 0.5) {\n particle.velocity.x = 0.0;\n particle.velocity.y = 0.0;\n }\n },\n };\n }\n}\n","/**\n * Fluid (Force Module)\n *\n * SPH-inspired fluid approximation. Two-phase algorithm:\n * - state(): compute particle density and near-density using neighbor kernels\n * - apply(): compute pressure gradient and viscosity forces; clamp max accel\n * Stores per-particle state in shared SIM_STATE via the Program-provided helpers.\n */\nimport {\n Module,\n type WebGPUDescriptor,\n ModuleRole,\n CPUDescriptor,\n DataType,\n} from \"../../module\";\n\nexport const DEFAULT_FLUIDS_INFLUENCE_RADIUS = 100;\nexport const DEFAULT_FLUIDS_TARGET_DENSITY = 1;\nexport const DEFAULT_FLUIDS_PRESSURE_MULTIPLIER = 30;\nexport const DEFAULT_FLUIDS_VISCOSITY = 1;\nexport const DEFAULT_FLUIDS_NEAR_PRESSURE_MULTIPLIER = 50;\nexport const DEFAULT_FLUIDS_NEAR_THRESHOLD = 20;\nexport const DEFAULT_FLUIDS_ENABLE_NEAR_PRESSURE = true;\nexport const DEFAULT_FLUIDS_MAX_ACCELERATION = 75;\n\ntype FluidStateKeys = \"density\" | \"nearDensity\";\n\ntype FluidsInputs = {\n influenceRadius: number;\n targetDensity: number;\n pressureMultiplier: number;\n viscosity: number;\n nearPressureMultiplier: number;\n nearThreshold: number;\n enableNearPressure: number;\n maxAcceleration: number;\n};\n\nexport class Fluids extends Module<\"fluids\", FluidsInputs, FluidStateKeys> {\n readonly name = \"fluids\" as const;\n readonly role = ModuleRole.Force;\n readonly inputs = {\n influenceRadius: DataType.NUMBER,\n targetDensity: DataType.NUMBER,\n pressureMultiplier: DataType.NUMBER,\n viscosity: DataType.NUMBER,\n nearPressureMultiplier: DataType.NUMBER,\n nearThreshold: DataType.NUMBER,\n enableNearPressure: DataType.NUMBER,\n maxAcceleration: DataType.NUMBER,\n } as const;\n\n constructor(opts?: {\n enabled?: boolean;\n influenceRadius?: number;\n targetDensity?: number;\n pressureMultiplier?: number;\n viscosity?: number;\n nearPressureMultiplier?: number;\n nearThreshold?: number;\n enableNearPressure?: boolean;\n maxAcceleration?: number;\n }) {\n super();\n this.write({\n influenceRadius: opts?.influenceRadius ?? DEFAULT_FLUIDS_INFLUENCE_RADIUS,\n targetDensity: opts?.targetDensity ?? DEFAULT_FLUIDS_TARGET_DENSITY,\n pressureMultiplier:\n opts?.pressureMultiplier ?? DEFAULT_FLUIDS_PRESSURE_MULTIPLIER,\n viscosity: opts?.viscosity ?? DEFAULT_FLUIDS_VISCOSITY,\n nearPressureMultiplier:\n opts?.nearPressureMultiplier ?? DEFAULT_FLUIDS_NEAR_PRESSURE_MULTIPLIER,\n nearThreshold: opts?.nearThreshold ?? DEFAULT_FLUIDS_NEAR_THRESHOLD,\n enableNearPressure:\n opts?.enableNearPressure ?? DEFAULT_FLUIDS_ENABLE_NEAR_PRESSURE ? 1 : 0,\n maxAcceleration: opts?.maxAcceleration ?? DEFAULT_FLUIDS_MAX_ACCELERATION,\n });\n if (opts?.enabled !== undefined) {\n this.setEnabled(!!opts.enabled);\n }\n }\n\n setInfluenceRadius(v: number): void {\n this.write({ influenceRadius: v });\n }\n setTargetDensity(v: number): void {\n this.write({ targetDensity: v });\n }\n setPressureMultiplier(v: number): void {\n this.write({ pressureMultiplier: v });\n }\n setViscosity(v: number): void {\n this.write({ viscosity: v });\n }\n setNearPressureMultiplier(v: number): void {\n this.write({ nearPressureMultiplier: v });\n }\n setNearThreshold(v: number): void {\n this.write({ nearThreshold: v });\n }\n setEnableNearPressure(enabled: boolean): void {\n this.write({ enableNearPressure: enabled ? 1 : 0 });\n }\n\n setMaxAcceleration(v: number): void {\n this.write({ maxAcceleration: v });\n }\n\n getInfluenceRadius(): number {\n return this.readValue(\"influenceRadius\");\n }\n getTargetDensity(): number {\n return this.readValue(\"targetDensity\");\n }\n getPressureMultiplier(): number {\n return this.readValue(\"pressureMultiplier\");\n }\n getViscosity(): number {\n return this.readValue(\"viscosity\");\n }\n getNearPressureMultiplier(): number {\n return this.readValue(\"nearPressureMultiplier\");\n }\n getNearThreshold(): number {\n return this.readValue(\"nearThreshold\");\n }\n getEnableNearPressure(): number {\n return this.readValue(\"enableNearPressure\");\n }\n getMaxAcceleration(): number {\n return this.readValue(\"maxAcceleration\");\n }\n\n webgpu(): WebGPUDescriptor<FluidsInputs, FluidStateKeys> {\n return {\n states: [\"density\", \"nearDensity\"],\n // State pass: precompute density and near-density per particle\n state: ({ particleVar, dtVar, getUniform, setState }) => `{\n // Predict current particle position for this frame (approximate)\n let rad = ${getUniform(\"influenceRadius\")};\n let posPred = ${particleVar}.position + ${particleVar}.velocity * (${dtVar});\n var density: f32 = 0.0;\n var nearDensity: f32 = 0.0;\n\n // Precompute radius powers for kernels\n let r2 = rad * rad;\n let r4 = r2 * r2;\n let r6 = r4 * r2;\n let r8 = r4 * r4;\n\n // Iterate neighbors using the spatial grid\n var it = neighbor_iter_init(posPred, rad);\n loop {\n let j = neighbor_iter_next(&it, index);\n if (j == NEIGHBOR_NONE) { break; }\n let other = particles[j];\n // Skip removed or pinned neighbors\n if (other.mass <= 0.0) { continue; }\n\n let d = posPred - other.position;\n let dist2 = dot(d, d);\n if (dist2 <= 0.0) { continue; }\n let dist = sqrt(dist2);\n let factor = max(rad - dist, 0.0);\n if (factor <= 0.0) { continue; }\n\n // Density kernel (CPU: (factor^2) / (pi/6 * r^4))\n let kDensity = (factor * factor) / ((3.14159265 / 6.0) * r4);\n density = density + kDensity * 1000.0 * other.mass;\n\n // Near-density kernel (CPU: (factor^4) / (pi/15 * r^6))\n if (${getUniform(\"enableNearPressure\")} != 0.0) {\n let f2 = factor * factor;\n let kNear = (f2 * f2) / ((3.14159265 / 15.0) * r6);\n nearDensity = nearDensity + kNear * 1000.0 * other.mass;\n }\n }\n\n // Store results in shared SIM_STATE for use in apply pass\n ${setState(\"density\", \"density\")};\n ${setState(\"nearDensity\", \"nearDensity\")};\n}`,\n // Apply pass: compute pressure and viscosity forces using precomputed densities\n apply: ({ particleVar, getUniform, getState }) => `{\n let rad = ${getUniform(\"influenceRadius\")};\n let targetDensity = ${getUniform(\"targetDensity\")};\n let pressureMul = ${getUniform(\"pressureMultiplier\")};\n let visc = ${getUniform(\"viscosity\")};\n let nearMul = ${getUniform(\"nearPressureMultiplier\")};\n let nearThreshold = ${getUniform(\"nearThreshold\")};\n let useNear = ${getUniform(\"enableNearPressure\")};\n\n let myDensity = max(${getState(\"density\")}, 1e-6);\n\n // Precompute radius powers for kernels\n let r2 = rad * rad;\n let r4 = r2 * r2;\n let r6 = r4 * r2;\n let r8 = r4 * r4;\n\n // Pressure gradient accumulation\n var gradSum: vec2<f32> = vec2<f32>(0.0, 0.0);\n var it1 = neighbor_iter_init(${particleVar}.position, rad);\n loop {\n let j = neighbor_iter_next(&it1, index);\n if (j == NEIGHBOR_NONE) { break; }\n let other = particles[j];\n // Skip removed or pinned neighbors\n if (other.mass <= 0.0) { continue; }\n let delta = other.position - ${particleVar}.position;\n let dist2 = dot(delta, delta);\n if (dist2 <= 0.0) { continue; }\n let dist = sqrt(dist2);\n if (dist <= 0.0 || dist >= rad) { continue; }\n let dir = delta / dist;\n\n // Derivative kernel (CPU: scale * (dist - rad), scale = (-12/pi)/r^4)\n let scale = (-12.0 / 3.14159265) / r4;\n let slope = (dist - rad) * scale;\n\n // Neighbor pressures from precomputed densities\n let dN = max(${getState(\"density\", \"j\")}, 1e-6);\n let nearN = select(0.0, ${getState(\"nearDensity\", \"j\")}, useNear != 0.0);\n let densityDiff = dN - targetDensity;\n let pressure = densityDiff * pressureMul;\n let nearPressure = nearN * nearMul;\n let effectivePressure = select(pressure, nearPressure, dist < nearThreshold);\n\n // Gradient contribution\n gradSum = gradSum + (dir * (effectivePressure * slope) / dN);\n }\n // Pressure force is negative gradient\n var pressureForce = -gradSum;\n\n // Viscosity accumulation\n var viscosityForce: vec2<f32> = vec2<f32>(0.0, 0.0);\n if (visc != 0.0) {\n var it2 = neighbor_iter_init(${particleVar}.position, rad);\n loop {\n let j = neighbor_iter_next(&it2, index);\n if (j == NEIGHBOR_NONE) { break; }\n let other = particles[j];\n // Skip removed or pinned neighbors\n if (other.mass <= 0.0) { continue; }\n let delta = other.position - ${particleVar}.position;\n let dist2 = dot(delta, delta);\n if (dist2 <= 0.0) { continue; }\n let dist = sqrt(dist2);\n if (dist >= rad) { continue; }\n // Viscosity kernel (CPU: (max(0, r^2 - d^2)^3) / (pi/4 * r^8))\n let val = max(0.0, r2 - dist2);\n let kVisc = (val * val * val) / ((3.14159265 / 4.0) * r8);\n viscosityForce = viscosityForce + (other.velocity - ${particleVar}.velocity) * kVisc;\n }\n viscosityForce = viscosityForce * visc;\n }\n\n // Convert to acceleration-like effect: a = F / density\n var force = (pressureForce / myDensity) * 1000000.0;\n if (visc != 0.0) {\n force = force + (viscosityForce * 1000.0) / myDensity;\n }\n\n // Clamp force magnitude to avoid instabilities (tunable)\n let maxLen = ${getUniform(\"maxAcceleration\")};\n let f2 = dot(force, force);\n if (f2 > maxLen * maxLen) {\n let fLen = sqrt(f2);\n force = force * (maxLen / fLen);\n }\n\n // Apply directly to velocity (CPU mirrors this behavior)\n ${particleVar}.velocity = ${particleVar}.velocity + force;\n}`,\n };\n }\n\n cpu(): CPUDescriptor<FluidsInputs, FluidStateKeys> {\n return {\n states: [\"density\", \"nearDensity\"],\n\n // State pass: precompute density and near-density per particle\n state: ({ particle, getNeighbors, dt, setState }) => {\n // Get fluid parameters\n const rad = this.readValue(\"influenceRadius\");\n const enableNearPressure = this.readValue(\"enableNearPressure\");\n\n // Predict current particle position for this frame (approximate)\n const posPredX = particle.position.x + particle.velocity.x * dt;\n const posPredY = particle.position.y + particle.velocity.y * dt;\n let density = 0.0;\n let nearDensity = 0.0;\n\n // Precompute radius powers for kernels\n const r2 = rad * rad;\n const r4 = r2 * r2;\n const r6 = r4 * r2;\n\n // Get neighbors using predicted position\n const neighbors = getNeighbors({ x: posPredX, y: posPredY }, rad);\n\n for (const other of neighbors) {\n if (other.id === particle.id) continue; // Skip self\n // Skip removed or pinned neighbors\n if (other.mass <= 0) continue;\n\n const dX = posPredX - other.position.x;\n const dY = posPredY - other.position.y;\n const dist2 = dX * dX + dY * dY;\n\n if (dist2 <= 0.0) continue;\n\n const dist = Math.sqrt(dist2);\n const factor = Math.max(rad - dist, 0.0);\n if (factor <= 0.0) continue;\n\n // Density kernel: (factor^2) / (pi/6 * r^4)\n const kDensity = (factor * factor) / ((Math.PI / 6.0) * r4);\n density += kDensity * 1000.0 * other.mass;\n\n // Near-density kernel: (factor^4) / (pi/15 * r^6)\n if (enableNearPressure !== 0.0) {\n const f2 = factor * factor;\n const kNear = (f2 * f2) / ((Math.PI / 15.0) * r6);\n nearDensity += kNear * 1000.0 * other.mass;\n }\n }\n\n // Store results in shared state for use in apply pass\n setState(\"density\", density);\n setState(\"nearDensity\", nearDensity);\n },\n\n // Apply pass: compute pressure and viscosity forces using precomputed densities\n apply: ({ particle, getNeighbors, getState }) => {\n // Get fluid parameters\n const rad = this.readValue(\"influenceRadius\");\n const targetDensity = this.readValue(\"targetDensity\");\n const pressureMul = this.readValue(\"pressureMultiplier\");\n const visc = this.readValue(\"viscosity\");\n const nearMul = this.readValue(\"nearPressureMultiplier\");\n const nearThreshold = this.readValue(\"nearThreshold\");\n const useNear = this.readValue(\"enableNearPressure\");\n const maxAccel = this.readValue(\"maxAcceleration\");\n\n const myDensity = Math.max(getState(\"density\"), 1e-6);\n\n // Precompute radius powers for kernels\n const r2 = rad * rad;\n const r4 = r2 * r2;\n const r8 = r4 * r4;\n\n // Pressure gradient accumulation\n let gradSumX = 0.0;\n let gradSumY = 0.0;\n\n const neighbors = getNeighbors(particle.position, rad);\n\n for (const other of neighbors) {\n if (other.id === particle.id) continue; // Skip self\n // Skip removed or pinned neighbors\n if (other.mass <= 0) continue;\n\n const deltaX = other.position.x - particle.position.x;\n const deltaY = other.position.y - particle.position.y;\n const dist2 = deltaX * deltaX + deltaY * deltaY;\n\n if (dist2 <= 0.0) continue;\n\n const dist = Math.sqrt(dist2);\n if (dist <= 0.0 || dist >= rad) continue;\n\n const dirX = deltaX / dist;\n const dirY = deltaY / dist;\n\n // Derivative kernel: scale * (dist - rad), scale = (-12/pi)/r^4\n const scale = -12.0 / Math.PI / r4;\n const slope = (dist - rad) * scale;\n\n // Neighbor pressures from precomputed densities\n const dN = Math.max(getState(\"density\", other.id), 1e-6);\n const nearN =\n useNear !== 0.0 ? getState(\"nearDensity\", other.id) : 0.0;\n const densityDiff = dN - targetDensity;\n const pressure = densityDiff * pressureMul;\n const nearPressure = nearN * nearMul;\n const effectivePressure =\n dist < nearThreshold ? nearPressure : pressure;\n\n // Gradient contribution\n const gradContribX = (dirX * (effectivePressure * slope)) / dN;\n const gradContribY = (dirY * (effectivePressure * slope)) / dN;\n gradSumX += gradContribX;\n gradSumY += gradContribY;\n }\n\n // Pressure force is negative gradient\n let pressureForceX = -gradSumX;\n let pressureForceY = -gradSumY;\n\n // Viscosity accumulation\n let viscosityForceX = 0.0;\n let viscosityForceY = 0.0;\n\n if (visc !== 0.0) {\n for (const other of neighbors) {\n if (other.id === particle.id) continue; // Skip self\n // Skip removed or pinned neighbors\n if (other.mass <= 0) continue;\n\n const deltaX = other.position.x - particle.position.x;\n const deltaY = other.position.y - particle.position.y;\n const dist2 = deltaX * deltaX + deltaY * deltaY;\n\n if (dist2 <= 0.0) continue;\n\n const dist = Math.sqrt(dist2);\n if (dist >= rad) continue;\n\n // Viscosity kernel: (max(0, r^2 - d^2)^3) / (pi/4 * r^8)\n const val = Math.max(0.0, r2 - dist2);\n const kVisc = (val * val * val) / ((Math.PI / 4.0) * r8);\n\n viscosityForceX += (other.velocity.x - particle.velocity.x) * kVisc;\n viscosityForceY += (other.velocity.y - particle.velocity.y) * kVisc;\n }\n\n viscosityForceX *= visc;\n viscosityForceY *= visc;\n }\n\n // Convert to acceleration-like effect: a = F / density\n let forceX = (pressureForceX / myDensity) * 1000000.0;\n let forceY = (pressureForceY / myDensity) * 1000000.0;\n\n if (visc !== 0.0) {\n forceX += (viscosityForceX * 1000.0) / myDensity;\n forceY += (viscosityForceY * 1000.0) / myDensity;\n }\n\n // Clamp force magnitude to avoid instabilities\n const f2 = forceX * forceX + forceY * forceY;\n if (f2 > maxAccel * maxAccel) {\n const fLen = Math.sqrt(f2);\n forceX = forceX * (maxAccel / fLen);\n forceY = forceY * (maxAccel / fLen);\n }\n\n // Apply directly to velocity (matching WebGPU behavior)\n particle.velocity.x += forceX;\n particle.velocity.y += forceY;\n },\n };\n }\n}\n","/**\n * Behavior (Force Module)\n *\n * Boids-like steering behaviors: separation, alignment, cohesion, chase/avoid, wander.\n * Uses the spatial grid neighbor iterator to accumulate local influences and writes\n * into particle acceleration (no extra state). Tuned to avoid heavy branching and\n * zero-velocity edge cases.\n */\nimport {\n Module,\n type WebGPUDescriptor,\n ModuleRole,\n CPUDescriptor,\n DataType,\n} from \"../../module\";\n\nexport const DEFAULT_BEHAVIOR_WANDER = 20;\nexport const DEFAULT_BEHAVIOR_COHESION = 1.5;\nexport const DEFAULT_BEHAVIOR_ALIGNMENT = 1.5;\nexport const DEFAULT_BEHAVIOR_REPULSION = 2;\nexport const DEFAULT_BEHAVIOR_CHASE = 0;\nexport const DEFAULT_BEHAVIOR_AVOID = 0;\nexport const DEFAULT_BEHAVIOR_SEPARATION = 10;\nexport const DEFAULT_BEHAVIOR_VIEW_RADIUS = 100;\nexport const DEFAULT_BEHAVIOR_VIEW_ANGLE = 1.5 * Math.PI;\n\ntype BehaviorInputs = {\n wander: number;\n cohesion: number;\n alignment: number;\n repulsion: number;\n chase: number;\n avoid: number;\n separation: number;\n viewRadius: number;\n viewAngle: number;\n};\n\nexport class Behavior extends Module<\"behavior\", BehaviorInputs> {\n readonly name = \"behavior\" as const;\n readonly role = ModuleRole.Force;\n readonly inputs = {\n wander: DataType.NUMBER,\n cohesion: DataType.NUMBER,\n alignment: DataType.NUMBER,\n repulsion: DataType.NUMBER,\n chase: DataType.NUMBER,\n avoid: DataType.NUMBER,\n separation: DataType.NUMBER,\n viewRadius: DataType.NUMBER,\n viewAngle: DataType.NUMBER,\n } as const;\n\n constructor(opts?: {\n wander?: number;\n cohesion?: number;\n alignment?: number;\n repulsion?: number;\n chase?: number;\n avoid?: number;\n separation?: number;\n viewRadius?: number;\n viewAngle?: number;\n enabled?: boolean;\n }) {\n super();\n this.write({\n wander: opts?.wander ?? DEFAULT_BEHAVIOR_WANDER,\n cohesion: opts?.cohesion ?? DEFAULT_BEHAVIOR_COHESION,\n alignment: opts?.alignment ?? DEFAULT_BEHAVIOR_ALIGNMENT,\n repulsion: opts?.repulsion ?? DEFAULT_BEHAVIOR_REPULSION,\n chase: opts?.chase ?? DEFAULT_BEHAVIOR_CHASE,\n avoid: opts?.avoid ?? DEFAULT_BEHAVIOR_AVOID,\n separation: opts?.separation ?? DEFAULT_BEHAVIOR_SEPARATION,\n viewRadius: opts?.viewRadius ?? DEFAULT_BEHAVIOR_VIEW_RADIUS,\n viewAngle: opts?.viewAngle ?? DEFAULT_BEHAVIOR_VIEW_ANGLE,\n });\n if (opts?.enabled !== undefined) this.setEnabled(!!opts.enabled);\n }\n\n setWander(v: number): void {\n this.write({ wander: v });\n }\n setCohesion(v: number): void {\n this.write({ cohesion: v });\n }\n setAlignment(v: number): void {\n this.write({ alignment: v });\n }\n setRepulsion(v: number): void {\n this.write({ repulsion: v });\n }\n setChase(v: number): void {\n this.write({ chase: v });\n }\n setAvoid(v: number): void {\n this.write({ avoid: v });\n }\n setSeparation(v: number): void {\n this.write({ separation: v });\n }\n setViewRadius(v: number): void {\n this.write({ viewRadius: v });\n }\n setViewAngle(v: number): void {\n this.write({ viewAngle: v });\n }\n\n getWander(): number {\n return this.readValue(\"wander\");\n }\n getCohesion(): number {\n return this.readValue(\"cohesion\");\n }\n getAlignment(): number {\n return this.readValue(\"alignment\");\n }\n getRepulsion(): number {\n return this.readValue(\"repulsion\");\n }\n getChase(): number {\n return this.readValue(\"chase\");\n }\n getAvoid(): number {\n return this.readValue(\"avoid\");\n }\n getSeparation(): number {\n return this.readValue(\"separation\");\n }\n getViewRadius(): number {\n return this.readValue(\"viewRadius\");\n }\n getViewAngle(): number {\n return this.readValue(\"viewAngle\");\n }\n\n webgpu(): WebGPUDescriptor<BehaviorInputs> {\n return {\n apply: ({ particleVar, getUniform }) => `\n // Neighbor loop within view radius\n let viewR = ${getUniform(\"viewRadius\")};\n let sepRange = ${getUniform(\"separation\")};\n let wSep = ${getUniform(\"repulsion\")};\n let wAli = ${getUniform(\"alignment\")};\n let wCoh = ${getUniform(\"cohesion\")};\n let wChase = ${getUniform(\"chase\")};\n let wAvoid = ${getUniform(\"avoid\")};\n let wWander = ${getUniform(\"wander\")};\n let halfAngle = ${getUniform(\"viewAngle\")} * 0.5;\n let cosHalf = cos(halfAngle);\n\n // Accumulators\n var sep: vec2<f32> = vec2<f32>(0.0, 0.0);\n var ali: vec2<f32> = vec2<f32>(0.0, 0.0);\n var cohPos: vec2<f32> = vec2<f32>(0.0, 0.0);\n var cohCount: f32 = 0.0;\n var aliCount: f32 = 0.0;\n\n // Normalize particle velocity for FOV; if zero, skip FOV filtering\n let vMag2 = dot(${particleVar}.velocity, ${particleVar}.velocity);\n let hasVel = vMag2 > 1e-6;\n let vNorm = select(vec2<f32>(1.0, 0.0), normalize(${particleVar}.velocity), hasVel);\n\n var it = neighbor_iter_init(${particleVar}.position, viewR);\n loop {\n let j = neighbor_iter_next(&it, index);\n if (j == NEIGHBOR_NONE) { break; }\n let other = particles[j];\n let toOther = other.position - ${particleVar}.position;\n let dist2 = dot(toOther, toOther);\n if (dist2 <= 0.0) { continue; }\n let dist = sqrt(dist2);\n if (dist >= viewR) { continue; }\n\n // Field of view check\n if (hasVel) {\n let dir = toOther / dist;\n let d = dot(vNorm, dir);\n if (d < cosHalf) { continue; }\n }\n\n // Separation (closer than sepRange)\n if (dist < sepRange && wSep > 0.0) {\n let away = (${particleVar}.position - other.position) / max(dist, 1e-3);\n sep = sep + away;\n }\n\n // Alignment\n if (wAli > 0.0) {\n ali = ali + other.velocity;\n aliCount = aliCount + 1.0;\n }\n\n // Cohesion\n if (wCoh > 0.0) {\n cohPos = cohPos + other.position;\n cohCount = cohCount + 1.0;\n }\n\n // Chase / Avoid based on mass relation\n if (wChase > 0.0 && ${particleVar}.mass > other.mass) {\n let massDelta = (${particleVar}.mass - other.mass) / max(${particleVar}.mass, 1e-6);\n let seek = (toOther / max(dist, 1e-3)) * (massDelta * ${particleVar}.mass);\n // accumulate into cohesion-like vector\n cohPos = cohPos + (${particleVar}.position + seek);\n cohCount = cohCount + 1.0;\n }\n if (wAvoid > 0.0 && ${particleVar}.mass < other.mass && dist < viewR * 0.5) {\n let massDelta = (other.mass - ${particleVar}.mass) / max(other.mass, 1e-6);\n var rep = (${particleVar}.position - other.position);\n let repLen = length(rep);\n if (repLen > 0.0) {\n rep = normalize(rep) * 100000.0 * massDelta * (1.0 / max(repLen, 1.0));\n sep = sep + rep;\n }\n }\n }\n\n // Finalize alignment: steer toward avg neighbor velocity\n if (aliCount > 0.0) {\n var avgV = ali / aliCount;\n if (length(avgV) > 0.0) {\n avgV = normalize(avgV) * 1000.0;\n let steerAli = avgV - ${particleVar}.velocity;\n ${particleVar}.acceleration = ${particleVar}.acceleration + steerAli * wAli;\n }\n }\n\n // Finalize cohesion: seek centroid\n if (cohCount > 0.0) {\n let center = cohPos / cohCount;\n var seek = center - ${particleVar}.position;\n if (length(seek) > 0.0) {\n seek = normalize(seek) * 1000.0 - ${particleVar}.velocity;\n ${particleVar}.acceleration = ${particleVar}.acceleration + seek * wCoh;\n }\n }\n\n // Apply separation\n if (length(sep) > 0.0) {\n sep = normalize(sep) * 1000.0 - ${particleVar}.velocity;\n ${particleVar}.acceleration = ${particleVar}.acceleration + sep * wSep;\n }\n\n // Simple wander: small perturbation perpendicular to velocity (no state)\n if (wWander > 0.0) {\n let vel = ${particleVar}.velocity;\n let l = length(vel);\n let dir = select(vec2<f32>(1.0, 0.0), vel / max(l, 1e-6), l > 1e-6);\n let perp = vec2<f32>(-dir.y, dir.x);\n // pseudo-random based on position\n let h = dot(${particleVar}.position, vec2<f32>(12.9898, 78.233));\n let r = fract(sin(h) * 43758.5453) - 0.5;\n let jitter = perp * (r * 200.0);\n ${particleVar}.acceleration = ${particleVar}.acceleration + jitter * wWander;\n }\n`,\n };\n }\n\n cpu(): CPUDescriptor<BehaviorInputs> {\n return {\n apply: ({ particle, getNeighbors }) => {\n // Get behavior parameters\n const viewR = this.readValue(\"viewRadius\");\n const sepRange = this.readValue(\"separation\");\n const wSep = this.readValue(\"repulsion\");\n const wAli = this.readValue(\"alignment\");\n const wCoh = this.readValue(\"cohesion\");\n const wChase = this.readValue(\"chase\");\n const wAvoid = this.readValue(\"avoid\");\n const wWander = this.readValue(\"wander\");\n const halfAngle = this.readValue(\"viewAngle\") * 0.5;\n const cosHalf = Math.cos(halfAngle);\n\n // Accumulators\n let sepX = 0,\n sepY = 0;\n let aliX = 0,\n aliY = 0;\n let cohPosX = 0,\n cohPosY = 0;\n let cohCount = 0;\n let aliCount = 0;\n\n // Normalize particle velocity for FOV; if zero, skip FOV filtering\n const vMag2 =\n particle.velocity.x * particle.velocity.x +\n particle.velocity.y * particle.velocity.y;\n const hasVel = vMag2 > 1e-6;\n let vNormX = 1,\n vNormY = 0;\n if (hasVel) {\n const vMag = Math.sqrt(vMag2);\n vNormX = particle.velocity.x / vMag;\n vNormY = particle.velocity.y / vMag;\n }\n\n // Get neighbors within view radius using spatial grid\n const neighbors = getNeighbors(particle.position, viewR);\n\n for (const other of neighbors) {\n if (other.id === particle.id) continue; // Skip self\n\n const toOtherX = other.position.x - particle.position.x;\n const toOtherY = other.position.y - particle.position.y;\n const dist2 = toOtherX * toOtherX + toOtherY * toOtherY;\n\n if (dist2 <= 0.0) continue;\n\n const dist = Math.sqrt(dist2);\n if (dist >= viewR) continue;\n\n // Field of view check\n if (hasVel) {\n const dirX = toOtherX / dist;\n const dirY = toOtherY / dist;\n const dotProduct = vNormX * dirX + vNormY * dirY;\n if (dotProduct < cosHalf) continue;\n }\n\n // Separation (closer than sepRange)\n if (dist < sepRange && wSep > 0.0) {\n const awayX =\n (particle.position.x - other.position.x) / Math.max(dist, 1e-3);\n const awayY =\n (particle.position.y - other.position.y) / Math.max(dist, 1e-3);\n sepX += awayX;\n sepY += awayY;\n }\n\n // Alignment\n if (wAli > 0.0) {\n aliX += other.velocity.x;\n aliY += other.velocity.y;\n aliCount += 1.0;\n }\n\n // Cohesion\n if (wCoh > 0.0) {\n cohPosX += other.position.x;\n cohPosY += other.position.y;\n cohCount += 1.0;\n }\n\n // Chase / Avoid based on mass relation\n if (wChase > 0.0 && particle.mass > other.mass) {\n const massDelta =\n (particle.mass - other.mass) / Math.max(particle.mass, 1e-6);\n const seekX =\n (toOtherX / Math.max(dist, 1e-3)) * (massDelta * particle.mass);\n const seekY =\n (toOtherY / Math.max(dist, 1e-3)) * (massDelta * particle.mass);\n // accumulate into cohesion-like vector\n cohPosX += particle.position.x + seekX;\n cohPosY += particle.position.y + seekY;\n cohCount += 1.0;\n }\n\n if (\n wAvoid > 0.0 &&\n particle.mass < other.mass &&\n dist < viewR * 0.5\n ) {\n const massDelta =\n (other.mass - particle.mass) / Math.max(other.mass, 1e-6);\n let repX = particle.position.x - other.position.x;\n let repY = particle.position.y - other.position.y;\n const repLen = Math.sqrt(repX * repX + repY * repY);\n if (repLen > 0.0) {\n repX =\n (repX / repLen) *\n 100000.0 *\n massDelta *\n (1.0 / Math.max(repLen, 1.0));\n repY =\n (repY / repLen) *\n 100000.0 *\n massDelta *\n (1.0 / Math.max(repLen, 1.0));\n sepX += repX;\n sepY += repY;\n }\n }\n }\n\n // Finalize alignment: steer toward avg neighbor velocity\n if (aliCount > 0.0) {\n let avgVX = aliX / aliCount;\n let avgVY = aliY / aliCount;\n const avgVLen = Math.sqrt(avgVX * avgVX + avgVY * avgVY);\n if (avgVLen > 0.0) {\n avgVX = (avgVX / avgVLen) * 1000.0;\n avgVY = (avgVY / avgVLen) * 1000.0;\n const steerAliX = avgVX - particle.velocity.x;\n const steerAliY = avgVY - particle.velocity.y;\n particle.acceleration.x += steerAliX * wAli;\n particle.acceleration.y += steerAliY * wAli;\n }\n }\n\n // Finalize cohesion: seek centroid\n if (cohCount > 0.0) {\n const centerX = cohPosX / cohCount;\n const centerY = cohPosY / cohCount;\n let seekX = centerX - particle.position.x;\n let seekY = centerY - particle.position.y;\n const seekLen = Math.sqrt(seekX * seekX + seekY * seekY);\n if (seekLen > 0.0) {\n seekX = (seekX / seekLen) * 1000.0 - particle.velocity.x;\n seekY = (seekY / seekLen) * 1000.0 - particle.velocity.y;\n particle.acceleration.x += seekX * wCoh;\n particle.acceleration.y += seekY * wCoh;\n }\n }\n\n // Apply separation\n const sepLen = Math.sqrt(sepX * sepX + sepY * sepY);\n if (sepLen > 0.0) {\n sepX = (sepX / sepLen) * 1000.0 - particle.velocity.x;\n sepY = (sepY / sepLen) * 1000.0 - particle.velocity.y;\n particle.acceleration.x += sepX * wSep;\n particle.acceleration.y += sepY * wSep;\n }\n\n // Simple wander: small perturbation perpendicular to velocity (no state)\n if (wWander > 0.0) {\n const velX = particle.velocity.x;\n const velY = particle.velocity.y;\n const velLen = Math.sqrt(velX * velX + velY * velY);\n\n let dirX = 1.0,\n dirY = 0.0;\n if (velLen > 1e-6) {\n dirX = velX / velLen;\n dirY = velY / velLen;\n }\n\n const perpX = -dirY;\n const perpY = dirX;\n\n // pseudo-random based on position (matching WebGPU logic)\n const h =\n particle.position.x * 12.9898 + particle.position.y * 78.233;\n const fract = (x: number) => x - Math.floor(x);\n const r = fract(Math.sin(h) * 43758.5453) - 0.5;\n const jitterX = perpX * (r * 200.0);\n const jitterY = perpY * (r * 200.0);\n\n particle.acceleration.x += jitterX * wWander;\n particle.acceleration.y += jitterY * wWander;\n }\n },\n };\n }\n}\n","/**\n * Sensors (Force/Behavior Module)\n *\n * Samples the scene texture around two forward-biased sensor points (left/right)\n * to derive simple follow/flee steering decisions. Supports color-aware behaviors\n * (same/different) and intensity-only mode. Writes directly to velocity for snappy\n * reactions (mirrors CPU behavior path).\n */\nimport {\n Module,\n type WebGPUDescriptor,\n ModuleRole,\n CPUDescriptor,\n DataType,\n} from \"../../module\";\n\nexport type SensorBehavior = \"any\" | \"same\" | \"different\" | \"none\";\n\nexport const DEFAULT_SENSORS_SENSOR_DISTANCE = 30;\nexport const DEFAULT_SENSORS_SENSOR_ANGLE = Math.PI / 6; // 30 degrees\nexport const DEFAULT_SENSORS_SENSOR_RADIUS = 3;\nexport const DEFAULT_SENSORS_SENSOR_THRESHOLD = 0.1;\nexport const DEFAULT_SENSORS_SENSOR_STRENGTH = 1000;\nexport const DEFAULT_SENSORS_COLOR_SIMILARITY_THRESHOLD = 0.4;\nexport const DEFAULT_SENSORS_FOLLOW_BEHAVIOR: SensorBehavior = \"any\";\nexport const DEFAULT_SENSORS_FLEE_BEHAVIOR: SensorBehavior = \"none\";\nexport const DEFAULT_SENSORS_FLEE_ANGLE = Math.PI / 2;\n\ntype SensorsInputs = {\n sensorDistance: number;\n sensorAngle: number;\n sensorRadius: number;\n sensorThreshold: number;\n sensorStrength: number;\n colorSimilarityThreshold: number;\n followBehavior: number;\n fleeBehavior: number;\n fleeAngle: number;\n};\n\nexport class Sensors extends Module<\"sensors\", SensorsInputs> {\n readonly name = \"sensors\" as const;\n readonly role = ModuleRole.Force;\n readonly inputs = {\n sensorDistance: DataType.NUMBER,\n sensorAngle: DataType.NUMBER,\n sensorRadius: DataType.NUMBER,\n sensorThreshold: DataType.NUMBER,\n sensorStrength: DataType.NUMBER,\n colorSimilarityThreshold: DataType.NUMBER,\n followBehavior: DataType.NUMBER,\n fleeBehavior: DataType.NUMBER,\n fleeAngle: DataType.NUMBER,\n } as const;\n\n constructor(opts?: {\n enabled?: boolean;\n sensorDistance?: number;\n sensorAngle?: number;\n sensorRadius?: number;\n sensorThreshold?: number;\n sensorStrength?: number;\n colorSimilarityThreshold?: number;\n followBehavior?: SensorBehavior;\n fleeBehavior?: SensorBehavior;\n fleeAngle?: number;\n }) {\n super();\n this.write({\n sensorDistance: opts?.sensorDistance ?? DEFAULT_SENSORS_SENSOR_DISTANCE,\n sensorAngle: opts?.sensorAngle ?? DEFAULT_SENSORS_SENSOR_ANGLE,\n sensorRadius: opts?.sensorRadius ?? DEFAULT_SENSORS_SENSOR_RADIUS,\n sensorThreshold:\n opts?.sensorThreshold ?? DEFAULT_SENSORS_SENSOR_THRESHOLD,\n sensorStrength: opts?.sensorStrength ?? DEFAULT_SENSORS_SENSOR_STRENGTH,\n colorSimilarityThreshold:\n opts?.colorSimilarityThreshold ??\n DEFAULT_SENSORS_COLOR_SIMILARITY_THRESHOLD,\n followBehavior: this.behaviorToUniform(\n opts?.followBehavior ?? DEFAULT_SENSORS_FOLLOW_BEHAVIOR\n ),\n fleeBehavior: this.behaviorToUniform(\n opts?.fleeBehavior ?? DEFAULT_SENSORS_FLEE_BEHAVIOR\n ),\n fleeAngle: opts?.fleeAngle ?? DEFAULT_SENSORS_FLEE_ANGLE,\n });\n\n if (opts?.enabled !== undefined) {\n this.setEnabled(!!opts.enabled);\n }\n }\n\n private behaviorToUniform(behavior: SensorBehavior): number {\n switch (behavior) {\n case \"any\":\n return 0;\n case \"same\":\n return 1;\n case \"different\":\n return 2;\n case \"none\":\n return 3;\n default:\n return 3;\n }\n }\n\n setSensorDistance(value: number): void {\n this.write({ sensorDistance: value });\n }\n\n setSensorAngle(value: number): void {\n this.write({ sensorAngle: value });\n }\n\n setSensorRadius(value: number): void {\n this.write({ sensorRadius: value });\n }\n\n setSensorThreshold(value: number): void {\n this.write({ sensorThreshold: value });\n }\n\n setSensorStrength(value: number): void {\n this.write({ sensorStrength: value });\n }\n\n setColorSimilarityThreshold(value: number): void {\n this.write({ colorSimilarityThreshold: value });\n }\n\n setFollowBehavior(behavior: SensorBehavior): void {\n this.write({ followBehavior: this.behaviorToUniform(behavior) });\n }\n\n setFleeBehavior(behavior: SensorBehavior): void {\n this.write({ fleeBehavior: this.behaviorToUniform(behavior) });\n }\n\n setFleeAngle(value: number): void {\n this.write({ fleeAngle: value });\n }\n\n getSensorDistance(): number {\n return this.readValue(\"sensorDistance\");\n }\n getSensorAngle(): number {\n return this.readValue(\"sensorAngle\");\n }\n getSensorRadius(): number {\n return this.readValue(\"sensorRadius\");\n }\n getSensorThreshold(): number {\n return this.readValue(\"sensorThreshold\");\n }\n getSensorStrength(): number {\n return this.readValue(\"sensorStrength\");\n }\n getColorSimilarityThreshold(): number {\n return this.readValue(\"colorSimilarityThreshold\");\n }\n getFollowBehavior(): number {\n return this.readValue(\"followBehavior\");\n }\n getFleeBehavior(): number {\n return this.readValue(\"fleeBehavior\");\n }\n getFleeAngle(): number {\n return this.readValue(\"fleeAngle\");\n }\n getEnabled(): number {\n return this.readValue(\"enabled\");\n }\n\n webgpu(): WebGPUDescriptor<SensorsInputs> {\n return {\n global: () => `// Sensor helper functions (defined at global scope)\n// Sample from the scene texture bound to the compute pipeline\n\nfn world_to_uv(pos: vec2<f32>) -> vec2<f32> {\n // Transform world position into UV in [0,1] using grid uniforms\n // Trails are rendered with Y already flipped in the vertex shader,\n // so sampling should NOT flip Y again here.\n let u = (pos.x - GRID_MINX()) / (GRID_MAXX() - GRID_MINX());\n let v = (pos.y - GRID_MINY()) / (GRID_MAXY() - GRID_MINY());\n return clamp(vec2<f32>(u, v), vec2<f32>(0.0, 0.0), vec2<f32>(1.0, 1.0));\n}\n\nfn uv_to_texel(uv: vec2<f32>) -> vec2<i32> {\n // Derive dimensions from texture\n let dim = textureDimensions(scene_texture);\n let x = i32(clamp(floor(uv.x * f32(dim.x)), 0.0, f32(dim.x - 1)));\n let y = i32(clamp(floor(uv.y * f32(dim.y)), 0.0, f32(dim.y - 1)));\n return vec2<i32>(x, y);\n}\n\nfn sensor_sample_intensity(pos: vec2<f32>, radius: f32, _selfIndex: u32) -> f32 {\n // Sample a small disk in the trail texture and average luminance\n let uv = world_to_uv(pos);\n let dim = textureDimensions(scene_texture);\n // Convert world radius to approximate pixels using grid extent\n let pxPerWorld = f32(dim.x) / (GRID_MAXX() - GRID_MINX());\n let pxRadius = clamp(radius * pxPerWorld, 1.0, 16.0);\n let center = uv_to_texel(uv);\n var sum: f32 = 0.0;\n var count: f32 = 0.0;\n let r = i32(clamp(pxRadius, 1.0, 8.0));\n for (var dy = -r; dy <= r; dy++) {\n for (var dx = -r; dx <= r; dx++) {\n let tc = vec2<i32>(center.x + dx, center.y + dy);\n if (tc.x < 0 || tc.y < 0 || tc.x >= i32(dim.x) || tc.y >= i32(dim.y)) { continue; }\n let c = textureLoad(scene_texture, tc, 0);\n let lum = dot(c.rgb, vec3<f32>(0.2126, 0.7152, 0.0722));\n sum += lum;\n count += 1.0;\n }\n }\n if (count > 0.0) {\n return clamp(sum / count, 0.0, 1.0);\n }\n return 0.0;\n}\n\nfn sensor_sample_color(pos: vec2<f32>, radius: f32, _selfIndex: u32) -> vec3<f32> {\n let uv = world_to_uv(pos);\n let dim = textureDimensions(scene_texture);\n let pxPerWorld = f32(dim.x) / (GRID_MAXX() - GRID_MINX());\n let pxRadius = clamp(radius * pxPerWorld, 1.0, 16.0);\n let center = uv_to_texel(uv);\n var sum = vec3<f32>(0.0, 0.0, 0.0);\n var count: f32 = 0.0;\n let r = i32(clamp(pxRadius, 1.0, 8.0));\n for (var dy = -r; dy <= r; dy++) {\n for (var dx = -r; dx <= r; dx++) {\n let tc = vec2<i32>(center.x + dx, center.y + dy);\n if (tc.x < 0 || tc.y < 0 || tc.x >= i32(dim.x) || tc.y >= i32(dim.y)) { continue; }\n let c = textureLoad(scene_texture, tc, 0);\n sum += c.rgb;\n count += 1.0;\n }\n }\n if (count > 0.0) {\n return clamp(sum / count, vec3<f32>(0.0), vec3<f32>(1.0));\n }\n return vec3<f32>(0.0, 0.0, 0.0);\n}\n\n\nfn sensor_is_activated(\n intensity: f32,\n sensorColor: vec3<f32>, \n particleColor: vec3<f32>,\n behavior: f32,\n threshold: f32,\n colorThreshold: f32\n) -> bool {\n // Check intensity threshold first\n if (intensity <= threshold) {\n return false;\n }\n\n if (behavior == 0.0) { // \"any\"\n return true;\n } else if (behavior == 1.0) { // \"same\"\n let colorDiff = sensorColor - particleColor;\n let distance = sqrt(dot(colorDiff, colorDiff));\n let maxDistance = sqrt(3.0); // max distance in RGB space (0-1 range)\n let similarity = 1.0 - (distance / maxDistance);\n return similarity > colorThreshold;\n } else if (behavior == 2.0) { // \"different\"\n let colorDiff = sensorColor - particleColor;\n let distance = sqrt(dot(colorDiff, colorDiff));\n let maxDistance = sqrt(3.0);\n let similarity = 1.0 - (distance / maxDistance);\n return similarity <= colorThreshold;\n } else { // \"none\" (behavior == 3.0)\n return false;\n }\n}\n`,\n apply: ({ particleVar, getUniform }) => `\n// Early exit if module is disabled or particle is pinned\nif (${particleVar}.mass == 0.0) {\n return;\n}\n\n// Get sensor configuration\nlet sensorDist = ${getUniform(\"sensorDistance\")};\nlet sensorAngle = ${getUniform(\"sensorAngle\")};\nlet sensorRadius = ${getUniform(\"sensorRadius\")};\nlet sensorThreshold = ${getUniform(\"sensorThreshold\")};\nlet sensorStrength = ${getUniform(\"sensorStrength\")};\nlet colorThreshold = ${getUniform(\"colorSimilarityThreshold\")};\nlet followBehavior = ${getUniform(\"followBehavior\")};\nlet fleeBehavior = ${getUniform(\"fleeBehavior\")};\nlet fleeAngleOffset = ${getUniform(\"fleeAngle\")};\n\n// Get particle color for color-based behaviors\nlet particleColor = ${particleVar}.color.rgb;\n\n// Calculate particle velocity direction (normalized)\nlet velocityMag = length(${particleVar}.velocity);\nvar velocityDir = vec2<f32>(1.0, 0.0); // default direction\nif (velocityMag > 0.01) {\n velocityDir = normalize(${particleVar}.velocity);\n} else {\n // Use pseudo-random direction when particle has no velocity\n let h = dot(${particleVar}.position, vec2<f32>(12.9898, 78.233));\n let r = fract(sin(h) * 43758.5453) * 2.0 * 3.14159265; // 0 to 2π\n velocityDir = vec2<f32>(cos(r), sin(r));\n}\n\n// Calculate sensor positions\n// Left sensor: rotate velocity direction by -sensorAngle\nlet cosLeft = cos(-sensorAngle);\nlet sinLeft = sin(-sensorAngle);\nlet leftDir = vec2<f32>(\n velocityDir.x * cosLeft - velocityDir.y * sinLeft,\n velocityDir.x * sinLeft + velocityDir.y * cosLeft\n);\nlet leftSensorPos = ${particleVar}.position + leftDir * sensorDist;\n\n// Right sensor: rotate velocity direction by +sensorAngle \nlet cosRight = cos(sensorAngle);\nlet sinRight = sin(sensorAngle);\nlet rightDir = vec2<f32>(\n velocityDir.x * cosRight - velocityDir.y * sinRight,\n velocityDir.x * sinRight + velocityDir.y * cosRight\n);\nlet rightSensorPos = ${particleVar}.position + rightDir * sensorDist;\n\n// Sample sensor data from scene texture (works for trails-on and trails-off paths)\nlet leftIntensity = sensor_sample_intensity(leftSensorPos, sensorRadius, index);\nlet rightIntensity = sensor_sample_intensity(rightSensorPos, sensorRadius, index);\nlet leftColor = sensor_sample_color(leftSensorPos, sensorRadius, index);\nlet rightColor = sensor_sample_color(rightSensorPos, sensorRadius, index);\n\n// Evaluate sensor activation for follow behavior\nvar followForce = vec2<f32>(0.0, 0.0);\nif (followBehavior == 0.0) { // \"any\" (ignore color, compare intensities)\n if (leftIntensity > rightIntensity && leftIntensity > sensorThreshold) {\n followForce = leftDir;\n } else if (rightIntensity > leftIntensity && rightIntensity > sensorThreshold) {\n followForce = rightDir;\n }\n} else if (followBehavior == 1.0 || followBehavior == 2.0) { // \"same\" or \"different\"\n let leftActive = sensor_is_activated(leftIntensity, leftColor, particleColor, followBehavior, sensorThreshold, colorThreshold);\n let rightActive = sensor_is_activated(rightIntensity, rightColor, particleColor, followBehavior, sensorThreshold, colorThreshold);\n if (leftActive && !rightActive) {\n followForce = leftDir;\n } else if (rightActive && !leftActive) {\n followForce = rightDir;\n }\n} // else \"none\" -> no follow force\n\n// Evaluate sensor activation for flee behavior\nvar fleeForce = vec2<f32>(0.0, 0.0);\nif (fleeBehavior == 0.0) { // \"any\" (ignore color, compare intensities)\n if (leftIntensity > rightIntensity && leftIntensity > sensorThreshold) {\n // Flee from left sensor: rotate left direction by -fleeAngle (turn right)\n let cosFleeLeft = cos(-fleeAngleOffset);\n let sinFleeLeft = sin(-fleeAngleOffset);\n fleeForce = vec2<f32>(\n leftDir.x * cosFleeLeft - leftDir.y * sinFleeLeft,\n leftDir.x * sinFleeLeft + leftDir.y * cosFleeLeft\n );\n } else if (rightIntensity > leftIntensity && rightIntensity > sensorThreshold) {\n // Flee from right sensor: rotate right direction by +fleeAngle (turn left)\n let cosFleeRight = cos(fleeAngleOffset);\n let sinFleeRight = sin(fleeAngleOffset);\n fleeForce = vec2<f32>(\n rightDir.x * cosFleeRight - rightDir.y * sinFleeRight,\n rightDir.x * sinFleeRight + rightDir.y * cosFleeRight\n );\n }\n} else if (fleeBehavior == 1.0 || fleeBehavior == 2.0) { // \"same\" or \"different\"\n let leftActive = sensor_is_activated(leftIntensity, leftColor, particleColor, fleeBehavior, sensorThreshold, colorThreshold);\n let rightActive = sensor_is_activated(rightIntensity, rightColor, particleColor, fleeBehavior, sensorThreshold, colorThreshold);\n if (leftActive && !rightActive) {\n // Flee from left sensor: rotate left direction by -fleeAngle (turn right)\n let cosFleeLeft = cos(-fleeAngleOffset);\n let sinFleeLeft = sin(-fleeAngleOffset);\n fleeForce = vec2<f32>(\n leftDir.x * cosFleeLeft - leftDir.y * sinFleeLeft,\n leftDir.x * sinFleeLeft + leftDir.y * cosFleeLeft\n );\n } else if (rightActive && !leftActive) {\n // Flee from right sensor: rotate right direction by +fleeAngle (turn left)\n let cosFleeRight = cos(fleeAngleOffset);\n let sinFleeRight = sin(fleeAngleOffset);\n fleeForce = vec2<f32>(\n rightDir.x * cosFleeRight - rightDir.y * sinFleeRight,\n rightDir.x * sinFleeRight + rightDir.y * cosFleeRight\n );\n }\n}\n\n// Combine and apply forces\n// Set velocity based on sensor decision (do not integrate acceleration)\nvar totalForce = followForce + fleeForce;\nif (length(totalForce) > 0.0) {\n let dir = normalize(totalForce);\n // Match CPU: set velocity to direction scaled by sensorStrength/5\n ${particleVar}.velocity = dir * (sensorStrength / 5.0);\n}\n`,\n };\n }\n\n cpu(): CPUDescriptor<SensorsInputs> {\n return {\n apply: ({ particle, input, getImageData, view }) => {\n const sensorDist = input.sensorDistance;\n const sensorAngle = input.sensorAngle;\n const sensorRadius = input.sensorRadius;\n const sensorThreshold = input.sensorThreshold;\n const sensorStrength = input.sensorStrength;\n const colorThreshold = input.colorSimilarityThreshold;\n const followBehavior = input.followBehavior;\n const fleeBehavior = input.fleeBehavior;\n const fleeAngleOffset = input.fleeAngle;\n\n // Get particle color for color-based behaviors\n const particleColor = {\n r: particle.color.r,\n g: particle.color.g,\n b: particle.color.b,\n };\n\n // Calculate particle velocity direction (normalized)\n const velocityMag = Math.sqrt(\n particle.velocity.x * particle.velocity.x +\n particle.velocity.y * particle.velocity.y\n );\n let velocityDir = { x: 1, y: 0 }; // default direction\n\n if (velocityMag > 0.01) {\n velocityDir = {\n x: particle.velocity.x / velocityMag,\n y: particle.velocity.y / velocityMag,\n };\n } else {\n // Use pseudo-random direction when particle has no velocity\n const h =\n particle.position.x * 12.9898 + particle.position.y * 78.233;\n const r = ((Math.sin(h) * 43758.5453) % 1) * 2 * Math.PI;\n velocityDir = { x: Math.cos(r), y: Math.sin(r) };\n }\n\n // Calculate sensor positions\n // Left sensor: rotate velocity direction by -sensorAngle\n const cosLeft = Math.cos(-sensorAngle);\n const sinLeft = Math.sin(-sensorAngle);\n const leftDir = {\n x: velocityDir.x * cosLeft - velocityDir.y * sinLeft,\n y: velocityDir.x * sinLeft + velocityDir.y * cosLeft,\n };\n const leftSensorPos = {\n x: particle.position.x + leftDir.x * sensorDist,\n y: particle.position.y + leftDir.y * sensorDist,\n };\n\n // Right sensor: rotate velocity direction by +sensorAngle\n const cosRight = Math.cos(sensorAngle);\n const sinRight = Math.sin(sensorAngle);\n const rightDir = {\n x: velocityDir.x * cosRight - velocityDir.y * sinRight,\n y: velocityDir.x * sinRight + velocityDir.y * cosRight,\n };\n const rightSensorPos = {\n x: particle.position.x + rightDir.x * sensorDist,\n y: particle.position.y + rightDir.y * sensorDist,\n };\n\n // Helper function to sample canvas at a position with radius\n const sampleCanvas = (\n position: { x: number; y: number },\n radius: number\n ): {\n intensity: number;\n color: { r: number; g: number; b: number };\n } => {\n const camera = view.getCamera();\n const zoom = view.getZoom();\n const size = view.getSize();\n const centerX = size.width / 2;\n const centerY = size.height / 2;\n\n // Transform world position to screen position\n const worldX = (position.x - camera.x) * zoom;\n const worldY = (position.y - camera.y) * zoom;\n const screenX = centerX + worldX;\n const screenY = centerY + worldY;\n const screenRadius = Math.max(1, radius * zoom);\n\n // Calculate sample area bounds\n const left = Math.floor(screenX - screenRadius);\n const top = Math.floor(screenY - screenRadius);\n const right = Math.ceil(screenX + screenRadius);\n const bottom = Math.ceil(screenY + screenRadius);\n const width = right - left;\n const height = bottom - top;\n\n if (width <= 0 || height <= 0) {\n return { intensity: 0, color: { r: 0, g: 0, b: 0 } };\n }\n\n const imageData = getImageData(left, top, width, height);\n if (!imageData) {\n return { intensity: 0, color: { r: 0, g: 0, b: 0 } };\n }\n\n const data = imageData.data;\n let totalR = 0,\n totalG = 0,\n totalB = 0,\n totalIntensity = 0;\n let sampleCount = 0;\n\n // Sample pixels in a circular area\n const centerSampleX = screenX - left;\n const centerSampleY = screenY - top;\n\n for (let y = 0; y < imageData.height; y++) {\n for (let x = 0; x < imageData.width; x++) {\n const dx = x - centerSampleX;\n const dy = y - centerSampleY;\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n if (distance <= screenRadius) {\n const i = (y * imageData.width + x) * 4;\n const r = data[i] / 255;\n const g = data[i + 1] / 255;\n const b = data[i + 2] / 255;\n const intensity = 0.2126 * r + 0.7152 * g + 0.0722 * b; // Luminance\n\n totalR += r;\n totalG += g;\n totalB += b;\n totalIntensity += intensity;\n sampleCount++;\n }\n }\n }\n\n if (sampleCount === 0) {\n return { intensity: 0, color: { r: 0, g: 0, b: 0 } };\n }\n\n return {\n intensity: Math.min(1, Math.max(0, totalIntensity / sampleCount)),\n color: {\n r: Math.min(1, Math.max(0, totalR / sampleCount)),\n g: Math.min(1, Math.max(0, totalG / sampleCount)),\n b: Math.min(1, Math.max(0, totalB / sampleCount)),\n },\n };\n };\n\n const leftSample = sampleCanvas(leftSensorPos, sensorRadius);\n const rightSample = sampleCanvas(rightSensorPos, sensorRadius);\n\n // Helper function to check sensor activation\n const isSensorActivated = (\n intensity: number,\n sensorColor: { r: number; g: number; b: number },\n behavior: number\n ): boolean => {\n // Check intensity threshold first\n if (intensity <= sensorThreshold) {\n return false;\n }\n\n if (behavior === 0) {\n // \"any\"\n return true;\n } else if (behavior === 1) {\n // \"same\"\n const colorDiff = {\n r: sensorColor.r - particleColor.r,\n g: sensorColor.g - particleColor.g,\n b: sensorColor.b - particleColor.b,\n };\n const distance = Math.sqrt(\n colorDiff.r * colorDiff.r +\n colorDiff.g * colorDiff.g +\n colorDiff.b * colorDiff.b\n );\n const maxDistance = Math.sqrt(3); // max distance in RGB space (0-1 range)\n const similarity = 1 - distance / maxDistance;\n return similarity > colorThreshold;\n } else if (behavior === 2) {\n // \"different\"\n const colorDiff = {\n r: sensorColor.r - particleColor.r,\n g: sensorColor.g - particleColor.g,\n b: sensorColor.b - particleColor.b,\n };\n const distance = Math.sqrt(\n colorDiff.r * colorDiff.r +\n colorDiff.g * colorDiff.g +\n colorDiff.b * colorDiff.b\n );\n const maxDistance = Math.sqrt(3);\n const similarity = 1 - distance / maxDistance;\n return similarity <= colorThreshold;\n } else {\n // \"none\" (behavior === 3)\n return false;\n }\n };\n\n // Evaluate sensor activation for follow behavior\n let followForce = { x: 0, y: 0 };\n if (followBehavior === 0) {\n // \"any\" (ignore color, compare intensities)\n if (\n leftSample.intensity > rightSample.intensity &&\n leftSample.intensity > sensorThreshold\n ) {\n followForce = leftDir;\n } else if (\n rightSample.intensity > leftSample.intensity &&\n rightSample.intensity > sensorThreshold\n ) {\n followForce = rightDir;\n }\n } else if (followBehavior === 1 || followBehavior === 2) {\n // \"same\" or \"different\"\n const leftActive = isSensorActivated(\n leftSample.intensity,\n leftSample.color,\n followBehavior\n );\n const rightActive = isSensorActivated(\n rightSample.intensity,\n rightSample.color,\n followBehavior\n );\n if (leftActive && !rightActive) {\n followForce = leftDir;\n } else if (rightActive && !leftActive) {\n followForce = rightDir;\n }\n } // else \"none\" -> no follow force\n\n // Evaluate sensor activation for flee behavior\n let fleeForce = { x: 0, y: 0 };\n if (fleeBehavior === 0) {\n // \"any\" (ignore color, compare intensities)\n if (\n leftSample.intensity > rightSample.intensity &&\n leftSample.intensity > sensorThreshold\n ) {\n // Flee from left sensor: rotate left direction by -fleeAngle (turn right)\n const cosFleeLeft = Math.cos(-fleeAngleOffset);\n const sinFleeLeft = Math.sin(-fleeAngleOffset);\n fleeForce = {\n x: leftDir.x * cosFleeLeft - leftDir.y * sinFleeLeft,\n y: leftDir.x * sinFleeLeft + leftDir.y * cosFleeLeft,\n };\n } else if (\n rightSample.intensity > leftSample.intensity &&\n rightSample.intensity > sensorThreshold\n ) {\n // Flee from right sensor: rotate right direction by +fleeAngle (turn left)\n const cosFleeRight = Math.cos(fleeAngleOffset);\n const sinFleeRight = Math.sin(fleeAngleOffset);\n fleeForce = {\n x: rightDir.x * cosFleeRight - rightDir.y * sinFleeRight,\n y: rightDir.x * sinFleeRight + rightDir.y * cosFleeRight,\n };\n }\n } else if (fleeBehavior === 1 || fleeBehavior === 2) {\n // \"same\" or \"different\"\n const leftActive = isSensorActivated(\n leftSample.intensity,\n leftSample.color,\n fleeBehavior\n );\n const rightActive = isSensorActivated(\n rightSample.intensity,\n rightSample.color,\n fleeBehavior\n );\n if (leftActive && !rightActive) {\n // Flee from left sensor: rotate left direction by -fleeAngle (turn right)\n const cosFleeLeft = Math.cos(-fleeAngleOffset);\n const sinFleeLeft = Math.sin(-fleeAngleOffset);\n fleeForce = {\n x: leftDir.x * cosFleeLeft - leftDir.y * sinFleeLeft,\n y: leftDir.x * sinFleeLeft + leftDir.y * cosFleeLeft,\n };\n } else if (rightActive && !leftActive) {\n // Flee from right sensor: rotate right direction by +fleeAngle (turn left)\n const cosFleeRight = Math.cos(fleeAngleOffset);\n const sinFleeRight = Math.sin(fleeAngleOffset);\n fleeForce = {\n x: rightDir.x * cosFleeRight - rightDir.y * sinFleeRight,\n y: rightDir.x * sinFleeRight + rightDir.y * cosFleeRight,\n };\n }\n }\n\n // Combine and apply forces\n const totalForce = {\n x: followForce.x + fleeForce.x,\n y: followForce.y + fleeForce.y,\n };\n\n const forceMag = Math.sqrt(\n totalForce.x * totalForce.x + totalForce.y * totalForce.y\n );\n if (forceMag > 0) {\n const dir = {\n x: totalForce.x / forceMag,\n y: totalForce.y / forceMag,\n };\n // Match WebGPU: set velocity to direction scaled by sensorStrength/5\n particle.velocity.x = dir.x * (sensorStrength / 5);\n particle.velocity.y = dir.y * (sensorStrength / 5);\n }\n },\n };\n }\n}\n","/**\n * Interaction (Force Module)\n *\n * Mouse-driven attract/repel impulse applied within a radius when the selected\n * input button is active. Strength falls off to zero at the edge of the radius.\n */\nimport {\n Module,\n type WebGPUDescriptor,\n ModuleRole,\n CPUDescriptor,\n DataType,\n} from \"../../module\";\n\nexport const DEFAULT_INTERACTION_MODE: \"attract\" | \"repel\" = \"attract\";\nexport const DEFAULT_INTERACTION_STRENGTH = 10000;\nexport const DEFAULT_INTERACTION_RADIUS = 500;\n\n// action: 0 -> click (left), 1 -> right_click\n// mode: 0 -> attract, 1 -> repel\n\ntype InteractionInputs = {\n mode: number;\n strength: number;\n radius: number;\n positionX: number;\n positionY: number;\n active: number;\n};\n\nexport class Interaction extends Module<\"interaction\", InteractionInputs> {\n readonly name = \"interaction\" as const;\n readonly role = ModuleRole.Force;\n readonly inputs = {\n mode: DataType.NUMBER,\n strength: DataType.NUMBER,\n radius: DataType.NUMBER,\n positionX: DataType.NUMBER,\n positionY: DataType.NUMBER,\n active: DataType.NUMBER,\n } as const;\n\n constructor(opts?: {\n enabled?: boolean;\n action?: \"click\" | \"right_click\";\n mode?: \"attract\" | \"repel\";\n strength?: number;\n radius?: number;\n position?: { x: number; y: number };\n active?: boolean;\n }) {\n super();\n const mode = (opts?.mode ?? DEFAULT_INTERACTION_MODE) === \"repel\" ? 1 : 0;\n this.write({\n mode,\n strength: opts?.strength ?? DEFAULT_INTERACTION_STRENGTH,\n radius: opts?.radius ?? DEFAULT_INTERACTION_RADIUS,\n positionX: opts?.position?.x ?? 0,\n positionY: opts?.position?.y ?? 0,\n active: opts?.active ? 1 : 0,\n });\n if (opts?.enabled !== undefined) {\n this.setEnabled(!!opts.enabled);\n }\n }\n\n setMode(v: \"attract\" | \"repel\"): void {\n this.write({ mode: v === \"repel\" ? 1 : 0 });\n }\n setStrength(v: number): void {\n this.write({ strength: v });\n }\n setRadius(v: number): void {\n this.write({ radius: v });\n }\n setPosition(x: number, y: number): void {\n this.write({ positionX: x, positionY: y });\n }\n setActive(active: boolean): void {\n this.write({ active: active ? 1 : 0 });\n }\n\n getMode(): number {\n return this.readValue(\"mode\");\n }\n getStrength(): number {\n return this.readValue(\"strength\");\n }\n getRadius(): number {\n return this.readValue(\"radius\");\n }\n getPosition(): { x: number; y: number } {\n return {\n x: this.readValue(\"positionX\"),\n y: this.readValue(\"positionY\"),\n };\n }\n isActive(): boolean {\n return this.readValue(\"active\") === 1;\n }\n\n webgpu(): WebGPUDescriptor<InteractionInputs> {\n return {\n apply: ({ particleVar, getUniform }) => `{\n if (${getUniform(\"active\")} == 0.0 ) { return; }\n // Compute vector from particle to position\n let dx = ${getUniform(\"positionX\")} - ${particleVar}.position.x;\n let dy = ${getUniform(\"positionY\")} - ${particleVar}.position.y;\n let dist2 = dx*dx + dy*dy;\n let rad = ${getUniform(\"radius\")};\n let r2 = rad * rad;\n if (dist2 <= 0.0 || dist2 > r2) { return; }\n let dist = sqrt(dist2);\n let dir = vec2<f32>(dx, dy) / dist;\n let falloff = 1.0 - (dist / rad);\n let f = ${getUniform(\"strength\")} * falloff;\n let mode = ${getUniform(\"mode\")} ;\n let force = select(dir * f, -dir * f, mode == 1.0);\n ${particleVar}.acceleration += force;\n}`,\n };\n }\n\n cpu(): CPUDescriptor<InteractionInputs> {\n return {\n apply: ({ particle, input }) => {\n if (!input.active) return;\n\n // Compute vector from particle to position\n const dx = input.positionX - particle.position.x;\n const dy = input.positionY - particle.position.y;\n const dist2 = dx * dx + dy * dy;\n const rad = input.radius;\n const r2 = rad * rad;\n\n if (dist2 <= 0 || dist2 > r2) return;\n\n const dist = Math.sqrt(dist2);\n const dirX = dx / dist;\n const dirY = dy / dist;\n const falloff = 1.0 - dist / rad;\n const f = input.strength * falloff;\n const mode = input.mode;\n\n // mode 0 = attract, mode 1 = repel\n const forceX = mode === 1 ? -dirX * f : dirX * f;\n const forceY = mode === 1 ? -dirY * f : dirY * f;\n\n particle.acceleration.x += forceX;\n particle.acceleration.y += forceY;\n },\n };\n }\n}\n","import {\n Module,\n ModuleRole,\n type WebGPUDescriptor,\n CPUDescriptor,\n DataType,\n} from \"../../module\";\n\n// Default configuration values for joints module\nexport const DEFAULT_JOINTS_RESTITUTION = 0.9;\nexport const DEFAULT_JOINTS_SEPARATION = 0.5;\nexport const DEFAULT_JOINTS_STEPS = 1;\nexport const DEFAULT_JOINTS_FRICTION = 0.01;\nexport const DEFAULT_JOINTS_MOMENTUM = 0.7;\nexport const DEFAULT_JOINTS_ENABLE_PARTICLE_COLLISIONS = 0;\nexport const DEFAULT_JOINTS_ENABLE_JOINT_COLLISIONS = 0;\n\nexport interface Joint {\n aIndex: number;\n bIndex: number;\n restLength: number;\n}\n\ntype JointsInputs = {\n aIndexes: number[];\n bIndexes: number[];\n restLengths: number[];\n incidentJointOffsets: number[];\n incidentJointIndices: number[];\n enableParticleCollisions: number;\n enableJointCollisions: number;\n momentum: number;\n restitution: number; // particle-vs-joint restitution\n separation: number; // joint-joint positional separation strength per iteration\n steps: number; // substeps for CCD sweep\n friction: number; // 0=no friction, 1=high friction\n groupIds: number[]; // per-particle rigid body id\n};\n\nexport class Joints extends Module<\"joints\", JointsInputs> {\n readonly name = \"joints\" as const;\n readonly role = ModuleRole.Force;\n readonly inputs = {\n aIndexes: DataType.ARRAY,\n bIndexes: DataType.ARRAY,\n restLengths: DataType.ARRAY,\n incidentJointOffsets: DataType.ARRAY,\n incidentJointIndices: DataType.ARRAY,\n enableParticleCollisions: DataType.NUMBER,\n enableJointCollisions: DataType.NUMBER,\n momentum: DataType.NUMBER,\n restitution: DataType.NUMBER,\n separation: DataType.NUMBER,\n steps: DataType.NUMBER,\n friction: DataType.NUMBER,\n groupIds: DataType.ARRAY,\n } as const;\n\n constructor(opts?: {\n enabled?: boolean;\n joints?: Joint[];\n aIndexes?: number[];\n bIndexes?: number[];\n restLengths?: number[];\n enableParticleCollisions?: boolean;\n enableJointCollisions?: boolean;\n momentum?: number;\n restitution?: number;\n separation?: number;\n steps?: number;\n friction?: number;\n }) {\n super();\n\n // Handle joints array if provided, otherwise use separate arrays\n let aIndexes: number[], bIndexes: number[], restLengths: number[];\n if (opts?.joints) {\n aIndexes = opts.joints.map((j) => j.aIndex);\n bIndexes = opts.joints.map((j) => j.bIndex);\n restLengths = opts.joints.map((j) => j.restLength);\n } else {\n aIndexes = opts?.aIndexes ?? [];\n bIndexes = opts?.bIndexes ?? [];\n restLengths = opts?.restLengths ?? [];\n }\n\n this.write({\n aIndexes,\n bIndexes,\n restLengths,\n incidentJointOffsets: [],\n incidentJointIndices: [],\n enableParticleCollisions:\n opts?.enableParticleCollisions !== undefined\n ? opts.enableParticleCollisions\n ? 1\n : 0\n : DEFAULT_JOINTS_ENABLE_PARTICLE_COLLISIONS,\n enableJointCollisions:\n opts?.enableJointCollisions !== undefined\n ? opts.enableJointCollisions\n ? 1\n : 0\n : DEFAULT_JOINTS_ENABLE_JOINT_COLLISIONS,\n momentum: opts?.momentum ?? DEFAULT_JOINTS_MOMENTUM,\n restitution: opts?.restitution ?? DEFAULT_JOINTS_RESTITUTION,\n separation: opts?.separation ?? DEFAULT_JOINTS_SEPARATION,\n steps: opts?.steps ?? DEFAULT_JOINTS_STEPS,\n friction: opts?.friction ?? DEFAULT_JOINTS_FRICTION,\n groupIds: [],\n });\n // Build CSR/groupIds immediately so GPU path has valid incident lists on first frame\n if (aIndexes.length > 0 && bIndexes.length > 0) {\n this.setJoints(aIndexes, bIndexes, restLengths);\n } else {\n // Ensure empty CSR when no joints provided\n this.write({\n groupIds: [],\n incidentJointOffsets: [],\n incidentJointIndices: [],\n });\n }\n if (opts?.enabled !== undefined) this.setEnabled(!!opts.enabled);\n }\n\n getJoints(): Joint[] {\n const aIndexes = this.readArray(\"aIndexes\") as number[];\n const bIndexes = this.readArray(\"bIndexes\") as number[];\n const restLengths = this.readArray(\"restLengths\") as number[];\n\n const joints: Joint[] = [];\n const length = Math.min(\n aIndexes.length,\n bIndexes.length,\n restLengths.length\n );\n for (let i = 0; i < length; i++) {\n joints.push({\n aIndex: aIndexes[i],\n bIndex: bIndexes[i],\n restLength: restLengths[i],\n });\n }\n return joints;\n }\n\n setJoints(joints: Joint[]): void;\n setJoints(\n aIndexes: number[],\n bIndexes: number[],\n restLengths: number[]\n ): void;\n setJoints(\n jointsOrAIndexes: Joint[] | number[],\n bIndexes?: number[],\n restLengths?: number[]\n ): void {\n let aIndexes: number[], bIndexesArray: number[], restLengthsArray: number[];\n\n // Check if first argument is Joint[] or number[]\n if (bIndexes === undefined && restLengths === undefined) {\n // First overload: Joint[]\n const joints = jointsOrAIndexes as Joint[];\n aIndexes = joints.map((j) => j.aIndex);\n bIndexesArray = joints.map((j) => j.bIndex);\n restLengthsArray = joints.map((j) => j.restLength);\n } else {\n // Second overload: separate arrays\n aIndexes = jointsOrAIndexes as number[];\n bIndexesArray = bIndexes!;\n restLengthsArray = restLengths!;\n }\n\n // Always write joint arrays\n this.write({\n aIndexes,\n bIndexes: bIndexesArray,\n restLengths: restLengthsArray,\n });\n\n // Compute rigid body groupIds from joints (BFS over joint graph) and write them once here\n const n = Math.max(\n aIndexes.length ? Math.max(...aIndexes) + 1 : 0,\n bIndexesArray.length ? Math.max(...bIndexesArray) + 1 : 0\n );\n if (n > 0) {\n const adj: number[][] = Array.from({ length: n }, () => []);\n const deg = new Array<number>(n).fill(0);\n const validLen = Math.min(aIndexes.length, bIndexesArray.length);\n for (let i = 0; i < validLen; i++) {\n const u = aIndexes[i] >>> 0;\n const v = bIndexesArray[i] >>> 0;\n if (u >= n || v >= n) continue;\n adj[u].push(v);\n adj[v].push(u);\n deg[u]++;\n deg[v]++;\n }\n const groupIds = new Array<number>(n).fill(-1);\n let gid = 0;\n for (let i = 0; i < n; i++) {\n if (groupIds[i] !== -1) continue;\n if (deg[i] === 0) continue; // ignore isolated\n const queue: number[] = [i];\n groupIds[i] = gid;\n while (queue.length) {\n const u = queue.shift() as number;\n const nbrs = adj[u];\n for (let k = 0; k < nbrs.length; k++) {\n const v = nbrs[k];\n if (groupIds[v] === -1) {\n groupIds[v] = gid;\n queue.push(v);\n }\n }\n }\n gid++;\n }\n // Build CSR adjacency of incident joints per particle using degrees\n const offsets = new Array<number>(n + 1).fill(0);\n for (let i = 0; i < n; i++) offsets[i + 1] = offsets[i] + deg[i];\n const totalInc = offsets[n];\n const incidentJointIndices = new Array<number>(totalInc);\n const cursor = offsets.slice();\n for (let j = 0; j < validLen; j++) {\n const ua = aIndexes[j] >>> 0;\n const vb = bIndexesArray[j] >>> 0;\n if (ua < n) incidentJointIndices[cursor[ua]++] = j;\n if (vb < n) incidentJointIndices[cursor[vb]++] = j;\n }\n this.write({\n groupIds,\n incidentJointOffsets: offsets,\n incidentJointIndices,\n });\n } else {\n this.write({\n groupIds: [],\n incidentJointOffsets: [],\n incidentJointIndices: [],\n });\n }\n }\n\n getEnableParticleCollisions() {\n return this.readValue(\"enableParticleCollisions\");\n }\n\n setEnableParticleCollisions(val: number | boolean): void {\n const numeric = typeof val === \"number\" ? val : val ? 1 : 0;\n this.write({ enableParticleCollisions: numeric });\n }\n\n getEnableJointCollisions() {\n return this.readValue(\"enableJointCollisions\");\n }\n\n setEnableJointCollisions(val: number | boolean): void {\n const numeric = typeof val === \"number\" ? val : val ? 1 : 0;\n this.write({ enableJointCollisions: numeric });\n }\n\n // Legacy method for backward compatibility\n getEnableCollisions() {\n return this.readValue(\"enableParticleCollisions\");\n }\n\n setEnableCollisions(val: number | boolean): void {\n const numeric = typeof val === \"number\" ? val : val ? 1 : 0;\n this.write({\n enableParticleCollisions: numeric,\n enableJointCollisions: numeric,\n });\n }\n\n getMomentum() {\n return this.readValue(\"momentum\");\n }\n\n setMomentum(val: number): void {\n this.write({ momentum: Math.max(0, Math.min(1, val)) }); // Clamp between 0 and 1\n }\n\n getRestitution() {\n return this.readValue(\"restitution\");\n }\n\n setRestitution(val: number): void {\n this.write({ restitution: Math.max(0, Math.min(1, val)) });\n }\n\n getSeparation() {\n return this.readValue(\"separation\");\n }\n\n setSeparation(val: number): void {\n this.write({ separation: Math.max(0.01, Math.min(1, val)) });\n }\n\n getSteps() {\n return this.readValue(\"steps\");\n }\n\n setSteps(val: number): void {\n const steps = Math.max(1, Math.min(128, Math.floor(val)));\n this.write({ steps });\n }\n\n getFriction() {\n return this.readValue(\"friction\");\n }\n\n setFriction(val: number): void {\n this.write({ friction: Math.max(0, Math.min(1, val)) });\n }\n\n add(joint: Joint): void {\n const currentJoints = this.getJoints();\n\n // Normalize joint (ensure aIndex <= bIndex) and dedupe\n let { aIndex, bIndex, restLength } = joint;\n if (aIndex === bIndex) return; // Skip self-joints\n if (bIndex < aIndex) [aIndex, bIndex] = [bIndex, aIndex];\n\n // Check for duplicates\n for (const existing of currentJoints) {\n let { aIndex: existingA, bIndex: existingB } = existing;\n if (existingB < existingA)\n [existingA, existingB] = [existingB, existingA];\n if (existingA === aIndex && existingB === bIndex) return;\n }\n\n // Add the joint\n currentJoints.push({ aIndex, bIndex, restLength });\n this.setJoints(currentJoints);\n }\n\n remove(aIndex: number, bIndex: number): void {\n const currentJoints = this.getJoints();\n\n // Normalize indices for comparison\n let searchA = aIndex,\n searchB = bIndex;\n if (searchB < searchA) [searchA, searchB] = [searchB, searchA];\n\n // Find and remove the joint (works with flipped indices too)\n const filteredJoints = currentJoints.filter((joint) => {\n let { aIndex: jointA, bIndex: jointB } = joint;\n if (jointB < jointA) [jointA, jointB] = [jointB, jointA];\n return !(jointA === searchA && jointB === searchB);\n });\n\n this.setJoints(filteredJoints);\n }\n\n removeAll(): void {\n this.setJoints([]);\n }\n\n // groupIds are derived from joints; no external setters/getters\n\n webgpu(): WebGPUDescriptor<JointsInputs, \"prevX\" | \"prevY\"> {\n return {\n states: [\"prevX\", \"prevY\"] as const,\n\n // Store pre-physics positions for momentum preservation, only if this particle has an incident joint\n state: ({ particleVar, getLength, setState, getUniform }) => `{\n let offLen = ${getLength(\"incidentJointOffsets\")};\n if (offLen > 1u) {\n let idx1 = index + 1u;\n if (idx1 < offLen) {\n let s = u32(${getUniform(\"incidentJointOffsets\", \"index\")});\n let e = u32(${getUniform(\"incidentJointOffsets\", \"idx1\")});\n if (e > s) {\n ${setState(\"prevX\", `${particleVar}.position.x`)};\n ${setState(\"prevY\", `${particleVar}.position.y`)};\n }\n }\n }\n}`,\n\n // Constrain: per-particle correction using CSR only\n constrain: ({ particleVar, getUniform, getLength }) => `{\n let lenA = ${getLength(\"aIndexes\")};\n let lenB = ${getLength(\"bIndexes\")};\n let lenR = ${getLength(\"restLengths\")};\n let jointCount = min(lenA, min(lenB, lenR));\n if (jointCount == 0u) { return; }\n let offsetsLen = ${getLength(\"incidentJointOffsets\")};\n let idx1 = index + 1u;\n \n if (offsetsLen <= 1u || idx1 >= offsetsLen) { return; }\n let start = u32(${getUniform(\"incidentJointOffsets\", \"index\")});\n let end = u32(${getUniform(\"incidentJointOffsets\", \"idx1\")});\n if (end <= start) { return; }\n let half: f32 = 0.5;\n let forwardFirst = (index & 1u) == 0u;\n if (forwardFirst) {\n for (var k = start; k < end; k++) {\n let j = u32(${getUniform(\"incidentJointIndices\", \"k\")});\n if (j >= jointCount) { continue; }\n let a = u32(${getUniform(\"aIndexes\", \"j\")});\n let b = u32(${getUniform(\"bIndexes\", \"j\")});\n let rest = ${getUniform(\"restLengths\", \"j\")};\n if (rest <= 0.0) { continue; }\n var otherIndex: u32 = 0xffffffffu;\n if (a == index) { otherIndex = b; } else if (b == index) { otherIndex = a; }\n if (otherIndex == 0xffffffffu) { continue; }\n var other = particles[otherIndex];\n if (${particleVar}.mass == 0.0 || other.mass == 0.0) { continue; }\n let delta = other.position - ${particleVar}.position;\n let dist2 = dot(delta, delta);\n if (dist2 < 1e-8) { continue; }\n let invDist = inverseSqrt(dist2);\n let dist = 1.0 / max(invDist, 1e-8);\n let dir = delta * invDist;\n let rl = select(dist, rest, rest > 0.0);\n let diff = dist - rl;\n if (abs(diff) < 1e-6) { continue; }\n let invM_self = select(0.0, 1.0 / ${particleVar}.mass, ${particleVar}.mass > 0.0);\n let invM_other = select(0.0, 1.0 / other.mass, other.mass > 0.0);\n let invSum = invM_self + invM_other;\n if (invSum <= 0.0) { continue; }\n let corr = dir * (diff * (invM_self / invSum)) * half;\n ${particleVar}.position = ${particleVar}.position + corr;\n }\n for (var k2 = end; k2 > start; k2--) {\n let k = k2 - 1u;\n let j = u32(${getUniform(\"incidentJointIndices\", \"k\")});\n if (j >= jointCount) { continue; }\n let a = u32(${getUniform(\"aIndexes\", \"j\")});\n let b = u32(${getUniform(\"bIndexes\", \"j\")});\n let rest = ${getUniform(\"restLengths\", \"j\")};\n if (rest <= 0.0) { continue; }\n var otherIndex: u32 = 0xffffffffu;\n if (a == index) { otherIndex = b; } else if (b == index) { otherIndex = a; }\n if (otherIndex == 0xffffffffu) { continue; }\n var other = particles[otherIndex];\n if (${particleVar}.mass == 0.0 || other.mass == 0.0) { continue; }\n let delta = other.position - ${particleVar}.position;\n let dist2 = dot(delta, delta);\n if (dist2 < 1e-8) { continue; }\n let invDist = inverseSqrt(dist2);\n let dist = 1.0 / max(invDist, 1e-8);\n let dir = delta * invDist;\n let rl = select(dist, rest, rest > 0.0);\n let diff = dist - rl;\n if (abs(diff) < 1e-6) { continue; }\n let invM_self = select(0.0, 1.0 / ${particleVar}.mass, ${particleVar}.mass > 0.0);\n let invM_other = select(0.0, 1.0 / other.mass, other.mass > 0.0);\n let invSum = invM_self + invM_other;\n if (invSum <= 0.0) { continue; }\n let corr = dir * (diff * (invM_self / invSum)) * half;\n ${particleVar}.position = ${particleVar}.position + corr;\n }\n } else {\n for (var k2 = end; k2 > start; k2--) {\n let k = k2 - 1u;\n let j = u32(${getUniform(\"incidentJointIndices\", \"k\")});\n if (j >= jointCount) { continue; }\n let a = u32(${getUniform(\"aIndexes\", \"j\")});\n let b = u32(${getUniform(\"bIndexes\", \"j\")});\n let rest = ${getUniform(\"restLengths\", \"j\")};\n if (rest <= 0.0) { continue; }\n var otherIndex: u32 = 0xffffffffu;\n if (a == index) { otherIndex = b; } else if (b == index) { otherIndex = a; }\n if (otherIndex == 0xffffffffu) { continue; }\n var other = particles[otherIndex];\n if (${particleVar}.mass == 0.0 || other.mass == 0.0) { continue; }\n let delta = other.position - ${particleVar}.position;\n let dist2 = dot(delta, delta);\n if (dist2 < 1e-8) { continue; }\n let invDist = inverseSqrt(dist2);\n let dist = 1.0 / max(invDist, 1e-8);\n let dir = delta * invDist;\n let rl = select(dist, rest, rest > 0.0);\n let diff = dist - rl;\n if (abs(diff) < 1e-6) { continue; }\n let invM_self = select(0.0, 1.0 / ${particleVar}.mass, ${particleVar}.mass > 0.0);\n let invM_other = select(0.0, 1.0 / other.mass, other.mass > 0.0);\n let invSum = invM_self + invM_other;\n if (invSum <= 0.0) { continue; }\n let corr = dir * (diff * (invM_self / invSum)) * half;\n ${particleVar}.position = ${particleVar}.position + corr;\n }\n for (var k = start; k < end; k++) {\n let j = u32(${getUniform(\"incidentJointIndices\", \"k\")});\n if (j >= jointCount) { continue; }\n let a = u32(${getUniform(\"aIndexes\", \"j\")});\n let b = u32(${getUniform(\"bIndexes\", \"j\")});\n let rest = ${getUniform(\"restLengths\", \"j\")};\n if (rest <= 0.0) { continue; }\n var otherIndex: u32 = 0xffffffffu;\n if (a == index) { otherIndex = b; } else if (b == index) { otherIndex = a; }\n if (otherIndex == 0xffffffffu) { continue; }\n var other = particles[otherIndex];\n if (${particleVar}.mass == 0.0 || other.mass == 0.0) { continue; }\n let delta = other.position - ${particleVar}.position;\n let dist2 = dot(delta, delta);\n if (dist2 < 1e-8) { continue; }\n let invDist = inverseSqrt(dist2);\n let dist = 1.0 / max(invDist, 1e-8);\n let dir = delta * invDist;\n let rl = select(dist, rest, rest > 0.0);\n let diff = dist - rl;\n if (abs(diff) < 1e-6) { continue; }\n let invM_self = select(0.0, 1.0 / ${particleVar}.mass, ${particleVar}.mass > 0.0);\n let invM_other = select(0.0, 1.0 / other.mass, other.mass > 0.0);\n let invSum = invM_self + invM_other;\n if (invSum <= 0.0) { continue; }\n let corr = dir * (diff * (invM_self / invSum)) * half;\n ${particleVar}.position = ${particleVar}.position + corr;\n }\n }\n\n // Optional collision handling with joints (particle vs joint, joint vs joint)\n // Only for particles that are part of at least one joint\n var hasJoint = false;\n let offLenColl = ${getLength(\"incidentJointOffsets\")};\n if (offLenColl > 1u) {\n let idx1h = index + 1u;\n if (idx1h < offLenColl) {\n let s = u32(${getUniform(\"incidentJointOffsets\", \"index\")});\n let e = u32(${getUniform(\"incidentJointOffsets\", \"idx1h\")});\n hasJoint = (e > s);\n }\n }\n // jointCount already defined above\n if (${getUniform(\n \"enableParticleCollisions\"\n )} > 0.0 && ${particleVar}.mass > 0.0 && hasJoint) {\n // Particle vs Joint: find deepest overlap with any segment not incident to this particle\n var bestOverlap: f32 = 0.0;\n var bestNormal: vec2<f32> = vec2<f32>(0.0, 0.0);\n for (var j2 = 0u; j2 < jointCount; j2++) {\n let a2 = u32(${getUniform(\"aIndexes\", \"j2\")});\n let b2 = u32(${getUniform(\"bIndexes\", \"j2\")});\n if (a2 == index || b2 == index) { continue; }\n var A = particles[a2];\n var B = particles[b2];\n // Guard\n if (A.mass == 0.0 || B.mass == 0.0) { continue; }\n // Broadphase AABB reject using particle radius\n let r = ${particleVar}.size;\n let minx = min(A.position.x, B.position.x) - r;\n let maxx = max(A.position.x, B.position.x) + r;\n let miny = min(A.position.y, B.position.y) - r;\n let maxy = max(A.position.y, B.position.y) + r;\n let px = ${particleVar}.position.x;\n let py = ${particleVar}.position.y;\n if (px < minx || px > maxx || py < miny || py > maxy) { continue; }\n let AB = B.position - A.position;\n let AB2 = dot(AB, AB);\n if (AB2 < 1e-8) { continue; }\n let AP = ${particleVar}.position - A.position;\n let t = clamp(dot(AP, AB) / AB2, 0.0, 1.0);\n let closest = A.position + AB * t;\n let pc = ${particleVar}.position - closest;\n let d2 = dot(pc, pc);\n if (d2 < r * r && d2 > 1e-8) {\n let d = sqrt(d2);\n let overlap = r - d;\n if (overlap > bestOverlap) {\n bestOverlap = overlap;\n bestNormal = pc / d;\n }\n }\n }\n if (bestOverlap > 0.0) {\n // Position correction (move current particle only)\n let push = min(bestOverlap * 0.6, ${particleVar}.size);\n ${particleVar}.position = ${particleVar}.position + bestNormal * push;\n // Low-restitution impulse to reduce interpenetration\n var v = ${particleVar}.velocity;\n let n = bestNormal;\n let relN = dot(v, n);\n let vt = v - n * relN; // tangential component\n if (relN < 0.0) {\n let e = ${getUniform(\"restitution\")};\n let mu = clamp(${getUniform(\"friction\")}, 0.0, 1.0);\n let vReflected = v - n * (relN * (1.0 + e));\n let vtScaled = vt * (1.0 - mu);\n ${particleVar}.velocity = vReflected + (vtScaled - vt);\n }\n }\n\n // Joint vs Joint: for joints incident to this particle, nudge to resolve crossings\n if (${getUniform(\"enableJointCollisions\")} > 0.0) {\n for (var j3 = 0u; j3 < jointCount; j3++) {\n let a3 = u32(${getUniform(\"aIndexes\", \"j3\")});\n let b3 = u32(${getUniform(\"bIndexes\", \"j3\")});\n var isIncident = (a3 == index) || (b3 == index);\n if (!isIncident) { continue; }\n var A1 = particles[a3];\n var B1 = particles[b3];\n let x1 = A1.position.x; let y1 = A1.position.y;\n let x2 = B1.position.x; let y2 = B1.position.y;\n for (var k = 0u; k < jointCount; k++) {\n if (k == j3) { continue; }\n let a4 = u32(${getUniform(\"aIndexes\", \"k\")});\n let b4 = u32(${getUniform(\"bIndexes\", \"k\")});\n // Skip if shares endpoints\n if (a4 == a3 || a4 == b3 || b4 == a3 || b4 == b3) { continue; }\n // Skip same rigid body using precomputed groupIds\n let gidA = i32(${getUniform(\"groupIds\", \"a3\")});\n let gidB = i32(${getUniform(\"groupIds\", \"b3\")});\n let gidC = i32(${getUniform(\"groupIds\", \"a4\")});\n let gidD = i32(${getUniform(\"groupIds\", \"b4\")});\n if ((gidA >= 0 && gidC >= 0 && gidA == gidC) || (gidA >= 0 && gidD >= 0 && gidA == gidD) ||\n (gidB >= 0 && gidC >= 0 && gidB == gidC) || (gidB >= 0 && gidD >= 0 && gidB == gidD)) {\n continue;\n }\n var A2 = particles[a4];\n var B2 = particles[b4];\n let x3 = A2.position.x; let y3 = A2.position.y;\n let x4 = B2.position.x; let y4 = B2.position.y;\n // Broadphase AABB overlap test for segments (no thickness)\n let min1x = min(x1, x2); let max1x = max(x1, x2);\n let min1y = min(y1, y2); let max1y = max(y1, y2);\n let min2x = min(x3, x4); let max2x = max(x3, x4);\n let min2y = min(y3, y4); let max2y = max(y3, y4);\n if (max1x < min2x || max2x < min1x || max1y < min2y || max2y < min1y) { continue; }\n let dx1 = x2 - x1; let dy1 = y2 - y1;\n let dx2 = x4 - x3; let dy2 = y4 - y3;\n let denom = dx1 * dy2 - dy1 * dx2;\n if (abs(denom) < 1e-6) { continue; }\n let t = ((x3 - x1) * dy2 - (y3 - y1) * dx2) / denom;\n let u = ((x3 - x1) * dy1 - (y3 - y1) * dx1) / denom;\n if (t >= 0.0 && t <= 1.0 && u >= 0.0 && u <= 1.0) {\n // Intersection detected: nudge current particle away along midpoint normal\n let m1 = vec2<f32>((x1 + x2) * 0.5, (y1 + y2) * 0.5);\n let m2 = vec2<f32>((x3 + x4) * 0.5, (y3 + y4) * 0.5);\n var n = m1 - m2;\n let n2 = dot(n, n);\n if (n2 < 1e-6) {\n // random tiny direction based on index\n let ang = fract(sin(f32(index) * 12.9898) * 43758.5453) * 6.283185307;\n n = vec2<f32>(cos(ang), sin(ang));\n } else {\n n = normalize(n);\n }\n let sep = ${getUniform(\"separation\")};\n ${particleVar}.position = ${particleVar}.position + n * sep;\n // Only one nudge per incident joint per iteration\n break;\n }\n }\n }\n }\n }\n}`,\n\n // CCD against joints with substeps, then apply momentum preservation after constraint solving\n correct: ({ particleVar, getUniform, getLength, getState, dtVar }) => `{\n let jointCount = ${getLength(\"aIndexes\")};\n if (jointCount == 0u) { return; }\n \n // Determine if this particle has joints via CSR (used for CCD and momentum)\n var hasJoint = false;\n let offLen2 = ${getLength(\"incidentJointOffsets\")};\n if (offLen2 > 1u) {\n let idx1c = index + 1u;\n if (idx1c < offLen2) {\n let s2 = u32(${getUniform(\"incidentJointOffsets\", \"index\")});\n let e2 = u32(${getUniform(\"incidentJointOffsets\", \"idx1c\")});\n hasJoint = (e2 > s2);\n }\n }\n if (${getUniform(\"enableParticleCollisions\")} > 0.0) {\n // Substep CCD: sweep particle (as a circle of radius r) from previous to current position\n let prevX = ${getState(\"prevX\")};\n let prevY = ${getState(\"prevY\")};\n let p0 = vec2<f32>(prevX, prevY);\n let p1 = ${particleVar}.position;\n let r = ${particleVar}.size;\n // Choose steps from uniform; engine iterates constraints many times\n let steps: u32 = max(1u, u32(${getUniform(\"steps\")}));\n for (var sstep = 1u; sstep <= steps; sstep++) {\n let t = f32(sstep) / f32(steps);\n let ps = mix(p0, p1, t);\n var collided = false;\n var n: vec2<f32> = vec2<f32>(0.0, 0.0);\n for (var j = 0u; j < jointCount; j++) {\n let a = u32(${getUniform(\"aIndexes\", \"j\")});\n let b = u32(${getUniform(\"bIndexes\", \"j\")});\n if (a == index || b == index) { continue; }\n // Skip if same rigid body by two-hop connectivity with current incident joint endpoints\n // We approximate by checking connections to current particle's incident joint endpoints (handled above per j0)\n var A = particles[a];\n var B = particles[b];\n let ab = B.position - A.position;\n let ab2 = dot(ab, ab);\n if (ab2 < 1e-8) { continue; }\n let ap = ps - A.position;\n let u = clamp(dot(ap, ab) / ab2, 0.0, 1.0);\n let closest = A.position + ab * u;\n let pc = ps - closest;\n let d2 = dot(pc, pc);\n if (d2 < r * r && d2 > 1e-10) {\n let d = sqrt(d2);\n n = pc / d;\n collided = true;\n // Re-position to contact, slightly outside to avoid re-penetration\n ${particleVar}.position = closest + n * (r + 0.001);\n // Reflect velocity along normal with restitution and apply tangential friction\n var v = ${particleVar}.velocity;\n let relN = dot(v, n);\n if (relN < 0.0) {\n let e = ${getUniform(\"restitution\")};\n let mu = clamp(${getUniform(\"friction\")}, 0.0, 1.0);\n let vt = v - n * relN;\n let vReflected = v - n * (relN * (1.0 + e));\n let vtScaled = vt * (1.0 - mu);\n ${particleVar}.velocity = vReflected + (vtScaled - vt);\n }\n break;\n }\n }\n if (collided) { break; }\n }\n }\n\n // Joint-segment CCD for joints incident to this particle against other joints\n if (${getUniform(\"enableJointCollisions\")} > 0.0 && hasJoint) {\n let stepsJS: u32 = max(1u, u32(${getUniform(\"steps\")}));\n for (var j0 = 0u; j0 < jointCount; j0++) {\n let a0 = u32(${getUniform(\"aIndexes\", \"j0\")});\n let b0 = u32(${getUniform(\"bIndexes\", \"j0\")});\n var incident = (a0 == index) || (b0 == index);\n if (!incident) { continue; }\n var otherIdx: u32 = a0;\n if (a0 == index) { otherIdx = b0; } else { otherIdx = a0; }\n // Previous positions of both endpoints\n let prevAx = ${getState(\"prevX\")};\n let prevAy = ${getState(\"prevY\")};\n let prevBx = ${getState(\"prevX\", \"otherIdx\")};\n let prevBy = ${getState(\"prevY\", \"otherIdx\")};\n\n for (var sstep2 = 1u; sstep2 <= stepsJS; sstep2++) {\n let t2 = f32(sstep2) / f32(stepsJS);\n let Apos = mix(vec2<f32>(prevAx, prevAy), ${particleVar}.position, t2);\n let Bpos = mix(vec2<f32>(prevBx, prevBy), particles[otherIdx].position, t2);\n // Test against all other joints\n var separated = false;\n for (var k0 = 0u; k0 < jointCount; k0++) {\n if (k0 == j0) { continue; }\n let cIdx = u32(${getUniform(\"aIndexes\", \"k0\")});\n let dIdx = u32(${getUniform(\"bIndexes\", \"k0\")});\n if (cIdx == a0 || cIdx == b0 || dIdx == a0 || dIdx == b0) { continue; }\n // Skip same rigid body using precomputed groupIds\n let gidA0 = i32(${getUniform(\"groupIds\", \"a0\")});\n let gidB0 = i32(${getUniform(\"groupIds\", \"b0\")});\n let gidC0 = i32(${getUniform(\"groupIds\", \"cIdx\")});\n let gidD0 = i32(${getUniform(\"groupIds\", \"dIdx\")});\n if ((gidA0 >= 0 && gidC0 >= 0 && gidA0 == gidC0) || (gidA0 >= 0 && gidD0 >= 0 && gidA0 == gidD0) ||\n (gidB0 >= 0 && gidC0 >= 0 && gidB0 == gidC0) || (gidB0 >= 0 && gidD0 >= 0 && gidB0 == gidD0)) {\n continue;\n }\n let Cpos = particles[cIdx].position;\n let Dpos = particles[dIdx].position;\n // Segment intersect test between Apos->Bpos and Cpos->Dpos\n let r = Bpos - Apos;\n let s = Dpos - Cpos;\n let rxs = r.x * s.y - r.y * s.x;\n if (abs(rxs) < 1e-6) { continue; }\n let q_p = Cpos - Apos;\n let tA = (q_p.x * s.y - q_p.y * s.x) / rxs;\n let uA = (q_p.x * r.y - q_p.y * r.x) / rxs;\n if (tA >= 0.0 && tA <= 1.0 && uA >= 0.0 && uA <= 1.0) {\n // Found crossing; push current particle endpoint out along midpoint normal\n let mAB = (Apos + Bpos) * 0.5;\n let mCD = (Cpos + Dpos) * 0.5;\n let diff = mAB - mCD;\n let len2 = dot(diff, diff);\n var n = vec2<f32>(0.0, 1.0);\n if (len2 > 1e-6) {\n n = diff / sqrt(len2);\n }\n let sep = ${getUniform(\"separation\")};\n ${particleVar}.position = ${particleVar}.position + n * sep;\n separated = true;\n break;\n }\n }\n if (separated) { break; }\n }\n }\n }\n\n let momentum = ${getUniform(\"momentum\")};\n if (momentum <= 0.0 || !hasJoint) { return; }\n \n // Get stored pre-physics position\n let prevX2 = ${getState(\"prevX\")};\n let prevY2 = ${getState(\"prevY\")};\n let prevPos = vec2<f32>(prevX2, prevY2);\n \n // Calculate actual total movement (from pre-physics to post-constraint)\n let totalMovement = ${particleVar}.position - prevPos;\n let actualVelocity = totalMovement / ${dtVar};\n \n // Blend current velocity with actual movement velocity\n ${particleVar}.velocity = ${particleVar}.velocity * (1.0 - momentum) + actualVelocity * momentum;\n}`,\n };\n }\n\n cpu(): CPUDescriptor<JointsInputs, \"prevX\" | \"prevY\"> {\n return {\n states: [\"prevX\", \"prevY\"] as const,\n\n // Store pre-physics positions for momentum preservation (only for particles with incident joints via CSR)\n state: ({ particle, setState, input, index }) => {\n const offsets = (input.incidentJointOffsets as number[]) || [];\n if (index + 1 < offsets.length && offsets[index] < offsets[index + 1]) {\n setState(\"prevX\", particle.position.x);\n setState(\"prevY\", particle.position.y);\n }\n },\n\n // Force part: per-particle two-pass correction (forward + reverse) to reduce order bias\n constrain: ({ particle, index, particles, input }) => {\n if (particle.mass === 0) return;\n const a = input.aIndexes;\n const b = input.bIndexes;\n const rest = input.restLengths;\n const offsets = (input.incidentJointOffsets as number[]) || [];\n const inc = (input.incidentJointIndices as number[]) || [];\n const start = index + 1 < offsets.length ? offsets[index] >>> 0 : 0;\n const end = index + 1 < offsets.length ? offsets[index + 1] >>> 0 : 0;\n const count = Math.min(a.length, b.length, rest.length);\n const half = 0.5;\n const forwardFirst = (index & 1) === 0;\n\n const applyForInc = (k: number) => {\n const j = inc[k] >>> 0;\n const ia = a[j] >>> 0;\n const ib = b[j] >>> 0;\n const otherIndex = ia === index ? ib : ia;\n const other = particles[otherIndex];\n if (!other) return;\n if (other.mass === 0 || particle.mass === 0) return; // immovable or removed\n const dx = other.position.x - particle.position.x;\n const dy = other.position.y - particle.position.y;\n const dist2 = dx * dx + dy * dy;\n if (dist2 < 1e-8) return;\n const dist = Math.sqrt(dist2);\n const rl = rest[j] ?? dist;\n const diff = dist - rl;\n if (Math.abs(diff) < 1e-6) return;\n const invM_self = particle.mass > 0 ? 1 / particle.mass : 0;\n const invM_other = other.mass > 0 ? 1 / other.mass : 0;\n const invSum = invM_self + invM_other;\n if (invSum <= 0) return; // both pinned\n const nx = dx / dist;\n const ny = dy / dist;\n const corrMag = diff * (invM_self / invSum) * half;\n particle.position.x += nx * corrMag;\n particle.position.y += ny * corrMag;\n };\n\n if (forwardFirst) {\n for (let k = start; k < end; k++) applyForInc(k);\n for (let k = end - 1; k >= start; k--) applyForInc(k);\n } else {\n for (let k = end - 1; k >= start; k--) applyForInc(k);\n for (let k = start; k < end; k++) applyForInc(k);\n }\n\n // Optional collision handling\n const enableParticleCollisions = input.enableParticleCollisions;\n const enableJointCollisions = input.enableJointCollisions;\n if (enableParticleCollisions > 0 && particle.mass > 0) {\n // Particle vs Joint: deepest overlap\n let bestOverlap = 0;\n let bestNx = 0;\n let bestNy = 0;\n for (let j2 = 0; j2 < count; j2++) {\n const ia2 = a[j2] >>> 0;\n const ib2 = b[j2] >>> 0;\n if (ia2 === index || ib2 === index) continue;\n const A = particles[ia2];\n const B = particles[ib2];\n if (!A || !B) continue;\n if (A.mass === 0 || B.mass === 0) continue;\n const ABx = B.position.x - A.position.x;\n const ABy = B.position.y - A.position.y;\n const AB2 = ABx * ABx + ABy * ABy;\n if (AB2 < 1e-8) continue;\n // Broadphase AABB reject using particle radius\n const radiusP = particle.size;\n const minx = Math.min(A.position.x, B.position.x) - radiusP;\n const maxx = Math.max(A.position.x, B.position.x) + radiusP;\n const miny = Math.min(A.position.y, B.position.y) - radiusP;\n const maxy = Math.max(A.position.y, B.position.y) + radiusP;\n const px = particle.position.x;\n const py = particle.position.y;\n if (px < minx || px > maxx || py < miny || py > maxy) continue;\n const APx = particle.position.x - A.position.x;\n const APy = particle.position.y - A.position.y;\n let t = (APx * ABx + APy * ABy) / AB2;\n t = Math.max(0, Math.min(1, t));\n const cx = A.position.x + ABx * t;\n const cy = A.position.y + ABy * t;\n const pcx = particle.position.x - cx;\n const pcy = particle.position.y - cy;\n const d2 = pcx * pcx + pcy * pcy;\n const r = particle.size;\n if (d2 < r * r && d2 > 1e-8) {\n const d = Math.sqrt(d2);\n const overlap = r - d;\n if (overlap > bestOverlap) {\n bestOverlap = overlap;\n bestNx = pcx / d;\n bestNy = pcy / d;\n }\n }\n }\n if (bestOverlap > 0) {\n const push = Math.min(bestOverlap * 0.6, particle.size);\n particle.position.x += bestNx * push;\n particle.position.y += bestNy * push;\n const vx = particle.velocity.x;\n const vy = particle.velocity.y;\n const relN = vx * bestNx + vy * bestNy;\n const tx = vx - bestNx * relN;\n const ty = vy - bestNy * relN;\n if (relN < 0) {\n const e = input.restitution as number;\n const mu = Math.max(0, Math.min(1, input.friction as number));\n const vRx = vx - bestNx * (relN * (1 + e));\n const vRy = vy - bestNy * (relN * (1 + e));\n const vtScaledX = tx * (1 - mu);\n const vtScaledY = ty * (1 - mu);\n particle.velocity.x = vRx + (vtScaledX - tx);\n particle.velocity.y = vRy + (vtScaledY - ty);\n }\n }\n\n // Joint vs Joint: for joints incident to this particle, nudge on intersection\n if (enableJointCollisions > 0) {\n for (let j3 = 0; j3 < count; j3++) {\n const ia3 = a[j3] >>> 0;\n const ib3 = b[j3] >>> 0;\n const isIncident = ia3 === index || ib3 === index;\n if (!isIncident) continue;\n const A1 = particles[ia3];\n const B1 = particles[ib3];\n if (!A1 || !B1) continue;\n const x1 = A1.position.x,\n y1 = A1.position.y;\n const x2 = B1.position.x,\n y2 = B1.position.y;\n for (let k = 0; k < count; k++) {\n if (k === j3) continue;\n const ia4 = a[k] >>> 0;\n const ib4 = b[k] >>> 0;\n if (ia4 === ia3 || ia4 === ib3 || ib4 === ia3 || ib4 === ib3)\n continue;\n // Skip same rigid body using groupIds\n const gidA = (input.groupIds as number[])[ia3] ?? -1;\n const gidB = (input.groupIds as number[])[ib3] ?? -1;\n const gidC = (input.groupIds as number[])[ia4] ?? -1;\n const gidD = (input.groupIds as number[])[ib4] ?? -1;\n if (\n (gidA >= 0 && gidC >= 0 && gidA === gidC) ||\n (gidA >= 0 && gidD >= 0 && gidA === gidD) ||\n (gidB >= 0 && gidC >= 0 && gidB === gidC) ||\n (gidB >= 0 && gidD >= 0 && gidB === gidD)\n ) {\n continue;\n }\n const A2 = particles[ia4];\n const B2 = particles[ib4];\n if (!A2 || !B2) continue;\n const x3 = A2.position.x,\n y3 = A2.position.y;\n const x4 = B2.position.x,\n y4 = B2.position.y;\n const dx1 = x2 - x1,\n dy1 = y2 - y1;\n const dx2 = x4 - x3,\n dy2 = y4 - y3;\n const denom = dx1 * dy2 - dy1 * dx2;\n if (Math.abs(denom) < 1e-6) continue;\n const t = ((x3 - x1) * dy2 - (y3 - y1) * dx2) / denom;\n const u = ((x3 - x1) * dy1 - (y3 - y1) * dx1) / denom;\n if (t >= 0 && t <= 1 && u >= 0 && u <= 1) {\n const m1x = (x1 + x2) * 0.5,\n m1y = (y1 + y2) * 0.5;\n const m2x = (x3 + x4) * 0.5,\n m2y = (y3 + y4) * 0.5;\n let nx = m1x - m2x;\n let ny = m1y - m2y;\n const n2 = nx * nx + ny * ny;\n if (n2 < 1e-6) {\n const ang =\n (Math.sin(index * 12.9898) -\n Math.floor(Math.sin(index * 12.9898))) *\n Math.PI *\n 2;\n nx = Math.cos(ang);\n ny = Math.sin(ang);\n } else {\n const nlen = Math.sqrt(n2);\n nx /= nlen;\n ny /= nlen;\n }\n const sep = (input.separation as number) ?? 0.12;\n particle.position.x += nx * sep;\n particle.position.y += ny * sep;\n // no velocity impulse; rely on positional nudge and engine iterations\n break;\n }\n }\n }\n }\n }\n },\n\n // CCD against joints with substeps, then apply momentum preservation after constraint solving\n correct: ({\n particle,\n getState,\n dt,\n prevPos,\n particles,\n input,\n index,\n }) => {\n if (dt <= 0) return;\n // Determine CSR-based incident joints once for this particle\n const offsets = (input.incidentJointOffsets as number[]) || [];\n const hasJoints =\n index + 1 < offsets.length && offsets[index] < offsets[index + 1];\n // Substep CCD on CPU path\n const enableParticleCollisions =\n input.enableParticleCollisions as number;\n if (enableParticleCollisions > 0 && hasJoints) {\n const a = input.aIndexes;\n const b = input.bIndexes;\n const count = Math.min(a.length, b.length);\n const p0x = prevPos.x,\n p0y = prevPos.y;\n const p1x = particle.position.x,\n p1y = particle.position.y;\n const r = particle.size;\n const steps = Math.max(\n 1,\n Math.min(128, Math.floor((input.steps as number) || 1))\n );\n outer: for (let s = 1; s <= steps; s++) {\n const t = s / steps;\n const psx = p0x + (p1x - p0x) * t;\n const psy = p0y + (p1y - p0y) * t;\n for (let j = 0; j < count; j++) {\n const ia = a[j] >>> 0;\n const ib = b[j] >>> 0;\n if (ia === index || ib === index) continue;\n const A = particles[ia];\n const B = particles[ib];\n if (!A || !B) continue;\n const abx = B.position.x - A.position.x;\n const aby = B.position.y - A.position.y;\n const ab2 = abx * abx + aby * aby;\n if (ab2 < 1e-8) continue;\n // (Optional) Light AABB reject around segment using particle's swept AABB\n const sweepMinX = Math.min(p0x, p1x) - r;\n const sweepMaxX = Math.max(p0x, p1x) + r;\n const sweepMinY = Math.min(p0y, p1y) - r;\n const sweepMaxY = Math.max(p0y, p1y) + r;\n const segMinX = Math.min(A.position.x, B.position.x);\n const segMaxX = Math.max(A.position.x, B.position.x);\n const segMinY = Math.min(A.position.y, B.position.y);\n const segMaxY = Math.max(A.position.y, B.position.y);\n if (\n segMaxX < sweepMinX ||\n sweepMaxX < segMinX ||\n segMaxY < sweepMinY ||\n sweepMaxY < segMinY\n )\n continue;\n const apx = psx - A.position.x;\n const apy = psy - A.position.y;\n let u = (apx * abx + apy * aby) / ab2;\n if (u < 0) u = 0;\n else if (u > 1) u = 1;\n const cx = A.position.x + abx * u;\n const cy = A.position.y + aby * u;\n const pcx = psx - cx;\n const pcy = psy - cy;\n const d2 = pcx * pcx + pcy * pcy;\n if (d2 < r * r && d2 > 1e-10) {\n const d = Math.sqrt(d2);\n const nx = pcx / d;\n const ny = pcy / d;\n particle.position.x = cx + nx * (r + 0.001);\n particle.position.y = cy + ny * (r + 0.001);\n const vx = particle.velocity.x;\n const vy = particle.velocity.y;\n const relN = vx * nx + vy * ny;\n const tx = vx - nx * relN;\n const ty = vy - ny * relN;\n if (relN < 0) {\n const e = input.restitution as number;\n const mu = Math.max(0, Math.min(1, input.friction as number));\n const vRx = vx - nx * (relN * (1 + e));\n const vRy = vy - ny * (relN * (1 + e));\n const vtScaledX = tx * (1 - mu);\n const vtScaledY = ty * (1 - mu);\n particle.velocity.x = vRx + (vtScaledX - tx);\n particle.velocity.y = vRy + (vtScaledY - ty);\n }\n break outer;\n }\n }\n }\n }\n\n // Joint-segment CCD for joints incident to this particle against other joints (CPU)\n const enableJointCollisions = input.enableJointCollisions as number;\n if (enableJointCollisions > 0 && hasJoints) {\n const steps = Math.max(\n 1,\n Math.min(128, Math.floor((input.steps as number) || 1))\n );\n const a2 = input.aIndexes;\n const b2 = input.bIndexes;\n const count2 = Math.min(a2.length, b2.length);\n for (let j0 = 0; j0 < count2; j0++) {\n const a0 = a2[j0] >>> 0;\n const b0 = b2[j0] >>> 0;\n const incident = a0 === index || b0 === index;\n if (!incident) continue;\n const otherIdx = a0 === index ? b0 : a0;\n\n const prevAx = getState(\"prevX\");\n const prevAy = getState(\"prevY\");\n const otherPid = particles[otherIdx]?.id;\n const prevBx = getState(\"prevX\", otherPid);\n const prevBy = getState(\"prevY\", otherPid);\n\n outer2: for (let s = 1; s <= steps; s++) {\n const t = s / steps;\n const Aposx = prevAx + (particle.position.x - prevAx) * t;\n const Aposy = prevAy + (particle.position.y - prevAy) * t;\n const Bcur = particles[otherIdx];\n if (!Bcur) break;\n const Bposx = prevBx + (Bcur.position.x - prevBx) * t;\n const Bposy = prevBy + (Bcur.position.y - prevBy) * t;\n\n for (let k0 = 0; k0 < count2; k0++) {\n if (k0 === j0) continue;\n const cIdx = a2[k0] >>> 0;\n const dIdx = b2[k0] >>> 0;\n if (cIdx === a0 || cIdx === b0 || dIdx === a0 || dIdx === b0)\n continue;\n // Skip same rigid body using precomputed groupIds\n const gidA0 = (input.groupIds as number[])[a0] ?? -1;\n const gidB0 = (input.groupIds as number[])[b0] ?? -1;\n const gidC0 = (input.groupIds as number[])[cIdx] ?? -1;\n const gidD0 = (input.groupIds as number[])[dIdx] ?? -1;\n if (\n (gidA0 >= 0 && gidC0 >= 0 && gidA0 === gidC0) ||\n (gidA0 >= 0 && gidD0 >= 0 && gidA0 === gidD0) ||\n (gidB0 >= 0 && gidC0 >= 0 && gidB0 === gidC0) ||\n (gidB0 >= 0 && gidD0 >= 0 && gidB0 === gidD0)\n ) {\n continue;\n }\n const C = particles[cIdx];\n const D = particles[dIdx];\n if (!C || !D) continue;\n const Cx = C.position.x,\n Cy = C.position.y;\n const Dx = D.position.x,\n Dy = D.position.y;\n\n const rx = Bposx - Aposx,\n ry = Bposy - Aposy;\n const sx = Dx - Cx,\n sy = Dy - Cy;\n const rxs = rx * sy - ry * sx;\n if (Math.abs(rxs) < 1e-6) continue;\n const qpx = Cx - Aposx,\n qpy = Cy - Aposy;\n const tA = (qpx * sy - qpy * sx) / rxs;\n const uA = (qpx * ry - qpy * rx) / rxs;\n if (tA >= 0 && tA <= 1 && uA >= 0 && uA <= 1) {\n const mABx = (Aposx + Bposx) * 0.5;\n const mABy = (Aposy + Bposy) * 0.5;\n const mCDx = (Cx + Dx) * 0.5;\n const mCDy = (Cy + Dy) * 0.5;\n let nx = mABx - mCDx;\n let ny = mABy - mCDy;\n const n2 = nx * nx + ny * ny;\n if (n2 < 1e-9) {\n nx = 0;\n ny = 1;\n } else {\n const inv = 1 / Math.sqrt(n2);\n nx *= inv;\n ny *= inv;\n }\n const sep = (input.separation as number) ?? 0.12;\n particle.position.x += nx * sep;\n particle.position.y += ny * sep;\n break outer2;\n }\n }\n }\n }\n }\n\n const momentum = this.readValue(\"momentum\") as number;\n if (momentum <= 0 || !hasJoints) return;\n\n // Get stored pre-physics position\n const prevX = getState(\"prevX\");\n const prevY = getState(\"prevY\");\n\n // Calculate actual total movement (from pre-physics to post-constraint)\n const totalMovementX = particle.position.x - prevX;\n const totalMovementY = particle.position.y - prevY;\n const actualVelocityX = totalMovementX / dt;\n const actualVelocityY = totalMovementY / dt;\n\n // Blend current velocity with actual movement velocity\n particle.velocity.x =\n particle.velocity.x * (1 - momentum) + actualVelocityX * momentum;\n particle.velocity.y =\n particle.velocity.y * (1 - momentum) + actualVelocityY * momentum;\n },\n };\n }\n}\n","/**\n * Grab (Force Module)\n *\n * Handles particle grabbing during mouse drag operations. When a particle is grabbed\n * (grabbedIndex >= 0), it positions the particle at the specified coordinates and\n * sets its velocity to zero during the constrain phase. This approach is much more\n * efficient than syncing the entire particle array on every mouse move event.\n */\nimport {\n Module,\n type WebGPUDescriptor,\n ModuleRole,\n CPUDescriptor,\n DataType,\n} from \"../../module\";\n\nexport const DEFAULT_GRAB_GRABBED_INDEX = -1;\nexport const DEFAULT_GRAB_POSITION_X = 0;\nexport const DEFAULT_GRAB_POSITION_Y = 0;\n\ntype GrabInputs = {\n grabbedIndex: number;\n positionX: number;\n positionY: number;\n};\n\nexport class Grab extends Module<\"grab\", GrabInputs> {\n readonly name = \"grab\" as const;\n readonly role = ModuleRole.Force;\n readonly inputs = {\n grabbedIndex: DataType.NUMBER,\n positionX: DataType.NUMBER,\n positionY: DataType.NUMBER,\n } as const;\n\n constructor(opts?: {\n enabled?: boolean;\n grabbedIndex?: number;\n positionX?: number;\n positionY?: number;\n }) {\n super();\n\n this.write({\n grabbedIndex: opts?.grabbedIndex ?? DEFAULT_GRAB_GRABBED_INDEX,\n positionX: opts?.positionX ?? DEFAULT_GRAB_POSITION_X,\n positionY: opts?.positionY ?? DEFAULT_GRAB_POSITION_Y,\n });\n\n if (opts?.enabled !== undefined) {\n this.setEnabled(!!opts.enabled);\n }\n }\n\n // Input setters\n setGrabbedIndex(value: number): void {\n this.write({ grabbedIndex: Math.floor(value) });\n }\n\n setPositionX(value: number): void {\n this.write({ positionX: value });\n }\n\n setPositionY(value: number): void {\n this.write({ positionY: value });\n }\n\n setPosition(position: { x: number; y: number }): void {\n this.write({ positionX: position.x, positionY: position.y });\n }\n\n // Input getters\n getGrabbedIndex(): number {\n return this.readValue(\"grabbedIndex\");\n }\n\n getPositionX(): number {\n return this.readValue(\"positionX\");\n }\n\n getPositionY(): number {\n return this.readValue(\"positionY\");\n }\n\n getPosition(): { x: number; y: number } {\n return {\n x: this.getPositionX(),\n y: this.getPositionY(),\n };\n }\n\n // Convenience methods\n grabParticle(index: number, position: { x: number; y: number }): void {\n this.write({\n grabbedIndex: index,\n positionX: position.x,\n positionY: position.y,\n });\n }\n\n releaseParticle(): void {\n this.setGrabbedIndex(-1);\n }\n\n isGrabbing(): boolean {\n return this.getGrabbedIndex() >= 0;\n }\n\n webgpu(): WebGPUDescriptor<GrabInputs> {\n return {\n correct: ({ particleVar, getUniform }) => `{\n // Only the invocation matching the grabbed index should apply the correction\n let gi_f = ${getUniform(\"grabbedIndex\")};\n let gi = u32(gi_f);\n if (gi != index) { return; }\n let count = arrayLength(&particles);\n if (gi < 0 || gi >= count || count == 0u) { return; }\n \n // Update only this particle (current invocation)\n if (${particleVar}.mass > 0.0) {\n ${particleVar}.position.x = ${getUniform(\"positionX\")};\n ${particleVar}.position.y = ${getUniform(\"positionY\")};\n ${particleVar}.velocity.x = 0.0;\n ${particleVar}.velocity.y = 0.0;\n }\n}`,\n };\n }\n\n cpu(): CPUDescriptor<GrabInputs> {\n return {\n correct: ({ particle, particles, input, index }) => {\n const grabbedIndex = Math.floor(input.grabbedIndex);\n if (\n grabbedIndex != index ||\n grabbedIndex < 0 ||\n grabbedIndex >= particles.length ||\n particles.length == 0\n ) {\n return;\n }\n\n // Only grab particles that are not pinned (mass > 0)\n if (particle.mass > 0) {\n // Position the grabbed particle at the target position\n particle.position.x = input.positionX;\n particle.position.y = input.positionY;\n\n // Set velocity to zero to prevent drift\n particle.velocity.x = 0;\n particle.velocity.y = 0;\n }\n },\n };\n }\n}\n","/**\n * Trails (Render Module)\n *\n * Two compute image passes over the scene texture:\n * - decay: exponential fade toward clear color with alpha decay\n * - diffuse: gaussian-like blur with configurable radius\n * Both read from input texture and write to output, participating in ping-pong.\n */\nimport {\n Module,\n type WebGPUDescriptor,\n ModuleRole,\n RenderPassKind,\n CPUDescriptor,\n CanvasComposition,\n DataType,\n} from \"../../module\";\n\nexport const DEFAULT_TRAILS_TRAIL_DECAY = 10;\nexport const DEFAULT_TRAILS_TRAIL_DIFFUSE = 0.0;\n\ntype TrailsInputs = {\n trailDecay: number;\n trailDiffuse: number;\n};\n\nexport class Trails extends Module<\"trails\", TrailsInputs> {\n readonly name = \"trails\" as const;\n readonly role = ModuleRole.Render;\n readonly inputs = {\n trailDecay: DataType.NUMBER,\n trailDiffuse: DataType.NUMBER,\n } as const;\n\n constructor(opts?: {\n enabled?: boolean;\n trailDecay?: number;\n trailDiffuse?: number;\n }) {\n super();\n this.write({\n trailDecay: opts?.trailDecay ?? DEFAULT_TRAILS_TRAIL_DECAY,\n trailDiffuse: opts?.trailDiffuse ?? DEFAULT_TRAILS_TRAIL_DIFFUSE,\n });\n\n if (opts?.enabled !== undefined) {\n this.setEnabled(!!opts.enabled);\n }\n }\n\n setTrailDecay(value: number): void {\n this.write({ trailDecay: value });\n }\n\n setTrailDiffuse(value: number): void {\n this.write({ trailDiffuse: value });\n }\n\n getTrailDecay(): number {\n return this.readValue(\"trailDecay\");\n }\n getTrailDiffuse(): number {\n return this.readValue(\"trailDiffuse\");\n }\n\n webgpu(): WebGPUDescriptor<TrailsInputs> {\n return {\n passes: [\n {\n kind: RenderPassKind.Compute,\n kernel: ({ getUniform, readScene, writeScene }) => `{\n let coords = vec2<i32>(i32(gid.x), i32(gid.y));\n let current = ${readScene(\"coords\")};\n let d = clamp(${getUniform(\"trailDecay\")} * 0.005, 0.0, 1.0);\n if (d <= 0.00001) { ${writeScene(\"coords\", \"current\")}; return; }\n let bg = vec3<f32>(${getUniform(\"clearColorR\")}, ${getUniform(\n \"clearColorG\"\n )}, ${getUniform(\"clearColorB\")});\n let out_rgb = mix(current.rgb, bg, d);\n let out_a = current.a * (1.0 - d);\n let eps = 1.0 / 255.0;\n if (all(abs(out_rgb - bg) < vec3<f32>(eps)) && out_a < eps) {\n ${writeScene(\"coords\", \"vec4<f32>(bg, 0.0)\")};\n } else {\n ${writeScene(\"coords\", \"vec4<f32>(out_rgb, out_a)\")};\n }\n}`,\n bindings: [\"trailDecay\"] as const,\n readsScene: true,\n writesScene: true,\n },\n {\n kind: RenderPassKind.Compute,\n kernel: ({ getUniform, readScene, writeScene }) => `{\n let coords = vec2<i32>(i32(gid.x), i32(gid.y));\n let dims = textureDimensions(input_texture);\n let radius_i = clamp(i32(round(${getUniform(\"trailDiffuse\")})), 0, 12);\n if (radius_i <= 0) { ${writeScene(\n \"coords\",\n `${readScene(\"coords\")}`\n )}; return; }\n let sigma = max(0.5, f32(radius_i) * 0.5);\n let twoSigma2 = 2.0 * sigma * sigma;\n var sum = vec4<f32>(0.0, 0.0, 0.0, 0.0);\n var wsum: f32 = 0.0;\n for (var dy = -radius_i; dy <= radius_i; dy++) {\n for (var dx = -radius_i; dx <= radius_i; dx++) {\n let d2 = f32(dx*dx + dy*dy);\n let w = exp(-d2 / twoSigma2);\n if (w < 1e-5) { continue; }\n let sample_coords = coords + vec2<i32>(dx, dy);\n let clamped_coords = clamp(sample_coords, vec2<i32>(0, 0), vec2<i32>(i32(dims.x) - 1, i32(dims.y) - 1));\n let c = ${readScene(\"clamped_coords\")};\n sum += c * w;\n wsum += w;\n }\n }\n if (wsum > 0.0) {\n ${writeScene(\"coords\", \"sum / vec4<f32>(wsum)\")};\n } else {\n ${writeScene(\"coords\", `${readScene(\"coords\")}`)};\n }\n}`,\n bindings: [\"trailDiffuse\"] as const,\n readsScene: true,\n writesScene: true,\n },\n ],\n };\n }\n\n cpu(): CPUDescriptor<TrailsInputs> {\n return {\n composition: CanvasComposition.HandlesBackground,\n setup: ({ context, input, clearColor }) => {\n // Trail effect with decay and blur - match WebGPU behavior\n const canvas = context.canvas;\n const decay = Math.max(0, Math.min(100, input.trailDecay));\n const diffuse = Math.max(\n 0,\n Math.min(12, Math.round(input.trailDiffuse))\n );\n\n // Apply decay (fade effect) - simple overlay approach with factor to match WebGPU speed\n if (decay > 0.00001) {\n const adjustedDecay = Math.min(1.0, decay * 0.005);\n context.save();\n context.globalCompositeOperation = \"source-over\";\n context.fillStyle = `rgba(${clearColor.r * 255}, ${\n clearColor.g * 255\n }, ${clearColor.b * 255}, ${adjustedDecay})`;\n context.fillRect(0, 0, canvas.width, canvas.height);\n context.restore();\n }\n\n // Apply blur effect if diffuse > 0\n if (diffuse > 0) {\n // Use canvas filter for blur - more performant than manual pixel manipulation\n const tempCanvas = document.createElement(\"canvas\");\n const tempCtx = tempCanvas.getContext(\"2d\")!;\n tempCanvas.width = canvas.width;\n tempCanvas.height = canvas.height;\n\n // Copy current canvas to temp canvas\n tempCtx.drawImage(canvas, 0, 0);\n\n // Apply blur filter and draw back\n context.filter = `blur(${diffuse * 0.5}px)`;\n context.drawImage(tempCanvas, 0, 0);\n context.filter = \"none\";\n }\n },\n };\n }\n}\n","import {\n Module,\n ModuleRole,\n type WebGPUDescriptor,\n CPUDescriptor,\n DataType,\n RenderPassKind,\n CanvasComposition,\n} from \"../../module\";\n\nexport interface Line {\n aIndex: number;\n bIndex: number;\n}\n\ntype LinesInputs = {\n aIndexes: number[];\n bIndexes: number[];\n lineWidth: number;\n lineColorR: number;\n lineColorG: number;\n lineColorB: number;\n};\n\nexport class Lines extends Module<\"lines\", LinesInputs> {\n readonly name = \"lines\" as const;\n readonly role = ModuleRole.Render;\n readonly inputs = {\n aIndexes: DataType.ARRAY,\n bIndexes: DataType.ARRAY,\n lineWidth: DataType.NUMBER,\n lineColorR: DataType.NUMBER,\n lineColorG: DataType.NUMBER,\n lineColorB: DataType.NUMBER,\n } as const;\n\n constructor(opts?: {\n enabled?: boolean;\n lines?: Line[];\n aIndexes?: number[];\n bIndexes?: number[];\n lineWidth?: number;\n }) {\n super();\n\n // Handle lines array if provided, otherwise use separate arrays\n let aIndexes: number[], bIndexes: number[];\n if (opts?.lines) {\n aIndexes = opts.lines.map((l) => l.aIndex);\n bIndexes = opts.lines.map((l) => l.bIndex);\n } else {\n aIndexes = opts?.aIndexes ?? [];\n bIndexes = opts?.bIndexes ?? [];\n }\n\n this.write({\n aIndexes,\n bIndexes,\n lineWidth: opts?.lineWidth ?? 1.5,\n lineColorR: -1,\n lineColorG: -1,\n lineColorB: -1,\n });\n if (opts?.enabled !== undefined) this.setEnabled(!!opts.enabled);\n }\n\n getLines(): Line[] {\n const aIndexes = this.readArray(\"aIndexes\") as number[];\n const bIndexes = this.readArray(\"bIndexes\") as number[];\n\n const lines: Line[] = [];\n const length = Math.min(aIndexes.length, bIndexes.length);\n for (let i = 0; i < length; i++) {\n lines.push({\n aIndex: aIndexes[i],\n bIndex: bIndexes[i],\n });\n }\n return lines;\n }\n\n setLines(lines: Line[]): void;\n setLines(aIndexes: number[], bIndexes: number[]): void;\n setLines(linesOrAIndexes: Line[] | number[], bIndexes?: number[]): void {\n let aIndexes: number[], bIndexesArray: number[];\n\n // Check if first argument is Line[] or number[]\n if (bIndexes === undefined) {\n // First overload: Line[]\n const lines = linesOrAIndexes as Line[];\n aIndexes = lines.map((l) => l.aIndex);\n bIndexesArray = lines.map((l) => l.bIndex);\n } else {\n // Second overload: separate arrays\n aIndexes = linesOrAIndexes as number[];\n bIndexesArray = bIndexes;\n }\n\n this.write({ aIndexes, bIndexes: bIndexesArray });\n }\n\n setLineWidth(value: number): void {\n this.write({ lineWidth: value });\n }\n\n setLineColor(\n color: { r: number; g: number; b: number; a: number } | null\n ): void {\n if (color) {\n this.write({\n lineColorR: color.r,\n lineColorG: color.g,\n lineColorB: color.b,\n });\n } else {\n this.write({ lineColorR: -1, lineColorG: -1, lineColorB: -1 });\n }\n }\n\n getLineColor(): { r: number; g: number; b: number; a: number } | null {\n const r = this.readValue(\"lineColorR\");\n const g = this.readValue(\"lineColorG\");\n const b = this.readValue(\"lineColorB\");\n if (r >= 0 && g >= 0 && b >= 0) return { r, g, b, a: 1 };\n return null;\n }\n\n add(line: Line): void {\n const currentLines = this.getLines();\n\n // Normalize line (ensure aIndex <= bIndex) and dedupe\n let { aIndex, bIndex } = line;\n if (aIndex === bIndex) return; // Skip self-lines\n if (bIndex < aIndex) [aIndex, bIndex] = [bIndex, aIndex];\n\n // Check for duplicates\n for (const existing of currentLines) {\n let { aIndex: existingA, bIndex: existingB } = existing;\n if (existingB < existingA)\n [existingA, existingB] = [existingB, existingA];\n if (existingA === aIndex && existingB === bIndex) return;\n }\n\n // Add the line\n currentLines.push({ aIndex, bIndex });\n this.setLines(currentLines);\n }\n\n remove(aIndex: number, bIndex: number): void {\n const currentLines = this.getLines();\n\n // Normalize indices for comparison\n let searchA = aIndex,\n searchB = bIndex;\n if (searchB < searchA) [searchA, searchB] = [searchB, searchA];\n\n // Find and remove the line (works with flipped indices too)\n const filteredLines = currentLines.filter((line) => {\n let { aIndex: lineA, bIndex: lineB } = line;\n if (lineB < lineA) [lineA, lineB] = [lineB, lineA];\n return !(lineA === searchA && lineB === searchB);\n });\n\n this.setLines(filteredLines);\n }\n\n removeAll(): void {\n this.setLines([]);\n }\n\n webgpu(): WebGPUDescriptor<LinesInputs> {\n return {\n passes: [\n {\n kind: RenderPassKind.Fullscreen,\n instanced: true,\n instanceFrom: \"aIndexes\",\n // Vertex: position quad in NDC for a line instance, minimal work in fragment\n vertex: ({ getUniform }) => `{\n let ia = u32(${getUniform(\"aIndexes\", \"instance_index\")});\n let ib = u32(${getUniform(\"bIndexes\", \"instance_index\")});\n let pa = particles[ia];\n let pb = particles[ib];\n // Cull if either endpoint is removed (mass == 0)\n if (pa.mass == 0.0 || pb.mass == 0.0) {\n out.position = vec4<f32>(2.0, 2.0, 1.0, 1.0);\n } else {\n let a = (pa.position - render_uniforms.camera_position) * render_uniforms.zoom;\n let b = (pb.position - render_uniforms.camera_position) * render_uniforms.zoom;\n let lw = max(1.0, ${getUniform(\"lineWidth\")});\n let dir = normalize(b - a + vec2<f32>(1e-6, 0.0));\n let n = vec2<f32>(-dir.y, dir.x);\n let halfW = (lw * 0.5);\n let ax = (a.x * 2.0) / render_uniforms.canvas_size.x;\n let ay = (-a.y * 2.0) / render_uniforms.canvas_size.y;\n let bx = (b.x * 2.0) / render_uniforms.canvas_size.x;\n let by = (-b.y * 2.0) / render_uniforms.canvas_size.y;\n let nx = (n.x * halfW * 2.0) / render_uniforms.canvas_size.x;\n let ny = (-n.y * halfW * 2.0) / render_uniforms.canvas_size.y;\n let quad = array<vec2<f32>,4>(\n vec2<f32>(ax - nx, ay - ny),\n vec2<f32>(bx - nx, by - ny),\n vec2<f32>(ax + nx, ay + ny),\n vec2<f32>(bx + nx, by + ny)\n );\n // Pass color from particle A\n out.color = pa.color;\n out.position = vec4<f32>(quad[li], 0.0, 1.0);\n }\n}`,\n fragment: ({ sampleScene, getUniform }) => `{\n // Simple overwrite blend with alpha compositing\n var dst = ${sampleScene(\"uv\")};\n let lc = vec3<f32>(\n ${getUniform(\"lineColorR\")},\n ${getUniform(\"lineColorG\")},\n ${getUniform(\"lineColorB\")}\n );\n let useOverride = ${getUniform(\"lineColorR\")} >= 0.0;\n var src: vec4<f32> = color;\n if (useOverride) {\n src = vec4<f32>(lc, 1.0);\n }\n let outc = dst + src * (1.0 - dst.a);\n return vec4<f32>(outc.rgb, min(1.0, outc.a));\n}`,\n bindings: [\n \"lineWidth\",\n \"lineColorR\",\n \"lineColorG\",\n \"lineColorB\",\n ] as const,\n readsScene: true,\n writesScene: true,\n },\n ],\n };\n }\n\n cpu(): CPUDescriptor<LinesInputs> {\n return {\n composition: CanvasComposition.Additive,\n setup: ({ context, input, view, particles }) => {\n const a = (this.readArray(\"aIndexes\") as number[]) || [];\n const b = (this.readArray(\"bIndexes\") as number[]) || [];\n const lw = typeof input.lineWidth === \"number\" ? input.lineWidth : 1.5;\n const r = (input as any).lineColorR as number;\n const g = (input as any).lineColorG as number;\n const bcol = (input as any).lineColorB as number;\n const overrideColor =\n r >= 0 && g >= 0 && bcol >= 0 ? { r, g, b: bcol, a: 1 } : null;\n\n const camera = view.getCamera();\n const zoom = view.getZoom();\n const size = view.getSize();\n const centerX = size.width / 2;\n const centerY = size.height / 2;\n\n context.save();\n context.lineWidth = lw;\n context.globalCompositeOperation = \"source-over\";\n const count = Math.min(a.length, b.length);\n for (let i = 0; i < count; i++) {\n const ia = a[i] >>> 0;\n const ib = b[i] >>> 0;\n const pa = particles[ia];\n const pb = particles[ib];\n if (!pa || !pb) continue;\n if (pa.mass === 0 || pb.mass === 0) continue; // skip removed\n // Screen-space coords\n const ax = centerX + (pa.position.x - camera.x) * zoom;\n const ay = centerY + (pa.position.y - camera.y) * zoom;\n const bx = centerX + (pb.position.x - camera.x) * zoom;\n const by = centerY + (pb.position.y - camera.y) * zoom;\n const c = overrideColor ?? pa.color;\n context.strokeStyle = `rgba(${c.r * 255}, ${c.g * 255}, ${\n c.b * 255\n }, ${c.a})`;\n context.beginPath();\n context.moveTo(ax, ay);\n context.lineTo(bx, by);\n context.stroke();\n }\n context.restore();\n },\n };\n }\n}\n","/**\n * Particles (Render Module)\n *\n * Single fullscreen pass that instanced-draws particle quads into the scene.\n * Fragment shader renders a soft-disc using the particle color and alpha falloff.\n */\nimport {\n Module,\n type WebGPUDescriptor,\n ModuleRole,\n RenderPassKind,\n CPUDescriptor,\n CanvasComposition,\n DataType,\n} from \"../../module\";\n\nexport enum ParticlesColorType {\n Default = 0,\n Custom = 1,\n Hue = 2,\n}\n\ntype ParticlesInputs = {\n colorType: number; // ParticleColorType enum value\n customColorR: number; // 0..1\n customColorG: number; // 0..1\n customColorB: number; // 0..1\n hue: number; // 0..1\n};\n\nexport class Particles extends Module<\"particles\", ParticlesInputs> {\n readonly name = \"particles\" as const;\n readonly role = ModuleRole.Render;\n readonly inputs = {\n colorType: DataType.NUMBER,\n customColorR: DataType.NUMBER,\n customColorG: DataType.NUMBER,\n customColorB: DataType.NUMBER,\n hue: DataType.NUMBER,\n } as const;\n\n constructor(opts?: {\n enabled?: boolean;\n colorType?: ParticlesColorType;\n customColor?: { r: number; g: number; b: number; a: number };\n hue?: number;\n }) {\n super();\n this.write({\n colorType: opts?.colorType ?? ParticlesColorType.Default,\n customColorR: opts?.customColor?.r ?? 1,\n customColorG: opts?.customColor?.g ?? 1,\n customColorB: opts?.customColor?.b ?? 1,\n hue: Math.min(1, Math.max(0, opts?.hue ?? 0)),\n });\n if (opts?.enabled !== undefined) this.setEnabled(!!opts.enabled);\n }\n\n setColorType(type: ParticlesColorType): void {\n this.write({ colorType: type });\n }\n\n setCustomColor(color: { r: number; g: number; b: number; a: number }): void {\n this.write({\n customColorR: color.r,\n customColorG: color.g,\n customColorB: color.b,\n });\n }\n\n setHue(hue: number): void {\n const clamped = Math.min(1, Math.max(0, hue));\n this.write({ hue: clamped });\n }\n\n webgpu(): WebGPUDescriptor<ParticlesInputs> {\n return {\n // Single fullscreen pass that draws particles into the scene texture\n passes: [\n {\n kind: RenderPassKind.Fullscreen,\n fragment: ({ getUniform }) => `{\n let center = vec2<f32>(0.5, 0.5);\n let dist = distance(uv, center);\n \n // Fetch uniforms\n let colorType = ${getUniform(\"colorType\")};\n let custom = vec3<f32>(\n ${getUniform(\"customColorR\")},\n ${getUniform(\"customColorG\")},\n ${getUniform(\"customColorB\")}\n );\n let hue = ${getUniform(\"hue\")};\n var baseColor = color;\n if (colorType == 1.0) {\n baseColor = vec4<f32>(custom, 1.0); // Custom RGB with alpha 1\n } else if (colorType == 2.0) {\n // Inline hue->RGB conversion at full saturation/value\n let h = fract(hue) * 6.0;\n let i = floor(h);\n let f = h - i;\n let q = 1.0 - f;\n var rgb = vec3<f32>(1.0, 0.0, 0.0);\n if (i < 1.0) {\n rgb = vec3<f32>(1.0, f, 0.0);\n } else if (i < 2.0) {\n rgb = vec3<f32>(q, 1.0, 0.0);\n } else if (i < 3.0) {\n rgb = vec3<f32>(0.0, 1.0, f);\n } else if (i < 4.0) {\n rgb = vec3<f32>(0.0, q, 1.0);\n } else if (i < 5.0) {\n rgb = vec3<f32>(f, 0.0, 1.0);\n } else {\n rgb = vec3<f32>(1.0, 0.0, q);\n }\n baseColor = vec4<f32>(rgb, 1.0);\n }\n\n var finalColor = baseColor.rgb;\n var finalAlpha = baseColor.a;\n \n // Pinned particles render as hollow circles (donut shape)\n if (mass < 0.0) {\n // Create hollow ring effect\n let innerRadius = 0.30;\n let outerRadius = 0.45;\n let edgeSmooth = 0.05;\n \n // Calculate ring alpha based on distance\n var ringAlpha = 1.0 - smoothstep(outerRadius - edgeSmooth, outerRadius + edgeSmooth, dist);\n ringAlpha = ringAlpha * smoothstep(innerRadius - edgeSmooth, innerRadius + edgeSmooth, dist);\n \n finalAlpha = finalAlpha * ringAlpha;\n } else {\n // Normal solid particle\n finalAlpha = finalAlpha * (1.0 - smoothstep(0.45, 0.5, dist));\n }\n \n return vec4<f32>(finalColor, finalAlpha);\n}`,\n bindings: [\n \"colorType\",\n \"customColorR\",\n \"customColorG\",\n \"customColorB\",\n \"hue\",\n ] as const,\n readsScene: false,\n writesScene: true,\n },\n ],\n };\n }\n\n cpu(): CPUDescriptor<ParticlesInputs> {\n return {\n composition: CanvasComposition.RequiresClear,\n render: ({\n particle,\n screenX,\n screenY,\n screenSize,\n utils,\n context,\n input,\n }) => {\n // Determine render color based on input colorType\n const type = typeof input.colorType === \"number\" ? input.colorType : 0;\n let rgba = particle.color;\n if (type === 1) {\n const r = (input as any).customColorR as number;\n const g = (input as any).customColorG as number;\n const b = (input as any).customColorB as number;\n rgba = { r: r ?? 1, g: g ?? 1, b: b ?? 1, a: 1 };\n } else if (type === 2) {\n const h = Math.min(\n 1,\n Math.max(0, typeof input.hue === \"number\" ? input.hue : 0)\n );\n // Convert hue to RGB (HSV with S=1, V=1)\n const h6 = h * 6;\n const i = Math.floor(h6);\n const f = h6 - i;\n const q = 1 - f;\n switch (i % 6) {\n case 0:\n rgba = { r: 1, g: f, b: 0, a: 1 };\n break;\n case 1:\n rgba = { r: q, g: 1, b: 0, a: 1 };\n break;\n case 2:\n rgba = { r: 0, g: 1, b: f, a: 1 };\n break;\n case 3:\n rgba = { r: 0, g: q, b: 1, a: 1 };\n break;\n case 4:\n rgba = { r: f, g: 0, b: 1, a: 1 };\n break;\n default:\n rgba = { r: 1, g: 0, b: q, a: 1 };\n }\n }\n if (particle.mass < 0) {\n // Draw hollow circle for pinned particles\n const color = rgba;\n const lineWidth = Math.max(2, screenSize * 0.15); // Ring width scales with particle size\n\n context.strokeStyle = `rgba(${color.r * 255}, ${color.g * 255}, ${\n color.b * 255\n }, ${color.a})`;\n context.lineWidth = lineWidth;\n context.beginPath();\n context.arc(\n screenX,\n screenY,\n screenSize - lineWidth / 2,\n 0,\n Math.PI * 2\n );\n context.stroke();\n } else {\n // Draw solid circle for normal particles\n utils.drawCircle(screenX, screenY, screenSize, rgba);\n }\n },\n };\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/runtimes/webgpu/shaders.ts","../src/runtimes/webgpu/gpu-resources.ts","../src/runtimes/webgpu/particle-store.ts","../src/view.ts","../src/oscillators.ts","../src/interfaces.ts","../src/module.ts","../src/runtimes/webgpu/builders/program.ts","../src/runtimes/webgpu/module-registry.ts","../src/runtimes/webgpu/spacial-grid.ts","../src/runtimes/webgpu/simulation-pipeline.ts","../src/runtimes/webgpu/builders/render-pass.ts","../src/runtimes/webgpu/render-pipeline.ts","../src/runtimes/webgpu/engine.ts","../src/runtimes/cpu/spatial-grid.ts","../src/vector.ts","../src/particle.ts","../src/runtimes/cpu/engine.ts","../src/engine.ts","../src/spawner.ts","../src/modules/forces/environment.ts","../src/modules/forces/boundary.ts","../src/modules/forces/collisions.ts","../src/modules/forces/fluids.ts","../src/modules/forces/behavior.ts","../src/modules/forces/sensors.ts","../src/modules/forces/interaction.ts","../src/modules/forces/joints.ts","../src/modules/forces/grab.ts","../src/modules/render/trails.ts","../src/modules/render/lines.ts","../src/modules/render/particles.ts"],"sourcesContent":["/**\n * Presentation shader (copy)\n *\n * Minimal fullscreen copy shader used to present the rendered scene texture to the canvas.\n * A small pipeline built with this WGSL is cached per canvas format.\n */\nexport const copyShaderWGSL = `\nstruct VertexOutput {\n @builtin(position) position: vec4<f32>,\n @location(0) uv: vec2<f32>,\n}\n\n@group(0) @binding(0) var source_texture: texture_2d<f32>;\n@group(0) @binding(1) var source_sampler: sampler;\n\n@vertex\nfn vs_main(@builtin(vertex_index) vertex_index: u32) -> VertexOutput {\n var out: VertexOutput;\n let positions = array<vec2<f32>, 4>(\n vec2<f32>(-1.0, -1.0),\n vec2<f32>( 1.0, -1.0),\n vec2<f32>(-1.0, 1.0),\n vec2<f32>( 1.0, 1.0)\n );\n let uvs = array<vec2<f32>, 4>(\n vec2<f32>(0.0, 1.0),\n vec2<f32>(1.0, 1.0),\n vec2<f32>(0.0, 0.0),\n vec2<f32>(1.0, 0.0)\n );\n let index = vertex_index % 4u;\n out.position = vec4<f32>(positions[index], 0.0, 1.0);\n out.uv = uvs[index];\n return out;\n}\n\n@fragment\nfn fs_main(@location(0) uv: vec2<f32>) -> @location(0) vec4<f32> {\n return textureSample(source_texture, source_sampler, uv);\n}`;\n","/**\n * GPUResources\n *\n * Low-level WebGPU resource manager. Responsible for:\n * - Adapter/device/context acquisition and canvas configuration\n * - Creation and caching of GPU buffers, textures, bind group layouts, and pipelines\n * - Managing ping-pong scene textures and a small shader cache keyed by WGSL hashes\n * - Building compute pipeline layouts from the generated Program and creating per-pass pipelines\n * - Providing helpers to write CPU data into GPU buffers and to create bind groups\n * - Cleaning up all GPU objects on dispose\n */\nimport { copyShaderWGSL } from \"./shaders\";\nimport type { Program, ModuleUniformLayout } from \"./builders/program\";\nimport { ViewSnapshot } from \"../../view\";\n\nexport interface SceneTextures {\n a: GPUTexture;\n b: GPUTexture;\n viewA: GPUTextureView;\n viewB: GPUTextureView;\n sampler: GPUSampler;\n}\n\nexport type ModuleUniformBuffer = {\n buffer: GPUBuffer;\n layout: ModuleUniformLayout;\n};\n\nexport interface SimulationPipelines {\n gridClear?: GPUComputePipeline;\n gridBuild?: GPUComputePipeline;\n state?: GPUComputePipeline;\n apply?: GPUComputePipeline;\n integrate?: GPUComputePipeline;\n constrain?: GPUComputePipeline;\n correct?: GPUComputePipeline;\n main?: GPUComputePipeline; // fallback main\n}\n\nexport class GPUResources {\n private particleBuffer: GPUBuffer | null = null;\n private moduleUniformBuffers: ModuleUniformBuffer[] = [];\n private combinedArrayStorageBuffers: Map<string, GPUBuffer> = new Map(); // moduleName -> combined buffer\n private arrayStorageBuffers: Map<string, GPUBuffer> = new Map();\n private arrayLengthBuffers: Map<string, GPUBuffer> = new Map();\n private renderUniformBuffer: GPUBuffer | null = null;\n private renderBindGroupLayoutCache: Map<string, GPUBindGroupLayout> | null =\n null;\n private computeBindGroupLayout: GPUBindGroupLayout | null = null;\n private computePipelineLayout: GPUPipelineLayout | null = null;\n private simulationPipelines: SimulationPipelines = {};\n private gridCountsBuffer: GPUBuffer | null = null;\n private gridIndicesBuffer: GPUBuffer | null = null;\n private simStateBuffer: GPUBuffer | null = null;\n private scene: SceneTextures | null = null;\n private currentScene: \"A\" | \"B\" = \"A\";\n private sceneSize: { width: number; height: number } | null = null;\n private copyPipelines: Map<string, GPURenderPipeline> = new Map();\n private simUniformCache: Float32Array | null = null;\n private fullscreenPipelines: Map<string, GPURenderPipeline> = new Map();\n private imageComputePipelines: Map<string, GPUComputePipeline> = new Map();\n private hashWGSL(code: string): string {\n // djb2\n let h = 5381;\n for (let i = 0; i < code.length; i++)\n h = ((h << 5) + h) ^ code.charCodeAt(i);\n return (h >>> 0).toString(36);\n }\n\n public canvas: HTMLCanvasElement;\n public requiredFeatures: GPUFeatureName[] = [];\n public device: GPUDevice | null = null;\n public context: GPUCanvasContext | null = null;\n public adapter: GPUAdapter | null = null;\n public format: GPUTextureFormat = \"bgra8unorm\";\n\n // Tracks an in-flight dispose so we can (a) avoid overlapping cleanups and\n // (b) wait for cleanup before re-initializing on rapid reloads.\n private disposePromise: Promise<void> | null = null;\n\n constructor(options: {\n canvas: HTMLCanvasElement;\n requiredFeatures?: GPUFeatureName[];\n }) {\n this.canvas = options.canvas;\n this.requiredFeatures = options.requiredFeatures || [];\n }\n\n async initialize(): Promise<void> {\n if (this.isInitialized()) return;\n if (!navigator.gpu) {\n throw new Error(\"WebGPU not supported\");\n }\n\n // If we're in the middle of disposing (common during rapid reloads / runtime toggles),\n // wait for it to finish before requesting a new adapter/device.\n if (this.disposePromise) {\n try {\n await this.disposePromise;\n } catch {\n // ignore\n }\n }\n\n // Safari workaround: Ensure canvas is visible and has dimensions before WebGPU initialization\n // Safari requires the canvas to be properly sized and in the DOM before getting WebGPU context\n if (this.canvas.width === 0 || this.canvas.height === 0) {\n // Set minimum dimensions if canvas has no size\n const rect = this.canvas.getBoundingClientRect();\n if (rect.width > 0 && rect.height > 0) {\n this.canvas.width = rect.width;\n this.canvas.height = rect.height;\n } else {\n // Fallback to reasonable defaults\n this.canvas.width = 800;\n this.canvas.height = 600;\n }\n }\n\n // Helper function to add timeout to async operations\n const withTimeout = <T>(\n promise: Promise<T>,\n timeoutMs: number,\n operation: string\n ): Promise<T> => {\n return Promise.race([\n promise,\n new Promise<T>((_, reject) =>\n setTimeout(\n () => reject(new Error(`WebGPU ${operation} timed out after ${timeoutMs}ms`)),\n timeoutMs\n )\n ),\n ]);\n };\n\n try {\n // Step 1: Request adapter with timeout\n this.adapter = await withTimeout(\n navigator.gpu.requestAdapter(),\n 5000,\n \"adapter request\"\n );\n\n if (!this.adapter) {\n throw new Error(\"Failed to get WebGPU adapter\");\n }\n\n // Step 2: Request device with timeout\n // Request the maximum buffer size limit to avoid buffer size errors\n const maxBufferSize = this.adapter.limits.maxBufferSize || this.adapter.limits.maxStorageBufferBindingSize;\n this.device = await withTimeout(\n this.adapter.requestDevice({\n requiredFeatures: this.requiredFeatures || [],\n requiredLimits: {\n maxStorageBufferBindingSize: this.adapter.limits.maxStorageBufferBindingSize,\n maxBufferSize: maxBufferSize,\n },\n }),\n 5000,\n \"device request\"\n );\n\n // Step 3: Get WebGPU context\n this.context = this.canvas.getContext(\"webgpu\");\n if (!this.context) {\n throw new Error(\"Failed to get WebGPU context\");\n }\n\n // Step 4: Get preferred format\n // Note: getPreferredCanvasFormat() is synchronous, so we can't timeout it\n // If it hangs, the browser is likely in a bad state\n try {\n this.format = navigator.gpu.getPreferredCanvasFormat();\n } catch (error) {\n // Safari fallback: use a default format if getPreferredCanvasFormat fails\n console.warn(\"[WebGPU] getPreferredCanvasFormat failed, using fallback format:\", error);\n this.format = \"bgra8unorm\"; // Default format\n }\n\n // Step 5: Configure context\n this.context.configure({\n device: this.device,\n format: this.format,\n alphaMode: \"premultiplied\",\n });\n } catch (error) {\n console.error(\"[WebGPU] Initialization failed:\", error);\n // Clean up any partial state\n this.adapter = null;\n this.device = null;\n this.context = null;\n throw error;\n }\n }\n\n /**\n * Starts disposal (idempotent) and returns a promise you can await *optionally*.\n * We keep the public destroy()/dispose() calls synchronous to avoid breaking runtime toggle,\n * but callers that care (like runtime toggle) can await this promise.\n */\n isInitialized(): boolean {\n return this.device !== null && this.context !== null;\n }\n\n getDevice(): GPUDevice {\n if (!this.device) throw new Error(\"Device not initialized\");\n return this.device;\n }\n\n getContext(): GPUCanvasContext {\n if (!this.context) throw new Error(\"Context not initialized\");\n return this.context;\n }\n\n getParticleBuffer(): GPUBuffer | null {\n return this.particleBuffer;\n }\n\n getModuleUniformBuffers(): ModuleUniformBuffer[] {\n return this.moduleUniformBuffers;\n }\n\n getRenderUniformBuffer(): GPUBuffer | null {\n return this.renderUniformBuffer;\n }\n\n getGridCountsBuffer(): GPUBuffer | null {\n return this.gridCountsBuffer;\n }\n\n getGridIndicesBuffer(): GPUBuffer | null {\n return this.gridIndicesBuffer;\n }\n\n getSimStateBuffer(): GPUBuffer | null {\n return this.simStateBuffer;\n }\n\n createParticleBuffer(maxParticles: number, floatsPerParticle: number): void {\n const size = maxParticles * floatsPerParticle * 4;\n this.particleBuffer?.destroy();\n this.particleBuffer = this.getDevice().createBuffer({\n size,\n usage:\n GPUBufferUsage.STORAGE |\n GPUBufferUsage.COPY_DST |\n GPUBufferUsage.COPY_SRC,\n });\n }\n\n writeParticleSlice(offsetFloats: number, data: Float32Array): void {\n if (!this.particleBuffer) return;\n this.getDevice().queue.writeBuffer(\n this.particleBuffer,\n offsetFloats * 4,\n data.buffer,\n data.byteOffset,\n data.byteLength\n );\n }\n\n writeParticleBuffer(data: Float32Array): void {\n if (!this.particleBuffer) return;\n this.getDevice().queue.writeBuffer(\n this.particleBuffer,\n 0,\n data.buffer,\n data.byteOffset,\n data.byteLength\n );\n }\n\n /**\n * Reads particle data back from GPU to CPU\n */\n async readParticleBuffer(sizeFloats: number): Promise<Float32Array> {\n if (!this.particleBuffer) {\n throw new Error(\"Particle buffer not initialized\");\n }\n\n const sizeBytes = sizeFloats * 4;\n\n // Create staging buffer for readback\n const stagingBuffer = this.getDevice().createBuffer({\n size: sizeBytes,\n usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,\n });\n\n try {\n // Copy from particle buffer to staging buffer\n const encoder = this.getDevice().createCommandEncoder();\n encoder.copyBufferToBuffer(\n this.particleBuffer,\n 0,\n stagingBuffer,\n 0,\n sizeBytes\n );\n\n // Submit commands and wait for completion\n this.getDevice().queue.submit([encoder.finish()]);\n await this.getDevice().queue.onSubmittedWorkDone();\n\n // Map and read the staging buffer\n await stagingBuffer.mapAsync(GPUMapMode.READ);\n const arrayBuffer = stagingBuffer.getMappedRange();\n const data = new Float32Array(arrayBuffer.slice(0));\n stagingBuffer.unmap();\n\n return data;\n } finally {\n stagingBuffer.destroy();\n }\n }\n\n createModuleUniformBuffers(layouts: ModuleUniformLayout[]): void {\n // Destroy old\n this.moduleUniformBuffers.forEach(({ buffer }) => buffer.destroy());\n this.moduleUniformBuffers = layouts.map((layout) => ({\n buffer: this.getDevice().createBuffer({\n size: layout.sizeBytes,\n usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n }),\n layout: layout,\n }));\n }\n\n createRenderUniformBuffer(byteSize: number): void {\n this.renderUniformBuffer?.destroy();\n this.renderUniformBuffer = this.getDevice().createBuffer({\n size: byteSize,\n usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n });\n }\n\n writeRenderUniforms(snapshot: ViewSnapshot): void {\n const data = new Float32Array([\n snapshot.width,\n snapshot.height,\n snapshot.cx,\n snapshot.cy,\n snapshot.zoom,\n 0,\n ]);\n if (!this.renderUniformBuffer) return;\n this.getDevice().queue.writeBuffer(\n this.renderUniformBuffer,\n 0,\n data.buffer,\n data.byteOffset,\n data.byteLength\n );\n }\n\n writeModuleUniform(index: number, data: ArrayBufferView, offset = 0): void {\n const muf = this.moduleUniformBuffers[index];\n if (!muf) return;\n this.getDevice().queue.writeBuffer(\n muf.buffer,\n offset,\n data.buffer,\n data.byteOffset,\n data.byteLength\n );\n }\n\n /**\n * Writes simulation uniforms (dt, count, simStride) into the internal\n * 'simulation' uniform buffer using the provided Program's layout.\n */\n writeSimulationUniform(\n program: Program,\n values: {\n dt?: number;\n count?: number;\n simStride?: number;\n maxSize?: number;\n iteration?: number;\n maxNeighbors?: number;\n maxParticles?: number;\n }\n ): void {\n const idx = program.layouts.findIndex((l) => l.moduleName === \"simulation\");\n if (idx === -1) return;\n const layout = program.layouts[idx];\n const map = layout.mapping as Record<string, { flatIndex: number }>;\n // Start from cache to preserve previously written fields across partial updates\n const data =\n this.simUniformCache?.length === layout.vec4Count * 4\n ? new Float32Array(this.simUniformCache)\n : new Float32Array(layout.vec4Count * 4);\n if (values.dt !== undefined && map.dt) data[map.dt.flatIndex] = values.dt;\n if (values.count !== undefined && map.count)\n data[map.count.flatIndex] = values.count;\n if (values.simStride !== undefined && map.simStride)\n data[map.simStride.flatIndex] = values.simStride;\n if (values.maxSize !== undefined && map.maxSize)\n data[map.maxSize.flatIndex] = values.maxSize;\n if (values.iteration !== undefined && map.iteration)\n data[map.iteration.flatIndex] = values.iteration;\n if (values.maxNeighbors !== undefined && map.maxNeighbors)\n data[map.maxNeighbors.flatIndex] = values.maxNeighbors;\n if (values.maxParticles !== undefined && map.maxParticles)\n data[map.maxParticles.flatIndex] = values.maxParticles;\n this.writeModuleUniform(idx, data);\n this.simUniformCache = data;\n }\n\n ensureSceneTextures(width: number, height: number): void {\n // Validate dimensions (must be within unsigned long range: 0 to 2^32-1)\n // Also clamp to reasonable maximum to avoid GPU memory issues\n const maxDimension = 16384; // Reasonable max texture size\n const validWidth = Math.max(1, Math.min(Math.floor(width), maxDimension));\n const validHeight = Math.max(1, Math.min(Math.floor(height), maxDimension));\n \n if (width !== validWidth || height !== validHeight) {\n console.warn(\n `[WebGPU] Texture dimensions clamped from ${width}x${height} to ${validWidth}x${validHeight}`\n );\n }\n\n const needInit = !this.scene;\n const changed =\n !this.sceneSize ||\n this.sceneSize.width !== validWidth ||\n this.sceneSize.height !== validHeight;\n if (!needInit && !changed) return;\n\n // Destroy old textures if present\n if (this.scene) {\n this.scene.a.destroy();\n this.scene.b.destroy();\n }\n\n const texDesc: GPUTextureDescriptor = {\n size: { width: validWidth, height: validHeight, depthOrArrayLayers: 1 },\n format: \"rgba8unorm\",\n usage:\n GPUTextureUsage.STORAGE_BINDING |\n GPUTextureUsage.TEXTURE_BINDING |\n GPUTextureUsage.COPY_DST |\n GPUTextureUsage.RENDER_ATTACHMENT,\n };\n const a = this.getDevice().createTexture(texDesc);\n const b = this.getDevice().createTexture(texDesc);\n const viewA = a.createView();\n const viewB = b.createView();\n const sampler = this.getDevice().createSampler({\n magFilter: \"linear\",\n minFilter: \"linear\",\n addressModeU: \"clamp-to-edge\",\n addressModeV: \"clamp-to-edge\",\n });\n this.scene = { a, b, viewA, viewB, sampler };\n this.sceneSize = { width: validWidth, height: validHeight };\n this.currentScene = \"A\";\n }\n\n createGridStorage(totalCells: number, maxPerCell: number): void {\n const countsSize = totalCells * 4;\n const indicesSize = totalCells * maxPerCell * 4;\n this.gridCountsBuffer?.destroy();\n this.gridIndicesBuffer?.destroy();\n this.gridCountsBuffer = this.getDevice().createBuffer({\n size: countsSize,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n this.gridIndicesBuffer = this.getDevice().createBuffer({\n size: indicesSize,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n }\n\n createSimStateBuffer(maxParticles: number, strideFloats: number): void {\n const size = maxParticles * strideFloats * 4;\n this.simStateBuffer?.destroy();\n this.simStateBuffer = this.getDevice().createBuffer({\n size,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n }\n\n getCurrentSceneTextureView(): GPUTextureView {\n if (!this.scene) throw new Error(\"Scene textures not initialized\");\n return this.currentScene === \"A\" ? this.scene.viewA : this.scene.viewB;\n }\n\n getOtherSceneTextureView(): GPUTextureView {\n if (!this.scene) throw new Error(\"Scene textures not initialized\");\n return this.currentScene === \"A\" ? this.scene.viewB : this.scene.viewA;\n }\n\n getSceneSampler(): GPUSampler {\n if (!this.scene) throw new Error(\"Scene textures not initialized\");\n return this.scene.sampler;\n }\n\n swapSceneTextures(): void {\n this.currentScene = this.currentScene === \"A\" ? \"B\" : \"A\";\n }\n\n getRenderBindGroupLayout(\n arrayInputs?: string[],\n fragmentParticleAccess?: boolean\n ): GPUBindGroupLayout {\n // Create a cache key based on array inputs and fragment access\n const cacheKey = arrayInputs\n ? `render_${arrayInputs.sort().join(\"_\")}_frag_${\n fragmentParticleAccess || false\n }`\n : `render_basic_frag_${fragmentParticleAccess || false}`;\n\n // Check if we have a cached layout for this configuration\n if (!this.renderBindGroupLayoutCache) {\n this.renderBindGroupLayoutCache = new Map();\n }\n\n const cached = this.renderBindGroupLayoutCache.get(cacheKey);\n if (cached) return cached;\n\n const entries: GPUBindGroupLayoutEntry[] = [\n {\n binding: 0,\n visibility: fragmentParticleAccess\n ? GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT\n : GPUShaderStage.VERTEX,\n buffer: { type: \"read-only-storage\" },\n },\n {\n binding: 1,\n visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n {\n binding: 2,\n visibility: GPUShaderStage.FRAGMENT,\n texture: { sampleType: \"float\" },\n },\n {\n binding: 3,\n visibility: GPUShaderStage.FRAGMENT,\n sampler: {},\n },\n {\n binding: 4,\n visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n ];\n\n // Add single combined array storage buffer entry if module has arrays\n if (arrayInputs && arrayInputs.length > 0) {\n entries.push({\n binding: 5,\n visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n buffer: { type: \"read-only-storage\" },\n });\n }\n\n const layout = this.getDevice().createBindGroupLayout({ entries });\n this.renderBindGroupLayoutCache.set(cacheKey, layout);\n return layout;\n }\n\n buildComputeLayouts(compute: Program): void {\n const entries: GPUBindGroupLayoutEntry[] = [];\n entries.push({\n binding: 0,\n visibility: GPUShaderStage.COMPUTE,\n buffer: { type: \"storage\" },\n });\n for (const layout of compute.layouts) {\n // Only include internal and force-module uniforms in compute bind group layout\n if (\n layout.moduleName === \"simulation\" ||\n layout.moduleName === \"grid\" ||\n layout.moduleRole === \"force\"\n ) {\n entries.push({\n binding: layout.bindingIndex,\n visibility: GPUShaderStage.COMPUTE,\n buffer: { type: \"uniform\" },\n });\n }\n }\n // Add combined array storage buffer bindings (one per module)\n if (compute.extraBindings.arrays) {\n for (const [_moduleName, bindings] of Object.entries(\n compute.extraBindings.arrays\n )) {\n entries.push({\n binding: bindings.arrayBinding,\n visibility: GPUShaderStage.COMPUTE,\n buffer: { type: \"read-only-storage\" },\n });\n // Length is now stored in main uniform buffer, no separate binding needed\n }\n }\n if (compute.extraBindings.grid) {\n entries.push({\n binding: compute.extraBindings.grid.countsBinding,\n visibility: GPUShaderStage.COMPUTE,\n buffer: { type: \"storage\" },\n });\n entries.push({\n binding: compute.extraBindings.grid.indicesBinding,\n visibility: GPUShaderStage.COMPUTE,\n buffer: { type: \"storage\" },\n });\n }\n if (compute.extraBindings.simState) {\n entries.push({\n binding: compute.extraBindings.simState.stateBinding,\n visibility: GPUShaderStage.COMPUTE,\n buffer: { type: \"storage\" },\n });\n }\n if (compute.extraBindings.sceneTexture) {\n entries.push({\n binding: compute.extraBindings.sceneTexture.textureBinding,\n visibility: GPUShaderStage.COMPUTE,\n texture: { sampleType: \"float\" },\n });\n }\n this.computeBindGroupLayout = this.getDevice().createBindGroupLayout({\n entries,\n });\n this.computePipelineLayout = this.getDevice().createPipelineLayout({\n bindGroupLayouts: [this.computeBindGroupLayout],\n });\n }\n\n getComputeBindGroupLayout(): GPUBindGroupLayout {\n if (!this.computeBindGroupLayout)\n throw new Error(\"Compute bind group layout not built\");\n return this.computeBindGroupLayout;\n }\n\n buildComputePipelines(code: string): void {\n if (!this.computeBindGroupLayout || !this.computePipelineLayout) return;\n const module = this.getDevice().createShaderModule({ code });\n const createComputePipelineForEntry = (\n entryPoint: string\n ): GPUComputePipeline =>\n this.getDevice().createComputePipeline({\n layout: this.computePipelineLayout!,\n compute: { module, entryPoint },\n });\n const safeCreateComputePipelineForEntry = (\n entryPoint: string\n ): GPUComputePipeline | undefined => {\n try {\n return createComputePipelineForEntry(entryPoint);\n } catch {\n return undefined;\n }\n };\n this.simulationPipelines = {\n main: safeCreateComputePipelineForEntry(\"main\"),\n gridClear: safeCreateComputePipelineForEntry(\"grid_clear\"),\n gridBuild: safeCreateComputePipelineForEntry(\"grid_build\"),\n state: safeCreateComputePipelineForEntry(\"state_pass\"),\n apply: safeCreateComputePipelineForEntry(\"apply_pass\"),\n integrate: safeCreateComputePipelineForEntry(\"integrate_pass\"),\n constrain: safeCreateComputePipelineForEntry(\"constrain_pass\"),\n correct: safeCreateComputePipelineForEntry(\"correct_pass\"),\n };\n }\n\n getSimulationPipelines(): SimulationPipelines {\n return this.simulationPipelines;\n }\n\n getCopyPipeline(format: GPUTextureFormat): GPURenderPipeline {\n const key = `copy:${format}`;\n const existing = this.copyPipelines.get(key);\n if (existing) return existing;\n const copyBindGroupLayout = this.getDevice().createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: GPUShaderStage.FRAGMENT,\n texture: { sampleType: \"float\" },\n },\n {\n binding: 1,\n visibility: GPUShaderStage.FRAGMENT,\n sampler: {},\n },\n ],\n });\n const layout = this.getDevice().createPipelineLayout({\n bindGroupLayouts: [copyBindGroupLayout],\n });\n const shaderModule = this.getDevice().createShaderModule({\n code: copyShaderWGSL,\n });\n const pipeline = this.getDevice().createRenderPipeline({\n layout,\n vertex: { module: shaderModule, entryPoint: \"vs_main\" },\n fragment: {\n module: shaderModule,\n entryPoint: \"fs_main\",\n targets: [\n {\n format,\n // No blending: present should overwrite canvas with scene texture\n },\n ],\n },\n primitive: { topology: \"triangle-strip\" },\n });\n this.copyPipelines.set(key, pipeline);\n return pipeline;\n }\n\n getOrCreateFullscreenRenderPipeline(\n shaderCode: string,\n arrayInputs?: string[],\n fragmentParticleAccess?: boolean\n ): GPURenderPipeline {\n const arrayKey = arrayInputs?.sort().join(\"_\") || \"\";\n const key = `fs:${this.hashWGSL(shaderCode)}:${arrayKey}:frag_${\n fragmentParticleAccess || false\n }`;\n const cached = this.fullscreenPipelines.get(key);\n if (cached) return cached;\n const shaderModule = this.getDevice().createShaderModule({\n code: shaderCode,\n });\n const pipeline = this.getDevice().createRenderPipeline({\n layout: this.getDevice().createPipelineLayout({\n bindGroupLayouts: [\n this.getRenderBindGroupLayout(arrayInputs, fragmentParticleAccess),\n ],\n }),\n vertex: { module: shaderModule, entryPoint: \"vs_main\" },\n fragment: {\n module: shaderModule,\n entryPoint: \"fs_main\",\n targets: [\n {\n format: \"rgba8unorm\",\n blend: {\n color: {\n srcFactor: \"src-alpha\",\n dstFactor: \"one-minus-src-alpha\",\n },\n alpha: { srcFactor: \"one\", dstFactor: \"one-minus-src-alpha\" },\n },\n },\n ],\n },\n primitive: { topology: \"triangle-strip\" },\n });\n this.fullscreenPipelines.set(key, pipeline);\n return pipeline;\n }\n\n getOrCreateImageComputePipeline(shaderCode: string): GPUComputePipeline {\n const key = `imgc:${this.hashWGSL(shaderCode)}`;\n const cached = this.imageComputePipelines.get(key);\n if (cached) return cached;\n const shaderModule = this.getDevice().createShaderModule({\n code: shaderCode,\n });\n const pipeline = this.getDevice().createComputePipeline({\n layout: \"auto\",\n compute: { module: shaderModule, entryPoint: \"cs_main\" },\n });\n this.imageComputePipelines.set(key, pipeline);\n return pipeline;\n }\n\n createFullscreenBindGroup(\n particleBuffer: GPUBuffer,\n renderUniformBuffer: GPUBuffer,\n readSceneView: GPUTextureView,\n sceneSampler: GPUSampler,\n moduleUniformBuffer: GPUBuffer,\n moduleName: string,\n arrayInputs?: string[],\n fragmentParticleAccess?: boolean\n ): GPUBindGroup {\n const entries: GPUBindGroupEntry[] = [\n { binding: 0, resource: { buffer: particleBuffer } },\n { binding: 1, resource: { buffer: renderUniformBuffer } },\n { binding: 2, resource: readSceneView },\n { binding: 3, resource: sceneSampler },\n { binding: 4, resource: { buffer: moduleUniformBuffer } },\n ];\n\n // Add combined array storage buffer entry if module has arrays\n if (arrayInputs && arrayInputs.length > 0) {\n const combinedArrayBuffer =\n this.combinedArrayStorageBuffers.get(moduleName);\n if (combinedArrayBuffer) {\n entries.push({\n binding: 5,\n resource: { buffer: combinedArrayBuffer },\n });\n }\n }\n\n return this.getDevice().createBindGroup({\n layout: this.getRenderBindGroupLayout(\n arrayInputs,\n fragmentParticleAccess\n ),\n entries,\n });\n }\n\n createComputeBindGroup(compute: Program): GPUBindGroup {\n if (!this.computeBindGroupLayout) {\n throw new Error(\"Compute bind group layout not built\");\n }\n if (!this.particleBuffer || this.moduleUniformBuffers.some((b) => !b)) {\n throw new Error(\"Buffers not ready\");\n }\n const entries: GPUBindGroupEntry[] = [\n { binding: 0, resource: { buffer: this.particleBuffer } },\n // Include only uniforms required by compute (internal + force modules)\n ...compute.layouts\n .filter(\n (l) =>\n l.moduleName === \"simulation\" ||\n l.moduleName === \"grid\" ||\n l.moduleRole === \"force\"\n )\n .map((layout) => {\n const muf = this.moduleUniformBuffers.find(\n (b) => b.layout.moduleName === layout.moduleName\n )!;\n return {\n binding: layout.bindingIndex,\n resource: { buffer: muf.buffer },\n };\n }),\n ];\n\n // Add combined array storage buffer bindings (one per module)\n if (compute.extraBindings.arrays) {\n for (const [moduleName, bindings] of Object.entries(\n compute.extraBindings.arrays\n )) {\n const combinedArrayBuffer =\n this.combinedArrayStorageBuffers.get(moduleName);\n\n if (combinedArrayBuffer) {\n entries.push({\n binding: bindings.arrayBinding,\n resource: { buffer: combinedArrayBuffer },\n });\n // Length is now stored in main uniform buffer, no separate binding needed\n }\n }\n }\n if (\n compute.extraBindings.grid &&\n this.gridCountsBuffer &&\n this.gridIndicesBuffer\n ) {\n entries.push(\n {\n binding: compute.extraBindings.grid.countsBinding,\n resource: { buffer: this.gridCountsBuffer },\n },\n {\n binding: compute.extraBindings.grid.indicesBinding,\n resource: { buffer: this.gridIndicesBuffer },\n }\n );\n }\n if (compute.extraBindings.simState && this.simStateBuffer) {\n entries.push({\n binding: compute.extraBindings.simState.stateBinding,\n resource: { buffer: this.simStateBuffer },\n });\n }\n if (compute.extraBindings.sceneTexture) {\n entries.push({\n binding: compute.extraBindings.sceneTexture.textureBinding,\n resource: this.getCurrentSceneTextureView(),\n });\n }\n return this.getDevice().createBindGroup({\n layout: this.computeBindGroupLayout,\n entries,\n });\n }\n\n createImageComputeBindGroup(\n pipeline: GPUComputePipeline,\n readView: GPUTextureView,\n writeView: GPUTextureView,\n moduleUniformBuffer: GPUBuffer,\n moduleName: string,\n arrayInputs?: string[]\n ): GPUBindGroup {\n const layout = pipeline.getBindGroupLayout(0);\n const entries: GPUBindGroupEntry[] = [\n { binding: 0, resource: readView },\n { binding: 1, resource: writeView },\n { binding: 2, resource: { buffer: moduleUniformBuffer } },\n ];\n\n // Add combined array storage buffer entry if module has arrays\n if (arrayInputs && arrayInputs.length > 0) {\n const combinedArrayBuffer =\n this.combinedArrayStorageBuffers.get(moduleName);\n if (combinedArrayBuffer) {\n entries.push({\n binding: 3,\n resource: { buffer: combinedArrayBuffer },\n });\n }\n }\n\n return this.getDevice().createBindGroup({\n layout,\n entries,\n });\n }\n\n /**\n * Create combined array storage buffer for a module's array inputs\n */\n createCombinedArrayStorageBuffer(\n moduleName: string,\n arrayInputs: string[]\n ): void {\n // Clean up old combined buffer for this module\n const existingBuffer = this.combinedArrayStorageBuffers.get(moduleName);\n if (existingBuffer) {\n existingBuffer.destroy();\n this.combinedArrayStorageBuffers.delete(moduleName);\n }\n\n // Only create buffer if module has array inputs\n if (arrayInputs.length > 0) {\n // Create combined array storage buffer (initial size 2MB, will grow as needed)\n const combinedBuffer = this.getDevice().createBuffer({\n size: 2 * 1024 * 1024, // 2MB initial size\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n\n this.combinedArrayStorageBuffers.set(moduleName, combinedBuffer);\n }\n }\n\n /**\n * Create array storage buffers for a module's array inputs\n */\n createArrayStorageBuffers(moduleName: string, arrayInputs: string[]): void {\n // Clean up old buffers for this module\n this.arrayStorageBuffers.forEach((buffer, key) => {\n if (key.startsWith(`${moduleName}_`)) {\n buffer.destroy();\n this.arrayStorageBuffers.delete(key);\n }\n });\n this.arrayLengthBuffers.forEach((buffer, key) => {\n if (key.startsWith(`${moduleName}_`)) {\n buffer.destroy();\n this.arrayLengthBuffers.delete(key);\n }\n });\n\n // Create new buffers\n arrayInputs.forEach((arrayKey) => {\n const storageKey = `${moduleName}_${arrayKey}`;\n\n // Create array storage buffer (initial size 1MB, will grow as needed)\n const arrayBuffer = this.getDevice().createBuffer({\n size: 1024 * 1024, // 1MB initial size\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n\n // Length is now stored in main uniform buffer, no separate buffer needed\n this.arrayStorageBuffers.set(storageKey, arrayBuffer);\n });\n }\n\n /**\n * Write combined array data to storage buffer\n */\n writeCombinedArrayStorage(\n moduleName: string,\n arrayDataMap: Record<string, number[]>,\n arrayOffsets: Record<string, number>\n ): void {\n const combinedBuffer = this.combinedArrayStorageBuffers.get(moduleName);\n if (!combinedBuffer) {\n console.warn(`Combined array storage buffer not found for ${moduleName}`);\n return;\n }\n\n // Calculate total size needed\n let maxOffset = 0;\n for (const [arrayKey, data] of Object.entries(arrayDataMap)) {\n const offset = arrayOffsets[arrayKey] || 0;\n maxOffset = Math.max(maxOffset, offset + data.length);\n }\n\n const requiredSize = maxOffset * 4; // 4 bytes per float\n\n // Check if we need to resize the buffer\n if (requiredSize > combinedBuffer.size) {\n // Recreate with larger size\n combinedBuffer.destroy();\n const newSize = Math.max(requiredSize, combinedBuffer.size * 2);\n const newBuffer = this.getDevice().createBuffer({\n size: newSize,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n this.combinedArrayStorageBuffers.set(moduleName, newBuffer);\n\n // Write all array data to new buffer\n for (const [arrayKey, data] of Object.entries(arrayDataMap)) {\n const offset = arrayOffsets[arrayKey] || 0;\n const arrayData = new Float32Array(data);\n this.getDevice().queue.writeBuffer(\n newBuffer,\n offset * 4, // byte offset\n arrayData.buffer,\n arrayData.byteOffset,\n arrayData.byteLength\n );\n }\n } else {\n // Write array data to existing buffer\n for (const [arrayKey, data] of Object.entries(arrayDataMap)) {\n const offset = arrayOffsets[arrayKey] || 0;\n const arrayData = new Float32Array(data);\n this.getDevice().queue.writeBuffer(\n combinedBuffer,\n offset * 4, // byte offset\n arrayData.buffer,\n arrayData.byteOffset,\n arrayData.byteLength\n );\n }\n }\n }\n\n /**\n * Write array data to storage buffer\n */\n writeArrayStorage(\n moduleName: string,\n arrayKey: string,\n data: number[]\n ): void {\n const storageKey = `${moduleName}_${arrayKey}`;\n const arrayBuffer = this.arrayStorageBuffers.get(storageKey);\n\n if (!arrayBuffer) {\n console.warn(`Array storage buffer not found for ${storageKey}`);\n return;\n }\n\n // Check if we need to resize the buffer\n const requiredSize = data.length * 4;\n if (requiredSize > arrayBuffer.size) {\n // Recreate with larger size\n arrayBuffer.destroy();\n const newSize = Math.max(requiredSize, arrayBuffer.size * 2);\n const newBuffer = this.getDevice().createBuffer({\n size: newSize,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n this.arrayStorageBuffers.set(storageKey, newBuffer);\n\n // Write data to new buffer\n const arrayData = new Float32Array(data);\n this.getDevice().queue.writeBuffer(\n newBuffer,\n 0,\n arrayData.buffer,\n arrayData.byteOffset,\n arrayData.byteLength\n );\n } else {\n // Write data to existing buffer\n const arrayData = new Float32Array(data);\n this.getDevice().queue.writeBuffer(\n arrayBuffer,\n 0,\n arrayData.buffer,\n arrayData.byteOffset,\n arrayData.byteLength\n );\n }\n\n // Length is now written to the main uniform buffer by the module registry\n }\n\n /**\n * Get array storage buffer for a module's array input\n */\n getArrayStorageBuffer(\n moduleName: string,\n arrayKey: string\n ): GPUBuffer | undefined {\n return this.arrayStorageBuffers.get(`${moduleName}_${arrayKey}`);\n }\n\n /**\n * Get array length buffer for a module's array input\n */\n getArrayLengthBuffer(\n moduleName: string,\n arrayKey: string\n ): GPUBuffer | undefined {\n return this.arrayLengthBuffers.get(`${moduleName}_${arrayKey}_length`);\n }\n\n dispose(): Promise<void> {\n if (this.disposePromise) return this.disposePromise;\n this.disposePromise = this.disposeAsync().finally(() => {\n this.disposePromise = null;\n });\n return this.disposePromise;\n }\n\n private async disposeAsync(): Promise<void> {\n // Basic cleanup - just destroy buffers and textures\n this.particleBuffer?.destroy();\n this.moduleUniformBuffers.forEach((muf) => muf.buffer.destroy());\n this.combinedArrayStorageBuffers.forEach((buffer) => buffer.destroy());\n this.arrayStorageBuffers.forEach((buffer) => buffer.destroy());\n this.arrayLengthBuffers.forEach((buffer) => buffer.destroy());\n this.renderUniformBuffer?.destroy();\n this.gridCountsBuffer?.destroy();\n this.gridIndicesBuffer?.destroy();\n this.simStateBuffer?.destroy();\n this.particleBuffer = null;\n this.moduleUniformBuffers = [];\n this.combinedArrayStorageBuffers.clear();\n this.arrayStorageBuffers.clear();\n this.arrayLengthBuffers.clear();\n this.renderUniformBuffer = null;\n this.renderBindGroupLayoutCache?.clear();\n this.renderBindGroupLayoutCache = null;\n this.gridCountsBuffer = null;\n this.gridIndicesBuffer = null;\n this.simStateBuffer = null;\n if (this.scene) {\n this.scene.a.destroy();\n this.scene.b.destroy();\n this.scene = null;\n }\n this.sceneSize = null;\n this.copyPipelines.clear();\n this.fullscreenPipelines.clear();\n this.imageComputePipelines.clear();\n this.computeBindGroupLayout = null;\n this.computePipelineLayout = null;\n\n // Key fix for reload perf degradation:\n // Wait briefly for any queued work to complete before tearing down the context/device.\n // This prevents Chrome GPU-process resource buildup from overlapping device lifetimes.\n if (this.device) {\n try {\n await Promise.race([\n this.device.queue.onSubmittedWorkDone(),\n new Promise((resolve) => setTimeout(resolve, 150)),\n ]);\n } catch {\n // ignore\n }\n }\n\n if (this.context) {\n try {\n this.context.unconfigure();\n } catch (error) {\n console.warn(\"[WebGPU] Error unconfiguring context:\", error);\n }\n }\n\n // Give the browser a tick to process unconfigure before destroying the device.\n await new Promise((resolve) => setTimeout(resolve, 0));\n\n if (this.device) {\n try {\n this.device.destroy();\n } catch (error) {\n console.warn(\"[WebGPU] Error destroying device:\", error);\n }\n }\n\n this.context = null;\n this.device = null;\n this.adapter = null;\n }\n}\n","/**\n * ParticleStore\n *\n * CPU-side SoA-like packed Float32Array for particle attributes with helpers\n * to set/add/read particles and to synchronize active slices to the GPU\n * storage buffer owned by GPUResources.\n *\n * Layout (floatsPerParticle=12):\n * [pos.x, pos.y, vel.x, vel.y, ax, ay, size, mass, color.r, color.g, color.b, color.a]\n */\nimport { GPUResources } from \"./gpu-resources\";\nimport { IParticle } from \"../../interfaces\";\n\n/**\n * CPU-side particle storage and synchronization to GPU storage buffer.\n */\nexport class ParticleStore {\n private readonly maxParticles: number;\n private readonly floatsPerParticle: number;\n private readonly data: Float32Array;\n private count: number = 0;\n\n constructor(maxParticles: number, floatsPerParticle = 12) {\n this.maxParticles = Math.max(0, Math.floor(maxParticles));\n this.floatsPerParticle = Math.max(1, Math.floor(floatsPerParticle));\n this.data = new Float32Array(this.maxParticles * this.floatsPerParticle);\n }\n\n setParticles(list: IParticle[]): void {\n const n = Math.min(list.length, this.maxParticles);\n for (let i = 0; i < n; i++) this.writeAtIndex(i, list[i]);\n this.count = n;\n }\n\n addParticle(p: IParticle): void {\n if (this.count >= this.maxParticles) return;\n this.writeAtIndex(this.count, p);\n this.count++;\n }\n\n clear(): void {\n this.count = 0;\n }\n\n getCount(): number {\n return this.count;\n }\n\n getParticles(): IParticle[] {\n const particles: IParticle[] = [];\n for (let i = 0; i < this.count; i++) {\n particles.push(this.getParticle(i));\n }\n return particles;\n }\n\n getParticle(index: number): IParticle {\n const base = index * this.floatsPerParticle;\n return {\n position: { x: this.data[base + 0], y: this.data[base + 1] },\n velocity: { x: this.data[base + 2], y: this.data[base + 3] },\n size: this.data[base + 6],\n mass: this.data[base + 7],\n color: {\n r: this.data[base + 8],\n g: this.data[base + 9],\n b: this.data[base + 10],\n a: this.data[base + 11],\n },\n };\n }\n\n /**\n * Writes the currently active particle slice to the GPU particle buffer.\n * Assumes the GPU storage buffer has already been created with matching capacity.\n */\n syncToGPU(resources: GPUResources): void {\n if (this.count === 0) return;\n const slice = this.data.subarray(0, this.count * this.floatsPerParticle);\n resources.writeParticleBuffer(slice);\n }\n\n /**\n * Reads particle data back from GPU to CPU, updating the local data array.\n * This ensures getParticles() returns current GPU simulation state.\n */\n async syncFromGPU(resources: GPUResources): Promise<void> {\n if (this.count === 0) return;\n \n const sizeFloats = this.count * this.floatsPerParticle;\n try {\n const gpuData = await resources.readParticleBuffer(sizeFloats);\n \n // Update our CPU-side data with fresh GPU data\n this.data.set(gpuData.subarray(0, sizeFloats));\n \n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Internal: encode one particle into the CPU buffer at a given index.\n */\n private writeAtIndex(index: number, particle: IParticle): void {\n const base = index * this.floatsPerParticle;\n // Layout: pos2, vel2, accel2, size, mass, color4\n this.data[base + 0] = particle.position.x;\n this.data[base + 1] = particle.position.y;\n this.data[base + 2] = particle.velocity.x;\n this.data[base + 3] = particle.velocity.y;\n this.data[base + 4] = 0; // ax\n this.data[base + 5] = 0; // ay\n this.data[base + 6] = particle.size ?? 5;\n this.data[base + 7] = particle.mass ?? 1;\n const c = particle.color ?? { r: 1, g: 1, b: 1, a: 1 };\n this.data[base + 8] = c.r;\n this.data[base + 9] = c.g;\n this.data[base + 10] = c.b;\n this.data[base + 11] = c.a;\n }\n}\n","/**\n * ViewController\n *\n * Tracks canvas size, camera position, and zoom. Provides snapshot and writes\n * render uniforms consumed by render passes (canvas size, camera, zoom).\n * Also enforces simple zoom limits based on canvas size to avoid excessive\n * grid allocation and texture usage.\n */\n\nexport interface ViewSnapshot {\n width: number;\n height: number;\n cx: number;\n cy: number;\n zoom: number;\n}\n\nexport class View {\n private width: number;\n private height: number;\n private cameraX: number = 0;\n private cameraY: number = 0;\n private zoom: number = 1;\n private minZoom: number = 0.01;\n private maxZoom: number = 5;\n\n constructor(width: number, height: number) {\n this.width = Math.max(1, Math.floor(width));\n this.height = Math.max(1, Math.floor(height));\n }\n\n setSize(width: number, height: number): void {\n this.width = Math.max(1, Math.floor(width));\n this.height = Math.max(1, Math.floor(height));\n }\n\n getSize(): { width: number; height: number } {\n return { width: this.width, height: this.height };\n }\n\n setCamera(x: number, y: number): void {\n this.cameraX = x;\n this.cameraY = y;\n }\n\n getCamera(): { x: number; y: number } {\n return { x: this.cameraX, y: this.cameraY };\n }\n\n setZoom(zoom: number): void {\n const size = this.getSize();\n const maxBytes = 120 * 1024 * 1024; // safety threshold below typical 128MB default\n const minZoomByGrid = Math.sqrt((4 * size.width * size.height) / maxBytes);\n const minZoom = Math.max(0.01, minZoomByGrid);\n const clamped = Math.max(minZoom, Math.min(zoom, this.maxZoom));\n this.zoom = clamped;\n }\n\n getZoom(): number {\n return this.zoom;\n }\n\n /**\n * Optional: allow external systems (e.g., GridSystem) to update zoom limits.\n */\n setZoomLimits(minZoom: number, maxZoom: number): void {\n this.minZoom = Math.max(0.0001, minZoom);\n this.maxZoom = Math.max(this.minZoom, maxZoom);\n this.setZoom(this.zoom);\n }\n\n getSnapshot(): ViewSnapshot {\n return {\n width: this.width,\n height: this.height,\n cx: this.cameraX,\n cy: this.cameraY,\n zoom: this.zoom,\n };\n }\n}\n","export type OscillatorKey = string; // `${moduleName}:${inputName}`\n\nexport interface AddOscillatorOptions {\n curveExponent?: number; // default 2\n jitter?: boolean | number; // false | true (0.8–1.2) | explicit multiplier\n initialDirection?: -1 | 1; // seed desired direction\n currentValue?: number; // optional starting value to preserve continuity on start\n phaseOffset?: number; // exact phase offset to preserve when restoring from session\n}\n\nexport interface OscillatorConfigInternal {\n moduleName: string;\n inputName: string;\n min: number;\n max: number;\n speedHz: number;\n curveExponent: number;\n jitterMultiplier: number;\n phaseOffset: number;\n lastValue: number;\n lastDirection: -1 | 0 | 1;\n active: boolean;\n}\n\nexport interface OscillatorPublicConfig {\n moduleName: string;\n inputName: string;\n min: number;\n max: number;\n speedHz: number;\n curveExponent: number;\n jitterMultiplier: number;\n phaseOffset: number;\n lastDirection: -1 | 0 | 1;\n lastValue: number;\n active: boolean;\n}\n\nfunction fnv1a32(str: string): number {\n let hash = 0x811c9dc5;\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i);\n hash = (hash >>> 0) * 0x01000193;\n hash >>>= 0;\n }\n return hash >>> 0;\n}\n\nfunction hashToUnitInterval(input: string): number {\n return fnv1a32(input) / 4294967296; // 2^32\n}\n\nexport class OscillatorManager {\n private keyToIndex: Map<OscillatorKey, number> = new Map();\n private oscillators: OscillatorConfigInternal[] = [];\n private elapsedSeconds: number = 0;\n private setInput: (\n moduleName: string,\n inputName: string,\n value: number\n ) => void;\n private listeners: Map<OscillatorKey, Set<(value: number) => void>> =\n new Map();\n\n constructor(\n setInput: (moduleName: string, inputName: string, value: number) => void\n ) {\n this.setInput = setInput;\n }\n\n private static makeKey(moduleName: string, inputName: string): OscillatorKey {\n return `${moduleName}:${inputName}`;\n }\n\n addOscillator(params: {\n moduleName: string;\n inputName: string;\n min: number;\n max: number;\n speedHz: number;\n options?: AddOscillatorOptions;\n }): OscillatorKey {\n const { moduleName, inputName, min, max, speedHz } = params;\n const opts = params.options ?? {};\n const key = OscillatorManager.makeKey(moduleName, inputName);\n\n const jitterMultiplier =\n typeof opts.jitter === \"number\"\n ? Math.max(0, opts.jitter)\n : opts.jitter === true\n ? 0.8 + 0.4 * hashToUnitInterval(key)\n : 1;\n\n const curveExponent = opts.curveExponent ?? 2;\n\n // Use provided initialDirection, or preserve direction if overwriting, or default to 0\n let lastDirection: -1 | 0 | 1 = opts.initialDirection ?? 0;\n const existingIndex = this.keyToIndex.get(key);\n if (existingIndex !== undefined && opts.initialDirection === undefined) {\n // Only preserve existing direction if no explicit initialDirection was provided\n lastDirection = this.oscillators[existingIndex].lastDirection;\n }\n\n const config: OscillatorConfigInternal = {\n moduleName,\n inputName,\n min,\n max,\n speedHz,\n curveExponent,\n jitterMultiplier,\n phaseOffset: opts.phaseOffset ?? 0,\n lastValue: typeof opts.currentValue === \"number\" ? opts.currentValue : 0,\n lastDirection,\n active: true,\n };\n\n if (existingIndex !== undefined) {\n this.oscillators[existingIndex] = config;\n // Only recalculate phase offset if not explicitly provided\n if (opts.phaseOffset === undefined) {\n this.recalculatePhaseOffset(this.oscillators[existingIndex]);\n }\n return key;\n }\n\n const index = this.oscillators.length;\n this.oscillators.push(config);\n this.keyToIndex.set(key, index);\n // Only recalculate phase offset if not explicitly provided\n if (opts.phaseOffset === undefined) {\n this.recalculatePhaseOffset(this.oscillators[index]);\n }\n return key;\n }\n\n removeOscillator(moduleName: string, inputName: string): void {\n const key = OscillatorManager.makeKey(moduleName, inputName);\n const index = this.keyToIndex.get(key);\n if (index === undefined) return;\n const lastIndex = this.oscillators.length - 1;\n // swap-remove\n [this.oscillators[index], this.oscillators[lastIndex]] = [\n this.oscillators[lastIndex],\n this.oscillators[index],\n ];\n const moved = this.oscillators[index];\n const movedKey = OscillatorManager.makeKey(\n moved.moduleName,\n moved.inputName\n );\n this.keyToIndex.set(movedKey, index);\n this.oscillators.pop();\n this.keyToIndex.delete(key);\n }\n\n updateOscillatorSpeed(\n moduleName: string,\n inputName: string,\n speedHz: number\n ): void {\n const key = OscillatorManager.makeKey(moduleName, inputName);\n const index = this.keyToIndex.get(key);\n if (index === undefined) return;\n this.oscillators[index].speedHz = speedHz;\n this.recalculatePhaseOffset(this.oscillators[index]);\n }\n\n updateOscillatorBounds(\n moduleName: string,\n inputName: string,\n min: number,\n max: number\n ): void {\n const key = OscillatorManager.makeKey(moduleName, inputName);\n const index = this.keyToIndex.get(key);\n if (index === undefined) return;\n this.oscillators[index].min = min;\n this.oscillators[index].max = max;\n this.recalculatePhaseOffset(this.oscillators[index]);\n }\n\n hasOscillator(moduleName: string, inputName: string): boolean {\n return this.keyToIndex.has(\n OscillatorManager.makeKey(moduleName, inputName)\n );\n }\n\n getOscillator(\n moduleName: string,\n inputName: string\n ): OscillatorPublicConfig | undefined {\n const key = OscillatorManager.makeKey(moduleName, inputName);\n const index = this.keyToIndex.get(key);\n if (index === undefined) return undefined;\n const cfg = this.oscillators[index];\n return {\n moduleName: cfg.moduleName,\n inputName: cfg.inputName,\n min: cfg.min,\n max: cfg.max,\n speedHz: cfg.speedHz,\n curveExponent: cfg.curveExponent,\n jitterMultiplier: cfg.jitterMultiplier,\n phaseOffset: cfg.phaseOffset,\n lastDirection: cfg.lastDirection,\n lastValue: cfg.lastValue,\n active: cfg.active,\n };\n }\n\n clear(): void {\n this.keyToIndex.clear();\n this.oscillators = [];\n this.elapsedSeconds = 0;\n this.listeners.clear();\n }\n\n getElapsedSeconds(): number {\n return this.elapsedSeconds;\n }\n\n setElapsedSeconds(seconds: number): void {\n this.elapsedSeconds = Math.max(0, Number.isFinite(seconds) ? seconds : 0);\n }\n\n clearModule(moduleName: string): void {\n const indicesToRemove: number[] = [];\n for (let i = 0; i < this.oscillators.length; i++) {\n if (this.oscillators[i].moduleName === moduleName) {\n indicesToRemove.push(i);\n }\n }\n\n // Remove in reverse order to maintain indices\n for (let i = indicesToRemove.length - 1; i >= 0; i--) {\n const index = indicesToRemove[i];\n const osc = this.oscillators[index];\n const key = OscillatorManager.makeKey(osc.moduleName, osc.inputName);\n\n // Remove from keyToIndex map\n this.keyToIndex.delete(key);\n\n // Remove from listeners\n this.listeners.delete(key);\n\n // Swap-remove from oscillators array\n const lastIndex = this.oscillators.length - 1;\n if (index !== lastIndex) {\n this.oscillators[index] = this.oscillators[lastIndex];\n const moved = this.oscillators[index];\n const movedKey = OscillatorManager.makeKey(\n moved.moduleName,\n moved.inputName\n );\n this.keyToIndex.set(movedKey, index);\n }\n this.oscillators.pop();\n }\n }\n\n updateAll(dtSeconds: number): void {\n if (dtSeconds <= 0 || this.oscillators.length === 0) return;\n this.elapsedSeconds += dtSeconds;\n\n for (let i = 0; i < this.oscillators.length; i++) {\n const o = this.oscillators[i];\n if (!o.active) continue;\n\n const range = o.max - o.min;\n const center = o.min + range / 2;\n const amplitude = range / 2;\n if (amplitude <= 0) {\n this.setInput(o.moduleName, o.inputName, center);\n o.lastValue = center;\n o.lastDirection = 0;\n continue;\n }\n\n const effectiveHz = o.speedHz * o.jitterMultiplier;\n const phase =\n this.elapsedSeconds * effectiveHz * 2 * Math.PI + o.phaseOffset;\n const s = Math.sin(phase);\n const k = o.curveExponent;\n const curve = Math.sign(s) * Math.pow(Math.abs(s), k);\n const value = center + curve * amplitude;\n const clamped = Math.max(o.min, Math.min(o.max, value));\n\n const delta = clamped - o.lastValue;\n if (Math.abs(delta) > 1e-9) {\n o.lastDirection = delta > 0 ? 1 : -1;\n }\n o.lastValue = clamped;\n this.setInput(o.moduleName, o.inputName, clamped);\n const key = OscillatorManager.makeKey(o.moduleName, o.inputName);\n const fns = this.listeners.get(key);\n if (fns) {\n for (const fn of fns) {\n try {\n fn(clamped);\n } catch {}\n }\n }\n }\n }\n\n private recalculatePhaseOffset(o: OscillatorConfigInternal): void {\n const range = o.max - o.min;\n const center = o.min + range / 2;\n const amplitude = range / 2;\n if (amplitude <= 0) {\n o.phaseOffset = 0;\n return;\n }\n const normalizedValue = (o.lastValue - center) / amplitude;\n const clampedNormalized = Math.max(-1, Math.min(1, normalizedValue));\n // inverse of sign(sin) * |sin|^k\n let targetSin: number;\n if (Math.abs(clampedNormalized) < 1e-10) {\n targetSin = 0;\n } else {\n targetSin =\n Math.sign(clampedNormalized) *\n Math.pow(Math.abs(clampedNormalized), 1 / o.curveExponent);\n }\n targetSin = Math.max(-1, Math.min(1, targetSin));\n const asinVal = Math.asin(targetSin);\n const candidate0 = asinVal; // [-pi/2, pi/2]\n const candidate1 = Math.PI - asinVal;\n const desiredDir = o.lastDirection;\n const cos0 = Math.cos(candidate0);\n let targetPhase = candidate0;\n if (desiredDir < 0) {\n targetPhase = cos0 < 0 ? candidate0 : candidate1;\n } else if (desiredDir > 0) {\n targetPhase = cos0 >= 0 ? candidate0 : candidate1;\n }\n // Account for current elapsed time so new speed/bounds continue from current position\n const effectiveHz = o.speedHz * o.jitterMultiplier;\n const elapsedPhase = this.elapsedSeconds * effectiveHz * 2 * Math.PI;\n o.phaseOffset = targetPhase - elapsedPhase;\n if (Math.abs(Math.cos(o.phaseOffset)) < 1e-6) {\n const epsilon = 1e-3;\n o.phaseOffset += (desiredDir >= 0 ? 1 : -1) * epsilon;\n }\n // Normalize to [-pi, pi] to avoid drift\n if (o.phaseOffset > Math.PI || o.phaseOffset < -Math.PI) {\n o.phaseOffset = ((o.phaseOffset + Math.PI) % (2 * Math.PI)) - Math.PI;\n }\n }\n\n addOscillatorListener(\n moduleName: string,\n inputName: string,\n handler: (value: number) => void\n ): void {\n const key = OscillatorManager.makeKey(moduleName, inputName);\n let set = this.listeners.get(key);\n if (!set) {\n set = new Set();\n this.listeners.set(key, set);\n }\n set.add(handler);\n }\n\n removeOscillatorListener(\n moduleName: string,\n inputName: string,\n handler: (value: number) => void\n ): void {\n const key = OscillatorManager.makeKey(moduleName, inputName);\n const set = this.listeners.get(key);\n if (!set) return;\n set.delete(handler);\n if (set.size === 0) this.listeners.delete(key);\n }\n\n setOscillatorState(\n moduleName: string,\n inputName: string,\n lastValue: number,\n lastDirection: -1 | 0 | 1\n ): boolean {\n const key = OscillatorManager.makeKey(moduleName, inputName);\n const index = this.keyToIndex.get(key);\n if (index === undefined) return false;\n\n const osc = this.oscillators[index];\n osc.lastValue = lastValue;\n osc.lastDirection = lastDirection;\n // Recompute phase immediately; elapsedSeconds should be restored by loader\n this.recalculatePhaseOffset(osc);\n // Also set the module value to match immediately\n this.setInput(moduleName, inputName, lastValue);\n\n return true;\n }\n}\n","import { View } from \"./view\";\nimport type { Module } from \"./module\";\nimport { OscillatorManager, AddOscillatorOptions } from \"./oscillators\";\n\nexport interface IParticle {\n position: { x: number; y: number };\n velocity: { x: number; y: number };\n size: number;\n mass: number;\n color: {\n r: number;\n g: number;\n b: number;\n a: number;\n };\n}\n\nexport interface IEngine {\n initialize(): Promise<void>;\n play(): void;\n pause(): void;\n stop(): void;\n toggle(): void;\n isPlaying(): boolean;\n destroy(): Promise<void>;\n getSize(): { width: number; height: number };\n setSize(width: number, height: number): void;\n setCamera(x: number, y: number): void;\n getCamera(): { x: number; y: number };\n setZoom(z: number): void;\n getZoom(): number;\n addParticle(p: IParticle): void;\n setParticles(p: IParticle[]): void;\n getParticles(): Promise<IParticle[]>;\n getParticle(index: number): Promise<IParticle>;\n clear(): void;\n getCount(): number;\n getFPS(): number;\n export(): Record<string, Record<string, number>>;\n import(settings: Record<string, Record<string, number>>): void;\n\n // Configuration getters and setters\n getClearColor(): { r: number; g: number; b: number; a: number };\n setClearColor(color: { r: number; g: number; b: number; a: number }): void;\n getCellSize(): number;\n setCellSize(size: number): void;\n getMaxNeighbors(): number;\n setMaxNeighbors(size: number): void;\n getMaxParticles(): number | null;\n setMaxParticles(value: number | null): void;\n getConstrainIterations(): number;\n setConstrainIterations(iterations: number): void;\n getModule(name: string): Module | undefined;\n\n // Oscillator API\n addOscillator(params: {\n moduleName: string;\n inputName: string;\n min: number;\n max: number;\n speedHz: number;\n options?: AddOscillatorOptions;\n }): string;\n removeOscillator(moduleName: string, inputName: string): void;\n updateOscillatorSpeed(\n moduleName: string,\n inputName: string,\n speedHz: number\n ): void;\n updateOscillatorBounds(\n moduleName: string,\n inputName: string,\n min: number,\n max: number\n ): void;\n hasOscillator(moduleName: string, inputName: string): boolean;\n getOscillator(\n moduleName: string,\n inputName: string\n ):\n | {\n moduleName: string;\n inputName: string;\n min: number;\n max: number;\n speedHz: number;\n curveExponent: number;\n jitterMultiplier: number;\n phaseOffset: number;\n lastDirection: -1 | 0 | 1;\n lastValue: number;\n active: boolean;\n }\n | undefined;\n clearOscillators(): void;\n clearModuleOscillators(moduleName: string): void;\n addOscillatorListener(\n moduleName: string,\n inputName: string,\n handler: (value: number) => void\n ): void;\n removeOscillatorListener(\n moduleName: string,\n inputName: string,\n handler: (value: number) => void\n ): void;\n setOscillatorState(\n moduleName: string,\n inputName: string,\n lastValue: number,\n lastDirection: -1 | 0 | 1\n ): boolean;\n getOscillatorsElapsedSeconds(): number;\n setOscillatorsElapsedSeconds(seconds: number): void;\n}\n\nexport abstract class AbstractEngine implements IEngine {\n protected playing: boolean = false;\n protected lastTime: number = 0;\n protected fpsEstimate: number = 60;\n protected fpsSmoothing: number = 0.15;\n protected constrainIterations: number;\n protected clearColor: { r: number; g: number; b: number; a: number };\n protected cellSize: number;\n protected maxNeighbors: number;\n protected maxParticles: number | null = null;\n protected view: View;\n protected modules: Module[];\n protected maxSize: number = 0;\n protected oscillatorManager: OscillatorManager;\n\n constructor(options: {\n canvas: HTMLCanvasElement;\n forces: Module[];\n render: Module[];\n constrainIterations?: number;\n clearColor?: { r: number; g: number; b: number; a: number };\n cellSize?: number;\n maxNeighbors?: number;\n }) {\n this.view = new View(options.canvas.width, options.canvas.height);\n this.modules = [...options.forces, ...options.render];\n this.constrainIterations = options.constrainIterations ?? 5;\n this.clearColor = options.clearColor ?? { r: 0, g: 0, b: 0, a: 1 };\n this.cellSize = options.cellSize ?? 16;\n this.maxNeighbors = options.maxNeighbors ?? 100;\n // Initialize oscillator manager with a setter bound to module input writes\n this.oscillatorManager = new OscillatorManager(\n (moduleName: string, inputName: string, value: number) => {\n const module = this.getModule(moduleName);\n if (!module) return;\n // Write input and notify settings change\n (module as Module<any, Record<string, number>>).write({\n [inputName]: value,\n } as Record<string, number>);\n this.onModuleSettingsChanged();\n }\n );\n }\n\n // Abstract methods that must be implemented by subclasses\n abstract initialize(): Promise<void>;\n abstract destroy(): Promise<void>;\n abstract setSize(width: number, height: number): void;\n abstract addParticle(p: IParticle): void;\n abstract setParticles(p: IParticle[]): void;\n abstract getParticles(): Promise<IParticle[]>;\n abstract getParticle(index: number): Promise<IParticle>;\n abstract clear(): void;\n abstract getCount(): number;\n\n // Protected abstract methods for animation loop\n protected abstract startAnimationLoop(): void;\n protected abstract stopAnimationLoop(): void;\n\n // Common implementations\n play(): void {\n if (this.playing) return;\n this.playing = true;\n this.lastTime = performance.now();\n this.startAnimationLoop();\n }\n\n pause(): void {\n this.playing = false;\n }\n\n stop(): void {\n this.pause();\n this.stopAnimationLoop();\n }\n\n toggle(): void {\n this.playing ? this.pause() : this.play();\n }\n\n isPlaying(): boolean {\n return this.playing;\n }\n\n getSize(): { width: number; height: number } {\n return this.view.getSize();\n }\n\n setCamera(x: number, y: number): void {\n this.view.setCamera(x, y);\n this.onViewChanged();\n }\n\n getCamera(): { x: number; y: number } {\n return this.view.getCamera();\n }\n\n setZoom(z: number): void {\n this.view.setZoom(z);\n this.onViewChanged();\n }\n\n getZoom(): number {\n return this.view.getZoom();\n }\n\n getFPS(): number {\n return this.fpsEstimate;\n }\n\n // Oscillator API implementations\n addOscillator(params: {\n moduleName: string;\n inputName: string;\n min: number;\n max: number;\n speedHz: number;\n options?: AddOscillatorOptions;\n }): string {\n return this.oscillatorManager.addOscillator(params);\n }\n removeOscillator(moduleName: string, inputName: string): void {\n this.oscillatorManager.removeOscillator(moduleName, inputName);\n }\n updateOscillatorSpeed(\n moduleName: string,\n inputName: string,\n speedHz: number\n ): void {\n this.oscillatorManager.updateOscillatorSpeed(\n moduleName,\n inputName,\n speedHz\n );\n }\n updateOscillatorBounds(\n moduleName: string,\n inputName: string,\n min: number,\n max: number\n ): void {\n this.oscillatorManager.updateOscillatorBounds(\n moduleName,\n inputName,\n min,\n max\n );\n }\n hasOscillator(moduleName: string, inputName: string): boolean {\n return this.oscillatorManager.hasOscillator(moduleName, inputName);\n }\n getOscillator(moduleName: string, inputName: string) {\n return this.oscillatorManager.getOscillator(moduleName, inputName);\n }\n clearOscillators(): void {\n this.oscillatorManager.clear();\n }\n clearModuleOscillators(moduleName: string): void {\n this.oscillatorManager.clearModule(moduleName);\n }\n addOscillatorListener(\n moduleName: string,\n inputName: string,\n handler: (value: number) => void\n ): void {\n this.oscillatorManager.addOscillatorListener(\n moduleName,\n inputName,\n handler\n );\n }\n removeOscillatorListener(\n moduleName: string,\n inputName: string,\n handler: (value: number) => void\n ): void {\n this.oscillatorManager.removeOscillatorListener(\n moduleName,\n inputName,\n handler\n );\n }\n setOscillatorState(\n moduleName: string,\n inputName: string,\n lastValue: number,\n lastDirection: -1 | 0 | 1\n ): boolean {\n return this.oscillatorManager.setOscillatorState(\n moduleName,\n inputName,\n lastValue,\n lastDirection\n );\n }\n\n getOscillatorsElapsedSeconds(): number {\n return this.oscillatorManager.getElapsedSeconds();\n }\n\n setOscillatorsElapsedSeconds(seconds: number): void {\n this.oscillatorManager.setElapsedSeconds(seconds);\n }\n\n export(): Record<string, Record<string, number>> {\n const settings: Record<string, Record<string, number>> = {};\n for (const module of this.modules) {\n const moduleData = module.read();\n // Include the enabled state in the exported data\n settings[module.name] = {\n ...(moduleData as Record<string, number>),\n enabled: module.isEnabled() ? 1 : 0,\n };\n }\n return settings;\n }\n\n import(settings: Record<string, Record<string, number>>): void {\n for (const module of this.modules) {\n if (settings[module.name]) {\n const moduleSettings = settings[module.name];\n\n // Restore enabled state if present\n if (\"enabled\" in moduleSettings) {\n module.setEnabled(moduleSettings.enabled === 1);\n }\n\n // Restore other settings\n module.write(moduleSettings);\n }\n }\n this.onModuleSettingsChanged();\n }\n\n // Protected helper methods\n protected updateFPS(dt: number): void {\n if (dt > 0) {\n // Clamp dt to a minimum to prevent unrealistic FPS values\n // Minimum dt corresponds to maximum FPS (e.g., 1/144 = ~0.0069s for 144 FPS max)\n const minDt = 1 / 144; // Cap at 144 FPS maximum\n const clampedDt = Math.max(dt, minDt);\n const instantFps = 1 / clampedDt;\n this.fpsEstimate =\n this.fpsEstimate * (1 - this.fpsSmoothing) +\n instantFps * this.fpsSmoothing;\n }\n }\n\n protected updateOscillators(dt: number): void {\n if (!this.playing) return; // follow global pause\n this.oscillatorManager.updateAll(dt);\n }\n\n protected getTimeDelta(): number {\n const now = performance.now();\n const dt = Math.min(now - this.lastTime, 100) / 1000; // clamp to 100ms\n this.lastTime = now;\n return dt;\n }\n\n // Hook methods for subclasses\n protected onViewChanged(): void {\n // Override in subclasses if needed\n }\n\n protected onModuleSettingsChanged(): void {\n // Override in subclasses if needed\n }\n\n // Configuration getters and setters\n getClearColor(): { r: number; g: number; b: number; a: number } {\n return { ...this.clearColor };\n }\n\n setClearColor(color: { r: number; g: number; b: number; a: number }): void {\n this.clearColor = { ...color };\n this.onClearColorChanged();\n }\n\n getCellSize(): number {\n return this.cellSize;\n }\n\n setCellSize(size: number): void {\n if (size <= 0) {\n throw new Error(\"Cell size must be greater than 0\");\n }\n this.cellSize = size;\n this.onCellSizeChanged();\n }\n\n getMaxNeighbors(): number {\n return this.maxNeighbors;\n }\n\n setMaxNeighbors(size: number): void {\n if (size <= 0) {\n throw new Error(\"Max neighbors must be greater than 0\");\n }\n this.maxNeighbors = size;\n this.onMaxNeighborsChanged();\n }\n\n getMaxParticles(): number | null {\n return this.maxParticles;\n }\n\n setMaxParticles(value: number | null): void {\n if (value !== null && value < 0) {\n throw new Error(\"Max particles must be non-negative or null\");\n }\n this.maxParticles = value;\n this.onMaxParticlesChanged();\n }\n\n getConstrainIterations(): number {\n return this.constrainIterations;\n }\n\n setConstrainIterations(iterations: number): void {\n if (iterations < 0) {\n throw new Error(\"Constrain iterations must be non-negative\");\n }\n this.constrainIterations = iterations;\n this.onConstrainIterationsChanged();\n }\n\n // MaxSize tracking\n getMaxSize(): number {\n return this.maxSize;\n }\n\n protected updateMaxSize(size: number): void {\n this.maxSize = Math.max(this.maxSize, size);\n }\n\n protected resetMaxSize(): void {\n this.maxSize = 0;\n }\n\n // Protected hooks for subclasses to override\n protected onClearColorChanged(): void {\n // Override in subclasses if needed\n }\n\n protected onCellSizeChanged(): void {\n // Override in subclasses if needed\n }\n\n protected onConstrainIterationsChanged(): void {\n // Override in subclasses if needed\n }\n\n protected onMaxNeighborsChanged(): void {\n // Override in subclasses if needed\n }\n\n protected onMaxParticlesChanged(): void {\n // Override in subclasses if needed\n }\n\n getModule<T extends Module>(name: string): T | undefined {\n return this.modules.find((module) => module.name === name) as T | undefined;\n }\n}\n","import { Particle } from \"./particle\";\nimport { View } from \"./view\";\n\n/**\n * Module descriptors and base Module class\n *\n * Defines the type-level contract for modules and the DSL surface used by the\n * WGSL builders. A `Module` instance provides a `descriptor()` which declares:\n * - role: `system`, `force`, or `render`\n * - bindings: uniform fields exposed to CPU and populated into GPU uniform buffers\n * - for system/force modules: optional global/state/apply/constrain/correct hooks\n * - for render modules: one or more passes (fullscreen or compute) with their bindings\n *\n * The base `Module` offers uniform writer/reader plumbing and enabled toggling,\n * and module authors extend it to implement their descriptor and any runtime API.\n */\nexport enum ModuleRole {\n Force = \"force\",\n Render = \"render\",\n}\n\nexport enum DataType {\n NUMBER = \"number\",\n ARRAY = \"array\",\n}\n\nexport abstract class Module<\n Name extends string = string,\n Inputs extends Record<string, number | number[]> = Record<\n string,\n number | number[]\n >,\n StateKeys extends string = any\n> {\n abstract readonly name: Name;\n abstract readonly role: ModuleRole;\n abstract readonly inputs: { [K in keyof Inputs]: DataType };\n\n private _state: Partial<Inputs> = {};\n private _writer:\n | ((values: Partial<Inputs & { enabled: number }>) => void)\n | null = (values: Partial<Inputs>) => {\n for (const key of Object.keys(values)) {\n const val = values[key as keyof Inputs];\n if (typeof val === \"number\") {\n this._state[key as keyof Inputs] = val as Inputs[keyof Inputs];\n } else if (Array.isArray(val)) {\n this._state[key as keyof Inputs] = [...val] as Inputs[keyof Inputs];\n }\n }\n };\n private _reader: (() => Partial<Inputs>) | null = () => {\n return { ...this._state };\n };\n private _enabled: boolean = true;\n\n attachUniformWriter(\n writer: (values: Partial<Record<string, number | number[]>>) => void\n ): void {\n const values = this.read();\n this._writer = writer;\n writer({ ...values, enabled: this._enabled ? 1 : 0 });\n }\n\n attachUniformReader(reader: () => Partial<Inputs>): void {\n this._reader = reader;\n }\n\n public write(values: Partial<Inputs>): void {\n // Binding keys are narrowed by the generic; cast to the writer's accepted shape\n this._writer?.(values as unknown as Partial<Inputs & { enabled: number }>);\n }\n\n public read(): Partial<Inputs> {\n const vals = this._reader?.() as unknown as Partial<Inputs>;\n return vals || {};\n }\n\n public readValue(key: keyof Inputs | \"enabled\"): number {\n const vals = this._reader?.() as unknown as Partial<\n Record<keyof Inputs | \"enabled\", number | number[]>\n >;\n const val = vals[key];\n return typeof val === \"number\" ? val : 0;\n }\n\n public readArray(key: keyof Inputs | \"enabled\"): number[] {\n const vals = this._reader?.() as unknown as Partial<\n Record<keyof Inputs | \"enabled\", number | number[]>\n >;\n const val = vals[key];\n return Array.isArray(val) ? val : [];\n }\n\n isEnabled(): boolean {\n return this._enabled;\n }\n\n setEnabled(enabled: boolean): void {\n this._enabled = !!enabled;\n // Propagate to GPU uniform if available\n if (this._writer) {\n this._writer({ enabled: this._enabled ? 1 : 0 } as unknown as Partial<\n Inputs & { enabled: number }\n >);\n }\n }\n\n abstract webgpu(): WebGPUDescriptor<Inputs, StateKeys>;\n abstract cpu(): CPUDescriptor<Inputs, StateKeys>;\n}\n\nexport interface WebGPUForceDescriptor<\n Inputs extends Record<string, number | number[]> = Record<\n string,\n number | number[]\n >,\n StateKeys extends string | number | symbol = string\n> {\n states?: readonly StateKeys[];\n global?: (args: {\n getUniform: (id: keyof Inputs, index?: number | string) => string;\n getLength: (id: keyof Inputs) => string;\n }) => string;\n state?: (args: {\n particleVar: string;\n dtVar: string;\n maxSizeVar: string;\n getUniform: (id: keyof Inputs, index?: number | string) => string;\n getLength: (id: keyof Inputs) => string;\n setState: (name: StateKeys, valueExpr: string) => string;\n }) => string;\n apply?: (args: {\n particleVar: string;\n dtVar: string;\n maxSizeVar: string;\n getUniform: (id: keyof Inputs, index?: number | string) => string;\n getLength: (id: keyof Inputs) => string;\n getState: (name: StateKeys, pidVar?: string) => string;\n }) => string;\n constrain?: (args: {\n particleVar: string;\n dtVar: string;\n maxSizeVar: string;\n getUniform: (id: keyof Inputs, index?: number | string) => string;\n getLength: (id: keyof Inputs) => string;\n getState: (name: StateKeys, pidVar?: string) => string;\n }) => string;\n correct?: (args: {\n particleVar: string;\n dtVar: string;\n maxSizeVar: string;\n prevPosVar: string;\n postPosVar: string;\n getUniform: (id: keyof Inputs, index?: number | string) => string;\n getLength: (id: keyof Inputs) => string;\n getState: (name: StateKeys, pidVar?: string) => string;\n }) => string;\n}\n\nexport type FullscreenRenderPass<\n Inputs extends Record<string, number | number[]> = Record<\n string,\n number | number[]\n >\n> = {\n kind: RenderPassKind.Fullscreen;\n vertex?: (args: {\n getUniform: (\n id: keyof Inputs | \"canvasWidth\" | \"canvasHeight\",\n index?: number | string\n ) => string;\n getLength: (id: keyof Inputs) => string;\n }) => string;\n globals?: (args: {\n getUniform: (id: keyof Inputs, index?: number | string) => string;\n getLength: (id: keyof Inputs) => string;\n }) => string;\n fragment: (args: {\n getUniform: (\n id:\n | keyof Inputs\n | \"canvasWidth\"\n | \"canvasHeight\"\n | \"clearColorR\"\n | \"clearColorG\"\n | \"clearColorB\",\n index?: number | string\n ) => string;\n getLength: (id: keyof Inputs) => string;\n sampleScene: (uvExpr: string) => string;\n }) => string;\n bindings: (keyof Inputs)[];\n readsScene?: boolean;\n writesScene?: true;\n instanced?: boolean;\n // Optional: override instance count by the length of this array input\n instanceFrom?: keyof Inputs;\n};\n\nexport enum RenderPassKind {\n Fullscreen = \"fullscreen\",\n Compute = \"compute\",\n}\n\nexport type ComputeRenderPass<\n Inputs extends Record<string, number | number[]> = Record<\n string,\n number | number[]\n >\n> = {\n kind: RenderPassKind.Compute;\n kernel: (args: {\n getUniform: (\n id:\n | keyof Inputs\n | \"canvasWidth\"\n | \"canvasHeight\"\n | \"clearColorR\"\n | \"clearColorG\"\n | \"clearColorB\",\n index?: number | string\n ) => string;\n getLength: (id: keyof Inputs) => string;\n readScene: (coordsExpr: string) => string;\n writeScene: (coordsExpr: string, colorExpr: string) => string;\n }) => string;\n bindings: (keyof Inputs)[];\n readsScene?: boolean;\n writesScene?: true;\n workgroupSize?: [number, number, number];\n globals?: (args: {\n getUniform: (id: keyof Inputs, index?: number | string) => string;\n getLength: (id: keyof Inputs) => string;\n }) => string;\n};\n\nexport type RenderPass<\n Inputs extends Record<string, number | number[]> = Record<\n string,\n number | number[]\n >\n> = FullscreenRenderPass<Inputs> | ComputeRenderPass<Inputs>;\n\nexport interface WebGPURenderDescriptor<\n Inputs extends Record<string, number | number[]> = Record<\n string,\n number | number[]\n >\n> {\n passes: Array<RenderPass<Inputs>>;\n}\n\nexport type WebGPUDescriptor<\n Inputs extends Record<string, number | number[]> = Record<\n string,\n number | number[]\n >,\n StateKeys extends string | number | symbol = string\n> = WebGPUForceDescriptor<Inputs, StateKeys> | WebGPURenderDescriptor<Inputs>;\n\nexport interface CPUForceDescriptor<\n Inputs extends Record<string, number | number[]> = Record<\n string,\n number | number[]\n >,\n StateKeys extends string | number | symbol = never\n> {\n states?: readonly StateKeys[];\n state?: (args: {\n particle: Particle;\n getNeighbors: (\n position: { x: number; y: number },\n radius: number\n ) => Particle[];\n dt: number;\n input: Inputs;\n setState: (name: StateKeys, value: number) => void;\n view: View;\n index: number;\n particles: Particle[];\n getImageData: (\n x: number,\n y: number,\n width: number,\n height: number\n ) => ImageData | null;\n }) => void;\n apply?: (args: {\n particle: Particle;\n getNeighbors: (\n position: { x: number; y: number },\n radius: number\n ) => Particle[];\n dt: number;\n maxSize: number;\n input: Inputs;\n getState: (name: StateKeys, pid?: number) => number;\n view: View;\n index: number;\n particles: Particle[];\n getImageData: (\n x: number,\n y: number,\n width: number,\n height: number\n ) => ImageData | null;\n }) => void;\n constrain?: (args: {\n particle: Particle;\n getNeighbors: (\n position: { x: number; y: number },\n radius: number\n ) => Particle[];\n dt: number;\n maxSize: number;\n input: Inputs;\n getState: (name: StateKeys, pid?: number) => number;\n view: View;\n index: number;\n particles: Particle[];\n getImageData: (\n x: number,\n y: number,\n width: number,\n height: number\n ) => ImageData | null;\n }) => void;\n correct?: (args: {\n particle: Particle;\n getNeighbors: (\n position: { x: number; y: number },\n radius: number\n ) => Particle[];\n dt: number;\n maxSize: number;\n prevPos: { x: number; y: number };\n postPos: { x: number; y: number };\n input: Inputs;\n getState: (name: StateKeys, pid?: number) => number;\n view: View;\n index: number;\n particles: Particle[];\n getImageData: (\n x: number,\n y: number,\n width: number,\n height: number\n ) => ImageData | null;\n }) => void;\n}\n\nexport interface CPURenderUtils {\n formatColor(color: { r: number; g: number; b: number; a: number }): string;\n drawCircle(\n x: number,\n y: number,\n radius: number,\n color: { r: number; g: number; b: number; a: number }\n ): void;\n drawRect(\n x: number,\n y: number,\n width: number,\n height: number,\n color: { r: number; g: number; b: number; a: number }\n ): void;\n}\n\nexport enum CanvasComposition {\n // Module needs a clear canvas to work properly (default for most render modules)\n RequiresClear = \"requiresClear\",\n // Module handles its own background/clearing (e.g. trails with fade)\n HandlesBackground = \"handlesBackground\",\n // Module renders on top of whatever is there (additive effects)\n Additive = \"additive\",\n}\n\nexport interface CPURenderDescriptor<\n Inputs extends Record<string, number | number[]> = Record<\n string,\n number | number[]\n >\n> {\n // How this module composes with the canvas background\n composition?: CanvasComposition;\n\n // Optional setup phase (called once per frame before particles)\n setup?: (args: {\n context: CanvasRenderingContext2D;\n input: Inputs;\n view: View;\n clearColor: { r: number; g: number; b: number; a: number };\n utils: CPURenderUtils;\n particles: Particle[];\n }) => void;\n\n // Optional per-particle rendering (called for each visible particle with transformed coordinates)\n render?: (args: {\n context: CanvasRenderingContext2D;\n particle: Particle;\n screenX: number;\n screenY: number;\n screenSize: number;\n input: Inputs;\n utils: CPURenderUtils;\n }) => void;\n\n // Optional teardown phase (called once per frame after all particles)\n teardown?: (args: {\n context: CanvasRenderingContext2D;\n input: Inputs;\n utils: CPURenderUtils;\n }) => void;\n}\n\nexport type CPUDescriptor<\n Inputs extends Record<string, number | number[]> = Record<\n string,\n number | number[]\n >,\n StateKeys extends string | number | symbol = string\n> = CPUForceDescriptor<Inputs, StateKeys> | CPURenderDescriptor<Inputs>;\n","/**\n * Module Builder (Program generator)\n *\n * Builds a single WGSL Program from a list of `Module` instances by:\n * - Creating a packed uniform layout per module and mapping named fields to `vec4` slots\n * - Emitting internal global helpers (simulation/grid) and optional force module globals\n * - Generating optional state/apply/constrain/correct functions for force modules\n * - Defining simulation entrypoints and grid entrypoints (inlined internally)\n * - Assigning extra bind group bindings (grid, sim state, scene texture)\n *\n * Output:\n * - `Program.code`: complete WGSL source for all compute passes\n * - `Program.layouts`: uniform layout/offset metadata for writing uniforms from CPU\n * - `Program.simStateStride`: size of the shared SIM_STATE row per particle\n * - `Program.extraBindings`: indices for additional buffers/textures bound by pipelines\n */\nimport {\n Module,\n ModuleRole,\n DataType,\n WebGPUForceDescriptor,\n} from \"../../../module\";\n\nexport const PARTICLE_STRUCT = `\nstruct Particle {\n position: vec2<f32>,\n velocity: vec2<f32>,\n acceleration: vec2<f32>,\n size: f32,\n mass: f32,\n color: vec4<f32>,\n}`;\n\nexport const STORAGE_DECL = `@group(0) @binding(0) var<storage, read_write> particles: array<Particle>;`;\n\nfunction cap(s: string): string {\n return s ? s[0].toUpperCase() + s.slice(1) : s;\n}\n\nexport interface ModuleUniformLayout {\n moduleName: string;\n moduleRole: ModuleRole;\n bindingIndex: number;\n uniformsVar: string;\n structName: string;\n sizeBytes: number;\n vec4Count: number;\n mapping: Record<\n string,\n { flatIndex: number; expr: string; offsetExpr?: string }\n >;\n}\n\nexport interface Program {\n code: string;\n layouts: ModuleUniformLayout[];\n simStateStride: number;\n extraBindings: {\n grid?: { countsBinding: number; indicesBinding: number };\n simState?: { stateBinding: number };\n sceneTexture?: { textureBinding: number };\n arrays?: Record<string, { arrayBinding: number; lengthBinding: number }>; // moduleName_arrayKey -> bindings\n };\n}\n\nexport function buildProgram(modules: readonly Module[]): Program {\n const descriptors = modules.map((m) => m.webgpu());\n\n const layouts: ModuleUniformLayout[] = [];\n const uniformDecls: string[] = [];\n // 1) Internal simulation uniforms at binding(1)\n const pushUniformLayout = (\n name: string,\n fieldIds: readonly string[],\n bindingIndex: number\n ) => {\n const uniformsVar = `${name}_uniforms`;\n const structName = `Uniforms_${cap(name)}`;\n const idsLocal = [...fieldIds] as string[];\n const vec4Count = Math.max(1, Math.ceil(idsLocal.length / 4));\n const mapping: Record<\n string,\n { flatIndex: number; expr: string; offsetExpr?: string }\n > = {};\n idsLocal.forEach((id, i) => {\n const v = Math.floor(i / 4),\n c = i % 4;\n const comp = c === 0 ? \"x\" : c === 1 ? \"y\" : c === 2 ? \"z\" : \"w\";\n mapping[id] = {\n flatIndex: v * 4 + c,\n expr: `${uniformsVar}.v${v}.${comp}`,\n };\n });\n const structWGSL = `struct ${structName} {\\n${Array.from(\n { length: vec4Count },\n (_, i) => ` v${i}: vec4<f32>,`\n ).join(\"\\n\")}\\n}`;\n const varDecl = `@group(0) @binding(${bindingIndex}) var<uniform> ${uniformsVar}: ${structName};`;\n layouts.push({\n moduleName: name,\n moduleRole: ModuleRole.Force as ModuleRole, // internal; role unused for gating\n bindingIndex,\n uniformsVar,\n structName,\n sizeBytes: vec4Count * 16,\n vec4Count,\n mapping,\n });\n uniformDecls.push(structWGSL, varDecl);\n };\n\n // Internal: simulation + grid\n pushUniformLayout(\n \"simulation\",\n [\n \"dt\",\n \"count\",\n \"simStride\",\n \"maxSize\",\n \"iteration\",\n \"maxNeighbors\",\n \"maxParticles\",\n ] as const,\n 1\n );\n pushUniformLayout(\n \"grid\",\n [\n \"minX\",\n \"minY\",\n \"maxX\",\n \"maxY\",\n \"cols\",\n \"rows\",\n \"cellSize\",\n \"maxPerCell\",\n ] as const,\n 2\n );\n\n // 2) User module uniforms start at binding(3)\n let nextBindingIndex = 3;\n const arrayDecls: string[] = [];\n const arrayBindings: Record<\n string,\n { arrayBinding: number; lengthBinding: number; combinedArrayVar?: string }\n > = {};\n\n modules.forEach((module) => {\n const uniformsVar = `${module.name}_uniforms`;\n const structName = `Uniforms_${cap(module.name)}`;\n\n // Separate number inputs (including enabled) from array inputs\n const numberInputs = Object.entries(module.inputs)\n .filter(([_, type]) => type === DataType.NUMBER)\n .map(([key, _]) => key);\n const arrayInputs = Object.entries(module.inputs)\n .filter(([_, type]) => type === DataType.ARRAY)\n .map(([key, _]) => key);\n\n // Add enabled and array lengths as number inputs\n const arrayLengthInputs = arrayInputs.map((key) => `${key}_length`);\n const allNumberInputs = [...numberInputs, \"enabled\", ...arrayLengthInputs];\n\n // Create uniform buffer for number inputs\n const bindingIndex = nextBindingIndex++;\n const vec4Count = Math.max(1, Math.ceil(allNumberInputs.length / 4));\n const mapping: Record<\n string,\n { flatIndex: number; expr: string; offsetExpr?: string }\n > = {};\n\n allNumberInputs.forEach((id, i) => {\n const v = Math.floor(i / 4),\n c = i % 4;\n const comp = c === 0 ? \"x\" : c === 1 ? \"y\" : c === 2 ? \"z\" : \"w\";\n mapping[id] = {\n flatIndex: v * 4 + c,\n expr: `${uniformsVar}.v${v}.${comp}`,\n };\n });\n\n const structWGSL = `struct ${structName} {\\n${Array.from(\n { length: vec4Count },\n (_, i) => ` v${i}: vec4<f32>,`\n ).join(\"\\n\")}\\n}`;\n const varDecl = `@group(0) @binding(${bindingIndex}) var<uniform> ${uniformsVar}: ${structName};`;\n\n layouts.push({\n moduleName: module.name,\n moduleRole: module.role,\n bindingIndex,\n uniformsVar,\n structName,\n sizeBytes: vec4Count * 16,\n vec4Count,\n mapping,\n });\n uniformDecls.push(structWGSL, varDecl);\n\n // Create combined storage buffer for all array inputs of this module\n if (arrayInputs.length > 0) {\n const arrayBinding = nextBindingIndex++;\n const combinedArrayVar = `${module.name}_arrays`;\n\n // Add combined array storage buffer declaration\n arrayDecls.push(\n `@group(0) @binding(${arrayBinding}) var<storage, read> ${combinedArrayVar}: array<f32>;`\n );\n\n // Add offset uniforms for each array in the combined buffer\n let offsetIndex = allNumberInputs.length;\n arrayInputs.forEach((arrayKey) => {\n const offsetKey = `${arrayKey}_offset`;\n const offsetMapping = {\n flatIndex: offsetIndex,\n expr: `${uniformsVar}.v${Math.floor(offsetIndex / 4)}.${\n [\"x\", \"y\", \"z\", \"w\"][offsetIndex % 4]\n }`,\n };\n mapping[offsetKey] = offsetMapping;\n offsetIndex++;\n });\n\n // Update vec4Count to include offset fields\n const totalNumberInputs = allNumberInputs.length + arrayInputs.length;\n const updatedVec4Count = Math.max(1, Math.ceil(totalNumberInputs / 4));\n\n // Re-generate the struct with additional offset fields\n const updatedStructWGSL = `struct ${structName} {\\n${Array.from(\n { length: updatedVec4Count },\n (_, i) => ` v${i}: vec4<f32>,`\n ).join(\"\\n\")}\\n}`;\n\n // Update the layout\n layouts[layouts.length - 1].vec4Count = updatedVec4Count;\n layouts[layouts.length - 1].sizeBytes = updatedVec4Count * 16;\n\n // Replace the last struct declaration\n uniformDecls[uniformDecls.length - 2] = updatedStructWGSL;\n\n // Track combined array binding for this module\n arrayBindings[module.name] = {\n arrayBinding,\n lengthBinding: -1, // No separate binding, using main uniform\n combinedArrayVar,\n };\n\n arrayInputs.forEach((arrayKey) => {\n // Length is stored in the main uniform buffer\n const lengthKey = `${arrayKey}_length`;\n const lengthMapping = mapping[lengthKey];\n const lengthExpr = lengthMapping ? lengthMapping.expr : \"0u\";\n\n // Offset is also stored in the main uniform buffer\n const offsetKey = `${arrayKey}_offset`;\n const offsetMapping = mapping[offsetKey];\n const offsetExpr = offsetMapping ? offsetMapping.expr : \"0u\";\n\n // Add array mappings for getUniform access (base expression without index)\n mapping[arrayKey] = {\n flatIndex: -1, // Not in uniform buffer\n expr: combinedArrayVar, // Base array reference, offset will be added by getUniform\n offsetExpr, // Store offset expression for getUniform to use\n };\n\n // Ensure length mapping exists\n if (!mapping[lengthKey] || mapping[lengthKey].flatIndex === -1) {\n mapping[lengthKey] = {\n flatIndex: -1,\n expr: lengthExpr,\n };\n }\n });\n }\n });\n\n const dtExpr = layouts.find((l) => l.moduleName === \"simulation\")!.mapping.dt\n .expr;\n const countExpr = layouts.find((l) => l.moduleName === \"simulation\")!.mapping\n .count.expr;\n const maxParticlesExpr = layouts.find((l) => l.moduleName === \"simulation\")!.mapping\n .maxParticles.expr;\n const maxSizeExpr = layouts.find((l) => l.moduleName === \"simulation\")!\n .mapping.maxSize.expr;\n \n // Effective count is min(count, maxParticles) when maxParticles >= 0 (not null)\n // We use -1 as the sentinel value for null in the shader\n // select(if_false, if_true, condition) - returns if_true when condition is true\n const effectiveCountExpr = `select(u32(${countExpr}), min(u32(${countExpr}), u32(${maxParticlesExpr})), ${maxParticlesExpr} >= 0.0)`;\n\n const baseState = [\"prevX\", \"prevY\", \"posIntX\", \"posIntY\"] as const;\n const stateSlots: Record<string, number> = {};\n baseState.forEach((k, i) => (stateSlots[k] = i));\n let nextSlot = baseState.length;\n const localSlots: Record<string, Record<string, number>> = {};\n modules.forEach((module, idx) => {\n localSlots[module.name] = {};\n if (module.role === ModuleRole.Force) {\n const descriptor = descriptors[idx] as WebGPUForceDescriptor;\n descriptor.states?.forEach((field) => {\n const key = `${module.name}.${field}`;\n if (stateSlots[key] === undefined) stateSlots[key] = nextSlot++;\n localSlots[module.name][field] = stateSlots[key];\n });\n }\n });\n const SIM_STATE_STRIDE_VAL = nextSlot;\n\n // Grid and system bindings come after all module bindings (including arrays)\n const gridCountsBinding = nextBindingIndex++;\n const gridIndicesBinding = nextBindingIndex++;\n const simStateBinding = nextBindingIndex++;\n const sceneTextureBinding = nextBindingIndex++;\n const gridDecls = [\n `@group(0) @binding(${gridCountsBinding}) var<storage, read_write> GRID_COUNTS: array<atomic<u32>>;`,\n `@group(0) @binding(${gridIndicesBinding}) var<storage, read_write> GRID_INDICES: array<u32>;`,\n `@group(0) @binding(${simStateBinding}) var<storage, read_write> SIM_STATE: array<f32>;`,\n `@group(0) @binding(${sceneTextureBinding}) var scene_texture: texture_2d<f32>;`,\n ...arrayDecls,\n ];\n\n const makeGetUniformAndLength = (module: Module) => {\n const layout = layouts.find((l) => l.moduleName === module.name)!;\n const getUniform = (id: string, index?: number | string) => {\n const mapping = layout.mapping[id];\n if (!mapping) return \"0.0\";\n\n // Check if this is an array input\n if (module.inputs[id] === DataType.ARRAY) {\n if (index !== undefined) {\n // Use combined array with offset\n const offsetExpr = mapping.offsetExpr || \"0u\";\n return `${mapping.expr}[u32(${offsetExpr}) + u32(${index})]`;\n } else {\n // Return the array variable name itself for direct access\n return mapping.expr;\n }\n } else {\n // Regular number input\n return mapping.expr;\n }\n };\n const getLength = (id: string) => {\n if (module.inputs[id] === DataType.ARRAY) {\n const lengthMapping = layout.mapping[`${id}_length`];\n return `u32(${lengthMapping?.expr ?? \"0.0\"})`;\n }\n return \"0u\";\n };\n return { getUniform, getLength };\n };\n\n const globals: string[] = [];\n // Internal simulation helpers\n const simLayout = layouts.find((l) => l.moduleName === \"simulation\")!;\n const gridLayout = layouts.find((l) => l.moduleName === \"grid\")!;\n globals.push(`// Internal simulation helpers`);\n globals.push(\n `fn SIM_STATE_STRIDE() -> u32 { return u32(${simLayout.mapping.simStride.expr}); }\nfn SIM_COUNT() -> u32 { return ${effectiveCountExpr}; }\nfn SIM_ITERATION() -> u32 { return u32(${simLayout.mapping.iteration.expr}); }\nfn SIM_MAX_NEIGHBORS() -> u32 { return u32(${simLayout.mapping.maxNeighbors.expr}); }\nfn sim_state_index(pid: u32, slot: u32) -> u32 { return pid * SIM_STATE_STRIDE() + slot; }\nfn sim_state_read(pid: u32, slot: u32) -> f32 { return SIM_STATE[sim_state_index(pid, slot)]; }\nfn sim_state_write(pid: u32, slot: u32, value: f32) { SIM_STATE[sim_state_index(pid, slot)] = value; }`\n );\n // Internal grid helpers\n globals.push(`// Internal grid helpers`);\n globals.push(\n `const NEIGHBOR_NONE: u32 = 0xffffffffu;\nfn GRID_COLS() -> u32 { return u32(${gridLayout.mapping.cols.expr}); }\nfn GRID_ROWS() -> u32 { return u32(${gridLayout.mapping.rows.expr}); }\nfn GRID_MINX() -> f32 { return ${gridLayout.mapping.minX.expr}; }\nfn GRID_MINY() -> f32 { return ${gridLayout.mapping.minY.expr}; }\nfn GRID_MAXX() -> f32 { return ${gridLayout.mapping.maxX.expr}; }\nfn GRID_MAXY() -> f32 { return ${gridLayout.mapping.maxY.expr}; }\nfn GRID_CELL_SIZE() -> f32 { return ${gridLayout.mapping.cellSize.expr}; }\nfn GRID_MAX_PER_CELL() -> u32 { return u32(${gridLayout.mapping.maxPerCell.expr}); }\nfn grid_cell_index(pos: vec2<f32>) -> u32 { let col = i32(floor((pos.x - GRID_MINX()) / GRID_CELL_SIZE())); let row = i32(floor((pos.y - GRID_MINY()) / GRID_CELL_SIZE())); let c = max(0, min(col, i32(GRID_COLS()) - 1)); let r = max(0, min(row, i32(GRID_ROWS()) - 1)); return u32(r) * GRID_COLS() + u32(c); }\nfn grid_cell_index_from_rc(r: i32, c: i32) -> u32 { let rr = max(0, min(r, i32(GRID_ROWS()) - 1)); let cc = max(0, min(c, i32(GRID_COLS()) - 1)); return u32(rr) * GRID_COLS() + u32(cc); }\nstruct NeighborIter { cx: i32, cy: i32, r: i32, c: i32, k: u32, reach: i32, maxK: u32, base: u32, emitted: u32, maxEmit: u32 }\nfn neighbor_iter_init(pos: vec2<f32>, radius: f32) -> NeighborIter { let cx = i32(floor((pos.x - GRID_MINX()) / GRID_CELL_SIZE())); let cy = i32(floor((pos.y - GRID_MINY()) / GRID_CELL_SIZE())); let reach = max(1, i32(ceil(radius / GRID_CELL_SIZE()))); var it: NeighborIter; it.cx = cx; it.cy = cy; it.reach = reach; it.r = cy - reach; it.c = cx - reach; let firstCell = grid_cell_index_from_rc(it.r, it.c); let cnt = atomicLoad(&GRID_COUNTS[firstCell]); it.maxK = min(cnt, GRID_MAX_PER_CELL()); it.base = firstCell * GRID_MAX_PER_CELL(); it.k = 0u; it.emitted = 0u; it.maxEmit = max(1u, SIM_MAX_NEIGHBORS()); return it; }\nfn neighbor_iter_next(it: ptr<function, NeighborIter>, selfIndex: u32) -> u32 {\n // Naga (Firefox) sometimes fails to prove that a loop always returns, so\n // we structure this as break + return result to keep validation happy.\n var result: u32 = NEIGHBOR_NONE;\n loop {\n if ((*it).emitted >= (*it).maxEmit) { break; }\n if ((*it).r > (*it).cy + (*it).reach) { break; }\n if ((*it).k < (*it).maxK) {\n let id = GRID_INDICES[(*it).base + (*it).k];\n (*it).k = (*it).k + 1u;\n if (id != selfIndex) {\n (*it).emitted = (*it).emitted + 1u;\n result = id;\n break;\n } else {\n continue;\n }\n }\n (*it).c = (*it).c + 1;\n if ((*it).c > (*it).cx + (*it).reach) { (*it).c = (*it).cx - (*it).reach; (*it).r = (*it).r + 1; }\n if ((*it).r > (*it).cy + (*it).reach) { break; }\n let cell = grid_cell_index_from_rc((*it).r, (*it).c);\n let cnt = atomicLoad(&GRID_COUNTS[cell]);\n (*it).maxK = min(cnt, GRID_MAX_PER_CELL());\n (*it).base = cell * GRID_MAX_PER_CELL();\n (*it).k = 0u;\n }\n return result;\n}`\n );\n\n // Optional: allow force modules to inject globals\n const addGlobal = (module: Module, descriptor: WebGPUForceDescriptor) => {\n if (module.role !== ModuleRole.Force) return;\n if (!descriptor.global) return;\n const { getUniform, getLength } = makeGetUniformAndLength(module);\n const code = descriptor.global({ getUniform, getLength });\n if (code && code.trim()) {\n globals.push(`// Global for ${module.name}`);\n globals.push(code.trim());\n }\n };\n modules\n .filter((m) => m.role === ModuleRole.Force)\n .forEach((m, idx) =>\n addGlobal(m, descriptors[idx] as WebGPUForceDescriptor)\n );\n\n const systemEntrypoints: string[] = [];\n systemEntrypoints.push(`@compute @workgroup_size(64)\nfn grid_clear(@builtin(global_invocation_id) global_id: vec3<u32>) {\n let idx = global_id.x;\n let total = GRID_COLS() * GRID_ROWS();\n if (idx < total) {\n atomicStore(&GRID_COUNTS[idx], 0u);\n }\n}`);\n systemEntrypoints.push(`@compute @workgroup_size(64)\nfn grid_build(@builtin(global_invocation_id) global_id: vec3<u32>) {\n let i = global_id.x;\n let count = SIM_COUNT();\n if (i >= count) { return; }\n let p = particles[i];\n if (p.mass == 0.0) { return; }\n let minX = GRID_MINX();\n let maxX = GRID_MAXX();\n let minY = GRID_MINY();\n let maxY = GRID_MAXY();\n let pad = GRID_CELL_SIZE() * 2.0;\n if (p.position.x + p.size < minX - pad || p.position.x - p.size > maxX + pad || p.position.y + p.size < minY - pad || p.position.y - p.size > maxY + pad) {\n return;\n }\n let cell = grid_cell_index(p.position);\n let offset = atomicAdd(&GRID_COUNTS[cell], 1u);\n if (offset < GRID_MAX_PER_CELL()) {\n let base = cell * GRID_MAX_PER_CELL();\n GRID_INDICES[base + offset] = i;\n }\n}`);\n\n const moduleFns: string[] = [];\n const stateStmts: string[] = [];\n const applyStmts: string[] = [];\n const constrainStmts: string[] = [];\n const correctStmts: string[] = [];\n const fn = (kind: string, name: string) => `${kind}_${name}`;\n const makeGetSet = (modName: string) => {\n const get = (name: string, pidVar = \"index\") => {\n const slot =\n stateSlots[name] !== undefined\n ? stateSlots[name]\n : localSlots[modName]?.[name];\n return slot === undefined\n ? \"0.0\"\n : `sim_state_read(u32(${pidVar}), ${slot}u)`;\n };\n const set = (name: string, val: string, pidVar = \"index\") => {\n const slot =\n stateSlots[name] !== undefined\n ? stateSlots[name]\n : localSlots[modName]?.[name];\n return slot === undefined\n ? \"\"\n : `sim_state_write(u32(${pidVar}), ${slot}u, ${val})`;\n };\n return { get, set };\n };\n\n modules.forEach((module, idx) => {\n if (module.role !== ModuleRole.Force) return;\n const descriptor = descriptors[idx] as WebGPUForceDescriptor;\n if (!descriptor.state) return;\n const layout = layouts.find((l) => l.moduleName === module.name)!;\n const { set } = makeGetSet(module.name);\n const { getUniform, getLength } = makeGetUniformAndLength(module);\n const body = descriptor.state({\n particleVar: \"particle\",\n dtVar: dtExpr,\n maxSizeVar: maxSizeExpr,\n getUniform,\n getLength,\n setState: set,\n });\n if (body && body.trim()) {\n const enabled = layout.mapping.enabled.expr;\n const name = fn(\"state\", module.name);\n moduleFns.push(\n `fn ${name}(particle: ptr<function, Particle>, index: u32) {\\n ${body.trim()}\\n}`\n );\n stateStmts.push(`if (${enabled} != 0.0) { ${name}(&particle, index); }`);\n }\n });\n\n modules.forEach((module, idx) => {\n if (module.role !== ModuleRole.Force) return;\n const descriptor = descriptors[idx] as WebGPUForceDescriptor;\n if (!descriptor.apply) return;\n const layout = layouts.find((l) => l.moduleName === module.name)!;\n const { get } = makeGetSet(module.name);\n const { getUniform, getLength } = makeGetUniformAndLength(module);\n const body = descriptor.apply({\n particleVar: \"particle\",\n dtVar: dtExpr,\n maxSizeVar: maxSizeExpr,\n getUniform,\n getLength,\n getState: get,\n });\n if (body && body.trim()) {\n const enabled = layout.mapping.enabled.expr;\n const name = fn(\"apply\", module.name);\n moduleFns.push(\n `fn ${name}(particle: ptr<function, Particle>, index: u32) {\\n ${body.trim()}\\n}`\n );\n applyStmts.push(`if (${enabled} != 0.0) { ${name}(&particle, index); }`);\n }\n });\n\n modules.forEach((module, idx) => {\n if (module.role !== ModuleRole.Force) return;\n const descriptor = descriptors[idx] as WebGPUForceDescriptor;\n if (!descriptor.constrain) return;\n const layout = layouts.find((l) => l.moduleName === module.name)!;\n const { get } = makeGetSet(module.name);\n const { getUniform, getLength } = makeGetUniformAndLength(module);\n const body = descriptor.constrain({\n particleVar: \"particle\",\n dtVar: dtExpr,\n maxSizeVar: maxSizeExpr,\n getUniform,\n getLength,\n getState: get,\n });\n if (body && body.trim()) {\n const enabled = layout.mapping.enabled.expr;\n const name = fn(\"constrain\", module.name);\n moduleFns.push(\n `fn ${name}(particle: ptr<function, Particle>, index: u32) {\\n ${body.trim()}\\n}`\n );\n constrainStmts.push(\n `if (${enabled} != 0.0) { ${name}(&particle, index); }`\n );\n }\n });\n\n modules.forEach((module, idx) => {\n if (module.role !== ModuleRole.Force) return;\n const descriptor = descriptors[idx] as WebGPUForceDescriptor;\n if (!descriptor.correct) return;\n const layout = layouts.find((l) => l.moduleName === module.name)!;\n const { get } = makeGetSet(module.name);\n const { getUniform, getLength } = makeGetUniformAndLength(module);\n const body = descriptor.correct({\n particleVar: \"particle\",\n dtVar: dtExpr,\n maxSizeVar: maxSizeExpr,\n prevPosVar: \"prevPos\",\n postPosVar: \"postPos\",\n getUniform,\n getLength,\n getState: get,\n });\n if (body && body.trim()) {\n const enabled = layout.mapping.enabled.expr;\n const name = fn(\"correct\", module.name);\n const functionCode = `fn ${name}(particle: ptr<function, Particle>, index: u32, prevPos: vec2<f32>, postPos: vec2<f32>) {\\n ${body.trim()}\\n}`;\n const callStatement = `if (${enabled} != 0.0) { ${name}(&particle, index, prevPos, postPos); }`;\n\n moduleFns.push(functionCode);\n correctStmts.push(callStatement);\n }\n });\n\n const statePass = `@compute @workgroup_size(64)\\nfn state_pass(@builtin(global_invocation_id) gid: vec3<u32>) {\\n let index = gid.x;\\n let count = ${effectiveCountExpr};\\n if (index >= count) { return; }\\n var particle = particles[index];\\n if (particle.mass <= 0.0) { return; }\\n ${stateStmts.join(\n \"\\n \"\n )}\\n particles[index] = particle;\\n}`;\n const applyPass = `@compute @workgroup_size(64)\\nfn apply_pass(@builtin(global_invocation_id) gid: vec3<u32>) {\\n let index = gid.x;\\n let count = ${effectiveCountExpr};\\n if (index >= count) { return; }\\n var particle = particles[index];\\n if (particle.mass <= 0.0) { return; }\\n ${applyStmts.join(\n \"\\n \"\n )}\\n particles[index] = particle;\\n}`;\n const integratePass = `@compute @workgroup_size(64)\\nfn integrate_pass(@builtin(global_invocation_id) gid: vec3<u32>) {\\n let index = gid.x;\\n let count = ${effectiveCountExpr};\\n if (index >= count) { return; }\\n var particle = particles[index];\\n if (particle.mass <= 0.0) { return; }\\n sim_state_write(index, 0u, particle.position.x);\\n sim_state_write(index, 1u, particle.position.y);\\n particle.velocity += particle.acceleration * ${dtExpr};\\n particle.position += particle.velocity * ${dtExpr};\\n sim_state_write(index, 2u, particle.position.x);\\n sim_state_write(index, 3u, particle.position.y);\\n particle.acceleration = vec2<f32>(0.0, 0.0);\\n particles[index] = particle;\\n}`;\n const constrainPass = `@compute @workgroup_size(64)\\nfn constrain_pass(@builtin(global_invocation_id) gid: vec3<u32>) {\\n let index = gid.x;\\n let count = ${effectiveCountExpr};\\n if (index >= count) { return; }\\n var particle = particles[index];\\n if (particle.mass <= 0.0) { return; }\\n ${constrainStmts.join(\n \"\\n \"\n )}\\n particles[index] = particle;\\n}`;\n const correctPass = `@compute @workgroup_size(64)\\nfn correct_pass(@builtin(global_invocation_id) gid: vec3<u32>) {\\n let index = gid.x;\\n let count = ${effectiveCountExpr};\\n if (index >= count) { return; }\\n var particle = particles[index];\\n if (particle.mass <= 0.0) { return; }\\n \\n // Compute position variables from integration state\\n let prevPos = vec2<f32>(sim_state_read(index, 0u), sim_state_read(index, 1u));\\n let postPos = vec2<f32>(sim_state_read(index, 2u), sim_state_read(index, 3u));\\n \\n ${correctStmts.join(\n \"\\n \"\n )}\\n particles[index] = particle;\\n}`;\n const mainPass = `@compute @workgroup_size(64)\\nfn main(@builtin(global_invocation_id) _gid: vec3<u32>) {}`;\n\n const code = [\n PARTICLE_STRUCT,\n STORAGE_DECL,\n ...uniformDecls,\n ...gridDecls,\n ...globals,\n ...systemEntrypoints,\n ...moduleFns,\n statePass,\n applyPass,\n integratePass,\n constrainPass,\n correctPass,\n mainPass,\n ].join(\"\\n\\n\");\n\n return {\n code,\n layouts,\n simStateStride: SIM_STATE_STRIDE_VAL,\n extraBindings: {\n grid: {\n countsBinding: gridCountsBinding,\n indicesBinding: gridIndicesBinding,\n },\n simState: { stateBinding: simStateBinding },\n sceneTexture: { textureBinding: sceneTextureBinding },\n arrays: Object.keys(arrayBindings).length > 0 ? arrayBindings : undefined,\n },\n };\n}\n","/**\n * ModuleRegistry\n *\n * Central registry for modules. It builds the combined WGSL Program and manages\n * per-module uniform state on the CPU, mirroring it into GPU uniform buffers.\n *\n * Key behaviors:\n * - Builds `Program` via the builders (uniform layouts + generated WGSL code)\n * - Allocates module uniform buffers and seeds default CPU-side uniform values\n * - Attaches uniform writers/readers to each Module instance\n * - Exposes helpers to get enabled render descriptors for the render pipeline\n * - Flushes uniform state to GPU upon writes and on initialization\n */\nimport type { GPUResources } from \"./gpu-resources\";\nimport { buildProgram, type Program } from \"./builders/program\";\nimport {\n Module,\n ModuleRole,\n type WebGPURenderDescriptor,\n DataType,\n} from \"../../module\";\n\n/**\n * Manages module enablement/state, builds the Program, and exposes uniform writers/readers.\n */\nexport class ModuleRegistry {\n private readonly modules: readonly Module[];\n private program: Program | null = null;\n private moduleUniformState: Record<string, number>[] = [];\n private moduleArrayState: Record<string, Record<string, number[]>> = {};\n private nameToIndex: Map<string, number> = new Map();\n private resources: GPUResources | null = null;\n\n constructor(modules: readonly Module[]) {\n this.modules = modules;\n }\n\n /**\n * Build WGSL program and allocate per-module uniform buffers.\n * Also seeds CPU-side uniform state and attaches writers/readers to modules.\n */\n initialize(resources: GPUResources): void {\n this.resources = resources;\n this.program = buildProgram(this.modules);\n // Rebuild name -> layout index map using Program layouts (includes internal first)\n this.nameToIndex = new Map();\n this.program.layouts.forEach((layout, i) =>\n this.nameToIndex.set(layout.moduleName, i)\n );\n resources.createModuleUniformBuffers(this.program.layouts);\n\n // Create array storage buffers for modules with array inputs\n this.modules.forEach((module) => {\n const arrayInputs = Object.entries(module.inputs)\n .filter(([_, type]) => type === DataType.ARRAY)\n .map(([key, _]) => key);\n\n if (arrayInputs.length > 0) {\n resources.createCombinedArrayStorageBuffer(module.name, arrayInputs);\n this.moduleArrayState[module.name] = {};\n arrayInputs.forEach((arrayKey) => {\n this.moduleArrayState[module.name][arrayKey] = [];\n });\n }\n });\n\n // Initialize CPU-side uniform state for each module\n this.moduleUniformState = this.program.layouts.map((layout) => {\n const state: Record<string, number> = {};\n for (const key of Object.keys(layout.mapping)) {\n // Only initialize number inputs (not array references)\n if (layout.mapping[key].flatIndex !== -1) {\n state[key] = 0;\n }\n }\n if (layout.moduleName !== \"simulation\" && \"enabled\" in layout.mapping) {\n state[\"enabled\"] = 1;\n }\n return state;\n });\n\n // Seed simStride if present on the simulation layout\n const simIdx = this.program.layouts.findIndex(\n (l) => l.moduleName === \"simulation\"\n );\n if (simIdx !== -1 && this.program.layouts[simIdx].mapping[\"simStride\"]) {\n this.moduleUniformState[simIdx][\"simStride\"] =\n this.program.simStateStride;\n }\n\n // Attach per-module uniform writers/readers\n this.modules.forEach((mod) => {\n const name = mod.name;\n mod.attachUniformWriter((values) =>\n this.writeModuleUniform(name, values)\n );\n mod.attachUniformReader(() => this.readModuleUniform(name));\n });\n }\n\n getProgram(): Program {\n if (!this.program) throw new Error(\"Program not initialized\");\n return this.program;\n }\n\n /** Returns a writer for the given module name. */\n getUniformWriter(\n name: string\n ): (values: Partial<Record<string, number | number[]>>) => void {\n return (values) => this.writeModuleUniform(name, values);\n }\n\n /** Returns a reader for the given module name. */\n getUniformReader(\n name: string\n ): () => Partial<Record<string, number | number[]>> {\n return () => this.readModuleUniform(name);\n }\n\n /** Filter enabled render module descriptors for the render pipeline. */\n getEnabledRenderDescriptors(): WebGPURenderDescriptor[] {\n return this.modules\n .map((m) => m.webgpu())\n .filter(\n (_descriptor, idx): _descriptor is WebGPURenderDescriptor =>\n this.modules[idx].role === ModuleRole.Render &&\n this.modules[idx].isEnabled()\n );\n }\n\n /** Get enabled render modules for the render pipeline.\n * Includes any module that provides render passes in its descriptor, regardless of role.\n */\n getEnabledRenderModules(): Module[] {\n return this.modules.filter((module, idx) => {\n if (!module.isEnabled()) return false;\n const descriptor = this.modules[idx].webgpu() as WebGPURenderDescriptor;\n return !!(\n descriptor &&\n descriptor.passes &&\n descriptor.passes.length > 0\n );\n });\n }\n\n /** Get all modules. */\n getModules(): readonly Module[] {\n return this.modules;\n }\n\n /** Write the current CPU state for all module uniforms to GPU buffers. */\n writeAllModuleUniforms(): void {\n if (!this.resources || !this.program) return;\n for (let i = 0; i < this.program.layouts.length; i++) {\n const name = this.program.layouts[i].moduleName;\n if (name === \"simulation\" || name === \"grid\") continue; // internal uniforms are managed elsewhere\n this.flushModuleUniform(i);\n }\n }\n\n // Internal helpers\n private readModuleUniform(\n name: string\n ): Partial<Record<string, number | number[]>> {\n const idx = this.getModuleIndex(name);\n const result: Partial<Record<string, number | number[]>> = {\n ...(this.moduleUniformState[idx] || {}),\n };\n\n // Add array state if present\n if (this.moduleArrayState[name]) {\n Object.assign(result, this.moduleArrayState[name]);\n }\n\n return result;\n }\n\n private writeModuleUniform(\n name: string,\n values: Partial<Record<string, number | number[]>>\n ): void {\n if (!this.program || !this.resources) return;\n const idx = this.getModuleIndex(name);\n const state = this.moduleUniformState[idx];\n\n // First pass: collect array updates and update state\n const arrayDataMap: Record<string, number[]> = {};\n let hasArrayUpdate = false;\n\n for (const [key, value] of Object.entries(values)) {\n if (Array.isArray(value)) {\n // Handle array inputs\n if (this.moduleArrayState[name]) {\n this.moduleArrayState[name][key] = [...value];\n arrayDataMap[key] = value;\n\n // Store array length in uniform state\n state[`${key}_length`] = value.length;\n hasArrayUpdate = true;\n }\n } else if (typeof value === \"number\") {\n // Handle number inputs\n state[key] = value;\n }\n }\n\n // Second pass: recalculate all offsets for this module if any array changed\n const arrayOffsets: Record<string, number> = {};\n if (hasArrayUpdate && this.moduleArrayState[name]) {\n // Get all array keys in a consistent order (alphabetical)\n const arrayKeys = Object.keys(this.moduleArrayState[name]).sort();\n let currentOffset = 0;\n\n for (const arrayKey of arrayKeys) {\n arrayOffsets[arrayKey] = currentOffset;\n state[`${arrayKey}_offset`] = currentOffset;\n currentOffset += this.moduleArrayState[name][arrayKey].length;\n }\n\n // Need to write all arrays, not just the ones that changed\n for (const arrayKey of arrayKeys) {\n if (!arrayDataMap[arrayKey]) {\n arrayDataMap[arrayKey] = this.moduleArrayState[name][arrayKey];\n }\n }\n }\n\n // Write combined array data if there are array updates\n if (hasArrayUpdate && Object.keys(arrayDataMap).length > 0) {\n this.resources.writeCombinedArrayStorage(\n name,\n arrayDataMap,\n arrayOffsets\n );\n }\n\n this.flushModuleUniform(idx);\n }\n\n private flushModuleUniform(index: number): void {\n if (!this.resources || !this.program) return;\n const layout = this.program.layouts[index];\n const state = this.moduleUniformState[index];\n const data = new Float32Array(layout.vec4Count * 4);\n for (const [key, map] of Object.entries(layout.mapping)) {\n data[(map as { flatIndex: number }).flatIndex] = state[key] ?? 0;\n }\n\n this.resources.writeModuleUniform(index, data);\n }\n\n private getModuleIndex(name: string): number {\n const idx = this.nameToIndex.get(name);\n if (idx === undefined) throw new Error(`Unknown module: ${name}`);\n return idx;\n }\n}\n","/**\n * GridSystem\n *\n * Maintains a world-aligned uniform grid based on the current view snapshot.\n * Allocates GPU storage for per-cell counts/indices and writes grid uniforms\n * into the `grid` system module's uniform buffer. Exposes resizeIfNeeded to\n * keep grid state synchronized with camera/zoom/size changes.\n */\nimport type { Program } from \"./builders/program\";\nimport type { GPUResources } from \"./gpu-resources\";\nimport type { ViewSnapshot } from \"../../view\";\n\nexport class SpacialGrid {\n private cols: number = 0;\n private rows: number = 0;\n private cellSize: number;\n private maxPerCell: number = 256;\n private lastView: ViewSnapshot | null = null;\n\n constructor(cellSize: number = 16) {\n this.cellSize = cellSize;\n }\n\n configure(\n view: ViewSnapshot,\n resources: GPUResources,\n program: Program\n ): void {\n const { minX, minY, maxX, maxY, cols, rows } = this.computeGrid(view);\n this.cols = cols;\n this.rows = rows;\n // Recreate storage to match grid dimensions\n resources.createGridStorage(cols * rows, this.maxPerCell);\n // Write grid uniforms\n this.writeUniforms(resources, program, {\n minX,\n minY,\n maxX,\n maxY,\n cols,\n rows,\n cellSize: this.cellSize,\n maxPerCell: this.maxPerCell,\n });\n this.lastView = { ...view };\n }\n\n resizeIfNeeded(\n view: ViewSnapshot,\n resources: GPUResources,\n program: Program\n ): void {\n if (\n this.lastView &&\n this.lastView.width === view.width &&\n this.lastView.height === view.height &&\n this.lastView.cx === view.cx &&\n this.lastView.cy === view.cy &&\n this.lastView.zoom === view.zoom\n ) {\n return;\n }\n this.configure(view, resources, program);\n }\n\n getCellCount(): number {\n return this.cols * this.rows;\n }\n\n getCellSize(): number {\n return this.cellSize;\n }\n\n setCellSize(cellSize: number): void {\n if (cellSize <= 0) {\n throw new Error(\"Cell size must be greater than 0\");\n }\n this.cellSize = cellSize;\n // Clear last view to force reconfiguration on next resizeIfNeeded/configure call\n this.lastView = null;\n }\n\n private computeGrid(view: ViewSnapshot): {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n cols: number;\n rows: number;\n } {\n const zoom = Math.max(view.zoom, 0.0001);\n const halfW = view.width / (2 * zoom);\n const halfH = view.height / (2 * zoom);\n const minX = view.cx - halfW;\n const maxX = view.cx + halfW;\n const minY = view.cy - halfH;\n const maxY = view.cy + halfH;\n const cols = Math.max(1, Math.ceil((maxX - minX) / this.cellSize));\n const rows = Math.max(1, Math.ceil((maxY - minY) / this.cellSize));\n return { minX, minY, maxX, maxY, cols, rows };\n }\n\n private writeUniforms(\n resources: GPUResources,\n program: Program,\n grid: {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n cols: number;\n rows: number;\n cellSize: number;\n maxPerCell: number;\n }\n ): void {\n const gridIdx = program.layouts.findIndex((l) => l.moduleName === \"grid\");\n if (gridIdx === -1) return;\n const layout = program.layouts[gridIdx];\n const values = new Float32Array(layout.vec4Count * 4);\n const mapping = layout.mapping as Record<string, { flatIndex: number }>;\n values[mapping.minX.flatIndex] = grid.minX;\n values[mapping.minY.flatIndex] = grid.minY;\n values[mapping.maxX.flatIndex] = grid.maxX;\n values[mapping.maxY.flatIndex] = grid.maxY;\n values[mapping.cols.flatIndex] = grid.cols;\n values[mapping.rows.flatIndex] = grid.rows;\n values[mapping.cellSize.flatIndex] = grid.cellSize;\n values[mapping.maxPerCell.flatIndex] = grid.maxPerCell;\n resources.writeModuleUniform(gridIdx, values);\n }\n}\n","/**\n * SimulationPipeline\n *\n * Wraps the compute side of the program. Builds compute layouts/pipelines from the\n * generated WGSL and runs the available passes in sequence each frame:\n * - grid_clear, grid_build (if present)\n * - state_pass, apply_pass, integrate_pass, constrain_pass (N iterations), correct_pass\n * If specialized passes are not present, falls back to `main`.\n */\nimport type { Program } from \"./builders/program\";\nimport type { GPUResources } from \"./gpu-resources\";\n\nexport class SimulationPipeline {\n private program: Program | null = null;\n\n initialize(resources: GPUResources, program: Program): void {\n this.program = program;\n resources.buildComputeLayouts(program);\n resources.buildComputePipelines(program.code);\n }\n\n runPasses(\n encoder: GPUCommandEncoder,\n resources: GPUResources,\n params: {\n particleCount: number;\n gridCellCount: number;\n workgroupSize: number;\n constrainIterations?: number;\n }\n ): void {\n if (!this.program) throw new Error(\"SimulationPipeline not initialized\");\n const bindGroup = resources.createComputeBindGroup(this.program);\n const groups = Math.ceil(params.particleCount / params.workgroupSize);\n const pipelines = resources.getSimulationPipelines();\n\n if (pipelines.gridClear && params.gridCellCount > 0) {\n const pass = encoder.beginComputePass();\n pass.setBindGroup(0, bindGroup);\n pass.setPipeline(pipelines.gridClear);\n const clearGroups = Math.ceil(\n params.gridCellCount / params.workgroupSize\n );\n if (clearGroups > 0) pass.dispatchWorkgroups(clearGroups);\n pass.end();\n }\n\n if (pipelines.gridBuild && params.particleCount > 0) {\n const pass = encoder.beginComputePass();\n pass.setBindGroup(0, bindGroup);\n pass.setPipeline(pipelines.gridBuild);\n const buildGroups = Math.ceil(\n params.particleCount / params.workgroupSize\n );\n if (buildGroups > 0) pass.dispatchWorkgroups(buildGroups);\n pass.end();\n }\n\n if (\n pipelines.state &&\n pipelines.apply &&\n pipelines.integrate &&\n pipelines.constrain &&\n pipelines.correct\n ) {\n if (groups > 0 && pipelines.state) {\n const pass = encoder.beginComputePass();\n pass.setBindGroup(0, bindGroup);\n pass.setPipeline(pipelines.state);\n pass.dispatchWorkgroups(groups);\n pass.end();\n }\n\n if (groups > 0 && pipelines.apply) {\n const pass = encoder.beginComputePass();\n pass.setBindGroup(0, bindGroup);\n pass.setPipeline(pipelines.apply);\n pass.dispatchWorkgroups(groups);\n pass.end();\n }\n\n if (groups > 0 && pipelines.integrate) {\n const pass = encoder.beginComputePass();\n pass.setBindGroup(0, bindGroup);\n pass.setPipeline(pipelines.integrate);\n pass.dispatchWorkgroups(groups);\n pass.end();\n }\n\n if (groups > 0 && pipelines.constrain) {\n const iterations = Math.max(1, params.constrainIterations ?? 1);\n for (let i = 0; i < iterations; i++) {\n // update simulation iteration uniform each loop\n resources.writeSimulationUniform(this.program, { iteration: i });\n const pass = encoder.beginComputePass();\n pass.setBindGroup(0, bindGroup);\n pass.setPipeline(pipelines.constrain);\n pass.dispatchWorkgroups(groups);\n pass.end();\n }\n }\n\n if (groups > 0 && pipelines.correct) {\n const pass = encoder.beginComputePass();\n pass.setBindGroup(0, bindGroup);\n pass.setPipeline(pipelines.correct);\n pass.dispatchWorkgroups(groups);\n pass.end();\n }\n return;\n }\n\n if (pipelines.main && groups > 0) {\n const simPass = encoder.beginComputePass();\n simPass.setBindGroup(0, bindGroup);\n simPass.setPipeline(pipelines.main);\n simPass.dispatchWorkgroups(groups);\n simPass.end();\n }\n }\n}\n","/**\n * Render Pass Builder\n *\n * Translates `RenderModuleDescriptor` passes into standalone WGSL programs:\n * - Fullscreen (raster) pass: draws a screen-aligned quad; optionally instanced per particle\n * - Compute image pass: reads from an input scene texture and writes to an output scene texture\n *\n * Provides helpers to resolve module uniforms (`getUniform`), sample/read/write scene\n * textures, and injects default vertex logic for instanced vs non-instanced fullscreen draws.\n */\nimport type { FullscreenRenderPass, ComputeRenderPass } from \"../../../module\";\nimport { DataType } from \"../../../module\";\nimport { ModuleUniformLayout } from \"./program\";\n\n// --- Internal helpers to reduce duplication ---\nfunction buildModuleUniformStruct(\n moduleName: string,\n layout: ModuleUniformLayout\n): string {\n const vec4Count = layout.vec4Count;\n const structFields = Array.from(\n { length: vec4Count },\n (_, k) => ` v${k}: vec4<f32>,`\n ).join(\"\\n\");\n return `struct Uniforms_${moduleName} {\\n${structFields}\\n}`;\n}\n\nfunction makeGetUniformExpr<Inputs extends Record<string, number | number[]>>(\n layout: ModuleUniformLayout,\n moduleName: string,\n moduleInputs: Record<keyof Inputs, DataType>\n): (id: keyof Inputs, index?: number | string) => string {\n return (id: keyof Inputs, index?: number | string) => {\n const mapping = layout.mapping[id as string];\n if (!mapping) return \"0.0\";\n\n // Check if this is an array input\n if (moduleInputs[id] === DataType.ARRAY) {\n if (index !== undefined) {\n // Use combined array with offset\n const offsetExpr =\n mapping.offsetExpr?.replace(\n `${moduleName}_uniforms`,\n `module_uniforms`\n ) || \"0u\";\n return `${moduleName}_arrays[u32(${offsetExpr}) + u32(${index})]`;\n } else {\n // Return the array variable name itself for direct access\n return `${moduleName}_arrays`;\n }\n } else {\n // Replace the uniform variable name for render passes\n const expr = mapping.expr.replace(\n `${moduleName}_uniforms`,\n `module_uniforms`\n );\n // Regular number input\n return expr;\n }\n };\n}\n\nfunction makeGetLengthExpr<Inputs extends Record<string, number | number[]>>(\n layout: ModuleUniformLayout,\n moduleName: string,\n moduleInputs: Record<keyof Inputs, DataType>\n): (id: keyof Inputs) => string {\n return (id: keyof Inputs) => {\n if (moduleInputs[id] === DataType.ARRAY) {\n const lengthMapping = layout.mapping[`${id.toString()}_length`];\n if (lengthMapping) {\n const expr = lengthMapping.expr.replace(\n `${moduleName}_uniforms`,\n `module_uniforms`\n );\n return `u32(${expr})`;\n }\n }\n return \"0u\";\n };\n}\n\nfunction getUniformForFullscreen<\n Inputs extends Record<string, number | number[]>\n>(\n lookupExpr: (id: keyof Inputs, index?: number | string) => string,\n clearColor: { r: number; g: number; b: number; a: number }\n): (id: keyof Inputs, index?: number | string) => string {\n const toFloatLiteral = (n: number) =>\n Number.isInteger(n) ? `${n}.0` : `${n}`;\n const cr = toFloatLiteral(clearColor.r);\n const cg = toFloatLiteral(clearColor.g);\n const cb = toFloatLiteral(clearColor.b);\n return (id: keyof Inputs, index?: number | string) =>\n id === \"canvasWidth\"\n ? \"render_uniforms.canvas_size.x\"\n : id === \"canvasHeight\"\n ? \"render_uniforms.canvas_size.y\"\n : id === \"clearColorR\"\n ? cr\n : id === \"clearColorG\"\n ? cg\n : id === \"clearColorB\"\n ? cb\n : lookupExpr(id, index);\n}\n\nfunction getUniformForCompute<Inputs extends Record<string, number | number[]>>(\n lookupExpr: (id: keyof Inputs, index?: number | string) => string,\n clearColor: { r: number; g: number; b: number; a: number }\n): (id: keyof Inputs, index?: number | string) => string {\n const toFloatLiteral = (n: number) =>\n Number.isInteger(n) ? `${n}.0` : `${n}`;\n const cr = toFloatLiteral(clearColor.r);\n const cg = toFloatLiteral(clearColor.g);\n const cb = toFloatLiteral(clearColor.b);\n return (id: keyof Inputs, index?: number | string) =>\n id === \"canvasWidth\"\n ? \"f32(textureDimensions(input_texture).x)\"\n : id === \"canvasHeight\"\n ? \"f32(textureDimensions(input_texture).y)\"\n : id === \"clearColorR\"\n ? cr\n : id === \"clearColorG\"\n ? cg\n : id === \"clearColorB\"\n ? cb\n : lookupExpr(id, index);\n}\n\nfunction moduleUniformBindingDecl(\n moduleName: string,\n bindingIndex: number\n): string {\n return `@group(0) @binding(${bindingIndex}) var<uniform> module_uniforms: Uniforms_${moduleName};`;\n}\n\nexport function buildFullscreenPassWGSL<\n Inputs extends Record<string, number | number[]> = Record<\n string,\n number | number[]\n >\n>(\n pass: FullscreenRenderPass<Inputs>,\n moduleName: string,\n layout: ModuleUniformLayout,\n moduleInputs: Record<keyof Inputs, DataType>,\n clearColor: { r: number; g: number; b: number; a: number }\n): string {\n // build WGSL\n const struct = buildModuleUniformStruct(moduleName, layout);\n const uniformExpr = makeGetUniformExpr<Inputs>(\n layout,\n moduleName,\n moduleInputs\n );\n const lengthExpr = makeGetLengthExpr<Inputs>(\n layout,\n moduleName,\n moduleInputs\n );\n\n const instanced = pass.instanced ?? true;\n const useParticleInVertex =\n instanced && !(\"instanceFrom\" in pass && pass.instanceFrom);\n\n const fragment = pass.fragment({\n getUniform: getUniformForFullscreen<Inputs>(uniformExpr, clearColor),\n getLength: lengthExpr,\n sampleScene: (uvExpr: string) =>\n `textureSampleLevel(scene_texture, scene_sampler, ${uvExpr}, 0.0)`,\n });\n\n // Vertex hook and defaults\n const vertexBodyHook = pass.vertex\n ? pass.vertex({\n getUniform: getUniformForFullscreen<Inputs>(uniformExpr, clearColor),\n getLength: lengthExpr,\n })\n : null;\n\n // Default vertex bodies for instanced and non-instanced modes\n const defaultVertexBodyInstanced = `\n li = i & 3u;\n let qp = qpos[li];\n // World position relative to camera, scaled by zoom\n let wp = (particle.position - render_uniforms.camera_position) * render_uniforms.zoom;\n // Convert to NDC\n let ndc = vec2<f32>(\n wp.x * 2.0 / render_uniforms.canvas_size.x,\n -wp.y * 2.0 / render_uniforms.canvas_size.y\n );\n // Quad size in NDC units\n let s = vec2<f32>(\n qp.x * particle.size * render_uniforms.zoom * 2.0 / render_uniforms.canvas_size.x,\n -qp.y * particle.size * render_uniforms.zoom * 2.0 / render_uniforms.canvas_size.y\n );\n out.position = vec4<f32>(ndc + s, 0.0, 1.0);\n`;\n\n const defaultVertexBodyNonInstanced = `\n li = i & 3u;\n out.position = vec4<f32>(qpos[li], 0.0, 1.0);\n`;\n\n const vertexBody =\n vertexBodyHook ??\n (instanced ? defaultVertexBodyInstanced : defaultVertexBodyNonInstanced);\n\n // Generate array storage buffer declarations for array inputs\n const arrayInputs = Object.entries(moduleInputs)\n .filter(([_, type]) => type === DataType.ARRAY)\n .map(([key, _]) => key);\n\n const arrayDeclarations =\n arrayInputs.length > 0\n ? `@group(0) @binding(5) var<storage, read> ${moduleName}_arrays: array<f32>;`\n : \"\";\n\n const code = `\nstruct Particle {\n position: vec2<f32>, velocity: vec2<f32>, acceleration: vec2<f32>,\n size: f32, mass: f32, color: vec4<f32>,\n}\nstruct RenderUniforms { canvas_size: vec2<f32>, camera_position: vec2<f32>, zoom: f32, _pad: f32 }\nstruct VertexOutput { @builtin(position) position: vec4<f32>, @location(0) uv: vec2<f32>, @location(1) color: vec4<f32>, @location(2) @interpolate(flat) index: u32, @location(3) @interpolate(flat) mass: f32 }\n@group(0) @binding(0) var<storage, read> particles: array<Particle>;\n@group(0) @binding(1) var<uniform> render_uniforms: RenderUniforms;\n@group(0) @binding(2) var scene_texture: texture_2d<f32>;\n@group(0) @binding(3) var scene_sampler: sampler;\n@vertex fn vs_main(@builtin(vertex_index) i: u32, @builtin(instance_index) inst: u32) -> VertexOutput {\n var out: VertexOutput;\n let qpos = array<vec2<f32>,4>(vec2<f32>(-1,-1),vec2<f32>(1,-1),vec2<f32>(-1,1),vec2<f32>(1,1));\n let quv = array<vec2<f32>,4>(vec2<f32>(0,1),vec2<f32>(1,1),vec2<f32>(0,0),vec2<f32>(1,0));\n // Provide common inputs for hook body\n let instance_index = inst;\n var particle: Particle = ${\n useParticleInVertex\n ? `particles[inst]`\n : `Particle(vec2<f32>(0.0), vec2<f32>(0.0), vec2<f32>(0.0), 0.0, 0.0, vec4<f32>(1.0))`\n };\n ${\n useParticleInVertex\n ? `if (particle.mass == 0.0) { out.position = vec4<f32>(2,2,1,1); out.uv = vec2<f32>(0,0); out.color = vec4<f32>(0); return out; }`\n : ``\n }\n // Sensible defaults; hook or defaults may overwrite\n var li: u32 = i & 3u;\n out.uv = quv[li];\n out.index = instance_index;\n out.color = ${useParticleInVertex ? `particle.color` : `vec4<f32>(1.0)`};\n // Pass pinned flag to fragment (1 if mass < 0)\n ${useParticleInVertex ? `out.mass = particle.mass;` : `out.mass = 0.0;`}\n${vertexBody}\n return out;\n}\n@fragment fn fs_main(@location(0) uv: vec2<f32>, @location(1) color: vec4<f32>, @location(2) @interpolate(flat) index: u32, @location(3) @interpolate(flat) mass: f32, @builtin(position) frag_coord: vec4<f32>) -> @location(0) vec4<f32> ${fragment}`;\n\n return `${struct}\\n${moduleUniformBindingDecl(\n moduleName,\n 4\n )}\\n${arrayDeclarations}\\n${code}`;\n}\n\nexport function buildComputeImagePassWGSL<\n Inputs extends Record<string, number | number[]> = Record<\n string,\n number | number[]\n >\n>(\n pass: ComputeRenderPass<Inputs>,\n moduleName: string,\n layout: ModuleUniformLayout,\n moduleInputs: Record<keyof Inputs, DataType>,\n clearColor: { r: number; g: number; b: number; a: number },\n workgroup: [number, number, number] = [8, 8, 1]\n): string {\n // struct and uniform lookup\n const struct = buildModuleUniformStruct(moduleName, layout);\n const uniformExpr = makeGetUniformExpr<Inputs>(\n layout,\n moduleName,\n moduleInputs\n );\n const lengthExpr = makeGetLengthExpr<Inputs>(\n layout,\n moduleName,\n moduleInputs\n );\n\n // Generate array storage buffer declarations for array inputs\n const arrayInputs = Object.entries(moduleInputs)\n .filter(([_, type]) => type === DataType.ARRAY)\n .map(([key, _]) => key);\n\n const arrayDeclarations =\n arrayInputs.length > 0\n ? `@group(0) @binding(3) var<storage, read> ${moduleName}_arrays: array<f32>;`\n : \"\";\n\n // kernel\n const kernelBody = pass.kernel({\n getUniform: getUniformForCompute<Inputs>(uniformExpr, clearColor),\n getLength: lengthExpr,\n readScene: (coordsExpr: string) =>\n `textureLoad(input_texture, ${coordsExpr}, 0)`,\n writeScene: (coordsExpr: string, colorExpr: string) =>\n `textureStore(output_texture, ${coordsExpr}, ${colorExpr})`,\n });\n\n // code\n const code = `\n@group(0) @binding(0) var input_texture: texture_2d<f32>;\n@group(0) @binding(1) var output_texture: texture_storage_2d<rgba8unorm, write>;\n@compute @workgroup_size(${workgroup[0]}, ${workgroup[1]}, ${workgroup[2]})\nfn cs_main(@builtin(global_invocation_id) gid: vec3<u32>) {\n let coords = vec2<i32>(i32(gid.x), i32(gid.y));\n let dims = textureDimensions(input_texture);\n if (coords.x >= i32(dims.x) || coords.y >= i32(dims.y)) { return; }\n ${kernelBody}\n}`;\n\n return `${struct}\\n${moduleUniformBindingDecl(\n moduleName,\n 2\n )}\\n${arrayDeclarations}\\n${code}`;\n}\n","/**\n * RenderPipeline\n *\n * Manages scene render targets (ping-pong textures) and executes a sequence of\n * render module passes. Two pass types are supported:\n * - Fullscreen (raster) passes: draw a screen-aligned quad, optionally instanced per particle\n * - Compute image passes: read from a scene texture and write to the other scene texture\n *\n * The pipeline resolves each module's uniform layout, binds particle/render uniforms\n * and module uniforms, and handles ping-pong view swapping when a pass writes the scene.\n * Finally, it presents the last written scene view to the canvas using a cached copy pipeline.\n */\nimport type { ModuleUniformLayout, Program } from \"./builders/program\";\nimport type { GPUResources } from \"./gpu-resources\";\nimport {\n Module,\n ComputeRenderPass,\n RenderPassKind,\n DataType,\n type FullscreenRenderPass,\n type WebGPURenderDescriptor,\n} from \"../../module\";\nimport {\n buildComputeImagePassWGSL,\n buildFullscreenPassWGSL,\n} from \"./builders/render-pass\";\n\n/**\n * Run a fullscreen rasterization pass that draws a screen-aligned quad.\n *\n * Builds WGSL program via the render DSL, acquires (or creates) a cached\n * pipeline, binds particle + render uniforms + module uniforms, and draws.\n */\n\n/**\n * Run a compute image pass that reads from `currentView` and writes into `otherView`.\n *\n * This uses a compute pipeline generated from the DSL. If the pass is marked\n * as writing the scene, the caller will swap the views afterwards.\n */\n\nexport class RenderPipeline {\n ensureTargets(resources: GPUResources, width: number, height: number): void {\n resources.ensureSceneTextures(width, height);\n }\n\n clearTargets(\n resources: GPUResources,\n color: { r: number; g: number; b: number; a: number } = {\n r: 0,\n g: 0,\n b: 0,\n a: 0,\n }\n ): void {\n try {\n const encoder = resources.getDevice().createCommandEncoder();\n const passA = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: resources.getCurrentSceneTextureView(),\n clearValue: { r: color.r, g: color.g, b: color.b, a: 0 },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n passA.end();\n const passB = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: resources.getOtherSceneTextureView(),\n clearValue: { r: color.r, g: color.g, b: color.b, a: 0 },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n passB.end();\n resources.getDevice().queue.submit([encoder.finish()]);\n } catch (_) {\n // ignore if textures not ready\n }\n }\n\n runPasses(\n encoder: GPUCommandEncoder,\n modules: Module[],\n program: Program,\n resources: GPUResources,\n viewSize: { width: number; height: number },\n particleCount: number,\n clearColor: { r: number; g: number; b: number; a: number }\n ): GPUTextureView {\n let currentView = resources.getCurrentSceneTextureView();\n let otherView = resources.getOtherSceneTextureView();\n let lastWritten: GPUTextureView | null = null;\n let anyWrites = false;\n\n for (let i = 0; i < modules.length; i++) {\n const module = modules[i];\n const descriptor = module.webgpu() as WebGPURenderDescriptor;\n if (!descriptor.passes || descriptor.passes.length === 0) continue;\n for (const pass of descriptor.passes) {\n // Resolve the uniform layout for this module\n const layout = program.layouts.find(\n (l) => l.moduleName === module.name\n )!;\n // Snapshot the views state for this pass\n const views = { currentView, otherView, anyWrites };\n let wrote: \"current\" | \"other\" | null = null;\n if (pass.kind === RenderPassKind.Fullscreen) {\n // Fullscreen raster pass (quad). Can write the scene directly to current view\n this.runFullscreenPass(\n encoder,\n module,\n layout,\n pass as FullscreenRenderPass,\n views,\n resources,\n particleCount,\n clearColor\n );\n wrote = pass.writesScene ? \"current\" : null;\n }\n if (pass.kind === RenderPassKind.Compute) {\n // Compute image pass. Writes into other view; if it writes the scene we ping-pong swap\n this.runComputePass(\n encoder,\n module,\n layout,\n pass as ComputeRenderPass,\n views,\n resources,\n viewSize,\n clearColor\n );\n wrote = pass.writesScene ? \"other\" : null;\n }\n\n // Update ping-pong state based on where this pass wrote the scene\n if (wrote === \"current\") {\n lastWritten = currentView;\n anyWrites = true;\n } else if (wrote === \"other\") {\n lastWritten = otherView;\n anyWrites = true;\n const tmp = currentView;\n currentView = otherView;\n otherView = tmp;\n }\n }\n }\n // If no render pass wrote to the scene this frame, explicitly clear the current view\n if (!anyWrites) {\n const pass = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: currentView,\n clearValue: clearColor,\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n pass.end();\n lastWritten = currentView;\n }\n\n // Return the last written (or cleared) view\n return lastWritten ?? currentView;\n }\n\n present(\n encoder: GPUCommandEncoder,\n resources: GPUResources,\n sourceView?: GPUTextureView\n ): void {\n const pipeline = resources.getCopyPipeline(resources.format);\n const bindGroup = resources.getDevice().createBindGroup({\n layout: pipeline.getBindGroupLayout(0),\n entries: [\n {\n binding: 0,\n resource: sourceView ?? resources.getCurrentSceneTextureView(),\n },\n { binding: 1, resource: resources.getSceneSampler() },\n ],\n });\n const canvasView = resources.getContext().getCurrentTexture().createView();\n const pass = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: canvasView,\n clearValue: { r: 0, g: 0, b: 0, a: 1 },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n pass.setPipeline(pipeline);\n pass.setBindGroup(0, bindGroup);\n pass.draw(4, 1);\n pass.end();\n }\n\n private runFullscreenPass(\n encoder: GPUCommandEncoder,\n module: Module,\n layout: ModuleUniformLayout,\n pass: FullscreenRenderPass,\n views: {\n currentView: GPUTextureView;\n otherView: GPUTextureView;\n anyWrites: boolean;\n },\n resources: GPUResources,\n particleCount: number,\n clearColor: { r: number; g: number; b: number; a: number }\n ): void {\n // Generate WGSL for the fullscreen pass\n const wgsl = buildFullscreenPassWGSL(\n pass as FullscreenRenderPass,\n module.name,\n layout,\n module.inputs,\n clearColor\n );\n\n // Get array inputs for this module\n const arrayInputs = Object.entries(module.inputs)\n .filter(([_, type]) => type === DataType.ARRAY)\n .map(([key, _]) => key);\n\n // Check if this is a non-instanced pass that needs fragment particle access\n const fragmentParticleAccess = pass.instanced === false;\n\n // Acquire or create a cached render pipeline for the generated WGSL\n const pipeline = resources.getOrCreateFullscreenRenderPipeline(\n wgsl,\n arrayInputs,\n fragmentParticleAccess\n );\n\n // Create bind group with particle data, global render uniforms, scene sampler/texture, and module uniforms\n const bindGroup = resources.createFullscreenBindGroup(\n resources.getParticleBuffer()!,\n resources.getRenderUniformBuffer()!,\n views.otherView,\n resources.getSceneSampler(),\n resources\n .getModuleUniformBuffers()\n .find((muf) => muf.layout.moduleName === module.name)!.buffer,\n module.name,\n arrayInputs,\n fragmentParticleAccess\n );\n\n // Begin render pass targeting the current view. Clear only on the very first write\n const renderPass = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: views.currentView,\n clearValue: clearColor,\n loadOp: views.anyWrites ? \"load\" : \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n renderPass.setPipeline(pipeline);\n renderPass.setBindGroup(0, bindGroup);\n const instanced = pass.instanced ?? true;\n // Support instanceFrom to drive instance count from an array input length\n let instanceCount = particleCount;\n if (pass.instanceFrom) {\n const inputs = module.read();\n const arr = (inputs[pass.instanceFrom] as number[]) || [];\n instanceCount = arr.length >>> 0;\n }\n // Draw\n if (instanced && instanceCount > 0) {\n renderPass.draw(4, instanceCount);\n } else if (!instanced) {\n renderPass.draw(4, 1);\n }\n\n renderPass.end();\n }\n\n private runComputePass(\n encoder: GPUCommandEncoder,\n module: Module,\n layout: ModuleUniformLayout,\n pass: ComputeRenderPass,\n views: {\n currentView: GPUTextureView;\n otherView: GPUTextureView;\n anyWrites: boolean;\n },\n resources: GPUResources,\n size: { width: number; height: number },\n clearColor: { r: number; g: number; b: number; a: number }\n ): void {\n // Generate WGSL for the compute pass\n const wgsl = buildComputeImagePassWGSL(\n pass as ComputeRenderPass,\n module.name,\n layout,\n module.inputs,\n clearColor\n );\n\n // Get array inputs for this module\n const arrayInputs = Object.entries(module.inputs)\n .filter(([_, type]) => type === DataType.ARRAY)\n .map(([key, _]) => key);\n\n // Acquire or create a cached compute pipeline\n const pipeline = resources.getOrCreateImageComputePipeline(wgsl);\n const muf = resources\n .getModuleUniformBuffers()\n .find((muf) => muf.layout.moduleName === module.name)!;\n // Bind current/other scene views and module uniforms\n const bindGroup = resources.createImageComputeBindGroup(\n pipeline,\n views.currentView,\n views.otherView,\n muf.buffer,\n module.name,\n arrayInputs\n );\n const canvasSize = size;\n // Compute dispatch size (assuming 8x8 threadgroups)\n const workgroupsX = Math.ceil(canvasSize.width / 8);\n const workgroupsY = Math.ceil(canvasSize.height / 8);\n const cp = encoder.beginComputePass();\n cp.setPipeline(pipeline);\n cp.setBindGroup(0, bindGroup);\n cp.dispatchWorkgroups(workgroupsX, workgroupsY);\n cp.end();\n }\n}\n","/**\n * WebGPU Engine\n *\n * High-level orchestrator that wires together GPU resources, the simulation pipeline,\n * the render pipeline, the spatial grid, and the view controller. It owns the main\n * animation loop and exposes a minimal API for sizing, camera/zoom control, particle\n * data management, and play/pause lifecycle.\n *\n * Responsibilities:\n * - Initialize GPU device/context and allocate core buffers via GPUResources\n * - Build the WGSL program and per-module uniform buffers via ModuleRegistry\n * - Initialize compute (simulation) and render pipelines\n * - Maintain and sync the spatial grid to match the current view/camera\n * - Drive per-frame simulation passes and render passes into ping-pong scene textures\n * - Present the final texture to the canvas, tracking an EMA FPS estimate\n */\nimport type { Module } from \"../../module\";\nimport { GPUResources } from \"./gpu-resources\";\nimport { ParticleStore } from \"./particle-store\";\nimport { AbstractEngine, IParticle } from \"../../interfaces\";\nimport { ModuleRegistry } from \"./module-registry\";\nimport { SpacialGrid } from \"./spacial-grid\";\nimport { SimulationPipeline } from \"./simulation-pipeline\";\nimport { RenderPipeline } from \"./render-pipeline\";\n\nexport class WebGPUEngine extends AbstractEngine {\n private resources: GPUResources;\n private particles: ParticleStore;\n private registry: ModuleRegistry;\n private sim: SimulationPipeline;\n private render: RenderPipeline;\n private grid: SpacialGrid;\n private bufferMaxParticles: number; // Buffer allocation size (separate from effective maxParticles)\n private workgroupSize: number;\n private simStrideValue: number = 0;\n private shouldSyncNextTick: boolean = false;\n private animationId: number | null = null;\n private didSwapchainWarmup: boolean = false;\n\n constructor(options: {\n canvas: HTMLCanvasElement;\n forces: Module[];\n render: Module[];\n constrainIterations?: number;\n clearColor?: { r: number; g: number; b: number; a: number };\n cellSize?: number;\n maxParticles?: number;\n workgroupSize?: number;\n maxNeighbors?: number;\n }) {\n super({\n ...options,\n constrainIterations: options.constrainIterations ?? 50,\n });\n // Buffer allocation size (separate from effective maxParticles limit)\n this.bufferMaxParticles = options.maxParticles ?? 100000;\n // Set effective maxParticles limit (null means no limit)\n this.setMaxParticles(options.maxParticles ?? null);\n this.workgroupSize = options.workgroupSize ?? 64;\n this.resources = new GPUResources({ canvas: options.canvas });\n this.particles = new ParticleStore(this.bufferMaxParticles, 12);\n this.registry = new ModuleRegistry([...options.forces, ...options.render]);\n this.sim = new SimulationPipeline();\n this.render = new RenderPipeline();\n this.grid = new SpacialGrid(this.cellSize);\n }\n\n async initialize(): Promise<void> {\n await this.resources.initialize();\n\n // Core buffers\n this.resources.createParticleBuffer(this.bufferMaxParticles, 12);\n this.resources.createRenderUniformBuffer(24);\n\n // Build program + module uniform buffers\n this.registry.initialize(this.resources);\n const program = this.registry.getProgram();\n if (program.extraBindings.simState) {\n this.resources.createSimStateBuffer(this.bufferMaxParticles, 4);\n }\n\n // Build compute pipelines\n this.sim.initialize(this.resources, program);\n\n // Ensure scene textures\n const size = this.view.getSize();\n this.resources.canvas.width = size.width;\n this.resources.canvas.height = size.height;\n this.render.ensureTargets(this.resources, size.width, size.height);\n\n // Safari/WebKit workaround:\n // On WebKit's WebGPU implementation, the first present can stay blank until the canvas\n // experiences a \"real\" resize (even 1px). Apps have been working around this by\n // jiggling size once after starting. We do it here, once, after the final canvas size\n // is set and before the first present.\n await this.warmupSwapchainIfNeeded(size.width, size.height);\n\n // Configure grid storage + uniforms\n this.grid.configure(this.view.getSnapshot(), this.resources, program);\n\n // Seed module uniforms on GPU\n this.registry.writeAllModuleUniforms();\n\n // Cache sim stride value\n this.simStrideValue = program.simStateStride;\n }\n\n // Implement abstract methods for animation loop\n protected startAnimationLoop(): void {\n if (this.animationId) {\n cancelAnimationFrame(this.animationId);\n this.animationId = null;\n }\n this.animate();\n }\n\n protected stopAnimationLoop(): void {\n // WebGPU doesn't need to cancel requestAnimationFrame explicitly\n // since it's handled in the animate method\n }\n\n async destroy(): Promise<void> {\n this.pause();\n // Stop animation loop to prevent using destroyed resources\n if (this.animationId !== null) {\n cancelAnimationFrame(this.animationId);\n this.animationId = null;\n }\n await this.resources.dispose();\n }\n\n // Override setSize to also update WebGPU-specific resources\n setSize(width: number, height: number): void {\n this.view.setSize(width, height);\n this.resources.canvas.width = width;\n this.resources.canvas.height = height;\n this.render.ensureTargets(this.resources, width, height);\n this.grid.resizeIfNeeded(\n this.view.getSnapshot(),\n this.resources,\n this.registry.getProgram()\n );\n }\n\n // Override onViewChanged to update grid when view changes\n protected onViewChanged(): void {\n this.grid.resizeIfNeeded(\n this.view.getSnapshot(),\n this.resources,\n this.registry.getProgram()\n );\n }\n\n setParticles(p: IParticle[]): void {\n this.particles.setParticles(p);\n this.particles.syncToGPU(this.resources);\n // Update maxSize tracking\n this.resetMaxSize();\n for (const particle of p) {\n this.updateMaxSize(particle.size);\n }\n }\n\n async addParticle(p: IParticle): Promise<void> {\n await this.particles.syncFromGPU(this.resources);\n this.particles.addParticle(p);\n this.particles.syncToGPU(this.resources);\n // Update maxSize tracking\n this.updateMaxSize(p.size);\n }\n\n /**\n * Forces GPU-to-CPU synchronization and returns current particle data.\n * Use this when you need the most up-to-date particle positions from GPU.\n */\n async getParticles(): Promise<IParticle[]> {\n await this.particles.syncFromGPU(this.resources);\n return this.particles.getParticles();\n }\n\n async getParticle(index: number): Promise<IParticle> {\n await this.particles.syncFromGPU(this.resources);\n return this.particles.getParticle(index);\n }\n\n getCount(): number {\n const actualCount = this.particles.getCount();\n if (this.maxParticles === null) {\n return actualCount;\n }\n return Math.min(actualCount, this.maxParticles);\n }\n\n clear(): void {\n this.particles.clear();\n // Clear scene textures proactively\n this.render.clearTargets(this.resources, this.clearColor);\n // Reset maxSize tracking\n this.resetMaxSize();\n // Sync module uniforms to GPU (important for grab module reset)\n this.registry.writeAllModuleUniforms();\n }\n\n private animate = async (): Promise<void> => {\n const dt = this.getTimeDelta();\n this.updateFPS(dt);\n\n // Write view uniforms\n const snapshot = this.view.getSnapshot();\n this.resources.writeRenderUniforms(snapshot);\n\n // Keep grid/world extents in sync with current view\n this.grid.resizeIfNeeded(\n this.view.getSnapshot(),\n this.resources,\n this.registry.getProgram()\n );\n\n // Encode command buffer\n const encoder = this.resources.getDevice().createCommandEncoder();\n\n // Only run simulation/oscillators when playing\n if (this.playing) {\n // Update engine-owned oscillators before simulation uniforms are written\n this.updateOscillators(dt);\n // Update simulation uniforms (dt, count, simStride, maxSize, maxParticles)\n const actualCount = this.particles.getCount();\n this.resources.writeSimulationUniform(this.registry.getProgram(), {\n dt,\n count: actualCount,\n simStride: this.simStrideValue,\n maxSize: this.getMaxSize(),\n iteration: 0,\n maxNeighbors: this.getMaxNeighbors(),\n maxParticles: this.maxParticles ?? -1, // Use -1 as sentinel for null\n });\n\n // Run simulation passes\n this.sim.runPasses(encoder, this.resources, {\n particleCount: this.getCount(), // Use effective count\n gridCellCount: this.grid.getCellCount(),\n workgroupSize: this.workgroupSize,\n constrainIterations: this.constrainIterations,\n });\n\n if (this.shouldSyncNextTick) {\n // Sync to GPU on next tick\n this.waitForNextTick().then(() =>\n this.particles.syncToGPU(this.resources)\n );\n this.shouldSyncNextTick = false;\n }\n } else {\n // When paused, handle particle sync but skip simulation\n if (!this.shouldSyncNextTick) {\n this.shouldSyncNextTick = true;\n await this.particles.syncFromGPU(this.resources);\n }\n }\n\n const particleCount = this.getCount(); // Use effective count\n\n // Always run render passes to keep displaying current state\n const lastView = this.render.runPasses(\n encoder,\n this.registry.getEnabledRenderModules(),\n this.registry.getProgram(),\n this.resources,\n this.view.getSize(),\n particleCount,\n this.clearColor\n );\n\n this.render.present(encoder, this.resources, lastView);\n this.resources.getDevice().queue.submit([encoder.finish()]);\n\n // Continue animation loop regardless of playing state\n this.animationId = requestAnimationFrame(this.animate);\n };\n\n private waitForNextTick(): Promise<void> {\n return new Promise((resolve) => {\n requestAnimationFrame(() => {\n resolve();\n });\n });\n }\n\n private isWebKitWebGPU(): boolean {\n // We specifically want WebKit's WebGPU, not Chromium/Blink.\n // - On iOS, *all* browsers use WebKit, so we treat them as WebKit.\n // - On macOS, Safari is WebKit; Chrome/Edge/Opera are not (even though their UA includes \"AppleWebKit\").\n try {\n if (typeof navigator === \"undefined\") return false;\n const ua = navigator.userAgent || \"\";\n const isIOS = /iPad|iPhone|iPod/.test(ua);\n if (isIOS) return true;\n const isAppleWebKit = /AppleWebKit\\//.test(ua);\n const isSafari = /Safari\\//.test(ua);\n const isChromiumLike = /(Chrome|Chromium|Edg|OPR)\\//.test(ua);\n return isAppleWebKit && isSafari && !isChromiumLike;\n } catch {\n return false;\n }\n }\n\n private async warmupSwapchainIfNeeded(\n width: number,\n height: number\n ): Promise<void> {\n if (this.didSwapchainWarmup) return;\n if (!this.isWebKitWebGPU()) return;\n if (height <= 1) return;\n\n this.didSwapchainWarmup = true;\n\n // 1px \"resize\" to force WebKit to fully bind the swapchain/currentTexture.\n // We wait a couple of animation frames to match real-world workarounds that proved reliable.\n try {\n this.resources.canvas.width = width;\n this.resources.canvas.height = height - 1;\n await this.waitForNextTick();\n this.resources.canvas.width = width;\n this.resources.canvas.height = height;\n await this.waitForNextTick();\n // Re-ensure targets (idempotent) in case any implementation ties resources to canvas size.\n this.render.ensureTargets(this.resources, width, height);\n } catch {\n // If anything goes wrong, fail open: rendering may still work on other browsers.\n }\n }\n\n // Override export to use module registry\n export(): Record<string, Record<string, number>> {\n const settings: Record<string, Record<string, number>> = {};\n for (const module of this.registry.getModules()) {\n const moduleData = module.read();\n settings[module.name] = moduleData as Record<string, number>;\n }\n return settings;\n }\n\n // Override onModuleSettingsChanged to sync to GPU\n protected onModuleSettingsChanged(): void {\n this.registry.writeAllModuleUniforms();\n }\n\n // Handle configuration changes\n protected onClearColorChanged(): void {\n // Clear color changes don't require any immediate system updates\n // The new color will be used in the next render pass\n }\n\n protected onCellSizeChanged(): void {\n // Update spatial grid with new cell size\n this.grid.setCellSize(this.cellSize);\n\n // If initialized, reconfigure the grid with current view\n if (this.resources && this.view) {\n try {\n const program = this.registry.getProgram();\n this.grid.configure(this.view.getSnapshot(), this.resources, program);\n } catch (error) {\n // Ignore if not fully initialized yet\n }\n }\n }\n\n protected onConstrainIterationsChanged(): void {\n // Constrain iterations changes don't require any immediate system updates\n // The new value will be used in the next simulation pass\n }\n\n protected onMaxNeighborsChanged(): void {\n // Max neighbors affects only simulation-side neighbor iterator cap; no immediate rebuild needed\n }\n\n protected onMaxParticlesChanged(): void {\n // Max particles affects effective count; no immediate rebuild needed\n }\n}\n","import { Particle } from \"../../particle\";\nimport { Vector } from \"../../vector\";\n\nexport interface SpatialGridOptions {\n width: number;\n height: number;\n cellSize: number;\n}\n\nexport class SpatialGrid {\n private width: number;\n private height: number;\n private cellSize: number;\n private cols!: number;\n private rows!: number;\n private grid!: Particle[][][];\n\n // Dynamic bounds that match current camera view\n private minX!: number;\n private minY!: number;\n private maxX!: number;\n private maxY!: number;\n // Camera tracking\n private cameraX: number = 0;\n private cameraY: number = 0;\n private zoom: number = 1;\n\n // Track particles for incremental updates\n private particlePositions: Map<number, { col: number; row: number }> =\n new Map();\n\n constructor(options: SpatialGridOptions) {\n this.width = options.width;\n this.height = options.height;\n this.cellSize = options.cellSize;\n\n // Initialize with default camera view (canvas coordinates)\n this.updateBounds(0, 0, 1);\n }\n\n private updateBounds(cameraX: number, cameraY: number, zoom: number): void {\n this.cameraX = cameraX;\n this.cameraY = cameraY;\n this.zoom = zoom;\n\n // Calculate visible world bounds\n const worldLeft = -cameraX / zoom;\n const worldTop = -cameraY / zoom;\n const worldRight = (this.width - cameraX) / zoom;\n const worldBottom = (this.height - cameraY) / zoom;\n\n // Add padding around visible area to catch particles just outside view\n const padding = (Math.max(this.width, this.height) / zoom) * 0.5; // 50% padding\n this.minX = worldLeft - padding;\n this.minY = worldTop - padding;\n this.maxX = worldRight + padding;\n this.maxY = worldBottom + padding;\n\n // Recalculate grid dimensions (ensure at least 1x1 to avoid undefined rows/cols)\n this.cols = Math.max(1, Math.ceil((this.maxX - this.minX) / this.cellSize));\n this.rows = Math.max(1, Math.ceil((this.maxY - this.minY) / this.cellSize));\n\n this.initializeGrid();\n }\n\n setCamera(cameraX: number, cameraY: number, zoom: number): void {\n // Only update if camera changed significantly to avoid constant grid rebuilding\n const threshold = this.cellSize * 0.5; // Half a cell\n const zoomThreshold = 0.1;\n\n if (\n Math.abs(this.cameraX - cameraX) > threshold ||\n Math.abs(this.cameraY - cameraY) > threshold ||\n Math.abs(this.zoom - zoom) > zoomThreshold\n ) {\n this.updateBounds(cameraX, cameraY, zoom);\n }\n }\n\n private initializeGrid(): void {\n this.grid = [];\n for (let row = 0; row < this.rows; row++) {\n this.grid[row] = [];\n for (let col = 0; col < this.cols; col++) {\n this.grid[row][col] = [];\n }\n }\n }\n\n clear(): void {\n for (let row = 0; row < this.rows; row++) {\n this.grid[row] = [];\n for (let col = 0; col < this.cols; col++) {\n this.grid[row][col] = [];\n }\n }\n // Clear particle position tracking\n this.particlePositions.clear();\n }\n\n /**\n * Incrementally clear only cells that contained particles\n * Much more efficient than full clear for sparse grids\n */\n clearIncremental(_particles: Particle[]): void {\n // Only clear cells that actually contained particles\n const cellsToClean = new Set<string>();\n\n // Collect cells that need clearing from previous particle positions\n for (const [, position] of this.particlePositions) {\n const key = `${position.row}-${position.col}`;\n cellsToClean.add(key);\n }\n\n // Clear only those cells\n for (const key of cellsToClean) {\n const [row, col] = key.split(\"-\").map(Number);\n if (row >= 0 && row < this.rows && col >= 0 && col < this.cols) {\n this.grid[row][col] = [];\n }\n }\n\n // Clear particle position tracking\n this.particlePositions.clear();\n }\n\n insert(particle: Particle): void {\n // Convert world coordinates to grid coordinates with offset\n const col = Math.floor((particle.position.x - this.minX) / this.cellSize);\n const row = Math.floor((particle.position.y - this.minY) / this.cellSize);\n\n // Clamp to grid bounds\n const clampedCol = Math.max(0, Math.min(col, this.cols - 1));\n const clampedRow = Math.max(0, Math.min(row, this.rows - 1));\n\n // Insert particle into grid\n // Safety: ensure row/col arrays exist (defensive against any transient zero-dimension states)\n if (!this.grid[clampedRow]) this.grid[clampedRow] = [];\n if (!this.grid[clampedRow][clampedCol])\n this.grid[clampedRow][clampedCol] = [];\n this.grid[clampedRow][clampedCol].push(particle);\n\n // Track particle position for incremental updates\n this.particlePositions.set(particle.id, {\n col: clampedCol,\n row: clampedRow,\n });\n }\n\n getParticles(\n point: Vector,\n radius: number,\n maxNeighbors?: number\n ): Particle[] {\n const neighbors: Particle[] = [];\n // Convert world coordinates to grid coordinates with offset\n const centerCol = Math.floor((point.x - this.minX) / this.cellSize);\n const centerRow = Math.floor((point.y - this.minY) / this.cellSize);\n\n // Calculate how many cells to check in each direction\n const cellRadius = Math.ceil(radius / this.cellSize);\n\n for (\n let row = centerRow - cellRadius;\n row <= centerRow + cellRadius;\n row++\n ) {\n if (maxNeighbors !== undefined && neighbors.length >= maxNeighbors) {\n return neighbors;\n }\n for (\n let col = centerCol - cellRadius;\n col <= centerCol + cellRadius;\n col++\n ) {\n if (maxNeighbors !== undefined && neighbors.length >= maxNeighbors) {\n return neighbors;\n }\n if (row >= 0 && row < this.rows && col >= 0 && col < this.cols) {\n const cellParticles = this.grid[row][col];\n for (const candidate of cellParticles) {\n const distance = point.distance(candidate.position);\n if (distance < radius) {\n neighbors.push(candidate);\n if (\n maxNeighbors !== undefined &&\n neighbors.length >= maxNeighbors\n ) {\n return neighbors;\n }\n }\n }\n }\n }\n }\n\n return neighbors;\n }\n\n getCellParticleCount(col: number, row: number): number {\n if (row >= 0 && row < this.rows && col >= 0 && col < this.cols) {\n return this.grid[row][col].length;\n }\n return 0;\n }\n\n getGridDimensions(): { cols: number; rows: number; cellSize: number } {\n return {\n cols: this.cols,\n rows: this.rows,\n cellSize: this.cellSize,\n };\n }\n\n getGridBounds(): { minX: number; minY: number; maxX: number; maxY: number } {\n return {\n minX: this.minX,\n minY: this.minY,\n maxX: this.maxX,\n maxY: this.maxY,\n };\n }\n\n getSize(): { width: number; height: number } {\n return {\n width: this.width,\n height: this.height,\n };\n }\n\n setSize(width: number, height: number): void {\n this.width = width;\n this.height = height;\n\n // Update bounds with current camera settings\n this.updateBounds(this.cameraX, this.cameraY, this.zoom);\n }\n\n getCellSize(): number {\n return this.cellSize;\n }\n\n setCellSize(cellSize: number): void {\n this.cellSize = cellSize;\n // Update bounds with new cell size\n this.updateBounds(this.cameraX, this.cameraY, this.zoom);\n }\n\n getAllParticles(): Particle[] {\n const allParticles: Particle[] = [];\n for (let row = 0; row < this.rows; row++) {\n for (let col = 0; col < this.cols; col++) {\n allParticles.push(...this.grid[row][col]);\n }\n }\n return allParticles;\n }\n}\n","export class Vector {\n constructor(public x: number = 0, public y: number = 0) {}\n\n add(vector: Vector): Vector {\n this.x += vector.x;\n this.y += vector.y;\n return this;\n }\n\n subtract(vector: Vector): Vector {\n this.x -= vector.x;\n this.y -= vector.y;\n return this;\n }\n\n multiply(scalar: number): Vector {\n this.x *= scalar;\n this.y *= scalar;\n return this;\n }\n\n divide(scalar: number): Vector {\n if (scalar === 0) throw new Error(\"Cannot divide by zero\");\n this.x /= scalar;\n this.y /= scalar;\n return this;\n }\n\n magnitude(): number {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n }\n\n normalize(): Vector {\n const mag = this.magnitude();\n if (mag === 0) {\n this.x = 0;\n this.y = 0;\n } else {\n this.x /= mag;\n this.y /= mag;\n }\n return this;\n }\n\n limit(max: number): Vector {\n const mag = this.magnitude();\n if (mag > max) {\n this.normalize().multiply(max);\n }\n return this;\n }\n\n dot(vector: Vector): number {\n return this.x * vector.x + this.y * vector.y;\n }\n\n distance(vector: Vector): number {\n const dx = this.x - vector.x;\n const dy = this.y - vector.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n\n direction(vector: Vector): Vector {\n const distance = this.distance(vector);\n return new Vector(\n (vector.x - this.x) / distance,\n (vector.y - this.y) / distance\n );\n }\n\n clone(): Vector {\n return new Vector(this.x, this.y);\n }\n\n set(x: number, y: number): Vector {\n this.x = x;\n this.y = y;\n return this;\n }\n\n zero(): Vector {\n this.x = 0;\n this.y = 0;\n return this;\n }\n\n static random(min: number = -1, max: number = 1): Vector {\n return new Vector(\n Math.random() * (max - min) + min,\n Math.random() * (max - min) + min\n );\n }\n\n static zero(): Vector {\n return new Vector(0, 0);\n }\n\n /**\n * Create a Vector2D from an angle in radians\n * @param angle Angle in radians (0 = right, π/2 = down, π = left, 3π/2 = up)\n * @param magnitude Length of the vector (default: 1)\n */\n static fromAngle(angle: number, magnitude: number = 1): Vector {\n return new Vector(Math.cos(angle) * magnitude, Math.sin(angle) * magnitude);\n }\n\n /**\n * Create a Vector2D from an angle in degrees\n * @param angle Angle in degrees (0° = right, 90° = down, 180° = left, 270° = up)\n * @param magnitude Length of the vector (default: 1)\n */\n static fromAngleDegrees(angle: number, magnitude: number = 1): Vector {\n const angleInRadians = (angle * Math.PI) / 180;\n return new Vector(\n Math.cos(angleInRadians) * magnitude,\n Math.sin(angleInRadians) * magnitude\n );\n }\n\n /**\n * Convert degrees to radians\n * @param degrees Angle in degrees\n * @returns Angle in radians\n */\n static degreesToRadians(degrees: number): number {\n return (degrees * Math.PI) / 180;\n }\n\n /**\n * Convert radians to degrees\n * @param radians Angle in radians\n * @returns Angle in degrees\n */\n static radiansToDegrees(radians: number): number {\n return (radians * 180) / Math.PI;\n }\n\n toJSON(): { x: number; y: number } {\n return { x: this.x, y: this.y };\n }\n}\n\n/**\n * Convert degrees to radians\n * @param degrees Angle in degrees\n * @returns Angle in radians\n */\nexport function degToRad(degrees: number): number {\n return (degrees * Math.PI) / 180;\n}\n\n/**\n * Convert radians to degrees\n * @param radians Angle in radians\n * @returns Angle in degrees\n */\nexport function radToDeg(radians: number): number {\n return (radians * 180) / Math.PI;\n}\n","import { IParticle } from \"./interfaces\";\nimport { Vector } from \"./vector\";\n\nlet idCounter = 0;\n\nexport class Particle implements IParticle {\n public id: number;\n public position: Vector;\n public velocity: Vector;\n public acceleration: Vector;\n public size: number;\n public mass: number;\n public color: { r: number; g: number; b: number; a: number };\n\n constructor(options: IParticle) {\n this.id = idCounter++;\n this.position = new Vector(options.position.x, options.position.y);\n this.velocity = new Vector(options.velocity.x, options.velocity.y);\n this.acceleration = new Vector(0, 0);\n this.size = options.size;\n this.mass = options.mass;\n this.color = options.color;\n }\n\n toJSON(): IParticle {\n return {\n position: this.position.toJSON(),\n velocity: this.velocity.toJSON(),\n size: this.size,\n mass: this.mass,\n color: this.color,\n };\n }\n}\n","import { AbstractEngine, IParticle } from \"../../interfaces\";\nimport {\n Module,\n ModuleRole,\n CanvasComposition,\n CPURenderDescriptor,\n CPUForceDescriptor,\n} from \"../../module\";\nimport { SpatialGrid } from \"./spatial-grid\";\nimport { Particle } from \"../../particle\";\nimport { Vector } from \"../../vector\";\n\nexport class CPUEngine extends AbstractEngine {\n private particles: Particle[] = [];\n private canvas: HTMLCanvasElement;\n private grid: SpatialGrid;\n private animationId: number | null = null;\n\n constructor(options: {\n canvas: HTMLCanvasElement;\n forces: Module[];\n render: Module[];\n constrainIterations?: number;\n clearColor?: { r: number; g: number; b: number; a: number };\n cellSize?: number;\n }) {\n super(options);\n this.canvas = options.canvas;\n this.grid = new SpatialGrid({\n width: this.canvas.width,\n height: this.canvas.height,\n cellSize: this.cellSize,\n });\n }\n\n initialize(): Promise<void> {\n return Promise.resolve();\n }\n\n // Implement abstract methods for animation loop\n protected startAnimationLoop(): void {\n if (this.animationId) {\n cancelAnimationFrame(this.animationId);\n this.animationId = null;\n }\n this.animate();\n }\n\n protected stopAnimationLoop(): void {\n if (this.animationId) {\n cancelAnimationFrame(this.animationId);\n this.animationId = null;\n }\n }\n\n /**\n * Resets animation timing to prevent large deltaTime spikes.\n * Useful when starting after engine restoration or long pauses.\n */\n public resetTiming(): void {\n this.lastTime = performance.now();\n }\n\n /**\n * Resets the simulation to its initial state.\n *\n * This method:\n * - Pauses the simulation\n * - Clears all particles\n * - Resets timing and FPS data\n * - Clears force-specific caches\n */\n public reset(): void {\n this.pause();\n // Ensure animation frame is properly cancelled\n if (this.animationId) {\n cancelAnimationFrame(this.animationId);\n this.animationId = null;\n }\n this.particles = [];\n this.lastTime = 0;\n // Clear FPS tracking data\n this.fpsEstimate = 60;\n }\n\n clear(): void {\n this.particles = [];\n this.grid.clear();\n this.fpsEstimate = 60;\n // Reset maxSize tracking\n this.resetMaxSize();\n }\n\n getCount(): number {\n const actualCount = this.particles.length;\n if (this.maxParticles === null) {\n return actualCount;\n }\n return Math.min(actualCount, this.maxParticles);\n }\n\n protected getEffectiveCount(): number {\n return this.getCount();\n }\n\n // Override setSize to also update spatial grid\n setSize(width: number, height: number): void {\n this.view.setSize(width, height);\n this.grid.setSize(width, height);\n }\n\n setParticles(particle: IParticle[]): void {\n this.particles = particle.map((p) => new Particle(p));\n // Update maxSize tracking\n this.resetMaxSize();\n for (const p of particle) {\n this.updateMaxSize(p.size);\n }\n }\n\n addParticle(particle: IParticle): void {\n this.particles.push(new Particle(particle));\n // Update maxSize tracking\n this.updateMaxSize(particle.size);\n }\n\n getParticles(): Promise<IParticle[]> {\n return Promise.resolve(this.particles.map((p) => p.toJSON()));\n }\n\n getParticle(index: number): Promise<IParticle> {\n return Promise.resolve(this.particles[index]);\n }\n\n destroy(): Promise<void> {\n this.pause();\n this.particles = [];\n this.grid.clear();\n return Promise.resolve();\n }\n\n // Handle configuration changes\n protected onClearColorChanged(): void {\n // Clear color changes don't require any immediate system updates\n // The new color will be used in the next render pass\n }\n\n protected onCellSizeChanged(): void {\n // Rebuild spatial grid with new cell size\n this.grid.setCellSize(this.cellSize);\n }\n\n protected onConstrainIterationsChanged(): void {\n // Constrain iterations changes don't require any immediate system updates\n // The new value will be used in the next simulation pass\n }\n\n protected onMaxNeighborsChanged(): void {\n // No additional state to update on CPU when max neighbors changes\n }\n\n protected onMaxParticlesChanged(): void {\n // No additional state to update on CPU when max particles changes\n }\n\n private animate = (): void => {\n const dt = this.getTimeDelta();\n this.updateFPS(dt);\n\n if (this.playing) {\n // Update engine-owned oscillators before module updates\n this.updateOscillators(dt);\n this.update(dt);\n }\n\n this.render();\n\n this.animationId = requestAnimationFrame(this.animate);\n };\n\n private getNeighbors(position: { x: number; y: number }, radius: number) {\n return this.grid.getParticles(\n new Vector(position.x, position.y),\n radius,\n this.getMaxNeighbors()\n );\n }\n\n private getImageData(\n x: number,\n y: number,\n width: number,\n height: number\n ): ImageData | null {\n try {\n const context = this.canvas.getContext(\"2d\")!;\n\n // Clamp to canvas bounds\n const clampedX = Math.max(0, Math.min(x, this.canvas.width));\n const clampedY = Math.max(0, Math.min(y, this.canvas.height));\n const clampedWidth = Math.max(\n 0,\n Math.min(width, this.canvas.width - clampedX)\n );\n const clampedHeight = Math.max(\n 0,\n Math.min(height, this.canvas.height - clampedY)\n );\n\n if (clampedWidth <= 0 || clampedHeight <= 0) {\n return null;\n }\n\n return context.getImageData(\n clampedX,\n clampedY,\n clampedWidth,\n clampedHeight\n );\n } catch (error) {\n return null;\n }\n }\n\n private update(dt: number): void {\n const effectiveCount = this.getEffectiveCount();\n \n // Update spatial grid with current particle positions and camera\n this.grid.setCamera(\n this.view.getCamera().x,\n this.view.getCamera().y,\n this.view.getZoom()\n );\n this.grid.clear();\n for (let i = 0; i < effectiveCount; i++) {\n this.grid.insert(this.particles[i]);\n }\n\n // Global state for modules that need it\n const globalState: Record<number, Record<string, number>> = {};\n\n // Position tracking for correct pass\n const positionState: Map<\n number,\n { prev: { x: number; y: number }; post: { x: number; y: number } }\n > = new Map();\n\n // Get neighbors function\n const getNeighbors = (position: { x: number; y: number }, radius: number) =>\n this.getNeighbors(position, radius);\n\n // Image data access function\n const getImageData = (\n x: number,\n y: number,\n width: number,\n height: number\n ) => this.getImageData(x, y, width, height);\n\n // First pass: state computation for all modules\n for (const module of this.modules) {\n try {\n // Skip disabled modules\n if (!module.isEnabled()) continue;\n if (module.role === ModuleRole.Force) {\n const force = module.cpu() as CPUForceDescriptor;\n if (force.state) {\n const input: Record<string, number | number[]> = {};\n for (const key of Object.keys(module.inputs)) {\n const value = module.read()[key];\n input[key] = value ?? 0;\n }\n // Always add enabled\n input.enabled = module.isEnabled() ? 1 : 0;\n\n for (let pi = 0; pi < effectiveCount; pi++) {\n const particle = this.particles[pi];\n if (particle.mass <= 0) continue;\n const setState = (name: string, value: number) => {\n if (!globalState[particle.id]) {\n globalState[particle.id] = {};\n }\n globalState[particle.id][name] = value;\n };\n\n force.state({\n particle: particle,\n dt,\n getNeighbors,\n input,\n setState,\n view: this.view,\n index: pi,\n particles: this.particles,\n getImageData,\n });\n }\n }\n }\n } catch (error) {}\n }\n\n // Second pass: apply forces for all modules\n for (const module of this.modules) {\n try {\n // Skip disabled modules\n if (!module.isEnabled()) continue;\n if (module.role === ModuleRole.Force) {\n const force = module.cpu() as CPUForceDescriptor;\n if (force.apply) {\n const input: Record<string, number | number[]> = {};\n for (const key of Object.keys(module.inputs)) {\n const value = module.read()[key];\n input[key] = value ?? 0;\n }\n // Always add enabled\n input.enabled = module.isEnabled() ? 1 : 0;\n\n for (let pi = 0; pi < effectiveCount; pi++) {\n const particle = this.particles[pi];\n if (particle.mass <= 0) continue;\n const getState = (name: string, pid?: number) => {\n return globalState[pid ?? particle.id]?.[name] ?? 0;\n };\n\n force.apply({\n particle: particle,\n dt,\n maxSize: this.getMaxSize(),\n getNeighbors,\n input,\n getState,\n view: this.view,\n index: pi,\n particles: this.particles,\n getImageData,\n });\n }\n }\n }\n } catch (error) {}\n }\n\n // Third pass: integration (once per particle)\n for (let i = 0; i < effectiveCount; i++) {\n const particle = this.particles[i];\n if (particle.mass <= 0) continue;\n // Capture position before integration\n const prevPos = { x: particle.position.x, y: particle.position.y };\n\n particle.velocity.add(particle.acceleration.clone().multiply(dt));\n particle.position.add(particle.velocity.clone().multiply(dt));\n particle.acceleration.zero();\n\n // Capture position after integration\n const postPos = { x: particle.position.x, y: particle.position.y };\n positionState.set(particle.id, { prev: prevPos, post: postPos });\n }\n\n // Fourth pass: constraints for all modules (multiple iterations)\n const iterations = Math.max(1, this.constrainIterations);\n for (let iter = 0; iter < iterations; iter++) {\n for (const module of this.modules) {\n try {\n // Skip disabled modules\n if (!module.isEnabled()) continue;\n if (module.role === ModuleRole.Force) {\n const force = module.cpu() as CPUForceDescriptor;\n if (force.constrain) {\n const input: Record<string, number | number[]> = {};\n for (const key of Object.keys(module.inputs)) {\n const value = module.read()[key];\n input[key] = value ?? 0;\n }\n // Always add enabled\n input.enabled = module.isEnabled() ? 1 : 0;\n for (let pi = 0; pi < effectiveCount; pi++) {\n const particle = this.particles[pi];\n if (particle.mass <= 0) continue;\n const getState = (name: string, pid?: number) => {\n return globalState[pid ?? particle.id]?.[name] ?? 0;\n };\n\n force.constrain({\n particle: particle,\n getNeighbors,\n dt: dt,\n maxSize: this.getMaxSize(),\n input,\n getState,\n view: this.view,\n index: pi,\n particles: this.particles,\n getImageData,\n });\n }\n }\n }\n } catch (error) {}\n }\n }\n\n // Fifth pass: corrections for all modules\n for (const module of this.modules) {\n try {\n // Skip disabled modules\n if (!module.isEnabled()) continue;\n if (module.role === ModuleRole.Force) {\n const force = module.cpu() as CPUForceDescriptor;\n if (force.correct) {\n const input: Record<string, number | number[]> = {};\n for (const key of Object.keys(module.inputs)) {\n const value = module.read()[key];\n input[key] = value ?? 0;\n }\n // Always add enabled\n input.enabled = module.isEnabled() ? 1 : 0;\n\n for (let index = 0; index < effectiveCount; index++) {\n const particle = this.particles[index];\n if (particle.mass <= 0) continue;\n const getState = (name: string, pid?: number) => {\n return globalState[pid ?? particle.id]?.[name] ?? 0;\n };\n\n const positions = positionState.get(particle.id);\n const prevPos = positions?.prev ?? {\n x: particle.position.x,\n y: particle.position.y,\n };\n const postPos = positions?.post ?? {\n x: particle.position.x,\n y: particle.position.y,\n };\n\n force.correct({\n particle: particle,\n getNeighbors,\n dt: dt,\n maxSize: this.getMaxSize(),\n prevPos,\n postPos,\n input,\n getState,\n view: this.view,\n index,\n particles: this.particles,\n getImageData,\n });\n }\n }\n }\n } catch (error) {}\n }\n }\n\n private createRenderUtils(context: CanvasRenderingContext2D) {\n return {\n formatColor: (color: {\n r: number;\n g: number;\n b: number;\n a: number;\n }): string => {\n return `rgba(${color.r * 255}, ${color.g * 255}, ${color.b * 255}, ${\n color.a\n })`;\n },\n drawCircle: (\n x: number,\n y: number,\n radius: number,\n color: { r: number; g: number; b: number; a: number }\n ): void => {\n context.fillStyle = `rgba(${color.r * 255}, ${color.g * 255}, ${\n color.b * 255\n }, ${color.a})`;\n context.beginPath();\n context.arc(x, y, radius, 0, Math.PI * 2);\n context.fill();\n },\n drawRect: (\n x: number,\n y: number,\n width: number,\n height: number,\n color: { r: number; g: number; b: number; a: number }\n ): void => {\n context.fillStyle = `rgba(${color.r * 255}, ${color.g * 255}, ${\n color.b * 255\n }, ${color.a})`;\n context.fillRect(x, y, width, height);\n },\n };\n }\n\n private render(): void {\n const context = this.canvas.getContext(\"2d\")!;\n\n // Get camera and canvas info for coordinate transformation\n const camera = this.view.getCamera();\n const zoom = this.view.getZoom();\n const size = this.view.getSize();\n const centerX = size.width / 2;\n const centerY = size.height / 2;\n const utils = this.createRenderUtils(context);\n\n // Check composition requirements of enabled render modules\n const hasBackgroundHandler = this.modules.some((module) => {\n if (!module.isEnabled() || module.role !== ModuleRole.Render)\n return false;\n const descriptor = module.cpu() as CPURenderDescriptor;\n return descriptor.composition === CanvasComposition.HandlesBackground;\n });\n\n // Determine if there are any enabled renderers\n const hasEnabledRenderer = this.modules.some(\n (module) => module.isEnabled() && module.role === ModuleRole.Render\n );\n\n // Only clear canvas if no module handles background AND either some module requires clearing\n // or there are no enabled renderers (to avoid leaving a stale frame on canvas)\n if (!hasBackgroundHandler) {\n const needsClearing = this.modules.some((module) => {\n if (!module.isEnabled() || module.role !== ModuleRole.Render)\n return false;\n const descriptor = module.cpu() as CPURenderDescriptor;\n return descriptor.composition === CanvasComposition.RequiresClear;\n });\n\n if (needsClearing || !hasEnabledRenderer) {\n context.fillStyle = `rgba(${this.clearColor.r * 255}, ${\n this.clearColor.g * 255\n }, ${this.clearColor.b * 255}, ${this.clearColor.a})`;\n context.fillRect(0, 0, context.canvas.width, context.canvas.height);\n }\n }\n\n for (const module of this.modules) {\n try {\n // Skip disabled modules\n if (!module.isEnabled()) continue;\n if (module.role === ModuleRole.Render) {\n const descriptor = module.cpu() as CPURenderDescriptor;\n const render = descriptor;\n // input\n const input: Record<string, number | number[]> = {};\n for (const key of Object.keys(module.inputs)) {\n const value = module.read()[key];\n input[key] = value ?? 0;\n }\n // Always add enabled\n input.enabled = module.isEnabled() ? 1 : 0;\n\n // Setup phase\n render.setup?.({\n context,\n input,\n view: this.view,\n clearColor: this.clearColor,\n utils,\n particles: this.particles,\n });\n\n // Render each visible particle\n const effectiveCount = this.getEffectiveCount();\n for (let i = 0; i < effectiveCount; i++) {\n const particle = this.particles[i];\n if (particle.mass == 0) continue;\n\n // Transform world position to screen position\n const worldX = (particle.position.x - camera.x) * zoom;\n const worldY = (particle.position.y - camera.y) * zoom;\n const screenX = centerX + worldX;\n const screenY = centerY + worldY;\n const screenSize = particle.size * zoom;\n\n // Skip rendering if particle is outside canvas bounds (culling)\n if (\n screenX + screenSize < 0 ||\n screenX - screenSize > size.width ||\n screenY + screenSize < 0 ||\n screenY - screenSize > size.height\n ) {\n continue;\n }\n\n render.render?.({\n context,\n particle,\n screenX,\n screenY,\n screenSize,\n input,\n utils,\n });\n }\n\n // Teardown phase\n render.teardown?.({\n context,\n input,\n utils,\n });\n }\n } catch (error) {}\n }\n }\n}\n","import { IEngine, IParticle } from \"./interfaces\";\nimport { Module } from \"./module\";\nimport { WebGPUEngine } from \"./runtimes/webgpu/engine\";\nimport { CPUEngine } from \"./runtimes/cpu/engine\";\n\nexport type EngineOptions = {\n canvas: HTMLCanvasElement;\n forces: Module<string, any>[];\n render: Module<string, any>[];\n runtime: \"cpu\" | \"webgpu\" | \"auto\";\n constrainIterations?: number;\n clearColor?: { r: number; g: number; b: number; a: number };\n cellSize?: number;\n maxParticles?: number;\n workgroupSize?: number;\n maxNeighbors?: number;\n};\n\nexport class Engine implements IEngine {\n private engine: IEngine;\n private actualRuntime: \"cpu\" | \"webgpu\"; // The actual runtime being used\n private preferredRuntime: \"cpu\" | \"webgpu\" | \"auto\"; // The requested runtime (can be 'auto')\n private originalOptions: EngineOptions; // Store original options for fallback\n\n constructor(options: EngineOptions) {\n this.preferredRuntime = options.runtime;\n this.originalOptions = { ...options }; // Store original options for fallback\n\n // Determine actual runtime to use\n let targetRuntime: \"cpu\" | \"webgpu\" | \"auto\";\n if (options.runtime === \"auto\") {\n // Synchronous check - we'll handle WebGPU availability in initialize()\n targetRuntime = \"webgpu\"; // Default to WebGPU for auto, fallback to CPU if it fails\n } else {\n targetRuntime = options.runtime;\n }\n\n this.actualRuntime = targetRuntime;\n\n if (targetRuntime === \"webgpu\") {\n this.engine = new WebGPUEngine(options);\n } else {\n this.engine = new CPUEngine(options);\n }\n }\n\n // Delegate all methods to the concrete engine implementation\n async initialize(): Promise<void> {\n try {\n await this.engine.initialize();\n } catch (error) {\n // Handle fallback for auto mode or WebGPU failures\n if (this.preferredRuntime === \"auto\" && this.actualRuntime === \"webgpu\") {\n console.warn(\n \"WebGPU initialization failed, falling back to CPU runtime:\",\n error\n );\n\n // Destroy the failed WebGPU engine\n try {\n await this.engine.destroy();\n } catch (destroyError) {\n console.warn(\"Error destroying failed WebGPU engine:\", destroyError);\n }\n\n // Create CPU engine with same options\n this.actualRuntime = \"cpu\";\n const fallbackOptions = {\n ...this.originalOptions,\n runtime: \"cpu\",\n };\n this.engine = new CPUEngine(fallbackOptions);\n\n // Initialize the CPU engine\n await this.engine.initialize();\n } else {\n throw error; // Re-throw if not auto mode or already CPU\n }\n }\n\n // Log runtime selection for auto mode\n if (this.preferredRuntime === \"auto\") {\n if (this.actualRuntime === \"cpu\") {\n console.warn(\n \"Auto runtime selection: Using CPU (WebGPU not available or failed)\"\n );\n }\n }\n }\n\n // Get the actual runtime being used (cpu or webgpu)\n getActualRuntime(): \"cpu\" | \"webgpu\" {\n return this.actualRuntime;\n }\n play(): void {\n this.engine.play();\n }\n pause(): void {\n this.engine.pause();\n }\n stop(): void {\n this.engine.stop();\n }\n destroy(): Promise<void> {\n return this.engine.destroy();\n }\n\n isPlaying(): boolean {\n return this.engine.isPlaying();\n }\n toggle(): void {\n this.engine.toggle();\n }\n getSize(): { width: number; height: number } {\n return this.engine.getSize();\n }\n setSize(width: number, height: number): void {\n this.engine.setSize(width, height);\n }\n setCamera(x: number, y: number): void {\n this.engine.setCamera(x, y);\n }\n getCamera(): { x: number; y: number } {\n return this.engine.getCamera();\n }\n setZoom(z: number): void {\n this.engine.setZoom(z);\n }\n getZoom(): number {\n return this.engine.getZoom();\n }\n // Oscillator API passthroughs\n addOscillator(params: {\n moduleName: string;\n inputName: string;\n min: number;\n max: number;\n speedHz: number;\n options?: any;\n }): string {\n return this.engine.addOscillator(params);\n }\n removeOscillator(moduleName: string, inputName: string): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this.engine as any).removeOscillator(moduleName, inputName);\n }\n updateOscillatorSpeed(\n moduleName: string,\n inputName: string,\n speedHz: number\n ): void {\n this.engine.updateOscillatorSpeed(moduleName, inputName, speedHz);\n }\n updateOscillatorBounds(\n moduleName: string,\n inputName: string,\n min: number,\n max: number\n ): void {\n this.engine.updateOscillatorBounds(moduleName, inputName, min, max);\n }\n hasOscillator(moduleName: string, inputName: string): boolean {\n return this.engine.hasOscillator(moduleName, inputName);\n }\n getOscillator(moduleName: string, inputName: string) {\n return this.engine.getOscillator(moduleName, inputName);\n }\n clearOscillators(): void {\n this.engine.clearOscillators();\n }\n clearModuleOscillators(moduleName: string): void {\n this.engine.clearModuleOscillators(moduleName);\n }\n addOscillatorListener(\n moduleName: string,\n inputName: string,\n handler: (value: number) => void\n ): void {\n this.engine.addOscillatorListener(moduleName, inputName, handler);\n }\n removeOscillatorListener(\n moduleName: string,\n inputName: string,\n handler: (value: number) => void\n ): void {\n this.engine.removeOscillatorListener(moduleName, inputName, handler);\n }\n setOscillatorState(\n moduleName: string,\n inputName: string,\n lastValue: number,\n lastDirection: -1 | 0 | 1\n ): boolean {\n return this.engine.setOscillatorState(\n moduleName,\n inputName,\n lastValue,\n lastDirection\n );\n }\n getOscillatorsElapsedSeconds(): number {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (this.engine as any).getOscillatorsElapsedSeconds();\n }\n setOscillatorsElapsedSeconds(seconds: number): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this.engine as any).setOscillatorsElapsedSeconds(seconds);\n }\n setParticles(p: IParticle[]): void {\n this.engine.setParticles(p);\n }\n addParticle(p: IParticle): void {\n this.engine.addParticle(p);\n }\n getParticles(): Promise<IParticle[]> {\n return this.engine.getParticles();\n }\n getParticle(index: number): Promise<IParticle> {\n return this.engine.getParticle(index);\n }\n // Helpers for pinning/unpinning\n async pinParticles(indexes: number[]): Promise<void> {\n const particles = await this.getParticles();\n for (const idx of indexes) {\n if (particles[idx]) particles[idx].mass = -1;\n }\n this.setParticles(particles);\n }\n async unpinParticles(indexes: number[]): Promise<void> {\n const particles = await this.getParticles();\n for (const idx of indexes) {\n if (particles[idx]) {\n const size = particles[idx].size;\n // Derive mass from size deterministically (simple proportional mapping)\n particles[idx].mass = Math.max(0.1, size);\n }\n }\n this.setParticles(particles);\n }\n async unpinAll(): Promise<void> {\n const particles = await this.getParticles();\n for (let i = 0; i < particles.length; i++) {\n if (particles[i].mass < 0) {\n const size = particles[i].size;\n particles[i].mass = Math.max(0.1, size);\n }\n }\n this.setParticles(particles);\n }\n clear(): void {\n this.engine.clear();\n }\n getCount(): number {\n return this.engine.getCount();\n }\n getFPS(): number {\n return this.engine.getFPS();\n }\n export(): Record<string, Record<string, number>> {\n return this.engine.export();\n }\n import(settings: Record<string, Record<string, number>>): void {\n this.engine.import(settings);\n }\n\n // Configuration getters and setters\n getClearColor(): { r: number; g: number; b: number; a: number } {\n return this.engine.getClearColor();\n }\n setClearColor(color: { r: number; g: number; b: number; a: number }): void {\n this.engine.setClearColor(color);\n }\n getCellSize(): number {\n return this.engine.getCellSize();\n }\n setCellSize(size: number): void {\n this.engine.setCellSize(size);\n }\n getConstrainIterations(): number {\n return this.engine.getConstrainIterations();\n }\n setConstrainIterations(iterations: number): void {\n this.engine.setConstrainIterations(iterations);\n }\n getMaxNeighbors(): number {\n return this.engine.getMaxNeighbors();\n }\n setMaxNeighbors(size: number): void {\n this.engine.setMaxNeighbors(size);\n }\n getMaxParticles(): number | null {\n return this.engine.getMaxParticles();\n }\n setMaxParticles(value: number | null): void {\n this.engine.setMaxParticles(value);\n }\n getModule(name: string): Module | undefined {\n return this.engine.getModule(name);\n }\n\n // Check if a module is supported by the current runtime\n isSupported(module: Module): boolean {\n try {\n if (this.actualRuntime === \"webgpu\") {\n // For WebGPU, check if the module has a webgpu() method that doesn't throw\n module.webgpu();\n return true;\n } else {\n // For CPU, check if the module has a cpu() method that doesn't throw\n module.cpu();\n return true;\n }\n } catch (error) {\n // If the method throws \"Not implemented\" or any other error, the module is not supported\n return false;\n }\n }\n}\n","/**\n * Spawner\n *\n * Utility for generating initial `IParticle[]` configurations for common\n * shapes (grid, random, circle, donut, square) with optional initial velocity\n * presets (random/in/out/clockwise/counter-clockwise/custom). Also includes\n * lightweight color parsing helpers.\n */\nimport { IParticle } from \"./interfaces\";\n\nexport type VelocityDirection =\n | \"random\"\n | \"in\"\n | \"out\"\n | \"custom\"\n | \"clockwise\"\n | \"counter-clockwise\";\n\nexport interface VelocityConfig {\n speed: number;\n direction: VelocityDirection;\n angle?: number; // radians for custom\n}\n\nexport interface SpawnOptions {\n count: number;\n shape: \"grid\" | \"random\" | \"circle\" | \"donut\" | \"square\";\n center: { x: number; y: number };\n colors?: string[];\n spacing?: number; // grid\n radius?: number; // circle/donut outer\n innerRadius?: number; // donut inner\n squareSize?: number; // square size\n cornerRadius?: number; // square corner radius\n size?: number; // particle size\n mass?: number; // particle mass\n bounds?: { width: number; height: number }; // random\n velocity?: VelocityConfig;\n}\n\nfunction calculateVelocity(\n position: { x: number; y: number },\n center: { x: number; y: number },\n cfg?: VelocityConfig\n): { vx: number; vy: number } {\n if (!cfg || cfg.speed === 0) return { vx: 0, vy: 0 };\n\n const speed = cfg.speed;\n let angle = 0;\n\n switch (cfg.direction) {\n case \"random\":\n angle = Math.random() * Math.PI * 2;\n break;\n case \"in\": {\n const dx = center.x - position.x;\n const dy = center.y - position.y;\n angle = Math.atan2(dy, dx);\n break;\n }\n case \"out\": {\n const dx = position.x - center.x;\n const dy = position.y - center.y;\n angle = Math.atan2(dy, dx);\n break;\n }\n case \"clockwise\": {\n const dx = position.x - center.x;\n const dy = position.y - center.y;\n angle = Math.atan2(-dx, dy);\n break;\n }\n case \"counter-clockwise\": {\n const dx = position.x - center.x;\n const dy = position.y - center.y;\n angle = Math.atan2(dx, -dy);\n break;\n }\n case \"custom\":\n angle = cfg.angle || 0;\n break;\n }\n\n return { vx: speed * Math.cos(angle), vy: speed * Math.sin(angle) };\n}\n\nexport class Spawner {\n initParticles(options: SpawnOptions): IParticle[] {\n const {\n count,\n shape,\n center,\n spacing = 25,\n radius = 100,\n innerRadius = 50,\n squareSize = 200,\n cornerRadius = 0,\n size = 5,\n mass = 1,\n bounds,\n velocity,\n colors,\n } = options;\n\n const particles: IParticle[] = [];\n\n if (count <= 0) return particles;\n\n const toColor = (\n hex: string\n ): { r: number; g: number; b: number; a: number } => {\n let h = hex.trim();\n if (h.startsWith(\"#\")) h = h.slice(1);\n if (h.length === 3) {\n const r = parseInt(h[0] + h[0], 16);\n const g = parseInt(h[1] + h[1], 16);\n const b = parseInt(h[2] + h[2], 16);\n return { r: r / 255, g: g / 255, b: b / 255, a: 1 };\n }\n if (h.length >= 6) {\n const r = parseInt(h.slice(0, 2), 16);\n const g = parseInt(h.slice(2, 4), 16);\n const b = parseInt(h.slice(4, 6), 16);\n return { r: r / 255, g: g / 255, b: b / 255, a: 1 };\n }\n return { r: 1, g: 1, b: 1, a: 1 };\n };\n\n const getColor = () => {\n if (!colors || colors.length === 0) return { r: 1, g: 1, b: 1, a: 1 };\n return toColor(colors[Math.floor(Math.random() * colors.length)]);\n };\n\n if (shape === \"grid\") {\n const cols = Math.ceil(Math.sqrt(count));\n const rows = Math.ceil(count / cols);\n const totalW = (cols - 1) * spacing;\n const totalH = (rows - 1) * spacing;\n const startX = center.x - totalW / 2;\n const startY = center.y - totalH / 2;\n\n for (let i = 0; i < count; i++) {\n const col = i % cols;\n const row = Math.floor(i / cols);\n const x = startX + col * spacing;\n const y = startY + row * spacing;\n const { vx, vy } = calculateVelocity({ x, y }, center, velocity);\n particles.push({\n position: { x, y },\n velocity: { x: vx, y: vy },\n size,\n mass,\n color: getColor(),\n });\n }\n return particles;\n }\n\n if (shape === \"random\") {\n const w = bounds?.width ?? radius * 2;\n const h = bounds?.height ?? radius * 2;\n const left = center.x - w / 2;\n const top = center.y - h / 2;\n for (let i = 0; i < count; i++) {\n const x = left + Math.random() * w;\n const y = top + Math.random() * h;\n const { vx, vy } = calculateVelocity({ x, y }, center, velocity);\n particles.push({\n position: { x, y },\n velocity: { x: vx, y: vy },\n size,\n mass,\n color: getColor(),\n });\n }\n return particles;\n }\n\n if (shape === \"circle\") {\n for (let i = 0; i < count; i++) {\n const angle = (i / count) * Math.PI * 2;\n const x = center.x + Math.cos(angle) * radius;\n const y = center.y + Math.sin(angle) * radius;\n const { vx, vy } = calculateVelocity({ x, y }, center, velocity);\n particles.push({\n position: { x, y },\n velocity: { x: vx, y: vy },\n size,\n mass,\n color: getColor(),\n });\n }\n return particles;\n }\n\n if (shape === \"donut\") {\n for (let i = 0; i < count; i++) {\n const ringR = innerRadius + Math.random() * (radius - innerRadius);\n const angle = Math.random() * Math.PI * 2;\n const x = center.x + Math.cos(angle) * ringR;\n const y = center.y + Math.sin(angle) * ringR;\n const { vx, vy } = calculateVelocity({ x, y }, center, velocity);\n particles.push({\n position: { x, y },\n velocity: { x: vx, y: vy },\n size,\n mass,\n color: getColor(),\n });\n }\n return particles;\n }\n\n if (shape === \"square\") {\n const half = squareSize / 2;\n const r = Math.max(0, Math.min(cornerRadius, half));\n const straight = Math.max(0, squareSize - 2 * r); // length of each straight segment\n const cornerArcLen = r > 0 ? (Math.PI * r) / 2 : 0; // quarter circle arc length\n const totalPerimeter = 4 * straight + 4 * cornerArcLen;\n\n // Helper to compute point on straight sides\n const posOnSide = (\n side: \"top\" | \"right\" | \"bottom\" | \"left\",\n t: number\n ) => {\n // t in [0,1] along straight portion\n const offset = (t - 0.5) * straight;\n switch (side) {\n case \"top\":\n return { x: center.x + offset, y: center.y - half };\n case \"right\":\n return { x: center.x + half, y: center.y + offset };\n case \"bottom\":\n return { x: center.x - offset, y: center.y + half };\n case \"left\":\n return { x: center.x - half, y: center.y - offset };\n }\n };\n\n // Helper to compute point on rounded corner\n const posOnCorner = (\n corner: \"top-right\" | \"bottom-right\" | \"bottom-left\" | \"top-left\",\n t: number\n ) => {\n // t in [0,1] around quarter circle\n const cornerCenterOffset = half - r;\n let cx = center.x;\n let cy = center.y;\n let startAngle = 0;\n switch (corner) {\n case \"top-right\":\n cx = center.x + cornerCenterOffset;\n cy = center.y - cornerCenterOffset;\n startAngle = 1.5 * Math.PI; // from up to right\n break;\n case \"bottom-right\":\n cx = center.x + cornerCenterOffset;\n cy = center.y + cornerCenterOffset;\n startAngle = 0; // from right to down\n break;\n case \"bottom-left\":\n cx = center.x - cornerCenterOffset;\n cy = center.y + cornerCenterOffset;\n startAngle = 0.5 * Math.PI; // from down to left\n break;\n case \"top-left\":\n cx = center.x - cornerCenterOffset;\n cy = center.y - cornerCenterOffset;\n startAngle = Math.PI; // from left to up\n break;\n }\n const ang = startAngle + t * (Math.PI / 2);\n return { x: cx + r * Math.cos(ang), y: cy + r * Math.sin(ang) };\n };\n\n for (let i = 0; i < count; i++) {\n const d = Math.random() * totalPerimeter;\n let rem = d;\n\n // top side straight\n if (straight > 0 && rem <= straight) {\n const t = rem / straight;\n const p = posOnSide(\"top\", t);\n const { vx, vy } = calculateVelocity(p, center, velocity);\n particles.push({\n position: { x: p.x, y: p.y },\n velocity: { x: vx, y: vy },\n size,\n mass,\n color: getColor(),\n });\n continue;\n }\n rem -= straight;\n\n // top-right corner\n if (cornerArcLen > 0 && rem <= cornerArcLen) {\n const t = rem / cornerArcLen;\n const p = posOnCorner(\"top-right\", t);\n const { vx, vy } = calculateVelocity(p, center, velocity);\n particles.push({\n position: { x: p.x, y: p.y },\n velocity: { x: vx, y: vy },\n size,\n mass,\n color: getColor(),\n });\n continue;\n }\n rem -= cornerArcLen;\n\n // right side straight\n if (straight > 0 && rem <= straight) {\n const t = rem / straight;\n const p = posOnSide(\"right\", t);\n const { vx, vy } = calculateVelocity(p, center, velocity);\n particles.push({\n position: { x: p.x, y: p.y },\n velocity: { x: vx, y: vy },\n size,\n mass,\n color: getColor(),\n });\n continue;\n }\n rem -= straight;\n\n // bottom-right corner\n if (cornerArcLen > 0 && rem <= cornerArcLen) {\n const t = rem / cornerArcLen;\n const p = posOnCorner(\"bottom-right\", t);\n const { vx, vy } = calculateVelocity(p, center, velocity);\n particles.push({\n position: { x: p.x, y: p.y },\n velocity: { x: vx, y: vy },\n size,\n mass,\n color: getColor(),\n });\n continue;\n }\n rem -= cornerArcLen;\n\n // bottom side straight\n if (straight > 0 && rem <= straight) {\n const t = rem / straight;\n const p = posOnSide(\"bottom\", t);\n const { vx, vy } = calculateVelocity(p, center, velocity);\n particles.push({\n position: { x: p.x, y: p.y },\n velocity: { x: vx, y: vy },\n size,\n mass,\n color: getColor(),\n });\n continue;\n }\n rem -= straight;\n\n // bottom-left corner\n if (cornerArcLen > 0 && rem <= cornerArcLen) {\n const t = rem / cornerArcLen;\n const p = posOnCorner(\"bottom-left\", t);\n const { vx, vy } = calculateVelocity(p, center, velocity);\n particles.push({\n position: { x: p.x, y: p.y },\n velocity: { x: vx, y: vy },\n size,\n mass,\n color: getColor(),\n });\n continue;\n }\n rem -= cornerArcLen;\n\n // left side straight\n if (straight > 0 && rem <= straight) {\n const t = rem / straight;\n const p = posOnSide(\"left\", t);\n const { vx, vy } = calculateVelocity(p, center, velocity);\n particles.push({\n position: { x: p.x, y: p.y },\n velocity: { x: vx, y: vy },\n size,\n mass,\n color: getColor(),\n });\n continue;\n }\n rem -= straight;\n\n // top-left corner (fallback)\n const t = cornerArcLen > 0 ? rem / cornerArcLen : 0;\n const p =\n cornerArcLen > 0\n ? posOnCorner(\"top-left\", t)\n : { x: center.x - half, y: center.y - half };\n const { vx, vy } = calculateVelocity(p, center, velocity);\n particles.push({\n position: { x: p.x, y: p.y },\n velocity: { x: vx, y: vy },\n size,\n mass,\n color: getColor(),\n });\n }\n return particles;\n }\n\n return particles;\n }\n}\n","/**\n * Environment (Force Module)\n *\n * Applies global influences: gravity (fixed/inwards/outwards/custom), inertia,\n * friction, and velocity damping. Gravity direction can be vector- or mode-driven,\n * with center computed from grid extents for inwards/outwards.\n */\nimport { Vector } from \"../../vector\";\nimport {\n Module,\n type WebGPUDescriptor,\n ModuleRole,\n CPUDescriptor,\n DataType,\n} from \"../../module\";\n\nexport const DEFAULT_ENVIRONMENT_GRAVITY_STRENGTH = 0;\nexport const DEFAULT_ENVIRONMENT_GRAVITY_DIRECTION: GravityDirection = \"down\";\nexport const DEFAULT_ENVIRONMENT_GRAVITY_ANGLE = Math.PI / 2; // radians, default down\nexport const DEFAULT_ENVIRONMENT_INERTIA = 0;\nexport const DEFAULT_ENVIRONMENT_FRICTION = 0;\nexport const DEFAULT_ENVIRONMENT_DAMPING = 0;\n\nexport type GravityDirection =\n | \"up\"\n | \"down\"\n | \"left\"\n | \"right\"\n | \"inwards\"\n | \"outwards\"\n | \"custom\";\n\ntype EnvironmentInputs = {\n gravityStrength: number;\n dirX: number;\n dirY: number;\n inertia: number;\n friction: number;\n damping: number;\n mode: number;\n};\n\nexport class Environment extends Module<\"environment\", EnvironmentInputs> {\n readonly name = \"environment\" as const;\n readonly role = ModuleRole.Force;\n readonly inputs = {\n gravityStrength: DataType.NUMBER,\n dirX: DataType.NUMBER,\n dirY: DataType.NUMBER,\n inertia: DataType.NUMBER,\n friction: DataType.NUMBER,\n damping: DataType.NUMBER,\n mode: DataType.NUMBER,\n } as const;\n\n private gravityDirection: GravityDirection = \"down\";\n private gravityAngle: number = Math.PI / 2; // radians, default down\n\n constructor(opts?: {\n enabled?: boolean;\n gravityStrength?: number;\n dirX?: number;\n dirY?: number;\n inertia?: number;\n friction?: number;\n damping?: number;\n gravityDirection?: GravityDirection;\n gravityAngle?: number; // radians, only used when direction is custom\n }) {\n super();\n\n this.gravityDirection =\n opts?.gravityDirection ?? DEFAULT_ENVIRONMENT_GRAVITY_DIRECTION;\n this.gravityAngle = opts?.gravityAngle ?? DEFAULT_ENVIRONMENT_GRAVITY_ANGLE;\n\n // Initialize direction\n const initial = this.directionFromOptions(\n this.gravityDirection,\n this.gravityAngle,\n opts?.dirX,\n opts?.dirY\n );\n\n this.write({\n gravityStrength:\n opts?.gravityStrength ?? DEFAULT_ENVIRONMENT_GRAVITY_STRENGTH,\n dirX: initial.x,\n dirY: initial.y,\n inertia: opts?.inertia ?? DEFAULT_ENVIRONMENT_INERTIA,\n friction: opts?.friction ?? DEFAULT_ENVIRONMENT_FRICTION,\n damping: opts?.damping ?? DEFAULT_ENVIRONMENT_DAMPING,\n mode:\n this.gravityDirection === \"inwards\"\n ? 1\n : this.gravityDirection === \"outwards\"\n ? 2\n : 0,\n });\n if (opts?.enabled !== undefined) {\n this.setEnabled(!!opts.enabled);\n }\n }\n\n private directionFromOptions(\n dir: GravityDirection,\n angleRad: number,\n dirXOverride?: number,\n dirYOverride?: number\n ): { x: number; y: number } {\n // If explicit vector provided, use it\n if (dirXOverride !== undefined || dirYOverride !== undefined) {\n return { x: dirXOverride ?? 0, y: dirYOverride ?? 0 };\n }\n switch (dir) {\n case \"up\":\n return { x: 0, y: -1 };\n case \"down\":\n return { x: 0, y: 1 };\n case \"left\":\n return { x: -1, y: 0 };\n case \"right\":\n return { x: 1, y: 0 };\n case \"inwards\":\n // Approximate as downward for now (screen space inward not available here)\n return { x: 0, y: 1 };\n case \"outwards\":\n // Approximate as upward for now\n return { x: 0, y: -1 };\n case \"custom\":\n default: {\n const x = Math.cos(angleRad);\n const y = Math.sin(angleRad);\n return { x, y };\n }\n }\n }\n\n setGravityStrength(value: number): void {\n this.write({ gravityStrength: value });\n }\n setDirection(x: number, y: number): void {\n this.write({ dirX: x, dirY: y });\n }\n setGravityDirection(direction: GravityDirection): void {\n this.gravityDirection = direction;\n const v = this.directionFromOptions(\n this.gravityDirection,\n this.gravityAngle\n );\n this.setDirection(v.x, v.y);\n this.write({\n mode: direction === \"inwards\" ? 1 : direction === \"outwards\" ? 2 : 0,\n });\n }\n setGravityAngle(angleRadians: number): void {\n this.gravityAngle = angleRadians;\n if (this.gravityDirection === \"custom\") {\n const v = this.directionFromOptions(\"custom\", this.gravityAngle);\n this.setDirection(v.x, v.y);\n }\n }\n setInertia(value: number): void {\n this.write({ inertia: value });\n }\n setFriction(value: number): void {\n this.write({ friction: value });\n }\n setDamping(value: number): void {\n this.write({ damping: value });\n }\n\n getGravityStrength(): number {\n return this.readValue(\"gravityStrength\");\n }\n getDirX(): number {\n return this.readValue(\"dirX\");\n }\n getDirY(): number {\n return this.readValue(\"dirY\");\n }\n getInertia(): number {\n return this.readValue(\"inertia\");\n }\n getFriction(): number {\n return this.readValue(\"friction\");\n }\n getDamping(): number {\n return this.readValue(\"damping\");\n }\n getMode(): number {\n return this.readValue(\"mode\");\n }\n\n webgpu(): WebGPUDescriptor<EnvironmentInputs> {\n return {\n apply: ({ particleVar, dtVar, getUniform }) => `\n // Gravity as force: acceleration += dir * strength\n let mode = ${getUniform(\"mode\")};\n var gdir = vec2<f32>(${getUniform(\"dirX\")}, ${getUniform(\"dirY\")});\n if (mode == 1.0) {\n let cx = (GRID_MINX() + GRID_MAXX()) * 0.5;\n let cy = (GRID_MINY() + GRID_MAXY()) * 0.5;\n gdir = vec2<f32>(cx, cy) - ${particleVar}.position;\n } else if (mode == 2.0) {\n let cx = (GRID_MINX() + GRID_MAXX()) * 0.5;\n let cy = (GRID_MINY() + GRID_MAXY()) * 0.5;\n gdir = ${particleVar}.position - vec2<f32>(cx, cy);\n }\n let glen = length(gdir);\n if (glen > 0.0) {\n ${particleVar}.acceleration += (gdir / glen) * ${getUniform(\n \"gravityStrength\"\n )};\n }\n\n // Inertia: acceleration += velocity * dt * inertia\n let inertia = ${getUniform(\"inertia\")};\n if (inertia > 0.0) {\n ${particleVar}.acceleration += ${particleVar}.velocity * (${dtVar}) * inertia;\n }\n\n // Friction: acceleration += -velocity * friction\n let friction = ${getUniform(\"friction\")};\n if (friction > 0.0) {\n ${particleVar}.acceleration += -${particleVar}.velocity * friction;\n }\n\n // Damping: directly scale velocity (post-force effect in CPU code)\n let damping = ${getUniform(\"damping\")};\n if (damping != 0.0) {\n ${particleVar}.velocity *= (1.0 - damping * 0.2);\n }\n`,\n };\n }\n\n cpu(): CPUDescriptor<EnvironmentInputs> {\n return {\n apply: ({ particle, dt, input, view }) => {\n const gdir = new Vector(input.dirX, input.dirY);\n\n if (input.mode === 1) {\n // Inwards gravity: center is camera position (matches WebGPU grid center)\n const camera = view.getCamera();\n gdir.set(camera.x, camera.y).subtract(particle.position);\n } else if (input.mode === 2) {\n // Outwards gravity: center is camera position (matches WebGPU grid center)\n const camera = view.getCamera();\n gdir.set(\n particle.position.x - camera.x,\n particle.position.y - camera.y\n );\n }\n const glen = gdir.magnitude();\n if (glen > 0) {\n const gravityForce = gdir\n .clone()\n .divide(glen)\n .multiply(input.gravityStrength);\n particle.acceleration.add(gravityForce);\n }\n\n // Inertia: acceleration += velocity * dt * inertia\n const inertia = input.inertia;\n if (inertia > 0) {\n const inertiaForce = particle.velocity.clone().multiply(dt * inertia);\n particle.acceleration.add(inertiaForce);\n }\n\n // Friction: acceleration += -velocity * friction\n const friction = input.friction;\n if (friction > 0) {\n const frictionForce = particle.velocity.clone().multiply(-friction);\n particle.acceleration.add(frictionForce);\n }\n\n // Damping: directly scale velocity (post-force effect in CPU code)\n const damping = input.damping;\n if (damping !== 0) {\n particle.velocity.multiply(1 - damping * 0.2);\n }\n },\n };\n }\n}\n","/**\n * Boundary (Force Module)\n *\n * Enforces world bounds using the grid extents. Modes:\n * - bounce: reflect with restitution and tangential friction\n * - warp: wrap to the opposite side once fully outside\n * - kill: set mass=0 to cull particle when fully outside\n * - none: no constraint (repel still optional)\n * Supports optional repel force near edges.\n */\nimport {\n Module,\n type WebGPUDescriptor,\n ModuleRole,\n CPUDescriptor,\n DataType,\n} from \"../../module\";\nimport { Vector } from \"../../vector\";\n\nexport type BoundaryMode = \"bounce\" | \"warp\" | \"kill\" | \"none\";\n\nexport const DEFAULT_BOUNDARY_RESTITUTION = 0.9;\nexport const DEFAULT_BOUNDARY_FRICTION = 0.1;\nexport const DEFAULT_BOUNDARY_MODE: BoundaryMode = \"bounce\";\nexport const DEFAULT_BOUNDARY_REPEL_DISTANCE = 0.0;\nexport const DEFAULT_BOUNDARY_REPEL_STRENGTH = 0.0;\n\ntype BoundaryInputs = {\n restitution: number;\n friction: number;\n mode: number;\n repelDistance: number;\n repelStrength: number;\n};\n\nexport class Boundary extends Module<\"boundary\", BoundaryInputs> {\n readonly name = \"boundary\" as const;\n readonly role = ModuleRole.Force;\n readonly inputs = {\n restitution: DataType.NUMBER,\n friction: DataType.NUMBER,\n mode: DataType.NUMBER,\n repelDistance: DataType.NUMBER,\n repelStrength: DataType.NUMBER,\n } as const;\n\n constructor(opts?: {\n enabled?: boolean;\n restitution?: number;\n friction?: number;\n mode?: BoundaryMode;\n repelDistance?: number;\n repelStrength?: number;\n }) {\n super();\n const mode = opts?.mode ?? DEFAULT_BOUNDARY_MODE;\n this.write({\n restitution: opts?.restitution ?? DEFAULT_BOUNDARY_RESTITUTION,\n friction: opts?.friction ?? DEFAULT_BOUNDARY_FRICTION,\n mode: this.modeToUniform(mode),\n repelDistance: opts?.repelDistance ?? DEFAULT_BOUNDARY_REPEL_DISTANCE,\n repelStrength: opts?.repelStrength ?? DEFAULT_BOUNDARY_REPEL_STRENGTH,\n });\n if (opts?.enabled !== undefined) {\n this.setEnabled(!!opts.enabled);\n }\n }\n\n setRestitution(value: number): void {\n this.write({ restitution: value });\n }\n\n setFriction(value: number): void {\n this.write({ friction: value });\n }\n\n setMode(mode: BoundaryMode): void {\n this.write({ mode: this.modeToUniform(mode) });\n }\n\n setRepelDistance(value: number): void {\n this.write({ repelDistance: value });\n }\n\n setRepelStrength(value: number): void {\n this.write({ repelStrength: value });\n }\n\n getRestitution(): number {\n return this.readValue(\"restitution\");\n }\n getFriction(): number {\n return this.readValue(\"friction\");\n }\n getMode(): number {\n return this.readValue(\"mode\");\n }\n getRepelDistance(): number {\n return this.readValue(\"repelDistance\");\n }\n getRepelStrength(): number {\n return this.readValue(\"repelStrength\");\n }\n\n private modeToUniform(mode: BoundaryMode): number {\n switch (mode) {\n case \"bounce\":\n return 0;\n case \"warp\":\n return 1;\n case \"kill\":\n return 2;\n case \"none\":\n return 3;\n default:\n return 0;\n }\n }\n\n webgpu(): WebGPUDescriptor<BoundaryInputs> {\n return {\n apply: ({ particleVar, getUniform }) => `{\n // Bounce using global grid extents\n let halfSize = ${particleVar}.size;\n let minX = GRID_MINX();\n let maxX = GRID_MAXX();\n let minY = GRID_MINY();\n let maxY = GRID_MAXY();\n let bounce = ${getUniform(\"restitution\")};\n let friction = ${getUniform(\"friction\")};\n let mode = ${getUniform(\"mode\")};\n let repelDist = ${getUniform(\"repelDistance\")};\n let repelStrength = ${getUniform(\"repelStrength\")};\n\n // Repel force applied for all modes\n if (repelStrength > 0.0) {\n let distLeft = (${particleVar}.position.x - halfSize) - minX;\n let distRight = maxX - (${particleVar}.position.x + halfSize);\n let distTop = (${particleVar}.position.y - halfSize) - minY;\n let distBottom = maxY - (${particleVar}.position.y + halfSize);\n\n var fx = 0.0;\n var fy = 0.0;\n if (repelDist <= 0.0) {\n if (distLeft < 0.0) { fx += repelStrength; }\n if (distRight < 0.0) { fx -= repelStrength; }\n if (distTop < 0.0) { fy += repelStrength; }\n if (distBottom < 0.0) { fy -= repelStrength; }\n } else {\n // Outside of bounds: apply full-strength push back in\n if (distLeft < 0.0) { fx += repelStrength; }\n if (distRight < 0.0) { fx -= repelStrength; }\n if (distTop < 0.0) { fy += repelStrength; }\n if (distBottom < 0.0) { fy -= repelStrength; }\n\n // Inside within repel distance: scale by proximity\n if (distLeft < repelDist && distLeft > 0.0) {\n let ratio = (repelDist - distLeft) / repelDist;\n fx += ratio * repelStrength;\n }\n if (distRight < repelDist && distRight > 0.0) {\n let ratio = (repelDist - distRight) / repelDist;\n fx -= ratio * repelStrength;\n }\n if (distTop < repelDist && distTop > 0.0) {\n let ratio = (repelDist - distTop) / repelDist;\n fy += ratio * repelStrength;\n }\n if (distBottom < repelDist && distBottom > 0.0) {\n let ratio = (repelDist - distBottom) / repelDist;\n fy -= ratio * repelStrength;\n }\n }\n ${particleVar}.acceleration += vec2<f32>(fx, fy);\n }\n\n if (mode == 0.0) {\n // bounce\n // X axis\n if (${particleVar}.position.x - halfSize < minX) {\n ${particleVar}.position.x = minX + halfSize;\n ${particleVar}.velocity.x = -${particleVar}.velocity.x * bounce;\n ${particleVar}.velocity.y *= max(0.0, 1.0 - friction);\n } else if (${particleVar}.position.x + halfSize > maxX) {\n ${particleVar}.position.x = maxX - halfSize;\n ${particleVar}.velocity.x = -${particleVar}.velocity.x * bounce;\n ${particleVar}.velocity.y *= max(0.0, 1.0 - friction);\n }\n\n // Y axis\n if (${particleVar}.position.y - halfSize < minY) {\n ${particleVar}.position.y = minY + halfSize;\n ${particleVar}.velocity.y = -${particleVar}.velocity.y * bounce;\n ${particleVar}.velocity.x *= max(0.0, 1.0 - friction);\n } else if (${particleVar}.position.y + halfSize > maxY) {\n ${particleVar}.position.y = maxY - halfSize;\n ${particleVar}.velocity.y = -${particleVar}.velocity.y * bounce;\n ${particleVar}.velocity.x *= max(0.0, 1.0 - friction);\n }\n } else if (mode == 1.0) {\n // warp\n // Only warp once the particle is fully outside the bounds\n let eps = 1.0; // spawn just outside the opposite edge so it slides in\n if (${particleVar}.position.x + halfSize < minX) {\n ${particleVar}.position.x = maxX + halfSize + eps;\n } else if (${particleVar}.position.x - halfSize > maxX) {\n ${particleVar}.position.x = minX - halfSize - eps;\n }\n if (${particleVar}.position.y + halfSize < minY) {\n ${particleVar}.position.y = maxY + halfSize + eps;\n } else if (${particleVar}.position.y - halfSize > maxY) {\n ${particleVar}.position.y = minY - halfSize - eps;\n }\n } else if (mode == 2.0) {\n // kill\n // Only kill once the particle is fully outside the bounds\n if (${particleVar}.position.x - halfSize < minX) {\n ${particleVar}.position.x = minX - halfSize * 4;\n ${particleVar}.mass = 0.0;\n } else if (${particleVar}.position.x + halfSize > maxX) {\n ${particleVar}.position.x = maxX + halfSize * 4;\n ${particleVar}.mass = 0.0;\n }\n if (${particleVar}.position.y - halfSize < minY) {\n ${particleVar}.position.y = minY - halfSize * 4;\n ${particleVar}.mass = 0.0;\n } else if (${particleVar}.position.y + halfSize > maxY) {\n ${particleVar}.position.y = maxY + halfSize * 4;\n ${particleVar}.mass = 0.0;\n } \n } else if (mode == 3.0) {\n // none: no boundary constraints; repel force above still applies\n }\n}`,\n };\n }\n\n cpu(): CPUDescriptor<BoundaryInputs> {\n return {\n apply: ({ particle, input, view }) => {\n // Calculate world bounds similar to WebGPU grid system\n const camera = view.getCamera();\n const zoom = Math.max(view.getZoom(), 0.0001);\n const size = view.getSize();\n const halfW = size.width / (2 * zoom);\n const halfH = size.height / (2 * zoom);\n const minX = camera.x - halfW;\n const maxX = camera.x + halfW;\n const minY = camera.y - halfH;\n const maxY = camera.y + halfH;\n const halfSize = particle.size;\n const bounce = input.restitution;\n const friction = input.friction;\n const mode = input.mode;\n const repelDist = input.repelDistance;\n const repelStrength = input.repelStrength;\n\n // Repel force applied for all modes\n if (repelStrength > 0) {\n const distLeft = particle.position.x - halfSize - minX;\n const distRight = maxX - (particle.position.x + halfSize);\n const distTop = particle.position.y - halfSize - minY;\n const distBottom = maxY - (particle.position.y + halfSize);\n\n let fx = 0;\n let fy = 0;\n\n if (repelDist <= 0) {\n if (distLeft < 0) fx += repelStrength;\n if (distRight < 0) fx -= repelStrength;\n if (distTop < 0) fy += repelStrength;\n if (distBottom < 0) fy -= repelStrength;\n } else {\n // Outside of bounds: apply full-strength push back in\n if (distLeft < 0) fx += repelStrength;\n if (distRight < 0) fx -= repelStrength;\n if (distTop < 0) fy += repelStrength;\n if (distBottom < 0) fy -= repelStrength;\n\n // Inside within repel distance: scale by proximity\n if (distLeft < repelDist && distLeft > 0) {\n const ratio = (repelDist - distLeft) / repelDist;\n fx += ratio * repelStrength;\n }\n if (distRight < repelDist && distRight > 0) {\n const ratio = (repelDist - distRight) / repelDist;\n fx -= ratio * repelStrength;\n }\n if (distTop < repelDist && distTop > 0) {\n const ratio = (repelDist - distTop) / repelDist;\n fy += ratio * repelStrength;\n }\n if (distBottom < repelDist && distBottom > 0) {\n const ratio = (repelDist - distBottom) / repelDist;\n fy -= ratio * repelStrength;\n }\n }\n\n particle.acceleration.add(new Vector(fx, fy));\n }\n\n if (mode === 0) {\n // bounce\n // X axis\n if (particle.position.x - halfSize < minX) {\n particle.position.x = minX + halfSize;\n particle.velocity.x = -particle.velocity.x * bounce;\n particle.velocity.y *= Math.max(0, 1 - friction);\n } else if (particle.position.x + halfSize > maxX) {\n particle.position.x = maxX - halfSize;\n particle.velocity.x = -particle.velocity.x * bounce;\n particle.velocity.y *= Math.max(0, 1 - friction);\n }\n\n // Y axis\n if (particle.position.y - halfSize < minY) {\n particle.position.y = minY + halfSize;\n particle.velocity.y = -particle.velocity.y * bounce;\n particle.velocity.x *= Math.max(0, 1 - friction);\n } else if (particle.position.y + halfSize > maxY) {\n particle.position.y = maxY - halfSize;\n particle.velocity.y = -particle.velocity.y * bounce;\n particle.velocity.x *= Math.max(0, 1 - friction);\n }\n } else if (mode === 1) {\n // warp\n // Only warp once the particle is fully outside the bounds\n const eps = 1; // spawn just outside the opposite edge so it slides in\n if (particle.position.x + halfSize < minX) {\n particle.position.x = maxX + halfSize + eps;\n } else if (particle.position.x - halfSize > maxX) {\n particle.position.x = minX - halfSize - eps;\n }\n if (particle.position.y + halfSize < minY) {\n particle.position.y = maxY + halfSize + eps;\n } else if (particle.position.y - halfSize > maxY) {\n particle.position.y = minY - halfSize - eps;\n }\n } else if (mode === 2) {\n // kill\n // Only kill once the particle is fully outside the bounds\n if (\n particle.position.x + halfSize < minX ||\n particle.position.x - halfSize > maxX ||\n particle.position.y + halfSize < minY ||\n particle.position.y - halfSize > maxY\n ) {\n particle.mass = 0;\n }\n } else if (mode === 3) {\n // none: no boundary constraints; repel force above still applies\n }\n },\n };\n }\n}\n","/**\n * Collisions (Force Module)\n *\n * Simple pairwise collision response using the spatial grid for neighbor queries.\n * Uses a two-phase approach: pick deepest overlap neighbor (to reduce bias), then\n * correct position and apply a bounce impulse along the contact normal.\n * Velocity response in apply() is commented out; constraint/correct handle stability.\n *\n * Special handling: When particles are at identical positions (e.g., from boundary\n * repositioning), they are separated with a small pseudo-random offset to prevent\n * them from being stuck together permanently.\n */\nimport {\n Module,\n type WebGPUDescriptor,\n ModuleRole,\n CPUDescriptor,\n DataType,\n} from \"../../module\";\nimport { Particle } from \"../../particle\";\n\nexport const DEFAULT_COLLISIONS_RESTITUTION = 0.8;\n\n// Simple, brute-force elastic collision response applied only to current particle\ntype CollisionsInputs = {\n restitution: number;\n};\n\nexport class Collisions extends Module<\"collisions\", CollisionsInputs> {\n readonly name = \"collisions\" as const;\n readonly role = ModuleRole.Force;\n readonly inputs = {\n restitution: DataType.NUMBER,\n } as const;\n\n constructor(opts?: { enabled?: boolean; restitution?: number }) {\n super();\n this.write({\n restitution: opts?.restitution ?? DEFAULT_COLLISIONS_RESTITUTION,\n });\n if (opts?.enabled !== undefined) {\n this.setEnabled(!!opts.enabled);\n }\n }\n\n setRestitution(value: number): void {\n this.write({ restitution: value });\n }\n\n getRestitution(): number {\n return this.readValue(\"restitution\");\n }\n\n webgpu(): WebGPUDescriptor<CollisionsInputs> {\n return {\n constrain: ({ particleVar, maxSizeVar, getUniform }) => `\n // Pass 1: find deepest overlap neighbor to reduce scan-order bias\n var it = neighbor_iter_init(${particleVar}.position, ${particleVar}.size + ${maxSizeVar} + 1);\n var bestJ: u32 = NEIGHBOR_NONE;\n var bestN: vec2<f32> = vec2<f32>(0.0, 0.0);\n var bestOverlap: f32 = 0.0;\n var identicalPositionJ: u32 = NEIGHBOR_NONE;\n loop {\n let j = neighbor_iter_next(&it, index);\n if (j == NEIGHBOR_NONE) { break; }\n var other = particles[j];\n // Skip removed neighbors; treat pinned as infinite mass later\n if (other.mass == 0.0) { continue; }\n let r = other.size + ${particleVar}.size;\n let delta = ${particleVar}.position - other.position;\n let dist2 = dot(delta, delta);\n \n // Special case: particles at identical positions\n if (dist2 <= 0.000001) {\n identicalPositionJ = j;\n } else if (dist2 > 0.0001 && dist2 < r*r) {\n let dist = sqrt(dist2);\n let overlap = r - dist;\n if (overlap > bestOverlap) {\n bestOverlap = overlap;\n bestJ = j;\n bestN = delta / dist;\n }\n }\n }\n\n // Handle particles at identical positions first\n if (identicalPositionJ != NEIGHBOR_NONE) {\n var other = particles[identicalPositionJ];\n \n // Generate pseudo-random separation direction based on particle indices\n let seed = f32(index * 73 + identicalPositionJ * 37);\n let h = seed * 0.01234567;\n let angle = fract(sin(h) * 43758.5453) * 6.283185307; // 0 to 2*PI\n let sepDist = (other.size + ${particleVar}.size) * 0.51; // Slightly more than touching\n \n let separationX = cos(angle) * sepDist;\n let separationY = sin(angle) * sepDist;\n \n ${particleVar}.position = ${particleVar}.position + vec2<f32>(separationX, separationY);\n }\n\n if (bestJ != NEIGHBOR_NONE) {\n var other = particles[bestJ];\n var n = bestN;\n\n // Pseudo-random helpers based on world position to avoid index-order bias\n let h1 = dot(${particleVar}.position, vec2<f32>(12.9898, 78.233));\n let rand1 = fract(sin(h1) * 43758.5453);\n let h2 = dot(${particleVar}.position, vec2<f32>(93.9898, 67.345));\n let rand2 = fract(sin(h2) * 15731.7431);\n\n // Symmetry breaking: if nearly vertical or horizontal alignment, slightly rotate normal by tiny random angle\n let ax = abs(n.x);\n let ay = abs(n.y);\n if (ax < 0.03 || ay < 0.03) {\n let angle = (rand1 - 0.5) * 0.3;\n let ca = cos(angle);\n let sa = sin(angle);\n let nx = n.x * ca - n.y * sa;\n let ny = n.x * sa + n.y * ca;\n n = normalize(vec2<f32>(nx, ny));\n }\n\n // Position correction (move current particle only). We do not write to 'other'.\n var c1 = n * (bestOverlap * 0.55);\n // Tiny tangential jitter with zero-mean using rand2 to reduce directional bias\n let t = vec2<f32>(-n.y, n.x);\n let jitterAmp = (rand2 - 0.5) * min(bestOverlap * 0.1, 0.5);\n let jitter = t * jitterAmp;\n c1 = c1 + jitter;\n ${particleVar}.position = ${particleVar}.position + c1;\n\n // Impulse-based bounce to conserve kinetic energy along contact normal\n let v1 = ${particleVar}.velocity;\n let v2 = other.velocity;\n let m1 = ${particleVar}.mass;\n let m2 = other.mass;\n let e = ${getUniform(\"restitution\")};\n let relN = dot(v1 - v2, n);\n if (relN < 0.0) {\n // Treat pinned (mass < 0) as infinite mass: zero inverse mass\n let invM1 = select(0.0, 1.0 / max(m1, 1e-6), m1 > 0.0);\n let invM2 = select(0.0, 1.0 / max(m2, 1e-6), m2 > 0.0);\n let invSum = max(invM1 + invM2, 1e-6);\n let j = -(1.0 + e) * relN / invSum;\n let dv = min(j * invM1, 1000.0);\n ${particleVar}.velocity = v1 + n * dv;\n }\n }\n`,\n correct: ({ particleVar, dtVar, prevPosVar, postPosVar }) => `\n // Position-based velocity correction from integration state\n let disp = ${particleVar}.position - ${prevPosVar};\n let disp2 = dot(disp, disp);\n let corr = ${particleVar}.position - ${postPosVar};\n let corr2 = dot(corr, corr);\n if (corr2 > 0.0 && ${dtVar} > 0.0) {\n let corrLenInv = inverseSqrt(corr2);\n let corrDir = corr * corrLenInv;\n let corrVel = corr / ${dtVar};\n let corrVelAlong = dot(corrVel, corrDir);\n let vNBefore = dot(${particleVar}.velocity, corrDir);\n let vNAfterCandidate = vNBefore + corrVelAlong;\n let vNAfter = select(vNBefore, vNAfterCandidate, abs(vNAfterCandidate) < abs(vNBefore));\n ${particleVar}.velocity = ${particleVar}.velocity + corrDir * (vNAfter - vNBefore);\n }\n let v2_total = dot(${particleVar}.velocity, ${particleVar}.velocity);\n if (disp2 < 1e-8 && v2_total < 0.5) {\n ${particleVar}.velocity = vec2<f32>(0.0, 0.0);\n }\n`,\n };\n }\n\n cpu(): CPUDescriptor<CollisionsInputs> {\n // Helper function equivalent to GLSL fract()\n const fract = (x: number) => x - Math.floor(x);\n\n return {\n constrain: ({ particle, getNeighbors, input, maxSize }) => {\n // Find deepest overlap neighbor to reduce scan-order bias\n const searchRadius = particle.size + maxSize + 1;\n const neighbors = getNeighbors(particle.position, searchRadius);\n\n let bestOverlap = 0;\n let bestOther: any = null;\n let bestN = { x: 0, y: 0 };\n let identicalPositionOther: Particle | null = null;\n\n for (const other of neighbors) {\n if (other.id === particle.id) continue;\n // Skip removed neighbors; treat pinned as infinite mass later\n if (other.mass === 0) continue;\n\n const r = other.size + particle.size;\n const deltaX = particle.position.x - other.position.x;\n const deltaY = particle.position.y - other.position.y;\n const dist2 = deltaX * deltaX + deltaY * deltaY;\n\n // Special case: particles at identical positions\n if (dist2 <= 0.000001) {\n identicalPositionOther = other;\n } else if (dist2 > 0.0001 && dist2 < r * r) {\n const dist = Math.sqrt(dist2);\n const overlap = r - dist;\n if (overlap > bestOverlap) {\n bestOverlap = overlap;\n bestOther = other;\n bestN = { x: deltaX / dist, y: deltaY / dist };\n }\n }\n }\n\n // Handle particles at identical positions first\n if (identicalPositionOther) {\n // Generate pseudo-random separation direction based on particle IDs (matching WebGPU logic)\n const seed = particle.id * 73 + identicalPositionOther.id * 37;\n const h = seed * 0.01234567;\n const angle = fract(Math.sin(h) * 43758.5453) * 6.283185307; // 0 to 2*PI\n const sepDist = (identicalPositionOther.size + particle.size) * 0.51; // Slightly more than touching\n\n const separationX = Math.cos(angle) * sepDist;\n const separationY = Math.sin(angle) * sepDist;\n\n particle.position.x += separationX;\n particle.position.y += separationY;\n }\n\n if (bestOther) {\n const n = bestN;\n\n // Pseudo-random helpers based on world position to avoid index-order bias\n const h1 =\n particle.position.x * 12.9898 + particle.position.y * 78.233;\n const rand1 = fract(Math.sin(h1) * 43758.5453);\n const h2 =\n particle.position.x * 93.9898 + particle.position.y * 67.345;\n const rand2 = fract(Math.sin(h2) * 15731.7431);\n\n // Symmetry breaking: if nearly vertical or horizontal alignment, slightly rotate normal\n const ax = Math.abs(n.x);\n const ay = Math.abs(n.y);\n if (ax < 0.03 || ay < 0.03) {\n const angle = (rand1 - 0.5) * 0.3;\n const ca = Math.cos(angle);\n const sa = Math.sin(angle);\n const nx = n.x * ca - n.y * sa;\n const ny = n.x * sa + n.y * ca;\n const len = Math.sqrt(nx * nx + ny * ny);\n if (len > 0) {\n n.x = nx / len;\n n.y = ny / len;\n }\n }\n\n // Position correction (move current particle only)\n const c1x = n.x * (bestOverlap * 0.55);\n const c1y = n.y * (bestOverlap * 0.55);\n\n // Tiny tangential jitter with zero-mean using rand2 to reduce directional bias\n const tx = -n.y;\n const ty = n.x;\n const jitterAmp = (rand2 - 0.5) * Math.min(bestOverlap * 0.1, 0.5);\n const jitterX = tx * jitterAmp;\n const jitterY = ty * jitterAmp;\n\n particle.position.x += c1x + jitterX;\n particle.position.y += c1y + jitterY;\n\n // Impulse-based bounce to conserve kinetic energy along contact normal\n const v1x = particle.velocity.x;\n const v1y = particle.velocity.y;\n const v2x = bestOther.velocity.x;\n const v2y = bestOther.velocity.y;\n const m1 = particle.mass;\n const m2 = bestOther.mass;\n const e = input.restitution;\n const relN = (v1x - v2x) * n.x + (v1y - v2y) * n.y;\n\n if (relN < 0) {\n // Treat pinned (mass < 0) as infinite mass: zero inverse mass\n const invM1 = m1 > 0 ? 1 / Math.max(m1, 1e-6) : 0;\n const invM2 = m2 > 0 ? 1 / Math.max(m2, 1e-6) : 0;\n const invSum = Math.max(invM1 + invM2, 1e-6);\n const j = (-(1 + e) * relN) / invSum;\n const dv = Math.min(j * invM1, 1000);\n particle.velocity.x = v1x + n.x * dv;\n particle.velocity.y = v1y + n.y * dv;\n }\n }\n },\n correct: ({ particle, dt, prevPos, postPos }) => {\n const dispX = particle.position.x - prevPos.x;\n const dispY = particle.position.y - prevPos.y;\n const disp2 = dispX * dispX + dispY * dispY;\n\n const corrX = particle.position.x - postPos.x;\n const corrY = particle.position.y - postPos.y;\n const corr2 = corrX * corrX + corrY * corrY;\n\n if (corr2 > 0.0 && dt > 0.0) {\n const corrLenInv = 1.0 / Math.sqrt(corr2);\n const corrDirX = corrX * corrLenInv;\n const corrDirY = corrY * corrLenInv;\n const corrVelX = corrX / dt;\n const corrVelY = corrY / dt;\n const corrVelAlong = corrVelX * corrDirX + corrVelY * corrDirY;\n const vNBefore =\n particle.velocity.x * corrDirX + particle.velocity.y * corrDirY;\n const vNAfterCandidate = vNBefore + corrVelAlong;\n const vNAfter =\n Math.abs(vNAfterCandidate) < Math.abs(vNBefore)\n ? vNAfterCandidate\n : vNBefore;\n\n particle.velocity.x =\n particle.velocity.x + corrDirX * (vNAfter - vNBefore);\n particle.velocity.y =\n particle.velocity.y + corrDirY * (vNAfter - vNBefore);\n }\n\n const v2_total =\n particle.velocity.x * particle.velocity.x +\n particle.velocity.y * particle.velocity.y;\n if (disp2 < 1e-8 && v2_total < 0.5) {\n particle.velocity.x = 0.0;\n particle.velocity.y = 0.0;\n }\n },\n };\n }\n}\n","/**\n * Fluid (Force Module)\n *\n * SPH-inspired fluid approximation. Two-phase algorithm:\n * - state(): compute particle density and near-density using neighbor kernels\n * - apply(): compute pressure gradient and viscosity forces; clamp max accel\n * Stores per-particle state in shared SIM_STATE via the Program-provided helpers.\n */\nimport {\n Module,\n type WebGPUDescriptor,\n ModuleRole,\n CPUDescriptor,\n DataType,\n} from \"../../module\";\n\nexport const DEFAULT_FLUIDS_INFLUENCE_RADIUS = 100;\nexport const DEFAULT_FLUIDS_TARGET_DENSITY = 1;\nexport const DEFAULT_FLUIDS_PRESSURE_MULTIPLIER = 30;\nexport const DEFAULT_FLUIDS_VISCOSITY = 1;\nexport const DEFAULT_FLUIDS_NEAR_PRESSURE_MULTIPLIER = 50;\nexport const DEFAULT_FLUIDS_NEAR_THRESHOLD = 20;\nexport const DEFAULT_FLUIDS_ENABLE_NEAR_PRESSURE = true;\nexport const DEFAULT_FLUIDS_MAX_ACCELERATION = 75;\n\ntype FluidStateKeys = \"density\" | \"nearDensity\";\n\ntype FluidsInputs = {\n influenceRadius: number;\n targetDensity: number;\n pressureMultiplier: number;\n viscosity: number;\n nearPressureMultiplier: number;\n nearThreshold: number;\n enableNearPressure: number;\n maxAcceleration: number;\n};\n\nexport class Fluids extends Module<\"fluids\", FluidsInputs, FluidStateKeys> {\n readonly name = \"fluids\" as const;\n readonly role = ModuleRole.Force;\n readonly inputs = {\n influenceRadius: DataType.NUMBER,\n targetDensity: DataType.NUMBER,\n pressureMultiplier: DataType.NUMBER,\n viscosity: DataType.NUMBER,\n nearPressureMultiplier: DataType.NUMBER,\n nearThreshold: DataType.NUMBER,\n enableNearPressure: DataType.NUMBER,\n maxAcceleration: DataType.NUMBER,\n } as const;\n\n constructor(opts?: {\n enabled?: boolean;\n influenceRadius?: number;\n targetDensity?: number;\n pressureMultiplier?: number;\n viscosity?: number;\n nearPressureMultiplier?: number;\n nearThreshold?: number;\n enableNearPressure?: boolean;\n maxAcceleration?: number;\n }) {\n super();\n this.write({\n influenceRadius: opts?.influenceRadius ?? DEFAULT_FLUIDS_INFLUENCE_RADIUS,\n targetDensity: opts?.targetDensity ?? DEFAULT_FLUIDS_TARGET_DENSITY,\n pressureMultiplier:\n opts?.pressureMultiplier ?? DEFAULT_FLUIDS_PRESSURE_MULTIPLIER,\n viscosity: opts?.viscosity ?? DEFAULT_FLUIDS_VISCOSITY,\n nearPressureMultiplier:\n opts?.nearPressureMultiplier ?? DEFAULT_FLUIDS_NEAR_PRESSURE_MULTIPLIER,\n nearThreshold: opts?.nearThreshold ?? DEFAULT_FLUIDS_NEAR_THRESHOLD,\n enableNearPressure:\n opts?.enableNearPressure ?? DEFAULT_FLUIDS_ENABLE_NEAR_PRESSURE ? 1 : 0,\n maxAcceleration: opts?.maxAcceleration ?? DEFAULT_FLUIDS_MAX_ACCELERATION,\n });\n if (opts?.enabled !== undefined) {\n this.setEnabled(!!opts.enabled);\n }\n }\n\n setInfluenceRadius(v: number): void {\n this.write({ influenceRadius: v });\n }\n setTargetDensity(v: number): void {\n this.write({ targetDensity: v });\n }\n setPressureMultiplier(v: number): void {\n this.write({ pressureMultiplier: v });\n }\n setViscosity(v: number): void {\n this.write({ viscosity: v });\n }\n setNearPressureMultiplier(v: number): void {\n this.write({ nearPressureMultiplier: v });\n }\n setNearThreshold(v: number): void {\n this.write({ nearThreshold: v });\n }\n setEnableNearPressure(enabled: boolean): void {\n this.write({ enableNearPressure: enabled ? 1 : 0 });\n }\n\n setMaxAcceleration(v: number): void {\n this.write({ maxAcceleration: v });\n }\n\n getInfluenceRadius(): number {\n return this.readValue(\"influenceRadius\");\n }\n getTargetDensity(): number {\n return this.readValue(\"targetDensity\");\n }\n getPressureMultiplier(): number {\n return this.readValue(\"pressureMultiplier\");\n }\n getViscosity(): number {\n return this.readValue(\"viscosity\");\n }\n getNearPressureMultiplier(): number {\n return this.readValue(\"nearPressureMultiplier\");\n }\n getNearThreshold(): number {\n return this.readValue(\"nearThreshold\");\n }\n getEnableNearPressure(): number {\n return this.readValue(\"enableNearPressure\");\n }\n getMaxAcceleration(): number {\n return this.readValue(\"maxAcceleration\");\n }\n\n webgpu(): WebGPUDescriptor<FluidsInputs, FluidStateKeys> {\n return {\n states: [\"density\", \"nearDensity\"],\n // State pass: precompute density and near-density per particle\n state: ({ particleVar, dtVar, getUniform, setState }) => `{\n // Predict current particle position for this frame (approximate)\n let rad = ${getUniform(\"influenceRadius\")};\n let posPred = ${particleVar}.position + ${particleVar}.velocity * (${dtVar});\n var density: f32 = 0.0;\n var nearDensity: f32 = 0.0;\n\n // Precompute radius powers for kernels\n let r2 = rad * rad;\n let r4 = r2 * r2;\n let r6 = r4 * r2;\n let r8 = r4 * r4;\n\n // Iterate neighbors using the spatial grid\n var it = neighbor_iter_init(posPred, rad);\n loop {\n let j = neighbor_iter_next(&it, index);\n if (j == NEIGHBOR_NONE) { break; }\n let other = particles[j];\n // Skip removed or pinned neighbors\n if (other.mass <= 0.0) { continue; }\n\n let d = posPred - other.position;\n let dist2 = dot(d, d);\n if (dist2 <= 0.0) { continue; }\n let dist = sqrt(dist2);\n let factor = max(rad - dist, 0.0);\n if (factor <= 0.0) { continue; }\n\n // Density kernel (CPU: (factor^2) / (pi/6 * r^4))\n let kDensity = (factor * factor) / ((3.14159265 / 6.0) * r4);\n density = density + kDensity * 1000.0 * other.mass;\n\n // Near-density kernel (CPU: (factor^4) / (pi/15 * r^6))\n if (${getUniform(\"enableNearPressure\")} != 0.0) {\n let f2 = factor * factor;\n let kNear = (f2 * f2) / ((3.14159265 / 15.0) * r6);\n nearDensity = nearDensity + kNear * 1000.0 * other.mass;\n }\n }\n\n // Store results in shared SIM_STATE for use in apply pass\n ${setState(\"density\", \"density\")};\n ${setState(\"nearDensity\", \"nearDensity\")};\n}`,\n // Apply pass: compute pressure and viscosity forces using precomputed densities\n apply: ({ particleVar, getUniform, getState }) => `{\n let rad = ${getUniform(\"influenceRadius\")};\n let targetDensity = ${getUniform(\"targetDensity\")};\n let pressureMul = ${getUniform(\"pressureMultiplier\")};\n let visc = ${getUniform(\"viscosity\")};\n let nearMul = ${getUniform(\"nearPressureMultiplier\")};\n let nearThreshold = ${getUniform(\"nearThreshold\")};\n let useNear = ${getUniform(\"enableNearPressure\")};\n\n let myDensity = max(${getState(\"density\")}, 1e-6);\n\n // Precompute radius powers for kernels\n let r2 = rad * rad;\n let r4 = r2 * r2;\n let r6 = r4 * r2;\n let r8 = r4 * r4;\n\n // Pressure gradient accumulation\n var gradSum: vec2<f32> = vec2<f32>(0.0, 0.0);\n var it1 = neighbor_iter_init(${particleVar}.position, rad);\n loop {\n let j = neighbor_iter_next(&it1, index);\n if (j == NEIGHBOR_NONE) { break; }\n let other = particles[j];\n // Skip removed or pinned neighbors\n if (other.mass <= 0.0) { continue; }\n let delta = other.position - ${particleVar}.position;\n let dist2 = dot(delta, delta);\n if (dist2 <= 0.0) { continue; }\n let dist = sqrt(dist2);\n if (dist <= 0.0 || dist >= rad) { continue; }\n let dir = delta / dist;\n\n // Derivative kernel (CPU: scale * (dist - rad), scale = (-12/pi)/r^4)\n let scale = (-12.0 / 3.14159265) / r4;\n let slope = (dist - rad) * scale;\n\n // Neighbor pressures from precomputed densities\n let dN = max(${getState(\"density\", \"j\")}, 1e-6);\n let nearN = select(0.0, ${getState(\"nearDensity\", \"j\")}, useNear != 0.0);\n let densityDiff = dN - targetDensity;\n let pressure = densityDiff * pressureMul;\n let nearPressure = nearN * nearMul;\n let effectivePressure = select(pressure, nearPressure, dist < nearThreshold);\n\n // Gradient contribution\n gradSum = gradSum + (dir * (effectivePressure * slope) / dN);\n }\n // Pressure force is negative gradient\n var pressureForce = -gradSum;\n\n // Viscosity accumulation\n var viscosityForce: vec2<f32> = vec2<f32>(0.0, 0.0);\n if (visc != 0.0) {\n var it2 = neighbor_iter_init(${particleVar}.position, rad);\n loop {\n let j = neighbor_iter_next(&it2, index);\n if (j == NEIGHBOR_NONE) { break; }\n let other = particles[j];\n // Skip removed or pinned neighbors\n if (other.mass <= 0.0) { continue; }\n let delta = other.position - ${particleVar}.position;\n let dist2 = dot(delta, delta);\n if (dist2 <= 0.0) { continue; }\n let dist = sqrt(dist2);\n if (dist >= rad) { continue; }\n // Viscosity kernel (CPU: (max(0, r^2 - d^2)^3) / (pi/4 * r^8))\n let val = max(0.0, r2 - dist2);\n let kVisc = (val * val * val) / ((3.14159265 / 4.0) * r8);\n viscosityForce = viscosityForce + (other.velocity - ${particleVar}.velocity) * kVisc;\n }\n viscosityForce = viscosityForce * visc;\n }\n\n // Convert to acceleration-like effect: a = F / density\n var force = (pressureForce / myDensity) * 1000000.0;\n if (visc != 0.0) {\n force = force + (viscosityForce * 1000.0) / myDensity;\n }\n\n // Clamp force magnitude to avoid instabilities (tunable)\n let maxLen = ${getUniform(\"maxAcceleration\")};\n let f2 = dot(force, force);\n if (f2 > maxLen * maxLen) {\n let fLen = sqrt(f2);\n force = force * (maxLen / fLen);\n }\n\n // Apply directly to velocity (CPU mirrors this behavior)\n ${particleVar}.velocity = ${particleVar}.velocity + force;\n}`,\n };\n }\n\n cpu(): CPUDescriptor<FluidsInputs, FluidStateKeys> {\n return {\n states: [\"density\", \"nearDensity\"],\n\n // State pass: precompute density and near-density per particle\n state: ({ particle, getNeighbors, dt, setState }) => {\n // Get fluid parameters\n const rad = this.readValue(\"influenceRadius\");\n const enableNearPressure = this.readValue(\"enableNearPressure\");\n\n // Predict current particle position for this frame (approximate)\n const posPredX = particle.position.x + particle.velocity.x * dt;\n const posPredY = particle.position.y + particle.velocity.y * dt;\n let density = 0.0;\n let nearDensity = 0.0;\n\n // Precompute radius powers for kernels\n const r2 = rad * rad;\n const r4 = r2 * r2;\n const r6 = r4 * r2;\n\n // Get neighbors using predicted position\n const neighbors = getNeighbors({ x: posPredX, y: posPredY }, rad);\n\n for (const other of neighbors) {\n if (other.id === particle.id) continue; // Skip self\n // Skip removed or pinned neighbors\n if (other.mass <= 0) continue;\n\n const dX = posPredX - other.position.x;\n const dY = posPredY - other.position.y;\n const dist2 = dX * dX + dY * dY;\n\n if (dist2 <= 0.0) continue;\n\n const dist = Math.sqrt(dist2);\n const factor = Math.max(rad - dist, 0.0);\n if (factor <= 0.0) continue;\n\n // Density kernel: (factor^2) / (pi/6 * r^4)\n const kDensity = (factor * factor) / ((Math.PI / 6.0) * r4);\n density += kDensity * 1000.0 * other.mass;\n\n // Near-density kernel: (factor^4) / (pi/15 * r^6)\n if (enableNearPressure !== 0.0) {\n const f2 = factor * factor;\n const kNear = (f2 * f2) / ((Math.PI / 15.0) * r6);\n nearDensity += kNear * 1000.0 * other.mass;\n }\n }\n\n // Store results in shared state for use in apply pass\n setState(\"density\", density);\n setState(\"nearDensity\", nearDensity);\n },\n\n // Apply pass: compute pressure and viscosity forces using precomputed densities\n apply: ({ particle, getNeighbors, getState }) => {\n // Get fluid parameters\n const rad = this.readValue(\"influenceRadius\");\n const targetDensity = this.readValue(\"targetDensity\");\n const pressureMul = this.readValue(\"pressureMultiplier\");\n const visc = this.readValue(\"viscosity\");\n const nearMul = this.readValue(\"nearPressureMultiplier\");\n const nearThreshold = this.readValue(\"nearThreshold\");\n const useNear = this.readValue(\"enableNearPressure\");\n const maxAccel = this.readValue(\"maxAcceleration\");\n\n const myDensity = Math.max(getState(\"density\"), 1e-6);\n\n // Precompute radius powers for kernels\n const r2 = rad * rad;\n const r4 = r2 * r2;\n const r8 = r4 * r4;\n\n // Pressure gradient accumulation\n let gradSumX = 0.0;\n let gradSumY = 0.0;\n\n const neighbors = getNeighbors(particle.position, rad);\n\n for (const other of neighbors) {\n if (other.id === particle.id) continue; // Skip self\n // Skip removed or pinned neighbors\n if (other.mass <= 0) continue;\n\n const deltaX = other.position.x - particle.position.x;\n const deltaY = other.position.y - particle.position.y;\n const dist2 = deltaX * deltaX + deltaY * deltaY;\n\n if (dist2 <= 0.0) continue;\n\n const dist = Math.sqrt(dist2);\n if (dist <= 0.0 || dist >= rad) continue;\n\n const dirX = deltaX / dist;\n const dirY = deltaY / dist;\n\n // Derivative kernel: scale * (dist - rad), scale = (-12/pi)/r^4\n const scale = -12.0 / Math.PI / r4;\n const slope = (dist - rad) * scale;\n\n // Neighbor pressures from precomputed densities\n const dN = Math.max(getState(\"density\", other.id), 1e-6);\n const nearN =\n useNear !== 0.0 ? getState(\"nearDensity\", other.id) : 0.0;\n const densityDiff = dN - targetDensity;\n const pressure = densityDiff * pressureMul;\n const nearPressure = nearN * nearMul;\n const effectivePressure =\n dist < nearThreshold ? nearPressure : pressure;\n\n // Gradient contribution\n const gradContribX = (dirX * (effectivePressure * slope)) / dN;\n const gradContribY = (dirY * (effectivePressure * slope)) / dN;\n gradSumX += gradContribX;\n gradSumY += gradContribY;\n }\n\n // Pressure force is negative gradient\n let pressureForceX = -gradSumX;\n let pressureForceY = -gradSumY;\n\n // Viscosity accumulation\n let viscosityForceX = 0.0;\n let viscosityForceY = 0.0;\n\n if (visc !== 0.0) {\n for (const other of neighbors) {\n if (other.id === particle.id) continue; // Skip self\n // Skip removed or pinned neighbors\n if (other.mass <= 0) continue;\n\n const deltaX = other.position.x - particle.position.x;\n const deltaY = other.position.y - particle.position.y;\n const dist2 = deltaX * deltaX + deltaY * deltaY;\n\n if (dist2 <= 0.0) continue;\n\n const dist = Math.sqrt(dist2);\n if (dist >= rad) continue;\n\n // Viscosity kernel: (max(0, r^2 - d^2)^3) / (pi/4 * r^8)\n const val = Math.max(0.0, r2 - dist2);\n const kVisc = (val * val * val) / ((Math.PI / 4.0) * r8);\n\n viscosityForceX += (other.velocity.x - particle.velocity.x) * kVisc;\n viscosityForceY += (other.velocity.y - particle.velocity.y) * kVisc;\n }\n\n viscosityForceX *= visc;\n viscosityForceY *= visc;\n }\n\n // Convert to acceleration-like effect: a = F / density\n let forceX = (pressureForceX / myDensity) * 1000000.0;\n let forceY = (pressureForceY / myDensity) * 1000000.0;\n\n if (visc !== 0.0) {\n forceX += (viscosityForceX * 1000.0) / myDensity;\n forceY += (viscosityForceY * 1000.0) / myDensity;\n }\n\n // Clamp force magnitude to avoid instabilities\n const f2 = forceX * forceX + forceY * forceY;\n if (f2 > maxAccel * maxAccel) {\n const fLen = Math.sqrt(f2);\n forceX = forceX * (maxAccel / fLen);\n forceY = forceY * (maxAccel / fLen);\n }\n\n // Apply directly to velocity (matching WebGPU behavior)\n particle.velocity.x += forceX;\n particle.velocity.y += forceY;\n },\n };\n }\n}\n","/**\n * Behavior (Force Module)\n *\n * Boids-like steering behaviors: separation, alignment, cohesion, chase/avoid, wander.\n * Uses the spatial grid neighbor iterator to accumulate local influences and writes\n * into particle acceleration (no extra state). Tuned to avoid heavy branching and\n * zero-velocity edge cases.\n */\nimport {\n Module,\n type WebGPUDescriptor,\n ModuleRole,\n CPUDescriptor,\n DataType,\n} from \"../../module\";\n\nexport const DEFAULT_BEHAVIOR_WANDER = 20;\nexport const DEFAULT_BEHAVIOR_COHESION = 1.5;\nexport const DEFAULT_BEHAVIOR_ALIGNMENT = 1.5;\nexport const DEFAULT_BEHAVIOR_REPULSION = 2;\nexport const DEFAULT_BEHAVIOR_CHASE = 0;\nexport const DEFAULT_BEHAVIOR_AVOID = 0;\nexport const DEFAULT_BEHAVIOR_SEPARATION = 10;\nexport const DEFAULT_BEHAVIOR_VIEW_RADIUS = 100;\nexport const DEFAULT_BEHAVIOR_VIEW_ANGLE = 1.5 * Math.PI;\n\ntype BehaviorInputs = {\n wander: number;\n cohesion: number;\n alignment: number;\n repulsion: number;\n chase: number;\n avoid: number;\n separation: number;\n viewRadius: number;\n viewAngle: number;\n};\n\nexport class Behavior extends Module<\"behavior\", BehaviorInputs> {\n readonly name = \"behavior\" as const;\n readonly role = ModuleRole.Force;\n readonly inputs = {\n wander: DataType.NUMBER,\n cohesion: DataType.NUMBER,\n alignment: DataType.NUMBER,\n repulsion: DataType.NUMBER,\n chase: DataType.NUMBER,\n avoid: DataType.NUMBER,\n separation: DataType.NUMBER,\n viewRadius: DataType.NUMBER,\n viewAngle: DataType.NUMBER,\n } as const;\n\n constructor(opts?: {\n wander?: number;\n cohesion?: number;\n alignment?: number;\n repulsion?: number;\n chase?: number;\n avoid?: number;\n separation?: number;\n viewRadius?: number;\n viewAngle?: number;\n enabled?: boolean;\n }) {\n super();\n this.write({\n wander: opts?.wander ?? DEFAULT_BEHAVIOR_WANDER,\n cohesion: opts?.cohesion ?? DEFAULT_BEHAVIOR_COHESION,\n alignment: opts?.alignment ?? DEFAULT_BEHAVIOR_ALIGNMENT,\n repulsion: opts?.repulsion ?? DEFAULT_BEHAVIOR_REPULSION,\n chase: opts?.chase ?? DEFAULT_BEHAVIOR_CHASE,\n avoid: opts?.avoid ?? DEFAULT_BEHAVIOR_AVOID,\n separation: opts?.separation ?? DEFAULT_BEHAVIOR_SEPARATION,\n viewRadius: opts?.viewRadius ?? DEFAULT_BEHAVIOR_VIEW_RADIUS,\n viewAngle: opts?.viewAngle ?? DEFAULT_BEHAVIOR_VIEW_ANGLE,\n });\n if (opts?.enabled !== undefined) this.setEnabled(!!opts.enabled);\n }\n\n setWander(v: number): void {\n this.write({ wander: v });\n }\n setCohesion(v: number): void {\n this.write({ cohesion: v });\n }\n setAlignment(v: number): void {\n this.write({ alignment: v });\n }\n setRepulsion(v: number): void {\n this.write({ repulsion: v });\n }\n setChase(v: number): void {\n this.write({ chase: v });\n }\n setAvoid(v: number): void {\n this.write({ avoid: v });\n }\n setSeparation(v: number): void {\n this.write({ separation: v });\n }\n setViewRadius(v: number): void {\n this.write({ viewRadius: v });\n }\n setViewAngle(v: number): void {\n this.write({ viewAngle: v });\n }\n\n getWander(): number {\n return this.readValue(\"wander\");\n }\n getCohesion(): number {\n return this.readValue(\"cohesion\");\n }\n getAlignment(): number {\n return this.readValue(\"alignment\");\n }\n getRepulsion(): number {\n return this.readValue(\"repulsion\");\n }\n getChase(): number {\n return this.readValue(\"chase\");\n }\n getAvoid(): number {\n return this.readValue(\"avoid\");\n }\n getSeparation(): number {\n return this.readValue(\"separation\");\n }\n getViewRadius(): number {\n return this.readValue(\"viewRadius\");\n }\n getViewAngle(): number {\n return this.readValue(\"viewAngle\");\n }\n\n webgpu(): WebGPUDescriptor<BehaviorInputs> {\n return {\n apply: ({ particleVar, getUniform }) => `\n // Neighbor loop within view radius\n let viewR = ${getUniform(\"viewRadius\")};\n let sepRange = ${getUniform(\"separation\")};\n let wSep = ${getUniform(\"repulsion\")};\n let wAli = ${getUniform(\"alignment\")};\n let wCoh = ${getUniform(\"cohesion\")};\n let wChase = ${getUniform(\"chase\")};\n let wAvoid = ${getUniform(\"avoid\")};\n let wWander = ${getUniform(\"wander\")};\n let halfAngle = ${getUniform(\"viewAngle\")} * 0.5;\n let cosHalf = cos(halfAngle);\n\n // Accumulators\n var sep: vec2<f32> = vec2<f32>(0.0, 0.0);\n var ali: vec2<f32> = vec2<f32>(0.0, 0.0);\n var cohPos: vec2<f32> = vec2<f32>(0.0, 0.0);\n var cohCount: f32 = 0.0;\n var aliCount: f32 = 0.0;\n\n // Normalize particle velocity for FOV; if zero, skip FOV filtering\n let vMag2 = dot(${particleVar}.velocity, ${particleVar}.velocity);\n let hasVel = vMag2 > 1e-6;\n let vNorm = select(vec2<f32>(1.0, 0.0), normalize(${particleVar}.velocity), hasVel);\n\n var it = neighbor_iter_init(${particleVar}.position, viewR);\n loop {\n let j = neighbor_iter_next(&it, index);\n if (j == NEIGHBOR_NONE) { break; }\n let other = particles[j];\n let toOther = other.position - ${particleVar}.position;\n let dist2 = dot(toOther, toOther);\n if (dist2 <= 0.0) { continue; }\n let dist = sqrt(dist2);\n if (dist >= viewR) { continue; }\n\n // Field of view check\n if (hasVel) {\n let dir = toOther / dist;\n let d = dot(vNorm, dir);\n if (d < cosHalf) { continue; }\n }\n\n // Separation (closer than sepRange)\n if (dist < sepRange && wSep > 0.0) {\n let away = (${particleVar}.position - other.position) / max(dist, 1e-3);\n sep = sep + away;\n }\n\n // Alignment\n if (wAli > 0.0) {\n ali = ali + other.velocity;\n aliCount = aliCount + 1.0;\n }\n\n // Cohesion\n if (wCoh > 0.0) {\n cohPos = cohPos + other.position;\n cohCount = cohCount + 1.0;\n }\n\n // Chase / Avoid based on mass relation\n if (wChase > 0.0 && ${particleVar}.mass > other.mass) {\n let massDelta = (${particleVar}.mass - other.mass) / max(${particleVar}.mass, 1e-6);\n let seek = (toOther / max(dist, 1e-3)) * (massDelta * ${particleVar}.mass);\n // accumulate into cohesion-like vector\n cohPos = cohPos + (${particleVar}.position + seek);\n cohCount = cohCount + 1.0;\n }\n if (wAvoid > 0.0 && ${particleVar}.mass < other.mass && dist < viewR * 0.5) {\n let massDelta = (other.mass - ${particleVar}.mass) / max(other.mass, 1e-6);\n var rep = (${particleVar}.position - other.position);\n let repLen = length(rep);\n if (repLen > 0.0) {\n rep = normalize(rep) * 100000.0 * massDelta * (1.0 / max(repLen, 1.0));\n sep = sep + rep;\n }\n }\n }\n\n // Finalize alignment: steer toward avg neighbor velocity\n if (aliCount > 0.0) {\n var avgV = ali / aliCount;\n if (length(avgV) > 0.0) {\n avgV = normalize(avgV) * 1000.0;\n let steerAli = avgV - ${particleVar}.velocity;\n ${particleVar}.acceleration = ${particleVar}.acceleration + steerAli * wAli;\n }\n }\n\n // Finalize cohesion: seek centroid\n if (cohCount > 0.0) {\n let center = cohPos / cohCount;\n var seek = center - ${particleVar}.position;\n if (length(seek) > 0.0) {\n seek = normalize(seek) * 1000.0 - ${particleVar}.velocity;\n ${particleVar}.acceleration = ${particleVar}.acceleration + seek * wCoh;\n }\n }\n\n // Apply separation\n if (length(sep) > 0.0) {\n sep = normalize(sep) * 1000.0 - ${particleVar}.velocity;\n ${particleVar}.acceleration = ${particleVar}.acceleration + sep * wSep;\n }\n\n // Simple wander: small perturbation perpendicular to velocity (no state)\n if (wWander > 0.0) {\n let vel = ${particleVar}.velocity;\n let l = length(vel);\n let dir = select(vec2<f32>(1.0, 0.0), vel / max(l, 1e-6), l > 1e-6);\n let perp = vec2<f32>(-dir.y, dir.x);\n // pseudo-random based on position\n let h = dot(${particleVar}.position, vec2<f32>(12.9898, 78.233));\n let r = fract(sin(h) * 43758.5453) - 0.5;\n let jitter = perp * (r * 200.0);\n ${particleVar}.acceleration = ${particleVar}.acceleration + jitter * wWander;\n }\n`,\n };\n }\n\n cpu(): CPUDescriptor<BehaviorInputs> {\n return {\n apply: ({ particle, getNeighbors }) => {\n // Get behavior parameters\n const viewR = this.readValue(\"viewRadius\");\n const sepRange = this.readValue(\"separation\");\n const wSep = this.readValue(\"repulsion\");\n const wAli = this.readValue(\"alignment\");\n const wCoh = this.readValue(\"cohesion\");\n const wChase = this.readValue(\"chase\");\n const wAvoid = this.readValue(\"avoid\");\n const wWander = this.readValue(\"wander\");\n const halfAngle = this.readValue(\"viewAngle\") * 0.5;\n const cosHalf = Math.cos(halfAngle);\n\n // Accumulators\n let sepX = 0,\n sepY = 0;\n let aliX = 0,\n aliY = 0;\n let cohPosX = 0,\n cohPosY = 0;\n let cohCount = 0;\n let aliCount = 0;\n\n // Normalize particle velocity for FOV; if zero, skip FOV filtering\n const vMag2 =\n particle.velocity.x * particle.velocity.x +\n particle.velocity.y * particle.velocity.y;\n const hasVel = vMag2 > 1e-6;\n let vNormX = 1,\n vNormY = 0;\n if (hasVel) {\n const vMag = Math.sqrt(vMag2);\n vNormX = particle.velocity.x / vMag;\n vNormY = particle.velocity.y / vMag;\n }\n\n // Get neighbors within view radius using spatial grid\n const neighbors = getNeighbors(particle.position, viewR);\n\n for (const other of neighbors) {\n if (other.id === particle.id) continue; // Skip self\n\n const toOtherX = other.position.x - particle.position.x;\n const toOtherY = other.position.y - particle.position.y;\n const dist2 = toOtherX * toOtherX + toOtherY * toOtherY;\n\n if (dist2 <= 0.0) continue;\n\n const dist = Math.sqrt(dist2);\n if (dist >= viewR) continue;\n\n // Field of view check\n if (hasVel) {\n const dirX = toOtherX / dist;\n const dirY = toOtherY / dist;\n const dotProduct = vNormX * dirX + vNormY * dirY;\n if (dotProduct < cosHalf) continue;\n }\n\n // Separation (closer than sepRange)\n if (dist < sepRange && wSep > 0.0) {\n const awayX =\n (particle.position.x - other.position.x) / Math.max(dist, 1e-3);\n const awayY =\n (particle.position.y - other.position.y) / Math.max(dist, 1e-3);\n sepX += awayX;\n sepY += awayY;\n }\n\n // Alignment\n if (wAli > 0.0) {\n aliX += other.velocity.x;\n aliY += other.velocity.y;\n aliCount += 1.0;\n }\n\n // Cohesion\n if (wCoh > 0.0) {\n cohPosX += other.position.x;\n cohPosY += other.position.y;\n cohCount += 1.0;\n }\n\n // Chase / Avoid based on mass relation\n if (wChase > 0.0 && particle.mass > other.mass) {\n const massDelta =\n (particle.mass - other.mass) / Math.max(particle.mass, 1e-6);\n const seekX =\n (toOtherX / Math.max(dist, 1e-3)) * (massDelta * particle.mass);\n const seekY =\n (toOtherY / Math.max(dist, 1e-3)) * (massDelta * particle.mass);\n // accumulate into cohesion-like vector\n cohPosX += particle.position.x + seekX;\n cohPosY += particle.position.y + seekY;\n cohCount += 1.0;\n }\n\n if (\n wAvoid > 0.0 &&\n particle.mass < other.mass &&\n dist < viewR * 0.5\n ) {\n const massDelta =\n (other.mass - particle.mass) / Math.max(other.mass, 1e-6);\n let repX = particle.position.x - other.position.x;\n let repY = particle.position.y - other.position.y;\n const repLen = Math.sqrt(repX * repX + repY * repY);\n if (repLen > 0.0) {\n repX =\n (repX / repLen) *\n 100000.0 *\n massDelta *\n (1.0 / Math.max(repLen, 1.0));\n repY =\n (repY / repLen) *\n 100000.0 *\n massDelta *\n (1.0 / Math.max(repLen, 1.0));\n sepX += repX;\n sepY += repY;\n }\n }\n }\n\n // Finalize alignment: steer toward avg neighbor velocity\n if (aliCount > 0.0) {\n let avgVX = aliX / aliCount;\n let avgVY = aliY / aliCount;\n const avgVLen = Math.sqrt(avgVX * avgVX + avgVY * avgVY);\n if (avgVLen > 0.0) {\n avgVX = (avgVX / avgVLen) * 1000.0;\n avgVY = (avgVY / avgVLen) * 1000.0;\n const steerAliX = avgVX - particle.velocity.x;\n const steerAliY = avgVY - particle.velocity.y;\n particle.acceleration.x += steerAliX * wAli;\n particle.acceleration.y += steerAliY * wAli;\n }\n }\n\n // Finalize cohesion: seek centroid\n if (cohCount > 0.0) {\n const centerX = cohPosX / cohCount;\n const centerY = cohPosY / cohCount;\n let seekX = centerX - particle.position.x;\n let seekY = centerY - particle.position.y;\n const seekLen = Math.sqrt(seekX * seekX + seekY * seekY);\n if (seekLen > 0.0) {\n seekX = (seekX / seekLen) * 1000.0 - particle.velocity.x;\n seekY = (seekY / seekLen) * 1000.0 - particle.velocity.y;\n particle.acceleration.x += seekX * wCoh;\n particle.acceleration.y += seekY * wCoh;\n }\n }\n\n // Apply separation\n const sepLen = Math.sqrt(sepX * sepX + sepY * sepY);\n if (sepLen > 0.0) {\n sepX = (sepX / sepLen) * 1000.0 - particle.velocity.x;\n sepY = (sepY / sepLen) * 1000.0 - particle.velocity.y;\n particle.acceleration.x += sepX * wSep;\n particle.acceleration.y += sepY * wSep;\n }\n\n // Simple wander: small perturbation perpendicular to velocity (no state)\n if (wWander > 0.0) {\n const velX = particle.velocity.x;\n const velY = particle.velocity.y;\n const velLen = Math.sqrt(velX * velX + velY * velY);\n\n let dirX = 1.0,\n dirY = 0.0;\n if (velLen > 1e-6) {\n dirX = velX / velLen;\n dirY = velY / velLen;\n }\n\n const perpX = -dirY;\n const perpY = dirX;\n\n // pseudo-random based on position (matching WebGPU logic)\n const h =\n particle.position.x * 12.9898 + particle.position.y * 78.233;\n const fract = (x: number) => x - Math.floor(x);\n const r = fract(Math.sin(h) * 43758.5453) - 0.5;\n const jitterX = perpX * (r * 200.0);\n const jitterY = perpY * (r * 200.0);\n\n particle.acceleration.x += jitterX * wWander;\n particle.acceleration.y += jitterY * wWander;\n }\n },\n };\n }\n}\n","/**\n * Sensors (Force/Behavior Module)\n *\n * Samples the scene texture around two forward-biased sensor points (left/right)\n * to derive simple follow/flee steering decisions. Supports color-aware behaviors\n * (same/different) and intensity-only mode. Writes directly to velocity for snappy\n * reactions (mirrors CPU behavior path).\n */\nimport {\n Module,\n type WebGPUDescriptor,\n ModuleRole,\n CPUDescriptor,\n DataType,\n} from \"../../module\";\n\nexport type SensorBehavior = \"any\" | \"same\" | \"different\" | \"none\";\n\nexport const DEFAULT_SENSORS_SENSOR_DISTANCE = 30;\nexport const DEFAULT_SENSORS_SENSOR_ANGLE = Math.PI / 6; // 30 degrees\nexport const DEFAULT_SENSORS_SENSOR_RADIUS = 3;\nexport const DEFAULT_SENSORS_SENSOR_THRESHOLD = 0.1;\nexport const DEFAULT_SENSORS_SENSOR_STRENGTH = 1000;\nexport const DEFAULT_SENSORS_COLOR_SIMILARITY_THRESHOLD = 0.4;\nexport const DEFAULT_SENSORS_FOLLOW_BEHAVIOR: SensorBehavior = \"any\";\nexport const DEFAULT_SENSORS_FLEE_BEHAVIOR: SensorBehavior = \"none\";\nexport const DEFAULT_SENSORS_FLEE_ANGLE = Math.PI / 2;\n\ntype SensorsInputs = {\n sensorDistance: number;\n sensorAngle: number;\n sensorRadius: number;\n sensorThreshold: number;\n sensorStrength: number;\n colorSimilarityThreshold: number;\n followBehavior: number;\n fleeBehavior: number;\n fleeAngle: number;\n};\n\nexport class Sensors extends Module<\"sensors\", SensorsInputs> {\n readonly name = \"sensors\" as const;\n readonly role = ModuleRole.Force;\n readonly inputs = {\n sensorDistance: DataType.NUMBER,\n sensorAngle: DataType.NUMBER,\n sensorRadius: DataType.NUMBER,\n sensorThreshold: DataType.NUMBER,\n sensorStrength: DataType.NUMBER,\n colorSimilarityThreshold: DataType.NUMBER,\n followBehavior: DataType.NUMBER,\n fleeBehavior: DataType.NUMBER,\n fleeAngle: DataType.NUMBER,\n } as const;\n\n constructor(opts?: {\n enabled?: boolean;\n sensorDistance?: number;\n sensorAngle?: number;\n sensorRadius?: number;\n sensorThreshold?: number;\n sensorStrength?: number;\n colorSimilarityThreshold?: number;\n followBehavior?: SensorBehavior;\n fleeBehavior?: SensorBehavior;\n fleeAngle?: number;\n }) {\n super();\n this.write({\n sensorDistance: opts?.sensorDistance ?? DEFAULT_SENSORS_SENSOR_DISTANCE,\n sensorAngle: opts?.sensorAngle ?? DEFAULT_SENSORS_SENSOR_ANGLE,\n sensorRadius: opts?.sensorRadius ?? DEFAULT_SENSORS_SENSOR_RADIUS,\n sensorThreshold:\n opts?.sensorThreshold ?? DEFAULT_SENSORS_SENSOR_THRESHOLD,\n sensorStrength: opts?.sensorStrength ?? DEFAULT_SENSORS_SENSOR_STRENGTH,\n colorSimilarityThreshold:\n opts?.colorSimilarityThreshold ??\n DEFAULT_SENSORS_COLOR_SIMILARITY_THRESHOLD,\n followBehavior: this.behaviorToUniform(\n opts?.followBehavior ?? DEFAULT_SENSORS_FOLLOW_BEHAVIOR\n ),\n fleeBehavior: this.behaviorToUniform(\n opts?.fleeBehavior ?? DEFAULT_SENSORS_FLEE_BEHAVIOR\n ),\n fleeAngle: opts?.fleeAngle ?? DEFAULT_SENSORS_FLEE_ANGLE,\n });\n\n if (opts?.enabled !== undefined) {\n this.setEnabled(!!opts.enabled);\n }\n }\n\n private behaviorToUniform(behavior: SensorBehavior): number {\n switch (behavior) {\n case \"any\":\n return 0;\n case \"same\":\n return 1;\n case \"different\":\n return 2;\n case \"none\":\n return 3;\n default:\n return 3;\n }\n }\n\n setSensorDistance(value: number): void {\n this.write({ sensorDistance: value });\n }\n\n setSensorAngle(value: number): void {\n this.write({ sensorAngle: value });\n }\n\n setSensorRadius(value: number): void {\n this.write({ sensorRadius: value });\n }\n\n setSensorThreshold(value: number): void {\n this.write({ sensorThreshold: value });\n }\n\n setSensorStrength(value: number): void {\n this.write({ sensorStrength: value });\n }\n\n setColorSimilarityThreshold(value: number): void {\n this.write({ colorSimilarityThreshold: value });\n }\n\n setFollowBehavior(behavior: SensorBehavior): void {\n this.write({ followBehavior: this.behaviorToUniform(behavior) });\n }\n\n setFleeBehavior(behavior: SensorBehavior): void {\n this.write({ fleeBehavior: this.behaviorToUniform(behavior) });\n }\n\n setFleeAngle(value: number): void {\n this.write({ fleeAngle: value });\n }\n\n getSensorDistance(): number {\n return this.readValue(\"sensorDistance\");\n }\n getSensorAngle(): number {\n return this.readValue(\"sensorAngle\");\n }\n getSensorRadius(): number {\n return this.readValue(\"sensorRadius\");\n }\n getSensorThreshold(): number {\n return this.readValue(\"sensorThreshold\");\n }\n getSensorStrength(): number {\n return this.readValue(\"sensorStrength\");\n }\n getColorSimilarityThreshold(): number {\n return this.readValue(\"colorSimilarityThreshold\");\n }\n getFollowBehavior(): number {\n return this.readValue(\"followBehavior\");\n }\n getFleeBehavior(): number {\n return this.readValue(\"fleeBehavior\");\n }\n getFleeAngle(): number {\n return this.readValue(\"fleeAngle\");\n }\n getEnabled(): number {\n return this.readValue(\"enabled\");\n }\n\n webgpu(): WebGPUDescriptor<SensorsInputs> {\n return {\n global: () => `// Sensor helper functions (defined at global scope)\n// Sample from the scene texture bound to the compute pipeline\n\nfn world_to_uv(pos: vec2<f32>) -> vec2<f32> {\n // Transform world position into UV in [0,1] using grid uniforms\n // Trails are rendered with Y already flipped in the vertex shader,\n // so sampling should NOT flip Y again here.\n let u = (pos.x - GRID_MINX()) / (GRID_MAXX() - GRID_MINX());\n let v = (pos.y - GRID_MINY()) / (GRID_MAXY() - GRID_MINY());\n return clamp(vec2<f32>(u, v), vec2<f32>(0.0, 0.0), vec2<f32>(1.0, 1.0));\n}\n\nfn uv_to_texel(uv: vec2<f32>) -> vec2<i32> {\n // Derive dimensions from texture\n let dim = textureDimensions(scene_texture);\n let x = i32(clamp(floor(uv.x * f32(dim.x)), 0.0, f32(dim.x - 1)));\n let y = i32(clamp(floor(uv.y * f32(dim.y)), 0.0, f32(dim.y - 1)));\n return vec2<i32>(x, y);\n}\n\nfn sensor_sample_intensity(pos: vec2<f32>, radius: f32, _selfIndex: u32) -> f32 {\n // Sample a small disk in the trail texture and average luminance\n let uv = world_to_uv(pos);\n let dim = textureDimensions(scene_texture);\n // Convert world radius to approximate pixels using grid extent\n let pxPerWorld = f32(dim.x) / (GRID_MAXX() - GRID_MINX());\n let pxRadius = clamp(radius * pxPerWorld, 1.0, 16.0);\n let center = uv_to_texel(uv);\n var sum: f32 = 0.0;\n var count: f32 = 0.0;\n let r = i32(clamp(pxRadius, 1.0, 8.0));\n for (var dy = -r; dy <= r; dy++) {\n for (var dx = -r; dx <= r; dx++) {\n let tc = vec2<i32>(center.x + dx, center.y + dy);\n if (tc.x < 0 || tc.y < 0 || tc.x >= i32(dim.x) || tc.y >= i32(dim.y)) { continue; }\n let c = textureLoad(scene_texture, tc, 0);\n let lum = dot(c.rgb, vec3<f32>(0.2126, 0.7152, 0.0722));\n sum += lum;\n count += 1.0;\n }\n }\n if (count > 0.0) {\n return clamp(sum / count, 0.0, 1.0);\n }\n return 0.0;\n}\n\nfn sensor_sample_color(pos: vec2<f32>, radius: f32, _selfIndex: u32) -> vec3<f32> {\n let uv = world_to_uv(pos);\n let dim = textureDimensions(scene_texture);\n let pxPerWorld = f32(dim.x) / (GRID_MAXX() - GRID_MINX());\n let pxRadius = clamp(radius * pxPerWorld, 1.0, 16.0);\n let center = uv_to_texel(uv);\n var sum = vec3<f32>(0.0, 0.0, 0.0);\n var count: f32 = 0.0;\n let r = i32(clamp(pxRadius, 1.0, 8.0));\n for (var dy = -r; dy <= r; dy++) {\n for (var dx = -r; dx <= r; dx++) {\n let tc = vec2<i32>(center.x + dx, center.y + dy);\n if (tc.x < 0 || tc.y < 0 || tc.x >= i32(dim.x) || tc.y >= i32(dim.y)) { continue; }\n let c = textureLoad(scene_texture, tc, 0);\n sum += c.rgb;\n count += 1.0;\n }\n }\n if (count > 0.0) {\n return clamp(sum / count, vec3<f32>(0.0), vec3<f32>(1.0));\n }\n return vec3<f32>(0.0, 0.0, 0.0);\n}\n\n\nfn sensor_is_activated(\n intensity: f32,\n sensorColor: vec3<f32>, \n particleColor: vec3<f32>,\n behavior: f32,\n threshold: f32,\n colorThreshold: f32\n) -> bool {\n // Check intensity threshold first\n if (intensity <= threshold) {\n return false;\n }\n\n if (behavior == 0.0) { // \"any\"\n return true;\n } else if (behavior == 1.0) { // \"same\"\n let colorDiff = sensorColor - particleColor;\n let distance = sqrt(dot(colorDiff, colorDiff));\n let maxDistance = sqrt(3.0); // max distance in RGB space (0-1 range)\n let similarity = 1.0 - (distance / maxDistance);\n return similarity > colorThreshold;\n } else if (behavior == 2.0) { // \"different\"\n let colorDiff = sensorColor - particleColor;\n let distance = sqrt(dot(colorDiff, colorDiff));\n let maxDistance = sqrt(3.0);\n let similarity = 1.0 - (distance / maxDistance);\n return similarity <= colorThreshold;\n } else { // \"none\" (behavior == 3.0)\n return false;\n }\n}\n`,\n apply: ({ particleVar, getUniform }) => `\n// Early exit if module is disabled or particle is pinned\nif (${particleVar}.mass == 0.0) {\n return;\n}\n\n// Get sensor configuration\nlet sensorDist = ${getUniform(\"sensorDistance\")};\nlet sensorAngle = ${getUniform(\"sensorAngle\")};\nlet sensorRadius = ${getUniform(\"sensorRadius\")};\nlet sensorThreshold = ${getUniform(\"sensorThreshold\")};\nlet sensorStrength = ${getUniform(\"sensorStrength\")};\nlet colorThreshold = ${getUniform(\"colorSimilarityThreshold\")};\nlet followBehavior = ${getUniform(\"followBehavior\")};\nlet fleeBehavior = ${getUniform(\"fleeBehavior\")};\nlet fleeAngleOffset = ${getUniform(\"fleeAngle\")};\n\n// Get particle color for color-based behaviors\nlet particleColor = ${particleVar}.color.rgb;\n\n// Calculate particle velocity direction (normalized)\nlet velocityMag = length(${particleVar}.velocity);\nvar velocityDir = vec2<f32>(1.0, 0.0); // default direction\nif (velocityMag > 0.01) {\n velocityDir = normalize(${particleVar}.velocity);\n} else {\n // Use pseudo-random direction when particle has no velocity\n let h = dot(${particleVar}.position, vec2<f32>(12.9898, 78.233));\n let r = fract(sin(h) * 43758.5453) * 2.0 * 3.14159265; // 0 to 2π\n velocityDir = vec2<f32>(cos(r), sin(r));\n}\n\n// Calculate sensor positions\n// Left sensor: rotate velocity direction by -sensorAngle\nlet cosLeft = cos(-sensorAngle);\nlet sinLeft = sin(-sensorAngle);\nlet leftDir = vec2<f32>(\n velocityDir.x * cosLeft - velocityDir.y * sinLeft,\n velocityDir.x * sinLeft + velocityDir.y * cosLeft\n);\nlet leftSensorPos = ${particleVar}.position + leftDir * sensorDist;\n\n// Right sensor: rotate velocity direction by +sensorAngle \nlet cosRight = cos(sensorAngle);\nlet sinRight = sin(sensorAngle);\nlet rightDir = vec2<f32>(\n velocityDir.x * cosRight - velocityDir.y * sinRight,\n velocityDir.x * sinRight + velocityDir.y * cosRight\n);\nlet rightSensorPos = ${particleVar}.position + rightDir * sensorDist;\n\n// Sample sensor data from scene texture (works for trails-on and trails-off paths)\nlet leftIntensity = sensor_sample_intensity(leftSensorPos, sensorRadius, index);\nlet rightIntensity = sensor_sample_intensity(rightSensorPos, sensorRadius, index);\nlet leftColor = sensor_sample_color(leftSensorPos, sensorRadius, index);\nlet rightColor = sensor_sample_color(rightSensorPos, sensorRadius, index);\n\n// Evaluate sensor activation for follow behavior\nvar followForce = vec2<f32>(0.0, 0.0);\nif (followBehavior == 0.0) { // \"any\" (ignore color, compare intensities)\n if (leftIntensity > rightIntensity && leftIntensity > sensorThreshold) {\n followForce = leftDir;\n } else if (rightIntensity > leftIntensity && rightIntensity > sensorThreshold) {\n followForce = rightDir;\n }\n} else if (followBehavior == 1.0 || followBehavior == 2.0) { // \"same\" or \"different\"\n let leftActive = sensor_is_activated(leftIntensity, leftColor, particleColor, followBehavior, sensorThreshold, colorThreshold);\n let rightActive = sensor_is_activated(rightIntensity, rightColor, particleColor, followBehavior, sensorThreshold, colorThreshold);\n if (leftActive && !rightActive) {\n followForce = leftDir;\n } else if (rightActive && !leftActive) {\n followForce = rightDir;\n }\n} // else \"none\" -> no follow force\n\n// Evaluate sensor activation for flee behavior\nvar fleeForce = vec2<f32>(0.0, 0.0);\nif (fleeBehavior == 0.0) { // \"any\" (ignore color, compare intensities)\n if (leftIntensity > rightIntensity && leftIntensity > sensorThreshold) {\n // Flee from left sensor: rotate left direction by -fleeAngle (turn right)\n let cosFleeLeft = cos(-fleeAngleOffset);\n let sinFleeLeft = sin(-fleeAngleOffset);\n fleeForce = vec2<f32>(\n leftDir.x * cosFleeLeft - leftDir.y * sinFleeLeft,\n leftDir.x * sinFleeLeft + leftDir.y * cosFleeLeft\n );\n } else if (rightIntensity > leftIntensity && rightIntensity > sensorThreshold) {\n // Flee from right sensor: rotate right direction by +fleeAngle (turn left)\n let cosFleeRight = cos(fleeAngleOffset);\n let sinFleeRight = sin(fleeAngleOffset);\n fleeForce = vec2<f32>(\n rightDir.x * cosFleeRight - rightDir.y * sinFleeRight,\n rightDir.x * sinFleeRight + rightDir.y * cosFleeRight\n );\n }\n} else if (fleeBehavior == 1.0 || fleeBehavior == 2.0) { // \"same\" or \"different\"\n let leftActive = sensor_is_activated(leftIntensity, leftColor, particleColor, fleeBehavior, sensorThreshold, colorThreshold);\n let rightActive = sensor_is_activated(rightIntensity, rightColor, particleColor, fleeBehavior, sensorThreshold, colorThreshold);\n if (leftActive && !rightActive) {\n // Flee from left sensor: rotate left direction by -fleeAngle (turn right)\n let cosFleeLeft = cos(-fleeAngleOffset);\n let sinFleeLeft = sin(-fleeAngleOffset);\n fleeForce = vec2<f32>(\n leftDir.x * cosFleeLeft - leftDir.y * sinFleeLeft,\n leftDir.x * sinFleeLeft + leftDir.y * cosFleeLeft\n );\n } else if (rightActive && !leftActive) {\n // Flee from right sensor: rotate right direction by +fleeAngle (turn left)\n let cosFleeRight = cos(fleeAngleOffset);\n let sinFleeRight = sin(fleeAngleOffset);\n fleeForce = vec2<f32>(\n rightDir.x * cosFleeRight - rightDir.y * sinFleeRight,\n rightDir.x * sinFleeRight + rightDir.y * cosFleeRight\n );\n }\n}\n\n// Combine and apply forces\n// Set velocity based on sensor decision (do not integrate acceleration)\nvar totalForce = followForce + fleeForce;\nif (length(totalForce) > 0.0) {\n let dir = normalize(totalForce);\n // Match CPU: set velocity to direction scaled by sensorStrength/5\n ${particleVar}.velocity = dir * (sensorStrength / 5.0);\n}\n`,\n };\n }\n\n cpu(): CPUDescriptor<SensorsInputs> {\n return {\n apply: ({ particle, input, getImageData, view }) => {\n const sensorDist = input.sensorDistance;\n const sensorAngle = input.sensorAngle;\n const sensorRadius = input.sensorRadius;\n const sensorThreshold = input.sensorThreshold;\n const sensorStrength = input.sensorStrength;\n const colorThreshold = input.colorSimilarityThreshold;\n const followBehavior = input.followBehavior;\n const fleeBehavior = input.fleeBehavior;\n const fleeAngleOffset = input.fleeAngle;\n\n // Get particle color for color-based behaviors\n const particleColor = {\n r: particle.color.r,\n g: particle.color.g,\n b: particle.color.b,\n };\n\n // Calculate particle velocity direction (normalized)\n const velocityMag = Math.sqrt(\n particle.velocity.x * particle.velocity.x +\n particle.velocity.y * particle.velocity.y\n );\n let velocityDir = { x: 1, y: 0 }; // default direction\n\n if (velocityMag > 0.01) {\n velocityDir = {\n x: particle.velocity.x / velocityMag,\n y: particle.velocity.y / velocityMag,\n };\n } else {\n // Use pseudo-random direction when particle has no velocity\n const h =\n particle.position.x * 12.9898 + particle.position.y * 78.233;\n const r = ((Math.sin(h) * 43758.5453) % 1) * 2 * Math.PI;\n velocityDir = { x: Math.cos(r), y: Math.sin(r) };\n }\n\n // Calculate sensor positions\n // Left sensor: rotate velocity direction by -sensorAngle\n const cosLeft = Math.cos(-sensorAngle);\n const sinLeft = Math.sin(-sensorAngle);\n const leftDir = {\n x: velocityDir.x * cosLeft - velocityDir.y * sinLeft,\n y: velocityDir.x * sinLeft + velocityDir.y * cosLeft,\n };\n const leftSensorPos = {\n x: particle.position.x + leftDir.x * sensorDist,\n y: particle.position.y + leftDir.y * sensorDist,\n };\n\n // Right sensor: rotate velocity direction by +sensorAngle\n const cosRight = Math.cos(sensorAngle);\n const sinRight = Math.sin(sensorAngle);\n const rightDir = {\n x: velocityDir.x * cosRight - velocityDir.y * sinRight,\n y: velocityDir.x * sinRight + velocityDir.y * cosRight,\n };\n const rightSensorPos = {\n x: particle.position.x + rightDir.x * sensorDist,\n y: particle.position.y + rightDir.y * sensorDist,\n };\n\n // Helper function to sample canvas at a position with radius\n const sampleCanvas = (\n position: { x: number; y: number },\n radius: number\n ): {\n intensity: number;\n color: { r: number; g: number; b: number };\n } => {\n const camera = view.getCamera();\n const zoom = view.getZoom();\n const size = view.getSize();\n const centerX = size.width / 2;\n const centerY = size.height / 2;\n\n // Transform world position to screen position\n const worldX = (position.x - camera.x) * zoom;\n const worldY = (position.y - camera.y) * zoom;\n const screenX = centerX + worldX;\n const screenY = centerY + worldY;\n const screenRadius = Math.max(1, radius * zoom);\n\n // Calculate sample area bounds\n const left = Math.floor(screenX - screenRadius);\n const top = Math.floor(screenY - screenRadius);\n const right = Math.ceil(screenX + screenRadius);\n const bottom = Math.ceil(screenY + screenRadius);\n const width = right - left;\n const height = bottom - top;\n\n if (width <= 0 || height <= 0) {\n return { intensity: 0, color: { r: 0, g: 0, b: 0 } };\n }\n\n const imageData = getImageData(left, top, width, height);\n if (!imageData) {\n return { intensity: 0, color: { r: 0, g: 0, b: 0 } };\n }\n\n const data = imageData.data;\n let totalR = 0,\n totalG = 0,\n totalB = 0,\n totalIntensity = 0;\n let sampleCount = 0;\n\n // Sample pixels in a circular area\n const centerSampleX = screenX - left;\n const centerSampleY = screenY - top;\n\n for (let y = 0; y < imageData.height; y++) {\n for (let x = 0; x < imageData.width; x++) {\n const dx = x - centerSampleX;\n const dy = y - centerSampleY;\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n if (distance <= screenRadius) {\n const i = (y * imageData.width + x) * 4;\n const r = data[i] / 255;\n const g = data[i + 1] / 255;\n const b = data[i + 2] / 255;\n const intensity = 0.2126 * r + 0.7152 * g + 0.0722 * b; // Luminance\n\n totalR += r;\n totalG += g;\n totalB += b;\n totalIntensity += intensity;\n sampleCount++;\n }\n }\n }\n\n if (sampleCount === 0) {\n return { intensity: 0, color: { r: 0, g: 0, b: 0 } };\n }\n\n return {\n intensity: Math.min(1, Math.max(0, totalIntensity / sampleCount)),\n color: {\n r: Math.min(1, Math.max(0, totalR / sampleCount)),\n g: Math.min(1, Math.max(0, totalG / sampleCount)),\n b: Math.min(1, Math.max(0, totalB / sampleCount)),\n },\n };\n };\n\n const leftSample = sampleCanvas(leftSensorPos, sensorRadius);\n const rightSample = sampleCanvas(rightSensorPos, sensorRadius);\n\n // Helper function to check sensor activation\n const isSensorActivated = (\n intensity: number,\n sensorColor: { r: number; g: number; b: number },\n behavior: number\n ): boolean => {\n // Check intensity threshold first\n if (intensity <= sensorThreshold) {\n return false;\n }\n\n if (behavior === 0) {\n // \"any\"\n return true;\n } else if (behavior === 1) {\n // \"same\"\n const colorDiff = {\n r: sensorColor.r - particleColor.r,\n g: sensorColor.g - particleColor.g,\n b: sensorColor.b - particleColor.b,\n };\n const distance = Math.sqrt(\n colorDiff.r * colorDiff.r +\n colorDiff.g * colorDiff.g +\n colorDiff.b * colorDiff.b\n );\n const maxDistance = Math.sqrt(3); // max distance in RGB space (0-1 range)\n const similarity = 1 - distance / maxDistance;\n return similarity > colorThreshold;\n } else if (behavior === 2) {\n // \"different\"\n const colorDiff = {\n r: sensorColor.r - particleColor.r,\n g: sensorColor.g - particleColor.g,\n b: sensorColor.b - particleColor.b,\n };\n const distance = Math.sqrt(\n colorDiff.r * colorDiff.r +\n colorDiff.g * colorDiff.g +\n colorDiff.b * colorDiff.b\n );\n const maxDistance = Math.sqrt(3);\n const similarity = 1 - distance / maxDistance;\n return similarity <= colorThreshold;\n } else {\n // \"none\" (behavior === 3)\n return false;\n }\n };\n\n // Evaluate sensor activation for follow behavior\n let followForce = { x: 0, y: 0 };\n if (followBehavior === 0) {\n // \"any\" (ignore color, compare intensities)\n if (\n leftSample.intensity > rightSample.intensity &&\n leftSample.intensity > sensorThreshold\n ) {\n followForce = leftDir;\n } else if (\n rightSample.intensity > leftSample.intensity &&\n rightSample.intensity > sensorThreshold\n ) {\n followForce = rightDir;\n }\n } else if (followBehavior === 1 || followBehavior === 2) {\n // \"same\" or \"different\"\n const leftActive = isSensorActivated(\n leftSample.intensity,\n leftSample.color,\n followBehavior\n );\n const rightActive = isSensorActivated(\n rightSample.intensity,\n rightSample.color,\n followBehavior\n );\n if (leftActive && !rightActive) {\n followForce = leftDir;\n } else if (rightActive && !leftActive) {\n followForce = rightDir;\n }\n } // else \"none\" -> no follow force\n\n // Evaluate sensor activation for flee behavior\n let fleeForce = { x: 0, y: 0 };\n if (fleeBehavior === 0) {\n // \"any\" (ignore color, compare intensities)\n if (\n leftSample.intensity > rightSample.intensity &&\n leftSample.intensity > sensorThreshold\n ) {\n // Flee from left sensor: rotate left direction by -fleeAngle (turn right)\n const cosFleeLeft = Math.cos(-fleeAngleOffset);\n const sinFleeLeft = Math.sin(-fleeAngleOffset);\n fleeForce = {\n x: leftDir.x * cosFleeLeft - leftDir.y * sinFleeLeft,\n y: leftDir.x * sinFleeLeft + leftDir.y * cosFleeLeft,\n };\n } else if (\n rightSample.intensity > leftSample.intensity &&\n rightSample.intensity > sensorThreshold\n ) {\n // Flee from right sensor: rotate right direction by +fleeAngle (turn left)\n const cosFleeRight = Math.cos(fleeAngleOffset);\n const sinFleeRight = Math.sin(fleeAngleOffset);\n fleeForce = {\n x: rightDir.x * cosFleeRight - rightDir.y * sinFleeRight,\n y: rightDir.x * sinFleeRight + rightDir.y * cosFleeRight,\n };\n }\n } else if (fleeBehavior === 1 || fleeBehavior === 2) {\n // \"same\" or \"different\"\n const leftActive = isSensorActivated(\n leftSample.intensity,\n leftSample.color,\n fleeBehavior\n );\n const rightActive = isSensorActivated(\n rightSample.intensity,\n rightSample.color,\n fleeBehavior\n );\n if (leftActive && !rightActive) {\n // Flee from left sensor: rotate left direction by -fleeAngle (turn right)\n const cosFleeLeft = Math.cos(-fleeAngleOffset);\n const sinFleeLeft = Math.sin(-fleeAngleOffset);\n fleeForce = {\n x: leftDir.x * cosFleeLeft - leftDir.y * sinFleeLeft,\n y: leftDir.x * sinFleeLeft + leftDir.y * cosFleeLeft,\n };\n } else if (rightActive && !leftActive) {\n // Flee from right sensor: rotate right direction by +fleeAngle (turn left)\n const cosFleeRight = Math.cos(fleeAngleOffset);\n const sinFleeRight = Math.sin(fleeAngleOffset);\n fleeForce = {\n x: rightDir.x * cosFleeRight - rightDir.y * sinFleeRight,\n y: rightDir.x * sinFleeRight + rightDir.y * cosFleeRight,\n };\n }\n }\n\n // Combine and apply forces\n const totalForce = {\n x: followForce.x + fleeForce.x,\n y: followForce.y + fleeForce.y,\n };\n\n const forceMag = Math.sqrt(\n totalForce.x * totalForce.x + totalForce.y * totalForce.y\n );\n if (forceMag > 0) {\n const dir = {\n x: totalForce.x / forceMag,\n y: totalForce.y / forceMag,\n };\n // Match WebGPU: set velocity to direction scaled by sensorStrength/5\n particle.velocity.x = dir.x * (sensorStrength / 5);\n particle.velocity.y = dir.y * (sensorStrength / 5);\n }\n },\n };\n }\n}\n","/**\n * Interaction (Force Module)\n *\n * Mouse-driven attract/repel impulse applied within a radius when the selected\n * input button is active. Strength falls off to zero at the edge of the radius.\n */\nimport {\n Module,\n type WebGPUDescriptor,\n ModuleRole,\n CPUDescriptor,\n DataType,\n} from \"../../module\";\n\nexport const DEFAULT_INTERACTION_MODE: \"attract\" | \"repel\" = \"attract\";\nexport const DEFAULT_INTERACTION_STRENGTH = 10000;\nexport const DEFAULT_INTERACTION_RADIUS = 500;\n\n// action: 0 -> click (left), 1 -> right_click\n// mode: 0 -> attract, 1 -> repel\n\ntype InteractionInputs = {\n mode: number;\n strength: number;\n radius: number;\n positionX: number;\n positionY: number;\n active: number;\n};\n\nexport class Interaction extends Module<\"interaction\", InteractionInputs> {\n readonly name = \"interaction\" as const;\n readonly role = ModuleRole.Force;\n readonly inputs = {\n mode: DataType.NUMBER,\n strength: DataType.NUMBER,\n radius: DataType.NUMBER,\n positionX: DataType.NUMBER,\n positionY: DataType.NUMBER,\n active: DataType.NUMBER,\n } as const;\n\n constructor(opts?: {\n enabled?: boolean;\n action?: \"click\" | \"right_click\";\n mode?: \"attract\" | \"repel\";\n strength?: number;\n radius?: number;\n position?: { x: number; y: number };\n active?: boolean;\n }) {\n super();\n const mode = (opts?.mode ?? DEFAULT_INTERACTION_MODE) === \"repel\" ? 1 : 0;\n this.write({\n mode,\n strength: opts?.strength ?? DEFAULT_INTERACTION_STRENGTH,\n radius: opts?.radius ?? DEFAULT_INTERACTION_RADIUS,\n positionX: opts?.position?.x ?? 0,\n positionY: opts?.position?.y ?? 0,\n active: opts?.active ? 1 : 0,\n });\n if (opts?.enabled !== undefined) {\n this.setEnabled(!!opts.enabled);\n }\n }\n\n setMode(v: \"attract\" | \"repel\"): void {\n this.write({ mode: v === \"repel\" ? 1 : 0 });\n }\n setStrength(v: number): void {\n this.write({ strength: v });\n }\n setRadius(v: number): void {\n this.write({ radius: v });\n }\n setPosition(x: number, y: number): void {\n this.write({ positionX: x, positionY: y });\n }\n setActive(active: boolean): void {\n this.write({ active: active ? 1 : 0 });\n }\n\n getMode(): number {\n return this.readValue(\"mode\");\n }\n getStrength(): number {\n return this.readValue(\"strength\");\n }\n getRadius(): number {\n return this.readValue(\"radius\");\n }\n getPosition(): { x: number; y: number } {\n return {\n x: this.readValue(\"positionX\"),\n y: this.readValue(\"positionY\"),\n };\n }\n isActive(): boolean {\n return this.readValue(\"active\") === 1;\n }\n\n webgpu(): WebGPUDescriptor<InteractionInputs> {\n return {\n apply: ({ particleVar, getUniform }) => `{\n if (${getUniform(\"active\")} == 0.0 ) { return; }\n // Compute vector from particle to position\n let dx = ${getUniform(\"positionX\")} - ${particleVar}.position.x;\n let dy = ${getUniform(\"positionY\")} - ${particleVar}.position.y;\n let dist2 = dx*dx + dy*dy;\n let rad = ${getUniform(\"radius\")};\n let r2 = rad * rad;\n if (dist2 <= 0.0 || dist2 > r2) { return; }\n let dist = sqrt(dist2);\n let dir = vec2<f32>(dx, dy) / dist;\n let falloff = 1.0 - (dist / rad);\n let f = ${getUniform(\"strength\")} * falloff;\n let mode = ${getUniform(\"mode\")} ;\n let force = select(dir * f, -dir * f, mode == 1.0);\n ${particleVar}.acceleration += force;\n}`,\n };\n }\n\n cpu(): CPUDescriptor<InteractionInputs> {\n return {\n apply: ({ particle, input }) => {\n if (!input.active) return;\n\n // Compute vector from particle to position\n const dx = input.positionX - particle.position.x;\n const dy = input.positionY - particle.position.y;\n const dist2 = dx * dx + dy * dy;\n const rad = input.radius;\n const r2 = rad * rad;\n\n if (dist2 <= 0 || dist2 > r2) return;\n\n const dist = Math.sqrt(dist2);\n const dirX = dx / dist;\n const dirY = dy / dist;\n const falloff = 1.0 - dist / rad;\n const f = input.strength * falloff;\n const mode = input.mode;\n\n // mode 0 = attract, mode 1 = repel\n const forceX = mode === 1 ? -dirX * f : dirX * f;\n const forceY = mode === 1 ? -dirY * f : dirY * f;\n\n particle.acceleration.x += forceX;\n particle.acceleration.y += forceY;\n },\n };\n }\n}\n","import {\n Module,\n ModuleRole,\n type WebGPUDescriptor,\n CPUDescriptor,\n DataType,\n} from \"../../module\";\n\n// Default configuration values for joints module\nexport const DEFAULT_JOINTS_RESTITUTION = 0.9;\nexport const DEFAULT_JOINTS_SEPARATION = 0.5;\nexport const DEFAULT_JOINTS_STEPS = 1;\nexport const DEFAULT_JOINTS_FRICTION = 0.01;\nexport const DEFAULT_JOINTS_MOMENTUM = 0.7;\nexport const DEFAULT_JOINTS_ENABLE_PARTICLE_COLLISIONS = 0;\nexport const DEFAULT_JOINTS_ENABLE_JOINT_COLLISIONS = 0;\n\nexport interface Joint {\n aIndex: number;\n bIndex: number;\n restLength: number;\n}\n\ntype JointsInputs = {\n aIndexes: number[];\n bIndexes: number[];\n restLengths: number[];\n incidentJointOffsets: number[];\n incidentJointIndices: number[];\n enableParticleCollisions: number;\n enableJointCollisions: number;\n momentum: number;\n restitution: number; // particle-vs-joint restitution\n separation: number; // joint-joint positional separation strength per iteration\n steps: number; // substeps for CCD sweep\n friction: number; // 0=no friction, 1=high friction\n groupIds: number[]; // per-particle rigid body id\n};\n\nexport class Joints extends Module<\"joints\", JointsInputs> {\n readonly name = \"joints\" as const;\n readonly role = ModuleRole.Force;\n readonly inputs = {\n aIndexes: DataType.ARRAY,\n bIndexes: DataType.ARRAY,\n restLengths: DataType.ARRAY,\n incidentJointOffsets: DataType.ARRAY,\n incidentJointIndices: DataType.ARRAY,\n enableParticleCollisions: DataType.NUMBER,\n enableJointCollisions: DataType.NUMBER,\n momentum: DataType.NUMBER,\n restitution: DataType.NUMBER,\n separation: DataType.NUMBER,\n steps: DataType.NUMBER,\n friction: DataType.NUMBER,\n groupIds: DataType.ARRAY,\n } as const;\n\n constructor(opts?: {\n enabled?: boolean;\n joints?: Joint[];\n aIndexes?: number[];\n bIndexes?: number[];\n restLengths?: number[];\n enableParticleCollisions?: boolean;\n enableJointCollisions?: boolean;\n momentum?: number;\n restitution?: number;\n separation?: number;\n steps?: number;\n friction?: number;\n }) {\n super();\n\n // Handle joints array if provided, otherwise use separate arrays\n let aIndexes: number[], bIndexes: number[], restLengths: number[];\n if (opts?.joints) {\n aIndexes = opts.joints.map((j) => j.aIndex);\n bIndexes = opts.joints.map((j) => j.bIndex);\n restLengths = opts.joints.map((j) => j.restLength);\n } else {\n aIndexes = opts?.aIndexes ?? [];\n bIndexes = opts?.bIndexes ?? [];\n restLengths = opts?.restLengths ?? [];\n }\n\n this.write({\n aIndexes,\n bIndexes,\n restLengths,\n incidentJointOffsets: [],\n incidentJointIndices: [],\n enableParticleCollisions:\n opts?.enableParticleCollisions !== undefined\n ? opts.enableParticleCollisions\n ? 1\n : 0\n : DEFAULT_JOINTS_ENABLE_PARTICLE_COLLISIONS,\n enableJointCollisions:\n opts?.enableJointCollisions !== undefined\n ? opts.enableJointCollisions\n ? 1\n : 0\n : DEFAULT_JOINTS_ENABLE_JOINT_COLLISIONS,\n momentum: opts?.momentum ?? DEFAULT_JOINTS_MOMENTUM,\n restitution: opts?.restitution ?? DEFAULT_JOINTS_RESTITUTION,\n separation: opts?.separation ?? DEFAULT_JOINTS_SEPARATION,\n steps: opts?.steps ?? DEFAULT_JOINTS_STEPS,\n friction: opts?.friction ?? DEFAULT_JOINTS_FRICTION,\n groupIds: [],\n });\n // Build CSR/groupIds immediately so GPU path has valid incident lists on first frame\n if (aIndexes.length > 0 && bIndexes.length > 0) {\n this.setJoints(aIndexes, bIndexes, restLengths);\n } else {\n // Ensure empty CSR when no joints provided\n this.write({\n groupIds: [],\n incidentJointOffsets: [],\n incidentJointIndices: [],\n });\n }\n if (opts?.enabled !== undefined) this.setEnabled(!!opts.enabled);\n }\n\n getJoints(): Joint[] {\n const aIndexes = this.readArray(\"aIndexes\") as number[];\n const bIndexes = this.readArray(\"bIndexes\") as number[];\n const restLengths = this.readArray(\"restLengths\") as number[];\n\n const joints: Joint[] = [];\n const length = Math.min(\n aIndexes.length,\n bIndexes.length,\n restLengths.length\n );\n for (let i = 0; i < length; i++) {\n joints.push({\n aIndex: aIndexes[i],\n bIndex: bIndexes[i],\n restLength: restLengths[i],\n });\n }\n return joints;\n }\n\n setJoints(joints: Joint[]): void;\n setJoints(\n aIndexes: number[],\n bIndexes: number[],\n restLengths: number[]\n ): void;\n setJoints(\n jointsOrAIndexes: Joint[] | number[],\n bIndexes?: number[],\n restLengths?: number[]\n ): void {\n let aIndexes: number[], bIndexesArray: number[], restLengthsArray: number[];\n\n // Check if first argument is Joint[] or number[]\n if (bIndexes === undefined && restLengths === undefined) {\n // First overload: Joint[]\n const joints = jointsOrAIndexes as Joint[];\n aIndexes = joints.map((j) => j.aIndex);\n bIndexesArray = joints.map((j) => j.bIndex);\n restLengthsArray = joints.map((j) => j.restLength);\n } else {\n // Second overload: separate arrays\n aIndexes = jointsOrAIndexes as number[];\n bIndexesArray = bIndexes!;\n restLengthsArray = restLengths!;\n }\n\n // Always write joint arrays\n this.write({\n aIndexes,\n bIndexes: bIndexesArray,\n restLengths: restLengthsArray,\n });\n\n // Compute rigid body groupIds from joints (BFS over joint graph) and write them once here\n const n = Math.max(\n aIndexes.length ? Math.max(...aIndexes) + 1 : 0,\n bIndexesArray.length ? Math.max(...bIndexesArray) + 1 : 0\n );\n if (n > 0) {\n const adj: number[][] = Array.from({ length: n }, () => []);\n const deg = new Array<number>(n).fill(0);\n const validLen = Math.min(aIndexes.length, bIndexesArray.length);\n for (let i = 0; i < validLen; i++) {\n const u = aIndexes[i] >>> 0;\n const v = bIndexesArray[i] >>> 0;\n if (u >= n || v >= n) continue;\n adj[u].push(v);\n adj[v].push(u);\n deg[u]++;\n deg[v]++;\n }\n const groupIds = new Array<number>(n).fill(-1);\n let gid = 0;\n for (let i = 0; i < n; i++) {\n if (groupIds[i] !== -1) continue;\n if (deg[i] === 0) continue; // ignore isolated\n const queue: number[] = [i];\n groupIds[i] = gid;\n while (queue.length) {\n const u = queue.shift() as number;\n const nbrs = adj[u];\n for (let k = 0; k < nbrs.length; k++) {\n const v = nbrs[k];\n if (groupIds[v] === -1) {\n groupIds[v] = gid;\n queue.push(v);\n }\n }\n }\n gid++;\n }\n // Build CSR adjacency of incident joints per particle using degrees\n const offsets = new Array<number>(n + 1).fill(0);\n for (let i = 0; i < n; i++) offsets[i + 1] = offsets[i] + deg[i];\n const totalInc = offsets[n];\n const incidentJointIndices = new Array<number>(totalInc);\n const cursor = offsets.slice();\n for (let j = 0; j < validLen; j++) {\n const ua = aIndexes[j] >>> 0;\n const vb = bIndexesArray[j] >>> 0;\n if (ua < n) incidentJointIndices[cursor[ua]++] = j;\n if (vb < n) incidentJointIndices[cursor[vb]++] = j;\n }\n this.write({\n groupIds,\n incidentJointOffsets: offsets,\n incidentJointIndices,\n });\n } else {\n this.write({\n groupIds: [],\n incidentJointOffsets: [],\n incidentJointIndices: [],\n });\n }\n }\n\n getEnableParticleCollisions() {\n return this.readValue(\"enableParticleCollisions\");\n }\n\n setEnableParticleCollisions(val: number | boolean): void {\n const numeric = typeof val === \"number\" ? val : val ? 1 : 0;\n this.write({ enableParticleCollisions: numeric });\n }\n\n getEnableJointCollisions() {\n return this.readValue(\"enableJointCollisions\");\n }\n\n setEnableJointCollisions(val: number | boolean): void {\n const numeric = typeof val === \"number\" ? val : val ? 1 : 0;\n this.write({ enableJointCollisions: numeric });\n }\n\n // Legacy method for backward compatibility\n getEnableCollisions() {\n return this.readValue(\"enableParticleCollisions\");\n }\n\n setEnableCollisions(val: number | boolean): void {\n const numeric = typeof val === \"number\" ? val : val ? 1 : 0;\n this.write({\n enableParticleCollisions: numeric,\n enableJointCollisions: numeric,\n });\n }\n\n getMomentum() {\n return this.readValue(\"momentum\");\n }\n\n setMomentum(val: number): void {\n this.write({ momentum: Math.max(0, Math.min(1, val)) }); // Clamp between 0 and 1\n }\n\n getRestitution() {\n return this.readValue(\"restitution\");\n }\n\n setRestitution(val: number): void {\n this.write({ restitution: Math.max(0, Math.min(1, val)) });\n }\n\n getSeparation() {\n return this.readValue(\"separation\");\n }\n\n setSeparation(val: number): void {\n this.write({ separation: Math.max(0.01, Math.min(1, val)) });\n }\n\n getSteps() {\n return this.readValue(\"steps\");\n }\n\n setSteps(val: number): void {\n const steps = Math.max(1, Math.min(128, Math.floor(val)));\n this.write({ steps });\n }\n\n getFriction() {\n return this.readValue(\"friction\");\n }\n\n setFriction(val: number): void {\n this.write({ friction: Math.max(0, Math.min(1, val)) });\n }\n\n add(joint: Joint): void {\n const currentJoints = this.getJoints();\n\n // Normalize joint (ensure aIndex <= bIndex) and dedupe\n let { aIndex, bIndex, restLength } = joint;\n if (aIndex === bIndex) return; // Skip self-joints\n if (bIndex < aIndex) [aIndex, bIndex] = [bIndex, aIndex];\n\n // Check for duplicates\n for (const existing of currentJoints) {\n let { aIndex: existingA, bIndex: existingB } = existing;\n if (existingB < existingA)\n [existingA, existingB] = [existingB, existingA];\n if (existingA === aIndex && existingB === bIndex) return;\n }\n\n // Add the joint\n currentJoints.push({ aIndex, bIndex, restLength });\n this.setJoints(currentJoints);\n }\n\n remove(aIndex: number, bIndex: number): void {\n const currentJoints = this.getJoints();\n\n // Normalize indices for comparison\n let searchA = aIndex,\n searchB = bIndex;\n if (searchB < searchA) [searchA, searchB] = [searchB, searchA];\n\n // Find and remove the joint (works with flipped indices too)\n const filteredJoints = currentJoints.filter((joint) => {\n let { aIndex: jointA, bIndex: jointB } = joint;\n if (jointB < jointA) [jointA, jointB] = [jointB, jointA];\n return !(jointA === searchA && jointB === searchB);\n });\n\n this.setJoints(filteredJoints);\n }\n\n removeAll(): void {\n this.setJoints([]);\n }\n\n // groupIds are derived from joints; no external setters/getters\n\n webgpu(): WebGPUDescriptor<JointsInputs, \"prevX\" | \"prevY\"> {\n return {\n states: [\"prevX\", \"prevY\"] as const,\n\n // Store pre-physics positions for momentum preservation, only if this particle has an incident joint\n state: ({ particleVar, getLength, setState, getUniform }) => `{\n let offLen = ${getLength(\"incidentJointOffsets\")};\n if (offLen > 1u) {\n let idx1 = index + 1u;\n if (idx1 < offLen) {\n let s = u32(${getUniform(\"incidentJointOffsets\", \"index\")});\n let e = u32(${getUniform(\"incidentJointOffsets\", \"idx1\")});\n if (e > s) {\n ${setState(\"prevX\", `${particleVar}.position.x`)};\n ${setState(\"prevY\", `${particleVar}.position.y`)};\n }\n }\n }\n}`,\n\n // Constrain: per-particle correction using CSR only\n constrain: ({ particleVar, getUniform, getLength }) => `{\n let lenA = ${getLength(\"aIndexes\")};\n let lenB = ${getLength(\"bIndexes\")};\n let lenR = ${getLength(\"restLengths\")};\n let jointCount = min(lenA, min(lenB, lenR));\n if (jointCount == 0u) { return; }\n let offsetsLen = ${getLength(\"incidentJointOffsets\")};\n let idx1 = index + 1u;\n \n if (offsetsLen <= 1u || idx1 >= offsetsLen) { return; }\n let start = u32(${getUniform(\"incidentJointOffsets\", \"index\")});\n let end = u32(${getUniform(\"incidentJointOffsets\", \"idx1\")});\n if (end <= start) { return; }\n let half: f32 = 0.5;\n let forwardFirst = (index & 1u) == 0u;\n if (forwardFirst) {\n for (var k = start; k < end; k++) {\n let j = u32(${getUniform(\"incidentJointIndices\", \"k\")});\n if (j >= jointCount) { continue; }\n let a = u32(${getUniform(\"aIndexes\", \"j\")});\n let b = u32(${getUniform(\"bIndexes\", \"j\")});\n let rest = ${getUniform(\"restLengths\", \"j\")};\n if (rest <= 0.0) { continue; }\n var otherIndex: u32 = 0xffffffffu;\n if (a == index) { otherIndex = b; } else if (b == index) { otherIndex = a; }\n if (otherIndex == 0xffffffffu) { continue; }\n var other = particles[otherIndex];\n if (${particleVar}.mass == 0.0 || other.mass == 0.0) { continue; }\n let delta = other.position - ${particleVar}.position;\n let dist2 = dot(delta, delta);\n if (dist2 < 1e-8) { continue; }\n let invDist = inverseSqrt(dist2);\n let dist = 1.0 / max(invDist, 1e-8);\n let dir = delta * invDist;\n let rl = select(dist, rest, rest > 0.0);\n let diff = dist - rl;\n if (abs(diff) < 1e-6) { continue; }\n let invM_self = select(0.0, 1.0 / ${particleVar}.mass, ${particleVar}.mass > 0.0);\n let invM_other = select(0.0, 1.0 / other.mass, other.mass > 0.0);\n let invSum = invM_self + invM_other;\n if (invSum <= 0.0) { continue; }\n let corr = dir * (diff * (invM_self / invSum)) * half;\n ${particleVar}.position = ${particleVar}.position + corr;\n }\n for (var k2 = end; k2 > start; k2--) {\n let k = k2 - 1u;\n let j = u32(${getUniform(\"incidentJointIndices\", \"k\")});\n if (j >= jointCount) { continue; }\n let a = u32(${getUniform(\"aIndexes\", \"j\")});\n let b = u32(${getUniform(\"bIndexes\", \"j\")});\n let rest = ${getUniform(\"restLengths\", \"j\")};\n if (rest <= 0.0) { continue; }\n var otherIndex: u32 = 0xffffffffu;\n if (a == index) { otherIndex = b; } else if (b == index) { otherIndex = a; }\n if (otherIndex == 0xffffffffu) { continue; }\n var other = particles[otherIndex];\n if (${particleVar}.mass == 0.0 || other.mass == 0.0) { continue; }\n let delta = other.position - ${particleVar}.position;\n let dist2 = dot(delta, delta);\n if (dist2 < 1e-8) { continue; }\n let invDist = inverseSqrt(dist2);\n let dist = 1.0 / max(invDist, 1e-8);\n let dir = delta * invDist;\n let rl = select(dist, rest, rest > 0.0);\n let diff = dist - rl;\n if (abs(diff) < 1e-6) { continue; }\n let invM_self = select(0.0, 1.0 / ${particleVar}.mass, ${particleVar}.mass > 0.0);\n let invM_other = select(0.0, 1.0 / other.mass, other.mass > 0.0);\n let invSum = invM_self + invM_other;\n if (invSum <= 0.0) { continue; }\n let corr = dir * (diff * (invM_self / invSum)) * half;\n ${particleVar}.position = ${particleVar}.position + corr;\n }\n } else {\n for (var k2 = end; k2 > start; k2--) {\n let k = k2 - 1u;\n let j = u32(${getUniform(\"incidentJointIndices\", \"k\")});\n if (j >= jointCount) { continue; }\n let a = u32(${getUniform(\"aIndexes\", \"j\")});\n let b = u32(${getUniform(\"bIndexes\", \"j\")});\n let rest = ${getUniform(\"restLengths\", \"j\")};\n if (rest <= 0.0) { continue; }\n var otherIndex: u32 = 0xffffffffu;\n if (a == index) { otherIndex = b; } else if (b == index) { otherIndex = a; }\n if (otherIndex == 0xffffffffu) { continue; }\n var other = particles[otherIndex];\n if (${particleVar}.mass == 0.0 || other.mass == 0.0) { continue; }\n let delta = other.position - ${particleVar}.position;\n let dist2 = dot(delta, delta);\n if (dist2 < 1e-8) { continue; }\n let invDist = inverseSqrt(dist2);\n let dist = 1.0 / max(invDist, 1e-8);\n let dir = delta * invDist;\n let rl = select(dist, rest, rest > 0.0);\n let diff = dist - rl;\n if (abs(diff) < 1e-6) { continue; }\n let invM_self = select(0.0, 1.0 / ${particleVar}.mass, ${particleVar}.mass > 0.0);\n let invM_other = select(0.0, 1.0 / other.mass, other.mass > 0.0);\n let invSum = invM_self + invM_other;\n if (invSum <= 0.0) { continue; }\n let corr = dir * (diff * (invM_self / invSum)) * half;\n ${particleVar}.position = ${particleVar}.position + corr;\n }\n for (var k = start; k < end; k++) {\n let j = u32(${getUniform(\"incidentJointIndices\", \"k\")});\n if (j >= jointCount) { continue; }\n let a = u32(${getUniform(\"aIndexes\", \"j\")});\n let b = u32(${getUniform(\"bIndexes\", \"j\")});\n let rest = ${getUniform(\"restLengths\", \"j\")};\n if (rest <= 0.0) { continue; }\n var otherIndex: u32 = 0xffffffffu;\n if (a == index) { otherIndex = b; } else if (b == index) { otherIndex = a; }\n if (otherIndex == 0xffffffffu) { continue; }\n var other = particles[otherIndex];\n if (${particleVar}.mass == 0.0 || other.mass == 0.0) { continue; }\n let delta = other.position - ${particleVar}.position;\n let dist2 = dot(delta, delta);\n if (dist2 < 1e-8) { continue; }\n let invDist = inverseSqrt(dist2);\n let dist = 1.0 / max(invDist, 1e-8);\n let dir = delta * invDist;\n let rl = select(dist, rest, rest > 0.0);\n let diff = dist - rl;\n if (abs(diff) < 1e-6) { continue; }\n let invM_self = select(0.0, 1.0 / ${particleVar}.mass, ${particleVar}.mass > 0.0);\n let invM_other = select(0.0, 1.0 / other.mass, other.mass > 0.0);\n let invSum = invM_self + invM_other;\n if (invSum <= 0.0) { continue; }\n let corr = dir * (diff * (invM_self / invSum)) * half;\n ${particleVar}.position = ${particleVar}.position + corr;\n }\n }\n\n // Optional collision handling with joints (particle vs joint, joint vs joint)\n // Only for particles that are part of at least one joint\n var hasJoint = false;\n let offLenColl = ${getLength(\"incidentJointOffsets\")};\n if (offLenColl > 1u) {\n let idx1h = index + 1u;\n if (idx1h < offLenColl) {\n let s = u32(${getUniform(\"incidentJointOffsets\", \"index\")});\n let e = u32(${getUniform(\"incidentJointOffsets\", \"idx1h\")});\n hasJoint = (e > s);\n }\n }\n // jointCount already defined above\n if (${getUniform(\n \"enableParticleCollisions\"\n )} > 0.0 && ${particleVar}.mass > 0.0 && hasJoint) {\n // Particle vs Joint: find deepest overlap with any segment not incident to this particle\n var bestOverlap: f32 = 0.0;\n var bestNormal: vec2<f32> = vec2<f32>(0.0, 0.0);\n for (var j2 = 0u; j2 < jointCount; j2++) {\n let a2 = u32(${getUniform(\"aIndexes\", \"j2\")});\n let b2 = u32(${getUniform(\"bIndexes\", \"j2\")});\n if (a2 == index || b2 == index) { continue; }\n var A = particles[a2];\n var B = particles[b2];\n // Guard\n if (A.mass == 0.0 || B.mass == 0.0) { continue; }\n // Broadphase AABB reject using particle radius\n let r = ${particleVar}.size;\n let minx = min(A.position.x, B.position.x) - r;\n let maxx = max(A.position.x, B.position.x) + r;\n let miny = min(A.position.y, B.position.y) - r;\n let maxy = max(A.position.y, B.position.y) + r;\n let px = ${particleVar}.position.x;\n let py = ${particleVar}.position.y;\n if (px < minx || px > maxx || py < miny || py > maxy) { continue; }\n let AB = B.position - A.position;\n let AB2 = dot(AB, AB);\n if (AB2 < 1e-8) { continue; }\n let AP = ${particleVar}.position - A.position;\n let t = clamp(dot(AP, AB) / AB2, 0.0, 1.0);\n let closest = A.position + AB * t;\n let pc = ${particleVar}.position - closest;\n let d2 = dot(pc, pc);\n if (d2 < r * r && d2 > 1e-8) {\n let d = sqrt(d2);\n let overlap = r - d;\n if (overlap > bestOverlap) {\n bestOverlap = overlap;\n bestNormal = pc / d;\n }\n }\n }\n if (bestOverlap > 0.0) {\n // Position correction (move current particle only)\n let push = min(bestOverlap * 0.6, ${particleVar}.size);\n ${particleVar}.position = ${particleVar}.position + bestNormal * push;\n // Low-restitution impulse to reduce interpenetration\n var v = ${particleVar}.velocity;\n let n = bestNormal;\n let relN = dot(v, n);\n let vt = v - n * relN; // tangential component\n if (relN < 0.0) {\n let e = ${getUniform(\"restitution\")};\n let mu = clamp(${getUniform(\"friction\")}, 0.0, 1.0);\n let vReflected = v - n * (relN * (1.0 + e));\n let vtScaled = vt * (1.0 - mu);\n ${particleVar}.velocity = vReflected + (vtScaled - vt);\n }\n }\n\n // Joint vs Joint: for joints incident to this particle, nudge to resolve crossings\n if (${getUniform(\"enableJointCollisions\")} > 0.0) {\n for (var j3 = 0u; j3 < jointCount; j3++) {\n let a3 = u32(${getUniform(\"aIndexes\", \"j3\")});\n let b3 = u32(${getUniform(\"bIndexes\", \"j3\")});\n var isIncident = (a3 == index) || (b3 == index);\n if (!isIncident) { continue; }\n var A1 = particles[a3];\n var B1 = particles[b3];\n let x1 = A1.position.x; let y1 = A1.position.y;\n let x2 = B1.position.x; let y2 = B1.position.y;\n for (var k = 0u; k < jointCount; k++) {\n if (k == j3) { continue; }\n let a4 = u32(${getUniform(\"aIndexes\", \"k\")});\n let b4 = u32(${getUniform(\"bIndexes\", \"k\")});\n // Skip if shares endpoints\n if (a4 == a3 || a4 == b3 || b4 == a3 || b4 == b3) { continue; }\n // Skip same rigid body using precomputed groupIds\n let gidA = i32(${getUniform(\"groupIds\", \"a3\")});\n let gidB = i32(${getUniform(\"groupIds\", \"b3\")});\n let gidC = i32(${getUniform(\"groupIds\", \"a4\")});\n let gidD = i32(${getUniform(\"groupIds\", \"b4\")});\n if ((gidA >= 0 && gidC >= 0 && gidA == gidC) || (gidA >= 0 && gidD >= 0 && gidA == gidD) ||\n (gidB >= 0 && gidC >= 0 && gidB == gidC) || (gidB >= 0 && gidD >= 0 && gidB == gidD)) {\n continue;\n }\n var A2 = particles[a4];\n var B2 = particles[b4];\n let x3 = A2.position.x; let y3 = A2.position.y;\n let x4 = B2.position.x; let y4 = B2.position.y;\n // Broadphase AABB overlap test for segments (no thickness)\n let min1x = min(x1, x2); let max1x = max(x1, x2);\n let min1y = min(y1, y2); let max1y = max(y1, y2);\n let min2x = min(x3, x4); let max2x = max(x3, x4);\n let min2y = min(y3, y4); let max2y = max(y3, y4);\n if (max1x < min2x || max2x < min1x || max1y < min2y || max2y < min1y) { continue; }\n let dx1 = x2 - x1; let dy1 = y2 - y1;\n let dx2 = x4 - x3; let dy2 = y4 - y3;\n let denom = dx1 * dy2 - dy1 * dx2;\n if (abs(denom) < 1e-6) { continue; }\n let t = ((x3 - x1) * dy2 - (y3 - y1) * dx2) / denom;\n let u = ((x3 - x1) * dy1 - (y3 - y1) * dx1) / denom;\n if (t >= 0.0 && t <= 1.0 && u >= 0.0 && u <= 1.0) {\n // Intersection detected: nudge current particle away along midpoint normal\n let m1 = vec2<f32>((x1 + x2) * 0.5, (y1 + y2) * 0.5);\n let m2 = vec2<f32>((x3 + x4) * 0.5, (y3 + y4) * 0.5);\n var n = m1 - m2;\n let n2 = dot(n, n);\n if (n2 < 1e-6) {\n // random tiny direction based on index\n let ang = fract(sin(f32(index) * 12.9898) * 43758.5453) * 6.283185307;\n n = vec2<f32>(cos(ang), sin(ang));\n } else {\n n = normalize(n);\n }\n let sep = ${getUniform(\"separation\")};\n ${particleVar}.position = ${particleVar}.position + n * sep;\n // Only one nudge per incident joint per iteration\n break;\n }\n }\n }\n }\n }\n}`,\n\n // CCD against joints with substeps, then apply momentum preservation after constraint solving\n correct: ({ particleVar, getUniform, getLength, getState, dtVar }) => `{\n let jointCount = ${getLength(\"aIndexes\")};\n if (jointCount == 0u) { return; }\n \n // Determine if this particle has joints via CSR (used for CCD and momentum)\n var hasJoint = false;\n let offLen2 = ${getLength(\"incidentJointOffsets\")};\n if (offLen2 > 1u) {\n let idx1c = index + 1u;\n if (idx1c < offLen2) {\n let s2 = u32(${getUniform(\"incidentJointOffsets\", \"index\")});\n let e2 = u32(${getUniform(\"incidentJointOffsets\", \"idx1c\")});\n hasJoint = (e2 > s2);\n }\n }\n if (${getUniform(\"enableParticleCollisions\")} > 0.0) {\n // Substep CCD: sweep particle (as a circle of radius r) from previous to current position\n let prevX = ${getState(\"prevX\")};\n let prevY = ${getState(\"prevY\")};\n let p0 = vec2<f32>(prevX, prevY);\n let p1 = ${particleVar}.position;\n let r = ${particleVar}.size;\n // Choose steps from uniform; engine iterates constraints many times\n let steps: u32 = max(1u, u32(${getUniform(\"steps\")}));\n for (var sstep = 1u; sstep <= steps; sstep++) {\n let t = f32(sstep) / f32(steps);\n let ps = mix(p0, p1, t);\n var collided = false;\n var n: vec2<f32> = vec2<f32>(0.0, 0.0);\n for (var j = 0u; j < jointCount; j++) {\n let a = u32(${getUniform(\"aIndexes\", \"j\")});\n let b = u32(${getUniform(\"bIndexes\", \"j\")});\n if (a == index || b == index) { continue; }\n // Skip if same rigid body by two-hop connectivity with current incident joint endpoints\n // We approximate by checking connections to current particle's incident joint endpoints (handled above per j0)\n var A = particles[a];\n var B = particles[b];\n let ab = B.position - A.position;\n let ab2 = dot(ab, ab);\n if (ab2 < 1e-8) { continue; }\n let ap = ps - A.position;\n let u = clamp(dot(ap, ab) / ab2, 0.0, 1.0);\n let closest = A.position + ab * u;\n let pc = ps - closest;\n let d2 = dot(pc, pc);\n if (d2 < r * r && d2 > 1e-10) {\n let d = sqrt(d2);\n n = pc / d;\n collided = true;\n // Re-position to contact, slightly outside to avoid re-penetration\n ${particleVar}.position = closest + n * (r + 0.001);\n // Reflect velocity along normal with restitution and apply tangential friction\n var v = ${particleVar}.velocity;\n let relN = dot(v, n);\n if (relN < 0.0) {\n let e = ${getUniform(\"restitution\")};\n let mu = clamp(${getUniform(\"friction\")}, 0.0, 1.0);\n let vt = v - n * relN;\n let vReflected = v - n * (relN * (1.0 + e));\n let vtScaled = vt * (1.0 - mu);\n ${particleVar}.velocity = vReflected + (vtScaled - vt);\n }\n break;\n }\n }\n if (collided) { break; }\n }\n }\n\n // Joint-segment CCD for joints incident to this particle against other joints\n if (${getUniform(\"enableJointCollisions\")} > 0.0 && hasJoint) {\n let stepsJS: u32 = max(1u, u32(${getUniform(\"steps\")}));\n for (var j0 = 0u; j0 < jointCount; j0++) {\n let a0 = u32(${getUniform(\"aIndexes\", \"j0\")});\n let b0 = u32(${getUniform(\"bIndexes\", \"j0\")});\n var incident = (a0 == index) || (b0 == index);\n if (!incident) { continue; }\n var otherIdx: u32 = a0;\n if (a0 == index) { otherIdx = b0; } else { otherIdx = a0; }\n // Previous positions of both endpoints\n let prevAx = ${getState(\"prevX\")};\n let prevAy = ${getState(\"prevY\")};\n let prevBx = ${getState(\"prevX\", \"otherIdx\")};\n let prevBy = ${getState(\"prevY\", \"otherIdx\")};\n\n for (var sstep2 = 1u; sstep2 <= stepsJS; sstep2++) {\n let t2 = f32(sstep2) / f32(stepsJS);\n let Apos = mix(vec2<f32>(prevAx, prevAy), ${particleVar}.position, t2);\n let Bpos = mix(vec2<f32>(prevBx, prevBy), particles[otherIdx].position, t2);\n // Test against all other joints\n var separated = false;\n for (var k0 = 0u; k0 < jointCount; k0++) {\n if (k0 == j0) { continue; }\n let cIdx = u32(${getUniform(\"aIndexes\", \"k0\")});\n let dIdx = u32(${getUniform(\"bIndexes\", \"k0\")});\n if (cIdx == a0 || cIdx == b0 || dIdx == a0 || dIdx == b0) { continue; }\n // Skip same rigid body using precomputed groupIds\n let gidA0 = i32(${getUniform(\"groupIds\", \"a0\")});\n let gidB0 = i32(${getUniform(\"groupIds\", \"b0\")});\n let gidC0 = i32(${getUniform(\"groupIds\", \"cIdx\")});\n let gidD0 = i32(${getUniform(\"groupIds\", \"dIdx\")});\n if ((gidA0 >= 0 && gidC0 >= 0 && gidA0 == gidC0) || (gidA0 >= 0 && gidD0 >= 0 && gidA0 == gidD0) ||\n (gidB0 >= 0 && gidC0 >= 0 && gidB0 == gidC0) || (gidB0 >= 0 && gidD0 >= 0 && gidB0 == gidD0)) {\n continue;\n }\n let Cpos = particles[cIdx].position;\n let Dpos = particles[dIdx].position;\n // Segment intersect test between Apos->Bpos and Cpos->Dpos\n let r = Bpos - Apos;\n let s = Dpos - Cpos;\n let rxs = r.x * s.y - r.y * s.x;\n if (abs(rxs) < 1e-6) { continue; }\n let q_p = Cpos - Apos;\n let tA = (q_p.x * s.y - q_p.y * s.x) / rxs;\n let uA = (q_p.x * r.y - q_p.y * r.x) / rxs;\n if (tA >= 0.0 && tA <= 1.0 && uA >= 0.0 && uA <= 1.0) {\n // Found crossing; push current particle endpoint out along midpoint normal\n let mAB = (Apos + Bpos) * 0.5;\n let mCD = (Cpos + Dpos) * 0.5;\n let diff = mAB - mCD;\n let len2 = dot(diff, diff);\n var n = vec2<f32>(0.0, 1.0);\n if (len2 > 1e-6) {\n n = diff / sqrt(len2);\n }\n let sep = ${getUniform(\"separation\")};\n ${particleVar}.position = ${particleVar}.position + n * sep;\n separated = true;\n break;\n }\n }\n if (separated) { break; }\n }\n }\n }\n\n let momentum = ${getUniform(\"momentum\")};\n if (momentum <= 0.0 || !hasJoint) { return; }\n \n // Get stored pre-physics position\n let prevX2 = ${getState(\"prevX\")};\n let prevY2 = ${getState(\"prevY\")};\n let prevPos = vec2<f32>(prevX2, prevY2);\n \n // Calculate actual total movement (from pre-physics to post-constraint)\n let totalMovement = ${particleVar}.position - prevPos;\n let actualVelocity = totalMovement / ${dtVar};\n \n // Blend current velocity with actual movement velocity\n ${particleVar}.velocity = ${particleVar}.velocity * (1.0 - momentum) + actualVelocity * momentum;\n}`,\n };\n }\n\n cpu(): CPUDescriptor<JointsInputs, \"prevX\" | \"prevY\"> {\n return {\n states: [\"prevX\", \"prevY\"] as const,\n\n // Store pre-physics positions for momentum preservation (only for particles with incident joints via CSR)\n state: ({ particle, setState, input, index }) => {\n const offsets = (input.incidentJointOffsets as number[]) || [];\n if (index + 1 < offsets.length && offsets[index] < offsets[index + 1]) {\n setState(\"prevX\", particle.position.x);\n setState(\"prevY\", particle.position.y);\n }\n },\n\n // Force part: per-particle two-pass correction (forward + reverse) to reduce order bias\n constrain: ({ particle, index, particles, input }) => {\n if (particle.mass === 0) return;\n const a = input.aIndexes;\n const b = input.bIndexes;\n const rest = input.restLengths;\n const offsets = (input.incidentJointOffsets as number[]) || [];\n const inc = (input.incidentJointIndices as number[]) || [];\n const start = index + 1 < offsets.length ? offsets[index] >>> 0 : 0;\n const end = index + 1 < offsets.length ? offsets[index + 1] >>> 0 : 0;\n const count = Math.min(a.length, b.length, rest.length);\n const half = 0.5;\n const forwardFirst = (index & 1) === 0;\n\n const applyForInc = (k: number) => {\n const j = inc[k] >>> 0;\n const ia = a[j] >>> 0;\n const ib = b[j] >>> 0;\n const otherIndex = ia === index ? ib : ia;\n const other = particles[otherIndex];\n if (!other) return;\n if (other.mass === 0 || particle.mass === 0) return; // immovable or removed\n const dx = other.position.x - particle.position.x;\n const dy = other.position.y - particle.position.y;\n const dist2 = dx * dx + dy * dy;\n if (dist2 < 1e-8) return;\n const dist = Math.sqrt(dist2);\n const rl = rest[j] ?? dist;\n const diff = dist - rl;\n if (Math.abs(diff) < 1e-6) return;\n const invM_self = particle.mass > 0 ? 1 / particle.mass : 0;\n const invM_other = other.mass > 0 ? 1 / other.mass : 0;\n const invSum = invM_self + invM_other;\n if (invSum <= 0) return; // both pinned\n const nx = dx / dist;\n const ny = dy / dist;\n const corrMag = diff * (invM_self / invSum) * half;\n particle.position.x += nx * corrMag;\n particle.position.y += ny * corrMag;\n };\n\n if (forwardFirst) {\n for (let k = start; k < end; k++) applyForInc(k);\n for (let k = end - 1; k >= start; k--) applyForInc(k);\n } else {\n for (let k = end - 1; k >= start; k--) applyForInc(k);\n for (let k = start; k < end; k++) applyForInc(k);\n }\n\n // Optional collision handling\n const enableParticleCollisions = input.enableParticleCollisions;\n const enableJointCollisions = input.enableJointCollisions;\n if (enableParticleCollisions > 0 && particle.mass > 0) {\n // Particle vs Joint: deepest overlap\n let bestOverlap = 0;\n let bestNx = 0;\n let bestNy = 0;\n for (let j2 = 0; j2 < count; j2++) {\n const ia2 = a[j2] >>> 0;\n const ib2 = b[j2] >>> 0;\n if (ia2 === index || ib2 === index) continue;\n const A = particles[ia2];\n const B = particles[ib2];\n if (!A || !B) continue;\n if (A.mass === 0 || B.mass === 0) continue;\n const ABx = B.position.x - A.position.x;\n const ABy = B.position.y - A.position.y;\n const AB2 = ABx * ABx + ABy * ABy;\n if (AB2 < 1e-8) continue;\n // Broadphase AABB reject using particle radius\n const radiusP = particle.size;\n const minx = Math.min(A.position.x, B.position.x) - radiusP;\n const maxx = Math.max(A.position.x, B.position.x) + radiusP;\n const miny = Math.min(A.position.y, B.position.y) - radiusP;\n const maxy = Math.max(A.position.y, B.position.y) + radiusP;\n const px = particle.position.x;\n const py = particle.position.y;\n if (px < minx || px > maxx || py < miny || py > maxy) continue;\n const APx = particle.position.x - A.position.x;\n const APy = particle.position.y - A.position.y;\n let t = (APx * ABx + APy * ABy) / AB2;\n t = Math.max(0, Math.min(1, t));\n const cx = A.position.x + ABx * t;\n const cy = A.position.y + ABy * t;\n const pcx = particle.position.x - cx;\n const pcy = particle.position.y - cy;\n const d2 = pcx * pcx + pcy * pcy;\n const r = particle.size;\n if (d2 < r * r && d2 > 1e-8) {\n const d = Math.sqrt(d2);\n const overlap = r - d;\n if (overlap > bestOverlap) {\n bestOverlap = overlap;\n bestNx = pcx / d;\n bestNy = pcy / d;\n }\n }\n }\n if (bestOverlap > 0) {\n const push = Math.min(bestOverlap * 0.6, particle.size);\n particle.position.x += bestNx * push;\n particle.position.y += bestNy * push;\n const vx = particle.velocity.x;\n const vy = particle.velocity.y;\n const relN = vx * bestNx + vy * bestNy;\n const tx = vx - bestNx * relN;\n const ty = vy - bestNy * relN;\n if (relN < 0) {\n const e = input.restitution as number;\n const mu = Math.max(0, Math.min(1, input.friction as number));\n const vRx = vx - bestNx * (relN * (1 + e));\n const vRy = vy - bestNy * (relN * (1 + e));\n const vtScaledX = tx * (1 - mu);\n const vtScaledY = ty * (1 - mu);\n particle.velocity.x = vRx + (vtScaledX - tx);\n particle.velocity.y = vRy + (vtScaledY - ty);\n }\n }\n\n // Joint vs Joint: for joints incident to this particle, nudge on intersection\n if (enableJointCollisions > 0) {\n for (let j3 = 0; j3 < count; j3++) {\n const ia3 = a[j3] >>> 0;\n const ib3 = b[j3] >>> 0;\n const isIncident = ia3 === index || ib3 === index;\n if (!isIncident) continue;\n const A1 = particles[ia3];\n const B1 = particles[ib3];\n if (!A1 || !B1) continue;\n const x1 = A1.position.x,\n y1 = A1.position.y;\n const x2 = B1.position.x,\n y2 = B1.position.y;\n for (let k = 0; k < count; k++) {\n if (k === j3) continue;\n const ia4 = a[k] >>> 0;\n const ib4 = b[k] >>> 0;\n if (ia4 === ia3 || ia4 === ib3 || ib4 === ia3 || ib4 === ib3)\n continue;\n // Skip same rigid body using groupIds\n const gidA = (input.groupIds as number[])[ia3] ?? -1;\n const gidB = (input.groupIds as number[])[ib3] ?? -1;\n const gidC = (input.groupIds as number[])[ia4] ?? -1;\n const gidD = (input.groupIds as number[])[ib4] ?? -1;\n if (\n (gidA >= 0 && gidC >= 0 && gidA === gidC) ||\n (gidA >= 0 && gidD >= 0 && gidA === gidD) ||\n (gidB >= 0 && gidC >= 0 && gidB === gidC) ||\n (gidB >= 0 && gidD >= 0 && gidB === gidD)\n ) {\n continue;\n }\n const A2 = particles[ia4];\n const B2 = particles[ib4];\n if (!A2 || !B2) continue;\n const x3 = A2.position.x,\n y3 = A2.position.y;\n const x4 = B2.position.x,\n y4 = B2.position.y;\n const dx1 = x2 - x1,\n dy1 = y2 - y1;\n const dx2 = x4 - x3,\n dy2 = y4 - y3;\n const denom = dx1 * dy2 - dy1 * dx2;\n if (Math.abs(denom) < 1e-6) continue;\n const t = ((x3 - x1) * dy2 - (y3 - y1) * dx2) / denom;\n const u = ((x3 - x1) * dy1 - (y3 - y1) * dx1) / denom;\n if (t >= 0 && t <= 1 && u >= 0 && u <= 1) {\n const m1x = (x1 + x2) * 0.5,\n m1y = (y1 + y2) * 0.5;\n const m2x = (x3 + x4) * 0.5,\n m2y = (y3 + y4) * 0.5;\n let nx = m1x - m2x;\n let ny = m1y - m2y;\n const n2 = nx * nx + ny * ny;\n if (n2 < 1e-6) {\n const ang =\n (Math.sin(index * 12.9898) -\n Math.floor(Math.sin(index * 12.9898))) *\n Math.PI *\n 2;\n nx = Math.cos(ang);\n ny = Math.sin(ang);\n } else {\n const nlen = Math.sqrt(n2);\n nx /= nlen;\n ny /= nlen;\n }\n const sep = (input.separation as number) ?? 0.12;\n particle.position.x += nx * sep;\n particle.position.y += ny * sep;\n // no velocity impulse; rely on positional nudge and engine iterations\n break;\n }\n }\n }\n }\n }\n },\n\n // CCD against joints with substeps, then apply momentum preservation after constraint solving\n correct: ({\n particle,\n getState,\n dt,\n prevPos,\n particles,\n input,\n index,\n }) => {\n if (dt <= 0) return;\n // Determine CSR-based incident joints once for this particle\n const offsets = (input.incidentJointOffsets as number[]) || [];\n const hasJoints =\n index + 1 < offsets.length && offsets[index] < offsets[index + 1];\n // Substep CCD on CPU path\n const enableParticleCollisions =\n input.enableParticleCollisions as number;\n if (enableParticleCollisions > 0 && hasJoints) {\n const a = input.aIndexes;\n const b = input.bIndexes;\n const count = Math.min(a.length, b.length);\n const p0x = prevPos.x,\n p0y = prevPos.y;\n const p1x = particle.position.x,\n p1y = particle.position.y;\n const r = particle.size;\n const steps = Math.max(\n 1,\n Math.min(128, Math.floor((input.steps as number) || 1))\n );\n outer: for (let s = 1; s <= steps; s++) {\n const t = s / steps;\n const psx = p0x + (p1x - p0x) * t;\n const psy = p0y + (p1y - p0y) * t;\n for (let j = 0; j < count; j++) {\n const ia = a[j] >>> 0;\n const ib = b[j] >>> 0;\n if (ia === index || ib === index) continue;\n const A = particles[ia];\n const B = particles[ib];\n if (!A || !B) continue;\n const abx = B.position.x - A.position.x;\n const aby = B.position.y - A.position.y;\n const ab2 = abx * abx + aby * aby;\n if (ab2 < 1e-8) continue;\n // (Optional) Light AABB reject around segment using particle's swept AABB\n const sweepMinX = Math.min(p0x, p1x) - r;\n const sweepMaxX = Math.max(p0x, p1x) + r;\n const sweepMinY = Math.min(p0y, p1y) - r;\n const sweepMaxY = Math.max(p0y, p1y) + r;\n const segMinX = Math.min(A.position.x, B.position.x);\n const segMaxX = Math.max(A.position.x, B.position.x);\n const segMinY = Math.min(A.position.y, B.position.y);\n const segMaxY = Math.max(A.position.y, B.position.y);\n if (\n segMaxX < sweepMinX ||\n sweepMaxX < segMinX ||\n segMaxY < sweepMinY ||\n sweepMaxY < segMinY\n )\n continue;\n const apx = psx - A.position.x;\n const apy = psy - A.position.y;\n let u = (apx * abx + apy * aby) / ab2;\n if (u < 0) u = 0;\n else if (u > 1) u = 1;\n const cx = A.position.x + abx * u;\n const cy = A.position.y + aby * u;\n const pcx = psx - cx;\n const pcy = psy - cy;\n const d2 = pcx * pcx + pcy * pcy;\n if (d2 < r * r && d2 > 1e-10) {\n const d = Math.sqrt(d2);\n const nx = pcx / d;\n const ny = pcy / d;\n particle.position.x = cx + nx * (r + 0.001);\n particle.position.y = cy + ny * (r + 0.001);\n const vx = particle.velocity.x;\n const vy = particle.velocity.y;\n const relN = vx * nx + vy * ny;\n const tx = vx - nx * relN;\n const ty = vy - ny * relN;\n if (relN < 0) {\n const e = input.restitution as number;\n const mu = Math.max(0, Math.min(1, input.friction as number));\n const vRx = vx - nx * (relN * (1 + e));\n const vRy = vy - ny * (relN * (1 + e));\n const vtScaledX = tx * (1 - mu);\n const vtScaledY = ty * (1 - mu);\n particle.velocity.x = vRx + (vtScaledX - tx);\n particle.velocity.y = vRy + (vtScaledY - ty);\n }\n break outer;\n }\n }\n }\n }\n\n // Joint-segment CCD for joints incident to this particle against other joints (CPU)\n const enableJointCollisions = input.enableJointCollisions as number;\n if (enableJointCollisions > 0 && hasJoints) {\n const steps = Math.max(\n 1,\n Math.min(128, Math.floor((input.steps as number) || 1))\n );\n const a2 = input.aIndexes;\n const b2 = input.bIndexes;\n const count2 = Math.min(a2.length, b2.length);\n for (let j0 = 0; j0 < count2; j0++) {\n const a0 = a2[j0] >>> 0;\n const b0 = b2[j0] >>> 0;\n const incident = a0 === index || b0 === index;\n if (!incident) continue;\n const otherIdx = a0 === index ? b0 : a0;\n\n const prevAx = getState(\"prevX\");\n const prevAy = getState(\"prevY\");\n const otherPid = particles[otherIdx]?.id;\n const prevBx = getState(\"prevX\", otherPid);\n const prevBy = getState(\"prevY\", otherPid);\n\n outer2: for (let s = 1; s <= steps; s++) {\n const t = s / steps;\n const Aposx = prevAx + (particle.position.x - prevAx) * t;\n const Aposy = prevAy + (particle.position.y - prevAy) * t;\n const Bcur = particles[otherIdx];\n if (!Bcur) break;\n const Bposx = prevBx + (Bcur.position.x - prevBx) * t;\n const Bposy = prevBy + (Bcur.position.y - prevBy) * t;\n\n for (let k0 = 0; k0 < count2; k0++) {\n if (k0 === j0) continue;\n const cIdx = a2[k0] >>> 0;\n const dIdx = b2[k0] >>> 0;\n if (cIdx === a0 || cIdx === b0 || dIdx === a0 || dIdx === b0)\n continue;\n // Skip same rigid body using precomputed groupIds\n const gidA0 = (input.groupIds as number[])[a0] ?? -1;\n const gidB0 = (input.groupIds as number[])[b0] ?? -1;\n const gidC0 = (input.groupIds as number[])[cIdx] ?? -1;\n const gidD0 = (input.groupIds as number[])[dIdx] ?? -1;\n if (\n (gidA0 >= 0 && gidC0 >= 0 && gidA0 === gidC0) ||\n (gidA0 >= 0 && gidD0 >= 0 && gidA0 === gidD0) ||\n (gidB0 >= 0 && gidC0 >= 0 && gidB0 === gidC0) ||\n (gidB0 >= 0 && gidD0 >= 0 && gidB0 === gidD0)\n ) {\n continue;\n }\n const C = particles[cIdx];\n const D = particles[dIdx];\n if (!C || !D) continue;\n const Cx = C.position.x,\n Cy = C.position.y;\n const Dx = D.position.x,\n Dy = D.position.y;\n\n const rx = Bposx - Aposx,\n ry = Bposy - Aposy;\n const sx = Dx - Cx,\n sy = Dy - Cy;\n const rxs = rx * sy - ry * sx;\n if (Math.abs(rxs) < 1e-6) continue;\n const qpx = Cx - Aposx,\n qpy = Cy - Aposy;\n const tA = (qpx * sy - qpy * sx) / rxs;\n const uA = (qpx * ry - qpy * rx) / rxs;\n if (tA >= 0 && tA <= 1 && uA >= 0 && uA <= 1) {\n const mABx = (Aposx + Bposx) * 0.5;\n const mABy = (Aposy + Bposy) * 0.5;\n const mCDx = (Cx + Dx) * 0.5;\n const mCDy = (Cy + Dy) * 0.5;\n let nx = mABx - mCDx;\n let ny = mABy - mCDy;\n const n2 = nx * nx + ny * ny;\n if (n2 < 1e-9) {\n nx = 0;\n ny = 1;\n } else {\n const inv = 1 / Math.sqrt(n2);\n nx *= inv;\n ny *= inv;\n }\n const sep = (input.separation as number) ?? 0.12;\n particle.position.x += nx * sep;\n particle.position.y += ny * sep;\n break outer2;\n }\n }\n }\n }\n }\n\n const momentum = this.readValue(\"momentum\") as number;\n if (momentum <= 0 || !hasJoints) return;\n\n // Get stored pre-physics position\n const prevX = getState(\"prevX\");\n const prevY = getState(\"prevY\");\n\n // Calculate actual total movement (from pre-physics to post-constraint)\n const totalMovementX = particle.position.x - prevX;\n const totalMovementY = particle.position.y - prevY;\n const actualVelocityX = totalMovementX / dt;\n const actualVelocityY = totalMovementY / dt;\n\n // Blend current velocity with actual movement velocity\n particle.velocity.x =\n particle.velocity.x * (1 - momentum) + actualVelocityX * momentum;\n particle.velocity.y =\n particle.velocity.y * (1 - momentum) + actualVelocityY * momentum;\n },\n };\n }\n}\n","/**\n * Grab (Force Module)\n *\n * Handles particle grabbing during mouse drag operations. When a particle is grabbed\n * (grabbedIndex >= 0), it positions the particle at the specified coordinates and\n * sets its velocity to zero during the constrain phase. This approach is much more\n * efficient than syncing the entire particle array on every mouse move event.\n */\nimport {\n Module,\n type WebGPUDescriptor,\n ModuleRole,\n CPUDescriptor,\n DataType,\n} from \"../../module\";\n\nexport const DEFAULT_GRAB_GRABBED_INDEX = -1;\nexport const DEFAULT_GRAB_POSITION_X = 0;\nexport const DEFAULT_GRAB_POSITION_Y = 0;\n\ntype GrabInputs = {\n grabbedIndex: number;\n positionX: number;\n positionY: number;\n};\n\nexport class Grab extends Module<\"grab\", GrabInputs> {\n readonly name = \"grab\" as const;\n readonly role = ModuleRole.Force;\n readonly inputs = {\n grabbedIndex: DataType.NUMBER,\n positionX: DataType.NUMBER,\n positionY: DataType.NUMBER,\n } as const;\n\n constructor(opts?: {\n enabled?: boolean;\n grabbedIndex?: number;\n positionX?: number;\n positionY?: number;\n }) {\n super();\n\n this.write({\n grabbedIndex: opts?.grabbedIndex ?? DEFAULT_GRAB_GRABBED_INDEX,\n positionX: opts?.positionX ?? DEFAULT_GRAB_POSITION_X,\n positionY: opts?.positionY ?? DEFAULT_GRAB_POSITION_Y,\n });\n\n if (opts?.enabled !== undefined) {\n this.setEnabled(!!opts.enabled);\n }\n }\n\n // Input setters\n setGrabbedIndex(value: number): void {\n this.write({ grabbedIndex: Math.floor(value) });\n }\n\n setPositionX(value: number): void {\n this.write({ positionX: value });\n }\n\n setPositionY(value: number): void {\n this.write({ positionY: value });\n }\n\n setPosition(position: { x: number; y: number }): void {\n this.write({ positionX: position.x, positionY: position.y });\n }\n\n // Input getters\n getGrabbedIndex(): number {\n return this.readValue(\"grabbedIndex\");\n }\n\n getPositionX(): number {\n return this.readValue(\"positionX\");\n }\n\n getPositionY(): number {\n return this.readValue(\"positionY\");\n }\n\n getPosition(): { x: number; y: number } {\n return {\n x: this.getPositionX(),\n y: this.getPositionY(),\n };\n }\n\n // Convenience methods\n grabParticle(index: number, position: { x: number; y: number }): void {\n this.write({\n grabbedIndex: index,\n positionX: position.x,\n positionY: position.y,\n });\n }\n\n releaseParticle(): void {\n this.setGrabbedIndex(-1);\n }\n\n isGrabbing(): boolean {\n return this.getGrabbedIndex() >= 0;\n }\n\n webgpu(): WebGPUDescriptor<GrabInputs> {\n return {\n correct: ({ particleVar, getUniform }) => `{\n // Only the invocation matching the grabbed index should apply the correction\n let gi_f = ${getUniform(\"grabbedIndex\")};\n let gi = u32(gi_f);\n if (gi != index) { return; }\n let count = arrayLength(&particles);\n if (gi < 0 || gi >= count || count == 0u) { return; }\n \n // Update only this particle (current invocation)\n if (${particleVar}.mass > 0.0) {\n ${particleVar}.position.x = ${getUniform(\"positionX\")};\n ${particleVar}.position.y = ${getUniform(\"positionY\")};\n ${particleVar}.velocity.x = 0.0;\n ${particleVar}.velocity.y = 0.0;\n }\n}`,\n };\n }\n\n cpu(): CPUDescriptor<GrabInputs> {\n return {\n correct: ({ particle, particles, input, index }) => {\n const grabbedIndex = Math.floor(input.grabbedIndex);\n if (\n grabbedIndex != index ||\n grabbedIndex < 0 ||\n grabbedIndex >= particles.length ||\n particles.length == 0\n ) {\n return;\n }\n\n // Only grab particles that are not pinned (mass > 0)\n if (particle.mass > 0) {\n // Position the grabbed particle at the target position\n particle.position.x = input.positionX;\n particle.position.y = input.positionY;\n\n // Set velocity to zero to prevent drift\n particle.velocity.x = 0;\n particle.velocity.y = 0;\n }\n },\n };\n }\n}\n","/**\n * Trails (Render Module)\n *\n * Two compute image passes over the scene texture:\n * - decay: exponential fade toward clear color with alpha decay\n * - diffuse: gaussian-like blur with configurable radius\n * Both read from input texture and write to output, participating in ping-pong.\n */\nimport {\n Module,\n type WebGPUDescriptor,\n ModuleRole,\n RenderPassKind,\n CPUDescriptor,\n CanvasComposition,\n DataType,\n} from \"../../module\";\n\nexport const DEFAULT_TRAILS_TRAIL_DECAY = 10;\nexport const DEFAULT_TRAILS_TRAIL_DIFFUSE = 0.0;\n\ntype TrailsInputs = {\n trailDecay: number;\n trailDiffuse: number;\n};\n\nexport class Trails extends Module<\"trails\", TrailsInputs> {\n readonly name = \"trails\" as const;\n readonly role = ModuleRole.Render;\n readonly inputs = {\n trailDecay: DataType.NUMBER,\n trailDiffuse: DataType.NUMBER,\n } as const;\n\n constructor(opts?: {\n enabled?: boolean;\n trailDecay?: number;\n trailDiffuse?: number;\n }) {\n super();\n this.write({\n trailDecay: opts?.trailDecay ?? DEFAULT_TRAILS_TRAIL_DECAY,\n trailDiffuse: opts?.trailDiffuse ?? DEFAULT_TRAILS_TRAIL_DIFFUSE,\n });\n\n if (opts?.enabled !== undefined) {\n this.setEnabled(!!opts.enabled);\n }\n }\n\n setTrailDecay(value: number): void {\n this.write({ trailDecay: value });\n }\n\n setTrailDiffuse(value: number): void {\n this.write({ trailDiffuse: value });\n }\n\n getTrailDecay(): number {\n return this.readValue(\"trailDecay\");\n }\n getTrailDiffuse(): number {\n return this.readValue(\"trailDiffuse\");\n }\n\n webgpu(): WebGPUDescriptor<TrailsInputs> {\n return {\n passes: [\n {\n kind: RenderPassKind.Compute,\n kernel: ({ getUniform, readScene, writeScene }) => `{\n let coords = vec2<i32>(i32(gid.x), i32(gid.y));\n let current = ${readScene(\"coords\")};\n let d = clamp(${getUniform(\"trailDecay\")} * 0.005, 0.0, 1.0);\n if (d <= 0.00001) { ${writeScene(\"coords\", \"current\")}; return; }\n let bg = vec3<f32>(${getUniform(\"clearColorR\")}, ${getUniform(\n \"clearColorG\"\n )}, ${getUniform(\"clearColorB\")});\n let out_rgb = mix(current.rgb, bg, d);\n let out_a = current.a * (1.0 - d);\n let eps = 1.0 / 255.0;\n if (all(abs(out_rgb - bg) < vec3<f32>(eps)) && out_a < eps) {\n ${writeScene(\"coords\", \"vec4<f32>(bg, 0.0)\")};\n } else {\n ${writeScene(\"coords\", \"vec4<f32>(out_rgb, out_a)\")};\n }\n}`,\n bindings: [\"trailDecay\"] as const,\n readsScene: true,\n writesScene: true,\n },\n {\n kind: RenderPassKind.Compute,\n kernel: ({ getUniform, readScene, writeScene }) => `{\n let coords = vec2<i32>(i32(gid.x), i32(gid.y));\n let dims = textureDimensions(input_texture);\n let radius_i = clamp(i32(round(${getUniform(\"trailDiffuse\")})), 0, 12);\n if (radius_i <= 0) { ${writeScene(\n \"coords\",\n `${readScene(\"coords\")}`\n )}; return; }\n let sigma = max(0.5, f32(radius_i) * 0.5);\n let twoSigma2 = 2.0 * sigma * sigma;\n var sum = vec4<f32>(0.0, 0.0, 0.0, 0.0);\n var wsum: f32 = 0.0;\n for (var dy = -radius_i; dy <= radius_i; dy++) {\n for (var dx = -radius_i; dx <= radius_i; dx++) {\n let d2 = f32(dx*dx + dy*dy);\n let w = exp(-d2 / twoSigma2);\n if (w < 1e-5) { continue; }\n let sample_coords = coords + vec2<i32>(dx, dy);\n let clamped_coords = clamp(sample_coords, vec2<i32>(0, 0), vec2<i32>(i32(dims.x) - 1, i32(dims.y) - 1));\n let c = ${readScene(\"clamped_coords\")};\n sum += c * w;\n wsum += w;\n }\n }\n if (wsum > 0.0) {\n ${writeScene(\"coords\", \"sum / vec4<f32>(wsum)\")};\n } else {\n ${writeScene(\"coords\", `${readScene(\"coords\")}`)};\n }\n}`,\n bindings: [\"trailDiffuse\"] as const,\n readsScene: true,\n writesScene: true,\n },\n ],\n };\n }\n\n cpu(): CPUDescriptor<TrailsInputs> {\n return {\n composition: CanvasComposition.HandlesBackground,\n setup: ({ context, input, clearColor }) => {\n // Trail effect with decay and blur - match WebGPU behavior\n const canvas = context.canvas;\n const decay = Math.max(0, Math.min(100, input.trailDecay));\n const diffuse = Math.max(\n 0,\n Math.min(12, Math.round(input.trailDiffuse))\n );\n\n // Apply decay (fade effect) - simple overlay approach with factor to match WebGPU speed\n if (decay > 0.00001) {\n const adjustedDecay = Math.min(1.0, decay * 0.005);\n context.save();\n context.globalCompositeOperation = \"source-over\";\n context.fillStyle = `rgba(${clearColor.r * 255}, ${\n clearColor.g * 255\n }, ${clearColor.b * 255}, ${adjustedDecay})`;\n context.fillRect(0, 0, canvas.width, canvas.height);\n context.restore();\n }\n\n // Apply blur effect if diffuse > 0\n if (diffuse > 0) {\n // Use canvas filter for blur - more performant than manual pixel manipulation\n const tempCanvas = document.createElement(\"canvas\");\n const tempCtx = tempCanvas.getContext(\"2d\")!;\n tempCanvas.width = canvas.width;\n tempCanvas.height = canvas.height;\n\n // Copy current canvas to temp canvas\n tempCtx.drawImage(canvas, 0, 0);\n\n // Apply blur filter and draw back\n context.filter = `blur(${diffuse * 0.5}px)`;\n context.drawImage(tempCanvas, 0, 0);\n context.filter = \"none\";\n }\n },\n };\n }\n}\n","import {\n Module,\n ModuleRole,\n type WebGPUDescriptor,\n CPUDescriptor,\n DataType,\n RenderPassKind,\n CanvasComposition,\n} from \"../../module\";\n\nexport interface Line {\n aIndex: number;\n bIndex: number;\n}\n\ntype LinesInputs = {\n aIndexes: number[];\n bIndexes: number[];\n lineWidth: number;\n lineColorR: number;\n lineColorG: number;\n lineColorB: number;\n};\n\nexport class Lines extends Module<\"lines\", LinesInputs> {\n readonly name = \"lines\" as const;\n readonly role = ModuleRole.Render;\n readonly inputs = {\n aIndexes: DataType.ARRAY,\n bIndexes: DataType.ARRAY,\n lineWidth: DataType.NUMBER,\n lineColorR: DataType.NUMBER,\n lineColorG: DataType.NUMBER,\n lineColorB: DataType.NUMBER,\n } as const;\n\n constructor(opts?: {\n enabled?: boolean;\n lines?: Line[];\n aIndexes?: number[];\n bIndexes?: number[];\n lineWidth?: number;\n }) {\n super();\n\n // Handle lines array if provided, otherwise use separate arrays\n let aIndexes: number[], bIndexes: number[];\n if (opts?.lines) {\n aIndexes = opts.lines.map((l) => l.aIndex);\n bIndexes = opts.lines.map((l) => l.bIndex);\n } else {\n aIndexes = opts?.aIndexes ?? [];\n bIndexes = opts?.bIndexes ?? [];\n }\n\n this.write({\n aIndexes,\n bIndexes,\n lineWidth: opts?.lineWidth ?? 1.5,\n lineColorR: -1,\n lineColorG: -1,\n lineColorB: -1,\n });\n if (opts?.enabled !== undefined) this.setEnabled(!!opts.enabled);\n }\n\n getLines(): Line[] {\n const aIndexes = this.readArray(\"aIndexes\") as number[];\n const bIndexes = this.readArray(\"bIndexes\") as number[];\n\n const lines: Line[] = [];\n const length = Math.min(aIndexes.length, bIndexes.length);\n for (let i = 0; i < length; i++) {\n lines.push({\n aIndex: aIndexes[i],\n bIndex: bIndexes[i],\n });\n }\n return lines;\n }\n\n setLines(lines: Line[]): void;\n setLines(aIndexes: number[], bIndexes: number[]): void;\n setLines(linesOrAIndexes: Line[] | number[], bIndexes?: number[]): void {\n let aIndexes: number[], bIndexesArray: number[];\n\n // Check if first argument is Line[] or number[]\n if (bIndexes === undefined) {\n // First overload: Line[]\n const lines = linesOrAIndexes as Line[];\n aIndexes = lines.map((l) => l.aIndex);\n bIndexesArray = lines.map((l) => l.bIndex);\n } else {\n // Second overload: separate arrays\n aIndexes = linesOrAIndexes as number[];\n bIndexesArray = bIndexes;\n }\n\n this.write({ aIndexes, bIndexes: bIndexesArray });\n }\n\n setLineWidth(value: number): void {\n this.write({ lineWidth: value });\n }\n\n setLineColor(\n color: { r: number; g: number; b: number; a: number } | null\n ): void {\n if (color) {\n this.write({\n lineColorR: color.r,\n lineColorG: color.g,\n lineColorB: color.b,\n });\n } else {\n this.write({ lineColorR: -1, lineColorG: -1, lineColorB: -1 });\n }\n }\n\n getLineColor(): { r: number; g: number; b: number; a: number } | null {\n const r = this.readValue(\"lineColorR\");\n const g = this.readValue(\"lineColorG\");\n const b = this.readValue(\"lineColorB\");\n if (r >= 0 && g >= 0 && b >= 0) return { r, g, b, a: 1 };\n return null;\n }\n\n add(line: Line): void {\n const currentLines = this.getLines();\n\n // Normalize line (ensure aIndex <= bIndex) and dedupe\n let { aIndex, bIndex } = line;\n if (aIndex === bIndex) return; // Skip self-lines\n if (bIndex < aIndex) [aIndex, bIndex] = [bIndex, aIndex];\n\n // Check for duplicates\n for (const existing of currentLines) {\n let { aIndex: existingA, bIndex: existingB } = existing;\n if (existingB < existingA)\n [existingA, existingB] = [existingB, existingA];\n if (existingA === aIndex && existingB === bIndex) return;\n }\n\n // Add the line\n currentLines.push({ aIndex, bIndex });\n this.setLines(currentLines);\n }\n\n remove(aIndex: number, bIndex: number): void {\n const currentLines = this.getLines();\n\n // Normalize indices for comparison\n let searchA = aIndex,\n searchB = bIndex;\n if (searchB < searchA) [searchA, searchB] = [searchB, searchA];\n\n // Find and remove the line (works with flipped indices too)\n const filteredLines = currentLines.filter((line) => {\n let { aIndex: lineA, bIndex: lineB } = line;\n if (lineB < lineA) [lineA, lineB] = [lineB, lineA];\n return !(lineA === searchA && lineB === searchB);\n });\n\n this.setLines(filteredLines);\n }\n\n removeAll(): void {\n this.setLines([]);\n }\n\n webgpu(): WebGPUDescriptor<LinesInputs> {\n return {\n passes: [\n {\n kind: RenderPassKind.Fullscreen,\n instanced: true,\n instanceFrom: \"aIndexes\",\n // Vertex: position quad in NDC for a line instance, minimal work in fragment\n vertex: ({ getUniform }) => `{\n let ia = u32(${getUniform(\"aIndexes\", \"instance_index\")});\n let ib = u32(${getUniform(\"bIndexes\", \"instance_index\")});\n let pa = particles[ia];\n let pb = particles[ib];\n // Cull if either endpoint is removed (mass == 0)\n if (pa.mass == 0.0 || pb.mass == 0.0) {\n out.position = vec4<f32>(2.0, 2.0, 1.0, 1.0);\n } else {\n let a = (pa.position - render_uniforms.camera_position) * render_uniforms.zoom;\n let b = (pb.position - render_uniforms.camera_position) * render_uniforms.zoom;\n let lw = max(1.0, ${getUniform(\"lineWidth\")});\n let dir = normalize(b - a + vec2<f32>(1e-6, 0.0));\n let n = vec2<f32>(-dir.y, dir.x);\n let halfW = (lw * 0.5);\n let ax = (a.x * 2.0) / render_uniforms.canvas_size.x;\n let ay = (-a.y * 2.0) / render_uniforms.canvas_size.y;\n let bx = (b.x * 2.0) / render_uniforms.canvas_size.x;\n let by = (-b.y * 2.0) / render_uniforms.canvas_size.y;\n let nx = (n.x * halfW * 2.0) / render_uniforms.canvas_size.x;\n let ny = (-n.y * halfW * 2.0) / render_uniforms.canvas_size.y;\n let quad = array<vec2<f32>,4>(\n vec2<f32>(ax - nx, ay - ny),\n vec2<f32>(bx - nx, by - ny),\n vec2<f32>(ax + nx, ay + ny),\n vec2<f32>(bx + nx, by + ny)\n );\n // Pass color from particle A\n out.color = pa.color;\n out.position = vec4<f32>(quad[li], 0.0, 1.0);\n }\n}`,\n fragment: ({ sampleScene, getUniform }) => `{\n // Simple overwrite blend with alpha compositing\n var dst = ${sampleScene(\"uv\")};\n let lc = vec3<f32>(\n ${getUniform(\"lineColorR\")},\n ${getUniform(\"lineColorG\")},\n ${getUniform(\"lineColorB\")}\n );\n let useOverride = ${getUniform(\"lineColorR\")} >= 0.0;\n var src: vec4<f32> = color;\n if (useOverride) {\n src = vec4<f32>(lc, 1.0);\n }\n let outc = dst + src * (1.0 - dst.a);\n return vec4<f32>(outc.rgb, min(1.0, outc.a));\n}`,\n bindings: [\n \"lineWidth\",\n \"lineColorR\",\n \"lineColorG\",\n \"lineColorB\",\n ] as const,\n readsScene: true,\n writesScene: true,\n },\n ],\n };\n }\n\n cpu(): CPUDescriptor<LinesInputs> {\n return {\n composition: CanvasComposition.Additive,\n setup: ({ context, input, view, particles }) => {\n const a = (this.readArray(\"aIndexes\") as number[]) || [];\n const b = (this.readArray(\"bIndexes\") as number[]) || [];\n const lw = typeof input.lineWidth === \"number\" ? input.lineWidth : 1.5;\n const r = (input as any).lineColorR as number;\n const g = (input as any).lineColorG as number;\n const bcol = (input as any).lineColorB as number;\n const overrideColor =\n r >= 0 && g >= 0 && bcol >= 0 ? { r, g, b: bcol, a: 1 } : null;\n\n const camera = view.getCamera();\n const zoom = view.getZoom();\n const size = view.getSize();\n const centerX = size.width / 2;\n const centerY = size.height / 2;\n\n context.save();\n context.lineWidth = lw;\n context.globalCompositeOperation = \"source-over\";\n const count = Math.min(a.length, b.length);\n for (let i = 0; i < count; i++) {\n const ia = a[i] >>> 0;\n const ib = b[i] >>> 0;\n const pa = particles[ia];\n const pb = particles[ib];\n if (!pa || !pb) continue;\n if (pa.mass === 0 || pb.mass === 0) continue; // skip removed\n // Screen-space coords\n const ax = centerX + (pa.position.x - camera.x) * zoom;\n const ay = centerY + (pa.position.y - camera.y) * zoom;\n const bx = centerX + (pb.position.x - camera.x) * zoom;\n const by = centerY + (pb.position.y - camera.y) * zoom;\n const c = overrideColor ?? pa.color;\n context.strokeStyle = `rgba(${c.r * 255}, ${c.g * 255}, ${\n c.b * 255\n }, ${c.a})`;\n context.beginPath();\n context.moveTo(ax, ay);\n context.lineTo(bx, by);\n context.stroke();\n }\n context.restore();\n },\n };\n }\n}\n","/**\n * Particles (Render Module)\n *\n * Single fullscreen pass that instanced-draws particle quads into the scene.\n * Fragment shader renders a soft-disc using the particle color and alpha falloff.\n */\nimport {\n Module,\n type WebGPUDescriptor,\n ModuleRole,\n RenderPassKind,\n CPUDescriptor,\n CanvasComposition,\n DataType,\n} from \"../../module\";\n\nexport enum ParticlesColorType {\n Default = 0,\n Custom = 1,\n Hue = 2,\n}\n\ntype ParticlesInputs = {\n colorType: number; // ParticleColorType enum value\n customColorR: number; // 0..1\n customColorG: number; // 0..1\n customColorB: number; // 0..1\n hue: number; // 0..1\n};\n\nexport class Particles extends Module<\"particles\", ParticlesInputs> {\n readonly name = \"particles\" as const;\n readonly role = ModuleRole.Render;\n readonly inputs = {\n colorType: DataType.NUMBER,\n customColorR: DataType.NUMBER,\n customColorG: DataType.NUMBER,\n customColorB: DataType.NUMBER,\n hue: DataType.NUMBER,\n } as const;\n\n constructor(opts?: {\n enabled?: boolean;\n colorType?: ParticlesColorType;\n customColor?: { r: number; g: number; b: number; a: number };\n hue?: number;\n }) {\n super();\n this.write({\n colorType: opts?.colorType ?? ParticlesColorType.Default,\n customColorR: opts?.customColor?.r ?? 1,\n customColorG: opts?.customColor?.g ?? 1,\n customColorB: opts?.customColor?.b ?? 1,\n hue: Math.min(1, Math.max(0, opts?.hue ?? 0)),\n });\n if (opts?.enabled !== undefined) this.setEnabled(!!opts.enabled);\n }\n\n setColorType(type: ParticlesColorType): void {\n this.write({ colorType: type });\n }\n\n setCustomColor(color: { r: number; g: number; b: number; a: number }): void {\n this.write({\n customColorR: color.r,\n customColorG: color.g,\n customColorB: color.b,\n });\n }\n\n setHue(hue: number): void {\n const clamped = Math.min(1, Math.max(0, hue));\n this.write({ hue: clamped });\n }\n\n webgpu(): WebGPUDescriptor<ParticlesInputs> {\n return {\n // Single fullscreen pass that draws particles into the scene texture\n passes: [\n {\n kind: RenderPassKind.Fullscreen,\n fragment: ({ getUniform }) => `{\n let center = vec2<f32>(0.5, 0.5);\n let dist = distance(uv, center);\n \n // Fetch uniforms\n let colorType = ${getUniform(\"colorType\")};\n let custom = vec3<f32>(\n ${getUniform(\"customColorR\")},\n ${getUniform(\"customColorG\")},\n ${getUniform(\"customColorB\")}\n );\n let hue = ${getUniform(\"hue\")};\n var baseColor = color;\n if (colorType == 1.0) {\n baseColor = vec4<f32>(custom, 1.0); // Custom RGB with alpha 1\n } else if (colorType == 2.0) {\n // Inline hue->RGB conversion at full saturation/value\n let h = fract(hue) * 6.0;\n let i = floor(h);\n let f = h - i;\n let q = 1.0 - f;\n var rgb = vec3<f32>(1.0, 0.0, 0.0);\n if (i < 1.0) {\n rgb = vec3<f32>(1.0, f, 0.0);\n } else if (i < 2.0) {\n rgb = vec3<f32>(q, 1.0, 0.0);\n } else if (i < 3.0) {\n rgb = vec3<f32>(0.0, 1.0, f);\n } else if (i < 4.0) {\n rgb = vec3<f32>(0.0, q, 1.0);\n } else if (i < 5.0) {\n rgb = vec3<f32>(f, 0.0, 1.0);\n } else {\n rgb = vec3<f32>(1.0, 0.0, q);\n }\n baseColor = vec4<f32>(rgb, 1.0);\n }\n\n var finalColor = baseColor.rgb;\n var finalAlpha = baseColor.a;\n \n // Pinned particles render as hollow circles (donut shape)\n if (mass < 0.0) {\n // Create hollow ring effect\n let innerRadius = 0.30;\n let outerRadius = 0.45;\n let edgeSmooth = 0.05;\n \n // Calculate ring alpha based on distance\n var ringAlpha = 1.0 - smoothstep(outerRadius - edgeSmooth, outerRadius + edgeSmooth, dist);\n ringAlpha = ringAlpha * smoothstep(innerRadius - edgeSmooth, innerRadius + edgeSmooth, dist);\n \n finalAlpha = finalAlpha * ringAlpha;\n } else {\n // Normal solid particle\n finalAlpha = finalAlpha * (1.0 - smoothstep(0.45, 0.5, dist));\n }\n \n return vec4<f32>(finalColor, finalAlpha);\n}`,\n bindings: [\n \"colorType\",\n \"customColorR\",\n \"customColorG\",\n \"customColorB\",\n \"hue\",\n ] as const,\n readsScene: false,\n writesScene: true,\n },\n ],\n };\n }\n\n cpu(): CPUDescriptor<ParticlesInputs> {\n return {\n composition: CanvasComposition.RequiresClear,\n render: ({\n particle,\n screenX,\n screenY,\n screenSize,\n utils,\n context,\n input,\n }) => {\n // Determine render color based on input colorType\n const type = typeof input.colorType === \"number\" ? input.colorType : 0;\n let rgba = particle.color;\n if (type === 1) {\n const r = (input as any).customColorR as number;\n const g = (input as any).customColorG as number;\n const b = (input as any).customColorB as number;\n rgba = { r: r ?? 1, g: g ?? 1, b: b ?? 1, a: 1 };\n } else if (type === 2) {\n const h = Math.min(\n 1,\n Math.max(0, typeof input.hue === \"number\" ? input.hue : 0)\n );\n // Convert hue to RGB (HSV with S=1, V=1)\n const h6 = h * 6;\n const i = Math.floor(h6);\n const f = h6 - i;\n const q = 1 - f;\n switch (i % 6) {\n case 0:\n rgba = { r: 1, g: f, b: 0, a: 1 };\n break;\n case 1:\n rgba = { r: q, g: 1, b: 0, a: 1 };\n break;\n case 2:\n rgba = { r: 0, g: 1, b: f, a: 1 };\n break;\n case 3:\n rgba = { r: 0, g: q, b: 1, a: 1 };\n break;\n case 4:\n rgba = { r: f, g: 0, b: 1, a: 1 };\n break;\n default:\n rgba = { r: 1, g: 0, b: q, a: 1 };\n }\n }\n if (particle.mass < 0) {\n // Draw hollow circle for pinned particles\n const color = rgba;\n const lineWidth = Math.max(2, screenSize * 0.15); // Ring width scales with particle size\n\n context.strokeStyle = `rgba(${color.r * 255}, ${color.g * 255}, ${\n color.b * 255\n }, ${color.a})`;\n context.lineWidth = lineWidth;\n context.beginPath();\n context.arc(\n screenX,\n screenY,\n screenSize - lineWidth / 2,\n 0,\n Math.PI * 2\n );\n context.stroke();\n } else {\n // Draw solid circle for normal particles\n utils.drawCircle(screenX, screenY, screenSize, rgba);\n }\n },\n };\n }\n}\n"],"names":[],"mappings":"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"}
|