Esempio n. 1
0
        public void ValidateModifier(
            Model.NodeData node,
            BuildTarget target,
            IEnumerable <PerformGraph.AssetGroups> incoming)
        {
            if (string.IsNullOrEmpty(m_modifierType))
            {
                throw new NodeException("Modifier asset type not set.", "Select asset type to modify from inspector.", node);
            }
            var modifier = m_instance.Get <IModifier> (target);

            if (modifier == null)
            {
                throw new NodeException("Failed to create Modifier.", "Select modifier from inspector.", node);
            }
            modifier.OnValidate();

            Type expected    = Type.GetType(m_modifierType);
            Type modifierFor = ModifierUtility.GetModifierTargetType(m_instance.ClassName);

            if (expected != modifierFor)
            {
                throw new NodeException("Modifier type does not match.", "Reset setting or fix Modifier code.", node);
            }
        }
Esempio n. 2
0
        public override void Prepare(BuildTarget target,
                                     Model.NodeData node,
                                     IEnumerable <PerformGraph.AssetGroups> incoming,
                                     IEnumerable <Model.ConnectionData> connectionsToOutput,
                                     PerformGraph.Output Output)
        {
            var modifier = m_instance.Get <IModifier> (target);

            if (modifier != null && string.IsNullOrEmpty(m_modifierType))
            {
                m_modifierType = ModifierUtility.GetModifierTargetType(m_instance.ClassName).AssemblyQualifiedName;
            }

            ValidateModifier(node, target, incoming);

            if (incoming != null && Output != null)
            {
                // Modifier does not add, filter or change structure of group, so just pass given group of assets
                var dst = (connectionsToOutput == null || !connectionsToOutput.Any())?
                          null : connectionsToOutput.First();

                foreach (var ag in incoming)
                {
                    Output(dst, ag.assetGroups);
                }
            }
        }
Esempio n. 3
0
        public override void OnInspectorGUI(NodeGUI node, AssetReferenceStreamManager streamManager, NodeGUIEditor editor, Action onValueChanged)
        {
            EditorGUILayout.HelpBox("Modify Assets Directly: Modify assets.", MessageType.Info);
            editor.UpdateNodeName(node);

            GUILayout.Space(10f);

            using (new EditorGUILayout.VerticalScope(GUI.skin.box)) {
                if (string.IsNullOrEmpty(m_modifierType))
                {
                    EditorGUILayout.HelpBox("Select asset type to modify with this node.", MessageType.Info);
                    using (new EditorGUILayout.HorizontalScope()) {
                        EditorGUILayout.LabelField("Asset Type");
                        if (GUILayout.Button("", "Popup", GUILayout.MinWidth(150f)))
                        {
                            var menu = new GenericMenu();

                            var types = ModifierUtility.GetModifyableTypes().ToArray();

                            for (var i = 0; i < types.Length; i++)
                            {
                                var index = i;
                                menu.AddItem(
                                    new GUIContent(types [i].Name),
                                    false,
                                    () => {
                                    ResetConfig();
                                    m_modifierType = types[index].AssemblyQualifiedName;
                                }
                                    );
                            }
                            menu.ShowAsContext();
                        }
                    }
                    return;
                }

                var targetType = Type.GetType(m_modifierType);
                var modifier   = m_instance.Get <IModifier>(editor.CurrentEditingGroup);

                Dictionary <string, string> map = null;

                if (targetType != null)
                {
                    EditorGUILayout.LabelField("Asset Type", targetType.Name);

                    map = ModifierUtility.GetAttributeAssemblyQualifiedNameMap(targetType);
                }

                if (map != null && map.Count > 0)
                {
                    using (new GUILayout.HorizontalScope()) {
                        GUILayout.Label("Modifier");
                        var guiName = ModifierUtility.GetModifierGUIName(m_instance.ClassName);
                        if (GUILayout.Button(guiName, "Popup", GUILayout.MinWidth(150f)))
                        {
                            var builders = map.Keys.ToList();

                            if (builders.Count > 0)
                            {
                                NodeGUI.ShowTypeNamesMenu(guiName, builders, (string selectedGUIName) =>
                                {
                                    using (new RecordUndoScope("Change Modifier class", node, true)) {
                                        modifier = ModifierUtility.CreateModifier(selectedGUIName, targetType);
                                        m_instance.Set(editor.CurrentEditingGroup, modifier);
                                        onValueChanged();
                                    }
                                }
                                                          );
                            }
                        }

                        MonoScript s = TypeUtility.LoadMonoScript(m_instance.ClassName);

                        using (new EditorGUI.DisabledScope(s == null)) {
                            if (GUILayout.Button("Edit", GUILayout.Width(50)))
                            {
                                AssetDatabase.OpenAsset(s, 0);
                            }
                        }
                    }
                }
                else
                {
                    string[] menuNames = Model.Settings.GUI_TEXT_MENU_GENERATE_MODIFIER.Split('/');

                    if (targetType == null)
                    {
                        EditorGUILayout.HelpBox(
                            "You need to create at least one Modifier script to select script for Modifier. " +
                            $"To start, select {menuNames[1]}>{menuNames[2]}>{menuNames[3]} menu and create a new script.", MessageType.Info);
                    }
                    else
                    {
                        EditorGUILayout.HelpBox(
                            string.Format(
                                "No CustomModifier found for {3} type. \n" +
                                "You need to create at least one Modifier script to select script for Modifier. " +
                                "To start, select {0}>{1}>{2} menu and create a new script.",
                                menuNames[1], menuNames[2], menuNames[3], targetType.FullName
                                ), MessageType.Info);
                    }
                }

                GUILayout.Space(10f);

                editor.DrawPlatformSelector(node);
                using (new EditorGUILayout.VerticalScope()) {
                    var disabledScope = editor.DrawOverrideTargetToggle(node, m_instance.ContainsValueOf(editor.CurrentEditingGroup), (bool enabled) => {
                        if (enabled)
                        {
                            m_instance.CopyDefaultValueTo(editor.CurrentEditingGroup);
                        }
                        else
                        {
                            m_instance.Remove(editor.CurrentEditingGroup);
                        }
                        onValueChanged();
                    });

                    using (disabledScope) {
                        if (modifier != null)
                        {
                            Action onChangedAction = () => {
                                using (new RecordUndoScope("Change Modifier Setting", node)) {
                                    m_instance.Set(editor.CurrentEditingGroup, modifier);
                                    onValueChanged();
                                }
                            };

                            modifier.OnInspectorGUI(onChangedAction);
                        }
                    }
                }

                GUILayout.Space(40f);
                using (new EditorGUILayout.HorizontalScope(GUI.skin.box)) {
                    GUILayout.Space(4f);
                    EditorGUILayout.LabelField("Reset Modifier Setting");

                    if (GUILayout.Button("Clear"))
                    {
                        if (EditorUtility.DisplayDialog("Clear Modifier Setting",
                                                        $"Do you want to reset modifier for \"{node.Name}\"?", "OK", "Cancel"))
                        {
                            using (new RecordUndoScope("Clear Modifier Setting", node)) {
                                ResetConfig();
                            }
                        }
                    }
                }
            }
        }
