UVNode.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. using UnityEditor.ShaderGraph.Drawing.Controls;
  2. using UnityEngine;
  3. using UnityEditor.Graphing;
  4. using UnityEditor.ShaderGraph.Internal;
  5. namespace UnityEditor.ShaderGraph
  6. {
  7. [Title("Input", "Geometry", "UV")]
  8. class UVNode : AbstractMaterialNode, IGeneratesBodyCode, IMayRequireMeshUV
  9. {
  10. public const int OutputSlotId = 0;
  11. private const string kOutputSlotName = "Out";
  12. [SerializeField]
  13. private UVChannel m_OutputChannel;
  14. [EnumControl("Channel")]
  15. public UVChannel uvChannel
  16. {
  17. get { return m_OutputChannel; }
  18. set
  19. {
  20. if (m_OutputChannel == value)
  21. return;
  22. m_OutputChannel = value;
  23. Dirty(ModificationScope.Graph);
  24. }
  25. }
  26. public override bool hasPreview { get { return true; } }
  27. public UVNode()
  28. {
  29. name = "UV";
  30. UpdateNodeAfterDeserialization();
  31. }
  32. public override void UpdateNodeAfterDeserialization()
  33. {
  34. AddSlot(new Vector4MaterialSlot(OutputSlotId, kOutputSlotName, kOutputSlotName, SlotType.Output, Vector2.zero));
  35. RemoveSlotsNameNotMatching(new[] { OutputSlotId });
  36. }
  37. public void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMode)
  38. {
  39. sb.AppendLine(string.Format("$precision4 {0} = IN.{1};", GetVariableNameForSlot(OutputSlotId), m_OutputChannel.GetUVName()));
  40. }
  41. public bool RequiresMeshUV(UVChannel channel, ShaderStageCapability stageCapability)
  42. {
  43. return channel == uvChannel;
  44. }
  45. }
  46. }