diff options
| author | jussi | 2025-09-09 23:13:55 +0300 |
|---|---|---|
| committer | jussi | 2025-09-09 23:13:55 +0300 |
| commit | 3f27d9037d860dd0c9f1a06d76a60fd0e2142de9 (patch) | |
| tree | 87f76096270cdaf4b73f70807fd374e1cc1025f7 /src/lua_core.c | |
| parent | 3bedd89e1dddda12bbe14040d23cbf7b169ab305 (diff) | |
| download | reilua-enhanced-3f27d9037d860dd0c9f1a06d76a60fd0e2142de9.tar.gz reilua-enhanced-3f27d9037d860dd0c9f1a06d76a60fd0e2142de9.tar.bz2 reilua-enhanced-3f27d9037d860dd0c9f1a06d76a60fd0e2142de9.zip | |
Bit fastes uluaGet* functions for vectors, color, rectangle and quaternion.
Diffstat (limited to 'src/lua_core.c')
| -rw-r--r-- | src/lua_core.c | 382 |
1 files changed, 170 insertions, 212 deletions
diff --git a/src/lua_core.c b/src/lua_core.c index 1a46a5b..ace25f6 100644 --- a/src/lua_core.c +++ b/src/lua_core.c @@ -25,6 +25,12 @@ #include "platforms/core_web.c" #endif +/* Custom implementation since LuaJIT doesn't have lua_geti. */ +static void lua_getiCustom( lua_State* L, int index, int i ) { + lua_pushinteger( L, i ); // Push the index onto the stack + lua_gettable( L, index ); // Get the value at the index +} + /* Define types. */ /* Buffer. */ @@ -2858,47 +2864,39 @@ Color uluaGetColor( lua_State* L, int index ) { luaL_checktype( L, index, LUA_TTABLE ); Color color = { 0, 0, 0, 255 }; - int t = index, i = 0; - lua_pushnil( L ); + /* Assume object is given in named form if gets number. */ + lua_getfield( L, index, "r" ); - while ( lua_next( L, t ) != 0 ) { - if ( lua_isnumber( L, -1 ) ) { - if ( lua_isnumber( L, -2 ) ) { - switch ( i ) { - case 0: - color.r = (uint8_t)lua_tointeger( L, -1 ); - break; - case 1: - color.g = (uint8_t)lua_tointeger( L, -1 ); - break; - case 2: - color.b = (uint8_t)lua_tointeger( L, -1 ); - break; - case 3: - color.a = (uint8_t)lua_tointeger( L, -1 ); - break; - default: - break; - } - } - else if ( lua_isstring( L, -2 ) ) { - if ( TextIsEqual( "r", lua_tostring( L, -2 ) ) ) { - color.r = (uint8_t)lua_tointeger( L, -1 ); - } - else if ( TextIsEqual( "g", lua_tostring( L, -2 ) ) ) { - color.g = (uint8_t)lua_tointeger( L, -1 ); - } - else if ( TextIsEqual( "b", lua_tostring( L, -2 ) ) ) { - color.b = (uint8_t)lua_tointeger( L, -1 ); - } - else if ( TextIsEqual( "a", lua_tostring( L, -2 ) ) ) { - color.a = (uint8_t)lua_tointeger( L, -1 ); - } - } - i++; - lua_pop( L, 1 ); - } + if ( lua_isnumber( L, -1 ) ) { + lua_getfield( L, index, "r" ); + color.r = (uint8_t)lua_tointeger( L, -1 ); + lua_pop( L, 1 ); + lua_getfield( L, index, "g" ); + color.g = (uint8_t)lua_tointeger( L, -1 ); + lua_pop( L, 1 ); + lua_getfield( L, index, "b" ); + color.b = (uint8_t)lua_tointeger( L, -1 ); + lua_pop( L, 1 ); + lua_getfield( L, index, "a" ); + color.a = (uint8_t)lua_tointeger( L, -1 ); + lua_pop( L, 1 ); + } + else { + lua_getiCustom( L, index, 1 ); + color.r = (uint8_t)lua_tointeger( L, -1 ); + lua_pop( L, 1 ); + lua_getiCustom( L, index, 2 ); + color.g = (uint8_t)lua_tointeger( L, -1 ); + lua_pop( L, 1 ); + lua_getiCustom( L, index, 3 ); + color.b = (uint8_t)lua_tointeger( L, -1 ); + lua_pop( L, 1 ); + lua_getiCustom( L, index, 4 ); + color.a = (uint8_t)lua_tointeger( L, -1 ); + lua_pop( L, 1 ); } + lua_pop( L, 1 ); + return color; } @@ -2906,35 +2904,27 @@ Vector2 uluaGetVector2( lua_State* L, int index ) { luaL_checktype( L, index, LUA_TTABLE ); Vector2 vector = { 0.0f, 0.0f }; - int t = index, i = 0; - lua_pushnil( L ); + /* Assume object is given in named form if gets number. */ + lua_getfield( L, index, "x" ); - while ( lua_next( L, t ) != 0 ) { - if ( lua_isnumber( L, -1 ) ) { - if ( lua_isnumber( L, -2 ) ) { - switch ( i ) { - case 0: - vector.x = lua_tonumber( L, -1 ); - break; - case 1: - vector.y = lua_tonumber( L, -1 ); - break; - default: - break; - } - } - else if ( lua_isstring( L, -2 ) ) { - if ( TextIsEqual( "x", lua_tostring( L, -2 ) ) ) { - vector.x = lua_tonumber( L, -1 ); - } - else if ( TextIsEqual( "y", lua_tostring( L, -2 ) ) ) { - vector.y = lua_tonumber( L, -1 ); - } - } - i++; - lua_pop( L, 1 ); - } + if ( lua_isnumber( L, -1 ) ) { + lua_getfield( L, index, "x" ); + vector.x = luaL_checknumber( L, -1 ); + lua_pop( L, 1 ); + lua_getfield( L, index, "y" ); + vector.y = luaL_checknumber( L, -1 ); + lua_pop( L, 1 ); + } + else { + lua_getiCustom( L, index, 1 ); + vector.x = luaL_checknumber( L, -1 ); + lua_pop( L, 1 ); + lua_getiCustom( L, index, 2 ); + vector.y = luaL_checknumber( L, -1 ); + lua_pop( L, 1 ); } + lua_pop( L, 1 ); + return vector; } @@ -2942,41 +2932,33 @@ Vector3 uluaGetVector3( lua_State* L, int index ) { luaL_checktype( L, index, LUA_TTABLE ); Vector3 vector = { 0.0f, 0.0f, 0.0f }; - int t = index, i = 0; - lua_pushnil( L ); + /* Assume object is given in named form if gets number. */ + lua_getfield( L, index, "x" ); - while ( lua_next( L, t ) != 0 ) { - if ( lua_isnumber( L, -1 ) ) { - if ( lua_isnumber( L, -2 ) ) { - switch ( i ) { - case 0: - vector.x = lua_tonumber( L, -1 ); - break; - case 1: - vector.y = lua_tonumber( L, -1 ); - break; - case 2: - vector.z = lua_tonumber( L, -1 ); - break; - default: - break; - } - } - else if ( lua_isstring( L, -2 ) ) { - if ( TextIsEqual( "x", lua_tostring( L, -2 ) ) ) { - vector.x = lua_tonumber( L, -1 ); - } - else if ( TextIsEqual( "y", lua_tostring( L, -2 ) ) ) { - vector.y = lua_tonumber( L, -1 ); - } - else if ( TextIsEqual( "z", lua_tostring( L, -2 ) ) ) { - vector.z = lua_tonumber( L, -1 ); - } - } - } - i++; + if ( lua_isnumber( L, -1 ) ) { + lua_getfield( L, index, "x" ); + vector.x = luaL_checknumber( L, -1 ); + lua_pop( L, 1 ); + lua_getfield( L, index, "y" ); + vector.y = luaL_checknumber( L, -1 ); + lua_pop( L, 1 ); + lua_getfield( L, index, "z" ); + vector.z = luaL_checknumber( L, -1 ); + lua_pop( L, 1 ); + } + else { + lua_getiCustom( L, index, 1 ); + vector.x = luaL_checknumber( L, -1 ); + lua_pop( L, 1 ); + lua_getiCustom( L, index, 2 ); + vector.y = luaL_checknumber( L, -1 ); + lua_pop( L, 1 ); + lua_getiCustom( L, index, 3 ); + vector.z = luaL_checknumber( L, -1 ); lua_pop( L, 1 ); } + lua_pop( L, 1 ); + return vector; } @@ -2984,47 +2966,39 @@ Vector4 uluaGetVector4( lua_State* L, int index ) { luaL_checktype( L, index, LUA_TTABLE ); Vector4 vector = { 0.0f, 0.0f, 0.0f, 0.0f }; - int t = index, i = 0; - lua_pushnil( L ); + /* Assume object is given in named form if gets number. */ + lua_getfield( L, index, "x" ); - while ( lua_next( L, t ) != 0 ) { - if ( lua_isnumber( L, -1 ) ) { - if ( lua_isnumber( L, -2 ) ) { - switch ( i ) { - case 0: - vector.x = lua_tonumber( L, -1 ); - break; - case 1: - vector.y = lua_tonumber( L, -1 ); - break; - case 2: - vector.z = lua_tonumber( L, -1 ); - break; - case 3: - vector.w = lua_tonumber( L, -1 ); - break; - default: - break; - } - } - else if ( lua_isstring( L, -2 ) ) { - if ( TextIsEqual( "x", lua_tostring( L, -2 ) ) ) { - vector.x = lua_tonumber( L, -1 ); - } - else if ( TextIsEqual( "y", lua_tostring( L, -2 ) ) ) { - vector.y = lua_tonumber( L, -1 ); - } - else if ( TextIsEqual( "z", lua_tostring( L, -2 ) ) ) { - vector.z = lua_tonumber( L, -1 ); - } - else if ( TextIsEqual( "w", lua_tostring( L, -2 ) ) ) { - vector.w = lua_tonumber( L, -1 ); - } - } - } - i++; + if ( lua_isnumber( L, -1 ) ) { + lua_getfield( L, index, "x" ); + vector.x = luaL_checknumber( L, -1 ); + lua_pop( L, 1 ); + lua_getfield( L, index, "y" ); + vector.y = luaL_checknumber( L, -1 ); + lua_pop( L, 1 ); + lua_getfield( L, index, "z" ); + vector.z = luaL_checknumber( L, -1 ); + lua_pop( L, 1 ); + lua_getfield( L, index, "w" ); + vector.w = luaL_checknumber( L, -1 ); + lua_pop( L, 1 ); + } + else { + lua_getiCustom( L, index, 1 ); + vector.x = luaL_checknumber( L, -1 ); + lua_pop( L, 1 ); + lua_getiCustom( L, index, 2 ); + vector.y = luaL_checknumber( L, -1 ); + lua_pop( L, 1 ); + lua_getiCustom( L, index, 3 ); + vector.z = luaL_checknumber( L, -1 ); + lua_pop( L, 1 ); + lua_getiCustom( L, index, 4 ); + vector.w = luaL_checknumber( L, -1 ); lua_pop( L, 1 ); } + lua_pop( L, 1 ); + return vector; } @@ -3032,47 +3006,39 @@ Rectangle uluaGetRectangle( lua_State* L, int index ) { luaL_checktype( L, index, LUA_TTABLE ); Rectangle rect = { 0.0f, 0.0f, 0.0f, 0.0f }; - int t = index, i = 0; - lua_pushnil( L ); + /* Assume object is given in named form if gets number. */ + lua_getfield( L, index, "x" ); - while ( lua_next( L, t ) != 0 ) { - if ( lua_isnumber( L, -1 ) ) { - if ( lua_isnumber( L, -2 ) ) { - switch ( i ) { - case 0: - rect.x = lua_tonumber( L, -1 ); - break; - case 1: - rect.y = lua_tonumber( L, -1 ); - break; - case 2: - rect.width = lua_tonumber( L, -1 ); - break; - case 3: - rect.height = lua_tonumber( L, -1 ); - break; - default: - break; - } - } - else if ( lua_isstring( L, -2 ) ) { - if ( TextIsEqual( "x", lua_tostring( L, -2 ) ) ) { - rect.x = lua_tonumber( L, -1 ); - } - else if ( TextIsEqual( "y", lua_tostring( L, -2 ) ) ) { - rect.y = lua_tonumber( L, -1 ); - } - else if ( TextIsEqual( "width", lua_tostring( L, -2 ) ) ) { - rect.width = lua_tonumber( L, -1 ); - } - else if ( TextIsEqual( "height", lua_tostring( L, -2 ) ) ) { - rect.height = lua_tonumber( L, -1 ); - } - } - } - i++; + if ( lua_isnumber( L, -1 ) ) { + lua_getfield( L, index, "x" ); + rect.x = luaL_checknumber( L, -1 ); + lua_pop( L, 1 ); + lua_getfield( L, index, "y" ); + rect.y = luaL_checknumber( L, -1 ); + lua_pop( L, 1 ); + lua_getfield( L, index, "width" ); + rect.width = luaL_checknumber( L, -1 ); + lua_pop( L, 1 ); + lua_getfield( L, index, "height" ); + rect.height = luaL_checknumber( L, -1 ); + lua_pop( L, 1 ); + } + else { + lua_getiCustom( L, index, 1 ); + rect.x = luaL_checknumber( L, -1 ); + lua_pop( L, 1 ); + lua_getiCustom( L, index, 2 ); + rect.y = luaL_checknumber( L, -1 ); + lua_pop( L, 1 ); + lua_getiCustom( L, index, 3 ); + rect.width = luaL_checknumber( L, -1 ); + lua_pop( L, 1 ); + lua_getiCustom( L, index, 4 ); + rect.height = luaL_checknumber( L, -1 ); lua_pop( L, 1 ); } + lua_pop( L, 1 ); + return rect; } @@ -3080,47 +3046,39 @@ Quaternion uluaGetQuaternion( lua_State* L, int index ) { luaL_checktype( L, index, LUA_TTABLE ); Quaternion quaternion = { 0.0f, 0.0f, 0.0f, 0.0f }; - int t = index, i = 0; - lua_pushnil( L ); + /* Assume object is given in named form if gets number. */ + lua_getfield( L, index, "x" ); - while ( lua_next( L, t ) != 0 ) { - if ( lua_isnumber( L, -1 ) ) { - if ( lua_isnumber( L, -2 ) ) { - switch ( i ) { - case 0: - quaternion.x = lua_tonumber( L, -1 ); - break; - case 1: - quaternion.y = lua_tonumber( L, -1 ); - break; - case 2: - quaternion.z = lua_tonumber( L, -1 ); - break; - case 3: - quaternion.w = lua_tonumber( L, -1 ); - break; - default: - break; - } - } - else if ( lua_isstring( L, -2 ) ) { - if ( TextIsEqual( "x", lua_tostring( L, -2 ) ) ) { - quaternion.x = lua_tonumber( L, -1 ); - } - else if ( TextIsEqual( "y", lua_tostring( L, -2 ) ) ) { - quaternion.y = lua_tonumber( L, -1 ); - } - else if ( TextIsEqual( "z", lua_tostring( L, -2 ) ) ) { - quaternion.z = lua_tonumber( L, -1 ); - } - else if ( TextIsEqual( "w", lua_tostring( L, -2 ) ) ) { - quaternion.w = lua_tonumber( L, -1 ); - } - } - } - i++; + if ( lua_isnumber( L, -1 ) ) { + lua_getfield( L, index, "x" ); + quaternion.x = luaL_checknumber( L, -1 ); + lua_pop( L, 1 ); + lua_getfield( L, index, "y" ); + quaternion.y = luaL_checknumber( L, -1 ); + lua_pop( L, 1 ); + lua_getfield( L, index, "z" ); + quaternion.z = luaL_checknumber( L, -1 ); + lua_pop( L, 1 ); + lua_getfield( L, index, "w" ); + quaternion.w = luaL_checknumber( L, -1 ); + lua_pop( L, 1 ); + } + else { + lua_getiCustom( L, index, 1 ); + quaternion.x = luaL_checknumber( L, -1 ); + lua_pop( L, 1 ); + lua_getiCustom( L, index, 2 ); + quaternion.y = luaL_checknumber( L, -1 ); + lua_pop( L, 1 ); + lua_getiCustom( L, index, 3 ); + quaternion.z = luaL_checknumber( L, -1 ); + lua_pop( L, 1 ); + lua_getiCustom( L, index, 4 ); + quaternion.w = luaL_checknumber( L, -1 ); lua_pop( L, 1 ); } + lua_pop( L, 1 ); + return quaternion; } |
