Răsfoiți Sursa

Fixing some RTTI GameObject classes

Marko Pintera 13 ani în urmă
părinte
comite
49553c9008

+ 1 - 0
CamelotCore/CamelotCore.vcxproj

@@ -178,6 +178,7 @@
   <ItemGroup>
   <ItemGroup>
     <ClInclude Include="Include\CmGameObjectHandle.h" />
     <ClInclude Include="Include\CmGameObjectHandle.h" />
     <ClInclude Include="Include\CmGameObject.h" />
     <ClInclude Include="Include\CmGameObject.h" />
+    <ClInclude Include="Include\CmGameObjectRTTI.h" />
     <ClInclude Include="Include\CmSceneObjectRTTI.h" />
     <ClInclude Include="Include\CmSceneObjectRTTI.h" />
     <ClInclude Include="Include\CmMemAllocCategories.h" />
     <ClInclude Include="Include\CmMemAllocCategories.h" />
     <ClInclude Include="Include\CmOverlay.h" />
     <ClInclude Include="Include\CmOverlay.h" />

+ 3 - 0
CamelotCore/CamelotCore.vcxproj.filters

@@ -477,6 +477,9 @@
     <ClInclude Include="Include\CmGameObject.h">
     <ClInclude Include="Include\CmGameObject.h">
       <Filter>Header Files\Scene</Filter>
       <Filter>Header Files\Scene</Filter>
     </ClInclude>
     </ClInclude>
+    <ClInclude Include="Include\CmGameObjectRTTI.h">
+      <Filter>Header Files\RTTI</Filter>
+    </ClInclude>
   </ItemGroup>
   </ItemGroup>
   <ItemGroup>
   <ItemGroup>
     <ClCompile Include="Source\CamelotRenderer.cpp">
     <ClCompile Include="Source\CamelotRenderer.cpp">

+ 1 - 1
CamelotCore/Include/CmComponentRTTI.h

@@ -6,7 +6,7 @@
 
 
 namespace CamelotEngine
 namespace CamelotEngine
 {
 {
-	class CM_EXPORT ComponentRTTI : public RTTIType<Component, IReflectable, ComponentRTTI>
+	class CM_EXPORT ComponentRTTI : public RTTIType<Component, GameObject, ComponentRTTI>
 	{
 	{
 	private:
 	private:
 
 

+ 8 - 0
CamelotCore/Include/CmGameObject.h

@@ -10,5 +10,13 @@ namespace CamelotEngine
 	public:
 	public:
 		virtual ~GameObject() 
 		virtual ~GameObject() 
 		{ }
 		{ }
+
+		/************************************************************************/
+		/* 								RTTI		                     		*/
+		/************************************************************************/
+	public:
+		friend class GameObjectRTTI;
+		static RTTITypeBase* getRTTIStatic();
+		virtual RTTITypeBase* getRTTI() const;
 	};
 	};
 }
 }

+ 6 - 10
CamelotCore/Include/CmGameObjectHandle.h

@@ -44,10 +44,16 @@ namespace CamelotEngine
 		 */
 		 */
 		std::shared_ptr<GameObjectHandleData> getHandleData() const { return mData; }
 		std::shared_ptr<GameObjectHandleData> getHandleData() const { return mData; }
 	protected:
 	protected:
+		friend SceneObject;
+
 		GameObjectHandleBase();
 		GameObjectHandleBase();
 
 
 		inline void throwIfDestroyed() const;
 		inline void throwIfDestroyed() const;
 		
 		
+		void destroy()
+		{
+			mData->mPtr = nullptr;
+		}
 
 
 		std::shared_ptr<GameObjectHandleData> mData;
 		std::shared_ptr<GameObjectHandleData> mData;
 	};
 	};
@@ -101,16 +107,6 @@ namespace CamelotEngine
 			mData = std::shared_ptr<GameObjectHandleData>(CM_NEW(GameObjectHandleData, PoolAlloc) GameObjectHandleData((GameObject*)ptr, deleter),
 			mData = std::shared_ptr<GameObjectHandleData>(CM_NEW(GameObjectHandleData, PoolAlloc) GameObjectHandleData((GameObject*)ptr, deleter),
 				&MemAllocDeleter<GameObjectHandleData, PoolAlloc>::deleter);
 				&MemAllocDeleter<GameObjectHandleData, PoolAlloc>::deleter);
 		}
 		}
