use glam::{Vec2, Vec3};
#[derive(Debug, Clone)]
pub struct MeshData {
pub positions: Vec<Vec3>,
pub normals: Vec<Vec3>,
pub texcoords: Vec<Vec2>,
pub tangents: Vec<[f32; 4]>,
pub indices: Vec<u32>,
}
impl MeshData {
pub fn validate(&self) -> Result<(), String> {
let n = self.positions.len();
if self.normals.len() != n {
return Err(format!(
"normals.len()={} != positions.len()={}", self.normals.len(), n
));
}
if self.texcoords.len() != n {
return Err(format!(
"texcoords.len()={} != positions.len()={}", self.texcoords.len(), n
));
}
if self.tangents.len() != n {
return Err(format!(
"tangents.len()={} != positions.len()={}", self.tangents.len(), n
));
}
Ok(())
}
pub fn vertex_count(&self) -> usize {
self.positions.len()
}
pub fn index_count(&self) -> usize {
self.indices.len()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_mesh_data_counts() {
let mesh = MeshData {
positions: vec![Vec3::ZERO; 24],
normals: vec![Vec3::Z; 24],
texcoords: vec![Vec2::ZERO; 24],
tangents: vec![[1.0, 0.0, 0.0, 1.0]; 24],
indices: vec![0; 36],
};
assert_eq!(mesh.vertex_count(), 24);
assert_eq!(mesh.index_count(), 36);
}
#[test]
fn test_mesh_data_empty() {
let mesh = MeshData {
positions: vec![],
normals: vec![],
texcoords: vec![],
tangents: vec![],
indices: vec![],
};
assert_eq!(mesh.vertex_count(), 0);
assert_eq!(mesh.index_count(), 0);
}
}