summaryrefslogtreecommitdiff
path: root/src/lua_core.c
diff options
context:
space:
mode:
authorjussi2025-09-09 23:13:55 +0300
committerjussi2025-09-09 23:13:55 +0300
commit3f27d9037d860dd0c9f1a06d76a60fd0e2142de9 (patch)
tree87f76096270cdaf4b73f70807fd374e1cc1025f7 /src/lua_core.c
parent3bedd89e1dddda12bbe14040d23cbf7b169ab305 (diff)
downloadreilua-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.c382
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;
}