Procházet zdrojové kódy

Cleaned up SceneResolver related code. Moved post-load ApplyAttributes() to Node.

Lasse Öörni před 14 roky
rodič
revize
9abf84de11
4 změnil soubory, kde provedl 24 přidání a 22 odebrání
  1. 16 14
      Engine/Scene/Node.cpp
  2. 2 2
      Engine/Scene/Node.h
  3. 5 5
      Engine/Scene/Scene.cpp
  4. 1 1
      Engine/Scene/Scene.h

+ 16 - 14
Engine/Scene/Node.cpp

@@ -100,9 +100,12 @@ void Node::OnEvent(Object* sender, bool broadcast, StringHash eventType, Variant
 bool Node::Load(Deserializer& source)
 {
     SceneResolver resolver;
-    bool success = Load(source, true, &resolver);
+    bool success = Load(source, resolver);
     if (success)
+    {
         resolver.Resolve();
+        ApplyAttributes();
+    }
     
     return success;
 }
@@ -142,9 +145,12 @@ bool Node::LoadXML(const XMLElement& source)
 {
     SceneResolver resolver;
     
-    bool success = LoadXML(source, true, &resolver);
+    bool success = LoadXML(source, resolver);
     if (success)
+    {
         resolver.Resolve();
+        ApplyAttributes();
+    }
     
     return success;
 }
@@ -986,7 +992,7 @@ void Node::UpdateSmoothing(float constant, float squaredSnapThreshold)
         MarkDirty();
 }
 
-bool Node::Load(Deserializer& source, bool readChildren, SceneResolver* resolver)
+bool Node::Load(Deserializer& source, SceneResolver& resolver, bool readChildren)
 {
     // Remove all children and components first in case this is not a fresh load
     RemoveAllChildren();
@@ -1005,8 +1011,7 @@ bool Node::Load(Deserializer& source, bool readChildren, SceneResolver* resolver
         Component* newComponent = CreateComponent(compType, compID, id_ < FIRST_LOCAL_ID ? REPLICATED : LOCAL);
         if (newComponent)
         {
-            if (resolver)
-                resolver->AddComponent(compID, newComponent);
+            resolver.AddComponent(compID, newComponent);
             if (!newComponent->Load(compBuffer))
                 return false;
         }
@@ -1020,16 +1025,15 @@ bool Node::Load(Deserializer& source, bool readChildren, SceneResolver* resolver
     {
         unsigned nodeID = source.ReadUInt();
         Node* newNode = CreateChild(nodeID, id_ < FIRST_LOCAL_ID ? REPLICATED : LOCAL);
-        if (resolver)
-            resolver->AddNode(nodeID, newNode);
-        if (!newNode->Load(source, true, resolver))
+        resolver.AddNode(nodeID, newNode);
+        if (!newNode->Load(source, resolver))
             return false;
     }
     
     return true;
 }
 
-bool Node::LoadXML(const XMLElement& source, bool readChildren, SceneResolver* resolver)
+bool Node::LoadXML(const XMLElement& source, SceneResolver& resolver, bool readChildren)
 {
     // Remove all children and components first in case this is not a fresh load
     RemoveAllChildren();
@@ -1046,8 +1050,7 @@ bool Node::LoadXML(const XMLElement& source, bool readChildren, SceneResolver* r
         Component* newComponent = CreateComponent(ShortStringHash(typeName), compID, id_ < FIRST_LOCAL_ID ? REPLICATED : LOCAL);
         if (newComponent)
         {
-            if (resolver)
-                resolver->AddComponent(compID, newComponent);
+            resolver.AddComponent(compID, newComponent);
             if (!newComponent->LoadXML(compElem))
                 return false;
         }
@@ -1063,9 +1066,8 @@ bool Node::LoadXML(const XMLElement& source, bool readChildren, SceneResolver* r
     {
         unsigned nodeID = childElem.GetInt("id");
         Node* newNode = CreateChild(nodeID, id_ < FIRST_LOCAL_ID ? REPLICATED : LOCAL);
-        if (resolver)
-            resolver->AddNode(nodeID, newNode);
-        if (!newNode->LoadXML(childElem, true, resolver))
+        resolver.AddNode(nodeID, newNode);
+        if (!newNode->LoadXML(childElem, resolver))
             return false;
         
         childElem = childElem.GetNext("node");

+ 2 - 2
Engine/Scene/Node.h

@@ -320,9 +320,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, bool loadChildren, SceneResolver* resolver);
+    bool Load(Deserializer& source, SceneResolver& resolver, bool loadChildren = true);
     /// Load components from XML data and optionally load child nodes.
-    bool LoadXML(const XMLElement& source, bool loadChildren, SceneResolver* resolver);
+    bool LoadXML(const XMLElement& source, SceneResolver& resolver, bool loadChildren = true);
     
     /// User variables.
     VariantMap vars_;

+ 5 - 5
Engine/Scene/Scene.cpp

@@ -200,7 +200,7 @@ bool Scene::LoadAsync(File* file)
     
     // Clear the previous scene and load the root level components first
     Clear();
-    if (!Node::Load(*file, false, &resolver_))
+    if (!Node::Load(*file, resolver_, false))
         return false;
     
     // Then prepare for loading all root level child nodes in the async update
@@ -233,7 +233,7 @@ bool Scene::LoadAsyncXML(File* file)
     // Clear the previous scene and load the root level components first
     Clear();
     XMLElement rootElement = xmlFile->GetRoot();
-    if (!Node::LoadXML(rootElement, false, &resolver_))
+    if (!Node::LoadXML(rootElement, resolver_, false))
         return false;
     
     // Then prepare for loading all root level child nodes in the async update
@@ -587,12 +587,12 @@ void Scene::UpdateAsyncLoading()
         if (!asyncProgress_.xmlFile_)
         {
             Node* newNode = CreateChild(asyncProgress_.file_->ReadUInt(), REPLICATED);
-            newNode->Load(*asyncProgress_.file_, true, &resolver_);
+            newNode->Load(*asyncProgress_.file_, resolver_);
         }
         else
         {
             Node* newNode = CreateChild(asyncProgress_.xmlElement_.GetInt("id"), REPLICATED);
-            newNode->LoadXML(asyncProgress_.xmlElement_, true, &resolver_);
+            newNode->LoadXML(asyncProgress_.xmlElement_, resolver_);
             asyncProgress_.xmlElement_ = asyncProgress_.xmlElement_.GetNext("node");
         }
         
@@ -616,6 +616,7 @@ void Scene::UpdateAsyncLoading()
 void Scene::FinishAsyncLoading()
 {
     resolver_.Resolve();
+    ApplyAttributes();
     FinishLoading(asyncProgress_.file_);
     StopAsyncLoading();
     
@@ -628,7 +629,6 @@ void Scene::FinishAsyncLoading()
 
 void Scene::FinishLoading(Deserializer* source)
 {
-    ApplyAttributes();
     if (source)
     {
         fileName_ = source->GetName();

+ 1 - 1
Engine/Scene/Scene.h

@@ -166,7 +166,7 @@ private:
     void UpdateAsyncLoading();
     /// Finish asynchronous loading.
     void FinishAsyncLoading();
-    /// Finish loading. Calls ApplyAttributes() recursively to the whole scene.
+    /// Finish loading. Sets the scene filename and checksum.
     void FinishLoading(Deserializer* source);
     
     /// Map of scene nodes by ID.