Browse Source

Fixing a prefab bug where managed components of child objects weren't being initialized
When cleaning the scene properly clean the root object too
When updating from prefab, handle a case when scene root is provided as input (search all children)

BearishSun 9 years ago
parent
commit
6a0c7b1cf2

+ 3 - 2
Source/BansheeCore/Include/BsSceneObject.h

@@ -71,9 +71,10 @@ namespace BansheeEngine
 		/**
 		/**
 		 * Returns the UUID of the prefab this object is linked to, if any. 
 		 * Returns the UUID of the prefab this object is linked to, if any. 
 		 *
 		 *
-		 * @note	Requires a search of all parents potentially.
+		 * @param[in]	onlyDirect	If true, this method will return prefab link only for the root object of the prefab
+		 *							instance. If false the parent objects will be searched for the prefab ID.
 		 */
 		 */
-		String getPrefabLink() const;
+		String getPrefabLink(bool onlyDirect = false) const;
 
 
 		/** 
 		/** 
 		 * Returns the root object of the prefab instance that this object belongs to, if any. Returns null if the object 
 		 * Returns the root object of the prefab instance that this object belongs to, if any. Returns null if the object 

+ 3 - 0
Source/BansheeCore/Source/BsCoreSceneManager.cpp

@@ -36,6 +36,9 @@ namespace BansheeEngine
 		}
 		}
 
 
 		GameObjectManager::instance().destroyQueuedObjects();
 		GameObjectManager::instance().destroyQueuedObjects();
+
+		HSceneObject newRoot = SceneObject::createInternal("SceneRoot");
+		_setRootNode(newRoot);
 	}
 	}
 
 
 	void CoreSceneManager::_setRootNode(const HSceneObject& root)
 	void CoreSceneManager::_setRootNode(const HSceneObject& root)

+ 3 - 0
Source/BansheeCore/Source/BsPrefabUtility.cpp

@@ -51,6 +51,9 @@ namespace BansheeEngine
 				topLevelObject = nullptr;
 				topLevelObject = nullptr;
 		}
 		}
 
 
+		if (topLevelObject == nullptr)
+			topLevelObject = so;
+
 		Stack<HSceneObject> todo;
 		Stack<HSceneObject> todo;
 		todo.push(topLevelObject);
 		todo.push(topLevelObject);
 
 

+ 4 - 4
Source/BansheeCore/Source/BsSceneObject.cpp

@@ -119,7 +119,7 @@ namespace BansheeEngine
 		mThisHandle._setHandleData(thisPtr);
 		mThisHandle._setHandleData(thisPtr);
 	}
 	}
 
 
-	String SceneObject::getPrefabLink() const
+	String SceneObject::getPrefabLink(bool onlyDirect) const
 	{
 	{
 		const SceneObject* curObj = this;
 		const SceneObject* curObj = this;
 
 
@@ -128,7 +128,7 @@ namespace BansheeEngine
 			if (!curObj->mPrefabLinkUUID.empty())
 			if (!curObj->mPrefabLinkUUID.empty())
 				return curObj->mPrefabLinkUUID;
 				return curObj->mPrefabLinkUUID;
 
 
-			if (curObj->mParent != nullptr)
+			if (curObj->mParent != nullptr && !onlyDirect)
 				curObj = curObj->mParent.get();
 				curObj = curObj->mParent.get();
 			else
 			else
 				curObj = nullptr;
 				curObj = nullptr;
@@ -213,7 +213,7 @@ namespace BansheeEngine
 
 
 			for (auto& child : obj->mChildren)
 			for (auto& child : obj->mChildren)
 			{
 			{
-				if(!prefabOnly || child->getPrefabLink().empty())
+				if(!prefabOnly || child->mPrefabLinkUUID.empty())
 					instantiateRecursive(child.get());
 					instantiateRecursive(child.get());
 			}
 			}
 		};
 		};
@@ -230,7 +230,7 @@ namespace BansheeEngine
 
 
 			for (auto& child : obj->mChildren)
 			for (auto& child : obj->mChildren)
 			{
 			{
-				if (!prefabOnly || child->getPrefabLink().empty())
+				if (!prefabOnly || child->mPrefabLinkUUID.empty())
 					triggerEventsRecursive(child.get());
 					triggerEventsRecursive(child.get());
 			}
 			}
 		};
 		};

+ 2 - 2
Source/SBansheeEditor/Source/BsScriptPrefabUtility.cpp

@@ -66,7 +66,7 @@ namespace BansheeEngine
 		if (ScriptSceneObject::checkIfDestroyed(nativeInstance))
 		if (ScriptSceneObject::checkIfDestroyed(nativeInstance))
 			return false;
 			return false;
 
 
-		return !nativeInstance->getNativeSceneObject()->getPrefabLink().empty();
+		return !nativeInstance->getNativeSceneObject()->getPrefabLink(true).empty();
 	}
 	}
 
 
 	MonoObject* ScriptPrefabUtility::internal_getPrefabParent(ScriptSceneObject* nativeInstance)
 	MonoObject* ScriptPrefabUtility::internal_getPrefabParent(ScriptSceneObject* nativeInstance)
@@ -93,7 +93,7 @@ namespace BansheeEngine
 
 
 		HSceneObject so = nativeInstance->getNativeSceneObject();
 		HSceneObject so = nativeInstance->getNativeSceneObject();
 
 
-		String prefabUUID = nativeInstance->getNativeSceneObject()->getPrefabLink();
+		String prefabUUID = nativeInstance->getNativeSceneObject()->getPrefabLink(true);
 		if (prefabUUID.empty())
 		if (prefabUUID.empty())
 			return nullptr;
 			return nullptr;