diff --git a/src/doomtype.h b/src/doomtype.h index 5a4d3f0670..6c8e1a33b0 100644 --- a/src/doomtype.h +++ b/src/doomtype.h @@ -142,6 +142,11 @@ struct PalEntry return other; } } + void Decolorize() // this for 'nocoloredspritelighting' and not the same as desaturation. The normal formula results in a value that's too dark. + { + int v = (r + g + b); + r = g = b = ((255*3) + v + v) / 9; + } bool isBlack() const { return (d & 0xffffff) == 0; diff --git a/src/g_level.h b/src/g_level.h index 641cecd4ff..6b4d1d8f24 100644 --- a/src/g_level.h +++ b/src/g_level.h @@ -240,6 +240,7 @@ enum ELevelFlags : unsigned int LEVEL3_REMOVEITEMS = 0x00000002, // kills all INVBAR items on map change. LEVEL3_ATTENUATE = 0x00000004, // attenuate lights? LEVEL3_NOLIGHTFADE = 0x00000008, // no light fading to black. + LEVEL3_NOCOLOREDSPRITELIGHTING = 0x00000010, // draw sprites only with color-less light }; diff --git a/src/g_mapinfo.cpp b/src/g_mapinfo.cpp index bbb9ed6072..a39508e6c7 100644 --- a/src/g_mapinfo.cpp +++ b/src/g_mapinfo.cpp @@ -1357,6 +1357,7 @@ MapFlagHandlers[] = { "spawnwithweaponraised", MITYPE_SETFLAG2, LEVEL2_PRERAISEWEAPON, 0 }, { "forcefakecontrast", MITYPE_SETFLAG3, LEVEL3_FORCEFAKECONTRAST, 0 }, { "nolightfade", MITYPE_SETFLAG3, LEVEL3_NOLIGHTFADE, 0 }, + { "nocoloredspritelighting", MITYPE_SETFLAG3, LEVEL3_NOCOLOREDSPRITELIGHTING, 0 }, { "nobotnodes", MITYPE_IGNORE, 0, 0 }, // Skulltag option: nobotnodes { "compat_shorttex", MITYPE_COMPATFLAG, COMPATF_SHORTTEX, 0 }, { "compat_stairs", MITYPE_COMPATFLAG, COMPATF_STAIRINDEX, 0 }, @@ -1431,7 +1432,16 @@ void FMapInfoParser::ParseMapDefinition(level_info_t &info) break; case MITYPE_SETFLAG: - info.flags |= handler->data1; + if (!CheckAssign()) + { + info.flags |= handler->data1; + } + else + { + sc.MustGetNumber(); + if (sc.Number) info.flags |= handler->data1; + else info.flags &= ~handler->data1; + } info.flags |= handler->data2; break; @@ -1445,7 +1455,16 @@ void FMapInfoParser::ParseMapDefinition(level_info_t &info) break; case MITYPE_SETFLAG2: - info.flags2 |= handler->data1; + if (!CheckAssign()) + { + info.flags2 |= handler->data1; + } + else + { + sc.MustGetNumber(); + if (sc.Number) info.flags2 |= handler->data1; + else info.flags2 &= ~handler->data1; + } info.flags2 |= handler->data2; break; @@ -1459,7 +1478,16 @@ void FMapInfoParser::ParseMapDefinition(level_info_t &info) break; case MITYPE_SETFLAG3: - info.flags3 |= handler->data1; + if (!CheckAssign()) + { + info.flags3 |= handler->data1; + } + else + { + sc.MustGetNumber(); + if (sc.Number) info.flags3 |= handler->data1; + else info.flags3 &= ~handler->data1; + } info.flags3 |= handler->data2; break; diff --git a/src/gl/data/gl_data.cpp b/src/gl/data/gl_data.cpp index 824407399e..f4b2ff391c 100644 --- a/src/gl/data/gl_data.cpp +++ b/src/gl/data/gl_data.cpp @@ -79,11 +79,6 @@ CUSTOM_CVAR(Bool, gl_notexturefill, false, 0) } -CUSTOM_CVAR(Bool, gl_nocoloredspritelighting, false, 0) -{ - glset.nocoloredspritelighting = self; -} - void gl_CreateSections(); //----------------------------------------------------------------------------- @@ -191,7 +186,6 @@ struct FGLROptions : public FOptionalMapinfoData identifier = "gl_renderer"; brightfog = false; lightmode = -1; - nocoloredspritelighting = -1; notexturefill = -1; skyrotatevector = FVector3(0,0,1); skyrotatevector2 = FVector3(0,0,1); @@ -202,7 +196,6 @@ struct FGLROptions : public FOptionalMapinfoData FGLROptions *newopt = new FGLROptions; newopt->identifier = identifier; newopt->lightmode = lightmode; - newopt->nocoloredspritelighting = nocoloredspritelighting; newopt->notexturefill = notexturefill; newopt->skyrotatevector = skyrotatevector; newopt->skyrotatevector2 = skyrotatevector2; @@ -212,7 +205,6 @@ struct FGLROptions : public FOptionalMapinfoData int lightmode; int brightfog; int8_t lightadditivesurfaces; - int8_t nocoloredspritelighting; int8_t notexturefill; FVector3 skyrotatevector; FVector3 skyrotatevector2; @@ -234,20 +226,6 @@ DEFINE_MAP_OPTION(lightmode, false) opt->lightmode = uint8_t(parse.sc.Number); } -DEFINE_MAP_OPTION(nocoloredspritelighting, false) -{ - FGLROptions *opt = info->GetOptData("gl_renderer"); - if (parse.CheckAssign()) - { - parse.sc.MustGetNumber(); - opt->nocoloredspritelighting = !!parse.sc.Number; - } - else - { - opt->nocoloredspritelighting = true; - } -} - DEFINE_MAP_OPTION(notexturefill, false) { FGLROptions *opt = info->GetOptData("gl_renderer"); @@ -317,8 +295,6 @@ static void ResetOpts() { if (!IsLightmodeValid()) glset.lightmode = gl_lightmode; else glset.lightmode = glset.map_lightmode; - if (glset.map_nocoloredspritelighting == -1) glset.nocoloredspritelighting = gl_nocoloredspritelighting; - else glset.nocoloredspritelighting = !!glset.map_nocoloredspritelighting; if (glset.map_notexturefill == -1) glset.notexturefill = gl_notexturefill; else glset.notexturefill = !!glset.map_notexturefill; if (glset.map_brightfog == -1) glset.brightfog = gl_brightfog; @@ -336,7 +312,6 @@ void InitGLRMapinfoData() glset.map_lightmode = opt->lightmode; glset.map_lightadditivesurfaces = opt->lightadditivesurfaces; glset.map_brightfog = opt->brightfog; - glset.map_nocoloredspritelighting = opt->nocoloredspritelighting; glset.map_notexturefill = opt->notexturefill; glset.skyrotatevector = opt->skyrotatevector; glset.skyrotatevector2 = opt->skyrotatevector2; @@ -346,7 +321,6 @@ void InitGLRMapinfoData() glset.map_lightmode = -1; glset.map_lightadditivesurfaces = -1; glset.map_brightfog = -1; - glset.map_nocoloredspritelighting = -1; glset.map_notexturefill = -1; glset.skyrotatevector = FVector3(0, 0, 1); glset.skyrotatevector2 = FVector3(0, 0, 1); diff --git a/src/gl/data/gl_data.h b/src/gl/data/gl_data.h index 6abc2d36a8..509afb17d5 100644 --- a/src/gl/data/gl_data.h +++ b/src/gl/data/gl_data.h @@ -9,13 +9,11 @@ struct GLRenderSettings { int8_t lightmode; - bool nocoloredspritelighting; bool notexturefill; bool brightfog; bool lightadditivesurfaces; int8_t map_lightmode; - int8_t map_nocoloredspritelighting; int8_t map_notexturefill; int8_t map_brightfog; int8_t map_lightadditivesurfaces; diff --git a/src/gl/scene/gl_decal.cpp b/src/gl/scene/gl_decal.cpp index 32cbac54a7..cf23102094 100644 --- a/src/gl/scene/gl_decal.cpp +++ b/src/gl/scene/gl_decal.cpp @@ -29,6 +29,7 @@ #include "gl/system/gl_system.h" #include "a_sharedglobal.h" #include "r_utility.h" +#include "g_levellocals.h" #include "gl/system/gl_cvars.h" #include "gl/data/gl_data.h" @@ -161,7 +162,7 @@ void GLWall::DrawDecal(DBaseDecal *decal) FColormap p = Colormap; - if (glset.nocoloredspritelighting) + if (level.flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING) { p.Decolorize(); } @@ -346,7 +347,7 @@ void GLWall::DrawDecal(DBaseDecal *decal) thiscm.FadeColor = Colormap.FadeColor; thiscm.CopyFrom3DLight(&(*lightlist)[k]); mDrawer->SetColor(thisll, rel, thiscm, a); - if (glset.nocoloredspritelighting) thiscm.Decolorize(); + if (level.flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING) thiscm.Decolorize(); mDrawer->SetFog(thisll, rel, &thiscm, RenderStyle == STYLE_Add); gl_RenderState.SetSplitPlanes((*lightlist)[k].plane, lowplane); diff --git a/src/gl/scene/gl_sprite.cpp b/src/gl/scene/gl_sprite.cpp index 02b67a743c..af3ed691f4 100644 --- a/src/gl/scene/gl_sprite.cpp +++ b/src/gl/scene/gl_sprite.cpp @@ -401,7 +401,7 @@ void GLSprite::Draw(int pass) FColormap thiscm; thiscm.CopyFog(Colormap); thiscm.CopyFrom3DLight(&(*lightlist)[i]); - if (glset.nocoloredspritelighting) + if (level.flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING) { thiscm.Decolorize(); } @@ -527,7 +527,7 @@ void GLSprite::SplitSprite(sector_t * frontsector, bool translucent) copySprite.lightlevel = gl_ClampLight(*lightlist[i].p_lightlevel); copySprite.Colormap.CopyLight(lightlist[i].extra_colormap); - if (glset.nocoloredspritelighting) + if (level.flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING) { copySprite.Colormap.Decolorize(); } @@ -940,7 +940,7 @@ void GLSprite::Process(AActor* thing, sector_t * sector, int thruportal) Colormap.LightColor.b = (3 * Colormap.LightColor.b + 0xff) / 4; } } - else if (glset.nocoloredspritelighting) + else if (level.flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING) { Colormap.Decolorize(); } @@ -1118,7 +1118,7 @@ void GLSprite::ProcessParticle (particle_t *particle, sector_t *sector)//, int s break; } } - if (glset.nocoloredspritelighting) + if (level.flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING) { Colormap.Decolorize(); // ZDoom never applies colored light to particles. } diff --git a/src/gl/scene/gl_weapon.cpp b/src/gl/scene/gl_weapon.cpp index 8cead55d6b..7e13b17e4d 100644 --- a/src/gl/scene/gl_weapon.cpp +++ b/src/gl/scene/gl_weapon.cpp @@ -251,7 +251,7 @@ void GLSceneDrawer::DrawPlayerSprites(sector_t * viewsector, bool hudModelStep) lightlevel = gl_ClampLight(fakesec->lightlevel); // calculate colormap for weapon sprites - if (viewsector->e->XFloor.ffloors.Size() && !glset.nocoloredspritelighting) + if (viewsector->e->XFloor.ffloors.Size() && !(level.flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING)) { TArray & lightlist = viewsector->e->XFloor.lightlist; for(i=0;iColormap; - if (glset.nocoloredspritelighting) cm.ClearColor(); + if (level.flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING) cm.ClearColor(); } lightlevel = gl_CalcLightLevel(lightlevel, getExtraLight(), true); diff --git a/src/polyrenderer/scene/poly_playersprite.cpp b/src/polyrenderer/scene/poly_playersprite.cpp index 78e7aa61c6..9d18a14579 100644 --- a/src/polyrenderer/scene/poly_playersprite.cpp +++ b/src/polyrenderer/scene/poly_playersprite.cpp @@ -215,7 +215,7 @@ void RenderPolyPlayerSprites::RenderSprite(DPSprite *sprite, AActor *owner, floa bool noaccel = false; - FDynamicColormap *basecolormap = GetColorTable(viewpoint.sector->Colormap, viewpoint.sector->SpecialColors[sector_t::sprites]); + FDynamicColormap *basecolormap = GetColorTable(viewpoint.sector->Colormap, viewpoint.sector->SpecialColors[sector_t::sprites], true); FDynamicColormap *colormap_to_use = basecolormap; int ColormapNum = 0; diff --git a/src/polyrenderer/scene/poly_sprite.cpp b/src/polyrenderer/scene/poly_sprite.cpp index 7dd3603f19..3940bf05d2 100644 --- a/src/polyrenderer/scene/poly_sprite.cpp +++ b/src/polyrenderer/scene/poly_sprite.cpp @@ -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(GetColorTable(sub->sector->Colormap, sub->sector->SpecialColors[sector_t::sprites])); + args.SetColormap(GetColorTable(sub->sector->Colormap, sub->sector->SpecialColors[sector_t::sprites], true)); args.SetClipPlane(clipPlane.x, clipPlane.y, clipPlane.z, clipPlane.w); TriBlendMode blendmode; diff --git a/src/polyrenderer/scene/poly_wallsprite.cpp b/src/polyrenderer/scene/poly_wallsprite.cpp index 294664ab34..a8f2a9ac07 100644 --- a/src/polyrenderer/scene/poly_wallsprite.cpp +++ b/src/polyrenderer/scene/poly_wallsprite.cpp @@ -123,7 +123,7 @@ void RenderPolyWallSprite::Render(const TriMatrix &worldToClip, const Vec4f &cli args.stenciltestvalue = stencilValue; args.stencilwritevalue = stencilValue; args.SetTexture(tex); - args.SetColormap(GetColorTable(sub->sector->Colormap, sub->sector->SpecialColors[sector_t::sprites])); + args.SetColormap(GetColorTable(sub->sector->Colormap, sub->sector->SpecialColors[sector_t::sprites], true)); args.SetClipPlane(clipPlane.x, clipPlane.y, clipPlane.z, clipPlane.w); args.subsectorTest = true; args.writeSubsector = false; diff --git a/src/r_data/colormaps.h b/src/r_data/colormaps.h index dc6c51c327..c8ffef8725 100644 --- a/src/r_data/colormaps.h +++ b/src/r_data/colormaps.h @@ -64,10 +64,9 @@ struct FColormap 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. + void Decolorize() { - int v = (LightColor.r + LightColor.g + LightColor.b) / 3; - LightColor.r = LightColor.g = LightColor.b = (255 + v + v) / 3; + LightColor.Decolorize(); } bool operator == (const FColormap &other) diff --git a/src/swrenderer/r_swcolormaps.h b/src/swrenderer/r_swcolormaps.h index adb03c2353..3159432dc8 100644 --- a/src/swrenderer/r_swcolormaps.h +++ b/src/swrenderer/r_swcolormaps.h @@ -1,6 +1,7 @@ #pragma once +#include "g_levellocals.h" struct FSWColormap { @@ -46,9 +47,16 @@ void SetDefaultColormap (const char *name); #endif // MSVC needs the forceinline here. -FORCEINLINE FDynamicColormap *GetColorTable(const FColormap &cm, PalEntry SpecialColor = 0xffffff) +FORCEINLINE FDynamicColormap *GetColorTable(const FColormap &cm, PalEntry SpecialColor = 0xffffff, bool forsprites = false) { - auto c = SpecialColor.Modulate(cm.LightColor); + PalEntry c; + if (!forsprites || !(level.flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING)) c = SpecialColor.Modulate(cm.LightColor); + else + { + c = cm.LightColor; + c.Decolorize(); + c = SpecialColor.Modulate(c); + } auto p = &NormalLight; if (c == p->Color && cm.FadeColor == p->Fade && diff --git a/src/swrenderer/scene/r_opaque_pass.cpp b/src/swrenderer/scene/r_opaque_pass.cpp index 1b16d7c6a3..35d7c30544 100644 --- a/src/swrenderer/scene/r_opaque_pass.cpp +++ b/src/swrenderer/scene/r_opaque_pass.cpp @@ -702,7 +702,7 @@ namespace swrenderer ceilingplane = backupcp; } - basecolormap = GetColorTable(frontsector->Colormap, frontsector->SpecialColors[sector_t::sprites]); + basecolormap = GetColorTable(frontsector->Colormap, frontsector->SpecialColors[sector_t::sprites], true); floorlightlevel = fll; ceilinglightlevel = cll; @@ -886,7 +886,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 = GetColorTable(thing->Sector->Colormap, thing->Sector->SpecialColors[sector_t::sprites]); + thingColormap = GetColorTable(thing->Sector->Colormap, thing->Sector->SpecialColors[sector_t::sprites], true); } if ((sprite.renderflags & RF_SPRITETYPEMASK) == RF_WALLSPRITE) diff --git a/src/swrenderer/things/r_particle.cpp b/src/swrenderer/things/r_particle.cpp index 659935c532..4d980b650b 100644 --- a/src/swrenderer/things/r_particle.cpp +++ b/src/swrenderer/things/r_particle.cpp @@ -148,7 +148,7 @@ namespace swrenderer botplane = &heightsec->ceilingplane; toppic = sector->GetTexture(sector_t::ceiling); botpic = heightsec->GetTexture(sector_t::ceiling); - map = GetColorTable(heightsec->Colormap, heightsec->SpecialColors[sector_t::sprites]); + map = GetColorTable(heightsec->Colormap, heightsec->SpecialColors[sector_t::sprites], true); } 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 = GetColorTable(heightsec->Colormap, heightsec->SpecialColors[sector_t::sprites]); + map = GetColorTable(heightsec->Colormap, heightsec->SpecialColors[sector_t::sprites], true); } else { @@ -164,7 +164,7 @@ namespace swrenderer botplane = &heightsec->floorplane; toppic = heightsec->GetTexture(sector_t::ceiling); botpic = heightsec->GetTexture(sector_t::floor); - map = GetColorTable(sector->Colormap, sector->SpecialColors[sector_t::sprites]); + map = GetColorTable(sector->Colormap, sector->SpecialColors[sector_t::sprites], true); } } else @@ -173,7 +173,7 @@ namespace swrenderer botplane = §or->floorplane; toppic = sector->GetTexture(sector_t::ceiling); botpic = sector->GetTexture(sector_t::floor); - map = GetColorTable(sector->Colormap, sector->SpecialColors[sector_t::sprites]); + map = GetColorTable(sector->Colormap, sector->SpecialColors[sector_t::sprites], true); } if (botpic != skyflatnum && particle->Pos.Z < botplane->ZatPoint(particle->Pos)) diff --git a/src/swrenderer/things/r_playersprite.cpp b/src/swrenderer/things/r_playersprite.cpp index c7e80c8a0a..4afa44d607 100644 --- a/src/swrenderer/things/r_playersprite.cpp +++ b/src/swrenderer/things/r_playersprite.cpp @@ -103,9 +103,9 @@ namespace swrenderer break; sec = rover->model; if (rover->flags & FF_FADEWALLS) - basecolormap = GetColorTable(sec->Colormap, sec->SpecialColors[sector_t::sprites]); + basecolormap = GetColorTable(sec->Colormap, sec->SpecialColors[sector_t::sprites], true); else - basecolormap = GetColorTable(Thread->Viewport->viewpoint.sector->e->XFloor.lightlist[i].extra_colormap, sec->SpecialColors[sector_t::sprites]); + basecolormap = GetColorTable(Thread->Viewport->viewpoint.sector->e->XFloor.lightlist[i].extra_colormap, sec->SpecialColors[sector_t::sprites], true); } break; } @@ -113,7 +113,7 @@ namespace swrenderer if (!sec) { sec = Thread->Viewport->viewpoint.sector; - basecolormap = GetColorTable(sec->Colormap, sec->SpecialColors[sector_t::sprites]); + basecolormap = GetColorTable(sec->Colormap, sec->SpecialColors[sector_t::sprites], true); } 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 = GetColorTable(sec->Colormap, sec->SpecialColors[sector_t::sprites]); + basecolormap = GetColorTable(sec->Colormap, sec->SpecialColors[sector_t::sprites], true); } // [RH] set foggy flag diff --git a/src/swrenderer/things/r_visiblesprite.cpp b/src/swrenderer/things/r_visiblesprite.cpp index 1a97641b47..bd03feb2d3 100644 --- a/src/swrenderer/things/r_visiblesprite.cpp +++ b/src/swrenderer/things/r_visiblesprite.cpp @@ -113,11 +113,11 @@ namespace swrenderer sec = rover->model; if (rover->flags & FF_FADEWALLS) { - mybasecolormap = GetColorTable(sec->Colormap, spr->sector->SpecialColors[sector_t::sprites]); + mybasecolormap = GetColorTable(sec->Colormap, spr->sector->SpecialColors[sector_t::sprites], true); } else { - mybasecolormap = GetColorTable(spr->sector->e->XFloor.lightlist[i].extra_colormap, spr->sector->SpecialColors[sector_t::sprites]); + mybasecolormap = GetColorTable(spr->sector->e->XFloor.lightlist[i].extra_colormap, spr->sector->SpecialColors[sector_t::sprites], true); } } break;