Create WallPartTexture class

This commit is contained in:
Magnus Norddahl 2017-02-12 06:17:38 +01:00
parent 0ba8448782
commit 0dadf38bbe
2 changed files with 95 additions and 104 deletions

View file

@ -489,7 +489,7 @@ namespace swrenderer
draw_segment->light = rw_light; draw_segment->light = rw_light;
draw_segment->lightstep = rw_lightstep; draw_segment->lightstep = rw_lightstep;
// Masked midtextures should get the light level from the sector they reference, // Masked mMiddlePart.Textures should get the light level from the sector they reference,
// not from the current subsector, which is what the current wallshade value // not from the current subsector, which is what the current wallshade value
// comes from. We make an exeption for polyobjects, however, since their "home" // comes from. We make an exeption for polyobjects, however, since their "home"
// sector should be whichever one they move into. // sector should be whichever one they move into.
@ -512,26 +512,12 @@ namespace swrenderer
// render it // render it
if (markceiling) if (markceiling)
{ {
if (mCeilingPlane) mCeilingPlane = Thread->PlaneList->GetRange(mCeilingPlane, start, stop);
{ // killough 4/11/98: add NULL ptr checks
mCeilingPlane = Thread->PlaneList->GetRange(mCeilingPlane, start, stop);
}
else
{
markceiling = false;
}
} }
if (markfloor) if (markfloor)
{ {
if (mFloorPlane) mFloorPlane = Thread->PlaneList->GetRange(mFloorPlane, start, stop);
{ // killough 4/11/98: add NULL ptr checks
mFloorPlane = Thread->PlaneList->GetRange(mFloorPlane, start, stop);
}
else
{
markfloor = false;
}
} }
RenderWallSegmentTextures(start, stop); RenderWallSegmentTextures(start, stop);
@ -576,6 +562,9 @@ namespace swrenderer
bool SWRenderLine::ShouldMarkFloor() const bool SWRenderLine::ShouldMarkFloor() const
{ {
if (!mFloorPlane)
return false;
// deep water check // deep water check
if (mFrontSector->GetHeightSec() == nullptr) if (mFrontSector->GetHeightSec() == nullptr)
{ {
@ -630,6 +619,9 @@ namespace swrenderer
bool SWRenderLine::ShouldMarkCeiling() const bool SWRenderLine::ShouldMarkCeiling() const
{ {
if (!mCeilingPlane)
return false;
// deep water check // deep water check
if (mFrontSector->GetHeightSec() == nullptr && mFrontSector->GetTexture(sector_t::ceiling) != skyflatnum) if (mFrontSector->GetHeightSec() == nullptr && mFrontSector->GetTexture(sector_t::ceiling) != skyflatnum)
{ {
@ -747,7 +739,9 @@ namespace swrenderer
markfloor = ShouldMarkFloor(); markfloor = ShouldMarkFloor();
markceiling = ShouldMarkCeiling(); markceiling = ShouldMarkCeiling();
midtexture = toptexture = bottomtexture = 0; mTopPart.Texture = nullptr;
mMiddlePart.Texture = nullptr;
mBottomPart.Texture = nullptr;
if (sidedef == linedef->sidedef[0] && if (sidedef == linedef->sidedef[0] &&
(linedef->special == Line_Mirror && r_drawmirrors)) // [ZZ] compatibility with r_drawmirrors cvar that existed way before portals (linedef->special == Line_Mirror && r_drawmirrors)) // [ZZ] compatibility with r_drawmirrors cvar that existed way before portals
@ -763,24 +757,24 @@ namespace swrenderer
} }
else if (linedef->special != Line_Horizon) else if (linedef->special != Line_Horizon)
{ {
midtexture = TexMan(sidedef->GetTexture(side_t::mid), true); mMiddlePart.Texture = TexMan(sidedef->GetTexture(side_t::mid), true);
rw_offset_mid = FLOAT2FIXED(sidedef->GetTextureXOffset(side_t::mid)); mMiddlePart.TextureOffsetU = FLOAT2FIXED(sidedef->GetTextureXOffset(side_t::mid));
double rowoffset = sidedef->GetTextureYOffset(side_t::mid); double rowoffset = sidedef->GetTextureYOffset(side_t::mid);
rw_midtexturescalex = sidedef->GetTextureXScale(side_t::mid); mMiddlePart.TextureScaleU = sidedef->GetTextureXScale(side_t::mid);
rw_midtexturescaley = sidedef->GetTextureYScale(side_t::mid); mMiddlePart.TextureScaleV = sidedef->GetTextureYScale(side_t::mid);
double yrepeat = midtexture->Scale.Y * rw_midtexturescaley; double yrepeat = mMiddlePart.Texture->Scale.Y * mMiddlePart.TextureScaleV;
if (yrepeat >= 0) if (yrepeat >= 0)
{ // normal orientation { // normal orientation
if (linedef->flags & ML_DONTPEGBOTTOM) if (linedef->flags & ML_DONTPEGBOTTOM)
{ // bottom of texture at bottom { // bottom of texture at bottom
rw_midtexturemid = (mFrontSector->GetPlaneTexZ(sector_t::floor) - ViewPos.Z) * yrepeat + midtexture->GetHeight(); mMiddlePart.TextureMid = (mFrontSector->GetPlaneTexZ(sector_t::floor) - ViewPos.Z) * yrepeat + mMiddlePart.Texture->GetHeight();
} }
else else
{ // top of texture at top { // top of texture at top
rw_midtexturemid = (mFrontSector->GetPlaneTexZ(sector_t::ceiling) - ViewPos.Z) * yrepeat; mMiddlePart.TextureMid = (mFrontSector->GetPlaneTexZ(sector_t::ceiling) - ViewPos.Z) * yrepeat;
if (rowoffset < 0 && midtexture != NULL) if (rowoffset < 0 && mMiddlePart.Texture != NULL)
{ {
rowoffset += midtexture->GetHeight(); rowoffset += mMiddlePart.Texture->GetHeight();
} }
} }
} }
@ -789,22 +783,22 @@ namespace swrenderer
rowoffset = -rowoffset; rowoffset = -rowoffset;
if (linedef->flags & ML_DONTPEGBOTTOM) if (linedef->flags & ML_DONTPEGBOTTOM)
{ // top of texture at bottom { // top of texture at bottom
rw_midtexturemid = (mFrontSector->GetPlaneTexZ(sector_t::floor) - ViewPos.Z) * yrepeat; mMiddlePart.TextureMid = (mFrontSector->GetPlaneTexZ(sector_t::floor) - ViewPos.Z) * yrepeat;
} }
else else
{ // bottom of texture at top { // bottom of texture at top
rw_midtexturemid = (mFrontSector->GetPlaneTexZ(sector_t::ceiling) - ViewPos.Z) * yrepeat + midtexture->GetHeight(); mMiddlePart.TextureMid = (mFrontSector->GetPlaneTexZ(sector_t::ceiling) - ViewPos.Z) * yrepeat + mMiddlePart.Texture->GetHeight();
} }
} }
if (midtexture->bWorldPanning) if (mMiddlePart.Texture->bWorldPanning)
{ {
rw_midtexturemid += rowoffset * yrepeat; mMiddlePart.TextureMid += rowoffset * yrepeat;
} }
else else
{ {
// rowoffset is added outside the multiply so that it positions the texture // rowoffset is added outside the multiply so that it positions the texture
// by texels instead of world units. // by texels instead of world units.
rw_midtexturemid += rowoffset; mMiddlePart.TextureMid += rowoffset;
} }
} }
} }
@ -838,26 +832,26 @@ namespace swrenderer
if (rw_havehigh) if (rw_havehigh)
{ // top texture { // top texture
toptexture = TexMan(sidedef->GetTexture(side_t::top), true); mTopPart.Texture = TexMan(sidedef->GetTexture(side_t::top), true);
rw_offset_top = FLOAT2FIXED(sidedef->GetTextureXOffset(side_t::top)); mTopPart.TextureOffsetU = FLOAT2FIXED(sidedef->GetTextureXOffset(side_t::top));
double rowoffset = sidedef->GetTextureYOffset(side_t::top); double rowoffset = sidedef->GetTextureYOffset(side_t::top);
rw_toptexturescalex = sidedef->GetTextureXScale(side_t::top); mTopPart.TextureScaleU = sidedef->GetTextureXScale(side_t::top);
rw_toptexturescaley = sidedef->GetTextureYScale(side_t::top); mTopPart.TextureScaleV = sidedef->GetTextureYScale(side_t::top);
double yrepeat = toptexture->Scale.Y * rw_toptexturescaley; double yrepeat = mTopPart.Texture->Scale.Y * mTopPart.TextureScaleV;
if (yrepeat >= 0) if (yrepeat >= 0)
{ // normal orientation { // normal orientation
if (linedef->flags & ML_DONTPEGTOP) if (linedef->flags & ML_DONTPEGTOP)
{ // top of texture at top { // top of texture at top
rw_toptexturemid = (mFrontSector->GetPlaneTexZ(sector_t::ceiling) - ViewPos.Z) * yrepeat; mTopPart.TextureMid = (mFrontSector->GetPlaneTexZ(sector_t::ceiling) - ViewPos.Z) * yrepeat;
if (rowoffset < 0 && toptexture != NULL) if (rowoffset < 0 && mTopPart.Texture != NULL)
{ {
rowoffset += toptexture->GetHeight(); rowoffset += mTopPart.Texture->GetHeight();
} }
} }
else else
{ // bottom of texture at bottom { // bottom of texture at bottom
rw_toptexturemid = (mBackSector->GetPlaneTexZ(sector_t::ceiling) - ViewPos.Z) * yrepeat + toptexture->GetHeight(); mTopPart.TextureMid = (mBackSector->GetPlaneTexZ(sector_t::ceiling) - ViewPos.Z) * yrepeat + mTopPart.Texture->GetHeight();
} }
} }
else else
@ -865,43 +859,43 @@ namespace swrenderer
rowoffset = -rowoffset; rowoffset = -rowoffset;
if (linedef->flags & ML_DONTPEGTOP) if (linedef->flags & ML_DONTPEGTOP)
{ // bottom of texture at top { // bottom of texture at top
rw_toptexturemid = (mFrontSector->GetPlaneTexZ(sector_t::ceiling) - ViewPos.Z) * yrepeat + toptexture->GetHeight(); mTopPart.TextureMid = (mFrontSector->GetPlaneTexZ(sector_t::ceiling) - ViewPos.Z) * yrepeat + mTopPart.Texture->GetHeight();
} }
else else
{ // top of texture at bottom { // top of texture at bottom
rw_toptexturemid = (mBackSector->GetPlaneTexZ(sector_t::ceiling) - ViewPos.Z) * yrepeat; mTopPart.TextureMid = (mBackSector->GetPlaneTexZ(sector_t::ceiling) - ViewPos.Z) * yrepeat;
} }
} }
if (toptexture->bWorldPanning) if (mTopPart.Texture->bWorldPanning)
{ {
rw_toptexturemid += rowoffset * yrepeat; mTopPart.TextureMid += rowoffset * yrepeat;
} }
else else
{ {
rw_toptexturemid += rowoffset; mTopPart.TextureMid += rowoffset;
} }
} }
if (rw_havelow) if (rw_havelow)
{ // bottom texture { // bottom texture
bottomtexture = TexMan(sidedef->GetTexture(side_t::bottom), true); mBottomPart.Texture = TexMan(sidedef->GetTexture(side_t::bottom), true);
rw_offset_bottom = FLOAT2FIXED(sidedef->GetTextureXOffset(side_t::bottom)); mBottomPart.TextureOffsetU = FLOAT2FIXED(sidedef->GetTextureXOffset(side_t::bottom));
double rowoffset = sidedef->GetTextureYOffset(side_t::bottom); double rowoffset = sidedef->GetTextureYOffset(side_t::bottom);
rw_bottomtexturescalex = sidedef->GetTextureXScale(side_t::bottom); mBottomPart.TextureScaleU = sidedef->GetTextureXScale(side_t::bottom);
rw_bottomtexturescaley = sidedef->GetTextureYScale(side_t::bottom); mBottomPart.TextureScaleV = sidedef->GetTextureYScale(side_t::bottom);
double yrepeat = bottomtexture->Scale.Y * rw_bottomtexturescaley; double yrepeat = mBottomPart.Texture->Scale.Y * mBottomPart.TextureScaleV;
if (yrepeat >= 0) if (yrepeat >= 0)
{ // normal orientation { // normal orientation
if (linedef->flags & ML_DONTPEGBOTTOM) if (linedef->flags & ML_DONTPEGBOTTOM)
{ // bottom of texture at bottom { // bottom of texture at bottom
rw_bottomtexturemid = (rw_frontlowertop - ViewPos.Z) * yrepeat; mBottomPart.TextureMid = (rw_frontlowertop - ViewPos.Z) * yrepeat;
} }
else else
{ // top of texture at top { // top of texture at top
rw_bottomtexturemid = (mBackSector->GetPlaneTexZ(sector_t::floor) - ViewPos.Z) * yrepeat; mBottomPart.TextureMid = (mBackSector->GetPlaneTexZ(sector_t::floor) - ViewPos.Z) * yrepeat;
if (rowoffset < 0 && bottomtexture != NULL) if (rowoffset < 0 && mBottomPart.Texture != NULL)
{ {
rowoffset += bottomtexture->GetHeight(); rowoffset += mBottomPart.Texture->GetHeight();
} }
} }
} }
@ -910,35 +904,35 @@ namespace swrenderer
rowoffset = -rowoffset; rowoffset = -rowoffset;
if (linedef->flags & ML_DONTPEGBOTTOM) if (linedef->flags & ML_DONTPEGBOTTOM)
{ // top of texture at bottom { // top of texture at bottom
rw_bottomtexturemid = (rw_frontlowertop - ViewPos.Z) * yrepeat; mBottomPart.TextureMid = (rw_frontlowertop - ViewPos.Z) * yrepeat;
} }
else else
{ // bottom of texture at top { // bottom of texture at top
rw_bottomtexturemid = (mBackSector->GetPlaneTexZ(sector_t::floor) - ViewPos.Z) * yrepeat + bottomtexture->GetHeight(); mBottomPart.TextureMid = (mBackSector->GetPlaneTexZ(sector_t::floor) - ViewPos.Z) * yrepeat + mBottomPart.Texture->GetHeight();
} }
} }
if (bottomtexture->bWorldPanning) if (mBottomPart.Texture->bWorldPanning)
{ {
rw_bottomtexturemid += rowoffset * yrepeat; mBottomPart.TextureMid += rowoffset * yrepeat;
} }
else else
{ {
rw_bottomtexturemid += rowoffset; mBottomPart.TextureMid += rowoffset;
} }
} }
} }
FTexture *midtex = TexMan(sidedef->GetTexture(side_t::mid), true); FTexture *midtex = TexMan(sidedef->GetTexture(side_t::mid), true);
bool segtextured = midtex != NULL || toptexture != NULL || bottomtexture != NULL; bool segtextured = midtex != NULL || mTopPart.Texture != NULL || mBottomPart.Texture != NULL;
// calculate light table // calculate light table
if (needlights && (segtextured || (mBackSector && IsFogBoundary(mFrontSector, mBackSector)))) if (needlights && (segtextured || (mBackSector && IsFogBoundary(mFrontSector, mBackSector))))
{ {
lwallscale = lwallscale =
midtex ? (midtex->Scale.X * sidedef->GetTextureXScale(side_t::mid)) : midtex ? (midtex->Scale.X * sidedef->GetTextureXScale(side_t::mid)) :
toptexture ? (toptexture->Scale.X * sidedef->GetTextureXScale(side_t::top)) : mTopPart.Texture ? (mTopPart.Texture->Scale.X * sidedef->GetTextureXScale(side_t::top)) :
bottomtexture ? (bottomtexture->Scale.X * sidedef->GetTextureXScale(side_t::bottom)) : mBottomPart.Texture ? (mBottomPart.Texture->Scale.X * sidedef->GetTextureXScale(side_t::bottom)) :
1.; 1.;
walltexcoords.Project(sidedef->TexelLength * lwallscale, WallC.sx1, WallC.sx2, WallT); walltexcoords.Project(sidedef->TexelLength * lwallscale, WallC.sx1, WallC.sx2, WallT);
@ -1066,25 +1060,25 @@ namespace swrenderer
FLightNode *light_list = (mLineSegment && mLineSegment->sidedef) ? mLineSegment->sidedef->lighthead : nullptr; FLightNode *light_list = (mLineSegment && mLineSegment->sidedef) ? mLineSegment->sidedef->lighthead : nullptr;
// draw the wall tiers // draw the wall tiers
if (midtexture) if (mMiddlePart.Texture)
{ // one sided line { // one sided line
if (midtexture->UseType != FTexture::TEX_Null && viewactive) if (mMiddlePart.Texture->UseType != FTexture::TEX_Null && viewactive)
{ {
FTexture *rw_pic = midtexture; FTexture *rw_pic = mMiddlePart.Texture;
xscale = rw_pic->Scale.X * rw_midtexturescalex; xscale = rw_pic->Scale.X * mMiddlePart.TextureScaleU;
yscale = rw_pic->Scale.Y * rw_midtexturescaley; yscale = rw_pic->Scale.Y * mMiddlePart.TextureScaleV;
if (xscale != lwallscale) if (xscale != lwallscale)
{ {
walltexcoords.ProjectPos(mLineSegment->sidedef->TexelLength*xscale, WallC.sx1, WallC.sx2, WallT); walltexcoords.ProjectPos(mLineSegment->sidedef->TexelLength*xscale, WallC.sx1, WallC.sx2, WallT);
lwallscale = xscale; lwallscale = xscale;
} }
if (midtexture->bWorldPanning) if (mMiddlePart.Texture->bWorldPanning)
{ {
rw_offset = xs_RoundToInt(rw_offset_mid * xscale); rw_offset = xs_RoundToInt(mMiddlePart.TextureOffsetU * xscale);
} }
else else
{ {
rw_offset = rw_offset_mid; rw_offset = mMiddlePart.TextureOffsetU;
} }
if (xscale < 0) if (xscale < 0)
{ {
@ -1092,14 +1086,14 @@ namespace swrenderer
} }
RenderWallPart renderWallpart(Thread); RenderWallPart renderWallpart(Thread);
renderWallpart.Render(drawerargs, mFrontSector, mLineSegment, WallC, rw_pic, x1, x2, walltop.ScreenY, wallbottom.ScreenY, rw_midtexturemid, walltexcoords.VStep, walltexcoords.UPos, yscale, MAX(mFrontCeilingZ1, mFrontCeilingZ2), MIN(mFrontFloorZ1, mFrontFloorZ2), false, wallshade, rw_offset, rw_light, rw_lightstep, light_list, foggy, basecolormap); renderWallpart.Render(drawerargs, mFrontSector, mLineSegment, WallC, rw_pic, x1, x2, walltop.ScreenY, wallbottom.ScreenY, mMiddlePart.TextureMid, walltexcoords.VStep, walltexcoords.UPos, yscale, MAX(mFrontCeilingZ1, mFrontCeilingZ2), MIN(mFrontFloorZ1, mFrontFloorZ2), false, wallshade, rw_offset, rw_light, rw_lightstep, light_list, foggy, basecolormap);
} }
fillshort(ceilingclip + x1, x2 - x1, viewheight); fillshort(ceilingclip + x1, x2 - x1, viewheight);
fillshort(floorclip + x1, x2 - x1, 0xffff); fillshort(floorclip + x1, x2 - x1, 0xffff);
} }
else else
{ // two sided line { // two sided line
if (toptexture != NULL && toptexture->UseType != FTexture::TEX_Null) if (mTopPart.Texture != NULL && mTopPart.Texture->UseType != FTexture::TEX_Null)
{ // top wall { // top wall
for (x = x1; x < x2; ++x) for (x = x1; x < x2; ++x)
{ {
@ -1107,21 +1101,21 @@ namespace swrenderer
} }
if (viewactive) if (viewactive)
{ {
FTexture *rw_pic = toptexture; FTexture *rw_pic = mTopPart.Texture;
xscale = rw_pic->Scale.X * rw_toptexturescalex; xscale = rw_pic->Scale.X * mTopPart.TextureScaleU;
yscale = rw_pic->Scale.Y * rw_toptexturescaley; yscale = rw_pic->Scale.Y * mTopPart.TextureScaleV;
if (xscale != lwallscale) if (xscale != lwallscale)
{ {
walltexcoords.ProjectPos(mLineSegment->sidedef->TexelLength*xscale, WallC.sx1, WallC.sx2, WallT); walltexcoords.ProjectPos(mLineSegment->sidedef->TexelLength*xscale, WallC.sx1, WallC.sx2, WallT);
lwallscale = xscale; lwallscale = xscale;
} }
if (toptexture->bWorldPanning) if (mTopPart.Texture->bWorldPanning)
{ {
rw_offset = xs_RoundToInt(rw_offset_top * xscale); rw_offset = xs_RoundToInt(mTopPart.TextureOffsetU * xscale);
} }
else else
{ {
rw_offset = rw_offset_top; rw_offset = mTopPart.TextureOffsetU;
} }
if (xscale < 0) if (xscale < 0)
{ {
@ -1129,7 +1123,7 @@ namespace swrenderer
} }
RenderWallPart renderWallpart(Thread); RenderWallPart renderWallpart(Thread);
renderWallpart.Render(drawerargs, mFrontSector, mLineSegment, WallC, rw_pic, x1, x2, walltop.ScreenY, wallupper.ScreenY, rw_toptexturemid, walltexcoords.VStep, walltexcoords.UPos, yscale, MAX(mFrontCeilingZ1, mFrontCeilingZ2), MIN(mBackCeilingZ1, mBackCeilingZ2), false, wallshade, rw_offset, rw_light, rw_lightstep, light_list, foggy, basecolormap); renderWallpart.Render(drawerargs, mFrontSector, mLineSegment, WallC, rw_pic, x1, x2, walltop.ScreenY, wallupper.ScreenY, mTopPart.TextureMid, walltexcoords.VStep, walltexcoords.UPos, yscale, MAX(mFrontCeilingZ1, mFrontCeilingZ2), MIN(mBackCeilingZ1, mBackCeilingZ2), false, wallshade, rw_offset, rw_light, rw_lightstep, light_list, foggy, basecolormap);
} }
memcpy(ceilingclip + x1, wallupper.ScreenY + x1, (x2 - x1) * sizeof(short)); memcpy(ceilingclip + x1, wallupper.ScreenY + x1, (x2 - x1) * sizeof(short));
} }
@ -1139,7 +1133,7 @@ namespace swrenderer
} }
if (bottomtexture != NULL && bottomtexture->UseType != FTexture::TEX_Null) if (mBottomPart.Texture != NULL && mBottomPart.Texture->UseType != FTexture::TEX_Null)
{ // bottom wall { // bottom wall
for (x = x1; x < x2; ++x) for (x = x1; x < x2; ++x)
{ {
@ -1147,21 +1141,21 @@ namespace swrenderer
} }
if (viewactive) if (viewactive)
{ {
FTexture *rw_pic = bottomtexture; FTexture *rw_pic = mBottomPart.Texture;
xscale = rw_pic->Scale.X * rw_bottomtexturescalex; xscale = rw_pic->Scale.X * mBottomPart.TextureScaleU;
yscale = rw_pic->Scale.Y * rw_bottomtexturescaley; yscale = rw_pic->Scale.Y * mBottomPart.TextureScaleV;
if (xscale != lwallscale) if (xscale != lwallscale)
{ {
walltexcoords.ProjectPos(mLineSegment->sidedef->TexelLength*xscale, WallC.sx1, WallC.sx2, WallT); walltexcoords.ProjectPos(mLineSegment->sidedef->TexelLength*xscale, WallC.sx1, WallC.sx2, WallT);
lwallscale = xscale; lwallscale = xscale;
} }
if (bottomtexture->bWorldPanning) if (mBottomPart.Texture->bWorldPanning)
{ {
rw_offset = xs_RoundToInt(rw_offset_bottom * xscale); rw_offset = xs_RoundToInt(mBottomPart.TextureOffsetU * xscale);
} }
else else
{ {
rw_offset = rw_offset_bottom; rw_offset = mBottomPart.TextureOffsetU;
} }
if (xscale < 0) if (xscale < 0)
{ {
@ -1169,7 +1163,7 @@ namespace swrenderer
} }
RenderWallPart renderWallpart(Thread); RenderWallPart renderWallpart(Thread);
renderWallpart.Render(drawerargs, mFrontSector, mLineSegment, WallC, rw_pic, x1, x2, walllower.ScreenY, wallbottom.ScreenY, rw_bottomtexturemid, walltexcoords.VStep, walltexcoords.UPos, yscale, MAX(mBackFloorZ1, mBackFloorZ2), MIN(mFrontFloorZ1, mFrontFloorZ2), false, wallshade, rw_offset, rw_light, rw_lightstep, light_list, foggy, basecolormap); renderWallpart.Render(drawerargs, mFrontSector, mLineSegment, WallC, rw_pic, x1, x2, walllower.ScreenY, wallbottom.ScreenY, mBottomPart.TextureMid, walltexcoords.VStep, walltexcoords.UPos, yscale, MAX(mBackFloorZ1, mBackFloorZ2), MIN(mFrontFloorZ1, mFrontFloorZ2), false, wallshade, rw_offset, rw_light, rw_lightstep, light_list, foggy, basecolormap);
} }
memcpy(floorclip + x1, walllower.ScreenY + x1, (x2 - x1) * sizeof(short)); memcpy(floorclip + x1, walllower.ScreenY + x1, (x2 - x1) * sizeof(short));
} }

