Node* Node::Clone(CreateMode mode) { // The scene itself can not be cloned if (this == scene_ || !parent_) { LOGERROR("Can not clone node without a parent"); return 0; } PROFILE(CloneNode); SceneResolver resolver; Node* clone = CloneRecursive(parent_, resolver, mode); resolver.Resolve(); clone->ApplyAttributes(); return clone; }
bool Node::Load(Deserializer& source, bool setInstanceDefault) { SceneResolver resolver; // Read own ID. Will not be applied, only stored for resolving possible references unsigned nodeID = source.ReadInt(); resolver.AddNode(nodeID, this); // Read attributes, components and child nodes bool success = Load(source, resolver); if (success) { resolver.Resolve(); ApplyAttributes(); } return success; }
bool Node::LoadXML(const XMLElement& source) { SceneResolver resolver; // Read own ID. Will not be applied, only stored for resolving possible references unsigned nodeID = source.GetInt("id"); resolver.AddNode(nodeID, this); // Read attributes, components and child nodes bool success = LoadXML(source, resolver); if (success) { resolver.Resolve(); ApplyAttributes(); } return success; }
Node* Scene::InstantiateXML(const XMLElement& source, const Vector3& position, const Quaternion& rotation, CreateMode mode) { PROFILE(InstantiateXML); SceneResolver resolver; unsigned nodeID = source.GetInt("id"); // Rewrite IDs when instantiating Node* node = CreateChild(0, mode); resolver.AddNode(nodeID, node); if (node->LoadXML(source, resolver, true, true, mode)) { resolver.Resolve(); node->ApplyAttributes(); node->SetTransform(position, rotation); return node; } else { node->Remove(); return 0; } }
Node* Scene::Instantiate(Deserializer& source, const Vector3& position, const Quaternion& rotation, CreateMode mode) { URHO3D_PROFILE(Instantiate); SceneResolver resolver; unsigned nodeID = source.ReadUInt(); // Rewrite IDs when instantiating Node* node = CreateChild(0, mode); resolver.AddNode(nodeID, node); if (node->Load(source, resolver, true, true, mode)) { resolver.Resolve(); node->ApplyAttributes(); node->SetTransform(position, rotation); return node; } else { node->Remove(); return 0; } }