public void OnProcessShader( Shader shader, ShaderSnippetData snippet, IList <ShaderCompilerData> shaderCompilerData) { try { bool skipCompilation = false; if (SCWindow.GetEditorPrefBool("QUICK_BUILD", false)) { skipCompilation = true; } if (shadersBuildInfo == null) { string filename = GetStoredDataPath(); shadersBuildInfo = AssetDatabase.LoadAssetAtPath <ShadersBuildInfo>(filename); if (shadersBuildInfo == null) { return; } } ShaderBuildInfo sb = shadersBuildInfo.GetShader(shader.name); if (sb == null) { sb = new ShaderBuildInfo(); sb.name = shader.name; sb.simpleName = SCShader.GetSimpleName(sb.name); sb.type = snippet.shaderType; string path = AssetDatabase.GetAssetPath(shader); sb.isInternal = string.IsNullOrEmpty(path) || !File.Exists(path); shadersBuildInfo.Add(sb); EditorUtility.SetDirty(shadersBuildInfo); } else if (!sb.includeInBuild) { skipCompilation = true; } int count = shaderCompilerData.Count; for (int i = 0; i < count; ++i) { ShaderKeywordSet ks = shaderCompilerData[i].shaderKeywordSet; foreach (ShaderKeyword kw in ks.GetShaderKeywords()) { #if UNITY_2019_3_OR_NEWER string kname = ShaderKeyword.GetKeywordName(shader, kw); #else string kname = kw.GetName(); #endif if (string.IsNullOrEmpty(kname)) { continue; } if (!sb.KeywordsIsIncluded(kname)) { shaderCompilerData.RemoveAt(i); count--; i--; break; } else { EditorUtility.SetDirty(shadersBuildInfo); } } } if (skipCompilation) { shaderCompilerData.Clear(); return; } } catch (Exception ex) { Debug.LogWarning("Shader Control detected an error during compilation of one shader: " + ex.ToString()); } }
public void OnProcessShader( Shader shader, ShaderSnippetData snippet, IList <ShaderCompilerData> shaderCompilerData) { bool skipCompilation = false; if (SCWindow.GetEditorPrefBool("QUICK_BUILD", false)) { skipCompilation = true; } if (shadersBuildInfo == null) { string filename = GetStoredDataPath(); shadersBuildInfo = AssetDatabase.LoadAssetAtPath <ShadersBuildInfo>(filename); if (shadersBuildInfo == null) { shadersBuildInfo = ScriptableObject.CreateInstance <ShadersBuildInfo>(); Directory.CreateDirectory(Path.GetDirectoryName(filename)); AssetDatabase.CreateAsset(shadersBuildInfo, filename); EditorUtility.SetDirty(shadersBuildInfo); } } ShaderBuildInfo sb = shadersBuildInfo.GetShader(shader.name); if (sb == null) { sb = new ShaderBuildInfo(); sb.name = shader.name; sb.simpleName = SCShader.GetSimpleName(sb.name); sb.type = snippet.shaderType; string path = AssetDatabase.GetAssetPath(shader); sb.isInternal = string.IsNullOrEmpty(path) || !File.Exists(path); shadersBuildInfo.Add(sb); EditorUtility.SetDirty(shadersBuildInfo); } else if (!sb.includeInBuild) { skipCompilation = true; } int count = shaderCompilerData.Count; for (int i = 0; i < count; ++i) { ShaderKeywordSet ks = shaderCompilerData[i].shaderKeywordSet; foreach (ShaderKeyword kw in ks.GetShaderKeywords()) { #if UNITY_2019_3_OR_NEWER string kname = ShaderKeyword.GetKeywordName(shader, kw); #else string kname = kw.GetKeywordName(); #endif if (string.IsNullOrEmpty(kname)) { continue; } if (!sb.KeywordsIsIncluded(kname)) { shaderCompilerData.RemoveAt(i); count--; i--; break; } else { EditorUtility.SetDirty(shadersBuildInfo); } } } if (skipCompilation) { shaderCompilerData.Clear(); } }
void ScanProject() { try { if (shaders == null) { shaders = new List <SCShader>(); } else { shaders.Clear(); } // Add shaders from Resources folder string[] guids = AssetDatabase.FindAssets("t:Shader"); totalShaderCount = guids.Length; for (int k = 0; k < totalShaderCount; k++) { string guid = guids[k]; string path = AssetDatabase.GUIDToAssetPath(guid); if (path != null) { string pathUpper = path.ToUpper(); if (scanAllShaders || pathUpper.Contains("\\RESOURCES\\") || pathUpper.Contains("/RESOURCES/")) // this shader will be included in build { Shader unityShader = AssetDatabase.LoadAssetAtPath <Shader>(path); if (unityShader != null) { SCShader shader = new SCShader(); shader.fullName = unityShader.name; shader.name = SCShader.GetSimpleName(shader.fullName); // Path.GetFileNameWithoutExtension(path); shader.path = path; string shaderGUID = path + "/" + unityShader.name; shader.GUID = shaderGUID; ScanShader(shader); if (shader.keywords.Count > 0) { shaders.Add(shader); } } } } } // Load and reference materials Dictionary <string, SCShader> shaderCache = new Dictionary <string, SCShader>(shaders.Count); shaders.ForEach(shader => { shaderCache.Add(shader.GUID, shader); }); string[] matGuids = AssetDatabase.FindAssets("t:Material"); if (projectMaterials == null) { projectMaterials = new List <SCMaterial>(); } else { projectMaterials.Clear(); } for (int k = 0; k < matGuids.Length; k++) { string matGUID = matGuids[k]; string matPath = AssetDatabase.GUIDToAssetPath(matGUID); Material mat = AssetDatabase.LoadAssetAtPath <Material>(matPath); if (mat.shader == null) { continue; } SCMaterial scMat = new SCMaterial(mat, matPath, matGUID); scMat.SetKeywords(mat.shaderKeywords); if (mat.shaderKeywords != null && mat.shaderKeywords.Length > 0) { projectMaterials.Add(scMat); } string path = AssetDatabase.GetAssetPath(mat.shader); string shaderGUID = path + "/" + mat.shader.name; SCShader shader; if (!shaderCache.TryGetValue(shaderGUID, out shader)) { if (mat.shaderKeywords == null || mat.shaderKeywords.Length == 0) { continue; } Shader shad = AssetDatabase.LoadAssetAtPath <Shader>(path); // add non-sourced shader shader = new SCShader(); shader.isReadOnly = IsFileWritable(path); shader.GUID = shaderGUID; if (shad != null) { shader.fullName = shad.name; shader.name = SCShader.GetSimpleName(shader.fullName); shader.path = path; ScanShader(shader); } else { shader.fullName = mat.shader.name; shader.name = SCShader.GetSimpleName(shader.fullName); } shaders.Add(shader); shaderCache.Add(shaderGUID, shader); totalShaderCount++; } shader.materials.Add(scMat); shader.AddKeywordsByName(mat.shaderKeywords); } // sort materials by name projectMaterials.Sort(CompareMaterialsName); // refresh variant and keywords count due to potential additional added keywords from materials (rogue keywords) and shader features count maxKeywordsCountFound = 0; shaders.ForEach((SCShader shader) => { if (shader.keywordEnabledCount > maxKeywordsCountFound) { maxKeywordsCountFound = shader.keywordEnabledCount; } shader.UpdateVariantCount(); }); switch (sortType) { case SortType.VariantsCount: shaders.Sort((SCShader x, SCShader y) => { return(y.actualBuildVariantCount.CompareTo(x.actualBuildVariantCount)); }); break; case SortType.EnabledKeywordsCount: shaders.Sort((SCShader x, SCShader y) => { return(y.keywordEnabledCount.CompareTo(x.keywordEnabledCount)); }); break; case SortType.ShaderFileName: shaders.Sort((SCShader x, SCShader y) => { return(x.name.CompareTo(y.name)); }); break; } UpdateProjectStats(); } catch (Exception ex) { Debug.LogError("Unexpected exception caught while scanning project: " + ex.Message); } }