A game about forced loneliness, made by TACStudios
at master 63 lines 2.7 kB view raw
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}