diff --git a/Cargo.lock b/Cargo.lock index b1047b9..802b84c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,12 +17,73 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "aligned-vec" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" +dependencies = [ + "equator", +] + +[[package]] +name = "anyhow" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" + +[[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.104", +] + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + [[package]] name = "autocfg" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "av1-grain" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f3efb2ca85bc610acfa917b5aaa36f3fcbebed5b3182d7f877b02531c4b80c8" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ea8ef51aced2b9191c08197f55450d830876d9933f8f48a429b354f1d496b42" +dependencies = [ + "arrayvec", +] + [[package]] name = "backtrace" version = "0.3.75" @@ -38,6 +99,12 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "bcdec_rs" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f09c37bc0e9f0924b7dae9988265ef3c76c88538f41a3b06caf4bed07cee5226" + [[package]] name = "better_default" version = "1.0.5" @@ -46,27 +113,71 @@ checksum = "7b9a5040dce49a7642c97ccb1ae59567098967b5d52c29773f1299a42d23bb39" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +[[package]] +name = "bitstream-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" + +[[package]] +name = "built" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" + [[package]] name = "bumpalo" version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" +[[package]] +name = "bytemuck" +version = "1.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "441473f2b4b0459a68628c744bc61d23e730fb00128b841d30fa4bb3972257e4" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + [[package]] name = "byteorder" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + [[package]] name = "cc" version = "1.2.30" @@ -78,6 +189,16 @@ dependencies = [ "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]] name = "cfg-if" version = "1.0.1" @@ -180,6 +301,24 @@ version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "ddsfile" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479dfe1e6737aa9e96c6ac7b69689dc4c32da8383f2c12744739d76afa8b66c4" +dependencies = [ + "bitflags 2.9.1", + "byteorder", + "enum-primitive-derive", + "num-traits", +] + [[package]] name = "dialoguer" version = "0.11.0" @@ -205,6 +344,37 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" +[[package]] +name = "enum-primitive-derive" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c375b9c5eadb68d0a6efee2999fef292f45854c3444c86f09d8ab086ba942b0e" +dependencies = [ + "num-traits", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "equator" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" +dependencies = [ + "equator-macro", +] + +[[package]] +name = "equator-macro" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + [[package]] name = "equivalent" version = "1.0.2" @@ -237,6 +407,15 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + [[package]] name = "flate2" version = "1.1.2" @@ -275,6 +454,17 @@ dependencies = [ "cc", ] +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", +] + [[package]] name = "getrandom" version = "0.3.3" @@ -284,7 +474,7 @@ dependencies = [ "cfg-if", "libc", "r-efi", - "wasi", + "wasi 0.14.2+wasi-0.2.4", ] [[package]] @@ -293,6 +483,17 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +[[package]] +name = "half" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" +dependencies = [ + "bytemuck", + "cfg-if", + "crunchy", +] + [[package]] name = "hashbrown" version = "0.15.4" @@ -305,6 +506,48 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "image" +version = "0.25.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db35664ce6b9810857a38a906215e75a9c879f0696556a39f59c62829710251a" +dependencies = [ + "bytemuck", + "byteorder-lite", + "num-traits", + "png", + "ravif", + "rayon", +] + +[[package]] +name = "image_dds" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3388630ed66c07107145ac5b13c804261f18d5daf0dd2699481888aba16cd38" +dependencies = [ + "bcdec_rs", + "bytemuck", + "ddsfile", + "half", + "image", + "intel_tex_2", + "strum 0.26.3", + "thiserror 1.0.69", +] + +[[package]] +name = "imgref" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" + [[package]] name = "indenter" version = "0.3.3" @@ -334,13 +577,52 @@ dependencies = [ "web-time", ] +[[package]] +name = "intel_tex_2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd699c0e6adcac28c06db24a220c834c8ec811e0d2d80f0261bb14e01737b4dc" +dependencies = [ + "ispc_rt", +] + +[[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.104", +] + +[[package]] +name = "ispc_rt" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "975b362d330dc07079e546ef0e7c6e7ab03f7fbcf251609d5d5dcd3caf398ed6" +dependencies = [ + "libc", + "num_cpus", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "jobserver" version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" dependencies = [ - "getrandom", + "getrandom 0.3.3", "libc", ] @@ -366,6 +648,16 @@ version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +[[package]] +name = "libfuzzer-sys" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5037190e1f70cbeef565bd267599242926f724d3b8a9f510fd7e0b540cfa4404" +dependencies = [ + "arbitrary", + "cc", +] + [[package]] name = "linux-raw-sys" version = "0.9.4" @@ -388,6 +680,25 @@ version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + +[[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]] name = "memchr" version = "2.7.5" @@ -409,6 +720,12 @@ dependencies = [ "ree-pak-core", ] +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.8.9" @@ -416,6 +733,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", + "simd-adler32", ] [[package]] @@ -424,12 +742,34 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9252111cf132ba0929b6f8e030cac2a24b507f3a4d6db6fb2896f27b354c714b" +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + [[package]] name = "nohash" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0f889fb66f7acdf83442c35775764b51fed3c606ab9cee51500dbde2cf528ca" +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + [[package]] name = "num" version = "0.4.3" @@ -463,6 +803,17 @@ dependencies = [ "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.104", +] + [[package]] name = "num-integer" version = "0.1.46" @@ -503,6 +854,16 @@ dependencies = [ "autocfg", ] +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + [[package]] name = "object" version = "0.36.7" @@ -547,6 +908,12 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + [[package]] name = "pin-project-lite" version = "0.2.16" @@ -559,12 +926,34 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + [[package]] name = "portable-atomic" version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + [[package]] name = "proc-macro2" version = "1.0.95" @@ -574,6 +963,31 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "profiling" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" +dependencies = [ + "quote", + "syn 2.0.104", +] + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + [[package]] name = "quote" version = "1.0.40" @@ -589,6 +1003,86 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[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 0.2.16", +] + +[[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", + "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 1.0.69", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.11.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5825c26fddd16ab9f515930d49028a630efec172e903483c94796cfe31893e6b" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] + [[package]] name = "rayon" version = "1.10.0" @@ -611,12 +1105,16 @@ dependencies = [ [[package]] name = "re-tex" -version = "0.1.0" +version = "0.2.0" dependencies = [ "better_default", "byteorder", + "ddsfile", "gdeflate", - "strum", + "image", + "image_dds", + "num-traits", + "strum 0.27.2", "thiserror 2.0.12", ] @@ -626,14 +1124,14 @@ version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e8af0dde094006011e6a740d4879319439489813bd0bcdc7d821beaeeff48ec" dependencies = [ - "bitflags", + "bitflags 2.9.1", ] [[package]] name = "ree-pak-core" version = "0.4.1" dependencies = [ - "bitflags", + "bitflags 2.9.1", "byteorder", "flate2", "indexmap", @@ -648,6 +1146,12 @@ dependencies = [ "zstd", ] +[[package]] +name = "rgb" +version = "0.8.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" + [[package]] name = "rustc-demangle" version = "0.1.25" @@ -666,13 +1170,19 @@ version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" dependencies = [ - "bitflags", + "bitflags 2.9.1", "errno", "libc", "linux-raw-sys", "windows-sys 0.60.2", ] +[[package]] +name = "rustversion" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" + [[package]] name = "scopeguard" version = "1.2.0" @@ -696,7 +1206,16 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", ] [[package]] @@ -720,19 +1239,56 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +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]] name = "smallvec" version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros 0.26.4", +] + [[package]] name = "strum" version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" dependencies = [ - "strum_macros", + "strum_macros 0.27.2", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.104", ] [[package]] @@ -744,7 +1300,18 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 2.0.104", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", ] [[package]] @@ -758,6 +1325,25 @@ dependencies = [ "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]] name = "tempfile" version = "3.20.0" @@ -765,7 +1351,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" dependencies = [ "fastrand", - "getrandom", + "getrandom 0.3.3", "once_cell", "rustix", "windows-sys 0.59.0", @@ -797,7 +1383,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] [[package]] @@ -808,7 +1394,7 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] [[package]] @@ -820,6 +1406,40 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + [[package]] name = "tracing" version = "0.1.41" @@ -869,9 +1489,9 @@ checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-width" -version = "0.2.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" +checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" [[package]] name = "unit-prefix" @@ -879,12 +1499,35 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "323402cff2dd658f39ca17c789b502021b3f18707c91cdf22e3838e1b4023817" +[[package]] +name = "v_frame" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "666b7727c8875d6ab5db9533418d7c764233ac9c0cff1d469aec8fa127597be2" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + [[package]] name = "valuable" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" +[[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + [[package]] name = "wasi" version = "0.14.2+wasi-0.2.4" @@ -902,6 +1545,7 @@ checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", ] @@ -915,7 +1559,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn", + "syn 2.0.104", "wasm-bindgen-shared", ] @@ -937,7 +1581,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1107,13 +1751,42 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" +[[package]] +name = "winnow" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" +dependencies = [ + "memchr", +] + [[package]] name = "wit-bindgen-rt" version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "bitflags", + "bitflags 2.9.1", +] + +[[package]] +name = "zerocopy" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", ] [[package]] diff --git a/src/app.rs b/src/app.rs new file mode 100644 index 0000000..d20d934 --- /dev/null +++ b/src/app.rs @@ -0,0 +1,264 @@ +use std::{ + io::{self, Write}, + path::Path, + sync::{ + atomic::{AtomicUsize, Ordering}, + Arc, + }, + time::Duration, +}; + +use fs_err as fs; + +use color_eyre::eyre::bail; +use colored::Colorize; +use dialoguer::{theme::ColorfulTheme, Input, Select}; +use fs::OpenOptions; +use indicatif::{HumanBytes, ProgressBar, ProgressStyle}; +use parking_lot::Mutex; +use rayon::iter::{IntoParallelRefIterator, ParallelIterator}; +use re_tex::tex::Tex; +use ree_pak_core::{ + filename::{FileNameExt, FileNameTable}, + pak::PakEntry, + read::archive::PakArchiveReader, + write::FileOptions, +}; + +const FILE_NAME_LIST: &[u8] = include_bytes!("../assets/MHWs_STM_Release.list.zst"); + +#[derive(Debug, Clone)] +pub struct Config { + pub input_path: Option, + pub output_path: Option, + pub use_full_package_mode: bool, + pub use_feature_clone: bool, +} + +impl Default for Config { + fn default() -> Self { + Self { + input_path: Default::default(), + output_path: Default::default(), + use_full_package_mode: false, + use_feature_clone: true, + } + } +} + +#[derive(Default)] +pub struct App { + config: Config, +} + +impl App { + pub fn run(&mut self) -> color_eyre::Result<()> { + println!("Version v{} - Tool by @Eigeen", env!("CARGO_PKG_VERSION")); + println!("Get updates at https://github.com/eigeen/mhws-tex-decompressor"); + println!(); + + // Mode selection + let mode = Select::with_theme(&ColorfulTheme::default()) + .with_prompt("Select mode") + .items(&["Automatic", "Manual"]) + .default(0) + .interact()?; + let auto_mode = mode == 0; + + if auto_mode { + self.auto_mode() + } else { + self.manual_mode() + } + } + + fn auto_mode(&mut self) -> color_eyre::Result<()> { + todo!() + } + + fn manual_mode(&mut self) -> color_eyre::Result<()> { + let input: String = Input::with_theme(&ColorfulTheme::default()) + .show_default(true) + .default("re_chunk_000.pak.sub_000.pak".to_string()) + .with_prompt("Input .pak file path") + .interact_text() + .unwrap() + .trim_matches(|c| c == '\"' || c == '\'') + .to_string(); + + let input_path = Path::new(&input); + if !input_path.is_file() { + bail!("input file not exists."); + } + + const FALSE_TRUE_SELECTION: [&str; 2] = ["False", "True"]; + + let use_full_package_mode = Select::with_theme(&ColorfulTheme::default()) + .with_prompt( + "Package all files, including non-tex files (for replacing original files)", + ) + .default(0) + .items(&FALSE_TRUE_SELECTION) + .interact() + .unwrap(); + let use_full_package_mode = use_full_package_mode == 1; + + let use_feature_clone = Select::with_theme(&ColorfulTheme::default()) + .with_prompt("Clone feature flags from original file?") + .default(1) + .items(&FALSE_TRUE_SELECTION) + .interact() + .unwrap(); + let use_feature_clone = use_feature_clone == 1; + + println!("Loading embedded file name table..."); + let filename_table = FileNameTable::from_bytes(FILE_NAME_LIST)?; + + let file = fs::File::open(input_path)?; + let mut reader = io::BufReader::new(file); + + println!("Reading pak archive..."); + let pak_archive = ree_pak_core::read::read_archive(&mut reader)?; + let archive_reader = PakArchiveReader::new(reader, &pak_archive); + let archive_reader_mtx = Mutex::new(archive_reader); + + // filtered entries + let entries = if use_full_package_mode { + pak_archive.entries().iter().collect::>() + } else { + println!("Filtering entries..."); + pak_archive + .entries() + .iter() + .filter(|entry| is_tex_file(entry.hash(), &filename_table)) + .collect::>() + }; + + // new pak archive + let output_path = input_path.with_extension("uncompressed.pak"); + println!("Output file: {}", output_path.to_string_lossy()); + let out_file = OpenOptions::new() + .create(true) + .truncate(true) + .write(true) + .open(output_path)?; + let pak_writer = ree_pak_core::write::PakWriter::new(out_file, entries.len() as u64); + let pak_writer_mtx = Arc::new(Mutex::new(pak_writer)); + + let bar = ProgressBar::new(entries.len() as u64); + bar.set_style( + ProgressStyle::default_bar() + .template("Bytes written: {msg}\n{pos}/{len} {wide_bar}")?, + ); + bar.enable_steady_tick(Duration::from_millis(200)); + + let pak_writer_mtx1 = Arc::clone(&pak_writer_mtx); + let bar1 = bar.clone(); + let bytes_written = AtomicUsize::new(0); + let err = entries + .par_iter() + .try_for_each(move |&entry| -> color_eyre::Result<()> { + let pak_writer_mtx = &pak_writer_mtx1; + let bar = &bar1; + // read raw tex file + // parse tex file + let mut entry_reader = { + let mut archive_reader = archive_reader_mtx.lock(); + archive_reader.owned_entry_reader(entry.clone())? + }; + + if !is_tex_file(entry.hash(), &filename_table) { + // plain file, just copy + let mut buf = vec![]; + std::io::copy(&mut entry_reader, &mut buf)?; + let mut pak_writer = pak_writer_mtx.lock(); + let write_bytes = write_to_pak( + &mut pak_writer, + entry, + entry.hash(), + &buf, + use_feature_clone, + )?; + bytes_written.fetch_add(write_bytes, Ordering::SeqCst); + } else { + let mut tex = Tex::from_reader(&mut entry_reader)?; + // decompress mipmaps + tex.batch_decompress()?; + + let tex_bytes = tex.as_bytes()?; + let mut pak_writer = pak_writer_mtx.lock(); + let write_bytes = write_to_pak( + &mut pak_writer, + entry, + entry.hash(), + &tex_bytes, + use_feature_clone, + )?; + bytes_written.fetch_add(write_bytes, Ordering::SeqCst); + } + + bar.inc(1); + if bar.position() % 100 == 0 { + bar.set_message( + HumanBytes(bytes_written.load(Ordering::SeqCst) as u64).to_string(), + ); + } + Ok(()) + }); + if let Err(e) = err { + eprintln!("Error occurred when processing tex: {e}"); + eprintln!( + "The process terminated early, we'll save the current processed tex files to pak file." + ); + } + + match Arc::try_unwrap(pak_writer_mtx) { + Ok(pak_writer) => pak_writer.into_inner().finish()?, + Err(_) => panic!("Arc::try_unwrap failed"), + }; + + bar.finish(); + println!("{}", "Done!".cyan().bold()); + if !use_full_package_mode { + println!( + "You should rename the output file like `re_chunk_000.pak.sub_000.pak.patch_xxx.pak`." + ); + } + + Ok(()) + } +} + +fn is_tex_file(hash: u64, file_name_table: &FileNameTable) -> bool { + let Some(file_name) = file_name_table.get_file_name(hash) else { + return false; + }; + file_name.get_name().ends_with(".tex.241106027") +} + +fn write_to_pak( + writer: &mut ree_pak_core::write::PakWriter, + entry: &PakEntry, + file_name: impl FileNameExt, + data: &[u8], + use_feature_clone: bool, +) -> color_eyre::Result +where + W: io::Write + io::Seek, +{ + let mut file_options = FileOptions::default(); + if use_feature_clone { + file_options = file_options.with_unk_attr(*entry.unk_attr()) + } + writer.start_file(file_name, file_options)?; + writer.write_all(data)?; + Ok(data.len()) +} + +fn wait_for_exit() { + let _: String = Input::with_theme(&ColorfulTheme::default()) + .with_prompt("Press Enter to exit") + .allow_empty(true) + .interact_text() + .unwrap(); +} diff --git a/src/chunk.rs b/src/chunk.rs new file mode 100644 index 0000000..75c3c65 --- /dev/null +++ b/src/chunk.rs @@ -0,0 +1,5 @@ +//! Chunk file name format + +pub struct ChunkName { + major_id: u32, +} diff --git a/src/main.rs b/src/main.rs index dc66fa3..2030203 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,6 @@ +mod app; +mod chunk; + use std::{ io::{self, Write}, path::Path, @@ -25,19 +28,27 @@ use ree_pak_core::{ write::FileOptions, }; -const FILE_NAME_LIST: &[u8] = include_bytes!("../assets/MHWs_STM_Release.list.zst"); - fn main() { std::panic::set_hook(Box::new(panic_hook)); - println!("Version v{} - Tool by @Eigeen", env!("CARGO_PKG_VERSION")); - - if let Err(e) = main_entry() { + let mut app = app::App::default(); + if let Err(e) = app.run() { eprintln!("{}: {:#}", "Error".red().bold(), e); wait_for_exit(); std::process::exit(1); } wait_for_exit(); + + // println!("Version v{} - Tool by @Eigeen", env!("CARGO_PKG_VERSION")); + // println!("Get updates at https://github.com/eigeen/mhws-tex-decompressor"); + // println!(); + + // if let Err(e) = main_entry() { + // eprintln!("{}: {:#}", "Error".red().bold(), e); + // wait_for_exit(); + // std::process::exit(1); + // } + // wait_for_exit(); } fn panic_hook(info: &std::panic::PanicHookInfo) { @@ -46,154 +57,154 @@ fn panic_hook(info: &std::panic::PanicHookInfo) { std::process::exit(1); } -fn main_entry() -> color_eyre::Result<()> { - let input: String = Input::with_theme(&ColorfulTheme::default()) - .show_default(true) - .default("re_chunk_000.pak.sub_000.pak".to_string()) - .with_prompt("Input .pak file path") - .interact_text() - .unwrap() - .trim_matches(|c| c == '\"' || c == '\'') - .to_string(); +// fn main_entry() -> color_eyre::Result<()> { +// let input: String = Input::with_theme(&ColorfulTheme::default()) +// .show_default(true) +// .default("re_chunk_000.pak.sub_000.pak".to_string()) +// .with_prompt("Input .pak file path") +// .interact_text() +// .unwrap() +// .trim_matches(|c| c == '\"' || c == '\'') +// .to_string(); - let input_path = Path::new(&input); - if !input_path.is_file() { - bail!("input file not exists."); - } +// let input_path = Path::new(&input); +// if !input_path.is_file() { +// bail!("input file not exists."); +// } - const FALSE_TRUE_SELECTION: [&str; 2] = ["False", "True"]; +// const FALSE_TRUE_SELECTION: [&str; 2] = ["False", "True"]; - let use_full_package_mode = Select::with_theme(&ColorfulTheme::default()) - .with_prompt("Package all files, including non-tex files (for replacing original files)") - .default(0) - .items(&FALSE_TRUE_SELECTION) - .interact() - .unwrap(); - let use_full_package_mode = use_full_package_mode == 1; +// let use_full_package_mode = Select::with_theme(&ColorfulTheme::default()) +// .with_prompt("Package all files, including non-tex files (for replacing original files)") +// .default(0) +// .items(&FALSE_TRUE_SELECTION) +// .interact() +// .unwrap(); +// let use_full_package_mode = use_full_package_mode == 1; - let use_feature_clone = Select::with_theme(&ColorfulTheme::default()) - .with_prompt("Clone feature flags from original file?") - .default(1) - .items(&FALSE_TRUE_SELECTION) - .interact() - .unwrap(); - let use_feature_clone = use_feature_clone == 1; +// let use_feature_clone = Select::with_theme(&ColorfulTheme::default()) +// .with_prompt("Clone feature flags from original file?") +// .default(1) +// .items(&FALSE_TRUE_SELECTION) +// .interact() +// .unwrap(); +// let use_feature_clone = use_feature_clone == 1; - println!("Loading embedded file name table..."); - let filename_table = FileNameTable::from_bytes(FILE_NAME_LIST)?; +// println!("Loading embedded file name table..."); +// let filename_table = FileNameTable::from_bytes(FILE_NAME_LIST)?; - let file = fs::File::open(input_path)?; - let mut reader = io::BufReader::new(file); +// let file = fs::File::open(input_path)?; +// let mut reader = io::BufReader::new(file); - println!("Reading pak archive..."); - let pak_archive = ree_pak_core::read::read_archive(&mut reader)?; - let archive_reader = PakArchiveReader::new(reader, &pak_archive); - let archive_reader_mtx = Mutex::new(archive_reader); +// println!("Reading pak archive..."); +// let pak_archive = ree_pak_core::read::read_archive(&mut reader)?; +// let archive_reader = PakArchiveReader::new(reader, &pak_archive); +// let archive_reader_mtx = Mutex::new(archive_reader); - // filtered entries - let entries = if use_full_package_mode { - pak_archive.entries().iter().collect::>() - } else { - println!("Filtering entries..."); - pak_archive - .entries() - .iter() - .filter(|entry| is_tex_file(entry.hash(), &filename_table)) - .collect::>() - }; +// // filtered entries +// let entries = if use_full_package_mode { +// pak_archive.entries().iter().collect::>() +// } else { +// println!("Filtering entries..."); +// pak_archive +// .entries() +// .iter() +// .filter(|entry| is_tex_file(entry.hash(), &filename_table)) +// .collect::>() +// }; - // new pak archive - let output_path = input_path.with_extension("uncompressed.pak"); - println!("Output file: {}", output_path.to_string_lossy()); - let out_file = OpenOptions::new() - .create(true) - .truncate(true) - .write(true) - .open(output_path)?; - let pak_writer = ree_pak_core::write::PakWriter::new(out_file, entries.len() as u64); - let pak_writer_mtx = Arc::new(Mutex::new(pak_writer)); +// // new pak archive +// let output_path = input_path.with_extension("uncompressed.pak"); +// println!("Output file: {}", output_path.to_string_lossy()); +// let out_file = OpenOptions::new() +// .create(true) +// .truncate(true) +// .write(true) +// .open(output_path)?; +// let pak_writer = ree_pak_core::write::PakWriter::new(out_file, entries.len() as u64); +// let pak_writer_mtx = Arc::new(Mutex::new(pak_writer)); - let bar = ProgressBar::new(entries.len() as u64); - bar.set_style( - ProgressStyle::default_bar().template("Bytes written: {msg}\n{pos}/{len} {wide_bar}")?, - ); - bar.enable_steady_tick(Duration::from_millis(200)); +// let bar = ProgressBar::new(entries.len() as u64); +// bar.set_style( +// ProgressStyle::default_bar().template("Bytes written: {msg}\n{pos}/{len} {wide_bar}")?, +// ); +// bar.enable_steady_tick(Duration::from_millis(200)); - let pak_writer_mtx1 = Arc::clone(&pak_writer_mtx); - let bar1 = bar.clone(); - let bytes_written = AtomicUsize::new(0); - let err = entries - .par_iter() - .try_for_each(move |&entry| -> color_eyre::Result<()> { - let pak_writer_mtx = &pak_writer_mtx1; - let bar = &bar1; - // read raw tex file - // parse tex file - let mut entry_reader = { - let mut archive_reader = archive_reader_mtx.lock(); - archive_reader.owned_entry_reader(entry.clone())? - }; +// let pak_writer_mtx1 = Arc::clone(&pak_writer_mtx); +// let bar1 = bar.clone(); +// let bytes_written = AtomicUsize::new(0); +// let err = entries +// .par_iter() +// .try_for_each(move |&entry| -> color_eyre::Result<()> { +// let pak_writer_mtx = &pak_writer_mtx1; +// let bar = &bar1; +// // read raw tex file +// // parse tex file +// let mut entry_reader = { +// let mut archive_reader = archive_reader_mtx.lock(); +// archive_reader.owned_entry_reader(entry.clone())? +// }; - if !is_tex_file(entry.hash(), &filename_table) { - // plain file, just copy - let mut buf = vec![]; - std::io::copy(&mut entry_reader, &mut buf)?; - let mut pak_writer = pak_writer_mtx.lock(); - let write_bytes = write_to_pak( - &mut pak_writer, - entry, - entry.hash(), - &buf, - use_feature_clone, - )?; - bytes_written.fetch_add(write_bytes, Ordering::SeqCst); - } else { - let mut tex = Tex::from_reader(&mut entry_reader)?; - // decompress mipmaps - tex.batch_decompress()?; +// if !is_tex_file(entry.hash(), &filename_table) { +// // plain file, just copy +// let mut buf = vec![]; +// std::io::copy(&mut entry_reader, &mut buf)?; +// let mut pak_writer = pak_writer_mtx.lock(); +// let write_bytes = write_to_pak( +// &mut pak_writer, +// entry, +// entry.hash(), +// &buf, +// use_feature_clone, +// )?; +// bytes_written.fetch_add(write_bytes, Ordering::SeqCst); +// } else { +// let mut tex = Tex::from_reader(&mut entry_reader)?; +// // decompress mipmaps +// tex.batch_decompress()?; - let tex_bytes = tex.as_bytes()?; - let mut pak_writer = pak_writer_mtx.lock(); - let write_bytes = write_to_pak( - &mut pak_writer, - entry, - entry.hash(), - &tex_bytes, - use_feature_clone, - )?; - bytes_written.fetch_add(write_bytes, Ordering::SeqCst); - } +// let tex_bytes = tex.as_bytes()?; +// let mut pak_writer = pak_writer_mtx.lock(); +// let write_bytes = write_to_pak( +// &mut pak_writer, +// entry, +// entry.hash(), +// &tex_bytes, +// use_feature_clone, +// )?; +// bytes_written.fetch_add(write_bytes, Ordering::SeqCst); +// } - bar.inc(1); - if bar.position() % 100 == 0 { - bar.set_message( - HumanBytes(bytes_written.load(Ordering::SeqCst) as u64).to_string(), - ); - } - Ok(()) - }); - if let Err(e) = err { - eprintln!("Error occurred when processing tex: {e}"); - eprintln!( - "The process terminated early, we'll save the current processed tex files to pak file." - ); - } +// bar.inc(1); +// if bar.position() % 100 == 0 { +// bar.set_message( +// HumanBytes(bytes_written.load(Ordering::SeqCst) as u64).to_string(), +// ); +// } +// Ok(()) +// }); +// if let Err(e) = err { +// eprintln!("Error occurred when processing tex: {e}"); +// eprintln!( +// "The process terminated early, we'll save the current processed tex files to pak file." +// ); +// } - match Arc::try_unwrap(pak_writer_mtx) { - Ok(pak_writer) => pak_writer.into_inner().finish()?, - Err(_) => panic!("Arc::try_unwrap failed"), - }; +// match Arc::try_unwrap(pak_writer_mtx) { +// Ok(pak_writer) => pak_writer.into_inner().finish()?, +// Err(_) => panic!("Arc::try_unwrap failed"), +// }; - bar.finish(); - println!("{}", "Done!".cyan().bold()); - if !use_full_package_mode { - println!( - "You should rename the output file like `re_chunk_000.pak.sub_000.pak.patch_xxx.pak`." - ); - } +// bar.finish(); +// println!("{}", "Done!".cyan().bold()); +// if !use_full_package_mode { +// println!( +// "You should rename the output file like `re_chunk_000.pak.sub_000.pak.patch_xxx.pak`." +// ); +// } - Ok(()) -} +// Ok(()) +// } fn is_tex_file(hash: u64, file_name_table: &FileNameTable) -> bool { let Some(file_name) = file_name_table.get_file_name(hash) else {