Bit fastes uluaGet* functions for vectors, color, rectangle and quaternion.

This commit is contained in:
jussi
2025-09-09 23:13:55 +03:00
parent 3bedd89e1d
commit 3f27d9037d
2 changed files with 171 additions and 212 deletions

View File

@@ -59,6 +59,7 @@ DETAILED CHANGES:
- ADDED: AudioStream management functions. - ADDED: AudioStream management functions.
- ADDED: GetSoundStream and GetMusicStream. - ADDED: GetSoundStream and GetMusicStream.
- ADDED: Audio stream effects example. - ADDED: Audio stream effects example.
- CHANGE: Bit fastes uluaGet* functions for vectors, color, rectangle and quaternion.
------------------------------------------------------------------------ ------------------------------------------------------------------------
Release: ReiLua version 0.8.0 Using Raylib 5.0 and Forked Raygui 4.0 Release: ReiLua version 0.8.0 Using Raylib 5.0 and Forked Raygui 4.0

View File

@@ -25,6 +25,12 @@
#include "platforms/core_web.c" #include "platforms/core_web.c"
#endif #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. */ /* Define types. */
/* Buffer. */ /* Buffer. */
@@ -2858,47 +2864,39 @@ Color uluaGetColor( lua_State* L, int index ) {
luaL_checktype( L, index, LUA_TTABLE ); luaL_checktype( L, index, LUA_TTABLE );
Color color = { 0, 0, 0, 255 }; Color color = { 0, 0, 0, 255 };
int t = index, i = 0; /* Assume object is given in named form if gets number. */
lua_pushnil( L ); lua_getfield( L, index, "r" );
while ( lua_next( L, t ) != 0 ) {
if ( lua_isnumber( L, -1 ) ) { if ( lua_isnumber( L, -1 ) ) {
if ( lua_isnumber( L, -2 ) ) { lua_getfield( L, index, "r" );
switch ( i ) {
case 0:
color.r = (uint8_t)lua_tointeger( L, -1 ); color.r = (uint8_t)lua_tointeger( L, -1 );
break; lua_pop( L, 1 );
case 1: lua_getfield( L, index, "g" );
color.g = (uint8_t)lua_tointeger( L, -1 ); color.g = (uint8_t)lua_tointeger( L, -1 );
break; lua_pop( L, 1 );
case 2: lua_getfield( L, index, "b" );
color.b = (uint8_t)lua_tointeger( L, -1 ); color.b = (uint8_t)lua_tointeger( L, -1 );
break; lua_pop( L, 1 );
case 3: lua_getfield( L, index, "a" );
color.a = (uint8_t)lua_tointeger( L, -1 ); 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 ); 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; return color;
} }
@@ -2906,35 +2904,27 @@ Vector2 uluaGetVector2( lua_State* L, int index ) {
luaL_checktype( L, index, LUA_TTABLE ); luaL_checktype( L, index, LUA_TTABLE );
Vector2 vector = { 0.0f, 0.0f }; Vector2 vector = { 0.0f, 0.0f };
int t = index, i = 0; /* Assume object is given in named form if gets number. */
lua_pushnil( L ); lua_getfield( L, index, "x" );
while ( lua_next( L, t ) != 0 ) {
if ( lua_isnumber( L, -1 ) ) { if ( lua_isnumber( L, -1 ) ) {
if ( lua_isnumber( L, -2 ) ) { lua_getfield( L, index, "x" );
switch ( i ) { vector.x = luaL_checknumber( L, -1 );
case 0: lua_pop( L, 1 );
vector.x = lua_tonumber( L, -1 ); lua_getfield( L, index, "y" );
break; vector.y = luaL_checknumber( L, -1 );
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 ); 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; return vector;
} }
@@ -2942,41 +2932,33 @@ Vector3 uluaGetVector3( lua_State* L, int index ) {
luaL_checktype( L, index, LUA_TTABLE ); luaL_checktype( L, index, LUA_TTABLE );
Vector3 vector = { 0.0f, 0.0f, 0.0f }; Vector3 vector = { 0.0f, 0.0f, 0.0f };
int t = index, i = 0; /* Assume object is given in named form if gets number. */
lua_pushnil( L ); lua_getfield( L, index, "x" );
while ( lua_next( L, t ) != 0 ) {
if ( lua_isnumber( L, -1 ) ) { if ( lua_isnumber( L, -1 ) ) {
if ( lua_isnumber( L, -2 ) ) { lua_getfield( L, index, "x" );
switch ( i ) { vector.x = luaL_checknumber( L, -1 );
case 0: lua_pop( L, 1 );
vector.x = lua_tonumber( L, -1 ); lua_getfield( L, index, "y" );
break; vector.y = luaL_checknumber( L, -1 );
case 1: lua_pop( L, 1 );
vector.y = lua_tonumber( L, -1 ); lua_getfield( L, index, "z" );
break; vector.z = luaL_checknumber( L, -1 );
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++;
lua_pop( 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; return vector;
} }
@@ -2984,47 +2966,39 @@ Vector4 uluaGetVector4( lua_State* L, int index ) {
luaL_checktype( L, index, LUA_TTABLE ); luaL_checktype( L, index, LUA_TTABLE );
Vector4 vector = { 0.0f, 0.0f, 0.0f, 0.0f }; Vector4 vector = { 0.0f, 0.0f, 0.0f, 0.0f };
int t = index, i = 0; /* Assume object is given in named form if gets number. */
lua_pushnil( L ); lua_getfield( L, index, "x" );
while ( lua_next( L, t ) != 0 ) {
if ( lua_isnumber( L, -1 ) ) { if ( lua_isnumber( L, -1 ) ) {
if ( lua_isnumber( L, -2 ) ) { lua_getfield( L, index, "x" );
switch ( i ) { vector.x = luaL_checknumber( L, -1 );
case 0: lua_pop( L, 1 );
vector.x = lua_tonumber( L, -1 ); lua_getfield( L, index, "y" );
break; vector.y = luaL_checknumber( L, -1 );
case 1: lua_pop( L, 1 );
vector.y = lua_tonumber( L, -1 ); lua_getfield( L, index, "z" );
break; vector.z = luaL_checknumber( L, -1 );
case 2: lua_pop( L, 1 );
vector.z = lua_tonumber( L, -1 ); lua_getfield( L, index, "w" );
break; vector.w = luaL_checknumber( L, -1 );
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++;
lua_pop( 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; return vector;
} }
@@ -3032,47 +3006,39 @@ Rectangle uluaGetRectangle( lua_State* L, int index ) {
luaL_checktype( L, index, LUA_TTABLE ); luaL_checktype( L, index, LUA_TTABLE );
Rectangle rect = { 0.0f, 0.0f, 0.0f, 0.0f }; Rectangle rect = { 0.0f, 0.0f, 0.0f, 0.0f };
int t = index, i = 0; /* Assume object is given in named form if gets number. */
lua_pushnil( L ); lua_getfield( L, index, "x" );
while ( lua_next( L, t ) != 0 ) {
if ( lua_isnumber( L, -1 ) ) { if ( lua_isnumber( L, -1 ) ) {
if ( lua_isnumber( L, -2 ) ) { lua_getfield( L, index, "x" );
switch ( i ) { rect.x = luaL_checknumber( L, -1 );
case 0: lua_pop( L, 1 );
rect.x = lua_tonumber( L, -1 ); lua_getfield( L, index, "y" );
break; rect.y = luaL_checknumber( L, -1 );
case 1: lua_pop( L, 1 );
rect.y = lua_tonumber( L, -1 ); lua_getfield( L, index, "width" );
break; rect.width = luaL_checknumber( L, -1 );
case 2: lua_pop( L, 1 );
rect.width = lua_tonumber( L, -1 ); lua_getfield( L, index, "height" );
break; rect.height = luaL_checknumber( L, -1 );
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++;
lua_pop( 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; return rect;
} }
@@ -3080,47 +3046,39 @@ Quaternion uluaGetQuaternion( lua_State* L, int index ) {
luaL_checktype( L, index, LUA_TTABLE ); luaL_checktype( L, index, LUA_TTABLE );
Quaternion quaternion = { 0.0f, 0.0f, 0.0f, 0.0f }; Quaternion quaternion = { 0.0f, 0.0f, 0.0f, 0.0f };
int t = index, i = 0; /* Assume object is given in named form if gets number. */
lua_pushnil( L ); lua_getfield( L, index, "x" );
while ( lua_next( L, t ) != 0 ) {
if ( lua_isnumber( L, -1 ) ) { if ( lua_isnumber( L, -1 ) ) {
if ( lua_isnumber( L, -2 ) ) { lua_getfield( L, index, "x" );
switch ( i ) { quaternion.x = luaL_checknumber( L, -1 );
case 0: lua_pop( L, 1 );
quaternion.x = lua_tonumber( L, -1 ); lua_getfield( L, index, "y" );
break; quaternion.y = luaL_checknumber( L, -1 );
case 1: lua_pop( L, 1 );
quaternion.y = lua_tonumber( L, -1 ); lua_getfield( L, index, "z" );
break; quaternion.z = luaL_checknumber( L, -1 );
case 2: lua_pop( L, 1 );
quaternion.z = lua_tonumber( L, -1 ); lua_getfield( L, index, "w" );
break; quaternion.w = luaL_checknumber( L, -1 );
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++;
lua_pop( 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; return quaternion;
} }