BsGameObjectManager.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. #include "BsGameObjectManager.h"
  2. #include "BsGameObject.h"
  3. namespace BansheeEngine
  4. {
  5. GameObjectManager::GameObjectManager()
  6. :mNextAvailableID(1), mIsDeserializationActive(false), mGODeserializationMode(GODM_UseNewIds | GODM_BreakExternal)
  7. {
  8. }
  9. GameObjectManager::~GameObjectManager()
  10. {
  11. destroyQueuedObjects();
  12. }
  13. GameObjectHandleBase GameObjectManager::getObject(UINT64 id) const
  14. {
  15. auto iterFind = mObjects.find(id);
  16. if(iterFind != mObjects.end())
  17. return iterFind->second;
  18. return nullptr;
  19. }
  20. bool GameObjectManager::tryGetObject(UINT64 id, GameObjectHandleBase& object) const
  21. {
  22. auto iterFind = mObjects.find(id);
  23. if(iterFind != mObjects.end())
  24. {
  25. object = iterFind->second;
  26. return true;
  27. }
  28. return false;
  29. }
  30. bool GameObjectManager::objectExists(UINT64 id) const
  31. {
  32. return mObjects.find(id) != mObjects.end();
  33. }
  34. void GameObjectManager::remapId(UINT64 oldId, UINT64 newId)
  35. {
  36. if (oldId == newId)
  37. return;
  38. mObjects[newId] = mObjects[oldId];
  39. mObjects.erase(oldId);
  40. }
  41. void GameObjectManager::queueForDestroy(const GameObjectHandleBase& object)
  42. {
  43. if (object.isDestroyed())
  44. return;
  45. UINT64 instanceId = object->getInstanceId();
  46. mQueuedForDestroy[instanceId] = object;
  47. }
  48. void GameObjectManager::destroyQueuedObjects()
  49. {
  50. for (auto& objPair : mQueuedForDestroy)
  51. objPair.second->destroyInternal(objPair.second, true);
  52. mQueuedForDestroy.clear();
  53. }
  54. GameObjectHandleBase GameObjectManager::registerObject(const std::shared_ptr<GameObject>& object)
  55. {
  56. object->initialize(object, mNextAvailableID);
  57. GameObjectHandleBase handle(object);
  58. mObjects[mNextAvailableID] = handle;
  59. mNextAvailableID++;
  60. return handle;
  61. }
  62. void GameObjectManager::unregisterObject(const GameObjectHandleBase& object)
  63. {
  64. mObjects.erase(object->getInstanceId());
  65. }
  66. void GameObjectManager::startDeserialization()
  67. {
  68. assert(!mIsDeserializationActive);
  69. mIsDeserializationActive = true;
  70. }
  71. void GameObjectManager::endDeserialization()
  72. {
  73. assert(mIsDeserializationActive);
  74. for(auto& unresolvedHandle : mUnresolvedHandles)
  75. resolveDeserializedHandle(unresolvedHandle, mGODeserializationMode);
  76. for(auto iter = mEndCallbacks.rbegin(); iter != mEndCallbacks.rend(); ++iter)
  77. {
  78. (*iter)();
  79. }
  80. mIsDeserializationActive = false;
  81. mActiveDeserializedObject = nullptr;
  82. mIdMapping.clear();
  83. mUnresolvedHandles.clear();
  84. mEndCallbacks.clear();
  85. }
  86. void GameObjectManager::resolveDeserializedHandle(GameObjectHandleBase& handle, UINT32 flags)
  87. {
  88. assert(mIsDeserializationActive);
  89. UINT64 instanceId = handle.getInstanceId();
  90. bool isInternalReference = false;
  91. auto findIter = mIdMapping.find(instanceId);
  92. if (findIter != mIdMapping.end())
  93. {
  94. if ((flags & GODM_UseNewIds) != 0)
  95. instanceId = findIter->second;
  96. isInternalReference = true;
  97. }
  98. if (isInternalReference || (!isInternalReference && (flags & GODM_RestoreExternal) != 0))
  99. {
  100. auto findIterObj = mObjects.find(instanceId);
  101. if (findIterObj != mObjects.end())
  102. handle._resolve(findIterObj->second);
  103. else
  104. {
  105. if ((flags & GODM_KeepMissing) == 0)
  106. handle._resolve(nullptr);
  107. }
  108. }
  109. else
  110. {
  111. if ((flags & GODM_KeepMissing) == 0)
  112. handle._resolve(nullptr);
  113. }
  114. }
  115. void GameObjectManager::registerDeserializedId(UINT64 serializedId, UINT64 actualId)
  116. {
  117. #if BS_DEBUG_MODE
  118. if(!mIsDeserializationActive)
  119. {
  120. BS_EXCEPT(InvalidStateException, "ID mapping may only be modified while deserialization is active.");
  121. }
  122. #endif
  123. mIdMapping[serializedId] = actualId;
  124. }
  125. void GameObjectManager::registerUnresolvedHandle(const GameObjectHandleBase& object)
  126. {
  127. #if BS_DEBUG_MODE
  128. if(!mIsDeserializationActive)
  129. {
  130. BS_EXCEPT(InvalidStateException, "Unresolved handle queue only be modified while deserialization is active.");
  131. }
  132. #endif
  133. mUnresolvedHandles.push_back(object);
  134. }
  135. void GameObjectManager::registerOnDeserializationEndCallback(std::function<void()> callback)
  136. {
  137. #if BS_DEBUG_MODE
  138. if(!mIsDeserializationActive)
  139. {
  140. BS_EXCEPT(InvalidStateException, "Callback queue only be modified while deserialization is active.");
  141. }
  142. #endif
  143. mEndCallbacks.push_back(callback);
  144. }
  145. void GameObjectManager::setDeserializationMode(UINT32 gameObjectDeserializationMode)
  146. {
  147. #if BS_DEBUG_MODE
  148. if (mIsDeserializationActive)
  149. {
  150. BS_EXCEPT(InvalidStateException, "Deserialization modes can not be modified when deserialization is not active.");
  151. }
  152. #endif
  153. mGODeserializationMode = gameObjectDeserializationMode;
  154. }
  155. }