add option to disable texture loading

This commit is contained in:
Robin Appelman 2023-12-26 15:37:10 +01:00
commit 8fb1ccb9b1
4 changed files with 81 additions and 54 deletions

62
Cargo.lock generated
View file

@ -61,7 +61,7 @@ dependencies = [
"getrandom", "getrandom",
"once_cell", "once_cell",
"version_check", "version_check",
"zerocopy 0.7.31", "zerocopy 0.7.32",
] ]
[[package]] [[package]]
@ -341,7 +341,7 @@ checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.41", "syn 2.0.42",
] ]
[[package]] [[package]]
@ -472,7 +472,7 @@ dependencies = [
"heck", "heck",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.41", "syn 2.0.42",
] ]
[[package]] [[package]]
@ -768,7 +768,7 @@ checksum = "f95e2801cd355d4a1a3e3953ce6ee5ae9603a5c833455343a8bfe3f44d418246"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.41", "syn 2.0.42",
] ]
[[package]] [[package]]
@ -1264,7 +1264,7 @@ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"regex-syntax 0.6.29", "regex-syntax 0.6.29",
"syn 2.0.41", "syn 2.0.42",
] ]
[[package]] [[package]]
@ -1394,7 +1394,7 @@ checksum = "49e7bc1560b95a3c4a25d03de42fe76ca718ab92d1a22a55b9b4cf67b3ae635c"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.41", "syn 2.0.42",
] ]
[[package]] [[package]]
@ -1642,7 +1642,7 @@ dependencies = [
"proc-macro-crate 1.3.1", "proc-macro-crate 1.3.1",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.41", "syn 2.0.42",
] ]
[[package]] [[package]]
@ -1654,7 +1654,7 @@ dependencies = [
"proc-macro-crate 2.0.1", "proc-macro-crate 2.0.1",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.41", "syn 2.0.42",
] ]
[[package]] [[package]]
@ -1780,7 +1780,7 @@ dependencies = [
"regex", "regex",
"regex-syntax 0.7.5", "regex-syntax 0.7.5",
"structmeta", "structmeta",
"syn 2.0.41", "syn 2.0.42",
] ]
[[package]] [[package]]
@ -1849,7 +1849,7 @@ dependencies = [
"pest_meta", "pest_meta",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.41", "syn 2.0.42",
] ]
[[package]] [[package]]
@ -2169,7 +2169,7 @@ checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.41", "syn 2.0.42",
] ]
[[package]] [[package]]
@ -2191,7 +2191,7 @@ checksum = "3081f5ffbb02284dda55132aa26daecedd7372a42417bbbab6f14ab7d6bb9145"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.41", "syn 2.0.42",
] ]
[[package]] [[package]]
@ -2341,7 +2341,7 @@ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"structmeta-derive", "structmeta-derive",
"syn 2.0.41", "syn 2.0.42",
] ]
[[package]] [[package]]
@ -2352,7 +2352,7 @@ checksum = "a60bcaff7397072dca0017d1db428e30d5002e00b6847703e2e42005c95fbe00"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.41", "syn 2.0.42",
] ]
[[package]] [[package]]
@ -2402,9 +2402,9 @@ dependencies = [
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.41" version = "2.0.42"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "44c8b28c477cc3bf0e7966561e3460130e1255f7a1cf71931075f1c5e7a7e269" checksum = "5b7d0a2c048d661a1a59fcd7355baa232f7ed34e0ee4df2eef3c1c1c0d3852d8"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -2516,7 +2516,7 @@ checksum = "01742297787513b79cf8e29d1056ede1313e2420b7b3b15d0a768b4921f549df"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.41", "syn 2.0.42",
] ]
[[package]] [[package]]
@ -2676,7 +2676,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.41", "syn 2.0.42",
] ]
[[package]] [[package]]
@ -2798,7 +2798,7 @@ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
[[package]] [[package]]
name = "vbsp" name = "vbsp"
version = "0.4.0" version = "0.4.0"
source = "git+https://github.com/icewind1991/vbsp#dde4ec2a83ef0acdbcf4c3003573701c3d9ecf64" source = "git+https://github.com/icewind1991/vbsp#cdf52722f8201a5e01a0cf60f89f894fea2cb677"
dependencies = [ dependencies = [
"ahash", "ahash",
"arrayvec", "arrayvec",
@ -2818,13 +2818,13 @@ dependencies = [
[[package]] [[package]]
name = "vbsp-derive" name = "vbsp-derive"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/icewind1991/vbsp#dde4ec2a83ef0acdbcf4c3003573701c3d9ecf64" source = "git+https://github.com/icewind1991/vbsp#cdf52722f8201a5e01a0cf60f89f894fea2cb677"
dependencies = [ dependencies = [
"merge", "merge",
"proc-macro2", "proc-macro2",
"quote", "quote",
"structmeta", "structmeta",
"syn 2.0.41", "syn 2.0.42",
] ]
[[package]] [[package]]
@ -2879,7 +2879,7 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
[[package]] [[package]]
name = "vmdl" name = "vmdl"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/icewind1991/vmdl#585a4850319e67555c10f9fad8f158e9e3d18c15" source = "git+https://github.com/icewind1991/vmdl#03772239553551fac795c0f08525cbd39936de52"
dependencies = [ dependencies = [
"arrayvec", "arrayvec",
"bitflags 1.3.2", "bitflags 1.3.2",
@ -2955,7 +2955,7 @@ dependencies = [
"once_cell", "once_cell",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.41", "syn 2.0.42",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
@ -2977,7 +2977,7 @@ checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.41", "syn 2.0.42",
"wasm-bindgen-backend", "wasm-bindgen-backend",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
@ -3397,11 +3397,11 @@ dependencies = [
[[package]] [[package]]
name = "zerocopy" name = "zerocopy"
version = "0.7.31" version = "0.7.32"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1c4061bedbb353041c12f413700357bec76df2c7e2ca8e4df8bac24c6bf68e3d" checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be"
dependencies = [ dependencies = [
"zerocopy-derive 0.7.31", "zerocopy-derive 0.7.32",
] ]
[[package]] [[package]]
@ -3412,18 +3412,18 @@ checksum = "125139de3f6b9d625c39e2efdd73d41bdac468ccd556556440e322be0e1bbd91"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.41", "syn 2.0.42",
] ]
[[package]] [[package]]
name = "zerocopy-derive" name = "zerocopy-derive"
version = "0.7.31" version = "0.7.32"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b3c129550b3e6de3fd0ba67ba5c81818f9805e58b8d7fee80a3a59d2c9fc601a" checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.41", "syn 2.0.42",
] ]
[[package]] [[package]]

View file

@ -9,12 +9,17 @@ use three_d::{CpuModel, Positions, Vec3};
use three_d_asset::{Geometry, Primitive, TriMesh}; use three_d_asset::{Geometry, Primitive, TriMesh};
use vbsp::{Bsp, Entity, Handle, Vector}; use vbsp::{Bsp, Entity, Handle, Vector};
pub fn load_map(data: &[u8], loader: &mut Loader, props: bool) -> Result<Vec<CpuModel>, Error> { pub fn load_map(
let (world, bsp) = load_world(data, loader)?; data: &[u8],
loader: &mut Loader,
props: bool,
textures: bool,
) -> Result<Vec<CpuModel>, Error> {
let (world, bsp) = load_world(data, loader, textures)?;
let mut models = Vec::with_capacity(bsp.static_props().count() + 1); let mut models = Vec::with_capacity(bsp.static_props().count() + 1);
models.push(world); models.push(world);
if props { if props {
let props = load_props(loader, bsp.static_props())?; let props = load_props(loader, bsp.static_props(), textures)?;
models.extend(props); models.extend(props);
} }
Ok(models) Ok(models)
@ -32,13 +37,21 @@ pub fn map_coords<C: Into<Vec3>>(vec: C) -> Vec3 {
// 1 hammer unit is ~1.905cm // 1 hammer unit is ~1.905cm
pub const UNIT_SCALE: f32 = 1.0 / (1.905 * 100.0); pub const UNIT_SCALE: f32 = 1.0 / (1.905 * 100.0);
fn model_to_model(models: &[(Handle<vbsp::data::Model>, Vector)], loader: &Loader) -> CpuModel { fn model_to_model(
models: &[(Handle<vbsp::data::Model>, Vector)],
loader: &Loader,
textures: bool,
) -> CpuModel {
let textures: Vec<&str> = if textures {
let textures: HashSet<&str> = models let textures: HashSet<&str> = models
.iter() .iter()
.flat_map(|(model, _)| model.textures()) .flat_map(|(model, _)| model.textures())
.map(|texture| texture.name()) .map(|texture| texture.name())
.collect(); .collect();
let textures: Vec<&str> = textures.into_iter().collect(); textures.into_iter().collect()
} else {
Vec::new()
};
let faces_by_texture: HashMap<&str, _> = models let faces_by_texture: HashMap<&str, _> = models
.iter() .iter()
@ -103,7 +116,7 @@ fn model_to_model(models: &[(Handle<vbsp::data::Model>, Vector)], loader: &Loade
} }
} }
fn load_world(data: &[u8], loader: &mut Loader) -> Result<(CpuModel, Bsp), Error> { fn load_world(data: &[u8], loader: &mut Loader, textures: bool) -> Result<(CpuModel, Bsp), Error> {
let bsp = Bsp::read(data)?; let bsp = Bsp::read(data)?;
loader.add_source(bsp.pack.clone()); loader.add_source(bsp.pack.clone());
@ -136,6 +149,6 @@ fn load_world(data: &[u8], loader: &mut Loader) -> Result<(CpuModel, Bsp), Error
}, },
)); ));
let world_model = model_to_model(&models, loader); let world_model = model_to_model(&models, loader, textures);
Ok((world_model, bsp)) Ok((world_model, bsp))
} }

