/** * Temporarily loads a scenario map and retrieves the "ScriptSettings" JSON * data from it. * The scenario map format is used for scenario and skirmish map types (random * games do not use a "map" (format) but a small JavaScript program which * creates a map on the fly). It contains a section to initialize the game * setup screen. * @param mapPath Absolute path (from VFS root) to the map file to peek in. * @return ScriptSettings in JSON format extracted from the map. */ CStr8 LoadSettingsOfScenarioMap(const VfsPath &mapPath) { CXeromyces mapFile; const char *pathToSettings[] = { "Scenario", "ScriptSettings", "" // Path to JSON data in map }; Status loadResult = mapFile.Load(g_VFS, mapPath); if (INFO::OK != loadResult) { LOGERROR("LoadSettingsOfScenarioMap: Unable to load map file '%s'", mapPath.string8()); throw PSERROR_Game_World_MapLoadFailed("Unable to load map file, check the path for typos."); } XMBElement mapElement = mapFile.GetRoot(); // Select the ScriptSettings node in the map file... for (int i = 0; pathToSettings[i][0]; ++i) { int childId = mapFile.GetElementID(pathToSettings[i]); XMBElementList nodes = mapElement.GetChildNodes(); auto it = std::find_if(nodes.begin(), nodes.end(), [&childId](const XMBElement& child) { return child.GetNodeName() == childId; }); if (it != nodes.end()) mapElement = *it; } // ... they contain a JSON document to initialize the game setup // screen return mapElement.GetText(); }
/** * @callgraph */ void CGUI::LoadXmlFile(const VfsPath& Filename, boost::unordered_set<VfsPath>& Paths) { Paths.insert(Filename); CXeromyces XeroFile; if (XeroFile.Load(g_VFS, Filename, "gui") != PSRETURN_OK) return; XMBElement node = XeroFile.GetRoot(); CStr root_name(XeroFile.GetElementString(node.GetNodeName())); try { if (root_name == "objects") { Xeromyces_ReadRootObjects(node, &XeroFile, Paths); // Re-cache all values so these gets cached too. //UpdateResolution(); } else if (root_name == "sprites") Xeromyces_ReadRootSprites(node, &XeroFile); else if (root_name == "styles") Xeromyces_ReadRootStyles(node, &XeroFile); else if (root_name == "setup") Xeromyces_ReadRootSetup(node, &XeroFile); else debug_warn(L"CGUI::LoadXmlFile error"); } catch (PSERROR_GUI& e) { LOGERROR("Errors loading GUI file %s (%u)", Filename.string8(), e.getCode()); return; } }
PSRETURN CMapSummaryReader::LoadMap(const VfsPath& pathname) { VfsPath filename_xml = pathname.ChangeExtension(L".xml"); CXeromyces xmb_file; if (xmb_file.Load(g_VFS, filename_xml) != PSRETURN_OK) return PSRETURN_File_ReadFailed; // Define all the relevant elements used in the XML file #define EL(x) int el_##x = xmb_file.GetElementID(#x) #define AT(x) int at_##x = xmb_file.GetAttributeID(#x) EL(scenario); EL(scriptsettings); #undef AT #undef EL XMBElement root = xmb_file.GetRoot(); ENSURE(root.GetNodeName() == el_scenario); XERO_ITER_EL(root, child) { int child_name = child.GetNodeName(); if (child_name == el_scriptsettings) { m_ScriptSettings = child.GetText(); } }
void CGUI::Xeromyces_ReadScript(XMBElement Element, CXeromyces* pFile, boost::unordered_set<VfsPath>& Paths) { // Check for a 'file' parameter CStrW file (Element.GetAttributes().GetNamedItem( pFile->GetAttributeID("file") ).FromUTF8()); // If there is a file specified, open and execute it if (! file.empty()) { Paths.insert(file); try { m_ScriptInterface->LoadGlobalScriptFile(file); } catch (PSERROR_Scripting& e) { LOGERROR(L"GUI: Error executing script %ls: %hs", file.c_str(), e.what()); } } // Execute inline scripts try { CStr code (Element.GetText()); if (! code.empty()) m_ScriptInterface->LoadGlobalScript(L"Some XML file", code.FromUTF8()); } catch (PSERROR_Scripting& e) { LOGERROR(L"GUI: Error executing inline script: %hs", e.what()); } }
// Reads Custom Color void CGUI::Xeromyces_ReadColor(XMBElement Element, CXeromyces* pFile) { // Read the color and stor in m_PreDefinedColors XMBAttributeList attributes = Element.GetAttributes(); //IGUIObject* object = new CTooltip; CColor color; CStr name = attributes.GetNamedItem(pFile->GetAttributeID("name")); // Try parsing value CStr value (Element.GetText()); if (! value.empty()) { // Try setting color to value if (!color.ParseString(value, 255.f)) { LOGERROR(L"GUI: Unable to create custom color '%hs'. Invalid color syntax.", name.c_str()); } else { // input color m_PreDefinedColors[name] = color; } } }
void CGUIManager::LoadPage(SGUIPage& page) { // If we're hotloading then try to grab some data from the previous page CScriptValRooted hotloadData; if (page.gui) m_ScriptInterface.CallFunction(OBJECT_TO_JSVAL(page.gui->GetScriptObject()), "getHotloadData", hotloadData); page.inputs.clear(); page.gui.reset(new CGUI()); page.gui->Initialize(); VfsPath path = VfsPath("gui") / page.name; page.inputs.insert(path); CXeromyces xero; if (xero.Load(g_VFS, path) != PSRETURN_OK) // Fail silently (Xeromyces reported the error) return; int elmt_page = xero.GetElementID("page"); int elmt_include = xero.GetElementID("include"); XMBElement root = xero.GetRoot(); if (root.GetNodeName() != elmt_page) { LOGERROR(L"GUI page '%ls' must have root element <page>", page.name.c_str()); return; } XERO_ITER_EL(root, node) { if (node.GetNodeName() != elmt_include) { LOGERROR(L"GUI page '%ls' must only have <include> elements inside <page>", page.name.c_str()); continue; } CStrW name (node.GetText().FromUTF8()); TIMER(name.c_str()); VfsPath path = VfsPath("gui") / name; page.gui->LoadXmlFile(path, page.inputs); } // Remember this GUI page, in case the scripts call FindObjectByName shared_ptr<CGUI> oldGUI = m_CurrentGUI; m_CurrentGUI = page.gui; page.gui->SendEventToAll("load"); // Call the init() function if (!m_ScriptInterface.CallFunctionVoid(OBJECT_TO_JSVAL(page.gui->GetScriptObject()), "init", page.initData, hotloadData)) { LOGERROR(L"GUI page '%ls': Failed to call init() function", page.name.c_str()); } m_CurrentGUI = oldGUI; }
bool CList::HandleAdditionalChildren(const XMBElement& child, CXeromyces* pFile) { int elmt_item = pFile->GetElementID("item"); if (child.GetNodeName() == elmt_item) { AddItem(child.GetText().FromUTF8(), child.GetText().FromUTF8()); return true; } return false; }
/** * @callgraph */ void CGUI::LoadXmlFile(const VfsPath& Filename, boost::unordered_set<VfsPath>& Paths) { Paths.insert(Filename); CXeromyces XeroFile; if (XeroFile.Load(g_VFS, Filename) != PSRETURN_OK) // Fail silently return; XMBElement node = XeroFile.GetRoot(); // Check root element's (node) name so we know what kind of // data we'll be expecting CStr root_name (XeroFile.GetElementString(node.GetNodeName())); try { if (root_name == "objects") { Xeromyces_ReadRootObjects(node, &XeroFile, Paths); // Re-cache all values so these gets cached too. //UpdateResolution(); } else if (root_name == "sprites") { Xeromyces_ReadRootSprites(node, &XeroFile); } else if (root_name == "styles") { Xeromyces_ReadRootStyles(node, &XeroFile); } else if (root_name == "setup") { Xeromyces_ReadRootSetup(node, &XeroFile); } else { debug_warn(L"CGUI::LoadXmlFile error"); // TODO Gee: Output in log } } catch (PSERROR_GUI& e) { LOGERROR(L"Errors loading GUI file %ls (%u)", Filename.string().c_str(), e.getCode()); return; } }
void CGUI::Xeromyces_ReadScript(XMBElement Element, CXeromyces* pFile, boost::unordered_set<VfsPath>& Paths) { // Check for a 'file' parameter CStrW file(Element.GetAttributes().GetNamedItem(pFile->GetAttributeID("file")).FromUTF8()); // If there is a file specified, open and execute it if (!file.empty()) { Paths.insert(file); try { m_ScriptInterface->LoadGlobalScriptFile(file); } catch (PSERROR_Scripting& e) { LOGERROR("GUI: Error executing script %s: %s", utf8_from_wstring(file), e.what()); } } // If it has a directory attribute, read all JS files in that directory CStrW directory(Element.GetAttributes().GetNamedItem(pFile->GetAttributeID("directory")).FromUTF8()); if (!directory.empty()) { VfsPaths pathnames; vfs::GetPathnames(g_VFS, directory, L"*.js", pathnames); for (const VfsPath& path : pathnames) { // Only load new files (so when the insert succeeds) if (Paths.insert(path).second) try { m_ScriptInterface->LoadGlobalScriptFile(path); } catch (PSERROR_Scripting& e) { LOGERROR("GUI: Error executing script %s: %s", path.string8(), e.what()); } } } // Execute inline scripts try { CStr code(Element.GetText()); if (!code.empty()) m_ScriptInterface->LoadGlobalScript(L"Some XML file", code.FromUTF8()); } catch (PSERROR_Scripting& e) { LOGERROR("GUI: Error executing inline script: %s", e.what()); } }
void CGUI::Xeromyces_ReadTooltip(XMBElement Element, CXeromyces* pFile) { // Read the tooltip, and store it as a specially-named object IGUIObject* object = new CTooltip; XMBAttributeList attributes = Element.GetAttributes(); for (int i=0; i<attributes.Count; ++i) { XMBAttribute attr = attributes.Item(i); CStr attr_name (pFile->GetAttributeString(attr.Name)); CStr attr_value (attr.Value); if (attr_name == "name") { object->SetName("__tooltip_" + attr_value); } else { object->SetSetting(attr_name, attr_value.FromUTF8()); } } AddObject(object); }
void CGUI::Xeromyces_ReadStyle(XMBElement Element, CXeromyces* pFile) { // style object we're adding SGUIStyle style; CStr name; // // Read Attributes // // Now we can iterate all attributes and store XMBAttributeList attributes = Element.GetAttributes(); for (int i=0; i<attributes.Count; ++i) { XMBAttribute attr = attributes.Item(i); CStr attr_name (pFile->GetAttributeString(attr.Name)); // The "name" setting is actually the name of the style // and not a new default if (attr_name == "name") name = attr.Value; else style.m_SettingsDefaults[attr_name] = attr.Value.FromUTF8(); } // // Add to CGUI // m_Styles[name] = style; }
void CGUI::Xeromyces_ReadEffects(XMBElement Element, CXeromyces* pFile, SGUIImageEffects &effects) { XMBAttributeList attributes = Element.GetAttributes(); for (int i=0; i<attributes.Count; ++i) { XMBAttribute attr = attributes.Item(i); CStr attr_name (pFile->GetAttributeString(attr.Name)); CStrW attr_value (attr.Value.FromUTF8()); if (attr_name == "add_color") { CColor color; if (!GUI<int>::ParseColor(attr_value, color, 0.f)) LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str()); else effects.m_AddColor = color; } else if (attr_name == "grayscale") { effects.m_Greyscale = true; } else { debug_warn(L"Invalid data - DTD shouldn't allow this"); } } }
void CGUI::Xeromyces_ReadRepeat(XMBElement Element, CXeromyces* pFile, IGUIObject* pParent, std::vector<std::pair<CStr, CStr> >& NameSubst, boost::unordered_set<VfsPath>& Paths, u32 nesting_depth) { #define ELMT(x) int elmt_##x = pFile->GetElementID(#x) #define ATTR(x) int attr_##x = pFile->GetAttributeID(#x) ELMT(object); ATTR(count); ATTR(var); XMBAttributeList attributes = Element.GetAttributes(); int count = CStr(attributes.GetNamedItem(attr_count)).ToInt(); CStr var("["+attributes.GetNamedItem(attr_var)+"]"); if (var.size() < 3) var = "[n]"; for (int n = 0; n < count; ++n) { NameSubst.emplace_back(var, "[" + CStr::FromInt(n) + "]"); XERO_ITER_EL(Element, child) { if (child.GetNodeName() == elmt_object) Xeromyces_ReadObject(child, pFile, pParent, NameSubst, Paths, nesting_depth); } NameSubst.pop_back(); } }
void CGUI::Xeromyces_ReadRepeat(XMBElement Element, CXeromyces* pFile, IGUIObject *pParent, boost::unordered_set<VfsPath>& Paths) { #define ELMT(x) int elmt_##x = pFile->GetElementID(#x) #define ATTR(x) int attr_##x = pFile->GetAttributeID(#x) ELMT(object); ATTR(count); XMBAttributeList attributes = Element.GetAttributes(); int count = CStr(attributes.GetNamedItem(attr_count)).ToInt(); for (int n = 0; n < count; ++n) { std::vector<std::pair<CStr, CStr> > subst; subst.push_back(std::make_pair(CStr("[n]"), "[" + CStr::FromInt(n) + "]")); XERO_ITER_EL(Element, child) { if (child.GetNodeName() == elmt_object) { Xeromyces_ReadObject(child, pFile, pParent, subst, Paths); } } } }
CTerrainPropertiesPtr CTerrainProperties::FromXML(const CTerrainPropertiesPtr& parent, const VfsPath& pathname) { CXeromyces XeroFile; if (XeroFile.Load(g_VFS, pathname) != PSRETURN_OK) return CTerrainPropertiesPtr(); XMBElement root = XeroFile.GetRoot(); CStr rootName = XeroFile.GetElementString(root.GetNodeName()); // Check that we've got the right kind of xml document if (rootName != "Terrains") { LOGERROR( L"TerrainProperties: Loading %ls: Root node is not terrains (found \"%hs\")", pathname.string().c_str(), rootName.c_str()); return CTerrainPropertiesPtr(); } #define ELMT(x) int el_##x = XeroFile.GetElementID(#x) ELMT(terrain); #undef ELMT // Ignore all non-terrain nodes, loading the first terrain node and // returning it. // Really, we only expect there to be one child and it to be of the right // type, though. XERO_ITER_EL(root, child) { if (child.GetNodeName() == el_terrain) { CTerrainPropertiesPtr ret (new CTerrainProperties(parent)); ret->LoadXml(child, &XeroFile, pathname); return ret; } else { LOGWARNING( L"TerrainProperties: Loading %ls: Unexpected node %hs\n", pathname.string().c_str(), XeroFile.GetElementString(child.GetNodeName()).c_str()); // Keep reading - typos shouldn't be showstoppers } } return CTerrainPropertiesPtr(); }
void CGUI::Xeromyces_ReadSprite(XMBElement Element, CXeromyces* pFile) { CGUISprite* Sprite = new CGUISprite; // Get name, we know it exists because of DTD requirements CStr name = Element.GetAttributes().GetNamedItem(pFile->GetAttributeID("name")); if (m_Sprites.find(name) != m_Sprites.end()) LOGWARNING("GUI sprite name '%s' used more than once; first definition will be discarded", name.c_str()); SGUIImageEffects* effects = NULL; for (XMBElement child : Element.GetChildNodes()) { CStr ElementName(pFile->GetElementString(child.GetNodeName())); if (ElementName == "image") Xeromyces_ReadImage(child, pFile, *Sprite); else if (ElementName == "effect") { if (effects) LOGERROR("GUI <sprite> must not have more than one <effect>"); else { effects = new SGUIImageEffects; Xeromyces_ReadEffects(child, pFile, *effects); } } else debug_warn(L"Invalid data - DTD shouldn't allow this"); } // Apply the effects to every image (unless the image overrides it with // different effects) if (effects) for (SGUIImage* const& img : Sprite->m_Images) if (!img->m_Effects) img->m_Effects = new SGUIImageEffects(*effects); // do a copy just so it can be deleted correctly later delete effects; m_Sprites[name] = Sprite; }
void XMLWriter_File::ElementXMB(const XMBFile& file, XMBElement el) { XMLWriter_Element writer(*this, file.GetElementString(el.GetNodeName()).c_str()); XERO_ITER_ATTR(el, attr) writer.Attribute(file.GetAttributeString(attr.Name).c_str(), attr.Value); XERO_ITER_EL(el, child) ElementXMB(file, child); }
void CGUI::Xeromyces_ReadColor(XMBElement Element, CXeromyces* pFile) { XMBAttributeList attributes = Element.GetAttributes(); CColor color; CStr name = attributes.GetNamedItem(pFile->GetAttributeID("name")); // Try parsing value CStr value(Element.GetText()); if (value.empty()) return; // Try setting color to value if (!color.ParseString(value)) { LOGERROR("GUI: Unable to create custom color '%s'. Invalid color syntax.", name.c_str()); return; } m_PreDefinedColors[name] = color; }
void CGUI::Xeromyces_ReadRootObjects(XMBElement Element, CXeromyces* pFile, boost::unordered_set<VfsPath>& Paths) { int el_script = pFile->GetElementID("script"); std::vector<std::pair<CStr, CStr> > subst; // Iterate main children // they should all be <object> or <script> elements XMBElementList children = Element.GetChildNodes(); for (int i=0; i<children.Count; ++i) { //debug_printf(L"Object %d\n", i); XMBElement child = children.Item(i); if (child.GetNodeName() == el_script) // Execute the inline script Xeromyces_ReadScript(child, pFile, Paths); else // Read in this whole object into the GUI Xeromyces_ReadObject(child, pFile, m_BaseObject, subst, Paths); } }
void CGUI::Xeromyces_ReadRootStyles(XMBElement Element, CXeromyces* pFile) { // Iterate main children // they should all be <styles> elements XMBElementList children = Element.GetChildNodes(); for (int i=0; i<children.Count; ++i) { XMBElement child = children.Item(i); // Read in this whole object into the GUI Xeromyces_ReadStyle(child, pFile); } }
void CGUI::Xeromyces_ReadRootSetup(XMBElement Element, CXeromyces* pFile) { // Iterate main children // they should all be <icon>, <scrollbar> or <tooltip>. XMBElementList children = Element.GetChildNodes(); for (int i=0; i<children.Count; ++i) { XMBElement child = children.Item(i); // Read in this whole object into the GUI CStr name (pFile->GetElementString(child.GetNodeName())); if (name == "scrollbar") { Xeromyces_ReadScrollBarStyle(child, pFile); } else if (name == "icon") { Xeromyces_ReadIcon(child, pFile); } else if (name == "tooltip") { Xeromyces_ReadTooltip(child, pFile); } else if (name == "color") { Xeromyces_ReadColor(child, pFile); } else { debug_warn(L"Invalid data - DTD shouldn't allow this"); } } }
void CGUI::Xeromyces_ReadIcon(XMBElement Element, CXeromyces* pFile) { // Icon we're adding SGUIIcon icon; CStr name; XMBAttributeList attributes = Element.GetAttributes(); for (int i=0; i<attributes.Count; ++i) { XMBAttribute attr = attributes.Item(i); CStr attr_name (pFile->GetAttributeString(attr.Name)); CStr attr_value (attr.Value); if (attr_value == "null") continue; if (attr_name == "name") name = attr_value; else if (attr_name == "sprite") icon.m_SpriteName = attr_value; else if (attr_name == "size") { CSize size; if (!GUI<CSize>::ParseString(attr_value.FromUTF8(), size)) LOGERROR(L"Error parsing '%hs' (\"%hs\") inside <icon>.", attr_name.c_str(), attr_value.c_str()); else icon.m_Size = size; } else if (attr_name == "cell_id") { int cell_id; if (!GUI<int>::ParseString(attr_value.FromUTF8(), cell_id)) LOGERROR(L"GUI: Error parsing '%hs' (\"%hs\") inside <icon>.", attr_name.c_str(), attr_value.c_str()); else icon.m_CellID = cell_id; } else { debug_warn(L"Invalid data - DTD shouldn't allow this"); } } m_Icons[name] = icon; }
void CGUI::Xeromyces_ReadTooltip(XMBElement Element, CXeromyces* pFile) { IGUIObject* object = new CTooltip; for (XMBAttribute attr : Element.GetAttributes()) { CStr attr_name(pFile->GetAttributeString(attr.Name)); CStr attr_value(attr.Value); if (attr_name == "name") object->SetName("__tooltip_" + attr_value); else object->SetSetting(attr_name, attr_value.FromUTF8()); } AddObject(object); }
void CGUI::Xeromyces_ReadRootObjects(XMBElement Element, CXeromyces* pFile, boost::unordered_set<VfsPath>& Paths) { int el_script = pFile->GetElementID("script"); std::vector<std::pair<CStr, CStr> > subst; // Iterate main children // they should all be <object> or <script> elements for (XMBElement child : Element.GetChildNodes()) { if (child.GetNodeName() == el_script) // Execute the inline script Xeromyces_ReadScript(child, pFile, Paths); else // Read in this whole object into the GUI Xeromyces_ReadObject(child, pFile, m_BaseObject, subst, Paths, 0); } }
void CGUI::Xeromyces_ReadRootSetup(XMBElement Element, CXeromyces* pFile) { for (XMBElement child : Element.GetChildNodes()) { CStr name(pFile->GetElementString(child.GetNodeName())); if (name == "scrollbar") Xeromyces_ReadScrollBarStyle(child, pFile); else if (name == "icon") Xeromyces_ReadIcon(child, pFile); else if (name == "tooltip") Xeromyces_ReadTooltip(child, pFile); else if (name == "color") Xeromyces_ReadColor(child, pFile); else debug_warn(L"Invalid data - DTD shouldn't allow this"); } }
void CGUI::Xeromyces_ReadStyle(XMBElement Element, CXeromyces* pFile) { SGUIStyle style; CStr name; for (XMBAttribute attr : Element.GetAttributes()) { CStr attr_name(pFile->GetAttributeString(attr.Name)); // The "name" setting is actually the name of the style // and not a new default if (attr_name == "name") name = attr.Value; else style.m_SettingsDefaults[attr_name] = attr.Value.FromUTF8(); } m_Styles[name] = style; }
void CGUI::Xeromyces_ReadEffects(XMBElement Element, CXeromyces* pFile, SGUIImageEffects& effects) { for (XMBAttribute attr : Element.GetAttributes()) { CStr attr_name(pFile->GetAttributeString(attr.Name)); CStrW attr_value(attr.Value.FromUTF8()); if (attr_name == "add_color") { CColor color; if (!GUI<int>::ParseColor(attr_value, color, 0)) LOGERROR("GUI: Error parsing '%s' (\"%s\")", attr_name, utf8_from_wstring(attr_value)); else effects.m_AddColor = color; } else if (attr_name == "grayscale") effects.m_Greyscale = true; else debug_warn(L"Invalid data - DTD shouldn't allow this"); } }
void CGUI::Xeromyces_ReadIcon(XMBElement Element, CXeromyces* pFile) { SGUIIcon icon; CStr name; for (XMBAttribute attr : Element.GetAttributes()) { CStr attr_name(pFile->GetAttributeString(attr.Name)); CStr attr_value(attr.Value); if (attr_value == "null") continue; if (attr_name == "name") name = attr_value; else if (attr_name == "sprite") icon.m_SpriteName = attr_value; else if (attr_name == "size") { CSize size; if (!GUI<CSize>::ParseString(attr_value.FromUTF8(), size)) LOGERROR("Error parsing '%s' (\"%s\") inside <icon>.", attr_name, attr_value); else icon.m_Size = size; } else if (attr_name == "cell_id") { int cell_id; if (!GUI<int>::ParseString(attr_value.FromUTF8(), cell_id)) LOGERROR("GUI: Error parsing '%s' (\"%s\") inside <icon>.", attr_name, attr_value); else icon.m_CellID = cell_id; } else debug_warn(L"Invalid data - DTD shouldn't allow this"); } m_Icons[name] = icon; }
bool CShaderManager::NewProgram(const char* name, const CShaderDefines& baseDefines, CShaderProgramPtr& program) { PROFILE2("loading shader"); PROFILE2_ATTR("name: %s", name); if (strncmp(name, "fixed:", 6) == 0) { program = CShaderProgramPtr(CShaderProgram::ConstructFFP(name+6, baseDefines)); if (!program) return false; program->Reload(); return true; } VfsPath xmlFilename = L"shaders/" + wstring_from_utf8(name) + L".xml"; CXeromyces XeroFile; PSRETURN ret = XeroFile.Load(g_VFS, xmlFilename); if (ret != PSRETURN_OK) return false; #if USE_SHADER_XML_VALIDATION { TIMER_ACCRUE(tc_ShaderValidation); // Serialize the XMB data and pass it to the validator XML_Start(); XML_SetPrettyPrint(false); XML_WriteXMB(XeroFile); bool ok = m_Validator.ValidateEncoded(wstring_from_utf8(name), XML_GetOutput()); if (!ok) return false; } #endif // Define all the elements and attributes used in the XML file #define EL(x) int el_##x = XeroFile.GetElementID(#x) #define AT(x) int at_##x = XeroFile.GetAttributeID(#x) EL(attrib); EL(define); EL(fragment); EL(stream); EL(uniform); EL(vertex); AT(file); AT(if); AT(loc); AT(name); AT(semantics); AT(type); AT(value); #undef AT #undef EL CPreprocessorWrapper preprocessor; preprocessor.AddDefines(baseDefines); XMBElement Root = XeroFile.GetRoot(); bool isGLSL = (Root.GetAttributes().GetNamedItem(at_type) == "glsl"); VfsPath vertexFile; VfsPath fragmentFile; CShaderDefines defines = baseDefines; std::map<CStrIntern, int> vertexUniforms; std::map<CStrIntern, CShaderProgram::frag_index_pair_t> fragmentUniforms; std::map<CStrIntern, int> vertexAttribs; int streamFlags = 0; XERO_ITER_EL(Root, Child) { if (Child.GetNodeName() == el_define) { defines.Add(CStrIntern(Child.GetAttributes().GetNamedItem(at_name)), CStrIntern(Child.GetAttributes().GetNamedItem(at_value))); } else if (Child.GetNodeName() == el_vertex) { vertexFile = L"shaders/" + Child.GetAttributes().GetNamedItem(at_file).FromUTF8(); XERO_ITER_EL(Child, Param) { XMBAttributeList Attrs = Param.GetAttributes(); CStr cond = Attrs.GetNamedItem(at_if); if (!cond.empty() && !preprocessor.TestConditional(cond)) continue; if (Param.GetNodeName() == el_uniform) { vertexUniforms[CStrIntern(Attrs.GetNamedItem(at_name))] = Attrs.GetNamedItem(at_loc).ToInt(); } else if (Param.GetNodeName() == el_stream) { CStr StreamName = Attrs.GetNamedItem(at_name); if (StreamName == "pos") streamFlags |= STREAM_POS; else if (StreamName == "normal") streamFlags |= STREAM_NORMAL; else if (StreamName == "color") streamFlags |= STREAM_COLOR; else if (StreamName == "uv0") streamFlags |= STREAM_UV0; else if (StreamName == "uv1") streamFlags |= STREAM_UV1; else if (StreamName == "uv2") streamFlags |= STREAM_UV2; else if (StreamName == "uv3") streamFlags |= STREAM_UV3; } else if (Param.GetNodeName() == el_attrib) { int attribLoc = ParseAttribSemantics(Attrs.GetNamedItem(at_semantics)); vertexAttribs[CStrIntern(Attrs.GetNamedItem(at_name))] = attribLoc; } } }
void CGUI::Xeromyces_ReadScrollBarStyle(XMBElement Element, CXeromyces* pFile) { // style object we're adding SGUIScrollBarStyle scrollbar; CStr name; // // Read Attributes // // Now we can iterate all attributes and store XMBAttributeList attributes = Element.GetAttributes(); for (int i=0; i<attributes.Count; ++i) { XMBAttribute attr = attributes.Item(i); CStr attr_name = pFile->GetAttributeString(attr.Name); CStr attr_value (attr.Value); if (attr_value == "null") continue; if (attr_name == "name") name = attr_value; else if (attr_name == "show_edge_buttons") { bool b; if (!GUI<bool>::ParseString(attr_value.FromUTF8(), b)) LOGERROR(L"GUI: Error parsing '%hs' (\"%hs\")", attr_name.c_str(), attr_value.c_str()); else scrollbar.m_UseEdgeButtons = b; } if (attr_name == "width") { float f; if (!GUI<float>::ParseString(attr_value.FromUTF8(), f)) LOGERROR(L"GUI: Error parsing '%hs' (\"%hs\")", attr_name.c_str(), attr_value.c_str()); else scrollbar.m_Width = f; } else if (attr_name == "minimum_bar_size") { float f; if (!GUI<float>::ParseString(attr_value.FromUTF8(), f)) LOGERROR(L"GUI: Error parsing '%hs' (\"%hs\")", attr_name.c_str(), attr_value.c_str()); else scrollbar.m_MinimumBarSize = f; } else if (attr_name == "maximum_bar_size") { float f; if (!GUI<float>::ParseString(attr_value.FromUTF8(), f)) LOGERROR(L"GUI: Error parsing '%hs' (\"%hs\")", attr_name.c_str(), attr_value.c_str()); else scrollbar.m_MaximumBarSize = f; } else if (attr_name == "sprite_button_top") scrollbar.m_SpriteButtonTop = attr_value; else if (attr_name == "sprite_button_top_pressed") scrollbar.m_SpriteButtonTopPressed = attr_value; else if (attr_name == "sprite_button_top_disabled") scrollbar.m_SpriteButtonTopDisabled = attr_value; else if (attr_name == "sprite_button_top_over") scrollbar.m_SpriteButtonTopOver = attr_value; else if (attr_name == "sprite_button_bottom") scrollbar.m_SpriteButtonBottom = attr_value; else if (attr_name == "sprite_button_bottom_pressed") scrollbar.m_SpriteButtonBottomPressed = attr_value; else if (attr_name == "sprite_button_bottom_disabled") scrollbar.m_SpriteButtonBottomDisabled = attr_value; else if (attr_name == "sprite_button_bottom_over") scrollbar.m_SpriteButtonBottomOver = attr_value; else if (attr_name == "sprite_back_vertical") scrollbar.m_SpriteBackVertical = attr_value; else if (attr_name == "sprite_bar_vertical") scrollbar.m_SpriteBarVertical = attr_value; else if (attr_name == "sprite_bar_vertical_over") scrollbar.m_SpriteBarVerticalOver = attr_value; else if (attr_name == "sprite_bar_vertical_pressed") scrollbar.m_SpriteBarVerticalPressed = attr_value; } // // Add to CGUI // m_ScrollBarStyles[name] = scrollbar; }