162 lines
3.5 KiB
Lua
162 lines
3.5 KiB
Lua
local ffi = require 'ffi'
|
|
|
|
local sin = math.sin
|
|
local cos = math.cos
|
|
|
|
local mat4
|
|
|
|
local newmat4 = function(_t)
|
|
-- newByteData is zero-initialized
|
|
local data = love.data.newByteData(16 * 4)
|
|
local m = ffi.cast('float*', data:getFFIPointer())
|
|
value = {
|
|
data = data,
|
|
m = m,
|
|
}
|
|
setmetatable(value, mat4)
|
|
return value
|
|
end
|
|
|
|
mat4 = {
|
|
__call = newmat4,
|
|
|
|
identity = function()
|
|
local M = newmat4()
|
|
M.m[0 * 4 + 0] = 1.0
|
|
--M.m[0 * 4 + 1] = 0.0
|
|
--M.m[0 * 4 + 2] = 0.0
|
|
--M.m[0 * 4 + 3] = 0.0
|
|
|
|
--M.m[1 * 4 + 0] = 0.0
|
|
M.m[1 * 4 + 1] = 1.0
|
|
--M.m[1 * 4 + 2] = 0.0
|
|
--M.m[1 * 4 + 3] = 0.0
|
|
|
|
--M.m[2 * 4 + 0] = 0.0
|
|
--M.m[2 * 4 + 1] = 0.0
|
|
M.m[2 * 4 + 2] = 1.0
|
|
--M.m[2 * 4 + 3] = 0.0
|
|
|
|
--M.m[3 * 4 + 0] = 0.0
|
|
--M.m[3 * 4 + 1] = 0.0
|
|
--M.m[3 * 4 + 2] = 0.0
|
|
M.m[3 * 4 + 3] = 1.0
|
|
return M
|
|
end,
|
|
|
|
translation = function(x, y, z)
|
|
local M = newmat4()
|
|
M.m[0 * 4 + 0] = 1.0
|
|
--M.m[0 * 4 + 1] = 0.0
|
|
--M.m[0 * 4 + 2] = 0.0
|
|
--M.m[0 * 4 + 3] = 0.0
|
|
|
|
--M.m[1 * 4 + 0] = 0.0
|
|
M.m[1 * 4 + 1] = 1.0
|
|
--M.m[1 * 4 + 2] = 0.0
|
|
--M.m[1 * 4 + 3] = 0.0
|
|
|
|
--M.m[2 * 4 + 0] = 0.0
|
|
--M.m[2 * 4 + 1] = 0.0
|
|
M.m[2 * 4 + 2] = 1.0
|
|
--M.m[2 * 4 + 3] = 0.0
|
|
|
|
M.m[3 * 4 + 0] = x
|
|
M.m[3 * 4 + 1] = y
|
|
M.m[3 * 4 + 2] = z
|
|
M.m[3 * 4 + 3] = 1.0
|
|
return M
|
|
end,
|
|
|
|
rotation_x = function(angle)
|
|
local sin_angle = sin(angle)
|
|
local cos_angle = cos(angle)
|
|
|
|
local M = newmat4()
|
|
M.m[0 * 4 + 0] = 1.0
|
|
--M.m[0 * 4 + 1] = 0.0
|
|
--M.m[0 * 4 + 2] = 0.0
|
|
--M.m[0 * 4 + 3] = 0.0
|
|
|
|
--M.m[1 * 4 + 0] = 0.0
|
|
M.m[1 * 4 + 1] = cos_angle
|
|
M.m[1 * 4 + 2] = sin_angle
|
|
--M.m[1 * 4 + 3] = 0.0
|
|
|
|
--M.m[2 * 4 + 0] = 0.0
|
|
M.m[2 * 4 + 1] = -sin_angle
|
|
M.m[2 * 4 + 2] = cos_angle
|
|
--M.m[2 * 4 + 3] = 0.0
|
|
|
|
--M.m[3 * 4 + 0] = 0.0
|
|
--M.m[3 * 4 + 1] = 0.0
|
|
--M.m[3 * 4 + 2] = 0.0
|
|
M.m[3 * 4 + 3] = 1.0
|
|
return M
|
|
end,
|
|
|
|
rotation_y = function(angle)
|
|
local sin_angle = sin(angle)
|
|
local cos_angle = cos(angle)
|
|
|
|
local M = newmat4()
|
|
M.m[0 * 4 + 0] = cos_angle
|
|
--M.m[0 * 4 + 1] = 0.0
|
|
M.m[0 * 4 + 2] = -sin_angle
|
|
--M.m[0 * 4 + 3] = 0.0
|
|
|
|
--M.m[1 * 4 + 0] = 0.0
|
|
M.m[1 * 4 + 1] = 1.0
|
|
--M.m[1 * 4 + 2] = 0.0
|
|
--M.m[1 * 4 + 3] = 0.0
|
|
|
|
M.m[2 * 4 + 0] = sin_angle
|
|
--M.m[2 * 4 + 1] = 0.0
|
|
M.m[2 * 4 + 2] = cos_angle
|
|
--M.m[2 * 4 + 3] = 0.0
|
|
|
|
--M.m[3 * 4 + 0] = 0.0
|
|
--M.m[3 * 4 + 1] = 0.0
|
|
--M.m[3 * 4 + 2] = 0.0
|
|
M.m[3 * 4 + 3] = 1.0
|
|
return M
|
|
end,
|
|
|
|
rotation_z = function(angle)
|
|
local sin_angle = sin(angle)
|
|
local cos_angle = cos(angle)
|
|
|
|
local M = newmat4()
|
|
M.m[0 * 4 + 0] = cos_angle
|
|
M.m[0 * 4 + 1] = sin_angle
|
|
--M.m[0 * 4 + 2] = 0.0
|
|
--M.m[0 * 4 + 3] = 0.0
|
|
|
|
M.m[1 * 4 + 0] = -sin_angle
|
|
M.m[1 * 4 + 1] = cos_angle
|
|
--M.m[1 * 4 + 2] = 0.0
|
|
--M.m[1 * 4 + 3] = 0.0
|
|
|
|
--M.m[2 * 4 + 0] = 0.0
|
|
--M.m[2 * 4 + 1] = 0.0
|
|
M.m[2 * 4 + 2] = 1.0
|
|
--M.m[2 * 4 + 3] = 0.0
|
|
|
|
--M.m[3 * 4 + 0] = 0.0
|
|
--M.m[3 * 4 + 1] = 0.0
|
|
--M.m[3 * 4 + 2] = 0.0
|
|
M.m[3 * 4 + 3] = 1.0
|
|
return M
|
|
end,
|
|
|
|
dot = function(a, b)
|
|
print("dot" .. tostring(a) .. tostring(b))
|
|
end
|
|
}
|
|
|
|
setmetatable(mat4, mat4)
|
|
|
|
return {
|
|
mat4 = mat4
|
|
}
|