Преглед изворни кода

Fixing issues with managed serialization (resource ref types were always reported as unloaded)

BearishSun пре 9 година
родитељ
комит
1eb4993083

+ 2 - 0
Source/SBansheeEngine/Include/BsManagedSerializableObjectInfo.h

@@ -53,6 +53,8 @@ namespace BansheeEngine
 		Component,
 		PhysicsMaterial,
 		PhysicsMesh,
+		ManagedComponent,
+		Resource,
 		Count // Keep at end
 	};
 

+ 19 - 1
Source/SBansheeEngine/Source/BsManagedSerializableField.cpp

@@ -107,6 +107,20 @@ namespace BansheeEngine
 		return fieldData;
 	}
 
+	template<>
+	ManagedSerializableFieldDataPtr setScriptResource<ScriptResourceBase>(MonoObject* value)
+	{
+		auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataResourceRef>();
+
+		if (value != nullptr)
+		{
+			ScriptResourceBase* scriptResource = ScriptResource::toNative(value);
+			fieldData->value = scriptResource->getGenericHandle();
+		}
+
+		return fieldData;
+	}
+
 	struct ResourceFieldDataAccessors
 	{
 		std::function<MonoObject*(const HResource&)> getter;
@@ -120,6 +134,9 @@ namespace BansheeEngine
 
 		if(!initialized)
 		{
+			lookup[(int)ScriptReferenceType::Resource] =
+				{ &getScriptResource<Resource, ScriptResourceBase>, &setScriptResource<ScriptResourceBase> };
+
 			lookup[(int)ScriptReferenceType::Texture2D] =
 				{ &getScriptResource<Texture, ScriptTexture2D>, &setScriptResource<ScriptTexture2D> };
 
@@ -309,6 +326,7 @@ namespace BansheeEngine
 
 				return fieldData;
 			}
+			case ScriptReferenceType::ManagedComponent:
 			case ScriptReferenceType::Component:
 			{
 				auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataGameObjectRef>();
@@ -584,7 +602,7 @@ namespace BansheeEngine
 				else
 					return nullptr;
 			}
-			else if(refTypeInfo->mType == ScriptReferenceType::Component)
+			else if(refTypeInfo->mType == ScriptReferenceType::Component || refTypeInfo->mType == ScriptReferenceType::ManagedComponent)
 			{
 				if (value)
 				{

+ 64 - 34
Source/SBansheeEngine/Source/BsManagedSerializableObjectInfo.cpp

@@ -185,6 +185,32 @@ namespace BansheeEngine
 
 	bool ManagedSerializableTypeInfoRef::isTypeLoaded() const
 	{
+		switch (mType)
+		{
+		case ScriptReferenceType::Resource:
+		case ScriptReferenceType::Texture2D:
+		case ScriptReferenceType::Texture3D:
+		case ScriptReferenceType::TextureCube:
+		case ScriptReferenceType::SpriteTexture:
+		case ScriptReferenceType::Shader:
+		case ScriptReferenceType::ShaderInclude:
+		case ScriptReferenceType::Material:
+		case ScriptReferenceType::Mesh:
+		case ScriptReferenceType::PlainText:
+		case ScriptReferenceType::ScriptCode:
+		case ScriptReferenceType::Prefab:
+		case ScriptReferenceType::Font:
+		case ScriptReferenceType::StringTable:
+		case ScriptReferenceType::GUISkin:
+		case ScriptReferenceType::PhysicsMaterial:
+		case ScriptReferenceType::PhysicsMesh:
+		case ScriptReferenceType::SceneObject:
+		case ScriptReferenceType::Component:
+			return true;
+		default:
+			break;
+		}
+
 		return ScriptAssemblyManager::instance().hasSerializableObjectInfo(mTypeNamespace, mTypeName);
 	}
 
@@ -192,40 +218,44 @@ namespace BansheeEngine
 	{
 		switch (mType)
 		{
-		case ScriptReferenceType::Texture2D:
-			return ScriptTexture2D::getMetaData()->scriptClass->_getInternalClass();
-		case ScriptReferenceType::Texture3D:
-			return ScriptTexture3D::getMetaData()->scriptClass->_getInternalClass();
-		case ScriptReferenceType::TextureCube:
-			return ScriptTextureCube::getMetaData()->scriptClass->_getInternalClass();
-		case ScriptReferenceType::SpriteTexture:
-			return ScriptSpriteTexture::getMetaData()->scriptClass->_getInternalClass();
-		case ScriptReferenceType::Shader:
-			return ScriptShader::getMetaData()->scriptClass->_getInternalClass();
-		case ScriptReferenceType::ShaderInclude:
-			return ScriptShaderInclude::getMetaData()->scriptClass->_getInternalClass();
-		case ScriptReferenceType::Material:
-			return ScriptMaterial::getMetaData()->scriptClass->_getInternalClass();
-		case ScriptReferenceType::Mesh:
-			return ScriptMesh::getMetaData()->scriptClass->_getInternalClass();
-		case ScriptReferenceType::PlainText:
-			return ScriptPlainText::getMetaData()->scriptClass->_getInternalClass();
-		case ScriptReferenceType::ScriptCode:
-			return ScriptScriptCode::getMetaData()->scriptClass->_getInternalClass();
-		case ScriptReferenceType::Prefab:
-			return ScriptPrefab::getMetaData()->scriptClass->_getInternalClass();
-		case ScriptReferenceType::Font:
-			return ScriptFont::getMetaData()->scriptClass->_getInternalClass();
-		case ScriptReferenceType::StringTable:
-			return ScriptStringTable::getMetaData()->scriptClass->_getInternalClass();
-		case ScriptReferenceType::GUISkin:
-			return ScriptGUISkin::getMetaData()->scriptClass->_getInternalClass();
-		case ScriptReferenceType::PhysicsMaterial:
-			return ScriptPhysicsMaterial::getMetaData()->scriptClass->_getInternalClass();
-		case ScriptReferenceType::PhysicsMesh:
-			return ScriptPhysicsMesh::getMetaData()->scriptClass->_getInternalClass();
-		case ScriptReferenceType::SceneObject:
-			return ScriptAssemblyManager::instance().getSceneObjectClass()->_getInternalClass();
+		case ScriptReferenceType::Resource:
+			return ScriptResource::getMetaData()->scriptClass->_getInternalClass();
+		case ScriptReferenceType::Texture2D:
+			return ScriptTexture2D::getMetaData()->scriptClass->_getInternalClass();
+		case ScriptReferenceType::Texture3D:
+			return ScriptTexture3D::getMetaData()->scriptClass->_getInternalClass();
+		case ScriptReferenceType::TextureCube:
+			return ScriptTextureCube::getMetaData()->scriptClass->_getInternalClass();
+		case ScriptReferenceType::SpriteTexture:
+			return ScriptSpriteTexture::getMetaData()->scriptClass->_getInternalClass();
+		case ScriptReferenceType::Shader:
+			return ScriptShader::getMetaData()->scriptClass->_getInternalClass();
+		case ScriptReferenceType::ShaderInclude:
+			return ScriptShaderInclude::getMetaData()->scriptClass->_getInternalClass();
+		case ScriptReferenceType::Material:
+			return ScriptMaterial::getMetaData()->scriptClass->_getInternalClass();
+		case ScriptReferenceType::Mesh:
+			return ScriptMesh::getMetaData()->scriptClass->_getInternalClass();
+		case ScriptReferenceType::PlainText:
+			return ScriptPlainText::getMetaData()->scriptClass->_getInternalClass();
+		case ScriptReferenceType::ScriptCode:
+			return ScriptScriptCode::getMetaData()->scriptClass->_getInternalClass();
+		case ScriptReferenceType::Prefab:
+			return ScriptPrefab::getMetaData()->scriptClass->_getInternalClass();
+		case ScriptReferenceType::Font:
+			return ScriptFont::getMetaData()->scriptClass->_getInternalClass();
+		case ScriptReferenceType::StringTable:
+			return ScriptStringTable::getMetaData()->scriptClass->_getInternalClass();
+		case ScriptReferenceType::GUISkin:
+			return ScriptGUISkin::getMetaData()->scriptClass->_getInternalClass();
+		case ScriptReferenceType::PhysicsMaterial:
+			return ScriptPhysicsMaterial::getMetaData()->scriptClass->_getInternalClass();
+		case ScriptReferenceType::PhysicsMesh:
+			return ScriptPhysicsMesh::getMetaData()->scriptClass->_getInternalClass();
+		case ScriptReferenceType::SceneObject:
+			return ScriptAssemblyManager::instance().getSceneObjectClass()->_getInternalClass();
+		case ScriptReferenceType::Component:
+			return ScriptAssemblyManager::instance().getComponentClass()->_getInternalClass();
 		default:
 			break;
 		}

+ 20 - 3
Source/SBansheeEngine/Source/BsScriptAssemblyManager.cpp

@@ -268,13 +268,15 @@ namespace BansheeEngine
 				return typeInfo;
 			}
 		case MONO_TYPE_CLASS:
-			if(monoClass->isSubClassOf(ScriptResource::getMetaData()->scriptClass) || monoClass->isSubClassOf(mSceneObjectClass) || monoClass->isSubClassOf(mComponentClass))
+			if(monoClass->isSubClassOf(ScriptResource::getMetaData()->scriptClass)) // Resource
 			{
 				std::shared_ptr<ManagedSerializableTypeInfoRef> typeInfo = bs_shared_ptr_new<ManagedSerializableTypeInfoRef>();
 				typeInfo->mTypeNamespace = monoClass->getNamespace();
 				typeInfo->mTypeName = monoClass->getTypeName();
 
-				if (monoClass->isSubClassOf(ScriptTexture2D::getMetaData()->scriptClass))
+				if(monoClass == ScriptResource::getMetaData()->scriptClass)
+					typeInfo->mType = ScriptReferenceType::Resource;
+				else if (monoClass->isSubClassOf(ScriptTexture2D::getMetaData()->scriptClass))
 					typeInfo->mType = ScriptReferenceType::Texture2D;
 				else if (monoClass->isSubClassOf(ScriptTexture3D::getMetaData()->scriptClass))
 					typeInfo->mType = ScriptReferenceType::Texture3D;
@@ -308,10 +310,25 @@ namespace BansheeEngine
 					typeInfo->mType = ScriptReferenceType::PhysicsMaterial;
 				else if (monoClass->isSubClassOf(ScriptPhysicsMesh::getMetaData()->scriptClass))
 					typeInfo->mType = ScriptReferenceType::PhysicsMesh;
+				else
+				{
+					assert(false && "Unrecognized resource type");
+				}
+
+				return typeInfo;
+			}
+			else if (monoClass->isSubClassOf(mSceneObjectClass) || monoClass->isSubClassOf(mComponentClass)) // Game object
+			{
+				std::shared_ptr<ManagedSerializableTypeInfoRef> typeInfo = bs_shared_ptr_new<ManagedSerializableTypeInfoRef>();
+				typeInfo->mTypeNamespace = monoClass->getNamespace();
+				typeInfo->mTypeName = monoClass->getTypeName();
+
+				if (monoClass == mComponentClass)
+					typeInfo->mType = ScriptReferenceType::Component;
 				else if (monoClass->isSubClassOf(mSceneObjectClass))
 					typeInfo->mType = ScriptReferenceType::SceneObject;
 				else if (monoClass->isSubClassOf(mComponentClass))
-					typeInfo->mType = ScriptReferenceType::Component;
+					typeInfo->mType = ScriptReferenceType::ManagedComponent;
 
 				return typeInfo;
 			}