mirror of
https://codeberg.org/icewind/vbsp-to-gltf.git
synced 2026-06-03 10:14:08 +02:00
readme/clippy
This commit is contained in:
parent
04e6b909a3
commit
3811389fdf
8 changed files with 28 additions and 11 deletions
|
|
@ -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
17
README.md
Normal 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.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
`koth_bagel` as vieweed with the [PlayCanvas model viewer](https://playcanvas.com/viewer).
|
||||||
BIN
readme/bagel.png
Normal file
BIN
readme/bagel.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 MiB |
|
|
@ -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]);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -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");
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue