summaryrefslogtreecommitdiff
path: root/2026/games_submissions/rpc2dot0
diff options
context:
space:
mode:
authorLLLL Colonq <llll@colonq>2026-08-04 04:35:44 -0400
committerLLLL Colonq <llll@colonq>2026-08-04 04:35:44 -0400
commit3c7796f066647090ed8436778bdfe25f11844c05 (patch)
tree0644a101004d91af4fcdc2f51fcc2e03f7f255ce /2026/games_submissions/rpc2dot0
parenta75221ab93f59d688f90cd83f0284ff98951fcfa (diff)
Prepare for upload
Diffstat (limited to '2026/games_submissions/rpc2dot0')
-rw-r--r--2026/games_submissions/rpc2dot0/.cargo/config.toml2
-rw-r--r--2026/games_submissions/rpc2dot0/Cargo.lock3717
-rw-r--r--2026/games_submissions/rpc2dot0/Cargo.toml36
-rw-r--r--2026/games_submissions/rpc2dot0/LICENSE21
-rw-r--r--2026/games_submissions/rpc2dot0/README.md37
-rw-r--r--2026/games_submissions/rpc2dot0/index.css59
-rw-r--r--2026/games_submissions/rpc2dot0/index.html23
-rw-r--r--2026/games_submissions/rpc2dot0/index.js48
-rw-r--r--2026/games_submissions/rpc2dot0/rust-toolchain.toml4
-rw-r--r--2026/games_submissions/rpc2dot0/spec.txt106
-rw-r--r--2026/games_submissions/rpc2dot0/src/assets.rs38
-rw-r--r--2026/games_submissions/rpc2dot0/src/assets/audio/crunch.wavbin123650 -> 0 bytes
-rw-r--r--2026/games_submissions/rpc2dot0/src/assets/audio/explosion.wavbin13387 -> 0 bytes
-rw-r--r--2026/games_submissions/rpc2dot0/src/assets/audio/fart.wavbin382542 -> 0 bytes
-rw-r--r--2026/games_submissions/rpc2dot0/src/assets/audio/footsteps.wavbin140588 -> 0 bytes
-rw-r--r--2026/games_submissions/rpc2dot0/src/assets/audio/test.wavbin924 -> 0 bytes
-rw-r--r--2026/games_submissions/rpc2dot0/src/assets/meshes/square.obj15
-rw-r--r--2026/games_submissions/rpc2dot0/src/assets/shaders/flat/frag.glsl11
-rw-r--r--2026/games_submissions/rpc2dot0/src/assets/shaders/flat/vert.glsl4
-rw-r--r--2026/games_submissions/rpc2dot0/src/assets/textures/background_main.pngbin572 -> 0 bytes
-rw-r--r--2026/games_submissions/rpc2dot0/src/assets/textures/computer.pngbin3616 -> 0 bytes
-rw-r--r--2026/games_submissions/rpc2dot0/src/assets/textures/disquette.pngbin445 -> 0 bytes
-rw-r--r--2026/games_submissions/rpc2dot0/src/assets/textures/landing.pngbin12693 -> 0 bytes
-rw-r--r--2026/games_submissions/rpc2dot0/src/assets/textures/mrbleu.pngbin1499 -> 0 bytes
-rw-r--r--2026/games_submissions/rpc2dot0/src/assets/textures/mrbleu_lurking.pngbin949 -> 0 bytes
-rw-r--r--2026/games_submissions/rpc2dot0/src/assets/textures/mrgreen.pngbin1492 -> 0 bytes
-rw-r--r--2026/games_submissions/rpc2dot0/src/assets/textures/mrred.pngbin1506 -> 0 bytes
-rw-r--r--2026/games_submissions/rpc2dot0/src/assets/textures/mryellow.pngbin2489 -> 0 bytes
-rw-r--r--2026/games_submissions/rpc2dot0/src/assets/textures/mute.pngbin544 -> 0 bytes
-rw-r--r--2026/games_submissions/rpc2dot0/src/assets/textures/unmute.pngbin545 -> 0 bytes
-rw-r--r--2026/games_submissions/rpc2dot0/src/assets/video/adzzz/GG_win_c.mp4bin1695306 -> 0 bytes
-rw-r--r--2026/games_submissions/rpc2dot0/src/assets/video/adzzz/confused_c.mp4bin1213146 -> 0 bytes
-rw-r--r--2026/games_submissions/rpc2dot0/src/assets/video/adzzz/game_over_c.mp4bin580466 -> 0 bytes
-rw-r--r--2026/games_submissions/rpc2dot0/src/assets/video/adzzz/hyped_c.mp4bin1635459 -> 0 bytes
-rw-r--r--2026/games_submissions/rpc2dot0/src/assets/video/adzzz/pinnesse_c.mp4bin737983 -> 0 bytes
-rw-r--r--2026/games_submissions/rpc2dot0/src/assets/video/adzzz/seks_is_bad.mp4bin1440141 -> 0 bytes
-rw-r--r--2026/games_submissions/rpc2dot0/src/assets/video/adzzz/seks_is_gud.mp4bin541533 -> 0 bytes
-rw-r--r--2026/games_submissions/rpc2dot0/src/collision.rs99
-rw-r--r--2026/games_submissions/rpc2dot0/src/color.rs25
-rw-r--r--2026/games_submissions/rpc2dot0/src/computer.rs183
-rw-r--r--2026/games_submissions/rpc2dot0/src/computer/os.rs117
-rw-r--r--2026/games_submissions/rpc2dot0/src/constants.rs109
-rw-r--r--2026/games_submissions/rpc2dot0/src/disquette.rs184
-rw-r--r--2026/games_submissions/rpc2dot0/src/effects.rs58
-rw-r--r--2026/games_submissions/rpc2dot0/src/entity.rs90
-rw-r--r--2026/games_submissions/rpc2dot0/src/errors.rs7
-rw-r--r--2026/games_submissions/rpc2dot0/src/game.rs869
-rw-r--r--2026/games_submissions/rpc2dot0/src/lib.rs40
-rw-r--r--2026/games_submissions/rpc2dot0/src/math.rs55
-rw-r--r--2026/games_submissions/rpc2dot0/src/message.rs26
-rw-r--r--2026/games_submissions/rpc2dot0/src/random.rs107
-rw-r--r--2026/games_submissions/rpc2dot0/src/state.rs484
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/.dir-locals.el7
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/.envrc1
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/.gitignore5
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/.gitmodules0
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/Cargo.lock3344
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/Cargo.toml19
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/Cargo.toml53
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/build.rs15
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/fonts/default.pngbin1042 -> 0 bytes
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/fonts/small.pngbin904 -> 0 bytes
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/meshes/square.obj15
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/bitmap/frag.glsl15
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/bitmap/vert.glsl20
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/common/frag.glsl160
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/common/vert.glsl30
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/flat/frag.glsl12
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/flat/vert.glsl4
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/scale/frag.glsl12
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/scale/vert.glsl22
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/scene/frag.glsl11
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/scene/vert.glsl18
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/test/frag.glsl23
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/test/vert.glsl4
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/tiled/frag.glsl12
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/tiled/vert.glsl14
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/truetype/frag.glsl16
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/truetype/vert.glsl17
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/uber/frag.glsl193
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/uber/vert.glsl41
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/audio.rs341
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/context.rs302
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/font.rs194
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/framebuffer.rs158
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/helpers.js21
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/js/module.js7
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/level2d.rs1
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/level2d/tiled.rs301
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/lib.rs355
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/mesh.rs197
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/net.rs4
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/net/fig.rs100
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/net/ws.rs10
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/net/ws/client.rs9
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/net/ws/client/native.rs124
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/net/ws/client/wasm.rs73
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/net/ws/server.rs140
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/physics.rs0
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/renderer.rs337
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/save.rs47
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/scene.rs401
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/shader.rs260
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/shadow.rs127
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/state.rs735
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/texture.rs156
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/ui.rs169
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/utils.rs147
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia_macros/Cargo.toml14
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia_macros/src/lib.rs231
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/examples/assets/fonts/ComicNeue-Regular.ttfbin54848 -> 0 bytes
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/examples/assets/meshes/cube.obj38
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/examples/assets/scenes/fox.glbbin162852 -> 0 bytes
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/examples/assets/textures/test.pngbin125 -> 0 bytes
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/examples/fox.rs72
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/flake.lock153
-rw-r--r--2026/games_submissions/rpc2dot0/vendor/teleia/flake.nix250
117 files changed, 0 insertions, 16131 deletions
diff --git a/2026/games_submissions/rpc2dot0/.cargo/config.toml b/2026/games_submissions/rpc2dot0/.cargo/config.toml
deleted file mode 100644
index 2abe49c..0000000
--- a/2026/games_submissions/rpc2dot0/.cargo/config.toml
+++ /dev/null
@@ -1,2 +0,0 @@
-[build]
-target = "wasm32-unknown-unknown"
diff --git a/2026/games_submissions/rpc2dot0/Cargo.lock b/2026/games_submissions/rpc2dot0/Cargo.lock
deleted file mode 100644
index 11a75df..0000000
--- a/2026/games_submissions/rpc2dot0/Cargo.lock
+++ /dev/null
@@ -1,3717 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-version = 4
-
-[[package]]
-name = "ab_glyph"
-version = "0.2.32"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01c0457472c38ea5bd1c3b5ada5e368271cb550be7a4ca4a0b4634e9913f6cc2"
-dependencies = [
- "ab_glyph_rasterizer",
- "owned_ttf_parser",
-]
-
-[[package]]
-name = "ab_glyph_rasterizer"
-version = "0.1.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618"
-
-[[package]]
-name = "adler2"
-version = "2.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
-
-[[package]]
-name = "ahash"
-version = "0.8.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b79b82693f705137f8fb9b37871d99e4f9a7df12b917eed79c3d3954830a60b"
-dependencies = [
- "cfg-if",
- "getrandom 0.2.17",
- "once_cell",
- "version_check",
- "zerocopy 0.7.35",
-]
-
-[[package]]
-name = "aho-corasick"
-version = "1.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "allocator-api2"
-version = "0.2.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
-
-[[package]]
-name = "alsa"
-version = "0.9.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed7572b7ba83a31e20d1b48970ee402d2e3e0537dcfe0a3ff4d6eb7508617d43"
-dependencies = [
- "alsa-sys",
- "bitflags 2.12.1",
- "cfg-if",
- "libc",
-]
-
-[[package]]
-name = "alsa-sys"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527"
-dependencies = [
- "libc",
- "pkg-config",
-]
-
-[[package]]
-name = "android-activity"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee91c0c2905bae44f84bfa4e044536541df26b7703fd0888deeb9060fcc44289"
-dependencies = [
- "android-properties",
- "bitflags 2.12.1",
- "cc",
- "cesu8",
- "jni",
- "jni-sys 0.3.1",
- "libc",
- "log",
- "ndk",
- "ndk-context",
- "ndk-sys",
- "num_enum",
- "thiserror 1.0.69",
-]
-
-[[package]]
-name = "android-properties"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04"
-
-[[package]]
-name = "anstream"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d"
-dependencies = [
- "anstyle",
- "anstyle-parse",
- "anstyle-query",
- "anstyle-wincon",
- "colorchoice",
- "is_terminal_polyfill",
- "utf8parse",
-]
-
-[[package]]
-name = "anstyle"
-version = "1.0.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000"
-
-[[package]]
-name = "anstyle-parse"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e"
-dependencies = [
- "utf8parse",
-]
-
-[[package]]
-name = "anstyle-query"
-version = "1.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc"
-dependencies = [
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "anstyle-wincon"
-version = "3.0.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
-dependencies = [
- "anstyle",
- "once_cell_polyfill",
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "anyhow"
-version = "1.0.102"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
-
-[[package]]
-name = "approx"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6"
-dependencies = [
- "num-traits",
-]
-
-[[package]]
-name = "arrayref"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb"
-
-[[package]]
-name = "arrayvec"
-version = "0.7.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"
-
-[[package]]
-name = "as-raw-xcb-connection"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b"
-
-[[package]]
-name = "atomic-waker"
-version = "1.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
-
-[[package]]
-name = "autocfg"
-version = "1.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
-
-[[package]]
-name = "base64"
-version = "0.13.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
-
-[[package]]
-name = "base64"
-version = "0.22.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
-
-[[package]]
-name = "bimap"
-version = "0.6.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7"
-
-[[package]]
-name = "bincode"
-version = "2.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740"
-dependencies = [
- "bincode_derive",
- "serde",
- "unty",
-]
-
-[[package]]
-name = "bincode_derive"
-version = "2.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf95709a440f45e986983918d0e8a1f30a9b1df04918fc828670606804ac3c09"
-dependencies = [
- "virtue",
-]
-
-[[package]]
-name = "bindgen"
-version = "0.72.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895"
-dependencies = [
- "bitflags 2.12.1",
- "cexpr",
- "clang-sys",
- "itertools",
- "proc-macro2",
- "quote",
- "regex",
- "rustc-hash",
- "shlex 1.3.0",
- "syn",
-]
-
-[[package]]
-name = "bit-vec"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2c54ff287cfc0a34f38a6b832ea1bd8e448a330b3e40a50859e6488bee07f22"
-
-[[package]]
-name = "bitflags"
-version = "1.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
-
-[[package]]
-name = "bitflags"
-version = "2.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "84d7ced0ae9557296835c32bf1b1e02b44c746701f898460fb000d7eaa84f00a"
-dependencies = [
- "serde_core",
-]
-
-[[package]]
-name = "block-buffer"
-version = "0.10.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
-dependencies = [
- "generic-array",
-]
-
-[[package]]
-name = "block-sys"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae85a0696e7ea3b835a453750bf002770776609115e6d25c6d2ff28a8200f7e7"
-dependencies = [
- "objc-sys",
-]
-
-[[package]]
-name = "block2"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "15b55663a85f33501257357e6421bb33e769d5c9ffb5ba0921c975a123e35e68"
-dependencies = [
- "block-sys",
- "objc2 0.4.1",
-]
-
-[[package]]
-name = "bumpalo"
-version = "3.20.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649"
-
-[[package]]
-name = "bytemuck"
-version = "1.25.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec"
-
-[[package]]
-name = "byteorder"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
-
-[[package]]
-name = "byteorder-lite"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495"
-
-[[package]]
-name = "bytes"
-version = "1.11.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33"
-
-[[package]]
-name = "calloop"
-version = "0.12.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fba7adb4dd5aa98e5553510223000e7148f621165ec5f9acd7113f6ca4995298"
-dependencies = [
- "bitflags 2.12.1",
- "log",
- "polling",
- "rustix 0.38.44",
- "slab",
- "thiserror 1.0.69",
-]
-
-[[package]]
-name = "calloop-wayland-source"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0f0ea9b9476c7fad82841a8dbb380e2eae480c21910feba80725b46931ed8f02"
-dependencies = [
- "calloop",
- "rustix 0.38.44",
- "wayland-backend",
- "wayland-client",
-]
-
-[[package]]
-name = "cc"
-version = "1.2.63"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "556e016178bb5662a08681bbe0f00f8e17631781a4dfc8c45e466e4b185ec27f"
-dependencies = [
- "find-msvc-tools",
- "jobserver",
- "libc",
- "shlex 2.0.1",
-]
-
-[[package]]
-name = "cesu8"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
-
-[[package]]
-name = "cexpr"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
-dependencies = [
- "nom",
-]
-
-[[package]]
-name = "cfg-if"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
-
-[[package]]
-name = "cfg_aliases"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e"
-
-[[package]]
-name = "clang-sys"
-version = "1.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4"
-dependencies = [
- "glob",
- "libc",
- "libloading",
-]
-
-[[package]]
-name = "colorchoice"
-version = "1.0.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570"
-
-[[package]]
-name = "combine"
-version = "4.6.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd"
-dependencies = [
- "bytes",
- "memchr",
-]
-
-[[package]]
-name = "concurrent-queue"
-version = "2.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973"
-dependencies = [
- "crossbeam-utils",
-]
-
-[[package]]
-name = "console_error_panic_hook"
-version = "0.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc"
-dependencies = [
- "cfg-if",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "console_log"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be8aed40e4edbf4d3b4431ab260b63fdc40f5780a4766824329ea0f1eefe3c0f"
-dependencies = [
- "log",
- "web-sys",
-]
-
-[[package]]
-name = "core-foundation"
-version = "0.9.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
-dependencies = [
- "core-foundation-sys",
- "libc",
-]
-
-[[package]]
-name = "core-foundation"
-version = "0.10.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6"
-dependencies = [
- "core-foundation-sys",
- "libc",
-]
-
-[[package]]
-name = "core-foundation-sys"
-version = "0.8.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
-
-[[package]]
-name = "core-graphics"
-version = "0.23.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081"
-dependencies = [
- "bitflags 1.3.2",
- "core-foundation 0.9.4",
- "core-graphics-types",
- "foreign-types 0.5.0",
- "libc",
-]
-
-[[package]]
-name = "core-graphics-types"
-version = "0.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf"
-dependencies = [
- "bitflags 1.3.2",
- "core-foundation 0.9.4",
- "libc",
-]
-
-[[package]]
-name = "coreaudio-rs"
-version = "0.11.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "321077172d79c662f64f5071a03120748d5bb652f5231570141be24cfcd2bace"
-dependencies = [
- "bitflags 1.3.2",
- "core-foundation-sys",
- "coreaudio-sys",
-]
-
-[[package]]
-name = "coreaudio-sys"
-version = "0.2.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b9b4739a805a62757a83e5654fa3faabec0442666b263bb2287d5a8185bfd953"
-dependencies = [
- "bindgen",
-]
-
-[[package]]
-name = "cpal"
-version = "0.15.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "873dab07c8f743075e57f524c583985fbaf745602acbe916a01539364369a779"
-dependencies = [
- "alsa",
- "core-foundation-sys",
- "coreaudio-rs",
- "dasp_sample",
- "jni",
- "js-sys",
- "libc",
- "mach2",
- "ndk",
- "ndk-context",
- "oboe",
- "wasm-bindgen",
- "wasm-bindgen-futures",
- "web-sys",
- "windows",
-]
-
-[[package]]
-name = "cpufeatures"
-version = "0.2.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "crc32fast"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511"
-dependencies = [
- "cfg-if",
-]
-
-[[package]]
-name = "crossbeam"
-version = "0.8.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8"
-dependencies = [
- "crossbeam-channel",
- "crossbeam-deque",
- "crossbeam-epoch",
- "crossbeam-queue",
- "crossbeam-utils",
-]
-
-[[package]]
-name = "crossbeam-channel"
-version = "0.5.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2"
-dependencies = [
- "crossbeam-utils",
-]
-
-[[package]]
-name = "crossbeam-deque"
-version = "0.8.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51"
-dependencies = [
- "crossbeam-epoch",
- "crossbeam-utils",
-]
-
-[[package]]
-name = "crossbeam-epoch"
-version = "0.9.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
-dependencies = [
- "crossbeam-utils",
-]
-
-[[package]]
-name = "crossbeam-queue"
-version = "0.3.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115"
-dependencies = [
- "crossbeam-utils",
-]
-
-[[package]]
-name = "crossbeam-utils"
-version = "0.8.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
-
-[[package]]
-name = "crypto-common"
-version = "0.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"
-dependencies = [
- "generic-array",
- "typenum",
-]
-
-[[package]]
-name = "cursor-icon"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "dasp_sample"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f"
-
-[[package]]
-name = "data-encoding"
-version = "2.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8"
-
-[[package]]
-name = "digest"
-version = "0.10.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
-dependencies = [
- "block-buffer",
- "crypto-common",
-]
-
-[[package]]
-name = "directories"
-version = "6.0.0"
-source = "git+https://github.com/lcolonq/directories-rs#164536daab2c07265167715934081cb1942387b0"
-dependencies = [
- "dirs-sys",
-]
-
-[[package]]
-name = "dirs-sys"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab"
-dependencies = [
- "libc",
- "option-ext",
- "redox_users",
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "dispatch"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b"
-
-[[package]]
-name = "dlib"
-version = "0.5.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a"
-dependencies = [
- "libloading",
-]
-
-[[package]]
-name = "downcast-rs"
-version = "1.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2"
-
-[[package]]
-name = "eatyourgreens"
-version = "0.1.0"
-dependencies = [
- "enum-map",
- "glam",
- "js-sys",
- "log",
- "rand",
- "rand_chacha",
- "serde",
- "serde-wasm-bindgen",
- "teleia",
- "teleia_macros",
- "wasm-bindgen",
- "web-sys",
- "winit",
-]
-
-[[package]]
-name = "either"
-version = "1.16.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e"
-
-[[package]]
-name = "ena"
-version = "0.14.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eabffdaee24bd1bf95c5ef7cec31260444317e72ea56c4c91750e8b7ee58d5f1"
-dependencies = [
- "log",
-]
-
-[[package]]
-name = "encoding_rs"
-version = "0.8.35"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3"
-dependencies = [
- "cfg-if",
-]
-
-[[package]]
-name = "enum-map"
-version = "2.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6866f3bfdf8207509a033af1a75a7b08abda06bbaaeae6669323fd5a097df2e9"
-dependencies = [
- "enum-map-derive",
- "serde",
-]
-
-[[package]]
-name = "enum-map-derive"
-version = "0.17.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "env"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc95de49ad098572c02d3fbf368c9a020bfff5ae78483685b77f51d8a7e9486d"
-dependencies = [
- "num_threads",
-]
-
-[[package]]
-name = "env_filter"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32e90c2accc4b07a8456ea0debdc2e7587bdd890680d71173a15d4ae604f6eef"
-dependencies = [
- "log",
- "regex",
-]
-
-[[package]]
-name = "env_logger"
-version = "0.11.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0621c04f2196ac3f488dd583365b9c09be011a4ab8b9f37248ffcc8f6198b56a"
-dependencies = [
- "anstream",
- "anstyle",
- "env_filter",
- "jiff",
- "log",
-]
-
-[[package]]
-name = "equivalent"
-version = "1.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
-
-[[package]]
-name = "errno"
-version = "0.3.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
-dependencies = [
- "libc",
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "extended"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af9673d8203fcb076b19dfd17e38b3d4ae9f44959416ea532ce72415a6020365"
-
-[[package]]
-name = "eyre"
-version = "0.6.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec"
-dependencies = [
- "indenter",
- "once_cell",
-]
-
-[[package]]
-name = "fastrand"
-version = "2.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6"
-
-[[package]]
-name = "fdeflate"
-version = "0.3.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c"
-dependencies = [
- "simd-adler32",
-]
-
-[[package]]
-name = "find-msvc-tools"
-version = "0.1.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"
-
-[[package]]
-name = "flate2"
-version = "1.1.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c"
-dependencies = [
- "crc32fast",
- "miniz_oxide",
-]
-
-[[package]]
-name = "foldhash"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
-
-[[package]]
-name = "foldhash"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb"
-
-[[package]]
-name = "foreign-types"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
-dependencies = [
- "foreign-types-shared 0.1.1",
-]
-
-[[package]]
-name = "foreign-types"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965"
-dependencies = [
- "foreign-types-macros",
- "foreign-types-shared 0.3.1",
-]
-
-[[package]]
-name = "foreign-types-macros"
-version = "0.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "foreign-types-shared"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
-
-[[package]]
-name = "foreign-types-shared"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b"
-
-[[package]]
-name = "generic-array"
-version = "0.14.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
-dependencies = [
- "typenum",
- "version_check",
-]
-
-[[package]]
-name = "gethostname"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8"
-dependencies = [
- "rustix 1.1.4",
- "windows-link",
-]
-
-[[package]]
-name = "getrandom"
-version = "0.2.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0"
-dependencies = [
- "cfg-if",
- "js-sys",
- "libc",
- "wasi",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "getrandom"
-version = "0.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
-dependencies = [
- "cfg-if",
- "libc",
- "r-efi 5.3.0",
- "wasip2",
-]
-
-[[package]]
-name = "getrandom"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555"
-dependencies = [
- "cfg-if",
- "libc",
- "r-efi 6.0.0",
- "wasip2",
- "wasip3",
-]
-
-[[package]]
-name = "glam"
-version = "0.29.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8babf46d4c1c9d92deac9f7be466f76dfc4482b6452fc5024b5e8daf6ffeb3ee"
-dependencies = [
- "mint",
-]
-
-[[package]]
-name = "glfw"
-version = "0.59.0"
-source = "git+https://github.com/lcolonq/glfw-rs#1ce13a2bcf3ef3bf6184bcb4c2a90d9034956841"
-dependencies = [
- "bitflags 1.3.2",
- "objc2 0.5.2",
- "raw-window-handle",
- "serde",
- "winapi",
-]
-
-[[package]]
-name = "glob"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280"
-
-[[package]]
-name = "glow"
-version = "0.13.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd348e04c43b32574f2de31c8bb397d96c9fcfa1371bd4ca6d8bdc464ab121b1"
-dependencies = [
- "js-sys",
- "slotmap",
- "wasm-bindgen",
- "web-sys",
-]
-
-[[package]]
-name = "gltf"
-version = "1.4.1"
-source = "git+https://github.com/lcolonq/gltf#9763a5abe8c168eb1282a037ff16668542fe2a6d"
-dependencies = [
- "base64 0.13.1",
- "byteorder",
- "gltf-json",
- "image",
- "lazy_static",
- "serde_json",
- "urlencoding",
-]
-
-[[package]]
-name = "gltf-derive"
-version = "1.4.1"
-source = "git+https://github.com/lcolonq/gltf#9763a5abe8c168eb1282a037ff16668542fe2a6d"
-dependencies = [
- "inflections",
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "gltf-json"
-version = "1.4.1"
-source = "git+https://github.com/lcolonq/gltf#9763a5abe8c168eb1282a037ff16668542fe2a6d"
-dependencies = [
- "gltf-derive",
- "serde",
- "serde_derive",
- "serde_json",
-]
-
-[[package]]
-name = "hash32"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606"
-dependencies = [
- "byteorder",
-]
-
-[[package]]
-name = "hashbrown"
-version = "0.15.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
-dependencies = [
- "foldhash 0.1.5",
-]
-
-[[package]]
-name = "hashbrown"
-version = "0.16.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
-dependencies = [
- "allocator-api2",
- "equivalent",
- "foldhash 0.2.0",
-]
-
-[[package]]
-name = "hashbrown"
-version = "0.17.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a"
-
-[[package]]
-name = "heapless"
-version = "0.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad"
-dependencies = [
- "hash32",
- "stable_deref_trait",
-]
-
-[[package]]
-name = "heck"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
-
-[[package]]
-name = "hermit-abi"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c"
-
-[[package]]
-name = "http"
-version = "1.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8be7462df143984c4598a256ef469b251d7d7f9e271135073e78fc535414f3d0"
-dependencies = [
- "bytes",
- "itoa",
-]
-
-[[package]]
-name = "httparse"
-version = "1.10.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
-
-[[package]]
-name = "icrate"
-version = "0.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "99d3aaff8a54577104bafdf686ff18565c3b6903ca5782a2026ef06e2c7aa319"
-dependencies = [
- "block2",
- "dispatch",
- "objc2 0.4.1",
-]
-
-[[package]]
-name = "id-arena"
-version = "2.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954"
-
-[[package]]
-name = "image"
-version = "0.25.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104"
-dependencies = [
- "bytemuck",
- "byteorder-lite",
- "moxcms",
- "num-traits",
- "png",
- "zune-core",
- "zune-jpeg",
-]
-
-[[package]]
-name = "indenter"
-version = "0.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5"
-
-[[package]]
-name = "indexmap"
-version = "2.14.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9"
-dependencies = [
- "equivalent",
- "hashbrown 0.17.1",
- "serde",
- "serde_core",
-]
-
-[[package]]
-name = "inflections"
-version = "1.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a257582fdcde896fd96463bf2d40eefea0580021c0712a0e2b028b60b47a837a"
-
-[[package]]
-name = "is_terminal_polyfill"
-version = "1.70.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
-
-[[package]]
-name = "itertools"
-version = "0.13.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"
-dependencies = [
- "either",
-]
-
-[[package]]
-name = "itoa"
-version = "1.0.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
-
-[[package]]
-name = "jiff"
-version = "0.2.28"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4603d3033e49e2b0e31229fcab20a5d40089c607d975cd9c80551dc69eed9102"
-dependencies = [
- "jiff-static",
- "log",
- "portable-atomic",
- "portable-atomic-util",
- "serde_core",
-]
-
-[[package]]
-name = "jiff-static"
-version = "0.2.28"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "782d32378dddf207193ac91cefb848ad41abb58195c95168e1291227a0832b47"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "jni"
-version = "0.21.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97"
-dependencies = [
- "cesu8",
- "cfg-if",
- "combine",
- "jni-sys 0.3.1",
- "log",
- "thiserror 1.0.69",
- "walkdir",
- "windows-sys 0.45.0",
-]
-
-[[package]]
-name = "jni-sys"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258"
-dependencies = [
- "jni-sys 0.4.1",
-]
-
-[[package]]
-name = "jni-sys"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2"
-dependencies = [
- "jni-sys-macros",
-]
-
-[[package]]
-name = "jni-sys-macros"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264"
-dependencies = [
- "quote",
- "syn",
-]
-
-[[package]]
-name = "jobserver"
-version = "0.1.34"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33"
-dependencies = [
- "getrandom 0.3.4",
- "libc",
-]
-
-[[package]]
-name = "js-sys"
-version = "0.3.77"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
-dependencies = [
- "once_cell",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "kira"
-version = "0.9.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb5a9f9dff5e262540b628b00d5e1a772270a962d6869f8695bb24832ff3b394"
-dependencies = [
- "cpal",
- "glam",
- "mint",
- "paste",
- "ringbuf",
- "send_wrapper",
- "symphonia",
- "triple_buffer",
-]
-
-[[package]]
-name = "lazy_static"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
-
-[[package]]
-name = "leb128fmt"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
-
-[[package]]
-name = "libc"
-version = "0.2.186"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
-
-[[package]]
-name = "libloading"
-version = "0.8.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55"
-dependencies = [
- "cfg-if",
- "windows-link",
-]
-
-[[package]]
-name = "libm"
-version = "0.2.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"
-
-[[package]]
-name = "libredox"
-version = "0.1.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f02ab6bace2054fb888a3c16f990117b579d14a3088e472d63c6011fa185c9d3"
-dependencies = [
- "bitflags 2.12.1",
- "libc",
- "plain",
- "redox_syscall 0.8.1",
-]
-
-[[package]]
-name = "linux-raw-sys"
-version = "0.4.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
-
-[[package]]
-name = "linux-raw-sys"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53"
-
-[[package]]
-name = "litrs"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092"
-
-[[package]]
-name = "log"
-version = "0.4.32"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "953f07c43838f8e6f9758cab68bf5bed85465e7587ebe0b823f1bcd81978ad3a"
-
-[[package]]
-name = "mach2"
-version = "0.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d640282b302c0bb0a2a8e0233ead9035e3bed871f0b7e81fe4a1ec829765db44"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "matrixmultiply"
-version = "0.3.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08"
-dependencies = [
- "autocfg",
- "rawpointer",
-]
-
-[[package]]
-name = "memchr"
-version = "2.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8"
-
-[[package]]
-name = "memmap2"
-version = "0.9.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "714098028fe011992e1c3962653c96b2d578c4b4bce9036e15ff220319b1e0e3"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "minimal-lexical"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
-
-[[package]]
-name = "miniz_oxide"
-version = "0.8.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
-dependencies = [
- "adler2",
- "simd-adler32",
-]
-
-[[package]]
-name = "mint"
-version = "0.5.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e53debba6bda7a793e5f99b8dacf19e626084f525f7829104ba9898f367d85ff"
-
-[[package]]
-name = "moxcms"
-version = "0.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b"
-dependencies = [
- "num-traits",
- "pxfm",
-]
-
-[[package]]
-name = "nalgebra"
-version = "0.33.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d43ddcacf343185dfd6de2ee786d9e8b1c2301622afab66b6c73baf9882abfd"
-dependencies = [
- "approx",
- "glam",
- "matrixmultiply",
- "nalgebra-macros",
- "num-complex",
- "num-rational",
- "num-traits",
- "simba",
- "typenum",
-]
-
-[[package]]
-name = "nalgebra-macros"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "254a5372af8fc138e36684761d3c0cdb758a4410e938babcff1c860ce14ddbfc"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "native-tls"
-version = "0.2.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2"
-dependencies = [
- "libc",
- "log",
- "openssl",
- "openssl-probe",
- "openssl-sys",
- "schannel",
- "security-framework",
- "security-framework-sys",
- "tempfile",
-]
-
-[[package]]
-name = "ndk"
-version = "0.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7"
-dependencies = [
- "bitflags 2.12.1",
- "jni-sys 0.3.1",
- "log",
- "ndk-sys",
- "num_enum",
- "raw-window-handle",
- "thiserror 1.0.69",
-]
-
-[[package]]
-name = "ndk-context"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b"
-
-[[package]]
-name = "ndk-sys"
-version = "0.5.0+25.2.9519653"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691"
-dependencies = [
- "jni-sys 0.3.1",
-]
-
-[[package]]
-name = "nom"
-version = "7.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
-dependencies = [
- "memchr",
- "minimal-lexical",
-]
-
-[[package]]
-name = "num-bigint"
-version = "0.4.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
-dependencies = [
- "num-integer",
- "num-traits",
-]
-
-[[package]]
-name = "num-complex"
-version = "0.4.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
-dependencies = [
- "num-traits",
-]
-
-[[package]]
-name = "num-derive"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "num-integer"
-version = "0.1.46"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
-dependencies = [
- "num-traits",
-]
-
-[[package]]
-name = "num-rational"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824"
-dependencies = [
- "num-bigint",
- "num-integer",
- "num-traits",
-]
-
-[[package]]
-name = "num-traits"
-version = "0.2.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
-dependencies = [
- "autocfg",
- "libm",
-]
-
-[[package]]
-name = "num_enum"
-version = "0.7.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26"
-dependencies = [
- "num_enum_derive",
- "rustversion",
-]
-
-[[package]]
-name = "num_enum_derive"
-version = "0.7.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8"
-dependencies = [
- "proc-macro-crate",
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "num_threads"
-version = "0.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "objc-sys"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310"
-
-[[package]]
-name = "objc2"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "559c5a40fdd30eb5e344fbceacf7595a81e242529fb4e21cf5f43fb4f11ff98d"
-dependencies = [
- "objc-sys",
- "objc2-encode 3.0.0",
-]
-
-[[package]]
-name = "objc2"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804"
-dependencies = [
- "objc-sys",
- "objc2-encode 4.1.0",
-]
-
-[[package]]
-name = "objc2-encode"
-version = "3.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d079845b37af429bfe5dfa76e6d087d788031045b25cfc6fd898486fd9847666"
-
-[[package]]
-name = "objc2-encode"
-version = "4.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33"
-
-[[package]]
-name = "oboe"
-version = "0.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8b61bebd49e5d43f5f8cc7ee2891c16e0f41ec7954d36bcb6c14c5e0de867fb"
-dependencies = [
- "jni",
- "ndk",
- "ndk-context",
- "num-derive",
- "num-traits",
- "oboe-sys",
-]
-
-[[package]]
-name = "oboe-sys"
-version = "0.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c8bb09a4a2b1d668170cfe0a7d5bc103f8999fb316c98099b6a9939c9f2e79d"
-dependencies = [
- "cc",
-]
-
-[[package]]
-name = "once_cell"
-version = "1.21.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
-
-[[package]]
-name = "once_cell_polyfill"
-version = "1.70.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
-
-[[package]]
-name = "openssl"
-version = "0.10.80"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a45fa2aa886c42762255da344f0a0d313e254066c46aad76f300c3d3da62d967"
-dependencies = [
- "bitflags 2.12.1",
- "cfg-if",
- "foreign-types 0.3.2",
- "libc",
- "openssl-macros",
- "openssl-sys",
-]
-
-[[package]]
-name = "openssl-macros"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "openssl-probe"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe"
-
-[[package]]
-name = "openssl-sys"
-version = "0.9.116"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f28a22dc7140cda5f096e5e7724a6962ca81a7f8bfd2979f9b18c11af56318c4"
-dependencies = [
- "cc",
- "libc",
- "pkg-config",
- "vcpkg",
-]
-
-[[package]]
-name = "option-ext"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
-
-[[package]]
-name = "orbclient"
-version = "0.3.55"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5df339f526ea9a60e371768d50efc2f2508c7203290731565d1f7a6f71d21747"
-dependencies = [
- "libc",
- "libredox",
-]
-
-[[package]]
-name = "ordered-float"
-version = "4.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951"
-dependencies = [
- "num-traits",
-]
-
-[[package]]
-name = "owned_ttf_parser"
-version = "0.25.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b"
-dependencies = [
- "ttf-parser",
-]
-
-[[package]]
-name = "parry3d"
-version = "0.18.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ecb572cea5c76b06bc744aaefdbb9e6ea9e5695f50f79c0227bddecd6ec925a4"
-dependencies = [
- "approx",
- "arrayvec",
- "bitflags 2.12.1",
- "downcast-rs",
- "either",
- "ena",
- "log",
- "nalgebra",
- "num-derive",
- "num-traits",
- "ordered-float",
- "rstar",
- "rustc-hash",
- "simba",
- "slab",
- "smallvec",
- "spade",
- "thiserror 1.0.69",
-]
-
-[[package]]
-name = "paste"
-version = "1.0.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
-
-[[package]]
-name = "percent-encoding"
-version = "2.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
-
-[[package]]
-name = "pin-project-lite"
-version = "0.2.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
-
-[[package]]
-name = "pkg-config"
-version = "0.3.33"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e"
-
-[[package]]
-name = "plain"
-version = "0.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6"
-
-[[package]]
-name = "png"
-version = "0.18.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61"
-dependencies = [
- "bitflags 2.12.1",
- "crc32fast",
- "fdeflate",
- "flate2",
- "miniz_oxide",
-]
-
-[[package]]
-name = "polling"
-version = "3.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218"
-dependencies = [
- "cfg-if",
- "concurrent-queue",
- "hermit-abi",
- "pin-project-lite",
- "rustix 1.1.4",
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "portable-atomic"
-version = "1.13.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49"
-
-[[package]]
-name = "portable-atomic-util"
-version = "0.2.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618"
-dependencies = [
- "portable-atomic",
-]
-
-[[package]]
-name = "ppv-lite86"
-version = "0.2.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
-dependencies = [
- "zerocopy 0.8.50",
-]
-
-[[package]]
-name = "prettyplease"
-version = "0.2.37"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
-dependencies = [
- "proc-macro2",
- "syn",
-]
-
-[[package]]
-name = "proc-macro-crate"
-version = "3.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f"
-dependencies = [
- "toml_edit",
-]
-
-[[package]]
-name = "proc-macro2"
-version = "1.0.106"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
-dependencies = [
- "unicode-ident",
-]
-
-[[package]]
-name = "profiling"
-version = "1.0.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5"
-dependencies = [
- "profiling-procmacros",
-]
-
-[[package]]
-name = "profiling-procmacros"
-version = "1.0.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4488a4a36b9a4ba6b9334a32a39971f77c1436ec82c38707bce707699cc3bbcb"
-dependencies = [
- "quote",
- "syn",
-]
-
-[[package]]
-name = "pxfm"
-version = "0.1.29"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e0c5ccf5294c6ccd63a74f1565028353830a9c2f5eb0c682c355c471726a6e3f"
-
-[[package]]
-name = "quick-xml"
-version = "0.39.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cdcc8dd4e2f670d309a5f0e83fe36dfdc05af317008fea29144da1a2ac858e5e"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "quote"
-version = "1.0.45"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
-dependencies = [
- "proc-macro2",
-]
-
-[[package]]
-name = "r-efi"
-version = "5.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
-
-[[package]]
-name = "r-efi"
-version = "6.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
-
-[[package]]
-name = "rand"
-version = "0.8.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
-dependencies = [
- "libc",
- "rand_chacha",
- "rand_core",
-]
-
-[[package]]
-name = "rand_chacha"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
-dependencies = [
- "ppv-lite86",
- "rand_core",
-]
-
-[[package]]
-name = "rand_core"
-version = "0.6.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
-dependencies = [
- "getrandom 0.2.17",
-]
-
-[[package]]
-name = "rapier3d"
-version = "0.23.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "37d84644f385b81f065576058bc8f7e3d64e56a66f2f5fc40bfd917774659e12"
-dependencies = [
- "approx",
- "arrayvec",
- "bit-vec",
- "bitflags 2.12.1",
- "crossbeam",
- "downcast-rs",
- "log",
- "nalgebra",
- "num-derive",
- "num-traits",
- "ordered-float",
- "parry3d",
- "profiling",
- "rustc-hash",
- "simba",
- "thiserror 1.0.69",
-]
-
-[[package]]
-name = "raw-window-handle"
-version = "0.6.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539"
-
-[[package]]
-name = "rawpointer"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3"
-
-[[package]]
-name = "redox_syscall"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
-dependencies = [
- "bitflags 1.3.2",
-]
-
-[[package]]
-name = "redox_syscall"
-version = "0.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b44b894f2a6e36457d665d1e08c3866add6ed5e70050c1b4ba8a8ddedb02ce7"
-dependencies = [
- "bitflags 2.12.1",
-]
-
-[[package]]
-name = "redox_users"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac"
-dependencies = [
- "getrandom 0.2.17",
- "libredox",
- "thiserror 2.0.18",
-]
-
-[[package]]
-name = "regex"
-version = "1.12.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-automata",
- "regex-syntax",
-]
-
-[[package]]
-name = "regex-automata"
-version = "0.4.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-syntax",
-]
-
-[[package]]
-name = "regex-syntax"
-version = "0.8.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
-
-[[package]]
-name = "ringbuf"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "79abed428d1fd2a128201cec72c5f6938e2da607c6f3745f769fabea399d950a"
-dependencies = [
- "crossbeam-utils",
-]
-
-[[package]]
-name = "robust"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4e27ee8bb91ca0adcf0ecb116293afa12d393f9c2b9b9cd54d33e8078fe19839"
-
-[[package]]
-name = "rstar"
-version = "0.12.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "421400d13ccfd26dfa5858199c30a5d76f9c54e0dba7575273025b43c5175dbb"
-dependencies = [
- "heapless",
- "num-traits",
- "smallvec",
-]
-
-[[package]]
-name = "rustc-hash"
-version = "2.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe"
-
-[[package]]
-name = "rustix"
-version = "0.38.44"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
-dependencies = [
- "bitflags 2.12.1",
- "errno",
- "libc",
- "linux-raw-sys 0.4.15",
- "windows-sys 0.59.0",
-]
-
-[[package]]
-name = "rustix"
-version = "1.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190"
-dependencies = [
- "bitflags 2.12.1",
- "errno",
- "libc",
- "linux-raw-sys 0.12.1",
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "rustversion"
-version = "1.0.22"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
-
-[[package]]
-name = "safe_arch"
-version = "0.7.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "96b02de82ddbe1b636e6170c21be622223aea188ef2e139be0a5b219ec215323"
-dependencies = [
- "bytemuck",
-]
-
-[[package]]
-name = "same-file"
-version = "1.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
-dependencies = [
- "winapi-util",
-]
-
-[[package]]
-name = "schannel"
-version = "0.1.29"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939"
-dependencies = [
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "scoped-tls"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
-
-[[package]]
-name = "sctk-adwaita"
-version = "0.8.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70b31447ca297092c5a9916fc3b955203157b37c19ca8edde4f52e9843e602c7"
-dependencies = [
- "ab_glyph",
- "log",
- "memmap2",
- "smithay-client-toolkit",
- "tiny-skia",
-]
-
-[[package]]
-name = "security-framework"
-version = "3.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d"
-dependencies = [
- "bitflags 2.12.1",
- "core-foundation 0.10.1",
- "core-foundation-sys",
- "libc",
- "security-framework-sys",
-]
-
-[[package]]
-name = "security-framework-sys"
-version = "2.17.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3"
-dependencies = [
- "core-foundation-sys",
- "libc",
-]
-
-[[package]]
-name = "semver"
-version = "1.0.28"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd"
-
-[[package]]
-name = "send_wrapper"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73"
-
-[[package]]
-name = "serde"
-version = "1.0.228"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
-dependencies = [
- "serde_core",
- "serde_derive",
-]
-
-[[package]]
-name = "serde-wasm-bindgen"
-version = "0.6.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b"
-dependencies = [
- "js-sys",
- "serde",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "serde_core"
-version = "1.0.228"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
-dependencies = [
- "serde_derive",
-]
-
-[[package]]
-name = "serde_derive"
-version = "1.0.228"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "serde_json"
-version = "1.0.150"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9"
-dependencies = [
- "itoa",
- "memchr",
- "serde",
- "serde_core",
- "zmij",
-]
-
-[[package]]
-name = "sha1"
-version = "0.10.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
-dependencies = [
- "cfg-if",
- "cpufeatures",
- "digest",
-]
-
-[[package]]
-name = "sharded-slab"
-version = "0.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
-dependencies = [
- "lazy_static",
-]
-
-[[package]]
-name = "shlex"
-version = "1.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
-
-[[package]]
-name = "shlex"
-version = "2.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
-
-[[package]]
-name = "simba"
-version = "0.9.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c99284beb21666094ba2b75bbceda012e610f5479dfcc2d6e2426f53197ffd95"
-dependencies = [
- "approx",
- "num-complex",
- "num-traits",
- "paste",
- "wide",
-]
-
-[[package]]
-name = "simd-adler32"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214"
-
-[[package]]
-name = "simple-eyre"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b561532e8ffe7ecf09108c4f662896a9ec3eac4999eba84015ec3dcb8cc630a"
-dependencies = [
- "eyre",
- "indenter",
-]
-
-[[package]]
-name = "slab"
-version = "0.4.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
-
-[[package]]
-name = "slotmap"
-version = "1.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038"
-dependencies = [
- "version_check",
-]
-
-[[package]]
-name = "smallvec"
-version = "1.15.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
-
-[[package]]
-name = "smithay-client-toolkit"
-version = "0.18.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "922fd3eeab3bd820d76537ce8f582b1cf951eceb5475c28500c7457d9d17f53a"
-dependencies = [
- "bitflags 2.12.1",
- "calloop",
- "calloop-wayland-source",
- "cursor-icon",
- "libc",
- "log",
- "memmap2",
- "rustix 0.38.44",
- "thiserror 1.0.69",
- "wayland-backend",
- "wayland-client",
- "wayland-csd-frame",
- "wayland-cursor",
- "wayland-protocols",
- "wayland-protocols-wlr",
- "wayland-scanner",
- "xkeysym",
-]
-
-[[package]]
-name = "smol_str"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "spade"
-version = "2.15.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9699399fd9349b00b184f5635b074f9ec93afffef30c853f8c875b32c0f8c7fa"
-dependencies = [
- "hashbrown 0.16.1",
- "num-traits",
- "robust",
- "smallvec",
-]
-
-[[package]]
-name = "stable_deref_trait"
-version = "1.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
-
-[[package]]
-name = "strict-num"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731"
-
-[[package]]
-name = "strum"
-version = "0.27.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf"
-dependencies = [
- "strum_macros",
-]
-
-[[package]]
-name = "strum_macros"
-version = "0.27.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7"
-dependencies = [
- "heck",
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "symphonia"
-version = "0.5.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5773a4c030a19d9bfaa090f49746ff35c75dfddfa700df7a5939d5e076a57039"
-dependencies = [
- "lazy_static",
- "symphonia-bundle-mp3",
- "symphonia-codec-pcm",
- "symphonia-codec-vorbis",
- "symphonia-core",
- "symphonia-format-ogg",
- "symphonia-format-riff",
- "symphonia-metadata",
-]
-
-[[package]]
-name = "symphonia-bundle-mp3"
-version = "0.5.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4872dd6bb56bf5eac799e3e957aa1981086c3e613b27e0ac23b176054f7c57ed"
-dependencies = [
- "lazy_static",
- "log",
- "symphonia-core",
- "symphonia-metadata",
-]
-
-[[package]]
-name = "symphonia-codec-pcm"
-version = "0.5.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4e89d716c01541ad3ebe7c91ce4c8d38a7cf266a3f7b2f090b108fb0cb031d95"
-dependencies = [
- "log",
- "symphonia-core",
-]
-
-[[package]]
-name = "symphonia-codec-vorbis"
-version = "0.5.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f025837c309cd69ffef572750b4a2257b59552c5399a5e49707cc5b1b85d1c73"
-dependencies = [
- "log",
- "symphonia-core",
- "symphonia-utils-xiph",
-]
-
-[[package]]
-name = "symphonia-core"
-version = "0.5.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea00cc4f79b7f6bb7ff87eddc065a1066f3a43fe1875979056672c9ef948c2af"
-dependencies = [
- "arrayvec",
- "bitflags 1.3.2",
- "bytemuck",
- "lazy_static",
- "log",
-]
-
-[[package]]
-name = "symphonia-format-ogg"
-version = "0.5.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b4955c67c1ed3aa8ae8428d04ca8397fbef6a19b2b051e73b5da8b1435639cb"
-dependencies = [
- "log",
- "symphonia-core",
- "symphonia-metadata",
- "symphonia-utils-xiph",
-]
-
-[[package]]
-name = "symphonia-format-riff"
-version = "0.5.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c2d7c3df0e7d94efb68401d81906eae73c02b40d5ec1a141962c592d0f11a96f"
-dependencies = [
- "extended",
- "log",
- "symphonia-core",
- "symphonia-metadata",
-]
-
-[[package]]
-name = "symphonia-metadata"
-version = "0.5.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "36306ff42b9ffe6e5afc99d49e121e0bd62fe79b9db7b9681d48e29fa19e6b16"
-dependencies = [
- "encoding_rs",
- "lazy_static",
- "log",
- "symphonia-core",
-]
-
-[[package]]
-name = "symphonia-utils-xiph"
-version = "0.5.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee27c85ab799a338446b68eec77abf42e1a6f1bb490656e121c6e27bfbab9f16"
-dependencies = [
- "symphonia-core",
- "symphonia-metadata",
-]
-
-[[package]]
-name = "syn"
-version = "2.0.117"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-ident",
-]
-
-[[package]]
-name = "teleia"
-version = "0.1.0"
-dependencies = [
- "ahash",
- "base64 0.22.1",
- "bimap",
- "bincode",
- "bitflags 2.12.1",
- "byteorder",
- "bytes",
- "console_error_panic_hook",
- "console_log",
- "directories",
- "enum-map",
- "env_logger",
- "getrandom 0.2.17",
- "glam",
- "glfw",
- "glow",
- "gltf",
- "image",
- "js-sys",
- "kira",
- "log",
- "nalgebra",
- "parry3d",
- "polling",
- "rand",
- "rapier3d",
- "serde",
- "serde_json",
- "simple-eyre",
- "strum",
- "tobj",
- "tracing-wasm",
- "tungstenite",
- "wasm-bindgen",
- "wasm-bindgen-futures",
- "web-sys",
- "winit",
-]
-
-[[package]]
-name = "teleia_macros"
-version = "0.1.0"
-dependencies = [
- "env",
- "heck",
- "litrs",
- "walkdir",
-]
-
-[[package]]
-name = "tempfile"
-version = "3.27.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd"
-dependencies = [
- "fastrand",
- "getrandom 0.4.2",
- "once_cell",
- "rustix 1.1.4",
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "thiserror"
-version = "1.0.69"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
-dependencies = [
- "thiserror-impl 1.0.69",
-]
-
-[[package]]
-name = "thiserror"
-version = "2.0.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
-dependencies = [
- "thiserror-impl 2.0.18",
-]
-
-[[package]]
-name = "thiserror-impl"
-version = "1.0.69"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "thiserror-impl"
-version = "2.0.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "thread_local"
-version = "1.1.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185"
-dependencies = [
- "cfg-if",
-]
-
-[[package]]
-name = "tiny-skia"
-version = "0.11.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab"
-dependencies = [
- "arrayref",
- "arrayvec",
- "bytemuck",
- "cfg-if",
- "log",
- "tiny-skia-path",
-]
-
-[[package]]
-name = "tiny-skia-path"
-version = "0.11.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93"
-dependencies = [
- "arrayref",
- "bytemuck",
- "strict-num",
-]
-
-[[package]]
-name = "tobj"
-version = "4.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f7ca3ec0405b0f2f95e0dbcced28882190dc79b0dac63ff82533d256d770223"
-dependencies = [
- "ahash",
-]
-
-[[package]]
-name = "toml_datetime"
-version = "1.1.1+spec-1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7"
-dependencies = [
- "serde_core",
-]
-
-[[package]]
-name = "toml_edit"
-version = "0.25.12+spec-1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7"
-dependencies = [
- "indexmap",
- "toml_datetime",
- "toml_parser",
- "winnow",
-]
-
-[[package]]
-name = "toml_parser"
-version = "1.1.2+spec-1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526"
-dependencies = [
- "winnow",
-]
-
-[[package]]
-name = "tracing"
-version = "0.1.44"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
-dependencies = [
- "pin-project-lite",
- "tracing-attributes",
- "tracing-core",
-]
-
-[[package]]
-name = "tracing-attributes"
-version = "0.1.31"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "tracing-core"
-version = "0.1.36"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"
-dependencies = [
- "once_cell",
-]
-
-[[package]]
-name = "tracing-subscriber"
-version = "0.3.23"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319"
-dependencies = [
- "sharded-slab",
- "thread_local",
- "tracing-core",
-]
-
-[[package]]
-name = "tracing-wasm"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4575c663a174420fa2d78f4108ff68f65bf2fbb7dd89f33749b6e826b3626e07"
-dependencies = [
- "tracing",
- "tracing-subscriber",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "triple_buffer"
-version = "8.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "420466259f9fa5decc654c490b9ab538400e5420df8237f84ecbe20368bcf72b"
-dependencies = [
- "crossbeam-utils",
-]
-
-[[package]]
-name = "ttf-parser"
-version = "0.25.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31"
-
-[[package]]
-name = "tungstenite"
-version = "0.24.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a"
-dependencies = [
- "byteorder",
- "bytes",
- "data-encoding",
- "http",
- "httparse",
- "log",
- "native-tls",
- "rand",
- "sha1",
- "thiserror 1.0.69",
- "utf-8",
-]
-
-[[package]]
-name = "typenum"
-version = "1.20.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20"
-
-[[package]]
-name = "unicode-ident"
-version = "1.0.24"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
-
-[[package]]
-name = "unicode-segmentation"
-version = "1.13.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8"
-
-[[package]]
-name = "unicode-xid"
-version = "0.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
-
-[[package]]
-name = "unty"
-version = "0.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae"
-
-[[package]]
-name = "urlencoding"
-version = "2.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da"
-
-[[package]]
-name = "utf-8"
-version = "0.7.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
-
-[[package]]
-name = "utf8parse"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
-
-[[package]]
-name = "vcpkg"
-version = "0.2.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
-
-[[package]]
-name = "version_check"
-version = "0.9.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
-
-[[package]]
-name = "virtue"
-version = "0.0.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1"
-
-[[package]]
-name = "walkdir"
-version = "2.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
-dependencies = [
- "same-file",
- "winapi-util",
-]
-
-[[package]]
-name = "wasi"
-version = "0.11.1+wasi-snapshot-preview1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
-
-[[package]]
-name = "wasip2"
-version = "1.0.3+wasi-0.2.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6"
-dependencies = [
- "wit-bindgen 0.57.1",
-]
-
-[[package]]
-name = "wasip3"
-version = "0.4.0+wasi-0.3.0-rc-2026-01-06"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5"
-dependencies = [
- "wit-bindgen 0.51.0",
-]
-
-[[package]]
-name = "wasm-bindgen"
-version = "0.2.100"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
-dependencies = [
- "cfg-if",
- "once_cell",
- "rustversion",
- "wasm-bindgen-macro",
-]
-
-[[package]]
-name = "wasm-bindgen-backend"
-version = "0.2.100"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
-dependencies = [
- "bumpalo",
- "log",
- "proc-macro2",
- "quote",
- "syn",
- "wasm-bindgen-shared",
-]
-
-[[package]]
-name = "wasm-bindgen-futures"
-version = "0.4.50"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61"
-dependencies = [
- "cfg-if",
- "js-sys",
- "once_cell",
- "wasm-bindgen",
- "web-sys",
-]
-
-[[package]]
-name = "wasm-bindgen-macro"
-version = "0.2.100"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
-dependencies = [
- "quote",
- "wasm-bindgen-macro-support",
-]
-
-[[package]]
-name = "wasm-bindgen-macro-support"
-version = "0.2.100"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
- "wasm-bindgen-backend",
- "wasm-bindgen-shared",
-]
-
-[[package]]
-name = "wasm-bindgen-shared"
-version = "0.2.100"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
-dependencies = [
- "unicode-ident",
-]
-
-[[package]]
-name = "wasm-encoder"
-version = "0.244.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319"
-dependencies = [
- "leb128fmt",
- "wasmparser",
-]
-
-[[package]]
-name = "wasm-metadata"
-version = "0.244.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909"
-dependencies = [
- "anyhow",
- "indexmap",
- "wasm-encoder",
- "wasmparser",
-]
-
-[[package]]
-name = "wasmparser"
-version = "0.244.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe"
-dependencies = [
- "bitflags 2.12.1",
- "hashbrown 0.15.5",
- "indexmap",
- "semver",
-]
-
-[[package]]
-name = "wayland-backend"
-version = "0.3.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2857dd20b54e916ec7253b3d6b4d5c4d7d4ca2c33c2e11c6c76a99bd8744755d"
-dependencies = [
- "cc",
- "downcast-rs",
- "rustix 1.1.4",
- "scoped-tls",
- "smallvec",
- "wayland-sys",
-]
-
-[[package]]
-name = "wayland-client"
-version = "0.31.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "645c7c96bb74690c3189b5c9cb4ca1627062bb23693a4fad9d8c3de958260144"
-dependencies = [
- "bitflags 2.12.1",
- "rustix 1.1.4",
- "wayland-backend",
- "wayland-scanner",
-]
-
-[[package]]
-name = "wayland-csd-frame"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e"
-dependencies = [
- "bitflags 2.12.1",
- "cursor-icon",
- "wayland-backend",
-]
-
-[[package]]
-name = "wayland-cursor"
-version = "0.31.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4a52d18780be9b1314328a3de5f930b73d2200112e3849ca6cb11822793fb34d"
-dependencies = [
- "rustix 1.1.4",
- "wayland-client",
- "xcursor",
-]
-
-[[package]]
-name = "wayland-protocols"
-version = "0.31.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f81f365b8b4a97f422ac0e8737c438024b5951734506b0e1d775c73030561f4"
-dependencies = [
- "bitflags 2.12.1",
- "wayland-backend",
- "wayland-client",
- "wayland-scanner",
-]
-
-[[package]]
-name = "wayland-protocols-plasma"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23803551115ff9ea9bce586860c5c5a971e360825a0309264102a9495a5ff479"
-dependencies = [
- "bitflags 2.12.1",
- "wayland-backend",
- "wayland-client",
- "wayland-protocols",
- "wayland-scanner",
-]
-
-[[package]]
-name = "wayland-protocols-wlr"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6"
-dependencies = [
- "bitflags 2.12.1",
- "wayland-backend",
- "wayland-client",
- "wayland-protocols",
- "wayland-scanner",
-]
-
-[[package]]
-name = "wayland-scanner"
-version = "0.31.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c324a910fd86ebdc364a3e61ec1f11737d3b1d6c273c0239ee8ff4bc0d24b4a"
-dependencies = [
- "proc-macro2",
- "quick-xml",
- "quote",
-]
-
-[[package]]
-name = "wayland-sys"
-version = "0.31.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8eab23fefc9e41f8e841df4a9c707e8a8c4ed26e944ef69297184de2785e3be"
-dependencies = [
- "dlib",
- "log",
- "once_cell",
- "pkg-config",
-]
-
-[[package]]
-name = "web-sys"
-version = "0.3.77"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2"
-dependencies = [
- "js-sys",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "web-time"
-version = "0.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa30049b1c872b72c89866d458eae9f20380ab280ffd1b1e18df2d3e2d98cfe0"
-dependencies = [
- "js-sys",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "wide"
-version = "0.7.33"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ce5da8ecb62bcd8ec8b7ea19f69a51275e91299be594ea5cc6ef7819e16cd03"
-dependencies = [
- "bytemuck",
- "safe_arch",
-]
-
-[[package]]
-name = "winapi"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
-dependencies = [
- "winapi-i686-pc-windows-gnu",
- "winapi-x86_64-pc-windows-gnu",
-]
-
-[[package]]
-name = "winapi-i686-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
-
-[[package]]
-name = "winapi-util"
-version = "0.1.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
-dependencies = [
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "winapi-x86_64-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
-
-[[package]]
-name = "windows"
-version = "0.54.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49"
-dependencies = [
- "windows-core",
- "windows-targets 0.52.6",
-]
-
-[[package]]
-name = "windows-core"
-version = "0.54.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65"
-dependencies = [
- "windows-result",
- "windows-targets 0.52.6",
-]
-
-[[package]]
-name = "windows-link"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
-
-[[package]]
-name = "windows-result"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8"
-dependencies = [
- "windows-targets 0.52.6",
-]
-
-[[package]]
-name = "windows-sys"
-version = "0.45.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
-dependencies = [
- "windows-targets 0.42.2",
-]
-
-[[package]]
-name = "windows-sys"
-version = "0.48.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
-dependencies = [
- "windows-targets 0.48.5",
-]
-
-[[package]]
-name = "windows-sys"
-version = "0.59.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
-dependencies = [
- "windows-targets 0.52.6",
-]
-
-[[package]]
-name = "windows-sys"
-version = "0.61.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
-dependencies = [
- "windows-link",
-]
-
-[[package]]
-name = "windows-targets"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
-dependencies = [
- "windows_aarch64_gnullvm 0.42.2",
- "windows_aarch64_msvc 0.42.2",
- "windows_i686_gnu 0.42.2",
- "windows_i686_msvc 0.42.2",
- "windows_x86_64_gnu 0.42.2",
- "windows_x86_64_gnullvm 0.42.2",
- "windows_x86_64_msvc 0.42.2",
-]
-
-[[package]]
-name = "windows-targets"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
-dependencies = [
- "windows_aarch64_gnullvm 0.48.5",
- "windows_aarch64_msvc 0.48.5",
- "windows_i686_gnu 0.48.5",
- "windows_i686_msvc 0.48.5",
- "windows_x86_64_gnu 0.48.5",
- "windows_x86_64_gnullvm 0.48.5",
- "windows_x86_64_msvc 0.48.5",
-]
-
-[[package]]
-name = "windows-targets"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
-dependencies = [
- "windows_aarch64_gnullvm 0.52.6",
- "windows_aarch64_msvc 0.52.6",
- "windows_i686_gnu 0.52.6",
- "windows_i686_gnullvm",
- "windows_i686_msvc 0.52.6",
- "windows_x86_64_gnu 0.52.6",
- "windows_x86_64_gnullvm 0.52.6",
- "windows_x86_64_msvc 0.52.6",
-]
-
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
-
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
-
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
-
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
-
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
-
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
-
-[[package]]
-name = "windows_i686_gnu"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
-
-[[package]]
-name = "windows_i686_gnu"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
-
-[[package]]
-name = "windows_i686_gnu"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
-
-[[package]]
-name = "windows_i686_gnullvm"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
-
-[[package]]
-name = "windows_i686_msvc"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
-
-[[package]]
-name = "windows_i686_msvc"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
-
-[[package]]
-name = "windows_i686_msvc"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
-
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
-
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
-
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
-
-[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
-
-[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
-
-[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
-
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
-
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
-
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
-
-[[package]]
-name = "winit"
-version = "0.29.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d59ad965a635657faf09c8f062badd885748428933dad8e8bdd64064d92e5ca"
-dependencies = [
- "ahash",
- "android-activity",
- "atomic-waker",
- "bitflags 2.12.1",
- "bytemuck",
- "calloop",
- "cfg_aliases",
- "core-foundation 0.9.4",
- "core-graphics",
- "cursor-icon",
- "icrate",
- "js-sys",
- "libc",
- "log",
- "memmap2",
- "ndk",
- "ndk-sys",
- "objc2 0.4.1",
- "once_cell",
- "orbclient",
- "percent-encoding",
- "raw-window-handle",
- "redox_syscall 0.3.5",
- "rustix 0.38.44",
- "sctk-adwaita",
- "serde",
- "smithay-client-toolkit",
- "smol_str",
- "unicode-segmentation",
- "wasm-bindgen",
- "wasm-bindgen-futures",
- "wayland-backend",
- "wayland-client",
- "wayland-protocols",
- "wayland-protocols-plasma",
- "web-sys",
- "web-time",
- "windows-sys 0.48.0",
- "x11-dl",
- "x11rb",
- "xkbcommon-dl",
-]
-
-[[package]]
-name = "winnow"
-version = "1.0.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "wit-bindgen"
-version = "0.51.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5"
-dependencies = [
- "wit-bindgen-rust-macro",
-]
-
-[[package]]
-name = "wit-bindgen"
-version = "0.57.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e"
-
-[[package]]
-name = "wit-bindgen-core"
-version = "0.51.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc"
-dependencies = [
- "anyhow",
- "heck",
- "wit-parser",
-]
-
-[[package]]
-name = "wit-bindgen-rust"
-version = "0.51.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21"
-dependencies = [
- "anyhow",
- "heck",
- "indexmap",
- "prettyplease",
- "syn",
- "wasm-metadata",
- "wit-bindgen-core",
- "wit-component",
-]
-
-[[package]]
-name = "wit-bindgen-rust-macro"
-version = "0.51.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a"
-dependencies = [
- "anyhow",
- "prettyplease",
- "proc-macro2",
- "quote",
- "syn",
- "wit-bindgen-core",
- "wit-bindgen-rust",
-]
-
-[[package]]
-name = "wit-component"
-version = "0.244.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2"
-dependencies = [
- "anyhow",
- "bitflags 2.12.1",
- "indexmap",
- "log",
- "serde",
- "serde_derive",
- "serde_json",
- "wasm-encoder",
- "wasm-metadata",
- "wasmparser",
- "wit-parser",
-]
-
-[[package]]
-name = "wit-parser"
-version = "0.244.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736"
-dependencies = [
- "anyhow",
- "id-arena",
- "indexmap",
- "log",
- "semver",
- "serde",
- "serde_derive",
- "serde_json",
- "unicode-xid",
- "wasmparser",
-]
-
-[[package]]
-name = "x11-dl"
-version = "2.21.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f"
-dependencies = [
- "libc",
- "once_cell",
- "pkg-config",
-]
-
-[[package]]
-name = "x11rb"
-version = "0.13.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414"
-dependencies = [
- "as-raw-xcb-connection",
- "gethostname",
- "libc",
- "libloading",
- "once_cell",
- "rustix 1.1.4",
- "x11rb-protocol",
-]
-
-[[package]]
-name = "x11rb-protocol"
-version = "0.13.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd"
-
-[[package]]
-name = "xcursor"
-version = "0.3.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b"
-
-[[package]]
-name = "xkbcommon-dl"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5"
-dependencies = [
- "bitflags 2.12.1",
- "dlib",
- "log",
- "once_cell",
- "xkeysym",
-]
-
-[[package]]
-name = "xkeysym"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56"
-
-[[package]]
-name = "zerocopy"
-version = "0.7.35"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
-dependencies = [
- "zerocopy-derive 0.7.35",
-]
-
-[[package]]
-name = "zerocopy"
-version = "0.8.50"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3b065d4f0e55f82fae73202e189638116a87c55ab6b8e6c2721e13dd9d854ad1"
-dependencies = [
- "zerocopy-derive 0.8.50",
-]
-
-[[package]]
-name = "zerocopy-derive"
-version = "0.7.35"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "zerocopy-derive"
-version = "0.8.50"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b631b19d36a892ab55420c92dbc83ccd79274f25be714855d3074aa71cab639"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "zmij"
-version = "1.0.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
-
-[[package]]
-name = "zune-core"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb8a0807f7c01457d0379ba880ba6322660448ddebc890ce29bb64da71fb40f9"
-
-[[package]]
-name = "zune-jpeg"
-version = "0.5.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296"
-dependencies = [
- "zune-core",
-]
diff --git a/2026/games_submissions/rpc2dot0/Cargo.toml b/2026/games_submissions/rpc2dot0/Cargo.toml
deleted file mode 100644
index 031cf9e..0000000
--- a/2026/games_submissions/rpc2dot0/Cargo.toml
+++ /dev/null
@@ -1,36 +0,0 @@
-[package]
-name = "eatyourgreens"
-version = "0.1.0"
-edition = "2024"
-
-[lib]
-crate-type = ["cdylib"]
-
-
-[target.'cfg(target_arch = "wasm32")'.dependencies]
-enum-map = { version = "2.7.3", features = ["serde"] } # teleia needs this ???
-glam = "*"
-js-sys = "*"
-log = "*"
-rand = "*"
-rand_chacha = "*"
-serde = { version = "1.0.228", features = ["derive"] }
-serde-wasm-bindgen = "0.6.5"
-teleia = { path = "vendor/teleia/crates/teleia" }
-teleia_macros = { path = "vendor/teleia/crates/teleia_macros" }
-wasm-bindgen = "=0.2.100"
-web-sys = { version = "0.3", features = [
- "Window",
- "Document",
- "HtmlVideoElement",
- "Element",
- "CssStyleDeclaration",
- "HtmlElement",
- "Blob",
- "BlobPropertyBag",
- "HtmlIFrameElement",
- "HtmlCollection",
- "Node",
- "Url",
-] }
-winit = { version = "=0.29.15" }
diff --git a/2026/games_submissions/rpc2dot0/LICENSE b/2026/games_submissions/rpc2dot0/LICENSE
deleted file mode 100644
index 92cb74f..0000000
--- a/2026/games_submissions/rpc2dot0/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2026 rpc2dot0
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/2026/games_submissions/rpc2dot0/README.md b/2026/games_submissions/rpc2dot0/README.md
deleted file mode 100644
index a3f3bb4..0000000
--- a/2026/games_submissions/rpc2dot0/README.md
+++ /dev/null
@@ -1,37 +0,0 @@
-# Eat Your Greens!
-
-## What is it?
-"Eat Your Greens!" is a microgame for Lcolonq JAM 2026 event
-
-## How to play it :
- - mouse (to click Heads)
- - Optional : Up/left/down/right keys (to move disquette)
-
-## How to build it :
- - `wasm-pack build --target web --release`
- - `cp -r index.* pkg/ ../jam/2026/games/eatyourgreens/`
- - you can debug by having fixed seed for reproduciable behaviour by
- forcing the seed value in `src/random.rs`, `new(seed: usize)` function.
- - also there a shit tone of logs in web console.
-
-## Game rules :
-
-### Main objective
-Survive the round and reach the required score target to win!
-
-### Basic scoring (Eating Greens)
-* **Eat Greens**: Click on **Green** entities to consume them. Each green gives you **+1 point**.
-* **Avoid the Rest**: Clicking on **it** will penalize you with **-1 point**.
-
-### Disquette & computer (optional)
-* There is a **Disquette** (floppy disk) bouncing around the screen.
-* You can take manual control of the disquette using your **Keyboard arrow keys**.
-* Steer the disquette into the **Computer** to plug it in.
-* Once inserted, use your mouse to click the **Power Button** on the computer to boot it up. This boots the computer (surprise) !
-
-### Hazards & Entity Rules
-* **Pac-Man Chasers (we call him mr Blue balls)**: Some **Blue** entities are actively hunting! If they catch and touch the disquette before you plug it into the computer, the disquette gets consumed and is gone for the rest of the round.
-* **Red Time Bombs**: **Red** entities have a 3-second countdown timer. If you don't click them to destroy them before the timer runs out, they will explode and **consume ALL Green entities** currently on the screen! *(clicking on them to disarm them still costs you -1 point).*
-* **Green Mutations**: If two **Green** entities bump into each other, they might undergo a bad reaction : one will turn **Yellow** and the other will turn **Red**.
-* **Red Collisions**: If two **Red** entities collide, they will blow each other up, but the explosion will also instantly kill the all green entities.
-* **Rogue Greens**: Be careful! Some Greens are fakes. If you hover your mouse near a "Rogue" Green, it will temporarily flash its true colors.
diff --git a/2026/games_submissions/rpc2dot0/index.css b/2026/games_submissions/rpc2dot0/index.css
deleted file mode 100644
index f31f38a..0000000
--- a/2026/games_submissions/rpc2dot0/index.css
+++ /dev/null
@@ -1,59 +0,0 @@
-html {
- touch-action: manipulation;
-}
-
-body {
- background: none transparent;
-}
-
-html,
-body {
- overflow: hidden;
- margin: 0 !important;
- padding: 0 !important;
-}
-
-canvas {
- display: block;
- max-width: 100vw !important;
- max-height: 100vh !important;
- width: auto !important;
- height: auto !important;
- position: absolute;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- image-rendering: pixelated;
-}
-
-.centered {
- margin-right: auto;
- margin-left: auto;
- display: block;
- position: absolute;
- font-size: 24px;
- font-family: Ubuntu-Light, Helvetica, sans-serif;
- text-align: center;
- image-rendering: pixelated;
-}
-
-#os-box {
- position: absolute;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- width: min(240px, 100vw, 150vh);
- aspect-ratio: 240 / 160;
- background: #111;
- overflow: hidden;
- z-index: 9999;
-}
-
-#ad-video {
- position: absolute;
- inset: 0;
- width: 100%;
- height: 100%;
- object-fit: cover;
- background: #111;
-} \ No newline at end of file
diff --git a/2026/games_submissions/rpc2dot0/index.html b/2026/games_submissions/rpc2dot0/index.html
deleted file mode 100644
index e70680b..0000000
--- a/2026/games_submissions/rpc2dot0/index.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!DOCTYPE html>
-<html>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
-
-<head>
- <meta charset="UTF-8">
- <link rel="icon" href="data:;base64,iVBORw0KGgo=">
- <link rel="stylesheet" href="./index.css" />
- <title>Eat your greens !</title>
-</head>
-
-<body>
- <div id="teleia-parent"></div>
-
- <div id="os-box" style="display: none;">
- <video id="ad-video" preload="auto" playsinline muted></video>
- </div>
-
- <script type="module" src="./index.js"></script>
-</body>
-
-</html> \ No newline at end of file
diff --git a/2026/games_submissions/rpc2dot0/index.js b/2026/games_submissions/rpc2dot0/index.js
deleted file mode 100644
index 2a8d674..0000000
--- a/2026/games_submissions/rpc2dot0/index.js
+++ /dev/null
@@ -1,48 +0,0 @@
-import init, { main_js, set_difficulty_js, receive_op_js } from './pkg/eatyourgreens.js';
-
-let is_embedded = false;
-let currentDifficulty = 1.0;
-
-window.addEventListener("DOMContentLoaded", async (event) => {
- await init();
- is_embedded = window.parent !== window;
- main_js(is_embedded);
- window.addEventListener("message", (ev) => {
- if (ev.data && ev.data.op === 'play_video') {
- play_video(ev.data.video_url);
- return;
- }
-
- if (is_embedded && ev.data && ev.data.op) {
- currentDifficulty = ev.data.difficulty || currentDifficulty;
- set_difficulty_js(currentDifficulty);
- receive_op_js(ev.data.op);
- }
- });
-});
-
-
-// os (inside computer)
-const osBox = document.getElementById('os-box');
-const video = document.getElementById('ad-video');
-
-video.addEventListener('ended', () => {
- osBox.style.display = 'none';
- receive_op_js('video_finished');
-});
-
-function play_video(videoUrl) {
- if (!videoUrl) {
- return;
- }
- osBox.style.display = 'block';
- video.src = videoUrl;
- video.muted = false;
- video.volume = 0.85;
- video.play().catch((e) => {
- console.error("Failed to play video with sound:", e);
- // fallback if autoplay policy blocked it
- video.muted = true;
- video.play();
- });
-}
diff --git a/2026/games_submissions/rpc2dot0/rust-toolchain.toml b/2026/games_submissions/rpc2dot0/rust-toolchain.toml
deleted file mode 100644
index 5360e5c..0000000
--- a/2026/games_submissions/rpc2dot0/rust-toolchain.toml
+++ /dev/null
@@ -1,4 +0,0 @@
-[toolchain]
-channel = "nightly"
-targets = ["wasm32-unknown-unknown"]
-features = ["simd"]
diff --git a/2026/games_submissions/rpc2dot0/spec.txt b/2026/games_submissions/rpc2dot0/spec.txt
deleted file mode 100644
index e14d3ff..0000000
--- a/2026/games_submissions/rpc2dot0/spec.txt
+++ /dev/null
@@ -1,106 +0,0 @@
-
-LCOLONQ MICROJAM 2K26-A-PALOOZA
-
- what is it: a game jam for the LCOLONQ zone or "greencircle" or cyberspace or whatever else we call it!
- why is it: let's have some fun on the computer together!
- when is it: submissions are due on Friday, July 17th 2026.
- where is it: submit links to entries on Discord or IRC or Twitch Chatroom or anywhere we are likely to see them. if you need a place to upload your submission, contact clonk! this is a small group, we can ask each other questions and figure things out together.
- who is it: you, maybe! if you don't feel confident making a game alone, maybe team up with somebody else! ask around in the Discord or IRC or Twitch Chatroom or anywhere else!
- how is it: pretty good; see below!
-
-THE DETAILS
-or, what are we making, actually
-
-For this event, your challenge is to make a "microgame". Microgame is a term used by the WarioWare game series to describe short, (mostly) self-contained minigames played in rapid succession. The individual microgames tend to present a single gameplay mechanic or task for the player to perform, with a well-defined success and failure state. Typical microgames are only a few seconds long, while some end-of-stage "boss games" can last a minute or more. In WarioWare, the player is presented with a series of microgames to play in a random order. Failing at an individual microgame costs the player a life, and losing all lives means game over!
-
-For an example of this type of gameplay, here is a nice demonstration video.
-
-Your mission in this game jam is to make a microgame! At the end, we'll collect all the submissions together, so you can play through the whole collection like you would a stage in WarioWare. In order for this to work nicely, it's best if everyone follows some simple guidelines. These mostly aren't hard-and-fast rules, but moreso a framework to ensure that the overall collection is playable.
-
- Make a game that's playable in the browser.
-
- The browser is how we're going to ensure all of the games can play nicely together. This doesn't mean you have to write a game with JavaScript!
-
- Many languages and libraries can be built to WebAssembly. For example, if you like C and raylib, check out this guide! It's also quite easy to write Rust programs targeting WebAssembly. In general, if you have a preferred language and graphics library, it's likely you'll be able to make something work!
-
- Full-fledged game engines like Godot also have the ability to export a web build. For Godot, see the documentation.
-
- It's also perfectly fine to work with JavaScript and Canvas, either using some library or plain browser APIs! If you'd like to go this route and aren't sure where to start, check out the MDN documentation for the Canvas API or maybe WebGL. If you'd like something a bit more batteries-included, maybe check out Pixi or Phaser.
- Games should be primarily controlled using the mouse.
-
- We want to make sure that someone playing the collection doesn't get confused by the controls. With keyboard controls, each game might pick totally different keys, and adjusting the player will be a challenge. As such, please center your game's control scheme around a standard two-button mouse. You're still welcome to use the keyboard and any other input method that's generally available, but try to avoid assuming that the player will know the control scheme you require. For example, a keyboard-involved microgame might involving mashing keys indiscriminately, or playing a "hot-and-cold" game based on the physical locations of keys pressed in the player's keyboard layout. Get creative!
- Keep it short and focused! Less than a minute is ideal.
-
- Ideally your game is tightly focused on a single gameplay idea. Feel free to interpret this however you wish! If you want to make a two minute mini-RPG, be my guest! Rough and interesting is a good way to go.
- Make sure there is an obvious win condition and lose condition.
-
- We need a way to know if the player should lose a life after your game runs. The player running out of time is a perfectly good lose condition (but make sure to display a timer somewhere onscreen if this is the case!). But again, feel free to be inventive!
-
-TECHNICAL INFO
-what do I need to do to make my game work?
-
-When you submit your game, ideally you should submit an archive (ZIP or tarball) containing a folder. That folder should contain all of your game's assets, alongside an index.html that runs the game. Most game engine web exports will give you exactly this!
-
-Your game should be scaled to fill the entire browser window. We recommend that games render at 240x160, but this is not a hard requirement. Feel free to break/bend this rule if you like!
-
-In order for things to work smoothly, you'll need your game to report when certain things have happened, and also to respond to certain requests. Don't worry! This is simple and easy, and we have some examples available using common tools.
-
-Your game can communicate with the "harness" by calling the JavaScript function window.parent.postMessage. The harness will send some messages back to your game in the same way (and you can listen for them with window.addEventListener("message", your_message_handler_here)). If that's inconvenient, we also set certain special JavaScript variables whenever events fire, so you can poll those variables inside your game loop if it's easier.
-
-Here's what you need to send and receive from the harness:
-
- When your game's page loads, you should load all assets and send a ready message to the harness:
-
- window.parent.postMessage({op: "ready"});
-
-
- After sending this message, wait patiently! The game has not started yet, so you shouldn't start any timers or expect the player to input anything just yet.
-
- The harness will tell you that the game should start, and at which difficulty level. You can detect this by either listening for an event, or reading a variable:
-
- window.addEventListener("message", ev => console.log(ev.data));
- // ev.data will be {op: "start", difficulty: 42.0}
-
-
- or:
-
- window.lcolonqJamStart
- // this variable will either be an integer or falsy!
- // you can check it repeatedly in your game loop until
- // it's an integer - that integer is the difficulty level
-
-
- This means that your game should start right away - you can start any timers and expect player input! You are free to interpret the difficulty number any way you like - this number will be roughly the number of previously-completed games so far in the current round.
-
- When your game starts (in response to the previous message), you should let the harness know it started successfully:
-
- window.parent.postMessage({op: "started", verb: "catch!"});
-
-
- The verb field tells the harness to display a particular word as a prompt to the player as your game appears.
-
- You are free to run your game! When the game is done, report whether the user won or lost:
-
- window.parent.postMessage({op: "done", win: true});
-
-
- or
-
- window.parent.postMessage({op: "done", win: false});
-
-
- At this point, the user will no longer be able to interact with your game. You should reset things, and be ready to run the game again fresh when you receive the start message. In general, you should assume that your game page could be reloaded entirely, or it could never be reloaded and receive repeated start events!
-
- That's it!
-
-THE RULES
-ok these are actual rules don't bend these ones please
-
- Alongside your game, please submit source code (either a link to a repository or actual source in an archive file). Please include the open-source license you are releasing your code under, as well as any licenses and attribution for any assets used.
-
- Please do not use any "trained" machine learning tool with external training data for programming or asset creation. That is: no off-the-shelf LLMs, image generation, etc. anywhere in the development process or final game. Feel free to use machine learning techniques at your leisure if you're using a model you trained entirely yourself on data you have collected yourself (and to which you have a license).
-
- In brief: Claude code/ChatGPT/AI images are banned. If you'd like to write some weird genetic algorithm thing or do reinforcement learning for game AI or procedural textures or whatever else, that's cool and please do it!
- Be kind.
-
-LCOLONQ 2"K"26. Most rights reversed. All words endorsed by my employer. I love the computer and the people on it.
diff --git a/2026/games_submissions/rpc2dot0/src/assets.rs b/2026/games_submissions/rpc2dot0/src/assets.rs
deleted file mode 100644
index fa160a1..0000000
--- a/2026/games_submissions/rpc2dot0/src/assets.rs
+++ /dev/null
@@ -1,38 +0,0 @@
-teleia_macros::generate_assets!("src/assets/");
-
-pub const AUDIO_ASSETS: &[(&str, &[u8])] = &[
- ("crunch", include_bytes!("assets/audio/crunch.wav")),
- ("fart", include_bytes!("assets/audio/fart.wav")),
- ("explosion", include_bytes!("assets/audio/explosion.wav")),
-];
-
-pub const VIDEO_ASSETS: &[(&str, &[u8])] = &[
- (
- "seks_is_bad.mp4",
- include_bytes!("assets/video/adzzz/seks_is_bad.mp4"),
- ),
- (
- "seks_is_gud.mp4",
- include_bytes!("assets/video/adzzz/seks_is_gud.mp4"),
- ),
- (
- "pinnesse_c.mp4",
- include_bytes!("assets/video/adzzz/pinnesse_c.mp4"),
- ),
- (
- "hyped_c.mp4",
- include_bytes!("assets/video/adzzz/hyped_c.mp4"),
- ),
- (
- "GG_win_c.mp4",
- include_bytes!("assets/video/adzzz/GG_win_c.mp4"),
- ),
- (
- "game_over_c.mp4",
- include_bytes!("assets/video/adzzz/game_over_c.mp4"),
- ),
- (
- "confused_c.mp4",
- include_bytes!("assets/video/adzzz/confused_c.mp4"),
- ),
-];
diff --git a/2026/games_submissions/rpc2dot0/src/assets/audio/crunch.wav b/2026/games_submissions/rpc2dot0/src/assets/audio/crunch.wav
deleted file mode 100644
index f11334f..0000000
--- a/2026/games_submissions/rpc2dot0/src/assets/audio/crunch.wav
+++ /dev/null
Binary files differ
diff --git a/2026/games_submissions/rpc2dot0/src/assets/audio/explosion.wav b/2026/games_submissions/rpc2dot0/src/assets/audio/explosion.wav
deleted file mode 100644
index c3e867f..0000000
--- a/2026/games_submissions/rpc2dot0/src/assets/audio/explosion.wav
+++ /dev/null
Binary files differ
diff --git a/2026/games_submissions/rpc2dot0/src/assets/audio/fart.wav b/2026/games_submissions/rpc2dot0/src/assets/audio/fart.wav
deleted file mode 100644
index ebb001d..0000000
--- a/2026/games_submissions/rpc2dot0/src/assets/audio/fart.wav
+++ /dev/null
Binary files differ
diff --git a/2026/games_submissions/rpc2dot0/src/assets/audio/footsteps.wav b/2026/games_submissions/rpc2dot0/src/assets/audio/footsteps.wav
deleted file mode 100644
index 57bfddf..0000000
--- a/2026/games_submissions/rpc2dot0/src/assets/audio/footsteps.wav
+++ /dev/null
Binary files differ
diff --git a/2026/games_submissions/rpc2dot0/src/assets/audio/test.wav b/2026/games_submissions/rpc2dot0/src/assets/audio/test.wav
deleted file mode 100644
index 0eabe85..0000000
--- a/2026/games_submissions/rpc2dot0/src/assets/audio/test.wav
+++ /dev/null
Binary files differ
diff --git a/2026/games_submissions/rpc2dot0/src/assets/meshes/square.obj b/2026/games_submissions/rpc2dot0/src/assets/meshes/square.obj
deleted file mode 100644
index 7acdef6..0000000
--- a/2026/games_submissions/rpc2dot0/src/assets/meshes/square.obj
+++ /dev/null
@@ -1,15 +0,0 @@
-# Blender 3.6.2
-# www.blender.org
-o Cube
-v -1.000000 -1.000000 0.000000
-v 1.000000 -1.000000 0.000000
-v -1.000000 1.000000 0.000000
-v 1.000000 1.000000 0.000000
-vn -0.0000 -0.0000 -1.0000
-vt 0.0 1.0
-vt 1.0 0.0
-vt 0.0 0.0
-vt 1.0 1.0
-s 0
-f 3/1/1 2/2/1 1/3/1
-f 3/1/1 4/4/1 2/2/1
diff --git a/2026/games_submissions/rpc2dot0/src/assets/shaders/flat/frag.glsl b/2026/games_submissions/rpc2dot0/src/assets/shaders/flat/frag.glsl
deleted file mode 100644
index 6ebdfa9..0000000
--- a/2026/games_submissions/rpc2dot0/src/assets/shaders/flat/frag.glsl
+++ /dev/null
@@ -1,11 +0,0 @@
-uniform sampler2D texture_data;
-
-void main()
-{
- vec2 tcfull = vec2(vertex_texcoord.x, 1.0 - vertex_texcoord.y);
- vec4 texel = texture(texture_data, tcfull);
- if (texel.a != 1.0) {
- discard;
- }
- frag_color = texel;
-}
diff --git a/2026/games_submissions/rpc2dot0/src/assets/shaders/flat/vert.glsl b/2026/games_submissions/rpc2dot0/src/assets/shaders/flat/vert.glsl
deleted file mode 100644
index 6e796cc..0000000
--- a/2026/games_submissions/rpc2dot0/src/assets/shaders/flat/vert.glsl
+++ /dev/null
@@ -1,4 +0,0 @@
-void main()
-{
- default_main();
-} \ No newline at end of file
diff --git a/2026/games_submissions/rpc2dot0/src/assets/textures/background_main.png b/2026/games_submissions/rpc2dot0/src/assets/textures/background_main.png
deleted file mode 100644
index 82b3ebe..0000000
--- a/2026/games_submissions/rpc2dot0/src/assets/textures/background_main.png
+++ /dev/null
Binary files differ
diff --git a/2026/games_submissions/rpc2dot0/src/assets/textures/computer.png b/2026/games_submissions/rpc2dot0/src/assets/textures/computer.png
deleted file mode 100644
index be5c723..0000000
--- a/2026/games_submissions/rpc2dot0/src/assets/textures/computer.png
+++ /dev/null
Binary files differ
diff --git a/2026/games_submissions/rpc2dot0/src/assets/textures/disquette.png b/2026/games_submissions/rpc2dot0/src/assets/textures/disquette.png
deleted file mode 100644
index 12399f4..0000000
--- a/2026/games_submissions/rpc2dot0/src/assets/textures/disquette.png
+++ /dev/null
Binary files differ
diff --git a/2026/games_submissions/rpc2dot0/src/assets/textures/landing.png b/2026/games_submissions/rpc2dot0/src/assets/textures/landing.png
deleted file mode 100644
index 229e6ad..0000000
--- a/2026/games_submissions/rpc2dot0/src/assets/textures/landing.png
+++ /dev/null
Binary files differ
diff --git a/2026/games_submissions/rpc2dot0/src/assets/textures/mrbleu.png b/2026/games_submissions/rpc2dot0/src/assets/textures/mrbleu.png
deleted file mode 100644
index d16a717..0000000
--- a/2026/games_submissions/rpc2dot0/src/assets/textures/mrbleu.png
+++ /dev/null
Binary files differ
diff --git a/2026/games_submissions/rpc2dot0/src/assets/textures/mrbleu_lurking.png b/2026/games_submissions/rpc2dot0/src/assets/textures/mrbleu_lurking.png
deleted file mode 100644
index 3217129..0000000
--- a/2026/games_submissions/rpc2dot0/src/assets/textures/mrbleu_lurking.png
+++ /dev/null
Binary files differ
diff --git a/2026/games_submissions/rpc2dot0/src/assets/textures/mrgreen.png b/2026/games_submissions/rpc2dot0/src/assets/textures/mrgreen.png
deleted file mode 100644
index 2eb7210..0000000
--- a/2026/games_submissions/rpc2dot0/src/assets/textures/mrgreen.png
+++ /dev/null
Binary files differ
diff --git a/2026/games_submissions/rpc2dot0/src/assets/textures/mrred.png b/2026/games_submissions/rpc2dot0/src/assets/textures/mrred.png
deleted file mode 100644
index 2c4bc18..0000000
--- a/2026/games_submissions/rpc2dot0/src/assets/textures/mrred.png
+++ /dev/null
Binary files differ
diff --git a/2026/games_submissions/rpc2dot0/src/assets/textures/mryellow.png b/2026/games_submissions/rpc2dot0/src/assets/textures/mryellow.png
deleted file mode 100644
index 9784a8f..0000000
--- a/2026/games_submissions/rpc2dot0/src/assets/textures/mryellow.png
+++ /dev/null
Binary files differ
diff --git a/2026/games_submissions/rpc2dot0/src/assets/textures/mute.png b/2026/games_submissions/rpc2dot0/src/assets/textures/mute.png
deleted file mode 100644
index b4b81dd..0000000
--- a/2026/games_submissions/rpc2dot0/src/assets/textures/mute.png
+++ /dev/null
Binary files differ
diff --git a/2026/games_submissions/rpc2dot0/src/assets/textures/unmute.png b/2026/games_submissions/rpc2dot0/src/assets/textures/unmute.png
deleted file mode 100644
index 278d227..0000000
--- a/2026/games_submissions/rpc2dot0/src/assets/textures/unmute.png
+++ /dev/null
Binary files differ
diff --git a/2026/games_submissions/rpc2dot0/src/assets/video/adzzz/GG_win_c.mp4 b/2026/games_submissions/rpc2dot0/src/assets/video/adzzz/GG_win_c.mp4
deleted file mode 100644
index c24a0d9..0000000
--- a/2026/games_submissions/rpc2dot0/src/assets/video/adzzz/GG_win_c.mp4
+++ /dev/null
Binary files differ
diff --git a/2026/games_submissions/rpc2dot0/src/assets/video/adzzz/confused_c.mp4 b/2026/games_submissions/rpc2dot0/src/assets/video/adzzz/confused_c.mp4
deleted file mode 100644
index 0c7756d..0000000
--- a/2026/games_submissions/rpc2dot0/src/assets/video/adzzz/confused_c.mp4
+++ /dev/null
Binary files differ
diff --git a/2026/games_submissions/rpc2dot0/src/assets/video/adzzz/game_over_c.mp4 b/2026/games_submissions/rpc2dot0/src/assets/video/adzzz/game_over_c.mp4
deleted file mode 100644
index bccb605..0000000
--- a/2026/games_submissions/rpc2dot0/src/assets/video/adzzz/game_over_c.mp4
+++ /dev/null
Binary files differ
diff --git a/2026/games_submissions/rpc2dot0/src/assets/video/adzzz/hyped_c.mp4 b/2026/games_submissions/rpc2dot0/src/assets/video/adzzz/hyped_c.mp4
deleted file mode 100644
index 909c56a..0000000
--- a/2026/games_submissions/rpc2dot0/src/assets/video/adzzz/hyped_c.mp4
+++ /dev/null
Binary files differ
diff --git a/2026/games_submissions/rpc2dot0/src/assets/video/adzzz/pinnesse_c.mp4 b/2026/games_submissions/rpc2dot0/src/assets/video/adzzz/pinnesse_c.mp4
deleted file mode 100644
index 38cdc53..0000000
--- a/2026/games_submissions/rpc2dot0/src/assets/video/adzzz/pinnesse_c.mp4
+++ /dev/null
Binary files differ
diff --git a/2026/games_submissions/rpc2dot0/src/assets/video/adzzz/seks_is_bad.mp4 b/2026/games_submissions/rpc2dot0/src/assets/video/adzzz/seks_is_bad.mp4
deleted file mode 100644
index fb9d490..0000000
--- a/2026/games_submissions/rpc2dot0/src/assets/video/adzzz/seks_is_bad.mp4
+++ /dev/null
Binary files differ
diff --git a/2026/games_submissions/rpc2dot0/src/assets/video/adzzz/seks_is_gud.mp4 b/2026/games_submissions/rpc2dot0/src/assets/video/adzzz/seks_is_gud.mp4
deleted file mode 100644
index 7aac4d5..0000000
--- a/2026/games_submissions/rpc2dot0/src/assets/video/adzzz/seks_is_gud.mp4
+++ /dev/null
Binary files differ
diff --git a/2026/games_submissions/rpc2dot0/src/collision.rs b/2026/games_submissions/rpc2dot0/src/collision.rs
deleted file mode 100644
index aaae9a7..0000000
--- a/2026/games_submissions/rpc2dot0/src/collision.rs
+++ /dev/null
@@ -1,99 +0,0 @@
-use crate::color::EntityColor;
-use crate::constants::{MAX_SPEED, MIN_SPEED, SPEED_COLLIDE_MULT};
-use crate::entity::Entity;
-use crate::math::BoundingCircle;
-use crate::random::RandomState;
-
-pub fn detect_collisions(entities: &[Entity], buffer: &mut Vec<(usize, usize)>) {
- buffer.clear();
- let len = entities.len();
-
- for i in 0..len {
- if !entities[i].alive {
- continue;
- }
- for j in (i + 1)..len {
- if !entities[j].alive {
- continue;
- }
- if entities[i].overlaps_with(&entities[j]) {
- buffer.push((i, j));
- }
- }
- }
-}
-
-pub fn process_collisions(
- entities: &mut Vec<Entity>,
- rng: &mut RandomState,
- _next_entity_id: &mut u32,
- collision_buffer: &mut Vec<(usize, usize)>,
- elapsed_ms: f32,
- _events: &mut Vec<String>,
-) {
- detect_collisions(entities, collision_buffer);
-
- let new_entities = Vec::new();
-
- for &(i, j) in collision_buffer.iter() {
- if i >= entities.len() || j >= entities.len() {
- continue;
- }
- if !entities[i].alive || !entities[j].alive {
- continue;
- }
-
- let color_a = entities[i].color;
- let color_b = entities[j].color;
-
- match (color_a, color_b) {
- (EntityColor::Green, EntityColor::Green) => {
- if (rng.next_u32() & 1) == 0 {
- entities[i].color = EntityColor::Yellow;
- entities[j].color = EntityColor::Red;
- entities[j].spawn_time_ms = Some(elapsed_ms);
- } else {
- entities[i].color = EntityColor::Red;
- entities[i].spawn_time_ms = Some(elapsed_ms);
- entities[j].color = EntityColor::Yellow;
- }
- }
- (EntityColor::Red, EntityColor::Red) => {
- let a = &entities[i];
- let b = &entities[j];
- let collision_point = (a.pos + b.pos) * 0.5;
-
- entities[i].alive = false;
- entities[j].alive = false;
-
- let best_green_idx = entities
- .iter()
- .enumerate()
- .filter(|(_, e)| e.alive && e.color == EntityColor::Green)
- .min_by(|(_, e1), (_, e2)| {
- e1.pos
- .distance_squared(collision_point)
- .partial_cmp(&e2.pos.distance_squared(collision_point))
- .unwrap_or(std::cmp::Ordering::Equal)
- })
- .map(|(idx, _)| idx);
-
- if let Some(idx) = best_green_idx {
- entities[idx].alive = false;
- }
- }
- _ => {
- let a_speed = (entities[i].speed * SPEED_COLLIDE_MULT).clamp(MIN_SPEED, MAX_SPEED);
- let b_speed = (entities[j].speed * SPEED_COLLIDE_MULT).clamp(MIN_SPEED, MAX_SPEED);
- entities[i].speed = a_speed;
- entities[j].speed = b_speed;
- entities[i].normalize_velocity();
- entities[j].normalize_velocity();
- }
- }
- }
-
- if !new_entities.is_empty() {
- entities.extend(new_entities);
- }
-}
diff --git a/2026/games_submissions/rpc2dot0/src/color.rs b/2026/games_submissions/rpc2dot0/src/color.rs
deleted file mode 100644
index ed81ec4..0000000
--- a/2026/games_submissions/rpc2dot0/src/color.rs
+++ /dev/null
@@ -1,25 +0,0 @@
-use crate::assets;
-
-#[derive(Debug, Copy, Clone, PartialEq, Eq)]
-
-pub enum EntityColor {
- Red = 0,
- Green = 1,
- Bleu = 2,
- Yellow = 3,
-}
-
-pub trait ColorExt {
- fn texture(&self) -> assets::Texture;
-}
-
-impl ColorExt for EntityColor {
- fn texture(&self) -> assets::Texture {
- match self {
- EntityColor::Red => assets::Texture::Mrred,
- EntityColor::Green => assets::Texture::Mrgreen,
- EntityColor::Bleu => assets::Texture::Mrbleu,
- EntityColor::Yellow => assets::Texture::Mryellow,
- }
- }
-}
diff --git a/2026/games_submissions/rpc2dot0/src/computer.rs b/2026/games_submissions/rpc2dot0/src/computer.rs
deleted file mode 100644
index e25fb65..0000000
--- a/2026/games_submissions/rpc2dot0/src/computer.rs
+++ /dev/null
@@ -1,183 +0,0 @@
-use crate::constants::*;
-use crate::disquette::Disquette;
-use crate::game::Game;
-use crate::math::ContainsPoint;
-use crate::math::Rectangle;
-use crate::random::RandomState;
-
-pub mod os;
-
-use os::Os;
-use teleia::context;
-
-#[derive(Debug, Clone, Copy, PartialEq, Eq)]
-pub enum ComputerPhase {
- Off,
- Booting,
- On,
- ShutDown,
-}
-
-impl From<ComputerPhase> for &'static str {
- fn from(value: ComputerPhase) -> Self {
- match value {
- ComputerPhase::Off => "Off",
- ComputerPhase::Booting => "Booting",
- ComputerPhase::On => "On",
- ComputerPhase::ShutDown => "ShutDown",
- }
- }
-}
-
-#[derive(Debug, Clone, Copy, PartialEq, Eq)]
-pub enum PowerButtonAction {
- On,
- Off,
-}
-
-impl From<PowerButtonAction> for &'static str {
- fn from(value: PowerButtonAction) -> Self {
- match value {
- PowerButtonAction::On => "On",
- PowerButtonAction::Off => "Off",
- }
- }
-}
-
-#[derive(Debug, Clone, Copy)]
-pub struct Computer {
- pub coord: glam::Vec2,
- pub phase: ComputerPhase,
- pub disquette: Disquette,
- pub os: Os,
-}
-
-impl Computer {
- pub fn new(
- logical_width: f32,
- logical_height: f32,
- rng: &mut RandomState,
- difficulty: f32,
- ) -> Self {
- const HALF_W: f32 = COMPUTER_WIDTH / 2.0;
- const HALF_H: f32 = COMPUTER_HEIGHT / 2.0;
- let x = rng.next_range(HALF_W, logical_width - HALF_W);
- let y = rng.next_range(HALF_H, logical_height - HALF_H);
- log::info!("eatyourgreens:: Computer new at ({}, {}) ", x, y);
- let mut temp = Self {
- coord: glam::Vec2::new(x, y),
- phase: ComputerPhase::Off,
- disquette: Disquette {
- coord: glam::Vec2::ZERO,
- vel: glam::Vec2::ZERO,
- size: 0.0,
- phase: crate::disquette::DisquettePhase::Free,
- },
- os: Os::from(ComputerPhase::Off),
- };
-
- let hitzone = temp.hit_zone(difficulty);
- temp.disquette = Disquette::new(logical_width, logical_height, rng, Some(hitzone));
- temp
- }
-
- pub fn disquette_inserted(&self) -> bool {
- self.disquette.is_inserted()
- }
-
- pub fn boot(&mut self) {
- log::info!("eatyourgreens:: computer boot");
- self.phase = ComputerPhase::Booting;
- self.os = Os::from(self.phase);
- }
-
- pub fn on(&mut self, ctx: &context::Context) {
- log::info!("eatyourgreens:: computer on");
- self.phase = ComputerPhase::On;
- self.os.set(self.phase);
- self.os.os_play(&ctx);
- }
-
- pub fn shutdown(&mut self) {
- log::info!("eatyourgreens:: computer shutdown");
- self.phase = ComputerPhase::Off;
- self.os.set(self.phase);
- }
-
- pub fn already_used(&self) -> bool {
- self.phase != ComputerPhase::Off
- }
-
- //
- // hitzone calculation
- //
- // computer pos is (x, y)so its center.
- // first find the top-left corner of the computer bbox.
- // second define "hitzone" as the inner rectangle offset from that top-left corner.
-
- // us diffculity to shrink the area, so user msut aim better at higher difficulties
-
- // topleft(x -width/2 , y-height/2)
- // +------------------------------------------+ ---
- // | | |
- // | TRIGGER_OFFSET_Y | |
- // | v | | COMPUTER_HEIGHT
- // | -> +----------------------------+ --- | |
- // | ^ | diff_y | | | |
- // | | | -> +---------------+ --- | | | |
- // | | | ^ | | | | | TRIGGER_HEIGHT
- // | | | | | Actual Hit |actual_| | | |
- // | | | | | Zone (shrunk) |height | | | |
- // | | | | +---------------+ --- | | | |
- // | | | diff_x | | | |
- // | | +----------------------------+ --- | |
- // | | | |
- // | TRIGGER_OFFSET_X | |
- // +------------------------------------------+ ---
- // |--------------COMPUTER_WIDTH--------------|
-
- pub fn hit_zone(&self, difficulty: f32) -> Rectangle {
- let topleft = self.coord - glam::Vec2::new(COMPUTER_WIDTH / 2.0, COMPUTER_HEIGHT / 2.0);
-
- let size_multiplier = 1.0 / difficulty.max(1.0);
- let actual_size = glam::Vec2::new(TRIGGER_WIDTH, TRIGGER_HEIGHT) * size_multiplier;
-
- let diff = (glam::Vec2::new(TRIGGER_WIDTH, TRIGGER_HEIGHT) - actual_size) / 2.0;
-
- let trigger_pos = topleft + glam::Vec2::new(TRIGGER_OFFSET_X, TRIGGER_OFFSET_Y) + diff;
-
- Rectangle::from_min_max(trigger_pos, trigger_pos + actual_size)
- }
-
- pub fn check_power_button(
- &self,
- point: glam::Vec2,
- difficulty: f32,
- ) -> Option<PowerButtonAction> {
- let topleft = self.coord - glam::Vec2::new(COMPUTER_WIDTH / 2.0, COMPUTER_HEIGHT / 2.0);
- let pb_pos = topleft + glam::Vec2::new(POWER_BUTTON_OFFSET_X, POWER_BUTTON_OFFSET_Y);
- let pb_size = glam::Vec2::new(POWER_BUTTON_WIDTH, POWER_BUTTON_HEIGHT);
-
- let pb_rect = Rectangle::from_min_max(pb_pos, pb_pos + pb_size);
-
- if pb_rect.contains(point) {
- if difficulty > 1.0 {
- let half_width = POWER_BUTTON_WIDTH / 2.0;
- if point.x < pb_pos.x + half_width {
- Some(PowerButtonAction::Off)
- } else {
- Some(PowerButtonAction::On)
- }
- } else {
- Some(PowerButtonAction::On)
- }
- } else {
- None
- }
- }
-
- pub fn contains_disquette(&self, disquette: &Disquette, difficulty: f32) -> bool {
- let hitzone = self.hit_zone(difficulty);
- hitzone.contains(disquette.coord)
- }
-}
diff --git a/2026/games_submissions/rpc2dot0/src/computer/os.rs b/2026/games_submissions/rpc2dot0/src/computer/os.rs
deleted file mode 100644
index 797e07e..0000000
--- a/2026/games_submissions/rpc2dot0/src/computer/os.rs
+++ /dev/null
@@ -1,117 +0,0 @@
-use std::fmt::Debug;
-
-use crate::computer::ComputerPhase;
-use crate::message::Message;
-use crate::{assets::VIDEO_ASSETS, random::RandomState};
-use crate::{constants::*, game};
-use teleia::context;
-use web_sys::{Blob, BlobPropertyBag, Url};
-
-#[derive(Debug, Clone, Copy, PartialEq, Eq)]
-pub struct Os {
- state: OsState,
-}
-
-#[derive(Debug, Clone, Copy, PartialEq, Eq)]
-pub enum OsState {
- Booting,
- On,
- ShutDown,
- Off,
-}
-
-// TODO ???
-impl From<OsState> for ComputerPhase {
- fn from(value: OsState) -> Self {
- match value {
- OsState::Booting => ComputerPhase::Booting,
- OsState::On => ComputerPhase::On,
- OsState::ShutDown => ComputerPhase::ShutDown,
- OsState::Off => ComputerPhase::Off,
- }
- }
-}
-
-impl From<ComputerPhase> for OsState {
- fn from(value: ComputerPhase) -> Self {
- match value {
- ComputerPhase::Off => OsState::Off,
- ComputerPhase::Booting => OsState::Booting,
- ComputerPhase::On => OsState::On,
- ComputerPhase::ShutDown => OsState::ShutDown,
- }
- }
-}
-
-impl Os {
- pub fn new() -> Self {
- Self {
- state: OsState::Off,
- }
- }
- pub fn from(phase: ComputerPhase) -> Self {
- Self {
- state: OsState::from(phase),
- }
- }
-
- pub fn set(&mut self, phase: ComputerPhase) {
- self.state = OsState::from(phase);
- }
-}
-
-impl Default for Os {
- fn default() -> Self {
- Self {
- state: OsState::Off,
- }
- }
-}
-
-impl Os {
- pub fn boot(rng: &mut RandomState) {
- let idx = rng.next_range(0.0, VIDEO_ASSETS.len() as f32) as usize;
- let bytes = VIDEO_ASSETS[idx].1;
-
- // huh ? `of1` nice api name
- let parts = js_sys::Array::of1(&js_sys::Uint8Array::from(bytes));
- let blob_props = BlobPropertyBag::new();
- blob_props.set_type("video/mp4");
-
- let blob = match Blob::new_with_u8_array_sequence_and_options(&parts, &blob_props) {
- Ok(b) => b,
- Err(_) => {
- log::error!("eatyourgreens:: failed to create blob");
- return;
- }
- };
-
- let url = match Url::create_object_url_with_blob(&blob) {
- Ok(s) => s,
- Err(_) => {
- log::error!("eatyourgreens:: failed to create object URL");
- return;
- }
- };
- if let Some(window) = web_sys::window() {
- let msg = Message {
- op: "play_video",
- verb: None,
- win: None,
- score: None,
- video_url: Some(url),
- };
- Message::post(&window, &msg);
- } else {
- log::error!("eatyourgreens:: failed to get window and send os msg");
- }
- }
-
- pub fn os_play(&self, ctx: &context::Context) {
- log::debug!("eatyourgreens:: os play game:");
- }
-
- pub fn os_quit() {
- log::debug!("eatyourgreens:: os quit");
- }
-}
diff --git a/2026/games_submissions/rpc2dot0/src/constants.rs b/2026/games_submissions/rpc2dot0/src/constants.rs
deleted file mode 100644
index 0e16b2b..0000000
--- a/2026/games_submissions/rpc2dot0/src/constants.rs
+++ /dev/null
@@ -1,109 +0,0 @@
-use crate::color::EntityColor;
-use wasm_bindgen::prelude::wasm_bindgen;
-
-pub const HEIGHT: u32 = 160;
-pub const WIDTH: u32 = 240;
-pub const LANDING_TEXTURE_HEIGHT: i32 = 160;
-pub const LANDING_TEXTURE_WIDTH: i32 = 240;
-pub const MUTE_ICON_SIZE: f32 = 16.0;
-pub const MUTE_ICON_MARGIN: f32 = 0.0;
-
-pub const GAME_DURATION_MS: u32 = 15_000;
-pub const NB_GREENS: i32 = 15;
-pub const INITIAL_SPAWN: u32 = 8;
-pub const MAX_ENTITIES: u32 = 40;
-pub const BASE_SPEED: f32 = 24.0;
-pub const SPEED_COLLIDE_MULT: f32 = 2.0;
-pub const ENTITY_RADIUS: f32 = 4.8;
-pub const INITIAL_SPAWN_SPREAD_MS: f32 = 1_000.0;
-pub const SPAWN_RATE_MIN_MS: u32 = 500;
-pub const SPAWN_RATE_MAX_MS: u32 = 1_200;
-pub const DAMPING_FACTOR: f32 = 0.98;
-pub const JITTER_STRENGTH: f32 = 0.12;
-pub const MIN_SPEED: f32 = 2.6;
-pub const MAX_SPEED: f32 = 64.0;
-pub const SPAWN_PADDING: f32 = 1.0;
-pub const ENTITY_SCALE_FACTOR: f32 = 1.5;
-pub const RED_COUNTDOWN_MS: f32 = 3_000.0;
-pub const ROGUE_DURATION_MS: f32 = 3_000.0;
-pub const PACMAN_CHASE_PROB: f64 = 0.30;
-pub const PACMAN_CHASE_SPEED_MULT: f32 = 1.5;
-
-pub const BASELINE_RATIOS: [f32; 4] = {
- let mut b = [0.0f32; 4];
- b[EntityColor::Red as usize] = 0.10;
- b[EntityColor::Green as usize] = 0.60;
- b[EntityColor::Bleu as usize] = 0.10;
- b[EntityColor::Yellow as usize] = 0.20;
- b
-};
-
-pub const fn get_baseline_ratio(color: EntityColor, difficulty: f32) -> f32 {
- const SHIFT_PER_LEVEL: f32 = 0.15;
- const GREEN_FLOOR: f32 = 0.05;
-
- let green_base = BASELINE_RATIOS[EntityColor::Green as usize];
- let red_base = BASELINE_RATIOS[EntityColor::Red as usize];
-
- // how much we can actually shift without breaching the green floor.
- let max_shift = green_base - GREEN_FLOOR;
- let shift = (SHIFT_PER_LEVEL * (difficulty - 1.0).max(0.0)).min(max_shift);
-
- match color {
- EntityColor::Green => green_base - shift,
- EntityColor::Red => red_base + shift,
- // Bleu and Yellow stay fixed; only the Green/Red tension is modulated.
- c => BASELINE_RATIOS[c as usize],
- }
-}
-
-// UI constants
-pub const TITLE_HEADING_TEXT_COLOR: glam::Vec3 = glam::Vec3::new(0.105, 0.262, 0.196);
-pub const TITLE_DESCRIPTION_TEXT_COLOR: glam::Vec3 = glam::Vec3::new(0.184, 0.321, 0.2);
-pub const START_BUTTON_TEXT_COLOR: glam::Vec3 = glam::Vec3::new(1.0, 1.0, 1.0);
-pub const TITLE_START_BUTTON_LABEL: &str = "START";
-pub fn title_score_goal() -> String {
- format!("Score {} or more to win", NB_GREENS)
-}
-pub const TITLE_CLICK_START_HINT: &str = "Click START to begin the 15s* round.";
-//pub const TITLE_ROUND_WARNING: &str = "(*in this computer seconds might be longer, TBI)";
-pub const TITLE_SCORING_HINT: &str = "Green gives +1, all other colors give -1.";
-pub const TITLE_HINT: &str = "hint: booting the computer is optional.";
-
-pub const HUD_TEXT_COLOR: glam::Vec3 = glam::Vec3::new(0.2, 0.2, 0.2);
-pub const HUD_SCORE_LABEL_PREFIX: &str = "Score: ";
-pub const HUD_TIME_LABEL_PREFIX: &str = "Time: ";
-pub const HUD_TIME_LABEL_SUFFIX: &str = "s";
-pub const HUD_FPS_LABEL_PREFIX: &str = "FPS: ";
-pub const HUD_SCORE_POSITION: glam::Vec2 = glam::Vec2::new(2.6, 6.6);
-pub const HUD_FPS_POSITION: glam::Vec2 = glam::Vec2::new(2.6, 20.0);
-pub const RESULT_DISPLAY_DELAY_MS: f64 = 2000.0;
-#[wasm_bindgen]
-pub fn get_result_display_delay_ms() -> f64 {
- RESULT_DISPLAY_DELAY_MS
-}
-
-// UI rendering colors and uniforms
-pub const RED_COUNTDOWN_BAR_COLOR: glam::Vec4 = glam::Vec4::new(1.0, 0.266, 0.266, 1.0);
-pub const BUTTON_FILL_COLOR: glam::Vec4 = glam::Vec4::new(0.0, 0.0, 1.0, 0.9);
-pub const GAME_OVER_OVERLAY_COLOR: glam::Vec4 = glam::Vec4::new(1.0, 1.0, 1.0, 0.82);
-pub const UI_UNIFORM_COLOR_NAME: &str = "color";
-pub const UI_UNIFORM_OPACITY_NAME: &str = "opacity";
-pub const FLASH_SCREEN_BASE_COLOR: glam::Vec3 = glam::Vec3::new(1.0, 0.0, 0.0);
-pub const GAME_OVER_TEXT_COLOR: glam::Vec3 = glam::Vec3::new(0.105, 0.262, 0.196);
-pub const GAME_OVER_TITLE_TEXT: &str = "Game Over";
-pub const GAME_OVER_RESULT_PREFIX: &str = "Result: ";
-
-// computer
-pub const COMPUTER_WIDTH: f32 = 42.6;
-pub const COMPUTER_HEIGHT: f32 = 42.6;
-pub const TRIGGER_OFFSET_X: f32 = 9.8;
-pub const TRIGGER_OFFSET_Y: f32 = 4.0;
-pub const TRIGGER_WIDTH: f32 = 8.0;
-pub const TRIGGER_HEIGHT: f32 = 6.1;
-pub const POWER_BUTTON_OFFSET_X: f32 = 28.8;
-pub const POWER_BUTTON_OFFSET_Y: f32 = 2.6;
-pub const POWER_BUTTON_WIDTH: f32 = 9.6;
-pub const POWER_BUTTON_HEIGHT: f32 = 5.8;
-
-// Subgame
diff --git a/2026/games_submissions/rpc2dot0/src/disquette.rs b/2026/games_submissions/rpc2dot0/src/disquette.rs
deleted file mode 100644
index 7940d17..0000000
--- a/2026/games_submissions/rpc2dot0/src/disquette.rs
+++ /dev/null
@@ -1,184 +0,0 @@
-use crate::math::{ContainsPoint, Rectangle};
-use crate::random::RandomState;
-use teleia::state;
-
-#[derive(Debug, Clone, Copy, PartialEq, Eq)]
-pub enum DisquettePhase {
- Free,
- Inserted,
-}
-
-impl From<DisquettePhase> for &'static str {
- fn from(value: DisquettePhase) -> Self {
- match value {
- DisquettePhase::Free => "Free",
- DisquettePhase::Inserted => "Inserted",
- }
- }
-}
-
-#[derive(Debug, Clone, Copy)]
-pub struct Disquette {
- pub coord: glam::Vec2,
- pub vel: glam::Vec2,
- pub size: f32,
- pub phase: DisquettePhase,
-}
-
-impl Disquette {
- pub fn new(
- logical_width: f32,
- logical_height: f32,
- rng: &mut RandomState,
- computer_hitzone: Option<Rectangle>,
- ) -> Self {
- const SIZE: f32 = 6.4;
- const HALF: f32 = SIZE / 2.0;
- log::info!(
- "eatyourgreens:: Disquette new at ({}, {})",
- logical_width,
- logical_height
- );
-
- let x = rng.next_range(HALF, logical_width - HALF);
- let y = rng.next_range(HALF, logical_height - HALF);
- let mut coord = glam::Vec2::new(x, y);
-
- // prevent spawning inside the computer hitzone
- // this is a bit stupidos, but it works for now.
- // @TODO: find a better way to do this. like using rng api (random.rs) where you can
- // specify the excluded area, or something less retarded.
- if let Some(hitzone) = computer_hitzone {
- // wasting few cpu cycles doesn't hurt anybody
- while hitzone.contains(coord) {
- coord.x = rng.next_range(HALF, logical_width - HALF);
- coord.y = rng.next_range(HALF, logical_height - HALF);
- }
- }
-
- Self {
- coord,
- vel: glam::Vec2::new(
- // -/+ 21.3 as value cause it works, yeah idc
- if rng.next_bool(0.5) { 21.3 } else { -21.3 },
- if rng.next_bool(0.5) { 21.3 } else { -21.3 },
- ),
- size: SIZE,
- phase: DisquettePhase::Free,
- }
- }
-
- pub fn is_inserted(&self) -> bool {
- self.phase == DisquettePhase::Inserted
- }
-
- pub fn update(
- &mut self,
- width: f32,
- height: f32,
- keys: &state::Keys,
- delta_ms: f32,
- difficulty: f32,
- computer_hitzone: Option<Rectangle>,
- ) {
- let dt = delta_ms / 1000.0;
- let impulse = 106.7 * difficulty;
-
- let driven_by_user = keys.left() || keys.right() || keys.up() || keys.down();
-
- if keys.left() {
- self.vel.x -= impulse * dt;
- }
- if keys.right() {
- self.vel.x += impulse * dt;
- }
- if keys.up() {
- self.vel.y -= impulse * dt;
- }
- if keys.down() {
- self.vel.y += impulse * dt;
- }
-
- // speed limiting
- // @TODO : hum value below was adjusted manualy it might
- // be wrong with game rendering speed? ??
- let max_speed = 53.3 * difficulty;
- let speed = self.vel.length();
- if speed > max_speed {
- self.vel = self.vel.normalize() * max_speed;
- }
-
- self.coord += self.vel * dt;
-
- let half = self.size / 2.0;
- let min_bounds = glam::Vec2::splat(half);
- let max_bounds = glam::Vec2::new(width - half, height - half);
-
- // boundary collision and bouncing
- // left edge : clamp position and ensure it moves right
- if self.coord.x < min_bounds.x {
- self.coord.x = min_bounds.x;
- // .abs() guarantees velocity is positive (moving right)
- self.vel.x = self.vel.x.abs();
- }
- // right edge : clamp position and ensure it moves left
- else if self.coord.x > max_bounds.x {
- self.coord.x = max_bounds.x;
- // -.abs() guarantees velocity is negative (moving left)
- self.vel.x = -self.vel.x.abs();
- }
-
- // top and bottom edges
- if self.coord.y < min_bounds.y {
- self.coord.y = min_bounds.y;
- // .abs() guarantees velocity is positive (moving down)
- self.vel.y = self.vel.y.abs();
- } else if self.coord.y > max_bounds.y {
- self.coord.y = max_bounds.y;
- // -.abs() guarantees velocity is negative (moving up)
- self.vel.y = -self.vel.y.abs();
- }
-
- // bounce off computer hitzone unless user is actively driving it in
- if !driven_by_user && let Some(hitzone) = computer_hitzone {
- let prev_pos = self.coord - self.vel * dt;
-
- if hitzone.contains(self.coord) {
- let was_outside = !hitzone.contains(prev_pos);
- if was_outside {
- let was_left = prev_pos.x < hitzone.min.x;
- let was_right = prev_pos.x > hitzone.max.x;
- let was_top = prev_pos.y < hitzone.min.y;
- let was_bottom = prev_pos.y > hitzone.max.y;
-
- if was_left || was_right {
- // reverse horizontal velocity to bounce off
- self.vel.x = -self.vel.x;
- // +/- 0.1 is a tiny extra push away from the hitzone.
- // this prevent the disquette from getting stuck exactly on the boundary
- // and repeatedly triggers collisions
- // this bug took 2h from my life, fuck you disquette, you floppy disk :/.
- self.coord.x = if was_left {
- hitzone.min.x - 0.1
- } else {
- hitzone.max.x + 0.1
- };
- }
- if was_top || was_bottom {
- // reverse vertical velocity to bounce off
- self.vel.y = -self.vel.y;
- // +/- 0.1 adds a tiny gap to safely escape the hitzone
- self.coord.y = if was_top {
- hitzone.min.y - 0.1
- } else {
- hitzone.max.y + 0.1
- };
- }
- }
- }
- }
- }
-}
-
-// the hours spent on this zone/bouncing detection bs, I should've done something more productive, but
-// whatever.
diff --git a/2026/games_submissions/rpc2dot0/src/effects.rs b/2026/games_submissions/rpc2dot0/src/effects.rs
deleted file mode 100644
index 02b33ef..0000000
--- a/2026/games_submissions/rpc2dot0/src/effects.rs
+++ /dev/null
@@ -1,58 +0,0 @@
-use crate::color::EntityColor;
-use crate::constants::*;
-
-#[derive(Debug, Clone)]
-pub struct PacmanChase {
- pub speed: f32,
-}
-
-impl PacmanChase {
- pub fn new(speed: f32) -> Self {
- Self { speed }
- }
-}
-
-impl Default for PacmanChase {
- fn default() -> Self {
- Self::new(BASE_SPEED)
- }
-}
-#[derive(Debug, Clone)]
-pub struct Rogue {
- pub until_ms: f32,
- pub hover_color: EntityColor,
-}
-
-impl Rogue {
- pub fn new(until_ms: f32, hover_color: EntityColor) -> Self {
- Self {
- until_ms,
- hover_color,
- }
- }
-}
-
-impl Default for Rogue {
- fn default() -> Self {
- Self::new(ROGUE_DURATION_MS, EntityColor::Yellow)
- }
-}
-
-pub struct Explosion {
- pub x: f32,
- pub y: f32,
- pub age_ms: f32,
- pub duration_ms: f32,
- pub radius: f32,
-}
-impl Explosion {
- pub fn new(x: f32, y: f32) -> Self {
- Self {
- x,
- y,
- age_ms: 0.0,
- duration_ms: 400.0,
- radius: 8.0,
- }
- }
-}
diff --git a/2026/games_submissions/rpc2dot0/src/entity.rs b/2026/games_submissions/rpc2dot0/src/entity.rs
deleted file mode 100644
index 3b4200f..0000000
--- a/2026/games_submissions/rpc2dot0/src/entity.rs
+++ /dev/null
@@ -1,90 +0,0 @@
-use crate::color::EntityColor;
-use crate::constants::{DAMPING_FACTOR, MIN_SPEED};
-use crate::effects::{PacmanChase, Rogue};
-use crate::math::{BoundingCircle, Vec2};
-
-pub trait Update {
- fn update(&mut self, delta_ms: f32);
-}
-
-#[derive(Debug, Clone)]
-pub struct Entity {
- pub _id: u32,
- pub pos: Vec2,
- pub vel: Vec2,
- pub speed: f32,
- pub color: EntityColor,
- pub radius: f32,
- pub alive: bool,
- pub spawn_time_ms: Option<f32>,
- pub rogue: Option<Rogue>,
- pub pacman_chase: Option<PacmanChase>,
-}
-
-impl Entity {
- pub fn new(id: u32, pos: Vec2, vel: Vec2, color: EntityColor, speed: f32, radius: f32) -> Self {
- let mut entity = Self {
- _id: id,
- pos,
- vel,
- speed,
- color,
- radius,
- alive: true,
- spawn_time_ms: None,
- rogue: None,
- pacman_chase: None,
- };
- entity.normalize_velocity();
- entity
- }
-
- pub fn normalize_velocity(&mut self) {
- let length = self.vel.length();
- if length <= f32::EPSILON {
- self.vel = Vec2::new(1.0, 0.0);
- } else {
- self.vel = self.vel / length * self.speed;
- }
- }
-
- pub fn apply_jitter(&mut self, jitter: Vec2) {
- self.vel += jitter;
- self.normalize_velocity();
- }
-
- pub fn dampen_speed(&mut self, max_speed: f32) {
- self.speed = (self.speed * DAMPING_FACTOR).clamp(MIN_SPEED, max_speed);
- self.normalize_velocity();
- }
-
- pub fn bounds_bounce(&mut self, width: f32, height: f32) {
- let min_bounds = Vec2::splat(self.radius);
- let max_bounds = Vec2::new(width, height) - min_bounds;
-
- let hit_min = self.pos.cmple(min_bounds);
- let hit_max = self.pos.cmpge(max_bounds);
-
- self.pos = self.pos.clamp(min_bounds, max_bounds);
-
- self.vel = Vec2::select(hit_min, self.vel.abs(), self.vel);
- self.vel = Vec2::select(hit_max, -self.vel.abs(), self.vel);
- }
-}
-
-impl Update for Entity {
- fn update(&mut self, delta_ms: f32) {
- let dt = delta_ms / 1000.0;
- self.pos += self.vel * dt;
- }
-}
-
-impl BoundingCircle for Entity {
- fn center(&self) -> Vec2 {
- self.pos
- }
-
- fn radius(&self) -> f32 {
- self.radius
- }
-}
diff --git a/2026/games_submissions/rpc2dot0/src/errors.rs b/2026/games_submissions/rpc2dot0/src/errors.rs
deleted file mode 100644
index 71a67cf..0000000
--- a/2026/games_submissions/rpc2dot0/src/errors.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-use crate::color::EntityColor;
-
-#[derive(Debug, Copy, Clone, PartialEq, Eq)]
-pub enum ClickOutcome {
- Hit(EntityColor),
- Miss,
-}
diff --git a/2026/games_submissions/rpc2dot0/src/game.rs b/2026/games_submissions/rpc2dot0/src/game.rs
deleted file mode 100644
index 7650e72..0000000
--- a/2026/games_submissions/rpc2dot0/src/game.rs
+++ /dev/null
@@ -1,869 +0,0 @@
-use std::collections::HashMap;
-
-use teleia::renderer::UberFlags;
-use teleia::*;
-
-use crate::assets;
-use crate::assets::AUDIO_ASSETS;
-use crate::color::{ColorExt, EntityColor};
-use crate::computer::os::Os;
-use crate::computer::*;
-use crate::constants::*;
-use crate::disquette::*;
-use crate::effects::*;
-use crate::errors::*;
-use crate::math::*;
-use crate::message::Message;
-use crate::state::{GamePhase, GameState};
-
-pub struct Game {
- renderer: renderer::Renderer<assets::Assets>,
- state: GameState,
- mouse: glam::Vec2,
- explosions: Vec<Explosion>,
- greens_wiped_flash: f32,
- computer: Computer,
- start_button_rect: Option<Rectangle>,
- is_muted: bool,
- mute_button_rect: Option<Rectangle>,
- is_embedded: bool,
- last_time_ms: Option<f64>,
- finish_time_ms: Option<f64>,
- done_sent: bool,
-}
-
-impl Game {
- pub fn new(ctx: &context::Context, is_embedded: bool) -> Self {
- log::info!("eatyourgreens:: entering new Game");
- let mut state = GameState::new();
- let computer = Computer::new(
- ctx.render_width,
- ctx.render_height,
- &mut state.rng,
- state.difficulty,
- );
- Self {
- renderer: renderer::Renderer::new(ctx, assets::Assets::new),
- state,
- mouse: glam::Vec2::ZERO,
- explosions: Vec::new(),
- greens_wiped_flash: 0.0,
- computer,
- start_button_rect: None,
- is_muted: false,
- mute_button_rect: None,
- is_embedded,
- last_time_ms: None,
- finish_time_ms: None,
- done_sent: false,
- }
- }
-
- pub fn set_difficulty(&mut self, difficulty: f32) {
- log::info!("eatyourgreens:: set_difficulty: {}", difficulty);
- self.state.set_difficulty(difficulty);
- }
-
- pub fn receive_op(&mut self, ctx: &context::Context, st: &mut state::State, op: String) {
- log::info!(
- "eatyourgreens:: receive op: {} (phase: {:?})",
- op,
- self.state.phase()
- );
- match self.state.phase() {
- GamePhase::Waiting | GamePhase::Finished => {
- if self.is_embedded && op == "start" {
- self.reset_round(ctx, st);
- const VERB: &str = "eat your greens";
- self.send_op("started", Some(VERB), None, None, None);
- } else {
- log::warn!("eatyourgreens:: received unexpected op: {} (waiting) ", op);
- }
- }
- GamePhase::Computer(computer_phase) => {
- let currentop = op.as_str();
- match computer_phase {
- ComputerPhase::Booting => {
- if currentop == "video_finished" {
- self.state.set_phase(GamePhase::Computer(ComputerPhase::On));
- self.computer.on(ctx);
- } else {
- log::warn!(
- "eatyourgreens:: received unexpected op: {}, Phase {:?} (Computer)",
- op,
- computer_phase
- );
- }
- }
- ComputerPhase::On => {
- if currentop == "computing" {
- // nothing to do in here
- // we wait for os-micro-game to send shutdown
- log::info!("eatyourgreens:: computer computing. do nothing.");
- } else if currentop == "shutdown" {
- log::info!(
- "eatyourgreens:: computer shutdown. Transition to main game."
- );
- self.computer.shutdown();
- self.state.set_phase(GamePhase::Playing);
- } else {
- log::warn!(
- "eatyourgreens:: received unexpected op: {}, Phase {:?} (Computer)",
- op,
- computer_phase
- );
- }
- }
-
- _ => {
- // we shouldn't be receiving events while computer is off or shutdown
- log::warn!(
- "eatyourgreens:: received unexpected op: {}, Phase {:?} (Computer)",
- op,
- computer_phase
- );
- }
- }
- }
- _ => {
- log::warn!(
- "eatyourgreens:: received unexpected op: {} for phase: {:?}",
- op,
- self.state.phase()
- );
- }
- }
- }
-
- fn reset_round(&mut self, ctx: &context::Context, st: &mut state::State) {
- log::info!("eatyourgreens:: reset_round");
- self.state.start_round();
-
- let computer = Computer::new(
- ctx.render_width,
- ctx.render_height,
- &mut self.state.rng,
- self.state.difficulty,
- );
-
- self.computer = computer;
- self.explosions.clear();
- self.greens_wiped_flash = 0.0;
- if self.is_muted {
- st.audio.stop_music();
- }
- self.last_time_ms = None;
- self.finish_time_ms = None;
- self.done_sent = false;
- }
-
- fn push_explosion(&mut self, x: f32, y: f32) {
- self.explosions.push(Explosion::new(x, y));
- }
-
- fn update_explosions(&mut self, delta_ms: f32) {
- for exp in &mut self.explosions {
- exp.age_ms += delta_ms;
- }
- self.explosions.retain(|e| e.age_ms < e.duration_ms);
- }
-
- fn handle_state_event(&mut self, event: String, st: &mut state::State) {
- log::info!("eatyourgreens:: handle_state_event: {}", event);
- if let Some(coords) = event.strip_prefix("explode:") {
- if !self.is_muted {
- st.audio.play_sfx("explosion");
- }
- let (x, y): (f32, f32) = parse_coords(coords);
- self.push_explosion(x, y);
- self.greens_wiped_flash = 300.0;
- return;
- }
-
- if let Some(coords) = event.strip_prefix("click_red:") {
- if !self.is_muted {
- st.audio.play_sfx("explosion");
- }
- let (x, y) = parse_coords(coords);
- self.push_explosion(x, y);
- return;
- }
- }
-
- fn render_title(&mut self, ctx: &context::Context, st: &mut state::State) {
- self.renderer
- .bind_uber_2d(ctx, st, UberFlags::TEXTURE_COLOR | UberFlags::SPRITE);
- self.renderer
- .bind_texture(ctx, st, assets::Texture::Landing);
- self.renderer.set_texture_offset(
- ctx,
- st,
- 1,
- 1,
- LANDING_TEXTURE_WIDTH,
- LANDING_TEXTURE_HEIGHT,
- );
- self.renderer
- .set_position_2d(ctx, st, glam::Vec2::ZERO, st.render_dims);
- self.renderer.set_f32(ctx, st, UI_UNIFORM_OPACITY_NAME, 0.5);
- self.renderer.render_square(ctx, st);
-
- let center_x: f32 = ctx.render_width / 2.0;
- let mut y: f32 = ctx.render_height * 0.3;
- let line_height: f32 = self.renderer.font_char_height(st) + 1.0;
-
- self.draw_text_centered(
- ctx,
- st,
- center_x,
- y,
- TITLE_HEADING_TEXT_COLOR,
- &title_score_goal(),
- );
-
- y += line_height;
- self.draw_text_centered(
- ctx,
- st,
- center_x,
- y,
- TITLE_HEADING_TEXT_COLOR,
- TITLE_CLICK_START_HINT,
- );
-
- y += line_height * 2.0;
- if !self.is_embedded {
- self.draw_button_centered(
- ctx,
- st,
- center_x,
- y,
- START_BUTTON_TEXT_COLOR,
- TITLE_START_BUTTON_LABEL,
- );
- } else {
- self.start_button_rect = None;
- }
-
- y += line_height * 3.0;
- self.draw_text_centered(
- ctx,
- st,
- center_x,
- y,
- TITLE_DESCRIPTION_TEXT_COLOR,
- TITLE_SCORING_HINT,
- );
-
- y += line_height;
- self.draw_text_centered(
- ctx,
- st,
- center_x,
- y,
- TITLE_DESCRIPTION_TEXT_COLOR,
- TITLE_HINT,
- );
-
- self.draw_mute_icon(ctx, st);
- }
-
- fn render_background(&mut self, ctx: &context::Context, st: &mut state::State) {
- ctx.clear_color(glam::Vec4::ZERO);
- ctx.clear();
- self.renderer.texture_screen(
- ctx,
- st,
- assets::Texture::BackgroundMain,
- glam::Vec2::ZERO,
- glam::Vec2::new(ctx.render_width, ctx.render_height),
- );
- }
-
- fn render_entities(&mut self, ctx: &context::Context, st: &mut state::State) {
- let mapped_mouse = self.map_mouse_to_render(ctx, st);
- let elapsed_ms = self.state.elapsed_ms();
- for entity in self.state.entities() {
- if !entity.alive {
- continue;
- }
-
- let size: f32 = entity.radius * 2.0;
- let pos: glam::Vec2 = glam::Vec2::new(entity.pos.x, entity.pos.y);
- let dims: glam::Vec2 = glam::Vec2::new(size, size);
- let topleft: glam::Vec2 = pos - dims / 2.0;
-
- let mut display_color: EntityColor = entity.color;
- if display_color == EntityColor::Green
- && let Some(rogue) = &entity.rogue
- && elapsed_ms < rogue.until_ms
- && entity.pos.distance_squared(mapped_mouse) <= entity.radius * entity.radius
- {
- display_color = rogue.hover_color;
- }
-
- let texture = if entity.color == EntityColor::Bleu && entity.pacman_chase.is_some() {
- assets::Texture::MrbleuLurking
- } else {
- display_color.texture()
- };
-
- self.renderer
- .texture_screen(ctx, st, texture, topleft, dims);
- }
- }
-
- fn render_red_countdowns(&mut self, ctx: &context::Context, st: &mut state::State) {
- self.renderer.bind_uber_2d(ctx, st, UberFlags::empty());
- self.renderer
- .set_vec4(ctx, st, UI_UNIFORM_COLOR_NAME, RED_COUNTDOWN_BAR_COLOR);
-
- for entity in self.state.entities() {
- if !entity.alive || entity.color != EntityColor::Red {
- continue;
- }
-
- if let Some(spawn_time) = entity.spawn_time_ms {
- let elapsed = self.state.elapsed_ms() - spawn_time;
- if elapsed < RED_COUNTDOWN_MS {
- let remaining = RED_COUNTDOWN_MS - elapsed;
- let fraction = remaining / RED_COUNTDOWN_MS;
- let bar_width = 10.6;
- let bar_height = 1.6;
- let pos = glam::Vec2::new(
- entity.pos.x - bar_width / 2.0,
- entity.pos.y - entity.radius - 3.2,
- );
-
- self.renderer.set_position_2d(
- ctx,
- st,
- pos,
- glam::Vec2::new(bar_width * fraction, bar_height),
- );
- self.renderer.render_square(ctx, st);
- }
- }
- }
- }
-
- fn render_explosions(&mut self, ctx: &context::Context, st: &mut state::State) {
- self.renderer.bind_uber_2d(ctx, st, UberFlags::empty());
-
- for exp in &self.explosions {
- let t = exp.age_ms / exp.duration_ms;
- let alpha = 1.0 - t;
- let r = exp.radius * (0.5 + t * 0.5);
- let color = glam::Vec4::new(1.0, (200.0 - t * 200.0) / 255.0, 0.0, alpha);
- self.renderer.set_vec4(ctx, st, "color", color);
-
- let size = r * 2.0;
- let pos = glam::Vec2::new(exp.x - r, exp.y - r);
- self.renderer
- .set_position_2d(ctx, st, pos, glam::Vec2::new(size, size));
- self.renderer.render_square(ctx, st);
- }
- }
-
- fn render_flash(&mut self, ctx: &context::Context, st: &mut state::State) {
- if self.greens_wiped_flash > 0.0 {
- let flash_alpha = (self.greens_wiped_flash / 300.0) * 0.3;
- let flash_color = glam::Vec4::new(
- FLASH_SCREEN_BASE_COLOR.x,
- FLASH_SCREEN_BASE_COLOR.y,
- FLASH_SCREEN_BASE_COLOR.z,
- flash_alpha,
- );
- self.renderer.color_screen(
- ctx,
- st,
- flash_color,
- glam::Vec2::ZERO,
- glam::Vec2::new(ctx.render_width, ctx.render_height),
- );
- }
- }
-
- fn render_computer(&mut self, ctx: &context::Context, st: &mut state::State) {
- let dims = glam::Vec2::new(COMPUTER_WIDTH, COMPUTER_HEIGHT);
- let topleft = self.computer.coord - dims / 2.0;
- self.renderer
- .texture_screen(ctx, st, assets::Texture::Computer, topleft, dims);
- }
-
- fn render_disquette(&mut self, ctx: &context::Context, st: &mut state::State) {
- if self.computer.already_used() || self.computer.disquette_inserted() {
- return;
- }
-
- let size = self.computer.disquette.size;
- let dims = glam::Vec2::splat(size);
- let topleft = self.computer.disquette.coord - dims / 2.0;
- self.renderer
- .texture_screen(ctx, st, assets::Texture::Disquette, topleft, dims);
- }
-
- fn render_hud(&mut self, ctx: &context::Context, st: &mut state::State) {
- self.renderer.text_colored_screen(
- ctx,
- st,
- HUD_SCORE_POSITION,
- HUD_TEXT_COLOR,
- &format!(
- "{}{}",
- HUD_SCORE_LABEL_PREFIX,
- format_args!("{}/{}", self.state.consumer_score(), NB_GREENS)
- ),
- );
-
- let remaining_secs = (self.state.remaining_ms() / 1000.0).ceil() as i32;
- let time_str = format!(
- "{}{}{}",
- HUD_TIME_LABEL_PREFIX, remaining_secs, HUD_TIME_LABEL_SUFFIX
- );
- let time_width = self.renderer.font_char_width(st) * time_str.len() as f32;
-
- self.renderer.text_colored_screen(
- ctx,
- st,
- glam::Vec2::new(ctx.render_width - time_width - 2.6, 6.6),
- HUD_TEXT_COLOR,
- &time_str,
- );
-
- self.renderer.text_colored_screen(
- ctx,
- st,
- HUD_FPS_POSITION,
- HUD_TEXT_COLOR,
- &format!("{}{}", HUD_FPS_LABEL_PREFIX, st.fps),
- );
- }
-
- fn render_game_over(&mut self, ctx: &context::Context, st: &mut state::State) {
- st.audio.stop_music();
- self.renderer.color_screen(
- ctx,
- st,
- GAME_OVER_OVERLAY_COLOR,
- glam::Vec2::ZERO,
- glam::Vec2::new(ctx.render_width, ctx.render_height),
- );
-
- self.draw_text_centered(
- ctx,
- st,
- ctx.render_width / 2.0,
- ctx.render_height / 2.0 - 8.0,
- GAME_OVER_TEXT_COLOR,
- GAME_OVER_TITLE_TEXT,
- );
-
- let status_text: &str = self.state.round_result().into();
-
- self.draw_text_centered(
- ctx,
- st,
- ctx.render_width / 2.0,
- ctx.render_height / 2.0 + 5.3,
- GAME_OVER_TEXT_COLOR,
- &format!("{}{}", GAME_OVER_RESULT_PREFIX, status_text),
- );
- self.draw_text_centered(
- ctx,
- st,
- ctx.render_width / 2.0,
- ctx.render_height / 2.0 + 14.6,
- GAME_OVER_TEXT_COLOR,
- &format!(
- "{}{}",
- HUD_SCORE_LABEL_PREFIX,
- format_args!(
- "{}/{}",
- self.state.consumer_score(),
- self.state.required_greens()
- )
- ),
- );
- }
-}
-
-impl teleia::state::Game for Game {
- fn initialize(&mut self, _ctx: &context::Context, st: &mut state::State) -> Erm<()> {
- log::info!("eatyourgreens:: entering initialize");
-
- st.keybindings.insert(
- state::Keycode::new(winit::keyboard::KeyCode::ArrowUp),
- state::Key::Up,
- );
- st.keybindings.insert(
- state::Keycode::new(winit::keyboard::KeyCode::ArrowDown),
- state::Key::Down,
- );
- st.keybindings.insert(
- state::Keycode::new(winit::keyboard::KeyCode::ArrowLeft),
- state::Key::Left,
- );
- st.keybindings.insert(
- state::Keycode::new(winit::keyboard::KeyCode::ArrowRight),
- state::Key::Right,
- );
-
- log::info!("eatyourgreens:: exiting initialize");
- Ok(())
- }
-
- fn initialize_audio(
- &self,
- _ctx: &context::Context,
- _st: &state::State,
- actx: &audio::Context,
- ) -> HashMap<String, audio::Audio> {
- let mut map = HashMap::new();
- for (name, data) in AUDIO_ASSETS {
- map.insert(name.to_string(), audio::Audio::new(actx, data));
- }
- map
- }
-
- fn mouse_move(
- &mut self,
- _ctx: &context::Context,
- _st: &mut state::State,
- x: i32,
- y: i32,
- ) -> Erm<()> {
- self.mouse = glam::Vec2::new(x as f32, y as f32);
- Ok(())
- }
-
- fn mouse_press(&mut self, ctx: &context::Context, st: &mut state::State) -> Erm<()> {
- let mapped_mouse = self.map_mouse_to_render(ctx, st);
- /*log::info!(
- "eatyourgreens:: mouse at ({:?}), mapped to ({:?})",
- self.mouse,
- mapped_mouse
- );*/
-
- if !self.computer.already_used()
- && self.computer.disquette_inserted()
- && let Some(action) = self
- .computer
- .check_power_button(mapped_mouse, self.state.difficulty)
- {
- log::info!("eatyourgreens:: clicked power button {:?}", action);
- if action == PowerButtonAction::On {
- self.computer.boot();
- self.state
- .set_phase(GamePhase::Computer(ComputerPhase::Booting));
- Os::boot(&mut self.state.rng);
- //log::info!("eatyourgreens:: blah2");
- }
- }
-
- if let Some(rect) = self.mute_button_rect
- && rect.contains(mapped_mouse)
- {
- self.is_muted = !self.is_muted;
- if self.is_muted {
- st.audio.stop_music();
- } else {
- //play something
- }
- return Ok(());
- }
- match self.state.phase() {
- GamePhase::Waiting => {
- if let Some(rect) = self.start_button_rect
- && rect.contains(mapped_mouse)
- {
- self.reset_round(ctx, st);
- }
- }
- GamePhase::Playing => {
- if let Some(ClickOutcome::Hit(color)) =
- self.state.click_at(mapped_mouse.x, mapped_mouse.y)
- {
- log::info!("eatyourgreens:: Hit entity of color {:?}", color);
- match color {
- EntityColor::Green => {
- if !self.is_muted {
- st.audio.play_sfx("crunch");
- }
- }
- _ => {
- if !self.is_muted {
- st.audio.play_sfx("fart");
- }
- }
- }
- }
- }
- GamePhase::Finished => {
- if !self.is_embedded {
- self.reset_round(ctx, st);
- if !self.is_muted {
- st.audio.stop_music();
- }
- }
- }
- GamePhase::Computer(_) => {
- //nothing to do here we yielded to DA COMPUTTTA
- }
- #[allow(unreachable_patterns)]
- _ => unreachable!(),
- }
-
- Ok(())
- }
-
- fn update(&mut self, ctx: &context::Context, st: &mut state::State) -> Erm<()> {
- let now_ms = teleia::state::now(ctx) * 1000.0;
- let last_time = self.last_time_ms.unwrap_or(now_ms);
- self.last_time_ms = Some(now_ms);
-
- if let GamePhase::Computer(ComputerPhase::On) = self.state.phase() {
- // @TODO: play OS microgame here. For now, simulate its end immediately.
- self.receive_op(ctx, st, "shutdown".to_string());
- }
-
- if self.state.phase() != GamePhase::Playing && self.state.phase() != GamePhase::Finished {
- return Ok(());
- }
-
- if self.state.phase() == GamePhase::Playing {
- // cap maximum time jump to 250ms,
- // sometime the game lags when embedded in a Wcolonq wrapper, not sure why
- // probbaly these copypasta all over the place make's it buggy
- let real_delta = (now_ms - last_time).clamp(0.0, 250.0);
- let dt = real_delta as f32;
-
- let disquette_pos = if !self.computer.disquette.is_inserted() {
- Some(self.computer.disquette.coord)
- } else {
- None
- };
- self.state.update_entities(
- dt,
- ctx.render_width,
- ctx.render_height,
- self.computer.disquette.is_inserted(),
- disquette_pos,
- );
- self.state.advance_time(dt);
- self.update_explosions(dt);
-
- if self.greens_wiped_flash > 0.0 {
- self.greens_wiped_flash = (self.greens_wiped_flash - dt).max(0.0);
- }
-
- let events = self.state.drain_events();
- let mut disquette_consumed = false;
- for event in events {
- if event == "disquette_consumed" {
- disquette_consumed = true;
- } else {
- self.handle_state_event(event, st);
- }
- }
-
- if disquette_consumed {
- let hitzone = self.computer.hit_zone(self.state.difficulty);
- self.computer.disquette = crate::disquette::Disquette::new(
- ctx.render_width,
- ctx.render_height,
- &mut self.state.rng,
- Some(hitzone),
- );
- }
-
- if !self.computer.disquette.is_inserted() {
- let hitzone = self.computer.hit_zone(self.state.difficulty);
- self.computer.disquette.update(
- ctx.render_width,
- ctx.render_height,
- &st.keys,
- dt,
- self.state.difficulty,
- Some(hitzone),
- );
-
- if self
- .computer
- .contains_disquette(&self.computer.disquette, self.state.difficulty)
- {
- self.computer.disquette.phase = DisquettePhase::Inserted;
- }
- }
- }
-
- if self.state.phase() == GamePhase::Finished && self.is_embedded && !self.done_sent {
- let finish_at = *self.finish_time_ms.get_or_insert(now_ms);
-
- if now_ms - finish_at >= RESULT_DISPLAY_DELAY_MS {
- self.send_op(
- "done",
- None,
- Some(self.state.round_result().into()),
- Some(self.state.consumer_score()),
- None,
- );
- self.done_sent = true;
- }
- }
-
- Ok(())
- }
-
- fn render(&mut self, ctx: &context::Context, st: &mut state::State) -> Erm<()> {
- if self.state.phase() == GamePhase::Waiting {
- self.render_title(ctx, st);
- return Ok(());
- }
-
- self.render_background(ctx, st);
-
- self.draw_mute_icon(ctx, st);
- self.render_computer(ctx, st);
- self.render_entities(ctx, st);
- self.render_red_countdowns(ctx, st);
- self.render_explosions(ctx, st);
- self.render_flash(ctx, st);
- self.render_disquette(ctx, st);
-
- self.render_hud(ctx, st);
-
- if self.state.phase() == GamePhase::Finished {
- self.render_game_over(ctx, st);
- }
-
- Ok(())
- }
-}
-
-impl Game {
- fn draw_text_centered(
- &mut self,
- ctx: &context::Context,
- st: &mut state::State,
- center_x: f32,
- y: f32,
- color: glam::Vec3,
- text: &str,
- ) {
- let w = self.renderer.font_char_width(st) * text.len() as f32;
- let x = (center_x - w / 2.0).round();
- self.renderer
- .text_colored_screen(ctx, st, glam::Vec2::new(x, y), color, text);
- }
-
- fn draw_button_centered(
- &mut self,
- ctx: &context::Context,
- st: &mut state::State,
- center_x: f32,
- y: f32,
- color: glam::Vec3,
- text: &str,
- ) {
- let text_width = self.renderer.font_char_width(st) * text.len() as f32;
- let padding_x = 4.8;
- let padding_y = 3.2;
- let char_height = self.renderer.font_char_height(st);
- let height = char_height + padding_y * 2.0;
- let width = text_width + padding_x * 2.0;
- let x = (center_x - width / 2.0).round();
-
- let border_thickness = 1.0;
- let inner_color = BUTTON_FILL_COLOR;
-
- self.renderer.color_screen(
- ctx,
- st,
- inner_color,
- glam::Vec2::new(x + border_thickness, y + border_thickness),
- glam::Vec2::new(
- width - border_thickness * 2.0,
- height - border_thickness * 2.0,
- ),
- );
-
- self.draw_text_centered(
- ctx,
- st,
- center_x,
- y + (height - char_height) / 2.0,
- color,
- text,
- );
-
- self.start_button_rect = Some(Rectangle::from_xywh(x, y, width, height));
- }
-
- fn draw_mute_icon(&mut self, ctx: &context::Context, st: &mut state::State) {
- let tex = if self.is_muted {
- assets::Texture::Mute
- } else {
- assets::Texture::Unmute
- };
-
- let size = glam::Vec2::new(MUTE_ICON_SIZE, MUTE_ICON_SIZE);
- let topleft = glam::Vec2::new(
- MUTE_ICON_MARGIN,
- ctx.render_height - MUTE_ICON_SIZE - MUTE_ICON_MARGIN,
- );
- self.renderer.texture_screen(ctx, st, tex, topleft, size);
-
- self.mute_button_rect = Some(Rectangle::from_xywh(topleft.x, topleft.y, size.x, size.y));
- }
-
- // mapping of raw physical mouse coordinates to logical internal rendering coordinates.
- // 1) subtract screen offsets to adjust to window margins.
- // 2) scale the position by the ratio of the logical render resolution to the
- // physical screen dimensions.
- // 3) round and clamp the result point to guarantee it falls strictly within
- // the valid rendering bounds [0, render_width] and [0, render_height].
- fn map_mouse_to_render(&self, ctx: &context::Context, st: &state::State) -> glam::Vec2 {
- let x =
- ((self.mouse.x - st.screen.offsets.x) * ctx.render_width / st.screen.dims.x).round();
- let y =
- ((self.mouse.y - st.screen.offsets.y) * ctx.render_height / st.screen.dims.y).round();
- glam::Vec2::new(
- x.clamp(0.0, ctx.render_width),
- y.clamp(0.0, ctx.render_height),
- )
- }
-
- pub(crate) fn send_op(
- &self,
- op: &str,
- verb: Option<&str>,
- win: Option<bool>,
- score: Option<i32>,
- video_url: Option<String>,
- ) {
- // we send_op only if embedded
- if !self.is_embedded {
- return;
- }
- if let Some(window) = web_sys::window()
- && let Some(parent) = window.parent().ok().flatten()
- {
- log::info!(
- "eatyourgreens:: send op: {} with verb {:?} win {:?} score {:?}",
- op,
- verb,
- win,
- score
- );
- let msg = Message {
- op,
- verb,
- win,
- score,
- video_url,
- };
- Message::post(&parent, &msg);
- }
- }
-}
diff --git a/2026/games_submissions/rpc2dot0/src/lib.rs b/2026/games_submissions/rpc2dot0/src/lib.rs
deleted file mode 100644
index 31e4d1e..0000000
--- a/2026/games_submissions/rpc2dot0/src/lib.rs
+++ /dev/null
@@ -1,40 +0,0 @@
-use crate::constants::{HEIGHT, WIDTH};
-use wasm_bindgen::prelude::*;
-mod assets;
-pub(crate) mod collision;
-pub(crate) mod color;
-pub(crate) mod computer;
-pub(crate) mod constants;
-pub(crate) mod disquette;
-pub(crate) mod effects;
-pub(crate) mod entity;
-pub(crate) mod errors;
-mod game;
-pub(crate) mod math;
-pub(crate) mod message;
-pub(crate) mod random;
-pub(crate) mod state;
-
-#[wasm_bindgen]
-pub fn main_js(is_embedded: bool) {
- teleia::run(
- WIDTH,
- HEIGHT,
- teleia::Options::FULLSCREEN_MOUSE,
- move |ctx| {
- let game = game::Game::new(ctx, is_embedded);
- game.send_op("ready", None, None, None, None);
- game
- },
- );
-}
-
-#[wasm_bindgen]
-pub fn set_difficulty_js(difficulty: f32) {
- teleia::contextualize(|_ctx, _st, game: &mut game::Game| game.set_difficulty(difficulty))
-}
-
-#[wasm_bindgen]
-pub fn receive_op_js(op: String) {
- teleia::contextualize(|ctx, st, game: &mut game::Game| game.receive_op(ctx, st, op.clone()))
-}
diff --git a/2026/games_submissions/rpc2dot0/src/math.rs b/2026/games_submissions/rpc2dot0/src/math.rs
deleted file mode 100644
index 555204f..0000000
--- a/2026/games_submissions/rpc2dot0/src/math.rs
+++ /dev/null
@@ -1,55 +0,0 @@
-pub use glam::Vec2;
-
-pub trait BoundingCircle {
- fn center(&self) -> Vec2;
- fn radius(&self) -> f32;
-
- // Intersection between two bounding circles.
- // compares squared distance to squared sum of radiuSUS (*insert mrGreen.png*),
- // tl;dr: a naive collision detection.
- fn overlaps_with(&self, other: &impl BoundingCircle) -> bool {
- let radius_sum = self.radius() + other.radius();
- self.center().distance_squared(other.center()) <= radius_sum * radius_sum
- }
-}
-
-#[derive(Clone, Copy)]
-pub struct Rectangle {
- pub min: Vec2,
- pub max: Vec2,
-}
-
-pub trait ContainsPoint {
- fn contains(&self, point: Vec2) -> bool;
-}
-
-impl ContainsPoint for Rectangle {
- fn contains(&self, point: Vec2) -> bool {
- point.cmpge(self.min).all() && point.cmple(self.max).all()
- }
-}
-
-impl Rectangle {
- pub const fn from_xywh(x: f32, y: f32, width: f32, height: f32) -> Self {
- Self {
- min: Vec2::new(x, y),
- max: Vec2::new(x + width, y + height),
- }
- }
-
- pub const fn from_min_max(min: Vec2, max: Vec2) -> Self {
- Self { min, max }
- }
-
- #[allow(dead_code)]
- pub fn overlaps(&self, other: &Rectangle) -> bool {
- self.min.cmple(other.max).all() && self.max.cmpge(other.min).all()
- }
-}
-
-pub fn parse_coords(coords: &str) -> (f32, f32) {
- let mut parts = coords.split(',');
- let x: f32 = parts.next().unwrap_or("0").parse().unwrap_or(0.0);
- let y: f32 = parts.next().unwrap_or("0").parse().unwrap_or(0.0);
- (x, y)
-}
diff --git a/2026/games_submissions/rpc2dot0/src/message.rs b/2026/games_submissions/rpc2dot0/src/message.rs
deleted file mode 100644
index d960b67..0000000
--- a/2026/games_submissions/rpc2dot0/src/message.rs
+++ /dev/null
@@ -1,26 +0,0 @@
-use serde::Serialize;
-use std::fmt::Debug;
-
-#[derive(Serialize, Debug)]
-pub struct Message<'a> {
- pub op: &'a str,
- #[serde(skip_serializing_if = "Option::is_none")]
- pub verb: Option<&'a str>,
- #[serde(skip_serializing_if = "Option::is_none")]
- pub win: Option<bool>,
- #[serde(skip_serializing_if = "Option::is_none")]
- pub score: Option<i32>,
- #[serde(skip_serializing_if = "Option::is_none")]
- pub video_url: Option<String>,
-}
-
-impl<'a> Message<'a> {
- pub fn post<MSG>(window: &web_sys::Window, msg: &MSG)
- where
- MSG: Serialize + Debug,
- {
- log::info!("eatyourgreens:: post message: {:?}", msg);
- let js_value = serde_wasm_bindgen::to_value(msg).unwrap();
- let _ = window.post_message(&js_value, "*");
- }
-}
diff --git a/2026/games_submissions/rpc2dot0/src/random.rs b/2026/games_submissions/rpc2dot0/src/random.rs
deleted file mode 100644
index 14a9f78..0000000
--- a/2026/games_submissions/rpc2dot0/src/random.rs
+++ /dev/null
@@ -1,107 +0,0 @@
-use crate::color::EntityColor;
-use crate::constants::get_baseline_ratio;
-use crate::math::Vec2;
-
-use rand::{Rng, RngCore, SeedableRng};
-use rand_chacha::ChaCha8Rng;
-
-#[derive(Debug, Clone)]
-pub struct RandomState {
- rng: ChaCha8Rng,
-}
-
-impl RandomState {
- /// RandomState::new(0x67676767) when debugging
- pub fn new(seed: usize) -> Self {
- log::info!("eatyourgreens:: RandomState new seed is {:?}", seed);
- Self {
- rng: ChaCha8Rng::seed_from_u64(seed as u64),
- }
- }
-
- pub fn next_u32(&mut self) -> u32 {
- self.rng.next_u32()
- }
-
- pub fn next_f32(&mut self) -> f32 {
- self.rng.r#gen::<f32>()
- }
-
- pub fn next_range(&mut self, min: f32, max: f32) -> f32 {
- self.rng.gen_range(min..max)
- }
-
- pub fn next_unit_vector(&mut self) -> Vec2 {
- let angle = self.rng.gen_range(0.0..std::f32::consts::TAU);
- Vec2::new(angle.cos(), angle.sin())
- }
-
- pub fn next_bool(&mut self, p: f64) -> bool {
- self.rng.gen_bool(p)
- }
-
- // this is used for rogue colors,
- // when used for random spawn, there is a risk
- // of color overcrowding. (like too much green or whatever)
- pub fn random_color(&mut self) -> EntityColor {
- let next_color_prob = self.next_f32();
- match next_color_prob {
- x if x < 0.60 => EntityColor::Green,
- x if x < 0.80 => EntityColor::Yellow,
- x if x < 0.90 => EntityColor::Red,
- _ => EntityColor::Bleu,
- }
- }
-
- // don't give it too much toughts this is designed by a clanker (cause too much math hurts my soul, I am not sorry)
- // coded by yours truely something within the spirit of
- // wiki :
- // https://en.wikipedia.org/wiki/Fitness_proportionate_selection
- // https://en.wikipedia.org/wiki/Reservoir_sampling#Weighted_random_sampling
-
- // we try to have a basline that is adjustable by difficulty
- // then we have weights for our biased random picker
- // used to spanwing entities
- // seed compatiable aka : reproducible behaviour with a fixed D and S (D=difficulty, S=seed)
- /*
- difficulty 1.0 => Green: 0.60 Red: 0.10 (baseline, no shift)
- difficulty 1.5 => Green: 0.525 Red: 0.175 (shift = 0.075)
- difficulty 2.0 => Green: 0.45 Red: 0.25 (shift = 0.15)
- difficulty 3.0 => Green: 0.30 Red: 0.40 (shift = 0.30)
- difficulty 5.0 => Green: 0.05 Red: 0.65 (capped: Green can't go below 5%)
- */
- // not tested and I won't test it, fuck that.
- pub fn random_color_biased(&mut self, counts: [u32; 4], difficulty: f32) -> EntityColor {
- let baseline: [f32; 4] = {
- let mut b = [0.0f32; 4];
- b[EntityColor::Red as usize] = get_baseline_ratio(EntityColor::Red, difficulty);
- b[EntityColor::Green as usize] = get_baseline_ratio(EntityColor::Green, difficulty);
- b[EntityColor::Bleu as usize] = get_baseline_ratio(EntityColor::Bleu, difficulty);
- b[EntityColor::Yellow as usize] = get_baseline_ratio(EntityColor::Yellow, difficulty);
- b
- };
-
- let total = counts.iter().sum::<u32>().max(1) as f32;
-
- let mut weights = [0.0f32; 4];
- for i in 0..4 {
- let actual_ratio = counts[i] as f32 / total;
- weights[i] = (2.0 * baseline[i] - actual_ratio).max(0.05);
- }
- let sum: f32 = weights.iter().sum();
- let roll: f32 = self.next_f32() * sum;
- let mut cumulative: f32 = 0.0f32;
- for (i, &w) in weights.iter().enumerate() {
- cumulative += w;
- if roll < cumulative {
- return match i {
- 0 => EntityColor::Red,
- 1 => EntityColor::Green,
- 2 => EntityColor::Bleu,
- _ => EntityColor::Yellow,
- };
- }
- }
- unreachable!("Should never happen")
- }
-}
diff --git a/2026/games_submissions/rpc2dot0/src/state.rs b/2026/games_submissions/rpc2dot0/src/state.rs
deleted file mode 100644
index c084bfc..0000000
--- a/2026/games_submissions/rpc2dot0/src/state.rs
+++ /dev/null
@@ -1,484 +0,0 @@
-use crate::collision::process_collisions;
-use crate::color::EntityColor;
-use crate::computer::ComputerPhase;
-use crate::constants::{
- BASE_SPEED, ENTITY_RADIUS, ENTITY_SCALE_FACTOR, GAME_DURATION_MS, INITIAL_SPAWN,
- INITIAL_SPAWN_SPREAD_MS, JITTER_STRENGTH, MAX_ENTITIES, MAX_SPEED, PACMAN_CHASE_PROB,
- PACMAN_CHASE_SPEED_MULT, RED_COUNTDOWN_MS, ROGUE_DURATION_MS, SPAWN_PADDING, SPAWN_RATE_MAX_MS,
- SPAWN_RATE_MIN_MS,
-};
-use crate::effects::{PacmanChase, Rogue};
-use crate::entity::{Entity, Update};
-use crate::errors::ClickOutcome;
-use crate::math::Vec2;
-use crate::random::RandomState;
-
-#[derive(Debug, Copy, Clone, PartialEq, Eq)]
-pub enum GamePhase {
- Waiting,
- Playing,
- Computer(ComputerPhase),
- Finished,
-}
-
-impl GamePhase {
- #[allow(dead_code)]
- pub fn phase(&self) -> &'static str {
- match self {
- GamePhase::Waiting => "waiting",
- GamePhase::Playing => "playing",
- GamePhase::Computer(_) => "computer",
- GamePhase::Finished => "finished",
- }
- }
-}
-
-#[derive(Debug, Copy, Clone, PartialEq, Eq)]
-pub enum RoundResult {
- Ok,
- Ko,
-}
-
-impl From<RoundResult> for &'static str {
- fn from(value: RoundResult) -> Self {
- match value {
- RoundResult::Ok => "Ok",
- RoundResult::Ko => "Ko",
- }
- }
-}
-
-impl From<RoundResult> for bool {
- fn from(value: RoundResult) -> Self {
- match value {
- RoundResult::Ok => true,
- RoundResult::Ko => false,
- }
- }
-}
-
-#[derive(Debug, Clone)]
-pub struct GameState {
- consumer_score: i32,
- pub(crate) elapsed_ms: f32,
- phase: GamePhase,
- pub(crate) entities: Vec<Entity>,
- pub(crate) next_entity_id: u32,
- pub(crate) rng: RandomState,
- spawn_timer_ms: f32,
- initial_spawn_remaining: u32,
- next_spawn_delay_ms: f32,
- pub(crate) collision_buffer: Vec<(usize, usize)>,
- pub(crate) events: Vec<String>,
- pub(crate) difficulty: f32,
-}
-
-impl Default for GameState {
- fn default() -> Self {
- Self::new()
- }
-}
-
-impl GameState {
- pub fn new() -> Self {
- Self {
- consumer_score: 0,
- elapsed_ms: 0.0,
- phase: GamePhase::Waiting,
- entities: Vec::new(),
- next_entity_id: 1,
- #[cfg(debug_assertions)]
- rng: RandomState::new(0x67676767),
- #[cfg(not(debug_assertions))]
- rng: RandomState::new((js_sys::Date::now() as u64) as usize),
- spawn_timer_ms: 0.0,
- initial_spawn_remaining: INITIAL_SPAWN,
- next_spawn_delay_ms: (INITIAL_SPAWN_SPREAD_MS / INITIAL_SPAWN as f32).max(1.0),
- collision_buffer: Vec::new(),
- events: Vec::new(),
- difficulty: 1.0,
- }
- }
-
- pub fn set_difficulty(&mut self, difficulty: f32) {
- self.difficulty = difficulty;
- }
-
- pub fn game_duration_ms(&self) -> f32 {
- GAME_DURATION_MS as f32 / self.difficulty
- }
-
- pub fn required_greens(&self) -> i32 {
- 5.max((15.0 / self.difficulty.sqrt()).round() as i32)
- }
-
- pub const fn base_speed(&self) -> f32 {
- BASE_SPEED * self.difficulty
- }
-
- pub fn max_speed(&self) -> f32 {
- MAX_SPEED * self.difficulty
- }
-
- pub fn spawn_rate_min_ms(&self) -> u32 {
- (SPAWN_RATE_MIN_MS as f32 / self.difficulty) as u32
- }
-
- pub fn spawn_rate_max_ms(&self) -> u32 {
- (SPAWN_RATE_MAX_MS as f32 / self.difficulty) as u32
- }
-
- pub fn entity_radius(&self) -> f32 {
- ENTITY_RADIUS / (1.0 + (self.difficulty - 1.0) * 0.25)
- }
-
- pub fn start_round(&mut self) {
- self.consumer_score = 0;
- self.elapsed_ms = 0.0;
- self.phase = GamePhase::Playing;
- self.entities.clear();
- self.next_entity_id = 1;
- self.spawn_timer_ms = 0.0;
- self.initial_spawn_remaining = INITIAL_SPAWN;
- self.next_spawn_delay_ms = (INITIAL_SPAWN_SPREAD_MS / INITIAL_SPAWN as f32).max(1.0);
- self.events.clear();
- }
- pub fn set_phase(&mut self, phase: GamePhase) {
- self.phase = phase;
- }
- /*
- pub fn boot_computer(&mut self) {
- if self.phase == GamePhase::Playing {
- self.phase = GamePhase::Computer(ComputerPhase::Booting);
- }
- }
-
- pub fn shutdown_computer(&mut self) {
- if self.phase == GamePhase::Computer(ComputerPhase::On) {
- self.phase = GamePhase::Computer(ComputerPhase::ShutDown);
- }
- }
- */
-
- pub fn spawn_entity(
- &mut self,
- pos: Vec2,
- vel: Vec2,
- color: EntityColor,
- disquette_inserted: bool,
- ) {
- if self.get_entity_count() >= MAX_ENTITIES {
- return;
- }
- let speed = self.base_speed();
- let radius = self.entity_radius() * ENTITY_SCALE_FACTOR;
- let mut entity = Entity::new(self.next_entity_id, pos, vel, color, speed, radius);
- if color == EntityColor::Red {
- entity.spawn_time_ms = Some(self.elapsed_ms);
- }
- if color == EntityColor::Green {
- let base_prob = 0.25;
- let prob = (base_prob * self.difficulty).min(0.85);
- if self.rng.next_bool(prob as f64) {
- let rogue_duration = ROGUE_DURATION_MS / self.difficulty;
- let mut hover_color = self.rng.random_color();
- while hover_color == EntityColor::Green {
- hover_color = self.rng.random_color();
- }
- entity.rogue = Some(Rogue::new(self.elapsed_ms + rogue_duration, hover_color));
- }
- }
-
- if !disquette_inserted
- && color == EntityColor::Bleu
- && self.rng.next_bool(PACMAN_CHASE_PROB)
- {
- let chase_speed = self.base_speed() * PACMAN_CHASE_SPEED_MULT;
- entity.pacman_chase = Some(PacmanChase::new(chase_speed));
- }
- self.next_entity_id = self.next_entity_id.wrapping_add(1);
- self.entities.push(entity);
- }
- pub fn update_entities(
- &mut self,
- delta_ms: f32,
- area_width: f32,
- area_height: f32,
- disquette_inserted: bool,
- disquette_pos: Option<Vec2>,
- ) {
- self.update_spawning(delta_ms, area_width, area_height, disquette_inserted);
-
- let current_max_speed = self.max_speed();
- for entity in &mut self.entities {
- if !entity.alive {
- continue;
- }
- if let Some(chase) = &entity.pacman_chase {
- if let Some(target) = disquette_pos {
- let dx = target.x - entity.pos.x;
- let dy = target.y - entity.pos.y;
- let dist = (dx * dx + dy * dy).sqrt();
- if dist > f32::EPSILON {
- entity.vel.x = (dx / dist) * chase.speed;
- entity.vel.y = (dy / dist) * chase.speed;
- }
- } else {
- entity.apply_jitter(Vec2::new(
- self.rng.next_range(-JITTER_STRENGTH, JITTER_STRENGTH),
- self.rng.next_range(-JITTER_STRENGTH, JITTER_STRENGTH),
- ));
- }
- } else {
- entity.apply_jitter(Vec2::new(
- self.rng.next_range(-JITTER_STRENGTH, JITTER_STRENGTH),
- self.rng.next_range(-JITTER_STRENGTH, JITTER_STRENGTH),
- ));
- }
-
- entity.update(delta_ms);
- entity.dampen_speed(current_max_speed);
- entity.bounds_bounce(area_width, area_height);
- }
- if let Some(target) = disquette_pos {
- const DISQUETTE_HALF_SIZE: f32 = 3.2;
- let mut consumed = false;
- for entity in &self.entities {
- if entity.alive
- && entity.pacman_chase.is_some()
- && entity.pos.distance_squared(target)
- <= (entity.radius + DISQUETTE_HALF_SIZE).powi(2)
- {
- consumed = true;
- break;
- }
- }
- if consumed {
- self.events.push("disquette_consumed".to_string());
- }
- }
-
- process_collisions(
- &mut self.entities,
- &mut self.rng,
- &mut self.next_entity_id,
- &mut self.collision_buffer,
- self.elapsed_ms,
- &mut self.events,
- );
-
- // Check red countdown timers (explode if expired)
- let mut greens_to_kill = false;
- for entity in &mut self.entities {
- if entity.alive
- && entity.color == EntityColor::Red
- && let Some(spawn_time) = entity.spawn_time_ms
- && self.elapsed_ms >= spawn_time + RED_COUNTDOWN_MS
- {
- entity.alive = false;
- self.events
- .push(format!("explode:{},{}", entity.pos.x, entity.pos.y));
- greens_to_kill = true;
- }
- }
- if greens_to_kill {
- for entity in &mut self.entities {
- if entity.alive && entity.color == EntityColor::Green {
- entity.alive = false;
- }
- }
- }
-
- self.entities.retain(|e| e.alive);
- }
-
- pub fn entities(&self) -> &[Entity] {
- &self.entities
- }
-
- fn schedule_next_spawn(&mut self) {
- self.next_spawn_delay_ms = if self.initial_spawn_remaining > 0 {
- (INITIAL_SPAWN_SPREAD_MS / INITIAL_SPAWN as f32).max(1.0)
- } else {
- self.rng
- .next_range(
- self.spawn_rate_min_ms() as f32,
- self.spawn_rate_max_ms() as f32,
- )
- .round()
- .max(1.0)
- };
- }
-
- fn position_overlaps(&self, pos: Vec2) -> bool {
- let scaled_radius = self.entity_radius() * ENTITY_SCALE_FACTOR;
- self.entities.iter().any(|entity| {
- let distance_sq = entity.pos.distance_squared(pos);
- distance_sq < (entity.radius + scaled_radius + SPAWN_PADDING).powi(2)
- })
- }
-
- fn generate_spawn_position(&mut self, area_width: f32, area_height: f32) -> Vec2 {
- let scaled_radius = self.entity_radius() * ENTITY_SCALE_FACTOR;
- const MAX_ATTEMPTS: usize = 16;
- for _ in 0..MAX_ATTEMPTS {
- let pos = Vec2::new(
- self.rng
- .next_range(scaled_radius, area_width - scaled_radius),
- self.rng
- .next_range(scaled_radius, area_height - scaled_radius),
- );
- if !self.position_overlaps(pos) {
- return pos;
- }
- }
- Vec2::new(
- self.rng
- .next_range(scaled_radius, area_width - scaled_radius),
- self.rng
- .next_range(scaled_radius, area_height - scaled_radius),
- )
- }
-
- fn spawn_random_entity(&mut self, area_width: f32, area_height: f32, disquette_inserted: bool) {
- if self.get_entity_count() >= MAX_ENTITIES {
- return;
- }
-
- let pos = self.generate_spawn_position(area_width, area_height);
- let dir = self.rng.next_unit_vector();
- let vel = dir * self.base_speed();
-
- let mut color_counts = [0u32; 4];
- for entity in &self.entities {
- if entity.alive {
- color_counts[entity.color as usize] += 1;
- }
- }
- let color = self.rng.random_color_biased(color_counts, self.difficulty);
- self.spawn_entity(pos, vel, color, disquette_inserted);
- }
-
- fn update_spawning(
- &mut self,
- delta_ms: f32,
- area_width: f32,
- area_height: f32,
- disquette_inserted: bool,
- ) {
- if self.phase != GamePhase::Playing || area_width <= 0.0 || area_height <= 0.0 {
- return;
- }
-
- self.spawn_timer_ms += delta_ms;
- while self.spawn_timer_ms >= self.next_spawn_delay_ms {
- self.spawn_timer_ms -= self.next_spawn_delay_ms;
- if self.get_entity_count() >= MAX_ENTITIES {
- self.spawn_timer_ms = 0.0;
- break;
- }
-
- if self.initial_spawn_remaining > 0 {
- self.spawn_random_entity(area_width, area_height, disquette_inserted);
- self.initial_spawn_remaining = self.initial_spawn_remaining.saturating_sub(1);
- } else {
- self.spawn_random_entity(area_width, area_height, disquette_inserted);
- }
-
- self.schedule_next_spawn();
- }
- }
-
- fn entity_at_point(&self, point: Vec2) -> Option<usize> {
- self.entities
- .iter()
- .enumerate()
- .rev()
- .find(|(_, e)| e.alive && e.pos.distance_squared(point) <= e.radius * e.radius)
- .map(|(idx, _)| idx)
- }
-
- pub fn click_at(&mut self, x: f32, y: f32) -> Option<ClickOutcome> {
- //log::info!("eatyourgreens:: click_at(x={x},y={y})");
- if self.phase != GamePhase::Playing {
- return None;
- }
-
- let target = self.entity_at_point(Vec2::new(x, y));
- if let Some(idx) = target {
- let color = self.entities[idx].color;
-
- let mut effective_color = color;
- if color == EntityColor::Green
- && let Some(rogue) = &self.entities[idx].rogue
- && self.elapsed_ms < rogue.until_ms
- {
- effective_color = rogue.hover_color;
- }
-
- self.entities[idx].alive = false;
- match effective_color {
- EntityColor::Green => self.change_score(1),
- EntityColor::Yellow | EntityColor::Red | EntityColor::Bleu => self.change_score(-1),
- }
-
- if effective_color == EntityColor::Red {
- self.events.push(format!("click_red:{},{}", x, y));
- }
- return Some(ClickOutcome::Hit(effective_color));
- }
- Some(ClickOutcome::Miss)
- }
-
- pub fn consumer_score(&self) -> i32 {
- self.consumer_score
- }
-
- pub fn elapsed_ms(&self) -> f32 {
- self.elapsed_ms
- }
-
- pub fn remaining_ms(&self) -> f32 {
- self.game_duration_ms() - self.elapsed_ms
- }
-
- pub fn phase(&self) -> GamePhase {
- self.phase
- }
-
- pub fn round_result(&self) -> RoundResult {
- if self.consumer_score >= self.required_greens() {
- RoundResult::Ok
- } else {
- RoundResult::Ko
- }
- }
-
- pub fn advance_time(&mut self, delta_ms: f32) {
- if self.phase != GamePhase::Playing {
- return;
- }
-
- self.elapsed_ms += delta_ms;
- let duration = self.game_duration_ms();
- if self.elapsed_ms >= duration {
- self.elapsed_ms = duration;
- self.phase = GamePhase::Finished;
- }
- }
-
- pub fn drain_events(&mut self) -> Vec<String> {
- std::mem::take(&mut self.events)
- }
-
- pub fn get_entity_count(&self) -> u32 {
- self.entities.iter().filter(|e| e.alive).count() as u32
- }
-
- pub fn change_score(&mut self, delta: i32) {
- if self.phase != GamePhase::Playing {
- return;
- }
- self.consumer_score = self.consumer_score.saturating_add(delta);
- }
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/.dir-locals.el b/2026/games_submissions/rpc2dot0/vendor/teleia/.dir-locals.el
deleted file mode 100644
index 45e0286..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/.dir-locals.el
+++ /dev/null
@@ -1,7 +0,0 @@
-((rust-ts-mode .
- ((eglot-workspace-configuration .
- (:rust-analyzer
- ( :check (:command "clippy")
- :cargo (;; :target "wasm32-unknown-unknown"
- :targetDir t)
- :hover (:show (:fields 10))))))))
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/.envrc b/2026/games_submissions/rpc2dot0/vendor/teleia/.envrc
deleted file mode 100644
index 063b56f..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/.envrc
+++ /dev/null
@@ -1 +0,0 @@
-use_flake
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/.gitignore b/2026/games_submissions/rpc2dot0/vendor/teleia/.gitignore
deleted file mode 100644
index 2049df0..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-/.direnv
-/target
-/.cargo
-/dist
-/result \ No newline at end of file
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/.gitmodules b/2026/games_submissions/rpc2dot0/vendor/teleia/.gitmodules
deleted file mode 100644
index e69de29..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/.gitmodules
+++ /dev/null
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/Cargo.lock b/2026/games_submissions/rpc2dot0/vendor/teleia/Cargo.lock
deleted file mode 100644
index 71d423b..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/Cargo.lock
+++ /dev/null
@@ -1,3344 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-version = 4
-
-[[package]]
-name = "ab_glyph"
-version = "0.2.23"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "80179d7dd5d7e8c285d67c4a1e652972a92de7475beddfb92028c76463b13225"
-dependencies = [
- "ab_glyph_rasterizer",
- "owned_ttf_parser",
-]
-
-[[package]]
-name = "ab_glyph_rasterizer"
-version = "0.1.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046"
-
-[[package]]
-name = "adler2"
-version = "2.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
-
-[[package]]
-name = "ahash"
-version = "0.8.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b79b82693f705137f8fb9b37871d99e4f9a7df12b917eed79c3d3954830a60b"
-dependencies = [
- "cfg-if",
- "getrandom",
- "once_cell",
- "version_check",
- "zerocopy",
-]
-
-[[package]]
-name = "aho-corasick"
-version = "1.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "allocator-api2"
-version = "0.2.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
-
-[[package]]
-name = "alsa"
-version = "0.9.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed7572b7ba83a31e20d1b48970ee402d2e3e0537dcfe0a3ff4d6eb7508617d43"
-dependencies = [
- "alsa-sys",
- "bitflags 2.6.0",
- "cfg-if",
- "libc",
-]
-
-[[package]]
-name = "alsa-sys"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527"
-dependencies = [
- "libc",
- "pkg-config",
-]
-
-[[package]]
-name = "android-activity"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee91c0c2905bae44f84bfa4e044536541df26b7703fd0888deeb9060fcc44289"
-dependencies = [
- "android-properties",
- "bitflags 2.6.0",
- "cc",
- "cesu8",
- "jni",
- "jni-sys",
- "libc",
- "log",
- "ndk",
- "ndk-context",
- "ndk-sys",
- "num_enum",
- "thiserror 1.0.57",
-]
-
-[[package]]
-name = "android-properties"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04"
-
-[[package]]
-name = "anstream"
-version = "0.6.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338"
-dependencies = [
- "anstyle",
- "anstyle-parse",
- "anstyle-query",
- "anstyle-wincon",
- "colorchoice",
- "is_terminal_polyfill",
- "utf8parse",
-]
-
-[[package]]
-name = "anstyle"
-version = "1.0.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8365de52b16c035ff4fcafe0092ba9390540e3e352870ac09933bebcaa2c8c56"
-
-[[package]]
-name = "anstyle-parse"
-version = "0.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9"
-dependencies = [
- "utf8parse",
-]
-
-[[package]]
-name = "anstyle-query"
-version = "1.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c"
-dependencies = [
- "windows-sys 0.59.0",
-]
-
-[[package]]
-name = "anstyle-wincon"
-version = "3.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125"
-dependencies = [
- "anstyle",
- "windows-sys 0.59.0",
-]
-
-[[package]]
-name = "approx"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6"
-dependencies = [
- "num-traits",
-]
-
-[[package]]
-name = "arrayref"
-version = "0.3.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545"
-
-[[package]]
-name = "arrayvec"
-version = "0.7.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711"
-
-[[package]]
-name = "as-raw-xcb-connection"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b"
-
-[[package]]
-name = "atomic-waker"
-version = "1.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
-
-[[package]]
-name = "autocfg"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
-
-[[package]]
-name = "base64"
-version = "0.13.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
-
-[[package]]
-name = "base64"
-version = "0.22.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
-
-[[package]]
-name = "bimap"
-version = "0.6.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7"
-
-[[package]]
-name = "bincode"
-version = "2.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740"
-dependencies = [
- "bincode_derive",
- "serde",
- "unty",
-]
-
-[[package]]
-name = "bincode_derive"
-version = "2.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf95709a440f45e986983918d0e8a1f30a9b1df04918fc828670606804ac3c09"
-dependencies = [
- "virtue",
-]
-
-[[package]]
-name = "bindgen"
-version = "0.70.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f"
-dependencies = [
- "bitflags 2.6.0",
- "cexpr",
- "clang-sys",
- "itertools",
- "proc-macro2",
- "quote",
- "regex",
- "rustc-hash 1.1.0",
- "shlex",
- "syn",
-]
-
-[[package]]
-name = "bit-vec"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2c54ff287cfc0a34f38a6b832ea1bd8e448a330b3e40a50859e6488bee07f22"
-
-[[package]]
-name = "bitflags"
-version = "1.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
-
-[[package]]
-name = "bitflags"
-version = "2.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "block-buffer"
-version = "0.10.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
-dependencies = [
- "generic-array",
-]
-
-[[package]]
-name = "block-sys"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae85a0696e7ea3b835a453750bf002770776609115e6d25c6d2ff28a8200f7e7"
-dependencies = [
- "objc-sys",
-]
-
-[[package]]
-name = "block2"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "15b55663a85f33501257357e6421bb33e769d5c9ffb5ba0921c975a123e35e68"
-dependencies = [
- "block-sys",
- "objc2 0.4.1",
-]
-
-[[package]]
-name = "bumpalo"
-version = "3.15.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ea184aa71bb362a1157c896979544cc23974e08fd265f29ea96b59f0b4a555b"
-
-[[package]]
-name = "bytemuck"
-version = "1.14.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2ef034f05691a48569bd920a96c81b9d91bbad1ab5ac7c4616c1f6ef36cb79f"
-
-[[package]]
-name = "byteorder"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
-
-[[package]]
-name = "byteorder-lite"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495"
-
-[[package]]
-name = "bytes"
-version = "1.7.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3"
-
-[[package]]
-name = "calloop"
-version = "0.12.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fba7adb4dd5aa98e5553510223000e7148f621165ec5f9acd7113f6ca4995298"
-dependencies = [
- "bitflags 2.6.0",
- "log",
- "polling",
- "rustix 0.38.31",
- "slab",
- "thiserror 1.0.57",
-]
-
-[[package]]
-name = "calloop-wayland-source"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0f0ea9b9476c7fad82841a8dbb380e2eae480c21910feba80725b46931ed8f02"
-dependencies = [
- "calloop",
- "rustix 0.38.31",
- "wayland-backend",
- "wayland-client",
-]
-
-[[package]]
-name = "cc"
-version = "1.1.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945"
-dependencies = [
- "jobserver",
- "libc",
- "shlex",
-]
-
-[[package]]
-name = "cesu8"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
-
-[[package]]
-name = "cexpr"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
-dependencies = [
- "nom",
-]
-
-[[package]]
-name = "cfg-if"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
-
-[[package]]
-name = "cfg_aliases"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e"
-
-[[package]]
-name = "clang-sys"
-version = "1.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4"
-dependencies = [
- "glob",
- "libc",
- "libloading",
-]
-
-[[package]]
-name = "colorchoice"
-version = "1.0.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990"
-
-[[package]]
-name = "combine"
-version = "4.6.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4"
-dependencies = [
- "bytes",
- "memchr",
-]
-
-[[package]]
-name = "concurrent-queue"
-version = "2.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363"
-dependencies = [
- "crossbeam-utils",
-]
-
-[[package]]
-name = "console_error_panic_hook"
-version = "0.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc"
-dependencies = [
- "cfg-if",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "console_log"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be8aed40e4edbf4d3b4431ab260b63fdc40f5780a4766824329ea0f1eefe3c0f"
-dependencies = [
- "log",
- "web-sys",
-]
-
-[[package]]
-name = "core-foundation"
-version = "0.9.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
-dependencies = [
- "core-foundation-sys",
- "libc",
-]
-
-[[package]]
-name = "core-foundation-sys"
-version = "0.8.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
-
-[[package]]
-name = "core-graphics"
-version = "0.23.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "970a29baf4110c26fedbc7f82107d42c23f7e88e404c4577ed73fe99ff85a212"
-dependencies = [
- "bitflags 1.3.2",
- "core-foundation",
- "core-graphics-types",
- "foreign-types 0.5.0",
- "libc",
-]
-
-[[package]]
-name = "core-graphics-types"
-version = "0.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf"
-dependencies = [
- "bitflags 1.3.2",
- "core-foundation",
- "libc",
-]
-
-[[package]]
-name = "coreaudio-rs"
-version = "0.11.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "321077172d79c662f64f5071a03120748d5bb652f5231570141be24cfcd2bace"
-dependencies = [
- "bitflags 1.3.2",
- "core-foundation-sys",
- "coreaudio-sys",
-]
-
-[[package]]
-name = "coreaudio-sys"
-version = "0.2.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2ce857aa0b77d77287acc1ac3e37a05a8c95a2af3647d23b15f263bdaeb7562b"
-dependencies = [
- "bindgen",
-]
-
-[[package]]
-name = "cpal"
-version = "0.15.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "873dab07c8f743075e57f524c583985fbaf745602acbe916a01539364369a779"
-dependencies = [
- "alsa",
- "core-foundation-sys",
- "coreaudio-rs",
- "dasp_sample",
- "jni",
- "js-sys",
- "libc",
- "mach2",
- "ndk",
- "ndk-context",
- "oboe",
- "wasm-bindgen",
- "wasm-bindgen-futures",
- "web-sys",
- "windows",
-]
-
-[[package]]
-name = "cpufeatures"
-version = "0.2.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "crc32fast"
-version = "1.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa"
-dependencies = [
- "cfg-if",
-]
-
-[[package]]
-name = "crossbeam"
-version = "0.8.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8"
-dependencies = [
- "crossbeam-channel",
- "crossbeam-deque",
- "crossbeam-epoch",
- "crossbeam-queue",
- "crossbeam-utils",
-]
-
-[[package]]
-name = "crossbeam-channel"
-version = "0.5.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2"
-dependencies = [
- "crossbeam-utils",
-]
-
-[[package]]
-name = "crossbeam-deque"
-version = "0.8.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d"
-dependencies = [
- "crossbeam-epoch",
- "crossbeam-utils",
-]
-
-[[package]]
-name = "crossbeam-epoch"
-version = "0.9.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
-dependencies = [
- "crossbeam-utils",
-]
-
-[[package]]
-name = "crossbeam-queue"
-version = "0.3.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115"
-dependencies = [
- "crossbeam-utils",
-]
-
-[[package]]
-name = "crossbeam-utils"
-version = "0.8.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
-
-[[package]]
-name = "crypto-common"
-version = "0.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"
-dependencies = [
- "generic-array",
- "typenum",
-]
-
-[[package]]
-name = "cursor-icon"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "dasp_sample"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f"
-
-[[package]]
-name = "data-encoding"
-version = "2.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea"
-
-[[package]]
-name = "digest"
-version = "0.10.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
-dependencies = [
- "block-buffer",
- "crypto-common",
-]
-
-[[package]]
-name = "directories"
-version = "6.0.0"
-source = "git+https://github.com/lcolonq/directories-rs#164536daab2c07265167715934081cb1942387b0"
-dependencies = [
- "dirs-sys",
-]
-
-[[package]]
-name = "dirs-sys"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab"
-dependencies = [
- "libc",
- "option-ext",
- "redox_users",
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "dispatch"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b"
-
-[[package]]
-name = "dlib"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412"
-dependencies = [
- "libloading",
-]
-
-[[package]]
-name = "downcast-rs"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650"
-
-[[package]]
-name = "either"
-version = "1.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a"
-
-[[package]]
-name = "ena"
-version = "0.14.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5"
-dependencies = [
- "log",
-]
-
-[[package]]
-name = "encoding_rs"
-version = "0.8.34"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59"
-dependencies = [
- "cfg-if",
-]
-
-[[package]]
-name = "enum-map"
-version = "2.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6866f3bfdf8207509a033af1a75a7b08abda06bbaaeae6669323fd5a097df2e9"
-dependencies = [
- "enum-map-derive",
-]
-
-[[package]]
-name = "enum-map-derive"
-version = "0.17.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "env"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc95de49ad098572c02d3fbf368c9a020bfff5ae78483685b77f51d8a7e9486d"
-dependencies = [
- "num_threads",
-]
-
-[[package]]
-name = "env_filter"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab"
-dependencies = [
- "log",
- "regex",
-]
-
-[[package]]
-name = "env_logger"
-version = "0.11.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d"
-dependencies = [
- "anstream",
- "anstyle",
- "env_filter",
- "humantime",
- "log",
-]
-
-[[package]]
-name = "equivalent"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
-
-[[package]]
-name = "errno"
-version = "0.3.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
-dependencies = [
- "libc",
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "extended"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af9673d8203fcb076b19dfd17e38b3d4ae9f44959416ea532ce72415a6020365"
-
-[[package]]
-name = "eyre"
-version = "0.6.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec"
-dependencies = [
- "indenter",
- "once_cell",
-]
-
-[[package]]
-name = "fastrand"
-version = "2.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
-
-[[package]]
-name = "fdeflate"
-version = "0.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645"
-dependencies = [
- "simd-adler32",
-]
-
-[[package]]
-name = "flate2"
-version = "1.1.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c"
-dependencies = [
- "crc32fast",
- "miniz_oxide",
-]
-
-[[package]]
-name = "foldhash"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
-
-[[package]]
-name = "foreign-types"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
-dependencies = [
- "foreign-types-shared 0.1.1",
-]
-
-[[package]]
-name = "foreign-types"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965"
-dependencies = [
- "foreign-types-macros",
- "foreign-types-shared 0.3.1",
-]
-
-[[package]]
-name = "foreign-types-macros"
-version = "0.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "foreign-types-shared"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
-
-[[package]]
-name = "foreign-types-shared"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b"
-
-[[package]]
-name = "generic-array"
-version = "0.14.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
-dependencies = [
- "typenum",
- "version_check",
-]
-
-[[package]]
-name = "gethostname"
-version = "0.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818"
-dependencies = [
- "libc",
- "windows-targets 0.48.5",
-]
-
-[[package]]
-name = "getrandom"
-version = "0.2.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5"
-dependencies = [
- "cfg-if",
- "js-sys",
- "libc",
- "wasi",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "glam"
-version = "0.29.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc46dd3ec48fdd8e693a98d2b8bafae273a2d54c1de02a2a7e3d57d501f39677"
-dependencies = [
- "mint",
-]
-
-[[package]]
-name = "glfw"
-version = "0.59.0"
-source = "git+https://github.com/lcolonq/glfw-rs#1ce13a2bcf3ef3bf6184bcb4c2a90d9034956841"
-dependencies = [
- "bitflags 1.3.2",
- "objc2 0.5.2",
- "raw-window-handle",
- "serde",
- "winapi",
-]
-
-[[package]]
-name = "glob"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2"
-
-[[package]]
-name = "glow"
-version = "0.13.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd348e04c43b32574f2de31c8bb397d96c9fcfa1371bd4ca6d8bdc464ab121b1"
-dependencies = [
- "js-sys",
- "slotmap",
- "wasm-bindgen",
- "web-sys",
-]
-
-[[package]]
-name = "gltf"
-version = "1.4.1"
-source = "git+https://github.com/lcolonq/gltf#9763a5abe8c168eb1282a037ff16668542fe2a6d"
-dependencies = [
- "base64 0.13.1",
- "byteorder",
- "gltf-json",
- "image",
- "lazy_static",
- "serde_json",
- "urlencoding",
-]
-
-[[package]]
-name = "gltf-derive"
-version = "1.4.1"
-source = "git+https://github.com/lcolonq/gltf#9763a5abe8c168eb1282a037ff16668542fe2a6d"
-dependencies = [
- "inflections",
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "gltf-json"
-version = "1.4.1"
-source = "git+https://github.com/lcolonq/gltf#9763a5abe8c168eb1282a037ff16668542fe2a6d"
-dependencies = [
- "gltf-derive",
- "serde",
- "serde_derive",
- "serde_json",
-]
-
-[[package]]
-name = "hash32"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606"
-dependencies = [
- "byteorder",
-]
-
-[[package]]
-name = "hashbrown"
-version = "0.15.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
-dependencies = [
- "allocator-api2",
- "equivalent",
- "foldhash",
-]
-
-[[package]]
-name = "hashbrown"
-version = "0.17.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51"
-
-[[package]]
-name = "heapless"
-version = "0.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad"
-dependencies = [
- "hash32",
- "stable_deref_trait",
-]
-
-[[package]]
-name = "heck"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
-
-[[package]]
-name = "hermit-abi"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c"
-
-[[package]]
-name = "http"
-version = "1.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a"
-dependencies = [
- "bytes",
- "itoa",
-]
-
-[[package]]
-name = "httparse"
-version = "1.10.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
-
-[[package]]
-name = "humantime"
-version = "2.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
-
-[[package]]
-name = "icrate"
-version = "0.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "99d3aaff8a54577104bafdf686ff18565c3b6903ca5782a2026ef06e2c7aa319"
-dependencies = [
- "block2",
- "dispatch",
- "objc2 0.4.1",
-]
-
-[[package]]
-name = "image"
-version = "0.25.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104"
-dependencies = [
- "bytemuck",
- "byteorder-lite",
- "moxcms",
- "num-traits",
- "png",
- "zune-core",
- "zune-jpeg",
-]
-
-[[package]]
-name = "indenter"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683"
-
-[[package]]
-name = "indexmap"
-version = "2.14.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9"
-dependencies = [
- "equivalent",
- "hashbrown 0.17.0",
-]
-
-[[package]]
-name = "inflections"
-version = "1.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a257582fdcde896fd96463bf2d40eefea0580021c0712a0e2b028b60b47a837a"
-
-[[package]]
-name = "is_terminal_polyfill"
-version = "1.70.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
-
-[[package]]
-name = "itertools"
-version = "0.13.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"
-dependencies = [
- "either",
-]
-
-[[package]]
-name = "itoa"
-version = "1.0.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
-
-[[package]]
-name = "jni"
-version = "0.21.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97"
-dependencies = [
- "cesu8",
- "cfg-if",
- "combine",
- "jni-sys",
- "log",
- "thiserror 1.0.57",
- "walkdir",
- "windows-sys 0.45.0",
-]
-
-[[package]]
-name = "jni-sys"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
-
-[[package]]
-name = "jobserver"
-version = "0.1.32"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "js-sys"
-version = "0.3.77"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
-dependencies = [
- "once_cell",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "kira"
-version = "0.9.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb5a9f9dff5e262540b628b00d5e1a772270a962d6869f8695bb24832ff3b394"
-dependencies = [
- "cpal",
- "glam",
- "mint",
- "paste",
- "ringbuf",
- "send_wrapper",
- "symphonia",
- "triple_buffer",
-]
-
-[[package]]
-name = "lazy_static"
-version = "1.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
-
-[[package]]
-name = "libc"
-version = "0.2.184"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af"
-
-[[package]]
-name = "libloading"
-version = "0.8.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2caa5afb8bf9f3a2652760ce7d4f62d21c4d5a423e68466fca30df82f2330164"
-dependencies = [
- "cfg-if",
- "windows-targets 0.52.6",
-]
-
-[[package]]
-name = "libm"
-version = "0.2.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa"
-
-[[package]]
-name = "libredox"
-version = "0.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607"
-dependencies = [
- "bitflags 2.6.0",
- "libc",
- "redox_syscall 0.4.1",
-]
-
-[[package]]
-name = "libredox"
-version = "0.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
-dependencies = [
- "bitflags 2.6.0",
- "libc",
-]
-
-[[package]]
-name = "linux-raw-sys"
-version = "0.4.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c"
-
-[[package]]
-name = "linux-raw-sys"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53"
-
-[[package]]
-name = "litrs"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092"
-
-[[package]]
-name = "log"
-version = "0.4.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c"
-
-[[package]]
-name = "mach2"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "matrixmultiply"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a"
-dependencies = [
- "autocfg",
- "rawpointer",
-]
-
-[[package]]
-name = "memchr"
-version = "2.7.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149"
-
-[[package]]
-name = "memmap2"
-version = "0.9.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "minimal-lexical"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
-
-[[package]]
-name = "miniz_oxide"
-version = "0.8.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
-dependencies = [
- "adler2",
- "simd-adler32",
-]
-
-[[package]]
-name = "mint"
-version = "0.5.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e53debba6bda7a793e5f99b8dacf19e626084f525f7829104ba9898f367d85ff"
-
-[[package]]
-name = "moxcms"
-version = "0.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b"
-dependencies = [
- "num-traits",
- "pxfm",
-]
-
-[[package]]
-name = "nalgebra"
-version = "0.33.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26aecdf64b707efd1310e3544d709c5c0ac61c13756046aaaba41be5c4f66a3b"
-dependencies = [
- "approx",
- "glam",
- "matrixmultiply",
- "nalgebra-macros",
- "num-complex",
- "num-rational",
- "num-traits",
- "simba",
- "typenum",
-]
-
-[[package]]
-name = "nalgebra-macros"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "254a5372af8fc138e36684761d3c0cdb758a4410e938babcff1c860ce14ddbfc"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "native-tls"
-version = "0.2.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e"
-dependencies = [
- "libc",
- "log",
- "openssl",
- "openssl-probe",
- "openssl-sys",
- "schannel",
- "security-framework",
- "security-framework-sys",
- "tempfile",
-]
-
-[[package]]
-name = "ndk"
-version = "0.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7"
-dependencies = [
- "bitflags 2.6.0",
- "jni-sys",
- "log",
- "ndk-sys",
- "num_enum",
- "raw-window-handle",
- "thiserror 1.0.57",
-]
-
-[[package]]
-name = "ndk-context"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b"
-
-[[package]]
-name = "ndk-sys"
-version = "0.5.0+25.2.9519653"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691"
-dependencies = [
- "jni-sys",
-]
-
-[[package]]
-name = "nom"
-version = "7.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
-dependencies = [
- "memchr",
- "minimal-lexical",
-]
-
-[[package]]
-name = "num-bigint"
-version = "0.4.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
-dependencies = [
- "num-integer",
- "num-traits",
-]
-
-[[package]]
-name = "num-complex"
-version = "0.4.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
-dependencies = [
- "num-traits",
-]
-
-[[package]]
-name = "num-derive"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "num-integer"
-version = "0.1.46"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
-dependencies = [
- "num-traits",
-]
-
-[[package]]
-name = "num-rational"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824"
-dependencies = [
- "num-bigint",
- "num-integer",
- "num-traits",
-]
-
-[[package]]
-name = "num-traits"
-version = "0.2.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
-dependencies = [
- "autocfg",
- "libm",
-]
-
-[[package]]
-name = "num_enum"
-version = "0.7.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845"
-dependencies = [
- "num_enum_derive",
-]
-
-[[package]]
-name = "num_enum_derive"
-version = "0.7.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b"
-dependencies = [
- "proc-macro-crate",
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "num_threads"
-version = "0.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "objc-sys"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310"
-
-[[package]]
-name = "objc2"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "559c5a40fdd30eb5e344fbceacf7595a81e242529fb4e21cf5f43fb4f11ff98d"
-dependencies = [
- "objc-sys",
- "objc2-encode 3.0.0",
-]
-
-[[package]]
-name = "objc2"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804"
-dependencies = [
- "objc-sys",
- "objc2-encode 4.1.0",
-]
-
-[[package]]
-name = "objc2-encode"
-version = "3.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d079845b37af429bfe5dfa76e6d087d788031045b25cfc6fd898486fd9847666"
-
-[[package]]
-name = "objc2-encode"
-version = "4.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33"
-
-[[package]]
-name = "oboe"
-version = "0.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8b61bebd49e5d43f5f8cc7ee2891c16e0f41ec7954d36bcb6c14c5e0de867fb"
-dependencies = [
- "jni",
- "ndk",
- "ndk-context",
- "num-derive",
- "num-traits",
- "oboe-sys",
-]
-
-[[package]]
-name = "oboe-sys"
-version = "0.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c8bb09a4a2b1d668170cfe0a7d5bc103f8999fb316c98099b6a9939c9f2e79d"
-dependencies = [
- "cc",
-]
-
-[[package]]
-name = "once_cell"
-version = "1.19.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
-
-[[package]]
-name = "openssl"
-version = "0.10.75"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328"
-dependencies = [
- "bitflags 2.6.0",
- "cfg-if",
- "foreign-types 0.3.2",
- "libc",
- "once_cell",
- "openssl-macros",
- "openssl-sys",
-]
-
-[[package]]
-name = "openssl-macros"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "openssl-probe"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e"
-
-[[package]]
-name = "openssl-sys"
-version = "0.9.111"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321"
-dependencies = [
- "cc",
- "libc",
- "pkg-config",
- "vcpkg",
-]
-
-[[package]]
-name = "option-ext"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
-
-[[package]]
-name = "orbclient"
-version = "0.3.47"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "52f0d54bde9774d3a51dcf281a5def240c71996bc6ca05d2c847ec8b2b216166"
-dependencies = [
- "libredox 0.0.2",
-]
-
-[[package]]
-name = "ordered-float"
-version = "4.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951"
-dependencies = [
- "num-traits",
-]
-
-[[package]]
-name = "owned_ttf_parser"
-version = "0.20.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d4586edfe4c648c71797a74c84bacb32b52b212eff5dfe2bb9f2c599844023e7"
-dependencies = [
- "ttf-parser",
-]
-
-[[package]]
-name = "parry3d"
-version = "0.18.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ecb572cea5c76b06bc744aaefdbb9e6ea9e5695f50f79c0227bddecd6ec925a4"
-dependencies = [
- "approx",
- "arrayvec",
- "bitflags 2.6.0",
- "downcast-rs",
- "either",
- "ena",
- "log",
- "nalgebra",
- "num-derive",
- "num-traits",
- "ordered-float",
- "rstar",
- "rustc-hash 2.1.1",
- "simba",
- "slab",
- "smallvec",
- "spade",
- "thiserror 1.0.57",
-]
-
-[[package]]
-name = "paste"
-version = "1.0.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
-
-[[package]]
-name = "percent-encoding"
-version = "2.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
-
-[[package]]
-name = "pin-project-lite"
-version = "0.2.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58"
-
-[[package]]
-name = "pkg-config"
-version = "0.3.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec"
-
-[[package]]
-name = "png"
-version = "0.18.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61"
-dependencies = [
- "bitflags 2.6.0",
- "crc32fast",
- "fdeflate",
- "flate2",
- "miniz_oxide",
-]
-
-[[package]]
-name = "polling"
-version = "3.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218"
-dependencies = [
- "cfg-if",
- "concurrent-queue",
- "hermit-abi",
- "pin-project-lite",
- "rustix 1.1.4",
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "ppv-lite86"
-version = "0.2.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
-
-[[package]]
-name = "proc-macro-crate"
-version = "3.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284"
-dependencies = [
- "toml_edit",
-]
-
-[[package]]
-name = "proc-macro2"
-version = "1.0.93"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99"
-dependencies = [
- "unicode-ident",
-]
-
-[[package]]
-name = "profiling"
-version = "1.0.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d"
-dependencies = [
- "profiling-procmacros",
-]
-
-[[package]]
-name = "profiling-procmacros"
-version = "1.0.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30"
-dependencies = [
- "quote",
- "syn",
-]
-
-[[package]]
-name = "pxfm"
-version = "0.1.28"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b5a041e753da8b807c9255f28de81879c78c876392ff2469cde94799b2896b9d"
-
-[[package]]
-name = "quick-xml"
-version = "0.31.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "quote"
-version = "1.0.45"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
-dependencies = [
- "proc-macro2",
-]
-
-[[package]]
-name = "rand"
-version = "0.8.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
-dependencies = [
- "libc",
- "rand_chacha",
- "rand_core",
-]
-
-[[package]]
-name = "rand_chacha"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
-dependencies = [
- "ppv-lite86",
- "rand_core",
-]
-
-[[package]]
-name = "rand_core"
-version = "0.6.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
-dependencies = [
- "getrandom",
-]
-
-[[package]]
-name = "rapier3d"
-version = "0.23.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "37d84644f385b81f065576058bc8f7e3d64e56a66f2f5fc40bfd917774659e12"
-dependencies = [
- "approx",
- "arrayvec",
- "bit-vec",
- "bitflags 2.6.0",
- "crossbeam",
- "downcast-rs",
- "log",
- "nalgebra",
- "num-derive",
- "num-traits",
- "ordered-float",
- "parry3d",
- "profiling",
- "rustc-hash 2.1.1",
- "simba",
- "thiserror 1.0.57",
-]
-
-[[package]]
-name = "raw-window-handle"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42a9830a0e1b9fb145ebb365b8bc4ccd75f290f98c0247deafbbe2c75cefb544"
-
-[[package]]
-name = "rawpointer"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3"
-
-[[package]]
-name = "redox_syscall"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
-dependencies = [
- "bitflags 1.3.2",
-]
-
-[[package]]
-name = "redox_syscall"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
-dependencies = [
- "bitflags 1.3.2",
-]
-
-[[package]]
-name = "redox_users"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b"
-dependencies = [
- "getrandom",
- "libredox 0.1.3",
- "thiserror 2.0.11",
-]
-
-[[package]]
-name = "regex"
-version = "1.11.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-automata",
- "regex-syntax",
-]
-
-[[package]]
-name = "regex-automata"
-version = "0.4.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-syntax",
-]
-
-[[package]]
-name = "regex-syntax"
-version = "0.8.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
-
-[[package]]
-name = "ringbuf"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "79abed428d1fd2a128201cec72c5f6938e2da607c6f3745f769fabea399d950a"
-dependencies = [
- "crossbeam-utils",
-]
-
-[[package]]
-name = "robust"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cbf4a6aa5f6d6888f39e980649f3ad6b666acdce1d78e95b8a2cb076e687ae30"
-
-[[package]]
-name = "rstar"
-version = "0.12.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "421400d13ccfd26dfa5858199c30a5d76f9c54e0dba7575273025b43c5175dbb"
-dependencies = [
- "heapless",
- "num-traits",
- "smallvec",
-]
-
-[[package]]
-name = "rustc-hash"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
-
-[[package]]
-name = "rustc-hash"
-version = "2.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d"
-
-[[package]]
-name = "rustix"
-version = "0.38.31"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949"
-dependencies = [
- "bitflags 2.6.0",
- "errno",
- "libc",
- "linux-raw-sys 0.4.13",
- "windows-sys 0.52.0",
-]
-
-[[package]]
-name = "rustix"
-version = "1.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190"
-dependencies = [
- "bitflags 2.6.0",
- "errno",
- "libc",
- "linux-raw-sys 0.12.1",
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "rustversion"
-version = "1.0.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2"
-
-[[package]]
-name = "ryu"
-version = "1.0.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
-
-[[package]]
-name = "safe_arch"
-version = "0.7.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "96b02de82ddbe1b636e6170c21be622223aea188ef2e139be0a5b219ec215323"
-dependencies = [
- "bytemuck",
-]
-
-[[package]]
-name = "same-file"
-version = "1.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
-dependencies = [
- "winapi-util",
-]
-
-[[package]]
-name = "schannel"
-version = "0.1.28"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1"
-dependencies = [
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "scoped-tls"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
-
-[[package]]
-name = "sctk-adwaita"
-version = "0.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "82b2eaf3a5b264a521b988b2e73042e742df700c4f962cde845d1541adb46550"
-dependencies = [
- "ab_glyph",
- "log",
- "memmap2",
- "smithay-client-toolkit",
- "tiny-skia",
-]
-
-[[package]]
-name = "security-framework"
-version = "2.11.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02"
-dependencies = [
- "bitflags 2.6.0",
- "core-foundation",
- "core-foundation-sys",
- "libc",
- "security-framework-sys",
-]
-
-[[package]]
-name = "security-framework-sys"
-version = "2.15.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0"
-dependencies = [
- "core-foundation-sys",
- "libc",
-]
-
-[[package]]
-name = "send_wrapper"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73"
-
-[[package]]
-name = "serde"
-version = "1.0.228"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
-dependencies = [
- "serde_core",
- "serde_derive",
-]
-
-[[package]]
-name = "serde_core"
-version = "1.0.228"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
-dependencies = [
- "serde_derive",
-]
-
-[[package]]
-name = "serde_derive"
-version = "1.0.228"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "serde_json"
-version = "1.0.128"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8"
-dependencies = [
- "itoa",
- "memchr",
- "ryu",
- "serde",
-]
-
-[[package]]
-name = "sha1"
-version = "0.10.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
-dependencies = [
- "cfg-if",
- "cpufeatures",
- "digest",
-]
-
-[[package]]
-name = "sharded-slab"
-version = "0.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
-dependencies = [
- "lazy_static",
-]
-
-[[package]]
-name = "shlex"
-version = "1.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
-
-[[package]]
-name = "simba"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b3a386a501cd104797982c15ae17aafe8b9261315b5d07e3ec803f2ea26be0fa"
-dependencies = [
- "approx",
- "num-complex",
- "num-traits",
- "paste",
- "wide",
-]
-
-[[package]]
-name = "simd-adler32"
-version = "0.3.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe"
-
-[[package]]
-name = "simple-eyre"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b561532e8ffe7ecf09108c4f662896a9ec3eac4999eba84015ec3dcb8cc630a"
-dependencies = [
- "eyre",
- "indenter",
-]
-
-[[package]]
-name = "slab"
-version = "0.4.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
-dependencies = [
- "autocfg",
-]
-
-[[package]]
-name = "slotmap"
-version = "1.0.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a"
-dependencies = [
- "version_check",
-]
-
-[[package]]
-name = "smallvec"
-version = "1.13.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7"
-
-[[package]]
-name = "smithay-client-toolkit"
-version = "0.18.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "922fd3eeab3bd820d76537ce8f582b1cf951eceb5475c28500c7457d9d17f53a"
-dependencies = [
- "bitflags 2.6.0",
- "calloop",
- "calloop-wayland-source",
- "cursor-icon",
- "libc",
- "log",
- "memmap2",
- "rustix 0.38.31",
- "thiserror 1.0.57",
- "wayland-backend",
- "wayland-client",
- "wayland-csd-frame",
- "wayland-cursor",
- "wayland-protocols",
- "wayland-protocols-wlr",
- "wayland-scanner",
- "xkeysym",
-]
-
-[[package]]
-name = "smol_str"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6845563ada680337a52d43bb0b29f396f2d911616f6573012645b9e3d048a49"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "spade"
-version = "2.13.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ece03ff43cd2a9b57ebf776ea5e78bd30b3b4185a619f041079f4109f385034"
-dependencies = [
- "hashbrown 0.15.2",
- "num-traits",
- "robust",
- "smallvec",
-]
-
-[[package]]
-name = "stable_deref_trait"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
-
-[[package]]
-name = "strict-num"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731"
-
-[[package]]
-name = "strum"
-version = "0.27.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32"
-dependencies = [
- "strum_macros",
-]
-
-[[package]]
-name = "strum_macros"
-version = "0.27.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8"
-dependencies = [
- "heck",
- "proc-macro2",
- "quote",
- "rustversion",
- "syn",
-]
-
-[[package]]
-name = "symphonia"
-version = "0.5.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "815c942ae7ee74737bb00f965fa5b5a2ac2ce7b6c01c0cc169bbeaf7abd5f5a9"
-dependencies = [
- "lazy_static",
- "symphonia-bundle-mp3",
- "symphonia-codec-pcm",
- "symphonia-codec-vorbis",
- "symphonia-core",
- "symphonia-format-ogg",
- "symphonia-format-riff",
- "symphonia-metadata",
-]
-
-[[package]]
-name = "symphonia-bundle-mp3"
-version = "0.5.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c01c2aae70f0f1fb096b6f0ff112a930b1fb3626178fba3ae68b09dce71706d4"
-dependencies = [
- "lazy_static",
- "log",
- "symphonia-core",
- "symphonia-metadata",
-]
-
-[[package]]
-name = "symphonia-codec-pcm"
-version = "0.5.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f395a67057c2ebc5e84d7bb1be71cce1a7ba99f64e0f0f0e303a03f79116f89b"
-dependencies = [
- "log",
- "symphonia-core",
-]
-
-[[package]]
-name = "symphonia-codec-vorbis"
-version = "0.5.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a98765fb46a0a6732b007f7e2870c2129b6f78d87db7987e6533c8f164a9f30"
-dependencies = [
- "log",
- "symphonia-core",
- "symphonia-utils-xiph",
-]
-
-[[package]]
-name = "symphonia-core"
-version = "0.5.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "798306779e3dc7d5231bd5691f5a813496dc79d3f56bf82e25789f2094e022c3"
-dependencies = [
- "arrayvec",
- "bitflags 1.3.2",
- "bytemuck",
- "lazy_static",
- "log",
-]
-
-[[package]]
-name = "symphonia-format-ogg"
-version = "0.5.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ada3505789516bcf00fc1157c67729eded428b455c27ca370e41f4d785bfa931"
-dependencies = [
- "log",
- "symphonia-core",
- "symphonia-metadata",
- "symphonia-utils-xiph",
-]
-
-[[package]]
-name = "symphonia-format-riff"
-version = "0.5.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05f7be232f962f937f4b7115cbe62c330929345434c834359425e043bfd15f50"
-dependencies = [
- "extended",
- "log",
- "symphonia-core",
- "symphonia-metadata",
-]
-
-[[package]]
-name = "symphonia-metadata"
-version = "0.5.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc622b9841a10089c5b18e99eb904f4341615d5aa55bbf4eedde1be721a4023c"
-dependencies = [
- "encoding_rs",
- "lazy_static",
- "log",
- "symphonia-core",
-]
-
-[[package]]
-name = "symphonia-utils-xiph"
-version = "0.5.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "484472580fa49991afda5f6550ece662237b00c6f562c7d9638d1b086ed010fe"
-dependencies = [
- "symphonia-core",
- "symphonia-metadata",
-]
-
-[[package]]
-name = "syn"
-version = "2.0.98"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-ident",
-]
-
-[[package]]
-name = "teleia"
-version = "0.1.0"
-dependencies = [
- "ahash",
- "base64 0.22.1",
- "bimap",
- "bincode",
- "bitflags 2.6.0",
- "byteorder",
- "bytes",
- "console_error_panic_hook",
- "console_log",
- "directories",
- "enum-map",
- "env_logger",
- "getrandom",
- "glam",
- "glfw",
- "glow",
- "gltf",
- "image",
- "js-sys",
- "kira",
- "log",
- "nalgebra",
- "parry3d",
- "polling",
- "rand",
- "rapier3d",
- "serde",
- "serde_json",
- "simple-eyre",
- "strum",
- "tobj",
- "tracing-wasm",
- "tungstenite",
- "wasm-bindgen",
- "wasm-bindgen-futures",
- "web-sys",
- "winit",
-]
-
-[[package]]
-name = "teleia_macros"
-version = "0.1.0"
-dependencies = [
- "env",
- "heck",
- "litrs",
- "walkdir",
-]
-
-[[package]]
-name = "tempfile"
-version = "3.12.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64"
-dependencies = [
- "cfg-if",
- "fastrand",
- "once_cell",
- "rustix 0.38.31",
- "windows-sys 0.59.0",
-]
-
-[[package]]
-name = "thiserror"
-version = "1.0.57"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b"
-dependencies = [
- "thiserror-impl 1.0.57",
-]
-
-[[package]]
-name = "thiserror"
-version = "2.0.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc"
-dependencies = [
- "thiserror-impl 2.0.11",
-]
-
-[[package]]
-name = "thiserror-impl"
-version = "1.0.57"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "thiserror-impl"
-version = "2.0.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "thread_local"
-version = "1.1.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c"
-dependencies = [
- "cfg-if",
- "once_cell",
-]
-
-[[package]]
-name = "tiny-skia"
-version = "0.11.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab"
-dependencies = [
- "arrayref",
- "arrayvec",
- "bytemuck",
- "cfg-if",
- "log",
- "tiny-skia-path",
-]
-
-[[package]]
-name = "tiny-skia-path"
-version = "0.11.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93"
-dependencies = [
- "arrayref",
- "bytemuck",
- "strict-num",
-]
-
-[[package]]
-name = "tobj"
-version = "4.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f7ca3ec0405b0f2f95e0dbcced28882190dc79b0dac63ff82533d256d770223"
-dependencies = [
- "ahash",
-]
-
-[[package]]
-name = "toml_datetime"
-version = "0.6.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1"
-
-[[package]]
-name = "toml_edit"
-version = "0.21.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1"
-dependencies = [
- "indexmap",
- "toml_datetime",
- "winnow",
-]
-
-[[package]]
-name = "tracing"
-version = "0.1.40"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
-dependencies = [
- "pin-project-lite",
- "tracing-attributes",
- "tracing-core",
-]
-
-[[package]]
-name = "tracing-attributes"
-version = "0.1.27"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "tracing-core"
-version = "0.1.32"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
-dependencies = [
- "once_cell",
-]
-
-[[package]]
-name = "tracing-subscriber"
-version = "0.3.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b"
-dependencies = [
- "sharded-slab",
- "thread_local",
- "tracing-core",
-]
-
-[[package]]
-name = "tracing-wasm"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4575c663a174420fa2d78f4108ff68f65bf2fbb7dd89f33749b6e826b3626e07"
-dependencies = [
- "tracing",
- "tracing-subscriber",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "triple_buffer"
-version = "8.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9e66931c8eca6381f0d34656a9341f09bd462010488c1a3bc0acd3f2d08dffce"
-dependencies = [
- "crossbeam-utils",
-]
-
-[[package]]
-name = "ttf-parser"
-version = "0.20.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4"
-
-[[package]]
-name = "tungstenite"
-version = "0.24.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a"
-dependencies = [
- "byteorder",
- "bytes",
- "data-encoding",
- "http",
- "httparse",
- "log",
- "native-tls",
- "rand",
- "sha1",
- "thiserror 1.0.57",
- "utf-8",
-]
-
-[[package]]
-name = "typenum"
-version = "1.18.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
-
-[[package]]
-name = "unicode-ident"
-version = "1.0.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
-
-[[package]]
-name = "unicode-segmentation"
-version = "1.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202"
-
-[[package]]
-name = "unty"
-version = "0.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae"
-
-[[package]]
-name = "urlencoding"
-version = "2.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da"
-
-[[package]]
-name = "utf-8"
-version = "0.7.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
-
-[[package]]
-name = "utf8parse"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
-
-[[package]]
-name = "vcpkg"
-version = "0.2.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
-
-[[package]]
-name = "version_check"
-version = "0.9.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
-
-[[package]]
-name = "virtue"
-version = "0.0.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1"
-
-[[package]]
-name = "walkdir"
-version = "2.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
-dependencies = [
- "same-file",
- "winapi-util",
-]
-
-[[package]]
-name = "wasi"
-version = "0.11.0+wasi-snapshot-preview1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
-
-[[package]]
-name = "wasm-bindgen"
-version = "0.2.100"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
-dependencies = [
- "cfg-if",
- "once_cell",
- "rustversion",
- "wasm-bindgen-macro",
-]
-
-[[package]]
-name = "wasm-bindgen-backend"
-version = "0.2.100"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
-dependencies = [
- "bumpalo",
- "log",
- "proc-macro2",
- "quote",
- "syn",
- "wasm-bindgen-shared",
-]
-
-[[package]]
-name = "wasm-bindgen-futures"
-version = "0.4.41"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "877b9c3f61ceea0e56331985743b13f3d25c406a7098d45180fb5f09bc19ed97"
-dependencies = [
- "cfg-if",
- "js-sys",
- "wasm-bindgen",
- "web-sys",
-]
-
-[[package]]
-name = "wasm-bindgen-macro"
-version = "0.2.100"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
-dependencies = [
- "quote",
- "wasm-bindgen-macro-support",
-]
-
-[[package]]
-name = "wasm-bindgen-macro-support"
-version = "0.2.100"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
- "wasm-bindgen-backend",
- "wasm-bindgen-shared",
-]
-
-[[package]]
-name = "wasm-bindgen-shared"
-version = "0.2.100"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
-dependencies = [
- "unicode-ident",
-]
-
-[[package]]
-name = "wayland-backend"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d50fa61ce90d76474c87f5fc002828d81b32677340112b4ef08079a9d459a40"
-dependencies = [
- "cc",
- "downcast-rs",
- "rustix 0.38.31",
- "scoped-tls",
- "smallvec",
- "wayland-sys",
-]
-
-[[package]]
-name = "wayland-client"
-version = "0.31.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "82fb96ee935c2cea6668ccb470fb7771f6215d1691746c2d896b447a00ad3f1f"
-dependencies = [
- "bitflags 2.6.0",
- "rustix 0.38.31",
- "wayland-backend",
- "wayland-scanner",
-]
-
-[[package]]
-name = "wayland-csd-frame"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e"
-dependencies = [
- "bitflags 2.6.0",
- "cursor-icon",
- "wayland-backend",
-]
-
-[[package]]
-name = "wayland-cursor"
-version = "0.31.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "71ce5fa868dd13d11a0d04c5e2e65726d0897be8de247c0c5a65886e283231ba"
-dependencies = [
- "rustix 0.38.31",
- "wayland-client",
- "xcursor",
-]
-
-[[package]]
-name = "wayland-protocols"
-version = "0.31.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f81f365b8b4a97f422ac0e8737c438024b5951734506b0e1d775c73030561f4"
-dependencies = [
- "bitflags 2.6.0",
- "wayland-backend",
- "wayland-client",
- "wayland-scanner",
-]
-
-[[package]]
-name = "wayland-protocols-plasma"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23803551115ff9ea9bce586860c5c5a971e360825a0309264102a9495a5ff479"
-dependencies = [
- "bitflags 2.6.0",
- "wayland-backend",
- "wayland-client",
- "wayland-protocols",
- "wayland-scanner",
-]
-
-[[package]]
-name = "wayland-protocols-wlr"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6"
-dependencies = [
- "bitflags 2.6.0",
- "wayland-backend",
- "wayland-client",
- "wayland-protocols",
- "wayland-scanner",
-]
-
-[[package]]
-name = "wayland-scanner"
-version = "0.31.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "63b3a62929287001986fb58c789dce9b67604a397c15c611ad9f747300b6c283"
-dependencies = [
- "proc-macro2",
- "quick-xml",
- "quote",
-]
-
-[[package]]
-name = "wayland-sys"
-version = "0.31.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "15a0c8eaff5216d07f226cb7a549159267f3467b289d9a2e52fd3ef5aae2b7af"
-dependencies = [
- "dlib",
- "log",
- "once_cell",
- "pkg-config",
-]
-
-[[package]]
-name = "web-sys"
-version = "0.3.68"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "96565907687f7aceb35bc5fc03770a8a0471d82e479f25832f54a0e3f4b28446"
-dependencies = [
- "js-sys",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "web-time"
-version = "0.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa30049b1c872b72c89866d458eae9f20380ab280ffd1b1e18df2d3e2d98cfe0"
-dependencies = [
- "js-sys",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "wide"
-version = "0.7.32"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41b5576b9a81633f3e8df296ce0063042a73507636cbe956c61133dd7034ab22"
-dependencies = [
- "bytemuck",
- "safe_arch",
-]
-
-[[package]]
-name = "winapi"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
-dependencies = [
- "winapi-i686-pc-windows-gnu",
- "winapi-x86_64-pc-windows-gnu",
-]
-
-[[package]]
-name = "winapi-i686-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
-
-[[package]]
-name = "winapi-util"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596"
-dependencies = [
- "winapi",
-]
-
-[[package]]
-name = "winapi-x86_64-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
-
-[[package]]
-name = "windows"
-version = "0.54.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49"
-dependencies = [
- "windows-core",
- "windows-targets 0.52.6",
-]
-
-[[package]]
-name = "windows-core"
-version = "0.54.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65"
-dependencies = [
- "windows-result",
- "windows-targets 0.52.6",
-]
-
-[[package]]
-name = "windows-link"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
-
-[[package]]
-name = "windows-result"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8"
-dependencies = [
- "windows-targets 0.52.6",
-]
-
-[[package]]
-name = "windows-sys"
-version = "0.45.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
-dependencies = [
- "windows-targets 0.42.2",
-]
-
-[[package]]
-name = "windows-sys"
-version = "0.48.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
-dependencies = [
- "windows-targets 0.48.5",
-]
-
-[[package]]
-name = "windows-sys"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
-dependencies = [
- "windows-targets 0.52.6",
-]
-
-[[package]]
-name = "windows-sys"
-version = "0.59.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
-dependencies = [
- "windows-targets 0.52.6",
-]
-
-[[package]]
-name = "windows-sys"
-version = "0.61.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
-dependencies = [
- "windows-link",
-]
-
-[[package]]
-name = "windows-targets"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
-dependencies = [
- "windows_aarch64_gnullvm 0.42.2",
- "windows_aarch64_msvc 0.42.2",
- "windows_i686_gnu 0.42.2",
- "windows_i686_msvc 0.42.2",
- "windows_x86_64_gnu 0.42.2",
- "windows_x86_64_gnullvm 0.42.2",
- "windows_x86_64_msvc 0.42.2",
-]
-
-[[package]]
-name = "windows-targets"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
-dependencies = [
- "windows_aarch64_gnullvm 0.48.5",
- "windows_aarch64_msvc 0.48.5",
- "windows_i686_gnu 0.48.5",
- "windows_i686_msvc 0.48.5",
- "windows_x86_64_gnu 0.48.5",
- "windows_x86_64_gnullvm 0.48.5",
- "windows_x86_64_msvc 0.48.5",
-]
-
-[[package]]
-name = "windows-targets"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
-dependencies = [
- "windows_aarch64_gnullvm 0.52.6",
- "windows_aarch64_msvc 0.52.6",
- "windows_i686_gnu 0.52.6",
- "windows_i686_gnullvm",
- "windows_i686_msvc 0.52.6",
- "windows_x86_64_gnu 0.52.6",
- "windows_x86_64_gnullvm 0.52.6",
- "windows_x86_64_msvc 0.52.6",
-]
-
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
-
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
-
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
-
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
-
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
-
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
-
-[[package]]
-name = "windows_i686_gnu"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
-
-[[package]]
-name = "windows_i686_gnu"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
-
-[[package]]
-name = "windows_i686_gnu"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
-
-[[package]]
-name = "windows_i686_gnullvm"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
-
-[[package]]
-name = "windows_i686_msvc"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
-
-[[package]]
-name = "windows_i686_msvc"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
-
-[[package]]
-name = "windows_i686_msvc"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
-
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
-
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
-
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
-
-[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
-
-[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
-
-[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
-
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
-
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
-
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
-
-[[package]]
-name = "winit"
-version = "0.29.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d59ad965a635657faf09c8f062badd885748428933dad8e8bdd64064d92e5ca"
-dependencies = [
- "ahash",
- "android-activity",
- "atomic-waker",
- "bitflags 2.6.0",
- "bytemuck",
- "calloop",
- "cfg_aliases",
- "core-foundation",
- "core-graphics",
- "cursor-icon",
- "icrate",
- "js-sys",
- "libc",
- "log",
- "memmap2",
- "ndk",
- "ndk-sys",
- "objc2 0.4.1",
- "once_cell",
- "orbclient",
- "percent-encoding",
- "raw-window-handle",
- "redox_syscall 0.3.5",
- "rustix 0.38.31",
- "sctk-adwaita",
- "serde",
- "smithay-client-toolkit",
- "smol_str",
- "unicode-segmentation",
- "wasm-bindgen",
- "wasm-bindgen-futures",
- "wayland-backend",
- "wayland-client",
- "wayland-protocols",
- "wayland-protocols-plasma",
- "web-sys",
- "web-time",
- "windows-sys 0.48.0",
- "x11-dl",
- "x11rb",
- "xkbcommon-dl",
-]
-
-[[package]]
-name = "winnow"
-version = "0.5.40"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "x11-dl"
-version = "2.21.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f"
-dependencies = [
- "libc",
- "once_cell",
- "pkg-config",
-]
-
-[[package]]
-name = "x11rb"
-version = "0.13.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8f25ead8c7e4cba123243a6367da5d3990e0d3affa708ea19dce96356bd9f1a"
-dependencies = [
- "as-raw-xcb-connection",
- "gethostname",
- "libc",
- "libloading",
- "once_cell",
- "rustix 0.38.31",
- "x11rb-protocol",
-]
-
-[[package]]
-name = "x11rb-protocol"
-version = "0.13.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e63e71c4b8bd9ffec2c963173a4dc4cbde9ee96961d4fcb4429db9929b606c34"
-
-[[package]]
-name = "xcursor"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a0ccd7b4a5345edfcd0c3535718a4e9ff7798ffc536bb5b5a0e26ff84732911"
-
-[[package]]
-name = "xkbcommon-dl"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5"
-dependencies = [
- "bitflags 2.6.0",
- "dlib",
- "log",
- "once_cell",
- "xkeysym",
-]
-
-[[package]]
-name = "xkeysym"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "054a8e68b76250b253f671d1268cb7f1ae089ec35e195b2efb2a4e9a836d0621"
-
-[[package]]
-name = "zerocopy"
-version = "0.7.32"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be"
-dependencies = [
- "zerocopy-derive",
-]
-
-[[package]]
-name = "zerocopy-derive"
-version = "0.7.32"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "zune-core"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb8a0807f7c01457d0379ba880ba6322660448ddebc890ce29bb64da71fb40f9"
-
-[[package]]
-name = "zune-jpeg"
-version = "0.5.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296"
-dependencies = [
- "zune-core",
-]
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/Cargo.toml b/2026/games_submissions/rpc2dot0/vendor/teleia/Cargo.toml
deleted file mode 100644
index f5037ea..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/Cargo.toml
+++ /dev/null
@@ -1,19 +0,0 @@
-[workspace]
-resolver = "2"
-members = ["crates/*"]
-
-[workspace.package]
-version = "0.1.0"
-edition = "2024"
-authors = ["LLLL Colonq <llll@colonq.computer>"]
-
-[workspace.metadata.crane]
-name = "teleia"
-
-[profile.dev.package."*"]
-opt-level = 2
-
-[workspace.lints.clippy]
-all = "deny"
-pedantic = "deny"
-nursery = "deny" \ No newline at end of file
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/Cargo.toml b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/Cargo.toml
deleted file mode 100644
index 90a0cca..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/Cargo.toml
+++ /dev/null
@@ -1,53 +0,0 @@
-[package]
-name = "teleia"
-version.workspace = true
-edition.workspace = true
-authors.workspace = true
-
-[lib]
-crate-type = ["cdylib", "rlib"]
-
-[dependencies]
-strum = { version = "0.27.1", features = ["derive"] } # utility macros for enums
-glow = { version = "=0.13.1", features = [] } # rendering
-tobj = "=4.0.1" # loader for .obj meshes loader
-ahash = "=0.8.10" # dependency of tobj
-gltf = { git = "https://github.com/lcolonq/gltf", features = ["extras", "import", "names", "utils"] } # loader for .gltf scenes
-image = { version = "0.25.10", default-features = false, features = ["jpeg", "png"] } # texture loader
-# cosmic-text = { version = "*", default-features = false, features = ["std", "swash"] } # advanced text rendering
-glam = "0.29.2" # linear algebra
-log = "0.4.21" # logging
-rand = { version = "=0.8.5", features = ["small_rng"] } # rng
-serde = { version = "1.0.228", features = ["derive"] } # serialization
-serde_json = "1.0.128" # serialize JSON
-bincode = { version = "2.0.1", features = ["serde"] } # binary serialization
-enum-map = "2.7.3" # fast maps with enums as keys
-bimap = "0.6.3" # bijective maps
-# reqwest = "*" # http requests
-bytes = "*" # bytes for http responses
-bitflags = { version = "2.6.0", features = ["serde"] } # bitwise flags
-simple-eyre = { version = "0.3.1", default-features = false } # error reporting and formatting
-rapier3d = "0.23.1" # rigid-body physics
-parry3d = "0.18.0" # collision detection
-nalgebra = {version = "0.33.2", features = ["convert-glam029"]} # linear algebra library for rapier3d
-byteorder = "1.5.0" # read numbers in particular endianness
-base64 = "0.22.1" # encode/decode base64
-
-[target.'cfg(target_arch = "wasm32")'.dependencies]
-winit = {version = "=0.29.15", features = ["serde"]} # windowing and events
-getrandom = {version = "*", features = ["js"]} # rng in the browser
-console_log = "*" # log to browser console
-console_error_panic_hook = "*" # log to browser console on panic
-tracing-wasm = "*" # trace performance in browser
-wasm-bindgen = "=0.2.100" # interface with javascript
-wasm-bindgen-futures = "*" # interface with async javascript
-js-sys = "*" # browser APIs to interact with JS runtime (e.g. run WASM)
-web-sys = { version = "*", features = ["Document", "Window", "Element", "HtmlCanvasElement", "WebGl2RenderingContext", "Headers", "Request", "RequestInit", "RequestMode", "Response", "Performance", "PerformanceTiming", "AudioContext", "AudioNode", "GainNode", "AudioParam", "AudioDestinationNode", "AudioBuffer", "AudioBufferSourceNode", "BinaryType", "Blob", "CloseEvent", "ErrorEvent", "FileReader", "MessageEvent", "ProgressEvent", "WebSocket", "Storage"] }
-
-[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
-env_logger = "0.11.5" # configurable logging to stdout
-glfw = { git = "https://github.com/lcolonq/glfw-rs", features = ["serde"] } # window management
-kira = { version = "=0.9.6", default-features = false, features = ["cpal", "ogg", "mp3", "wav"] } # audio
-directories = { git = "https://github.com/lcolonq/directories-rs" } # standard system directories
-polling = "3.11.0" # interface to epoll
-tungstenite = { version = "0.24.0", features = ["native-tls"] } # websockets \ No newline at end of file
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/build.rs b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/build.rs
deleted file mode 100644
index 42743ce..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/build.rs
+++ /dev/null
@@ -1,15 +0,0 @@
-fn main() {
- /*println!("cargo::rerun-if-changed=../../flake.lock");
- match &*std::env::var("CARGO_CFG_TARGET_ARCH").unwrap() {
- "x86_64" => if let Ok(p) = std::env::var("LIBCOLONQ_PIT_NATIVE") {
- println!("cargo::rustc-link-search={}", p);
- },
- "wasm32" => if let Ok(p) = std::env::var("LIBCOLONQ_PIT_WASM") {
-
- println!("cargo::rustc-link-search={}", p);
- },
- _ => eprintln!("warning: building for unknown architecture!"),
- }
- println!("cargo::rustc-link-lib=static=colonq-pit");*/
- eprint!("we are not using pit at all, this is a fork of teleia where scripting is disabled");
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/fonts/default.png b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/fonts/default.png
deleted file mode 100644
index 7b1d2a3..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/fonts/default.png
+++ /dev/null
Binary files differ
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/fonts/small.png b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/fonts/small.png
deleted file mode 100644
index 1d020f7..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/fonts/small.png
+++ /dev/null
Binary files differ
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/meshes/square.obj b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/meshes/square.obj
deleted file mode 100644
index 7acdef6..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/meshes/square.obj
+++ /dev/null
@@ -1,15 +0,0 @@
-# Blender 3.6.2
-# www.blender.org
-o Cube
-v -1.000000 -1.000000 0.000000
-v 1.000000 -1.000000 0.000000
-v -1.000000 1.000000 0.000000
-v 1.000000 1.000000 0.000000
-vn -0.0000 -0.0000 -1.0000
-vt 0.0 1.0
-vt 1.0 0.0
-vt 0.0 0.0
-vt 1.0 1.0
-s 0
-f 3/1/1 2/2/1 1/3/1
-f 3/1/1 4/4/1 2/2/1
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/bitmap/frag.glsl b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/bitmap/frag.glsl
deleted file mode 100644
index fbc8d71..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/bitmap/frag.glsl
+++ /dev/null
@@ -1,15 +0,0 @@
-#version 300 es
-precision highp float;
-
-uniform sampler2D texture_data;
-
-in vec2 vertex_texcoord;
-in vec3 vertex_color;
-out vec4 frag_color;
-
-void main() {
- vec4 texel = texture(texture_data, vertex_texcoord);
- if (texel.rgb == vec3(0.0, 0.0, 0.0)) discard;
- texel.rgb = vertex_color;
- frag_color = texel;
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/bitmap/vert.glsl b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/bitmap/vert.glsl
deleted file mode 100644
index eee22fc..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/bitmap/vert.glsl
+++ /dev/null
@@ -1,20 +0,0 @@
-#version 300 es
-precision highp float;
-
-in vec3 vertex;
-in vec2 texcoord;
-in vec3 color;
-
-uniform mat4 view;
-uniform mat4 position;
-uniform mat4 projection;
-
-out vec2 vertex_texcoord;
-out vec3 vertex_color;
-
-void main() {
- vertex_texcoord = texcoord;
- vertex_color = color;
- vec3 pos = (position * vec4(vertex, 1.0)).xyz;
- gl_Position = projection * view * vec4(pos, 1.0);
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/common/frag.glsl b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/common/frag.glsl
deleted file mode 100644
index fee9b80..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/common/frag.glsl
+++ /dev/null
@@ -1,160 +0,0 @@
-#version 300 es
-precision highp float;
-
-uniform vec3 camera_pos;
-uniform float time;
-
-uniform vec3 light_ambient_color;
-uniform vec3 light_dir;
-uniform vec3 light_dir_color;
-uniform int light_count;
-uniform vec3 light_pos[5];
-uniform vec3 light_color[5];
-uniform vec2 light_attenuation[5];
-uniform highp sampler2DShadow light_shadowbuffer_dir;
-uniform samplerCube light_shadowbuffer_point[5];
-
-uniform int has_point_shadows;
-
-in vec2 vertex_texcoord;
-in vec3 vertex_normal;
-in vec3 vertex_fragpos;
-in vec4 vertex_fragpos_shadow_dir;
-in vec3 vertex_view_vector;
-
-out vec4 frag_color;
-
-mat3 compute_tbn() {
- vec3 p = -vertex_view_vector;
- vec3 normal = normalize(vertex_normal);
- vec3 dpx = dFdx(p);
- vec3 dpy = dFdy(p);
- vec2 duvx = dFdx(vertex_texcoord);
- vec2 duvy = dFdy(vertex_texcoord);
- vec3 dpyperp = cross(dpy, normal);
- vec3 dpxperp = cross(normal, dpx);
- vec3 tangent = dpyperp * duvx.x + dpxperp * duvy.x;
- vec3 bitangent = dpyperp * duvx.y + dpxperp * duvy.y;
- float invmax = inversesqrt(max(dot(bitangent, bitangent), dot(bitangent, bitangent)));
- return mat3(-tangent * invmax, -bitangent * invmax, normal);
-}
-
-vec4 normal_as_color(vec3 n) {
- float r = (128.0 + 127.0 * n.r) / 255.0;
- float g = (128.0 + 127.0 * n.g) / 255.0;
- float b = (128.0 + 127.0 * n.b) / 255.0;
- return vec4(r, g, b, 1.0);
-}
-
-vec3 dir_light(vec3 normal) {
- return max(dot(normal, -normalize(light_dir)), 0.0) * light_dir_color;
-}
-
-float dir_shadow(vec3 normal) {
- vec3 proj = vertex_fragpos_shadow_dir.xyz / vertex_fragpos_shadow_dir.w;
- float bias = 0.002;
- // float current_depth = proj.z;
- // float bias = max(0.05 * (1.0 - dot(normal, -normalize(light_dir))), 0.005);
- proj.z -= bias;
- proj *= 0.5; proj += 0.5;
- if (proj.z > 1.0) return 0.0;
- return 1.0 - texture(light_shadowbuffer_dir, proj.xyz);
-}
-
-float point_shadow(vec3 normal, vec3 shadow_vector, float closest_depth) {
- closest_depth *= 25.0;
- float current_depth = length(shadow_vector);
- float bias = max(0.1 * (1.0 - dot(normal, normalize(shadow_vector))), 0.005);
- bias = min(bias + current_depth * 0.01, 0.2);
- float shadow = current_depth - bias > closest_depth ? 1.0 : 0.0;
- return shadow;
-}
-
-vec3 point_light(vec3 normal, const int idx) {
- vec3 pos = light_pos[idx];
- vec3 color = light_color[idx];
- float linear = light_attenuation[idx].x;
- float quadratic = light_attenuation[idx].y;
- vec3 light_vector = pos - vertex_fragpos;
- float distance = length(light_vector);
- float attenuation = 1.0 / (1.0 + distance * linear + distance * distance * quadratic);
-
- float directional = max(dot(normal.xyz, normalize(light_vector)), 0.0);
- vec3 directional_light = color * directional;
-
- vec3 view_dir = normalize(camera_pos - vertex_fragpos);
- vec3 reflect_dir = reflect(-normalize(light_vector), normalize(normal.xyz));
- float specular = pow(max(dot(view_dir, reflect_dir), 0.0), 32.0);
- vec3 specular_light = 0.5 * specular * color;
- // return (directional_light + specular_light) * attenuation;
- return directional_light * attenuation;
-}
-
-vec3 point_light_billboard(const int idx) {
- vec3 pos = light_pos[idx];
- vec3 color = light_color[idx];
- float linear = light_attenuation[idx].x;
- float quadratic = light_attenuation[idx].y;
- vec3 light_vector = pos - vertex_fragpos;
- float distance = length(light_vector);
- float attenuation = 1.0 / (1.0 + distance * linear + distance * distance * quadratic);
-
- return color * attenuation;
-}
-
-vec3 compute_lighting(vec3 normal) {
- vec3 ambient_light = light_ambient_color;
-
- vec3 from_dir = dir_light(normal) * (1.0 - dir_shadow(normal));
-
- vec3 shadow_vector[5];
- for (int i = 0; i < light_count; ++i) {
- shadow_vector[i] = vertex_fragpos - light_pos[i];
- shadow_vector[i].x *= -1.0;
- }
-
- // can only index array of samplers with a constant, hence the weird setup
- #define SAMPLE_SHADOW(n) n < light_count ? texture(light_shadowbuffer_point[n], shadow_vector[n]).r : 1.0
- float shadow_depth[5];
- shadow_depth[0] = SAMPLE_SHADOW(0);
- shadow_depth[1] = SAMPLE_SHADOW(1);
- shadow_depth[2] = SAMPLE_SHADOW(2);
- shadow_depth[3] = SAMPLE_SHADOW(3);
- shadow_depth[4] = SAMPLE_SHADOW(4);
-
- vec3 from_points = vec3(0.0, 0.0, 0.0);
- for (int i = 0; i < light_count; ++i) {
- from_points += has_point_shadows != 0
- ? point_light(normal, i) * (1.0 - point_shadow(normal, shadow_vector[i], shadow_depth[i]))
- : point_light(normal, i);
- }
-
- return (ambient_light + from_dir + from_points);
-}
-
-vec3 compute_lighting_noshadow(vec3 normal) {
- vec3 ambient_light = light_ambient_color;
-
- vec3 from_dir = dir_light(normal);
-
- vec3 from_points = vec3(0.0, 0.0, 0.0);
- for (int i = 0; i < light_count; ++i) {
- from_points += point_light(normal, i);
- }
-
- return (ambient_light + from_dir + from_points);
-}
-
-vec3 compute_lighting_billboard(vec3 normal) {
- vec3 ambient_light = light_ambient_color;
-
- vec3 from_dir = light_dir_color / 2.0;
-
- vec3 from_points = vec3(0.0, 0.0, 0.0);
- for (int i = 0; i < light_count; ++i) {
- from_points += point_light_billboard(i);
- }
-
- return (ambient_light + from_dir + from_points);
-}
-#line 0
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/common/vert.glsl b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/common/vert.glsl
deleted file mode 100644
index 06f7e30..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/common/vert.glsl
+++ /dev/null
@@ -1,30 +0,0 @@
-#version 300 es
-precision highp float;
-
-in vec3 vertex;
-in vec3 normal;
-in vec2 texcoord;
-
-uniform mat4 view;
-uniform mat4 position;
-uniform mat4 projection;
-uniform mat4 normal_matrix;
-uniform mat4 lightspace_matrix;
-uniform vec3 camera_pos;
-
-out vec2 vertex_texcoord;
-out vec3 vertex_normal;
-out vec3 vertex_fragpos;
-out vec4 vertex_fragpos_shadow_dir;
-out vec3 vertex_view_vector;
-
-void default_main()
-{
- vertex_texcoord = texcoord;
- vertex_normal = (normal_matrix * vec4(normal, 1.0)).xyz;
- vec3 pos = (position * vec4(vertex, 1.0)).xyz;
- vertex_fragpos = pos;
- vertex_fragpos_shadow_dir = lightspace_matrix * vec4(pos, 1.0);
- vertex_view_vector = camera_pos - pos;
- gl_Position = projection * view * vec4(pos, 1.0);
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/flat/frag.glsl b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/flat/frag.glsl
deleted file mode 100644
index fa305e6..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/flat/frag.glsl
+++ /dev/null
@@ -1,12 +0,0 @@
-uniform sampler2D texture_data;
-
-uniform float transparency;
-
-void main()
-{
- float opacity = 1.0 - clamp(transparency, 0.0, 1.0);
- vec2 tcfull = vec2(vertex_texcoord.x, 1.0 - vertex_texcoord.y);
- vec4 texel = texture(texture_data, tcfull);
- texel.a *= opacity;
- frag_color = texel;
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/flat/vert.glsl b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/flat/vert.glsl
deleted file mode 100644
index 6e796cc..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/flat/vert.glsl
+++ /dev/null
@@ -1,4 +0,0 @@
-void main()
-{
- default_main();
-} \ No newline at end of file
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/scale/frag.glsl b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/scale/frag.glsl
deleted file mode 100644
index 257c1b7..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/scale/frag.glsl
+++ /dev/null
@@ -1,12 +0,0 @@
-#version 300 es
-precision highp float;
-
-uniform sampler2D texture_data;
-
-in vec2 vertex_texcoord;
-out vec4 frag_color;
-
-void main() {
- vec4 texel = texture(texture_data, vertex_texcoord);
- frag_color = texel;
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/scale/vert.glsl b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/scale/vert.glsl
deleted file mode 100644
index d48f78d..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/scale/vert.glsl
+++ /dev/null
@@ -1,22 +0,0 @@
-#version 300 es
-precision highp float;
-
-out vec2 vertex_texcoord;
-
-void main() {
- const vec2 positions[4] = vec2[](
- vec2(-1, -1),
- vec2(+1, -1),
- vec2(-1, +1),
- vec2(+1, +1)
- );
- const vec2 coords[4] = vec2[](
- vec2(0, 0),
- vec2(1, 0),
- vec2(0, 1),
- vec2(1, 1)
- );
-
- vertex_texcoord = coords[gl_VertexID];
- gl_Position = vec4(positions[gl_VertexID], 0.0, 1.0);
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/scene/frag.glsl b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/scene/frag.glsl
deleted file mode 100644
index 554c25d..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/scene/frag.glsl
+++ /dev/null
@@ -1,11 +0,0 @@
-uniform sampler2D texture_data;
-
-void main()
-{
- vec4 texel = texture(texture_data, vertex_texcoord);
- if (texel.a != 1.0) {
- discard;
- }
-
- frag_color = vec4(texel.rgb, texel.a);
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/scene/vert.glsl b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/scene/vert.glsl
deleted file mode 100644
index c66a816..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/scene/vert.glsl
+++ /dev/null
@@ -1,18 +0,0 @@
-in vec4 joint;
-in vec4 weight;
-
-uniform mat4 joint_matrices[128];
-
-void main()
-{
- vertex_texcoord = texcoord;
- vertex_normal = (normal_matrix * vec4(normal, 1.0)).xyz;
- mat4 skin
- = weight.x * joint_matrices[int(joint.x)]
- + weight.y * joint_matrices[int(joint.y)]
- + weight.z * joint_matrices[int(joint.z)]
- + weight.w * joint_matrices[int(joint.w)];
- vec3 pos = (position * skin * vec4(vertex, 1.0)).xyz;
- vertex_view_vector = camera_pos - pos;
- gl_Position = projection * view * vec4(pos, 1.0);
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/test/frag.glsl b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/test/frag.glsl
deleted file mode 100644
index 954a9d2..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/test/frag.glsl
+++ /dev/null
@@ -1,23 +0,0 @@
-// uniform int has_normal_map;
-// uniform sampler2D normal_map;
-
-uniform sampler2D texture_data;
-
-void main()
-{
- vec2 inverted_texcoord = vec2(vertex_texcoord.x, 1.0 - vertex_texcoord.y);
- vec4 texel = texture(texture_data, inverted_texcoord);
- if (texel.a != 1.0) {
- discard;
- }
-
- // mat3 tbn = compute_tbn();
- // vec3 normal = has_normal_map != 0
- // ? normalize(tbn * (texture(normal_map, inverted_texcoord).xyz * 2.0 - 1.0))
- // : normalize(vertex_normal);
- vec3 normal = normalize(vertex_normal);
-
- vec3 lighting = compute_lighting_noshadow(normal);
-
- frag_color = vec4(texel.rgb * lighting, texel.a);
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/test/vert.glsl b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/test/vert.glsl
deleted file mode 100644
index 6e796cc..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/test/vert.glsl
+++ /dev/null
@@ -1,4 +0,0 @@
-void main()
-{
- default_main();
-} \ No newline at end of file
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/tiled/frag.glsl b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/tiled/frag.glsl
deleted file mode 100644
index 257c1b7..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/tiled/frag.glsl
+++ /dev/null
@@ -1,12 +0,0 @@
-#version 300 es
-precision highp float;
-
-uniform sampler2D texture_data;
-
-in vec2 vertex_texcoord;
-out vec4 frag_color;
-
-void main() {
- vec4 texel = texture(texture_data, vertex_texcoord);
- frag_color = texel;
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/tiled/vert.glsl b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/tiled/vert.glsl
deleted file mode 100644
index a7567f4..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/tiled/vert.glsl
+++ /dev/null
@@ -1,14 +0,0 @@
-#version 300 es
-precision highp float;
-
-in vec2 vertex;
-in vec2 texcoord;
-
-uniform mat4 transform;
-
-out vec2 vertex_texcoord;
-
-void main() {
- vertex_texcoord = texcoord;
- gl_Position = transform * vec4(vertex, 0.0, 1.0);
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/truetype/frag.glsl b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/truetype/frag.glsl
deleted file mode 100644
index d472c09..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/truetype/frag.glsl
+++ /dev/null
@@ -1,16 +0,0 @@
-#version 300 es
-precision highp float;
-
-uniform sampler2D texture_data;
-
-in vec2 vertex_texcoord;
-in vec3 vertex_color;
-out vec4 frag_color;
-
-void main()
-{
- float val = texture(texture_data, vertex_texcoord).r;
- if (val == 0.0) discard;
- vec4 texel = vec4(vertex_color, val);
- frag_color = texel;
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/truetype/vert.glsl b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/truetype/vert.glsl
deleted file mode 100644
index a501e0a..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/truetype/vert.glsl
+++ /dev/null
@@ -1,17 +0,0 @@
-#version 300 es
-precision highp float;
-
-in vec2 vertex;
-in vec2 texcoord;
-in vec3 color;
-
-uniform mat4 transform;
-
-out vec2 vertex_texcoord;
-out vec3 vertex_color;
-
-void main() {
- vertex_texcoord = texcoord;
- vertex_color = color;
- gl_Position = transform * vec4(vertex, 0.0, 1.0);
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/uber/frag.glsl b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/uber/frag.glsl
deleted file mode 100644
index 8e7b752..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/uber/frag.glsl
+++ /dev/null
@@ -1,193 +0,0 @@
-uniform highp int flags;
-
-uniform vec3 camera_pos;
-uniform float time;
-
-uniform vec2 sprite_offset;
-uniform vec2 sprite_dims;
-
-uniform vec4 color;
-uniform sampler2D texture_color;
-uniform sampler2D texture_normal;
-uniform vec3 light_ambient_color;
-uniform vec3 light_dir;
-uniform vec3 light_dir_color;
-uniform int light_count;
-uniform vec3 light_pos[5];
-uniform vec3 light_color[5];
-uniform vec2 light_attenuation[5];
-
-uniform int effect_flip;
-uniform float effect_flash;
-uniform float effect_hueshift;
-uniform float effect_huescale;
-
-in vec2 vertex_texcoord;
-in vec3 vertex_color;
-in vec3 vertex_normal;
-in vec3 vertex_fragpos;
-in vec4 vertex_fragpos_shadow_dir;
-in vec3 vertex_view_vector;
-
-out vec4 frag_color;
-
-bool flag(int mask) {
- return (flags & mask) != 0;
-}
-
-mat3 compute_tbn() {
- vec3 p = -vertex_view_vector;
- vec3 normal = normalize(vertex_normal);
- vec3 dpx = dFdx(p);
- vec3 dpy = dFdy(p);
- vec2 duvx = dFdx(vertex_texcoord);
- vec2 duvy = dFdy(vertex_texcoord);
- vec3 dpyperp = cross(dpy, normal);
- vec3 dpxperp = cross(normal, dpx);
- vec3 tangent = dpyperp * duvx.x + dpxperp * duvy.x;
- vec3 bitangent = dpyperp * duvx.y + dpxperp * duvy.y;
- float invmax = inversesqrt(max(dot(bitangent, bitangent), dot(bitangent, bitangent)));
- float flip = flag(FLIP_TEXTURE) ? 1.0 : -1.0;
- return mat3(-tangent * invmax, flip * bitangent * invmax, normal);
-
-}
-
-vec4 normal_as_color(vec3 n) {
- float r = (128.0 + 127.0 * n.r) / 255.0;
- float g = (128.0 + 127.0 * n.g) / 255.0;
- float b = (128.0 + 127.0 * n.b) / 255.0;
- return vec4(r, g, b, 1.0);
-}
-
-vec3 dir_light(vec3 normal) {
- return max(dot(normal, -normalize(light_dir)), 0.0) * light_dir_color;
-}
-
-vec3 point_light(vec3 normal, const int idx) {
- vec3 pos = light_pos[idx];
- vec3 color = light_color[idx];
- float linear = light_attenuation[idx].x;
- float quadratic = light_attenuation[idx].y;
- vec3 light_vector = pos - vertex_fragpos;
- float distance = length(light_vector);
- float attenuation = 1.0 / (1.0 + distance * linear + distance * distance * quadratic);
-
- float directional = max(dot(normal.xyz, normalize(light_vector)), 0.0);
- vec3 directional_light = color * directional;
-
- vec3 view_dir = normalize(camera_pos - vertex_fragpos);
- vec3 reflect_dir = reflect(-normalize(light_vector), normalize(normal.xyz));
- float specular = pow(max(dot(view_dir, reflect_dir), 0.0), 32.0);
- vec3 specular_light = 0.5 * specular * color;
- // return (directional_light + specular_light) * attenuation;
- return directional_light * attenuation;
-}
-
-vec3 point_light_billboard(const int idx) {
- vec3 pos = light_pos[idx];
- vec3 color = light_color[idx];
- float linear = light_attenuation[idx].x;
- float quadratic = light_attenuation[idx].y;
- vec3 light_vector = pos - vertex_fragpos;
- float distance = length(light_vector);
- float attenuation = 1.0 / (1.0 + distance * linear + distance * distance * quadratic);
-
- return color * attenuation;
-}
-
-vec3 rgb_to_hsl(vec3 rgb) {
- vec3 ret;
- float min = min(min(rgb.r, rgb.g), rgb.b);
- float max = max(max(rgb.r, rgb.g), rgb.b);
- float lum = (max + min) / 2.0;
- ret.z = lum;
- if (max == min) {
- ret.x = ret.y = 0.0;
- } else {
- float chroma = max - min;
- ret.y = chroma / (1.0 - abs(2.0 * lum - 1.0));
- if (max == rgb.r) {
- ret.x = (rgb.g - rgb.b) / chroma + (rgb.g < rgb.b ? 6.0 : 0.0);
- } else if (max == rgb.g) {
- ret.x = (rgb.b - rgb.r) / chroma + 2.0;
- } else {
- ret.x = (rgb.r - rgb.g) / chroma + 4.0;
- }
- ret.x /= 6.0;
- }
- return ret;
-}
-
-float hue_to_rgb(float p, float q, float t) {
- if (t < 0.0) t += 1.0;
- if (t > 1.0) t -= 1.0;
- if (t < 1.0/6.0) return p + (q - p) * 6.0 * t;
- if (t < 1.0/2.0) return q;
- if (t < 2.0/3.0) return p + (q - p) * (2.0/3.0 - t) * 6.0;
- return p;
-}
-
-vec3 hsl_to_rgb(vec3 hsl) {
- vec3 ret;
- if (hsl.y == 0.0) {
- ret.r = ret.g = ret.b = hsl.z;
- } else {
- float q = hsl.z < 0.5 ? hsl.z * (1.0 + hsl.y) : hsl.z + hsl.y - hsl.z * hsl.y;
- float p = 2.0 * hsl.z - q;
- ret.r = hue_to_rgb(p, q, hsl.x + 1.0/3.0);
- ret.g = hue_to_rgb(p, q, hsl.x);
- ret.b = hue_to_rgb(p, q, hsl.x - 1.0/3.0);
- }
- return ret;
-}
-
-void main() {
- float tcy = flag(FLIP_TEXTURE) ? vertex_texcoord.y : 1.0 - vertex_texcoord.y;
- vec2 tc = vec2(vertex_texcoord.x, tcy);
- mat3 tbn = compute_tbn();
- if (flag(EFFECTS)) {
- float fbase = float(effect_flip);
- float fmul = 1.0 - 2.0 * fbase;
- tc = vec2(fbase + fmul * vertex_texcoord.x, tcy);
- }
- if (flag(SPRITE)) {
- tc *= sprite_dims;
- tc += sprite_offset;
- }
- frag_color = color;
- if (flag(TEXTURE_COLOR)) {
- frag_color = texture(texture_color, tc);
- }
- if (flag(EFFECTS)) {
- vec3 hsl = rgb_to_hsl(frag_color.rgb);
- hsl.x = mod(hsl.x * effect_huescale + effect_hueshift, 1.0);
- vec3 p = hsl_to_rgb(hsl);
- frag_color.rgb = vec3(p.r + effect_flash, p.g + effect_flash, p.b + effect_flash);
- }
- vec3 normal = vertex_normal;
- if (flag(TEXTURE_NORMAL)) {
- normal = normalize(tbn * (texture(texture_normal, tc).xyz * 2.0 - 1.0));
- }
- vec3 from_ambient = vec3(1.0, 1.0, 1.0);
- if (flag(LIGHT_AMBIENT)) {
- from_ambient = light_ambient_color;
- }
- vec3 from_dir = vec3(0.0, 0.0, 0.0);
- if (flag(LIGHT_DIR)) {
- from_dir = dir_light(normal);
- }
- vec3 from_points = vec3(0.0, 0.0, 0.0);
- if (flag(LIGHT_POINT)) {
- for (int i = 0; i < light_count; ++i) {
- vec3 pl = point_light(normal, i);
- from_points += pl;
- }
- }
- frag_color.rgb *= (from_ambient + from_dir + from_points);
- if (frag_color.a == 0.0) {
- discard;
- }
- if (flag(VERTEX_COLOR)) {
- frag_color.rgb = vertex_color;
- }
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/uber/vert.glsl b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/uber/vert.glsl
deleted file mode 100644
index bd5ac60..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/assets/shaders/uber/vert.glsl
+++ /dev/null
@@ -1,41 +0,0 @@
-uniform highp int flags;
-
-in vec3 vertex;
-in vec3 normal;
-in vec2 texcoord;
-in vec3 color;
-
-uniform mat4 view;
-uniform mat4 position;
-uniform mat4 projection;
-uniform mat4 normal_matrix;
-uniform mat4 lightspace_matrix;
-uniform vec3 camera_pos;
-uniform vec3 offset;
-uniform float yskew;
-
-out vec2 vertex_texcoord;
-out vec3 vertex_color;
-out vec3 vertex_normal;
-out vec3 vertex_fragpos;
-out vec4 vertex_fragpos_shadow_dir;
-out vec3 vertex_view_vector;
-
-bool flag(int mask) {
- return (flags & mask) != 0;
-}
-
-void main() {
- vertex_texcoord = texcoord;
- vertex_color = color;
- vertex_normal = (normal_matrix * vec4(normal, 1.0)).xyz;
- vec3 pos = (position * vec4(vertex, 1.0)).xyz;
- vertex_fragpos = pos;
- vertex_fragpos_shadow_dir = lightspace_matrix * vec4(pos, 1.0);
- vertex_view_vector = camera_pos - pos;
- gl_Position = projection * view * vec4(pos, 1.0);
- gl_Position.xyz += offset;
- if (flag(YSKEW)) {
- gl_Position.y += yskew * pos.z;
- }
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/audio.rs b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/audio.rs
deleted file mode 100644
index 431b010..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/audio.rs
+++ /dev/null
@@ -1,341 +0,0 @@
-use std::collections::HashMap;
-
-use std::sync::{Arc, Mutex};
-
-#[cfg(target_arch = "wasm32")]
-pub struct Context {
- pub audio: web_sys::AudioContext,
-}
-
-#[cfg(target_arch = "wasm32")]
-impl Context {
- pub fn new() -> Self {
- let audio = web_sys::AudioContext::new().expect("failed to create audio context");
- Self { audio }
- }
-}
-
-#[cfg(target_arch = "wasm32")]
-pub struct AudioPlayingHandle {
- node: web_sys::AudioBufferSourceNode,
- gain: web_sys::GainNode,
-}
-
-#[cfg(target_arch = "wasm32")]
-impl AudioPlayingHandle {
- pub fn stop(&self, _ctx: &Context) {
- self.node.stop().expect("failed to stop audio");
- }
- pub fn fade_out(&self, ctx: &Context, time: f32) {
- self.gain
- .gain()
- .set_target_at_time(0.0, ctx.audio.current_time(), time as f64)
- .expect("failed to fade out audio");
- self.node
- .stop_with_when(ctx.audio.current_time() + time as f64 + 1.0)
- .expect("failed to stop audio while fading out");
- }
-}
-
-#[cfg(target_arch = "wasm32")]
-pub struct Audio {
- pub buffer: Arc<Mutex<Option<web_sys::AudioBuffer>>>,
-}
-
-#[cfg(target_arch = "wasm32")]
-impl Audio {
- pub fn new(ctx: &Context, bytes: &[u8]) -> Self {
- let sbuffer = Arc::new(Mutex::new(None));
- let sclone = sbuffer.clone();
- let ret = Audio { buffer: sclone };
- let jsp = ctx
- .audio
- .decode_audio_data(&js_sys::Uint8Array::from(bytes).buffer())
- .expect("failed to decode audio");
- let promise = wasm_bindgen_futures::JsFuture::from(jsp);
- wasm_bindgen_futures::spawn_local(async move {
- if let Some(data) = promise.await.ok() {
- *sbuffer.lock().unwrap() = Some(web_sys::AudioBuffer::from(data));
- }
- ()
- });
- ret
- }
-
- pub fn from_samples(ctx: &Context, sample_rate: f32, samples: &[f32]) -> Self {
- let buf = ctx
- .audio
- .create_buffer(1, samples.len() as u32, sample_rate)
- .expect("failed to create audio buffer");
- buf.copy_to_channel(samples, 0)
- .expect("failed to populate audio samples");
- Audio {
- buffer: Arc::new(Mutex::new(Some(buf))),
- }
- }
-
- pub fn play(
- &self,
- ctx: &mut Context,
- looping: Option<(Option<f64>, Option<f64>)>,
- ) -> Option<AudioPlayingHandle> {
- let source = ctx.audio.create_buffer_source().ok()?;
- if let Some(ab) = &*self.buffer.lock().unwrap() {
- source.set_buffer(Some(&ab));
- } else {
- return None;
- };
- if let Some((ms, me)) = looping {
- source.set_loop(true);
- if let Some(s) = ms {
- source.set_loop_start(s)
- }
- if let Some(e) = me {
- source.set_loop_end(e)
- }
- }
- let gain = ctx.audio.create_gain().ok()?;
- gain.gain()
- .set_value_at_time(0.5, ctx.audio.current_time())
- .ok()?;
- gain.connect_with_audio_node(&ctx.audio.destination())
- .ok()?;
- source.connect_with_audio_node(&gain).ok()?;
- source.start().ok()?;
- Some(AudioPlayingHandle { node: source, gain })
- }
-}
-
-#[cfg(target_arch = "wasm32")]
-pub struct Assets {
- pub ctx: Context,
- pub audio: HashMap<String, Audio>,
- pub music_node: Option<AudioPlayingHandle>,
-}
-
-#[cfg(target_arch = "wasm32")]
-impl Assets {
- pub fn new<F>(f: F) -> Self
- where
- F: Fn(&Context) -> HashMap<String, Audio>,
- {
- let ctx = Context::new();
-
- let audio = f(&ctx);
-
- Self {
- ctx,
- audio,
- music_node: None,
- }
- }
-
- pub fn play_sfx(&mut self, name: &str) {
- if let Some(a) = self.audio.get(name) {
- a.play(&mut self.ctx, None);
- }
- }
-
- pub fn is_music_playing(&self) -> bool {
- if let Some(ms) = &self.music_node {
- ms.node.buffer().is_some()
- } else {
- false
- }
- }
-
- pub fn play_music(&mut self, name: &str, start: Option<f64>, end: Option<f64>) {
- if let Some(s) = &self.music_node {
- let _ = s.stop(&self.ctx);
- }
- if let Some(a) = self.audio.get(name) {
- self.music_node = a.play(&mut self.ctx, Some((start, end)));
- }
- }
-
- pub fn stop_music(&mut self) {
- if let Some(node) = &self.music_node {
- let _ = node.stop(&self.ctx);
- }
- self.music_node = None;
- }
-}
-
-#[cfg(not(target_arch = "wasm32"))]
-pub struct Context {
- manager: kira::manager::AudioManager,
-}
-
-#[cfg(not(target_arch = "wasm32"))]
-impl Context {
- #[allow(clippy::new_without_default)]
- pub fn new() -> Self {
- Self {
- manager: kira::manager::AudioManager::new(
- kira::manager::AudioManagerSettings::default(),
- )
- .expect("failed to create audio manager"),
- }
- }
-}
-
-#[cfg(not(target_arch = "wasm32"))]
-pub struct AudioPlayingHandle {
- handle: Arc<Mutex<kira::sound::static_sound::StaticSoundHandle>>,
-}
-
-#[cfg(not(target_arch = "wasm32"))]
-impl AudioPlayingHandle {
- pub fn stop(&self, _ctx: &Context) {
- self.handle
- .lock()
- .unwrap()
- .stop(kira::tween::Tween::default());
- }
- pub fn fade_out(&self, _ctx: &Context, time: f32) {
- self.handle.lock().unwrap().stop(kira::tween::Tween {
- duration: std::time::Duration::from_secs_f32(time + 0.5),
- ..Default::default()
- });
- }
-}
-
-#[cfg(not(target_arch = "wasm32"))]
-pub struct Audio {
- data: kira::sound::static_sound::StaticSoundData,
-}
-
-#[cfg(not(target_arch = "wasm32"))]
-impl Audio {
- pub fn new(_ctx: &Context, bytes: &[u8]) -> Self {
- Self {
- data: kira::sound::static_sound::StaticSoundData::from_cursor(std::io::Cursor::new(
- bytes.to_owned(),
- ))
- .expect("failed to decode audio"),
- }
- }
-
- pub fn from_samples(_ctx: &Context, sample_rate: f32, samples: &[f32]) -> Self {
- let frames: Vec<kira::Frame> = samples
- .iter()
- .map(|f| kira::Frame {
- left: *f,
- right: *f,
- })
- .collect();
- Self {
- data: kira::sound::static_sound::StaticSoundData {
- sample_rate: sample_rate as u32,
- frames: frames.into(),
- settings: kira::sound::static_sound::StaticSoundSettings::default(),
- slice: None,
- },
- }
- }
-
- pub fn play(
- &self,
- ctx: &mut Context,
- looping: Option<(Option<f64>, Option<f64>)>,
- ) -> Option<AudioPlayingHandle> {
- let sd = if let Some((ss, se)) = looping {
- let start = ss.unwrap_or(0.0);
- if let Some(e) = se {
- self.data.loop_region(start..e)
- } else {
- self.data.loop_region(start..)
- }
- } else {
- self.data.clone()
- };
- ctx.manager.play(sd).ok().map(|h| AudioPlayingHandle {
- handle: Arc::new(Mutex::new(h)),
- })
- }
-}
-
-#[cfg(not(target_arch = "wasm32"))]
-pub struct Assets {
- pub ctx: Context,
- pub audio: HashMap<String, Audio>,
- pub music_handle: Option<AudioPlayingHandle>,
-}
-
-#[cfg(not(target_arch = "wasm32"))]
-impl Assets {
- pub fn new<F>(f: F) -> Self
- where
- F: Fn(&Context) -> HashMap<String, Audio>,
- {
- let ctx = Context::new();
- let audio = f(&ctx);
- Self {
- ctx,
- audio,
- music_handle: None,
- }
- }
-
- pub fn play_sfx(&mut self, name: &str) {
- if let Some(a) = self.audio.get(name) {
- if a.play(&mut self.ctx, None).is_none() {
- log::warn!("failed to play sound {}", name);
- }
- }
- }
-
- pub fn is_music_playing(&self) -> bool {
- if let Some(mh) = &self.music_handle {
- mh.handle.lock().unwrap().state() == kira::sound::PlaybackState::Playing
- } else {
- false
- }
- }
-
- pub fn play_music(&mut self, name: &str, start: Option<f64>, end: Option<f64>) {
- if let Some(s) = &mut self.music_handle {
- s.stop(&self.ctx);
- }
- if let Some(a) = self.audio.get(name) {
- match a.play(&mut self.ctx, Some((start, end))) {
- Some(h) => {
- self.music_handle = Some(h);
- }
- _ => {
- log::warn!("failed to play music {}", name);
- }
- }
- }
- }
-
- pub fn stop_music(&mut self) {
- if let Some(h) = &mut self.music_handle {
- h.stop(&self.ctx);
- }
- self.music_handle = None;
- }
-}
-
-pub trait AudioPlayback {
- fn play_sfx(&mut self, name: &str);
- fn play_music(&mut self, name: &str, start: Option<f64>, end: Option<f64>);
- fn stop_music(&mut self);
-}
-impl AudioPlayback for Option<Assets> {
- fn play_sfx(&mut self, name: &str) {
- if let Some(a) = self {
- a.play_sfx(name);
- }
- }
- fn play_music(&mut self, name: &str, start: Option<f64>, end: Option<f64>) {
- if let Some(a) = self {
- a.play_music(name, start, end);
- }
- }
- fn stop_music(&mut self) {
- if let Some(a) = self {
- a.stop_music();
- }
- }
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/context.rs b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/context.rs
deleted file mode 100644
index 34e0ad3..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/context.rs
+++ /dev/null
@@ -1,302 +0,0 @@
-use crate::Options;
-
-use glow::HasContext;
-
-#[cfg(not(target_arch = "wasm32"))]
-use glfw::Context as _;
-
-#[cfg(target_arch = "wasm32")]
-use wasm_bindgen::prelude::*;
-
-#[cfg(target_arch = "wasm32")]
-use winit::platform::web::WindowExtWebSys;
-
-#[cfg(target_arch = "wasm32")]
-#[wasm_bindgen(module = "/src/helpers.js")]
-extern {
- fn js_track_resized_setup();
- fn js_poll_resized() -> bool;
- fn js_bundt_api_server() -> String;
- fn js_bundt_secure_api_server() -> String;
-}
-
-#[cfg(not(target_arch = "wasm32"))]
-pub struct Context {
- pub render_width: f32,
- pub render_height: f32,
- pub options: Options,
- pub glfw: std::cell::RefCell<glfw::Glfw>,
- pub window: std::cell::RefCell<glfw::PWindow>,
- pub gl: glow::Context,
- pub emptyvao: glow::VertexArray,
- pub start_instant: std::time::Instant,
-}
-
-
-#[cfg(target_arch = "wasm32")]
-pub struct Context {
- pub render_width: f32,
- pub render_height: f32,
- pub options: Options,
- pub window: winit::window::Window,
- pub gl: glow::Context,
- pub emptyvao: glow::VertexArray,
- pub performance: web_sys::Performance,
-}
-
-impl Context {
- pub fn compute_upscale(&self, windoww: u32, windowh: u32) -> u32 {
- let mut ratio = 1;
- loop {
- if (self.render_width as u32) * ratio > windoww
- || (self.render_height as u32) * ratio > windowh
- {
- break;
- }
- ratio += 1;
- }
- (ratio - 1).max(1)
- }
-
- #[cfg(not(target_arch = "wasm32"))]
- pub fn new(glfw: std::cell::RefCell<glfw::Glfw>, window: std::cell::RefCell<glfw::PWindow>, gl: glow::Context, render_width: f32, render_height: f32, options: Options) -> Self {
- let emptyvao = unsafe {
- gl.create_vertex_array().expect("failed to initialize vao")
- };
- let ret = Self {
- render_width, render_height,
- options,
- glfw, window,
- gl,
- emptyvao,
- start_instant: std::time::Instant::now(),
- };
- ret.init();
- ret
- }
-
- #[cfg(target_arch = "wasm32")]
- pub fn new(window: winit::window::Window, gl: glow::Context, render_width: f32, render_height: f32, options: Options) -> Self {
- let emptyvao = unsafe {
- gl.create_vertex_array().expect("failed to initialize vao")
- };
-
- #[cfg(target_arch = "wasm32")]
- js_track_resized_setup();
-
- let ret = Self {
- render_width, render_height,
- options,
- window,
- gl,
- emptyvao,
-
- #[cfg(target_arch = "wasm32")]
- performance: web_sys::window().expect("failed to find window")
- .performance().expect("failed to get performance"),
- };
- ret.init();
- ret
- }
-
- pub fn init(&self) {
- unsafe {
- self.gl.clear_color(0.1, 0.1, 0.1, 1.0);
- self.gl.clear_depth_f32(1.0);
-
- #[cfg(all(debug_assertions, not(target_arch = "wasm32")))]
- self.gl.enable(glow::DEBUG_OUTPUT);
-
- self.gl.enable(glow::DEPTH_TEST);
- self.gl.depth_func(glow::LEQUAL);
-
- self.gl.enable(glow::BLEND);
- self.gl.blend_func(glow::SRC_ALPHA, glow::ONE_MINUS_SRC_ALPHA);
-
- self.gl.enable(glow::STENCIL_TEST);
-
- self.gl.cull_face(glow::FRONT);
- }
- }
-
- #[cfg(target_arch = "wasm32")]
- pub fn maximize_canvas(&self) {
- if !self.options.contains(Options::NORESIZE) {
- web_sys::window()
- .and_then(|win| win.document())
- .and_then(|doc| {
- let inner_size = {
- let browser_window = doc.default_view()
- .or_else(web_sys::window)
- .unwrap();
- winit::dpi::PhysicalSize::new(
- browser_window.inner_width().unwrap().as_f64().unwrap(),
- browser_window.inner_height().unwrap().as_f64().unwrap(),
- )
- };
- self.window.canvas().unwrap().set_width(inner_size.width as _);
- self.window.canvas().unwrap().set_height(inner_size.height as _);
- let _ = self.window.request_inner_size(inner_size);
- Some(())
- })
- .expect("failed to resize canvas");
- }
- }
-
- #[cfg(target_arch = "wasm32")]
- pub fn resize_necessary(&self) -> bool { js_poll_resized() }
- #[cfg(not(target_arch = "wasm32"))]
- pub fn resize_necessary(&self) -> bool { false }
-
- #[cfg(target_arch = "wasm32")]
- pub fn bundt_api_server(&self) -> String { js_bundt_api_server() }
- #[cfg(all(not(target_arch = "wasm32"), debug_assertions))]
- pub fn bundt_api_server(&self) -> String { "http://localhost:8000/api".to_owned() }
- #[cfg(all(not(target_arch = "wasm32"), not(debug_assertions)))]
- pub fn bundt_api_server(&self) -> String { "https://api.colonq.computer/api".to_owned() }
-
- #[cfg(target_arch = "wasm32")]
- pub fn bundt_secure_api_server(&self) -> String { js_bundt_secure_api_server() }
- #[cfg(all(not(target_arch = "wasm32"), debug_assertions))]
- pub fn bundt_secure_api_server(&self) -> String { "http://localhost:8000/api".to_owned() }
- #[cfg(all(not(target_arch = "wasm32"), not(debug_assertions)))]
- pub fn bundt_secure_api_server(&self) -> String { "https://secure.colonq.computer/api".to_owned() }
-
- pub fn clear_color(&self, color: glam::Vec4) {
- unsafe {
- self.gl.clear_color(color.x, color.y, color.z, color.w);
- }
- }
-
- pub fn clear_depth(&self) {
- unsafe {
- self.gl.clear(glow::DEPTH_BUFFER_BIT);
- }
- }
-
- pub fn clear(&self) {
- unsafe {
- self.gl.stencil_mask(0xff);
- self.gl.clear(glow::COLOR_BUFFER_BIT | glow::DEPTH_BUFFER_BIT | glow::STENCIL_BUFFER_BIT);
- }
- }
-
- pub fn depth_mask(&self, m: bool) {
- unsafe {
- self.gl.depth_mask(m);
- }
- }
-
- pub fn begin_stencil(&self) {
- unsafe {
- self.gl.stencil_func(glow::ALWAYS, 1, 0xff);
- self.gl.stencil_op(glow::KEEP, glow::KEEP, glow::REPLACE);
- }
- }
-
- pub fn use_stencil(&self) {
- unsafe {
- self.gl.stencil_func(glow::EQUAL, 1, 0xff);
- self.gl.stencil_op(glow::KEEP, glow::KEEP, glow::KEEP);
- }
- }
-
- pub fn write_and_use_stencil(&self) {
- unsafe {
- self.gl.stencil_func(glow::EQUAL, 1, 0xff);
- self.gl.stencil_op(glow::KEEP, glow::KEEP, glow::REPLACE);
- }
- }
-
- pub fn use_inverse_stencil(&self) {
- unsafe {
- self.gl.stencil_func(glow::NOTEQUAL, 1, 0xff);
- self.gl.stencil_op(glow::KEEP, glow::KEEP, glow::KEEP);
- }
- }
-
- pub fn write_and_use_inverse_stencil(&self) {
- unsafe {
- self.gl.stencil_func(glow::NOTEQUAL, 1, 0xff);
- self.gl.stencil_op(glow::KEEP, glow::KEEP, glow::REPLACE);
- }
- }
-
- pub fn end_stencil(&self) {
- unsafe {
- self.gl.stencil_func(glow::ALWAYS, 1, 0xff);
- self.gl.stencil_op(glow::KEEP, glow::KEEP, glow::KEEP);
- }
- }
-
- pub fn render_no_geometry(&self) {
- unsafe {
- self.gl.bind_vertex_array(Some(self.emptyvao));
- self.gl.draw_arrays(glow::TRIANGLE_STRIP, 0, 4);
- }
- }
-
- pub fn reset_blend(&self) {
- unsafe {
- self.gl.blend_func(glow::SRC_ALPHA, glow::ONE_MINUS_SRC_ALPHA);
- }
- }
-
- pub fn inverse_blend(&self) {
- unsafe {
- self.gl.blend_func(
- glow::ONE_MINUS_DST_COLOR,
- glow::ZERO,
- );
- }
- }
-
- pub fn flip_colors_blend(&self) {
- unsafe {
- self.gl.blend_func_separate(
- glow::ONE_MINUS_DST_COLOR,
- glow::ZERO,
- glow::ZERO,
- glow::ONE,
- );
- }
- }
-
- pub fn enable_culling(&self) {
- unsafe {
- self.gl.enable(glow::CULL_FACE);
- }
- }
-
- pub fn disable_culling(&self) {
- unsafe {
- self.gl.disable(glow::CULL_FACE);
- }
- }
-
- #[cfg(target_arch = "wasm32")]
- pub fn lock_mouse(&self) {
- let _ = self.window.set_cursor_grab(winit::window::CursorGrabMode::Locked);
- self.window.set_cursor_visible(false);
- }
-
- #[cfg(not(target_arch = "wasm32"))]
- pub fn lock_mouse(&self) {
- unsafe {
- glfw::ffi::glfwSetInputMode(
- self.window.borrow_mut().window_ptr(),
- glfw::ffi::CURSOR,
- glfw::ffi::CURSOR_DISABLED,
- );
- }
- }
-
- pub fn check_error(&self) {
- unsafe {
- let err = self.gl.get_error();
- if err != 0 {
- log::warn!("gl error: {}", err);
- }
- }
- }
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/font.rs b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/font.rs
deleted file mode 100644
index 648bb47..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/font.rs
+++ /dev/null
@@ -1,194 +0,0 @@
-use crate::{context, mesh, state, texture};
-use glow::HasContext;
-
-pub struct BitmapParams<'color> {
- pub color: &'color [glam::Vec3],
- pub scale: glam::Vec2,
- pub offset: glam::Vec2,
-}
-impl<'color> Default for BitmapParams<'color> {
- fn default() -> Self {
- Self {
- color: &[],
- scale: glam::Vec2::ONE,
- offset: glam::Vec2::ZERO,
- }
- }
-}
-pub struct Bitmap {
- pub char_width: i32,
- pub char_height: i32,
- pub font_width: i32,
- pub font_height: i32,
- pub font: texture::Texture,
- pub vao: glow::VertexArray,
- pub vertex_buf: glow::Buffer,
- pub texcoords_buf: glow::Buffer,
- pub colors_buf: glow::Buffer,
- pub index_buf: glow::Buffer,
-}
-
-impl Bitmap {
- pub fn from_image(
- ctx: &context::Context,
- char_width: i32, char_height: i32,
- font_width: i32, font_height: i32,
- data: &[u8],
- ) -> Self {
- let font = texture::Texture::new(ctx, data);
- unsafe {
- let vao = ctx.gl.create_vertex_array().expect("failed to initialize vao");
- ctx.gl.bind_vertex_array(Some(vao));
- let vertex_buf = ctx.gl.create_buffer().expect("failed to create buffer object");
- ctx.gl.bind_buffer(glow::ARRAY_BUFFER, Some(vertex_buf));
- ctx.gl.vertex_attrib_pointer_f32(mesh::ATTRIB_VERTEX, 2, glow::FLOAT, false, 0, 0);
- ctx.gl.enable_vertex_attrib_array(mesh::ATTRIB_VERTEX);
- let texcoords_buf = ctx.gl.create_buffer().expect("failed to create buffer object");
- ctx.gl.bind_buffer(glow::ARRAY_BUFFER, Some(texcoords_buf));
- ctx.gl.vertex_attrib_pointer_f32(mesh::ATTRIB_TEXCOORD, 2, glow::FLOAT, false, 0, 0);
- ctx.gl.enable_vertex_attrib_array(mesh::ATTRIB_TEXCOORD);
- let colors_buf = ctx.gl.create_buffer().expect("failed to create buffer object");
- ctx.gl.bind_buffer(glow::ARRAY_BUFFER, Some(colors_buf));
- ctx.gl.vertex_attrib_pointer_f32(mesh::ATTRIB_COLOR, 3, glow::FLOAT, false, 0, 0);
- ctx.gl.enable_vertex_attrib_array(mesh::ATTRIB_COLOR);
- let index_buf = ctx.gl.create_buffer().expect("failed to create buffer object");
- ctx.gl.bind_buffer(glow::ELEMENT_ARRAY_BUFFER, Some(index_buf));
- Self {
- char_width, char_height,
- font_width, font_height,
- font,
- vao,
- vertex_buf,
- texcoords_buf,
- colors_buf,
- index_buf,
- }
- }
- }
-
- pub fn default(ctx: &context::Context) -> Self {
- Self::from_image(ctx, 7, 9, 112, 54, include_bytes!("assets/fonts/default.png"))
- }
-
- pub fn small(ctx: &context::Context) -> Self {
- Self::from_image(ctx, 6, 7, 96, 42, include_bytes!("assets/fonts/small.png"))
- }
-
- pub fn render_text_parameterized(&self,
- ctx: &context::Context, _st: &state::State,
- text: &str,
- params: BitmapParams,
- ) {
- let mut cur = params.offset;
- let mut vertices = Vec::new();
- let mut texcoords = Vec::new();
- let mut colors = Vec::new();
- let mut indices = Vec::new();
- let cwidth = self.char_width as f32 / self.font_width as f32;
- let cheight = self.char_height as f32 / self.font_height as f32;
- let sdims = glam::Vec2::new(2.0, 2.0) * params.scale;
- let row_len = self.font_width as u32 / self.char_width as u32;
- for (i, c) in text.chars().enumerate() {
- if c == '\n' {
- cur.x = 0.0;
- cur.y -= sdims.y;
- } else {
- let idx = vertices.len() as u32;
- vertices.push(cur);
- vertices.push(cur + glam::Vec2::new(sdims.x, 0.0));
- vertices.push(cur + glam::Vec2::new(sdims.x, sdims.y));
- vertices.push(cur + glam::Vec2::new(0.0, sdims.y));
- let cidx = c as u32 - ' ' as u32;
- let col = cidx % row_len;
- let row = cidx / row_len;
- let tcbase = glam::Vec2::new(col as f32 * cwidth, row as f32 * cheight);
- texcoords.push(tcbase + glam::Vec2::new(0.0, cheight));
- texcoords.push(tcbase + glam::Vec2::new(cwidth, cheight));
- texcoords.push(tcbase + glam::Vec2::new(cwidth, 0.0));
- texcoords.push(tcbase);
- let c = if let Some(c) = params.color.get(if params.color.is_empty() { 0 } else { i % params.color.len() }) {
- *c
- } else {
- glam::Vec3::new(1.0, 1.0, 1.0)
- };
- colors.push(c); colors.push(c); colors.push(c); colors.push(c);
- indices.push(idx); indices.push(idx + 1); indices.push(idx + 2);
- indices.push(idx); indices.push(idx + 3); indices.push(idx + 2);
- cur.x += sdims.x;
- }
- }
- let index_bytes: Vec<u8> = indices.iter().flat_map(|x| x.to_ne_bytes()).collect();
- self.font.bind(ctx);
- unsafe {
- ctx.gl.bind_vertex_array(Some(self.vao));
- ctx.gl.bind_buffer(glow::ARRAY_BUFFER, Some(self.vertex_buf));
- ctx.gl.buffer_data_u8_slice(
- glow::ARRAY_BUFFER,
- std::slice::from_raw_parts(
- vertices.as_ptr() as _,
- vertices.len() * std::mem::size_of::<f32>() * 2,
- ),
- glow::STATIC_DRAW,
- );
- ctx.gl.bind_buffer(glow::ARRAY_BUFFER, Some(self.texcoords_buf));
- ctx.gl.buffer_data_u8_slice(
- glow::ARRAY_BUFFER,
- std::slice::from_raw_parts(
- texcoords.as_ptr() as _,
- texcoords.len() * std::mem::size_of::<f32>() * 2,
- ),
- glow::STATIC_DRAW,
- );
- ctx.gl.bind_buffer(glow::ARRAY_BUFFER, Some(self.colors_buf));
- ctx.gl.buffer_data_u8_slice(
- glow::ARRAY_BUFFER,
- std::slice::from_raw_parts(
- colors.as_ptr() as _,
- colors.len() * std::mem::size_of::<f32>() * 3,
- ),
- glow::STATIC_DRAW,
- );
- ctx.gl.bind_buffer(glow::ELEMENT_ARRAY_BUFFER, Some(self.index_buf));
- ctx.gl.buffer_data_u8_slice(
- glow::ELEMENT_ARRAY_BUFFER,
- &index_bytes,
- glow::STATIC_DRAW,
- );
- ctx.gl.draw_elements(glow::TRIANGLES, indices.len() as _, glow::UNSIGNED_INT, 0);
- }
- }
-
- pub fn render_text_helper(&self,
- ctx: &context::Context, st: &state::State,
- text: &str, color: &[glam::Vec3]
- ) {
- self.render_text_parameterized(
- ctx, st,
- text,
- BitmapParams {
- color,
- scale: glam::Vec2::ONE,
- offset: glam::Vec2::ZERO,
- }
- )
- }
-
- pub fn render_text(&self,
- ctx: &context::Context, st: &state::State,
- text: &str
- ) {
- self.render_text_helper(ctx, st, text, &[]);
- }
-
- pub fn render_text_at(&self,
- ctx: &context::Context, st: &mut state::State,
- pos: glam::Vec2, text: &str,
- params: BitmapParams,
- ) {
- st.bind_2d(ctx, &st.shader_text_bitmap);
- let dims = glam::Vec2::new(self.char_width as f32, self.char_height as f32);
- let fpos = pos + glam::Vec2::new(-dims.x / 2.0, dims.y / 2.0);
- st.shader_text_bitmap.set_position_text_bitmap(ctx, st, self, &fpos);
- self.render_text_parameterized(ctx, st, text, params);
- }
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/framebuffer.rs b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/framebuffer.rs
deleted file mode 100644
index 606fd6a..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/framebuffer.rs
+++ /dev/null
@@ -1,158 +0,0 @@
-use glow::HasContext;
-
-use crate::context;
-
-#[cfg(target_arch = "wasm32")]
-use crate::Options;
-
-pub struct Framebuffer {
- pub tex: Option<glow::Texture>,
- pub fbo: Option<glow::Framebuffer>,
- pub dims: glam::Vec2,
- pub offsets: glam::Vec2,
-}
-
-impl Framebuffer {
- pub fn screen(ctx: &context::Context) -> Self {
- #[cfg(target_arch = "wasm32")]
- let (windoww, windowh): (f32, f32) = if !ctx.options.contains(Options::NORESIZE) {
- ctx.window.inner_size().into()
- } else {
- (ctx.render_width, ctx.render_height)
- };
- #[cfg(not(target_arch = "wasm32"))]
- let (windoww, windowh) = {
- let (w, h) = ctx.window.borrow().get_size();
- (w as f32, h as f32)
- };
- let ratio = ctx.compute_upscale(windoww as _, windowh as _) as f32;
- let upscalew = ctx.render_width * ratio;
- let upscaleh = ctx.render_height * ratio;
- let offsetx = (windoww - upscalew) / 2.0;
- let offsety = (windowh - upscaleh) / 2.0;
- log::info!("resize window: {:?}, upscale: {:?}, offset: {:?}", (windoww, windowh), (upscalew, upscaleh), (offsetx, offsety));
- Self {
- tex: None,
- fbo: None,
- dims: glam::Vec2::new(upscalew, upscaleh),
- offsets: glam::Vec2::new(offsetx, offsety),
- }
- }
-
- pub fn new(ctx: &context::Context, dims: &glam::Vec2, offsets: &glam::Vec2) -> Self {
- unsafe {
- let fbo = ctx.gl.create_framebuffer()
- .expect("failed to create framebuffer");
- ctx.gl.bind_framebuffer(glow::FRAMEBUFFER, Some(fbo));
-
- let depth_buffer = ctx.gl.create_renderbuffer()
- .expect("failed to create depth buffer");
- ctx.gl.bind_renderbuffer(glow::RENDERBUFFER, Some(depth_buffer));
- ctx.gl.renderbuffer_storage(glow::RENDERBUFFER, glow::DEPTH_COMPONENT32F, dims.x as _, dims.y as _);
- ctx.gl.framebuffer_renderbuffer(glow::FRAMEBUFFER, glow::DEPTH_ATTACHMENT, glow::RENDERBUFFER, Some(depth_buffer));
-
- let stencil_buffer = ctx.gl.create_renderbuffer()
- .expect("failed to create stencil buffer");
- ctx.gl.bind_renderbuffer(glow::RENDERBUFFER, Some(stencil_buffer));
- ctx.gl.renderbuffer_storage(glow::RENDERBUFFER, glow::DEPTH_STENCIL, dims.x as _, dims.y as _);
- ctx.gl.framebuffer_renderbuffer(glow::FRAMEBUFFER, glow::DEPTH_STENCIL_ATTACHMENT, glow::RENDERBUFFER, Some(stencil_buffer));
-
- let tex = ctx.gl.create_texture()
- .expect("failed to create framebuffer texture");
- ctx.gl.bind_texture(glow::TEXTURE_2D, Some(tex));
- ctx.gl.tex_image_2d(
- glow::TEXTURE_2D,
- 0,
- glow::RGBA as _,
- dims.x as _,
- dims.y as _,
- 0,
- glow::RGBA,
- glow::UNSIGNED_BYTE,
- None,
- );
- ctx.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_WRAP_S, glow::CLAMP_TO_EDGE as _);
- ctx.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_WRAP_T, glow::CLAMP_TO_EDGE as _);
- ctx.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_MIN_FILTER, glow::NEAREST as _);
- ctx.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_MAG_FILTER, glow::NEAREST as _);
- ctx.gl.framebuffer_texture_2d(glow::FRAMEBUFFER, glow::COLOR_ATTACHMENT0, glow::TEXTURE_2D, Some(tex), 0);
- ctx.gl.draw_buffer(glow::COLOR_ATTACHMENT0);
-
- let status = ctx.gl.check_framebuffer_status(glow::FRAMEBUFFER);
- if status != glow::FRAMEBUFFER_COMPLETE {
- panic!("error initializing framebuffer:\n{}", status);
- }
-
- Self {
- tex: Some(tex),
- fbo: Some(fbo),
- dims: *dims,
- offsets: *offsets,
- }
- }
- }
-
- pub fn bind_texture(&self, ctx: &context::Context) {
- unsafe {
- ctx.gl.active_texture(glow::TEXTURE0);
- ctx.gl.bind_texture(glow::TEXTURE_2D, self.tex);
- }
- }
-
- pub fn bind(&self, ctx: &context::Context) {
- unsafe {
- ctx.gl.bind_framebuffer(glow::FRAMEBUFFER, self.fbo);
- ctx.gl.viewport(
- self.offsets.x as _,
- self.offsets.y as _,
- self.dims.x as _,
- self.dims.y as _,
- );
- }
- }
-
- pub fn blit(&self, ctx: &context::Context, dest: &Self, pos: &glam::Vec2, scale: &glam::Vec2) {
- unsafe {
- ctx.gl.bind_framebuffer(glow::READ_FRAMEBUFFER, self.fbo);
- ctx.gl.bind_framebuffer(glow::DRAW_FRAMEBUFFER, dest.fbo);
- ctx.gl.blit_framebuffer(
- 0, 0, self.dims.x as _, self.dims.y as _,
- pos.x as _, pos.y as _, (pos.x + scale.x) as _, (pos.y + scale.y) as _,
- glow::COLOR_BUFFER_BIT, glow::NEAREST
- );
- }
- }
-
- pub fn get_pixels(&self, ctx: &context::Context, buf: &mut [glam::Vec3]) {
- let w = self.dims.x as usize;
- let h = self.dims.y as usize;
- let tmp = vec![glam::Vec3::default(); w * h];
- unsafe {
- ctx.gl.bind_texture(glow::TEXTURE_2D, self.tex);
- ctx.gl.get_tex_image(
- glow::TEXTURE_2D, 0, glow::RGB, glow::FLOAT,
- glow::PixelPackData::Slice(
- std::slice::from_raw_parts_mut(
- tmp.as_ptr() as *mut u8,
- tmp.len() * std::mem::size_of::<glam::Vec3>()
- )
- ),
- );
- }
- for y in 0..h {
- for x in 0..w {
- buf[x + (h - 1 - y) * w] = tmp[x + y * w];
- }
- }
- }
-
- pub fn get_pixels_raw(&self, ctx: &context::Context, buf: &mut [u8]) {
- unsafe {
- ctx.gl.bind_texture(glow::TEXTURE_2D, self.tex);
- ctx.gl.get_tex_image(
- glow::TEXTURE_2D, 0, glow::RGBA, glow::UNSIGNED_BYTE,
- glow::PixelPackData::Slice(buf),
- );
- }
- }
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/helpers.js b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/helpers.js
deleted file mode 100644
index d1b74b6..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/helpers.js
+++ /dev/null
@@ -1,21 +0,0 @@
-let resized = false;
-
-export async function js_track_resized_setup() {
- window.addEventListener("resize", () => {
- resized = true;
- });
-}
-
-export function js_poll_resized() {
- let ret = resized;
- resized = false;
- return ret;
-}
-
-export function js_bundt_api_server() {
- return globalThis.apiServer || "http://localhost:8000/api";
-}
-
-export function js_bundt_secure_api_server() {
- return globalThis.secureApiServer || "http://localhost:8000/api";
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/js/module.js b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/js/module.js
deleted file mode 100644
index 03d0047..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/js/module.js
+++ /dev/null
@@ -1,7 +0,0 @@
-export function js_build_interface() {
- return {
- env: {
- log_info: window.wasmBindings.log_info,
- },
- };
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/level2d.rs b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/level2d.rs
deleted file mode 100644
index b64213a..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/level2d.rs
+++ /dev/null
@@ -1 +0,0 @@
-pub mod tiled;
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/level2d/tiled.rs b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/level2d/tiled.rs
deleted file mode 100644
index 2e8141e..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/level2d/tiled.rs
+++ /dev/null
@@ -1,301 +0,0 @@
-#![allow(dead_code)]
-
-use std::collections::HashMap;
-use serde::Deserialize;
-use glow::HasContext;
-
-use crate::{context, erm, mesh, shader, texture, Erm};
-
-#[derive(Debug)]
-pub enum Err {
- LayerIndexOutOfBounds,
- LayerDataTooSmall,
- GIDNotFound(u32),
- AssetNotFound(String),
- GL(String),
-}
-impl std::error::Error for Err {}
-impl std::fmt::Display for Err {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- match self {
- Self::LayerIndexOutOfBounds => write!(f, "layer index out of bounds"),
- Self::LayerDataTooSmall => write!(f, "layer data too small for dimensions"),
- Self::GIDNotFound(gid) => write!(f, "GID not found: {}", gid),
- Self::AssetNotFound(ass) => write!(f, "asset not found: {}", ass),
- Self::GL(msg) => write!(f, "GL error: {msg:}"),
- }
- }
-}
-
-#[derive(Debug, Deserialize)]
-pub enum LayerType {
- #[serde(rename = "tilelayer")]
- Tile,
- #[serde(rename = "imagelayer")]
- Image,
- #[serde(rename = "objectgroup")]
- ObjectGroup,
- #[serde(rename = "group")]
- Group,
-}
-
-#[derive(Debug, Deserialize)]
-pub struct Layer {
- name: String,
- id: i32,
- #[serde(rename = "type")] ty: LayerType,
- width: i32, height: i32,
- x: i32, y: i32,
- opacity: f32,
- visible: bool,
- data: Vec<u32>,
-}
-
-#[derive(Debug, Deserialize)]
-pub struct LevelTileset {
- firstgid: i32,
- source: String,
-}
-
-#[derive(Debug, Deserialize)]
-pub struct Level {
- width: i32, height: i32,
- tilewidth: i32, tileheight: i32,
- layers: Vec<Layer>,
- tilesets: Vec<LevelTileset>,
-}
-impl Level {
- pub fn new(bytes: &str) -> Erm<Self> {
- Ok(serde_json::from_str(bytes)?)
- }
-}
-
-#[derive(Debug, Deserialize)]
-pub struct Tileset {
- name: String,
- imagewidth: i32, imageheight: i32,
- tilewidth: i32, tileheight: i32,
- margin: i32, spacing: i32,
-}
-impl Tileset {
- pub fn new(bytes: &str) -> Erm<Self> {
- Ok(serde_json::from_str(bytes)?)
- }
-}
-
-// TODO
-pub enum Flip {
- None,
-}
-
-pub struct Asset {
- tileset: Tileset,
- texture: texture::Texture,
-}
-#[derive(Default)]
-pub struct Assets {
- entries: HashMap<String, Asset>,
-}
-impl Assets {
- pub fn new() -> Self { Self::default() }
- pub fn load(&mut self, ctx: &context::Context, nm: &str, ts: &str, img: &[u8]) -> Erm<()> {
- let ass = Asset {
- tileset: Tileset::new(ts)?,
- texture: texture::Texture::new(ctx, img),
- };
- if self.entries.insert(nm.to_string(), ass).is_some() {
- log::warn!("duplicate tileset entry named: {}", nm);
- }
- Ok(())
- }
- pub fn lookup_gid(&self, level: &Level, gid: u32) -> Erm<(i32, &Asset, Flip)> {
- let offset = (gid & 0x0fffffff) as i32;
- for lts in level.tilesets.iter().rev() {
- if lts.firstgid <= offset {
- return Ok((
- offset - lts.firstgid,
- self.entries.get(&lts.source).ok_or(Err::AssetNotFound(lts.source.clone()))?,
- Flip::None
- ))
- }
- }
- erm(Err::GIDNotFound(gid))
- }
-}
-
-pub struct LayerRenderer {
- pub vao: glow::VertexArray,
- pub vertex_buf: glow::Buffer,
- pub texcoords_buf: glow::Buffer,
- pub index_buf: glow::Buffer,
- pub index_count: usize,
-}
-impl LayerRenderer {
- pub fn new(ctx: &context::Context) -> Erm<Self> {
- unsafe {
- let vao = ctx.gl.create_vertex_array().map_err(Err::GL)?;
- ctx.gl.bind_vertex_array(Some(vao));
- let vertex_buf = ctx.gl.create_buffer().map_err(Err::GL)?;
- ctx.gl.bind_buffer(glow::ARRAY_BUFFER, Some(vertex_buf));
- ctx.gl.vertex_attrib_pointer_f32(mesh::ATTRIB_VERTEX, 2, glow::FLOAT, false, 0, 0);
- ctx.gl.enable_vertex_attrib_array(mesh::ATTRIB_VERTEX);
- let texcoords_buf = ctx.gl.create_buffer().map_err(Err::GL)?;
- ctx.gl.bind_buffer(glow::ARRAY_BUFFER, Some(texcoords_buf));
- ctx.gl.vertex_attrib_pointer_f32(mesh::ATTRIB_TEXCOORD, 2, glow::FLOAT, false, 0, 0);
- ctx.gl.enable_vertex_attrib_array(mesh::ATTRIB_TEXCOORD);
- let index_buf = ctx.gl.create_buffer().map_err(Err::GL)?;
- ctx.gl.bind_buffer(glow::ELEMENT_ARRAY_BUFFER, Some(index_buf));
- Ok(Self {
- vao,
- vertex_buf,
- texcoords_buf,
- index_buf,
- index_count: 0,
- })
- }
- }
-}
-pub struct LevelRenderer {
- pub layers: Vec<LayerRenderer>,
- pub shader: shader::Shader,
-}
-impl LevelRenderer {
- pub fn new(ctx: &context::Context, level: &Level) -> Erm<Self> {
- let mut layers = Vec::new();
- for _ in level.layers.iter() {
- layers.push(LayerRenderer::new(ctx)?);
- }
- let shader = shader::Shader::new_nolib(
- ctx,
- include_str!("../assets/shaders/tiled/vert.glsl"),
- include_str!("../assets/shaders/tiled/frag.glsl"),
- );
- Ok(Self {
- layers,
- shader,
- })
- }
- pub fn populate_layer(
- &mut self,
- ctx: &context::Context,
- assets: &Assets,
- level: &Level,
- lidx: usize
- ) -> Erm<()> {
- let lr = self.layers.get_mut(lidx).ok_or(Err::LayerIndexOutOfBounds)?;
- let layer = level.layers.get(lidx).ok_or(Err::LayerIndexOutOfBounds)?;
- let mut vertices = Vec::new();
- let mut texcoords = Vec::new();
- let mut indices = Vec::new();
- for y in 0..layer.height {
- for x in 0..layer.width {
- let idx = x as usize + (y * layer.width) as usize;
- let gid = *layer.data.get(idx).ok_or(Err::LayerDataTooSmall)?;
- if gid == 0 { continue; }
- let (lid, ass, _) = assets.lookup_gid(level, gid)?;
- let cols = ass.tileset.imagewidth / ass.tileset.tilewidth;
- let rows = ass.tileset.imageheight / ass.tileset.tileheight;
- let col = lid % cols;
- let row = lid / cols;
- let twidth = 1.0 / cols as f32;
- let theight = 1.0 / rows as f32;
-
- let i = vertices.len() as u32;
- let v = glam::Vec2::new(x as _, y as _);
- vertices.push(v);
- vertices.push(v + glam::Vec2::new(1.0, 0.0));
- vertices.push(v + glam::Vec2::new(1.0, 1.0));
- vertices.push(v + glam::Vec2::new(0.0, 1.0));
- let uvbase = glam::Vec2::new(col as f32 / cols as f32, row as f32 / rows as f32);
- texcoords.push(uvbase + glam::Vec2::new(0.0, theight));
- texcoords.push(uvbase + glam::Vec2::new(twidth, theight));
- texcoords.push(uvbase + glam::Vec2::new(twidth, 0.0));
- texcoords.push(uvbase);
- indices.push(i); indices.push(i + 1); indices.push(i + 2);
- indices.push(i); indices.push(i + 3); indices.push(i + 2);
- }
- }
- let index_bytes: Vec<u8> = indices.iter().flat_map(|x| x.to_ne_bytes()).collect();
- unsafe {
- ctx.gl.bind_vertex_array(Some(lr.vao));
- ctx.gl.bind_buffer(glow::ARRAY_BUFFER, Some(lr.vertex_buf));
- ctx.gl.buffer_data_u8_slice(
- glow::ARRAY_BUFFER,
- std::slice::from_raw_parts(
- vertices.as_ptr() as _,
- vertices.len() * std::mem::size_of::<f32>() * 2,
- ),
- glow::STATIC_DRAW,
- );
- ctx.gl.bind_buffer(glow::ARRAY_BUFFER, Some(lr.texcoords_buf));
- ctx.gl.buffer_data_u8_slice(
- glow::ARRAY_BUFFER,
- std::slice::from_raw_parts(
- texcoords.as_ptr() as _,
- texcoords.len() * std::mem::size_of::<f32>() * 2,
- ),
- glow::STATIC_DRAW,
- );
- ctx.gl.bind_buffer(glow::ELEMENT_ARRAY_BUFFER, Some(lr.index_buf));
- ctx.gl.buffer_data_u8_slice(
- glow::ELEMENT_ARRAY_BUFFER,
- &index_bytes,
- glow::STATIC_DRAW,
- );
- lr.index_count = indices.len();
- }
- Ok(())
- }
- pub fn render_layer(
- &self,
- ctx: &context::Context,
- assets: &Assets,
- level: &Level,
- lidx: usize,
- ) -> Erm<()> {
- let layer = level.layers.get(lidx).ok_or(Err::LayerIndexOutOfBounds)?;
- let lr = self.layers.get(lidx).ok_or(Err::LayerIndexOutOfBounds)?;
- // TODO: handle layers with multiple textures
- let gid = *layer.data.iter().find(|g| **g > 0).unwrap();
- let (_, ass, _) = assets.lookup_gid(level, gid)?;
- ass.texture.bind(ctx);
- unsafe {
- ctx.gl.bind_vertex_array(Some(lr.vao));
- ctx.gl.draw_elements(glow::TRIANGLES, lr.index_count as _, glow::UNSIGNED_INT, 0);
- }
- Ok(())
- }
- pub fn populate(
- &mut self,
- ctx: &context::Context,
- assets: &Assets,
- level: &Level,
- ) -> Erm<()> {
- for lidx in 0..level.layers.len() {
- self.populate_layer(ctx, assets, level, lidx)?;
- }
- Ok(())
- }
- pub fn render(
- &self,
- ctx: &context::Context,
- assets: &Assets,
- level: &Level,
- ) -> Erm<()> {
- self.shader.bind(ctx);
- let sx = 2.0 * level.tilewidth as f32 / ctx.render_width;
- let sy = 2.0 * level.tileheight as f32 / ctx.render_height;
- self.shader.set_mat4(
- ctx, "transform",
- &glam::Mat4::from_scale_rotation_translation(
- glam::Vec3::new(sx, -sy, 1.0),
- glam::Quat::IDENTITY,
- glam::Vec3::new(0.0, 0.0, 0.0),
- ),
- );
- for lidx in 0..level.layers.len() {
- self.render_layer(ctx, assets, level, lidx)?;
- }
- Ok(())
- }
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/lib.rs b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/lib.rs
deleted file mode 100644
index 6b1564e..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/lib.rs
+++ /dev/null
@@ -1,355 +0,0 @@
-#![feature(try_blocks)]
-
-pub mod audio;
-pub mod context;
-pub mod font;
-pub mod framebuffer;
-pub mod level2d;
-pub mod mesh;
-pub mod net;
-pub mod physics;
-pub mod renderer;
-pub mod save;
-pub mod scene;
-pub mod shader;
-pub mod shadow;
-pub mod state;
-pub mod texture;
-pub mod ui;
-pub mod utils;
-
-pub use audio::AudioPlayback;
-pub use simple_eyre::eyre::WrapErr;
-pub use state::Tick;
-pub use utils::{Erm, erm, install_error_handler};
-
-#[cfg(target_arch = "wasm32")]
-use winit::platform::web::EventLoopExtWebSys;
-
-#[cfg(target_arch = "wasm32")]
-use winit::platform::web::WindowExtWebSys;
-
-#[cfg(target_arch = "wasm32")]
-use wasm_bindgen::JsCast;
-
-#[cfg(not(target_arch = "wasm32"))]
-use glfw::Context;
-
-use bitflags::bitflags;
-bitflags! {
- pub struct Options: u32 {
- const OVERLAY = 0b00000001;
- const HIDDEN = 0b00000010;
- const NORESIZE = 0b00000100;
- const EGL = 0b00001000;
- const FULLSCREEN_MOUSE = 0b00010000;
- }
-}
-
-static mut CTX: Option<*const context::Context> = None;
-static mut ST: Option<*mut state::State> = None;
-static mut G: Option<*mut std::ffi::c_void> = None;
-
-pub fn contextualize<F, G, X>(mut f: F) -> X
-where
- G: state::Game + 'static,
- F: FnMut(&context::Context, &mut state::State, &mut G) -> X,
-{
- unsafe {
- match (CTX, ST, G) {
- (Some(c), Some(s), Some(g)) => f(&*c, &mut *s, &mut *(g as *mut G)),
- _ => panic!("context not set"),
- }
- }
-}
-
-#[cfg(not(target_arch = "wasm32"))]
-pub fn run<'a, F, G>(title: &str, w: u32, h: u32, options: Options, gnew: F) -> Erm<()>
-where
- G: state::Game + 'static,
- F: (FnOnce(&'a context::Context) -> G),
-{
- env_logger::Builder::new()
- .filter(None, log::LevelFilter::Info)
- .init();
- install_error_handler();
-
- log::info!("hello computer, starting up...");
-
- let (rglfw, rwindow, gl, events) = {
- use glfw::fail_on_errors;
- let mut glfw = glfw::init(glfw::fail_on_errors!()).expect("failed to initialize GLFW");
-
- if options.contains(Options::EGL) {
- glfw.window_hint(glfw::WindowHint::ContextCreationApi(
- glfw::ContextCreationApi::Egl,
- ));
- }
- // let gl_attr = video.gl_attr();
- // gl_attr.set_context_profile(sdl2::video::GLProfile::Core);
- // gl_attr.set_context_version(3, 0);
- let (mut window, events) = glfw.with_primary_monitor(|glfw, primary| {
- if options.contains(Options::HIDDEN) {
- glfw.window_hint(glfw::WindowHint::Visible(false));
- glfw.create_window(w as _, h as _, title, glfw::WindowMode::Windowed)
- .expect("failed to create window")
- } else if options.contains(Options::OVERLAY) {
- let mon = primary.expect("failed to get monitor");
- let mode = mon.get_video_mode().expect("failed to get video mode");
- glfw.window_hint(glfw::WindowHint::RedBits(Some(mode.red_bits)));
- glfw.window_hint(glfw::WindowHint::GreenBits(Some(mode.green_bits)));
- glfw.window_hint(glfw::WindowHint::BlueBits(Some(mode.blue_bits)));
- glfw.window_hint(glfw::WindowHint::RefreshRate(Some(mode.refresh_rate)));
- glfw.window_hint(glfw::WindowHint::Resizable(false));
- glfw.window_hint(glfw::WindowHint::Decorated(false));
- glfw.window_hint(glfw::WindowHint::Floating(true));
- glfw.window_hint(glfw::WindowHint::TransparentFramebuffer(true));
- unsafe {
- // glfw.window_hint(glfw::WindowHint::MousePassthrough(true));
- glfw::ffi::glfwWindowHint(0x0002000D, 1); // mouse passthrough
- }
- glfw.create_window(
- mode.width,
- mode.height,
- title,
- glfw::WindowMode::FullScreen(mon),
- )
- .expect("failed to create window")
- } else {
- glfw.create_window(w as _, h as _, title, glfw::WindowMode::Windowed)
- .expect("failed to create window")
- }
- });
- window.make_current();
- window.set_key_polling(true);
- window.set_mouse_button_polling(true);
- window.set_size_polling(true);
- window.set_focus_polling(true);
- window.set_cursor_pos_polling(true);
- let gl = unsafe {
- glow::Context::from_loader_function(|s| window.get_proc_address(s) as *const _)
- };
- glfw.set_swap_interval(glfw::SwapInterval::Sync(1));
- (glfw, window, gl, events)
- };
- let glfw = std::cell::RefCell::new(rglfw);
- let window = std::cell::RefCell::new(rwindow);
-
- let ctx = Box::leak(Box::new(context::Context::new(
- glfw, window, gl, w as f32, h as f32, options,
- )));
- let game = Box::leak(Box::new(gnew(ctx)));
- let st = Box::leak(Box::new(state::State::new(ctx)));
-
- unsafe {
- CTX = Some(ctx as _);
- ST = Some(st as _);
- G = Some(game as *mut G as *mut std::ffi::c_void);
- }
-
- game.initialize(ctx, st)?;
- st.initialize_audio(ctx, game)?;
- 'running: loop {
- if ctx.window.borrow().should_close() {
- game.finalize(ctx, st)?;
- log::info!("bye!");
- break 'running;
- }
- ctx.glfw.borrow_mut().poll_events();
- for (_, event) in glfw::flush_messages(&events) {
- match event {
- glfw::WindowEvent::Size(_, _) => st.handle_resize(ctx),
- glfw::WindowEvent::Focus(false) => {
- st.keys = state::Keys::new();
- }
- glfw::WindowEvent::CursorPos(x, y) => {
- st.mouse_moved(ctx, x as f32, y as f32, game)?;
- }
- glfw::WindowEvent::MouseButton(_, glfw::Action::Press, _) => {
- st.mouse_pressed(ctx, game)?;
- }
- glfw::WindowEvent::MouseButton(_, glfw::Action::Release, _) => {
- st.mouse_released(ctx, game)?;
- }
- glfw::WindowEvent::Key(key, _, glfw::Action::Press, _) => {
- st.key_pressed(ctx, game, state::Keycode::new(key))?;
- }
- glfw::WindowEvent::Key(key, _, glfw::Action::Release, _) => {
- st.key_released(ctx, game, state::Keycode::new(key))?;
- }
- _ => {}
- }
- }
- if ctx.resize_necessary() {
- st.handle_resize(ctx);
- }
- // if let Some(f) = &mut st.request {
- // match std::future::Future::poll(f.as_mut(), &mut st.waker_ctx) {
- // std::task::Poll::Pending => {},
- // std::task::Poll::Ready(res) => {
- // st.request = None;
- // match res {
- // Ok(r) => st.request_returned(&ctx, game, r),
- // Err(e) => log::warn!("error during HTTP request: {}", e),
- // }
- // },
- // }
- // }
- st.run_update(ctx, game)?;
- st.run_render(ctx, game)?;
- ctx.window.borrow_mut().swap_buffers();
- }
- Ok(())
-}
-
-#[cfg(target_arch = "wasm32")]
-pub fn run<'a, F, G>(w: u32, h: u32, options: Options, gnew: F)
-where
- G: state::Game + 'static,
- F: (Fn(&'a context::Context) -> G),
-{
- console_log::init_with_level(log::Level::Debug).unwrap();
- console_error_panic_hook::set_once();
- tracing_wasm::set_as_global_default();
- // install_error_handler();
-
- log::info!("hello computer, starting up...");
-
- let event_loop = winit::event_loop::EventLoop::new().expect("failed to initialize event loop");
-
- let resize = !options.contains(Options::NORESIZE);
- let (window, gl) = {
- let mut builder = winit::window::WindowBuilder::new()
- .with_maximized(resize)
- .with_decorations(false);
- if options.contains(Options::OVERLAY) {
- builder = builder.with_transparent(true);
- }
- let window = builder
- .build(&event_loop)
- .expect("failed to initialize window");
- let gl = web_sys::window()
- .and_then(|win| win.document())
- .and_then(|doc| {
- let dst = doc.get_element_by_id("teleia-parent")?;
- let canvas =
- web_sys::Element::from(window.canvas().expect("failed to find canvas"));
- dst.append_child(&canvas).ok()?;
- let c = canvas.dyn_into::<web_sys::HtmlCanvasElement>().ok()?;
- let webgl2_context = c
- .get_context("webgl2")
- .ok()??
- .dyn_into::<web_sys::WebGl2RenderingContext>()
- .ok()?;
- Some(glow::Context::from_webgl2_context(webgl2_context))
- })
- .expect("couldn't add canvas to document");
- (window, gl)
- };
-
- let ctx = Box::leak(Box::new(context::Context::new(
- window, gl, w as f32, h as f32, options,
- )));
- ctx.maximize_canvas();
- let game = Box::leak(Box::new(gnew(ctx)));
- let st = Box::leak(Box::new(state::State::new(&ctx)));
-
- unsafe {
- CTX = Some(ctx as _);
- ST = Some(st as _);
- G = Some(game as *mut G as *mut std::ffi::c_void);
- }
-
- let _ = game.initialize(ctx, st);
- let _ = st.initialize_audio(ctx, game);
- let res = std::rc::Rc::new(std::cell::RefCell::new(Ok(())));
- let result = res.clone();
- event_loop.set_control_flow(winit::event_loop::ControlFlow::Wait);
- event_loop.spawn(move |event, elwt| {
- let res: Erm<()> = contextualize(|ctx, st, game: &mut G| {
- match &event {
- winit::event::Event::WindowEvent {
- event: wev,
- window_id,
- ..
- } => match wev {
- winit::event::WindowEvent::CloseRequested if *window_id == ctx.window.id() => {
- elwt.exit()
- }
- winit::event::WindowEvent::Resized { .. } => {
- #[cfg(target_arch = "wasm32")]
- ctx.maximize_canvas();
- st.handle_resize(&ctx);
- }
- winit::event::WindowEvent::Focused(false) => {
- st.keys = state::Keys::new();
- }
- winit::event::WindowEvent::CursorMoved { position, .. } => {
- st.mouse_moved(&ctx, position.x as f32, position.y as f32, game)?;
- }
- winit::event::WindowEvent::MouseInput { state, .. } => match state {
- winit::event::ElementState::Pressed => {
- st.mouse_pressed(&ctx, game)?;
- }
- winit::event::ElementState::Released => {
- st.mouse_released(&ctx, game)?;
- }
- },
- winit::event::WindowEvent::KeyboardInput {
- event:
- winit::event::KeyEvent {
- physical_key: winit::keyboard::PhysicalKey::Code(key),
- state,
- repeat: false,
- ..
- },
- ..
- } => match state {
- winit::event::ElementState::Pressed => {
- st.key_pressed(&ctx, game, state::Keycode { kc: *key })?;
- }
- winit::event::ElementState::Released => {
- st.key_released(&ctx, game, state::Keycode { kc: *key })?;
- }
- },
- _ => {}
- },
-
- winit::event::Event::AboutToWait => {
- if ctx.resize_necessary() {
- #[cfg(target_arch = "wasm32")]
- ctx.maximize_canvas();
- st.handle_resize(&ctx);
- }
- // if let Some(f) = &mut st.request {
- // match std::future::Future::poll(f.as_mut(), &mut st.waker_ctx) {
- // std::task::Poll::Pending => {},
- // std::task::Poll::Ready(res) => {
- // st.request = None;
- // match res {
- // Ok(r) => st.request_returned(&ctx, game, r),
- // Err(e) => log::warn!("error during HTTP request: {}", e),
- // }
- // },
- // }
- // // f.poll();
- // }
- st.run_update(&ctx, game)?;
- st.run_render(&ctx, game)?;
- ctx.window.request_redraw();
- }
-
- _ => {}
- }
- Ok(())
- });
- if let Err(e) = res {
- *result.borrow_mut() = Err(e);
- elwt.exit();
- }
- });
- let _ = game.finalize(ctx, st);
- if let Err(e) = res.replace(Ok(())) {
- panic!("{}", e);
- }
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/mesh.rs b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/mesh.rs
deleted file mode 100644
index ce34de4..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/mesh.rs
+++ /dev/null
@@ -1,197 +0,0 @@
-use glow::HasContext;
-
-use crate::context;
-
-pub const ATTRIB_VERTEX: u32 = 0;
-pub const ATTRIB_NORMAL: u32 = 1;
-pub const ATTRIB_TEXCOORD: u32 = 2;
-pub const ATTRIB_JOINT: u32 = 3;
-pub const ATTRIB_WEIGHT: u32 = 4;
-pub const ATTRIB_COLOR: u32 = 5;
-
-type Buffer = <glow::Context as glow::HasContext>::Buffer;
-
-pub struct Mesh {
- pub vao: glow::VertexArray,
- pub vbo_vertex: Buffer,
- pub vbo_index: Buffer,
- pub vbo_normal: Option<Buffer>,
- pub vbo_texcoord: Option<Buffer>,
- pub mode: u32, // glow::TRIANGLES, etc.
- pub index_count: usize,
- pub index_type: u32, // glow::BYTE, glow::FLOAT, etc.
- pub index_offset: i32,
-}
-
-impl Mesh {
- pub fn new_empty(ctx: &context::Context, normals: bool, texcoords: bool) -> Self {
- unsafe {
- let vao = ctx.gl.create_vertex_array().expect("failed to initialize vao");
- ctx.gl.bind_vertex_array(Some(vao));
-
- let vbo_vertex = ctx.gl.create_buffer().expect("failed to create buffer object");
- ctx.gl.bind_buffer(glow::ARRAY_BUFFER, Some(vbo_vertex));
- ctx.gl.vertex_attrib_pointer_f32(ATTRIB_VERTEX, 3, glow::FLOAT, false, 0, 0);
- ctx.gl.enable_vertex_attrib_array(ATTRIB_VERTEX);
-
- let vbo_index = ctx.gl.create_buffer().expect("failed to create buffer object");
- ctx.gl.bind_buffer(glow::ELEMENT_ARRAY_BUFFER, Some(vbo_index));
-
- let vbo_normal = if normals {
- let vbo_normal = ctx.gl.create_buffer().expect("failed to create buffer object");
- ctx.gl.bind_buffer(glow::ARRAY_BUFFER, Some(vbo_normal));
- ctx.gl.vertex_attrib_pointer_f32(ATTRIB_NORMAL, 3, glow::FLOAT, false, 0, 0);
- ctx.gl.enable_vertex_attrib_array(ATTRIB_NORMAL);
- Some(vbo_normal)
- } else { None };
-
- let vbo_texcoord = if texcoords {
- let vbo_texcoord = ctx.gl.create_buffer().expect("failed to create buffer object");
- ctx.gl.bind_buffer(glow::ARRAY_BUFFER, Some(vbo_texcoord));
- ctx.gl.vertex_attrib_pointer_f32(ATTRIB_TEXCOORD, 2, glow::FLOAT, false, 0, 0);
- ctx.gl.enable_vertex_attrib_array(ATTRIB_TEXCOORD);
- Some(vbo_texcoord)
- } else { None };
-
- Self {
- vao,
- vbo_vertex,
- vbo_index,
- vbo_normal,
- vbo_texcoord,
- mode: glow::TRIANGLES,
- index_count: 0,
- index_type: glow::UNSIGNED_INT,
- index_offset: 0,
- }
- }
- }
- pub fn upload(
- &mut self,
- ctx: &context::Context,
- vertices: &[f32],
- indices: &[u32],
- snormals: Option<&[f32]>,
- stexcoords: Option<&[f32]>,
- ) {
- unsafe {
- ctx.gl.bind_buffer(glow::ARRAY_BUFFER, Some(self.vbo_vertex));
- ctx.gl.buffer_data_u8_slice(
- glow::ARRAY_BUFFER,
- std::slice::from_raw_parts(
- vertices.as_ptr() as _,
- std::mem::size_of_val(vertices),
- ),
- glow::STATIC_DRAW,
- );
- ctx.gl.bind_buffer(glow::ELEMENT_ARRAY_BUFFER, Some(self.vbo_index));
- ctx.gl.buffer_data_u8_slice(
- glow::ELEMENT_ARRAY_BUFFER,
- std::slice::from_raw_parts(
- indices.as_ptr() as _,
- std::mem::size_of_val(indices),
- ),
- glow::STATIC_DRAW,
- );
-
- if let Some(vbo_normal) = self.vbo_normal && let Some(normals) = snormals {
- ctx.gl.bind_buffer(glow::ARRAY_BUFFER, Some(vbo_normal));
- ctx.gl.buffer_data_u8_slice(
- glow::ARRAY_BUFFER,
- std::slice::from_raw_parts(
- normals.as_ptr() as _,
- std::mem::size_of_val(normals),
- ),
- glow::STATIC_DRAW,
- );
- Some(vbo_normal)
- } else { None };
-
- if let Some(vbo_texcoord) = self.vbo_texcoord && let Some(texcoords) = stexcoords {
- ctx.gl.bind_buffer(glow::ARRAY_BUFFER, Some(vbo_texcoord));
- ctx.gl.buffer_data_u8_slice(
- glow::ARRAY_BUFFER,
- std::slice::from_raw_parts(
- texcoords.as_ptr() as _,
- std::mem::size_of_val(texcoords),
- ),
- glow::STATIC_DRAW,
- );
- Some(vbo_texcoord)
- } else { None };
- self.index_count = indices.len();
- }
- }
-
- pub fn build(
- ctx: &context::Context,
- vertices: &[f32],
- indices: &[u32],
- snormals: Option<&[f32]>,
- stexcoords: Option<&[f32]>,
- ) -> Self {
- let mut ret = Self::new_empty(ctx, snormals.is_some(), stexcoords.is_some());
- ret.upload(ctx, vertices, indices, snormals, stexcoords);
- ret
- }
-
- pub fn upload_obj(&mut self, ctx: &context::Context, mut bytes: &[u8]) {
- let lopts = tobj::LoadOptions {
- triangulate: true,
- single_index: true,
- ..Default::default()
- };
- let (meshes, _materials) = tobj::load_obj_buf(
- &mut bytes,
- &lopts,
- |_| Err(tobj::LoadError::GenericFailure)
- ).expect("failed to load mesh");
- let mesh = meshes.into_iter().next()
- .expect("failed to load mesh")
- .mesh;
- self.upload(
- ctx,
- &mesh.positions,
- &mesh.indices,
- Some(&mesh.normals),
- Some(&mesh.texcoords),
- )
- }
-
- pub fn from_obj(ctx: &context::Context, mut bytes: &[u8]) -> Self {
- let lopts = tobj::LoadOptions {
- triangulate: true,
- single_index: true,
- ..Default::default()
- };
- let (meshes, _materials) = tobj::load_obj_buf(
- &mut bytes,
- &lopts,
- |_| Err(tobj::LoadError::GenericFailure)
- ).expect("failed to load mesh");
- let mesh = meshes.into_iter().next()
- .expect("failed to load mesh")
- .mesh;
- Self::build(
- ctx,
- &mesh.positions,
- &mesh.indices,
- Some(&mesh.normals),
- Some(&mesh.texcoords),
- )
- }
-
- pub fn render(&self, ctx: &context::Context) {
- unsafe {
- ctx.gl.bind_vertex_array(Some(self.vao));
- ctx.gl.draw_elements(self.mode, self.index_count as _, self.index_type, self.index_offset);
- }
- }
-
- pub fn render_instanced(&self, ctx: &context::Context, count: u64) {
- unsafe {
- ctx.gl.bind_vertex_array(Some(self.vao));
- ctx.gl.draw_elements_instanced(self.mode, self.index_count as _, self.index_type, self.index_offset, count as _);
- }
- }
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/net.rs b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/net.rs
deleted file mode 100644
index 8758968..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/net.rs
+++ /dev/null
@@ -1,4 +0,0 @@
-pub mod ws;
-
-#[cfg(not(target_arch = "wasm32"))]
-pub mod fig;
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/net/fig.rs b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/net/fig.rs
deleted file mode 100644
index 916cdc1..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/net/fig.rs
+++ /dev/null
@@ -1,100 +0,0 @@
-use std::io::{Read, Write};
-use byteorder::{LE, ReadBytesExt, WriteBytesExt};
-
-use crate::{Erm, WrapErr};
-
-const KEY: usize = 42;
-
-pub fn read_length_prefixed_utf8<R>(r: &mut R) -> Erm<String> where R: std::io::Read {
- let len = r.read_u32::<LE>()?;
- let mut bs = vec![0; len as usize];
- r.read_exact(&mut bs)?;
- Ok(String::from_utf8(bs)?)
-}
-
-#[derive(Debug, Clone)]
-pub struct BinaryMessage {
- pub event: Vec<u8>,
- pub data: Vec<u8>
-}
-
-pub struct BinaryClient {
- in_buf: Vec<u8>,
- out_buf: Vec<u8>,
- socket: std::net::TcpStream,
- poller: polling::Poller,
-}
-impl BinaryClient {
- pub fn new(addr: &str, subs: &[&[u8]]) -> Erm<Self> {
- let mut socket = std::net::TcpStream::connect(addr).wrap_err("failed to connect to message bus")?;
- for s in subs {
- write!(socket, "s").wrap_err("failed to send subscribe message to bus")?;
- socket.write_u32::<byteorder::LE>(s.len() as u32).wrap_err("failed to send subscribe message length to bus")?;
- socket.write_all(s).wrap_err("failed to send subscribe message to bus")?;
- }
- socket.set_nonblocking(true).wrap_err("failed to set message bus socket nonblocking")?;
- socket.flush().wrap_err("failed to flush bus connection")?;
- let in_buf = Vec::new();
- let out_buf = Vec::new();
- let poller = polling::Poller::new()?;
- unsafe {
- poller.add(&socket, polling::Event::all(KEY)).wrap_err("failed to add event to poll")?;
- }
- Ok(Self {
- in_buf, out_buf,
- socket,
- poller,
- })
- }
- fn write_length_prefixed(&mut self, buf: &[u8]) -> Erm<()> {
- self.out_buf.write_u32::<byteorder::LE>(buf.len() as u32).wrap_err("failed to send message")?;
- self.out_buf.write_all(buf).wrap_err("failed to send message")?;
- Ok(())
-
- }
- pub fn publish(&mut self, ev: &[u8], data: &[u8]) -> Erm<()> {
- write!(self.out_buf, "p").wrap_err("failed to send publish message to bus")?;
- self.write_length_prefixed(ev)?;
- self.write_length_prefixed(data)?;
- Ok(())
- }
- fn pop_incoming_message(&mut self) -> Option<BinaryMessage> {
- let mut reader = std::io::Cursor::new(&self.in_buf);
- let event_len = reader.read_u32::<byteorder::LE>().ok()?;
- let mut event = vec![0; event_len as usize];
- reader.read_exact(&mut event).ok()?;
- let data_len = reader.read_u32::<byteorder::LE>().ok()?;
- let mut data = vec![0; data_len as usize];
- reader.read_exact(&mut data).ok()?;
- let len = reader.position() as usize;
- self.in_buf.drain(..len);
- Some(BinaryMessage { event, data })
- }
- pub fn pump(&mut self) -> Erm<Option<BinaryMessage>> {
- let mut events = polling::Events::new();
- events.clear();
- self.poller.wait(&mut events, Some(std::time::Duration::from_secs(0)))
- .wrap_err("failed to poll message bus")?;
- for ev in events.iter() {
- if ev.key == KEY {
- if ev.readable {
- let mut buf = [0; 1024];
- match self.socket.read(&mut buf) {
- Ok(sz) => self.in_buf.extend_from_slice(&buf[..sz]),
- Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => {},
- e => { e.wrap_err("failed to read from bus socket")?; },
- }
- }
- if ev.writable && !self.out_buf.is_empty() {
- match self.socket.write(&self.out_buf) {
- Ok(sz) => { self.out_buf.drain(..sz); },
- Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => {},
- e => { e.wrap_err("failed to write to bus socket")?; },
- }
- }
- self.poller.modify(&self.socket, polling::Event::all(KEY)).wrap_err("failed to update event to poll")?;
- }
- }
- Ok(self.pop_incoming_message())
- }
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/net/ws.rs b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/net/ws.rs
deleted file mode 100644
index b11df40..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/net/ws.rs
+++ /dev/null
@@ -1,10 +0,0 @@
-pub mod client;
-
-#[cfg(not(target_arch = "wasm32"))]
-pub mod server;
-
-#[derive(Debug, Clone)]
-pub enum Message {
- Binary(Vec<u8>),
- Text(String),
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/net/ws/client.rs b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/net/ws/client.rs
deleted file mode 100644
index fe9f957..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/net/ws/client.rs
+++ /dev/null
@@ -1,9 +0,0 @@
-#[cfg(target_arch = "wasm32")]
-pub mod wasm;
-#[cfg(target_arch = "wasm32")]
-pub use wasm::*;
-
-#[cfg(not(target_arch = "wasm32"))]
-pub mod native;
-#[cfg(not(target_arch = "wasm32"))]
-pub use native::*;
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/net/ws/client/native.rs b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/net/ws/client/native.rs
deleted file mode 100644
index eb94093..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/net/ws/client/native.rs
+++ /dev/null
@@ -1,124 +0,0 @@
-use std::sync::mpsc::{Sender, Receiver, channel};
-use std::sync::{Arc, Mutex};
-use std::thread::spawn;
-
-use crate::net::ws::Message;
-use crate::{utils, Erm, WrapErr};
-
-const KEY: usize = 42;
-
-type ClientChannels = (Sender<Message>, Receiver<Message>);
-#[derive(Default)]
-pub struct Client {
- channels: Arc<Mutex<Option<ClientChannels>>>,
-}
-
-impl Client {
- pub fn new() -> Self { Self::default() }
- pub fn connect(&mut self, url: &str) {
- let (mut socket, _resp) = if let Ok(v) = tungstenite::connect(url) { v } else {
- log::warn!("failed to connect to websocket: {}", url);
- return;
- };
- let poller = match polling::Poller::new() {
- Ok(v) => v,
- Err(e) => { log::warn!("failed to create poller: {}", e); return; }
- };
- let res: Erm<()> = try { match socket.get_ref() {
- tungstenite::stream::MaybeTlsStream::Plain(s) => unsafe {
- s.set_nonblocking(true).wrap_err("failed to set socket nonblocking")?;
- poller.add(s, polling::Event::readable(KEY)).wrap_err("failed to add event to poll")?;
- },
- tungstenite::stream::MaybeTlsStream::NativeTls(s) => unsafe {
- s.get_ref().set_nonblocking(true).wrap_err("failed to set socket nonblocking")?;
- poller.add(s.get_ref(), polling::Event::readable(KEY)).wrap_err("failed to add event to poll")?;
- },
- _ => utils::erm_msg("unknown socket type; cannot poll!")?,
- }};
- if let Err(e) = res {
- log::warn!("failed to add event to poll: {}", e);
- let _ = socket.close(None);
- return;
- };
- let (outgoing_sender, outgoing_receiver) = channel();
- let (incoming_sender, incoming_receiver) = channel();
- *self.channels.lock().unwrap() = Some((outgoing_sender, incoming_receiver));
- let send_channels_ref = self.channels.clone();
- let recv_channels_ref = self.channels.clone();
- let send_socket_ref = Arc::new(Mutex::new(socket));
- let recv_socket_ref = send_socket_ref.clone();
- let mut events = polling::Events::new();
- spawn(move || loop {
- // write all outgoing messages
- let res: Erm<()> = try {
- while let Ok(msg) = outgoing_receiver.recv() {
- match msg {
- Message::Text(txt) => send_socket_ref.lock().unwrap()
- .send(tungstenite::Message::Text(txt))
- .wrap_err("failed to send websocket text")?,
- Message::Binary(bytes) => send_socket_ref.lock().unwrap()
- .send(tungstenite::Message::Binary(bytes))
- .wrap_err("failed to send websocket bytes")?,
- }
- }
- };
- if let Err(e) = res {
- log::warn!("error in websocket send thread: {}", e);
- *send_channels_ref.lock().unwrap() = None;
- return;
- }
- });
- spawn(move || loop {
- // wait for and receive all incoming messages
- let res: Erm<()> = try {
- events.clear();
- poller.wait(&mut events, None).wrap_err("failed to wait on websocket poller")?;
- for ev in events.iter() {
- if ev.key == KEY {
- if ev.readable { match recv_socket_ref.lock().unwrap().read().wrap_err("failed to recv on websocket")? {
- tungstenite::Message::Text(txt) => incoming_sender.send(Message::Text(txt))
- .wrap_err("failed to send incoming websocket message on channel")?,
- tungstenite::Message::Binary(bytes) => incoming_sender.send(Message::Binary(bytes))
- .wrap_err("failed to send incoming websocket message on channel")?,
- tungstenite::Message::Ping(bs) => recv_socket_ref.lock().unwrap()
- .send(tungstenite::Message::Pong(bs))
- .wrap_err("failed to send websocket pong")?,
- m => log::warn!("unhandled incoming websocket message: {}", m),
- }}
- match recv_socket_ref.lock().unwrap().get_ref() {
- tungstenite::stream::MaybeTlsStream::Plain(s) =>
- poller.modify(s, polling::Event::readable(KEY))
- .wrap_err("failed to modify event to poll")?,
- tungstenite::stream::MaybeTlsStream::NativeTls(s) =>
- poller.modify(s.get_ref(), polling::Event::readable(KEY))
- .wrap_err("failed to modify event to poll")?,
- _ => log::warn!("unknown socket type; cannot modify polling!"),
- }
- }
- }
- };
- if let Err(e) = res {
- log::warn!("error in websocket recv thread: {}", e);
- *recv_channels_ref.lock().unwrap() = None;
- return;
- }
- });
- }
- pub fn is_connected(&self) -> bool {
- self.channels.lock().unwrap().is_some()
- }
- pub fn poll(&mut self) -> Option<Message> {
- if let Some((_, incoming)) = &*self.channels.lock().unwrap() {
- incoming.try_recv().ok()
- } else { None }
- }
- pub fn send(&self, msg: Message) {
- if let Some((outgoing, _)) = &mut *self.channels.lock().unwrap() {
- if let Err(e) = outgoing.send(msg) {
- log::warn!("failed to send websocket message on channel: {}", e);
- }
- } else {
- log::warn!("tried to send message, but websocket is not connected");
- }
- }
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/net/ws/client/wasm.rs b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/net/ws/client/wasm.rs
deleted file mode 100644
index f4faff7..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/net/ws/client/wasm.rs
+++ /dev/null
@@ -1,73 +0,0 @@
-use std::{collections::VecDeque, sync::{Arc, Mutex}};
-
-use wasm_bindgen::prelude::*;
-
-use crate::net::ws::Message;
-
-impl Message {
- fn from_messageevent(e: web_sys::MessageEvent) -> Self {
- if let Ok(abuf) = e.data().dyn_into::<js_sys::ArrayBuffer>() {
- let array = js_sys::Uint8Array::new(&abuf).to_vec();
- Message::Binary(array)
- } else if let Ok(txt) = e.data().dyn_into::<js_sys::JsString>() {
- Message::Text(txt.into())
- } else {
- panic!("received weird websocket message: {:?}", e);
- }
- }
-}
-
-pub struct Client {
- ws: Arc<Mutex<Option<web_sys::WebSocket>>>,
- messages: Arc<Mutex<VecDeque<Message>>>,
-}
-
-impl Client {
- pub fn new() -> Self {
- Self {
- ws: Arc::new(Mutex::new(None)),
- messages: Arc::new(Mutex::new(VecDeque::new())),
- }
- }
- pub fn connect(&mut self, url: &str) {
- let ws_ref = self.ws.clone();
- let messages_ref = self.messages.clone();
- let cb: Closure<dyn Fn(web_sys::MessageEvent)> = Closure::new(move |e: web_sys::MessageEvent| {
- let msg = Message::from_messageevent(e);
- log::info!("incoming: {:?}", msg);
- messages_ref.lock().unwrap().push_back(msg);
- });
- let close_cb: Closure<dyn Fn(web_sys::MessageEvent)> = Closure::new(move |_: web_sys::MessageEvent| {
- log::info!("closed!");
- *ws_ref.lock().unwrap() = None;
- });
- let ws = web_sys::WebSocket::new(url).expect("failed to open websocket");
- ws.set_onmessage(Some(cb.as_ref().unchecked_ref()));
- ws.set_onclose(Some(close_cb.as_ref().unchecked_ref()));
- cb.forget();
- close_cb.forget();
- *self.ws.lock().unwrap() = Some(ws);
- }
- pub fn is_connected(&self) -> bool {
- self.ws.lock().unwrap().is_some()
- }
- pub fn poll(&mut self) -> Option<Message> {
- self.messages.lock().unwrap().pop_front()
- }
- pub fn send(&self, msg: Message) {
- if let Some(ws) = &*self.ws.lock().unwrap() {
- match msg {
- Message::Text(txt) => {
- if let Err(e) = ws.send_with_str(&txt) {
- log::warn!("failed to send string: {:?}", e);
- }
- },
- Message::Binary(bytes) => {
- if let Err(e) = ws.send_with_u8_array(&bytes) {
- log::warn!("failed to send bytes: {:?}", e);
- }
- },
- }
- }
- }
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/net/ws/server.rs b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/net/ws/server.rs
deleted file mode 100644
index 9422aec..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/net/ws/server.rs
+++ /dev/null
@@ -1,140 +0,0 @@
-use std::collections::HashMap;
-use std::net::{TcpListener, TcpStream};
-use std::sync::mpsc::{Sender, Receiver, channel};
-use std::sync::{Arc, Mutex};
-use std::thread::spawn;
-
-use crate::net::ws::Message;
-use crate::{utils, Erm, WrapErr};
-
-const ACCEPT_KEY: usize = 1;
-
-type ClientId = usize;
-type ClientMessage = (ClientId, Message);
-
-type ServerChannels = (Sender<ClientMessage>, Receiver<ClientMessage>);
-#[derive(Default)]
-pub struct Server {
- clients: Arc<Mutex<HashMap<ClientId, tungstenite::WebSocket<TcpStream>>>>,
- channels: Arc<Mutex<Option<ServerChannels>>>,
-}
-
-impl Server {
- pub fn new() -> Self { Self::default() }
- pub fn start(&mut self, addr: &str) {
- let recv_clients_ref = self.clients.clone();
- let send_clients_ref = self.clients.clone();
- let (outgoing_sender, outgoing_receiver) = channel();
- let (incoming_sender, incoming_receiver) = channel();
- *self.channels.lock().unwrap() = Some((outgoing_sender, incoming_receiver));
- let channels_ref = self.channels.clone();
- let listener = TcpListener::bind(addr).expect("failed to bind server socket");
- let poller = polling::Poller::new().expect("failed to create poller for websocket server");
- unsafe {
- poller.add(&listener, polling::Event::readable(ACCEPT_KEY))
- .expect("failed to add poll server socket");
- }
- let mut events = polling::Events::new();
- let mut next_id = ACCEPT_KEY + 1;
- spawn(move || loop {
- // write all outgoing messages
- while let Ok((cid, msg)) = outgoing_receiver.recv() {
- let res: Erm<()> = try {
- if let Some(sock) = send_clients_ref.lock().unwrap().get_mut(&cid) {
- let res = match msg {
- Message::Text(txt) => sock.send(tungstenite::Message::Text(txt)),
- Message::Binary(bytes) => sock.send(tungstenite::Message::Binary(bytes))
- };
- match res {
- Ok(_) => {},
- Err(tungstenite::Error::Io(e)) if e.kind() == std::io::ErrorKind::WouldBlock => {
- log::info!("client {} receive send block", cid);
- },
- Err(e) => utils::erm(e)?,
- }
- }
- };
- if let Err(e) = res {
- log::warn!("error when sending to client {}, disconnecting: {}", cid, e);
- send_clients_ref.lock().unwrap().remove(&cid);
- }
- }
- });
- spawn(move || loop {
- // wait for and receive all new connections and incoming messages
- let res: Erm<()> = try {
- events.clear();
- poller.wait(&mut events, None).wrap_err("failed to wait on websocket server poller")?;
- for ev in events.iter() {
- if ev.key == ACCEPT_KEY {
- let (sock, client_addr) = listener.accept().wrap_err("failed to accept on socket")?;
- let id = next_id; next_id += 1;
- let res: Erm<()> = try {
- unsafe { poller.add(&sock, polling::Event::readable(id))
- .wrap_err("failed to add socket to poller")?; }
- let conn = tungstenite::accept(sock).wrap_err("failed to upgrade to websocket")?;
- recv_clients_ref.lock().unwrap().insert(id, conn);
- log::info!("new connected client! {}", id);
- };
- if let Err(e) = res {
- log::warn!("error during connection from {}: {}", client_addr, e);
- };
- poller.modify(&listener, polling::Event::readable(ACCEPT_KEY))
- .wrap_err("failed to modify event to poll")?;
- } else {
- let res: Erm<()> = try {
- if let Some(sock) = recv_clients_ref.lock().unwrap().get_mut(&ev.key) {
- match sock.read() {
- Ok(tungstenite::Message::Text(t)) =>
- incoming_sender.send((ev.key, Message::Text(t)))
- .wrap_err("failed to send incoming message on channel")?,
- Ok(tungstenite::Message::Binary(b)) =>
- incoming_sender.send((ev.key, Message::Binary(b)))
- .wrap_err("failed to send incoming message on channel")?,
- Ok(tungstenite::Message::Ping(x)) =>
- sock.write(tungstenite::Message::Pong(x))
- .wrap_err("failed to reply with pong")?,
- Ok(m) => log::info!("received unhandled websocket message: {}", m),
- Err(tungstenite::Error::Io(e)) if e.kind() == std::io::ErrorKind::WouldBlock => {
- log::info!("client {} receive would block", ev.key);
- },
- Err(e) => utils::erm(e)?,
- }
- poller.modify(sock.get_ref(), polling::Event::readable(ev.key))
- .wrap_err("failed to modify event to poll")?;
- } else {
- log::warn!("poller indicated event for unknown client: {}", ev.key);
- }
- };
- if let Err(e) = res {
- log::warn!("error on client {} connection, disconnecting: {}", ev.key, e);
- recv_clients_ref.lock().unwrap().remove(&ev.key);
- }
- }
- }
- };
- if let Err(e) = res {
- log::warn!("unhandled error in websocket thread, stopping server: {}", e);
- *channels_ref.lock().unwrap() = None;
- return;
- }
- });
- }
- pub fn clients(&self) -> Vec<ClientId> {
- self.clients.lock().unwrap().keys().copied().collect()
- }
- pub fn poll(&mut self) -> Option<(ClientId, Message)> {
- if let Some((_, incoming)) = &*self.channels.lock().unwrap() {
- incoming.try_recv().ok()
- } else { None }
- }
- pub fn send(&self, client: ClientId, msg: Message) {
- if let Some((outgoing, _)) = &mut *self.channels.lock().unwrap() {
- if let Err(e) = outgoing.send((client, msg)) {
- log::warn!("failed to send websocket message to client {} on channel: {}", client, e);
- }
- } else {
- log::warn!("tried to send message to client {}, but websocket is not connected", client);
- }
- }
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/physics.rs b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/physics.rs
deleted file mode 100644
index e69de29..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/physics.rs
+++ /dev/null
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/renderer.rs b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/renderer.rs
deleted file mode 100644
index c22c973..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/renderer.rs
+++ /dev/null
@@ -1,337 +0,0 @@
-use crate::{context, state, shader, texture, mesh};
-
-use bitflags::bitflags;
-
-bitflags! {
- #[derive(Clone, Copy, Debug, PartialEq, Eq)]
- pub struct UberFlags: u32 {
- const TEXTURE_COLOR = 0b0000000001;
- const TEXTURE_NORMAL = 0b0000000010;
- const FLIP_TEXTURE = 0b0000000100;
- const LIGHT_AMBIENT = 0b0000001000;
- const LIGHT_DIR = 0b0000010000;
- const LIGHT_POINT = 0b0000100000;
- const SPRITE = 0b0001000000;
- const EFFECTS = 0b0010000000;
- const YSKEW = 0b0100000000;
- const VERTEX_COLOR = 0b1000000000;
- }
-}
-impl UberFlags {
- fn prelude() -> String {
- let mut s = String::new();
- s += "#version 300 es\nprecision highp float;";
- for (nm, f) in Self::all().iter_names() {
- s += &format!("const int {} = {};\n", nm, f.bits());
- }
- s
- }
- fn set_flags(self, ctx: &context::Context, shader: &shader::Shader) {
- shader.set_i32(ctx, "flags", self.bits() as i32);
- }
-}
-
-pub trait Assets {
- type Shader: PartialEq + Eq + Clone + Copy;
- fn shader(&self, i: Self::Shader) -> &shader::Shader;
- type Texture: PartialEq + Eq + Clone + Copy;
- fn texture(&self, i: Self::Texture) -> &texture::Texture;
- type Mesh: PartialEq + Eq + Clone + Copy;
- fn mesh(&self, i: Self::Mesh) -> &mesh::Mesh;
- type Material: PartialEq + Eq + Clone + Copy;
- fn material(&self, i: Self::Material) -> &texture::Material;
-}
-
-#[derive(Debug, Clone, Copy, PartialEq, Eq)]
-enum ShaderMode { TwoDimension, ThreeDimension, ThreeDimensionOrth }
-#[derive(Debug, Clone, Copy)]
-enum BoundShader<A: Assets> { None, Uber(UberFlags, ShaderMode), Shader(A::Shader, ShaderMode) }
-impl<A: Assets> PartialEq for BoundShader<A> {
- fn eq(&self, other: &Self) -> bool {
- match (self, other) {
- (Self::None, Self::None) => true,
- (Self::Uber(sf, sm), Self::Uber(of, om)) => sf == of && sm == om,
- (Self::Shader(ss, sm), Self::Shader(os, om)) => ss == os && sm == om,
- _ => false,
- }
- }
-}
-#[derive(Debug, Clone, Copy)]
-enum BoundTexture<A: Assets> { None, Texture(A::Texture), Material(A::Material) }
-impl<A: Assets> PartialEq for BoundTexture<A> {
- fn eq(&self, other: &Self) -> bool {
- match (self, other) {
- (Self::None, Self::None) => true,
- (Self::Texture(s), Self::Texture(o)) => s == o,
- (Self::Material(s), Self::Material(o)) => s == o,
- _ => false,
- }
- }
-}
-pub struct Renderer<A: Assets> {
- pub assets: A,
- shader_uber: shader::Shader,
- shader: BoundShader<A>,
- texture: BoundTexture<A>,
-}
-impl<A: Assets> Renderer<A> {
- pub fn new<F>(ctx: &context::Context, f: F) -> Self
- where F: FnOnce(&context::Context) -> A {
- let shader_uber = shader::Shader::new_nolib(ctx,
- &format!("{}{}", UberFlags::prelude(), include_str!("assets/shaders/uber/vert.glsl")),
- &format!("{}{}", UberFlags::prelude(), include_str!("assets/shaders/uber/frag.glsl")),
- );
- shader_uber.bind(ctx);
- shader_uber.set_i32(ctx, "texture_normal", 1);
- Self {
- assets: f(ctx),
- shader_uber,
- shader: BoundShader::None,
- texture: BoundTexture::None,
- }
- }
- pub fn font_char_width(&self, st: &state::State) -> f32 { st.font_default.char_width as f32 }
- pub fn font_char_height(&self, st: &state::State) -> f32 { st.font_default.char_height as f32 }
- pub fn unbind_texture(&mut self, _ctx: &context::Context, _st: &mut state::State) {
- self.texture = BoundTexture::None;
- }
- pub fn bind_texture(&mut self, ctx: &context::Context, _st: &mut state::State, texture: A::Texture) {
- if self.texture != BoundTexture::Texture(texture) {
- self.assets.texture(texture).bind(ctx);
- self.texture = BoundTexture::Texture(texture);
- }
- }
- pub fn bind_material(&mut self, ctx: &context::Context, _st: &mut state::State, mat: A::Material) {
- if self.texture != BoundTexture::Material(mat) {
- self.assets.material(mat).bind(ctx);
- self.texture = BoundTexture::Material(mat);
- }
- }
- fn shader(&self) -> Option<(&shader::Shader, ShaderMode)> {
- match self.shader {
- BoundShader::Uber(_, sm) => Some((&self.shader_uber, sm)),
- BoundShader::Shader(s, sm) => Some((self.assets.shader(s), sm)),
- _ => None,
- }
- }
- fn bind_uber(&mut self,
- ctx: &context::Context, st: &mut state::State,
- flags: UberFlags, mode: ShaderMode,
- ) {
- if let BoundShader::Uber(f, sm) = self.shader && f == flags && sm == mode { return }
- match mode {
- ShaderMode::TwoDimension => st.bind_2d(ctx, &self.shader_uber),
- ShaderMode::ThreeDimension => st.bind_3d(ctx, &self.shader_uber),
- ShaderMode::ThreeDimensionOrth => st.bind_3d_orth(ctx, &self.shader_uber),
- }
- flags.set_flags(ctx, &self.shader_uber);
- self.shader = BoundShader::Uber(flags, mode)
- }
- fn bind_shader(&mut self,
- ctx: &context::Context, st: &mut state::State,
- shader: A::Shader, mode: ShaderMode,
- ) {
- if let BoundShader::Shader(s, sm) = self.shader && s == shader && sm == mode { return }
- match mode {
- ShaderMode::TwoDimension => st.bind_2d(ctx, self.assets.shader(shader)),
- ShaderMode::ThreeDimension => st.bind_3d(ctx, self.assets.shader(shader)),
- ShaderMode::ThreeDimensionOrth => st.bind_3d_orth(ctx, self.assets.shader(shader)),
- }
- self.shader = BoundShader::Shader(shader, mode)
- }
- pub fn bind_uber_2d(&mut self, ctx: &context::Context, st: &mut state::State, flags: UberFlags) {
- self.bind_uber(ctx, st, flags, ShaderMode::TwoDimension);
- }
- pub fn bind_uber_3d(&mut self, ctx: &context::Context, st: &mut state::State, flags: UberFlags) {
- self.bind_uber(ctx, st, flags, ShaderMode::ThreeDimension);
- }
- pub fn bind_uber_3d_orth(&mut self, ctx: &context::Context, st: &mut state::State, flags: UberFlags) {
- self.bind_uber(ctx, st, flags, ShaderMode::ThreeDimensionOrth);
- }
- pub fn bind_shader_2d(&mut self, ctx: &context::Context, st: &mut state::State, shader: A::Shader) {
- self.bind_shader(ctx, st, shader, ShaderMode::TwoDimension);
- }
- pub fn bind_shader_3d(&mut self, ctx: &context::Context, st: &mut state::State, shader: A::Shader) {
- self.bind_shader(ctx, st, shader, ShaderMode::ThreeDimension);
- }
- pub fn render(&self, ctx: &context::Context, _st: &state::State, mesh: A::Mesh) {
- self.assets.mesh(mesh).render(ctx)
- }
- pub fn render_square(&self, ctx: &context::Context, st: &state::State) {
- st.mesh_square.render(ctx)
- }
- pub fn set_position_2d_mat(&self, ctx: &context::Context, st: &state::State, pos: glam::Mat4) {
- if let Some((s, sm)) = self.shader() {
- debug_assert!(sm == ShaderMode::TwoDimension, "attempted to set_position_2d in wrong mode");
- s.set_position_2d_mat(ctx, st, &pos);
- }
- }
- pub fn set_position_2d_rotate(&self, ctx: &context::Context, st: &state::State, pos: glam::Vec2, dims: glam::Vec2, rot: glam::Quat) {
- if let Some((s, sm)) = self.shader() {
- debug_assert!(sm == ShaderMode::TwoDimension, "attempted to set_position_2d in wrong mode");
- s.set_position_2d_helper(ctx, st, &pos, &dims, &rot)
- }
- }
- pub fn set_position_2d(&self, ctx: &context::Context, st: &state::State, pos: glam::Vec2, dims: glam::Vec2) {
- if let Some((s, sm)) = self.shader() {
- debug_assert!(sm == ShaderMode::TwoDimension, "attempted to set_position_2d in wrong mode");
- s.set_position_2d(ctx, st, &pos, &dims)
- }
- }
- pub fn set_position_3d(&self, ctx: &context::Context, st: &state::State, pos: glam::Mat4) {
- if let Some((s, sm)) = self.shader() {
- debug_assert!(sm == ShaderMode::ThreeDimension || sm == ShaderMode::ThreeDimensionOrth,
- "attempted to set_position_3d in wrong mode"
- );
- s.set_position_3d(ctx, st, &pos)
- }
- }
- pub fn set_i32(&self, ctx: &context::Context, _st: &state::State, nm: &str, val: i32) {
- if let Some((s, _)) = self.shader() { s.set_i32(ctx, nm, val) }
- }
- pub fn set_f32(&self, ctx: &context::Context, _st: &state::State, nm: &str, val: f32) {
- if let Some((s, _)) = self.shader() { s.set_f32(ctx, nm, val) }
- }
- pub fn set_vec2(&self, ctx: &context::Context, _st: &state::State, nm: &str, val: glam::Vec2) {
- if let Some((s, _)) = self.shader() { s.set_vec2(ctx, nm, &val) }
- }
- pub fn set_vec3(&self, ctx: &context::Context, _st: &state::State, nm: &str, val: glam::Vec3) {
- if let Some((s, _)) = self.shader() { s.set_vec3(ctx, nm, &val) }
- }
- pub fn set_vec4(&self, ctx: &context::Context, _st: &state::State, nm: &str, val: glam::Vec4) {
- if let Some((s, _)) = self.shader() { s.set_vec4(ctx, nm, &val) }
- }
- pub fn set_mat4(&self, ctx: &context::Context, _st: &state::State, nm: &str, val: glam::Mat4) {
- if let Some((s, _)) = self.shader() { s.set_mat4(ctx, nm, &val) }
- }
- pub fn set_texture_offset(&self,
- ctx: &context::Context, st: &state::State,
- xinc: i32, yinc: i32,
- x: i32, y: i32
- ) {
- let xcount = xinc as f32; let xratio = 1.0 / xcount;
- let ycount = yinc as f32; let yratio = 1.0 / ycount;
- self.set_vec2(
- ctx, st, "sprite_dims",
- glam::Vec2::new(xratio, yratio),
- );
- self.set_vec2(
- ctx, st, "sprite_offset",
- glam::Vec2::new((x % xinc) as f32 * xratio, (y % yinc) as f32 * yratio),
- );
- }
-
- /// Common case: draw the given textured mesh in the world (units are world tiles)
- pub fn textured_mesh_world(&mut self,
- ctx: &context::Context, st: &mut state::State,
- shader: A::Shader,
- texture: A::Texture,
- mesh: A::Mesh,
- pos: glam::Mat4,
- ) {
- self.bind_shader_3d(ctx, st, shader);
- self.bind_texture(ctx, st, texture);
- self.set_position_3d(ctx, st, pos);
- self.render(ctx, st, mesh);
- }
-
- /// Common case: draw the given color in a rectangle on the screen (units are pixels, pos is top left)
- pub fn color_screen(&mut self,
- ctx: &context::Context, st: &mut state::State,
- color: glam::Vec4,
- pos: glam::Vec2,
- dims: glam::Vec2,
- ) {
- self.bind_uber_2d(ctx, st, UberFlags::empty());
- self.set_vec4(ctx, st, "color", color);
- self.set_position_2d(ctx, st, pos, dims);
- self.render_square(ctx, st);
- }
-
- /// Common case: draw the given texture on the screen (units are pixels, pos is top left)
- pub fn texture_screen(&mut self,
- ctx: &context::Context, st: &mut state::State,
- texture: A::Texture,
- pos: glam::Vec2,
- dims: glam::Vec2,
- ) {
- self.bind_uber_2d(ctx, st, UberFlags::TEXTURE_COLOR);
- self.bind_texture(ctx, st, texture);
- self.set_position_2d(ctx, st, pos, dims);
- self.render_square(ctx, st);
- }
-
- pub fn texture_screen_rotate(&mut self,
- ctx: &context::Context, st: &mut state::State,
- texture: A::Texture,
- pos: glam::Vec2,
- dims: glam::Vec2,
- rot: glam::Quat,
- ) {
- self.bind_uber_2d(ctx, st, UberFlags::TEXTURE_COLOR);
- self.bind_texture(ctx, st, texture);
- self.set_position_2d_rotate(ctx, st, pos, dims, rot);
- self.render_square(ctx, st);
- }
-
- pub fn texture_screen_recolor(&mut self,
- ctx: &context::Context, st: &mut state::State,
- texture: A::Texture, hue: f32,
- pos: glam::Vec2,
- dims: glam::Vec2,
- ) {
- self.bind_uber_2d(ctx, st, UberFlags::TEXTURE_COLOR | UberFlags::EFFECTS);
- self.bind_texture(ctx, st, texture);
- self.set_f32(ctx, st, "effect_huescale", 0.0);
- self.set_f32(ctx, st, "effect_hueshift", hue);
- self.set_position_2d(ctx, st, pos, dims);
- self.render_square(ctx, st);
- self.set_f32(ctx, st, "effect_huescale", 1.0);
- self.set_f32(ctx, st, "effect_hueshift", 0.0);
- }
-
- /// Common case: text in the default font (units are pixels, pos is top left)
- pub fn text_screen(&mut self,
- ctx: &context::Context, st: &mut state::State,
- pos: glam::Vec2,
- s: &str,
- ) {
- // drawing text might bind the texture
- self.texture = BoundTexture::None;
- self.bind_uber_2d(ctx, st, UberFlags::TEXTURE_COLOR | UberFlags::VERTEX_COLOR | UberFlags::FLIP_TEXTURE);
- let dims = glam::Vec2::new(st.font_default.char_width as f32, st.font_default.char_height as f32);
- let fpos = pos + glam::Vec2::new(-dims.x / 2.0, dims.y / 2.0);
- self.set_position_2d(ctx, st, fpos, dims);
- st.font_default.render_text(ctx, st, s);
- }
-
- /// Common case: text in the default font, with a color (units are pixels, pos is top left)
- pub fn text_colored_screen(&mut self,
- ctx: &context::Context, st: &mut state::State,
- pos: glam::Vec2,
- col: glam::Vec3,
- s: &str,
- ) {
- self.texture = BoundTexture::None;
- self.bind_uber_2d(ctx, st, UberFlags::TEXTURE_COLOR | UberFlags::VERTEX_COLOR | UberFlags::FLIP_TEXTURE);
- let dims = glam::Vec2::new(st.font_default.char_width as f32, st.font_default.char_height as f32);
- let fpos = pos + glam::Vec2::new(-dims.x / 2.0, st.font_default.char_height as f32 / 2.0);
- self.set_position_2d(ctx, st, fpos, dims);
- st.font_default.render_text_helper(ctx, st, s, &[col]);
- }
-
- /// Common case: text in the default font (units are pixels, pos is center)
- pub fn text_centered_screen(&mut self,
- ctx: &context::Context, st: &mut state::State,
- pos: glam::Vec2,
- s: &str,
- ) {
- self.texture = BoundTexture::None;
- self.bind_uber_2d(ctx, st, UberFlags::TEXTURE_COLOR | UberFlags::VERTEX_COLOR | UberFlags::FLIP_TEXTURE);
- let width = s.len() as f32 * st.font_default.char_width as f32;
- let dims = glam::Vec2::new(st.font_default.char_width as f32, st.font_default.char_height as f32);
- let fpos = pos + glam::Vec2::new(-dims.x / 2.0 - (width / 2.0).round(), st.font_default.char_height as f32 / 2.0);
- self.set_position_2d(ctx, st, fpos, dims);
- st.font_default.render_text(ctx, st, s);
- }
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/save.rs b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/save.rs
deleted file mode 100644
index 1297a1b..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/save.rs
+++ /dev/null
@@ -1,47 +0,0 @@
-#[cfg(target_arch = "wasm32")]
-use base64::prelude::*;
-
-#[cfg(target_arch = "wasm32")]
-pub fn save<W>(id: &str, data: &W) where W: serde::Serialize {
- let window = web_sys::window().expect("failed to get window object");
- let storage = window.local_storage()
- .expect("failed to get local storage")
- .expect("local storage not present");
- let key = format!("{}_save", id);
- let val = bincode::serde::encode_to_vec(data, bincode::config::standard()).expect("failed to serialize save");
- let str = BASE64_STANDARD.encode(&val);
- storage.set_item(&key, &str).expect("failed to set save");
-}
-
-#[cfg(target_arch = "wasm32")]
-pub fn load<W>(id: &str) -> Option<W> where W: serde::de::DeserializeOwned {
- let window = web_sys::window().expect("failed to get window object");
- let storage = window.local_storage()
- .expect("failed to get local storage")
- .expect("local storage not present");
- let key = format!("{}_save", id);
- let s = storage.get_item(&key).expect("failed to get save").expect("save not present");
- let bytes = BASE64_STANDARD.decode(&s).expect("failed to decode base64 for save");
- let (ret, _) = bincode::serde::decode_from_slice(&bytes, bincode::config::standard())
- .expect("failed to deserialize save");
- Some(ret)
-}
-
-#[cfg(not(target_arch = "wasm32"))]
-pub fn save<W>(id: &str, data: &W) where W: serde::Serialize {
- let pd = directories::ProjectDirs::from("", "milkfat", id).expect("failed to get save directory");
- let _ = std::fs::create_dir_all(pd.data_dir());
- let path = pd.data_dir().join("teleia.save");
- let mut file = std::fs::File::create(&path).expect("failed to open save file");
- bincode::serde::encode_into_std_write(data, &mut file, bincode::config::standard())
- .expect("failed to write save file");
-}
-
-#[cfg(not(target_arch = "wasm32"))]
-pub fn load<W>(id: &str) -> Option<W> where W: serde::de::DeserializeOwned {
- let pd = directories::ProjectDirs::from("", "milkfat", id).expect("failed to get save directory");
- let _ = std::fs::create_dir_all(pd.data_dir());
- let path = pd.data_dir().join("teleia.save");
- let mut file = std::fs::File::open(&path).ok()?;
- bincode::serde::decode_from_std_read(&mut file, bincode::config::standard()).ok()
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/scene.rs b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/scene.rs
deleted file mode 100644
index a904bf1..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/scene.rs
+++ /dev/null
@@ -1,401 +0,0 @@
-use std::{collections::{HashMap, VecDeque}, mem::offset_of};
-
-use glow::HasContext;
-use image::EncodableLayout;
-
-use crate::{context, mesh, shader, texture};
-
-pub type Index = usize;
-
-pub struct Primitive {
- pub mesh: mesh::Mesh,
- pub material: Index,
-}
-
-pub struct Object {
- pub primitives: Vec<Primitive>,
-}
-
-pub struct Material {
- pub base_color_factor: glam::Vec4,
- pub base_color_texture: Option<Index>,
-
- pub metallic_factor: f32,
- pub roughness_factor: f32,
- pub metallic_roughness_texture: Option<Index>,
-
- pub normal_texture: Option<Index>,
-
- pub occlusion_texture: Option<Index>,
-
- pub emissive_factor: glam::Vec3,
- pub emissive_texture: Option<Index>,
-}
-
-pub struct Skin {
- pub inverse_bind_matrices: Vec<glam::Mat4>,
- pub joints: Vec<Index>,
-}
-
-pub enum ChannelValues {
- Translation(Vec<glam::Vec3>),
- Rotation(Vec<glam::Quat>),
- Scale(Vec<glam::Vec3>),
-}
-
-pub enum Interpolation {
- Linear,
- Step,
- CubicSpline,
-}
-
-pub struct Channel {
- pub target: Index,
- pub interpolation: Interpolation,
- pub keyframes: Vec<f32>,
- pub values: ChannelValues,
-}
-
-pub struct Animation {
- pub channels: Vec<Channel>,
-}
-
-pub struct Node {
- pub children: Vec<Index>,
- pub object: Option<Index>,
- pub skin: Option<Index>,
- pub transform: glam::Mat4,
-}
-
-pub struct Scene {
- pub objects: Vec<Object>,
- pub textures: Vec<texture::Texture>,
- pub materials: Vec<Material>,
- pub skins: Vec<Skin>,
- pub animations: HashMap<String, Animation>,
- pub nodes: Vec<Node>,
- pub nodes_by_name: HashMap<String, Index>,
- pub scene_nodes: Vec<Index>,
-}
-
-impl Scene {
- pub fn load_default_shader(ctx: &context::Context) -> shader::Shader {
- shader::Shader::new(
- ctx,
- include_str!("assets/shaders/scene/vert.glsl"),
- include_str!("assets/shaders/scene/frag.glsl")
- )
- }
- pub fn from_gltf(ctx: &context::Context, bytes: &[u8]) -> Self {
- let (gltf, buffers, images) = gltf::import_slice(bytes).expect("failed to parse GLTF");
- let get_buffer_data = |b: gltf::Buffer| {
- buffers.get(b.index()).map(|gltf::buffer::Data(bytes)| bytes.as_slice())
- };
- let objects = gltf.meshes().map(|m| {
- let primitives = m.primitives().map(|p| {
- let mode = match p.mode() {
- gltf::mesh::Mode::Points => glow::POINTS,
- gltf::mesh::Mode::Lines => glow::LINES,
- gltf::mesh::Mode::LineLoop => glow::LINE_LOOP,
- gltf::mesh::Mode::LineStrip => glow::LINE_STRIP,
- gltf::mesh::Mode::Triangles => glow::TRIANGLES,
- gltf::mesh::Mode::TriangleStrip => glow::TRIANGLE_STRIP,
- gltf::mesh::Mode::TriangleFan => glow::TRIANGLE_FAN,
- };
- unsafe {
- let vao = ctx.gl.create_vertex_array().expect("failed to initialize vao");
- ctx.gl.bind_vertex_array(Some(vao));
-
- // in the past, I've been lazy and just uploaded whole buffers to the GPU.
- // this is certainly not the right thing to do in general.
- // perhaps I am misunderstanding, but it feels like GLTF makes it pretty difficult to do
- // that in general, on account of things like sparse accessors.
- // instead, we'll use the gltf crate's handy "reader" abstraction to iterate over all of the
- // data in the buffers, assemble it ourselves, and then upload that.
- let reader = p.reader(get_buffer_data);
-
- // on to the actual vertex data.
- // this is the layout of a single vertex in the buffer we send to the GPU.
- struct Vertex {
- pos: glam::Vec3,
- normal: glam::Vec3,
- texcoord: glam::Vec2,
- joints: glam::Vec4,
- weights: glam::Vec4,
- }
-
- // vertices always have positions
- let mut vertices = Vec::new();
- for pos in reader.read_positions().expect("primitive has no positions") {
- vertices.push(Vertex {
- pos: glam::Vec3::from_array(pos),
- normal: glam::Vec3::default(),
- texcoord: glam::Vec2::default(),
- joints: glam::Vec4::default(),
- weights: glam::Vec4::default(),
- });
- }
-
- // if we find indices, use those. otherwise generate indices
- let indices: Vec<u32> = if let Some(ri) = reader.read_indices() {
- ri.into_u32().collect()
- } else {
- vertices.iter().enumerate().map(|(i, _)| i as u32).collect()
- };
- let indices_bytes: Vec<u8> = indices.iter().flat_map(|x| x.to_ne_bytes()).collect();
- let indices_buf = ctx.gl.create_buffer().expect("failed to create index buffer object");
- ctx.gl.bind_buffer(glow::ELEMENT_ARRAY_BUFFER, Some(indices_buf));
- ctx.gl.buffer_data_u8_slice(
- glow::ELEMENT_ARRAY_BUFFER,
- &indices_bytes,
- glow::STATIC_DRAW,
- );
-
- // optionally, we might have some other vertex attributes too
- if let Some(iter) = reader.read_normals() {
- for (i, n) in iter.enumerate() {
- vertices[i].normal = glam::Vec3::from_array(n)
- }
- }
- if let Some(iter) = reader.read_tex_coords(0) {
- for (i, uv) in iter.into_f32().enumerate() {
- vertices[i].texcoord = glam::Vec2::from_array(uv)
- }
- }
- if let Some(iter) = reader.read_joints(0) {
- for (i, j) in iter.into_u16().enumerate() {
- vertices[i].joints = glam::Vec4::from_slice(&j.into_iter().map(|x| x as f32).collect::<Vec<f32>>())
- }
- }
- if let Some(iter) = reader.read_weights(0) {
- for (i, w) in iter.into_f32().enumerate() {
- vertices[i].weights = glam::Vec4::from_array(w)
- }
- }
-
- let vertex_size = std::mem::size_of::<Vertex>() as i32;
- let vertices_buf = ctx.gl.create_buffer().expect("failed to create buffer object");
- ctx.gl.bind_buffer(glow::ARRAY_BUFFER, Some(vertices_buf));
- ctx.gl.buffer_data_u8_slice(
- glow::ARRAY_BUFFER,
- std::slice::from_raw_parts(
- vertices.as_ptr() as _,
- vertices.len() * (vertex_size as usize),
- ),
- glow::STATIC_DRAW,
- );
- ctx.gl.enable_vertex_attrib_array(mesh::ATTRIB_VERTEX);
- ctx.gl.vertex_attrib_pointer_f32(mesh::ATTRIB_VERTEX, 3, glow::FLOAT, false, vertex_size, offset_of!(Vertex, pos) as _);
- ctx.gl.enable_vertex_attrib_array(mesh::ATTRIB_NORMAL);
- ctx.gl.vertex_attrib_pointer_f32(mesh::ATTRIB_NORMAL, 3, glow::FLOAT, false, vertex_size, offset_of!(Vertex, normal) as _);
- ctx.gl.enable_vertex_attrib_array(mesh::ATTRIB_TEXCOORD);
- ctx.gl.vertex_attrib_pointer_f32(mesh::ATTRIB_TEXCOORD, 2, glow::FLOAT, false, vertex_size, offset_of!(Vertex, texcoord) as _);
- ctx.gl.enable_vertex_attrib_array(mesh::ATTRIB_JOINT);
- ctx.gl.vertex_attrib_pointer_f32(mesh::ATTRIB_JOINT, 4, glow::FLOAT, false, vertex_size, offset_of!(Vertex, joints) as _);
- ctx.gl.enable_vertex_attrib_array(mesh::ATTRIB_WEIGHT);
- ctx.gl.vertex_attrib_pointer_f32(mesh::ATTRIB_WEIGHT, 4, glow::FLOAT, false, vertex_size, offset_of!(Vertex, weights) as _);
-
-
- Primitive {
- mesh: mesh::Mesh {
- vao,
- vbo_vertex: vertices_buf,
- vbo_index: indices_buf,
- vbo_normal: None,
- vbo_texcoord: None,
- mode,
- index_count: indices.len(),
- index_type: glow::UNSIGNED_INT,
- index_offset: 0,
- },
- material: p.material().index().unwrap(),
- }
- }
- }).collect();
- Object {
- primitives,
- }
- }).collect();
- let textures: Vec<texture::Texture> = images.into_iter().map(|bi| {
- unsafe {
- let i = bi.image.into_rgba8();
- let tex = ctx.gl.create_texture().expect("failed to create texture");
- ctx.gl.bind_texture(glow::TEXTURE_2D, Some(tex));
- ctx.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_WRAP_S, glow::CLAMP_TO_EDGE as i32);
- ctx.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_WRAP_T, glow::CLAMP_TO_EDGE as i32);
- ctx.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_MIN_FILTER, glow::NEAREST as i32);
- ctx.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_MAG_FILTER, glow::NEAREST as i32);
- ctx.gl.tex_image_2d(
- glow::TEXTURE_2D,
- 0,
- glow::RGBA as i32,
- i.width() as i32,
- i.height() as i32,
- 0,
- glow::RGBA,
- glow::UNSIGNED_BYTE,
- Some(i.as_bytes()),
- );
- ctx.gl.generate_mipmap(glow::TEXTURE_2D);
- texture::Texture { tex, width: i.width() as i32, height: i.height() as i32 }
- }
- }).collect();
- let materials: Vec<Material> = gltf.materials().map(|m| {
- let pbr = m.pbr_metallic_roughness();
- let [bcr, bcg, bcb, bca] = pbr.base_color_factor();
- let [emx, emy, emz] = m.emissive_factor();
- Material {
- base_color_factor: glam::Vec4::new(bcr, bcg, bcb, bca),
- base_color_texture: pbr.base_color_texture().map(|tex| tex.texture().source().index()),
- metallic_factor: pbr.metallic_factor(),
- roughness_factor: pbr.roughness_factor(),
- metallic_roughness_texture: pbr.metallic_roughness_texture().map(|tex| tex.texture().source().index()),
- normal_texture: m.normal_texture().map(|tex| tex.texture().source().index()),
- occlusion_texture: m.occlusion_texture().map(|tex| tex.texture().source().index()),
- emissive_factor: glam::Vec3::new(emx, emy, emz),
- emissive_texture: m.emissive_texture().map(|tex| tex.texture().source().index()),
- }
- }).collect();
-
- let skins = gltf.skins().map(|s| {
- let ibm = s.reader(get_buffer_data).read_inverse_bind_matrices()
- .expect("missing read inverse bind matrices")
- .map(|m| glam::Mat4::from_cols_array_2d(&m)).collect();
- Skin {
- inverse_bind_matrices: ibm,
- joints: s.joints().map(|j| j.index()).collect(),
- }
- }).collect();
-
- let animations = HashMap::from_iter(gltf.animations().filter_map(|a| {
- let channels = a.channels().map(|c| {
- let read = c.reader(get_buffer_data);
- Channel {
- target: c.target().node().index(),
- interpolation: match c.sampler().interpolation() {
- gltf::animation::Interpolation::Linear => Interpolation::Linear,
- gltf::animation::Interpolation::Step => Interpolation::Step,
- gltf::animation::Interpolation::CubicSpline => Interpolation::CubicSpline,
- },
- keyframes: read.read_inputs().expect("channel has no inputs").collect(),
- values: match read.read_outputs().expect("channel has no outputs") {
- gltf::animation::util::ReadOutputs::Translations(ts) =>
- ChannelValues::Translation(ts.map(glam::Vec3::from_array).collect()),
- gltf::animation::util::ReadOutputs::Rotations(ts) =>
- ChannelValues::Rotation(ts.into_f32().map(glam::Quat::from_array).collect()),
- gltf::animation::util::ReadOutputs::Scales(ts) =>
- ChannelValues::Scale(ts.map(glam::Vec3::from_array).collect()),
- _ => panic!("unsupport channel outputs"),
- },
- }
- }).collect();
- a.name().map(|nm| (nm.to_owned(), Animation { channels }))
- }));
-
- let nodes = gltf.nodes().map(|n| {
- Node {
- children: n.children().map(|c| c.index()).collect(),
- object: n.mesh().map(|m| m.index()),
- skin: n.skin().map(|s| s.index()),
- transform: glam::Mat4::from_cols_array_2d(&n.transform().matrix()),
- }
- }).collect();
-
- let mut nodes_by_name = HashMap::new();
- for n in gltf.nodes() {
- if let Some(nm) = n.name() {
- nodes_by_name.insert(nm.to_owned(), n.index());
- }
- }
-
- let scene_nodes = gltf.default_scene().unwrap().nodes().map(|n| n.index()).collect();
-
- Self {
- objects,
- textures,
- materials,
- skins,
- animations,
- nodes,
- nodes_by_name,
- scene_nodes,
- }
- }
-
- pub fn compute_joint_matrices(&self, skin: &Skin) -> Vec<glam::Mat4> {
- let mut q: VecDeque<(Index, glam::Mat4)> = VecDeque::new();
- q.push_back((skin.joints[0], glam::Mat4::IDENTITY));
- let mut transforms = vec![glam::Mat4::IDENTITY; self.nodes.len()];
- while let Some((ni, m)) = q.pop_front() {
- let n = &self.nodes[ni];
- transforms[ni] = m.mul_mat4(&n.transform);
- for ci in &n.children {
- q.push_back((*ci, transforms[ni]));
- }
- }
- let mut ret = vec![glam::Mat4::IDENTITY; skin.joints.len()];
- for (idx, ni) in skin.joints.iter().enumerate() {
- ret[idx] = transforms[*ni].mul_mat4(&skin.inverse_bind_matrices[idx]);
- }
- ret
- }
-
- fn render_node(&self, ctx: &context::Context, shader: &shader::Shader, n: &Node) {
- if let Some(o) = n.object.and_then(|i| self.objects.get(i)) {
- if let Some(s) = n.skin.and_then(|i| self.skins.get(i)) {
- let jms = self.compute_joint_matrices(s);
- shader.set_mat4_array(ctx, "joint_matrices[0]", &jms);
- }
- for p in &o.primitives {
- if let Some(tex) = self.materials.get(p.material)
- .and_then(|m| m.base_color_texture)
- .and_then(|t| self.textures.get(t)) {
- tex.bind(ctx);
- } else {
- texture::Texture::bind_initial(ctx);
- }
- p.mesh.render(ctx);
- }
- }
- }
-
- pub fn render(&self, ctx: &context::Context, shader: &shader::Shader) {
- let mut q: VecDeque<Index> = VecDeque::new();
- for sn in &self.scene_nodes {
- q.push_back(*sn);
- }
- while let Some(ni) = q.pop_front() {
- let n = &self.nodes[ni];
- self.render_node(ctx, shader, n);
- for ci in &n.children {
- q.push_back(*ci);
- }
- }
- }
-
- pub fn reflect_animation(&mut self, nm: &str, time: f32) {
- if let Some(anim) = self.animations.get(nm) {
- for c in &anim.channels {
- let (previ, nexti) = if let Some(nexti) = c.keyframes.iter().position(|x| *x > time) {
- let previ = if nexti > 0 { nexti - 1 } else { c.keyframes.len() - 1 };
- (previ, nexti)
- } else {
- (c.keyframes.len() - 1, 0)
- };
- if let ChannelValues::Rotation(vs) = &c.values {
- let prevt = c.keyframes[previ];
- let nextt = c.keyframes[nexti];
- let prev = vs[previ];
- let next = vs[nexti];
- let new = prev.slerp(next, (time - prevt) / (nextt - prevt));
- let (scale, _, trans) = self.nodes[c.target].transform.to_scale_rotation_translation();
- self.nodes[c.target].transform = glam::Mat4::from_scale_rotation_translation(
- scale,
- new,
- trans,
- );
- }
- }
- }
- }
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/shader.rs b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/shader.rs
deleted file mode 100644
index d18ba27..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/shader.rs
+++ /dev/null
@@ -1,260 +0,0 @@
-use std::collections::HashMap;
-
-use glow::HasContext;
-
-use crate::{context, font, mesh, state};
-
-const COMMON_VERT: &str = include_str!("assets/shaders/common/vert.glsl");
-const COMMON_FRAG: &str = include_str!("assets/shaders/common/frag.glsl");
-
-#[derive(Clone)]
-pub struct Shader {
- pub program: glow::Program,
- pub uniforms: std::rc::Rc<HashMap<String, glow::UniformLocation>>
-}
-
-impl Shader {
- pub fn new_helper(ctx: &context::Context, vsrc: &str, fsrc: &str) -> Result<Self, String> {
- unsafe {
- let program = ctx.gl.create_program()?;
-
- let vert = ctx.gl.create_shader(glow::VERTEX_SHADER)?;
- ctx.gl.shader_source(vert, vsrc);
- ctx.gl.compile_shader(vert);
- if !ctx.gl.get_shader_compile_status(vert) {
- return Err(format!(
- "failed to compile vertex shader:\n{}",
- ctx.gl.get_shader_info_log(vert)
- ));
- }
- ctx.gl.attach_shader(program, vert);
-
- let frag = ctx.gl.create_shader(glow::FRAGMENT_SHADER)?;
- ctx.gl.shader_source(frag, fsrc);
- ctx.gl.compile_shader(frag);
- if !ctx.gl.get_shader_compile_status(frag) {
- return Err(format!(
- "failed to compile fragment shader:\n{}",
- ctx.gl.get_shader_info_log(frag)
- ));
- }
- ctx.gl.attach_shader(program, frag);
-
- ctx.gl.bind_attrib_location(program, mesh::ATTRIB_VERTEX, "vertex");
- ctx.gl.bind_attrib_location(program, mesh::ATTRIB_NORMAL, "normal");
- ctx.gl.bind_attrib_location(program, mesh::ATTRIB_TEXCOORD, "texcoord");
- ctx.gl.bind_attrib_location(program, mesh::ATTRIB_JOINT, "joint");
- ctx.gl.bind_attrib_location(program, mesh::ATTRIB_WEIGHT, "weight");
- ctx.gl.bind_attrib_location(program, mesh::ATTRIB_COLOR, "color");
-
- ctx.gl.link_program(program);
- if !ctx.gl.get_program_link_status(program) {
- return Err(format!(
- "failed to link shader program:\n{}",
- ctx.gl.get_program_info_log(program),
- ));
- }
-
- ctx.gl.detach_shader(program, vert);
- ctx.gl.delete_shader(vert);
- ctx.gl.detach_shader(program, frag);
- ctx.gl.delete_shader(frag);
-
- ctx.gl.use_program(Some(program));
-
- let mut uniforms = HashMap::new();
- for index in 0..ctx.gl.get_active_uniforms(program) {
- if let Some(active) = ctx.gl.get_active_uniform(program, index) {
- if let Some(loc) = ctx.gl.get_uniform_location(program, &active.name) {
- uniforms.insert(active.name, loc);
- } else {
- log::warn!("failed to get location for uniform: {}", active.name);
- }
- } else {
- log::warn!("failed to get active uniform for index: {}", index);
- }
- }
-
- Ok(Self {
- program,
- uniforms: std::rc::Rc::new(uniforms),
- })
- }
- }
-
- pub fn new_nolib(ctx: &context::Context, vsrc: &str, fsrc: &str) -> Self {
- match Self::new_helper(ctx, vsrc, fsrc) {
- Ok(x) => x,
- Err(e) => panic!("failed to load no-library shader: {}", e)
- }
- }
-
- pub fn new(ctx: &context::Context, vsrcstr: &str, fsrcstr: &str) -> Self {
- let vsrc = format!("{}\n{}\n", COMMON_VERT, vsrcstr);
- let fsrc = format!("{}\n{}\n", COMMON_FRAG, fsrcstr);
- Self::new_nolib(ctx, &vsrc, &fsrc)
- }
-
- pub fn delete(&mut self, ctx: &context::Context) {
- unsafe { ctx.gl.delete_program(self.program); }
- }
-
- pub fn replace(&mut self, ctx: &context::Context, vsrc: &str, fsrc: &str) -> Result<(), String> {
- self.delete(ctx);
- *self = Self::new_helper(ctx, vsrc, fsrc)?;
- Ok(())
- }
-
- pub fn set_i32(&self, ctx: &context::Context, name: &str, val: i32) {
- if let Some(loc) = self.uniforms.get(name) {
- unsafe { ctx.gl.uniform_1_i32(Some(loc), val) }
- }
- }
-
- pub fn set_i32_array(&self, ctx: &context::Context, name: &str, val: &[i32]) {
- if let Some(loc) = self.uniforms.get(name) {
- unsafe {
- ctx.gl.uniform_1_i32_slice(Some(loc), val)
- }
- }
- }
-
- pub fn set_f32(&self, ctx: &context::Context, name: &str, val: f32) {
- if let Some(loc) = self.uniforms.get(name) {
- unsafe { ctx.gl.uniform_1_f32(Some(loc), val) }
- }
- }
-
- pub fn set_vec2(&self, ctx: &context::Context, name: &str, val: &glam::Vec2) {
- if let Some(loc) = self.uniforms.get(name) {
- unsafe {
- ctx.gl.uniform_2_f32(
- Some(loc),
- val.x,
- val.y,
- );
- }
- }
- }
-
- pub fn set_vec2_array(&self, ctx: &context::Context, name: &str, val: &[glam::Vec2]) {
- if let Some(loc) = self.uniforms.get(name) {
- let vs: Vec<f32> = val.iter().flat_map(|v| [v.x, v.y]).collect();
- unsafe {
- ctx.gl.uniform_2_f32_slice(
- Some(loc),
- &vs,
- );
- }
- }
- }
-
- pub fn set_vec3(&self, ctx: &context::Context, name: &str, val: &glam::Vec3) {
- if let Some(loc) = self.uniforms.get(name) {
- unsafe {
- ctx.gl.uniform_3_f32(
- Some(loc),
- val.x,
- val.y,
- val.z,
- );
- }
- }
- }
-
- pub fn set_vec3_array(&self, ctx: &context::Context, name: &str, val: &[glam::Vec3]) {
- if let Some(loc) = self.uniforms.get(name) {
- let vs: Vec<f32> = val.iter().flat_map(|v| [v.x, v.y, v.z]).collect();
- unsafe {
- ctx.gl.uniform_3_f32_slice(
- Some(loc),
- &vs,
- );
- }
- }
- }
-
- pub fn set_vec4(&self, ctx: &context::Context, name: &str, val: &glam::Vec4) {
- if let Some(loc) = self.uniforms.get(name) {
- unsafe {
- ctx.gl.uniform_4_f32(
- Some(loc),
- val.x,
- val.y,
- val.z,
- val.w,
- );
- }
- }
- }
-
- pub fn set_mat4(&self, ctx: &context::Context, name: &str, val: &glam::Mat4) {
- if let Some(loc) = self.uniforms.get(name) {
- unsafe {
- ctx.gl.uniform_matrix_4_f32_slice(
- Some(loc),
- false,
- &val.to_cols_array(),
- );
- }
- }
- }
-
- pub fn set_mat4_array(&self, ctx: &context::Context, name: &str, val: &[glam::Mat4]) {
- if let Some(loc) = self.uniforms.get(name) {
- let vs: Vec<f32> = val.iter().flat_map(|m| m.to_cols_array()).collect();
- unsafe {
- ctx.gl.uniform_matrix_4_f32_slice(
- Some(loc),
- false,
- &vs,
- );
- }
- }
- }
-
- pub fn set_position_3d(&self, ctx: &context::Context, _st: &state::State, position: &glam::Mat4) {
- self.set_mat4(ctx, "position", position);
- self.set_mat4(ctx, "normal_matrix", &position.inverse().transpose());
- }
-
- pub fn set_position_2d_mat(&self, ctx: &context::Context, st: &state::State, position: &glam::Mat4) {
- self.set_mat4(ctx, "position", position);
- }
-
- pub fn set_position_2d_helper(&self, ctx: &context::Context, st: &state::State, pos: &glam::Vec2, dims: &glam::Vec2, rot: &glam::Quat) {
- let halfwidth = dims.x / 2.0;
- let halfheight = dims.y / 2.0;
- self.set_mat4(
- ctx, "position",
- &glam::Mat4::from_scale_rotation_translation(
- glam::Vec3::new(halfwidth, halfheight, 1.0),
- *rot,
- glam::Vec3::new(
- -st.render_dims.x / 2.0 + pos.x + halfwidth,
- st.render_dims.y / 2.0 - pos.y - halfheight,
- 0.0,
- ),
- )
- );
- }
-
- pub fn set_position_2d(&self, ctx: &context::Context, st: &state::State, pos: &glam::Vec2, dims: &glam::Vec2) {
- self.set_position_2d_helper(ctx, st, pos, dims, &glam::Quat::IDENTITY)
- }
-
- pub fn set_position_text_bitmap(&self,
- ctx: &context::Context, st: &state::State,
- font: &font::Bitmap,
- pos: &glam::Vec2
- ) {
- let dims = glam::Vec2::new(font.char_width as f32, font.char_height as f32);
- self.set_position_2d_helper(ctx, st, pos, &dims, &glam::Quat::IDENTITY)
- }
-
- pub fn bind(&self, ctx: &context::Context) {
- unsafe {
- ctx.gl.use_program(Some(self.program));
- }
- }
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/shadow.rs b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/shadow.rs
deleted file mode 100644
index 8482179..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/shadow.rs
+++ /dev/null
@@ -1,127 +0,0 @@
-use glow::HasContext;
-
-use crate::context;
-
-pub struct ShadowBuffer {
- pub fbo: glow::Framebuffer,
- pub depth_tex: glow::Texture,
- pub width: i32,
- pub height: i32,
-}
-
-impl ShadowBuffer {
- pub fn new(ctx: &context::Context, w: i32, h: i32) -> Self {
- unsafe {
- // generate and bind FBO
- let fbo = ctx.gl.create_framebuffer().expect("failed to create framebuffer");
- ctx.gl.bind_framebuffer(glow::FRAMEBUFFER, Some(fbo));
-
- // generate and attach depth buffer
- let depth_tex = ctx.gl.create_texture().expect("failed to create texture");
- ctx.gl.bind_texture(glow::TEXTURE_2D, Some(depth_tex));
- ctx.gl.tex_image_2d(
- glow::TEXTURE_2D,
- 0,
- glow::DEPTH_COMPONENT as i32,
- w,
- h,
- 0,
- glow::DEPTH_COMPONENT,
- glow::FLOAT,
- None,
- );
- ctx.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_MIN_FILTER, glow::LINEAR as i32);
- ctx.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_MAG_FILTER, glow::LINEAR as i32);
- ctx.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_WRAP_S, glow::CLAMP_TO_BORDER as i32);
- ctx.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_WRAP_T, glow::CLAMP_TO_BORDER as i32);
- ctx.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_COMPARE_MODE, glow::COMPARE_REF_TO_TEXTURE as i32);
- ctx.gl.tex_parameter_f32_slice(glow::TEXTURE_2D, glow::TEXTURE_BORDER_COLOR, &[1.0, 1.0, 1.0, 1.0]);
- ctx.gl.framebuffer_texture_2d(glow::FRAMEBUFFER, glow::DEPTH_ATTACHMENT, glow::TEXTURE_2D, Some(depth_tex), 0);
- ctx.gl.draw_buffer(glow::NONE);
- ctx.gl.read_buffer(glow::NONE);
-
- let status = ctx.gl.check_framebuffer_status(glow::FRAMEBUFFER);
- if status != glow::FRAMEBUFFER_COMPLETE {
- panic!("error initializing framebuffer: {}", status);
- }
- Self {
- fbo,
- depth_tex,
- width: w,
- height: h,
- }
- }
- }
-
- pub fn bind(&self, ctx: &context::Context) {
- unsafe {
- ctx.gl.bind_framebuffer(glow::FRAMEBUFFER, Some(self.fbo));
- ctx.gl.viewport(0, 0, self.width as _, self.height as _);
- ctx.gl.clear(glow::DEPTH_BUFFER_BIT);
-
- }
- }
-}
-
-pub struct ShadowBuffer3D {
- pub fbo: glow::Framebuffer,
- pub depth_cubemap: glow::Texture,
- pub width: i32,
- pub height: i32,
-}
-
-impl ShadowBuffer3D {
- pub fn new(ctx: &context::Context, w: i32, h: i32) -> Self {
- unsafe {
- // generate and bind FBO
- let fbo = ctx.gl.create_framebuffer().expect("failed to create framebuffer");
- ctx.gl.bind_framebuffer(glow::FRAMEBUFFER, Some(fbo));
-
- // generate and attach depth buffer
- let depth_cubemap = ctx.gl.create_texture().expect("failed to create texture");
- ctx.gl.bind_texture(glow::TEXTURE_CUBE_MAP, Some(depth_cubemap));
- for i in 0..6 {
- ctx.gl.tex_image_2d(
- glow::TEXTURE_CUBE_MAP_POSITIVE_X + i,
- 0,
- glow::DEPTH_COMPONENT as i32,
- w,
- h,
- 0,
- glow::DEPTH_COMPONENT,
- glow::FLOAT,
- None,
- );
- ctx.gl.tex_parameter_i32(glow::TEXTURE_CUBE_MAP, glow::TEXTURE_MIN_FILTER, glow::LINEAR as i32);
- ctx.gl.tex_parameter_i32(glow::TEXTURE_CUBE_MAP, glow::TEXTURE_MAG_FILTER, glow::LINEAR as i32);
- ctx.gl.tex_parameter_i32(glow::TEXTURE_CUBE_MAP, glow::TEXTURE_WRAP_S, glow::CLAMP_TO_EDGE as i32);
- ctx.gl.tex_parameter_i32(glow::TEXTURE_CUBE_MAP, glow::TEXTURE_WRAP_T, glow::CLAMP_TO_EDGE as i32);
- ctx.gl.tex_parameter_i32(glow::TEXTURE_CUBE_MAP, glow::TEXTURE_WRAP_R, glow::CLAMP_TO_EDGE as i32);
- }
-
- ctx.gl.framebuffer_texture(glow::FRAMEBUFFER, glow::DEPTH_ATTACHMENT, Some(depth_cubemap), 0);
- ctx.gl.draw_buffer(glow::NONE);
- ctx.gl.read_buffer(glow::NONE);
-
- let status = ctx.gl.check_framebuffer_status(glow::FRAMEBUFFER);
- if status != glow::FRAMEBUFFER_COMPLETE {
- panic!("error initializing framebuffer: {}", status);
- }
- Self {
- fbo,
- depth_cubemap,
- width: w,
- height: h,
- }
- }
- }
-
- pub fn bind(&self, ctx: &context::Context) {
- unsafe {
- ctx.gl.bind_framebuffer(glow::FRAMEBUFFER, Some(self.fbo));
- ctx.gl.viewport(0, 0, self.width as _, self.height as _);
- ctx.gl.clear(glow::DEPTH_BUFFER_BIT);
-
- }
- }
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/state.rs b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/state.rs
deleted file mode 100644
index 3353f33..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/state.rs
+++ /dev/null
@@ -1,735 +0,0 @@
-#![allow(dead_code, unused_variables)]
-use bimap::BiHashMap;
-use enum_map::{Enum, EnumMap, enum_map};
-use serde::{Deserialize, Serialize};
-use std::{collections::HashMap, fmt::Display};
-use strum::EnumIter;
-
-#[cfg(not(target_arch = "wasm32"))]
-use glow::HasContext;
-
-use crate::{audio, context, font, framebuffer, mesh, shader, utils};
-
-pub type Tick = u64;
-
-const DELTA_TIME: f64 = 0.016; // todo
-
-pub const ORTH_WIDTH: f32 = 7.55869;
-pub const ORTH_HEIGHT: f32 = 5.03913;
-
-pub trait Game {
- fn initialize(&mut self, ctx: &context::Context, st: &mut State) -> utils::Erm<()> {
- Ok(())
- }
- fn finalize(&mut self, ctx: &context::Context, st: &mut State) -> utils::Erm<()> {
- Ok(())
- }
- fn initialize_audio(
- &self,
- ctx: &context::Context,
- st: &State,
- actx: &audio::Context,
- ) -> HashMap<String, audio::Audio> {
- HashMap::new()
- }
- fn keybindings_were_reset(&mut self, ctx: &context::Context, st: &mut State) -> utils::Erm<()> {
- Ok(())
- }
- fn mouse_move(
- &mut self,
- ctx: &context::Context,
- st: &mut State,
- x: i32,
- y: i32,
- ) -> utils::Erm<()> {
- Ok(())
- }
- fn mouse_press(&mut self, ctx: &context::Context, st: &mut State) -> utils::Erm<()> {
- Ok(())
- }
- fn mouse_released(&mut self, ctx: &context::Context, st: &mut State) -> utils::Erm<()> {
- Ok(())
- }
- fn update(&mut self, ctx: &context::Context, st: &mut State) -> utils::Erm<()> {
- Ok(())
- }
- fn render(&mut self, ctx: &context::Context, st: &mut State) -> utils::Erm<()> {
- Ok(())
- }
-}
-
-#[derive(Debug, Enum, EnumIter, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
-pub enum Key {
- Up,
- Down,
- Left,
- Right,
- A,
- B,
- X,
- Y,
- L,
- R,
- Start,
- Select,
- Debug,
-}
-#[derive(Default)]
-pub struct Keys {
- pub pressed: EnumMap<Key, bool>,
- pub new: EnumMap<Key, bool>,
-}
-impl Keys {
- pub fn new() -> Self {
- Self::default()
- }
- pub fn up(&self) -> bool {
- self.pressed[Key::Up]
- }
- pub fn down(&self) -> bool {
- self.pressed[Key::Down]
- }
- pub fn left(&self) -> bool {
- self.pressed[Key::Left]
- }
- pub fn right(&self) -> bool {
- self.pressed[Key::Right]
- }
- pub fn a(&self) -> bool {
- self.pressed[Key::A]
- }
- pub fn b(&self) -> bool {
- self.pressed[Key::B]
- }
- pub fn x(&self) -> bool {
- self.pressed[Key::X]
- }
- pub fn y(&self) -> bool {
- self.pressed[Key::Y]
- }
- pub fn l(&self) -> bool {
- self.pressed[Key::L]
- }
- pub fn r(&self) -> bool {
- self.pressed[Key::R]
- }
- pub fn start(&self) -> bool {
- self.pressed[Key::Start]
- }
- pub fn select(&self) -> bool {
- self.pressed[Key::Select]
- }
- pub fn debug(&self) -> bool {
- self.pressed[Key::Debug]
- }
- pub fn new_up(&mut self) -> bool {
- let ret = self.new[Key::Up];
- self.new[Key::Up] = false;
- ret
- }
- pub fn new_down(&mut self) -> bool {
- let ret = self.new[Key::Down];
- self.new[Key::Down] = false;
- ret
- }
- pub fn new_left(&mut self) -> bool {
- let ret = self.new[Key::Left];
- self.new[Key::Left] = false;
- ret
- }
- pub fn new_right(&mut self) -> bool {
- let ret = self.new[Key::Right];
- self.new[Key::Right] = false;
- ret
- }
- pub fn new_a(&mut self) -> bool {
- let ret = self.new[Key::A];
- self.new[Key::A] = false;
- ret
- }
- pub fn new_b(&mut self) -> bool {
- let ret = self.new[Key::B];
- self.new[Key::B] = false;
- ret
- }
- pub fn new_x(&mut self) -> bool {
- let ret = self.new[Key::X];
- self.new[Key::X] = false;
- ret
- }
- pub fn new_y(&mut self) -> bool {
- let ret = self.new[Key::Y];
- self.new[Key::Y] = false;
- ret
- }
- pub fn new_l(&mut self) -> bool {
- let ret = self.new[Key::L];
- self.new[Key::L] = false;
- ret
- }
- pub fn new_r(&mut self) -> bool {
- let ret = self.new[Key::R];
- self.new[Key::R] = false;
- ret
- }
- pub fn new_start(&mut self) -> bool {
- let ret = self.new[Key::Start];
- self.new[Key::Start] = false;
- ret
- }
- pub fn new_select(&mut self) -> bool {
- let ret = self.new[Key::Select];
- self.new[Key::Select] = false;
- ret
- }
- pub fn new_debug(&mut self) -> bool {
- let ret = self.new[Key::Debug];
- self.new[Key::Debug] = false;
- ret
- }
-}
-
-pub struct PointLight {
- pub pos: glam::Vec3,
- pub color: glam::Vec3,
- pub attenuation: glam::Vec2,
-}
-
-type Timestamp = f64;
-
-#[cfg(target_arch = "wasm32")]
-#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
-pub struct Keycode {
- pub kc: winit::keyboard::KeyCode,
-}
-#[cfg(target_arch = "wasm32")]
-impl Keycode {
- pub fn new(kc: winit::keyboard::KeyCode) -> Self {
- Self { kc }
- }
-}
-#[cfg(target_arch = "wasm32")]
-impl Display for Keycode {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- write!(f, "{:?}", self.kc)
- }
-}
-#[cfg(target_arch = "wasm32")]
-impl Serialize for Keycode {
- fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
- where
- S: serde::Serializer,
- {
- self.kc.serialize(serializer)
- }
-}
-#[cfg(target_arch = "wasm32")]
-impl<'de> Deserialize<'de> for Keycode {
- fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
- where
- D: serde::Deserializer<'de>,
- {
- let kc = winit::keyboard::KeyCode::deserialize(deserializer)?;
- Ok(Self { kc })
- }
-}
-
-#[cfg(not(target_arch = "wasm32"))]
-#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
-pub struct Keycode {
- pub kc: glfw::Key,
-}
-#[cfg(not(target_arch = "wasm32"))]
-impl Keycode {
- pub fn new(kc: glfw::Key) -> Self {
- Self { kc }
- }
-}
-#[cfg(not(target_arch = "wasm32"))]
-impl Display for Keycode {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- write!(f, "{:?}", self.kc)
- }
-}
-#[cfg(not(target_arch = "wasm32"))]
-impl Serialize for Keycode {
- fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
- where
- S: serde::Serializer,
- {
- (self.kc as i32).serialize(serializer)
- }
-}
-#[cfg(not(target_arch = "wasm32"))]
-impl<'de> Deserialize<'de> for Keycode {
- fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
- where
- D: serde::Deserializer<'de>,
- {
- i32::deserialize(deserializer).map(|x| unsafe { std::mem::transmute(x) })
- }
-}
-
-pub struct State {
- pub tick: Tick,
- pub nextframe: Timestamp,
- pub fps: u32,
- pub frames_this_second: u32,
- pub start_this_second: Timestamp,
-
- pub rebinding: Option<Key>,
- pub keybindings: BiHashMap<Keycode, Key>,
- pub keys: Keys,
-
- pub screen: framebuffer::Framebuffer,
- pub render_framebuffer: framebuffer::Framebuffer,
- pub render_dims: glam::Vec2,
- pub shader_upscale: shader::Shader,
- pub shader_text_bitmap: shader::Shader,
- pub mesh_square: mesh::Mesh,
- pub font_default: font::Bitmap,
- pub font_small: font::Bitmap,
- pub audio: Option<audio::Assets>,
-
- pub projection: glam::Mat4,
- pub projection_orth: glam::Mat4,
- pub camera: (glam::Vec3, glam::Vec3, glam::Vec3),
- pub lighting: (glam::Vec3, glam::Vec3, glam::Vec3),
- pub point_lights: Vec<PointLight>,
-}
-
-#[cfg(target_arch = "wasm32")]
-pub fn now(ctx: &context::Context) -> Timestamp {
- ctx.performance.now() / 1000.0
-}
-
-#[cfg(not(target_arch = "wasm32"))]
-pub fn now(ctx: &context::Context) -> Timestamp {
- let elapsed = ctx.start_instant.elapsed();
- let ms = elapsed.as_millis();
- (ms as f64) / 1000.0
-}
-
-#[cfg(target_arch = "wasm32")]
-pub fn default_keybindings() -> BiHashMap<Keycode, Key> {
- BiHashMap::from_iter(vec![
- (Keycode::new(winit::keyboard::KeyCode::KeyW), Key::Up),
- (Keycode::new(winit::keyboard::KeyCode::KeyS), Key::Down),
- (Keycode::new(winit::keyboard::KeyCode::KeyA), Key::Left),
- (Keycode::new(winit::keyboard::KeyCode::KeyD), Key::Right),
- (Keycode::new(winit::keyboard::KeyCode::Digit1), Key::A),
- (Keycode::new(winit::keyboard::KeyCode::Digit2), Key::B),
- (Keycode::new(winit::keyboard::KeyCode::Digit3), Key::X),
- (Keycode::new(winit::keyboard::KeyCode::Digit4), Key::Y),
- (Keycode::new(winit::keyboard::KeyCode::KeyQ), Key::L),
- (Keycode::new(winit::keyboard::KeyCode::KeyE), Key::R),
- (Keycode::new(winit::keyboard::KeyCode::Tab), Key::Start),
- (Keycode::new(winit::keyboard::KeyCode::Space), Key::Select),
- (
- Keycode::new(winit::keyboard::KeyCode::Backquote),
- Key::Debug,
- ),
- ])
-}
-
-#[cfg(not(target_arch = "wasm32"))]
-pub fn default_keybindings() -> BiHashMap<Keycode, Key> {
- BiHashMap::from_iter(vec![
- (Keycode::new(glfw::Key::W), Key::Up),
- (Keycode::new(glfw::Key::S), Key::Down),
- (Keycode::new(glfw::Key::A), Key::Left),
- (Keycode::new(glfw::Key::D), Key::Right),
- (Keycode::new(glfw::Key::Num1), Key::A),
- (Keycode::new(glfw::Key::Num2), Key::B),
- (Keycode::new(glfw::Key::Num3), Key::X),
- (Keycode::new(glfw::Key::Num4), Key::Y),
- (Keycode::new(glfw::Key::Q), Key::L),
- (Keycode::new(glfw::Key::E), Key::R),
- (Keycode::new(glfw::Key::Tab), Key::Start),
- (Keycode::new(glfw::Key::Space), Key::Select),
- (Keycode::new(glfw::Key::GraveAccent), Key::Debug),
- ])
-}
-
-impl State {
- pub fn new(ctx: &context::Context) -> Self {
- let screen = framebuffer::Framebuffer::screen(ctx);
- let render_framebuffer = framebuffer::Framebuffer::new(
- ctx,
- &glam::Vec2::new(ctx.render_width, ctx.render_height),
- &glam::Vec2::new(0.0, 0.0),
- );
- let shader_upscale = shader::Shader::new_nolib(
- ctx,
- include_str!("assets/shaders/scale/vert.glsl"),
- include_str!("assets/shaders/scale/frag.glsl"),
- );
- let shader_text_bitmap = shader::Shader::new_nolib(
- ctx,
- include_str!("assets/shaders/bitmap/vert.glsl"),
- include_str!("assets/shaders/bitmap/frag.glsl"),
- );
- let mesh_square = mesh::Mesh::from_obj(ctx, include_bytes!("assets/meshes/square.obj"));
-
- let nextframe = now(ctx);
-
- Self {
- // we initialize the tick to 1000, which allows us to use "0" as the default time for
- // various animation starts on entities without having them all play at game start
- tick: 1000,
-
- nextframe,
- fps: 0,
- frames_this_second: 0,
- start_this_second: nextframe,
-
- rebinding: None,
- keybindings: default_keybindings(),
- keys: Keys::new(),
-
- screen,
- render_framebuffer,
- render_dims: glam::Vec2::new(ctx.render_width, ctx.render_height),
- shader_upscale,
- shader_text_bitmap,
- mesh_square,
- font_default: font::Bitmap::default(ctx),
- font_small: font::Bitmap::small(ctx),
- audio: None,
-
- projection: glam::Mat4::perspective_lh(
- std::f32::consts::PI / 4.0,
- ctx.render_width / ctx.render_height,
- // 0.1,
- 0.5,
- 50.0,
- ),
- projection_orth: glam::Mat4::orthographic_lh(
- -ORTH_WIDTH,
- ORTH_WIDTH,
- -ORTH_HEIGHT,
- ORTH_HEIGHT,
- 0.5,
- 50.0,
- ),
- camera: (
- glam::Vec3::new(0.0, 0.0, 0.0),
- glam::Vec3::new(0.0, 0.0, 1.0),
- glam::Vec3::new(0.0, 1.0, 0.0),
- ),
- lighting: (
- glam::Vec3::new(1.0, 1.0, 1.0),
- glam::Vec3::new(1.0, 1.0, 1.0),
- glam::Vec3::new(1.0, -1.0, 1.0),
- ),
- point_lights: Vec::new(),
- // waker_ctx,
- // http_client: reqwest::Client::new(),
- // request: None,
- }
- }
-
- pub fn handle_resize(&mut self, ctx: &context::Context) {
- self.screen = framebuffer::Framebuffer::screen(ctx);
- }
-
- pub fn move_camera(
- &mut self,
- _ctx: &context::Context,
- pos: &glam::Vec3,
- dir: &glam::Vec3,
- up: &glam::Vec3,
- ) {
- self.camera = (*pos, *dir, *up);
- }
-
- pub fn bind_framebuffer(&mut self, ctx: &context::Context, fb: &framebuffer::Framebuffer) {
- fb.bind(ctx);
- self.render_dims = fb.dims;
- }
-
- pub fn bind_render_framebuffer(&mut self, ctx: &context::Context) {
- self.render_framebuffer.bind(ctx);
- self.render_dims = self.render_framebuffer.dims;
- }
-
- pub fn bind_screen(&mut self, ctx: &context::Context) {
- self.screen.bind(ctx);
- self.render_dims = self.screen.dims;
- }
-
- pub fn set_lighting(
- &mut self,
- _ctx: &context::Context,
- ambient: &glam::Vec3,
- color: &glam::Vec3,
- dir: &glam::Vec3,
- ) {
- self.lighting = (*ambient, *color, *dir);
- }
-
- pub fn add_point_light(
- &mut self,
- _ctx: &context::Context,
- pos: &glam::Vec3,
- color: &glam::Vec3,
- attenuation: &glam::Vec2,
- ) {
- self.point_lights.push(PointLight {
- pos: *pos,
- color: *color,
- attenuation: *attenuation,
- });
- }
-
- pub fn clear_point_lights(&mut self, _ctx: &context::Context) {
- self.point_lights.clear();
- }
-
- pub fn view(&self) -> glam::Mat4 {
- glam::Mat4::look_to_lh(self.camera.0, self.camera.1, self.camera.2)
- }
-
- pub fn bind_3d_helper(
- &self,
- ctx: &context::Context,
- shader: &shader::Shader,
- plc: usize,
- orth: bool,
- ) {
- shader.bind(ctx);
- shader.set_mat4(
- ctx,
- "projection",
- if orth {
- &self.projection_orth
- } else {
- &self.projection
- },
- );
- shader.set_mat4(ctx, "view", &self.view());
- shader.set_vec3(ctx, "light_ambient_color", &self.lighting.0);
- shader.set_vec3(ctx, "light_dir_color", &self.lighting.1);
- shader.set_vec3(ctx, "light_dir", &self.lighting.2.normalize());
- shader.set_i32(ctx, "light_count", plc as _);
- }
-
- pub fn bind_3d_no_point_lights(&self, ctx: &context::Context, shader: &shader::Shader) {
- self.bind_3d_helper(ctx, shader, 0, false);
- }
-
- pub fn bind_3d_with_point_lights(
- &self,
- ctx: &context::Context,
- shader: &shader::Shader,
- orth: bool,
- ) {
- let plc = self.point_lights.len().min(5);
- self.bind_3d_helper(ctx, shader, plc, orth);
- if plc > 0 {
- let lpos: Vec<_> = self.point_lights.iter().take(plc).map(|l| l.pos).collect();
- shader.set_vec3_array(ctx, "light_pos[0]", &lpos);
- let lcolor: Vec<_> = self
- .point_lights
- .iter()
- .take(plc)
- .map(|l| l.color)
- .collect();
- shader.set_vec3_array(ctx, "light_color[0]", &lcolor);
- let lattenuation: Vec<_> = self
- .point_lights
- .iter()
- .take(plc)
- .map(|l| l.attenuation)
- .collect();
- shader.set_vec2_array(ctx, "light_attenuation[0]", &lattenuation);
- }
- }
-
- pub fn bind_3d(&self, ctx: &context::Context, shader: &shader::Shader) {
- self.bind_3d_with_point_lights(ctx, shader, false)
- }
-
- pub fn bind_3d_orth(&self, ctx: &context::Context, shader: &shader::Shader) {
- self.bind_3d_with_point_lights(ctx, shader, true)
- }
-
- pub fn bind_2d(&self, ctx: &context::Context, shader: &shader::Shader) {
- shader.bind(ctx);
- shader.set_mat4(ctx, "projection", &glam::Mat4::IDENTITY);
- shader.set_mat4(
- ctx,
- "view",
- &glam::Mat4::from_scale(glam::Vec3::new(
- 2.0 / ctx.render_width,
- 2.0 / ctx.render_height,
- 1.0,
- )),
- );
- }
-
- pub fn initialize_audio<G>(&mut self, ctx: &context::Context, game: &mut G) -> utils::Erm<()>
- where
- G: Game,
- {
- if self.audio.is_none() {
- self.audio = Some(audio::Assets::new(|actx| {
- game.initialize_audio(ctx, self, actx)
- }));
- }
- Ok(())
- }
-
- pub fn mouse_moved<G>(
- &mut self,
- ctx: &context::Context,
- x: f32,
- y: f32,
- game: &mut G,
- ) -> utils::Erm<()>
- where
- G: Game,
- {
- if ctx.options.contains(crate::Options::FULLSCREEN_MOUSE) {
- game.mouse_move(
- ctx,
- self,
- (x * ctx.render_width / self.screen.dims.x) as i32,
- (y * ctx.render_height / self.screen.dims.y) as i32,
- )?;
- } else {
- let rx = ((x - self.screen.offsets.x) * ctx.render_width / self.screen.dims.x) as i32;
- let ry = ((y - self.screen.offsets.y) * ctx.render_height / self.screen.dims.y) as i32;
- if !(rx < 0
- || rx >= ctx.render_width as i32
- || ry < 0
- || ry >= ctx.render_height as i32)
- {
- game.mouse_move(ctx, self, rx, ry)?;
- }
- }
- Ok(())
- }
-
- pub fn mouse_pressed<G>(&mut self, ctx: &context::Context, game: &mut G) -> utils::Erm<()>
- where
- G: Game,
- {
- self.initialize_audio(ctx, game)?;
- game.mouse_press(ctx, self)?;
- Ok(())
- }
-
- pub fn mouse_released<G>(&mut self, ctx: &context::Context, game: &mut G) -> utils::Erm<()>
- where
- G: Game,
- {
- game.mouse_released(ctx, self)?;
- Ok(())
- }
-
- pub fn key_pressed<G>(
- &mut self,
- ctx: &context::Context,
- game: &mut G,
- key: Keycode,
- ) -> utils::Erm<()>
- where
- G: Game,
- {
- #[cfg(target_arch = "wasm32")]
- let rebind = key.kc == winit::keyboard::KeyCode::F12;
- #[cfg(not(target_arch = "wasm32"))]
- let rebind = key.kc == glfw::Key::F12;
- if rebind {
- self.keybindings = default_keybindings();
- self.rebinding = None;
- game.keybindings_were_reset(ctx, self)?;
- } else if let Some(k) = self.rebinding {
- self.keybindings.insert(key, k);
- self.rebinding = None;
- } else if let Some(k) = self.keybindings.get_by_left(&key) {
- self.keys.pressed[*k] = true;
- self.keys.new[*k] = true;
- }
- Ok(())
- }
-
- pub fn key_released<G>(
- &mut self,
- _ctx: &context::Context,
- _game: &mut G,
- key: Keycode,
- ) -> utils::Erm<()>
- where
- G: Game,
- {
- if let Some(k) = self.keybindings.get_by_left(&key) {
- self.keys.pressed[*k] = false;
- }
- Ok(())
- }
-
- /// Return the first keybinding for the given virtual key
- pub fn keybinding_for(&self, k: Key) -> Option<String> {
- self.keybindings
- .get_by_right(&k)
- .map(|kc| format!("{}", kc))
- }
-
- pub fn rebind_key(&mut self, k: Key) {
- self.rebinding = Some(k);
- }
-
- pub fn run_update<G>(&mut self, ctx: &context::Context, game: &mut G) -> utils::Erm<()>
- where
- G: Game,
- {
- let now = now(ctx);
- if now > self.nextframe {
- while self.nextframe < now {
- // find the next target frame that isn't in the past
- self.nextframe += DELTA_TIME;
- }
- self.tick += 1;
- self.frames_this_second += 1;
- game.update(ctx, self)?;
- self.keys.new = enum_map! { _ => false };
- }
- if now - self.start_this_second > 1.0 {
- // track FPS
- self.start_this_second = now;
- self.fps = self.frames_this_second;
- self.frames_this_second = 0;
- }
- Ok(())
- }
-
- pub fn run_render<G>(&mut self, ctx: &context::Context, game: &mut G) -> utils::Erm<()>
- where
- G: Game,
- {
- self.bind_screen(ctx);
- ctx.clear_color(if ctx.options.contains(crate::Options::OVERLAY) {
- glam::Vec4::new(0.0, 0.0, 0.0, 0.0)
- } else {
- glam::Vec4::new(0.0, 0.0, 0.0, 1.0)
- });
- ctx.clear();
-
- game.render(ctx, self)?;
-
- #[cfg(all(debug_assertions, not(target_arch = "wasm32")))]
- {
- let err = unsafe { ctx.gl.get_error() };
- if err != glow::NO_ERROR {
- log::warn!("opengl error: {}", err);
- }
- // let log = unsafe { ctx.gl.get_debug_message_log(5) };
- // for m in log {
- // log::warn!("opengl debug message: {:?}", m);
- // }
- }
- Ok(())
- }
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/texture.rs b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/texture.rs
deleted file mode 100644
index b9749a2..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/texture.rs
+++ /dev/null
@@ -1,156 +0,0 @@
-use glow::HasContext;
-use image::EncodableLayout;
-
-use crate::context;
-
-pub struct Texture {
- pub tex: glow::Texture,
- pub width: i32,
- pub height: i32,
-}
-
-impl Texture {
- pub fn new_empty(ctx: &context::Context) -> Self {
- unsafe {
- let tex = ctx.gl.create_texture().expect("failed to create texture");
- ctx.gl.bind_texture(glow::TEXTURE_2D, Some(tex));
- ctx.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_WRAP_S, glow::CLAMP_TO_EDGE as i32);
- ctx.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_WRAP_T, glow::CLAMP_TO_EDGE as i32);
- ctx.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_MIN_FILTER, glow::NEAREST as i32);
- ctx.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_MAG_FILTER, glow::NEAREST as i32);
- Self {
- tex,
- width: 0, height: 0,
- }
- }
- }
-
- pub fn new(ctx: &context::Context, bytes: &[u8]) -> Self {
- let rgba = image::ImageReader::new(std::io::Cursor::new(bytes))
- .with_guessed_format()
- .expect("failed to guess image format")
- .decode()
- .expect("failed to decode image")
- .into_rgba8();
- let pixels = rgba.as_bytes();
- unsafe {
- let tex = ctx.gl.create_texture().expect("failed to create texture");
- ctx.gl.bind_texture(glow::TEXTURE_2D, Some(tex));
- ctx.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_WRAP_S, glow::CLAMP_TO_EDGE as i32);
- ctx.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_WRAP_T, glow::CLAMP_TO_EDGE as i32);
- ctx.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_MIN_FILTER, glow::NEAREST as i32);
- ctx.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_MAG_FILTER, glow::NEAREST as i32);
- ctx.gl.tex_image_2d(
- glow::TEXTURE_2D,
- 0,
- glow::RGBA as i32,
- rgba.width() as i32,
- rgba.height() as i32,
- 0,
- glow::RGBA,
- glow::UNSIGNED_BYTE,
- Some(pixels),
- );
- ctx.gl.generate_mipmap(glow::TEXTURE_2D);
-
- Self {
- tex,
- width: rgba.width() as i32,
- height: rgba.height() as i32,
- }
- }
- }
-
- pub fn upload(&mut self, ctx: &context::Context, bytes: &[u8]) {
- let rgba = image::ImageReader::new(std::io::Cursor::new(bytes))
- .with_guessed_format()
- .expect("failed to guess image format")
- .decode()
- .expect("failed to decode image")
- .into_rgba8();
- let pixels = rgba.as_bytes();
- self.upload_rgba8(ctx, rgba.width() as i32, rgba.height() as i32, pixels);
- }
-
- pub fn upload_rgba8(&mut self, ctx: &context::Context, width: i32, height: i32, data: &[u8]) {
- unsafe {
- ctx.gl.bind_texture(glow::TEXTURE_2D, Some(self.tex));
- ctx.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_WRAP_S, glow::CLAMP_TO_EDGE as i32);
- ctx.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_WRAP_T, glow::CLAMP_TO_EDGE as i32);
- ctx.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_MIN_FILTER, glow::NEAREST as i32);
- ctx.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_MAG_FILTER, glow::NEAREST as i32);
- ctx.gl.tex_image_2d(
- glow::TEXTURE_2D,
- 0,
- glow::RGBA as i32,
- width,
- height,
- 0,
- glow::RGBA,
- glow::UNSIGNED_BYTE,
- Some(data),
- );
- ctx.gl.generate_mipmap(glow::TEXTURE_2D);
- }
- self.width = width;
- self.height = height;
- }
-
- pub fn set_repeat(&self, ctx: &context::Context) {
- unsafe {
- ctx.gl.bind_texture(glow::TEXTURE_2D, Some(self.tex));
- ctx.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_WRAP_S, glow::REPEAT as i32);
- ctx.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_WRAP_T, glow::REPEAT as i32);
- }
- }
-
- pub fn set_anisotropic_filtering(&self, ctx: &context::Context) {
- unsafe {
- ctx.gl.bind_texture(glow::TEXTURE_2D, Some(self.tex));
- ctx.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_WRAP_S, glow::REPEAT as i32);
- ctx.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_WRAP_T, glow::REPEAT as i32);
- ctx.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_MIN_FILTER, glow::LINEAR_MIPMAP_LINEAR as i32);
- ctx.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_MAG_FILTER, glow::LINEAR as i32);
- ctx.gl.tex_parameter_f32(glow::TEXTURE_2D, glow::TEXTURE_MAX_ANISOTROPY_EXT, 4.0);
- }
- }
-
- pub fn bind(&self, ctx: &context::Context) {
- unsafe {
- ctx.gl.active_texture(glow::TEXTURE0);
- ctx.gl.bind_texture(glow::TEXTURE_2D, Some(self.tex));
- }
- }
-
- pub fn bind_initial(ctx: &context::Context) {
- unsafe {
- ctx.gl.active_texture(glow::TEXTURE0);
- ctx.gl.bind_texture(glow::TEXTURE_2D, None);
- }
- }
-
- pub fn bind_index(&self, ctx: &context::Context, idx: u32) {
- unsafe {
- ctx.gl.active_texture(glow::TEXTURE0 + idx);
- ctx.gl.bind_texture(glow::TEXTURE_2D, Some(self.tex));
- }
- }
-}
-
-pub struct Material {
- pub color: Texture,
- pub normal: Texture,
-}
-impl Material {
- pub fn new(ctx: &context::Context, color_bytes: &[u8], normal_bytes: &[u8]) -> Self {
- let color = Texture::new(ctx, color_bytes);
- let normal = Texture::new(ctx, normal_bytes);
- color.set_anisotropic_filtering(ctx);
- normal.set_anisotropic_filtering(ctx);
- Self { color, normal }
- }
- pub fn bind(&self, ctx: &context::Context) {
- self.color.bind(ctx);
- self.normal.bind_index(ctx, 1);
- }
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/ui.rs b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/ui.rs
deleted file mode 100644
index 8607fb6..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/ui.rs
+++ /dev/null
@@ -1,169 +0,0 @@
-use crate::{state, utils};
-use crate::state::Tick;
-
-fn compute_reverse(frames: Tick, tick: Tick, start: Tick) -> Tick {
- let leftover = frames - (tick - start)
- .clamp(0, frames);
- tick - leftover
-}
-
-pub enum ModeToggle {
- Inactive { start: Tick },
- Active { start: Tick },
-}
-
-pub struct Mode {
- frames: Tick,
- toggle: ModeToggle,
-}
-
-impl Mode {
- pub fn new(frames: Tick) -> Self {
- Self {
- frames,
- toggle: ModeToggle::Inactive { start: 0 },
- }
- }
-
- /// Is the current state active?
- pub fn is_active(&self) -> bool {
- match self.toggle {
- ModeToggle::Inactive {..} => false,
- ModeToggle::Active {..} => true,
- }
- }
-
- /// Has the current transition finished?
- pub fn is_ready(&self, tick: Tick) -> bool {
- let started = match self.toggle {
- ModeToggle::Inactive { start } => start,
- ModeToggle::Active { start } => start,
- };
- tick - started > self.frames
- }
-
- pub fn progress(&self, tick: Tick) -> f32 {
- match self.toggle {
- ModeToggle::Inactive { start } => {
- 1.0 - (((tick - start) as f32) / self.frames as f32)
- .clamp(0.0, 1.0)
- },
- ModeToggle::Active { start } => {
- (((tick - start) as f32) / self.frames as f32)
- .clamp(0.0, 1.0)
- }
- }
- }
-
- pub fn reset(&mut self) {
- self.toggle = ModeToggle::Inactive { start: 0 };
- }
-
- pub fn toggle(&mut self, tick: Tick) {
- match self.toggle {
- ModeToggle::Inactive { start } => {
- self.toggle = ModeToggle::Active {
- start: compute_reverse(self.frames, tick, start)
- };
- },
- ModeToggle::Active { start } => {
- self.toggle = ModeToggle::Inactive {
- start: compute_reverse(self.frames, tick, start)
- };
- },
- }
- }
-}
-
-pub struct Cursor {
- pub index: i32,
- pub prev_index: i32,
- pub change_started: Tick,
- pub bound: i32,
- pub frames: Tick,
-}
-
-impl Cursor {
- pub fn new(bound: i32, frames: Tick) -> Self {
- Self {
- index: 0,
- prev_index: 0,
- change_started: 0,
- bound,
- frames,
- }
- }
-
- pub fn animation_index(&self, tick: Tick) -> f32 {
- let progress = ((tick - self.change_started) as f32)
- / (self.frames as f32 / 2.0);
- utils::lerp(
- self.prev_index as f32,
- self.index as f32,
- progress
- )
- }
-
- pub fn is_ready(&self, tick: Tick) -> bool {
- tick - self.change_started > self.frames
- }
-
- pub fn set(&mut self, val: i32, tick: Tick) -> bool {
- if self.is_ready(tick) {
- self.change_started = tick;
- self.prev_index = self.index;
- self.index = val;
- self.index %= self.bound;
- true
- } else { false }
- }
- pub fn increment(&mut self, tick: Tick) -> bool { self.set(self.index + 1, tick) }
- pub fn decrement(&mut self, tick: Tick) -> bool { self.set(self.index + self.bound - 1, tick) }
-
- pub fn set_unlocked(&mut self, val: i32, tick: Tick) {
- self.change_started = tick;
- self.prev_index = self.index;
- self.index = val;
- self.index %= self.bound;
- }
- pub fn increment_unlocked(&mut self, tick: Tick) -> bool { self.set_unlocked(self.index + 1, tick); true }
- pub fn decrement_unlocked(&mut self, tick: Tick) -> bool { self.set_unlocked(self.index + self.bound - 1, tick); true }
-
- /// Read keypresses to update this cursor (assuming that the left/right keys decrement/increment)
- /// Returns true if an update was performed (e.g. to determine whether to play a sound).
- pub fn update_horizontal(&mut self, st: &mut state::State) -> bool {
- if st.keys.new_left() {
- self.decrement_unlocked(st.tick)
- } else if st.keys.new_right() {
- self.increment_unlocked(st.tick)
- } else if st.keys.left() {
- self.decrement(st.tick)
- } else if st.keys.right() {
- self.increment(st.tick)
- } else { false }
- }
-
- pub fn update_vertical(&mut self, st: &mut state::State) -> bool {
- if st.keys.new_up() {
- self.decrement_unlocked(st.tick)
- } else if st.keys.new_down() {
- self.increment_unlocked(st.tick)
- } else if st.keys.up() {
- self.decrement(st.tick)
- } else if st.keys.down() {
- self.increment(st.tick)
- } else { false }
- }
-
- pub fn update_lr(&mut self, st: &mut state::State) -> bool {
- if st.keys.new_l() {
- self.decrement_unlocked(st.tick)
- } else if st.keys.new_r() {
- self.increment_unlocked(st.tick)
- } else if st.keys.l() {
- self.decrement(st.tick)
- } else if st.keys.r() {
- self.increment(st.tick)
- } else { false }
- }
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/utils.rs b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/utils.rs
deleted file mode 100644
index 14a7fdf..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia/src/utils.rs
+++ /dev/null
@@ -1,147 +0,0 @@
-use std::f32::consts::PI;
-
-use enum_map::Enum;
-use serde::{Serialize, Deserialize};
-use strum::EnumIter;
-
-pub type Erm<T> = simple_eyre::Result<T>;
-
-pub fn erm<E, T>(e: E) -> Erm<T> where E: std::error::Error + std::marker::Send + std::marker::Sync + 'static {
- Err(e.into())
-}
-
-#[derive(Debug)]
-pub struct Error {
- pub msg: String
-}
-impl std::fmt::Display for Error {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- write!(f, "teleia error: {}", self.msg)
- }
-}
-impl std::error::Error for Error {}
-
-pub fn erm_msg<T>(msg: &str) -> Erm<T> {
- Err(Error {
- msg: msg.to_owned(),
- }.into())
-}
-
-pub struct ErrorHandler;
-impl simple_eyre::eyre::EyreHandler for ErrorHandler {
- fn debug(
- &self,
- error: &(dyn std::error::Error + 'static),
- f: &mut core::fmt::Formatter<'_>,
- ) -> core::fmt::Result {
- if f.alternate() {
- return core::fmt::Debug::fmt(error, f);
- }
- let mut first = true;
- if let Some(s) = error.source() {
- let errors: Vec<_> = std::iter::successors(Some(s), |e| (*e).source()).collect();
- for err in errors.iter().rev() {
- writeln!(f)?; write!(f, "{}{}", if first {""} else {" - "}, err)?;
- first = false;
- }
- }
- writeln!(f)?; write!(f, "{}{}", if first {""} else {" - "}, error)?;
- Ok(())
- }
-}
-
-pub fn install_error_handler() {
- simple_eyre::eyre::set_hook(Box::new(move |_| Box::new(ErrorHandler))).expect("failed to install error handler");
-}
-
-#[derive(Clone, Copy, Debug, Enum, EnumIter, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
-pub enum Cardinal {
- North,
- South,
- West,
- East,
-}
-
-impl Cardinal {
- pub fn to_string(&self) -> &'static str {
- match self {
- Self::North => "north",
- Self::South => "south",
- Self::West => "west",
- Self::East => "east",
- }
- }
-
- pub fn turn_cw(&self) -> Self {
- match self {
- Self::North => Self::East,
- Self::South => Self::West,
- Self::West => Self::North,
- Self::East => Self::South,
- }
- }
-
- pub fn turn_ccw(&self) -> Self {
- match self {
- Self::North => Self::West,
- Self::South => Self::East,
- Self::West => Self::South,
- Self::East => Self::North,
- }
- }
-
- pub fn dir(&self) -> glam::Vec3 {
- match self {
- Self::North => glam::Vec3::new(0.0, 1.0, 0.0),
- Self::South => glam::Vec3::new(0.0, -1.0, 0.0),
- Self::West => glam::Vec3::new(-1.0, 0.0, 0.0),
- Self::East => glam::Vec3::new(1.0, 0.0, 0.0),
- }
- }
-
- pub fn offsets(&self) -> (i32, i32) {
- match self {
- Self::North => (0, 1),
- Self::South => (0, -1),
- Self::West => (-1, 0),
- Self::East => (1, 0),
- }
- }
-
- pub fn angle(&self) -> f32 {
- match self {
- Self::North => 0.0,
- Self::South => PI,
- Self::West => PI / 2.0,
- Self::East => 3.0 * PI / 2.0,
- }
- }
-
- pub fn turn_by(&self, o: Self) -> Self {
- match o {
- Self::North => *self,
- Self::South => self.turn_cw().turn_cw(),
- Self::West => self.turn_cw(),
- Self::East => self.turn_ccw(),
- }
- }
-
- pub fn angle_between(&self, o: &Self) -> f32 {
- if o == &self.turn_cw() { -PI / 2.0 }
- else if o == &self.turn_ccw() { PI / 2.0 }
- else if o == &self.turn_cw().turn_cw() { PI }
- else { 0.0 }
- }
-}
-
-pub fn lerp(a: f32, b: f32, t: f32) -> f32 {
- a + t.clamp(0.0, 1.0) * (b - a)
-}
-
-pub fn dir_lerp(a: glam::Vec3, b: glam::Vec3, t: f32) -> glam::Vec3 {
- let dirrotaxis = a.cross(b).normalize();
- let dirrotangle = a.angle_between(b);
- let dirrotfull = glam::Quat::from_axis_angle(dirrotaxis, dirrotangle);
- let dirrot = glam::Quat::IDENTITY.slerp(dirrotfull, t);
- dirrot.mul_vec3(a)
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia_macros/Cargo.toml b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia_macros/Cargo.toml
deleted file mode 100644
index 3ef969e..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia_macros/Cargo.toml
+++ /dev/null
@@ -1,14 +0,0 @@
-[package]
-name = "teleia_macros"
-version.workspace = true
-edition.workspace = true
-authors.workspace = true
-
-[lib]
-proc-macro = true
-
-[dependencies]
-env = "1.0.1"
-walkdir = "2.5.0"
-heck = "0.5.0"
-litrs = "1.0.0" \ No newline at end of file
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia_macros/src/lib.rs b/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia_macros/src/lib.rs
deleted file mode 100644
index 5b6c0b9..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/crates/teleia_macros/src/lib.rs
+++ /dev/null
@@ -1,231 +0,0 @@
-use heck::ToUpperCamelCase;
-use proc_macro::TokenStream;
-use std::collections::HashSet;
-use std::path::Path;
-use walkdir::WalkDir;
-
-#[derive(Debug, Hash, PartialEq, Eq)]
-struct Designator {
- path: String,
- parts: Vec<String>,
-}
-impl Designator {
- fn new(fbase: &str, mut path: &Path, shorten: bool) -> Self {
- let mut parts: Vec<_> = path
- .strip_prefix(fbase)
- .unwrap()
- .with_extension("")
- .components()
- .filter_map(|c| match c {
- std::path::Component::Normal(o) => Some(o.to_str().unwrap().to_owned()),
- _ => None,
- })
- .collect();
- if shorten {
- parts.pop();
- path = path.parent().expect("path has no parent");
- }
- Self {
- path: path
- .to_str()
- .expect("path is not a string")
- .replace("\\", "/"),
- parts,
- }
- }
- fn enum_entry(&self, fnm: &str) -> String {
- let singular = match fnm {
- "meshes" => "mesh",
- "textures" => "texture",
- "materials" => "material",
- "shaders" => "shader",
- _ => fnm,
- };
- let mut ret = format!("\n#[doc=\"newton-{}: {}\"]\n", singular, self.path);
- ret += &self.parts.join(" ").to_upper_camel_case();
- ret
- }
- fn enum_element(&self, _fnm: &str) -> String {
- self.parts.join(" ").to_upper_camel_case()
- }
- fn load_expr(&self, fnm: &str) -> Option<String> {
- let i = format!("assets/{}/{}", fnm, self.parts.join("/"));
- match fnm {
- "meshes" => Some(format!(
- "teleia::mesh::Mesh::from_obj(ctx, include_bytes!(\"{}.obj\"))",
- i
- )),
- "textures" => Some(format!(
- "teleia::texture::Texture::new(ctx, include_bytes!(\"{}.png\"))",
- i
- )),
- "materials" => Some(format!(
- "teleia::texture::Material::new(ctx, include_bytes!(\"{}/color.jpg\"), include_bytes!(\"{}/normal.jpg\"))",
- i, i
- )),
- "shaders" => {
- if self.parts.contains(&"nolib".to_owned()) {
- Some(format!(
- "teleia::shader::Shader::new_nolib(ctx, include_str!(\"{}/vert.glsl\"), include_str!(\"{}/frag.glsl\"))",
- i, i
- ))
- } else {
- Some(format!(
- "teleia::shader::Shader::new(ctx, include_str!(\"{}/vert.glsl\"), include_str!(\"{}/frag.glsl\"))",
- i, i
- ))
- }
- }
- _ => None,
- }
- }
-}
-
-#[derive(Debug)]
-struct Field {
- nm: String,
- entries: HashSet<Designator>,
-}
-impl Field {
- fn new(base: &str, nm: &str) -> Self {
- let mut entries = HashSet::new();
- let fbase = format!("{}{}", base, nm);
- for f in WalkDir::new(&fbase).into_iter().flatten() {
- if f.file_type().is_file() {
- entries.insert(Designator::new(
- &fbase,
- f.path(),
- nm == "shaders" || nm == "materials",
- ));
- }
- }
- Self {
- nm: nm.to_owned(),
- entries,
- }
- }
- fn generate(&self) -> Option<(String, String, String)> {
- let mut ents = Vec::new();
- for d in self.entries.iter() {
- if let Some(exp) = d.load_expr(&self.nm) {
- ents.push((d.enum_entry(&self.nm), d.enum_element(&self.nm), exp));
- }
- }
- let (enm, ty) = match self.nm.as_str() {
- "meshes" => ("Mesh", "teleia::mesh::Mesh"),
- "textures" => ("Texture", "teleia::texture::Texture"),
- "materials" => ("Material", "teleia::texture::Material"),
- "shaders" => ("Shader", "teleia::shader::Shader"),
- _ => return None,
- };
- let enums: Vec<_> = ents.iter().map(|(e, _, _)| e.clone()).collect();
- let edecl = format!("#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize, enum_map::Enum)]
-pub enum {} {{ {} }}", enm, enums.join(", "));
- let decl = format!("pub {}: enum_map::EnumMap<{}, {}>", self.nm, enm, ty);
- let inits: Vec<_> = ents
- .into_iter()
- .map(|(_, e, exp)| format!("{}::{} => {}", enm, e, exp))
- .collect();
- let init = format!("{}: enum_map::enum_map!({})", self.nm, inits.join(", "));
- Some((edecl, decl, init))
- }
-}
-
-#[derive(Debug)]
-struct AssetData {
- fields: Vec<Field>,
-}
-impl AssetData {
- fn new(base: &str) -> Self {
- let mut fields = Vec::new();
- let dirs = std::fs::read_dir(base)
- .unwrap_or_else(|_| panic!("failed to read assets directory: {}", base));
- let (mut has_meshes, mut has_textures, mut has_materials, mut has_shaders) =
- (false, false, false, false);
- for d in dirs.flatten() {
- let nm = d.file_name().into_string().unwrap();
- fields.push(Field::new(base, &nm));
- match &*nm {
- "meshes" => has_meshes = true,
- "textures" => has_textures = true,
- "materials" => has_materials = true,
- "shaders" => has_shaders = true,
- _ => {}
- };
- }
- if !has_meshes {
- fields.push(Field {
- nm: "meshes".to_owned(),
- entries: HashSet::new(),
- });
- }
- if !has_textures {
- fields.push(Field {
- nm: "textures".to_owned(),
- entries: HashSet::new(),
- });
- }
- if !has_materials {
- fields.push(Field {
- nm: "materials".to_owned(),
- entries: HashSet::new(),
- });
- }
- if !has_shaders {
- fields.push(Field {
- nm: "shaders".to_owned(),
- entries: HashSet::new(),
- });
- }
- Self { fields }
- }
- fn generate(&self) -> String {
- let mut res = String::new();
- let fdata: Vec<_> = self.fields.iter().filter_map(|f| f.generate()).collect();
- for (edecl, _, _) in fdata.iter() {
- res += edecl;
- res += "\n";
- }
- res += "pub struct Assets {\n";
- for (_, decl, _) in fdata.iter() {
- res += decl;
- res += ",\n";
- }
- res += "}\nimpl Assets {\npub fn new(ctx: &teleia::context::Context) -> Self {\nSelf {\n";
- for (_, _, init) in fdata.iter() {
- res += init;
- res += ",\n";
- }
- res += "}\n}\n}\n";
- res += "impl teleia::renderer::Assets for Assets {\n";
- res += "type Shader = Shader;\n";
- res +=
- "fn shader(&self, i: Self::Shader) -> &teleia::shader::Shader { &self.shaders[i] }\n";
- res += "type Texture = Texture;\n";
- res += "fn texture(&self, i: Self::Texture) -> &teleia::texture::Texture { &self.textures[i] }\n";
- res += "type Material = Material;\n";
- res += "fn material(&self, i: Self::Material) -> &teleia::texture::Material { &self.materials[i] }\n";
- res += "type Mesh = Mesh;\n";
- res += "fn mesh(&self, i: Self::Mesh) -> &teleia::mesh::Mesh { &self.meshes[i] }\n";
- res += "}\n";
- res
- }
-}
-
-#[proc_macro]
-pub fn generate_assets(s: TokenStream) -> TokenStream {
- let token = s
- .into_iter()
- .next()
- .expect("must pass asset base path as a string literal");
- let lit = litrs::StringLit::try_from(token).expect("argument was not a string literal");
- let base = lit.value();
- let manifest = env::var("CARGO_MANIFEST_DIR").expect("failed to get manifest path");
- let assets = AssetData::new(&format!("{}/{}", manifest, base));
- // println!("{}", assets.generate());
- assets
- .generate()
- .to_string()
- .parse()
- .expect("failed to parse generate_assets result")
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/examples/assets/fonts/ComicNeue-Regular.ttf b/2026/games_submissions/rpc2dot0/vendor/teleia/examples/assets/fonts/ComicNeue-Regular.ttf
deleted file mode 100644
index d454f46..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/examples/assets/fonts/ComicNeue-Regular.ttf
+++ /dev/null
Binary files differ
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/examples/assets/meshes/cube.obj b/2026/games_submissions/rpc2dot0/vendor/teleia/examples/assets/meshes/cube.obj
deleted file mode 100644
index 02851e8..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/examples/assets/meshes/cube.obj
+++ /dev/null
@@ -1,38 +0,0 @@
-# Blender 4.1.1
-# www.blender.org
-o Cube
-v 1.000000 1.000000 -1.000000
-v 1.000000 -1.000000 -1.000000
-v 1.000000 1.000000 1.000000
-v 1.000000 -1.000000 1.000000
-v -1.000000 1.000000 -1.000000
-v -1.000000 -1.000000 -1.000000
-v -1.000000 1.000000 1.000000
-v -1.000000 -1.000000 1.000000
-vn -0.0000 1.0000 -0.0000
-vn -0.0000 -0.0000 1.0000
-vn -1.0000 -0.0000 -0.0000
-vn -0.0000 -1.0000 -0.0000
-vn 1.0000 -0.0000 -0.0000
-vn -0.0000 -0.0000 -1.0000
-vt 0.625000 0.500000
-vt 0.875000 0.500000
-vt 0.875000 0.750000
-vt 0.625000 0.750000
-vt 0.375000 0.750000
-vt 0.625000 1.000000
-vt 0.375000 1.000000
-vt 0.375000 0.000000
-vt 0.625000 0.000000
-vt 0.625000 0.250000
-vt 0.375000 0.250000
-vt 0.125000 0.500000
-vt 0.375000 0.500000
-vt 0.125000 0.750000
-s 0
-f 1/1/1 5/2/1 7/3/1 3/4/1
-f 4/5/2 3/4/2 7/6/2 8/7/2
-f 8/8/3 7/9/3 5/10/3 6/11/3
-f 6/12/4 2/13/4 4/5/4 8/14/4
-f 2/13/5 1/1/5 3/4/5 4/5/5
-f 6/11/6 5/10/6 1/1/6 2/13/6
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/examples/assets/scenes/fox.glb b/2026/games_submissions/rpc2dot0/vendor/teleia/examples/assets/scenes/fox.glb
deleted file mode 100644
index 1ef5c0d..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/examples/assets/scenes/fox.glb
+++ /dev/null
Binary files differ
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/examples/assets/textures/test.png b/2026/games_submissions/rpc2dot0/vendor/teleia/examples/assets/textures/test.png
deleted file mode 100644
index 0752be0..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/examples/assets/textures/test.png
+++ /dev/null
Binary files differ
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/examples/fox.rs b/2026/games_submissions/rpc2dot0/vendor/teleia/examples/fox.rs
deleted file mode 100644
index eff9345..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/examples/fox.rs
+++ /dev/null
@@ -1,72 +0,0 @@
-use teleia::*;
-
-use std::ops::Rem;
-
-pub struct TestGame {
- font: font::Bitmap,
- tt: font::TrueType,
- // cube: mesh::Mesh,
- fox: scene::Scene,
- tex: texture::Texture,
- shader: shader::Shader,
-}
-
-impl TestGame {
- pub async fn new(ctx: &context::Context) -> Self {
- Self {
- font: font::Bitmap::new(ctx),
- tt: font::TrueType::new(ctx, 12.0, include_bytes!("assets/fonts/ComicNeue-Regular.ttf")),
- // cube: mesh::Mesh::from_obj(ctx, include_bytes!("assets/meshes/cube.obj")),
- fox: scene::Scene::from_gltf(ctx, include_bytes!("assets/scenes/fox.glb")),
- // fox: scene::Scene::from_gltf(ctx, include_bytes!("/home/llll/src/colonq/assets/lcolonq_flat.vrm")),
- tex: texture::Texture::new(ctx, include_bytes!("assets/textures/test.png")),
- shader: scene::Scene::load_default_shader(ctx),
- }
- }
-}
-
-impl state::Game for TestGame {
- fn update(&mut self, ctx: &context::Context, st: &mut state::State) -> Erm<()> {
- st.move_camera(
- ctx,
- &glam::Vec3::new(0.0, 0.0, -1.0),
- &glam::Vec3::new(0.0, 0.0, 1.0),
- &glam::Vec3::new(0.0, 1.0, 0.0),
- );
- Ok(())
- }
- fn render(&mut self, ctx: &context::Context, st: &mut state::State) -> Erm<()> {
- // if let Some(n) = self.fox.nodes_by_name.get("J_Bip_C_Neck").and_then(|i| self.fox.nodes.get_mut(*i)) {
- // n.transform *= glam::Mat4::from_rotation_z(0.05);
- // }
- ctx.clear();
- self.fox.reflect_animation("Run", (st.tick as f32 / 60.0).rem(3.0));
- st.bind_3d(ctx, &self.shader);
- self.shader.set_position_3d(
- ctx,
- &glam::Mat4::from_scale_rotation_translation(
- glam::Vec3::new(0.005, 0.005, 0.005),
- // glam::Vec3::new(1.0, 1.0, 1.0),
- glam::Quat::from_rotation_y(st.tick as f32 / 60.0),
- glam::Vec3::new(0.0, -0.2, 0.0),
- ),
- );
- self.tex.bind(ctx);
- self.fox.render(ctx, &self.shader);
- self.font.render_text(ctx, &glam::Vec2::new(0.0, 10.0), "he's all FIXED up");
- self.tt.render_text_helper(
- ctx, &glam::Vec2::new(10.0, 60.0), &glam::Vec2::new(20.0, 30.0),
- "tESTge",
- &[
- glam::Vec3::new(1.0, 0.0, 0.0),
- glam::Vec3::new(0.0, 1.0, 0.0),
- ],
- );
- Ok(())
- }
-}
-
-#[tokio::main]
-pub async fn main() {
- run("teleia test", 240, 160, Options::empty(), TestGame::new).await;
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/flake.lock b/2026/games_submissions/rpc2dot0/vendor/teleia/flake.lock
deleted file mode 100644
index 687db1d..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/flake.lock
+++ /dev/null
@@ -1,153 +0,0 @@
-{
- "nodes": {
- "crane": {
- "locked": {
- "lastModified": 1754269165,
- "narHash": "sha256-0tcS8FHd4QjbCVoxN9jI+PjHgA4vc/IjkUSp+N3zy0U=",
- "owner": "ipetkov",
- "repo": "crane",
- "rev": "444e81206df3f7d92780680e45858e31d2f07a08",
- "type": "github"
- },
- "original": {
- "owner": "ipetkov",
- "repo": "crane",
- "type": "github"
- }
- },
- "flake-utils": {
- "inputs": {
- "systems": "systems"
- },
- "locked": {
- "lastModified": 1731533236,
- "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
- "owner": "numtide",
- "repo": "flake-utils",
- "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
- "type": "github"
- },
- "original": {
- "owner": "numtide",
- "repo": "flake-utils",
- "type": "github"
- }
- },
- "flake-utils_2": {
- "inputs": {
- "systems": "systems_2"
- },
- "locked": {
- "lastModified": 1731533236,
- "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
- "owner": "numtide",
- "repo": "flake-utils",
- "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
- "type": "github"
- },
- "original": {
- "owner": "numtide",
- "repo": "flake-utils",
- "type": "github"
- }
- },
- "nixpkgs": {
- "locked": {
- "lastModified": 1777425547,
- "narHash": "sha256-d57AbflkNfZNoFaZDzssEq1RfPoM9dLtOGI2O+N/68Q=",
- "owner": "NixOS",
- "repo": "nixpkgs",
- "rev": "ebc08544afa77957cc348ba72dc490ec73b87f68",
- "type": "github"
- },
- "original": {
- "owner": "NixOS",
- "ref": "nixpkgs-unstable",
- "repo": "nixpkgs",
- "type": "github"
- }
- },
- "pit": {
- "inputs": {
- "flake-utils": "flake-utils_2",
- "nixpkgs": [
- "nixpkgs"
- ]
- },
- "locked": {
- "lastModified": 1778890311,
- "narHash": "sha256-JZx/jh/E16SlAATrzQvB7kZcbBBfXX0zCqpwgw+Qlfc=",
- "owner": "lcolonq",
- "repo": "pit",
- "rev": "48ab2cb8e3de88dbd0722337bd4617ad22de1a12",
- "type": "github"
- },
- "original": {
- "owner": "lcolonq",
- "repo": "pit",
- "type": "github"
- }
- },
- "root": {
- "inputs": {
- "crane": "crane",
- "flake-utils": "flake-utils",
- "nixpkgs": "nixpkgs",
- "pit": "pit",
- "rust-overlay": "rust-overlay"
- }
- },
- "rust-overlay": {
- "inputs": {
- "nixpkgs": [
- "nixpkgs"
- ]
- },
- "locked": {
- "lastModified": 1766717007,
- "narHash": "sha256-ZjLiHCHgoH2maP5ZAKn0anrHymbjGOS5/PZqfJUK8Ik=",
- "owner": "oxalica",
- "repo": "rust-overlay",
- "rev": "a18efe8a9112175e43397cf870fb6bc1ca480548",
- "type": "github"
- },
- "original": {
- "owner": "oxalica",
- "repo": "rust-overlay",
- "type": "github"
- }
- },
- "systems": {
- "locked": {
- "lastModified": 1681028828,
- "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
- "owner": "nix-systems",
- "repo": "default",
- "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
- "type": "github"
- },
- "original": {
- "owner": "nix-systems",
- "repo": "default",
- "type": "github"
- }
- },
- "systems_2": {
- "locked": {
- "lastModified": 1681028828,
- "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
- "owner": "nix-systems",
- "repo": "default",
- "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
- "type": "github"
- },
- "original": {
- "owner": "nix-systems",
- "repo": "default",
- "type": "github"
- }
- }
- },
- "root": "root",
- "version": 7
-}
diff --git a/2026/games_submissions/rpc2dot0/vendor/teleia/flake.nix b/2026/games_submissions/rpc2dot0/vendor/teleia/flake.nix
deleted file mode 100644
index 878d687..0000000
--- a/2026/games_submissions/rpc2dot0/vendor/teleia/flake.nix
+++ /dev/null
@@ -1,250 +0,0 @@
-{
- inputs = {
- nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
- crane.url = "github:ipetkov/crane";
- flake-utils.url = "github:numtide/flake-utils";
- rust-overlay = {
- url = "github:oxalica/rust-overlay";
- inputs = {
- nixpkgs.follows = "nixpkgs";
- };
- };
- pit = {
- url = "github:lcolonq/pit";
- inputs.nixpkgs.follows = "nixpkgs";
- };
- };
-
- outputs = inputs@{ self, nixpkgs, ... }:
- let
- system = "x86_64-linux";
- pkgs = import nixpkgs {
- inherit system;
- overlays = [ (import inputs.rust-overlay) ];
- };
- inherit (pkgs) lib;
-
- rustToolchainFor = p: p.rust-bin.nightly.latest.default.override {
- targets = [
- "wasm32-unknown-unknown"
- "x86_64-unknown-linux-gnu"
- "x86_64-pc-windows-gnu"
- ];
- };
- craneLib = (inputs.crane.mkLib pkgs).overrideToolchain rustToolchainFor;
-
- glfw = pkgs.glfw.overrideAttrs (cur: prev: {
- cmakeFlags = []; # by default, static linking is disabled here
- # for some reason, the default glfw package hardcodes a nix store path to libGL
- # see: https://github.com/NixOS/nixpkgs/pull/47175
- # this makes it impossible to run the binary on another system
- # I'd much rather just load whatever we find on LD_LIBRARY_PATH etc, since this is much easier to control
- env = {};
- postPatch = "true";
- });
-
- LIBCOLONQ_PIT_NATIVE="${inputs.pit.packages.x86_64-linux.default}/lib";
- LIBCOLONQ_PIT_WASM="${inputs.pit.packages.x86_64-linux.wasm}/lib";
- LIBCOLONQ_PIT_WINDOWS="${inputs.pit.packages.x86_64-linux.windows}/lib";
-
- native = rec {
- nativeBuildInputs = [
- pkgs.pkg-config
- ];
- buildInputs = [
- pkgs.openssl.dev
- glfw
- pkgs.libX11
- pkgs.libXcursor
- pkgs.libXi
- pkgs.libXrandr
- pkgs.libXinerama
- pkgs.libxkbcommon
- pkgs.libxcb
- pkgs.libglvnd
- pkgs.alsa-lib
- ];
- deps = path: nm:
- let
- src = lib.cleanSourceWith {
- src = path;
- filter = path: type:
- (lib.hasSuffix "\.html" path) ||
- (lib.hasSuffix "\.js" path) ||
- (lib.hasSuffix "\.css" path) ||
- (lib.hasInfix "/assets/" path) ||
- (craneLib.filterCargoSources path type)
- ;
- };
- commonArgs = {
- inherit src nativeBuildInputs buildInputs;
- inherit LIBCOLONQ_PIT_NATIVE;
- strictDeps = true;
- CARGO_BUILD_TARGET = "x86_64-unknown-linux-gnu";
- CARGO_BUILD_RUSTFLAGS="-L ${glfw}/lib -L ${LIBCOLONQ_PIT_NATIVE}";
- inherit (craneLib.crateNameFromCargoToml { inherit src; }) version;
- };
- cargoArtifacts = craneLib.buildDepsOnly (commonArgs // {
- doCheck = false;
- });
- in
- cargoArtifacts;
- build = path: nm:
- let
- src = lib.cleanSourceWith {
- src = path;
- filter = path: type:
- (lib.hasSuffix "\.html" path) ||
- (lib.hasSuffix "\.js" path) ||
- (lib.hasSuffix "\.css" path) ||
- (lib.hasInfix "/assets/" path) ||
- (craneLib.filterCargoSources path type)
- ;
- };
- commonArgs = {
- inherit src nativeBuildInputs buildInputs;
- inherit LIBCOLONQ_PIT_NATIVE;
- strictDeps = true;
- CARGO_BUILD_TARGET = "x86_64-unknown-linux-gnu";
- CARGO_BUILD_RUSTFLAGS="-L ${glfw}/lib -L ${LIBCOLONQ_PIT_NATIVE}";
- inherit (craneLib.crateNameFromCargoToml { inherit src; }) version;
- };
- cargoArtifacts = craneLib.buildDepsOnly (commonArgs // {
- doCheck = false;
- cargoExtraArgs = "-p ${nm}";
- });
- in
- craneLib.buildPackage (commonArgs // {
- inherit cargoArtifacts;
- pname = nm;
- cargoExtraArgs = "-p ${nm}";
- });
- };
-
- wasm = rec {
- buildAtUrlInDir = path: nm: url: dir:
- let
- src = lib.cleanSourceWith {
- src = path;
- filter = path: type:
- (lib.hasSuffix "\.html" path) ||
- (lib.hasSuffix "\.js" path) ||
- (lib.hasSuffix "\.css" path) ||
- (lib.hasInfix "/assets/" path) ||
- (craneLib.filterCargoSources path type)
- ;
- };
- commonArgs = {
- inherit src;
- inherit LIBCOLONQ_PIT_WASM;
- strictDeps = true;
- CARGO_BUILD_TARGET = "wasm32-unknown-unknown";
- CARGO_BUILD_RUSTFLAGS="-L ${LIBCOLONQ_PIT_WASM}";
- buildInputs = [];
- inherit (craneLib.crateNameFromCargoToml { inherit src; }) version;
- wasm-bindgen-cli = pkgs.buildWasmBindgenCli rec {
- src = pkgs.fetchCrate {
- pname = "wasm-bindgen-cli";
- version = "0.2.100";
- hash = "sha256-3RJzK7mkYFrs7C/WkhW9Rr4LdP5ofb2FdYGz1P7Uxog=";
- };
- cargoDeps = pkgs.rustPlatform.fetchCargoVendor {
- inherit src;
- inherit (src) pname version;
- hash = "sha256-qsO12332HSjWCVKtf1cUePWWb9IdYUmT+8OPj/XP2WE=";
- };
- };
- };
- in
- craneLib.buildTrunkPackage (commonArgs // rec {
- pname = nm;
- cargoExtraArgs = "-p ${nm}";
- trunkExtraBuildArgs = "--public-url ${url}";
- cargoArtifacts = craneLib.buildDepsOnly (commonArgs // {
- inherit cargoExtraArgs;
- doCheck = false;
- });
- preBuild = ''
- pushd ${dir}
- '';
- postBuild = ''
- popd
- mv ${dir}/dist .
- '';
- });
- buildAtUrl = path: nm: url: buildAtUrlInDir path nm url ".";
- build = path: nm: buildAtUrl path nm "";
- };
-
- windows = rec {
- glfw = pkgs.pkgsCross.mingwW64.glfw.overrideAttrs (cur: prev: {
- cmakeFlags = [];
- env = {};
- postPatch = "true";
- });
- rustflags = "-L ${glfw}/lib -L ${LIBCOLONQ_PIT_WINDOWS} -L ${pkgs.pkgsCross.mingwW64.windows.pthreads}/lib";
- shell = craneLib.devShell {
- packages = [
- pkgs.pkgsCross.mingwW64.buildPackages.gcc
- ];
- RUSTFLAGS = rustflags;
- };
- build = path: nm:
- let
- src = lib.cleanSourceWith {
- src = path;
- filter = path: type:
- (lib.hasSuffix "\.html" path) ||
- (lib.hasSuffix "\.js" path) ||
- (lib.hasSuffix "\.css" path) ||
- (lib.hasInfix "/assets/" path) ||
- (craneLib.filterCargoSources path type)
- ;
- };
- commonArgs = {
- inherit src;
- strictDeps = true;
- CARGO_BUILD_TARGET = "x86_64-pc-windows-gnu";
- CARGO_BUILD_RUSTFLAGS = rustflags;
- CARGO_TARGET_X86_64_PC_WINDOWS_GNU_LINKER = "${pkgs.pkgsCross.mingwW64.stdenv.cc}/bin/${pkgs.pkgsCross.mingwW64.stdenv.cc.targetPrefix}cc";
- depsBuildBuild = with pkgs; [
- pkgsCross.mingwW64.buildPackages.gcc
- ];
- inherit (craneLib.crateNameFromCargoToml { inherit src; }) version;
- };
- cargoArtifacts = craneLib.buildDepsOnly (commonArgs // {
- doCheck = false;
- });
- in
- craneLib.buildPackage (commonArgs // {
- inherit cargoArtifacts;
- pname = nm;
- cargoExtraArgs = "-p ${nm}";
- doCheck = false;
- });
- };
-
- shell = craneLib.devShell {
- packages = [
- pkgs.trunk
- pkgs.rust-analyzer
- pkgs.cargo-flamegraph
- pkgs.cmake
- pkgs.mold
- ] ++ native.nativeBuildInputs ++ native.buildInputs;
- LIBRARY_PATH = "$LIBRARY_PATH:${pkgs.lib.makeLibraryPath native.buildInputs}";
- RUSTFLAGS="-L ${glfw}/lib";
- LD_LIBRARY_PATH = "$LD_LIBRARY_PATH:${pkgs.lib.makeLibraryPath native.buildInputs}";
- inherit LIBCOLONQ_PIT_NATIVE LIBCOLONQ_PIT_WASM;
- };
- in {
- inherit shell native wasm windows;
- devShells.${system} = {
- default = shell;
- windows = windows.shell;
- };
- packages.${system} = {
- default = native.deps ./. "teleia";
- };
- };
-}