diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ec17e1e..e7f0614 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,5 +9,6 @@ As an open source project, the community is the backbone of the engine. As such, * `Writing documentation`: The codebase move fast, often times documentation is forgotten to be added until a few versions. ## Contribution license + By contributing to this repository through issues, addition, modification, or deletion of any kind to the codebase, you agree to your work being licensed under the same license as the engine, which you can obtain a copy of in the repository. diff --git a/Cargo.lock b/Cargo.lock index ea0321b..f5c939f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "ab_glyph" -version = "0.2.28" +version = "0.2.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79faae4620f45232f599d9bc7b290f88247a0834162c4495ab2f02d60004adfb" +checksum = "ec3672c180e71eeaaac3a541fbbc5f5ad4def8b747c595ad30d674e43049f7b0" dependencies = [ "ab_glyph_rasterizer", "owned_ttf_parser", @@ -18,12 +18,6 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - [[package]] name = "adler2" version = "2.0.0" @@ -58,12 +52,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" -[[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" @@ -82,7 +70,7 @@ dependencies = [ "ndk-context", "ndk-sys 0.6.0+11769913", "num_enum", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -119,9 +107,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.15" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -134,43 +122,43 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.8" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.4" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" dependencies = [ "anstyle", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anyhow" -version = "1.0.86" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" [[package]] name = "approx" @@ -183,9 +171,9 @@ dependencies = [ [[package]] name = "arbitrary" -version = "1.3.2" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" [[package]] name = "arg_enum_proc_macro" @@ -195,14 +183,14 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn", ] [[package]] name = "arrayref" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d151e35f61089500b617991b791fc8bfd237ae50cd5950803758a179b41e67a" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" @@ -233,9 +221,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "av1-grain" @@ -253,27 +241,27 @@ dependencies = [ [[package]] name = "avif-serialize" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "876c75a42f6364451a033496a14c44bffe41f5f4a8236f697391f11024e596d2" +checksum = "e335041290c43101ca215eed6f43ec437eb5a42125573f600fc3fa42b9bddd62" dependencies = [ "arrayvec", ] [[package]] name = "bit-set" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0481a0e032742109b1133a095184ee93d88f3dc9e0d28a5d033dc77a073f44f" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" dependencies = [ "bit-vec", ] [[package]] name = "bit-vec" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c54ff287cfc0a34f38a6b832ea1bd8e448a330b3e40a50859e6488bee07f22" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" [[package]] name = "bit_field" @@ -295,9 +283,9 @@ checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "bitstream-io" -version = "2.5.3" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b81e1519b0d82120d2fd469d5bfb2919a9361c48b02d82d04befc1cdd2002452" +checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" [[package]] name = "block" @@ -316,26 +304,41 @@ dependencies = [ [[package]] name = "blue_engine" -version = "0.5.21" +version = "0.6.0" +dependencies = [ + "blue_engine_core", + "blue_engine_dynamic", +] + +[[package]] +name = "blue_engine_core" +version = "0.6.0" dependencies = [ "android_logger", "bytemuck", "downcast", "env_logger", - "eyre", "image", "log", "nalgebra-glm", "pollster", + "thiserror 2.0.9", "wgpu", "winit", ] +[[package]] +name = "blue_engine_dynamic" +version = "0.6.0" +dependencies = [ + "blue_engine_core", +] + [[package]] name = "built" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "236e6289eda5a812bc6b53c3b024039382a2895fbbeef2d748b2931546d392c4" +checksum = "c360505aed52b7ec96a3636c3f039d99103c37d1d9b4f7a8c743d3ea9ffcd03b" [[package]] name = "bumpalo" @@ -345,22 +348,22 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.17.0" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fd4c6dcc3b0aea2f5c0b4b82c2b15fe39ddbc76041a310848f4706edf76bb31" +checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.7.1" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc8b54b395f2fcfbb3d90c47b01c7f444d94d05bdeb775811dec868ac3bbc26" +checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn", ] [[package]] @@ -377,9 +380,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.7.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" [[package]] name = "calloop" @@ -392,7 +395,7 @@ dependencies = [ "polling", "rustix", "slab", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -409,9 +412,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.15" +version = "1.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b6a275aa2903740dc87da01c62040406b8812552e97129a63ea8850a17c6e6" +checksum = "8d6dbb628b8f8555f86d0323c2eb39e3ec81901f4b83e091db8a6a76d316a333" dependencies = [ "jobserver", "libc", @@ -470,40 +473,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "colorchoice" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" - -[[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" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad899a1087a9296d5644792d7cb72b8e34c1bec8e7d4fbc002230169a6e8710c" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "combine" @@ -575,9 +547,9 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -594,9 +566,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" @@ -610,17 +582,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" -[[package]] -name = "d3d12" -version = "22.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdbd1f579714e3c809ebd822c81ef148b1ceaeb3d535352afc73fd0c4c6a0017" -dependencies = [ - "bitflags 2.6.0", - "libloading", - "winapi", -] - [[package]] name = "dispatch" version = "0.2.0" @@ -671,9 +632,9 @@ checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "env_filter" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab" +checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" dependencies = [ "log", "regex", @@ -681,9 +642,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d" +checksum = "dcaee3d8e3cfc3fd92428d477bc97fc29ec8716d180c0d74c643bb26166660e0" dependencies = [ "anstream", "anstyle", @@ -700,67 +661,53 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "exr" -version = "1.72.0" +version = "1.73.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "887d93f60543e9a9362ef8a21beedd0a833c5d9610e18c67abe15a5963dcb1a4" +checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" dependencies = [ "bit_field", - "flume", "half", "lebe", - "miniz_oxide 0.7.4", + "miniz_oxide", "rayon-core", "smallvec", "zune-inflate", ] -[[package]] -name = "eyre" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" -dependencies = [ - "indenter", - "once_cell", -] - [[package]] name = "fdeflate" -version = "0.3.4" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" dependencies = [ "simd-adler32", ] [[package]] name = "flate2" -version = "1.0.33" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" dependencies = [ "crc32fast", - "miniz_oxide 0.8.0", + "miniz_oxide", ] [[package]] -name = "flume" -version = "0.11.0" +name = "foldhash" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" -dependencies = [ - "spin", -] +checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" [[package]] name = "foreign-types" @@ -780,7 +727,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn", ] [[package]] @@ -833,9 +780,9 @@ dependencies = [ [[package]] name = "glow" -version = "0.13.1" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd348e04c43b32574f2de31c8bb397d96c9fcfa1371bd4ca6d8bdc464ab121b1" +checksum = "d51fa363f025f5c111e03f13eda21162faeacb6911fe8caa0c0349f9cf0c4483" dependencies = [ "js-sys", "slotmap", @@ -873,22 +820,21 @@ dependencies = [ [[package]] name = "gpu-allocator" -version = "0.26.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd4240fc91d3433d5e5b0fc5b67672d771850dc19bbee03c1381e19322803d7" +checksum = "c151a2a5ef800297b4e79efa4f4bec035c5f51d5ae587287c9b952bdf734cacd" dependencies = [ "log", "presser", - "thiserror", - "winapi", + "thiserror 1.0.69", "windows", ] [[package]] name = "gpu-descriptor" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c08c1f623a8d0b722b8b99f821eb0ba672a1618f0d3b16ddbee1cedd2dd8557" +checksum = "dcf29e94d6d243368b7a56caa16bc213e4f9f8ed38c4d9557069527b5d5281ca" dependencies = [ "bitflags 2.6.0", "gpu-descriptor-types", @@ -916,27 +862,11 @@ dependencies = [ [[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" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af2a7e73e1f34c48da31fb668a907f250794837e08faa144fd24f0b8b741e890" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" dependencies = [ - "bitflags 2.6.0", - "com", - "libc", - "libloading", - "thiserror", - "widestring", - "winapi", + "foldhash", ] [[package]] @@ -965,9 +895,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "image" -version = "0.25.2" +version = "0.25.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99314c8a2152b8ddb211f924cdae532d8c5e4c8bb54728e12fff1b0cd5963a10" +checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" dependencies = [ "bytemuck", "byteorder-lite", @@ -988,9 +918,9 @@ dependencies = [ [[package]] name = "image-webp" -version = "0.1.3" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79afb8cbee2ef20f59ccd477a218c12a93943d075b492015ecb1bb81f8ee904" +checksum = "e031e8e3d94711a9ccb5d6ea357439ef3dcbed361798bd4071dc4d9793fbe22f" dependencies = [ "byteorder-lite", "quick-error", @@ -998,21 +928,15 @@ dependencies = [ [[package]] name = "imgref" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44feda355f4159a7c757171a77de25daf6411e217b4cabd03bd6650690468126" - -[[package]] -name = "indenter" -version = "0.3.3" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" +checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" [[package]] name = "indexmap" -version = "2.4.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ "equivalent", "hashbrown", @@ -1026,7 +950,7 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn", ] [[package]] @@ -1055,7 +979,7 @@ dependencies = [ "combine", "jni-sys", "log", - "thiserror", + "thiserror 1.0.69", "walkdir", "windows-sys 0.45.0", ] @@ -1083,10 +1007,11 @@ checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" [[package]] name = "js-sys" -version = "0.3.70" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -1115,26 +1040,25 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" -version = "0.2.158" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libfuzzer-sys" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a96cfd5557eb82f2b83fed4955246c988d331975a002961b07c81584d107e7f7" +checksum = "9b9569d2f74e257076d8c6bfa73fb505b46b851e51ddaecc825944aa3bed17fa" dependencies = [ "arbitrary", "cc", - "once_cell", ] [[package]] name = "libloading" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", "windows-targets 0.52.6", @@ -1142,13 +1066,13 @@ dependencies = [ [[package]] name = "libredox" -version = "0.0.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ "bitflags 2.6.0", "libc", - "redox_syscall 0.4.1", + "redox_syscall 0.5.8", ] [[package]] @@ -1214,6 +1138,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" dependencies = [ "cfg-if", + "rayon", ] [[package]] @@ -1224,9 +1149,9 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memmap2" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" +checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" dependencies = [ "libc", ] @@ -1254,28 +1179,19 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.4" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" -dependencies = [ - "adler", - "simd-adler32", -] - -[[package]] -name = "miniz_oxide" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" dependencies = [ "adler2", + "simd-adler32", ] [[package]] name = "naga" -version = "22.1.0" +version = "23.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bd5a652b6faf21496f2cfd88fc49989c8db0825d1f6746b1a71a6ede24a63ad" +checksum = "364f94bc34f61332abebe8cad6f6cd82a5b65cff22c828d05d0968911462ca4f" dependencies = [ "arrayvec", "bit-set", @@ -1288,15 +1204,15 @@ dependencies = [ "rustc-hash", "spirv", "termcolor", - "thiserror", + "thiserror 1.0.69", "unicode-xid", ] [[package]] name = "nalgebra" -version = "0.33.0" +version = "0.33.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c4b5f057b303842cf3262c27e465f4c303572e7f6b0648f60e16248ac3397f4" +checksum = "26aecdf64b707efd1310e3544d709c5c0ac61c13756046aaaba41be5c4f66a3b" dependencies = [ "approx", "matrixmultiply", @@ -1331,7 +1247,7 @@ dependencies = [ "ndk-sys 0.6.0+11769913", "num_enum", "raw-window-handle", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1407,7 +1323,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn", ] [[package]] @@ -1457,7 +1373,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.76", + "syn", ] [[package]] @@ -1674,24 +1590,24 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "orbclient" -version = "0.3.47" +version = "0.3.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52f0d54bde9774d3a51dcf281a5def240c71996bc6ca05d2c847ec8b2b216166" +checksum = "ba0b26cec2e24f08ed8bb31519a9333140a6599b867dac464bb150bdb796fd43" dependencies = [ "libredox", ] [[package]] name = "owned_ttf_parser" -version = "0.24.0" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "490d3a563d3122bf7c911a59b0add9389e5ec0f5f0c3ac6b91ff235a0e6a7f90" +checksum = "22ec719bbf3b2a81c109a4e20b1f129b5566b7dce654bc3872f6a05abf82b2c4" dependencies = [ "ttf-parser", ] @@ -1714,7 +1630,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.3", + "redox_syscall 0.5.8", "smallvec", "windows-targets 0.52.6", ] @@ -1733,54 +1649,54 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn", ] [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pkg-config" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "png" -version = "0.17.13" +version = "0.17.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" dependencies = [ "bitflags 1.3.2", "crc32fast", "fdeflate", "flate2", - "miniz_oxide 0.7.4", + "miniz_oxide", ] [[package]] name = "polling" -version = "3.7.3" +version = "3.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" dependencies = [ "cfg-if", "concurrent-queue", @@ -1793,9 +1709,9 @@ dependencies = [ [[package]] name = "pollster" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22686f4785f02a4fcc856d3b3bb19bf6c8160d103f7a99cc258bddd0251dc7f2" +checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" [[package]] name = "ppv-lite86" @@ -1814,39 +1730,39 @@ checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" [[package]] name = "proc-macro-crate" -version = "3.1.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" dependencies = [ - "toml_edit 0.21.1", + "toml_edit", ] [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] [[package]] name = "profiling" -version = "1.0.15" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d84d1d7a6ac92673717f9f6d1518374ef257669c24ebc5ac25d5033828be58" +checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" dependencies = [ "profiling-procmacros", ] [[package]] name = "profiling-procmacros" -version = "1.0.15" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8021cf59c8ec9c432cfc2526ac6b8aa508ecaf29cd415f271b8406c1b851c3fd" +checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" dependencies = [ "quote", - "syn 2.0.76", + "syn", ] [[package]] @@ -1866,18 +1782,18 @@ checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quick-xml" -version = "0.36.1" +version = "0.36.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96a05e2e8efddfa51a84ca47cec303fac86c8541b686d37cac5efc0e094417bc" +checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" dependencies = [ "memchr", ] [[package]] name = "quote" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -1948,22 +1864,23 @@ dependencies = [ "rand_chacha", "simd_helpers", "system-deps", - "thiserror", + "thiserror 1.0.69", "v_frame", "wasm-bindgen", ] [[package]] name = "ravif" -version = "0.11.10" +version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f0bfd976333248de2078d350bfdf182ff96e168a24d23d2436cef320dd4bdd" +checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6" dependencies = [ "avif-serialize", "imgref", "loop9", "quick-error", "rav1e", + "rayon", "rgb", ] @@ -2010,18 +1927,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.3" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ "bitflags 2.6.0", ] [[package]] name = "regex" -version = "1.10.6" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", @@ -2031,9 +1948,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -2042,9 +1959,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "renderdoc-sys" @@ -2054,12 +1971,9 @@ checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" [[package]] name = "rgb" -version = "0.8.48" +version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f86ae463694029097b846d8f99fd5536740602ae00022c0c50c5600720b2f71" -dependencies = [ - "bytemuck", -] +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" [[package]] name = "rustc-hash" @@ -2069,22 +1983,22 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustix" -version = "0.38.34" +version = "0.38.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" dependencies = [ "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "safe_arch" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3460605018fdc9612bce72735cba0d27efbcd9904780d44c7e3a9948f96148a" +checksum = "96b02de82ddbe1b636e6170c21be622223aea188ef2e139be0a5b219ec215323" dependencies = [ "bytemuck", ] @@ -2125,29 +2039,29 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.209" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.209" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn", ] [[package]] name = "serde_spanned" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ "serde", ] @@ -2224,7 +2138,7 @@ dependencies = [ "log", "memmap2", "rustix", - "thiserror", + "thiserror 1.0.69", "wayland-backend", "wayland-client", "wayland-csd-frame", @@ -2244,15 +2158,6 @@ dependencies = [ "serde", ] -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - [[package]] name = "spirv" version = "0.3.0+sdk-1.3.268.0" @@ -2276,20 +2181,9 @@ 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.76" +version = "2.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578e081a14e0cefc3279b0472138c513f37b41a08d5a3cca9b6e4e8ceb6cd525" +checksum = "9c786062daee0d6db1132800e623df74274a0a87322d8e183338e01b3d98d058" dependencies = [ "proc-macro2", "quote", @@ -2326,22 +2220,42 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.63" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" +dependencies = [ + "thiserror-impl 2.0.9", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ - "thiserror-impl", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "thiserror-impl" -version = "1.0.63" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn", ] [[package]] @@ -2389,7 +2303,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.20", + "toml_edit", ] [[package]] @@ -2403,33 +2317,22 @@ dependencies = [ [[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 0.5.40", -] - -[[package]] -name = "toml_edit" -version = "0.22.20" +version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ "indexmap", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.18", + "winnow", ] [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "pin-project-lite", "tracing-core", @@ -2437,15 +2340,15 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" [[package]] name = "ttf-parser" -version = "0.24.1" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be21190ff5d38e8b4a2d3b6a3ae57f612cc39c96e83cedeaf7abc338a8bac4a" +checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" [[package]] name = "typenum" @@ -2455,27 +2358,27 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "unicode-segmentation" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode-width" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unicode-xid" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229730647fbc343e3a80e463c1db7f78f3855d3f3739bee0dda773c9a037c90a" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "utf8parse" @@ -2524,9 +2427,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.93" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" dependencies = [ "cfg-if", "once_cell", @@ -2535,36 +2438,36 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.93" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.76", + "syn", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.43" +version = "0.4.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.93" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2572,22 +2475,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.93" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.93" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" [[package]] name = "wayland-backend" @@ -2605,9 +2508,9 @@ dependencies = [ [[package]] name = "wayland-client" -version = "0.31.6" +version = "0.31.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3f45d1222915ef1fd2057220c1d9d9624b7654443ea35c3877f7a52bd0a5a2d" +checksum = "b66249d3fc69f76fd74c82cc319300faa554e9d865dab1f7cd66cc20db10b280" dependencies = [ "bitflags 2.6.0", "rustix", @@ -2628,9 +2531,9 @@ dependencies = [ [[package]] name = "wayland-cursor" -version = "0.31.6" +version = "0.31.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a94697e66e76c85923b0d28a0c251e8f0666f58fc47d316c0f4da6da75d37cb" +checksum = "32b08bc3aafdb0035e7fe0fdf17ba0c09c268732707dca4ae098f60cb28c9e4c" dependencies = [ "rustix", "wayland-client", @@ -2639,9 +2542,9 @@ dependencies = [ [[package]] name = "wayland-protocols" -version = "0.32.4" +version = "0.32.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b5755d77ae9040bb872a25026555ce4cb0ae75fd923e90d25fba07d81057de0" +checksum = "7cd0ade57c4e6e9a8952741325c30bf82f4246885dca8bf561898b86d0c1f58e" dependencies = [ "bitflags 2.6.0", "wayland-backend", @@ -2651,9 +2554,9 @@ dependencies = [ [[package]] name = "wayland-protocols-plasma" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0a41a6875e585172495f7a96dfa42ca7e0213868f4f15c313f7c33221a7eff" +checksum = "9b31cab548ee68c7eb155517f2212049dc151f7cd7910c2b66abfd31c3ee12bd" dependencies = [ "bitflags 2.6.0", "wayland-backend", @@ -2664,9 +2567,9 @@ dependencies = [ [[package]] name = "wayland-protocols-wlr" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dad87b5fd1b1d3ca2f792df8f686a2a11e3fe1077b71096f7a175ab699f89109" +checksum = "782e12f6cd923c3c316130d56205ebab53f55d6666b7faddfad36cecaeeb4022" dependencies = [ "bitflags 2.6.0", "wayland-backend", @@ -2700,9 +2603,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.70" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" dependencies = [ "js-sys", "wasm-bindgen", @@ -2726,9 +2629,9 @@ checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" [[package]] name = "wgpu" -version = "22.1.0" +version = "23.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d1c4ba43f80542cf63a0a6ed3134629ae73e8ab51e4b765a67f3aa062eb433" +checksum = "80f70000db37c469ea9d67defdc13024ddf9a5f1b89cb2941b812ad7cde1735a" dependencies = [ "arrayvec", "cfg_aliases 0.1.1", @@ -2751,9 +2654,9 @@ dependencies = [ [[package]] name = "wgpu-core" -version = "22.1.0" +version = "23.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0348c840d1051b8e86c3bcd31206080c5e71e5933dabd79be1ce732b0b2f089a" +checksum = "d63c3c478de8e7e01786479919c8769f62a22eec16788d8c2ac77ce2c132778a" dependencies = [ "arrayvec", "bit-vec", @@ -2769,16 +2672,16 @@ dependencies = [ "raw-window-handle", "rustc-hash", "smallvec", - "thiserror", + "thiserror 1.0.69", "wgpu-hal", "wgpu-types", ] [[package]] name = "wgpu-hal" -version = "22.0.0" +version = "23.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6bbf4b4de8b2a83c0401d9e5ae0080a2792055f25859a02bf9be97952bbed4f" +checksum = "89364b8a0b211adc7b16aeaf1bd5ad4a919c1154b44c9ce27838213ba05fd821" dependencies = [ "android_system_properties", "arrayvec", @@ -2786,15 +2689,14 @@ dependencies = [ "bit-set", "bitflags 2.6.0", "block", + "bytemuck", "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", @@ -2812,18 +2714,19 @@ dependencies = [ "renderdoc-sys", "rustc-hash", "smallvec", - "thiserror", + "thiserror 1.0.69", "wasm-bindgen", "web-sys", "wgpu-types", - "winapi", + "windows", + "windows-core", ] [[package]] name = "wgpu-types" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc9d91f0e2c4b51434dfa6db77846f2793149d8e73f800fa2e41f52b8eac3c5d" +checksum = "610f6ff27778148c31093f3b03abc4840f9636d58d597ca2f5977433acfe0068" dependencies = [ "bitflags 2.6.0", "js-sys", @@ -2832,67 +2735,84 @@ dependencies = [ [[package]] name = "wide" -version = "0.7.28" +version = "0.7.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b828f995bf1e9622031f8009f8481a85406ce1f4d4588ff746d872043e855690" +checksum = "58e6db2670d2be78525979e9a5f9c69d296fd7d670549fe9ebf70f8708cb5019" dependencies = [ "bytemuck", "safe_arch", ] [[package]] -name = "widestring" -version = "1.1.0" +name = "winapi-util" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] [[package]] -name = "winapi" -version = "0.3.9" +name = "windows" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", + "windows-core", + "windows-targets 0.52.6", ] [[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" +name = "windows-core" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] [[package]] -name = "winapi-util" -version = "0.1.9" +name = "windows-implement" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ - "windows-sys 0.59.0", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" +name = "windows-interface" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] -name = "windows" -version = "0.52.0" +name = "windows-result" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" dependencies = [ - "windows-core", "windows-targets 0.52.6", ] [[package]] -name = "windows-core" -version = "0.52.0" +name = "windows-strings" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" dependencies = [ + "windows-result", "windows-targets 0.52.6", ] @@ -3103,9 +3023,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winit" -version = "0.30.5" +version = "0.30.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0be9e76a1f1077e04a411f0b989cbd3c93339e1771cb41e71ac4aee95bfd2c67" +checksum = "dba50bc8ef4b6f1a75c9274fb95aa9a8f63fbc66c56f391bd85cf68d51e7b1a3" dependencies = [ "ahash", "android-activity", @@ -3155,18 +3075,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.5.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" -dependencies = [ - "memchr", -] - -[[package]] -name = "winnow" -version = "0.6.18" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" dependencies = [ "memchr", ] @@ -3230,9 +3141,9 @@ checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" [[package]] name = "xml-rs" -version = "0.8.21" +version = "0.8.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "539a77ee7c0de333dcc6da69b177380a0b81e0dacfa4f7344c465a36871ee601" +checksum = "ea8b391c9a790b496184c29f7f93b9ed5b16abb306c05415b68bcc16e4d06432" [[package]] name = "zerocopy" @@ -3252,7 +3163,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn", ] [[package]] @@ -3272,9 +3183,9 @@ dependencies = [ [[package]] name = "zune-jpeg" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16099418600b4d8f028622f73ff6e3deaabdff330fb9a2a131dea781ee8b0768" +checksum = "99a5bab8d7dedf81405c4bb1f2b83ea057643d9cb28778cea9eecddeedd2e028" dependencies = [ "zune-core", ] diff --git a/Cargo.toml b/Cargo.toml index 354541e..a9adb3b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,61 +1,63 @@ [package] name = "blue_engine" -version = "0.5.21" +version = "0.6.0" authors = ["Elham Aryanpur "] edition = "2021" description = "General-Purpose, Easy-to-use, Fast, and Portable graphics engine" documentation = "https://aryanpurtech.github.io/BlueEngineDocs/" repository = "https://github.com/AryanpurTech/BlueEngine" -keywords = ["gamedev", "graphics", "3D", "2D"] -categories = ["game-development", "gui", "graphics", "rendering"] +keywords = [ + "game-development", + "gamedev", + "engine", + "gui", + "3D", + "2D", + "graphics", + "rendering", +] +categories = [ + "game-development", + "gamedev", + "engine", + "gui", + "3D", + "2D", + "graphics", + "rendering", +] license = "Apache-2.0" -exclude = ["/examples"] +exclude = ["/examples", "/resources"] [lib] name = "blue_engine" [features] -default = ["debug", "u16"] -debug = ["dep:env_logger"] -android = ["dep:log", "dep:android_logger"] -android_native_activity = ["winit/android-native-activity"] -android_game_activity = ["winit/android-game-activity"] +default = ["debug", "u16", "dep:blue_engine_core"] +# Use the default engine +dynamic_link = ["dep:blue_engine_dynamic"] + +debug = ["blue_engine_core?/debug", "blue_engine_dynamic?/debug"] +android = ["blue_engine_core?/android", "blue_engine_dynamic?/android"] +android_native_activity = [ + "blue_engine_core?/android_native_activity", + "blue_engine_dynamic?/android_native_activity", +] +android_game_activity = [ + "blue_engine_core?/android_game_activity", + "blue_engine_dynamic?/android_game_activity", +] # using u16 for indices and others -u16 = [] +u16 = ["blue_engine_core?/u16", "blue_engine_dynamic?/u16"] # using u32 for indices and others -u32 = [] +u32 = ["blue_engine_core?/u32", "blue_engine_dynamic?/u32"] [dependencies] -image = { version = "0.25.2" } -pollster = "0.3" -winit = { version = "0.30.5", features = ["rwh_06"] } -wgpu = { version = "22.1.0" } -bytemuck = { version = "1.16", features = ["derive"] } -eyre = "0.6" -downcast = "0.11" -nalgebra-glm = "0.19" -# debug logs -env_logger = { version = "0.11", optional = true } -# android -log = { version = "0.4", optional = true } -android_logger = { version = "0.14", optional = true } - -[target.'cfg(target_arch = "wasm32")'.dependencies] -wgpu = { version = "22.1.0", features = ["webgl"] } - -# Smallest possible release build -# -#[profile.release] -#opt-level = "z" -#panic = "abort" -#lto = true -#codegen-units = 1 -#overflow-checks = false -#debug-assertions = false -#strip = "debuginfo" -#[profile.release.package."*"] -#opt-level = "z" -#codegen-units = 1 +blue_engine_core = { path = "crates/blue_engine_core", optional = true } + +# Wasm does not support dynamic linking. +[target.'cfg(not(target_family = "wasm"))'.dependencies] +blue_engine_dynamic = { path = "crates/blue_engine_dynamic", optional = true } # ========== EXAMPLES ========== # diff --git a/README.md b/README.md index 0f3e33b..0666b32 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ fn main() { let mut engine = Engine::new().expect("engine couldn't be initialized"); // create a triangle - triangle("my triangle", ObjectSettings::default(), &mut engine.renderer, &mut engine.objects).unwrap(); + triangle("my triangle", ObjectSettings::default(), &mut engine.renderer, &mut engine.objects); // run the engine engine diff --git a/crates/blue_engine_core/Cargo.toml b/crates/blue_engine_core/Cargo.toml new file mode 100644 index 0000000..0b95ed7 --- /dev/null +++ b/crates/blue_engine_core/Cargo.toml @@ -0,0 +1,39 @@ +[package] +name = "blue_engine_core" +version = "0.6.0" +authors = ["Elham Aryanpur "] +edition = "2021" +description = "General-Purpose, Easy-to-use, Fast, and Portable graphics engine" +license = "Apache-2.0" + +[lib] +name = "blue_engine_core" + +[features] +default = ["debug", "u16"] +debug = ["dep:env_logger"] +android = ["dep:log", "dep:android_logger"] +android_native_activity = ["winit/android-native-activity"] +android_game_activity = ["winit/android-game-activity"] +# using u16 for indices and others +u16 = [] +# using u32 for indices and others +u32 = [] + +[dependencies] +image = { version = "0.25.2" } +pollster = "0.4" +winit = { version = "0.30.5", features = ["rwh_06"] } +wgpu = { version = "23.0.1" } +bytemuck = { version = "1.16", features = ["derive"] } +downcast = "0.11" +nalgebra-glm = "0.19" +# debug logs +env_logger = { version = "0.11", optional = true } +# android +log = { version = "0.4", optional = true } +android_logger = { version = "0.14", optional = true } +thiserror = "2.0.9" + +[target.'cfg(target_arch = "wasm32")'.dependencies] +wgpu = { version = "23.0.1", features = ["webgl"] } diff --git a/src/definition.rs b/crates/blue_engine_core/src/definition.rs similarity index 87% rename from src/definition.rs rename to crates/blue_engine_core/src/definition.rs index 2e65e48..1edb7ff 100644 --- a/src/definition.rs +++ b/crates/blue_engine_core/src/definition.rs @@ -23,13 +23,13 @@ impl crate::header::Renderer { vertex_buffer: VertexBuffers, texture: Textures, uniform: Option, - ) -> eyre::Result { - Ok(Pipeline { + ) -> Pipeline { + Pipeline { shader: PipelineData::Data(shader), vertex_buffer: PipelineData::Data(vertex_buffer), texture: PipelineData::Data(texture), uniform: PipelineData::Data(uniform), - }) + } } /// Creates a shader group, the input must be spir-v compiled vertex and fragment shader @@ -39,7 +39,7 @@ impl crate::header::Renderer { shader_source: String, uniform_layout: Option<&BindGroupLayout>, settings: ShaderSettings, - ) -> eyre::Result { + ) -> Shaders { let shader = self .device .create_shader_module(wgpu::ShaderModuleDescriptor { @@ -70,13 +70,13 @@ impl crate::header::Renderer { layout: Some(&render_pipeline_layout), vertex: wgpu::VertexState { module: &shader, - entry_point: "vs_main", + entry_point: Some("vs_main"), buffers: &[Vertex::desc(), InstanceRaw::desc()], compilation_options: wgpu::PipelineCompilationOptions::default(), }, fragment: Some(wgpu::FragmentState { module: &shader, - entry_point: "fs_main", + entry_point: Some("fs_main"), targets: &[Some(wgpu::ColorTargetState { format: self.config.format, write_mask: wgpu::ColorWrites::ALL, @@ -110,7 +110,7 @@ impl crate::header::Renderer { cache: None, }); - Ok(render_pipeline) + render_pipeline } /// Creates a new texture data @@ -120,7 +120,7 @@ impl crate::header::Renderer { texture_data: TextureData, texture_mode: TextureMode, //texture_format: TextureFormat, - ) -> eyre::Result { + ) -> Result { let mode: wgpu::AddressMode = match texture_mode { TextureMode::Clamp => wgpu::AddressMode::Repeat, TextureMode::Repeat => wgpu::AddressMode::MirrorRepeat, @@ -128,11 +128,9 @@ impl crate::header::Renderer { }; let img = match texture_data { - TextureData::Bytes(data) => image::load_from_memory(data.as_slice()) - .unwrap_or_else(|_| panic!("Couldn't Load Image For Texture Of {}", name.as_str())), + TextureData::Bytes(data) => image::load_from_memory(data.as_slice())?, TextureData::Image(data) => data, - TextureData::Path(path) => image::open(path) - .unwrap_or_else(|_| panic!("Couldn't Load Image For Texture Of {}", name.as_str())), + TextureData::Path(path) => image::open(path)?, }; let rgba = img.to_rgba8(); @@ -261,26 +259,28 @@ impl crate::header::Renderer { pub fn build_uniform_buffer( &mut self, uniforms: &[wgpu::Buffer], - ) -> eyre::Result<(UniformBuffers, BindGroupLayout)> { + ) -> (UniformBuffers, BindGroupLayout) { let mut buffer_entry = Vec::::new(); let mut buffer_layout = Vec::::new(); for i in 0..uniforms.len() { - let descriptor = wgpu::BindGroupEntry { - binding: i as u32, - resource: uniforms.get(i).unwrap().as_entire_binding(), - }; - buffer_entry.push(descriptor); - buffer_layout.push(wgpu::BindGroupLayoutEntry { - binding: i as u32, - 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, - }); + if let Some(uniform) = uniforms.get(i) { + let descriptor = wgpu::BindGroupEntry { + binding: i as u32, + resource: uniform.as_entire_binding(), + }; + buffer_entry.push(descriptor); + buffer_layout.push(wgpu::BindGroupLayoutEntry { + binding: i as u32, + 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, + }); + } } let uniform_bind_group_layout = @@ -296,7 +296,7 @@ impl crate::header::Renderer { entries: buffer_entry.as_slice(), }); - Ok((uniform_bind_group, uniform_bind_group_layout)) + (uniform_bind_group, uniform_bind_group_layout) } /// Creates a new vertex buffer and indices @@ -304,7 +304,7 @@ impl crate::header::Renderer { &mut self, vertices: &Vec, indices: &Vec, - ) -> eyre::Result { + ) -> VertexBuffers { let vertex_buffer = self .device .create_buffer_init(&wgpu::util::BufferInitDescriptor { @@ -321,11 +321,11 @@ impl crate::header::Renderer { usage: wgpu::BufferUsages::INDEX, }); - Ok(VertexBuffers { + VertexBuffers { vertex_buffer, index_buffer, length: indices.len() as u32, - }) + } } /// Creates a new instance buffer for the object @@ -367,9 +367,8 @@ impl crate::SignalStorage { .find(|k| k.0 == key.as_string()) .map(|k| &mut k.1); - if event.is_some() { + if let Some(event) = event { // downcast the event - let event = event.unwrap(); let event_type = event.downcast_mut::(); Some(event_type) } else { diff --git a/crates/blue_engine_core/src/error.rs b/crates/blue_engine_core/src/error.rs new file mode 100644 index 0000000..40c9bbf --- /dev/null +++ b/crates/blue_engine_core/src/error.rs @@ -0,0 +1,25 @@ +#![allow(missing_docs)] + +use thiserror::Error; + +/// This enum contains errors that occurred in the engine. +#[derive(Error, Debug)] +pub enum Error { + // ===== WINIT + /// Errors that occur throughout the update_loop + #[error("An error occurred with the update loop: {0}")] + UpdateLoopError(#[from] winit::error::EventLoopError), + + // ===== WGPU + #[error("Failed to find an appropriate adapter")] + AdapterNotFound, + #[error("Failed to find an appropriate device for rendering")] + DeviceNotFound(#[from] wgpu::RequestDeviceError), + + // ===== Image + #[error("Failed to load the texture data from given source")] + LoadingTextureDataError(#[from] image::error::ImageError), + + #[error("{0}")] + Custom(String), +} diff --git a/src/header.rs b/crates/blue_engine_core/src/header.rs similarity index 100% rename from src/header.rs rename to crates/blue_engine_core/src/header.rs diff --git a/src/header/imports.rs b/crates/blue_engine_core/src/header/imports.rs similarity index 100% rename from src/header/imports.rs rename to crates/blue_engine_core/src/header/imports.rs diff --git a/src/header/uniform_buffer.rs b/crates/blue_engine_core/src/header/uniform_buffer.rs similarity index 100% rename from src/header/uniform_buffer.rs rename to crates/blue_engine_core/src/header/uniform_buffer.rs diff --git a/crates/blue_engine_core/src/lib.rs b/crates/blue_engine_core/src/lib.rs new file mode 100644 index 0000000..1be52d6 --- /dev/null +++ b/crates/blue_engine_core/src/lib.rs @@ -0,0 +1,84 @@ +/* + * Blue Engine by Elham Aryanpur + * + * The license is same as the one on the root. +*/ + +#![warn(missing_docs)] +#![allow(clippy::needless_doctest_main)] + +//! +//! +//! # Blue Engine +//! +//! Blue Engine is an easy to use, portable, and extendable/customizable graphics engine. Here +//! lives the documentation for the engine. +//! +//! ## Setup +//! +//! The setup and installation details live in the project's [guide](https://aryanpurtech.github.io/BlueEngineDocs/). +//! A basic program in Blue Engine is as follow: +//! +//! ## Example +//! +//! ```rust +//! use blue_engine::{ +//! header::{ Engine, ObjectSettings }, +//! primitive_shapes::triangle +//! }; +//! +//! fn main() { +//! // initialize the engine +//! let mut engine = Engine::new(); +//! +//! // create a triangle +//! triangle("my triangle", ObjectSettings::default(), &mut engine.renderer, &mut engine.objects); +//! +//! // run the engine +//! engine +//! .update_loop(move |_, _, _, _, _, _| {}); +//! } +//! ``` +//! +//! ## Utilities +//! +//! This crate is the core of the engine, but there is also [utilities crate](https://github.com/AryanpurTech/BlueEngineUtilities) +//! which have a lot of utilities for the engine such as lighting, physics, etc. +//! +//! ## Guide for code navigation +//! +//! The code of the engine is organized in a rather different manner than traditional in the +//! language. There are inspirations from other languages to make it easier to navigate the +//! project. +//! +//! ## Older hardware +//! +//! The engine uses WGPU under the hood for rendering. WGPU by nature is designed for modern hardware, so if you have or want to +//! target older hardware, you might need to add a couple more things to WindowDescriptor during Engine::new_config: +//! +//! 1) set a backend that targets your older hardware, such as GL using the backends field: `backend: blue_engine::wgpu::Backends::GL` +//! 2) experiement with the limits field, which describes what features you need. `limits: blue_engine::wgpu::Limits::default()`. there +//! are three options for limits: `default` for normal hardware, `downlevel_defaults` which are compatible with GLES-3 and D3D-11, or +//! `downlevel_webgl2_defaults` which is also compatible with WebGL2, and the lowest level for limits and can support very old hardware. +//! +//! with these two changes, hopefully you can get Blue Engine to run on older hardware. If not, please let me know so I can help you further. + +pub(crate) mod definition; +/// interal error definitions of the engine +pub mod error; +/// contains all the declarations such as structs, exports, enums, ... +pub mod header; +/// contains the definition for Object type, which is a type that make it easier to manage data for rendering. +pub mod objects; +/// contains definition for some 2D and 3D shapes. They are basic shapes and +/// can be used as examples of how to create your own content. +pub mod primitive_shapes; +/// contains definition for rendering part of the engine. +pub mod render; +/// Utilities for the engine (soon moving to it's own +/// [crate](https://github.com/AryanpurTech/BlueEngineUtilities)). +pub mod utils; +/// contains definition for creation of window and instance creation. +pub mod window; +#[doc(inline)] +pub use crate::header::*; diff --git a/src/objects.rs b/crates/blue_engine_core/src/objects.rs similarity index 90% rename from src/objects.rs rename to crates/blue_engine_core/src/objects.rs index 992a084..022004d 100644 --- a/src/objects.rs +++ b/crates/blue_engine_core/src/objects.rs @@ -29,8 +29,8 @@ impl Renderer { vertices: Vec, indices: Vec, settings: ObjectSettings, - ) -> eyre::Result { - let vertex_buffer = self.build_vertex_buffer(&vertices, &indices)?; + ) -> Result { + let vertex_buffer = self.build_vertex_buffer(&vertices, &indices); let uniform = self.build_uniform_buffer(&vec![ self.build_uniform_buffer_part("Transformation Matrix", DEFAULT_MATRIX_4), @@ -40,7 +40,7 @@ impl Renderer { data: crate::utils::default_resources::DEFAULT_COLOR, }, ), - ])?; + ]); let shader_source = ShaderBuilder::new(DEFAULT_SHADER.to_string(), settings.camera_effect.clone()); @@ -50,7 +50,7 @@ impl Renderer { shader_source.shader.clone(), Some(&uniform.1), settings.shader_settings, - )?; + ); let texture = self.build_texture( "Default Texture", @@ -120,27 +120,21 @@ impl ObjectStorage { indices: Vec, settings: ObjectSettings, renderer: &mut Renderer, - ) -> eyre::Result<()> { - self.add_object( - name.clone(), - renderer.build_object(name.clone(), vertices, indices, settings)?, - )?; - - Ok(()) + ) { + match renderer.build_object(name.clone(), vertices, indices, settings) { + Ok(object) => self.add_object(name.clone(), object), + Err(e) => { + eprintln!("Could not create a new Object: {e:#?}"); + } + } } /// Adds an object to the storage - pub fn add_object(&mut self, key: impl StringBuffer, object: Object) -> eyre::Result<()> { - fn add_object_inner( - object_storage: &mut ObjectStorage, - key: String, - object: Object, - ) -> eyre::Result<()> { + pub fn add_object(&mut self, key: impl StringBuffer, object: Object) { + fn add_object_inner(object_storage: &mut ObjectStorage, key: String, object: Object) { object_storage.insert(key, object); - - Ok(()) } - add_object_inner(self, key.as_string(), object) + add_object_inner(self, key.as_string(), object); } /// Allows for safe update of objects @@ -400,84 +394,76 @@ impl Object { } /// Update and apply changes done to an object - pub fn update(&mut self, renderer: &mut Renderer) -> eyre::Result<()> { - self.update_vertex_buffer(renderer)?; - self.update_uniform_buffer(renderer)?; - self.update_shader(renderer)?; - self.update_instance_buffer(renderer)?; + pub fn update(&mut self, renderer: &mut Renderer) { + self.update_vertex_buffer(renderer); + self.update_uniform_buffer(renderer); + self.update_shader(renderer); + self.update_instance_buffer(renderer); self.changed = false; - Ok(()) } /// Update and apply changes done to an object and returns a pipeline pub fn update_and_return( &mut self, renderer: &mut Renderer, - ) -> eyre::Result<(crate::VertexBuffers, crate::UniformBuffers, crate::Shaders)> { - let vertex_buffer = self.update_vertex_buffer_and_return(renderer)?; - let uniform_buffer = self.update_uniform_buffer_and_return(renderer)?; - let shader = self.update_shader_and_return(renderer)?; + ) -> (crate::VertexBuffers, crate::UniformBuffers, crate::Shaders) { + let vertex_buffer = self.update_vertex_buffer_and_return(renderer); + let uniform_buffer = self.update_uniform_buffer_and_return(renderer); + let shader = self.update_shader_and_return(renderer); self.changed = false; - Ok((vertex_buffer, uniform_buffer, shader)) + (vertex_buffer, uniform_buffer, shader) } /// Update and apply changes done to the vertex buffer - pub fn update_vertex_buffer(&mut self, renderer: &mut Renderer) -> eyre::Result<()> { - let updated_buffer = renderer.build_vertex_buffer(&self.vertices, &self.indices)?; + pub fn update_vertex_buffer(&mut self, renderer: &mut Renderer) { + let updated_buffer = renderer.build_vertex_buffer(&self.vertices, &self.indices); self.pipeline.vertex_buffer = PipelineData::Data(updated_buffer); - - Ok(()) } /// Returns the buffer with ownership pub fn update_vertex_buffer_and_return( &mut self, renderer: &mut Renderer, - ) -> eyre::Result { - let updated_buffer = renderer.build_vertex_buffer(&self.vertices, &self.indices)?; - let updated_buffer_2 = renderer.build_vertex_buffer(&self.vertices, &self.indices)?; + ) -> crate::VertexBuffers { + let updated_buffer = renderer.build_vertex_buffer(&self.vertices, &self.indices); + let updated_buffer_2 = renderer.build_vertex_buffer(&self.vertices, &self.indices); self.pipeline.vertex_buffer = PipelineData::Data(updated_buffer); - Ok(updated_buffer_2) + updated_buffer_2 } /// Update and apply changes done to the shader - pub fn update_shader(&mut self, renderer: &mut Renderer) -> eyre::Result<()> { + pub fn update_shader(&mut self, renderer: &mut Renderer) { let updated_shader = renderer.build_shader( self.name.as_ref(), self.shader_builder.shader.clone(), Some(&self.uniform_layout), self.shader_settings, - )?; + ); self.pipeline.shader = PipelineData::Data(updated_shader); - - Ok(()) } /// Returns the buffer with ownership - pub fn update_shader_and_return( - &mut self, - renderer: &mut Renderer, - ) -> eyre::Result { + pub fn update_shader_and_return(&mut self, renderer: &mut Renderer) -> crate::Shaders { let updated_shader = renderer.build_shader( self.name.as_ref(), self.shader_builder.shader.clone(), Some(&self.uniform_layout), self.shader_settings, - )?; + ); let updated_shader2 = renderer.build_shader( self.name.as_ref(), self.shader_builder.shader.clone(), Some(&self.uniform_layout), self.shader_settings, - )?; + ); self.pipeline.shader = PipelineData::Data(updated_shader); - Ok(updated_shader2) + updated_shader2 } /// Update and apply changes done to the uniform buffer - pub fn update_uniform_buffer(&mut self, renderer: &mut Renderer) -> eyre::Result<()> { + pub fn update_uniform_buffer(&mut self, renderer: &mut Renderer) { self.uniform_buffers[0] = renderer.build_uniform_buffer_part( "Transformation Matrix", uniform_type::Matrix::from_im( @@ -486,19 +472,17 @@ impl Object { ); self.uniform_buffers[1] = renderer.build_uniform_buffer_part("Color", self.color); - let updated_buffer = renderer.build_uniform_buffer(&self.uniform_buffers)?; + let updated_buffer = renderer.build_uniform_buffer(&self.uniform_buffers); self.pipeline.uniform = PipelineData::Data(Some(updated_buffer.0)); self.uniform_layout = updated_buffer.1; - - Ok(()) } /// Returns the buffer with ownership pub fn update_uniform_buffer_and_return( &mut self, renderer: &mut Renderer, - ) -> eyre::Result { + ) -> crate::UniformBuffers { self.uniform_buffers[0] = renderer.build_uniform_buffer_part( "Transformation Matrix", uniform_type::Matrix::from_im( @@ -507,17 +491,17 @@ impl Object { ); self.uniform_buffers[1] = renderer.build_uniform_buffer_part("Color", self.color); - let updated_buffer = renderer.build_uniform_buffer(&self.uniform_buffers)?; - let updated_buffer2 = renderer.build_uniform_buffer(&self.uniform_buffers)?; + let updated_buffer = renderer.build_uniform_buffer(&self.uniform_buffers); + let updated_buffer2 = renderer.build_uniform_buffer(&self.uniform_buffers); self.pipeline.uniform = PipelineData::Data(Some(updated_buffer.0)); self.uniform_layout = updated_buffer.1; - Ok(updated_buffer2.0) + updated_buffer2.0 } /// Updates the instance buffer - pub fn update_instance_buffer(&mut self, renderer: &mut Renderer) -> eyre::Result<()> { + pub fn update_instance_buffer(&mut self, renderer: &mut Renderer) { let instance_data = self .instances .iter() @@ -525,14 +509,10 @@ impl Object { .collect::>(); let instance_buffer = renderer.build_instance(instance_data); self.instance_buffer = instance_buffer; - Ok(()) } /// Returns the buffer with ownership - pub fn update_instance_buffer_and_return( - &mut self, - renderer: &mut Renderer, - ) -> eyre::Result { + pub fn update_instance_buffer_and_return(&mut self, renderer: &mut Renderer) -> wgpu::Buffer { let instance_data = self .instances .iter() @@ -542,7 +522,7 @@ impl Object { let instance_buffer2 = renderer.build_instance(instance_data); self.instance_buffer = instance_buffer; - Ok(instance_buffer2) + instance_buffer2 } // ============================= FOR COPY OF PIPELINES ============================= diff --git a/src/primitive_shapes.rs b/crates/blue_engine_core/src/primitive_shapes.rs similarity index 100% rename from src/primitive_shapes.rs rename to crates/blue_engine_core/src/primitive_shapes.rs diff --git a/src/primitive_shapes/three_dimensions.rs b/crates/blue_engine_core/src/primitive_shapes/three_dimensions.rs similarity index 97% rename from src/primitive_shapes/three_dimensions.rs rename to crates/blue_engine_core/src/primitive_shapes/three_dimensions.rs index 6ba93a6..4e4d26a 100644 --- a/src/primitive_shapes/three_dimensions.rs +++ b/crates/blue_engine_core/src/primitive_shapes/three_dimensions.rs @@ -2,11 +2,7 @@ use crate::{ObjectSettings, ObjectStorage, Renderer, StringBuffer, UnsignedIntTy use std::f32::consts::PI; /// Creates a 3D cube -pub fn cube( - name: impl StringBuffer, - renderer: &mut Renderer, - objects: &mut ObjectStorage, -) -> eyre::Result<()> { +pub fn cube(name: impl StringBuffer, renderer: &mut Renderer, objects: &mut ObjectStorage) { objects.new_object( name.clone(), vec![ @@ -147,9 +143,7 @@ pub fn cube( ], ObjectSettings::default(), renderer, - )?; - - Ok(()) + ); } /// Create a 3D UV Sphere @@ -163,7 +157,7 @@ pub fn uv_sphere( details: (usize, usize, f32), renderer: &mut Renderer, objects: &mut ObjectStorage, -) -> eyre::Result<()> { +) { let sectors = details.1 as f32; let stacks = details.0 as f32; let length_inv = 1. / details.2; @@ -215,7 +209,5 @@ pub fn uv_sphere( indices, ObjectSettings::default(), renderer, - )?; - - Ok(()) + ); } diff --git a/src/primitive_shapes/two_dimensions.rs b/crates/blue_engine_core/src/primitive_shapes/two_dimensions.rs similarity index 95% rename from src/primitive_shapes/two_dimensions.rs rename to crates/blue_engine_core/src/primitive_shapes/two_dimensions.rs index 9d010e0..f65af9c 100644 --- a/src/primitive_shapes/two_dimensions.rs +++ b/crates/blue_engine_core/src/primitive_shapes/two_dimensions.rs @@ -15,7 +15,7 @@ pub fn triangle( settings: ObjectSettings, renderer: &mut Renderer, objects: &mut ObjectStorage, -) -> eyre::Result<()> { +) { objects.new_object( name.clone(), vec![ @@ -38,9 +38,7 @@ pub fn triangle( vec![0, 1, 2], settings, renderer, - )?; - - Ok(()) + ); } /// Creates a 2D square @@ -49,7 +47,7 @@ pub fn square( settings: ObjectSettings, renderer: &mut Renderer, objects: &mut ObjectStorage, -) -> eyre::Result<()> { +) { objects.new_object( name.clone(), vec![ @@ -77,9 +75,7 @@ pub fn square( vec![2, 1, 0, 2, 0, 3], settings, renderer, - )?; - - Ok(()) + ); } /// Create a 2D rectangle based on a width and height @@ -90,7 +86,7 @@ pub fn rectangle( settings: ObjectSettings, renderer: &mut Renderer, objects: &mut ObjectStorage, -) -> eyre::Result<()> { +) { objects.new_object( name.clone(), vec![ @@ -118,7 +114,5 @@ pub fn rectangle( vec![2, 1, 0, 2, 0, 3], settings, renderer, - )?; - - Ok(()) + ); } diff --git a/src/render.rs b/crates/blue_engine_core/src/render.rs similarity index 57% rename from src/render.rs rename to crates/blue_engine_core/src/render.rs index 8824362..5294e3c 100644 --- a/src/render.rs +++ b/crates/blue_engine_core/src/render.rs @@ -21,153 +21,158 @@ impl Renderer { pub(crate) async fn new( size: winit::dpi::PhysicalSize, settings: crate::WindowDescriptor, - ) -> eyre::Result { + ) -> Result { // The instance is a handle to our GPU let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { backends: settings.backends, ..Default::default() }); - let adapter = instance + match instance .request_adapter(&wgpu::RequestAdapterOptions { power_preference: settings.power_preference, compatible_surface: None, force_fallback_adapter: false, }) .await - .expect("Failed to find an appropriate adapter"); - - let (device, queue) = adapter - .request_device( - &wgpu::DeviceDescriptor { - label: Some("Device"), - required_features: settings.features, - required_limits: settings.limits, - memory_hints: wgpu::MemoryHints::Performance, - }, - None, // Trace path - ) - .await - .expect("Failed to create device"); - - let texture_format = wgpu::TextureFormat::Bgra8UnormSrgb; - - #[cfg(target_os = "android")] - let texture_format = wgpu::TextureFormat::Rgba8UnormSrgb; - - let config = wgpu::SurfaceConfiguration { - usage: wgpu::TextureUsages::RENDER_ATTACHMENT, - format: texture_format, //wgpu::TextureFormat::Bgra8UnormSrgb, - #[cfg(target_os = "android")] - width: 1080, - #[cfg(not(feature = "android"))] - width: size.width, - #[cfg(target_os = "android")] - height: 2300, - #[cfg(not(target_os = "android"))] - height: size.height, - #[cfg(target_os = "android")] - present_mode: wgpu::PresentMode::Mailbox, - #[cfg(not(target_os = "android"))] - present_mode: settings.present_mode, - alpha_mode: settings.alpha_mode, - view_formats: vec![texture_format], - desired_maximum_frame_latency: settings.desired_maximum_frame_latency, - }; - - let texture_bind_group_layout = - device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { - entries: &[ - wgpu::BindGroupLayoutEntry { - binding: 0, - visibility: wgpu::ShaderStages::FRAGMENT, - ty: wgpu::BindingType::Texture { - sample_type: wgpu::TextureSampleType::Float { filterable: true }, - view_dimension: wgpu::TextureViewDimension::D2, - multisampled: false, + { + Some(adapter) => { + let (device, queue) = adapter + .request_device( + &wgpu::DeviceDescriptor { + label: Some("Device"), + required_features: settings.features, + required_limits: settings.limits, + memory_hints: wgpu::MemoryHints::Performance, }, - count: None, - }, - wgpu::BindGroupLayoutEntry { - binding: 1, - visibility: wgpu::ShaderStages::FRAGMENT, - ty: wgpu::BindingType::Sampler(wgpu::SamplerBindingType::Filtering), //comparison: false, - // filtering: true, - count: None, - }, - ], - label: Some("texture_bind_group_layout"), - }); - - let default_uniform_bind_group_layout = - device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { - label: Some("uniform dynamic bind group layout"), - entries: &[wgpu::BindGroupLayoutEntry { - binding: 0, - 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, - }], - }); - - let depth_buffer = Renderer::build_depth_buffer("Depth Buffer", &device, &config); - - let mut renderer = Self { - instance, - adapter, - surface: None, - device, - queue, - config, - size, - - texture_bind_group_layout, - default_uniform_bind_group_layout, - depth_buffer, - - default_data: None, - camera: None, - clear_color: wgpu::Color::BLACK, - scissor_rect: None, - }; - - renderer.build_default_data()?; - - Ok(renderer) + None, // Trace path + ) + .await?; + + let texture_format = wgpu::TextureFormat::Bgra8UnormSrgb; + + #[cfg(target_os = "android")] + let texture_format = wgpu::TextureFormat::Rgba8UnormSrgb; + + let config = wgpu::SurfaceConfiguration { + usage: wgpu::TextureUsages::RENDER_ATTACHMENT, + format: texture_format, //wgpu::TextureFormat::Bgra8UnormSrgb, + #[cfg(target_os = "android")] + width: 1080, + #[cfg(not(feature = "android"))] + width: size.width, + #[cfg(target_os = "android")] + height: 2300, + #[cfg(not(target_os = "android"))] + height: size.height, + #[cfg(target_os = "android")] + present_mode: wgpu::PresentMode::Mailbox, + #[cfg(not(target_os = "android"))] + present_mode: settings.present_mode, + alpha_mode: settings.alpha_mode, + view_formats: vec![texture_format], + desired_maximum_frame_latency: settings.desired_maximum_frame_latency, + }; + + let texture_bind_group_layout = + device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { + entries: &[ + wgpu::BindGroupLayoutEntry { + binding: 0, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Texture { + sample_type: wgpu::TextureSampleType::Float { + filterable: true, + }, + view_dimension: wgpu::TextureViewDimension::D2, + multisampled: false, + }, + count: None, + }, + wgpu::BindGroupLayoutEntry { + binding: 1, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Sampler(wgpu::SamplerBindingType::Filtering), //comparison: false, + // filtering: true, + count: None, + }, + ], + label: Some("texture_bind_group_layout"), + }); + + let default_uniform_bind_group_layout = + device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { + label: Some("uniform dynamic bind group layout"), + entries: &[wgpu::BindGroupLayoutEntry { + binding: 0, + 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, + }], + }); + + let depth_buffer = Renderer::build_depth_buffer("Depth Buffer", &device, &config); + + let mut renderer = Self { + instance, + adapter, + surface: None, + device, + queue, + config, + size, + + texture_bind_group_layout, + default_uniform_bind_group_layout, + depth_buffer, + + default_data: None, + camera: None, + clear_color: wgpu::Color::BLACK, + scissor_rect: None, + }; + + renderer.build_default_data(); + + Ok(renderer) + } + None => Err(crate::error::Error::AdapterNotFound), + } } - pub(crate) fn build_default_data(&mut self) -> eyre::Result<()> { - let default_texture = self.build_texture( + pub(crate) fn build_default_data(&mut self) { + if let Ok(default_texture) = self.build_texture( "Default Texture", TextureData::Bytes(DEFAULT_TEXTURE.to_vec()), crate::header::TextureMode::Clamp, //crate::header::TextureFormat::PNG - )?; - - let default_uniform = self.build_uniform_buffer(&vec![ - self.build_uniform_buffer_part("Transformation Matrix", DEFAULT_MATRIX_4), - self.build_uniform_buffer_part( - "Color", - uniform_type::Array4 { - data: DEFAULT_COLOR, - }, - ), - ])?; - - let default_shader = self.build_shader( - "Default Shader", - DEFAULT_SHADER.to_string(), - Some(&default_uniform.1), - ShaderSettings::default(), - )?; + ) { + let default_uniform = self.build_uniform_buffer(&vec![ + self.build_uniform_buffer_part("Transformation Matrix", DEFAULT_MATRIX_4), + self.build_uniform_buffer_part( + "Color", + uniform_type::Array4 { + data: DEFAULT_COLOR, + }, + ), + ]); - self.default_data = Some((default_texture, default_shader, default_uniform.0)); + let default_shader = self.build_shader( + "Default Shader", + DEFAULT_SHADER.to_string(), + Some(&default_uniform.1), + ShaderSettings::default(), + ); - Ok(()) + self.default_data = Some((default_texture, default_shader, default_uniform.0)); + } else { + eprintln!("Could not build the default texture, there may be something wrong!"); + self.default_data = None; + } } /// Resize the window. @@ -180,12 +185,8 @@ impl Renderer { self.config.width = new_size.width; self.config.height = new_size.height; #[cfg(not(target_os = "android"))] - if self.surface.is_some() { - self.surface - .as_ref() - .expect("Couldn't get the surface for resizing") - .configure(&self.device, &self.config); - + if let Some(surface) = self.surface.as_ref() { + surface.configure(&self.device, &self.config); { self.depth_buffer = Self::build_depth_buffer("Depth Buffer", &self.device, &self.config); @@ -256,8 +257,7 @@ impl Renderer { occlusion_query_set: None, }); - if self.scissor_rect.is_some() { - let scissor_rect = self.scissor_rect.unwrap(); + if let Some(scissor_rect) = self.scissor_rect { // check if scissor bounds are smaller than the window if scissor_rect.0 + scissor_rect.2 < window_size.width && scissor_rect.1 + scissor_rect.3 < window_size.height @@ -271,10 +271,10 @@ impl Renderer { } } - let default_data = self.default_data.as_ref().unwrap(); - - render_pass.set_bind_group(0, &default_data.0, &[]); - render_pass.set_pipeline(&default_data.1); + if let Some(default_data) = self.default_data.as_ref() { + render_pass.set_bind_group(0, &default_data.0, &[]); + render_pass.set_pipeline(&default_data.1); + } // sort the object list in descending render order let mut object_list: Vec<_> = objects.iter().collect(); @@ -282,13 +282,13 @@ impl Renderer { for (_, i) in object_list { if let Some(camera_data) = i.camera_effect.as_ref() { - render_pass.set_bind_group( - 1, - &camera.get(camera_data.as_ref()).unwrap().uniform_data, - &[], - ); + if let Some(camera) = camera.get(camera_data.as_ref()) { + render_pass.set_bind_group(1, &camera.uniform_data, &[]); + } } else { - render_pass.set_bind_group(1, &camera.get("main").unwrap().uniform_data, &[]); + if let Some(main_camera) = camera.get("main") { + render_pass.set_bind_group(1, &main_camera.uniform_data, &[]); + } } if i.is_visible { @@ -298,8 +298,7 @@ impl Renderer { let uniform = get_pipeline_uniform_buffer(&i.pipeline.uniform, objects); // vertex - if vertex_buffer.is_some() { - let vertex_buffer = vertex_buffer.unwrap(); + if let Some(vertex_buffer) = vertex_buffer { render_pass.set_vertex_buffer(0, vertex_buffer.vertex_buffer.slice(..)); render_pass.set_vertex_buffer(1, i.instance_buffer.slice(..)); render_pass.set_index_buffer( @@ -336,16 +335,10 @@ impl Renderer { /// # Arguments /// * `encoder` - The command encoder. /// * `frame` - The surface texture. - pub(crate) fn render( - &mut self, - encoder: wgpu::CommandEncoder, - frame: wgpu::SurfaceTexture, - ) -> Result<(), wgpu::SurfaceError> { + pub(crate) fn render(&mut self, encoder: wgpu::CommandEncoder, frame: wgpu::SurfaceTexture) { // submit will accept anything that implements IntoIter self.queue.submit(std::iter::once(encoder.finish())); frame.present(); - - Ok(()) } /// Sets the background color diff --git a/src/utils.rs b/crates/blue_engine_core/src/utils.rs similarity index 100% rename from src/utils.rs rename to crates/blue_engine_core/src/utils.rs diff --git a/src/utils/camera.rs b/crates/blue_engine_core/src/utils/camera.rs similarity index 55% rename from src/utils/camera.rs rename to crates/blue_engine_core/src/utils/camera.rs index 0912434..055cb78 100644 --- a/src/utils/camera.rs +++ b/crates/blue_engine_core/src/utils/camera.rs @@ -8,17 +8,16 @@ use crate::{ header::{uniform_type::Matrix, Camera, Renderer}, CameraContainer, Projection, }; -use eyre::Result; use winit::dpi::PhysicalSize; use super::default_resources::{DEFAULT_MATRIX_4, OPENGL_TO_WGPU_MATRIX}; impl Camera { /// Creates a new camera. this should've been automatically done at the time of creating an engine - pub fn new(window_size: PhysicalSize, renderer: &mut Renderer) -> Result { + pub fn new(window_size: PhysicalSize, renderer: &mut Renderer) -> Self { let camera_uniform = renderer.build_uniform_buffer(&[ renderer.build_uniform_buffer_part("Camera Uniform", DEFAULT_MATRIX_4) - ])?; + ]); let mut camera = Self { position: nalgebra_glm::vec3(0.0, 0.0, 3.0), @@ -35,23 +34,21 @@ impl Camera { uniform_data: camera_uniform.0, add_position_and_target: false, }; - camera.build_view_projection_matrix()?; + camera.build_view_projection_matrix(); - Ok(camera) + camera } /// Updates the view uniform matrix that decides how camera works - pub fn build_view_projection_matrix(&mut self) -> Result<()> { + pub fn build_view_projection_matrix(&mut self) { let view = self.build_view_matrix(); let proj = self.build_projection_matrix(); self.view_data = OPENGL_TO_WGPU_MATRIX * proj * view; self.changed = true; - - Ok(()) } /// Updates the view uniform matrix that decides how camera works - pub fn build_view_orthographic_matrix(&mut self) -> Result<()> { + pub fn build_view_orthographic_matrix(&mut self) { let view = self.build_view_matrix(); let ortho = nalgebra_glm::ortho( 0f32, @@ -63,69 +60,53 @@ impl Camera { ); self.view_data = ortho * view; self.changed = true; - - Ok(()) } /// Returns a matrix uniform buffer from camera data that can be sent to GPU - pub fn camera_uniform_buffer(&self) -> Result { - Ok(Matrix::from_im(self.view_data)) + pub fn camera_uniform_buffer(&self) -> Matrix { + Matrix::from_im(self.view_data) } /// Sets the position of camera - pub fn set_position(&mut self, x: f32, y: f32, z: f32) -> Result<()> { + pub fn set_position(&mut self, x: f32, y: f32, z: f32) { self.position = nalgebra_glm::vec3(x, y, z); - self.build_view_projection_matrix()?; - - Ok(()) + self.build_view_projection_matrix(); } /// Sets the target of camera - pub fn set_target(&mut self, x: f32, y: f32, z: f32) -> Result<()> { + pub fn set_target(&mut self, x: f32, y: f32, z: f32) { self.target = nalgebra_glm::vec3(x, y, z); - self.build_view_projection_matrix()?; - - Ok(()) + self.build_view_projection_matrix(); } /// Sets the up of camera - pub fn set_up(&mut self, x: f32, y: f32, z: f32) -> Result<()> { + pub fn set_up(&mut self, x: f32, y: f32, z: f32) { self.up = nalgebra_glm::vec3(x, y, z); - self.build_view_projection_matrix()?; - - Ok(()) + self.build_view_projection_matrix(); } /// Sets how far camera can look - pub fn set_far(&mut self, new_far: f32) -> Result<()> { + pub fn set_far(&mut self, new_far: f32) { self.far = new_far; - self.build_view_projection_matrix()?; - - Ok(()) + self.build_view_projection_matrix(); } /// Sets how near the camera can look - pub fn set_near(&mut self, new_near: f32) -> Result<()> { + pub fn set_near(&mut self, new_near: f32) { self.near = new_near; - self.build_view_projection_matrix()?; - - Ok(()) + self.build_view_projection_matrix(); } /// Sets the aspect ratio of the camera - pub fn set_resolution(&mut self, window_size: PhysicalSize) -> Result<()> { + pub fn set_resolution(&mut self, window_size: PhysicalSize) { self.resolution = (window_size.width as f32, window_size.height as f32); - self.build_view_projection_matrix()?; - - Ok(()) + self.build_view_projection_matrix(); } /// Sets the projection of the camera - pub fn set_projection(&mut self, projection: Projection) -> Result<()> { + pub fn set_projection(&mut self, projection: Projection) { self.projection = projection; - self.build_view_projection_matrix()?; - - Ok(()) + self.build_view_projection_matrix(); } /// Enables adding position and target for the view target @@ -134,38 +115,29 @@ impl Camera { } /// This builds a uniform buffer data from camera view data that is sent to the GPU in next frame - pub fn update_view_projection(&mut self, renderer: &mut Renderer) -> Result<()> { + pub fn update_view_projection(&mut self, renderer: &mut Renderer) { if self.changed { let updated_buffer = renderer - .build_uniform_buffer(&[renderer.build_uniform_buffer_part( - "Camera Uniform", - self.camera_uniform_buffer() - .expect("Couldn't build camera projection"), - )]) - .expect("Couldn't update the camera uniform buffer") + .build_uniform_buffer(&[renderer + .build_uniform_buffer_part("Camera Uniform", self.camera_uniform_buffer())]) .0; self.uniform_data = updated_buffer; self.changed = false; } - - Ok(()) } /// This builds a uniform buffer data from camera view data that is sent to the GPU in next frame, and returns the bindgroup pub fn update_view_projection_and_return( &mut self, renderer: &mut Renderer, - ) -> Result { + ) -> crate::UniformBuffers { let updated_buffer = renderer - .build_uniform_buffer(&[renderer.build_uniform_buffer_part( - "Camera Uniform", - self.camera_uniform_buffer() - .expect("Couldn't build camera projection"), - )]) - .expect("Couldn't update the camera uniform buffer") + .build_uniform_buffer(&[ + renderer.build_uniform_buffer_part("Camera Uniform", self.camera_uniform_buffer()) + ]) .0; - Ok(updated_buffer) + updated_buffer } /// Builds a view matrix for camera projection @@ -206,109 +178,112 @@ impl Camera { impl CameraContainer { /// Creates new CameraContainer with one main camera - pub fn new(window_size: PhysicalSize, renderer: &mut Renderer) -> eyre::Result { + pub fn new(window_size: PhysicalSize, renderer: &mut Renderer) -> Self { let mut cameras = std::collections::HashMap::new(); - let main_camera = Camera::new(window_size, renderer)?; + let main_camera = Camera::new(window_size, renderer); cameras.insert("main".into(), main_camera); - Ok(CameraContainer { cameras }) + CameraContainer { cameras } } /// Updates the view uniform matrix that decides how camera works - pub fn build_view_projection_matrix(&mut self) -> eyre::Result<()> { - self.cameras - .get_mut("main") - .unwrap() - .build_view_projection_matrix()?; - Ok(()) + pub fn build_view_projection_matrix(&mut self) { + if let Some(main_camera) = self.cameras.get_mut("main") { + main_camera.build_view_projection_matrix(); + } } /// Updates the view uniform matrix that decides how camera works - pub fn build_view_orthographic_matrix(&mut self) -> eyre::Result<()> { - self.cameras - .get_mut("main") - .unwrap() - .build_view_orthographic_matrix()?; - Ok(()) + pub fn build_view_orthographic_matrix(&mut self) { + if let Some(main_camera) = self.cameras.get_mut("main") { + main_camera.build_view_orthographic_matrix(); + } } /// Returns a matrix uniform buffer from camera data that can be sent to GPU - pub fn camera_uniform_buffer(&self) -> eyre::Result { - Ok(Matrix::from_im(self.cameras.get("main").unwrap().view_data)) + pub fn camera_uniform_buffer(&self) -> Option { + if let Some(main_camera) = self.cameras.get("main") { + Some(Matrix::from_im(main_camera.view_data)) + } else { + None + } } /// Sets the position of camera - pub fn set_position(&mut self, x: f32, y: f32, z: f32) -> eyre::Result<()> { - self.cameras - .get_mut("main") - .unwrap() - .set_position(x, y, z)?; - Ok(()) + pub fn set_position(&mut self, x: f32, y: f32, z: f32) { + if let Some(main_camera) = self.cameras.get_mut("main") { + main_camera.set_position(x, y, z); + } } /// Sets the target of camera - pub fn set_target(&mut self, x: f32, y: f32, z: f32) -> eyre::Result<()> { - self.cameras.get_mut("main").unwrap().set_target(x, y, z)?; - Ok(()) + pub fn set_target(&mut self, x: f32, y: f32, z: f32) { + if let Some(main_camera) = self.cameras.get_mut("main") { + main_camera.set_target(x, y, z); + } } /// Sets the up of camera - pub fn set_up(&mut self, x: f32, y: f32, z: f32) -> eyre::Result<()> { - self.cameras.get_mut("main").unwrap().set_up(x, y, z)?; - Ok(()) + pub fn set_up(&mut self, x: f32, y: f32, z: f32) { + if let Some(main_camera) = self.cameras.get_mut("main") { + main_camera.set_up(x, y, z); + } } /// Sets how far camera can look - pub fn set_far(&mut self, new_far: f32) -> eyre::Result<()> { - self.cameras.get_mut("main").unwrap().set_far(new_far)?; - Ok(()) + pub fn set_far(&mut self, new_far: f32) { + if let Some(main_camera) = self.cameras.get_mut("main") { + main_camera.set_far(new_far); + } } /// Sets how near the camera can look - pub fn set_near(&mut self, new_near: f32) -> eyre::Result<()> { - self.cameras.get_mut("main").unwrap().set_near(new_near)?; - Ok(()) + pub fn set_near(&mut self, new_near: f32) { + if let Some(main_camera) = self.cameras.get_mut("main") { + main_camera.set_near(new_near); + } } /// Sets the aspect ratio of the camera - pub fn set_resolution(&mut self, window_size: PhysicalSize) -> eyre::Result<()> { - self.cameras - .get_mut("main") - .unwrap() - .set_resolution(window_size)?; - Ok(()) + pub fn set_resolution(&mut self, window_size: PhysicalSize) { + if let Some(main_camera) = self.cameras.get_mut("main") { + main_camera.set_resolution(window_size); + } } /// Sets the projection of the camera - pub fn set_projection(&mut self, projection: Projection) -> eyre::Result<()> { - self.cameras - .get_mut("main") - .unwrap() - .set_projection(projection)?; - Ok(()) + pub fn set_projection(&mut self, projection: Projection) { + if let Some(main_camera) = self.cameras.get_mut("main") { + main_camera.set_projection(projection); + } } /// Enables adding position and target for the view target pub fn add_position_and_target(&mut self, enable: bool) { - self.cameras - .get_mut("main") - .unwrap() - .add_position_and_target(enable); + if let Some(main_camera) = self.cameras.get_mut("main") { + main_camera.add_position_and_target(enable); + } } /// This builds a uniform buffer data from camera view data that is sent to the GPU in next frame - pub fn update_view_projection(&mut self, renderer: &mut Renderer) -> eyre::Result<()> { - self.cameras - .get_mut("main") - .unwrap() - .update_view_projection(renderer)?; - Ok(()) + pub fn update_view_projection(&mut self, renderer: &mut Renderer) { + if let Some(main_camera) = self.cameras.get_mut("main") { + main_camera.update_view_projection(renderer); + } } /// This builds a uniform buffer data from camera view data that is sent to the GPU in next frame, and returns the bindgroup pub fn update_view_projection_and_return( &mut self, renderer: &mut Renderer, - ) -> eyre::Result { - self.cameras - .get_mut("main") - .unwrap() - .update_view_projection_and_return(renderer) + ) -> Option { + match self.cameras.get_mut("main") { + Some(main_camera) => Some(main_camera.update_view_projection_and_return(renderer)), + None => None, + } } /// Builds a view matrix for camera projection - pub fn build_view_matrix(&self) -> nalgebra_glm::Mat4 { - self.cameras.get("main").unwrap().build_view_matrix() + pub fn build_view_matrix(&self) -> Option { + if let Some(main_camera) = self.cameras.get("main") { + Some(main_camera.build_view_matrix()) + } else { + None + } } /// Builds a projection matrix for camera - pub fn build_projection_matrix(&self) -> nalgebra_glm::Mat4 { - self.cameras.get("main").unwrap().build_projection_matrix() + pub fn build_projection_matrix(&self) -> Option { + if let Some(main_camera) = self.cameras.get("main") { + Some(main_camera.build_projection_matrix()) + } else { + None + } } } diff --git a/src/utils/current_input.rs b/crates/blue_engine_core/src/utils/current_input.rs similarity index 100% rename from src/utils/current_input.rs rename to crates/blue_engine_core/src/utils/current_input.rs diff --git a/src/utils/default_resources.rs b/crates/blue_engine_core/src/utils/default_resources.rs similarity index 100% rename from src/utils/default_resources.rs rename to crates/blue_engine_core/src/utils/default_resources.rs diff --git a/src/utils/default_shader.wgsl b/crates/blue_engine_core/src/utils/default_shader.wgsl similarity index 100% rename from src/utils/default_shader.wgsl rename to crates/blue_engine_core/src/utils/default_shader.wgsl diff --git a/src/utils/winit_input_helper.rs b/crates/blue_engine_core/src/utils/winit_input_helper.rs similarity index 100% rename from src/utils/winit_input_helper.rs rename to crates/blue_engine_core/src/utils/winit_input_helper.rs diff --git a/src/window.rs b/crates/blue_engine_core/src/window.rs similarity index 68% rename from src/window.rs rename to crates/blue_engine_core/src/window.rs index 7c899bd..3d35c08 100644 --- a/src/window.rs +++ b/crates/blue_engine_core/src/window.rs @@ -18,7 +18,7 @@ use winit::{ impl Engine { /// Creates a new window in current thread using default settings. - pub fn new() -> eyre::Result { + pub fn new() -> Result { Self::new_inner( WindowDescriptor::default(), #[cfg(target_os = "android")] @@ -27,7 +27,7 @@ impl Engine { } /// Creates a new window in current thread using provided settings. - pub fn new_config(settings: WindowDescriptor) -> eyre::Result { + pub fn new_config(settings: WindowDescriptor) -> Result { Self::new_inner( settings, #[cfg(target_os = "android")] @@ -40,7 +40,7 @@ impl Engine { pub fn new_android( settings: WindowDescriptor, app: winit::platform::android::activity::AndroidApp, - ) -> eyre::Result { + ) -> Result { Self::new_inner(settings, Some(app)) } @@ -51,7 +51,7 @@ impl Engine { #[cfg(target_os = "android")] android_app: Option< winit::platform::android::activity::AndroidApp, >, - ) -> eyre::Result { + ) -> Result { #[cfg(feature = "debug")] env_logger::init(); // Dimensions of the window, as width and height @@ -72,7 +72,7 @@ impl Engine { // The renderer init on current window let mut renderer = pollster::block_on(Renderer::new(dimension, settings.clone()))?; - let camera = CameraContainer::new(dimension, &mut renderer)?; + let camera = CameraContainer::new(dimension, &mut renderer); Ok(Self { window: Window::new(default_attributes), @@ -104,7 +104,7 @@ impl Engine { &mut CameraContainer, &mut crate::SignalStorage, ), - ) -> eyre::Result<()> { + ) -> Result<(), crate::error::Error> { self.update_loop = Some(Box::new(update_function)); // will create the main event loop of the window. @@ -127,8 +127,8 @@ impl Engine { ); winit::event_loop::EventLoopBuilder::new() - .with_android_app(if android_app.is_some() { - android_app.unwrap() + .with_android_app(if let Some(android_app) = android_app { + android_app } else { panic!("No android app") }) @@ -158,65 +158,58 @@ impl ApplicationHandler for Engine { } = self; if window.is_none() { - window.window = Some(std::sync::Arc::new( - event_loop - .create_window(window.default_attributes.clone()) - .unwrap(), - )); - - if renderer.surface.is_none() { - let surface = renderer - .instance - .create_surface(window.window.as_ref().unwrap().clone()) - .unwrap(); - - let surface_capabilities = surface.get_capabilities(&renderer.adapter); - let tex_format = surface_capabilities - .formats - .iter() - .copied() - .find(|f| f.is_srgb()) - .unwrap_or(surface_capabilities.formats[0]); - - renderer.config.format = tex_format; - renderer.config.view_formats = vec![tex_format]; - - surface.configure(&renderer.device, &renderer.config); - renderer.depth_buffer = Renderer::build_depth_buffer( - "Depth Buffer", - &renderer.device, - &renderer.config, - ); - renderer.surface = Some(surface); - - renderer - .build_default_data() - .expect("couldn't rebuild the default data"); - objects.iter_mut().for_each(|i| { - i.1.update(renderer).expect("Couldn't update objects"); - }); - } + if let Ok(new_window) = event_loop.create_window(window.default_attributes.clone()) { + let new_window = std::sync::Arc::new(new_window); + + if renderer.surface.is_none() { + if let Ok(surface) = renderer.instance.create_surface(new_window.clone()) { + let surface_capabilities = surface.get_capabilities(&renderer.adapter); + let tex_format = surface_capabilities + .formats + .iter() + .copied() + .find(|f| f.is_srgb()) + .unwrap_or(surface_capabilities.formats[0]); + + renderer.config.format = tex_format; + renderer.config.view_formats = vec![tex_format]; + + surface.configure(&renderer.device, &renderer.config); + renderer.depth_buffer = Renderer::build_depth_buffer( + "Depth Buffer", + &renderer.device, + &renderer.config, + ); + renderer.surface = Some(surface); + + renderer.build_default_data(); + objects.iter_mut().for_each(|i| { + i.1.update(renderer); + }); + } + } - if let Some(window) = self.window.window.as_mut() { - window.set_min_inner_size(self.window.default_attributes.min_inner_size); - window.set_max_inner_size(self.window.default_attributes.max_inner_size); - if let Some(position) = self.window.default_attributes.position { - window.set_outer_position(position); + new_window.set_min_inner_size(window.default_attributes.min_inner_size); + new_window.set_max_inner_size(window.default_attributes.max_inner_size); + if let Some(position) = window.default_attributes.position { + new_window.set_outer_position(position); } - window.set_resizable(self.window.default_attributes.resizable); - window.set_enabled_buttons(self.window.default_attributes.enabled_buttons); - window.set_title(self.window.default_attributes.title.as_str()); - window.set_maximized(self.window.default_attributes.maximized); - window.set_visible(self.window.default_attributes.visible); - window.set_transparent(self.window.default_attributes.transparent); - window.set_blur(self.window.default_attributes.blur); - window.set_decorations(self.window.default_attributes.decorations); - window.set_window_icon(self.window.default_attributes.window_icon.clone()); - window.set_theme(self.window.default_attributes.preferred_theme); - window.set_resize_increments(self.window.default_attributes.resize_increments); - window.set_window_level(self.window.default_attributes.window_level); - window.set_cursor(self.window.default_attributes.cursor.clone()); - window.set_fullscreen(self.window.default_attributes.fullscreen.clone()); + new_window.set_resizable(window.default_attributes.resizable); + new_window.set_enabled_buttons(window.default_attributes.enabled_buttons); + new_window.set_title(window.default_attributes.title.as_str()); + new_window.set_maximized(window.default_attributes.maximized); + new_window.set_visible(window.default_attributes.visible); + new_window.set_transparent(window.default_attributes.transparent); + new_window.set_blur(window.default_attributes.blur); + new_window.set_decorations(window.default_attributes.decorations); + new_window.set_window_icon(window.default_attributes.window_icon.clone()); + new_window.set_theme(window.default_attributes.preferred_theme); + new_window.set_resize_increments(window.default_attributes.resize_increments); + new_window.set_window_level(window.default_attributes.window_level); + new_window.set_cursor(window.default_attributes.cursor.clone()); + new_window.set_fullscreen(window.default_attributes.fullscreen.clone()); + + window.window = Some(new_window); } signals.events.iter_mut().for_each(|i| { @@ -279,12 +272,8 @@ impl ApplicationHandler for Engine { WindowEvent::Resized(size) => { renderer.resize(size); - camera - .set_resolution(size) - .expect("Couldn't set the resize to camera"); - camera - .update_view_projection(renderer) - .expect("Couldn't set the resize to camera in renderer"); + camera.set_resolution(size); + camera.update_view_projection(renderer); } WindowEvent::RedrawRequested => { @@ -294,47 +283,43 @@ impl ApplicationHandler for Engine { event_loop.exit(); } - if let Some((mut encoder, view, frame)) = renderer - .pre_render(objects, window.as_ref().unwrap().inner_size(), camera) - .expect("Couldn't get pre render data") - { - if let Some(update_function) = update_loop { - update_function(renderer, window, objects, input_events, camera, signals); - } - - signals.events.iter_mut().for_each(|i| { - i.1.frame( - renderer, - window, - objects, - camera, - input_events, - &mut encoder, - &view, - ); - }); - - for camera_value in camera.values_mut() { - camera_value - .update_view_projection(renderer) - .expect("Couldn't update camera"); - } - objects.iter_mut().for_each(|i| { - if i.1.changed { - i.1.update(renderer).expect("Couldn't update objects"); + if let Some(window_ref) = window.as_ref() { + if let Ok(Some((mut encoder, view, frame))) = + renderer.pre_render(objects, window_ref.inner_size(), camera) + { + if let Some(update_function) = update_loop { + update_function( + renderer, + window, + objects, + input_events, + camera, + signals, + ); } - }); - - match renderer.render(encoder, frame) { - Ok(_) => {} - // Recreate the swap_chain if lost - Err(wgpu::SurfaceError::Lost) => renderer.resize(renderer.size), - // The system is out of memory, we should probably quit - Err(wgpu::SurfaceError::OutOfMemory) => { - event_loop.exit(); + + signals.events.iter_mut().for_each(|i| { + i.1.frame( + renderer, + window, + objects, + camera, + input_events, + &mut encoder, + &view, + ); + }); + + for camera_value in camera.values_mut() { + camera_value.update_view_projection(renderer); } - // All other errors (Outdated, Timeout) should be resolved by the next frame - Err(e) => eprintln!("{:?}", e), + objects.iter_mut().for_each(|i| { + if i.1.changed { + i.1.update(renderer); + } + }); + + renderer.render(encoder, frame); } } @@ -545,18 +530,15 @@ impl Window { /// **Does not work unless during update_loop** pub fn set_fullscreen_exclusive(&mut self, value: bool) { if let Some(window) = self.window.as_mut() { - let full_screen_result = if value { - Some(winit::window::Fullscreen::Exclusive( - window - .available_monitors() - .next() - .expect("Couldn't get monitor handle for exclusive fullscreen") - .video_modes() - .next() - .expect("Couldn't get monitor handle for exclusive fullscreen"), - )) - } else { - None + let full_screen_result = match value { + true => match window.available_monitors().next() { + Some(monitor) => match monitor.video_modes().next() { + Some(vide_mode) => Some(winit::window::Fullscreen::Exclusive(vide_mode)), + None => None, + }, + None => None, + }, + false => None, }; window.set_fullscreen(full_screen_result); diff --git a/crates/blue_engine_dynamic/Cargo.toml b/crates/blue_engine_dynamic/Cargo.toml new file mode 100644 index 0000000..ff8dc92 --- /dev/null +++ b/crates/blue_engine_dynamic/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "blue_engine_dynamic" +version = "0.6.0" +authors = ["Elham Aryanpur "] +edition = "2021" +description = "General-Purpose, Easy-to-use, Fast, and Portable graphics engine" +license = "Apache-2.0" + +[lib] +name = "blue_engine_dynamic" +crate-type = ["dylib"] + +[features] +default = ["debug", "u16"] +debug = ["blue_engine_core/debug"] +android = ["blue_engine_core/android"] +android_native_activity = ["blue_engine_core/android_native_activity"] +android_game_activity = ["blue_engine_core/android_game_activity"] +# using u16 for indices and others +u16 = ["blue_engine_core/u16"] +# using u32 for indices and others +u32 = ["blue_engine_core/u32"] + +[dependencies] +blue_engine_core = { path = "../blue_engine_core" } diff --git a/crates/blue_engine_dynamic/src/lib.rs b/crates/blue_engine_dynamic/src/lib.rs new file mode 100644 index 0000000..5547ddd --- /dev/null +++ b/crates/blue_engine_dynamic/src/lib.rs @@ -0,0 +1 @@ +pub use blue_engine_core::*; diff --git a/Dockerfile b/examples/Dockerfile similarity index 100% rename from Dockerfile rename to examples/Dockerfile diff --git a/examples/camera/rotate_around.rs b/examples/camera/rotate_around.rs index 9e83e11..390af12 100644 --- a/examples/camera/rotate_around.rs +++ b/examples/camera/rotate_around.rs @@ -29,8 +29,7 @@ fn main() { }, &mut engine.renderer, &mut engine.objects, - ) - .unwrap(); + ); let radius = 2f32; let start = std::time::SystemTime::now(); @@ -39,9 +38,7 @@ fn main() { .update_loop(move |_, _, _, _, camera, _| { let camx = start.elapsed().unwrap().as_secs_f32().sin() * radius; let camz = start.elapsed().unwrap().as_secs_f32().cos() * radius; - camera - .set_position(camx, 0.0, camz) - .expect("Couldn't update the camera eye"); + camera.set_position(camx, 0.0, camz); }) .expect("Error during update loop"); } diff --git a/resources/BlueLogoDiscord.png b/examples/resources/BlueLogoDiscord.png similarity index 100% rename from resources/BlueLogoDiscord.png rename to examples/resources/BlueLogoDiscord.png diff --git a/examples/resources/image.png b/examples/resources/image.png new file mode 100644 index 0000000..1ff07d1 Binary files /dev/null and b/examples/resources/image.png differ diff --git a/examples/resources/player.png b/examples/resources/player.png new file mode 100644 index 0000000..d217092 Binary files /dev/null and b/examples/resources/player.png differ diff --git a/examples/shapes/cube.rs b/examples/shapes/cube.rs index 9325b26..548d064 100644 --- a/examples/shapes/cube.rs +++ b/examples/shapes/cube.rs @@ -9,7 +9,7 @@ use blue_engine::{header::Engine, primitive_shapes::cube}; fn main() { let mut engine = Engine::new().expect("win"); - cube("Cube", &mut engine.renderer, &mut engine.objects).unwrap(); + cube("Cube", &mut engine.renderer, &mut engine.objects); engine .objects .get_mut("Cube") @@ -23,9 +23,7 @@ fn main() { let camx = start.elapsed().unwrap().as_secs_f32().sin() * radius; let camy = start.elapsed().unwrap().as_secs_f32().sin() * radius; let camz = start.elapsed().unwrap().as_secs_f32().cos() * radius; - camera - .set_position(camx, camy, camz) - .expect("Couldn't update the camera eye"); + camera.set_position(camx, camy, camz); }) .expect("Error during update loop"); } diff --git a/examples/shapes/square.rs b/examples/shapes/square.rs index 8993432..b5fbe6f 100644 --- a/examples/shapes/square.rs +++ b/examples/shapes/square.rs @@ -11,7 +11,7 @@ use blue_engine::{ StringBuffer, }; -pub fn square(name: impl StringBuffer, engine: &mut Engine) -> eyre::Result<()> { +pub fn square(name: impl StringBuffer, engine: &mut Engine) { engine.objects.new_object( name, vec![ @@ -42,15 +42,13 @@ pub fn square(name: impl StringBuffer, engine: &mut Engine) -> eyre::Result<()> ..Default::default() }, &mut engine.renderer, - )?; - - Ok(()) + ); } fn main() { let mut engine = Engine::new().expect("win"); - square("Square", &mut engine).unwrap(); + square("Square", &mut engine); engine .update_loop(move |_, _, _, _, _, _| {}) diff --git a/examples/shapes/triangle.rs b/examples/shapes/triangle.rs index 6fca773..dcb42c7 100644 --- a/examples/shapes/triangle.rs +++ b/examples/shapes/triangle.rs @@ -19,8 +19,7 @@ pub fn main() { ObjectSettings::default(), &mut engine.renderer, &mut engine.objects, - ) - .unwrap(); + ); engine .update_loop(move |_, _, _, _, _, _| {}) diff --git a/examples/utils/clear_color.rs b/examples/utils/clear_color.rs index ede6ae5..e936038 100644 --- a/examples/utils/clear_color.rs +++ b/examples/utils/clear_color.rs @@ -6,7 +6,7 @@ * The license is same as the one on the root. */ -use blue_engine::{primitive_shapes::triangle, Engine, ObjectSettings}; +use blue_engine::{primitive_shapes::triangle, wgpu, Engine, ObjectSettings}; pub fn main() { let mut engine = Engine::new().expect("win"); @@ -16,8 +16,7 @@ pub fn main() { ObjectSettings::default(), &mut engine.renderer, &mut engine.objects, - ) - .unwrap(); + ); engine.renderer.clear_color = wgpu::Color { r: 0.0, diff --git a/examples/utils/instancing.rs b/examples/utils/instancing.rs index 4800b15..0f08598 100644 --- a/examples/utils/instancing.rs +++ b/examples/utils/instancing.rs @@ -22,8 +22,7 @@ pub fn main() { ObjectSettings::default(), &mut engine.renderer, &mut engine.objects, - ) - .unwrap(); + ); // update the triangle engine.objects.update_object("Triangle", |object| { @@ -53,8 +52,7 @@ pub fn main() { .objects .get_mut("Triangle") .expect("Couldn't get the triangle") - .update_instance_buffer(&mut engine.renderer) - .expect("Couldn't update instance buffer"); + .update_instance_buffer(&mut engine.renderer); // run the loop as normal engine diff --git a/examples/utils/render_order.rs b/examples/utils/render_order.rs index a65ee9e..dd59448 100644 --- a/examples/utils/render_order.rs +++ b/examples/utils/render_order.rs @@ -17,8 +17,7 @@ fn main() { ObjectSettings::default(), &mut engine.renderer, &mut engine.objects, - ) - .expect("failed to create square"); + ); // make the second layer square( @@ -26,8 +25,7 @@ fn main() { ObjectSettings::default(), &mut engine.renderer, &mut engine.objects, - ) - .expect("failed to create square"); + ); // Get layer 1 object engine diff --git a/examples/utils/resource_sharing.rs b/examples/utils/resource_sharing.rs index 679d543..606fecd 100644 --- a/examples/utils/resource_sharing.rs +++ b/examples/utils/resource_sharing.rs @@ -11,31 +11,30 @@ fn main() { // Start the engine let mut engine = Engine::new().expect("window not initialized"); - // build a texture as an example of resource to be shared - let texture = engine - .renderer - .build_texture( - "background", - TextureData::Path("resources/BlueLogoDiscord.png".to_string()), - blue_engine::TextureMode::Clamp, - ) - .unwrap(); - // build your main object with the texture square( "main", ObjectSettings::default(), &mut engine.renderer, &mut engine.objects, - ) - .expect("Error during creation of main square"); + ); // add the texture to the main object as normally would engine .objects .get_mut("main") .unwrap() - .set_texture(texture) + .set_texture( + // build a texture as an example of resource to be shared + engine + .renderer + .build_texture( + "background", + TextureData::Path("examples/resources/BlueLogoDiscord.png".to_string()), + blue_engine::TextureMode::Clamp, + ) + .unwrap(), + ) .set_position(-1.5f32, 0f32, 0f32); // set position to make it visible // create another object where you want to get resources shared with @@ -44,21 +43,16 @@ fn main() { ObjectSettings::default(), &mut engine.renderer, &mut engine.objects, - ) - .expect("Error during creation of alt square"); + ); // here you can use `reference_texture` to reference the texture from the main object engine .objects .get_mut("alt") .expect("Error during copying texture of the main square") + // setting position again to make it visible + .set_position(1.5f32, 0f32, 0f32) .reference_texture("main"); - // setting position again to make it visible - engine - .objects - .get_mut("alt") - .expect("Error during setting the position of the alt square") - .set_position(1.5f32, 0f32, 0f32); engine .update_loop(move |_, _, _, _, _, _| {}) diff --git a/examples/utils/scissor.rs b/examples/utils/scissor.rs index 3b66764..15201f9 100644 --- a/examples/utils/scissor.rs +++ b/examples/utils/scissor.rs @@ -16,8 +16,7 @@ pub fn main() { ObjectSettings::default(), &mut engine.renderer, &mut engine.objects, - ) - .unwrap(); + ); // set scissor rect engine.renderer.scissor_rect = Some((0, 0, 450, 350)); diff --git a/examples/utils/signals.rs b/examples/utils/signals.rs index 52479b3..b5f6525 100644 --- a/examples/utils/signals.rs +++ b/examples/utils/signals.rs @@ -58,8 +58,7 @@ pub fn main() { ObjectSettings::default(), &mut engine.renderer, &mut engine.objects, - ) - .unwrap(); + ); // initialize your plugin let mut myplugin = MyPlugin::new(); diff --git a/examples/utils/wireframe.rs b/examples/utils/wireframe.rs index 8fe4bcd..90aa4d6 100644 --- a/examples/utils/wireframe.rs +++ b/examples/utils/wireframe.rs @@ -6,7 +6,7 @@ * The license is same as the one on the root. */ -use blue_engine::{primitive_shapes::triangle, Engine, ObjectSettings, ShaderSettings}; +use blue_engine::{primitive_shapes::triangle, wgpu, Engine, ObjectSettings, ShaderSettings}; pub fn main() { let mut engine = Engine::new().expect("win"); @@ -22,8 +22,7 @@ pub fn main() { }, &mut engine.renderer, &mut engine.objects, - ) - .unwrap(); + ); engine .update_loop(move |_, _, _, _, _, _| {}) diff --git a/justfile b/justfile index ffe6704..a4786b2 100644 --- a/justfile +++ b/justfile @@ -3,6 +3,6 @@ range := "HEAD..HEAD" release_tag := "1.0.0" -# use this syntax: just release_tag="0.0.0" range="start..end" update-changelog +# use this syntax: just release_tag="0.0.0" update-changelog update-changelog: - git cliff {{range}} --unreleased --tag {{release_tag}} --prepend CHANGELOG.md \ No newline at end of file + git cliff --unreleased --tag {{release_tag}} --prepend CHANGELOG.md \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 3f31866..ce4d47a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,83 +1,5 @@ -/* - * Blue Engine by Elham Aryanpur - * - * The license is same as the one on the root. -*/ - -#![warn(missing_docs)] -#![allow(clippy::needless_doctest_main)] - -//! -//! -//! # Blue Engine -//! -//! Blue Engine is an easy to use, portable, and extendable/customizable graphics engine. Here -//! lives the documentation for the engine. -//! -//! ## Setup -//! -//! The setup and installation details live in the project's [guide](https://aryanpurtech.github.io/BlueEngineDocs/). -//! A basic program in Blue Engine is as follow: -//! -//! ## Example -//! -//! ```rust -//! use blue_engine::{ -//! header::{ Engine, ObjectSettings }, -//! primitive_shapes::triangle -//! }; -//! -//! fn main() { -//! // initialize the engine -//! let mut engine = Engine::new().expect("engine couldn't be initialized"); -//! -//! // create a triangle -//! triangle("my triangle", ObjectSettings::default(), &mut engine.renderer, &mut engine.objects).unwrap(); -//! -//! // run the engine -//! engine -//! .update_loop(move |_, _, _, _, _, _| {}) -//! .expect("Error during update loop"); -//! } -//! ``` -//! -//! ## Utilities -//! -//! This crate is the core of the engine, but there is also [utilities crate](https://github.com/AryanpurTech/BlueEngineUtilities) -//! which have a lot of utilities for the engine such as lighting, physics, etc. -//! -//! ## Guide for code navigation -//! -//! The code of the engine is organized in a rather different manner than traditional in the -//! language. There are inspirations from other languages to make it easier to navigate the -//! project. -//! -//! ## Older hardware -//! -//! The engine uses WGPU under the hood for rendering. WGPU by nature is designed for modern hardware, so if you have or want to -//! target older hardware, you might need to add a couple more things to WindowDescriptor during Engine::new_config: -//! -//! 1) set a backend that targets your older hardware, such as GL using the backends field: `backend: blue_engine::wgpu::Backends::GL` -//! 2) experiement with the limits field, which describes what features you need. `limits: blue_engine::wgpu::Limits::default()`. there -//! are three options for limits: `default` for normal hardware, `downlevel_defaults` which are compatible with GLES-3 and D3D-11, or -//! `downlevel_webgl2_defaults` which is also compatible with WebGL2, and the lowest level for limits and can support very old hardware. -//! -//! with these two changes, hopefully you can get Blue Engine to run on older hardware. If not, please let me know so I can help you further. - -pub(crate) mod definition; -/// contains all the declarations such as structs, exports, enums, ... -pub mod header; -/// contains the definition for Object type, which is a type that make it easier to manage data for rendering. -pub mod objects; -/// contains definition for some 2D and 3D shapes. They are basic shapes and -/// can be used as examples of how to create your own content. -pub mod primitive_shapes; -/// contains definition for rendering part of the engine. -pub mod render; -/// Utilities for the engine (soon moving to it's own -/// [crate](https://github.com/AryanpurTech/BlueEngineUtilities)). -pub mod utils; -/// contains definition for creation of window and instance creation. -pub mod window; -#[doc(inline)] -pub use crate::header::*; +#[cfg(not(feature = "dynamic_link"))] +pub use blue_engine_core::*; + +#[cfg(all(feature = "dynamic_link", not(target_family = "wasm")))] +pub use blue_engine_dynamic::*;