Przeglądaj źródła

GameObjectMnaager stores game object handles instead of pointers

Marko Pintera 12 lat temu
rodzic
commit
e41a0a35ea

+ 2 - 0
CamelotCore/Include/CmGameObject.h

@@ -14,6 +14,8 @@ namespace CamelotFramework
 		UINT64 getInstanceID() const { return mInstanceId; }
 		UINT64 getInstanceID() const { return mInstanceId; }
 
 
 	private:
 	private:
+		friend class GameObjectHandleBase;
+
 		UINT64 mInstanceId;
 		UINT64 mInstanceId;
 
 
 		/************************************************************************/
 		/************************************************************************/

+ 9 - 2
CamelotCore/Include/CmGameObjectHandle.h

@@ -2,6 +2,8 @@
 
 
 namespace CamelotFramework
 namespace CamelotFramework
 {
 {
+	class GameObjectManager;
+
 	struct CM_EXPORT GameObjectHandleData
 	struct CM_EXPORT GameObjectHandleData
 	{
 	{
 		GameObjectHandleData()
 		GameObjectHandleData()
@@ -30,6 +32,7 @@ namespace CamelotFramework
 	class CM_EXPORT GameObjectHandleBase
 	class CM_EXPORT GameObjectHandleBase
 	{
 	{
 	public:
 	public:
+		GameObjectHandleBase();
 		GameObjectHandleBase(const std::shared_ptr<GameObjectHandleData> data);
 		GameObjectHandleBase(const std::shared_ptr<GameObjectHandleData> data);
 
 
 		/**
 		/**
@@ -62,15 +65,18 @@ namespace CamelotFramework
 	protected:
 	protected:
 		friend SceneObject;
 		friend SceneObject;
 
 
-		GameObjectHandleBase();
-
 		inline void throwIfDestroyed() const;
 		inline void throwIfDestroyed() const;
 		
 		
 		void destroy()
 		void destroy()
 		{
 		{
+			unregisterWithManager(*this);
+
 			mData->mPtr = nullptr;
 			mData->mPtr = nullptr;
 		}
 		}
 
 
+		void registerWithManager(const GameObjectHandleBase& object);
+		void unregisterWithManager(const GameObjectHandleBase& object);
+
 		std::shared_ptr<GameObjectHandleData> mData;
 		std::shared_ptr<GameObjectHandleData> mData;
 	};
 	};
 
 
@@ -145,6 +151,7 @@ namespace CamelotFramework
 			:GameObjectHandleBase()
 			:GameObjectHandleBase()
 		{
 		{
 			mData = cm_shared_ptr<GameObjectHandleData, PoolAlloc>(std::static_pointer_cast<GameObject>(ptr));
 			mData = cm_shared_ptr<GameObjectHandleData, PoolAlloc>(std::static_pointer_cast<GameObject>(ptr));
+			registerWithManager(*this);
 		}
 		}
 	};
 	};
 
 

+ 5 - 4
CamelotCore/Include/CmGameObjectManager.h

@@ -2,6 +2,7 @@
 
 
 #include "CmPrerequisites.h"
 #include "CmPrerequisites.h"
 #include "CmModule.h"
 #include "CmModule.h"
+#include "CmGameObjectHandle.h"
 
 
 namespace CamelotFramework
 namespace CamelotFramework
 {
 {
@@ -11,14 +12,14 @@ namespace CamelotFramework
 		GameObjectManager();
 		GameObjectManager();
 		~GameObjectManager();
 		~GameObjectManager();
 
 
-		UINT64 registerObject(GameObject* object);
-		void unregisterObject(GameObject* object);
+		UINT64 registerObject(const GameObjectHandleBase& object);
+		void unregisterObject(const GameObjectHandleBase& object);
 
 
-		GameObject* getObject(UINT64 id) const;
+		GameObjectHandleBase getObject(UINT64 id) const;
 		bool objectExists(UINT64 id) const;
 		bool objectExists(UINT64 id) const;
 
 
 	private:
 	private:
 		UINT64 mNextAvailableID; // 0 is not a valid ID
 		UINT64 mNextAvailableID; // 0 is not a valid ID
-		Map<UINT64, GameObject*>::type mObjects;
+		Map<UINT64, GameObjectHandleBase>::type mObjects;
 	};
 	};
 }
 }

+ 1 - 0
CamelotCore/Include/CmSceneObject.h

@@ -226,6 +226,7 @@ namespace CamelotFramework
 
 
 			GameObjectHandle<T> newComponent = GameObjectHandle<T>(
 			GameObjectHandle<T> newComponent = GameObjectHandle<T>(
 				std::shared_ptr<T>(new (cm_alloc<T, PoolAlloc>()) T(mThisHandle), &cm_delete<PoolAlloc, T>, StdAlloc<PoolAlloc>()));
 				std::shared_ptr<T>(new (cm_alloc<T, PoolAlloc>()) T(mThisHandle), &cm_delete<PoolAlloc, T>, StdAlloc<PoolAlloc>()));
+
 			mComponents.push_back(newComponent);
 			mComponents.push_back(newComponent);
 
 
 			gSceneManager().notifyComponentAdded(newComponent);
 			gSceneManager().notifyComponentAdded(newComponent);

+ 2 - 6
CamelotCore/Source/CmGameObject.cpp

@@ -6,14 +6,10 @@ namespace CamelotFramework
 {
 {
 	GameObject::GameObject()
 	GameObject::GameObject()
 		:mInstanceId(0)
 		:mInstanceId(0)
-	{
-		mInstanceId = GameObjectManager::instance().registerObject(this);
-	}
+	{ }
 
 
 	GameObject::~GameObject()
 	GameObject::~GameObject()
-	{
-		GameObjectManager::instance().unregisterObject(this);
-	}
+	{ }
 	
 	
 	RTTITypeBase* GameObject::getRTTIStatic()
 	RTTITypeBase* GameObject::getRTTIStatic()
 	{
 	{

+ 11 - 0
CamelotCore/Source/CmGameObjectHandle.cpp

@@ -1,6 +1,7 @@
 #include "CmPrerequisites.h"
 #include "CmPrerequisites.h"
 #include "CmGameObject.h"
 #include "CmGameObject.h"
 #include "CmGameObjectHandle.h"
 #include "CmGameObjectHandle.h"
+#include "CmGameObjectManager.h"
 #include "CmException.h"
 #include "CmException.h"
 
 
 namespace CamelotFramework
 namespace CamelotFramework
@@ -19,4 +20,14 @@ namespace CamelotFramework
 			CM_EXCEPT(InternalErrorException, "Trying to access an object that has been destroyed.");
 			CM_EXCEPT(InternalErrorException, "Trying to access an object that has been destroyed.");
 		}
 		}
 	}
 	}
+
+	void GameObjectHandleBase::registerWithManager(const GameObjectHandleBase& object)
+	{
+		object.get()->mInstanceId = GameObjectManager::instance().registerObject(object);
+	}
+
+	void GameObjectHandleBase::unregisterWithManager(const GameObjectHandleBase& object)
+	{
+		GameObjectManager::instance().unregisterObject(object);
+	}
 }
 }

+ 3 - 7
CamelotCore/Source/CmGameObjectManager.cpp

@@ -12,7 +12,7 @@ namespace CamelotFramework
 	GameObjectManager::~GameObjectManager()
 	GameObjectManager::~GameObjectManager()
 	{ }
 	{ }
 
 
-	GameObject* GameObjectManager::getObject(UINT64 id) const 
+	GameObjectHandleBase GameObjectManager::getObject(UINT64 id) const 
 	{ 
 	{ 
 		auto iterFind = mObjects.find(id);
 		auto iterFind = mObjects.find(id);
 
 
@@ -27,19 +27,15 @@ namespace CamelotFramework
 		return mObjects.find(id) != mObjects.end(); 
 		return mObjects.find(id) != mObjects.end(); 
 	}
 	}
 
 
-	UINT64 GameObjectManager::registerObject(GameObject* object)
+	UINT64 GameObjectManager::registerObject(const GameObjectHandleBase& object)
 	{
 	{
-		assert(object != nullptr);
-
 		mObjects[mNextAvailableID] = object;
 		mObjects[mNextAvailableID] = object;
 
 
 		return mNextAvailableID++;
 		return mNextAvailableID++;
 	}
 	}
 
 
-	void GameObjectManager::unregisterObject(GameObject* object)
+	void GameObjectManager::unregisterObject(const GameObjectHandleBase& object)
 	{
 	{
-		assert(object != nullptr);
-
 		mObjects.erase(object->getInstanceID());
 		mObjects.erase(object->getInstanceID());
 	}
 	}
 }
 }

+ 1 - 0
CamelotCore/Source/CmSceneObject.cpp

@@ -41,6 +41,7 @@ namespace CamelotFramework
 			&cm_delete<PoolAlloc, SceneObject>, StdAlloc<PoolAlloc>());
 			&cm_delete<PoolAlloc, SceneObject>, StdAlloc<PoolAlloc>());
 
 
 		HSceneObject sceneObject = GameObjectHandle<SceneObject>(sceneObjectPtr);
 		HSceneObject sceneObject = GameObjectHandle<SceneObject>(sceneObjectPtr);
+
 		sceneObject->mThisHandle = sceneObject;
 		sceneObject->mThisHandle = sceneObject;
 
 
 		return sceneObject;
 		return sceneObject;