A game about forced loneliness, made by TACStudios
1using System;
2using System.Linq;
3using UnityEngine;
4using UnityEditor.Graphing;
5
6namespace UnityEditor.ShaderGraph
7{
8 [Title("Channel", "Split")]
9 class SplitNode : AbstractMaterialNode, IGeneratesBodyCode
10 {
11 const string kInputSlotName = "In";
12 const string kOutputSlotRName = "R";
13 const string kOutputSlotGName = "G";
14 const string kOutputSlotBName = "B";
15 const string kOutputSlotAName = "A";
16
17 public const int InputSlotId = 0;
18 public const int OutputSlotRId = 1;
19 public const int OutputSlotGId = 2;
20 public const int OutputSlotBId = 3;
21 public const int OutputSlotAId = 4;
22
23 public SplitNode()
24 {
25 name = "Split";
26 synonyms = new string[] { "separate" };
27 UpdateNodeAfterDeserialization();
28 }
29
30 public sealed override void UpdateNodeAfterDeserialization()
31 {
32 AddSlot(new DynamicVectorMaterialSlot(InputSlotId, kInputSlotName, kInputSlotName, SlotType.Input, Vector4.zero));
33 AddSlot(new Vector1MaterialSlot(OutputSlotRId, kOutputSlotRName, kOutputSlotRName, SlotType.Output, 0));
34 AddSlot(new Vector1MaterialSlot(OutputSlotGId, kOutputSlotGName, kOutputSlotGName, SlotType.Output, 0));
35 AddSlot(new Vector1MaterialSlot(OutputSlotBId, kOutputSlotBName, kOutputSlotBName, SlotType.Output, 0));
36 AddSlot(new Vector1MaterialSlot(OutputSlotAId, kOutputSlotAName, kOutputSlotAName, SlotType.Output, 0));
37 RemoveSlotsNameNotMatching(new int[] { InputSlotId, OutputSlotRId, OutputSlotGId, OutputSlotBId, OutputSlotAId });
38 }
39
40 static int[] s_OutputSlots = { OutputSlotRId, OutputSlotGId, OutputSlotBId, OutputSlotAId };
41
42 public void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMode)
43 {
44 var inputValue = GetSlotValue(InputSlotId, generationMode);
45
46 var inputSlot = FindInputSlot<MaterialSlot>(InputSlotId);
47 var numInputChannels = 0;
48 if (inputSlot != null)
49 {
50 numInputChannels = SlotValueHelper.GetChannelCount(inputSlot.concreteValueType);
51 if (numInputChannels > 4)
52 numInputChannels = 0;
53 }
54
55 for (var i = 0; i < 4; i++)
56 {
57 var outputFormat = numInputChannels == 1 ? inputValue : string.Format("{0}[{1}]", inputValue, i);
58 var outputValue = i >= numInputChannels ? "0" : outputFormat;
59 sb.AppendLine(string.Format("$precision {0} = {1};", GetVariableNameForSlot(s_OutputSlots[i]), outputValue));
60 }
61 }
62 }
63}