ScreenPositionNode.cs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. using UnityEngine;
  2. using UnityEditor.Graphing;
  3. using UnityEditor.ShaderGraph.Drawing.Controls;
  4. namespace UnityEditor.ShaderGraph
  5. {
  6. [Title("Input", "Geometry", "Screen Position")]
  7. class ScreenPositionNode : AbstractMaterialNode, IGeneratesBodyCode, IMayRequireScreenPosition
  8. {
  9. public ScreenPositionNode()
  10. {
  11. name = "Screen Position";
  12. UpdateNodeAfterDeserialization();
  13. }
  14. [SerializeField]
  15. private ScreenSpaceType m_ScreenSpaceType = ScreenSpaceType.Default;
  16. [EnumControl("Mode")]
  17. public ScreenSpaceType screenSpaceType
  18. {
  19. get { return m_ScreenSpaceType; }
  20. set
  21. {
  22. if (m_ScreenSpaceType == value)
  23. return;
  24. m_ScreenSpaceType = value;
  25. Dirty(ModificationScope.Graph);
  26. }
  27. }
  28. private const int kOutputSlotId = 0;
  29. private const string kOutputSlotName = "Out";
  30. public override bool hasPreview { get { return true; } }
  31. public override PreviewMode previewMode
  32. {
  33. get { return PreviewMode.Preview2D; }
  34. }
  35. public sealed override void UpdateNodeAfterDeserialization()
  36. {
  37. AddSlot(new Vector4MaterialSlot(kOutputSlotId, kOutputSlotName, kOutputSlotName, SlotType.Output, Vector4.zero));
  38. RemoveSlotsNameNotMatching(new[] { kOutputSlotId });
  39. }
  40. public void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMode)
  41. {
  42. sb.AppendLine(string.Format("$precision4 {0} = {1};", GetVariableNameForSlot(kOutputSlotId), m_ScreenSpaceType.ToValueAsVariable()));
  43. }
  44. public bool RequiresScreenPosition(ShaderStageCapability stageCapability)
  45. {
  46. return true;
  47. }
  48. }
  49. }