Brak opisu
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

SplitNode.cs 2.6KB

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