| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- #include "BsCmdUtility.h"
- #include "BsSceneObject.h"
- namespace BansheeEngine
- {
- CmdUtility::SceneObjProxy CmdUtility::createProxy(const HSceneObject& sceneObject)
- {
- struct TempData
- {
- TempData(SceneObjProxy& proxy, const HSceneObject& so)
- :proxy(proxy), obj(so)
- { }
- SceneObjProxy& proxy;
- HSceneObject obj;
- };
- SceneObjProxy rootProxy;
- Stack<TempData> todo;
- todo.push(TempData(rootProxy, sceneObject));
- while (!todo.empty())
- {
- TempData data = todo.top();
- todo.pop();
- data.proxy.instanceData = data.obj->_getInstanceData();
- const Vector<HComponent>& components = data.obj->getComponents();
- for (auto& component : components)
- data.proxy.componentInstanceData.push_back(component->_getInstanceData());
- UINT32 numChildren = data.obj->getNumChildren();
- data.proxy.children.resize(numChildren);
- for (UINT32 i = 0; i < numChildren; i++)
- {
- todo.push(TempData(data.proxy.children[i], data.obj->getChild(i)));
- }
- }
- return rootProxy;
- }
- void CmdUtility::restoreIds(const HSceneObject& restored, SceneObjProxy& proxy)
- {
- // Note: This method relies that all restored GameObject handles pointing to the
- // same object also have the same shared handle data (Since I only update instance
- // data on a single handle I know exists, and expect all others will be updated
- // by that as well).
- struct TempData
- {
- TempData(SceneObjProxy& proxy, const HSceneObject& restoredObj)
- :proxy(proxy), restoredObj(restoredObj)
- { }
- SceneObjProxy& proxy;
- HSceneObject restoredObj;
- };
- Stack<TempData> todo;
- todo.push(TempData(proxy, restored));
- while (!todo.empty())
- {
- TempData data = todo.top();
- todo.pop();
- data.restoredObj->_setInstanceData(data.proxy.instanceData);
- // Find components that are still active and swap the old ones with restored ones,
- // keep any other as is.
- const Vector<HComponent>& restoredComponents = data.restoredObj->getComponents();
- UINT32 idx = 0;
- for (auto& restoredComponent : restoredComponents)
- {
- restoredComponent->_setInstanceData(data.proxy.componentInstanceData[idx]);
- GameObjectPtr restoredPtr = std::static_pointer_cast<GameObject>(restoredComponent.getInternalPtr());
- HComponent restoredComponentCopy = restoredComponent; // To remove const
- restoredComponentCopy._setHandleData(restoredPtr);
- idx++;
- }
-
- // Find children that are still active and swap the old ones with restored ones,
- // keep any other as is
- UINT32 restoredNumChildren = data.restoredObj->getNumChildren();
- for (UINT32 i = 0; i < restoredNumChildren; i++)
- {
- todo.push(TempData(data.proxy.children[i], data.restoredObj->getChild(i)));
- }
- }
- }
- }
|