/// <summary> /// Spawns the specified actor. /// </summary> /// <param name="actor">The actor.</param> /// <param name="parent">The parent.</param> public void Spawn(Actor actor, Actor parent) { if (actor == null) { throw new ArgumentNullException(nameof(actor)); } // Link it actor.Parent = parent ?? throw new ArgumentNullException(nameof(parent)); // Peek spawned node var actorNode = SceneGraphFactory.FindNode(actor.ID) as ActorNode ?? SceneGraphFactory.BuildActorNode(actor); if (actorNode == null) { throw new InvalidOperationException("Failed to create scene node for the spawned actor."); } var parentNode = SceneGraphFactory.FindNode(parent.ID) as ActorNode; actorNode.ParentNode = parentNode ?? throw new InvalidOperationException("Missing scene graph node for the spawned parent actor."); // Call post spawn action (can possibly setup custom default values) actorNode.PostSpawn(); // Create undo action var action = new CustomDeleteActorsAction(new List <SceneGraphNode>(1) { actorNode }, true); Undo.AddAction(action); }
/// <summary> /// Deletes selected objects. /// </summary> public void Delete() { // Peek things that can be removed var objects = Selection.Where(x => x.CanDelete && x != Graph.Main).ToList().BuildAllNodes().Where(x => x.CanDelete).ToList(); if (objects.Count == 0) { return; } // Change selection var action1 = new SelectionChangeAction(Selection.ToArray(), new SceneGraphNode[0], OnSelectionUndo); // Delete objects var action2 = new CustomDeleteActorsAction(objects); // Merge actions and perform them var action = new MultiUndoAction(new IUndoAction[] { action1, action2 }, action2.ActionString); action.Do(); Undo.AddAction(action); }