├── .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 | [](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 |
66 |
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 = '';
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 | });
--------------------------------------------------------------------------------