mirror of
https://git.do.srb2.org/KartKrew/Kart-Public.git
synced 2024-12-27 21:01:04 +00:00
Merge branch 'texture-fixes' into 'next'
Some texture-related fixes Bugs fixed in this branch: * upper/lower/middle textures with non-existent texture ids being capable of crashing the game. For instance, RVZ1 has colormap codes on non-colormap linedefs, which causes them to wind up with invalid texture ids because of how the game tries to interpret lower/upper textures with "#" followed by characters on normal linedefs. Fortunately these "textures" are normally not visible anyway (since they're all in control sectors) unless they are swapped with in-level textures by some crazy Lua script of some sort... * animated single-patch textures with holes displaying garbage on first viewing (see this thread: https://mb.srb2.org/showthread.php?t=42195) * the heights of the lighting (shadows or colormapping) from water/translucent/shadowcasting/etc FOFs become messed up when displayed on repeated midtextures. See merge request !144
This commit is contained in:
commit
c601a409e1
6 changed files with 147 additions and 119 deletions
|
@ -1558,6 +1558,7 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
|
||||||
|
|
||||||
if (gr_backsector)
|
if (gr_backsector)
|
||||||
{
|
{
|
||||||
|
INT32 gr_toptexture, gr_bottomtexture;
|
||||||
// two sided line
|
// two sided line
|
||||||
if (gr_backsector->heightsec != -1)
|
if (gr_backsector->heightsec != -1)
|
||||||
{
|
{
|
||||||
|
@ -1608,19 +1609,22 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gr_toptexture = R_GetTextureNum(gr_sidedef->toptexture);
|
||||||
|
gr_bottomtexture = R_GetTextureNum(gr_sidedef->bottomtexture);
|
||||||
|
|
||||||
// check TOP TEXTURE
|
// check TOP TEXTURE
|
||||||
if ((
|
if ((
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
worldhighslope < worldtopslope ||
|
worldhighslope < worldtopslope ||
|
||||||
#endif
|
#endif
|
||||||
worldhigh < worldtop
|
worldhigh < worldtop
|
||||||
) && texturetranslation[gr_sidedef->toptexture])
|
) && gr_toptexture)
|
||||||
{
|
{
|
||||||
if (drawtextured)
|
if (drawtextured)
|
||||||
{
|
{
|
||||||
fixed_t texturevpegtop; // top
|
fixed_t texturevpegtop; // top
|
||||||
|
|
||||||
grTex = HWR_GetTexture(texturetranslation[gr_sidedef->toptexture]);
|
grTex = HWR_GetTexture(gr_toptexture);
|
||||||
|
|
||||||
// PEGGING
|
// PEGGING
|
||||||
if (gr_linedef->flags & ML_DONTPEGTOP)
|
if (gr_linedef->flags & ML_DONTPEGTOP)
|
||||||
|
@ -1638,7 +1642,7 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
|
||||||
texturevpegtop += gr_sidedef->rowoffset;
|
texturevpegtop += gr_sidedef->rowoffset;
|
||||||
|
|
||||||
// This is so that it doesn't overflow and screw up the wall, it doesn't need to go higher than the texture's height anyway
|
// This is so that it doesn't overflow and screw up the wall, it doesn't need to go higher than the texture's height anyway
|
||||||
texturevpegtop %= SHORT(textures[texturetranslation[gr_sidedef->toptexture]]->height)<<FRACBITS;
|
texturevpegtop %= SHORT(textures[gr_toptexture]->height)<<FRACBITS;
|
||||||
|
|
||||||
wallVerts[3].t = wallVerts[2].t = texturevpegtop * grTex->scaleY;
|
wallVerts[3].t = wallVerts[2].t = texturevpegtop * grTex->scaleY;
|
||||||
wallVerts[0].t = wallVerts[1].t = (texturevpegtop + gr_frontsector->ceilingheight - gr_backsector->ceilingheight) * grTex->scaleY;
|
wallVerts[0].t = wallVerts[1].t = (texturevpegtop + gr_frontsector->ceilingheight - gr_backsector->ceilingheight) * grTex->scaleY;
|
||||||
|
@ -1683,9 +1687,9 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (gr_frontsector->numlights)
|
if (gr_frontsector->numlights)
|
||||||
HWR_SplitWall(gr_frontsector, wallVerts, texturetranslation[gr_sidedef->toptexture], &Surf, FF_CUTSOLIDS);
|
HWR_SplitWall(gr_frontsector, wallVerts, gr_toptexture, &Surf, FF_CUTSOLIDS);
|
||||||
else if (grTex->mipmap.flags & TF_TRANSPARENT)
|
else if (grTex->mipmap.flags & TF_TRANSPARENT)
|
||||||
HWR_AddTransparentWall(wallVerts, &Surf, texturetranslation[gr_sidedef->toptexture], PF_Environment, false, lightnum, colormap);
|
HWR_AddTransparentWall(wallVerts, &Surf, gr_toptexture, PF_Environment, false, lightnum, colormap);
|
||||||
else
|
else
|
||||||
HWR_ProjectWall(wallVerts, &Surf, PF_Masked, lightnum, colormap);
|
HWR_ProjectWall(wallVerts, &Surf, PF_Masked, lightnum, colormap);
|
||||||
}
|
}
|
||||||
|
@ -1695,13 +1699,13 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
worldlowslope > worldbottomslope ||
|
worldlowslope > worldbottomslope ||
|
||||||
#endif
|
#endif
|
||||||
worldlow > worldbottom) && texturetranslation[gr_sidedef->bottomtexture]) //only if VISIBLE!!!
|
worldlow > worldbottom) && gr_bottomtexture) //only if VISIBLE!!!
|
||||||
{
|
{
|
||||||
if (drawtextured)
|
if (drawtextured)
|
||||||
{
|
{
|
||||||
fixed_t texturevpegbottom = 0; // bottom
|
fixed_t texturevpegbottom = 0; // bottom
|
||||||
|
|
||||||
grTex = HWR_GetTexture(texturetranslation[gr_sidedef->bottomtexture]);
|
grTex = HWR_GetTexture(gr_bottomtexture);
|
||||||
|
|
||||||
// PEGGING
|
// PEGGING
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
|
@ -1721,7 +1725,7 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
|
||||||
texturevpegbottom += gr_sidedef->rowoffset;
|
texturevpegbottom += gr_sidedef->rowoffset;
|
||||||
|
|
||||||
// This is so that it doesn't overflow and screw up the wall, it doesn't need to go higher than the texture's height anyway
|
// This is so that it doesn't overflow and screw up the wall, it doesn't need to go higher than the texture's height anyway
|
||||||
texturevpegbottom %= SHORT(textures[texturetranslation[gr_sidedef->bottomtexture]]->height)<<FRACBITS;
|
texturevpegbottom %= SHORT(textures[gr_bottomtexture]->height)<<FRACBITS;
|
||||||
|
|
||||||
wallVerts[3].t = wallVerts[2].t = texturevpegbottom * grTex->scaleY;
|
wallVerts[3].t = wallVerts[2].t = texturevpegbottom * grTex->scaleY;
|
||||||
wallVerts[0].t = wallVerts[1].t = (texturevpegbottom + gr_backsector->floorheight - gr_frontsector->floorheight) * grTex->scaleY;
|
wallVerts[0].t = wallVerts[1].t = (texturevpegbottom + gr_backsector->floorheight - gr_frontsector->floorheight) * grTex->scaleY;
|
||||||
|
@ -1766,13 +1770,13 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (gr_frontsector->numlights)
|
if (gr_frontsector->numlights)
|
||||||
HWR_SplitWall(gr_frontsector, wallVerts, texturetranslation[gr_sidedef->bottomtexture], &Surf, FF_CUTSOLIDS);
|
HWR_SplitWall(gr_frontsector, wallVerts, gr_bottomtexture, &Surf, FF_CUTSOLIDS);
|
||||||
else if (grTex->mipmap.flags & TF_TRANSPARENT)
|
else if (grTex->mipmap.flags & TF_TRANSPARENT)
|
||||||
HWR_AddTransparentWall(wallVerts, &Surf, texturetranslation[gr_sidedef->bottomtexture], PF_Environment, false, lightnum, colormap);
|
HWR_AddTransparentWall(wallVerts, &Surf, gr_bottomtexture, PF_Environment, false, lightnum, colormap);
|
||||||
else
|
else
|
||||||
HWR_ProjectWall(wallVerts, &Surf, PF_Masked, lightnum, colormap);
|
HWR_ProjectWall(wallVerts, &Surf, PF_Masked, lightnum, colormap);
|
||||||
}
|
}
|
||||||
gr_midtexture = texturetranslation[gr_sidedef->midtexture];
|
gr_midtexture = R_GetTextureNum(gr_sidedef->midtexture);
|
||||||
if (gr_midtexture)
|
if (gr_midtexture)
|
||||||
{
|
{
|
||||||
FBITFIELD blendmode;
|
FBITFIELD blendmode;
|
||||||
|
@ -2134,7 +2138,7 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Single sided line... Deal only with the middletexture (if one exists)
|
// Single sided line... Deal only with the middletexture (if one exists)
|
||||||
gr_midtexture = texturetranslation[gr_sidedef->midtexture];
|
gr_midtexture = R_GetTextureNum(gr_sidedef->midtexture);
|
||||||
if (gr_midtexture)
|
if (gr_midtexture)
|
||||||
{
|
{
|
||||||
if (drawtextured)
|
if (drawtextured)
|
||||||
|
@ -2232,13 +2236,13 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
|
||||||
if (*rover->topheight < lowcut || *rover->bottomheight > highcut)
|
if (*rover->topheight < lowcut || *rover->bottomheight > highcut)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
texnum = texturetranslation[sides[rover->master->sidenum[0]].midtexture];
|
texnum = R_GetTextureNum(sides[rover->master->sidenum[0]].midtexture);
|
||||||
|
|
||||||
if (rover->master->flags & ML_TFERLINE)
|
if (rover->master->flags & ML_TFERLINE)
|
||||||
{
|
{
|
||||||
size_t linenum = gr_curline->linedef-gr_backsector->lines[0];
|
size_t linenum = gr_curline->linedef-gr_backsector->lines[0];
|
||||||
newline = rover->master->frontsector->lines[0] + linenum;
|
newline = rover->master->frontsector->lines[0] + linenum;
|
||||||
texnum = texturetranslation[sides[newline->sidenum[0]].midtexture];
|
texnum = R_GetTextureNum(sides[newline->sidenum[0]].midtexture);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
|
@ -2366,13 +2370,13 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
|
||||||
if (*rover->topheight < lowcut || *rover->bottomheight > highcut)
|
if (*rover->topheight < lowcut || *rover->bottomheight > highcut)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
texnum = texturetranslation[sides[rover->master->sidenum[0]].midtexture];
|
texnum = R_GetTextureNum(sides[rover->master->sidenum[0]].midtexture);
|
||||||
|
|
||||||
if (rover->master->flags & ML_TFERLINE)
|
if (rover->master->flags & ML_TFERLINE)
|
||||||
{
|
{
|
||||||
size_t linenum = gr_curline->linedef-gr_backsector->lines[0];
|
size_t linenum = gr_curline->linedef-gr_backsector->lines[0];
|
||||||
newline = rover->master->frontsector->lines[0] + linenum;
|
newline = rover->master->frontsector->lines[0] + linenum;
|
||||||
texnum = texturetranslation[sides[newline->sidenum[0]].midtexture];
|
texnum = R_GetTextureNum(sides[newline->sidenum[0]].midtexture);
|
||||||
}
|
}
|
||||||
#ifdef ESLOPE //backsides
|
#ifdef ESLOPE //backsides
|
||||||
h = *rover->t_slope ? P_GetZAt(*rover->t_slope, v1x, v1y) : *rover->topheight;
|
h = *rover->t_slope ? P_GetZAt(*rover->t_slope, v1x, v1y) : *rover->topheight;
|
||||||
|
|
|
@ -572,51 +572,54 @@ void P_LineOpening(line_t *linedef, mobj_t *mobj)
|
||||||
side_t *side = &sides[linedef->sidenum[0]];
|
side_t *side = &sides[linedef->sidenum[0]];
|
||||||
fixed_t textop, texbottom, texheight;
|
fixed_t textop, texbottom, texheight;
|
||||||
fixed_t texmid, delta1, delta2;
|
fixed_t texmid, delta1, delta2;
|
||||||
|
INT32 texnum = R_GetTextureNum(side->midtexture); // make sure the texture is actually valid
|
||||||
|
|
||||||
// Get the midtexture's height
|
if (texnum) {
|
||||||
texheight = textures[texturetranslation[side->midtexture]]->height << FRACBITS;
|
// Get the midtexture's height
|
||||||
|
texheight = textures[texnum]->height << FRACBITS;
|
||||||
|
|
||||||
// Set texbottom and textop to the Z coordinates of the texture's boundaries
|
// Set texbottom and textop to the Z coordinates of the texture's boundaries
|
||||||
#if 0 // #ifdef POLYOBJECTS
|
#if 0 // #ifdef POLYOBJECTS
|
||||||
// don't remove this code unless solid midtextures
|
// don't remove this code unless solid midtextures
|
||||||
// on non-solid polyobjects should NEVER happen in the future
|
// on non-solid polyobjects should NEVER happen in the future
|
||||||
if (linedef->polyobj && (linedef->polyobj->flags & POF_TESTHEIGHT)) {
|
if (linedef->polyobj && (linedef->polyobj->flags & POF_TESTHEIGHT)) {
|
||||||
if (linedef->flags & ML_EFFECT5 && !side->repeatcnt) { // "infinite" repeat
|
if (linedef->flags & ML_EFFECT5 && !side->repeatcnt) { // "infinite" repeat
|
||||||
texbottom = back->floorheight + side->rowoffset;
|
texbottom = back->floorheight + side->rowoffset;
|
||||||
textop = back->ceilingheight + side->rowoffset;
|
textop = back->ceilingheight + side->rowoffset;
|
||||||
} else if (!!(linedef->flags & ML_DONTPEGBOTTOM) ^ !!(linedef->flags & ML_EFFECT3)) {
|
} else if (!!(linedef->flags & ML_DONTPEGBOTTOM) ^ !!(linedef->flags & ML_EFFECT3)) {
|
||||||
texbottom = back->floorheight + side->rowoffset;
|
texbottom = back->floorheight + side->rowoffset;
|
||||||
textop = texbottom + texheight*(side->repeatcnt+1);
|
textop = texbottom + texheight*(side->repeatcnt+1);
|
||||||
} else {
|
} else {
|
||||||
textop = back->ceilingheight + side->rowoffset;
|
textop = back->ceilingheight + side->rowoffset;
|
||||||
texbottom = textop - texheight*(side->repeatcnt+1);
|
texbottom = textop - texheight*(side->repeatcnt+1);
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
if (linedef->flags & ML_EFFECT5 && !side->repeatcnt) { // "infinite" repeat
|
if (linedef->flags & ML_EFFECT5 && !side->repeatcnt) { // "infinite" repeat
|
||||||
texbottom = openbottom + side->rowoffset;
|
texbottom = openbottom + side->rowoffset;
|
||||||
textop = opentop + side->rowoffset;
|
textop = opentop + side->rowoffset;
|
||||||
} else if (!!(linedef->flags & ML_DONTPEGBOTTOM) ^ !!(linedef->flags & ML_EFFECT3)) {
|
} else if (!!(linedef->flags & ML_DONTPEGBOTTOM) ^ !!(linedef->flags & ML_EFFECT3)) {
|
||||||
texbottom = openbottom + side->rowoffset;
|
texbottom = openbottom + side->rowoffset;
|
||||||
textop = texbottom + texheight*(side->repeatcnt+1);
|
textop = texbottom + texheight*(side->repeatcnt+1);
|
||||||
} else {
|
} else {
|
||||||
textop = opentop + side->rowoffset;
|
textop = opentop + side->rowoffset;
|
||||||
texbottom = textop - texheight*(side->repeatcnt+1);
|
texbottom = textop - texheight*(side->repeatcnt+1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
texmid = texbottom+(textop-texbottom)/2;
|
texmid = texbottom+(textop-texbottom)/2;
|
||||||
|
|
||||||
delta1 = abs(mobj->z - texmid);
|
delta1 = abs(mobj->z - texmid);
|
||||||
delta2 = abs(thingtop - texmid);
|
delta2 = abs(thingtop - texmid);
|
||||||
|
|
||||||
if (delta1 > delta2) { // Below
|
if (delta1 > delta2) { // Below
|
||||||
if (opentop > texbottom)
|
if (opentop > texbottom)
|
||||||
opentop = texbottom;
|
opentop = texbottom;
|
||||||
} else { // Above
|
} else { // Above
|
||||||
if (openbottom < textop)
|
if (openbottom < textop)
|
||||||
openbottom = textop;
|
openbottom = textop;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
26
src/r_data.c
26
src/r_data.c
|
@ -303,6 +303,32 @@ done:
|
||||||
return blocktex;
|
return blocktex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// R_GetTextureNum
|
||||||
|
//
|
||||||
|
// Returns the actual texture id that we should use.
|
||||||
|
// This can either be texnum, the current frame for texnum's anim (if animated),
|
||||||
|
// or 0 if not valid.
|
||||||
|
//
|
||||||
|
INT32 R_GetTextureNum(INT32 texnum)
|
||||||
|
{
|
||||||
|
if (texnum < 0 || texnum >= numtextures)
|
||||||
|
return 0;
|
||||||
|
return texturetranslation[texnum];
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// R_CheckTextureCache
|
||||||
|
//
|
||||||
|
// Use this if you need to make sure the texture is cached before R_GetColumn calls
|
||||||
|
// e.g.: midtextures and FOF walls
|
||||||
|
//
|
||||||
|
void R_CheckTextureCache(INT32 tex)
|
||||||
|
{
|
||||||
|
if (!texturecache[tex])
|
||||||
|
R_GenerateTexture(tex);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// R_GetColumn
|
// R_GetColumn
|
||||||
//
|
//
|
||||||
|
|
|
@ -65,6 +65,9 @@ extern CV_PossibleValue_t Color_cons_t[];
|
||||||
void R_LoadTextures(void);
|
void R_LoadTextures(void);
|
||||||
void R_FlushTextureCache(void);
|
void R_FlushTextureCache(void);
|
||||||
|
|
||||||
|
INT32 R_GetTextureNum(INT32 texnum);
|
||||||
|
void R_CheckTextureCache(INT32 tex);
|
||||||
|
|
||||||
// Retrieve column data for span blitting.
|
// Retrieve column data for span blitting.
|
||||||
UINT8 *R_GetColumn(fixed_t tex, INT32 col);
|
UINT8 *R_GetColumn(fixed_t tex, INT32 col);
|
||||||
|
|
||||||
|
|
|
@ -203,6 +203,7 @@ typedef struct r_lightlist_s
|
||||||
fixed_t heightstep;
|
fixed_t heightstep;
|
||||||
fixed_t botheight;
|
fixed_t botheight;
|
||||||
fixed_t botheightstep;
|
fixed_t botheightstep;
|
||||||
|
fixed_t startheight; // for repeating midtextures
|
||||||
INT16 lightlevel;
|
INT16 lightlevel;
|
||||||
extracolormap_t *extra_colormap;
|
extracolormap_t *extra_colormap;
|
||||||
lighttable_t *rcolormap;
|
lighttable_t *rcolormap;
|
||||||
|
|
123
src/r_segs.c
123
src/r_segs.c
|
@ -300,7 +300,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
||||||
curline = ds->curline;
|
curline = ds->curline;
|
||||||
frontsector = curline->frontsector;
|
frontsector = curline->frontsector;
|
||||||
backsector = curline->backsector;
|
backsector = curline->backsector;
|
||||||
texnum = texturetranslation[curline->sidedef->midtexture];
|
texnum = R_GetTextureNum(curline->sidedef->midtexture);
|
||||||
windowbottom = windowtop = sprbotscreen = INT32_MAX;
|
windowbottom = windowtop = sprbotscreen = INT32_MAX;
|
||||||
|
|
||||||
// hack translucent linedef types (900-909 for transtables 1-9)
|
// hack translucent linedef types (900-909 for transtables 1-9)
|
||||||
|
@ -344,6 +344,9 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
||||||
rw_scalestep = ds->scalestep;
|
rw_scalestep = ds->scalestep;
|
||||||
spryscale = ds->scale1 + (x1 - ds->x1)*rw_scalestep;
|
spryscale = ds->scale1 + (x1 - ds->x1)*rw_scalestep;
|
||||||
|
|
||||||
|
// Texture must be cached before setting colfunc_2s,
|
||||||
|
// otherwise texture[texnum]->holes may be false when it shouldn't be
|
||||||
|
R_CheckTextureCache(texnum);
|
||||||
// handle case where multipatch texture is drawn on a 2sided wall, multi-patch textures
|
// handle case where multipatch texture is drawn on a 2sided wall, multi-patch textures
|
||||||
// are not stored per-column with post info in SRB2
|
// are not stored per-column with post info in SRB2
|
||||||
if (textures[texnum]->holes)
|
if (textures[texnum]->holes)
|
||||||
|
@ -391,6 +394,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
||||||
rlight->height = (centeryfrac) - FixedMul((light->height - viewz), spryscale);
|
rlight->height = (centeryfrac) - FixedMul((light->height - viewz), spryscale);
|
||||||
rlight->heightstep = -FixedMul(rw_scalestep, (light->height - viewz));
|
rlight->heightstep = -FixedMul(rw_scalestep, (light->height - viewz));
|
||||||
#endif
|
#endif
|
||||||
|
rlight->startheight = rlight->height; // keep starting value here to reset for each repeat
|
||||||
rlight->lightlevel = *light->lightlevel;
|
rlight->lightlevel = *light->lightlevel;
|
||||||
rlight->extra_colormap = light->extra_colormap;
|
rlight->extra_colormap = light->extra_colormap;
|
||||||
rlight->flags = light->flags;
|
rlight->flags = light->flags;
|
||||||
|
@ -484,6 +488,14 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
||||||
{
|
{
|
||||||
rw_scalestep = ds->scalestep;
|
rw_scalestep = ds->scalestep;
|
||||||
spryscale = ds->scale1 + (x1 - ds->x1)*rw_scalestep;
|
spryscale = ds->scale1 + (x1 - ds->x1)*rw_scalestep;
|
||||||
|
if (dc_numlights)
|
||||||
|
{ // reset all lights to their starting heights
|
||||||
|
for (i = 0; i < dc_numlights; i++)
|
||||||
|
{
|
||||||
|
rlight = &dc_lightlist[i];
|
||||||
|
rlight->height = rlight->startheight;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef ESLOPE
|
#ifndef ESLOPE
|
||||||
|
@ -740,7 +752,7 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
|
||||||
curline = ds->curline;
|
curline = ds->curline;
|
||||||
backsector = pfloor->target;
|
backsector = pfloor->target;
|
||||||
frontsector = curline->frontsector == pfloor->target ? curline->backsector : curline->frontsector;
|
frontsector = curline->frontsector == pfloor->target ? curline->backsector : curline->frontsector;
|
||||||
texnum = texturetranslation[sides[pfloor->master->sidenum[0]].midtexture];
|
texnum = R_GetTextureNum(sides[pfloor->master->sidenum[0]].midtexture);
|
||||||
|
|
||||||
colfunc = wallcolfunc;
|
colfunc = wallcolfunc;
|
||||||
|
|
||||||
|
@ -748,7 +760,7 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
|
||||||
{
|
{
|
||||||
size_t linenum = curline->linedef-backsector->lines[0];
|
size_t linenum = curline->linedef-backsector->lines[0];
|
||||||
newline = pfloor->master->frontsector->lines[0] + linenum;
|
newline = pfloor->master->frontsector->lines[0] + linenum;
|
||||||
texnum = texturetranslation[sides[newline->sidenum[0]].midtexture];
|
texnum = R_GetTextureNum(sides[newline->sidenum[0]].midtexture);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pfloor->flags & FF_TRANSLUCENT)
|
if (pfloor->flags & FF_TRANSLUCENT)
|
||||||
|
@ -968,6 +980,9 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
|
||||||
|
|
||||||
dc_texturemid += offsetvalue;
|
dc_texturemid += offsetvalue;
|
||||||
|
|
||||||
|
// Texture must be cached before setting colfunc_2s,
|
||||||
|
// otherwise texture[texnum]->holes may be false when it shouldn't be
|
||||||
|
R_CheckTextureCache(texnum);
|
||||||
//faB: handle case where multipatch texture is drawn on a 2sided wall, multi-patch textures
|
//faB: handle case where multipatch texture is drawn on a 2sided wall, multi-patch textures
|
||||||
// are not stored per-column with post info anymore in Doom Legacy
|
// are not stored per-column with post info anymore in Doom Legacy
|
||||||
if (textures[texnum]->holes)
|
if (textures[texnum]->holes)
|
||||||
|
@ -1878,14 +1893,16 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
||||||
|
|
||||||
if (!backsector)
|
if (!backsector)
|
||||||
{
|
{
|
||||||
|
fixed_t texheight;
|
||||||
// single sided line
|
// single sided line
|
||||||
midtexture = texturetranslation[sidedef->midtexture];
|
midtexture = R_GetTextureNum(sidedef->midtexture);
|
||||||
|
texheight = textureheight[midtexture];
|
||||||
// a single sided line is terminal, so it must mark ends
|
// a single sided line is terminal, so it must mark ends
|
||||||
markfloor = markceiling = true;
|
markfloor = markceiling = true;
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
if (linedef->flags & ML_EFFECT2) {
|
if (linedef->flags & ML_EFFECT2) {
|
||||||
if (linedef->flags & ML_DONTPEGBOTTOM)
|
if (linedef->flags & ML_DONTPEGBOTTOM)
|
||||||
rw_midtexturemid = frontsector->floorheight + textureheight[sidedef->midtexture] - viewz;
|
rw_midtexturemid = frontsector->floorheight + texheight - viewz;
|
||||||
else
|
else
|
||||||
rw_midtexturemid = frontsector->ceilingheight - viewz;
|
rw_midtexturemid = frontsector->ceilingheight - viewz;
|
||||||
}
|
}
|
||||||
|
@ -1894,10 +1911,10 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
||||||
if (linedef->flags & ML_DONTPEGBOTTOM)
|
if (linedef->flags & ML_DONTPEGBOTTOM)
|
||||||
{
|
{
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
rw_midtexturemid = worldbottom + textureheight[sidedef->midtexture];
|
rw_midtexturemid = worldbottom + texheight;
|
||||||
rw_midtextureslide = floorfrontslide;
|
rw_midtextureslide = floorfrontslide;
|
||||||
#else
|
#else
|
||||||
vtop = frontsector->floorheight + textureheight[sidedef->midtexture];
|
vtop = frontsector->floorheight + texheight;
|
||||||
// bottom of texture at bottom
|
// bottom of texture at bottom
|
||||||
rw_midtexturemid = vtop - viewz;
|
rw_midtexturemid = vtop - viewz;
|
||||||
#endif
|
#endif
|
||||||
|
@ -2129,76 +2146,50 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
||||||
#endif
|
#endif
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
fixed_t texheight;
|
||||||
// top texture
|
// top texture
|
||||||
if ((linedef->flags & (ML_DONTPEGTOP) && (linedef->flags & ML_DONTPEGBOTTOM))
|
if ((linedef->flags & (ML_DONTPEGTOP) && (linedef->flags & ML_DONTPEGBOTTOM))
|
||||||
&& linedef->sidenum[1] != 0xffff)
|
&& linedef->sidenum[1] != 0xffff)
|
||||||
{
|
{
|
||||||
// Special case... use offsets from 2nd side but only if it has a texture.
|
// Special case... use offsets from 2nd side but only if it has a texture.
|
||||||
side_t *def = &sides[linedef->sidenum[1]];
|
side_t *def = &sides[linedef->sidenum[1]];
|
||||||
toptexture = texturetranslation[def->toptexture];
|
toptexture = R_GetTextureNum(def->toptexture);
|
||||||
|
|
||||||
if (!toptexture) //Second side has no texture, use the first side's instead.
|
if (!toptexture) //Second side has no texture, use the first side's instead.
|
||||||
toptexture = texturetranslation[sidedef->toptexture];
|
toptexture = R_GetTextureNum(sidedef->toptexture);
|
||||||
|
texheight = textureheight[toptexture];
|
||||||
#ifdef ESLOPE
|
|
||||||
if (!(linedef->flags & ML_EFFECT1)) { // Ignore slopes for lower/upper textures unless flag is checked
|
|
||||||
if (linedef->flags & ML_DONTPEGTOP)
|
|
||||||
rw_toptexturemid = frontsector->ceilingheight - viewz;
|
|
||||||
else
|
|
||||||
rw_toptexturemid = backsector->ceilingheight - viewz;
|
|
||||||
} else
|
|
||||||
#endif
|
|
||||||
if (linedef->flags & ML_DONTPEGTOP)
|
|
||||||
{
|
|
||||||
// top of texture at top
|
|
||||||
rw_toptexturemid = worldtop;
|
|
||||||
#ifdef ESLOPE
|
|
||||||
rw_toptextureslide = ceilingfrontslide;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
#ifdef ESLOPE
|
|
||||||
rw_toptexturemid = worldhigh + textureheight[def->toptexture];
|
|
||||||
rw_toptextureslide = ceilingbackslide;
|
|
||||||
#else
|
|
||||||
vtop = backsector->ceilingheight + textureheight[def->toptexture];
|
|
||||||
// bottom of texture
|
|
||||||
rw_toptexturemid = vtop - viewz;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
toptexture = texturetranslation[sidedef->toptexture];
|
toptexture = R_GetTextureNum(sidedef->toptexture);
|
||||||
|
texheight = textureheight[toptexture];
|
||||||
|
}
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
if (!(linedef->flags & ML_EFFECT1)) { // Ignore slopes for lower/upper textures unless flag is checked
|
if (!(linedef->flags & ML_EFFECT1)) { // Ignore slopes for lower/upper textures unless flag is checked
|
||||||
if (linedef->flags & ML_DONTPEGTOP)
|
|
||||||
rw_toptexturemid = frontsector->ceilingheight - viewz;
|
|
||||||
else
|
|
||||||
rw_toptexturemid = backsector->ceilingheight - viewz;
|
|
||||||
} else
|
|
||||||
#endif
|
|
||||||
if (linedef->flags & ML_DONTPEGTOP)
|
if (linedef->flags & ML_DONTPEGTOP)
|
||||||
{
|
rw_toptexturemid = frontsector->ceilingheight - viewz;
|
||||||
// top of texture at top
|
|
||||||
rw_toptexturemid = worldtop;
|
|
||||||
#ifdef ESLOPE
|
|
||||||
rw_toptextureslide = ceilingfrontslide;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
rw_toptexturemid = backsector->ceilingheight - viewz;
|
||||||
#ifdef ESLOPE
|
} else
|
||||||
rw_toptexturemid = worldhigh + textureheight[sidedef->toptexture];
|
#endif
|
||||||
rw_toptextureslide = ceilingbackslide;
|
if (linedef->flags & ML_DONTPEGTOP)
|
||||||
#else
|
{
|
||||||
vtop = backsector->ceilingheight + textureheight[sidedef->toptexture];
|
// top of texture at top
|
||||||
// bottom of texture
|
rw_toptexturemid = worldtop;
|
||||||
rw_toptexturemid = vtop - viewz;
|
#ifdef ESLOPE
|
||||||
|
rw_toptextureslide = ceilingfrontslide;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#ifdef ESLOPE
|
||||||
|
rw_toptexturemid = worldhigh + texheight;
|
||||||
|
rw_toptextureslide = ceilingbackslide;
|
||||||
|
#else
|
||||||
|
vtop = backsector->ceilingheight + texheight;
|
||||||
|
// bottom of texture
|
||||||
|
rw_toptexturemid = vtop - viewz;
|
||||||
#endif
|
#endif
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// check BOTTOM TEXTURE
|
// check BOTTOM TEXTURE
|
||||||
|
@ -2209,7 +2200,7 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
||||||
) //seulement si VISIBLE!!!
|
) //seulement si VISIBLE!!!
|
||||||
{
|
{
|
||||||
// bottom texture
|
// bottom texture
|
||||||
bottomtexture = texturetranslation[sidedef->bottomtexture];
|
bottomtexture = R_GetTextureNum(sidedef->bottomtexture);
|
||||||
|
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
if (!(linedef->flags & ML_EFFECT1)) { // Ignore slopes for lower/upper textures unless flag is checked
|
if (!(linedef->flags & ML_EFFECT1)) { // Ignore slopes for lower/upper textures unless flag is checked
|
||||||
|
@ -2494,7 +2485,7 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
||||||
|
|
||||||
ds_p->numthicksides = numthicksides = i;
|
ds_p->numthicksides = numthicksides = i;
|
||||||
}
|
}
|
||||||
if (sidedef->midtexture)
|
if (sidedef->midtexture > 0 && sidedef->midtexture < numtextures)
|
||||||
{
|
{
|
||||||
// masked midtexture
|
// masked midtexture
|
||||||
if (!ds_p->thicksidecol)
|
if (!ds_p->thicksidecol)
|
||||||
|
@ -3101,12 +3092,12 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
||||||
if (maskedtexture && !(ds_p->silhouette & SIL_TOP))
|
if (maskedtexture && !(ds_p->silhouette & SIL_TOP))
|
||||||
{
|
{
|
||||||
ds_p->silhouette |= SIL_TOP;
|
ds_p->silhouette |= SIL_TOP;
|
||||||
ds_p->tsilheight = sidedef->midtexture ? INT32_MIN: INT32_MAX;
|
ds_p->tsilheight = (sidedef->midtexture > 0 && sidedef->midtexture < numtextures) ? INT32_MIN: INT32_MAX;
|
||||||
}
|
}
|
||||||
if (maskedtexture && !(ds_p->silhouette & SIL_BOTTOM))
|
if (maskedtexture && !(ds_p->silhouette & SIL_BOTTOM))
|
||||||
{
|
{
|
||||||
ds_p->silhouette |= SIL_BOTTOM;
|
ds_p->silhouette |= SIL_BOTTOM;
|
||||||
ds_p->bsilheight = sidedef->midtexture ? INT32_MAX: INT32_MIN;
|
ds_p->bsilheight = (sidedef->midtexture > 0 && sidedef->midtexture < numtextures) ? INT32_MAX: INT32_MIN;
|
||||||
}
|
}
|
||||||
ds_p++;
|
ds_p++;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue