You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
2.7 KiB
59 lines
2.7 KiB
using System;
|
|
using System.Linq;
|
|
using UnityEditor.Graphing;
|
|
using UnityEditor.Rendering;
|
|
|
|
namespace UnityEditor.ShaderGraph
|
|
{
|
|
[Serializable]
|
|
[Title("Utility", "Logic", "Branch On Input Connection")]
|
|
class BranchOnInputConnectionNode : AbstractMaterialNode, IGeneratesBodyCode
|
|
{
|
|
public const int InputSlotId = 0;
|
|
public const int ConnectedSlotId = 1;
|
|
public const int NotConnectedSlotId = 2;
|
|
public const int OutSlotId = 3;
|
|
|
|
const string kInputSlotName = "Input";
|
|
const string kConnectedSlotName = "Connected";
|
|
const string kNotConnectedSlotName = "NotConnected";
|
|
const string kOutSlotName = "Out";
|
|
|
|
public BranchOnInputConnectionNode()
|
|
{
|
|
name = "Branch On Input Connection";
|
|
UpdateNodeAfterDeserialization();
|
|
}
|
|
|
|
public sealed override void UpdateNodeAfterDeserialization()
|
|
{
|
|
AddSlot(new PropertyConnectionStateMaterialSlot(InputSlotId, kInputSlotName, kInputSlotName, Graphing.SlotType.Input));
|
|
AddSlot(new DynamicVectorMaterialSlot(ConnectedSlotId, kConnectedSlotName, kConnectedSlotName, Graphing.SlotType.Input, UnityEngine.Vector4.one));
|
|
AddSlot(new DynamicVectorMaterialSlot(NotConnectedSlotId, kNotConnectedSlotName, kNotConnectedSlotName, Graphing.SlotType.Input, UnityEngine.Vector4.zero));
|
|
AddSlot(new DynamicVectorMaterialSlot(OutSlotId, kOutSlotName, kOutSlotName, Graphing.SlotType.Output, UnityEngine.Vector4.zero));
|
|
RemoveSlotsNameNotMatching(new[] { InputSlotId, ConnectedSlotId, NotConnectedSlotId, OutSlotId });
|
|
}
|
|
|
|
public override bool allowedInMainGraph => false;
|
|
public override bool hasPreview => true;
|
|
|
|
public void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMode)
|
|
{
|
|
// inspect one of the dynamic slots to figure out what type we are actually using
|
|
var dynSlot = this.FindInputSlot<DynamicVectorMaterialSlot>(ConnectedSlotId);
|
|
string dynamicDimension = NodeUtils.GetSlotDimension(dynSlot.concreteValueType);
|
|
var dynamicType = "$precision" + dynamicDimension;
|
|
|
|
// declare output variable
|
|
var input = GetSlotValue(InputSlotId, generationMode);
|
|
var connected = GetSlotValue(ConnectedSlotId, generationMode);
|
|
var notconnected = GetSlotValue(NotConnectedSlotId, generationMode);
|
|
var output = GetVariableNameForSlot(OutSlotId);
|
|
|
|
if (generationMode == GenerationMode.Preview)
|
|
sb.AppendLine($"{dynamicType} {output} = {notconnected};");
|
|
else
|
|
sb.AppendLine($"{dynamicType} {output} = {input} ? {connected} : {notconnected};");
|
|
}
|
|
}
|
|
}
|