View file

@ -35,6 +35,9 @@ struct Args {
/// Disable loading and showing props in the map /// Disable loading and showing props in the map
#[arg(long)] #[arg(long)]
no_props: bool, no_props: bool,
/// Disable loading of textures
#[arg(long)]
no_textures: bool,
} }
#[derive(Debug, Error)] #[derive(Debug, Error)]
@ -104,13 +107,13 @@ fn main() -> Result<(), Error> {
.load(&format!("maps/{}.bsp", demo.map))? .load(&format!("maps/{}.bsp", demo.map))?
.ok_or(Error::ResourceNotFound(demo.map.clone()))?; .ok_or(Error::ResourceNotFound(demo.map.clone()))?;
let models = load_map(&map, &mut loader, !args.no_props)?; let models = load_map(&map, &mut loader, !args.no_props, !args.no_textures)?;
play(window, DemoCamera::new(demo), models) play(window, DemoCamera::new(demo), models)
} else { } else {
let mut loader = Loader::new()?; let mut loader = Loader::new()?;
let map = fs::read(args.path)?; let map = fs::read(args.path)?;
let models = load_map(&map, &mut loader, !args.no_props)?; let models = load_map(&map, &mut loader, !args.no_props, !args.no_textures)?;
play(window, FirstPerson::new(0.1), models) play(window, FirstPerson::new(0.1), models)
} }
} }

