/** * MLSMPMFluid — GPU-accelerated MLS-MPM fluid simulation. * * Uses WebGPU compute shaders for Moving Least Squares Material Point Method: * Frame pipeline: * [1] Grid Clear * [2] Particle-to-Grid (P2G) — scatter mass/momentum via atomicAdd * [3] Grid Update — gravity, boundaries, momentum → velocity * [4] Grid-to-Particle (G2P) — gather velocity, update APIC C matrix + J * * Rendering pipeline (SSFR): * [1] Depth pass — particle → depth buffer * [2] Thickness pass — additive particle thickness * [3] Bilateral filter — smooth depth, compute normals * [4] Final shade — Fresnel + Beer-Lambert + refraction * * Performance targets: * - 100K particles @ 60 FPS on iGPU * - 300K particles @ 30 FPS on discrete GPU * * @module physics */ export interface MLSMPMConfig { /** Fluid behavior: liquid (incompressible) or gas (compressible) */ type: 'liquid' | 'gas'; /** Number of simulation particles */ particleCount: number; /** Dynamic viscosity (default: 0.01 for water) */ viscosity: number; /** Grid cells per axis (default: 128) */ gridResolution: number; /** Domain size in world units (default: 10) */ domainSize: number; /** SSFR render resolution scale (0.5 = half-res, default) */ resolutionScale: number; /** Target rest density (default: 1000 for water) */ restDensity: number; /** Compressibility stiffness (default: 50) */ bulkModulus: number; /** Particle visual radius (default: 0.02) */ particleRadius: number; /** Gravity Y component (default: -9.81) */ gravity: number; /** SSFR absorption color RGB (default: [0.4, 0.04, 0.0] blue water) */ absorptionColor: [number, number, number]; /** SSFR absorption strength (default: 2.0) */ absorptionStrength: number; } export interface MLSMPMStats { particleCount: number; gridResolution: number; lastStepMs: number; lastRenderMs: number; gpuBufferSizeMB: number; } export declare class MLSMPMFluid { private config; private device; private disposed; private particlePositions; private particleVelocities; private particleC; private particleJ; private gridMass; private gridMomentumX; private gridMomentumY; private gridMomentumZ; private gridVelocity; private simParamsBuffer; /** External force (wind) applied during grid update [x, y, z] in m/s² */ private externalForce; private gridClearPipeline; private p2gPipeline; private gridUpdatePipeline; private g2pPipeline; private p2gBindGroup; private gridClearBindGroup; private gridUpdateBindGroup; private g2pBindGroup; private lastStepMs; private lastRenderMs; constructor(config?: Partial); /** * Initialize GPU resources and compile shaders. * Must be called before step(). */ init(device: GPUDevice): Promise; /** * Set initial particle positions. Call after init(). * * @param positions - Float32Array of [x, y, z, volume, ...] per particle */ setInitialPositions(positions: Float32Array): void; /** * Generate a block of particles in a cubic region. */ generateParticleBlock(min: [number, number, number], max: [number, number, number]): Float32Array; /** * Step the simulation forward by dt seconds. */ step(dt?: number): void; /** * Dispose all GPU resources. */ dispose(): void; /** * Set an external force (e.g. wind) applied to the fluid during grid update. * Force is in world-space acceleration (m/s²). Applied additively with gravity. */ setExternalForce(x: number, y: number, z: number): void; /** Get the particle position buffer for rendering or unified PBD integration */ getParticlePositionBuffer(): GPUBuffer | null; /** Get the particle velocity buffer */ getParticleVelocityBuffer(): GPUBuffer | null; getParticleCount(): number; getConfig(): Readonly; getStats(): MLSMPMStats; private createPipelines; private createBindGroups; private updateUniforms; } //# sourceMappingURL=MLSMPMFluid.d.ts.map