GPU cloth wind and pins — v27 Create a GPU fabric surface before applying wind. This 16-segment grid has 17×17 vertices; vertices 0, 8 and 16 lie along its first edge. Pin indices are specific to this grid layout, not universal model attachment locations. await createGPUMesh("fabric", "grid", { origin:{x:0,y:3,z:0}, size:{x:4,y:1,z:3}, resolution:16 }); await enableGPUMeshPhysics("fabric", { solver:"xpbd", mass:.015, damping:.25, gravity:{x:0,y:-9.81,z:0}, substeps:4, constraintIterations:24, stretchCompliance:1e-6, bendCompliance:2e-4, pinBoundary:false, pinnedVertices:[0,8,16] }); Apply air velocity to an existing GPU XPBD mesh. Wind is velocity in metres per second, not a force. It enables air drag. Set zero wind to remove the flow. setGPUMeshWind("fabric", 0, 0, 4); setGPUMeshWind("fabric", 0, 0, 0); Pin one mesh vertex to a world position, or release it. Indices are zero-based. The initial mesh topology determines the indices. Reset restores original pins. setGPUMeshPin("fabric", 0, -2, 3, -1.5); releaseGPUMeshPin("fabric", 0); These are kinematic targets. Moving a pin does not return a reaction force to the object supplying its position. Use for flags, sails and controlled surface experiments. Dynamic attachment, self-collision, tearing and robust arbitrary cloth/body contact are not part of this release. Consult GPU_CLOTH.txt for the native experiments and their failures, rather than treating an API flag as a claim that every cloth contact case is solved. The force and constraint solve runs on GPU. The existing GPU mesh renderer draws from its GPU position buffers. Do not upload CPU vertex arrays each frame. Refresh the Game iframe after deployment; check gpuClothWind and gpuClothPins. Browser qualification remains pending for this cloth-control combination. A Chrome probe did not produce usable output; do not present native cloth tests as a browser pass. This is separate from the accepted beam/sculpting demos.