mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-22 04:21:23 +00:00
Merge branch 'topbotlight' into 'next'
Support floor/ceiling light level on FOF planes Closes #388 See merge request STJr/SRB2!2490
This commit is contained in:
commit
86a1f40251
3 changed files with 47 additions and 23 deletions
|
@ -335,6 +335,17 @@ static FUINT HWR_BottomLightLevel(side_t *side, UINT8 base_lightlevel)
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
static UINT8 HWR_FloorLightLevel(sector_t *sector, UINT8 base_lightlevel)
|
||||||
|
{
|
||||||
|
return max(0, min(255, sector->floorlightlevel +
|
||||||
|
((sector->floorlightabsolute) ? 0 : base_lightlevel)));
|
||||||
|
}
|
||||||
|
|
||||||
|
static UINT8 HWR_CeilingLightLevel(sector_t *sector, UINT8 base_lightlevel)
|
||||||
|
{
|
||||||
|
return max(0, min(255, sector->ceilinglightlevel +
|
||||||
|
((sector->ceilinglightabsolute) ? 0 : base_lightlevel)));
|
||||||
|
}
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
// FLOOR/CEILING GENERATION FROM SUBSECTORS
|
// FLOOR/CEILING GENERATION FROM SUBSECTORS
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
|
@ -2498,13 +2509,13 @@ static void HWR_Subsector(size_t num)
|
||||||
UINT8 alpha;
|
UINT8 alpha;
|
||||||
|
|
||||||
light = R_GetPlaneLight(gl_frontsector, centerHeight, viewz < bottomCullHeight ? true : false);
|
light = R_GetPlaneLight(gl_frontsector, centerHeight, viewz < bottomCullHeight ? true : false);
|
||||||
alpha = HWR_FogBlockAlpha(*gl_frontsector->lightlist[light].lightlevel, rover->master->frontsector->extra_colormap);
|
alpha = HWR_FogBlockAlpha(HWR_FloorLightLevel(rover->master->frontsector, *gl_frontsector->lightlist[light].lightlevel), rover->master->frontsector->extra_colormap);
|
||||||
|
|
||||||
HWR_AddTransparentFloor(0,
|
HWR_AddTransparentFloor(0,
|
||||||
&extrasubsectors[num],
|
&extrasubsectors[num],
|
||||||
false,
|
false,
|
||||||
*rover->bottomheight,
|
*rover->bottomheight,
|
||||||
*gl_frontsector->lightlist[light].lightlevel,
|
HWR_FloorLightLevel(rover->master->frontsector, *gl_frontsector->lightlist[light].lightlevel),
|
||||||
alpha, rover->master->frontsector, PF_Fog|PF_NoTexture,
|
alpha, rover->master->frontsector, PF_Fog|PF_NoTexture,
|
||||||
true, false, rover->master->frontsector->extra_colormap);
|
true, false, rover->master->frontsector->extra_colormap);
|
||||||
}
|
}
|
||||||
|
@ -2516,7 +2527,7 @@ static void HWR_Subsector(size_t num)
|
||||||
&extrasubsectors[num],
|
&extrasubsectors[num],
|
||||||
false,
|
false,
|
||||||
*rover->bottomheight,
|
*rover->bottomheight,
|
||||||
*gl_frontsector->lightlist[light].lightlevel,
|
HWR_FloorLightLevel(rover->master->frontsector, *gl_frontsector->lightlist[light].lightlevel),
|
||||||
max(0, min(rover->alpha, 255)), rover->master->frontsector,
|
max(0, min(rover->alpha, 255)), rover->master->frontsector,
|
||||||
HWR_RippleBlend(gl_frontsector, rover, false) | (rover->blend ? HWR_GetBlendModeFlag(rover->blend) : PF_Translucent),
|
HWR_RippleBlend(gl_frontsector, rover, false) | (rover->blend ? HWR_GetBlendModeFlag(rover->blend) : PF_Translucent),
|
||||||
false, rover->fofflags & FOF_SPLAT, *gl_frontsector->lightlist[light].extra_colormap);
|
false, rover->fofflags & FOF_SPLAT, *gl_frontsector->lightlist[light].extra_colormap);
|
||||||
|
@ -2525,8 +2536,9 @@ static void HWR_Subsector(size_t num)
|
||||||
{
|
{
|
||||||
HWR_GetLevelFlat(&levelflats[*rover->bottompic], rover->fofflags & FOF_SPLAT);
|
HWR_GetLevelFlat(&levelflats[*rover->bottompic], rover->fofflags & FOF_SPLAT);
|
||||||
light = R_GetPlaneLight(gl_frontsector, centerHeight, viewz < bottomCullHeight ? true : false);
|
light = R_GetPlaneLight(gl_frontsector, centerHeight, viewz < bottomCullHeight ? true : false);
|
||||||
HWR_RenderPlane(sub, &extrasubsectors[num], false, *rover->bottomheight, HWR_RippleBlend(gl_frontsector, rover, false)|PF_Occlude, *gl_frontsector->lightlist[light].lightlevel, &levelflats[*rover->bottompic],
|
HWR_RenderPlane(sub, &extrasubsectors[num], false, *rover->bottomheight, HWR_RippleBlend(gl_frontsector, rover, false)|PF_Occlude,
|
||||||
rover->master->frontsector, 255, *gl_frontsector->lightlist[light].extra_colormap);
|
HWR_FloorLightLevel(rover->master->frontsector, *gl_frontsector->lightlist[light].lightlevel),
|
||||||
|
&levelflats[*rover->bottompic], rover->master->frontsector, 255, *gl_frontsector->lightlist[light].extra_colormap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2543,13 +2555,13 @@ static void HWR_Subsector(size_t num)
|
||||||
UINT8 alpha;
|
UINT8 alpha;
|
||||||
|
|
||||||
light = R_GetPlaneLight(gl_frontsector, centerHeight, viewz < topCullHeight ? true : false);
|
light = R_GetPlaneLight(gl_frontsector, centerHeight, viewz < topCullHeight ? true : false);
|
||||||
alpha = HWR_FogBlockAlpha(*gl_frontsector->lightlist[light].lightlevel, rover->master->frontsector->extra_colormap);
|
alpha = HWR_FogBlockAlpha(HWR_CeilingLightLevel(rover->master->frontsector, *gl_frontsector->lightlist[light].lightlevel), rover->master->frontsector->extra_colormap);
|
||||||
|
|
||||||
HWR_AddTransparentFloor(0,
|
HWR_AddTransparentFloor(0,
|
||||||
&extrasubsectors[num],
|
&extrasubsectors[num],
|
||||||
true,
|
true,
|
||||||
*rover->topheight,
|
*rover->topheight,
|
||||||
*gl_frontsector->lightlist[light].lightlevel,
|
HWR_CeilingLightLevel(rover->master->frontsector, *gl_frontsector->lightlist[light].lightlevel),
|
||||||
alpha, rover->master->frontsector, PF_Fog|PF_NoTexture,
|
alpha, rover->master->frontsector, PF_Fog|PF_NoTexture,
|
||||||
true, false, rover->master->frontsector->extra_colormap);
|
true, false, rover->master->frontsector->extra_colormap);
|
||||||
}
|
}
|
||||||
|
@ -2561,7 +2573,7 @@ static void HWR_Subsector(size_t num)
|
||||||
&extrasubsectors[num],
|
&extrasubsectors[num],
|
||||||
true,
|
true,
|
||||||
*rover->topheight,
|
*rover->topheight,
|
||||||
*gl_frontsector->lightlist[light].lightlevel,
|
HWR_CeilingLightLevel(rover->master->frontsector, *gl_frontsector->lightlist[light].lightlevel),
|
||||||
max(0, min(rover->alpha, 255)), rover->master->frontsector,
|
max(0, min(rover->alpha, 255)), rover->master->frontsector,
|
||||||
HWR_RippleBlend(gl_frontsector, rover, false) | (rover->blend ? HWR_GetBlendModeFlag(rover->blend) : PF_Translucent),
|
HWR_RippleBlend(gl_frontsector, rover, false) | (rover->blend ? HWR_GetBlendModeFlag(rover->blend) : PF_Translucent),
|
||||||
false, rover->fofflags & FOF_SPLAT, *gl_frontsector->lightlist[light].extra_colormap);
|
false, rover->fofflags & FOF_SPLAT, *gl_frontsector->lightlist[light].extra_colormap);
|
||||||
|
@ -2570,8 +2582,9 @@ static void HWR_Subsector(size_t num)
|
||||||
{
|
{
|
||||||
HWR_GetLevelFlat(&levelflats[*rover->toppic], rover->fofflags & FOF_SPLAT);
|
HWR_GetLevelFlat(&levelflats[*rover->toppic], rover->fofflags & FOF_SPLAT);
|
||||||
light = R_GetPlaneLight(gl_frontsector, centerHeight, viewz < topCullHeight ? true : false);
|
light = R_GetPlaneLight(gl_frontsector, centerHeight, viewz < topCullHeight ? true : false);
|
||||||
HWR_RenderPlane(sub, &extrasubsectors[num], true, *rover->topheight, HWR_RippleBlend(gl_frontsector, rover, false)|PF_Occlude, *gl_frontsector->lightlist[light].lightlevel, &levelflats[*rover->toppic],
|
HWR_RenderPlane(sub, &extrasubsectors[num], true, *rover->topheight, HWR_RippleBlend(gl_frontsector, rover, false)|PF_Occlude,
|
||||||
rover->master->frontsector, 255, *gl_frontsector->lightlist[light].extra_colormap);
|
HWR_CeilingLightLevel(rover->master->frontsector, *gl_frontsector->lightlist[light].lightlevel),
|
||||||
|
&levelflats[*rover->toppic], rover->master->frontsector, 255, *gl_frontsector->lightlist[light].extra_colormap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3933,7 +3946,7 @@ void HWR_AddTransparentFloor(levelflat_t *levelflat, extrasubsector_t *xsub, boo
|
||||||
|
|
||||||
planeinfo[numplanes].isceiling = isceiling;
|
planeinfo[numplanes].isceiling = isceiling;
|
||||||
planeinfo[numplanes].fixedheight = fixedheight;
|
planeinfo[numplanes].fixedheight = fixedheight;
|
||||||
planeinfo[numplanes].lightlevel = (planecolormap && (planecolormap->flags & CMF_FOG)) ? 255 : lightlevel;
|
planeinfo[numplanes].lightlevel = (planecolormap && (planecolormap->flags & CMF_FOG)) ? lightlevel : 255; // TODO: 2.3: Make transparent FOF planes always use light level
|
||||||
planeinfo[numplanes].levelflat = levelflat;
|
planeinfo[numplanes].levelflat = levelflat;
|
||||||
planeinfo[numplanes].xsub = xsub;
|
planeinfo[numplanes].xsub = xsub;
|
||||||
planeinfo[numplanes].alpha = alpha;
|
planeinfo[numplanes].alpha = alpha;
|
||||||
|
@ -3965,7 +3978,7 @@ void HWR_AddTransparentPolyobjectFloor(levelflat_t *levelflat, polyobj_t *polyse
|
||||||
|
|
||||||
polyplaneinfo[numpolyplanes].isceiling = isceiling;
|
polyplaneinfo[numpolyplanes].isceiling = isceiling;
|
||||||
polyplaneinfo[numpolyplanes].fixedheight = fixedheight;
|
polyplaneinfo[numpolyplanes].fixedheight = fixedheight;
|
||||||
polyplaneinfo[numpolyplanes].lightlevel = (planecolormap && (planecolormap->flags & CMF_FOG)) ? 255 : lightlevel;
|
polyplaneinfo[numpolyplanes].lightlevel = (planecolormap && (planecolormap->flags & CMF_FOG)) ? lightlevel : 255; // TODO: 2.3: Make transparent polyobject planes always use light level
|
||||||
polyplaneinfo[numpolyplanes].levelflat = levelflat;
|
polyplaneinfo[numpolyplanes].levelflat = levelflat;
|
||||||
polyplaneinfo[numpolyplanes].polysector = polysector;
|
polyplaneinfo[numpolyplanes].polysector = polysector;
|
||||||
polyplaneinfo[numpolyplanes].alpha = alpha;
|
polyplaneinfo[numpolyplanes].alpha = alpha;
|
||||||
|
|
19
src/r_bsp.c
19
src/r_bsp.c
|
@ -230,6 +230,18 @@ static INT32 R_DoorClosed(void)
|
||||||
&& (backsector->floorheight <= frontsector->floorheight || curline->sidedef->bottomtexture);
|
&& (backsector->floorheight <= frontsector->floorheight || curline->sidedef->bottomtexture);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static UINT8 R_FloorLightLevel(sector_t *sector, UINT8 base_lightlevel)
|
||||||
|
{
|
||||||
|
return max(0, min(255, sector->floorlightlevel +
|
||||||
|
((sector->floorlightabsolute) ? 0 : base_lightlevel)));
|
||||||
|
}
|
||||||
|
|
||||||
|
static UINT8 R_CeilingLightLevel(sector_t *sector, UINT8 base_lightlevel)
|
||||||
|
{
|
||||||
|
return max(0, min(255, sector->ceilinglightlevel +
|
||||||
|
((sector->ceilinglightabsolute) ? 0 : base_lightlevel)));
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// If player's view height is underneath fake floor, lower the
|
// If player's view height is underneath fake floor, lower the
|
||||||
// drawn ceiling to be just under the floor height, and replace
|
// drawn ceiling to be just under the floor height, and replace
|
||||||
|
@ -968,11 +980,10 @@ static void R_Subsector(size_t num)
|
||||||
&& ((viewz < heightcheck && (rover->fofflags & FOF_BOTHPLANES || !(rover->fofflags & FOF_INVERTPLANES)))
|
&& ((viewz < heightcheck && (rover->fofflags & FOF_BOTHPLANES || !(rover->fofflags & FOF_INVERTPLANES)))
|
||||||
|| (viewz > heightcheck && (rover->fofflags & FOF_BOTHPLANES || rover->fofflags & FOF_INVERTPLANES))))
|
|| (viewz > heightcheck && (rover->fofflags & FOF_BOTHPLANES || rover->fofflags & FOF_INVERTPLANES))))
|
||||||
{
|
{
|
||||||
light = R_GetPlaneLight(frontsector, planecenterz,
|
light = R_GetPlaneLight(frontsector, planecenterz, viewz < heightcheck);
|
||||||
viewz < heightcheck);
|
|
||||||
|
|
||||||
ffloor[numffloors].plane = R_FindPlane(rover->master->frontsector, *rover->bottomheight, *rover->bottompic,
|
ffloor[numffloors].plane = R_FindPlane(rover->master->frontsector, *rover->bottomheight, *rover->bottompic,
|
||||||
*frontsector->lightlist[light].lightlevel, *rover->bottomxoffs, *rover->bottomyoffs,
|
R_FloorLightLevel(rover->master->frontsector, *frontsector->lightlist[light].lightlevel), *rover->bottomxoffs, *rover->bottomyoffs,
|
||||||
*rover->bottomxscale, *rover->bottomyscale, *rover->bottomangle,
|
*rover->bottomxscale, *rover->bottomyscale, *rover->bottomangle,
|
||||||
*frontsector->lightlist[light].extra_colormap, rover, NULL, *rover->b_slope, NULL);
|
*frontsector->lightlist[light].extra_colormap, rover, NULL, *rover->b_slope, NULL);
|
||||||
|
|
||||||
|
@ -1002,7 +1013,7 @@ static void R_Subsector(size_t num)
|
||||||
light = R_GetPlaneLight(frontsector, planecenterz, viewz < heightcheck);
|
light = R_GetPlaneLight(frontsector, planecenterz, viewz < heightcheck);
|
||||||
|
|
||||||
ffloor[numffloors].plane = R_FindPlane(rover->master->frontsector, *rover->topheight, *rover->toppic,
|
ffloor[numffloors].plane = R_FindPlane(rover->master->frontsector, *rover->topheight, *rover->toppic,
|
||||||
*frontsector->lightlist[light].lightlevel, *rover->topxoffs, *rover->topyoffs,
|
R_CeilingLightLevel(rover->master->frontsector, *frontsector->lightlist[light].lightlevel), *rover->topxoffs, *rover->topyoffs,
|
||||||
*rover->topxscale, *rover->topyscale, *rover->topangle,
|
*rover->topxscale, *rover->topyscale, *rover->topangle,
|
||||||
*frontsector->lightlist[light].extra_colormap, rover, NULL, *rover->t_slope, NULL);
|
*frontsector->lightlist[light].extra_colormap, rover, NULL, *rover->t_slope, NULL);
|
||||||
|
|
||||||
|
|
|
@ -910,7 +910,7 @@ void R_DrawSinglePlane(visplane_t *pl)
|
||||||
|
|
||||||
if (pl->polyobj->translucency == 0 || (pl->extra_colormap && (pl->extra_colormap->flags & CMF_FOG)))
|
if (pl->polyobj->translucency == 0 || (pl->extra_colormap && (pl->extra_colormap->flags & CMF_FOG)))
|
||||||
light = (pl->lightlevel >> LIGHTSEGSHIFT);
|
light = (pl->lightlevel >> LIGHTSEGSHIFT);
|
||||||
else
|
else // TODO: 2.3: Make transparent polyobject planes always use light level
|
||||||
light = LIGHTLEVELS-1;
|
light = LIGHTLEVELS-1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -952,7 +952,7 @@ void R_DrawSinglePlane(visplane_t *pl)
|
||||||
|
|
||||||
if ((spanfunctype == SPANDRAWFUNC_SPLAT) || (pl->extra_colormap && (pl->extra_colormap->flags & CMF_FOG)))
|
if ((spanfunctype == SPANDRAWFUNC_SPLAT) || (pl->extra_colormap && (pl->extra_colormap->flags & CMF_FOG)))
|
||||||
light = (pl->lightlevel >> LIGHTSEGSHIFT);
|
light = (pl->lightlevel >> LIGHTSEGSHIFT);
|
||||||
else
|
else // TODO: 2.3: Make transparent FOF planes use light level instead of always being fullbright
|
||||||
light = LIGHTLEVELS-1;
|
light = LIGHTLEVELS-1;
|
||||||
}
|
}
|
||||||
else if (pl->ffloor->fofflags & FOF_FOG)
|
else if (pl->ffloor->fofflags & FOF_FOG)
|
||||||
|
|
Loading…
Reference in a new issue