mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-22 20:21:26 +00:00
- refactored FDynamicColormap out of sector_t.
This has increasingly become an obstacle with the hardware renderer, so now the values are being stored as plain data in the sector, with the software renderer getting the actual color tables when needed. While this is a bit slower than storing the pregenerated colormap, in realistic situations the added time is mostly negligible in the microseconds range.
This commit is contained in:
parent
a2fc2fb707
commit
9a24771a7d
55 changed files with 386 additions and 326 deletions
|
@ -1936,7 +1936,7 @@ sector_t * AM_FakeFlat(AActor *viewer, sector_t * sec, sector_t * dest)
|
|||
{
|
||||
if (in_area == -1)
|
||||
{
|
||||
dest->ColorMap = s->ColorMap;
|
||||
dest->Colormap = s->Colormap;
|
||||
if (!(s->MoreFlags & SECF_NOFAKELIGHT))
|
||||
{
|
||||
dest->lightlevel = s->lightlevel;
|
||||
|
@ -1956,7 +1956,7 @@ sector_t * AM_FakeFlat(AActor *viewer, sector_t * sec, sector_t * dest)
|
|||
|
||||
if (in_area == -1)
|
||||
{
|
||||
dest->ColorMap = s->ColorMap;
|
||||
dest->Colormap = s->Colormap;
|
||||
dest->SetPlaneTexZ(sector_t::floor, sec->GetPlaneTexZ(sector_t::floor));
|
||||
dest->floorplane = sec->floorplane;
|
||||
if (!(s->MoreFlags & SECF_NOFAKELIGHT))
|
||||
|
@ -1975,7 +1975,7 @@ sector_t * AM_FakeFlat(AActor *viewer, sector_t * sec, sector_t * dest)
|
|||
}
|
||||
else if (in_area == 1)
|
||||
{
|
||||
dest->ColorMap = s->ColorMap;
|
||||
dest->Colormap = s->Colormap;
|
||||
dest->SetPlaneTexZ(sector_t::floor, s->GetPlaneTexZ(sector_t::ceiling));
|
||||
dest->floorplane = s->ceilingplane;
|
||||
if (!(s->MoreFlags & SECF_NOFAKELIGHT))
|
||||
|
@ -2016,7 +2016,7 @@ void AM_drawSubsectors()
|
|||
int floorlight;
|
||||
double scalex, scaley;
|
||||
double originx, originy;
|
||||
FDynamicColormap *colormap;
|
||||
FColormap colormap;
|
||||
PalEntry flatcolor;
|
||||
mpoint_t originpt;
|
||||
|
||||
|
@ -2058,7 +2058,7 @@ void AM_drawSubsectors()
|
|||
originpt.y = sec->GetYOffset(sector_t::floor);
|
||||
rotation = -sec->GetAngle(sector_t::floor);
|
||||
// Coloring for the polygon
|
||||
colormap = sec->ColorMap;
|
||||
colormap = sec->Colormap;
|
||||
|
||||
FTextureID maptex = sec->GetTexture(sector_t::floor);
|
||||
flatcolor = sec->SpecialColors[sector_t::floor];
|
||||
|
@ -2150,14 +2150,11 @@ void AM_drawSubsectors()
|
|||
// to see it on the map), tint and desaturate it.
|
||||
if (!(subsectors[i].flags & SSECF_DRAWN))
|
||||
{
|
||||
colormap = GetSpecialLights(
|
||||
MAKERGB(
|
||||
(colormap->Color.r + 255) / 2,
|
||||
(colormap->Color.g + 200) / 2,
|
||||
(colormap->Color.b + 160) / 2),
|
||||
colormap->Fade,
|
||||
255 - (255 - colormap->Desaturate) / 4);
|
||||
floorlight = (floorlight + 200 * 15) / 16;
|
||||
colormap.LightColor = PalEntry(
|
||||
(colormap.LightColor.r + 255) / 2,
|
||||
(colormap.LightColor.g + 200) / 2,
|
||||
(colormap.LightColor.b + 160) / 2);
|
||||
colormap.Desaturation = 255 - (255 - colormap.Desaturation) / 4;
|
||||
}
|
||||
|
||||
// Draw the polygon.
|
||||
|
|
|
@ -120,6 +120,18 @@ struct PalEntry
|
|||
PalEntry () {}
|
||||
PalEntry (uint32_t argb) { d = argb; }
|
||||
operator uint32_t () const { return d; }
|
||||
void SetRGB(PalEntry other)
|
||||
{
|
||||
d = other.d & 0xffffff;
|
||||
}
|
||||
bool isBlack() const
|
||||
{
|
||||
return (d & 0xffffff) == 0;
|
||||
}
|
||||
bool isWhite() const
|
||||
{
|
||||
return (d & 0xffffff) == 0xffffff;
|
||||
}
|
||||
PalEntry &operator= (uint32_t other) { d = other; return *this; }
|
||||
PalEntry InverseColor() const { PalEntry nc; nc.a = a; nc.r = 255 - r; nc.g = 255 - g; nc.b = 255 - b; return nc; }
|
||||
#ifdef __BIG_ENDIAN__
|
||||
|
|
|
@ -3885,7 +3885,9 @@ void FParser::SF_SetColor(void)
|
|||
while ((i = itr.Next()) >= 0)
|
||||
{
|
||||
if (!DFraggleThinker::ActiveThinker->setcolormaterial)
|
||||
level.sectors[i].ColorMap = GetSpecialLights(color, level.sectors[i].ColorMap->Fade, 0);
|
||||
{
|
||||
level.sectors[i].SetColor(color.r, color.g, color.b, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
// little hack for testing the D64 color stuff.
|
||||
|
|
|
@ -327,6 +327,11 @@ bool FScriptLoader::ParseInfo(MapData * map)
|
|||
DFraggleThinker::ActiveThinker->nocheckposition = opt->nocheckposition;
|
||||
DFraggleThinker::ActiveThinker->setcolormaterial = opt->setcolormaterial;
|
||||
}
|
||||
else
|
||||
{
|
||||
DFraggleThinker::ActiveThinker->nocheckposition = false;
|
||||
DFraggleThinker::ActiveThinker->setcolormaterial = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -694,8 +694,8 @@ public:
|
|||
TObjPtr<DFsScript*> LevelScript;
|
||||
TObjPtr<DRunningScript*> RunningScripts;
|
||||
TArray<TObjPtr<AActor*> > SpawnedThings;
|
||||
bool nocheckposition;
|
||||
bool setcolormaterial;
|
||||
bool nocheckposition = false;
|
||||
bool setcolormaterial = false;
|
||||
|
||||
DFraggleThinker();
|
||||
void OnDestroy() override;
|
||||
|
|
|
@ -485,7 +485,7 @@ static bool gl_CheckFog(FColormap *cm, int lightlevel)
|
|||
{
|
||||
frontfog = true;
|
||||
}
|
||||
else if (level.fogdensity != 0 || (glset.lightmode & 4) || cm->fogdensity > 0)
|
||||
else if (level.fogdensity != 0 || (glset.lightmode & 4) || cm->FogDensity > 0)
|
||||
{
|
||||
// case 3: level has fog density set
|
||||
frontfog = true;
|
||||
|
@ -568,7 +568,7 @@ void GLWall::RenderFogBoundaryCompat()
|
|||
{
|
||||
// without shaders some approximation is needed. This won't look as good
|
||||
// as the shader version but it's an acceptable compromise.
|
||||
float fogdensity = gl_GetFogDensity(lightlevel, Colormap.FadeColor, Colormap.fogdensity);
|
||||
float fogdensity = gl_GetFogDensity(lightlevel, Colormap.FadeColor, Colormap.FogDensity);
|
||||
|
||||
float dist1 = Dist2(r_viewpoint.Pos.X, r_viewpoint.Pos.Y, glseg.x1, glseg.y1);
|
||||
float dist2 = Dist2(r_viewpoint.Pos.X, r_viewpoint.Pos.Y, glseg.x2, glseg.y2);
|
||||
|
|
|
@ -174,7 +174,7 @@ void F2DDrawer::AddTexture(FTexture *img, DrawParms &parms)
|
|||
|
||||
void F2DDrawer::AddPoly(FTexture *texture, FVector2 *points, int npoints,
|
||||
double originx, double originy, double scalex, double scaley,
|
||||
DAngle rotation, FDynamicColormap *colormap, PalEntry flatcolor, int lightlevel)
|
||||
DAngle rotation, const FColormap &colormap, PalEntry flatcolor, int lightlevel)
|
||||
{
|
||||
FMaterial *gltexture = FMaterial::ValidateTexture(texture, false);
|
||||
|
||||
|
@ -435,9 +435,7 @@ void F2DDrawer::Draw()
|
|||
{
|
||||
DataSimplePoly *dsp = static_cast<DataSimplePoly*>(dg);
|
||||
|
||||
FColormap cm;
|
||||
cm = dsp->mColormap;
|
||||
gl_SetColor(dsp->mLightLevel, 0, false, cm, 1.f);
|
||||
gl_SetColor(dsp->mLightLevel, 0, false, dsp->mColormap, 1.f);
|
||||
gl_RenderState.SetMaterial(dsp->mTexture, CLAMP_NONE, 0, -1, false);
|
||||
gl_RenderState.SetObjectColor(dsp->mFlatColor|0xff000000);
|
||||
gl_RenderState.Apply();
|
||||
|
|
|
@ -44,7 +44,7 @@ class F2DDrawer : public FSimpleVertexBuffer
|
|||
{
|
||||
FMaterial *mTexture;
|
||||
int mLightLevel;
|
||||
FDynamicColormap *mColormap;
|
||||
FColormap mColormap;
|
||||
PalEntry mFlatColor;
|
||||
};
|
||||
|
||||
|
@ -62,7 +62,7 @@ public:
|
|||
|
||||
void AddPoly(FTexture *texture, FVector2 *points, int npoints,
|
||||
double originx, double originy, double scalex, double scaley,
|
||||
DAngle rotation, FDynamicColormap *colormap, PalEntry flatcolor, int lightlevel);
|
||||
DAngle rotation, const FColormap &colormap, PalEntry flatcolor, int lightlevel);
|
||||
|
||||
void AddLine(int x1, int y1, int x2, int y2, int palcolor, uint32_t color);
|
||||
void AddPixel(int x1, int y1, int palcolor, uint32_t color);
|
||||
|
|
|
@ -23,58 +23,5 @@ enum EColorManipulation
|
|||
|
||||
#define CM_MAXCOLORMAP int(CM_FIRSTSPECIALCOLORMAP + SpecialColormaps.Size())
|
||||
|
||||
// for internal use
|
||||
struct FColormap
|
||||
{
|
||||
PalEntry LightColor; // a is saturation (0 full, 31=b/w, other=custom colormap)
|
||||
PalEntry FadeColor; // a is fadedensity>>1
|
||||
int desaturation;
|
||||
int blendfactor;
|
||||
int fogdensity;
|
||||
|
||||
void Clear()
|
||||
{
|
||||
LightColor=0xffffff;
|
||||
FadeColor=0;
|
||||
desaturation = 0;
|
||||
blendfactor=0;
|
||||
fogdensity = 0;
|
||||
}
|
||||
|
||||
void ClearColor()
|
||||
{
|
||||
LightColor.r=LightColor.g=LightColor.b=0xff;
|
||||
blendfactor=0;
|
||||
desaturation = 0;
|
||||
}
|
||||
|
||||
|
||||
FColormap & operator=(FDynamicColormap * from)
|
||||
{
|
||||
LightColor = from->Color;
|
||||
desaturation = from->Desaturate;
|
||||
FadeColor = from->Fade;
|
||||
FadeColor.a = 0;
|
||||
blendfactor = from->Color.a;
|
||||
fogdensity = from->Fade.a*2;
|
||||
return * this;
|
||||
}
|
||||
|
||||
void CopyLightColor(FDynamicColormap * from)
|
||||
{
|
||||
LightColor = from->Color;
|
||||
desaturation = from->Desaturate;
|
||||
blendfactor = from->Color.a;
|
||||
}
|
||||
|
||||
void CopyFrom3DLight(lightlist_t *light);
|
||||
|
||||
void Decolorize() // this for 'nocoloredspritelighting' and not the same as desaturation. The normal formula results in a value that's too dark.
|
||||
{
|
||||
int v = (LightColor.r + LightColor.g + LightColor.b) / 3;
|
||||
LightColor.r = LightColor.g = LightColor.b = (255 + v + v) / 3;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
@ -249,8 +249,8 @@ void gl_SetColor(int sectorlightlevel, int rellight, bool fullbright, const FCol
|
|||
else
|
||||
{
|
||||
int hwlightlevel = gl_CalcLightLevel(sectorlightlevel, rellight, weapon);
|
||||
PalEntry pe = gl_CalcLightColor(hwlightlevel, cm.LightColor, cm.blendfactor);
|
||||
gl_RenderState.SetColorAlpha(pe, alpha, cm.desaturation);
|
||||
PalEntry pe = gl_CalcLightColor(hwlightlevel, cm.LightColor, cm.BlendFactor);
|
||||
gl_RenderState.SetColorAlpha(pe, alpha, cm.Desaturation);
|
||||
gl_RenderState.SetSoftLightLevel(gl_ClampLight(sectorlightlevel + rellight));
|
||||
}
|
||||
}
|
||||
|
@ -339,7 +339,7 @@ bool gl_CheckFog(sector_t *frontsector, sector_t *backsector)
|
|||
|
||||
// Check for fog boundaries. This needs a few more checks for the sectors
|
||||
|
||||
PalEntry fogcolor = frontsector->ColorMap->Fade;
|
||||
PalEntry fogcolor = frontsector->Colormap.FadeColor;
|
||||
|
||||
if ((fogcolor.d & 0xffffff) == 0)
|
||||
{
|
||||
|
@ -361,7 +361,7 @@ bool gl_CheckFog(sector_t *frontsector, sector_t *backsector)
|
|||
if (frontsector->lightlevel >= 248) return false;
|
||||
}
|
||||
|
||||
fogcolor = backsector->ColorMap->Fade;
|
||||
fogcolor = backsector->Colormap.FadeColor;
|
||||
|
||||
if ((fogcolor.d & 0xffffff) == 0)
|
||||
{
|
||||
|
@ -439,7 +439,7 @@ void gl_SetFog(int lightlevel, int rellight, bool fullbright, const FColormap *c
|
|||
else if (cmap != NULL && !fullbright)
|
||||
{
|
||||
fogcolor = cmap->FadeColor;
|
||||
fogdensity = gl_GetFogDensity(lightlevel, fogcolor, cmap->fogdensity);
|
||||
fogdensity = gl_GetFogDensity(lightlevel, fogcolor, cmap->FogDensity);
|
||||
fogcolor.a=0;
|
||||
}
|
||||
else
|
||||
|
|
|
@ -33,15 +33,6 @@ inline bool gl_isWhite(PalEntry color)
|
|||
return color.r + color.g + color.b == 3*0xff;
|
||||
}
|
||||
|
||||
inline void FColormap::CopyFrom3DLight(lightlist_t *light)
|
||||
{
|
||||
LightColor = light->extra_colormap->Color;
|
||||
desaturation = light->extra_colormap->Desaturate;
|
||||
blendfactor = light->extra_colormap->Color.a;
|
||||
if (light->caster && (light->caster->flags&FF_FADEWALLS) && (light->extra_colormap->Fade & 0xffffff) != 0)
|
||||
FadeColor = light->extra_colormap->Fade;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
@ -188,7 +188,7 @@ public:
|
|||
|
||||
void FillSimplePoly(FTexture *texture, FVector2 *points, int npoints,
|
||||
double originx, double originy, double scalex, double scaley,
|
||||
DAngle rotation, FDynamicColormap *colormap, PalEntry flatcolor, int lightlevel, int bottomclip);
|
||||
DAngle rotation, const FColormap &colormap, PalEntry flatcolor, int lightlevel, int bottomclip);
|
||||
|
||||
int PTM_BestColor (const uint32_t *pal_in, int r, int g, int b, int first, int num);
|
||||
|
||||
|
|
|
@ -1174,10 +1174,10 @@ void FDrawInfo::DrawFloodedPlane(wallseg * ws, float planez, sector_t * sec, boo
|
|||
}
|
||||
else
|
||||
{
|
||||
Colormap=sec->ColorMap;
|
||||
Colormap = sec->Colormap;
|
||||
if (gltexture->tex->isFullbright())
|
||||
{
|
||||
Colormap.LightColor.r = Colormap.LightColor.g = Colormap.LightColor.b = 0xff;
|
||||
Colormap.MakeWhite();
|
||||
lightlevel=255;
|
||||
}
|
||||
else lightlevel=abs(ceiling? sec->GetCeilingLight() : sec->GetFloorLight());
|
||||
|
|
|
@ -245,7 +245,7 @@ sector_t * gl_FakeFlat(sector_t * sec, sector_t * dest, area_t in_area, bool bac
|
|||
{
|
||||
if (in_area==area_below)
|
||||
{
|
||||
dest->ColorMap=s->ColorMap;
|
||||
dest->CopyColors(s);
|
||||
if (!(s->MoreFlags & SECF_NOFAKELIGHT))
|
||||
{
|
||||
dest->lightlevel = s->lightlevel;
|
||||
|
@ -291,7 +291,7 @@ sector_t * gl_FakeFlat(sector_t * sec, sector_t * dest, area_t in_area, bool bac
|
|||
|
||||
if (in_area==area_below)
|
||||
{
|
||||
dest->ColorMap=s->ColorMap;
|
||||
dest->CopyColors(s);
|
||||
dest->SetPlaneTexZ(sector_t::floor, sec->GetPlaneTexZ(sector_t::floor));
|
||||
dest->SetPlaneTexZ(sector_t::ceiling, s->GetPlaneTexZ(sector_t::floor));
|
||||
dest->floorplane=sec->floorplane;
|
||||
|
@ -344,7 +344,7 @@ sector_t * gl_FakeFlat(sector_t * sec, sector_t * dest, area_t in_area, bool bac
|
|||
}
|
||||
else if (in_area == area_above)
|
||||
{
|
||||
dest->ColorMap = s->ColorMap;
|
||||
dest->CopyColors(s);
|
||||
dest->SetPlaneTexZ(sector_t::ceiling, sec->GetPlaneTexZ(sector_t::ceiling));
|
||||
dest->SetPlaneTexZ(sector_t::floor, s->GetPlaneTexZ(sector_t::ceiling));
|
||||
dest->ceilingplane = sec->ceilingplane;
|
||||
|
|
|
@ -520,7 +520,7 @@ void GLFlat::Process(sector_t * model, int whichplane, bool fog)
|
|||
if (!gltexture) return;
|
||||
if (gltexture->tex->isFullbright())
|
||||
{
|
||||
Colormap.LightColor.r = Colormap.LightColor.g = Colormap.LightColor.b = 0xff;
|
||||
Colormap.MakeWhite();
|
||||
lightlevel=255;
|
||||
}
|
||||
}
|
||||
|
@ -556,7 +556,7 @@ void GLFlat::SetFrom3DFloor(F3DFloor *rover, bool top, bool underside)
|
|||
|
||||
if (rover->flags & FF_FOG)
|
||||
{
|
||||
Colormap.LightColor = (light->extra_colormap)->Fade;
|
||||
Colormap.LightColor = light->extra_colormap.FadeColor;
|
||||
FlatColor = 0xffffffff;
|
||||
}
|
||||
else
|
||||
|
@ -619,7 +619,7 @@ void GLFlat::ProcessSector(sector_t * frontsector)
|
|||
srf |= SSRF_RENDERFLOOR;
|
||||
|
||||
lightlevel = gl_ClampLight(frontsector->GetFloorLight());
|
||||
Colormap = frontsector->ColorMap;
|
||||
Colormap = frontsector->Colormap;
|
||||
FlatColor = frontsector->SpecialColors[sector_t::floor];
|
||||
port = frontsector->ValidatePortal(sector_t::floor);
|
||||
if ((stack = (port != NULL)))
|
||||
|
@ -679,7 +679,7 @@ void GLFlat::ProcessSector(sector_t * frontsector)
|
|||
srf |= SSRF_RENDERCEILING;
|
||||
|
||||
lightlevel = gl_ClampLight(frontsector->GetCeilingLight());
|
||||
Colormap = frontsector->ColorMap;
|
||||
Colormap = frontsector->Colormap;
|
||||
FlatColor = frontsector->SpecialColors[sector_t::ceiling];
|
||||
port = frontsector->ValidatePortal(sector_t::ceiling);
|
||||
if ((stack = (port != NULL)))
|
||||
|
@ -765,7 +765,7 @@ void GLFlat::ProcessSector(sector_t * frontsector)
|
|||
if (r_viewpoint.Pos.Z <= rover->top.plane->ZatPoint(r_viewpoint.Pos))
|
||||
{
|
||||
SetFrom3DFloor(rover, true, !!(rover->flags&FF_FOG));
|
||||
Colormap.FadeColor = frontsector->ColorMap->Fade;
|
||||
Colormap.FadeColor = frontsector->Colormap.FadeColor;
|
||||
Process(rover->top.model, rover->top.isceiling, !!(rover->flags&FF_FOG));
|
||||
}
|
||||
lastceilingheight = ff_top;
|
||||
|
@ -779,7 +779,7 @@ void GLFlat::ProcessSector(sector_t * frontsector)
|
|||
if (r_viewpoint.Pos.Z <= rover->bottom.plane->ZatPoint(r_viewpoint.Pos))
|
||||
{
|
||||
SetFrom3DFloor(rover, false, !(rover->flags&FF_FOG));
|
||||
Colormap.FadeColor = frontsector->ColorMap->Fade;
|
||||
Colormap.FadeColor = frontsector->Colormap.FadeColor;
|
||||
Process(rover->bottom.model, rover->bottom.isceiling, !!(rover->flags&FF_FOG));
|
||||
}
|
||||
lastceilingheight = ff_bottom;
|
||||
|
@ -805,7 +805,7 @@ void GLFlat::ProcessSector(sector_t * frontsector)
|
|||
if (r_viewpoint.Pos.Z >= rover->bottom.plane->ZatPoint(r_viewpoint.Pos))
|
||||
{
|
||||
SetFrom3DFloor(rover, false, !(rover->flags&FF_FOG));
|
||||
Colormap.FadeColor = frontsector->ColorMap->Fade;
|
||||
Colormap.FadeColor = frontsector->Colormap.FadeColor;
|
||||
|
||||
if (rover->flags&FF_FIX)
|
||||
{
|
||||
|
@ -826,7 +826,7 @@ void GLFlat::ProcessSector(sector_t * frontsector)
|
|||
if (r_viewpoint.Pos.Z >= rover->top.plane->ZatPoint(r_viewpoint.Pos))
|
||||
{
|
||||
SetFrom3DFloor(rover, true, !!(rover->flags&FF_FOG));
|
||||
Colormap.FadeColor = frontsector->ColorMap->Fade;
|
||||
Colormap.FadeColor = frontsector->Colormap.FadeColor;
|
||||
Process(rover->top.model, rover->top.isceiling, !!(rover->flags&FF_FOG));
|
||||
}
|
||||
lastfloorheight = ff_top;
|
||||
|
|
|
@ -1238,7 +1238,7 @@ void GLEEHorizonPortal::DrawContents()
|
|||
GLHorizonInfo horz;
|
||||
horz.plane.GetFromSector(sector, sector_t::ceiling);
|
||||
horz.lightlevel = gl_ClampLight(sector->GetCeilingLight());
|
||||
horz.colormap = sector->ColorMap;
|
||||
horz.colormap = sector->Colormap;
|
||||
if (portal->mType == PORTS_PLANE)
|
||||
{
|
||||
horz.plane.Texheight = r_viewpoint.Pos.Z + fabs(horz.plane.Texheight);
|
||||
|
@ -1251,7 +1251,7 @@ void GLEEHorizonPortal::DrawContents()
|
|||
GLHorizonInfo horz;
|
||||
horz.plane.GetFromSector(sector, sector_t::floor);
|
||||
horz.lightlevel = gl_ClampLight(sector->GetFloorLight());
|
||||
horz.colormap = sector->ColorMap;
|
||||
horz.colormap = sector->Colormap;
|
||||
if (portal->mType == PORTS_PLANE)
|
||||
{
|
||||
horz.plane.Texheight = r_viewpoint.Pos.Z - fabs(horz.plane.Texheight);
|
||||
|
|
|
@ -1047,7 +1047,8 @@ void FDrawInfo::CollectSectorStacksCeiling(subsector_t * sub, sector_t * anchor)
|
|||
if (me->GetTexture(sector_t::ceiling) != anchor->GetTexture(sector_t::ceiling) ||
|
||||
me->ceilingplane != anchor->ceilingplane ||
|
||||
me->GetCeilingLight() != anchor->GetCeilingLight() ||
|
||||
me->ColorMap != anchor->ColorMap ||
|
||||
me->Colormap != anchor->Colormap ||
|
||||
me->SpecialColors[sector_t::ceiling] != anchor->SpecialColors[sector_t::ceiling] ||
|
||||
me->planes[sector_t::ceiling].xform != anchor->planes[sector_t::ceiling].xform)
|
||||
{
|
||||
// different visplane so it can't belong to this stack
|
||||
|
@ -1090,7 +1091,8 @@ void FDrawInfo::CollectSectorStacksFloor(subsector_t * sub, sector_t * anchor)
|
|||
if (me->GetTexture(sector_t::floor) != anchor->GetTexture(sector_t::floor) ||
|
||||
me->floorplane != anchor->floorplane ||
|
||||
me->GetFloorLight() != anchor->GetFloorLight() ||
|
||||
me->ColorMap != anchor->ColorMap ||
|
||||
me->Colormap != anchor->Colormap ||
|
||||
me->SpecialColors[sector_t::floor] != anchor->SpecialColors[sector_t::floor] ||
|
||||
me->planes[sector_t::floor].xform != anchor->planes[sector_t::floor].xform)
|
||||
{
|
||||
// different visplane so it can't belong to this stack
|
||||
|
|
|
@ -580,7 +580,7 @@ void GLSceneDrawer::DrawBlend(sector_t * viewsector)
|
|||
// 3d floor 'fog' is rendered as a blending value
|
||||
blendv = lightlist[i].blend;
|
||||
// If this is the same as the sector's it doesn't apply!
|
||||
if (blendv == viewsector->ColorMap->Fade) blendv = 0;
|
||||
if (blendv == viewsector->Colormap.FadeColor) blendv = 0;
|
||||
// a little hack to make this work for Legacy maps.
|
||||
if (blendv.a == 0 && blendv != 0) blendv.a = 128;
|
||||
break;
|
||||
|
|
|
@ -299,7 +299,7 @@ void GLSprite::Draw(int pass)
|
|||
if (!gl_isBlack(Colormap.FadeColor))
|
||||
{
|
||||
float dist=Dist2(r_viewpoint.Pos.X, r_viewpoint.Pos.Y, x,y);
|
||||
int fogd = gl_GetFogDensity(lightlevel, Colormap.FadeColor, Colormap.fogdensity);
|
||||
int fogd = gl_GetFogDensity(lightlevel, Colormap.FadeColor, Colormap.FogDensity);
|
||||
|
||||
// this value was determined by trial and error and is scale dependent!
|
||||
float factor = 0.05f + exp(-fogd*dist / 62500.f);
|
||||
|
@ -308,7 +308,7 @@ void GLSprite::Draw(int pass)
|
|||
}
|
||||
|
||||
gl_RenderState.AlphaFunc(GL_GEQUAL, gl_mask_sprite_threshold);
|
||||
gl_RenderState.SetColor(0.2f,0.2f,0.2f,fuzzalpha, Colormap.desaturation);
|
||||
gl_RenderState.SetColor(0.2f,0.2f,0.2f,fuzzalpha, Colormap.Desaturation);
|
||||
additivefog = true;
|
||||
lightlist = nullptr; // the fuzz effect does not use the sector's light level so splitting is not needed.
|
||||
}
|
||||
|
@ -399,8 +399,7 @@ void GLSprite::Draw(int pass)
|
|||
int thisll = actor == nullptr? thislight : (uint8_t)gl_CheckSpriteGlow(actor->Sector, thislight, actor->InterpolatedPosition(r_viewpoint.TicFrac));
|
||||
|
||||
FColormap thiscm;
|
||||
thiscm.FadeColor = Colormap.FadeColor;
|
||||
thiscm.fogdensity = Colormap.fogdensity;
|
||||
thiscm.CopyFog(Colormap);
|
||||
thiscm.CopyFrom3DLight(&(*lightlist)[i]);
|
||||
if (glset.nocoloredspritelighting)
|
||||
{
|
||||
|
@ -526,7 +525,7 @@ void GLSprite::SplitSprite(sector_t * frontsector, bool translucent)
|
|||
{
|
||||
copySprite=*this;
|
||||
copySprite.lightlevel = gl_ClampLight(*lightlist[i].p_lightlevel);
|
||||
copySprite.Colormap.CopyLightColor(lightlist[i].extra_colormap);
|
||||
copySprite.Colormap.CopyLight(lightlist[i].extra_colormap);
|
||||
|
||||
if (glset.nocoloredspritelighting)
|
||||
{
|
||||
|
@ -535,9 +534,9 @@ void GLSprite::SplitSprite(sector_t * frontsector, bool translucent)
|
|||
|
||||
if (!gl_isWhite(ThingColor))
|
||||
{
|
||||
copySprite.Colormap.LightColor.r=(copySprite.Colormap.LightColor.r*ThingColor.r)>>8;
|
||||
copySprite.Colormap.LightColor.g=(copySprite.Colormap.LightColor.g*ThingColor.g)>>8;
|
||||
copySprite.Colormap.LightColor.b=(copySprite.Colormap.LightColor.b*ThingColor.b)>>8;
|
||||
copySprite.Colormap.LightColor.r = (copySprite.Colormap.LightColor.r*ThingColor.r) >> 8;
|
||||
copySprite.Colormap.LightColor.g = (copySprite.Colormap.LightColor.g*ThingColor.g) >> 8;
|
||||
copySprite.Colormap.LightColor.b = (copySprite.Colormap.LightColor.b*ThingColor.b) >> 8;
|
||||
}
|
||||
|
||||
z1=copySprite.z2=lightbottom;
|
||||
|
@ -666,7 +665,7 @@ void GLSprite::Process(AActor* thing, sector_t * sector, int thruportal)
|
|||
bool isPicnumOverride = thing->picnum.isValid();
|
||||
|
||||
// Don't waste time projecting sprites that are definitely not visible.
|
||||
if ((thing->sprite == 0 && !isPicnumOverride) || !thing->IsVisibleToPlayer() || ((thing->renderflags & RF_MASKROTATION) && !thing->IsInsideVisibleAngles()))
|
||||
if ((thing->sprite == 0 && !isPicnumOverride) || !thing->IsVisibleToPlayer() || ((thing->renderflags & RF_MASKROTATION) && !thing->IsInsideVisibleAngles()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
@ -853,9 +852,9 @@ void GLSprite::Process(AActor* thing, sector_t * sector, int thruportal)
|
|||
y1 = y + viewvecX*leftfac;
|
||||
y2 = y + viewvecX*rightfac;
|
||||
break;
|
||||
|
||||
|
||||
case RF_FLATSPRITE:
|
||||
{
|
||||
{
|
||||
x1 = x + leftfac;
|
||||
x2 = x + rightfac;
|
||||
y1 = y - topfac;
|
||||
|
@ -873,27 +872,27 @@ void GLSprite::Process(AActor* thing, sector_t * sector, int thruportal)
|
|||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
x1 = x2 = x;
|
||||
y1 = y2 = y;
|
||||
z1 = z2 = z;
|
||||
gltexture=NULL;
|
||||
gltexture = NULL;
|
||||
}
|
||||
|
||||
depth = FloatToFixed((x - r_viewpoint.Pos.X) * r_viewpoint.TanCos + (y - r_viewpoint.Pos.Y) * r_viewpoint.TanSin);
|
||||
|
||||
// light calculation
|
||||
|
||||
bool enhancedvision=false;
|
||||
bool enhancedvision = false;
|
||||
|
||||
// allow disabling of the fullbright flag by a brightmap definition
|
||||
// (e.g. to do the gun flashes of Doom's zombies correctly.
|
||||
fullbright = (thing->flags5 & MF5_BRIGHT) ||
|
||||
((thing->renderflags & RF_FULLBRIGHT) && (!gltexture || !gltexture->tex->gl_info.bDisableFullbright));
|
||||
|
||||
lightlevel=fullbright? 255 :
|
||||
gl_ClampLight(rendersector->GetTexture(sector_t::ceiling) == skyflatnum ?
|
||||
lightlevel = fullbright ? 255 :
|
||||
gl_ClampLight(rendersector->GetTexture(sector_t::ceiling) == skyflatnum ?
|
||||
rendersector->GetCeilingLight() : rendersector->GetFloorLight());
|
||||
foglevel = (uint8_t)clamp<short>(rendersector->lightlevel, 0, 255);
|
||||
|
||||
|
@ -904,16 +903,16 @@ void GLSprite::Process(AActor* thing, sector_t * sector, int thruportal)
|
|||
RenderStyle = thing->RenderStyle;
|
||||
|
||||
// colormap stuff is a little more complicated here...
|
||||
if (mDrawer->FixedColormap)
|
||||
if (mDrawer->FixedColormap)
|
||||
{
|
||||
if ((gl_enhanced_nv_stealth > 0 && mDrawer->FixedColormap == CM_LITE) // Infrared powerup only
|
||||
|| (gl_enhanced_nv_stealth == 2 && mDrawer->FixedColormap >= CM_TORCH)// Also torches
|
||||
|| (gl_enhanced_nv_stealth == 3)) // Any fixed colormap
|
||||
enhancedvision=true;
|
||||
enhancedvision = true;
|
||||
|
||||
Colormap.Clear();
|
||||
|
||||
if (mDrawer->FixedColormap==CM_LITE)
|
||||
if (mDrawer->FixedColormap == CM_LITE)
|
||||
{
|
||||
if (gl_enhanced_nightvision &&
|
||||
(thing->IsKindOf(RUNTIME_CLASS(AInventory)) || thing->flags3&MF3_ISMONSTER || thing->flags&MF_MISSILE || thing->flags&MF_CORPSE))
|
||||
|
@ -922,24 +921,23 @@ void GLSprite::Process(AActor* thing, sector_t * sector, int thruportal)
|
|||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
Colormap=rendersector->ColorMap;
|
||||
Colormap = rendersector->Colormap;
|
||||
if (fullbright)
|
||||
{
|
||||
if (rendersector == &level.sectors[rendersector->sectornum] || mDrawer->in_area != area_below)
|
||||
// under water areas keep their color for fullbright objects
|
||||
{
|
||||
// Only make the light white but keep everything else (fog, desaturation and Boom colormap.)
|
||||
Colormap.LightColor.r=
|
||||
Colormap.LightColor.g=
|
||||
Colormap.LightColor.b=0xff;
|
||||
Colormap.MakeWhite();
|
||||
}
|
||||
else
|
||||
{
|
||||
Colormap.LightColor.r = (3*Colormap.LightColor.r + 0xff)/4;
|
||||
Colormap.LightColor.g = (3*Colormap.LightColor.g + 0xff)/4;
|
||||
Colormap.LightColor.b = (3*Colormap.LightColor.b + 0xff)/4;
|
||||
// Keep the color, but brighten things a bit so that a difference can be seen.
|
||||
Colormap.LightColor.r = (3 * Colormap.LightColor.r + 0xff) / 4;
|
||||
Colormap.LightColor.g = (3 * Colormap.LightColor.g + 0xff) / 4;
|
||||
Colormap.LightColor.b = (3 * Colormap.LightColor.b + 0xff) / 4;
|
||||
}
|
||||
}
|
||||
else if (glset.nocoloredspritelighting)
|
||||
|
@ -948,7 +946,7 @@ void GLSprite::Process(AActor* thing, sector_t * sector, int thruportal)
|
|||
}
|
||||
}
|
||||
|
||||
translation=thing->Translation;
|
||||
translation = thing->Translation;
|
||||
|
||||
OverrideShader = -1;
|
||||
trans = thing->Alpha;
|
||||
|
@ -983,15 +981,15 @@ void GLSprite::Process(AActor* thing, sector_t * sector, int thruportal)
|
|||
trans = 1.f;
|
||||
}
|
||||
|
||||
if (trans >= 1.f-FLT_EPSILON && RenderStyle.BlendOp != STYLEOP_Shadow && (
|
||||
(RenderStyle.SrcAlpha == STYLEALPHA_One && RenderStyle.DestAlpha == STYLEALPHA_Zero) ||
|
||||
(RenderStyle.SrcAlpha == STYLEALPHA_Src && RenderStyle.DestAlpha == STYLEALPHA_InvSrc)
|
||||
))
|
||||
if (trans >= 1.f - FLT_EPSILON && RenderStyle.BlendOp != STYLEOP_Shadow && (
|
||||
(RenderStyle.SrcAlpha == STYLEALPHA_One && RenderStyle.DestAlpha == STYLEALPHA_Zero) ||
|
||||
(RenderStyle.SrcAlpha == STYLEALPHA_Src && RenderStyle.DestAlpha == STYLEALPHA_InvSrc)
|
||||
))
|
||||
{
|
||||
// This is a non-translucent sprite (i.e. STYLE_Normal or equivalent)
|
||||
trans=1.f;
|
||||
|
||||
if (!gl_sprite_blend || modelframe || (thing->renderflags & (RF_FLATSPRITE|RF_WALLSPRITE)) || gl_billboard_faces_camera)
|
||||
trans = 1.f;
|
||||
|
||||
if (!gl_sprite_blend || modelframe || (thing->renderflags & (RF_FLATSPRITE | RF_WALLSPRITE)) || gl_billboard_faces_camera)
|
||||
{
|
||||
RenderStyle.SrcAlpha = STYLEALPHA_One;
|
||||
RenderStyle.DestAlpha = STYLEALPHA_Zero;
|
||||
|
@ -1011,37 +1009,37 @@ void GLSprite::Process(AActor* thing, sector_t * sector, int thruportal)
|
|||
RenderStyle.DestAlpha = STYLEALPHA_InvSrc;
|
||||
}
|
||||
hw_styleflags = STYLEHW_NoAlphaTest;
|
||||
}
|
||||
}
|
||||
|
||||
if (enhancedvision && gl_enhanced_nightvision)
|
||||
{
|
||||
if (RenderStyle.BlendOp == STYLEOP_Shadow)
|
||||
{
|
||||
// enhanced vision makes them more visible!
|
||||
trans=0.5f;
|
||||
trans = 0.5f;
|
||||
FRenderStyle rs = RenderStyle;
|
||||
RenderStyle = STYLE_Translucent;
|
||||
RenderStyle.Flags = rs.Flags; // Flags must be preserved, at this point it can only be STYLEF_InvertSource
|
||||
}
|
||||
else if (thing->flags & MF_STEALTH)
|
||||
else if (thing->flags & MF_STEALTH)
|
||||
{
|
||||
// enhanced vision overcomes stealth!
|
||||
if (trans < 0.5f) trans = 0.5f;
|
||||
}
|
||||
}
|
||||
|
||||
if (trans==0.0f) return;
|
||||
if (trans == 0.0f) return;
|
||||
|
||||
// end of light calculation
|
||||
|
||||
actor=thing;
|
||||
actor = thing;
|
||||
index = GLRenderer->gl_spriteindex++;
|
||||
particle=NULL;
|
||||
|
||||
const bool drawWithXYBillboard = ( !(actor->renderflags & RF_FORCEYBILLBOARD)
|
||||
&& (actor->renderflags & RF_SPRITETYPEMASK) == RF_FACESPRITE
|
||||
&& players[consoleplayer].camera
|
||||
&& (gl_billboard_mode == 1 || actor->renderflags & RF_FORCEXYBILLBOARD ) );
|
||||
particle = NULL;
|
||||
|
||||
const bool drawWithXYBillboard = (!(actor->renderflags & RF_FORCEYBILLBOARD)
|
||||
&& (actor->renderflags & RF_SPRITETYPEMASK) == RF_FACESPRITE
|
||||
&& players[consoleplayer].camera
|
||||
&& (gl_billboard_mode == 1 || actor->renderflags & RF_FORCEXYBILLBOARD));
|
||||
|
||||
|
||||
// no light splitting when:
|
||||
|
@ -1107,7 +1105,7 @@ void GLSprite::ProcessParticle (particle_t *particle, sector_t *sector)//, int s
|
|||
TArray<lightlist_t> & lightlist=sector->e->XFloor.lightlist;
|
||||
double lightbottom;
|
||||
|
||||
Colormap = sector->ColorMap;
|
||||
Colormap = sector->Colormap;
|
||||
for(unsigned int i=0;i<lightlist.Size();i++)
|
||||
{
|
||||
if (i<lightlist.Size()-1) lightbottom = lightlist[i+1].plane.ZatPoint(particle->Pos);
|
||||
|
@ -1116,7 +1114,7 @@ void GLSprite::ProcessParticle (particle_t *particle, sector_t *sector)//, int s
|
|||
if (lightbottom < particle->Pos.Z)
|
||||
{
|
||||
lightlevel = gl_ClampLight(*lightlist[i].p_lightlevel);
|
||||
Colormap.LightColor = (lightlist[i].extra_colormap)->Color;
|
||||
Colormap.CopyLight(lightlist[i].extra_colormap);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1128,7 +1126,7 @@ void GLSprite::ProcessParticle (particle_t *particle, sector_t *sector)//, int s
|
|||
else
|
||||
{
|
||||
lightlevel = 255;
|
||||
Colormap = sector->ColorMap;
|
||||
Colormap = sector->Colormap;
|
||||
Colormap.ClearColor();
|
||||
}
|
||||
|
||||
|
|
|
@ -441,14 +441,14 @@ bool GLWall::DoHorizon(seg_t * seg,sector_t * fs, vertex_t * v1,vertex_t * v2)
|
|||
{
|
||||
hi.plane.GetFromSector(fs, sector_t::ceiling);
|
||||
hi.lightlevel = gl_ClampLight(fs->GetCeilingLight());
|
||||
hi.colormap = fs->ColorMap;
|
||||
hi.colormap = fs->Colormap;
|
||||
|
||||
if (fs->e->XFloor.ffloors.Size())
|
||||
{
|
||||
light = P_GetPlaneLight(fs, &fs->ceilingplane, true);
|
||||
|
||||
if(!(fs->GetFlags(sector_t::ceiling)&PLANEF_ABSLIGHTING)) hi.lightlevel = gl_ClampLight(*light->p_lightlevel);
|
||||
hi.colormap.LightColor = (light->extra_colormap)->Color;
|
||||
hi.colormap.CopyLight(light->extra_colormap);
|
||||
}
|
||||
|
||||
if (mDrawer->FixedColormap) hi.colormap.Clear();
|
||||
|
@ -469,14 +469,14 @@ bool GLWall::DoHorizon(seg_t * seg,sector_t * fs, vertex_t * v1,vertex_t * v2)
|
|||
{
|
||||
hi.plane.GetFromSector(fs, sector_t::floor);
|
||||
hi.lightlevel = gl_ClampLight(fs->GetFloorLight());
|
||||
hi.colormap = fs->ColorMap;
|
||||
hi.colormap = fs->Colormap;
|
||||
|
||||
if (fs->e->XFloor.ffloors.Size())
|
||||
{
|
||||
light = P_GetPlaneLight(fs, &fs->floorplane, false);
|
||||
|
||||
if(!(fs->GetFlags(sector_t::floor)&PLANEF_ABSLIGHTING)) hi.lightlevel = gl_ClampLight(*light->p_lightlevel);
|
||||
hi.colormap.LightColor = (light->extra_colormap)->Color;
|
||||
hi.colormap.CopyLight(light->extra_colormap);
|
||||
}
|
||||
|
||||
if (mDrawer->FixedColormap) hi.colormap.Clear();
|
||||
|
@ -1110,7 +1110,7 @@ void GLWall::BuildFFBlock(seg_t * seg, F3DFloor * rover,
|
|||
// this may not yet be done
|
||||
light = P_GetPlaneLight(rover->target, rover->top.plane, true);
|
||||
Colormap.Clear();
|
||||
Colormap.LightColor = (light->extra_colormap)->Fade;
|
||||
Colormap.LightColor = light->extra_colormap.FadeColor;
|
||||
// the fog plane defines the light level, not the front sector
|
||||
lightlevel = gl_ClampLight(*light->p_lightlevel);
|
||||
gltexture = NULL;
|
||||
|
@ -1510,7 +1510,7 @@ void GLWall::Process(seg_t *seg, sector_t * frontsector, sector_t * backsector)
|
|||
glseg.y1 = v1->fY();
|
||||
glseg.x2 = v2->fX();
|
||||
glseg.y2 = v2->fY();
|
||||
Colormap = frontsector->ColorMap;
|
||||
Colormap = frontsector->Colormap;
|
||||
flags = 0;
|
||||
dynlightindex = -1;
|
||||
lightlist = NULL;
|
||||
|
@ -1771,7 +1771,7 @@ void GLWall::ProcessLowerMiniseg(seg_t *seg, sector_t * frontsector, sector_t *
|
|||
|
||||
alpha = 1.0f;
|
||||
RenderStyle = STYLE_Normal;
|
||||
Colormap = frontsector->ColorMap;
|
||||
Colormap = frontsector->Colormap;
|
||||
|
||||
if (gl_GetWallGlow(frontsector, topglowcolor, bottomglowcolor)) flags |= GLWF_GLOW;
|
||||
topplane = frontsector->ceilingplane;
|
||||
|
|
|
@ -277,7 +277,7 @@ void GLSceneDrawer::DrawPlayerSprites(sector_t * viewsector, bool hudModelStep)
|
|||
}
|
||||
else
|
||||
{
|
||||
cm=fakesec->ColorMap;
|
||||
cm=fakesec->Colormap;
|
||||
if (glset.nocoloredspritelighting) cm.ClearColor();
|
||||
}
|
||||
|
||||
|
@ -396,9 +396,7 @@ void GLSceneDrawer::DrawPlayerSprites(sector_t * viewsector, bool hudModelStep)
|
|||
{
|
||||
if (fakesec == viewsector || in_area != area_below)
|
||||
{
|
||||
cmc.LightColor.r=
|
||||
cmc.LightColor.g=
|
||||
cmc.LightColor.b=0xff;
|
||||
cmc.MakeWhite();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -412,7 +410,7 @@ void GLSceneDrawer::DrawPlayerSprites(sector_t * viewsector, bool hudModelStep)
|
|||
// set the lighting parameters
|
||||
if (RenderStyle.BlendOp == STYLEOP_Shadow)
|
||||
{
|
||||
gl_RenderState.SetColor(0.2f, 0.2f, 0.2f, 0.33f, cmc.desaturation);
|
||||
gl_RenderState.SetColor(0.2f, 0.2f, 0.2f, 0.33f, cmc.Desaturation);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -480,7 +480,7 @@ void OpenGLFrameBuffer::Clear(int left, int top, int right, int bottom, int palc
|
|||
|
||||
void OpenGLFrameBuffer::FillSimplePoly(FTexture *texture, FVector2 *points, int npoints,
|
||||
double originx, double originy, double scalex, double scaley,
|
||||
DAngle rotation, FDynamicColormap *colormap, PalEntry flatcolor, int lightlevel, int bottomclip)
|
||||
DAngle rotation, const FColormap &colormap, PalEntry flatcolor, int lightlevel, int bottomclip)
|
||||
{
|
||||
if (GLRenderer != nullptr && GLRenderer->m2DDrawer != nullptr && npoints >= 3)
|
||||
{
|
||||
|
|
|
@ -70,7 +70,7 @@ public:
|
|||
|
||||
void FillSimplePoly(FTexture *tex, FVector2 *points, int npoints,
|
||||
double originx, double originy, double scalex, double scaley,
|
||||
DAngle rotation, FDynamicColormap *colormap, PalEntry flatcolor, int lightlevel, int bottomclip);
|
||||
DAngle rotation, const FColormap &colormap, PalEntry flatcolor, int lightlevel, int bottomclip);
|
||||
|
||||
FNativePalette *CreatePalette(FRemapTable *remap);
|
||||
|
||||
|
|
|
@ -2946,7 +2946,7 @@ void OpenGLSWFrameBuffer::FlatFill(int left, int top, int right, int bottom, FTe
|
|||
|
||||
void OpenGLSWFrameBuffer::FillSimplePoly(FTexture *texture, FVector2 *points, int npoints,
|
||||
double originx, double originy, double scalex, double scaley,
|
||||
DAngle rotation, FDynamicColormap *colormap, PalEntry flatcolor, int lightlevel, int bottomclip)
|
||||
DAngle rotation, const FColormap &colormap, PalEntry flatcolor, int lightlevel, int bottomclip)
|
||||
{
|
||||
// Use an equation similar to player sprites to determine shade
|
||||
double fadelevel = clamp((swrenderer::LightVisibility::LightLevelToShade(lightlevel, true) / 65536. - 12) / NUMCOLORMAPS, 0.0, 1.0);
|
||||
|
@ -2995,20 +2995,17 @@ void OpenGLSWFrameBuffer::FillSimplePoly(FTexture *texture, FVector2 *points, in
|
|||
{
|
||||
quad->Flags = BQF_WrapUV | BQF_GamePalette | BQF_DisableAlphaTest;
|
||||
quad->ShaderNum = BQS_PalTex;
|
||||
if (colormap != nullptr)
|
||||
if (colormap.Desaturation != 0)
|
||||
{
|
||||
if (colormap->Desaturate != 0)
|
||||
{
|
||||
quad->Flags |= BQF_Desaturated;
|
||||
}
|
||||
quad->ShaderNum = BQS_InGameColormap;
|
||||
quad->Desat = colormap->Desaturate;
|
||||
color0 = ColorARGB(255, colormap->Color.r, colormap->Color.g, colormap->Color.b);
|
||||
color1 = ColorARGB(uint32_t((1 - fadelevel) * 255),
|
||||
uint32_t(colormap->Fade.r * fadelevel),
|
||||
uint32_t(colormap->Fade.g * fadelevel),
|
||||
uint32_t(colormap->Fade.b * fadelevel));
|
||||
quad->Flags |= BQF_Desaturated;
|
||||
}
|
||||
quad->ShaderNum = BQS_InGameColormap;
|
||||
quad->Desat = colormap.Desaturation;
|
||||
color0 = ColorARGB(255, colormap.LightColor.r, colormap.LightColor.g, colormap.LightColor.b);
|
||||
color1 = ColorARGB(uint32_t((1 - fadelevel) * 255),
|
||||
uint32_t(colormap.FadeColor.r * fadelevel),
|
||||
uint32_t(colormap.FadeColor.g * fadelevel),
|
||||
uint32_t(colormap.FadeColor.b * fadelevel));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -60,7 +60,7 @@ public:
|
|||
void FlatFill(int left, int top, int right, int bottom, FTexture *src, bool local_origin) override;
|
||||
void DrawLine(int x0, int y0, int x1, int y1, int palColor, uint32_t realcolor) override;
|
||||
void DrawPixel(int x, int y, int palcolor, uint32_t rgbcolor) override;
|
||||
void FillSimplePoly(FTexture *tex, FVector2 *points, int npoints, double originx, double originy, double scalex, double scaley, DAngle rotation, FDynamicColormap *colormap, PalEntry flatcolor, int lightlevel, int bottomclip) override;
|
||||
void FillSimplePoly(FTexture *tex, FVector2 *points, int npoints, double originx, double originy, double scalex, double scaley, DAngle rotation, const FColormap &colormap, PalEntry flatcolor, int lightlevel, int bottomclip) override;
|
||||
bool WipeStartScreen(int type) override;
|
||||
void WipeEndScreen() override;
|
||||
bool WipeDo(int ticks) override;
|
||||
|
|
|
@ -64,26 +64,26 @@ EXTERN_CVAR(Int, vid_renderer)
|
|||
//
|
||||
//==========================================================================
|
||||
|
||||
FDynamicColormap *F3DFloor::GetColormap()
|
||||
FColormap F3DFloor::GetColormap()
|
||||
{
|
||||
// If there's no fog in either model or target sector this is easy and fast.
|
||||
if ((target->ColorMap->Fade == 0 && model->ColorMap->Fade == 0) || (flags & (FF_FADEWALLS|FF_FOG)))
|
||||
if ((target->Colormap.FadeColor.isBlack() && model->Colormap.FadeColor.isBlack()) || (flags & (FF_FADEWALLS|FF_FOG)))
|
||||
{
|
||||
return model->ColorMap;
|
||||
return model->Colormap;
|
||||
}
|
||||
else
|
||||
{
|
||||
// We must create a new colormap combining the properties we need
|
||||
return GetSpecialLights(model->ColorMap->Color, target->ColorMap->Fade, model->ColorMap->Desaturate);
|
||||
return{ model->Colormap.LightColor, target->Colormap.FadeColor, model->Colormap.Desaturation, model->Colormap.BlendFactor, target->Colormap.FogDensity };
|
||||
}
|
||||
}
|
||||
|
||||
PalEntry F3DFloor::GetBlend()
|
||||
{
|
||||
// The model sector's fog is used as blend unless FF_FADEWALLS is set.
|
||||
if (!(flags & FF_FADEWALLS) && target->ColorMap->Fade != model->ColorMap->Fade)
|
||||
if (!(flags & FF_FADEWALLS) && target->Colormap.FadeColor != model->Colormap.FadeColor)
|
||||
{
|
||||
return model->ColorMap->Fade;
|
||||
return model->Colormap.FadeColor;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -91,22 +91,17 @@ PalEntry F3DFloor::GetBlend()
|
|||
}
|
||||
}
|
||||
|
||||
void F3DFloor::UpdateColormap(FDynamicColormap *&map)
|
||||
void F3DFloor::UpdateColormap(FColormap &map)
|
||||
{
|
||||
// If there's no fog in either model or target sector (or both have the same fog) this is easy and fast.
|
||||
if ((target->ColorMap->Fade == 0 && model->ColorMap->Fade == 0) || (flags & FF_FADEWALLS) ||
|
||||
target->ColorMap->Fade == model->ColorMap->Fade)
|
||||
// Note that this is a bit different from GetColormap.
|
||||
if ((target->Colormap.FadeColor.isBlack() && model->Colormap.FadeColor.isBlack()) || (flags & FF_FADEWALLS) ||
|
||||
target->Colormap.FadeColor == model->Colormap.FadeColor)
|
||||
{
|
||||
map = model->ColorMap;
|
||||
map = model->Colormap;
|
||||
}
|
||||
else
|
||||
{
|
||||
// since rebuilding the map is not a cheap operation let's only do it if something really changed.
|
||||
if (map->Color != model->ColorMap->Color || map->Fade != target->ColorMap->Fade ||
|
||||
map->Desaturate != model->ColorMap->Desaturate)
|
||||
{
|
||||
map = GetSpecialLights(model->ColorMap->Color, target->ColorMap->Fade, model->ColorMap->Desaturate);
|
||||
}
|
||||
map = { model->Colormap.LightColor, target->Colormap.FadeColor, model->Colormap.Desaturation, model->Colormap.BlendFactor, target->Colormap.FogDensity };
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -251,10 +246,8 @@ static int P_Set3DFloor(line_t * line, int param, int param2, int alpha)
|
|||
VC_BLOOD, VC_SLUDGE, VC_HAZARD, VC_BOOMWATER };
|
||||
flags |= FF_SWIMMABLE | FF_BOTHPLANES | FF_ALLSIDES | FF_FLOOD;
|
||||
|
||||
l->frontsector->ColorMap =
|
||||
GetSpecialLights(l->frontsector->ColorMap->Color,
|
||||
vavoomcolors[l->args[0]],
|
||||
l->frontsector->ColorMap->Desaturate);
|
||||
l->frontsector->Colormap.FadeColor = vavoomcolors[l->args[0]] & VC_COLORMASK;
|
||||
l->frontsector->Colormap.FogDensity = 0;
|
||||
}
|
||||
alpha = (alpha * 255) / 100;
|
||||
break;
|
||||
|
@ -587,7 +580,7 @@ void P_Recalculate3DFloors(sector_t * sector)
|
|||
lightlist[0].p_lightlevel = §or->lightlevel;
|
||||
lightlist[0].caster = NULL;
|
||||
lightlist[0].lightsource = NULL;
|
||||
lightlist[0].extra_colormap = sector->ColorMap;
|
||||
lightlist[0].extra_colormap = sector->Colormap;
|
||||
lightlist[0].blend = 0;
|
||||
lightlist[0].flags = 0;
|
||||
|
||||
|
@ -637,7 +630,7 @@ void P_Recalculate3DFloors(sector_t * sector)
|
|||
{
|
||||
resetlight.p_lightlevel = §or->lightlevel;
|
||||
resetlight.lightsource = NULL;
|
||||
resetlight.extra_colormap = sector->ColorMap;
|
||||
resetlight.extra_colormap = sector->Colormap;
|
||||
resetlight.blend = 0;
|
||||
}
|
||||
|
||||
|
@ -697,7 +690,7 @@ void P_RecalculateLights(sector_t *sector)
|
|||
}
|
||||
else
|
||||
{
|
||||
ll->extra_colormap = sector->ColorMap;
|
||||
ll->extra_colormap = sector->Colormap;
|
||||
ll->blend = 0;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#ifndef __SECTORE_H
|
||||
#define __SECTORE_H
|
||||
|
||||
#include "r_data/colormaps.h"
|
||||
|
||||
// 3D floor flags. Most are the same as in Legacy but I added some for EDGE's and Vavoom's features as well.
|
||||
typedef enum
|
||||
|
@ -93,8 +94,8 @@ struct F3DFloor
|
|||
int lastlight;
|
||||
int alpha;
|
||||
|
||||
FDynamicColormap *GetColormap();
|
||||
void UpdateColormap(FDynamicColormap *&map);
|
||||
FColormap GetColormap();
|
||||
void UpdateColormap(FColormap &map);
|
||||
PalEntry GetBlend();
|
||||
};
|
||||
|
||||
|
@ -104,7 +105,7 @@ struct lightlist_t
|
|||
{
|
||||
secplane_t plane;
|
||||
short * p_lightlevel;
|
||||
FDynamicColormap * extra_colormap;
|
||||
FColormap extra_colormap;
|
||||
PalEntry blend;
|
||||
int flags;
|
||||
F3DFloor* lightsource;
|
||||
|
|
|
@ -6760,9 +6760,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound)
|
|||
int d = clamp(args[1]/2, 0, 255);
|
||||
while ((s = it.Next()) >= 0)
|
||||
{
|
||||
auto &sec = level.sectors[s];
|
||||
auto f = sec.ColorMap->Fade;
|
||||
sec.ColorMap = GetSpecialLights(sec.ColorMap->Color, PalEntry(d, f.r, f.g, f.b), sec.ColorMap->Desaturate);
|
||||
level.sectors[s].SetFogDensity(d);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -160,6 +160,30 @@ FSerializer &Serialize(FSerializer &arc, const char *key, FLinkedSector &ls, FLi
|
|||
return arc;
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
//
|
||||
// Save a sector portal for savegames.
|
||||
//
|
||||
//============================================================================
|
||||
|
||||
FSerializer &Serialize(FSerializer &arc, const char *key, FColormap &port, FColormap *def)
|
||||
{
|
||||
if (arc.canSkip() && def != nullptr && port == *def)
|
||||
{
|
||||
return arc;
|
||||
}
|
||||
|
||||
if (arc.BeginObject(key))
|
||||
{
|
||||
arc("lightcolor", port.LightColor)
|
||||
("fadecolor", port.FadeColor)
|
||||
("desaturation", port.Desaturation)
|
||||
("fogdensity", port.FogDensity)
|
||||
.EndObject();
|
||||
}
|
||||
return arc;
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
//
|
||||
|
@ -275,7 +299,7 @@ FSerializer &Serialize(FSerializer &arc, const char *key, sector_t &p, sector_t
|
|||
("midtexc_sectors", p.e->Midtex.Ceiling.AttachedSectors)
|
||||
("linked_floor", p.e->Linked.Floor.Sectors)
|
||||
("linked_ceiling", p.e->Linked.Ceiling.Sectors)
|
||||
("colormap", p.ColorMap, def->ColorMap)
|
||||
("colormap", p.Colormap, def->Colormap)
|
||||
.Array("specialcolors", p.SpecialColors, def->SpecialColors, 5, true)
|
||||
("gravity", p.gravity, def->gravity)
|
||||
.Terrain("floorterrain", p.terrainnum[0], &def->terrainnum[0])
|
||||
|
|
|
@ -804,8 +804,8 @@ DEFINE_ACTION_FUNCTION(_Sector, FindLowestCeilingPoint)
|
|||
|
||||
void sector_t::SetColor(int r, int g, int b, int desat)
|
||||
{
|
||||
PalEntry color = PalEntry (r,g,b);
|
||||
ColorMap = GetSpecialLights (color, ColorMap->Fade, desat);
|
||||
Colormap.LightColor = PalEntry(r, g, b);
|
||||
Colormap.Desaturation = desat;
|
||||
P_RecalculateAttachedLights(this);
|
||||
}
|
||||
|
||||
|
@ -814,7 +814,8 @@ DEFINE_ACTION_FUNCTION(_Sector, SetColor)
|
|||
PARAM_SELF_STRUCT_PROLOGUE(sector_t);
|
||||
PARAM_COLOR(color);
|
||||
PARAM_INT(desat);
|
||||
self->ColorMap = GetSpecialLights(color, self->ColorMap->Fade, desat);
|
||||
self->Colormap.LightColor.SetRGB(color);
|
||||
self->Colormap.Desaturation = desat;
|
||||
P_RecalculateAttachedLights(self);
|
||||
return 0;
|
||||
}
|
||||
|
@ -826,8 +827,7 @@ DEFINE_ACTION_FUNCTION(_Sector, SetColor)
|
|||
|
||||
void sector_t::SetFade(int r, int g, int b)
|
||||
{
|
||||
PalEntry fade = PalEntry (r,g,b);
|
||||
ColorMap = GetSpecialLights (ColorMap->Color, fade, ColorMap->Desaturate);
|
||||
Colormap.FadeColor = PalEntry (r,g,b);
|
||||
P_RecalculateAttachedLights(this);
|
||||
}
|
||||
|
||||
|
@ -835,11 +835,28 @@ DEFINE_ACTION_FUNCTION(_Sector, SetFade)
|
|||
{
|
||||
PARAM_SELF_STRUCT_PROLOGUE(sector_t);
|
||||
PARAM_COLOR(fade);
|
||||
self->ColorMap = GetSpecialLights(self->ColorMap->Color, fade, self->ColorMap->Desaturate);
|
||||
self->Colormap.FadeColor.SetRGB(fade);
|
||||
P_RecalculateAttachedLights(self);
|
||||
return 0;
|
||||
}
|
||||
|
||||
//=====================================================================================
|
||||
//
|
||||
//
|
||||
//=====================================================================================
|
||||
|
||||
void sector_t::SetFogDensity(int dens)
|
||||
{
|
||||
Colormap.FogDensity = dens;
|
||||
}
|
||||
|
||||
DEFINE_ACTION_FUNCTION(_Sector, SetFogDensity)
|
||||
{
|
||||
PARAM_SELF_STRUCT_PROLOGUE(sector_t);
|
||||
PARAM_INT(dens);
|
||||
self->Colormap.FogDensity = dens;
|
||||
return 0;
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
//
|
||||
|
@ -2396,7 +2413,7 @@ DEFINE_ACTION_FUNCTION(_Secplane, PointToDist)
|
|||
|
||||
DEFINE_FIELD_X(Sector, sector_t, floorplane)
|
||||
DEFINE_FIELD_X(Sector, sector_t, ceilingplane)
|
||||
DEFINE_FIELD_X(Sector, sector_t, ColorMap)
|
||||
DEFINE_FIELD_X(Sector, sector_t, Colormap)
|
||||
DEFINE_FIELD_X(Sector, sector_t, SoundTarget)
|
||||
DEFINE_FIELD_X(Sector, sector_t, special)
|
||||
DEFINE_FIELD_X(Sector, sector_t, lightlevel)
|
||||
|
|
|
@ -1458,7 +1458,6 @@ void P_LoadSectors (MapData *map, FMissingTextureTracker &missingtex)
|
|||
mapsector_t *ms;
|
||||
sector_t* ss;
|
||||
int defSeqType;
|
||||
FDynamicColormap *fogMap, *normMap;
|
||||
int lumplen = map->Size(ML_SECTORS);
|
||||
|
||||
unsigned numsectors = lumplen / sizeof(mapsector_t);
|
||||
|
@ -1471,8 +1470,6 @@ void P_LoadSectors (MapData *map, FMissingTextureTracker &missingtex)
|
|||
else
|
||||
defSeqType = -1;
|
||||
|
||||
fogMap = normMap = NULL;
|
||||
|
||||
msp = new char[lumplen];
|
||||
map->Read(ML_SECTORS, msp);
|
||||
ms = (mapsector_t*)msp;
|
||||
|
@ -1523,17 +1520,14 @@ void P_LoadSectors (MapData *map, FMissingTextureTracker &missingtex)
|
|||
|
||||
// [RH] Sectors default to white light with the default fade.
|
||||
// If they are outside (have a sky ceiling), they use the outside fog.
|
||||
ss->Colormap.LightColor = PalEntry(255, 255, 255);
|
||||
if (level.outsidefog != 0xff000000 && (ss->GetTexture(sector_t::ceiling) == skyflatnum || (ss->special&0xff) == Sector_Outside))
|
||||
{
|
||||
if (fogMap == NULL)
|
||||
fogMap = GetSpecialLights (PalEntry (255,255,255), level.outsidefog, 0);
|
||||
ss->ColorMap = fogMap;
|
||||
ss->Colormap.FadeColor.SetRGB(level.outsidefog);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (normMap == NULL)
|
||||
normMap = GetSpecialLights (PalEntry (255,255,255), level.fadeto, NormalLight.Desaturate);
|
||||
ss->ColorMap = normMap;
|
||||
ss->Colormap.FadeColor.SetRGB(level.fadeto);
|
||||
}
|
||||
|
||||
// killough 8/28/98: initialize all sectors to normal friction
|
||||
|
@ -2517,21 +2511,16 @@ void P_ProcessSideTextures(bool checktranmap, side_t *sd, sector_t *sec, intmaps
|
|||
|
||||
if (colorgood | foggood)
|
||||
{
|
||||
FDynamicColormap *colormap = NULL;
|
||||
|
||||
for (unsigned s = 0; s < level.sectors.Size(); s++)
|
||||
{
|
||||
if (tagManager.SectorHasTag(s, tag))
|
||||
{
|
||||
if (!colorgood) color = level.sectors[s].ColorMap->Color;
|
||||
if (!foggood) fog = level.sectors[s].ColorMap->Fade;
|
||||
if (colormap == NULL ||
|
||||
colormap->Color != color ||
|
||||
colormap->Fade != fog)
|
||||
if (colorgood)
|
||||
{
|
||||
colormap = GetSpecialLights (color, fog, 0);
|
||||
level.sectors[s].Colormap.LightColor.SetRGB(color);
|
||||
level.sectors[s].Colormap.BlendFactor = APART(color);
|
||||
}
|
||||
level.sectors[s].ColorMap = colormap;
|
||||
if (foggood) level.sectors[s].Colormap.FadeColor.SetRGB(fog);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1526,11 +1526,11 @@ public:
|
|||
break;
|
||||
|
||||
case NAME_Desaturation:
|
||||
desaturation = int(255*CheckFloat(key));
|
||||
desaturation = int(255*CheckFloat(key) + FLT_EPSILON); // FLT_EPSILON to avoid rounding errors with numbers slightly below a full integer.
|
||||
continue;
|
||||
|
||||
case NAME_fogdensity:
|
||||
fogdensity = clamp(CheckInt(key), 0, 511);
|
||||
fogdensity = CheckInt(key);
|
||||
break;
|
||||
|
||||
case NAME_Silent:
|
||||
|
@ -1770,22 +1770,19 @@ public:
|
|||
{
|
||||
// [RH] Sectors default to white light with the default fade.
|
||||
// If they are outside (have a sky ceiling), they use the outside fog.
|
||||
sec->Colormap.LightColor = PalEntry(255, 255, 255);
|
||||
if (level.outsidefog != 0xff000000 && (sec->GetTexture(sector_t::ceiling) == skyflatnum || (sec->special & 0xff) == Sector_Outside))
|
||||
{
|
||||
if (fogMap == NULL)
|
||||
fogMap = GetSpecialLights(PalEntry(255, 255, 255), level.outsidefog, 0);
|
||||
sec->ColorMap = fogMap;
|
||||
sec->Colormap.FadeColor.SetRGB(level.outsidefog);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (normMap == NULL)
|
||||
normMap = GetSpecialLights (PalEntry (255,255,255), level.fadeto, NormalLight.Desaturate);
|
||||
sec->ColorMap = normMap;
|
||||
sec->Colormap.FadeColor.SetRGB(level.fadeto);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (lightcolor == ~0u) lightcolor = PalEntry(255,255,255);
|
||||
sec->Colormap.LightColor.SetRGB(lightcolor);
|
||||
if (fadecolor == ~0u)
|
||||
{
|
||||
if (level.outsidefog != 0xff000000 && (sec->GetTexture(sector_t::ceiling) == skyflatnum || (sec->special & 0xff) == Sector_Outside))
|
||||
|
@ -1793,11 +1790,9 @@ public:
|
|||
else
|
||||
fadecolor = level.fadeto;
|
||||
}
|
||||
if (desaturation == -1) desaturation = NormalLight.Desaturate;
|
||||
if (fogdensity != -1) fadecolor.a = fogdensity / 2;
|
||||
else fadecolor.a = 0;
|
||||
|
||||
sec->ColorMap = GetSpecialLights (lightcolor, fadecolor, desaturation);
|
||||
sec->Colormap.FadeColor.SetRGB(fadecolor);
|
||||
sec->Colormap.Desaturation = clamp(desaturation, 0, 255);
|
||||
sec->Colormap.FogDensity = clamp(fogdensity, 0, 512) / 2;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -137,7 +137,7 @@ void RenderPolyDecal::Render(const TriMatrix &worldToClip, const Vec4f &clipPlan
|
|||
|
||||
PolyDrawArgs args;
|
||||
args.uniforms.flags = 0;
|
||||
args.SetColormap(front->ColorMap);
|
||||
args.SetColormap(GetColorTable(front->Colormap));
|
||||
args.SetTexture(tex, decal->Translation, true);
|
||||
args.uniforms.globvis = (float)PolyRenderer::Instance()->Thread.Light->WallGlobVis(foggy);
|
||||
if (fullbrightSprite || cameraLight->FixedLightLevel() >= 0 || cameraLight->FixedColormap())
|
||||
|
|
|
@ -110,7 +110,7 @@ void RenderPolyParticle::Render(const TriMatrix &worldToClip, const Vec4f &clipP
|
|||
args.ccw = true;
|
||||
args.stenciltestvalue = stencilValue;
|
||||
args.stencilwritevalue = stencilValue;
|
||||
args.SetColormap(sub->sector->ColorMap);
|
||||
args.SetColormap(GetColorTable(sub->sector->Colormap));
|
||||
args.SetClipPlane(clipPlane.x, clipPlane.y, clipPlane.z, clipPlane.w);
|
||||
args.subsectorTest = true;
|
||||
args.writeStencil = false;
|
||||
|
|
|
@ -148,7 +148,7 @@ void RenderPolyPlane::Render3DFloor(const TriMatrix &worldToClip, const Vec4f &c
|
|||
args.stenciltestvalue = stencilValue;
|
||||
args.stencilwritevalue = stencilValue + 1;
|
||||
args.SetTexture(tex);
|
||||
args.SetColormap(sub->sector->ColorMap);
|
||||
args.SetColormap(GetColorTable(sub->sector->Colormap));
|
||||
args.SetClipPlane(clipPlane.x, clipPlane.y, clipPlane.z, clipPlane.w);
|
||||
args.blendmode = TriBlendMode::Copy;
|
||||
PolyTriangleDrawer::draw(args);
|
||||
|
@ -345,7 +345,7 @@ void RenderPolyPlane::Render(const TriMatrix &worldToClip, const Vec4f &clipPlan
|
|||
args.ccw = ccw;
|
||||
args.stenciltestvalue = stencilValue;
|
||||
args.stencilwritevalue = stencilValue + 1;
|
||||
args.SetColormap(frontsector->ColorMap);
|
||||
args.SetColormap(GetColorTable(frontsector->Colormap));
|
||||
args.SetClipPlane(clipPlane.x, clipPlane.y, clipPlane.z, clipPlane.w);
|
||||
|
||||
if (!isSky)
|
||||
|
|
|
@ -215,7 +215,7 @@ void RenderPolyPlayerSprites::RenderSprite(DPSprite *sprite, AActor *owner, floa
|
|||
|
||||
bool noaccel = false;
|
||||
|
||||
FDynamicColormap *basecolormap = viewpoint.sector->ColorMap;
|
||||
FDynamicColormap *basecolormap = GetColorTable(viewpoint.sector->Colormap);
|
||||
FDynamicColormap *colormap_to_use = basecolormap;
|
||||
|
||||
int ColormapNum = 0;
|
||||
|
|
|
@ -162,7 +162,7 @@ void RenderPolySprite::Render(const TriMatrix &worldToClip, const Vec4f &clipPla
|
|||
args.stenciltestvalue = stencilValue;
|
||||
args.stencilwritevalue = stencilValue;
|
||||
args.SetTexture(tex, thing->Translation);
|
||||
args.SetColormap(sub->sector->ColorMap);
|
||||
args.SetColormap(GetColorTable(sub->sector->Colormap));
|
||||
args.SetClipPlane(clipPlane.x, clipPlane.y, clipPlane.z, clipPlane.w);
|
||||
|
||||
TriBlendMode blendmode;
|
||||
|
|
|
@ -73,7 +73,7 @@ bool RenderPolyWall::RenderLine(const TriMatrix &worldToClip, const Vec4f &clipP
|
|||
wall.LineSeg = line;
|
||||
wall.Line = line->linedef;
|
||||
wall.Side = line->sidedef;
|
||||
wall.Colormap = frontsector->ColorMap;
|
||||
wall.Colormap = GetColorTable(frontsector->Colormap);
|
||||
wall.Masked = false;
|
||||
wall.SubsectorDepth = subsectorDepth;
|
||||
wall.StencilValue = stencilValue;
|
||||
|
@ -175,7 +175,7 @@ void RenderPolyWall::Render3DFloorLine(const TriMatrix &worldToClip, const Vec4f
|
|||
wall.LineSeg = line;
|
||||
wall.Line = fakeFloor->master;
|
||||
wall.Side = fakeFloor->master->sidedef[0];
|
||||
wall.Colormap = frontsector->ColorMap;
|
||||
wall.Colormap = GetColorTable(frontsector->Colormap);
|
||||
wall.Masked = false;
|
||||
wall.SubsectorDepth = subsectorDepth;
|
||||
wall.StencilValue = stencilValue;
|
||||
|
@ -262,7 +262,7 @@ void RenderPolyWall::Render(const TriMatrix &worldToClip, const Vec4f &clipPlane
|
|||
args.stencilwritevalue = StencilValue + 1;
|
||||
if (tex)
|
||||
args.SetTexture(tex);
|
||||
args.SetColormap(Line->frontsector->ColorMap);
|
||||
args.SetColormap(GetColorTable(Line->frontsector->Colormap));
|
||||
args.SetClipPlane(clipPlane.x, clipPlane.y, clipPlane.z, clipPlane.w);
|
||||
|
||||
//if (Side && Side->lighthead)
|
||||
|
|
|
@ -123,7 +123,7 @@ void RenderPolyWallSprite::Render(const TriMatrix &worldToClip, const Vec4f &cli
|
|||
args.stenciltestvalue = stencilValue;
|
||||
args.stencilwritevalue = stencilValue;
|
||||
args.SetTexture(tex);
|
||||
args.SetColormap(sub->sector->ColorMap);
|
||||
args.SetColormap(GetColorTable(sub->sector->Colormap));
|
||||
args.SetClipPlane(clipPlane.x, clipPlane.y, clipPlane.z, clipPlane.w);
|
||||
args.subsectorTest = true;
|
||||
args.writeSubsector = false;
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
#define __RES_CMAP_H
|
||||
|
||||
struct FSWColormap;
|
||||
struct lightlist_t;
|
||||
|
||||
void R_InitColormaps ();
|
||||
void R_DeinitColormaps ();
|
||||
|
@ -12,6 +13,70 @@ uint32_t R_BlendForColormap (uint32_t map); // [RH] return calculated blend fo
|
|||
extern FSWColormap realcolormaps; // [RH] make the colormaps externally visible
|
||||
extern size_t numfakecmaps;
|
||||
|
||||
// for internal use
|
||||
struct FColormap
|
||||
{
|
||||
PalEntry LightColor; // a is saturation (0 full, 31=b/w, other=custom colormap)
|
||||
PalEntry FadeColor; // a is fadedensity>>1
|
||||
uint8_t Desaturation;
|
||||
uint8_t BlendFactor; // This is for handling Legacy-style colormaps which use a different formula to calculate how the color affects lighting.
|
||||
uint16_t FogDensity;
|
||||
|
||||
void Clear()
|
||||
{
|
||||
LightColor = 0xffffff;
|
||||
FadeColor = 0;
|
||||
Desaturation = 0;
|
||||
BlendFactor = 0;
|
||||
FogDensity = 0;
|
||||
}
|
||||
|
||||
void MakeWhite()
|
||||
{
|
||||
LightColor = 0xffffff;
|
||||
}
|
||||
|
||||
void ClearColor()
|
||||
{
|
||||
LightColor = 0xffffff;
|
||||
BlendFactor = 0;
|
||||
Desaturation = 0;
|
||||
}
|
||||
|
||||
void CopyLight(FColormap &from)
|
||||
{
|
||||
LightColor = from.LightColor;
|
||||
Desaturation = from.Desaturation;
|
||||
BlendFactor = from.BlendFactor;
|
||||
}
|
||||
|
||||
void CopyFog(FColormap &from)
|
||||
{
|
||||
FadeColor = from.FadeColor;
|
||||
FogDensity = from.FogDensity;
|
||||
}
|
||||
|
||||
void CopyFrom3DLight(lightlist_t *light);
|
||||
|
||||
void Decolorize() // this for 'nocoloredspritelighting' and not the same as desaturation. The normal formula results in a value that's too dark.
|
||||
{
|
||||
int v = (LightColor.r + LightColor.g + LightColor.b) / 3;
|
||||
LightColor.r = LightColor.g = LightColor.b = (255 + v + v) / 3;
|
||||
}
|
||||
|
||||
bool operator == (const FColormap &other)
|
||||
{
|
||||
return LightColor == other.LightColor && FadeColor == other.FadeColor && Desaturation == other.Desaturation &&
|
||||
BlendFactor == other.BlendFactor && FogDensity == other.FogDensity;
|
||||
}
|
||||
|
||||
bool operator != (const FColormap &other)
|
||||
{
|
||||
return !operator==(other);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
struct FSWColormap
|
||||
{
|
||||
uint8_t *Maps = nullptr;
|
||||
|
@ -32,6 +97,7 @@ struct FDynamicColormap : FSWColormap
|
|||
FDynamicColormap *Next;
|
||||
};
|
||||
|
||||
|
||||
// For hardware-accelerated weapon sprites in colored sectors
|
||||
struct FColormapStyle
|
||||
{
|
||||
|
@ -83,5 +149,9 @@ extern bool NormalLightHasFixedLights;
|
|||
|
||||
FDynamicColormap *GetSpecialLights (PalEntry lightcolor, PalEntry fadecolor, int desaturate);
|
||||
|
||||
inline FDynamicColormap *GetColorTable(const FColormap &cm)
|
||||
{
|
||||
return GetSpecialLights(cm.LightColor, cm.FadeColor, cm.Desaturation);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
32
src/r_defs.h
32
src/r_defs.h
|
@ -639,6 +639,7 @@ public:
|
|||
void AdjustFloorClip () const;
|
||||
void SetColor(int r, int g, int b, int desat);
|
||||
void SetFade(int r, int g, int b);
|
||||
void SetFogDensity(int dens);
|
||||
void ClosestPoint(const DVector2 &pos, DVector2 &out) const;
|
||||
int GetFloorLight () const;
|
||||
int GetCeilingLight () const;
|
||||
|
@ -953,8 +954,27 @@ public:
|
|||
secplane_t floorplane, ceilingplane;
|
||||
|
||||
// [RH] give floor and ceiling even more properties
|
||||
FDynamicColormap *ColorMap; // [RH] Per-sector colormap
|
||||
PalEntry SpecialColors[5];
|
||||
PalEntry SpecialColors[5];
|
||||
FColormap Colormap;
|
||||
|
||||
private:
|
||||
FDynamicColormap *_ColorMap; // [RH] Per-sector colormap
|
||||
|
||||
public:
|
||||
// just a helper for refactoring
|
||||
FDynamicColormap *GetColorMap()
|
||||
{
|
||||
return _ColorMap;
|
||||
}
|
||||
|
||||
void CopyColors(sector_t *other)
|
||||
{
|
||||
memcpy(SpecialColors, other->SpecialColors, sizeof(SpecialColors));
|
||||
Colormap = other->Colormap;
|
||||
|
||||
_ColorMap = other->_ColorMap;
|
||||
}
|
||||
|
||||
|
||||
|
||||
TObjPtr<AActor*> SoundTarget;
|
||||
|
@ -1472,5 +1492,13 @@ inline bool FBoundingBox::inRange(const line_t *ld) const
|
|||
}
|
||||
|
||||
|
||||
inline void FColormap::CopyFrom3DLight(lightlist_t *light)
|
||||
{
|
||||
CopyLight(light->extra_colormap);
|
||||
if (light->caster && (light->caster->flags&FF_FADEWALLS) && light->extra_colormap.FadeColor != 0)
|
||||
{
|
||||
CopyFog(light->extra_colormap);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -214,7 +214,7 @@ namespace swrenderer
|
|||
if (mBackSector->GetVisFlags(sector_t::floor) != mFrontSector->GetVisFlags(sector_t::floor)) return false;
|
||||
if (mBackSector->GetVisFlags(sector_t::ceiling) != mFrontSector->GetVisFlags(sector_t::ceiling)) return false;
|
||||
|
||||
if (mBackSector->ColorMap != mFrontSector->ColorMap) return false;
|
||||
if (mBackSector->Colormap != mFrontSector->Colormap) return false;
|
||||
|
||||
if (mFrontSector->e && mFrontSector->e->XFloor.lightlist.Size()) return false;
|
||||
if (mBackSector->e && mBackSector->e->XFloor.lightlist.Size()) return false;
|
||||
|
@ -603,7 +603,7 @@ namespace swrenderer
|
|||
if (mFrontSector->heightsec) return true;
|
||||
|
||||
if (mBackSector->GetVisFlags(sector_t::floor) != mFrontSector->GetVisFlags(sector_t::floor)) return true;
|
||||
if (mBackSector->ColorMap != mFrontSector->ColorMap) return true;
|
||||
if (mBackSector->Colormap != mFrontSector->Colormap) return true;
|
||||
if (mFrontSector->e && mFrontSector->e->XFloor.lightlist.Size()) return true;
|
||||
if (mBackSector->e && mBackSector->e->XFloor.lightlist.Size()) return true;
|
||||
|
||||
|
@ -663,7 +663,7 @@ namespace swrenderer
|
|||
if (mBackSector->GetPlaneLight(sector_t::ceiling) != mFrontSector->GetPlaneLight(sector_t::ceiling)) return true;
|
||||
if (mBackSector->GetFlags(sector_t::ceiling) != mFrontSector->GetFlags(sector_t::ceiling)) return true;
|
||||
|
||||
if (mBackSector->ColorMap != mFrontSector->ColorMap) return true;
|
||||
if (mBackSector->Colormap != mFrontSector->Colormap) return true;
|
||||
if (mFrontSector->e && mFrontSector->e->XFloor.lightlist.Size()) return true;
|
||||
if (mBackSector->e && mBackSector->e->XFloor.lightlist.Size()) return true;
|
||||
|
||||
|
@ -975,8 +975,8 @@ namespace swrenderer
|
|||
|
||||
bool SWRenderLine::IsFogBoundary(sector_t *front, sector_t *back) const
|
||||
{
|
||||
return r_fogboundary && CameraLight::Instance()->FixedColormap() == nullptr && front->ColorMap->Fade &&
|
||||
front->ColorMap->Fade != back->ColorMap->Fade &&
|
||||
return r_fogboundary && CameraLight::Instance()->FixedColormap() == nullptr && front->Colormap.FadeColor &&
|
||||
front->Colormap.FadeColor != back->Colormap.FadeColor &&
|
||||
(front->GetTexture(sector_t::ceiling) != skyflatnum || back->GetTexture(sector_t::ceiling) != skyflatnum);
|
||||
}
|
||||
|
||||
|
|
|
@ -105,7 +105,7 @@ namespace swrenderer
|
|||
// killough 4/13/98: get correct lightlevel for 2s normal textures
|
||||
sec = Thread->OpaquePass->FakeFlat(frontsector, &tempsec, nullptr, nullptr, nullptr, 0, 0, 0, 0);
|
||||
|
||||
FDynamicColormap *basecolormap = sec->ColorMap; // [RH] Set basecolormap
|
||||
FDynamicColormap *basecolormap = GetColorTable(sec->Colormap); // [RH] Set basecolormap
|
||||
|
||||
int wallshade = ds->shade;
|
||||
rw_lightstep = ds->lightstep;
|
||||
|
@ -125,7 +125,7 @@ namespace swrenderer
|
|||
if (clip3d->sclipTop <= frontsector->e->XFloor.lightlist[i].plane.Zat0())
|
||||
{
|
||||
lightlist_t *lit = &frontsector->e->XFloor.lightlist[i];
|
||||
basecolormap = lit->extra_colormap;
|
||||
basecolormap = GetColorTable(lit->extra_colormap);
|
||||
bool foggy = (level.fadeto || basecolormap->Fade || (level.flags & LEVEL_HASFADETABLE)); // [RH] set foggy flag
|
||||
wallshade = LightVisibility::LightLevelToShade(curline->sidedef->GetLightLevel(ds->foggy, *lit->p_lightlevel, lit->lightsource != nullptr) + LightVisibility::ActualExtraLight(ds->foggy, viewport), foggy);
|
||||
break;
|
||||
|
@ -691,7 +691,7 @@ namespace swrenderer
|
|||
}
|
||||
}
|
||||
// correct colors now
|
||||
FDynamicColormap *basecolormap = frontsector->ColorMap;
|
||||
FDynamicColormap *basecolormap = GetColorTable(frontsector->Colormap);
|
||||
wallshade = ds->shade;
|
||||
CameraLight *cameraLight = CameraLight::Instance();
|
||||
if (cameraLight->FixedLightLevel() < 0)
|
||||
|
@ -703,7 +703,7 @@ namespace swrenderer
|
|||
if (clip3d->sclipTop <= backsector->e->XFloor.lightlist[j].plane.Zat0())
|
||||
{
|
||||
lightlist_t *lit = &backsector->e->XFloor.lightlist[j];
|
||||
basecolormap = lit->extra_colormap;
|
||||
basecolormap = GetColorTable(lit->extra_colormap);
|
||||
bool foggy = (level.fadeto || basecolormap->Fade || (level.flags & LEVEL_HASFADETABLE)); // [RH] set foggy flag
|
||||
wallshade = LightVisibility::LightLevelToShade(curline->sidedef->GetLightLevel(ds->foggy, *lit->p_lightlevel, lit->lightsource != nullptr) + LightVisibility::ActualExtraLight(ds->foggy, Thread->Viewport.get()), foggy);
|
||||
break;
|
||||
|
@ -717,7 +717,7 @@ namespace swrenderer
|
|||
if (clip3d->sclipTop <= frontsector->e->XFloor.lightlist[j].plane.Zat0())
|
||||
{
|
||||
lightlist_t *lit = &frontsector->e->XFloor.lightlist[j];
|
||||
basecolormap = lit->extra_colormap;
|
||||
basecolormap = GetColorTable(lit->extra_colormap);
|
||||
bool foggy = (level.fadeto || basecolormap->Fade || (level.flags & LEVEL_HASFADETABLE)); // [RH] set foggy flag
|
||||
wallshade = LightVisibility::LightLevelToShade(curline->sidedef->GetLightLevel(ds->foggy, *lit->p_lightlevel, lit->lightsource != nullptr) + LightVisibility::ActualExtraLight(ds->foggy, Thread->Viewport.get()), foggy);
|
||||
break;
|
||||
|
@ -868,7 +868,7 @@ namespace swrenderer
|
|||
}
|
||||
}
|
||||
// correct colors now
|
||||
FDynamicColormap *basecolormap = frontsector->ColorMap;
|
||||
FDynamicColormap *basecolormap = GetColorTable(frontsector->Colormap);
|
||||
wallshade = ds->shade;
|
||||
CameraLight *cameraLight = CameraLight::Instance();
|
||||
if (cameraLight->FixedLightLevel() < 0)
|
||||
|
@ -880,7 +880,7 @@ namespace swrenderer
|
|||
if (clip3d->sclipTop <= backsector->e->XFloor.lightlist[j].plane.Zat0())
|
||||
{
|
||||
lightlist_t *lit = &backsector->e->XFloor.lightlist[j];
|
||||
basecolormap = lit->extra_colormap;
|
||||
basecolormap = GetColorTable(lit->extra_colormap);
|
||||
bool foggy = (level.fadeto || basecolormap->Fade || (level.flags & LEVEL_HASFADETABLE)); // [RH] set foggy flag
|
||||
wallshade = LightVisibility::LightLevelToShade(curline->sidedef->GetLightLevel(ds->foggy, *lit->p_lightlevel, lit->lightsource != nullptr) + LightVisibility::ActualExtraLight(ds->foggy, Thread->Viewport.get()), foggy);
|
||||
break;
|
||||
|
@ -894,7 +894,7 @@ namespace swrenderer
|
|||
if (clip3d->sclipTop <= frontsector->e->XFloor.lightlist[j].plane.Zat0())
|
||||
{
|
||||
lightlist_t *lit = &frontsector->e->XFloor.lightlist[j];
|
||||
basecolormap = lit->extra_colormap;
|
||||
basecolormap = GetColorTable(lit->extra_colormap);
|
||||
bool foggy = (level.fadeto || basecolormap->Fade || (level.flags & LEVEL_HASFADETABLE)); // [RH] set foggy flag
|
||||
wallshade = LightVisibility::LightLevelToShade(curline->sidedef->GetLightLevel(ds->foggy, *lit->p_lightlevel, lit->lightsource != nullptr) + LightVisibility::ActualExtraLight(ds->foggy, Thread->Viewport.get()), foggy);
|
||||
break;
|
||||
|
|
|
@ -394,7 +394,7 @@ namespace swrenderer
|
|||
}
|
||||
|
||||
lightlist_t *lit = &frontsector->e->XFloor.lightlist[i];
|
||||
basecolormap = lit->extra_colormap;
|
||||
basecolormap = GetColorTable(lit->extra_colormap);
|
||||
wallshade = LightVisibility::LightLevelToShade(curline->sidedef->GetLightLevel(foggy, *lit->p_lightlevel, lit->lightsource != NULL) + LightVisibility::ActualExtraLight(foggy, Thread->Viewport.get()), foggy);
|
||||
}
|
||||
|
||||
|
|
|
@ -205,7 +205,7 @@ void SWCanvas::DrawTexture(DCanvas *canvas, FTexture *img, DrawParms &parms)
|
|||
|
||||
void SWCanvas::FillSimplePoly(DCanvas *canvas, FTexture *tex, FVector2 *points, int npoints,
|
||||
double originx, double originy, double scalex, double scaley, DAngle rotation,
|
||||
FDynamicColormap *colormap, PalEntry flatcolor, int lightlevel, int bottomclip)
|
||||
const FColormap &fcolormap, PalEntry flatcolor, int lightlevel, int bottomclip)
|
||||
{
|
||||
// Use an equation similar to player sprites to determine shade
|
||||
fixed_t shade = LightVisibility::LightLevelToShade(lightlevel, true) - 12 * FRACUNIT;
|
||||
|
@ -216,6 +216,7 @@ void SWCanvas::FillSimplePoly(DCanvas *canvas, FTexture *tex, FVector2 *points,
|
|||
fixed_t x;
|
||||
bool dorotate = rotation != 0.;
|
||||
double cosrot, sinrot;
|
||||
auto colormap = GetColorTable(fcolormap);
|
||||
|
||||
if (--npoints < 2)
|
||||
{ // not a polygon or we're not locked
|
||||
|
|
|
@ -10,7 +10,7 @@ public:
|
|||
static void DrawTexture(DCanvas *canvas, FTexture *img, DrawParms &parms);
|
||||
static void FillSimplePoly(DCanvas *canvas, FTexture *tex, FVector2 *points, int npoints,
|
||||
double originx, double originy, double scalex, double scaley, DAngle rotation,
|
||||
FDynamicColormap *colormap, PalEntry flatcolor, int lightlevel, int bottomclip);
|
||||
const FColormap &colormap, PalEntry flatcolor, int lightlevel, int bottomclip);
|
||||
static void DrawLine(DCanvas *canvas, int x0, int y0, int x1, int y1, int palColor, uint32_t realcolor);
|
||||
static void DrawPixel(DCanvas *canvas, int x, int y, int palColor, uint32_t realcolor);
|
||||
static void Clear(DCanvas *canvas, int left, int top, int right, int bottom, int palcolor, uint32_t color);
|
||||
|
|
|
@ -118,7 +118,7 @@ namespace swrenderer
|
|||
{
|
||||
if (underwater)
|
||||
{
|
||||
tempsec->ColorMap = s->ColorMap;
|
||||
tempsec->Colormap = s->Colormap;
|
||||
if (!(s->MoreFlags & SECF_NOFAKELIGHT))
|
||||
{
|
||||
tempsec->lightlevel = s->lightlevel;
|
||||
|
@ -192,7 +192,7 @@ namespace swrenderer
|
|||
tempsec->ceilingplane = s->floorplane;
|
||||
tempsec->ceilingplane.FlipVert();
|
||||
tempsec->ceilingplane.ChangeHeight(-1 / 65536.);
|
||||
tempsec->ColorMap = s->ColorMap;
|
||||
tempsec->Colormap = s->Colormap;
|
||||
}
|
||||
|
||||
// killough 11/98: prevent sudden light changes from non-water sectors:
|
||||
|
@ -241,8 +241,7 @@ namespace swrenderer
|
|||
tempsec->floorplane = s->ceilingplane;
|
||||
tempsec->floorplane.FlipVert();
|
||||
tempsec->floorplane.ChangeHeight(+1 / 65536.);
|
||||
tempsec->ColorMap = s->ColorMap;
|
||||
tempsec->ColorMap = s->ColorMap;
|
||||
tempsec->Colormap = s->Colormap;
|
||||
|
||||
tempsec->SetTexture(sector_t::ceiling, diffTex ? sec->GetTexture(sector_t::ceiling) : s->GetTexture(sector_t::ceiling), false);
|
||||
tempsec->SetTexture(sector_t::floor, s->GetTexture(sector_t::ceiling), false);
|
||||
|
@ -478,7 +477,7 @@ namespace swrenderer
|
|||
cll = ceilinglightlevel;
|
||||
|
||||
// [RH] set foggy flag
|
||||
bool foggy = level.fadeto || frontsector->ColorMap->Fade || (level.flags & LEVEL_HASFADETABLE);
|
||||
bool foggy = level.fadeto || frontsector->Colormap.FadeColor || (level.flags & LEVEL_HASFADETABLE);
|
||||
|
||||
// kg3D - fake lights
|
||||
CameraLight *cameraLight = CameraLight::Instance();
|
||||
|
@ -486,7 +485,7 @@ namespace swrenderer
|
|||
if (cameraLight->FixedLightLevel() < 0 && frontsector->e && frontsector->e->XFloor.lightlist.Size())
|
||||
{
|
||||
light = P_GetPlaneLight(frontsector, &frontsector->ceilingplane, false);
|
||||
basecolormap = light->extra_colormap;
|
||||
basecolormap = GetColorTable(light->extra_colormap);
|
||||
// If this is the real ceiling, don't discard plane lighting R_FakeFlat()
|
||||
// accounted for.
|
||||
if (light->p_lightlevel != &frontsector->lightlevel)
|
||||
|
@ -496,7 +495,7 @@ namespace swrenderer
|
|||
}
|
||||
else
|
||||
{
|
||||
basecolormap = (r_fullbrightignoresectorcolor && cameraLight->FixedLightLevel() >= 0) ? &FullNormalLight : frontsector->ColorMap;
|
||||
basecolormap = (r_fullbrightignoresectorcolor && cameraLight->FixedLightLevel() >= 0) ? &FullNormalLight : GetColorTable(frontsector->Colormap);
|
||||
}
|
||||
|
||||
portal = frontsector->ValidatePortal(sector_t::ceiling);
|
||||
|
@ -524,7 +523,7 @@ namespace swrenderer
|
|||
if (cameraLight->FixedLightLevel() < 0 && frontsector->e && frontsector->e->XFloor.lightlist.Size())
|
||||
{
|
||||
light = P_GetPlaneLight(frontsector, &frontsector->floorplane, false);
|
||||
basecolormap = light->extra_colormap;
|
||||
basecolormap = GetColorTable(light->extra_colormap);
|
||||
// If this is the real floor, don't discard plane lighting R_FakeFlat()
|
||||
// accounted for.
|
||||
if (light->p_lightlevel != &frontsector->lightlevel)
|
||||
|
@ -534,7 +533,7 @@ namespace swrenderer
|
|||
}
|
||||
else
|
||||
{
|
||||
basecolormap = (r_fullbrightignoresectorcolor && cameraLight->FixedLightLevel() >= 0) ? &FullNormalLight : frontsector->ColorMap;
|
||||
basecolormap = (r_fullbrightignoresectorcolor && cameraLight->FixedLightLevel() >= 0) ? &FullNormalLight : GetColorTable(frontsector->Colormap);
|
||||
}
|
||||
|
||||
// killough 3/7/98: Add (x,y) offsets to flats, add deep water check
|
||||
|
@ -609,7 +608,7 @@ namespace swrenderer
|
|||
if (cameraLight->FixedLightLevel() < 0 && sub->sector->e->XFloor.lightlist.Size())
|
||||
{
|
||||
light = P_GetPlaneLight(sub->sector, &frontsector->floorplane, false);
|
||||
basecolormap = light->extra_colormap;
|
||||
basecolormap = GetColorTable(light->extra_colormap);
|
||||
floorlightlevel = *light->p_lightlevel;
|
||||
}
|
||||
|
||||
|
@ -674,7 +673,7 @@ namespace swrenderer
|
|||
if (cameraLight->FixedLightLevel() < 0 && sub->sector->e->XFloor.lightlist.Size())
|
||||
{
|
||||
light = P_GetPlaneLight(sub->sector, &frontsector->ceilingplane, false);
|
||||
basecolormap = light->extra_colormap;
|
||||
basecolormap = GetColorTable(light->extra_colormap);
|
||||
ceilinglightlevel = *light->p_lightlevel;
|
||||
}
|
||||
tempsec.ceilingplane.ChangeHeight(1 / 65536.);
|
||||
|
@ -703,7 +702,7 @@ namespace swrenderer
|
|||
ceilingplane = backupcp;
|
||||
}
|
||||
|
||||
basecolormap = frontsector->ColorMap;
|
||||
basecolormap = GetColorTable(frontsector->Colormap);
|
||||
floorlightlevel = fll;
|
||||
ceilinglightlevel = cll;
|
||||
|
||||
|
@ -886,7 +885,7 @@ namespace swrenderer
|
|||
{
|
||||
int lightlevel = thing->Sector->GetTexture(sector_t::ceiling) == skyflatnum ? thing->Sector->GetCeilingLight() : thing->Sector->GetFloorLight();
|
||||
thingShade = LightVisibility::LightLevelToShade(lightlevel + LightVisibility::ActualExtraLight(foggy, Thread->Viewport.get()), foggy);
|
||||
thingColormap = thing->Sector->ColorMap;
|
||||
thingColormap = GetColorTable(thing->Sector->Colormap);
|
||||
}
|
||||
|
||||
if ((sprite.renderflags & RF_SPRITETYPEMASK) == RF_WALLSPRITE)
|
||||
|
|
|
@ -148,7 +148,7 @@ namespace swrenderer
|
|||
botplane = &heightsec->ceilingplane;
|
||||
toppic = sector->GetTexture(sector_t::ceiling);
|
||||
botpic = heightsec->GetTexture(sector_t::ceiling);
|
||||
map = heightsec->ColorMap;
|
||||
map = GetColorTable(heightsec->Colormap);
|
||||
}
|
||||
else if (fakeside == WaterFakeSide::BelowFloor)
|
||||
{
|
||||
|
@ -156,7 +156,7 @@ namespace swrenderer
|
|||
botplane = §or->floorplane;
|
||||
toppic = heightsec->GetTexture(sector_t::floor);
|
||||
botpic = sector->GetTexture(sector_t::floor);
|
||||
map = heightsec->ColorMap;
|
||||
map = GetColorTable(heightsec->Colormap);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -164,7 +164,7 @@ namespace swrenderer
|
|||
botplane = &heightsec->floorplane;
|
||||
toppic = heightsec->GetTexture(sector_t::ceiling);
|
||||
botpic = heightsec->GetTexture(sector_t::floor);
|
||||
map = sector->ColorMap;
|
||||
map = GetColorTable(sector->Colormap);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -173,7 +173,7 @@ namespace swrenderer
|
|||
botplane = §or->floorplane;
|
||||
toppic = sector->GetTexture(sector_t::ceiling);
|
||||
botpic = sector->GetTexture(sector_t::floor);
|
||||
map = sector->ColorMap;
|
||||
map = GetColorTable(sector->Colormap);
|
||||
}
|
||||
|
||||
if (botpic != skyflatnum && particle->Pos.Z < botplane->ZatPoint(particle->Pos))
|
||||
|
|
|
@ -103,9 +103,9 @@ namespace swrenderer
|
|||
break;
|
||||
sec = rover->model;
|
||||
if (rover->flags & FF_FADEWALLS)
|
||||
basecolormap = sec->ColorMap;
|
||||
basecolormap = GetColorTable(sec->Colormap);
|
||||
else
|
||||
basecolormap = Thread->Viewport->viewpoint.sector->e->XFloor.lightlist[i].extra_colormap;
|
||||
basecolormap = GetColorTable(Thread->Viewport->viewpoint.sector->e->XFloor.lightlist[i].extra_colormap);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -113,7 +113,7 @@ namespace swrenderer
|
|||
if (!sec)
|
||||
{
|
||||
sec = Thread->Viewport->viewpoint.sector;
|
||||
basecolormap = sec->ColorMap;
|
||||
basecolormap = GetColorTable(sec->Colormap);
|
||||
}
|
||||
floorlight = ceilinglight = sec->lightlevel;
|
||||
}
|
||||
|
@ -123,7 +123,7 @@ namespace swrenderer
|
|||
sec = Thread->OpaquePass->FakeFlat(Thread->Viewport->viewpoint.sector, &tempsec, &floorlight, &ceilinglight, nullptr, 0, 0, 0, 0);
|
||||
|
||||
// [RH] set basecolormap
|
||||
basecolormap = sec->ColorMap;
|
||||
basecolormap = GetColorTable(sec->Colormap);
|
||||
}
|
||||
|
||||
// [RH] set foggy flag
|
||||
|
|
|
@ -113,11 +113,11 @@ namespace swrenderer
|
|||
sec = rover->model;
|
||||
if (rover->flags & FF_FADEWALLS)
|
||||
{
|
||||
mybasecolormap = sec->ColorMap;
|
||||
mybasecolormap = GetColorTable(sec->Colormap);
|
||||
}
|
||||
else
|
||||
{
|
||||
mybasecolormap = spr->sector->e->XFloor.lightlist[i].extra_colormap;
|
||||
mybasecolormap = GetColorTable(spr->sector->e->XFloor.lightlist[i].extra_colormap);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -955,7 +955,7 @@ void DCanvas::Dim(PalEntry color, float damount, int x1, int y1, int w, int h)
|
|||
|
||||
void DCanvas::FillSimplePoly(FTexture *tex, FVector2 *points, int npoints,
|
||||
double originx, double originy, double scalex, double scaley, DAngle rotation,
|
||||
FDynamicColormap *colormap, PalEntry flatcolor, int lightlevel, int bottomclip)
|
||||
const FColormap &colormap, PalEntry flatcolor, int lightlevel, int bottomclip)
|
||||
{
|
||||
#ifndef NO_SWRENDER
|
||||
SWCanvas::FillSimplePoly(this, tex, points, npoints, originx, originy, scalex, scaley, rotation, colormap, flatcolor, lightlevel, bottomclip);
|
||||
|
|
|
@ -52,6 +52,7 @@ void V_OutputResized (int width, int height);
|
|||
void V_CalcCleanFacs (int designwidth, int designheight, int realwidth, int realheight, int *cleanx, int *cleany, int *cx1=NULL, int *cx2=NULL);
|
||||
|
||||
class FTexture;
|
||||
struct FColormap;
|
||||
|
||||
// TagItem definitions for DrawTexture. As far as I know, tag lists
|
||||
// originated on the Amiga.
|
||||
|
@ -232,7 +233,7 @@ public:
|
|||
// Fill a simple polygon with a texture
|
||||
virtual void FillSimplePoly(FTexture *tex, FVector2 *points, int npoints,
|
||||
double originx, double originy, double scalex, double scaley, DAngle rotation,
|
||||
struct FDynamicColormap *colormap, PalEntry flatcolor, int lightlevel, int bottomclip);
|
||||
const FColormap &colormap, PalEntry flatcolor, int lightlevel, int bottomclip);
|
||||
|
||||
// Set an area to a specified color
|
||||
virtual void Clear (int left, int top, int right, int bottom, int palcolor, uint32_t color);
|
||||
|
|
|
@ -85,11 +85,11 @@ const char *GetVersionString();
|
|||
#define SAVEGAME_EXT "zds"
|
||||
|
||||
// MINSAVEVER is the minimum level snapshot version that can be loaded.
|
||||
#define MINSAVEVER 4550
|
||||
#define MINSAVEVER 4551
|
||||
|
||||
// Use 4500 as the base git save version, since it's higher than the
|
||||
// SVN revision ever got.
|
||||
#define SAVEVER 4550
|
||||
#define SAVEVER 4551
|
||||
|
||||
// This is so that derivates can use the same savegame versions without worrying about engine compatibility
|
||||
#define GAMESIG "GZDOOM"
|
||||
|
|
|
@ -3125,7 +3125,7 @@ void D3DFB::FlatFill(int left, int top, int right, int bottom, FTexture *src, bo
|
|||
|
||||
void D3DFB::FillSimplePoly(FTexture *texture, FVector2 *points, int npoints,
|
||||
double originx, double originy, double scalex, double scaley,
|
||||
DAngle rotation, FDynamicColormap *colormap, PalEntry flatcolor, int lightlevel, int bottomclip)
|
||||
DAngle rotation, const FColormap &colormap, PalEntry flatcolor, int lightlevel, int bottomclip)
|
||||
{
|
||||
// Use an equation similar to player sprites to determine shade
|
||||
double fadelevel = clamp((swrenderer::LightVisibility::LightLevelToShade(lightlevel, true)/65536. - 12) / NUMCOLORMAPS, 0.0, 1.0);
|
||||
|
@ -3174,20 +3174,17 @@ void D3DFB::FillSimplePoly(FTexture *texture, FVector2 *points, int npoints,
|
|||
{
|
||||
quad->Flags = BQF_WrapUV | BQF_GamePalette | BQF_DisableAlphaTest;
|
||||
quad->ShaderNum = BQS_PalTex;
|
||||
if (colormap != NULL)
|
||||
if (colormap.Desaturation != 0)
|
||||
{
|
||||
if (colormap->Desaturate != 0)
|
||||
{
|
||||
quad->Flags |= BQF_Desaturated;
|
||||
}
|
||||
quad->ShaderNum = BQS_InGameColormap;
|
||||
quad->Desat = colormap->Desaturate;
|
||||
color0 = D3DCOLOR_ARGB(255, colormap->Color.r, colormap->Color.g, colormap->Color.b);
|
||||
color1 = D3DCOLOR_ARGB(DWORD((1 - fadelevel) * 255),
|
||||
DWORD(colormap->Fade.r * fadelevel),
|
||||
DWORD(colormap->Fade.g * fadelevel),
|
||||
DWORD(colormap->Fade.b * fadelevel));
|
||||
quad->Flags |= BQF_Desaturated;
|
||||
}
|
||||
quad->ShaderNum = BQS_InGameColormap;
|
||||
quad->Desat = colormap.Desaturation;
|
||||
color0 = D3DCOLOR_ARGB(255, colormap.LightColor.r, colormap.LightColor.g, colormap.LightColor.b);
|
||||
color1 = D3DCOLOR_ARGB(DWORD((1 - fadelevel) * 255),
|
||||
DWORD(colormap.FadeColor.r * fadelevel),
|
||||
DWORD(colormap.FadeColor.g * fadelevel),
|
||||
DWORD(colormap.FadeColor.b * fadelevel));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -139,7 +139,7 @@ public:
|
|||
void DrawPixel(int x, int y, int palcolor, uint32_t rgbcolor);
|
||||
void FillSimplePoly(FTexture *tex, FVector2 *points, int npoints,
|
||||
double originx, double originy, double scalex, double scaley,
|
||||
DAngle rotation, FDynamicColormap *colormap, PalEntry flatcolor, int lightlevel, int bottomclip) override;
|
||||
DAngle rotation, const FColormap &colormap, PalEntry flatcolor, int lightlevel, int bottomclip) override;
|
||||
bool WipeStartScreen(int type);
|
||||
void WipeEndScreen();
|
||||
bool WipeDo(int ticks);
|
||||
|
|
Loading…
Reference in a new issue