ConstantNode.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using System.Collections.Generic;
  2. using System.Globalization;
  3. using UnityEditor.ShaderGraph.Drawing.Controls;
  4. using UnityEngine;
  5. using UnityEditor.Graphing;
  6. namespace UnityEditor.ShaderGraph
  7. {
  8. enum ConstantType
  9. {
  10. PI,
  11. TAU,
  12. PHI,
  13. E,
  14. SQRT2
  15. };
  16. [Title("Input", "Basic", "Constant")]
  17. class ConstantNode : AbstractMaterialNode, IGeneratesBodyCode
  18. {
  19. static Dictionary<ConstantType, float> m_constantList = new Dictionary<ConstantType, float>
  20. {
  21. {ConstantType.PI, 3.1415926f },
  22. {ConstantType.TAU, 6.28318530f},
  23. {ConstantType.PHI, 1.618034f},
  24. {ConstantType.E, 2.718282f},
  25. {ConstantType.SQRT2, 1.414214f},
  26. };
  27. [SerializeField]
  28. private ConstantType m_constant = ConstantType.PI;
  29. private const int kOutputSlotId = 0;
  30. private const string kOutputSlotName = "Out";
  31. [EnumControl("")]
  32. public ConstantType constant
  33. {
  34. get { return m_constant; }
  35. set
  36. {
  37. if (m_constant == value)
  38. return;
  39. m_constant = value;
  40. Dirty(ModificationScope.Graph);
  41. }
  42. }
  43. public ConstantNode()
  44. {
  45. name = "Constant";
  46. UpdateNodeAfterDeserialization();
  47. }
  48. public sealed override void UpdateNodeAfterDeserialization()
  49. {
  50. AddSlot(new Vector1MaterialSlot(kOutputSlotId, kOutputSlotName, kOutputSlotName, SlotType.Output, 0));
  51. RemoveSlotsNameNotMatching(new[] { kOutputSlotId });
  52. }
  53. public void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMode)
  54. {
  55. sb.AppendLine(string.Format("$precision {0} = {1};"
  56. , GetVariableNameForNode()
  57. , m_constantList[constant].ToString(CultureInfo.InvariantCulture)));
  58. }
  59. public override string GetVariableNameForSlot(int slotId)
  60. {
  61. return GetVariableNameForNode();
  62. }
  63. }
  64. }