Ei kuvausta
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.

SubGraphOutputNode.cs 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Reflection;
  5. using UnityEditor.ShaderGraph.Drawing;
  6. using UnityEngine;
  7. using UnityEditor.Graphing;
  8. using UnityEditor.Rendering;
  9. using UnityEngine.Rendering.ShaderGraph;
  10. using UnityEngine.UIElements;
  11. namespace UnityEditor.ShaderGraph
  12. {
  13. class SubGraphOutputNode : AbstractMaterialNode
  14. {
  15. static string s_MissingOutputSlot = "A Sub Graph must have at least one output slot";
  16. static List<ConcreteSlotValueType> s_ValidSlotTypes = new List<ConcreteSlotValueType>()
  17. {
  18. ConcreteSlotValueType.Vector1,
  19. ConcreteSlotValueType.Vector2,
  20. ConcreteSlotValueType.Vector3,
  21. ConcreteSlotValueType.Vector4,
  22. ConcreteSlotValueType.Matrix2,
  23. ConcreteSlotValueType.Matrix3,
  24. ConcreteSlotValueType.Matrix4,
  25. ConcreteSlotValueType.Boolean
  26. };
  27. public bool IsFirstSlotValid = true;
  28. public SubGraphOutputNode()
  29. {
  30. name = "Output";
  31. }
  32. // Link to the Sub Graph overview page instead of the specific Node page, seems more useful
  33. public override string documentationURL => Documentation.GetPageLink("Sub-graph");
  34. void ValidateShaderStage()
  35. {
  36. List<MaterialSlot> slots = new List<MaterialSlot>();
  37. GetInputSlots(slots);
  38. // Reset all input slots back to All, otherwise they'll be incorrectly configured when traversing below
  39. foreach (MaterialSlot slot in slots)
  40. slot.stageCapability = ShaderStageCapability.All;
  41. foreach (var slot in slots)
  42. {
  43. slot.stageCapability = NodeUtils.GetEffectiveShaderStageCapability(slot, true);
  44. }
  45. }
  46. void ValidateSlotName()
  47. {
  48. List<MaterialSlot> slots = new List<MaterialSlot>();
  49. GetInputSlots(slots);
  50. foreach (var slot in slots)
  51. {
  52. var error = NodeUtils.ValidateSlotName(slot.RawDisplayName(), out string errorMessage);
  53. if (error)
  54. {
  55. owner.AddValidationError(objectId, errorMessage);
  56. break;
  57. }
  58. }
  59. }
  60. void ValidateSlotType()
  61. {
  62. List<MaterialSlot> slots = new List<MaterialSlot>();
  63. GetInputSlots(slots);
  64. if (!slots.Any())
  65. {
  66. owner.AddValidationError(objectId, s_MissingOutputSlot, ShaderCompilerMessageSeverity.Error);
  67. }
  68. else if (!s_ValidSlotTypes.Contains(slots.FirstOrDefault().concreteValueType))
  69. {
  70. IsFirstSlotValid = false;
  71. owner.AddValidationError(objectId, "Preview can only compile if the first output slot is a Vector, Matrix, or Boolean type. Please adjust slot types.", ShaderCompilerMessageSeverity.Error);
  72. }
  73. }
  74. public override void ValidateNode()
  75. {
  76. base.ValidateNode();
  77. IsFirstSlotValid = true;
  78. ValidateSlotType();
  79. if (IsFirstSlotValid)
  80. ValidateShaderStage();
  81. }
  82. protected override void OnSlotsChanged()
  83. {
  84. base.OnSlotsChanged();
  85. ValidateNode();
  86. }
  87. public int AddSlot(ConcreteSlotValueType concreteValueType)
  88. {
  89. var index = this.GetInputSlots<MaterialSlot>().Count() + 1;
  90. var name = NodeUtils.GetDuplicateSafeNameForSlot(this, index, "Out_" + concreteValueType.ToString());
  91. AddSlot(MaterialSlot.CreateMaterialSlot(concreteValueType.ToSlotValueType(), index, name,
  92. NodeUtils.GetHLSLSafeName(name), SlotType.Input, Vector4.zero));
  93. return index;
  94. }
  95. public override bool canDeleteNode => false;
  96. public override bool canCopyNode => false;
  97. }
  98. }