From 758cd77e550083162503328f57ae4fef016df567 Mon Sep 17 00:00:00 2001 From: Kevin Caccamo Date: Wed, 19 Dec 2018 02:51:30 -0500 Subject: [PATCH] Rename ColorAdd to AddColor, and use it ingame Rename ColorAdd to AddColor Add AddColor to FRenderState Tweak SpecialColors array in ZScript to include the additive color Add uAddColor to the shader compiler Add uAddColor to the texel --- src/gl/renderer/gl_renderstate.cpp | 1 + src/gl/shaders/gl_shader.cpp | 2 ++ src/gl/shaders/gl_shader.h | 1 + src/hwrenderer/scene/hw_drawstructs.h | 1 + src/hwrenderer/scene/hw_flats.cpp | 8 +++++++- src/hwrenderer/scene/hw_renderstate.h | 9 ++++++++- src/hwrenderer/utility/hw_draw2d.cpp | 1 + src/p_saveg.cpp | 2 +- wadsrc/static/shaders/glsl/main.fp | 2 ++ wadsrc/static/zscript/mapdata.txt | 2 +- 10 files changed, 25 insertions(+), 4 deletions(-) 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;