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 void Bind(Environment environment) { this.environment = environment; if (environment == null || environment.Equals(null)) { return; } if (latlong != null && !latlong.Equals(null)) { latlong.image = GetLatLongThumbnailTexture(); } skyCubemapField.SetValueWithoutNotify(environment.sky.cubemap); skyRotationOffset.SetValueWithoutNotify(environment.sky.rotation); skyExposureField.SetValueWithoutNotify(environment.sky.exposure); shadowCubemapField.SetValueWithoutNotify(environment.shadow.cubemap); sunPosition.SetValueWithoutNotify(new Vector2(environment.shadow.sunLongitude, environment.shadow.sunLatitude)); shadowColor.SetValueWithoutNotify(environment.shadow.color); environmentName.SetValueWithoutNotify(environment.name); }
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 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); }
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 Update(InspectorDataProxy <float2> proxy) { m_VectorField.SetValueWithoutNotify(proxy.Data); }