Compare commits

..

51 Commits

Author SHA1 Message Date
d494adf42e implement texture_loader 2024-02-13 02:14:27 -08:00
7f29e244ed update strafesnet deps 2024-02-12 22:20:45 -08:00
aec07ef0a0 add todo to fix submeshes 2024-02-12 20:15:54 -08:00
769f325cc8 remove complete todo 2024-02-12 20:15:18 -08:00
7ade6129c7 code style 2024-02-12 20:15:18 -08:00
4a7cd0a146 fix graphics 2024-02-12 20:14:58 -08:00
6c3e0ba84c fix spawning 2024-02-12 20:14:58 -08:00
4e35feb5c2 update common 2024-02-09 00:19:20 -08:00
5401a7d69d remove snf for now 2024-02-09 00:17:11 -08:00
099e9348df add rbx_loader 2024-02-08 23:19:40 -08:00
a774c68f30 update deps 2024-02-08 23:18:50 -08:00
3335e93b70 random garbage 2024-02-08 23:00:36 -08:00
d19f5cb3ef fix physics 2024-02-08 23:00:25 -08:00
46965441b0 fixup some warnings 2024-02-08 21:26:53 -08:00
1540710942 compiles!!! 2024-02-08 20:16:59 -08:00
fcc52a1215 fix all type errors 2024-02-08 19:27:59 -08:00
7403ec8bed work happening 2024-02-08 19:10:59 -08:00
64baa64dd3 complete graphics refactor 2024-02-08 16:43:41 -08:00
eee3272293 damned deref 2024-02-08 16:43:30 -08:00
d3531a9aca implement physics::generate_models 2024-02-07 22:29:39 -08:00
4a84d3a419 compiler error fallout 2024-02-07 22:29:26 -08:00
720b65d71e PhysicsModels Ids must be bijective 2024-02-07 22:29:00 -08:00
418e3b756e notes 2024-02-07 21:54:14 -08:00
f412874317 physics mesh builder rewrite 2024-02-07 21:45:53 -08:00
96085a3076 graphics rewrite (one error left) 2024-02-07 19:47:51 -08:00
2049e2dd2c get_instances_buffer_data: surely this is the same 2024-02-07 16:22:11 -08:00
1444718d88 update id 2024-02-07 04:14:16 -08:00
915b05784e fix worker tests 2024-02-07 03:05:21 -08:00
fa3972edfd delay overflow by 2x 2024-02-07 02:39:20 -08:00
4fb2451261 remove angle limit from StyleModifiers 2024-02-07 02:38:23 -08:00
9ccab08c3e move jump count 2024-02-07 02:37:51 -08:00
9ae4c5b0db cook PhysicsMeshTransform 2024-02-06 23:09:26 -08:00
96e163643b fixups 2024-02-06 22:55:27 -08:00
50eeeb003a megatype-ify 2024-02-06 22:55:27 -08:00
5b38b2ca33 use id 2024-02-06 22:55:27 -08:00
9eb8397e6a add id dep 2024-02-06 20:28:59 -08:00
f883d5ee91 heyyy 2024-02-06 19:04:23 -08:00
0c4dab76a6 the idea 2024-02-06 17:30:02 -08:00
a8af471029 neither, see notes 2024-02-05 21:28:01 -08:00
07c11f523a wrong??? 2024-02-05 20:28:22 -08:00
a2d40e939b change the everything 2024-02-05 20:27:54 -08:00
0c7b8c8a59 graphics map function thing and don't consume map 2024-02-05 20:27:06 -08:00
d52701e94c the work 2024-02-05 19:49:36 -08:00
0f0da179a2 poly iter 2024-02-05 15:25:44 -08:00
56bf453337 wip 2024-02-04 22:41:27 -08:00
8687c65e80 wip 2024-02-04 21:00:05 -08:00
9f2c3cd242 wip 2024-02-04 21:00:05 -08:00
35a0d0d655 delete unused code 2024-02-04 21:00:05 -08:00
6c1ce904ec snf usage prototype 2024-02-04 21:00:05 -08:00
89868c6a12 move loaders to libs 2024-01-30 18:30:56 -08:00
43181c4c3f wip 2024-01-29 22:40:59 -08:00
12 changed files with 102 additions and 461 deletions

286
Cargo.lock generated

