Browse Source

FontImporter now compiles - Freetype libraries were wrong earlier

Marko Pintera 13 years ago
parent
commit
8bd15d0742

+ 3 - 0
CamelotCore/CamelotCore.vcxproj

@@ -194,6 +194,8 @@
     <ClInclude Include="Include\CmDepthStencilState.h" />
     <ClInclude Include="Include\CmFont.h" />
     <ClInclude Include="Include\CmFontDesc.h" />
+    <ClInclude Include="Include\CmFontImportOptions.h" />
+    <ClInclude Include="Include\CmFontImportOptionsRTTI.h" />
     <ClInclude Include="Include\CmFontManager.h" />
     <ClInclude Include="Include\CmFontRTTI.h" />
     <ClInclude Include="Include\CmGpuBuffer.h" />
@@ -299,6 +301,7 @@
     <ClCompile Include="Source\CmDeferredRenderContext.cpp" />
     <ClCompile Include="Source\CmDepthStencilState.cpp" />
     <ClCompile Include="Source\CmFont.cpp" />
+    <ClCompile Include="Source\CmFontImportOptions.cpp" />
     <ClCompile Include="Source\CmFontManager.cpp" />
     <ClCompile Include="Source\CmGpuBuffer.cpp" />
     <ClCompile Include="Source\CmGpuBufferView.cpp" />

+ 9 - 0
CamelotCore/CamelotCore.vcxproj.filters

@@ -414,6 +414,12 @@
     <ClInclude Include="Include\CmCoreObjectManager.h">
       <Filter>Header Files\RenderSystem</Filter>
     </ClInclude>
+    <ClInclude Include="Include\CmFontImportOptions.h">
+      <Filter>Header Files\Text</Filter>
+    </ClInclude>
+    <ClInclude Include="Include\CmFontImportOptionsRTTI.h">
+      <Filter>Header Files\RTTI</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="Source\CamelotRenderer.cpp">
@@ -635,5 +641,8 @@
     <ClCompile Include="Source\CmCoreObjectManager.cpp">
       <Filter>Source Files\RenderSystem</Filter>
     </ClCompile>
+    <ClCompile Include="Source\CmFontImportOptions.cpp">
+      <Filter>Source Files\Text</Filter>
+    </ClCompile>
   </ItemGroup>
 </Project>

+ 36 - 0
CamelotCore/Include/CmFontImportOptions.h

@@ -0,0 +1,36 @@
+#pragma once
+
+#include "CmPrerequisites.h"
+#include "CmImportOptions.h"
+#include "CmFont.h"
+
+namespace CamelotEngine
+{
+	class CM_EXPORT FontImportOptions : public ImportOptions
+	{
+	public:
+		FontImportOptions();
+
+		void setFontSizes(const vector<UINT32>::type& fontSizes) { mFontSizes = fontSizes; }
+		void addCharIndexRange(UINT32 from, UINT32 to);
+		void clearCharIndexRanges();
+		void setDPI(UINT32 dpi) { mDPI = dpi; }
+
+		vector<UINT32>::type getFontSizes() const { return mFontSizes; }
+		vector<std::pair<UINT32, UINT32>>::type getCharIndexRanges() const { return mCharIndexRanges; }
+		UINT32 getDPI() const { return mDPI; }
+
+		/************************************************************************/
+		/* 								SERIALIZATION                      		*/
+		/************************************************************************/
+	public:
+		friend class FontImportOptionsRTTI;
+		static RTTITypeBase* getRTTIStatic();
+		virtual RTTITypeBase* getRTTI() const;
+
+	private:
+		vector<UINT32>::type mFontSizes;
+		vector<std::pair<UINT32, UINT32>>::type mCharIndexRanges;
+		UINT32 mDPI;
+	};
+}

+ 36 - 0
CamelotCore/Include/CmFontImportOptionsRTTI.h

@@ -0,0 +1,36 @@
+#pragma once
+
+#include "CmPrerequisites.h"
+#include "CmRTTIType.h"
+#include "CmFontImportOptions.h"
+
+namespace CamelotEngine
+{
+	class CM_EXPORT FontImportOptionsRTTI : public RTTIType<FontImportOptions, IReflectable, FontImportOptionsRTTI>
+	{
+	private:
+
+
+	public:
+		FontImportOptionsRTTI()
+		{
+
+		}
+
+		virtual const String& getRTTIName()
+		{
+			static String name = "FontImportOptions";
+			return name;
+		}
+
+		virtual UINT32 getRTTIId()
+		{
+			return TID_FontImportOptions;
+		}
+
+		virtual std::shared_ptr<IReflectable> newRTTIObject()
+		{
+			return ImportOptionsPtr(new FontImportOptions());
+		}
+	};
+}

