Пример #1
0
        public INodeModel CreateStackedNode(Type nodeTypeToCreate, string nodeName = "", int index = -1, SpawnFlags spawnFlags = SpawnFlags.Default, Action <NodeModel> preDefineSetup = null, GUID?guid = null)
        {
            SpawnFlags createNodeFlags = (spawnFlags & SpawnFlags.CreateNodeAsset) | SpawnFlags.Orphan; // we don't want to CreateNode to add the node to the graph nor to register undo
            var        graphModel      = (GraphModel)GraphModel;
            NodeModel  nodeModel       = (NodeModel)graphModel.CreateNodeInternal(nodeTypeToCreate, nodeName, Vector2.zero, createNodeFlags, preDefineSetup, guid);

            graphModel.RegisterNodeGuid(nodeModel);
            if (!spawnFlags.IsOrphan())
            {
                if (spawnFlags.IsUndoable())
                {
                    Undo.RegisterCreatedObjectUndo(nodeModel.NodeAssetReference, "Create Node");
                    Undo.RegisterCompleteObjectUndo(NodeAssetReference, "Add Node");
                    AddStackedNode(nodeModel, index);
                    EditorUtility.SetDirty(NodeAssetReference);
                }
                else
                {
                    AddStackedNode(nodeModel, index);
                }
            }
            nodeModel.DefineNode();

            return(nodeModel);
        }
Пример #2
0
        public INodeModel CreateStackedNode(Type nodeTypeToCreate, string nodeName = "", int index = -1, SpawnFlags spawnFlags = SpawnFlags.Default, Action <NodeModel> preDefineSetup = null)
        {
            if (nodeTypeToCreate == null)
            {
                throw new InvalidOperationException("Cannot create node with a null type");
            }
            NodeModel nodeModel;

            if (spawnFlags.IsSerializable())
            {
                nodeModel = (NodeModel)SpawnNodeAsset(nodeTypeToCreate).Model;
            }
            else
            {
                nodeModel = (NodeModel)Activator.CreateInstance(nodeTypeToCreate);
            }

            nodeModel.Title            = nodeName ?? nodeTypeToCreate.Name;
            nodeModel.Position         = Vector2.zero;
            nodeModel.GraphModel       = GraphModel;
            nodeModel.ParentStackModel = this;
            preDefineSetup?.Invoke(nodeModel);
            nodeModel.DefineNode();
            if (!spawnFlags.IsOrphan())
            {
                if (spawnFlags.IsUndoable())
                {
                    Undo.RegisterCreatedObjectUndo(nodeModel.NodeAssetReference, "Create Node");
                    AddStackedNode(nodeModel, index);
                }
                else
                {
                    AddStackedNodeNoUndo(nodeModel, index);
                }
            }

            return(nodeModel);

            AbstractNodeAsset SpawnNodeAsset(Type typeToSpawn)
            {
                var genericNodeAssetType = typeof(NodeAsset <>).MakeGenericType(typeToSpawn);
                var derivedTypes         = TypeCache.GetTypesDerivedFrom(genericNodeAssetType);

                if (derivedTypes.Count == 0)
                {
                    throw new InvalidOperationException($"No NodeAssets of type NodeAsset<{typeToSpawn.Name}>");
                }
                Assert.AreEqual(derivedTypes.Count, 1,
                                $"Multiple NodeAssets of type NodeAsset<{typeToSpawn.Name}> have been found");

                return(ScriptableObject.CreateInstance(derivedTypes[0]) as AbstractNodeAsset);
            }
        }