BsGameObjectManager.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. //__________________________ Banshee Project - A modern game development toolkit _________________________________//
  2. //_____________________________________ www.banshee-project.com __________________________________________________//
  3. //________________________ Copyright (c) 2014 Marko Pintera. All rights reserved. ________________________________//
  4. #include "BsGameObjectManager.h"
  5. #include "BsGameObject.h"
  6. namespace BansheeEngine
  7. {
  8. GameObjectManager::GameObjectManager()
  9. :mNextAvailableID(1), mIsDeserializationActive(false)
  10. {
  11. }
  12. GameObjectManager::~GameObjectManager()
  13. { }
  14. GameObjectHandleBase GameObjectManager::getObject(UINT64 id) const
  15. {
  16. auto iterFind = mObjects.find(id);
  17. if(iterFind != mObjects.end())
  18. return iterFind->second;
  19. return nullptr;
  20. }
  21. bool GameObjectManager::tryGetObject(UINT64 id, GameObjectHandleBase& object) const
  22. {
  23. auto iterFind = mObjects.find(id);
  24. if(iterFind != mObjects.end())
  25. {
  26. object = iterFind->second;
  27. return true;
  28. }
  29. return false;
  30. }
  31. bool GameObjectManager::objectExists(UINT64 id) const
  32. {
  33. return mObjects.find(id) != mObjects.end();
  34. }
  35. GameObjectHandleBase GameObjectManager::registerObject(const std::shared_ptr<GameObject>& object)
  36. {
  37. object->initialize(object, mNextAvailableID);
  38. GameObjectHandleBase handle(object);
  39. mObjects[mNextAvailableID] = handle;
  40. mNextAvailableID++;
  41. return handle;
  42. }
  43. void GameObjectManager::unregisterObject(const GameObjectHandleBase& object)
  44. {
  45. mObjects.erase(object->getInstanceId());
  46. }
  47. void GameObjectManager::startDeserialization()
  48. {
  49. assert(!mIsDeserializationActive);
  50. mIsDeserializationActive = true;
  51. }
  52. void GameObjectManager::endDeserialization()
  53. {
  54. assert(mIsDeserializationActive);
  55. for(auto& unresolvedHandle : mUnresolvedHandles)
  56. {
  57. UINT64 instanceId = unresolvedHandle.getInstanceId();
  58. auto findIter = mIdMapping.find(instanceId);
  59. if(findIter != mIdMapping.end())
  60. {
  61. instanceId = findIter->second;
  62. }
  63. auto findIterObj = mObjects.find(instanceId);
  64. if(findIterObj != mObjects.end())
  65. unresolvedHandle._resolve(findIterObj->second);
  66. else
  67. unresolvedHandle._resolve(nullptr);
  68. }
  69. for(auto iter = mEndCallbacks.rbegin(); iter != mEndCallbacks.rend(); ++iter)
  70. {
  71. (*iter)();
  72. }
  73. mIsDeserializationActive = false;
  74. mActiveDeserializedObject = nullptr;
  75. mIdMapping.clear();
  76. mUnresolvedHandles.clear();
  77. mEndCallbacks.clear();
  78. }
  79. void GameObjectManager::registerDeserializedId(UINT64 serializedId, UINT64 actualId)
  80. {
  81. #if BS_DEBUG_MODE
  82. if(!mIsDeserializationActive)
  83. {
  84. BS_EXCEPT(InvalidStateException, "ID mapping may only be modified while deserialization is active.");
  85. }
  86. #endif
  87. mIdMapping[serializedId] = actualId;
  88. }
  89. void GameObjectManager::registerUnresolvedHandle(const GameObjectHandleBase& object)
  90. {
  91. #if BS_DEBUG_MODE
  92. if(!mIsDeserializationActive)
  93. {
  94. BS_EXCEPT(InvalidStateException, "Unresolved handle queue only be modified while deserialization is active.");
  95. }
  96. #endif
  97. mUnresolvedHandles.push_back(object);
  98. }
  99. void GameObjectManager::registerOnDeserializationEndCallback(std::function<void()> callback)
  100. {
  101. #if BS_DEBUG_MODE
  102. if(!mIsDeserializationActive)
  103. {
  104. BS_EXCEPT(InvalidStateException, "Callback queue only be modified while deserialization is active.");
  105. }
  106. #endif
  107. mEndCallbacks.push_back(callback);
  108. }
  109. }