---@class m3f local m3f = { ---@type v3f[] rows = {} } ---@overload fun(): m3f ---@overload fun(r0: v3f, r1: v3f, r2: v3f): m3f ---@return m3f function m3f.new() end ---@return m3f function m3f.zero() end ---@return m3f function m3f.identity() end ---@overload fun(x: number, y: number, z: number): m3f ---@overload fun(xyz: v4f): m3f ---@overload fun(xyz: v3f): m3f ---@overload fun(xy: v2f, z: number): m3f ---@param x number ---@param y number ---@param z number ---@return m3f function m3f.make_scale(x,y,z) end ---@overload fun(a: degf | radf, x: number, y: number, z: number): m3f ---@overload fun(a: degf | radf, xyz: v4f): m3f ---@overload fun(a: degf | radf, xyz: v3f): m3f ---@overload fun(a: degf | radf, xy: v2f, z: number): m3f ---@overload fun(q: q4f): m3f ---@param a degf | radf ---@param x number ---@param y number ---@param z number ---@return m3f function m3f.make_rotation(a,x,y,z) end ---@param l m3f ---@param r m3f ---@return boolean function m3f.approximately(l, r) end ---@param m m3f ---@return m3f, boolean function m3f.inversed(m) end ---@param m m3f ---@return m3f function m3f.transposed(m) end ---@param m m3f ---@return boolean function m3f.contains_nan(m) end ---@type m3f _G.m3f = _G.m3f or m3f