+ 2 - 1
CamelotCore/Include/CmPrerequisites.h

@@ -269,7 +269,8 @@ namespace CamelotEngine
 		TID_FONT_DESC = 1052,
 		TID_CHAR_DESC = 1053,
 		TID_STDVECTOR = 1054,
-		TID_STDMAP = 1055
+		TID_STDMAP = 1055,
+		TID_FontImportOptions = 1056
 	};
 
 	/**

+ 34 - 0
CamelotCore/Source/CmFontImportOptions.cpp

@@ -0,0 +1,34 @@
+#include "CmFontImportOptions.h"
+#include "CmFontImportOptionsRTTI.h"
+
+namespace CamelotEngine
+{
+	FontImportOptions::FontImportOptions()
+		:mDPI(96)
+	{
+		mCharIndexRanges.push_back(std::make_pair(33, 166)); // Most used ASCII characters
+	}
+
+	void FontImportOptions::addCharIndexRange(UINT32 from, UINT32 to)
+	{
+		mCharIndexRanges.push_back(std::make_pair(from, to));
+	}
+
+	void FontImportOptions::clearCharIndexRanges()
+	{
+		mCharIndexRanges.clear();
+	}
+
+	/************************************************************************/
+	/* 								SERIALIZATION                      		*/
+	/************************************************************************/
+	RTTITypeBase* FontImportOptions::getRTTIStatic()
+	{
+		return FontImportOptionsRTTI::instance();
+	}
+
+	RTTITypeBase* FontImportOptions::getRTTI() const
+	{
+		return FontImportOptions::getRTTIStatic();
+	}
+}

+ 2 - 2
CamelotD3D11RenderSystem/Source/CmD3D11Mappings.cpp

@@ -634,8 +634,8 @@ namespace CamelotEngine
 			return DXGI_FORMAT_UNKNOWN;
 		case PF_A4L4:
 			return DXGI_FORMAT_UNKNOWN;
-		case PF_BYTE_LA:
-			return DXGI_FORMAT_UNKNOWN; 
+		case PF_R8G8:
+			return DXGI_FORMAT_R8G8_UNORM; 
 		case PF_R3G3B2:
 			return DXGI_FORMAT_UNKNOWN;
 		case PF_A1R5G5B5:

+ 4 - 4
CamelotD3D9Renderer/Source/CmD3D9Mappings.cpp

@@ -475,7 +475,7 @@ namespace CamelotEngine
 		case D3DFMT_A4L4:
 			return PF_A4L4;
 		case D3DFMT_A8L8:
-			return PF_BYTE_LA;	// Assume little endian here
+			return PF_R8G8;	// Assume little endian here
 		case D3DFMT_R3G3B2:
 			return PF_R3G3B2;
 		case D3DFMT_A1R5G5B5:
@@ -535,9 +535,9 @@ namespace CamelotEngine
 		}
 	}
 	/****************************************************************************************/
