diff options
| author | jussi | 2023-11-13 23:42:58 +0200 |
|---|---|---|
| committer | jussi | 2023-11-13 23:42:58 +0200 |
| commit | 7b10306ed5c87517800a6058ad84e27c866f81c6 (patch) | |
| tree | 68b58fed65ed81362a80b34974bfaa8c4345e5c8 /examples/resources | |
| parent | e06d98e0ed820c64df99c451e2c24a481d7349e8 (diff) | |
| download | reilua-enhanced-7b10306ed5c87517800a6058ad84e27c866f81c6.tar.gz reilua-enhanced-7b10306ed5c87517800a6058ad84e27c866f81c6.tar.bz2 reilua-enhanced-7b10306ed5c87517800a6058ad84e27c866f81c6.zip | |
Matrix library.
Diffstat (limited to 'examples/resources')
| -rw-r--r-- | examples/resources/lib/matrix.lua | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/examples/resources/lib/matrix.lua b/examples/resources/lib/matrix.lua new file mode 100644 index 0000000..4b8cee3 --- /dev/null +++ b/examples/resources/lib/matrix.lua @@ -0,0 +1,151 @@ +-- For luaJit compatibility. +if table.unpack == nil then + table.unpack = unpack +end + +local function deepCopy( orig ) + local copy + + if type( orig ) == "table" then + copy = {} + + for origKey, origValue in next, orig, nil do + -- If object has clone method, use that. + copy[ deepCopy( origKey ) ] = deepCopy( origValue ) + end + + -- setmetatable( copy, utillib.deepCopy( getmetatable( orig ) ) ) + else -- number, string, boolean, etc. + copy = orig + end + + return copy +end + +Matrix = {} +Matrix.meta = { + __index = Matrix, + __tostring = function( m ) + return "{\n" + .." { "..m.m[1][1]..", "..m.m[1][2]..", "..m.m[1][3]..", "..m.m[1][4].." },\n" + .." { "..m.m[2][1]..", "..m.m[2][2]..", "..m.m[2][3]..", "..m.m[2][4].." },\n" + .." { "..m.m[3][1]..", "..m.m[3][2]..", "..m.m[3][3]..", "..m.m[3][4].." },\n" + .." { "..m.m[3][1]..", "..m.m[3][2]..", "..m.m[3][3]..", "..m.m[3][4].." },\n" + .."}" + end, + __add = function( m1, m2 ) + return Matrix:new( RL.MatrixAdd( m1, m2 ) ) + end, + __sub = function( m1, m2 ) + return Matrix:new( RL.MatrixSubtract( m1, m2 ) ) + end, + __mul = function( m1, m2 ) + return Matrix:new( RL.MatrixMultiply( m1, m2 ) ) + end +} + +function Matrix:new( m ) + local object = setmetatable( {}, Matrix.meta ) + + if type( m ) == "table" then + object.m = deepCopy( m ) + else + object.m = RL.MatrixIdentity() + end + + return object +end + +function Matrix:set( m ) + if type( m ) == "table" then + self.m = deepCopy( m ) + else + self.m = RL.MatrixIdentity() + end +end + +-- function Matrix:arr() +-- return self.m +-- end + +-- function Matrix:unpack() +-- return self.m +-- end + +function Matrix:clone() + return Matrix:new( self ) +end + +function Matrix:determinant() + return RL.MatrixDeterminant( self ) +end + +function Matrix:trace() + return RL.MatrixTranspose( self ) +end + +function Matrix:transpose() + return Matrix:new( RL.MatrixTranspose( self ) ) +end + +function Matrix:multiply( m2 ) + return Matrix:new( RL.MatrixMultiply( self, m2 ) ) +end + +function Matrix:invert() + return Matrix:new( RL.MatrixInvert( self ) ) +end + +function Matrix:identity() + return Matrix:new( RL.MatrixIdentity() ) +end + +function Matrix:translate( translate ) + return Matrix:new( RL.MatrixTranslate( translate ) ) +end + +function Matrix:rotate( axis, angle ) + return Matrix:new( RL.MatrixRotate( axis, angle ) ) +end + +function Matrix:rotateX( angle ) + return Matrix:new( RL.MatrixRotateX( angle ) ) +end + +function Matrix:rotateY( angle ) + return Matrix:new( RL.MatrixRotateY( angle ) ) +end + +function Matrix:rotateZ( angle ) + return Matrix:new( RL.MatrixRotateZ( angle ) ) +end + +function Matrix:rotateXYZ( angles ) + return Matrix:new( RL.MatrixRotateXYZ( angles ) ) +end + +function Matrix:rotateZYX( angles ) + return Matrix:new( RL.MatrixRotateZYX( angles ) ) +end + +function Matrix:scale( scale ) + return Matrix:new( RL.MatrixScale( scale ) ) +end + +function Matrix:frustrum( left, right, bottom, top, near, far ) + return Matrix:new( RL.MatrixFrustum( left, right, bottom, top, near, far ) ) +end + +function Matrix:perspective( fovy, aspect, near, far ) + return Matrix:new( RL.MatrixPerspective( fovy, aspect, near, far ) ) +end + +function Matrix:ortho( left, right, bottom, top, near, far ) + return Matrix:new( RL.MatrixOrtho( left, right, bottom, top, near, far ) ) +end + +function Matrix:lookAt( eye, target, up ) + return Matrix:new( RL.MatrixLookAt( eye, target, up ) ) +end + +return Matrix |
