diff --git a/modules/mat4.lua b/modules/mat4.lua index 7db4c5a..9c136ee 100644 --- a/modules/mat4.lua +++ b/modules/mat4.lua @@ -665,7 +665,7 @@ function mat4.to_string(a) return str end ---- Convert a matrix to vec4s. +--- Convert a matrix to row vec4s. -- @tparam mat4 a Matrix to be converted -- @treturn table vec4s function mat4.to_vec4s(a) @@ -677,6 +677,18 @@ function mat4.to_vec4s(a) } end +--- Convert a matrix to col vec4s. +-- @tparam mat4 a Matrix to be converted +-- @treturn table vec4s +function mat4.to_vec4s_cols(a) + return { + { a[1], a[5], a[9], a[13] }, + { a[2], a[6], a[10], a[14] }, + { a[3], a[7], a[11], a[15] }, + { a[4], a[8], a[12], a[16] } + } +end + -- http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/ --- Convert a matrix to a quaternion. -- @tparam mat4 a Matrix to be converted diff --git a/spec/mat4_spec.lua b/spec/mat4_spec.lua index 19b0fff..7e76122 100644 --- a/spec/mat4_spec.lua +++ b/spec/mat4_spec.lua @@ -322,7 +322,12 @@ describe("mat4:", function() end) it("converts a matrix to vec4s", function() - local a = mat4() + local a = mat4 { + 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16 + } local v = a:to_vec4s() assert.is_true(type(v) == "table") assert.is_true(type(v[1]) == "table") @@ -330,25 +335,60 @@ describe("mat4:", function() assert.is_true(type(v[3]) == "table") assert.is_true(type(v[4]) == "table") - assert.is.equal(1, v[1][1]) - assert.is.equal(0, v[1][2]) - assert.is.equal(0, v[1][3]) - assert.is.equal(0, v[1][4]) + assert.is.equal(1, v[1][1]) + assert.is.equal(2, v[1][2]) + assert.is.equal(3, v[1][3]) + assert.is.equal(4, v[1][4]) - assert.is.equal(0, v[2][1]) - assert.is.equal(1, v[2][2]) - assert.is.equal(0, v[2][3]) - assert.is.equal(0, v[2][4]) + assert.is.equal(5, v[2][1]) + assert.is.equal(6, v[2][2]) + assert.is.equal(7, v[2][3]) + assert.is.equal(8, v[2][4]) - assert.is.equal(0, v[3][1]) - assert.is.equal(0, v[3][2]) - assert.is.equal(1, v[3][3]) - assert.is.equal(0, v[3][4]) + assert.is.equal(9, v[3][1]) + assert.is.equal(10, v[3][2]) + assert.is.equal(11, v[3][3]) + assert.is.equal(12, v[3][4]) - assert.is.equal(0, v[4][1]) - assert.is.equal(0, v[4][2]) - assert.is.equal(0, v[4][3]) - assert.is.equal(1, v[4][4]) + assert.is.equal(13, v[4][1]) + assert.is.equal(14, v[4][2]) + assert.is.equal(15, v[4][3]) + assert.is.equal(16, v[4][4]) + end) + + it("converts a matrix to vec4s, column-wise", function() + local a = mat4 { + 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16 + } + local v = a:to_vec4s_cols() + assert.is_true(type(v) == "table") + assert.is_true(type(v[1]) == "table") + assert.is_true(type(v[2]) == "table") + assert.is_true(type(v[3]) == "table") + assert.is_true(type(v[4]) == "table") + + assert.is.equal(1, v[1][1]) + assert.is.equal(5, v[1][2]) + assert.is.equal(9, v[1][3]) + assert.is.equal(13, v[1][4]) + + assert.is.equal(2, v[2][1]) + assert.is.equal(6, v[2][2]) + assert.is.equal(10, v[2][3]) + assert.is.equal(14, v[2][4]) + + assert.is.equal(3, v[3][1]) + assert.is.equal(7, v[3][2]) + assert.is.equal(11, v[3][3]) + assert.is.equal(15, v[3][4]) + + assert.is.equal(4, v[4][1]) + assert.is.equal(8, v[4][2]) + assert.is.equal(12, v[4][3]) + assert.is.equal(16, v[4][4]) end) it("converts a matrix to a quaternion", function()