Browse Source

Handle node reparenting

Josh Engebretson 10 years ago
parent
commit
dfb2183015

+ 16 - 33
Script/AtomicEditor/ui/frames/HierarchyFrame.ts

@@ -143,7 +143,6 @@ class HierarchyFrame extends Atomic.UIWidget {
             return;
             return;
 
 
         delete this.nodeIDToItemID[node.id];
         delete this.nodeIDToItemID[node.id];
-
         this.hierList.deleteItemByID(node.id.toString());
         this.hierList.deleteItemByID(node.id.toString());
 
 
     }
     }
@@ -175,6 +174,21 @@ class HierarchyFrame extends Atomic.UIWidget {
 
 
             });
             });
 
 
+            this.subscribeToEvent(this.scene, "SceneEditNodeReparent", (ev) => {
+
+                if (!ev.added) {
+                    delete this.nodeIDToItemID[ev.node.id];
+                    this.hierList.deleteItemByID(ev.node.id.toString());
+                } else {
+                  var parentID = this.nodeIDToItemID[ev.node.parent.id];
+                  var childItemID = this.recursiveAddNode(parentID, ev.node);
+                  this.nodeIDToItemID[ev.node.id] = childItemID;
+
+                }
+
+            });
+
+
         }
         }
 
 
     }
     }
