private static bool RenamePropNameWithoutUndo(Material[] mats, List <RelacePropertyName> replaceList) { if (replaceList.Count == 0) { return(false); } // 名称を全て変更 foreach (var propPair in replaceList) { if (propPair.after != null) { propPair.before.CopyTo(propPair.after); propPair.onAfterCopy(propPair.after); } else { propPair.before.Rename(propPair.afterName); propPair.onAfterCopy(propPair.before); } } // 保存 ShaderSerializedProperty.AllApplyPropertyChange(replaceList.Select(p => p.after)); // 旧プロパティは全て削除 foreach (var prop in replaceList.Where(p => p.after != null).Select(p => p.before)) { prop.Remove(); } // 保存 ShaderSerializedProperty.AllApplyPropertyChange(replaceList.Select(p => p.before)); return(true); }
public RelacePropertyName(ShaderSerializedProperty before, ShaderSerializedProperty after, string afterName, Action <ShaderSerializedProperty> onAfterCopy = null) { this.before = before; this.after = after; this.afterName = afterName; this.onAfterCopy = onAfterCopy ?? (p => { }); }
public void ExecAutoConvertWithoutUndo(params Material[] mats) { foreach (var mat in mats) { if (mat == null) { continue; } if (!Validate(mat)) { continue; } var ctx = new ConvertContext(); ctx.target = mat; ctx.oldMaterial = new Material(mat); ctx.oldProps = ShaderSerializedProperty.AsDict(ctx.oldMaterial); foreach (var cnv in converters) { cnv(ctx); } Debug.LogFormat("[WF] Convert {0}: {1} -> {2}", ctx.target, ctx.oldMaterial.shader.name, ctx.target.shader.name); } }
public static void CleanUpProperties(CleanUpParameter param) { Undo.RecordObjects(param.materials, "WF cleanup materials"); foreach (Material material in param.materials) { if (material == null) { continue; } var props = ShaderSerializedProperty.AsList(material); // 無効になってる機能のプレフィックスを集める var delPrefix = new List <string>(); foreach (var p in props) { string label, name; WFCommonUtility.FormatPropName(p.name, out label, out name); if (label != null && name.ToLower() == "enable" && p.FloatValue == 0) { delPrefix.Add(label); } } var del_props = new HashSet <ShaderSerializedProperty>(); // プレフィックスに合致する設定値を消去 Predicate <ShaderSerializedProperty> predPrefix = p => { string label = WFCommonUtility.GetPrefixFromPropName(p.name); return(label != null && delPrefix.Contains(label)); }; props.FindAll(predPrefix) // ただしEnableToggle自体は初期化しない .Where(p => !WFCommonUtility.IsEnableToggleFromPropName(p.name)).ToList().ForEach(p => del_props.Add(p)); // 未使用の値を削除 Predicate <ShaderSerializedProperty> predUnused = p => param.resetUnused && !p.HasPropertyInShader; props.FindAll(predUnused).ForEach(p => del_props.Add(p)); // 削除実行 DeleteProperties(del_props); // キーワードクリア if (param.resetKeywords) { foreach (var so in ShaderSerializedProperty.GetUniqueSerialObject(props)) { DeleteShaderKeyword(so); } } // キーワードを整理する WFCommonUtility.SetupShaderKeyword(material); // 反映 EditorUtility.SetDirty(material); } }
private static void DeleteProperties(IEnumerable <ShaderSerializedProperty> props) { var del_names = new HashSet <string>(); foreach (var p in props) { del_names.Add(p.name); p.Remove(); } if (0 < del_names.Count) { var names = new List <string>(del_names); names.Sort(); UnityEngine.Debug.Log("[WF][Tool] Deleted Property: " + string.Join(", ", names.ToArray())); } ShaderSerializedProperty.AllApplyPropertyChange(props); }
private static List <RelacePropertyName> CreateReplacePropertyList(Material[] mats, IEnumerable <PropertyNameReplacement> replacement) { var result = new List <RelacePropertyName>(); foreach (var mat in mats) { var props = ShaderSerializedProperty.AsDict(mat); foreach (var pair in replacement) { var before = props.GetValueOrNull(pair.beforeName); if (before != null) { result.Add(new RelacePropertyName(before, props.GetValueOrNull(pair.afterName), pair.afterName, pair.onAfterCopy)); } } } return(result); }
protected static bool HasCustomValue(ConvertContext ctx, params string[] names) { var newProp = ShaderSerializedProperty.AsDict(ctx.target); foreach (var name in names) { // 新しいマテリアルから設定されていないかを調べる if (hasCustomValue(newProp, name)) { return(true); } // 古いマテリアルの側から設定されていないかを調べる if (hasCustomValue(ctx.oldProps, name)) { return(true); } } return(false); }
public bool RenameOldNameProperties(UnityEngine.Object[] objlist) { var oldPropList = CreateOldNamePropertyList(objlist); // 名称を全て変更 foreach (var propPair in oldPropList) { if (propPair.Value != null) { propPair.Key.CopyTo(propPair.Value); } } // 保存 ShaderSerializedProperty.AllApplyPropertyChange(oldPropList.Values); // 旧プロパティは全て削除 foreach (var prop in oldPropList.Keys) { prop.Remove(); } // 保存 ShaderSerializedProperty.AllApplyPropertyChange(oldPropList.Keys); return(0 < oldPropList.Count); }
private Dictionary <ShaderSerializedProperty, ShaderSerializedProperty> CreateOldNamePropertyList(UnityEngine.Object[] objlist) // ShaderCustomEditor側から呼び出されるのでobject[] { var result = new Dictionary <ShaderSerializedProperty, ShaderSerializedProperty>(); foreach (var mat in WFCommonUtility.AsMaterials(objlist)) { if (mat.shader.name.Contains("MatcapShadows")) { // MatcapShadowsは古いので対象にしない continue; } var props = ShaderSerializedProperty.AsDict(mat); foreach (var pair in WFShaderDictionary.OldPropNameToNewPropNameMap) { var before = props.GetValueOrNull(pair.Key); if (before != null) { result[before] = props.GetValueOrNull(pair.Value); } } } return(result); }
public void CopyTo(ShaderSerializedProperty other) { TryCopyValue(this.value, other.value); }
public static void ResetPropertiesWithoutUndo(ResetParameter param) { foreach (Material material in param.materials) { if (material == null) { continue; } var props = ShaderSerializedProperty.AsList(material); var del_props = new HashSet <ShaderSerializedProperty>(); // ColorのAlphaチャンネルのみ変更 foreach (var p in props) { if (p.HasPropertyInShader && p.Type == ShaderUtil.ShaderPropertyType.Color) { var c = p.ColorValue; c.a = 1; p.ColorValue = c; } } ShaderSerializedProperty.AllApplyPropertyChange(props); // 条件に合致するプロパティを削除 foreach (var p in props) { if (param.resetColor && p.Type == ShaderUtil.ShaderPropertyType.Color) { del_props.Add(p); } else if (param.resetFloat && p.Type == ShaderUtil.ShaderPropertyType.Float) { del_props.Add(p); } else if (param.resetTexture && p.Type == ShaderUtil.ShaderPropertyType.TexEnv) { del_props.Add(p); } else if (param.resetUnused && !p.HasPropertyInShader) { del_props.Add(p); } else if (param.resetLit && p.name.StartsWith("_GL_")) { del_props.Add(p); } else if (param.resetPrefixs.Contains(WFCommonUtility.GetPrefixFromPropName(p.name))) { del_props.Add(p); } } // 削除実行 DeleteProperties(del_props); // キーワードクリア if (param.resetKeywords) { foreach (var so in ShaderSerializedProperty.GetUniqueSerialObject(props)) { DeleteShaderKeyword(so); } } // キーワードを整理する WFCommonUtility.SetupShaderKeyword(material); // 反映 EditorUtility.SetDirty(material); } }