mirror of
https://codeberg.org/icewind/vbsp-to-gltf.git
synced 2026-06-03 18:24:07 +02:00
texture transforms
This commit is contained in:
parent
f2f0acf543
commit
3b9f0b7458
4 changed files with 27 additions and 6 deletions
4
Cargo.lock
generated
4
Cargo.lock
generated
|
|
@ -1821,9 +1821,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "vmt-parser"
|
name = "vmt-parser"
|
||||||
version = "0.1.0"
|
version = "0.1.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a1c071256bc38ca5a1f322052106da23ea3cd8bd0a5f18e9a3bd81ad040092bf"
|
checksum = "620c541038e4ea9ffcd32439f784ee60742c43da798d01ab62e4c005e7a22923"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"miette",
|
"miette",
|
||||||
"serde",
|
"serde",
|
||||||
|
|
|
||||||
|
|
@ -12,12 +12,12 @@ tracing = "0.1.37"
|
||||||
tracing-subscriber = { version = "0.3.16", features = ["env-filter"] }
|
tracing-subscriber = { version = "0.3.16", features = ["env-filter"] }
|
||||||
tracing-tree = "0.3.0"
|
tracing-tree = "0.3.0"
|
||||||
vtf = "0.1.6"
|
vtf = "0.1.6"
|
||||||
vmt-parser = "0.1"
|
vmt-parser = "0.1.1"
|
||||||
image = "0.23.14"
|
image = "0.23.14"
|
||||||
tf-asset-loader = { version = "0.1", features = ["zip"] }
|
tf-asset-loader = { version = "0.1", features = ["zip"] }
|
||||||
vmdl = "0.1"
|
vmdl = "0.1"
|
||||||
clap = { version = "4.0.29", features = ["derive"] }
|
clap = { version = "4.0.29", features = ["derive"] }
|
||||||
gltf-json = "1.4.0"
|
gltf-json = { version = "1.4.0", features = ["KHR_texture_transform"] }
|
||||||
gltf = "1.4.0"
|
gltf = "1.4.0"
|
||||||
cgmath = "0.18.0"
|
cgmath = "0.18.0"
|
||||||
bytemuck = { version = "1.14.0", features = ["derive"] }
|
bytemuck = { version = "1.14.0", features = ["derive"] }
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,9 @@
|
||||||
use crate::materials::{load_material_fallback, MaterialData, TextureData};
|
use crate::materials::{load_material_fallback, MaterialData, TextureData};
|
||||||
use crate::pad_byte_vector;
|
use crate::pad_byte_vector;
|
||||||
use gltf_json::buffer::View;
|
use gltf_json::buffer::View;
|
||||||
|
use gltf_json::extensions::texture::{
|
||||||
|
TextureTransform, TextureTransformOffset, TextureTransformRotation, TextureTransformScale,
|
||||||
|
};
|
||||||
use gltf_json::image::MimeType;
|
use gltf_json::image::MimeType;
|
||||||
use gltf_json::material::{AlphaCutoff, AlphaMode, PbrBaseColorFactor, PbrMetallicRoughness};
|
use gltf_json::material::{AlphaCutoff, AlphaMode, PbrBaseColorFactor, PbrMetallicRoughness};
|
||||||
use gltf_json::texture::Info;
|
use gltf_json::texture::Info;
|
||||||
|
|
@ -9,6 +12,7 @@ use gltf_json::validation::USize64;
|
||||||
use gltf_json::{Extras, Image, Index, Material, Root, Texture};
|
use gltf_json::{Extras, Image, Index, Material, Root, Texture};
|
||||||
use image::png::PngEncoder;
|
use image::png::PngEncoder;
|
||||||
use image::{ColorType, DynamicImage, GenericImageView};
|
use image::{ColorType, DynamicImage, GenericImageView};
|
||||||
|
use std::f32::consts::PI;
|
||||||
use tf_asset_loader::Loader;
|
use tf_asset_loader::Loader;
|
||||||
|
|
||||||
pub fn push_or_get_material(
|
pub fn push_or_get_material(
|
||||||
|
|
@ -49,6 +53,16 @@ pub fn push_material(buffer: &mut Vec<u8>, gltf: &mut Root, material: MaterialDa
|
||||||
_ => AlphaMode::Opaque,
|
_ => AlphaMode::Opaque,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let transform = material.transform.map(|transform| TextureTransform {
|
||||||
|
offset: TextureTransformOffset(transform.translate),
|
||||||
|
rotation: TextureTransformRotation(transform.rotate / 180.0 * PI),
|
||||||
|
scale: TextureTransformScale(transform.scale),
|
||||||
|
..TextureTransform::default()
|
||||||
|
});
|
||||||
|
let extensions = transform.map(|transform| gltf_json::extensions::texture::Info {
|
||||||
|
texture_transform: Some(transform),
|
||||||
|
});
|
||||||
|
|
||||||
Material {
|
Material {
|
||||||
name: Some(material.name),
|
name: Some(material.name),
|
||||||
alpha_cutoff: material
|
alpha_cutoff: material
|
||||||
|
|
@ -64,7 +78,7 @@ pub fn push_material(buffer: &mut Vec<u8>, gltf: &mut Root, material: MaterialDa
|
||||||
base_color_texture: texture_index.map(|index| Info {
|
base_color_texture: texture_index.map(|index| Info {
|
||||||
index,
|
index,
|
||||||
tex_coord: 0,
|
tex_coord: 0,
|
||||||
extensions: None,
|
extensions,
|
||||||
extras: Extras::default(),
|
extras: Extras::default(),
|
||||||
}),
|
}),
|
||||||
..PbrMetallicRoughness::default()
|
..PbrMetallicRoughness::default()
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,8 @@ use crate::Error;
|
||||||
use image::DynamicImage;
|
use image::DynamicImage;
|
||||||
use tf_asset_loader::Loader;
|
use tf_asset_loader::Loader;
|
||||||
use tracing::{error, instrument};
|
use tracing::{error, instrument};
|
||||||
use vmt_parser::from_str;
|
|
||||||
use vmt_parser::material::{Material, WaterMaterial};
|
use vmt_parser::material::{Material, WaterMaterial};
|
||||||
|
use vmt_parser::{from_str, TextureTransform};
|
||||||
use vtf::vtf::VTF;
|
use vtf::vtf::VTF;
|
||||||
|
|
||||||
pub fn load_material_fallback(name: &str, search_dirs: &[String], loader: &Loader) -> MaterialData {
|
pub fn load_material_fallback(name: &str, search_dirs: &[String], loader: &Loader) -> MaterialData {
|
||||||
|
|
@ -30,6 +30,7 @@ pub struct MaterialData {
|
||||||
pub bump_map: Option<TextureData>,
|
pub bump_map: Option<TextureData>,
|
||||||
pub translucent: bool,
|
pub translucent: bool,
|
||||||
pub no_cull: bool,
|
pub no_cull: bool,
|
||||||
|
pub transform: Option<TextureTransform>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
|
@ -102,6 +103,11 @@ pub fn load_material(
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
|
let transform = material
|
||||||
|
.base_texture_transform()
|
||||||
|
.filter(|transform| **transform != TextureTransform::default())
|
||||||
|
.cloned();
|
||||||
|
|
||||||
Ok(MaterialData {
|
Ok(MaterialData {
|
||||||
color: [255; 4],
|
color: [255; 4],
|
||||||
name: name.into(),
|
name: name.into(),
|
||||||
|
|
@ -114,6 +120,7 @@ pub fn load_material(
|
||||||
alpha_test,
|
alpha_test,
|
||||||
translucent: translucent | glass,
|
translucent: translucent | glass,
|
||||||
no_cull: material.no_cull(),
|
no_cull: material.no_cull(),
|
||||||
|
transform,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue