A game about forced loneliness, made by TACStudios
at master 4.5 kB view raw
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}