Просмотр исходного кода

GameObjectHandle now uses a raw pointer instead of a shared one

Marko Pintera 13 лет назад
Родитель
Сommit
6f31de4b3e

+ 1 - 1
CamelotCore/Include/CmComponent.h

@@ -23,11 +23,11 @@ namespace CamelotEngine
 		 */
 		 */
 		virtual void update() = 0;
 		virtual void update() = 0;
 
 
-		virtual ~Component();
 	protected:
 	protected:
 		friend class SceneObject;
 		friend class SceneObject;
 
 
 		Component(const HSceneObject& parent);
 		Component(const HSceneObject& parent);
+		virtual ~Component();
 
 
 		HSceneObject mParent;
 		HSceneObject mParent;
 
 

+ 12 - 0
CamelotCore/Include/CmGameObject.h

@@ -19,4 +19,16 @@ namespace CamelotEngine
 		static RTTITypeBase* getRTTIStatic();
 		static RTTITypeBase* getRTTIStatic();
 		virtual RTTITypeBase* getRTTI() const;
 		virtual RTTITypeBase* getRTTI() const;
 	};
 	};
+}
+
+#include "CmGameObjectHandle.h"
+
+namespace CamelotEngine
+{
+	// Game object handles
+	typedef GameObjectHandle<GameObject> HGameObject;
+	typedef GameObjectHandle<SceneObject> HSceneObject;
+	typedef GameObjectHandle<Component> HComponent;
+	typedef GameObjectHandle<Camera> HCamera;
+	typedef GameObjectHandle<Renderable> HRenderable;
 }
 }

+ 19 - 9
CamelotCore/Include/CmGameObjectHandle.h

@@ -1,23 +1,23 @@
 #pragma once
 #pragma once
 
 
-#include "CmGameObject.h"
-
 namespace CamelotEngine
 namespace CamelotEngine
 {
 {
 	struct CM_EXPORT GameObjectHandleData
 	struct CM_EXPORT GameObjectHandleData
 	{
 	{
 		GameObjectHandleData()
 		GameObjectHandleData()
+			:mPtr(nullptr), mDeleter(nullptr)
 		{ }
 		{ }
 
 
 		GameObjectHandleData(GameObject* ptr, void(*deleter)(GameObject*))
 		GameObjectHandleData(GameObject* ptr, void(*deleter)(GameObject*))
 		{
 		{
-			if(deleter != nullptr)
-				mPtr = std::shared_ptr<GameObject>(ptr, deleter);
-			else
-				mPtr = std::shared_ptr<GameObject>(ptr);
+			mPtr = ptr;
+			mDeleter = deleter;
 		}
 		}
 
 
-		std::shared_ptr<GameObject> mPtr;
+		typedef void(*HandleDeleter)(GameObject*);
+
+		GameObject* mPtr;
+		HandleDeleter mDeleter;
 	};
 	};
 
 
 	/**
 	/**
@@ -52,7 +52,17 @@ namespace CamelotEngine
 		
 		
 		void destroy()
 		void destroy()
 		{
 		{
-			mData->mPtr = nullptr;
+			if(mData->mPtr != nullptr)
+			{
+				GameObject* toDelete = mData->mPtr;
+				mData->mPtr = nullptr; // Need to set this to null before deleting, otherwise destructor thinks object isn't destroyed
+				// and we end up here again
+
+				if(mData->mDeleter != nullptr)
+					mData->mDeleter(toDelete);
+				else
+					delete toDelete;
+			}
 		}
 		}
 
 
 		std::shared_ptr<GameObjectHandleData> mData;
 		std::shared_ptr<GameObjectHandleData> mData;
@@ -80,7 +90,7 @@ namespace CamelotEngine
 		{ 
 		{ 
 			throwIfDestroyed();
 			throwIfDestroyed();
 
 
-			return reinterpret_cast<T*>(mData->mPtr.get()); 
+			return reinterpret_cast<T*>(mData->mPtr); 
 		}
 		}
 		T* operator->() const { return get(); }
 		T* operator->() const { return get(); }
 		T& operator*() const { return *get(); }
 		T& operator*() const { return *get(); }

+ 0 - 8
CamelotCore/Include/CmPrerequisites.h

@@ -326,7 +326,6 @@ namespace CamelotEngine
 /************************************************************************/
 /************************************************************************/
 
 
 #include "CmResourceHandle.h"
 #include "CmResourceHandle.h"
-#include "CmGameObjectHandle.h"
 
 
 namespace CamelotEngine
 namespace CamelotEngine
 {
 {
@@ -343,13 +342,6 @@ namespace CamelotEngine
 	typedef ResourceHandle<BlendState> HBlendState;
 	typedef ResourceHandle<BlendState> HBlendState;
 	typedef ResourceHandle<GpuProgInclude> HGpuProgInclude;
 	typedef ResourceHandle<GpuProgInclude> HGpuProgInclude;
 	typedef ResourceHandle<Font> HFont;
 	typedef ResourceHandle<Font> HFont;
-
-	// Game object handles
-	typedef GameObjectHandle<GameObject> HGameObject;
-	typedef GameObjectHandle<SceneObject> HSceneObject;
-	typedef GameObjectHandle<Component> HComponent;
-	typedef GameObjectHandle<Camera> HCamera;
-	typedef GameObjectHandle<Renderable> HRenderable;
 }
 }
 
 
 #endif
 #endif

+ 1 - 0
CamelotCore/Include/CmRenderer.h

@@ -1,6 +1,7 @@
 #pragma once
 #pragma once
 
 
 #include "CmPrerequisites.h"
 #include "CmPrerequisites.h"
+#include "CmGameObject.h"
 
 
 namespace CamelotEngine
 namespace CamelotEngine
 {
 {

+ 1 - 0
CamelotCore/Include/CmSceneManager.h

@@ -2,6 +2,7 @@
 
 
 #include "CmPrerequisites.h"
 #include "CmPrerequisites.h"
 #include "CmModule.h"
 #include "CmModule.h"
+#include "CmGameObject.h"
 
 
 namespace CamelotEngine
 namespace CamelotEngine
 {
 {

+ 1 - 0
CamelotCore/Source/CmGameObjectHandle.cpp

@@ -1,4 +1,5 @@
 #include "CmPrerequisites.h"
 #include "CmPrerequisites.h"
+#include "CmGameObject.h"
 #include "CmGameObjectHandle.h"
 #include "CmGameObjectHandle.h"
 #include "CmException.h"
 #include "CmException.h"