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, xx:f32,yx:f32,zx:f32, xy:f32,yy:f32,zy:f32, xz:f32,yz:f32,zz:f32, )->Self{ Self(glam::Affine3A::from_mat3_translation( glam::mat3( glam::vec3(xx,yx,zx), glam::vec3(xy,yy,zy), glam::vec3(xz,yz,zz) ), glam::vec3(x,y,z) )) } pub fn point(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))) } } fn vec3_to_glam(v:glam::Vec3A)->rbx_types::Vector3{ rbx_types::Vector3::new(v.x,v.y,v.z) } fn vec3_from_glam(v:rbx_types::Vector3)->glam::Vec3A{ glam::vec3a(v.x,v.y,v.z) } impl Into for CFrame{ fn into(self)->rbx_types::CFrame{ rbx_types::CFrame::new( vec3_to_glam(self.0.translation), rbx_types::Matrix3::new( vec3_to_glam(self.0.matrix3.x_axis), vec3_to_glam(self.0.matrix3.y_axis), vec3_to_glam(self.0.matrix3.z_axis), ) ) } } impl From for CFrame{ fn from(value:rbx_types::CFrame)->Self{ CFrame(glam::Affine3A{ matrix3:glam::mat3a( vec3_from_glam(value.orientation.x), vec3_from_glam(value.orientation.y), vec3_from_glam(value.orientation.z), ), translation:vec3_from_glam(value.position) }) } } 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(|_,(x,y,z):(f32,f32,f32)| Ok(CFrame::point(x,y,z)) )? )?; //CFrame.Angles cframe_table.raw_set("Angles", lua.create_function(|_,(x,y,z):(f32,f32,f32)| Ok(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);