示例#1
0
        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);
        }
示例#2
0
 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 => { });
 }
示例#3
0
        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);
            }
        }
示例#4
0
        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);
            }
        }
示例#5
0
        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);
        }
示例#6
0
        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);
        }
示例#7
0
        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);
        }
示例#8
0
        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);
        }
示例#9
0
        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);
        }
示例#10
0
 public void CopyTo(ShaderSerializedProperty other)
 {
     TryCopyValue(this.value, other.value);
 }
示例#11
0
        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);
            }
        }