_math: initial matrix/vector math library
This commit is contained in:
parent
955a3e09aa
commit
44a3c5b76e
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
.~*
|
||||||
|
.\#*
|
||||||
|
\#*
|
||||||
|
*~
|
||||||
161
_math.lua
Normal file
161
_math.lua
Normal file
@ -0,0 +1,161 @@
|
|||||||
|
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
|
||||||
|
}
|
||||||
47
main.lua
47
main.lua
@ -1,15 +1,25 @@
|
|||||||
local mesh
|
local mesh
|
||||||
|
local rotation
|
||||||
|
local texture
|
||||||
|
|
||||||
|
local ffi = require 'ffi'
|
||||||
|
|
||||||
local pixelcode = [[
|
local pixelcode = [[
|
||||||
#pragma language glsl3
|
#pragma language glsl3
|
||||||
|
|
||||||
varying vec4 PixelColor;
|
varying vec4 PixelNormal;
|
||||||
|
varying vec4 PixelTexture;
|
||||||
|
|
||||||
|
uniform sampler2D texture_sampler;
|
||||||
|
|
||||||
out vec4 outData;
|
out vec4 outData;
|
||||||
|
|
||||||
void pixelmain()
|
void pixelmain()
|
||||||
{
|
{
|
||||||
outData = PixelColor;
|
vec4 texColor = texture(texture_sampler, PixelTexture.xy);
|
||||||
|
|
||||||
|
float intensity = min(max(dot(vec3(1, 1, 1), PixelNormal.xyz), 0), 1);
|
||||||
|
outData = vec4(texColor.xyz * (0.1 + intensity * intensity), 1.0);
|
||||||
}
|
}
|
||||||
]]
|
]]
|
||||||
|
|
||||||
@ -25,11 +35,13 @@ local vertexcode = [[
|
|||||||
uniform mat4 model;
|
uniform mat4 model;
|
||||||
uniform mat4 model2;
|
uniform mat4 model2;
|
||||||
|
|
||||||
varying vec4 PixelColor;
|
varying vec4 PixelNormal;
|
||||||
|
varying vec4 PixelTexture;
|
||||||
|
|
||||||
void vertexmain()
|
void vertexmain()
|
||||||
{
|
{
|
||||||
PixelColor = VertexNormal * 0.5 + 0.5;
|
PixelNormal = VertexNormal * 0.5 + 0.5;
|
||||||
|
PixelTexture = VertexTexture;
|
||||||
mat4 trans = projection * view * model * model2;
|
mat4 trans = projection * view * model * model2;
|
||||||
love_Position = trans * vec4(VertexPosition.xyz, 1);
|
love_Position = trans * vec4(VertexPosition.xyz, 1);
|
||||||
}
|
}
|
||||||
@ -43,8 +55,6 @@ local vertexformat = {
|
|||||||
{ name = 'VertexTexture', format = 'floatvec3', location = 2 },
|
{ name = 'VertexTexture', format = 'floatvec3', location = 2 },
|
||||||
}
|
}
|
||||||
|
|
||||||
local rotation
|
|
||||||
|
|
||||||
function look_at()
|
function look_at()
|
||||||
local m = {
|
local m = {
|
||||||
1.000000, 0.000000, 0.000000, 0.000000,
|
1.000000, 0.000000, 0.000000, 0.000000,
|
||||||
@ -67,7 +77,7 @@ function projection()
|
|||||||
end
|
end
|
||||||
|
|
||||||
function love.load(args)
|
function love.load(args)
|
||||||
love.window.setMode(600, 600, {depth=true})
|
love.window.setMode(1024, 1024, {depth=true})
|
||||||
|
|
||||||
local vertexdata = love.filesystem.newFileData("position_normal_texture.vtx")
|
local vertexdata = love.filesystem.newFileData("position_normal_texture.vtx")
|
||||||
local indexdata = love.filesystem.newFileData("index.idx")
|
local indexdata = love.filesystem.newFileData("index.idx")
|
||||||
@ -105,6 +115,9 @@ function love.load(args)
|
|||||||
|
|
||||||
mesh = love.graphics.newMesh(attributelist, drawmode)
|
mesh = love.graphics.newMesh(attributelist, drawmode)
|
||||||
mesh:setIndexBuffer(indexbuffer)
|
mesh:setIndexBuffer(indexbuffer)
|
||||||
|
|
||||||
|
local image_data = love.image.newCompressedData('bird.dds')
|
||||||
|
texture = love.graphics.newTexture(image_data)
|
||||||
end
|
end
|
||||||
|
|
||||||
local rotation = 0.0
|
local rotation = 0.0
|
||||||
@ -142,15 +155,29 @@ function rotate_z(t)
|
|||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function print_matrix(ptr)
|
||||||
|
for i=0,15 do
|
||||||
|
io.write(tostring(ptr[i]))
|
||||||
|
io.write(" ")
|
||||||
|
if i % 4 == 3 then
|
||||||
|
io.write("\n")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
local math = require '_math'
|
||||||
|
local mat4 = math.mat4
|
||||||
|
|
||||||
function love.draw()
|
function love.draw()
|
||||||
local radius = 100
|
local radius = 100
|
||||||
local mx, my = love.mouse.getPosition()
|
local mx, my = love.mouse.getPosition()
|
||||||
|
|
||||||
shader:send("projection", projection(1, 1))
|
shader:send("projection", projection(1, 1))
|
||||||
shader:send("view", look_at())
|
shader:send("view", "column", mat4.translation(0, 0, -2).data)
|
||||||
shader:send("model", rotate_x(rotation))
|
shader:send("model", "column", mat4.rotation_x(rotation).data)
|
||||||
shader:send("model2", rotate_z(rotation * 0.5))
|
shader:send("model2", "column", mat4.rotation_z(rotation * 0.5).data)
|
||||||
|
shader:send("texture_sampler", texture)
|
||||||
rotation = rotation + 0.01
|
rotation = rotation + 0.01
|
||||||
love.graphics.setShader(shader)
|
love.graphics.setShader(shader)
|
||||||
love.graphics.setDepthMode("less", true)
|
love.graphics.setDepthMode("less", true)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user