From c1e8fea84a422a16d1f10fb5697b9fdfe8641d21 Mon Sep 17 00:00:00 2001 From: Steins7 Date: Tue, 1 Nov 2022 18:53:21 +0100 Subject: [PATCH] Rework Mesh system The mesh is now direclty handled by its corresponding sprite to simplify things --- Cargo.lock | 422 +++++++++++++++++++++-------------- src/canvas.rs | 3 +- src/renderer.rs | 147 +----------- src/renderer/utils.rs | 69 +++--- src/sprite/shape_sprite.rs | 60 +++++ src/sprite/texture_sprite.rs | 284 ++++++++++++----------- 6 files changed, 504 insertions(+), 481 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 631aec5..8c6b8a7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,12 +8,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" -[[package]] -name = "adler32" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" - [[package]] name = "ahash" version = "0.7.6" @@ -27,9 +21,9 @@ dependencies = [ [[package]] name = "android_system_properties" -version = "0.1.2" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a20ae67ce26261f218e2b3f2f0d01887a9818283ca6fb260fa7c67e253d61c92" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" dependencies = [ "libc", ] @@ -77,9 +71,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "bit-set" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e11e16035ea35e4e5997b393eacbf6f63983188f7a2ad25bfb13465f5ad59de" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" dependencies = [ "bit-vec", ] @@ -104,24 +98,24 @@ checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" [[package]] name = "bumpalo" -version = "3.10.0" +version = "3.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" +checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" [[package]] name = "bytemuck" -version = "1.10.0" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c53dfa917ec274df8ed3c572698f381a24eef2efba9492d797301b72b6db408a" +checksum = "5aec14f5d4e6e3f927cd0c81f72e5710d95ee9019fbeb4b3021193867491bfd8" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.1.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562e382481975bc61d11275ac5e62a19abd00b0547d99516a415336f183dcd0e" +checksum = "1b9e1f5fa78f69496407a27ae9ed989e3c3b072310286f5ef385525e4cbc24a9" dependencies = [ "proc-macro2", "quote", @@ -141,7 +135,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf2eec61efe56aa1e813f5126959296933cf0700030e4314786c48779a66ab82" dependencies = [ "log", - "nix", + "nix 0.22.3", ] [[package]] @@ -166,9 +160,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.73" +version = "1.0.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" +checksum = "581f5dba903aac52ea3feb5ec4810848460ee833876f1f9b0fdeab1f19091574" [[package]] name = "cfg-if" @@ -199,22 +193,24 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.19" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +checksum = "bfd4d1b31faaa3a89d7934dbded3111da0d2ef28e3ebccdb4f0179f5929d1ef1" dependencies = [ - "libc", + "iana-time-zone", + "js-sys", "num-integer", "num-traits", "time", + "wasm-bindgen", "winapi", ] [[package]] name = "cocoa" -version = "0.24.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63902e9223530efb4e26ccd0cf55ec30d592d3b42e21a28defc42a9586e832" +checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" dependencies = [ "bitflags", "block", @@ -371,6 +367,50 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" +[[package]] +name = "cxx" +version = "1.0.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b7d4e43b25d3c994662706a1d4fcfc32aaa6afd287502c111b237093bb23f3a" +dependencies = [ + "cc", + "cxxbridge-flags", + "cxxbridge-macro", + "link-cplusplus", +] + +[[package]] +name = "cxx-build" +version = "1.0.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84f8829ddc213e2c1368e51a2564c552b65a8cb6a28f31e576270ac81d5e5827" +dependencies = [ + "cc", + "codespan-reporting", + "once_cell", + "proc-macro2", + "quote", + "scratch", + "syn", +] + +[[package]] +name = "cxxbridge-flags" +version = "1.0.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e72537424b474af1460806647c41d4b6d35d09ef7fe031c5c2fa5766047cc56a" + +[[package]] +name = "cxxbridge-macro" +version = "1.0.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "309e4fb93eed90e1e14bea0da16b209f81813ba9fc7830c20ed151dd7bc0a4d7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "d3d12" version = "0.5.0" @@ -417,15 +457,6 @@ dependencies = [ "syn", ] -[[package]] -name = "deflate" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c86f7e25f518f4b81808a2cf1c50996a61f5c2eb394b2393bd87f2a4780a432f" -dependencies = [ - "adler32", -] - [[package]] name = "dispatch" version = "0.2.0" @@ -457,6 +488,16 @@ dependencies = [ "log", ] +[[package]] +name = "flate2" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" +dependencies = [ + "crc32fast", + "miniz_oxide 0.5.4", +] + [[package]] name = "fnv" version = "1.0.7" @@ -489,9 +530,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" +checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" dependencies = [ "cfg-if 1.0.0", "libc", @@ -531,13 +572,13 @@ dependencies = [ [[package]] name = "gpu-descriptor" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a538f217be4d405ff4719a283ca68323cc2384003eca5baaa87501e821c81dda" +checksum = "0b0c02e1ba0bdb14e965058ca34e09c020f8e507a760df1121728e0aef68d57a" dependencies = [ "bitflags", "gpu-descriptor-types", - "hashbrown 0.11.2", + "hashbrown", ] [[package]] @@ -551,19 +592,13 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.11.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ "ahash", ] -[[package]] -name = "hashbrown" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "607c8a29735385251a339424dd462993c0fed8fa09d378f259377df08c126022" - [[package]] name = "hermit-abi" version = "0.1.19" @@ -579,6 +614,30 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" +[[package]] +name = "iana-time-zone" +version = "0.1.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64c122667b287044802d6ce17ee2ddf13207ed924c712de9a66a5814d5b64765" +dependencies = [ + "android_system_properties", + "core-foundation-sys 0.8.3", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "winapi", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca" +dependencies = [ + "cxx", + "cxx-build", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -587,15 +646,14 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "image" -version = "0.24.2" +version = "0.24.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28edd9d7bc256be2502e325ac0628bde30b7001b9b52e0abe31a1a9dc2701212" +checksum = "bd8e4fb07cf672b1642304e731ef8a6a4c7891d67bb4fd4f5ce58cd6ed86803c" dependencies = [ "bytemuck", "byteorder", "color_quant", "jpeg-decoder", - "num-iter", "num-rational", "num-traits", "png", @@ -608,14 +666,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" dependencies = [ "autocfg", - "hashbrown 0.12.2", + "hashbrown", ] [[package]] name = "inplace_it" -version = "0.3.3" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90953f308a79fe6d62a4643e51f848fbfddcd05975a38e69fdf4ab86a7baf7ca" +checksum = "e567468c50f3d4bc7397702e09b380139f9b9288b4e909b070571007f8b5bf78" [[package]] name = "instant" @@ -643,9 +701,9 @@ checksum = "9478aa10f73e7528198d75109c8be5cd7d15fb530238040148d5f9a22d4c5b3b" [[package]] name = "js-sys" -version = "0.3.58" +version = "0.3.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3fac17f7123a73ca62df411b1bf727ccc805daa070338fda671c86dac1bdc27" +checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" dependencies = [ "wasm-bindgen", ] @@ -669,9 +727,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.126" +version = "0.2.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" +checksum = "fc7fcc620a3bff7cdd7a365be3376c97191aeaccc2a603e600951e452615bf89" [[package]] name = "libloading" @@ -684,10 +742,19 @@ dependencies = [ ] [[package]] -name = "lock_api" -version = "0.4.7" +name = "link-cplusplus" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" +checksum = "9272ab7b96c9046fbc5bc56c06c117cb639fe2d509df0c421cad82d2915cf369" +dependencies = [ + "cc", +] + +[[package]] +name = "lock_api" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" dependencies = [ "autocfg", "scopeguard", @@ -757,18 +824,27 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f5c75688da582b8ffc1f1799e9db273f32133c49e048f614d22ec3256773ccc" +checksum = "96590ba8f175222643a85693f33d26e9c8a015f599c216509b1a6894af675d34" +dependencies = [ + "adler", +] + +[[package]] +name = "miniz_oxide" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" dependencies = [ "adler", ] [[package]] name = "mio" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" +checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de" dependencies = [ "libc", "log", @@ -862,6 +938,18 @@ dependencies = [ "memoffset", ] +[[package]] +name = "nix" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "195cdbc1741b8134346d515b3a56a1c94b0912758009cfd53f99ea0f57b065fc" +dependencies = [ + "bitflags", + "cfg-if 1.0.0", + "libc", + "memoffset", +] + [[package]] name = "nom" version = "7.1.1" @@ -882,17 +970,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-iter" -version = "0.1.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-rational" version = "0.4.1" @@ -955,9 +1032,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.13.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1" +checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" [[package]] name = "parking_lot" @@ -977,7 +1054,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core 0.9.3", + "parking_lot_core 0.9.4", ] [[package]] @@ -996,9 +1073,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" +checksum = "4dc9e0dc2adc1c69d09143aff38d3d30c5c3f0df0dad82e6d25547af174ebec0" dependencies = [ "cfg-if 1.0.0", "libc", @@ -1009,26 +1086,26 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" [[package]] name = "pkg-config" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" +checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" [[package]] name = "png" -version = "0.17.5" +version = "0.17.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc38c0ad57efb786dd57b9864e5b18bae478c00c824dc55a38bbc9da95dde3ba" +checksum = "5d708eaf860a19b19ce538740d2b4bdeeb8337fa53f7738455e706623ad5c638" dependencies = [ "bitflags", "crc32fast", - "deflate", - "miniz_oxide", + "flate2", + "miniz_oxide 0.6.2", ] [[package]] @@ -1039,34 +1116,35 @@ checksum = "5da3b0203fd7ee5720aa0b5e790b591aa5d3f41c3ed2c34a3a393382198af2f7" [[package]] name = "proc-macro-crate" -version = "1.1.3" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" +checksum = "eda0fc3b0fb7c975631757e14d9049da17374063edb6ebbcbc54d880d4fe94e9" dependencies = [ + "once_cell", "thiserror", "toml", ] [[package]] name = "proc-macro2" -version = "1.0.40" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7" +checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725" dependencies = [ "unicode-ident", ] [[package]] name = "profiling" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f61dcf0b917cd75d4521d7343d1ffff3d1583054133c9b5cbea3375c703c40d" +checksum = "74605f360ce573babfe43964cbe520294dcb081afbf8c108fc6e23036b4da2df" [[package]] name = "quote" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" dependencies = [ "proc-macro2", ] @@ -1088,9 +1166,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.13" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ "bitflags", ] @@ -1109,9 +1187,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "scoped-tls" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" [[package]] name = "scopeguard" @@ -1120,10 +1198,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] -name = "serde" -version = "1.0.139" +name = "scratch" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0171ebb889e45aa68b44aee0859b3eede84c6f5f5c228e6f140c0b2a0a46cad6" +checksum = "9c8132065adcfd6e02db789d9285a0deb2f3fcb04002865ab67d5fb103533898" + +[[package]] +name = "serde" +version = "1.0.147" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d193d69bae983fc11a79df82342761dfbf28a99fc8d203dca4c3c1b590948965" [[package]] name = "slotmap" @@ -1136,9 +1220,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" [[package]] name = "smithay-client-toolkit" @@ -1152,7 +1236,7 @@ dependencies = [ "lazy_static", "log", "memmap2", - "nix", + "nix 0.22.3", "pkg-config", "wayland-client", "wayland-cursor", @@ -1177,9 +1261,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" -version = "1.0.98" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" +checksum = "a864042229133ada95abf3b54fdc62ef5ccabe9515b64717bcb9a1919e59445d" dependencies = [ "proc-macro2", "quote", @@ -1197,18 +1281,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.31" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" +checksum = "10deb33631e3c9018b9baf9dcbbc4f737320d2b576bac10f6aefa048fa407e3e" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.31" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" +checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb" dependencies = [ "proc-macro2", "quote", @@ -1237,21 +1321,21 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.1" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c" +checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" [[package]] name = "unicode-width" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" [[package]] name = "unicode-xid" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" [[package]] name = "version_check" @@ -1273,9 +1357,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.81" +version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c53b543413a17a202f4be280a7e5c62a1c69345f5de525ee64f8cfdbc954994" +checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -1283,13 +1367,13 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.81" +version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5491a68ab4500fa6b4d726bd67408630c3dbe9c4fe7bda16d5c82a1fd8c7340a" +checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" dependencies = [ "bumpalo", - "lazy_static", "log", + "once_cell", "proc-macro2", "quote", "syn", @@ -1298,9 +1382,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.31" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de9a9cec1733468a8c657e57fa2413d2ae2c0129b95e87c5b72b8ace4d13f31f" +checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -1310,9 +1394,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.81" +version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c441e177922bc58f1e12c022624b6216378e5febc2f0533e41ba443d505b80aa" +checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1320,9 +1404,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.81" +version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d94ac45fcf608c1f45ef53e748d35660f168490c10b23704c7779ab8f5c3048" +checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" dependencies = [ "proc-macro2", "quote", @@ -1333,20 +1417,20 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.81" +version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a89911bd99e5f3659ec4acf9c4d93b0a90fe4a2a11f15328472058edc5261be" +checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" [[package]] name = "wayland-client" -version = "0.29.4" +version = "0.29.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91223460e73257f697d9e23d401279123d36039a3f7a449e983f123292d4458f" +checksum = "3f3b068c05a039c9f755f881dc50f01732214f5685e379829759088967c46715" dependencies = [ "bitflags", "downcast-rs", "libc", - "nix", + "nix 0.24.2", "scoped-tls", "wayland-commons", "wayland-scanner", @@ -1355,11 +1439,11 @@ dependencies = [ [[package]] name = "wayland-commons" -version = "0.29.4" +version = "0.29.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94f6e5e340d7c13490eca867898c4cec5af56c27a5ffe5c80c6fc4708e22d33e" +checksum = "8691f134d584a33a6606d9d717b95c4fa20065605f798a3f350d78dced02a902" dependencies = [ - "nix", + "nix 0.24.2", "once_cell", "smallvec", "wayland-sys", @@ -1367,20 +1451,20 @@ dependencies = [ [[package]] name = "wayland-cursor" -version = "0.29.4" +version = "0.29.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c52758f13d5e7861fc83d942d3d99bf270c83269575e52ac29e5b73cb956a6bd" +checksum = "6865c6b66f13d6257bef1cd40cbfe8ef2f150fb8ebbdb1e8e873455931377661" dependencies = [ - "nix", + "nix 0.24.2", "wayland-client", "xcursor", ] [[package]] name = "wayland-protocols" -version = "0.29.4" +version = "0.29.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60147ae23303402e41fe034f74fb2c35ad0780ee88a1c40ac09a3be1e7465741" +checksum = "b950621f9354b322ee817a23474e479b34be96c2e909c14f7bc0100e9a970bc6" dependencies = [ "bitflags", "wayland-client", @@ -1390,9 +1474,9 @@ dependencies = [ [[package]] name = "wayland-scanner" -version = "0.29.4" +version = "0.29.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39a1ed3143f7a143187156a2ab52742e89dac33245ba505c17224df48939f9e0" +checksum = "8f4303d8fa22ab852f789e75a967f0a2cdc430a607751c0499bada3e451cbd53" dependencies = [ "proc-macro2", "quote", @@ -1401,9 +1485,9 @@ dependencies = [ [[package]] name = "wayland-sys" -version = "0.29.4" +version = "0.29.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9341df79a8975679188e37dab3889bfa57c44ac2cb6da166f519a81cbe452d4" +checksum = "be12ce1a3c39ec7dba25594b97b42cb3195d54953ddb9d3d95a7c3902bc6e9d4" dependencies = [ "dlib", "lazy_static", @@ -1412,9 +1496,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.58" +version = "0.3.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fed94beee57daf8dd7d51f2b15dc2bcde92d7a72304cdf662a4371008b71b90" +checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" dependencies = [ "js-sys", "wasm-bindgen", @@ -1547,46 +1631,60 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-sys" -version = "0.36.1" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" dependencies = [ + "windows_aarch64_gnullvm", "windows_aarch64_msvc", "windows_i686_gnu", "windows_i686_msvc", "windows_x86_64_gnu", + "windows_x86_64_gnullvm", "windows_x86_64_msvc", ] [[package]] -name = "windows_aarch64_msvc" -version = "0.36.1" +name = "windows_aarch64_gnullvm" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" +checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" [[package]] name = "windows_i686_gnu" -version = "0.36.1" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" +checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" [[package]] name = "windows_i686_msvc" -version = "0.36.1" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" +checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" [[package]] name = "windows_x86_64_gnu" -version = "0.36.1" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" +checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" [[package]] name = "windows_x86_64_msvc" -version = "0.36.1" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" +checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" [[package]] name = "winit" @@ -1623,9 +1721,9 @@ dependencies = [ [[package]] name = "x11-dl" -version = "2.19.1" +version = "2.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea26926b4ce81a6f5d9d0f3a0bc401e5a37c6ae14a1bfaa8ff6099ca80038c59" +checksum = "0c83627bc137605acc00bb399c7b908ef460b621fc37c953db2b09f88c449ea6" dependencies = [ "lazy_static", "libc", diff --git a/src/canvas.rs b/src/canvas.rs index e93196f..83dd4cc 100644 --- a/src/canvas.rs +++ b/src/canvas.rs @@ -73,11 +73,10 @@ impl Canvas { //--Create functions-- pub fn create_texture_sprite(&mut self, size: Size) -> TextureSprite { - TextureSprite::create( + TextureSprite::new( self.default_texture.clone(), size, &self.renderer, - self.renderer.create_texture_mesh(), ) } diff --git a/src/renderer.rs b/src/renderer.rs index 7e7a61b..c29662a 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -4,12 +4,9 @@ use log::{debug, error, info, trace, warn}; use raw_window_handle::HasRawWindowHandle; use wgpu; -use crate::{ - utils::{Pixel, Size}, -}; +use crate::utils::{Pixel, Size}; pub mod utils; -use utils::{TextureVertex, Mesh, GpuMesh}; mod texture; pub use texture::Texture as Texture; @@ -23,11 +20,6 @@ pub use matrix::ModelMatrix as ModelMatrix; //--Renderer struct--------------------------------------------------------------------------------- pub struct WgpuRenderer { - #[allow(dead_code)] - shape_render_pipeline: wgpu::RenderPipeline, - #[allow(dead_code)] - quad_mesh: GpuMesh, //TODO temporary, to be moved to shapes.rs - pub texture_layout: wgpu::BindGroupLayout, pub matrix_layout: wgpu::BindGroupLayout, @@ -84,100 +76,13 @@ impl WgpuRenderer { surface.configure(&device, &config); let surface_size = size; - //let aspect_matrix = { - // use cgmath::{Basis3, Rotation3, Deg}; - - // //Matrix3::from(Basis3::from_angle_x(Deg(-0.0))) - // //* Matrix3::identity() - // //* Matrix3::from_nonuniform_scale(1.0 / size.w as f32, 1.0 / size.h as f32) - // Matrix3::from_nonuniform_scale(1.0, 1.0) - //}; - let frame = Some(surface.get_current_texture() .map_err(|_| "Failed to create frame")?); let matrix_layout = utils::new_matrix_layout(&device); let texture_layout = utils::new_texture_layout(&device); - let shape_render_pipeline = { - let shader = device.create_shader_module(wgpu::ShaderModuleDescriptor { - label: Some("shape shader"), - source: wgpu::ShaderSource::Wgsl(include_str!("sprite/shaders/shape.wgsl").into()), - }); - - let render_pipeline_layout = - device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { - label: Some("shape render pipeline layout"), - bind_group_layouts: &[ - &matrix_layout, - ], - push_constant_ranges: &[], - }); - - device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { - label: Some("shape render pipeline"), - layout: Some(&render_pipeline_layout), - vertex: wgpu::VertexState { - module: &shader, - entry_point: "vs_main", - buffers: &[ - ColorVertex::desc(), - ], - }, - fragment: Some(wgpu::FragmentState { - module: &shader, - entry_point: "fs_main", - targets: &[Some(wgpu::ColorTargetState { - format: config.format, - blend: Some(wgpu::BlendState::REPLACE), - write_mask: wgpu::ColorWrites::ALL, - })], - }), - primitive: wgpu::PrimitiveState { - topology: wgpu::PrimitiveTopology::TriangleList, - strip_index_format: None, - front_face: wgpu::FrontFace::Ccw, - cull_mode: Some(wgpu::Face::Back), - // Setting this to anything other than Fill requires - // Features::NON_FILL_POLYGON_MODE - polygon_mode: wgpu::PolygonMode::Fill, - // Requires Features::DEPTH_CLIP_CONTROL - unclipped_depth: false, - // Requires Features::CONSERVATIVE_RASTERIZATION - conservative: false, - }, - depth_stencil: None, - // multisampling, we don't need it - multisample: wgpu::MultisampleState { - count: 1, - mask: !0, - alpha_to_coverage_enabled: false, - }, - multiview: None, - }) - }; - - let quad_mesh = { - let mesh = Mesh { - vertices: [ - ColorVertex { position: [0.0, 0.0], color: [1.0, 0.0, 0.0] }, - ColorVertex { position: [1.0, 0.0], color: [0.0, 1.0, 0.0] }, - ColorVertex { position: [1.0, 1.0], color: [0.0, 0.0, 1.0] }, - ColorVertex { position: [0.0, 1.0], color: [0.5, 0.5, 0.5] }, - ], - indices: [ - 0, 1, 2, - 0, 2, 3, - ], - }; - - GpuMesh::create(&device, mesh) - }; - Ok(Self { - shape_render_pipeline, - quad_mesh, - texture_layout, matrix_layout, @@ -191,10 +96,6 @@ impl WgpuRenderer { }) } - pub fn create_texture_mesh(&self) -> GpuMesh { - GpuMesh::create(&self.device, TEXTURE_QUAD) - } - pub fn clear(&mut self, color: Pixel) { let view = self.create_texture_view(); @@ -319,52 +220,6 @@ impl WgpuRenderer { } //--Renderer struct utils--------------------------------------------------------------------------- -#[repr(C)] -#[derive(Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)] -pub struct ColorVertex { - pub position: [f32; 2], - pub color: [f32; 3], -} - -impl ColorVertex { - - const ATTRIBS: [wgpu::VertexAttribute; 2] = - wgpu::vertex_attr_array![0 => Float32x2, 1 => Float32x3]; - - fn desc<'a>() -> wgpu::VertexBufferLayout<'a> { - wgpu::VertexBufferLayout { - array_stride: std::mem::size_of::() as wgpu::BufferAddress, - step_mode: wgpu::VertexStepMode::Vertex, - attributes: &Self::ATTRIBS, - } - } -} - -pub const TEXTURE_QUAD: Mesh = Mesh { - vertices: [ - TextureVertex { position: [0.0, 0.0], tex_coords: [0.0, 1.0] }, - TextureVertex { position: [1.0, 0.0], tex_coords: [1.0, 1.0] }, - TextureVertex { position: [1.0, 1.0], tex_coords: [1.0, 0.0] }, - TextureVertex { position: [0.0, 1.0], tex_coords: [0.0, 0.0] }, - ], - indices: [ - 0, 1, 2, - 0, 2, 3, - ], -}; -// -//const QUAD: Mesh = Mesh { -// vertices: [ -// ColorVertex { position: [0.0, 0.0], color: [1.0, 0.0, 0.0] }, -// ColorVertex { position: [1.0, 0.0], color: [0.0, 1.0, 0.0] }, -// ColorVertex { position: [1.0, 1.0], color: [0.0, 0.0, 1.0] }, -// ColorVertex { position: [0.0, 1.0], color: [0.5, 0.5, 0.5] }, -// ], -// indices: [ -// 0, 1, 2, -// 0, 2, 3, -// ], -//}; impl From for wgpu::Color { diff --git a/src/renderer/utils.rs b/src/renderer/utils.rs index a62c3e2..e75cf85 100644 --- a/src/renderer/utils.rs +++ b/src/renderer/utils.rs @@ -1,6 +1,14 @@ #[allow(unused_imports)] use log::{debug, error, info, trace, warn}; +//--Internal imports-------------------------------------------------------------------------------- + +//--External imports-------------------------------------------------------------------------------- + +use std::marker::PhantomData; + +use super::WgpuRenderer; + //--Bind group layouts------------------------------------------------------------------------------ /// Creates the layout bind_group used by all matrixes of the renderer @@ -52,56 +60,44 @@ pub fn new_texture_layout(device: &wgpu::Device) -> wgpu::BindGroupLayout { } //--TextureVertex struct---------------------------------------------------------------------------- -// + #[repr(C)] #[derive(Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)] -pub struct TextureVertex { +pub struct ColorVertex { pub position: [f32; 2], - pub tex_coords: [f32; 2], + pub color: [f32; 3], } -impl TextureVertex { +impl ColorVertex { const ATTRIBS: [wgpu::VertexAttribute; 2] = - wgpu::vertex_attr_array![0 => Float32x2, 1 => Float32x2]; + wgpu::vertex_attr_array![0 => Float32x2, 1 => Float32x3]; pub fn desc<'a>() -> wgpu::VertexBufferLayout<'a> { wgpu::VertexBufferLayout { - array_stride: std::mem::size_of::() as wgpu::BufferAddress, + array_stride: std::mem::size_of::() as wgpu::BufferAddress, step_mode: wgpu::VertexStepMode::Vertex, attributes: &Self::ATTRIBS, } } } -//--Mesh struct------------------------------------------------------------------------------------- -pub struct Mesh -where - V: Copy + Clone + bytemuck::Pod + bytemuck::Zeroable, -{ - pub vertices: [V; V_NB], - pub indices: [u16; I_NB], -} - //--GpuMesh struct---------------------------------------------------------------------------------- -pub struct GpuMesh +pub struct Mesh where V: Copy + Clone + bytemuck::Pod + bytemuck::Zeroable, { vertex_buffer: wgpu::Buffer, index_buffer: wgpu::Buffer, - index_number: u32, - mesh: Mesh, - is_synced: bool, + vertex_type: PhantomData, } -impl GpuMesh +impl Mesh where - V: Copy + Clone + bytemuck::Pod + bytemuck::Zeroable, + V: Copy + Clone + bytemuck::Pod + bytemuck::Zeroable + std::fmt::Debug { - - pub fn create(device: &wgpu::Device, mesh: Mesh) -> Self { + pub fn new(device: &wgpu::Device) -> Self { use std::mem::size_of; use wgpu_types::BufferUsages as Usages; @@ -125,28 +121,17 @@ where Self { vertex_buffer, index_buffer, - index_number: mesh.indices.len() as u32, - mesh, - is_synced: true, + + vertex_type: PhantomData::default(), } } - pub fn set_mesh(&mut self, mesh: Mesh) { - - self.mesh = mesh; - self.is_synced = false; + pub fn set_vertices(&mut self, renderer: &WgpuRenderer, vertices: &[V]) { + renderer.queue.write_buffer(&self.vertex_buffer, 0, bytemuck::cast_slice(vertices)); } - pub fn is_synced(&self) -> bool { - self.is_synced - } - - pub fn update(&mut self, queue: &wgpu::Queue) { - - queue.write_buffer(&self.vertex_buffer, 0, bytemuck::cast_slice(&self.mesh.vertices)); - queue.write_buffer(&self.index_buffer, 0, bytemuck::cast_slice(&self.mesh.indices)); - - self.is_synced = true; + pub fn set_indices(&mut self, renderer: &WgpuRenderer, indices: &[u16]) { + renderer.queue.write_buffer(&self.index_buffer, 0, bytemuck::cast_slice(indices)); } pub fn get_vertex_buffer_slice(&self) -> wgpu::BufferSlice { @@ -156,9 +141,5 @@ where pub fn get_index_buffer_slice(&self) -> wgpu::BufferSlice { self.index_buffer.slice(..) } - - pub fn get_index_number(&self) -> u32 { - self.index_number - } } diff --git a/src/sprite/shape_sprite.rs b/src/sprite/shape_sprite.rs index c638b89..a05ba0c 100644 --- a/src/sprite/shape_sprite.rs +++ b/src/sprite/shape_sprite.rs @@ -56,3 +56,63 @@ impl Sprite for ShapeSprite { } } +#[allow(dead_code)] +fn initialize_pipeline(renderer: &WgpuRenderer) -> wgpu::RenderPipeline { + use crate::renderer::utils::ColorVertex; + + let shader = renderer.device.create_shader_module(wgpu::ShaderModuleDescriptor { + label: Some("shape shader"), + source: wgpu::ShaderSource::Wgsl(include_str!("shaders/shape.wgsl").into()), + }); + + let render_pipeline_layout = + renderer.device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { + label: Some("shape render pipeline layout"), + bind_group_layouts: &[ + &renderer.matrix_layout, + ], + push_constant_ranges: &[], + }); + + renderer.device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { + label: Some("shape render pipeline"), + layout: Some(&render_pipeline_layout), + vertex: wgpu::VertexState { + module: &shader, + entry_point: "vs_main", + buffers: &[ + ColorVertex::desc(), + ], + }, + fragment: Some(wgpu::FragmentState { + module: &shader, + entry_point: "fs_main", + targets: &[Some(wgpu::ColorTargetState { + format: renderer.config.format, + blend: Some(wgpu::BlendState::REPLACE), + write_mask: wgpu::ColorWrites::ALL, + })], + }), + primitive: wgpu::PrimitiveState { + topology: wgpu::PrimitiveTopology::TriangleList, + strip_index_format: None, + front_face: wgpu::FrontFace::Ccw, + cull_mode: Some(wgpu::Face::Back), + // Setting this to anything other than Fill requires + // Features::NON_FILL_POLYGON_MODE + polygon_mode: wgpu::PolygonMode::Fill, + // Requires Features::DEPTH_CLIP_CONTROL + unclipped_depth: false, + // Requires Features::CONSERVATIVE_RASTERIZATION + conservative: false, + }, + depth_stencil: None, + // multisampling, we don't need it + multisample: wgpu::MultisampleState { + count: 1, + mask: !0, + alpha_to_coverage_enabled: false, + }, + multiview: None, + }) +} diff --git a/src/sprite/texture_sprite.rs b/src/sprite/texture_sprite.rs index fec02e8..110ca7e 100644 --- a/src/sprite/texture_sprite.rs +++ b/src/sprite/texture_sprite.rs @@ -8,7 +8,7 @@ use super::Sprite; use crate::{ texture::TextureHandle, renderer::{ - utils::{TextureVertex, GpuMesh}, + utils::Mesh, WgpuRenderer, ModelMatrix, }, utils::{Size, Position, Pixel}, @@ -24,22 +24,28 @@ thread_local!(static PIPELINE : RefCell> = RefCell: //--TextureSprite struct---------------------------------------------------------------------------- pub struct TextureSprite { matrix: ModelMatrix, - gpu_mesh: GpuMesh, - inner_size: Size, //TODO move to f32 texture: TextureHandle, - texture_offset: Position, - texture_scale: f32, + inner_size: Size, //TODO move to f32 + + mesh: Mesh, + offset: Position, + scale: f32, + vertice_update_needed: bool, } impl TextureSprite { - pub fn create(texture: TextureHandle, - size: Size, - renderer: &WgpuRenderer, - gpu_mesh: GpuMesh) + const INDICES: [u16; 6] = [ + 0, 1, 2, + 0, 2, 3, + ]; + + pub fn new(texture: TextureHandle, + size: Size, + renderer: &WgpuRenderer) -> Self - { + { // initialize pipeline if needed PIPELINE.with(|cell| { if cell.borrow().is_none() { @@ -49,80 +55,154 @@ impl TextureSprite { let mut sprite = Self { matrix: ModelMatrix::default(renderer), - gpu_mesh, + + texture, inner_size: size, - texture: texture.clone(), - texture_offset: Position::origin(), - texture_scale: 1.0, + mesh: Mesh::new(&renderer.device), + offset: Position::origin(), + scale: 1.0, + vertice_update_needed: false, }; - //generate proper mesh - //TODO improve that - sprite.set_texture(texture, None, 1.0); + sprite.mesh.set_indices(renderer, &TextureSprite::INDICES); + sprite.update_vertices(renderer); + sprite } pub fn set_texture(&mut self, texture: TextureHandle, offset: Option, scale: f32) { - use crate::renderer::utils::Mesh; - // update texture self.texture = texture; - self.texture_scale = scale; - let size = self.texture.get_size(); + self.offset = offset.unwrap_or(Position::origin()); + self.scale = scale; - // compute normalized coordinates - self.texture_offset = offset.unwrap_or(Position::origin()); - let x_size = self.inner_size.w as f32 / size.w as f32 * scale; - let y_size = self.inner_size.h as f32 / size.h as f32 * scale; - let x_offset = self.texture_offset.x as f32 / size.w as f32; - let y_offset = self.texture_offset.y as f32 / size.h as f32; - - // compute mesh size - let w = self.inner_size.w as f32; - let h = self.inner_size.h as f32; - - // generate new sprite mesh - let mesh = Mesh { - vertices: [ - TextureVertex { - position: [-w, -h], - tex_coords: [x_offset , y_offset + y_size], - }, - TextureVertex { - position: [ w, -h], - tex_coords: [x_offset + x_size, y_offset + y_size], - }, - TextureVertex { - position: [ w, h], - tex_coords: [x_offset + x_size, y_offset ], - }, - TextureVertex { - position: [-w, h], - tex_coords: [x_offset , y_offset ], - }, - ], - indices: [ - 0, 1, 2, - 0, 2, 3, - ], - }; - - self.gpu_mesh.set_mesh(mesh); + self.vertice_update_needed = true; } pub fn set_pixel(&mut self, pos: Position, pix: Pixel) { //TODO check pos ? - self.texture.set_pixel(self.texture_offset + pos, pix); + self.texture.set_pixel(self.offset + pos, pix); } pub fn for_each(&mut self, func: F) { //TODO check pos ? //TODO take scale into account - self.texture.for_each_in_area(func, self.texture_offset, self.inner_size); + self.texture.for_each_in_area(func, self.offset, self.inner_size); + } + + fn update_vertices(&mut self, renderer: &WgpuRenderer) { + + debug!("Updating vertices..."); + let size = self.texture.get_size(); + + // compute normalized coordinates + let x_size = self.inner_size.w as f32 / size.w as f32 * self.scale; + let y_size = self.inner_size.h as f32 / size.h as f32 * self.scale; + let x_offset = self.offset.x as f32 / size.w as f32; + let y_offset = self.offset.y as f32 / size.h as f32; + + // compute mesh size + let w = self.inner_size.w as f32; + let h = self.inner_size.h as f32; + + let mesh = [ + TextureVertex { + position: [-w, -h], + tex_coords: [x_offset , y_offset + y_size], + }, + TextureVertex { + position: [ w, -h], + tex_coords: [x_offset + x_size, y_offset + y_size], + }, + TextureVertex { + position: [ w, h], + tex_coords: [x_offset + x_size, y_offset ], + }, + TextureVertex { + position: [-w, h], + tex_coords: [x_offset , y_offset ], + }, + ]; + + self.mesh.set_vertices(renderer, &mesh); + self.vertice_update_needed = false; + info!("Vertices updated!"); } } +impl Sprite for TextureSprite { + + fn set_position(&mut self, pos: Position) { + self.matrix.set_position(pos); + } + + fn set_rotation(&mut self, rot: f32) { + self.matrix.set_rotation(rot); + } + + fn set_alpha(&mut self, _alpha: u8) { + todo!(); + } + + fn set_scale(&mut self, scale: f32) { + self.matrix.set_scale(scale); + } + + fn render(&mut self, renderer: &mut WgpuRenderer) { + + // update mesh if necessary + if self.vertice_update_needed == true { + self.update_vertices(renderer); + } + + // update texture if necessary + let texture = self.texture.texture(); + if texture.borrow().is_synced == false { + texture.borrow_mut().update(&mut renderer.queue); + } + + // create command encoder + let mut encoder = renderer.device + .create_command_encoder(&wgpu::CommandEncoderDescriptor { + label: Some("Render Encoder"), + }); + + // write render pass + PIPELINE.with(|pipeline| { + let pipeline = pipeline.borrow(); + let texture_bind_group = &texture.borrow().bind_group; + + let view = renderer.create_texture_view(); + let mut render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { + label: Some("Render Pass"), + color_attachments: &[Some(wgpu::RenderPassColorAttachment { + view: &view, + resolve_target: None, + ops: wgpu::Operations { + load: wgpu::LoadOp::Load, store: true, }, + })], + depth_stencil_attachment: None, + }); + + render_pass.set_pipeline(pipeline.as_ref().unwrap()); + render_pass.set_vertex_buffer(0, self.mesh.get_vertex_buffer_slice()); + render_pass.set_index_buffer(self.mesh.get_index_buffer_slice(), + wgpu::IndexFormat::Uint16); + render_pass.set_bind_group(0, + self.matrix.get_uniform().get_bind_group(&renderer.queue), + &[]); + render_pass.set_bind_group(1, texture_bind_group, &[]); + render_pass.draw_indexed(0..6, 0, 0..1); + + drop(render_pass); + }); + + renderer.queue.submit(std::iter::once(encoder.finish())); + } +} + +//--Pipeline initialization------------------------------------------------------------------------- fn initialize_pipeline(renderer: &WgpuRenderer) -> wgpu::RenderPipeline { let shader = renderer.device.create_shader_module(wgpu::ShaderModuleDescriptor { @@ -147,7 +227,7 @@ fn initialize_pipeline(renderer: &WgpuRenderer) -> wgpu::RenderPipeline { module: &shader, entry_point: "vs_main", buffers: &[ - TextureVertex::desc(), + TextureVertex::layout(), ], }, fragment: Some(wgpu::FragmentState { @@ -183,76 +263,26 @@ fn initialize_pipeline(renderer: &WgpuRenderer) -> wgpu::RenderPipeline { }) } -impl Sprite for TextureSprite { +//--TextureVertex struct---------------------------------------------------------------------------- - fn set_position(&mut self, pos: Position) { - self.matrix.set_position(pos); - } +#[repr(C)] +#[derive(Copy, Clone, Debug, bytemuck::Pod, bytemuck::Zeroable)] +pub struct TextureVertex { + pub position: [f32; 2], + pub tex_coords: [f32; 2], +} - fn set_rotation(&mut self, rot: f32) { - self.matrix.set_rotation(rot); - } +impl TextureVertex { - fn set_alpha(&mut self, _alpha: u8) { - todo!(); - } + const ATTRIBS: [wgpu::VertexAttribute; 2] = + wgpu::vertex_attr_array![0 => Float32x2, 1 => Float32x2]; - fn set_scale(&mut self, scale: f32) { - self.matrix.set_scale(scale); - } - - fn render(&mut self, renderer: &mut WgpuRenderer) { - - let texture = &self.texture.texture(); - if texture.borrow().is_synced == false { - //TODO modify that - texture.borrow_mut().update(&mut renderer.queue); + pub fn layout<'a>() -> wgpu::VertexBufferLayout<'a> { + wgpu::VertexBufferLayout { + array_stride: std::mem::size_of::() as wgpu::BufferAddress, + step_mode: wgpu::VertexStepMode::Vertex, + attributes: &Self::ATTRIBS, } - - if self.gpu_mesh.is_synced() == false { - self.gpu_mesh.update(&mut renderer.queue); - } - - let mut encoder = renderer.device - .create_command_encoder(&wgpu::CommandEncoderDescriptor { - label: Some("Render Encoder"), - }); - - PIPELINE.with(|pipeline| { - let pipeline = pipeline.borrow(); - let texture_bind_group = &texture.borrow().bind_group; - - let view = renderer.create_texture_view(); - let mut render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { - label: Some("Render Pass"), - color_attachments: &[Some(wgpu::RenderPassColorAttachment { - view: &view, - resolve_target: None, - ops: wgpu::Operations { - load: wgpu::LoadOp::Load, store: true, }, - })], - depth_stencil_attachment: None, - }); - - render_pass.set_pipeline(pipeline.as_ref().unwrap()); - render_pass.set_vertex_buffer(0, self.gpu_mesh.get_vertex_buffer_slice()); - render_pass.set_index_buffer(self.gpu_mesh.get_index_buffer_slice(), - wgpu::IndexFormat::Uint16); - render_pass.set_bind_group(0, - self.matrix.get_uniform().get_bind_group(&renderer.queue), - &[]); - render_pass.set_bind_group(1, texture_bind_group, &[]); - //render_pass.set_push_constants( - // wgpu::ShaderStages::VERTEX, - // 0, - // bytemuck::bytes_of(&(self.aspect_matrix))// * matrix.get_matrix())) - //); - render_pass.draw_indexed(0..self.gpu_mesh.get_index_number(), 0, 0..1); - - drop(render_pass); - }); - - renderer.queue.submit(std::iter::once(encoder.finish())); } }