public void SetMaterialToTemplate(CatMaterialTemplate _materialTemplate) { if (m_material == null) { m_material = _materialTemplate.GetMaterialPrototype().Clone(); } else { m_material.ChangeMaterialTemplate(_materialTemplate); } }
/** * @brief Create materialTemplate from .material file * * @param _filepath filepath * * @result the materialTemplate * */ public static CatMaterialTemplate LoadMaterialTemplate(string _filepath) { // create material template CatMaterialTemplate newMaterialTemplate = new CatMaterialTemplate(); CatMaterial materialPrototype = newMaterialTemplate.GetMaterialPrototype(); // load .material file XmlDocument doc = new XmlDocument(); doc.Load(_filepath); XmlNode nodeMaterial = doc.SelectSingleNode("Material"); XmlElement eleMaterial = (XmlElement)nodeMaterial; string materialName = eleMaterial.GetAttribute("fxname"); // read material parameter if (nodeMaterial != null) { foreach (XmlNode node in nodeMaterial.ChildNodes) { XmlElement eleNode = (XmlElement)node; string parameterName = eleNode.GetAttribute("name"); string parameterType = eleNode.GetAttribute("type"); string parameterValue = eleNode.GetAttribute("value"); IEffectParameter variable = CatMaterial.CreateVariable(parameterType, parameterValue); if (variable != null) { materialPrototype.AddParameter(parameterName, variable); } // check if should show in editor, by checking whether note="NotInEditor" string parameterNote = eleNode.GetAttribute("note"); if (parameterNote != null && parameterNote.Contains("NotInEditor")) { newMaterialTemplate.m_maskedParameters.Add(parameterName, true); } } } // load effect newMaterialTemplate.m_effect = Mgr <CatProject> .Singleton.contentManger.Load <Effect>("effect\\" + materialName); return(newMaterialTemplate); }
/** * @brief Switch to another materialTemplate. Keep as many parameters as possible * name and type are checked * * @param _materialTemplate the target material template * */ public void ChangeMaterialTemplate(CatMaterialTemplate _materialTemplate) { Debug.Assert(_materialTemplate != null, "Null target material template."); Dictionary <string, IEffectParameter> newParameters = new Dictionary <string, IEffectParameter>(); Dictionary <string, IEffectParameter> targetParameters = _materialTemplate.GetMaterialPrototype().m_parameters; foreach (KeyValuePair <string, IEffectParameter> keyValue in m_parameters) { string parameterName = keyValue.Key; if (targetParameters.ContainsKey(parameterName)) { if (keyValue.Value.GetType() == targetParameters[parameterName].GetType()) { // same name and same type, copy newParameters[parameterName] = keyValue.Value.ParameterClone(); } else { // type not match newParameters[parameterName] = targetParameters[parameterName].ParameterClone(); } } } // add missing parameters foreach (KeyValuePair <string, IEffectParameter> keyValue in targetParameters) { if (!newParameters.ContainsKey(keyValue.Key)) { newParameters[keyValue.Key] = keyValue.Value.ParameterClone(); } } m_parameters = newParameters; m_materialTemplate = _materialTemplate; }