UnityGame/Library/PackageCache/com.unity.shadergraph/Editor/Drawing/Views/HlslFunctionView.cs

150 lines
5.9 KiB
C#
Raw Normal View History

2024-10-27 10:53:47 +03:00
using System;
using System.Linq;
using UnityEngine;
using UnityEngine.UIElements;
using UnityEditor.UIElements;
using UnityEditor.Graphing;
namespace UnityEditor.ShaderGraph.Drawing
{
[Serializable]
public enum HlslSourceType { File, String };
internal class HlslFunctionView : VisualElement
{
private EnumField m_Type;
private TextField m_FunctionName;
private ObjectField m_FunctionSource;
private TextField m_FunctionBody;
internal HlslFunctionView(CustomFunctionNode node)
{
styleSheets.Add(Resources.Load<StyleSheet>("Styles/HlslFunctionView"));
Draw(node);
}
private void Draw(CustomFunctionNode node)
{
var currentControls = this.Children().ToArray();
for (int i = 0; i < currentControls.Length; i++)
currentControls[i].RemoveFromHierarchy();
m_Type = new EnumField(node.sourceType);
m_Type.RegisterValueChangedCallback(s =>
{
if ((HlslSourceType)s.newValue != node.sourceType)
{
node.owner.owner.RegisterCompleteObjectUndo("Change Function Type");
node.sourceType = (HlslSourceType)s.newValue;
Draw(node);
node.owner.ClearErrorsForNode(node);
node.ValidateNode();
node.Dirty(ModificationScope.Graph);
}
});
m_FunctionName = new TextField { value = node.functionName, multiline = false };
m_FunctionName.RegisterCallback<FocusInEvent>(s =>
{
if (m_FunctionName.value == CustomFunctionNode.defaultFunctionName)
m_FunctionName.value = "";
});
m_FunctionName.RegisterCallback<FocusOutEvent>(s =>
{
if (m_FunctionName.value == "")
m_FunctionName.value = CustomFunctionNode.defaultFunctionName;
else
m_FunctionName.value = NodeUtils.ConvertToValidHLSLIdentifier(m_FunctionName.value);
if (m_FunctionName.value != node.functionName)
{
node.owner.owner.RegisterCompleteObjectUndo("Change Function Name");
node.functionName = m_FunctionName.value;
node.ValidateNode();
node.Dirty(ModificationScope.Graph);
}
});
string path = AssetDatabase.GUIDToAssetPath(node.functionSource);
m_FunctionSource = new ObjectField() { value = AssetDatabase.LoadAssetAtPath<ShaderInclude>(path), objectType = typeof(ShaderInclude) };
m_FunctionSource.RegisterValueChangedCallback(s =>
{
long localId;
string guidString = string.Empty;
if (s.newValue != null)
{
AssetDatabase.TryGetGUIDAndLocalFileIdentifier((ShaderInclude)s.newValue, out guidString, out localId);
}
if (guidString != node.functionSource)
{
node.owner.owner.RegisterCompleteObjectUndo("Change Function Source");
node.functionSource = guidString;
node.ValidateNode();
node.Dirty(ModificationScope.Graph);
}
});
m_FunctionBody = new TextField { value = node.functionBody, multiline = true };
m_FunctionBody.AddToClassList("sg-hlsl-function-view__body");
m_FunctionBody.verticalScrollerVisibility = ScrollerVisibility.Auto;
var functionBodyScrollView = m_FunctionBody.Q<ScrollView>();
functionBodyScrollView.mode = ScrollViewMode.VerticalAndHorizontal;
functionBodyScrollView.horizontalScrollerVisibility = ScrollerVisibility.Auto;
m_FunctionBody.RegisterCallback<FocusInEvent>(s =>
{
if (m_FunctionBody.value == CustomFunctionNode.defaultFunctionBody)
m_FunctionBody.value = "";
});
m_FunctionBody.RegisterCallback<FocusOutEvent>(s =>
{
if (m_FunctionBody.value == "")
m_FunctionBody.value = CustomFunctionNode.defaultFunctionBody;
if (m_FunctionBody.value != node.functionBody)
{
node.owner.owner.RegisterCompleteObjectUndo("Change Function Body");
node.functionBody = m_FunctionBody.value;
node.ValidateNode();
node.Dirty(ModificationScope.Graph);
}
});
VisualElement typeRow = new VisualElement() { name = "Row" };
{
typeRow.Add(new Label("Type"));
typeRow.Add(m_Type);
}
Add(typeRow);
VisualElement nameRow = new VisualElement() { name = "Row" };
{
nameRow.Add(new Label("Name"));
nameRow.Add(m_FunctionName);
}
Add(nameRow);
switch (node.sourceType)
{
case HlslSourceType.File:
VisualElement sourceRow = new VisualElement() { name = "Row" };
{
sourceRow.Add(new Label("Source"));
sourceRow.Add(m_FunctionSource);
}
Add(sourceRow);
break;
case HlslSourceType.String:
VisualElement bodyRow = new VisualElement() { name = "Row" };
{
bodyRow.Add(new Label("Body"));
bodyRow.style.height = 200;
bodyRow.Add(m_FunctionBody);
}
Add(bodyRow);
break;
}
}
}
}