public static DebugUI.EnumField CreateComponentSelector(DebugDisplaySettingsVolume data, Action <DebugUI.Field <int>, int> refresh) { int componentIndex = 0; var componentNames = new List <GUIContent>() { Styles.none }; var componentValues = new List <int>() { componentIndex++ }; foreach (var type in data.volumeDebugSettings.volumeComponentsPathAndType) { componentNames.Add(new GUIContent() { text = type.Item1 }); componentValues.Add(componentIndex++); } return(new DebugUI.EnumField { displayName = Strings.component, getter = () => data.volumeDebugSettings.selectedComponent, setter = value => data.volumeDebugSettings.selectedComponent = value, enumNames = componentNames.ToArray(), enumValues = componentValues.ToArray(), getIndex = () => data.volumeComponentEnumIndex, setIndex = value => { data.volumeComponentEnumIndex = value; }, onValueChanged = refresh }); }
public static DebugUI.ObjectPopupField CreateCameraSelector(DebugDisplaySettingsVolume data, Action <DebugUI.Field <Object>, Object> refresh) { return(new DebugUI.ObjectPopupField { displayName = Strings.camera, getter = () => data.volumeDebugSettings.selectedCamera, setter = value => data.volumeDebugSettings.selectedCamera = value as Camera, getObjects = () => data.volumeDebugSettings.cameras, onValueChanged = refresh }); }
public SettingsPanel(DebugDisplaySettingsVolume data) { m_Data = data; AddWidget(WidgetFactory.CreateComponentSelector(m_Data, (_, __) => Refresh())); AddWidget(WidgetFactory.CreateCameraSelector(m_Data, (_, __) => Refresh())); }
public static DebugUI.Table CreateVolumeTable(DebugDisplaySettingsVolume data) { var table = new DebugUI.Table() { displayName = Strings.parameter, isReadOnly = true }; Type selectedType = data.volumeDebugSettings.selectedComponentType; if (selectedType == null) { return(table); } var stack = data.volumeDebugSettings.selectedCameraVolumeStack ?? VolumeManager.instance.stack; var stackComponent = stack.GetComponent(selectedType); if (stackComponent == null) { return(table); } var volumes = data.volumeDebugSettings.GetVolumes(); var inst = (VolumeComponent)ScriptableObject.CreateInstance(selectedType); // First row for volume info float timer = 0.0f, refreshRate = 0.2f; var row = new DebugUI.Table.Row() { displayName = Strings.volumeInfo, opened = true, // Open by default for the in-game view children = { new DebugUI.Value() { displayName = Strings.interpolatedValue, getter = () => { // This getter is called first at each render // It is used to update the volumes if (Time.time - timer < refreshRate) { return(string.Empty); } timer = Time.deltaTime; if (data.volumeDebugSettings.selectedCamera != null) { var newVolumes = data.volumeDebugSettings.GetVolumes(); if (!data.volumeDebugSettings.RefreshVolumes(newVolumes)) { for (int i = 0; i < newVolumes.Length; i++) { var visible = data.volumeDebugSettings.VolumeHasInfluence(newVolumes[i]); table.SetColumnVisibility(i + 1, visible); } return(string.Empty); } } DebugManager.instance.ReDrawOnScreenDebug(); return(string.Empty); } } } }; // Second row, links to volume gameobjects var row2 = new DebugUI.Table.Row() { displayName = "GameObject", children = { new DebugUI.Value() { getter = () => string.Empty } } }; foreach (var volume in volumes) { var profile = volume.HasInstantiatedProfile() ? volume.profile : volume.sharedProfile; row.children.Add(new DebugUI.Value() { displayName = profile.name, getter = () => { var scope = volume.isGlobal ? Strings.global : Strings.local; var weight = data.volumeDebugSettings.GetVolumeWeight(volume); return(scope + " (" + (weight * 100f) + "%)"); } }); row2.children.Add(new DebugUI.ObjectField() { displayName = profile.name, getter = () => volume, }); } row.children.Add(new DebugUI.Value() { displayName = Strings.defaultValue, getter = () => string.Empty }); table.children.Add(row); row2.children.Add(new DebugUI.Value() { getter = () => string.Empty }); table.children.Add(row2); // Build rows - recursively handles nested parameters var rows = new List <DebugUI.Table.Row>(); void AddParameterRows(Type type, string baseName = null) { void AddRow(FieldInfo f, string prefix) { var fieldName = prefix + f.Name; var attr = (DisplayInfoAttribute[])f.GetCustomAttributes(typeof(DisplayInfoAttribute), true); if (attr.Length != 0) { fieldName = prefix + attr[0].name; } #if UNITY_EDITOR // Would be nice to have the equivalent for the runtime debug. else { fieldName = UnityEditor.ObjectNames.NicifyVariableName(fieldName); } #endif int currentParam = rows.Count; row = new DebugUI.Table.Row() { displayName = fieldName, children = { CreateVolumeParameterWidget(Strings.interpolatedValue, stackComponent.parameters[currentParam]) }, }; foreach (var volume in volumes) { VolumeParameter param = null; var profile = volume.HasInstantiatedProfile() ? volume.profile : volume.sharedProfile; if (profile.TryGet(selectedType, out VolumeComponent component)) { param = component.parameters[currentParam]; } row.children.Add(CreateVolumeParameterWidget(volume.name + " (" + profile.name + ")", param, () => !component.parameters[currentParam].overrideState)); } row.children.Add(CreateVolumeParameterWidget(Strings.defaultValue, inst.parameters[currentParam])); rows.Add(row); } var fields = type .GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) .OrderBy(t => t.MetadataToken); foreach (var field in fields) { if (field.GetCustomAttributes(typeof(ObsoleteAttribute), false).Length != 0) { continue; } var fieldType = field.FieldType; if (fieldType.IsSubclassOf(typeof(VolumeParameter))) { AddRow(field, baseName ?? string.Empty); } else if (!fieldType.IsArray && fieldType.IsClass) { AddParameterRows(fieldType, baseName ?? (field.Name + " ")); } } } AddParameterRows(selectedType); foreach (var r in rows.OrderBy(t => t.displayName)) { table.children.Add(r); } data.volumeDebugSettings.RefreshVolumes(volumes); for (int i = 0; i < volumes.Length; i++) { table.SetColumnVisibility(i + 1, data.volumeDebugSettings.VolumeHasInfluence(volumes[i])); } return(table); }