public void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMode) { var outputSlot = FindOutputSlot <MaterialSlot>(OutputSlotId); bool isGeneratingSubgraph = owner.isSubGraph && (generationMode != GenerationMode.Preview); if (generationMode == GenerationMode.Preview || !isGeneratingSubgraph) { sb.AppendLine(string.Format($"{outputSlot.concreteValueType.ToShaderString()} {GetVariableNameForSlot(OutputSlotId)};")); var value = GetSlotValue(GetSlotIdForActiveSelection(), generationMode); sb.AppendLine(string.Format($"{GetVariableNameForSlot(OutputSlotId)} = {value};")); } else { // Iterate all entries in the dropdown for (int i = 0; i < dropdown.entries.Count; i++) { if (i == 0) { sb.AppendLine(string.Format($"{outputSlot.concreteValueType.ToShaderString()} {GetVariableNameForSlot(OutputSlotId)};")); sb.AppendLine($"if ({m_Dropdown.value.referenceName} == {i})"); } else { sb.AppendLine($"else if ({m_Dropdown.value.referenceName} == {i})"); } { sb.AppendLine("{"); sb.IncreaseIndent(); var value = GetSlotValue(GetSlotIdForPermutation(new KeyValuePair <ShaderDropdown, int>(dropdown, i)), generationMode); sb.AppendLine(string.Format($"{GetVariableNameForSlot(OutputSlotId)} = {value};")); sb.DecreaseIndent(); sb.AppendLine("}"); } if (i == dropdown.entries.Count - 1) { sb.AppendLine($"else"); sb.AppendLine("{"); sb.IncreaseIndent(); var value = GetSlotValue(GetSlotIdForPermutation(new KeyValuePair <ShaderDropdown, int>(dropdown, 0)), generationMode); sb.AppendLine(string.Format($"{GetVariableNameForSlot(OutputSlotId)} = {value};")); sb.DecreaseIndent(); sb.AppendLine("}"); } } } }
public static void GetKeywordPermutationDeclarations(ShaderStringBuilder sb, List <List <KeyValuePair <ShaderKeyword, int> > > permutations) { if (permutations.Count == 0) { return; } for (int p = 0; p < permutations.Count; p++) { // ShaderStringBuilder.Append doesnt apply indentation sb.AppendIndentation(); // Append correct if bool isLast = false; if (p == 0) { sb.Append("#if "); } else if (p == permutations.Count - 1) { sb.Append("#else"); isLast = true; } else { sb.Append("#elif "); } // Last permutation is always #else if (!isLast) { // Track whether && is required bool appendAnd = false; // Iterate all keywords that are part of the permutation for (int i = 0; i < permutations[p].Count; i++) { // When previous keyword was inserted subsequent requires && string and = appendAnd ? " && " : string.Empty; switch (permutations[p][i].Key.keywordType) { case KeywordType.Enum: { sb.Append($"{and}defined({permutations[p][i].Key.referenceName}_{permutations[p][i].Key.entries[permutations[p][i].Value].referenceName})"); appendAnd = true; break; } case KeywordType.Boolean: { // HLSL does not support a !value predicate if (permutations[p][i].Value != 0) { continue; } sb.Append($"{and}defined({permutations[p][i].Key.referenceName})"); appendAnd = true; break; } default: throw new ArgumentOutOfRangeException(); } } } sb.AppendNewLine(); // Define the matching permutation keyword sb.IncreaseIndent(); sb.AppendLine($"#define KEYWORD_PERMUTATION_{p}"); sb.DecreaseIndent(); } // End statement sb.AppendLine("#endif"); }