diff --git a/src/gamedata/textures/texturemanager.cpp b/src/gamedata/textures/texturemanager.cpp index 589f787b3..9a7685654 100644 --- a/src/gamedata/textures/texturemanager.cpp +++ b/src/gamedata/textures/texturemanager.cpp @@ -689,74 +689,6 @@ void FTextureManager::AddHiresTextures (int wadnum) // //========================================================================== -void FTextureManager::ParseColorization(FScanner& sc) -{ - TextureManipulation tm = {}; - tm.ModulateColor = 0x01ffffff; - sc.MustGetString(); - FName cname = sc.String; - sc.MustGetToken('{'); - while (!sc.CheckToken('}')) - { - sc.MustGetString(); - if (sc.Compare("DesaturationFactor")) - { - sc.MustGetFloat(); - tm.DesaturationFactor = (float)sc.Float; - } - else if (sc.Compare("AddColor")) - { - sc.MustGetString(); - tm.AddColor = (tm.AddColor & 0xff000000) | (V_GetColor(NULL, sc) & 0xffffff); - } - else if (sc.Compare("ModulateColor")) - { - sc.MustGetString(); - tm.ModulateColor = V_GetColor(NULL, sc) & 0xffffff; - if (sc.CheckToken(',')) - { - sc.MustGetNumber(); - tm.ModulateColor.a = sc.Number; - } - else tm.ModulateColor.a = 1; - } - else if (sc.Compare("BlendColor")) - { - sc.MustGetString(); - tm.BlendColor = V_GetColor(NULL, sc) & 0xffffff; - sc.MustGetToken(','); - sc.MustGetString(); - static const char* opts[] = { "none", "alpha", "screen", "overlay", "hardlight", nullptr }; - tm.AddColor.a = (tm.AddColor.a & ~TextureManipulation::BlendMask) | sc.MustMatchString(opts); - if (sc.Compare("alpha")) - { - sc.MustGetToken(','); - sc.MustGetFloat(); - tm.BlendColor.a = (uint8_t)(clamp(sc.Float, 0., 1.) * 255); - } - } - else if (sc.Compare("invert")) - { - tm.AddColor.a |= TextureManipulation::InvertBit; - } - else sc.ScriptError("Unknown token '%s'", sc.String); - } - if (tm.CheckIfEnabled()) - { - tmanips.Insert(cname, tm); - } - else - { - tmanips.Remove(cname); - } - -} -//========================================================================== -// -// Loads the HIRESTEX lumps -// -//========================================================================== - void FTextureManager::LoadTextureDefs(int wadnum, const char *lumpname, FMultipatchTextureBuilder &build) { int remapLump, lastLump; @@ -907,10 +839,6 @@ void FTextureManager::ParseTextureDef(int lump, FMultipatchTextureBuilder &build { build.ParseTexture(sc, ETextureType::MiscPatch); } - else if (sc.Compare("colorization")) - { - ParseColorization(sc); - } else if (sc.Compare("#include")) { sc.MustGetString(); diff --git a/src/gamedata/textures/textures.h b/src/gamedata/textures/textures.h index 416d9e719..1db2529a4 100644 --- a/src/gamedata/textures/textures.h +++ b/src/gamedata/textures/textures.h @@ -631,7 +631,14 @@ public: { return tmanips.CheckKey(name); } - + void InsertTextureManipulation(FName cname, TextureManipulation tm) + { + tmanips.Insert(cname, tm); + } + void RemoveTextureManipulation(FName cname) + { + tmanips.Remove(cname); + } private: diff --git a/src/r_data/gldefs.cpp b/src/r_data/gldefs.cpp index 8f860f9e7..a08ee8f6e 100644 --- a/src/r_data/gldefs.cpp +++ b/src/r_data/gldefs.cpp @@ -51,6 +51,7 @@ void AddLightDefaults(FLightDefaults *defaults, double attnFactor); void AddLightAssociation(const char *actor, const char *frame, const char *light); void InitializeActorLights(TArray &LightAssociations); +void ParseColorization(FScanner& sc); TArray usershaders; extern TDeletingArray LightDefaults; @@ -194,6 +195,7 @@ static const char *CoreKeywords[]= "#include", "material", "lightsizefactor", + "colorization", nullptr }; @@ -218,6 +220,7 @@ enum TAG_INCLUDE, TAG_MATERIAL, TAG_LIGHTSIZEFACTOR, + TAG_COLORIZATION, }; //========================================================================== @@ -1648,6 +1651,68 @@ class GLDefsParser } } } + + void ParseColorization(FScanner& sc) + { + TextureManipulation tm = {}; + tm.ModulateColor = 0x01ffffff; + sc.MustGetString(); + FName cname = sc.String; + sc.MustGetToken('{'); + while (!sc.CheckToken('}')) + { + sc.MustGetString(); + if (sc.Compare("DesaturationFactor")) + { + sc.MustGetFloat(); + tm.DesaturationFactor = (float)sc.Float; + } + else if (sc.Compare("AddColor")) + { + sc.MustGetString(); + tm.AddColor = (tm.AddColor & 0xff000000) | (V_GetColor(NULL, sc) & 0xffffff); + } + else if (sc.Compare("ModulateColor")) + { + sc.MustGetString(); + tm.ModulateColor = V_GetColor(NULL, sc) & 0xffffff; + if (sc.CheckToken(',')) + { + sc.MustGetNumber(); + tm.ModulateColor.a = sc.Number; + } + else tm.ModulateColor.a = 1; + } + else if (sc.Compare("BlendColor")) + { + sc.MustGetString(); + tm.BlendColor = V_GetColor(NULL, sc) & 0xffffff; + sc.MustGetToken(','); + sc.MustGetString(); + static const char* opts[] = { "none", "alpha", "screen", "overlay", "hardlight", nullptr }; + tm.AddColor.a = (tm.AddColor.a & ~TextureManipulation::BlendMask) | sc.MustMatchString(opts); + if (sc.Compare("alpha")) + { + sc.MustGetToken(','); + sc.MustGetFloat(); + tm.BlendColor.a = (uint8_t)(clamp(sc.Float, 0., 1.) * 255); + } + } + else if (sc.Compare("invert")) + { + tm.AddColor.a |= TextureManipulation::InvertBit; + } + else sc.ScriptError("Unknown token '%s'", sc.String); + } + if (tm.CheckIfEnabled()) + { + TexMan.InsertTextureManipulation(cname, tm); + } + else + { + TexMan.RemoveTextureManipulation(cname); + } + } public: @@ -1741,6 +1806,9 @@ public: */ } break; + case TAG_COLORIZATION: + ParseColorization(sc); + break; default: sc.ScriptError("Error parsing defs. Unknown tag: %s.\n", sc.String); break;