public void ApplyToMaterial(IEnumerable <Material> mats) { if (material == null) { Debug.LogWarningFormat("[WF] Material is not set in the template: {0}", name); return; } Undo.RecordObjects(mats.ToArray(), "WF apply Template"); // シェーダを揃える foreach (var mat in mats) { if (mat.shader != material.shader) { mat.shader = material.shader; mat.renderQueue = material.renderQueue; } } // プロパティ類をコピー var prm = CopyPropParameter.Create(); prm.materialSource = material; prm.materialDestination = mats.ToArray(); prm.labels = WFShaderFunction.GetEnableFunctionList(material).Select(f => f.Label).ToArray(); prm.onlyOverrideBuiltinTextures = true; // テクスチャ類はビルトインテクスチャのみ上書き可能 WFMaterialEditUtility.CopyPropertiesWithoutUndo(prm); }
public static void copyProperties(CopyPropParameter param, bool undo) { if (param.materialSource == null) { return; } var src_props = new List <ShaderMaterialProperty>(); // Label経由とPrefix経由をどちらもPrefixにする var copy_target = new List <string>(WFShaderFunction.LabelToPrefix(param.labels.ToList())); copy_target.AddRange(param.prefixs); foreach (var src_prop in ShaderMaterialProperty.AsList(param.materialSource)) { string prefix = WFCommonUtility.GetPrefixFromPropName(src_prop.Name); if (prefix == null) { continue; } // Prefixの一致判定 if (copy_target.Any(prefix.Contains)) { if (!param.withoutTextures || src_prop.Type != ShaderUtil.ShaderPropertyType.TexEnv) { src_props.Add(src_prop); } } } if (src_props.Count == 0) { return; } if (undo) { Undo.RecordObjects(param.materialDestination, "WF copy materials"); } for (int i = 0; i < param.materialDestination.Length; i++) { var dst = param.materialDestination[i]; if (dst == null || dst == param.materialSource) { // コピー先とコピー元が同じ時もコピーしない continue; } var dst_props = ShaderMaterialProperty.AsDict(dst); // コピー if (CopyProperties(src_props, dst_props, param.onlyOverrideBuiltinTextures)) { // キーワードを整理する WFCommonUtility.SetupShaderKeyword(dst); // ダーティフラグを付ける EditorUtility.SetDirty(dst); } } AssetDatabase.SaveAssets(); }
public void CopyProperties(CopyPropParameter param) { if (param.materialSource == null) { return; } var src_props = new List <ShaderMaterialProperty>(); var copy_target = WFShaderFunction.LabelToPrefix(param.functions.ToList()); foreach (var src_prop in ShaderMaterialProperty.AsList(param.materialSource)) { string label = WFCommonUtility.GetPrefixFromPropName(src_prop.Name); if (label == null) { continue; } // ラベルの一致判定 if (copy_target.Any(label.Contains)) { src_props.Add(src_prop); } } if (src_props.Count == 0) { return; } for (int i = 0; i < param.materialDestination.Length; i++) { var dst = param.materialDestination[i]; if (dst == null || dst == param.materialSource) // コピー先とコピー元が同じ時もコピーしない { continue; } var dst_props = ShaderMaterialProperty.AsDict(dst); // コピー if (CopyProperties(src_props, dst_props)) { EditorUtility.SetDirty(dst); } } AssetDatabase.SaveAssets(); }
private void OnGUI() { ToolCommon.WindowHeader("UnlitWF / Copy material property", "Copy properties", "source material の設定値を destination materials にコピーします。"); var so = new SerializedObject(param); so.Update(); // スクロール開始 scroll = EditorGUILayout.BeginScrollView(scroll); // マテリアルリスト EditorGUILayout.LabelField("destination materials", EditorStyles.boldLabel); EditorGUILayout.PropertyField(so.FindProperty("materialDestination"), new GUIContent("list"), true); EditorGUILayout.Space(); // マテリアルに UnlitWF 以外のシェーダが紛れている場合には警告 bool removeOther = ToolCommon.NoticeIfIllegalMaterials(param.materialDestination); EditorGUILayout.Space(); EditorGUILayout.LabelField("source materials", EditorStyles.boldLabel); EditorGUILayout.PropertyField(so.FindProperty("materialSource"), new GUIContent("material"), true); EditorGUILayout.Space(); ToolCommon.NoticeIfIllegalMaterials(new Material[] { param.materialSource }, false); EditorGUILayout.Space(); so.ApplyModifiedPropertiesWithoutUndo(); so.SetIsDifferentCacheDirty(); // 対象 EditorGUILayout.LabelField("copy target functions", EditorStyles.boldLabel); var updatedFunctions = new List <string>(); foreach (var func in WFShaderFunction.GetEnableFunctionList(param.materialSource)) { bool value = param.labels.Contains(func.Label); if (GUILayout.Toggle(value, string.Format("[{0}] {1}", func.Label, func.Name))) { updatedFunctions.Add(func.Label); } } if (!updatedFunctions.SequenceEqual(param.labels)) { param.labels = updatedFunctions.ToArray(); } EditorGUILayout.Space(); // UnlitWF 以外のマテリアルを除去 if (removeOther) { param.materialDestination = ToolCommon.FilterOnlyWFMaterial(param.materialDestination); } using (new EditorGUI.DisabledGroupScope(param.labels.Length == 0)) { if (ToolCommon.ExecuteButton("Copy Values", param.materialSource == null || param.materialDestination.Length == 0)) { WFMaterialEditUtility.CopyProperties(param); } } EditorGUILayout.Space(); // スクロール終了 EditorGUILayout.EndScrollView(); }
public static bool IsEnable(WFShaderFunction func, Material mat) { return(IsEnable("_" + func.Prefix + "_Enable", mat)); }