mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2024-11-10 23:01:59 +00:00
- Improve wall texture coordinates in softpoly
This commit is contained in:
parent
ce0547aacb
commit
aca628acaf
2 changed files with 63 additions and 43 deletions
|
@ -88,9 +88,12 @@ bool RenderPolyWall::RenderLine(const TriMatrix &worldToClip, const PolyClipPlan
|
|||
if (line->sidedef)
|
||||
{
|
||||
wall.SetCoords(line->v1->fPos(), line->v2->fPos(), frontceilz1, frontfloorz1, frontceilz2, frontfloorz2);
|
||||
wall.TopZ = frontceilz1;
|
||||
wall.BottomZ = frontfloorz1;
|
||||
wall.UnpeggedCeil = frontceilz1;
|
||||
wall.TopZ1 = frontceilz1;
|
||||
wall.TopZ2 = frontceilz2;
|
||||
wall.BottomZ1 = frontfloorz1;
|
||||
wall.BottomZ2 = frontfloorz2;
|
||||
wall.UnpeggedCeil1 = frontceilz1;
|
||||
wall.UnpeggedCeil2 = frontceilz2;
|
||||
wall.Texpart = side_t::mid;
|
||||
wall.Polyportal = polyportal;
|
||||
wall.Render(worldToClip, clipPlane, cull);
|
||||
|
@ -125,9 +128,12 @@ bool RenderPolyWall::RenderLine(const TriMatrix &worldToClip, const PolyClipPlan
|
|||
if ((topceilz1 > topfloorz1 || topceilz2 > topfloorz2) && line->sidedef && !bothSkyCeiling)
|
||||
{
|
||||
wall.SetCoords(line->v1->fPos(), line->v2->fPos(), topceilz1, topfloorz1, topceilz2, topfloorz2);
|
||||
wall.TopZ = topceilz1;
|
||||
wall.BottomZ = topfloorz1;
|
||||
wall.UnpeggedCeil = topceilz1;
|
||||
wall.TopZ1 = topceilz1;
|
||||
wall.TopZ2 = topceilz2;
|
||||
wall.BottomZ1 = topfloorz1;
|
||||
wall.BottomZ2 = topfloorz2;
|
||||
wall.UnpeggedCeil1 = topceilz1;
|
||||
wall.UnpeggedCeil2 = topceilz2;
|
||||
wall.Texpart = side_t::top;
|
||||
wall.Render(worldToClip, clipPlane, cull);
|
||||
}
|
||||
|
@ -135,9 +141,12 @@ bool RenderPolyWall::RenderLine(const TriMatrix &worldToClip, const PolyClipPlan
|
|||
if ((bottomfloorz1 < bottomceilz1 || bottomfloorz2 < bottomceilz2) && line->sidedef && !bothSkyFloor)
|
||||
{
|
||||
wall.SetCoords(line->v1->fPos(), line->v2->fPos(), bottomceilz1, bottomfloorz1, bottomceilz2, bottomfloorz2);
|
||||
wall.TopZ = bottomceilz1;
|
||||
wall.BottomZ = bottomfloorz2;
|
||||
wall.UnpeggedCeil = topceilz1;
|
||||
wall.TopZ1 = bottomceilz1;
|
||||
wall.TopZ2 = bottomceilz2;
|
||||
wall.BottomZ1 = bottomfloorz1;
|
||||
wall.BottomZ2 = bottomfloorz2;
|
||||
wall.UnpeggedCeil1 = topceilz1;
|
||||
wall.UnpeggedCeil2 = topceilz2;
|
||||
wall.Texpart = side_t::bottom;
|
||||
wall.Render(worldToClip, clipPlane, cull);
|
||||
}
|
||||
|
@ -145,9 +154,12 @@ bool RenderPolyWall::RenderLine(const TriMatrix &worldToClip, const PolyClipPlan
|
|||
if (line->sidedef)
|
||||
{
|
||||
wall.SetCoords(line->v1->fPos(), line->v2->fPos(), middleceilz1, middlefloorz1, middleceilz2, middlefloorz2);
|
||||
wall.TopZ = middleceilz1;
|
||||
wall.BottomZ = middlefloorz1;
|
||||
wall.UnpeggedCeil = topceilz1;
|
||||
wall.TopZ1 = middleceilz1;
|
||||
wall.TopZ2 = middleceilz2;
|
||||
wall.BottomZ1 = middlefloorz1;
|
||||
wall.BottomZ2 = middlefloorz2;
|
||||
wall.UnpeggedCeil1 = topceilz1;
|
||||
wall.UnpeggedCeil2 = topceilz2;
|
||||
wall.Texpart = side_t::mid;
|
||||
wall.Masked = true;
|
||||
|
||||
|
@ -181,9 +193,12 @@ void RenderPolyWall::Render3DFloorLine(const TriMatrix &worldToClip, const PolyC
|
|||
wall.SubsectorDepth = subsectorDepth;
|
||||
wall.StencilValue = stencilValue;
|
||||
wall.SetCoords(line->v1->fPos(), line->v2->fPos(), frontceilz1, frontfloorz1, frontceilz2, frontfloorz2);
|
||||
wall.TopZ = frontceilz1;
|
||||
wall.BottomZ = frontfloorz1;
|
||||
wall.UnpeggedCeil = frontceilz1;
|
||||
wall.TopZ1 = frontceilz1;
|
||||
wall.TopZ2 = frontceilz2;
|
||||
wall.BottomZ1 = frontfloorz1;
|
||||
wall.BottomZ2 = frontfloorz2;
|
||||
wall.UnpeggedCeil1 = frontceilz1;
|
||||
wall.UnpeggedCeil2 = frontceilz2;
|
||||
wall.Texpart = side_t::mid;
|
||||
wall.Render(worldToClip, clipPlane, cull);
|
||||
}
|
||||
|
@ -229,15 +244,17 @@ void RenderPolyWall::Render(const TriMatrix &worldToClip, const PolyClipPlane &c
|
|||
|
||||
if (tex)
|
||||
{
|
||||
PolyWallTextureCoords texcoords(tex, LineSeg, Line, Side, Texpart, TopZ, BottomZ, UnpeggedCeil);
|
||||
vertices[0].u = (float)texcoords.u1;
|
||||
vertices[0].v = (float)texcoords.v1;
|
||||
vertices[1].u = (float)texcoords.u2;
|
||||
vertices[1].v = (float)texcoords.v1;
|
||||
vertices[2].u = (float)texcoords.u2;
|
||||
vertices[2].v = (float)texcoords.v2;
|
||||
vertices[3].u = (float)texcoords.u1;
|
||||
vertices[3].v = (float)texcoords.v2;
|
||||
PolyWallTextureCoordsU texcoordsU(tex, LineSeg, Line, Side, Texpart);
|
||||
PolyWallTextureCoordsV texcoordsVLeft(tex, Line, Side, Texpart, TopZ1, BottomZ1, UnpeggedCeil1);
|
||||
PolyWallTextureCoordsV texcoordsVRght(tex, Line, Side, Texpart, TopZ2, BottomZ2, UnpeggedCeil2);
|
||||
vertices[0].u = (float)texcoordsU.u1;
|
||||
vertices[0].v = (float)texcoordsVLeft.v1;
|
||||
vertices[1].u = (float)texcoordsU.u2;
|
||||
vertices[1].v = (float)texcoordsVRght.v1;
|
||||
vertices[2].u = (float)texcoordsU.u2;
|
||||
vertices[2].v = (float)texcoordsVRght.v2;
|
||||
vertices[3].u = (float)texcoordsU.u1;
|
||||
vertices[3].v = (float)texcoordsVLeft.v2;
|
||||
}
|
||||
|
||||
// Masked walls clamp to the 0-1 range (no texture repeat)
|
||||
|
@ -356,13 +373,7 @@ int RenderPolyWall::GetLightLevel()
|
|||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
PolyWallTextureCoords::PolyWallTextureCoords(FTexture *tex, const seg_t *lineseg, const line_t *line, const side_t *side, side_t::ETexpart texpart, double topz, double bottomz, double unpeggedceil)
|
||||
{
|
||||
CalcU(tex, lineseg, line, side, texpart);
|
||||
CalcV(tex, line, side, texpart, topz, bottomz, unpeggedceil);
|
||||
}
|
||||
|
||||
void PolyWallTextureCoords::CalcU(FTexture *tex, const seg_t *lineseg, const line_t *line, const side_t *side, side_t::ETexpart texpart)
|
||||
PolyWallTextureCoordsU::PolyWallTextureCoordsU(FTexture *tex, const seg_t *lineseg, const line_t *line, const side_t *side, side_t::ETexpart texpart)
|
||||
{
|
||||
double lineLength = side->TexelLength;
|
||||
double lineStart = 0.0;
|
||||
|
@ -384,7 +395,9 @@ void PolyWallTextureCoords::CalcU(FTexture *tex, const seg_t *lineseg, const lin
|
|||
u2 /= texWidth;
|
||||
}
|
||||
|
||||
void PolyWallTextureCoords::CalcV(FTexture *tex, const line_t *line, const side_t *side, side_t::ETexpart texpart, double topz, double bottomz, double unpeggedceil)
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
PolyWallTextureCoordsV::PolyWallTextureCoordsV(FTexture *tex, const line_t *line, const side_t *side, side_t::ETexpart texpart, double topz, double bottomz, double unpeggedceil)
|
||||
{
|
||||
double vscale = side->GetTextureYScale(texpart) * tex->Scale.Y;
|
||||
|
||||
|
@ -411,7 +424,7 @@ void PolyWallTextureCoords::CalcV(FTexture *tex, const line_t *line, const side_
|
|||
v2 /= texHeight;
|
||||
}
|
||||
|
||||
void PolyWallTextureCoords::CalcVTopPart(FTexture *tex, const line_t *line, const side_t *side, double topz, double bottomz, double vscale, double yoffset)
|
||||
void PolyWallTextureCoordsV::CalcVTopPart(FTexture *tex, const line_t *line, const side_t *side, double topz, double bottomz, double vscale, double yoffset)
|
||||
{
|
||||
bool pegged = (line->flags & ML_DONTPEGTOP) == 0;
|
||||
if (pegged) // bottom to top
|
||||
|
@ -434,7 +447,7 @@ void PolyWallTextureCoords::CalcVTopPart(FTexture *tex, const line_t *line, cons
|
|||
}
|
||||
}
|
||||
|
||||
void PolyWallTextureCoords::CalcVMidPart(FTexture *tex, const line_t *line, const side_t *side, double topz, double bottomz, double vscale, double yoffset)
|
||||
void PolyWallTextureCoordsV::CalcVMidPart(FTexture *tex, const line_t *line, const side_t *side, double topz, double bottomz, double vscale, double yoffset)
|
||||
{
|
||||
bool pegged = (line->flags & ML_DONTPEGBOTTOM) == 0;
|
||||
if (pegged) // top to bottom
|
||||
|
@ -450,7 +463,7 @@ void PolyWallTextureCoords::CalcVMidPart(FTexture *tex, const line_t *line, cons
|
|||
}
|
||||
}
|
||||
|
||||
void PolyWallTextureCoords::CalcVBottomPart(FTexture *tex, const line_t *line, const side_t *side, double topz, double bottomz, double unpeggedceil, double vscale, double yoffset)
|
||||
void PolyWallTextureCoordsV::CalcVBottomPart(FTexture *tex, const line_t *line, const side_t *side, double topz, double bottomz, double unpeggedceil, double vscale, double yoffset)
|
||||
{
|
||||
bool pegged = (line->flags & ML_DONTPEGBOTTOM) == 0;
|
||||
if (pegged) // top to bottom
|
||||
|
|
|
@ -48,9 +48,12 @@ public:
|
|||
const line_t *Line = nullptr;
|
||||
const side_t *Side = nullptr;
|
||||
side_t::ETexpart Texpart = side_t::mid;
|
||||
double TopZ = 0.0;
|
||||
double BottomZ = 0.0;
|
||||
double UnpeggedCeil = 0.0;
|
||||
double TopZ1 = 0.0;
|
||||
double TopZ2 = 0.0;
|
||||
double BottomZ1 = 0.0;
|
||||
double BottomZ2 = 0.0;
|
||||
double UnpeggedCeil1 = 0.0;
|
||||
double UnpeggedCeil2 = 0.0;
|
||||
FSWColormap *Colormap = nullptr;
|
||||
bool Masked = false;
|
||||
uint32_t SubsectorDepth = 0;
|
||||
|
@ -63,18 +66,22 @@ private:
|
|||
int GetLightLevel();
|
||||
};
|
||||
|
||||
// Texture coordinates for a wall
|
||||
class PolyWallTextureCoords
|
||||
class PolyWallTextureCoordsU
|
||||
{
|
||||
public:
|
||||
PolyWallTextureCoords(FTexture *tex, const seg_t *lineseg, const line_t *line, const side_t *side, side_t::ETexpart texpart, double topz, double bottomz, double unpeggedceil);
|
||||
PolyWallTextureCoordsU(FTexture *tex, const seg_t *lineseg, const line_t *line, const side_t *side, side_t::ETexpart texpart);
|
||||
|
||||
double u1, u2;
|
||||
};
|
||||
|
||||
class PolyWallTextureCoordsV
|
||||
{
|
||||
public:
|
||||
PolyWallTextureCoordsV(FTexture *tex, const line_t *line, const side_t *side, side_t::ETexpart texpart, double topz, double bottomz, double unpeggedceil);
|
||||
|
||||
double v1, v2;
|
||||
|
||||
private:
|
||||
void CalcU(FTexture *tex, const seg_t *lineseg, const line_t *line, const side_t *side, side_t::ETexpart texpart);
|
||||
void CalcV(FTexture *tex, const line_t *line, const side_t *side, side_t::ETexpart texpart, double topz, double bottomz, double unpeggedceil);
|
||||
void CalcVTopPart(FTexture *tex, const line_t *line, const side_t *side, double topz, double bottomz, double vscale, double yoffset);
|
||||
void CalcVMidPart(FTexture *tex, const line_t *line, const side_t *side, double topz, double bottomz, double vscale, double yoffset);
|
||||
void CalcVBottomPart(FTexture *tex, const line_t *line, const side_t *side, double topz, double bottomz, double unpeggedceil, double vscale, double yoffset);
|
||||
|
|
Loading…
Reference in a new issue