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

Fixing some RTTI GameObject classes

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

+ 1 - 0
CamelotCore/CamelotCore.vcxproj

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

+ 3 - 0
CamelotCore/CamelotCore.vcxproj.filters

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

+ 1 - 1
CamelotCore/Include/CmComponentRTTI.h

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

+ 8 - 0
CamelotCore/Include/CmGameObject.h

@@ -10,5 +10,13 @@ namespace CamelotEngine
 	public:
 		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; }
 	protected:
+		friend SceneObject;
+
 		GameObjectHandleBase();
 
 		inline void throwIfDestroyed() const;
 		
+		void destroy()
+		{
+			mData->mPtr = nullptr;
+		}
 
 		std::shared_ptr<GameObjectHandleData> mData;
 	};
@@ -101,16 +107,6 @@ namespace CamelotEngine
 			mData = std::shared_ptr<GameObjectHandleData>(CM_NEW(GameObjectHandleData, PoolAlloc) GameObjectHandleData((GameObject*)ptr, 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>

+ 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_FontData = 1057,
 		TID_IndexElementData = 1058,
-		TID_SceneObject = 1059
+		TID_SceneObject = 1059,
+		TID_GameObject = 1060
 	};
 
 	/**
@@ -344,6 +345,7 @@ namespace CamelotEngine
 	typedef ResourceHandle<Font> HFont;
 
 	// Game object handles
+	typedef GameObjectHandle<GameObject> HGameObject;
 	typedef GameObjectHandle<SceneObject> HSceneObject;
 	typedef GameObjectHandle<Component> HComponent;
 	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), 
 				"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);
 			mComponents.push_back(newComponent);
 

+ 1 - 1
CamelotCore/Include/CmSceneObjectRTTI.h

@@ -6,7 +6,7 @@
 
 namespace CamelotEngine
 {
-	class CM_EXPORT SceneObjectRTTI : public RTTIType<SceneObject, IReflectable, SceneObjectRTTI>
+	class CM_EXPORT SceneObjectRTTI : public RTTIType<SceneObject, GameObject, SceneObjectRTTI>
 	{
 	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 = HSceneObject::_create(CM_NEW(SceneObject, PoolAlloc) SceneObject(name),
+		HSceneObject sceneObject = GameObjectHandle<SceneObject>(CM_NEW(SceneObject, PoolAlloc) SceneObject(name),
 			&MemAllocDeleter<GameObject, PoolAlloc>::deleter);
 		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
 
-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
 
+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
  - 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
 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:
 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
@@ -70,8 +62,6 @@ Mesh usability overhaul:
  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)
 
- Names: TextMesh & SpriteMesh instead of 2DText and 2DSprite!
-
 -----------------------IMMEDIATE TODO---------------------------------------------------------------
 
  Assets manifest