///
/// Shader Control - (C) Copyright 2016-2022 Ramiro Oliva (Kronnect)
///
///
using UnityEngine;
using UnityEditor;
using System;
using System.Collections.Generic;
namespace ShaderControl {
public partial class SCWindow : EditorWindow {
class BuildKeywordView {
public string keyword;
public List shaders;
public bool foldout, isInternal;
}
ShadersBuildInfo shadersBuildInfo;
int totalBuildKeywords, totalBuildIncludedKeywords, totalBuildShadersWithKeywords, totalBuildShaders, totalBuildIncludedShaders, totalBuildIncludedShadersWithKeywords;
int maxBuildKeywordsCountFound = 0;
bool nextQuickBuild;
Dictionary> uniqueBuildKeywords, uniqueIncludedBuildKeywords;
public static int issueRefresh;
List buildKeywordView;
void RefreshBuildStats(bool quick) {
issueRefresh = 1;
nextQuickBuild = GetEditorPrefBool("QUICK_BUILD", false);
shadersBuildInfo = ShaderDebugBuildProcessor.CheckShadersBuildStore(shadersBuildInfo);
totalBuildKeywords = totalBuildIncludedKeywords = totalBuildShadersWithKeywords = totalBuildShaders = totalBuildIncludedShaders = totalBuildIncludedShadersWithKeywords = 0;
shadersBuildInfo = Resources.Load("BuiltShaders");
if (shadersBuildInfo == null || shadersBuildInfo.shaders == null) return;
if (uniqueBuildKeywords == null) {
uniqueBuildKeywords = new Dictionary>();
} else {
uniqueBuildKeywords.Clear();
}
if (uniqueIncludedBuildKeywords == null) {
uniqueIncludedBuildKeywords = new Dictionary>();
} else {
uniqueIncludedBuildKeywords.Clear();
}
int count = shadersBuildInfo.shaders.Count;
totalBuildShaders = 0;
maxBuildKeywordsCountFound = 0;
for (int k = 0; k < count; k++) {
ShaderBuildInfo sb = shadersBuildInfo.shaders[k];
int kwCount = sb.keywords != null ? sb.keywords.Count : 0;
if (kwCount > 0) {
sb.SortKeywords();
}
totalBuildShaders++;
// Check shaders exist
if (!quick && Shader.Find(sb.name) == null) {
shadersBuildInfo.shaders.RemoveAt(k);
k--;
totalBuildShaders--;
count--;
continue;
}
if (sb.includeInBuild) {
totalBuildIncludedShaders++;
}
sb.isReadOnly = !string.IsNullOrEmpty(sb.path) && (sb.path.Contains("Packages/com.unity") || IsFileReadonly(sb.path));
if (kwCount > 0) {
if (kwCount > maxBuildKeywordsCountFound) {
maxBuildKeywordsCountFound = kwCount;
}
totalBuildShadersWithKeywords++;
if (sb.includeInBuild) {
totalBuildIncludedShadersWithKeywords++;
for (int j = 0; j < kwCount; j++) {
List shaderList;
if (!uniqueBuildKeywords.TryGetValue(sb.keywords[j].keyword, out shaderList)) {
totalBuildKeywords++;
shaderList = new List();
uniqueBuildKeywords[sb.keywords[j].keyword] = shaderList;
}
shaderList.Add(sb);
if (sb.keywords[j].includeInBuild) {
List includedList;
if (!uniqueIncludedBuildKeywords.TryGetValue(sb.keywords[j].keyword, out includedList)) {
totalBuildIncludedKeywords++;
includedList = new List();
uniqueIncludedBuildKeywords[sb.keywords[j].keyword] = includedList;
}
includedList.Add(sb);
}
}
}
}
}
if (buildKeywordView == null) {
buildKeywordView = new List();
} else {
buildKeywordView.Clear();
}
foreach (KeyValuePair> kvp in uniqueBuildKeywords) {
BuildKeywordView kv = new BuildKeywordView { keyword = kvp.Key, shaders = kvp.Value };
buildKeywordView.Add(kv);
}
buildKeywordView.Sort(delegate (BuildKeywordView x, BuildKeywordView y) {
return y.shaders.Count.CompareTo(x.shaders.Count);
});
// Annotate which keywords are used in project
int bkwCount = buildKeywordView.Count;
for (int k = 0; k < bkwCount; k++) {
BuildKeywordView bkv = buildKeywordView[k];
bool isInternal = true;
int shadersCount = bkv.shaders.Count;
for (int j = 0; j < shadersCount; j++) {
if (!bkv.shaders[j].isInternal) {
isInternal = false;
break;
}
}
bkv.isInternal = isInternal;
}
UpdateProjectStats();
}
void ClearBuildData() {
shadersBuildInfo = ShaderDebugBuildProcessor.CheckShadersBuildStore(shadersBuildInfo);
if (shadersBuildInfo != null) {
shadersBuildInfo.Clear();
}
}
void BuildUpdateShaderKeywordsState(SCShader shader) {
if (shader == null || shader.keywords == null) return;
if (shadersBuildInfo == null) return;
int shadersCount = shadersBuildInfo.shaders.Count;
for (int s = 0; s < shadersCount; s++) {
ShaderBuildInfo sb = shadersBuildInfo.shaders[s];
if (sb != null && sb.name.Equals(shader.fullName)) {
for (int k = 0; k < shader.keywords.Count; k++) {
SCKeyword keyword = shader.keywords[k];
sb.ToggleIncludeKeyword(keyword.name, keyword.enabled);
}
}
}
shadersBuildInfo.requiresBuild = true;
}
}
}