-
-		static GameObjectHandle<T> _create(T* ptr, void(*deleter)(GameObject*))
-		{
-			return GameObjectHandle<T>(ptr, deleter);
-		}
-
-		void destroy()
-		{
-			mData->mPtr = nullptr;
-		}
 	};
 	};
 
 
 	template<class _Ty1, class _Ty2>
 	template<class _Ty1, class _Ty2>

+ 35 - 0
CamelotCore/Include/CmGameObjectRTTI.h

@@ -0,0 +1,35 @@
+#pragma once
+
+#include "CmPrerequisites.h"
+#include "CmRTTIType.h"
+#include "CmGameObject.h"
+
+namespace CamelotEngine
+{
+	class CM_EXPORT GameObjectRTTI : public RTTIType<GameObject, IReflectable, GameObjectRTTI>
+	{
+	private:
+
+	public:
+		GameObjectRTTI()
+		{
+
+		}
+
+		virtual const String& getRTTIName()
+		{
+			static String name = "GameObject";
+			return name;
+		}
+
+		virtual UINT32 getRTTIId()
+		{
+			return TID_GameObject;
+		}
+
+		virtual std::shared_ptr<IReflectable> newRTTIObject()
+		{
+			CM_EXCEPT(InternalErrorException, "Cannot instantiate an abstract class.");
+		}
+	};
+}

+ 3 - 1
CamelotCore/Include/CmPrerequisites.h

@@ -292,7 +292,8 @@ namespace CamelotEngine
 		TID_FontImportOptions = 1056,
 		TID_FontImportOptions = 1056,
 		TID_FontData = 1057,
 		TID_FontData = 1057,
 		TID_IndexElementData = 1058,
 		TID_IndexElementData = 1058,
