Browse Source

Initial work on Mesh class

Marko Pintera 13 years ago
parent
commit
6fff8b4648

+ 2 - 40
CamelotFBXImporter/Include/CmFBXImporter.h

@@ -11,44 +11,6 @@ namespace CamelotEngine
 {
 	class CM_FBX_EXPORT FBXImporter : public SpecificImporter
 	{
-		struct FBXSubMeshData
-		{
-			FBXSubMeshData():
-				indexOffset(0), indexCount(0)
-			{ }
-
-			int indexOffset;
-			int indexCount;
-		};
-
-		struct FBXMeshData
-		{
-			FBXMeshData():
-				vertex(nullptr),
-				normal(nullptr),
-				tangent(nullptr),
-				bitangent(nullptr),
-				uv0(nullptr),
-				uv1(nullptr),
-				index(nullptr),
-				indexCount(0),
-				vertexCount(0)
-			{ }
-
-			Vector3* vertex;
-			Vector3* normal;
-			Vector3* tangent;
-			Vector3* bitangent;
-			Vector2* uv0;
-			Vector2* uv1;
-			int* index;
-
-			int indexCount;
-			int vertexCount;
-
-			vector<FBXSubMeshData>::type subMeshes;
-		};
-
 	public:
 		FBXImporter();
 		virtual ~FBXImporter();
@@ -81,8 +43,8 @@ namespace CamelotEngine
 		void shutDownSdk(FbxManager* manager);
 
 		void loadScene(FbxManager* manager, FbxScene* scene, const String& filePath);
-		FBXMeshData* parseScene(FbxManager* manager, FbxScene* scene);
+		MeshDataPtr parseScene(FbxManager* manager, FbxScene* scene);
 
-		FBXMeshData* parseMesh(FbxMesh* mesh, bool createTangentsIfMissing = true);
+		MeshDataPtr parseMesh(FbxMesh* mesh, bool createTangentsIfMissing = true);
 	};
 }

+ 5 - 4
CamelotFBXImporter/Source/CmFBXImporter.cpp

@@ -3,6 +3,7 @@
 #include "CmDebug.h"
 #include "CmDataStream.h"
 #include "CmPath.h"
+#include "CmMeshData.h"
 #include "CmVector2.h"
 #include "CmVector3.h"
 #include "CmVector4.h"
@@ -43,7 +44,7 @@ namespace CamelotEngine
 		startUpSdk(fbxManager, fbxScene);
 		loadScene(fbxManager, fbxScene, filePath);
 
-		FBXMeshData* mesh = parseScene(fbxManager, fbxScene);	
+		MeshDataPtr mesh = parseScene(fbxManager, fbxScene);	
 
 		shutDownSdk(fbxManager);
 
@@ -110,7 +111,7 @@ namespace CamelotEngine
 		importer->Destroy();
 	}
 
-	FBXImporter::FBXMeshData* FBXImporter::parseScene(FbxManager* manager, FbxScene* scene)
+	MeshDataPtr FBXImporter::parseScene(FbxManager* manager, FbxScene* scene)
 	{
 		stack<FbxNode*>::type todo;
 		todo.push(scene->GetRootNode());
@@ -158,9 +159,9 @@ namespace CamelotEngine
 		return nullptr;
 	}
 
