void AddProperty(IShaderProperty property, bool create = false, int index = -1) { if (m_PropertyRows.ContainsKey(property.guid)) { return; } var field = new BlackboardField(m_ExposedIcon, property.displayName, property.propertyType.ToString()) { userData = property }; var row = new BlackboardRow(field, new BlackboardFieldPropertyView(m_Graph, property)); row.userData = property; if (index < 0) { index = m_PropertyRows.Count; } if (index == m_PropertyRows.Count) { m_Section.Add(row); } else { m_Section.Insert(index, row); } m_PropertyRows[property.guid] = row; if (create) { field.RenameGo(); row.expanded = true; m_Graph.owner.RegisterCompleteObjectUndo("Create Property"); m_Graph.AddShaderProperty(property); } }
void OnMouseHover(EventBase evt, IShaderProperty property) { var graphView = blackboard.GetFirstAncestorOfType <MaterialGraphView>(); if (evt.eventTypeId == MouseEnterEvent.TypeId()) { foreach (var node in graphView.nodes.ToList().OfType <MaterialNodeView>()) { if (node.node is PropertyNode propertyNode) { if (propertyNode.propertyGuid == property.guid) { m_SelectedNodes.Add(node); node.AddToClassList("hovered"); } } } } else if (evt.eventTypeId == MouseLeaveEvent.TypeId() && m_SelectedNodes.Any()) { foreach (var node in m_SelectedNodes) { node.RemoveFromClassList("hovered"); } m_SelectedNodes.Clear(); } }
public void AddShaderProperty(IShaderProperty chunk) { if (m_Properties.Any(x => x.referenceName == chunk.referenceName)) { return; } m_Properties.Add(chunk); }
void AddProperty(IShaderProperty property, bool create = false, int index = -1) { if (m_PropertyRows.ContainsKey(property.guid)) { return; } if (create) { property.displayName = m_Graph.SanitizePropertyName(property.displayName); } var icon = property.generatePropertyBlock ? exposedIcon : null; var field = new BlackboardField(icon, property.displayName, property.propertyType.ToString()) { userData = property }; var propertyView = new BlackboardFieldPropertyView(field, m_Graph, property); var row = new BlackboardRow(field, propertyView); var pill = row.Q <Pill>(); pill.RegisterCallback <MouseEnterEvent>(evt => OnMouseHover(evt, property)); pill.RegisterCallback <MouseLeaveEvent>(evt => OnMouseHover(evt, property)); pill.RegisterCallback <DragUpdatedEvent>(OnDragUpdatedEvent); row.userData = property; if (index < 0) { index = m_PropertyRows.Count; } if (index == m_PropertyRows.Count) { m_Section.Add(row); } else { m_Section.Insert(index, row); } m_PropertyRows[property.guid] = row; if (create) { row.expanded = true; m_Graph.owner.RegisterCompleteObjectUndo("Create Property"); m_Graph.AddShaderProperty(property); field.OpenTextEditor(); } }
public void AddShaderProperty(IShaderProperty property) { if (property == null) { return; } if (m_Properties.Contains(property)) { return; } m_Properties.Add(property); m_AddedProperties.Add(property); }
void OnDragPerformEvent(DragPerformEvent e) { var selection = DragAndDrop.GetGenericData("DragSelection") as List <ISelectable>; if (selection == null) { return; } IEnumerable <BlackboardField> fields = selection.OfType <BlackboardField>(); if (!fields.Any()) { return; } Vector2 localPos = (e.currentTarget as VisualElement).ChangeCoordinatesTo(contentViewContainer, e.localMousePosition); foreach (BlackboardField field in fields) { IShaderProperty property = field.userData as IShaderProperty; if (property == null) { continue; } var node = new PropertyNode(); var drawState = node.drawState; var position = drawState.position; position.x = localPos.x; position.y = localPos.y; drawState.position = position; node.drawState = drawState; graph.owner.RegisterCompleteObjectUndo("Added Property"); graph.AddNode(node); node.propertyGuid = property.guid; } }
public void AddShaderProperty(IShaderProperty property) { if (property == null) { return; } if (m_Properties.Contains(property)) { return; } property.displayName = property.displayName.Trim(); if (m_Properties.Any(p => p.displayName == property.displayName)) { var regex = new Regex(@"^" + Regex.Escape(property.displayName) + @" \((\d+)\)$"); var existingDuplicateNumbers = m_Properties.Select(p => regex.Match(p.displayName)).Where(m => m.Success).Select(m => int.Parse(m.Groups[1].Value)).Where(n => n > 0).ToList(); var duplicateNumber = 1; existingDuplicateNumbers.Sort(); if (existingDuplicateNumbers.Any() && existingDuplicateNumbers.First() == 1) { duplicateNumber = existingDuplicateNumbers.Last() + 1; for (var i = 1; i < existingDuplicateNumbers.Count; i++) { if (existingDuplicateNumbers[i - 1] != existingDuplicateNumbers[i] - 1) { duplicateNumber = existingDuplicateNumbers[i - 1] + 1; break; } } } property.displayName = string.Format("{0} ({1})", property.displayName, duplicateNumber); } m_Properties.Add(property); m_AddedProperties.Add(property); }
public void MoveShaderProperty(IShaderProperty property, int newIndex) { if (newIndex > m_Properties.Count || newIndex < 0) { throw new ArgumentException("New index is not within properties list."); } var currentIndex = m_Properties.IndexOf(property); if (currentIndex == -1) { throw new ArgumentException("Property is not in graph."); } if (newIndex == currentIndex) { return; } m_Properties.RemoveAt(currentIndex); if (newIndex > currentIndex) { newIndex--; } var isLast = newIndex == m_Properties.Count; if (isLast) { m_Properties.Add(property); } else { m_Properties.Insert(newIndex, property); } if (!m_MovedProperties.Contains(property)) { m_MovedProperties.Add(property); } }
public BlackboardFieldPropertyView(AbstractMaterialGraph graph, IShaderProperty property) { AddStyleSheetPath("Styles/ShaderGraphBlackboard"); m_Graph = graph; m_Property = property; m_ExposedToogle = new Toggle(() => { property.generatePropertyBlock = m_ExposedToogle.value; DirtyNodes(ModificationScope.Graph); }); m_ExposedToogle.value = property.generatePropertyBlock; AddRow("Exposed", m_ExposedToogle); m_ReferenceNameField = new TextField(512, false, false, ' '); m_ReferenceNameField.AddStyleSheetPath("Styles/PropertyNameReferenceField"); AddRow("Reference", m_ReferenceNameField); m_ReferenceNameField.value = property.referenceName; m_ReferenceNameField.isDelayed = true; m_ReferenceNameField.OnValueChanged(newName => { string newReferenceName = m_Graph.SanitizePropertyReferenceName(newName.newValue, property.guid); property.overrideReferenceName = newReferenceName; m_ReferenceNameField.value = property.referenceName; if (string.IsNullOrEmpty(property.overrideReferenceName)) { m_ReferenceNameField.RemoveFromClassList("modified"); } else { m_ReferenceNameField.AddToClassList("modified"); } DirtyNodes(ModificationScope.Graph); UpdateReferenceNameResetMenu(); }); if (!string.IsNullOrEmpty(property.overrideReferenceName)) { m_ReferenceNameField.AddToClassList("modified"); } if (property is Vector1ShaderProperty) { VisualElement floatRow = new VisualElement(); VisualElement intRow = new VisualElement(); VisualElement modeRow = new VisualElement(); VisualElement minRow = new VisualElement(); VisualElement maxRow = new VisualElement(); FloatField floatField = null; var floatProperty = (Vector1ShaderProperty)property; if (floatProperty.floatType == FloatType.Integer) { var field = new IntegerField { value = (int)floatProperty.value }; field.OnValueChanged(intEvt => { floatProperty.value = (float)intEvt.newValue; DirtyNodes(); }); intRow = AddRow("Default", field); } else { floatField = new FloatField { value = floatProperty.value }; floatField.OnValueChanged(evt => { floatProperty.value = (float)evt.newValue; DirtyNodes(); }); floatRow = AddRow("Default", floatField); } var floatModeField = new EnumField((Enum)floatProperty.floatType); floatModeField.value = floatProperty.floatType; floatModeField.OnValueChanged(evt => { if (floatProperty.floatType == (FloatType)evt.newValue) { return; } floatProperty = (Vector1ShaderProperty)property; floatProperty.floatType = (FloatType)evt.newValue; switch (floatProperty.floatType) { case FloatType.Slider: RemoveElements(new VisualElement[] { floatRow, intRow, modeRow, minRow, maxRow }); var field = new FloatField { value = Mathf.Max(Mathf.Min(floatProperty.value, floatProperty.rangeValues.y), floatProperty.rangeValues.x) }; floatProperty.value = (float)field.value; field.OnValueChanged(defaultEvt => { floatProperty.value = Mathf.Max(Mathf.Min((float)defaultEvt.newValue, floatProperty.rangeValues.y), floatProperty.rangeValues.x); field.value = floatProperty.value; DirtyNodes(); }); floatRow = AddRow("Default", field); field.value = Mathf.Max(Mathf.Min(floatProperty.value, floatProperty.rangeValues.y), floatProperty.rangeValues.x); modeRow = AddRow("Mode", floatModeField); var minField = new FloatField { value = floatProperty.rangeValues.x }; minField.OnValueChanged(minEvt => { floatProperty.rangeValues = new Vector2((float)minEvt.newValue, floatProperty.rangeValues.y); floatProperty.value = Mathf.Max(Mathf.Min(floatProperty.value, floatProperty.rangeValues.y), floatProperty.rangeValues.x); field.value = floatProperty.value; DirtyNodes(); }); minRow = AddRow("Min", minField); var maxField = new FloatField { value = floatProperty.rangeValues.y }; maxField.OnValueChanged(maxEvt => { floatProperty.rangeValues = new Vector2(floatProperty.rangeValues.x, (float)maxEvt.newValue); floatProperty.value = Mathf.Max(Mathf.Min(floatProperty.value, floatProperty.rangeValues.y), floatProperty.rangeValues.x); field.value = floatProperty.value; DirtyNodes(); }); maxRow = AddRow("Max", maxField); break; case FloatType.Integer: RemoveElements(new VisualElement[] { floatRow, intRow, modeRow, minRow, maxRow }); var intField = new IntegerField { value = (int)floatProperty.value }; intField.OnValueChanged(intEvt => { floatProperty.value = (float)intEvt.newValue; DirtyNodes(); }); intRow = AddRow("Default", intField); modeRow = AddRow("Mode", floatModeField); break; default: RemoveElements(new VisualElement[] { floatRow, intRow, modeRow, minRow, maxRow }); field = new FloatField { value = floatProperty.value }; field.OnValueChanged(defaultEvt => { floatProperty.value = (float)defaultEvt.newValue; DirtyNodes(); }); floatRow = AddRow("Default", field); modeRow = AddRow("Mode", floatModeField); break; } DirtyNodes(); }); modeRow = AddRow("Mode", floatModeField); if (floatProperty.floatType == FloatType.Slider) { var minField = new FloatField { value = floatProperty.rangeValues.x }; minField.OnValueChanged(minEvt => { floatProperty.rangeValues = new Vector2((float)minEvt.newValue, floatProperty.rangeValues.y); floatProperty.value = Mathf.Max(Mathf.Min(floatProperty.value, floatProperty.rangeValues.y), floatProperty.rangeValues.x); floatField.value = floatProperty.value; DirtyNodes(); }); minRow = AddRow("Min", minField); var maxField = new FloatField { value = floatProperty.rangeValues.y }; maxField.OnValueChanged(maxEvt => { floatProperty.rangeValues = new Vector2(floatProperty.rangeValues.x, (float)maxEvt.newValue); floatProperty.value = Mathf.Max(Mathf.Min(floatProperty.value, floatProperty.rangeValues.y), floatProperty.rangeValues.x); floatField.value = floatProperty.value; DirtyNodes(); }); maxRow = AddRow("Max", maxField); } } else if (property is Vector2ShaderProperty) { var vectorProperty = (Vector2ShaderProperty)property; var field = new Vector2Field { value = vectorProperty.value }; field.OnValueChanged(evt => { vectorProperty.value = evt.newValue; DirtyNodes(); }); AddRow("Default", field); } else if (property is Vector3ShaderProperty) { var vectorProperty = (Vector3ShaderProperty)property; var field = new Vector3Field { value = vectorProperty.value }; field.OnValueChanged(evt => { vectorProperty.value = evt.newValue; DirtyNodes(); }); AddRow("Default", field); } else if (property is Vector4ShaderProperty) { var vectorProperty = (Vector4ShaderProperty)property; var field = new Vector4Field { value = vectorProperty.value }; field.OnValueChanged(evt => { vectorProperty.value = evt.newValue; DirtyNodes(); }); AddRow("Default", field); } else if (property is ColorShaderProperty) { var colorProperty = (ColorShaderProperty)property; var colorField = new ColorField { value = property.defaultValue, showEyeDropper = false, hdr = colorProperty.colorMode == ColorMode.HDR }; colorField.OnValueChanged(evt => { colorProperty.value = evt.newValue; DirtyNodes(); }); AddRow("Default", colorField); var colorModeField = new EnumField((Enum)colorProperty.colorMode); colorModeField.OnValueChanged(evt => { if (colorProperty.colorMode == (ColorMode)evt.newValue) { return; } colorProperty.colorMode = (ColorMode)evt.newValue; colorField.hdr = colorProperty.colorMode == ColorMode.HDR; colorField.MarkDirtyRepaint(); DirtyNodes(); }); AddRow("Mode", colorModeField); } else if (property is TextureShaderProperty) { var textureProperty = (TextureShaderProperty)property; var field = new ObjectField { value = textureProperty.value.texture, objectType = typeof(Texture) }; field.OnValueChanged(evt => { textureProperty.value.texture = (Texture)evt.newValue; DirtyNodes(); }); AddRow("Default", field); } else if (property is Texture2DArrayShaderProperty) { var textureProperty = (Texture2DArrayShaderProperty)property; var field = new ObjectField { value = textureProperty.value.textureArray, objectType = typeof(Texture2DArray) }; field.OnValueChanged(evt => { textureProperty.value.textureArray = (Texture2DArray)evt.newValue; DirtyNodes(); }); AddRow("Default", field); } else if (property is Texture3DShaderProperty) { var textureProperty = (Texture3DShaderProperty)property; var field = new ObjectField { value = textureProperty.value.texture, objectType = typeof(Texture3D) }; field.OnValueChanged(evt => { textureProperty.value.texture = (Texture3D)evt.newValue; DirtyNodes(); }); AddRow("Default", field); } else if (property is CubemapShaderProperty) { var cubemapProperty = (CubemapShaderProperty)property; var field = new ObjectField { value = cubemapProperty.value.cubemap, objectType = typeof(Cubemap) }; field.OnValueChanged(evt => { cubemapProperty.value.cubemap = (Cubemap)evt.newValue; DirtyNodes(); }); AddRow("Default", field); } else if (property is BooleanShaderProperty) { var booleanProperty = (BooleanShaderProperty)property; Action onBooleanChanged = () => { booleanProperty.value = !booleanProperty.value; DirtyNodes(); }; var field = new Toggle(onBooleanChanged); field.SetValue(booleanProperty.value); AddRow("Default", field); } // AddRow("Type", new TextField()); // AddRow("Exposed", new Toggle(null)); // AddRow("Range", new Toggle(null)); // AddRow("Default", new TextField()); // AddRow("Tooltip", new TextField()); AddToClassList("sgblackboardFieldPropertyView"); UpdateReferenceNameResetMenu(); }
void AddProperty(IShaderProperty property) { m_Graph.owner.RegisterCompleteObjectUndo("Add Property"); m_Graph.AddShaderProperty(property); }
public BlackboardFieldPropertyView(AbstractMaterialGraph graph, IShaderProperty property) { m_Graph = graph; if (property is FloatShaderProperty) { var floatProperty = (FloatShaderProperty)property; var field = new FloatField { value = floatProperty.value }; field.OnValueChanged(evt => { floatProperty.value = (float)evt.newValue; DirtyNodes(); }); AddRow("Default", field); } else if (property is Vector2ShaderProperty) { var vectorProperty = (Vector2ShaderProperty)property; var field = new Vector2Field { value = vectorProperty.value }; field.OnValueChanged(evt => { vectorProperty.value = evt.newValue; DirtyNodes(); }); AddRow("Default", field); } else if (property is Vector3ShaderProperty) { var vectorProperty = (Vector3ShaderProperty)property; var field = new Vector3Field { value = vectorProperty.value }; field.OnValueChanged(evt => { vectorProperty.value = evt.newValue; DirtyNodes(); }); AddRow("Default", field); } else if (property is Vector4ShaderProperty) { var vectorProperty = (Vector4ShaderProperty)property; var field = new Vector4Field { value = vectorProperty.value }; field.OnValueChanged(evt => { vectorProperty.value = evt.newValue; DirtyNodes(); }); AddRow("Default", field); } else if (property is ColorShaderProperty) { var colorProperty = (ColorShaderProperty)property; var field = new ColorField { value = property.defaultValue, hdr = colorProperty.HDR }; field.OnValueChanged(evt => { colorProperty.value = evt.newValue; DirtyNodes(); }); AddRow("Default", field); } else if (property is TextureShaderProperty) { var textureProperty = (TextureShaderProperty)property; var field = new ObjectField { value = textureProperty.value.texture, objectType = typeof(Texture) }; field.OnValueChanged(evt => { textureProperty.value.texture = (Texture)evt.newValue; DirtyNodes(); }); AddRow("Default", field); } else if (property is CubemapShaderProperty) { var cubemapProperty = (CubemapShaderProperty)property; var field = new ObjectField { value = cubemapProperty.value.cubemap, objectType = typeof(Cubemap) }; field.OnValueChanged(evt => { cubemapProperty.value.cubemap = (Cubemap)evt.newValue; DirtyNodes(); }); AddRow("Default", field); } // AddRow("Type", new TextField()); // AddRow("Exposed", new Toggle(null)); // AddRow("Range", new Toggle(null)); // AddRow("Default", new TextField()); // AddRow("Tooltip", new TextField()); AddToClassList("sgblackboardFieldPropertyView"); }
public void RegisterShaderProperty(IShaderProperty property) { ShaderProperties.Add(property); }
internal static void InsertCopyPasteGraph(this MaterialGraphView graphView, CopyPasteGraph copyGraph) { if (copyGraph == null) { return; } // Make new properties from the copied graph foreach (IShaderProperty property in copyGraph.properties) { string propertyName = graphView.graph.SanitizePropertyName(property.displayName); IShaderProperty copiedProperty = property.Copy(); copiedProperty.displayName = propertyName; graphView.graph.AddShaderProperty(copiedProperty); // Update the property nodes that depends on the copied node var dependentPropertyNodes = copyGraph.GetNodes <PropertyNode>().Where(x => x.propertyGuid == property.guid); foreach (var node in dependentPropertyNodes) { node.owner = graphView.graph; node.propertyGuid = copiedProperty.guid; } } using (var remappedNodesDisposable = ListPool <INode> .GetDisposable()) { using (var remappedEdgesDisposable = ListPool <IEdge> .GetDisposable()) { var remappedNodes = remappedNodesDisposable.value; var remappedEdges = remappedEdgesDisposable.value; graphView.graph.PasteGraph(copyGraph, remappedNodes, remappedEdges); if (graphView.graph.guid != copyGraph.sourceGraphGuid) { // Compute the mean of the copied nodes. Vector2 centroid = Vector2.zero; var count = 1; foreach (var node in remappedNodes) { var position = node.drawState.position.position; centroid = centroid + (position - centroid) / count; ++count; } // Get the center of the current view var viewCenter = graphView.contentViewContainer.WorldToLocal(graphView.layout.center); foreach (var node in remappedNodes) { var drawState = node.drawState; var positionRect = drawState.position; var position = positionRect.position; position += viewCenter - centroid; positionRect.position = position; drawState.position = positionRect; node.drawState = drawState; } } // Add new elements to selection graphView.ClearSelection(); graphView.graphElements.ForEach(element => { var edge = element as Edge; if (edge != null && remappedEdges.Contains(edge.userData as IEdge)) { graphView.AddToSelection(edge); } var nodeView = element as MaterialNodeView; if (nodeView != null && remappedNodes.Contains(nodeView.node)) { graphView.AddToSelection(nodeView); } }); } } }
public int GetShaderPropertyIndex(IShaderProperty property) { return(m_Properties.IndexOf(property)); }
public BlackboardFieldPropertyView(BlackboardField blackboardField, AbstractMaterialGraph graph, IShaderProperty property) { styleSheets.Add(Resources.Load <StyleSheet>("Styles/ShaderGraphBlackboard")); m_BlackboardField = blackboardField; m_Graph = graph; m_Property = property; m_ExposedToogle = new Toggle(); m_ExposedToogle.OnToggleChanged(evt => { m_Graph.owner.RegisterCompleteObjectUndo("Change Exposed Toggle"); if (m_OnExposedToggle != null) { m_OnExposedToggle(); } property.generatePropertyBlock = evt.newValue; if (property.generatePropertyBlock) { m_BlackboardField.icon = BlackboardProvider.exposedIcon; } else { m_BlackboardField.icon = null; } DirtyNodes(ModificationScope.Graph); }); m_ExposedToogle.value = property.generatePropertyBlock; AddRow("Exposed", m_ExposedToogle); m_ReferenceNameField = new TextField(512, false, false, ' '); m_ReferenceNameField.styleSheets.Add(Resources.Load <StyleSheet>("Styles/PropertyNameReferenceField")); AddRow("Reference", m_ReferenceNameField); m_ReferenceNameField.value = property.referenceName; m_ReferenceNameField.isDelayed = true; m_ReferenceNameField.RegisterValueChangedCallback(newName => { m_Graph.owner.RegisterCompleteObjectUndo("Change reference name"); if (m_ReferenceNameField.value != m_Property.referenceName) { string newReferenceName = m_Graph.SanitizePropertyReferenceName(newName.newValue, property.guid); property.overrideReferenceName = newReferenceName; } m_ReferenceNameField.value = property.referenceName; if (string.IsNullOrEmpty(property.overrideReferenceName)) { m_ReferenceNameField.RemoveFromClassList("modified"); } else { m_ReferenceNameField.AddToClassList("modified"); } DirtyNodes(ModificationScope.Graph); UpdateReferenceNameResetMenu(); }); if (!string.IsNullOrEmpty(property.overrideReferenceName)) { m_ReferenceNameField.AddToClassList("modified"); } if (property is Vector1ShaderProperty) { var floatProperty = (Vector1ShaderProperty)property; BuildVector1PropertyView(floatProperty); } else if (property is Vector2ShaderProperty) { var vectorProperty = (Vector2ShaderProperty)property; var field = new Vector2Field { value = vectorProperty.value }; field.RegisterValueChangedCallback(evt => { m_Graph.owner.RegisterCompleteObjectUndo("Change property value"); vectorProperty.value = evt.newValue; DirtyNodes(); }); AddRow("Default", field); } else if (property is Vector3ShaderProperty) { var vectorProperty = (Vector3ShaderProperty)property; var field = new Vector3Field { value = vectorProperty.value }; field.RegisterValueChangedCallback(evt => { m_Graph.owner.RegisterCompleteObjectUndo("Change property value"); vectorProperty.value = evt.newValue; DirtyNodes(); }); AddRow("Default", field); } else if (property is Vector4ShaderProperty) { var vectorProperty = (Vector4ShaderProperty)property; var field = new Vector4Field { value = vectorProperty.value }; field.RegisterValueChangedCallback(evt => { m_Graph.owner.RegisterCompleteObjectUndo("Change property value"); vectorProperty.value = evt.newValue; DirtyNodes(); }); AddRow("Default", field); } else if (property is ColorShaderProperty) { var colorProperty = (ColorShaderProperty)property; var colorField = new ColorField { value = property.defaultValue, showEyeDropper = false, hdr = colorProperty.colorMode == ColorMode.HDR }; colorField.RegisterValueChangedCallback(evt => { m_Graph.owner.RegisterCompleteObjectUndo("Change property value"); colorProperty.value = evt.newValue; DirtyNodes(); }); AddRow("Default", colorField); var colorModeField = new EnumField((Enum)colorProperty.colorMode); colorModeField.RegisterValueChangedCallback(evt => { m_Graph.owner.RegisterCompleteObjectUndo("Change Color Mode"); if (colorProperty.colorMode == (ColorMode)evt.newValue) { return; } colorProperty.colorMode = (ColorMode)evt.newValue; colorField.hdr = colorProperty.colorMode == ColorMode.HDR; colorField.MarkDirtyRepaint(); DirtyNodes(); }); AddRow("Mode", colorModeField); } else if (property is TextureShaderProperty) { var textureProperty = (TextureShaderProperty)property; var field = new ObjectField { value = textureProperty.value.texture, objectType = typeof(Texture) }; field.RegisterValueChangedCallback(evt => { m_Graph.owner.RegisterCompleteObjectUndo("Change property value"); textureProperty.value.texture = (Texture)evt.newValue; DirtyNodes(); }); AddRow("Default", field); var defaultModeField = new EnumField((Enum)textureProperty.defaultType); defaultModeField.RegisterValueChangedCallback(evt => { m_Graph.owner.RegisterCompleteObjectUndo("Change Texture Mode"); if (textureProperty.defaultType == (TextureShaderProperty.DefaultType)evt.newValue) { return; } textureProperty.defaultType = (TextureShaderProperty.DefaultType)evt.newValue; DirtyNodes(ModificationScope.Graph); }); void ToggleDefaultModeFieldEnabled() { defaultModeField.SetEnabled(!defaultModeField.enabledSelf); } m_OnExposedToggle += ToggleDefaultModeFieldEnabled; AddRow("Mode", defaultModeField); } else if (property is Texture2DArrayShaderProperty) { var textureProperty = (Texture2DArrayShaderProperty)property; var field = new ObjectField { value = textureProperty.value.textureArray, objectType = typeof(Texture2DArray) }; field.RegisterValueChangedCallback(evt => { m_Graph.owner.RegisterCompleteObjectUndo("Change property value"); textureProperty.value.textureArray = (Texture2DArray)evt.newValue; DirtyNodes(); }); AddRow("Default", field); } else if (property is Texture3DShaderProperty) { var textureProperty = (Texture3DShaderProperty)property; var field = new ObjectField { value = textureProperty.value.texture, objectType = typeof(Texture3D) }; field.RegisterValueChangedCallback(evt => { m_Graph.owner.RegisterCompleteObjectUndo("Change property value"); textureProperty.value.texture = (Texture3D)evt.newValue; DirtyNodes(); }); AddRow("Default", field); } else if (property is CubemapShaderProperty) { var cubemapProperty = (CubemapShaderProperty)property; var field = new ObjectField { value = cubemapProperty.value.cubemap, objectType = typeof(Cubemap) }; field.RegisterValueChangedCallback(evt => { m_Graph.owner.RegisterCompleteObjectUndo("Change property value"); cubemapProperty.value.cubemap = (Cubemap)evt.newValue; DirtyNodes(); }); AddRow("Default", field); } else if (property is BooleanShaderProperty) { var booleanProperty = (BooleanShaderProperty)property; EventCallback <ChangeEvent <bool> > onBooleanChanged = evt => { m_Graph.owner.RegisterCompleteObjectUndo("Change property value"); booleanProperty.value = evt.newValue; DirtyNodes(); }; var field = new Toggle(); field.OnToggleChanged(onBooleanChanged); field.value = booleanProperty.value; AddRow("Default", field); } // AddRow("Type", new TextField()); // AddRow("Exposed", new Toggle(null)); // AddRow("Range", new Toggle(null)); // AddRow("Default", new TextField()); // AddRow("Tooltip", new TextField()); AddToClassList("sgblackboardFieldPropertyView"); UpdateReferenceNameResetMenu(); }
public BlackboardFieldPropertyView(AbstractMaterialGraph graph, IShaderProperty property) { m_Graph = graph; if (property is Vector1ShaderProperty) { VisualElement floatRow = new VisualElement(); VisualElement intRow = new VisualElement(); VisualElement modeRow = new VisualElement(); VisualElement minRow = new VisualElement(); VisualElement maxRow = new VisualElement(); FloatField floatField = null; var floatProperty = (Vector1ShaderProperty)property; if (floatProperty.floatType == FloatType.Integer) { var field = new IntegerField { value = (int)floatProperty.value }; field.OnValueChanged(intEvt => { floatProperty.value = (float)intEvt.newValue; DirtyNodes(); }); intRow = AddRow("Default", field); } else { floatField = new FloatField { value = floatProperty.value }; floatField.OnValueChanged(evt => { floatProperty.value = (float)evt.newValue; DirtyNodes(); }); floatRow = AddRow("Default", floatField); } var floatModeField = new EnumField((Enum)floatProperty.floatType); floatModeField.value = floatProperty.floatType; floatModeField.OnValueChanged(evt => { if (floatProperty.floatType == (FloatType)evt.newValue) { return; } floatProperty = (Vector1ShaderProperty)property; floatProperty.floatType = (FloatType)evt.newValue; switch (floatProperty.floatType) { case FloatType.Slider: RemoveElements(new VisualElement[] { floatRow, intRow, modeRow, minRow, maxRow }); var field = new FloatField { value = Mathf.Max(Mathf.Min(floatProperty.value, floatProperty.rangeValues.y), floatProperty.rangeValues.x) }; floatProperty.value = (float)field.value; field.OnValueChanged(defaultEvt => { floatProperty.value = Mathf.Max(Mathf.Min((float)defaultEvt.newValue, floatProperty.rangeValues.y), floatProperty.rangeValues.x); field.value = floatProperty.value; DirtyNodes(); }); floatRow = AddRow("Default", field); field.value = Mathf.Max(Mathf.Min(floatProperty.value, floatProperty.rangeValues.y), floatProperty.rangeValues.x); modeRow = AddRow("Mode", floatModeField); var minField = new FloatField { value = floatProperty.rangeValues.x }; minField.OnValueChanged(minEvt => { floatProperty.rangeValues = new Vector2((float)minEvt.newValue, floatProperty.rangeValues.y); floatProperty.value = Mathf.Max(Mathf.Min(floatProperty.value, floatProperty.rangeValues.y), floatProperty.rangeValues.x); field.value = floatProperty.value; DirtyNodes(); }); minRow = AddRow("Min", minField); var maxField = new FloatField { value = floatProperty.rangeValues.y }; maxField.OnValueChanged(maxEvt => { floatProperty.rangeValues = new Vector2(floatProperty.rangeValues.x, (float)maxEvt.newValue); floatProperty.value = Mathf.Max(Mathf.Min(floatProperty.value, floatProperty.rangeValues.y), floatProperty.rangeValues.x); field.value = floatProperty.value; DirtyNodes(); }); maxRow = AddRow("Max", maxField); break; case FloatType.Integer: RemoveElements(new VisualElement[] { floatRow, intRow, modeRow, minRow, maxRow }); var intField = new IntegerField { value = (int)floatProperty.value }; intField.OnValueChanged(intEvt => { floatProperty.value = (float)intEvt.newValue; DirtyNodes(); }); intRow = AddRow("Default", intField); modeRow = AddRow("Mode", floatModeField); break; default: RemoveElements(new VisualElement[] { floatRow, intRow, modeRow, minRow, maxRow }); field = new FloatField { value = floatProperty.value }; field.OnValueChanged(defaultEvt => { floatProperty.value = (float)defaultEvt.newValue; DirtyNodes(); }); floatRow = AddRow("Default", field); modeRow = AddRow("Mode", floatModeField); break; } DirtyNodes(); }); modeRow = AddRow("Mode", floatModeField); if (floatProperty.floatType == FloatType.Slider) { var minField = new FloatField { value = floatProperty.rangeValues.x }; minField.OnValueChanged(minEvt => { floatProperty.rangeValues = new Vector2((float)minEvt.newValue, floatProperty.rangeValues.y); floatProperty.value = Mathf.Max(Mathf.Min(floatProperty.value, floatProperty.rangeValues.y), floatProperty.rangeValues.x); floatField.value = floatProperty.value; DirtyNodes(); }); minRow = AddRow("Min", minField); var maxField = new FloatField { value = floatProperty.rangeValues.y }; maxField.OnValueChanged(maxEvt => { floatProperty.rangeValues = new Vector2(floatProperty.rangeValues.x, (float)maxEvt.newValue); floatProperty.value = Mathf.Max(Mathf.Min(floatProperty.value, floatProperty.rangeValues.y), floatProperty.rangeValues.x); floatField.value = floatProperty.value; DirtyNodes(); }); maxRow = AddRow("Max", maxField); } } else if (property is Vector2ShaderProperty) { var vectorProperty = (Vector2ShaderProperty)property; var field = new Vector2Field { value = vectorProperty.value }; field.OnValueChanged(evt => { vectorProperty.value = evt.newValue; DirtyNodes(); }); AddRow("Default", field); } else if (property is Vector3ShaderProperty) { var vectorProperty = (Vector3ShaderProperty)property; var field = new Vector3Field { value = vectorProperty.value }; field.OnValueChanged(evt => { vectorProperty.value = evt.newValue; DirtyNodes(); }); AddRow("Default", field); } else if (property is Vector4ShaderProperty) { var vectorProperty = (Vector4ShaderProperty)property; var field = new Vector4Field { value = vectorProperty.value }; field.OnValueChanged(evt => { vectorProperty.value = evt.newValue; DirtyNodes(); }); AddRow("Default", field); } else if (property is ColorShaderProperty) { var colorProperty = (ColorShaderProperty)property; var colorField = new ColorField { value = property.defaultValue, showEyeDropper = false, hdr = colorProperty.colorMode == ColorMode.HDR }; colorField.OnValueChanged(evt => { colorProperty.value = evt.newValue; DirtyNodes(); }); AddRow("Default", colorField); var colorModeField = new EnumField((Enum)colorProperty.colorMode); colorModeField.OnValueChanged(evt => { if (colorProperty.colorMode == (ColorMode)evt.newValue) { return; } colorProperty.colorMode = (ColorMode)evt.newValue; colorField.hdr = colorProperty.colorMode == ColorMode.HDR; colorField.DoRepaint(); DirtyNodes(); }); AddRow("Mode", colorModeField); } else if (property is TextureShaderProperty) { var textureProperty = (TextureShaderProperty)property; var field = new ObjectField { value = textureProperty.value.texture, objectType = typeof(Texture) }; field.OnValueChanged(evt => { textureProperty.value.texture = (Texture)evt.newValue; DirtyNodes(); }); AddRow("Default", field); } else if (property is CubemapShaderProperty) { var cubemapProperty = (CubemapShaderProperty)property; var field = new ObjectField { value = cubemapProperty.value.cubemap, objectType = typeof(Cubemap) }; field.OnValueChanged(evt => { cubemapProperty.value.cubemap = (Cubemap)evt.newValue; DirtyNodes(); }); AddRow("Default", field); } else if (property is BooleanShaderProperty) { var booleanProperty = (BooleanShaderProperty)property; Action onBooleanChanged = () => { booleanProperty.value = !booleanProperty.value; DirtyNodes(); }; var field = new Toggle(onBooleanChanged) { on = booleanProperty.value }; AddRow("Default", field); } // AddRow("Type", new TextField()); // AddRow("Exposed", new Toggle(null)); // AddRow("Range", new Toggle(null)); // AddRow("Default", new TextField()); // AddRow("Tooltip", new TextField()); AddToClassList("sgblackboardFieldPropertyView"); }
void CreateNode(object obj, Vector2 nodePosition) { var texture2D = obj as Texture2D; if (texture2D != null) { graph.owner.RegisterCompleteObjectUndo("Drag Texture"); bool isNormalMap = false; if (EditorUtility.IsPersistent(texture2D) && !string.IsNullOrEmpty(AssetDatabase.GetAssetPath(texture2D))) { var importer = AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(texture2D)) as TextureImporter; if (importer != null) { isNormalMap = importer.textureType == TextureImporterType.NormalMap; } } var node = new SampleTexture2DNode(); if (isNormalMap) { node.textureType = TextureType.Normal; } var drawState = node.drawState; drawState.position = new Rect(nodePosition, drawState.position.size); node.drawState = drawState; graph.AddNode(node); var inputslot = node.FindInputSlot <Texture2DInputMaterialSlot>(SampleTexture2DNode.TextureInputId); if (inputslot != null) { inputslot.texture = texture2D; } } var textureArray = obj as Texture2DArray; if (textureArray != null) { graph.owner.RegisterCompleteObjectUndo("Drag Texture Array"); var property = new Texture2DArrayShaderProperty { displayName = textureArray.name, value = { textureArray = textureArray } }; graph.AddShaderProperty(property); var node = new SampleTexture2DArrayNode(); var drawState = node.drawState; drawState.position = new Rect(nodePosition, drawState.position.size); node.drawState = drawState; graph.AddNode(node); var inputslot = node.FindSlot <Texture2DArrayInputMaterialSlot>(SampleTexture2DArrayNode.TextureInputId); if (inputslot != null) { inputslot.textureArray = textureArray; } } var texture3D = obj as Texture3D; if (texture3D != null) { graph.owner.RegisterCompleteObjectUndo("Drag Texture 3D"); var property = new Texture3DShaderProperty { displayName = texture3D.name, value = { texture = texture3D } }; graph.AddShaderProperty(property); var node = new SampleTexture3DNode(); var drawState = node.drawState; drawState.position = new Rect(nodePosition, drawState.position.size); node.drawState = drawState; graph.AddNode(node); var inputslot = node.FindSlot <Texture3DInputMaterialSlot>(SampleTexture3DNode.TextureInputId); if (inputslot != null) { inputslot.texture = texture3D; } } var cubemap = obj as Cubemap; if (cubemap != null) { graph.owner.RegisterCompleteObjectUndo("Drag Cubemap"); var property = new CubemapShaderProperty { displayName = cubemap.name, value = { cubemap = cubemap } }; graph.AddShaderProperty(property); var node = new SampleCubemapNode(); var drawState = node.drawState; drawState.position = new Rect(nodePosition, drawState.position.size); node.drawState = drawState; graph.AddNode(node); var inputslot = node.FindInputSlot <CubemapInputMaterialSlot>(SampleCubemapNode.CubemapInputId); if (inputslot != null) { inputslot.cubemap = cubemap; } } var subGraphAsset = obj as MaterialSubGraphAsset; if (subGraphAsset != null) { graph.owner.RegisterCompleteObjectUndo("Drag Sub-Graph"); var node = new SubGraphNode(); var drawState = node.drawState; drawState.position = new Rect(nodePosition, drawState.position.size); node.drawState = drawState; node.subGraphAsset = subGraphAsset; graph.AddNode(node); } var blackboardField = obj as BlackboardField; if (blackboardField != null) { IShaderProperty property = blackboardField.userData as IShaderProperty; if (property != null) { graph.owner.RegisterCompleteObjectUndo("Drag Property"); var node = new PropertyNode(); var drawState = node.drawState; drawState.position = new Rect(nodePosition, drawState.position.size); node.drawState = drawState; graph.AddNode(node); node.propertyGuid = property.guid; } } }
public void AddProperty(IShaderProperty property) { m_Properties.Add(property); }
public ShaderPropertyView(AbstractMaterialGraph graph, IShaderProperty property) { this.graph = graph; this.property = property; var displayNameField = new TextField { name = "displayName", value = property.displayName }; displayNameField.OnValueChanged(OnDisplayNameChanged); Add(displayNameField); m_ValueAction = null; if (property is FloatShaderProperty) { m_ValueAction = FloatField; } else if (property is Vector2ShaderProperty) { m_ValueAction = Vector2Field; } else if (property is Vector3ShaderProperty) { m_ValueAction = Vector3Field; } else if (property is Vector4ShaderProperty) { m_ValueAction = Vector4Field; } else if (property is IntegerShaderProperty) { m_ValueAction = IntegerField; } else if (property is SliderShaderProperty) { m_ValueAction = SliderField; } else if (property is BooleanShaderProperty) { m_ValueAction = BooleanField; } if (m_ValueAction != null) { Add(new IMGUIContainer(ValueField) { name = "value" }); } else if (property is ColorShaderProperty) { var fProp = (ColorShaderProperty)property; ColorField colorField; if (fProp.HDR) { colorField = new ColorField { name = "value", value = fProp.value, hdr = true } } ; else { colorField = new ColorField { name = "value", value = fProp.value } }; colorField.OnValueChanged(OnColorChanged); Add(colorField); } else if (property is TextureShaderProperty) { var fProp = (TextureShaderProperty)property; var objectField = new ObjectField { name = "value", objectType = typeof(Texture), value = fProp.value.texture }; objectField.OnValueChanged(OnTextureChanged); Add(objectField); } else if (property is CubemapShaderProperty) { var fProp = (CubemapShaderProperty)property; var objectField = new ObjectField { name = "value", objectType = typeof(Cubemap), value = fProp.value.cubemap }; objectField.OnValueChanged(OnCubemapChanged); Add(objectField); } Add(new Button(OnClickRemove) { name = "remove", text = "Remove" }); }
public void AddMetaProperty(IShaderProperty metaProperty) { m_MetaProperties.Add(metaProperty); }