123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- using System.Linq;
- using UnityEngine;
- using UnityEditor.Graphing;
- using UnityEditor.ShaderGraph.Drawing.Controls;
- using UnityEditor.ShaderGraph.Internal;
- namespace UnityEditor.ShaderGraph
- {
- [Title("Input", "Texture", "Sample Texture 2D Array")]
- class SampleTexture2DArrayNode : AbstractMaterialNode, IGeneratesBodyCode, IMayRequireMeshUV
- {
- public const int OutputSlotRGBAId = 0;
- public const int OutputSlotRId = 4;
- public const int OutputSlotGId = 5;
- public const int OutputSlotBId = 6;
- public const int OutputSlotAId = 7;
- public const int TextureInputId = 1;
- public const int UVInput = 2;
- public const int SamplerInput = 3;
- public const int IndexInputId = 8;
- const string kOutputSlotRGBAName = "RGBA";
- const string kOutputSlotRName = "R";
- const string kOutputSlotGName = "G";
- const string kOutputSlotBName = "B";
- const string kOutputSlotAName = "A";
- const string kTextureInputName = "Texture Array";
- const string kUVInputName = "UV";
- const string kSamplerInputName = "Sampler";
- const string kIndexInputName = "Index";
- public override bool hasPreview { get { return true; } }
- public SampleTexture2DArrayNode()
- {
- name = "Sample Texture 2D Array";
- UpdateNodeAfterDeserialization();
- }
- public sealed override void UpdateNodeAfterDeserialization()
- {
- AddSlot(new Vector4MaterialSlot(OutputSlotRGBAId, kOutputSlotRGBAName, kOutputSlotRGBAName, SlotType.Output, Vector4.zero, ShaderStageCapability.Fragment));
- AddSlot(new Vector1MaterialSlot(OutputSlotRId, kOutputSlotRName, kOutputSlotRName, SlotType.Output, 0, ShaderStageCapability.Fragment));
- AddSlot(new Vector1MaterialSlot(OutputSlotGId, kOutputSlotGName, kOutputSlotGName, SlotType.Output, 0, ShaderStageCapability.Fragment));
- AddSlot(new Vector1MaterialSlot(OutputSlotBId, kOutputSlotBName, kOutputSlotBName, SlotType.Output, 0, ShaderStageCapability.Fragment));
- AddSlot(new Vector1MaterialSlot(OutputSlotAId, kOutputSlotAName, kOutputSlotAName, SlotType.Output, 0, ShaderStageCapability.Fragment));
- AddSlot(new Texture2DArrayInputMaterialSlot(TextureInputId, kTextureInputName, kTextureInputName));
- AddSlot(new Vector1MaterialSlot(IndexInputId, kIndexInputName, kIndexInputName, SlotType.Input, 0));
- AddSlot(new UVMaterialSlot(UVInput, kUVInputName, kUVInputName, UVChannel.UV0));
- AddSlot(new SamplerStateMaterialSlot(SamplerInput, kSamplerInputName, kSamplerInputName, SlotType.Input));
- RemoveSlotsNameNotMatching(new[] { OutputSlotRGBAId, OutputSlotRId, OutputSlotGId, OutputSlotBId, OutputSlotAId, TextureInputId, IndexInputId, UVInput, SamplerInput });
- }
- // Node generations
- public virtual void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMode)
- {
- var uvName = GetSlotValue(UVInput, generationMode);
- var indexName = GetSlotValue(IndexInputId, generationMode);
- //Sampler input slot
- var samplerSlot = FindInputSlot<MaterialSlot>(SamplerInput);
- var edgesSampler = owner.GetEdges(samplerSlot.slotReference);
- var id = GetSlotValue(TextureInputId, generationMode);
- var result = string.Format("$precision4 {0} = SAMPLE_TEXTURE2D_ARRAY({1}, {2}, {3}, {4});"
- , GetVariableNameForSlot(OutputSlotRGBAId)
- , id
- , edgesSampler.Any() ? GetSlotValue(SamplerInput, generationMode) : "sampler" + id
- , uvName
- , indexName);
- sb.AppendLine(result);
- sb.AppendLine(string.Format("$precision {0} = {1}.r;", GetVariableNameForSlot(OutputSlotRId), GetVariableNameForSlot(OutputSlotRGBAId)));
- sb.AppendLine(string.Format("$precision {0} = {1}.g;", GetVariableNameForSlot(OutputSlotGId), GetVariableNameForSlot(OutputSlotRGBAId)));
- sb.AppendLine(string.Format("$precision {0} = {1}.b;", GetVariableNameForSlot(OutputSlotBId), GetVariableNameForSlot(OutputSlotRGBAId)));
- sb.AppendLine(string.Format("$precision {0} = {1}.a;", GetVariableNameForSlot(OutputSlotAId), GetVariableNameForSlot(OutputSlotRGBAId)));
- }
- public bool RequiresMeshUV(UVChannel channel, ShaderStageCapability stageCapability)
- {
- using (var tempSlots = PooledList<MaterialSlot>.Get())
- {
- GetInputSlots(tempSlots);
- var result = false;
- foreach (var slot in tempSlots)
- {
- if (slot.RequiresMeshUV(channel))
- {
- result = true;
- break;
- }
- }
- tempSlots.Clear();
- return result;
- }
- }
- }
- }
|