-	FBXImporter::FBXMeshData* FBXImporter::parseMesh(FbxMesh* mesh, bool createTangentsIfMissing)
+	MeshDataPtr FBXImporter::parseMesh(FbxMesh* mesh, bool createTangentsIfMissing)
 	{
-		FBXMeshData* meshData = new FBXMeshData();
+		MeshDataPtr meshData = MeshDataPtr(new MeshData());
 
 		if (!mesh->GetNode())
 			return meshData;

+ 4 - 0
CamelotRenderer.sln

@@ -34,6 +34,10 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CamelotFreeImgImporter", "C
 	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CamelotFBXImporter", "CamelotFBXImporter\CamelotFBXImporter.vcxproj", "{7F449698-73DF-4203-9F31-0877DBF01695}"
+	ProjectSection(ProjectDependencies) = postProject
+		{9B21D41C-516B-43BF-9B10-E99B599C7589} = {9B21D41C-516B-43BF-9B10-E99B599C7589}
+		{CC7F9445-71C9-4559-9976-FF0A64DCB582} = {CC7F9445-71C9-4559-9976-FF0A64DCB582}
+	EndProjectSection
 EndProject
 Global
 	GlobalSection(SubversionScc) = preSolution

+ 3 - 0
CamelotRenderer/CamelotRenderer.vcxproj

@@ -113,6 +113,7 @@
     <ClInclude Include="Include\CmHighLevelGpuProgram.h" />
     <ClInclude Include="Include\CmHighLevelGpuProgramManager.h" />
     <ClInclude Include="Include\CmImporter.h" />
+    <ClInclude Include="Include\CmMesh.h" />
     <ClInclude Include="Include\CmPrerequisites.h" />
     <ClInclude Include="Include\CmRenderOperation.h" />
     <ClInclude Include="Include\CmRenderSystem.h" />
@@ -138,6 +139,7 @@
     <ClInclude Include="Include\CmComponent.h" />
     <ClInclude Include="Include\stdafx.h" />
     <ClInclude Include="Include\targetver.h" />
+    <ClInclude Include="Source\CmMeshST.h" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="Source\CamelotRenderer.cpp" />
@@ -157,6 +159,7 @@
     <ClCompile Include="Source\CmHighLevelGpuProgram.cpp" />
     <ClCompile Include="Source\CmHighLevelGpuProgramManager.cpp" />
     <ClCompile Include="Source\CmImporter.cpp" />
+    <ClCompile Include="Source\CmMesh.cpp" />
     <ClCompile Include="Source\CmRenderSystem.cpp" />
     <ClCompile Include="Source\CmRenderSystemCapabilities.cpp" />
     <ClCompile Include="Source\CmRenderSystemManager.cpp" />

+ 23 - 17
CamelotRenderer/CamelotRenderer.vcxproj.filters

@@ -28,9 +28,6 @@
     <Filter Include="Source Files\RenderSystem">
       <UniqueIdentifier>{e0bdc5fc-afd1-46f9-9e3e-f85ca3e220b8}</UniqueIdentifier>
     </Filter>
-    <Filter Include="Source Files\AssetImporter">
-      <UniqueIdentifier>{ce5fd26d-808e-4914-b478-3099834f03df}</UniqueIdentifier>
-    </Filter>
     <Filter Include="Header Files\Importer">
       <UniqueIdentifier>{f1fb2bc5-43c6-476a-89e3-b7de86c5aebe}</UniqueIdentifier>
     </Filter>
@@ -97,12 +94,6 @@
     <ClInclude Include="Include\CmTextureState.h">
       <Filter>Header Files\RenderSystem</Filter>
     </ClInclude>
-    <ClInclude Include="Include\CmTextureManager.h">
-      <Filter>Header Files\RenderSystem</Filter>
-    </ClInclude>
-    <ClInclude Include="Include\CmTexture.h">
-      <Filter>Header Files\RenderSystem</Filter>
-    </ClInclude>
     <ClInclude Include="Include\CmRenderWindow.h">
       <Filter>Header Files\RenderSystem</Filter>
     </ClInclude>
@@ -194,7 +185,19 @@
       <Filter>Header Files\Scene</Filter>
     </ClInclude>
     <ClInclude Include="Include\CmSceneManager.h">
-      <Filter>Source Files\Scene</Filter>
+      <Filter>Header Files\Scene</Filter>
+    </ClInclude>
+    <ClInclude Include="Include\CmTexture.h">
+      <Filter>Header Files\Resources</Filter>
+    </ClInclude>
+    <ClInclude Include="Include\CmTextureManager.h">
+      <Filter>Header Files\Resources</Filter>
+    </ClInclude>
+    <ClInclude Include="Include\CmMesh.h">
+      <Filter>Header Files\Resources</Filter>
+    </ClInclude>
+    <ClInclude Include="Source\CmMeshST.h">
+      <Filter>Header Files\Serialization</Filter>
     </ClInclude>
   </ItemGroup>
   <ItemGroup>
@@ -267,12 +270,6 @@
     <ClCompile Include="Source\CmRenderWindow.cpp">
       <Filter>Source Files\RenderSystem</Filter>
     </ClCompile>
-    <ClCompile Include="Source\CmTexture.cpp">
-      <Filter>Source Files\RenderSystem</Filter>
-    </ClCompile>
-    <ClCompile Include="Source\CmTextureManager.cpp">
-      <Filter>Source Files\RenderSystem</Filter>
-    </ClCompile>
     <ClCompile Include="Source\CmTextureState.cpp">
       <Filter>Source Files\RenderSystem</Filter>
     </ClCompile>
@@ -301,7 +298,16 @@
       <Filter>Source Files\Scene</Filter>
     </ClCompile>
     <ClCompile Include="Source\CmSceneManager.cpp">
-      <Filter>Header Files\Scene</Filter>
+      <Filter>Source Files\Scene</Filter>
+    </ClCompile>
+    <ClCompile Include="Source\CmTexture.cpp">
+      <Filter>Source Files\Resources</Filter>
+    </ClCompile>
+    <ClCompile Include="Source\CmTextureManager.cpp">
+      <Filter>Source Files\Resources</Filter>
+    </ClCompile>
+    <ClCompile Include="Source\CmMesh.cpp">
+      <Filter>Source Files\Resources</Filter>
     </ClCompile>
   </ItemGroup>
 </Project>

+ 20 - 0
CamelotRenderer/Include/CmMesh.h

@@ -0,0 +1,20 @@
+#pragma once
+
+#include "CmPrerequisites.h"
+#include "CmResource.h"
+
+namespace CamelotEngine
+{
+	class Mesh : public Resource
+	{
+		virtual void load();
+
+		/************************************************************************/
+		/* 								SERIALIZATION                      		*/
+		/************************************************************************/
+	public:
+		friend class MeshST;
+		static RTTITypeBase* getRTTIStatic();
+		virtual RTTITypeBase* getRTTI() const;
+	};
+}

+ 4 - 1
CamelotRenderer/Include/CmPrerequisites.h

@@ -89,7 +89,6 @@ namespace CamelotEngine {
     class RenderOperation;
     class StringInterface;
     class TextureState;
-    class Texture;
     class TextureManager;
     class Viewport;
     class VertexBufferBinding;
@@ -101,10 +100,14 @@ namespace CamelotEngine {
 	// Resources
 	class Resource;
 	class Resources;
+	class Texture;
+	class Mesh;
 	// Scene
 	class GameObject;
 	class Component;
 	class SceneManager;
+	// Serialization
+	class MeshST;
 }
 
 /* Shared pointer typedefs*/

+ 6 - 0
CamelotRenderer/Include/CmResource.h

@@ -6,6 +6,12 @@
 
 namespace CamelotEngine
 {
+	enum ResourceIds
+	{
+		RID_Texture = 1001,
+		RID_Mesh = 1002
+	};
+
 	/**
 	 * @brief	Base class for all resources used in the engine.
 	 */

+ 1 - 1
CamelotRenderer/Include/CmTextureST.h

@@ -87,7 +87,7 @@ namespace CamelotEngine
 
 		virtual UINT32 getRTTIId()
 		{
-			return 101;
+			return RID_Texture;
 		}
 
 		virtual std::shared_ptr<IReflectable> newRTTIObject()

+ 24 - 0
CamelotRenderer/Source/CmMesh.cpp

@@ -0,0 +1,24 @@
+#include "CmMesh.h"
+#include "CmMeshST.h"
+
+namespace CamelotEngine
+{
+	void Mesh::load()
+	{
+		throw std::exception("The method or operation is not implemented.");
+	}
+
+	/************************************************************************/
+	/* 								SERIALIZATION                      		*/
+	/************************************************************************/
+
+	RTTITypeBase* Mesh::getRTTIStatic()
+	{
+		return MeshST::instance();
+	}
+
+	RTTITypeBase* Mesh::getRTTI() const
+	{
+		return Mesh::getRTTIStatic();
+	}
+}

+ 33 - 0
CamelotRenderer/Source/CmMeshST.h

@@ -0,0 +1,33 @@
+#pragma once
+
+#include "CmPrerequisites.h"
+#include "CmRTTIType.h"
+#include "CmMesh.h"
+
+namespace CamelotEngine
+{
+	class MeshST : public RTTIType<Mesh, Resource, MeshST>
+	{
+	public:
+		MeshST()
+		{
+
+		}
+
+		virtual std::shared_ptr<IReflectable> newRTTIObject() 
+		{
+			return std::shared_ptr<Mesh>(new Mesh());
+		}
+
+		virtual const String& getRTTIName() 
+		{
+			static String name = "Mesh";
+			throw name;
+		}
+
+		virtual UINT32 getRTTIId() 
+		{
+			return RID_Mesh;
+		}
+	};
+}

+ 3 - 0
CamelotUtility/CamelotUtility.vcxproj

@@ -82,6 +82,7 @@
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
+    <ClCompile Include="Source\CmMeshData.cpp" />
     <ClInclude Include="Include\CmBinarySerializer.h" />
     <ClInclude Include="Include\CmBitwise.h" />
     <ClInclude Include="Include\CmBox.h" />
@@ -95,6 +96,7 @@
     <ClInclude Include="Include\CmLog.h" />
     <ClInclude Include="Include\CmManagedDataBlock.h" />
     <ClInclude Include="Include\CmMathAsm.h" />
+    <ClInclude Include="Include\CmMeshDataST.h" />
     <ClInclude Include="Include\CmModule.h" />
     <ClInclude Include="Include\CmPath.h" />
     <ClInclude Include="Include\CmPixelUtil.h" />
@@ -136,6 +138,7 @@
     <ClCompile Include="Source\CmTextureData.cpp">
       <FileType>CppHeader</FileType>
     </ClCompile>
+    <ClInclude Include="Include\CmMeshData.h" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="Include\CmAxisAlignedBox.cpp" />

+ 9 - 0
CamelotUtility/CamelotUtility.vcxproj.filters

@@ -177,6 +177,12 @@
     <ClInclude Include="Include\CmFileSystem.h">
       <Filter>Header Files</Filter>
     </ClInclude>
+    <ClInclude Include="Include\CmMeshData.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="Include\CmMeshDataST.h">
+      <Filter>Header Files\SerializationTypes</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="Include\CmAxisAlignedBox.cpp">
@@ -254,5 +260,8 @@
     <ClCompile Include="Source\CmFileSystem.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
+    <ClCompile Include="Source\CmMeshData.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
   </ItemGroup>
 </Project>

+ 2 - 0
CamelotUtility/Include/CmFwdDeclUtil.h

@@ -25,6 +25,7 @@ namespace CamelotEngine {
 	class MemoryDataStream;
 	class FileDataStream;
 	class TextureData;
+	class MeshData;
 	class FileSystem;
 	// Reflection
 	class IReflectable;
@@ -37,4 +38,5 @@ namespace CamelotEngine {
 	typedef std::shared_ptr<MemoryDataStream> MemoryDataStreamPtr;
 	typedef std::shared_ptr<FileDataStream> FileDataStreamPtr;
 	typedef std::shared_ptr<TextureData> TextureDataPtr;
+	typedef std::shared_ptr<MeshData> MeshDataPtr;
 }

+ 45 - 0
CamelotUtility/Include/CmMeshData.h

@@ -0,0 +1,45 @@
+#pragma once
+
+#include "CmPrerequisitesUtil.h"
+#include "CmIReflectable.h"
+
+namespace CamelotEngine
+{
+	class CM_UTILITY_EXPORT MeshData : public IReflectable
+	{
+	public:
+		struct SubMeshData
+		{
+			SubMeshData():
+				indexOffset(0), indexCount(0)
+			{ }
+
+			int indexOffset;
+			int indexCount;
+		};
+
+		MeshData();
+		~MeshData();
+
+		Vector3* vertex;
+		Vector3* normal;
+		Vector3* tangent;
+		Vector3* bitangent;
+		Vector2* uv0;
+		Vector2* uv1;
+		int* index;
+
+		int indexCount;
+		int vertexCount;
+
+		vector<SubMeshData>::type subMeshes;
+
+		/************************************************************************/
+		/* 								SERIALIZATION                      		*/
+		/************************************************************************/
+	public:
+		friend class MeshDataST;
+		static RTTITypeBase* getRTTIStatic();
+		virtual RTTITypeBase* getRTTI() const;
+	};
+}

+ 33 - 0
CamelotUtility/Include/CmMeshDataST.h

@@ -0,0 +1,33 @@
+#pragma once
+
+#include "CmPrerequisitesUtil.h"
+#include "CmRTTIType.h"
+#include "CmMeshData.h"
+
+namespace CamelotEngine
+{
+	class MeshDataST : public RTTIType<MeshData, IReflectable, MeshDataST>
+	{
+	public:
+		MeshDataST()
+		{
+
+		}
+
+		virtual std::shared_ptr<IReflectable> newRTTIObject() 
+		{
+			return std::shared_ptr<MeshData>(new MeshData());
+		}
+
+		virtual const String& getRTTIName() 
+		{
+			static String name = "MeshData";
+			throw name;
+		}
+
+		virtual UINT32 getRTTIId() 
+		{
+			return 103;
+		}
+	};
+}

+ 57 - 0
CamelotUtility/Source/CmMeshData.cpp

@@ -0,0 +1,57 @@
+#include "CmMeshData.h"
+#include "CmVector2.h"
+#include "CmVector3.h"
+#include "CmMeshDataST.h"
+
+namespace CamelotEngine
+{
+	MeshData::MeshData()
+	   :vertex(nullptr),
+		normal(nullptr),
+		tangent(nullptr),
+		bitangent(nullptr),
+		uv0(nullptr),
+		uv1(nullptr),
+		index(nullptr),
+		indexCount(0),
+		vertexCount(0)
+	{ }
+
+	MeshData::~MeshData()
+	{
+		if(vertex != nullptr)
+			delete [] vertex;
+
+		if(normal != nullptr)
+			delete [] normal;
+
+		if(tangent != nullptr)
+			delete [] tangent;
+
+		if(bitangent != nullptr)
+			delete [] bitangent;
+
+		if(uv0 != nullptr)
+			delete [] uv0;
+
+		if(uv1 != nullptr)
+			delete [] uv1;
+
+		if(index != nullptr)
+			delete [] index;
+	}
+
+	/************************************************************************/
+	/* 								SERIALIZATION                      		*/
+	/************************************************************************/
+
+	RTTITypeBase* MeshData::getRTTIStatic()
+	{
+		return MeshDataST::instance();
+	}
+
+	RTTITypeBase* MeshData::getRTTI() const
+	{
+		return MeshData::getRTTIStatic();
+	}
+}