View file

@ -26,6 +26,7 @@ pub fn load_prop(loader: &Loader, name: &str) -> Result<vmdl::Model, Error> {
pub fn load_props<'a, I: Iterator<Item = Handle<'a, StaticPropLump>>>( pub fn load_props<'a, I: Iterator<Item = Handle<'a, StaticPropLump>>>(
loader: &Loader, loader: &Loader,
props: I, props: I,
show_textures: bool,
) -> Result<Vec<CpuModel>, Error> { ) -> Result<Vec<CpuModel>, Error> {
let props = props let props = props
.filter_map(|prop| match load_prop(loader, prop.model()) { .filter_map(|prop| match load_prop(loader, prop.model()) {
@ -48,13 +49,16 @@ pub fn load_props<'a, I: Iterator<Item = Handle<'a, StaticPropLump>>>(
props props
.map(|prop| { .map(|prop| {
let geometries: Vec<_> = prop_to_meshes(&prop).collect(); let geometries: Vec<_> = prop_to_meshes(&prop, show_textures).collect();
let materials: Vec<_> = prop let materials: Vec<_> = if show_textures {
.model prop.model
.textures() .textures()
.iter() .iter()
.map(|tex| prop_texture_to_material(tex, loader)) .map(|tex| prop_texture_to_material(tex, loader))
.collect(); .collect()
} else {
Vec::new()
};
Ok(CpuModel { Ok(CpuModel {
name: prop.name.into(), name: prop.name.into(),
@ -72,7 +76,10 @@ struct PropData<'a> {
skin: i32, skin: i32,
} }
fn prop_to_meshes<'a>(prop: &'a PropData) -> impl Iterator<Item = Primitive> + 'a { fn prop_to_meshes<'a>(
prop: &'a PropData,
show_textures: bool,
) -> impl Iterator<Item = Primitive> + 'a {
let transform = prop.transform; let transform = prop.transform;
let model = &prop.model; let model = &prop.model;
@ -85,7 +92,11 @@ fn prop_to_meshes<'a>(prop: &'a PropData) -> impl Iterator<Item = Primitive> + '
}; };
model.meshes().map(move |mesh| { model.meshes().map(move |mesh| {
let material_index = skin.texture_index(mesh.material_index()); let material_index = if show_textures {
skin.texture_index(mesh.material_index())
} else {
None
};
let positions: Vec<Vec3> = mesh let positions: Vec<Vec3> = mesh
.vertices() .vertices()