mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-28 07:02:38 +00:00
Merge branch 'lua-colorlib-get-sector-translation' into 'next'
Add v.getSectorColormap and P_GetSectorLightLevelAt See merge request STJr/SRB2!2230
This commit is contained in:
commit
7cabf43e85
8 changed files with 92 additions and 52 deletions
|
@ -214,7 +214,6 @@ static const struct {
|
|||
{META_PATCH, "patch_t"},
|
||||
{META_COLORMAP, "colormap"},
|
||||
{META_EXTRACOLORMAP,"extracolormap_t"},
|
||||
{META_LIGHTTABLE, "lighttable_t"},
|
||||
{META_CAMERA, "camera_t"},
|
||||
|
||||
{META_ACTION, "action"},
|
||||
|
@ -2088,6 +2087,28 @@ static int lib_pCeilingzAtPos(lua_State *L)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static int lib_pGetSectorLightLevelAt(lua_State *L)
|
||||
{
|
||||
boolean has_sector = false;
|
||||
sector_t *sector = NULL;
|
||||
if (!lua_isnoneornil(L, 1))
|
||||
{
|
||||
has_sector = true;
|
||||
sector = *((sector_t **)luaL_checkudata(L, 1, META_SECTOR));
|
||||
}
|
||||
fixed_t x = luaL_checkfixed(L, 2);
|
||||
fixed_t y = luaL_checkfixed(L, 3);
|
||||
fixed_t z = luaL_checkfixed(L, 4);
|
||||
INLEVEL
|
||||
if (has_sector && !sector)
|
||||
return LUA_ErrInvalid(L, "sector_t");
|
||||
if (sector)
|
||||
lua_pushinteger(L, P_GetLightLevelFromSectorAt(sector, x, y, z));
|
||||
else
|
||||
lua_pushinteger(L, P_GetSectorLightLevelAt(x, y, z));
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int lib_pGetSectorColormapAt(lua_State *L)
|
||||
{
|
||||
boolean has_sector = false;
|
||||
|
@ -4397,6 +4418,7 @@ static luaL_Reg lib[] = {
|
|||
{"P_RadiusAttack",lib_pRadiusAttack},
|
||||
{"P_FloorzAtPos",lib_pFloorzAtPos},
|
||||
{"P_CeilingzAtPos",lib_pCeilingzAtPos},
|
||||
{"P_GetSectorLightLevelAt",lib_pGetSectorLightLevelAt},
|
||||
{"P_GetSectorColormapAt",lib_pGetSectorColormapAt},
|
||||
{"P_DoSpring",lib_pDoSpring},
|
||||
{"P_TouchSpecialThing",lib_pTouchSpecialThing},
|
||||
|
|
|
@ -419,8 +419,7 @@ enum extracolormap_e {
|
|||
extracolormap_fade_alpha,
|
||||
extracolormap_fade_color,
|
||||
extracolormap_fade_start,
|
||||
extracolormap_fade_end,
|
||||
extracolormap_colormap
|
||||
extracolormap_fade_end
|
||||
};
|
||||
|
||||
static const char *const extracolormap_opt[] = {
|
||||
|
@ -436,7 +435,6 @@ static const char *const extracolormap_opt[] = {
|
|||
"fade_color",
|
||||
"fade_start",
|
||||
"fade_end",
|
||||
"colormap",
|
||||
NULL};
|
||||
|
||||
static int extracolormap_get(lua_State *L)
|
||||
|
@ -444,6 +442,9 @@ static int extracolormap_get(lua_State *L)
|
|||
extracolormap_t *exc = *((extracolormap_t **)luaL_checkudata(L, 1, META_EXTRACOLORMAP));
|
||||
enum extracolormap_e field = luaL_checkoption(L, 2, NULL, extracolormap_opt);
|
||||
|
||||
if (!exc)
|
||||
return LUA_ErrInvalid(L, "extracolormap_t");
|
||||
|
||||
switch (field)
|
||||
{
|
||||
case extracolormap_red:
|
||||
|
@ -488,9 +489,6 @@ static int extracolormap_get(lua_State *L)
|
|||
case extracolormap_fade_end:
|
||||
lua_pushinteger(L, exc->fadeend);
|
||||
break;
|
||||
case extracolormap_colormap:
|
||||
LUA_PushUserdata(L, exc->colormap, META_LIGHTTABLE);
|
||||
break;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
@ -515,6 +513,9 @@ static int extracolormap_set(lua_State *L)
|
|||
extracolormap_t *exc = *((extracolormap_t **)luaL_checkudata(L, 1, META_EXTRACOLORMAP));
|
||||
enum extracolormap_e field = luaL_checkoption(L, 2, NULL, extracolormap_opt);
|
||||
|
||||
if (!exc)
|
||||
return LUA_ErrInvalid(L, "extracolormap_t");
|
||||
|
||||
UINT8 r = R_GetRgbaR(exc->rgba);
|
||||
UINT8 g = R_GetRgbaG(exc->rgba);
|
||||
UINT8 b = R_GetRgbaB(exc->rgba);
|
||||
|
@ -584,8 +585,6 @@ static int extracolormap_set(lua_State *L)
|
|||
return luaL_error(L, "fade end %d out of range (0 - 31)", val);
|
||||
exc->fadeend = val;
|
||||
break;
|
||||
case extracolormap_colormap:
|
||||
return luaL_error(L, LUA_QL("extracolormap_t") " field " LUA_QS " should not be set directly.", extracolormap_opt[field]);
|
||||
}
|
||||
|
||||
#undef val
|
||||
|
@ -599,46 +598,9 @@ static int extracolormap_set(lua_State *L)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int lighttable_get(lua_State *L)
|
||||
{
|
||||
void **userdata;
|
||||
|
||||
lighttable_t *table = *((lighttable_t **)luaL_checkudata(L, 1, META_LIGHTTABLE));
|
||||
UINT32 row = luaL_checkinteger(L, 2);
|
||||
if (row < 1 || row > 34)
|
||||
return luaL_error(L, "lighttable row %d out of range (1 - %d)", row, 34);
|
||||
|
||||
userdata = lua_newuserdata(L, sizeof(void *));
|
||||
*userdata = &table[256 * (row - 1)];
|
||||
luaL_getmetatable(L, META_COLORMAP);
|
||||
lua_setmetatable(L, -2);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int lighttable_len(lua_State *L)
|
||||
{
|
||||
lua_pushinteger(L, NUM_PALETTE_ENTRIES);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int LUA_ColorLib(lua_State *L)
|
||||
{
|
||||
luaL_newmetatable(L, META_EXTRACOLORMAP);
|
||||
lua_pushcfunction(L, extracolormap_get);
|
||||
lua_setfield(L, -2, "__index");
|
||||
|
||||
lua_pushcfunction(L, extracolormap_set);
|
||||
lua_setfield(L, -2, "__newindex");
|
||||
lua_pop(L, 1);
|
||||
|
||||
luaL_newmetatable(L, META_LIGHTTABLE);
|
||||
lua_pushcfunction(L, lighttable_get);
|
||||
lua_setfield(L, -2, "__index");
|
||||
|
||||
lua_pushcfunction(L, lighttable_len);
|
||||
lua_setfield(L, -2, "__len");
|
||||
lua_pop(L, 1);
|
||||
LUA_RegisterUserdataMetatable(L, META_EXTRACOLORMAP, extracolormap_get, extracolormap_set, NULL);
|
||||
|
||||
luaL_register(L, "color", color_lib);
|
||||
|
||||
|
|
|
@ -1164,6 +1164,45 @@ static int libd_getStringColormap(lua_State *L)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int libd_getSectorColormap(lua_State *L)
|
||||
{
|
||||
boolean has_sector = false;
|
||||
sector_t *sector = NULL;
|
||||
if (!lua_isnoneornil(L, 1))
|
||||
{
|
||||
has_sector = true;
|
||||
sector = *((sector_t **)luaL_checkudata(L, 1, META_SECTOR));
|
||||
}
|
||||
fixed_t x = luaL_checkfixed(L, 2);
|
||||
fixed_t y = luaL_checkfixed(L, 3);
|
||||
fixed_t z = luaL_checkfixed(L, 4);
|
||||
int lightlevel = luaL_optinteger(L, 5, 255);
|
||||
UINT8 *colormap = NULL;
|
||||
extracolormap_t *exc = NULL;
|
||||
|
||||
INLEVEL
|
||||
HUDONLY
|
||||
|
||||
if (has_sector && !sector)
|
||||
return LUA_ErrInvalid(L, "sector_t");
|
||||
|
||||
if (sector)
|
||||
exc = P_GetColormapFromSectorAt(sector, x, y, z);
|
||||
else
|
||||
exc = P_GetSectorColormapAt(x, y, z);
|
||||
|
||||
if (exc)
|
||||
colormap = exc->colormap;
|
||||
else
|
||||
colormap = colormaps;
|
||||
|
||||
lightlevel = 255 - min(max(lightlevel, 0), 255);
|
||||
lightlevel >>= 3;
|
||||
|
||||
LUA_PushUserdata(L, colormap + (lightlevel * 256), META_COLORMAP);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int libd_fadeScreen(lua_State *L)
|
||||
{
|
||||
huddrawlist_h list;
|
||||
|
@ -1310,6 +1349,7 @@ static luaL_Reg lib_draw[] = {
|
|||
{"getSprite2Patch", libd_getSprite2Patch},
|
||||
{"getColormap", libd_getColormap},
|
||||
{"getStringColormap", libd_getStringColormap},
|
||||
{"getSectorColormap", libd_getSectorColormap},
|
||||
// drawing
|
||||
{"draw", libd_draw},
|
||||
{"drawScaled", libd_drawScaled},
|
||||
|
|
|
@ -86,7 +86,6 @@ extern boolean ignoregameinputs;
|
|||
#define META_PATCH "PATCH_T*"
|
||||
#define META_COLORMAP "COLORMAP"
|
||||
#define META_EXTRACOLORMAP "EXTRACOLORMAP_T*"
|
||||
#define META_LIGHTTABLE "LIGHTTABLE_T*"
|
||||
#define META_CAMERA "CAMERA_T*"
|
||||
|
||||
#define META_ACTION "ACTIONF_T*"
|
||||
|
|
|
@ -947,6 +947,8 @@ void LUA_InvalidateLevel(void)
|
|||
LUA_InvalidateUserdata(§ors[i]);
|
||||
LUA_InvalidateUserdata(§ors[i].lines);
|
||||
LUA_InvalidateUserdata(§ors[i].tags);
|
||||
if (sectors[i].extra_colormap)
|
||||
LUA_InvalidateUserdata(sectors[i].extra_colormap);
|
||||
if (sectors[i].ffloors)
|
||||
{
|
||||
for (rover = sectors[i].ffloors; rover; rover = rover->next)
|
||||
|
|
|
@ -446,7 +446,9 @@ boolean PIT_PushableMoved(mobj_t *thing);
|
|||
|
||||
boolean P_DoSpring(mobj_t *spring, mobj_t *object);
|
||||
|
||||
INT32 P_GetSectorLightAt(sector_t *sector, fixed_t x, fixed_t y, fixed_t z);
|
||||
INT32 P_GetSectorLightNumAt(sector_t *sector, fixed_t x, fixed_t y, fixed_t z);
|
||||
INT32 P_GetLightLevelFromSectorAt(sector_t *sector, fixed_t x, fixed_t y, fixed_t z);
|
||||
INT32 P_GetSectorLightLevelAt(fixed_t x, fixed_t y, fixed_t z);
|
||||
extracolormap_t *P_GetColormapFromSectorAt(sector_t *sector, fixed_t x, fixed_t y, fixed_t z);
|
||||
extracolormap_t *P_GetSectorColormapAt(fixed_t x, fixed_t y, fixed_t z);
|
||||
|
||||
|
|
17
src/p_map.c
17
src/p_map.c
|
@ -5079,7 +5079,7 @@ fixed_t P_CeilingzAtPos(fixed_t x, fixed_t y, fixed_t z, fixed_t height)
|
|||
return ceilingz;
|
||||
}
|
||||
|
||||
INT32 P_GetSectorLightAt(sector_t *sector, fixed_t x, fixed_t y, fixed_t z)
|
||||
INT32 P_GetSectorLightNumAt(sector_t *sector, fixed_t x, fixed_t y, fixed_t z)
|
||||
{
|
||||
if (!sector->numlights)
|
||||
return -1;
|
||||
|
@ -5098,10 +5098,23 @@ INT32 P_GetSectorLightAt(sector_t *sector, fixed_t x, fixed_t y, fixed_t z)
|
|||
return light;
|
||||
}
|
||||
|
||||
INT32 P_GetLightLevelFromSectorAt(sector_t *sector, fixed_t x, fixed_t y, fixed_t z)
|
||||
{
|
||||
if (sector->numlights)
|
||||
return *sector->lightlist[P_GetSectorLightNumAt(sector, x, y, z)].lightlevel;
|
||||
else
|
||||
return sector->lightlevel;
|
||||
}
|
||||
|
||||
INT32 P_GetSectorLightLevelAt(fixed_t x, fixed_t y, fixed_t z)
|
||||
{
|
||||
return P_GetLightLevelFromSectorAt(R_PointInSubsector(x, y)->sector, x, y, z);
|
||||
}
|
||||
|
||||
extracolormap_t *P_GetColormapFromSectorAt(sector_t *sector, fixed_t x, fixed_t y, fixed_t z)
|
||||
{
|
||||
if (sector->numlights)
|
||||
return *sector->lightlist[P_GetSectorLightAt(sector, x, y, z)].extra_colormap;
|
||||
return *sector->lightlist[P_GetSectorLightNumAt(sector, x, y, z)].extra_colormap;
|
||||
else
|
||||
return sector->extra_colormap;
|
||||
}
|
||||
|
|
|
@ -2126,7 +2126,7 @@ static void R_ProjectSprite(mobj_t *thing)
|
|||
|
||||
if (thing->subsector->sector->numlights)
|
||||
{
|
||||
light = P_GetSectorLightAt(thing->subsector->sector, interp.x, interp.y, splat ? gz : gzt);
|
||||
light = P_GetSectorLightNumAt(thing->subsector->sector, interp.x, interp.y, splat ? gz : gzt);
|
||||
|
||||
INT32 lightnum = (*thing->subsector->sector->lightlist[light].lightlevel >> LIGHTSEGSHIFT);
|
||||
if (lightnum < 0)
|
||||
|
|
Loading…
Reference in a new issue