love-demo/_math.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
}