About this drop
The liquid is a particle fluid solved with double density relaxation (Clavet, Beaudoin and Poulin 2005), run as Jacobi passes in WGSL compute shaders through react-native-webgpu. Neighbours come from a counting sort into a grid rebuilt every substep, the wine glass is a two-sided collider in its own rotating frame so liquid can only leave over the rim, and a GPU free list recycles a fixed pool of 16,384 particles. useFluidRenderer takes Skia's Dawn device from Skia.getNativeDevice() and imports it into WebGPU, so the shaded frame is wrapped as an SkImage with no copy and no readback, then Skia composites it with a bloom and draws the glass on top. The whole frame loop is a worklet scheduled onto the UI thread with react-native-worklets; touches go through the React Native responder system on the JS thread and reach the loop as Reanimated shared values. expo-haptics fires splashes timed from the same ballistics the simulation runs, expo-sensors tilts gravity from the accelerometer, and the loop pauses when the app is backgrounded. If a frame owes more than 8 substeps the simulation slows down instead of skipping, and render scale is capped at 2x. Built on Expo SDK 57 (React Native 0.86). It needs a development build: Expo Go ships Skia v2 and this needs Skia v3 (Graphite). Android needs minSdk 26, set through expo-build-properties.