diff --git a/src/gl/renderer/gl_renderstate.cpp b/src/gl/renderer/gl_renderstate.cpp index 0cc80d073..7664db1c5 100644 --- a/src/gl/renderer/gl_renderstate.cpp +++ b/src/gl/renderer/gl_renderstate.cpp @@ -145,6 +145,7 @@ bool FGLRenderState::ApplyShader() activeShader->muLightIndex.Set(-1); activeShader->muClipSplit.Set(mClipSplit); activeShader->muSpecularMaterial.Set(mGlossiness, mSpecularLevel); + activeShader->muAddColor.Set(mAddColor); // Can this be done without a shader? if (mGlowEnabled) { diff --git a/src/gl/shaders/gl_shader.cpp b/src/gl/shaders/gl_shader.cpp index cc9811622..0dedd6966 100644 --- a/src/gl/shaders/gl_shader.cpp +++ b/src/gl/shaders/gl_shader.cpp @@ -241,6 +241,7 @@ bool FShader::Load(const char * name, const char * vert_prog_lump, const char * i_data += "uniform vec4 uObjectColor;\n"; i_data += "uniform vec4 uObjectColor2;\n"; i_data += "uniform vec4 uDynLightColor;\n"; + i_data += "uniform vec4 uAddColor;\n"; i_data += "uniform vec4 uFogColor;\n"; i_data += "uniform float uDesaturationFactor;\n"; i_data += "uniform float uInterpolationFactor;\n"; @@ -534,6 +535,7 @@ bool FShader::Load(const char * name, const char * vert_prog_lump, const char * muInterpolationFactor.Init(hShader, "uInterpolationFactor"); muAlphaThreshold.Init(hShader, "uAlphaThreshold"); muSpecularMaterial.Init(hShader, "uSpecularMaterial"); + muAddColor.Init(hShader, "uAddColor"); muTimer.Init(hShader, "timer"); lights_index = glGetUniformLocation(hShader, "lights"); diff --git a/src/gl/shaders/gl_shader.h b/src/gl/shaders/gl_shader.h index cc1dece32..c9f4ce72c 100644 --- a/src/gl/shaders/gl_shader.h +++ b/src/gl/shaders/gl_shader.h @@ -245,6 +245,7 @@ class FShader FBufferedUniform4f muDynLightColor; FBufferedUniformPE muObjectColor; FBufferedUniformPE muObjectColor2; + FBufferedUniformPE muAddColor; FUniform4f muGlowBottomColor; FUniform4f muGlowTopColor; FUniform4f muGlowBottomPlane; diff --git a/src/hwrenderer/scene/hw_drawstructs.h b/src/hwrenderer/scene/hw_drawstructs.h index ae89d65de..a3fed9a1c 100644 --- a/src/hwrenderer/scene/hw_drawstructs.h +++ b/src/hwrenderer/scene/hw_drawstructs.h @@ -300,6 +300,7 @@ public: FColormap Colormap; // light and fog PalEntry FlatColor; + PalEntry AddColor; ERenderStyle renderstyle; float alpha; diff --git a/src/hwrenderer/scene/hw_flats.cpp b/src/hwrenderer/scene/hw_flats.cpp index b63987fd0..b609847fd 100644 --- a/src/hwrenderer/scene/hw_flats.cpp +++ b/src/hwrenderer/scene/hw_flats.cpp @@ -307,6 +307,7 @@ void GLFlat::DrawFlat(HWDrawInfo *di, FRenderState &state, bool translucent) state.SetColor(lightlevel, rel, di->isFullbrightScene(), Colormap, alpha); state.SetFog(lightlevel, rel, di->isFullbrightScene(), &Colormap, false); state.SetObjectColor(FlatColor | 0xff000000); + state.SetAddColor(AddColor | 0xff000000); if (hacktype & SSRF_PLANEHACK) { @@ -357,6 +358,7 @@ void GLFlat::DrawFlat(HWDrawInfo *di, FRenderState &state, bool translucent) state.SetRenderStyle(DefaultRenderStyle()); state.SetObjectColor(0xffffffff); } + state.SetAddColor(0); } //========================================================================== @@ -441,16 +443,18 @@ void GLFlat::SetFrom3DFloor(F3DFloor *rover, bool top, bool underside) // FF_FOG requires an inverted logic where to get the light from lightlist_t *light = P_GetPlaneLight(sector, plane.plane, underside); lightlevel = hw_ClampLight(*light->p_lightlevel); - + if (rover->flags & FF_FOG) { Colormap.LightColor = light->extra_colormap.FadeColor; FlatColor = 0xffffffff; + AddColor = 0; } else { Colormap.CopyFrom3DLight(light); FlatColor = *plane.flatcolor; + // AddColor = sector->SpecialColors[sector_t::add]; } @@ -505,6 +509,7 @@ void GLFlat::ProcessSector(HWDrawInfo *di, sector_t * frontsector, int which) lightlevel = hw_ClampLight(frontsector->GetFloorLight()); Colormap = frontsector->Colormap; FlatColor = frontsector->SpecialColors[sector_t::floor]; + AddColor = frontsector->SpecialColors[sector_t::add]; port = frontsector->ValidatePortal(sector_t::floor); if ((stack = (port != NULL))) { @@ -560,6 +565,7 @@ void GLFlat::ProcessSector(HWDrawInfo *di, sector_t * frontsector, int which) lightlevel = hw_ClampLight(frontsector->GetCeilingLight()); Colormap = frontsector->Colormap; FlatColor = frontsector->SpecialColors[sector_t::ceiling]; + AddColor = frontsector->SpecialColors[sector_t::add]; port = frontsector->ValidatePortal(sector_t::ceiling); if ((stack = (port != NULL))) { diff --git a/src/hwrenderer/scene/hw_renderstate.h b/src/hwrenderer/scene/hw_renderstate.h index 3ddb80270..297435422 100644 --- a/src/hwrenderer/scene/hw_renderstate.h +++ b/src/hwrenderer/scene/hw_renderstate.h @@ -144,11 +144,12 @@ protected: float mInterpolationFactor; FStateVec4 mNormal; - FStateVec4 mColor, mColorAdd; + FStateVec4 mColor; FStateVec4 mGlowTop, mGlowBottom; FStateVec4 mGlowTopPlane, mGlowBottomPlane; FStateVec4 mGradientTopPlane, mGradientBottomPlane; FStateVec4 mSplitTopPlane, mSplitBottomPlane; + PalEntry mAddColor; PalEntry mFogColor; PalEntry mObjectColor; PalEntry mObjectColor2; @@ -181,6 +182,7 @@ public: mModelMatrixEnabled = false; mTextureMatrixEnabled = false; mSplitEnabled = false; + mAddColor = 0; mObjectColor = 0xffffffff; mObjectColor2 = 0; mSoftLight = 0; @@ -369,6 +371,11 @@ public: mObjectColor2 = pe; } + void SetAddColor(PalEntry pe) + { + mAddColor = pe; + } + void SetFog(PalEntry c, float d) { const float LOG2E = 1.442692f; // = 1/log(2) diff --git a/src/hwrenderer/utility/hw_draw2d.cpp b/src/hwrenderer/utility/hw_draw2d.cpp index 0e224b26d..9356c5515 100644 --- a/src/hwrenderer/utility/hw_draw2d.cpp +++ b/src/hwrenderer/utility/hw_draw2d.cpp @@ -203,6 +203,7 @@ void Draw2D(F2DDrawer *drawer, FRenderState &state) } state.SetObjectColor(0xffffffff); state.SetObjectColor2(0); + state.SetAddColor(0); state.EnableTextureMatrix(false); state.SetEffect(EFF_NONE); diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index adfbdfda6..2d83a1545 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -293,7 +293,7 @@ FSerializer &Serialize(FSerializer &arc, const char *key, sector_t &p, sector_t ("linked_floor", p.e->Linked.Floor.Sectors) ("linked_ceiling", p.e->Linked.Ceiling.Sectors) ("colormap", p.Colormap, def->Colormap) - .Array("specialcolors", p.SpecialColors, def->SpecialColors, 5, true) + .Array("specialcolors", p.SpecialColors, def->SpecialColors, 6, true) ("gravity", p.gravity, def->gravity) .Terrain("floorterrain", p.terrainnum[0], &def->terrainnum[0]) .Terrain("ceilingterrain", p.terrainnum[1], &def->terrainnum[1]) diff --git a/wadsrc/static/shaders/glsl/main.fp b/wadsrc/static/shaders/glsl/main.fp index c138eb4f1..694d01f29 100644 --- a/wadsrc/static/shaders/glsl/main.fp +++ b/wadsrc/static/shaders/glsl/main.fp @@ -114,6 +114,8 @@ vec4 getTexel(vec2 st) if (uObjectColor2.a == 0.0) texel *= uObjectColor; else texel *= mix(uObjectColor, uObjectColor2, gradientdist.z); + texel += uAddColor; + return desaturate(texel); } diff --git a/wadsrc/static/zscript/mapdata.txt b/wadsrc/static/zscript/mapdata.txt index 601031f22..5ae796b04 100644 --- a/wadsrc/static/zscript/mapdata.txt +++ b/wadsrc/static/zscript/mapdata.txt @@ -235,7 +235,7 @@ struct Sector native play { native readonly FColormap ColorMap; - native readonly Color SpecialColors[5]; + native readonly Color SpecialColors[6]; native Actor SoundTarget;