use super::vector3::Vector3; #[derive(Clone,Copy)] pub struct CFrame(pub(crate)glam::Affine3A); impl CFrame{ pub fn new(x:f32,y:f32,z:f32)->Self{ Self(glam::Affine3A::from_translation(glam::vec3(x,y,z))) } pub fn angles(x:f32,y:f32,z:f32)->Self{ Self(glam::Affine3A::from_mat3(glam::Mat3::from_euler(glam::EulerRot::YXZ,y,x,z))) } } pub fn set_globals(lua:&mlua::Lua,globals:&mlua::Table<'_>)->Result<(),mlua::Error>{ let cframe_table=lua.create_table()?; //CFrame.new cframe_table.raw_set("new", lua.create_function(|ctx,(x,y,z):(f32,f32,f32)| Ok(ctx.create_userdata(CFrame::new(x,y,z))) )? )?; //CFrame.Angles cframe_table.raw_set("Angles", lua.create_function(|ctx,(x,y,z):(f32,f32,f32)| Ok(ctx.create_userdata(CFrame::angles(x,y,z))) )? )?; globals.set("CFrame",cframe_table)?; Ok(()) } impl mlua::UserData for CFrame{ fn add_fields<'lua,F:mlua::UserDataFields<'lua,Self>>(fields:&mut F){ //CFrame.p fields.add_field_method_get("p",|_,this|Ok(Vector3(this.0.translation))); } fn add_methods<'lua,M:mlua::UserDataMethods<'lua,Self>>(methods:&mut M){ methods.add_method("components",|_,this,()|Ok(( this.0.translation.x, this.0.translation.y, this.0.translation.z, this.0.matrix3.x_axis.x, this.0.matrix3.y_axis.x, this.0.matrix3.z_axis.x, this.0.matrix3.x_axis.y, this.0.matrix3.y_axis.y, this.0.matrix3.z_axis.y, this.0.matrix3.x_axis.z, this.0.matrix3.y_axis.z, this.0.matrix3.z_axis.z, ))); //methods.add_meta_method(mlua::MetaMethod::Mul,|_,this,val:&Vector3|Ok(Vector3(this.0.matrix3*val.0+this.0.translation))); methods.add_meta_function(mlua::MetaMethod::Mul,|_,(this,val):(Self,Self)|Ok(Self(this.0*val.0))); methods.add_meta_function(mlua::MetaMethod::ToString,|_,this:Self| Ok(format!("CFrame.new({},{},{},{},{},{},{},{},{},{},{},{})", this.0.translation.x, this.0.translation.y, this.0.translation.z, this.0.matrix3.x_axis.x, this.0.matrix3.y_axis.x, this.0.matrix3.z_axis.x, this.0.matrix3.x_axis.y, this.0.matrix3.y_axis.y, this.0.matrix3.z_axis.y, this.0.matrix3.x_axis.z, this.0.matrix3.y_axis.z, this.0.matrix3.z_axis.z, )) ); } } type_from_lua_userdata!(CFrame);