Esempio n. 1
0
        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);
                    }
                }
            }
        }
Esempio n. 2
0
        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);
        }