use crate::Pose;
#[derive(Default, Clone, Debug)]
pub struct Assets {
pub meshes: Vec<Mesh>,
pub hfields: Vec<Hfield>,
pub textures: Vec<Texture>,
pub materials: Vec<Material>,
}
impl Assets {
pub fn mesh(&self, name: &str) -> Option<&Mesh> {
self.meshes.iter().find(|m| m.name.as_deref() == Some(name))
}
pub fn hfield(&self, name: &str) -> Option<&Hfield> {
self.hfields
.iter()
.find(|h| h.name.as_deref() == Some(name))
}
pub fn material(&self, name: &str) -> Option<&Material> {
self.materials
.iter()
.find(|m| m.name.as_deref() == Some(name))
}
pub fn texture(&self, name: &str) -> Option<&Texture> {
self.textures
.iter()
.find(|t| t.name.as_deref() == Some(name))
}
}
#[derive(Default, Clone, Debug)]
pub struct Mesh {
pub name: Option<String>,
pub class: Option<String>,
pub file: Option<String>,
pub scale: [f64; 3],
pub refpose: Pose,
pub inline_vertices: Option<Vec<f64>>,
pub inline_normals: Option<Vec<f64>>,
pub inline_faces: Option<Vec<u32>>,
pub inertia: MeshInertia,
pub max_hull_vert: Option<u32>,
pub smoothnormal: f64,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Default)]
pub enum MeshInertia {
Shell,
#[default]
Convex,
Exact,
Legacy,
}
#[derive(Default, Clone, Debug)]
pub struct Hfield {
pub name: Option<String>,
pub class: Option<String>,
pub nrow: u32,
pub ncol: u32,
pub size: [f64; 4],
pub file: Option<String>,
pub elevation: Option<Vec<f64>>,
}
#[derive(Default, Clone, Debug)]
pub struct Texture {
pub name: Option<String>,
pub class: Option<String>,
pub type_: Option<String>,
pub file: Option<String>,
pub builtin: Option<String>,
pub rgb1: Option<[f64; 3]>,
pub rgb2: Option<[f64; 3]>,
}
#[derive(Default, Clone, Debug)]
pub struct Material {
pub name: Option<String>,
pub class: Option<String>,
pub texture: Option<String>,
pub rgba: Option<[f64; 4]>,
pub emission: f64,
pub specular: f64,
pub shininess: f64,
pub roughness: f64,
pub metallic: f64,
}