texture transforms

This commit is contained in:
Robin Appelman 2023-12-22 18:20:32 +01:00
commit 3b9f0b7458
4 changed files with 27 additions and 6 deletions

4
Cargo.lock generated
View file

@ -1821,9 +1821,9 @@ dependencies = [
[[package]]
name = "vmt-parser"
version = "0.1.0"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1c071256bc38ca5a1f322052106da23ea3cd8bd0a5f18e9a3bd81ad040092bf"
checksum = "620c541038e4ea9ffcd32439f784ee60742c43da798d01ab62e4c005e7a22923"
dependencies = [
"miette",
"serde",

View file

@ -12,12 +12,12 @@ tracing = "0.1.37"
tracing-subscriber = { version = "0.3.16", features = ["env-filter"] }
tracing-tree = "0.3.0"
vtf = "0.1.6"
vmt-parser = "0.1"
vmt-parser = "0.1.1"
image = "0.23.14"
tf-asset-loader = { version = "0.1", features = ["zip"] }
vmdl = "0.1"
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"
cgmath = "0.18.0"
bytemuck = { version = "1.14.0", features = ["derive"] }

View file

@ -1,6 +1,9 @@
use crate::materials::{load_material_fallback, MaterialData, TextureData};
use crate::pad_byte_vector;
use gltf_json::buffer::View;
use gltf_json::extensions::texture::{
TextureTransform, TextureTransformOffset, TextureTransformRotation, TextureTransformScale,
};
use gltf_json::image::MimeType;
use gltf_json::material::{AlphaCutoff, AlphaMode, PbrBaseColorFactor, PbrMetallicRoughness};
use gltf_json::texture::Info;
@ -9,6 +12,7 @@ use gltf_json::validation::USize64;
use gltf_json::{Extras, Image, Index, Material, Root, Texture};
use image::png::PngEncoder;
use image::{ColorType, DynamicImage, GenericImageView};
use std::f32::consts::PI;
use tf_asset_loader::Loader;
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,
};
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 {
name: Some(material.name),
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 {
index,
tex_coord: 0,
extensions: None,
extensions,
extras: Extras::default(),
}),
..PbrMetallicRoughness::default()

View file

@ -2,8 +2,8 @@ use crate::Error;
use image::DynamicImage;
use tf_asset_loader::Loader;
use tracing::{error, instrument};
use vmt_parser::from_str;
use vmt_parser::material::{Material, WaterMaterial};
use vmt_parser::{from_str, TextureTransform};
use vtf::vtf::VTF;
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 translucent: bool,
pub no_cull: bool,
pub transform: Option<TextureTransform>,
}
#[derive(Debug)]
@ -102,6 +103,11 @@ pub fn load_material(
})
});
let transform = material
.base_texture_transform()
.filter(|transform| **transform != TextureTransform::default())
.cloned();
Ok(MaterialData {
color: [255; 4],
name: name.into(),
@ -114,6 +120,7 @@ pub fn load_material(
alpha_test,
translucent: translucent | glass,
no_cull: material.no_cull(),
transform,
})
}