void Prefab::initialize(const HSceneObject& sceneObject) { sceneObject->mPrefabDiff = nullptr; UINT32 newNextLinkId = PrefabUtility::generatePrefabIds(sceneObject, mNextLinkId); if (newNextLinkId < mNextLinkId) { BS_EXCEPT(InternalErrorException, "Prefab ran out of IDs to assign. " \ "Consider increasing the size of the prefab ID data type."); } mNextLinkId = newNextLinkId; // If there are any child prefab instances, make sure to update their diffs so they are saved with this prefab Stack<HSceneObject> todo; todo.push(sceneObject); while (!todo.empty()) { HSceneObject current = todo.top(); todo.pop(); UINT32 childCount = current->getNumChildren(); for (UINT32 i = 0; i < childCount; i++) { HSceneObject child = current->getChild(i); if (!child->mPrefabLinkUUID.empty()) PrefabUtility::recordPrefabDiff(child); else todo.push(child); } } // Clone the hierarchy for internal storage mRoot = sceneObject->clone(false); mRoot->mParent = nullptr; // Remove objects with "dont save" flag todo.push(mRoot); while (!todo.empty()) { HSceneObject current = todo.top(); todo.pop(); if (current->hasFlag(SOF_DontSave)) current->destroy(); else { UINT32 numChildren = current->getNumChildren(); for (UINT32 i = 0; i < numChildren; i++) todo.push(current->getChild(i)); } } }
void Prefab::initialize(const HSceneObject& sceneObject) { sceneObject->mPrefabDiff = nullptr; PrefabUtility::generatePrefabIds(sceneObject); // If there are any child prefab instances, make sure to update their diffs so they are saved with this prefab Stack<HSceneObject> todo; todo.push(sceneObject); while (!todo.empty()) { HSceneObject current = todo.top(); todo.pop(); UINT32 childCount = current->getNumChildren(); for (UINT32 i = 0; i < childCount; i++) { HSceneObject child = current->getChild(i); if (!child->mPrefabLinkUUID.empty()) PrefabUtility::recordPrefabDiff(child); else todo.push(child); } } // Clone the hierarchy for internal storage if (mRoot != nullptr) mRoot->destroy(true); mRoot = sceneObject->clone(false); mRoot->mParent = nullptr; mRoot->mLinkId = -1; // Remove objects with "dont save" flag todo.push(mRoot); while (!todo.empty()) { HSceneObject current = todo.top(); todo.pop(); if (current->hasFlag(SOF_DontSave)) current->destroy(); else { UINT32 numChildren = current->getNumChildren(); for (UINT32 i = 0; i < numChildren; i++) todo.push(current->getChild(i)); } } }