View file

@ -49,6 +49,15 @@ namespace swrenderer
void InitFromLine(RenderThread *thread, const DVector2 &left, const DVector2 &right); void InitFromLine(RenderThread *thread, const DVector2 &left, const DVector2 &right);
}; };
struct WallPartTexture
{
fixed_t TextureOffsetU;
double TextureMid;
double TextureScaleU;
double TextureScaleV;
FTexture *Texture;
};
class SWRenderLine : VisibleSegmentRenderer class SWRenderLine : VisibleSegmentRenderer
{ {
public: public:
@ -101,10 +110,6 @@ namespace swrenderer
// Wall segment variables: // Wall segment variables:
fixed_t rw_offset_top;
fixed_t rw_offset_mid;
fixed_t rw_offset_bottom;
bool rw_prepped; bool rw_prepped;
int wallshade; int wallshade;
@ -114,21 +119,13 @@ namespace swrenderer
double lwallscale; double lwallscale;
fixed_t rw_offset; fixed_t rw_offset;
double rw_midtexturemid;
double rw_toptexturemid;
double rw_bottomtexturemid;
double rw_midtexturescalex;
double rw_midtexturescaley;
double rw_toptexturescalex;
double rw_toptexturescaley;
double rw_bottomtexturescalex;
double rw_bottomtexturescaley;
bool markfloor; // False if the back side is the same plane. bool markfloor; // False if the back side is the same plane.
bool markceiling; bool markceiling;
FTexture *toptexture;
FTexture *bottomtexture; WallPartTexture mTopPart;
FTexture *midtexture; WallPartTexture mMiddlePart;
WallPartTexture mBottomPart;
ProjectedWallCull mCeilingClipped; ProjectedWallCull mCeilingClipped;
ProjectedWallCull mFloorClipped; ProjectedWallCull mFloorClipped;