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();
     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()
 void SceneSelectAll()
 {
 {
     ListView@ list = sceneWindow.GetChild("NodeList", true);
     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)
 void HandleBoneHierarchyCreated(StringHash eventType, VariantMap& eventData)
 {
 {
+    Node@ node = eventData["Node"].GetNode();
     ListView@ list = sceneWindow.GetChild("NodeList", true);
     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()
 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("Copy", 'C', QUAL_CTRL));
         editPopup.AddChild(CreateMenuItem("Paste", 'V', QUAL_CTRL));
         editPopup.AddChild(CreateMenuItem("Paste", 'V', QUAL_CTRL));
         editPopup.AddChild(CreateMenuItem("Delete", KEY_DELETE, QUAL_ANY));
         editPopup.AddChild(CreateMenuItem("Delete", KEY_DELETE, QUAL_ANY));
-        editPopup.AddChild(CreateMenuDivider());
         editPopup.AddChild(CreateMenuItem("Select all", 'A', QUAL_CTRL));
         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(CreateMenuItem("Unparent", 'U', QUAL_CTRL));
         editPopup.AddChild(CreateMenuDivider());
         editPopup.AddChild(CreateMenuDivider());
         editPopup.AddChild(CreateMenuItem("Toggle update", 'P', QUAL_CTRL));
         editPopup.AddChild(CreateMenuItem("Toggle update", 'P', QUAL_CTRL));
@@ -335,6 +338,15 @@ void HandleMenuSelected(StringHash eventType, VariantMap& eventData)
     if (action == "Delete")
     if (action == "Delete")
         SceneDelete();
         SceneDelete();
 
 
+    if (action == "Reset position")
+        SceneResetPosition();
+    
+    if (action == "Reset rotation")
+        SceneResetRotation();
+    
+    if (action == "Reset scale")
+        SceneResetScale();
+
     if (action == "Unparent")
     if (action == "Unparent")
         SceneUnparent();
         SceneUnparent();
 
 

+ 12 - 9
Engine/Scene/Node.cpp

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

+ 2 - 2
Engine/Scene/Node.h

@@ -322,9 +322,9 @@ public:
     /// Update motion smoothing. Called by Scene.
     /// Update motion smoothing. Called by Scene.
     void UpdateSmoothing(float constant, float squaredSnapThreshold);
     void UpdateSmoothing(float constant, float squaredSnapThreshold);
     /// Load components and optionally load child nodes.
     /// 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.
     /// 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.
     /// User variables.
     VariantMap vars_;
     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
     // Rewrite IDs when instantiating
     Node* node = CreateChild(0, mode);
     Node* node = CreateChild(0, mode);
     resolver.AddNode(nodeID, node);
     resolver.AddNode(nodeID, node);
-    if (node->Load(source, resolver, true, true))
+    if (node->Load(source, resolver, true, true, mode))
     {
     {
         resolver.Resolve();
         resolver.Resolve();
         node->ApplyAttributes();
         node->ApplyAttributes();
@@ -311,7 +311,7 @@ Node* Scene::InstantiateXML(const XMLElement& source, const Vector3& position, c
     // Rewrite IDs when instantiating
     // Rewrite IDs when instantiating
     Node* node = CreateChild(0, mode);
     Node* node = CreateChild(0, mode);
     resolver.AddNode(nodeID, node);
     resolver.AddNode(nodeID, node);
-    if (node->LoadXML(source, resolver, true, true))
+    if (node->LoadXML(source, resolver, true, true, mode))
     {
     {
         resolver.Resolve();
         resolver.Resolve();
         node->ApplyAttributes();
         node->ApplyAttributes();