public sealed override IEnumerable <Variant> ComputeVariants() { var attributes = VFXAttribute.AllIncludingVariadicReadWritable; var randoms = new[] { RandomMode.Off, RandomMode.Uniform, RandomMode.PerComponent }; var sources = new[] { SetAttribute.ValueSource.Slot, SetAttribute.ValueSource.Source }; var compositions = new[] { AttributeCompositionMode.Overwrite, AttributeCompositionMode.Add, AttributeCompositionMode.Multiply, AttributeCompositionMode.Blend }; foreach (var attribute in attributes) { var attributeRefSize = VFXExpressionHelper.GetSizeOfType(VFXAttribute.Find(attribute).type); foreach (var random in randoms) { foreach (var source in sources) { foreach (var composition in compositions) { if (random != RandomMode.Off && source == SetAttribute.ValueSource.Source) { continue; } if (composition != AttributeCompositionMode.Overwrite && source == SetAttribute.ValueSource.Source) { continue; } if (composition != AttributeCompositionMode.Overwrite && attribute == VFXAttribute.Alive.name) { continue; } if (random == RandomMode.PerComponent && attributeRefSize == 1) { continue; } yield return(new Variant( new[] { new KeyValuePair <string, object>("attribute", attribute), new KeyValuePair <string, object>("Random", random), new KeyValuePair <string, object>("Source", source), new KeyValuePair <string, object>("Composition", composition) }, new[] { attribute, VFXBlockUtility.GetNameString(composition) })); } } } } }
public override void OnInspectorGUI() { if (dataObject != null) { dataObject.Update(); } if (srpSubOutputObject != null) { srpSubOutputObject.Update(); } if (m_ContextController != null && m_ContextController.letter != '\0') { GUILayout.Label(m_ContextController.letter.ToString(), Styles.letter); } base.OnInspectorGUI(); bool invalidateContext = (dataObject != null && dataObject.ApplyModifiedProperties()) || (srpSubOutputObject != null && srpSubOutputObject.ApplyModifiedProperties()); if (invalidateContext) { foreach (VFXContext ctx in targets.OfType <VFXContext>()) { // notify that something changed. ctx.GetData().Invalidate(VFXModel.InvalidationCause.kSettingChanged); // This will also invalidate contexts } } if (serializedObject.isEditingMultipleObjects) { return; // Summary Only visible for single selection } // Context / SystemData if (dataObject == null) { return; } var context = (VFXContext)target; var data = (VFXData)dataObject.targetObject; // Particle context data if (data.type == VFXDataType.Particle) { VFXDataParticle particleData = data as VFXDataParticle; EditorGUILayout.Space(); { Styles.Row(Styles.header, "Name", "Value"); Styles.Row(Styles.cell, "Capacity", particleData.GetSettingValue("capacity").ToString()); EditorGUILayout.Space(); var attributes = data.GetAttributes(); if (attributes.Count() > 0) { EditorGUILayout.LabelField("System Attribute Summary", Styles.header); foreach (var attr in attributes) { using (new EditorGUILayout.HorizontalScope()) { GUILayout.Label(attr.attrib.name, Styles.cell); Styles.DataTypeLabel(attr.attrib.type.ToString(), attr.attrib.type, Styles.cell, GUILayout.Width(64)); int size = VFXExpressionHelper.GetSizeOfType(attr.attrib.type) * 4; GUILayout.Label(size + " byte" + (size > 1 ? "s" : ""), Styles.cell, GUILayout.Width(64)); var mode = attr.mode; GUILayout.Label(mode.ToString(), Styles.cell, GUILayout.Width(64)); } } } StructureOfArrayProvider.BucketInfo[] current = particleData.GetCurrentAttributeLayout(); StructureOfArrayProvider.BucketInfo[] source = particleData.GetSourceAttributeLayout(); if (current.Length > 0) { GUILayout.Space(24); DoAttributeLayoutGUI("Current Attribute Layout", current); } if (source.Length > 0) { GUILayout.Space(12); DoAttributeLayoutGUI("Source Attribute Layout", source); } } } if (VFXViewPreference.displayExtraDebugInfo) { // Extra debug data EditorGUILayout.Space(); { Styles.Row(Styles.header, "Name", "Value"); Styles.Row(Styles.cell, "Context Type", context.contextType.ToString()); Styles.Row(Styles.cell, "Task Type", context.taskType.ToString()); Styles.Row(Styles.cell, "Input Data Type", context.inputType.ToString()); Styles.Row(Styles.cell, "Context Data Type", data.type.ToString()); Styles.Row(Styles.cell, "Can Be Compiled", context.CanBeCompiled().ToString()); EditorGUILayout.Space(); var attributeInfos = data.GetAttributesForContext(context); VFXAttributeInfo[] infos; // Early check for context consistency try { infos = attributeInfos.ToArray(); } catch { return; } EditorGUILayout.LabelField("Attributes used by Context", Styles.header); foreach (var info in infos) { using (new EditorGUILayout.HorizontalScope()) { GUILayout.Label(info.attrib.name, Styles.cell); Styles.DataTypeLabel(info.attrib.type.ToString(), info.attrib.type, Styles.cell, GUILayout.Width(80)); Styles.AttributeModeLabel(info.mode.ToString(), info.mode, Styles.cell, GUILayout.Width(80)); } } EditorGUILayout.Space(); Styles.Row(Styles.header, "Blocks"); foreach (var block in context.activeChildrenWithImplicit) { Styles.Row(Styles.cell, block.name, !context.children.Contains(block) ? "implicit" : ""); } EditorGUILayout.Space(); } } }
protected void DisplaySummary() { if (serializedObject.isEditingMultipleObjects) { return; // Summary Only visible for single selection } // Context / SystemData if (dataObject == null) { return; } var context = (VFXContext)target; var data = (VFXData)dataObject.targetObject; // Particle context data if (data.type == VFXDataType.Particle) { VFXDataParticle particleData = data as VFXDataParticle; EditorGUILayout.Space(); { Styles.Row(Styles.header, "Name", "Value"); Styles.Row(Styles.cell, "Capacity", particleData.GetSettingValue("capacity").ToString()); EditorGUILayout.Space(); var attributes = data.GetAttributes(); if (attributes.Count() > 0) { EditorGUILayout.LabelField("System Attribute Summary", Styles.header); foreach (var attr in attributes) { using (new EditorGUILayout.HorizontalScope()) { GUILayout.Label(attr.attrib.name, Styles.cell); Styles.DataTypeLabel(attr.attrib.type.ToString(), attr.attrib.type, Styles.cell, GUILayout.Width(64)); int size = VFXExpressionHelper.GetSizeOfType(attr.attrib.type) * 4; GUILayout.Label(size + " byte" + (size > 1 ? "s" : ""), Styles.cell, GUILayout.Width(64)); var mode = attr.mode; GUILayout.Label(mode.ToString(), Styles.cell, GUILayout.Width(72)); } } } StructureOfArrayProvider.BucketInfo[] current = particleData.GetCurrentAttributeLayout(); StructureOfArrayProvider.BucketInfo[] source = particleData.GetSourceAttributeLayout(); if (current.Length > 0) { GUILayout.Space(24); DoAttributeLayoutGUI("Current Attribute Layout", current); } if (source.Length > 0) { GUILayout.Space(12); DoAttributeLayoutGUI("Source Attribute Layout", source); } } } if (VFXViewPreference.displayExtraDebugInfo) { // Extra debug data EditorGUILayout.Space(); { Styles.Row(Styles.header, "Name", "Value"); Styles.Row(Styles.cell, "Context Type", context.contextType.ToString()); Styles.Row(Styles.cell, "Task Type", context.taskType.ToString()); Styles.Row(Styles.cell, "Input Data Type", context.inputType.ToString()); Styles.Row(Styles.cell, "Context Data Type", data.type.ToString()); Styles.Row(Styles.cell, "Can Be Compiled", context.CanBeCompiled().ToString()); EditorGUILayout.Space(); var attributeInfos = data.GetAttributesForContext(context); VFXAttributeInfo[] infos; // Early check for context consistency try { infos = attributeInfos.ToArray(); } catch { return; } EditorGUILayout.LabelField("Attributes used by Context", Styles.header); foreach (var info in infos) { using (new EditorGUILayout.HorizontalScope()) { GUILayout.Label(info.attrib.name, Styles.cell); Styles.DataTypeLabel(info.attrib.type.ToString(), info.attrib.type, Styles.cell, GUILayout.Width(80)); Styles.AttributeModeLabel(info.mode.ToString(), info.mode, Styles.cell, GUILayout.Width(80)); } } EditorGUILayout.Space(); Styles.Row(Styles.header, "Blocks"); foreach (var block in context.activeChildrenWithImplicit) { Styles.Row(Styles.cell, block.name, !context.children.Contains(block) ? "implicit" : ""); } EditorGUILayout.Space(); } } }