BlueGit

golden-age paperdoll-renderer

feat: add the Paperdoll Renderer foundation shell

Record the design, including the verbatim Dutch specification and the
OBJ, FBX and glTF support matrix. Add a Rust status window that reports
import and rendering as not built, with unit tests and a BlueGit pipeline
that calls the documented release API without creating a tag.

Co-authored-by: tim <tim@timfalken.com>

timfa Cursor Agent · pushed by timfa

Authored 2026-11-06 · 7 days ago

Hash
1b7e6b2827b11b8db1b31f1bf73a5145e57cbffc
Parent
7d229fdc
22 files changed +4447 −2
.gitignore added +8 −0
@@ -0,0 +1,8 @@
1 /target/
2 /dist/
3 /cargo-home/
4 /packaging/arch/src/
5 /packaging/arch/pkg/
6 /packaging/arch/*.pkg.tar.zst
7 /packaging/arch/*.pkg.tar.zst.sig
8 **/*.AppImage
@@ -0,0 +1,8 @@
1/target/
2/dist/
3/cargo-home/
4/packaging/arch/src/
5/packaging/arch/pkg/
6/packaging/arch/*.pkg.tar.zst
7/packaging/arch/*.pkg.tar.zst.sig
8**/*.AppImage
Cargo.lock added +3174 −0
@@ -0,0 +1,3174 @@
1 # This file is automatically @generated by Cargo.
2 # It is not intended for manual editing.
3 version = 4
4
5 [[package]]
6 name = "ab_glyph"
7 version = "0.2.32"
8 source = "registry+https://github.com/rust-lang/crates.io-index"
9 checksum = "01c0457472c38ea5bd1c3b5ada5e368271cb550be7a4ca4a0b4634e9913f6cc2"
10 dependencies = [
11 "ab_glyph_rasterizer",
12 "owned_ttf_parser",
13 ]
14
15 [[package]]
16 name = "ab_glyph_rasterizer"
17 version = "0.1.10"
18 source = "registry+https://github.com/rust-lang/crates.io-index"
19 checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618"
20
21 [[package]]
22 name = "adler2"
23 version = "2.0.1"
24 source = "registry+https://github.com/rust-lang/crates.io-index"
25 checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
26
27 [[package]]
28 name = "ahash"
29 version = "0.8.12"
30 source = "registry+https://github.com/rust-lang/crates.io-index"
31 checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75"
32 dependencies = [
33 "cfg-if",
34 "getrandom 0.3.4",
35 "once_cell",
36 "version_check",
37 "zerocopy",
38 ]
39
40 [[package]]
41 name = "android-activity"
42 version = "0.6.1"
43 source = "registry+https://github.com/rust-lang/crates.io-index"
44 checksum = "0f2a1bb052857d5dd49572219344a7332b31b76405648eabac5bc68978251bcd"
45 dependencies = [
46 "android-properties",
47 "bitflags 2.13.2",
48 "cc",
49 "jni",
50 "libc",
51 "log",
52 "ndk",
53 "ndk-context",
54 "ndk-sys 0.6.0+11769913",
55 "num_enum",
56 "thiserror 2.0.21",
57 ]
58
59 [[package]]
60 name = "android-properties"
61 version = "0.2.2"
62 source = "registry+https://github.com/rust-lang/crates.io-index"
63 checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04"
64
65 [[package]]
66 name = "android_system_properties"
67 version = "0.1.6"
68 source = "registry+https://github.com/rust-lang/crates.io-index"
69 checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc"
70 dependencies = [
71 "libc",
72 ]
73
74 [[package]]
75 name = "arboard"
76 version = "3.7.0"
77 source = "registry+https://github.com/rust-lang/crates.io-index"
78 checksum = "aeb9553e62312c8756a5979254fc6d7da8bbeb5986a1e17037fab932f7037917"
79 dependencies = [
80 "clipboard-win",
81 "log",
82 "objc2 0.6.5",
83 "objc2-app-kit 0.3.2",
84 "objc2-foundation 0.3.2",
85 "parking_lot",
86 "percent-encoding",
87 "windows-sys 0.61.2",
88 "x11rb",
89 ]
90
91 [[package]]
92 name = "arrayvec"
93 version = "0.7.8"
94 source = "registry+https://github.com/rust-lang/crates.io-index"
95 checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56"
96
97 [[package]]
98 name = "as-raw-xcb-connection"
99 version = "1.0.1"
100 source = "registry+https://github.com/rust-lang/crates.io-index"
101 checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b"
102
103 [[package]]
104 name = "ash"
105 version = "0.38.0+1.3.281"
106 source = "registry+https://github.com/rust-lang/crates.io-index"
107 checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f"
108 dependencies = [
109 "libloading",
110 ]
111
112 [[package]]
113 name = "atomic-waker"
114 version = "1.1.2"
115 source = "registry+https://github.com/rust-lang/crates.io-index"
116 checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
117
118 [[package]]
119 name = "autocfg"
120 version = "1.5.1"
121 source = "registry+https://github.com/rust-lang/crates.io-index"
122 checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
123
124 [[package]]
125 name = "bit-set"
126 version = "0.6.0"
127 source = "registry+https://github.com/rust-lang/crates.io-index"
128 checksum = "f0481a0e032742109b1133a095184ee93d88f3dc9e0d28a5d033dc77a073f44f"
129 dependencies = [
130 "bit-vec",
131 ]
132
133 [[package]]
134 name = "bit-vec"
135 version = "0.7.0"
136 source = "registry+https://github.com/rust-lang/crates.io-index"
137 checksum = "d2c54ff287cfc0a34f38a6b832ea1bd8e448a330b3e40a50859e6488bee07f22"
138
139 [[package]]
140 name = "bitflags"
141 version = "1.3.2"
142 source = "registry+https://github.com/rust-lang/crates.io-index"
143 checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
144
145 [[package]]
146 name = "bitflags"
147 version = "2.13.2"
148 source = "registry+https://github.com/rust-lang/crates.io-index"
149 checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06"
150
151 [[package]]
152 name = "block"
153 version = "0.1.6"
154 source = "registry+https://github.com/rust-lang/crates.io-index"
155 checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a"
156
157 [[package]]
158 name = "block2"
159 version = "0.5.1"
160 source = "registry+https://github.com/rust-lang/crates.io-index"
161 checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f"
162 dependencies = [
163 "objc2 0.5.3",
164 ]
165
166 [[package]]
167 name = "bumpalo"
168 version = "3.20.3"
169 source = "registry+https://github.com/rust-lang/crates.io-index"
170 checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649"
171
172 [[package]]
173 name = "bytemuck"
174 version = "1.25.2"
175 source = "registry+https://github.com/rust-lang/crates.io-index"
176 checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797"
177 dependencies = [
178 "bytemuck_derive",
179 ]
180
181 [[package]]
182 name = "bytemuck_derive"
183 version = "1.12.1"
184 source = "registry+https://github.com/rust-lang/crates.io-index"
185 checksum = "6a1f896587b6f2c069c73d2f0913e2d590c3990285cd2f0b6aa02b786b4c679c"
186 dependencies = [
187 "proc-macro2",
188 "quote",
189 "syn 3.0.9",
190 ]
191
192 [[package]]
193 name = "byteorder-lite"
194 version = "0.1.0"
195 source = "registry+https://github.com/rust-lang/crates.io-index"
196 checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495"
197
198 [[package]]
199 name = "bytes"
200 version = "1.12.1"
201 source = "registry+https://github.com/rust-lang/crates.io-index"
202 checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04"
203
204 [[package]]
205 name = "calloop"
206 version = "0.13.0"
207 source = "registry+https://github.com/rust-lang/crates.io-index"
208 checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec"
209 dependencies = [
210 "bitflags 2.13.2",
211 "log",
212 "polling",
213 "rustix 0.38.44",
214 "slab",
215 "thiserror 1.0.69",
216 ]
217
218 [[package]]
219 name = "calloop"
220 version = "0.14.5"
221 source = "registry+https://github.com/rust-lang/crates.io-index"
222 checksum = "43b32313e937c8721c9d17ee9bf60699a6402b4b7c2cb6ac1bee0ffcaa4b4e5e"
223 dependencies = [
224 "bitflags 2.13.2",
225 "polling",
226 "rustix 1.1.6",
227 "tracing",
228 ]
229
230 [[package]]
231 name = "calloop-wayland-source"
232 version = "0.3.0"
233 source = "registry+https://github.com/rust-lang/crates.io-index"
234 checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20"
235 dependencies = [
236 "calloop 0.13.0",
237 "rustix 0.38.44",
238 "wayland-backend",
239 "wayland-client",
240 ]
241
242 [[package]]
243 name = "calloop-wayland-source"
244 version = "0.4.1"
245 source = "registry+https://github.com/rust-lang/crates.io-index"
246 checksum = "138efcf0940a02ebf0cc8d1eff41a1682a46b431630f4c52450d6265876021fa"
247 dependencies = [
248 "calloop 0.14.5",
249 "rustix 1.1.6",
250 "wayland-backend",
251 "wayland-client",
252 ]
253
254 [[package]]
255 name = "cc"
256 version = "1.11.1"
257 source = "registry+https://github.com/rust-lang/crates.io-index"
258 checksum = "4ff2a8126fff0f8c839080d619675a585e61720bb12d2baceae45769fd66f155"
259 dependencies = [
260 "find-msvc-tools",
261 "jobserver",
262 "libc",
263 "shlex",
264 ]
265
266 [[package]]
267 name = "cfg-if"
268 version = "1.0.5"
269 source = "registry+https://github.com/rust-lang/crates.io-index"
270 checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600"
271
272 [[package]]
273 name = "cfg_aliases"
274 version = "0.1.1"
275 source = "registry+https://github.com/rust-lang/crates.io-index"
276 checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e"
277
278 [[package]]
279 name = "cfg_aliases"
280 version = "0.2.2"
281 source = "registry+https://github.com/rust-lang/crates.io-index"
282 checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527"
283
284 [[package]]
285 name = "cgl"
286 version = "0.3.2"
287 source = "registry+https://github.com/rust-lang/crates.io-index"
288 checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff"
289 dependencies = [
290 "libc",
291 ]
292
293 [[package]]
294 name = "clipboard-win"
295 version = "5.4.3"
296 source = "registry+https://github.com/rust-lang/crates.io-index"
297 checksum = "052af7878466feccda12ba7a6a67d019d712f296809559b47c12c8cc196d3a9a"
298 dependencies = [
299 "error-code",
300 ]
301
302 [[package]]
303 name = "codespan-reporting"
304 version = "0.11.1"
305 source = "registry+https://github.com/rust-lang/crates.io-index"
306 checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e"
307 dependencies = [
308 "termcolor",
309 "unicode-width",
310 ]
311
312 [[package]]
313 name = "com"
314 version = "0.6.0"
315 source = "registry+https://github.com/rust-lang/crates.io-index"
316 checksum = "7e17887fd17353b65b1b2ef1c526c83e26cd72e74f598a8dc1bee13a48f3d9f6"
317 dependencies = [
318 "com_macros",
319 ]
320
321 [[package]]
322 name = "com_macros"
323 version = "0.6.0"
324 source = "registry+https://github.com/rust-lang/crates.io-index"
325 checksum = "d375883580a668c7481ea6631fc1a8863e33cc335bf56bfad8d7e6d4b04b13a5"
326 dependencies = [
327 "com_macros_support",
328 "proc-macro2",
329 "syn 1.0.109",
330 ]
331
332 [[package]]
333 name = "com_macros_support"
334 version = "0.6.0"
335 source = "registry+https://github.com/rust-lang/crates.io-index"
336 checksum = "ad899a1087a9296d5644792d7cb72b8e34c1bec8e7d4fbc002230169a6e8710c"
337 dependencies = [
338 "proc-macro2",
339 "quote",
340 "syn 1.0.109",
341 ]
342
343 [[package]]
344 name = "combine"
345 version = "4.6.9"
346 source = "registry+https://github.com/rust-lang/crates.io-index"
347 checksum = "4356eba6976435498d05a311ee9fc486da3bc81c200d3f0d7dd9703b41913f92"
348 dependencies = [
349 "bytes",
350 "memchr",
351 ]
352
353 [[package]]
354 name = "concurrent-queue"
355 version = "2.5.0"
356 source = "registry+https://github.com/rust-lang/crates.io-index"
357 checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973"
358 dependencies = [
359 "crossbeam-utils",
360 ]
361
362 [[package]]
363 name = "core-foundation"
364 version = "0.9.4"
365 source = "registry+https://github.com/rust-lang/crates.io-index"
366 checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
367 dependencies = [
368 "core-foundation-sys",
369 "libc",
370 ]
371
372 [[package]]
373 name = "core-foundation-sys"
374 version = "0.8.7"
375 source = "registry+https://github.com/rust-lang/crates.io-index"
376 checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
377
378 [[package]]
379 name = "core-graphics"
380 version = "0.23.2"
381 source = "registry+https://github.com/rust-lang/crates.io-index"
382 checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081"
383 dependencies = [
384 "bitflags 1.3.2",
385 "core-foundation",
386 "core-graphics-types",
387 "foreign-types",
388 "libc",
389 ]
390
391 [[package]]
392 name = "core-graphics-types"
393 version = "0.1.3"
394 source = "registry+https://github.com/rust-lang/crates.io-index"
395 checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf"
396 dependencies = [
397 "bitflags 1.3.2",
398 "core-foundation",
399 "libc",
400 ]
401
402 [[package]]
403 name = "crc32fast"
404 version = "1.5.4"
405 source = "registry+https://github.com/rust-lang/crates.io-index"
406 checksum = "5f97d3416d5337d15c4b0d78c8c91df922ca143f57ec20e2d1c188333047ef04"
407 dependencies = [
408 "cfg-if",
409 ]
410
411 [[package]]
412 name = "crossbeam-utils"
413 version = "0.8.23"
414 source = "registry+https://github.com/rust-lang/crates.io-index"
415 checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6"
416
417 [[package]]
418 name = "cursor-icon"
419 version = "1.2.0"
420 source = "registry+https://github.com/rust-lang/crates.io-index"
421 checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f"
422
423 [[package]]
424 name = "dispatch"
425 version = "0.2.0"
426 source = "registry+https://github.com/rust-lang/crates.io-index"
427 checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b"
428
429 [[package]]
430 name = "dispatch2"
431 version = "0.3.1"
432 source = "registry+https://github.com/rust-lang/crates.io-index"
433 checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38"
434 dependencies = [
435 "bitflags 2.13.2",
436 "objc2 0.6.5",
437 ]
438
439 [[package]]
440 name = "displaydoc"
441 version = "0.2.7"
442 source = "registry+https://github.com/rust-lang/crates.io-index"
443 checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8"
444 dependencies = [
445 "proc-macro2",
446 "quote",
447 "syn 3.0.9",
448 ]
449
450 [[package]]
451 name = "dlib"
452 version = "0.5.3"
453 source = "registry+https://github.com/rust-lang/crates.io-index"
454 checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a"
455 dependencies = [
456 "libloading",
457 ]
458
459 [[package]]
460 name = "document-features"
461 version = "0.2.12"
462 source = "registry+https://github.com/rust-lang/crates.io-index"
463 checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61"
464 dependencies = [
465 "litrs",
466 ]
467
468 [[package]]
469 name = "downcast-rs"
470 version = "1.2.1"
471 source = "registry+https://github.com/rust-lang/crates.io-index"
472 checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2"
473
474 [[package]]
475 name = "dpi"
476 version = "0.1.2"
477 source = "registry+https://github.com/rust-lang/crates.io-index"
478 checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76"
479
480 [[package]]
481 name = "ecolor"
482 version = "0.29.1"
483 source = "registry+https://github.com/rust-lang/crates.io-index"
484 checksum = "775cfde491852059e386c4e1deb4aef381c617dc364184c6f6afee99b87c402b"
485 dependencies = [
486 "bytemuck",
487 "emath",
488 ]
489
490 [[package]]
491 name = "eframe"
492 version = "0.29.1"
493 source = "registry+https://github.com/rust-lang/crates.io-index"
494 checksum = "8ac2645a9bf4826eb4e91488b1f17b8eaddeef09396706b2f14066461338e24f"
495 dependencies = [
496 "ahash",
497 "bytemuck",
498 "document-features",
499 "egui",
500 "egui-wgpu",
501 "egui-winit",
502 "egui_glow",
503 "glow 0.14.2",
504 "glutin",
505 "glutin-winit",
506 "image",
507 "js-sys",
508 "log",
509 "objc2 0.5.3",
510 "objc2-app-kit 0.2.2",
511 "objc2-foundation 0.2.2",
512 "parking_lot",
513 "percent-encoding",
514 "raw-window-handle",
515 "static_assertions",
516 "wasm-bindgen",
517 "wasm-bindgen-futures",
518 "web-sys",
519 "web-time",
520 "winapi",
521 "windows-sys 0.52.0",
522 "winit",
523 ]
524
525 [[package]]
526 name = "egui"
527 version = "0.29.1"
528 source = "registry+https://github.com/rust-lang/crates.io-index"
529 checksum = "53eafabcce0cb2325a59a98736efe0bf060585b437763f8c476957fb274bb974"
530 dependencies = [
531 "ahash",
532 "emath",
533 "epaint",
534 "log",
535 "nohash-hasher",
536 ]
537
538 [[package]]
539 name = "egui-wgpu"
540 version = "0.29.1"
541 source = "registry+https://github.com/rust-lang/crates.io-index"
542 checksum = "d00fd5d06d8405397e64a928fa0ef3934b3c30273ea7603e3dc4627b1f7a1a82"
543 dependencies = [
544 "ahash",
545 "bytemuck",
546 "document-features",
547 "egui",
548 "epaint",
549 "log",
550 "thiserror 1.0.69",
551 "type-map",
552 "web-time",
553 "wgpu",
554 "winit",
555 ]
556
557 [[package]]
558 name = "egui-winit"
559 version = "0.29.1"
560 source = "registry+https://github.com/rust-lang/crates.io-index"
561 checksum = "0a9c430f4f816340e8e8c1b20eec274186b1be6bc4c7dfc467ed50d57abc36c6"
562 dependencies = [
563 "ahash",
564 "arboard",
565 "egui",
566 "log",
567 "raw-window-handle",
568 "smithay-clipboard",
569 "web-time",
570 "webbrowser",
571 "winit",
572 ]
573
574 [[package]]
575 name = "egui_glow"
576 version = "0.29.1"
577 source = "registry+https://github.com/rust-lang/crates.io-index"
578 checksum = "0e39bccc683cd43adab530d8f21a13eb91e80de10bcc38c3f1c16601b6f62b26"
579 dependencies = [
580 "ahash",
581 "bytemuck",
582 "egui",
583 "glow 0.14.2",
584 "log",
585 "memoffset",
586 "wasm-bindgen",
587 "web-sys",
588 "winit",
589 ]
590
591 [[package]]
592 name = "emath"
593 version = "0.29.1"
594 source = "registry+https://github.com/rust-lang/crates.io-index"
595 checksum = "b1fe0049ce51d0fb414d029e668dd72eb30bc2b739bf34296ed97bd33df544f3"
596 dependencies = [
597 "bytemuck",
598 ]
599
600 [[package]]
601 name = "epaint"
602 version = "0.29.1"
603 source = "registry+https://github.com/rust-lang/crates.io-index"
604 checksum = "a32af8da821bd4f43f2c137e295459ee2e1661d87ca8779dfa0eaf45d870e20f"
605 dependencies = [
606 "ab_glyph",
607 "ahash",
608 "bytemuck",
609 "ecolor",
610 "emath",
611 "epaint_default_fonts",
612 "log",
613 "nohash-hasher",
614 "parking_lot",
615 ]
616
617 [[package]]
618 name = "epaint_default_fonts"
619 version = "0.29.1"
620 source = "registry+https://github.com/rust-lang/crates.io-index"
621 checksum = "483440db0b7993cf77a20314f08311dbe95675092405518c0677aa08c151a3ea"
622
623 [[package]]
624 name = "equivalent"
625 version = "1.0.3"
626 source = "registry+https://github.com/rust-lang/crates.io-index"
627 checksum = "00d174d5400e5e8fd687ad1049e2f578285fa914201b1af7e8b112a4546bd826"
628
629 [[package]]
630 name = "errno"
631 version = "0.3.14"
632 source = "registry+https://github.com/rust-lang/crates.io-index"
633 checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
634 dependencies = [
635 "libc",
636 "windows-sys 0.61.2",
637 ]
638
639 [[package]]
640 name = "error-code"
641 version = "3.4.0"
642 source = "registry+https://github.com/rust-lang/crates.io-index"
643 checksum = "0b5343afd4a8365a643ac588dab4cf234a190c7f6c88c9f6dd6ffe00837661b7"
644
645 [[package]]
646 name = "fdeflate"
647 version = "0.3.7"
648 source = "registry+https://github.com/rust-lang/crates.io-index"
649 checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c"
650 dependencies = [
651 "simd-adler32",
652 ]
653
654 [[package]]
655 name = "find-msvc-tools"
656 version = "0.1.15"
657 source = "registry+https://github.com/rust-lang/crates.io-index"
658 checksum = "1c66915cc5391097de7a2b0b972e8505aa33c0df401fd3a6811dbdb32881ba48"
659
660 [[package]]
661 name = "flate2"
662 version = "1.1.11"
663 source = "registry+https://github.com/rust-lang/crates.io-index"
664 checksum = "626d4928326b646e70f65ed36fc7cf9f206bdb68a0019ee7c6b4709da4e084c4"
665 dependencies = [
666 "crc32fast",
667 "miniz_oxide 0.9.1",
668 "zlib-rs",
669 ]
670
671 [[package]]
672 name = "foldhash"
673 version = "0.1.5"
674 source = "registry+https://github.com/rust-lang/crates.io-index"
675 checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
676
677 [[package]]
678 name = "foreign-types"
679 version = "0.5.0"
680 source = "registry+https://github.com/rust-lang/crates.io-index"
681 checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965"
682 dependencies = [
683 "foreign-types-macros",
684 "foreign-types-shared",
685 ]
686
687 [[package]]
688 name = "foreign-types-macros"
689 version = "0.2.4"
690 source = "registry+https://github.com/rust-lang/crates.io-index"
691 checksum = "ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225"
692 dependencies = [
693 "proc-macro2",
694 "quote",
695 "syn 3.0.9",
696 ]
697
698 [[package]]
699 name = "foreign-types-shared"
700 version = "0.3.1"
701 source = "registry+https://github.com/rust-lang/crates.io-index"
702 checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b"
703
704 [[package]]
705 name = "form_urlencoded"
706 version = "1.2.2"
707 source = "registry+https://github.com/rust-lang/crates.io-index"
708 checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
709 dependencies = [
710 "percent-encoding",
711 ]
712
713 [[package]]
714 name = "futures-core"
715 version = "0.3.34"
716 source = "registry+https://github.com/rust-lang/crates.io-index"
717 checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e"
718
719 [[package]]
720 name = "futures-task"
721 version = "0.3.34"
722 source = "registry+https://github.com/rust-lang/crates.io-index"
723 checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd"
724
725 [[package]]
726 name = "futures-util"
727 version = "0.3.34"
728 source = "registry+https://github.com/rust-lang/crates.io-index"
729 checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc"
730 dependencies = [
731 "futures-core",
732 "futures-task",
733 "pin-project-lite",
734 "slab",
735 ]
736
737 [[package]]
738 name = "gethostname"
739 version = "1.1.0"
740 source = "registry+https://github.com/rust-lang/crates.io-index"
741 checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8"
742 dependencies = [
743 "rustix 1.1.6",
744 "windows-link",
745 ]
746
747 [[package]]
748 name = "getrandom"
749 version = "0.3.4"
750 source = "registry+https://github.com/rust-lang/crates.io-index"
751 checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
752 dependencies = [
753 "cfg-if",
754 "libc",
755 "r-efi 5.3.0",
756 "wasip2",
757 ]
758
759 [[package]]
760 name = "getrandom"
761 version = "0.4.3"
762 source = "registry+https://github.com/rust-lang/crates.io-index"
763 checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099"
764 dependencies = [
765 "cfg-if",
766 "libc",
767 "r-efi 6.0.0",
768 ]
769
770 [[package]]
771 name = "gl_generator"
772 version = "0.14.0"
773 source = "registry+https://github.com/rust-lang/crates.io-index"
774 checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d"
775 dependencies = [
776 "khronos_api",
777 "log",
778 "xml-rs",
779 ]
780
781 [[package]]
782 name = "glow"
783 version = "0.13.1"
784 source = "registry+https://github.com/rust-lang/crates.io-index"
785 checksum = "bd348e04c43b32574f2de31c8bb397d96c9fcfa1371bd4ca6d8bdc464ab121b1"
786 dependencies = [
787 "js-sys",
788 "slotmap",
789 "wasm-bindgen",
790 "web-sys",
791 ]
792
793 [[package]]
794 name = "glow"
795 version = "0.14.2"
796 source = "registry+https://github.com/rust-lang/crates.io-index"
797 checksum = "d51fa363f025f5c111e03f13eda21162faeacb6911fe8caa0c0349f9cf0c4483"
798 dependencies = [
799 "js-sys",
800 "slotmap",
801 "wasm-bindgen",
802 "web-sys",
803 ]
804
805 [[package]]
806 name = "glutin"
807 version = "0.32.3"
808 source = "registry+https://github.com/rust-lang/crates.io-index"
809 checksum = "12124de845cacfebedff80e877bb37b5b75c34c5a4c89e47e1cdd67fb6041325"
810 dependencies = [
811 "bitflags 2.13.2",
812 "cfg_aliases 0.2.2",
813 "cgl",
814 "dispatch2",
815 "glutin_egl_sys",
816 "glutin_glx_sys",
817 "glutin_wgl_sys",
818 "libloading",
819 "objc2 0.6.5",
820 "objc2-app-kit 0.3.2",
821 "objc2-core-foundation",
822 "objc2-foundation 0.3.2",
823 "once_cell",
824 "raw-window-handle",
825 "wayland-sys",
826 "windows-sys 0.52.0",
827 "x11-dl",
828 ]
829
830 [[package]]
831 name = "glutin-winit"
832 version = "0.5.0"
833 source = "registry+https://github.com/rust-lang/crates.io-index"
834 checksum = "85edca7075f8fc728f28cb8fbb111a96c3b89e930574369e3e9c27eb75d3788f"
835 dependencies = [
836 "cfg_aliases 0.2.2",
837 "glutin",
838 "raw-window-handle",
839 "winit",
840 ]
841
842 [[package]]
843 name = "glutin_egl_sys"
844 version = "0.7.1"
845 source = "registry+https://github.com/rust-lang/crates.io-index"
846 checksum = "4c4680ba6195f424febdc3ba46e7a42a0e58743f2edb115297b86d7f8ecc02d2"
847 dependencies = [
848 "gl_generator",
849 "windows-sys 0.52.0",
850 ]
851
852 [[package]]
853 name = "glutin_glx_sys"
854 version = "0.6.1"
855 source = "registry+https://github.com/rust-lang/crates.io-index"
856 checksum = "8a7bb2938045a88b612499fbcba375a77198e01306f52272e692f8c1f3751185"
857 dependencies = [
858 "gl_generator",
859 "x11-dl",
860 ]
861
862 [[package]]
863 name = "glutin_wgl_sys"
864 version = "0.6.1"
865 source = "registry+https://github.com/rust-lang/crates.io-index"
866 checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e"
867 dependencies = [
868 "gl_generator",
869 ]
870
871 [[package]]
872 name = "gpu-alloc"
873 version = "0.6.2"
874 source = "registry+https://github.com/rust-lang/crates.io-index"
875 checksum = "45cf04b2726f02df5508c6de726acdc90cdf97ac771a9a0ffd8ba10a6e696bf9"
876 dependencies = [
877 "bitflags 2.13.2",
878 "gpu-alloc-types",
879 ]
880
881 [[package]]
882 name = "gpu-alloc-types"
883 version = "0.3.1"
884 source = "registry+https://github.com/rust-lang/crates.io-index"
885 checksum = "b2bbed164dd10ed526c2e4fe3e721ca4a71c61730e5aafac6844b417b3227058"
886 dependencies = [
887 "bitflags 2.13.2",
888 ]
889
890 [[package]]
891 name = "gpu-allocator"
892 version = "0.26.0"
893 source = "registry+https://github.com/rust-lang/crates.io-index"
894 checksum = "fdd4240fc91d3433d5e5b0fc5b67672d771850dc19bbee03c1381e19322803d7"
895 dependencies = [
896 "log",
897 "presser",
898 "thiserror 1.0.69",
899 "winapi",
900 "windows",
901 ]
902
903 [[package]]
904 name = "gpu-descriptor"
905 version = "0.3.2"
906 source = "registry+https://github.com/rust-lang/crates.io-index"
907 checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca"
908 dependencies = [
909 "bitflags 2.13.2",
910 "gpu-descriptor-types",
911 "hashbrown 0.15.5",
912 ]
913
914 [[package]]
915 name = "gpu-descriptor-types"
916 version = "0.2.0"
917 source = "registry+https://github.com/rust-lang/crates.io-index"
918 checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91"
919 dependencies = [
920 "bitflags 2.13.2",
921 ]
922
923 [[package]]
924 name = "hashbrown"
925 version = "0.15.5"
926 source = "registry+https://github.com/rust-lang/crates.io-index"
927 checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
928 dependencies = [
929 "foldhash",
930 ]
931
932 [[package]]
933 name = "hashbrown"
934 version = "0.17.1"
935 source = "registry+https://github.com/rust-lang/crates.io-index"
936 checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a"
937
938 [[package]]
939 name = "hassle-rs"
940 version = "0.11.0"
941 source = "registry+https://github.com/rust-lang/crates.io-index"
942 checksum = "af2a7e73e1f34c48da31fb668a907f250794837e08faa144fd24f0b8b741e890"
943 dependencies = [
944 "bitflags 2.13.2",
945 "com",
946 "libc",
947 "libloading",
948 "thiserror 1.0.69",
949 "widestring",
950 "winapi",
951 ]
952
953 [[package]]
954 name = "hermit-abi"
955 version = "0.5.3"
956 source = "registry+https://github.com/rust-lang/crates.io-index"
957 checksum = "e17592d60ebacc7d5e169f4663c5f84f9161cc90328abcfe8456f41e4dfcb284"
958
959 [[package]]
960 name = "hexf-parse"
961 version = "0.2.1"
962 source = "registry+https://github.com/rust-lang/crates.io-index"
963 checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df"
964
965 [[package]]
966 name = "icu_collections"
967 version = "2.4.0"
968 source = "registry+https://github.com/rust-lang/crates.io-index"
969 checksum = "fe090a42a0d3140fed8c63263ed1fecc02422cb2f4bfe55cd8de2de1b8e105dd"
970 dependencies = [
971 "displaydoc",
972 "potential_utf",
973 "utf8_iter",
974 "yoke",
975 "zerofrom",
976 "zerovec",
977 ]
978
979 [[package]]
980 name = "icu_locale_core"
981 version = "2.4.0"
982 source = "registry+https://github.com/rust-lang/crates.io-index"
983 checksum = "25d29b57c17c6528d0dc4c2141cfa2d08200465acb537a3909c8b9b8a4a984c0"
984 dependencies = [
985 "displaydoc",
986 "litemap",
987 "tinystr",
988 "writeable",
989 "zerovec",
990 ]
991
992 [[package]]
993 name = "icu_normalizer"
994 version = "2.4.0"
995 source = "registry+https://github.com/rust-lang/crates.io-index"
996 checksum = "404a3b8c486f205c87fe7f23ab6894d84a4ad76d6e4671ae1981ba7def87c599"
997 dependencies = [
998 "icu_collections",
999 "icu_normalizer_data",
1000 "icu_properties",
1001 "icu_provider",
1002 "smallvec",
1003 "zerovec",
1004 ]
1005
1006 [[package]]
1007 name = "icu_normalizer_data"
1008 version = "2.4.0"
1009 source = "registry+https://github.com/rust-lang/crates.io-index"
1010 checksum = "20f0088bfb7441f7a37fa0c9e20cb1e9cba1cac6b9ce8cd2a6dc44294f8e8cbc"
1011
1012 [[package]]
1013 name = "icu_properties"
1014 version = "2.4.0"
1015 source = "registry+https://github.com/rust-lang/crates.io-index"
1016 checksum = "2ea83d991c56158f7cf898bf86436c1dfe7c07ee82fe88951f2695c9f37a379f"
1017 dependencies = [
1018 "displaydoc",
1019 "icu_collections",
1020 "icu_locale_core",
1021 "icu_properties_data",
1022 "icu_provider",
1023 "zerotrie",
1024 "zerovec",
1025 ]
1026
1027 [[package]]
1028 name = "icu_properties_data"
1029 version = "2.4.0"
1030 source = "registry+https://github.com/rust-lang/crates.io-index"
1031 checksum = "b98f29af82d02b163fe50161388350e743bb3107cc8e8c2f7314cb505faddfcf"
1032
1033 [[package]]
1034 name = "icu_provider"
1035 version = "2.4.0"
1036 source = "registry+https://github.com/rust-lang/crates.io-index"
1037 checksum = "413099315636c588ee8f011190b329b971a09a8fae9d157e01dcae8379468514"
1038 dependencies = [
1039 "displaydoc",
1040 "icu_locale_core",
1041 "writeable",
1042 "yoke",
1043 "zerofrom",
1044 "zerotrie",
1045 "zerovec",
1046 ]
1047
1048 [[package]]
1049 name = "idna"
1050 version = "1.1.0"
1051 source = "registry+https://github.com/rust-lang/crates.io-index"
1052 checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
1053 dependencies = [
1054 "idna_adapter",
1055 "smallvec",
1056 "utf8_iter",
1057 ]
1058
1059 [[package]]
1060 name = "idna_adapter"
1061 version = "1.2.2"
1062 source = "registry+https://github.com/rust-lang/crates.io-index"
1063 checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714"
1064 dependencies = [
1065 "icu_normalizer",
1066 "icu_properties",
1067 ]
1068
1069 [[package]]
1070 name = "image"
1071 version = "0.25.10"
1072 source = "registry+https://github.com/rust-lang/crates.io-index"
1073 checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104"
1074 dependencies = [
1075 "bytemuck",
1076 "byteorder-lite",
1077 "moxcms",
1078 "num-traits",
1079 "png",
1080 ]
1081
1082 [[package]]
1083 name = "indexmap"
1084 version = "2.14.2"
1085 source = "registry+https://github.com/rust-lang/crates.io-index"
1086 checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855"
1087 dependencies = [
1088 "equivalent",
1089 "hashbrown 0.17.1",
1090 ]
1091
1092 [[package]]
1093 name = "jni"
1094 version = "0.22.4"
1095 source = "registry+https://github.com/rust-lang/crates.io-index"
1096 checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498"
1097 dependencies = [
1098 "cfg-if",
1099 "combine",
1100 "jni-macros",
1101 "jni-sys 0.4.1",
1102 "log",
1103 "simd_cesu8",
1104 "thiserror 2.0.21",
1105 "walkdir",
1106 "windows-link",
1107 ]
1108
1109 [[package]]
1110 name = "jni-macros"
1111 version = "0.22.4"
1112 source = "registry+https://github.com/rust-lang/crates.io-index"
1113 checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3"
1114 dependencies = [
1115 "proc-macro2",
1116 "quote",
1117 "rustc_version",
1118 "simd_cesu8",
1119 "syn 2.0.119",
1120 ]
1121
1122 [[package]]
1123 name = "jni-sys"
1124 version = "0.3.1"
1125 source = "registry+https://github.com/rust-lang/crates.io-index"
1126 checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258"
1127 dependencies = [
1128 "jni-sys 0.4.1",
1129 ]
1130
1131 [[package]]
1132 name = "jni-sys"
1133 version = "0.4.1"
1134 source = "registry+https://github.com/rust-lang/crates.io-index"
1135 checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2"
1136 dependencies = [
1137 "jni-sys-macros",
1138 ]
1139
1140 [[package]]
1141 name = "jni-sys-macros"
1142 version = "0.4.1"
1143 source = "registry+https://github.com/rust-lang/crates.io-index"
1144 checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264"
1145 dependencies = [
1146 "quote",
1147 "syn 2.0.119",
1148 ]
1149
1150 [[package]]
1151 name = "jobserver"
1152 version = "0.1.35"
1153 source = "registry+https://github.com/rust-lang/crates.io-index"
1154 checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3"
1155 dependencies = [
1156 "getrandom 0.4.3",
1157 "libc",
1158 ]
1159
1160 [[package]]
1161 name = "js-sys"
1162 version = "0.3.107"
1163 source = "registry+https://github.com/rust-lang/crates.io-index"
1164 checksum = "8dc09d2154098bbf4ef54eab6b117a3c24cbbffe94046b16ee6d6d4510584d3a"
1165 dependencies = [
1166 "cfg-if",
1167 "futures-util",
1168 "wasm-bindgen",
1169 ]
1170
1171 [[package]]
1172 name = "khronos-egl"
1173 version = "6.0.0"
1174 source = "registry+https://github.com/rust-lang/crates.io-index"
1175 checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76"
1176 dependencies = [
1177 "libc",
1178 "libloading",
1179 "pkg-config",
1180 ]
1181
1182 [[package]]
1183 name = "khronos_api"
1184 version = "3.1.0"
1185 source = "registry+https://github.com/rust-lang/crates.io-index"
1186 checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc"
1187
1188 [[package]]
1189 name = "libc"
1190 version = "0.2.191"
1191 source = "registry+https://github.com/rust-lang/crates.io-index"
1192 checksum = "65cd87c9a6d60536580b316ad985726104730a5151c99845f2490428ef91240a"
1193
1194 [[package]]
1195 name = "libloading"
1196 version = "0.8.9"
1197 source = "registry+https://github.com/rust-lang/crates.io-index"
1198 checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55"
1199 dependencies = [
1200 "cfg-if",
1201 "windows-link",
1202 ]
1203
1204 [[package]]
1205 name = "libredox"
1206 version = "0.1.25"
1207 source = "registry+https://github.com/rust-lang/crates.io-index"
1208 checksum = "61ff90caf6077a803a240f62fdbe88645a890bbca49ef8174c3cb0404362171d"
1209 dependencies = [
1210 "bitflags 2.13.2",
1211 "libc",
1212 "plain",
1213 "redox_syscall 0.9.5",
1214 ]
1215
1216 [[package]]
1217 name = "linux-raw-sys"
1218 version = "0.4.15"
1219 source = "registry+https://github.com/rust-lang/crates.io-index"
1220 checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
1221
1222 [[package]]
1223 name = "linux-raw-sys"
1224 version = "0.12.1"
1225 source = "registry+https://github.com/rust-lang/crates.io-index"
1226 checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53"
1227
1228 [[package]]
1229 name = "litemap"
1230 version = "0.8.3"
1231 source = "registry+https://github.com/rust-lang/crates.io-index"
1232 checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae"
1233
1234 [[package]]
1235 name = "litrs"
1236 version = "1.0.1"
1237 source = "registry+https://github.com/rust-lang/crates.io-index"
1238 checksum = "4744e383959f0db86ede514b809b1c53251889093803c05267acc7d4e7030d70"
1239
1240 [[package]]
1241 name = "lock_api"
1242 version = "0.4.14"
1243 source = "registry+https://github.com/rust-lang/crates.io-index"
1244 checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965"
1245 dependencies = [
1246 "scopeguard",
1247 ]
1248
1249 [[package]]
1250 name = "log"
1251 version = "0.4.35"
1252 source = "registry+https://github.com/rust-lang/crates.io-index"
1253 checksum = "5d15f86d12da44cd8d4ec3c73984537eb7f4cadcb9776a575a0a8a05ca11005c"
1254
1255 [[package]]
1256 name = "malloc_buf"
1257 version = "0.0.6"
1258 source = "registry+https://github.com/rust-lang/crates.io-index"
1259 checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb"
1260 dependencies = [
1261 "libc",
1262 ]
1263
1264 [[package]]
1265 name = "memchr"
1266 version = "2.8.3"
1267 source = "registry+https://github.com/rust-lang/crates.io-index"
1268 checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
1269
1270 [[package]]
1271 name = "memmap2"
1272 version = "0.9.12"
1273 source = "registry+https://github.com/rust-lang/crates.io-index"
1274 checksum = "6b0ca1155a9ecc25aa12e8313a119f32edf0255fea2f44839c4ac0a12b2ac157"
1275 dependencies = [
1276 "libc",
1277 ]
1278
1279 [[package]]
1280 name = "memoffset"
1281 version = "0.9.1"
1282 source = "registry+https://github.com/rust-lang/crates.io-index"
1283 checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
1284 dependencies = [
1285 "autocfg",
1286 ]
1287
1288 [[package]]
1289 name = "metal"
1290 version = "0.29.0"
1291 source = "registry+https://github.com/rust-lang/crates.io-index"
1292 checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21"
1293 dependencies = [
1294 "bitflags 2.13.2",
1295 "block",
1296 "core-graphics-types",
1297 "foreign-types",
1298 "log",
1299 "objc",
1300 "paste",
1301 ]
1302
1303 [[package]]
1304 name = "miniz_oxide"
1305 version = "0.8.9"
1306 source = "registry+https://github.com/rust-lang/crates.io-index"
1307 checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
1308 dependencies = [
1309 "adler2",
1310 "simd-adler32",
1311 ]
1312
1313 [[package]]
1314 name = "miniz_oxide"
1315 version = "0.9.1"
1316 source = "registry+https://github.com/rust-lang/crates.io-index"
1317 checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c"
1318 dependencies = [
1319 "adler2",
1320 "simd-adler32",
1321 ]
1322
1323 [[package]]
1324 name = "moxcms"
1325 version = "0.8.1"
1326 source = "registry+https://github.com/rust-lang/crates.io-index"
1327 checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b"
1328 dependencies = [
1329 "num-traits",
1330 "pxfm",
1331 ]
1332
1333 [[package]]
1334 name = "naga"
1335 version = "22.1.0"
1336 source = "registry+https://github.com/rust-lang/crates.io-index"
1337 checksum = "8bd5a652b6faf21496f2cfd88fc49989c8db0825d1f6746b1a71a6ede24a63ad"
1338 dependencies = [
1339 "arrayvec",
1340 "bit-set",
1341 "bitflags 2.13.2",
1342 "cfg_aliases 0.1.1",
1343 "codespan-reporting",
1344 "hexf-parse",
1345 "indexmap",
1346 "log",
1347 "rustc-hash 1.1.0",
1348 "spirv",
1349 "termcolor",
1350 "thiserror 1.0.69",
1351 "unicode-xid",
1352 ]
1353
1354 [[package]]
1355 name = "ndk"
1356 version = "0.9.0"
1357 source = "registry+https://github.com/rust-lang/crates.io-index"
1358 checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4"
1359 dependencies = [
1360 "bitflags 2.13.2",
1361 "jni-sys 0.3.1",
1362 "log",
1363 "ndk-sys 0.6.0+11769913",
1364 "num_enum",
1365 "raw-window-handle",
1366 "thiserror 1.0.69",
1367 ]
1368
1369 [[package]]
1370 name = "ndk-context"
1371 version = "0.1.1"
1372 source = "registry+https://github.com/rust-lang/crates.io-index"
1373 checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b"
1374
1375 [[package]]
1376 name = "ndk-sys"
1377 version = "0.5.0+25.2.9519653"
1378 source = "registry+https://github.com/rust-lang/crates.io-index"
1379 checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691"
1380 dependencies = [
1381 "jni-sys 0.3.1",
1382 ]
1383
1384 [[package]]
1385 name = "ndk-sys"
1386 version = "0.6.0+11769913"
1387 source = "registry+https://github.com/rust-lang/crates.io-index"
1388 checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873"
1389 dependencies = [
1390 "jni-sys 0.3.1",
1391 ]
1392
1393 [[package]]
1394 name = "nohash-hasher"
1395 version = "0.2.0"
1396 source = "registry+https://github.com/rust-lang/crates.io-index"
1397 checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451"
1398
1399 [[package]]
1400 name = "num-traits"
1401 version = "0.2.19"
1402 source = "registry+https://github.com/rust-lang/crates.io-index"
1403 checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
1404 dependencies = [
1405 "autocfg",
1406 ]
1407
1408 [[package]]
1409 name = "num_enum"
1410 version = "0.7.6"
1411 source = "registry+https://github.com/rust-lang/crates.io-index"
1412 checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26"
1413 dependencies = [
1414 "num_enum_derive",
1415 "rustversion",
1416 ]
1417
1418 [[package]]
1419 name = "num_enum_derive"
1420 version = "0.7.6"
1421 source = "registry+https://github.com/rust-lang/crates.io-index"
1422 checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8"
1423 dependencies = [
1424 "proc-macro-crate",
1425 "proc-macro2",
1426 "quote",
1427 "syn 2.0.119",
1428 ]
1429
1430 [[package]]
1431 name = "objc"
1432 version = "0.2.7"
1433 source = "registry+https://github.com/rust-lang/crates.io-index"
1434 checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1"
1435 dependencies = [
1436 "malloc_buf",
1437 ]
1438
1439 [[package]]
1440 name = "objc-sys"
1441 version = "0.3.5"
1442 source = "registry+https://github.com/rust-lang/crates.io-index"
1443 checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310"
1444
1445 [[package]]
1446 name = "objc2"
1447 version = "0.5.3"
1448 source = "registry+https://github.com/rust-lang/crates.io-index"
1449 checksum = "19d5490aaf8f1d7cf7688dfa9b0ce07900e168852c45cd2c03f534dfd27cfd0b"
1450 dependencies = [
1451 "objc-sys",
1452 "objc2-encode",
1453 ]
1454
1455 [[package]]
1456 name = "objc2"
1457 version = "0.6.5"
1458 source = "registry+https://github.com/rust-lang/crates.io-index"
1459 checksum = "08849bbd4767dfae9457696856ae1c84fe4e0281bbe4a7abff2d0e06fb7981f8"
1460 dependencies = [
1461 "objc2-encode",
1462 ]
1463
1464 [[package]]
1465 name = "objc2-app-kit"
1466 version = "0.2.2"
1467 source = "registry+https://github.com/rust-lang/crates.io-index"
1468 checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff"
1469 dependencies = [
1470 "bitflags 2.13.2",
1471 "block2",
1472 "libc",
1473 "objc2 0.5.3",
1474 "objc2-core-data",
1475 "objc2-core-image",
1476 "objc2-foundation 0.2.2",
1477 "objc2-quartz-core",
1478 ]
1479
1480 [[package]]
1481 name = "objc2-app-kit"
1482 version = "0.3.2"
1483 source = "registry+https://github.com/rust-lang/crates.io-index"
1484 checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c"
1485 dependencies = [
1486 "bitflags 2.13.2",
1487 "objc2 0.6.5",
1488 "objc2-core-foundation",
1489 "objc2-core-graphics",
1490 "objc2-foundation 0.3.2",
1491 ]
1492
1493 [[package]]
1494 name = "objc2-cloud-kit"
1495 version = "0.2.2"
1496 source = "registry+https://github.com/rust-lang/crates.io-index"
1497 checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009"
1498 dependencies = [
1499 "bitflags 2.13.2",
1500 "block2",
1501 "objc2 0.5.3",
1502 "objc2-core-location",
1503 "objc2-foundation 0.2.2",
1504 ]
1505
1506 [[package]]
1507 name = "objc2-contacts"
1508 version = "0.2.2"
1509 source = "registry+https://github.com/rust-lang/crates.io-index"
1510 checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889"
1511 dependencies = [
1512 "block2",
1513 "objc2 0.5.3",
1514 "objc2-foundation 0.2.2",
1515 ]
1516
1517 [[package]]
1518 name = "objc2-core-data"
1519 version = "0.2.2"
1520 source = "registry+https://github.com/rust-lang/crates.io-index"
1521 checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef"
1522 dependencies = [
1523 "bitflags 2.13.2",
1524 "block2",
1525 "objc2 0.5.3",
1526 "objc2-foundation 0.2.2",
1527 ]
1528
1529 [[package]]
1530 name = "objc2-core-foundation"
1531 version = "0.3.2"
1532 source = "registry+https://github.com/rust-lang/crates.io-index"
1533 checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536"
1534 dependencies = [
1535 "bitflags 2.13.2",
1536 "dispatch2",
1537 "objc2 0.6.5",
1538 ]
1539
1540 [[package]]
1541 name = "objc2-core-graphics"
1542 version = "0.3.2"
1543 source = "registry+https://github.com/rust-lang/crates.io-index"
1544 checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807"
1545 dependencies = [
1546 "bitflags 2.13.2",
1547 "dispatch2",
1548 "objc2 0.6.5",
1549 "objc2-core-foundation",
1550 "objc2-io-surface",
1551 ]
1552
1553 [[package]]
1554 name = "objc2-core-image"
1555 version = "0.2.2"
1556 source = "registry+https://github.com/rust-lang/crates.io-index"
1557 checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80"
1558 dependencies = [
1559 "block2",
1560 "objc2 0.5.3",
1561 "objc2-foundation 0.2.2",
1562 "objc2-metal",
1563 ]
1564
1565 [[package]]
1566 name = "objc2-core-location"
1567 version = "0.2.2"
1568 source = "registry+https://github.com/rust-lang/crates.io-index"
1569 checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781"
1570 dependencies = [
1571 "block2",
1572 "objc2 0.5.3",
1573 "objc2-contacts",
1574 "objc2-foundation 0.2.2",
1575 ]
1576
1577 [[package]]
1578 name = "objc2-encode"
1579 version = "4.1.0"
1580 source = "registry+https://github.com/rust-lang/crates.io-index"
1581 checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33"
1582
1583 [[package]]
1584 name = "objc2-foundation"
1585 version = "0.2.2"
1586 source = "registry+https://github.com/rust-lang/crates.io-index"
1587 checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8"
1588 dependencies = [
1589 "bitflags 2.13.2",
1590 "block2",
1591 "dispatch",
1592 "libc",
1593 "objc2 0.5.3",
1594 ]
1595
1596 [[package]]
1597 name = "objc2-foundation"
1598 version = "0.3.2"
1599 source = "registry+https://github.com/rust-lang/crates.io-index"
1600 checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272"
1601 dependencies = [
1602 "bitflags 2.13.2",
1603 "objc2 0.6.5",
1604 "objc2-core-foundation",
1605 ]
1606
1607 [[package]]
1608 name = "objc2-io-surface"
1609 version = "0.3.2"
1610 source = "registry+https://github.com/rust-lang/crates.io-index"
1611 checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d"
1612 dependencies = [
1613 "bitflags 2.13.2",
1614 "objc2 0.6.5",
1615 "objc2-core-foundation",
1616 ]
1617
1618 [[package]]
1619 name = "objc2-link-presentation"
1620 version = "0.2.2"
1621 source = "registry+https://github.com/rust-lang/crates.io-index"
1622 checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398"
1623 dependencies = [
1624 "block2",
1625 "objc2 0.5.3",
1626 "objc2-app-kit 0.2.2",
1627 "objc2-foundation 0.2.2",
1628 ]
1629
1630 [[package]]
1631 name = "objc2-metal"
1632 version = "0.2.2"
1633 source = "registry+https://github.com/rust-lang/crates.io-index"
1634 checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6"
1635 dependencies = [
1636 "bitflags 2.13.2",
1637 "block2",
1638 "objc2 0.5.3",
1639 "objc2-foundation 0.2.2",
1640 ]
1641
1642 [[package]]
1643 name = "objc2-quartz-core"
1644 version = "0.2.2"
1645 source = "registry+https://github.com/rust-lang/crates.io-index"
1646 checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a"
1647 dependencies = [
1648 "bitflags 2.13.2",
1649 "block2",
1650 "objc2 0.5.3",
1651 "objc2-foundation 0.2.2",
1652 "objc2-metal",
1653 ]
1654
1655 [[package]]
1656 name = "objc2-symbols"
1657 version = "0.2.2"
1658 source = "registry+https://github.com/rust-lang/crates.io-index"
1659 checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc"
1660 dependencies = [
1661 "objc2 0.5.3",
1662 "objc2-foundation 0.2.2",
1663 ]
1664
1665 [[package]]
1666 name = "objc2-ui-kit"
1667 version = "0.2.2"
1668 source = "registry+https://github.com/rust-lang/crates.io-index"
1669 checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f"
1670 dependencies = [
1671 "bitflags 2.13.2",
1672 "block2",
1673 "objc2 0.5.3",
1674 "objc2-cloud-kit",
1675 "objc2-core-data",
1676 "objc2-core-image",
1677 "objc2-core-location",
1678 "objc2-foundation 0.2.2",
1679 "objc2-link-presentation",
1680 "objc2-quartz-core",
1681 "objc2-symbols",
1682 "objc2-uniform-type-identifiers",
1683 "objc2-user-notifications",
1684 ]
1685
1686 [[package]]
1687 name = "objc2-uniform-type-identifiers"
1688 version = "0.2.2"
1689 source = "registry+https://github.com/rust-lang/crates.io-index"
1690 checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe"
1691 dependencies = [
1692 "block2",
1693 "objc2 0.5.3",
1694 "objc2-foundation 0.2.2",
1695 ]
1696
1697 [[package]]
1698 name = "objc2-user-notifications"
1699 version = "0.2.2"
1700 source = "registry+https://github.com/rust-lang/crates.io-index"
1701 checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3"
1702 dependencies = [
1703 "bitflags 2.13.2",
1704 "block2",
1705 "objc2 0.5.3",
1706 "objc2-core-location",
1707 "objc2-foundation 0.2.2",
1708 ]
1709
1710 [[package]]
1711 name = "once_cell"
1712 version = "1.21.4"
1713 source = "registry+https://github.com/rust-lang/crates.io-index"
1714 checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
1715
1716 [[package]]
1717 name = "orbclient"
1718 version = "0.3.55"
1719 source = "registry+https://github.com/rust-lang/crates.io-index"
1720 checksum = "5df339f526ea9a60e371768d50efc2f2508c7203290731565d1f7a6f71d21747"
1721 dependencies = [
1722 "libc",
1723 "libredox",
1724 ]
1725
1726 [[package]]
1727 name = "owned_ttf_parser"
1728 version = "0.25.1"
1729 source = "registry+https://github.com/rust-lang/crates.io-index"
1730 checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b"
1731 dependencies = [
1732 "ttf-parser",
1733 ]
1734
1735 [[package]]
1736 name = "paperdoll-renderer"
1737 version = "0.1.0"
1738 dependencies = [
1739 "eframe",
1740 "libloading",
1741 ]
1742
1743 [[package]]
1744 name = "parking_lot"
1745 version = "0.12.5"
1746 source = "registry+https://github.com/rust-lang/crates.io-index"
1747 checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a"
1748 dependencies = [
1749 "lock_api",
1750 "parking_lot_core",
1751 ]
1752
1753 [[package]]
1754 name = "parking_lot_core"
1755 version = "0.9.12"
1756 source = "registry+https://github.com/rust-lang/crates.io-index"
1757 checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
1758 dependencies = [
1759 "cfg-if",
1760 "libc",
1761 "redox_syscall 0.5.18",
1762 "smallvec",
1763 "windows-link",
1764 ]
1765
1766 [[package]]
1767 name = "paste"
1768 version = "1.0.15"
1769 source = "registry+https://github.com/rust-lang/crates.io-index"
1770 checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
1771
1772 [[package]]
1773 name = "percent-encoding"
1774 version = "2.3.2"
1775 source = "registry+https://github.com/rust-lang/crates.io-index"
1776 checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
1777
1778 [[package]]
1779 name = "pin-project"
1780 version = "1.1.13"
1781 source = "registry+https://github.com/rust-lang/crates.io-index"
1782 checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924"
1783 dependencies = [
1784 "pin-project-internal",
1785 ]
1786
1787 [[package]]
1788 name = "pin-project-internal"
1789 version = "1.1.13"
1790 source = "registry+https://github.com/rust-lang/crates.io-index"
1791 checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b"
1792 dependencies = [
1793 "proc-macro2",
1794 "quote",
1795 "syn 2.0.119",
1796 ]
1797
1798 [[package]]
1799 name = "pin-project-lite"
1800 version = "0.2.17"
1801 source = "registry+https://github.com/rust-lang/crates.io-index"
1802 checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
1803
1804 [[package]]
1805 name = "pkg-config"
1806 version = "0.3.34"
1807 source = "registry+https://github.com/rust-lang/crates.io-index"
1808 checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548"
1809
1810 [[package]]
1811 name = "plain"
1812 version = "0.2.3"
1813 source = "registry+https://github.com/rust-lang/crates.io-index"
1814 checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6"
1815
1816 [[package]]
1817 name = "png"
1818 version = "0.18.1"
1819 source = "registry+https://github.com/rust-lang/crates.io-index"
1820 checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61"
1821 dependencies = [
1822 "bitflags 2.13.2",
1823 "crc32fast",
1824 "fdeflate",
1825 "flate2",
1826 "miniz_oxide 0.8.9",
1827 ]
1828
1829 [[package]]
1830 name = "polling"
1831 version = "3.11.0"
1832 source = "registry+https://github.com/rust-lang/crates.io-index"
1833 checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218"
1834 dependencies = [
1835 "cfg-if",
1836 "concurrent-queue",
1837 "hermit-abi",
1838 "pin-project-lite",
1839 "rustix 1.1.6",
1840 "windows-sys 0.61.2",
1841 ]
1842
1843 [[package]]
1844 name = "potential_utf"
1845 version = "0.1.6"
1846 source = "registry+https://github.com/rust-lang/crates.io-index"
1847 checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661"
1848 dependencies = [
1849 "zerovec",
1850 ]
1851
1852 [[package]]
1853 name = "presser"
1854 version = "0.3.1"
1855 source = "registry+https://github.com/rust-lang/crates.io-index"
1856 checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa"
1857
1858 [[package]]
1859 name = "proc-macro-crate"
1860 version = "3.5.0"
1861 source = "registry+https://github.com/rust-lang/crates.io-index"
1862 checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f"
1863 dependencies = [
1864 "toml_edit",
1865 ]
1866
1867 [[package]]
1868 name = "proc-macro2"
1869 version = "1.0.107"
1870 source = "registry+https://github.com/rust-lang/crates.io-index"
1871 checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9"
1872 dependencies = [
1873 "unicode-ident",
1874 ]
1875
1876 [[package]]
1877 name = "profiling"
1878 version = "1.0.18"
1879 source = "registry+https://github.com/rust-lang/crates.io-index"
1880 checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5"
1881
1882 [[package]]
1883 name = "pxfm"
1884 version = "0.1.30"
1885 source = "registry+https://github.com/rust-lang/crates.io-index"
1886 checksum = "d55d956fa96f5ec02be2e13af0e20391a5aa83d6a074e3ad368959d0fab299ea"
1887
1888 [[package]]
1889 name = "quick-xml"
1890 version = "0.41.0"
1891 source = "registry+https://github.com/rust-lang/crates.io-index"
1892 checksum = "e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1"
1893 dependencies = [
1894 "memchr",
1895 ]
1896
1897 [[package]]
1898 name = "quote"
1899 version = "1.0.47"
1900 source = "registry+https://github.com/rust-lang/crates.io-index"
1901 checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001"
1902 dependencies = [
1903 "proc-macro2",
1904 ]
1905
1906 [[package]]
1907 name = "r-efi"
1908 version = "5.3.0"
1909 source = "registry+https://github.com/rust-lang/crates.io-index"
1910 checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
1911
1912 [[package]]
1913 name = "r-efi"
1914 version = "6.0.0"
1915 source = "registry+https://github.com/rust-lang/crates.io-index"
1916 checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
1917
1918 [[package]]
1919 name = "raw-window-handle"
1920 version = "0.6.2"
1921 source = "registry+https://github.com/rust-lang/crates.io-index"
1922 checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539"
1923
1924 [[package]]
1925 name = "redox_syscall"
1926 version = "0.4.1"
1927 source = "registry+https://github.com/rust-lang/crates.io-index"
1928 checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
1929 dependencies = [
1930 "bitflags 1.3.2",
1931 ]
1932
1933 [[package]]
1934 name = "redox_syscall"
1935 version = "0.5.18"
1936 source = "registry+https://github.com/rust-lang/crates.io-index"
1937 checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"
1938 dependencies = [
1939 "bitflags 2.13.2",
1940 ]
1941
1942 [[package]]
1943 name = "redox_syscall"
1944 version = "0.9.5"
1945 source = "registry+https://github.com/rust-lang/crates.io-index"
1946 checksum = "580c875845b41ecb1564ad1ae4703044cef774145e3d7a94dc2b3fa7c97868fd"
1947 dependencies = [
1948 "bitflags 2.13.2",
1949 ]
1950
1951 [[package]]
1952 name = "renderdoc-sys"
1953 version = "1.1.0"
1954 source = "registry+https://github.com/rust-lang/crates.io-index"
1955 checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832"
1956
1957 [[package]]
1958 name = "rustc-hash"
1959 version = "1.1.0"
1960 source = "registry+https://github.com/rust-lang/crates.io-index"
1961 checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
1962
1963 [[package]]
1964 name = "rustc-hash"
1965 version = "2.1.3"
1966 source = "registry+https://github.com/rust-lang/crates.io-index"
1967 checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d"
1968
1969 [[package]]
1970 name = "rustc_version"
1971 version = "0.4.1"
1972 source = "registry+https://github.com/rust-lang/crates.io-index"
1973 checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
1974 dependencies = [
1975 "semver",
1976 ]
1977
1978 [[package]]
1979 name = "rustix"
1980 version = "0.38.44"
1981 source = "registry+https://github.com/rust-lang/crates.io-index"
1982 checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
1983 dependencies = [
1984 "bitflags 2.13.2",
1985 "errno",
1986 "libc",
1987 "linux-raw-sys 0.4.15",
1988 "windows-sys 0.59.0",
1989 ]
1990
1991 [[package]]
1992 name = "rustix"
1993 version = "1.1.6"
1994 source = "registry+https://github.com/rust-lang/crates.io-index"
1995 checksum = "e5e76742e5294153d4dde1207dbec5bdd81eef6fabdc0d2118babadabfd858aa"
1996 dependencies = [
1997 "bitflags 2.13.2",
1998 "errno",
1999 "libc",
2000 "linux-raw-sys 0.12.1",
2001 "windows-sys 0.61.2",
2002 ]
2003
2004 [[package]]
2005 name = "rustversion"
2006 version = "1.0.23"
2007 source = "registry+https://github.com/rust-lang/crates.io-index"
2008 checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f"
2009
2010 [[package]]
2011 name = "same-file"
2012 version = "1.0.6"
2013 source = "registry+https://github.com/rust-lang/crates.io-index"
2014 checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
2015 dependencies = [
2016 "winapi-util",
2017 ]
2018
2019 [[package]]
2020 name = "scoped-tls"
2021 version = "1.0.1"
2022 source = "registry+https://github.com/rust-lang/crates.io-index"
2023 checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
2024
2025 [[package]]
2026 name = "scopeguard"
2027 version = "1.2.0"
2028 source = "registry+https://github.com/rust-lang/crates.io-index"
2029 checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
2030
2031 [[package]]
2032 name = "semver"
2033 version = "1.0.28"
2034 source = "registry+https://github.com/rust-lang/crates.io-index"
2035 checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd"
2036
2037 [[package]]
2038 name = "serde"
2039 version = "1.0.229"
2040 source = "registry+https://github.com/rust-lang/crates.io-index"
2041 checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba"
2042 dependencies = [
2043 "serde_core",
2044 ]
2045
2046 [[package]]
2047 name = "serde_core"
2048 version = "1.0.229"
2049 source = "registry+https://github.com/rust-lang/crates.io-index"
2050 checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48"
2051 dependencies = [
2052 "serde_derive",
2053 ]
2054
2055 [[package]]
2056 name = "serde_derive"
2057 version = "1.0.229"
2058 source = "registry+https://github.com/rust-lang/crates.io-index"
2059 checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348"
2060 dependencies = [
2061 "proc-macro2",
2062 "quote",
2063 "syn 3.0.9",
2064 ]
2065
2066 [[package]]
2067 name = "shlex"
2068 version = "2.0.1"
2069 source = "registry+https://github.com/rust-lang/crates.io-index"
2070 checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
2071
2072 [[package]]
2073 name = "simd-adler32"
2074 version = "0.3.10"
2075 source = "registry+https://github.com/rust-lang/crates.io-index"
2076 checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea"
2077
2078 [[package]]
2079 name = "simd_cesu8"
2080 version = "1.2.0"
2081 source = "registry+https://github.com/rust-lang/crates.io-index"
2082 checksum = "11031e251abf8611c80f460e19dbdeb54a66db918e49c65a7065b46ac7aec520"
2083 dependencies = [
2084 "rustc_version",
2085 "simdutf8",
2086 ]
2087
2088 [[package]]
2089 name = "simdutf8"
2090 version = "0.1.5"
2091 source = "registry+https://github.com/rust-lang/crates.io-index"
2092 checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e"
2093
2094 [[package]]
2095 name = "slab"
2096 version = "0.4.12"
2097 source = "registry+https://github.com/rust-lang/crates.io-index"
2098 checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
2099
2100 [[package]]
2101 name = "slotmap"
2102 version = "1.1.1"
2103 source = "registry+https://github.com/rust-lang/crates.io-index"
2104 checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038"
2105 dependencies = [
2106 "version_check",
2107 ]
2108
2109 [[package]]
2110 name = "smallvec"
2111 version = "1.16.4"
2112 source = "registry+https://github.com/rust-lang/crates.io-index"
2113 checksum = "d0d5d4b1981b8bbbb7aed204cae5726d683d5d6ac7e74ec54122ea28f315e7c8"
2114
2115 [[package]]
2116 name = "smithay-client-toolkit"
2117 version = "0.19.2"
2118 source = "registry+https://github.com/rust-lang/crates.io-index"
2119 checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016"
2120 dependencies = [
2121 "bitflags 2.13.2",
2122 "calloop 0.13.0",
2123 "calloop-wayland-source 0.3.0",
2124 "cursor-icon",
2125 "libc",
2126 "log",
2127 "memmap2",
2128 "rustix 0.38.44",
2129 "thiserror 1.0.69",
2130 "wayland-backend",
2131 "wayland-client",
2132 "wayland-csd-frame",
2133 "wayland-cursor",
2134 "wayland-protocols",
2135 "wayland-protocols-wlr",
2136 "wayland-scanner",
2137 "xkeysym",
2138 ]
2139
2140 [[package]]
2141 name = "smithay-client-toolkit"
2142 version = "0.20.0"
2143 source = "registry+https://github.com/rust-lang/crates.io-index"
2144 checksum = "0512da38f5e2b31201a93524adb8d3136276fa4fe4aafab4e1f727a82b534cc0"
2145 dependencies = [
2146 "bitflags 2.13.2",
2147 "calloop 0.14.5",
2148 "calloop-wayland-source 0.4.1",
2149 "cursor-icon",
2150 "libc",
2151 "log",
2152 "memmap2",
2153 "rustix 1.1.6",
2154 "thiserror 2.0.21",
2155 "wayland-backend",
2156 "wayland-client",
2157 "wayland-csd-frame",
2158 "wayland-cursor",
2159 "wayland-protocols",
2160 "wayland-protocols-experimental",
2161 "wayland-protocols-misc",
2162 "wayland-protocols-wlr",
2163 "wayland-scanner",
2164 "xkeysym",
2165 ]
2166
2167 [[package]]
2168 name = "smithay-clipboard"
2169 version = "0.7.3"
2170 source = "registry+https://github.com/rust-lang/crates.io-index"
2171 checksum = "71704c03f739f7745053bde45fa203a46c58d25bc5c4efba1d9a60e9dba81226"
2172 dependencies = [
2173 "libc",
2174 "smithay-client-toolkit 0.20.0",
2175 "wayland-backend",
2176 ]
2177
2178 [[package]]
2179 name = "smol_str"
2180 version = "0.2.2"
2181 source = "registry+https://github.com/rust-lang/crates.io-index"
2182 checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead"
2183 dependencies = [
2184 "serde",
2185 ]
2186
2187 [[package]]
2188 name = "spirv"
2189 version = "0.3.0+sdk-1.3.268.0"
2190 source = "registry+https://github.com/rust-lang/crates.io-index"
2191 checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844"
2192 dependencies = [
2193 "bitflags 2.13.2",
2194 ]
2195
2196 [[package]]
2197 name = "stable_deref_trait"
2198 version = "1.2.1"
2199 source = "registry+https://github.com/rust-lang/crates.io-index"
2200 checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
2201
2202 [[package]]
2203 name = "static_assertions"
2204 version = "1.1.0"
2205 source = "registry+https://github.com/rust-lang/crates.io-index"
2206 checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
2207
2208 [[package]]
2209 name = "syn"
2210 version = "1.0.109"
2211 source = "registry+https://github.com/rust-lang/crates.io-index"
2212 checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
2213 dependencies = [
2214 "proc-macro2",
2215 "quote",
2216 "unicode-ident",
2217 ]
2218
2219 [[package]]
2220 name = "syn"
2221 version = "2.0.119"
2222 source = "registry+https://github.com/rust-lang/crates.io-index"
2223 checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297"
2224 dependencies = [
2225 "proc-macro2",
2226 "quote",
2227 "unicode-ident",
2228 ]
2229
2230 [[package]]
2231 name = "syn"
2232 version = "3.0.9"
2233 source = "registry+https://github.com/rust-lang/crates.io-index"
2234 checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b"
2235 dependencies = [
2236 "proc-macro2",
2237 "quote",
2238 "unicode-ident",
2239 ]
2240
2241 [[package]]
2242 name = "synstructure"
2243 version = "0.14.0"
2244 source = "registry+https://github.com/rust-lang/crates.io-index"
2245 checksum = "901704edd0dfe137f1987838ee4f259e4e063c31371bdb423f7ae38ec6f77f02"
2246 dependencies = [
2247 "proc-macro2",
2248 "quote",
2249 "syn 3.0.9",
2250 ]
2251
2252 [[package]]
2253 name = "termcolor"
2254 version = "1.4.1"
2255 source = "registry+https://github.com/rust-lang/crates.io-index"
2256 checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755"
2257 dependencies = [
2258 "winapi-util",
2259 ]
2260
2261 [[package]]
2262 name = "thiserror"
2263 version = "1.0.69"
2264 source = "registry+https://github.com/rust-lang/crates.io-index"
2265 checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
2266 dependencies = [
2267 "thiserror-impl 1.0.69",
2268 ]
2269
2270 [[package]]
2271 name = "thiserror"
2272 version = "2.0.21"
2273 source = "registry+https://github.com/rust-lang/crates.io-index"
2274 checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e"
2275 dependencies = [
2276 "thiserror-impl 2.0.21",
2277 ]
2278
2279 [[package]]
2280 name = "thiserror-impl"
2281 version = "1.0.69"
2282 source = "registry+https://github.com/rust-lang/crates.io-index"
2283 checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
2284 dependencies = [
2285 "proc-macro2",
2286 "quote",
2287 "syn 2.0.119",
2288 ]
2289
2290 [[package]]
2291 name = "thiserror-impl"
2292 version = "2.0.21"
2293 source = "registry+https://github.com/rust-lang/crates.io-index"
2294 checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524"
2295 dependencies = [
2296 "proc-macro2",
2297 "quote",
2298 "syn 3.0.9",
2299 ]
2300
2301 [[package]]
2302 name = "tinystr"
2303 version = "0.8.5"
2304 source = "registry+https://github.com/rust-lang/crates.io-index"
2305 checksum = "abc840c238154d58f9e86b2792261edfde565a17696e1cda1a449de27979801a"
2306 dependencies = [
2307 "displaydoc",
2308 "zerovec",
2309 ]
2310
2311 [[package]]
2312 name = "tokio"
2313 version = "1.54.1"
2314 source = "registry+https://github.com/rust-lang/crates.io-index"
2315 checksum = "b52fd3255258d26fac7264ab5a76b53c13367136dc011d3d6ad4f8ed070396a3"
2316 dependencies = [
2317 "pin-project-lite",
2318 ]
2319
2320 [[package]]
2321 name = "toml_datetime"
2322 version = "1.1.3+spec-1.1.0"
2323 source = "registry+https://github.com/rust-lang/crates.io-index"
2324 checksum = "173f25c883cd2176a2d8212155638c0a60d484a9d84546d270866f40f56b6e49"
2325 dependencies = [
2326 "serde_core",
2327 ]
2328
2329 [[package]]
2330 name = "toml_edit"
2331 version = "0.25.19+spec-1.1.0"
2332 source = "registry+https://github.com/rust-lang/crates.io-index"
2333 checksum = "dd43688c4858d7264ae1cf9a9f874a67c3feb74a883b1cd7bebd6a4ea8307218"
2334 dependencies = [
2335 "indexmap",
2336 "toml_datetime",
2337 "toml_parser",
2338 "winnow",
2339 ]
2340
2341 [[package]]
2342 name = "toml_parser"
2343 version = "1.1.5+spec-1.1.0"
2344 source = "registry+https://github.com/rust-lang/crates.io-index"
2345 checksum = "baa693a8032d7e1cada7d0041e96126df243179ff061456783ac7f12bda4744c"
2346 dependencies = [
2347 "winnow",
2348 ]
2349
2350 [[package]]
2351 name = "tracing"
2352 version = "0.1.44"
2353 source = "registry+https://github.com/rust-lang/crates.io-index"
2354 checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
2355 dependencies = [
2356 "log",
2357 "pin-project-lite",
2358 "tracing-core",
2359 ]
2360
2361 [[package]]
2362 name = "tracing-core"
2363 version = "0.1.36"
2364 source = "registry+https://github.com/rust-lang/crates.io-index"
2365 checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"
2366
2367 [[package]]
2368 name = "ttf-parser"
2369 version = "0.25.1"
2370 source = "registry+https://github.com/rust-lang/crates.io-index"
2371 checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31"
2372
2373 [[package]]
2374 name = "type-map"
2375 version = "0.5.1"
2376 source = "registry+https://github.com/rust-lang/crates.io-index"
2377 checksum = "cb30dbbd9036155e74adad6812e9898d03ec374946234fbcebd5dfc7b9187b90"
2378 dependencies = [
2379 "rustc-hash 2.1.3",
2380 ]
2381
2382 [[package]]
2383 name = "unicode-ident"
2384 version = "1.0.27"
2385 source = "registry+https://github.com/rust-lang/crates.io-index"
2386 checksum = "a2c754d6c33795a1c324727428e5a7dedb5b06195f9890bdbcba760d3e246563"
2387
2388 [[package]]
2389 name = "unicode-segmentation"
2390 version = "1.13.3"
2391 source = "registry+https://github.com/rust-lang/crates.io-index"
2392 checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8"
2393
2394 [[package]]
2395 name = "unicode-width"
2396 version = "0.1.14"
2397 source = "registry+https://github.com/rust-lang/crates.io-index"
2398 checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af"
2399
2400 [[package]]
2401 name = "unicode-xid"
2402 version = "0.2.6"
2403 source = "registry+https://github.com/rust-lang/crates.io-index"
2404 checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
2405
2406 [[package]]
2407 name = "url"
2408 version = "2.5.8"
2409 source = "registry+https://github.com/rust-lang/crates.io-index"
2410 checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed"
2411 dependencies = [
2412 "form_urlencoded",
2413 "idna",
2414 "percent-encoding",
2415 "serde",
2416 ]
2417
2418 [[package]]
2419 name = "utf8_iter"
2420 version = "1.1.0"
2421 source = "registry+https://github.com/rust-lang/crates.io-index"
2422 checksum = "af3bd9d3e571c26fcce9d033b87ea5ab061b8d2ffe9b7a5675d810d68f03edf0"
2423 dependencies = [
2424 "utf_types",
2425 ]
2426
2427 [[package]]
2428 name = "utf_types"
2429 version = "1.0.0"
2430 source = "registry+https://github.com/rust-lang/crates.io-index"
2431 checksum = "3a3b425286980a367278453f3b6d28cdcb134b574e5a35824a6ff5eebad50bb6"
2432
2433 [[package]]
2434 name = "version_check"
2435 version = "0.9.5"
2436 source = "registry+https://github.com/rust-lang/crates.io-index"
2437 checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
2438
2439 [[package]]
2440 name = "walkdir"
2441 version = "2.5.0"
2442 source = "registry+https://github.com/rust-lang/crates.io-index"
2443 checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
2444 dependencies = [
2445 "same-file",
2446 "winapi-util",
2447 ]
2448
2449 [[package]]
2450 name = "wasip2"
2451 version = "1.0.4+wasi-0.2.12"
2452 source = "registry+https://github.com/rust-lang/crates.io-index"
2453 checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487"
2454 dependencies = [
2455 "wit-bindgen",
2456 ]
2457
2458 [[package]]
2459 name = "wasm-bindgen"
2460 version = "0.2.130"
2461 source = "registry+https://github.com/rust-lang/crates.io-index"
2462 checksum = "a0181c14ddd6c7b8b0b0132a5f1ea2f32be0d893cd3ea97b6e3b28886b8a3d1c"
2463 dependencies = [
2464 "cfg-if",
2465 "rustversion",
2466 "wasm-bindgen-macro",
2467 "wasm-bindgen-shared",
2468 ]
2469
2470 [[package]]
2471 name = "wasm-bindgen-futures"
2472 version = "0.4.80"
2473 source = "registry+https://github.com/rust-lang/crates.io-index"
2474 checksum = "5e14e0327cb5368ad60ccb22d04a9827a693c95a926d8d125e9fa39e0baec501"
2475 dependencies = [
2476 "js-sys",
2477 "tokio",
2478 "wasm-bindgen",
2479 ]
2480
2481 [[package]]
2482 name = "wasm-bindgen-macro"
2483 version = "0.2.130"
2484 source = "registry+https://github.com/rust-lang/crates.io-index"
2485 checksum = "6e931a02a39abdbf66966fc35902b5ed58344750a70885bed4ebb3d8eaf28ed9"
2486 dependencies = [
2487 "quote",
2488 "wasm-bindgen-macro-support",
2489 ]
2490
2491 [[package]]
2492 name = "wasm-bindgen-macro-support"
2493 version = "0.2.130"
2494 source = "registry+https://github.com/rust-lang/crates.io-index"
2495 checksum = "2ca4b54280e455bd831e33a6b8e734baf432fe63fbc35c42ac14ce67a043a53a"
2496 dependencies = [
2497 "bumpalo",
2498 "proc-macro2",
2499 "quote",
2500 "syn 3.0.9",
2501 "wasm-bindgen-shared",
2502 ]
2503
2504 [[package]]
2505 name = "wasm-bindgen-shared"
2506 version = "0.2.130"
2507 source = "registry+https://github.com/rust-lang/crates.io-index"
2508 checksum = "3b1f9c3798725016c6ee5f2f57869ec0831e8bbc0ab0310a86e787e97f41389e"
2509 dependencies = [
2510 "unicode-ident",
2511 ]
2512
2513 [[package]]
2514 name = "wayland-backend"
2515 version = "0.3.17"
2516 source = "registry+https://github.com/rust-lang/crates.io-index"
2517 checksum = "38a91b4eaddff87b1cd1074985e3713da4af2c49742d1b356b2c01670a67a078"
2518 dependencies = [
2519 "cc",
2520 "downcast-rs",
2521 "rustix 1.1.6",
2522 "scoped-tls",
2523 "smallvec",
2524 "wayland-sys",
2525 ]
2526
2527 [[package]]
2528 name = "wayland-client"
2529 version = "0.31.15"
2530 source = "registry+https://github.com/rust-lang/crates.io-index"
2531 checksum = "e3c36a0f861ad76d0901f2800b46321410d9f73f2ea88aac0650d86c32688073"
2532 dependencies = [
2533 "bitflags 2.13.2",
2534 "rustix 1.1.6",
2535 "wayland-backend",
2536 "wayland-scanner",
2537 ]
2538
2539 [[package]]
2540 name = "wayland-csd-frame"
2541 version = "0.3.0"
2542 source = "registry+https://github.com/rust-lang/crates.io-index"
2543 checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e"
2544 dependencies = [
2545 "bitflags 2.13.2",
2546 "cursor-icon",
2547 "wayland-backend",
2548 ]
2549
2550 [[package]]
2551 name = "wayland-cursor"
2552 version = "0.31.14"
2553 source = "registry+https://github.com/rust-lang/crates.io-index"
2554 checksum = "4a52d18780be9b1314328a3de5f930b73d2200112e3849ca6cb11822793fb34d"
2555 dependencies = [
2556 "rustix 1.1.6",
2557 "wayland-client",
2558 "xcursor",
2559 ]
2560
2561 [[package]]
2562 name = "wayland-protocols"
2563 version = "0.32.13"
2564 source = "registry+https://github.com/rust-lang/crates.io-index"
2565 checksum = "23d0c813de3daa2ed6520af85a3bd49b0e722a3078506899aa9686fea58dc4b6"
2566 dependencies = [
2567 "bitflags 2.13.2",
2568 "wayland-backend",
2569 "wayland-client",
2570 "wayland-scanner",
2571 ]
2572
2573 [[package]]
2574 name = "wayland-protocols-experimental"
2575 version = "20250721.0.1"
2576 source = "registry+https://github.com/rust-lang/crates.io-index"
2577 checksum = "40a1f863128dcaaec790d7b4b396cc9b9a7a079e878e18c47e6c2d2c5a8dcbb1"
2578 dependencies = [
2579 "bitflags 2.13.2",
2580 "wayland-backend",
2581 "wayland-client",
2582 "wayland-protocols",
2583 "wayland-scanner",
2584 ]
2585
2586 [[package]]
2587 name = "wayland-protocols-misc"
2588 version = "0.3.12"
2589 source = "registry+https://github.com/rust-lang/crates.io-index"
2590 checksum = "6e9567599ef23e09b8dad6e429e5738d4509dfc46b3b21f32841a304d16b29c8"
2591 dependencies = [
2592 "bitflags 2.13.2",
2593 "wayland-backend",
2594 "wayland-client",
2595 "wayland-protocols",
2596 "wayland-scanner",
2597 ]
2598
2599 [[package]]
2600 name = "wayland-protocols-plasma"
2601 version = "0.3.12"
2602 source = "registry+https://github.com/rust-lang/crates.io-index"
2603 checksum = "2b6d8cf1eb2c1c31ed1f5643c88a6e53538129d4af80030c8cabd1f9fa884d91"
2604 dependencies = [
2605 "bitflags 2.13.2",
2606 "wayland-backend",
2607 "wayland-client",
2608 "wayland-protocols",
2609 "wayland-scanner",
2610 ]
2611
2612 [[package]]
2613 name = "wayland-protocols-wlr"
2614 version = "0.3.12"
2615 source = "registry+https://github.com/rust-lang/crates.io-index"
2616 checksum = "eb04e52f7836d7c7976c78ca0250d61e33873c34156a2a1fc9474828ec268234"
2617 dependencies = [
2618 "bitflags 2.13.2",
2619 "wayland-backend",
2620 "wayland-client",
2621 "wayland-protocols",
2622 "wayland-scanner",
2623 ]
2624
2625 [[package]]
2626 name = "wayland-scanner"
2627 version = "0.31.11"
2628 source = "registry+https://github.com/rust-lang/crates.io-index"
2629 checksum = "338e30461b3a2b67d70eb30a6d89f8e0c93a833e07d2ae89085cd070c4a00ac0"
2630 dependencies = [
2631 "proc-macro2",
2632 "quick-xml",
2633 "quote",
2634 ]
2635
2636 [[package]]
2637 name = "wayland-sys"
2638 version = "0.31.11"
2639 source = "registry+https://github.com/rust-lang/crates.io-index"
2640 checksum = "d8eab23fefc9e41f8e841df4a9c707e8a8c4ed26e944ef69297184de2785e3be"
2641 dependencies = [
2642 "dlib",
2643 "log",
2644 "once_cell",
2645 "pkg-config",
2646 ]
2647
2648 [[package]]
2649 name = "web-sys"
2650 version = "0.3.107"
2651 source = "registry+https://github.com/rust-lang/crates.io-index"
2652 checksum = "d7d179596ff5ec0f6de4db64d54011bde6289cc49603d3a6e4ce3f329207ab88"
2653 dependencies = [
2654 "js-sys",
2655 "wasm-bindgen",
2656 ]
2657
2658 [[package]]
2659 name = "web-time"
2660 version = "1.1.0"
2661 source = "registry+https://github.com/rust-lang/crates.io-index"
2662 checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb"
2663 dependencies = [
2664 "js-sys",
2665 "wasm-bindgen",
2666 ]
2667
2668 [[package]]
2669 name = "webbrowser"
2670 version = "1.2.6"
2671 source = "registry+https://github.com/rust-lang/crates.io-index"
2672 checksum = "fe8d20d0214027baf11b8b0cc307c1da7657d8f4db9aa956f7de27a6fb1acbd5"
2673 dependencies = [
2674 "jni",
2675 "log",
2676 "ndk-context",
2677 "objc2 0.6.5",
2678 "objc2-app-kit 0.3.2",
2679 "objc2-foundation 0.3.2",
2680 "url",
2681 "web-sys",
2682 ]
2683
2684 [[package]]
2685 name = "wgpu"
2686 version = "22.1.0"
2687 source = "registry+https://github.com/rust-lang/crates.io-index"
2688 checksum = "e1d1c4ba43f80542cf63a0a6ed3134629ae73e8ab51e4b765a67f3aa062eb433"
2689 dependencies = [
2690 "arrayvec",
2691 "cfg_aliases 0.1.1",
2692 "document-features",
2693 "js-sys",
2694 "log",
2695 "parking_lot",
2696 "profiling",
2697 "raw-window-handle",
2698 "smallvec",
2699 "static_assertions",
2700 "wasm-bindgen",
2701 "wasm-bindgen-futures",
2702 "web-sys",
2703 "wgpu-core",
2704 "wgpu-hal",
2705 "wgpu-types",
2706 ]
2707
2708 [[package]]
2709 name = "wgpu-core"
2710 version = "22.1.0"
2711 source = "registry+https://github.com/rust-lang/crates.io-index"
2712 checksum = "0348c840d1051b8e86c3bcd31206080c5e71e5933dabd79be1ce732b0b2f089a"
2713 dependencies = [
2714 "arrayvec",
2715 "bit-vec",
2716 "bitflags 2.13.2",
2717 "cfg_aliases 0.1.1",
2718 "document-features",
2719 "indexmap",
2720 "log",
2721 "naga",
2722 "once_cell",
2723 "parking_lot",
2724 "profiling",
2725 "raw-window-handle",
2726 "rustc-hash 1.1.0",
2727 "smallvec",
2728 "thiserror 1.0.69",
2729 "wgpu-hal",
2730 "wgpu-types",
2731 ]
2732
2733 [[package]]
2734 name = "wgpu-hal"
2735 version = "22.0.0"
2736 source = "registry+https://github.com/rust-lang/crates.io-index"
2737 checksum = "f6bbf4b4de8b2a83c0401d9e5ae0080a2792055f25859a02bf9be97952bbed4f"
2738 dependencies = [
2739 "android_system_properties",
2740 "arrayvec",
2741 "ash",
2742 "bitflags 2.13.2",
2743 "cfg_aliases 0.1.1",
2744 "core-graphics-types",
2745 "glow 0.13.1",
2746 "glutin_wgl_sys",
2747 "gpu-alloc",
2748 "gpu-allocator",
2749 "gpu-descriptor",
2750 "hassle-rs",
2751 "js-sys",
2752 "khronos-egl",
2753 "libc",
2754 "libloading",
2755 "log",
2756 "metal",
2757 "naga",
2758 "ndk-sys 0.5.0+25.2.9519653",
2759 "objc",
2760 "once_cell",
2761 "parking_lot",
2762 "profiling",
2763 "raw-window-handle",
2764 "renderdoc-sys",
2765 "rustc-hash 1.1.0",
2766 "smallvec",
2767 "thiserror 1.0.69",
2768 "wasm-bindgen",
2769 "web-sys",
2770 "wgpu-types",
2771 "winapi",
2772 ]
2773
2774 [[package]]
2775 name = "wgpu-types"
2776 version = "22.0.0"
2777 source = "registry+https://github.com/rust-lang/crates.io-index"
2778 checksum = "bc9d91f0e2c4b51434dfa6db77846f2793149d8e73f800fa2e41f52b8eac3c5d"
2779 dependencies = [
2780 "bitflags 2.13.2",
2781 "js-sys",
2782 "web-sys",
2783 ]
2784
2785 [[package]]
2786 name = "widestring"
2787 version = "1.2.1"
2788 source = "registry+https://github.com/rust-lang/crates.io-index"
2789 checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471"
2790
2791 [[package]]
2792 name = "winapi"
2793 version = "0.3.9"
2794 source = "registry+https://github.com/rust-lang/crates.io-index"
2795 checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
2796 dependencies = [
2797 "winapi-i686-pc-windows-gnu",
2798 "winapi-x86_64-pc-windows-gnu",
2799 ]
2800
2801 [[package]]
2802 name = "winapi-i686-pc-windows-gnu"
2803 version = "0.4.0"
2804 source = "registry+https://github.com/rust-lang/crates.io-index"
2805 checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
2806
2807 [[package]]
2808 name = "winapi-util"
2809 version = "0.1.11"
2810 source = "registry+https://github.com/rust-lang/crates.io-index"
2811 checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
2812 dependencies = [
2813 "windows-sys 0.61.2",
2814 ]
2815
2816 [[package]]
2817 name = "winapi-x86_64-pc-windows-gnu"
2818 version = "0.4.0"
2819 source = "registry+https://github.com/rust-lang/crates.io-index"
2820 checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
2821
2822 [[package]]
2823 name = "windows"
2824 version = "0.52.0"
2825 source = "registry+https://github.com/rust-lang/crates.io-index"
2826 checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be"
2827 dependencies = [
2828 "windows-core",
2829 "windows-targets",
2830 ]
2831
2832 [[package]]
2833 name = "windows-core"
2834 version = "0.52.0"
2835 source = "registry+https://github.com/rust-lang/crates.io-index"
2836 checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
2837 dependencies = [
2838 "windows-targets",
2839 ]
2840
2841 [[package]]
2842 name = "windows-link"
2843 version = "0.2.1"
2844 source = "registry+https://github.com/rust-lang/crates.io-index"
2845 checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
2846
2847 [[package]]
2848 name = "windows-sys"
2849 version = "0.52.0"
2850 source = "registry+https://github.com/rust-lang/crates.io-index"
2851 checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
2852 dependencies = [
2853 "windows-targets",
2854 ]
2855
2856 [[package]]
2857 name = "windows-sys"
2858 version = "0.59.0"
2859 source = "registry+https://github.com/rust-lang/crates.io-index"
2860 checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
2861 dependencies = [
2862 "windows-targets",
2863 ]
2864
2865 [[package]]
2866 name = "windows-sys"
2867 version = "0.61.2"
2868 source = "registry+https://github.com/rust-lang/crates.io-index"
2869 checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
2870 dependencies = [
2871 "windows-link",
2872 ]
2873
2874 [[package]]
2875 name = "windows-targets"
2876 version = "0.52.6"
2877 source = "registry+https://github.com/rust-lang/crates.io-index"
2878 checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
2879 dependencies = [
2880 "windows_aarch64_gnullvm",
2881 "windows_aarch64_msvc",
2882 "windows_i686_gnu",
2883 "windows_i686_gnullvm",
2884 "windows_i686_msvc",
2885 "windows_x86_64_gnu",
2886 "windows_x86_64_gnullvm",
2887 "windows_x86_64_msvc",
2888 ]
2889
2890 [[package]]
2891 name = "windows_aarch64_gnullvm"
2892 version = "0.52.6"
2893 source = "registry+https://github.com/rust-lang/crates.io-index"
2894 checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
2895
2896 [[package]]
2897 name = "windows_aarch64_msvc"
2898 version = "0.52.6"
2899 source = "registry+https://github.com/rust-lang/crates.io-index"
2900 checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
2901
2902 [[package]]
2903 name = "windows_i686_gnu"
2904 version = "0.52.6"
2905 source = "registry+https://github.com/rust-lang/crates.io-index"
2906 checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
2907
2908 [[package]]
2909 name = "windows_i686_gnullvm"
2910 version = "0.52.6"
2911 source = "registry+https://github.com/rust-lang/crates.io-index"
2912 checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
2913
2914 [[package]]
2915 name = "windows_i686_msvc"
2916 version = "0.52.6"
2917 source = "registry+https://github.com/rust-lang/crates.io-index"
2918 checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
2919
2920 [[package]]
2921 name = "windows_x86_64_gnu"
2922 version = "0.52.6"
2923 source = "registry+https://github.com/rust-lang/crates.io-index"
2924 checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
2925
2926 [[package]]
2927 name = "windows_x86_64_gnullvm"
2928 version = "0.52.6"
2929 source = "registry+https://github.com/rust-lang/crates.io-index"
2930 checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
2931
2932 [[package]]
2933 name = "windows_x86_64_msvc"
2934 version = "0.52.6"
2935 source = "registry+https://github.com/rust-lang/crates.io-index"
2936 checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
2937
2938 [[package]]
2939 name = "winit"
2940 version = "0.30.13"
2941 source = "registry+https://github.com/rust-lang/crates.io-index"
2942 checksum = "a6755fa58a9f8350bd1e472d4c3fcc25f824ec358933bba33306d0b63df5978d"
2943 dependencies = [
2944 "ahash",
2945 "android-activity",
2946 "atomic-waker",
2947 "bitflags 2.13.2",
2948 "block2",
2949 "bytemuck",
2950 "calloop 0.13.0",
2951 "cfg_aliases 0.2.2",
2952 "concurrent-queue",
2953 "core-foundation",
2954 "core-graphics",
2955 "cursor-icon",
2956 "dpi",
2957 "js-sys",
2958 "libc",
2959 "memmap2",
2960 "ndk",
2961 "objc2 0.5.3",
2962 "objc2-app-kit 0.2.2",
2963 "objc2-foundation 0.2.2",
2964 "objc2-ui-kit",
2965 "orbclient",
2966 "percent-encoding",
2967 "pin-project",
2968 "raw-window-handle",
2969 "redox_syscall 0.4.1",
2970 "rustix 0.38.44",
2971 "smithay-client-toolkit 0.19.2",
2972 "smol_str",
2973 "tracing",
2974 "unicode-segmentation",
2975 "wasm-bindgen",
2976 "wasm-bindgen-futures",
2977 "wayland-backend",
2978 "wayland-client",
2979 "wayland-protocols",
2980 "wayland-protocols-plasma",
2981 "web-sys",
2982 "web-time",
2983 "windows-sys 0.52.0",
2984 "x11-dl",
2985 "x11rb",
2986 "xkbcommon-dl",
2987 ]
2988
2989 [[package]]
2990 name = "winnow"
2991 version = "1.0.5"
2992 source = "registry+https://github.com/rust-lang/crates.io-index"
2993 checksum = "8c3b93199df0ab874cdf0c6a94f0a0dc3423fe41f1cafb62b8bd7b1deb277aef"
2994 dependencies = [
2995 "memchr",
2996 ]
2997
2998 [[package]]
2999 name = "wit-bindgen"
3000 version = "0.57.1"
3001 source = "registry+https://github.com/rust-lang/crates.io-index"
3002 checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e"
3003
3004 [[package]]
3005 name = "writeable"
3006 version = "0.6.4"
3007 source = "registry+https://github.com/rust-lang/crates.io-index"
3008 checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc"
3009
3010 [[package]]
3011 name = "x11-dl"
3012 version = "2.21.0"
3013 source = "registry+https://github.com/rust-lang/crates.io-index"
3014 checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f"
3015 dependencies = [
3016 "libc",
3017 "once_cell",
3018 "pkg-config",
3019 ]
3020
3021 [[package]]
3022 name = "x11rb"
3023 version = "0.13.2"
3024 source = "registry+https://github.com/rust-lang/crates.io-index"
3025 checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414"
3026 dependencies = [
3027 "as-raw-xcb-connection",
3028 "gethostname",
3029 "libc",
3030 "libloading",
3031 "once_cell",
3032 "rustix 1.1.6",
3033 "x11rb-protocol",
3034 ]
3035
3036 [[package]]
3037 name = "x11rb-protocol"
3038 version = "0.13.2"
3039 source = "registry+https://github.com/rust-lang/crates.io-index"
3040 checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd"
3041
3042 [[package]]
3043 name = "xcursor"
3044 version = "0.3.11"
3045 source = "registry+https://github.com/rust-lang/crates.io-index"
3046 checksum = "163b33ed8786455e2fa5d72f554057ce3f3182425434f756cd39c99839d88e23"
3047
3048 [[package]]
3049 name = "xkbcommon-dl"
3050 version = "0.4.2"
3051 source = "registry+https://github.com/rust-lang/crates.io-index"
3052 checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5"
3053 dependencies = [
3054 "bitflags 2.13.2",
3055 "dlib",
3056 "log",
3057 "once_cell",
3058 "xkeysym",
3059 ]
3060
3061 [[package]]
3062 name = "xkeysym"
3063 version = "0.2.1"
3064 source = "registry+https://github.com/rust-lang/crates.io-index"
3065 checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56"
3066
3067 [[package]]
3068 name = "xml-rs"
3069 version = "0.8.29"
3070 source = "registry+https://github.com/rust-lang/crates.io-index"
3071 checksum = "e450f9b2ed1dff33c94c12589a87338689467b9c4f5d8a5710bd09a847d2c8a7"
3072
3073 [[package]]
3074 name = "yoke"
3075 version = "0.8.4"
3076 source = "registry+https://github.com/rust-lang/crates.io-index"
3077 checksum = "417ef3fcf6c300b7dbd25c85531a746931c02ad536f3cf4786ed1e88223340b3"
3078 dependencies = [
3079 "stable_deref_trait",
3080 "yoke-derive",
3081 "zerofrom",
3082 ]
3083
3084 [[package]]
3085 name = "yoke-derive"
3086 version = "0.8.4"
3087 source = "registry+https://github.com/rust-lang/crates.io-index"
3088 checksum = "ec8ebde2db3681e8c9980cc27822030e68752690ddfa9473e739aeb4dbde6d71"
3089 dependencies = [
3090 "proc-macro2",
3091 "quote",
3092 "syn 3.0.9",
3093 "synstructure",
3094 ]
3095
3096 [[package]]
3097 name = "zerocopy"
3098 version = "0.8.63"
3099 source = "registry+https://github.com/rust-lang/crates.io-index"
3100 checksum = "e5fe1f8f1b06191a00962174c61aa5005e0bb391a6d80d07e24d115c01a92ed8"
3101 dependencies = [
3102 "zerocopy-derive",
3103 ]
3104
3105 [[package]]
3106 name = "zerocopy-derive"
3107 version = "0.8.63"
3108 source = "registry+https://github.com/rust-lang/crates.io-index"
3109 checksum = "863ad3ac83293fb4d740aedbfdc9240dd8d1a50c1099acd76ce80ce7c7230c7f"
3110 dependencies = [
3111 "proc-macro2",
3112 "quote",
3113 "syn 2.0.119",
3114 ]
3115
3116 [[package]]
3117 name = "zerofrom"
3118 version = "0.1.8"
3119 source = "registry+https://github.com/rust-lang/crates.io-index"
3120 checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272"
3121 dependencies = [
3122 "zerofrom-derive",
3123 ]
3124
3125 [[package]]
3126 name = "zerofrom-derive"
3127 version = "0.1.8"
3128 source = "registry+https://github.com/rust-lang/crates.io-index"
3129 checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a"
3130 dependencies = [
3131 "proc-macro2",
3132 "quote",
3133 "syn 3.0.9",
3134 "synstructure",
3135 ]
3136
3137 [[package]]
3138 name = "zerotrie"
3139 version = "0.2.5"
3140 source = "registry+https://github.com/rust-lang/crates.io-index"
3141 checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f"
3142 dependencies = [
3143 "displaydoc",
3144 "yoke",
3145 "zerofrom",
3146 ]
3147
3148 [[package]]
3149 name = "zerovec"
3150 version = "0.11.9"
3151 source = "registry+https://github.com/rust-lang/crates.io-index"
3152 checksum = "f58a2799cfe9a1670c7ea8edbd52ef8edb93cb37a7f83bf31ba9e35d9dae6a40"
3153 dependencies = [
3154 "yoke",
3155 "zerofrom",
3156 "zerovec-derive",
3157 ]
3158
3159 [[package]]
3160 name = "zerovec-derive"
3161 version = "0.11.7"
3162 source = "registry+https://github.com/rust-lang/crates.io-index"
3163 checksum = "c3743ddbf47738d929cd1ae2e199d40d0162979dfe31aef8ae646d2bf00bf97a"
3164 dependencies = [
3165 "proc-macro2",
3166 "quote",
3167 "syn 3.0.9",
3168 ]
3169
3170 [[package]]
3171 name = "zlib-rs"
3172 version = "0.6.8"
3173 source = "registry+https://github.com/rust-lang/crates.io-index"
3174 checksum = "b268e58e7c693d7c271f93ffc4ba3b380412554231c85bf61ca7af91042a4112"
@@ -0,0 +1,3174 @@
1# This file is automatically @generated by Cargo.
2# It is not intended for manual editing.
3version = 4
4
5[[package]]
6name = "ab_glyph"
7version = "0.2.32"
8source = "registry+https://github.com/rust-lang/crates.io-index"
9checksum = "01c0457472c38ea5bd1c3b5ada5e368271cb550be7a4ca4a0b4634e9913f6cc2"
10dependencies = [
11 "ab_glyph_rasterizer",
12 "owned_ttf_parser",
13]
14
15[[package]]
16name = "ab_glyph_rasterizer"
17version = "0.1.10"
18source = "registry+https://github.com/rust-lang/crates.io-index"
19checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618"
20
21[[package]]
22name = "adler2"
23version = "2.0.1"
24source = "registry+https://github.com/rust-lang/crates.io-index"
25checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
26
27[[package]]
28name = "ahash"
29version = "0.8.12"
30source = "registry+https://github.com/rust-lang/crates.io-index"
31checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75"
32dependencies = [
33 "cfg-if",
34 "getrandom 0.3.4",
35 "once_cell",
36 "version_check",
37 "zerocopy",
38]
39
40[[package]]
41name = "android-activity"
42version = "0.6.1"
43source = "registry+https://github.com/rust-lang/crates.io-index"
44checksum = "0f2a1bb052857d5dd49572219344a7332b31b76405648eabac5bc68978251bcd"
45dependencies = [
46 "android-properties",
47 "bitflags 2.13.2",
48 "cc",
49 "jni",
50 "libc",
51 "log",
52 "ndk",
53 "ndk-context",
54 "ndk-sys 0.6.0+11769913",
55 "num_enum",
56 "thiserror 2.0.21",
57]
58
59[[package]]
60name = "android-properties"
61version = "0.2.2"
62source = "registry+https://github.com/rust-lang/crates.io-index"
63checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04"
64
65[[package]]
66name = "android_system_properties"
67version = "0.1.6"
68source = "registry+https://github.com/rust-lang/crates.io-index"
69checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc"
70dependencies = [
71 "libc",
72]
73
74[[package]]
75name = "arboard"
76version = "3.7.0"
77source = "registry+https://github.com/rust-lang/crates.io-index"
78checksum = "aeb9553e62312c8756a5979254fc6d7da8bbeb5986a1e17037fab932f7037917"
79dependencies = [
80 "clipboard-win",
81 "log",
82 "objc2 0.6.5",
83 "objc2-app-kit 0.3.2",
84 "objc2-foundation 0.3.2",
85 "parking_lot",
86 "percent-encoding",
87 "windows-sys 0.61.2",
88 "x11rb",
89]
90
91[[package]]
92name = "arrayvec"
93version = "0.7.8"
94source = "registry+https://github.com/rust-lang/crates.io-index"
95checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56"
96
97[[package]]
98name = "as-raw-xcb-connection"
99version = "1.0.1"
100source = "registry+https://github.com/rust-lang/crates.io-index"
101checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b"
102
103[[package]]
104name = "ash"
105version = "0.38.0+1.3.281"
106source = "registry+https://github.com/rust-lang/crates.io-index"
107checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f"
108dependencies = [
109 "libloading",
110]
111
112[[package]]
113name = "atomic-waker"
114version = "1.1.2"
115source = "registry+https://github.com/rust-lang/crates.io-index"
116checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
117
118[[package]]
119name = "autocfg"
120version = "1.5.1"
121source = "registry+https://github.com/rust-lang/crates.io-index"
122checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
123
124[[package]]
125name = "bit-set"
126version = "0.6.0"
127source = "registry+https://github.com/rust-lang/crates.io-index"
128checksum = "f0481a0e032742109b1133a095184ee93d88f3dc9e0d28a5d033dc77a073f44f"
129dependencies = [
130 "bit-vec",
131]
132
133[[package]]
134name = "bit-vec"
135version = "0.7.0"
136source = "registry+https://github.com/rust-lang/crates.io-index"
137checksum = "d2c54ff287cfc0a34f38a6b832ea1bd8e448a330b3e40a50859e6488bee07f22"
138
139[[package]]
140name = "bitflags"
141version = "1.3.2"
142source = "registry+https://github.com/rust-lang/crates.io-index"
143checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
144
145[[package]]
146name = "bitflags"
147version = "2.13.2"
148source = "registry+https://github.com/rust-lang/crates.io-index"
149checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06"
150
151[[package]]
152name = "block"
153version = "0.1.6"
154source = "registry+https://github.com/rust-lang/crates.io-index"
155checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a"
156
157[[package]]
158name = "block2"
159version = "0.5.1"
160source = "registry+https://github.com/rust-lang/crates.io-index"
161checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f"
162dependencies = [
163 "objc2 0.5.3",
164]
165
166[[package]]
167name = "bumpalo"
168version = "3.20.3"
169source = "registry+https://github.com/rust-lang/crates.io-index"
170checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649"
171
172[[package]]
173name = "bytemuck"
174version = "1.25.2"
175source = "registry+https://github.com/rust-lang/crates.io-index"
176checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797"
177dependencies = [
178 "bytemuck_derive",
179]
180
181[[package]]
182name = "bytemuck_derive"
183version = "1.12.1"
184source = "registry+https://github.com/rust-lang/crates.io-index"
185checksum = "6a1f896587b6f2c069c73d2f0913e2d590c3990285cd2f0b6aa02b786b4c679c"
186dependencies = [
187 "proc-macro2",
188 "quote",
189 "syn 3.0.9",
190]
191
192[[package]]
193name = "byteorder-lite"
194version = "0.1.0"
195source = "registry+https://github.com/rust-lang/crates.io-index"
196checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495"
197
198[[package]]
199name = "bytes"
200version = "1.12.1"
201source = "registry+https://github.com/rust-lang/crates.io-index"
202checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04"
203
204[[package]]
205name = "calloop"
206version = "0.13.0"
207source = "registry+https://github.com/rust-lang/crates.io-index"
208checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec"
209dependencies = [
210 "bitflags 2.13.2",
211 "log",
212 "polling",
213 "rustix 0.38.44",
214 "slab",
215 "thiserror 1.0.69",
216]
217
218[[package]]
219name = "calloop"
220version = "0.14.5"
221source = "registry+https://github.com/rust-lang/crates.io-index"
222checksum = "43b32313e937c8721c9d17ee9bf60699a6402b4b7c2cb6ac1bee0ffcaa4b4e5e"
223dependencies = [
224 "bitflags 2.13.2",
225 "polling",
226 "rustix 1.1.6",
227 "tracing",
228]
229
230[[package]]
231name = "calloop-wayland-source"
232version = "0.3.0"
233source = "registry+https://github.com/rust-lang/crates.io-index"
234checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20"
235dependencies = [
236 "calloop 0.13.0",
237 "rustix 0.38.44",
238 "wayland-backend",
239 "wayland-client",
240]
241
242[[package]]
243name = "calloop-wayland-source"
244version = "0.4.1"
245source = "registry+https://github.com/rust-lang/crates.io-index"
246checksum = "138efcf0940a02ebf0cc8d1eff41a1682a46b431630f4c52450d6265876021fa"
247dependencies = [
248 "calloop 0.14.5",
249 "rustix 1.1.6",
250 "wayland-backend",
251 "wayland-client",
252]
253
254[[package]]
255name = "cc"
256version = "1.11.1"
257source = "registry+https://github.com/rust-lang/crates.io-index"
258checksum = "4ff2a8126fff0f8c839080d619675a585e61720bb12d2baceae45769fd66f155"
259dependencies = [
260 "find-msvc-tools",
261 "jobserver",
262 "libc",
263 "shlex",
264]
265
266[[package]]
267name = "cfg-if"
268version = "1.0.5"
269source = "registry+https://github.com/rust-lang/crates.io-index"
270checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600"
271
272[[package]]
273name = "cfg_aliases"
274version = "0.1.1"
275source = "registry+https://github.com/rust-lang/crates.io-index"
276checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e"
277
278[[package]]
279name = "cfg_aliases"
280version = "0.2.2"
281source = "registry+https://github.com/rust-lang/crates.io-index"
282checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527"
283
284[[package]]
285name = "cgl"
286version = "0.3.2"
287source = "registry+https://github.com/rust-lang/crates.io-index"
288checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff"
289dependencies = [
290 "libc",
291]
292
293[[package]]
294name = "clipboard-win"
295version = "5.4.3"
296source = "registry+https://github.com/rust-lang/crates.io-index"
297checksum = "052af7878466feccda12ba7a6a67d019d712f296809559b47c12c8cc196d3a9a"
298dependencies = [
299 "error-code",
300]
301
302[[package]]
303name = "codespan-reporting"
304version = "0.11.1"
305source = "registry+https://github.com/rust-lang/crates.io-index"
306checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e"
307dependencies = [
308 "termcolor",
309 "unicode-width",
310]
311
312[[package]]
313name = "com"
314version = "0.6.0"
315source = "registry+https://github.com/rust-lang/crates.io-index"
316checksum = "7e17887fd17353b65b1b2ef1c526c83e26cd72e74f598a8dc1bee13a48f3d9f6"
317dependencies = [
318 "com_macros",
319]
320
321[[package]]
322name = "com_macros"
323version = "0.6.0"
324source = "registry+https://github.com/rust-lang/crates.io-index"
325checksum = "d375883580a668c7481ea6631fc1a8863e33cc335bf56bfad8d7e6d4b04b13a5"
326dependencies = [
327 "com_macros_support",
328 "proc-macro2",
329 "syn 1.0.109",
330]
331
332[[package]]
333name = "com_macros_support"
334version = "0.6.0"
335source = "registry+https://github.com/rust-lang/crates.io-index"
336checksum = "ad899a1087a9296d5644792d7cb72b8e34c1bec8e7d4fbc002230169a6e8710c"
337dependencies = [
338 "proc-macro2",
339 "quote",
340 "syn 1.0.109",
341]
342
343[[package]]
344name = "combine"
345version = "4.6.9"
346source = "registry+https://github.com/rust-lang/crates.io-index"
347checksum = "4356eba6976435498d05a311ee9fc486da3bc81c200d3f0d7dd9703b41913f92"
348dependencies = [
349 "bytes",
350 "memchr",
351]
352
353[[package]]
354name = "concurrent-queue"
355version = "2.5.0"
356source = "registry+https://github.com/rust-lang/crates.io-index"
357checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973"
358dependencies = [
359 "crossbeam-utils",
360]
361
362[[package]]
363name = "core-foundation"
364version = "0.9.4"
365source = "registry+https://github.com/rust-lang/crates.io-index"
366checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
367dependencies = [
368 "core-foundation-sys",
369 "libc",
370]
371
372[[package]]
373name = "core-foundation-sys"
374version = "0.8.7"
375source = "registry+https://github.com/rust-lang/crates.io-index"
376checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
377
378[[package]]
379name = "core-graphics"
380version = "0.23.2"
381source = "registry+https://github.com/rust-lang/crates.io-index"
382checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081"
383dependencies = [
384 "bitflags 1.3.2",
385 "core-foundation",
386 "core-graphics-types",
387 "foreign-types",
388 "libc",
389]
390
391[[package]]
392name = "core-graphics-types"
393version = "0.1.3"
394source = "registry+https://github.com/rust-lang/crates.io-index"
395checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf"
396dependencies = [
397 "bitflags 1.3.2",
398 "core-foundation",
399 "libc",
400]
401
402[[package]]
403name = "crc32fast"
404version = "1.5.4"
405source = "registry+https://github.com/rust-lang/crates.io-index"
406checksum = "5f97d3416d5337d15c4b0d78c8c91df922ca143f57ec20e2d1c188333047ef04"
407dependencies = [
408 "cfg-if",
409]
410
411[[package]]
412name = "crossbeam-utils"
413version = "0.8.23"
414source = "registry+https://github.com/rust-lang/crates.io-index"
415checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6"
416
417[[package]]
418name = "cursor-icon"
419version = "1.2.0"
420source = "registry+https://github.com/rust-lang/crates.io-index"
421checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f"
422
423[[package]]
424name = "dispatch"
425version = "0.2.0"
426source = "registry+https://github.com/rust-lang/crates.io-index"
427checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b"
428
429[[package]]
430name = "dispatch2"
431version = "0.3.1"
432source = "registry+https://github.com/rust-lang/crates.io-index"
433checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38"
434dependencies = [
435 "bitflags 2.13.2",
436 "objc2 0.6.5",
437]
438
439[[package]]
440name = "displaydoc"
441version = "0.2.7"
442source = "registry+https://github.com/rust-lang/crates.io-index"
443checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8"
444dependencies = [
445 "proc-macro2",
446 "quote",
447 "syn 3.0.9",
448]
449
450[[package]]
451name = "dlib"
452version = "0.5.3"
453source = "registry+https://github.com/rust-lang/crates.io-index"
454checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a"
455dependencies = [
456 "libloading",
457]
458
459[[package]]
460name = "document-features"
461version = "0.2.12"
462source = "registry+https://github.com/rust-lang/crates.io-index"
463checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61"
464dependencies = [
465 "litrs",
466]
467
468[[package]]
469name = "downcast-rs"
470version = "1.2.1"
471source = "registry+https://github.com/rust-lang/crates.io-index"
472checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2"
473
474[[package]]
475name = "dpi"
476version = "0.1.2"
477source = "registry+https://github.com/rust-lang/crates.io-index"
478checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76"
479
480[[package]]
481name = "ecolor"
482version = "0.29.1"
483source = "registry+https://github.com/rust-lang/crates.io-index"
484checksum = "775cfde491852059e386c4e1deb4aef381c617dc364184c6f6afee99b87c402b"
485dependencies = [
486 "bytemuck",
487 "emath",
488]
489
490[[package]]
491name = "eframe"
492version = "0.29.1"
493source = "registry+https://github.com/rust-lang/crates.io-index"
494checksum = "8ac2645a9bf4826eb4e91488b1f17b8eaddeef09396706b2f14066461338e24f"
495dependencies = [
496 "ahash",
497 "bytemuck",
498 "document-features",
499 "egui",
500 "egui-wgpu",
501 "egui-winit",
502 "egui_glow",
503 "glow 0.14.2",
504 "glutin",
505 "glutin-winit",
506 "image",
507 "js-sys",
508 "log",
509 "objc2 0.5.3",
510 "objc2-app-kit 0.2.2",
511 "objc2-foundation 0.2.2",
512 "parking_lot",
513 "percent-encoding",
514 "raw-window-handle",
515 "static_assertions",
516 "wasm-bindgen",
517 "wasm-bindgen-futures",
518 "web-sys",
519 "web-time",
520 "winapi",
521 "windows-sys 0.52.0",
522 "winit",
523]
524
525[[package]]
526name = "egui"
527version = "0.29.1"
528source = "registry+https://github.com/rust-lang/crates.io-index"
529checksum = "53eafabcce0cb2325a59a98736efe0bf060585b437763f8c476957fb274bb974"
530dependencies = [
531 "ahash",
532 "emath",
533 "epaint",
534 "log",
535 "nohash-hasher",
536]
537
538[[package]]
539name = "egui-wgpu"
540version = "0.29.1"
541source = "registry+https://github.com/rust-lang/crates.io-index"
542checksum = "d00fd5d06d8405397e64a928fa0ef3934b3c30273ea7603e3dc4627b1f7a1a82"
543dependencies = [
544 "ahash",
545 "bytemuck",
546 "document-features",
547 "egui",
548 "epaint",
549 "log",
550 "thiserror 1.0.69",
551 "type-map",
552 "web-time",
553 "wgpu",
554 "winit",
555]
556
557[[package]]
558name = "egui-winit"
559version = "0.29.1"
560source = "registry+https://github.com/rust-lang/crates.io-index"
561checksum = "0a9c430f4f816340e8e8c1b20eec274186b1be6bc4c7dfc467ed50d57abc36c6"
562dependencies = [
563 "ahash",
564 "arboard",
565 "egui",
566 "log",
567 "raw-window-handle",
568 "smithay-clipboard",
569 "web-time",
570 "webbrowser",
571 "winit",
572]
573
574[[package]]
575name = "egui_glow"
576version = "0.29.1"
577source = "registry+https://github.com/rust-lang/crates.io-index"
578checksum = "0e39bccc683cd43adab530d8f21a13eb91e80de10bcc38c3f1c16601b6f62b26"
579dependencies = [
580 "ahash",
581 "bytemuck",
582 "egui",
583 "glow 0.14.2",
584 "log",
585 "memoffset",
586 "wasm-bindgen",
587 "web-sys",
588 "winit",
589]
590
591[[package]]
592name = "emath"
593version = "0.29.1"
594source = "registry+https://github.com/rust-lang/crates.io-index"
595checksum = "b1fe0049ce51d0fb414d029e668dd72eb30bc2b739bf34296ed97bd33df544f3"
596dependencies = [
597 "bytemuck",
598]
599
600[[package]]
601name = "epaint"
602version = "0.29.1"
603source = "registry+https://github.com/rust-lang/crates.io-index"
604checksum = "a32af8da821bd4f43f2c137e295459ee2e1661d87ca8779dfa0eaf45d870e20f"
605dependencies = [
606 "ab_glyph",
607 "ahash",
608 "bytemuck",
609 "ecolor",
610 "emath",
611 "epaint_default_fonts",
612 "log",
613 "nohash-hasher",
614 "parking_lot",
615]
616
617[[package]]
618name = "epaint_default_fonts"
619version = "0.29.1"
620source = "registry+https://github.com/rust-lang/crates.io-index"
621checksum = "483440db0b7993cf77a20314f08311dbe95675092405518c0677aa08c151a3ea"
622
623[[package]]
624name = "equivalent"
625version = "1.0.3"
626source = "registry+https://github.com/rust-lang/crates.io-index"
627checksum = "00d174d5400e5e8fd687ad1049e2f578285fa914201b1af7e8b112a4546bd826"
628
629[[package]]
630name = "errno"
631version = "0.3.14"
632source = "registry+https://github.com/rust-lang/crates.io-index"
633checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
634dependencies = [
635 "libc",
636 "windows-sys 0.61.2",
637]
638
639[[package]]
640name = "error-code"
641version = "3.4.0"
642source = "registry+https://github.com/rust-lang/crates.io-index"
643checksum = "0b5343afd4a8365a643ac588dab4cf234a190c7f6c88c9f6dd6ffe00837661b7"
644
645[[package]]
646name = "fdeflate"
647version = "0.3.7"
648source = "registry+https://github.com/rust-lang/crates.io-index"
649checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c"
650dependencies = [
651 "simd-adler32",
652]
653
654[[package]]
655name = "find-msvc-tools"
656version = "0.1.15"
657source = "registry+https://github.com/rust-lang/crates.io-index"
658checksum = "1c66915cc5391097de7a2b0b972e8505aa33c0df401fd3a6811dbdb32881ba48"
659
660[[package]]
661name = "flate2"
662version = "1.1.11"
663source = "registry+https://github.com/rust-lang/crates.io-index"
664checksum = "626d4928326b646e70f65ed36fc7cf9f206bdb68a0019ee7c6b4709da4e084c4"
665dependencies = [
666 "crc32fast",
667 "miniz_oxide 0.9.1",
668 "zlib-rs",
669]
670
671[[package]]
672name = "foldhash"
673version = "0.1.5"
674source = "registry+https://github.com/rust-lang/crates.io-index"
675checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
676
677[[package]]
678name = "foreign-types"
679version = "0.5.0"
680source = "registry+https://github.com/rust-lang/crates.io-index"
681checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965"
682dependencies = [
683 "foreign-types-macros",
684 "foreign-types-shared",
685]
686
687[[package]]
688name = "foreign-types-macros"
689version = "0.2.4"
690source = "registry+https://github.com/rust-lang/crates.io-index"
691checksum = "ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225"
692dependencies = [
693 "proc-macro2",
694 "quote",
695 "syn 3.0.9",
696]
697
698[[package]]
699name = "foreign-types-shared"
700version = "0.3.1"
701source = "registry+https://github.com/rust-lang/crates.io-index"
702checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b"
703
704[[package]]
705name = "form_urlencoded"
706version = "1.2.2"
707source = "registry+https://github.com/rust-lang/crates.io-index"
708checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
709dependencies = [
710 "percent-encoding",
711]
712
713[[package]]
714name = "futures-core"
715version = "0.3.34"
716source = "registry+https://github.com/rust-lang/crates.io-index"
717checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e"
718
719[[package]]
720name = "futures-task"
721version = "0.3.34"
722source = "registry+https://github.com/rust-lang/crates.io-index"
723checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd"
724
725[[package]]
726name = "futures-util"
727version = "0.3.34"
728source = "registry+https://github.com/rust-lang/crates.io-index"
729checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc"
730dependencies = [
731 "futures-core",
732 "futures-task",
733 "pin-project-lite",
734 "slab",
735]
736
737[[package]]
738name = "gethostname"
739version = "1.1.0"
740source = "registry+https://github.com/rust-lang/crates.io-index"
741checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8"
742dependencies = [
743 "rustix 1.1.6",
744 "windows-link",
745]
746
747[[package]]
748name = "getrandom"
749version = "0.3.4"
750source = "registry+https://github.com/rust-lang/crates.io-index"
751checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
752dependencies = [
753 "cfg-if",
754 "libc",
755 "r-efi 5.3.0",
756 "wasip2",
757]
758
759[[package]]
760name = "getrandom"
761version = "0.4.3"
762source = "registry+https://github.com/rust-lang/crates.io-index"
763checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099"
764dependencies = [
765 "cfg-if",
766 "libc",
767 "r-efi 6.0.0",
768]
769
770[[package]]
771name = "gl_generator"
772version = "0.14.0"
773source = "registry+https://github.com/rust-lang/crates.io-index"
774checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d"
775dependencies = [
776 "khronos_api",
777 "log",
778 "xml-rs",
779]
780
781[[package]]
782name = "glow"
783version = "0.13.1"
784source = "registry+https://github.com/rust-lang/crates.io-index"
785checksum = "bd348e04c43b32574f2de31c8bb397d96c9fcfa1371bd4ca6d8bdc464ab121b1"
786dependencies = [
787 "js-sys",
788 "slotmap",
789 "wasm-bindgen",
790 "web-sys",
791]
792
793[[package]]
794name = "glow"
795version = "0.14.2"
796source = "registry+https://github.com/rust-lang/crates.io-index"
797checksum = "d51fa363f025f5c111e03f13eda21162faeacb6911fe8caa0c0349f9cf0c4483"
798dependencies = [
799 "js-sys",
800 "slotmap",
801 "wasm-bindgen",
802 "web-sys",
803]
804
805[[package]]
806name = "glutin"
807version = "0.32.3"
808source = "registry+https://github.com/rust-lang/crates.io-index"
809checksum = "12124de845cacfebedff80e877bb37b5b75c34c5a4c89e47e1cdd67fb6041325"
810dependencies = [
811 "bitflags 2.13.2",
812 "cfg_aliases 0.2.2",
813 "cgl",
814 "dispatch2",
815 "glutin_egl_sys",
816 "glutin_glx_sys",
817 "glutin_wgl_sys",
818 "libloading",
819 "objc2 0.6.5",
820 "objc2-app-kit 0.3.2",
821 "objc2-core-foundation",
822 "objc2-foundation 0.3.2",
823 "once_cell",
824 "raw-window-handle",
825 "wayland-sys",
826 "windows-sys 0.52.0",
827 "x11-dl",
828]
829
830[[package]]
831name = "glutin-winit"
832version = "0.5.0"
833source = "registry+https://github.com/rust-lang/crates.io-index"
834checksum = "85edca7075f8fc728f28cb8fbb111a96c3b89e930574369e3e9c27eb75d3788f"
835dependencies = [
836 "cfg_aliases 0.2.2",
837 "glutin",
838 "raw-window-handle",
839 "winit",
840]
841
842[[package]]
843name = "glutin_egl_sys"
844version = "0.7.1"
845source = "registry+https://github.com/rust-lang/crates.io-index"
846checksum = "4c4680ba6195f424febdc3ba46e7a42a0e58743f2edb115297b86d7f8ecc02d2"
847dependencies = [
848 "gl_generator",
849 "windows-sys 0.52.0",
850]
851
852[[package]]
853name = "glutin_glx_sys"
854version = "0.6.1"
855source = "registry+https://github.com/rust-lang/crates.io-index"
856checksum = "8a7bb2938045a88b612499fbcba375a77198e01306f52272e692f8c1f3751185"
857dependencies = [
858 "gl_generator",
859 "x11-dl",
860]
861
862[[package]]
863name = "glutin_wgl_sys"
864version = "0.6.1"
865source = "registry+https://github.com/rust-lang/crates.io-index"
866checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e"
867dependencies = [
868 "gl_generator",
869]
870
871[[package]]
872name = "gpu-alloc"
873version = "0.6.2"
874source = "registry+https://github.com/rust-lang/crates.io-index"
875checksum = "45cf04b2726f02df5508c6de726acdc90cdf97ac771a9a0ffd8ba10a6e696bf9"
876dependencies = [
877 "bitflags 2.13.2",
878 "gpu-alloc-types",
879]
880
881[[package]]
882name = "gpu-alloc-types"
883version = "0.3.1"
884source = "registry+https://github.com/rust-lang/crates.io-index"
885checksum = "b2bbed164dd10ed526c2e4fe3e721ca4a71c61730e5aafac6844b417b3227058"
886dependencies = [
887 "bitflags 2.13.2",
888]
889
890[[package]]
891name = "gpu-allocator"
892version = "0.26.0"
893source = "registry+https://github.com/rust-lang/crates.io-index"
894checksum = "fdd4240fc91d3433d5e5b0fc5b67672d771850dc19bbee03c1381e19322803d7"
895dependencies = [
896 "log",
897 "presser",
898 "thiserror 1.0.69",
899 "winapi",
900 "windows",
901]
902
903[[package]]
904name = "gpu-descriptor"
905version = "0.3.2"
906source = "registry+https://github.com/rust-lang/crates.io-index"
907checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca"
908dependencies = [
909 "bitflags 2.13.2",
910 "gpu-descriptor-types",
911 "hashbrown 0.15.5",
912]
913
914[[package]]
915name = "gpu-descriptor-types"
916version = "0.2.0"
917source = "registry+https://github.com/rust-lang/crates.io-index"
918checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91"
919dependencies = [
920 "bitflags 2.13.2",
921]
922
923[[package]]
924name = "hashbrown"
925version = "0.15.5"
926source = "registry+https://github.com/rust-lang/crates.io-index"
927checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
928dependencies = [
929 "foldhash",
930]
931
932[[package]]
933name = "hashbrown"
934version = "0.17.1"
935source = "registry+https://github.com/rust-lang/crates.io-index"
936checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a"
937
938[[package]]
939name = "hassle-rs"
940version = "0.11.0"
941source = "registry+https://github.com/rust-lang/crates.io-index"
942checksum = "af2a7e73e1f34c48da31fb668a907f250794837e08faa144fd24f0b8b741e890"
943dependencies = [
944 "bitflags 2.13.2",
945 "com",
946 "libc",
947 "libloading",
948 "thiserror 1.0.69",
949 "widestring",
950 "winapi",
951]
952
953[[package]]
954name = "hermit-abi"
955version = "0.5.3"
956source = "registry+https://github.com/rust-lang/crates.io-index"
957checksum = "e17592d60ebacc7d5e169f4663c5f84f9161cc90328abcfe8456f41e4dfcb284"
958
959[[package]]
960name = "hexf-parse"
961version = "0.2.1"
962source = "registry+https://github.com/rust-lang/crates.io-index"
963checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df"
964
965[[package]]
966name = "icu_collections"
967version = "2.4.0"
968source = "registry+https://github.com/rust-lang/crates.io-index"
969checksum = "fe090a42a0d3140fed8c63263ed1fecc02422cb2f4bfe55cd8de2de1b8e105dd"
970dependencies = [
971 "displaydoc",
972 "potential_utf",
973 "utf8_iter",
974 "yoke",
975 "zerofrom",
976 "zerovec",
977]
978
979[[package]]
980name = "icu_locale_core"
981version = "2.4.0"
982source = "registry+https://github.com/rust-lang/crates.io-index"
983checksum = "25d29b57c17c6528d0dc4c2141cfa2d08200465acb537a3909c8b9b8a4a984c0"
984dependencies = [
985 "displaydoc",
986 "litemap",
987 "tinystr",
988 "writeable",
989 "zerovec",
990]
991
992[[package]]
993name = "icu_normalizer"
994version = "2.4.0"
995source = "registry+https://github.com/rust-lang/crates.io-index"
996checksum = "404a3b8c486f205c87fe7f23ab6894d84a4ad76d6e4671ae1981ba7def87c599"
997dependencies = [
998 "icu_collections",
999 "icu_normalizer_data",
1000 "icu_properties",
1001 "icu_provider",
1002 "smallvec",
1003 "zerovec",
1004]
1005
1006[[package]]
1007name = "icu_normalizer_data"
1008version = "2.4.0"
1009source = "registry+https://github.com/rust-lang/crates.io-index"
1010checksum = "20f0088bfb7441f7a37fa0c9e20cb1e9cba1cac6b9ce8cd2a6dc44294f8e8cbc"
1011
1012[[package]]
1013name = "icu_properties"
1014version = "2.4.0"
1015source = "registry+https://github.com/rust-lang/crates.io-index"
1016checksum = "2ea83d991c56158f7cf898bf86436c1dfe7c07ee82fe88951f2695c9f37a379f"
1017dependencies = [
1018 "displaydoc",
1019 "icu_collections",
1020 "icu_locale_core",
1021 "icu_properties_data",
1022 "icu_provider",
1023 "zerotrie",
1024 "zerovec",
1025]
1026
1027[[package]]
1028name = "icu_properties_data"
1029version = "2.4.0"
1030source = "registry+https://github.com/rust-lang/crates.io-index"
1031checksum = "b98f29af82d02b163fe50161388350e743bb3107cc8e8c2f7314cb505faddfcf"
1032
1033[[package]]
1034name = "icu_provider"
1035version = "2.4.0"
1036source = "registry+https://github.com/rust-lang/crates.io-index"
1037checksum = "413099315636c588ee8f011190b329b971a09a8fae9d157e01dcae8379468514"
1038dependencies = [
1039 "displaydoc",
1040 "icu_locale_core",
1041 "writeable",
1042 "yoke",
1043 "zerofrom",
1044 "zerotrie",
1045 "zerovec",
1046]
1047
1048[[package]]
1049name = "idna"
1050version = "1.1.0"
1051source = "registry+https://github.com/rust-lang/crates.io-index"
1052checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
1053dependencies = [
1054 "idna_adapter",
1055 "smallvec",
1056 "utf8_iter",
1057]
1058
1059[[package]]
1060name = "idna_adapter"
1061version = "1.2.2"
1062source = "registry+https://github.com/rust-lang/crates.io-index"
1063checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714"
1064dependencies = [
1065 "icu_normalizer",
1066 "icu_properties",
1067]
1068
1069[[package]]
1070name = "image"
1071version = "0.25.10"
1072source = "registry+https://github.com/rust-lang/crates.io-index"
1073checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104"
1074dependencies = [
1075 "bytemuck",
1076 "byteorder-lite",
1077 "moxcms",
1078 "num-traits",
1079 "png",
1080]
1081
1082[[package]]
1083name = "indexmap"
1084version = "2.14.2"
1085source = "registry+https://github.com/rust-lang/crates.io-index"
1086checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855"
1087dependencies = [
1088 "equivalent",
1089 "hashbrown 0.17.1",
1090]
1091
1092[[package]]
1093name = "jni"
1094version = "0.22.4"
1095source = "registry+https://github.com/rust-lang/crates.io-index"
1096checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498"
1097dependencies = [
1098 "cfg-if",
1099 "combine",
1100 "jni-macros",
1101 "jni-sys 0.4.1",
1102 "log",
1103 "simd_cesu8",
1104 "thiserror 2.0.21",
1105 "walkdir",
1106 "windows-link",
1107]
1108
1109[[package]]
1110name = "jni-macros"
1111version = "0.22.4"
1112source = "registry+https://github.com/rust-lang/crates.io-index"
1113checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3"
1114dependencies = [
1115 "proc-macro2",
1116 "quote",
1117 "rustc_version",
1118 "simd_cesu8",
1119 "syn 2.0.119",
1120]
1121
1122[[package]]
1123name = "jni-sys"
1124version = "0.3.1"
1125source = "registry+https://github.com/rust-lang/crates.io-index"
1126checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258"
1127dependencies = [
1128 "jni-sys 0.4.1",
1129]
1130
1131[[package]]
1132name = "jni-sys"
1133version = "0.4.1"
1134source = "registry+https://github.com/rust-lang/crates.io-index"
1135checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2"
1136dependencies = [
1137 "jni-sys-macros",
1138]
1139
1140[[package]]
1141name = "jni-sys-macros"
1142version = "0.4.1"
1143source = "registry+https://github.com/rust-lang/crates.io-index"
1144checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264"
1145dependencies = [
1146 "quote",
1147 "syn 2.0.119",
1148]
1149
1150[[package]]
1151name = "jobserver"
1152version = "0.1.35"
1153source = "registry+https://github.com/rust-lang/crates.io-index"
1154checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3"
1155dependencies = [
1156 "getrandom 0.4.3",
1157 "libc",
1158]
1159
1160[[package]]
1161name = "js-sys"
1162version = "0.3.107"
1163source = "registry+https://github.com/rust-lang/crates.io-index"
1164checksum = "8dc09d2154098bbf4ef54eab6b117a3c24cbbffe94046b16ee6d6d4510584d3a"
1165dependencies = [
1166 "cfg-if",
1167 "futures-util",
1168 "wasm-bindgen",
1169]
1170
1171[[package]]
1172name = "khronos-egl"
1173version = "6.0.0"
1174source = "registry+https://github.com/rust-lang/crates.io-index"
1175checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76"
1176dependencies = [
1177 "libc",
1178 "libloading",
1179 "pkg-config",
1180]
1181
1182[[package]]
1183name = "khronos_api"
1184version = "3.1.0"
1185source = "registry+https://github.com/rust-lang/crates.io-index"
1186checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc"
1187
1188[[package]]
1189name = "libc"
1190version = "0.2.191"
1191source = "registry+https://github.com/rust-lang/crates.io-index"
1192checksum = "65cd87c9a6d60536580b316ad985726104730a5151c99845f2490428ef91240a"
1193
1194[[package]]
1195name = "libloading"
1196version = "0.8.9"
1197source = "registry+https://github.com/rust-lang/crates.io-index"
1198checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55"
1199dependencies = [
1200 "cfg-if",
1201 "windows-link",
1202]
1203
1204[[package]]
1205name = "libredox"
1206version = "0.1.25"
1207source = "registry+https://github.com/rust-lang/crates.io-index"
1208checksum = "61ff90caf6077a803a240f62fdbe88645a890bbca49ef8174c3cb0404362171d"
1209dependencies = [
1210 "bitflags 2.13.2",
1211 "libc",
1212 "plain",
1213 "redox_syscall 0.9.5",
1214]
1215
1216[[package]]
1217name = "linux-raw-sys"
1218version = "0.4.15"
1219source = "registry+https://github.com/rust-lang/crates.io-index"
1220checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
1221
1222[[package]]
1223name = "linux-raw-sys"
1224version = "0.12.1"
1225source = "registry+https://github.com/rust-lang/crates.io-index"
1226checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53"
1227
1228[[package]]
1229name = "litemap"
1230version = "0.8.3"
1231source = "registry+https://github.com/rust-lang/crates.io-index"
1232checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae"
1233
1234[[package]]
1235name = "litrs"
1236version = "1.0.1"
1237source = "registry+https://github.com/rust-lang/crates.io-index"
1238checksum = "4744e383959f0db86ede514b809b1c53251889093803c05267acc7d4e7030d70"
1239
1240[[package]]
1241name = "lock_api"
1242version = "0.4.14"
1243source = "registry+https://github.com/rust-lang/crates.io-index"
1244checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965"
1245dependencies = [
1246 "scopeguard",
1247]
1248
1249[[package]]
1250name = "log"
1251version = "0.4.35"
1252source = "registry+https://github.com/rust-lang/crates.io-index"
1253checksum = "5d15f86d12da44cd8d4ec3c73984537eb7f4cadcb9776a575a0a8a05ca11005c"
1254
1255[[package]]
1256name = "malloc_buf"
1257version = "0.0.6"
1258source = "registry+https://github.com/rust-lang/crates.io-index"
1259checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb"
1260dependencies = [
1261 "libc",
1262]
1263
1264[[package]]
1265name = "memchr"
1266version = "2.8.3"
1267source = "registry+https://github.com/rust-lang/crates.io-index"
1268checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
1269
1270[[package]]
1271name = "memmap2"
1272version = "0.9.12"
1273source = "registry+https://github.com/rust-lang/crates.io-index"
1274checksum = "6b0ca1155a9ecc25aa12e8313a119f32edf0255fea2f44839c4ac0a12b2ac157"
1275dependencies = [
1276 "libc",
1277]
1278
1279[[package]]
1280name = "memoffset"
1281version = "0.9.1"
1282source = "registry+https://github.com/rust-lang/crates.io-index"
1283checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
1284dependencies = [
1285 "autocfg",
1286]
1287
1288[[package]]
1289name = "metal"
1290version = "0.29.0"
1291source = "registry+https://github.com/rust-lang/crates.io-index"
1292checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21"
1293dependencies = [
1294 "bitflags 2.13.2",
1295 "block",
1296 "core-graphics-types",
1297 "foreign-types",
1298 "log",
1299 "objc",
1300 "paste",
1301]
1302
1303[[package]]
1304name = "miniz_oxide"
1305version = "0.8.9"
1306source = "registry+https://github.com/rust-lang/crates.io-index"
1307checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
1308dependencies = [
1309 "adler2",
1310 "simd-adler32",
1311]
1312
1313[[package]]
1314name = "miniz_oxide"
1315version = "0.9.1"
1316source = "registry+https://github.com/rust-lang/crates.io-index"
1317checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c"
1318dependencies = [
1319 "adler2",
1320 "simd-adler32",
1321]
1322
1323[[package]]
1324name = "moxcms"
1325version = "0.8.1"
1326source = "registry+https://github.com/rust-lang/crates.io-index"
1327checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b"
1328dependencies = [
1329 "num-traits",
1330 "pxfm",
1331]
1332
1333[[package]]
1334name = "naga"
1335version = "22.1.0"
1336source = "registry+https://github.com/rust-lang/crates.io-index"
1337checksum = "8bd5a652b6faf21496f2cfd88fc49989c8db0825d1f6746b1a71a6ede24a63ad"
1338dependencies = [
1339 "arrayvec",
1340 "bit-set",
1341 "bitflags 2.13.2",
1342 "cfg_aliases 0.1.1",
1343 "codespan-reporting",
1344 "hexf-parse",
1345 "indexmap",
1346 "log",
1347 "rustc-hash 1.1.0",
1348 "spirv",
1349 "termcolor",
1350 "thiserror 1.0.69",
1351 "unicode-xid",
1352]
1353
1354[[package]]
1355name = "ndk"
1356version = "0.9.0"
1357source = "registry+https://github.com/rust-lang/crates.io-index"
1358checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4"
1359dependencies = [
1360 "bitflags 2.13.2",
1361 "jni-sys 0.3.1",
1362 "log",
1363 "ndk-sys 0.6.0+11769913",
1364 "num_enum",
1365 "raw-window-handle",
1366 "thiserror 1.0.69",
1367]
1368
1369[[package]]
1370name = "ndk-context"
1371version = "0.1.1"
1372source = "registry+https://github.com/rust-lang/crates.io-index"
1373checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b"
1374
1375[[package]]
1376name = "ndk-sys"
1377version = "0.5.0+25.2.9519653"
1378source = "registry+https://github.com/rust-lang/crates.io-index"
1379checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691"
1380dependencies = [
1381 "jni-sys 0.3.1",
1382]
1383
1384[[package]]
1385name = "ndk-sys"
1386version = "0.6.0+11769913"
1387source = "registry+https://github.com/rust-lang/crates.io-index"
1388checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873"
1389dependencies = [
1390 "jni-sys 0.3.1",
1391]
1392
1393[[package]]
1394name = "nohash-hasher"
1395version = "0.2.0"
1396source = "registry+https://github.com/rust-lang/crates.io-index"
1397checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451"
1398
1399[[package]]
1400name = "num-traits"
1401version = "0.2.19"
1402source = "registry+https://github.com/rust-lang/crates.io-index"
1403checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
1404dependencies = [
1405 "autocfg",
1406]
1407
1408[[package]]
1409name = "num_enum"
1410version = "0.7.6"
1411source = "registry+https://github.com/rust-lang/crates.io-index"
1412checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26"
1413dependencies = [
1414 "num_enum_derive",
1415 "rustversion",
1416]
1417
1418[[package]]
1419name = "num_enum_derive"
1420version = "0.7.6"
1421source = "registry+https://github.com/rust-lang/crates.io-index"
1422checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8"
1423dependencies = [
1424 "proc-macro-crate",
1425 "proc-macro2",
1426 "quote",
1427 "syn 2.0.119",
1428]
1429
1430[[package]]
1431name = "objc"
1432version = "0.2.7"
1433source = "registry+https://github.com/rust-lang/crates.io-index"
1434checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1"
1435dependencies = [
1436 "malloc_buf",
1437]
1438
1439[[package]]
1440name = "objc-sys"
1441version = "0.3.5"
1442source = "registry+https://github.com/rust-lang/crates.io-index"
1443checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310"
1444
1445[[package]]
1446name = "objc2"
1447version = "0.5.3"
1448source = "registry+https://github.com/rust-lang/crates.io-index"
1449checksum = "19d5490aaf8f1d7cf7688dfa9b0ce07900e168852c45cd2c03f534dfd27cfd0b"
1450dependencies = [
1451 "objc-sys",
1452 "objc2-encode",
1453]
1454
1455[[package]]
1456name = "objc2"
1457version = "0.6.5"
1458source = "registry+https://github.com/rust-lang/crates.io-index"
1459checksum = "08849bbd4767dfae9457696856ae1c84fe4e0281bbe4a7abff2d0e06fb7981f8"
1460dependencies = [
1461 "objc2-encode",
1462]
1463
1464[[package]]
1465name = "objc2-app-kit"
1466version = "0.2.2"
1467source = "registry+https://github.com/rust-lang/crates.io-index"
1468checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff"
1469dependencies = [
1470 "bitflags 2.13.2",
1471 "block2",
1472 "libc",
1473 "objc2 0.5.3",
1474 "objc2-core-data",
1475 "objc2-core-image",
1476 "objc2-foundation 0.2.2",
1477 "objc2-quartz-core",
1478]
1479
1480[[package]]
1481name = "objc2-app-kit"
1482version = "0.3.2"
1483source = "registry+https://github.com/rust-lang/crates.io-index"
1484checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c"
1485dependencies = [
1486 "bitflags 2.13.2",
1487 "objc2 0.6.5",
1488 "objc2-core-foundation",
1489 "objc2-core-graphics",
1490 "objc2-foundation 0.3.2",
1491]
1492
1493[[package]]
1494name = "objc2-cloud-kit"
1495version = "0.2.2"
1496source = "registry+https://github.com/rust-lang/crates.io-index"
1497checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009"
1498dependencies = [
1499 "bitflags 2.13.2",
1500 "block2",
1501 "objc2 0.5.3",
1502 "objc2-core-location",
1503 "objc2-foundation 0.2.2",
1504]
1505
1506[[package]]
1507name = "objc2-contacts"
1508version = "0.2.2"
1509source = "registry+https://github.com/rust-lang/crates.io-index"
1510checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889"
1511dependencies = [
1512 "block2",
1513 "objc2 0.5.3",
1514 "objc2-foundation 0.2.2",
1515]
1516
1517[[package]]
1518name = "objc2-core-data"
1519version = "0.2.2"
1520source = "registry+https://github.com/rust-lang/crates.io-index"
1521checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef"
1522dependencies = [
1523 "bitflags 2.13.2",
1524 "block2",
1525 "objc2 0.5.3",
1526 "objc2-foundation 0.2.2",
1527]
1528
1529[[package]]
1530name = "objc2-core-foundation"
1531version = "0.3.2"
1532source = "registry+https://github.com/rust-lang/crates.io-index"
1533checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536"
1534dependencies = [
1535 "bitflags 2.13.2",
1536 "dispatch2",
1537 "objc2 0.6.5",
1538]
1539
1540[[package]]
1541name = "objc2-core-graphics"
1542version = "0.3.2"
1543source = "registry+https://github.com/rust-lang/crates.io-index"
1544checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807"
1545dependencies = [
1546 "bitflags 2.13.2",
1547 "dispatch2",
1548 "objc2 0.6.5",
1549 "objc2-core-foundation",
1550 "objc2-io-surface",
1551]
1552
1553[[package]]
1554name = "objc2-core-image"
1555version = "0.2.2"
1556source = "registry+https://github.com/rust-lang/crates.io-index"
1557checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80"
1558dependencies = [
1559 "block2",
1560 "objc2 0.5.3",
1561 "objc2-foundation 0.2.2",
1562 "objc2-metal",
1563]
1564
1565[[package]]
1566name = "objc2-core-location"
1567version = "0.2.2"
1568source = "registry+https://github.com/rust-lang/crates.io-index"
1569checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781"
1570dependencies = [
1571 "block2",
1572 "objc2 0.5.3",
1573 "objc2-contacts",
1574 "objc2-foundation 0.2.2",
1575]
1576
1577[[package]]
1578name = "objc2-encode"
1579version = "4.1.0"
1580source = "registry+https://github.com/rust-lang/crates.io-index"
1581checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33"
1582
1583[[package]]
1584name = "objc2-foundation"
1585version = "0.2.2"
1586source = "registry+https://github.com/rust-lang/crates.io-index"
1587checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8"
1588dependencies = [
1589 "bitflags 2.13.2",
1590 "block2",
1591 "dispatch",
1592 "libc",
1593 "objc2 0.5.3",
1594]
1595
1596[[package]]
1597name = "objc2-foundation"
1598version = "0.3.2"
1599source = "registry+https://github.com/rust-lang/crates.io-index"
1600checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272"
1601dependencies = [
1602 "bitflags 2.13.2",
1603 "objc2 0.6.5",
1604 "objc2-core-foundation",
1605]
1606
1607[[package]]
1608name = "objc2-io-surface"
1609version = "0.3.2"
1610source = "registry+https://github.com/rust-lang/crates.io-index"
1611checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d"
1612dependencies = [
1613 "bitflags 2.13.2",
1614 "objc2 0.6.5",
1615 "objc2-core-foundation",
1616]
1617
1618[[package]]
1619name = "objc2-link-presentation"
1620version = "0.2.2"
1621source = "registry+https://github.com/rust-lang/crates.io-index"
1622checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398"
1623dependencies = [
1624 "block2",
1625 "objc2 0.5.3",
1626 "objc2-app-kit 0.2.2",
1627 "objc2-foundation 0.2.2",
1628]
1629
1630[[package]]
1631name = "objc2-metal"
1632version = "0.2.2"
1633source = "registry+https://github.com/rust-lang/crates.io-index"
1634checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6"
1635dependencies = [
1636 "bitflags 2.13.2",
1637 "block2",
1638 "objc2 0.5.3",
1639 "objc2-foundation 0.2.2",
1640]
1641
1642[[package]]
1643name = "objc2-quartz-core"
1644version = "0.2.2"
1645source = "registry+https://github.com/rust-lang/crates.io-index"
1646checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a"
1647dependencies = [
1648 "bitflags 2.13.2",
1649 "block2",
1650 "objc2 0.5.3",
1651 "objc2-foundation 0.2.2",
1652 "objc2-metal",
1653]
1654
1655[[package]]
1656name = "objc2-symbols"
1657version = "0.2.2"
1658source = "registry+https://github.com/rust-lang/crates.io-index"
1659checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc"
1660dependencies = [
1661 "objc2 0.5.3",
1662 "objc2-foundation 0.2.2",
1663]
1664
1665[[package]]
1666name = "objc2-ui-kit"
1667version = "0.2.2"
1668source = "registry+https://github.com/rust-lang/crates.io-index"
1669checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f"
1670dependencies = [
1671 "bitflags 2.13.2",
1672 "block2",
1673 "objc2 0.5.3",
1674 "objc2-cloud-kit",
1675 "objc2-core-data",
1676 "objc2-core-image",
1677 "objc2-core-location",
1678 "objc2-foundation 0.2.2",
1679 "objc2-link-presentation",
1680 "objc2-quartz-core",
1681 "objc2-symbols",
1682 "objc2-uniform-type-identifiers",
1683 "objc2-user-notifications",
1684]
1685
1686[[package]]
1687name = "objc2-uniform-type-identifiers"
1688version = "0.2.2"
1689source = "registry+https://github.com/rust-lang/crates.io-index"
1690checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe"
1691dependencies = [
1692 "block2",
1693 "objc2 0.5.3",
1694 "objc2-foundation 0.2.2",
1695]
1696
1697[[package]]
1698name = "objc2-user-notifications"
1699version = "0.2.2"
1700source = "registry+https://github.com/rust-lang/crates.io-index"
1701checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3"
1702dependencies = [
1703 "bitflags 2.13.2",
1704 "block2",
1705 "objc2 0.5.3",
1706 "objc2-core-location",
1707 "objc2-foundation 0.2.2",
1708]
1709
1710[[package]]
1711name = "once_cell"
1712version = "1.21.4"
1713source = "registry+https://github.com/rust-lang/crates.io-index"
1714checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
1715
1716[[package]]
1717name = "orbclient"
1718version = "0.3.55"
1719source = "registry+https://github.com/rust-lang/crates.io-index"
1720checksum = "5df339f526ea9a60e371768d50efc2f2508c7203290731565d1f7a6f71d21747"
1721dependencies = [
1722 "libc",
1723 "libredox",
1724]
1725
1726[[package]]
1727name = "owned_ttf_parser"
1728version = "0.25.1"
1729source = "registry+https://github.com/rust-lang/crates.io-index"
1730checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b"
1731dependencies = [
1732 "ttf-parser",
1733]
1734
1735[[package]]
1736name = "paperdoll-renderer"
1737version = "0.1.0"
1738dependencies = [
1739 "eframe",
1740 "libloading",
1741]
1742
1743[[package]]
1744name = "parking_lot"
1745version = "0.12.5"
1746source = "registry+https://github.com/rust-lang/crates.io-index"
1747checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a"
1748dependencies = [
1749 "lock_api",
1750 "parking_lot_core",
1751]
1752
1753[[package]]
1754name = "parking_lot_core"
1755version = "0.9.12"
1756source = "registry+https://github.com/rust-lang/crates.io-index"
1757checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
1758dependencies = [
1759 "cfg-if",
1760 "libc",
1761 "redox_syscall 0.5.18",
1762 "smallvec",
1763 "windows-link",
1764]
1765
1766[[package]]
1767name = "paste"
1768version = "1.0.15"
1769source = "registry+https://github.com/rust-lang/crates.io-index"
1770checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
1771
1772[[package]]
1773name = "percent-encoding"
1774version = "2.3.2"
1775source = "registry+https://github.com/rust-lang/crates.io-index"
1776checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
1777
1778[[package]]
1779name = "pin-project"
1780version = "1.1.13"
1781source = "registry+https://github.com/rust-lang/crates.io-index"
1782checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924"
1783dependencies = [
1784 "pin-project-internal",
1785]
1786
1787[[package]]
1788name = "pin-project-internal"
1789version = "1.1.13"
1790source = "registry+https://github.com/rust-lang/crates.io-index"
1791checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b"
1792dependencies = [
1793 "proc-macro2",
1794 "quote",
1795 "syn 2.0.119",
1796]
1797
1798[[package]]
1799name = "pin-project-lite"
1800version = "0.2.17"
1801source = "registry+https://github.com/rust-lang/crates.io-index"
1802checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
1803
1804[[package]]
1805name = "pkg-config"
1806version = "0.3.34"
1807source = "registry+https://github.com/rust-lang/crates.io-index"
1808checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548"
1809
1810[[package]]
1811name = "plain"
1812version = "0.2.3"
1813source = "registry+https://github.com/rust-lang/crates.io-index"
1814checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6"
1815
1816[[package]]
1817name = "png"
1818version = "0.18.1"
1819source = "registry+https://github.com/rust-lang/crates.io-index"
1820checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61"
1821dependencies = [
1822 "bitflags 2.13.2",
1823 "crc32fast",
1824 "fdeflate",
1825 "flate2",
1826 "miniz_oxide 0.8.9",
1827]
1828
1829[[package]]
1830name = "polling"
1831version = "3.11.0"
1832source = "registry+https://github.com/rust-lang/crates.io-index"
1833checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218"
1834dependencies = [
1835 "cfg-if",
1836 "concurrent-queue",
1837 "hermit-abi",
1838 "pin-project-lite",
1839 "rustix 1.1.6",
1840 "windows-sys 0.61.2",
1841]
1842
1843[[package]]
1844name = "potential_utf"
1845version = "0.1.6"
1846source = "registry+https://github.com/rust-lang/crates.io-index"
1847checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661"
1848dependencies = [
1849 "zerovec",
1850]
1851
1852[[package]]
1853name = "presser"
1854version = "0.3.1"
1855source = "registry+https://github.com/rust-lang/crates.io-index"
1856checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa"
1857
1858[[package]]
1859name = "proc-macro-crate"
1860version = "3.5.0"
1861source = "registry+https://github.com/rust-lang/crates.io-index"
1862checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f"
1863dependencies = [
1864 "toml_edit",
1865]
1866
1867[[package]]
1868name = "proc-macro2"
1869version = "1.0.107"
1870source = "registry+https://github.com/rust-lang/crates.io-index"
1871checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9"
1872dependencies = [
1873 "unicode-ident",
1874]
1875
1876[[package]]
1877name = "profiling"
1878version = "1.0.18"
1879source = "registry+https://github.com/rust-lang/crates.io-index"
1880checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5"
1881
1882[[package]]
1883name = "pxfm"
1884version = "0.1.30"
1885source = "registry+https://github.com/rust-lang/crates.io-index"
1886checksum = "d55d956fa96f5ec02be2e13af0e20391a5aa83d6a074e3ad368959d0fab299ea"
1887
1888[[package]]
1889name = "quick-xml"
1890version = "0.41.0"
1891source = "registry+https://github.com/rust-lang/crates.io-index"
1892checksum = "e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1"
1893dependencies = [
1894 "memchr",
1895]
1896
1897[[package]]
1898name = "quote"
1899version = "1.0.47"
1900source = "registry+https://github.com/rust-lang/crates.io-index"
1901checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001"
1902dependencies = [
1903 "proc-macro2",
1904]
1905
1906[[package]]
1907name = "r-efi"
1908version = "5.3.0"
1909source = "registry+https://github.com/rust-lang/crates.io-index"
1910checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
1911
1912[[package]]
1913name = "r-efi"
1914version = "6.0.0"
1915source = "registry+https://github.com/rust-lang/crates.io-index"
1916checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
1917
1918[[package]]
1919name = "raw-window-handle"
1920version = "0.6.2"
1921source = "registry+https://github.com/rust-lang/crates.io-index"
1922checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539"
1923
1924[[package]]
1925name = "redox_syscall"
1926version = "0.4.1"
1927source = "registry+https://github.com/rust-lang/crates.io-index"
1928checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
1929dependencies = [
1930 "bitflags 1.3.2",
1931]
1932
1933[[package]]
1934name = "redox_syscall"
1935version = "0.5.18"
1936source = "registry+https://github.com/rust-lang/crates.io-index"
1937checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"
1938dependencies = [
1939 "bitflags 2.13.2",
1940]
1941
1942[[package]]
1943name = "redox_syscall"
1944version = "0.9.5"
1945source = "registry+https://github.com/rust-lang/crates.io-index"
1946checksum = "580c875845b41ecb1564ad1ae4703044cef774145e3d7a94dc2b3fa7c97868fd"
1947dependencies = [
1948 "bitflags 2.13.2",
1949]
1950
1951[[package]]
1952name = "renderdoc-sys"
1953version = "1.1.0"
1954source = "registry+https://github.com/rust-lang/crates.io-index"
1955checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832"
1956
1957[[package]]
1958name = "rustc-hash"
1959version = "1.1.0"
1960source = "registry+https://github.com/rust-lang/crates.io-index"
1961checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
1962
1963[[package]]
1964name = "rustc-hash"
1965version = "2.1.3"
1966source = "registry+https://github.com/rust-lang/crates.io-index"
1967checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d"
1968
1969[[package]]
1970name = "rustc_version"
1971version = "0.4.1"
1972source = "registry+https://github.com/rust-lang/crates.io-index"
1973checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
1974dependencies = [
1975 "semver",
1976]
1977
1978[[package]]
1979name = "rustix"
1980version = "0.38.44"
1981source = "registry+https://github.com/rust-lang/crates.io-index"
1982checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
1983dependencies = [
1984 "bitflags 2.13.2",
1985 "errno",
1986 "libc",
1987 "linux-raw-sys 0.4.15",
1988 "windows-sys 0.59.0",
1989]
1990
1991[[package]]
1992name = "rustix"
1993version = "1.1.6"
1994source = "registry+https://github.com/rust-lang/crates.io-index"
1995checksum = "e5e76742e5294153d4dde1207dbec5bdd81eef6fabdc0d2118babadabfd858aa"
1996dependencies = [
1997 "bitflags 2.13.2",
1998 "errno",
1999 "libc",
2000 "linux-raw-sys 0.12.1",
2001 "windows-sys 0.61.2",
2002]
2003
2004[[package]]
2005name = "rustversion"
2006version = "1.0.23"
2007source = "registry+https://github.com/rust-lang/crates.io-index"
2008checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f"
2009
2010[[package]]
2011name = "same-file"
2012version = "1.0.6"
2013source = "registry+https://github.com/rust-lang/crates.io-index"
2014checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
2015dependencies = [
2016 "winapi-util",
2017]
2018
2019[[package]]
2020name = "scoped-tls"
2021version = "1.0.1"
2022source = "registry+https://github.com/rust-lang/crates.io-index"
2023checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
2024
2025[[package]]
2026name = "scopeguard"
2027version = "1.2.0"
2028source = "registry+https://github.com/rust-lang/crates.io-index"
2029checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
2030
2031[[package]]
2032name = "semver"
2033version = "1.0.28"
2034source = "registry+https://github.com/rust-lang/crates.io-index"
2035checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd"
2036
2037[[package]]
2038name = "serde"
2039version = "1.0.229"
2040source = "registry+https://github.com/rust-lang/crates.io-index"
2041checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba"
2042dependencies = [
2043 "serde_core",
2044]
2045
2046[[package]]
2047name = "serde_core"
2048version = "1.0.229"
2049source = "registry+https://github.com/rust-lang/crates.io-index"
2050checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48"
2051dependencies = [
2052 "serde_derive",
2053]
2054
2055[[package]]
2056name = "serde_derive"
2057version = "1.0.229"
2058source = "registry+https://github.com/rust-lang/crates.io-index"
2059checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348"
2060dependencies = [
2061 "proc-macro2",
2062 "quote",
2063 "syn 3.0.9",
2064]
2065
2066[[package]]
2067name = "shlex"
2068version = "2.0.1"
2069source = "registry+https://github.com/rust-lang/crates.io-index"
2070checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
2071
2072[[package]]
2073name = "simd-adler32"
2074version = "0.3.10"
2075source = "registry+https://github.com/rust-lang/crates.io-index"
2076checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea"
2077
2078[[package]]
2079name = "simd_cesu8"
2080version = "1.2.0"
2081source = "registry+https://github.com/rust-lang/crates.io-index"
2082checksum = "11031e251abf8611c80f460e19dbdeb54a66db918e49c65a7065b46ac7aec520"
2083dependencies = [
2084 "rustc_version",
2085 "simdutf8",
2086]
2087
2088[[package]]
2089name = "simdutf8"
2090version = "0.1.5"
2091source = "registry+https://github.com/rust-lang/crates.io-index"
2092checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e"
2093
2094[[package]]
2095name = "slab"
2096version = "0.4.12"
2097source = "registry+https://github.com/rust-lang/crates.io-index"
2098checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
2099
2100[[package]]
2101name = "slotmap"
2102version = "1.1.1"
2103source = "registry+https://github.com/rust-lang/crates.io-index"
2104checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038"
2105dependencies = [
2106 "version_check",
2107]
2108
2109[[package]]
2110name = "smallvec"
2111version = "1.16.4"
2112source = "registry+https://github.com/rust-lang/crates.io-index"
2113checksum = "d0d5d4b1981b8bbbb7aed204cae5726d683d5d6ac7e74ec54122ea28f315e7c8"
2114
2115[[package]]
2116name = "smithay-client-toolkit"
2117version = "0.19.2"
2118source = "registry+https://github.com/rust-lang/crates.io-index"
2119checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016"
2120dependencies = [
2121 "bitflags 2.13.2",
2122 "calloop 0.13.0",
2123 "calloop-wayland-source 0.3.0",
2124 "cursor-icon",
2125 "libc",
2126 "log",
2127 "memmap2",
2128 "rustix 0.38.44",
2129 "thiserror 1.0.69",
2130 "wayland-backend",
2131 "wayland-client",
2132 "wayland-csd-frame",
2133 "wayland-cursor",
2134 "wayland-protocols",
2135 "wayland-protocols-wlr",
2136 "wayland-scanner",
2137 "xkeysym",
2138]
2139
2140[[package]]
2141name = "smithay-client-toolkit"
2142version = "0.20.0"
2143source = "registry+https://github.com/rust-lang/crates.io-index"
2144checksum = "0512da38f5e2b31201a93524adb8d3136276fa4fe4aafab4e1f727a82b534cc0"
2145dependencies = [
2146 "bitflags 2.13.2",
2147 "calloop 0.14.5",
2148 "calloop-wayland-source 0.4.1",
2149 "cursor-icon",
2150 "libc",
2151 "log",
2152 "memmap2",
2153 "rustix 1.1.6",
2154 "thiserror 2.0.21",
2155 "wayland-backend",
2156 "wayland-client",
2157 "wayland-csd-frame",
2158 "wayland-cursor",
2159 "wayland-protocols",
2160 "wayland-protocols-experimental",
2161 "wayland-protocols-misc",
2162 "wayland-protocols-wlr",
2163 "wayland-scanner",
2164 "xkeysym",
2165]
2166
2167[[package]]
2168name = "smithay-clipboard"
2169version = "0.7.3"
2170source = "registry+https://github.com/rust-lang/crates.io-index"
2171checksum = "71704c03f739f7745053bde45fa203a46c58d25bc5c4efba1d9a60e9dba81226"
2172dependencies = [
2173 "libc",
2174 "smithay-client-toolkit 0.20.0",
2175 "wayland-backend",
2176]
2177
2178[[package]]
2179name = "smol_str"
2180version = "0.2.2"
2181source = "registry+https://github.com/rust-lang/crates.io-index"
2182checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead"
2183dependencies = [
2184 "serde",
2185]
2186
2187[[package]]
2188name = "spirv"
2189version = "0.3.0+sdk-1.3.268.0"
2190source = "registry+https://github.com/rust-lang/crates.io-index"
2191checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844"
2192dependencies = [
2193 "bitflags 2.13.2",
2194]
2195
2196[[package]]
2197name = "stable_deref_trait"
2198version = "1.2.1"
2199source = "registry+https://github.com/rust-lang/crates.io-index"
2200checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
2201
2202[[package]]
2203name = "static_assertions"
2204version = "1.1.0"
2205source = "registry+https://github.com/rust-lang/crates.io-index"
2206checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
2207
2208[[package]]
2209name = "syn"
2210version = "1.0.109"
2211source = "registry+https://github.com/rust-lang/crates.io-index"
2212checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
2213dependencies = [
2214 "proc-macro2",
2215 "quote",
2216 "unicode-ident",
2217]
2218
2219[[package]]
2220name = "syn"
2221version = "2.0.119"
2222source = "registry+https://github.com/rust-lang/crates.io-index"
2223checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297"
2224dependencies = [
2225 "proc-macro2",
2226 "quote",
2227 "unicode-ident",
2228]
2229
2230[[package]]
2231name = "syn"
2232version = "3.0.9"
2233source = "registry+https://github.com/rust-lang/crates.io-index"
2234checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b"
2235dependencies = [
2236 "proc-macro2",
2237 "quote",
2238 "unicode-ident",
2239]
2240
2241[[package]]
2242name = "synstructure"
2243version = "0.14.0"
2244source = "registry+https://github.com/rust-lang/crates.io-index"
2245checksum = "901704edd0dfe137f1987838ee4f259e4e063c31371bdb423f7ae38ec6f77f02"
2246dependencies = [
2247 "proc-macro2",
2248 "quote",
2249 "syn 3.0.9",
2250]
2251
2252[[package]]
2253name = "termcolor"
2254version = "1.4.1"
2255source = "registry+https://github.com/rust-lang/crates.io-index"
2256checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755"
2257dependencies = [
2258 "winapi-util",
2259]
2260
2261[[package]]
2262name = "thiserror"
2263version = "1.0.69"
2264source = "registry+https://github.com/rust-lang/crates.io-index"
2265checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
2266dependencies = [
2267 "thiserror-impl 1.0.69",
2268]
2269
2270[[package]]
2271name = "thiserror"
2272version = "2.0.21"
2273source = "registry+https://github.com/rust-lang/crates.io-index"
2274checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e"
2275dependencies = [
2276 "thiserror-impl 2.0.21",
2277]
2278
2279[[package]]
2280name = "thiserror-impl"
2281version = "1.0.69"
2282source = "registry+https://github.com/rust-lang/crates.io-index"
2283checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
2284dependencies = [
2285 "proc-macro2",
2286 "quote",
2287 "syn 2.0.119",
2288]
2289
2290[[package]]
2291name = "thiserror-impl"
2292version = "2.0.21"
2293source = "registry+https://github.com/rust-lang/crates.io-index"
2294checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524"
2295dependencies = [
2296 "proc-macro2",
2297 "quote",
2298 "syn 3.0.9",
2299]
2300
2301[[package]]
2302name = "tinystr"
2303version = "0.8.5"
2304source = "registry+https://github.com/rust-lang/crates.io-index"
2305checksum = "abc840c238154d58f9e86b2792261edfde565a17696e1cda1a449de27979801a"
2306dependencies = [
2307 "displaydoc",
2308 "zerovec",
2309]
2310
2311[[package]]
2312name = "tokio"
2313version = "1.54.1"
2314source = "registry+https://github.com/rust-lang/crates.io-index"
2315checksum = "b52fd3255258d26fac7264ab5a76b53c13367136dc011d3d6ad4f8ed070396a3"
2316dependencies = [
2317 "pin-project-lite",
2318]
2319
2320[[package]]
2321name = "toml_datetime"
2322version = "1.1.3+spec-1.1.0"
2323source = "registry+https://github.com/rust-lang/crates.io-index"
2324checksum = "173f25c883cd2176a2d8212155638c0a60d484a9d84546d270866f40f56b6e49"
2325dependencies = [
2326 "serde_core",
2327]
2328
2329[[package]]
2330name = "toml_edit"
2331version = "0.25.19+spec-1.1.0"
2332source = "registry+https://github.com/rust-lang/crates.io-index"
2333checksum = "dd43688c4858d7264ae1cf9a9f874a67c3feb74a883b1cd7bebd6a4ea8307218"
2334dependencies = [
2335 "indexmap",
2336 "toml_datetime",
2337 "toml_parser",
2338 "winnow",
2339]
2340
2341[[package]]
2342name = "toml_parser"
2343version = "1.1.5+spec-1.1.0"
2344source = "registry+https://github.com/rust-lang/crates.io-index"
2345checksum = "baa693a8032d7e1cada7d0041e96126df243179ff061456783ac7f12bda4744c"
2346dependencies = [
2347 "winnow",
2348]
2349
2350[[package]]
2351name = "tracing"
2352version = "0.1.44"
2353source = "registry+https://github.com/rust-lang/crates.io-index"
2354checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
2355dependencies = [
2356 "log",
2357 "pin-project-lite",
2358 "tracing-core",
2359]
2360
2361[[package]]
2362name = "tracing-core"
2363version = "0.1.36"
2364source = "registry+https://github.com/rust-lang/crates.io-index"
2365checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"
2366
2367[[package]]
2368name = "ttf-parser"
2369version = "0.25.1"
2370source = "registry+https://github.com/rust-lang/crates.io-index"
2371checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31"
2372
2373[[package]]
2374name = "type-map"
2375version = "0.5.1"
2376source = "registry+https://github.com/rust-lang/crates.io-index"
2377checksum = "cb30dbbd9036155e74adad6812e9898d03ec374946234fbcebd5dfc7b9187b90"
2378dependencies = [
2379 "rustc-hash 2.1.3",
2380]
2381
2382[[package]]
2383name = "unicode-ident"
2384version = "1.0.27"
2385source = "registry+https://github.com/rust-lang/crates.io-index"
2386checksum = "a2c754d6c33795a1c324727428e5a7dedb5b06195f9890bdbcba760d3e246563"
2387
2388[[package]]
2389name = "unicode-segmentation"
2390version = "1.13.3"
2391source = "registry+https://github.com/rust-lang/crates.io-index"
2392checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8"
2393
2394[[package]]
2395name = "unicode-width"
2396version = "0.1.14"
2397source = "registry+https://github.com/rust-lang/crates.io-index"
2398checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af"
2399
2400[[package]]
2401name = "unicode-xid"
2402version = "0.2.6"
2403source = "registry+https://github.com/rust-lang/crates.io-index"
2404checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
2405
2406[[package]]
2407name = "url"
2408version = "2.5.8"
2409source = "registry+https://github.com/rust-lang/crates.io-index"
2410checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed"
2411dependencies = [
2412 "form_urlencoded",
2413 "idna",
2414 "percent-encoding",
2415 "serde",
2416]
2417
2418[[package]]
2419name = "utf8_iter"
2420version = "1.1.0"
2421source = "registry+https://github.com/rust-lang/crates.io-index"
2422checksum = "af3bd9d3e571c26fcce9d033b87ea5ab061b8d2ffe9b7a5675d810d68f03edf0"
2423dependencies = [
2424 "utf_types",
2425]
2426
2427[[package]]
2428name = "utf_types"
2429version = "1.0.0"
2430source = "registry+https://github.com/rust-lang/crates.io-index"
2431checksum = "3a3b425286980a367278453f3b6d28cdcb134b574e5a35824a6ff5eebad50bb6"
2432
2433[[package]]
2434name = "version_check"
2435version = "0.9.5"
2436source = "registry+https://github.com/rust-lang/crates.io-index"
2437checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
2438
2439[[package]]
2440name = "walkdir"
2441version = "2.5.0"
2442source = "registry+https://github.com/rust-lang/crates.io-index"
2443checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
2444dependencies = [
2445 "same-file",
2446 "winapi-util",
2447]
2448
2449[[package]]
2450name = "wasip2"
2451version = "1.0.4+wasi-0.2.12"
2452source = "registry+https://github.com/rust-lang/crates.io-index"
2453checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487"
2454dependencies = [
2455 "wit-bindgen",
2456]
2457
2458[[package]]
2459name = "wasm-bindgen"
2460version = "0.2.130"
2461source = "registry+https://github.com/rust-lang/crates.io-index"
2462checksum = "a0181c14ddd6c7b8b0b0132a5f1ea2f32be0d893cd3ea97b6e3b28886b8a3d1c"
2463dependencies = [
2464 "cfg-if",
2465 "rustversion",
2466 "wasm-bindgen-macro",
2467 "wasm-bindgen-shared",
2468]
2469
2470[[package]]
2471name = "wasm-bindgen-futures"
2472version = "0.4.80"
2473source = "registry+https://github.com/rust-lang/crates.io-index"
2474checksum = "5e14e0327cb5368ad60ccb22d04a9827a693c95a926d8d125e9fa39e0baec501"
2475dependencies = [
2476 "js-sys",
2477 "tokio",
2478 "wasm-bindgen",
2479]
2480
2481[[package]]
2482name = "wasm-bindgen-macro"
2483version = "0.2.130"
2484source = "registry+https://github.com/rust-lang/crates.io-index"
2485checksum = "6e931a02a39abdbf66966fc35902b5ed58344750a70885bed4ebb3d8eaf28ed9"
2486dependencies = [
2487 "quote",
2488 "wasm-bindgen-macro-support",
2489]
2490
2491[[package]]
2492name = "wasm-bindgen-macro-support"
2493version = "0.2.130"
2494source = "registry+https://github.com/rust-lang/crates.io-index"
2495checksum = "2ca4b54280e455bd831e33a6b8e734baf432fe63fbc35c42ac14ce67a043a53a"
2496dependencies = [
2497 "bumpalo",
2498 "proc-macro2",
2499 "quote",
2500 "syn 3.0.9",
2501 "wasm-bindgen-shared",
2502]
2503
2504[[package]]
2505name = "wasm-bindgen-shared"
2506version = "0.2.130"
2507source = "registry+https://github.com/rust-lang/crates.io-index"
2508checksum = "3b1f9c3798725016c6ee5f2f57869ec0831e8bbc0ab0310a86e787e97f41389e"
2509dependencies = [
2510 "unicode-ident",
2511]
2512
2513[[package]]
2514name = "wayland-backend"
2515version = "0.3.17"
2516source = "registry+https://github.com/rust-lang/crates.io-index"
2517checksum = "38a91b4eaddff87b1cd1074985e3713da4af2c49742d1b356b2c01670a67a078"
2518dependencies = [
2519 "cc",
2520 "downcast-rs",
2521 "rustix 1.1.6",
2522 "scoped-tls",
2523 "smallvec",
2524 "wayland-sys",
2525]
2526
2527[[package]]
2528name = "wayland-client"
2529version = "0.31.15"
2530source = "registry+https://github.com/rust-lang/crates.io-index"
2531checksum = "e3c36a0f861ad76d0901f2800b46321410d9f73f2ea88aac0650d86c32688073"
2532dependencies = [
2533 "bitflags 2.13.2",
2534 "rustix 1.1.6",
2535 "wayland-backend",
2536 "wayland-scanner",
2537]
2538
2539[[package]]
2540name = "wayland-csd-frame"
2541version = "0.3.0"
2542source = "registry+https://github.com/rust-lang/crates.io-index"
2543checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e"
2544dependencies = [
2545 "bitflags 2.13.2",
2546 "cursor-icon",
2547 "wayland-backend",
2548]
2549
2550[[package]]
2551name = "wayland-cursor"
2552version = "0.31.14"
2553source = "registry+https://github.com/rust-lang/crates.io-index"
2554checksum = "4a52d18780be9b1314328a3de5f930b73d2200112e3849ca6cb11822793fb34d"
2555dependencies = [
2556 "rustix 1.1.6",
2557 "wayland-client",
2558 "xcursor",
2559]
2560
2561[[package]]
2562name = "wayland-protocols"
2563version = "0.32.13"
2564source = "registry+https://github.com/rust-lang/crates.io-index"
2565checksum = "23d0c813de3daa2ed6520af85a3bd49b0e722a3078506899aa9686fea58dc4b6"
2566dependencies = [
2567 "bitflags 2.13.2",
2568 "wayland-backend",
2569 "wayland-client",
2570 "wayland-scanner",
2571]
2572
2573[[package]]
2574name = "wayland-protocols-experimental"
2575version = "20250721.0.1"
2576source = "registry+https://github.com/rust-lang/crates.io-index"
2577checksum = "40a1f863128dcaaec790d7b4b396cc9b9a7a079e878e18c47e6c2d2c5a8dcbb1"
2578dependencies = [
2579 "bitflags 2.13.2",
2580 "wayland-backend",
2581 "wayland-client",
2582 "wayland-protocols",
2583 "wayland-scanner",
2584]
2585
2586[[package]]
2587name = "wayland-protocols-misc"
2588version = "0.3.12"
2589source = "registry+https://github.com/rust-lang/crates.io-index"
2590checksum = "6e9567599ef23e09b8dad6e429e5738d4509dfc46b3b21f32841a304d16b29c8"
2591dependencies = [
2592 "bitflags 2.13.2",
2593 "wayland-backend",
2594 "wayland-client",
2595 "wayland-protocols",
2596 "wayland-scanner",
2597]
2598
2599[[package]]
2600name = "wayland-protocols-plasma"
2601version = "0.3.12"
2602source = "registry+https://github.com/rust-lang/crates.io-index"
2603checksum = "2b6d8cf1eb2c1c31ed1f5643c88a6e53538129d4af80030c8cabd1f9fa884d91"
2604dependencies = [
2605 "bitflags 2.13.2",
2606 "wayland-backend",
2607 "wayland-client",
2608 "wayland-protocols",
2609 "wayland-scanner",
2610]
2611
2612[[package]]
2613name = "wayland-protocols-wlr"
2614version = "0.3.12"
2615source = "registry+https://github.com/rust-lang/crates.io-index"
2616checksum = "eb04e52f7836d7c7976c78ca0250d61e33873c34156a2a1fc9474828ec268234"
2617dependencies = [
2618 "bitflags 2.13.2",
2619 "wayland-backend",
2620 "wayland-client",
2621 "wayland-protocols",
2622 "wayland-scanner",
2623]
2624
2625[[package]]
2626name = "wayland-scanner"
2627version = "0.31.11"
2628source = "registry+https://github.com/rust-lang/crates.io-index"
2629checksum = "338e30461b3a2b67d70eb30a6d89f8e0c93a833e07d2ae89085cd070c4a00ac0"
2630dependencies = [
2631 "proc-macro2",
2632 "quick-xml",
2633 "quote",
2634]
2635
2636[[package]]
2637name = "wayland-sys"
2638version = "0.31.11"
2639source = "registry+https://github.com/rust-lang/crates.io-index"
2640checksum = "d8eab23fefc9e41f8e841df4a9c707e8a8c4ed26e944ef69297184de2785e3be"
2641dependencies = [
2642 "dlib",
2643 "log",
2644 "once_cell",
2645 "pkg-config",
2646]
2647
2648[[package]]
2649name = "web-sys"
2650version = "0.3.107"
2651source = "registry+https://github.com/rust-lang/crates.io-index"
2652checksum = "d7d179596ff5ec0f6de4db64d54011bde6289cc49603d3a6e4ce3f329207ab88"
2653dependencies = [
2654 "js-sys",
2655 "wasm-bindgen",
2656]
2657
2658[[package]]
2659name = "web-time"
2660version = "1.1.0"
2661source = "registry+https://github.com/rust-lang/crates.io-index"
2662checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb"
2663dependencies = [
2664 "js-sys",
2665 "wasm-bindgen",
2666]
2667
2668[[package]]
2669name = "webbrowser"
2670version = "1.2.6"
2671source = "registry+https://github.com/rust-lang/crates.io-index"
2672checksum = "fe8d20d0214027baf11b8b0cc307c1da7657d8f4db9aa956f7de27a6fb1acbd5"
2673dependencies = [
2674 "jni",
2675 "log",
2676 "ndk-context",
2677 "objc2 0.6.5",
2678 "objc2-app-kit 0.3.2",
2679 "objc2-foundation 0.3.2",
2680 "url",
2681 "web-sys",
2682]
2683
2684[[package]]
2685name = "wgpu"
2686version = "22.1.0"
2687source = "registry+https://github.com/rust-lang/crates.io-index"
2688checksum = "e1d1c4ba43f80542cf63a0a6ed3134629ae73e8ab51e4b765a67f3aa062eb433"
2689dependencies = [
2690 "arrayvec",
2691 "cfg_aliases 0.1.1",
2692 "document-features",
2693 "js-sys",
2694 "log",
2695 "parking_lot",
2696 "profiling",
2697 "raw-window-handle",
2698 "smallvec",
2699 "static_assertions",
2700 "wasm-bindgen",
2701 "wasm-bindgen-futures",
2702 "web-sys",
2703 "wgpu-core",
2704 "wgpu-hal",
2705 "wgpu-types",
2706]
2707
2708[[package]]
2709name = "wgpu-core"
2710version = "22.1.0"
2711source = "registry+https://github.com/rust-lang/crates.io-index"
2712checksum = "0348c840d1051b8e86c3bcd31206080c5e71e5933dabd79be1ce732b0b2f089a"
2713dependencies = [
2714 "arrayvec",
2715 "bit-vec",
2716 "bitflags 2.13.2",
2717 "cfg_aliases 0.1.1",
2718 "document-features",
2719 "indexmap",
2720 "log",
2721 "naga",
2722 "once_cell",
2723 "parking_lot",
2724 "profiling",
2725 "raw-window-handle",
2726 "rustc-hash 1.1.0",
2727 "smallvec",
2728 "thiserror 1.0.69",
2729 "wgpu-hal",
2730 "wgpu-types",
2731]
2732
2733[[package]]
2734name = "wgpu-hal"
2735version = "22.0.0"
2736source = "registry+https://github.com/rust-lang/crates.io-index"
2737checksum = "f6bbf4b4de8b2a83c0401d9e5ae0080a2792055f25859a02bf9be97952bbed4f"
2738dependencies = [
2739 "android_system_properties",
2740 "arrayvec",
2741 "ash",
2742 "bitflags 2.13.2",
2743 "cfg_aliases 0.1.1",
2744 "core-graphics-types",
2745 "glow 0.13.1",
2746 "glutin_wgl_sys",
2747 "gpu-alloc",
2748 "gpu-allocator",
2749 "gpu-descriptor",
2750 "hassle-rs",
2751 "js-sys",
2752 "khronos-egl",
2753 "libc",
2754 "libloading",
2755 "log",
2756 "metal",
2757 "naga",
2758 "ndk-sys 0.5.0+25.2.9519653",
2759 "objc",
2760 "once_cell",
2761 "parking_lot",
2762 "profiling",
2763 "raw-window-handle",
2764 "renderdoc-sys",
2765 "rustc-hash 1.1.0",
2766 "smallvec",
2767 "thiserror 1.0.69",
2768 "wasm-bindgen",
2769 "web-sys",
2770 "wgpu-types",
2771 "winapi",
2772]
2773
2774[[package]]
2775name = "wgpu-types"
2776version = "22.0.0"
2777source = "registry+https://github.com/rust-lang/crates.io-index"
2778checksum = "bc9d91f0e2c4b51434dfa6db77846f2793149d8e73f800fa2e41f52b8eac3c5d"
2779dependencies = [
2780 "bitflags 2.13.2",
2781 "js-sys",
2782 "web-sys",
2783]
2784
2785[[package]]
2786name = "widestring"
2787version = "1.2.1"
2788source = "registry+https://github.com/rust-lang/crates.io-index"
2789checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471"
2790
2791[[package]]
2792name = "winapi"
2793version = "0.3.9"
2794source = "registry+https://github.com/rust-lang/crates.io-index"
2795checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
2796dependencies = [
2797 "winapi-i686-pc-windows-gnu",
2798 "winapi-x86_64-pc-windows-gnu",
2799]
2800
2801[[package]]
2802name = "winapi-i686-pc-windows-gnu"
2803version = "0.4.0"
2804source = "registry+https://github.com/rust-lang/crates.io-index"
2805checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
2806
2807[[package]]
2808name = "winapi-util"
2809version = "0.1.11"
2810source = "registry+https://github.com/rust-lang/crates.io-index"
2811checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
2812dependencies = [
2813 "windows-sys 0.61.2",
2814]
2815
2816[[package]]
2817name = "winapi-x86_64-pc-windows-gnu"
2818version = "0.4.0"
2819source = "registry+https://github.com/rust-lang/crates.io-index"
2820checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
2821
2822[[package]]
2823name = "windows"
2824version = "0.52.0"
2825source = "registry+https://github.com/rust-lang/crates.io-index"
2826checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be"
2827dependencies = [
2828 "windows-core",
2829 "windows-targets",
2830]
2831
2832[[package]]
2833name = "windows-core"
2834version = "0.52.0"
2835source = "registry+https://github.com/rust-lang/crates.io-index"
2836checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
2837dependencies = [
2838 "windows-targets",
2839]
2840
2841[[package]]
2842name = "windows-link"
2843version = "0.2.1"
2844source = "registry+https://github.com/rust-lang/crates.io-index"
2845checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
2846
2847[[package]]
2848name = "windows-sys"
2849version = "0.52.0"
2850source = "registry+https://github.com/rust-lang/crates.io-index"
2851checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
2852dependencies = [
2853 "windows-targets",
2854]
2855
2856[[package]]
2857name = "windows-sys"
2858version = "0.59.0"
2859source = "registry+https://github.com/rust-lang/crates.io-index"
2860checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
2861dependencies = [
2862 "windows-targets",
2863]
2864
2865[[package]]
2866name = "windows-sys"
2867version = "0.61.2"
2868source = "registry+https://github.com/rust-lang/crates.io-index"
2869checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
2870dependencies = [
2871 "windows-link",
2872]
2873
2874[[package]]
2875name = "windows-targets"
2876version = "0.52.6"
2877source = "registry+https://github.com/rust-lang/crates.io-index"
2878checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
2879dependencies = [
2880 "windows_aarch64_gnullvm",
2881 "windows_aarch64_msvc",
2882 "windows_i686_gnu",
2883 "windows_i686_gnullvm",
2884 "windows_i686_msvc",
2885 "windows_x86_64_gnu",
2886 "windows_x86_64_gnullvm",
2887 "windows_x86_64_msvc",
2888]
2889
2890[[package]]
2891name = "windows_aarch64_gnullvm"
2892version = "0.52.6"
2893source = "registry+https://github.com/rust-lang/crates.io-index"
2894checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
2895
2896[[package]]
2897name = "windows_aarch64_msvc"
2898version = "0.52.6"
2899source = "registry+https://github.com/rust-lang/crates.io-index"
2900checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
2901
2902[[package]]
2903name = "windows_i686_gnu"
2904version = "0.52.6"
2905source = "registry+https://github.com/rust-lang/crates.io-index"
2906checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
2907
2908[[package]]
2909name = "windows_i686_gnullvm"
2910version = "0.52.6"
2911source = "registry+https://github.com/rust-lang/crates.io-index"
2912checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
2913
2914[[package]]
2915name = "windows_i686_msvc"
2916version = "0.52.6"
2917source = "registry+https://github.com/rust-lang/crates.io-index"
2918checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
2919
2920[[package]]
2921name = "windows_x86_64_gnu"
2922version = "0.52.6"
2923source = "registry+https://github.com/rust-lang/crates.io-index"
2924checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
2925
2926[[package]]
2927name = "windows_x86_64_gnullvm"
2928version = "0.52.6"
2929source = "registry+https://github.com/rust-lang/crates.io-index"
2930checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
2931
2932[[package]]
2933name = "windows_x86_64_msvc"
2934version = "0.52.6"
2935source = "registry+https://github.com/rust-lang/crates.io-index"
2936checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
2937
2938[[package]]
2939name = "winit"
2940version = "0.30.13"
2941source = "registry+https://github.com/rust-lang/crates.io-index"
2942checksum = "a6755fa58a9f8350bd1e472d4c3fcc25f824ec358933bba33306d0b63df5978d"
2943dependencies = [
2944 "ahash",
2945 "android-activity",
2946 "atomic-waker",
2947 "bitflags 2.13.2",
2948 "block2",
2949 "bytemuck",
2950 "calloop 0.13.0",
2951 "cfg_aliases 0.2.2",
2952 "concurrent-queue",
2953 "core-foundation",
2954 "core-graphics",
2955 "cursor-icon",
2956 "dpi",
2957 "js-sys",
2958 "libc",
2959 "memmap2",
2960 "ndk",
2961 "objc2 0.5.3",
2962 "objc2-app-kit 0.2.2",
2963 "objc2-foundation 0.2.2",
2964 "objc2-ui-kit",
2965 "orbclient",
2966 "percent-encoding",
2967 "pin-project",
2968 "raw-window-handle",
2969 "redox_syscall 0.4.1",
2970 "rustix 0.38.44",
2971 "smithay-client-toolkit 0.19.2",
2972 "smol_str",
2973 "tracing",
2974 "unicode-segmentation",
2975 "wasm-bindgen",
2976 "wasm-bindgen-futures",
2977 "wayland-backend",
2978 "wayland-client",
2979 "wayland-protocols",
2980 "wayland-protocols-plasma",
2981 "web-sys",
2982 "web-time",
2983 "windows-sys 0.52.0",
2984 "x11-dl",
2985 "x11rb",
2986 "xkbcommon-dl",
2987]
2988
2989[[package]]
2990name = "winnow"
2991version = "1.0.5"
2992source = "registry+https://github.com/rust-lang/crates.io-index"
2993checksum = "8c3b93199df0ab874cdf0c6a94f0a0dc3423fe41f1cafb62b8bd7b1deb277aef"
2994dependencies = [
2995 "memchr",
2996]
2997
2998[[package]]
2999name = "wit-bindgen"
3000version = "0.57.1"
3001source = "registry+https://github.com/rust-lang/crates.io-index"
3002checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e"
3003
3004[[package]]
3005name = "writeable"
3006version = "0.6.4"
3007source = "registry+https://github.com/rust-lang/crates.io-index"
3008checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc"
3009
3010[[package]]
3011name = "x11-dl"
3012version = "2.21.0"
3013source = "registry+https://github.com/rust-lang/crates.io-index"
3014checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f"
3015dependencies = [
3016 "libc",
3017 "once_cell",
3018 "pkg-config",
3019]
3020
3021[[package]]
3022name = "x11rb"
3023version = "0.13.2"
3024source = "registry+https://github.com/rust-lang/crates.io-index"
3025checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414"
3026dependencies = [
3027 "as-raw-xcb-connection",
3028 "gethostname",
3029 "libc",
3030 "libloading",
3031 "once_cell",
3032 "rustix 1.1.6",
3033 "x11rb-protocol",
3034]
3035
3036[[package]]
3037name = "x11rb-protocol"
3038version = "0.13.2"
3039source = "registry+https://github.com/rust-lang/crates.io-index"
3040checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd"
3041
3042[[package]]
3043name = "xcursor"
3044version = "0.3.11"
3045source = "registry+https://github.com/rust-lang/crates.io-index"
3046checksum = "163b33ed8786455e2fa5d72f554057ce3f3182425434f756cd39c99839d88e23"
3047
3048[[package]]
3049name = "xkbcommon-dl"
3050version = "0.4.2"
3051source = "registry+https://github.com/rust-lang/crates.io-index"
3052checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5"
3053dependencies = [
3054 "bitflags 2.13.2",
3055 "dlib",
3056 "log",
3057 "once_cell",
3058 "xkeysym",
3059]
3060
3061[[package]]
3062name = "xkeysym"
3063version = "0.2.1"
3064source = "registry+https://github.com/rust-lang/crates.io-index"
3065checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56"
3066
3067[[package]]
3068name = "xml-rs"
3069version = "0.8.29"
3070source = "registry+https://github.com/rust-lang/crates.io-index"
3071checksum = "e450f9b2ed1dff33c94c12589a87338689467b9c4f5d8a5710bd09a847d2c8a7"
3072
3073[[package]]
3074name = "yoke"
3075version = "0.8.4"
3076source = "registry+https://github.com/rust-lang/crates.io-index"
3077checksum = "417ef3fcf6c300b7dbd25c85531a746931c02ad536f3cf4786ed1e88223340b3"
3078dependencies = [
3079 "stable_deref_trait",
3080 "yoke-derive",
3081 "zerofrom",
3082]
3083
3084[[package]]
3085name = "yoke-derive"
3086version = "0.8.4"
3087source = "registry+https://github.com/rust-lang/crates.io-index"
3088checksum = "ec8ebde2db3681e8c9980cc27822030e68752690ddfa9473e739aeb4dbde6d71"
3089dependencies = [
3090 "proc-macro2",
3091 "quote",
3092 "syn 3.0.9",
3093 "synstructure",
3094]
3095
3096[[package]]
3097name = "zerocopy"
3098version = "0.8.63"
3099source = "registry+https://github.com/rust-lang/crates.io-index"
3100checksum = "e5fe1f8f1b06191a00962174c61aa5005e0bb391a6d80d07e24d115c01a92ed8"
3101dependencies = [
3102 "zerocopy-derive",
3103]
3104
3105[[package]]
3106name = "zerocopy-derive"
3107version = "0.8.63"
3108source = "registry+https://github.com/rust-lang/crates.io-index"
3109checksum = "863ad3ac83293fb4d740aedbfdc9240dd8d1a50c1099acd76ce80ce7c7230c7f"
3110dependencies = [
3111 "proc-macro2",
3112 "quote",
3113 "syn 2.0.119",
3114]
3115
3116[[package]]
3117name = "zerofrom"
3118version = "0.1.8"
3119source = "registry+https://github.com/rust-lang/crates.io-index"
3120checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272"
3121dependencies = [
3122 "zerofrom-derive",
3123]
3124
3125[[package]]
3126name = "zerofrom-derive"
3127version = "0.1.8"
3128source = "registry+https://github.com/rust-lang/crates.io-index"
3129checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a"
3130dependencies = [
3131 "proc-macro2",
3132 "quote",
3133 "syn 3.0.9",
3134 "synstructure",
3135]
3136
3137[[package]]
3138name = "zerotrie"
3139version = "0.2.5"
3140source = "registry+https://github.com/rust-lang/crates.io-index"
3141checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f"
3142dependencies = [
3143 "displaydoc",
3144 "yoke",
3145 "zerofrom",
3146]
3147
3148[[package]]
3149name = "zerovec"
3150version = "0.11.9"
3151source = "registry+https://github.com/rust-lang/crates.io-index"
3152checksum = "f58a2799cfe9a1670c7ea8edbd52ef8edb93cb37a7f83bf31ba9e35d9dae6a40"
3153dependencies = [
3154 "yoke",
3155 "zerofrom",
3156 "zerovec-derive",
3157]
3158
3159[[package]]
3160name = "zerovec-derive"
3161version = "0.11.7"
3162source = "registry+https://github.com/rust-lang/crates.io-index"
3163checksum = "c3743ddbf47738d929cd1ae2e199d40d0162979dfe31aef8ae646d2bf00bf97a"
3164dependencies = [
3165 "proc-macro2",
3166 "quote",
3167 "syn 3.0.9",
3168]
3169
3170[[package]]
3171name = "zlib-rs"
3172version = "0.6.8"
3173source = "registry+https://github.com/rust-lang/crates.io-index"
3174checksum = "b268e58e7c693d7c271f93ffc4ba3b380412554231c85bf61ca7af91042a4112"
Cargo.toml added +11 −0
@@ -0,0 +1,11 @@
1 [package]
2 name = "paperdoll-renderer"
3 version = "0.1.0"
4 edition = "2021"
5 license = "MIT"
6 publish = false
7 description = "Foundation shell for the Paperdoll Renderer. Import and rendering are not implemented."
8
9 [dependencies]
10 eframe = { version = "0.29.1", default-features = false, features = ["default_fonts", "glow", "x11"] }
11 libloading = "0.8"
@@ -0,0 +1,11 @@
1[package]
2name = "paperdoll-renderer"
3version = "0.1.0"
4edition = "2021"
5license = "MIT"
6publish = false
7description = "Foundation shell for the Paperdoll Renderer. Import and rendering are not implemented."
8
9[dependencies]
10eframe = { version = "0.29.1", default-features = false, features = ["default_fonts", "glow", "x11"] }
11libloading = "0.8"
LICENSE added +21 −0
@@ -0,0 +1,21 @@
1 MIT License
2
3 Copyright (c) 2026 Tim Falken
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.
@@ -0,0 +1,21 @@
1MIT License
2
3Copyright (c) 2026 Tim Falken
4
5Permission is hereby granted, free of charge, to any person obtaining a copy
6of this software and associated documentation files (the "Software"), to deal
7in the Software without restriction, including without limitation the rights
8to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9copies of the Software, and to permit persons to whom the Software is
10furnished to do so, subject to the following conditions:
11
12The above copyright notice and this permission notice shall be included in all
13copies or substantial portions of the Software.
14
15THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21SOFTWARE.
README.md +40 −2
@@ -1,3 +1,41 @@
1 # New repo
1 # Paperdoll Renderer
2 2
3 This repo was created by a Cursor cloud agent.
3 Native Rust-projectbasis voor Tim Falkens Paperdoll Renderer. Het programma toont een statusvenster. Het importeert geen modellen en het rendert geen paperdolls. Het ontwerp, inclusief de letterlijke Nederlandse specificatie en de formaatmatrix voor OBJ+MTL+textures, FBX en glTF/GLB, staat in [`design.md`](design.md).
4
5 ## Eisen
6
7 - Rust 1.96.0 (vastgezet in `rust-toolchain.toml`; hetzelfde image als de publieke posprint-pipeline, `rust:1.96-bookworm`)
8 - Een X11-display voor het venster
9 - Voor compileren: `pkg-config`, `libxcb1-dev`, `libx11-dev`, `libxkbcommon-dev`, `libxkbcommon-x11-dev`, `libgl1-mesa-dev`
10 - Voor het venster zelf: `libxkbcommon-x11-0`, `libxcb1`, `libx11-6`, `libgl1`. Die laadt eframe pas bij het openen. Ontbreken ze, dan stopt het programma met een melding in plaats van een panic.
11
12 ## Lokaal
13
14 ```bash
15 cargo test --locked
16 cargo run -- --status
17 cargo run
18 ```
19
20 `--status` print de capability-lijst en opent geen venster. Een pad naar een model wordt geweigerd.
21
22 ## Wat deze build niet doet
23
24 OBJ+MTL+textures, FBX, glTF/GLB, skeletanimatie, de 3D-attachmenteditor, paperdoll-render en de 2D-preview zijn niet gebouwd. Bestanden onder `tests/fixtures/`, als die er later bijkomen, worden door dit programma niet geladen.
25
26 ## BlueGit
27
28 De pipeline staat in `blue-ci-cd.yml`. Tests draaien op merge requests en op pushes naar `master`, `main` en `CI_DEFAULT_BRANCH`. Op een tag-push, na geslaagde tests: AppImage, Ubuntu-pakket, Arch-pakket, Windows-zip, daarna een controle, daarna één release-aanroep.
29
30 Die release-aanroep is de gedocumenteerde BlueGit-API (`POST /repos/$CI_PROJECT_PATH/releases`). Die API maakt de git-tag zelf. Bestaat de tag al, dan antwoordt de huidige BlueGit-code met HTTP 409. `replace: true` wordt op een tag-pipeline geweigerd (HTTP 403). Een tag-pipeline kan de eigen tag dus niet als release vullen. `scripts/ci/release.sh` doet de aanroep toch en faalt bij een niet-2xx-antwoord. Er is vanuit deze basis geen tag en geen release gestart.
31
32 `timfa/legacy-cycles` heeft alleen publieke releases; het pipelinebestand was niet te lezen. De gebruikte YAML komt uit de BlueGit-CI-specificatie en uit de publieke pipelines van `timfa/posprint`, `timfa/minecart-trains` en `timfa/click-tween`.
33
34 Pakketten lokaal, zonder publiceren:
35
36 ```bash
37 bash scripts/package/deb.sh
38 bash scripts/package/appimage.sh
39 ```
40
41 Op deze machine zijn het `.deb`-pakket en de AppImage gebouwd. `paperdoll-renderer --status` via de AppImage geeft dezelfde status als de gewone binary. Het Arch-pakket heeft `makepkg` nodig en de Windows-zip de MinGW-crosscompiler; die twee builds zijn hier niet gedraaid.
@@ -1,3 +1,41 @@
1# New repo
1# Paperdoll Renderer
2
2
3This repo was created by a Cursor cloud agent.
3Native Rust-projectbasis voor Tim Falkens Paperdoll Renderer. Het programma toont een statusvenster. Het importeert geen modellen en het rendert geen paperdolls. Het ontwerp, inclusief de letterlijke Nederlandse specificatie en de formaatmatrix voor OBJ+MTL+textures, FBX en glTF/GLB, staat in [`design.md`](design.md).
4
5## Eisen
6
7- Rust 1.96.0 (vastgezet in `rust-toolchain.toml`; hetzelfde image als de publieke posprint-pipeline, `rust:1.96-bookworm`)
8- Een X11-display voor het venster
9- Voor compileren: `pkg-config`, `libxcb1-dev`, `libx11-dev`, `libxkbcommon-dev`, `libxkbcommon-x11-dev`, `libgl1-mesa-dev`
10- Voor het venster zelf: `libxkbcommon-x11-0`, `libxcb1`, `libx11-6`, `libgl1`. Die laadt eframe pas bij het openen. Ontbreken ze, dan stopt het programma met een melding in plaats van een panic.
11
12## Lokaal
13
14```bash
15cargo test --locked
16cargo run -- --status
17cargo run
18```
19
20`--status` print de capability-lijst en opent geen venster. Een pad naar een model wordt geweigerd.
21
22## Wat deze build niet doet
23
24OBJ+MTL+textures, FBX, glTF/GLB, skeletanimatie, de 3D-attachmenteditor, paperdoll-render en de 2D-preview zijn niet gebouwd. Bestanden onder `tests/fixtures/`, als die er later bijkomen, worden door dit programma niet geladen.
25
26## BlueGit
27
28De pipeline staat in `blue-ci-cd.yml`. Tests draaien op merge requests en op pushes naar `master`, `main` en `CI_DEFAULT_BRANCH`. Op een tag-push, na geslaagde tests: AppImage, Ubuntu-pakket, Arch-pakket, Windows-zip, daarna een controle, daarna één release-aanroep.
29
30Die release-aanroep is de gedocumenteerde BlueGit-API (`POST /repos/$CI_PROJECT_PATH/releases`). Die API maakt de git-tag zelf. Bestaat de tag al, dan antwoordt de huidige BlueGit-code met HTTP 409. `replace: true` wordt op een tag-pipeline geweigerd (HTTP 403). Een tag-pipeline kan de eigen tag dus niet als release vullen. `scripts/ci/release.sh` doet de aanroep toch en faalt bij een niet-2xx-antwoord. Er is vanuit deze basis geen tag en geen release gestart.
31
32`timfa/legacy-cycles` heeft alleen publieke releases; het pipelinebestand was niet te lezen. De gebruikte YAML komt uit de BlueGit-CI-specificatie en uit de publieke pipelines van `timfa/posprint`, `timfa/minecart-trains` en `timfa/click-tween`.
33
34Pakketten lokaal, zonder publiceren:
35
36```bash
37bash scripts/package/deb.sh
38bash scripts/package/appimage.sh
39```
40
41Op deze machine zijn het `.deb`-pakket en de AppImage gebouwd. `paperdoll-renderer --status` via de AppImage geeft dezelfde status als de gewone binary. Het Arch-pakket heeft `makepkg` nodig en de Windows-zip de MinGW-crosscompiler; die twee builds zijn hier niet gedraaid.
blue-ci-cd.yml added +164 −0
@@ -0,0 +1,164 @@
1 # Paperdoll Renderer — BlueGit CI (git.timfalken.com).
2 #
3 # Syntax checked on 6 November 2026 against GET /api/v1/ci/spec,
4 # timfa/bluegit docs/CI.md, and the public pipelines of timfa/posprint,
5 # timfa/minecart-trains and timfa/click-tween. legacy-cycles publishes
6 # releases only; its pipeline file is not public and was not copied.
7 #
8 # Requested graph:
9 # merge request and master/main push -> test
10 # tag push, after tests succeed -> AppImage, Ubuntu package, Arch package,
11 # Windows build, artifact check, then one release publish
12 #
13 # Verified release limit: POST /repos/$CI_PROJECT_PATH/releases creates the
14 # git tag. opPublishRelease returns 409 when that tag already exists.
15 # replace=true is rejected on a tag pipeline (403, checkReplace). scripts/ci/release.sh
16 # still performs the documented call and fails on a non-2xx response. This
17 # file does not create a tag by itself. No release has been started here.
18 #
19 # posprint notes two runner facts used below: jobs start in the checkout
20 # (CI_PROJECT_DIR is not set), and artifact paths are exact files.
21 # Windows is cross-compiled with MinGW, the same reason posprint gives:
22 # no Windows runner on BlueGit.
23
24 stages: [test, package, verify, release]
25
26 variables:
27 CARGO_TERM_COLOR: always
28 RUST_BACKTRACE: "1"
29 CARGO_PROFILE_DEV_DEBUG: "false"
30 CARGO_PROFILE_TEST_DEBUG: "false"
31
32 workflow:
33 rules:
34 - if: $CI_PIPELINE_SOURCE == "merge_request_event"
35 - if: $CI_COMMIT_BRANCH == "master"
36 - if: $CI_COMMIT_BRANCH == "main"
37 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
38 - if: $CI_COMMIT_TAG != ""
39
40 .rust:
41 image: rust:1.96-bookworm
42 timeout: 2h
43 before_script:
44 - export CARGO_HOME="$PWD/cargo-home"
45 - export PATH="$CARGO_HOME/bin:$PATH"
46 - apt-get update -qq
47 - apt-get install -y -qq pkg-config libxcb1-dev libx11-dev libxkbcommon-dev libxkbcommon-x11-dev libgl1-mesa-dev python3
48
49 .on_tag:
50 rules:
51 - if: $CI_COMMIT_TAG != ""
52
53 test:
54 extends: .rust
55 stage: test
56 interruptible: true
57 cache:
58 key: cargo-test
59 paths: [target/, cargo-home/]
60 rules:
61 - if: $CI_PIPELINE_SOURCE == "merge_request_event"
62 - if: $CI_COMMIT_BRANCH == "master"
63 - if: $CI_COMMIT_BRANCH == "main"
64 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
65 - if: $CI_COMMIT_TAG != ""
66 script:
67 - cargo fmt --check
68 - cargo check --workspace --all-targets --locked
69 - cargo clippy --workspace --all-targets --locked -- -D warnings
70 - cargo test --workspace --locked
71
72 package:appimage:
73 extends: [.rust, .on_tag]
74 stage: package
75 needs: [test]
76 interruptible: true
77 cache:
78 key: cargo-linux
79 paths: [target/, cargo-home/]
80 before_script:
81 - export CARGO_HOME="$PWD/cargo-home"
82 - export PATH="$CARGO_HOME/bin:$PATH"
83 - apt-get update -qq
84 - apt-get install -y -qq pkg-config libxcb1-dev libx11-dev libxkbcommon-dev libxkbcommon-x11-dev libgl1-mesa-dev file
85 script:
86 - bash scripts/package/appimage.sh
87 artifacts:
88 paths: [dist/paperdoll-renderer-x86_64.AppImage]
89 expire_in: 30d
90
91 package:ubuntu:
92 extends: [.rust, .on_tag]
93 stage: package
94 needs: [test]
95 interruptible: true
96 cache:
97 key: cargo-linux
98 paths: [target/, cargo-home/]
99 before_script:
100 - export CARGO_HOME="$PWD/cargo-home"
101 - export PATH="$CARGO_HOME/bin:$PATH"
102 - apt-get update -qq
103 - apt-get install -y -qq pkg-config libxcb1-dev libx11-dev libxkbcommon-dev libxkbcommon-x11-dev libgl1-mesa-dev dpkg-dev
104 script:
105 - bash scripts/package/deb.sh
106 artifacts:
107 paths: [dist/paperdoll-renderer_amd64.deb]
108 expire_in: 30d
109
110 package:arch:
111 extends: .on_tag
112 stage: package
113 image: archlinux/archlinux:base-devel
114 timeout: 2h
115 needs: [test]
116 interruptible: true
117 script:
118 - pacman -Syu --noconfirm
119 - pacman -S --noconfirm --needed rust pkgconf libxkbcommon libxcb libx11 libglvnd git
120 - bash scripts/package/arch.sh
121 artifacts:
122 paths: [dist/paperdoll-renderer-x86_64.pkg.tar.zst]
123 expire_in: 30d
124
125 # MinGW cross build. posprint documents this because BlueGit has no Windows runner.
126 package:windows:
127 extends: [.rust, .on_tag]
128 stage: package
129 needs: [test]
130 interruptible: true
131 cache:
132 key: cargo-windows
133 paths: [target/, cargo-home/]
134 before_script:
135 - export CARGO_HOME="$PWD/cargo-home"
136 - export PATH="$CARGO_HOME/bin:$PATH"
137 - apt-get update -qq
138 - apt-get install -y -qq gcc-mingw-w64-x86-64 binutils-mingw-w64-x86-64 zip
139 - rustup target add x86_64-pc-windows-gnu
140 script:
141 - bash scripts/package/windows.sh
142 artifacts:
143 paths: [dist/paperdoll-renderer-windows-x86_64.zip]
144 expire_in: 30d
145
146 verify:packages:
147 stage: verify
148 image: bluegit/base
149 extends: .on_tag
150 needs: [package:appimage, package:ubuntu, package:arch, package:windows]
151 script:
152 - bash scripts/ci/verify-packages.sh
153 artifacts:
154 paths: [dist/SHA256SUMS]
155 expire_in: 30d
156
157 release:
158 stage: release
159 image: bluegit/base
160 extends: .on_tag
161 needs: [verify:packages, package:appimage, package:ubuntu, package:arch, package:windows]
162 resource_group: release
163 script:
164 - bash scripts/ci/release.sh
@@ -0,0 +1,164 @@
1# Paperdoll Renderer — BlueGit CI (git.timfalken.com).
2#
3# Syntax checked on 6 November 2026 against GET /api/v1/ci/spec,
4# timfa/bluegit docs/CI.md, and the public pipelines of timfa/posprint,
5# timfa/minecart-trains and timfa/click-tween. legacy-cycles publishes
6# releases only; its pipeline file is not public and was not copied.
7#
8# Requested graph:
9# merge request and master/main push -> test
10# tag push, after tests succeed -> AppImage, Ubuntu package, Arch package,
11# Windows build, artifact check, then one release publish
12#
13# Verified release limit: POST /repos/$CI_PROJECT_PATH/releases creates the
14# git tag. opPublishRelease returns 409 when that tag already exists.
15# replace=true is rejected on a tag pipeline (403, checkReplace). scripts/ci/release.sh
16# still performs the documented call and fails on a non-2xx response. This
17# file does not create a tag by itself. No release has been started here.
18#
19# posprint notes two runner facts used below: jobs start in the checkout
20# (CI_PROJECT_DIR is not set), and artifact paths are exact files.
21# Windows is cross-compiled with MinGW, the same reason posprint gives:
22# no Windows runner on BlueGit.
23
24stages: [test, package, verify, release]
25
26variables:
27 CARGO_TERM_COLOR: always
28 RUST_BACKTRACE: "1"
29 CARGO_PROFILE_DEV_DEBUG: "false"
30 CARGO_PROFILE_TEST_DEBUG: "false"
31
32workflow:
33 rules:
34 - if: $CI_PIPELINE_SOURCE == "merge_request_event"
35 - if: $CI_COMMIT_BRANCH == "master"
36 - if: $CI_COMMIT_BRANCH == "main"
37 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
38 - if: $CI_COMMIT_TAG != ""
39
40.rust:
41 image: rust:1.96-bookworm
42 timeout: 2h
43 before_script:
44 - export CARGO_HOME="$PWD/cargo-home"
45 - export PATH="$CARGO_HOME/bin:$PATH"
46 - apt-get update -qq
47 - apt-get install -y -qq pkg-config libxcb1-dev libx11-dev libxkbcommon-dev libxkbcommon-x11-dev libgl1-mesa-dev python3
48
49.on_tag:
50 rules:
51 - if: $CI_COMMIT_TAG != ""
52
53test:
54 extends: .rust
55 stage: test
56 interruptible: true
57 cache:
58 key: cargo-test
59 paths: [target/, cargo-home/]
60 rules:
61 - if: $CI_PIPELINE_SOURCE == "merge_request_event"
62 - if: $CI_COMMIT_BRANCH == "master"
63 - if: $CI_COMMIT_BRANCH == "main"
64 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
65 - if: $CI_COMMIT_TAG != ""
66 script:
67 - cargo fmt --check
68 - cargo check --workspace --all-targets --locked
69 - cargo clippy --workspace --all-targets --locked -- -D warnings
70 - cargo test --workspace --locked
71
72package:appimage:
73 extends: [.rust, .on_tag]
74 stage: package
75 needs: [test]
76 interruptible: true
77 cache:
78 key: cargo-linux
79 paths: [target/, cargo-home/]
80 before_script:
81 - export CARGO_HOME="$PWD/cargo-home"
82 - export PATH="$CARGO_HOME/bin:$PATH"
83 - apt-get update -qq
84 - apt-get install -y -qq pkg-config libxcb1-dev libx11-dev libxkbcommon-dev libxkbcommon-x11-dev libgl1-mesa-dev file
85 script:
86 - bash scripts/package/appimage.sh
87 artifacts:
88 paths: [dist/paperdoll-renderer-x86_64.AppImage]
89 expire_in: 30d
90
91package:ubuntu:
92 extends: [.rust, .on_tag]
93 stage: package
94 needs: [test]
95 interruptible: true
96 cache:
97 key: cargo-linux
98 paths: [target/, cargo-home/]
99 before_script:
100 - export CARGO_HOME="$PWD/cargo-home"
101 - export PATH="$CARGO_HOME/bin:$PATH"
102 - apt-get update -qq
103 - apt-get install -y -qq pkg-config libxcb1-dev libx11-dev libxkbcommon-dev libxkbcommon-x11-dev libgl1-mesa-dev dpkg-dev
104 script:
105 - bash scripts/package/deb.sh
106 artifacts:
107 paths: [dist/paperdoll-renderer_amd64.deb]
108 expire_in: 30d
109
110package:arch:
111 extends: .on_tag
112 stage: package
113 image: archlinux/archlinux:base-devel
114 timeout: 2h
115 needs: [test]
116 interruptible: true
117 script:
118 - pacman -Syu --noconfirm
119 - pacman -S --noconfirm --needed rust pkgconf libxkbcommon libxcb libx11 libglvnd git
120 - bash scripts/package/arch.sh
121 artifacts:
122 paths: [dist/paperdoll-renderer-x86_64.pkg.tar.zst]
123 expire_in: 30d
124
125# MinGW cross build. posprint documents this because BlueGit has no Windows runner.
126package:windows:
127 extends: [.rust, .on_tag]
128 stage: package
129 needs: [test]
130 interruptible: true
131 cache:
132 key: cargo-windows
133 paths: [target/, cargo-home/]
134 before_script:
135 - export CARGO_HOME="$PWD/cargo-home"
136 - export PATH="$CARGO_HOME/bin:$PATH"
137 - apt-get update -qq
138 - apt-get install -y -qq gcc-mingw-w64-x86-64 binutils-mingw-w64-x86-64 zip
139 - rustup target add x86_64-pc-windows-gnu
140 script:
141 - bash scripts/package/windows.sh
142 artifacts:
143 paths: [dist/paperdoll-renderer-windows-x86_64.zip]
144 expire_in: 30d
145
146verify:packages:
147 stage: verify
148 image: bluegit/base
149 extends: .on_tag
150 needs: [package:appimage, package:ubuntu, package:arch, package:windows]
151 script:
152 - bash scripts/ci/verify-packages.sh
153 artifacts:
154 paths: [dist/SHA256SUMS]
155 expire_in: 30d
156
157release:
158 stage: release
159 image: bluegit/base
160 extends: .on_tag
161 needs: [verify:packages, package:appimage, package:ubuntu, package:arch, package:windows]
162 resource_group: release
163 script:
164 - bash scripts/ci/release.sh
design.md added +260 −0
@@ -0,0 +1,260 @@
1 # Paperdoll Renderer — design
2
3 **Status: design recorded with a foundation shell only.**
4 Prepared 6 November 2026 (Europe/Amsterdam). Requirements originate with Tim Falken. Sections explicitly marked **proposal** remain implementation decisions to validate; the verbatim appendix is authoritative for user intent. The Rust program shipped with this design is the section 12 step 0 shell: it compiles, opens a status window, and tells the truth about what is not built. It does not import models and it does not render paperdolls. Synthetic test bodies, when present under `tests/fixtures/bodies/`, are fixtures for later features; this program does not load them.
5
6 Anonymous HTTP requests to `https://git.timfalken.com/groups/golden-age` and `https://git.timfalken.com/golden-age/paperdoll-renderer` returned 404. BlueGit also answers 404 when a private project is not visible to the caller, so those responses do not prove the private repository is absent. This workspace does not create the group or the repository. The requested BlueGit destination stays group **Golden Age**, slug `golden-age`, repository **Paperdoll Renderer**, slug `paperdoll-renderer`.
7
8 ## 1. Product, scope and non-goals
9
10 Build a native Rust desktop asset-authoring application for rendering animated human bodies and bone-attached equipment into aligned 2D paperdoll PNG sequences. A project contains male and female source models, their imported animation inventories, equipment presets, render settings, output paths and output metadata. Either model slot may remain empty while authoring. Missing models must be reported before a render starts, not replaced by invented characters.
11
12 The application has three distinct experiences: a project/model workspace, an interactive **3D attachment editor**, and a **rendered 2D paperdoll preview**. The latter must consume actual exported maps; it must not disguise a 3D viewport as a finished sprite renderer.
13
14 The later game character-renderer/controller is OUT OF SCOPE. The in-tool compositing preview is in scope because it verifies asset compatibility. No bundled commercial models, automatic retargeting, physics-based cloth, equipment deformation/weight painting, game controllers or multiplayer are promised. Equipment is initially rigid geometry attached to bones. Imported skinned equipment can be a later explicitly scoped extension.
15
16 BlueGit destination requested: group **Golden Age**, proposed slug `golden-age`; repository **Paperdoll Renderer**, slug `paperdoll-renderer`. Check existence before creating either. Private visibility is a provisional safe default, not a claim about an existing group's settings. Do not change unrelated group/repository access.
17
18 ## 2. Requirements and traceability
19
20 | ID | Requirement | Verification |
21 |---|---|---|
22 | R01 | Rust application with user-selected male/female models | Open/save missing and populated slots; later manual desktop smoke test |
23 | R02 | Discover all supported embedded animation clips | Synthetic licensed fixture inventory, including unnamed/duplicate clips |
24 | R03 | Body and equipment modes | Export body plus isolated equipment from identical scene state |
25 | R04 | Three pitches times twelve yaw positions | Exactly 36 unique orientations; yaw starts facing viewer |
26 | R05 | Initial geometry render at 8x target dimensions and configured FPS | Explicit render manifest and dimension/frame-count tests |
27 | R06 | Edge/detail-guided downsampling | Image fixtures retain thin details better than baseline without alpha fringes |
28 | R07 | Target-resolution diffuse, depth, normal maps | Round-trip decoding, finite normalized normals and shared depth contract |
29 | R08 | Subtle diffuse edge highlights from depth/normals | Deterministic fixture with bounded highlight effect |
30 | R09 | Required filename structure | Golden path examples plus sanitization/collision tests |
31 | R10 | Bone-relative XYZ position and rotation with live orbitable 3D preview | Transform-chain unit tests and manual viewport test |
32 | R11 | Binary equipment presets embedding models and attachment metadata | Round-trip, version/truncation/resource-limit tests |
33 | R12 | Equipment set name lowercase without spaces | Validation; reject reserved body name and path traversal |
34 | R13 | Equipment-only rendering with shinymap | No body occlusion/write contamination; specular fixture |
35 | R14 | Folder plus .ppd manifest describing assets, presets, outputs | Portable relative paths and safe atomic saves |
36 | R15 | 2D looping animation, sex/equipment/clip selection and 36-angle navigation | State-machine and depth-compositing tests |
37 | R16 | Held light-control buttons rotate continuously in degrees | Delta-time tests including key/button release/focus loss |
38 | R17 | Per-feature branch, tests, non-FF master merge, no initial MRs | Two-parent merge topology and CI checks |
39 | R18 | Tag tests gate AppImage, deb, Arch package, Windows build and release | Packaging smoke tests and complete-artifact release gate |
40 | R19 | Minimum import goals OBJ/MTL/textures and FBX; broader support where feasible | Format matrix and fixture-based import tests |
41
42 ## 3. Proposed architecture and stack
43
44 **Proposal, not compatibility certification:** use Bevy for windowing, scene graph, skeletal animation, glTF loading and GPU rendering (wgpu), with a compatible bevy_egui integration for authoring panels. Choose and pin compatible published versions when implementation starts; do not guess latest-version APIs or dependency compatibility. Use ordinary Rust libraries with no GUI/GPU requirements for project validation, naming, render schedules, transforms and image processing. Tests for this core must run headlessly.
45
46 A dependency-minimal executable skeleton may precede the full viewport; it must say which capabilities are unimplemented. An application that only prints a placeholder message is not the completed desktop renderer. Rust edition/toolchain must be explicit, version-pinned after confirming installed/build-runner availability. Commit Cargo.lock for reproducibility.
47
48 Proposed workspace boundaries:
49 - `crates/ppd-core`: project types, validation, portable paths, render schedule, filename codec and format versions.
50 - `crates/ppd-import`: import adapters, coordinate normalization, normalized assets and animation discovery.
51 - `crates/ppd-render`: shared camera, scene sampling, offscreen maps and readback.
52 - `crates/ppd-image`: linear-color downsampling, detail extraction, edge highlight and PNG codecs.
53 - `crates/ppd-preview`: deterministic depth compositing and preview/light state independent of UI where possible.
54 - `crates/paperdoll-renderer`: desktop shell, model/preset editors, render progress and preview tabs.
55 - `tests/fixtures`: tiny synthetic or permissively licensed fixtures, with provenance and licenses.
56 - `packaging` and `scripts`: verified platform packaging and CI helpers.
57
58 Do not create empty crates solely to imply completion. Establish boundaries as features land. Rendering jobs operate on immutable validated snapshots so editing a project cannot silently change an active batch. Worker messages report progress and cancellation; UI/GPU ownership stays on the appropriate thread.
59
60 ## 4. Import format advice and support matrix
61
62 **Recommendation:** glTF 2.0/GLB is the preferred canonical interchange for animated characters. GLB is convenient for distributing a self-contained body and avoids accidental texture-path breakage. Preserve original sources and conversion/import provenance. OBJ and FBX are minimum product goals, not necessarily native Bevy capabilities. A Bevy glTF loader must not be advertised as an FBX or OBJ loader.
63
64 | Format | Mesh | Materials/textures | Skeleton | Animation | Intended role / status |
65 |---|---|---|---|---|---|
66 | glTF 2.0 .gltf/.glb | Yes | PBR metallic/roughness and referenced/embedded textures | Skins/joints | Node/skeletal clips; morph support must be tested | Preferred character and equipment path; native Bevy glTF adapter planned |
67 | OBJ + MTL + texture files | Yes | MTL subset with explicit conversion and relative textures | No | No skeletal clips | Required static equipment/import preview; cannot by itself satisfy animated body requirement |
68 | FBX ASCII/binary | Yes | Varies; embedded/external textures and legacy material conversion | Commonly | Commonly multiple clips/takes | Required adapter/conversion path with compatibility fixtures; never claim universal FBX fidelity |
69 | Collada .dae | Usually | Adapter-dependent | Possible | Possible | Optional Assimp-backed candidate, not guaranteed until fixtures pass |
70 | PLY / STL | Static geometry | PLY colors possible; STL no conventional textures | No | No | Optional static equipment only; low priority |
71 | .blend | Not a portable interchange contract | Requires Blender/version matching | Possible through export | Possible through export | No direct minimum support; explicit external export to GLB preferred |
72
73 FBX/OBJ adapter decision remains **open**: evaluate Assimp via maintained Rust bindings (e.g. russimp, native Assimp build dependency), dedicated format loaders, or explicit Blender conversion. Assimp offers a broad-format normalization route but its Rust binding/native ABI, packaging, material conversion, skin weights and animation correctness must be proven on Linux AND Windows. A native library must be bundled/licensed correctly or statically linked where permitted. Do not silently require an installed Blender; if used as an optional converter, show the requirement and invoke it only after explicit user selection. Avoid a heavyweight runtime dependency when an in-process adapter passes tests.
74
75 Import normalizes axes, handedness, units, winding, inverse-bind matrices and texture color spaces ONCE, then retains conversion metadata. Detect singular transforms, invalid weights, missing bones/textures and unsupported materials. Imported file paths and embedded archives are untrusted: no traversal, arbitrary script execution or unbounded decompression. Keep parse limits and import failure diagnostics.
76
77 OBJ bodies can be displayed as static geometry, but must not pretend to have a skeleton or the requested animations. A UI must clearly disable unavailable bone/clip features. Separate equipment geometry from body rig; bone matching uses stable joint identity/path, not only an ambiguous display name.
78
79 Format acceptance gate: fixtures cover mesh topology, alpha materials, normal maps, external relative texture paths, one animated skinned body, multiple clips, bone-local transforms, malformed files and missing resources. A green fixture does not certify every exporter dialect.
80
81 ## 5. .ppd project and asset ownership
82
83 **Proposal:** `.ppd` is a versioned UTF-8 JSON manifest in a project directory, with `format_version`, project identifier, display name, optional male/female model references, import transforms, animation inventory overrides, equipment preset references, render settings, output locations and generated-set metadata. Keep source references and normalized cache separate. Use project-relative paths by default; importing may copy models plus dependencies into `assets/` after user choice. External references need explicit portability warnings and relinking, never silent data loss.
84
85 Suggested layout: `character.ppd`, `assets/body/`, `assets/equipment/`, `presets/`, `cache/`, `renders/`. The .ppd manifest is not the binary equipment preset. Cache is disposable and content-addressed; source and preset files are not. Save through a temporary sibling plus atomic rename, preserve valid previous state on failure, reject unsupported newer schema versions with a useful message. Unknown fields should not be silently discarded on rewrite without a documented migration policy.
86
87 Validate finite numeric values, dimensions > 0, bounded dimensions and memory estimate, positive FPS, valid clip references, existing model/preset paths and output directories distinct from sources. A missing optional sex slot is a valid project, but cannot render that slot. No absolute-path leakage into exported manifests unless user explicitly chooses external references.
88
89 ## 6. Camera, axes, alignment and animation sampling
90
91 Required views: pitches -30, 0, +30 degrees; yaw 0, 30, 60, ..., 330 degrees. **Proposal:** yaw zero means the standardized character front faces the camera, world +Y is up, and positive yaw is defined by a documented right-hand convention. Distinguish camera elevation from model rotation: use orbiting orthographic camera around fixed character origin. Golden orientation fixture must show labelled front/back/left/right to remove ambiguity before production export.
92
93 Use orthographic projection for aligned layering. Shared camera framing, pivot, near/far, canvas size and unit normalization are stored per sex/export set and must match across body/equipment. Determine a stable envelope across selected animations, with configurable margin and equipment allowance. Never independently auto-frame each equipment piece or animation frame. Source-model forward-axis correction is explicit in project import settings.
94
95 **Proposal:** sample looping clips at t=i/FPS for 0 <= i < ceil(duration*FPS), excluding a duplicate terminal sample; validate zero-duration clips and offer a bind/static frame instead. Store actual sample timestamps and duration in output metadata. Root motion is initially in-place with a documented extraction policy; preserve original clips and allow future explicit mode. No interpolation of ordinal frames as though every clip had the same duration.
96
97 The 8x requirement means **8x width AND 8x height**, hence 64x pixel count. FPS controls animation sampling rather than interactive preview performance. Render maps in a bounded streaming pipeline, not all frames in RAM. Estimate disk/GPU/memory cost before starting: frame count times 36 views times map count. Cancellation stops between safe work units and leaves an incomplete marker, never an apparently complete asset set.
98
99 ## 7. Export naming and metadata
100
101 Required schema: `<geslacht>-<settype>-<animatienaam>-<pitch>-<yaw>-<maptype>-f<framenummer>.png`.
102
103 **Proposal:** sex tokens `male` and `female`; body set type exactly `body`; equipment name validated as a lowercase slug without spaces, reject reserved `body`. Use deterministic safe animation slugs plus collision registry preserving original names in a companion manifest. Decide delimiter escaping explicitly: negative pitch creates adjacent hyphens, so parse from the known suffix rather than naive splitting. Example `male-body-walk--30-0-diffuse-f000000.png` corresponds to pitch -30/yaw 0/frame 0. A six-digit frame width is a provisional minimum, not a cap; width and naming are stored in metadata.
104
105 The companion output manifest stores original clip IDs/names, name tokens, timestamps, dimensions, FPS, camera matrices/conventions, shared depth range, normal space, alpha mode, specular convention, render settings/version, source fingerprints and completion status. This metadata supplements rather than replaces the required PNG filenames. Output writes use temporary files and explicit overwrite choice. Sanitize names without creating collisions or interpreting slashes as directories.
106
107 ## 8. Map contracts and rendering algorithm
108
109 Diffuse is an **unlit base color** suitable for later lighting, not an already lit screenshot. Preserve alpha, use sRGB encoding only at output boundaries and process color in linear light. Transparency outside geometry remains zero; distinguish uncovered pixels from valid near-depth pixels.
110
111 Depth **proposal:** 16-bit grayscale PNG representing linear camera-space depth normalized to one shared near/far interval for all compatible layers. Smaller valid values mean nearer the viewer. Use diffuse alpha/coverage as validity; never interpret the transparent background as the closest surface. No per-frame or per-equipment depth rescaling. Record the exact decode equation in metadata. Depth ordering tests must include equipment in front of and behind different body regions.
112
113 Normals **proposal:** view-space geometric/shading normal, xyz encoded from [-1,1] to [0,1] in RGB PNG, with documented image Y convention; normal space must match the preview light transform. Normalize after interpolation/filtering. Uncovered pixels have alpha zero and a neutral placeholder normal. Include tangent-space source normal maps where supported and explicitly test their conversion; a geometry-normal bake is not automatically full source-material normal fidelity.
114
115 Equipment shinymap **proposal:** grayscale scalar specular strength (0..1), with a documented default exponent/roughness in metadata. Filename token `shiny` is provisional because Tim named the concept but did not mandate a token spelling. Metallic/roughness and Phong materials do not map uniquely to one scalar; expose a conservative conversion/default and retain editable overrides. Do not label it physically exact PBR. Body has diffuse/depth/normal; equipment additionally shiny.
116
117 Pipeline per shared scene sample/view:
118 1. Evaluate skeleton and bone world transforms at the exact sample time.
119 2. Render high-resolution unlit color/coverage and geometry buffers at 8x target dimensions. Depth/normals originate from the actual same surfaces, not image luminance.
120 3. Compute an internal detail map using color gradients plus alpha/depth/normal discontinuities, bounded weights and transparent-neighbor handling. Detail map is intermediate, not a fourth body output map.
121 4. Downsample diffuse with deterministic coverage-aware weighted reconstruction in linear premultiplied color; unpremultiply safely for straight-alpha PNG output. Tune thin-feature retention on fixtures, not on a named but unimplemented algorithm.
122 5. Resolve target-resolution depth/normals from coherent contributing surfaces. Avoid mixing background with foreground or averaging front and back depths into nonphysical geometry. Align the chosen representative/coverage policy across maps. Renormalize normals.
123 6. Add a subtle configurable rim/detail accent to diffuse based on normal/depth discontinuities, never a light-direction bake. Clamp magnitude, preserve alpha; default must be validated visually to avoid double-lighting later.
124 7. Encode all target-resolution PNGs atomically and record checksums/metadata. Test deterministic CPU stages independently from GPU tolerance.
125
126 Equipment pass hides the body from **all color, depth, normal and specular writes**, while still evaluating its rig and animating attachments. The body is not an invisible occluder; otherwise equipment behind it would be missing when layers are recomposed. Equipment self-occludes normally. Every layer must use the same projection and absolute depth contract. Hair/alpha cutout versus true blended transparency is an open fidelity decision; initial opaque/cutout support must be stated rather than promising arbitrary multilayer transparency from a single depth value.
127
128 ## 9. Equipment editor and binary presets
129
130 UI selects sex, target skeleton/bone, imported equipment mesh, XYZ translation and XYZ Euler rotation in degrees. **Proposal:** persisted rotation is a quaternion with UI Euler values/order documented; test round-trip and avoid cumulative rotations each frame. Attachment transform is `body_world * animated_bone_world * attachment_local`; clarify inverse-bind usage in importer and test with nonidentity parents. Scale is initially asset import normalization, not an unrequested body-part editor feature.
131
132 Live 3D preview displays body and selected equipment, allows free orbit/zoom and optional animation selection for placement checks. It is separate from the discrete 2D preview. Display a bone tree and highlight unresolved attachments. A preset supports multiple meshes attached to multiple bones, sex flag, stable bone paths, original/import transforms and embedded geometry/material/texture payloads.
133
134 Binary preset **proposal:** magic header, schema version, bounded metadata length and asset count, checksummed entries and compressed payload chunks. Choose a documented serialization/container implementation in the preset feature; do not dump Rust memory layouts. Include rig fingerprint and reject mismatched skeletons with an actionable remapping prompt. Preserve original or normalized embedded asset representation plus license/provenance, protect against decompression bombs and traversal, save atomically. Filename extension for presets remains a proposal; .ppd is reserved for project manifests.
135
136 ## 10. Rendered 2D preview
137
138 Select sex, animation and zero or more compatible equipment sets. Validate same project/rig/export contract and sample inventory. Play actual exported frames on a loop with elapsed-time accumulation; FPS and playback speed are explicit. Missing maps/frames show a diagnostic rather than silently using another animation.
139
140 Left/right controls wrap among twelve yaw values. Up/down selects one of three pitch rows with clamping, not cyclic hidden extra angles. The orientation zero/positive direction agrees with export. Changing angle preserves animation time. Holding light buttons rotates azimuth/elevation continuously in degrees per second using delta time; releasing, focus loss or pointer cancellation stops motion. Clamp elevation/wrap azimuth with clear coordinate convention. These controls are continuous even though model view selection is discrete.
141
142 Depth compositor selects the nearest valid surface per pixel from body and chosen equipment, with stable epsilon/tie-break ordering. Chosen pixel supplies diffuse, normal and shiny from the **same layer**. Blend alpha edges using a documented approximation; single-depth compositing cannot reconstruct arbitrary order-dependent translucent surfaces. A simple ambient + diffuse + specular preview proves maps and lighting; it is not the future game controller. Transform the continuous light into the same view space used by each normal map.
143
144 ## 11. Development workflow, quality and packaging
145
146 Each feature starts on its own `feature/...` branch from current master. Implement its tests and acceptance criteria, run local checks, commit, then `git merge --no-ff` into master and push. No initial-phase MRs. Keep branch/feature and merge SHAs in the coordinator status file, report completion before the next feature. Setup/design may use `feature/project-design`; establish a baseline master commit first if required to obtain a genuine two-parent merge. Never fabricate a merge on an unborn branch.
147
148 CI filename requested: `blue-ci-cd.yml`. **Unverified infrastructure detail:** do not invent BlueGit YAML syntax. Inspect documented BlueGit runner schema and narrow existing `timfa/posprint` and `legacy-cycles` pipeline/release examples before writing configuration. Respect runner/image selection, artifact retention and release API semantics. No GitLab mirror is requested for this new project.
149
150 Tests run on MR events (future-proof despite no current MRs), master pushes AND tags. Quality gates: `cargo fmt --check`, `cargo check --workspace --all-targets --locked`, `cargo clippy --workspace --all-targets --locked -- -D warnings`, `cargo test --workspace --locked`; feature combinations should be covered explicitly when introduced. Pin toolchain/components and package tooling. Core tests require no GPU; separate GPU integration tests may use a supported software adapter, with explicit results rather than silent skip-as-pass.
151
152 Tag pipeline graph: quality/tests → four packaging jobs → artifact verification → one release publish. A failure of ANY required artifact prevents release. Build Linux x86_64 AppImage, Debian/Ubuntu .deb, Arch .pkg.tar.zst and Windows x86_64 .exe in a .zip. Verify target architecture and contents; packaging a Linux binary into a Windows archive is not a build. Prefer native Windows runner when available, or verified mingw target/toolchain with dependency support. AppImage and distribution packages need desktop integration/icon/license, runtime library audit and version mapping from tag to package version. Include checksums and build provenance; signing is optional future work, never invent signatures.
153
154 Release publication uses documented BlueGit release/artifact API and job-scoped least-privilege credentials; no tokens in source/logs/status. All assets attach only after all outputs pass verification, retries are idempotent and do not delete unrelated releases. Distinguish local packaging smoke tests from a real successful tag/release pipeline. **No tag or release is authorized during setup.** A configured future tag trigger is not permission to create a tag now.
155
156 Verified BlueGit behaviour, inspected 6 November 2026, is recorded in section 15. The configured tag pipeline calls that API. With the API as it exists today, publishing the same tag that started the pipeline is rejected. That limit is part of the design record, not a claim that a release was created.
157
158 ## 12. Incremental feature plan and acceptance gates
159
160 0. Foundation/design/CI: group and repo existence checks; private repo; single detailed design.md with verbatim appendix; minimal honest compileable Rust shell; locked dependencies/toolchain; genuine two-parent setup merge; tests and verified CI schema. No claim that rendering/import works. Test packaging scripts locally where possible without publishing.
161 1. Project model and validation: .ppd open/save/new, portable paths, schema/version checks, model slots and render settings; atomic persistence/invalid paths tests.
162 2. Normalized import and animation inventory: glTF/GLB fixtures first, required OBJ+MTL/textures and FBX adapter proof; format-specific truthful UI/errors and skeleton/clip inventories; integration fixture tests before declaring format support.
163 3. Desktop 3D viewport and animation sampling: visible real imported model, orbit, clip controls, source-axis normalization; transform tests and manual visual test.
164 4. Equipment attachments and binary presets: bone tree, sex choice, numeric offsets/rotations, live placement, embedded multi-mesh assets; round-trip and rig mismatch tests.
165 5. Shared batch camera/sampling and raw buffers: 36 views, common framing, 8x geometry output/readback, diffuse/depth/normal alignment; orientation/occlusion fixture before aesthetic postprocessing.
166 6. Production image pipeline: detail-aware downsampling, depth/normal resolve, rim accents, shiny conversion, filename/manifest export, progress/cancel/resume; compare actual output and memory budgets.
167 7. Rendered 2D compositor preview: real exported frames, depth ordering, looping, sex/equipment/clip selection, discrete view controls and continuous held light controls; deterministic state tests and manual lighting test.
168 8. Packaging/hardening: verify all platform packages and install/run behavior, imports with native dependencies, accessibility and failure recovery; actual releases only on later explicit tag authorization.
169
170 Every feature is independently reported and merged non-FF only when its acceptance gate passes. If compatibility or rendering remains untested, name that limitation and do not merge a false completion claim.
171
172 ## 13. Open decisions and risks
173
174 - Confirm target resolution/FPS defaults, output color treatment, root-motion policy, front-axis and positive-yaw convention with a labelled fixture before production content.
175 - FBX exporter variants/native Assimp packaging and skeletal animation fidelity are high-risk; prototype early rather than after UI completion.
176 - Eightfold dimensions impose 64x pixels; support tiling or reject unsupported render sizes with estimates, not GPU crashes.
177 - Shared framing/depth/normal contracts are essential; independently normalized equipment maps cannot be depth-composited correctly.
178 - Alpha-blended materials cannot be fully represented by one surface depth; document cutout/opaque MVP and approximation.
179 - Bone attachment supports rigid equipment, not automatic skinning/retargeting; expose that limit.
180 - glTF PBR/FBX legacy materials to a single shinymap is lossy; retain source metadata and editable conversion settings.
181 - Package version mapping, Windows runner/toolchain and BlueGit group runner availability must be verified, not assumed.
182 - Keep model provenance/licensing with embedded presets; importing assets does not grant redistribution rights.
183
184 ## 14. Research references and verification limits
185
186 - Bevy project and documentation: https://bevy.org/ (preferred-stack proposal; exact dependency versions and API compatibility still require implementation verification).
187 - Assimp repository: https://github.com/assimp/assimp (candidate broad-format import dependency, not universal file compatibility guarantee).
188 - Rust Assimp binding docs inspected: https://docs.rs/russimp/latest/russimp/ (reported russimp 3.2.1 at inspection; no build/compatibility test performed).
189 - glTF specification reference: https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html (canonical interchange recommendation; implementation must test supported subsets).
190 - BlueGit CI specification: `GET https://git.timfalken.com/api/v1/ci/spec` and `docs/CI.md` in `timfa/bluegit` (file name `blue-ci-cd.yml`, job fields, variables, release API).
191 - Working pipelines read in public repositories: `timfa/posprint` `blue-ci-cd.yml` and `scripts/ci/release.sh`; `timfa/minecart-trains` `blue-ci-cd.yml`; `timfa/click-tween` `blue-ci-cd.yml` and `scripts/release.sh`.
192 - Release implementation read in `timfa/bluegit` `internal/server/ops_ci.go` (`opPublishRelease`) and `internal/server/release_replace.go` (`checkReplace`).
193
194 ## 15. Verified BlueGit CI and the release-trigger limit
195
196 Inspected sources, all public on 6 November 2026:
197
198 | Source | What it shows |
199 |---|---|
200 | `GET /api/v1/ci/spec` and `timfa/bluegit` `docs/CI.md` | The pipeline file is `blue-ci-cd.yml`. Jobs may be top-level. `rules` / `only` / `needs` / `artifacts.paths` / `artifacts.expire_in` / `extends` / `resource_group` / `workflow` are real fields. `CI_COMMIT_TAG` is empty on a branch and `CI_COMMIT_BRANCH` is empty on a tag. `CI_JOB_TOKEN` exists only inside a job container. Image presets include `bluegit/base` and `bluegit/rust` (Rust 1.81). Any other image name, such as `rust:1.83-bookworm`, is a normal Docker image. |
201 | `timfa/posprint` `blue-ci-cd.yml` | Tests on merge requests and on `master`. Package jobs use `needs: [test]`. Artifacts are exact file paths, not globs. The release job runs on `master` and calls `POST $CI_API_URL/repos/$CI_PROJECT_PATH/releases` with `Authorization: Bearer $CI_JOB_TOKEN`. Tag pushes are disabled with `if: $CI_COMMIT_TAG != ""` / `when: never`. The comment in that file says tag pipelines must not rebuild old tags. Windows is cross-compiled with MinGW because that comment states there is no Windows runner. |
202 | `timfa/posprint` `scripts/ci/release.sh` | The script says the release API creates the tag itself. It refuses to release when `HEAD` is already tagged. |
203 | `timfa/minecart-trains` `blue-ci-cd.yml` | States the GitLab project used to release on a new tag, and that on BlueGit the release API creates the tag, so tag pushes start no pipeline. |
204 | `timfa/click-tween` `blue-ci-cd.yml` | A tag pipeline may build and verify. The job that publishes the release is manual on `master` and creates the tag through the API. |
205 | `timfa/bluegit` `opPublishRelease` | If the tag already exists and `replace` is not set, the API returns HTTP 409 (`err.tagExists`). `replace: true` is checked by `checkReplace`, which rejects a tag pipeline (`err.replaceRef`, HTTP 403). A tag pipeline therefore cannot attach assets to the tag that started it, and cannot replace that release either. |
206 | `timfa/legacy-cycles` | The project page redirects to releases and says only the releases are public. `GET /api/v1/projects/timfa/legacy-cycles/repository/tree` and the CI file returned 404. The public release assets for v0.0.38 are a Debian package, an Arch `.pkg.tar.zst`, a Windows zip, and Linux tar archives. No AppImage is listed. Its pipeline YAML was not available to copy. |
207
208 Consequences for `blue-ci-cd.yml` in this repository:
209
210 1. Syntax is limited to fields confirmed in the CI spec or in the pipelines above. No GitLab-only keyword is added (`pages`, `spec`, child pipelines, `id_tokens`).
211 2. Tests run for merge-request pipelines, for pushes to `master`, for pushes to `main`, for `CI_DEFAULT_BRANCH`, and for tags. This workspace's default branch is `main`. Tim's existing BlueGit projects use `master`. Covering both avoids a silent skip after the project moves.
212 3. On a tag push the four package jobs run only after `test`, then `verify:packages` checks magic bytes so a Linux executable is not renamed into the Windows zip. `release` needs `verify:packages`, so any failed package skips publication.
213 4. `release` calls the documented POST. The body uses `CI_COMMIT_TAG` and `CI_COMMIT_SHA`, and points each asset at the successful job and exact artifact path. **With today's API that POST returns 409**, because the tag already exists, and `replace: true` is forbidden on a tag pipeline. The job is still the requested publish step; it is not described here as a release that already succeeded. No tag is created by this setup commit.
214 5. Package scripts map a tag `vX.Y.Z` or `X.Y.Z` to package version `X.Y.Z`. Other tag spellings fail the package job instead of inventing a version.
215 6. The Rust image is `rust:1.96-bookworm`. That tag is the one `timfa/posprint` already runs on BlueGit. `rust-toolchain.toml` pins the same compiler, 1.96.0, which was installed here with rustup. The machine default before that pin was 1.83.0. 1.83.0 cannot resolve the current eframe 0.29.1 graph: several transitive crates require edition 2024, which Cargo 1.83 does not parse. `bluegit/rust` is Rust 1.81 on Alpine and is the wrong image for this X11 shell. `bluegit/base` is used for the verify and release jobs, as in posprint.
216 7. posprint states BlueGit does not set `CI_PROJECT_DIR` and that jobs start in the checkout. Scripts use `$PWD`.
217
218 The toolchain is Rust 1.96.0, edition 2021. Edition 2021 remains explicit; the crate does not opt into edition 2024. `Cargo.lock` is committed. `cargo fmt`, `cargo check`, `cargo clippy -D warnings` and `cargo test` are the test job. No GPU test is required for the foundation shell.
219
220 # Appendix A — Tim's original proposal (verbatim)
221
222 The following block preserves the original Dutch text including spelling and filename placeholders. It is not a paraphrase or implementation status.
223
224 ```text
225 Ik heb een idee voor een projectje;
226 Een Paperdoll Renderer.
227
228 Het idee;
229 We importeren twee menselijke 3D-modellen; een man en een vrouw. Die hebben een set animaties, zoals lopen, springen, bukken, aanvallen, blokkeren, geraakt worden, etc. (we lezen gewoon alles uit het model)
230
231 Bij renderen hebben we twee modussen: Karaktermodel, en uitrusting (hier later meer over). Als je rendert, dan hebben we 3*12 posities; 3 pitches (-30 graden, 0 graden, +30 graden), en 12 yaw (beginnend met recht naar de camera kijken en dan steeds een stapje ronddraaien tot we alle hoeken hebben). We renderen die naar PNG's met de naam: <geslacht>-<settype>-<animatienaam>-<pitch>-<yaw>-<maptype>-f<framenummer>.png met een vooringestelde (hoge, acht keer de doelresolutie) resolutie en framerate.
232 We pakken dan die hoge resolutie, en maken een detail-map; dat is effectief een edge-detection algoritme. We schalen de paperdoll dan omlaag naar de doelresolutie, en we gebruiken de detail-map om pixels extra gewicht te geven om te kiezen welke kleur we een pixel geven.
233 Daarna maken we een depth-map op de doelresolutie, en een normal map. (de maptypes in de filename zijn dus: diffuse, depth, normal)
234 Als we de normalmap en depthmap hebben, doen we nog een pass over de diffuse om randen een beetje te highlighten. Daarna slaan we de hele set op volgens het afgesproken naamformat (allemaal op de doelresolutie). Dit is is settype=body.
235
236 Daarna hebben we ook equipment. Je kiest een geslacht, en je moet per lichaamsdeel (op de skeleton van het karaktermodel) een 3D-model kunnen importeren, en op de bone kunnen positioneren. Als je alle modellen van een stuk equipment op de juiste positie gezet hebt, kun je dat opslaan als een preset (binary file met de modellen en posities op bones, alsmede een flag voor of het male of female is). Je kunt hem ook renderen; dan kies je een naam voor je equipment. Die naam is de settype; allemaal lowercase, geen spaties toegestaan. Dit rendert dan nogmaals alles, net als bij de body, alleen is de body dan doorzichtig, waardoor je alleen de equipment-modellen tekent. Equipment heeft ook een shinymap; dat is hoeveel specular een pixel moet hebben voor later bij de renderer.
237
238 De bedoeling is dat we die paperdolls later kunnen gebruiken om een renderer te schrijven. Die gebruikt de diffuse maps en laagt met equipments over elkaar; het gebruikt de depth-map om te bepalen welke pixel van welke map (body of equipment) getekent moet worden (soort z-check), en de normal map om bumpmapping en lighting te tekenen. Dat wordt dan deel van een character-renderer en controller.
239
240 Als stap 1 wil ik graag de paperdoll renderer maken. Ik heb nog geen modellen, die moet ik dus later zelf in het programma kunnen selecteren. Voor positioneren op bones zijn XYZ voor relatieve positie en rotatie voldoende voor nu, met dan een live preview waarop je het lichaam ziet, die je kunt roteren (3D model view, niet de gerenderde plaatjes want die zijn er dan nog niet).
241
242 Wanneer je sets maakt, is dat in een .ppd (PaPerDoll) project; een map met een .ppd file die verteld welke modellen gebruikt worden, welke binary files van equipment sets er zijn, en waar gerenderde output staat.
243 Zo kunnen we ook een preview tab maken; kies een geslacht, kies equipments om te layeren, en kies een animatie. Je ziet dan de animatie op loop spelen (de gerenderde 2D paperdolls), en kunt met pijltjes orbiten (boven, midden, onder, en dan voor links en rechts de 12 rotaties). Ook moet je met knopjes die je ingedrukt kan houden de positie van de lichtbron kunnen roteren. Dat gaat in graden, niet in stappen.
244
245 Stappenplan:
246
247 - Maak een groep op BlueGit: `Golden Age`
248 - Maak de repo, Paperdoll Renderer
249
250 - Documenteer alle bovenstaande, incl. letterlijke tekst van mij, zeer gedetailleerd in een enkele design.md
251 - Bouw dan alle features een voor een in Rust. Elke feature op een nieuwe branch, en als die feature af is, niet-FF mergen naar master (Geen MR's tijdens eerste ontwikkelfase) en door naar de volgende feature. Elke feature krijgt een unit test die we in de CI-CD activeren op een merge request (ook al gebruiken we die nog niet) en op een master push. Een tag push krijgt, als tests slagen, ook een build; AppImage, Ubuntu Package, Arch Package, Windows Build, welke we dan als een release pushen.
252
253 Houd me bij elke feature op de hoogte hoe het gaat.
254 ```
255
256 # Appendix B — Additional import requirement (verbatim)
257
258 ```text
259 Bepaal ook welk 3D-model format goed is; liefst ondersteunen we natuurlijk meerdere. In ieder geval .obj (met mtl en texture) en .fbx, maar hoe meer hoe beter.
260 ```
@@ -0,0 +1,260 @@
1# Paperdoll Renderer — design
2
3**Status: design recorded with a foundation shell only.**
4Prepared 6 November 2026 (Europe/Amsterdam). Requirements originate with Tim Falken. Sections explicitly marked **proposal** remain implementation decisions to validate; the verbatim appendix is authoritative for user intent. The Rust program shipped with this design is the section 12 step 0 shell: it compiles, opens a status window, and tells the truth about what is not built. It does not import models and it does not render paperdolls. Synthetic test bodies, when present under `tests/fixtures/bodies/`, are fixtures for later features; this program does not load them.
5
6Anonymous HTTP requests to `https://git.timfalken.com/groups/golden-age` and `https://git.timfalken.com/golden-age/paperdoll-renderer` returned 404. BlueGit also answers 404 when a private project is not visible to the caller, so those responses do not prove the private repository is absent. This workspace does not create the group or the repository. The requested BlueGit destination stays group **Golden Age**, slug `golden-age`, repository **Paperdoll Renderer**, slug `paperdoll-renderer`.
7
8## 1. Product, scope and non-goals
9
10Build a native Rust desktop asset-authoring application for rendering animated human bodies and bone-attached equipment into aligned 2D paperdoll PNG sequences. A project contains male and female source models, their imported animation inventories, equipment presets, render settings, output paths and output metadata. Either model slot may remain empty while authoring. Missing models must be reported before a render starts, not replaced by invented characters.
11
12The application has three distinct experiences: a project/model workspace, an interactive **3D attachment editor**, and a **rendered 2D paperdoll preview**. The latter must consume actual exported maps; it must not disguise a 3D viewport as a finished sprite renderer.
13
14The later game character-renderer/controller is OUT OF SCOPE. The in-tool compositing preview is in scope because it verifies asset compatibility. No bundled commercial models, automatic retargeting, physics-based cloth, equipment deformation/weight painting, game controllers or multiplayer are promised. Equipment is initially rigid geometry attached to bones. Imported skinned equipment can be a later explicitly scoped extension.
15
16BlueGit destination requested: group **Golden Age**, proposed slug `golden-age`; repository **Paperdoll Renderer**, slug `paperdoll-renderer`. Check existence before creating either. Private visibility is a provisional safe default, not a claim about an existing group's settings. Do not change unrelated group/repository access.
17
18## 2. Requirements and traceability
19
20| ID | Requirement | Verification |
21|---|---|---|
22| R01 | Rust application with user-selected male/female models | Open/save missing and populated slots; later manual desktop smoke test |
23| R02 | Discover all supported embedded animation clips | Synthetic licensed fixture inventory, including unnamed/duplicate clips |
24| R03 | Body and equipment modes | Export body plus isolated equipment from identical scene state |
25| R04 | Three pitches times twelve yaw positions | Exactly 36 unique orientations; yaw starts facing viewer |
26| R05 | Initial geometry render at 8x target dimensions and configured FPS | Explicit render manifest and dimension/frame-count tests |
27| R06 | Edge/detail-guided downsampling | Image fixtures retain thin details better than baseline without alpha fringes |
28| R07 | Target-resolution diffuse, depth, normal maps | Round-trip decoding, finite normalized normals and shared depth contract |
29| R08 | Subtle diffuse edge highlights from depth/normals | Deterministic fixture with bounded highlight effect |
30| R09 | Required filename structure | Golden path examples plus sanitization/collision tests |
31| R10 | Bone-relative XYZ position and rotation with live orbitable 3D preview | Transform-chain unit tests and manual viewport test |
32| R11 | Binary equipment presets embedding models and attachment metadata | Round-trip, version/truncation/resource-limit tests |
33| R12 | Equipment set name lowercase without spaces | Validation; reject reserved body name and path traversal |
34| R13 | Equipment-only rendering with shinymap | No body occlusion/write contamination; specular fixture |
35| R14 | Folder plus .ppd manifest describing assets, presets, outputs | Portable relative paths and safe atomic saves |
36| R15 | 2D looping animation, sex/equipment/clip selection and 36-angle navigation | State-machine and depth-compositing tests |
37| R16 | Held light-control buttons rotate continuously in degrees | Delta-time tests including key/button release/focus loss |
38| R17 | Per-feature branch, tests, non-FF master merge, no initial MRs | Two-parent merge topology and CI checks |
39| R18 | Tag tests gate AppImage, deb, Arch package, Windows build and release | Packaging smoke tests and complete-artifact release gate |
40| R19 | Minimum import goals OBJ/MTL/textures and FBX; broader support where feasible | Format matrix and fixture-based import tests |
41
42## 3. Proposed architecture and stack
43
44**Proposal, not compatibility certification:** use Bevy for windowing, scene graph, skeletal animation, glTF loading and GPU rendering (wgpu), with a compatible bevy_egui integration for authoring panels. Choose and pin compatible published versions when implementation starts; do not guess latest-version APIs or dependency compatibility. Use ordinary Rust libraries with no GUI/GPU requirements for project validation, naming, render schedules, transforms and image processing. Tests for this core must run headlessly.
45
46A dependency-minimal executable skeleton may precede the full viewport; it must say which capabilities are unimplemented. An application that only prints a placeholder message is not the completed desktop renderer. Rust edition/toolchain must be explicit, version-pinned after confirming installed/build-runner availability. Commit Cargo.lock for reproducibility.
47
48Proposed workspace boundaries:
49- `crates/ppd-core`: project types, validation, portable paths, render schedule, filename codec and format versions.
50- `crates/ppd-import`: import adapters, coordinate normalization, normalized assets and animation discovery.
51- `crates/ppd-render`: shared camera, scene sampling, offscreen maps and readback.
52- `crates/ppd-image`: linear-color downsampling, detail extraction, edge highlight and PNG codecs.
53- `crates/ppd-preview`: deterministic depth compositing and preview/light state independent of UI where possible.
54- `crates/paperdoll-renderer`: desktop shell, model/preset editors, render progress and preview tabs.
55- `tests/fixtures`: tiny synthetic or permissively licensed fixtures, with provenance and licenses.
56- `packaging` and `scripts`: verified platform packaging and CI helpers.
57
58Do not create empty crates solely to imply completion. Establish boundaries as features land. Rendering jobs operate on immutable validated snapshots so editing a project cannot silently change an active batch. Worker messages report progress and cancellation; UI/GPU ownership stays on the appropriate thread.
59
60## 4. Import format advice and support matrix
61
62**Recommendation:** glTF 2.0/GLB is the preferred canonical interchange for animated characters. GLB is convenient for distributing a self-contained body and avoids accidental texture-path breakage. Preserve original sources and conversion/import provenance. OBJ and FBX are minimum product goals, not necessarily native Bevy capabilities. A Bevy glTF loader must not be advertised as an FBX or OBJ loader.
63
64| Format | Mesh | Materials/textures | Skeleton | Animation | Intended role / status |
65|---|---|---|---|---|---|
66| glTF 2.0 .gltf/.glb | Yes | PBR metallic/roughness and referenced/embedded textures | Skins/joints | Node/skeletal clips; morph support must be tested | Preferred character and equipment path; native Bevy glTF adapter planned |
67| OBJ + MTL + texture files | Yes | MTL subset with explicit conversion and relative textures | No | No skeletal clips | Required static equipment/import preview; cannot by itself satisfy animated body requirement |
68| FBX ASCII/binary | Yes | Varies; embedded/external textures and legacy material conversion | Commonly | Commonly multiple clips/takes | Required adapter/conversion path with compatibility fixtures; never claim universal FBX fidelity |
69| Collada .dae | Usually | Adapter-dependent | Possible | Possible | Optional Assimp-backed candidate, not guaranteed until fixtures pass |
70| PLY / STL | Static geometry | PLY colors possible; STL no conventional textures | No | No | Optional static equipment only; low priority |
71| .blend | Not a portable interchange contract | Requires Blender/version matching | Possible through export | Possible through export | No direct minimum support; explicit external export to GLB preferred |
72
73FBX/OBJ adapter decision remains **open**: evaluate Assimp via maintained Rust bindings (e.g. russimp, native Assimp build dependency), dedicated format loaders, or explicit Blender conversion. Assimp offers a broad-format normalization route but its Rust binding/native ABI, packaging, material conversion, skin weights and animation correctness must be proven on Linux AND Windows. A native library must be bundled/licensed correctly or statically linked where permitted. Do not silently require an installed Blender; if used as an optional converter, show the requirement and invoke it only after explicit user selection. Avoid a heavyweight runtime dependency when an in-process adapter passes tests.
74
75Import normalizes axes, handedness, units, winding, inverse-bind matrices and texture color spaces ONCE, then retains conversion metadata. Detect singular transforms, invalid weights, missing bones/textures and unsupported materials. Imported file paths and embedded archives are untrusted: no traversal, arbitrary script execution or unbounded decompression. Keep parse limits and import failure diagnostics.
76
77OBJ bodies can be displayed as static geometry, but must not pretend to have a skeleton or the requested animations. A UI must clearly disable unavailable bone/clip features. Separate equipment geometry from body rig; bone matching uses stable joint identity/path, not only an ambiguous display name.
78
79Format acceptance gate: fixtures cover mesh topology, alpha materials, normal maps, external relative texture paths, one animated skinned body, multiple clips, bone-local transforms, malformed files and missing resources. A green fixture does not certify every exporter dialect.
80
81## 5. .ppd project and asset ownership
82
83**Proposal:** `.ppd` is a versioned UTF-8 JSON manifest in a project directory, with `format_version`, project identifier, display name, optional male/female model references, import transforms, animation inventory overrides, equipment preset references, render settings, output locations and generated-set metadata. Keep source references and normalized cache separate. Use project-relative paths by default; importing may copy models plus dependencies into `assets/` after user choice. External references need explicit portability warnings and relinking, never silent data loss.
84
85Suggested layout: `character.ppd`, `assets/body/`, `assets/equipment/`, `presets/`, `cache/`, `renders/`. The .ppd manifest is not the binary equipment preset. Cache is disposable and content-addressed; source and preset files are not. Save through a temporary sibling plus atomic rename, preserve valid previous state on failure, reject unsupported newer schema versions with a useful message. Unknown fields should not be silently discarded on rewrite without a documented migration policy.
86
87Validate finite numeric values, dimensions > 0, bounded dimensions and memory estimate, positive FPS, valid clip references, existing model/preset paths and output directories distinct from sources. A missing optional sex slot is a valid project, but cannot render that slot. No absolute-path leakage into exported manifests unless user explicitly chooses external references.
88
89## 6. Camera, axes, alignment and animation sampling
90
91Required views: pitches -30, 0, +30 degrees; yaw 0, 30, 60, ..., 330 degrees. **Proposal:** yaw zero means the standardized character front faces the camera, world +Y is up, and positive yaw is defined by a documented right-hand convention. Distinguish camera elevation from model rotation: use orbiting orthographic camera around fixed character origin. Golden orientation fixture must show labelled front/back/left/right to remove ambiguity before production export.
92
93Use orthographic projection for aligned layering. Shared camera framing, pivot, near/far, canvas size and unit normalization are stored per sex/export set and must match across body/equipment. Determine a stable envelope across selected animations, with configurable margin and equipment allowance. Never independently auto-frame each equipment piece or animation frame. Source-model forward-axis correction is explicit in project import settings.
94
95**Proposal:** sample looping clips at t=i/FPS for 0 <= i < ceil(duration*FPS), excluding a duplicate terminal sample; validate zero-duration clips and offer a bind/static frame instead. Store actual sample timestamps and duration in output metadata. Root motion is initially in-place with a documented extraction policy; preserve original clips and allow future explicit mode. No interpolation of ordinal frames as though every clip had the same duration.
96
97The 8x requirement means **8x width AND 8x height**, hence 64x pixel count. FPS controls animation sampling rather than interactive preview performance. Render maps in a bounded streaming pipeline, not all frames in RAM. Estimate disk/GPU/memory cost before starting: frame count times 36 views times map count. Cancellation stops between safe work units and leaves an incomplete marker, never an apparently complete asset set.
98
99## 7. Export naming and metadata
100
101Required schema: `<geslacht>-<settype>-<animatienaam>-<pitch>-<yaw>-<maptype>-f<framenummer>.png`.
102
103**Proposal:** sex tokens `male` and `female`; body set type exactly `body`; equipment name validated as a lowercase slug without spaces, reject reserved `body`. Use deterministic safe animation slugs plus collision registry preserving original names in a companion manifest. Decide delimiter escaping explicitly: negative pitch creates adjacent hyphens, so parse from the known suffix rather than naive splitting. Example `male-body-walk--30-0-diffuse-f000000.png` corresponds to pitch -30/yaw 0/frame 0. A six-digit frame width is a provisional minimum, not a cap; width and naming are stored in metadata.
104
105The companion output manifest stores original clip IDs/names, name tokens, timestamps, dimensions, FPS, camera matrices/conventions, shared depth range, normal space, alpha mode, specular convention, render settings/version, source fingerprints and completion status. This metadata supplements rather than replaces the required PNG filenames. Output writes use temporary files and explicit overwrite choice. Sanitize names without creating collisions or interpreting slashes as directories.
106
107## 8. Map contracts and rendering algorithm
108
109Diffuse is an **unlit base color** suitable for later lighting, not an already lit screenshot. Preserve alpha, use sRGB encoding only at output boundaries and process color in linear light. Transparency outside geometry remains zero; distinguish uncovered pixels from valid near-depth pixels.
110
111Depth **proposal:** 16-bit grayscale PNG representing linear camera-space depth normalized to one shared near/far interval for all compatible layers. Smaller valid values mean nearer the viewer. Use diffuse alpha/coverage as validity; never interpret the transparent background as the closest surface. No per-frame or per-equipment depth rescaling. Record the exact decode equation in metadata. Depth ordering tests must include equipment in front of and behind different body regions.
112
113Normals **proposal:** view-space geometric/shading normal, xyz encoded from [-1,1] to [0,1] in RGB PNG, with documented image Y convention; normal space must match the preview light transform. Normalize after interpolation/filtering. Uncovered pixels have alpha zero and a neutral placeholder normal. Include tangent-space source normal maps where supported and explicitly test their conversion; a geometry-normal bake is not automatically full source-material normal fidelity.
114
115Equipment shinymap **proposal:** grayscale scalar specular strength (0..1), with a documented default exponent/roughness in metadata. Filename token `shiny` is provisional because Tim named the concept but did not mandate a token spelling. Metallic/roughness and Phong materials do not map uniquely to one scalar; expose a conservative conversion/default and retain editable overrides. Do not label it physically exact PBR. Body has diffuse/depth/normal; equipment additionally shiny.
116
117Pipeline per shared scene sample/view:
1181. Evaluate skeleton and bone world transforms at the exact sample time.
1192. Render high-resolution unlit color/coverage and geometry buffers at 8x target dimensions. Depth/normals originate from the actual same surfaces, not image luminance.
1203. Compute an internal detail map using color gradients plus alpha/depth/normal discontinuities, bounded weights and transparent-neighbor handling. Detail map is intermediate, not a fourth body output map.
1214. Downsample diffuse with deterministic coverage-aware weighted reconstruction in linear premultiplied color; unpremultiply safely for straight-alpha PNG output. Tune thin-feature retention on fixtures, not on a named but unimplemented algorithm.
1225. Resolve target-resolution depth/normals from coherent contributing surfaces. Avoid mixing background with foreground or averaging front and back depths into nonphysical geometry. Align the chosen representative/coverage policy across maps. Renormalize normals.
1236. Add a subtle configurable rim/detail accent to diffuse based on normal/depth discontinuities, never a light-direction bake. Clamp magnitude, preserve alpha; default must be validated visually to avoid double-lighting later.
1247. Encode all target-resolution PNGs atomically and record checksums/metadata. Test deterministic CPU stages independently from GPU tolerance.
125
126Equipment pass hides the body from **all color, depth, normal and specular writes**, while still evaluating its rig and animating attachments. The body is not an invisible occluder; otherwise equipment behind it would be missing when layers are recomposed. Equipment self-occludes normally. Every layer must use the same projection and absolute depth contract. Hair/alpha cutout versus true blended transparency is an open fidelity decision; initial opaque/cutout support must be stated rather than promising arbitrary multilayer transparency from a single depth value.
127
128## 9. Equipment editor and binary presets
129
130UI selects sex, target skeleton/bone, imported equipment mesh, XYZ translation and XYZ Euler rotation in degrees. **Proposal:** persisted rotation is a quaternion with UI Euler values/order documented; test round-trip and avoid cumulative rotations each frame. Attachment transform is `body_world * animated_bone_world * attachment_local`; clarify inverse-bind usage in importer and test with nonidentity parents. Scale is initially asset import normalization, not an unrequested body-part editor feature.
131
132Live 3D preview displays body and selected equipment, allows free orbit/zoom and optional animation selection for placement checks. It is separate from the discrete 2D preview. Display a bone tree and highlight unresolved attachments. A preset supports multiple meshes attached to multiple bones, sex flag, stable bone paths, original/import transforms and embedded geometry/material/texture payloads.
133
134Binary preset **proposal:** magic header, schema version, bounded metadata length and asset count, checksummed entries and compressed payload chunks. Choose a documented serialization/container implementation in the preset feature; do not dump Rust memory layouts. Include rig fingerprint and reject mismatched skeletons with an actionable remapping prompt. Preserve original or normalized embedded asset representation plus license/provenance, protect against decompression bombs and traversal, save atomically. Filename extension for presets remains a proposal; .ppd is reserved for project manifests.
135
136## 10. Rendered 2D preview
137
138Select sex, animation and zero or more compatible equipment sets. Validate same project/rig/export contract and sample inventory. Play actual exported frames on a loop with elapsed-time accumulation; FPS and playback speed are explicit. Missing maps/frames show a diagnostic rather than silently using another animation.
139
140Left/right controls wrap among twelve yaw values. Up/down selects one of three pitch rows with clamping, not cyclic hidden extra angles. The orientation zero/positive direction agrees with export. Changing angle preserves animation time. Holding light buttons rotates azimuth/elevation continuously in degrees per second using delta time; releasing, focus loss or pointer cancellation stops motion. Clamp elevation/wrap azimuth with clear coordinate convention. These controls are continuous even though model view selection is discrete.
141
142Depth compositor selects the nearest valid surface per pixel from body and chosen equipment, with stable epsilon/tie-break ordering. Chosen pixel supplies diffuse, normal and shiny from the **same layer**. Blend alpha edges using a documented approximation; single-depth compositing cannot reconstruct arbitrary order-dependent translucent surfaces. A simple ambient + diffuse + specular preview proves maps and lighting; it is not the future game controller. Transform the continuous light into the same view space used by each normal map.
143
144## 11. Development workflow, quality and packaging
145
146Each feature starts on its own `feature/...` branch from current master. Implement its tests and acceptance criteria, run local checks, commit, then `git merge --no-ff` into master and push. No initial-phase MRs. Keep branch/feature and merge SHAs in the coordinator status file, report completion before the next feature. Setup/design may use `feature/project-design`; establish a baseline master commit first if required to obtain a genuine two-parent merge. Never fabricate a merge on an unborn branch.
147
148CI filename requested: `blue-ci-cd.yml`. **Unverified infrastructure detail:** do not invent BlueGit YAML syntax. Inspect documented BlueGit runner schema and narrow existing `timfa/posprint` and `legacy-cycles` pipeline/release examples before writing configuration. Respect runner/image selection, artifact retention and release API semantics. No GitLab mirror is requested for this new project.
149
150Tests run on MR events (future-proof despite no current MRs), master pushes AND tags. Quality gates: `cargo fmt --check`, `cargo check --workspace --all-targets --locked`, `cargo clippy --workspace --all-targets --locked -- -D warnings`, `cargo test --workspace --locked`; feature combinations should be covered explicitly when introduced. Pin toolchain/components and package tooling. Core tests require no GPU; separate GPU integration tests may use a supported software adapter, with explicit results rather than silent skip-as-pass.
151
152Tag pipeline graph: quality/tests → four packaging jobs → artifact verification → one release publish. A failure of ANY required artifact prevents release. Build Linux x86_64 AppImage, Debian/Ubuntu .deb, Arch .pkg.tar.zst and Windows x86_64 .exe in a .zip. Verify target architecture and contents; packaging a Linux binary into a Windows archive is not a build. Prefer native Windows runner when available, or verified mingw target/toolchain with dependency support. AppImage and distribution packages need desktop integration/icon/license, runtime library audit and version mapping from tag to package version. Include checksums and build provenance; signing is optional future work, never invent signatures.
153
154Release publication uses documented BlueGit release/artifact API and job-scoped least-privilege credentials; no tokens in source/logs/status. All assets attach only after all outputs pass verification, retries are idempotent and do not delete unrelated releases. Distinguish local packaging smoke tests from a real successful tag/release pipeline. **No tag or release is authorized during setup.** A configured future tag trigger is not permission to create a tag now.
155
156Verified BlueGit behaviour, inspected 6 November 2026, is recorded in section 15. The configured tag pipeline calls that API. With the API as it exists today, publishing the same tag that started the pipeline is rejected. That limit is part of the design record, not a claim that a release was created.
157
158## 12. Incremental feature plan and acceptance gates
159
1600. Foundation/design/CI: group and repo existence checks; private repo; single detailed design.md with verbatim appendix; minimal honest compileable Rust shell; locked dependencies/toolchain; genuine two-parent setup merge; tests and verified CI schema. No claim that rendering/import works. Test packaging scripts locally where possible without publishing.
1611. Project model and validation: .ppd open/save/new, portable paths, schema/version checks, model slots and render settings; atomic persistence/invalid paths tests.
1622. Normalized import and animation inventory: glTF/GLB fixtures first, required OBJ+MTL/textures and FBX adapter proof; format-specific truthful UI/errors and skeleton/clip inventories; integration fixture tests before declaring format support.
1633. Desktop 3D viewport and animation sampling: visible real imported model, orbit, clip controls, source-axis normalization; transform tests and manual visual test.
1644. Equipment attachments and binary presets: bone tree, sex choice, numeric offsets/rotations, live placement, embedded multi-mesh assets; round-trip and rig mismatch tests.
1655. Shared batch camera/sampling and raw buffers: 36 views, common framing, 8x geometry output/readback, diffuse/depth/normal alignment; orientation/occlusion fixture before aesthetic postprocessing.
1666. Production image pipeline: detail-aware downsampling, depth/normal resolve, rim accents, shiny conversion, filename/manifest export, progress/cancel/resume; compare actual output and memory budgets.
1677. Rendered 2D compositor preview: real exported frames, depth ordering, looping, sex/equipment/clip selection, discrete view controls and continuous held light controls; deterministic state tests and manual lighting test.
1688. Packaging/hardening: verify all platform packages and install/run behavior, imports with native dependencies, accessibility and failure recovery; actual releases only on later explicit tag authorization.
169
170Every feature is independently reported and merged non-FF only when its acceptance gate passes. If compatibility or rendering remains untested, name that limitation and do not merge a false completion claim.
171
172## 13. Open decisions and risks
173
174- Confirm target resolution/FPS defaults, output color treatment, root-motion policy, front-axis and positive-yaw convention with a labelled fixture before production content.
175- FBX exporter variants/native Assimp packaging and skeletal animation fidelity are high-risk; prototype early rather than after UI completion.
176- Eightfold dimensions impose 64x pixels; support tiling or reject unsupported render sizes with estimates, not GPU crashes.
177- Shared framing/depth/normal contracts are essential; independently normalized equipment maps cannot be depth-composited correctly.
178- Alpha-blended materials cannot be fully represented by one surface depth; document cutout/opaque MVP and approximation.
179- Bone attachment supports rigid equipment, not automatic skinning/retargeting; expose that limit.
180- glTF PBR/FBX legacy materials to a single shinymap is lossy; retain source metadata and editable conversion settings.
181- Package version mapping, Windows runner/toolchain and BlueGit group runner availability must be verified, not assumed.
182- Keep model provenance/licensing with embedded presets; importing assets does not grant redistribution rights.
183
184## 14. Research references and verification limits
185
186- Bevy project and documentation: https://bevy.org/ (preferred-stack proposal; exact dependency versions and API compatibility still require implementation verification).
187- Assimp repository: https://github.com/assimp/assimp (candidate broad-format import dependency, not universal file compatibility guarantee).
188- Rust Assimp binding docs inspected: https://docs.rs/russimp/latest/russimp/ (reported russimp 3.2.1 at inspection; no build/compatibility test performed).
189- glTF specification reference: https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html (canonical interchange recommendation; implementation must test supported subsets).
190- BlueGit CI specification: `GET https://git.timfalken.com/api/v1/ci/spec` and `docs/CI.md` in `timfa/bluegit` (file name `blue-ci-cd.yml`, job fields, variables, release API).
191- Working pipelines read in public repositories: `timfa/posprint` `blue-ci-cd.yml` and `scripts/ci/release.sh`; `timfa/minecart-trains` `blue-ci-cd.yml`; `timfa/click-tween` `blue-ci-cd.yml` and `scripts/release.sh`.
192- Release implementation read in `timfa/bluegit` `internal/server/ops_ci.go` (`opPublishRelease`) and `internal/server/release_replace.go` (`checkReplace`).
193
194## 15. Verified BlueGit CI and the release-trigger limit
195
196Inspected sources, all public on 6 November 2026:
197
198| Source | What it shows |
199|---|---|
200| `GET /api/v1/ci/spec` and `timfa/bluegit` `docs/CI.md` | The pipeline file is `blue-ci-cd.yml`. Jobs may be top-level. `rules` / `only` / `needs` / `artifacts.paths` / `artifacts.expire_in` / `extends` / `resource_group` / `workflow` are real fields. `CI_COMMIT_TAG` is empty on a branch and `CI_COMMIT_BRANCH` is empty on a tag. `CI_JOB_TOKEN` exists only inside a job container. Image presets include `bluegit/base` and `bluegit/rust` (Rust 1.81). Any other image name, such as `rust:1.83-bookworm`, is a normal Docker image. |
201| `timfa/posprint` `blue-ci-cd.yml` | Tests on merge requests and on `master`. Package jobs use `needs: [test]`. Artifacts are exact file paths, not globs. The release job runs on `master` and calls `POST $CI_API_URL/repos/$CI_PROJECT_PATH/releases` with `Authorization: Bearer $CI_JOB_TOKEN`. Tag pushes are disabled with `if: $CI_COMMIT_TAG != ""` / `when: never`. The comment in that file says tag pipelines must not rebuild old tags. Windows is cross-compiled with MinGW because that comment states there is no Windows runner. |
202| `timfa/posprint` `scripts/ci/release.sh` | The script says the release API creates the tag itself. It refuses to release when `HEAD` is already tagged. |
203| `timfa/minecart-trains` `blue-ci-cd.yml` | States the GitLab project used to release on a new tag, and that on BlueGit the release API creates the tag, so tag pushes start no pipeline. |
204| `timfa/click-tween` `blue-ci-cd.yml` | A tag pipeline may build and verify. The job that publishes the release is manual on `master` and creates the tag through the API. |
205| `timfa/bluegit` `opPublishRelease` | If the tag already exists and `replace` is not set, the API returns HTTP 409 (`err.tagExists`). `replace: true` is checked by `checkReplace`, which rejects a tag pipeline (`err.replaceRef`, HTTP 403). A tag pipeline therefore cannot attach assets to the tag that started it, and cannot replace that release either. |
206| `timfa/legacy-cycles` | The project page redirects to releases and says only the releases are public. `GET /api/v1/projects/timfa/legacy-cycles/repository/tree` and the CI file returned 404. The public release assets for v0.0.38 are a Debian package, an Arch `.pkg.tar.zst`, a Windows zip, and Linux tar archives. No AppImage is listed. Its pipeline YAML was not available to copy. |
207
208Consequences for `blue-ci-cd.yml` in this repository:
209
2101. Syntax is limited to fields confirmed in the CI spec or in the pipelines above. No GitLab-only keyword is added (`pages`, `spec`, child pipelines, `id_tokens`).
2112. Tests run for merge-request pipelines, for pushes to `master`, for pushes to `main`, for `CI_DEFAULT_BRANCH`, and for tags. This workspace's default branch is `main`. Tim's existing BlueGit projects use `master`. Covering both avoids a silent skip after the project moves.
2123. On a tag push the four package jobs run only after `test`, then `verify:packages` checks magic bytes so a Linux executable is not renamed into the Windows zip. `release` needs `verify:packages`, so any failed package skips publication.
2134. `release` calls the documented POST. The body uses `CI_COMMIT_TAG` and `CI_COMMIT_SHA`, and points each asset at the successful job and exact artifact path. **With today's API that POST returns 409**, because the tag already exists, and `replace: true` is forbidden on a tag pipeline. The job is still the requested publish step; it is not described here as a release that already succeeded. No tag is created by this setup commit.
2145. Package scripts map a tag `vX.Y.Z` or `X.Y.Z` to package version `X.Y.Z`. Other tag spellings fail the package job instead of inventing a version.
2156. The Rust image is `rust:1.96-bookworm`. That tag is the one `timfa/posprint` already runs on BlueGit. `rust-toolchain.toml` pins the same compiler, 1.96.0, which was installed here with rustup. The machine default before that pin was 1.83.0. 1.83.0 cannot resolve the current eframe 0.29.1 graph: several transitive crates require edition 2024, which Cargo 1.83 does not parse. `bluegit/rust` is Rust 1.81 on Alpine and is the wrong image for this X11 shell. `bluegit/base` is used for the verify and release jobs, as in posprint.
2167. posprint states BlueGit does not set `CI_PROJECT_DIR` and that jobs start in the checkout. Scripts use `$PWD`.
217
218The toolchain is Rust 1.96.0, edition 2021. Edition 2021 remains explicit; the crate does not opt into edition 2024. `Cargo.lock` is committed. `cargo fmt`, `cargo check`, `cargo clippy -D warnings` and `cargo test` are the test job. No GPU test is required for the foundation shell.
219
220# Appendix A — Tim's original proposal (verbatim)
221
222The following block preserves the original Dutch text including spelling and filename placeholders. It is not a paraphrase or implementation status.
223
224```text
225Ik heb een idee voor een projectje;
226Een Paperdoll Renderer.
227
228Het idee;
229We importeren twee menselijke 3D-modellen; een man en een vrouw. Die hebben een set animaties, zoals lopen, springen, bukken, aanvallen, blokkeren, geraakt worden, etc. (we lezen gewoon alles uit het model)
230
231Bij renderen hebben we twee modussen: Karaktermodel, en uitrusting (hier later meer over). Als je rendert, dan hebben we 3*12 posities; 3 pitches (-30 graden, 0 graden, +30 graden), en 12 yaw (beginnend met recht naar de camera kijken en dan steeds een stapje ronddraaien tot we alle hoeken hebben). We renderen die naar PNG's met de naam: <geslacht>-<settype>-<animatienaam>-<pitch>-<yaw>-<maptype>-f<framenummer>.png met een vooringestelde (hoge, acht keer de doelresolutie) resolutie en framerate.
232We pakken dan die hoge resolutie, en maken een detail-map; dat is effectief een edge-detection algoritme. We schalen de paperdoll dan omlaag naar de doelresolutie, en we gebruiken de detail-map om pixels extra gewicht te geven om te kiezen welke kleur we een pixel geven.
233Daarna maken we een depth-map op de doelresolutie, en een normal map. (de maptypes in de filename zijn dus: diffuse, depth, normal)
234Als we de normalmap en depthmap hebben, doen we nog een pass over de diffuse om randen een beetje te highlighten. Daarna slaan we de hele set op volgens het afgesproken naamformat (allemaal op de doelresolutie). Dit is is settype=body.
235
236Daarna hebben we ook equipment. Je kiest een geslacht, en je moet per lichaamsdeel (op de skeleton van het karaktermodel) een 3D-model kunnen importeren, en op de bone kunnen positioneren. Als je alle modellen van een stuk equipment op de juiste positie gezet hebt, kun je dat opslaan als een preset (binary file met de modellen en posities op bones, alsmede een flag voor of het male of female is). Je kunt hem ook renderen; dan kies je een naam voor je equipment. Die naam is de settype; allemaal lowercase, geen spaties toegestaan. Dit rendert dan nogmaals alles, net als bij de body, alleen is de body dan doorzichtig, waardoor je alleen de equipment-modellen tekent. Equipment heeft ook een shinymap; dat is hoeveel specular een pixel moet hebben voor later bij de renderer.
237
238De bedoeling is dat we die paperdolls later kunnen gebruiken om een renderer te schrijven. Die gebruikt de diffuse maps en laagt met equipments over elkaar; het gebruikt de depth-map om te bepalen welke pixel van welke map (body of equipment) getekent moet worden (soort z-check), en de normal map om bumpmapping en lighting te tekenen. Dat wordt dan deel van een character-renderer en controller.
239
240Als stap 1 wil ik graag de paperdoll renderer maken. Ik heb nog geen modellen, die moet ik dus later zelf in het programma kunnen selecteren. Voor positioneren op bones zijn XYZ voor relatieve positie en rotatie voldoende voor nu, met dan een live preview waarop je het lichaam ziet, die je kunt roteren (3D model view, niet de gerenderde plaatjes want die zijn er dan nog niet).
241
242Wanneer je sets maakt, is dat in een .ppd (PaPerDoll) project; een map met een .ppd file die verteld welke modellen gebruikt worden, welke binary files van equipment sets er zijn, en waar gerenderde output staat.
243Zo kunnen we ook een preview tab maken; kies een geslacht, kies equipments om te layeren, en kies een animatie. Je ziet dan de animatie op loop spelen (de gerenderde 2D paperdolls), en kunt met pijltjes orbiten (boven, midden, onder, en dan voor links en rechts de 12 rotaties). Ook moet je met knopjes die je ingedrukt kan houden de positie van de lichtbron kunnen roteren. Dat gaat in graden, niet in stappen.
244
245Stappenplan:
246
247- Maak een groep op BlueGit: `Golden Age`
248- Maak de repo, Paperdoll Renderer
249
250- Documenteer alle bovenstaande, incl. letterlijke tekst van mij, zeer gedetailleerd in een enkele design.md
251- Bouw dan alle features een voor een in Rust. Elke feature op een nieuwe branch, en als die feature af is, niet-FF mergen naar master (Geen MR's tijdens eerste ontwikkelfase) en door naar de volgende feature. Elke feature krijgt een unit test die we in de CI-CD activeren op een merge request (ook al gebruiken we die nog niet) en op een master push. Een tag push krijgt, als tests slagen, ook een build; AppImage, Ubuntu Package, Arch Package, Windows Build, welke we dan als een release pushen.
252
253Houd me bij elke feature op de hoogte hoe het gaat.
254```
255
256# Appendix B — Additional import requirement (verbatim)
257
258```text
259Bepaal ook welk 3D-model format goed is; liefst ondersteunen we natuurlijk meerdere. In ieder geval .obj (met mtl en texture) en .fbx, maar hoe meer hoe beter.
260```
packaging/arch/PKGBUILD added +32 −0
@@ -0,0 +1,32 @@
1 # Packages the foundation shell from the git checkout that invoked makepkg.
2 # PAPERDOLL_PKGVER and REPO_ROOT are set by scripts/package/arch.sh.
3 pkgname=paperdoll-renderer
4 pkgver=0.1.0
5 pkgrel=1
6 pkgdesc='Foundation shell for the Paperdoll Renderer. Import and render are not included.'
7 arch=('x86_64')
8 url='https://git.timfalken.com/golden-age/paperdoll-renderer'
9 license=('MIT')
10 depends=('gcc-libs' 'glibc' 'libxcb' 'libx11' 'libxkbcommon' 'libglvnd')
11 makedepends=('cargo' 'pkgconf')
12 options=('!debug' '!lto')
13
14 pkgver() {
15 printf '%s\n' "${PAPERDOLL_PKGVER:?set PAPERDOLL_PKGVER}"
16 }
17
18 build() {
19 : "${REPO_ROOT:?set REPO_ROOT to the repository root}"
20 export CARGO_HOME="${CARGO_HOME:-$REPO_ROOT/cargo-home}"
21 cargo build --release --locked --manifest-path "$REPO_ROOT/Cargo.toml" --target-dir "$REPO_ROOT/target"
22 }
23
24 package() {
25 : "${REPO_ROOT:?set REPO_ROOT to the repository root}"
26 install -Dm755 "$REPO_ROOT/target/release/paperdoll-renderer" "$pkgdir/usr/bin/paperdoll-renderer"
27 install -Dm644 "$REPO_ROOT/packaging/linux/paperdoll-renderer.desktop" \
28 "$pkgdir/usr/share/applications/paperdoll-renderer.desktop"
29 install -Dm644 "$REPO_ROOT/packaging/linux/icon-64.png" \
30 "$pkgdir/usr/share/icons/hicolor/64x64/apps/paperdoll-renderer.png"
31 install -Dm644 "$REPO_ROOT/LICENSE" "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
32 }
@@ -0,0 +1,32 @@
1# Packages the foundation shell from the git checkout that invoked makepkg.
2# PAPERDOLL_PKGVER and REPO_ROOT are set by scripts/package/arch.sh.
3pkgname=paperdoll-renderer
4pkgver=0.1.0
5pkgrel=1
6pkgdesc='Foundation shell for the Paperdoll Renderer. Import and render are not included.'
7arch=('x86_64')
8url='https://git.timfalken.com/golden-age/paperdoll-renderer'
9license=('MIT')
10depends=('gcc-libs' 'glibc' 'libxcb' 'libx11' 'libxkbcommon' 'libglvnd')
11makedepends=('cargo' 'pkgconf')
12options=('!debug' '!lto')
13
14pkgver() {
15 printf '%s\n' "${PAPERDOLL_PKGVER:?set PAPERDOLL_PKGVER}"
16}
17
18build() {
19 : "${REPO_ROOT:?set REPO_ROOT to the repository root}"
20 export CARGO_HOME="${CARGO_HOME:-$REPO_ROOT/cargo-home}"
21 cargo build --release --locked --manifest-path "$REPO_ROOT/Cargo.toml" --target-dir "$REPO_ROOT/target"
22}
23
24package() {
25 : "${REPO_ROOT:?set REPO_ROOT to the repository root}"
26 install -Dm755 "$REPO_ROOT/target/release/paperdoll-renderer" "$pkgdir/usr/bin/paperdoll-renderer"
27 install -Dm644 "$REPO_ROOT/packaging/linux/paperdoll-renderer.desktop" \
28 "$pkgdir/usr/share/applications/paperdoll-renderer.desktop"
29 install -Dm644 "$REPO_ROOT/packaging/linux/icon-64.png" \
30 "$pkgdir/usr/share/icons/hicolor/64x64/apps/paperdoll-renderer.png"
31 install -Dm644 "$REPO_ROOT/LICENSE" "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
32}
packaging/linux/icon-64.png added Binary file +0 −0

The contents of this binary file are not shown.

packaging/linux/paperdoll-renderer.desktop added +10 −0
@@ -0,0 +1,10 @@
1 [Desktop Entry]
2 Type=Application
3 Name=Paperdoll Renderer
4 GenericName=Paperdoll foundation shell
5 Comment=Statusvenster van de Paperdoll Renderer-projectbasis. Import en render zijn niet gebouwd.
6 Exec=paperdoll-renderer
7 Icon=paperdoll-renderer
8 Terminal=false
9 Categories=Graphics;
10 StartupNotify=true
@@ -0,0 +1,10 @@
1[Desktop Entry]
2Type=Application
3Name=Paperdoll Renderer
4GenericName=Paperdoll foundation shell
5Comment=Statusvenster van de Paperdoll Renderer-projectbasis. Import en render zijn niet gebouwd.
6Exec=paperdoll-renderer
7Icon=paperdoll-renderer
8Terminal=false
9Categories=Graphics;
10StartupNotify=true
rust-toolchain.toml added +4 −0
@@ -0,0 +1,4 @@
1 [toolchain]
2 channel = "1.96.0"
3 components = ["clippy", "rustfmt"]
4 profile = "minimal"
@@ -0,0 +1,4 @@
1[toolchain]
2channel = "1.96.0"
3components = ["clippy", "rustfmt"]
4profile = "minimal"
scripts/ci/package-version.sh added +21 −0
@@ -0,0 +1,21 @@
1 #!/usr/bin/env bash
2 # Map a git tag or the Cargo.toml version to a package version X.Y.Z.
3 # Tags may be vX.Y.Z or X.Y.Z. Other spellings fail instead of being rewritten.
4 set -euo pipefail
5
6 root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
7
8 if [[ -n "${PACKAGE_VERSION:-}" ]]; then
9 version="$PACKAGE_VERSION"
10 elif [[ -n "${CI_COMMIT_TAG:-}" ]]; then
11 version="${CI_COMMIT_TAG#v}"
12 else
13 version="$(sed -n 's/^version = "\([^"]*\)"/\1/p' "$root/Cargo.toml" | head -n 1)"
14 fi
15
16 if [[ ! "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
17 echo "package version must be X.Y.Z (tag vX.Y.Z or X.Y.Z); got '${CI_COMMIT_TAG:-$version}'" >&2
18 exit 1
19 fi
20
21 printf '%s\n' "$version"
@@ -0,0 +1,21 @@
1#!/usr/bin/env bash
2# Map a git tag or the Cargo.toml version to a package version X.Y.Z.
3# Tags may be vX.Y.Z or X.Y.Z. Other spellings fail instead of being rewritten.
4set -euo pipefail
5
6root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
7
8if [[ -n "${PACKAGE_VERSION:-}" ]]; then
9 version="$PACKAGE_VERSION"
10elif [[ -n "${CI_COMMIT_TAG:-}" ]]; then
11 version="${CI_COMMIT_TAG#v}"
12else
13 version="$(sed -n 's/^version = "\([^"]*\)"/\1/p' "$root/Cargo.toml" | head -n 1)"
14fi
15
16if [[ ! "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
17 echo "package version must be X.Y.Z (tag vX.Y.Z or X.Y.Z); got '${CI_COMMIT_TAG:-$version}'" >&2
18 exit 1
19fi
20
21printf '%s\n' "$version"
scripts/ci/release.sh added +55 −0
@@ -0,0 +1,55 @@
1 #!/usr/bin/env bash
2 # Publish a BlueGit release for the tag that started this pipeline.
3 #
4 # Syntax checked against docs/CI.md and timfa/posprint scripts/ci/release.sh:
5 # POST "$CI_API_URL/repos/$CI_PROJECT_PATH/releases"
6 # Authorization: Bearer $CI_JOB_TOKEN
7 # assets: {job, path, name} where path is an artifact of a successful job
8 # in this pipeline.
9 #
10 # Verified limit (timfa/bluegit internal/server/ops_ci.go opPublishRelease and
11 # release_replace.go checkReplace): if the tag already exists the API returns
12 # HTTP 409 unless replace=true, and replace=true is rejected with HTTP 403 on
13 # a tag pipeline. A pipeline started by pushing the tag therefore cannot
14 # attach these artifacts to that same tag. The script still performs the
15 # documented call and fails when the response is not 2xx. It does not send
16 # replace=true, and it does not invent a second tag.
17 set -euo pipefail
18
19 : "${CI_API_URL:?}" "${CI_JOB_TOKEN:?}" "${CI_COMMIT_SHA:?}" "${CI_PROJECT_PATH:?}" "${CI_COMMIT_TAG:?}"
20
21 root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
22 cd "$root"
23 version="$(bash scripts/ci/package-version.sh)"
24
25 echo "BlueGit release API creates the git tag." >&2
26 echo "This pipeline already runs on tag ${CI_COMMIT_TAG}, so today's API returns 409 (tag exists)." >&2
27 echo "replace=true is refused on a tag pipeline (403). No second tag is created." >&2
28
29 asset() {
30 printf '{"job":"%s","path":"%s","name":"%s"}' "$1" "$2" "$3"
31 }
32
33 assets="$(asset package:appimage dist/paperdoll-renderer-x86_64.AppImage "paperdoll-renderer-${version}-x86_64.AppImage")"
34 assets="${assets},$(asset package:ubuntu dist/paperdoll-renderer_amd64.deb "paperdoll-renderer_${version}_amd64.deb")"
35 assets="${assets},$(asset package:arch dist/paperdoll-renderer-x86_64.pkg.tar.zst "paperdoll-renderer-${version}-1-x86_64.pkg.tar.zst")"
36 assets="${assets},$(asset package:windows dist/paperdoll-renderer-windows-x86_64.zip "paperdoll-renderer-${version}-windows-x86_64.zip")"
37 assets="${assets},$(asset verify:packages dist/SHA256SUMS "paperdoll-renderer-${version}-SHA256SUMS")"
38
39 body="Paperdoll Renderer ${version}.\\n\\nFoundation shell only. Import, skeletal animation, paperdoll rendering and the 2D preview are not in this build.\\n\\n* Linux AppImage: paperdoll-renderer-${version}-x86_64.AppImage\\n* Debian/Ubuntu: paperdoll-renderer_${version}_amd64.deb\\n* Arch: paperdoll-renderer-${version}-1-x86_64.pkg.tar.zst\\n* Windows zip: paperdoll-renderer-${version}-windows-x86_64.zip\\n* SHA256SUMS"
40
41 payload="$(printf '{"tag":"%s","commit":"%s","name":"Paperdoll Renderer %s","body":"%s","assets":[%s]}' \
42 "$CI_COMMIT_TAG" "$CI_COMMIT_SHA" "$version" "$body" "$assets")"
43
44 response="$(mktemp)"
45 code="$(curl -sS -o "$response" -w '%{http_code}' -X POST "$CI_API_URL/repos/$CI_PROJECT_PATH/releases" \
46 -H "Authorization: Bearer $CI_JOB_TOKEN" \
47 -H "Content-Type: application/json" \
48 -d "$payload")" || code=000
49 cat "$response"
50 echo
51 if [[ "$code" != 2* ]]; then
52 echo "Release API returned HTTP ${code}. A 409 on this tag pipeline matches the verified BlueGit limit and is not a published release." >&2
53 exit 1
54 fi
55 echo "release published for ${CI_COMMIT_TAG}"
@@ -0,0 +1,55 @@
1#!/usr/bin/env bash
2# Publish a BlueGit release for the tag that started this pipeline.
3#
4# Syntax checked against docs/CI.md and timfa/posprint scripts/ci/release.sh:
5# POST "$CI_API_URL/repos/$CI_PROJECT_PATH/releases"
6# Authorization: Bearer $CI_JOB_TOKEN
7# assets: {job, path, name} where path is an artifact of a successful job
8# in this pipeline.
9#
10# Verified limit (timfa/bluegit internal/server/ops_ci.go opPublishRelease and
11# release_replace.go checkReplace): if the tag already exists the API returns
12# HTTP 409 unless replace=true, and replace=true is rejected with HTTP 403 on
13# a tag pipeline. A pipeline started by pushing the tag therefore cannot
14# attach these artifacts to that same tag. The script still performs the
15# documented call and fails when the response is not 2xx. It does not send
16# replace=true, and it does not invent a second tag.
17set -euo pipefail
18
19: "${CI_API_URL:?}" "${CI_JOB_TOKEN:?}" "${CI_COMMIT_SHA:?}" "${CI_PROJECT_PATH:?}" "${CI_COMMIT_TAG:?}"
20
21root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
22cd "$root"
23version="$(bash scripts/ci/package-version.sh)"
24
25echo "BlueGit release API creates the git tag." >&2
26echo "This pipeline already runs on tag ${CI_COMMIT_TAG}, so today's API returns 409 (tag exists)." >&2
27echo "replace=true is refused on a tag pipeline (403). No second tag is created." >&2
28
29asset() {
30 printf '{"job":"%s","path":"%s","name":"%s"}' "$1" "$2" "$3"
31}
32
33assets="$(asset package:appimage dist/paperdoll-renderer-x86_64.AppImage "paperdoll-renderer-${version}-x86_64.AppImage")"
34assets="${assets},$(asset package:ubuntu dist/paperdoll-renderer_amd64.deb "paperdoll-renderer_${version}_amd64.deb")"
35assets="${assets},$(asset package:arch dist/paperdoll-renderer-x86_64.pkg.tar.zst "paperdoll-renderer-${version}-1-x86_64.pkg.tar.zst")"
36assets="${assets},$(asset package:windows dist/paperdoll-renderer-windows-x86_64.zip "paperdoll-renderer-${version}-windows-x86_64.zip")"
37assets="${assets},$(asset verify:packages dist/SHA256SUMS "paperdoll-renderer-${version}-SHA256SUMS")"
38
39body="Paperdoll Renderer ${version}.\\n\\nFoundation shell only. Import, skeletal animation, paperdoll rendering and the 2D preview are not in this build.\\n\\n* Linux AppImage: paperdoll-renderer-${version}-x86_64.AppImage\\n* Debian/Ubuntu: paperdoll-renderer_${version}_amd64.deb\\n* Arch: paperdoll-renderer-${version}-1-x86_64.pkg.tar.zst\\n* Windows zip: paperdoll-renderer-${version}-windows-x86_64.zip\\n* SHA256SUMS"
40
41payload="$(printf '{"tag":"%s","commit":"%s","name":"Paperdoll Renderer %s","body":"%s","assets":[%s]}' \
42 "$CI_COMMIT_TAG" "$CI_COMMIT_SHA" "$version" "$body" "$assets")"
43
44response="$(mktemp)"
45code="$(curl -sS -o "$response" -w '%{http_code}' -X POST "$CI_API_URL/repos/$CI_PROJECT_PATH/releases" \
46 -H "Authorization: Bearer $CI_JOB_TOKEN" \
47 -H "Content-Type: application/json" \
48 -d "$payload")" || code=000
49cat "$response"
50echo
51if [[ "$code" != 2* ]]; then
52 echo "Release API returned HTTP ${code}. A 409 on this tag pipeline matches the verified BlueGit limit and is not a published release." >&2
53 exit 1
54fi
55echo "release published for ${CI_COMMIT_TAG}"
scripts/ci/verify-packages.sh added +70 −0
@@ -0,0 +1,70 @@
1 #!/usr/bin/env bash
2 # Reject a package that is the wrong kind of file. A Linux executable copied
3 # into the Windows archive must not pass.
4 set -euo pipefail
5
6 root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
7 cd "$root"
8 mkdir -p dist
9
10 appimage="dist/paperdoll-renderer-x86_64.AppImage"
11 deb="dist/paperdoll-renderer_amd64.deb"
12 arch="dist/paperdoll-renderer-x86_64.pkg.tar.zst"
13 windows="dist/paperdoll-renderer-windows-x86_64.zip"
14
15 require_file() {
16 local path="$1"
17 if [[ ! -s "$path" ]]; then
18 echo "missing or empty artifact: $path" >&2
19 exit 1
20 fi
21 }
22
23 magic_prefix() {
24 # Print the first bytes as hex, without spaces.
25 od -An -tx1 -N "$2" "$1" | tr -d ' \n'
26 }
27
28 require_file "$appimage"
29 require_file "$deb"
30 require_file "$arch"
31 require_file "$windows"
32
33 # AppImage 1.9 type 2 images are ELF binaries and contain the AppImage marker.
34 if [[ "$(magic_prefix "$appimage" 4)" != "7f454c46" ]]; then
35 echo "AppImage is not an ELF" >&2
36 exit 1
37 fi
38 if ! grep -a -q "AppImage" "$appimage"; then
39 echo "AppImage marker missing" >&2
40 exit 1
41 fi
42
43 # Debian packages are ar archives.
44 if [[ "$(magic_prefix "$deb" 8)" != "213c617263683e0a" ]]; then
45 echo "deb is not an ar archive" >&2
46 exit 1
47 fi
48
49 # zstd frame magic.
50 if [[ "$(magic_prefix "$arch" 4)" != "28b52ffd" ]]; then
51 echo "Arch package is not zstd" >&2
52 exit 1
53 fi
54
55 # Zip local-file header, a PE executable name, and no ELF header at the start.
56 if [[ "$(magic_prefix "$windows" 4)" != "504b0304" ]]; then
57 echo "Windows artifact is not a zip" >&2
58 exit 1
59 fi
60 if ! grep -a -q "paperdoll-renderer.exe" "$windows"; then
61 echo "Windows zip does not name paperdoll-renderer.exe" >&2
62 exit 1
63 fi
64 if [[ "$(magic_prefix "$windows" 4)" == "7f454c46" ]]; then
65 echo "Windows zip starts with an ELF header" >&2
66 exit 1
67 fi
68
69 sha256sum "$appimage" "$deb" "$arch" "$windows" | tee dist/SHA256SUMS
70 echo "package artifacts verified"
@@ -0,0 +1,70 @@
1#!/usr/bin/env bash
2# Reject a package that is the wrong kind of file. A Linux executable copied
3# into the Windows archive must not pass.
4set -euo pipefail
5
6root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
7cd "$root"
8mkdir -p dist
9
10appimage="dist/paperdoll-renderer-x86_64.AppImage"
11deb="dist/paperdoll-renderer_amd64.deb"
12arch="dist/paperdoll-renderer-x86_64.pkg.tar.zst"
13windows="dist/paperdoll-renderer-windows-x86_64.zip"
14
15require_file() {
16 local path="$1"
17 if [[ ! -s "$path" ]]; then
18 echo "missing or empty artifact: $path" >&2
19 exit 1
20 fi
21}
22
23magic_prefix() {
24 # Print the first bytes as hex, without spaces.
25 od -An -tx1 -N "$2" "$1" | tr -d ' \n'
26}
27
28require_file "$appimage"
29require_file "$deb"
30require_file "$arch"
31require_file "$windows"
32
33# AppImage 1.9 type 2 images are ELF binaries and contain the AppImage marker.
34if [[ "$(magic_prefix "$appimage" 4)" != "7f454c46" ]]; then
35 echo "AppImage is not an ELF" >&2
36 exit 1
37fi
38if ! grep -a -q "AppImage" "$appimage"; then
39 echo "AppImage marker missing" >&2
40 exit 1
41fi
42
43# Debian packages are ar archives.
44if [[ "$(magic_prefix "$deb" 8)" != "213c617263683e0a" ]]; then
45 echo "deb is not an ar archive" >&2
46 exit 1
47fi
48
49# zstd frame magic.
50if [[ "$(magic_prefix "$arch" 4)" != "28b52ffd" ]]; then
51 echo "Arch package is not zstd" >&2
52 exit 1
53fi
54
55# Zip local-file header, a PE executable name, and no ELF header at the start.
56if [[ "$(magic_prefix "$windows" 4)" != "504b0304" ]]; then
57 echo "Windows artifact is not a zip" >&2
58 exit 1
59fi
60if ! grep -a -q "paperdoll-renderer.exe" "$windows"; then
61 echo "Windows zip does not name paperdoll-renderer.exe" >&2
62 exit 1
63fi
64if [[ "$(magic_prefix "$windows" 4)" == "7f454c46" ]]; then
65 echo "Windows zip starts with an ELF header" >&2
66 exit 1
67fi
68
69sha256sum "$appimage" "$deb" "$arch" "$windows" | tee dist/SHA256SUMS
70echo "package artifacts verified"
scripts/package/appimage.sh added +49 −0
@@ -0,0 +1,49 @@
1 #!/usr/bin/env bash
2 # Build a Linux x86_64 AppImage of the foundation shell.
3 # appimagetool 1.9.1 is pinned. The checksum is of that GitHub release asset.
4 set -euo pipefail
5
6 root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
7 # shellcheck source=scripts/package/common.sh
8 source "$root/scripts/package/common.sh"
9 version="$(bash "$root/scripts/ci/package-version.sh")"
10 build_linux_release "$root"
11
12 tool_dir="${APPIMAGETOOL_DIR:-$root/dist/tools}"
13 tool="$tool_dir/appimagetool-x86_64.AppImage"
14 expected="ed4ce84f0d9caff66f50bcca6ff6f35aae54ce8135408b3fa33abfc3cb384eb0"
15 mkdir -p "$tool_dir"
16 if [[ ! -f "$tool" ]] || [[ "$(sha256sum "$tool" | awk '{print $1}')" != "$expected" ]]; then
17 curl -fL --retry 3 -o "$tool.partial" \
18 "https://github.com/AppImage/appimagetool/releases/download/1.9.1/appimagetool-x86_64.AppImage"
19 echo "${expected} ${tool}.partial" | sha256sum -c -
20 mv "$tool.partial" "$tool"
21 chmod +x "$tool"
22 fi
23
24 stage="$(mktemp -d)"
25 trap 'rm -rf "$stage"' EXIT
26 mkdir -p \
27 "$stage/usr/bin" \
28 "$stage/usr/share/applications" \
29 "$stage/usr/share/icons/hicolor/64x64/apps"
30 install -m 755 "$root/target/release/paperdoll-renderer" "$stage/usr/bin/paperdoll-renderer"
31 install -m 644 "$root/packaging/linux/paperdoll-renderer.desktop" "$stage/paperdoll-renderer.desktop"
32 install -m 644 "$root/packaging/linux/paperdoll-renderer.desktop" "$stage/usr/share/applications/paperdoll-renderer.desktop"
33 install -m 644 "$root/packaging/linux/icon-64.png" "$stage/paperdoll-renderer.png"
34 install -m 644 "$root/packaging/linux/icon-64.png" "$stage/usr/share/icons/hicolor/64x64/apps/paperdoll-renderer.png"
35 install -m 644 "$root/LICENSE" "$stage/LICENSE"
36 cat > "$stage/AppRun" << 'EOF'
37 #!/bin/sh
38 here="$(dirname "$(readlink -f "$0")")"
39 exec "$here/usr/bin/paperdoll-renderer" "$@"
40 EOF
41 chmod +x "$stage/AppRun"
42
43 mkdir -p "$root/dist"
44 export ARCH=x86_64
45 export APPIMAGE_EXTRACT_AND_RUN=1
46 "$tool" "$stage" "$root/dist/paperdoll-renderer-${version}-x86_64.AppImage"
47 cp -f "$root/dist/paperdoll-renderer-${version}-x86_64.AppImage" "$root/dist/paperdoll-renderer-x86_64.AppImage"
48 chmod +x "$root/dist/paperdoll-renderer-x86_64.AppImage"
49 echo "wrote dist/paperdoll-renderer-x86_64.AppImage"
@@ -0,0 +1,49 @@
1#!/usr/bin/env bash
2# Build a Linux x86_64 AppImage of the foundation shell.
3# appimagetool 1.9.1 is pinned. The checksum is of that GitHub release asset.
4set -euo pipefail
5
6root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
7# shellcheck source=scripts/package/common.sh
8source "$root/scripts/package/common.sh"
9version="$(bash "$root/scripts/ci/package-version.sh")"
10build_linux_release "$root"
11
12tool_dir="${APPIMAGETOOL_DIR:-$root/dist/tools}"
13tool="$tool_dir/appimagetool-x86_64.AppImage"
14expected="ed4ce84f0d9caff66f50bcca6ff6f35aae54ce8135408b3fa33abfc3cb384eb0"
15mkdir -p "$tool_dir"
16if [[ ! -f "$tool" ]] || [[ "$(sha256sum "$tool" | awk '{print $1}')" != "$expected" ]]; then
17 curl -fL --retry 3 -o "$tool.partial" \
18 "https://github.com/AppImage/appimagetool/releases/download/1.9.1/appimagetool-x86_64.AppImage"
19 echo "${expected} ${tool}.partial" | sha256sum -c -
20 mv "$tool.partial" "$tool"
21 chmod +x "$tool"
22fi
23
24stage="$(mktemp -d)"
25trap 'rm -rf "$stage"' EXIT
26mkdir -p \
27 "$stage/usr/bin" \
28 "$stage/usr/share/applications" \
29 "$stage/usr/share/icons/hicolor/64x64/apps"
30install -m 755 "$root/target/release/paperdoll-renderer" "$stage/usr/bin/paperdoll-renderer"
31install -m 644 "$root/packaging/linux/paperdoll-renderer.desktop" "$stage/paperdoll-renderer.desktop"
32install -m 644 "$root/packaging/linux/paperdoll-renderer.desktop" "$stage/usr/share/applications/paperdoll-renderer.desktop"
33install -m 644 "$root/packaging/linux/icon-64.png" "$stage/paperdoll-renderer.png"
34install -m 644 "$root/packaging/linux/icon-64.png" "$stage/usr/share/icons/hicolor/64x64/apps/paperdoll-renderer.png"
35install -m 644 "$root/LICENSE" "$stage/LICENSE"
36cat > "$stage/AppRun" << 'EOF'
37#!/bin/sh
38here="$(dirname "$(readlink -f "$0")")"
39exec "$here/usr/bin/paperdoll-renderer" "$@"
40EOF
41chmod +x "$stage/AppRun"
42
43mkdir -p "$root/dist"
44export ARCH=x86_64
45export APPIMAGE_EXTRACT_AND_RUN=1
46"$tool" "$stage" "$root/dist/paperdoll-renderer-${version}-x86_64.AppImage"
47cp -f "$root/dist/paperdoll-renderer-${version}-x86_64.AppImage" "$root/dist/paperdoll-renderer-x86_64.AppImage"
48chmod +x "$root/dist/paperdoll-renderer-x86_64.AppImage"
49echo "wrote dist/paperdoll-renderer-x86_64.AppImage"
scripts/package/arch.sh added +42 −0
@@ -0,0 +1,42 @@
1 #!/usr/bin/env bash
2 # Build an Arch .pkg.tar.zst with makepkg. The package is not installed and
3 # it is not published.
4 set -euo pipefail
5
6 root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
7 if ! command -v makepkg >/dev/null 2>&1; then
8 echo "makepkg is not installed. The Arch package job runs on archlinux/archlinux:base-devel." >&2
9 exit 1
10 fi
11
12 version="$(bash "$root/scripts/ci/package-version.sh")"
13 export REPO_ROOT="$root"
14 export PAPERDOLL_PKGVER="$version"
15 export CARGO_HOME="${CARGO_HOME:-$root/cargo-home}"
16
17 work="$(mktemp -d)"
18 trap 'rm -rf "$work"' EXIT
19 cp "$root/packaging/arch/PKGBUILD" "$work/PKGBUILD"
20
21 run_makepkg() {
22 (cd "$work" && makepkg -f --noconfirm --nodeps)
23 }
24
25 if [[ "$(id -u)" -eq 0 ]]; then
26 if ! id builduser >/dev/null 2>&1; then
27 useradd -m builduser
28 fi
29 chown -R builduser:builduser "$root" "$work"
30 su builduser -c "export REPO_ROOT='$root' PAPERDOLL_PKGVER='$version' CARGO_HOME='$CARGO_HOME' PATH='$PATH'; cd '$work' && makepkg -f --noconfirm --nodeps"
31 else
32 run_makepkg
33 fi
34
35 mapfile -t packages < <(find "$work" -maxdepth 1 -type f -name "paperdoll-renderer-${version}-*-x86_64.pkg.tar.zst" ! -name '*.sig')
36 if [[ "${#packages[@]}" -ne 1 ]]; then
37 echo "expected one Arch package, found ${#packages[@]}" >&2
38 exit 1
39 fi
40 mkdir -p "$root/dist"
41 cp -f "${packages[0]}" "$root/dist/paperdoll-renderer-x86_64.pkg.tar.zst"
42 echo "wrote dist/paperdoll-renderer-x86_64.pkg.tar.zst"
@@ -0,0 +1,42 @@
1#!/usr/bin/env bash
2# Build an Arch .pkg.tar.zst with makepkg. The package is not installed and
3# it is not published.
4set -euo pipefail
5
6root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
7if ! command -v makepkg >/dev/null 2>&1; then
8 echo "makepkg is not installed. The Arch package job runs on archlinux/archlinux:base-devel." >&2
9 exit 1
10fi
11
12version="$(bash "$root/scripts/ci/package-version.sh")"
13export REPO_ROOT="$root"
14export PAPERDOLL_PKGVER="$version"
15export CARGO_HOME="${CARGO_HOME:-$root/cargo-home}"
16
17work="$(mktemp -d)"
18trap 'rm -rf "$work"' EXIT
19cp "$root/packaging/arch/PKGBUILD" "$work/PKGBUILD"
20
21run_makepkg() {
22 (cd "$work" && makepkg -f --noconfirm --nodeps)
23}
24
25if [[ "$(id -u)" -eq 0 ]]; then
26 if ! id builduser >/dev/null 2>&1; then
27 useradd -m builduser
28 fi
29 chown -R builduser:builduser "$root" "$work"
30 su builduser -c "export REPO_ROOT='$root' PAPERDOLL_PKGVER='$version' CARGO_HOME='$CARGO_HOME' PATH='$PATH'; cd '$work' && makepkg -f --noconfirm --nodeps"
31else
32 run_makepkg
33fi
34
35mapfile -t packages < <(find "$work" -maxdepth 1 -type f -name "paperdoll-renderer-${version}-*-x86_64.pkg.tar.zst" ! -name '*.sig')
36if [[ "${#packages[@]}" -ne 1 ]]; then
37 echo "expected one Arch package, found ${#packages[@]}" >&2
38 exit 1
39fi
40mkdir -p "$root/dist"
41cp -f "${packages[0]}" "$root/dist/paperdoll-renderer-x86_64.pkg.tar.zst"
42echo "wrote dist/paperdoll-renderer-x86_64.pkg.tar.zst"
scripts/package/common.sh added +9 −0
@@ -0,0 +1,9 @@
1 #!/usr/bin/env bash
2 set -euo pipefail
3
4 build_linux_release() {
5 local root="$1"
6 export CARGO_HOME="${CARGO_HOME:-$root/cargo-home}"
7 export PATH="$CARGO_HOME/bin:$PATH"
8 cargo build --release --locked --manifest-path "$root/Cargo.toml" --target-dir "$root/target"
9 }
@@ -0,0 +1,9 @@
1#!/usr/bin/env bash
2set -euo pipefail
3
4build_linux_release() {
5 local root="$1"
6 export CARGO_HOME="${CARGO_HOME:-$root/cargo-home}"
7 export PATH="$CARGO_HOME/bin:$PATH"
8 cargo build --release --locked --manifest-path "$root/Cargo.toml" --target-dir "$root/target"
9}
scripts/package/deb.sh added +46 −0
@@ -0,0 +1,46 @@
1 #!/usr/bin/env bash
2 # Build a Debian/Ubuntu package of the foundation shell.
3 set -euo pipefail
4
5 root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
6 # shellcheck source=scripts/package/common.sh
7 source "$root/scripts/package/common.sh"
8 version="$(bash "$root/scripts/ci/package-version.sh")"
9 build_linux_release "$root"
10
11 stage="$(mktemp -d)"
12 trap 'rm -rf "$stage"' EXIT
13 mkdir -p \
14 "$stage/DEBIAN" \
15 "$stage/usr/bin" \
16 "$stage/usr/share/applications" \
17 "$stage/usr/share/icons/hicolor/64x64/apps" \
18 "$stage/usr/share/doc/paperdoll-renderer" \
19 "$stage/usr/share/licenses/paperdoll-renderer"
20
21 install -m 755 "$root/target/release/paperdoll-renderer" "$stage/usr/bin/paperdoll-renderer"
22 install -m 644 "$root/packaging/linux/paperdoll-renderer.desktop" "$stage/usr/share/applications/paperdoll-renderer.desktop"
23 install -m 644 "$root/packaging/linux/icon-64.png" "$stage/usr/share/icons/hicolor/64x64/apps/paperdoll-renderer.png"
24 install -m 644 "$root/LICENSE" "$stage/usr/share/licenses/paperdoll-renderer/LICENSE"
25 install -m 644 "$root/LICENSE" "$stage/usr/share/doc/paperdoll-renderer/copyright"
26
27 # Runtime libraries observed from ldd on the glibc build. Versions are the
28 # Debian sonames, not a claim that every Ubuntu release was installed here.
29 cat > "$stage/DEBIAN/control" << EOF
30 Package: paperdoll-renderer
31 Version: ${version}
32 Section: graphics
33 Priority: optional
34 Architecture: amd64
35 Maintainer: Tim Falken
36 Depends: libc6, libgcc-s1, libstdc++6, libxcb1, libx11-6, libxkbcommon0, libxkbcommon-x11-0, libgl1
37 Description: Paperdoll Renderer foundation shell
38 Status window for the Paperdoll Renderer project foundation.
39 Model import and paperdoll rendering are not included.
40 EOF
41
42 mkdir -p "$root/dist"
43 dpkg-deb --root-owner-group --build "$stage" "$root/dist/paperdoll-renderer_${version}_amd64.deb"
44 cp -f "$root/dist/paperdoll-renderer_${version}_amd64.deb" "$root/dist/paperdoll-renderer_amd64.deb"
45 dpkg-deb --info "$root/dist/paperdoll-renderer_amd64.deb"
46 echo "wrote dist/paperdoll-renderer_amd64.deb"
@@ -0,0 +1,46 @@
1#!/usr/bin/env bash
2# Build a Debian/Ubuntu package of the foundation shell.
3set -euo pipefail
4
5root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
6# shellcheck source=scripts/package/common.sh
7source "$root/scripts/package/common.sh"
8version="$(bash "$root/scripts/ci/package-version.sh")"
9build_linux_release "$root"
10
11stage="$(mktemp -d)"
12trap 'rm -rf "$stage"' EXIT
13mkdir -p \
14 "$stage/DEBIAN" \
15 "$stage/usr/bin" \
16 "$stage/usr/share/applications" \
17 "$stage/usr/share/icons/hicolor/64x64/apps" \
18 "$stage/usr/share/doc/paperdoll-renderer" \
19 "$stage/usr/share/licenses/paperdoll-renderer"
20
21install -m 755 "$root/target/release/paperdoll-renderer" "$stage/usr/bin/paperdoll-renderer"
22install -m 644 "$root/packaging/linux/paperdoll-renderer.desktop" "$stage/usr/share/applications/paperdoll-renderer.desktop"
23install -m 644 "$root/packaging/linux/icon-64.png" "$stage/usr/share/icons/hicolor/64x64/apps/paperdoll-renderer.png"
24install -m 644 "$root/LICENSE" "$stage/usr/share/licenses/paperdoll-renderer/LICENSE"
25install -m 644 "$root/LICENSE" "$stage/usr/share/doc/paperdoll-renderer/copyright"
26
27# Runtime libraries observed from ldd on the glibc build. Versions are the
28# Debian sonames, not a claim that every Ubuntu release was installed here.
29cat > "$stage/DEBIAN/control" << EOF
30Package: paperdoll-renderer
31Version: ${version}
32Section: graphics
33Priority: optional
34Architecture: amd64
35Maintainer: Tim Falken
36Depends: libc6, libgcc-s1, libstdc++6, libxcb1, libx11-6, libxkbcommon0, libxkbcommon-x11-0, libgl1
37Description: Paperdoll Renderer foundation shell
38 Status window for the Paperdoll Renderer project foundation.
39 Model import and paperdoll rendering are not included.
40EOF
41
42mkdir -p "$root/dist"
43dpkg-deb --root-owner-group --build "$stage" "$root/dist/paperdoll-renderer_${version}_amd64.deb"
44cp -f "$root/dist/paperdoll-renderer_${version}_amd64.deb" "$root/dist/paperdoll-renderer_amd64.deb"
45dpkg-deb --info "$root/dist/paperdoll-renderer_amd64.deb"
46echo "wrote dist/paperdoll-renderer_amd64.deb"
scripts/package/windows.sh added +47 −0
@@ -0,0 +1,47 @@
1 #!/usr/bin/env bash
2 # Cross-compile the foundation shell for Windows x86_64 with MinGW.
3 # posprint uses this route and states that BlueGit has no Windows runner.
4 # This script packages the .exe in a zip. It does not run the Windows binary.
5 set -euo pipefail
6
7 root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
8 version="$(bash "$root/scripts/ci/package-version.sh")"
9 export CARGO_HOME="${CARGO_HOME:-$root/cargo-home}"
10 export PATH="$CARGO_HOME/bin:$PATH"
11
12 if ! command -v x86_64-w64-mingw32-gcc >/dev/null 2>&1; then
13 echo "x86_64-w64-mingw32-gcc is not installed" >&2
14 exit 1
15 fi
16 rustup target add x86_64-pc-windows-gnu
17 cargo build --release --locked --target x86_64-pc-windows-gnu --manifest-path "$root/Cargo.toml"
18
19 exe="$root/target/x86_64-pc-windows-gnu/release/paperdoll-renderer.exe"
20 if [[ ! -s "$exe" ]]; then
21 echo "Windows executable was not produced" >&2
22 exit 1
23 fi
24 # PE magic. Refuse to zip an ELF if the linker targeted the wrong OS.
25 if ! od -An -tx1 -N 2 "$exe" | grep -q "4d 5a"; then
26 echo "paperdoll-renderer.exe does not start with MZ" >&2
27 exit 1
28 fi
29
30 stage="$(mktemp -d)"
31 trap 'rm -rf "$stage"' EXIT
32 install -m 644 "$exe" "$stage/paperdoll-renderer.exe"
33 install -m 644 "$root/LICENSE" "$stage/LICENSE.txt"
34 printf '%s\n' "Paperdoll Renderer ${version}" "Foundation shell. Import and render are not included." \
35 > "$stage/README.txt"
36
37 mkdir -p "$root/dist"
38 rm -f "$root/dist/paperdoll-renderer-${version}-windows-x86_64.zip" \
39 "$root/dist/paperdoll-renderer-windows-x86_64.zip"
40 (
41 cd "$stage"
42 zip -r "$root/dist/paperdoll-renderer-${version}-windows-x86_64.zip" \
43 paperdoll-renderer.exe LICENSE.txt README.txt
44 )
45 cp -f "$root/dist/paperdoll-renderer-${version}-windows-x86_64.zip" \
46 "$root/dist/paperdoll-renderer-windows-x86_64.zip"
47 echo "wrote dist/paperdoll-renderer-windows-x86_64.zip"
@@ -0,0 +1,47 @@
1#!/usr/bin/env bash
2# Cross-compile the foundation shell for Windows x86_64 with MinGW.
3# posprint uses this route and states that BlueGit has no Windows runner.
4# This script packages the .exe in a zip. It does not run the Windows binary.
5set -euo pipefail
6
7root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
8version="$(bash "$root/scripts/ci/package-version.sh")"
9export CARGO_HOME="${CARGO_HOME:-$root/cargo-home}"
10export PATH="$CARGO_HOME/bin:$PATH"
11
12if ! command -v x86_64-w64-mingw32-gcc >/dev/null 2>&1; then
13 echo "x86_64-w64-mingw32-gcc is not installed" >&2
14 exit 1
15fi
16rustup target add x86_64-pc-windows-gnu
17cargo build --release --locked --target x86_64-pc-windows-gnu --manifest-path "$root/Cargo.toml"
18
19exe="$root/target/x86_64-pc-windows-gnu/release/paperdoll-renderer.exe"
20if [[ ! -s "$exe" ]]; then
21 echo "Windows executable was not produced" >&2
22 exit 1
23fi
24# PE magic. Refuse to zip an ELF if the linker targeted the wrong OS.
25if ! od -An -tx1 -N 2 "$exe" | grep -q "4d 5a"; then
26 echo "paperdoll-renderer.exe does not start with MZ" >&2
27 exit 1
28fi
29
30stage="$(mktemp -d)"
31trap 'rm -rf "$stage"' EXIT
32install -m 644 "$exe" "$stage/paperdoll-renderer.exe"
33install -m 644 "$root/LICENSE" "$stage/LICENSE.txt"
34printf '%s\n' "Paperdoll Renderer ${version}" "Foundation shell. Import and render are not included." \
35 > "$stage/README.txt"
36
37mkdir -p "$root/dist"
38rm -f "$root/dist/paperdoll-renderer-${version}-windows-x86_64.zip" \
39 "$root/dist/paperdoll-renderer-windows-x86_64.zip"
40(
41 cd "$stage"
42 zip -r "$root/dist/paperdoll-renderer-${version}-windows-x86_64.zip" \
43 paperdoll-renderer.exe LICENSE.txt README.txt
44)
45cp -f "$root/dist/paperdoll-renderer-${version}-windows-x86_64.zip" \
46 "$root/dist/paperdoll-renderer-windows-x86_64.zip"
47echo "wrote dist/paperdoll-renderer-windows-x86_64.zip"
src/foundation.rs added +272 −0
@@ -0,0 +1,272 @@
1 //! Honest capability report for the foundation shell.
2 //!
3 //! Later features add import, animation, rendering and preview. Until those
4 //! features land, this module must keep reporting them as not built.
5
6 /// Product capability named by the design.
7 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
8 pub enum Capability {
9 ProjectShell,
10 ObjMtlTextures,
11 Fbx,
12 GltfGlb,
13 SkeletalAnimation,
14 AttachmentEditor,
15 PaperdollRender,
16 Preview2d,
17 }
18
19 /// Whether this build actually contains the capability.
20 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
21 pub enum Availability {
22 Present,
23 NotBuilt,
24 }
25
26 /// What the process should do with the command line it received.
27 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
28 pub enum CliRequest {
29 OpenWindow,
30 PrintStatus,
31 PrintHelp,
32 }
33
34 /// Rejected command line. A model path is rejected on purpose: accepting one
35 /// would look like import support.
36 #[derive(Debug, Clone, PartialEq, Eq)]
37 pub enum CliError {
38 UnknownArgument(String),
39 }
40
41 const CAPABILITIES: [Capability; 8] = [
42 Capability::ProjectShell,
43 Capability::ObjMtlTextures,
44 Capability::Fbx,
45 Capability::GltfGlb,
46 Capability::SkeletalAnimation,
47 Capability::AttachmentEditor,
48 Capability::PaperdollRender,
49 Capability::Preview2d,
50 ];
51
52 pub fn capabilities() -> &'static [Capability] {
53 &CAPABILITIES
54 }
55
56 pub fn availability(capability: Capability) -> Availability {
57 match capability {
58 Capability::ProjectShell => Availability::Present,
59 Capability::ObjMtlTextures
60 | Capability::Fbx
61 | Capability::GltfGlb
62 | Capability::SkeletalAnimation
63 | Capability::AttachmentEditor
64 | Capability::PaperdollRender
65 | Capability::Preview2d => Availability::NotBuilt,
66 }
67 }
68
69 pub fn machine_key(capability: Capability) -> &'static str {
70 match capability {
71 Capability::ProjectShell => "project_shell",
72 Capability::ObjMtlTextures => "obj_mtl_textures",
73 Capability::Fbx => "fbx",
74 Capability::GltfGlb => "gltf_glb",
75 Capability::SkeletalAnimation => "skeletal_animation",
76 Capability::AttachmentEditor => "attachment_editor",
77 Capability::PaperdollRender => "paperdoll_render",
78 Capability::Preview2d => "preview_2d",
79 }
80 }
81
82 pub fn machine_state(availability: Availability) -> &'static str {
83 match availability {
84 Availability::Present => "present",
85 Availability::NotBuilt => "not_built",
86 }
87 }
88
89 pub fn dutch_label(capability: Capability) -> &'static str {
90 match capability {
91 Capability::ProjectShell => "projectschil",
92 Capability::ObjMtlTextures => "OBJ + MTL + textures",
93 Capability::Fbx => "FBX",
94 Capability::GltfGlb => "glTF/GLB",
95 Capability::SkeletalAnimation => "skeletanimatie",
96 Capability::AttachmentEditor => "3D-attachmenteditor",
97 Capability::PaperdollRender => "paperdoll-render",
98 Capability::Preview2d => "2D-preview",
99 }
100 }
101
102 pub fn dutch_state(availability: Availability) -> &'static str {
103 match availability {
104 Availability::Present => "aanwezig",
105 Availability::NotBuilt => "niet gebouwd",
106 }
107 }
108
109 pub fn dutch_summary() -> &'static str {
110 "Deze build opent alleen dit statusvenster. OBJ+MTL+textures, FBX, glTF/GLB, skeletanimatie, de attachment-editor, paperdoll-render en de 2D-preview zijn niet gebouwd. Synthetische testassets, als ze in de repository staan, worden door dit programma niet geladen."
111 }
112
113 /// Stable status text shared by `--status` and the window.
114 pub fn report() -> String {
115 let mut lines = Vec::with_capacity(2 + CAPABILITIES.len());
116 lines.push("name: Paperdoll Renderer".to_string());
117 lines.push("phase: foundation".to_string());
118 for capability in CAPABILITIES {
119 lines.push(format!(
120 "{}: {}",
121 machine_key(capability),
122 machine_state(availability(capability))
123 ));
124 }
125 lines.join("\n")
126 }
127
128 /// Shared libraries the X11 window loads. `ldd` does not list them: eframe
129 /// opens them at runtime. A missing one panics inside that loader, so the
130 /// shell checks first.
131 pub const LINUX_WINDOW_LIBRARIES: &[&str] = &[
132 "libxkbcommon-x11.so.0",
133 "libxkbcommon.so.0",
134 "libxcb.so.1",
135 "libX11.so.6",
136 "libGL.so.1",
137 ];
138
139 pub fn missing_library_message(missing: &[&str]) -> String {
140 format!(
141 "het statusvenster kan niet openen; deze bibliotheken ontbreken: {}. Import en render zijn niet gebouwd.",
142 missing.join(", ")
143 )
144 }
145
146 #[cfg(target_os = "linux")]
147 pub fn missing_window_libraries() -> Vec<&'static str> {
148 LINUX_WINDOW_LIBRARIES
149 .iter()
150 .copied()
151 .filter(|name| {
152 // Safety: `name` is a nul-free soname literal. A missing library
153 // returns Err; no symbol from the library is called.
154 unsafe { libloading::Library::new(name).is_err() }
155 })
156 .collect()
157 }
158
159 pub fn help_text() -> &'static str {
160 "\
161 Paperdoll Renderer — projectbasis
162
163 Gebruik:
164 paperdoll-renderer open het statusvenster
165 paperdoll-renderer --status print de status en sluit
166 paperdoll-renderer --help toon deze tekst
167
168 Een modelpad wordt niet geaccepteerd. Import en render zijn niet gebouwd."
169 }
170
171 pub fn parse_cli<'a, I>(args: I) -> Result<CliRequest, CliError>
172 where
173 I: IntoIterator<Item = &'a str>,
174 {
175 let mut request = CliRequest::OpenWindow;
176 for arg in args {
177 match arg {
178 "--help" | "-h" => request = CliRequest::PrintHelp,
179 "--status" => {
180 if request != CliRequest::PrintHelp {
181 request = CliRequest::PrintStatus;
182 }
183 }
184 other => {
185 return Err(CliError::UnknownArgument(other.to_string()));
186 }
187 }
188 }
189 Ok(request)
190 }
191
192 #[cfg(test)]
193 mod tests {
194 use super::*;
195
196 #[test]
197 fn only_the_project_shell_is_present() {
198 assert_eq!(
199 availability(Capability::ProjectShell),
200 Availability::Present
201 );
202 for capability in capabilities() {
203 if *capability == Capability::ProjectShell {
204 continue;
205 }
206 assert_eq!(
207 availability(*capability),
208 Availability::NotBuilt,
209 "{capability:?} must stay not built in the foundation"
210 );
211 }
212 }
213
214 #[test]
215 fn status_report_names_every_format_as_not_built() {
216 let report = report();
217 assert!(report.starts_with("name: Paperdoll Renderer\nphase: foundation\n"));
218 for key in [
219 "obj_mtl_textures",
220 "fbx",
221 "gltf_glb",
222 "skeletal_animation",
223 "attachment_editor",
224 "paperdoll_render",
225 "preview_2d",
226 ] {
227 assert!(
228 report.contains(&format!("{key}: not_built")),
229 "missing {key} in {report}"
230 );
231 assert!(
232 !report.contains(&format!("{key}: present")),
233 "{key} must not be reported as present"
234 );
235 }
236 assert!(report.contains("project_shell: present"));
237 let summary = dutch_summary();
238 assert!(summary.contains("niet gebouwd"));
239 assert!(summary.contains("niet geladen"));
240 let lower = summary.to_lowercase();
241 assert!(!lower.contains("import werkt"));
242 assert!(!lower.contains("render werkt"));
243 }
244
245 #[test]
246 fn cli_opens_a_window_or_prints_status_and_rejects_model_paths() {
247 assert_eq!(parse_cli(std::iter::empty()), Ok(CliRequest::OpenWindow));
248 assert_eq!(parse_cli(["--status"]), Ok(CliRequest::PrintStatus));
249 assert_eq!(parse_cli(["--help"]), Ok(CliRequest::PrintHelp));
250 assert_eq!(parse_cli(["-h", "--status"]), Ok(CliRequest::PrintHelp));
251 assert_eq!(
252 parse_cli(["tests/fixtures/bodies/test-body-male.glb"]),
253 Err(CliError::UnknownArgument(
254 "tests/fixtures/bodies/test-body-male.glb".to_string()
255 ))
256 );
257 assert_eq!(
258 parse_cli(["--status", "--render"]),
259 Err(CliError::UnknownArgument("--render".to_string()))
260 );
261 assert!(help_text().contains("niet gebouwd"));
262 }
263
264 #[test]
265 fn missing_library_message_names_the_library_and_does_not_claim_import() {
266 let message = missing_library_message(&["libxkbcommon-x11.so.0"]);
267 assert!(message.contains("libxkbcommon-x11.so.0"));
268 assert!(message.contains("niet gebouwd"));
269 assert!(!message.to_lowercase().contains("import werkt"));
270 assert!(!LINUX_WINDOW_LIBRARIES.is_empty());
271 }
272 }
@@ -0,0 +1,272 @@
1//! Honest capability report for the foundation shell.
2//!
3//! Later features add import, animation, rendering and preview. Until those
4//! features land, this module must keep reporting them as not built.
5
6/// Product capability named by the design.
7#[derive(Debug, Clone, Copy, PartialEq, Eq)]
8pub enum Capability {
9 ProjectShell,
10 ObjMtlTextures,
11 Fbx,
12 GltfGlb,
13 SkeletalAnimation,
14 AttachmentEditor,
15 PaperdollRender,
16 Preview2d,
17}
18
19/// Whether this build actually contains the capability.
20#[derive(Debug, Clone, Copy, PartialEq, Eq)]
21pub enum Availability {
22 Present,
23 NotBuilt,
24}
25
26/// What the process should do with the command line it received.
27#[derive(Debug, Clone, Copy, PartialEq, Eq)]
28pub enum CliRequest {
29 OpenWindow,
30 PrintStatus,
31 PrintHelp,
32}
33
34/// Rejected command line. A model path is rejected on purpose: accepting one
35/// would look like import support.
36#[derive(Debug, Clone, PartialEq, Eq)]
37pub enum CliError {
38 UnknownArgument(String),
39}
40
41const CAPABILITIES: [Capability; 8] = [
42 Capability::ProjectShell,
43 Capability::ObjMtlTextures,
44 Capability::Fbx,
45 Capability::GltfGlb,
46 Capability::SkeletalAnimation,
47 Capability::AttachmentEditor,
48 Capability::PaperdollRender,
49 Capability::Preview2d,
50];
51
52pub fn capabilities() -> &'static [Capability] {
53 &CAPABILITIES
54}
55
56pub fn availability(capability: Capability) -> Availability {
57 match capability {
58 Capability::ProjectShell => Availability::Present,
59 Capability::ObjMtlTextures
60 | Capability::Fbx
61 | Capability::GltfGlb
62 | Capability::SkeletalAnimation
63 | Capability::AttachmentEditor
64 | Capability::PaperdollRender
65 | Capability::Preview2d => Availability::NotBuilt,
66 }
67}
68
69pub fn machine_key(capability: Capability) -> &'static str {
70 match capability {
71 Capability::ProjectShell => "project_shell",
72 Capability::ObjMtlTextures => "obj_mtl_textures",
73 Capability::Fbx => "fbx",
74 Capability::GltfGlb => "gltf_glb",
75 Capability::SkeletalAnimation => "skeletal_animation",
76 Capability::AttachmentEditor => "attachment_editor",
77 Capability::PaperdollRender => "paperdoll_render",
78 Capability::Preview2d => "preview_2d",
79 }
80}
81
82pub fn machine_state(availability: Availability) -> &'static str {
83 match availability {
84 Availability::Present => "present",
85 Availability::NotBuilt => "not_built",
86 }
87}
88
89pub fn dutch_label(capability: Capability) -> &'static str {
90 match capability {
91 Capability::ProjectShell => "projectschil",
92 Capability::ObjMtlTextures => "OBJ + MTL + textures",
93 Capability::Fbx => "FBX",
94 Capability::GltfGlb => "glTF/GLB",
95 Capability::SkeletalAnimation => "skeletanimatie",
96 Capability::AttachmentEditor => "3D-attachmenteditor",
97 Capability::PaperdollRender => "paperdoll-render",
98 Capability::Preview2d => "2D-preview",
99 }
100}
101
102pub fn dutch_state(availability: Availability) -> &'static str {
103 match availability {
104 Availability::Present => "aanwezig",
105 Availability::NotBuilt => "niet gebouwd",
106 }
107}
108
109pub fn dutch_summary() -> &'static str {
110 "Deze build opent alleen dit statusvenster. OBJ+MTL+textures, FBX, glTF/GLB, skeletanimatie, de attachment-editor, paperdoll-render en de 2D-preview zijn niet gebouwd. Synthetische testassets, als ze in de repository staan, worden door dit programma niet geladen."
111}
112
113/// Stable status text shared by `--status` and the window.
114pub fn report() -> String {
115 let mut lines = Vec::with_capacity(2 + CAPABILITIES.len());
116 lines.push("name: Paperdoll Renderer".to_string());
117 lines.push("phase: foundation".to_string());
118 for capability in CAPABILITIES {
119 lines.push(format!(
120 "{}: {}",
121 machine_key(capability),
122 machine_state(availability(capability))
123 ));
124 }
125 lines.join("\n")
126}
127
128/// Shared libraries the X11 window loads. `ldd` does not list them: eframe
129/// opens them at runtime. A missing one panics inside that loader, so the
130/// shell checks first.
131pub const LINUX_WINDOW_LIBRARIES: &[&str] = &[
132 "libxkbcommon-x11.so.0",
133 "libxkbcommon.so.0",
134 "libxcb.so.1",
135 "libX11.so.6",
136 "libGL.so.1",
137];
138
139pub fn missing_library_message(missing: &[&str]) -> String {
140 format!(
141 "het statusvenster kan niet openen; deze bibliotheken ontbreken: {}. Import en render zijn niet gebouwd.",
142 missing.join(", ")
143 )
144}
145
146#[cfg(target_os = "linux")]
147pub fn missing_window_libraries() -> Vec<&'static str> {
148 LINUX_WINDOW_LIBRARIES
149 .iter()
150 .copied()
151 .filter(|name| {
152 // Safety: `name` is a nul-free soname literal. A missing library
153 // returns Err; no symbol from the library is called.
154 unsafe { libloading::Library::new(name).is_err() }
155 })
156 .collect()
157}
158
159pub fn help_text() -> &'static str {
160 "\
161Paperdoll Renderer — projectbasis
162
163Gebruik:
164 paperdoll-renderer open het statusvenster
165 paperdoll-renderer --status print de status en sluit
166 paperdoll-renderer --help toon deze tekst
167
168Een modelpad wordt niet geaccepteerd. Import en render zijn niet gebouwd."
169}
170
171pub fn parse_cli<'a, I>(args: I) -> Result<CliRequest, CliError>
172where
173 I: IntoIterator<Item = &'a str>,
174{
175 let mut request = CliRequest::OpenWindow;
176 for arg in args {
177 match arg {
178 "--help" | "-h" => request = CliRequest::PrintHelp,
179 "--status" => {
180 if request != CliRequest::PrintHelp {
181 request = CliRequest::PrintStatus;
182 }
183 }
184 other => {
185 return Err(CliError::UnknownArgument(other.to_string()));
186 }
187 }
188 }
189 Ok(request)
190}
191
192#[cfg(test)]
193mod tests {
194 use super::*;
195
196 #[test]
197 fn only_the_project_shell_is_present() {
198 assert_eq!(
199 availability(Capability::ProjectShell),
200 Availability::Present
201 );
202 for capability in capabilities() {
203 if *capability == Capability::ProjectShell {
204 continue;
205 }
206 assert_eq!(
207 availability(*capability),
208 Availability::NotBuilt,
209 "{capability:?} must stay not built in the foundation"
210 );
211 }
212 }
213
214 #[test]
215 fn status_report_names_every_format_as_not_built() {
216 let report = report();
217 assert!(report.starts_with("name: Paperdoll Renderer\nphase: foundation\n"));
218 for key in [
219 "obj_mtl_textures",
220 "fbx",
221 "gltf_glb",
222 "skeletal_animation",
223 "attachment_editor",
224 "paperdoll_render",
225 "preview_2d",
226 ] {
227 assert!(
228 report.contains(&format!("{key}: not_built")),
229 "missing {key} in {report}"
230 );
231 assert!(
232 !report.contains(&format!("{key}: present")),
233 "{key} must not be reported as present"
234 );
235 }
236 assert!(report.contains("project_shell: present"));
237 let summary = dutch_summary();
238 assert!(summary.contains("niet gebouwd"));
239 assert!(summary.contains("niet geladen"));
240 let lower = summary.to_lowercase();
241 assert!(!lower.contains("import werkt"));
242 assert!(!lower.contains("render werkt"));
243 }
244
245 #[test]
246 fn cli_opens_a_window_or_prints_status_and_rejects_model_paths() {
247 assert_eq!(parse_cli(std::iter::empty()), Ok(CliRequest::OpenWindow));
248 assert_eq!(parse_cli(["--status"]), Ok(CliRequest::PrintStatus));
249 assert_eq!(parse_cli(["--help"]), Ok(CliRequest::PrintHelp));
250 assert_eq!(parse_cli(["-h", "--status"]), Ok(CliRequest::PrintHelp));
251 assert_eq!(
252 parse_cli(["tests/fixtures/bodies/test-body-male.glb"]),
253 Err(CliError::UnknownArgument(
254 "tests/fixtures/bodies/test-body-male.glb".to_string()
255 ))
256 );
257 assert_eq!(
258 parse_cli(["--status", "--render"]),
259 Err(CliError::UnknownArgument("--render".to_string()))
260 );
261 assert!(help_text().contains("niet gebouwd"));
262 }
263
264 #[test]
265 fn missing_library_message_names_the_library_and_does_not_claim_import() {
266 let message = missing_library_message(&["libxkbcommon-x11.so.0"]);
267 assert!(message.contains("libxkbcommon-x11.so.0"));
268 assert!(message.contains("niet gebouwd"));
269 assert!(!message.to_lowercase().contains("import werkt"));
270 assert!(!LINUX_WINDOW_LIBRARIES.is_empty());
271 }
272}
src/lib.rs added +6 −0
@@ -0,0 +1,6 @@
1 //! Foundation library for the Paperdoll Renderer shell.
2 //!
3 //! This crate reports which product capabilities exist. It does not import
4 //! models and it does not render paperdolls.
5
6 pub mod foundation;
@@ -0,0 +1,6 @@
1//! Foundation library for the Paperdoll Renderer shell.
2//!
3//! This crate reports which product capabilities exist. It does not import
4//! models and it does not render paperdolls.
5
6pub mod foundation;
src/main.rs added +106 −0
@@ -0,0 +1,106 @@
1 //! Desktop status shell for the Paperdoll Renderer foundation.
2 //!
3 //! The window lists what this build does not do. It is not a 3D viewport and
4 //! it is not a paperdoll preview.
5
6 use std::process::ExitCode;
7
8 use eframe::egui;
9 use paperdoll_renderer::foundation::{
10 availability, capabilities, dutch_label, dutch_state, dutch_summary, help_text, parse_cli,
11 report, CliError, CliRequest,
12 };
13
14 fn main() -> ExitCode {
15 let args: Vec<String> = std::env::args().skip(1).collect();
16 let borrowed: Vec<&str> = args.iter().map(String::as_str).collect();
17 match parse_cli(borrowed) {
18 Ok(CliRequest::PrintHelp) => {
19 println!("{}", help_text());
20 ExitCode::SUCCESS
21 }
22 Ok(CliRequest::PrintStatus) => {
23 println!("{}", report());
24 ExitCode::SUCCESS
25 }
26 Ok(CliRequest::OpenWindow) => {
27 if let Some(message) = window_preflight() {
28 eprintln!("paperdoll-renderer: {message}");
29 return ExitCode::from(1);
30 }
31 match run_window() {
32 Ok(()) => ExitCode::SUCCESS,
33 Err(err) => {
34 eprintln!("paperdoll-renderer: het statusvenster openen is mislukt: {err}");
35 ExitCode::from(1)
36 }
37 }
38 }
39 Err(CliError::UnknownArgument(arg)) => {
40 eprintln!("paperdoll-renderer: onbekend argument '{arg}'.");
41 eprintln!("Import en render zijn niet gebouwd. Gebruik --help.");
42 ExitCode::from(2)
43 }
44 }
45 }
46
47 fn window_preflight() -> Option<String> {
48 #[cfg(target_os = "linux")]
49 {
50 let missing = paperdoll_renderer::foundation::missing_window_libraries();
51 if missing.is_empty() {
52 None
53 } else {
54 Some(paperdoll_renderer::foundation::missing_library_message(
55 &missing,
56 ))
57 }
58 }
59 #[cfg(not(target_os = "linux"))]
60 {
61 None
62 }
63 }
64
65 fn run_window() -> eframe::Result<()> {
66 let options = eframe::NativeOptions {
67 viewport: egui::ViewportBuilder::default()
68 .with_title("Paperdoll Renderer")
69 .with_inner_size([480.0, 560.0])
70 .with_min_inner_size([320.0, 280.0]),
71 ..Default::default()
72 };
73 eframe::run_native(
74 "Paperdoll Renderer",
75 options,
76 Box::new(|_creation| Ok(Box::new(StatusApp))),
77 )
78 }
79
80 struct StatusApp;
81
82 impl eframe::App for StatusApp {
83 fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
84 egui::CentralPanel::default().show(ctx, |ui| {
85 egui::ScrollArea::vertical().show(ui, |ui| {
86 ui.heading("Paperdoll Renderer");
87 ui.label("Projectbasis. Nog geen paperdoll-renderer.");
88 ui.add_space(8.0);
89 ui.label(dutch_summary());
90 ui.add_space(12.0);
91 ui.strong("Status van deze build");
92 for capability in capabilities() {
93 ui.label(format!(
94 "{}: {}",
95 dutch_label(*capability),
96 dutch_state(availability(*capability))
97 ));
98 }
99 ui.add_space(12.0);
100 if ui.button("Sluiten").clicked() {
101 ctx.send_viewport_cmd(egui::ViewportCommand::Close);
102 }
103 });
104 });
105 }
106 }
@@ -0,0 +1,106 @@
1//! Desktop status shell for the Paperdoll Renderer foundation.
2//!
3//! The window lists what this build does not do. It is not a 3D viewport and
4//! it is not a paperdoll preview.
5
6use std::process::ExitCode;
7
8use eframe::egui;
9use paperdoll_renderer::foundation::{
10 availability, capabilities, dutch_label, dutch_state, dutch_summary, help_text, parse_cli,
11 report, CliError, CliRequest,
12};
13
14fn main() -> ExitCode {
15 let args: Vec<String> = std::env::args().skip(1).collect();
16 let borrowed: Vec<&str> = args.iter().map(String::as_str).collect();
17 match parse_cli(borrowed) {
18 Ok(CliRequest::PrintHelp) => {
19 println!("{}", help_text());
20 ExitCode::SUCCESS
21 }
22 Ok(CliRequest::PrintStatus) => {
23 println!("{}", report());
24 ExitCode::SUCCESS
25 }
26 Ok(CliRequest::OpenWindow) => {
27 if let Some(message) = window_preflight() {
28 eprintln!("paperdoll-renderer: {message}");
29 return ExitCode::from(1);
30 }
31 match run_window() {
32 Ok(()) => ExitCode::SUCCESS,
33 Err(err) => {
34 eprintln!("paperdoll-renderer: het statusvenster openen is mislukt: {err}");
35 ExitCode::from(1)
36 }
37 }
38 }
39 Err(CliError::UnknownArgument(arg)) => {
40 eprintln!("paperdoll-renderer: onbekend argument '{arg}'.");
41 eprintln!("Import en render zijn niet gebouwd. Gebruik --help.");
42 ExitCode::from(2)
43 }
44 }
45}
46
47fn window_preflight() -> Option<String> {
48 #[cfg(target_os = "linux")]
49 {
50 let missing = paperdoll_renderer::foundation::missing_window_libraries();
51 if missing.is_empty() {
52 None
53 } else {
54 Some(paperdoll_renderer::foundation::missing_library_message(
55 &missing,
56 ))
57 }
58 }
59 #[cfg(not(target_os = "linux"))]
60 {
61 None
62 }
63}
64
65fn run_window() -> eframe::Result<()> {
66 let options = eframe::NativeOptions {
67 viewport: egui::ViewportBuilder::default()
68 .with_title("Paperdoll Renderer")
69 .with_inner_size([480.0, 560.0])
70 .with_min_inner_size([320.0, 280.0]),
71 ..Default::default()
72 };
73 eframe::run_native(
74 "Paperdoll Renderer",
75 options,
76 Box::new(|_creation| Ok(Box::new(StatusApp))),
77 )
78}
79
80struct StatusApp;
81
82impl eframe::App for StatusApp {
83 fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
84 egui::CentralPanel::default().show(ctx, |ui| {
85 egui::ScrollArea::vertical().show(ui, |ui| {
86 ui.heading("Paperdoll Renderer");
87 ui.label("Projectbasis. Nog geen paperdoll-renderer.");
88 ui.add_space(8.0);
89 ui.label(dutch_summary());
90 ui.add_space(12.0);
91 ui.strong("Status van deze build");
92 for capability in capabilities() {
93 ui.label(format!(
94 "{}: {}",
95 dutch_label(*capability),
96 dutch_state(availability(*capability))
97 ));
98 }
99 ui.add_space(12.0);
100 if ui.button("Sluiten").clicked() {
101 ctx.send_viewport_cmd(egui::ViewportCommand::Close);
102 }
103 });
104 });
105 }
106}