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

Properly create managed resource for StringTable

Marko Pintera 10 лет назад
Родитель
Сommit
77bf1bdbbe

+ 1 - 1
MBansheeEditor/ProjectLibrary.cs

@@ -237,7 +237,7 @@ namespace BansheeEditor
     // Note: Must be the same as C++ enum ScriptResourceType
     // Note: Must be the same as C++ enum ScriptResourceType
     public enum ResourceType
     public enum ResourceType
     {
     {
-        Texture, SpriteTexture, Mesh, Font, Shader, Material, Prefab, PlainText, ScriptCode, Undefined
+        Texture, SpriteTexture, Mesh, Font, Shader, Material, Prefab, PlainText, ScriptCode, StringTable, Undefined
     }
     }
 
 
     public class LibraryEntry : ScriptObject
     public class LibraryEntry : ScriptObject

+ 7 - 3
MBansheeEngine/StringTable.cs

@@ -8,9 +8,10 @@ namespace BansheeEngine
 {
 {
     public sealed class StringTable : Resource
     public sealed class StringTable : Resource
     {
     {
-        // For internal use by the runtime
-        private StringTable()
-        { }
+        public StringTable()
+        {
+            Internal_CreateInstance(this);
+        }
 
 
         public int GetNumStrings()
         public int GetNumStrings()
         {
         {
@@ -51,6 +52,9 @@ namespace BansheeEngine
             return value;
             return value;
         }
         }
 
 
+        [MethodImpl(MethodImplOptions.InternalCall)]
+        private static extern void Internal_CreateInstance(StringTable instance);
+
         [MethodImpl(MethodImplOptions.InternalCall)]
         [MethodImpl(MethodImplOptions.InternalCall)]
         private static extern int Internal_GetNumStrings(IntPtr thisPtr);
         private static extern int Internal_GetNumStrings(IntPtr thisPtr);
         [MethodImpl(MethodImplOptions.InternalCall)]
         [MethodImpl(MethodImplOptions.InternalCall)]

+ 1 - 1
SBansheeEngine/Include/BsScriptResource.h

@@ -7,7 +7,7 @@ namespace BansheeEngine
 {
 {
 	enum class ScriptResourceType
 	enum class ScriptResourceType
 	{
 	{
-		Texture, SpriteTexture, Mesh, Font, Shader, Material, Prefab, PlainText, ScriptCode, Undefined
+		Texture, SpriteTexture, Mesh, Font, Shader, Material, Prefab, PlainText, ScriptCode, StringTable, Undefined
 	};
 	};
 
 
 	class BS_SCR_BE_EXPORT ScriptResourceBase : public PersistentScriptObjectBase
 	class BS_SCR_BE_EXPORT ScriptResourceBase : public PersistentScriptObjectBase

+ 2 - 0
SBansheeEngine/Include/BsScriptStringTable.h

@@ -19,6 +19,8 @@ namespace BansheeEngine
 		HStringTable getStringTableHandle() const { return mTable; }
 		HStringTable getStringTableHandle() const { return mTable; }
 
 
 	private:
 	private:
+		static void internal_CreateInstance(MonoObject* instance);
+
 		static UINT32 internal_GetNumStrings(ScriptStringTable* thisPtr);
 		static UINT32 internal_GetNumStrings(ScriptStringTable* thisPtr);
 		static MonoArray* internal_GetIdentifiers(ScriptStringTable* thisPtr);
 		static MonoArray* internal_GetIdentifiers(ScriptStringTable* thisPtr);
 
 

+ 4 - 0
SBansheeEngine/Source/BsScriptResource.cpp

@@ -38,6 +38,8 @@ namespace BansheeEngine
 			return ScriptResourceType::Font;
 			return ScriptResourceType::Font;
 		case TID_Prefab:
 		case TID_Prefab:
 			return ScriptResourceType::Prefab;
 			return ScriptResourceType::Prefab;
+		case TID_StringTable:
+			return ScriptResourceType::StringTable;
 		case TID_PlainText:
 		case TID_PlainText:
 			return ScriptResourceType::PlainText;
 			return ScriptResourceType::PlainText;
 		case TID_ScriptCode:
 		case TID_ScriptCode:
@@ -65,6 +67,8 @@ namespace BansheeEngine
 			return TID_Material;
 			return TID_Material;
 		case ScriptResourceType::Prefab:
 		case ScriptResourceType::Prefab:
 			return TID_Prefab;
 			return TID_Prefab;
+		case ScriptResourceType::StringTable:
+			return TID_StringTable;
 		case ScriptResourceType::PlainText:
 		case ScriptResourceType::PlainText:
 			return TID_PlainText;
 			return TID_PlainText;
 		case ScriptResourceType::ScriptCode:
 		case ScriptResourceType::ScriptCode:

+ 7 - 1
SBansheeEngine/Source/BsScriptResourceManager.cpp

@@ -259,7 +259,9 @@ namespace BansheeEngine
 		MonoClass* stringTableClass = ScriptAssemblyManager::instance().getStringTableClass();
 		MonoClass* stringTableClass = ScriptAssemblyManager::instance().getStringTableClass();
 		MonoObject* monoInstance = stringTableClass->createInstance();
 		MonoObject* monoInstance = stringTableClass->createInstance();
 
 
-		return createScriptStringTable(monoInstance, resourceHandle);
+		// Managed constructor will call ::create(MonoObject*, const HStringTable&) internally so we just need
+		// to retrieve the created object
+		return ScriptStringTable::toNative(monoInstance);
 	}
 	}
 
 
 	ScriptStringTable* ScriptResourceManager::createScriptStringTable(MonoObject* instance, const HStringTable& resourceHandle)
 	ScriptStringTable* ScriptResourceManager::createScriptStringTable(MonoObject* instance, const HStringTable& resourceHandle)
@@ -390,6 +392,10 @@ namespace BansheeEngine
 			return createScriptScriptCode(static_resource_cast<ScriptCode>(resource));
 			return createScriptScriptCode(static_resource_cast<ScriptCode>(resource));
 		case TID_Shader:
 		case TID_Shader:
 			return createScriptShader(static_resource_cast<Shader>(resource));
 			return createScriptShader(static_resource_cast<Shader>(resource));
+		case TID_Prefab:
+			return createScriptPrefab(static_resource_cast<Prefab>(resource));
+		case TID_StringTable:
+			return createScriptStringTable(static_resource_cast<StringTable>(resource));
 		case TID_Material:
 		case TID_Material:
 			return createScriptMaterial(static_resource_cast<Material>(resource));
 			return createScriptMaterial(static_resource_cast<Material>(resource));
 		case TID_Mesh:
 		case TID_Mesh:

+ 7 - 0
SBansheeEngine/Source/BsScriptStringTable.cpp

@@ -25,6 +25,13 @@ namespace BansheeEngine
 		metaData.scriptClass->addInternalCall("Internal_GetStringDefault", &ScriptStringTable::internal_GetStringDefault);
 		metaData.scriptClass->addInternalCall("Internal_GetStringDefault", &ScriptStringTable::internal_GetStringDefault);
 	}
 	}
 
 
+	void ScriptStringTable::internal_CreateInstance(MonoObject* instance)
+	{
+		HStringTable stringTable = StringTable::create();
+
+		ScriptResourceManager::instance().createScriptStringTable(instance, stringTable);
+	}
+
 	UINT32 ScriptStringTable::internal_GetNumStrings(ScriptStringTable* thisPtr)
 	UINT32 ScriptStringTable::internal_GetNumStrings(ScriptStringTable* thisPtr)
 	{
 	{
 		return (UINT32)thisPtr->getStringTableHandle()->getIdentifiers().size();
 		return (UINT32)thisPtr->getStringTableHandle()->getIdentifiers().size();