From 188957ee914cb3c490f283ee3676e0febdd3e57d Mon Sep 17 00:00:00 2001 From: hevinci Date: Fri, 5 Aug 2022 11:18:32 +0800 Subject: [PATCH] Update ShaderVariantCollector --- .../ShaderVariantCollectionHelper.cs | 114 +++----------- .../ShaderVariantCollectionManifest.cs | 145 ++++++++++++++++++ .../ShaderVariantCollectionManifest.cs.meta | 11 ++ .../ShaderVariantCollector.cs | 25 +-- .../ShaderVariantCollectorWindow.cs | 4 +- 5 files changed, 183 insertions(+), 116 deletions(-) create mode 100644 Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollectionManifest.cs create mode 100644 Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollectionManifest.cs.meta diff --git a/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollectionHelper.cs b/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollectionHelper.cs index b03fe1a..816079a 100644 --- a/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollectionHelper.cs +++ b/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollectionHelper.cs @@ -10,103 +10,31 @@ namespace YooAsset.Editor { public static class ShaderVariantCollectionHelper { - [Serializable] - public class ShaderVariantWrapper + public static void ClearCurrentShaderVariantCollection() { - /// - /// Shader asset path in editor. - /// - public string AssetPath; - - /// - /// Shader name. - /// - public string ShaderName; - - /// - /// Pass type to use in this variant. - /// - public PassType PassType; - - /// - /// Array of shader keywords to use in this variant. - /// - public string[] Keywords; - - public ShaderVariantWrapper(string assetPath, string shaderName, PassType passType, params string[] keywords) - { - AssetPath = assetPath; - ShaderName = shaderName; - PassType = passType; - Keywords = keywords; - } + EditorTools.InvokeNonPublicStaticMethod(typeof(ShaderUtil), "ClearCurrentShaderVariantCollection"); + } + public static void SaveCurrentShaderVariantCollection(string savePath) + { + EditorTools.InvokeNonPublicStaticMethod(typeof(ShaderUtil), "SaveCurrentShaderVariantCollection", savePath); + } + public static int GetCurrentShaderVariantCollectionShaderCount() + { + return (int)EditorTools.InvokeNonPublicStaticMethod(typeof(ShaderUtil), "GetCurrentShaderVariantCollectionShaderCount"); + } + public static int GetCurrentShaderVariantCollectionVariantCount() + { + return (int)EditorTools.InvokeNonPublicStaticMethod(typeof(ShaderUtil), "GetCurrentShaderVariantCollectionVariantCount"); } - [Serializable] - public class ShaderVariantCollectionWrapper + /// + /// 获取着色器的变种总数量 + /// + public static string GetShaderVariantCount(string assetPath) { - /// - /// Number of shaders in this collection - /// - public int ShaderCount; - - /// - /// Number of total varians in this collection - /// - public int VariantCount; - - /// - /// Shader variants list. - /// - public List ShaderVariants = new List(1000); - - public void Add(ShaderVariantWrapper variant) - { - ShaderVariants.Add(variant); - } - } - - - public static ShaderVariantCollectionWrapper Extract(ShaderVariantCollection svc) - { - var result = new ShaderVariantCollectionWrapper(); - using (var so = new SerializedObject(svc)) - { - var shaderArray = so.FindProperty("m_Shaders.Array"); - if (shaderArray != null && shaderArray.isArray) - { - for (int i = 0; i < shaderArray.arraySize; ++i) - { - var shaderRef = shaderArray.FindPropertyRelative($"data[{i}].first"); - var shaderVariantsArray = shaderArray.FindPropertyRelative($"data[{i}].second.variants"); - if (shaderRef != null && shaderRef.propertyType == SerializedPropertyType.ObjectReference && shaderVariantsArray != null && shaderVariantsArray.isArray) - { - var shader = shaderRef.objectReferenceValue as Shader; - if (shader == null) - { - throw new Exception("Invalid shader in ShaderVariantCollection file."); - } - - string shaderAssetPath = AssetDatabase.GetAssetPath(shader); - string shaderName = shader.name; - - // 添加变种信息 - for (int j = 0; j < shaderVariantsArray.arraySize; ++j) - { - var propKeywords = shaderVariantsArray.FindPropertyRelative($"Array.data[{j}].keywords"); - var propPassType = shaderVariantsArray.FindPropertyRelative($"Array.data[{j}].passType"); - if (propKeywords != null && propPassType != null && propKeywords.propertyType == SerializedPropertyType.String) - { - string[] keywords = propKeywords.stringValue.Split(' '); - PassType pathType = (PassType)propPassType.intValue; - result.Add(new ShaderVariantWrapper(shaderAssetPath, shaderName, pathType, keywords)); - } - } - } - } - } - } - return result; + Shader shader = AssetDatabase.LoadAssetAtPath(assetPath); + var variantCount = EditorTools.InvokeNonPublicStaticMethod(typeof(ShaderUtil), "GetVariantCount", shader, true); + return variantCount.ToString(); } } } \ No newline at end of file diff --git a/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollectionManifest.cs b/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollectionManifest.cs new file mode 100644 index 0000000..402f195 --- /dev/null +++ b/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollectionManifest.cs @@ -0,0 +1,145 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using UnityEngine; +using UnityEngine.Rendering; +using UnityEditor; + +namespace YooAsset.Editor +{ + public static class ShaderVariantCollectionReadme + { + [Serializable] + public class ShaderVariantElement + { + /// + /// Pass type to use in this variant. + /// + public PassType PassType; + + /// + /// Array of shader keywords to use in this variant. + /// + public string[] Keywords; + } + + [Serializable] + public class ShaderVariantInfo + { + /// + /// Shader asset path in editor. + /// + public string AssetPath; + + /// + /// Shader name. + /// + public string ShaderName; + + /// + /// Shader variants elements list. + /// + public List ShaderVariantElements = new List(1000); + } + + [Serializable] + public class ShaderVariantCollectionManifest + { + /// + /// Number of shaders in this collection + /// + public int ShaderTotalCount; + + /// + /// Number of total varians in this collection + /// + public int VariantTotalCount; + + /// + /// Shader variants info list. + /// + public List ShaderVariantInfos = new List(1000); + + /// + /// 添加着色器变种信息 + /// + public void AddShaderVariant(string assetPath, string shaderName, PassType passType, string[] keywords) + { + var info = GetOrCreateShaderVariantInfo(assetPath, shaderName); + ShaderVariantElement element = new ShaderVariantElement(); + element.PassType = passType; + element.Keywords = keywords; + info.ShaderVariantElements.Add(element); + } + private ShaderVariantInfo GetOrCreateShaderVariantInfo(string assetPath, string shaderName) + { + var selectList = ShaderVariantInfos.Where(t => t.ShaderName == shaderName && t.AssetPath == assetPath).ToList(); + if (selectList.Count == 0) + { + ShaderVariantInfo newInfo = new ShaderVariantInfo(); + newInfo.AssetPath = assetPath; + newInfo.ShaderName = shaderName; + ShaderVariantInfos.Add(newInfo); + return newInfo; + } + + if (selectList.Count != 1) + throw new Exception("Should never get here !"); + + return selectList[0]; + } + } + + + /// + /// 解析SVC文件并将数据写入到清单 + /// + public static ShaderVariantCollectionManifest Extract(ShaderVariantCollection svc) + { + var manifest = new ShaderVariantCollectionManifest(); + manifest.ShaderTotalCount = ShaderVariantCollectionHelper.GetCurrentShaderVariantCollectionShaderCount(); + manifest.VariantTotalCount = ShaderVariantCollectionHelper.GetCurrentShaderVariantCollectionVariantCount(); + + using (var so = new SerializedObject(svc)) + { + var shaderArray = so.FindProperty("m_Shaders.Array"); + if (shaderArray != null && shaderArray.isArray) + { + for (int i = 0; i < shaderArray.arraySize; ++i) + { + var shaderRef = shaderArray.FindPropertyRelative($"data[{i}].first"); + var shaderVariantsArray = shaderArray.FindPropertyRelative($"data[{i}].second.variants"); + if (shaderRef != null && shaderRef.propertyType == SerializedPropertyType.ObjectReference && shaderVariantsArray != null && shaderVariantsArray.isArray) + { + var shader = shaderRef.objectReferenceValue as Shader; + if (shader == null) + { + throw new Exception("Invalid shader in ShaderVariantCollection file."); + } + + string shaderAssetPath = AssetDatabase.GetAssetPath(shader); + string shaderName = shader.name; + + // 添加变种信息 + for (int j = 0; j < shaderVariantsArray.arraySize; ++j) + { + var propKeywords = shaderVariantsArray.FindPropertyRelative($"Array.data[{j}].keywords"); + var propPassType = shaderVariantsArray.FindPropertyRelative($"Array.data[{j}].passType"); + if (propKeywords != null && propPassType != null && propKeywords.propertyType == SerializedPropertyType.String) + { + string[] keywords = propKeywords.stringValue.Split(' '); + PassType pathType = (PassType)propPassType.intValue; + manifest.AddShaderVariant(shaderAssetPath, shaderName, pathType, keywords); + } + } + } + } + } + } + + return manifest; + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollectionManifest.cs.meta b/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollectionManifest.cs.meta new file mode 100644 index 0000000..1ccf9c8 --- /dev/null +++ b/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollectionManifest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 97098b04691f5c046ac4829f1d72f425 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollector.cs b/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollector.cs index bf6a598..8542d64 100644 --- a/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollector.cs +++ b/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollector.cs @@ -28,7 +28,7 @@ namespace YooAsset.Editor EditorApplication.update -= EditorUpdate; // 保存结果 - SaveCurrentShaderVariantCollection(); + ShaderVariantCollectionHelper.SaveCurrentShaderVariantCollection(_saveFilePath); // 创建说明文件 CreateReadme(); @@ -61,7 +61,7 @@ namespace YooAsset.Editor EditorTools.FocusUnityGameWindow(); // 清空旧数据 - ClearCurrentShaderVariantCollection(); + ShaderVariantCollectionHelper.ClearCurrentShaderVariantCollection(); // 创建临时测试场景 CreateTemperScene(); @@ -181,7 +181,6 @@ namespace YooAsset.Editor go.transform.position = position; go.name = $"Sphere_{index}|{material.name}"; } - private static void CreateReadme() { AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate); @@ -189,29 +188,13 @@ namespace YooAsset.Editor ShaderVariantCollection svc = AssetDatabase.LoadAssetAtPath(_saveFilePath); if (svc != null) { - var wrapper = ShaderVariantCollectionHelper.Extract(svc); + var wrapper = ShaderVariantCollectionReadme.Extract(svc); string jsonContents = JsonUtility.ToJson(wrapper, true); - string savePath = _saveFilePath.Replace(".shadervariants", "_Readme.json"); + string savePath = _saveFilePath.Replace(".shadervariants", "Manifest.json"); File.WriteAllText(savePath, jsonContents); } AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate); } - private static void ClearCurrentShaderVariantCollection() - { - EditorTools.InvokeNonPublicStaticMethod(typeof(ShaderUtil), "ClearCurrentShaderVariantCollection"); - } - private static void SaveCurrentShaderVariantCollection() - { - EditorTools.InvokeNonPublicStaticMethod(typeof(ShaderUtil), "SaveCurrentShaderVariantCollection", _saveFilePath); - } - public static int GetCurrentShaderVariantCollectionShaderCount() - { - return (int)EditorTools.InvokeNonPublicStaticMethod(typeof(ShaderUtil), "GetCurrentShaderVariantCollectionShaderCount"); - } - public static int GetCurrentShaderVariantCollectionVariantCount() - { - return (int)EditorTools.InvokeNonPublicStaticMethod(typeof(ShaderUtil), "GetCurrentShaderVariantCollectionVariantCount"); - } } } \ No newline at end of file diff --git a/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollectorWindow.cs b/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollectorWindow.cs index 13aa1e6..8ca66d7 100644 --- a/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollectorWindow.cs +++ b/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollectorWindow.cs @@ -25,8 +25,8 @@ namespace YooAsset.Editor EditorGUILayout.Space(); ShaderVariantCollectorSettingData.Setting.SavePath = EditorGUILayout.TextField("收集文件保存路径", ShaderVariantCollectorSettingData.Setting.SavePath); - int currentShaderCount = ShaderVariantCollector.GetCurrentShaderVariantCollectionShaderCount(); - int currentVariantCount = ShaderVariantCollector.GetCurrentShaderVariantCollectionVariantCount(); + int currentShaderCount = ShaderVariantCollectionHelper.GetCurrentShaderVariantCollectionShaderCount(); + int currentVariantCount = ShaderVariantCollectionHelper.GetCurrentShaderVariantCollectionVariantCount(); EditorGUILayout.LabelField($"CurrentShaderCount : {currentShaderCount}"); EditorGUILayout.LabelField($"CurrentVariantCount : {currentVariantCount}");