Browse Source

Fixed bug in editor where bone hierarchy would appear twice in the scene window if loading an object with bones.
Fixed object instantiation in local mode.
Added reset position/rotation/scale options to editor's Edit menu.

Lasse Öörni 14 years ago
parent
commit
b0831fcab3

+ 27 - 0
Bin/Data/Scripts/Editor/EditorScene.as

@@ -546,6 +546,33 @@ void SceneUnparent()
     list.contentElement.UpdateLayout();
 }
 
+void SceneResetPosition()
+{
+    if (editNode !is null)
+    {
+        editNode.position = Vector3(0.0, 0.0, 0.0);
+        UpdateNodeAttributes();
+    }
+}
+
+void SceneResetRotation()
+{
+    if (editNode !is null)
+    {
+        editNode.rotation = Quaternion();
+        UpdateNodeAttributes();
+    }
+}
+
+void SceneResetScale()
+{
+    if (editNode !is null)
+    {
+        editNode.scale = Vector3(1.0, 1.0, 1.0);
+        UpdateNodeAttributes();
+    }
+}
+
 void SceneSelectAll()
 {
     ListView@ list = sceneWindow.GetChild("NodeList", true);

+ 3 - 2
Bin/Data/Scripts/Editor/EditorSceneWindow.as

@@ -721,9 +721,10 @@ void HandleCreateComponent(StringHash eventType, VariantMap& eventData)
 
 void HandleBoneHierarchyCreated(StringHash eventType, VariantMap& eventData)
 {
+    Node@ node = eventData["Node"].GetNode();
     ListView@ list = sceneWindow.GetChild("NodeList", true);
-    if (list.numItems > 0)
-        UpdateSceneWindowNode(eventData["Node"].GetNode());
+    if (list.numItems > 0 && GetNodeListIndex(node) != NO_ITEM)
+        UpdateSceneWindowNode(node);
 }
 
 bool CheckSceneWindowFocus()

+ 13 - 1
Bin/Data/Scripts/Editor/EditorUI.as

@@ -87,8 +87,11 @@ void CreateMenuBar()
         editPopup.AddChild(CreateMenuItem("Copy", 'C', QUAL_CTRL));
         editPopup.AddChild(CreateMenuItem("Paste", 'V', QUAL_CTRL));
         editPopup.AddChild(CreateMenuItem("Delete", KEY_DELETE, QUAL_ANY));
-        editPopup.AddChild(CreateMenuDivider());
         editPopup.AddChild(CreateMenuItem("Select all", 'A', QUAL_CTRL));
+        editPopup.AddChild(CreateMenuDivider());
+        editPopup.AddChild(CreateMenuItem("Reset position", 0, 0));
+        editPopup.AddChild(CreateMenuItem("Reset rotation", 0, 0));
+        editPopup.AddChild(CreateMenuItem("Reset scale", 0, 0));
         editPopup.AddChild(CreateMenuItem("Unparent", 'U', QUAL_CTRL));
         editPopup.AddChild(CreateMenuDivider());
         editPopup.AddChild(CreateMenuItem("Toggle update", 'P', QUAL_CTRL));
@@ -335,6 +338,15 @@ void HandleMenuSelected(StringHash eventType, VariantMap& eventData)
     if (action == "Delete")
         SceneDelete();
 
+    if (action == "Reset position")
+        SceneResetPosition();
+    
+    if (action == "Reset rotation")
+        SceneResetRotation();
+    
+    if (action == "Reset scale")
+        SceneResetScale();
+
     if (action == "Unparent")
         SceneUnparent();
 

+ 12 - 9
Engine/Scene/Node.cpp

@@ -1022,7 +1022,7 @@ void Node::UpdateSmoothing(float constant, float squaredSnapThreshold)
         MarkDirty();
 }
 
