public void Save2XML(IO.XmlNode node) { //string fileName = ""; var hlslDesc = CEngine.Instance.FileManager.HLSLFileDescManager.FindFileDesc(this.EnvShaderPatch.ShaderName.Address); node.AddAttrib("HLSLHashCode", hlslDesc.HashWithDepends.ToString()); node.AddAttrib("Material_RNameType", ((int)MtlShaderPatch.Name.RNameType).ToString()); node.AddAttrib("Material", MtlShaderPatch.Name.ToString()); node.AddAttrib("ShadingEnv", EnvShaderPatch.ShaderName.ToString()); node.AddAttrib("ShadingEnvType", Rtti.RttiHelper.GetTypeSaveString(EnvShaderPatch.EnvType)); node.AddAttrib("CacheTime", System.DateTime.Now.ToString()); { var mdfCaller = MdfQueueShaderPatch.GetMdfQueueCaller(); var mdf = node.AddNode("MdfQueue", "", node.mHolder); mdf.AddAttrib("MDFQUEUE_FUNCTION", mdfCaller); foreach (var i in MdfQueueShaderPatch.Modifiers) { mdf.AddNode(i.Name, "", node.mHolder); } } { var mtl = MtlShaderPatch.GetMtlMacroArray(); var mtlNode = node.AddNode("MtlMacro", "", node.mHolder); foreach (var i in mtl) { mtlNode.AddAttrib(i.mMacroName, i.mMacroValue); } } { var env = node.AddNode("EnvMacro", "", node.mHolder); var defs = EnvShaderPatch.MacroDefines; if (defs != null) { foreach (var i in defs) { env.AddAttrib(i.Name, i.Definition); } } } }
public static async System.Threading.Tasks.Task <CGfxEffectDesc> LoadEffectDescFromXml(CRenderContext rc, IO.XmlNode node, bool testHash = true) { var result = new CGfxEffectDesc(); if (node == null) { return(result); } RName.enRNameType rNameType = RName.enRNameType.Game; var attr = node.FindAttrib("Material_RNameType"); if (attr != null) { rNameType = (RName.enRNameType)System.Convert.ToInt32(attr.Value); } attr = node.FindAttrib("Material"); if (attr != null) { result.MtlShaderPatch = await CEngine.Instance.MaterialManager.GetMaterialAsync(rc, RName.GetRName(attr.Value, rNameType)); if (result.MtlShaderPatch == null) { return(null); } } attr = node.FindAttrib("ShadingEnv"); string shadingEnvName = null; if (attr != null) { result.mEnvShaderPatch = new Graphics.GfxEnvShaderCode(); shadingEnvName = attr.Value; var attr1 = node.FindAttrib("ShadingEnvType"); if (attr1 != null) { var envType = Rtti.RttiHelper.GetTypeFromSaveString(attr1.Value); var envTemp = Rtti.RttiHelper.CreateInstance(envType) as CGfxShadingEnv; if (envTemp != null) { envTemp.InitCodeOnce(result.mEnvShaderPatch); } } var LoadDefs = new List <CShaderDefinitions.MacroDefine>(); var defs = node.FindNode("EnvMacro"); if (defs != null) { var macroAttrs = defs.GetAttribs(); for (int i = 0; i < macroAttrs.Count; i++) { result.mEnvShaderPatch.SetMacroDefineValue(macroAttrs[i].Name, macroAttrs[i].Value); } } } result.MdfQueueShaderPatch = new Mesh.CGfxMdfQueue(); var mdf = node.FindNode("MdfQueue").GetNodes(); foreach (var i in mdf) { var type = Rtti.RttiHelper.GetTypeFromSaveString(i.Name); var om = System.Activator.CreateInstance(type) as EngineNS.Graphics.Mesh.CGfxModifier; if (om == null) { continue; } result.MdfQueueShaderPatch.AddModifier(om); } result.UpdateMacroArray(); result.UpdateHash64(false); if (testHash) { attr = node.FindAttrib("HLSLHashCode"); if (attr != null) { result.HLSLHashCode = attr.Value; var hlslDesc = CEngine.Instance.FileManager.HLSLFileDescManager.FindFileDesc(RName.GetRName(shadingEnvName, RName.enRNameType.Engine).Address); if (hlslDesc != null && hlslDesc.HashWithDepends.ToString() != result.HLSLHashCode) { Profiler.Log.WriteLine(Profiler.ELogTag.Warning, "Shaders", $"effect {shadingEnvName} need recompile"); return(null); } } } return(result); }