-		TID_SceneObject = 1059
+		TID_SceneObject = 1059,
+		TID_GameObject = 1060
 	};
 	};
 
 
 	/**
 	/**
@@ -344,6 +345,7 @@ namespace CamelotEngine
 	typedef ResourceHandle<Font> HFont;
 	typedef ResourceHandle<Font> HFont;
 
 
 	// Game object handles
 	// Game object handles
+	typedef GameObjectHandle<GameObject> HGameObject;
 	typedef GameObjectHandle<SceneObject> HSceneObject;
 	typedef GameObjectHandle<SceneObject> HSceneObject;
 	typedef GameObjectHandle<Component> HComponent;
 	typedef GameObjectHandle<Component> HComponent;
 	typedef GameObjectHandle<Camera> HCamera;
 	typedef GameObjectHandle<Camera> HCamera;

+ 1 - 1
CamelotCore/Include/CmSceneObject.h

@@ -216,7 +216,7 @@ namespace CamelotEngine
 			BOOST_STATIC_ASSERT_MSG((boost::is_base_of<CamelotEngine::Component, T>::value), 
 			BOOST_STATIC_ASSERT_MSG((boost::is_base_of<CamelotEngine::Component, T>::value), 
 				"Specified type is not a valid Component.");
 				"Specified type is not a valid Component.");
 
 
-			GameObjectHandle<T> newComponent = GameObjectHandle<T>::_create(CM_NEW(T, PoolAlloc) T(mThisHandle),
+			GameObjectHandle<T> newComponent = GameObjectHandle<T>(CM_NEW(T, PoolAlloc) T(mThisHandle),
 				&MemAllocDeleter<GameObject, PoolAlloc>::deleter);
 				&MemAllocDeleter<GameObject, PoolAlloc>::deleter);
 			mComponents.push_back(newComponent);
 			mComponents.push_back(newComponent);
 
 

+ 1 - 1
CamelotCore/Include/CmSceneObjectRTTI.h

@@ -6,7 +6,7 @@
 
 
 namespace CamelotEngine
 namespace CamelotEngine
 {
 {
-	class CM_EXPORT SceneObjectRTTI : public RTTIType<SceneObject, IReflectable, SceneObjectRTTI>
+	class CM_EXPORT SceneObjectRTTI : public RTTIType<SceneObject, GameObject, SceneObjectRTTI>
 	{
 	{
 	private:
 	private:
 
 

+ 15 - 1
CamelotCore/Source/CmGameObject.cpp

@@ -1 +1,15 @@
-#include "CmGameObject.h"
+#include "CmGameObject.h"
+#include "CmGameObjectRTTI.h"
+
+namespace CamelotEngine
+{
+	RTTITypeBase* GameObject::getRTTIStatic()
+	{
+		return GameObjectRTTI::instance();
+	}
+
+	RTTITypeBase* GameObject::getRTTI() const
+	{
+		return GameObject::getRTTIStatic();
+	}
+}

+ 1 - 1
CamelotCore/Source/CmSceneObject.cpp

@@ -35,7 +35,7 @@ namespace CamelotEngine
 
 
 	HSceneObject SceneObject::createInternal(const String& name)
 	HSceneObject SceneObject::createInternal(const String& name)
 	{
 	{
-		HSceneObject sceneObject = HSceneObject::_create(CM_NEW(SceneObject, PoolAlloc) SceneObject(name),
+		HSceneObject sceneObject = GameObjectHandle<SceneObject>(CM_NEW(SceneObject, PoolAlloc) SceneObject(name),
 			&MemAllocDeleter<GameObject, PoolAlloc>::deleter);
 			&MemAllocDeleter<GameObject, PoolAlloc>::deleter);
 		sceneObject->mThisHandle = sceneObject;
 		sceneObject->mThisHandle = sceneObject;
 
 

+ 3 - 13
TODO.txt

@@ -21,11 +21,11 @@ Figure out how to store texture references in a font?
 
 
 Move Debug to CamelotCore and add SetFillMode
 Move Debug to CamelotCore and add SetFillMode
 
 
-GameObjectREAL is IReflectable but doesn't have RTTI
- - COmponentRTTI doesn't account its new parent is GameObjectREAL so change that
-
 GameObjectHandle has  SceneObject friend which doesn't make sense
 GameObjectHandle has  SceneObject friend which doesn't make sense
 
 
+GameObject destructor should be private and only callable by GameObjectHandle
+ - This was I can ensure object is only destroyed when calling destroy(), and I can replace internal shared_ptr
+
 Make GameObjectHandle hold a normal pointer instead of a shared one
 Make GameObjectHandle hold a normal pointer instead of a shared one
  - By its definition its guaranteed to have only one reference so there's no need for shared ptr
  - By its definition its guaranteed to have only one reference so there's no need for shared ptr
 
 
@@ -46,14 +46,6 @@ Implement image shader for D3D11BuiltinMaterialManager
 Improve text shader so it doesn't have resolution values hardcoded in
 Improve text shader so it doesn't have resolution values hardcoded in
 Implement D3D9 and GL BuiltInMaterialManager
 Implement D3D9 and GL BuiltInMaterialManager
 
 
-FInish porting memory allocation:
-Check allocationChanges.txt on C
-
-Similar issue with passing arrays to classes like MeshData. In some cases SmallScratchBuffer is useful, while in others a LargeScratchBuffer is more appropriate?
- - Although LargeScratchBuffer is probably more appropriate in general situations, but still the user needs to know that, which I think is a bit hidden. Maybe change the behaviour so that MeshData internally allocates memory and just returns a pointer?
-
-PixelData needs something similar as mesh data
-
 Test:
 Test:
 Need sorted rendering as fonts render before scene and blending doesn't work as it should
 Need sorted rendering as fonts render before scene and blending doesn't work as it should
  - Implemented 2D renderer and ensure it runs after everything else
  - Implemented 2D renderer and ensure it runs after everything else
@@ -70,8 +62,6 @@ Mesh usability overhaul:
  A way to clear a mesh  (Mesh.Clear)
  A way to clear a mesh  (Mesh.Clear)
  A way to update mesh buffers without recreating vertex/index buffers (Setting data currently does exactly that)
  A way to update mesh buffers without recreating vertex/index buffers (Setting data currently does exactly that)
 
 
- Names: TextMesh & SpriteMesh instead of 2DText and 2DSprite!
-
 -----------------------IMMEDIATE TODO---------------------------------------------------------------
 -----------------------IMMEDIATE TODO---------------------------------------------------------------
 
 
  Assets manifest
  Assets manifest