From bad9c5d87200245a9c2bc2621ad31e63d76a5ae6 Mon Sep 17 00:00:00 2001 From: Able Date: Sat, 26 Mar 2022 06:34:58 -0500 Subject: [PATCH] tossed together a very minimal graphics toy --- Cargo.lock | 1458 ++++++++++++++++++++++++++++++++++++++++++++- Cargo.toml | 7 +- assets/opengl.png | Bin 0 -> 72249 bytes assets/shade.frag | 10 + assets/shade.vert | 12 + rust-toolchain | 1 + src/config.rs | 5 + src/main.rs | 211 ++++--- src/platform.rs | 54 -- src/textures.rs | 1 + src/voxel.rs | 9 + 11 files changed, 1595 insertions(+), 173 deletions(-) create mode 100644 assets/opengl.png create mode 100644 assets/shade.frag create mode 100644 assets/shade.vert create mode 100644 rust-toolchain create mode 100644 src/config.rs delete mode 100644 src/platform.rs create mode 100644 src/textures.rs diff --git a/Cargo.lock b/Cargo.lock index db786fc..5acee9e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3,53 +3,297 @@ version = 3 [[package]] -name = "bgfx-rs" -version = "0.7.0" +name = "addr2line" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d70c350be673dbbe40eb048e6542e1f20b3f2a04462a248d078b76dd2281fd" +checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" dependencies = [ - "bgfx-sys", - "bitflags", - "cfixed-string", + "gimli", ] [[package]] -name = "bgfx-sys" -version = "0.5.0" +name = "adler" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2947cb050bee39d214c166ba8931b0ee3b5fb4d44ac0aebb3b05637d421ef" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "adler32" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" + +[[package]] +name = "android_glue" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "000444226fcff248f2bc4c7625be32c63caccfecc2723a2b9f78a7487a49c407" + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "backtrace" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e121dee8023ce33ab248d9ce1493df03c3b38a659b240096fcbd7048ff9c31f" dependencies = [ + "addr2line", "cc", + "cfg-if 1.0.0", + "libc", + "miniz_oxide 0.4.4", + "object", + "rustc-demangle", ] +[[package]] +name = "bit_field" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcb6dd1c2376d2e096796e234a70e17e94cc2d5d54ff8ce42b28cef1d0d359a4" + [[package]] name = "bitflags" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "bumpalo" +version = "3.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" + +[[package]] +name = "bytemuck" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e851ca7c24871e7336801608a4797d7376545b6928a10d32d75685687141ead" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "calloop" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf2eec61efe56aa1e813f5126959296933cf0700030e4314786c48779a66ab82" +dependencies = [ + "log", + "nix", +] + [[package]] name = "cc" version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" + +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cgl" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" dependencies = [ - "jobserver", + "libc", ] [[package]] -name = "cfixed-string" -version = "1.0.0" +name = "cocoa" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9234271d550b2b3898521602c86dbea82bd97ae31c22fbc5969474a4934e0ac" +checksum = "6f63902e9223530efb4e26ccd0cf55ec30d592d3b42e21a28defc42a9586e832" +dependencies = [ + "bitflags", + "block", + "cocoa-foundation", + "core-foundation 0.9.3", + "core-graphics 0.22.3", + "foreign-types", + "libc", + "objc", +] [[package]] -name = "cmake" -version = "0.1.48" +name = "cocoa-foundation" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8ad8cef104ac57b68b89df3208164d228503abbdce70f6880ffa3d970e7443a" +checksum = "7ade49b65d560ca58c403a479bb396592b155c0185eada742ee323d1d68d6318" dependencies = [ - "cc", + "bitflags", + "block", + "core-foundation 0.9.3", + "core-graphics-types", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "core-foundation" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171" +dependencies = [ + "core-foundation-sys 0.7.0", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys 0.8.3", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" + +[[package]] +name = "core-foundation-sys" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" + +[[package]] +name = "core-graphics" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3889374e6ea6ab25dba90bb5d96202f61108058361f6dc72e8b03e6f8bbe923" +dependencies = [ + "bitflags", + "core-foundation 0.7.0", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +dependencies = [ + "bitflags", + "core-foundation 0.9.3", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b" +dependencies = [ + "bitflags", + "core-foundation 0.9.3", + "foreign-types", + "libc", +] + +[[package]] +name = "core-video-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34ecad23610ad9757664d644e369246edde1803fcb43ed72876565098a5d3828" +dependencies = [ + "cfg-if 0.1.10", + "core-foundation-sys 0.7.0", + "core-graphics 0.19.2", + "libc", + "objc", +] + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aaa7bd5fb665c6864b5f963dd9097905c54125909c7aa94c9e18507cdbe6c53" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1145cf131a2c6ba0615079ab6a638f7e1973ac9c2634fcbeaaad6114246efe8c" +dependencies = [ + "autocfg", + "cfg-if 1.0.0", + "crossbeam-utils", + "lazy_static", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38" +dependencies = [ + "cfg-if 1.0.0", + "lazy_static", ] [[package]] @@ -59,42 +303,422 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" [[package]] -name = "glfw" -version = "0.44.0" +name = "darling" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "103c29fa9d30c5371187895a10948d4f54b4111450328b4e439133d88243c5e3" +checksum = "d0d720b8683f8dd83c65155f0530560cba68cd2bf395f6513a483caee57ff7f4" dependencies = [ - "bitflags", - "glfw-sys", + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a340f241d2ceed1deb47ae36c4144b2707ec7dd0b649f894cb39bb595986324" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72c41b3b7352feb3211a0d743dc5700a4e3b60f51bd2b368892d1e0f9a95f44b" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "deflate" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c86f7e25f518f4b81808a2cf1c50996a61f5c2eb394b2393bd87f2a4780a432f" +dependencies = [ + "adler32", +] + +[[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac1b7517328c04c2aa68422fc60a41b92208182142ed04a25879c26c8f878794" +dependencies = [ + "libloading", +] + +[[package]] +name = "downcast-rs" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" + +[[package]] +name = "either" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" + +[[package]] +name = "exr" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4badb9489a465cb2c555af1f00f0bfd8cecd6fc12ac11da9d5b40c5dd5f0200" +dependencies = [ + "bit_field", + "deflate", + "flume", + "half", + "inflate", + "lebe", + "smallvec", + "threadpool", +] + +[[package]] +name = "flate2" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" +dependencies = [ + "cfg-if 1.0.0", + "crc32fast", + "libc", + "miniz_oxide 0.4.4", +] + +[[package]] +name = "flume" +version = "0.10.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843c03199d0c0ca54bc1ea90ac0d507274c28abcc4f691ae8b4eaa375087c76a" +dependencies = [ + "futures-core", + "futures-sink", + "nanorand", + "pin-project", + "spin", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "futures-core" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" + +[[package]] +name = "futures-sink" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" + +[[package]] +name = "getrandom" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d39cd93900197114fa1fcb7ae84ca742095eed9442088988ae74fa744e930e77" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "gif" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3a7187e78088aead22ceedeee99779455b23fc231fe13ec443f99bb71694e5b" +dependencies = [ + "color_quant", + "weezl", +] + +[[package]] +name = "gimli" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" + +[[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 = "glium" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ab4f09b43d8ee427a700cb9ed3b20e0e858d62a509edded1a98ca5707d68e19" +dependencies = [ + "backtrace", + "fnv", + "gl_generator", + "glutin", + "lazy_static", + "memoffset", + "smallvec", + "takeable-option", +] + +[[package]] +name = "glutin" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00ea9dbe544bc8a657c4c4a798c2d16cd01b549820e47657297549d28371f6d2" +dependencies = [ + "android_glue", + "cgl", + "cocoa", + "core-foundation 0.9.3", + "glutin_egl_sys", + "glutin_emscripten_sys", + "glutin_gles2_sys", + "glutin_glx_sys", + "glutin_wgl_sys", + "lazy_static", + "libloading", + "log", "objc", - "raw-window-handle", + "osmesa-sys", + "parking_lot", + "wayland-client", + "wayland-egl", + "winapi", + "winit", +] + +[[package]] +name = "glutin_egl_sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2abb6aa55523480c4adc5a56bbaa249992e2dddb2fc63dc96e04a3355364c211" +dependencies = [ + "gl_generator", "winapi", ] [[package]] -name = "glfw-sys" -version = "3.3.5" +name = "glutin_emscripten_sys" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0cbb12e2dfac494316e91f6bf7cf070ccd9c61501a02f4af14d71222c9f67f" +checksum = "80de4146df76e8a6c32b03007bc764ff3249dcaeb4f675d68a06caf1bac363f1" + +[[package]] +name = "glutin_gles2_sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8094e708b730a7c8a1954f4f8a31880af00eb8a1c5b5bf85d28a0a3c6d69103" dependencies = [ - "cmake", + "gl_generator", + "objc", ] [[package]] -name = "jobserver" -version = "0.1.24" +name = "glutin_glx_sys" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af25a77299a7f711a01975c35a6a424eb6862092cc2d6c72c4ed6cbc56dfc1fa" +checksum = "7e393c8fc02b807459410429150e9c4faffdb312d59b8c038566173c81991351" +dependencies = [ + "gl_generator", + "x11-dl", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3da5951a1569dbab865c6f2a863efafff193a93caf05538d193e9e3816d21696" +dependencies = [ + "gl_generator", +] + +[[package]] +name = "half" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" dependencies = [ "libc", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "image" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db207d030ae38f1eb6f240d5a1c1c88ff422aa005d10f8c6c6fc5e75286ab30e" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "exr", + "gif", + "jpeg-decoder 0.2.2", + "num-iter", + "num-rational", + "num-traits", + "png", + "scoped_threadpool", + "tiff", +] + +[[package]] +name = "inflate" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cdb29978cc5797bd8dcc8e5bf7de604891df2a8dc576973d71a281e916db2ff" +dependencies = [ + "adler32", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jpeg-decoder" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229d53d58899083193af11e15917b5640cd40b29ff475a1fe4ef725deb02d0f2" + +[[package]] +name = "jpeg-decoder" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "105fb082d64e2100074587f59a74231f771750c664af903f1f9f76c9dedfc6f1" +dependencies = [ + "rayon", +] + +[[package]] +name = "js-sys" +version = "0.3.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a38fc24e30fd564ce974c02bf1d337caddff65be6cc4735a1f7eab22a7440f04" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "lebe" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7efd1d698db0759e6ef11a7cd44407407399a910c774dd804c64c032da7826ff" + [[package]] name = "libc" version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "efaa7b300f3b5fe8eb6bf21ce3895e1751d9665086af2d64b42f19701015ff4f" +[[package]] +name = "libloading" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd" +dependencies = [ + "cfg-if 1.0.0", + "winapi", +] + +[[package]] +name = "lock_api" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6389c490849ff5bc16be905ae24bc913a9c8892e19b2341dbc175e14c341c2b8" +dependencies = [ + "cfg-if 1.0.0", +] + [[package]] name = "malloc_buf" version = "0.0.6" @@ -104,6 +728,244 @@ dependencies = [ "libc", ] +[[package]] +name = "memchr" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" + +[[package]] +name = "memmap2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b6c2ebff6180198788f5db08d7ce3bc1d0b617176678831a7510825973e357" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +dependencies = [ + "adler", + "autocfg", +] + +[[package]] +name = "miniz_oxide" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b29bd4bc3f33391105ebee3589c19197c4271e3e5a9ec9bfe8127eeff8f082" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52da4364ffb0e4fe33a9841a98a3f3014fb964045ce4f7a45a398243c8d6b0c9" +dependencies = [ + "libc", + "log", + "miow", + "ntapi", + "wasi 0.11.0+wasi-snapshot-preview1", + "winapi", +] + +[[package]] +name = "miow" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" +dependencies = [ + "winapi", +] + +[[package]] +name = "nanorand" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" +dependencies = [ + "getrandom", +] + +[[package]] +name = "ndk" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d868f654c72e75f8687572699cdabe755f03effbb62542768e995d5b8d699d" +dependencies = [ + "bitflags", + "jni-sys", + "ndk-sys", + "num_enum", + "thiserror", +] + +[[package]] +name = "ndk-context" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e3c5cc68637e21fe8f077f6a1c9e0b9ca495bb74895226b476310f613325884" + +[[package]] +name = "ndk-glue" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1c68f70683c5fc9a747a383744206cd371741b2f0b31781ab6770487ec572e2" +dependencies = [ + "lazy_static", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-macro", + "ndk-sys", +] + +[[package]] +name = "ndk-macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0df7ac00c4672f9d5aece54ee3347520b7e20f158656c7db2e6de01902eb7a6c" +dependencies = [ + "darling", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "ndk-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1bcdd74c20ad5d95aacd60ef9ba40fdf77f767051040541df557b7a9b2a2121" + +[[package]] +name = "nix" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4916f159ed8e5de0082076562152a76b7a1f64a01fd9d1e0fea002c37624faf" +dependencies = [ + "bitflags", + "cc", + "cfg-if 1.0.0", + "libc", + "memoffset", +] + +[[package]] +name = "nom" +version = "7.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "ntapi" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f" +dependencies = [ + "winapi", +] + +[[package]] +name = "num-integer" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d41702bd167c2df5520b384281bc111a4b5efcf7fbc4c9c222c815b07e0a6a6a" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf5395665662ef45796a4ff5486c5d41d29e0c09640af4c5f17fd94ee2c119c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0498641e53dd6ac1a4f22547548caa6864cc4933784319cd1775271c5a46ce" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "objc" version = "0.2.7" @@ -113,6 +975,127 @@ dependencies = [ "malloc_buf", ] +[[package]] +name = "object" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67ac1d3f9a1d3616fd9a60c8d74296f22406a238b6a72f5cc1e6f314df4ffbf9" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" + +[[package]] +name = "osmesa-sys" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88cfece6e95d2e717e0872a7f53a8684712ad13822a7979bc760b9c77ec0013b" +dependencies = [ + "shared_library", +] + +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" +dependencies = [ + "cfg-if 1.0.0", + "instant", + "libc", + "redox_syscall", + "smallvec", + "winapi", +] + +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + +[[package]] +name = "pin-project" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58ad3879ad3baf4e44784bc6a718a8698867bb991f8ce24d1bcbe2cfb4c3a75e" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "744b6f092ba29c3650faf274db506afd39944f48420f6c86b17cfe0ee1cb36bb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pkg-config" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58893f751c9b0412871a09abd62ecd2a00298c6c83befa223ef98c52aef40cbe" + +[[package]] +name = "png" +version = "0.17.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc38c0ad57efb786dd57b9864e5b18bae478c00c824dc55a38bbc9da95dde3ba" +dependencies = [ + "bitflags", + "crc32fast", + "deflate", + "miniz_oxide 0.5.1", +] + +[[package]] +name = "proc-macro-crate" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" +dependencies = [ + "thiserror", + "toml", +] + +[[package]] +name = "proc-macro2" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "632d02bff7f874a36f33ea8bb416cd484b90cc66c1194b1a1110d067a7013f58" +dependencies = [ + "proc-macro2", +] + [[package]] name = "raw-window-handle" version = "0.4.2" @@ -122,15 +1105,365 @@ dependencies = [ "cty", ] +[[package]] +name = "rayon" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90" +dependencies = [ + "autocfg", + "crossbeam-deque", + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "lazy_static", + "num_cpus", +] + +[[package]] +name = "redox_syscall" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae183fc1b06c149f0c1793e1eb447c8b04bfe46d48e9e48bfb8d2d7ed64ecf0" +dependencies = [ + "bitflags", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" + +[[package]] +name = "scoped-tls" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" + +[[package]] +name = "scoped_threadpool" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "serde" +version = "1.0.136" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" + +[[package]] +name = "shared_library" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a9e7e0f2bfae24d8a5b5a66c5b257a83c7412304311512a0c054cd5e619da11" +dependencies = [ + "lazy_static", + "libc", +] + +[[package]] +name = "smallvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" + +[[package]] +name = "smithay-client-toolkit" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1325f292209cee78d5035530932422a30aa4c8fda1a16593ac083c1de211e68a" +dependencies = [ + "bitflags", + "calloop", + "dlib", + "lazy_static", + "log", + "memmap2", + "nix", + "pkg-config", + "wayland-client", + "wayland-cursor", + "wayland-protocols", +] + +[[package]] +name = "spin" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "511254be0c5bcf062b019a6c89c01a664aa359ded62f78aa72c6fc137c0590e5" +dependencies = [ + "lock_api", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "syn" +version = "1.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea297be220d52398dcc07ce15a209fce436d361735ac1db700cab3b6cdfb9f54" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "takeable-option" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36ae8932fcfea38b7d3883ae2ab357b0d57a02caaa18ebb4f5ece08beaec4aa0" + +[[package]] +name = "thiserror" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + +[[package]] +name = "tiff" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0247608e998cb6ce39dfc8f4a16c50361ce71e5b52e6d24ea1227ea8ea8ee0b2" +dependencies = [ + "flate2", + "jpeg-decoder 0.1.22", + "weezl", +] + +[[package]] +name = "toml" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +dependencies = [ + "serde", +] + +[[package]] +name = "unicode-xid" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" + [[package]] name = "vox" version = "0.1.0" dependencies = [ - "bgfx-rs", - "glfw", - "raw-window-handle", + "glium", + "image", ] +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" + +[[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.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25f1af7423d8588a3d840681122e72e6a24ddbcb3f0ec385cac0d12d24256c06" +dependencies = [ + "cfg-if 1.0.0", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b21c0df030f5a177f3cba22e9bc4322695ec43e7257d865302900290bcdedca" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f4203d69e40a52ee523b2529a773d5ffc1dc0071801c87b3d270b471b80ed01" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa8a30d46208db204854cadbb5d4baf5fcf8071ba5bf48190c3e59937962ebc" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d958d035c4438e28c70e4321a2911302f10135ce78a9c7834c0cab4123d06a2" + +[[package]] +name = "wayland-client" +version = "0.29.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91223460e73257f697d9e23d401279123d36039a3f7a449e983f123292d4458f" +dependencies = [ + "bitflags", + "downcast-rs", + "libc", + "nix", + "scoped-tls", + "wayland-commons", + "wayland-scanner", + "wayland-sys", +] + +[[package]] +name = "wayland-commons" +version = "0.29.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94f6e5e340d7c13490eca867898c4cec5af56c27a5ffe5c80c6fc4708e22d33e" +dependencies = [ + "nix", + "once_cell", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-cursor" +version = "0.29.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c52758f13d5e7861fc83d942d3d99bf270c83269575e52ac29e5b73cb956a6bd" +dependencies = [ + "nix", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-egl" +version = "0.29.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83281d69ee162b59031c666385e93bde4039ec553b90c4191cdb128ceea29a3a" +dependencies = [ + "wayland-client", + "wayland-sys", +] + +[[package]] +name = "wayland-protocols" +version = "0.29.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60147ae23303402e41fe034f74fb2c35ad0780ee88a1c40ac09a3be1e7465741" +dependencies = [ + "bitflags", + "wayland-client", + "wayland-commons", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.29.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39a1ed3143f7a143187156a2ab52742e89dac33245ba505c17224df48939f9e0" +dependencies = [ + "proc-macro2", + "quote", + "xml-rs", +] + +[[package]] +name = "wayland-sys" +version = "0.29.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9341df79a8975679188e37dab3889bfa57c44ac2cb6da166f519a81cbe452d4" +dependencies = [ + "dlib", + "lazy_static", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c060b319f29dd25724f09a2ba1418f142f539b2be99fbf4d2d5a8f7330afb8eb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "weezl" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b77fdfd5a253be4ab714e4ffa3c49caf146b4de743e97510c0656cf90f1e8e" + [[package]] name = "winapi" version = "0.3.9" @@ -152,3 +1485,62 @@ 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 = "winit" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b43cc931d58b99461188607efd7acb2a093e65fc621f54cad78517a6063e73a" +dependencies = [ + "bitflags", + "cocoa", + "core-foundation 0.9.3", + "core-graphics 0.22.3", + "core-video-sys", + "dispatch", + "instant", + "lazy_static", + "libc", + "log", + "mio", + "ndk", + "ndk-glue", + "ndk-sys", + "objc", + "parking_lot", + "percent-encoding", + "raw-window-handle", + "smithay-client-toolkit", + "wasm-bindgen", + "wayland-client", + "wayland-protocols", + "web-sys", + "winapi", + "x11-dl", +] + +[[package]] +name = "x11-dl" +version = "2.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea26926b4ce81a6f5d9d0f3a0bc401e5a37c6ae14a1bfaa8ff6099ca80038c59" +dependencies = [ + "lazy_static", + "libc", + "pkg-config", +] + +[[package]] +name = "xcursor" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "463705a63313cd4301184381c5e8042f0a7e9b4bb63653f216311d4ae74690b7" +dependencies = [ + "nom", +] + +[[package]] +name = "xml-rs" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" diff --git a/Cargo.toml b/Cargo.toml index 391df7b..8a369cd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,8 +6,5 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] - -bgfx-rs = "0.7.0" - -glfw = "0.44.0" -raw-window-handle = "0.4.2" \ No newline at end of file +glium = "0.31" +image = "0.24.1" \ No newline at end of file diff --git a/assets/opengl.png b/assets/opengl.png new file mode 100644 index 0000000000000000000000000000000000000000..89f897b3b44a879be711e8f8eeb27a7843767fb0 GIT binary patch literal 72249 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 Jorq^2{Xc~&U_$@^ literal 0 HcmV?d00001 diff --git a/assets/shade.frag b/assets/shade.frag new file mode 100644 index 0000000..968b39f --- /dev/null +++ b/assets/shade.frag @@ -0,0 +1,10 @@ +#version 140 + +in vec2 v_tex_coords; +out vec4 color; + +uniform sampler2D tex; + +void main() { + color = texture(tex, v_tex_coords); +} \ No newline at end of file diff --git a/assets/shade.vert b/assets/shade.vert new file mode 100644 index 0000000..275eac1 --- /dev/null +++ b/assets/shade.vert @@ -0,0 +1,12 @@ +#version 140 + +in vec2 position; +in vec2 tex_coords; +out vec2 v_tex_coords; + +uniform mat4 matrix; + +void main() { + v_tex_coords = tex_coords; + gl_Position = matrix * vec4(position, 0.0, 1.0); +} \ No newline at end of file diff --git a/rust-toolchain b/rust-toolchain new file mode 100644 index 0000000..07ade69 --- /dev/null +++ b/rust-toolchain @@ -0,0 +1 @@ +nightly \ No newline at end of file diff --git a/src/config.rs b/src/config.rs new file mode 100644 index 0000000..4957c1a --- /dev/null +++ b/src/config.rs @@ -0,0 +1,5 @@ +//! A few constants to make standardizing sizes easier. + +pub const CHUNK_RADIUS: u8 = 3; +pub const CHUNK_HEIGHT: u8 = 4; +pub const PLAYER_HEIGHT: f64 = 1.7; diff --git a/src/main.rs b/src/main.rs index 40ac648..51f52cb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,99 +1,148 @@ +#![feature(const_fn_trait_bound)] + +use std::io::Cursor; + +#[macro_use] +extern crate glium; + +use glium::{ + glutin::{self, event::KeyboardInput}, + Surface, +}; pub mod chunk; +pub mod config; pub mod coordinates; -pub mod platform; +pub mod textures; pub mod voxel; - -use bgfx::*; -use bgfx_rs::bgfx; -use glfw::{Action, Key, Window}; -use platform::{get_platform_data, get_render_type}; - -const WIDTH: usize = 1280; -const HEIGHT: usize = 720; - fn main() { - let hex_coord_1 = coordinates::Hex { - q: 0.0, - r: 0.0, - s: 0.0, - y: 0.0, - }; + let event_loop = glutin::event_loop::EventLoop::new(); + let wb = glutin::window::WindowBuilder::new() + .with_title("Voxel Engine") + .with_resizable(true) + .with_transparent(true); + let cb = glutin::ContextBuilder::new(); + let display = glium::Display::new(wb, cb, &event_loop).unwrap(); - let hex_coord_2 = coordinates::Hex { - q: 1.0, - r: 1.0, - s: 1.1, - y: 0.0, - }; - hex_coord_2.round(); + let image = image::load( + Cursor::new(&include_bytes!("../assets/opengl.png")), + image::ImageFormat::Png, + ) + .unwrap() + .to_rgba8(); + let image_dimensions = image.dimensions(); + let image = + glium::texture::RawImage2d::from_raw_rgba_reversed(&image.into_raw(), image_dimensions); + let texture = glium::texture::SrgbTexture2d::new(&display, image).unwrap(); - println!("{}", hex_coord_1.distance_to(hex_coord_2)); - - let mut glfw = glfw::init(glfw::FAIL_ON_ERRORS).unwrap(); - glfw.window_hint(glfw::WindowHint::ClientApi(glfw::ClientApiHint::NoApi)); - - let (mut window, events) = glfw - .create_window( - WIDTH as _, - HEIGHT as _, - "Vox - ESC to close", - glfw::WindowMode::Windowed, - ) - .expect("Failed to create GLFW window."); - - window.set_key_polling(true); - - let init = init(&window); - if !bgfx::init(&init) { - panic!("failed to init bgfx"); + #[derive(Copy, Clone)] + struct Vertex { + position: [f32; 2], + tex_coords: [f32; 2], } - bgfx::set_view_clear( - 0, - ClearFlags::COLOR.bits() | ClearFlags::DEPTH.bits(), - SetViewClearArgs { - rgba: 0x00000000, - ..Default::default() - }, - ); + implement_vertex!(Vertex, position, tex_coords); - let mut old_size = (0, 0); + #[rustfmt::skip] + let vertex1 = Vertex { position: [-0.5, -0.5], tex_coords: [0.0, 0.0] }; + #[rustfmt::skip] + let vertex2 = Vertex { position: [ 0.0, 0.5], tex_coords: [0.0, 1.0] }; + #[rustfmt::skip] + let vertex3 = Vertex { position: [ 0.5, -0.25], tex_coords: [1.0, 0.0] }; - while !window.should_close() { - glfw.poll_events(); - for (_, event) in glfw::flush_messages(&events) { - if let glfw::WindowEvent::Key(Key::Escape, _, Action::Press, _) = event { - window.set_should_close(true) + let shape = vec![vertex1, vertex2, vertex3]; + + let vertex_buffer = glium::VertexBuffer::new(&display, &shape).unwrap(); + let indices = glium::index::NoIndices(glium::index::PrimitiveType::TrianglesList); + + let vertex_shader_src = include_str!("../assets/shade.vert"); + let fragment_shader_src = include_str!("../assets/shade.frag"); + + let program = + glium::Program::from_source(&display, vertex_shader_src, fragment_shader_src, None) + .unwrap(); + + let mut t: f32 = -0.5; + event_loop.run(move |event, _, control_flow| { + use glutin::event::Event::*; + match event { + WindowEvent { event, .. } => match event { + glutin::event::WindowEvent::CloseRequested => { + *control_flow = glutin::event_loop::ControlFlow::Exit; + return; + } + _ => return, + }, + + NewEvents(cause) => { + use glutin::event::StartCause::*; + match cause { + ResumeTimeReached { .. } => (), + Init => (), + _ => return, + } + } + DeviceEvent { + device_id: _, + event, + } => match event { + glutin::event::DeviceEvent::Key(key) => match key { + KeyboardInput { + virtual_keycode: Some(glutin::event::VirtualKeyCode::Escape), + .. + } => { + *control_flow = glutin::event_loop::ControlFlow::Exit; + return; + } + KeyboardInput { + state: glutin::event::ElementState::Pressed, + virtual_keycode, + .. + } => { + println!("{:?}", virtual_keycode); + return; + } + _ => return, + }, + _ => return, + }, + + _ => { + return; } } - let size = window.get_framebuffer_size(); + let next_frame_time = + std::time::Instant::now() + std::time::Duration::from_nanos(16_666_667); + *control_flow = glutin::event_loop::ControlFlow::WaitUntil(next_frame_time); - if old_size != size { - bgfx::reset(size.0 as _, size.1 as _, ResetArgs::default()); - old_size = size; + // we update `t` + t += 0.0002; + if t > 0.5 { + t = -0.5; } - bgfx::set_view_rect(0, 0, 0, size.0 as _, size.1 as _); - bgfx::touch(0); + let mut target = display.draw(); + target.clear_color(0.0, 0.0, 1.0, 0.0); - bgfx::frame(false); - } - shutdown_handler(); -} -pub fn shutdown_handler() { - bgfx::shutdown(); - - println!("shutdown"); -} - -pub fn init(window: &Window) -> Init { - let mut init = Init::new(); - - init.type_r = get_render_type(); - init.resolution.width = WIDTH as u32; - init.resolution.height = HEIGHT as u32; - init.resolution.reset = ResetFlags::VSYNC.bits(); - init.platform_data = get_platform_data(&window); - init + let uniforms = uniform! { + matrix: [ + [1.0, 0.0, 0.0, 0.0], + [0.0, 1.0, 0.0, 0.0], + [0.0, 0.0, 1.0, 0.0], + [ t , 0.0, 0.0, 1.0f32], + ], + tex: &texture, + }; + + target + .draw( + &vertex_buffer, + &indices, + &program, + &uniforms, + &Default::default(), + ) + .unwrap(); + target.finish().unwrap(); + }); } diff --git a/src/platform.rs b/src/platform.rs deleted file mode 100644 index 0c55a9c..0000000 --- a/src/platform.rs +++ /dev/null @@ -1,54 +0,0 @@ -use bgfx_rs::static_lib::{PlatformData, RendererType}; -use glfw::Window; -use raw_window_handle::{HasRawWindowHandle, RawWindowHandle}; - -pub fn get_platform_data(window: &Window) -> PlatformData { - let mut pd = PlatformData::new(); - - match window.raw_window_handle() { - #[cfg(any( - target_os = "linux", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "netbsd", - target_os = "openbsd" - ))] - RawWindowHandle::Xlib(data) => { - pd.nwh = data.window as *mut _; - pd.ndt = data.display as *mut _; - } - #[cfg(any( - target_os = "linux", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "netbsd", - target_os = "openbsd" - ))] - RawWindowHandle::Wayland(data) => { - pd.ndt = data.surface; // same as window, on wayland there ins't a concept of windows - pd.nwh = data.display; - } - - #[cfg(target_os = "macos")] - RawWindowHandle::MacOS(data) => { - pd.nwh = data.ns_window; - } - #[cfg(target_os = "windows")] - RawWindowHandle::Win32(data) => { - pd.nwh = data.hwnd; - } - _ => panic!("Unsupported Window Manager"), - } - - return pd; -} - -#[cfg(target_os = "linux")] -pub fn get_render_type() -> RendererType { - RendererType::OpenGL -} - -#[cfg(not(target_os = "linux"))] -pub fn get_render_type() -> RendererType { - RendererType::Count -} diff --git a/src/textures.rs b/src/textures.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/textures.rs @@ -0,0 +1 @@ + diff --git a/src/voxel.rs b/src/voxel.rs index a3fe994..ab03692 100644 --- a/src/voxel.rs +++ b/src/voxel.rs @@ -1,3 +1,12 @@ +#[repr(C)] +pub struct Light { + pub red: u8, + pub green: u8, + pub blue: u8, + pub sun: u8, +} + pub struct VoxelData { pub id: u32, + pub light_level: Light, }