feat: PC change for gltf load algorithm change

This commit is contained in:
alphafetus committed 2026-09-01 14:22:46 -04:00
1 parent 508a69d385
commit a97a14a254
4 files changed
+67 -5

No files matched your search

+1 -2
View File
@@ -572,8 +572,7 @@ impl App {
enabled_extensions: required_extensions,
..Default::default()
},
)
.map_err(|e| {
).map_err(|e| {
let err = e.unwrap();
format!("Failed to create instance: {err}")
})
+1 -1
View File
@@ -30,7 +30,7 @@ impl Camera {
/// (0, 0, 0), and a default FOV of 70 degrees.
pub fn new(extents: impl Into<Vector2<u32>>) -> Self {
let extents = extents.into();
let position = Vector3::new(-7.0, 7.0, -7.0);
let position = Vector3::new(10.0, 0.0, 0.0);
let target = Vector3::zeros();
// Traveling along this vector moves us toward the target.
+30 -2
View File
@@ -1,9 +1,25 @@
use crate::loaders::mesh_loader::{MeshFileLoader, MeshInfo};
use anyhow::Result;
use std::path::Path;
use nalgebra::Matrix4;
pub struct GltfLoader;
impl GltfLoader {
/// Traverses and loads all information from a GLTF/GLB node.
pub fn traverse_node(
node: &gltf::Node,
parent_transform: &Matrix4<f32>,
buffers: &[Vec<u8>],
vertices: &mut Vec<[f32; 3]>,
normals: &mut Vec<[f32; 3]>,
uvs: &mut Vec<[f32; 3]>,
indices: &mut Vec<u32>
) {
}
}
impl MeshFileLoader for GltfLoader {
fn load_mesh(&self, path: &Path) -> Result<MeshInfo> {
let (document, buffers, _) = gltf::import(path)?;
@@ -13,6 +29,18 @@ impl MeshFileLoader for GltfLoader {
let mut uvs = Vec::new();
let mut indices = Vec::<u32>::new();
let scenes = document.scenes();
// We need to iterate through scenes and apply the transforms from each scene to their
// corresponding vertices.
println!("Parsing {} scenes from {:?}", scenes.len(), path);
for scene in scenes {
for node in scene.nodes() {
let transform = node.transform().matrix();
println!("Scene has transform: {:?}", transform);
}
}
for mesh in document.meshes() {
for primitive in mesh.primitives() {
// Read the primitives as vertices and indices,
@@ -23,7 +51,7 @@ impl MeshFileLoader for GltfLoader {
if let Some(positions) = reader.read_positions() {
for position in positions {
vertices.push(position);
vertices.push([position[0], position[2], -position[1]]);
}
}
@@ -35,7 +63,7 @@ impl MeshFileLoader for GltfLoader {
if let Some(tex_coords) = reader.read_tex_coords(0) {
for uv in tex_coords.into_f32() {
uvs.push([uv[0], uv[1], 0.0]);
uvs.push([uv[0], 1.0 - uv[1], 0.0]);
}
}
+35
View File
@@ -64,3 +64,38 @@ impl MeshLoader {
.load_mesh(path.as_ref())
}
}
#[cfg(test)]
pub mod test_load_meshes {
use super::*;
fn load_gltf(loader: &MeshLoader) -> Result<MeshInfo> {
loader.load_mesh(&Path::new("meshes/laat_gltf/scene.gltf"))
}
fn load_obj(loader: &MeshLoader) -> Result<MeshInfo> {
loader.load_mesh(&Path::new("meshes/laat_gunship/scene.obj"))
}
#[test]
fn compare_obj_gltf() -> Result<()> {
// Create the mesh loader
let loader = MeshLoader::new();
let obj = load_obj(&loader)?;
let gltf = load_gltf(&loader)?;
// Compare mesh information between the two MeshInfo structs.
obj.vertices.iter()
.zip(gltf.vertices.iter())
.for_each(|(&a, &b)| assert_eq!(a, b));
obj.indices.iter()
.zip(gltf.indices.iter())
.for_each(|(&a, &b)| assert_eq!(a, b));
obj.normals.iter()
.zip(gltf.normals.iter())
.for_each(|(&a, &b)| assert_eq!(a, b));
Ok(())
}
}