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