diff options
| author | jussi | 2023-11-15 22:04:45 +0200 |
|---|---|---|
| committer | jussi | 2023-11-15 22:04:45 +0200 |
| commit | 118a1f3a8bc468077fdd8bac4d46c452965ce283 (patch) | |
| tree | 8300bff23e1b6f7f8d0f47a59def8fec761a4f66 /examples/resources | |
| parent | 841aa897f1868075134162cc71593ac9c3473115 (diff) | |
| download | reilua-enhanced-118a1f3a8bc468077fdd8bac4d46c452965ce283.tar.gz reilua-enhanced-118a1f3a8bc468077fdd8bac4d46c452965ce283.tar.bz2 reilua-enhanced-118a1f3a8bc468077fdd8bac4d46c452965ce283.zip | |
Quaternion library.
Diffstat (limited to 'examples/resources')
| -rw-r--r-- | examples/resources/lib/color.lua | 2 | ||||
| -rw-r--r-- | examples/resources/lib/matrix.lua | 8 | ||||
| -rw-r--r-- | examples/resources/lib/quaternion.lua | 153 |
3 files changed, 159 insertions, 4 deletions
diff --git a/examples/resources/lib/color.lua b/examples/resources/lib/color.lua index 5f868b6..8948ac7 100644 --- a/examples/resources/lib/color.lua +++ b/examples/resources/lib/color.lua @@ -3,6 +3,8 @@ if table.unpack == nil then table.unpack = unpack end +local Vector3 = require( "vector3" ) + Color = {} Color.meta = { __index = Color, diff --git a/examples/resources/lib/matrix.lua b/examples/resources/lib/matrix.lua index 4b8cee3..e825102 100644 --- a/examples/resources/lib/matrix.lua +++ b/examples/resources/lib/matrix.lua @@ -27,10 +27,10 @@ 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" + .." {"..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 ) diff --git a/examples/resources/lib/quaternion.lua b/examples/resources/lib/quaternion.lua new file mode 100644 index 0000000..4c42265 --- /dev/null +++ b/examples/resources/lib/quaternion.lua @@ -0,0 +1,153 @@ +-- For luaJit compatibility. +if table.unpack == nil then + table.unpack = unpack +end + +local Vector3 = require( "vector3" ) +local Matrix = require( "matrix" ) + +Quaternion = {} +Quaternion.meta = { + __index = Quaternion, + __tostring = function( q ) + return "{"..tostring( q.x )..", "..tostring( q.y )..", "..tostring( q.z )..", "..tostring( q.w ).."}" + end, + __add = function( q1, q2 ) + return Quaternion:new( RL.QuaternionAdd( q1, q2 ) ) + end, + __sub = function( q1, q2 ) + return Quaternion:new( RL.QuaternionSubtract( q1, q2 ) ) + end, + __mul = function( q1, q2 ) + return Quaternion:new( RL.QuaternionMultiply( q1, q2 ) ) + end, + __div = function( q1, q2 ) + return Quaternion:new( RL.QuaternionDivide( q1, q2 ) ) + end, + __unm = function( q ) + return Quaternion:new( RL.QuaternionInvert( q ) ) + end, + __len = function( _ ) + return 4 + end, + __eq = function( q1, q2 ) + return RL.QuaternionEquals( q1, q2 ) == 1 + end, +} + +function Quaternion:new( x, y, z, w ) + if type( x ) == "table" then + x, y, z, w = table.unpack( x ) + elseif type( x ) == "nil" then + x, y, z, w = 0, 0, 0, 1 -- QuaternionIdentity. + end + + local object = setmetatable( {}, Quaternion.meta ) + + object.x = x + object.y = y + object.z = z + object.w = w + + return object +end + +function Quaternion:set( x, y, z, w ) + if type( x ) == "table" then + x, y, z, w = table.unpack( x ) + elseif type( x ) == "nil" then + x, y, z, w = 0, 0, 0, 1 -- QuaternionIdentity. + end + + self.x = x + self.y = y + self.z = z + self.w = w +end + +function Quaternion:arr() + return { self.x, self.y, self.z, self.w } +end + +function Quaternion:unpack() + return self.x, self.y, self.z, self.w +end + +function Quaternion:clone() + return Quaternion:new( self.x, self.y, self.z, self.w ) +end + +function Quaternion:addValue( value ) + return Quaternion:new( RL.QuaternionAddValue( self, value ) ) +end + +function Quaternion:subValue( value ) + return Quaternion:new( RL.QuaternionSubtractValue( self, value ) ) +end + +function Quaternion:identity() + return Quaternion:new( RL.QuaternionIdentity() ) +end + +function Quaternion:length() + return RL.QuaternionLength( self ) +end + +function Quaternion:normalize() + return Quaternion:new( RL.QuaternionNormalize( self ) ) +end + +function Quaternion:invert() + return Quaternion:new( RL.QuaternionInvert( self ) ) +end + +function Quaternion:scale( scalar ) + return Quaternion:new( RL.QuaternionScale( self, scalar ) ) +end + +function Quaternion:lerp( q2, value ) + return Quaternion:new( RL.QuaternionLerp( self, q2, value ) ) +end + +function Quaternion:nLerp( q2, value ) + return Quaternion:new( RL.QuaternionNLerp( self, q2, value ) ) +end + +function Quaternion:sLerp( q2, value ) + return Quaternion:new( RL.QuaternionSLerp( self, q2, value ) ) +end + +function Quaternion:fromVector3ToVector3( from, to ) + return Vector3:new( RL.QuaternionFromVector3ToVector3( from, to ) ) +end + +function Quaternion:fromMatrix( mat ) + return Quaternion:new( RL.QuaternionFromMatrix( mat ) ) +end + +function Quaternion:toMatrix() + return Matrix:new( RL.QuaternionToMatrix( self ) ) +end + +function Quaternion:fromAxisAngle( axis, angle ) + return Quaternion:new( RL.QuaternionFromAxisAngle( axis, angle ) ) +end + +function Quaternion:toAxisAngle() + local axis, angle = Quaternion:new( RL.QuaternionToAxisAngle( self ) ) + return Vector3:new( axis ), angle +end + +function Quaternion:fromEuler( pitch, yaw, roll ) + return Quaternion:new( RL.QuaternionFromEuler( pitch, yaw, roll ) ) +end + +function Quaternion:toEuler() + return Vector3:new( RL.QuaternionToEuler( self ) ) +end + +function Quaternion:transform( mat ) + return Quaternion:new( RL.QuaternionTransform( self, mat ) ) +end + +return Quaternion |
