commit 7ae6a01949136e36cfa1b08859fb1b4a962e26a4 Author: shadow cat Date: Tue Jun 4 12:11:28 2024 -0400 initial (bad) voxel renderer diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..fef7c04 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,2300 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "ab_glyph" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f90148830dac590fac7ccfe78ec4a8ea404c60f75a24e16407a71f0f40de775" +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 = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "getrandom", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "allocator-api2" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" + +[[package]] +name = "android-activity" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" +dependencies = [ + "android-properties", + "bitflags 2.5.0", + "cc", + "cesu8", + "jni", + "jni-sys", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys 0.6.0+11769913", + "num_enum", + "thiserror", +] + +[[package]] +name = "android-properties" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[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 = "ash" +version = "0.37.3+1.3.251" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e9c3835d686b0a6084ab4234fcd1b07dbf6e4767dce60874b12356a25ecd4a" +dependencies = [ + "libloading 0.7.4", +] + +[[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.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block2" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43ff7d91d3c1d568065b06c899777d1e48dcf76103a672a0adbc238a7f247f1e" +dependencies = [ + "objc2", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bytemuck" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4da9a32f3fed317401fa3c862968128267c3106685286e15d5aaa3d7389c2f60" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.61", +] + +[[package]] +name = "bytes" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" + +[[package]] +name = "calloop" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fba7adb4dd5aa98e5553510223000e7148f621165ec5f9acd7113f6ca4995298" +dependencies = [ + "bitflags 2.5.0", + "log", + "polling", + "rustix", + "slab", + "thiserror", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f0ea9b9476c7fad82841a8dbb380e2eae480c21910feba80725b46931ed8f02" +dependencies = [ + "calloop", + "rustix", + "wayland-backend", + "wayland-client", +] + +[[package]] +name = "cc" +version = "1.0.97" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "099a5357d84c4c61eb35fc8eafa9a79a902c2f76911e5747ced4e032edd8d9b4" +dependencies = [ + "jobserver", + "libc", + "once_cell", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[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 = "cfg_aliases" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77e53693616d3075149f4ead59bdeecd204ac6b8192d8969757601b74bddf00f" + +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width", +] + +[[package]] +name = "com" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e17887fd17353b65b1b2ef1c526c83e26cd72e74f598a8dc1bee13a48f3d9f6" +dependencies = [ + "com_macros", +] + +[[package]] +name = "com_macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d375883580a668c7481ea6631fc1a8863e33cc335bf56bfad8d7e6d4b04b13a5" +dependencies = [ + "com_macros_support", + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "com_macros_support" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad899a1087a9296d5644792d7cb72b8e34c1bec8e7d4fbc002230169a6e8710c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[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 = "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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "foreign-types", + "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 = "crossbeam-utils" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" + +[[package]] +name = "cursor-icon" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" +dependencies = [ + "serde", +] + +[[package]] +name = "d3d12" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b28bfe653d79bd16c77f659305b195b82bb5ce0c0eb2a4846b82ddbd77586813" +dependencies = [ + "bitflags 2.5.0", + "libloading 0.8.3", + "winapi", +] + +[[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 0.8.3", +] + +[[package]] +name = "document-features" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef5282ad69563b5fc40319526ba27e0e7363d552a896f0297d54f767717f9b95" +dependencies = [ + "litrs", +] + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "dpi" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" +dependencies = [ + "serde", +] + +[[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.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[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", +] + +[[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 2.0.61", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[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.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + +[[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 = "glutin_wgl_sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8098adac955faa2d31079b65dc48841251f69efd3ac25477903fc424362ead" +dependencies = [ + "gl_generator", +] + +[[package]] +name = "gpu-alloc" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" +dependencies = [ + "bitflags 2.5.0", + "gpu-alloc-types", +] + +[[package]] +name = "gpu-alloc-types" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" +dependencies = [ + "bitflags 2.5.0", +] + +[[package]] +name = "gpu-allocator" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f56f6318968d03c18e1bcf4857ff88c61157e9da8e47c5f29055d60e1228884" +dependencies = [ + "log", + "presser", + "thiserror", + "winapi", + "windows", +] + +[[package]] +name = "gpu-descriptor" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c08c1f623a8d0b722b8b99f821eb0ba672a1618f0d3b16ddbee1cedd2dd8557" +dependencies = [ + "bitflags 2.5.0", + "gpu-descriptor-types", + "hashbrown", +] + +[[package]] +name = "gpu-descriptor-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" +dependencies = [ + "bitflags 2.5.0", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] +name = "hassle-rs" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af2a7e73e1f34c48da31fb668a907f250794837e08faa144fd24f0b8b741e890" +dependencies = [ + "bitflags 2.5.0", + "com", + "libc", + "libloading 0.8.3", + "thiserror", + "widestring", + "winapi", +] + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hexf-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" + +[[package]] +name = "indexmap" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[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", + "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.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "khronos-egl" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" +dependencies = [ + "libc", + "libloading 0.8.3", + "pkg-config", +] + +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + +[[package]] +name = "libc" +version = "0.2.154" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libloading" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" +dependencies = [ + "cfg-if", + "windows-targets 0.52.5", +] + +[[package]] +name = "libredox" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607" +dependencies = [ + "bitflags 2.5.0", + "libc", + "redox_syscall 0.4.1", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" + +[[package]] +name = "litrs" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "matrixmultiply" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2" +dependencies = [ + "autocfg", + "rawpointer", +] + +[[package]] +name = "memchr" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" + +[[package]] +name = "memmap2" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" +dependencies = [ + "libc", +] + +[[package]] +name = "metal" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5637e166ea14be6063a3f8ba5ccb9a4159df7d8f6d61c02fc3d480b1f90dcfcb" +dependencies = [ + "bitflags 2.5.0", + "block", + "core-graphics-types", + "foreign-types", + "log", + "objc", + "paste", +] + +[[package]] +name = "naga" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e536ae46fcab0876853bd4a632ede5df4b1c2527a58f6c5a4150fe86be858231" +dependencies = [ + "arrayvec", + "bit-set", + "bitflags 2.5.0", + "codespan-reporting", + "hexf-parse", + "indexmap", + "log", + "num-traits", + "rustc-hash", + "spirv", + "termcolor", + "thiserror", + "unicode-xid", +] + +[[package]] +name = "nalgebra" +version = "0.32.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ea4908d4f23254adda3daa60ffef0f1ac7b8c3e9a864cf3cc154b251908a2ef" +dependencies = [ + "approx", + "bytemuck", + "matrixmultiply", + "nalgebra-macros", + "num-complex", + "num-rational", + "num-traits", + "simba", + "typenum", +] + +[[package]] +name = "nalgebra-macros" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91761aed67d03ad966ef783ae962ef9bbaca728d2dd7ceb7939ec110fffad998" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.5.0", + "jni-sys", + "log", + "ndk-sys 0.6.0+11769913", + "num_enum", + "raw-window-handle", + "thiserror", +] + +[[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 = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys", +] + +[[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-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-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", +] + +[[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 2.0.61", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "objc-sys" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da284c198fb9b7b0603f8635185e85fbd5b64ee154b1ed406d489077de2d6d60" + +[[package]] +name = "objc2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4b25e1034d0e636cd84707ccdaa9f81243d399196b8a773946dcffec0401659" +dependencies = [ + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb79768a710a9a1798848179edb186d1af7e8a8679f369e4b8d201dd2a034047" +dependencies = [ + "block2", + "objc2", + "objc2-core-data", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e092bc42eaf30a08844e6a076938c60751225ec81431ab89f5d1ccd9f958d6c" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-encode" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88658da63e4cc2c8adb1262902cd6af51094df0488b760d6fd27194269c0950a" + +[[package]] +name = "objc2-foundation" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfaefe14254871ea16c7d88968c0ff14ba554712a20d76421eec52f0a7fb8904" +dependencies = [ + "block2", + "dispatch", + "objc2", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "orbclient" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52f0d54bde9774d3a51dcf281a5def240c71996bc6ca05d2c847ec8b2b216166" +dependencies = [ + "libredox", +] + +[[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 = "parking_lot" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.1", + "smallvec", + "windows-targets 0.52.5", +] + +[[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" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.61", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pixelgame" +version = "0.1.0" +dependencies = [ + "bytemuck", + "nalgebra", + "pollster", + "rand", + "simba", + "wgpu", + "winit", +] + +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + +[[package]] +name = "polling" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645493cf344456ef24219d02a768cf1fb92ddf8c92161679ae3d91b91a637be3" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "tracing", + "windows-sys 0.52.0", +] + +[[package]] +name = "pollster" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22686f4785f02a4fcc856d3b3bb19bf6c8160d103f7a99cc258bddd0251dc7f2" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "presser" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" + +[[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.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profiling" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d84d1d7a6ac92673717f9f6d1518374ef257669c24ebc5ac25d5033828be58" + +[[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.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +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 = "range-alloc" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8a99fddc9f0ba0a85884b8d14e3592853e787d581ca1816c91349b10e4eeab" + +[[package]] +name = "raw-window-handle" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cc3bcbdb1ddfc11e700e62968e6b4cc9c75bb466464ad28fb61c5b2c964418b" + +[[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.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" +dependencies = [ + "bitflags 2.5.0", +] + +[[package]] +name = "renderdoc-sys" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustix" +version = "0.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags 2.5.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "safe_arch" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f398075ce1e6a179b46f51bd88d0598b92b00d3551f1a2d4ac49e771b56ac354" +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 = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sctk-adwaita" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7de61fa7334ee8ee1f5c3c58dcc414fb9361e7e8f5bff9d45f4d69eeb89a7169" +dependencies = [ + "ab_glyph", + "log", + "memmap2", + "smithay-client-toolkit", + "tiny-skia", +] + +[[package]] +name = "serde" +version = "1.0.201" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "780f1cebed1629e4753a1a38a3c72d30b97ec044f0aef68cb26650a3c5cf363c" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.201" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e405930b9796f1c00bee880d03fc7e0bb4b9a11afc776885ffe84320da2865" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.61", +] + +[[package]] +name = "simba" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "061507c94fc6ab4ba1c9a0305018408e312e17c041eb63bef8aa726fa33aceae" +dependencies = [ + "approx", + "num-complex", + "num-traits", + "paste", + "wide", +] + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "smithay-client-toolkit" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "922fd3eeab3bd820d76537ce8f582b1cf951eceb5475c28500c7457d9d17f53a" +dependencies = [ + "bitflags 2.5.0", + "calloop", + "calloop-wayland-source", + "cursor-icon", + "libc", + "log", + "memmap2", + "rustix", + "thiserror", + "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 = "spirv" +version = "0.3.0+sdk-1.3.268.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" +dependencies = [ + "bitflags 2.5.0", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strict-num" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c993ed8ccba56ae856363b1845da7266a7cb78e1d146c8a32d54b45a8b831fc9" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579e9083ca58dd9dcf91a9923bb9054071b9ebbd800b342194c9feb0ee89fc18" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2470041c06ec3ac1ab38d0356a6119054dedaea53e12fbefc0de730a1c08524" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.61", +] + +[[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 = "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-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" + +[[package]] +name = "ttf-parser" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[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 = "unicode-width" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f5e5f3158ecfd4b8ff6fe086db7c8467a2dfdac97fe420f2b7c4aa97af66d6" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[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.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.61", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.61", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[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", + "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.5.0", + "rustix", + "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.5.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", + "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.5.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.5.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.5.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.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wgpu" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32ff1bfee408e1028e2e3acbf6d32d98b08a5a059ccbf5f33305534453ba5d3e" +dependencies = [ + "arrayvec", + "cfg-if", + "cfg_aliases 0.1.1", + "document-features", + "js-sys", + "log", + "naga", + "parking_lot", + "profiling", + "raw-window-handle", + "smallvec", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-core" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac6a86eaa5e763e59c73cf9e97d55fffd4dfda69fd8bda19589fcf851ddfef1f" +dependencies = [ + "arrayvec", + "bit-vec", + "bitflags 2.5.0", + "cfg_aliases 0.1.1", + "codespan-reporting", + "document-features", + "indexmap", + "log", + "naga", + "once_cell", + "parking_lot", + "profiling", + "raw-window-handle", + "rustc-hash", + "smallvec", + "thiserror", + "web-sys", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-hal" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d71c8ae05170583049b65ee562fd839fdc0b3e9ddb84f4e40c9d5f8ea0d4c8c" +dependencies = [ + "android_system_properties", + "arrayvec", + "ash", + "bit-set", + "bitflags 2.5.0", + "block", + "cfg_aliases 0.1.1", + "core-graphics-types", + "d3d12", + "glow", + "glutin_wgl_sys", + "gpu-alloc", + "gpu-allocator", + "gpu-descriptor", + "hassle-rs", + "js-sys", + "khronos-egl", + "libc", + "libloading 0.8.3", + "log", + "metal", + "naga", + "ndk-sys 0.5.0+25.2.9519653", + "objc", + "once_cell", + "parking_lot", + "profiling", + "range-alloc", + "raw-window-handle", + "renderdoc-sys", + "rustc-hash", + "smallvec", + "thiserror", + "wasm-bindgen", + "web-sys", + "wgpu-types", + "winapi", +] + +[[package]] +name = "wgpu-types" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1353d9a46bff7f955a680577f34c69122628cc2076e1d6f3a9be6ef00ae793ef" +dependencies = [ + "bitflags 2.5.0", + "js-sys", + "web-sys", +] + +[[package]] +name = "wide" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f0e39d2c603fdc0504b12b458cf1f34e0b937ed2f4f2dc20796e3e86f34e11f" +dependencies = [ + "bytemuck", + "safe_arch", +] + +[[package]] +name = "widestring" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" + +[[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.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +dependencies = [ + "windows-sys 0.52.0", +] + +[[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.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +dependencies = [ + "windows-core", + "windows-targets 0.52.5", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.5", +] + +[[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.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.5", +] + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +dependencies = [ + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", +] + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" + +[[package]] +name = "winit" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea9e6d5d66cbf702e0dd820302144f51b69a95acdc495dd98ca280ff206562b1" +dependencies = [ + "ahash", + "android-activity", + "atomic-waker", + "bitflags 2.5.0", + "bytemuck", + "calloop", + "cfg_aliases 0.2.0", + "concurrent-queue", + "core-foundation", + "core-graphics", + "cursor-icon", + "dpi", + "js-sys", + "libc", + "memmap2", + "ndk", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "orbclient", + "percent-encoding", + "pin-project", + "raw-window-handle", + "redox_syscall 0.4.1", + "rustix", + "sctk-adwaita", + "serde", + "smithay-client-toolkit", + "smol_str", + "tracing", + "unicode-segmentation", + "wasm-bindgen", + "wasm-bindgen-futures", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-protocols-plasma", + "web-sys", + "web-time", + "windows-sys 0.52.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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" +dependencies = [ + "as-raw-xcb-connection", + "gethostname", + "libc", + "libloading 0.8.3", + "once_cell", + "rustix", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" + +[[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.5.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 = "xml-rs" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791978798f0597cfc70478424c2b4fdc2b7a8024aaff78497ef00f24ef674193" + +[[package]] +name = "zerocopy" +version = "0.7.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.61", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..8e88c7e --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "pixelgame" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +bytemuck = {version="1.14.0", features=["derive"]} +nalgebra = {version="0.32.5", features=["bytemuck"]} +pollster = "0.3" +rand = "0.8.5" +simba = "0.8.1" +wgpu = "0.20" +winit = {version="0.30", features=["serde"]} diff --git a/flamegraph.svg b/flamegraph.svg new file mode 100644 index 0000000..96fa5ab --- /dev/null +++ b/flamegraph.svg @@ -0,0 +1,491 @@ +Flame Graph Reset ZoomSearch [libGLX_nvidia.so.535.171.04] (2 samples, 0.84%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (3 samples, 1.26%)[libnvidia-glcore.so.535.171.04] (3 samples, 1.26%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)__libc_calloc (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)__mmap (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[vkcf]_Analysis (5 samples, 2.09%)[..[libc.so.6] (5 samples, 2.09%)[..[libc.so.6] (5 samples, 2.09%)[..[unknown] (2 samples, 0.84%)[unknown] (2 samples, 0.84%)[unknown] (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)snprintf (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)[libGLX_nvidia.so.535.171.04] (1 samples, 0.42%)[libGLX_nvidia.so.535.171.04] (1 samples, 0.42%)[libGLX_nvidia.so.535.171.04] (2 samples, 0.84%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)[libc.so.6] (3 samples, 1.26%)[libc.so.6] (2 samples, 0.84%)[unknown] (2 samples, 0.84%)[unknown] (2 samples, 0.84%)[unknown] (2 samples, 0.84%)[unknown] (2 samples, 0.84%)__libc_calloc (1 samples, 0.42%)__vdso_gettimeofday (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (19 samples, 7.95%)[libnvidia-..[libnvidia-glcore.so.535.171.04] (19 samples, 7.95%)[libnvidia-..[libnvidia-glcore.so.535.171.04] (13 samples, 5.44%)[libnvi..pthread_cond_timedwait (7 samples, 2.93%)pt..[libc.so.6] (7 samples, 2.93%)[l..[unknown] (6 samples, 2.51%)[u..[unknown] (5 samples, 2.09%)[..[unknown] (5 samples, 2.09%)[..[unknown] (4 samples, 1.67%)[unknown] (4 samples, 1.67%)[unknown] (4 samples, 1.67%)[unknown] (4 samples, 1.67%)[unknown] (4 samples, 1.67%)[unknown] (2 samples, 0.84%)[unknown] (1 samples, 0.42%)[vkrt]_Analysis (21 samples, 8.79%)[vkrt]_Analy..[libc.so.6] (21 samples, 8.79%)[libc.so.6][libc.so.6] (21 samples, 8.79%)[libc.so.6][unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)<pixelgame::client::run::WindowApp as winit::application::ApplicationHandler>::resumed (1 samples, 0.42%)winit::platform_impl::platform::wayland::window::Window::new (1 samples, 0.42%)wayland_client::event_queue::EventQueue<State>::roundtrip (1 samples, 0.42%)wayland_client::event_queue::EventQueue<State>::blocking_dispatch (1 samples, 0.42%)wayland_client::event_queue::EventQueue<State>::dispatching_impl (1 samples, 0.42%)wayland_client::event_queue::queue_callback (1 samples, 0.42%)winit::platform_impl::platform::wayland::seat::keyboard::<impl wayland_client::event_queue::Dispatch<wayland_client::protocol::wl_keyboard::WlKeyboard,winit::platform_impl::platform::wayland::seat::keyboard::KeyboardData> for winit::platform_impl::platform::wayland::state::WinitState>::event (1 samples, 0.42%)winit::platform_impl::platform::common::xkb::Context::set_keymap_from_fd (1 samples, 0.42%)winit::platform_impl::platform::common::xkb::keymap::XkbKeymap::from_fd (1 samples, 0.42%)xkb_keymap_new_from_buffer (1 samples, 0.42%)[libxkbcommon.so.0.0.0] (1 samples, 0.42%)[libxkbcommon.so.0.0.0] (1 samples, 0.42%)[libxkbcommon.so.0.0.0] (1 samples, 0.42%)[libxkbcommon.so.0.0.0] (1 samples, 0.42%)[libxkbcommon.so.0.0.0] (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)<wgpu::backend::wgpu_core::ContextWgpuCore as wgpu::context::Context>::device_create_render_pipeline (1 samples, 0.42%)wgpu_core::device::global::<impl wgpu_core::global::Global>::device_create_render_pipeline (1 samples, 0.42%)wgpu_core::device::resource::Device<A>::create_render_pipeline (1 samples, 0.42%)wgpu_hal::vulkan::device::<impl wgpu_hal::Device for wgpu_hal::vulkan::Device>::create_render_pipeline (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)_nv002nvvm (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)[libGLX_nvidia.so.535.171.04] (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)_IO_file_fopen (1 samples, 0.42%)_IO_file_open (1 samples, 0.42%)open64 (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[libGLX_nvidia.so.535.171.04] (3 samples, 1.26%)[libGLX_nvidia.so.535.171.04] (3 samples, 1.26%)[libGLX_nvidia.so.535.171.04] (3 samples, 1.26%)[libnvidia-glcore.so.535.171.04] (3 samples, 1.26%)[libnvidia-glcore.so.535.171.04] (3 samples, 1.26%)[libnvidia-glcore.so.535.171.04] (2 samples, 0.84%)realloc (1 samples, 0.42%)mremap (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)[libEGL_nvidia.so.535.171.04] (3 samples, 1.26%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[libEGL_nvidia.so.535.171.04] (4 samples, 1.67%)[libnvidia-eglcore.so.535.171.04] (1 samples, 0.42%)[libnvidia-eglcore.so.535.171.04] (1 samples, 0.42%)[libnvidia-eglcore.so.535.171.04] (1 samples, 0.42%)[libc.so.6] (8 samples, 3.35%)[li..snprintf (4 samples, 1.67%)[libc.so.6] (4 samples, 1.67%)[libc.so.6] (4 samples, 1.67%)[libc.so.6] (2 samples, 0.84%)__poll (2 samples, 0.84%)[unknown] (2 samples, 0.84%)[unknown] (2 samples, 0.84%)[unknown] (2 samples, 0.84%)[unknown] (2 samples, 0.84%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)_dl_runtime_resolve_xsavec (7 samples, 2.93%)_d.._dl_fixup (5 samples, 2.09%)_.._dl_lookup_symbol_x (3 samples, 1.26%)do_lookup_x (2 samples, 0.84%)read (2 samples, 0.84%)[unknown] (2 samples, 0.84%)[unknown] (2 samples, 0.84%)[unknown] (2 samples, 0.84%)[unknown] (2 samples, 0.84%)wl_display_cancel_read (1 samples, 0.42%)pthread_cond_broadcast (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[libEGL_nvidia.so.535.171.04] (3 samples, 1.26%)[libEGL_nvidia.so.535.171.04] (2 samples, 0.84%)pthread_cond_broadcast (2 samples, 0.84%)[unknown] (2 samples, 0.84%)[unknown] (2 samples, 0.84%)[unknown] (2 samples, 0.84%)[unknown] (2 samples, 0.84%)[unknown] (2 samples, 0.84%)[unknown] (2 samples, 0.84%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)wl_display_dispatch_queue_pending (11 samples, 4.60%)wl_di..[libwayland-client.so.0.22.0] (11 samples, 4.60%)[libw..[libwayland-client.so.0.22.0] (11 samples, 4.60%)[libw..ffi_call (9 samples, 3.77%)ffi_..[libffi.so.8.1.4] (9 samples, 3.77%)[lib..[libffi.so.8.1.4] (9 samples, 3.77%)[lib..[libnvidia-egl-wayland.so.1.1.13] (9 samples, 3.77%)[lib..[libEGL_nvidia.so.535.171.04] (8 samples, 3.35%)[li..[libEGL_nvidia.so.535.171.04] (7 samples, 2.93%)[l..[libEGL_nvidia.so.535.171.04] (6 samples, 2.51%)[l..[libEGL_nvidia.so.535.171.04] (5 samples, 2.09%)[..[libc.so.6] (1 samples, 0.42%)[libwayland-client.so.0.22.0] (2 samples, 0.84%)__libc_calloc (3 samples, 1.26%)[libc.so.6] (3 samples, 1.26%)[libc.so.6] (2 samples, 0.84%)[libc.so.6] (2 samples, 0.84%)__mprotect (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[libwayland-client.so.0.22.0] (7 samples, 2.93%)[l..[libwayland-client.so.0.22.0] (7 samples, 2.93%)[l..recvmsg (2 samples, 0.84%)[unknown] (2 samples, 0.84%)[unknown] (2 samples, 0.84%)[unknown] (2 samples, 0.84%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)pthread_cond_broadcast (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[libnvidia-egl-wayland.so.1.1.13] (37 samples, 15.48%)[libnvidia-egl-wayland.s..wl_display_read_events (11 samples, 4.60%)wl_di..pthread_cond_wait (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[libGLX_nvidia.so.535.171.04] (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[libc.so.6] (2 samples, 0.84%)[libc.so.6] (2 samples, 0.84%)[unknown] (2 samples, 0.84%)[unknown] (2 samples, 0.84%)[unknown] (2 samples, 0.84%)[unknown] (2 samples, 0.84%)[unknown] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (2 samples, 0.84%)[libnvidia-glcore.so.535.171.04] (2 samples, 0.84%)clock_gettime (2 samples, 0.84%)__vdso_gettimeofday (3 samples, 1.26%)pthread_cond_timedwait (37 samples, 15.48%)pthread_cond_timedwait[libc.so.6] (34 samples, 14.23%)[libc.so.6][unknown] (33 samples, 13.81%)[unknown][unknown] (32 samples, 13.39%)[unknown][unknown] (32 samples, 13.39%)[unknown][unknown] (32 samples, 13.39%)[unknown][unknown] (32 samples, 13.39%)[unknown][unknown] (31 samples, 12.97%)[unknown][unknown] (30 samples, 12.55%)[unknown][unknown] (27 samples, 11.30%)[unknown][unknown] (22 samples, 9.21%)[unknown][unknown] (11 samples, 4.60%)[unkn..[unknown] (4 samples, 1.67%)[unknown] (3 samples, 1.26%)[unknown] (1 samples, 0.42%)pthread_equal (2 samples, 0.84%)[libnvidia-glcore.so.535.171.04] (50 samples, 20.92%)[libnvidia-glcore.so.535.171.04]pthread_mutex_lock (1 samples, 0.42%)__close (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)__libc_calloc (1 samples, 0.42%)open64 (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)read (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (63 samples, 26.36%)[libnvidia-glcore.so.535.171.04][libnvidia-glcore.so.535.171.04] (60 samples, 25.10%)[libnvidia-glcore.so.535.171.04]sscanf (3 samples, 1.26%)[libc.so.6] (3 samples, 1.26%)[libnvidia-glcore.so.535.171.04] (64 samples, 26.78%)[libnvidia-glcore.so.535.171.04]pthread_mutex_lock (1 samples, 0.42%)[libc.so.6] (117 samples, 48.95%)[libc.so.6][libc.so.6] (117 samples, 48.95%)[libc.so.6][unknown] (8 samples, 3.35%)[un..[unknown] (8 samples, 3.35%)[un..[unknown] (6 samples, 2.51%)[u..[unknown] (3 samples, 1.26%)[unknown] (2 samples, 0.84%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (2 samples, 0.84%)[libnvidia-glvkspirv.so.535.171.04] (2 samples, 0.84%)[libnvidia-glvkspirv.so.535.171.04] (2 samples, 0.84%)[libnvidia-glvkspirv.so.535.171.04] (2 samples, 0.84%)[libnvidia-glvkspirv.so.535.171.04] (2 samples, 0.84%)[libnvidia-glvkspirv.so.535.171.04] (2 samples, 0.84%)malloc (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)XGetVisualInfo (2 samples, 0.84%)_XVIDtoVisual (1 samples, 0.42%)[libGLX_nvidia.so.535.171.04] (2 samples, 0.84%)[libGLX_nvidia.so.535.171.04] (2 samples, 0.84%)[libc.so.6] (2 samples, 0.84%)[libnvidia-glsi.so.535.171.04] (3 samples, 1.26%)[libnvidia-glsi.so.535.171.04] (3 samples, 1.26%)[libnvidia-glsi.so.535.171.04] (3 samples, 1.26%)[libnvidia-glsi.so.535.171.04] (3 samples, 1.26%)[libnvidia-glsi.so.535.171.04] (3 samples, 1.26%)[libnvidia-glsi.so.535.171.04] (3 samples, 1.26%)[libnvidia-glsi.so.535.171.04] (3 samples, 1.26%)[libnvidia-glsi.so.535.171.04] (2 samples, 0.84%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[libxcb.so.1.1.0] (6 samples, 2.51%)[l..recv (6 samples, 2.51%)re..[unknown] (6 samples, 2.51%)[u..[unknown] (6 samples, 2.51%)[u..[unknown] (6 samples, 2.51%)[u..[unknown] (6 samples, 2.51%)[u..[unknown] (6 samples, 2.51%)[u..[unknown] (5 samples, 2.09%)[..[unknown] (5 samples, 2.09%)[..[unknown] (3 samples, 1.26%)[unknown] (1 samples, 0.42%)[libvulkan.so.1.3.280] (16 samples, 6.69%)[libvulka..[libvulkan.so.1.3.280] (16 samples, 6.69%)[libvulka..[libvulkan.so.1.3.280] (16 samples, 6.69%)[libvulka..[libvulkan.so.1.3.280] (16 samples, 6.69%)[libvulka..vk_icdNegotiateLoaderICDInterfaceVersion (16 samples, 6.69%)vk_icdNeg..[libGLX_nvidia.so.535.171.04] (16 samples, 6.69%)[libGLX_n..[libGLX_nvidia.so.535.171.04] (16 samples, 6.69%)[libGLX_n.._XReply (7 samples, 2.93%)_X..xcb_wait_for_reply64 (7 samples, 2.93%)xc..[libxcb.so.1.1.0] (7 samples, 2.93%)[l..[libxcb.so.1.1.0] (7 samples, 2.93%)[l..[libxcb.so.1.1.0] (7 samples, 2.93%)[l..recvmsg (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (7 samples, 2.93%)[u..[unknown] (5 samples, 2.09%)[..[unknown] (5 samples, 2.09%)[..[unknown] (4 samples, 1.67%)[unknown] (3 samples, 1.26%)_dl_runtime_resolve_xsavec (1 samples, 0.42%)[unknown] (1 samples, 0.42%)_nv012tls (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)__libc_start_main (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)exit (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)glVDPAURegisterVideoSurfaceWithPictureStructureNV (1 samples, 0.42%)[libGLX_nvidia.so.535.171.04] (1 samples, 0.42%)[libGLX_nvidia.so.535.171.04] (1 samples, 0.42%)[libGLX_nvidia.so.535.171.04] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)[unknown] (4 samples, 1.67%)[unknown] (4 samples, 1.67%)[unknown] (4 samples, 1.67%)[unknown] (3 samples, 1.26%)[unknown] (3 samples, 1.26%)[unknown] (3 samples, 1.26%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)__GI___tunables_init (1 samples, 0.42%)_start (8 samples, 3.35%)_st.._dl_start (6 samples, 2.51%)_d.._dl_sysdep_start (2 samples, 0.84%)dl_main (1 samples, 0.42%)_dl_map_object_deps (1 samples, 0.42%)__GI__dl_catch_exception (1 samples, 0.42%)openaux (1 samples, 0.42%)_dl_map_object (1 samples, 0.42%)index (1 samples, 0.42%)wgpu::Instance::new (1 samples, 0.42%)wgpu_core::global::Global::new (1 samples, 0.42%)wgpu_core::instance::Instance::new (1 samples, 0.42%)wgpu_hal::vulkan::instance::<impl wgpu_hal::Instance for wgpu_hal::vulkan::Instance>::init (1 samples, 0.42%)ash::entry::Entry::load (1 samples, 0.42%)libloading::os::unix::Library::open (1 samples, 0.42%)dlopen (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)_dl_catch_error (1 samples, 0.42%)__GI__dl_catch_exception (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)_dl_open (1 samples, 0.42%)__GI__dl_catch_exception (1 samples, 0.42%)dl_open_worker (1 samples, 0.42%)__GI__dl_catch_exception (1 samples, 0.42%)dl_open_worker_begin (1 samples, 0.42%)_dl_map_object (1 samples, 0.42%)_dl_map_object_from_fd (1 samples, 0.42%)_dl_new_object (1 samples, 0.42%)__libc_calloc (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)wgpu::Instance::request_adapter (1 samples, 0.42%)<T as wgpu::context::DynContext>::instance_request_adapter (1 samples, 0.42%)wgpu_core::instance::<impl wgpu_core::global::Global>::request_adapter (1 samples, 0.42%)wgpu_core::instance::<impl wgpu_core::global::Global>::request_adapter::gather (1 samples, 0.42%)alloc::vec::Vec<T,A>::retain (1 samples, 0.42%)wgpu_hal::vulkan::adapter::<impl wgpu_hal::Adapter for wgpu_hal::vulkan::Adapter>::surface_capabilities (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)dlopen (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)_dl_catch_error (1 samples, 0.42%)__GI__dl_catch_exception (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)_dl_open (1 samples, 0.42%)__GI__dl_catch_exception (1 samples, 0.42%)dl_open_worker (1 samples, 0.42%)__GI__dl_catch_exception (1 samples, 0.42%)_dl_init (1 samples, 0.42%)call_init (1 samples, 0.42%)[libEGL.so.1.1.0] (1 samples, 0.42%)[libEGL.so.1.1.0] (1 samples, 0.42%)[libEGL.so.1.1.0] (1 samples, 0.42%)__strdup (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)[libnvidia-eglcore.so.535.171.04] (3 samples, 1.26%)NvGlEglApiInit (4 samples, 1.67%)[libnvidia-eglcore.so.535.171.04] (4 samples, 1.67%)[libnvidia-eglcore.so.535.171.04] (4 samples, 1.67%)[libnvidia-eglcore.so.535.171.04] (4 samples, 1.67%)[libnvidia-eglcore.so.535.171.04] (4 samples, 1.67%)[libnvidia-eglcore.so.535.171.04] (4 samples, 1.67%)realloc (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[libEGL_nvidia.so.535.171.04] (1 samples, 0.42%)dlopen (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)_dl_catch_error (1 samples, 0.42%)__GI__dl_catch_exception (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)_dl_open (1 samples, 0.42%)__GI__dl_catch_exception (1 samples, 0.42%)dl_open_worker (1 samples, 0.42%)__GI__dl_catch_exception (1 samples, 0.42%)dl_open_worker_begin (1 samples, 0.42%)_dl_relocate_object (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)pixelgame::client::render::renderer::Renderer::new (8 samples, 3.35%)pix..wgpu::Surface::configure (6 samples, 2.51%)wg..<T as wgpu::context::DynContext>::surface_configure (6 samples, 2.51%)<T..<wgpu::backend::wgpu_core::ContextWgpuCore as wgpu::context::Context>::surface_configure (6 samples, 2.51%)<w..wgpu_core::device::global::<impl wgpu_core::global::Global>::surface_configure (6 samples, 2.51%)wg..wgpu_hal::vulkan::instance::<impl wgpu_hal::Surface for wgpu_hal::vulkan::Surface>::configure (6 samples, 2.51%)wg..[libvulkan.so.1.3.280] (6 samples, 2.51%)[l..[libGLX_nvidia.so.535.171.04] (6 samples, 2.51%)[l..[libnvidia-glcore.so.535.171.04] (6 samples, 2.51%)[l..[libnvidia-glcore.so.535.171.04] (6 samples, 2.51%)[l..[libnvidia-glcore.so.535.171.04] (6 samples, 2.51%)[l..ProducerInit (6 samples, 2.51%)Pr..[libEGL.so.1.1.0] (6 samples, 2.51%)[l..[libEGL.so.1.1.0] (6 samples, 2.51%)[l..[libc.so.6] (6 samples, 2.51%)[l..[libEGL.so.1.1.0] (6 samples, 2.51%)[l..[libEGL.so.1.1.0] (6 samples, 2.51%)[l..[libEGL_nvidia.so.535.171.04] (6 samples, 2.51%)[l..[libEGL_nvidia.so.535.171.04] (6 samples, 2.51%)[l..[libEGL_nvidia.so.535.171.04] (6 samples, 2.51%)[l..[libEGL_nvidia.so.535.171.04] (6 samples, 2.51%)[l..[libc.so.6] (6 samples, 2.51%)[l..[libEGL_nvidia.so.535.171.04] (6 samples, 2.51%)[l..[libEGL_nvidia.so.535.171.04] (6 samples, 2.51%)[l..[libEGL_nvidia.so.535.171.04] (6 samples, 2.51%)[l..loadEGLExternalPlatform (6 samples, 2.51%)lo..[libnvidia-egl-wayland.so.1.1.13] (6 samples, 2.51%)[l..[libEGL_nvidia.so.535.171.04] (6 samples, 2.51%)[l..[libEGL_nvidia.so.535.171.04] (6 samples, 2.51%)[l..[libEGL_nvidia.so.535.171.04] (6 samples, 2.51%)[l..[libEGL_nvidia.so.535.171.04] (6 samples, 2.51%)[l..[libEGL_nvidia.so.535.171.04] (6 samples, 2.51%)[l..[libEGL_nvidia.so.535.171.04] (2 samples, 0.84%)snprintf (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (3 samples, 1.26%)[libnvidia-glcore.so.535.171.04] (3 samples, 1.26%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (2 samples, 0.84%)[libnvidia-glvkspirv.so.535.171.04] (2 samples, 0.84%)[libnvidia-glvkspirv.so.535.171.04] (2 samples, 0.84%)malloc (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)wgpu::Device::create_render_pipeline (6 samples, 2.51%)wg..<T as wgpu::context::DynContext>::device_create_render_pipeline (6 samples, 2.51%)<T..<wgpu::backend::wgpu_core::ContextWgpuCore as wgpu::context::Context>::device_create_render_pipeline (6 samples, 2.51%)<w..wgpu_core::device::global::<impl wgpu_core::global::Global>::device_create_render_pipeline (6 samples, 2.51%)wg..wgpu_core::device::resource::Device<A>::create_render_pipeline (6 samples, 2.51%)wg..wgpu_hal::vulkan::device::<impl wgpu_hal::Device for wgpu_hal::vulkan::Device>::create_render_pipeline (6 samples, 2.51%)wg..[libnvidia-glcore.so.535.171.04] (6 samples, 2.51%)[l..[libnvidia-glcore.so.535.171.04] (6 samples, 2.51%)[l..[libnvidia-glcore.so.535.171.04] (6 samples, 2.51%)[l..[libnvidia-glcore.so.535.171.04] (6 samples, 2.51%)[l..[libnvidia-glcore.so.535.171.04] (6 samples, 2.51%)[l..[libnvidia-glcore.so.535.171.04] (6 samples, 2.51%)[l..[libnvidia-glcore.so.535.171.04] (6 samples, 2.51%)[l..[libnvidia-glcore.so.535.171.04] (6 samples, 2.51%)[l.._nv002nvvm (3 samples, 1.26%)[libnvidia-glvkspirv.so.535.171.04] (3 samples, 1.26%)[libnvidia-glvkspirv.so.535.171.04] (3 samples, 1.26%)[libnvidia-glvkspirv.so.535.171.04] (3 samples, 1.26%)[libnvidia-glvkspirv.so.535.171.04] (3 samples, 1.26%)[libnvidia-glvkspirv.so.535.171.04] (3 samples, 1.26%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)pixelgame::client::render::tile::pipeline::TilePipeline::new (7 samples, 2.93%)pi..wgpu::Device::create_shader_module (1 samples, 0.42%)<T as wgpu::context::DynContext>::device_create_shader_module (1 samples, 0.42%)<wgpu::backend::wgpu_core::ContextWgpuCore as wgpu::context::Context>::device_create_shader_module (1 samples, 0.42%)wgpu_core::device::global::<impl wgpu_core::global::Global>::device_create_shader_module (1 samples, 0.42%)wgpu_core::device::resource::Device<A>::create_shader_module (1 samples, 0.42%)naga::front::wgsl::parse_str (1 samples, 0.42%)naga::front::wgsl::Frontend::inner (1 samples, 0.42%)naga::front::wgsl::parse::Parser::parse (1 samples, 0.42%)naga::front::wgsl::parse::BindingParser::parse (1 samples, 0.42%)naga::front::wgsl::parse::Parser::general_expression (1 samples, 0.42%)naga::front::wgsl::parse::ExpressionContext::parse_binary_op (1 samples, 0.42%)naga::front::wgsl::parse::ExpressionContext::parse_binary_op (1 samples, 0.42%)naga::front::wgsl::parse::ExpressionContext::parse_binary_op (1 samples, 0.42%)naga::front::wgsl::parse::ExpressionContext::parse_binary_op (1 samples, 0.42%)naga::front::wgsl::parse::ExpressionContext::parse_binary_op (1 samples, 0.42%)naga::front::wgsl::parse::Parser::equality_expression (1 samples, 0.42%)naga::front::wgsl::parse::Parser::equality_expression::{{closure}} (1 samples, 0.42%)naga::front::wgsl::parse::Parser::equality_expression::{{closure}}::{{closure}} (1 samples, 0.42%)naga::front::wgsl::parse::Parser::equality_expression::{{closure}}::{{closure}}::{{closure}} (1 samples, 0.42%)naga::front::wgsl::parse::lexer::consume_token (1 samples, 0.42%)naga::front::wgsl::parse::number::consume_number (1 samples, 0.42%)[unknown] (1 samples, 0.42%)wayland_client::event_queue::EventQueue<State>::roundtrip (2 samples, 0.84%)wayland_client::event_queue::EventQueue<State>::dispatching_impl (2 samples, 0.84%)wayland_client::event_queue::queue_callback (2 samples, 0.84%)<smithay_client_toolkit::seat::SeatState as wayland_client::event_queue::Dispatch<wayland_client::protocol::wl_seat::WlSeat,smithay_client_toolkit::seat::SeatData,D>>::event (2 samples, 0.84%)winit::platform_impl::platform::wayland::seat::<impl smithay_client_toolkit::seat::SeatHandler for winit::platform_impl::platform::wayland::state::WinitState>::new_capability (2 samples, 0.84%)winit::platform_impl::platform::common::xkb::Context::new (2 samples, 0.84%)winit::platform_impl::platform::common::xkb::compose::XkbComposeTable::new (2 samples, 0.84%)xkb_compose_table_new_from_locale (2 samples, 0.84%)[libxkbcommon.so.0.0.0] (2 samples, 0.84%)[libxkbcommon.so.0.0.0] (2 samples, 0.84%)[libxkbcommon.so.0.0.0] (2 samples, 0.84%)[libxkbcommon.so.0.0.0] (1 samples, 0.42%)winit::platform_impl::platform::EventLoop<T>::new (3 samples, 1.26%)winit::platform_impl::platform::wayland::event_loop::EventLoop<T>::new (3 samples, 1.26%)winit::platform_impl::platform::wayland::state::WinitState::new (1 samples, 0.42%)once_cell::race::once_box::OnceBox<T>::get_or_try_init (1 samples, 0.42%)getrandom::imp::getrandom_inner (1 samples, 0.42%)syscall (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)core::ptr::drop_in_place<wgpu_core::track::UsageScope<wgpu_hal::vulkan::Api>> (1 samples, 0.42%)<wgpu_core::track::UsageScope<A> as core::ops::drop::Drop>::drop (1 samples, 0.42%)memcpy (1 samples, 0.42%)core::ptr::drop_in_place<wgpu::RenderPass> (2 samples, 0.84%)<wgpu::RenderPass as core::ops::drop::Drop>::drop (2 samples, 0.84%)<T as wgpu::context::DynContext>::command_encoder_end_render_pass (2 samples, 0.84%)<wgpu::backend::wgpu_core::ContextWgpuCore as wgpu::context::Context>::command_encoder_end_render_pass (2 samples, 0.84%)wgpu_core::command::render::<impl wgpu_core::global::Global>::command_encoder_run_render_pass_impl (2 samples, 0.84%)wgpu_core::command::CommandBuffer<A>::drain_barriers (1 samples, 0.42%)wgpu_hal::vulkan::command::<impl wgpu_hal::CommandEncoder for wgpu_hal::vulkan::CommandEncoder>::transition_buffers (1 samples, 0.42%)ProducerPresentFrame (1 samples, 0.42%)wlEglPostPresentExport2 (1 samples, 0.42%)[libnvidia-egl-wayland.so.1.1.13] (1 samples, 0.42%)[libnvidia-egl-wayland.so.1.1.13] (1 samples, 0.42%)[libEGL_nvidia.so.535.171.04] (1 samples, 0.42%)[libEGL_nvidia.so.535.171.04] (1 samples, 0.42%)[libEGL_nvidia.so.535.171.04] (1 samples, 0.42%)[libEGL_nvidia.so.535.171.04] (1 samples, 0.42%)wgpu::SurfaceTexture::present (3 samples, 1.26%)<T as wgpu::context::DynContext>::surface_present (3 samples, 1.26%)<wgpu::backend::wgpu_core::ContextWgpuCore as wgpu::context::Context>::surface_present (3 samples, 1.26%)wgpu_core::present::<impl wgpu_core::global::Global>::surface_present (3 samples, 1.26%)<wgpu_hal::vulkan::Queue as wgpu_hal::Queue>::present (3 samples, 1.26%)[libGLX_nvidia.so.535.171.04] (3 samples, 1.26%)[libnvidia-glcore.so.535.171.04] (3 samples, 1.26%)[libnvidia-glcore.so.535.171.04] (3 samples, 1.26%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)pixelgame::client::render::renderer::Renderer::draw (6 samples, 2.51%)pi..wgpu::Texture::create_view (1 samples, 0.42%)<T as wgpu::context::DynContext>::texture_create_view (1 samples, 0.42%)<wgpu::backend::wgpu_core::ContextWgpuCore as wgpu::context::Context>::texture_create_view (1 samples, 0.42%)wgpu_core::device::global::<impl wgpu_core::global::Global>::texture_create_view (1 samples, 0.42%)wgpu_core::device::resource::Device<A>::create_texture_view (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)pixelgame::client::render::renderer::Renderer::update (2 samples, 0.84%)pixelgame::client::render::instance::Instances<T>::update (2 samples, 0.84%)wgpu::util::belt::StagingBelt::write_buffer (1 samples, 0.42%)<T as wgpu::context::DynContext>::command_encoder_copy_buffer_to_buffer (1 samples, 0.42%)<wgpu::backend::wgpu_core::ContextWgpuCore as wgpu::context::Context>::command_encoder_copy_buffer_to_buffer (1 samples, 0.42%)wgpu_core::command::transfer::<impl wgpu_core::global::Global>::command_encoder_copy_buffer_to_buffer (1 samples, 0.42%)wgpu_core::command::CommandEncoder<A>::open (1 samples, 0.42%)wgpu_hal::vulkan::command::<impl wgpu_hal::CommandEncoder for wgpu_hal::vulkan::CommandEncoder>::begin_encoding (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)<pixelgame::client::run::WindowApp as winit::application::ApplicationHandler>::about_to_wait (11 samples, 4.60%)<pixe..pixelgame::client::update::update (2 samples, 0.84%)<pixelgame::client::run::WindowApp as winit::application::ApplicationHandler>::window_event (1 samples, 0.42%)wgpu::Surface::configure (1 samples, 0.42%)<T as wgpu::context::DynContext>::surface_configure (1 samples, 0.42%)<wgpu::backend::wgpu_core::ContextWgpuCore as wgpu::context::Context>::surface_configure (1 samples, 0.42%)wgpu_core::device::global::<impl wgpu_core::global::Global>::surface_configure (1 samples, 0.42%)wgpu_hal::vulkan::instance::<impl wgpu_hal::Surface for wgpu_hal::vulkan::Surface>::configure (1 samples, 0.42%)[libGLX_nvidia.so.535.171.04] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)ProducerCleanup (1 samples, 0.42%)[libEGL_nvidia.so.535.171.04] (1 samples, 0.42%)[libEGL_nvidia.so.535.171.04] (1 samples, 0.42%)[libnvidia-egl-wayland.so.1.1.13] (1 samples, 0.42%)[libnvidia-egl-wayland.so.1.1.13] (1 samples, 0.42%)[libnvidia-egl-wayland.so.1.1.13] (1 samples, 0.42%)[libnvidia-egl-wayland.so.1.1.13] (1 samples, 0.42%)[libEGL_nvidia.so.535.171.04] (1 samples, 0.42%)[libEGL_nvidia.so.535.171.04] (1 samples, 0.42%)[libEGL_nvidia.so.535.171.04] (1 samples, 0.42%)[libEGL_nvidia.so.535.171.04] (1 samples, 0.42%)[libEGL_nvidia.so.535.171.04] (1 samples, 0.42%)[libnvidia-eglcore.so.535.171.04] (1 samples, 0.42%)[libnvidia-eglcore.so.535.171.04] (1 samples, 0.42%)[libnvidia-eglcore.so.535.171.04] (1 samples, 0.42%)wayland_backend::sys::client_impl::InnerBackend::dispatch_inner_queue (1 samples, 0.42%)wayland_backend::sys::client_impl::Dispatcher::dispatch_pending (1 samples, 0.42%)scoped_tls::ScopedKey<T>::set (1 samples, 0.42%)wl_display_dispatch_queue_pending (1 samples, 0.42%)[libwayland-client.so.0.22.0] (1 samples, 0.42%)[libwayland-client.so.0.22.0] (1 samples, 0.42%)wayland_backend::sys::client_impl::dispatcher_func (1 samples, 0.42%)pixelgame::main (18 samples, 7.53%)pixelgame:..winit::platform_impl::platform::wayland::event_loop::EventLoop<T>::run_on_demand (15 samples, 6.28%)winit::p..winit::platform_impl::platform::wayland::event_loop::EventLoop<T>::pump_events (15 samples, 6.28%)winit::p..calloop::loop_logic::EventLoop<Data>::dispatch (3 samples, 1.26%)<core::cell::RefCell<calloop::sources::DispatcherInner<S,F>> as calloop::sources::EventDispatcher<Data>>::process_events (3 samples, 1.26%)<calloop_wayland_source::WaylandSource<D> as calloop::sources::EventSource>::process_events (3 samples, 1.26%)wayland_client::event_queue::EventQueue<State>::dispatching_impl (3 samples, 1.26%)wayland_client::event_queue::queue_callback (2 samples, 0.84%)winit::platform_impl::platform::wayland::seat::keyboard::<impl wayland_client::event_queue::Dispatch<wayland_client::protocol::wl_keyboard::WlKeyboard,winit::platform_impl::platform::wayland::seat::keyboard::KeyboardData> for winit::platform_impl::platform::wayland::state::WinitState>::event (2 samples, 0.84%)winit::platform_impl::platform::common::xkb::Context::set_keymap_from_fd (2 samples, 0.84%)winit::platform_impl::platform::common::xkb::keymap::XkbKeymap::from_fd (2 samples, 0.84%)xkb_keymap_new_from_buffer (2 samples, 0.84%)[libxkbcommon.so.0.0.0] (2 samples, 0.84%)[libxkbcommon.so.0.0.0] (2 samples, 0.84%)[libxkbcommon.so.0.0.0] (2 samples, 0.84%)[libxkbcommon.so.0.0.0] (2 samples, 0.84%)[libxkbcommon.so.0.0.0] (1 samples, 0.42%)[libxkbcommon.so.0.0.0] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (2 samples, 0.84%)[libnvidia-glcore.so.535.171.04] (2 samples, 0.84%)[libnvidia-glcore.so.535.171.04] (2 samples, 0.84%)[libnvidia-glcore.so.535.171.04] (2 samples, 0.84%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)vkCreateInstance (3 samples, 1.26%)[libvulkan.so.1.3.280] (3 samples, 1.26%)[libvulkan.so.1.3.280] (3 samples, 1.26%)[libGLX_nvidia.so.535.171.04] (3 samples, 1.26%)[libnvidia-glcore.so.535.171.04] (3 samples, 1.26%)[libnvidia-glcore.so.535.171.04] (3 samples, 1.26%)dlsym (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)_dl_catch_error (1 samples, 0.42%)_nv012nvvm (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)wgpu_core::device::global::<impl wgpu_core::global::Global>::device_create_render_pipeline (2 samples, 0.84%)wgpu_core::device::resource::Device<A>::create_render_pipeline (2 samples, 0.84%)wgpu_hal::vulkan::device::<impl wgpu_hal::Device for wgpu_hal::vulkan::Device>::create_render_pipeline (2 samples, 0.84%)[libnvidia-glcore.so.535.171.04] (2 samples, 0.84%)[libnvidia-glcore.so.535.171.04] (2 samples, 0.84%)[libnvidia-glcore.so.535.171.04] (2 samples, 0.84%)[libnvidia-glcore.so.535.171.04] (2 samples, 0.84%)[libnvidia-glcore.so.535.171.04] (2 samples, 0.84%)[libnvidia-glcore.so.535.171.04] (2 samples, 0.84%)[libnvidia-glcore.so.535.171.04] (2 samples, 0.84%)_nv013nvvm (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)wgpu_core::device::resource::Device<A>::create_render_pipeline (2 samples, 0.84%)wgpu_hal::vulkan::device::<impl wgpu_hal::Device for wgpu_hal::vulkan::Device>::create_render_pipeline (2 samples, 0.84%)[libnvidia-glcore.so.535.171.04] (2 samples, 0.84%)[libnvidia-glcore.so.535.171.04] (2 samples, 0.84%)[libnvidia-glcore.so.535.171.04] (2 samples, 0.84%)[libnvidia-glcore.so.535.171.04] (2 samples, 0.84%)[libnvidia-glcore.so.535.171.04] (2 samples, 0.84%)[libnvidia-glcore.so.535.171.04] (2 samples, 0.84%)[libnvidia-glcore.so.535.171.04] (2 samples, 0.84%)[libnvidia-glcore.so.535.171.04] (2 samples, 0.84%)_nv002nvvm (2 samples, 0.84%)[libnvidia-glvkspirv.so.535.171.04] (2 samples, 0.84%)[libnvidia-glvkspirv.so.535.171.04] (2 samples, 0.84%)[libnvidia-glvkspirv.so.535.171.04] (2 samples, 0.84%)[libnvidia-glvkspirv.so.535.171.04] (2 samples, 0.84%)[libnvidia-glvkspirv.so.535.171.04] (2 samples, 0.84%)[libnvidia-glvkspirv.so.535.171.04] (2 samples, 0.84%)[libnvidia-glvkspirv.so.535.171.04] (2 samples, 0.84%)[libnvidia-glvkspirv.so.535.171.04] (2 samples, 0.84%)[libnvidia-glvkspirv.so.535.171.04] (2 samples, 0.84%)[libnvidia-glvkspirv.so.535.171.04] (2 samples, 0.84%)[libnvidia-glvkspirv.so.535.171.04] (2 samples, 0.84%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)malloc (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)wgpu_core::device::resource::Device<A>::new (1 samples, 0.42%)wgpu_hal::vulkan::command::<impl wgpu_hal::CommandEncoder for wgpu_hal::vulkan::CommandEncoder>::begin_encoding (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)ash::device::Device::load (1 samples, 0.42%)ash::vk::features::DeviceFnV1_0::load (1 samples, 0.42%)vkGetDeviceProcAddr (1 samples, 0.42%)[libvulkan.so.1.3.280] (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (2 samples, 0.84%)[libnvidia-glcore.so.535.171.04] (2 samples, 0.84%)ioctl (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (3 samples, 1.26%)[libnvidia-glcore.so.535.171.04] (3 samples, 1.26%)__libc_calloc (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (5 samples, 2.09%)[..ioctl (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (6 samples, 2.51%)[l..__sched_yield (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[libnvidia-glcore.so.535.171.04] (7 samples, 2.93%)[l..[libnvidia-glcore.so.535.171.04] (7 samples, 2.93%)[l..__libc_calloc (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)[libc.so.6] (1 samples, 0.42%)__default_morecore (1 samples, 0.42%)__sbrk (1 samples, 0.42%)brk (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)wgpu_core::instance::Adapter<A>::create_device_and_queue (12 samples, 5.02%)wgpu_c..wgpu_hal::vulkan::adapter::<impl wgpu_hal::Adapter for wgpu_hal::vulkan::Adapter>::open (12 samples, 5.02%)wgpu_h..vkCreateDevice (11 samples, 4.60%)vkCre..[libvulkan.so.1.3.280] (11 samples, 4.60%)[libv..[libvulkan.so.1.3.280] (11 samples, 4.60%)[libv..[libvulkan.so.1.3.280] (11 samples, 4.60%)[libv..[libGLX_nvidia.so.535.171.04] (11 samples, 4.60%)[libG..[libnvidia-glcore.so.535.171.04] (11 samples, 4.60%)[libn..[libnvidia-glcore.so.535.171.04] (11 samples, 4.60%)[libn..[libnvidia-glcore.so.535.171.04] (10 samples, 4.18%)[libn..[libnvidia-glcore.so.535.171.04] (10 samples, 4.18%)[libn..[libnvidia-glcore.so.535.171.04] (10 samples, 4.18%)[libn..[libnvidia-glcore.so.535.171.04] (8 samples, 3.35%)[li..[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)[unknown] (1 samples, 0.42%)all (239 samples, 100%)pixelgame (213 samples, 89.12%)pixelgamewgpu_hal::vulkan::device::<impl wgpu_hal::Device for wgpu_hal::vulkan::Device>::create_render_pipeline (3 samples, 1.26%)[libnvidia-glcore.so.535.171.04] (3 samples, 1.26%)[libnvidia-glcore.so.535.171.04] (3 samples, 1.26%)[libnvidia-glcore.so.535.171.04] (3 samples, 1.26%)[libnvidia-glcore.so.535.171.04] (3 samples, 1.26%)[libnvidia-glcore.so.535.171.04] (3 samples, 1.26%)[libnvidia-glcore.so.535.171.04] (3 samples, 1.26%)[libnvidia-glcore.so.535.171.04] (3 samples, 1.26%)[libnvidia-glcore.so.535.171.04] (3 samples, 1.26%)_nv002nvvm (3 samples, 1.26%)[libnvidia-glvkspirv.so.535.171.04] (3 samples, 1.26%)[libnvidia-glvkspirv.so.535.171.04] (3 samples, 1.26%)[libnvidia-glvkspirv.so.535.171.04] (3 samples, 1.26%)[libnvidia-glvkspirv.so.535.171.04] (3 samples, 1.26%)[libnvidia-glvkspirv.so.535.171.04] (3 samples, 1.26%)[libnvidia-glvkspirv.so.535.171.04] (3 samples, 1.26%)[libnvidia-glvkspirv.so.535.171.04] (3 samples, 1.26%)[libnvidia-glvkspirv.so.535.171.04] (3 samples, 1.26%)[libnvidia-glvkspirv.so.535.171.04] (3 samples, 1.26%)[libnvidia-glvkspirv.so.535.171.04] (3 samples, 1.26%)[libnvidia-glvkspirv.so.535.171.04] (3 samples, 1.26%)[libnvidia-glvkspirv.so.535.171.04] (3 samples, 1.26%)[libnvidia-glvkspirv.so.535.171.04] (3 samples, 1.26%)[libnvidia-glvkspirv.so.535.171.04] (3 samples, 1.26%)[libnvidia-glvkspirv.so.535.171.04] (3 samples, 1.26%)[libnvidia-glvkspirv.so.535.171.04] (2 samples, 0.84%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%)[libnvidia-glvkspirv.so.535.171.04] (1 samples, 0.42%) \ No newline at end of file diff --git a/perf.data b/perf.data new file mode 100644 index 0000000..76b53ed Binary files /dev/null and b/perf.data differ diff --git a/perf.data.old b/perf.data.old new file mode 100644 index 0000000..d919b44 Binary files /dev/null and b/perf.data.old differ diff --git a/src/client/camera.rs b/src/client/camera.rs new file mode 100644 index 0000000..136a60c --- /dev/null +++ b/src/client/camera.rs @@ -0,0 +1,44 @@ +use nalgebra::{Point3, Rotation3, UnitVector3, Vector3}; + +const DEFAULT_ASPECT_RATIO: f32 = 16. / 9.; + +#[derive(Debug, Clone, Copy)] +pub struct Camera { + pub pos: Point3, + pub orientation: Rotation3, + pub aspect: f32, + pub scale: f32, +} + +impl Default for Camera { + fn default() -> Self { + Self { + pos: Point3::origin(), + orientation: Rotation3::identity(), + aspect: DEFAULT_ASPECT_RATIO, + scale: 1.0, + } + } +} + +impl Camera { + pub fn left(&self) -> UnitVector3 { + self.orientation * -Vector3::x_axis() + } + pub fn right(&self) -> UnitVector3 { + self.orientation * Vector3::x_axis() + } + pub fn down(&self) -> UnitVector3 { + self.orientation * -Vector3::y_axis() + } + pub fn up(&self) -> UnitVector3 { + self.orientation * Vector3::y_axis() + } + pub fn backward(&self) -> UnitVector3 { + self.orientation * -Vector3::z_axis() + } + pub fn forward(&self) -> UnitVector3 { + self.orientation * Vector3::z_axis() + } +} + diff --git a/src/client/component.rs b/src/client/component.rs new file mode 100644 index 0000000..e336776 --- /dev/null +++ b/src/client/component.rs @@ -0,0 +1,10 @@ +use bevy_ecs::bundle::Bundle; + +use crate::world::{component::{Position, Rotation}, grid::TileGrid}; + +#[derive(Bundle)] +pub struct ClientGrid { + pub grid: TileGrid, + pub position: Position, + pub rotation: Rotation, +} diff --git a/src/client/handle_input.rs b/src/client/handle_input.rs new file mode 100644 index 0000000..4626194 --- /dev/null +++ b/src/client/handle_input.rs @@ -0,0 +1,83 @@ +use std::time::Duration; + +use nalgebra::{Rotation3, Vector3}; +use winit::{keyboard::KeyCode as Key, window::CursorGrabMode}; + +use super::Client; + +impl Client<'_> { + pub fn handle_input(&mut self, dt: &Duration) { + let dt = dt.as_secs_f32(); + let Client { input, state, .. } = self; + if input.just_pressed(Key::Escape) { + if let Some(window) = &self.window { + self.grabbed_cursor = !self.grabbed_cursor; + let mode = if self.grabbed_cursor { + window.set_cursor_visible(false); + CursorGrabMode::Locked + } else { + window.set_cursor_visible(true); + CursorGrabMode::None + }; + window.set_cursor_grab(mode).expect("wah"); + } + return; + } + if self.grabbed_cursor { + let delta = input.mouse_delta; + if delta.x != 0.0 { + state.camera.orientation = + Rotation3::from_axis_angle(&state.camera.up(), delta.x * 0.003) + * state.camera.orientation; + } + if delta.y != 0.0 { + state.camera.orientation = + Rotation3::from_axis_angle(&state.camera.right(), delta.y * 0.003) + * state.camera.orientation; + } + } + let rot_dist = 1.0 * dt; + if input.pressed(Key::KeyQ) { + state.camera.orientation = + Rotation3::from_axis_angle(&state.camera.forward(), rot_dist) + * state.camera.orientation; + } + if input.pressed(Key::KeyE) { + state.camera.orientation = + Rotation3::from_axis_angle(&state.camera.forward(), -rot_dist) + * state.camera.orientation; + } + if input.scroll_delta != 0.0 { + state.camera_scroll += input.scroll_delta; + state.camera.scale = (state.camera_scroll * 0.2).exp(); + } + let move_dist = 10.0 * dt; + + if input.pressed(Key::KeyW) { + state.camera.pos += *state.camera.forward() * move_dist; + } + if input.pressed(Key::KeyA) { + state.camera.pos += *state.camera.left() * move_dist; + } + if input.pressed(Key::KeyS) { + state.camera.pos += *state.camera.backward() * move_dist; + } + if input.pressed(Key::KeyD) { + state.camera.pos += *state.camera.right() * move_dist; + } + if input.pressed(Key::Space) { + state.camera.pos += *state.camera.up() * move_dist; + } + if input.pressed(Key::ShiftLeft) { + state.camera.pos += *state.camera.down() * move_dist; + } + if input.pressed(Key::KeyZ) { + state.camera_scroll += dt * 10.0; + state.camera.scale = (state.camera_scroll * 0.1).exp(); + } + if input.pressed(Key::KeyX) { + state.camera_scroll -= dt * 10.0; + state.camera.scale = (state.camera_scroll * 0.1).exp(); + } + } +} diff --git a/src/client/input.rs b/src/client/input.rs new file mode 100644 index 0000000..f762652 --- /dev/null +++ b/src/client/input.rs @@ -0,0 +1,123 @@ +use std::collections::HashSet; + +use winit::{ + event::{DeviceEvent, ElementState, MouseButton, MouseScrollDelta, WindowEvent}, + keyboard::{KeyCode, PhysicalKey}, +}; + +use crate::util::math::{Pos2f, Vec2f}; + +pub struct Input { + pub mouse_pixel_pos: Pos2f, + pub mouse_delta: Vec2f, + + pressed: HashSet, + just_pressed: HashSet, + + mouse_pressed: HashSet, + mouse_just_pressed: HashSet, + mouse_just_released: HashSet, + + pub scroll_delta: f32, +} + +impl Input { + pub fn new() -> Self { + Self { + mouse_pixel_pos: Pos2f::origin(), + mouse_delta: Vec2f::zeros(), + pressed: HashSet::new(), + just_pressed: HashSet::new(), + mouse_pressed: HashSet::new(), + mouse_just_pressed: HashSet::new(), + mouse_just_released: HashSet::new(), + scroll_delta: 0.0, + } + } + pub fn update_device(&mut self, event: DeviceEvent) { + match event { + DeviceEvent::MouseWheel { delta } => { + self.scroll_delta = match delta { + MouseScrollDelta::LineDelta(_, v) => v, + MouseScrollDelta::PixelDelta(v) => (v.y / 2.0) as f32, + }; + } + DeviceEvent::MouseMotion { delta } => { + self.mouse_delta += Vec2f::new(delta.0 as f32, delta.1 as f32); + } + _ => (), + } + } + + pub fn update_window(&mut self, event: WindowEvent) { + match event { + WindowEvent::KeyboardInput { event, .. } => { + let code = if let PhysicalKey::Code(code) = event.physical_key { + code + } else { + return; + }; + match event.state { + ElementState::Pressed => { + self.just_pressed.insert(code); + self.pressed.insert(code); + } + ElementState::Released => { + self.pressed.remove(&code); + } + }; + } + WindowEvent::CursorLeft { .. } => { + self.pressed.clear(); + self.mouse_pressed.clear(); + } + WindowEvent::CursorMoved { position, .. } => { + self.mouse_pixel_pos = Pos2f::new(position.x as f32, position.y as f32); + } + WindowEvent::MouseInput { button, state, .. } => match state { + ElementState::Pressed => { + self.mouse_just_pressed.insert(button); + self.mouse_pressed.insert(button); + } + ElementState::Released => { + self.mouse_pressed.remove(&button); + self.mouse_just_released.insert(button); + } + }, + _ => (), + } + } + + pub fn end(&mut self) { + self.scroll_delta = 0.0; + self.mouse_delta = Vec2f::zeros(); + self.just_pressed.clear(); + self.mouse_just_pressed.clear(); + self.mouse_just_released.clear(); + } + + #[allow(dead_code)] + pub fn pressed(&self, key: KeyCode) -> bool { + self.pressed.contains(&key) + } + + #[allow(dead_code)] + pub fn just_pressed(&self, key: KeyCode) -> bool { + self.just_pressed.contains(&key) + } + + #[allow(dead_code)] + pub fn mouse_pressed(&self, button: MouseButton) -> bool { + self.mouse_pressed.contains(&button) + } + + #[allow(dead_code)] + pub fn mouse_just_pressed(&self, button: MouseButton) -> bool { + self.mouse_just_pressed.contains(&button) + } + + #[allow(dead_code)] + pub fn mouse_just_released(&self, button: MouseButton) -> bool { + self.mouse_just_released.contains(&button) + } +} diff --git a/src/client/mod.rs b/src/client/mod.rs new file mode 100644 index 0000000..cc4ef0e --- /dev/null +++ b/src/client/mod.rs @@ -0,0 +1,68 @@ +mod camera; +mod handle_input; +mod input; +mod render; +mod rsc; +mod state; +mod window; + +pub use state::*; + +use self::{input::Input, render::Renderer, rsc::FRAME_TIME, ClientState}; +use std::{ + sync::Arc, + time::{Duration, Instant}, +}; +use winit::window::Window; + +pub struct Client<'a> { + window: Option>, + renderer: Option>, + frame_time: Duration, + state: ClientState, + exit: bool, + input: Input, + target: Instant, + prev_frame: Instant, + prev_update: Instant, + grabbed_cursor: bool, +} + +impl Client<'_> { + pub fn new() -> Self { + Self { + window: None, + renderer: None, + exit: false, + frame_time: FRAME_TIME, + state: ClientState::new(), + input: Input::new(), + prev_frame: Instant::now(), + prev_update: Instant::now(), + target: Instant::now(), + grabbed_cursor: false, + } + } + + pub fn start(&mut self) {} + + pub fn update(&mut self) -> bool { + let now = Instant::now(); + let dt = now - self.prev_update; + self.prev_update = now; + + self.handle_input(&dt); + self.input.end(); + + if now >= self.target { + self.target += self.frame_time; + self.prev_frame = now; + + let renderer = self.renderer.as_mut().unwrap(); + renderer.update(&self.state); + renderer.draw(); + } + + self.exit + } +} diff --git a/src/client/render/buf.rs b/src/client/render/buf.rs new file mode 100644 index 0000000..799a85e --- /dev/null +++ b/src/client/render/buf.rs @@ -0,0 +1,115 @@ +use std::marker::PhantomData; +use wgpu::{BufferAddress, BufferUsages}; + +pub struct ArrBuf { + len: usize, + buffer: wgpu::Buffer, + label: String, + typ: PhantomData, + usage: BufferUsages, + moves: Vec, +} + +impl ArrBuf { + pub fn update( + &mut self, + device: &wgpu::Device, + encoder: &mut wgpu::CommandEncoder, + belt: &mut wgpu::util::StagingBelt, + size: usize, + updates: &[ArrBufUpdate], + ) -> bool { + let mut resized = false; + if size != self.len || !self.moves.is_empty() { + let new = Self::init_buf(device, &self.label, size, self.usage); + let cpy_len = self.len.min(size); + encoder.copy_buffer_to_buffer( + &self.buffer, + 0, + &new, + 0, + (cpy_len * std::mem::size_of::()) as u64, + ); + for m in &self.moves { + encoder.copy_buffer_to_buffer( + &self.buffer, + (m.source * std::mem::size_of::()) as BufferAddress, + &new, + (m.dest * std::mem::size_of::()) as BufferAddress, + (m.size * std::mem::size_of::()) as BufferAddress, + ); + } + resized = true; + self.moves.clear(); + self.len = size; + self.buffer = new; + } + if self.len == 0 { + return resized; + } + for update in updates { + let mut view = belt.write_buffer( + encoder, + &self.buffer, + (update.offset * std::mem::size_of::()) as BufferAddress, + unsafe { + std::num::NonZeroU64::new_unchecked( + (update.data.len() * std::mem::size_of::()) as u64, + ) + }, + device, + ); + view.copy_from_slice(bytemuck::cast_slice(&update.data)); + } + resized + } + + pub fn init(device: &wgpu::Device, label: &str, usage: BufferUsages) -> Self { + let label = &(label.to_owned() + " Buffer"); + Self { + len: 0, + buffer: Self::init_buf(device, label, 0, usage), + label: label.to_string(), + typ: PhantomData, + usage, + moves: Vec::new(), + } + } + + fn init_buf( + device: &wgpu::Device, + label: &str, + mut size: usize, + usage: BufferUsages, + ) -> wgpu::Buffer { + if usage.contains(BufferUsages::STORAGE) && size == 0 { + size = 1; + } + device.create_buffer(&wgpu::BufferDescriptor { + label: Some(label), + usage: usage | BufferUsages::COPY_DST | BufferUsages::COPY_SRC, + size: (size * std::mem::size_of::()) as u64, + mapped_at_creation: false, + }) + } + + pub fn buffer(&self) -> &wgpu::Buffer { + &self.buffer + } + + pub fn mov(&mut self, mov: BufMove) { + self.moves.push(mov); + } +} + +pub struct ArrBufUpdate { + pub offset: usize, + pub data: Vec, +} + +#[derive(Clone, Copy, Debug)] +pub struct BufMove { + pub source: usize, + pub dest: usize, + pub size: usize, +} diff --git a/src/client/render/instance.rs b/src/client/render/instance.rs new file mode 100644 index 0000000..3d1ade7 --- /dev/null +++ b/src/client/render/instance.rs @@ -0,0 +1,59 @@ +use wgpu::{BufferUsages, VertexAttribute}; + +use super::buf::{ArrBuf, ArrBufUpdate, BufMove}; + +pub struct Instances { + buf: ArrBuf, + location: u32, + attrs: [VertexAttribute; 1], +} + +impl Instances { + pub fn update( + &mut self, + device: &wgpu::Device, + encoder: &mut wgpu::CommandEncoder, + belt: &mut wgpu::util::StagingBelt, + size: usize, + updates: &[ArrBufUpdate], + ) -> bool { + self.buf.update(device, encoder, belt, size, updates) + } + + pub fn init( + device: &wgpu::Device, + label: &str, + location: u32, + format: wgpu::VertexFormat, + ) -> Self { + Self { + buf: ArrBuf::init( + device, + &(label.to_owned() + " Instance"), + BufferUsages::VERTEX, + ), + location, + attrs: [wgpu::VertexAttribute { + format, + offset: 0, + shader_location: location, + }], + } + } + + pub fn set_in<'a>(&'a self, render_pass: &mut wgpu::RenderPass<'a>) { + render_pass.set_vertex_buffer(self.location, self.buf.buffer().slice(..)); + } + + pub fn desc(&self) -> wgpu::VertexBufferLayout { + wgpu::VertexBufferLayout { + array_stride: std::mem::size_of::() as wgpu::BufferAddress, + step_mode: wgpu::VertexStepMode::Instance, + attributes: &self.attrs, + } + } + + pub fn mov(&mut self, mov: BufMove) { + self.buf.mov(mov); + } +} diff --git a/src/client/render/mod.rs b/src/client/render/mod.rs new file mode 100644 index 0000000..6e0be11 --- /dev/null +++ b/src/client/render/mod.rs @@ -0,0 +1,8 @@ +mod buf; +mod instance; +mod renderer; +mod storage; +pub mod voxel; +mod uniform; + +pub use renderer::*; diff --git a/src/client/render/renderer.rs b/src/client/render/renderer.rs new file mode 100644 index 0000000..6a12c2f --- /dev/null +++ b/src/client/render/renderer.rs @@ -0,0 +1,171 @@ +use std::sync::Arc; + +use super::voxel::VoxelPipeline; +use crate::client::{rsc::CLEAR_COLOR, ClientState}; +use winit::{ + dpi::PhysicalSize, + window::{Fullscreen, Window}, +}; + +pub struct Renderer<'a> { + size: PhysicalSize, + surface: wgpu::Surface<'a>, + device: wgpu::Device, + queue: wgpu::Queue, + config: wgpu::SurfaceConfiguration, + adapter: wgpu::Adapter, + encoder: Option, + staging_belt: wgpu::util::StagingBelt, + voxel_pipeline: VoxelPipeline, +} + +impl<'a> Renderer<'a> { + pub fn new(window: Arc, fullscreen: bool) -> Self { + if fullscreen { + window.set_fullscreen(Some(Fullscreen::Borderless(None))); + } + + let size = window.inner_size(); + + let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { + backends: wgpu::Backends::PRIMARY, + ..Default::default() + }); + + let surface = instance + .create_surface(window) + .expect("Could not create window surface!"); + + let adapter = pollster::block_on(instance.request_adapter(&wgpu::RequestAdapterOptions { + power_preference: wgpu::PowerPreference::default(), + compatible_surface: Some(&surface), + force_fallback_adapter: false, + })) + .expect("Could not get adapter!"); + + let (device, queue) = pollster::block_on(adapter.request_device( + &wgpu::DeviceDescriptor { + label: None, + required_features: wgpu::Features::empty(), + required_limits: wgpu::Limits::default(), + }, + None, // Trace path + )) + .expect("Could not get device!"); + + // TODO: use a logger + let info = adapter.get_info(); + println!("Adapter: {}", info.name); + println!("Backend: {:?}", info.backend); + + let surface_caps = surface.get_capabilities(&adapter); + // Set surface format to srbg + let surface_format = surface_caps + .formats + .iter() + .copied() + .find(|f| f.is_srgb()) + .unwrap_or(surface_caps.formats[0]); + + // create surface config + let config = wgpu::SurfaceConfiguration { + usage: wgpu::TextureUsages::RENDER_ATTACHMENT, + format: surface_format, + width: size.width, + height: size.height, + present_mode: surface_caps.present_modes[0], + alpha_mode: surface_caps.alpha_modes[0], + view_formats: vec![], + desired_maximum_frame_latency: 2, + }; + + surface.configure(&device, &config); + // not exactly sure what this number should be, + // doesn't affect performance much and depends on "normal" zoom + let staging_belt = wgpu::util::StagingBelt::new(4096 * 4); + + Self { + size, + voxel_pipeline: VoxelPipeline::new(&device, &config.format), + encoder: None, + staging_belt, + surface, + device, + adapter, + config, + queue, + } + } + + fn create_encoder(&mut self) -> wgpu::CommandEncoder { + self.device + .create_command_encoder(&wgpu::CommandEncoderDescriptor { + label: Some("Render Encoder"), + }) + } + + pub fn draw(&mut self) { + let output = self.surface.get_current_texture().unwrap(); + let view = output + .texture + .create_view(&wgpu::TextureViewDescriptor::default()); + let mut encoder = self.encoder.take().unwrap_or(self.create_encoder()); + { + let render_pass = &mut encoder.begin_render_pass(&wgpu::RenderPassDescriptor { + label: Some("Render Pass"), + color_attachments: &[Some(wgpu::RenderPassColorAttachment { + view: &view, + resolve_target: None, + ops: wgpu::Operations { + load: wgpu::LoadOp::Clear(CLEAR_COLOR), + store: wgpu::StoreOp::Store, + }, + })], + depth_stencil_attachment: None, + timestamp_writes: None, + occlusion_query_set: None, + }); + self.voxel_pipeline.draw(render_pass); + } + + self.staging_belt.finish(); + self.queue.submit(std::iter::once(encoder.finish())); + output.present(); + self.staging_belt.recall(); + } + + pub fn update(&mut self, state: &ClientState) { + let mut encoder = self + .device + .create_command_encoder(&wgpu::CommandEncoderDescriptor { + label: Some("Render Encoder"), + }); + self.voxel_pipeline.update( + &self.device, + &mut encoder, + &mut self.staging_belt, + &mut self.queue, + &RenderUpdateData { + state, + size: &self.size, + }, + ); + self.encoder = Some(encoder); + } + + pub fn resize(&mut self, size: PhysicalSize) { + self.size = size; + self.config.width = size.width; + self.config.height = size.height; + self.surface.configure(&self.device, &self.config); + } + + pub fn size(&self) -> &PhysicalSize { + &self.size + } +} + +pub struct RenderUpdateData<'a> { + pub state: &'a ClientState, + pub size: &'a PhysicalSize, +} diff --git a/src/client/render/storage.rs b/src/client/render/storage.rs new file mode 100644 index 0000000..891bab7 --- /dev/null +++ b/src/client/render/storage.rs @@ -0,0 +1,55 @@ +use super::buf::{ArrBuf, ArrBufUpdate, BufMove}; +use wgpu::BufferUsages; + +pub struct Storage { + binding: u32, + buf: ArrBuf, +} + +impl Storage { + pub fn init(device: &wgpu::Device, label: &str, binding: u32) -> Self { + Self { + buf: ArrBuf::init( + device, + &(label.to_owned() + " Storage"), + BufferUsages::STORAGE, + ), + binding, + } + } +} + +impl Storage { + pub fn bind_group_layout_entry(&self) -> wgpu::BindGroupLayoutEntry { + wgpu::BindGroupLayoutEntry { + binding: self.binding, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Buffer { + ty: wgpu::BufferBindingType::Storage { read_only: true }, + has_dynamic_offset: false, + min_binding_size: None, + }, + count: None, + } + } + pub fn bind_group_entry(&self) -> wgpu::BindGroupEntry { + return wgpu::BindGroupEntry { + binding: self.binding, + resource: self.buf.buffer().as_entire_binding(), + }; + } + pub fn update( + &mut self, + device: &wgpu::Device, + encoder: &mut wgpu::CommandEncoder, + belt: &mut wgpu::util::StagingBelt, + size: usize, + updates: &[ArrBufUpdate], + ) -> bool { + self.buf.update(device, encoder, belt, size, updates) + } + + pub fn mov(&mut self, mov: BufMove) { + self.buf.mov(mov); + } +} diff --git a/src/client/render/uniform.rs b/src/client/render/uniform.rs new file mode 100644 index 0000000..7bc4836 --- /dev/null +++ b/src/client/render/uniform.rs @@ -0,0 +1,72 @@ +use wgpu::util::DeviceExt; + +use super::RenderUpdateData; + +pub trait UniformData { + fn update(&mut self, data: &RenderUpdateData) -> bool; +} + +pub struct Uniform { + data: T, + buffer: wgpu::Buffer, + binding: u32, +} + +impl Uniform { + pub fn init(device: &wgpu::Device, name: &str, binding: u32) -> Self { + let data = T::default(); + Self { + data, + buffer: device.create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: Some(&(name.to_owned() + " Uniform Buf")), + contents: bytemuck::cast_slice(&[data]), + usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, + }), + binding, + } + } +} + +impl Uniform { + pub fn bind_group_layout_entry(&self) -> wgpu::BindGroupLayoutEntry { + wgpu::BindGroupLayoutEntry { + binding: self.binding, + visibility: wgpu::ShaderStages::VERTEX | wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Buffer { + ty: wgpu::BufferBindingType::Uniform, + has_dynamic_offset: false, + min_binding_size: None, + }, + count: None, + } + } + pub fn bind_group_entry(&self) -> wgpu::BindGroupEntry { + return wgpu::BindGroupEntry { + binding: self.binding, + resource: self.buffer.as_entire_binding(), + }; + } + pub fn update( + &mut self, + device: &wgpu::Device, + encoder: &mut wgpu::CommandEncoder, + belt: &mut wgpu::util::StagingBelt, + update_data: &RenderUpdateData, + ) { + if self.data.update(update_data) { + let slice = &[self.data]; + let mut view = belt.write_buffer( + encoder, + &self.buffer, + 0, + unsafe { + std::num::NonZeroU64::new_unchecked( + (slice.len() * std::mem::size_of::()) as u64, + ) + }, + device, + ); + view.copy_from_slice(bytemuck::cast_slice(slice)); + } + } +} diff --git a/src/client/render/voxel/color.rs b/src/client/render/voxel/color.rs new file mode 100644 index 0000000..1785cb8 --- /dev/null +++ b/src/client/render/voxel/color.rs @@ -0,0 +1,35 @@ +#[repr(C)] +#[derive(Debug, Clone, Copy, PartialEq, bytemuck::Zeroable, bytemuck::Pod)] +pub struct VoxelColor { + pub r: u8, + pub g: u8, + pub b: u8, + pub a: u8, +} + +impl VoxelColor { + pub fn none() -> Self { + Self { + r: 0, + g: 0, + b: 0, + a: 0, + } + } + pub fn black() -> Self { + Self { + r: 0, + g: 0, + b: 0, + a: 255, + } + } + pub fn white() -> Self { + Self { + r: 255, + g: 255, + b: 255, + a: 255, + } + } +} diff --git a/src/client/render/voxel/grid.rs b/src/client/render/voxel/grid.rs new file mode 100644 index 0000000..95cd870 --- /dev/null +++ b/src/client/render/voxel/grid.rs @@ -0,0 +1,24 @@ +use nalgebra::Matrix4x3; + +// this has cost me more than a couple of hours trying to figure out alignment :skull: +// putting transform at the beginning so I don't have to deal with its alignment +// I should probably look into encase (crate) +#[repr(C, align(16))] +#[derive(Clone, Copy, PartialEq, bytemuck::Zeroable)] +pub struct GridInfo { + pub transform: Matrix4x3, + pub width: u32, + pub height: u32, +} + +unsafe impl bytemuck::Pod for GridInfo {} + +impl Default for GridInfo { + fn default() -> Self { + Self { + transform: Matrix4x3::identity(), + width: 0, + height: 0, + } + } +} diff --git a/src/client/render/voxel/mod.rs b/src/client/render/voxel/mod.rs new file mode 100644 index 0000000..0d46023 --- /dev/null +++ b/src/client/render/voxel/mod.rs @@ -0,0 +1,6 @@ +mod grid; +mod view; +mod pipeline; +mod color; + +pub use pipeline::*; diff --git a/src/client/render/voxel/pipeline.rs b/src/client/render/voxel/pipeline.rs new file mode 100644 index 0000000..bc2e20d --- /dev/null +++ b/src/client/render/voxel/pipeline.rs @@ -0,0 +1,208 @@ +use super::{color::VoxelColor, view::View}; +use crate::client::render::{ + buf::ArrBufUpdate, storage::Storage, uniform::Uniform, RenderUpdateData, +}; + +pub struct VoxelPipeline { + pipeline: wgpu::RenderPipeline, + view: Uniform, + bind_group_layout: wgpu::BindGroupLayout, + bind_group: wgpu::BindGroup, + texture: wgpu::Texture, + voxels: Storage, + arst: bool, +} + +const WIDTH: u32 = 300; +const HEIGHT: u32 = 300; + +impl VoxelPipeline { + pub fn new(device: &wgpu::Device, format: &wgpu::TextureFormat) -> Self { + // shaders + let shader = device.create_shader_module(wgpu::ShaderModuleDescriptor { + label: Some("Tile Shader"), + source: wgpu::ShaderSource::Wgsl(include_str!("shader.wgsl").into()), + }); + + let view = Uniform::::init(device, "View", 0); + let texture_size = wgpu::Extent3d { + width: WIDTH, + height: HEIGHT, + depth_or_array_layers: 1, + }; + let texture = device.create_texture(&wgpu::TextureDescriptor { + size: texture_size, + mip_level_count: 1, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + format: wgpu::TextureFormat::Rgba8UnormSrgb, + usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST, + label: Some("diffuse_texture"), + view_formats: &[], + }); + let voxels = Storage::init(device, "voxels", 3); + + let diffuse_texture_view = texture.create_view(&wgpu::TextureViewDescriptor::default()); + let diffuse_sampler = device.create_sampler(&wgpu::SamplerDescriptor { + address_mode_u: wgpu::AddressMode::ClampToEdge, + address_mode_v: wgpu::AddressMode::ClampToEdge, + address_mode_w: wgpu::AddressMode::ClampToEdge, + mag_filter: wgpu::FilterMode::Linear, + min_filter: wgpu::FilterMode::Nearest, + mipmap_filter: wgpu::FilterMode::Nearest, + ..Default::default() + }); + + // bind groups + let bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { + entries: &[ + view.bind_group_layout_entry(), + wgpu::BindGroupLayoutEntry { + binding: 1, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Texture { + multisampled: false, + view_dimension: wgpu::TextureViewDimension::D2, + sample_type: wgpu::TextureSampleType::Float { filterable: true }, + }, + count: None, + }, + wgpu::BindGroupLayoutEntry { + binding: 2, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Sampler(wgpu::SamplerBindingType::Filtering), + count: None, + }, + voxels.bind_group_layout_entry(), + ], + label: Some("tile_bind_group_layout"), + }); + + let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { + layout: &bind_group_layout, + entries: &[ + view.bind_group_entry(), + wgpu::BindGroupEntry { + binding: 1, + resource: wgpu::BindingResource::TextureView(&diffuse_texture_view), + }, + wgpu::BindGroupEntry { + binding: 2, + resource: wgpu::BindingResource::Sampler(&diffuse_sampler), + }, + voxels.bind_group_entry(), + ], + label: Some("tile_bind_group"), + }); + + // pipeline + let render_pipeline_layout = + device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { + label: Some("Tile Pipeline Layout"), + bind_group_layouts: &[&bind_group_layout], + push_constant_ranges: &[], + }); + + let render_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { + label: Some("Voxel Pipeline"), + layout: Some(&render_pipeline_layout), + vertex: wgpu::VertexState { + module: &shader, + entry_point: "vs_main", + buffers: &[], + compilation_options: wgpu::PipelineCompilationOptions::default(), + }, + fragment: Some(wgpu::FragmentState { + module: &shader, + entry_point: "fs_main", + targets: &[Some(wgpu::ColorTargetState { + format: *format, + blend: Some(wgpu::BlendState::REPLACE), + write_mask: wgpu::ColorWrites::ALL, + })], + compilation_options: wgpu::PipelineCompilationOptions::default(), + }), + primitive: wgpu::PrimitiveState { + topology: wgpu::PrimitiveTopology::TriangleStrip, + strip_index_format: None, + front_face: wgpu::FrontFace::Ccw, + cull_mode: None, + polygon_mode: wgpu::PolygonMode::Fill, + unclipped_depth: false, + conservative: false, + }, + depth_stencil: None, + multisample: wgpu::MultisampleState { + count: 1, + mask: !0, + alpha_to_coverage_enabled: true, + }, + multiview: None, + }); + + Self { + pipeline: render_pipeline, + view, + bind_group, + bind_group_layout, + texture, + voxels, + arst: false, + } + } + + pub fn update( + &mut self, + device: &wgpu::Device, + encoder: &mut wgpu::CommandEncoder, + belt: &mut wgpu::util::StagingBelt, + queue: &mut wgpu::Queue, + update_data: &RenderUpdateData, + ) { + let texture_size = wgpu::Extent3d { + width: WIDTH, + height: HEIGHT, + depth_or_array_layers: 1, + }; + if !self.arst { + queue.write_texture( + // Tells wgpu where to copy the pixel data + wgpu::ImageCopyTexture { + texture: &self.texture, + mip_level: 0, + origin: wgpu::Origin3d::ZERO, + aspect: wgpu::TextureAspect::All, + }, + // The actual pixel data + &[0xff, 0x00, 0xff, 0xff].repeat((WIDTH * HEIGHT) as usize), + // The layout of the texture + wgpu::ImageDataLayout { + offset: 0, + bytes_per_row: Some(4 * WIDTH), + rows_per_image: Some(HEIGHT), + }, + texture_size, + ); + let l = 10; + let size = l * l * l; + let mut data: Vec<_> = vec![VoxelColor::none(); size]; + data[0] = VoxelColor::white(); + data[size - 1] = VoxelColor::white(); + self.voxels.update( + device, + encoder, + belt, + data.len(), + &[ArrBufUpdate { offset: 0, data }], + ); + self.arst = true; + } + self.view.update(device, encoder, belt, update_data); + } + + pub fn draw<'a>(&'a self, render_pass: &mut wgpu::RenderPass<'a>) { + render_pass.set_pipeline(&self.pipeline); + render_pass.set_bind_group(0, &self.bind_group, &[]); + render_pass.draw(0..4, 0..1); + } +} diff --git a/src/client/render/voxel/shader.wgsl b/src/client/render/voxel/shader.wgsl new file mode 100644 index 0000000..34dcd56 --- /dev/null +++ b/src/client/render/voxel/shader.wgsl @@ -0,0 +1,81 @@ +// Vertex shader + +struct VertexOutput { + @builtin(position) clip_position: vec4, + @location(0) tex_coords: vec2, +}; + +struct View { + width: u32, + height: u32, + zoom: f32, + padding: u32, + transform: mat4x4, +}; + +@group(0) @binding(0) +var view: View; +@group(0) @binding(1) +var t_diffuse: texture_2d; +@group(0) @binding(2) +var s_diffuse: sampler; +@group(0) @binding(3) +var voxels: array; + +@vertex +fn vs_main( + @builtin(vertex_index) vi: u32, + @builtin(instance_index) ii: u32, +) -> VertexOutput { + var out: VertexOutput; + + var pos = vec2( + f32(vi % 2u) * 2.0 - 1.0, + f32(vi / 2u) * 2.0 - 1.0, + ); + out.clip_position = vec4(pos.x, pos.y, 0.0, 1.0); + out.tex_coords = pos; + return out; +} + +// Fragment shader + +@fragment +fn fs_main( + in: VertexOutput, +) -> @location(0) vec4 { + let aspect = f32(view.height) / f32(view.width); + var pixel_pos = vec3(in.clip_position.x / f32(view.width), 1.0 - in.clip_position.y / f32(view.height), 1.0); + pixel_pos.x -= 0.5; + pixel_pos.y -= 0.5; + pixel_pos.x *= 2.0; + pixel_pos.y *= 2.0; + pixel_pos.y *= aspect; + + pixel_pos = (view.transform * vec4(pixel_pos, 1.0)).xyz; + let origin = (view.transform * vec4(0.0, 0.0, 0.0, 1.0)).xyz; + let dir = normalize(pixel_pos - origin); + + + + let voxel_pos = vec3(-5.0, -5.0, 30.0); + var t = 0; + for(t = 0; t < 1000; t += 1) { + let pos = pixel_pos + f32(t) * 0.1 * dir - voxel_pos; + let rel_coords = vec3(pos.xyz); + if rel_coords.x < 0 || rel_coords.y < 0 || rel_coords.z < 0 || rel_coords.x > 10 || rel_coords.y > 10 || rel_coords.z > 10 { + continue; + } else { + let i = rel_coords.x + rel_coords.y * 10 + rel_coords.z * 100; + let color = unpack4x8unorm(voxels[i]); + if voxels[i] != 0 { + return vec4(1.0); + } else { + let pos = vec3(rel_coords); + return vec4(pos.x / 10.0, pos.y / 10.0, pos.z / 10.0, 1.0); + } + } + } + + return vec4(0.0, 0.0, 0.0, 1.0); +} diff --git a/src/client/render/voxel/view.rs b/src/client/render/voxel/view.rs new file mode 100644 index 0000000..0e0667a --- /dev/null +++ b/src/client/render/voxel/view.rs @@ -0,0 +1,50 @@ +use nalgebra::{Transform3, Translation3}; + +use crate::client::render::uniform::UniformData; + +#[repr(C, align(16))] +#[derive(Clone, Copy, PartialEq, bytemuck::Zeroable)] +pub struct View { + pub width: u32, + pub height: u32, + pub zoom: f32, + pub padding: u32, + pub transform: Transform3, +} + +unsafe impl bytemuck::Pod for View {} + +impl Default for View { + fn default() -> Self { + Self { + width: 1, + height: 1, + zoom: 1.0, + padding: 0, + transform: Transform3::identity(), + } + } +} + +impl UniformData for View { + fn update(&mut self, data: &crate::client::render::RenderUpdateData) -> bool { + let camera = data.state.camera; + let new = Transform3::identity() * Translation3::from(camera.pos) * camera.orientation; + if new == self.transform + && data.size.width == self.width + && data.size.height == self.height + && camera.scale == self.zoom + { + false + } else { + *self = Self { + width: data.size.width, + height: data.size.height, + zoom: camera.scale, + padding: 0, + transform: new, + }; + true + } + } +} diff --git a/src/client/rsc.rs b/src/client/rsc.rs new file mode 100644 index 0000000..6ac9319 --- /dev/null +++ b/src/client/rsc.rs @@ -0,0 +1,12 @@ +use std::time::Duration; + +pub const FPS: u32 = 30; +pub const FRAME_TIME: Duration = Duration::from_millis(1000 / FPS as u64); + +pub const CLEAR_COLOR: wgpu::Color = wgpu::Color { + r: 0.1, + g: 0.1, + b: 0.1, + a: 1.0, +}; + diff --git a/src/client/state.rs b/src/client/state.rs new file mode 100644 index 0000000..c3558de --- /dev/null +++ b/src/client/state.rs @@ -0,0 +1,15 @@ +use super::camera::Camera; + +pub struct ClientState { + pub camera: Camera, + pub camera_scroll: f32, +} + +impl ClientState { + pub fn new() -> Self { + Self { + camera: Camera::default(), + camera_scroll: 0.0, + } + } +} diff --git a/src/client/window.rs b/src/client/window.rs new file mode 100644 index 0000000..bffbac1 --- /dev/null +++ b/src/client/window.rs @@ -0,0 +1,55 @@ +use std::sync::Arc; + +use winit::{ + application::ApplicationHandler, event::WindowEvent, event_loop::ControlFlow, + window::WindowAttributes, +}; + +use super::{render::Renderer, Client}; + +impl ApplicationHandler for Client<'_> { + fn resumed(&mut self, event_loop: &winit::event_loop::ActiveEventLoop) { + if self.window.is_none() { + let window = Arc::new( + event_loop + .create_window(WindowAttributes::default()) + .expect("Failed to create window"), + ); + self.renderer = Some(Renderer::new(window.clone(), false)); + self.window = Some(window); + self.start(); + } + event_loop.set_control_flow(ControlFlow::Poll); + } + + fn window_event( + &mut self, + _event_loop: &winit::event_loop::ActiveEventLoop, + _window_id: winit::window::WindowId, + event: WindowEvent, + ) { + let renderer = self.renderer.as_mut().unwrap(); + + match event { + WindowEvent::CloseRequested => self.exit = true, + WindowEvent::Resized(size) => renderer.resize(size), + WindowEvent::RedrawRequested => renderer.draw(), + _ => self.input.update_window(event), + } + } + + fn device_event( + &mut self, + _event_loop: &winit::event_loop::ActiveEventLoop, + _device_id: winit::event::DeviceId, + event: winit::event::DeviceEvent, + ) { + self.input.update_device(event); + } + + fn about_to_wait(&mut self, event_loop: &winit::event_loop::ActiveEventLoop) { + if self.update() { + event_loop.exit(); + } + } +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..ab7a09a --- /dev/null +++ b/src/main.rs @@ -0,0 +1,12 @@ +use client::Client; +use winit::event_loop::EventLoop; + +mod client; +mod util; + +fn main() { + let event_loop = EventLoop::new().expect("Failed to create event loop"); + event_loop + .run_app(&mut Client::new()) + .expect("Failed to run event loop"); +} diff --git a/src/util/math.rs b/src/util/math.rs new file mode 100644 index 0000000..3a4839e --- /dev/null +++ b/src/util/math.rs @@ -0,0 +1,29 @@ +use nalgebra::{Matrix4x3, Point2, Projective2, Transform2, Vector2, Vector3}; + +pub type Vec2f = Vector2; +pub type Vec3f = Vector3; +pub type Pos2f = Point2; +pub type Vec2us = Vector2; + +// hahaha.. HAHAHAAAAAAAAAAA... it's over now, surely I'll remember this lesson +pub trait Bruh { + fn gpu_mat3(&self) -> Matrix4x3; +} + +impl Bruh for Transform2 { + fn gpu_mat3(&self) -> Matrix4x3 { + let mut a = Matrix4x3::identity(); + // I LOVE GPU DATA STRUCTURE ALIGNMENT (it makes sense tho) + a.view_mut((0,0), (3,3)).copy_from(self.matrix()); + a + } +} + +impl Bruh for Projective2 { + fn gpu_mat3(&self) -> Matrix4x3 { + let mut a = Matrix4x3::identity(); + // I LOVE GPU DATA STRUCTURE ALIGNMENT (it makes sense tho) + a.view_mut((0,0), (3,3)).copy_from(self.matrix()); + a + } +} diff --git a/src/util/mod.rs b/src/util/mod.rs new file mode 100644 index 0000000..884d869 --- /dev/null +++ b/src/util/mod.rs @@ -0,0 +1,2 @@ +pub mod swap_buf; +pub mod math; diff --git a/src/util/swap_buf.rs b/src/util/swap_buf.rs new file mode 100644 index 0000000..f909a0f --- /dev/null +++ b/src/util/swap_buf.rs @@ -0,0 +1,43 @@ +use std::ops::{Deref, DerefMut, Add}; + +pub struct SwapBuffer { + read: Vec, + write: Vec, + modify: Vec, +} + +impl> SwapBuffer { + pub fn new(size: usize) -> Self { + Self { + read: vec![T::default(); size], + write: vec![T::default(); size], + modify: vec![T::default(); size], + } + } + + pub fn swap(&mut self) { + std::mem::swap(&mut self.read, &mut self.write); + for (m, r) in self.modify.iter_mut().zip(&mut self.read) { + *r = *r + *m; + *m = T::default(); + } + } + + pub fn rwm(&mut self) -> (&mut Vec, &mut Vec, &mut Vec) { + (&mut self.read, &mut self.write, &mut self.modify) + } +} + +impl Deref for SwapBuffer { + type Target = Vec; + fn deref(&self) -> &Self::Target { + &self.read + } +} + +impl DerefMut for SwapBuffer { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.read + } +} + diff --git a/src/util/tracked_grid.rs b/src/util/tracked_grid.rs new file mode 100644 index 0000000..b090840 --- /dev/null +++ b/src/util/tracked_grid.rs @@ -0,0 +1,81 @@ +use crate::util::math::Vec2us; +use bevy_ecs::component::Component; +use nalgebra::{DMatrix, DimRange, Dyn}; +use std::ops::{Deref, Range}; + +pub type GridRegion = (Range, Range); +pub type GridView<'a, T> = nalgebra::Matrix< + T, + Dyn, + Dyn, + nalgebra::ViewStorageMut<'a, T, Dyn, Dyn, nalgebra::Const<1>, Dyn>, +>; + +#[derive(Clone, Component)] +pub struct TrackedGrid { + data: DMatrix, + changes: Vec, +} + +impl TrackedGrid { + pub fn new(data: DMatrix) -> Self { + Self { + data, + changes: Vec::new(), + } + } + pub fn width(&self) -> usize { + self.data.ncols() + } + pub fn height(&self) -> usize { + self.data.nrows() + } + pub fn view_range_mut, ColRange: DimRange>( + &mut self, + x_range: ColRange, + y_range: RowRange, + ) -> GridView<'_, T> { + let shape = self.data.shape(); + let r = Dyn(shape.0); + let rows = y_range.begin(r)..y_range.end(r); + let c = Dyn(shape.1); + let cols = x_range.begin(c)..x_range.end(c); + self.changes.push((rows.clone(), cols.clone())); + self.data.view_range_mut(rows, cols) + } + pub fn take_changes(&mut self) -> Vec { + std::mem::replace(&mut self.changes, Vec::new()) + } + pub fn change(&mut self, index: Vec2us) -> Option<&mut T> { + if let Some(d) = self.data.get_mut((index.y, index.x)) { + self.changes + .push((index.y..index.y + 1, index.x..index.x + 1)); + Some(d) + } else { + None + } + } +} + +impl Deref for TrackedGrid { + type Target = DMatrix; + fn deref(&self) -> &Self::Target { + &self.data + } +} + +// pub fn tile_pos(&self, pos: Pos2f) -> Option { +// let mut pos = self.orientation.inverse() * pos; +// pos += Vec2f::new( +// (self.size.x / 2) as f32 + 0.5, +// (self.size.y / 2) as f32 + 0.5, +// ); +// if pos.x < 0.0 || pos.y < 0.0 { +// return None; +// } +// let truncated = Vec2us::new(pos.x as usize, pos.y as usize); +// if truncated.x > self.size.x - 1 || truncated.y > self.size.y - 1 { +// return None; +// } +// Some(truncated) +// }