flag-cloth 0.1.0 → 0.1.1

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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/rendering/WebGLClothRenderer.ts","../src/core/simulation/constraints.ts","../src/core/simulation/noise.ts","../src/core/simulation/ClothSimulation.ts","../src/core/utilities/FixedTimeStep.ts","../src/core/defaults.ts","../src/core/debug/DebugPanel.ts","../src/core/interaction/PointerDragController.ts","../src/core/rendering/texture.ts","../src/core/FlagCloth.ts"],"names":["SHADOW_KERNEL","WHITE_PIXEL","VERTEX_SHADER","FRAGMENT_SHADER","WebGLClothRenderer","canvas","context","simulation","rendererOptions","material","lighting","camera","__publicField","event","textureSource","filteringChanged","width","height","pixelRatio","backingWidth","backingHeight","gl","uniforms","shadingInterval","background","screenX","screenY","selectedParticle","closestDepth","index","first","second","third","firstOffset","secondOffset","thirdOffset","firstX","firstY","secondX","secondY","thirdX","thirdY","denominator","firstWeight","secondWeight","thirdWeight","depth","planeX","planeY","planeZ","output","viewX","viewY","rayX","rayY","rayZ","rayLength","distance","vertexShader","compileShader","fragmentShader","program","details","requiredUniform","particle","y","x","offset","rowStart","topLeft","topRight","bottomLeft","bottomRight","positions","normals","edgeAX","edgeAY","edgeAZ","edgeBX","edgeBY","edgeBZ","normalX","normalY","normalZ","addNormal","length","positionOffset","relativeX","relativeY","relativeZ","outputOffset","scale","shadow","passCount","radius","kernel","offsetX","offsetY","base","position","forwardX","forwardY","forwardZ","forwardLength","rightX","rightY","rightZ","rightLength","view","projection","inverseTan","aspect","near","far","multiplyMatrix4","direction","parseColor","type","source","shader","name","location","left","right","column","rightOffset","right0","right1","right2","right3","value","fallback","color","hex","match","parts","parseColorChannel","trimmed","number","createConstraintSet","segmentsX","segmentsY","columns","rows","structuralCount","shearCount","bendCount","count","restLength","kind","horizontalLength","verticalLength","diagonalLength","constraintIndex","add","a","b","rest","hash","z","fade","mix","amount","valueNoise3","x0","y0","z0","xAmount","yAmount","zAmount","lowerA","lowerB","upperA","upperB","ClothSimulation","config","particleIndex","force","options","attachment","pin","i","point","stiffness","allowPinned","centerX","centerY","safeRadius","integerRadius","candidate","centerOffset","centerPositionX","centerPositionY","centerPositionZ","dragIndex","particleOffset","dragOffset","releaseImpulse","timeStep","weight","substeps","substep","substepIndex","inverseMass","yPosition","edge","every","step","start","timeStepSquared","damping","gravity","positionX","positionY","positionZ","velocityX","velocityY","velocityZ","iterations","structuralCorrection","shearCorrection","bendCorrection","maxCorrection","iteration","constraint","firstParticle","secondParticle","deltaX","deltaY","deltaZ","distanceSquared","error","constraintKind","totalWeight","correction","firstShare","secondShare","targetX","targetY","targetZ","previous","firstZ","doubleArea","centroidX","centroidY","centroidZ","noiseTime","spatialScale","noise","crossNoise","gust","lateral","windX","windY","windZ","inverseTimeStep","inverseNormalLength","unitNormalX","unitNormalY","unitNormalZ","normalVelocity","pressure","sharedForceX","sharedForceY","sharedForceZ","safeStiffness","FixedTimeStep","fixedTimeStep","maxFrameDelta","maxStepsPerFrame","frameDelta","simulate","cappedDelta","steps","DEFAULT_SEGMENTS","DEFAULT_WIND","DEFAULT_SIMULATION","DEFAULT_INTERACTION","DEFAULT_RENDERER","RENDERER_PRESET_DEFAULTS","DEFAULT_MATERIAL","DEFAULT_LIGHTING","DEFAULT_CAMERA","DEFAULT_VISIBILITY","DEFAULT_DEBUG","DebugPanel","container","stats","PointerDragController","element","renderer","maximumDistance","bounds","pointerId","loadTexture","image","resolve","reject","FlagClothInstance","initialOptions","timestamp","delta","entries","entry","resolveOptions","contextCanvas","renderFrame","simulationStarted","simulationEnded","renderStarted","deviceRatio","request","texture","update","structureChanged","resolveRendererOptions","resolveDebugOptions","now","elapsed","createFlagCloth","current","resolved","preset","debug"],"mappings":"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","file":"chunk-E5IYGF33.js","sourcesContent":["import type {\n CameraOptions,\n ClothMaterialOptions,\n FlagRendererOptions,\n LightingOptions,\n} from \"../../types/options\";\nimport type { ClothSimulation } from \"../simulation/ClothSimulation\";\n\ninterface ShaderUniforms {\n viewProjection: WebGLUniformLocation;\n screenOffset: WebGLUniformLocation;\n texture: WebGLUniformLocation;\n hasTexture: WebGLUniformLocation;\n shadowPass: WebGLUniformLocation;\n baseColor: WebGLUniformLocation;\n shadowColor: WebGLUniformLocation;\n lightDirection: WebGLUniformLocation;\n cameraPosition: WebGLUniformLocation;\n lightingEnabled: WebGLUniformLocation;\n lightIntensity: WebGLUniformLocation;\n ambient: WebGLUniformLocation;\n diffuse: WebGLUniformLocation;\n specular: WebGLUniformLocation;\n shininess: WebGLUniformLocation;\n foldContrast: WebGLUniformLocation;\n}\n\nconst SHADOW_KERNEL = new Int8Array([\n 0, 0,\n -1, -1,\n 0, -1,\n 1, -1,\n -1, 0,\n 1, 0,\n -1, 1,\n 0, 1,\n 1, 1,\n]);\n\nconst WHITE_PIXEL = new Uint8Array([255, 255, 255, 255]);\n\nconst VERTEX_SHADER = `#version 300 es\nprecision highp float;\n\nlayout(location = 0) in vec3 aPosition;\nlayout(location = 1) in vec3 aNormal;\nlayout(location = 2) in vec2 aUv;\n\nuniform mat4 uViewProjection;\nuniform vec2 uScreenOffset;\n\nout vec2 vUv;\nout vec3 vNormal;\nout vec3 vWorldPosition;\n\nvoid main() {\n vec4 clipPosition = uViewProjection * vec4(aPosition, 1.0);\n clipPosition.xy += uScreenOffset * clipPosition.w;\n gl_Position = clipPosition;\n vUv = aUv;\n vNormal = aNormal;\n vWorldPosition = aPosition;\n}\n`;\n\nconst FRAGMENT_SHADER = `#version 300 es\nprecision highp float;\n\nuniform sampler2D uTexture;\nuniform bool uHasTexture;\nuniform bool uShadowPass;\nuniform vec4 uBaseColor;\nuniform vec4 uShadowColor;\nuniform vec3 uLightDirection;\nuniform vec3 uCameraPosition;\nuniform bool uLightingEnabled;\nuniform float uLightIntensity;\nuniform float uAmbient;\nuniform float uDiffuse;\nuniform float uSpecular;\nuniform float uShininess;\nuniform float uFoldContrast;\n\nin vec2 vUv;\nin vec3 vNormal;\nin vec3 vWorldPosition;\n\nout vec4 outputColor;\n\nvoid main() {\n vec4 albedo = uHasTexture ? texture(uTexture, vUv) : uBaseColor;\n if (albedo.a <= 0.001) discard;\n\n if (uShadowPass) {\n outputColor = vec4(uShadowColor.rgb, uShadowColor.a * albedo.a);\n return;\n }\n\n if (!uLightingEnabled) {\n outputColor = albedo;\n return;\n }\n\n vec3 normal = normalize(vNormal);\n vec3 viewDirection = normalize(uCameraPosition - vWorldPosition);\n if (dot(normal, viewDirection) < 0.0) normal = -normal;\n\n float diffuseLight = max(dot(normal, uLightDirection), 0.0);\n float facing = max(dot(normal, viewDirection), 0.0);\n float brightness = uAmbient + diffuseLight * uDiffuse * uLightIntensity;\n float foldDarkening = (1.0 - facing) * uFoldContrast * 0.28;\n\n vec3 halfDirection = normalize(uLightDirection + viewDirection);\n float highlight = pow(max(dot(normal, halfDirection), 0.0), max(1.0, uShininess));\n highlight *= uSpecular * uLightIntensity;\n\n vec3 shaded = albedo.rgb * max(0.08, brightness - foldDarkening);\n shaded += vec3(highlight);\n outputColor = vec4(clamp(shaded, 0.0, 1.0), albedo.a);\n}\n`;\n\n/**\n * A compact GPU renderer for the cloth solver. JavaScript updates two dynamic\n * typed-array buffers; one indexed draw maps and lights the complete texture.\n */\nexport class WebGLClothRenderer {\n projectedPositions: Float32Array;\n projectedDepths: Float32Array;\n\n private simulation: ClothSimulation;\n private rendererOptions: FlagRendererOptions;\n private material: ClothMaterialOptions;\n private lighting: LightingOptions;\n private camera: CameraOptions;\n private textureSource: TexImageSource | null = null;\n private vertexNormals: Float32Array;\n private textureCoordinates: Float32Array;\n private indices: Uint32Array;\n private cssWidth = 1;\n private cssHeight = 1;\n private pixelRatio = 1;\n private focalLength = 1;\n private cameraX = 0;\n private cameraY = 0;\n private cameraZ = 5;\n private forwardX = 0;\n private forwardY = 0;\n private forwardZ = -1;\n private rightX = 1;\n private rightY = 0;\n private rightZ = 0;\n private upX = 0;\n private upY = 1;\n private upZ = 0;\n private lightX = 0;\n private lightY = 0;\n private lightZ = 1;\n private frameNumber = 0;\n private drawCallsValue = 0;\n private contextLost = false;\n private destroyed = false;\n\n private readonly viewMatrix = new Float32Array(16);\n private readonly projectionMatrix = new Float32Array(16);\n private readonly viewProjectionMatrix = new Float32Array(16);\n private baseColor = new Float32Array([1, 1, 1, 1]);\n private shadowColor = new Float32Array([0, 0, 0, 0.3]);\n private backgroundColor = new Float32Array([0, 0, 0, 0]);\n\n private program: WebGLProgram | null = null;\n private uniforms: ShaderUniforms | null = null;\n private vertexArray: WebGLVertexArrayObject | null = null;\n private positionBuffer: WebGLBuffer | null = null;\n private normalBuffer: WebGLBuffer | null = null;\n private textureCoordinateBuffer: WebGLBuffer | null = null;\n private indexBuffer: WebGLBuffer | null = null;\n private texture: WebGLTexture | null = null;\n\n constructor(\n readonly canvas: HTMLCanvasElement,\n readonly context: WebGL2RenderingContext,\n simulation: ClothSimulation,\n rendererOptions: FlagRendererOptions,\n material: ClothMaterialOptions,\n lighting: LightingOptions,\n camera: CameraOptions,\n ) {\n this.simulation = simulation;\n this.rendererOptions = rendererOptions;\n this.material = material;\n this.lighting = lighting;\n this.camera = camera;\n this.projectedPositions = new Float32Array(simulation.particleCount * 2);\n this.projectedDepths = new Float32Array(simulation.particleCount);\n this.vertexNormals = new Float32Array(simulation.particleCount * 3);\n this.textureCoordinates = new Float32Array(simulation.particleCount * 2);\n this.indices = new Uint32Array(simulation.segmentsX * simulation.segmentsY * 6);\n this.rebuildTopology();\n this.updateCameraBasis();\n this.updateLightDirection();\n this.updateColors();\n this.canvas.addEventListener(\"webglcontextlost\", this.onContextLost);\n this.canvas.addEventListener(\"webglcontextrestored\", this.onContextRestored);\n this.initializeResources();\n }\n\n get width(): number {\n return this.cssWidth;\n }\n\n get height(): number {\n return this.cssHeight;\n }\n\n get drawCalls(): number {\n return this.drawCallsValue;\n }\n\n setSimulation(simulation: ClothSimulation): void {\n this.simulation = simulation;\n this.projectedPositions = new Float32Array(simulation.particleCount * 2);\n this.projectedDepths = new Float32Array(simulation.particleCount);\n this.vertexNormals = new Float32Array(simulation.particleCount * 3);\n this.textureCoordinates = new Float32Array(simulation.particleCount * 2);\n this.indices = new Uint32Array(simulation.segmentsX * simulation.segmentsY * 6);\n this.rebuildTopology();\n this.updateCameraBasis();\n if (!this.contextLost) this.uploadTopology();\n }\n\n setTexture(textureSource: TexImageSource | null): void {\n this.textureSource = textureSource;\n if (!this.contextLost) this.uploadTexture();\n }\n\n setOptions(\n rendererOptions: FlagRendererOptions,\n material: ClothMaterialOptions,\n lighting: LightingOptions,\n camera: CameraOptions,\n ): void {\n const filteringChanged =\n rendererOptions.textureFiltering !== this.rendererOptions.textureFiltering;\n this.rendererOptions = rendererOptions;\n this.material = material;\n this.lighting = lighting;\n this.camera = camera;\n this.updateCameraBasis();\n this.updateLightDirection();\n this.updateColors();\n if (filteringChanged && !this.contextLost) this.applyTextureFiltering();\n }\n\n resize(width: number, height: number, pixelRatio: number): void {\n this.cssWidth = Math.max(1, width);\n this.cssHeight = Math.max(1, height);\n this.pixelRatio = Math.max(0.5, pixelRatio);\n const backingWidth = Math.max(1, Math.round(this.cssWidth * this.pixelRatio));\n const backingHeight = Math.max(1, Math.round(this.cssHeight * this.pixelRatio));\n if (this.canvas.width !== backingWidth) this.canvas.width = backingWidth;\n if (this.canvas.height !== backingHeight) this.canvas.height = backingHeight;\n this.context.viewport(0, 0, backingWidth, backingHeight);\n this.updateCameraBasis();\n }\n\n render(): void {\n const gl = this.context;\n const uniforms = this.uniforms;\n if (\n this.destroyed ||\n this.contextLost ||\n !this.program ||\n !uniforms ||\n !this.vertexArray ||\n !this.positionBuffer ||\n !this.normalBuffer ||\n !this.texture\n ) {\n return;\n }\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.simulation.positions);\n const shadingInterval = Math.max(1, Math.floor(this.rendererOptions.shadingUpdateInterval));\n if (this.frameNumber % shadingInterval === 0) {\n this.updateVertexNormals();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.normalBuffer);\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.vertexNormals);\n }\n this.frameNumber += 1;\n\n const background = this.backgroundColor;\n gl.clearColor(\n background[0] ?? 0,\n background[1] ?? 0,\n background[2] ?? 0,\n this.rendererOptions.transparent ? 0 : (background[3] ?? 1),\n );\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n gl.useProgram(this.program);\n gl.bindVertexArray(this.vertexArray);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n gl.disable(gl.CULL_FACE);\n\n this.syncShaderUniforms(uniforms);\n this.drawCallsValue = 0;\n if (this.rendererOptions.shadows) {\n this.drawShadow(uniforms);\n }\n\n gl.enable(gl.DEPTH_TEST);\n gl.depthMask(true);\n gl.uniform1i(uniforms.shadowPass, 0);\n gl.uniform2f(uniforms.screenOffset, 0, 0);\n gl.drawElements(gl.TRIANGLES, this.indices.length, gl.UNSIGNED_INT, 0);\n this.drawCallsValue += 1;\n gl.bindVertexArray(null);\n }\n\n findParticleAt(screenX: number, screenY: number): number {\n this.projectParticles();\n let selectedParticle = -1;\n let closestDepth = Number.POSITIVE_INFINITY;\n for (let index = 0; index < this.indices.length; index += 3) {\n const first = this.indices[index] ?? 0;\n const second = this.indices[index + 1] ?? 0;\n const third = this.indices[index + 2] ?? 0;\n const firstOffset = first * 2;\n const secondOffset = second * 2;\n const thirdOffset = third * 2;\n const firstX = this.projectedPositions[firstOffset] ?? Number.NaN;\n const firstY = this.projectedPositions[firstOffset + 1] ?? Number.NaN;\n const secondX = this.projectedPositions[secondOffset] ?? Number.NaN;\n const secondY = this.projectedPositions[secondOffset + 1] ?? Number.NaN;\n const thirdX = this.projectedPositions[thirdOffset] ?? Number.NaN;\n const thirdY = this.projectedPositions[thirdOffset + 1] ?? Number.NaN;\n if (!Number.isFinite(firstX + firstY + secondX + secondY + thirdX + thirdY)) continue;\n\n const denominator =\n (secondY - thirdY) * (firstX - thirdX) +\n (thirdX - secondX) * (firstY - thirdY);\n if (Math.abs(denominator) < 1e-8) continue;\n const firstWeight =\n ((secondY - thirdY) * (screenX - thirdX) +\n (thirdX - secondX) * (screenY - thirdY)) /\n denominator;\n const secondWeight =\n ((thirdY - firstY) * (screenX - thirdX) +\n (firstX - thirdX) * (screenY - thirdY)) /\n denominator;\n const thirdWeight = 1 - firstWeight - secondWeight;\n if (firstWeight < -0.001 || secondWeight < -0.001 || thirdWeight < -0.001) continue;\n\n const depth =\n firstWeight * (this.projectedDepths[first] ?? 0) +\n secondWeight * (this.projectedDepths[second] ?? 0) +\n thirdWeight * (this.projectedDepths[third] ?? 0);\n if (depth >= closestDepth) continue;\n closestDepth = depth;\n if (firstWeight >= secondWeight && firstWeight >= thirdWeight) selectedParticle = first;\n else selectedParticle = secondWeight >= thirdWeight ? second : third;\n }\n return selectedParticle;\n }\n\n unprojectToPlane(\n screenX: number,\n screenY: number,\n planeX: number,\n planeY: number,\n planeZ: number,\n output: Float32Array,\n ): boolean {\n const viewX = (screenX - this.cssWidth * 0.5) / this.focalLength;\n const viewY = -(screenY - this.cssHeight * 0.5) / this.focalLength;\n let rayX = this.forwardX + this.rightX * viewX + this.upX * viewY;\n let rayY = this.forwardY + this.rightY * viewX + this.upY * viewY;\n let rayZ = this.forwardZ + this.rightZ * viewX + this.upZ * viewY;\n const rayLength = Math.hypot(rayX, rayY, rayZ) || 1;\n rayX /= rayLength;\n rayY /= rayLength;\n rayZ /= rayLength;\n const denominator = rayX * this.forwardX + rayY * this.forwardY + rayZ * this.forwardZ;\n if (Math.abs(denominator) < 1e-7) return false;\n const planeDistance =\n (planeX - this.cameraX) * this.forwardX +\n (planeY - this.cameraY) * this.forwardY +\n (planeZ - this.cameraZ) * this.forwardZ;\n const distance = planeDistance / denominator;\n if (distance <= 0) return false;\n output[0] = this.cameraX + rayX * distance;\n output[1] = this.cameraY + rayY * distance;\n output[2] = this.cameraZ + rayZ * distance;\n return true;\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.canvas.removeEventListener(\"webglcontextlost\", this.onContextLost);\n this.canvas.removeEventListener(\"webglcontextrestored\", this.onContextRestored);\n this.deleteResources();\n if (!this.context.isContextLost()) {\n this.context.clearColor(0, 0, 0, 0);\n this.context.clear(this.context.COLOR_BUFFER_BIT | this.context.DEPTH_BUFFER_BIT);\n }\n }\n\n private initializeResources(): void {\n const gl = this.context;\n const vertexShader = compileShader(gl, gl.VERTEX_SHADER, VERTEX_SHADER);\n const fragmentShader = compileShader(gl, gl.FRAGMENT_SHADER, FRAGMENT_SHADER);\n const program = gl.createProgram();\n if (!program) throw new Error(\"Unable to create the cloth shader program.\");\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n gl.deleteShader(vertexShader);\n gl.deleteShader(fragmentShader);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n const details = gl.getProgramInfoLog(program) || \"Unknown link error.\";\n gl.deleteProgram(program);\n throw new Error(`Unable to link the cloth shader: ${details}`);\n }\n\n this.program = program;\n this.uniforms = {\n viewProjection: requiredUniform(gl, program, \"uViewProjection\"),\n screenOffset: requiredUniform(gl, program, \"uScreenOffset\"),\n texture: requiredUniform(gl, program, \"uTexture\"),\n hasTexture: requiredUniform(gl, program, \"uHasTexture\"),\n shadowPass: requiredUniform(gl, program, \"uShadowPass\"),\n baseColor: requiredUniform(gl, program, \"uBaseColor\"),\n shadowColor: requiredUniform(gl, program, \"uShadowColor\"),\n lightDirection: requiredUniform(gl, program, \"uLightDirection\"),\n cameraPosition: requiredUniform(gl, program, \"uCameraPosition\"),\n lightingEnabled: requiredUniform(gl, program, \"uLightingEnabled\"),\n lightIntensity: requiredUniform(gl, program, \"uLightIntensity\"),\n ambient: requiredUniform(gl, program, \"uAmbient\"),\n diffuse: requiredUniform(gl, program, \"uDiffuse\"),\n specular: requiredUniform(gl, program, \"uSpecular\"),\n shininess: requiredUniform(gl, program, \"uShininess\"),\n foldContrast: requiredUniform(gl, program, \"uFoldContrast\"),\n };\n this.vertexArray = gl.createVertexArray();\n this.positionBuffer = gl.createBuffer();\n this.normalBuffer = gl.createBuffer();\n this.textureCoordinateBuffer = gl.createBuffer();\n this.indexBuffer = gl.createBuffer();\n this.texture = gl.createTexture();\n if (\n !this.vertexArray ||\n !this.positionBuffer ||\n !this.normalBuffer ||\n !this.textureCoordinateBuffer ||\n !this.indexBuffer ||\n !this.texture\n ) {\n this.deleteResources();\n throw new Error(\"Unable to allocate WebGL cloth resources.\");\n }\n gl.useProgram(program);\n gl.uniform1i(this.uniforms.texture, 0);\n this.uploadTopology();\n this.uploadTexture();\n }\n\n private uploadTopology(): void {\n const gl = this.context;\n if (\n !this.vertexArray ||\n !this.positionBuffer ||\n !this.normalBuffer ||\n !this.textureCoordinateBuffer ||\n !this.indexBuffer\n ) {\n return;\n }\n this.updateVertexNormals();\n gl.bindVertexArray(this.vertexArray);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, this.simulation.positions, gl.DYNAMIC_DRAW);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.normalBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, this.vertexNormals, gl.DYNAMIC_DRAW);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 3, gl.FLOAT, false, 0, 0);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.textureCoordinateBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, this.textureCoordinates, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(2);\n gl.vertexAttribPointer(2, 2, gl.FLOAT, false, 0, 0);\n\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices, gl.STATIC_DRAW);\n gl.bindVertexArray(null);\n }\n\n private uploadTexture(): void {\n const gl = this.context;\n if (!this.texture) return;\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, 0);\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 0);\n if (this.textureSource) {\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n this.textureSource,\n );\n } else {\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n 1,\n 1,\n 0,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n WHITE_PIXEL,\n );\n }\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n this.applyTextureFiltering();\n }\n\n private applyTextureFiltering(): void {\n const gl = this.context;\n if (!this.texture) return;\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n if (this.rendererOptions.textureFiltering === \"nearest\") {\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n } else {\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.generateMipmap(gl.TEXTURE_2D);\n }\n }\n\n private rebuildTopology(): void {\n let particle = 0;\n for (let y = 0; y < this.simulation.rows; y += 1) {\n for (let x = 0; x < this.simulation.columns; x += 1) {\n const offset = particle * 2;\n this.textureCoordinates[offset] = x / this.simulation.segmentsX;\n this.textureCoordinates[offset + 1] = y / this.simulation.segmentsY;\n particle += 1;\n }\n }\n\n let index = 0;\n for (let y = 0; y < this.simulation.segmentsY; y += 1) {\n const rowStart = y * this.simulation.columns;\n for (let x = 0; x < this.simulation.segmentsX; x += 1) {\n const topLeft = rowStart + x;\n const topRight = topLeft + 1;\n const bottomLeft = topLeft + this.simulation.columns;\n const bottomRight = bottomLeft + 1;\n this.indices[index] = topLeft;\n this.indices[index + 1] = bottomLeft;\n this.indices[index + 2] = topRight;\n this.indices[index + 3] = topRight;\n this.indices[index + 4] = bottomLeft;\n this.indices[index + 5] = bottomRight;\n index += 6;\n }\n }\n }\n\n private updateVertexNormals(): void {\n const positions = this.simulation.positions;\n const normals = this.vertexNormals;\n normals.fill(0);\n for (let index = 0; index < this.indices.length; index += 3) {\n const firstOffset = (this.indices[index] ?? 0) * 3;\n const secondOffset = (this.indices[index + 1] ?? 0) * 3;\n const thirdOffset = (this.indices[index + 2] ?? 0) * 3;\n const edgeAX = (positions[secondOffset] ?? 0) - (positions[firstOffset] ?? 0);\n const edgeAY = (positions[secondOffset + 1] ?? 0) - (positions[firstOffset + 1] ?? 0);\n const edgeAZ = (positions[secondOffset + 2] ?? 0) - (positions[firstOffset + 2] ?? 0);\n const edgeBX = (positions[thirdOffset] ?? 0) - (positions[firstOffset] ?? 0);\n const edgeBY = (positions[thirdOffset + 1] ?? 0) - (positions[firstOffset + 1] ?? 0);\n const edgeBZ = (positions[thirdOffset + 2] ?? 0) - (positions[firstOffset + 2] ?? 0);\n const normalX = edgeAY * edgeBZ - edgeAZ * edgeBY;\n const normalY = edgeAZ * edgeBX - edgeAX * edgeBZ;\n const normalZ = edgeAX * edgeBY - edgeAY * edgeBX;\n addNormal(normals, firstOffset, normalX, normalY, normalZ);\n addNormal(normals, secondOffset, normalX, normalY, normalZ);\n addNormal(normals, thirdOffset, normalX, normalY, normalZ);\n }\n for (let particle = 0; particle < this.simulation.particleCount; particle += 1) {\n const offset = particle * 3;\n const normalX = normals[offset] ?? 0;\n const normalY = normals[offset + 1] ?? 0;\n const normalZ = normals[offset + 2] ?? 1;\n const length = Math.hypot(normalX, normalY, normalZ) || 1;\n normals[offset] = normalX / length;\n normals[offset + 1] = normalY / length;\n normals[offset + 2] = normalZ / length;\n }\n }\n\n private projectParticles(): void {\n const positions = this.simulation.positions;\n for (let particle = 0; particle < this.simulation.particleCount; particle += 1) {\n const positionOffset = particle * 3;\n const relativeX = (positions[positionOffset] ?? 0) - this.cameraX;\n const relativeY = (positions[positionOffset + 1] ?? 0) - this.cameraY;\n const relativeZ = (positions[positionOffset + 2] ?? 0) - this.cameraZ;\n const viewX = relativeX * this.rightX + relativeY * this.rightY + relativeZ * this.rightZ;\n const viewY = relativeX * this.upX + relativeY * this.upY + relativeZ * this.upZ;\n const depth =\n relativeX * this.forwardX + relativeY * this.forwardY + relativeZ * this.forwardZ;\n const outputOffset = particle * 2;\n if (depth <= this.camera.near || depth >= this.camera.far) {\n this.projectedPositions[outputOffset] = Number.NaN;\n this.projectedPositions[outputOffset + 1] = Number.NaN;\n } else {\n const scale = this.focalLength / depth;\n this.projectedPositions[outputOffset] = this.cssWidth * 0.5 + viewX * scale;\n this.projectedPositions[outputOffset + 1] = this.cssHeight * 0.5 - viewY * scale;\n }\n this.projectedDepths[particle] = depth;\n }\n }\n\n private drawShadow(uniforms: ShaderUniforms): void {\n const gl = this.context;\n const shadow = this.shadowColor;\n const passCount = SHADOW_KERNEL.length / 2;\n const radius = Math.max(0, this.material.shadowBlur) * 0.36;\n gl.disable(gl.DEPTH_TEST);\n gl.depthMask(false);\n gl.uniform1i(uniforms.shadowPass, 1);\n gl.uniform4f(\n uniforms.shadowColor,\n shadow[0] ?? 0,\n shadow[1] ?? 0,\n shadow[2] ?? 0,\n (shadow[3] ?? 0) / passCount,\n );\n for (let kernel = 0; kernel < SHADOW_KERNEL.length; kernel += 2) {\n const offsetX = this.material.shadowOffsetX + (SHADOW_KERNEL[kernel] ?? 0) * radius;\n const offsetY = this.material.shadowOffsetY + (SHADOW_KERNEL[kernel + 1] ?? 0) * radius;\n gl.uniform2f(\n uniforms.screenOffset,\n (offsetX * 2) / this.cssWidth,\n (-offsetY * 2) / this.cssHeight,\n );\n gl.drawElements(gl.TRIANGLES, this.indices.length, gl.UNSIGNED_INT, 0);\n this.drawCallsValue += 1;\n }\n }\n\n private syncShaderUniforms(uniforms: ShaderUniforms): void {\n const gl = this.context;\n const base = this.baseColor;\n const shadow = this.shadowColor;\n gl.uniformMatrix4fv(uniforms.viewProjection, false, this.viewProjectionMatrix);\n gl.uniform1i(uniforms.hasTexture, this.textureSource ? 1 : 0);\n gl.uniform4f(\n uniforms.baseColor,\n base[0] ?? 1,\n base[1] ?? 1,\n base[2] ?? 1,\n base[3] ?? 1,\n );\n gl.uniform4f(\n uniforms.shadowColor,\n shadow[0] ?? 0,\n shadow[1] ?? 0,\n shadow[2] ?? 0,\n shadow[3] ?? 0,\n );\n gl.uniform3f(uniforms.lightDirection, this.lightX, this.lightY, this.lightZ);\n gl.uniform3f(uniforms.cameraPosition, this.cameraX, this.cameraY, this.cameraZ);\n gl.uniform1i(uniforms.lightingEnabled, this.lighting.enabled ? 1 : 0);\n gl.uniform1f(uniforms.lightIntensity, this.lighting.intensity);\n gl.uniform1f(uniforms.ambient, this.material.ambient);\n gl.uniform1f(uniforms.diffuse, this.material.diffuse);\n gl.uniform1f(\n uniforms.specular,\n this.rendererOptions.preset === \"quality\" ? this.material.specular : 0,\n );\n gl.uniform1f(uniforms.shininess, this.material.shininess);\n gl.uniform1f(uniforms.foldContrast, this.material.foldContrast);\n }\n\n private updateCameraBasis(): void {\n const position = this.camera.position;\n if (position) {\n this.cameraX = position[0];\n this.cameraY = position[1];\n this.cameraZ = position[2];\n } else {\n const distance =\n (Math.max(this.simulation.width, this.simulation.height) * 0.65) /\n Math.tan((this.camera.fov * Math.PI) / 360);\n this.cameraX = 0;\n this.cameraY = 0;\n this.cameraZ = distance;\n }\n let forwardX = this.camera.lookAt[0] - this.cameraX;\n let forwardY = this.camera.lookAt[1] - this.cameraY;\n let forwardZ = this.camera.lookAt[2] - this.cameraZ;\n const forwardLength = Math.hypot(forwardX, forwardY, forwardZ) || 1;\n forwardX /= forwardLength;\n forwardY /= forwardLength;\n forwardZ /= forwardLength;\n this.forwardX = forwardX;\n this.forwardY = forwardY;\n this.forwardZ = forwardZ;\n\n let rightX = -forwardZ;\n let rightY = 0;\n let rightZ = forwardX;\n let rightLength = Math.hypot(rightX, rightY, rightZ);\n if (rightLength < 1e-7) {\n rightX = 1;\n rightY = 0;\n rightZ = 0;\n rightLength = 1;\n }\n this.rightX = rightX / rightLength;\n this.rightY = rightY / rightLength;\n this.rightZ = rightZ / rightLength;\n this.upX = this.rightY * forwardZ - this.rightZ * forwardY;\n this.upY = this.rightZ * forwardX - this.rightX * forwardZ;\n this.upZ = this.rightX * forwardY - this.rightY * forwardX;\n this.focalLength = this.cssHeight / (2 * Math.tan((this.camera.fov * Math.PI) / 360));\n this.updateViewProjection();\n }\n\n private updateViewProjection(): void {\n const view = this.viewMatrix;\n view[0] = this.rightX;\n view[1] = this.upX;\n view[2] = -this.forwardX;\n view[3] = 0;\n view[4] = this.rightY;\n view[5] = this.upY;\n view[6] = -this.forwardY;\n view[7] = 0;\n view[8] = this.rightZ;\n view[9] = this.upZ;\n view[10] = -this.forwardZ;\n view[11] = 0;\n view[12] =\n -(this.rightX * this.cameraX + this.rightY * this.cameraY + this.rightZ * this.cameraZ);\n view[13] = -(this.upX * this.cameraX + this.upY * this.cameraY + this.upZ * this.cameraZ);\n view[14] =\n this.forwardX * this.cameraX +\n this.forwardY * this.cameraY +\n this.forwardZ * this.cameraZ;\n view[15] = 1;\n\n const projection = this.projectionMatrix;\n projection.fill(0);\n const inverseTan = 1 / Math.tan((this.camera.fov * Math.PI) / 360);\n const aspect = this.cssWidth / this.cssHeight;\n const near = Math.max(0.0001, this.camera.near);\n const far = Math.max(near + 0.0001, this.camera.far);\n projection[0] = inverseTan / aspect;\n projection[5] = inverseTan;\n projection[10] = (far + near) / (near - far);\n projection[11] = -1;\n projection[14] = (2 * far * near) / (near - far);\n multiplyMatrix4(this.viewProjectionMatrix, projection, view);\n }\n\n private updateLightDirection(): void {\n const direction = this.lighting.direction;\n const length = Math.hypot(direction[0], direction[1], direction[2]) || 1;\n this.lightX = direction[0] / length;\n this.lightY = direction[1] / length;\n this.lightZ = direction[2] / length;\n }\n\n private updateColors(): void {\n this.baseColor = parseColor(this.material.baseColor, [1, 1, 1, 1]);\n this.shadowColor = parseColor(this.material.shadowColor, [0, 0, 0, 0.3]);\n this.backgroundColor = parseColor(this.rendererOptions.backgroundColor, [0, 0, 0, 0]);\n }\n\n private deleteResources(): void {\n const gl = this.context;\n if (this.texture) gl.deleteTexture(this.texture);\n if (this.indexBuffer) gl.deleteBuffer(this.indexBuffer);\n if (this.textureCoordinateBuffer) gl.deleteBuffer(this.textureCoordinateBuffer);\n if (this.normalBuffer) gl.deleteBuffer(this.normalBuffer);\n if (this.positionBuffer) gl.deleteBuffer(this.positionBuffer);\n if (this.vertexArray) gl.deleteVertexArray(this.vertexArray);\n if (this.program) gl.deleteProgram(this.program);\n this.texture = null;\n this.indexBuffer = null;\n this.textureCoordinateBuffer = null;\n this.normalBuffer = null;\n this.positionBuffer = null;\n this.vertexArray = null;\n this.uniforms = null;\n this.program = null;\n }\n\n private readonly onContextLost = (event: Event): void => {\n event.preventDefault();\n this.contextLost = true;\n };\n\n private readonly onContextRestored = (): void => {\n if (this.destroyed) return;\n this.contextLost = false;\n this.initializeResources();\n this.resize(this.cssWidth, this.cssHeight, this.pixelRatio);\n };\n}\n\nfunction compileShader(\n context: WebGL2RenderingContext,\n type: number,\n source: string,\n): WebGLShader {\n const shader = context.createShader(type);\n if (!shader) throw new Error(\"Unable to create a cloth shader.\");\n context.shaderSource(shader, source);\n context.compileShader(shader);\n if (!context.getShaderParameter(shader, context.COMPILE_STATUS)) {\n const details = context.getShaderInfoLog(shader) || \"Unknown compilation error.\";\n context.deleteShader(shader);\n throw new Error(`Unable to compile the cloth shader: ${details}`);\n }\n return shader;\n}\n\nfunction requiredUniform(\n context: WebGL2RenderingContext,\n program: WebGLProgram,\n name: string,\n): WebGLUniformLocation {\n const location = context.getUniformLocation(program, name);\n if (!location) throw new Error(`The cloth shader is missing uniform ${name}.`);\n return location;\n}\n\nfunction addNormal(\n normals: Float32Array,\n offset: number,\n normalX: number,\n normalY: number,\n normalZ: number,\n): void {\n normals[offset] = (normals[offset] ?? 0) + normalX;\n normals[offset + 1] = (normals[offset + 1] ?? 0) + normalY;\n normals[offset + 2] = (normals[offset + 2] ?? 0) + normalZ;\n}\n\nfunction multiplyMatrix4(\n output: Float32Array,\n left: Float32Array,\n right: Float32Array,\n): void {\n for (let column = 0; column < 4; column += 1) {\n const rightOffset = column * 4;\n const right0 = right[rightOffset] ?? 0;\n const right1 = right[rightOffset + 1] ?? 0;\n const right2 = right[rightOffset + 2] ?? 0;\n const right3 = right[rightOffset + 3] ?? 0;\n output[rightOffset] =\n (left[0] ?? 0) * right0 +\n (left[4] ?? 0) * right1 +\n (left[8] ?? 0) * right2 +\n (left[12] ?? 0) * right3;\n output[rightOffset + 1] =\n (left[1] ?? 0) * right0 +\n (left[5] ?? 0) * right1 +\n (left[9] ?? 0) * right2 +\n (left[13] ?? 0) * right3;\n output[rightOffset + 2] =\n (left[2] ?? 0) * right0 +\n (left[6] ?? 0) * right1 +\n (left[10] ?? 0) * right2 +\n (left[14] ?? 0) * right3;\n output[rightOffset + 3] =\n (left[3] ?? 0) * right0 +\n (left[7] ?? 0) * right1 +\n (left[11] ?? 0) * right2 +\n (left[15] ?? 0) * right3;\n }\n}\n\nfunction parseColor(\n value: string,\n fallback: readonly [number, number, number, number],\n): Float32Array<ArrayBuffer> {\n const output = new Float32Array(fallback);\n const color = value.trim().toLowerCase();\n if (color === \"transparent\") return new Float32Array([0, 0, 0, 0]);\n if (color === \"black\") return new Float32Array([0, 0, 0, 1]);\n if (color === \"white\") return new Float32Array([1, 1, 1, 1]);\n if (color.startsWith(\"#\")) {\n const hex = color.slice(1);\n if (hex.length === 3 || hex.length === 4) {\n output[0] = Number.parseInt(hex.charAt(0) + hex.charAt(0), 16) / 255;\n output[1] = Number.parseInt(hex.charAt(1) + hex.charAt(1), 16) / 255;\n output[2] = Number.parseInt(hex.charAt(2) + hex.charAt(2), 16) / 255;\n output[3] =\n hex.length === 4 ? Number.parseInt(hex.charAt(3) + hex.charAt(3), 16) / 255 : 1;\n return output;\n }\n if (hex.length === 6 || hex.length === 8) {\n output[0] = Number.parseInt(hex.slice(0, 2), 16) / 255;\n output[1] = Number.parseInt(hex.slice(2, 4), 16) / 255;\n output[2] = Number.parseInt(hex.slice(4, 6), 16) / 255;\n output[3] = hex.length === 8 ? Number.parseInt(hex.slice(6, 8), 16) / 255 : 1;\n return output;\n }\n }\n const match = color.match(/^rgba?\\(([^)]+)\\)$/);\n if (!match?.[1]) return output;\n const parts = match[1].split(\",\");\n if (parts.length < 3) return output;\n output[0] = parseColorChannel(parts[0] ?? \"0\");\n output[1] = parseColorChannel(parts[1] ?? \"0\");\n output[2] = parseColorChannel(parts[2] ?? \"0\");\n output[3] = parts[3] === undefined ? 1 : Math.min(1, Math.max(0, Number(parts[3])));\n return output;\n}\n\nfunction parseColorChannel(value: string): number {\n const trimmed = value.trim();\n const number = Number.parseFloat(trimmed);\n if (!Number.isFinite(number)) return 0;\n return trimmed.endsWith(\"%\")\n ? Math.min(1, Math.max(0, number / 100))\n : Math.min(1, Math.max(0, number / 255));\n}\n","export const CONSTRAINT_STRUCTURAL = 0;\nexport const CONSTRAINT_SHEAR = 1;\nexport const CONSTRAINT_BEND = 2;\n\nexport interface ConstraintSet {\n readonly first: Uint32Array;\n readonly second: Uint32Array;\n readonly restLength: Float32Array;\n readonly kind: Uint8Array;\n readonly count: number;\n}\n\n/** Builds each cloth link once. Particle indices are stored, not byte offsets. */\nexport function createConstraintSet(\n segmentsX: number,\n segmentsY: number,\n width: number,\n height: number,\n): ConstraintSet {\n const columns = segmentsX + 1;\n const rows = segmentsY + 1;\n const structuralCount = segmentsX * rows + segmentsY * columns;\n const shearCount = segmentsX * segmentsY * 2;\n const bendCount =\n Math.max(0, segmentsX - 1) * rows +\n Math.max(0, segmentsY - 1) * columns;\n const count = structuralCount + shearCount + bendCount;\n\n const first = new Uint32Array(count);\n const second = new Uint32Array(count);\n const restLength = new Float32Array(count);\n const kind = new Uint8Array(count);\n\n const horizontalLength = width / segmentsX;\n const verticalLength = height / segmentsY;\n const diagonalLength = Math.hypot(horizontalLength, verticalLength);\n let constraintIndex = 0;\n\n const add = (a: number, b: number, rest: number, type: number): void => {\n first[constraintIndex] = a;\n second[constraintIndex] = b;\n restLength[constraintIndex] = rest;\n kind[constraintIndex] = type;\n constraintIndex += 1;\n };\n\n for (let y = 0; y < rows; y += 1) {\n const rowStart = y * columns;\n for (let x = 0; x < segmentsX; x += 1) {\n add(\n rowStart + x,\n rowStart + x + 1,\n horizontalLength,\n CONSTRAINT_STRUCTURAL,\n );\n }\n }\n\n for (let y = 0; y < segmentsY; y += 1) {\n const rowStart = y * columns;\n for (let x = 0; x < columns; x += 1) {\n add(\n rowStart + x,\n rowStart + columns + x,\n verticalLength,\n CONSTRAINT_STRUCTURAL,\n );\n }\n }\n\n for (let y = 0; y < segmentsY; y += 1) {\n const rowStart = y * columns;\n for (let x = 0; x < segmentsX; x += 1) {\n const topLeft = rowStart + x;\n const bottomLeft = topLeft + columns;\n add(topLeft, bottomLeft + 1, diagonalLength, CONSTRAINT_SHEAR);\n add(topLeft + 1, bottomLeft, diagonalLength, CONSTRAINT_SHEAR);\n }\n }\n\n for (let y = 0; y < rows; y += 1) {\n const rowStart = y * columns;\n for (let x = 0; x < segmentsX - 1; x += 1) {\n add(rowStart + x, rowStart + x + 2, horizontalLength * 2, CONSTRAINT_BEND);\n }\n }\n\n for (let y = 0; y < segmentsY - 1; y += 1) {\n const rowStart = y * columns;\n for (let x = 0; x < columns; x += 1) {\n add(rowStart + x, rowStart + columns * 2 + x, verticalLength * 2, CONSTRAINT_BEND);\n }\n }\n\n return { first, second, restLength, kind, count };\n}\n","function hash(x: number, y: number, z: number): number {\n let value = Math.imul(x, 374761393) + Math.imul(y, 668265263) + Math.imul(z, 2147483647);\n value = Math.imul(value ^ (value >>> 13), 1274126177);\n return ((value ^ (value >>> 16)) >>> 0) / 4294967295;\n}\n\nfunction fade(value: number): number {\n return value * value * (3 - 2 * value);\n}\n\nfunction mix(a: number, b: number, amount: number): number {\n return a + (b - a) * amount;\n}\n\n/** Allocation-free trilinear value noise in the range 0..1. */\nexport function valueNoise3(x: number, y: number, z: number): number {\n const x0 = Math.floor(x);\n const y0 = Math.floor(y);\n const z0 = Math.floor(z);\n const xAmount = fade(x - x0);\n const yAmount = fade(y - y0);\n const zAmount = fade(z - z0);\n\n const lowerA = mix(hash(x0, y0, z0), hash(x0 + 1, y0, z0), xAmount);\n const lowerB = mix(hash(x0, y0 + 1, z0), hash(x0 + 1, y0 + 1, z0), xAmount);\n const upperA = mix(hash(x0, y0, z0 + 1), hash(x0 + 1, y0, z0 + 1), xAmount);\n const upperB = mix(\n hash(x0, y0 + 1, z0 + 1),\n hash(x0 + 1, y0 + 1, z0 + 1),\n xAmount,\n );\n\n return mix(mix(lowerA, lowerB, yAmount), mix(upperA, upperB, yAmount), zAmount);\n}\n","import type {\n Attachment,\n SimulationOptions,\n Vector3Tuple,\n WindOptions,\n} from \"../../types/options\";\nimport {\n CONSTRAINT_BEND,\n CONSTRAINT_SHEAR,\n createConstraintSet,\n type ConstraintSet,\n} from \"./constraints\";\nimport { valueNoise3 } from \"./noise\";\n\nexport interface ClothSimulationConfig {\n width: number;\n height: number;\n segmentsX: number;\n segmentsY: number;\n attachment: Attachment;\n simulation: SimulationOptions;\n wind: WindOptions;\n}\n\nexport class ClothSimulation {\n readonly width: number;\n readonly height: number;\n readonly segmentsX: number;\n readonly segmentsY: number;\n readonly columns: number;\n readonly rows: number;\n readonly particleCount: number;\n readonly positions: Float32Array;\n readonly previousPositions: Float32Array;\n readonly initialPositions: Float32Array;\n readonly forces: Float32Array;\n readonly inverseMass: Float32Array;\n readonly pinned: Uint8Array;\n readonly constraints: ConstraintSet;\n\n private simulation: SimulationOptions;\n private wind: WindOptions;\n private windDirectionX = 1;\n private windDirectionY = 0;\n private windDirectionZ = 0;\n private elapsedTime = 0;\n private readonly dragWeights: Float32Array;\n private dragParticles = new Uint32Array(0);\n private dragOffsets = new Float32Array(0);\n private dragParticleCount = 0;\n private dragTargetX = 0;\n private dragTargetY = 0;\n private dragTargetZ = 0;\n private dragStiffness = 0;\n private dragAllowsPinned = false;\n\n constructor(config: ClothSimulationConfig) {\n if (config.width <= 0 || config.height <= 0) {\n throw new RangeError(\"Cloth width and height must be greater than zero.\");\n }\n if (!Number.isInteger(config.segmentsX) || !Number.isInteger(config.segmentsY)) {\n throw new TypeError(\"Cloth segment counts must be integers.\");\n }\n if (config.segmentsX < 1 || config.segmentsY < 1) {\n throw new RangeError(\"Cloth segment counts must be at least one.\");\n }\n\n this.width = config.width;\n this.height = config.height;\n this.segmentsX = config.segmentsX;\n this.segmentsY = config.segmentsY;\n this.columns = config.segmentsX + 1;\n this.rows = config.segmentsY + 1;\n this.particleCount = this.columns * this.rows;\n this.positions = new Float32Array(this.particleCount * 3);\n this.previousPositions = new Float32Array(this.particleCount * 3);\n this.initialPositions = new Float32Array(this.particleCount * 3);\n this.forces = new Float32Array(this.particleCount * 3);\n this.inverseMass = new Float32Array(this.particleCount);\n this.pinned = new Uint8Array(this.particleCount);\n this.dragWeights = new Float32Array(this.particleCount);\n this.constraints = createConstraintSet(\n config.segmentsX,\n config.segmentsY,\n config.width,\n config.height,\n );\n this.simulation = { ...config.simulation };\n this.wind = { ...config.wind };\n\n this.initializeParticles();\n this.setAttachment(config.attachment);\n this.updateWindDirection();\n }\n\n get constraintCount(): number {\n return this.constraints.count;\n }\n\n get time(): number {\n return this.elapsedTime;\n }\n\n particleIndex(x: number, y: number): number {\n if (x < 0 || x >= this.columns || y < 0 || y >= this.rows) {\n return -1;\n }\n return y * this.columns + x;\n }\n\n isPinned(particleIndex: number): boolean {\n return this.pinned[particleIndex] === 1;\n }\n\n addForce(particleIndex: number, force: Vector3Tuple): void {\n if (particleIndex < 0 || particleIndex >= this.particleCount) return;\n const offset = particleIndex * 3;\n this.forces[offset] = (this.forces[offset] ?? 0) + force[0];\n this.forces[offset + 1] = (this.forces[offset + 1] ?? 0) + force[1];\n this.forces[offset + 2] = (this.forces[offset + 2] ?? 0) + force[2];\n }\n\n setWind(options: Partial<WindOptions>): void {\n this.wind = { ...this.wind, ...options };\n if (options.direction) this.updateWindDirection();\n }\n\n setSimulationOptions(options: Partial<SimulationOptions>): void {\n this.simulation = { ...this.simulation, ...options };\n if (options.mass !== undefined) this.updateInverseMass();\n }\n\n setAttachment(attachment: Attachment): void {\n this.pinned.fill(0);\n const pin = (x: number, y: number): void => {\n const index = this.particleIndex(x, y);\n if (index >= 0) this.pinned[index] = 1;\n };\n\n if (attachment === \"left\") this.pinEdge(\"left\", 1, 0);\n else if (attachment === \"right\") this.pinEdge(\"right\", 1, 0);\n else if (attachment === \"top\") this.pinEdge(\"top\", 1, 0);\n else if (attachment === \"bottom\") this.pinEdge(\"bottom\", 1, 0);\n else if (attachment === \"top-left\") pin(0, 0);\n else if (attachment === \"top-right\") pin(this.segmentsX, 0);\n else if (attachment === \"bottom-left\") pin(0, this.segmentsY);\n else if (attachment === \"bottom-right\") pin(this.segmentsX, this.segmentsY);\n else if (typeof attachment === \"object\" && \"edge\" in attachment) {\n this.pinEdge(attachment.edge, attachment.every ?? 1, attachment.offset ?? 0);\n } else if (typeof attachment === \"object\" && \"points\" in attachment) {\n for (let i = 0; i < attachment.points.length; i += 1) {\n const point = attachment.points[i];\n if (point) pin(Math.round(point[0]), Math.round(point[1]));\n }\n }\n\n this.updateInverseMass();\n this.enforcePins();\n }\n\n beginDrag(\n particleIndex: number,\n radius: number,\n stiffness: number,\n allowPinned: boolean,\n ): boolean {\n if (particleIndex < 0 || particleIndex >= this.particleCount) return false;\n if (this.isPinned(particleIndex) && !allowPinned) return false;\n\n this.clearDragWeights();\n const centerX = particleIndex % this.columns;\n const centerY = Math.floor(particleIndex / this.columns);\n const safeRadius = Math.max(0, radius);\n const integerRadius = Math.ceil(safeRadius);\n let count = 0;\n\n for (let y = centerY - integerRadius; y <= centerY + integerRadius; y += 1) {\n for (let x = centerX - integerRadius; x <= centerX + integerRadius; x += 1) {\n const candidate = this.particleIndex(x, y);\n if (candidate < 0 || (this.isPinned(candidate) && !allowPinned)) continue;\n const distance = Math.hypot(x - centerX, y - centerY);\n if (distance <= safeRadius || candidate === particleIndex) count += 1;\n }\n }\n\n this.dragParticles = new Uint32Array(count);\n this.dragOffsets = new Float32Array(count * 3);\n const centerOffset = particleIndex * 3;\n const centerPositionX = this.positions[centerOffset] ?? 0;\n const centerPositionY = this.positions[centerOffset + 1] ?? 0;\n const centerPositionZ = this.positions[centerOffset + 2] ?? 0;\n let dragIndex = 0;\n\n for (let y = centerY - integerRadius; y <= centerY + integerRadius; y += 1) {\n for (let x = centerX - integerRadius; x <= centerX + integerRadius; x += 1) {\n const candidate = this.particleIndex(x, y);\n if (candidate < 0 || (this.isPinned(candidate) && !allowPinned)) continue;\n const distance = Math.hypot(x - centerX, y - centerY);\n if (distance > safeRadius && candidate !== particleIndex) continue;\n\n const particleOffset = candidate * 3;\n const dragOffset = dragIndex * 3;\n this.dragParticles[dragIndex] = candidate;\n this.dragOffsets[dragOffset] = (this.positions[particleOffset] ?? 0) - centerPositionX;\n this.dragOffsets[dragOffset + 1] =\n (this.positions[particleOffset + 1] ?? 0) - centerPositionY;\n this.dragOffsets[dragOffset + 2] =\n (this.positions[particleOffset + 2] ?? 0) - centerPositionZ;\n this.dragWeights[candidate] =\n safeRadius === 0 ? 1 : Math.max(0.15, 1 - distance / (safeRadius + 1));\n dragIndex += 1;\n }\n }\n\n this.dragParticleCount = count;\n this.dragTargetX = centerPositionX;\n this.dragTargetY = centerPositionY;\n this.dragTargetZ = centerPositionZ;\n this.dragStiffness = Math.min(1, Math.max(0, stiffness));\n this.dragAllowsPinned = allowPinned;\n return true;\n }\n\n setDragTarget(x: number, y: number, z: number): void {\n this.dragTargetX = x;\n this.dragTargetY = y;\n this.dragTargetZ = z;\n }\n\n endDrag(releaseImpulse: Vector3Tuple = [0, 0, 0], timeStep = 1 / 60): void {\n for (let i = 0; i < this.dragParticleCount; i += 1) {\n const particle = this.dragParticles[i];\n if (particle === undefined) continue;\n const weight = this.dragWeights[particle] ?? 0;\n const offset = particle * 3;\n this.previousPositions[offset] =\n (this.previousPositions[offset] ?? 0) - releaseImpulse[0] * timeStep * weight;\n this.previousPositions[offset + 1] =\n (this.previousPositions[offset + 1] ?? 0) - releaseImpulse[1] * timeStep * weight;\n this.previousPositions[offset + 2] =\n (this.previousPositions[offset + 2] ?? 0) - releaseImpulse[2] * timeStep * weight;\n }\n this.clearDragWeights();\n this.dragParticleCount = 0;\n }\n\n step(timeStep: number): void {\n if (!Number.isFinite(timeStep) || timeStep <= 0) return;\n const substeps = Math.max(1, Math.floor(this.simulation.substeps));\n const substep = timeStep / substeps;\n for (let substepIndex = 0; substepIndex < substeps; substepIndex += 1) {\n this.applyWind(substep);\n this.integrate(substep);\n this.solveConstraints();\n this.elapsedTime += substep;\n }\n }\n\n reset(): void {\n this.positions.set(this.initialPositions);\n this.previousPositions.set(this.initialPositions);\n this.forces.fill(0);\n this.clearDragWeights();\n this.dragParticleCount = 0;\n this.elapsedTime = 0;\n this.enforcePins();\n }\n\n private initializeParticles(): void {\n // `mass` is the total cloth mass, so changing grid density does not make\n // the same-sized flag artificially heavier or less responsive to wind.\n const inverseMass = this.particleCount / Math.max(0.000001, this.simulation.mass);\n let particle = 0;\n for (let y = 0; y < this.rows; y += 1) {\n const yPosition = this.height * 0.5 - (y / this.segmentsY) * this.height;\n for (let x = 0; x < this.columns; x += 1) {\n const offset = particle * 3;\n this.positions[offset] = -this.width * 0.5 + (x / this.segmentsX) * this.width;\n this.positions[offset + 1] = yPosition;\n this.positions[offset + 2] = 0;\n this.inverseMass[particle] = inverseMass;\n particle += 1;\n }\n }\n this.previousPositions.set(this.positions);\n this.initialPositions.set(this.positions);\n }\n\n private updateInverseMass(): void {\n const inverseMass = this.particleCount / Math.max(0.000001, this.simulation.mass);\n for (let i = 0; i < this.particleCount; i += 1) {\n this.inverseMass[i] = this.pinned[i] === 1 ? 0 : inverseMass;\n }\n }\n\n private pinEdge(edge: \"left\" | \"right\" | \"top\" | \"bottom\", every: number, offset: number): void {\n const step = Math.max(1, Math.floor(every));\n const start = Math.max(0, Math.floor(offset));\n if (edge === \"left\" || edge === \"right\") {\n const x = edge === \"left\" ? 0 : this.segmentsX;\n for (let y = start; y < this.rows; y += step) {\n this.pinned[y * this.columns + x] = 1;\n }\n } else {\n const y = edge === \"top\" ? 0 : this.segmentsY;\n const rowStart = y * this.columns;\n for (let x = start; x < this.columns; x += step) {\n this.pinned[rowStart + x] = 1;\n }\n }\n }\n\n private integrate(timeStep: number): void {\n const timeStepSquared = timeStep * timeStep;\n const damping = Math.pow(Math.min(1, Math.max(0, this.simulation.damping)), timeStep * 60);\n const gravity = this.simulation.gravity;\n\n for (let particle = 0; particle < this.particleCount; particle += 1) {\n const offset = particle * 3;\n const inverseMass = this.inverseMass[particle] ?? 0;\n if (inverseMass === 0) {\n this.forces[offset] = 0;\n this.forces[offset + 1] = 0;\n this.forces[offset + 2] = 0;\n continue;\n }\n\n const positionX = this.positions[offset] ?? 0;\n const positionY = this.positions[offset + 1] ?? 0;\n const positionZ = this.positions[offset + 2] ?? 0;\n const velocityX = (positionX - (this.previousPositions[offset] ?? 0)) * damping;\n const velocityY = (positionY - (this.previousPositions[offset + 1] ?? 0)) * damping;\n const velocityZ = (positionZ - (this.previousPositions[offset + 2] ?? 0)) * damping;\n\n this.previousPositions[offset] = positionX;\n this.previousPositions[offset + 1] = positionY;\n this.previousPositions[offset + 2] = positionZ;\n this.positions[offset] =\n positionX + velocityX + (gravity[0] + (this.forces[offset] ?? 0) * inverseMass) * timeStepSquared;\n this.positions[offset + 1] =\n positionY +\n velocityY +\n (gravity[1] + (this.forces[offset + 1] ?? 0) * inverseMass) * timeStepSquared;\n this.positions[offset + 2] =\n positionZ +\n velocityZ +\n (gravity[2] + (this.forces[offset + 2] ?? 0) * inverseMass) * timeStepSquared;\n this.forces[offset] = 0;\n this.forces[offset + 1] = 0;\n this.forces[offset + 2] = 0;\n }\n }\n\n private solveConstraints(): void {\n const iterations = Math.max(1, Math.floor(this.simulation.constraintIterations));\n const structuralCorrection = this.iterationStiffness(\n this.simulation.structuralStiffness,\n iterations,\n );\n const shearCorrection = this.iterationStiffness(this.simulation.shearStiffness, iterations);\n const bendCorrection = this.iterationStiffness(this.simulation.bendStiffness, iterations);\n const maxCorrection = Math.max(0, this.simulation.maxCorrection);\n const first = this.constraints.first;\n const second = this.constraints.second;\n const restLength = this.constraints.restLength;\n const kind = this.constraints.kind;\n\n for (let iteration = 0; iteration < iterations; iteration += 1) {\n for (let constraint = 0; constraint < this.constraints.count; constraint += 1) {\n const firstParticle = first[constraint] ?? 0;\n const secondParticle = second[constraint] ?? 0;\n const firstOffset = firstParticle * 3;\n const secondOffset = secondParticle * 3;\n const deltaX = (this.positions[secondOffset] ?? 0) - (this.positions[firstOffset] ?? 0);\n const deltaY =\n (this.positions[secondOffset + 1] ?? 0) - (this.positions[firstOffset + 1] ?? 0);\n const deltaZ =\n (this.positions[secondOffset + 2] ?? 0) - (this.positions[firstOffset + 2] ?? 0);\n const distanceSquared = deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ;\n if (distanceSquared < 1e-12) continue;\n\n const distance = Math.sqrt(distanceSquared);\n let error = distance - (restLength[constraint] ?? 0);\n if (maxCorrection > 0) {\n error = Math.max(-maxCorrection, Math.min(maxCorrection, error));\n }\n const constraintKind = kind[constraint] ?? 0;\n const stiffness =\n constraintKind === CONSTRAINT_SHEAR\n ? shearCorrection\n : constraintKind === CONSTRAINT_BEND\n ? bendCorrection\n : structuralCorrection;\n const firstWeight = this.inverseMass[firstParticle] ?? 0;\n const secondWeight = this.inverseMass[secondParticle] ?? 0;\n const totalWeight = firstWeight + secondWeight;\n if (totalWeight === 0) continue;\n\n const correction = (error / distance) * stiffness;\n const firstShare = correction * (firstWeight / totalWeight);\n const secondShare = correction * (secondWeight / totalWeight);\n this.positions[firstOffset] = (this.positions[firstOffset] ?? 0) + deltaX * firstShare;\n this.positions[firstOffset + 1] =\n (this.positions[firstOffset + 1] ?? 0) + deltaY * firstShare;\n this.positions[firstOffset + 2] =\n (this.positions[firstOffset + 2] ?? 0) + deltaZ * firstShare;\n this.positions[secondOffset] = (this.positions[secondOffset] ?? 0) - deltaX * secondShare;\n this.positions[secondOffset + 1] =\n (this.positions[secondOffset + 1] ?? 0) - deltaY * secondShare;\n this.positions[secondOffset + 2] =\n (this.positions[secondOffset + 2] ?? 0) - deltaZ * secondShare;\n }\n\n this.solveDrag(iterations);\n this.enforcePins();\n }\n }\n\n private solveDrag(iterations: number): void {\n if (this.dragParticleCount === 0) return;\n const stiffness = this.iterationStiffness(this.dragStiffness, iterations);\n for (let i = 0; i < this.dragParticleCount; i += 1) {\n const particle = this.dragParticles[i];\n if (particle === undefined) continue;\n const particleOffset = particle * 3;\n const dragOffset = i * 3;\n const correction = stiffness * (this.dragWeights[particle] ?? 0);\n const targetX = this.dragTargetX + (this.dragOffsets[dragOffset] ?? 0);\n const targetY = this.dragTargetY + (this.dragOffsets[dragOffset + 1] ?? 0);\n const targetZ = this.dragTargetZ + (this.dragOffsets[dragOffset + 2] ?? 0);\n this.positions[particleOffset] =\n (this.positions[particleOffset] ?? 0) +\n (targetX - (this.positions[particleOffset] ?? 0)) * correction;\n this.positions[particleOffset + 1] =\n (this.positions[particleOffset + 1] ?? 0) +\n (targetY - (this.positions[particleOffset + 1] ?? 0)) * correction;\n this.positions[particleOffset + 2] =\n (this.positions[particleOffset + 2] ?? 0) +\n (targetZ - (this.positions[particleOffset + 2] ?? 0)) * correction;\n }\n }\n\n private enforcePins(): void {\n for (let particle = 0; particle < this.particleCount; particle += 1) {\n if (this.pinned[particle] !== 1) continue;\n if (this.dragAllowsPinned && (this.dragWeights[particle] ?? 0) > 0) continue;\n const offset = particle * 3;\n this.positions[offset] = this.initialPositions[offset] ?? 0;\n this.positions[offset + 1] = this.initialPositions[offset + 1] ?? 0;\n this.positions[offset + 2] = this.initialPositions[offset + 2] ?? 0;\n this.previousPositions[offset] = this.initialPositions[offset] ?? 0;\n this.previousPositions[offset + 1] = this.initialPositions[offset + 1] ?? 0;\n this.previousPositions[offset + 2] = this.initialPositions[offset + 2] ?? 0;\n }\n }\n\n private applyWind(timeStep: number): void {\n if (this.wind.strength === 0 || this.wind.aerodynamicCoefficient === 0) return;\n const positions = this.positions;\n const previous = this.previousPositions;\n const columns = this.columns;\n for (let y = 0; y < this.segmentsY; y += 1) {\n const rowStart = y * columns;\n for (let x = 0; x < this.segmentsX; x += 1) {\n const topLeft = rowStart + x;\n const topRight = topLeft + 1;\n const bottomLeft = topLeft + columns;\n const bottomRight = bottomLeft + 1;\n this.applyTriangleWind(topLeft, bottomLeft, topRight, positions, previous, timeStep);\n this.applyTriangleWind(topRight, bottomLeft, bottomRight, positions, previous, timeStep);\n }\n }\n }\n\n private applyTriangleWind(\n first: number,\n second: number,\n third: number,\n positions: Float32Array,\n previous: Float32Array,\n timeStep: number,\n ): void {\n const firstOffset = first * 3;\n const secondOffset = second * 3;\n const thirdOffset = third * 3;\n const firstX = positions[firstOffset] ?? 0;\n const firstY = positions[firstOffset + 1] ?? 0;\n const firstZ = positions[firstOffset + 2] ?? 0;\n const edgeAX = (positions[secondOffset] ?? 0) - firstX;\n const edgeAY = (positions[secondOffset + 1] ?? 0) - firstY;\n const edgeAZ = (positions[secondOffset + 2] ?? 0) - firstZ;\n const edgeBX = (positions[thirdOffset] ?? 0) - firstX;\n const edgeBY = (positions[thirdOffset + 1] ?? 0) - firstY;\n const edgeBZ = (positions[thirdOffset + 2] ?? 0) - firstZ;\n const normalX = edgeAY * edgeBZ - edgeAZ * edgeBY;\n const normalY = edgeAZ * edgeBX - edgeAX * edgeBZ;\n const normalZ = edgeAX * edgeBY - edgeAY * edgeBX;\n const doubleArea = Math.hypot(normalX, normalY, normalZ);\n if (doubleArea < 1e-10) return;\n\n const centroidX = (firstX + (positions[secondOffset] ?? 0) + (positions[thirdOffset] ?? 0)) / 3;\n const centroidY =\n (firstY + (positions[secondOffset + 1] ?? 0) + (positions[thirdOffset + 1] ?? 0)) / 3;\n const centroidZ =\n (firstZ + (positions[secondOffset + 2] ?? 0) + (positions[thirdOffset + 2] ?? 0)) / 3;\n const noiseTime = this.elapsedTime * Math.max(0, this.wind.gustFrequency);\n const spatialScale = Math.max(0.0001, this.wind.spatialScale);\n const noise =\n valueNoise3(centroidX * spatialScale, centroidY * spatialScale, noiseTime) * 2 - 1;\n const crossNoise =\n valueNoise3(centroidY * spatialScale + 17.1, centroidZ * spatialScale - 9.2, noiseTime + 5.4) *\n 2 -\n 1;\n const gust = 1 + noise * this.wind.turbulence;\n const lateral = this.wind.strength * this.wind.turbulence * 0.2 * crossNoise;\n const windX = this.windDirectionX * this.wind.strength * gust + lateral;\n const windY = this.windDirectionY * this.wind.strength * gust - lateral * 0.35;\n const windZ = this.windDirectionZ * this.wind.strength * gust + lateral * 0.5;\n\n const inverseTimeStep = 1 / Math.max(0.000001, timeStep);\n const velocityX =\n ((firstX - (previous[firstOffset] ?? 0)) +\n ((positions[secondOffset] ?? 0) - (previous[secondOffset] ?? 0)) +\n ((positions[thirdOffset] ?? 0) - (previous[thirdOffset] ?? 0))) *\n (inverseTimeStep / 3);\n const velocityY =\n ((firstY - (previous[firstOffset + 1] ?? 0)) +\n ((positions[secondOffset + 1] ?? 0) - (previous[secondOffset + 1] ?? 0)) +\n ((positions[thirdOffset + 1] ?? 0) - (previous[thirdOffset + 1] ?? 0))) *\n (inverseTimeStep / 3);\n const velocityZ =\n ((firstZ - (previous[firstOffset + 2] ?? 0)) +\n ((positions[secondOffset + 2] ?? 0) - (previous[secondOffset + 2] ?? 0)) +\n ((positions[thirdOffset + 2] ?? 0) - (previous[thirdOffset + 2] ?? 0))) *\n (inverseTimeStep / 3);\n const inverseNormalLength = 1 / doubleArea;\n const unitNormalX = normalX * inverseNormalLength;\n const unitNormalY = normalY * inverseNormalLength;\n const unitNormalZ = normalZ * inverseNormalLength;\n const relativeX = windX - velocityX;\n const relativeY = windY - velocityY;\n const relativeZ = windZ - velocityZ;\n const normalVelocity =\n relativeX * unitNormalX + relativeY * unitNormalY + relativeZ * unitNormalZ;\n const pressure =\n normalVelocity *\n Math.abs(normalVelocity) *\n this.wind.aerodynamicCoefficient *\n (doubleArea * 0.5);\n const sharedForceX = (unitNormalX * pressure) / 3;\n const sharedForceY = (unitNormalY * pressure) / 3;\n const sharedForceZ = (unitNormalZ * pressure) / 3;\n\n this.forces[firstOffset] = (this.forces[firstOffset] ?? 0) + sharedForceX;\n this.forces[firstOffset + 1] = (this.forces[firstOffset + 1] ?? 0) + sharedForceY;\n this.forces[firstOffset + 2] = (this.forces[firstOffset + 2] ?? 0) + sharedForceZ;\n this.forces[secondOffset] = (this.forces[secondOffset] ?? 0) + sharedForceX;\n this.forces[secondOffset + 1] = (this.forces[secondOffset + 1] ?? 0) + sharedForceY;\n this.forces[secondOffset + 2] = (this.forces[secondOffset + 2] ?? 0) + sharedForceZ;\n this.forces[thirdOffset] = (this.forces[thirdOffset] ?? 0) + sharedForceX;\n this.forces[thirdOffset + 1] = (this.forces[thirdOffset + 1] ?? 0) + sharedForceY;\n this.forces[thirdOffset + 2] = (this.forces[thirdOffset + 2] ?? 0) + sharedForceZ;\n }\n\n private updateWindDirection(): void {\n const direction = this.wind.direction;\n const length = Math.hypot(direction[0], direction[1], direction[2]);\n if (length < 1e-8) {\n this.windDirectionX = 0;\n this.windDirectionY = 0;\n this.windDirectionZ = 0;\n return;\n }\n this.windDirectionX = direction[0] / length;\n this.windDirectionY = direction[1] / length;\n this.windDirectionZ = direction[2] / length;\n }\n\n private iterationStiffness(stiffness: number, iterations: number): number {\n const safeStiffness = Math.min(1, Math.max(0, stiffness));\n return 1 - Math.pow(1 - safeStiffness, 1 / iterations);\n }\n\n private clearDragWeights(): void {\n for (let i = 0; i < this.dragParticleCount; i += 1) {\n const particle = this.dragParticles[i];\n if (particle !== undefined) this.dragWeights[particle] = 0;\n }\n this.dragAllowsPinned = false;\n }\n}\n","export class FixedTimeStep {\n private accumulator = 0;\n\n constructor(\n private fixedTimeStep: number,\n private maxFrameDelta: number,\n private maxStepsPerFrame = 8,\n ) {}\n\n configure(fixedTimeStep: number, maxFrameDelta: number): void {\n this.fixedTimeStep = fixedTimeStep;\n this.maxFrameDelta = maxFrameDelta;\n this.accumulator = Math.min(this.accumulator, fixedTimeStep);\n }\n\n advance(frameDelta: number, simulate: (timeStep: number) => void): number {\n if (!Number.isFinite(frameDelta) || frameDelta <= 0) return 0;\n const cappedDelta = Math.min(frameDelta, this.maxFrameDelta);\n this.accumulator += cappedDelta;\n let steps = 0;\n while (this.accumulator >= this.fixedTimeStep && steps < this.maxStepsPerFrame) {\n simulate(this.fixedTimeStep);\n this.accumulator -= this.fixedTimeStep;\n steps += 1;\n }\n if (steps === this.maxStepsPerFrame) {\n this.accumulator = Math.min(this.accumulator, this.fixedTimeStep);\n }\n return steps;\n }\n\n reset(): void {\n this.accumulator = 0;\n }\n}\n","import type {\n CameraOptions,\n ClothMaterialOptions,\n DebugOptions,\n FlagRendererOptions,\n FlagSegments,\n InteractionOptions,\n LightingOptions,\n SimulationOptions,\n VisibilityOptions,\n WindOptions,\n} from \"../types/options\";\n\nexport const DEFAULT_SEGMENTS: FlagSegments = { x: 32, y: 20 };\n\nexport const DEFAULT_WIND: WindOptions = {\n direction: [1, 0.08, 0.3],\n strength: 7,\n turbulence: 0.35,\n gustFrequency: 0.5,\n spatialScale: 0.8,\n aerodynamicCoefficient: 0.35,\n};\n\nexport const DEFAULT_SIMULATION: SimulationOptions = {\n damping: 0.985,\n gravity: [0, 0, 0],\n fixedTimeStep: 1 / 60,\n maxFrameDelta: 0.1,\n substeps: 2,\n constraintIterations: 6,\n structuralStiffness: 1,\n shearStiffness: 0.9,\n bendStiffness: 0.4,\n maxCorrection: 0.25,\n mass: 1,\n};\n\nexport const DEFAULT_INTERACTION: InteractionOptions = {\n enabled: true,\n dragRadius: 1,\n dragStiffness: 0.9,\n maxDragDistance: 4,\n allowPinned: false,\n releaseImpulse: [0, 0, 0],\n};\n\nexport const DEFAULT_RENDERER: FlagRendererOptions = {\n alpha: true,\n antialias: true,\n desynchronized: false,\n powerPreference: \"high-performance\",\n maxPixelRatio: 1.5,\n preset: \"quality\",\n textureFiltering: \"linear\",\n transparent: true,\n backgroundColor: \"transparent\",\n shadows: true,\n shadingUpdateInterval: 1,\n};\n\nexport const RENDERER_PRESET_DEFAULTS = {\n quality: {\n maxPixelRatio: 1.5,\n shadows: true,\n shadingUpdateInterval: 1,\n },\n performance: {\n maxPixelRatio: 1,\n shadows: false,\n shadingUpdateInterval: 2,\n },\n} as const;\n\nexport const DEFAULT_MATERIAL: ClothMaterialOptions = {\n baseColor: \"#f2f4f3\",\n ambient: 0.58,\n diffuse: 0.55,\n specular: 0.16,\n shininess: 18,\n foldContrast: 0.42,\n shadowColor: \"rgba(0, 0, 0, 0.3)\",\n shadowBlur: 18,\n shadowOffsetX: 10,\n shadowOffsetY: 12,\n};\n\nexport const DEFAULT_LIGHTING: LightingOptions = {\n enabled: true,\n intensity: 1,\n direction: [-0.4, 0.7, 1],\n};\n\nexport const DEFAULT_CAMERA: CameraOptions = {\n fov: 40,\n near: 0.01,\n far: 100,\n position: null,\n lookAt: [0, 0, 0],\n};\n\nexport const DEFAULT_VISIBILITY: VisibilityOptions = {\n pauseWhenOffscreen: true,\n pauseWhenDocumentHidden: true,\n};\n\nexport const DEFAULT_DEBUG: DebugOptions = {\n enabled: false,\n updateInterval: 500,\n};\n","import type { FlagClothStats } from \"../../types/options\";\n\nexport class DebugPanel {\n readonly element: HTMLDivElement;\n\n constructor(container: HTMLElement) {\n this.element = document.createElement(\"div\");\n this.element.setAttribute(\"data-flag-cloth-debug\", \"\");\n this.element.style.cssText =\n \"position:absolute;left:8px;top:8px;z-index:10;padding:7px 9px;\" +\n \"border-radius:5px;background:rgba(0,0,0,.72);color:#bfffd2;\" +\n \"font:11px/1.45 ui-monospace,SFMono-Regular,Consolas,monospace;pointer-events:none;white-space:pre\";\n this.element.textContent = \"flag-cloth\";\n container.appendChild(this.element);\n }\n\n update(stats: FlagClothStats): void {\n this.element.textContent =\n `FPS ${stats.fps.toFixed(0)}\\n` +\n `simulation ${stats.simulationMs.toFixed(2)} ms\\n` +\n `render ${stats.renderMs.toFixed(2)} ms\\n` +\n `particles ${stats.particleCount}\\n` +\n `constraints ${stats.constraintCount}\\n` +\n `draw calls ${stats.drawCalls}`;\n }\n\n destroy(): void {\n this.element.remove();\n }\n}\n","import type { InteractionOptions, Vector3Tuple } from \"../../types/options\";\nimport type { WebGLClothRenderer } from \"../rendering/WebGLClothRenderer\";\nimport type { ClothSimulation } from \"../simulation/ClothSimulation\";\n\nexport class PointerDragController {\n private renderer: WebGLClothRenderer;\n private simulation: ClothSimulation;\n private options: InteractionOptions;\n private fixedTimeStep: number;\n private readonly worldTarget = new Float32Array(3);\n private readonly screenPoint = new Float32Array(2);\n private activePointerId = -1;\n private selectedParticle = -1;\n private planeX = 0;\n private planeY = 0;\n private planeZ = 0;\n private grabOffsetX = 0;\n private grabOffsetY = 0;\n private grabOffsetZ = 0;\n private startTargetX = 0;\n private startTargetY = 0;\n private startTargetZ = 0;\n private destroyed = false;\n private readonly originalTouchAction: string;\n\n constructor(\n private readonly element: HTMLCanvasElement,\n renderer: WebGLClothRenderer,\n simulation: ClothSimulation,\n options: InteractionOptions,\n fixedTimeStep: number,\n ) {\n this.renderer = renderer;\n this.simulation = simulation;\n this.options = options;\n this.fixedTimeStep = fixedTimeStep;\n this.originalTouchAction = element.style.touchAction;\n this.syncTouchAction();\n element.addEventListener(\"pointerdown\", this.onPointerDown);\n element.addEventListener(\"pointermove\", this.onPointerMove);\n element.addEventListener(\"pointerup\", this.onPointerEnd);\n element.addEventListener(\"pointercancel\", this.onPointerEnd);\n element.addEventListener(\"lostpointercapture\", this.onLostPointerCapture);\n }\n\n setTargets(renderer: WebGLClothRenderer, simulation: ClothSimulation): void {\n if (this.activePointerId >= 0) this.releaseDrag();\n this.renderer = renderer;\n this.simulation = simulation;\n }\n\n setOptions(options: InteractionOptions, fixedTimeStep: number): void {\n this.options = options;\n this.fixedTimeStep = fixedTimeStep;\n if (!options.enabled && this.activePointerId >= 0) this.releaseDrag();\n this.syncTouchAction();\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.releaseDrag();\n this.element.removeEventListener(\"pointerdown\", this.onPointerDown);\n this.element.removeEventListener(\"pointermove\", this.onPointerMove);\n this.element.removeEventListener(\"pointerup\", this.onPointerEnd);\n this.element.removeEventListener(\"pointercancel\", this.onPointerEnd);\n this.element.removeEventListener(\"lostpointercapture\", this.onLostPointerCapture);\n this.element.style.touchAction = this.originalTouchAction;\n this.destroyed = true;\n }\n\n private readonly onPointerDown = (event: PointerEvent): void => {\n if (!this.options.enabled || this.activePointerId >= 0) return;\n if (event.pointerType === \"mouse\" && event.button !== 0) return;\n this.readPointerPosition(event);\n const screenX = this.screenPoint[0] ?? 0;\n const screenY = this.screenPoint[1] ?? 0;\n const particle = this.renderer.findParticleAt(screenX, screenY);\n if (\n !this.simulation.beginDrag(\n particle,\n this.options.dragRadius,\n this.options.dragStiffness,\n this.options.allowPinned,\n )\n ) {\n return;\n }\n\n const particleOffset = particle * 3;\n this.selectedParticle = particle;\n this.planeX = this.simulation.positions[particleOffset] ?? 0;\n this.planeY = this.simulation.positions[particleOffset + 1] ?? 0;\n this.planeZ = this.simulation.positions[particleOffset + 2] ?? 0;\n if (\n this.renderer.unprojectToPlane(\n screenX,\n screenY,\n this.planeX,\n this.planeY,\n this.planeZ,\n this.worldTarget,\n )\n ) {\n this.grabOffsetX = this.planeX - (this.worldTarget[0] ?? 0);\n this.grabOffsetY = this.planeY - (this.worldTarget[1] ?? 0);\n this.grabOffsetZ = this.planeZ - (this.worldTarget[2] ?? 0);\n } else {\n this.grabOffsetX = 0;\n this.grabOffsetY = 0;\n this.grabOffsetZ = 0;\n }\n this.startTargetX = this.planeX;\n this.startTargetY = this.planeY;\n this.startTargetZ = this.planeZ;\n this.activePointerId = event.pointerId;\n this.element.setPointerCapture(event.pointerId);\n event.preventDefault();\n };\n\n private readonly onPointerMove = (event: PointerEvent): void => {\n if (event.pointerId !== this.activePointerId || this.selectedParticle < 0) return;\n this.readPointerPosition(event);\n if (\n !this.renderer.unprojectToPlane(\n this.screenPoint[0] ?? 0,\n this.screenPoint[1] ?? 0,\n this.planeX,\n this.planeY,\n this.planeZ,\n this.worldTarget,\n )\n ) {\n return;\n }\n let targetX = (this.worldTarget[0] ?? 0) + this.grabOffsetX;\n let targetY = (this.worldTarget[1] ?? 0) + this.grabOffsetY;\n let targetZ = (this.worldTarget[2] ?? 0) + this.grabOffsetZ;\n const deltaX = targetX - this.startTargetX;\n const deltaY = targetY - this.startTargetY;\n const deltaZ = targetZ - this.startTargetZ;\n const distance = Math.hypot(deltaX, deltaY, deltaZ);\n const maximumDistance = Math.max(0, this.options.maxDragDistance);\n if (maximumDistance > 0 && distance > maximumDistance) {\n const scale = maximumDistance / distance;\n targetX = this.startTargetX + deltaX * scale;\n targetY = this.startTargetY + deltaY * scale;\n targetZ = this.startTargetZ + deltaZ * scale;\n }\n this.simulation.setDragTarget(targetX, targetY, targetZ);\n event.preventDefault();\n };\n\n private readonly onPointerEnd = (event: PointerEvent): void => {\n if (event.pointerId !== this.activePointerId) return;\n this.releaseDrag(this.options.releaseImpulse);\n };\n\n private readonly onLostPointerCapture = (event: PointerEvent): void => {\n if (event.pointerId === this.activePointerId) this.releaseDrag(this.options.releaseImpulse);\n };\n\n private readPointerPosition(event: PointerEvent): void {\n const bounds = this.element.getBoundingClientRect();\n this.screenPoint[0] =\n ((event.clientX - bounds.left) / Math.max(1, bounds.width)) * this.renderer.width;\n this.screenPoint[1] =\n ((event.clientY - bounds.top) / Math.max(1, bounds.height)) * this.renderer.height;\n }\n\n private releaseDrag(releaseImpulse: Vector3Tuple = [0, 0, 0]): void {\n if (this.activePointerId < 0) return;\n const pointerId = this.activePointerId;\n this.activePointerId = -1;\n this.selectedParticle = -1;\n this.simulation.endDrag(releaseImpulse, this.fixedTimeStep);\n if (this.element.hasPointerCapture(pointerId)) this.element.releasePointerCapture(pointerId);\n }\n\n private syncTouchAction(): void {\n this.element.style.touchAction = this.options.enabled ? \"none\" : this.originalTouchAction;\n }\n}\n","import type { TextureSource } from \"../../types/options\";\n\nexport async function loadTexture(source: TextureSource): Promise<TexImageSource | null> {\n if (source === null || typeof source !== \"string\") return source;\n const image = new Image();\n image.decoding = \"async\";\n image.crossOrigin = \"anonymous\";\n await new Promise<void>((resolve, reject) => {\n image.addEventListener(\"load\", () => resolve(), { once: true });\n image.addEventListener(\n \"error\",\n () => reject(new Error(`Unable to load cloth texture: ${source}`)),\n { once: true },\n );\n image.src = source;\n });\n return image;\n}\n","import type {\n Attachment,\n CameraOptions,\n ClothMaterialOptions,\n DebugOptions,\n FlagClothOptions,\n FlagClothStats,\n FlagClothUpdateOptions,\n FlagRendererOptions,\n FlagSegments,\n InteractionOptions,\n LightingOptions,\n SimulationOptions,\n TextureSource,\n VisibilityOptions,\n WindOptions,\n} from \"../types/options\";\nimport {\n DEFAULT_CAMERA,\n DEFAULT_DEBUG,\n DEFAULT_INTERACTION,\n DEFAULT_LIGHTING,\n DEFAULT_MATERIAL,\n DEFAULT_RENDERER,\n RENDERER_PRESET_DEFAULTS,\n DEFAULT_SEGMENTS,\n DEFAULT_SIMULATION,\n DEFAULT_VISIBILITY,\n DEFAULT_WIND,\n} from \"./defaults\";\nimport { DebugPanel } from \"./debug/DebugPanel\";\nimport { PointerDragController } from \"./interaction/PointerDragController\";\nimport { WebGLClothRenderer } from \"./rendering/WebGLClothRenderer\";\nimport { loadTexture } from \"./rendering/texture\";\nimport { ClothSimulation } from \"./simulation/ClothSimulation\";\nimport { FixedTimeStep } from \"./utilities/FixedTimeStep\";\n\ninterface ResolvedOptions {\n width: number;\n height: number;\n segments: FlagSegments;\n attachment: Attachment;\n wind: WindOptions;\n simulation: SimulationOptions;\n interaction: InteractionOptions;\n renderer: FlagRendererOptions;\n material: ClothMaterialOptions;\n lighting: LightingOptions;\n camera: CameraOptions;\n visibility: VisibilityOptions;\n debug: DebugOptions;\n}\n\nexport class FlagClothInstance {\n readonly container: HTMLElement;\n readonly canvas: HTMLCanvasElement;\n readonly context: WebGL2RenderingContext;\n readonly renderer: WebGLClothRenderer;\n ready: Promise<void>;\n\n private options: ResolvedOptions;\n private simulation: ClothSimulation;\n private fixedTimeStep: FixedTimeStep;\n private pointerController: PointerDragController;\n private currentTexture: TexImageSource | null = null;\n private readonly ownsCanvas: boolean;\n private readonly externalAnimationLoop: boolean;\n private canvasAppended = false;\n private resizeObserver: ResizeObserver | null = null;\n private intersectionObserver: IntersectionObserver | null = null;\n private debugPanel: DebugPanel | null = null;\n private textureRequest = 0;\n private animationFrame = 0;\n private lastFrameTime = 0;\n private started = false;\n private userPaused = false;\n private documentHidden = false;\n private offscreen = false;\n private destroyed = false;\n private lastWidth = 0;\n private lastHeight = 0;\n private statsFrameCount = 0;\n private statsWindowStarted = 0;\n private lastDebugUpdate = 0;\n private readonly statsValue: FlagClothStats = {\n fps: 0,\n simulationMs: 0,\n renderMs: 0,\n particleCount: 0,\n constraintCount: 0,\n drawCalls: 0,\n };\n\n constructor(initialOptions: FlagClothOptions) {\n if (!initialOptions.container) {\n throw new TypeError(\"createFlagCloth requires a container element.\");\n }\n this.container = initialOptions.container;\n this.options = resolveOptions(initialOptions);\n this.ownsCanvas = !initialOptions.advanced?.canvas && !initialOptions.advanced?.context;\n this.externalAnimationLoop = initialOptions.advanced?.externalAnimationLoop ?? false;\n const contextCanvas = initialOptions.advanced?.context?.canvas;\n if (contextCanvas && !(contextCanvas instanceof HTMLCanvasElement)) {\n throw new TypeError(\"advanced.context must belong to an HTMLCanvasElement.\");\n }\n this.canvas =\n (contextCanvas as HTMLCanvasElement | undefined) ??\n initialOptions.advanced?.canvas ??\n document.createElement(\"canvas\");\n if (\n initialOptions.advanced?.canvas &&\n initialOptions.advanced.context &&\n initialOptions.advanced.context.canvas !== initialOptions.advanced.canvas\n ) {\n throw new TypeError(\"advanced.canvas and advanced.context must refer to the same canvas.\");\n }\n const context =\n initialOptions.advanced?.context ??\n this.canvas.getContext(\"webgl2\", {\n alpha: this.options.renderer.alpha,\n antialias: this.options.renderer.antialias,\n desynchronized: this.options.renderer.desynchronized,\n powerPreference: this.options.renderer.powerPreference,\n premultipliedAlpha: true,\n preserveDrawingBuffer: false,\n });\n if (!context) throw new Error(\"A WebGL2 rendering context is required.\");\n this.context = context;\n\n this.simulation = this.createSimulation();\n this.renderer = new WebGLClothRenderer(\n this.canvas,\n this.context,\n this.simulation,\n this.options.renderer,\n this.options.material,\n this.options.lighting,\n this.options.camera,\n );\n this.canvas.style.display = \"block\";\n this.canvas.style.width = \"100%\";\n this.canvas.style.height = \"100%\";\n this.canvas.setAttribute(\"aria-label\", \"flag-cloth\");\n if (this.ownsCanvas) {\n this.container.appendChild(this.canvas);\n this.canvasAppended = true;\n }\n\n this.fixedTimeStep = new FixedTimeStep(\n this.options.simulation.fixedTimeStep,\n this.options.simulation.maxFrameDelta,\n );\n this.pointerController = new PointerDragController(\n this.canvas,\n this.renderer,\n this.simulation,\n this.options.interaction,\n this.options.simulation.fixedTimeStep,\n );\n this.statsValue.particleCount = this.simulation.particleCount;\n this.statsValue.constraintCount = this.simulation.constraintCount;\n this.setupResizeObserver();\n this.setupVisibilityObservers();\n this.syncDebugPanel();\n this.resize();\n this.ready = this.setTexture(initialOptions.texture);\n if (initialOptions.autoStart !== false) this.start();\n }\n\n get stats(): Readonly<FlagClothStats> {\n return this.statsValue;\n }\n\n get particleCount(): number {\n return this.simulation.particleCount;\n }\n\n get constraintCount(): number {\n return this.simulation.constraintCount;\n }\n\n start(): void {\n this.assertAlive();\n this.started = true;\n this.userPaused = false;\n this.lastFrameTime = 0;\n this.requestAnimationFrameIfNeeded();\n }\n\n pause(): void {\n if (this.destroyed) return;\n this.userPaused = true;\n this.cancelAnimationFrame();\n }\n\n resume(): void {\n this.assertAlive();\n this.started = true;\n this.userPaused = false;\n this.lastFrameTime = 0;\n this.requestAnimationFrameIfNeeded();\n }\n\n update(frameDelta: number, renderFrame = true): void {\n if (this.destroyed || !this.canAnimate()) return;\n const simulationStarted = performance.now();\n this.fixedTimeStep.advance(frameDelta, this.simulateStep);\n const simulationEnded = performance.now();\n this.statsValue.simulationMs = simulationEnded - simulationStarted;\n if (renderFrame) this.render();\n this.updateStats(simulationEnded);\n }\n\n render(): void {\n if (this.destroyed) return;\n const renderStarted = performance.now();\n this.renderer.render();\n this.statsValue.renderMs = performance.now() - renderStarted;\n this.statsValue.drawCalls = this.renderer.drawCalls;\n }\n\n resize(): void {\n if (this.destroyed) return;\n const width = Math.max(0, Math.floor(this.container.clientWidth));\n const height = Math.max(0, Math.floor(this.container.clientHeight));\n if (width === 0 || height === 0 || (width === this.lastWidth && height === this.lastHeight)) {\n return;\n }\n this.lastWidth = width;\n this.lastHeight = height;\n const deviceRatio = typeof window === \"undefined\" ? 1 : window.devicePixelRatio;\n this.renderer.resize(\n width,\n height,\n Math.min(deviceRatio, this.options.renderer.maxPixelRatio),\n );\n }\n\n async setTexture(source: TextureSource): Promise<void> {\n this.assertAlive();\n const request = ++this.textureRequest;\n const texture = await loadTexture(source);\n if (this.destroyed || request !== this.textureRequest) return;\n this.currentTexture = texture;\n this.renderer.setTexture(texture);\n }\n\n setWind(options: Partial<WindOptions>): void {\n this.assertAlive();\n this.options.wind = { ...this.options.wind, ...options };\n this.simulation.setWind(options);\n }\n\n async setOptions(update: FlagClothUpdateOptions): Promise<void> {\n this.assertAlive();\n const structureChanged =\n (update.width !== undefined && update.width !== this.options.width) ||\n (update.height !== undefined && update.height !== this.options.height) ||\n (update.segments?.x !== undefined && update.segments.x !== this.options.segments.x) ||\n (update.segments?.y !== undefined && update.segments.y !== this.options.segments.y);\n\n if (update.width !== undefined) this.options.width = update.width;\n if (update.height !== undefined) this.options.height = update.height;\n if (update.segments) this.options.segments = { ...this.options.segments, ...update.segments };\n if (update.attachment !== undefined) this.options.attachment = update.attachment;\n if (update.wind) this.options.wind = { ...this.options.wind, ...update.wind };\n if (update.simulation) {\n this.options.simulation = { ...this.options.simulation, ...update.simulation };\n this.fixedTimeStep.configure(\n this.options.simulation.fixedTimeStep,\n this.options.simulation.maxFrameDelta,\n );\n }\n if (update.interaction) {\n this.options.interaction = { ...this.options.interaction, ...update.interaction };\n }\n if (update.renderer) {\n this.options.renderer = resolveRendererOptions(this.options.renderer, update.renderer);\n }\n if (update.material) this.options.material = { ...this.options.material, ...update.material };\n if (update.lighting) this.options.lighting = { ...this.options.lighting, ...update.lighting };\n if (update.camera) this.options.camera = { ...this.options.camera, ...update.camera };\n if (update.visibility) {\n this.options.visibility = { ...this.options.visibility, ...update.visibility };\n }\n if (update.debug !== undefined) {\n this.options.debug = resolveDebugOptions(update.debug, this.options.debug);\n }\n\n if (structureChanged) this.rebuildCloth();\n else {\n if (update.attachment !== undefined) this.simulation.setAttachment(this.options.attachment);\n if (update.wind) this.simulation.setWind(update.wind);\n if (update.simulation) this.simulation.setSimulationOptions(update.simulation);\n }\n this.renderer.setOptions(\n this.options.renderer,\n this.options.material,\n this.options.lighting,\n this.options.camera,\n );\n if (structureChanged || update.renderer || update.camera) {\n this.lastWidth = 0;\n this.lastHeight = 0;\n this.resize();\n }\n this.pointerController.setOptions(\n this.options.interaction,\n this.options.simulation.fixedTimeStep,\n );\n if (update.visibility) this.setupVisibilityObservers();\n if (update.debug !== undefined) this.syncDebugPanel();\n if (update.texture !== undefined) await this.setTexture(update.texture);\n }\n\n reset(): void {\n this.assertAlive();\n this.fixedTimeStep.reset();\n this.simulation.reset();\n this.render();\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.started = false;\n this.textureRequest += 1;\n this.cancelAnimationFrame();\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n this.intersectionObserver?.disconnect();\n this.intersectionObserver = null;\n document.removeEventListener(\"visibilitychange\", this.onVisibilityChange);\n this.pointerController.destroy();\n this.debugPanel?.destroy();\n this.debugPanel = null;\n this.currentTexture = null;\n this.renderer.destroy();\n if (this.ownsCanvas && this.canvasAppended) this.canvas.remove();\n }\n\n private createSimulation(): ClothSimulation {\n return new ClothSimulation({\n width: this.options.width,\n height: this.options.height,\n segmentsX: this.options.segments.x,\n segmentsY: this.options.segments.y,\n attachment: this.options.attachment,\n simulation: this.options.simulation,\n wind: this.options.wind,\n });\n }\n\n private rebuildCloth(): void {\n this.simulation = this.createSimulation();\n this.renderer.setSimulation(this.simulation);\n this.renderer.setTexture(this.currentTexture);\n this.pointerController.setTargets(this.renderer, this.simulation);\n this.statsValue.particleCount = this.simulation.particleCount;\n this.statsValue.constraintCount = this.simulation.constraintCount;\n this.fixedTimeStep.reset();\n }\n\n private setupResizeObserver(): void {\n this.resizeObserver?.disconnect();\n if (typeof ResizeObserver === \"undefined\") return;\n this.resizeObserver = new ResizeObserver(this.onResizeObserved);\n this.resizeObserver.observe(this.container);\n }\n\n private setupVisibilityObservers(): void {\n this.intersectionObserver?.disconnect();\n this.intersectionObserver = null;\n document.removeEventListener(\"visibilitychange\", this.onVisibilityChange);\n this.offscreen = false;\n this.documentHidden = false;\n if (this.options.visibility.pauseWhenOffscreen && typeof IntersectionObserver !== \"undefined\") {\n this.intersectionObserver = new IntersectionObserver(this.onIntersection);\n this.intersectionObserver.observe(this.container);\n }\n if (this.options.visibility.pauseWhenDocumentHidden) {\n this.documentHidden = document.visibilityState === \"hidden\";\n document.addEventListener(\"visibilitychange\", this.onVisibilityChange);\n }\n this.syncAnimationState();\n }\n\n private syncDebugPanel(): void {\n if (this.options.debug.enabled && !this.debugPanel) {\n this.debugPanel = new DebugPanel(this.container);\n } else if (!this.options.debug.enabled && this.debugPanel) {\n this.debugPanel.destroy();\n this.debugPanel = null;\n }\n }\n\n private updateStats(now: number): void {\n if (this.statsWindowStarted === 0) this.statsWindowStarted = now;\n this.statsFrameCount += 1;\n const elapsed = now - this.statsWindowStarted;\n if (elapsed >= 500) {\n this.statsValue.fps = (this.statsFrameCount * 1000) / elapsed;\n this.statsFrameCount = 0;\n this.statsWindowStarted = now;\n }\n if (\n this.debugPanel &&\n now - this.lastDebugUpdate >= Math.max(100, this.options.debug.updateInterval)\n ) {\n this.debugPanel.update(this.statsValue);\n this.lastDebugUpdate = now;\n }\n }\n\n private readonly simulateStep = (timeStep: number): void => {\n this.simulation.step(timeStep);\n };\n\n private readonly onAnimationFrame = (timestamp: number): void => {\n this.animationFrame = 0;\n if (!this.canAnimate()) return;\n const delta = this.lastFrameTime === 0 ? 0 : (timestamp - this.lastFrameTime) / 1000;\n this.lastFrameTime = timestamp;\n this.update(delta, true);\n this.requestAnimationFrameIfNeeded();\n };\n\n private readonly onResizeObserved = (): void => this.resize();\n\n private readonly onIntersection = (entries: IntersectionObserverEntry[]): void => {\n const entry = entries[entries.length - 1];\n if (!entry) return;\n this.offscreen = !entry.isIntersecting;\n this.syncAnimationState();\n };\n\n private readonly onVisibilityChange = (): void => {\n this.documentHidden = document.visibilityState === \"hidden\";\n this.syncAnimationState();\n };\n\n private syncAnimationState(): void {\n if (this.canAnimate()) {\n this.lastFrameTime = 0;\n this.requestAnimationFrameIfNeeded();\n } else this.cancelAnimationFrame();\n }\n\n private canAnimate(): boolean {\n return this.started && !this.userPaused && !this.documentHidden && !this.offscreen;\n }\n\n private requestAnimationFrameIfNeeded(): void {\n if (\n this.externalAnimationLoop ||\n this.animationFrame !== 0 ||\n !this.canAnimate() ||\n typeof requestAnimationFrame === \"undefined\"\n ) {\n return;\n }\n this.animationFrame = requestAnimationFrame(this.onAnimationFrame);\n }\n\n private cancelAnimationFrame(): void {\n if (this.animationFrame === 0 || typeof cancelAnimationFrame === \"undefined\") return;\n cancelAnimationFrame(this.animationFrame);\n this.animationFrame = 0;\n }\n\n private assertAlive(): void {\n if (this.destroyed) throw new Error(\"This FlagCloth instance has been destroyed.\");\n }\n}\n\nexport function createFlagCloth(options: FlagClothOptions): FlagClothInstance {\n return new FlagClothInstance(options);\n}\n\nfunction resolveOptions(options: FlagClothOptions): ResolvedOptions {\n return {\n width: options.width ?? 3,\n height: options.height ?? 2,\n segments: { ...DEFAULT_SEGMENTS, ...options.segments },\n attachment: options.attachment ?? \"left\",\n wind: { ...DEFAULT_WIND, ...options.wind },\n simulation: { ...DEFAULT_SIMULATION, ...options.simulation },\n interaction: { ...DEFAULT_INTERACTION, ...options.interaction },\n renderer: resolveRendererOptions(DEFAULT_RENDERER, options.renderer ?? {}),\n material: { ...DEFAULT_MATERIAL, ...options.material },\n lighting: { ...DEFAULT_LIGHTING, ...options.lighting },\n camera: { ...DEFAULT_CAMERA, ...options.camera },\n visibility: { ...DEFAULT_VISIBILITY, ...options.visibility },\n debug: resolveDebugOptions(options.debug ?? false, DEFAULT_DEBUG),\n };\n}\n\nexport function resolveRendererOptions(\n current: FlagRendererOptions,\n update: Partial<FlagRendererOptions>,\n): FlagRendererOptions {\n const resolved = { ...current, ...update };\n if (update.preset !== undefined) {\n const preset = RENDERER_PRESET_DEFAULTS[update.preset];\n if (update.maxPixelRatio === undefined) resolved.maxPixelRatio = preset.maxPixelRatio;\n if (update.shadingUpdateInterval === undefined) {\n resolved.shadingUpdateInterval = preset.shadingUpdateInterval;\n }\n if (update.shadows === undefined) resolved.shadows = preset.shadows;\n }\n resolved.maxPixelRatio = Math.max(0.5, resolved.maxPixelRatio);\n return resolved;\n}\n\nfunction resolveDebugOptions(\n debug: boolean | Partial<DebugOptions>,\n current: DebugOptions,\n): DebugOptions {\n return typeof debug === \"boolean\" ? { ...current, enabled: debug } : { ...current, ...debug };\n}\n"]}