mirror of
https://git.do.srb2.org/KartKrew/Kart-Public.git
synced 2024-12-28 13:21:10 +00:00
add vector2 and vector3 userdata types to simplify getting a slope's o/d/normal
This commit is contained in:
parent
7d4e27937d
commit
61fa7026a1
2 changed files with 65 additions and 19 deletions
|
@ -39,6 +39,8 @@ extern lua_State *gL;
|
|||
#define META_SECTOR "SECTOR_T*"
|
||||
#define META_FFLOOR "FFLOOR_T*"
|
||||
#define META_SLOPE "PSLOPE_T*"
|
||||
#define META_VECTOR2 "VECTOR2_T"
|
||||
#define META_VECTOR3 "VECTOR3_T"
|
||||
#define META_MAPHEADER "MAPHEADER_T*"
|
||||
|
||||
#define META_CVAR "CONSVAR_T*"
|
||||
|
|
|
@ -223,6 +223,19 @@ static const char *const slope_opt[] = {
|
|||
"flags",
|
||||
NULL};
|
||||
|
||||
// shared by both vector2_t and vector3_t
|
||||
enum vector_e {
|
||||
vector_x = 0,
|
||||
vector_y,
|
||||
vector_z
|
||||
};
|
||||
|
||||
static const char *const vector_opt[] = {
|
||||
"x",
|
||||
"y",
|
||||
"z",
|
||||
NULL};
|
||||
|
||||
static const char *const array_opt[] ={"iterate",NULL};
|
||||
static const char *const valid_opt[] ={"valid",NULL};
|
||||
|
||||
|
@ -1232,32 +1245,16 @@ static int slope_get(lua_State *L)
|
|||
lua_pushboolean(L, 1);
|
||||
return 1;
|
||||
case slope_o: // o
|
||||
lua_createtable(L, 0, 3);
|
||||
lua_pushfixed(L, slope->o.x);
|
||||
lua_setfield(L, -2, "x");
|
||||
lua_pushfixed(L, slope->o.y);
|
||||
lua_setfield(L, -2, "y");
|
||||
lua_pushfixed(L, slope->o.z);
|
||||
lua_setfield(L, -2, "z");
|
||||
LUA_PushUserdata(L, &slope->o, META_VECTOR3);
|
||||
return 1;
|
||||
case slope_d: // d
|
||||
lua_createtable(L, 0, 2);
|
||||
lua_pushfixed(L, slope->d.x);
|
||||
lua_setfield(L, -2, "x");
|
||||
lua_pushfixed(L, slope->d.y);
|
||||
lua_setfield(L, -2, "y");
|
||||
LUA_PushUserdata(L, &slope->d, META_VECTOR2);
|
||||
return 1;
|
||||
case slope_zdelta: // zdelta
|
||||
lua_pushfixed(L, slope->zdelta);
|
||||
return 1;
|
||||
case slope_normal: // normal
|
||||
lua_createtable(L, 0, 3);
|
||||
lua_pushfixed(L, slope->normal.x);
|
||||
lua_setfield(L, -2, "x");
|
||||
lua_pushfixed(L, slope->normal.y);
|
||||
lua_setfield(L, -2, "y");
|
||||
lua_pushfixed(L, slope->normal.z);
|
||||
lua_setfield(L, -2, "z");
|
||||
LUA_PushUserdata(L, &slope->normal, META_VECTOR3);
|
||||
return 1;
|
||||
case slope_zangle: // zangle
|
||||
lua_pushangle(L, slope->zangle);
|
||||
|
@ -1358,6 +1355,43 @@ static int slope_set(lua_State *L)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int vector2_get(lua_State *L)
|
||||
{
|
||||
vector2_t *vec = *((vector2_t **)luaL_checkudata(L, 1, META_VECTOR2));
|
||||
enum vector_e field = luaL_checkoption(L, 2, vector_opt[0], vector_opt);
|
||||
|
||||
if (!vec)
|
||||
return luaL_error(L, "accessed vector2_t doesn't exist anymore.");
|
||||
|
||||
switch(field)
|
||||
{
|
||||
case vector_x: lua_pushfixed(L, vec->x); return 1;
|
||||
case vector_y: lua_pushfixed(L, vec->y); return 1;
|
||||
default: break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vector3_get(lua_State *L)
|
||||
{
|
||||
vector3_t *vec = *((vector3_t **)luaL_checkudata(L, 1, META_VECTOR3));
|
||||
enum vector_e field = luaL_checkoption(L, 2, vector_opt[0], vector_opt);
|
||||
|
||||
if (!vec)
|
||||
return luaL_error(L, "accessed vector3_t doesn't exist anymore.");
|
||||
|
||||
switch(field)
|
||||
{
|
||||
case vector_x: lua_pushfixed(L, vec->x); return 1;
|
||||
case vector_y: lua_pushfixed(L, vec->y); return 1;
|
||||
case vector_z: lua_pushfixed(L, vec->z); return 1;
|
||||
default: break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lib_getMapheaderinfo(lua_State *L)
|
||||
{
|
||||
// i -> mapheaderinfo[i-1]
|
||||
|
@ -1542,6 +1576,16 @@ int LUA_MapLib(lua_State *L)
|
|||
lua_setfield(L, -2, "__newindex");
|
||||
lua_pop(L, 1);
|
||||
|
||||
luaL_newmetatable(L, META_VECTOR2);
|
||||
lua_pushcfunction(L, vector2_get);
|
||||
lua_setfield(L, -2, "__index");
|
||||
lua_pop(L, 1);
|
||||
|
||||
luaL_newmetatable(L, META_VECTOR3);
|
||||
lua_pushcfunction(L, vector3_get);
|
||||
lua_setfield(L, -2, "__index");
|
||||
lua_pop(L, 1);
|
||||
|
||||
luaL_newmetatable(L, META_MAPHEADER);
|
||||
lua_pushcfunction(L, mapheaderinfo_get);
|
||||
lua_setfield(L, -2, "__index");
|
||||
|
|
Loading…
Reference in a new issue