@@ -259,38 +273,7 @@ class HierarchyFrame extends Atomic.UIWidget {
 
 
             var dragNode = <Atomic.Node>ev.dragObject.object;
             var dragNode = <Atomic.Node>ev.dragObject.object;
 
 
-            if (dragNode.scene != this.scene) {
-                return;
-            }
-
-            // can't drop on self
-            if (dragNode == dropNode) {
-                return;
-            }
-
-            // check if dropping on child of ourselves
-            var parent = dropNode.parent;
-
-            while (parent) {
-
-                if (parent == dragNode) {
-                    return;
-                }
-
-                parent = parent.parent;
-
-            }
-
-            this.scene.sendEvent("SceneEditAddRemoveNodes", {end: false});
-
-            this.scene.sendEvent("SceneEditNodeRemoved", {scene: this.scene, node:dragNode, parent:dragNode.parent});
-
-            // move it
-            dropNode.addChild(dragNode);
-
-            this.scene.sendEvent("SceneEditNodeAdded", {scene: this.scene, node:dragNode, dropNode});
-
-            this.scene.sendEvent("SceneEditAddRemoveNodes", {end: true});
+            this.sceneEditor.reparentNode(dragNode, dropNode);
 
 
         } else if (typeName == "Asset") {
         } else if (typeName == "Asset") {
 
 

+ 20 - 2
Source/AtomicEditor/Editors/SceneEditor3D/SceneEditOp.cpp

@@ -194,6 +194,17 @@ bool SelectionEditOp::Undo()
         {
         {
             if(enode->parentBegin_.NotNull())
             if(enode->parentBegin_.NotNull())
             {
             {
+                // moving back to original parent
+
+                if (node->GetParent())
+                {
+                    VariantMap nodeRemovedEventData;
+                    nodeRemovedEventData[SceneEditNodeRemoved::P_NODE] = node;
+                    nodeRemovedEventData[SceneEditNodeRemoved::P_PARENT] =  node->GetParent();
+                    nodeRemovedEventData[SceneEditNodeRemoved::P_SCENE] = scene_;
+                    scene_->SendEvent(E_SCENEEDITNODEREMOVED, nodeRemovedEventData);
+                }
+
                 node->Remove();
                 node->Remove();
                 enode->parentBegin_->AddChild(node);
                 enode->parentBegin_->AddChild(node);
 
 
@@ -299,10 +310,17 @@ bool SelectionEditOp::Redo()
         if (node->GetParent() != enode->parentEnd_)
         if (node->GetParent() != enode->parentEnd_)
         {
         {
 
 
-
-
             if(enode->parentEnd_.NotNull())
             if(enode->parentEnd_.NotNull())
             {
             {
+                if (node->GetParent())
+                {
+                    VariantMap nodeRemovedEventData;
+                    nodeRemovedEventData[SceneEditNodeRemoved::P_NODE] = node;
+                    nodeRemovedEventData[SceneEditNodeRemoved::P_PARENT] =  node->GetParent();
+                    nodeRemovedEventData[SceneEditNodeRemoved::P_SCENE] = scene_;
+                    scene_->SendEvent(E_SCENEEDITNODEREMOVED, nodeRemovedEventData);
+                }
+
                 node->Remove();
                 node->Remove();
                 enode->parentEnd_->AddChild(node);
                 enode->parentEnd_->AddChild(node);
 
 

+ 62 - 0
Source/AtomicEditor/Editors/SceneEditor3D/SceneEditor3D.cpp

@@ -348,4 +348,66 @@ void SceneEditor3D::UpdateGizmoSnapSettings()
 
 
 }
 }
 
 
+void SceneEditor3D::ReparentNode(Node* node, Node* newParent)
+{
+    // can't parent to self
+    if (node == newParent)
+        return;
+
+    // already parented
+    Node* oldParent = node->GetParent();
+    if (oldParent == newParent)
+        return;
+
+    // must be in same scene
+    if (node->GetScene() != newParent->GetScene())
+    {
+        return;
+    }
+
+    // check if dropping on child of ourselves
+
+    Node* parent = newParent;
+
+    while (parent)
+    {
+        if (parent == node)
+        {
+            return;
+        }
+
+        parent = parent->GetParent();
+    }
+
+    selection_->AddNode(node, true);
+
+    Matrix3x4 transform = node->GetWorldTransform();
+
+    newParent->AddChild(node);
+
+    node->SetWorldTransform(transform.Translation(), transform.Rotation(), transform.Scale());
+
+    scene_->SendEvent(E_SCENEEDITEND);
+
+    PODVector<Node*> nodes;
+    node->GetChildren(nodes, true);
+    nodes.Insert(0, node);
+
+    VariantMap evData;
+    for (unsigned i = 0; i < nodes.Size(); i++)
+    {
+        evData[SceneEditNodeReparent::P_NODE] = nodes[i];
+        evData[SceneEditNodeReparent::P_ADDED] = false;
+        scene_->SendEvent(E_SCENEEDITNODEREPARENT, evData);
+    }
+
+    evData[SceneEditNodeReparent::P_NODE] = node;
+    evData[SceneEditNodeReparent::P_ADDED] = true;
+    scene_->SendEvent(E_SCENEEDITNODEREPARENT, evData);
+
+    selection_->AddNode(node, true);
+
+
+}
+
 }
 }

+ 2 - 0
Source/AtomicEditor/Editors/SceneEditor3D/SceneEditor3D.h

@@ -58,6 +58,8 @@ public:
     void RegisterNode(Node* node);
     void RegisterNode(Node* node);
     void RegisterNodes(const PODVector<Node*>& nodes);
     void RegisterNodes(const PODVector<Node*>& nodes);
 
 
+    void ReparentNode(Node* node, Node* newParent);
+
     Scene* GetScene() { return scene_; }
     Scene* GetScene() { return scene_; }
     Gizmo3D* GetGizmo() { return gizmo3D_; }
     Gizmo3D* GetGizmo() { return gizmo3D_; }
 
 

+ 7 - 0
Source/AtomicEditor/Editors/SceneEditor3D/SceneEditor3DEvents.h

@@ -43,6 +43,13 @@ EVENT(E_SCENEEDITBEGIN, SceneEditBegin)
 
 
 }
 }
 
 
+EVENT(E_SCENEEDITNODEREPARENT, SceneEditNodeReparent)
+{
+    PARAM(P_NODE, Node);             // Node
+    PARAM(P_ADDED, Added);             // Boolean
+}
+
+
 EVENT(E_SCENEEDITEND, SceneEditEnd)
 EVENT(E_SCENEEDITEND, SceneEditEnd)
 {
 {
     PARAM(P_SCENE, Scene);             // Scene
     PARAM(P_SCENE, Scene);             // Scene

+ 4 - 3
Source/AtomicEditor/Editors/SceneEditor3D/SceneSelection.cpp

@@ -130,9 +130,8 @@ void SceneSelection::Paste()
 
 
         Matrix3x4 transform = clipNode->GetWorldTransform();
         Matrix3x4 transform = clipNode->GetWorldTransform();
 
 
-        clipNode->SetWorldTransform(transform.Translation(), transform.Rotation(), transform.Scale());
         parent->AddChild(clipNode);
         parent->AddChild(clipNode);
-
+        clipNode->SetWorldTransform(transform.Translation(), transform.Rotation(), transform.Scale());
 
 
         // clone
         // clone
         newClipBoardNodes.Push(SharedPtr<Node>(clipNode->Clone()));
         newClipBoardNodes.Push(SharedPtr<Node>(clipNode->Clone()));
@@ -193,8 +192,10 @@ void SceneSelection::Copy()
 
 
         if (node)
         if (node)
         {
         {
-            SharedPtr<Node> clipNode(node->Clone());
+            Matrix3x4 transform = node->GetWorldTransform();
+            SharedPtr<Node> clipNode(node->Clone());            
             clipNode->Remove();
             clipNode->Remove();
+            clipNode->SetWorldTransform(transform.Translation(), transform.Rotation(), transform.Scale());
             clipBoardNodes_.Push(clipNode);
             clipBoardNodes_.Push(clipNode);
         }
         }