Boat Attack使用了Universal RP的许多新图形功能,可以用于探索 Universal RP 的使用方式和技巧。
您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

102 行
3.7 KiB

using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace UnityEditor.ShaderGraph
{
class KeywordCollector
{
public readonly List<ShaderKeyword> keywords;
public readonly List<List<KeyValuePair<ShaderKeyword, int>>> permutations;
public KeywordCollector()
{
keywords = new List<ShaderKeyword>();
permutations = new List<List<KeyValuePair<ShaderKeyword, int>>>();
}
public void AddShaderKeyword(ShaderKeyword chunk)
{
if (keywords.Any(x => x.referenceName == chunk.referenceName))
return;
keywords.Add(chunk);
}
public void GetKeywordsDeclaration(ShaderStringBuilder builder, GenerationMode mode)
{
if(keywords.Count == 0)
return;
// Declare keywords
foreach (var keyword in keywords)
{
// Hardcode active keywords in preview to reduce compiled variants
if(mode == GenerationMode.Preview)
{
string declaration = keyword.GetKeywordPreviewDeclarationString();
if(!string.IsNullOrEmpty(declaration))
{
builder.AppendLine(declaration);
}
}
else
{
string declaration = keyword.GetKeywordDeclarationString();
if(!string.IsNullOrEmpty(declaration))
{
builder.AppendLine(declaration);
}
}
}
// Declare another keyword per permutation for simpler if/defs in the graph code
builder.AppendNewLine();
KeywordUtil.GetKeywordPermutationDeclarations(builder, permutations);
builder.AppendNewLine();
}
public void CalculateKeywordPermutations()
{
permutations.Clear();
// Initialize current permutation
List<KeyValuePair<ShaderKeyword, int>> currentPermutation = new List<KeyValuePair<ShaderKeyword, int>>();
for(int i = 0; i < keywords.Count; i++)
{
currentPermutation.Add(new KeyValuePair<ShaderKeyword, int>(keywords[i], 0));
}
// Recursively permute keywords
PermuteKeywords(keywords, currentPermutation, 0);
}
void PermuteKeywords(List<ShaderKeyword> keywords, List<KeyValuePair<ShaderKeyword, int>> currentPermutation, int currentIndex)
{
if(currentIndex == keywords.Count)
return;
// Iterate each possible keyword at the current index
int entryCount = keywords[currentIndex].keywordType == KeywordType.Enum ? keywords[currentIndex].entries.Count : 2;
for(int i = 0; i < entryCount; i++)
{
// Set the index in the current permutation to the correct value
currentPermutation[currentIndex] = new KeyValuePair<ShaderKeyword, int>(keywords[currentIndex], i);
// If the current index is the last keyword we are finished with this permutation
if(currentIndex == keywords.Count - 1)
{
permutations.Add(currentPermutation);
}
// Otherwise we continue adding keywords to this permutation
else
{
PermuteKeywords(keywords, currentPermutation, currentIndex + 1);
}
// Duplicate current permutation
currentPermutation = currentPermutation.Select(item => item).ToList();
}
}
}
}