소스 검색

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 년 전
부모
커밋
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();