This commit is contained in:
Robin Appelman 2024-12-14 16:55:52 +01:00
commit e40471cda0
3 changed files with 547 additions and 756 deletions

1258
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -14,27 +14,28 @@ thiserror = "2.0.7"
static_assertions = "1.1.0" static_assertions = "1.1.0"
bitflags = "2.6.0" bitflags = "2.6.0"
itertools = "0.13.0" itertools = "0.13.0"
tracing = "0.1.40" tracing = "0.1.41"
bytemuck = { version = "1.17.0", features = ["derive"] } bytemuck = { version = "1.20.0", features = ["derive"] }
cgmath = "0.18.0" cgmath = "0.18.0"
num_enum = "0.7.3" num_enum = "0.7.3"
half = "2.4.1" half = "2.4.1"
[dev-dependencies] [dev-dependencies]
three-d = { version = "0.14.1", features = ["egui-gui"] } three-d = { version = "0.18.0", features = ["egui-gui"] }
miette = { version = "7.2.0", features = ["fancy", "derive"] } three-d-asset = "0.9.1"
miette = { version = "7.4.0", features = ["fancy", "derive"] }
criterion = "0.5.1" criterion = "0.5.1"
iai = "0.1" iai = "0.1"
vtf = "0.3.0" vtf = "0.3.0"
tracing = "0.1.40" tracing = "0.1.41"
tracing-subscriber = "0.3.18" tracing-subscriber = "0.3.19"
gltf-json = "=1.3.0" gltf-json = "=1.3.0"
gltf = "=1.3.0" gltf = "=1.3.0"
image = "0.25.5" image = "0.25.5"
clap = { version = "4.4.18", features = ["derive"] } clap = { version = "4.5.23", features = ["derive"] }
main_error = "0.1.2" main_error = "0.1.2"
vmt-parser = "0.2" vmt-parser = "0.2"
tf-asset-loader = "0.1" tf-asset-loader = "0.1.8"
[[bench]] [[bench]]
name = "parse" name = "parse"

View file

