// ----------------------------------------------------------------------------------------- public void Generate_Subscriber_Grid_Spacing_Field() { var v2 = new Vector2Property(); v2.PropertyName = _TranzmitGraphView.GridLayoutSpacing_Subscriber.PropertyName; v2.PropertyValue = _TranzmitGraphView.GridLayoutSpacing_Subscriber.PropertyValue; var visualElement = new VisualElement(); var blackboardField = new BlackboardField { text = v2.PropertyName, typeText = "" }; visualElement.Add(blackboardField); var field = new Vector2Field("Value:"); field.value = v2.PropertyValue; field.RegisterValueChangedCallback(ChangeEvent => { _TranzmitGraphView.GridLayoutSpacing_Subscriber.PropertyValue = field.value; if (_TranzmitGraphView.CurrentArrangementType == Tranzmit_Graph_View.ArrangementTypes.Grid) { _TranzmitGraphView.Arrange_Subscriber_Results(Tranzmit_Graph_View.ArrangementTypes.Grid); } }); var blackBoardValueRow = new BlackboardRow(blackboardField, field); visualElement.Add(blackBoardValueRow); _TranzmitGraphView.Blackboard.Add(visualElement); }
void BuildVector2PropertyField(Vector2ShaderProperty property) { var field = new Vector2Field { value = property.value }; field.Q("unity-x-input").Q("unity-text-input").RegisterCallback <KeyDownEvent>(keyDownCallback); field.Q("unity-x-input").Q("unity-text-input").RegisterCallback <FocusOutEvent>(focusOutCallback); field.Q("unity-y-input").Q("unity-text-input").RegisterCallback <KeyDownEvent>(keyDownCallback); field.Q("unity-y-input").Q("unity-text-input").RegisterCallback <FocusOutEvent>(focusOutCallback); // Called after KeyDownEvent field.RegisterValueChangedCallback(evt => { // Only true when setting value via FieldMouseDragger // Undo recorded once per dragger release if (undoGroup == -1) { graph.owner.RegisterCompleteObjectUndo("Change property value"); } property.value = evt.newValue; DirtyNodes(); }); AddRow("Default", field); }
public static VisualElement GetElementOfVector2Field(Vector2 startValue, string fieldName, Action <object> setValue, Action <object> getValue) { Vector2Field field = new Vector2Field(fieldName); field.SetValueWithoutNotify(startValue); field.RegisterValueChangedCallback(s => setValue.Invoke(s.newValue)); getValue += o => field.SetValueWithoutNotify((Vector2)o); return(field); }
public static void RenderVector2Property(VisualElement container, string name, object value, Action <object> setter) { var field = new Vector2Field(name); field.SetValueWithoutNotify((Vector2)value); field.MarkDirtyRepaint(); field.RegisterValueChangedCallback(evt => setter(evt.newValue)); container.Add(field); }
public VisualElement Build(InspectorDataProxy <float2> proxy) { m_VectorField = new Vector2Field(proxy.Name); m_VectorField.AddToClassList(proxy.Name); SetInputClass(m_VectorField.Q <FloatField>("unity-x-input"), "x"); SetInputClass(m_VectorField.Q <FloatField>("unity-y-input"), "y"); m_VectorField.RegisterValueChangedCallback(evt => ValueChanged(proxy, evt)); return(m_VectorField); }
public Vector2Field AddVector2Field(Vector2 value = new Vector2(), bool alternate = false, bool secondAlternate = false, bool thirdAlternate = false) { Vector2Field el = new Vector2Field(); el.value = value; el.AddToClassList("list-item-input"); el.AddToClassList("list-item-vector-input"); AddAlternates(el, alternate, secondAlternate, thirdAlternate); el.RegisterValueChangedCallback(e => { eventManager.Raise <ListItemInputChange>(new ListItemInputChange(el)); }); this.Add(el); return(el); }
void Init() { Vector2Field field = new Vector2Field() { value = config.value != null ? (Vector2)config.value : new Vector2(), }; field.EnableInClassList("compositeField", false); field.style.flexDirection = FlexDirection.Row; field.style.flexWrap = Wrap.NoWrap; field.RegisterValueChangedCallback((e) => { config.OnValueChanged(e.newValue); MarkDirtyRepaint(); }); Add(field); }
internal VisualElement CreateGUI( ValueChangedCallback valueChangedCallback, Vector2 fieldToDraw, string labelName, out VisualElement propertyVec2Field, int indentLevel = 0) { var vector2Field = new Vector2Field { value = fieldToDraw }; var inputFields = vector2Field.Query("unity-text-input").ToList(); foreach (var inputField in inputFields) { inputField.RegisterCallback <KeyDownEvent>(m_KeyDownCallback, TrickleDown.TrickleDown); inputField.RegisterCallback <FocusOutEvent>(m_FocusOutCallback, TrickleDown.TrickleDown); } // Bind value changed event to callback to handle dragger behavior before actually settings the value vector2Field.RegisterValueChangedCallback(evt => { // Only true when setting value via FieldMouseDragger // Undo recorded once per dragger release if (mUndoGroup == -1) { preValueChangeCallback?.Invoke(); } valueChangedCallback(evt.newValue); postValueChangeCallback?.Invoke(); }); propertyVec2Field = vector2Field; var defaultRow = new PropertyRow(PropertyDrawerUtils.CreateLabel(labelName, indentLevel)); defaultRow.Add(propertyVec2Field); defaultRow.styleSheets.Add(Resources.Load <StyleSheet>("Styles/PropertyRow")); return(defaultRow); }
public void RefreshPropertyValue(object val, int specificity) { if (val is StyleFloat) { var style = (StyleFloat)val; FloatField field = GetOrCreateField <FloatField, float>(); if (!IsFocused(field)) { field.SetValueWithoutNotify(style.value); } } else if (val is StyleInt) { var style = (StyleInt)val; IntegerField field = GetOrCreateField <IntegerField, int>(); if (!IsFocused(field)) { field.SetValueWithoutNotify(style.value); } } else if (val is StyleLength) { var style = (StyleLength)val; StyleLengthField field = GetOrCreateField <StyleLengthField, StyleLength>(); if (!IsFocused(field)) { field.SetValueWithoutNotify(style); } } else if (val is StyleColor) { var style = (StyleColor)val; ColorField field = GetOrCreateField <ColorField, Color>(); if (!IsFocused(field)) { field.SetValueWithoutNotify(style.value); } } else if (val is StyleFont) { var style = (StyleFont)val; ObjectField field = GetOrCreateObjectField <Font>(); if (!IsFocused(field)) { field.SetValueWithoutNotify(style.value); } } else if (val is StyleBackground) { var background = ((StyleBackground)val).value; ObjectField field; if (background.vectorImage != null) { field = GetOrCreateObjectField <VectorImage>(); } else { field = GetOrCreateObjectField <Texture2D>(); } if (!IsFocused(field)) { field.SetValueWithoutNotify(background.vectorImage != null ? (UnityEngine.Object)background.vectorImage : (UnityEngine.Object)background.texture); } } else if (val is StyleCursor) { // Recreate the cursor fields every time since StyleCursor // can be made of different fields (based on the value) Clear(); StyleCursor style = (StyleCursor)val; if (style.value.texture != null) { var uiTextureField = new ObjectField(m_PropertyName) { value = style.value.texture }; uiTextureField.RegisterValueChangedCallback(e => { StyleCursor styleCursor = (StyleCursor)StyleDebug.GetComputedStyleValue(m_SelectedElement.computedStyle, m_PropertyInfo.id); var currentCursor = styleCursor.value; currentCursor.texture = e.newValue as Texture2D; SetPropertyValue(new StyleCursor(currentCursor)); }); Add(uiTextureField); var uiHotspotField = new Vector2Field("hotspot") { value = style.value.hotspot }; uiHotspotField.RegisterValueChangedCallback(e => { StyleCursor styleCursor = (StyleCursor)StyleDebug.GetComputedStyleValue(m_SelectedElement.computedStyle, m_PropertyInfo.id); var currentCursor = styleCursor.value; currentCursor.hotspot = e.newValue; SetPropertyValue(new StyleCursor(currentCursor)); }); Add(uiHotspotField); } else { int mouseId = style.value.defaultCursorId; var uiField = new EnumField(m_PropertyName, (MouseCursor)mouseId); uiField.RegisterValueChangedCallback(e => { int cursorId = Convert.ToInt32(e.newValue); var cursor = new Cursor() { defaultCursorId = cursorId }; SetPropertyValue(new StyleCursor(cursor)); }); Add(uiField); } Add(m_SpecificityLabel); SetSpecificity(specificity); } else { // StyleEnum<T> var type = val.GetType(); var propInfo = type.GetProperty("value"); Enum enumValue = propInfo.GetValue(val, null) as Enum; EnumField field = GetOrCreateEnumField(enumValue); if (!IsFocused(field)) { field.SetValueWithoutNotify(enumValue); } } SetSpecificity(specificity); }
public VisualElement GetDefaultInspector() { VisualElement inspector = new VisualElement() { name = "inspector" }; VisualElement header = new VisualElement() { name = "inspector-header" }; header.Add(new Image() { image = CoreEditorUtils.LoadIcon(@"Packages/com.unity.render-pipelines.core/Editor/LookDev/Icons/", "Environment", forceLowRes: true) }); environmentName = new TextField(); environmentName.isDelayed = true; environmentName.RegisterValueChangedCallback(evt => { string path = AssetDatabase.GetAssetPath(environment); environment.name = evt.newValue; AssetDatabase.SetLabels(environment, new string[] { evt.newValue }); EditorUtility.SetDirty(environment); AssetDatabase.ImportAsset(path); environmentName.name = environment.name; }); header.Add(environmentName); inspector.Add(header); Foldout foldout = new Foldout() { text = "Environment Settings" }; skyCubemapField = new ObjectField("Sky with Sun") { tooltip = "A cubemap that will be used as the sky." }; skyCubemapField.allowSceneObjects = false; skyCubemapField.objectType = typeof(Cubemap); skyCubemapField.RegisterValueChangedCallback(evt => { var tmp = environment.sky.cubemap; RegisterChange(ref tmp, evt.newValue as Cubemap); environment.sky.cubemap = tmp; latlong.image = GetLatLongThumbnailTexture(environment, k_SkyThumbnailWidth); }); foldout.Add(skyCubemapField); shadowCubemapField = new ObjectField("Sky without Sun") { tooltip = "[Optional] A cubemap that will be used to compute self shadowing.\nIt should be the same sky without the sun.\nIf nothing is provided, the sky with sun will be used with lower intensity." }; shadowCubemapField.allowSceneObjects = false; shadowCubemapField.objectType = typeof(Cubemap); shadowCubemapField.RegisterValueChangedCallback(evt => { var tmp = environment.shadow.cubemap; RegisterChange(ref tmp, evt.newValue as Cubemap); environment.shadow.cubemap = tmp; latlong.image = GetLatLongThumbnailTexture(environment, k_SkyThumbnailWidth); }); foldout.Add(shadowCubemapField); skyRotationOffset = new FloatField("Rotation") { tooltip = "Rotation offset on the longitude of the sky." }; skyRotationOffset.RegisterValueChangedCallback(evt => RegisterChange(ref environment.sky.rotation, Environment.Shadow.ClampLongitude(evt.newValue), skyRotationOffset, updatePreview: true)); foldout.Add(skyRotationOffset); skyExposureField = new FloatField("Exposure") { tooltip = "The exposure to apply with this sky." }; skyExposureField.RegisterValueChangedCallback(evt => RegisterChange(ref environment.sky.exposure, evt.newValue)); foldout.Add(skyExposureField); var style = foldout.Q <Toggle>().style; style.marginLeft = 3; style.unityFontStyleAndWeight = FontStyle.Bold; inspector.Add(foldout); sunPosition = new Vector2Field("Sun Position") { tooltip = "The sun position as (Longitude, Latitude)\nThe button compute brightest position in the sky with sun." }; sunPosition.Q("unity-x-input").Q <FloatField>().formatString = "n1"; sunPosition.Q("unity-y-input").Q <FloatField>().formatString = "n1"; sunPosition.RegisterValueChangedCallback(evt => { var tmpContainer = new Vector2( environment.shadow.sunLongitude, environment.shadow.sunLatitude); var tmpNewValue = new Vector2( Environment.Shadow.ClampLongitude(evt.newValue.x), Environment.Shadow.ClampLatitude(evt.newValue.y)); RegisterChange(ref tmpContainer, tmpNewValue, sunPosition); environment.shadow.sunLongitude = tmpContainer.x; environment.shadow.sunLatitude = tmpContainer.y; }); foldout.Add(sunPosition); Button sunToBrightess = new Button(() => { ResetToBrightestSpot(environment); sunPosition.SetValueWithoutNotify(new Vector2( Environment.Shadow.ClampLongitude(environment.shadow.sunLongitude), Environment.Shadow.ClampLatitude(environment.shadow.sunLatitude))); }) { name = "sunToBrightestButton" }; sunToBrightess.Add(new Image() { image = CoreEditorUtils.LoadIcon(@"Packages/com.unity.render-pipelines.core/Editor/LookDev/Icons/", "SunPosition", forceLowRes: true) }); sunToBrightess.AddToClassList("sun-to-brightest-button"); var vector2Input = sunPosition.Q(className: "unity-vector2-field__input"); vector2Input.Remove(sunPosition.Q(className: "unity-composite-field__field-spacer")); vector2Input.Add(sunToBrightess); shadowColor = new ColorField("Shadow Tint") { tooltip = "The wanted shadow tint to be used when computing shadow." }; shadowColor.RegisterValueChangedCallback(evt => RegisterChange(ref environment.shadow.color, evt.newValue)); foldout.Add(shadowColor); style = foldout.Q <Toggle>().style; style.marginLeft = 3; style.unityFontStyleAndWeight = FontStyle.Bold; inspector.Add(foldout); return(inspector); }
public void RefreshPropertyValue(object val, int specificity) { if (val is float floatValue) { FloatField field = GetOrCreateField <FloatField, float>(); if (!IsFocused(field)) { field.SetValueWithoutNotify(floatValue); } } else if (val is int intValue) { IntegerField field = GetOrCreateField <IntegerField, int>(); if (!IsFocused(field)) { field.SetValueWithoutNotify(intValue); } } else if (val is Length lengthValue) { StyleLengthField field = GetOrCreateField <StyleLengthField, StyleLength>(); if (!IsFocused(field)) { field.SetValueWithoutNotify(new StyleLength(lengthValue)); } } else if (val is Color colorValue) { ColorField field = GetOrCreateField <ColorField, Color>(); if (!IsFocused(field)) { field.SetValueWithoutNotify(colorValue); } } // Note: val may be null in case of reference type like "Font" else if (m_PropertyInfo.type == typeof(StyleFont)) { ObjectField field; field = GetOrCreateObjectField <Font>(); if (!IsFocused(field)) { field.SetValueWithoutNotify(val as Font); } } else if (val is FontDefinition fontDefinition) { ObjectField field; if (fontDefinition.fontAsset != null) { if (childCount == 0) { field = GetObjectFieldOfTypeFontAsset(); SetField(field); } else { field = (ObjectField)ElementAt(0); } } else { field = GetOrCreateObjectField <Font>(); } if (!IsFocused(field)) { field.SetValueWithoutNotify(fontDefinition.fontAsset != null ? fontDefinition.fontAsset : fontDefinition.font); } } else if (val is Background bgValue) { ObjectField field; if (bgValue.vectorImage != null) { field = GetOrCreateObjectField <VectorImage>(); } else if (bgValue.sprite != null) { field = GetOrCreateObjectField <Sprite>(); } else if (bgValue.renderTexture != null) { field = GetOrCreateObjectField <RenderTexture>(); } else { field = GetOrCreateObjectField <Texture2D>(); } if (!IsFocused(field)) { field.SetValueWithoutNotify( bgValue.vectorImage != null ? (UnityEngine.Object)bgValue.vectorImage : (bgValue.sprite != null ? (UnityEngine.Object)bgValue.sprite : (bgValue.renderTexture != null ? (UnityEngine.Object)bgValue.renderTexture : (UnityEngine.Object)bgValue.texture))); } } else if (val is Cursor cursorValue) { // Recreate the cursor fields every time since StyleCursor // can be made of different fields (based on the value) Clear(); if (cursorValue.texture != null) { var uiTextureField = new ObjectField(m_PropertyName) { value = cursorValue.texture }; uiTextureField.RegisterValueChangedCallback(e => { var currentCursor = (Cursor)StyleDebug.GetComputedStyleActualValue(m_SelectedElement.computedStyle, m_PropertyInfo.id); currentCursor.texture = e.newValue as Texture2D; SetPropertyValue(new StyleCursor(currentCursor)); }); Add(uiTextureField); var uiHotspotField = new Vector2Field("hotspot") { value = cursorValue.hotspot }; uiHotspotField.RegisterValueChangedCallback(e => { var currentCursor = (Cursor)StyleDebug.GetComputedStyleActualValue(m_SelectedElement.computedStyle, m_PropertyInfo.id); currentCursor.hotspot = e.newValue; SetPropertyValue(new StyleCursor(currentCursor)); }); Add(uiHotspotField); } else { int mouseId = cursorValue.defaultCursorId; var uiField = new EnumField(m_PropertyName, (MouseCursor)mouseId); uiField.RegisterValueChangedCallback(e => { int cursorId = Convert.ToInt32(e.newValue); var cursor = new Cursor() { defaultCursorId = cursorId }; SetPropertyValue(new StyleCursor(cursor)); }); Add(uiField); } Add(m_SpecificityLabel); SetSpecificity(specificity); } else if (val is TextShadow textShadow) { ColorField colorFieldfield = GetOrCreateFields <ColorField, Color>(m_PropertyName, 0); if (!IsFocused(colorFieldfield)) { colorFieldfield.SetValueWithoutNotify(textShadow.color); } Vector2Field vector2Field = GetOrCreateFields <Vector2Field, Vector2>("offset", 1); if (!IsFocused(vector2Field)) { vector2Field.SetValueWithoutNotify(textShadow.offset); } FloatField floatField = GetOrCreateFields <FloatField, float>("blur", 2); if (!IsFocused(floatField)) { floatField.SetValueWithoutNotify(textShadow.blurRadius); } if (childCount == 3) { Add(m_SpecificityLabel); } } else { // Enum Debug.Assert(val is Enum, "Expected Enum value"); Enum enumValue = (Enum)val; EnumField field = GetOrCreateEnumField(enumValue); if (!IsFocused(field)) { field.SetValueWithoutNotify(enumValue); } } SetSpecificity(specificity); }
public BlackboardFieldPropertyView(BlackboardField blackboardField, GraphData graph, AbstractShaderProperty property) { styleSheets.Add(Resources.Load <StyleSheet>("Styles/ShaderGraphBlackboard")); m_BlackboardField = blackboardField; m_Graph = graph; m_Property = property; if (!m_Graph.isSubGraph) { if (property.isExposable) { 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); } if (property.isExposable) { 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"); } } } // Key Undo callbacks for input fields EventCallback <KeyDownEvent> keyDownCallback = new EventCallback <KeyDownEvent>(evt => { // Record Undo for input field edit if (m_UndoGroup == -1) { m_UndoGroup = Undo.GetCurrentGroup(); m_Graph.owner.RegisterCompleteObjectUndo("Change property value"); } // Handle scaping input field edit if (evt.keyCode == KeyCode.Escape && m_UndoGroup > -1) { Undo.RevertAllDownToGroup(m_UndoGroup); m_UndoGroup = -1; evt.StopPropagation(); } // Dont record Undo again until input field is unfocused m_UndoGroup++; this.MarkDirtyRepaint(); }); EventCallback <FocusOutEvent> focusOutCallback = new EventCallback <FocusOutEvent>(evt => { // Reset UndoGroup when done editing input field m_UndoGroup = -1; }); 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.Q("unity-x-input").Q("unity-text-input").RegisterCallback <KeyDownEvent>(keyDownCallback); field.Q("unity-x-input").Q("unity-text-input").RegisterCallback <FocusOutEvent>(focusOutCallback); field.Q("unity-y-input").Q("unity-text-input").RegisterCallback <KeyDownEvent>(keyDownCallback); field.Q("unity-y-input").Q("unity-text-input").RegisterCallback <FocusOutEvent>(focusOutCallback); // Called after KeyDownEvent field.RegisterValueChangedCallback(evt => { // Only true when setting value via FieldMouseDragger // Undo recorded once per dragger release if (m_UndoGroup == -1) { 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.Q("unity-x-input").Q("unity-text-input").RegisterCallback <KeyDownEvent>(keyDownCallback); field.Q("unity-x-input").Q("unity-text-input").RegisterCallback <FocusOutEvent>(focusOutCallback); field.Q("unity-y-input").Q("unity-text-input").RegisterCallback <KeyDownEvent>(keyDownCallback); field.Q("unity-y-input").Q("unity-text-input").RegisterCallback <FocusOutEvent>(focusOutCallback); field.Q("unity-z-input").Q("unity-text-input").RegisterCallback <KeyDownEvent>(keyDownCallback); field.Q("unity-z-input").Q("unity-text-input").RegisterCallback <FocusOutEvent>(focusOutCallback); // Called after KeyDownEvent field.RegisterValueChangedCallback(evt => { // Only true when setting value via FieldMouseDragger // Undo recorded once per dragger release if (m_UndoGroup == -1) { 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.Q("unity-x-input").Q("unity-text-input").RegisterCallback <KeyDownEvent>(keyDownCallback); field.Q("unity-x-input").Q("unity-text-input").RegisterCallback <FocusOutEvent>(focusOutCallback); field.Q("unity-y-input").Q("unity-text-input").RegisterCallback <KeyDownEvent>(keyDownCallback); field.Q("unity-y-input").Q("unity-text-input").RegisterCallback <FocusOutEvent>(focusOutCallback); field.Q("unity-z-input").Q("unity-text-input").RegisterCallback <KeyDownEvent>(keyDownCallback); field.Q("unity-z-input").Q("unity-text-input").RegisterCallback <FocusOutEvent>(focusOutCallback); field.Q("unity-w-input").Q("unity-text-input").RegisterCallback <KeyDownEvent>(keyDownCallback); field.Q("unity-w-input").Q("unity-text-input").RegisterCallback <FocusOutEvent>(focusOutCallback); // Called after KeyDownEvent field.RegisterValueChangedCallback(evt => { // Only true when setting value via FieldMouseDragger // Undo recorded once per dragger release if (m_UndoGroup == -1) { 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); if (!m_Graph.isSubGraph) { 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); if (!m_Graph.isSubGraph) { 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); } else if (property is Matrix2ShaderProperty) { var matrix2Property = (Matrix2ShaderProperty)property; var row0Field = new Vector2Field { value = matrix2Property.value.GetRow(0) }; row0Field.RegisterValueChangedCallback(evt => { m_Graph.owner.RegisterCompleteObjectUndo("Change Property Value"); Vector2 row1 = matrix2Property.value.GetRow(1); matrix2Property.value = new Matrix4x4() { m00 = evt.newValue.x, m01 = evt.newValue.y, m02 = 0, m03 = 0, m10 = row1.x, m11 = row1.y, m12 = 0, m13 = 0, m20 = 0, m21 = 0, m22 = 0, m23 = 0, m30 = 0, m31 = 0, m32 = 0, m33 = 0, }; DirtyNodes(); }); AddRow("Default", row0Field); var row1Field = new Vector2Field { value = matrix2Property.value.GetRow(1) }; row1Field.RegisterValueChangedCallback(evt => { m_Graph.owner.RegisterCompleteObjectUndo("Change Property Value"); Vector2 row0 = matrix2Property.value.GetRow(0); matrix2Property.value = new Matrix4x4() { m00 = row0.x, m01 = row0.y, m02 = 0, m03 = 0, m10 = evt.newValue.x, m11 = evt.newValue.y, m12 = 0, m13 = 0, m20 = 0, m21 = 0, m22 = 0, m23 = 0, m30 = 0, m31 = 0, m32 = 0, m33 = 0, }; DirtyNodes(); }); AddRow("", row1Field); } else if (property is Matrix3ShaderProperty) { var matrix3Property = (Matrix3ShaderProperty)property; var row0Field = new Vector3Field { value = matrix3Property.value.GetRow(0) }; row0Field.RegisterValueChangedCallback(evt => { m_Graph.owner.RegisterCompleteObjectUndo("Change Property Value"); Vector3 row1 = matrix3Property.value.GetRow(1); Vector3 row2 = matrix3Property.value.GetRow(2); matrix3Property.value = new Matrix4x4() { m00 = evt.newValue.x, m01 = evt.newValue.y, m02 = evt.newValue.z, m03 = 0, m10 = row1.x, m11 = row1.y, m12 = row1.z, m13 = 0, m20 = row2.x, m21 = row2.y, m22 = row2.z, m23 = 0, m30 = 0, m31 = 0, m32 = 0, m33 = 0, }; DirtyNodes(); }); AddRow("Default", row0Field); var row1Field = new Vector3Field { value = matrix3Property.value.GetRow(1) }; row1Field.RegisterValueChangedCallback(evt => { m_Graph.owner.RegisterCompleteObjectUndo("Change Property Value"); Vector3 row0 = matrix3Property.value.GetRow(0); Vector3 row2 = matrix3Property.value.GetRow(2); matrix3Property.value = new Matrix4x4() { m00 = row0.x, m01 = row0.y, m02 = row0.z, m03 = 0, m10 = evt.newValue.x, m11 = evt.newValue.y, m12 = evt.newValue.z, m13 = 0, m20 = row2.x, m21 = row2.y, m22 = row2.z, m23 = 0, m30 = 0, m31 = 0, m32 = 0, m33 = 0, }; DirtyNodes(); }); AddRow("", row1Field); var row2Field = new Vector3Field { value = matrix3Property.value.GetRow(2) }; row2Field.RegisterValueChangedCallback(evt => { m_Graph.owner.RegisterCompleteObjectUndo("Change Property Value"); Vector3 row0 = matrix3Property.value.GetRow(0); Vector3 row1 = matrix3Property.value.GetRow(1); matrix3Property.value = new Matrix4x4() { m00 = row0.x, m01 = row0.y, m02 = row0.z, m03 = 0, m10 = row1.x, m11 = row1.y, m12 = row1.z, m13 = 0, m20 = evt.newValue.x, m21 = evt.newValue.y, m22 = evt.newValue.z, m23 = 0, m30 = 0, m31 = 0, m32 = 0, m33 = 0, }; DirtyNodes(); }); AddRow("", row2Field); } else if (property is Matrix4ShaderProperty) { var matrix4Property = (Matrix4ShaderProperty)property; var row0Field = new Vector4Field { value = matrix4Property.value.GetRow(0) }; row0Field.RegisterValueChangedCallback(evt => { m_Graph.owner.RegisterCompleteObjectUndo("Change Property Value"); Vector4 row1 = matrix4Property.value.GetRow(1); Vector4 row2 = matrix4Property.value.GetRow(2); Vector4 row3 = matrix4Property.value.GetRow(3); matrix4Property.value = new Matrix4x4() { m00 = evt.newValue.x, m01 = evt.newValue.y, m02 = evt.newValue.z, m03 = evt.newValue.w, m10 = row1.x, m11 = row1.y, m12 = row1.z, m13 = row1.w, m20 = row2.x, m21 = row2.y, m22 = row2.z, m23 = row2.w, m30 = row3.x, m31 = row3.y, m32 = row3.z, m33 = row3.w, }; DirtyNodes(); }); AddRow("Default", row0Field); var row1Field = new Vector4Field { value = matrix4Property.value.GetRow(1) }; row1Field.RegisterValueChangedCallback(evt => { m_Graph.owner.RegisterCompleteObjectUndo("Change Property Value"); Vector4 row0 = matrix4Property.value.GetRow(0); Vector4 row2 = matrix4Property.value.GetRow(2); Vector4 row3 = matrix4Property.value.GetRow(3); matrix4Property.value = new Matrix4x4() { m00 = row0.x, m01 = row0.y, m02 = row0.z, m03 = row0.w, m10 = evt.newValue.x, m11 = evt.newValue.y, m12 = evt.newValue.z, m13 = evt.newValue.w, m20 = row2.x, m21 = row2.y, m22 = row2.z, m23 = row2.w, m30 = row3.x, m31 = row3.y, m32 = row3.z, m33 = row3.w, }; DirtyNodes(); }); AddRow("", row1Field); var row2Field = new Vector4Field { value = matrix4Property.value.GetRow(2) }; row2Field.RegisterValueChangedCallback(evt => { m_Graph.owner.RegisterCompleteObjectUndo("Change Property Value"); Vector4 row0 = matrix4Property.value.GetRow(0); Vector4 row1 = matrix4Property.value.GetRow(1); Vector4 row3 = matrix4Property.value.GetRow(3); matrix4Property.value = new Matrix4x4() { m00 = row0.x, m01 = row0.y, m02 = row0.z, m03 = row0.w, m10 = row1.x, m11 = row1.y, m12 = row1.z, m13 = row1.w, m20 = evt.newValue.x, m21 = evt.newValue.y, m22 = evt.newValue.z, m23 = evt.newValue.w, m30 = row3.x, m31 = row3.y, m32 = row3.z, m33 = row3.w, }; DirtyNodes(); }); AddRow("", row2Field); var row3Field = new Vector4Field { value = matrix4Property.value.GetRow(3) }; row3Field.RegisterValueChangedCallback(evt => { m_Graph.owner.RegisterCompleteObjectUndo("Change Property Value"); Vector4 row0 = matrix4Property.value.GetRow(0); Vector4 row1 = matrix4Property.value.GetRow(1); Vector4 row2 = matrix4Property.value.GetRow(2); matrix4Property.value = new Matrix4x4() { m00 = row0.x, m01 = row0.y, m02 = row0.z, m03 = row0.w, m10 = row1.x, m11 = row1.y, m12 = row1.z, m13 = row1.w, m20 = row2.x, m21 = row2.y, m22 = row2.z, m23 = row2.w, m30 = evt.newValue.x, m31 = evt.newValue.y, m32 = evt.newValue.z, m33 = evt.newValue.w, }; DirtyNodes(); }); AddRow("", row3Field); } else if (property is SamplerStateShaderProperty) { var samplerStateProperty = (SamplerStateShaderProperty)property; var filterField = new EnumField(samplerStateProperty.value.filter); filterField.RegisterValueChangedCallback(evt => { m_Graph.owner.RegisterCompleteObjectUndo("Change Property Value"); TextureSamplerState state = samplerStateProperty.value; state.filter = (TextureSamplerState.FilterMode)evt.newValue; samplerStateProperty.value = state; DirtyNodes(ModificationScope.Graph); }); AddRow("Filter", filterField); var wrapField = new EnumField(samplerStateProperty.value.wrap); wrapField.RegisterValueChangedCallback(evt => { m_Graph.owner.RegisterCompleteObjectUndo("Change Property Value"); TextureSamplerState state = samplerStateProperty.value; state.wrap = (TextureSamplerState.WrapMode)evt.newValue; samplerStateProperty.value = state; DirtyNodes(ModificationScope.Graph); }); AddRow("Wrap", wrapField); } else if (property is GradientShaderProperty) { var gradientProperty = (GradientShaderProperty)property; var field = new GradientField { value = gradientProperty.value }; field.RegisterValueChangedCallback(evt => { m_Graph.owner.RegisterCompleteObjectUndo("Change Property Value"); gradientProperty.value = evt.newValue; DirtyNodes(); }); AddRow("Default", field); } var precisionField = new EnumField((Enum)property.precision); precisionField.RegisterValueChangedCallback(evt => { m_Graph.owner.RegisterCompleteObjectUndo("Change Precision"); if (property.precision == (Precision)evt.newValue) { return; } property.precision = (Precision)evt.newValue; m_Graph.ValidateGraph(); precisionField.MarkDirtyRepaint(); DirtyNodes(); }); AddRow("Precision", precisionField); AddToClassList("sgblackboardFieldPropertyView"); UpdateReferenceNameResetMenu(); }
public void RefreshPropertyValue(object val, int specificity) { if (val is float floatValue) { FloatField field = GetOrCreateField <FloatField, float>(); if (!IsFocused(field)) { field.SetValueWithoutNotify(floatValue); } } else if (val is int intValue) { IntegerField field = GetOrCreateField <IntegerField, int>(); if (!IsFocused(field)) { field.SetValueWithoutNotify(intValue); } } else if (val is Length lengthValue) { StyleLengthField field = GetOrCreateField <StyleLengthField, StyleLength>(); if (!IsFocused(field)) { field.SetValueWithoutNotify(new StyleLength(lengthValue)); } } else if (val is Color colorValue) { ColorField field = GetOrCreateField <ColorField, Color>(); if (!IsFocused(field)) { field.SetValueWithoutNotify(colorValue); } } // Note: val may be null in case of reference type like "Font" else if (m_PropertyInfo.type == typeof(StyleFont)) { ObjectField field; field = GetOrCreateObjectField <Font>(); if (!IsFocused(field)) { field.SetValueWithoutNotify(val as Font); } } else if (val is FontDefinition fontDefinition) { ObjectField field; if (fontDefinition.fontAsset != null) { if (childCount == 0) { var o = new ObjectField(); o.objectType = typeof(FontAsset); field = o; SetField(field); } else { field = (ObjectField)ElementAt(0); } } else { field = GetOrCreateObjectField <Font>(); } if (!IsFocused(field)) { field.SetValueWithoutNotify(fontDefinition.fontAsset != null ? (UnityEngine.Object)fontDefinition.fontAsset : (UnityEngine.Object)fontDefinition.font); } } else if (val is Background bgValue) { ObjectField field; if (bgValue.vectorImage != null) { field = GetOrCreateObjectField <VectorImage>(); } else if (bgValue.sprite != null) { field = GetOrCreateObjectField <Sprite>(); } else if (bgValue.renderTexture != null) { field = GetOrCreateObjectField <RenderTexture>(); } else { field = GetOrCreateObjectField <Texture2D>(); } if (!IsFocused(field)) { field.SetValueWithoutNotify( bgValue.vectorImage != null ? (UnityEngine.Object)bgValue.vectorImage : (bgValue.sprite != null ? (UnityEngine.Object)bgValue.sprite : (bgValue.renderTexture != null ? (UnityEngine.Object)bgValue.renderTexture : (UnityEngine.Object)bgValue.texture))); } } else if (val is Cursor cursorValue) { // Recreate the cursor fields every time since StyleCursor // can be made of different fields (based on the value) Clear(); if (cursorValue.texture != null) { var uiTextureField = new ObjectField(m_PropertyName) { value = cursorValue.texture }; uiTextureField.RegisterValueChangedCallback(e => { var currentCursor = (Cursor)StyleDebug.GetComputedStyleValue(m_SelectedElement.computedStyle, m_PropertyInfo.id); currentCursor.texture = e.newValue as Texture2D; SetPropertyValue(new StyleCursor(currentCursor)); }); Add(uiTextureField); var uiHotspotField = new Vector2Field("hotspot") { value = cursorValue.hotspot }; uiHotspotField.RegisterValueChangedCallback(e => { var currentCursor = (Cursor)StyleDebug.GetComputedStyleValue(m_SelectedElement.computedStyle, m_PropertyInfo.id); currentCursor.hotspot = e.newValue; SetPropertyValue(new StyleCursor(currentCursor)); }); Add(uiHotspotField); } else { int mouseId = cursorValue.defaultCursorId; var uiField = new EnumField(m_PropertyName, (MouseCursor)mouseId); uiField.RegisterValueChangedCallback(e => { int cursorId = Convert.ToInt32(e.newValue); var cursor = new Cursor() { defaultCursorId = cursorId }; SetPropertyValue(new StyleCursor(cursor)); }); Add(uiField); } Add(m_SpecificityLabel); SetSpecificity(specificity); } else if (val is TextShadow textShadow) { ColorField colorFieldfield = GetOrCreateFields <ColorField, Color>(m_PropertyName, 0); if (!IsFocused(colorFieldfield)) { colorFieldfield.SetValueWithoutNotify(textShadow.color); } Vector2Field vector2Field = GetOrCreateFields <Vector2Field, Vector2>("offset", 1); if (!IsFocused(vector2Field)) { vector2Field.SetValueWithoutNotify(textShadow.offset); } FloatField floatField = GetOrCreateFields <FloatField, float>("blur", 2); if (!IsFocused(floatField)) { floatField.SetValueWithoutNotify(textShadow.blurRadius); } if (childCount == 3) { Add(m_SpecificityLabel); } } else if (val is Rotate rotate) { FloatField floatField = GetOrCreateFields <FloatField, float>(m_PropertyName, 0); if (!IsFocused(floatField)) { floatField.SetValueWithoutNotify(rotate.angle.value); } Add(m_SpecificityLabel); SetSpecificity(specificity); } else if (val is Scale scale) { Vector3Field vector3Field = GetOrCreateFields <Vector3Field, Vector3>(m_PropertyName, 0); if (!IsFocused(vector3Field)) { vector3Field.SetValueWithoutNotify(scale.value); } Add(m_SpecificityLabel); SetSpecificity(specificity); } else if (val is Translate translate) { StyleLengthField fieldx = GetOrCreateFields <StyleLengthField, StyleLength>(m_PropertyName, 0); if (!IsFocused(fieldx)) { fieldx.SetValueWithoutNotify(translate.x); } StyleLengthField fieldy = GetOrCreateFields <StyleLengthField, StyleLength>("y", 1); if (!IsFocused(fieldy)) { fieldy.SetValueWithoutNotify(translate.x); } FloatField floatField = GetOrCreateFields <FloatField, float>("z", 2); if (!IsFocused(floatField)) { floatField.SetValueWithoutNotify(translate.z); } Add(m_SpecificityLabel); SetSpecificity(specificity); SetEnabled(false); } else if (val is TransformOrigin transformOrigin) { StyleLengthField fieldx = GetOrCreateFields <StyleLengthField, StyleLength>(m_PropertyName, 0); if (!IsFocused(fieldx)) { fieldx.SetValueWithoutNotify(transformOrigin.x); } StyleLengthField fieldy = GetOrCreateFields <StyleLengthField, StyleLength>("y", 1); if (!IsFocused(fieldy)) { fieldy.SetValueWithoutNotify(transformOrigin.x); } FloatField floatField = GetOrCreateFields <FloatField, float>("z", 2); if (!IsFocused(floatField)) { floatField.SetValueWithoutNotify(transformOrigin.z); } Add(m_SpecificityLabel); SetSpecificity(specificity); SetEnabled(false); } else if (val is Enum) { Enum enumValue = (Enum)val; EnumField field = GetOrCreateEnumField(enumValue); if (!IsFocused(field)) { field.SetValueWithoutNotify(enumValue); } } else { var type = val.GetType(); Debug.Assert(type.IsArrayOrList(), "Expected List type"); var listValue = val as System.Collections.IList; var valueString = listValue[0].ToString(); for (int i = 1; i < listValue.Count; i++) { valueString += $", {listValue[i]}"; } TextField field = GetOrCreateField <TextField, string>(); if (!IsFocused(field)) { field.SetValueWithoutNotify(valueString); } } SetSpecificity(specificity); }
void BuildMatrix2PropertyField(Matrix2ShaderProperty property) { var row0Field = new Vector2Field { value = property.value.GetRow(0) }; row0Field.RegisterValueChangedCallback(evt => { graph.owner.RegisterCompleteObjectUndo("Change Property Value"); Vector2 row1 = property.value.GetRow(1); property.value = new Matrix4x4() { m00 = evt.newValue.x, m01 = evt.newValue.y, m02 = 0, m03 = 0, m10 = row1.x, m11 = row1.y, m12 = 0, m13 = 0, m20 = 0, m21 = 0, m22 = 0, m23 = 0, m30 = 0, m31 = 0, m32 = 0, m33 = 0, }; DirtyNodes(); }); AddRow("Default", row0Field); var row1Field = new Vector2Field { value = property.value.GetRow(1) }; row1Field.RegisterValueChangedCallback(evt => { graph.owner.RegisterCompleteObjectUndo("Change Property Value"); Vector2 row0 = property.value.GetRow(0); property.value = new Matrix4x4() { m00 = row0.x, m01 = row0.y, m02 = 0, m03 = 0, m10 = evt.newValue.x, m11 = evt.newValue.y, m12 = 0, m13 = 0, m20 = 0, m21 = 0, m22 = 0, m23 = 0, m30 = 0, m31 = 0, m32 = 0, m33 = 0, }; DirtyNodes(); }); AddRow("", row1Field); }
public BlackboardFieldPropertyView(BlackboardField blackboardField, GraphData graph, AbstractShaderProperty 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(); }
protected VisualElement CreateParameterControl(SingularSerializableParameter parameter, string controlName, Action <SingularSerializableParameter> clampAction = null) { VisualElement control; switch (parameter.Type) { case ParameterType.behaviorAction: control = new VisualElement(); var buttons = new VisualElement { style = { flexDirection = FlexDirection.Row, paddingRight = 2f, paddingLeft = 2f } }; var actionLabel = new Label { style = { paddingLeft = 8f, paddingRight = 8f } }; var configureButton = new Button { text = "Configure" }; configureButton.clickable.clickedWithEventInfo += clickEvent => { var worldPosition = clickEvent.originalMousePosition + GraphView.editorWindow.position.position; GraphView.actionSearcher.TargetParameter = parameter; SearchWindow.Open(new SearchWindowContext(worldPosition), GraphView.actionSearcher); }; var removeButton = new Button(() => parameter.BehaviorActionValue = null) { text = "Remove" }; buttons.Add(configureButton); buttons.Add(removeButton); control.Add(actionLabel); control.Add(buttons); parameter.OnValueChangedMethods += OnBehaviorActionChanged; OnBehaviorActionChanged(); //Trigger a refresh void OnBehaviorActionChanged() { parameter.LoadBehaviorAction(GraphView.editorWindow.ImportData); //Refresh action name actionLabel.text = parameter.BehaviorActionValue == null ? "Missing Action" : parameter.BehaviorActionValue.ToString(); //Behavior action parameter controls const string ParameterGroupName = "Behavior Action Parameters Group"; VisualElement group = control.Q <VisualElement>(ParameterGroupName); if (group != null) { control.Remove(group); //If had old group remove/destroy it } var parameters = parameter.BehaviorActionValue?.method.Parameters; if (parameters == null || parameters.Count == 0) { return; //If no parameter for this action } group = new VisualElement { name = ParameterGroupName }; //Create group var accessor = ((SerializableParameter)parameter).BehaviorActionParameters; for (int i = 0; i < parameters.Count; i++) { BehaviorActionParameterInfo parameterInfo = parameters[i]; group.Add(CreateParameterControl(accessor[i], parameterInfo.name)); } control.Add(group); } break; case ParameterType.boolean: var toggle = new Toggle(controlName) { value = parameter.BooleanValue }; toggle.RegisterValueChangedCallback( changeEvent => { parameter.BooleanValue = changeEvent.newValue; clampAction?.Invoke(parameter); toggle.SetValueWithoutNotify(parameter.BooleanValue); } ); control = toggle; break; case ParameterType.enumeration: control = new EnumField(); //TODO break; case ParameterType.integer1: var integerField = new IntegerField(controlName) { value = parameter.Integer1Value }; integerField.RegisterValueChangedCallback( changeEvent => { parameter.Integer1Value = changeEvent.newValue; clampAction?.Invoke(parameter); integerField.SetValueWithoutNotify(parameter.Integer1Value); } ); control = integerField; break; case ParameterType.integer2: var vector2IntField = new Vector2IntField(controlName) { value = parameter.Integer2Value }; vector2IntField.RegisterValueChangedCallback( changeEvent => { parameter.Integer2Value = changeEvent.newValue; clampAction?.Invoke(parameter); vector2IntField.SetValueWithoutNotify(parameter.Integer2Value); } ); control = vector2IntField; break; case ParameterType.integer3: var vector3IntField = new Vector3IntField(controlName) { value = parameter.Integer3Value }; vector3IntField.RegisterValueChangedCallback( changeEvent => { parameter.Integer3Value = changeEvent.newValue; clampAction?.Invoke(parameter); vector3IntField.SetValueWithoutNotify(parameter.Integer3Value); } ); control = vector3IntField; break; case ParameterType.float1: var floatField = new FloatField(controlName) { value = parameter.Float1Value }; floatField.RegisterValueChangedCallback( changeEvent => { parameter.Float1Value = changeEvent.newValue; clampAction?.Invoke(parameter); floatField.SetValueWithoutNotify(parameter.Float1Value); } ); control = floatField; break; case ParameterType.float2: var vector2Field = new Vector2Field(controlName) { value = parameter.Float2Value }; vector2Field.RegisterValueChangedCallback( changeEvent => { parameter.Float2Value = changeEvent.newValue; clampAction?.Invoke(parameter); vector2Field.SetValueWithoutNotify(parameter.Float2Value); } ); control = vector2Field; break; case ParameterType.float3: var vector3Field = new Vector3Field(controlName) { value = parameter.Float3Value }; vector3Field.RegisterValueChangedCallback( changeEvent => { parameter.Float3Value = changeEvent.newValue; clampAction?.Invoke(parameter); vector3Field.SetValueWithoutNotify(parameter.Float3Value); } ); control = vector3Field; break; default: throw ExceptionHelper.Invalid(nameof(parameter.Type), parameter.Type, InvalidType.unexpected); } control.Query <FloatField>().ForEach(field => field.style.minWidth = 60f); Label label = control.Q <Label>(); if (label != null) { label.style.minWidth = 0f; label.style.paddingRight = 20f; } return(control); }
public void GenerateBlackBoard(GraphData currentData) { Blackboard blackboard = new Blackboard(this) { scrollable = true, }; blackboard.AddToClassList("grayboard"); //blackboard.Add(new BlackboardSection { title="Exposed Properties" }); blackboard.addItemRequested = _blackboard => { }; blackboard.SetPosition(new Rect(10, 30, 200, 200)); this.Add(blackboard); /* Start: how to add to blackboard */ /*var container = new VisualElement(); * var blackboardField = new BlackboardField { * text = "Sample_Property", * typeText = "String Property" * }; * var blackboardFieldValue = new TextField("Value") { * value = "Value" * }; * blackboardFieldValue.RegisterValueChangedCallback(evt => { * Debug.Log(evt.newValue); * }); * var blackBoardRow = new BlackboardRow(blackboardField, blackboardFieldValue); * container.Add(blackboardField); * container.Add(blackBoardRow); * blackboard.Add(container);*/ /* End: how to add to blackboard */ if (currentData != null) { blackboard.title = currentData.name; blackboard.subTitle = "Properties"; FieldInfo[] fields = currentData.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance); //Debug.Log(currentData.GetType()); for (int i = 0; i < fields.Length; i++) { FieldInfo fieldInfo = fields[i]; if (!hiddenFields.Contains(fieldInfo.Name)) { //Debug.Log(fields[i].ToString()); string fName = SplitCamelCase(fieldInfo.Name); var container = new VisualElement(); BlackboardSection bbField; BlackboardRow bbRow; switch (fieldInfo.FieldType.ToString()) { case "System.String": bbField = new BlackboardSection { title = fName }; container.Add(bbField); TextField bbfValue = new TextField() { value = fieldInfo.GetValue(currentData) as string, multiline = true }; bbfValue.RegisterValueChangedCallback(evt => { fieldInfo.SetValue(currentData, evt.newValue); //Debug.Log(evt.newValue); }); bbRow = new BlackboardRow(bbField, bbfValue); container.Add(bbRow); break; case "System.Int32": bbField = new BlackboardSection { title = fName }; container.Add(bbField); IntegerField bbfIntValue = new IntegerField() { value = (int)fieldInfo.GetValue(currentData) }; bbfIntValue.RegisterValueChangedCallback(evt => { fieldInfo.SetValue(currentData, evt.newValue); //Debug.Log(evt.newValue); }); bbRow = new BlackboardRow(bbField, bbfIntValue); container.Add(bbRow); break; case "System.Single": bbField = new BlackboardSection { title = fName }; container.Add(bbField); FloatField bbfFloatValue = new FloatField() { value = (float)fieldInfo.GetValue(currentData) }; bbfFloatValue.RegisterValueChangedCallback(evt => { fieldInfo.SetValue(currentData, evt.newValue); //Debug.Log(evt.newValue); }); bbRow = new BlackboardRow(bbField, bbfFloatValue); container.Add(bbRow); break; case "UnityEngine.Vector2": bbField = new BlackboardSection { title = fName }; container.Add(bbField); Vector2Field bbfVector2Value = new Vector2Field() { value = (Vector2)fieldInfo.GetValue(currentData) }; bbfVector2Value.RegisterValueChangedCallback(evt => { fieldInfo.SetValue(currentData, evt.newValue); //Debug.Log(evt.newValue); }); bbRow = new BlackboardRow(bbField, bbfVector2Value); container.Add(bbRow); break; case "UnityEngine.Vector3": bbField = new BlackboardSection { title = fName }; container.Add(bbField); Vector3Field bbfVector3Value = new Vector3Field() { value = (Vector3)fieldInfo.GetValue(currentData) }; bbfVector3Value.RegisterValueChangedCallback(evt => { fieldInfo.SetValue(currentData, evt.newValue); //Debug.Log(evt.newValue); }); bbRow = new BlackboardRow(bbField, bbfVector3Value); container.Add(bbRow); break; case "UnityEngine.AnimationCurve": bbField = new BlackboardSection { title = fName }; container.Add(bbField); CurveField bbfAnimationCurveValue = new CurveField() { value = (UnityEngine.AnimationCurve)fieldInfo.GetValue(currentData) }; bbfAnimationCurveValue.RegisterValueChangedCallback(evt => { fieldInfo.SetValue(currentData, evt.newValue); //Debug.Log(evt.newValue); }); bbRow = new BlackboardRow(bbField, bbfAnimationCurveValue); container.Add(bbRow); break; default: if (fieldInfo.FieldType.ToString().IndexOf("UnityEngine.") == 0) { bbField = new BlackboardSection { title = fName }; container.Add(bbField); ObjectField bbfObjectValue = new ObjectField() { value = (UnityEngine.Object)fieldInfo.GetValue(currentData), allowSceneObjects = false, objectType = fieldInfo.FieldType }; bbfObjectValue.RegisterValueChangedCallback(evt => { fieldInfo.SetValue(currentData, evt.newValue); //Debug.Log(evt.newValue); }); bbRow = new BlackboardRow(bbField, bbfObjectValue); container.Add(bbRow); } else { bbField = new BlackboardSection { title = fName }; container.Add(bbField); EnumField bbfEnumValue = new EnumField((System.Enum)fieldInfo.GetValue(currentData)) { value = (System.Enum)fieldInfo.GetValue(currentData) }; bbfEnumValue.RegisterValueChangedCallback(evt => { fieldInfo.SetValue(currentData, evt.newValue); //Debug.Log(evt.newValue); }); bbRow = new BlackboardRow(bbField, bbfEnumValue); container.Add(bbRow); } break; } blackboard.Add(container); } } } // Get the properties of 'Type' class object. }
public BlackboardFieldPropertyView(AbstractNodeGraph graph, INodeProperty property) { styleSheets.Add(Resources.Load <StyleSheet>("Styles/NodeGraphBlackboard")); m_Graph = graph; m_Reference = new TextField(); m_Reference.RegisterValueChangedCallback(evt => { property.reference = evt.newValue; DirtyNodes(ModificationScope.Graph); }); m_Reference.value = property.reference; AddRow("Reference", m_Reference); if (property is ValueProperty <float> ) { var floatProperty = (ValueProperty <float>)property; FloatField floatField = new FloatField { value = floatProperty.value }; floatField.RegisterValueChangedCallback(evt => { floatProperty.value = (float)evt.newValue; DirtyNodes(); }); AddRow("Default", floatField); /*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 ValueProperty <int> ) { var intProperty = (ValueProperty <int>)property; var field = new IntegerField { value = intProperty.value }; field.RegisterValueChangedCallback(intEvt => { intProperty.value = intEvt.newValue; DirtyNodes(); }); AddRow("Default", field); } else if (property is ValueProperty <Vector2> ) { var vectorProperty = (ValueProperty <Vector2>)property; var field = new Vector2Field { value = vectorProperty.value }; field.RegisterValueChangedCallback(evt => { vectorProperty.value = evt.newValue; DirtyNodes(); }); AddRow("Default", field); } else if (property is ValueProperty <Vector3> ) { var vectorProperty = (ValueProperty <Vector3>)property; var field = new Vector3Field { value = vectorProperty.value }; field.RegisterValueChangedCallback(evt => { vectorProperty.value = evt.newValue; DirtyNodes(); }); AddRow("Default", field); } else if (property is ValueProperty <Vector4> ) { var vectorProperty = (ValueProperty <Vector4>)property; var field = new Vector4Field { value = vectorProperty.value }; field.RegisterValueChangedCallback(evt => { vectorProperty.value = evt.newValue; DirtyNodes(); }); AddRow("Default", field); } else if (property is ValueProperty <Color> ) { var colorProperty = (ValueProperty <Color>)property; //todo add HDR var colorField = new ColorField { value = (Color)property.defaultValue, showEyeDropper = false }; colorField.RegisterValueChangedCallback(evt => { colorProperty.value = evt.newValue; DirtyNodes(); }); AddRow("Default", colorField); } else if (property is ValueProperty <Texture2D> ) { var textureProperty = (ValueProperty <Texture2D>)property; var field = new ObjectField { value = textureProperty.value, objectType = typeof(Texture2D) }; field.RegisterValueChangedCallback(evt => { textureProperty.value = (Texture2D)evt.newValue; DirtyNodes(); }); AddRow("Default", field); } else if (property is ValueProperty <Cubemap> ) { var cubemapProperty = (ValueProperty <Cubemap>)property; var field = new ObjectField { value = cubemapProperty.value, objectType = typeof(Cubemap) }; field.RegisterValueChangedCallback(evt => { cubemapProperty.value = (Cubemap)evt.newValue; DirtyNodes(); }); AddRow("Default", field); } else if (property is ValueProperty <bool> ) { var booleanProperty = (ValueProperty <bool>)property; EventCallback <ChangeEvent <bool> > onBooleanChanged = evt => { booleanProperty.value = evt.newValue; DirtyNodes(); }; var field = new Toggle(); field.RegisterValueChangedCallback(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"); }
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 => { 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 => { 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) { 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.RegisterValueChangedCallback(intEvt => { floatProperty.value = (float)intEvt.newValue; DirtyNodes(); }); intRow = AddRow("Default", field); } else { floatField = new FloatField { value = floatProperty.value }; floatField.RegisterValueChangedCallback(evt => { floatProperty.value = (float)evt.newValue; DirtyNodes(); }); floatRow = AddRow("Default", floatField); } var floatModeField = new EnumField((Enum)floatProperty.floatType); floatModeField.value = floatProperty.floatType; floatModeField.RegisterValueChangedCallback(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.RegisterValueChangedCallback(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.RegisterValueChangedCallback(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.RegisterValueChangedCallback(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.RegisterValueChangedCallback(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.RegisterValueChangedCallback(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.RegisterValueChangedCallback(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.RegisterValueChangedCallback(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.RegisterValueChangedCallback(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.RegisterValueChangedCallback(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.RegisterValueChangedCallback(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.RegisterValueChangedCallback(evt => { colorProperty.value = evt.newValue; DirtyNodes(); }); AddRow("Default", colorField); var colorModeField = new EnumField((Enum)colorProperty.colorMode); colorModeField.RegisterValueChangedCallback(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.RegisterValueChangedCallback(evt => { textureProperty.value.texture = (Texture)evt.newValue; DirtyNodes(); }); AddRow("Default", field); var defaultModeField = new EnumField((Enum)textureProperty.defaultType); defaultModeField.RegisterValueChangedCallback(evt => { if (textureProperty.defaultType == (TextureShaderProperty.DefaultType)evt.newValue) { return; } textureProperty.defaultType = (TextureShaderProperty.DefaultType)evt.newValue; DirtyNodes(ModificationScope.Graph); }); 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 => { 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 => { 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 => { cubemapProperty.value.cubemap = (Cubemap)evt.newValue; DirtyNodes(); }); AddRow("Default", field); } else if (property is BooleanShaderProperty) { var booleanProperty = (BooleanShaderProperty)property; EventCallback <ChangeEvent <bool> > onBooleanChanged = evt => { 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(); }