start ffi matrices; resources
This commit is contained in:
parent
25410647cc
commit
569bb389a9
Binary file not shown.
|
@ -0,0 +1,11 @@
|
||||||
|
return {
|
||||||
|
intro = {
|
||||||
|
"ᐊᑯᓕᕕᒃ",
|
||||||
|
"1968",
|
||||||
|
"BROTHER JARED has led his flock beyond darkest Thule",
|
||||||
|
"to conjure ZIMINIAR, KING OF THE NORTH.",
|
||||||
|
"You are the latest to attempt the ritual.",
|
||||||
|
"Succeed, and be crowned Brother Jared's foremost wife.",
|
||||||
|
"You are at the mercy of ZIMINIAR, and the elements he commands."
|
||||||
|
}
|
||||||
|
}
|
70
main.lua
70
main.lua
|
@ -1,38 +1,53 @@
|
||||||
local love = assert( love )
|
local love = assert( love )
|
||||||
|
local mat4 = require( "mat4" )
|
||||||
|
local alph = 1/math.sqrt(2)
|
||||||
local testMesh = love.graphics.newMesh(
|
local testMesh = love.graphics.newMesh(
|
||||||
{--attributes
|
{--attributes
|
||||||
{"VertexPosition", "float", 4},
|
{"VertexPosition", "float", 4},
|
||||||
{"VertexColor", "float", 3}
|
{"VertexColor", "float", 3},
|
||||||
|
{"VertexTexCoord", "float", 2},
|
||||||
},
|
},
|
||||||
{--vertices
|
{--vertices
|
||||||
{ 0, 0, 0, 1,
|
{ 1, 0, -alph, 1,
|
||||||
1, 1, 1 },
|
1, 1, 1,
|
||||||
{ 1, 0, 0, 1,
|
1, 0 },
|
||||||
1, 0, 0 },
|
{ -1, 0, -alph, 1,
|
||||||
{ 0, 1, 0, 1,
|
1, 0, 0,
|
||||||
0, 1, 0 },
|
0, 0 },
|
||||||
{ 0, 0, 1, 1,
|
{ 0, 1, alph, 1,
|
||||||
0, 0, 1 },
|
0, 1, 0,
|
||||||
|
1, 1, },
|
||||||
|
{ 0, -1, alph, 1,
|
||||||
|
0, 0, 1,
|
||||||
|
0, 1, },
|
||||||
},
|
},
|
||||||
"strip",
|
"strip",
|
||||||
"static"
|
"static"
|
||||||
)
|
)
|
||||||
testMesh:setVertexMap{ 1,2,3,4,1,2 }
|
testMesh:setVertexMap{ 1,2,3,4,1,2 }
|
||||||
|
local rockTexture = love.graphics.newImage( "tex/rock.png" )
|
||||||
|
rockTexture:setWrap( "repeat", "repeat" )
|
||||||
|
testMesh:setTexture( rockTexture )
|
||||||
|
|
||||||
local testQuad = love.graphics.newMesh(
|
local testQuad = love.graphics.newMesh(
|
||||||
{--attributes
|
{--attributes
|
||||||
{"VertexPosition", "float", 4},
|
{"VertexPosition", "float", 4},
|
||||||
{"VertexColor", "float", 3}
|
{"VertexColor", "float", 3},
|
||||||
|
{"VertexTexCoord", "float", 2},
|
||||||
},
|
},
|
||||||
{--vertices
|
{--vertices
|
||||||
{ -1, -1,- 2, 1,
|
{ -1, -1,- 2, 1,
|
||||||
1, 1, 1 },
|
1, 1, 1,
|
||||||
|
0, 0, },
|
||||||
{ 1, -1,- 2, 1,
|
{ 1, -1,- 2, 1,
|
||||||
1, 0, 0 },
|
1, 0, 0,
|
||||||
|
1, 0, },
|
||||||
{ 1, 1,- 2, 1,
|
{ 1, 1,- 2, 1,
|
||||||
0, 0, 1 },
|
0, 0, 1,
|
||||||
|
1, 1, },
|
||||||
{ -1, 1,- 2, 1,
|
{ -1, 1,- 2, 1,
|
||||||
0, 1, 0 },
|
0, 1, 0,
|
||||||
|
0, 1, },
|
||||||
},
|
},
|
||||||
"fan",
|
"fan",
|
||||||
"static"
|
"static"
|
||||||
|
@ -52,13 +67,13 @@ local testShader = [[
|
||||||
#endif
|
#endif
|
||||||
#ifdef PIXEL
|
#ifdef PIXEL
|
||||||
vec4 effect( vec4 color, Image tex, vec2 texuv, vec2 scruv) {
|
vec4 effect( vec4 color, Image tex, vec2 texuv, vec2 scruv) {
|
||||||
return color * vec4( 1.0, 1.0, 1.0, 1.0 ) ;
|
return color * Texel(tex, texuv) * vec4( 1.0, 1.0, 1.0, 1.0 ) ;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
]]
|
]]
|
||||||
testShader = love.graphics.newShader( testShader, testShader )
|
testShader = love.graphics.newShader( testShader, testShader )
|
||||||
|
|
||||||
--TODO: column major
|
--column major
|
||||||
local function prod( A, B )
|
local function prod( A, B )
|
||||||
local C = {}
|
local C = {}
|
||||||
for j = 1,4 do C[j] = {0, 0, 0, 0} end
|
for j = 1,4 do C[j] = {0, 0, 0, 0} end
|
||||||
|
@ -162,12 +177,14 @@ local testDSCanvas = love.graphics.newCanvas(
|
||||||
format = "depth24" })
|
format = "depth24" })
|
||||||
|
|
||||||
local testCanvas = love.graphics.newCanvas()
|
local testCanvas = love.graphics.newCanvas()
|
||||||
|
local creeFont = love.graphics.newFont( "fonts/bjcrus.ttf", 48 )
|
||||||
--row major
|
--row major
|
||||||
--4th column [:][4] translates
|
--4th column [:][4] translates
|
||||||
--diagonal [i][i], i < 4 scales
|
--diagonal [i][i], i < 4 scales
|
||||||
--rotations in [1:3][1:3]
|
--rotations in [1:3][1:3]
|
||||||
function love.draw()
|
function love.draw()
|
||||||
|
|
||||||
|
|
||||||
love.graphics.setColor( 1, 1 ,1, 1 )
|
love.graphics.setColor( 1, 1 ,1, 1 )
|
||||||
love.graphics.push( "all" )
|
love.graphics.push( "all" )
|
||||||
love.graphics.setCanvas( { testCanvas, depthstencil = testDSCanvas } )
|
love.graphics.setCanvas( { testCanvas, depthstencil = testDSCanvas } )
|
||||||
|
@ -177,10 +194,19 @@ function love.draw()
|
||||||
testShader:send( "mdl", "column", testModelMatrix )
|
testShader:send( "mdl", "column", testModelMatrix )
|
||||||
testShader:send( "proj", "column", testProjection )
|
testShader:send( "proj", "column", testProjection )
|
||||||
testShader:send( "view", "column", testViewMatrix )
|
testShader:send( "view", "column", testViewMatrix )
|
||||||
|
--love.graphics.draw( testMesh )
|
||||||
|
|
||||||
|
math.randomseed( 4 )
|
||||||
|
for i = 1, 15 do
|
||||||
|
local x, y, z = 3 * ( math.random() - 0.5 ), 3 * ( math.random() - 0.5 )
|
||||||
|
testShader:send( "mdl", "column",
|
||||||
|
prod( trans( x, y, -8 ),
|
||||||
|
rotate( 0, time, math.random() )))
|
||||||
love.graphics.draw( testMesh )
|
love.graphics.draw( testMesh )
|
||||||
|
end
|
||||||
|
|
||||||
testShader:send( "mdl", "column", id() )
|
testShader:send( "mdl", "column", id() )
|
||||||
--love.graphics.draw( testQuad )
|
-- love.graphics.draw( testQuad )
|
||||||
|
|
||||||
love.graphics.setShader()
|
love.graphics.setShader()
|
||||||
love.graphics.setColor(1,1,1, 0.5 )
|
love.graphics.setColor(1,1,1, 0.5 )
|
||||||
|
@ -189,7 +215,12 @@ function love.draw()
|
||||||
love.graphics.setDepthMode( "always", true )
|
love.graphics.setDepthMode( "always", true )
|
||||||
love.graphics.pop()
|
love.graphics.pop()
|
||||||
love.graphics.draw( testCanvas )
|
love.graphics.draw( testCanvas )
|
||||||
love.graphics.print( string.format( "%05.2f\t:TIME\n%05.2f\t:ANGLE", time, time ))
|
local str = require( "i18n.en" )
|
||||||
|
love.graphics.print( string.format( "%05.2f\t:TIME\n%05.2f\t:ANGLE\n", time, time))
|
||||||
|
love.graphics.print( { {1, 0.2, 0.2}, str.intro1},
|
||||||
|
creeFont,
|
||||||
|
0.5 * ( love.graphics.getWidth() - creeFont:getWidth(str.intro[1]) ),
|
||||||
|
0.5 * ( love.graphics.getHeight() - creeFont:getHeight() ))
|
||||||
--[[love.graphics.setShader()
|
--[[love.graphics.setShader()
|
||||||
love.graphics.setColor( 1,1,1,1 )
|
love.graphics.setColor( 1,1,1,1 )
|
||||||
love.graphics.circle( "fill", time, time/2, 5 )]]
|
love.graphics.circle( "fill", time, time/2, 5 )]]
|
||||||
|
@ -204,6 +235,5 @@ function love.update( dt )
|
||||||
testModelMatrix = prod(
|
testModelMatrix = prod(
|
||||||
testModelMatrix,
|
testModelMatrix,
|
||||||
rotate( time, time, time )
|
rotate( time, time, time )
|
||||||
|
|
||||||
)
|
)
|
||||||
end
|
end
|
|
@ -0,0 +1,86 @@
|
||||||
|
--column major!
|
||||||
|
local love = assert( love )
|
||||||
|
|
||||||
|
local ffi = require('ffi')
|
||||||
|
local cmat4 = ffi.typeof( [[struct{ float x[4][4]; }]] )
|
||||||
|
|
||||||
|
--this is actually the argument we need to send to shader:send
|
||||||
|
local data = love.data.newByteData( ffi.sizeof( cmat4 ) * 1024 )
|
||||||
|
print( "size", data:getSize() )
|
||||||
|
local t = {}
|
||||||
|
t.__index = t
|
||||||
|
ffi.metatype( cmat4, t )
|
||||||
|
|
||||||
|
function t.__tostring( m )
|
||||||
|
return ([[
|
||||||
|
|%05.2f %05.2f %05.2f %05.2f|
|
||||||
|
|%05.2f %05.2f %05.2f %05.2f|
|
||||||
|
|%05.2f %05.2f %05.2f %05.2f|
|
||||||
|
|%05.2f %05.2f %05.2f %05.2f|]]):format(
|
||||||
|
m.x[0][0], m.x[1][0], m.x[2][0], m.x[3][0],
|
||||||
|
m.x[0][1], m.x[1][1], m.x[2][1], m.x[3][1],
|
||||||
|
m.x[0][2], m.x[1][2], m.x[2][2], m.x[3][2],
|
||||||
|
m.x[0][3], m.x[1][3], m.x[2][3], m.x[3][3])
|
||||||
|
end
|
||||||
|
|
||||||
|
function t.__mul( A, B )
|
||||||
|
local C = ffi.gc(cmat4(),nil)
|
||||||
|
for j = 1, 4 do
|
||||||
|
for i = 1, 4 do
|
||||||
|
C.x[j][i] =
|
||||||
|
A.x[1][i] * B.x[j][1] +
|
||||||
|
A.x[2][i] * B.x[j][2] +
|
||||||
|
A.x[3][i] * B.x[j][3] +
|
||||||
|
A.x[4][i] * B.x[j][4]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return C
|
||||||
|
end
|
||||||
|
|
||||||
|
function t.__add( A, B )
|
||||||
|
local C = cmat4()
|
||||||
|
for i = 1, 4 do
|
||||||
|
for j = 1, 4 do
|
||||||
|
C[i][j] = A.x[i][j] + B.x[i][j]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return C
|
||||||
|
end
|
||||||
|
|
||||||
|
function t:rotate( a, b, g )
|
||||||
|
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 cmat4(
|
||||||
|
ca*cb, sa*cb, -sb, 0,
|
||||||
|
ca*sb*sg - sa*cg, sa*sb*sg + ca*cg, cb*sg, 0,
|
||||||
|
ca*sb*cg + sa*sg, sa*sb*cg - ca*sg, cb*cg, 0,
|
||||||
|
0, 0, 0, 1
|
||||||
|
) * self
|
||||||
|
end
|
||||||
|
|
||||||
|
function t:scale( x, y, z )
|
||||||
|
return cmat4(
|
||||||
|
x, 0, 0, 0,
|
||||||
|
0, y, 0, 0,
|
||||||
|
0, 0, z, 0,
|
||||||
|
0, 0, 0, 1
|
||||||
|
) * self
|
||||||
|
end
|
||||||
|
|
||||||
|
function t:translate( x, y, z )
|
||||||
|
local a = cmat4()
|
||||||
|
a.x[0][0], a.x[1][1], a.x[2][2], a.x[3][3] = 1, 1, 1, 1
|
||||||
|
a.x[3][0], a.x[3][1], a.x[3][2] = x, y, z
|
||||||
|
return a * self
|
||||||
|
end
|
||||||
|
|
||||||
|
do --tests
|
||||||
|
print( cmat4() ); io.flush()
|
||||||
|
local a = ffi.gc(cmat4(), nil)
|
||||||
|
a.x[0][0], a.x[1][1], a.x[2][2],a.x[3][3] = 1,1,1,1
|
||||||
|
print( a ); io.flush()
|
||||||
|
print( a:translate( 1, 2, 3 ) );
|
||||||
|
io.flush()
|
||||||
|
end
|
||||||
|
|
||||||
|
return cmat4
|
Binary file not shown.
After Width: | Height: | Size: 371 KiB |
Loading…
Reference in New Issue