Esempio n. 4
0
        public override void Build(BuildTarget target,
                                   Model.NodeData node,
                                   IEnumerable <PerformGraph.AssetGroups> incoming,
                                   IEnumerable <Model.ConnectionData> connectionsToOutput,
                                   PerformGraph.Output Output,
                                   Action <Model.NodeData, string, float> progressFunc)
        {
            if (incoming == null)
            {
                return;
            }
            var modifier = m_instance.Get <IModifier>(target);

            UnityEngine.Assertions.Assert.IsNotNull(modifier);
            Type targetType         = ModifierUtility.GetModifierTargetType(m_instance.ClassName);
            bool isAnyAssetModified = false;

            var aggregatedGroups = new Dictionary <string, List <AssetReference> >();

            foreach (var ag in incoming)
            {
                foreach (var name in ag.assetGroups.Keys)
                {
                    if (!aggregatedGroups.ContainsKey(name))
                    {
                        aggregatedGroups[name] = new List <AssetReference>();
                    }
                    aggregatedGroups[name].AddRange(ag.assetGroups[name].AsEnumerable());
                }
            }

            foreach (var assets in aggregatedGroups.Values)
            {
                foreach (var asset in assets)
                {
                    if (asset.assetType == targetType)
                    {
                        if (modifier.IsModified(asset.allData, assets))
                        {
                            modifier.Modify(asset.allData, assets);
                            asset.SetDirty();
                            AssetProcessEventRecord.GetRecord().LogModify(asset);

                            isAnyAssetModified = true;

                            // apply asset setting changes to AssetDatabase.
                            if (asset.isSceneAsset)
                            {
                                if (!EditorSceneManager.SaveScene(asset.scene))
                                {
                                    throw new NodeException("Failed to save modified scene:" + asset.importFrom, "See console for details.", node);
                                }
                            }
                            else
                            {
                                AssetDatabase.SaveAssets();
                            }
                        }
                        asset.ReleaseData();
                    }
                }
            }

            if (isAnyAssetModified)
            {
                AssetDatabase.Refresh();
            }

            if (incoming != null && Output != null)
            {
                // Modifier does not add, filter or change structure of group, so just pass given group of assets
                var dst = (connectionsToOutput == null || !connectionsToOutput.Any())?
                          null : connectionsToOutput.First();

                Output(dst, aggregatedGroups);
            }
        }