mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-01-17 23:21:22 +00:00
Do lightlist height stepping *after* the heights are used by the FOF rendering code, not before (yes, I caught that they remove a heightstep beforehand for FOFs, but that wasn't done for midtextures it seems?)
Additionally add some macros for repeated slope end assignments and overflow tests
This commit is contained in:
parent
bedfed2f00
commit
80cbad61c0
1 changed files with 33 additions and 54 deletions
87
src/r_segs.c
87
src/r_segs.c
|
@ -590,8 +590,8 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
||||||
else
|
else
|
||||||
rlight->rcolormap = xwalllights[pindex];
|
rlight->rcolormap = xwalllights[pindex];
|
||||||
|
|
||||||
rlight->height += rlight->heightstep;
|
|
||||||
height = rlight->height;
|
height = rlight->height;
|
||||||
|
rlight->height += rlight->heightstep;
|
||||||
|
|
||||||
if (height <= windowtop)
|
if (height <= windowtop)
|
||||||
{
|
{
|
||||||
|
@ -827,26 +827,21 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
|
||||||
light = &frontsector->lightlist[i];
|
light = &frontsector->lightlist[i];
|
||||||
rlight = &dc_lightlist[p];
|
rlight = &dc_lightlist[p];
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
if (light->slope) {
|
|
||||||
leftheight = P_GetZAt(light->slope, ds->leftpos.x, ds->leftpos.y);
|
|
||||||
rightheight = P_GetZAt(light->slope, ds->rightpos.x, ds->rightpos.y);
|
|
||||||
} else
|
|
||||||
leftheight = rightheight = light->height;
|
|
||||||
|
|
||||||
if (*pfloor->b_slope) {
|
#define SLOPEPARAMS(slope, end1, end2, normalheight) \
|
||||||
pfloorleft = P_GetZAt(*pfloor->b_slope, ds->leftpos.x, ds->leftpos.y);
|
if (slope) { \
|
||||||
pfloorright = P_GetZAt(*pfloor->b_slope, ds->rightpos.x, ds->rightpos.y);
|
end1 = P_GetZAt(slope, ds->leftpos.x, ds->leftpos.y); \
|
||||||
} else
|
end2 = P_GetZAt(slope, ds->rightpos.x, ds->rightpos.y); \
|
||||||
pfloorleft = pfloorright = *pfloor->bottomheight;
|
} else \
|
||||||
|
end1 = end2 = normalheight;
|
||||||
|
|
||||||
|
SLOPEPARAMS(light->slope, leftheight, rightheight, light->height)
|
||||||
|
SLOPEPARAMS(*pfloor->b_slope, pfloorleft, pfloorright, *pfloor->bottomheight)
|
||||||
|
|
||||||
if (leftheight < pfloorleft && rightheight < pfloorright)
|
if (leftheight < pfloorleft && rightheight < pfloorright)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (*pfloor->t_slope) {
|
SLOPEPARAMS(*pfloor->t_slope, pfloorleft, pfloorright, *pfloor->topheight)
|
||||||
pfloorleft = P_GetZAt(*pfloor->t_slope, ds->leftpos.x, ds->leftpos.y);
|
|
||||||
pfloorright = P_GetZAt(*pfloor->t_slope, ds->rightpos.x, ds->rightpos.y);
|
|
||||||
} else
|
|
||||||
pfloorleft = pfloorright = *pfloor->topheight;
|
|
||||||
|
|
||||||
if (leftheight > pfloorleft && rightheight > pfloorright && i+1 < dc_numlights)
|
if (leftheight > pfloorleft && rightheight > pfloorright && i+1 < dc_numlights)
|
||||||
{
|
{
|
||||||
|
@ -859,17 +854,17 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
|
||||||
leftheight -= viewz;
|
leftheight -= viewz;
|
||||||
rightheight -= viewz;
|
rightheight -= viewz;
|
||||||
|
|
||||||
overflow_test = (INT64)centeryfrac - (((INT64)leftheight*ds->scale1)>>FRACBITS);
|
#define OVERFLOWTEST(height, scale) \
|
||||||
if (overflow_test < 0) overflow_test = -overflow_test;
|
overflow_test = (INT64)centeryfrac - (((INT64)height*scale)>>FRACBITS); \
|
||||||
if ((UINT64)overflow_test&0xFFFFFFFF80000000ULL) continue;
|
if (overflow_test < 0) overflow_test = -overflow_test; \
|
||||||
overflow_test = (INT64)centeryfrac - (((INT64)rightheight*ds->scale2)>>FRACBITS);
|
if ((UINT64)overflow_test&0xFFFFFFFF80000000ULL) continue;
|
||||||
if (overflow_test < 0) overflow_test = -overflow_test;
|
|
||||||
if ((UINT64)overflow_test&0xFFFFFFFF80000000ULL) continue;
|
OVERFLOWTEST(leftheight, ds->scale1)
|
||||||
|
OVERFLOWTEST(rightheight, ds->scale2)
|
||||||
|
|
||||||
rlight->height = (centeryfrac) - FixedMul(leftheight, ds->scale1);
|
rlight->height = (centeryfrac) - FixedMul(leftheight, ds->scale1);
|
||||||
rlight->heightstep = (centeryfrac) - FixedMul(rightheight, ds->scale2);
|
rlight->heightstep = (centeryfrac) - FixedMul(rightheight, ds->scale2);
|
||||||
rlight->heightstep = (rlight->heightstep-rlight->height)/(range);
|
rlight->heightstep = (rlight->heightstep-rlight->height)/(range);
|
||||||
rlight->height -= rlight->heightstep;
|
|
||||||
#else
|
#else
|
||||||
if (light->height < *pfloor->bottomheight)
|
if (light->height < *pfloor->bottomheight)
|
||||||
continue;
|
continue;
|
||||||
|
@ -879,36 +874,28 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
|
||||||
|
|
||||||
lheight = light->height;// > *pfloor->topheight ? *pfloor->topheight + FRACUNIT : light->height;
|
lheight = light->height;// > *pfloor->topheight ? *pfloor->topheight + FRACUNIT : light->height;
|
||||||
rlight->heightstep = -FixedMul (rw_scalestep, (lheight - viewz));
|
rlight->heightstep = -FixedMul (rw_scalestep, (lheight - viewz));
|
||||||
rlight->height = (centeryfrac) - FixedMul((lheight - viewz), spryscale) - rlight->heightstep;
|
rlight->height = (centeryfrac) - FixedMul((lheight - viewz), spryscale);
|
||||||
#endif
|
#endif
|
||||||
rlight->flags = light->flags;
|
rlight->flags = light->flags;
|
||||||
if (light->flags & FF_CUTLEVEL)
|
if (light->flags & FF_CUTLEVEL)
|
||||||
{
|
{
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
if (*light->caster->b_slope) {
|
SLOPEPARAMS(*light->caster->b_slope, leftheight, rightheight, *light->caster->bottomheight)
|
||||||
leftheight = P_GetZAt(*light->caster->b_slope, ds->leftpos.x, ds->leftpos.y);
|
|
||||||
rightheight = P_GetZAt(*light->caster->b_slope, ds->rightpos.x, ds->rightpos.y);
|
|
||||||
} else
|
|
||||||
leftheight = rightheight = *light->caster->bottomheight;
|
|
||||||
|
|
||||||
leftheight -= viewz;
|
leftheight -= viewz;
|
||||||
rightheight -= viewz;
|
rightheight -= viewz;
|
||||||
|
|
||||||
overflow_test = (INT64)centeryfrac - (((INT64)leftheight*ds->scale1)>>FRACBITS);
|
OVERFLOWTEST(leftheight, ds->scale1)
|
||||||
if (overflow_test < 0) overflow_test = -overflow_test;
|
OVERFLOWTEST(rightheight, ds->scale2)
|
||||||
if ((UINT64)overflow_test&0xFFFFFFFF80000000ULL) continue;
|
#undef OVERFLOWTEST
|
||||||
overflow_test = (INT64)centeryfrac - (((INT64)rightheight*ds->scale2)>>FRACBITS);
|
|
||||||
if (overflow_test < 0) overflow_test = -overflow_test;
|
|
||||||
if ((UINT64)overflow_test&0xFFFFFFFF80000000ULL) continue;
|
|
||||||
|
|
||||||
rlight->botheight = (centeryfrac) - FixedMul(leftheight, ds->scale1);
|
rlight->botheight = (centeryfrac) - FixedMul(leftheight, ds->scale1);
|
||||||
rlight->botheightstep = (centeryfrac) - FixedMul(rightheight, ds->scale2);
|
rlight->botheightstep = (centeryfrac) - FixedMul(rightheight, ds->scale2);
|
||||||
rlight->botheightstep = (rlight->botheightstep-rlight->botheight)/(range);
|
rlight->botheightstep = (rlight->botheightstep-rlight->botheight)/(range);
|
||||||
rlight->botheight -= rlight->botheightstep;
|
|
||||||
#else
|
#else
|
||||||
lheight = *light->caster->bottomheight;// > *pfloor->topheight ? *pfloor->topheight + FRACUNIT : *light->caster->bottomheight;
|
lheight = *light->caster->bottomheight;// > *pfloor->topheight ? *pfloor->topheight + FRACUNIT : *light->caster->bottomheight;
|
||||||
rlight->botheightstep = -FixedMul (rw_scalestep, (lheight - viewz));
|
rlight->botheightstep = -FixedMul (rw_scalestep, (lheight - viewz));
|
||||||
rlight->botheight = (centeryfrac) - FixedMul((lheight - viewz), spryscale) - rlight->botheightstep;
|
rlight->botheight = (centeryfrac) - FixedMul((lheight - viewz), spryscale);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1001,21 +988,13 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
|
||||||
{
|
{
|
||||||
fixed_t left_top, right_top, left_bottom, right_bottom;
|
fixed_t left_top, right_top, left_bottom, right_bottom;
|
||||||
|
|
||||||
if (*pfloor->t_slope)
|
SLOPEPARAMS(*pfloor->t_slope, left_top, right_top, *pfloor->topheight)
|
||||||
{
|
SLOPEPARAMS(*pfloor->b_slope, left_bottom, right_bottom, *pfloor->bottomheight)
|
||||||
left_top = P_GetZAt(*pfloor->t_slope, ds->leftpos.x, ds->leftpos.y) - viewz;
|
#undef SLOPEPARAMS
|
||||||
right_top = P_GetZAt(*pfloor->t_slope, ds->rightpos.x, ds->rightpos.y) - viewz;
|
left_top -= viewz;
|
||||||
}
|
right_top -= viewz;
|
||||||
else
|
left_bottom -= viewz;
|
||||||
left_top = right_top = *pfloor->topheight - viewz;
|
right_bottom -= viewz;
|
||||||
|
|
||||||
if (*pfloor->b_slope)
|
|
||||||
{
|
|
||||||
left_bottom = P_GetZAt(*pfloor->b_slope, ds->leftpos.x, ds->leftpos.y) - viewz;
|
|
||||||
right_bottom = P_GetZAt(*pfloor->b_slope, ds->rightpos.x, ds->rightpos.y) - viewz;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
left_bottom = right_bottom = *pfloor->bottomheight - viewz;
|
|
||||||
|
|
||||||
// using INT64 to avoid 32bit overflow
|
// using INT64 to avoid 32bit overflow
|
||||||
top_frac = (INT64)centeryfrac - (((INT64)left_top * ds->scale1) >> FRACBITS);
|
top_frac = (INT64)centeryfrac - (((INT64)left_top * ds->scale1) >> FRACBITS);
|
||||||
|
@ -1145,13 +1124,13 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
|
||||||
else
|
else
|
||||||
solid = 0;
|
solid = 0;
|
||||||
|
|
||||||
rlight->height += rlight->heightstep;
|
|
||||||
height = rlight->height;
|
height = rlight->height;
|
||||||
|
rlight->height += rlight->heightstep;
|
||||||
|
|
||||||
if (solid)
|
if (solid)
|
||||||
{
|
{
|
||||||
rlight->botheight += rlight->botheightstep;
|
|
||||||
bheight = rlight->botheight - (FRACUNIT >> 1);
|
bheight = rlight->botheight - (FRACUNIT >> 1);
|
||||||
|
rlight->botheight += rlight->botheightstep;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (height <= windowtop)
|
if (height <= windowtop)
|
||||||
|
|
Loading…
Reference in a new issue