summaryrefslogtreecommitdiff
path: root/examples/resources/lib/matrix.lua
diff options
context:
space:
mode:
authorjussi2024-11-20 17:10:42 +0200
committerjussi2024-11-20 17:10:42 +0200
commitcf2c2eb05bd5d30169771b0087df84a53124f766 (patch)
tree8549266d3acdaed60e89ad1b49f67a437e9fb26c /examples/resources/lib/matrix.lua
parentcddfc09ccc286726736fa436a10919021a177b69 (diff)
downloadreilua-enhanced-cf2c2eb05bd5d30169771b0087df84a53124f766.tar.gz
reilua-enhanced-cf2c2eb05bd5d30169771b0087df84a53124f766.tar.bz2
reilua-enhanced-cf2c2eb05bd5d30169771b0087df84a53124f766.zip
Type class updates.
Diffstat (limited to 'examples/resources/lib/matrix.lua')
-rw-r--r--examples/resources/lib/matrix.lua74
1 files changed, 50 insertions, 24 deletions
diff --git a/examples/resources/lib/matrix.lua b/examples/resources/lib/matrix.lua
index e94cb10..2ed0ffb 100644
--- a/examples/resources/lib/matrix.lua
+++ b/examples/resources/lib/matrix.lua
@@ -3,31 +3,15 @@ if table.unpack == nil then
table.unpack = unpack
end
-local function copyMatrix( orig )
- local copy = RL.MatrixIdentity()
-
- if orig ~= nil then
- for y = 1, 4 do
- for x = 1, 4 do
- if orig[x][y] ~= nil then
- copy[x][y] = orig[x][y]
- end
- end
- end
- end
-
- return copy
-end
-
local Matrix = {}
local metatable = {
__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"
+ .." {"..m[1][1]..", "..m[1][2]..", "..m[1][3]..", "..m[1][4].."},\n"
+ .." {"..m[2][1]..", "..m[2][2]..", "..m[2][3]..", "..m[2][4].."},\n"
+ .." {"..m[3][1]..", "..m[3][2]..", "..m[3][3]..", "..m[3][4].."},\n"
+ .." {"..m[4][1]..", "..m[4][2]..", "..m[4][3]..", "..m[4][4].."},\n"
.."}"
end,
__add = function( m1, m2 )
@@ -44,22 +28,40 @@ local metatable = {
end,
}
+function Matrix:copyMatrix( orig )
+ if orig ~= nil then
+ for y = 1, 4 do
+ for x = 1, 4 do
+ if orig[x][y] ~= nil then
+ self[x][y] = orig[x][y]
+ end
+ end
+ end
+ end
+end
+
function Matrix:new( m )
local object = setmetatable( {}, metatable )
- object.m = copyMatrix( m )
+ -- Raylib style transposed matrix.
+ for x = 1, 4 do
+ object[x] = {}
+ for y = 1, 4 do
+ table.insert( object[x], m[x][y] )
+ end
+ end
return object
end
function Matrix:set( m )
- self.m = copyMatrix( m )
+ self:copyMatrix( m )
end
function Matrix:serialize()
local str = { "Matrix:new({" }
- for i, row in ipairs( self.m ) do
+ for i, row in ipairs( self ) do
table.insert( str, "{" )
for c, v in ipairs( row ) do
@@ -79,7 +81,7 @@ function Matrix:serialize()
end
function Matrix:clone()
- return Matrix:new( self.m )
+ return Matrix:new( self )
end
function Matrix:determinant()
@@ -154,4 +156,28 @@ function Matrix:lookAt( eye, target, up )
return Matrix:new( RL.MatrixLookAt( eye, target, up ) )
end
+-- Temp pre generated objects to avoid "slow" table generation.
+
+local TEMP_COUNT = 100
+local tempPool = {}
+local curTemp = 1
+
+for _ = 1, TEMP_COUNT do
+ table.insert( tempPool, Matrix:new( RL.MatrixIdentity() ) )
+end
+
+function Matrix:temp( m )
+ local object = tempPool[ curTemp ]
+
+ curTemp = curTemp < TEMP_COUNT and curTemp + 1 or 1
+
+ object:copyMatrix( m )
+
+ return object
+end
+
+function Matrix:getTempId()
+ return curTemp
+end
+
return Matrix