/* CTexture::parse * Parses a TEXTURES format texture definition *******************************************************************/ bool CTexture::parse(Tokenizer& tz, string type) { // Check if optional if (S_CMPNOCASE(tz.peekToken(), "optional")) { tz.getToken(); // Skip it optional = true; } // Read basic info this->type = type; this->extended = true; this->defined = false; name = tz.getToken().Upper(); tz.getToken(); // Skip , width = tz.getInteger(); tz.getToken(); // Skip , height = tz.getInteger(); // Check for extended info if (tz.peekToken() == "{") { tz.getToken(); // Skip { // Read properties string property = tz.getToken(); while (property != "}") { // Check if end of text is reached (error) if (property.IsEmpty()) { wxLogMessage("Error parsing texture %s: End of text found, missing } perhaps?", name); return false; } // XScale if (S_CMPNOCASE(property, "XScale")) scale_x = tz.getFloat(); // YScale if (S_CMPNOCASE(property, "YScale")) scale_y = tz.getFloat(); // Offset if (S_CMPNOCASE(property, "Offset")) { offset_x = tz.getInteger(); tz.getToken(); // Skip , offset_y = tz.getInteger(); } // WorldPanning if (S_CMPNOCASE(property, "WorldPanning")) world_panning = true; // NoDecals if (S_CMPNOCASE(property, "NoDecals")) no_decals = true; // NullTexture if (S_CMPNOCASE(property, "NullTexture")) null_texture = true; // Patch if (S_CMPNOCASE(property, "Patch")) { CTPatchEx* patch = new CTPatchEx(); patch->parse(tz); patches.push_back(patch); } // Graphic if (S_CMPNOCASE(property, "Graphic")) { CTPatchEx* patch = new CTPatchEx(); patch->parse(tz, PTYPE_GRAPHIC); patches.push_back(patch); } // Read next property property = tz.getToken(); } } return true; }
/* Translation::parse * Parses a text definition [def] (in zdoom format, detailed here: * http://zdoom.org/wiki/Translation) *******************************************************************/ void Translation::parse(string def) { // Open definition string for processing w/tokenizer Tokenizer tz; tz.setSpecialCharacters("[]:%,="); tz.openString(def); //wxLogMessage("Parse translation \"%s\"", CHR(def)); // Read original range uint8_t o_start, o_end; o_start = tz.getInteger(); if (tz.peekToken() == "=") o_end = o_start; else if (!tz.checkToken(":")) return; else o_end = tz.getInteger(); if (!tz.checkToken("=")) return; // Check for reverse origin range bool reverse = (o_start > o_end); // Type of translation depends on next token if (tz.peekToken() == "[") { // Colour translation rgba_t start, end; tz.getToken(); // Skip [ // Read start colour start.r = tz.getInteger(); if (!tz.checkToken(",")) return; start.g = tz.getInteger(); if (!tz.checkToken(",")) return; start.b = tz.getInteger(); if (!tz.checkToken("]")) return; if (!tz.checkToken(":")) return; if (!tz.checkToken("[")) return; // Read end colour end.r = tz.getInteger(); if (!tz.checkToken(",")) return; end.g = tz.getInteger(); if (!tz.checkToken(",")) return; end.b = tz.getInteger(); if (!tz.checkToken("]")) return; // Add translation TransRangeColour* tr = new TransRangeColour(); if (reverse) { tr->o_start = o_end; tr->o_end = o_start; tr->d_start.set(end); tr->d_end.set(start); } else { tr->o_start = o_start; tr->o_end = o_end; tr->d_start.set(start); tr->d_end.set(end); } translations.push_back(tr); //wxLogMessage("Added colour translation"); } else if (tz.peekToken() == "%") { // Desat colour translation float sr, sg, sb, er, eg, eb; tz.getToken(); // Skip % if (!tz.checkToken("[")) return; // Read start colour sr = tz.getFloat(); if (!tz.checkToken(",")) return; sg = tz.getFloat(); if (!tz.checkToken(",")) return; sb = tz.getFloat(); if (!tz.checkToken("]")) return; if (!tz.checkToken(":")) return; if (!tz.checkToken("[")) return; // Read end colour er = tz.getFloat(); if (!tz.checkToken(",")) return; eg = tz.getFloat(); if (!tz.checkToken(",")) return; eb = tz.getFloat(); if (!tz.checkToken("]")) return; // Add translation TransRangeDesat* tr = new TransRangeDesat(); if (reverse) { tr->o_start = o_end; tr->o_end = o_start; tr->d_sr = er; tr->d_sg = eg; tr->d_sb = eb; tr->d_er = sr; tr->d_eg = sg; tr->d_eb = sb; } else { tr->o_start = o_start; tr->o_end = o_end; tr->d_sr = sr; tr->d_sg = sg; tr->d_sb = sb; tr->d_er = er; tr->d_eg = eg; tr->d_eb = eb; } translations.push_back(tr); //wxLogMessage("Added desat translation"); } else { // Palette range translation uint8_t d_start, d_end; // Read range values d_start = tz.getInteger(); if (!tz.checkToken(":")) d_end = d_start; else d_end = tz.getInteger(); // Add translation TransRangePalette* tr = new TransRangePalette(); if (reverse) { tr->o_start = o_end; tr->o_end = o_start; tr->d_start = d_end; tr->d_end = d_start; } else { tr->o_start = o_start; tr->o_end = o_end; tr->d_start = d_start; tr->d_end = d_end; } translations.push_back(tr); //wxLogMessage("Added range translation"); } }
/* CTPatchEx::parse * Parses a ZDoom TEXTURES format patch definition *******************************************************************/ bool CTPatchEx::parse(Tokenizer& tz, uint8_t type) { // Read basic info this->type = type; name = tz.getToken().Upper(); tz.getToken(); // Skip , offset_x = tz.getInteger(); tz.getToken(); // Skip , offset_y = tz.getInteger(); // Check if there is any extended info if (tz.peekToken() == "{") { // Skip { tz.getToken(); // Parse extended info string property = tz.getToken(); while (property != "}") { // FlipX if (S_CMPNOCASE(property, "FlipX")) flip_x = true; // FlipY if (S_CMPNOCASE(property, "FlipY")) flip_y = true; // UseOffsets if (S_CMPNOCASE(property, "UseOffsets")) use_offsets = true; // Rotate if (S_CMPNOCASE(property, "Rotate")) rotation = tz.getInteger(); // Translation if (S_CMPNOCASE(property, "Translation")) { // Add first translation string translation.parse(tz.getToken()); // Add any subsequent translations (separated by commas) while (tz.peekToken() == ",") { tz.getToken(); // Skip , translation.parse(tz.getToken()); } blendtype = 1; } // Blend if (S_CMPNOCASE(property, "Blend")) { double val; wxColour col; blendtype = 2; // Read first value string first = tz.getToken(); // If no second value, it's just a colour string if (tz.peekToken() != ",") { col.Set(first); colour.set(col.Red(), col.Green(), col.Blue()); } else { // Second value could be alpha or green tz.getToken(); // Skip , double second = tz.getDouble(); // If no third value, it's an alpha value if (tz.peekToken() != ",") { col.Set(first); colour.set(col.Red(), col.Green(), col.Blue(), second*255); blendtype = 3; } else { // Third value exists, must be R,G,B,A format tz.getToken(); // Skip , first.ToDouble(&val); colour.r = val*255; colour.g = second*255; colour.b = tz.getDouble()*255; if (tz.peekToken() != ",") { wxLogMessage("Invalid TEXTURES definition, expected ',', got '%s'", tz.getToken()); return false; } tz.getToken(); // Skip , colour.a = tz.getDouble()*255; blendtype = 3; } } } // Alpha if (S_CMPNOCASE(property, "Alpha")) alpha = tz.getFloat(); // Style if (S_CMPNOCASE(property, "Style")) style = tz.getToken(); // Read next property name property = tz.getToken(); } } return true; }