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

67 行
2.0 KiB

using UnityEngine;
namespace UnityEditor.Graphs.Material
{
[Title("Art/Blend Node")]
class BlendNode : Function2Input, IGeneratesFunction
{
public override void Init()
{
name = "BlendNode";
base.Init();
}
public enum Operation {
Normal,
Additive,
}
[SerializeField]
private Operation m_Operation;
[SerializeField]
private float m_Blend = 0.5f;
private static readonly string[] kOpNames = new[]
{
"normal",
"add"
};
protected override string GetFunctionName() { return "unity_blend_"+ kOpNames[(int)m_Operation] +"_"+precision; }
protected override string GetFunctionCallBody (string input1Value, string input2Value)
{
return GetFunctionName() + "("+input1Value+", "+input2Value+", "+m_Blend+")";
}
protected void AddOperationBody (ShaderGenerator visitor, string name, string body, string precision)
{
var outputString = new ShaderGenerator ();
outputString.AddShaderChunk("inline "+precision+"4 unity_blend_"+name+"_"+precision+" ("+precision+"4 arg1, "+precision+"4 arg2, "+precision+" blend)", false);
outputString.AddShaderChunk("{", false); outputString.Indent();
outputString.AddShaderChunk(body, false);
outputString.Deindent(); outputString.AddShaderChunk("}", false);
visitor.AddShaderChunk (outputString.GetShaderString (0), true);
}
public override void NodeUI (Graphs.GraphGUI host)
{
base.NodeUI(host);
EditorGUI.BeginChangeCheck ();
m_Blend = GUILayout.HorizontalSlider(m_Blend, 0f, 1f, GUILayout.Width(64));
m_Operation = (Operation)EditorGUILayout.EnumPopup (m_Operation);
if (EditorGUI.EndChangeCheck ())
RegeneratePreviewShaders ();
}
public void GenerateNodeFunction(ShaderGenerator visitor, GenerationMode generationMode)
{
foreach (var precision in m_PrecisionNames)
{
AddOperationBody (visitor, kOpNames[(int)Operation.Normal], "return lerp(arg1, arg2, blend);", precision);
AddOperationBody (visitor, kOpNames[(int)Operation.Additive], "return (arg1 + arg2) * blend;", precision);
}
}
}
}