-	D3DFORMAT D3D9Mappings::_getPF(PixelFormat ogrePF)
+	D3DFORMAT D3D9Mappings::_getPF(PixelFormat camelotPf)
 	{
-		switch(ogrePF)
+		switch(camelotPf)
 		{
 		case PF_L8:
 			return D3DFMT_L8;
@@ -547,7 +547,7 @@ namespace CamelotEngine
 			return D3DFMT_A8;
 		case PF_A4L4:
 			return D3DFMT_A4L4;
-		case PF_BYTE_LA:
+		case PF_R8G8:
 			return D3DFMT_A8L8; // Assume little endian here
 		case PF_R3G3B2:
 			return D3DFMT_R3G3B2;

+ 4 - 0
CamelotEngine.sln

@@ -80,6 +80,10 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CamelotEditor", "CamelotEdi
 	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CamelotFontImporter", "CamelotFontImporter\CamelotTTFImporter.vcxproj", "{AB6C9284-D1CB-4AAD-BA4B-8A9E81AD1A73}"
+	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

+ 7 - 6
CamelotFontImporter/CamelotTTFImporter.vcxproj

@@ -72,7 +72,7 @@
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <IntDir>.\Intermediate\$(Platform)\$(Configuration)\</IntDir>
-    <OutDir>..\bin\$(Configuration)\</OutDir>
+    <OutDir>..\bin\$(Platform)\$(Configuration)\</OutDir>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <OutDir>..\bin\$(Configuration)\</OutDir>
@@ -80,14 +80,14 @@
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <IntDir>.\Intermediate\$(Platform)\$(Configuration)\</IntDir>
-    <OutDir>..\bin\$(Configuration)\</OutDir>
+    <OutDir>..\bin\$(Platform)\$(Configuration)\</OutDir>
   </PropertyGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <ClCompile>
       <WarningLevel>Level3</WarningLevel>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>../CamelotCore/Include;../CamelotUtility/Include;./Include;../Dependencies/Include;./Dependencies/Include</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>CM_FONT_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>CM_FONT_EXPORTS;_WINDLL;USE_FREETYPE2_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
     </ClCompile>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -101,13 +101,14 @@
       <WarningLevel>Level3</WarningLevel>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>../CamelotCore/Include;../CamelotUtility/Include;./Include;../Dependencies/Include;./Dependencies/Include</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>CM_FONT_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>CM_FONT_EXPORTS;_WINDLL;USE_FREETYPE2_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
     </ClCompile>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <AdditionalLibraryDirectories>../lib/$(Platform)/$(Configuration);../Dependencies/lib/x64/Debug;./Dependencies/lib/x64/Debug</AdditionalLibraryDirectories>
       <AdditionalDependencies>CamelotCore.lib;CamelotUtility.lib;freetypeD.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <ImportLibrary>..\lib\$(Platform)\$(Configuration)\$(TargetName).lib</ImportLibrary>
+      <ShowProgress>NotSet</ShowProgress>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -117,7 +118,7 @@
       <FunctionLevelLinking>true</FunctionLevelLinking>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <AdditionalIncludeDirectories>../CamelotCore/Include;../CamelotUtility/Include;./Include;../Dependencies/Include;./Dependencies/Include</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>CM_FONT_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>CM_FONT_EXPORTS;_WINDLL;USE_FREETYPE2_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
     </ClCompile>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -135,7 +136,7 @@
       <FunctionLevelLinking>true</FunctionLevelLinking>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <AdditionalIncludeDirectories>../CamelotCore/Include;../CamelotUtility/Include;./Include;../Dependencies/Include;./Dependencies/Include</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>CM_FONT_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>CM_FONT_EXPORTS;_WINDLL;USE_FREETYPE2_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
     </ClCompile>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>

+ 115 - 1
CamelotFontImporter/Source/CmFontImporter.cpp

@@ -1,6 +1,11 @@
 #include "CmFontImporter.h"
+#include "CmFontImportOptions.h"
+#include "CmPixelData.h"
+#include "CmTexture.h"
+#include "CmResources.h"
 
 #include <ft2build.h>
+#include <freetype/freetype.h>
 #include FT_FREETYPE_H
 
 namespace CamelotEngine
@@ -33,7 +38,116 @@ namespace CamelotEngine
 
 	BaseResourceHandle FontImporter::import(const String& filePath, ConstImportOptionsPtr importOptions)
 	{
-		// TODO
+		const FontImportOptions* gpuProgImportOptions = static_cast<const FontImportOptions*>(importOptions.get());
+
+		FT_Library library;
+
+		FT_Error error = FT_Init_FreeType(&library);
+		if (error)
+			CM_EXCEPT(InternalErrorException, "Error occurred during FreeType library initialization.");
+
+		FT_Face face;
+		error = FT_New_Face(library, filePath.c_str(), 0, &face);
+
+		if (error == FT_Err_Unknown_File_Format)
+		{
+			CM_EXCEPT(InternalErrorException, "Failed to load font file: " + filePath + ". Unsupported file format.");
+		}
+		else if (error)
+		{
+			CM_EXCEPT(InternalErrorException, "Failed to load font file: " + filePath + ". Unknown error.");
+		}
+
+		vector<std::pair<UINT32, UINT32>>::type charIndexRanges = gpuProgImportOptions->getCharIndexRanges();
+		vector<UINT32>::type fontSizes = gpuProgImportOptions->getFontSizes();
+		UINT32 dpi = gpuProgImportOptions->getDPI();
+		for(size_t i = 0; i < fontSizes.size(); i++)
+		{
+			FT_F26Dot6 ftSize = (FT_F26Dot6)(fontSizes[i] * (1 << 6));
+			if(FT_Set_Char_Size( face, ftSize, 0, dpi, dpi))
+				CM_EXCEPT(InternalErrorException, "Could not set character size." );
+
+			
+		}
+
+		/************************************************************************/
+		/* 									DEBUG				         		*/
+		/************************************************************************/
+		
+		if(FT_Set_Char_Size(face, 12 * (1 << 6), 0, 96, 96))
+			CM_EXCEPT(InternalErrorException, "Could not set character size." );
+
+		INT32 maxWidth = 0;
+		INT32 maxHeight = 0;
+		for(UINT32 i = 33; i < 166; i++)
+		{
+			FT_Load_Char(face, i, FT_LOAD_RENDER);
+
+			FT_GlyphSlot slot = face->glyph;
+
+			if(slot->bitmap.width > maxWidth)
+				maxWidth = slot->bitmap.width;
+
+			if(slot->bitmap.rows > maxHeight)
+				maxHeight = slot->bitmap.rows;
+		}
+
+		UINT32 texWidth = 1024;
+		UINT32 texHeight = 1024;
+
+		UINT8* pixelBuffer = new UINT8[texWidth * texHeight];
+		PixelData pixelData(texWidth, texHeight, 1, PF_R8G8, pixelBuffer, true);
+
+		UINT32 curX = 0;
+		UINT32 curY = 0;
+		for(UINT32 i = 33; i < 166; i++)
+		{
+			if((curX + maxWidth) >= texWidth)
+			{
+				curX = 0;
+				curY += maxHeight;
+
+				if((curY + maxHeight) >= texHeight)
+					CM_EXCEPT(InternalErrorException, "Texture to small to fit all glyphs.");
+			}
+
+			FT_Load_Char(face, i, FT_LOAD_RENDER);
+			FT_GlyphSlot slot = face->glyph;
+
+			if(slot->bitmap.buffer == nullptr)
+			{
+				CM_EXCEPT(InternalErrorException, "Failed to render glyph bitmap");
+			}
+
+			UINT8* sourceBuffer = slot->bitmap.buffer;
+			UINT8* dstBuffer = pixelBuffer + (curY * texWidth * 2) + curX * 2;
+			for(INT32 bitmapRow = 0; bitmapRow < slot->bitmap.rows; bitmapRow++)
+			{
+				for(INT32 bitmapColumn = 0; bitmapColumn < slot->bitmap.width; bitmapColumn++)
+				{
+					dstBuffer[bitmapColumn * 2 + 0] = sourceBuffer[bitmapColumn];
+					dstBuffer[bitmapColumn * 2 + 1] = sourceBuffer[bitmapColumn];
+				}
+
+				dstBuffer += texWidth * 2;
+				sourceBuffer += slot->bitmap.pitch;
+			}
+
+			curX += maxWidth;
+		}
+
+		TextureHandle newTex = Texture::create(TEX_TYPE_2D, texWidth, texHeight, 0, PF_R8G8);
+		newTex->setRawPixels(pixelData);
+
+		Resources::instance().create(newTex, "C:\\FontTex.tex", true);
+
+		/************************************************************************/
+		/* 								END DEBUG	                     		*/
+		/************************************************************************/
+
+		
+		FT_Done_FreeType(library);
+
 		return BaseResourceHandle();
 	}
 }

+ 8 - 8
CamelotGLRenderer/Source/CmGLPixelFormat.cpp

@@ -43,8 +43,8 @@ namespace CamelotEngine  {
                 return GL_LUMINANCE;
             case PF_L16:
                 return GL_LUMINANCE;
-			case PF_BYTE_LA:
-				return GL_LUMINANCE_ALPHA;
+			case PF_R8G8:
+				return GL_RG;
 			case PF_R3G3B2:
 				return GL_RGB;
 			case PF_A1R5G5B5:
@@ -123,7 +123,7 @@ namespace CamelotEngine  {
             case PF_L8:
             case PF_R8G8B8:
             case PF_B8G8R8:
-			case PF_BYTE_LA:
+			case PF_R8G8:
                 return GL_UNSIGNED_BYTE;
 			case PF_R3G3B2:
 				return GL_UNSIGNED_BYTE_3_3_2;
@@ -218,8 +218,8 @@ namespace CamelotEngine  {
                 return GL_ALPHA8;
             case PF_A4L4:
                 return GL_LUMINANCE4_ALPHA4;
-			case PF_BYTE_LA:
-				return GL_LUMINANCE8_ALPHA8;
+			case PF_R8G8:
+				return GL_RG8;
 			case PF_R3G3B2:
 				return GL_R3_G3_B2;
 			case PF_A1R5G5B5:
@@ -340,9 +340,9 @@ namespace CamelotEngine  {
 			return PF_A8;
 		case GL_LUMINANCE4_ALPHA4:
 			// Unsupported by GL as input format, use the byte packed format
-			return PF_BYTE_LA;
-		case GL_LUMINANCE8_ALPHA8:
-			return PF_BYTE_LA;
+			return PF_R8G8;
+		case GL_RG8:
+			return PF_R8G8;
 		case GL_R3_G3_B2:
 			return PF_R3G3B2;
 		case GL_RGB5_A1:

+ 2 - 2
CamelotUtility/Include/CmPixelData.h

@@ -22,8 +22,8 @@ namespace CamelotEngine
 		PF_BYTE_A = PF_A8,
         /// 8-bit pixel format, 4 bits alpha, 4 bits luminance.
         PF_A4L4 = 4,
-		/// 2 byte pixel format, 1 byte luminance, 1 byte alpha
-		PF_BYTE_LA = 5,
+		/// 2 byte pixel format, 1 byte red, 1 byte green
+		PF_R8G8 = 5,
         /// 16-bit pixel format, 5 bits red, 6 bits green, 5 bits blue.
         PF_R5G6B5 = 6,
 		/// 16-bit pixel format, 5 bits red, 6 bits green, 5 bits blue.

+ 8 - 6
CamelotUtility/Source/CmPixelUtil.cpp

@@ -1434,9 +1434,9 @@ namespace CamelotEngine {
                 ((UINT16*)dest)[2] = (UINT16)Bitwise::floatToFixed(b, 16);
                 ((UINT16*)dest)[3] = (UINT16)Bitwise::floatToFixed(a, 16);
 				break;
-			case PF_BYTE_LA:
+			case PF_R8G8:
 				((UINT8*)dest)[0] = (UINT8)Bitwise::floatToFixed(r, 8);
-                ((UINT8*)dest)[1] = (UINT8)Bitwise::floatToFixed(a, 8);
+                ((UINT8*)dest)[1] = (UINT8)Bitwise::floatToFixed(g, 8);
 				break;
             default:
                 // Not yet supported
@@ -1573,9 +1573,11 @@ namespace CamelotEngine {
 				*b = Bitwise::fixedToFloat(((UINT16*)src)[2], 16);
 				*a = Bitwise::fixedToFloat(((UINT16*)src)[3], 16);
 				break;
-			case PF_BYTE_LA:
-				*r = *g = *b = Bitwise::fixedToFloat(((UINT8*)src)[0], 8);
-				*a = Bitwise::fixedToFloat(((UINT8*)src)[1], 8);
+			case PF_R8G8:
+				*r = Bitwise::fixedToFloat(((UINT8*)src)[0], 8);
+				*g = Bitwise::fixedToFloat(((UINT8*)src)[1], 8);
+				*b = 0.0f;
+				*a = 1.0f;
 				break;
             default:
                 // Not yet supported
@@ -1765,7 +1767,7 @@ namespace CamelotEngine {
 		case FILTER_BILINEAR:
 			switch (src.format) 
 			{
-			case PF_L8: case PF_A8: case PF_BYTE_LA:
+			case PF_L8: case PF_A8: case PF_R8G8:
 			case PF_R8G8B8: case PF_B8G8R8:
 			case PF_R8G8B8A8: case PF_B8G8R8A8:
 			case PF_A8B8G8R8: case PF_A8R8G8B8:

+ 2 - 0
Dependencies.txt

@@ -24,6 +24,8 @@ CamelotFreeImgImporter (optional) relies on:
 CamelotFontImporter (optional) relies on:
  - Freetype 2.3.5
   - http://www.freetype.org
+  - IMPORTANT NOTE: When compiling as static library make sure to define "FREETYPE2_STATIC". It is not defined by default
+    in provided Visual Studio projects, which can cause a headache.
 
 Place plug-in specific dependency files in:
  - Library include files in (CamelotRootDir)/(PluginDir)/Dependencies/Include

+ 0 - 10
TODO.txt

@@ -9,11 +9,6 @@
 
 ----------------------- CAMELOT 2D / GUI -----------------------------------------------------------
 
-Figure out how to initialize material/font/etc without going to render thread
- - Rename CoreGpuObject to CoreObject
-  - initialize_internal->initializeGpuData
-  - destroy_internal->destroyGpuData
-  - add a bit-flag "requiresGpuInitialization"
 Figure out how to store texture references in a font?
  - Currently I store a copy of the textures but how do I automatically update the font if they change?
  - Flesh out the dependencies system?
@@ -24,11 +19,6 @@ Figure out how to store texture references in a font?
 	 - In inspector they can be expanded as children of the main resource, but cannot be directly modified?
 	 - Deleting the main resource deletes the children too
 
-
- Can I make RTTIPlainType for vector?
- FontRTTI doesn't properly initialize or serialize FontDesc
- FontDEsc doesn't have RTTIPlainType defined
-
  Names: TextMesh & SpriteMesh instead of 2DText and 2DSprite!
 
 -----------------------IMMEDIATE TODO---------------------------------------------------------------