readme/clippy

This commit is contained in:
Robin Appelman 2023-12-21 00:25:17 +01:00
commit 3811389fdf
8 changed files with 28 additions and 11 deletions

View file

@ -2,7 +2,7 @@
name = "vbsp-to-gltf" name = "vbsp-to-gltf"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2021"
rust-version = "1.70.0"
[dependencies] [dependencies]
miette = { version = "5.5.0", features = ["fancy"] } miette = { version = "5.5.0", features = ["fancy"] }

17
README.md Normal file
View file

@ -0,0 +1,17 @@
# vbsp-to-gtlf
Convert Valve BSP files to GLTF files
## Usage
```bash
vbsp-to-gltf input.bsp output.glb
```
## Model optimization
The output for the converter isn't particularly optimized, it's strongly recommended to run the output through [gltfpack](https://github.com/zeux/meshoptimizer) before usage.
![screenshot of koth_bagel model](readme/bagel.png)
`koth_bagel` as vieweed with the [PlayCanvas model viewer](https://playcanvas.com/viewer).

BIN
readme/bagel.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

View file

@ -42,7 +42,7 @@ pub fn bsp_models(bsp: &Bsp) -> Result<Vec<(Handle<Model>, Vector)>, Error> {
Ok(models) Ok(models)
} }
fn bounding_box<'a>(vertices: impl IntoIterator<Item = Vector>) -> ([f32; 3], [f32; 3]) { fn bounding_box(vertices: impl IntoIterator<Item = Vector>) -> ([f32; 3], [f32; 3]) {
let mut min = Vector::from([f32::MAX, f32::MAX, f32::MAX]); let mut min = Vector::from([f32::MAX, f32::MAX, f32::MAX]);
let mut max = Vector::from([f32::MIN, f32::MIN, f32::MIN]); let mut max = Vector::from([f32::MIN, f32::MIN, f32::MIN]);

View file

@ -23,7 +23,7 @@ impl From<&vmdl::vvd::Vertex> for Vertex {
fn from(vertex: &vmdl::vvd::Vertex) -> Self { fn from(vertex: &vmdl::vvd::Vertex) -> Self {
Vertex { Vertex {
position: vertex.position.into(), position: vertex.position.into(),
uv: vertex.texture_coordinates.into(), uv: vertex.texture_coordinates,
normal: vertex.normal.into(), normal: vertex.normal.into(),
} }
} }
@ -36,7 +36,7 @@ pub fn push_or_get_material(
material: &str, material: &str,
) -> Index<Material> { ) -> Index<Material> {
let material = material.to_ascii_lowercase(); let material = material.to_ascii_lowercase();
match get_material_index(&mut gltf.materials, &material) { match get_material_index(&gltf.materials, &material) {
Some(index) => index, Some(index) => index,
None => { None => {
let material = load_material_fallback(&material, &[String::new()], loader); let material = load_material_fallback(&material, &[String::new()], loader);
@ -96,7 +96,7 @@ fn push_or_get_texture(
gltf: &mut Root, gltf: &mut Root,
texture: TextureData, texture: TextureData,
) -> Index<Texture> { ) -> Index<Texture> {
match get_texture_index(&mut gltf.textures, &texture.name) { match get_texture_index(&gltf.textures, &texture.name) {
Some(index) => index, Some(index) => index,
None => { None => {
let index = gltf.textures.len() as u32; let index = gltf.textures.len() as u32;

View file

@ -56,7 +56,7 @@ fn main() -> miette::Result<()> {
let map = Bsp::read(&data).map_err(Error::from)?; let map = Bsp::read(&data).map_err(Error::from)?;
loader.add_source(map.pack.clone()); loader.add_source(map.pack.clone());
let glb = export(map, &mut loader)?; let glb = export(map, &loader)?;
let writer = File::create(&args.target) let writer = File::create(&args.target)
.map_err(Error::from) .map_err(Error::from)
@ -80,7 +80,7 @@ fn export(bsp: Bsp, loader: &Loader) -> Result<Glb<'static>, Error> {
} }
for prop in bsp.static_props() { for prop in bsp.static_props() {
let mesh = push_or_get_model(&mut buffer, &mut root, loader, &prop.model(), prop.skin); let mesh = push_or_get_model(&mut buffer, &mut root, loader, prop.model(), prop.skin);
let rotation = prop.rotation(); let rotation = prop.rotation();
let node = Node { let node = Node {

View file

@ -48,7 +48,7 @@ pub fn load_material(
.map(|dir| { .map(|dir| {
format!( format!(
"materials/{}", "materials/{}",
dir.to_ascii_lowercase().trim_start_matches("/") dir.to_ascii_lowercase().trim_start_matches('/')
) )
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();
@ -96,7 +96,7 @@ pub fn load_material(
let bump_map = material.bump_map().and_then(|path| { let bump_map = material.bump_map().and_then(|path| {
Some(TextureData { Some(TextureData {
image: load_texture(&path, loader).ok()?, image: load_texture(path, loader).ok()?,
name: path.into(), name: path.into(),
}) })
}); });

View file

@ -22,7 +22,7 @@ impl From<&vmdl::vvd::Vertex> for ModelVertex {
fn from(vertex: &vmdl::vvd::Vertex) -> Self { fn from(vertex: &vmdl::vvd::Vertex) -> Self {
ModelVertex { ModelVertex {
position: map_coords(vertex.position), position: map_coords(vertex.position),
uv: vertex.texture_coordinates.into(), uv: vertex.texture_coordinates,
normal: vertex.normal.into(), normal: vertex.normal.into(),
} }
} }
@ -125,7 +125,7 @@ pub fn push_or_get_model(
skin: i32, skin: i32,
) -> Index<Mesh> { ) -> Index<Mesh> {
let skinned_name = format!("{model}_{skin}"); let skinned_name = format!("{model}_{skin}");
match get_mesh_index(&mut gltf.meshes, &skinned_name) { match get_mesh_index(&gltf.meshes, &skinned_name) {
Some(index) => index, Some(index) => index,
None => { None => {
let prop = load_prop(loader, model).expect("failed to load prop"); let prop = load_prop(loader, model).expect("failed to load prop");