use crate::geometry::Mesh; use crate::assets::mtl::Material; use crate::handles::{ MeshHandle, MaterialHandle }; use crate::assets::types::ObjData; use crate::math::Mat4; pub struct ModelData { pub name: String, pub meshes: Vec, pub materials: Vec, pub transform: Mat4, } impl From<&ObjData> for ModelData { fn from(obj: &ObjData) -> Self { let meshes = obj.meshes.iter() .map(|obj_mesh| Mesh::new(obj, obj_mesh)) .collect(); ModelData { name: String::new(), meshes, materials: Vec::new(), transform: Mat4::identity(), } } } #[derive(Debug)] pub struct Model { pub name: String, pub parts: Vec<(MeshHandle, MaterialHandle)>, pub transform: Mat4, } impl Default for Model { fn default() -> Self { Self { name: String::new(), parts: Vec::new(), transform: Mat4::identity(), } } } impl Model { /// Set position (translation) pub fn set_position(&mut self, x: f32, y: f32, z: f32) { self.transform = Mat4::translation(x, y, z); } /// Set scale pub fn set_scale(&mut self, x: f32, y: f32, z: f32) { self.transform = Mat4::scale(x, y, z); } /// Set full transform (for combining translation * rotation * scale) pub fn set_transform(&mut self, transform: Mat4) { self.transform = transform; } }