lua stuff
This commit is contained in:
parent
ebc22b9df8
commit
26569f494b
|
@ -538,4 +538,7 @@ extern const char *compdate, *comptime, *comprevision, *compbranch;
|
||||||
/// SRB2CB itself ported this from PrBoom+
|
/// SRB2CB itself ported this from PrBoom+
|
||||||
#define NEWCLIP
|
#define NEWCLIP
|
||||||
|
|
||||||
|
/// Cache patches in Lua more safely, so that renderer switching can work.
|
||||||
|
#define LUA_PATCH_SAFETY
|
||||||
|
|
||||||
#endif // __DOOMDEF__
|
#endif // __DOOMDEF__
|
||||||
|
|
|
@ -34,6 +34,11 @@ static UINT8 hud_enabled[(hud_MAX/8)+1];
|
||||||
|
|
||||||
static UINT8 hudAvailable; // hud hooks field
|
static UINT8 hudAvailable; // hud hooks field
|
||||||
|
|
||||||
|
#ifdef LUA_PATCH_SAFETY
|
||||||
|
static patchinfo_t *patchinfo, *patchinfohead;
|
||||||
|
static int numluapatches;
|
||||||
|
#endif
|
||||||
|
|
||||||
// must match enum hud in lua_hud.h
|
// must match enum hud in lua_hud.h
|
||||||
static const char *const hud_disable_options[] = {
|
static const char *const hud_disable_options[] = {
|
||||||
"stagetitle",
|
"stagetitle",
|
||||||
|
@ -231,12 +236,17 @@ static int colormap_get(lua_State *L)
|
||||||
|
|
||||||
static int patch_get(lua_State *L)
|
static int patch_get(lua_State *L)
|
||||||
{
|
{
|
||||||
|
#ifdef LUA_PATCH_SAFETY
|
||||||
patch_t *patch = *((patch_t **)luaL_checkudata(L, 1, META_PATCH));
|
patch_t *patch = *((patch_t **)luaL_checkudata(L, 1, META_PATCH));
|
||||||
|
#else
|
||||||
|
patchinfo_t *patch = *((patchinfo_t **)luaL_checkudata(L, 1, META_PATCH));
|
||||||
|
#endif
|
||||||
enum patch field = luaL_checkoption(L, 2, NULL, patch_opt);
|
enum patch field = luaL_checkoption(L, 2, NULL, patch_opt);
|
||||||
|
|
||||||
// patches are CURRENTLY always valid, expected to be cached with PU_STATIC
|
// patches are CURRENTLY always valid, expected to be cached with PU_STATIC
|
||||||
// this may change in the future, so patch.valid still exists
|
// this may change in the future, so patch.valid still exists
|
||||||
I_Assert(patch != NULL);
|
if (!patch)
|
||||||
|
return LUA_ErrInvalid(L, "patch_t");
|
||||||
|
|
||||||
switch (field)
|
switch (field)
|
||||||
{
|
{
|
||||||
|
@ -333,8 +343,59 @@ static int libd_patchExists(lua_State *L)
|
||||||
|
|
||||||
static int libd_cachePatch(lua_State *L)
|
static int libd_cachePatch(lua_State *L)
|
||||||
{
|
{
|
||||||
|
#ifdef LUA_PATCH_SAFETY
|
||||||
|
int i;
|
||||||
|
lumpnum_t lumpnum;
|
||||||
|
patchinfo_t *luapat;
|
||||||
|
patch_t *realpatch;
|
||||||
|
|
||||||
|
HUDONLY
|
||||||
|
|
||||||
|
luapat = patchinfohead;
|
||||||
|
lumpnum = W_CheckNumForName(luaL_checkstring(L, 1));
|
||||||
|
if (lumpnum == LUMPERROR)
|
||||||
|
lumpnum = W_GetNumForName("MISSING");
|
||||||
|
|
||||||
|
for (i = 0; i < numluapatches; i++)
|
||||||
|
{
|
||||||
|
// check if already cached
|
||||||
|
if (luapat->wadnum == WADFILENUM(lumpnum) && luapat->lumpnum == LUMPNUM(lumpnum))
|
||||||
|
{
|
||||||
|
LUA_PushUserdata(L, luapat, META_PATCH);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
luapat = luapat->next;
|
||||||
|
if (!luapat)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (numluapatches > 0)
|
||||||
|
{
|
||||||
|
patchinfo->next = Z_Malloc(sizeof(patchinfo_t), PU_STATIC, NULL);
|
||||||
|
patchinfo = patchinfo->next;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
patchinfo = Z_Malloc(sizeof(patchinfo_t), PU_STATIC, NULL);
|
||||||
|
patchinfohead = patchinfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
realpatch = W_CachePatchNum(lumpnum, PU_PATCH);
|
||||||
|
|
||||||
|
patchinfo->width = realpatch->width;
|
||||||
|
patchinfo->height = realpatch->height;
|
||||||
|
patchinfo->leftoffset = realpatch->leftoffset;
|
||||||
|
patchinfo->topoffset = realpatch->topoffset;
|
||||||
|
|
||||||
|
patchinfo->wadnum = WADFILENUM(lumpnum);
|
||||||
|
patchinfo->lumpnum = LUMPNUM(lumpnum);
|
||||||
|
|
||||||
|
LUA_PushUserdata(L, patchinfo, META_PATCH);
|
||||||
|
numluapatches++;
|
||||||
|
#else
|
||||||
HUDONLY
|
HUDONLY
|
||||||
LUA_PushUserdata(L, W_CachePatchName(luaL_checkstring(L, 1), PU_PATCH), META_PATCH);
|
LUA_PushUserdata(L, W_CachePatchName(luaL_checkstring(L, 1), PU_PATCH), META_PATCH);
|
||||||
|
#endif
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -342,12 +403,22 @@ static int libd_draw(lua_State *L)
|
||||||
{
|
{
|
||||||
INT32 x, y, flags;
|
INT32 x, y, flags;
|
||||||
patch_t *patch;
|
patch_t *patch;
|
||||||
|
#ifdef LUA_PATCH_SAFETY
|
||||||
|
patchinfo_t *luapat;
|
||||||
|
#endif
|
||||||
const UINT8 *colormap = NULL;
|
const UINT8 *colormap = NULL;
|
||||||
|
|
||||||
HUDONLY
|
HUDONLY
|
||||||
x = luaL_checkinteger(L, 1);
|
x = luaL_checkinteger(L, 1);
|
||||||
y = luaL_checkinteger(L, 2);
|
y = luaL_checkinteger(L, 2);
|
||||||
|
#ifdef LUA_PATCH_SAFETY
|
||||||
|
luapat = *((patchinfo_t **)luaL_checkudata(L, 3, META_PATCH));
|
||||||
|
patch = W_CachePatchNum((luapat->wadnum<<16)+luapat->lumpnum, PU_PATCH);
|
||||||
|
#else
|
||||||
patch = *((patch_t **)luaL_checkudata(L, 3, META_PATCH));
|
patch = *((patch_t **)luaL_checkudata(L, 3, META_PATCH));
|
||||||
|
if (!patch)
|
||||||
|
return LUA_ErrInvalid(L, "patch_t");
|
||||||
|
#endif
|
||||||
flags = luaL_optinteger(L, 4, 0);
|
flags = luaL_optinteger(L, 4, 0);
|
||||||
if (!lua_isnoneornil(L, 5))
|
if (!lua_isnoneornil(L, 5))
|
||||||
colormap = *((UINT8 **)luaL_checkudata(L, 5, META_COLORMAP));
|
colormap = *((UINT8 **)luaL_checkudata(L, 5, META_COLORMAP));
|
||||||
|
@ -363,6 +434,9 @@ static int libd_drawScaled(lua_State *L)
|
||||||
fixed_t x, y, scale;
|
fixed_t x, y, scale;
|
||||||
INT32 flags;
|
INT32 flags;
|
||||||
patch_t *patch;
|
patch_t *patch;
|
||||||
|
#ifdef LUA_PATCH_SAFETY
|
||||||
|
patchinfo_t *luapat;
|
||||||
|
#endif
|
||||||
const UINT8 *colormap = NULL;
|
const UINT8 *colormap = NULL;
|
||||||
|
|
||||||
HUDONLY
|
HUDONLY
|
||||||
|
@ -371,7 +445,14 @@ static int libd_drawScaled(lua_State *L)
|
||||||
scale = luaL_checkinteger(L, 3);
|
scale = luaL_checkinteger(L, 3);
|
||||||
if (scale < 0)
|
if (scale < 0)
|
||||||
return luaL_error(L, "negative scale");
|
return luaL_error(L, "negative scale");
|
||||||
|
#ifdef LUA_PATCH_SAFETY
|
||||||
|
luapat = *((patchinfo_t **)luaL_checkudata(L, 4, META_PATCH));
|
||||||
|
patch = W_CachePatchNum((luapat->wadnum<<16)+luapat->lumpnum, PU_PATCH);
|
||||||
|
#else
|
||||||
patch = *((patch_t **)luaL_checkudata(L, 4, META_PATCH));
|
patch = *((patch_t **)luaL_checkudata(L, 4, META_PATCH));
|
||||||
|
if (!patch)
|
||||||
|
return LUA_ErrInvalid(L, "patch_t");
|
||||||
|
#endif
|
||||||
flags = luaL_optinteger(L, 5, 0);
|
flags = luaL_optinteger(L, 5, 0);
|
||||||
if (!lua_isnoneornil(L, 6))
|
if (!lua_isnoneornil(L, 6))
|
||||||
colormap = *((UINT8 **)luaL_checkudata(L, 6, META_COLORMAP));
|
colormap = *((UINT8 **)luaL_checkudata(L, 6, META_COLORMAP));
|
||||||
|
@ -659,6 +740,10 @@ int LUA_HudLib(lua_State *L)
|
||||||
{
|
{
|
||||||
memset(hud_enabled, 0xff, (hud_MAX/8)+1);
|
memset(hud_enabled, 0xff, (hud_MAX/8)+1);
|
||||||
|
|
||||||
|
#ifdef LUA_PATCH_SAFETY
|
||||||
|
numluapatches = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
lua_newtable(L); // HUD registry table
|
lua_newtable(L); // HUD registry table
|
||||||
lua_newtable(L);
|
lua_newtable(L);
|
||||||
luaL_register(L, NULL, lib_draw);
|
luaL_register(L, NULL, lib_draw);
|
||||||
|
|
18
src/r_defs.h
18
src/r_defs.h
|
@ -726,6 +726,24 @@ typedef struct
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Same as a patch_t, except just the header
|
||||||
|
// and the wadnum/lumpnum combination that points
|
||||||
|
// to wherever the patch is in memory.
|
||||||
|
struct patchinfo_s
|
||||||
|
{
|
||||||
|
INT16 width; // bounding box size
|
||||||
|
INT16 height;
|
||||||
|
INT16 leftoffset; // pixels to the left of origin
|
||||||
|
INT16 topoffset; // pixels below the origin
|
||||||
|
|
||||||
|
UINT16 wadnum; // the software patch lump num for when the patch
|
||||||
|
UINT16 lumpnum; // was flushed, and we need to re-create it
|
||||||
|
|
||||||
|
// next patchinfo_t in memory
|
||||||
|
struct patchinfo_s *next;
|
||||||
|
};
|
||||||
|
typedef struct patchinfo_s patchinfo_t;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Sprites are patches with a special naming convention so they can be
|
// Sprites are patches with a special naming convention so they can be
|
||||||
// recognized by R_InitSprites.
|
// recognized by R_InitSprites.
|
||||||
|
|
Loading…
Reference in a new issue