mirror of
https://codeberg.org/icewind/vbspview.git
synced 2026-06-03 10:14:10 +02:00
add option to disable texture loading
This commit is contained in:
parent
cc35ed52e3
commit
8fb1ccb9b1
4 changed files with 81 additions and 54 deletions
62
Cargo.lock
generated
62
Cargo.lock
generated
|
|
@ -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]]
|
||||||
|
|
|
||||||
37
src/bsp.rs
37
src/bsp.rs
|
|
@ -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(
|
||||||
let textures: HashSet<&str> = models
|
models: &[(Handle<vbsp::data::Model>, Vector)],
|
||||||
.iter()
|
loader: &Loader,
|
||||||
.flat_map(|(model, _)| model.textures())
|
textures: bool,
|
||||||
.map(|texture| texture.name())
|
) -> CpuModel {
|
||||||
.collect();
|
let textures: Vec<&str> = if textures {
|
||||||
let textures: Vec<&str> = textures.into_iter().collect();
|
let textures: HashSet<&str> = models
|
||||||
|
.iter()
|
||||||
|
.flat_map(|(model, _)| model.textures())
|
||||||
|
.map(|texture| texture.name())
|
||||||
|
.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))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
29
src/prop.rs
29
src/prop.rs
|
|
@ -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()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue