mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-28 15:11:55 +00:00
Merge branch 'walllight' into 'next'
Wall lighting See merge request STJr/SRB2!2484
This commit is contained in:
commit
fe3ea24acd
9 changed files with 246 additions and 33 deletions
|
@ -1,5 +1,5 @@
|
||||||
===============================================================================
|
===============================================================================
|
||||||
Universal Doom Map Format Sonic Robo Blast 2 extensions v1.0 19.02.2024
|
Universal Doom Map Format Sonic Robo Blast 2 extensions v1.0 19.06.2024
|
||||||
|
|
||||||
Copyright (c) 2024 Sonic Team Junior
|
Copyright (c) 2024 Sonic Team Junior
|
||||||
uses Universal Doom Map Format Specification v1.1 as a template,
|
uses Universal Doom Map Format Specification v1.1 as a template,
|
||||||
|
@ -143,6 +143,9 @@ Sonic Robo Blast 2 defines the following standardized fields:
|
||||||
offsetx_bottom = <float>; // X offset for lower texture. Default = 0.0.
|
offsetx_bottom = <float>; // X offset for lower texture. Default = 0.0.
|
||||||
offsety_bottom = <float>; // Y offset for lower texture. Default = 0.0.
|
offsety_bottom = <float>; // Y offset for lower texture. Default = 0.0.
|
||||||
|
|
||||||
|
light = <integer>; // Light level, relative to 'sector' light level. Default = 0.
|
||||||
|
lightabsolute = <bool>; // true = 'light' is an absolute value, ignoring 'sector' light level.
|
||||||
|
|
||||||
comment = <string>; // A comment. Implementors should attach no special
|
comment = <string>; // A comment. Implementors should attach no special
|
||||||
// semantic meaning to this field.
|
// semantic meaning to this field.
|
||||||
}
|
}
|
||||||
|
|
|
@ -115,7 +115,7 @@ mapformat_udmf
|
||||||
|
|
||||||
// Enables setting distinct brightness for floor, ceiling, and walls
|
// Enables setting distinct brightness for floor, ceiling, and walls
|
||||||
distinctfloorandceilingbrightness = true;
|
distinctfloorandceilingbrightness = true;
|
||||||
distinctwallbrightness = false;
|
distinctwallbrightness = true;
|
||||||
|
|
||||||
// Enables setting distinct brightness for upper, middle, and lower sidedef parts
|
// Enables setting distinct brightness for upper, middle, and lower sidedef parts
|
||||||
distinctsidedefpartbrightness = false;
|
distinctsidedefpartbrightness = false;
|
||||||
|
|
|
@ -280,18 +280,18 @@ universalfields
|
||||||
default = "";
|
default = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
//light
|
light
|
||||||
//{
|
{
|
||||||
// type = 0;
|
type = 0;
|
||||||
// default = 0;
|
default = 0;
|
||||||
//}
|
}
|
||||||
//
|
|
||||||
//lightabsolute
|
lightabsolute
|
||||||
//{
|
{
|
||||||
// type = 3;
|
type = 3;
|
||||||
// default = false;
|
default = false;
|
||||||
//}
|
}
|
||||||
//
|
|
||||||
//light_top
|
//light_top
|
||||||
//{
|
//{
|
||||||
// type = 0;
|
// type = 0;
|
||||||
|
|
|
@ -309,6 +309,32 @@ static FUINT HWR_CalcSlopeLight(FUINT lightnum, angle_t dir, fixed_t delta)
|
||||||
return (FUINT)finallight;
|
return (FUINT)finallight;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static FUINT HWR_SideLightLevel(side_t *side, UINT8 base_lightlevel)
|
||||||
|
{
|
||||||
|
return side->light +
|
||||||
|
((side->lightabsolute) ? 0 : base_lightlevel);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: implement per-texture lighting
|
||||||
|
static FUINT HWR_TopLightLevel(side_t *side, UINT8 base_lightlevel)
|
||||||
|
{
|
||||||
|
return side->light_top +
|
||||||
|
((side->lightabsolute_top) ? 0 : HWR_SideLightLevel(side, base_lightlevel));
|
||||||
|
}
|
||||||
|
|
||||||
|
static FUINT HWR_MidLightLevel(side_t *side, UINT8 base_lightlevel)
|
||||||
|
{
|
||||||
|
return side->light_mid +
|
||||||
|
((side->lightabsolute_mid) ? 0 : HWR_SideLightLevel(side, base_lightlevel));
|
||||||
|
}
|
||||||
|
|
||||||
|
static FUINT HWR_BottomLightLevel(side_t *side, UINT8 base_lightlevel)
|
||||||
|
{
|
||||||
|
return side->light_bottom +
|
||||||
|
((side->lightabsolute_bottom) ? 0 : HWR_SideLightLevel(side, base_lightlevel));
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
// FLOOR/CEILING GENERATION FROM SUBSECTORS
|
// FLOOR/CEILING GENERATION FROM SUBSECTORS
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
|
@ -705,8 +731,9 @@ static void HWR_SplitWall(sector_t *sector, FOutVector *wallVerts, INT32 texnum,
|
||||||
fixed_t v2x = FloatToFixed(wallVerts[1].x);
|
fixed_t v2x = FloatToFixed(wallVerts[1].x);
|
||||||
fixed_t v2y = FloatToFixed(wallVerts[1].z);
|
fixed_t v2y = FloatToFixed(wallVerts[1].z);
|
||||||
|
|
||||||
|
FUINT lightnum = HWR_SideLightLevel(gl_sidedef, sector->lightlevel);
|
||||||
const UINT8 alpha = Surf->PolyColor.s.alpha;
|
const UINT8 alpha = Surf->PolyColor.s.alpha;
|
||||||
FUINT lightnum = HWR_CalcWallLight(sector->lightlevel, v1x, v1y, v2x, v2y);
|
lightnum = HWR_CalcWallLight(lightnum, v1x, v1y, v2x, v2y);
|
||||||
extracolormap_t *colormap = NULL;
|
extracolormap_t *colormap = NULL;
|
||||||
|
|
||||||
if (!r_renderwalls)
|
if (!r_renderwalls)
|
||||||
|
@ -750,13 +777,13 @@ static void HWR_SplitWall(sector_t *sector, FOutVector *wallVerts, INT32 texnum,
|
||||||
{
|
{
|
||||||
if (pfloor && (pfloor->fofflags & FOF_FOG))
|
if (pfloor && (pfloor->fofflags & FOF_FOG))
|
||||||
{
|
{
|
||||||
lightnum = pfloor->master->frontsector->lightlevel;
|
lightnum = HWR_SideLightLevel(gl_sidedef, pfloor->master->frontsector->lightlevel);
|
||||||
colormap = pfloor->master->frontsector->extra_colormap;
|
colormap = pfloor->master->frontsector->extra_colormap;
|
||||||
lightnum = colormap ? lightnum : HWR_CalcWallLight(lightnum, v1x, v1y, v2x, v2y);
|
lightnum = colormap ? lightnum : HWR_CalcWallLight(lightnum, v1x, v1y, v2x, v2y);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
lightnum = *list[i].lightlevel;
|
lightnum = HWR_SideLightLevel(gl_sidedef, *list[i].lightlevel);
|
||||||
colormap = *list[i].extra_colormap;
|
colormap = *list[i].extra_colormap;
|
||||||
lightnum = colormap ? lightnum : HWR_CalcWallLight(lightnum, v1x, v1y, v2x, v2y);
|
lightnum = colormap ? lightnum : HWR_CalcWallLight(lightnum, v1x, v1y, v2x, v2y);
|
||||||
}
|
}
|
||||||
|
@ -1167,7 +1194,7 @@ static void HWR_ProcessSeg(void)
|
||||||
float cliplow = (float)gl_curline->offset;
|
float cliplow = (float)gl_curline->offset;
|
||||||
float cliphigh = cliplow + (gl_curline->flength * FRACUNIT);
|
float cliphigh = cliplow + (gl_curline->flength * FRACUNIT);
|
||||||
|
|
||||||
FUINT lightnum = gl_frontsector->lightlevel;
|
FUINT lightnum = HWR_SideLightLevel(gl_sidedef, gl_frontsector->lightlevel);
|
||||||
extracolormap_t *colormap = gl_frontsector->extra_colormap;
|
extracolormap_t *colormap = gl_frontsector->extra_colormap;
|
||||||
lightnum = colormap ? lightnum : HWR_CalcWallLight(lightnum, vs.x, vs.y, ve.x, ve.y);
|
lightnum = colormap ? lightnum : HWR_CalcWallLight(lightnum, vs.x, vs.y, ve.x, ve.y);
|
||||||
|
|
||||||
|
@ -1628,11 +1655,11 @@ static void HWR_ProcessSeg(void)
|
||||||
{
|
{
|
||||||
blendmode = PF_Fog|PF_NoTexture;
|
blendmode = PF_Fog|PF_NoTexture;
|
||||||
|
|
||||||
lightnum = rover->master->frontsector->lightlevel;
|
lightnum = HWR_SideLightLevel(gl_sidedef, rover->master->frontsector->lightlevel);
|
||||||
colormap = rover->master->frontsector->extra_colormap;
|
colormap = rover->master->frontsector->extra_colormap;
|
||||||
lightnum = colormap ? lightnum : HWR_CalcWallLight(lightnum, vs.x, vs.y, ve.x, ve.y);
|
lightnum = colormap ? lightnum : HWR_CalcWallLight(lightnum, vs.x, vs.y, ve.x, ve.y);
|
||||||
|
|
||||||
Surf.PolyColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel, rover->master->frontsector->extra_colormap);
|
Surf.PolyColor.s.alpha = HWR_FogBlockAlpha(HWR_SideLightLevel(gl_sidedef, rover->master->frontsector->lightlevel), rover->master->frontsector->extra_colormap);
|
||||||
|
|
||||||
if (gl_frontsector->numlights)
|
if (gl_frontsector->numlights)
|
||||||
HWR_SplitWall(gl_frontsector, wallVerts, 0, &Surf, rover->fofflags, rover, blendmode);
|
HWR_SplitWall(gl_frontsector, wallVerts, 0, &Surf, rover->fofflags, rover, blendmode);
|
||||||
|
@ -1785,7 +1812,7 @@ static void HWR_ProcessSeg(void)
|
||||||
{
|
{
|
||||||
blendmode = PF_Fog|PF_NoTexture;
|
blendmode = PF_Fog|PF_NoTexture;
|
||||||
|
|
||||||
lightnum = rover->master->frontsector->lightlevel;
|
lightnum = HWR_SideLightLevel(gl_sidedef, rover->master->frontsector->lightlevel);
|
||||||
colormap = rover->master->frontsector->extra_colormap;
|
colormap = rover->master->frontsector->extra_colormap;
|
||||||
lightnum = colormap ? lightnum : HWR_CalcWallLight(lightnum, vs.x, vs.y, ve.x, ve.y);
|
lightnum = colormap ? lightnum : HWR_CalcWallLight(lightnum, vs.x, vs.y, ve.x, ve.y);
|
||||||
|
|
||||||
|
|
|
@ -213,6 +213,14 @@ enum side_e {
|
||||||
side_sector,
|
side_sector,
|
||||||
side_special,
|
side_special,
|
||||||
side_repeatcnt,
|
side_repeatcnt,
|
||||||
|
side_light,
|
||||||
|
side_light_top,
|
||||||
|
side_light_mid,
|
||||||
|
side_light_bottom,
|
||||||
|
side_lightabsolute,
|
||||||
|
side_lightabsolute_top,
|
||||||
|
side_lightabsolute_mid,
|
||||||
|
side_lightabsolute_bottom,
|
||||||
side_text
|
side_text
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -241,6 +249,14 @@ static const char *const side_opt[] = {
|
||||||
"sector",
|
"sector",
|
||||||
"special",
|
"special",
|
||||||
"repeatcnt",
|
"repeatcnt",
|
||||||
|
"light",
|
||||||
|
"light_top",
|
||||||
|
"light_mid",
|
||||||
|
"light_bottom",
|
||||||
|
"lightabsolute",
|
||||||
|
"lightabsolute_top",
|
||||||
|
"lightabsolute_mid",
|
||||||
|
"lightabsolute_bottom",
|
||||||
"text",
|
"text",
|
||||||
NULL};
|
NULL};
|
||||||
|
|
||||||
|
@ -1311,6 +1327,30 @@ static int side_get(lua_State *L)
|
||||||
case side_repeatcnt:
|
case side_repeatcnt:
|
||||||
lua_pushinteger(L, side->repeatcnt);
|
lua_pushinteger(L, side->repeatcnt);
|
||||||
return 1;
|
return 1;
|
||||||
|
case side_light:
|
||||||
|
lua_pushinteger(L, side->light);
|
||||||
|
return 1;
|
||||||
|
case side_light_top:
|
||||||
|
lua_pushinteger(L, side->light_top);
|
||||||
|
return 1;
|
||||||
|
case side_light_mid:
|
||||||
|
lua_pushinteger(L, side->light_mid);
|
||||||
|
return 1;
|
||||||
|
case side_light_bottom:
|
||||||
|
lua_pushinteger(L, side->light_bottom);
|
||||||
|
return 1;
|
||||||
|
case side_lightabsolute:
|
||||||
|
lua_pushboolean(L, side->lightabsolute);
|
||||||
|
return 1;
|
||||||
|
case side_lightabsolute_top:
|
||||||
|
lua_pushboolean(L, side->lightabsolute_top);
|
||||||
|
return 1;
|
||||||
|
case side_lightabsolute_mid:
|
||||||
|
lua_pushboolean(L, side->lightabsolute_mid);
|
||||||
|
return 1;
|
||||||
|
case side_lightabsolute_bottom:
|
||||||
|
lua_pushboolean(L, side->lightabsolute_bottom);
|
||||||
|
return 1;
|
||||||
// TODO: 2.3: Delete
|
// TODO: 2.3: Delete
|
||||||
case side_text:
|
case side_text:
|
||||||
{
|
{
|
||||||
|
@ -1413,6 +1453,30 @@ static int side_set(lua_State *L)
|
||||||
case side_repeatcnt:
|
case side_repeatcnt:
|
||||||
side->repeatcnt = luaL_checkinteger(L, 3);
|
side->repeatcnt = luaL_checkinteger(L, 3);
|
||||||
break;
|
break;
|
||||||
|
case side_light:
|
||||||
|
side->light = luaL_checkinteger(L, 3);
|
||||||
|
break;
|
||||||
|
case side_light_top:
|
||||||
|
side->light_top = luaL_checkinteger(L, 3);
|
||||||
|
break;
|
||||||
|
case side_light_mid:
|
||||||
|
side->light_mid = luaL_checkinteger(L, 3);
|
||||||
|
break;
|
||||||
|
case side_light_bottom:
|
||||||
|
side->light_bottom = luaL_checkinteger(L, 3);
|
||||||
|
break;
|
||||||
|
case side_lightabsolute:
|
||||||
|
side->lightabsolute = luaL_checkboolean(L, 3);
|
||||||
|
break;
|
||||||
|
case side_lightabsolute_top:
|
||||||
|
side->lightabsolute_top = luaL_checkboolean(L, 3);
|
||||||
|
break;
|
||||||
|
case side_lightabsolute_mid:
|
||||||
|
side->lightabsolute_mid = luaL_checkboolean(L, 3);
|
||||||
|
break;
|
||||||
|
case side_lightabsolute_bottom:
|
||||||
|
side->lightabsolute_bottom = luaL_checkboolean(L, 3);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -919,7 +919,11 @@ enum
|
||||||
LD_SDMIDLIGHT = 1<<19,
|
LD_SDMIDLIGHT = 1<<19,
|
||||||
LD_SDBOTLIGHT = 1<<20,
|
LD_SDBOTLIGHT = 1<<20,
|
||||||
LD_SDREPEATCNT = 1<<21,
|
LD_SDREPEATCNT = 1<<21,
|
||||||
LD_SDFLAGS = 1<<22
|
LD_SDFLAGS = 1<<22,
|
||||||
|
LD_SDLIGHTABS = 1<<23,
|
||||||
|
LD_SDTOPLIGHTABS = 1<<24,
|
||||||
|
LD_SDMIDLIGHTABS = 1<<25,
|
||||||
|
LD_SDBOTLIGHTABS = 1<<26
|
||||||
};
|
};
|
||||||
|
|
||||||
static boolean P_AreArgsEqual(const line_t *li, const line_t *spawnli)
|
static boolean P_AreArgsEqual(const line_t *li, const line_t *spawnli)
|
||||||
|
@ -1393,6 +1397,22 @@ static UINT32 GetSideDiff(const side_t *si, const side_t *spawnsi)
|
||||||
diff |= LD_SDBOTSCALEY;
|
diff |= LD_SDBOTSCALEY;
|
||||||
if (si->repeatcnt != spawnsi->repeatcnt)
|
if (si->repeatcnt != spawnsi->repeatcnt)
|
||||||
diff |= LD_SDREPEATCNT;
|
diff |= LD_SDREPEATCNT;
|
||||||
|
if (si->light != spawnsi->light)
|
||||||
|
diff |= LD_SDLIGHT;
|
||||||
|
if (si->light_top != spawnsi->light_top)
|
||||||
|
diff |= LD_SDTOPLIGHT;
|
||||||
|
if (si->light_mid != spawnsi->light_mid)
|
||||||
|
diff |= LD_SDMIDLIGHT;
|
||||||
|
if (si->light_bottom != spawnsi->light_bottom)
|
||||||
|
diff |= LD_SDBOTLIGHT;
|
||||||
|
if (si->lightabsolute != spawnsi->lightabsolute)
|
||||||
|
diff |= LD_SDLIGHTABS;
|
||||||
|
if (si->lightabsolute_top != spawnsi->lightabsolute_top)
|
||||||
|
diff |= LD_SDTOPLIGHTABS;
|
||||||
|
if (si->lightabsolute_mid != spawnsi->lightabsolute_mid)
|
||||||
|
diff |= LD_SDMIDLIGHTABS;
|
||||||
|
if (si->lightabsolute_bottom != spawnsi->lightabsolute_bottom)
|
||||||
|
diff |= LD_SDBOTLIGHTABS;
|
||||||
return diff;
|
return diff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1436,6 +1456,22 @@ static void ArchiveSide(const side_t *si, UINT32 diff)
|
||||||
WRITEFIXED(save_p, si->scaley_bottom);
|
WRITEFIXED(save_p, si->scaley_bottom);
|
||||||
if (diff & LD_SDREPEATCNT)
|
if (diff & LD_SDREPEATCNT)
|
||||||
WRITEINT16(save_p, si->repeatcnt);
|
WRITEINT16(save_p, si->repeatcnt);
|
||||||
|
if (diff & LD_SDLIGHT)
|
||||||
|
WRITEINT16(save_p, si->light);
|
||||||
|
if (diff & LD_SDTOPLIGHT)
|
||||||
|
WRITEINT16(save_p, si->light_top);
|
||||||
|
if (diff & LD_SDMIDLIGHT)
|
||||||
|
WRITEINT16(save_p, si->light_mid);
|
||||||
|
if (diff & LD_SDBOTLIGHT)
|
||||||
|
WRITEINT16(save_p, si->light_bottom);
|
||||||
|
if (diff & LD_SDLIGHTABS)
|
||||||
|
WRITEUINT8(save_p, si->lightabsolute);
|
||||||
|
if (diff & LD_SDTOPLIGHTABS)
|
||||||
|
WRITEUINT8(save_p, si->lightabsolute_top);
|
||||||
|
if (diff & LD_SDMIDLIGHTABS)
|
||||||
|
WRITEUINT8(save_p, si->lightabsolute_mid);
|
||||||
|
if (diff & LD_SDBOTLIGHTABS)
|
||||||
|
WRITEUINT8(save_p, si->lightabsolute_bottom);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ArchiveLines(void)
|
static void ArchiveLines(void)
|
||||||
|
@ -1576,6 +1612,22 @@ static void UnArchiveSide(side_t *si)
|
||||||
si->scaley_bottom = READFIXED(save_p);
|
si->scaley_bottom = READFIXED(save_p);
|
||||||
if (diff & LD_SDREPEATCNT)
|
if (diff & LD_SDREPEATCNT)
|
||||||
si->repeatcnt = READINT16(save_p);
|
si->repeatcnt = READINT16(save_p);
|
||||||
|
if (diff & LD_SDLIGHT)
|
||||||
|
si->light = READINT16(save_p);
|
||||||
|
if (diff & LD_SDTOPLIGHT)
|
||||||
|
si->light_top = READINT16(save_p);
|
||||||
|
if (diff & LD_SDMIDLIGHT)
|
||||||
|
si->light_mid = READINT16(save_p);
|
||||||
|
if (diff & LD_SDBOTLIGHT)
|
||||||
|
si->light_bottom = READINT16(save_p);
|
||||||
|
if (diff & LD_SDLIGHTABS)
|
||||||
|
si->lightabsolute = READUINT8(save_p);
|
||||||
|
if (diff & LD_SDTOPLIGHTABS)
|
||||||
|
si->lightabsolute_top = READUINT8(save_p);
|
||||||
|
if (diff & LD_SDMIDLIGHTABS)
|
||||||
|
si->lightabsolute_mid = READUINT8(save_p);
|
||||||
|
if (diff & LD_SDBOTLIGHTABS)
|
||||||
|
si->lightabsolute_bottom = READUINT8(save_p);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void UnArchiveLines(void)
|
static void UnArchiveLines(void)
|
||||||
|
|
|
@ -1367,6 +1367,9 @@ static void P_LoadSidedefs(UINT8 *data)
|
||||||
sd->scalex_top = sd->scalex_mid = sd->scalex_bottom = FRACUNIT;
|
sd->scalex_top = sd->scalex_mid = sd->scalex_bottom = FRACUNIT;
|
||||||
sd->scaley_top = sd->scaley_mid = sd->scaley_bottom = FRACUNIT;
|
sd->scaley_top = sd->scaley_mid = sd->scaley_bottom = FRACUNIT;
|
||||||
|
|
||||||
|
sd->light = sd->light_top = sd->light_mid = sd->light_bottom = 0;
|
||||||
|
sd->lightabsolute = sd->lightabsolute_top = sd->lightabsolute_mid = sd->lightabsolute_bottom = false;
|
||||||
|
|
||||||
P_SetSidedefSector(i, (UINT16)SHORT(msd->sector));
|
P_SetSidedefSector(i, (UINT16)SHORT(msd->sector));
|
||||||
|
|
||||||
// Special info stored in texture fields!
|
// Special info stored in texture fields!
|
||||||
|
@ -1977,6 +1980,22 @@ static void ParseTextmapSidedefParameter(UINT32 i, const char *param, const char
|
||||||
P_SetSidedefSector(i, atol(val));
|
P_SetSidedefSector(i, atol(val));
|
||||||
else if (fastcmp(param, "repeatcnt"))
|
else if (fastcmp(param, "repeatcnt"))
|
||||||
sides[i].repeatcnt = atol(val);
|
sides[i].repeatcnt = atol(val);
|
||||||
|
else if (fastcmp(param, "light"))
|
||||||
|
sides[i].light = atol(val);
|
||||||
|
else if (fastcmp(param, "light_top"))
|
||||||
|
sides[i].light_top = atol(val);
|
||||||
|
else if (fastcmp(param, "light_mid"))
|
||||||
|
sides[i].light_mid = atol(val);
|
||||||
|
else if (fastcmp(param, "light_bottom"))
|
||||||
|
sides[i].light_bottom = atol(val);
|
||||||
|
else if (fastcmp(param, "lightabsolute") && fastcmp("true", val))
|
||||||
|
sides[i].lightabsolute = true;
|
||||||
|
else if (fastcmp(param, "lightabsolute_top") && fastcmp("true", val))
|
||||||
|
sides[i].lightabsolute_top = true;
|
||||||
|
else if (fastcmp(param, "lightabsolute_mid") && fastcmp("true", val))
|
||||||
|
sides[i].lightabsolute_mid = true;
|
||||||
|
else if (fastcmp(param, "lightabsolute_bottom") && fastcmp("true", val))
|
||||||
|
sides[i].lightabsolute_bottom = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ParseTextmapLinedefParameter(UINT32 i, const char *param, const char *val)
|
static void ParseTextmapLinedefParameter(UINT32 i, const char *param, const char *val)
|
||||||
|
@ -2704,6 +2723,22 @@ static void P_WriteTextmap(void)
|
||||||
fprintf(f, "texturemiddle = \"%.*s\";\n", 8, textures[wsides[i].midtexture]->name);
|
fprintf(f, "texturemiddle = \"%.*s\";\n", 8, textures[wsides[i].midtexture]->name);
|
||||||
if (wsides[i].repeatcnt != 0)
|
if (wsides[i].repeatcnt != 0)
|
||||||
fprintf(f, "repeatcnt = %d;\n", wsides[i].repeatcnt);
|
fprintf(f, "repeatcnt = %d;\n", wsides[i].repeatcnt);
|
||||||
|
if (wsides[i].light != 0)
|
||||||
|
fprintf(f, "light = %d;\n", wsides[i].light);
|
||||||
|
if (wsides[i].light_top != 0)
|
||||||
|
fprintf(f, "light_top = %d;\n", wsides[i].light_top);
|
||||||
|
if (wsides[i].light_mid != 0)
|
||||||
|
fprintf(f, "light_mid = %d;\n", wsides[i].light_mid);
|
||||||
|
if (wsides[i].light_bottom != 0)
|
||||||
|
fprintf(f, "light_bottom = %d;\n", wsides[i].light_bottom);
|
||||||
|
if (wsides[i].lightabsolute)
|
||||||
|
fprintf(f, "lightabsolute = true;\n");
|
||||||
|
if (wsides[i].lightabsolute_top)
|
||||||
|
fprintf(f, "lightabsolute_top = true;\n");
|
||||||
|
if (wsides[i].lightabsolute_mid)
|
||||||
|
fprintf(f, "lightabsolute_mid = true;\n");
|
||||||
|
if (wsides[i].lightabsolute_bottom)
|
||||||
|
fprintf(f, "lightabsolute_bottom = true;\n");
|
||||||
fprintf(f, "}\n");
|
fprintf(f, "}\n");
|
||||||
fprintf(f, "\n");
|
fprintf(f, "\n");
|
||||||
}
|
}
|
||||||
|
@ -3106,6 +3141,8 @@ static void P_LoadTextmap(void)
|
||||||
sd->bottomtexture = R_TextureNumForName("-");
|
sd->bottomtexture = R_TextureNumForName("-");
|
||||||
sd->sector = NULL;
|
sd->sector = NULL;
|
||||||
sd->repeatcnt = 0;
|
sd->repeatcnt = 0;
|
||||||
|
sd->light = sd->light_top = sd->light_mid = sd->light_bottom = 0;
|
||||||
|
sd->lightabsolute = sd->lightabsolute_top = sd->lightabsolute_mid = sd->lightabsolute_bottom = false;
|
||||||
|
|
||||||
TextmapParse(sidedefBlocks.pos[i], i, ParseTextmapSidedefParameter);
|
TextmapParse(sidedefBlocks.pos[i], i, ParseTextmapSidedefParameter);
|
||||||
|
|
||||||
|
|
|
@ -633,6 +633,11 @@ typedef struct
|
||||||
fixed_t scalex_top, scalex_mid, scalex_bottom;
|
fixed_t scalex_top, scalex_mid, scalex_bottom;
|
||||||
fixed_t scaley_top, scaley_mid, scaley_bottom;
|
fixed_t scaley_top, scaley_mid, scaley_bottom;
|
||||||
|
|
||||||
|
// per-wall lighting for UDMF
|
||||||
|
// TODO: implement per-texture lighting
|
||||||
|
INT16 light, light_top, light_mid, light_bottom;
|
||||||
|
boolean lightabsolute, lightabsolute_top, lightabsolute_mid, lightabsolute_bottom;
|
||||||
|
|
||||||
// Texture indices.
|
// Texture indices.
|
||||||
// We do not maintain names here.
|
// We do not maintain names here.
|
||||||
INT32 toptexture, bottomtexture, midtexture;
|
INT32 toptexture, bottomtexture, midtexture;
|
||||||
|
|
45
src/r_segs.c
45
src/r_segs.c
|
@ -94,6 +94,32 @@ transnum_t R_GetLinedefTransTable(fixed_t alpha)
|
||||||
return (20*(FRACUNIT - alpha - 1) + FRACUNIT) >> (FRACBITS+1);
|
return (20*(FRACUNIT - alpha - 1) + FRACUNIT) >> (FRACBITS+1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static INT16 R_SideLightLevel(side_t *side, UINT8 base_lightlevel)
|
||||||
|
{
|
||||||
|
return side->light +
|
||||||
|
((side->lightabsolute) ? 0 : base_lightlevel);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: implement per-texture lighting
|
||||||
|
static INT16 R_TopLightLevel(side_t *side, UINT8 base_lightlevel)
|
||||||
|
{
|
||||||
|
return side->light_top +
|
||||||
|
((side->lightabsolute_top) ? 0 : R_SideLightLevel(side, base_lightlevel));
|
||||||
|
}
|
||||||
|
|
||||||
|
static INT16 R_MidLightLevel(side_t *side, UINT8 base_lightlevel)
|
||||||
|
{
|
||||||
|
return side->light_mid +
|
||||||
|
((side->lightabsolute_mid) ? 0 : R_SideLightLevel(side, base_lightlevel));
|
||||||
|
}
|
||||||
|
|
||||||
|
static INT16 R_BottomLightLevel(side_t *side, UINT8 base_lightlevel)
|
||||||
|
{
|
||||||
|
return side->light_bottom +
|
||||||
|
((side->lightabsolute_bottom) ? 0 : R_SideLightLevel(side, base_lightlevel));
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// If we have a multi-patch texture on a 2sided wall (rare) then we draw
|
// If we have a multi-patch texture on a 2sided wall (rare) then we draw
|
||||||
// it using R_DrawColumn, else we draw it using R_DrawMaskedColumn, this
|
// it using R_DrawColumn, else we draw it using R_DrawMaskedColumn, this
|
||||||
// way we don't have to store extra post_t info with each column for
|
// way we don't have to store extra post_t info with each column for
|
||||||
|
@ -324,7 +350,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
||||||
if ((colfunc != colfuncs[COLDRAWFUNC_FUZZY])
|
if ((colfunc != colfuncs[COLDRAWFUNC_FUZZY])
|
||||||
|| (rlight->flags & FOF_FOG)
|
|| (rlight->flags & FOF_FOG)
|
||||||
|| (rlight->extra_colormap && (rlight->extra_colormap->flags & CMF_FOG)))
|
|| (rlight->extra_colormap && (rlight->extra_colormap->flags & CMF_FOG)))
|
||||||
lightnum = (rlight->lightlevel >> LIGHTSEGSHIFT);
|
lightnum = R_SideLightLevel(curline->sidedef, rlight->lightlevel) >> LIGHTSEGSHIFT;
|
||||||
else
|
else
|
||||||
lightnum = LIGHTLEVELS - 1;
|
lightnum = LIGHTLEVELS - 1;
|
||||||
|
|
||||||
|
@ -342,7 +368,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
||||||
{
|
{
|
||||||
if ((colfunc != colfuncs[COLDRAWFUNC_FUZZY])
|
if ((colfunc != colfuncs[COLDRAWFUNC_FUZZY])
|
||||||
|| (frontsector->extra_colormap && (frontsector->extra_colormap->flags & CMF_FOG)))
|
|| (frontsector->extra_colormap && (frontsector->extra_colormap->flags & CMF_FOG)))
|
||||||
lightnum = (frontsector->lightlevel >> LIGHTSEGSHIFT);
|
lightnum = R_SideLightLevel(curline->sidedef, frontsector->lightlevel) >> LIGHTSEGSHIFT;
|
||||||
else
|
else
|
||||||
lightnum = LIGHTLEVELS - 1;
|
lightnum = LIGHTLEVELS - 1;
|
||||||
|
|
||||||
|
@ -798,9 +824,9 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
|
||||||
|
|
||||||
// Check if the current light effects the colormap/lightlevel
|
// Check if the current light effects the colormap/lightlevel
|
||||||
if (pfloor->fofflags & FOF_FOG)
|
if (pfloor->fofflags & FOF_FOG)
|
||||||
rlight->lightnum = (pfloor->master->frontsector->lightlevel >> LIGHTSEGSHIFT);
|
rlight->lightnum = R_SideLightLevel(curline->sidedef, pfloor->master->frontsector->lightlevel) >> LIGHTSEGSHIFT;
|
||||||
else
|
else
|
||||||
rlight->lightnum = (rlight->lightlevel >> LIGHTSEGSHIFT);
|
rlight->lightnum = R_SideLightLevel(curline->sidedef, rlight->lightlevel) >> LIGHTSEGSHIFT;
|
||||||
|
|
||||||
if (pfloor->fofflags & FOF_FOG || rlight->flags & FOF_FOG || (rlight->extra_colormap && (rlight->extra_colormap->flags & CMF_FOG)))
|
if (pfloor->fofflags & FOF_FOG || rlight->flags & FOF_FOG || (rlight->extra_colormap && (rlight->extra_colormap->flags & CMF_FOG)))
|
||||||
;
|
;
|
||||||
|
@ -818,14 +844,13 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
|
||||||
{
|
{
|
||||||
// Get correct light level!
|
// Get correct light level!
|
||||||
if ((frontsector->extra_colormap && (frontsector->extra_colormap->flags & CMF_FOG)))
|
if ((frontsector->extra_colormap && (frontsector->extra_colormap->flags & CMF_FOG)))
|
||||||
lightnum = (frontsector->lightlevel >> LIGHTSEGSHIFT);
|
lightnum = R_SideLightLevel(curline->sidedef, frontsector->lightlevel) >> LIGHTSEGSHIFT;
|
||||||
else if (fog)
|
else if (fog)
|
||||||
lightnum = (pfloor->master->frontsector->lightlevel >> LIGHTSEGSHIFT);
|
lightnum = R_SideLightLevel(curline->sidedef, pfloor->master->frontsector->lightlevel) >> LIGHTSEGSHIFT;
|
||||||
else if (fuzzy)
|
else if (fuzzy)
|
||||||
lightnum = LIGHTLEVELS-1;
|
lightnum = LIGHTLEVELS-1;
|
||||||
else
|
else
|
||||||
lightnum = R_FakeFlat(frontsector, &tempsec, &templight, &templight, false)
|
lightnum = R_SideLightLevel(curline->sidedef, R_FakeFlat(frontsector, &tempsec, &templight, &templight, false)->lightlevel) >> LIGHTSEGSHIFT;
|
||||||
->lightlevel >> LIGHTSEGSHIFT;
|
|
||||||
|
|
||||||
if (pfloor->fofflags & FOF_FOG || (frontsector->extra_colormap && (frontsector->extra_colormap->flags & CMF_FOG)));
|
if (pfloor->fofflags & FOF_FOG || (frontsector->extra_colormap && (frontsector->extra_colormap->flags & CMF_FOG)));
|
||||||
else if (curline->v1->y == curline->v2->y)
|
else if (curline->v1->y == curline->v2->y)
|
||||||
|
@ -1463,7 +1488,7 @@ static void R_RenderSegLoop (void)
|
||||||
for (i = 0; i < dc_numlights; i++)
|
for (i = 0; i < dc_numlights; i++)
|
||||||
{
|
{
|
||||||
INT32 lightnum;
|
INT32 lightnum;
|
||||||
lightnum = (dc_lightlist[i].lightlevel >> LIGHTSEGSHIFT);
|
lightnum = R_SideLightLevel(curline->sidedef, dc_lightlist[i].lightlevel) >> LIGHTSEGSHIFT;
|
||||||
|
|
||||||
if (dc_lightlist[i].extra_colormap)
|
if (dc_lightlist[i].extra_colormap)
|
||||||
;
|
;
|
||||||
|
@ -2650,7 +2675,7 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
||||||
// use different light tables
|
// use different light tables
|
||||||
// for horizontal / vertical / diagonal
|
// for horizontal / vertical / diagonal
|
||||||
// OPTIMIZE: get rid of LIGHTSEGSHIFT globally
|
// OPTIMIZE: get rid of LIGHTSEGSHIFT globally
|
||||||
lightnum = (frontsector->lightlevel >> LIGHTSEGSHIFT);
|
lightnum = R_SideLightLevel(curline->sidedef, frontsector->lightlevel) >> LIGHTSEGSHIFT;
|
||||||
|
|
||||||
if (curline->v1->y == curline->v2->y)
|
if (curline->v1->y == curline->v2->y)
|
||||||
lightnum--;
|
lightnum--;
|
||||||
|
|
Loading…
Reference in a new issue