A game about forced loneliness, made by TACStudios
1using System.Linq;
2using UnityEngine;
3using UnityEditor.Graphing;
4using UnityEditor.ShaderGraph.Drawing.Controls;
5
6namespace UnityEditor.ShaderGraph
7{
8 [Title("Input", "Texture", "Sample Texture 3D")]
9 class SampleTexture3DNode : AbstractMaterialNode, IGeneratesBodyCode
10 {
11 public const int OutputSlotRGBAId = 0;
12 public const int OutputSlotRId = 5;
13 public const int OutputSlotGId = 6;
14 public const int OutputSlotBId = 7;
15 public const int OutputSlotAId = 8;
16 public const int TextureInputId = 1;
17 public const int UVInput = 2;
18 public const int SamplerInput = 3;
19 public const int LodInput = 4;
20
21 const string kTextureInputName = "Texture";
22 const string kUVInputName = "UV";
23 const string kSamplerInputName = "Sampler";
24
25 RGBANodeOutput m_RGBAPins = RGBANodeOutput.NewDefault();
26 Mip3DSamplingInputs m_Mip3DSamplingInputs = Mip3DSamplingInputs.NewDefault();
27
28 public override bool hasPreview { get { return true; } }
29
30 [SerializeField]
31 private Texture3DMipSamplingMode m_MipSamplingMode = Texture3DMipSamplingMode.Standard;
32 internal Texture3DMipSamplingMode mipSamplingMode
33 {
34 set { m_MipSamplingMode = value; UpdateMipSamplingModeInputs(); }
35 get { return m_MipSamplingMode; }
36 }
37
38 private void UpdateMipSamplingModeInputs()
39 {
40 var capabilities = ShaderStageCapability.Fragment;
41 if (m_MipSamplingMode == Texture3DMipSamplingMode.LOD)
42 capabilities |= ShaderStageCapability.Vertex;
43
44 m_RGBAPins.SetCapabilities(capabilities);
45
46 m_Mip3DSamplingInputs = MipSamplingModesUtils.CreateMip3DSamplingInputs(
47 this, m_MipSamplingMode, m_Mip3DSamplingInputs, LodInput);
48 }
49
50 public SampleTexture3DNode()
51 {
52 name = "Sample Texture 3D";
53 synonyms = new string[] { "volume", "tex3d" };
54 UpdateNodeAfterDeserialization();
55 }
56
57 public sealed override void UpdateNodeAfterDeserialization()
58 {
59 m_RGBAPins.CreateNodes(this, ShaderStageCapability.None, OutputSlotRGBAId, OutputSlotRId, OutputSlotGId, OutputSlotBId, OutputSlotAId);
60 AddSlot(new Texture3DInputMaterialSlot(TextureInputId, kTextureInputName, kTextureInputName));
61 AddSlot(new Vector3MaterialSlot(UVInput, kUVInputName, kUVInputName, SlotType.Input, Vector3.zero));
62 AddSlot(new SamplerStateMaterialSlot(SamplerInput, kSamplerInputName, kSamplerInputName, SlotType.Input));
63 UpdateMipSamplingModeInputs();
64 RemoveSlotsNameNotMatching(new[] { OutputSlotRGBAId, OutputSlotRId, OutputSlotGId, OutputSlotBId, OutputSlotAId, TextureInputId, UVInput, SamplerInput, LodInput });
65 }
66
67 // Node generations
68 public virtual void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMode)
69 {
70 var uvName = GetSlotValue(UVInput, generationMode);
71
72 //Sampler input slot
73 var samplerSlot = FindInputSlot<MaterialSlot>(SamplerInput);
74 var edgesSampler = owner.GetEdges(samplerSlot.slotReference);
75
76 var id = GetSlotValue(TextureInputId, generationMode);
77 var result = string.Format("$precision4 {0} = {1}({2}.tex, {3}.samplerstate, {4} {5});"
78 , GetVariableNameForSlot(OutputSlotRGBAId)
79 , MipSamplingModesUtils.Get3DTextureSamplingMacro(m_MipSamplingMode, usePlatformMacros: false)
80 , id
81 , edgesSampler.Any() ? GetSlotValue(SamplerInput, generationMode) : id
82 , uvName
83 , MipSamplingModesUtils.GetSamplerMipArgs(this, m_MipSamplingMode, m_Mip3DSamplingInputs, generationMode));
84
85 sb.AppendLine(result);
86
87 sb.AppendLine(string.Format("$precision {0} = {1}.r;", GetVariableNameForSlot(OutputSlotRId), GetVariableNameForSlot(OutputSlotRGBAId)));
88 sb.AppendLine(string.Format("$precision {0} = {1}.g;", GetVariableNameForSlot(OutputSlotGId), GetVariableNameForSlot(OutputSlotRGBAId)));
89 sb.AppendLine(string.Format("$precision {0} = {1}.b;", GetVariableNameForSlot(OutputSlotBId), GetVariableNameForSlot(OutputSlotRGBAId)));
90 sb.AppendLine(string.Format("$precision {0} = {1}.a;", GetVariableNameForSlot(OutputSlotAId), GetVariableNameForSlot(OutputSlotRGBAId)));
91 }
92 }
93}