├── .gitignore ├── CREDITS.md ├── LICENSE ├── README.md ├── index.html ├── index.js ├── package-lock.json ├── package.json ├── src ├── app.js ├── assets │ ├── autumn_field_puresky_1k.hdr │ ├── box.obj │ ├── boxSlightlySmooth.obj │ ├── boxSmooth.obj │ ├── concrete_0016_ao_1k.jpg │ ├── concrete_0016_color_1k.jpg │ ├── concrete_0016_normal_opengl_1k.png │ └── concrete_0016_roughness_1k.jpg ├── backgroundGeometry.js ├── common │ ├── hsv.js │ └── noise.js ├── conf.js ├── info.js ├── lights.js └── mls-mpm │ ├── mlsMpmSimulator.js │ ├── particleRenderer.js │ ├── pointRenderer.js │ └── structuredArray.js └── vite.config.js /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /CREDITS.md: -------------------------------------------------------------------------------- 1 | ## Credits 2 | 3 | The scene and look are inspired by the great artworks of [Refik Anadol](https://refikanadol.com/). 4 | 5 | MLS-MPM implementation is heavily based on [WebGPU-Ocean](https://github.com/matsuoka-601/WebGPU-Ocean) by [matsuoka-601](https://github.com/matsuoka-601). 6 | 7 | [HDRi background](https://polyhaven.com/a/autumn_field_puresky) by Jarod Guest and Sergej Majboroda on [Polyhaven.com](https://polyhaven.com). 8 | 9 | [Concrete plaster wall texture](https://www.texturecan.com/details/216/) by [texturecan.com](https://texturecan.com). 10 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Holtsetio 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Flow 2 | 3 | This is a realtime MLS-MPM simulation, running in the browser using the three.js WebGPURenderer. 4 | 5 | It started as an implementation of MLS-MPM guided by [matsuoka-601](https://github.com/matsuoka-601)'s great [WebGPU-Ocean](https://github.com/matsuoka-601/WebGPU-Ocean) repo. Then the particle dynamics started to remind me of [Refik Anadol](https://refikanadol.com/)'s digital artworks, so I started to emulate his style instead of trying to render water. 6 | 7 | See it running live [here](https://holtsetio.com/lab/flow/)! 8 | 9 | [![flow](https://github.com/user-attachments/assets/c499ba90-34b2-4029-a663-f5518d756e60)](https://holtsetio.com/lab/flow/) 10 | 11 | ## Credits 12 | 13 | Full list of credits for the assets can be found [here](CREDITS.md) 14 | 15 | ## How to run 16 | ``` 17 | npm install 18 | npm run dev 19 | ``` 20 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Flow - ThreeJS WebGPU Experiment - holtsetio.com 9 | 62 | 63 | 64 | 65 |
66 |
67 |
68 |
69 |
70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | import * as THREE from "three/webgpu" 2 | import App from "./src/app"; 3 | THREE.ColorManagement.enabled = true 4 | 5 | const updateLoadingProgressBar = async (frac, delay=0) => { 6 | return new Promise(resolve => { 7 | const progress = document.getElementById("progress") 8 | // 200px is the width of the progress bar defined in index.html 9 | progress.style.width = `${frac * 200}px` 10 | if (delay === 0) { 11 | resolve(); 12 | } else { 13 | setTimeout(resolve, delay) 14 | } 15 | }) 16 | } 17 | 18 | const createRenderer = () => { 19 | const renderer = new THREE.WebGPURenderer({ 20 | //forceWebGL: true, 21 | //antialias: true, 22 | }); 23 | renderer.setPixelRatio(window.devicePixelRatio); 24 | renderer.setSize(window.innerWidth, window.innerHeight); 25 | renderer.outputColorSpace = THREE.SRGBColorSpace; 26 | return renderer; 27 | } 28 | 29 | const error = (msg) => { 30 | const progressBar = document.getElementById("progress-bar"); 31 | progressBar.style.opacity = 0; 32 | const error = document.getElementById("error"); 33 | error.style.visibility = "visible"; 34 | error.innerText = "Error: " + msg; 35 | const veil = document.getElementById("veil"); 36 | error.style.pointerEvents = "auto"; 37 | }; 38 | 39 | 40 | const run = async ()=>{ 41 | if (!navigator.gpu) { 42 | error("Your device does not support WebGPU."); 43 | return; 44 | } 45 | 46 | const renderer = createRenderer(); 47 | await (await renderer.init()); 48 | 49 | if (!renderer.backend.isWebGPUBackend) { 50 | error("Couldn't initialize WebGPU. Make sure WebGPU is supported by your Browser!"); 51 | return; 52 | } 53 | 54 | const container = document.getElementById("container"); 55 | container.appendChild(renderer.domElement); 56 | 57 | const app = new App(renderer); 58 | await app.init(updateLoadingProgressBar); 59 | 60 | const resize = () => { 61 | renderer.setSize(window.innerWidth, window.innerHeight); 62 | app.resize(window.innerWidth, window.innerHeight); 63 | } 64 | window.addEventListener("resize", resize); 65 | resize(); 66 | 67 | const veil = document.getElementById("veil"); 68 | veil.style.opacity = 0; 69 | const progressBar = document.getElementById("progress-bar"); 70 | progressBar.style.opacity = 0; 71 | const clock = new THREE.Clock(); 72 | const animate = async ()=>{ 73 | const delta = clock.getDelta(); 74 | const elapsed = clock.getElapsedTime(); 75 | await app.update(delta, elapsed); 76 | requestAnimationFrame(animate); 77 | }; 78 | requestAnimationFrame(animate); 79 | }; 80 | 81 | run().catch(error => { 82 | console.error(error); 83 | }); -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "enigma", 3 | "version": "0.0.1", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "enigma", 9 | "version": "0.0.1", 10 | "dependencies": { 11 | "@tweakpane/plugin-essentials": "^0.2.1", 12 | "is-mobile": "^5.0.0", 13 | "three": "^0.176.0", 14 | "tweakpane": "^4.0.5", 15 | "tweakpane-plugin-infodump": "^4.0.2" 16 | }, 17 | "devDependencies": { 18 | "@babel/generator": "^7.26.9", 19 | "@babel/parser": "^7.26.9", 20 | "@babel/traverse": "^7.26.9", 21 | "@babel/types": "^7.26.9", 22 | "vite": "^6.3.1", 23 | "vite-plugin-plain-text": "^1.4.2", 24 | "vite-plugin-tsl-operator": "^1.2.3" 25 | } 26 | }, 27 | "node_modules/@babel/code-frame": { 28 | "version": "7.27.1", 29 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", 30 | "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", 31 | "dev": true, 32 | "dependencies": { 33 | "@babel/helper-validator-identifier": "^7.27.1", 34 | "js-tokens": "^4.0.0", 35 | "picocolors": "^1.1.1" 36 | }, 37 | "engines": { 38 | "node": ">=6.9.0" 39 | } 40 | }, 41 | "node_modules/@babel/generator": { 42 | "version": "7.27.1", 43 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz", 44 | "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", 45 | "dev": true, 46 | "dependencies": { 47 | "@babel/parser": "^7.27.1", 48 | "@babel/types": "^7.27.1", 49 | "@jridgewell/gen-mapping": "^0.3.5", 50 | "@jridgewell/trace-mapping": "^0.3.25", 51 | "jsesc": "^3.0.2" 52 | }, 53 | "engines": { 54 | "node": ">=6.9.0" 55 | } 56 | }, 57 | "node_modules/@babel/helper-string-parser": { 58 | "version": "7.27.1", 59 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", 60 | "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", 61 | "dev": true, 62 | "engines": { 63 | "node": ">=6.9.0" 64 | } 65 | }, 66 | "node_modules/@babel/helper-validator-identifier": { 67 | "version": "7.27.1", 68 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", 69 | "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", 70 | "dev": true, 71 | "engines": { 72 | "node": ">=6.9.0" 73 | } 74 | }, 75 | "node_modules/@babel/parser": { 76 | "version": "7.27.1", 77 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.1.tgz", 78 | "integrity": "sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ==", 79 | "dev": true, 80 | "dependencies": { 81 | "@babel/types": "^7.27.1" 82 | }, 83 | "bin": { 84 | "parser": "bin/babel-parser.js" 85 | }, 86 | "engines": { 87 | "node": ">=6.0.0" 88 | } 89 | }, 90 | "node_modules/@babel/template": { 91 | "version": "7.27.1", 92 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.1.tgz", 93 | "integrity": "sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg==", 94 | "dev": true, 95 | "dependencies": { 96 | "@babel/code-frame": "^7.27.1", 97 | "@babel/parser": "^7.27.1", 98 | "@babel/types": "^7.27.1" 99 | }, 100 | "engines": { 101 | "node": ">=6.9.0" 102 | } 103 | }, 104 | "node_modules/@babel/traverse": { 105 | "version": "7.27.1", 106 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz", 107 | "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==", 108 | "dev": true, 109 | "dependencies": { 110 | "@babel/code-frame": "^7.27.1", 111 | "@babel/generator": "^7.27.1", 112 | "@babel/parser": "^7.27.1", 113 | "@babel/template": "^7.27.1", 114 | "@babel/types": "^7.27.1", 115 | "debug": "^4.3.1", 116 | "globals": "^11.1.0" 117 | }, 118 | "engines": { 119 | "node": ">=6.9.0" 120 | } 121 | }, 122 | "node_modules/@babel/types": { 123 | "version": "7.27.1", 124 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", 125 | "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", 126 | "dev": true, 127 | "dependencies": { 128 | "@babel/helper-string-parser": "^7.27.1", 129 | "@babel/helper-validator-identifier": "^7.27.1" 130 | }, 131 | "engines": { 132 | "node": ">=6.9.0" 133 | } 134 | }, 135 | "node_modules/@esbuild/aix-ppc64": { 136 | "version": "0.25.3", 137 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.3.tgz", 138 | "integrity": "sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==", 139 | "cpu": [ 140 | "ppc64" 141 | ], 142 | "dev": true, 143 | "optional": true, 144 | "os": [ 145 | "aix" 146 | ], 147 | "engines": { 148 | "node": ">=18" 149 | } 150 | }, 151 | "node_modules/@esbuild/android-arm": { 152 | "version": "0.25.3", 153 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.3.tgz", 154 | "integrity": "sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==", 155 | "cpu": [ 156 | "arm" 157 | ], 158 | "dev": true, 159 | "optional": true, 160 | "os": [ 161 | "android" 162 | ], 163 | "engines": { 164 | "node": ">=18" 165 | } 166 | }, 167 | "node_modules/@esbuild/android-arm64": { 168 | "version": "0.25.3", 169 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.3.tgz", 170 | "integrity": "sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==", 171 | "cpu": [ 172 | "arm64" 173 | ], 174 | "dev": true, 175 | "optional": true, 176 | "os": [ 177 | "android" 178 | ], 179 | "engines": { 180 | "node": ">=18" 181 | } 182 | }, 183 | "node_modules/@esbuild/android-x64": { 184 | "version": "0.25.3", 185 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.3.tgz", 186 | "integrity": "sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==", 187 | "cpu": [ 188 | "x64" 189 | ], 190 | "dev": true, 191 | "optional": true, 192 | "os": [ 193 | "android" 194 | ], 195 | "engines": { 196 | "node": ">=18" 197 | } 198 | }, 199 | "node_modules/@esbuild/darwin-arm64": { 200 | "version": "0.25.3", 201 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.3.tgz", 202 | "integrity": "sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==", 203 | "cpu": [ 204 | "arm64" 205 | ], 206 | "dev": true, 207 | "optional": true, 208 | "os": [ 209 | "darwin" 210 | ], 211 | "engines": { 212 | "node": ">=18" 213 | } 214 | }, 215 | "node_modules/@esbuild/darwin-x64": { 216 | "version": "0.25.3", 217 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.3.tgz", 218 | "integrity": "sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==", 219 | "cpu": [ 220 | "x64" 221 | ], 222 | "dev": true, 223 | "optional": true, 224 | "os": [ 225 | "darwin" 226 | ], 227 | "engines": { 228 | "node": ">=18" 229 | } 230 | }, 231 | "node_modules/@esbuild/freebsd-arm64": { 232 | "version": "0.25.3", 233 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.3.tgz", 234 | "integrity": "sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==", 235 | "cpu": [ 236 | "arm64" 237 | ], 238 | "dev": true, 239 | "optional": true, 240 | "os": [ 241 | "freebsd" 242 | ], 243 | "engines": { 244 | "node": ">=18" 245 | } 246 | }, 247 | "node_modules/@esbuild/freebsd-x64": { 248 | "version": "0.25.3", 249 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.3.tgz", 250 | "integrity": "sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==", 251 | "cpu": [ 252 | "x64" 253 | ], 254 | "dev": true, 255 | "optional": true, 256 | "os": [ 257 | "freebsd" 258 | ], 259 | "engines": { 260 | "node": ">=18" 261 | } 262 | }, 263 | "node_modules/@esbuild/linux-arm": { 264 | "version": "0.25.3", 265 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.3.tgz", 266 | "integrity": "sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==", 267 | "cpu": [ 268 | "arm" 269 | ], 270 | "dev": true, 271 | "optional": true, 272 | "os": [ 273 | "linux" 274 | ], 275 | "engines": { 276 | "node": ">=18" 277 | } 278 | }, 279 | "node_modules/@esbuild/linux-arm64": { 280 | "version": "0.25.3", 281 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.3.tgz", 282 | "integrity": "sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==", 283 | "cpu": [ 284 | "arm64" 285 | ], 286 | "dev": true, 287 | "optional": true, 288 | "os": [ 289 | "linux" 290 | ], 291 | "engines": { 292 | "node": ">=18" 293 | } 294 | }, 295 | "node_modules/@esbuild/linux-ia32": { 296 | "version": "0.25.3", 297 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.3.tgz", 298 | "integrity": "sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==", 299 | "cpu": [ 300 | "ia32" 301 | ], 302 | "dev": true, 303 | "optional": true, 304 | "os": [ 305 | "linux" 306 | ], 307 | "engines": { 308 | "node": ">=18" 309 | } 310 | }, 311 | "node_modules/@esbuild/linux-loong64": { 312 | "version": "0.25.3", 313 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.3.tgz", 314 | "integrity": "sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==", 315 | "cpu": [ 316 | "loong64" 317 | ], 318 | "dev": true, 319 | "optional": true, 320 | "os": [ 321 | "linux" 322 | ], 323 | "engines": { 324 | "node": ">=18" 325 | } 326 | }, 327 | "node_modules/@esbuild/linux-mips64el": { 328 | "version": "0.25.3", 329 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.3.tgz", 330 | "integrity": "sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==", 331 | "cpu": [ 332 | "mips64el" 333 | ], 334 | "dev": true, 335 | "optional": true, 336 | "os": [ 337 | "linux" 338 | ], 339 | "engines": { 340 | "node": ">=18" 341 | } 342 | }, 343 | "node_modules/@esbuild/linux-ppc64": { 344 | "version": "0.25.3", 345 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.3.tgz", 346 | "integrity": "sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==", 347 | "cpu": [ 348 | "ppc64" 349 | ], 350 | "dev": true, 351 | "optional": true, 352 | "os": [ 353 | "linux" 354 | ], 355 | "engines": { 356 | "node": ">=18" 357 | } 358 | }, 359 | "node_modules/@esbuild/linux-riscv64": { 360 | "version": "0.25.3", 361 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.3.tgz", 362 | "integrity": "sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==", 363 | "cpu": [ 364 | "riscv64" 365 | ], 366 | "dev": true, 367 | "optional": true, 368 | "os": [ 369 | "linux" 370 | ], 371 | "engines": { 372 | "node": ">=18" 373 | } 374 | }, 375 | "node_modules/@esbuild/linux-s390x": { 376 | "version": "0.25.3", 377 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.3.tgz", 378 | "integrity": "sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==", 379 | "cpu": [ 380 | "s390x" 381 | ], 382 | "dev": true, 383 | "optional": true, 384 | "os": [ 385 | "linux" 386 | ], 387 | "engines": { 388 | "node": ">=18" 389 | } 390 | }, 391 | "node_modules/@esbuild/linux-x64": { 392 | "version": "0.25.3", 393 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.3.tgz", 394 | "integrity": "sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==", 395 | "cpu": [ 396 | "x64" 397 | ], 398 | "dev": true, 399 | "optional": true, 400 | "os": [ 401 | "linux" 402 | ], 403 | "engines": { 404 | "node": ">=18" 405 | } 406 | }, 407 | "node_modules/@esbuild/netbsd-arm64": { 408 | "version": "0.25.3", 409 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.3.tgz", 410 | "integrity": "sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==", 411 | "cpu": [ 412 | "arm64" 413 | ], 414 | "dev": true, 415 | "optional": true, 416 | "os": [ 417 | "netbsd" 418 | ], 419 | "engines": { 420 | "node": ">=18" 421 | } 422 | }, 423 | "node_modules/@esbuild/netbsd-x64": { 424 | "version": "0.25.3", 425 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.3.tgz", 426 | "integrity": "sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==", 427 | "cpu": [ 428 | "x64" 429 | ], 430 | "dev": true, 431 | "optional": true, 432 | "os": [ 433 | "netbsd" 434 | ], 435 | "engines": { 436 | "node": ">=18" 437 | } 438 | }, 439 | "node_modules/@esbuild/openbsd-arm64": { 440 | "version": "0.25.3", 441 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.3.tgz", 442 | "integrity": "sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==", 443 | "cpu": [ 444 | "arm64" 445 | ], 446 | "dev": true, 447 | "optional": true, 448 | "os": [ 449 | "openbsd" 450 | ], 451 | "engines": { 452 | "node": ">=18" 453 | } 454 | }, 455 | "node_modules/@esbuild/openbsd-x64": { 456 | "version": "0.25.3", 457 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.3.tgz", 458 | "integrity": "sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==", 459 | "cpu": [ 460 | "x64" 461 | ], 462 | "dev": true, 463 | "optional": true, 464 | "os": [ 465 | "openbsd" 466 | ], 467 | "engines": { 468 | "node": ">=18" 469 | } 470 | }, 471 | "node_modules/@esbuild/sunos-x64": { 472 | "version": "0.25.3", 473 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.3.tgz", 474 | "integrity": "sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==", 475 | "cpu": [ 476 | "x64" 477 | ], 478 | "dev": true, 479 | "optional": true, 480 | "os": [ 481 | "sunos" 482 | ], 483 | "engines": { 484 | "node": ">=18" 485 | } 486 | }, 487 | "node_modules/@esbuild/win32-arm64": { 488 | "version": "0.25.3", 489 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.3.tgz", 490 | "integrity": "sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==", 491 | "cpu": [ 492 | "arm64" 493 | ], 494 | "dev": true, 495 | "optional": true, 496 | "os": [ 497 | "win32" 498 | ], 499 | "engines": { 500 | "node": ">=18" 501 | } 502 | }, 503 | "node_modules/@esbuild/win32-ia32": { 504 | "version": "0.25.3", 505 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.3.tgz", 506 | "integrity": "sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==", 507 | "cpu": [ 508 | "ia32" 509 | ], 510 | "dev": true, 511 | "optional": true, 512 | "os": [ 513 | "win32" 514 | ], 515 | "engines": { 516 | "node": ">=18" 517 | } 518 | }, 519 | "node_modules/@esbuild/win32-x64": { 520 | "version": "0.25.3", 521 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.3.tgz", 522 | "integrity": "sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==", 523 | "cpu": [ 524 | "x64" 525 | ], 526 | "dev": true, 527 | "optional": true, 528 | "os": [ 529 | "win32" 530 | ], 531 | "engines": { 532 | "node": ">=18" 533 | } 534 | }, 535 | "node_modules/@jridgewell/gen-mapping": { 536 | "version": "0.3.8", 537 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", 538 | "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", 539 | "dev": true, 540 | "dependencies": { 541 | "@jridgewell/set-array": "^1.2.1", 542 | "@jridgewell/sourcemap-codec": "^1.4.10", 543 | "@jridgewell/trace-mapping": "^0.3.24" 544 | }, 545 | "engines": { 546 | "node": ">=6.0.0" 547 | } 548 | }, 549 | "node_modules/@jridgewell/resolve-uri": { 550 | "version": "3.1.2", 551 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 552 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 553 | "dev": true, 554 | "engines": { 555 | "node": ">=6.0.0" 556 | } 557 | }, 558 | "node_modules/@jridgewell/set-array": { 559 | "version": "1.2.1", 560 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", 561 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 562 | "dev": true, 563 | "engines": { 564 | "node": ">=6.0.0" 565 | } 566 | }, 567 | "node_modules/@jridgewell/sourcemap-codec": { 568 | "version": "1.5.0", 569 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 570 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 571 | "dev": true 572 | }, 573 | "node_modules/@jridgewell/trace-mapping": { 574 | "version": "0.3.25", 575 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 576 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 577 | "dev": true, 578 | "dependencies": { 579 | "@jridgewell/resolve-uri": "^3.1.0", 580 | "@jridgewell/sourcemap-codec": "^1.4.14" 581 | } 582 | }, 583 | "node_modules/@napi-rs/magic-string": { 584 | "version": "0.3.4", 585 | "resolved": "https://registry.npmjs.org/@napi-rs/magic-string/-/magic-string-0.3.4.tgz", 586 | "integrity": "sha512-DEWl/B99RQsyMT3F9bvrXuhL01/eIQp/dtNSE3G1jQ4mTGRcP4iHWxoPZ577WrbjUinrNgvRA5+08g8fkPgimQ==", 587 | "dev": true, 588 | "engines": { 589 | "node": ">= 10" 590 | }, 591 | "optionalDependencies": { 592 | "@napi-rs/magic-string-android-arm-eabi": "0.3.4", 593 | "@napi-rs/magic-string-android-arm64": "0.3.4", 594 | "@napi-rs/magic-string-darwin-arm64": "0.3.4", 595 | "@napi-rs/magic-string-darwin-x64": "0.3.4", 596 | "@napi-rs/magic-string-freebsd-x64": "0.3.4", 597 | "@napi-rs/magic-string-linux-arm-gnueabihf": "0.3.4", 598 | "@napi-rs/magic-string-linux-arm64-gnu": "0.3.4", 599 | "@napi-rs/magic-string-linux-arm64-musl": "0.3.4", 600 | "@napi-rs/magic-string-linux-x64-gnu": "0.3.4", 601 | "@napi-rs/magic-string-linux-x64-musl": "0.3.4", 602 | "@napi-rs/magic-string-win32-arm64-msvc": "0.3.4", 603 | "@napi-rs/magic-string-win32-ia32-msvc": "0.3.4", 604 | "@napi-rs/magic-string-win32-x64-msvc": "0.3.4" 605 | } 606 | }, 607 | "node_modules/@napi-rs/magic-string-android-arm-eabi": { 608 | "version": "0.3.4", 609 | "resolved": "https://registry.npmjs.org/@napi-rs/magic-string-android-arm-eabi/-/magic-string-android-arm-eabi-0.3.4.tgz", 610 | "integrity": "sha512-sszAYxqtzzJ4FDerDNHcqL9NhqPhj8W4DNiOanXYy50mA5oojlRtaAFPiB5ZMrWDBM32v5Q30LrmxQ4eTtu2Dg==", 611 | "cpu": [ 612 | "arm" 613 | ], 614 | "dev": true, 615 | "optional": true, 616 | "os": [ 617 | "android" 618 | ], 619 | "engines": { 620 | "node": ">= 10" 621 | } 622 | }, 623 | "node_modules/@napi-rs/magic-string-android-arm64": { 624 | "version": "0.3.4", 625 | "resolved": "https://registry.npmjs.org/@napi-rs/magic-string-android-arm64/-/magic-string-android-arm64-0.3.4.tgz", 626 | "integrity": "sha512-jdQ6HuO0X5rkX4MauTcWR4HWdgjakTOmmzqXg8L26+jOHVVG1LZE+Su5qvV4bP8vMb2h+vPE+JsnwqSmWymu3Q==", 627 | "cpu": [ 628 | "arm64" 629 | ], 630 | "dev": true, 631 | "optional": true, 632 | "os": [ 633 | "android" 634 | ], 635 | "engines": { 636 | "node": ">= 10" 637 | } 638 | }, 639 | "node_modules/@napi-rs/magic-string-darwin-arm64": { 640 | "version": "0.3.4", 641 | "resolved": "https://registry.npmjs.org/@napi-rs/magic-string-darwin-arm64/-/magic-string-darwin-arm64-0.3.4.tgz", 642 | "integrity": "sha512-6NmMtvURce9/oq09XBZmuIeI6lPLGtEJ2ZPO/QzL3nLZa6wygiCnO/sFACKYNg5/73ET5HMMTeuogE1JI+r2Lw==", 643 | "cpu": [ 644 | "arm64" 645 | ], 646 | "dev": true, 647 | "optional": true, 648 | "os": [ 649 | "darwin" 650 | ], 651 | "engines": { 652 | "node": ">= 10" 653 | } 654 | }, 655 | "node_modules/@napi-rs/magic-string-darwin-x64": { 656 | "version": "0.3.4", 657 | "resolved": "https://registry.npmjs.org/@napi-rs/magic-string-darwin-x64/-/magic-string-darwin-x64-0.3.4.tgz", 658 | "integrity": "sha512-f9LmfMiUAKDOtl0meOuLYeVb6OERrgGzrTg1Tn3R3fTAShM2kxRbfAuPE9ljuXxIFzOv/uqRNLSl/LqCJwpREA==", 659 | "cpu": [ 660 | "x64" 661 | ], 662 | "dev": true, 663 | "optional": true, 664 | "os": [ 665 | "darwin" 666 | ], 667 | "engines": { 668 | "node": ">= 10" 669 | } 670 | }, 671 | "node_modules/@napi-rs/magic-string-freebsd-x64": { 672 | "version": "0.3.4", 673 | "resolved": "https://registry.npmjs.org/@napi-rs/magic-string-freebsd-x64/-/magic-string-freebsd-x64-0.3.4.tgz", 674 | "integrity": "sha512-rqduQ4odiDK4QdM45xHWRTU4wtFIfpp8g8QGpz+3qqg7ivldDqbbNOrBaf6Oeu77uuEvWggnkyuChotfKgJdJQ==", 675 | "cpu": [ 676 | "x64" 677 | ], 678 | "dev": true, 679 | "optional": true, 680 | "os": [ 681 | "freebsd" 682 | ], 683 | "engines": { 684 | "node": ">= 10" 685 | } 686 | }, 687 | "node_modules/@napi-rs/magic-string-linux-arm-gnueabihf": { 688 | "version": "0.3.4", 689 | "resolved": "https://registry.npmjs.org/@napi-rs/magic-string-linux-arm-gnueabihf/-/magic-string-linux-arm-gnueabihf-0.3.4.tgz", 690 | "integrity": "sha512-pVaJEdEpiPqIfq3M4+yMAATS7Z9muDcWYn8H7GFH1ygh8GwgLgKfy/n/lG2M6zp18Mwd0x7E2E/qg9GgCyUzoQ==", 691 | "cpu": [ 692 | "arm" 693 | ], 694 | "dev": true, 695 | "optional": true, 696 | "os": [ 697 | "linux" 698 | ], 699 | "engines": { 700 | "node": ">= 10" 701 | } 702 | }, 703 | "node_modules/@napi-rs/magic-string-linux-arm64-gnu": { 704 | "version": "0.3.4", 705 | "resolved": "https://registry.npmjs.org/@napi-rs/magic-string-linux-arm64-gnu/-/magic-string-linux-arm64-gnu-0.3.4.tgz", 706 | "integrity": "sha512-9FwoAih/0tzEZx0BjYYIxWkSRMjonIn91RFM3q3MBs/evmThXUYXUqLNa1PPIkK1JoksswtDi48qWWLt8nGflQ==", 707 | "cpu": [ 708 | "arm64" 709 | ], 710 | "dev": true, 711 | "optional": true, 712 | "os": [ 713 | "linux" 714 | ], 715 | "engines": { 716 | "node": ">= 10" 717 | } 718 | }, 719 | "node_modules/@napi-rs/magic-string-linux-arm64-musl": { 720 | "version": "0.3.4", 721 | "resolved": "https://registry.npmjs.org/@napi-rs/magic-string-linux-arm64-musl/-/magic-string-linux-arm64-musl-0.3.4.tgz", 722 | "integrity": "sha512-wCR7R+WPOcAKmVQc1s6h6HwfwW1vL9pM8BjUY9Ljkdb8wt1LmZEmV2Sgfc1SfbRQzbyl+pKeufP6adRRQVzYDA==", 723 | "cpu": [ 724 | "arm64" 725 | ], 726 | "dev": true, 727 | "optional": true, 728 | "os": [ 729 | "linux" 730 | ], 731 | "engines": { 732 | "node": ">= 10" 733 | } 734 | }, 735 | "node_modules/@napi-rs/magic-string-linux-x64-gnu": { 736 | "version": "0.3.4", 737 | "resolved": "https://registry.npmjs.org/@napi-rs/magic-string-linux-x64-gnu/-/magic-string-linux-x64-gnu-0.3.4.tgz", 738 | "integrity": "sha512-sbxFDpYnt5WFbxQ1xozwOvh5A7IftqSI0WnE9O7KsQIOi0ej2dvFbfOW4tmFkvH/YP8KJELo5AhP2+kEq1DpYA==", 739 | "cpu": [ 740 | "x64" 741 | ], 742 | "dev": true, 743 | "optional": true, 744 | "os": [ 745 | "linux" 746 | ], 747 | "engines": { 748 | "node": ">= 10" 749 | } 750 | }, 751 | "node_modules/@napi-rs/magic-string-linux-x64-musl": { 752 | "version": "0.3.4", 753 | "resolved": "https://registry.npmjs.org/@napi-rs/magic-string-linux-x64-musl/-/magic-string-linux-x64-musl-0.3.4.tgz", 754 | "integrity": "sha512-jN4h/7e2Ul8v3UK5IZu38NXLMdzVWhY4uEDlnwuUAhwRh26wBQ1/pLD97Uy/Z3dFNBQPcsv60XS9fOM1YDNT6w==", 755 | "cpu": [ 756 | "x64" 757 | ], 758 | "dev": true, 759 | "optional": true, 760 | "os": [ 761 | "linux" 762 | ], 763 | "engines": { 764 | "node": ">= 10" 765 | } 766 | }, 767 | "node_modules/@napi-rs/magic-string-win32-arm64-msvc": { 768 | "version": "0.3.4", 769 | "resolved": "https://registry.npmjs.org/@napi-rs/magic-string-win32-arm64-msvc/-/magic-string-win32-arm64-msvc-0.3.4.tgz", 770 | "integrity": "sha512-gMUyTRHLWpzX2ntJFCbW2Gnla9Y/WUmbkZuW5SBAo/Jo8QojHn76Y4PNgnoXdzcsV9b/45RBxurYKAfFg9WTyg==", 771 | "cpu": [ 772 | "arm64" 773 | ], 774 | "dev": true, 775 | "optional": true, 776 | "os": [ 777 | "win32" 778 | ], 779 | "engines": { 780 | "node": ">= 10" 781 | } 782 | }, 783 | "node_modules/@napi-rs/magic-string-win32-ia32-msvc": { 784 | "version": "0.3.4", 785 | "resolved": "https://registry.npmjs.org/@napi-rs/magic-string-win32-ia32-msvc/-/magic-string-win32-ia32-msvc-0.3.4.tgz", 786 | "integrity": "sha512-QIMauMOvEHgL00K9np/c9CT/CRtLOz3mRTQqcZ9XGzSoAMrpxH71KSpDJrKl7h7Ro6TZ+hJ0C3T+JVuTCZNv4A==", 787 | "cpu": [ 788 | "ia32" 789 | ], 790 | "dev": true, 791 | "optional": true, 792 | "os": [ 793 | "win32" 794 | ], 795 | "engines": { 796 | "node": ">= 10" 797 | } 798 | }, 799 | "node_modules/@napi-rs/magic-string-win32-x64-msvc": { 800 | "version": "0.3.4", 801 | "resolved": "https://registry.npmjs.org/@napi-rs/magic-string-win32-x64-msvc/-/magic-string-win32-x64-msvc-0.3.4.tgz", 802 | "integrity": "sha512-V8FMSf828MzOI3P6/765MR7zHU6CUZqiyPhmAnwYoKFNxfv7oCviN/G6NcENeCdcYOvNgh5fYzaNLB96ndId5A==", 803 | "cpu": [ 804 | "x64" 805 | ], 806 | "dev": true, 807 | "optional": true, 808 | "os": [ 809 | "win32" 810 | ], 811 | "engines": { 812 | "node": ">= 10" 813 | } 814 | }, 815 | "node_modules/@nodelib/fs.scandir": { 816 | "version": "2.1.5", 817 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 818 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 819 | "dev": true, 820 | "dependencies": { 821 | "@nodelib/fs.stat": "2.0.5", 822 | "run-parallel": "^1.1.9" 823 | }, 824 | "engines": { 825 | "node": ">= 8" 826 | } 827 | }, 828 | "node_modules/@nodelib/fs.stat": { 829 | "version": "2.0.5", 830 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 831 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 832 | "dev": true, 833 | "engines": { 834 | "node": ">= 8" 835 | } 836 | }, 837 | "node_modules/@nodelib/fs.walk": { 838 | "version": "1.2.8", 839 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 840 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 841 | "dev": true, 842 | "dependencies": { 843 | "@nodelib/fs.scandir": "2.1.5", 844 | "fastq": "^1.6.0" 845 | }, 846 | "engines": { 847 | "node": ">= 8" 848 | } 849 | }, 850 | "node_modules/@rollup/rollup-android-arm-eabi": { 851 | "version": "4.40.1", 852 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.1.tgz", 853 | "integrity": "sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw==", 854 | "cpu": [ 855 | "arm" 856 | ], 857 | "dev": true, 858 | "optional": true, 859 | "os": [ 860 | "android" 861 | ] 862 | }, 863 | "node_modules/@rollup/rollup-android-arm64": { 864 | "version": "4.40.1", 865 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.1.tgz", 866 | "integrity": "sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw==", 867 | "cpu": [ 868 | "arm64" 869 | ], 870 | "dev": true, 871 | "optional": true, 872 | "os": [ 873 | "android" 874 | ] 875 | }, 876 | "node_modules/@rollup/rollup-darwin-arm64": { 877 | "version": "4.40.1", 878 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.1.tgz", 879 | "integrity": "sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA==", 880 | "cpu": [ 881 | "arm64" 882 | ], 883 | "dev": true, 884 | "optional": true, 885 | "os": [ 886 | "darwin" 887 | ] 888 | }, 889 | "node_modules/@rollup/rollup-darwin-x64": { 890 | "version": "4.40.1", 891 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.1.tgz", 892 | "integrity": "sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw==", 893 | "cpu": [ 894 | "x64" 895 | ], 896 | "dev": true, 897 | "optional": true, 898 | "os": [ 899 | "darwin" 900 | ] 901 | }, 902 | "node_modules/@rollup/rollup-freebsd-arm64": { 903 | "version": "4.40.1", 904 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.1.tgz", 905 | "integrity": "sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw==", 906 | "cpu": [ 907 | "arm64" 908 | ], 909 | "dev": true, 910 | "optional": true, 911 | "os": [ 912 | "freebsd" 913 | ] 914 | }, 915 | "node_modules/@rollup/rollup-freebsd-x64": { 916 | "version": "4.40.1", 917 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.1.tgz", 918 | "integrity": "sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q==", 919 | "cpu": [ 920 | "x64" 921 | ], 922 | "dev": true, 923 | "optional": true, 924 | "os": [ 925 | "freebsd" 926 | ] 927 | }, 928 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 929 | "version": "4.40.1", 930 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.1.tgz", 931 | "integrity": "sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg==", 932 | "cpu": [ 933 | "arm" 934 | ], 935 | "dev": true, 936 | "optional": true, 937 | "os": [ 938 | "linux" 939 | ] 940 | }, 941 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 942 | "version": "4.40.1", 943 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.1.tgz", 944 | "integrity": "sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg==", 945 | "cpu": [ 946 | "arm" 947 | ], 948 | "dev": true, 949 | "optional": true, 950 | "os": [ 951 | "linux" 952 | ] 953 | }, 954 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 955 | "version": "4.40.1", 956 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.1.tgz", 957 | "integrity": "sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg==", 958 | "cpu": [ 959 | "arm64" 960 | ], 961 | "dev": true, 962 | "optional": true, 963 | "os": [ 964 | "linux" 965 | ] 966 | }, 967 | "node_modules/@rollup/rollup-linux-arm64-musl": { 968 | "version": "4.40.1", 969 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.1.tgz", 970 | "integrity": "sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ==", 971 | "cpu": [ 972 | "arm64" 973 | ], 974 | "dev": true, 975 | "optional": true, 976 | "os": [ 977 | "linux" 978 | ] 979 | }, 980 | "node_modules/@rollup/rollup-linux-loongarch64-gnu": { 981 | "version": "4.40.1", 982 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.1.tgz", 983 | "integrity": "sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ==", 984 | "cpu": [ 985 | "loong64" 986 | ], 987 | "dev": true, 988 | "optional": true, 989 | "os": [ 990 | "linux" 991 | ] 992 | }, 993 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 994 | "version": "4.40.1", 995 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.1.tgz", 996 | "integrity": "sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg==", 997 | "cpu": [ 998 | "ppc64" 999 | ], 1000 | "dev": true, 1001 | "optional": true, 1002 | "os": [ 1003 | "linux" 1004 | ] 1005 | }, 1006 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 1007 | "version": "4.40.1", 1008 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.1.tgz", 1009 | "integrity": "sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ==", 1010 | "cpu": [ 1011 | "riscv64" 1012 | ], 1013 | "dev": true, 1014 | "optional": true, 1015 | "os": [ 1016 | "linux" 1017 | ] 1018 | }, 1019 | "node_modules/@rollup/rollup-linux-riscv64-musl": { 1020 | "version": "4.40.1", 1021 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.1.tgz", 1022 | "integrity": "sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA==", 1023 | "cpu": [ 1024 | "riscv64" 1025 | ], 1026 | "dev": true, 1027 | "optional": true, 1028 | "os": [ 1029 | "linux" 1030 | ] 1031 | }, 1032 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 1033 | "version": "4.40.1", 1034 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.1.tgz", 1035 | "integrity": "sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg==", 1036 | "cpu": [ 1037 | "s390x" 1038 | ], 1039 | "dev": true, 1040 | "optional": true, 1041 | "os": [ 1042 | "linux" 1043 | ] 1044 | }, 1045 | "node_modules/@rollup/rollup-linux-x64-gnu": { 1046 | "version": "4.40.1", 1047 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.1.tgz", 1048 | "integrity": "sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ==", 1049 | "cpu": [ 1050 | "x64" 1051 | ], 1052 | "dev": true, 1053 | "optional": true, 1054 | "os": [ 1055 | "linux" 1056 | ] 1057 | }, 1058 | "node_modules/@rollup/rollup-linux-x64-musl": { 1059 | "version": "4.40.1", 1060 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.1.tgz", 1061 | "integrity": "sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ==", 1062 | "cpu": [ 1063 | "x64" 1064 | ], 1065 | "dev": true, 1066 | "optional": true, 1067 | "os": [ 1068 | "linux" 1069 | ] 1070 | }, 1071 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 1072 | "version": "4.40.1", 1073 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.1.tgz", 1074 | "integrity": "sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg==", 1075 | "cpu": [ 1076 | "arm64" 1077 | ], 1078 | "dev": true, 1079 | "optional": true, 1080 | "os": [ 1081 | "win32" 1082 | ] 1083 | }, 1084 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 1085 | "version": "4.40.1", 1086 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.1.tgz", 1087 | "integrity": "sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA==", 1088 | "cpu": [ 1089 | "ia32" 1090 | ], 1091 | "dev": true, 1092 | "optional": true, 1093 | "os": [ 1094 | "win32" 1095 | ] 1096 | }, 1097 | "node_modules/@rollup/rollup-win32-x64-msvc": { 1098 | "version": "4.40.1", 1099 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.1.tgz", 1100 | "integrity": "sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA==", 1101 | "cpu": [ 1102 | "x64" 1103 | ], 1104 | "dev": true, 1105 | "optional": true, 1106 | "os": [ 1107 | "win32" 1108 | ] 1109 | }, 1110 | "node_modules/@tweakpane/plugin-essentials": { 1111 | "version": "0.2.1", 1112 | "resolved": "https://registry.npmjs.org/@tweakpane/plugin-essentials/-/plugin-essentials-0.2.1.tgz", 1113 | "integrity": "sha512-VbFU1/uD+CJNFQdfLXUOLjeG5HyUZH97Ox9CxmyVetg1hqjVun3C83HAGFULyhKzl8tSgii8jr304r8QpdHwzQ==", 1114 | "peerDependencies": { 1115 | "tweakpane": "^4.0.0" 1116 | } 1117 | }, 1118 | "node_modules/@types/estree": { 1119 | "version": "1.0.7", 1120 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", 1121 | "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", 1122 | "dev": true 1123 | }, 1124 | "node_modules/balanced-match": { 1125 | "version": "1.0.2", 1126 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1127 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1128 | "dev": true 1129 | }, 1130 | "node_modules/brace-expansion": { 1131 | "version": "2.0.1", 1132 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1133 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1134 | "dev": true, 1135 | "dependencies": { 1136 | "balanced-match": "^1.0.0" 1137 | } 1138 | }, 1139 | "node_modules/braces": { 1140 | "version": "3.0.3", 1141 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 1142 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 1143 | "dev": true, 1144 | "dependencies": { 1145 | "fill-range": "^7.1.1" 1146 | }, 1147 | "engines": { 1148 | "node": ">=8" 1149 | } 1150 | }, 1151 | "node_modules/debug": { 1152 | "version": "4.4.0", 1153 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 1154 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 1155 | "dev": true, 1156 | "dependencies": { 1157 | "ms": "^2.1.3" 1158 | }, 1159 | "engines": { 1160 | "node": ">=6.0" 1161 | }, 1162 | "peerDependenciesMeta": { 1163 | "supports-color": { 1164 | "optional": true 1165 | } 1166 | } 1167 | }, 1168 | "node_modules/esbuild": { 1169 | "version": "0.25.3", 1170 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.3.tgz", 1171 | "integrity": "sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==", 1172 | "dev": true, 1173 | "hasInstallScript": true, 1174 | "bin": { 1175 | "esbuild": "bin/esbuild" 1176 | }, 1177 | "engines": { 1178 | "node": ">=18" 1179 | }, 1180 | "optionalDependencies": { 1181 | "@esbuild/aix-ppc64": "0.25.3", 1182 | "@esbuild/android-arm": "0.25.3", 1183 | "@esbuild/android-arm64": "0.25.3", 1184 | "@esbuild/android-x64": "0.25.3", 1185 | "@esbuild/darwin-arm64": "0.25.3", 1186 | "@esbuild/darwin-x64": "0.25.3", 1187 | "@esbuild/freebsd-arm64": "0.25.3", 1188 | "@esbuild/freebsd-x64": "0.25.3", 1189 | "@esbuild/linux-arm": "0.25.3", 1190 | "@esbuild/linux-arm64": "0.25.3", 1191 | "@esbuild/linux-ia32": "0.25.3", 1192 | "@esbuild/linux-loong64": "0.25.3", 1193 | "@esbuild/linux-mips64el": "0.25.3", 1194 | "@esbuild/linux-ppc64": "0.25.3", 1195 | "@esbuild/linux-riscv64": "0.25.3", 1196 | "@esbuild/linux-s390x": "0.25.3", 1197 | "@esbuild/linux-x64": "0.25.3", 1198 | "@esbuild/netbsd-arm64": "0.25.3", 1199 | "@esbuild/netbsd-x64": "0.25.3", 1200 | "@esbuild/openbsd-arm64": "0.25.3", 1201 | "@esbuild/openbsd-x64": "0.25.3", 1202 | "@esbuild/sunos-x64": "0.25.3", 1203 | "@esbuild/win32-arm64": "0.25.3", 1204 | "@esbuild/win32-ia32": "0.25.3", 1205 | "@esbuild/win32-x64": "0.25.3" 1206 | } 1207 | }, 1208 | "node_modules/fast-glob": { 1209 | "version": "3.3.3", 1210 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", 1211 | "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", 1212 | "dev": true, 1213 | "dependencies": { 1214 | "@nodelib/fs.stat": "^2.0.2", 1215 | "@nodelib/fs.walk": "^1.2.3", 1216 | "glob-parent": "^5.1.2", 1217 | "merge2": "^1.3.0", 1218 | "micromatch": "^4.0.8" 1219 | }, 1220 | "engines": { 1221 | "node": ">=8.6.0" 1222 | } 1223 | }, 1224 | "node_modules/fastq": { 1225 | "version": "1.19.1", 1226 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", 1227 | "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", 1228 | "dev": true, 1229 | "dependencies": { 1230 | "reusify": "^1.0.4" 1231 | } 1232 | }, 1233 | "node_modules/fdir": { 1234 | "version": "6.4.4", 1235 | "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", 1236 | "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", 1237 | "dev": true, 1238 | "peerDependencies": { 1239 | "picomatch": "^3 || ^4" 1240 | }, 1241 | "peerDependenciesMeta": { 1242 | "picomatch": { 1243 | "optional": true 1244 | } 1245 | } 1246 | }, 1247 | "node_modules/fill-range": { 1248 | "version": "7.1.1", 1249 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 1250 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 1251 | "dev": true, 1252 | "dependencies": { 1253 | "to-regex-range": "^5.0.1" 1254 | }, 1255 | "engines": { 1256 | "node": ">=8" 1257 | } 1258 | }, 1259 | "node_modules/fsevents": { 1260 | "version": "2.3.3", 1261 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1262 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1263 | "dev": true, 1264 | "hasInstallScript": true, 1265 | "optional": true, 1266 | "os": [ 1267 | "darwin" 1268 | ], 1269 | "engines": { 1270 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1271 | } 1272 | }, 1273 | "node_modules/glob-parent": { 1274 | "version": "5.1.2", 1275 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1276 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1277 | "dev": true, 1278 | "dependencies": { 1279 | "is-glob": "^4.0.1" 1280 | }, 1281 | "engines": { 1282 | "node": ">= 6" 1283 | } 1284 | }, 1285 | "node_modules/globals": { 1286 | "version": "11.12.0", 1287 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 1288 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 1289 | "dev": true, 1290 | "engines": { 1291 | "node": ">=4" 1292 | } 1293 | }, 1294 | "node_modules/is-extglob": { 1295 | "version": "2.1.1", 1296 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1297 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1298 | "dev": true, 1299 | "engines": { 1300 | "node": ">=0.10.0" 1301 | } 1302 | }, 1303 | "node_modules/is-glob": { 1304 | "version": "4.0.3", 1305 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1306 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1307 | "dev": true, 1308 | "dependencies": { 1309 | "is-extglob": "^2.1.1" 1310 | }, 1311 | "engines": { 1312 | "node": ">=0.10.0" 1313 | } 1314 | }, 1315 | "node_modules/is-mobile": { 1316 | "version": "5.0.0", 1317 | "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-5.0.0.tgz", 1318 | "integrity": "sha512-Tz/yndySvLAEXh+Uk8liFCxOwVH6YutuR74utvOcu7I9Di+DwM0mtdPVZNaVvvBUM2OXxne/NhOs1zAO7riusQ==" 1319 | }, 1320 | "node_modules/is-number": { 1321 | "version": "7.0.0", 1322 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1323 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1324 | "dev": true, 1325 | "engines": { 1326 | "node": ">=0.12.0" 1327 | } 1328 | }, 1329 | "node_modules/js-tokens": { 1330 | "version": "4.0.0", 1331 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1332 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1333 | "dev": true 1334 | }, 1335 | "node_modules/jsesc": { 1336 | "version": "3.1.0", 1337 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", 1338 | "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", 1339 | "dev": true, 1340 | "bin": { 1341 | "jsesc": "bin/jsesc" 1342 | }, 1343 | "engines": { 1344 | "node": ">=6" 1345 | } 1346 | }, 1347 | "node_modules/merge2": { 1348 | "version": "1.4.1", 1349 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1350 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1351 | "dev": true, 1352 | "engines": { 1353 | "node": ">= 8" 1354 | } 1355 | }, 1356 | "node_modules/micromatch": { 1357 | "version": "4.0.8", 1358 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 1359 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 1360 | "dev": true, 1361 | "dependencies": { 1362 | "braces": "^3.0.3", 1363 | "picomatch": "^2.3.1" 1364 | }, 1365 | "engines": { 1366 | "node": ">=8.6" 1367 | } 1368 | }, 1369 | "node_modules/micromatch/node_modules/picomatch": { 1370 | "version": "2.3.1", 1371 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1372 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1373 | "dev": true, 1374 | "engines": { 1375 | "node": ">=8.6" 1376 | }, 1377 | "funding": { 1378 | "url": "https://github.com/sponsors/jonschlinkert" 1379 | } 1380 | }, 1381 | "node_modules/minimatch": { 1382 | "version": "6.2.0", 1383 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-6.2.0.tgz", 1384 | "integrity": "sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==", 1385 | "dev": true, 1386 | "dependencies": { 1387 | "brace-expansion": "^2.0.1" 1388 | }, 1389 | "engines": { 1390 | "node": ">=10" 1391 | }, 1392 | "funding": { 1393 | "url": "https://github.com/sponsors/isaacs" 1394 | } 1395 | }, 1396 | "node_modules/ms": { 1397 | "version": "2.1.3", 1398 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1399 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1400 | "dev": true 1401 | }, 1402 | "node_modules/nanoid": { 1403 | "version": "3.3.11", 1404 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", 1405 | "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", 1406 | "dev": true, 1407 | "funding": [ 1408 | { 1409 | "type": "github", 1410 | "url": "https://github.com/sponsors/ai" 1411 | } 1412 | ], 1413 | "bin": { 1414 | "nanoid": "bin/nanoid.cjs" 1415 | }, 1416 | "engines": { 1417 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1418 | } 1419 | }, 1420 | "node_modules/picocolors": { 1421 | "version": "1.1.1", 1422 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 1423 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 1424 | "dev": true 1425 | }, 1426 | "node_modules/picomatch": { 1427 | "version": "4.0.2", 1428 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", 1429 | "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", 1430 | "dev": true, 1431 | "engines": { 1432 | "node": ">=12" 1433 | }, 1434 | "funding": { 1435 | "url": "https://github.com/sponsors/jonschlinkert" 1436 | } 1437 | }, 1438 | "node_modules/postcss": { 1439 | "version": "8.5.3", 1440 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", 1441 | "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", 1442 | "dev": true, 1443 | "funding": [ 1444 | { 1445 | "type": "opencollective", 1446 | "url": "https://opencollective.com/postcss/" 1447 | }, 1448 | { 1449 | "type": "tidelift", 1450 | "url": "https://tidelift.com/funding/github/npm/postcss" 1451 | }, 1452 | { 1453 | "type": "github", 1454 | "url": "https://github.com/sponsors/ai" 1455 | } 1456 | ], 1457 | "dependencies": { 1458 | "nanoid": "^3.3.8", 1459 | "picocolors": "^1.1.1", 1460 | "source-map-js": "^1.2.1" 1461 | }, 1462 | "engines": { 1463 | "node": "^10 || ^12 || >=14" 1464 | } 1465 | }, 1466 | "node_modules/queue-microtask": { 1467 | "version": "1.2.3", 1468 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1469 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1470 | "dev": true, 1471 | "funding": [ 1472 | { 1473 | "type": "github", 1474 | "url": "https://github.com/sponsors/feross" 1475 | }, 1476 | { 1477 | "type": "patreon", 1478 | "url": "https://www.patreon.com/feross" 1479 | }, 1480 | { 1481 | "type": "consulting", 1482 | "url": "https://feross.org/support" 1483 | } 1484 | ] 1485 | }, 1486 | "node_modules/reusify": { 1487 | "version": "1.1.0", 1488 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", 1489 | "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", 1490 | "dev": true, 1491 | "engines": { 1492 | "iojs": ">=1.0.0", 1493 | "node": ">=0.10.0" 1494 | } 1495 | }, 1496 | "node_modules/rollup": { 1497 | "version": "4.40.1", 1498 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.1.tgz", 1499 | "integrity": "sha512-C5VvvgCCyfyotVITIAv+4efVytl5F7wt+/I2i9q9GZcEXW9BP52YYOXC58igUi+LFZVHukErIIqQSWwv/M3WRw==", 1500 | "dev": true, 1501 | "dependencies": { 1502 | "@types/estree": "1.0.7" 1503 | }, 1504 | "bin": { 1505 | "rollup": "dist/bin/rollup" 1506 | }, 1507 | "engines": { 1508 | "node": ">=18.0.0", 1509 | "npm": ">=8.0.0" 1510 | }, 1511 | "optionalDependencies": { 1512 | "@rollup/rollup-android-arm-eabi": "4.40.1", 1513 | "@rollup/rollup-android-arm64": "4.40.1", 1514 | "@rollup/rollup-darwin-arm64": "4.40.1", 1515 | "@rollup/rollup-darwin-x64": "4.40.1", 1516 | "@rollup/rollup-freebsd-arm64": "4.40.1", 1517 | "@rollup/rollup-freebsd-x64": "4.40.1", 1518 | "@rollup/rollup-linux-arm-gnueabihf": "4.40.1", 1519 | "@rollup/rollup-linux-arm-musleabihf": "4.40.1", 1520 | "@rollup/rollup-linux-arm64-gnu": "4.40.1", 1521 | "@rollup/rollup-linux-arm64-musl": "4.40.1", 1522 | "@rollup/rollup-linux-loongarch64-gnu": "4.40.1", 1523 | "@rollup/rollup-linux-powerpc64le-gnu": "4.40.1", 1524 | "@rollup/rollup-linux-riscv64-gnu": "4.40.1", 1525 | "@rollup/rollup-linux-riscv64-musl": "4.40.1", 1526 | "@rollup/rollup-linux-s390x-gnu": "4.40.1", 1527 | "@rollup/rollup-linux-x64-gnu": "4.40.1", 1528 | "@rollup/rollup-linux-x64-musl": "4.40.1", 1529 | "@rollup/rollup-win32-arm64-msvc": "4.40.1", 1530 | "@rollup/rollup-win32-ia32-msvc": "4.40.1", 1531 | "@rollup/rollup-win32-x64-msvc": "4.40.1", 1532 | "fsevents": "~2.3.2" 1533 | } 1534 | }, 1535 | "node_modules/run-parallel": { 1536 | "version": "1.2.0", 1537 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1538 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1539 | "dev": true, 1540 | "funding": [ 1541 | { 1542 | "type": "github", 1543 | "url": "https://github.com/sponsors/feross" 1544 | }, 1545 | { 1546 | "type": "patreon", 1547 | "url": "https://www.patreon.com/feross" 1548 | }, 1549 | { 1550 | "type": "consulting", 1551 | "url": "https://feross.org/support" 1552 | } 1553 | ], 1554 | "dependencies": { 1555 | "queue-microtask": "^1.2.2" 1556 | } 1557 | }, 1558 | "node_modules/slimdown-js": { 1559 | "version": "1.0.0", 1560 | "resolved": "https://registry.npmjs.org/slimdown-js/-/slimdown-js-1.0.0.tgz", 1561 | "integrity": "sha512-5bl05N92l1MQCnXZ7db09g6rZjwJ8d7ue3gWlAw1mYAcm6jrIY/wQeJNqRZvVc1Fr7MQ+3xw4oQmtp5DWUsVrw==" 1562 | }, 1563 | "node_modules/source-map-js": { 1564 | "version": "1.2.1", 1565 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 1566 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 1567 | "dev": true, 1568 | "engines": { 1569 | "node": ">=0.10.0" 1570 | } 1571 | }, 1572 | "node_modules/three": { 1573 | "version": "0.176.0", 1574 | "resolved": "https://registry.npmjs.org/three/-/three-0.176.0.tgz", 1575 | "integrity": "sha512-PWRKYWQo23ojf9oZSlRGH8K09q7nRSWx6LY/HF/UUrMdYgN9i1e2OwJYHoQjwc6HF/4lvvYLC5YC1X8UJL2ZpA==" 1576 | }, 1577 | "node_modules/tinyglobby": { 1578 | "version": "0.2.13", 1579 | "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", 1580 | "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", 1581 | "dev": true, 1582 | "dependencies": { 1583 | "fdir": "^6.4.4", 1584 | "picomatch": "^4.0.2" 1585 | }, 1586 | "engines": { 1587 | "node": ">=12.0.0" 1588 | }, 1589 | "funding": { 1590 | "url": "https://github.com/sponsors/SuperchupuDev" 1591 | } 1592 | }, 1593 | "node_modules/to-regex-range": { 1594 | "version": "5.0.1", 1595 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1596 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1597 | "dev": true, 1598 | "dependencies": { 1599 | "is-number": "^7.0.0" 1600 | }, 1601 | "engines": { 1602 | "node": ">=8.0" 1603 | } 1604 | }, 1605 | "node_modules/tweakpane": { 1606 | "version": "4.0.5", 1607 | "resolved": "https://registry.npmjs.org/tweakpane/-/tweakpane-4.0.5.tgz", 1608 | "integrity": "sha512-rxEXdSI+ArlG1RyO6FghC4ZUX8JkEfz8F3v1JuteXSV0pEtHJzyo07fcDG+NsJfN5L39kSbCYbB9cBGHyuI/tQ==", 1609 | "funding": { 1610 | "url": "https://github.com/sponsors/cocopon" 1611 | } 1612 | }, 1613 | "node_modules/tweakpane-plugin-infodump": { 1614 | "version": "4.0.2", 1615 | "resolved": "https://registry.npmjs.org/tweakpane-plugin-infodump/-/tweakpane-plugin-infodump-4.0.2.tgz", 1616 | "integrity": "sha512-zJOFZ1JVMNgsOdY+1+pGDgNYAWY/Zdmr1rRFVwFfVqqmDMYmhDriCnU7zWKP6SI5cTE+7iFjJrg2tAjfiRZiLw==", 1617 | "dependencies": { 1618 | "slimdown-js": "^1.0.0" 1619 | }, 1620 | "peerDependencies": { 1621 | "tweakpane": "^4.0.0" 1622 | } 1623 | }, 1624 | "node_modules/vite": { 1625 | "version": "6.3.4", 1626 | "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.4.tgz", 1627 | "integrity": "sha512-BiReIiMS2fyFqbqNT/Qqt4CVITDU9M9vE+DKcVAsB+ZV0wvTKd+3hMbkpxz1b+NmEDMegpVbisKiAZOnvO92Sw==", 1628 | "dev": true, 1629 | "dependencies": { 1630 | "esbuild": "^0.25.0", 1631 | "fdir": "^6.4.4", 1632 | "picomatch": "^4.0.2", 1633 | "postcss": "^8.5.3", 1634 | "rollup": "^4.34.9", 1635 | "tinyglobby": "^0.2.13" 1636 | }, 1637 | "bin": { 1638 | "vite": "bin/vite.js" 1639 | }, 1640 | "engines": { 1641 | "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 1642 | }, 1643 | "funding": { 1644 | "url": "https://github.com/vitejs/vite?sponsor=1" 1645 | }, 1646 | "optionalDependencies": { 1647 | "fsevents": "~2.3.3" 1648 | }, 1649 | "peerDependencies": { 1650 | "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", 1651 | "jiti": ">=1.21.0", 1652 | "less": "*", 1653 | "lightningcss": "^1.21.0", 1654 | "sass": "*", 1655 | "sass-embedded": "*", 1656 | "stylus": "*", 1657 | "sugarss": "*", 1658 | "terser": "^5.16.0", 1659 | "tsx": "^4.8.1", 1660 | "yaml": "^2.4.2" 1661 | }, 1662 | "peerDependenciesMeta": { 1663 | "@types/node": { 1664 | "optional": true 1665 | }, 1666 | "jiti": { 1667 | "optional": true 1668 | }, 1669 | "less": { 1670 | "optional": true 1671 | }, 1672 | "lightningcss": { 1673 | "optional": true 1674 | }, 1675 | "sass": { 1676 | "optional": true 1677 | }, 1678 | "sass-embedded": { 1679 | "optional": true 1680 | }, 1681 | "stylus": { 1682 | "optional": true 1683 | }, 1684 | "sugarss": { 1685 | "optional": true 1686 | }, 1687 | "terser": { 1688 | "optional": true 1689 | }, 1690 | "tsx": { 1691 | "optional": true 1692 | }, 1693 | "yaml": { 1694 | "optional": true 1695 | } 1696 | } 1697 | }, 1698 | "node_modules/vite-plugin-plain-text": { 1699 | "version": "1.4.2", 1700 | "resolved": "https://registry.npmjs.org/vite-plugin-plain-text/-/vite-plugin-plain-text-1.4.2.tgz", 1701 | "integrity": "sha512-nkCWW16lkTidaGZ9kItwMZ5OEkUeXMrY4Okc9IQXrN/p6SAuDYmEiGqMRKl1rnhm6CR1h98uJtn+ODkv0cL7DA==", 1702 | "dev": true, 1703 | "dependencies": { 1704 | "@napi-rs/magic-string": "^0.3.4", 1705 | "fast-glob": "^3.2.12", 1706 | "minimatch": "^6.1.6" 1707 | } 1708 | }, 1709 | "node_modules/vite-plugin-tsl-operator": { 1710 | "version": "1.3.0", 1711 | "resolved": "https://registry.npmjs.org/vite-plugin-tsl-operator/-/vite-plugin-tsl-operator-1.3.0.tgz", 1712 | "integrity": "sha512-283Yu0aPvqH/ncs6SRZxpnRolDAWcgKGUmaJG/Uwt0VKC+VK8LUVbw5L2WjhCcSZIiUJ1nkp5RqMMLVyFFKw6A==", 1713 | "dev": true, 1714 | "dependencies": { 1715 | "@babel/generator": "^7.27.1", 1716 | "@babel/parser": "^7.27.1", 1717 | "@babel/traverse": "^7.27.1", 1718 | "@babel/types": "^7.27.1" 1719 | } 1720 | } 1721 | } 1722 | } 1723 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "flow", 3 | "private": true, 4 | "version": "0.0.1", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite --host", 8 | "build": "vite build --mode=production", 9 | "preview": "vite preview" 10 | }, 11 | "devDependencies": { 12 | "@babel/generator": "^7.26.9", 13 | "@babel/parser": "^7.26.9", 14 | "@babel/traverse": "^7.26.9", 15 | "@babel/types": "^7.26.9", 16 | "vite": "^6.3.1", 17 | "vite-plugin-plain-text": "^1.4.2", 18 | "vite-plugin-tsl-operator": "^1.2.3" 19 | }, 20 | "dependencies": { 21 | "@tweakpane/plugin-essentials": "^0.2.1", 22 | "is-mobile": "^5.0.0", 23 | "three": "^0.176.0", 24 | "tweakpane": "^4.0.5", 25 | "tweakpane-plugin-infodump": "^4.0.2" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/app.js: -------------------------------------------------------------------------------- 1 | import * as THREE from "three/webgpu"; 2 | import { OrbitControls } from "three/examples/jsm/controls/OrbitControls" 3 | import { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js'; 4 | import {Lights} from "./lights"; 5 | import hdri from "./assets/autumn_field_puresky_1k.hdr"; 6 | 7 | import { float, Fn, mrt, output, pass, vec3, vec4 } from "three/tsl"; 8 | import {conf} from "./conf"; 9 | import {Info} from "./info"; 10 | import MlsMpmSimulator from "./mls-mpm/mlsMpmSimulator"; 11 | import ParticleRenderer from "./mls-mpm/particleRenderer"; 12 | import BackgroundGeometry from "./backgroundGeometry"; 13 | import { bloom } from 'three/examples/jsm/tsl/display/BloomNode.js'; 14 | import PointRenderer from "./mls-mpm/pointRenderer.js"; 15 | 16 | const loadHdr = async (file) => { 17 | const texture = await new Promise(resolve => { 18 | new RGBELoader().load(file, result => { 19 | result.mapping = THREE.EquirectangularReflectionMapping; 20 | result.colo 21 | resolve(result); 22 | }); 23 | }); 24 | return texture; 25 | } 26 | 27 | class App { 28 | renderer = null; 29 | 30 | camera = null; 31 | 32 | scene = null; 33 | 34 | controls = null; 35 | 36 | lights = null; 37 | 38 | constructor(renderer) { 39 | this.renderer = renderer; 40 | } 41 | 42 | async init(progressCallback) { 43 | this.info = new Info(); 44 | conf.init(); 45 | 46 | this.camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 0.01, 5); 47 | this.camera.position.set(0, 0.5, -1); 48 | this.camera.updateProjectionMatrix() 49 | 50 | this.scene = new THREE.Scene(); 51 | 52 | this.controls = new OrbitControls(this.camera, this.renderer.domElement); 53 | this.controls.target.set(0,0.5,0.2); 54 | this.controls.enableDamping = true; 55 | this.controls.enablePan = false; 56 | this.controls.touches = { 57 | TWO: THREE.TOUCH.DOLLY_ROTATE, 58 | } 59 | this.controls.maxDistance = 2.0; 60 | this.controls.minPolarAngle = 0.2 * Math.PI; 61 | this.controls.maxPolarAngle = 0.8 * Math.PI; 62 | this.controls.minAzimuthAngle = 0.7 * Math.PI; 63 | this.controls.maxAzimuthAngle = 1.3 * Math.PI; 64 | 65 | await progressCallback(0.1) 66 | 67 | const hdriTexture = await loadHdr(hdri); 68 | 69 | this.scene.background = hdriTexture; //bgNode.mul(2); 70 | this.scene.backgroundRotation = new THREE.Euler(0,2.15,0); 71 | this.scene.environment = hdriTexture; 72 | this.scene.environmentRotation = new THREE.Euler(0,-2.15,0); 73 | this.scene.environmentIntensity = 0.5; 74 | //this.renderer.toneMapping = THREE.ACESFilmicToneMapping; 75 | this.renderer.toneMappingExposure = 0.66; 76 | 77 | this.renderer.shadowMap.enabled = true; 78 | this.renderer.shadowMap.type = THREE.PCFSoftShadowMap; 79 | 80 | await progressCallback(0.5) 81 | 82 | this.mlsMpmSim = new MlsMpmSimulator(this.renderer); 83 | await this.mlsMpmSim.init(); 84 | this.particleRenderer = new ParticleRenderer(this.mlsMpmSim); 85 | this.scene.add(this.particleRenderer.object); 86 | this.pointRenderer = new PointRenderer(this.mlsMpmSim); 87 | this.scene.add(this.pointRenderer.object); 88 | 89 | this.lights = new Lights(); 90 | this.scene.add(this.lights.object); 91 | 92 | const backgroundGeometry = new BackgroundGeometry(); 93 | await backgroundGeometry.init(); 94 | this.scene.add(backgroundGeometry.object); 95 | 96 | 97 | const scenePass = pass(this.scene, this.camera); 98 | scenePass.setMRT( mrt( { 99 | output, 100 | bloomIntensity: float( 0 ) // default bloom intensity 101 | } ) ); 102 | const outputPass = scenePass.getTextureNode(); 103 | const bloomIntensityPass = scenePass.getTextureNode( 'bloomIntensity' ); 104 | const bloomPass = bloom( outputPass.mul( bloomIntensityPass ) ); 105 | const postProcessing = new THREE.PostProcessing(this.renderer); 106 | postProcessing.outputColorTransform = false; 107 | //postProcessing.outputNode = vec4(outputPass.rgb, 1).add( vec4(bloomPass.mul(bloomIntensityPass.sign().oneMinus()).rgb, 0.0) ).renderOutput(); 108 | //postProcessing.outputNode = outputPass.renderOutput(); 109 | //(1-2b)*a*a + 2ba 110 | postProcessing.outputNode = Fn(() => { 111 | const a = outputPass.rgb.clamp(0,1).toVar(); 112 | const b = bloomPass.rgb.clamp(0,1).mul(bloomIntensityPass.r.sign().oneMinus()).toVar(); 113 | //return vec4(vec3(1).sub(b).sub(b).mul(a).mul(a).mul(0.0),1.0); 114 | //return b; 115 | //return a.div(b.oneMinus().max(0.0001)).clamp(0,1); 116 | return vec4(vec3(1).sub(b).sub(b).mul(a).mul(a).add(b.mul(a).mul(2)).clamp(0,1),1.0); 117 | })().renderOutput(); 118 | 119 | this.postProcessing = postProcessing; 120 | this.bloomPass = bloomPass; 121 | this.bloomPass.threshold.value = 0.001; 122 | this.bloomPass.strength.value = 0.94; 123 | this.bloomPass.radius.value = 0.8; 124 | 125 | 126 | this.raycaster = new THREE.Raycaster(); 127 | this.plane = new THREE.Plane(new THREE.Vector3(0, 0, -1), 0.2); 128 | this.renderer.domElement.addEventListener("pointermove", (event) => { this.onMouseMove(event); }); 129 | 130 | await progressCallback(1.0, 100); 131 | } 132 | 133 | resize(width, height) { 134 | this.camera.aspect = width / height; 135 | this.camera.updateProjectionMatrix(); 136 | } 137 | 138 | onMouseMove(event) { 139 | const pointer = new THREE.Vector2(); 140 | pointer.x = (event.clientX / window.innerWidth) * 2 - 1; 141 | pointer.y = -(event.clientY / window.innerHeight) * 2 + 1; 142 | this.raycaster.setFromCamera(pointer, this.camera); 143 | const intersect = new THREE.Vector3(); 144 | this.raycaster.ray.intersectPlane(this.plane, intersect); 145 | if (intersect) { 146 | this.mlsMpmSim.setMouseRay(this.raycaster.ray.origin, this.raycaster.ray.direction, intersect); 147 | } 148 | } 149 | 150 | 151 | async update(delta, elapsed) { 152 | conf.begin(); 153 | 154 | this.particleRenderer.object.visible = !conf.points; 155 | this.pointRenderer.object.visible = conf.points; 156 | 157 | this.controls.update(delta); 158 | this.lights.update(elapsed); 159 | this.particleRenderer.update(); 160 | this.pointRenderer.update(); 161 | 162 | await this.mlsMpmSim.update(delta,elapsed); 163 | 164 | if (conf.bloom) { 165 | await this.postProcessing.renderAsync(); 166 | } else { 167 | await this.renderer.renderAsync(this.scene, this.camera); 168 | } 169 | 170 | conf.end(); 171 | } 172 | } 173 | export default App; 174 | -------------------------------------------------------------------------------- /src/assets/autumn_field_puresky_1k.hdr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/holtsetio/flow/5bdbacc9d2659b9f5e98c405663d7da572d5cceb/src/assets/autumn_field_puresky_1k.hdr -------------------------------------------------------------------------------- /src/assets/box.obj: -------------------------------------------------------------------------------- 1 | # Blender 4.3.2 2 | # www.blender.org 3 | o obj_0 4 | v 0.550000 1.100000 0.200000 5 | v 0.550000 0.000000 0.200000 6 | v 0.550000 0.000000 -0.250000 7 | v 0.550000 1.100000 -0.250000 8 | v -0.550000 1.100000 -0.250000 9 | v -0.550000 0.000000 -0.250000 10 | v -0.550000 0.000000 0.200000 11 | v -0.550000 1.100000 0.200000 12 | v -0.500030 0.049980 -0.200030 13 | v -0.500030 1.050030 -0.200030 14 | v -0.500030 1.050030 0.200000 15 | v -0.500030 0.049980 0.200000 16 | v 0.500030 1.050030 0.200000 17 | v 0.500030 0.049980 0.200000 18 | v 0.500030 1.050030 -0.200030 19 | v 0.500030 0.049980 -0.200030 20 | vn 1.0000 -0.0000 -0.0000 21 | vn -1.0000 -0.0000 -0.0000 22 | vn -0.0000 1.0000 -0.0000 23 | vn -0.0000 -0.0000 1.0000 24 | vn -0.0000 -0.0000 -1.0000 25 | vn -0.0000 -1.0000 -0.0000 26 | vt 0.535707 0.160773 27 | vt 0.142930 0.160773 28 | vt 0.142930 0.000092 29 | vt 0.535707 0.000092 30 | vt 0.535707 0.999908 31 | vt 0.142930 0.999908 32 | vt 0.142930 0.839227 33 | vt 0.535707 0.839227 34 | vt 0.678546 0.303612 35 | vt 0.839227 0.696388 36 | vt 0.678546 0.696388 37 | vt 0.839227 0.303612 38 | vt 0.160777 0.678546 39 | vt 0.517864 0.678546 40 | vt 0.517864 0.821384 41 | vt 0.160777 0.821384 42 | vt 0.160776 0.178616 43 | vt 0.517864 0.178616 44 | vt 0.517864 0.321454 45 | vt 0.160777 0.321454 46 | vt 0.892486 0.292424 47 | vt 0.600506 0.292424 48 | vt 0.892486 0.000444 49 | vt 0.892486 0.585292 50 | vt 0.600506 0.585292 51 | vt 0.892486 0.293312 52 | vt 0.017938 0.321455 53 | vt 0.017938 0.678546 54 | vt 0.000092 0.303612 55 | vt 0.660703 0.321454 56 | vt 0.660703 0.678546 57 | vt 0.488177 0.632267 58 | vt 0.377624 0.362026 59 | vt 0.488177 0.316799 60 | vt 0.000092 0.696389 61 | vt 0.600506 0.878160 62 | vt 0.719952 0.586180 63 | vt 0.719952 0.878160 64 | s 0 65 | f 1/1/1 2/2/1 3/3/1 66 | f 1/1/1 3/3/1 4/4/1 67 | f 5/5/2 6/6/2 7/7/2 68 | f 5/5/2 7/7/2 8/8/2 69 | f 1/9/3 5/10/3 8/11/3 70 | f 4/12/3 5/10/3 1/9/3 71 | f 9/13/1 10/14/1 11/15/1 72 | f 9/13/1 11/15/1 12/16/1 73 | f 2/2/4 1/1/4 14/17/4 74 | f 13/18/4 14/17/4 1/1/4 75 | f 13/18/2 15/19/2 16/20/2 76 | f 13/18/2 16/20/2 14/17/2 77 | f 5/21/5 4/22/5 6/23/5 78 | f 3/24/5 6/25/5 4/26/5 79 | f 14/27/4 12/28/4 2/29/4 80 | f 13/30/4 1/9/4 11/31/4 81 | f 8/11/4 11/31/4 1/9/4 82 | f 2/32/6 7/33/6 6/34/6 83 | f 15/19/4 10/14/4 9/13/4 84 | f 15/19/4 9/13/4 16/20/4 85 | f 2/29/4 12/28/4 7/35/4 86 | f 8/8/4 7/7/4 12/16/4 87 | f 8/8/4 12/16/4 11/15/4 88 | f 14/27/3 16/20/3 9/13/3 89 | f 14/27/3 9/13/3 12/28/3 90 | f 2/36/6 6/37/6 3/38/6 91 | f 10/14/6 15/19/6 13/30/6 92 | f 10/14/6 13/30/6 11/31/6 93 | -------------------------------------------------------------------------------- /src/assets/boxSlightlySmooth.obj: -------------------------------------------------------------------------------- 1 | # Blender 4.3.2 2 | # www.blender.org 3 | o obj_0 4 | v 0.550658 1.097037 0.199174 5 | v 0.547037 1.100658 0.199174 6 | v 0.547658 1.097658 0.200658 7 | v 0.550121 1.098814 0.199174 8 | v 0.550240 1.097165 0.199882 9 | v 0.549810 1.098848 0.199863 10 | v 0.547165 1.100240 0.199882 11 | v 0.548814 1.100121 0.199174 12 | v 0.548848 1.099810 0.199863 13 | v 0.549155 1.097390 0.200430 14 | v 0.547390 1.099154 0.200430 15 | v 0.548966 1.098966 0.200264 16 | v 0.547658 0.002342 0.200658 17 | v 0.547037 -0.000658 0.199174 18 | v 0.550658 0.002939 0.199116 19 | v 0.547390 0.000846 0.200430 20 | v 0.549154 0.002597 0.200421 21 | v 0.548966 0.001027 0.200257 22 | v 0.548815 -0.000124 0.199156 23 | v 0.547165 -0.000240 0.199882 24 | v 0.548848 0.000187 0.199852 25 | v 0.550239 0.002814 0.199853 26 | v 0.550121 0.001174 0.199134 27 | v 0.549809 0.001142 0.199843 28 | v 0.547061 -0.000658 -0.249116 29 | v 0.547658 0.002342 -0.250658 30 | v 0.550658 0.002963 -0.249174 31 | v 0.547186 -0.000239 -0.249853 32 | v 0.548826 -0.000121 -0.249134 33 | v 0.548858 0.000191 -0.249843 34 | v 0.549155 0.002610 -0.250430 35 | v 0.547403 0.000846 -0.250421 36 | v 0.548973 0.001034 -0.250257 37 | v 0.550124 0.001185 -0.249155 38 | v 0.550240 0.002835 -0.249882 39 | v 0.549813 0.001152 -0.249852 40 | v 0.547061 1.100658 -0.249116 41 | v 0.550658 1.097061 -0.249116 42 | v 0.547658 1.097658 -0.250658 43 | v 0.548826 1.100124 -0.249116 44 | v 0.547186 1.100239 -0.249853 45 | v 0.548858 1.099813 -0.249832 46 | v 0.550239 1.097187 -0.249853 47 | v 0.550124 1.098827 -0.249116 48 | v 0.549813 1.098858 -0.249832 49 | v 0.547403 1.099154 -0.250421 50 | v 0.549154 1.097404 -0.250421 51 | v 0.548972 1.098972 -0.250249 52 | v -0.547658 1.097658 -0.250658 53 | v -0.550658 1.097037 -0.249174 54 | v -0.547037 1.100658 -0.249174 55 | v -0.549155 1.097390 -0.250430 56 | v -0.547390 1.099154 -0.250430 57 | v -0.548966 1.098966 -0.250264 58 | v -0.550121 1.098814 -0.249174 59 | v -0.550240 1.097165 -0.249882 60 | v -0.549810 1.098848 -0.249863 61 | v -0.547165 1.100240 -0.249882 62 | v -0.548814 1.100121 -0.249174 63 | v -0.548848 1.099810 -0.249863 64 | v -0.547658 0.002342 -0.250658 65 | v -0.547037 -0.000658 -0.249174 66 | v -0.550658 0.002939 -0.249116 67 | v -0.547390 0.000846 -0.250430 68 | v -0.549154 0.002597 -0.250421 69 | v -0.548966 0.001027 -0.250257 70 | v -0.548815 -0.000124 -0.249156 71 | v -0.547165 -0.000240 -0.249882 72 | v -0.548848 0.000187 -0.249852 73 | v -0.550239 0.002813 -0.249853 74 | v -0.550121 0.001174 -0.249134 75 | v -0.549809 0.001142 -0.249843 76 | v -0.547061 -0.000658 0.199116 77 | v -0.547659 0.002342 0.200680 78 | v -0.550658 0.002963 0.199174 79 | v -0.547187 -0.000239 0.199856 80 | v -0.548826 -0.000121 0.199134 81 | v -0.548858 0.000191 0.199845 82 | v -0.549154 0.002609 0.200441 83 | v -0.547404 0.000847 0.200433 84 | v -0.548973 0.001034 0.200263 85 | v -0.550124 0.001185 0.199156 86 | v -0.550240 0.002835 0.199886 87 | v -0.549813 0.001152 0.199854 88 | v -0.547061 1.100658 0.199116 89 | v -0.550658 1.097061 0.199116 90 | v -0.547658 1.097658 0.200658 91 | v -0.548826 1.100124 0.199116 92 | v -0.547187 1.100239 0.199853 93 | v -0.548858 1.099813 0.199832 94 | v -0.550239 1.097187 0.199853 95 | v -0.550124 1.098827 0.199116 96 | v -0.549813 1.098858 0.199832 97 | v -0.547404 1.099154 0.200421 98 | v -0.549154 1.097403 0.200421 99 | v -0.548972 1.098972 0.200249 100 | v -0.494333 0.059298 -0.192873 101 | v -0.490712 0.055677 -0.192873 102 | v -0.491329 0.058681 -0.194321 103 | v -0.493796 0.057521 -0.192890 104 | v -0.493915 0.059170 -0.193564 105 | v -0.493481 0.057491 -0.193548 106 | v -0.490840 0.056095 -0.193564 107 | v -0.492489 0.056214 -0.192890 108 | v -0.492519 0.056529 -0.193548 109 | v -0.492827 0.058945 -0.194099 110 | v -0.491065 0.057183 -0.194099 111 | v -0.492637 0.057373 -0.193935 112 | v -0.496356 1.046372 -0.199357 113 | v -0.495752 1.049373 -0.197921 114 | v -0.499355 1.045776 -0.197843 115 | v -0.496094 1.047869 -0.199141 116 | v -0.497851 1.046113 -0.199123 117 | v -0.497671 1.047686 -0.198970 118 | v -0.497527 1.048839 -0.197897 119 | v -0.495875 1.048955 -0.198611 120 | v -0.497558 1.048528 -0.198577 121 | v -0.498936 1.045897 -0.198565 122 | v -0.498827 1.047541 -0.197869 123 | v -0.498515 1.047571 -0.198563 124 | v -0.496088 1.049685 0.199520 125 | v -0.502686 1.052686 0.201031 126 | v -0.499667 1.046065 0.199591 127 | v -0.497459 1.050104 0.200241 128 | v -0.497851 1.049148 0.199542 129 | v -0.498708 1.049541 0.200234 130 | v -0.501193 1.049833 0.200812 131 | v -0.499871 1.051197 0.200801 132 | v -0.499811 1.049797 0.200642 133 | v -0.499142 1.047842 0.199567 134 | v -0.500093 1.047411 0.200278 135 | v -0.499540 1.048691 0.200245 136 | v -0.496069 0.050344 0.199531 137 | v -0.499666 0.053941 0.199531 138 | v -0.502686 0.047324 0.201031 139 | v -0.497834 0.050878 0.199514 140 | v -0.497446 0.049916 0.200247 141 | v -0.498699 0.050475 0.200221 142 | v -0.500094 0.052564 0.200247 143 | v -0.499132 0.052176 0.199514 144 | v -0.499535 0.051311 0.200221 145 | v -0.499865 0.048816 0.200803 146 | v -0.501194 0.050145 0.200803 147 | v -0.499806 0.050203 0.200634 148 | v 0.502686 1.052686 0.201009 149 | v 0.496064 1.049685 0.199580 150 | v 0.499685 1.046064 0.199580 151 | v 0.499826 1.051196 0.200799 152 | v 0.501196 1.049826 0.200799 153 | v 0.499795 1.049795 0.200642 154 | v 0.497842 1.049148 0.199579 155 | v 0.497405 1.050102 0.200268 156 | v 0.498688 1.049540 0.200249 157 | v 0.500102 1.047405 0.200268 158 | v 0.499148 1.047841 0.199579 159 | v 0.499540 1.048688 0.200249 160 | v 0.499685 0.053922 0.199520 161 | v 0.496065 0.050343 0.199591 162 | v 0.502686 0.047324 0.201031 163 | v 0.499148 0.052159 0.199542 164 | v 0.500104 0.052551 0.200241 165 | v 0.499541 0.051302 0.200234 166 | v 0.497411 0.049917 0.200277 167 | v 0.497842 0.050868 0.199567 168 | v 0.498691 0.050470 0.200245 169 | v 0.501197 0.050139 0.200801 170 | v 0.499833 0.048817 0.200812 171 | v 0.499797 0.050199 0.200642 172 | v 0.495776 1.049373 -0.197862 173 | v 0.496372 1.046372 -0.199356 174 | v 0.499373 1.045776 -0.197862 175 | v 0.495900 1.048954 -0.198581 176 | v 0.497542 1.048839 -0.197862 177 | v 0.497572 1.048527 -0.198561 178 | v 0.497868 1.046116 -0.199132 179 | v 0.496116 1.047868 -0.199132 180 | v 0.497686 1.047686 -0.198967 181 | v 0.498839 1.047542 -0.197862 182 | v 0.498954 1.045900 -0.198581 183 | v 0.498527 1.047572 -0.198561 184 | v 0.496372 0.053653 -0.199357 185 | v 0.495776 0.050655 -0.197843 186 | v 0.499373 0.054258 -0.197921 187 | v 0.496113 0.052159 -0.199123 188 | v 0.497869 0.053916 -0.199141 189 | v 0.497686 0.052339 -0.198970 190 | v 0.497541 0.051183 -0.197869 191 | v 0.495897 0.051074 -0.198565 192 | v 0.497571 0.051495 -0.198563 193 | v 0.498955 0.054135 -0.198611 194 | v 0.498839 0.052483 -0.197897 195 | v 0.498528 0.052452 -0.198577 196 | vn 0.9624 0.1302 0.2386 197 | vn 0.1302 0.9624 0.2386 198 | vn 0.0803 0.0803 0.9935 199 | vn 0.8534 0.4872 0.1852 200 | vn 0.7101 0.1044 0.6963 201 | vn 0.6762 0.4039 0.6161 202 | vn 0.1044 0.7101 0.6963 203 | vn 0.4872 0.8534 0.1852 204 | vn 0.4038 0.6762 0.6161 205 | vn 0.3126 0.0714 0.9472 206 | vn 0.0714 0.3126 0.9472 207 | vn 0.2974 0.2974 0.9072 208 | vn 0.0816 -0.0810 0.9934 209 | vn 0.1305 -0.9623 0.2386 210 | vn 0.9630 -0.1304 0.2357 211 | vn 0.0734 -0.3147 0.9464 212 | vn 0.3169 -0.0714 0.9458 213 | vn 0.3041 -0.2986 0.9046 214 | vn 0.4879 -0.8534 0.1835 215 | vn 0.1057 -0.7111 0.6951 216 | vn 0.4062 -0.6775 0.6131 217 | vn 0.7142 -0.1041 0.6922 218 | vn 0.8541 -0.4875 0.1815 219 | vn 0.6822 -0.4040 0.6095 220 | vn 0.1304 -0.9630 -0.2357 221 | vn 0.0792 -0.0806 -0.9936 222 | vn 0.9623 -0.1305 -0.2387 223 | vn 0.1041 -0.7142 -0.6922 224 | vn 0.4875 -0.8541 -0.1815 225 | vn 0.4040 -0.6822 -0.6095 226 | vn 0.3131 -0.0734 -0.9469 227 | vn 0.0714 -0.3169 -0.9458 228 | vn 0.2986 -0.3041 -0.9046 229 | vn 0.8534 -0.4879 -0.1834 230 | vn 0.7104 -0.1057 -0.6958 231 | vn 0.6775 -0.4063 -0.6131 232 | vn 0.1308 0.9629 -0.2359 233 | vn 0.9630 0.1308 -0.2358 234 | vn 0.0805 0.0805 -0.9935 235 | vn 0.4881 0.8540 -0.1798 236 | vn 0.1053 0.7144 -0.6917 237 | vn 0.4064 0.6834 -0.6065 238 | vn 0.7145 0.1053 -0.6917 239 | vn 0.8540 0.4881 -0.1798 240 | vn 0.6834 0.4063 -0.6065 241 | vn 0.0734 0.3174 -0.9454 242 | vn 0.3174 0.0734 -0.9454 243 | vn 0.3053 0.3052 -0.9020 244 | vn -0.0793 0.0793 -0.9937 245 | vn -0.9624 0.1302 -0.2386 246 | vn -0.1302 0.9624 -0.2386 247 | vn -0.3126 0.0714 -0.9472 248 | vn -0.0714 0.3126 -0.9472 249 | vn -0.2974 0.2975 -0.9072 250 | vn -0.8534 0.4872 -0.1852 251 | vn -0.7101 0.1044 -0.6963 252 | vn -0.6762 0.4038 -0.6161 253 | vn -0.1044 0.7101 -0.6963 254 | vn -0.4872 0.8534 -0.1852 255 | vn -0.4038 0.6763 -0.6161 256 | vn -0.0806 -0.0792 -0.9936 257 | vn -0.1305 -0.9623 -0.2388 258 | vn -0.9630 -0.1304 -0.2357 259 | vn -0.0735 -0.3131 -0.9469 260 | vn -0.3169 -0.0714 -0.9458 261 | vn -0.3041 -0.2986 -0.9046 262 | vn -0.4879 -0.8534 -0.1835 263 | vn -0.1057 -0.7104 -0.6958 264 | vn -0.4062 -0.6775 -0.6131 265 | vn -0.7142 -0.1041 -0.6922 266 | vn -0.8541 -0.4875 -0.1816 267 | vn -0.6821 -0.4040 -0.6095 268 | vn -0.1305 -0.9632 0.2352 269 | vn -0.0827 -0.0840 0.9930 270 | vn -0.9624 -0.1305 0.2382 271 | vn -0.1045 -0.7157 0.6905 272 | vn -0.4876 -0.8542 0.1809 273 | vn -0.4049 -0.6837 0.6072 274 | vn -0.3171 -0.0752 0.9454 275 | vn -0.0732 -0.3208 0.9443 276 | vn -0.3023 -0.3078 0.9022 277 | vn -0.8535 -0.4880 0.1828 278 | vn -0.7120 -0.1061 0.6941 279 | vn -0.6791 -0.4071 0.6108 280 | vn -0.1307 0.9629 0.2359 281 | vn -0.9630 0.1307 0.2356 282 | vn -0.0824 0.0816 0.9933 283 | vn -0.4881 0.8540 0.1798 284 | vn -0.1053 0.7144 0.6918 285 | vn -0.4063 0.6834 0.6065 286 | vn -0.7152 0.1053 0.6910 287 | vn -0.8540 0.4881 0.1798 288 | vn -0.6834 0.4064 0.6065 289 | vn -0.0734 0.3174 0.9454 290 | vn -0.3190 0.0734 0.9449 291 | vn -0.3052 0.3053 0.9020 292 | vn 0.9592 0.1311 0.2503 293 | vn 0.1311 0.9592 0.2503 294 | vn 0.0794 0.0794 0.9937 295 | vn 0.8507 0.4845 0.2038 296 | vn 0.7019 0.1068 0.7043 297 | vn 0.6670 0.3995 0.6288 298 | vn 0.1068 0.7018 0.7043 299 | vn 0.4845 0.8507 0.2038 300 | vn 0.3995 0.6670 0.6288 301 | vn 0.3059 0.0734 0.9492 302 | vn 0.0733 0.3059 0.9492 303 | vn 0.2906 0.2906 0.9116 304 | vn 0.0791 -0.0722 0.9942 305 | vn 0.1308 -0.9608 0.2444 306 | vn 0.9626 -0.1247 0.2407 307 | vn 0.0724 -0.3029 0.9503 308 | vn 0.3116 -0.0637 0.9481 309 | vn 0.3001 -0.2883 0.9093 310 | vn 0.4891 -0.8516 0.1886 311 | vn 0.1054 -0.7021 0.7043 312 | vn 0.4059 -0.6699 0.6217 313 | vn 0.7086 -0.0963 0.6990 314 | vn 0.8554 -0.4833 0.1866 315 | vn 0.6794 -0.3968 0.6173 316 | vn 0.1032 -0.9468 0.3049 317 | vn 0.0153 -0.0143 0.9998 318 | vn 0.9451 -0.0978 0.3119 319 | vn 0.1141 -0.5319 0.8391 320 | vn 0.4508 -0.7717 0.4486 321 | vn 0.2929 -0.3521 0.8890 322 | vn 0.1572 -0.0510 0.9863 323 | vn 0.0572 -0.1504 0.9870 324 | vn 0.1840 -0.1690 0.9683 325 | vn 0.7813 -0.4346 0.4480 326 | vn 0.5352 -0.1034 0.8384 327 | vn 0.3688 -0.2733 0.8884 328 | vn 0.1015 0.9428 0.3175 329 | vn 0.9428 0.1015 0.3175 330 | vn 0.0152 0.0152 0.9998 331 | vn 0.4417 0.7753 0.4514 332 | vn 0.1086 0.5355 0.8375 333 | vn 0.2860 0.3662 0.8855 334 | vn 0.5355 0.1086 0.8375 335 | vn 0.7753 0.4417 0.4514 336 | vn 0.3662 0.2860 0.8855 337 | vn 0.0548 0.1553 0.9863 338 | vn 0.1553 0.0548 0.9863 339 | vn 0.1798 0.1798 0.9671 340 | vn -0.0145 -0.0145 0.9998 341 | vn -0.1013 -0.9465 0.3064 342 | vn -0.9465 -0.1013 0.3064 343 | vn -0.0522 -0.1513 0.9871 344 | vn -0.1513 -0.0523 0.9871 345 | vn -0.1716 -0.1716 0.9701 346 | vn -0.4426 -0.7751 0.4510 347 | vn -0.1078 -0.5323 0.8396 348 | vn -0.2793 -0.3556 0.8919 349 | vn -0.5323 -0.1078 0.8397 350 | vn -0.7750 -0.4426 0.4511 351 | vn -0.3555 -0.2793 0.8920 352 | vn -0.9468 0.1032 0.3050 353 | vn -0.0978 0.9451 0.3119 354 | vn -0.0143 0.0153 0.9998 355 | vn -0.7717 0.4508 0.4486 356 | vn -0.5319 0.1141 0.8391 357 | vn -0.3520 0.2929 0.8890 358 | vn -0.1034 0.5352 0.8384 359 | vn -0.4346 0.7813 0.4480 360 | vn -0.2733 0.3688 0.8884 361 | vn -0.1504 0.0572 0.9870 362 | vn -0.0510 0.1572 0.9863 363 | vn -0.1689 0.1840 0.9683 364 | vn -0.1305 -0.9617 0.2412 365 | vn -0.0760 -0.0760 0.9942 366 | vn -0.9617 -0.1305 0.2412 367 | vn -0.1042 -0.7067 0.6998 368 | vn -0.4875 -0.8534 0.1847 369 | vn -0.4036 -0.6776 0.6147 370 | vn -0.3079 -0.0708 0.9488 371 | vn -0.0708 -0.3079 0.9488 372 | vn -0.2978 -0.2978 0.9070 373 | vn -0.8534 -0.4875 0.1848 374 | vn -0.7067 -0.1042 0.6998 375 | vn -0.6777 -0.4036 0.6147 376 | vn -0.0723 0.0791 0.9942 377 | vn -0.1247 0.9626 0.2407 378 | vn -0.9608 0.1309 0.2445 379 | vn -0.0637 0.3116 0.9481 380 | vn -0.3029 0.0724 0.9503 381 | vn -0.2883 0.3001 0.9093 382 | vn -0.4833 0.8554 0.1866 383 | vn -0.0963 0.7086 0.6990 384 | vn -0.3968 0.6794 0.6173 385 | vn -0.7020 0.1054 0.7043 386 | vn -0.8516 0.4891 0.1886 387 | vn -0.6699 0.4059 0.6217 388 | vt 0.838678 0.304895 389 | vt 0.838699 0.695097 390 | vt 0.679074 0.304903 391 | vt 0.534415 0.160245 392 | vt 0.144213 0.160224 393 | vt 0.144222 0.000620 394 | vt 0.534617 0.838177 395 | vt 0.143981 0.838177 396 | vt 0.159726 0.822434 397 | vt 0.534415 0.999380 398 | vt 0.144213 0.999359 399 | vt 0.144222 0.839755 400 | vt 0.143980 0.161823 401 | vt 0.534617 0.161823 402 | vt 0.159726 0.177566 403 | vt 0.677496 0.695338 404 | vt 0.661753 0.679596 405 | vt 0.677495 0.304701 406 | vt 0.018458 0.322756 407 | vt 0.160259 0.677252 408 | vt 0.018480 0.677260 409 | vt 0.162070 0.679063 410 | vt 0.516572 0.679084 411 | vt 0.516563 0.820864 412 | vt 0.518914 0.177566 413 | vt 0.159683 0.177566 414 | vt 0.534657 0.161823 415 | vt 0.661753 0.320404 416 | vt 0.677495 0.304662 417 | vt 0.661753 0.679639 418 | vt 0.516569 0.179134 419 | vt 0.516578 0.320916 420 | vt 0.162070 0.320937 421 | vt 0.534424 0.839776 422 | vt 0.891691 0.291629 423 | vt 0.601301 0.291629 424 | vt 0.891691 0.001239 425 | vt 0.001142 0.304701 426 | vt 0.016888 0.679596 427 | vt 0.001142 0.695339 428 | vt 0.600898 0.877200 429 | vt 0.719559 0.587140 430 | vt 0.719544 0.877206 431 | vt 0.838699 0.695097 432 | vt 0.679095 0.695105 433 | vt 0.016888 0.320404 434 | vt 0.016888 0.679639 435 | vt 0.001142 0.304662 436 | vt 0.516786 0.322533 437 | vt 0.161849 0.677473 438 | vt 0.161849 0.322533 439 | vt 0.018458 0.322756 440 | vt 0.160238 0.322747 441 | vt 0.160259 0.677252 442 | vt 0.891691 0.584497 443 | vt 0.601301 0.584497 444 | vt 0.891691 0.294107 445 | vt 0.534657 0.838177 446 | vt 0.159683 0.822434 447 | vt 0.518914 0.822434 448 | vt 0.162070 0.679063 449 | vt 0.162062 0.820842 450 | vt 0.518382 0.677252 451 | vt 0.660185 0.322749 452 | vt 0.660164 0.677260 453 | vt 0.516786 0.322533 454 | vt 0.516786 0.677473 455 | vt 0.488177 0.631230 456 | vt 0.378363 0.362754 457 | vt 0.488177 0.317837 458 | vt 0.516570 0.179134 459 | vt 0.162070 0.320937 460 | vt 0.162062 0.179155 461 | vt 0.518382 0.677252 462 | vt 0.518403 0.322740 463 | vt 0.535049 0.160245 464 | vt 0.535061 0.160490 465 | vt 0.534461 0.160497 466 | vt 0.535707 0.160245 467 | vt 0.535707 0.160490 468 | vt 0.678822 0.304858 469 | vt 0.678829 0.303612 470 | vt 0.679074 0.303612 471 | vt 0.535149 0.161916 472 | vt 0.535092 0.161364 473 | vt 0.534532 0.161299 474 | vt 0.535104 0.160633 475 | vt 0.000092 0.304777 476 | vt 0.000092 0.304215 477 | vt 0.001230 0.304170 478 | vt 0.600506 0.877293 479 | vt 0.600711 0.877234 480 | vt 0.600719 0.877680 481 | vt 0.600506 0.877711 482 | vt 0.600903 0.877671 483 | vt 0.600909 0.878160 484 | vt 0.600721 0.878160 485 | vt 0.144168 0.160486 486 | vt 0.142930 0.160483 487 | vt 0.142930 0.160231 488 | vt 0.719739 0.877239 489 | vt 0.719736 0.877682 490 | vt 0.719549 0.877674 491 | vt 0.719952 0.877297 492 | vt 0.719952 0.877713 493 | vt 0.892087 0.584426 494 | vt 0.892039 0.585292 495 | vt 0.891623 0.585292 496 | vt 0.892486 0.584366 497 | vt 0.892486 0.585292 498 | vt 0.142930 0.000627 499 | vt 0.142930 0.000379 500 | vt 0.144176 0.000092 501 | vt 0.719554 0.878160 502 | vt 0.719739 0.878160 503 | vt 0.838678 0.303612 504 | vt 0.839227 0.304254 505 | vt 0.839227 0.304850 506 | vt 0.535707 0.000641 507 | vt 0.535054 0.000641 508 | vt 0.535065 0.000092 509 | vt 0.535707 0.000092 510 | vt 0.534424 0.000641 511 | vt 0.534469 0.000092 512 | vt 0.600506 0.291504 513 | vt 0.600905 0.291561 514 | vt 0.600953 0.291977 515 | vt 0.600506 0.291947 516 | vt 0.601369 0.292025 517 | vt 0.601426 0.292424 518 | vt 0.600983 0.292424 519 | vt 0.892087 0.291558 520 | vt 0.892037 0.291976 521 | vt 0.891620 0.292025 522 | vt 0.892486 0.291498 523 | vt 0.892486 0.291944 524 | vt 0.535049 0.999380 525 | vt 0.535061 0.999908 526 | vt 0.534461 0.999908 527 | vt 0.535707 0.999380 528 | vt 0.535707 0.999908 529 | vt 0.839227 0.695142 530 | vt 0.839227 0.695743 531 | vt 0.838699 0.696388 532 | vt 0.891560 0.292424 533 | vt 0.892006 0.292424 534 | vt 0.601372 0.584893 535 | vt 0.600954 0.584845 536 | vt 0.600905 0.584429 537 | vt 0.601432 0.585292 538 | vt 0.600986 0.585068 539 | vt 0.487994 0.317402 540 | vt 0.488161 0.317324 541 | vt 0.488528 0.317657 542 | vt 0.487804 0.316952 543 | vt 0.488062 0.317089 544 | vt 0.144168 0.999908 545 | vt 0.143572 0.999618 546 | vt 0.142930 0.999366 547 | vt 0.600506 0.584372 548 | vt 0.600731 0.584815 549 | vt 0.719846 0.586628 550 | vt 0.719739 0.586659 551 | vt 0.719736 0.586405 552 | vt 0.378169 0.362797 553 | vt 0.378004 0.362386 554 | vt 0.378181 0.362323 555 | vt 0.377950 0.362824 556 | vt 0.377793 0.362439 557 | vt 0.144086 0.838701 558 | vt 0.142919 0.838637 559 | vt 0.142909 0.838088 560 | vt 0.144176 0.839502 561 | vt 0.142930 0.839513 562 | vt 0.142930 0.839762 563 | vt 0.377992 0.361875 564 | vt 0.377821 0.361945 565 | vt 0.679095 0.696388 566 | vt 0.678840 0.696388 567 | vt 0.678832 0.695150 568 | vt 0.535707 0.839776 569 | vt 0.535054 0.839776 570 | vt 0.535065 0.839521 571 | vt 0.535707 0.839521 572 | vt 0.534469 0.839514 573 | vt 0.677407 0.695873 574 | vt 0.677956 0.695798 575 | vt 0.678020 0.695238 576 | vt 0.535106 0.839373 577 | vt 0.160777 0.679045 578 | vt 0.161422 0.678815 579 | vt 0.162021 0.678812 580 | vt 0.160283 0.678553 581 | vt 0.160268 0.677891 582 | vt 0.160503 0.677902 583 | vt 0.160505 0.678250 584 | vt 0.160506 0.677298 585 | vt 0.161310 0.677381 586 | vt 0.161379 0.677943 587 | vt 0.161944 0.678008 588 | vt 0.160512 0.678245 589 | vt 0.160507 0.677901 590 | vt 0.160651 0.677945 591 | vt 0.517324 0.677376 592 | vt 0.517258 0.677940 593 | vt 0.516693 0.678008 594 | vt 0.518136 0.677296 595 | vt 0.518147 0.677897 596 | vt 0.518390 0.678546 597 | vt 0.517864 0.679071 598 | vt 0.517205 0.679078 599 | vt 0.517215 0.678831 600 | vt 0.517557 0.678827 601 | vt 0.516614 0.678827 602 | vt 0.517559 0.677899 603 | vt 0.517216 0.678242 604 | vt 0.660421 0.677750 605 | vt 0.660418 0.678546 606 | vt 0.660171 0.678546 607 | vt 0.518403 0.821450 608 | vt 0.517903 0.821429 609 | vt 0.517905 0.821912 610 | vt 0.517048 0.821111 611 | vt 0.517506 0.821102 612 | vt 0.517201 0.820858 613 | vt 0.517864 0.820852 614 | vt 0.517864 0.821099 615 | vt 0.517904 0.821246 616 | vt 0.018489 0.677891 617 | vt 0.018232 0.678197 618 | vt 0.018219 0.677749 619 | vt 0.018498 0.678546 620 | vt 0.018236 0.678546 621 | vt 0.161573 0.821103 622 | vt 0.160777 0.821086 623 | vt 0.160777 0.820825 624 | vt 0.017875 0.679086 625 | vt 0.017895 0.678590 626 | vt 0.017410 0.678621 627 | vt 0.018081 0.678591 628 | vt 0.661232 0.321416 629 | vt 0.660742 0.321417 630 | vt 0.660752 0.320916 631 | vt 0.660431 0.322270 632 | vt 0.660424 0.321811 633 | vt 0.660184 0.321454 634 | vt 0.517863 0.179135 635 | vt 0.517204 0.179134 636 | vt 0.517507 0.178895 637 | vt 0.517812 0.178895 638 | vt 0.517049 0.178888 639 | vt 0.517903 0.178755 640 | vt 0.517812 0.178895 641 | vt 0.517507 0.178895 642 | vt 0.160776 0.179148 643 | vt 0.161126 0.178900 644 | vt 0.161572 0.178898 645 | vt 0.018477 0.321462 646 | vt 0.018470 0.322121 647 | vt 0.018223 0.321814 648 | vt 0.018231 0.321510 649 | vt 0.018208 0.322271 650 | vt 0.160237 0.178564 651 | vt 0.160731 0.178576 652 | vt 0.160699 0.178087 653 | vt 0.018278 0.321499 654 | vt 0.017987 0.321809 655 | vt 0.017893 0.321416 656 | vt 0.518146 0.322696 657 | vt 0.518153 0.322098 658 | vt 0.518402 0.321454 659 | vt 0.517321 0.322625 660 | vt 0.517258 0.322061 661 | vt 0.516697 0.321995 662 | vt 0.516622 0.321172 663 | vt 0.517220 0.321165 664 | vt 0.517209 0.320916 665 | vt 0.517864 0.320917 666 | vt 0.517562 0.321166 667 | vt 0.517559 0.322103 668 | vt 0.517219 0.321759 669 | vt 0.161314 0.322626 670 | vt 0.161382 0.322061 671 | vt 0.161946 0.321995 672 | vt 0.160495 0.322704 673 | vt 0.160492 0.322103 674 | vt 0.160244 0.322114 675 | vt 0.160251 0.321454 676 | vt 0.160494 0.321454 677 | vt 0.162027 0.321183 678 | vt 0.160776 0.321172 679 | vt 0.160776 0.320929 680 | vt 0.160637 0.322064 681 | vt 0.144081 0.161299 682 | vt 0.534461 0.160497 683 | vt 0.679074 0.303612 684 | vt 0.892087 0.294175 685 | vt 0.892486 0.294232 686 | vt 0.144222 0.000620 687 | vt 0.892087 0.001307 688 | vt 0.892486 0.001364 689 | vt 0.534461 0.999908 690 | vt 0.534536 0.838701 691 | vt 0.678020 0.304787 692 | vt 0.162024 0.678816 693 | vt 0.160277 0.678546 694 | vt 0.160268 0.677887 695 | vt 0.160702 0.821913 696 | vt 0.517048 0.821114 697 | vt 0.517903 0.178087 698 | vt 0.517864 0.179135 699 | vt 0.517205 0.179134 700 | vt 0.160777 0.320929 701 | vt 0.018470 0.321454 702 | vt 0.018464 0.322118 703 | vt 0.719747 0.587106 704 | vt 0.719952 0.587046 705 | vt 0.601372 0.585292 706 | vt 0.017410 0.321413 707 | vt 0.660431 0.322270 708 | vt 0.661232 0.678623 709 | vt 0.000092 0.695228 710 | vt 0.487849 0.631465 711 | vt 0.488016 0.631332 712 | vt 0.517323 0.322621 713 | vt 0.518136 0.677295 714 | vt 0.161314 0.677379 715 | s 1 716 | f 37/1/37 51/2/51 2/3/2 717 | f 1/4/1 15/5/15 27/6/27 718 | f 87/7/87 74/8/74 135/9/135 719 | f 50/10/50 63/11/63 75/12/75 720 | f 13/13/13 3/14/3 159/15/159 721 | f 87/16/87 122/17/122 3/18/3 722 | f 158/19/158 98/20/98 133/21/133 723 | f 97/22/97 111/23/111 123/24/123 724 | f 145/25/145 159/26/159 3/27/3 725 | f 145/28/145 3/29/3 122/30/122 726 | f 147/31/147 171/32/171 183/33/183 727 | f 50/10/50 75/12/75 86/34/86 728 | f 49/35/49 39/36/39 61/37/61 729 | f 13/38/13 135/39/135 74/40/74 730 | f 14/41/14 62/42/62 25/43/25 731 | f 2/3/2 51/44/51 85/45/85 732 | f 159/46/159 135/47/135 13/48/13 733 | f 170/49/170 99/50/99 181/51/181 734 | f 158/52/158 182/53/182 98/54/98 735 | f 26/55/26 61/56/61 39/57/39 736 | f 87/58/87 135/59/135 122/60/122 737 | f 97/61/97 123/24/123 134/62/134 738 | f 110/63/110 146/64/146 121/65/121 739 | f 170/66/170 109/67/109 99/50/99 740 | f 14/68/14 73/69/73 62/70/62 741 | f 147/71/147 183/72/183 157/73/157 742 | f 110/74/110 169/75/169 146/64/146 743 | f 1/4/1 4/76/4 6/77/6 5/78/5 744 | f 4/76/4 8/79/8 9/80/9 6/77/6 745 | f 2/3/2 7/81/7 9/82/9 8/83/8 746 | f 7/81/7 11/84/11 12/85/12 9/82/9 747 | f 3/14/3 10/86/10 12/85/12 11/84/11 748 | f 10/86/10 5/78/5 6/77/6 12/85/12 749 | f 6/77/6 9/80/9 12/87/12 750 | f 13/38/13 16/88/16 18/89/18 17/90/17 751 | f 16/91/16 20/92/20 21/93/21 18/94/18 752 | f 14/41/14 19/95/19 21/93/21 20/92/20 753 | f 19/95/19 23/96/23 24/97/24 21/93/21 754 | f 15/5/15 22/98/22 24/99/24 23/100/23 755 | f 22/98/22 17/90/17 18/89/18 24/99/24 756 | f 18/94/18 21/93/21 24/97/24 757 | f 25/43/25 28/101/28 30/102/30 29/103/29 758 | f 28/101/28 32/104/32 33/105/33 30/102/30 759 | f 26/55/26 31/106/31 33/107/33 32/108/32 760 | f 31/106/31 35/109/35 36/110/36 33/107/33 761 | f 27/6/27 34/111/34 36/112/36 35/113/35 762 | f 34/114/34 29/103/29 30/102/30 36/115/36 763 | f 30/102/30 33/105/33 36/115/36 764 | f 37/1/37 40/116/40 42/117/42 41/118/41 765 | f 40/119/40 44/120/44 45/121/45 42/122/42 766 | f 38/123/38 43/124/43 45/121/45 44/120/44 767 | f 43/125/43 47/126/47 48/127/48 45/128/45 768 | f 39/36/39 46/129/46 48/127/48 47/126/47 769 | f 46/129/46 41/130/41 42/131/42 48/127/48 770 | f 42/131/42 45/128/45 48/127/48 771 | f 49/35/49 52/132/52 54/133/54 53/134/53 772 | f 52/132/52 56/135/56 57/136/57 54/133/54 773 | f 50/10/50 55/137/55 57/138/57 56/139/56 774 | f 55/137/55 59/140/59 60/141/60 57/138/57 775 | f 51/2/51 58/142/58 60/143/60 59/144/59 776 | f 58/145/58 53/134/53 54/133/54 60/146/60 777 | f 54/133/54 57/136/57 60/146/60 778 | f 61/56/61 64/147/64 66/148/66 65/149/65 779 | f 64/147/64 68/150/68 69/151/69 66/148/66 780 | f 62/70/62 67/152/67 69/153/69 68/154/68 781 | f 67/152/67 71/155/71 72/156/72 69/153/69 782 | f 63/11/63 70/157/70 72/158/72 71/159/71 783 | f 70/160/70 65/149/65 66/148/66 72/161/72 784 | f 66/162/66 69/163/69 72/164/72 785 | f 73/69/73 76/165/76 78/166/78 77/167/77 786 | f 76/165/76 80/168/80 81/169/81 78/166/78 787 | f 74/8/74 79/170/79 81/171/81 80/172/80 788 | f 79/170/79 83/173/83 84/174/84 81/171/81 789 | f 75/12/75 82/175/82 84/174/84 83/173/83 790 | f 82/176/82 77/167/77 78/166/78 84/177/84 791 | f 78/166/78 81/169/81 84/177/84 792 | f 85/45/85 88/178/88 90/179/90 89/180/89 793 | f 88/181/88 92/182/92 93/183/93 90/184/90 794 | f 86/34/86 91/185/91 93/183/93 92/182/92 795 | f 91/185/91 95/186/95 96/187/96 93/183/93 796 | f 87/16/87 94/188/94 96/187/96 95/186/95 797 | f 94/188/94 89/180/89 90/179/90 96/187/96 798 | f 90/184/90 93/183/93 96/189/96 799 | f 97/61/97 100/190/100 102/191/102 101/192/101 800 | f 100/193/100 104/194/104 105/195/105 102/196/102 801 | f 98/54/98 103/197/103 105/195/105 104/194/104 802 | f 103/197/103 107/198/107 108/199/108 105/195/105 803 | f 99/50/99 106/200/106 108/199/108 107/198/107 804 | f 106/200/106 101/192/101 102/191/102 108/199/108 805 | f 102/201/102 105/202/105 108/203/108 806 | f 109/67/109 112/204/112 114/205/114 113/206/113 807 | f 112/204/112 116/207/116 117/208/117 114/205/114 808 | f 110/63/110 115/209/115 117/208/117 116/207/116 809 | f 115/210/115 119/211/119 120/212/120 117/213/117 810 | f 111/23/111 118/214/118 120/212/120 119/211/119 811 | f 118/214/118 113/206/113 114/205/114 120/212/120 812 | f 114/205/114 117/215/117 120/216/120 813 | f 121/65/121 124/217/124 126/218/126 125/219/125 814 | f 124/217/124 128/220/128 129/221/129 126/218/126 815 | f 122/60/122 127/222/127 129/221/129 128/220/128 816 | f 127/222/127 131/223/131 132/224/132 129/221/129 817 | f 123/24/123 130/225/130 132/224/132 131/223/131 818 | f 130/225/130 125/226/125 126/227/126 132/224/132 819 | f 126/227/126 129/228/129 132/224/132 820 | f 133/21/133 136/229/136 138/230/138 137/231/137 821 | f 136/229/136 140/232/140 141/233/141 138/230/138 822 | f 134/62/134 139/234/139 141/235/141 140/236/140 823 | f 139/234/139 143/237/143 144/238/144 141/235/141 824 | f 135/47/135 142/239/142 144/238/144 143/237/143 825 | f 142/239/142 137/231/137 138/230/138 144/238/144 826 | f 138/230/138 141/233/141 144/240/144 827 | f 145/28/145 148/241/148 150/242/150 149/243/149 828 | f 148/241/148 152/244/152 153/245/153 150/242/150 829 | f 146/64/146 151/246/151 153/245/153 152/244/152 830 | f 151/247/151 155/248/155 156/249/156 153/250/153 831 | f 147/71/147 154/251/154 156/249/156 155/248/155 832 | f 154/251/154 149/243/149 150/242/150 156/249/156 833 | f 150/252/150 153/253/153 156/254/156 834 | f 157/73/157 160/255/160 162/256/162 161/257/161 835 | f 160/258/160 164/259/164 165/260/165 162/261/162 836 | f 158/19/158 163/262/163 165/260/165 164/259/164 837 | f 163/262/163 167/263/167 168/264/168 165/260/165 838 | f 159/26/159 166/265/166 168/264/168 167/263/167 839 | f 166/265/166 161/257/161 162/256/162 168/264/168 840 | f 162/266/162 165/267/165 168/268/168 841 | f 169/75/169 172/269/172 174/270/174 173/271/173 842 | f 172/269/172 176/272/176 177/273/177 174/270/174 843 | f 170/49/170 175/274/175 177/273/177 176/272/176 844 | f 175/274/175 179/275/179 180/276/180 177/273/177 845 | f 171/32/171 178/277/178 180/276/180 179/275/179 846 | f 178/277/178 173/278/173 174/279/174 180/276/180 847 | f 174/280/174 177/273/177 180/281/180 848 | f 181/51/181 184/282/184 186/283/186 185/284/185 849 | f 184/282/184 188/285/188 189/286/189 186/283/186 850 | f 182/53/182 187/287/187 189/286/189 188/285/188 851 | f 187/287/187 191/288/191 192/289/192 189/286/189 852 | f 183/33/183 190/290/190 192/291/192 191/292/191 853 | f 190/290/190 185/284/185 186/283/186 192/291/192 854 | f 186/293/186 189/286/189 192/289/192 855 | f 3/14/3 13/13/13 17/294/17 10/86/10 856 | f 10/86/10 17/294/17 22/98/22 5/295/5 857 | f 5/295/5 22/98/22 15/5/15 1/4/1 858 | f 14/41/14 25/43/25 29/103/29 19/95/19 859 | f 19/95/19 29/103/29 34/114/34 23/96/23 860 | f 23/100/23 34/111/34 27/6/27 15/5/15 861 | f 1/4/1 38/123/38 44/120/44 4/76/4 862 | f 4/76/4 44/120/44 40/119/40 8/79/8 863 | f 8/296/8 40/116/40 37/1/37 2/3/2 864 | f 26/55/26 39/57/39 47/297/47 31/106/31 865 | f 31/106/31 47/297/47 43/298/43 35/109/35 866 | f 35/113/35 43/124/43 38/123/38 27/299/27 867 | f 49/35/49 61/37/61 65/300/65 52/132/52 868 | f 52/132/52 65/300/65 70/301/70 56/135/56 869 | f 56/302/56 70/157/70 63/11/63 50/10/50 870 | f 62/70/62 73/69/73 77/167/77 67/152/67 871 | f 67/152/67 77/167/77 82/176/82 71/155/71 872 | f 71/159/71 82/175/82 75/12/75 63/11/63 873 | f 50/10/50 86/34/86 92/182/92 55/137/55 874 | f 55/137/55 92/182/92 88/181/88 59/140/59 875 | f 59/144/59 88/178/88 85/45/85 51/44/51 876 | f 74/8/74 87/7/87 95/303/95 79/170/79 877 | f 79/170/79 95/303/95 91/185/91 83/173/83 878 | f 83/173/83 91/185/91 86/34/86 75/12/75 879 | f 2/3/2 85/45/85 89/180/89 7/81/7 880 | f 7/81/7 89/180/89 94/188/94 11/304/11 881 | f 11/304/11 94/188/94 87/16/87 3/18/3 882 | f 39/36/39 49/35/49 53/134/53 46/129/46 883 | f 46/129/46 53/134/53 58/145/58 41/130/41 884 | f 41/118/41 58/142/58 51/2/51 37/1/37 885 | f 99/50/99 109/67/109 113/206/113 106/200/106 886 | f 106/200/106 113/206/113 118/214/118 101/305/101 887 | f 101/305/101 118/214/118 111/23/111 97/22/97 888 | f 110/63/110 121/65/121 125/219/125 115/209/115 889 | f 115/210/115 125/226/125 130/225/130 119/211/119 890 | f 119/211/119 130/225/130 123/24/123 111/23/111 891 | f 97/61/97 134/62/134 140/236/140 100/190/100 892 | f 100/306/100 140/232/140 136/229/136 104/307/104 893 | f 104/307/104 136/229/136 133/21/133 98/20/98 894 | f 122/60/122 135/59/135 143/308/143 127/222/127 895 | f 127/222/127 143/308/143 139/234/139 131/309/131 896 | f 131/309/131 139/234/139 134/62/134 123/24/123 897 | f 147/71/147 157/73/157 161/257/161 154/251/154 898 | f 154/251/154 161/257/161 166/265/166 149/310/149 899 | f 149/310/149 166/265/166 159/26/159 145/25/145 900 | f 146/64/146 169/75/169 173/271/173 151/246/151 901 | f 151/311/151 173/278/173 178/277/178 155/312/155 902 | f 155/312/155 178/277/178 171/32/171 147/31/147 903 | f 170/49/170 181/51/181 185/284/185 175/274/175 904 | f 175/274/175 185/284/185 190/290/190 179/275/179 905 | f 179/275/179 190/290/190 183/33/183 171/32/171 906 | f 157/73/157 183/72/183 191/313/191 160/255/160 907 | f 160/314/160 191/288/191 187/287/187 164/315/164 908 | f 164/315/164 187/287/187 182/53/182 158/52/158 909 | f 25/43/25 62/42/62 68/316/68 28/101/28 910 | f 28/101/28 68/316/68 64/317/64 32/104/32 911 | f 32/108/32 64/318/64 61/56/61 26/55/26 912 | f 135/47/135 159/46/159 167/319/167 142/239/142 913 | f 142/239/142 167/319/167 163/262/163 137/231/137 914 | f 137/231/137 163/262/163 158/19/158 133/21/133 915 | f 121/65/121 146/64/146 152/320/152 124/217/124 916 | f 124/217/124 152/320/152 148/241/148 128/321/128 917 | f 128/321/128 148/241/148 145/28/145 122/30/122 918 | f 13/38/13 74/40/74 80/322/80 16/88/16 919 | f 16/323/16 80/168/80 76/165/76 20/324/20 920 | f 20/324/20 76/165/76 73/69/73 14/68/14 921 | f 109/67/109 170/66/170 176/325/176 112/204/112 922 | f 112/204/112 176/325/176 172/269/172 116/326/116 923 | f 116/326/116 172/269/172 169/75/169 110/74/110 924 | f 98/54/98 182/53/182 188/285/188 103/197/103 925 | f 103/197/103 188/285/188 184/282/184 107/327/107 926 | f 107/327/107 184/282/184 181/51/181 99/50/99 927 | f 1/4/1 27/299/27 38/123/38 928 | -------------------------------------------------------------------------------- /src/assets/boxSmooth.obj: -------------------------------------------------------------------------------- 1 | # Blender 4.3.2 2 | # www.blender.org 3 | o obj_0 4 | v 0.550658 1.088587 0.195712 5 | v 0.538587 1.100658 0.195712 6 | v 0.540658 1.090658 0.200658 7 | v 0.550014 1.092301 0.195712 8 | v 0.548324 1.095659 0.195712 9 | v 0.550140 1.088797 0.197209 10 | v 0.549139 1.092447 0.197180 11 | v 0.547815 1.095582 0.197162 12 | v 0.548748 1.089142 0.198595 13 | v 0.548005 1.092617 0.198495 14 | v 0.547036 1.095364 0.198342 15 | v 0.538797 1.100140 0.197209 16 | v 0.539142 1.098748 0.198595 17 | v 0.542301 1.100014 0.195712 18 | v 0.542419 1.099129 0.197189 19 | v 0.542612 1.098032 0.198500 20 | v 0.545659 1.098324 0.195712 21 | v 0.545570 1.097782 0.197162 22 | v 0.545364 1.097036 0.198342 23 | v 0.543750 1.090122 0.200392 24 | v 0.546539 1.089600 0.199693 25 | v 0.540122 1.093750 0.200392 26 | v 0.543338 1.093319 0.199965 27 | v 0.546104 1.092928 0.199423 28 | v 0.539600 1.096539 0.199693 29 | v 0.542929 1.096095 0.199410 30 | v 0.545540 1.095540 0.199033 31 | v 0.540658 0.009343 0.200658 32 | v 0.538587 -0.000658 0.195712 33 | v 0.550658 0.011333 0.195517 34 | v 0.540122 0.006250 0.200392 35 | v 0.539600 0.003461 0.199693 36 | v 0.543750 0.009852 0.200382 37 | v 0.543319 0.006645 0.199951 38 | v 0.542928 0.003886 0.199408 39 | v 0.546538 0.010350 0.199655 40 | v 0.546094 0.007038 0.199375 41 | v 0.545539 0.004439 0.199001 42 | v 0.542301 -0.000018 0.195676 43 | v 0.545660 0.001661 0.195636 44 | v 0.538797 -0.000140 0.197209 45 | v 0.542447 0.000855 0.197153 46 | v 0.545582 0.002170 0.197107 47 | v 0.539142 0.001252 0.198595 48 | v 0.542617 0.001989 0.198476 49 | v 0.545364 0.002949 0.198304 50 | v 0.550138 0.011125 0.197075 51 | v 0.548747 0.010790 0.198515 52 | v 0.550014 0.007644 0.195552 53 | v 0.549128 0.007529 0.197081 54 | v 0.548031 0.007343 0.198434 55 | v 0.548324 0.004308 0.195593 56 | v 0.547781 0.004400 0.197081 57 | v 0.547035 0.004610 0.198289 58 | v 0.538667 -0.000658 -0.245517 59 | v 0.540658 0.009342 -0.250658 60 | v 0.550658 0.011413 -0.245712 61 | v 0.538875 -0.000138 -0.247075 62 | v 0.539211 0.001253 -0.248515 63 | v 0.542356 -0.000014 -0.245552 64 | v 0.542471 0.000872 -0.247081 65 | v 0.542657 0.001969 -0.248434 66 | v 0.545692 0.001676 -0.245593 67 | v 0.545600 0.002219 -0.247081 68 | v 0.545391 0.002965 -0.248289 69 | v 0.543750 0.009878 -0.250392 70 | v 0.546539 0.010400 -0.249693 71 | v 0.540149 0.006250 -0.250381 72 | v 0.543355 0.006681 -0.249951 73 | v 0.546115 0.007072 -0.249408 74 | v 0.539651 0.003462 -0.249655 75 | v 0.542962 0.003906 -0.249375 76 | v 0.545561 0.004461 -0.249001 77 | v 0.550018 0.007699 -0.245676 78 | v 0.548339 0.004340 -0.245636 79 | v 0.550140 0.011203 -0.247209 80 | v 0.549145 0.007553 -0.247153 81 | v 0.547830 0.004418 -0.247107 82 | v 0.548748 0.010858 -0.248595 83 | v 0.548011 0.007383 -0.248476 84 | v 0.547051 0.004636 -0.248304 85 | v 0.538667 1.100658 -0.245517 86 | v 0.550658 1.088667 -0.245517 87 | v 0.540658 1.090658 -0.250658 88 | v 0.542356 1.100018 -0.245517 89 | v 0.545692 1.098339 -0.245517 90 | v 0.538875 1.100138 -0.247075 91 | v 0.542498 1.099144 -0.247045 92 | v 0.545612 1.097829 -0.247026 93 | v 0.539211 1.098747 -0.248515 94 | v 0.542661 1.098011 -0.248410 95 | v 0.545391 1.097051 -0.248252 96 | v 0.550138 1.088875 -0.247075 97 | v 0.548747 1.089211 -0.248515 98 | v 0.550018 1.092356 -0.245517 99 | v 0.549133 1.092471 -0.247054 100 | v 0.548038 1.092658 -0.248415 101 | v 0.548339 1.095692 -0.245517 102 | v 0.547796 1.095600 -0.247026 103 | v 0.547051 1.095391 -0.248252 104 | v 0.540149 1.093750 -0.250382 105 | v 0.539651 1.096538 -0.249655 106 | v 0.543750 1.090149 -0.250382 107 | v 0.543337 1.093355 -0.249938 108 | v 0.542961 1.096114 -0.249374 109 | v 0.546538 1.089651 -0.249655 110 | v 0.546105 1.092961 -0.249361 111 | v 0.545560 1.095560 -0.248969 112 | v -0.540658 1.090658 -0.250658 113 | v -0.550658 1.088587 -0.245712 114 | v -0.538587 1.100658 -0.245712 115 | v -0.543750 1.090122 -0.250392 116 | v -0.546539 1.089600 -0.249693 117 | v -0.540122 1.093750 -0.250392 118 | v -0.543338 1.093319 -0.249965 119 | v -0.546104 1.092928 -0.249423 120 | v -0.539600 1.096539 -0.249693 121 | v -0.542929 1.096095 -0.249410 122 | v -0.545540 1.095540 -0.249033 123 | v -0.550014 1.092301 -0.245712 124 | v -0.548324 1.095659 -0.245712 125 | v -0.550140 1.088797 -0.247209 126 | v -0.549139 1.092447 -0.247180 127 | v -0.547815 1.095582 -0.247162 128 | v -0.548748 1.089142 -0.248595 129 | v -0.548005 1.092617 -0.248495 130 | v -0.547036 1.095364 -0.248342 131 | v -0.538797 1.100140 -0.247209 132 | v -0.539142 1.098748 -0.248595 133 | v -0.542301 1.100014 -0.245712 134 | v -0.542419 1.099129 -0.247189 135 | v -0.542612 1.098032 -0.248500 136 | v -0.545659 1.098324 -0.245712 137 | v -0.545570 1.097782 -0.247162 138 | v -0.545364 1.097036 -0.248342 139 | v -0.540658 0.009342 -0.250658 140 | v -0.538587 -0.000658 -0.245712 141 | v -0.550658 0.011333 -0.245517 142 | v -0.540122 0.006250 -0.250392 143 | v -0.539600 0.003461 -0.249693 144 | v -0.543750 0.009851 -0.250382 145 | v -0.543319 0.006645 -0.249951 146 | v -0.542928 0.003885 -0.249408 147 | v -0.546538 0.010349 -0.249655 148 | v -0.546094 0.007038 -0.249375 149 | v -0.545539 0.004439 -0.249001 150 | v -0.542301 -0.000018 -0.245676 151 | v -0.545660 0.001661 -0.245636 152 | v -0.538797 -0.000140 -0.247209 153 | v -0.542447 0.000855 -0.247153 154 | v -0.545582 0.002170 -0.247107 155 | v -0.539142 0.001252 -0.248595 156 | v -0.542617 0.001989 -0.248476 157 | v -0.545364 0.002949 -0.248304 158 | v -0.550138 0.011125 -0.247075 159 | v -0.548747 0.010789 -0.248515 160 | v -0.550014 0.007644 -0.245552 161 | v -0.549128 0.007529 -0.247081 162 | v -0.548031 0.007343 -0.248434 163 | v -0.548324 0.004308 -0.245593 164 | v -0.547781 0.004400 -0.247081 165 | v -0.547035 0.004609 -0.248289 166 | v -0.538667 -0.000658 0.195517 167 | v -0.540659 0.009343 0.200731 168 | v -0.550658 0.011413 0.195712 169 | v -0.538876 -0.000138 0.197079 170 | v -0.539212 0.001253 0.198529 171 | v -0.542356 -0.000014 0.195552 172 | v -0.542471 0.000872 0.197086 173 | v -0.542658 0.001969 0.198446 174 | v -0.545692 0.001676 0.195593 175 | v -0.545600 0.002219 0.197085 176 | v -0.545391 0.002965 0.198299 177 | v -0.543751 0.009878 0.200442 178 | v -0.546539 0.010399 0.199723 179 | v -0.540151 0.006251 0.200432 180 | v -0.543356 0.006681 0.199987 181 | v -0.546115 0.007072 0.199431 182 | v -0.539653 0.003462 0.199685 183 | v -0.542963 0.003906 0.199398 184 | v -0.545561 0.004461 0.199017 185 | v -0.550018 0.007699 0.195676 186 | v -0.548339 0.004340 0.195636 187 | v -0.550140 0.011202 0.197213 188 | v -0.549145 0.007552 0.197158 189 | v -0.547830 0.004417 0.197112 190 | v -0.548748 0.010856 0.198609 191 | v -0.548011 0.007382 0.198488 192 | v -0.547051 0.004636 0.198314 193 | v -0.538667 1.100658 0.195517 194 | v -0.550658 1.088667 0.195517 195 | v -0.540659 1.090658 0.200658 196 | v -0.542356 1.100018 0.195517 197 | v -0.545692 1.098339 0.195517 198 | v -0.538875 1.100138 0.197075 199 | v -0.542498 1.099144 0.197045 200 | v -0.545612 1.097829 0.197026 201 | v -0.539211 1.098747 0.198515 202 | v -0.542662 1.098011 0.198410 203 | v -0.545391 1.097051 0.198252 204 | v -0.550138 1.088875 0.197075 205 | v -0.548747 1.089211 0.198515 206 | v -0.550018 1.092356 0.195517 207 | v -0.549133 1.092471 0.197054 208 | v -0.548038 1.092658 0.198415 209 | v -0.548339 1.095692 0.195517 210 | v -0.547796 1.095600 0.197026 211 | v -0.547051 1.095391 0.198252 212 | v -0.540150 1.093750 0.200382 213 | v -0.539651 1.096538 0.199655 214 | v -0.543750 1.090149 0.200382 215 | v -0.543337 1.093355 0.199938 216 | v -0.542961 1.096114 0.199374 217 | v -0.546539 1.089651 0.199655 218 | v -0.546105 1.092961 0.199361 219 | v -0.545560 1.095560 0.198969 220 | v -0.494379 0.067702 -0.189531 221 | v -0.482308 0.055631 -0.189531 222 | v -0.484364 0.065646 -0.194356 223 | v -0.493734 0.063989 -0.189572 224 | v -0.492043 0.060631 -0.189595 225 | v -0.493858 0.067490 -0.190992 226 | v -0.492853 0.063848 -0.190982 227 | v -0.491525 0.060718 -0.190975 228 | v -0.492464 0.067145 -0.192347 229 | v -0.491712 0.063683 -0.192250 230 | v -0.490739 0.060942 -0.192104 231 | v -0.482520 0.056152 -0.190992 232 | v -0.482865 0.057546 -0.192347 233 | v -0.486021 0.056276 -0.189572 234 | v -0.486134 0.057168 -0.190989 235 | v -0.486323 0.058271 -0.192255 236 | v -0.489379 0.057967 -0.189595 237 | v -0.489280 0.058519 -0.190975 238 | v -0.489068 0.059271 -0.192104 239 | v -0.487459 0.066174 -0.194099 240 | v -0.490251 0.066690 -0.193417 241 | v -0.483836 0.062551 -0.194099 242 | v -0.487046 0.062982 -0.193679 243 | v -0.489810 0.063373 -0.193149 244 | v -0.483320 0.059758 -0.193417 245 | v -0.486637 0.060209 -0.193136 246 | v -0.489243 0.060767 -0.192769 247 | v -0.489321 1.039372 -0.199321 248 | v -0.487306 1.049376 -0.194536 249 | v -0.499315 1.037387 -0.194276 250 | v -0.488795 1.042464 -0.199076 251 | v -0.488285 1.045254 -0.198407 252 | v -0.492410 1.038853 -0.199047 253 | v -0.491993 1.042065 -0.198643 254 | v -0.491614 1.044828 -0.198125 255 | v -0.495197 1.038350 -0.198333 256 | v -0.494769 1.041669 -0.198076 257 | v -0.494226 1.044272 -0.197723 258 | v -0.491017 1.048736 -0.194491 259 | v -0.494366 1.047057 -0.194438 260 | v -0.487506 1.048857 -0.195996 261 | v -0.491154 1.047862 -0.195933 262 | v -0.494284 1.046546 -0.195877 263 | v -0.487840 1.047464 -0.197345 264 | v -0.491314 1.046727 -0.197223 265 | v -0.494059 1.045765 -0.197048 266 | v -0.498795 1.037583 -0.195802 267 | v -0.497405 1.037912 -0.197214 268 | v -0.498690 1.041075 -0.194325 269 | v -0.497803 1.041183 -0.195824 270 | v -0.496706 1.041365 -0.197152 271 | v -0.497016 1.044411 -0.194381 272 | v -0.496472 1.044315 -0.195839 273 | v -0.495723 1.044103 -0.197024 274 | v -0.487693 1.049682 0.195994 275 | v -0.509686 1.059686 0.201031 276 | v -0.499621 1.037614 0.196230 277 | v -0.489929 1.050195 0.197508 278 | v -0.493651 1.051600 0.198933 279 | v -0.491378 1.049039 0.196034 280 | v -0.493323 1.049450 0.197518 281 | v -0.495864 1.050388 0.198858 282 | v -0.494705 1.047349 0.196082 283 | v -0.496107 1.048136 0.197524 284 | v -0.497599 1.048996 0.198719 285 | v -0.506600 1.053953 0.200774 286 | v -0.503800 1.048374 0.200097 287 | v -0.504041 1.056603 0.200761 288 | v -0.502741 1.052699 0.200344 289 | v -0.501526 1.048971 0.199817 290 | v -0.498518 1.053812 0.200051 291 | v -0.499060 1.051520 0.199780 292 | v -0.499358 1.049319 0.199417 293 | v -0.499000 1.041328 0.196185 294 | v -0.497338 1.044685 0.196134 295 | v -0.500151 1.039789 0.197671 296 | v -0.499519 1.043330 0.197609 297 | v -0.498168 1.046085 0.197557 298 | v -0.501574 1.043489 0.199031 299 | v -0.500407 1.045813 0.198911 300 | v -0.499009 1.047554 0.198738 301 | v -0.487628 0.050392 0.196030 302 | v -0.499618 0.062382 0.196030 303 | v -0.509686 0.040324 0.201031 304 | v -0.491316 0.051032 0.195989 305 | v -0.494652 0.052712 0.195966 306 | v -0.489875 0.049859 0.197533 307 | v -0.493363 0.050505 0.197481 308 | v -0.496081 0.051868 0.197448 309 | v -0.493611 0.048437 0.198949 310 | v -0.495875 0.049613 0.198837 311 | v -0.497573 0.051019 0.198674 312 | v -0.500151 0.060135 0.197533 313 | v -0.501573 0.056399 0.198949 314 | v -0.498978 0.058694 0.195989 315 | v -0.499411 0.056734 0.197490 316 | v -0.500370 0.054178 0.198842 317 | v -0.497298 0.055358 0.195966 318 | v -0.498108 0.053941 0.197448 319 | v -0.498991 0.052437 0.198674 320 | v -0.504029 0.043410 0.200763 321 | v -0.498492 0.046210 0.200058 322 | v -0.506600 0.045981 0.200763 323 | v -0.502737 0.047278 0.200333 324 | v -0.499035 0.048492 0.199782 325 | v -0.503800 0.051518 0.200058 326 | v -0.501527 0.050970 0.199769 327 | v -0.499341 0.050669 0.199383 328 | v 0.509686 1.059686 0.200958 329 | v 0.487613 1.049682 0.196193 330 | v 0.499682 1.037613 0.196192 331 | v 0.503938 1.056602 0.200721 332 | v 0.498351 1.053811 0.200059 333 | v 0.506602 1.053938 0.200721 334 | v 0.502690 1.052686 0.200320 335 | v 0.498958 1.051507 0.199803 336 | v 0.503811 1.048351 0.200059 337 | v 0.501516 1.048964 0.199790 338 | v 0.499312 1.049312 0.199428 339 | v 0.491326 1.049038 0.196190 340 | v 0.494684 1.047348 0.196189 341 | v 0.489774 1.050194 0.197641 342 | v 0.493321 1.049543 0.197610 343 | v 0.496080 1.048167 0.197592 344 | v 0.493466 1.051599 0.199002 345 | v 0.495799 1.050413 0.198904 346 | v 0.497547 1.048993 0.198756 347 | v 0.500194 1.039774 0.197641 348 | v 0.501599 1.043466 0.199002 349 | v 0.499038 1.041326 0.196190 350 | v 0.499449 1.043231 0.197619 351 | v 0.500386 1.045755 0.198909 352 | v 0.497348 1.044684 0.196189 353 | v 0.498133 1.046068 0.197592 354 | v 0.498993 1.047547 0.198756 355 | v 0.499682 0.062317 0.195994 356 | v 0.487614 0.050389 0.196230 357 | v 0.509686 0.040324 0.201031 358 | v 0.499038 0.058632 0.196034 359 | v 0.497349 0.055305 0.196082 360 | v 0.500195 0.060081 0.197508 361 | v 0.499545 0.056600 0.197509 362 | v 0.498170 0.053890 0.197524 363 | v 0.501600 0.056359 0.198933 364 | v 0.500415 0.054102 0.198853 365 | v 0.498996 0.052411 0.198719 366 | v 0.489789 0.049859 0.197671 367 | v 0.493489 0.048436 0.199031 368 | v 0.491328 0.051010 0.196185 369 | v 0.493241 0.050585 0.197617 370 | v 0.495769 0.049630 0.198915 371 | v 0.494685 0.052672 0.196134 372 | v 0.496072 0.051876 0.197557 373 | v 0.497554 0.051001 0.198738 374 | v 0.506603 0.045969 0.200761 375 | v 0.503812 0.051492 0.200051 376 | v 0.503953 0.043410 0.200774 377 | v 0.502695 0.047264 0.200345 378 | v 0.501511 0.050955 0.199794 379 | v 0.498374 0.046210 0.200097 380 | v 0.498977 0.048475 0.199805 381 | v 0.499319 0.050652 0.199417 382 | v 0.487386 1.049376 -0.194338 383 | v 0.489372 1.039372 -0.199321 384 | v 0.499376 1.037386 -0.194338 385 | v 0.487589 1.048855 -0.195860 386 | v 0.487922 1.047463 -0.197263 387 | v 0.491075 1.048736 -0.194340 388 | v 0.491186 1.047850 -0.195840 389 | v 0.491371 1.046754 -0.197167 390 | v 0.494411 1.047057 -0.194341 391 | v 0.494316 1.046513 -0.195813 392 | v 0.494105 1.045766 -0.197009 393 | v 0.492464 1.038860 -0.199066 394 | v 0.495253 1.038361 -0.198368 395 | v 0.488860 1.042464 -0.199066 396 | v 0.492068 1.042050 -0.198642 397 | v 0.494829 1.041674 -0.198099 398 | v 0.488361 1.045253 -0.198368 399 | v 0.491674 1.044819 -0.198086 400 | v 0.494274 1.044274 -0.197707 401 | v 0.498736 1.041075 -0.194340 402 | v 0.497057 1.044410 -0.194341 403 | v 0.498855 1.037589 -0.195860 404 | v 0.497861 1.041214 -0.195831 405 | v 0.496546 1.044328 -0.195813 406 | v 0.497463 1.037922 -0.197263 407 | v 0.496726 1.041375 -0.197162 408 | v 0.495766 1.044105 -0.197009 409 | v 0.489372 0.060689 -0.199321 410 | v 0.487387 0.050695 -0.194276 411 | v 0.499376 0.062704 -0.194536 412 | v 0.488853 0.057600 -0.199047 413 | v 0.488351 0.054813 -0.198333 414 | v 0.492465 0.061215 -0.199076 415 | v 0.492046 0.057999 -0.198643 416 | v 0.491668 0.055232 -0.198089 417 | v 0.495254 0.061725 -0.198407 418 | v 0.494818 0.058395 -0.198113 419 | v 0.494272 0.055784 -0.197723 420 | v 0.491075 0.051320 -0.194325 421 | v 0.494411 0.052994 -0.194381 422 | v 0.487583 0.051215 -0.195802 423 | v 0.491211 0.052196 -0.195815 424 | v 0.494327 0.053504 -0.195839 425 | v 0.487912 0.052605 -0.197214 426 | v 0.491369 0.053332 -0.197147 427 | v 0.494103 0.054287 -0.197024 428 | v 0.498857 0.062504 -0.195996 429 | v 0.497464 0.062170 -0.197345 430 | v 0.498736 0.058993 -0.194491 431 | v 0.497851 0.058884 -0.195941 432 | v 0.496754 0.058700 -0.197228 433 | v 0.497057 0.055644 -0.194438 434 | v 0.496513 0.055739 -0.195877 435 | v 0.495766 0.055951 -0.197048 436 | vn 0.9796 0.0898 0.1800 437 | vn 0.0901 0.9794 0.1807 438 | vn 0.0596 0.0596 0.9964 439 | vn 0.9319 0.3042 0.1974 440 | vn 0.8057 0.5665 0.1729 441 | vn 0.8438 0.0980 0.5277 442 | vn 0.8131 0.2787 0.5110 443 | vn 0.7367 0.5102 0.4439 444 | vn 0.6078 0.0838 0.7897 445 | vn 0.6162 0.2162 0.7573 446 | vn 0.5895 0.3990 0.7023 447 | vn 0.0981 0.8442 0.5270 448 | vn 0.0834 0.6084 0.7892 449 | vn 0.3052 0.9308 0.2014 450 | vn 0.2795 0.8134 0.5102 451 | vn 0.2193 0.6193 0.7539 452 | vn 0.5650 0.8059 0.1767 453 | vn 0.5086 0.7392 0.4415 454 | vn 0.3989 0.5922 0.7001 455 | vn 0.1761 0.0658 0.9822 456 | vn 0.3553 0.0653 0.9325 457 | vn 0.0666 0.1770 0.9820 458 | vn 0.1739 0.1750 0.9691 459 | vn 0.3409 0.1718 0.9242 460 | vn 0.0655 0.3539 0.9330 461 | vn 0.1709 0.3387 0.9252 462 | vn 0.3164 0.3166 0.8943 463 | vn 0.0608 -0.0609 0.9963 464 | vn 0.0904 -0.9795 0.1801 465 | vn 0.9800 -0.0901 0.1776 466 | vn 0.0673 -0.1782 0.9817 467 | vn 0.0669 -0.3572 0.9316 468 | vn 0.1798 -0.0672 0.9814 469 | vn 0.1797 -0.1750 0.9680 470 | vn 0.1761 -0.3425 0.9229 471 | vn 0.3589 -0.0659 0.9310 472 | vn 0.3475 -0.1718 0.9218 473 | vn 0.3235 -0.3184 0.8910 474 | vn 0.3050 -0.9319 0.1962 475 | vn 0.5671 -0.8058 0.1706 476 | vn 0.0992 -0.8443 0.5266 477 | vn 0.2811 -0.8142 0.5080 478 | vn 0.5123 -0.7381 0.4390 479 | vn 0.0853 -0.6092 0.7884 480 | vn 0.2197 -0.6180 0.7549 481 | vn 0.4033 -0.5922 0.6976 482 | vn 0.8479 -0.0981 0.5210 483 | vn 0.6142 -0.0834 0.7848 484 | vn 0.9319 -0.3051 0.1960 485 | vn 0.8199 -0.2796 0.4996 486 | vn 0.6291 -0.2197 0.7457 487 | vn 0.8065 -0.5652 0.1733 488 | vn 0.7428 -0.5096 0.4342 489 | vn 0.5992 -0.4006 0.6931 490 | vn 0.0901 -0.9800 -0.1776 491 | vn 0.0586 -0.0593 -0.9965 492 | vn 0.9795 -0.0904 -0.1802 493 | vn 0.0981 -0.8479 -0.5210 494 | vn 0.0834 -0.6142 -0.7848 495 | vn 0.3051 -0.9319 -0.1960 496 | vn 0.2796 -0.8199 -0.4996 497 | vn 0.2197 -0.6291 -0.7456 498 | vn 0.5652 -0.8065 -0.1733 499 | vn 0.5096 -0.7428 -0.4341 500 | vn 0.4006 -0.5992 -0.6931 501 | vn 0.1765 -0.0673 -0.9820 502 | vn 0.3557 -0.0669 -0.9322 503 | vn 0.0672 -0.1798 -0.9814 504 | vn 0.1750 -0.1797 -0.9680 505 | vn 0.3426 -0.1761 -0.9228 506 | vn 0.0659 -0.3589 -0.9310 507 | vn 0.1718 -0.3475 -0.9218 508 | vn 0.3184 -0.3235 -0.8910 509 | vn 0.9319 -0.3050 -0.1962 510 | vn 0.8058 -0.5671 -0.1706 511 | vn 0.8440 -0.0992 -0.5271 512 | vn 0.8142 -0.2811 -0.5080 513 | vn 0.7381 -0.5123 -0.4390 514 | vn 0.6082 -0.0853 -0.7892 515 | vn 0.6180 -0.2197 -0.7549 516 | vn 0.5922 -0.4033 -0.6976 517 | vn 0.0903 0.9800 -0.1771 518 | vn 0.9799 0.0906 -0.1778 519 | vn 0.0594 0.0594 -0.9965 520 | vn 0.3049 0.9330 -0.1910 521 | vn 0.5672 0.8064 -0.1674 522 | vn 0.0991 0.8477 -0.5212 523 | vn 0.2810 0.8206 -0.4977 524 | vn 0.5131 0.7417 -0.4319 525 | vn 0.0854 0.6140 -0.7847 526 | vn 0.2200 0.6280 -0.7465 527 | vn 0.4049 0.5993 -0.6906 528 | vn 0.8481 0.0992 -0.5205 529 | vn 0.6146 0.0849 -0.7843 530 | vn 0.9319 0.3059 -0.1948 531 | vn 0.8209 0.2819 -0.4967 532 | vn 0.6307 0.2230 -0.7433 533 | vn 0.8066 0.5658 -0.1710 534 | vn 0.7441 0.5116 -0.4296 535 | vn 0.6018 0.4047 -0.6885 536 | vn 0.0678 0.1793 -0.9815 537 | vn 0.0672 0.3608 -0.9302 538 | vn 0.1801 0.0687 -0.9812 539 | vn 0.1808 0.1797 -0.9670 540 | vn 0.1770 0.3514 -0.9194 541 | vn 0.3594 0.0675 -0.9307 542 | vn 0.3492 0.1760 -0.9204 543 | vn 0.3256 0.3254 -0.8877 544 | vn -0.0584 0.0584 -0.9966 545 | vn -0.9796 0.0898 -0.1800 546 | vn -0.0901 0.9794 -0.1807 547 | vn -0.1761 0.0658 -0.9822 548 | vn -0.3553 0.0653 -0.9325 549 | vn -0.0666 0.1770 -0.9820 550 | vn -0.1739 0.1749 -0.9691 551 | vn -0.3409 0.1718 -0.9242 552 | vn -0.0655 0.3539 -0.9330 553 | vn -0.1709 0.3387 -0.9252 554 | vn -0.3164 0.3166 -0.8942 555 | vn -0.9319 0.3042 -0.1974 556 | vn -0.8057 0.5665 -0.1729 557 | vn -0.8438 0.0980 -0.5277 558 | vn -0.8131 0.2787 -0.5110 559 | vn -0.7367 0.5102 -0.4439 560 | vn -0.6078 0.0838 -0.7897 561 | vn -0.6162 0.2162 -0.7573 562 | vn -0.5895 0.3990 -0.7023 563 | vn -0.0981 0.8442 -0.5270 564 | vn -0.0834 0.6084 -0.7892 565 | vn -0.3052 0.9308 -0.2014 566 | vn -0.2795 0.8134 -0.5102 567 | vn -0.2193 0.6193 -0.7539 568 | vn -0.5650 0.8059 -0.1767 569 | vn -0.5086 0.7392 -0.4415 570 | vn -0.3989 0.5922 -0.7002 571 | vn -0.0593 -0.0586 -0.9965 572 | vn -0.0904 -0.9795 -0.1802 573 | vn -0.9800 -0.0901 -0.1776 574 | vn -0.0673 -0.1765 -0.9820 575 | vn -0.0669 -0.3557 -0.9322 576 | vn -0.1798 -0.0672 -0.9814 577 | vn -0.1797 -0.1750 -0.9680 578 | vn -0.1761 -0.3426 -0.9229 579 | vn -0.3589 -0.0659 -0.9310 580 | vn -0.3475 -0.1719 -0.9218 581 | vn -0.3235 -0.3184 -0.8910 582 | vn -0.3050 -0.9319 -0.1962 583 | vn -0.5671 -0.8058 -0.1706 584 | vn -0.0992 -0.8440 -0.5271 585 | vn -0.2811 -0.8142 -0.5080 586 | vn -0.5123 -0.7381 -0.4390 587 | vn -0.0854 -0.6082 -0.7892 588 | vn -0.2197 -0.6180 -0.7549 589 | vn -0.4033 -0.5922 -0.6976 590 | vn -0.8479 -0.0981 -0.5210 591 | vn -0.6142 -0.0834 -0.7848 592 | vn -0.9319 -0.3051 -0.1960 593 | vn -0.8199 -0.2796 -0.4996 594 | vn -0.6291 -0.2197 -0.7456 595 | vn -0.8065 -0.5652 -0.1733 596 | vn -0.7428 -0.5096 -0.4342 597 | vn -0.5993 -0.4006 -0.6931 598 | vn -0.0901 -0.9800 0.1772 599 | vn -0.0626 -0.0633 0.9960 600 | vn -0.9795 -0.0904 0.1798 601 | vn -0.0982 -0.8487 0.5197 602 | vn -0.0840 -0.6166 0.7828 603 | vn -0.3052 -0.9320 0.1954 604 | vn -0.2799 -0.8208 0.4979 605 | vn -0.2209 -0.6317 0.7431 606 | vn -0.5653 -0.8066 0.1727 607 | vn -0.5100 -0.7434 0.4327 608 | vn -0.4019 -0.6010 0.6908 609 | vn -0.1814 -0.0698 0.9809 610 | vn -0.3599 -0.0682 0.9305 611 | vn -0.0697 -0.1846 0.9803 612 | vn -0.1802 -0.1848 0.9661 613 | vn -0.3471 -0.1790 0.9206 614 | vn -0.0672 -0.3630 0.9294 615 | vn -0.1748 -0.3520 0.9195 616 | vn -0.3215 -0.3265 0.8888 617 | vn -0.9320 -0.3050 0.1956 618 | vn -0.8059 -0.5672 0.1700 619 | vn -0.8448 -0.0993 0.5257 620 | vn -0.8152 -0.2814 0.5062 621 | vn -0.7387 -0.5127 0.4375 622 | vn -0.6108 -0.0859 0.7872 623 | vn -0.6207 -0.2209 0.7522 624 | vn -0.5941 -0.4046 0.6953 625 | vn -0.0903 0.9800 0.1771 626 | vn -0.9799 0.0906 0.1777 627 | vn -0.0617 0.0609 0.9962 628 | vn -0.3049 0.9330 0.1910 629 | vn -0.5673 0.8064 0.1674 630 | vn -0.0991 0.8477 0.5212 631 | vn -0.2810 0.8206 0.4976 632 | vn -0.5131 0.7417 0.4319 633 | vn -0.0854 0.6140 0.7847 634 | vn -0.2200 0.6280 0.7465 635 | vn -0.4049 0.5993 0.6906 636 | vn -0.8484 0.0992 0.5199 637 | vn -0.6156 0.0849 0.7835 638 | vn -0.9319 0.3059 0.1948 639 | vn -0.8209 0.2819 0.4966 640 | vn -0.6308 0.2231 0.7432 641 | vn -0.8066 0.5658 0.1710 642 | vn -0.7441 0.5116 0.4295 643 | vn -0.6019 0.4048 0.6884 644 | vn -0.0679 0.1793 0.9815 645 | vn -0.0672 0.3608 0.9302 646 | vn -0.1819 0.0687 0.9809 647 | vn -0.1808 0.1797 0.9670 648 | vn -0.1770 0.3514 0.9193 649 | vn -0.3609 0.0675 0.9302 650 | vn -0.3492 0.1760 0.9204 651 | vn -0.3256 0.3254 0.8877 652 | vn 0.9775 0.0905 0.1906 653 | vn 0.0908 0.9773 0.1913 654 | vn 0.0589 0.0589 0.9965 655 | vn 0.9289 0.3017 0.2148 656 | vn 0.8028 0.5638 0.1937 657 | vn 0.8372 0.1001 0.5376 658 | vn 0.8037 0.2749 0.5277 659 | vn 0.7278 0.5042 0.4648 660 | vn 0.5981 0.0866 0.7967 661 | vn 0.6041 0.2131 0.7679 662 | vn 0.5771 0.3916 0.7166 663 | vn 0.1003 0.8376 0.5370 664 | vn 0.0862 0.5989 0.7962 665 | vn 0.3027 0.9276 0.2188 666 | vn 0.2757 0.8040 0.5269 667 | vn 0.2163 0.6074 0.7644 668 | vn 0.5623 0.8030 0.1977 669 | vn 0.5027 0.7304 0.4624 670 | vn 0.3915 0.5800 0.7144 671 | vn 0.1722 0.0678 0.9827 672 | vn 0.3478 0.0681 0.9351 673 | vn 0.0686 0.1730 0.9825 674 | vn 0.1705 0.1715 0.9703 675 | vn 0.3326 0.1692 0.9278 676 | vn 0.0683 0.3464 0.9356 677 | vn 0.1682 0.3305 0.9287 678 | vn 0.3085 0.3087 0.8998 679 | vn 0.0582 -0.0521 0.9969 680 | vn 0.0906 -0.9785 0.1852 681 | vn 0.9797 -0.0844 0.1821 682 | vn 0.0662 -0.1678 0.9836 683 | vn 0.0659 -0.3447 0.9364 684 | vn 0.1763 -0.0600 0.9825 685 | vn 0.1765 -0.1658 0.9702 686 | vn 0.1735 -0.3313 0.9274 687 | vn 0.3527 -0.0581 0.9339 688 | vn 0.3420 -0.1624 0.9256 689 | vn 0.3192 -0.3076 0.8964 690 | vn 0.3056 -0.9306 0.2016 691 | vn 0.5685 -0.8037 0.1756 692 | vn 0.0992 -0.8379 0.5367 693 | vn 0.2809 -0.8078 0.5183 694 | vn 0.5122 -0.7322 0.4489 695 | vn 0.0848 -0.5974 0.7974 696 | vn 0.2183 -0.6075 0.7638 697 | vn 0.4011 -0.5825 0.7070 698 | vn 0.8435 -0.0907 0.5294 699 | vn 0.6068 -0.0754 0.7913 700 | vn 0.9326 -0.2999 0.2010 701 | vn 0.8167 -0.2718 0.5091 702 | vn 0.6232 -0.2106 0.7532 703 | vn 0.8081 -0.5614 0.1784 704 | vn 0.7417 -0.5030 0.4437 705 | vn 0.5951 -0.3914 0.7019 706 | vn 0.0622 -0.9802 0.1880 707 | vn 0.0070 -0.0062 1.0000 708 | vn 0.9788 -0.0564 0.1970 709 | vn 0.0848 -0.7813 0.6184 710 | vn 0.0848 -0.4627 0.8825 711 | vn 0.2762 -0.9152 0.2935 712 | vn 0.2503 -0.6232 0.7409 713 | vn 0.2139 -0.3704 0.9039 714 | vn 0.5294 -0.7532 0.3905 715 | vn 0.3822 -0.5103 0.7704 716 | vn 0.3101 -0.3616 0.8792 717 | vn 0.0870 -0.0278 0.9958 718 | vn 0.2157 -0.0545 0.9749 719 | vn 0.0317 -0.0824 0.9961 720 | vn 0.0998 -0.0891 0.9910 721 | vn 0.1877 -0.1395 0.9723 722 | vn 0.0609 -0.2100 0.9758 723 | vn 0.1539 -0.1729 0.9728 724 | vn 0.2323 -0.2158 0.9484 725 | vn 0.9167 -0.2582 0.3051 726 | vn 0.7562 -0.5172 0.4009 727 | vn 0.7791 -0.0692 0.6231 728 | vn 0.6291 -0.2255 0.7439 729 | vn 0.5186 -0.3682 0.7717 730 | vn 0.4759 -0.0727 0.8765 731 | vn 0.3858 -0.2014 0.9003 732 | vn 0.3774 -0.2983 0.8767 733 | vn 0.0596 0.9774 0.2027 734 | vn 0.9776 0.0612 0.2014 735 | vn 0.0077 0.0077 0.9999 736 | vn 0.2646 0.9132 0.3100 737 | vn 0.5236 0.7494 0.4052 738 | vn 0.0727 0.7802 0.6213 739 | vn 0.2355 0.6307 0.7394 740 | vn 0.3817 0.5155 0.7672 741 | vn 0.0774 0.4770 0.8755 742 | vn 0.2127 0.3856 0.8978 743 | vn 0.3121 0.3746 0.8731 744 | vn 0.7796 0.0796 0.6212 745 | vn 0.4666 0.0800 0.8809 746 | vn 0.9151 0.2696 0.2998 747 | vn 0.6344 0.2397 0.7349 748 | vn 0.3830 0.2060 0.9005 749 | vn 0.7570 0.5210 0.3943 750 | vn 0.5246 0.3746 0.7645 751 | vn 0.3761 0.3042 0.8752 752 | vn 0.0302 0.0858 0.9959 753 | vn 0.0586 0.2143 0.9750 754 | vn 0.0861 0.0303 0.9958 755 | vn 0.0961 0.0964 0.9907 756 | vn 0.1492 0.1852 0.9713 757 | vn 0.2144 0.0581 0.9750 758 | vn 0.1828 0.1488 0.9718 759 | vn 0.2281 0.2286 0.9464 760 | vn -0.0070 -0.0070 1.0000 761 | vn -0.0598 -0.9799 0.1906 762 | vn -0.9800 -0.0614 0.1892 763 | vn -0.0279 -0.0819 0.9962 764 | vn -0.0560 -0.2103 0.9760 765 | vn -0.0822 -0.0279 0.9962 766 | vn -0.0900 -0.0902 0.9918 767 | vn -0.1427 -0.1764 0.9739 768 | vn -0.2104 -0.0556 0.9760 769 | vn -0.1741 -0.1422 0.9744 770 | vn -0.2188 -0.2193 0.9508 771 | vn -0.2661 -0.9140 0.3063 772 | vn -0.5244 -0.7495 0.4041 773 | vn -0.0737 -0.7807 0.6205 774 | vn -0.2344 -0.6198 0.7489 775 | vn -0.3758 -0.5060 0.7763 776 | vn -0.0762 -0.4727 0.8779 777 | vn -0.2076 -0.3741 0.9038 778 | vn -0.3040 -0.3640 0.8804 779 | vn -0.7805 -0.0805 0.6199 780 | vn -0.4623 -0.0787 0.8832 781 | vn -0.9161 -0.2710 0.2954 782 | vn -0.6242 -0.2387 0.7439 783 | vn -0.3715 -0.2009 0.9064 784 | vn -0.7573 -0.5219 0.3927 785 | vn -0.5151 -0.3690 0.7737 786 | vn -0.3653 -0.2963 0.8825 787 | vn -0.9800 0.0607 0.1893 788 | vn -0.0580 0.9790 0.1957 789 | vn -0.0062 0.0070 1.0000 790 | vn -0.9132 0.2713 0.3041 791 | vn -0.7454 0.5320 0.4017 792 | vn -0.7817 0.0779 0.6187 793 | vn -0.6192 0.2460 0.7457 794 | vn -0.5011 0.3892 0.7729 795 | vn -0.4733 0.0822 0.8771 796 | vn -0.3729 0.2206 0.9012 797 | vn -0.3601 0.3179 0.8771 798 | vn -0.0760 0.7788 0.6226 799 | vn -0.0752 0.4657 0.8817 800 | vn -0.2632 0.9187 0.2944 801 | vn -0.2297 0.6333 0.7391 802 | vn -0.1948 0.3831 0.9029 803 | vn -0.5147 0.7637 0.3898 804 | vn -0.3613 0.5275 0.7689 805 | vn -0.2906 0.3787 0.8787 806 | vn -0.0821 0.0317 0.9961 807 | vn -0.2098 0.0613 0.9758 808 | vn -0.0278 0.0873 0.9958 809 | vn -0.0894 0.0995 0.9910 810 | vn -0.1753 0.1544 0.9723 811 | vn -0.0541 0.2158 0.9749 812 | vn -0.1392 0.1853 0.9728 813 | vn -0.2163 0.2319 0.9484 814 | vn -0.0904 -0.9791 0.1823 815 | vn -0.0551 -0.0551 0.9970 816 | vn -0.9792 -0.0901 0.1816 817 | vn -0.0985 -0.8424 0.5297 818 | vn -0.0835 -0.6044 0.7923 819 | vn -0.3054 -0.9310 0.1999 820 | vn -0.2800 -0.8156 0.5065 821 | vn -0.2196 -0.6219 0.7517 822 | vn -0.5652 -0.8060 0.1760 823 | vn -0.5092 -0.7403 0.4389 824 | vn -0.4000 -0.5946 0.6975 825 | vn -0.1710 -0.0648 0.9831 826 | vn -0.3503 -0.0650 0.9344 827 | vn -0.0656 -0.1719 0.9829 828 | vn -0.1726 -0.1737 0.9696 829 | vn -0.3420 -0.1717 0.9239 830 | vn -0.0653 -0.3489 0.9349 831 | vn -0.1707 -0.3398 0.9249 832 | vn -0.3179 -0.3181 0.8932 833 | vn -0.9321 -0.3044 0.1961 834 | vn -0.8057 -0.5667 0.1723 835 | vn -0.8420 -0.0984 0.5304 836 | vn -0.8153 -0.2791 0.5074 837 | vn -0.7379 -0.5107 0.4413 838 | vn -0.6039 -0.0840 0.7927 839 | vn -0.6190 -0.2166 0.7550 840 | vn -0.5920 -0.4001 0.6996 841 | vn -0.0520 0.0582 0.9970 842 | vn -0.0841 0.9798 0.1813 843 | vn -0.9783 0.0909 0.1859 844 | vn -0.0591 0.1755 0.9827 845 | vn -0.0578 0.3541 0.9334 846 | vn -0.1686 0.0669 0.9834 847 | vn -0.1668 0.1755 0.9702 848 | vn -0.1633 0.3443 0.9246 849 | vn -0.3433 0.0662 0.9369 850 | vn -0.3292 0.1726 0.9284 851 | vn -0.3078 0.3190 0.8964 852 | vn -0.2989 0.9337 0.1972 853 | vn -0.5629 0.8078 0.1746 854 | vn -0.0906 0.8431 0.5300 855 | vn -0.2710 0.8164 0.5099 856 | vn -0.5045 0.7393 0.4461 857 | vn -0.0759 0.6062 0.7917 858 | vn -0.2075 0.6202 0.7565 859 | vn -0.3915 0.5925 0.7040 860 | vn -0.8383 0.0993 0.5361 861 | vn -0.5981 0.0844 0.7970 862 | vn -0.9294 0.3067 0.2056 863 | vn -0.8081 0.2817 0.5174 864 | vn -0.6107 0.2214 0.7603 865 | vn -0.8039 0.5670 0.1795 866 | vn -0.7347 0.5106 0.4467 867 | vn -0.5852 0.4010 0.7047 868 | vt 0.837397 0.307888 869 | vt 0.837466 0.692083 870 | vt 0.680307 0.307917 871 | vt 0.531402 0.159012 872 | vt 0.147207 0.158943 873 | vt 0.147235 0.001853 874 | vt 0.532075 0.835727 875 | vt 0.146431 0.835727 876 | vt 0.157276 0.824884 877 | vt 0.531402 0.998147 878 | vt 0.147207 0.998078 879 | vt 0.147235 0.840988 880 | vt 0.146431 0.164273 881 | vt 0.532075 0.164273 882 | vt 0.157276 0.175116 883 | vt 0.675045 0.692888 884 | vt 0.664203 0.682046 885 | vt 0.675045 0.307244 886 | vt 0.019673 0.325791 887 | vt 0.159051 0.674233 888 | vt 0.019745 0.674261 889 | vt 0.165089 0.680271 890 | vt 0.513556 0.680342 891 | vt 0.513527 0.819649 892 | vt 0.521365 0.175115 893 | vt 0.157131 0.175116 894 | vt 0.532206 0.164273 895 | vt 0.664203 0.317954 896 | vt 0.675045 0.307112 897 | vt 0.664203 0.682191 898 | vt 0.513549 0.180342 899 | vt 0.513577 0.319659 900 | vt 0.165089 0.319729 901 | vt 0.531430 0.841057 902 | vt 0.889835 0.289773 903 | vt 0.603157 0.289773 904 | vt 0.889835 0.003095 905 | vt 0.003592 0.307244 906 | vt 0.014437 0.682046 907 | vt 0.003592 0.692888 908 | vt 0.601815 0.874960 909 | vt 0.718643 0.589380 910 | vt 0.718592 0.874981 911 | vt 0.680307 0.307917 912 | vt 0.837466 0.692083 913 | vt 0.680376 0.692112 914 | vt 0.014437 0.317954 915 | vt 0.014438 0.682191 916 | vt 0.003593 0.307112 917 | vt 0.514271 0.325048 918 | vt 0.164352 0.674970 919 | vt 0.164352 0.325048 920 | vt 0.019673 0.325791 921 | vt 0.158981 0.325763 922 | vt 0.159051 0.674233 923 | vt 0.889835 0.582641 924 | vt 0.603157 0.582641 925 | vt 0.889835 0.295963 926 | vt 0.532207 0.835727 927 | vt 0.157131 0.824885 928 | vt 0.521365 0.824885 929 | vt 0.165089 0.680271 930 | vt 0.513527 0.819649 931 | vt 0.165061 0.819577 932 | vt 0.519589 0.674233 933 | vt 0.658977 0.325770 934 | vt 0.658906 0.674262 935 | vt 0.514271 0.325048 936 | vt 0.514271 0.674970 937 | vt 0.488177 0.628809 938 | vt 0.380087 0.364453 939 | vt 0.488177 0.320257 940 | vt 0.513549 0.180342 941 | vt 0.165089 0.319729 942 | vt 0.165061 0.180413 943 | vt 0.519589 0.674233 944 | vt 0.519660 0.325741 945 | vt 0.658977 0.325770 946 | vt 0.532726 0.159012 947 | vt 0.532778 0.159535 948 | vt 0.531477 0.159545 949 | vt 0.533924 0.159012 950 | vt 0.533897 0.159528 951 | vt 0.535707 0.159012 952 | vt 0.535707 0.159528 953 | vt 0.532839 0.160003 954 | vt 0.531600 0.160039 955 | vt 0.533819 0.159948 956 | vt 0.535707 0.159948 957 | vt 0.679774 0.307842 958 | vt 0.679781 0.306550 959 | vt 0.680307 0.306592 960 | vt 0.679280 0.307719 961 | vt 0.679314 0.306481 962 | vt 0.534165 0.164641 963 | vt 0.534029 0.163475 964 | vt 0.679790 0.303612 965 | vt 0.680307 0.303612 966 | vt 0.679370 0.303612 967 | vt 0.533848 0.162560 968 | vt 0.531904 0.163190 969 | vt 0.533041 0.163334 970 | vt 0.533174 0.164460 971 | vt 0.531736 0.162212 972 | vt 0.532920 0.162364 973 | vt 0.533881 0.160194 974 | vt 0.002509 0.307415 975 | vt 0.002646 0.306277 976 | vt 0.003770 0.306145 977 | vt 0.000092 0.307555 978 | vt 0.000092 0.306369 979 | vt 0.600506 0.875228 980 | vt 0.601052 0.875107 981 | vt 0.601083 0.876028 982 | vt 0.600506 0.876110 983 | vt 0.002782 0.305290 984 | vt 0.003942 0.305154 985 | vt 0.000092 0.305437 986 | vt 0.601129 0.876756 987 | vt 0.600506 0.876803 988 | vt 0.601824 0.875944 989 | vt 0.601433 0.875983 990 | vt 0.601419 0.875015 991 | vt 0.601835 0.876835 992 | vt 0.601446 0.876814 993 | vt 0.601846 0.878160 994 | vt 0.601453 0.878160 995 | vt 0.601133 0.878160 996 | vt 0.147133 0.159498 997 | vt 0.145850 0.159500 998 | vt 0.145891 0.158955 999 | vt 0.147013 0.160010 1000 | vt 0.145784 0.159981 1001 | vt 0.142930 0.159499 1002 | vt 0.142930 0.158970 1003 | vt 0.142930 0.159930 1004 | vt 0.719004 0.875036 1005 | vt 0.719005 0.875989 1006 | vt 0.718601 0.875959 1007 | vt 0.719385 0.875125 1008 | vt 0.719363 0.876038 1009 | vt 0.719952 0.875241 1010 | vt 0.719952 0.876119 1011 | vt 0.719005 0.876819 1012 | vt 0.718612 0.876843 1013 | vt 0.719325 0.876763 1014 | vt 0.719952 0.876808 1015 | vt 0.890654 0.582499 1016 | vt 0.890550 0.583346 1017 | vt 0.889700 0.583460 1018 | vt 0.891394 0.582360 1019 | vt 0.891281 0.583242 1020 | vt 0.892486 0.582239 1021 | vt 0.892486 0.583160 1022 | vt 0.890446 0.585292 1023 | vt 0.889568 0.585292 1024 | vt 0.891135 0.585292 1025 | vt 0.892486 0.585292 1026 | vt 0.145911 0.001865 1027 | vt 0.145858 0.001339 1028 | vt 0.147160 0.001320 1029 | vt 0.142930 0.001880 1030 | vt 0.142930 0.001356 1031 | vt 0.718623 0.878160 1032 | vt 0.719012 0.878160 1033 | vt 0.145798 0.000092 1034 | vt 0.147037 0.000092 1035 | vt 0.142930 0.000930 1036 | vt 0.719329 0.878160 1037 | vt 0.837397 0.306573 1038 | vt 0.837941 0.306522 1039 | vt 0.837951 0.307814 1040 | vt 0.837397 0.303612 1041 | vt 0.837934 0.303612 1042 | vt 0.535707 0.001922 1043 | vt 0.533936 0.001922 1044 | vt 0.533903 0.001385 1045 | vt 0.535707 0.001385 1046 | vt 0.839227 0.306464 1047 | vt 0.839227 0.307694 1048 | vt 0.839227 0.305490 1049 | vt 0.533828 0.000092 1050 | vt 0.535707 0.000092 1051 | vt 0.531430 0.001922 1052 | vt 0.531504 0.001367 1053 | vt 0.532787 0.001375 1054 | vt 0.532746 0.001922 1055 | vt 0.531624 0.000092 1056 | vt 0.532853 0.000092 1057 | vt 0.600506 0.289389 1058 | vt 0.601598 0.289506 1059 | vt 0.601713 0.290384 1060 | vt 0.600506 0.290303 1061 | vt 0.601857 0.291073 1062 | vt 0.600506 0.291028 1063 | vt 0.603292 0.290593 1064 | vt 0.602447 0.290488 1065 | vt 0.602337 0.289638 1066 | vt 0.603424 0.291332 1067 | vt 0.602546 0.291219 1068 | vt 0.603541 0.292424 1069 | vt 0.602626 0.292424 1070 | vt 0.601902 0.292424 1071 | vt 0.890654 0.289631 1072 | vt 0.890545 0.290478 1073 | vt 0.889693 0.290593 1074 | vt 0.891394 0.289492 1075 | vt 0.891279 0.290375 1076 | vt 0.892486 0.289371 1077 | vt 0.892486 0.290292 1078 | vt 0.890437 0.291214 1079 | vt 0.889554 0.291332 1080 | vt 0.891129 0.291067 1081 | vt 0.892486 0.291020 1082 | vt 0.532726 0.998147 1083 | vt 0.532779 0.998670 1084 | vt 0.531477 0.998680 1085 | vt 0.533924 0.998147 1086 | vt 0.533897 0.998664 1087 | vt 0.535707 0.998147 1088 | vt 0.535707 0.998664 1089 | vt 0.532839 0.999908 1090 | vt 0.531600 0.999908 1091 | vt 0.533819 0.999908 1092 | vt 0.535707 0.999908 1093 | vt 0.837999 0.692158 1094 | vt 0.837992 0.693450 1095 | vt 0.837466 0.693408 1096 | vt 0.839227 0.692281 1097 | vt 0.839227 0.693519 1098 | vt 0.889433 0.292424 1099 | vt 0.890353 0.292424 1100 | vt 0.837982 0.696388 1101 | vt 0.837466 0.696388 1102 | vt 0.839227 0.694500 1103 | vt 0.891082 0.292424 1104 | vt 0.603299 0.583461 1105 | vt 0.602452 0.583356 1106 | vt 0.602337 0.582506 1107 | vt 0.603437 0.584200 1108 | vt 0.602555 0.584087 1109 | vt 0.603559 0.585292 1110 | vt 0.602638 0.585292 1111 | vt 0.601716 0.583252 1112 | vt 0.601598 0.582374 1113 | vt 0.601863 0.583941 1114 | vt 0.601909 0.584336 1115 | vt 0.487796 0.319349 1116 | vt 0.488143 0.319165 1117 | vt 0.488523 0.320056 1118 | vt 0.487448 0.318529 1119 | vt 0.487817 0.318401 1120 | vt 0.486936 0.317307 1121 | vt 0.487301 0.317158 1122 | vt 0.488984 0.318772 1123 | vt 0.489333 0.319625 1124 | vt 0.488132 0.318334 1125 | vt 0.487960 0.317926 1126 | vt 0.147133 0.998633 1127 | vt 0.145850 0.998635 1128 | vt 0.145891 0.998091 1129 | vt 0.147013 0.999908 1130 | vt 0.145784 0.999908 1131 | vt 0.600506 0.582257 1132 | vt 0.600506 0.583171 1133 | vt 0.142930 0.998635 1134 | vt 0.142930 0.998105 1135 | vt 0.144809 0.999065 1136 | vt 0.601466 0.583895 1137 | vt 0.719514 0.587537 1138 | vt 0.719329 0.587583 1139 | vt 0.719325 0.587140 1140 | vt 0.379683 0.364558 1141 | vt 0.379321 0.363677 1142 | vt 0.379708 0.363551 1143 | vt 0.379294 0.364621 1144 | vt 0.378969 0.363767 1145 | vt 0.378729 0.364726 1146 | vt 0.378396 0.363914 1147 | vt 0.379007 0.362909 1148 | vt 0.379363 0.362737 1149 | vt 0.378730 0.363082 1150 | vt 0.378135 0.363276 1151 | vt 0.146642 0.836810 1152 | vt 0.145500 0.836673 1153 | vt 0.145325 0.835550 1154 | vt 0.146847 0.837788 1155 | vt 0.145657 0.837640 1156 | vt 0.147037 0.839957 1157 | vt 0.145798 0.840000 1158 | vt 0.142880 0.836534 1159 | vt 0.142858 0.835375 1160 | vt 0.142897 0.837443 1161 | vt 0.142930 0.840062 1162 | vt 0.145911 0.841001 1163 | vt 0.145859 0.840473 1164 | vt 0.147160 0.840454 1165 | vt 0.142930 0.841015 1166 | vt 0.142930 0.840490 1167 | vt 0.378854 0.361522 1168 | vt 0.378492 0.361670 1169 | vt 0.378198 0.361791 1170 | vt 0.680376 0.693427 1171 | vt 0.679832 0.693478 1172 | vt 0.679821 0.692186 1173 | vt 0.680376 0.696388 1174 | vt 0.679839 0.696388 1175 | vt 0.535707 0.841057 1176 | vt 0.533936 0.841057 1177 | vt 0.533903 0.840520 1178 | vt 0.535707 0.840520 1179 | vt 0.679346 0.693536 1180 | vt 0.679309 0.692306 1181 | vt 0.679402 0.696388 1182 | vt 0.533828 0.840084 1183 | vt 0.535707 0.840084 1184 | vt 0.531505 0.840503 1185 | vt 0.532787 0.840510 1186 | vt 0.532746 0.841057 1187 | vt 0.531624 0.839990 1188 | vt 0.532854 0.840026 1189 | vt 0.674695 0.694992 1190 | vt 0.675855 0.694815 1191 | vt 0.676765 0.694604 1192 | vt 0.676128 0.692686 1193 | vt 0.675991 0.693825 1194 | vt 0.674868 0.693994 1195 | vt 0.677106 0.692490 1196 | vt 0.676958 0.693673 1197 | vt 0.533889 0.839828 1198 | vt 0.163763 0.680253 1199 | vt 0.163705 0.679739 1200 | vt 0.165007 0.679740 1201 | vt 0.160777 0.680212 1202 | vt 0.160777 0.679710 1203 | vt 0.159132 0.678569 1204 | vt 0.159088 0.676778 1205 | vt 0.159580 0.676743 1206 | vt 0.159627 0.678562 1207 | vt 0.163640 0.679276 1208 | vt 0.164877 0.679244 1209 | vt 0.162661 0.679323 1210 | vt 0.159983 0.676668 1211 | vt 0.159986 0.677271 1212 | vt 0.159573 0.674309 1213 | vt 0.159579 0.675610 1214 | vt 0.159073 0.675568 1215 | vt 0.160057 0.674436 1216 | vt 0.160031 0.675680 1217 | vt 0.162235 0.674608 1218 | vt 0.162396 0.675793 1219 | vt 0.162596 0.676723 1220 | vt 0.164541 0.676076 1221 | vt 0.163394 0.675934 1222 | vt 0.163239 0.674787 1223 | vt 0.164726 0.677073 1224 | vt 0.163533 0.676922 1225 | vt 0.160007 0.677258 1226 | vt 0.159999 0.676661 1227 | vt 0.160246 0.676727 1228 | vt 0.515381 0.674776 1229 | vt 0.515237 0.675921 1230 | vt 0.514084 0.676076 1231 | vt 0.516383 0.674589 1232 | vt 0.516229 0.675780 1233 | vt 0.518587 0.674424 1234 | vt 0.518630 0.675666 1235 | vt 0.515094 0.676914 1236 | vt 0.513902 0.677073 1237 | vt 0.516029 0.676715 1238 | vt 0.518692 0.676647 1239 | vt 0.519605 0.675559 1240 | vt 0.519091 0.675608 1241 | vt 0.519068 0.674305 1242 | vt 0.519622 0.678546 1243 | vt 0.519109 0.678546 1244 | vt 0.517864 0.680304 1245 | vt 0.516076 0.680316 1246 | vt 0.516041 0.679796 1247 | vt 0.517864 0.679790 1248 | vt 0.515963 0.679373 1249 | vt 0.516558 0.679367 1250 | vt 0.513626 0.679797 1251 | vt 0.514918 0.679796 1252 | vt 0.514880 0.680331 1253 | vt 0.513742 0.679294 1254 | vt 0.514981 0.679322 1255 | vt 0.516564 0.676653 1256 | vt 0.515966 0.677251 1257 | vt 0.659446 0.675060 1258 | vt 0.659450 0.676273 1259 | vt 0.658920 0.675578 1260 | vt 0.659955 0.676390 1261 | vt 0.659928 0.677181 1262 | vt 0.519347 0.820978 1263 | vt 0.518524 0.821168 1264 | vt 0.659450 0.678546 1265 | vt 0.658935 0.678546 1266 | vt 0.659877 0.678546 1267 | vt 0.517735 0.821273 1268 | vt 0.519338 0.823805 1269 | vt 0.518918 0.822455 1270 | vt 0.520304 0.822909 1271 | vt 0.517365 0.822826 1272 | vt 0.517595 0.822031 1273 | vt 0.515641 0.820660 1274 | vt 0.516474 0.820621 1275 | vt 0.517097 0.820562 1276 | vt 0.514861 0.819640 1277 | vt 0.515581 0.820152 1278 | vt 0.514310 0.820168 1279 | vt 0.516064 0.819627 1280 | vt 0.516568 0.820138 1281 | vt 0.517864 0.819617 1282 | vt 0.517864 0.820132 1283 | vt 0.517864 0.820559 1284 | vt 0.517732 0.820808 1285 | vt 0.019763 0.675579 1286 | vt 0.019221 0.676304 1287 | vt 0.019199 0.675057 1288 | vt 0.019779 0.676772 1289 | vt 0.019240 0.677275 1290 | vt 0.019804 0.678546 1291 | vt 0.019257 0.678546 1292 | vt 0.018727 0.677195 1293 | vt 0.018681 0.676385 1294 | vt 0.018793 0.677802 1295 | vt 0.018803 0.678546 1296 | vt 0.164265 0.820123 1297 | vt 0.163050 0.820104 1298 | vt 0.163743 0.819559 1299 | vt 0.162938 0.820641 1300 | vt 0.162143 0.820597 1301 | vt 0.018354 0.680007 1302 | vt 0.018161 0.679199 1303 | vt 0.160777 0.820065 1304 | vt 0.160777 0.819519 1305 | vt 0.160777 0.820519 1306 | vt 0.018055 0.678420 1307 | vt 0.015517 0.680148 1308 | vt 0.016870 0.679658 1309 | vt 0.016417 0.681048 1310 | vt 0.016496 0.678149 1311 | vt 0.017294 0.678326 1312 | vt 0.018535 0.678430 1313 | vt 0.663124 0.319986 1314 | vt 0.661754 0.320403 1315 | vt 0.662192 0.319014 1316 | vt 0.662149 0.321962 1317 | vt 0.661343 0.321728 1318 | vt 0.659979 0.323678 1319 | vt 0.659944 0.322844 1320 | vt 0.660453 0.320795 1321 | vt 0.660238 0.319971 1322 | vt 0.660576 0.321585 1323 | vt 0.659891 0.322219 1324 | vt 0.658976 0.324442 1325 | vt 0.659482 0.323729 1326 | vt 0.659493 0.324998 1327 | vt 0.658973 0.321454 1328 | vt 0.659474 0.321454 1329 | vt 0.517861 0.180345 1330 | vt 0.516075 0.180344 1331 | vt 0.516570 0.179843 1332 | vt 0.517862 0.179844 1333 | vt 0.517099 0.179428 1334 | vt 0.517616 0.179428 1335 | vt 0.514321 0.179825 1336 | vt 0.515557 0.179833 1337 | vt 0.514876 0.180343 1338 | vt 0.515641 0.179339 1339 | vt 0.516459 0.179373 1340 | vt 0.517731 0.179188 1341 | vt 0.517617 0.179428 1342 | vt 0.517100 0.179428 1343 | vt 0.163744 0.180399 1344 | vt 0.163018 0.179872 1345 | vt 0.164262 0.179873 1346 | vt 0.160776 0.180384 1347 | vt 0.160776 0.179868 1348 | vt 0.019728 0.321480 1349 | vt 0.019719 0.323265 1350 | vt 0.019201 0.322763 1351 | vt 0.019206 0.321473 1352 | vt 0.162126 0.179393 1353 | vt 0.162932 0.179364 1354 | vt 0.161522 0.179441 1355 | vt 0.018770 0.322228 1356 | vt 0.018783 0.321712 1357 | vt 0.019150 0.325007 1358 | vt 0.019172 0.323774 1359 | vt 0.019692 0.324465 1360 | vt 0.018651 0.323678 1361 | vt 0.018699 0.322864 1362 | vt 0.159316 0.179073 1363 | vt 0.160121 0.178861 1364 | vt 0.160897 0.178740 1365 | vt 0.159170 0.176194 1366 | vt 0.159661 0.177561 1367 | vt 0.158275 0.177122 1368 | vt 0.161164 0.177169 1369 | vt 0.160989 0.177974 1370 | vt 0.018663 0.321686 1371 | vt 0.018169 0.322212 1372 | vt 0.018049 0.321583 1373 | vt 0.519117 0.325668 1374 | vt 0.519124 0.324382 1375 | vt 0.519659 0.324422 1376 | vt 0.518616 0.325549 1377 | vt 0.518650 0.324316 1378 | vt 0.516371 0.325413 1379 | vt 0.516222 0.324223 1380 | vt 0.519131 0.321454 1381 | vt 0.519657 0.321454 1382 | vt 0.518706 0.323338 1383 | vt 0.516032 0.323289 1384 | vt 0.514093 0.323937 1385 | vt 0.515233 0.324080 1386 | vt 0.515375 0.325232 1387 | vt 0.513920 0.322936 1388 | vt 0.515104 0.323089 1389 | vt 0.513770 0.320703 1390 | vt 0.515004 0.320667 1391 | vt 0.515980 0.320612 1392 | vt 0.514896 0.319660 1393 | vt 0.514946 0.320192 1394 | vt 0.513650 0.320202 1395 | vt 0.516089 0.319660 1396 | vt 0.516060 0.320186 1397 | vt 0.517864 0.319662 1398 | vt 0.517864 0.320187 1399 | vt 0.516574 0.320613 1400 | vt 0.516565 0.323351 1401 | vt 0.515975 0.322754 1402 | vt 0.163246 0.325235 1403 | vt 0.163395 0.324088 1404 | vt 0.164546 0.323937 1405 | vt 0.162249 0.325417 1406 | vt 0.162405 0.324225 1407 | vt 0.160028 0.325577 1408 | vt 0.159998 0.324336 1409 | vt 0.163542 0.323093 1410 | vt 0.164733 0.322936 1411 | vt 0.162607 0.323290 1412 | vt 0.159950 0.323355 1413 | vt 0.158992 0.324439 1414 | vt 0.159523 0.324391 1415 | vt 0.159525 0.325693 1416 | vt 0.159006 0.323243 1417 | vt 0.159526 0.323274 1418 | vt 0.159019 0.321454 1419 | vt 0.159532 0.321454 1420 | vt 0.159950 0.321454 1421 | vt 0.165018 0.320250 1422 | vt 0.163724 0.320231 1423 | vt 0.163762 0.319714 1424 | vt 0.164899 0.320732 1425 | vt 0.163658 0.320690 1426 | vt 0.160775 0.320210 1427 | vt 0.160774 0.319697 1428 | vt 0.160775 0.320628 1429 | vt 0.160199 0.323297 1430 | vt 0.146633 0.163191 1431 | vt 0.146829 0.162213 1432 | vt 0.531477 0.159545 1433 | vt 0.680307 0.306592 1434 | vt 0.890654 0.296098 1435 | vt 0.891394 0.296230 1436 | vt 0.892486 0.296347 1437 | vt 0.147037 0.000092 1438 | vt 0.147235 0.001853 1439 | vt 0.890654 0.003230 1440 | vt 0.891394 0.003362 1441 | vt 0.892486 0.003479 1442 | vt 0.531600 0.999908 1443 | vt 0.531477 0.998680 1444 | vt 0.837466 0.693408 1445 | vt 0.531913 0.836810 1446 | vt 0.531754 0.837788 1447 | vt 0.147037 0.839957 1448 | vt 0.677106 0.307582 1449 | vt 0.676128 0.307415 1450 | vt 0.164887 0.679265 1451 | vt 0.165013 0.679749 1452 | vt 0.159111 0.678546 1453 | vt 0.159086 0.676760 1454 | vt 0.159070 0.675560 1455 | vt 0.159175 0.823805 1456 | vt 0.161173 0.822827 1457 | vt 0.515640 0.820671 1458 | vt 0.514312 0.820173 1459 | vt 0.517357 0.177170 1460 | vt 0.519333 0.176194 1461 | vt 0.517864 0.180345 1462 | vt 0.516077 0.180344 1463 | vt 0.514876 0.180343 1464 | vt 0.163763 0.319714 1465 | vt 0.160777 0.319697 1466 | vt 0.019706 0.321455 1467 | vt 0.019695 0.323255 1468 | vt 0.019682 0.324458 1469 | vt 0.719039 0.589324 1470 | vt 0.719406 0.589233 1471 | vt 0.719952 0.589111 1472 | vt 0.603437 0.585292 1473 | vt 0.015517 0.319980 1474 | vt 0.016496 0.321953 1475 | vt 0.659493 0.324997 1476 | vt 0.659979 0.323678 1477 | vt 0.662149 0.678158 1478 | vt 0.663125 0.680152 1479 | vt 0.002509 0.692687 1480 | vt 0.000092 0.692464 1481 | vt 0.487067 0.629554 1482 | vt 0.487526 0.629234 1483 | vt 0.487831 0.629011 1484 | vt 0.515381 0.325225 1485 | vt 0.516382 0.325399 1486 | vt 0.518587 0.674423 1487 | vt 0.519068 0.674304 1488 | vt 0.162249 0.674597 1489 | vt 0.163246 0.674781 1490 | s 1 1491 | f 82/1/82 111/2/111 2/3/2 1492 | f 1/4/1 30/5/30 57/6/57 1493 | f 192/7/192 164/8/164 300/9/300 1494 | f 110/10/110 138/11/138 165/12/165 1495 | f 28/13/28 3/14/3 354/15/354 1496 | f 192/16/192 272/17/272 3/18/3 1497 | f 353/19/353 218/20/218 298/21/298 1498 | f 217/22/217 246/23/246 273/24/273 1499 | f 325/25/325 354/26/354 3/27/3 1500 | f 325/28/325 3/29/3 272/30/272 1501 | f 327/31/327 381/32/381 408/33/408 1502 | f 110/10/110 165/12/165 191/34/191 1503 | f 109/35/109 84/36/84 136/37/136 1504 | f 28/38/28 300/39/300 164/40/164 1505 | f 29/41/29 137/42/137 55/43/55 1506 | f 2/44/2 111/45/111 190/46/190 1507 | f 354/47/354 300/48/300 28/49/28 1508 | f 380/50/380 219/51/219 406/52/406 1509 | f 353/53/353 407/54/407 218/55/218 1510 | f 56/56/56 136/57/136 84/58/84 1511 | f 192/59/192 300/60/300 272/61/272 1512 | f 217/62/217 273/63/273 299/64/299 1513 | f 245/65/245 326/66/326 271/67/271 1514 | f 380/68/380 244/69/244 219/51/219 1515 | f 29/70/29 163/71/163 137/72/137 1516 | f 327/73/327 408/74/408 352/75/352 1517 | f 245/76/245 379/77/379 326/78/326 1518 | f 1/4/1 4/79/4 7/80/7 6/81/6 1519 | f 4/79/4 5/82/5 8/83/8 7/80/7 1520 | f 5/82/5 17/84/17 18/85/18 8/83/8 1521 | f 6/81/6 7/80/7 10/86/10 9/87/9 1522 | f 7/80/7 8/83/8 11/88/11 10/86/10 1523 | f 8/83/8 18/85/18 19/89/19 11/88/11 1524 | f 2/44/2 12/90/12 15/91/15 14/92/14 1525 | f 12/90/12 13/93/13 16/94/16 15/91/15 1526 | f 13/93/13 25/95/25 26/96/26 16/94/16 1527 | f 14/92/14 15/91/15 18/97/18 17/98/17 1528 | f 15/91/15 16/94/16 19/99/19 18/97/18 1529 | f 16/94/16 26/96/26 27/100/27 19/99/19 1530 | f 3/14/3 20/101/20 23/102/23 22/103/22 1531 | f 20/101/20 21/104/21 24/105/24 23/102/23 1532 | f 21/104/21 9/87/9 10/86/10 24/105/24 1533 | f 22/103/22 23/102/23 26/96/26 25/95/25 1534 | f 23/102/23 24/105/24 27/100/27 26/96/26 1535 | f 24/105/24 10/86/10 11/88/11 27/100/27 1536 | f 11/88/11 19/89/19 27/106/27 1537 | f 28/38/28 31/107/31 34/108/34 33/109/33 1538 | f 31/107/31 32/110/32 35/111/35 34/108/34 1539 | f 32/112/32 44/113/44 45/114/45 35/115/35 1540 | f 33/109/33 34/108/34 37/116/37 36/117/36 1541 | f 34/108/34 35/111/35 38/118/38 37/116/37 1542 | f 35/115/35 45/114/45 46/119/46 38/120/38 1543 | f 29/41/29 39/121/39 42/122/42 41/123/41 1544 | f 39/121/39 40/124/40 43/125/43 42/122/42 1545 | f 40/124/40 52/126/52 53/127/53 43/125/43 1546 | f 41/123/41 42/122/42 45/114/45 44/113/44 1547 | f 42/122/42 43/125/43 46/119/46 45/114/45 1548 | f 43/125/43 53/127/53 54/128/54 46/119/46 1549 | f 30/5/30 47/129/47 50/130/50 49/131/49 1550 | f 47/129/47 48/132/48 51/133/51 50/130/50 1551 | f 48/132/48 36/117/36 37/116/37 51/133/51 1552 | f 49/131/49 50/130/50 53/134/53 52/135/52 1553 | f 50/130/50 51/133/51 54/136/54 53/134/53 1554 | f 51/133/51 37/116/37 38/118/38 54/136/54 1555 | f 38/120/38 46/119/46 54/128/54 1556 | f 55/43/55 58/137/58 61/138/61 60/139/60 1557 | f 58/137/58 59/140/59 62/141/62 61/138/61 1558 | f 59/140/59 71/142/71 72/143/72 62/141/62 1559 | f 60/139/60 61/138/61 64/144/64 63/145/63 1560 | f 61/138/61 62/141/62 65/146/65 64/144/64 1561 | f 62/141/62 72/143/72 73/147/73 65/146/65 1562 | f 56/56/56 66/148/66 69/149/69 68/150/68 1563 | f 66/148/66 67/151/67 70/152/70 69/149/69 1564 | f 67/151/67 79/153/79 80/154/80 70/152/70 1565 | f 68/150/68 69/149/69 72/155/72 71/156/71 1566 | f 69/149/69 70/152/70 73/157/73 72/155/72 1567 | f 70/152/70 80/154/80 81/158/81 73/157/73 1568 | f 57/6/57 74/159/74 77/160/77 76/161/76 1569 | f 74/159/74 75/162/75 78/163/78 77/160/77 1570 | f 75/164/75 63/145/63 64/144/64 78/165/78 1571 | f 76/161/76 77/160/77 80/166/80 79/167/79 1572 | f 77/160/77 78/163/78 81/168/81 80/166/80 1573 | f 78/165/78 64/144/64 65/146/65 81/169/81 1574 | f 65/146/65 73/147/73 81/169/81 1575 | f 82/1/82 85/170/85 88/171/88 87/172/87 1576 | f 85/170/85 86/173/86 89/174/89 88/171/88 1577 | f 86/175/86 98/176/98 99/177/99 89/178/89 1578 | f 87/172/87 88/171/88 91/179/91 90/180/90 1579 | f 88/171/88 89/174/89 92/181/92 91/179/91 1580 | f 89/178/89 99/177/99 100/182/100 92/183/92 1581 | f 83/184/83 93/185/93 96/186/96 95/187/95 1582 | f 93/185/93 94/188/94 97/189/97 96/186/96 1583 | f 94/190/94 106/191/106 107/192/107 97/193/97 1584 | f 95/187/95 96/186/96 99/177/99 98/176/98 1585 | f 96/186/96 97/189/97 100/182/100 99/177/99 1586 | f 97/193/97 107/192/107 108/194/108 100/195/100 1587 | f 84/36/84 101/196/101 104/197/104 103/198/103 1588 | f 101/196/101 102/199/102 105/200/105 104/197/104 1589 | f 102/199/102 90/201/90 91/202/91 105/200/105 1590 | f 103/198/103 104/197/104 107/192/107 106/191/106 1591 | f 104/197/104 105/200/105 108/194/108 107/192/107 1592 | f 105/200/105 91/202/91 92/203/92 108/194/108 1593 | f 92/203/92 100/195/100 108/194/108 1594 | f 109/35/109 112/204/112 115/205/115 114/206/114 1595 | f 112/204/112 113/207/113 116/208/116 115/205/115 1596 | f 113/207/113 125/209/125 126/210/126 116/208/116 1597 | f 114/206/114 115/205/115 118/211/118 117/212/117 1598 | f 115/205/115 116/208/116 119/213/119 118/211/118 1599 | f 116/208/116 126/210/126 127/214/127 119/213/119 1600 | f 110/10/110 120/215/120 123/216/123 122/217/122 1601 | f 120/215/120 121/218/121 124/219/124 123/216/123 1602 | f 121/218/121 133/220/133 134/221/134 124/219/124 1603 | f 122/217/122 123/216/123 126/222/126 125/223/125 1604 | f 123/216/123 124/219/124 127/224/127 126/222/126 1605 | f 124/219/124 134/221/134 135/225/135 127/224/127 1606 | f 111/2/111 128/226/128 131/227/131 130/228/130 1607 | f 128/226/128 129/229/129 132/230/132 131/227/131 1608 | f 129/231/129 117/212/117 118/211/118 132/232/132 1609 | f 130/228/130 131/227/131 134/233/134 133/234/133 1610 | f 131/227/131 132/230/132 135/235/135 134/233/134 1611 | f 132/232/132 118/211/118 119/213/119 135/236/135 1612 | f 119/213/119 127/214/127 135/236/135 1613 | f 136/57/136 139/237/139 142/238/142 141/239/141 1614 | f 139/237/139 140/240/140 143/241/143 142/238/142 1615 | f 140/240/140 152/242/152 153/243/153 143/241/143 1616 | f 141/239/141 142/238/142 145/244/145 144/245/144 1617 | f 142/238/142 143/241/143 146/246/146 145/244/145 1618 | f 143/241/143 153/243/153 154/247/154 146/246/146 1619 | f 137/72/137 147/248/147 150/249/150 149/250/149 1620 | f 147/248/147 148/251/148 151/252/151 150/249/150 1621 | f 148/251/148 160/253/160 161/254/161 151/252/151 1622 | f 149/250/149 150/249/150 153/255/153 152/256/152 1623 | f 150/249/150 151/252/151 154/257/154 153/255/153 1624 | f 151/252/151 161/254/161 162/258/162 154/257/154 1625 | f 138/11/138 155/259/155 158/260/158 157/261/157 1626 | f 155/259/155 156/262/156 159/263/159 158/260/158 1627 | f 156/264/156 144/245/144 145/244/145 159/265/159 1628 | f 157/261/157 158/260/158 161/266/161 160/267/160 1629 | f 158/260/158 159/263/159 162/268/162 161/266/161 1630 | f 159/265/159 145/244/145 146/246/146 162/269/162 1631 | f 146/270/146 154/271/154 162/272/162 1632 | f 163/71/163 166/273/166 169/274/169 168/275/168 1633 | f 166/273/166 167/276/167 170/277/170 169/274/169 1634 | f 167/276/167 179/278/179 180/279/180 170/277/170 1635 | f 168/275/168 169/274/169 172/280/172 171/281/171 1636 | f 169/274/169 170/277/170 173/282/173 172/280/172 1637 | f 170/277/170 180/279/180 181/283/181 173/282/173 1638 | f 164/8/164 174/284/174 177/285/177 176/286/176 1639 | f 174/284/174 175/287/175 178/288/178 177/285/177 1640 | f 175/287/175 187/289/187 188/290/188 178/288/178 1641 | f 176/286/176 177/285/177 180/291/180 179/292/179 1642 | f 177/285/177 178/288/178 181/293/181 180/291/180 1643 | f 178/288/178 188/290/188 189/294/189 181/293/181 1644 | f 165/12/165 182/295/182 185/296/185 184/297/184 1645 | f 182/295/182 183/298/183 186/299/186 185/296/185 1646 | f 183/300/183 171/281/171 172/280/172 186/301/186 1647 | f 184/297/184 185/296/185 188/290/188 187/289/187 1648 | f 185/296/185 186/299/186 189/294/189 188/290/188 1649 | f 186/301/186 172/280/172 173/282/173 189/302/189 1650 | f 173/282/173 181/283/181 189/302/189 1651 | f 190/46/190 193/303/193 196/304/196 195/305/195 1652 | f 193/303/193 194/306/194 197/307/197 196/304/196 1653 | f 194/308/194 206/309/206 207/310/207 197/311/197 1654 | f 195/305/195 196/304/196 199/312/199 198/313/198 1655 | f 196/304/196 197/307/197 200/314/200 199/312/199 1656 | f 197/311/197 207/310/207 208/315/208 200/316/200 1657 | f 191/34/191 201/317/201 204/318/204 203/319/203 1658 | f 201/317/201 202/320/202 205/321/205 204/318/204 1659 | f 202/320/202 214/322/214 215/323/215 205/321/205 1660 | f 203/319/203 204/318/204 207/310/207 206/309/206 1661 | f 204/318/204 205/321/205 208/315/208 207/310/207 1662 | f 205/321/205 215/323/215 216/324/216 208/315/208 1663 | f 192/16/192 209/325/209 212/326/212 211/327/211 1664 | f 209/325/209 210/328/210 213/329/213 212/326/212 1665 | f 210/328/210 198/313/198 199/312/199 213/329/213 1666 | f 211/327/211 212/326/212 215/323/215 214/322/214 1667 | f 212/326/212 213/329/213 216/324/216 215/323/215 1668 | f 213/329/213 199/312/199 200/314/200 216/324/216 1669 | f 200/316/200 208/315/208 216/330/216 1670 | f 217/62/217 220/331/220 223/332/223 222/333/222 1671 | f 220/331/220 221/334/221 224/335/224 223/332/223 1672 | f 221/336/221 233/337/233 234/338/234 224/339/224 1673 | f 222/333/222 223/332/223 226/340/226 225/341/225 1674 | f 223/332/223 224/335/224 227/342/227 226/340/226 1675 | f 224/339/224 234/338/234 235/343/235 227/344/227 1676 | f 218/55/218 228/345/228 231/346/231 230/347/230 1677 | f 228/345/228 229/348/229 232/349/232 231/346/231 1678 | f 229/348/229 241/350/241 242/351/242 232/349/232 1679 | f 230/347/230 231/346/231 234/338/234 233/337/233 1680 | f 231/346/231 232/349/232 235/343/235 234/338/234 1681 | f 232/349/232 242/351/242 243/352/243 235/343/235 1682 | f 219/51/219 236/353/236 239/354/239 238/355/238 1683 | f 236/353/236 237/356/237 240/357/240 239/354/239 1684 | f 237/356/237 225/341/225 226/340/226 240/357/240 1685 | f 238/355/238 239/354/239 242/351/242 241/350/241 1686 | f 239/354/239 240/357/240 243/352/243 242/351/242 1687 | f 240/357/240 226/340/226 227/342/227 243/352/243 1688 | f 227/358/227 235/359/235 243/360/243 1689 | f 244/69/244 247/361/247 250/362/250 249/363/249 1690 | f 247/361/247 248/364/248 251/365/251 250/362/250 1691 | f 248/364/248 260/366/260 261/367/261 251/365/251 1692 | f 249/363/249 250/362/250 253/368/253 252/369/252 1693 | f 250/362/250 251/365/251 254/370/254 253/368/253 1694 | f 251/365/251 261/367/261 262/371/262 254/370/254 1695 | f 245/65/245 255/372/255 258/373/258 257/374/257 1696 | f 255/372/255 256/375/256 259/376/259 258/373/258 1697 | f 256/377/256 268/378/268 269/379/269 259/380/259 1698 | f 257/374/257 258/373/258 261/367/261 260/366/260 1699 | f 258/373/258 259/376/259 262/371/262 261/367/261 1700 | f 259/380/259 269/379/269 270/381/270 262/382/262 1701 | f 246/23/246 263/383/263 266/384/266 265/385/265 1702 | f 263/383/263 264/386/264 267/387/267 266/384/266 1703 | f 264/386/264 252/369/252 253/368/253 267/387/267 1704 | f 265/385/265 266/384/266 269/379/269 268/378/268 1705 | f 266/384/266 267/387/267 270/381/270 269/379/269 1706 | f 267/387/267 253/368/253 254/370/254 270/381/270 1707 | f 254/370/254 262/388/262 270/389/270 1708 | f 271/67/271 274/390/274 277/391/277 276/392/276 1709 | f 274/390/274 275/393/275 278/394/278 277/391/277 1710 | f 275/393/275 287/395/287 288/396/288 278/394/278 1711 | f 276/392/276 277/391/277 280/397/280 279/398/279 1712 | f 277/391/277 278/394/278 281/399/281 280/397/280 1713 | f 278/394/278 288/396/288 289/400/289 281/399/281 1714 | f 272/61/272 282/401/282 285/402/285 284/403/284 1715 | f 282/401/282 283/404/283 286/405/286 285/402/285 1716 | f 283/404/283 295/406/295 296/407/296 286/405/286 1717 | f 284/403/284 285/402/285 288/396/288 287/395/287 1718 | f 285/402/285 286/405/286 289/400/289 288/396/288 1719 | f 286/405/286 296/407/296 297/408/297 289/400/289 1720 | f 273/24/273 290/409/290 293/410/293 292/411/292 1721 | f 290/409/290 291/412/291 294/413/294 293/410/293 1722 | f 291/412/291 279/414/279 280/415/280 294/413/294 1723 | f 292/411/292 293/410/293 296/407/296 295/406/295 1724 | f 293/410/293 294/413/294 297/408/297 296/407/296 1725 | f 294/413/294 280/415/280 281/416/281 297/408/297 1726 | f 281/416/281 289/417/289 297/408/297 1727 | f 298/21/298 301/418/301 304/419/304 303/420/303 1728 | f 301/418/301 302/421/302 305/422/305 304/419/304 1729 | f 302/421/302 314/423/314 315/424/315 305/422/305 1730 | f 303/420/303 304/419/304 307/425/307 306/426/306 1731 | f 304/419/304 305/422/305 308/427/308 307/425/307 1732 | f 305/422/305 315/424/315 316/428/316 308/427/308 1733 | f 299/64/299 309/429/309 312/430/312 311/431/311 1734 | f 309/429/309 310/432/310 313/433/313 312/430/312 1735 | f 310/432/310 322/434/322 323/435/323 313/433/313 1736 | f 311/431/311 312/430/312 315/436/315 314/437/314 1737 | f 312/430/312 313/433/313 316/438/316 315/436/315 1738 | f 313/433/313 323/435/323 324/439/324 316/438/316 1739 | f 300/48/300 317/440/317 320/441/320 319/442/319 1740 | f 317/440/317 318/443/318 321/444/321 320/441/320 1741 | f 318/443/318 306/426/306 307/425/307 321/444/321 1742 | f 319/442/319 320/441/320 323/435/323 322/434/322 1743 | f 320/441/320 321/444/321 324/439/324 323/435/323 1744 | f 321/444/321 307/425/307 308/427/308 324/439/324 1745 | f 308/427/308 316/428/316 324/445/324 1746 | f 325/28/325 328/446/328 331/447/331 330/448/330 1747 | f 328/446/328 329/449/329 332/450/332 331/447/331 1748 | f 329/449/329 341/451/341 342/452/342 332/450/332 1749 | f 330/448/330 331/447/331 334/453/334 333/454/333 1750 | f 331/447/331 332/450/332 335/455/335 334/453/334 1751 | f 332/450/332 342/452/342 343/456/343 335/455/335 1752 | f 326/78/326 336/457/336 339/458/339 338/459/338 1753 | f 336/457/336 337/460/337 340/461/340 339/458/339 1754 | f 337/462/337 349/463/349 350/464/350 340/465/340 1755 | f 338/459/338 339/458/339 342/452/342 341/451/341 1756 | f 339/458/339 340/461/340 343/456/343 342/452/342 1757 | f 340/465/340 350/464/350 351/466/351 343/467/343 1758 | f 327/73/327 344/468/344 347/469/347 346/470/346 1759 | f 344/468/344 345/471/345 348/472/348 347/469/347 1760 | f 345/471/345 333/454/333 334/453/334 348/472/348 1761 | f 346/470/346 347/469/347 350/464/350 349/463/349 1762 | f 347/469/347 348/472/348 351/466/351 350/464/350 1763 | f 348/472/348 334/453/334 335/455/335 351/466/351 1764 | f 335/473/335 343/474/343 351/475/351 1765 | f 352/75/352 355/476/355 358/477/358 357/478/357 1766 | f 355/476/355 356/479/356 359/480/359 358/477/358 1767 | f 356/481/356 368/482/368 369/483/369 359/484/359 1768 | f 357/478/357 358/477/358 361/485/361 360/486/360 1769 | f 358/477/358 359/480/359 362/487/362 361/485/361 1770 | f 359/484/359 369/483/369 370/488/370 362/489/362 1771 | f 353/19/353 363/490/363 366/491/366 365/492/365 1772 | f 363/490/363 364/493/364 367/494/367 366/491/366 1773 | f 364/493/364 376/495/376 377/496/377 367/494/367 1774 | f 365/492/365 366/491/366 369/483/369 368/482/368 1775 | f 366/491/366 367/494/367 370/488/370 369/483/369 1776 | f 367/494/367 377/496/377 378/497/378 370/488/370 1777 | f 354/26/354 371/498/371 374/499/374 373/500/373 1778 | f 371/498/371 372/501/372 375/502/375 374/499/374 1779 | f 372/501/372 360/486/360 361/485/361 375/502/375 1780 | f 373/500/373 374/499/374 377/496/377 376/495/376 1781 | f 374/499/374 375/502/375 378/497/378 377/496/377 1782 | f 375/502/375 361/485/361 362/487/362 378/497/378 1783 | f 362/503/362 370/504/370 378/505/378 1784 | f 379/77/379 382/506/382 385/507/385 384/508/384 1785 | f 382/506/382 383/509/383 386/510/386 385/507/385 1786 | f 383/509/383 395/511/395 396/512/396 386/510/386 1787 | f 384/508/384 385/507/385 388/513/388 387/514/387 1788 | f 385/507/385 386/510/386 389/515/389 388/513/388 1789 | f 386/510/386 396/512/396 397/516/397 389/515/389 1790 | f 380/50/380 390/517/390 393/518/393 392/519/392 1791 | f 390/517/390 391/520/391 394/521/394 393/518/393 1792 | f 391/520/391 403/522/403 404/523/404 394/521/394 1793 | f 392/519/392 393/518/393 396/512/396 395/511/395 1794 | f 393/518/393 394/521/394 397/516/397 396/512/396 1795 | f 394/521/394 404/523/404 405/524/405 397/516/397 1796 | f 381/32/381 398/525/398 401/526/401 400/527/400 1797 | f 398/525/398 399/528/399 402/529/402 401/526/401 1798 | f 399/528/399 387/530/387 388/531/388 402/529/402 1799 | f 400/527/400 401/526/401 404/523/404 403/522/403 1800 | f 401/526/401 402/529/402 405/524/405 404/523/404 1801 | f 402/529/402 388/531/388 389/532/389 405/524/405 1802 | f 389/533/389 397/516/397 405/534/405 1803 | f 406/52/406 409/535/409 412/536/412 411/537/411 1804 | f 409/535/409 410/538/410 413/539/413 412/536/412 1805 | f 410/538/410 422/540/422 423/541/423 413/539/413 1806 | f 411/537/411 412/536/412 415/542/415 414/543/414 1807 | f 412/536/412 413/539/413 416/544/416 415/542/415 1808 | f 413/539/413 423/541/423 424/545/424 416/544/416 1809 | f 407/54/407 417/546/417 420/547/420 419/548/419 1810 | f 417/546/417 418/549/418 421/550/421 420/547/420 1811 | f 418/549/418 430/551/430 431/552/431 421/550/421 1812 | f 419/548/419 420/547/420 423/541/423 422/540/422 1813 | f 420/547/420 421/550/421 424/545/424 423/541/423 1814 | f 421/550/421 431/552/431 432/553/432 424/545/424 1815 | f 408/33/408 425/554/425 428/555/428 427/556/427 1816 | f 425/554/425 426/557/426 429/558/429 428/555/428 1817 | f 426/557/426 414/543/414 415/542/415 429/558/429 1818 | f 427/556/427 428/555/428 431/559/431 430/560/430 1819 | f 428/555/428 429/558/429 432/561/432 431/559/431 1820 | f 429/558/429 415/542/415 416/544/416 432/561/432 1821 | f 416/562/416 424/545/424 432/553/432 1822 | f 3/14/3 28/13/28 33/563/33 20/101/20 1823 | f 20/101/20 33/563/33 36/564/36 21/104/21 1824 | f 21/104/21 36/564/36 48/132/48 9/87/9 1825 | f 9/87/9 48/132/48 47/129/47 6/565/6 1826 | f 6/565/6 47/129/47 30/5/30 1/4/1 1827 | f 29/41/29 55/43/55 60/139/60 39/121/39 1828 | f 39/121/39 60/139/60 63/145/63 40/124/40 1829 | f 40/124/40 63/145/63 75/164/75 52/126/52 1830 | f 52/135/52 75/162/75 74/159/74 49/131/49 1831 | f 49/131/49 74/159/74 57/6/57 30/5/30 1832 | f 1/4/1 83/184/83 95/187/95 4/79/4 1833 | f 4/79/4 95/187/95 98/176/98 5/82/5 1834 | f 5/82/5 98/176/98 86/175/86 17/84/17 1835 | f 17/98/17 86/173/86 85/170/85 14/566/14 1836 | f 14/566/14 85/170/85 82/1/82 2/3/2 1837 | f 56/56/56 84/58/84 103/567/103 66/148/66 1838 | f 66/148/66 103/567/103 106/568/106 67/151/67 1839 | f 67/151/67 106/568/106 94/569/94 79/153/79 1840 | f 79/570/79 94/188/94 93/185/93 76/161/76 1841 | f 76/161/76 93/185/93 83/184/83 57/571/57 1842 | f 109/35/109 136/37/136 141/572/141 112/204/112 1843 | f 112/204/112 141/572/141 144/573/144 113/207/113 1844 | f 113/207/113 144/573/144 156/574/156 125/209/125 1845 | f 125/575/125 156/262/156 155/259/155 122/576/122 1846 | f 122/576/122 155/259/155 138/11/138 110/10/110 1847 | f 137/72/137 163/71/163 168/275/168 147/248/147 1848 | f 147/248/147 168/275/168 171/281/171 148/251/148 1849 | f 148/251/148 171/281/171 183/300/183 160/253/160 1850 | f 160/267/160 183/298/183 182/295/182 157/261/157 1851 | f 157/261/157 182/295/182 165/12/165 138/11/138 1852 | f 110/10/110 191/34/191 203/319/203 120/215/120 1853 | f 120/215/120 203/319/203 206/309/206 121/218/121 1854 | f 121/218/121 206/309/206 194/308/194 133/220/133 1855 | f 133/234/133 194/306/194 193/303/193 130/577/130 1856 | f 130/577/130 193/303/193 190/46/190 111/45/111 1857 | f 164/8/164 192/7/192 211/578/211 174/284/174 1858 | f 174/284/174 211/578/211 214/579/214 175/287/175 1859 | f 175/287/175 214/579/214 202/320/202 187/580/187 1860 | f 187/580/187 202/320/202 201/317/201 184/297/184 1861 | f 184/297/184 201/317/201 191/34/191 165/12/165 1862 | f 2/44/2 190/46/190 195/305/195 12/90/12 1863 | f 12/90/12 195/305/195 198/313/198 13/93/13 1864 | f 13/93/13 198/313/198 210/328/210 25/581/25 1865 | f 25/581/25 210/328/210 209/325/209 22/582/22 1866 | f 22/582/22 209/325/209 192/16/192 3/18/3 1867 | f 84/36/84 109/35/109 114/206/114 101/196/101 1868 | f 101/196/101 114/206/114 117/212/117 102/199/102 1869 | f 102/199/102 117/212/117 129/231/129 90/201/90 1870 | f 90/180/90 129/229/129 128/226/128 87/172/87 1871 | f 87/172/87 128/226/128 111/2/111 82/1/82 1872 | f 219/51/219 244/69/244 249/363/249 236/353/236 1873 | f 236/353/236 249/363/249 252/369/252 237/356/237 1874 | f 237/356/237 252/369/252 264/386/264 225/583/225 1875 | f 225/583/225 264/386/264 263/383/263 222/584/222 1876 | f 222/584/222 263/383/263 246/23/246 217/22/217 1877 | f 245/65/245 271/67/271 276/392/276 255/372/255 1878 | f 255/372/255 276/392/276 279/398/279 256/375/256 1879 | f 256/377/256 279/414/279 291/412/291 268/378/268 1880 | f 268/378/268 291/412/291 290/409/290 265/385/265 1881 | f 265/385/265 290/409/290 273/24/273 246/23/246 1882 | f 217/62/217 299/64/299 311/431/311 220/331/220 1883 | f 220/331/220 311/431/311 314/437/314 221/334/221 1884 | f 221/585/221 314/423/314 302/421/302 233/586/233 1885 | f 233/586/233 302/421/302 301/418/301 230/587/230 1886 | f 230/587/230 301/418/301 298/21/298 218/20/218 1887 | f 272/61/272 300/60/300 319/588/319 282/401/282 1888 | f 282/401/282 319/588/319 322/589/322 283/404/283 1889 | f 283/404/283 322/589/322 310/432/310 295/590/295 1890 | f 295/590/295 310/432/310 309/429/309 292/591/292 1891 | f 292/591/292 309/429/309 299/64/299 273/63/273 1892 | f 327/73/327 352/75/352 357/478/357 344/468/344 1893 | f 344/468/344 357/478/357 360/486/360 345/471/345 1894 | f 345/471/345 360/486/360 372/501/372 333/592/333 1895 | f 333/592/333 372/501/372 371/498/371 330/593/330 1896 | f 330/593/330 371/498/371 354/26/354 325/25/325 1897 | f 326/78/326 379/77/379 384/508/384 336/457/336 1898 | f 336/457/336 384/508/384 387/514/387 337/460/337 1899 | f 337/594/337 387/530/387 399/528/399 349/595/349 1900 | f 349/595/349 399/528/399 398/525/398 346/596/346 1901 | f 346/596/346 398/525/398 381/32/381 327/31/327 1902 | f 380/50/380 406/52/406 411/537/411 390/517/390 1903 | f 390/517/390 411/537/411 414/543/414 391/520/391 1904 | f 391/520/391 414/543/414 426/557/426 403/522/403 1905 | f 403/522/403 426/557/426 425/554/425 400/527/400 1906 | f 400/527/400 425/554/425 408/33/408 381/32/381 1907 | f 352/75/352 408/74/408 427/597/427 355/476/355 1908 | f 355/476/355 427/597/427 430/598/430 356/479/356 1909 | f 356/599/356 430/551/430 418/549/418 368/600/368 1910 | f 368/600/368 418/549/418 417/546/417 365/601/365 1911 | f 365/601/365 417/546/417 407/54/407 353/53/353 1912 | f 55/43/55 137/42/137 149/602/149 58/137/58 1913 | f 58/137/58 149/602/149 152/603/152 59/140/59 1914 | f 59/140/59 152/603/152 140/604/140 71/142/71 1915 | f 71/156/71 140/605/140 139/237/139 68/150/68 1916 | f 68/150/68 139/237/139 136/57/136 56/56/56 1917 | f 300/48/300 354/47/354 373/606/373 317/440/317 1918 | f 317/440/317 373/606/373 376/607/376 318/443/318 1919 | f 318/443/318 376/607/376 364/493/364 306/426/306 1920 | f 306/426/306 364/493/364 363/490/363 303/420/303 1921 | f 303/420/303 363/490/363 353/19/353 298/21/298 1922 | f 271/67/271 326/66/326 338/608/338 274/390/274 1923 | f 274/390/274 338/608/338 341/609/341 275/393/275 1924 | f 275/393/275 341/609/341 329/449/329 287/610/287 1925 | f 287/610/287 329/449/329 328/446/328 284/611/284 1926 | f 284/611/284 328/446/328 325/28/325 272/30/272 1927 | f 28/38/28 164/40/164 176/612/176 31/107/31 1928 | f 31/107/31 176/612/176 179/613/179 32/110/32 1929 | f 32/614/32 179/278/179 167/276/167 44/615/44 1930 | f 44/615/44 167/276/167 166/273/166 41/616/41 1931 | f 41/616/41 166/273/166 163/71/163 29/70/29 1932 | f 244/69/244 380/68/380 392/617/392 247/361/247 1933 | f 247/361/247 392/617/392 395/618/395 248/364/248 1934 | f 248/364/248 395/618/395 383/509/383 260/619/260 1935 | f 260/619/260 383/509/383 382/506/382 257/620/257 1936 | f 257/620/257 382/506/382 379/77/379 245/76/245 1937 | f 218/55/218 407/54/407 419/548/419 228/345/228 1938 | f 228/345/228 419/548/419 422/540/422 229/348/229 1939 | f 229/348/229 422/540/422 410/538/410 241/621/241 1940 | f 241/621/241 410/538/410 409/535/409 238/622/238 1941 | f 238/622/238 409/535/409 406/52/406 219/51/219 1942 | f 1/4/1 57/571/57 83/184/83 1943 | -------------------------------------------------------------------------------- /src/assets/concrete_0016_ao_1k.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/holtsetio/flow/5bdbacc9d2659b9f5e98c405663d7da572d5cceb/src/assets/concrete_0016_ao_1k.jpg -------------------------------------------------------------------------------- /src/assets/concrete_0016_color_1k.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/holtsetio/flow/5bdbacc9d2659b9f5e98c405663d7da572d5cceb/src/assets/concrete_0016_color_1k.jpg -------------------------------------------------------------------------------- /src/assets/concrete_0016_normal_opengl_1k.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/holtsetio/flow/5bdbacc9d2659b9f5e98c405663d7da572d5cceb/src/assets/concrete_0016_normal_opengl_1k.png -------------------------------------------------------------------------------- /src/assets/concrete_0016_roughness_1k.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/holtsetio/flow/5bdbacc9d2659b9f5e98c405663d7da572d5cceb/src/assets/concrete_0016_roughness_1k.jpg -------------------------------------------------------------------------------- /src/backgroundGeometry.js: -------------------------------------------------------------------------------- 1 | import * as THREE from "three/webgpu"; 2 | import { 3 | Fn, 4 | texture, 5 | uv, 6 | positionWorld 7 | } from "three/tsl"; 8 | import {OBJLoader} from "three/examples/jsm/loaders/OBJLoader"; 9 | import * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js'; 10 | import boxObj from './assets/boxSlightlySmooth.obj'; 11 | 12 | import normalMapFile from './assets/concrete_0016_normal_opengl_1k.png'; 13 | import aoMapFile from './assets/concrete_0016_ao_1k.jpg'; 14 | import colorMapFile from './assets/concrete_0016_color_1k.jpg'; 15 | import roughnessMapFile from './assets/concrete_0016_roughness_1k.jpg'; 16 | 17 | const textureLoader = new THREE.TextureLoader(); 18 | const loadTexture = (file) => { 19 | return new Promise(resolve => { 20 | textureLoader.load(file, texture => { 21 | texture.wrapS = THREE.RepeatWrapping; 22 | texture.wrapT = THREE.RepeatWrapping; 23 | resolve(texture); 24 | }); 25 | }); 26 | } 27 | 28 | class BackgroundGeometry { 29 | object = null; 30 | constructor() { 31 | } 32 | async init() { 33 | const objectRaw = new OBJLoader().parse(boxObj); 34 | const geometry = BufferGeometryUtils.mergeVertices(objectRaw.children[0].geometry); 35 | const uvArray = geometry.attributes.uv.array; 36 | for (let i=0; i { 59 | return texture(aoMap, uv()).mul(positionWorld.z.div(0.4).mul(0.95).oneMinus()); 60 | })(); 61 | material.colorNode = Fn(() => { 62 | return texture(map, uv()).mul(positionWorld.z.div(0.4).mul(0.5).oneMinus().mul(0.7)); 63 | })(); 64 | 65 | 66 | this.box = new THREE.Mesh(geometry, material); 67 | this.box.rotation.set(0, Math.PI, 0); 68 | this.box.position.set(0, -0.05, 0.22); 69 | this.box.castShadow = true; 70 | this.box.receiveShadow = true; 71 | 72 | this.object = new THREE.Object3D(); 73 | this.object.add(this.box); 74 | } 75 | } 76 | export default BackgroundGeometry; -------------------------------------------------------------------------------- /src/common/hsv.js: -------------------------------------------------------------------------------- 1 | import {float, floor, Fn, If, trunc, vec3, int} from "three/tsl"; 2 | 3 | export const hsvtorgb = /*@__PURE__*/ Fn( ( [ hsv ] ) => { 4 | 5 | const s = hsv.y; 6 | const v = hsv.z; 7 | 8 | const result = vec3().toVar(); 9 | let h = hsv.x; 10 | h = h.sub( floor( h ) ).mul( 6.0 ).toConst(); // TODO: check what .toVar() is needed in node system cache 11 | const hi = int( trunc( h ) ).toConst(); 12 | const f = h.sub( float( hi ) ).toConst(); 13 | const p = v.mul( s.oneMinus() ).toConst(); 14 | const q = v.mul( s.mul( f ).oneMinus() ).toConst(); 15 | const t = v.mul( s.mul( f.oneMinus() ).oneMinus() ).toConst(); 16 | 17 | If( s.lessThan( 0.0001 ), () => { 18 | 19 | result.assign( vec3( v, v, v ) ); 20 | 21 | } ).ElseIf( hi.equal( int( 0 ) ), () => { 22 | 23 | result.assign( vec3( v, t, p ) ); 24 | 25 | } ).ElseIf( hi.equal( int( 1 ) ), () => { 26 | 27 | result.assign( vec3( q, v, p ) ); 28 | 29 | } ).ElseIf( hi.equal( int( 2 ) ), () => { 30 | 31 | result.assign( vec3( p, v, t ) ); 32 | 33 | } ).ElseIf( hi.equal( int( 3 ) ), () => { 34 | 35 | result.assign( vec3( p, q, v ) ); 36 | 37 | } ).ElseIf( hi.equal( int( 4 ) ), () => { 38 | 39 | result.assign( vec3( t, p, v ) ); 40 | 41 | } ).Else( () => { 42 | 43 | result.assign( vec3( v, p, q ) ); 44 | 45 | } ); 46 | 47 | return result; 48 | 49 | } ).setLayout( { 50 | name: 'hsvtorgb', 51 | type: 'vec3', 52 | inputs: [ 53 | { name: 'hsv', type: 'vec3' } 54 | ] 55 | } ); -------------------------------------------------------------------------------- /src/common/noise.js: -------------------------------------------------------------------------------- 1 | import {float, Fn, Loop, vec3} from "three/tsl"; 2 | 3 | const tri = /*@__PURE__*/ Fn( ( [ x ] ) => { 4 | 5 | return x.fract().sub( .5 ).abs(); 6 | 7 | } ).setLayout( { 8 | name: 'tri', 9 | type: 'float', 10 | inputs: [ 11 | { name: 'x', type: 'float' } 12 | ] 13 | } ); 14 | 15 | const trivec = /*@__PURE__*/ Fn( ( [ x ] ) => { 16 | 17 | return x.fract().sub( .5 ).abs(); 18 | 19 | } ).setLayout( { 20 | name: 'trivec', 21 | type: 'vec3', 22 | inputs: [ 23 | { name: 'x', type: 'vec3' } 24 | ] 25 | } ); 26 | 27 | const tri3 = /*@__PURE__*/ Fn( ( [ p ] ) => { 28 | 29 | return vec3( tri( p.z.add( tri( p.y.mul( 1. ) ) ) ), tri( p.z.add( tri( p.x.mul( 1. ) ) ) ), tri( p.y.add( tri( p.x.mul( 1. ) ) ) ) ); 30 | 31 | } ).setLayout( { 32 | name: 'tri3', 33 | type: 'vec3', 34 | inputs: [ 35 | { name: 'p', type: 'vec3' } 36 | ] 37 | } ); 38 | 39 | /** 40 | * Generates a noise value from the given position, speed and time parameters. 41 | * 42 | * @tsl 43 | * @function 44 | * @param {Node} position - The position. 45 | * @param {Node} speed - The speed. 46 | * @param {Node} time - The time. 47 | * @return {Node} The generated noise. 48 | */ 49 | export const triNoise3Dvec = /*@__PURE__*/ Fn( ( [ position, speed, time ] ) => { 50 | 51 | const p = vec3( position ).toVar(); 52 | const z = float( 1.4 ).toVar(); 53 | const rz = vec3( 0.0 ).toVar(); 54 | const bp = vec3( p ).toVar(); 55 | 56 | Loop( { start: float( 0.0 ), end: float( 3.0 ), type: 'float', condition: '<=' }, () => { 57 | 58 | const dg = vec3( tri3( bp.mul( 2.0 ) ) ).toVar(); 59 | p.addAssign( dg.add( time.mul( float( 0.1 ).mul( speed ) ) ) ); 60 | bp.mulAssign( 1.8 ); 61 | z.mulAssign( 1.5 ); 62 | p.mulAssign( 1.2 ); 63 | 64 | const t = trivec( p.zxy.add( trivec( p.xyz.add( trivec( p.yzx ) ) ) ) ).toVar(); 65 | rz.addAssign( t.div( z ) ); 66 | bp.addAssign( 0.14 ); 67 | 68 | } ); 69 | 70 | return rz; 71 | 72 | } ).setLayout( { 73 | name: 'triNoise3Dvec', 74 | type: 'vec3', 75 | inputs: [ 76 | { name: 'position', type: 'vec3' }, 77 | { name: 'speed', type: 'float' }, 78 | { name: 'time', type: 'float' } 79 | ] 80 | } ); -------------------------------------------------------------------------------- /src/conf.js: -------------------------------------------------------------------------------- 1 | import {Pane} from 'tweakpane'; 2 | import * as EssentialsPlugin from '@tweakpane/plugin-essentials'; 3 | import mobile from "is-mobile"; 4 | import * as THREE from "three/webgpu"; 5 | 6 | class Conf { 7 | gui = null; 8 | maxParticles = 8192 * 16; 9 | particles = 8192 * 4; 10 | 11 | bloom = true; 12 | 13 | run = true; 14 | noise = 1.0; 15 | speed = 1; 16 | stiffness = 3.; 17 | restDensity = 1.; 18 | density = 1; 19 | dynamicViscosity = 0.1; 20 | gravity = 0; 21 | gravitySensorReading = new THREE.Vector3(); 22 | accelerometerReading = new THREE.Vector3(); 23 | actualSize = 1; 24 | size = 1; 25 | 26 | points = false; 27 | 28 | constructor(info) { 29 | if (mobile()) { 30 | this.maxParticles = 8192 * 8; 31 | this.particles = 4096; 32 | } 33 | this.updateParams(); 34 | 35 | } 36 | 37 | updateParams() { 38 | const level = Math.max(this.particles / 8192,1); 39 | const size = 1.6/Math.pow(level, 1/3); 40 | this.actualSize = size * this.size; 41 | this.restDensity = 0.25 * level * this.density; 42 | } 43 | 44 | setupGravitySensor() { 45 | if (this.gravitySensor) { return; } 46 | this.gravitySensor = new GravitySensor({ frequency: 60 }); 47 | this.gravitySensor.addEventListener("reading", (e) => { 48 | this.gravitySensorReading.copy(this.gravitySensor).divideScalar(50); 49 | this.gravitySensorReading.setY(this.gravitySensorReading.y * -1); 50 | }); 51 | this.gravitySensor.start(); 52 | } 53 | 54 | init() { 55 | const gui = new Pane() 56 | gui.registerPlugin(EssentialsPlugin); 57 | 58 | const stats = gui.addFolder({ 59 | title: "stats", 60 | expanded: false, 61 | }); 62 | this.fpsGraph = stats.addBlade({ 63 | view: 'fpsgraph', 64 | label: 'fps', 65 | rows: 2, 66 | }); 67 | 68 | const settings = gui.addFolder({ 69 | title: "settings", 70 | expanded: false, 71 | }); 72 | settings.addBinding(this, "particles", { min: 4096, max: this.maxParticles, step: 4096 }).on('change', () => { this.updateParams(); }); 73 | settings.addBinding(this, "size", { min: 0.5, max: 2, step: 0.1 }).on('change', () => { this.updateParams(); }); 74 | settings.addBinding(this, "bloom"); 75 | //settings.addBinding(this, "points"); 76 | 77 | const simulation = settings.addFolder({ 78 | title: "simulation", 79 | expanded: false, 80 | }); 81 | simulation.addBinding(this, "run"); 82 | simulation.addBinding(this, "noise", { min: 0, max: 2, step: 0.01 }); 83 | simulation.addBinding(this, "speed", { min: 0.1, max: 2, step: 0.1 }); 84 | simulation.addBlade({ 85 | view: 'list', 86 | label: 'gravity', 87 | options: [ 88 | {text: 'back', value: 0}, 89 | {text: 'down', value: 1}, 90 | {text: 'center', value: 2}, 91 | {text: 'device gravity', value: 3}, 92 | ], 93 | value: 0, 94 | }).on('change', (ev) => { 95 | if (ev.value === 3) { 96 | this.setupGravitySensor(); 97 | } 98 | this.gravity = ev.value; 99 | }); 100 | simulation.addBinding(this, "density", { min: 0.4, max: 2, step: 0.1 }).on('change', () => { this.updateParams(); });; 101 | /*simulation.addBinding(this, "stiffness", { min: 0.5, max: 10, step: 0.1 }); 102 | simulation.addBinding(this, "restDensity", { min: 0.5, max: 10, step: 0.1 }); 103 | simulation.addBinding(this, "dynamicViscosity", { min: 0.01, max: 0.4, step: 0.01 });*/ 104 | 105 | /*settings.addBinding(this, "roughness", { min: 0.0, max: 1, step: 0.01 }); 106 | settings.addBinding(this, "metalness", { min: 0.0, max: 1, step: 0.01 });*/ 107 | 108 | this.gui = gui; 109 | } 110 | 111 | update() { 112 | } 113 | 114 | begin() { 115 | this.fpsGraph.begin(); 116 | } 117 | end() { 118 | this.fpsGraph.end(); 119 | } 120 | } 121 | export const conf = new Conf(); -------------------------------------------------------------------------------- /src/info.js: -------------------------------------------------------------------------------- 1 | import {Pane} from 'tweakpane'; 2 | import * as InfodumpPlugin from 'tweakpane-plugin-infodump'; 3 | 4 | export class Info { 5 | constructor() { 6 | const container = document.createElement('div'); 7 | document.body.appendChild(container); 8 | container.style.position = 'absolute'; 9 | container.style.left = '8px'; 10 | container.style.bottom = '8px'; 11 | container.style.maxWidth = '512px'; 12 | container.style.width = 'calc(100% - 16px)'; 13 | 14 | const pane = new Pane({ container }) 15 | pane.registerPlugin(InfodumpPlugin); 16 | this.pane = pane; 17 | 18 | const info = pane.addFolder({ 19 | title: "info", 20 | expanded: false, 21 | }); 22 | this.textBlade = info.addBlade({ 23 | view: "infodump", 24 | content: "Realtime MLS-MPM simulation in the Browser, using WebGPU and written in [ThreeJS](https://threejs.org) TSL. Inspired by the works of [Refik Anadol](https://refikanadol.com/).\n\n" + 25 | "MLS-MPM implementation is heavily based on [WebGPU-Ocean](https://github.com/matsuoka-601/WebGPU-Ocean) by [matsuoka-601](https://github.com/matsuoka-601).\n\n" + 26 | "View the source code [here](https://github.com/holtsetio/flow/).\n\n" + 27 | "[> Other experiments](https://holtsetio.com)", 28 | markdown: true, 29 | }) 30 | 31 | const credits = info.addFolder({ 32 | title: "credits", 33 | expanded: false, 34 | }); 35 | credits.element.style.marginLeft = '0px'; 36 | credits.addBlade({ 37 | view: "infodump", 38 | content: "[HDRi background](https://polyhaven.com/a/autumn_field_puresky) by Jarod Guest and Sergej Majboroda on [Polyhaven.com](https://polyhaven.com).\n\n" + 39 | "[Concrete plaster wall texture](https://www.texturecan.com/details/216/) by [texturecan.com](https://texturecan.com).\n\n", 40 | markdown: true, 41 | }); 42 | 43 | } 44 | setText(c) { 45 | this.textBlade.controller.view.element.innerHTML = '

' + c + '

'; 46 | this.pane.refresh(); 47 | } 48 | } -------------------------------------------------------------------------------- /src/lights.js: -------------------------------------------------------------------------------- 1 | import * as THREE from "three/webgpu"; 2 | 3 | export class Lights { 4 | constructor() { 5 | this.object = new THREE.Object3D(); 6 | const light = new THREE.SpotLight(0xffffff, 5, 15, Math.PI * 0.18, 1, 0); 7 | const lightTarget = new THREE.Object3D(); 8 | light.position.set(0., 1.2, -0.8); 9 | lightTarget.position.set(0,0.7,0); 10 | light.target = lightTarget; 11 | 12 | this.object.add(light); 13 | this.object.add(lightTarget); 14 | //this.object.add(new THREE.SpotLightHelper(light)); 15 | 16 | light.castShadow = true; // default false 17 | light.shadow.mapSize.width = 512*2; // default 18 | light.shadow.mapSize.height = 512*2; // default 19 | light.shadow.bias = -0.005; 20 | light.shadow.camera.near = 0.5; // default 21 | light.shadow.camera.far = 5; 22 | 23 | } 24 | 25 | update(elapsed) { 26 | 27 | } 28 | } -------------------------------------------------------------------------------- /src/mls-mpm/mlsMpmSimulator.js: -------------------------------------------------------------------------------- 1 | import * as THREE from "three/webgpu"; 2 | import { 3 | array, 4 | Fn, 5 | If, 6 | instancedArray, 7 | instanceIndex, 8 | Return, 9 | uniform, 10 | int, 11 | float, 12 | Loop, 13 | vec3, 14 | vec4, 15 | atomicAdd, 16 | uint, 17 | max, 18 | pow, 19 | mat3, 20 | clamp, 21 | time, 22 | cross, mix, mx_hsvtorgb, select, ivec3 23 | } from "three/tsl"; 24 | import {triNoise3Dvec} from "../common/noise"; 25 | import {conf} from "../conf"; 26 | import {StructuredArray} from "./structuredArray.js"; 27 | import {hsvtorgb} from "../common/hsv.js"; 28 | 29 | class mlsMpmSimulator { 30 | renderer = null; 31 | numParticles = 0; 32 | gridSize = new THREE.Vector3(0,0,0); 33 | gridCellSize = new THREE.Vector3(0,0,0); 34 | uniforms = {}; 35 | kernels = {}; 36 | fixedPointMultiplier = 1e7; 37 | mousePos = new THREE.Vector3(); 38 | mousePosArray = []; 39 | 40 | constructor(renderer) { 41 | this.renderer = renderer; 42 | } 43 | async init() { 44 | const {maxParticles} = conf; 45 | this.gridSize.set(64,64,64); 46 | 47 | const particleStruct = { 48 | position: { type: 'vec3' }, 49 | density: { type: 'float' }, 50 | velocity: { type: 'vec3' }, 51 | mass: { type: 'float' }, 52 | C: { type: 'mat3' }, 53 | direction: { type: 'vec3' }, 54 | color: { type: 'vec3' }, 55 | }; 56 | this.particleBuffer = new StructuredArray(particleStruct, maxParticles, "particleData"); 57 | 58 | const vec = new THREE.Vector3(); 59 | for (let i = 0; i < maxParticles; i++) { 60 | let dist = 2; 61 | while (dist > 1) { 62 | vec.set(Math.random(),Math.random(),Math.random()).multiplyScalar(2.0).subScalar(1.0); 63 | dist = vec.length(); 64 | vec.multiplyScalar(0.8).addScalar(1.0).divideScalar(2.0).multiply(this.gridSize); 65 | } 66 | const mass = 1.0 - Math.random() * 0.002; 67 | this.particleBuffer.set(i, "position", vec); 68 | this.particleBuffer.set(i, "mass", mass); 69 | } 70 | 71 | const cellCount = this.gridSize.x * this.gridSize.y * this.gridSize.z; 72 | const cellStruct ={ 73 | x: { type: 'int', atomic: true }, 74 | y: { type: 'int', atomic: true }, 75 | z: { type: 'int', atomic: true }, 76 | mass: { type: 'int', atomic: true }, 77 | }; 78 | this.cellBuffer = new StructuredArray(cellStruct, cellCount, "cellData"); 79 | this.cellBufferF = instancedArray(cellCount, 'vec4').label('cellDataF'); 80 | 81 | this.uniforms.gravityType = uniform(0, "uint"); 82 | this.uniforms.gravity = uniform(new THREE.Vector3()); 83 | this.uniforms.stiffness = uniform(0); 84 | this.uniforms.restDensity = uniform(0); 85 | this.uniforms.dynamicViscosity = uniform(0); 86 | this.uniforms.noise = uniform(0); 87 | 88 | this.uniforms.gridSize = uniform(this.gridSize, "ivec3"); 89 | this.uniforms.gridCellSize = uniform(this.gridCellSize); 90 | this.uniforms.dt = uniform(0.1); 91 | this.uniforms.numParticles = uniform(0, "uint"); 92 | 93 | this.uniforms.mouseRayDirection = uniform(new THREE.Vector3()); 94 | this.uniforms.mouseRayOrigin = uniform(new THREE.Vector3()); 95 | this.uniforms.mouseForce = uniform(new THREE.Vector3()); 96 | 97 | this.kernels.clearGrid = Fn(() => { 98 | this.cellBuffer.setAtomic("x", false); 99 | this.cellBuffer.setAtomic("y", false); 100 | this.cellBuffer.setAtomic("z", false); 101 | this.cellBuffer.setAtomic("mass", false); 102 | 103 | If(instanceIndex.greaterThanEqual(uint(cellCount)), () => { 104 | Return(); 105 | }); 106 | 107 | this.cellBuffer.element(instanceIndex).get('x').assign(0); 108 | this.cellBuffer.element(instanceIndex).get('y').assign(0); 109 | this.cellBuffer.element(instanceIndex).get('z').assign(0); 110 | this.cellBuffer.element(instanceIndex).get('mass').assign(0); 111 | this.cellBufferF.element(instanceIndex).assign(0); 112 | })().compute(cellCount); 113 | 114 | const encodeFixedPoint = (f32) => { 115 | return int(f32.mul(this.fixedPointMultiplier)); 116 | } 117 | const decodeFixedPoint = (i32) => { 118 | return float(i32).div(this.fixedPointMultiplier); 119 | } 120 | 121 | const getCellPtr = (ipos) => { 122 | const gridSize = this.uniforms.gridSize; 123 | const cellPtr = int(ipos.x).mul(gridSize.y).mul(gridSize.z).add(int(ipos.y).mul(gridSize.z)).add(int(ipos.z)).toConst(); 124 | return cellPtr; 125 | }; 126 | const getCell = (ipos) => { 127 | return this.cellBuffer.element(getCellPtr(ipos)); 128 | }; 129 | 130 | this.kernels.p2g1 = Fn(() => { 131 | this.cellBuffer.setAtomic("x", true); 132 | this.cellBuffer.setAtomic("y", true); 133 | this.cellBuffer.setAtomic("z", true); 134 | this.cellBuffer.setAtomic("mass", true); 135 | 136 | If(instanceIndex.greaterThanEqual(uint(this.uniforms.numParticles)), () => { 137 | Return(); 138 | }); 139 | const particlePosition = this.particleBuffer.element(instanceIndex).get('position').xyz.toConst("particlePosition"); 140 | const particleVelocity = this.particleBuffer.element(instanceIndex).get('velocity').xyz.toConst("particleVelocity"); 141 | 142 | const cellIndex = ivec3(particlePosition).sub(1).toConst("cellIndex"); 143 | const cellDiff = particlePosition.fract().sub(0.5).toConst("cellDiff"); 144 | const w0 = float(0.5).mul(float(0.5).sub(cellDiff)).mul(float(0.5).sub(cellDiff)); 145 | const w1 = float(0.75).sub(cellDiff.mul(cellDiff)); 146 | const w2 = float(0.5).mul(float(0.5).add(cellDiff)).mul(float(0.5).add(cellDiff)); 147 | const weights = array([w0,w1,w2]).toConst("weights"); 148 | 149 | const C = this.particleBuffer.element(instanceIndex).get('C').toConst(); 150 | Loop({ start: 0, end: 3, type: 'int', name: 'gx', condition: '<' }, ({gx}) => { 151 | Loop({ start: 0, end: 3, type: 'int', name: 'gy', condition: '<' }, ({gy}) => { 152 | Loop({ start: 0, end: 3, type: 'int', name: 'gz', condition: '<' }, ({gz}) => { 153 | const weight = weights.element(gx).x.mul(weights.element(gy).y).mul(weights.element(gz).z); 154 | const cellX = cellIndex.add(ivec3(gx,gy,gz)).toConst(); 155 | const cellDist = vec3(cellX).add(0.5).sub(particlePosition).toConst("cellDist"); 156 | const Q = C.mul(cellDist); 157 | 158 | const massContrib = weight; // assuming particle mass = 1.0 159 | const velContrib = massContrib.mul(particleVelocity.add(Q)).toConst("velContrib"); 160 | const cell = getCell(cellX); 161 | atomicAdd(cell.get('x'), encodeFixedPoint(velContrib.x)); 162 | atomicAdd(cell.get('y'), encodeFixedPoint(velContrib.y)); 163 | atomicAdd(cell.get('z'), encodeFixedPoint(velContrib.z)); 164 | atomicAdd(cell.get('mass'), encodeFixedPoint(massContrib)); 165 | }); 166 | }); 167 | }); 168 | })().compute(1); 169 | 170 | 171 | this.kernels.p2g2 = Fn(() => { 172 | this.cellBuffer.setAtomic("x", true); 173 | this.cellBuffer.setAtomic("y", true); 174 | this.cellBuffer.setAtomic("z", true); 175 | this.cellBuffer.setAtomic("mass", false); 176 | 177 | If(instanceIndex.greaterThanEqual(uint(this.uniforms.numParticles)), () => { 178 | Return(); 179 | }); 180 | const particlePosition = this.particleBuffer.element(instanceIndex).get('position').xyz.toConst("particlePosition"); 181 | 182 | const cellIndex = ivec3(particlePosition).sub(1).toConst("cellIndex"); 183 | const cellDiff = particlePosition.fract().sub(0.5).toConst("cellDiff"); 184 | const w0 = float(0.5).mul(float(0.5).sub(cellDiff)).mul(float(0.5).sub(cellDiff)); 185 | const w1 = float(0.75).sub(cellDiff.mul(cellDiff)); 186 | const w2 = float(0.5).mul(float(0.5).add(cellDiff)).mul(float(0.5).add(cellDiff)); 187 | const weights = array([w0,w1,w2]).toConst("weights"); 188 | 189 | const density = float(0).toVar("density"); 190 | Loop({ start: 0, end: 3, type: 'int', name: 'gx', condition: '<' }, ({gx}) => { 191 | Loop({ start: 0, end: 3, type: 'int', name: 'gy', condition: '<' }, ({gy}) => { 192 | Loop({ start: 0, end: 3, type: 'int', name: 'gz', condition: '<' }, ({gz}) => { 193 | const weight = weights.element(gx).x.mul(weights.element(gy).y).mul(weights.element(gz).z); 194 | const cellX = cellIndex.add(ivec3(gx,gy,gz)).toConst(); 195 | const cell = getCell(cellX); 196 | density.addAssign(decodeFixedPoint(cell.get('mass')).mul(weight)); 197 | }); 198 | }); 199 | }); 200 | const densityStore = this.particleBuffer.element(instanceIndex).get('density'); 201 | densityStore.assign(mix(densityStore, density, 0.05)); 202 | 203 | const volume = float(1).div(density); 204 | const pressure = max(0.0, pow(density.div(this.uniforms.restDensity), 5.0).sub(1).mul(this.uniforms.stiffness)).toConst('pressure'); 205 | const stress = mat3(pressure.negate(), 0, 0, 0, pressure.negate(), 0, 0, 0, pressure.negate()).toVar('stress'); 206 | const dudv = this.particleBuffer.element(instanceIndex).get('C').toConst('C'); 207 | 208 | const strain = dudv.add(dudv.transpose()); 209 | stress.addAssign(strain.mul(this.uniforms.dynamicViscosity)); 210 | const eq16Term0 = volume.mul(-4).mul(stress).mul(this.uniforms.dt); 211 | 212 | Loop({ start: 0, end: 3, type: 'int', name: 'gx', condition: '<' }, ({gx}) => { 213 | Loop({ start: 0, end: 3, type: 'int', name: 'gy', condition: '<' }, ({gy}) => { 214 | Loop({ start: 0, end: 3, type: 'int', name: 'gz', condition: '<' }, ({gz}) => { 215 | const weight = weights.element(gx).x.mul(weights.element(gy).y).mul(weights.element(gz).z); 216 | const cellX = cellIndex.add(ivec3(gx,gy,gz)).toConst(); 217 | const cellDist = vec3(cellX).add(0.5).sub(particlePosition).toConst("cellDist"); 218 | const cell= getCell(cellX); 219 | 220 | const momentum = eq16Term0.mul(weight).mul(cellDist).toConst("momentum"); 221 | atomicAdd(cell.get('x'), encodeFixedPoint(momentum.x)); 222 | atomicAdd(cell.get('y'), encodeFixedPoint(momentum.y)); 223 | atomicAdd(cell.get('z'), encodeFixedPoint(momentum.z)); 224 | }); 225 | }); 226 | }); 227 | })().compute(1); 228 | 229 | 230 | this.kernels.updateGrid = Fn(() => { 231 | this.cellBuffer.setAtomic("x", false); 232 | this.cellBuffer.setAtomic("y", false); 233 | this.cellBuffer.setAtomic("z", false); 234 | this.cellBuffer.setAtomic("mass", false); 235 | 236 | If(instanceIndex.greaterThanEqual(uint(cellCount)), () => { 237 | Return(); 238 | }); 239 | const cell = this.cellBuffer.element(instanceIndex).toConst("cell"); 240 | 241 | const mass = decodeFixedPoint(cell.get('mass')).toConst(); 242 | If(mass.lessThanEqual(0), () => { Return(); }); 243 | 244 | const vx = decodeFixedPoint(cell.get('x')).div(mass).toVar(); 245 | const vy = decodeFixedPoint(cell.get('y')).div(mass).toVar(); 246 | const vz = decodeFixedPoint(cell.get('z')).div(mass).toVar(); 247 | 248 | const x = int(instanceIndex).div(this.uniforms.gridSize.z).div(this.uniforms.gridSize.y); 249 | const y = int(instanceIndex).div(this.uniforms.gridSize.z).mod(this.uniforms.gridSize.y); 250 | const z = int(instanceIndex).mod(this.uniforms.gridSize.z); 251 | 252 | 253 | If(x.lessThan(int(2)).or(x.greaterThan(this.uniforms.gridSize.x.sub(int(2)))), () => { 254 | vx.assign(0); 255 | }); 256 | If(y.lessThan(int(2)).or(y.greaterThan(this.uniforms.gridSize.y.sub(int(2)))), () => { 257 | vy.assign(0); 258 | }); 259 | If(z.lessThan(int(2)).or(z.greaterThan(this.uniforms.gridSize.z.sub(int(2)))), () => { 260 | vz.assign(0); 261 | }); 262 | 263 | this.cellBufferF.element(instanceIndex).assign(vec4(vx,vy,vz,mass)); 264 | })().compute(cellCount); 265 | 266 | this.kernels.g2p = Fn(() => { 267 | If(instanceIndex.greaterThanEqual(uint(this.uniforms.numParticles)), () => { 268 | Return(); 269 | }); 270 | const particleMass = this.particleBuffer.element(instanceIndex).get('mass').toConst("particleMass"); 271 | const particleDensity = this.particleBuffer.element(instanceIndex).get('density').toConst("particleDensity"); 272 | const particlePosition = this.particleBuffer.element(instanceIndex).get('position').xyz.toVar("particlePosition"); 273 | const particleVelocity = vec3(0).toVar(); 274 | If(this.uniforms.gravityType.equal(uint(2)), () => { 275 | const pn = particlePosition.div(vec3(this.uniforms.gridSize.sub(1))).sub(0.5).normalize().toConst(); 276 | particleVelocity.subAssign(pn.mul(0.3).mul(this.uniforms.dt)); 277 | }).Else(() => { 278 | particleVelocity.addAssign(this.uniforms.gravity.mul(this.uniforms.dt)); 279 | }); 280 | 281 | 282 | const noise = triNoise3Dvec(particlePosition.mul(0.015), time, 0.11).sub(0.285).normalize().mul(0.28).toVar(); 283 | particleVelocity.subAssign(noise.mul(this.uniforms.noise).mul(this.uniforms.dt)); 284 | 285 | const cellIndex = ivec3(particlePosition).sub(1).toConst("cellIndex"); 286 | const cellDiff = particlePosition.fract().sub(0.5).toConst("cellDiff"); 287 | 288 | const w0 = float(0.5).mul(float(0.5).sub(cellDiff)).mul(float(0.5).sub(cellDiff)); 289 | const w1 = float(0.75).sub(cellDiff.mul(cellDiff)); 290 | const w2 = float(0.5).mul(float(0.5).add(cellDiff)).mul(float(0.5).add(cellDiff)); 291 | const weights = array([w0,w1,w2]).toConst("weights"); 292 | 293 | const B = mat3(0).toVar("B"); 294 | Loop({ start: 0, end: 3, type: 'int', name: 'gx', condition: '<' }, ({gx}) => { 295 | Loop({ start: 0, end: 3, type: 'int', name: 'gy', condition: '<' }, ({gy}) => { 296 | Loop({ start: 0, end: 3, type: 'int', name: 'gz', condition: '<' }, ({gz}) => { 297 | const weight = weights.element(gx).x.mul(weights.element(gy).y).mul(weights.element(gz).z); 298 | const cellX = cellIndex.add(ivec3(gx,gy,gz)).toConst(); 299 | const cellDist = vec3(cellX).add(0.5).sub(particlePosition).toConst("cellDist"); 300 | const cellPtr = getCellPtr(cellX); 301 | 302 | const weightedVelocity = this.cellBufferF.element(cellPtr).xyz.mul(weight).toConst("weightedVelocity"); 303 | const term = mat3( 304 | weightedVelocity.mul(cellDist.x), 305 | weightedVelocity.mul(cellDist.y), 306 | weightedVelocity.mul(cellDist.z) 307 | ); 308 | B.addAssign(term); 309 | particleVelocity.addAssign(weightedVelocity); 310 | }); 311 | }); 312 | }); 313 | 314 | const dist = cross(this.uniforms.mouseRayDirection, particlePosition.mul(vec3(1,1,0.4)).sub(this.uniforms.mouseRayOrigin)).length() 315 | const force = dist.mul(0.1).oneMinus().max(0.0).pow(2); 316 | //particleVelocity.assign(mix(particleVelocity, this.uniforms.mouseForce.mul(6), force)); 317 | particleVelocity.addAssign(this.uniforms.mouseForce.mul(1).mul(force)); 318 | particleVelocity.mulAssign(particleMass); // to ensure difference between particles 319 | 320 | this.particleBuffer.element(instanceIndex).get('C').assign(B.mul(4)); 321 | particlePosition.addAssign(particleVelocity.mul(this.uniforms.dt)); 322 | particlePosition.assign(clamp(particlePosition, vec3(2), this.uniforms.gridSize.sub(2))); 323 | 324 | const wallStiffness = 0.3; 325 | const xN = particlePosition.add(particleVelocity.mul(this.uniforms.dt).mul(3.0)).toConst("xN"); 326 | const wallMin = vec3(3).toConst("wallMin"); 327 | const wallMax = vec3(this.uniforms.gridSize).sub(3).toConst("wallMax"); 328 | If(xN.x.lessThan(wallMin.x), () => { particleVelocity.x.addAssign(wallMin.x.sub(xN.x).mul(wallStiffness)); }); 329 | If(xN.x.greaterThan(wallMax.x), () => { particleVelocity.x.addAssign(wallMax.x.sub(xN.x).mul(wallStiffness)); }); 330 | If(xN.y.lessThan(wallMin.y), () => { particleVelocity.y.addAssign(wallMin.y.sub(xN.y).mul(wallStiffness)); }); 331 | If(xN.y.greaterThan(wallMax.y), () => { particleVelocity.y.addAssign(wallMax.y.sub(xN.y).mul(wallStiffness)); }); 332 | If(xN.z.lessThan(wallMin.z), () => { particleVelocity.z.addAssign(wallMin.z.sub(xN.z).mul(wallStiffness)); }); 333 | If(xN.z.greaterThan(wallMax.z), () => { particleVelocity.z.addAssign(wallMax.z.sub(xN.z).mul(wallStiffness)); }); 334 | 335 | this.particleBuffer.element(instanceIndex).get('position').assign(particlePosition) 336 | this.particleBuffer.element(instanceIndex).get('velocity').assign(particleVelocity) 337 | 338 | const direction = this.particleBuffer.element(instanceIndex).get('direction'); 339 | direction.assign(mix(direction,particleVelocity, 0.1)); 340 | 341 | const color = hsvtorgb(vec3(particleDensity.div(this.uniforms.restDensity).mul(0.25).add(time.mul(0.05)), particleVelocity.length().mul(0.5).clamp(0,1).mul(0.3).add(0.7), force.mul(0.3).add(0.7))); 342 | this.particleBuffer.element(instanceIndex).get('color').assign(color); 343 | })().compute(1); 344 | } 345 | 346 | setMouseRay(origin, direction, pos) { 347 | origin.multiplyScalar(64); 348 | pos.multiplyScalar(64); 349 | origin.add(new THREE.Vector3(32,0,0)); 350 | this.uniforms.mouseRayDirection.value.copy(direction.normalize()); 351 | this.uniforms.mouseRayOrigin.value.copy(origin); 352 | this.mousePos.copy(pos); 353 | } 354 | 355 | async update(interval, elapsed) { 356 | const { particles, run, noise, dynamicViscosity, stiffness, restDensity, speed, gravity, gravitySensorReading, accelerometerReading } = conf; 357 | 358 | this.uniforms.noise.value = noise; 359 | this.uniforms.stiffness.value = stiffness; 360 | this.uniforms.gravityType.value = gravity; 361 | if (gravity === 0) { 362 | this.uniforms.gravity.value.set(0,0,0.2); 363 | } else if (gravity === 1) { 364 | this.uniforms.gravity.value.set(0,-0.2,0); 365 | } else if (gravity === 3) { 366 | this.uniforms.gravity.value.copy(gravitySensorReading).add(accelerometerReading); 367 | } 368 | this.uniforms.dynamicViscosity.value = dynamicViscosity; 369 | this.uniforms.restDensity.value = restDensity; 370 | 371 | if (particles !== this.numParticles) { 372 | this.numParticles = particles; 373 | this.uniforms.numParticles.value = particles; 374 | this.kernels.p2g1.count = particles; 375 | this.kernels.p2g1.updateDispatchCount(); 376 | this.kernels.p2g2.count = particles; 377 | this.kernels.p2g2.updateDispatchCount(); 378 | this.kernels.g2p.count = particles; 379 | this.kernels.g2p.updateDispatchCount(); 380 | } 381 | 382 | interval = Math.min(interval, 1/60); 383 | const dt = interval * 6 * speed; 384 | this.uniforms.dt.value = dt; 385 | 386 | this.mousePosArray.push(this.mousePos.clone()) 387 | if (this.mousePosArray.length > 3) { this.mousePosArray.shift(); } 388 | if (this.mousePosArray.length > 1) { 389 | this.uniforms.mouseForce.value.copy(this.mousePosArray[this.mousePosArray.length - 1]).sub(this.mousePosArray[0]).divideScalar(this.mousePosArray.length); 390 | } 391 | 392 | 393 | if (run) { 394 | const kernels = [this.kernels.clearGrid, this.kernels.p2g1, this.kernels.p2g2, this.kernels.updateGrid, this.kernels.g2p]; 395 | await this.renderer.computeAsync(kernels); 396 | } 397 | } 398 | } 399 | 400 | export default mlsMpmSimulator; -------------------------------------------------------------------------------- /src/mls-mpm/particleRenderer.js: -------------------------------------------------------------------------------- 1 | import * as THREE from "three/webgpu"; 2 | import {Fn, attribute, triNoise3D, time, vec3, vec4, float, varying,instanceIndex,mix,normalize,cross,mat3,normalLocal,transformNormalToView,mx_hsvtorgb,mrt,uniform} from "three/tsl"; 3 | import * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js'; 4 | import {conf} from "../conf"; 5 | 6 | 7 | export const calcLookAtMatrix = /*#__PURE__*/ Fn( ( [ target_immutable ] ) => { 8 | const target = vec3( target_immutable ).toVar(); 9 | const rr = vec3( 0,0,1.0 ).toVar(); 10 | const ww = vec3( normalize( target ) ).toVar(); 11 | const uu = vec3( normalize( cross( ww, rr ) ).negate() ).toVar(); 12 | const vv = vec3( normalize( cross( uu, ww ) ).negate() ).toVar(); 13 | 14 | return mat3( uu, vv, ww ); 15 | } ).setLayout( { 16 | name: 'calcLookAtMatrix', 17 | type: 'mat3', 18 | inputs: [ 19 | { name: 'direction', type: 'vec3' }, 20 | ] 21 | } ); 22 | 23 | const createRoundedBox = (width, height, depth, radius) => { 24 | //completely overengineered late night programming lol 25 | const box = new THREE.BoxGeometry(width - radius*2, height - radius*2, depth - radius*2); 26 | const epsilon = Math.min(width, height, depth) * 0.01; 27 | const positionArray = box.attributes.position.array; 28 | const normalArray = box.attributes.normal.array; 29 | const indices = [...(box.getIndex().array)]; 30 | const vertices = []; 31 | const posMap = {}; 32 | const edgeMap = {}; 33 | for (let i=0; i Math.round(v / epsilon)).join("_"); 43 | posMap[vertex.posHash] = [...(posMap[vertex.posHash] || []), vertex]; 44 | vertices.push(vertex); 45 | } 46 | vertices.forEach(vertex => { 47 | const face = vertex.normal.toArray().map(v => Math.round(v)).join("_"); 48 | vertex.face = face; 49 | posMap[vertex.posHash].forEach(vertex => { vertex.faces.push(face); } ); 50 | }); 51 | vertices.forEach(vertex => { 52 | const addVertexToEdgeMap = (vertex, entry) => { 53 | edgeMap[entry] = [...(edgeMap[entry] || []), vertex]; 54 | } 55 | vertex.faces.sort(); 56 | const f0 = vertex.faces[0]; 57 | const f1 = vertex.faces[1]; 58 | const f2 = vertex.faces[2]; 59 | const face = vertex.face; 60 | if (f0 === face || f1 === face) addVertexToEdgeMap(vertex, f0 + "_" + f1); 61 | if (f0 === face || f2 === face) addVertexToEdgeMap(vertex, f0 + "_" + f2); 62 | if (f1 === face || f2 === face) addVertexToEdgeMap(vertex, f1 + "_" + f2); 63 | }); 64 | 65 | const addFace = (v0,v1,v2) => { 66 | const a = v1.clone().sub(v0); 67 | const b = v2.clone().sub(v0); 68 | if (a.cross(b).dot(v0) > 0) { 69 | indices.push(v0.id, v1.id, v2.id); 70 | } else { 71 | indices.push(v0.id, v2.id, v1.id); 72 | } 73 | } 74 | 75 | Object.keys(posMap).forEach(key => { 76 | addFace(...posMap[key]) 77 | }); 78 | 79 | Object.keys(edgeMap).forEach(key => { 80 | const edgeVertices = edgeMap[key]; 81 | const v0 = edgeVertices[0]; 82 | edgeVertices.sort((v1,v2) => v1.distanceTo(v0) - v2.distanceTo(v0)); 83 | addFace(...edgeVertices.slice(0,3)); 84 | addFace(...edgeVertices.slice(1,4)); 85 | }); 86 | 87 | box.setIndex(indices); 88 | return box; 89 | } 90 | 91 | 92 | class ParticleRenderer { 93 | mlsMpmSim = null; 94 | object = null; 95 | bloom = false; 96 | uniforms = {}; 97 | 98 | constructor(mlsMpmSim) { 99 | this.mlsMpmSim = mlsMpmSim; 100 | 101 | /*const box = new THREE.BoxGeometry(0.7, 0.7,3); 102 | const cone = new THREE.ConeGeometry( 0.5, 3.0, 8 ); 103 | cone.applyQuaternion(new THREE.Quaternion().setFromEuler(new THREE.Euler(Math.PI* 0.5, 0, 0))) 104 | this.geometry = new THREE.InstancedBufferGeometry().copy(cone); 105 | console.log(this.geometry);*/ 106 | 107 | //const sphereGeometry = BufferGeometryUtils.mergeVertices(new THREE.IcosahedronGeometry(0.5, 1)); 108 | const boxGeometry = BufferGeometryUtils.mergeVertices(new THREE.BoxGeometry(7, 7,30), 3.0); 109 | boxGeometry.attributes.position.array = boxGeometry.attributes.position.array.map(v => v*0.1); 110 | const roundedBoxGeometry = createRoundedBox(0.7,0.7,3,0.1); //BufferGeometryUtils.mergeVertices(new RoundedBoxGeometry(0.7,0.7,3,1,0.1)); 111 | 112 | this.defaultIndexCount = roundedBoxGeometry.index.count; 113 | this.shadowIndexCount = boxGeometry.index.count; 114 | 115 | const mergedGeometry = BufferGeometryUtils.mergeGeometries([roundedBoxGeometry, boxGeometry]); 116 | 117 | this.geometry = new THREE.InstancedBufferGeometry().copy(mergedGeometry); 118 | 119 | this.geometry.setDrawRange(0, this.defaultIndexCount); 120 | this.geometry.instanceCount = this.mlsMpmSim.numParticles; 121 | 122 | this.material = new THREE.MeshStandardNodeMaterial({ 123 | metalness: 0.900, 124 | roughness: 0.50, 125 | //iridescence: 1.0, 126 | }); 127 | 128 | this.uniforms.size = uniform(1); 129 | const vAo = varying(0, "vAo"); 130 | const vNormal = varying(vec3(0), "v_normalView"); 131 | 132 | const particle = this.mlsMpmSim.particleBuffer.element(instanceIndex); 133 | this.material.positionNode = Fn(() => { 134 | const particlePosition = particle.get("position"); 135 | const particleDensity = particle.get("density"); 136 | const particleDirection = particle.get("direction"); 137 | 138 | //return attribute("position").xyz.mul(10).add(vec3(32,32,0)); 139 | //return attribute("position").xyz.mul(0.1).add(positionAttribute.mul(vec3(1,1,0.4))); 140 | const mat = calcLookAtMatrix(particleDirection.xyz); 141 | vNormal.assign(transformNormalToView(mat.mul(normalLocal))); 142 | vAo.assign(particlePosition.z.div(64)); 143 | vAo.assign(vAo.mul(vAo).oneMinus()); 144 | return mat.mul(attribute("position").xyz.mul(this.uniforms.size)).mul(particleDensity.mul(0.4).add(0.5).clamp(0,1)).add(particlePosition.mul(vec3(1,1,0.4))); 145 | })(); 146 | this.material.colorNode = particle.get("color"); 147 | this.material.aoNode = vAo; 148 | 149 | //this.material.fragmentNode = vec4(0,0,0,1); 150 | //this.material.envNode = vec3(0.5); 151 | 152 | this.object = new THREE.Mesh(this.geometry, this.material); 153 | this.object.onBeforeShadow = () => { this.geometry.setDrawRange(this.defaultIndexCount, Infinity); } 154 | this.object.onAfterShadow = () => { this.geometry.setDrawRange(0, this.defaultIndexCount); } 155 | 156 | 157 | this.object.frustumCulled = false; 158 | 159 | const s = (1/64); 160 | this.object.position.set(-32.0*s,0,0); 161 | this.object.scale.set(s,s,s); 162 | this.object.castShadow = true; 163 | this.object.receiveShadow = true; 164 | } 165 | 166 | update() { 167 | const { particles, bloom, actualSize } = conf; 168 | this.uniforms.size.value = actualSize; 169 | this.geometry.instanceCount = particles; 170 | 171 | if (bloom !== this.bloom) { 172 | this.bloom = bloom; 173 | this.material.mrtNode = bloom ? mrt( { 174 | bloomIntensity: 1 175 | } ) : null; 176 | } 177 | } 178 | } 179 | export default ParticleRenderer; -------------------------------------------------------------------------------- /src/mls-mpm/pointRenderer.js: -------------------------------------------------------------------------------- 1 | import * as THREE from "three/webgpu"; 2 | import {Fn, vec3,instanceIndex} from "three/tsl"; 3 | import {conf} from "../conf"; 4 | 5 | class PointRenderer { 6 | mlsMpmSim = null; 7 | object = null; 8 | 9 | constructor(mlsMpmSim) { 10 | this.mlsMpmSim = mlsMpmSim; 11 | 12 | this.geometry = new THREE.InstancedBufferGeometry(); 13 | const positionBuffer = new THREE.BufferAttribute(new Float32Array(3), 3, false); 14 | const material = new THREE.PointsNodeMaterial(); 15 | this.geometry.setAttribute('position', positionBuffer); 16 | this.object = new THREE.Points(this.geometry, material); 17 | material.positionNode = Fn(() => { 18 | return this.mlsMpmSim.particleBuffer.element(instanceIndex).get('position').mul(vec3(1,1,0.4)); 19 | })(); 20 | 21 | this.object.frustumCulled = false; 22 | 23 | const s = (1/64); 24 | this.object.position.set(-32.0*s,0,0); 25 | this.object.scale.set(s,s,s); 26 | this.object.castShadow = true; 27 | this.object.receiveShadow = true; 28 | } 29 | 30 | update() { 31 | const { particles } = conf; 32 | this.geometry.instanceCount = particles; 33 | } 34 | } 35 | export default PointRenderer; -------------------------------------------------------------------------------- /src/mls-mpm/structuredArray.js: -------------------------------------------------------------------------------- 1 | import {struct, instancedArray} from "three/tsl"; 2 | 3 | const TYPES = { 4 | int: { size: 1, alignment: 1, isFloat: false }, 5 | uint: { size: 1, alignment: 1, isFloat: false }, 6 | float: { size: 1, alignment: 1, isFloat: true }, 7 | 8 | vec2: { size: 2, alignment: 2, isFloat: true }, 9 | ivec2: { size: 2, alignment: 2, isFloat: false }, 10 | uvec2: { size: 2, alignment: 2, isFloat: false }, 11 | 12 | vec3: { size: 3, alignment: 4, isFloat: true }, 13 | ivec3: { size: 3, alignment: 4, isFloat: false }, 14 | uvec3: { size: 3, alignment: 4, isFloat: false }, 15 | 16 | vec4: { size: 4, alignment: 4, isFloat: true }, 17 | ivec4: { size: 4, alignment: 4, isFloat: false }, 18 | uvec4: { size: 4, alignment: 4, isFloat: false }, 19 | 20 | mat2: { size: 4, alignment: 2, isFloat: true }, 21 | mat3: { size: 12, alignment: 4, isFloat: true }, 22 | mat4: { size: 16, alignment: 4, isFloat: true }, 23 | }; 24 | 25 | export class StructuredArray { 26 | structNode = null; 27 | buffer = null; 28 | layout = null; 29 | structSize = 0; 30 | 31 | constructor(layout, length, label) { 32 | this.layout = this._parse(layout); 33 | this.length = length; 34 | this.structNode = struct(this.layout); 35 | this.floatArray = new Float32Array(this.structSize * this.length); 36 | this.intArray = new Int32Array(this.floatArray.buffer); 37 | this.buffer = instancedArray(this.floatArray, this.structNode).label(label); 38 | } 39 | 40 | setAtomic(element, value) { 41 | const index = Object.keys(this.layout).findIndex(k => k === element); 42 | if (index >= 0) { 43 | this.buffer.structTypeNode.membersLayout[index].atomic = value; 44 | } 45 | } 46 | 47 | set(index, element, value) { 48 | const member = this.layout[element]; 49 | if (!member) { 50 | return console.error("Unknown element '" + element + "'"); 51 | } 52 | const offset = index * this.structSize + member.offset; 53 | const array = member.isFloat ? this.floatArray : this.intArray; 54 | 55 | if (member.size === 1) { 56 | if (typeof value !== 'number') { 57 | return console.error("Expected a Number value for element '" + element + "'"); 58 | } 59 | array[offset] = value; 60 | } 61 | if (member.size > 1) { 62 | if (typeof value === 'object' && !Array.isArray(value)) { 63 | const obj = value; 64 | value = [obj.x, obj.y || 0, obj.z || 0, obj.w || 0]; 65 | } 66 | if (!Array.isArray(value) || value.length < member.size) { 67 | return console.error("Expected an array of length " + member.size + " for element '" + element + "'"); 68 | } 69 | for (let i = 0; i < member.size; i++) { 70 | array[offset + i] = value[i]; 71 | } 72 | } 73 | } 74 | 75 | element(index) { 76 | return this.buffer.element(index); 77 | } 78 | 79 | get(index, element) { 80 | return this.buffer.element(index).get(element); 81 | } 82 | 83 | _parse(layout) { 84 | let offset = 0; 85 | const parsedLayout = {}; 86 | 87 | const keys = Object.keys(layout); 88 | for (let i = 0; i < keys.length; i++) { 89 | const key = keys[i]; 90 | let member = layout[key]; 91 | if (typeof member === 'string' || member instanceof String) { 92 | member = { type: member }; 93 | } 94 | const type = member.type; 95 | if (!TYPES[type]) { 96 | return console.error("Unknown type '" + type + "'"); 97 | } 98 | const { size, alignment, isFloat } = TYPES[type]; 99 | member.size = size; 100 | member.isFloat = isFloat; 101 | 102 | const rest = offset % alignment; 103 | if (rest !== 0) { 104 | offset += (alignment - rest); 105 | } 106 | member.offset = offset; 107 | offset += size; 108 | 109 | parsedLayout[key] = member; 110 | } 111 | 112 | const rest = offset % 4; 113 | if (rest !== 0) { 114 | offset += (4 - rest); 115 | } 116 | 117 | this.structSize = offset; 118 | return parsedLayout; 119 | } 120 | }; -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import tslOperatorPlugin from 'vite-plugin-tsl-operator' 3 | import plainText from 'vite-plugin-plain-text'; 4 | 5 | export default defineConfig({ 6 | base: './', 7 | assetsInclude: ['**/*.hdr'], 8 | server: { 9 | port: 1234, 10 | }, 11 | plugins: [ 12 | tslOperatorPlugin({logs:false}), 13 | plainText( 14 | [/\.obj$/], 15 | { namedExport: false }, 16 | ), 17 | ] 18 | }); --------------------------------------------------------------------------------