This commit is contained in:
tsuki 2024-11-16 01:48:09 +08:00
parent 4caf348587
commit 6f1891f492
8 changed files with 865 additions and 188 deletions

535
Cargo.lock generated
View File

@ -93,6 +93,12 @@ dependencies = [
"memchr", "memchr",
] ]
[[package]]
name = "aligned-vec"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1"
[[package]] [[package]]
name = "allocator-api2" name = "allocator-api2"
version = "0.2.20" version = "0.2.20"
@ -114,6 +120,29 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "anyhow"
version = "1.0.93"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775"
[[package]]
name = "arbitrary"
version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223"
[[package]]
name = "arg_enum_proc_macro"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.87",
]
[[package]] [[package]]
name = "arrayref" name = "arrayref"
version = "0.3.9" version = "0.3.9"
@ -159,6 +188,29 @@ version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
[[package]]
name = "av1-grain"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf"
dependencies = [
"anyhow",
"arrayvec",
"log",
"nom",
"num-rational",
"v_frame",
]
[[package]]
name = "avif-serialize"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e335041290c43101ca215eed6f43ec437eb5a42125573f600fc3fa42b9bddd62"
dependencies = [
"arrayvec",
]
[[package]] [[package]]
name = "backtrace" name = "backtrace"
version = "0.3.74" version = "0.3.74"
@ -195,6 +247,12 @@ version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7"
[[package]]
name = "bit_field"
version = "0.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61"
[[package]] [[package]]
name = "bitflags" name = "bitflags"
version = "1.3.2" version = "1.3.2"
@ -207,6 +265,12 @@ version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
[[package]]
name = "bitstream-io"
version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2"
[[package]] [[package]]
name = "block" name = "block"
version = "0.1.6" version = "0.1.6"
@ -222,6 +286,12 @@ dependencies = [
"generic-array", "generic-array",
] ]
[[package]]
name = "built"
version = "0.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c360505aed52b7ec96a3636c3f039d99103c37d1d9b4f7a8c743d3ea9ffcd03b"
[[package]] [[package]]
name = "bumpalo" name = "bumpalo"
version = "3.16.0" version = "3.16.0"
@ -254,6 +324,12 @@ version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
[[package]]
name = "byteorder-lite"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495"
[[package]] [[package]]
name = "bytes" name = "bytes"
version = "1.8.0" version = "1.8.0"
@ -266,9 +342,21 @@ version = "1.1.37"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "40545c26d092346d8a8dab71ee48e7685a7a9cba76e634790c215b41a4a7b4cf" checksum = "40545c26d092346d8a8dab71ee48e7685a7a9cba76e634790c215b41a4a7b4cf"
dependencies = [ dependencies = [
"jobserver",
"libc",
"shlex", "shlex",
] ]
[[package]]
name = "cfg-expr"
version = "0.15.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02"
dependencies = [
"smallvec",
"target-lexicon",
]
[[package]] [[package]]
name = "cfg-if" name = "cfg-if"
version = "1.0.0" version = "1.0.0"
@ -335,6 +423,12 @@ dependencies = [
"unicode-width", "unicode-width",
] ]
[[package]]
name = "color_quant"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
[[package]] [[package]]
name = "const_panic" name = "const_panic"
version = "0.2.10" version = "0.2.10"
@ -457,6 +551,12 @@ version = "0.8.20"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80"
[[package]]
name = "crunchy"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
[[package]] [[package]]
name = "crypto-common" name = "crypto-common"
version = "0.1.6" version = "0.1.6"
@ -554,6 +654,38 @@ checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
name = "element_bridge" name = "element_bridge"
version = "0.1.0" version = "0.1.0"
[[package]]
name = "encase"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b0a05902cf601ed11d564128448097b98ebe3c6574bd7b6a653a3d56d54aa020"
dependencies = [
"const_panic",
"encase_derive",
"glam",
"thiserror",
]
[[package]]
name = "encase_derive"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "181d475b694e2dd56ae919ce7699d344d1fd259292d590c723a50d1189a2ea85"
dependencies = [
"encase_derive_impl",
]
[[package]]
name = "encase_derive_impl"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f97b51c5cc57ef7c5f7a0c57c250251c49ee4c28f819f87ac32f4aceabc36792"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.87",
]
[[package]] [[package]]
name = "equivalent" name = "equivalent"
version = "1.0.1" version = "1.0.1"
@ -570,6 +702,21 @@ dependencies = [
"windows-sys 0.52.0", "windows-sys 0.52.0",
] ]
[[package]]
name = "exr"
version = "1.73.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0"
dependencies = [
"bit_field",
"half",
"lebe",
"miniz_oxide",
"rayon-core",
"smallvec",
"zune-inflate",
]
[[package]] [[package]]
name = "fdeflate" name = "fdeflate"
version = "0.3.6" version = "0.3.6"
@ -764,6 +911,16 @@ dependencies = [
"wasm-bindgen", "wasm-bindgen",
] ]
[[package]]
name = "gif"
version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2"
dependencies = [
"color_quant",
"weezl",
]
[[package]] [[package]]
name = "gimli" name = "gimli"
version = "0.31.1" version = "0.31.1"
@ -862,6 +1019,16 @@ dependencies = [
"bitflags 2.6.0", "bitflags 2.6.0",
] ]
[[package]]
name = "half"
version = "2.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888"
dependencies = [
"cfg-if",
"crunchy",
]
[[package]] [[package]]
name = "hashbrown" name = "hashbrown"
version = "0.14.5" version = "0.14.5"
@ -878,6 +1045,12 @@ version = "0.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3"
[[package]]
name = "heck"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
[[package]] [[package]]
name = "hermit-abi" name = "hermit-abi"
version = "0.3.9" version = "0.3.9"
@ -928,12 +1101,51 @@ dependencies = [
"cc", "cc",
] ]
[[package]]
name = "image"
version = "0.25.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b"
dependencies = [
"bytemuck",
"byteorder-lite",
"color_quant",
"exr",
"gif",
"image-webp",
"num-traits",
"png",
"qoi",
"ravif",
"rayon",
"rgb",
"tiff",
"zune-core",
"zune-jpeg",
]
[[package]]
name = "image-webp"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e031e8e3d94711a9ccb5d6ea357439ef3dcbed361798bd4071dc4d9793fbe22f"
dependencies = [
"byteorder-lite",
"quick-error",
]
[[package]] [[package]]
name = "imagesize" name = "imagesize"
version = "0.12.0" version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "029d73f573d8e8d63e6d5020011d3255b28c3ba85d6cf870a07184ed23de9284" checksum = "029d73f573d8e8d63e6d5020011d3255b28c3ba85d6cf870a07184ed23de9284"
[[package]]
name = "imgref"
version = "1.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408"
[[package]] [[package]]
name = "indexmap" name = "indexmap"
version = "2.6.0" version = "2.6.0"
@ -944,6 +1156,17 @@ dependencies = [
"hashbrown 0.15.1", "hashbrown 0.15.1",
] ]
[[package]]
name = "interpolate_name"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.87",
]
[[package]] [[package]]
name = "itertools" name = "itertools"
version = "0.11.0" version = "0.11.0"
@ -953,6 +1176,15 @@ dependencies = [
"either", "either",
] ]
[[package]]
name = "itertools"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569"
dependencies = [
"either",
]
[[package]] [[package]]
name = "itoa" name = "itoa"
version = "1.0.11" version = "1.0.11"
@ -965,6 +1197,21 @@ version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
[[package]]
name = "jobserver"
version = "0.1.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0"
dependencies = [
"libc",
]
[[package]]
name = "jpeg-decoder"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0"
[[package]] [[package]]
name = "js-sys" name = "js-sys"
version = "0.3.72" version = "0.3.72"
@ -1007,12 +1254,28 @@ version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
[[package]]
name = "lebe"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.162" version = "0.2.162"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398"
[[package]]
name = "libfuzzer-sys"
version = "0.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b9569d2f74e257076d8c6bfa73fb505b46b851e51ddaecc825944aa3bed17fa"
dependencies = [
"arbitrary",
"cc",
]
[[package]] [[package]]
name = "libloading" name = "libloading"
version = "0.7.4" version = "0.7.4"
@ -1071,6 +1334,15 @@ version = "0.4.22"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
[[package]]
name = "loop9"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062"
dependencies = [
"imgref",
]
[[package]] [[package]]
name = "makepad-android-state" name = "makepad-android-state"
version = "0.1.0" version = "0.1.0"
@ -1358,6 +1630,16 @@ dependencies = [
"rawpointer", "rawpointer",
] ]
[[package]]
name = "maybe-rayon"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519"
dependencies = [
"cfg-if",
"rayon",
]
[[package]] [[package]]
name = "memchr" name = "memchr"
version = "2.7.4" version = "2.7.4"
@ -1447,10 +1729,13 @@ name = "mp_elements"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"bytemuck", "bytemuck",
"encase",
"flume", "flume",
"glam", "glam",
"image",
"mp_core", "mp_core",
"pollster", "pollster",
"quick_cache",
"regex", "regex",
"wgpu", "wgpu",
] ]
@ -1582,6 +1867,12 @@ dependencies = [
"jni-sys", "jni-sys",
] ]
[[package]]
name = "new_debug_unreachable"
version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086"
[[package]] [[package]]
name = "nom" name = "nom"
version = "7.1.3" version = "7.1.3"
@ -1592,6 +1883,12 @@ dependencies = [
"minimal-lexical", "minimal-lexical",
] ]
[[package]]
name = "noop_proc_macro"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8"
[[package]] [[package]]
name = "nu-ansi-term" name = "nu-ansi-term"
version = "0.46.0" version = "0.46.0"
@ -1602,6 +1899,16 @@ dependencies = [
"winapi", "winapi",
] ]
[[package]]
name = "num-bigint"
version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
dependencies = [
"num-integer",
"num-traits",
]
[[package]] [[package]]
name = "num-complex" name = "num-complex"
version = "0.4.6" version = "0.4.6"
@ -1611,6 +1918,17 @@ dependencies = [
"num-traits", "num-traits",
] ]
[[package]]
name = "num-derive"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.87",
]
[[package]] [[package]]
name = "num-integer" name = "num-integer"
version = "0.1.46" version = "0.1.46"
@ -1620,6 +1938,17 @@ dependencies = [
"num-traits", "num-traits",
] ]
[[package]]
name = "num-rational"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824"
dependencies = [
"num-bigint",
"num-integer",
"num-traits",
]
[[package]] [[package]]
name = "num-traits" name = "num-traits"
version = "0.2.19" version = "0.2.19"
@ -1778,6 +2107,15 @@ dependencies = [
"portable-atomic", "portable-atomic",
] ]
[[package]]
name = "ppv-lite86"
version = "0.2.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04"
dependencies = [
"zerocopy",
]
[[package]] [[package]]
name = "presser" name = "presser"
version = "0.3.1" version = "0.3.1"
@ -1798,6 +2136,34 @@ name = "profiling"
version = "1.0.16" version = "1.0.16"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d"
dependencies = [
"profiling-procmacros",
]
[[package]]
name = "profiling-procmacros"
version = "1.0.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30"
dependencies = [
"quote",
"syn 2.0.87",
]
[[package]]
name = "qoi"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001"
dependencies = [
"bytemuck",
]
[[package]]
name = "quick-error"
version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3"
[[package]] [[package]]
name = "quick_cache" name = "quick_cache"
@ -1827,12 +2193,92 @@ dependencies = [
"abi_stable", "abi_stable",
] ]
[[package]]
name = "rand"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
dependencies = [
"libc",
"rand_chacha",
"rand_core",
]
[[package]]
name = "rand_chacha"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
dependencies = [
"ppv-lite86",
"rand_core",
]
[[package]]
name = "rand_core"
version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
dependencies = [
"getrandom",
]
[[package]] [[package]]
name = "range-alloc" name = "range-alloc"
version = "0.1.3" version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c8a99fddc9f0ba0a85884b8d14e3592853e787d581ca1816c91349b10e4eeab" checksum = "9c8a99fddc9f0ba0a85884b8d14e3592853e787d581ca1816c91349b10e4eeab"
[[package]]
name = "rav1e"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9"
dependencies = [
"arbitrary",
"arg_enum_proc_macro",
"arrayvec",
"av1-grain",
"bitstream-io",
"built",
"cfg-if",
"interpolate_name",
"itertools 0.12.1",
"libc",
"libfuzzer-sys",
"log",
"maybe-rayon",
"new_debug_unreachable",
"noop_proc_macro",
"num-derive",
"num-traits",
"once_cell",
"paste",
"profiling",
"rand",
"rand_chacha",
"simd_helpers",
"system-deps",
"thiserror",
"v_frame",
"wasm-bindgen",
]
[[package]]
name = "ravif"
version = "0.11.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6"
dependencies = [
"avif-serialize",
"imgref",
"loop9",
"quick-error",
"rav1e",
"rayon",
"rgb",
]
[[package]] [[package]]
name = "raw-window-handle" name = "raw-window-handle"
version = "0.5.2" version = "0.5.2"
@ -2147,6 +2593,15 @@ version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe"
[[package]]
name = "simd_helpers"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6"
dependencies = [
"quote",
]
[[package]] [[package]]
name = "simplecss" name = "simplecss"
version = "0.2.1" version = "0.2.1"
@ -2261,6 +2716,25 @@ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]]
name = "system-deps"
version = "6.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349"
dependencies = [
"cfg-expr",
"heck",
"pkg-config",
"toml",
"version-compare",
]
[[package]]
name = "target-lexicon"
version = "0.12.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
[[package]] [[package]]
name = "termcolor" name = "termcolor"
version = "1.4.1" version = "1.4.1"
@ -2300,6 +2774,17 @@ dependencies = [
"once_cell", "once_cell",
] ]
[[package]]
name = "tiff"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e"
dependencies = [
"flate2",
"jpeg-decoder",
"weezl",
]
[[package]] [[package]]
name = "tiny-skia" name = "tiny-skia"
version = "0.11.4" version = "0.11.4"
@ -2560,12 +3045,29 @@ dependencies = [
"xmlwriter", "xmlwriter",
] ]
[[package]]
name = "v_frame"
version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b"
dependencies = [
"aligned-vec",
"num-traits",
"wasm-bindgen",
]
[[package]] [[package]]
name = "valuable" name = "valuable"
version = "0.1.0" version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
[[package]]
name = "version-compare"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b"
[[package]] [[package]]
name = "version_check" name = "version_check"
version = "0.9.5" version = "0.9.5"
@ -2578,7 +3080,7 @@ version = "5.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c73a36bc44e3039f51fbee93e39f41225f6b17b380eb70cc2aab942df06b34dd" checksum = "c73a36bc44e3039f51fbee93e39f41225f6b17b380eb70cc2aab942df06b34dd"
dependencies = [ dependencies = [
"itertools", "itertools 0.11.0",
"nom", "nom",
] ]
@ -2675,6 +3177,12 @@ dependencies = [
"wasm-bindgen", "wasm-bindgen",
] ]
[[package]]
name = "weezl"
version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082"
[[package]] [[package]]
name = "wfd" name = "wfd"
version = "0.1.7" version = "0.1.7"
@ -3135,6 +3643,7 @@ version = "0.7.35"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
dependencies = [ dependencies = [
"byteorder",
"zerocopy-derive", "zerocopy-derive",
] ]
@ -3148,3 +3657,27 @@ dependencies = [
"quote", "quote",
"syn 2.0.87", "syn 2.0.87",
] ]
[[package]]
name = "zune-core"
version = "0.4.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a"
[[package]]
name = "zune-inflate"
version = "0.2.54"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02"
dependencies = [
"simd-adler32",
]
[[package]]
name = "zune-jpeg"
version = "0.4.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "16099418600b4d8f028622f73ff6e3deaabdff330fb9a2a131dea781ee8b0768"
dependencies = [
"zune-core",
]

