using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml; using Toolbox.Library; namespace FirstPlugin { public class Sharc2XML : XmlDoc { public static void Read(SHARCFB.Header header, string FileName) { XmlDocument doc = new XmlDocument(); doc.Load(FileName); foreach (XmlNode node in doc.ChildNodes) { foreach (XmlNode n in node.ChildNodes) { if (n.Name == "ShaderPrograms") { } } } } public static void Save(SHARCFB.Header header, string FileName) { XmlDocument doc = new XmlDocument(); XmlNode mainNode = doc.CreateElement("SHARCFB"); AddAttribute(doc, "Name", header.Name, mainNode); doc.AppendChild(mainNode); } public static string WriteProgram(SHARCFBNX.ShaderVariation program) { XmlDocument doc = new XmlDocument(); XmlNode mainNode = doc.CreateElement("ShaderVariation"); AddAttribute(doc, "Name", program.Text.Replace("\x00", ""), mainNode); doc.AppendChild(mainNode); WriteVariationSymbols(doc, program.Uniforms, "Uniform_Variables", mainNode); WriteVariationSymbols(doc, program.UniformBlocks, "Uniform_Blocks", mainNode); WriteVariationSymbols(doc, program.Samplers, "Sampler_Variables", mainNode); WriteVariationSymbols(doc, program.Attributes, "Attribute_Variables", mainNode); return DocumentToString(doc); } public static string WriteProgram(SHARC.ShaderProgram program) { XmlDocument doc = new XmlDocument(); XmlNode mainNode = doc.CreateElement("ShaderProgram"); AddAttribute(doc, "Name", program.Text.Replace("\x00", ""), mainNode); doc.AppendChild(mainNode); WriteMarcos(doc, program.variationVertexMacroData, "vertex_macro_array", mainNode); WriteMarcos(doc, program.variationFragmenMacroData, "fragment_macro_array", mainNode); WriteMarcos(doc, program.variationGeometryMacroData, "geometry_macro_array", mainNode); WriteVariationSymbols(doc, program.variationSymbolData, "option_array", mainNode); WriteShaderSymbolData(doc, program.UniformVariables, "Uniform_Variables", mainNode); WriteShaderSymbolData(doc, program.UniformBlocks, "Uniform_Blocks", mainNode); WriteShaderSymbolData(doc, program.SamplerVariables, "Sampler_Variables", mainNode); WriteShaderSymbolData(doc, program.AttributeVariables, "Attribute_Variables", mainNode); return DocumentToString(doc); } public static string WriteProgram(SHARCFBNX.ShaderProgram program) { XmlDocument doc = new XmlDocument(); XmlNode mainNode = doc.CreateElement("ShaderProgram"); AddAttribute(doc, "Name", program.Text.Replace("\x00", ""), mainNode); doc.AppendChild(mainNode); WriteMarcos(doc, program.variationMacroData, "macro_array", mainNode); WriteVariationSymbols(doc, program.variationSymbolData, "option_array", mainNode); WriteShaderSymbolData(doc, program.UniformVariables, "Uniform_Variables", mainNode); XmlNode vertexNode = doc.CreateElement("VertexVariation"); XmlNode pixelNode = doc.CreateElement("PixelVariation"); mainNode.AppendChild(vertexNode); mainNode.AppendChild(pixelNode); var var = program.GetDefaultVertexVariation(); WriteVariationSymbols(doc, var.Uniforms, "Uniform_Variables", vertexNode); WriteVariationSymbols(doc, var.UniformBlocks, "Uniform_Blocks", vertexNode); WriteVariationSymbols(doc, var.Samplers, "Sampler_Variables", vertexNode); WriteVariationSymbols(doc, var.Attributes, "Attribute_Variables", vertexNode); var = program.GetDefaultPixelVariation(); WriteVariationSymbols(doc, var.Uniforms, "Uniform_Variables", pixelNode); WriteVariationSymbols(doc, var.UniformBlocks, "Uniform_Blocks", pixelNode); WriteVariationSymbols(doc, var.Samplers, "Sampler_Variables", pixelNode); WriteVariationSymbols(doc, var.Attributes, "Attribute_Variables", pixelNode); return DocumentToString(doc); } public static string WriteProgram(SHARCFB.ShaderProgram program) { XmlDocument doc = new XmlDocument(); XmlNode mainNode = doc.CreateElement("ShaderProgram"); AddAttribute(doc, "Name", program.Text.Replace("\x00", ""), mainNode); doc.AppendChild(mainNode); WriteVariationSymbols(doc, program.variationMacroData, "macro_array", mainNode); WriteVariationSymbols(doc, program.variationSymbolData, "option_array", mainNode); WriteShaderSymbolData(doc, program.UniformVariables, "Uniform_Variables", mainNode); WriteShaderSymbolData(doc, program.UniformBlocks, "Uniform_Blocks", mainNode); WriteShaderSymbolData(doc, program.SamplerVariables, "Sampler_Variables", mainNode); WriteShaderSymbolData(doc, program.AttributeVariables, "Attribute_Variables", mainNode); return DocumentToString(doc); } private static void WriteMarcos(XmlDocument doc, VariationMacroData var, string Name, XmlNode node) { XmlNode rootNode = doc.CreateElement(Name); foreach (var macro in var.macros) { XmlNode childNode = doc.CreateElement("macro"); AddAttribute(doc, "name", macro.Name.Replace("\x00", ""), childNode); AddAttribute(doc, "value", macro.Value.Replace("\x00", ""), childNode); // AddAttribute(doc, "Values", macro.Values, ParamNode); rootNode.AppendChild(childNode); } node.AppendChild(rootNode); } private static void WriteVariationSymbols(XmlDocument doc, VariationSymbolData var, string Name, XmlNode node) { XmlNode rootNode = doc.CreateElement(Name); foreach (var symbol in var.symbols) { XmlNode childNode = doc.CreateElement("option"); AddAttribute(doc, "id", symbol.Name.Replace("\x00", ""), childNode); AddAttribute(doc, "symbol", symbol.SymbolName.Replace("\x00", ""), childNode); AddAttribute(doc, "values", string.Join(",", symbol.Values).Replace("\x00", ""), childNode); rootNode.AppendChild(childNode); } node.AppendChild(rootNode); } private static void WriteVariationSymbols(XmlDocument doc, List symbols, string Name, XmlNode node) { XmlNode rootNode = doc.CreateElement(Name); foreach (var symbol in symbols) { XmlNode childNode = doc.CreateElement("option"); AddAttribute(doc, "name", symbol.Name.Replace("\x00", ""), childNode); AddAttribute(doc, "location", symbol.Location.ToString(), childNode); AddAttribute(doc, "size", symbol.Size.ToString(), childNode); rootNode.AppendChild(childNode); } node.AppendChild(rootNode); } private static void WriteVariationSymbols(XmlDocument doc, List symbols, string Name, XmlNode node) { XmlNode rootNode = doc.CreateElement(Name); foreach (var symbol in symbols) { XmlNode childNode = doc.CreateElement("option"); AddAttribute(doc, "name", symbol.Name.Replace("\x00", ""), childNode); AddAttribute(doc, "offset", symbol.Offset.ToString(), childNode); rootNode.AppendChild(childNode); } node.AppendChild(rootNode); } private static void WriteVariationSymbols(XmlDocument doc, List symbols, string Name, XmlNode node) { XmlNode rootNode = doc.CreateElement(Name); foreach (var symbol in symbols) { XmlNode childNode = doc.CreateElement("option"); AddAttribute(doc, "name", symbol.Name.Replace("\x00", ""), childNode); AddAttribute(doc, "location", symbol.Location.ToString(), childNode); rootNode.AppendChild(childNode); } node.AppendChild(rootNode); } private static void WriteShaderSymbolData(XmlDocument doc, ShaderSymbolData symbolData, string Name, XmlNode node) { XmlNode rootNode = doc.CreateElement(Name); foreach (var symbol in symbolData.symbols) { XmlNode childNode = doc.CreateElement("VarSymbol"); AddAttribute(doc, "Name", symbol.Name.Replace("\x00", ""), childNode); if (symbol.sharcNXValues.Count > 0) { int i = 0; foreach (var value in symbol.sharcNXValues) AddAttribute(doc, $"Symbol_Name{i++}", value.Name.Replace("\x00", ""), childNode); } else { AddAttribute(doc, "Symbol_Name", symbol.SymbolName.Replace("\x00", ""), childNode); } // AddAttribute(doc, "Default_Value", symbol.DefaultValueString, ParamNode); rootNode.AppendChild(childNode); } node.AppendChild(rootNode); } } }