-bool Node::Load(Deserializer& source, SceneResolver& resolver, bool readChildren, bool rewriteIDs)
+bool Node::Load(Deserializer& source, SceneResolver& resolver, bool readChildren, bool rewriteIDs, CreateMode mode)
 {
     // Remove all children and components first in case this is not a fresh load
     RemoveAllChildren();
@@ -1038,7 +1038,8 @@ bool Node::Load(Deserializer& source, SceneResolver& resolver, bool readChildren
         VectorBuffer compBuffer(source, source.ReadVLE());
         ShortStringHash compType = compBuffer.ReadShortStringHash();
         unsigned compID = compBuffer.ReadUInt();
-        Component* newComponent = CreateComponent(compType, rewriteIDs ? 0 : compID, compID < FIRST_LOCAL_ID ? REPLICATED : LOCAL);
+        Component* newComponent = CreateComponent(compType, rewriteIDs ? 0 : compID, (mode == REPLICATED &&
+            compID < FIRST_LOCAL_ID) ? REPLICATED : LOCAL);
         if (newComponent)
         {
             resolver.AddComponent(compID, newComponent);
@@ -1054,16 +1055,17 @@ bool Node::Load(Deserializer& source, SceneResolver& resolver, bool readChildren
     for (unsigned i = 0; i < numChildren; ++i)
     {
         unsigned nodeID = source.ReadUInt();
-        Node* newNode = CreateChild(rewriteIDs ? 0 : nodeID, nodeID < FIRST_LOCAL_ID ? REPLICATED : LOCAL);
+        Node* newNode = CreateChild(rewriteIDs ? 0 : nodeID, (mode == REPLICATED && nodeID < FIRST_LOCAL_ID) ? REPLICATED :
+            LOCAL);
         resolver.AddNode(nodeID, newNode);
-        if (!newNode->Load(source, resolver, readChildren, rewriteIDs))
+        if (!newNode->Load(source, resolver, readChildren, rewriteIDs, mode))
             return false;
     }
     
     return true;
 }
 
-bool Node::LoadXML(const XMLElement& source, SceneResolver& resolver, bool readChildren, bool rewriteIDs)
+bool Node::LoadXML(const XMLElement& source, SceneResolver& resolver, bool readChildren, bool rewriteIDs, CreateMode mode)
 {
     // Remove all children and components first in case this is not a fresh load
     RemoveAllChildren();
@@ -1077,8 +1079,8 @@ bool Node::LoadXML(const XMLElement& source, SceneResolver& resolver, bool readC
     {
         String typeName = compElem.GetString("type");
         unsigned compID = compElem.GetInt("id");
-        Component* newComponent = CreateComponent(ShortStringHash(typeName), rewriteIDs ? 0 : compID, compID < FIRST_LOCAL_ID ?
-            REPLICATED : LOCAL);
+        Component* newComponent = CreateComponent(ShortStringHash(typeName), rewriteIDs ? 0 : compID, (mode == REPLICATED &&
+            compID < FIRST_LOCAL_ID) ? REPLICATED : LOCAL);
         if (newComponent)
         {
             resolver.AddComponent(compID, newComponent);
@@ -1096,9 +1098,10 @@ bool Node::LoadXML(const XMLElement& source, SceneResolver& resolver, bool readC
     while (childElem)
     {
         unsigned nodeID = childElem.GetInt("id");
-        Node* newNode = CreateChild(rewriteIDs ? 0 : nodeID, nodeID < FIRST_LOCAL_ID ? REPLICATED : LOCAL);
+        Node* newNode = CreateChild(rewriteIDs ? 0 : nodeID, (mode == REPLICATED && nodeID < FIRST_LOCAL_ID) ? REPLICATED :
+            LOCAL);
         resolver.AddNode(nodeID, newNode);
-        if (!newNode->LoadXML(childElem, resolver, readChildren, rewriteIDs))
+        if (!newNode->LoadXML(childElem, resolver, readChildren, rewriteIDs, mode))
             return false;
         
         childElem = childElem.GetNext("node");

+ 2 - 2
Engine/Scene/Node.h

@@ -322,9 +322,9 @@ public:
     /// Update motion smoothing. Called by Scene.
     void UpdateSmoothing(float constant, float squaredSnapThreshold);
     /// Load components and optionally load child nodes.
-    bool Load(Deserializer& source, SceneResolver& resolver, bool loadChildren = true, bool rewriteIDs = false);
+    bool Load(Deserializer& source, SceneResolver& resolver, bool loadChildren = true, bool rewriteIDs = false, CreateMode mode = REPLICATED);
     /// Load components from XML data and optionally load child nodes.
-    bool LoadXML(const XMLElement& source, SceneResolver& resolver, bool loadChildren = true, bool rewriteIDs = false);
+    bool LoadXML(const XMLElement& source, SceneResolver& resolver, bool loadChildren = true, bool rewriteIDs = false, CreateMode mode = REPLICATED);
     
     /// User variables.
     VariantMap vars_;

+ 2 - 2
Engine/Scene/Scene.cpp

@@ -281,7 +281,7 @@ Node* Scene::Instantiate(Deserializer& source, const Vector3& position, const Qu
     // Rewrite IDs when instantiating
     Node* node = CreateChild(0, mode);
     resolver.AddNode(nodeID, node);
-    if (node->Load(source, resolver, true, true))
+    if (node->Load(source, resolver, true, true, mode))
     {
         resolver.Resolve();
         node->ApplyAttributes();
@@ -311,7 +311,7 @@ Node* Scene::InstantiateXML(const XMLElement& source, const Vector3& position, c
     // Rewrite IDs when instantiating
     Node* node = CreateChild(0, mode);
     resolver.AddNode(nodeID, node);
-    if (node->LoadXML(source, resolver, true, true))
+    if (node->LoadXML(source, resolver, true, true, mode))
     {
         resolver.Resolve();
         node->ApplyAttributes();