View File

@ -11,3 +11,6 @@ wgpu = "23.0.0"
mp_core = { path = "../mp_core", version = "*" } mp_core = { path = "../mp_core", version = "*" }
flume = "0.11.1" flume = "0.11.1"
pollster = "0.4.0" pollster = "0.4.0"
quick_cache = "0.6.9"
encase = {version="0.10.0",features=["glam"]}
image = "0.25.5"

BIN
mp_elements/image.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -1,36 +1,43 @@
#include "constants.wgsl"; #include "constants.wgsl";
#include "colormap.wgsl"; // Common Uniforms
// common_tools
// model_matrix: mat4,
// view_matrix: mat4,
// proj_matrix: mat4,
// camera_position: vec3,
// camera_front: vec3,
// camera_up: vec3,
// light_position: vec3,
// light_color: vec3,
// light_intensity: float,
@group(2) @binding(0) var<uniform> params: UniformParams; // Uniforms
@group(2) @binding(1) var data_buffer: texture_3d<f32>; @group(1) @binding(0) var<uniform> params: UniformParams;
// Data Buffer
@group(1) @binding(1) var<storage> data: array<f32>;
struct UniformParams { struct UniformParams {
origin: vec3f origin: vec4f
} }
struct VertexOutput { struct VertexOutput {
@location(0) position: vec4f, @builtin(position) position: vec4f,
@location(1) r_range: vec2f, @location(0) r_range: vec2f,
@location(2) idx: vec3f @location(1) idx: u32
}
struct UniformParams {
// Model-View-Projection matrix
mvp: mat4x4f,
origin: vec3f
} }
@vertex @vertex
fn vertex( fn vertex(
@location(0) position: vec3f, @location(0) position: vec3f,
@location(1) r_range: vec2f, @location(1) r_range: vec2f,
@location(2) idx: vec3f @location(2) idx: u32
) -> VertexOutput { ) -> VertexOutput {
var out: VertexOutput; var out: VertexOutput;
// Transform position // Transform position
out.position = params.mvp * vec4f(position, 1.0); // out.position = common_tools.proj_matrix * common_tools.view_matrix * common_tools.model_matrix * vec4f(position, 1.0);
out.position = vec4(position, 1.0);
out.r_range = r_range; out.r_range = r_range;
out.idx = idx; out.idx = idx;
@ -45,20 +52,21 @@ fn polar_forward(cartesian: vec3f) -> vec3f {
} }
@fragment @fragment
fn fragment(input: VertexOutput) -> location(0) vec4f { fn fragment(input: VertexOutput) -> @location(0) vec4f {
// Sample data texture // Sample data texture
let value = textureSample(data_texture, data_sampler, input.idx).r; let value = data[input.idx];
let ear = polar_forward(input.position); let ear = polar_forward(input.position.xyz);
var color = linear_colormap(value); // var color = linear_colormap(value);
var color = vec4(1.0, 1.0, 1.0, 1.0);
let r = ear.z; let r = ear.z;
// Valid range // Valid range
let r_range = input.r_range; // let r_range = input.r_range;
let outside_lower_bound = step(r, r_range.x); // let outside_lower_bound = step(r, r_range.x);
let outside_upper_bound = step(r_range.y, r); // let outside_upper_bound = step(r_range.y, r);
let is_outside = outside_lower_bound + outside_upper_bound; // let is_outside = outside_lower_bound + outside_upper_bound;
color.a *= 1.0 - is_outside; // color.a *= 1.0 - is_outside;
return color; return color;
} }

View File

@ -1,21 +1,26 @@
use std::collections::HashMap; use quick_cache::unsync::Cache;
use wgpu::util::DeviceExt;
use crate::elements::{ElementAttach, Elements, ElementsRef}; use crate::elements::{Element, ElementAttach, ElementsRef};
use crate::elementvec::ElementVec; use crate::elementvec::ElementVec;
use wgpu::{Backends, Instance}; use wgpu::{Backends, Instance};
use encase;
type DB = std::rc::Rc<wgpu::Buffer>;
const BACKENDS_DEFAULT: u32 = Backends::DX12.bits() const BACKENDS_DEFAULT: u32 = Backends::DX12.bits()
| Backends::METAL.bits() | Backends::METAL.bits()
| Backends::GL.bits() | Backends::GL.bits()
| Backends::BROWSER_WEBGPU.bits(); | Backends::BROWSER_WEBGPU.bits();
pub struct App { pub struct App {
device: wgpu::Device,
queue: wgpu::Queue,
common_utils: CommonUtils,
_texture: wgpu::Texture, _texture: wgpu::Texture,
_texture_size: wgpu::Extent3d,
texture_view: wgpu::TextureView, texture_view: wgpu::TextureView,
pipelines: Option<ElementVec>, output: Output,
pub pipelines: Option<ElementVec>,
pub ctx: Ctx,
buffer_pool: DataBufferPool, buffer_pool: DataBufferPool,
} }
@ -49,13 +54,14 @@ impl App {
let common_utils = CommonUtils::new(&device); let common_utils = CommonUtils::new(&device);
// Create a new texture. This texture will be used as the output texture for the render pass. // Create a new texture. This texture will be used as the output texture for the render pass.
let texture_size = wgpu::Extent3d {
width: 256,
height: 256,
depth_or_array_layers: 1,
};
let texture = device.create_texture(&wgpu::TextureDescriptor { let texture = device.create_texture(&wgpu::TextureDescriptor {
label: Some("output texture"), label: Some("output texture"),
size: wgpu::Extent3d { size: texture_size,
width: 800,
height: 600,
depth_or_array_layers: 1,
},
mip_level_count: 1, mip_level_count: 1,
sample_count: 1, sample_count: 1,
dimension: wgpu::TextureDimension::D2, dimension: wgpu::TextureDimension::D2,
@ -70,25 +76,29 @@ impl App {
// Buffer pool // Buffer pool
let buffer_pool = DataBufferPool::new(); let buffer_pool = DataBufferPool::new();
let ctx = Ctx::new(device, queue, common_utils);
let output = Output::new(&ctx.device);
Self { Self {
device,
queue,
common_utils,
pipelines: None, pipelines: None,
_texture: texture, _texture: texture,
_texture_size: texture_size,
texture_view, texture_view,
buffer_pool, buffer_pool,
output,
ctx,
} }
} }
// Create a new context struct. This struct contains references to the device, queue, bind group layout, and bind group. // Create a new context struct. This struct contains references to the device, queue, bind group layout, and bind group.
pub fn ctx(&self) -> Ctx { pub fn ctx(&self) -> &Ctx {
Ctx::new(self) &self.ctx
} }
// Initialize the app. This method creates the pipelines and initializes the elements. // Initialize the app. This method creates the pipelines and initializes the elements.
pub async fn init(&mut self) { pub async fn init(&mut self) {
self.pipelines = Some(ElementVec::init(&Ctx::new(self))); self.pipelines = Some(ElementVec::init(&self.ctx));
} }
// Get a reference to the pipelines. // Get a reference to the pipelines.
@ -97,12 +107,13 @@ impl App {
} }
pub fn common_utils_mut(&mut self) -> &mut CommonUtils { pub fn common_utils_mut(&mut self) -> &mut CommonUtils {
&mut self.common_utils &mut self.ctx.common_tools
} }
// Draw the elements in the draw list. // Draw the elements in the draw list.
pub fn draw(&self, draw_list: DrawList) { pub async fn draw(&self, draw_list: DrawList<'_, '_>) {
let mut encoder = self let mut encoder = self
.ctx
.device .device
.create_command_encoder(&wgpu::CommandEncoderDescriptor { .create_command_encoder(&wgpu::CommandEncoderDescriptor {
label: Some("draw_command_encoder"), label: Some("draw_command_encoder"),
@ -124,7 +135,7 @@ impl App {
let mut render_pass = encoder.begin_render_pass(&render_pass_desc); let mut render_pass = encoder.begin_render_pass(&render_pass_desc);
// Set the common utils bind group. // Set the common utils bind group.
let common_utils = &self.common_utils.bind_group; let common_utils = &self.ctx.common_tools.bind_group;
// Draw each element in the draw list. // Draw each element in the draw list.
for (attach, element) in draw_list.elements { for (attach, element) in draw_list.elements {
@ -146,29 +157,42 @@ impl App {
// Draw the element. // Draw the element.
element.draw(attach, &mut render_pass); element.draw(attach, &mut render_pass);
} }
} }
self.queue.submit(Some(encoder.finish())); // output
self.output.output(&mut encoder, &self._texture, self._texture_size, &self.ctx);
self.ctx.queue.submit(Some(encoder.finish()));
self.output.get_data(&self.ctx).await;
}
pub fn load_data<'a, T>(&mut self, element: &T, data: &T::Data) -> ElementAttach
where
T: Element,
{
let buffer_pool = &mut self.buffer_pool;
let ctx = &self.ctx;
element.load_data(&ctx, data, buffer_pool)
} }
} }
pub struct Ctx<'a> { pub struct Ctx {
pub device: &'a wgpu::Device, pub device: wgpu::Device,
pub queue: &'a wgpu::Queue, pub queue: wgpu::Queue,
pub common_tools_bind_group_layout: &'a wgpu::BindGroupLayout, pub common_tools: CommonUtils,
pub common_tools_bind_group: &'a wgpu::BindGroup,
} }
impl<'a> Ctx<'a> { impl Ctx {
pub fn bind_group_layout(&self) -> Vec<wgpu::BindGroupLayout> { pub fn bind_group_layout(&self) -> Vec<wgpu::BindGroupLayout> {
vec![] vec![]
} }
pub fn new(app: &'a App) -> Self { fn new(device: wgpu::Device, queue: wgpu::Queue, common: CommonUtils) -> Self {
Self { Self {
device: &app.device, device,
queue: &app.queue, queue,
common_tools_bind_group_layout: &app.common_utils.bind_group_layout, common_tools: common,
common_tools_bind_group: &app.common_utils.bind_group,
} }
} }
} }
@ -187,8 +211,9 @@ impl<'b, 'a: 'b> DrawList<'b, 'a> {
} }
} }
#[derive(Debug, Clone, Copy, bytemuck::Pod, bytemuck::Zeroable)] // #[derive(Debug, Clone, Copy, bytemuck::Pod, bytemuck::Zeroable, Default)]
#[repr(C)] // #[repr(C)]
#[derive(Debug, Clone, Copy, encase::ShaderType, Default)]
pub struct CommonUniform { pub struct CommonUniform {
pub model_matrix: glam::Mat4, pub model_matrix: glam::Mat4,
pub view_matrix: glam::Mat4, pub view_matrix: glam::Mat4,
@ -201,6 +226,14 @@ pub struct CommonUniform {
pub light_intensity: f32, pub light_intensity: f32,
} }
impl CommonUniform {
fn as_slice(&self) -> encase::internal::Result<Vec<u8>> {
let mut buffer = encase::UniformBuffer::new(Vec::new());
buffer.write(self)?;
Ok(buffer.into_inner())
}
}
pub struct CommonUtils { pub struct CommonUtils {
pub bind_group_layout: wgpu::BindGroupLayout, pub bind_group_layout: wgpu::BindGroupLayout,
pub bind_group: wgpu::BindGroup, pub bind_group: wgpu::BindGroup,
@ -223,11 +256,12 @@ impl CommonUtils {
}], }],
}); });
let buffer = device.create_buffer(&wgpu::BufferDescriptor { let common_uniform = CommonUniform::default();
let buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
label: Some("common_utils_buffer"), label: Some("common_utils_buffer"),
size: std::mem::size_of::<CommonUniform>() as u64, contents: &common_uniform.as_slice().unwrap(),
usage: wgpu::BufferUsages::COPY_DST | wgpu::BufferUsages::UNIFORM, usage: wgpu::BufferUsages::COPY_DST | wgpu::BufferUsages::UNIFORM,
mapped_at_creation: false,
}); });
let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor {
@ -248,25 +282,122 @@ impl CommonUtils {
} }
pub struct DataBufferPool { pub struct DataBufferPool {
buffers: HashMap<BufferKey, wgpu::Buffer>, // buffers: HashMap<BufferKey, wgpu::Buffer>,
buffers: Cache<BufferKey, DB>,
} }
impl DataBufferPool { impl DataBufferPool {
pub fn new() -> Self { pub fn new() -> Self {
Self { Self {
buffers: HashMap::new(), buffers: Cache::new(10),
} }
} }
pub fn get_or_create_buffer(&mut self) {} pub fn get_or_create_buffer<F>(&mut self, key: BufferKey, f: F) -> Option<&DB>
where
F: FnOnce() -> wgpu::Buffer,
{
let buffer = self
.buffers
.get_or_insert_with(&key, || {
Ok::<std::rc::Rc<wgpu::Buffer>, ()>(std::rc::Rc::new(f()))
})
.unwrap();
buffer
}
} }
#[derive(Debug, PartialEq, Eq, Hash)] #[derive(Debug, PartialEq, Eq, Hash, Clone)]
pub struct BufferKey { pub struct BufferKey {
pub size: u64, pub id: u64,
pub from: String, pub from: String,
} }
impl BufferKey {
pub fn new(from: String) -> Self {
Self { id: 0, from }
}
}
pub struct Output {
output_buffer: wgpu::Buffer,
}
impl Output {
pub fn new(device: &wgpu::Device) -> Self {
let u32_size = std::mem::size_of::<u32>() as u32;
let output_buffer_size = (u32_size * 256 * 256) as wgpu::BufferAddress;
let output_buffer_desc = wgpu::BufferDescriptor {
size: output_buffer_size,
usage: wgpu::BufferUsages::COPY_DST
// MAP_READ 告诉 wpgu 我们要在 cpu 端读取此缓冲区
| wgpu::BufferUsages::MAP_READ,
label: None,
mapped_at_creation: false,
};
let output_buffer = device.create_buffer(&output_buffer_desc);
Self { output_buffer }
}
pub fn output(
&self,
encoder: &mut wgpu::CommandEncoder,
texture: &wgpu::Texture,
texture_size: wgpu::Extent3d,
ctx: &Ctx,
) {
let u32_size = std::mem::size_of::<u32>() as u32;
encoder.copy_texture_to_buffer(
wgpu::ImageCopyTexture {
aspect: wgpu::TextureAspect::All,
texture: &texture,
mip_level: 0,
origin: wgpu::Origin3d::ZERO,
},
wgpu::ImageCopyBuffer {
buffer: &self.output_buffer,
layout: wgpu::ImageDataLayout {
offset: 0,
bytes_per_row: Some(u32_size * 256),
rows_per_image: Some(256),
},
},
texture_size,
);
}
pub async fn get_data(&self,ctx: &Ctx) {
let device = &ctx.device;
// 需要对映射变量设置范围,以便我们能够解除缓冲区的映射
let buffer_slice = self.output_buffer.slice(..);
// 注意:我们必须在 await future 之前先创建映射,然后再调用 device.poll()。
// 否则,应用程序将停止响应。
let (tx, rx) = flume::bounded(1);
buffer_slice.map_async(wgpu::MapMode::Read, move |result| {
tx.send(result).unwrap();
});
device.poll(wgpu::Maintain::Wait).panic_on_timeout();
if let Ok(Ok(())) = rx.recv_async().await {
let data = buffer_slice.get_mapped_range();
use image::{ImageBuffer, Rgba};
let buffer =
ImageBuffer::<Rgba<u8>, _>::from_raw(256,256, data).unwrap();
buffer.save("image.png").unwrap();
println!("保存图片成功!");
// 解除缓冲区映射
self.output_buffer.unmap();
} else {
panic!("从 gpu 读取数据失败!");
}
}
}
mod test { mod test {
use mp_core::{PluginManager, RadarGridData}; use mp_core::{PluginManager, RadarGridData};
@ -275,39 +406,37 @@ mod test {
use super::*; use super::*;
#[test] #[test]
fn test_app() { fn test_app() {
let plugin_manager = PluginManager::new("/Users/tsuki/projects/mp/loaders").unwrap(); let plugin_manager =
PluginManager::new(r#"C:\Users\qwin7\projects\radarmp\loaders"#).unwrap();
let data = plugin_manager.try_load_data( let data = plugin_manager.try_load_data(
"/Users/tsuki/Desktop/Z_RADR_I_X5775_20230726180000_O_DOR-XPD-CAP-FMT.BIN.zip", // "/Users/tsuki/Desktop/Z_RADR_I_X5775_20230726180000_O_DOR-XPD-CAP-FMT.BIN.zip",
r#"C:\Users\qwin7\Downloads\ZJSXAA_20230113070200_R.dat.gz"#,
); );
pollster::block_on(async { pollster::block_on(async {
let mut app = App::instant().await; let mut app = App::instant().await;
app.init().await; app.init().await;
let pipelines = app.pipelines(); let pipelines = app.pipelines.as_ref().unwrap();
let ctx = app.ctx();
let ppi = pipelines.ppi(); let ppi = pipelines.ppi();
let ctx = &app.ctx;
let buffer_pool = &mut app.buffer_pool;
if let Ok(data) = data { if let Ok(data) = data {
let first_block = data.first().unwrap(); let first_block = data.first().unwrap();
// Convert the first block into a PPI struct. // Convert the first block into a PPI struct.
if let Ok(data) = first_block.try_into() { if let Ok(data) = first_block.try_into() {
let buffer_pool = &mut app.buffer_pool; let attachment = ppi.load_data(&ctx, data, buffer_pool);
// Reused buffer is None, so a new attachment is created.
let attachment = ppi.new_attachment(&ctx, buffer_pool);
// Load the data into the attachment.
ppi.load_data(&ctx, data, &attachment);
// Create a new draw list and push the attachment into it. // Create a new draw list and push the attachment into it.
let mut draw_list = DrawList::new(); let mut draw_list = DrawList::new();
draw_list.push(ppi, &attachment); draw_list.push(ppi, &attachment);
// Draw the elements in the draw list. // Draw the elements in the draw list.
app.draw(draw_list); app.draw(draw_list).await;
} }
} else { } else {
panic!("Failed to load data"); panic!("Failed to load data");

View File

@ -1,5 +1,5 @@
pub mod ppi; pub mod ppi;
use crate::app::{Ctx, DataBufferPool}; use crate::app::{BufferKey, Ctx, DataBufferPool};
pub use ppi::PPI; pub use ppi::PPI;
use std::any::Any; use std::any::Any;
use wgpu::util::DeviceExt; use wgpu::util::DeviceExt;
@ -54,6 +54,7 @@ macro_rules! elements {
$(ElementsRef::$element_name(element) => element.draw(attach, render_pass),)+ $(ElementsRef::$element_name(element) => element.draw(attach, render_pass),)+
} }
} }
} }
}; };
@ -66,7 +67,7 @@ pub trait Element {
fn new(ctx: &Ctx) -> Self; fn new(ctx: &Ctx) -> Self;
fn new_attachment<'a>(&self, ctx: &Ctx, buffer_pool: &'a mut DataBufferPool) -> ElementAttach; // fn new_attachment<'a>(&self, ctx: &Ctx) -> ElementAttach;
// Bake the data into vertices and indices // Bake the data into vertices and indices
fn bake(&self, data: &Self::Data) -> (Vec<Self::Vertex>, Option<Vec<u32>>); fn bake(&self, data: &Self::Data) -> (Vec<Self::Vertex>, Option<Vec<u32>>);
@ -79,7 +80,12 @@ pub trait Element {
fn draw(&self, attach: &ElementAttach, render_pass: &mut wgpu::RenderPass); fn draw(&self, attach: &ElementAttach, render_pass: &mut wgpu::RenderPass);
fn load_data(&self, ctx: &Ctx, data: &Self::Data, attach: &ElementAttach); fn load_data(
&self,
ctx: &Ctx,
data: &Self::Data,
buffer_pool: &mut DataBufferPool,
) -> ElementAttach;
} }
pub struct ElementAttach { pub struct ElementAttach {
@ -88,6 +94,7 @@ pub struct ElementAttach {
pub num_indices: u32, pub num_indices: u32,
pub uniform_buffer: Option<wgpu::Buffer>, pub uniform_buffer: Option<wgpu::Buffer>,
pub bind_group: Vec<(u32, wgpu::BindGroup)>, pub bind_group: Vec<(u32, wgpu::BindGroup)>,
pub data_buffer_key: Option<BufferKey>,
} }
impl ElementAttach { impl ElementAttach {
@ -95,7 +102,7 @@ impl ElementAttach {
where where
T: bytemuck::Zeroable + bytemuck::Pod, T: bytemuck::Zeroable + bytemuck::Pod,
{ {
let device = ctx.device; let device = &ctx.device;
} }
pub fn bind(&self, render_pass: &mut wgpu::RenderPass) { pub fn bind(&self, render_pass: &mut wgpu::RenderPass) {

View File

@ -1,12 +1,13 @@
use std::{ops::Sub, result}; use std::{ops::Sub, result, vec};
use crate::{ use crate::{
app::{Ctx, DataBufferPool}, app::{BufferKey, Ctx, DataBufferPool},
utils::merge_shader, utils::merge_shader,
}; };
use bytemuck; use bytemuck;
use glam::Vec3; use glam::{Vec3, Vec4};
use mp_core::{data::CoordType, RadarGridData}; use mp_core::{data::CoordType, RadarGridData};
use wgpu::util::DeviceExt;
use super::{Element, ElementAttach}; use super::{Element, ElementAttach};
@ -22,7 +23,7 @@ pub struct PPI {
#[repr(C)] #[repr(C)]
#[derive(Debug, Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)] #[derive(Debug, Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)]
pub struct PPIUniform { pub struct PPIUniform {
origin: Vec3, origin: Vec4,
} }
#[repr(C)] #[repr(C)]
@ -30,7 +31,7 @@ pub struct PPIUniform {
pub struct PPIVertex { pub struct PPIVertex {
position: Vec3, position: Vec3,
r_ranges: [f32; 2], r_ranges: [f32; 2],
idx: [u32; 3], idx: u32,
} }
impl PPIVertex { impl PPIVertex {
@ -52,7 +53,7 @@ impl PPIVertex {
wgpu::VertexAttribute { wgpu::VertexAttribute {
offset: std::mem::size_of::<[f32; 2]>() as wgpu::BufferAddress, offset: std::mem::size_of::<[f32; 2]>() as wgpu::BufferAddress,
shader_location: 2, shader_location: 2,
format: wgpu::VertexFormat::Uint32x3, format: wgpu::VertexFormat::Uint32,
}, },
], ],
} }
@ -65,7 +66,7 @@ impl Element for PPI {
type Data = RadarGridData; type Data = RadarGridData;
fn new(ctx: &Ctx) -> Self { fn new(ctx: &Ctx) -> Self {
let device = ctx.device; let device = &ctx.device;
// Group Layout // Group Layout
let bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { let bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor {
label: Some("PPI Bind Group Layout"), label: Some("PPI Bind Group Layout"),
@ -102,7 +103,7 @@ impl Element for PPI {
label: Some("PPI Render Pipeline Layout"), label: Some("PPI Render Pipeline Layout"),
bind_group_layouts: &[ bind_group_layouts: &[
// common_tools // common_tools
&ctx.common_tools_bind_group_layout, &ctx.common_tools.bind_group_layout,
// ppi // ppi
&bind_group_layout, &bind_group_layout,
], ],
@ -124,7 +125,7 @@ impl Element for PPI {
compilation_options: Default::default(), compilation_options: Default::default(),
entry_point: Some("fragment"), entry_point: Some("fragment"),
targets: &[Some(wgpu::ColorTargetState { targets: &[Some(wgpu::ColorTargetState {
format: wgpu::TextureFormat::Bgra8UnormSrgb, format: wgpu::TextureFormat::Rgba8UnormSrgb,
blend: None, blend: None,
write_mask: wgpu::ColorWrites::ALL, write_mask: wgpu::ColorWrites::ALL,
})], })],
@ -155,65 +156,6 @@ impl Element for PPI {
} }
} }
fn new_attachment<'a>(&self, ctx: &Ctx, buffer_pool: &'a mut DataBufferPool) -> ElementAttach {
let device = ctx.device;
// Buffers
let data_buffer = buffer_pool.get_or_create_buffer();
// let data_buffer = if let Some(reused) = reused_buffer {
// reused[0]
// } else {
// &Self::create_data_buffer(device)
// };
let uniform_buffer = Self::create_uniform_buffer(device);
// Bind Group
let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor {
layout: &self.bind_group_layout,
entries: &[
wgpu::BindGroupEntry {
binding: 0,
resource: uniform_buffer.as_entire_binding(),
},
wgpu::BindGroupEntry {
binding: 1,
resource: data_buffer.as_entire_binding(),
},
],
label: Some("PPI Bind Group"),
});
// Vertex Buffer
let vertex_buffer = device.create_buffer(&wgpu::BufferDescriptor {
label: Some("PPI Vertex Buffer"),
mapped_at_creation: false,
size: std::mem::size_of::<PPIVertex>() as wgpu::BufferAddress * EMAXNUM * AMAXNUM,
usage: wgpu::BufferUsages::VERTEX,
});
// Index Buffer
let index_buffer = device.create_buffer(&wgpu::BufferDescriptor {
label: Some("PPI Index Buffer"),
mapped_at_creation: false,
size: EMAXNUM
* AMAXNUM
* RMAXNUM
* 6
* std::mem::size_of::<u32>() as wgpu::BufferAddress,
usage: wgpu::BufferUsages::INDEX,
});
ElementAttach {
vertex_buffer,
index_buffer: Some(index_buffer),
num_indices: 0,
uniform_buffer: Some(uniform_buffer),
bind_group: vec![(1, bind_group)],
}
}
fn bake(&self, data: &Self::Data) -> (Vec<Self::Vertex>, Option<Vec<u32>>) { fn bake(&self, data: &Self::Data) -> (Vec<Self::Vertex>, Option<Vec<u32>>) {
let coord_typ = data.coord_type().unwrap(); let coord_typ = data.coord_type().unwrap();
@ -240,34 +182,83 @@ impl Element for PPI {
render_pass.draw_indexed(0..attach.num_indices, 0, 0..1); render_pass.draw_indexed(0..attach.num_indices, 0, 0..1);
} }
fn load_data(&self, ctx: &Ctx, data: &Self::Data, attach: &ElementAttach) { fn load_data(
&self,
ctx: &Ctx,
data: &Self::Data,
buffer_pool: &mut DataBufferPool,
) -> ElementAttach {
let (vertex, index) = self.bake(data); let (vertex, index) = self.bake(data);
let queue = ctx.queue; let device = &ctx.device;
// Update Vertex Buffer let uniform_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
let vertex_buffer = &attach.vertex_buffer; label: Some("PPI Uniform Buffer"),
queue.write_buffer(vertex_buffer, 0, bytemuck::cast_slice(&vertex)); contents: bytemuck::cast_slice(&[PPIUniform {
origin: Vec4::new(0.0, 0.0, 0.0, 0.0),
}]),
usage: wgpu::BufferUsages::COPY_SRC | wgpu::BufferUsages::UNIFORM,
});
// Update Index Buffer // Vertex Buffer
if let Some(indices) = index { let vertex_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
let index_buffer = attach.index_buffer.as_ref().unwrap(); label: Some("PPI Vertex Buffer"),
queue.write_buffer(index_buffer, 0, bytemuck::cast_slice(&indices)); contents: bytemuck::cast_slice(&vertex),
} usage: wgpu::BufferUsages::VERTEX,
});
// Index Buffer
let num_indices = index.as_ref().unwrap().len() as u32;
let index_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
label: Some("PPI Index Buffer"),
contents: bytemuck::cast_slice(&index.unwrap()),
usage: wgpu::BufferUsages::INDEX,
});
// Load Data // Load Data
let data_array = data.get_data(); let data_array = data.get_data();
let data_array_f32 = data_array.cast_to::<f32>(); let data_array_f32 = data_array.cast_to::<f32>();
queue.write_buffer(
data_buffer, let key = self.generate_key(data);
0, let buffer = buffer_pool.get_or_create_buffer(key.clone(), || {
bytemuck::cast_slice(data_array_f32.as_slice().unwrap()), device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
); label: Some("PPI Texture Buffer"),
contents: bytemuck::cast_slice(data_array_f32.as_slice().unwrap()),
usage: wgpu::BufferUsages::COPY_DST | wgpu::BufferUsages::STORAGE,
})
});
let data_buffer = buffer.unwrap();
// Bind Group
let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor {
layout: &self.bind_group_layout,
entries: &[
wgpu::BindGroupEntry {
binding: 0,
resource: uniform_buffer.as_entire_binding(),
},
wgpu::BindGroupEntry {
binding: 1,
resource: data_buffer.as_entire_binding(),
},
],
label: Some("PPI Bind Group"),
});
ElementAttach {
vertex_buffer: vertex_buffer,
index_buffer: Some(index_buffer),
num_indices,
uniform_buffer: Some(uniform_buffer),
bind_group: vec![(1, bind_group)],
data_buffer_key: Some(key),
}
} }
} }
impl PPI { impl PPI {
fn init_shader(device: &wgpu::Device) -> wgpu::ShaderModule { fn init_shader(device: &wgpu::Device) -> wgpu::ShaderModule {
let shader_str = merge_shader("../../shaders/ppi.wgsl"); let shader_str =
merge_shader(r#"C:\Users\qwin7\projects\radarmp\mp_elements\shaders\ppi.wgsl"#);
let shader = device.create_shader_module(wgpu::ShaderModuleDescriptor { let shader = device.create_shader_module(wgpu::ShaderModuleDescriptor {
label: Some("PPI Shader Module"), label: Some("PPI Shader Module"),
source: wgpu::ShaderSource::Wgsl(shader_str.into()), source: wgpu::ShaderSource::Wgsl(shader_str.into()),
@ -278,7 +269,7 @@ impl PPI {
fn create_uniform_buffer(device: &wgpu::Device) -> wgpu::Buffer { fn create_uniform_buffer(device: &wgpu::Device) -> wgpu::Buffer {
let buffer = device.create_buffer(&wgpu::BufferDescriptor { let buffer = device.create_buffer(&wgpu::BufferDescriptor {
label: Some("PPI Uniform Buffer"), label: Some("PPI Uniform Buffer"),
usage: wgpu::BufferUsages::COPY_DST | wgpu::BufferUsages::STORAGE, usage: wgpu::BufferUsages::COPY_DST | wgpu::BufferUsages::UNIFORM,
size: 0, size: 0,
mapped_at_creation: false, mapped_at_creation: false,
}); });
@ -286,15 +277,13 @@ impl PPI {
buffer buffer
} }
fn create_data_buffer(device: &wgpu::Device) -> wgpu::Buffer { fn generate_key(&self, data: &RadarGridData) -> BufferKey {
let buffer = device.create_buffer(&wgpu::BufferDescriptor { let key_name = format!(
label: Some("PPI Texture Buffer"), "ppi_{}_{}",
usage: wgpu::BufferUsages::COPY_DST | wgpu::BufferUsages::STORAGE, data.info.value_name,
size: 0, data.info.datetime.unwrap().timestamp()
mapped_at_creation: false, );
}); BufferKey::new(key_name)
buffer
} }
fn bake_vi(e: f64, a: &Vec<f64>, r: &Vec<f64>) -> (Vec<PPIVertex>, Vec<u32>) { fn bake_vi(e: f64, a: &Vec<f64>, r: &Vec<f64>) -> (Vec<PPIVertex>, Vec<u32>) {
@ -312,7 +301,7 @@ impl PPI {
for (a_idx, _a) in sorted_azimuth.into_iter().enumerate() { for (a_idx, _a) in sorted_azimuth.into_iter().enumerate() {
for (r_idx, _r) in r.iter().enumerate() { for (r_idx, _r) in r.iter().enumerate() {
let r_ranges = [*_r as f32 - r_step_f32, *_r as f32 + r_step_f32]; let r_ranges = [*_r as f32 - r_step_f32, *_r as f32 + r_step_f32];
let idx = [0, a_idx as u32, r_idx as u32]; let idx = (a_idx * r.len() + r_idx) as u32;
// Left Top // Left Top
let lt = polar_to_cartesian(*_r + r_step, _a - azi_step, e); let lt = polar_to_cartesian(*_r + r_step, _a - azi_step, e);
vertexs.push(PPIVertex { vertexs.push(PPIVertex {

View File

@ -5,15 +5,22 @@ pub(crate) fn merge_shader<'a>(shader: &'a str) -> String {
const TOOLS: &'static str = r#"// This is a tool that merges the shader code with the shader code from the shader module. const TOOLS: &'static str = r#"// This is a tool that merges the shader code with the shader code from the shader module.
struct UniformCommonTools { struct UniformCommonTools {
model_matrix: mat4, model_matrix: mat4x4f,
view_matrix: mat4, view_matrix: mat4x4f,
proj_matrix: mat4, proj_matrix: mat4x4f,
camera_position: vec3, camera_x: f32,
camera_front: vec3, camera_y: f32,
camera_up: vec3, camera_z: f32,
light_position: vec3, camera_target_x: f32,
light_color: vec3, camera_target_y: f32,
light_intensity: float, camera_target_z: f32,
camera_up_x: f32,
camera_up_y: f32,
camera_up_z: f32,
// camera_position: vec3f,
// camera_front: vec3f,
// camera_up: vec3f,
} }
@group(0) @binding(0) var<uniform> common_tools: UniformCommonTools; @group(0) @binding(0) var<uniform> common_tools: UniformCommonTools;
@ -25,7 +32,8 @@ struct UniformCommonTools {
let base = match path.canonicalize() { let base = match path.canonicalize() {
Ok(path) => path.parent().unwrap().to_owned(), Ok(path) => path.parent().unwrap().to_owned(),
Err(e) => { Err(e) => {
panic!("Failed to canonicalize path: {}", e); // panic!("Failed to canonicalize path: {}", e);
PathBuf::from(r#"C:\Users\qwin7\projects\radarmp\mp_elements\shaders"#)
} }
}; };