--column major! local love = assert( love ) local math = math local t = {} --scale --rotate --translate function t.TRS( x, y, z, a, b, g, dx, dy, dz ) local c, s = math.cos, math.sin local ca, sa, cb, sb, cg, sg = c(a), s(a), c(b), s(b), c(g), s(g) return { {x*ca*cb, y*sa*cb, z*(-sb), 0}, {x*(ca*sb*sg - sa*cg), y*(sa*sb*sg+ca*cg), z*(cb*sg), 0}, {x*(ca*sb*cg+sa*sg), y*(sa*sb*cg-ca*sg), z*cb*cg, 0}, {dx, dy, dz, 1}} end --position of camera x y z --yaw a --pitch b function t.view( x, y, z, a, b ) local c, s = math.cos, math.sin local ca, cb, sa, sb = c(a), c(b), s(a), s(b) return t.__mul( { {1, 0, 0, 0}, {0, cb, sb, 0}, {0,-sb, cb, 0}, {0, 0, 0, 1}, }, t.__mul( { {ca, 0,-sa, 0}, {0, 1, 0, 0}, {sa, 0, ca, 0}, {0, 0, 0, 1}, }, { {1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {-x, -y, z, 1} })) end function t.projection(n, f, fov) local r = love.graphics.getWidth() / 2 local t = love.graphics.getHeight() / 2 local aspect = r/t local a = 1.0 / math.tan( fov / 2 ) return { {a, 0, 0, 0}, {0,-a, 0, 0}, {0, 0, (f+n)/(n-f), -1}, {0, 0, 2*f*n/(n-f), 0}, } end function t.transpose( A ) for i = 1, 4 do for j = 1, 4 do A[i][j] = A[j][i] end end end function t.__mul( A, B ) local C = {{},{},{},{}} for j = 1, 4 do for i = 1, 4 do C[j][i] = A[1][i] * B[j][1] + A[2][i] * B[j][2] + A[3][i] * B[j][3] + A[4][i] * B[j][4] end end return C end function t.__add( A, B ) local C = {} for i = 1, 4 do for j = 1, 4 do C[i][j] = A[i][j] + B[i][j] end end return C end function t.id() return {{ 1, 0, 0, 0 },{ 0, 1, 0, 0 },{0, 0, 1, 0},{0, 0, 0, 1}} end return t