您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

101 行
4.2 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine.Graphing;
namespace UnityEngine.MaterialGraph
{
[Title("Channel/Combine")]
public class CombineNode : AbstractMaterialNode, IGeneratesBodyCode
{
protected const string kInputSlot0Name = "Input1";
protected const string kInputSlot1Name = "Input2";
protected const string kInputSlot2Name = "Input3";
protected const string kInputSlot3Name = "Input4";
protected const string kOutputSlotName = "Output";
public const int InputSlot0Id = 0;
public const int InputSlot1Id = 1;
public const int InputSlot2Id = 2;
public const int InputSlot3Id = 3;
public const int OutputSlotId = 4;
public CombineNode()
{
name = "Combine";
UpdateNodeAfterDeserialization();
}
public sealed override void UpdateNodeAfterDeserialization()
{
AddSlot(new MaterialSlot(InputSlot0Id, kInputSlot0Name, kInputSlot0Name, SlotType.Input, SlotValueType.Dynamic, Vector4.zero));
AddSlot(new MaterialSlot(InputSlot1Id, kInputSlot1Name, kInputSlot1Name, SlotType.Input, SlotValueType.Dynamic, Vector4.zero));
AddSlot(new MaterialSlot(InputSlot2Id, kInputSlot2Name, kInputSlot2Name, SlotType.Input, SlotValueType.Dynamic, Vector4.zero));
AddSlot(new MaterialSlot(InputSlot3Id, kInputSlot3Name, kInputSlot3Name, SlotType.Input, SlotValueType.Dynamic, Vector4.zero));
AddSlot(new MaterialSlot(OutputSlotId, kOutputSlotName, kOutputSlotName, SlotType.Output, SlotValueType.Vector4, Vector4.zero));
RemoveSlotsNameNotMatching(validSlots);
}
protected int[] validSlots
{
get { return new[] { InputSlot0Id, InputSlot1Id, InputSlot2Id, InputSlot3Id, OutputSlotId}; }
}
public void GenerateNodeCode(ShaderGenerator visitor, GenerationMode generationMode)
{
NodeUtils.SlotConfigurationExceptionIfBadConfiguration(this, new[] { InputSlot0Id, InputSlot1Id, InputSlot2Id, InputSlot3Id }, new[] { OutputSlotId });
visitor.AddShaderChunk(precision + "4 " + GetVariableNameForSlot(OutputSlotId) + " = " + GetNodeBody(generationMode) + ";", true);
}
private int GetChannelCountForInput(int inputSlotId)
{
var inputSlot = FindInputSlot<MaterialSlot>(inputSlotId);
if (inputSlot == null)
return 0;
int numInputChannels = (int)inputSlot.concreteValueType;
if (owner.GetEdges(inputSlot.slotReference).ToList().Count() == 0)
numInputChannels = 0;
return numInputChannels;
}
private void AddChannelsFromInputSlot(GenerationMode generationMode, int inputSlot, ref string outputString, ref int freeChannel)
{
string[] channelNames = { "r", "g", "b", "a" };
int numChannel = GetChannelCountForInput(inputSlot);
numChannel = Math.Min(freeChannel, numChannel);
if (numChannel <= 0)
return;
string channelInputName = GetSlotValue(inputSlot, generationMode);
outputString += channelInputName;
freeChannel -= numChannel;
if (freeChannel != 0)
outputString += ",";
}
protected string GetNodeBody(GenerationMode generationMode)
{
string outputString = precision + "4(";
int freeChannels = 4;
AddChannelsFromInputSlot(generationMode, InputSlot0Id, ref outputString, ref freeChannels);
AddChannelsFromInputSlot(generationMode, InputSlot1Id, ref outputString, ref freeChannels);
AddChannelsFromInputSlot(generationMode, InputSlot2Id, ref outputString, ref freeChannels);
AddChannelsFromInputSlot(generationMode, InputSlot3Id, ref outputString, ref freeChannels);
for (int i = freeChannels; i > 0; --i)
{
outputString += "0.0";
if (i > 1)
outputString += ", ";
}
outputString += ")";
return outputString;
}
}
}