@ -82,21 +82,6 @@ dependencies = [
"libc",
]
[[package]]
name = "approx"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f2a05fd1bd10b2527e20a2cd32d8873d115b8b39fe219ee25f42a8aca6ba278"
dependencies = [
"num-traits",
]
[[package]]
name = "array-init"
version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d62b7694a562cdf5a74227903507c56ab2cc8bdd1f781ed5cb4cf9c9f810bfc"
[[package]]
name = "arrayref"
version = "0.3.7"
@ -142,30 +127,6 @@ version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
[[package]]
name = "binrw"
version = "0.13.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "173901312e9850391d4d7c1318c4e099fdc037d61870fca427429830efdb4e5f"
dependencies = [
"array-init",
"binrw_derive",
"bytemuck",
]
[[package]]
name = "binrw_derive"
version = "0.13.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cb515fdd6f8d3a357c8e19b8ec59ef53880807864329b1cb1cba5c53bf76557e"
dependencies = [
"either",
"owo-colors",
"proc-macro2",
"quote",
"syn 1.0.109",
]
[[package]]
name = "bit-set"
version = "0.5.3"
@ -237,15 +198,6 @@ version = "3.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec"
[[package]]
name = "bv"
version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8834bb1d8ee5dc048ee3124f2c7c1afcc6bc9aed03f11e9dfd8c69470a5db340"
dependencies = [
"feature-probe",
]
[[package]]
name = "bytemuck"
version = "1.14.1"
@ -266,12 +218,6 @@ dependencies = [
"syn 2.0.48",
]
[[package]]
name = "byteorder"
version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855"
[[package]]
name = "byteorder"
version = "1.5.0"
@ -338,16 +284,6 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e"
[[package]]
name = "cgmath"
version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1a98d30140e3296250832bbaaff83b27dcd6fa3cc70fb6f1f3e5c9c0023b5317"
dependencies = [
"approx",
"num-traits",
]
[[package]]
name = "codespan-reporting"
version = "0.11.1"
@ -460,30 +396,6 @@ dependencies = [
"libc",
]
[[package]]
name = "crc"
version = "3.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe"
dependencies = [
"crc-catalog",
]
[[package]]
name = "crc-catalog"
version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5"
[[package]]
name = "crc32fast"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa"
dependencies = [
"cfg-if",
]
[[package]]
name = "crossbeam-utils"
version = "0.8.19"
@ -514,7 +426,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "479dfe1e6737aa9e96c6ac7b69689dc4c32da8383f2c12744739d76afa8b66c4"
dependencies = [
"bitflags 2.4.2",
"byteorder 1.5.0",
"byteorder",
"enum-primitive-derive",
"num-traits",
]
@ -540,12 +452,6 @@ version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650"
[[package]]
name = "either"
version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a"
[[package]]
name = "enum-primitive-derive"
version = "0.2.2"
@ -573,12 +479,6 @@ dependencies = [
"windows-sys 0.52.0",
]
[[package]]
name = "feature-probe"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da"
[[package]]
name = "foreign-types"
version = "0.5.0"
@ -779,15 +679,6 @@ dependencies = [
"hashbrown",
]
[[package]]
name = "itertools"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569"
dependencies = [
"either",
]
[[package]]
name = "jni"
version = "0.21.1"
@ -953,25 +844,6 @@ dependencies = [
"libc",
]
[[package]]
name = "lzma"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "782ba3f542e8bc1349386c15e9dc3119ae6da96479f96b3863cc7a88bbdfd4e4"
dependencies = [
"byteorder 0.5.3",
]
[[package]]
name = "lzma-rs"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "297e814c836ae64db86b36cf2a557ba54368d03f6afcd7d947c266692f71115e"
dependencies = [
"byteorder 1.5.0",
"crc",
]
[[package]]
name = "malloc_buf"
version = "0.0.6"
@ -1156,12 +1028,6 @@ dependencies = [
"ttf-parser",
]
[[package]]
name = "owo-colors"
version = "3.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f"
[[package]]
name = "parking_lot"
version = "0.12.1"
@ -1341,7 +1207,8 @@ checksum = "42a9830a0e1b9fb145ebb365b8bc4ccd75f290f98c0247deafbbe2c75cefb544"
[[package]]
name = "rbx_binary"
version = "0.7.4"
source = "git+https://github.com/krakow10/rbx-dom?rev=841643178680c9f3143422778f9c52f949b222b9#841643178680c9f3143422778f9c52f949b222b9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6314dd6bf5c21d0598cdb53cf5d241aa643ba41da8b8abf7402b4a35096f03f6"
dependencies = [
"log",
"lz4",
@ -1355,7 +1222,8 @@ dependencies = [
[[package]]
name = "rbx_dom_weak"
version = "2.7.0"
source = "git+https://github.com/krakow10/rbx-dom?rev=841643178680c9f3143422778f9c52f949b222b9#841643178680c9f3143422778f9c52f949b222b9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b67b56bac99849c2e3c57547b036927f71c57cf7f4d900d04e3e4ee774ec316"
dependencies = [
"rbx_types",
"serde",
@ -1364,7 +1232,8 @@ dependencies = [
[[package]]
name = "rbx_reflection"
version = "4.5.0"
source = "git+https://github.com/krakow10/rbx-dom?rev=841643178680c9f3143422778f9c52f949b222b9#841643178680c9f3143422778f9c52f949b222b9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0d41509c991b53a7276a746a795eae2b9204f398164920f61976995b47fe1722"
dependencies = [
"rbx_types",
"serde",
@ -1374,7 +1243,8 @@ dependencies = [
[[package]]
name = "rbx_reflection_database"
version = "0.2.10+roblox-607"
source = "git+https://github.com/krakow10/rbx-dom?rev=841643178680c9f3143422778f9c52f949b222b9#841643178680c9f3143422778f9c52f949b222b9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "12e20c06fa41f7aadc79005c8354f592b2c2f4d0c61e1080ed5718dafc30aea0"
dependencies = [
"lazy_static",
"rbx_reflection",
@ -1385,7 +1255,8 @@ dependencies = [
[[package]]
name = "rbx_types"
version = "1.8.0"
source = "git+https://github.com/krakow10/rbx-dom?rev=841643178680c9f3143422778f9c52f949b222b9#841643178680c9f3143422778f9c52f949b222b9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ca23bfd469d067d81ef14f65fe09aeddc25abcf576a889d1a7664fe021cf18c"
dependencies = [
"base64",
"bitflags 1.3.2",
@ -1399,7 +1270,8 @@ dependencies = [
[[package]]
name = "rbx_xml"
version = "0.13.3"
source = "git+https://github.com/krakow10/rbx-dom?rev=841643178680c9f3143422778f9c52f949b222b9#841643178680c9f3143422778f9c52f949b222b9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f8c03f95500961c32340791d1fabd4587f6873bdbff077ecca6ae32db7960dea"
dependencies = [
"base64",
"log",
@ -1468,7 +1340,7 @@ version = "0.8.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f9860a6cc38ed1da53456442089b4dfa35e7cedaa326df63017af88385e6b20"
dependencies = [
"byteorder 1.5.0",
"byteorder",
"num-traits",
"paste",
]
@ -1479,7 +1351,7 @@ version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bffea85eea980d8a74453e5d02a8d93028f3c34725de143085a844ebe953258a"
dependencies = [
"byteorder 1.5.0",
"byteorder",
"rmp",
"serde",
]
@ -1632,7 +1504,7 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
[[package]]
name = "strafe-client"
version = "0.9.4"
version = "0.9.0"
dependencies = [
"bytemuck",
"configparser",
@ -1641,48 +1513,26 @@ dependencies = [
"id",
"parking_lot",
"pollster",
"strafesnet_bsp_loader",
"strafesnet_common",
"strafesnet_deferred_loader",
"strafesnet_rbx_loader",
"strafesnet_texture_loader",
"wgpu",
"winit",
]
[[package]]
name = "strafesnet_bsp_loader"
version = "0.1.0"
source = "git+https://git.itzana.me/StrafesNET/bsp_loader?rev=671b86802179572af3385bbd90cbe3bb5b6401a2#671b86802179572af3385bbd90cbe3bb5b6401a2"
dependencies = [
"glam",
"strafesnet_common",
"vbsp",
"vmdl",
]
[[package]]
name = "strafesnet_common"
version = "0.1.0"
source = "git+https://git.itzana.me/StrafesNET/common?rev=093a54c527134ef7020a22a0f5778df8cba60228#093a54c527134ef7020a22a0f5778df8cba60228"
source = "git+https://git.itzana.me/StrafesNET/common?rev=fccb13bc6080ea6db94ef9175affd4aef1d9249d#fccb13bc6080ea6db94ef9175affd4aef1d9249d"
dependencies = [
"glam",
"id",
]
[[package]]
name = "strafesnet_deferred_loader"
version = "0.3.0"
source = "git+https://git.itzana.me/StrafesNET/deferred_loader?rev=c03cd0e905daf70b03b60b3e12509f96ee94a658#c03cd0e905daf70b03b60b3e12509f96ee94a658"
dependencies = [
"lazy-regex",
"strafesnet_common",
"vbsp",
]
[[package]]
name = "strafesnet_rbx_loader"
version = "0.2.0"
source = "git+https://git.itzana.me/StrafesNET/rbx_loader?rev=e0739fa792ad506e210f076b90697194005bb7de#e0739fa792ad506e210f076b90697194005bb7de"
version = "0.1.0"
source = "git+https://git.itzana.me/StrafesNET/rbx_loader?rev=05e609521a31d14ca2c9def7a778d792022571dc#05e609521a31d14ca2c9def7a778d792022571dc"
dependencies = [
"glam",
"lazy-regex",
@ -1693,6 +1543,15 @@ dependencies = [
"strafesnet_common",
]
[[package]]
name = "strafesnet_texture_loader"
version = "0.1.0"
source = "git+https://git.itzana.me/StrafesNET/texture_loader?rev=94e951ce06fb30873964ec29f30fcf9c8247a9a5#94e951ce06fb30873964ec29f30fcf9c8247a9a5"
dependencies = [
"lazy-regex",
"strafesnet_common",
]
[[package]]
name = "strict-num"
version = "0.1.1"
@ -1721,17 +1580,6 @@ dependencies = [
"unicode-ident",
]
[[package]]
name = "syn_util"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6754c4559b79657554e9d8a0d56e65e490c76d382b9c23108364ec4125dea23c"
dependencies = [
"proc-macro2",
"quote",
"syn 1.0.109",
]
[[package]]
name = "termcolor"
version = "1.4.1"
@ -1810,29 +1658,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
dependencies = [
"pin-project-lite",
"tracing-attributes",
"tracing-core",
]
[[package]]
name = "tracing-attributes"
version = "0.1.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.48",
]
[[package]]
name = "tracing-core"
version = "0.1.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
dependencies = [
"once_cell",
]
[[package]]
name = "ttf-parser"
@ -1864,61 +1697,12 @@ version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
[[package]]
name = "vbsp"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d9267540dab0c93bb5201c40ba3b2d027e2717bf355a8f9bf25377b06a5b32f6"
dependencies = [
"ahash",
"arrayvec",
"binrw",
"bitflags 2.4.2",
"bv",
"cgmath",
"itertools",
"lzma-rs",
"num_enum",
"static_assertions",
"thiserror",
"vbsp-derive",
"zip-lzma",
]
[[package]]
name = "vbsp-derive"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ade687fadf34b1b7502387fc9eb7b4032ddc9b93022d31356e9984c957abaad"
dependencies = [
"proc-macro2",
"quote",
"syn 1.0.109",
"syn_util",
]
[[package]]
name = "version_check"
version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
[[package]]
name = "vmdl"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "892922743c4c107372331efd8f67c57282590f8c18c26b4465c4b0e1e6678664"
dependencies = [
"arrayvec",
"bitflags 2.4.2",
"bytemuck",
"cgmath",
"itertools",
"static_assertions",
"thiserror",
"tracing",
]
[[package]]
name = "walkdir"
version = "2.4.0"
@ -2629,15 +2413,3 @@ dependencies = [
"quote",
"syn 2.0.48",
]
[[package]]
name = "zip-lzma"
version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b480cb31fccfb2786565c0e0712865fd6f1ea0ea850c50316f643c3948196e63"
dependencies = [
"byteorder 1.5.0",
"crc32fast",
"crossbeam-utils",
"lzma",
]

@ -1,6 +1,6 @@
[package]
name = "strafe-client"
version = "0.9.4"
version = "0.9.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
@ -13,10 +13,9 @@ glam = "0.25.0"
id = { git = "https://git.itzana.me/Quaternions/id", rev = "1f710976cc786c8853dab73d6e1cee53158deeb0" }
parking_lot = "0.12.1"
pollster = "0.3.0"
strafesnet_common = { git = "https://git.itzana.me/StrafesNET/common", rev = "093a54c527134ef7020a22a0f5778df8cba60228" }
strafesnet_bsp_loader = { git = "https://git.itzana.me/StrafesNET/bsp_loader", rev = "671b86802179572af3385bbd90cbe3bb5b6401a2" }
strafesnet_rbx_loader = { git = "https://git.itzana.me/StrafesNET/rbx_loader", rev = "e0739fa792ad506e210f076b90697194005bb7de" }
strafesnet_deferred_loader = { git = "https://git.itzana.me/StrafesNET/deferred_loader", rev = "c03cd0e905daf70b03b60b3e12509f96ee94a658", features = ["legacy"] }
strafesnet_rbx_loader = { git = "https://git.itzana.me/StrafesNET/rbx_loader", rev = "05e609521a31d14ca2c9def7a778d792022571dc" }
strafesnet_common = { git = "https://git.itzana.me/StrafesNET/common", rev = "fccb13bc6080ea6db94ef9175affd4aef1d9249d" }
strafesnet_texture_loader = { git = "https://git.itzana.me/StrafesNET/texture_loader", rev = "94e951ce06fb30873964ec29f30fcf9c8247a9a5", features = ["legacy"] }
wgpu = "0.19.0"
winit = "0.29.2"

@ -1,15 +0,0 @@
hard_tabs=true
imports_layout="HorizontalVertical"
match_arm_blocks=false
match_block_trailing_comma=true
newline_style="Unix"
#overflow_delimited_expr=true
reorder_impl_items=true
reorder_imports=false
group_imports="StdExternalCrate"
reorder_modules=false
space_after_colon=false
type_punctuation_density="Compressed"
use_field_init_shorthand=true
use_try_shorthand=true
#wrap_comments=true

@ -114,6 +114,6 @@ pub fn crawl_fev<F:Copy,E:Copy+DirectedEdge,V:Copy>(mut fev:FEV<F,E,V>,mesh:&imp
}
}
//TODO: fix all bugs
//println!("Too many iterations! Using default behaviour instead of crashing...");
println!("Too many iterations! Using default behaviour instead of crashing...");
CrawlResult::Miss(fev)
}

@ -1,111 +0,0 @@
use std::io::Read;
#[derive(Debug)]
pub enum ReadError{
Roblox(strafesnet_rbx_loader::ReadError),
Source(strafesnet_bsp_loader::ReadError),
Io(std::io::Error),
UnknownFileFormat,
}
impl std::fmt::Display for ReadError{
fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{
write!(f,"{self:?}")
}
}
impl std::error::Error for ReadError{}
pub enum DataStructure{
Roblox(strafesnet_rbx_loader::Dom),
Source(strafesnet_bsp_loader::Bsp)
}
pub fn read<R:Read>(input:R)->Result<DataStructure,ReadError>{
let mut buf=std::io::BufReader::new(input);
let peek=std::io::BufRead::fill_buf(&mut buf).map_err(ReadError::Io)?;
match &peek[0..4]{
b"<rob"=>Ok(DataStructure::Roblox(strafesnet_rbx_loader::read(buf).map_err(ReadError::Roblox)?)),
b"VBSP"=>Ok(DataStructure::Source(strafesnet_bsp_loader::read(buf).map_err(ReadError::Source)?)),
_=>Err(ReadError::UnknownFileFormat),
}
}
#[derive(Debug)]
pub enum LoadError{
ReadError(ReadError),
File(std::io::Error),
Io(std::io::Error),
}
impl std::fmt::Display for LoadError{
fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{
write!(f,"{self:?}")
}
}
impl std::error::Error for LoadError{}
pub fn load<P:AsRef<std::path::Path>>(path:P)->Result<strafesnet_common::map::CompleteMap,LoadError>{
//blocking because it's simpler...
let file=std::fs::File::open(path).map_err(LoadError::File)?;
match read(file).map_err(LoadError::ReadError)?{
DataStructure::Roblox(dom)=>{
let mut loader=strafesnet_deferred_loader::roblox_legacy();
let map_step1=strafesnet_rbx_loader::convert(
&dom,
|name|loader.acquire_render_config_id(name)
);
let (textures,render_configs)=loader.into_render_configs().map_err(LoadError::Io)?.consume();
let map=map_step1.add_render_configs_and_textures(
render_configs.into_iter(),
textures.into_iter().map(|(texture_id,texture)|
(texture_id,match texture{
strafesnet_deferred_loader::texture::Texture::ImageDDS(data)=>data,
})
)
);
Ok(map)
},
DataStructure::Source(bsp)=>{
let mut loader=strafesnet_deferred_loader::source_legacy();
let (texture_loader,mesh_loader)=loader.get_inner_mut();
let map_step1=strafesnet_bsp_loader::convert(
&bsp,
//acquire_render_config_id
|name|texture_loader.acquire_render_config_id(name),
//acquire_mesh_id
|name|mesh_loader.acquire_mesh_id(name),
);
let prop_meshes=mesh_loader.load_meshes(&bsp.as_ref());
let map_step2=map_step1.add_prop_meshes(
//the type conflagulator 9000
prop_meshes.into_iter().map(|(mesh_id,loader_model)|
(mesh_id,strafesnet_bsp_loader::data::ModelData{
mdl:strafesnet_bsp_loader::data::MdlData::new(loader_model.mdl.get()),
vtx:strafesnet_bsp_loader::data::VtxData::new(loader_model.vtx.get()),
vvd:strafesnet_bsp_loader::data::VvdData::new(loader_model.vvd.get()),
})
),
|name|texture_loader.acquire_render_config_id(name),
);
let (textures,render_configs)=loader.into_render_configs().map_err(LoadError::Io)?.consume();
let map=map_step2.add_render_configs_and_textures(
render_configs.into_iter(),
textures.into_iter().map(|(texture_id,texture)|
(texture_id,match texture{
strafesnet_deferred_loader::texture::Texture::ImageDDS(data)=>data,
})
),
);
Ok(map)
},
}
}

@ -147,11 +147,10 @@ impl GraphicsState{
pub fn load_user_settings(&mut self,user_settings:&crate::settings::UserSettings){
self.camera.fov=user_settings.calculate_fov(1.0,&self.camera.screen_size).as_vec2();
}
pub fn generate_models(&mut self,device:&wgpu::Device,queue:&wgpu::Queue,map:&map::CompleteMap){
pub fn generate_models(&mut self,device:&wgpu::Device,queue:&wgpu::Queue,map:&map::CompleteMap,textures:strafesnet_texture_loader::texture_loader::Textures){
//generate texture view per texture
let texture_views:HashMap<strafesnet_common::model::TextureId,wgpu::TextureView>=map.textures.iter().enumerate().filter_map(|(texture_id,texture_data)|{
let texture_id=model::TextureId::new(texture_id as u32);
let image=ddsfile::Dds::read(std::io::Cursor::new(texture_data)).ok()?;
let texture_views:Vec<wgpu::TextureView>=textures.into_iter().map(|(texture_id,texture_data)|{
let image=ddsfile::Dds::read(std::io::Cursor::new(texture_data)).unwrap();
let (mut width,mut height)=(image.get_width(),image.get_height());
@ -163,10 +162,7 @@ impl GraphicsState{
height=height/4*4;
wgpu::TextureFormat::Bc7RgbaUnormSrgb
},
other=>{
println!("unsupported texture format{:?}",other);
return None;
},
other=>panic!("unsupported format{:?}",other),
};
let size=wgpu::Extent3d{
@ -196,11 +192,11 @@ impl GraphicsState{
wgpu::util::TextureDataOrder::LayerMajor,
&image.data,
);
Some((texture_id,texture.create_view(&wgpu::TextureViewDescriptor{
texture.create_view(&wgpu::TextureViewDescriptor{
label:Some(format!("Texture{} View",texture_id.get()).as_str()),
dimension:Some(wgpu::TextureViewDimension::D2),
..wgpu::TextureViewDescriptor::default()
})))
})
}).collect();
let num_textures=texture_views.len();
@ -492,9 +488,10 @@ impl GraphicsState{
usage:wgpu::BufferUsages::UNIFORM|wgpu::BufferUsages::COPY_DST,
});
let render_config=&map.render_configs[model.render_config.get() as usize];
let texture_view=render_config.texture.and_then(|texture_id|
texture_views.get(&texture_id)
).unwrap_or(&self.temp_squid_texture_view);
let texture_view=match render_config.texture{
Some(texture_id)=>&texture_views[texture_id.get() as usize],
None=>&self.temp_squid_texture_view,
};
let bind_group=device.create_bind_group(&wgpu::BindGroupDescriptor{
layout:&self.bind_group_layouts.model,
entries:&[

@ -4,7 +4,7 @@ pub enum Instruction{
Render(crate::physics::PhysicsOutputState,integer::Time,glam::IVec2),
//UpdateModel(crate::graphics::GraphicsModelUpdate),
Resize(winit::dpi::PhysicalSize<u32>,crate::settings::UserSettings),
GenerateModels(strafesnet_common::map::CompleteMap),
GenerateModels(strafesnet_common::map::CompleteMap,strafesnet_texture_loader::texture_loader::Textures),
ClearModels,
}
@ -27,8 +27,8 @@ pub fn new<'a>(
let mut resize=None;
crate::compat_worker::INWorker::new(move |ins:Instruction|{
match ins{
Instruction::GenerateModels(map)=>{
graphics.generate_models(&device,&queue,&map);
Instruction::GenerateModels(map,textures)=>{
graphics.generate_models(&device,&queue,&map,textures);
},
Instruction::ClearModels=>{
graphics.clear();

@ -11,8 +11,6 @@ mod model_graphics;
mod physics_worker;
mod graphics_worker;
mod file;
fn main(){
setup::setup_and_start(format!("Strafe Client v{}",env!("CARGO_PKG_VERSION")));
}

@ -280,24 +280,9 @@ impl EdgePool{
(&mut unsafe{self.edge_guys.get_unchecked_mut(edge_id.get() as usize)}.1,edge_id)
}
}
#[derive(Debug)]
pub enum PhysicsMeshError{
ZeroVertices,
}
impl std::fmt::Display for PhysicsMeshError{
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f,"{self:?}")
}
}
impl std::error::Error for PhysicsMeshError{}
impl TryFrom<&model::Mesh> for PhysicsMesh{
type Error=PhysicsMeshError;
fn try_from(mesh:&model::Mesh)->Result<Self,PhysicsMeshError>{
if mesh.unique_pos.len()==0{
return Err(PhysicsMeshError::ZeroVertices);
}
impl From<&model::Mesh> for PhysicsMesh{
fn from(mesh:&model::Mesh)->Self{
assert!(mesh.unique_pos.len()!=0,"Mesh cannot have 0 vertices");
let verts=mesh.unique_pos.iter().copied().map(Vert).collect();
//TODO: fix submeshes
//flat map mesh.physics_groups[$1].groups.polys()[$2] as face_id
@ -399,14 +384,14 @@ impl TryFrom<&model::Mesh> for PhysicsMesh{
).collect(),
}
}).collect();
Ok(Self{
Self{
data:PhysicsMeshData{
faces,
verts,
},
complete_mesh:mesh_topologies.pop().unwrap(),
submeshes:mesh_topologies,
})
}
}
}

@ -176,8 +176,8 @@ impl PhysicsModels{
&model.transform
)
}
fn model(&self,model_id:PhysicsModelId)->Option<&PhysicsModel>{
self.models.get(&model_id)
fn model(&self,model_id:PhysicsModelId)->&PhysicsModel{
&self.models[&model_id]
}
fn attr(&self,model_id:PhysicsModelId)->&PhysicsCollisionAttributes{
&self.attributes[&self.models[&model_id].attr_id]
@ -1012,18 +1012,10 @@ impl PhysicsContext{
mesh_id
}else{
match map.meshes.get(model.mesh.get() as usize).and_then(|mesh|{
match PhysicsMesh::try_from(mesh){
Ok(physics_mesh)=>{
let mesh_id=PhysicsMeshId::new(used_meshes.len() as u32);
used_meshes.push(physics_mesh);
physics_mesh_id_from_model_mesh_id.insert(model.mesh,mesh_id);
Some(mesh_id)
},
Err(e)=>{
println!("Failed to build PhysicsMesh: {e}");
None
}
}
let mesh_id=PhysicsMeshId::new(used_meshes.len() as u32);
used_meshes.push(PhysicsMesh::from(mesh));
physics_mesh_id_from_model_mesh_id.insert(model.mesh,mesh_id);
Some(mesh_id)
}){
Some(mesh_id)=>mesh_id,
None=>return None,
@ -1198,7 +1190,7 @@ fn teleport(body:&mut Body,touching:&mut TouchingState,models:&PhysicsModels,sty
MoveState::Air
}
fn teleport_to_spawn(body:&mut Body,touching:&mut TouchingState,style:&StyleModifiers,hitbox_mesh:&HitboxMesh,mode:&gameplay_modes::Mode,models:&PhysicsModels,stage_id:gameplay_modes::StageId)->Option<MoveState>{
let model=models.model(mode.get_spawn_model_id(stage_id)?.into()).unwrap();
let model=models.model(mode.get_spawn_model_id(stage_id)?.into());
let point=model.transform.vertex.transform_point3(Planar64Vec3::Y)+Planar64Vec3::Y*(style.hitbox.halfsize.y()+Planar64::ONE/16);
Some(teleport(body,touching,models,style,hitbox_mesh,point))
}
@ -1254,8 +1246,8 @@ fn run_teleport_behaviour(wormhole:&Option<gameplay_attributes::Wormhole>,models
}
match wormhole{
&Some(gameplay_attributes::Wormhole{destination_model})=>{
let origin_model=models.model(convex_mesh_id.model_id).unwrap();
let destination_model=models.model(destination_model.into()).unwrap();
let origin_model=models.model(convex_mesh_id.model_id);
let destination_model=models.model(destination_model.into());
//ignore the transform for now
Some(teleport(body,touching,models,style,hitbox_mesh,body.position-origin_model.transform.vertex.translation+destination_model.transform.vertex.translation))
}
@ -1323,9 +1315,7 @@ fn run_teleport_behaviour(wormhole:&Option<gameplay_attributes::Wormhole>,models
//check ground
state.touching.insert(c);
//I love making functions with 10 arguments to dodge the borrow checker
if let Some(mode)=data.modes.get_mode(state.mode_state.get_mode_id()){
run_teleport_behaviour(&general.wormhole,&data.models,mode,&state.style,&data.hitbox_mesh,&mut state.mode_state,&mut state.touching,&mut state.body,convex_mesh_id);
}
run_teleport_behaviour(&general.wormhole,&data.models,&data.modes.get_mode(state.mode_state.get_mode_id()).unwrap(),&state.style,&data.hitbox_mesh,&mut state.mode_state,&mut state.touching,&mut state.body,convex_mesh_id);
//flatten v
state.touching.constrain_velocity(&data.models,&data.hitbox_mesh,&mut v);
match &general.booster{
@ -1369,9 +1359,7 @@ fn run_teleport_behaviour(wormhole:&Option<gameplay_attributes::Wormhole>,models
(PhysicsCollisionAttributes::Intersect{intersecting: _,general},Collision::Intersect(intersect))=>{
//I think that setting the velocity to 0 was preventing surface contacts from entering an infinite loop
state.touching.insert(c);
if let Some(mode)=data.modes.get_mode(state.mode_state.get_mode_id()){
run_teleport_behaviour(&general.wormhole,&data.models,mode,&state.style,&data.hitbox_mesh,&mut state.mode_state,&mut state.touching,&mut state.body,convex_mesh_id);
}
run_teleport_behaviour(&general.wormhole,&data.models,&data.modes.get_mode(state.mode_state.get_mode_id()).unwrap(),&state.style,&data.hitbox_mesh,&mut state.mode_state,&mut state.touching,&mut state.body,convex_mesh_id);
},
_=>panic!("invalid pair"),
}
@ -1461,7 +1449,7 @@ fn run_teleport_behaviour(wormhole:&Option<gameplay_attributes::Wormhole>,models
state.mode_state.set_stage_id(gameplay_modes::StageId::FIRST);
let spawn_point=data.modes.get_mode(state.mode_state.get_mode_id()).and_then(|mode|
//TODO: spawn at the bottom of the start zone plus the hitbox size
data.models.model(mode.get_start().into()).map(|model|model.transform.vertex.translation)
Some(data.models.model(mode.get_start().into()).transform.vertex.translation)
).unwrap_or(Planar64Vec3::ZERO);
set_position(&mut state.body,&mut state.touching,spawn_point);
set_velocity(&mut state.body,&state.touching,&data.models,&data.hitbox_mesh,Planar64Vec3::ZERO);

@ -18,7 +18,7 @@ pub enum Instruction{
Input(InputInstruction),
Render,
Resize(winit::dpi::PhysicalSize<u32>,crate::settings::UserSettings),
GenerateModels(strafesnet_common::map::CompleteMap),
GenerateModels(strafesnet_common::map::CompleteMap,strafesnet_texture_loader::texture_loader::Textures),
ClearModels,
//Graphics(crate::graphics_worker::Instruction),
}
@ -63,7 +63,7 @@ pub enum Instruction{
&InputInstruction::Zoom(s)=>Some(PhysicsInputInstruction::SetZoom(s)),
InputInstruction::Reset=>Some(PhysicsInputInstruction::Reset),
},
Instruction::GenerateModels(_)=>Some(PhysicsInputInstruction::Idle),
Instruction::GenerateModels(_,_)=>Some(PhysicsInputInstruction::Idle),
Instruction::ClearModels=>Some(PhysicsInputInstruction::Idle),
Instruction::Resize(_,_)=>Some(PhysicsInputInstruction::Idle),
Instruction::Render=>Some(PhysicsInputInstruction::Idle),
@ -118,10 +118,10 @@ pub enum Instruction{
Instruction::Resize(size,user_settings)=>{
graphics_worker.send(crate::graphics_worker::Instruction::Resize(size,user_settings)).unwrap();
},
Instruction::GenerateModels(map)=>{
Instruction::GenerateModels(map,textures)=>{
physics.generate_models(&map);
physics.spawn();
graphics_worker.send(crate::graphics_worker::Instruction::GenerateModels(map)).unwrap();
graphics_worker.send(crate::graphics_worker::Instruction::GenerateModels(map,textures)).unwrap();
},
Instruction::ClearModels=>{
physics.state.clear();

@ -1,6 +1,7 @@
use crate::physics_worker::InputInstruction;
use strafesnet_common::integer;
use strafesnet_common::instruction::TimedInstruction;
use strafesnet_texture_loader::texture_loader::TextureLoaderTrait;
pub enum WindowInstruction{
Resize(winit::dpi::PhysicalSize<u32>),
@ -27,12 +28,39 @@ impl WindowContext<'_>{
fn window_event(&mut self,time:integer::Time,event: winit::event::WindowEvent) {
match event {
winit::event::WindowEvent::DroppedFile(path)=>{
match crate::file::load(path.as_path()){
Ok(map)=>{
self.physics_thread.send(TimedInstruction{time,instruction:crate::physics_worker::Instruction::ClearModels}).unwrap();
self.physics_thread.send(TimedInstruction{time,instruction:crate::physics_worker::Instruction::GenerateModels(map)}).unwrap();
},
Err(e)=>println!("Failed to load map: {e}"),
let path=path.as_path();
//blocking because it's simpler...
if let Ok(file)=std::fs::File::open(path){
// match strafesnet_snf::read_snf(std::io::BufReader::new(file)){
// Ok(strafesnet_snf::SNF::Map(streamable_map))=>{
// if let Ok(indexed_model_instances)=streamable_map.load_all(){
// self.physics_thread.send(TimedInstruction{time,instruction:crate::physics_worker::Instruction::ClearModels}).unwrap();
// self.physics_thread.send(TimedInstruction{time,instruction:crate::physics_worker::Instruction::GenerateModels(indexed_model_instances)}).unwrap();
// }
// },
// Ok(strafesnet_snf::SNF::Bot(streamable_map))=>println!("File type not yet supported"),
// Ok(strafesnet_snf::SNF::Demo(streamable_map))=>println!("File type not yet supported"),
// Err(e)=>println!("Error reading file: {e:?}"),
// }
let mut texture_loader=strafesnet_texture_loader::legacy();
match (strafesnet_rbx_loader::read(file,|name|{
match texture_loader.acquire_id(name){
Ok(texture_id)=>Some(texture_id),
Err(e)=>{
println!("there was error: {e}");
None
},
}
}),texture_loader.load()){
(Ok(map),Ok(textures))=>{
self.physics_thread.send(TimedInstruction{time,instruction:crate::physics_worker::Instruction::ClearModels}).unwrap();
self.physics_thread.send(TimedInstruction{time,instruction:crate::physics_worker::Instruction::GenerateModels(map,textures)}).unwrap();
},
(Err(e),_)=>println!("Error reading file: {e:?}"),
(_,Err(e))=>println!("Error loading textures: {e:?}"),
}
}else{
println!("Failed to open file {path:?}");
}
},
winit::event::WindowEvent::Focused(_state)=>{