public void ConvertToValidHLSLIdentifier() { Assert.AreEqual(NodeUtils.ConvertToValidHLSLIdentifier(""), "_"); Assert.AreEqual(NodeUtils.ConvertToValidHLSLIdentifier(" "), "_"); Assert.AreEqual(NodeUtils.ConvertToValidHLSLIdentifier("_"), "_"); Assert.AreEqual(NodeUtils.ConvertToValidHLSLIdentifier("9"), "_9"); Assert.AreEqual(NodeUtils.ConvertToValidHLSLIdentifier("q"), "q"); Assert.AreEqual(NodeUtils.ConvertToValidHLSLIdentifier("b#"), "b"); Assert.AreEqual(NodeUtils.ConvertToValidHLSLIdentifier("{t"), "t"); Assert.AreEqual(NodeUtils.ConvertToValidHLSLIdentifier("&Y~"), "Y"); Assert.AreEqual(NodeUtils.ConvertToValidHLSLIdentifier("a_Az_Z0_9_"), "a_Az_Z0_9_"); Assert.AreEqual(NodeUtils.ConvertToValidHLSLIdentifier(" a_Az_Z0_9_"), "a_Az_Z0_9_"); Assert.AreEqual(NodeUtils.ConvertToValidHLSLIdentifier("a_Az_Z0_9_ "), "a_Az_Z0_9_"); Assert.AreEqual(NodeUtils.ConvertToValidHLSLIdentifier(" a_Az_Z0_9_ "), "a_Az_Z0_9_"); Assert.AreEqual(NodeUtils.ConvertToValidHLSLIdentifier(" a_Az_Z0_9_"), "a_Az_Z0_9_"); Assert.AreEqual(NodeUtils.ConvertToValidHLSLIdentifier("a_Az_Z0_9_ "), "a_Az_Z0_9_"); Assert.AreEqual(NodeUtils.ConvertToValidHLSLIdentifier(" a_Az_Z0_9_ "), "a_Az_Z0_9_"); Assert.AreEqual(NodeUtils.ConvertToValidHLSLIdentifier("_ _"), "___"); Assert.AreEqual(NodeUtils.ConvertToValidHLSLIdentifier(" "), "_"); Assert.AreEqual(NodeUtils.ConvertToValidHLSLIdentifier("*1 "), "_1"); Assert.AreEqual(NodeUtils.ConvertToValidHLSLIdentifier(" *-(1)"), "_1"); Assert.AreEqual(NodeUtils.ConvertToValidHLSLIdentifier("*z-1>"), "z_1"); Assert.AreEqual(NodeUtils.ConvertToValidHLSLIdentifier("*^#@$w)!(r+-"), "w_r"); Assert.AreEqual(NodeUtils.ConvertToValidHLSLIdentifier(" 1 var * q-30 ( 0 ) (1) "), "_1_var_q_30_0_1"); }
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.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 <TextAsset>(path), objectType = typeof(TextAsset) }; m_FunctionSource.RegisterValueChangedCallback(s => { long localId; string guidString = string.Empty; if (s.newValue != null) { AssetDatabase.TryGetGUIDAndLocalFileIdentifier((TextAsset)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.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; } }
internal static void AddCustomInterpolatorProperties(VisualElement parentElement, BlockNode node, Action setNodesAsDirtyCallback, Action updateNodeViewsCallback) { if (!node.isCustomBlock) { return; } TextField textField = null; { textField = new TextField { value = node.customName, multiline = false }; var propertyRow = new PropertyRow(new Label("Name")); propertyRow.Add(textField, (field) => { field.RegisterCallback <FocusOutEvent>(evt => { if (field.value.Equals(node.customName)) { return; } HashSet <string> usedNames = new HashSet <string>(); foreach (var other in node.contextData.blocks) { if (other != node) { usedNames.Add(other.value.descriptor.displayName); } } setNodesAsDirtyCallback?.Invoke(); node.owner.owner.RegisterCompleteObjectUndo("Change Block Name"); field.value = node.customName = GraphUtil.SanitizeName(usedNames, "{0}_{1}", NodeUtils.ConvertToValidHLSLIdentifier(field.value)); updateNodeViewsCallback?.Invoke(); node.Dirty(ModificationScope.Node); node.owner?.ValidateGraph(); }); }); parentElement.Add(propertyRow); } EnumField typeField = null; { typeField = new EnumField(node.customWidth); var propertyRow = new PropertyRow(new Label("Type")); propertyRow.Add(typeField, (field) => { field.RegisterValueChangedCallback(evt => { if (evt.newValue.Equals(node.customWidth)) { return; } setNodesAsDirtyCallback?.Invoke(); node.owner.owner.RegisterCompleteObjectUndo("Change Block Type"); node.customWidth = (BlockNode.CustomBlockType)evt.newValue; updateNodeViewsCallback?.Invoke(); node.Dirty(ModificationScope.Topological); node.owner?.ValidateGraph(); }); }); parentElement.Add(propertyRow); } }