@ -5,10 +5,18 @@ mod material;
use crate::error::Error; use crate::error::Error;
use crate::material::{load_material_fallback, MaterialData}; use crate::material::{load_material_fallback, MaterialData};
use cgmath::{vec3, Matrix4, SquareMatrix};
use std::env::args_os; use std::env::args_os;
use std::path::PathBuf; use std::path::PathBuf;
use tf_asset_loader::Loader; use tf_asset_loader::Loader;
use three_d::*; use three_d::{
AmbientLight, Camera, ClearState, ColorMaterial, CpuMaterial, CpuMesh, CpuModel, CpuTexture,
DepthMaterial, DirectionalLight, FrameOutput, Light, NormalMaterial, ORMMaterial, OrbitControl,
PhysicalMaterial, PositionMaterial, UVMaterial, Vec2, Vec4, Window, WindowSettings,
};
use three_d_asset::{
degrees, Geometry, Mat4, Positions, Primitive, Srgba, TextureData, Vec3, Viewport,
};
use vmdl::Model; use vmdl::Model;
#[derive(Debug, Copy, Clone, PartialEq, Eq)] #[derive(Debug, Copy, Clone, PartialEq, Eq)]
@ -51,7 +59,7 @@ fn main() -> Result<(), Error> {
300.0, 300.0,
); );
let mut control = OrbitControl::new(*camera.target(), 1.0, 100.0); let mut control = OrbitControl::new(camera.target(), 1.0, 100.0);
let mut gui = three_d::GUI::new(&context); let mut gui = three_d::GUI::new(&context);
let loader = Loader::new().expect("loader"); let loader = Loader::new().expect("loader");
@ -60,7 +68,7 @@ fn main() -> Result<(), Error> {
let cpu_models = (0..skin_count).map(|skin| model_to_model(&source_model, &loader, skin)); let cpu_models = (0..skin_count).map(|skin| model_to_model(&source_model, &loader, skin));
let ph_material = PhysicalMaterial { let ph_material = PhysicalMaterial {
albedo: Color { albedo: Srgba {
r: 128, r: 128,
g: 128, g: 128,
b: 128, b: 128,
@ -74,11 +82,11 @@ fn main() -> Result<(), Error> {
.collect(); .collect();
let mut directional = [ let mut directional = [
DirectionalLight::new(&context, 1.0, Color::WHITE, &vec3(1.0, -1.0, 0.0)), DirectionalLight::new(&context, 1.0, Srgba::WHITE, vec3(1.0, -1.0, 0.0)),
DirectionalLight::new(&context, 1.0, Color::WHITE, &vec3(1.0, 1.0, 0.0)), DirectionalLight::new(&context, 1.0, Srgba::WHITE, vec3(1.0, 1.0, 0.0)),
]; ];
let mut ambient = AmbientLight { let mut ambient = AmbientLight {
color: Color::WHITE, color: Srgba::WHITE,
intensity: 0.2, intensity: 0.2,
..Default::default() ..Default::default()
}; };
@ -154,7 +162,9 @@ fn main() -> Result<(), Error> {
// Draw // Draw
{ {
camera.set_perspective_projection(degrees(fov), camera.z_near(), camera.z_far()); let z_near = camera.z_near();
let z_far = camera.z_far();
camera.set_perspective_projection(degrees(fov), z_near, z_far);
if shadows_enabled { if shadows_enabled {
directional[0].generate_shadow_map(1024, model.iter().map(|gm| &gm.geometry)); directional[0].generate_shadow_map(1024, model.iter().map(|gm| &gm.geometry));
directional[1].generate_shadow_map(1024, model.iter().map(|gm| &gm.geometry)); directional[1].generate_shadow_map(1024, model.iter().map(|gm| &gm.geometry));
@ -216,7 +226,8 @@ fn main() -> Result<(), Error> {
), ),
DebugType::NONE => target.render(&camera, model, lights), DebugType::NONE => target.render(&camera, model, lights),
} }
.write(|| gui.render()); .write(|| gui.render())
.expect("failed to render");
} }
let _ = change; let _ = change;
@ -246,10 +257,6 @@ fn model_to_model(model: &Model, loader: &Loader, skin: usize) -> CpuModel {
let geometries = model let geometries = model
.meshes() .meshes()
.map(|mesh| { .map(|mesh| {
let texture = skin
.texture(mesh.material_index())
.expect("texture out of bounds");
let positions: Vec<Vec3> = mesh let positions: Vec<Vec3> = mesh
.vertices() .vertices()
.map(|vertex| model.apply_root_transform(vertex.position)) .map(|vertex| model.apply_root_transform(vertex.position))
@ -263,13 +270,19 @@ fn model_to_model(model: &Model, loader: &Loader, skin: usize) -> CpuModel {
.collect(); .collect();
let tangents: Vec<Vec4> = mesh.tangents().map(Vec4::from).collect(); let tangents: Vec<Vec4> = mesh.tangents().map(Vec4::from).collect();
CpuMesh { let triangles = CpuMesh {
positions: Positions::F32(positions), positions: Positions::F32(positions),
normals: Some(normals), normals: Some(normals),
uvs: Some(uvs), uvs: Some(uvs),
material_name: Some(texture.into()),
tangents: Some(tangents), tangents: Some(tangents),
..Default::default() ..Default::default()
};
Primitive {
name: "model".into(),
geometry: Geometry::Triangles(triangles),
transformation: Mat4::identity(),
animations: vec![],
material_index: skin.texture_index(mesh.material_index()),
} }
}) })
.collect(); .collect();
@ -282,6 +295,7 @@ fn model_to_model(model: &Model, loader: &Loader, skin: usize) -> CpuModel {
.collect(); .collect();
CpuModel { CpuModel {
name: "model".into(),
materials, materials,
geometries, geometries,
} }
@ -289,7 +303,7 @@ fn model_to_model(model: &Model, loader: &Loader, skin: usize) -> CpuModel {
fn convert_material(material: MaterialData) -> CpuMaterial { fn convert_material(material: MaterialData) -> CpuMaterial {
CpuMaterial { CpuMaterial {
albedo: Color::new( albedo: Srgba::new(
material.color[0], material.color[0],
material.color[1], material.color[1],
material.color[2], material.color[2],