Selaa lähdekoodia

Refactored C# serialization set/get methods so there isn't as much code duplication

Marko Pintera 11 vuotta sitten
vanhempi
sitoutus
b90b98097d

+ 4 - 4
MBansheeEngine/Program.cs

@@ -90,11 +90,11 @@ namespace BansheeEngine
                 SceneObject childSO = so.GetChild(i);
                 SceneObject childSO = so.GetChild(i);
 
 
                 DbgComponent otherComponent = childSO.GetComponent<DbgComponent>();
                 DbgComponent otherComponent = childSO.GetComponent<DbgComponent>();
-                //reportDbgValue(otherComponent.a, otherComponent.b, otherComponent.complex.someValue,
-                //               otherComponent.complex2.anotherValue2);
+                reportDbgValue(otherComponent.a, otherComponent.b, otherComponent.complex.someValue,
+                               otherComponent.complex2.anotherValue2);
 
 
-               // reportDbgValue(otherComponent.arrA[4], otherComponent.arrB[4], otherComponent.arrComplex[4].someValue,
-               //   otherComponent.arrComplex2[4].anotherValue2);
+                reportDbgValue(otherComponent.arrA[4], otherComponent.arrB[4], otherComponent.arrComplex[4].someValue,
+                  otherComponent.arrComplex2[4].anotherValue2);
 
 
                 reportDbgValue(otherComponent.listA[0], otherComponent.listB[0], otherComponent.listComplex[1].someValue,
                 reportDbgValue(otherComponent.listA[0], otherComponent.listB[0], otherComponent.listComplex[1].someValue,
                     otherComponent.listComplex2[0].anotherValue2);
                     otherComponent.listComplex2[0].anotherValue2);

+ 1 - 1
SBansheeEngine/Include/BsScriptSerializableField.h

@@ -27,7 +27,7 @@ namespace BansheeEngine
 	class BS_SCR_BE_EXPORT ScriptSerializableFieldData : public CM::IReflectable
 	class BS_SCR_BE_EXPORT ScriptSerializableFieldData : public CM::IReflectable
 	{
 	{
 	public:
 	public:
-		static ScriptSerializableFieldDataPtr create(const ScriptSerializableTypeInfoPtr& typeInfo, void* value);
+		static ScriptSerializableFieldDataPtr create(const ScriptSerializableTypeInfoPtr& typeInfo, MonoObject* value);
 		virtual void* getValue(const ScriptSerializableTypeInfoPtr& typeInfo) = 0;
 		virtual void* getValue(const ScriptSerializableTypeInfoPtr& typeInfo) = 0;
 
 
 		/************************************************************************/
 		/************************************************************************/

+ 0 - 6
SBansheeEngine/Include/BsScriptSerializableObjectInfo.h

@@ -40,7 +40,6 @@ namespace BansheeEngine
 
 
 		virtual bool matches(const ScriptSerializableTypeInfoPtr& typeInfo) const = 0;
 		virtual bool matches(const ScriptSerializableTypeInfoPtr& typeInfo) const = 0;
 		virtual bool isTypeLoaded() const = 0;
 		virtual bool isTypeLoaded() const = 0;
-		virtual bool isRawType() const = 0;
 
 
 		virtual ::MonoClass* getMonoClass() const = 0;
 		virtual ::MonoClass* getMonoClass() const = 0;
 
 
@@ -60,7 +59,6 @@ namespace BansheeEngine
 
 
 		bool matches(const ScriptSerializableTypeInfoPtr& typeInfo) const;
 		bool matches(const ScriptSerializableTypeInfoPtr& typeInfo) const;
 		bool isTypeLoaded() const;
 		bool isTypeLoaded() const;
-		bool isRawType() const;
 
 
 		::MonoClass* getMonoClass() const;
 		::MonoClass* getMonoClass() const;
 
 
@@ -82,7 +80,6 @@ namespace BansheeEngine
 
 
 		bool matches(const ScriptSerializableTypeInfoPtr& typeInfo) const;
 		bool matches(const ScriptSerializableTypeInfoPtr& typeInfo) const;
 		bool isTypeLoaded() const;
 		bool isTypeLoaded() const;
-		bool isRawType() const { return false; }
 
 
 		::MonoClass* getMonoClass() const;
 		::MonoClass* getMonoClass() const;
 
 
@@ -103,7 +100,6 @@ namespace BansheeEngine
 
 
 		bool matches(const ScriptSerializableTypeInfoPtr& typeInfo) const;
 		bool matches(const ScriptSerializableTypeInfoPtr& typeInfo) const;
 		bool isTypeLoaded() const;
 		bool isTypeLoaded() const;
-		bool isRawType() const { return false; }
 
 
 		::MonoClass* getMonoClass() const;
 		::MonoClass* getMonoClass() const;
 
 
@@ -123,7 +119,6 @@ namespace BansheeEngine
 
 
 		bool matches(const ScriptSerializableTypeInfoPtr& typeInfo) const;
 		bool matches(const ScriptSerializableTypeInfoPtr& typeInfo) const;
 		bool isTypeLoaded() const;
 		bool isTypeLoaded() const;
-		bool isRawType() const { return false; }
 
 
 		::MonoClass* getMonoClass() const;
 		::MonoClass* getMonoClass() const;
 
 
@@ -144,7 +139,6 @@ namespace BansheeEngine
 
 
 		bool matches(const ScriptSerializableTypeInfoPtr& typeInfo) const;
 		bool matches(const ScriptSerializableTypeInfoPtr& typeInfo) const;
 		bool isTypeLoaded() const;
 		bool isTypeLoaded() const;
-		bool isRawType() const { return false; }
 
 
 		::MonoClass* getMonoClass() const;
 		::MonoClass* getMonoClass() const;
 
 

+ 9 - 31
SBansheeEngine/Source/BsScriptSerializableArray.cpp

@@ -92,29 +92,12 @@ namespace BansheeEngine
 
 
 	void ScriptSerializableArray::setFieldData(CM::UINT32 arrayIdx, const ScriptSerializableFieldDataPtr& val)
 	void ScriptSerializableArray::setFieldData(CM::UINT32 arrayIdx, const ScriptSerializableFieldDataPtr& val)
 	{
 	{
-		bool isBoxedValueType = false;
-		if(rtti_is_of_type<ScriptSerializableTypeInfoObject>(mArrayTypeInfo->mElementType))
-		{
-			ScriptSerializableTypeInfoObjectPtr objTypeInfo = std::static_pointer_cast<ScriptSerializableTypeInfoObject>(mArrayTypeInfo->mElementType);
-			isBoxedValueType = objTypeInfo->mValueType;
-		}
-
-		if(isBoxedValueType)
-		{
-			MonoObject* value = (MonoObject*)val->getValue(mArrayTypeInfo->mElementType);
-
-			if(value != nullptr)
-				setValue(arrayIdx, mono_object_unbox(value)); // Value types need to be set as native unboxed types
-		}
+		if(mono_class_is_valuetype(mElementMonoClass))
+			setValue(arrayIdx, val->getValue(mArrayTypeInfo->mElementType));
 		else
 		else
 		{
 		{
-			if(mArrayTypeInfo->mElementType->isRawType())
-				setValue(arrayIdx, val->getValue(mArrayTypeInfo->mElementType));
-			else
-			{
-				MonoObject* ptrToObj = (MonoObject*)val->getValue(mArrayTypeInfo->mElementType);
-				setValue(arrayIdx, &ptrToObj);
-			}
+			MonoObject* ptrToObj = (MonoObject*)val->getValue(mArrayTypeInfo->mElementType);
+			setValue(arrayIdx, &ptrToObj);
 		}
 		}
 	}
 	}
 
 
@@ -129,20 +112,15 @@ namespace BansheeEngine
 
 
 		if(mono_class_is_valuetype(mElementMonoClass))
 		if(mono_class_is_valuetype(mElementMonoClass))
 		{
 		{
-			if(mArrayTypeInfo->mElementType->isRawType())
-				return ScriptSerializableFieldData::create(mArrayTypeInfo->mElementType, arrayValue);
-			else
-			{
-				MonoObject* boxedObj = nullptr;
+			MonoObject* boxedObj = nullptr;
 
 
-				if(arrayValue != nullptr)
-					boxedObj = mono_value_box(MonoManager::instance().getDomain(), mElementMonoClass, arrayValue);
+			if(arrayValue != nullptr)
+				boxedObj = mono_value_box(MonoManager::instance().getDomain(), mElementMonoClass, arrayValue);
 
 
-				return ScriptSerializableFieldData::create(mArrayTypeInfo->mElementType, &boxedObj);
-			}
+			return ScriptSerializableFieldData::create(mArrayTypeInfo->mElementType, boxedObj);
 		}
 		}
 		else
 		else
-			return ScriptSerializableFieldData::create(mArrayTypeInfo->mElementType, arrayValue);
+			return ScriptSerializableFieldData::create(mArrayTypeInfo->mElementType, *(MonoObject**)arrayValue);
 	}
 	}
 	
 	
 	void ScriptSerializableArray::setValue(CM::UINT32 arrayIdx, void* val)
 	void ScriptSerializableArray::setValue(CM::UINT32 arrayIdx, void* val)

+ 4 - 66
SBansheeEngine/Source/BsScriptSerializableDictionary.cpp

@@ -19,36 +19,14 @@ namespace BansheeEngine
 	{
 	{
 		MonoObject* obj = mParent->mKeyProp->get(mCurrent);
 		MonoObject* obj = mParent->mKeyProp->get(mCurrent);
 
 
-		if(mParent->mDictionaryTypeInfo->mKeyType->isRawType())
-		{
-			void* unboxedValue = nullptr;
-			if(obj != nullptr)
-				unboxedValue = mono_object_unbox(obj);
-
-			return ScriptSerializableFieldData::create(mParent->mDictionaryTypeInfo->mKeyType, unboxedValue);
-		}
-		else
-		{
-			return ScriptSerializableFieldData::create(mParent->mDictionaryTypeInfo->mKeyType, &obj);
-		}
+		return ScriptSerializableFieldData::create(mParent->mDictionaryTypeInfo->mKeyType, obj);
 	}
 	}
 
 
 	ScriptSerializableFieldDataPtr ScriptSerializableDictionary::Enumerator::getValue() const
 	ScriptSerializableFieldDataPtr ScriptSerializableDictionary::Enumerator::getValue() const
 	{
 	{
 		MonoObject* obj = mParent->mValueProp->get(mCurrent);
 		MonoObject* obj = mParent->mValueProp->get(mCurrent);
 
 
-		if(mParent->mDictionaryTypeInfo->mValueType->isRawType())
-		{
-			void* unboxedValue = nullptr;
-			if(obj != nullptr)
-				unboxedValue = mono_object_unbox(obj);
-
-			return ScriptSerializableFieldData::create(mParent->mDictionaryTypeInfo->mValueType, unboxedValue);
-		}
-		else
-		{
-			return ScriptSerializableFieldData::create(mParent->mDictionaryTypeInfo->mValueType, &obj);
-		}
+		return ScriptSerializableFieldData::create(mParent->mDictionaryTypeInfo->mValueType, obj);
 	}
 	}
 
 
 	bool ScriptSerializableDictionary::Enumerator::moveNext()
 	bool ScriptSerializableDictionary::Enumerator::moveNext()
@@ -141,48 +119,8 @@ namespace BansheeEngine
 	void ScriptSerializableDictionary::setFieldData(const ScriptSerializableFieldDataPtr& key, const ScriptSerializableFieldDataPtr& val)
 	void ScriptSerializableDictionary::setFieldData(const ScriptSerializableFieldDataPtr& key, const ScriptSerializableFieldDataPtr& val)
 	{
 	{
 		void* params[2];
 		void* params[2];
-
-		bool isBoxedValueType = false;
-		if(rtti_is_of_type<ScriptSerializableTypeInfoObject>(mDictionaryTypeInfo->mKeyType))
-		{
-			ScriptSerializableTypeInfoObjectPtr objTypeInfo = std::static_pointer_cast<ScriptSerializableTypeInfoObject>(mDictionaryTypeInfo->mKeyType);
-			isBoxedValueType = objTypeInfo->mValueType;
-		}
-
-		if(isBoxedValueType)
-		{
-			MonoObject* value = (MonoObject*)val->getValue(mDictionaryTypeInfo->mKeyType);
-
-			if(value != nullptr)
-			{
-				params[0] = mono_object_unbox(value); // Value types need to be set as native unboxed types
-			}
-		}
-		else
-		{
-			params[0] = val->getValue(mDictionaryTypeInfo->mKeyType);
-		}
-
-		isBoxedValueType = false;
-		if(rtti_is_of_type<ScriptSerializableTypeInfoObject>(mDictionaryTypeInfo->mValueType))
-		{
-			ScriptSerializableTypeInfoObjectPtr objTypeInfo = std::static_pointer_cast<ScriptSerializableTypeInfoObject>(mDictionaryTypeInfo->mValueType);
-			isBoxedValueType = objTypeInfo->mValueType;
-		}
-
-		if(isBoxedValueType)
-		{
-			MonoObject* value = (MonoObject*)val->getValue(mDictionaryTypeInfo->mValueType);
-
-			if(value != nullptr)
-			{
-				params[1] = mono_object_unbox(value); // Value types need to be set as native unboxed types
-			}
-		}
-		else
-		{
-			params[1] = val->getValue(mDictionaryTypeInfo->mValueType);
-		}
+		params[0] = key->getValue(mDictionaryTypeInfo->mKeyType);
+		params[1] = val->getValue(mDictionaryTypeInfo->mValueType);
 
 
 		mAddMethod->invoke(mManagedInstance, params);
 		mAddMethod->invoke(mManagedInstance, params);
 	}
 	}

+ 54 - 43
SBansheeEngine/Source/BsScriptSerializableField.cpp

@@ -36,7 +36,7 @@ namespace BansheeEngine
 		return fieldDataEntry;
 		return fieldDataEntry;
 	}
 	}
 
 
-	ScriptSerializableFieldDataPtr ScriptSerializableFieldData::create(const ScriptSerializableTypeInfoPtr& typeInfo, void* value)
+	ScriptSerializableFieldDataPtr ScriptSerializableFieldData::create(const ScriptSerializableTypeInfoPtr& typeInfo, MonoObject* value)
 	{
 	{
 		if(typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
 		if(typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
 		{
 		{
@@ -46,78 +46,91 @@ namespace BansheeEngine
 			case ScriptPrimitiveType::Bool:
 			case ScriptPrimitiveType::Bool:
 				{
 				{
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataBool>();
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataBool>();
-					memcpy(&fieldData->value, value, sizeof(fieldData->value));
+					if(value != nullptr)
+						memcpy(&fieldData->value, mono_object_unbox(value), sizeof(fieldData->value));
+
 					return fieldData;
 					return fieldData;
 				}
 				}
 			case ScriptPrimitiveType::Char:
 			case ScriptPrimitiveType::Char:
 				{
 				{
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataChar>();
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataChar>();
-					memcpy(&fieldData->value, value, sizeof(fieldData->value));
+					if(value != nullptr)
+						memcpy(&fieldData->value, mono_object_unbox(value), sizeof(fieldData->value));
 					return fieldData;
 					return fieldData;
 				}
 				}
 			case ScriptPrimitiveType::I8:
 			case ScriptPrimitiveType::I8:
 				{
 				{
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataI8>();
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataI8>();
-					memcpy(&fieldData->value, value, sizeof(fieldData->value));
+					if(value != nullptr)
+						memcpy(&fieldData->value, mono_object_unbox(value), sizeof(fieldData->value));
 					return fieldData;
 					return fieldData;
 				}
 				}
 			case ScriptPrimitiveType::U8:
 			case ScriptPrimitiveType::U8:
 				{
 				{
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataU8>();
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataU8>();
-					memcpy(&fieldData->value, value, sizeof(fieldData->value));
+					if(value != nullptr)
+						memcpy(&fieldData->value, mono_object_unbox(value), sizeof(fieldData->value));
 					return fieldData;
 					return fieldData;
 				}
 				}
 			case ScriptPrimitiveType::I16:
 			case ScriptPrimitiveType::I16:
 				{
 				{
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataI16>();
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataI16>();
-					memcpy(&fieldData->value, value, sizeof(fieldData->value));
+					if(value != nullptr)
+						memcpy(&fieldData->value, mono_object_unbox(value), sizeof(fieldData->value));
 					return fieldData;
 					return fieldData;
 				}
 				}
 			case ScriptPrimitiveType::U16:
 			case ScriptPrimitiveType::U16:
 				{
 				{
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataU16>();
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataU16>();
-					memcpy(&fieldData->value, value, sizeof(fieldData->value));
+					if(value != nullptr)
+						memcpy(&fieldData->value, mono_object_unbox(value), sizeof(fieldData->value));
 					return fieldData;
 					return fieldData;
 				}
 				}
 			case ScriptPrimitiveType::I32:
 			case ScriptPrimitiveType::I32:
 				{
 				{
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataI32>();
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataI32>();
-					memcpy(&fieldData->value, value, sizeof(fieldData->value));
+					if(value != nullptr)
+						memcpy(&fieldData->value, mono_object_unbox(value), sizeof(fieldData->value));
 					return fieldData;
 					return fieldData;
 				}
 				}
 			case ScriptPrimitiveType::U32:
 			case ScriptPrimitiveType::U32:
 				{
 				{
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataU32>();
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataU32>();
-					memcpy(&fieldData->value, value, sizeof(fieldData->value));
+					if(value != nullptr)
+						memcpy(&fieldData->value, mono_object_unbox(value), sizeof(fieldData->value));
 					return fieldData;
 					return fieldData;
 				}
 				}
 			case ScriptPrimitiveType::I64:
 			case ScriptPrimitiveType::I64:
 				{
 				{
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataI64>();
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataI64>();
-					memcpy(&fieldData->value, value, sizeof(fieldData->value));
+					if(value != nullptr)
+						memcpy(&fieldData->value, mono_object_unbox(value), sizeof(fieldData->value));
 					return fieldData;
 					return fieldData;
 				}
 				}
 			case ScriptPrimitiveType::U64:
 			case ScriptPrimitiveType::U64:
 				{
 				{
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataU64>();
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataU64>();
-					memcpy(&fieldData->value, value, sizeof(fieldData->value));
+					if(value != nullptr)
+						memcpy(&fieldData->value, mono_object_unbox(value), sizeof(fieldData->value));
 					return fieldData;
 					return fieldData;
 				}
 				}
 			case ScriptPrimitiveType::Float:
 			case ScriptPrimitiveType::Float:
 				{
 				{
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataFloat>();
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataFloat>();
-					memcpy(&fieldData->value, value, sizeof(fieldData->value));
+					if(value != nullptr)
+						memcpy(&fieldData->value, mono_object_unbox(value), sizeof(fieldData->value));
 					return fieldData;
 					return fieldData;
 				}
 				}
 			case ScriptPrimitiveType::Double:
 			case ScriptPrimitiveType::Double:
 				{
 				{
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataDouble>();
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataDouble>();
-					memcpy(&fieldData->value, value, sizeof(fieldData->value));
+					if(value != nullptr)
+						memcpy(&fieldData->value, mono_object_unbox(value), sizeof(fieldData->value));
 					return fieldData;
 					return fieldData;
 				}
 				}
 			case ScriptPrimitiveType::String:
 			case ScriptPrimitiveType::String:
 				{
 				{
-					MonoString* strVal = *(MonoString**)(value);
+					MonoString* strVal = (MonoString*)(value);
 
 
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataString>();
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataString>();
 					if(strVal != nullptr)
 					if(strVal != nullptr)
@@ -126,12 +139,11 @@ namespace BansheeEngine
 				}
 				}
 			case ScriptPrimitiveType::TextureRef:
 			case ScriptPrimitiveType::TextureRef:
 				{
 				{
-					MonoObject* objVal = *(MonoObject**)(value);
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataResourceRef>();
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataResourceRef>();
 
 
-					if(objVal != nullptr)
+					if(value != nullptr)
 					{
 					{
-						ScriptTexture2D* scriptTexture2D = ScriptTexture2D::toNative(objVal);
+						ScriptTexture2D* scriptTexture2D = ScriptTexture2D::toNative(value);
 						fieldData->value = static_resource_cast<ScriptTexture2D>(scriptTexture2D->getNativeHandle());
 						fieldData->value = static_resource_cast<ScriptTexture2D>(scriptTexture2D->getNativeHandle());
 					}
 					}
 
 
@@ -139,12 +151,11 @@ namespace BansheeEngine
 				}
 				}
 			case ScriptPrimitiveType::SpriteTextureRef:
 			case ScriptPrimitiveType::SpriteTextureRef:
 				{
 				{
-					MonoObject* objVal = *(MonoObject**)(value);
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataResourceRef>();
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataResourceRef>();
 					
 					
-					if(objVal != nullptr)
+					if(value != nullptr)
 					{
 					{
-						ScriptSpriteTexture* scriptSpriteTexture = ScriptSpriteTexture::toNative(objVal);
+						ScriptSpriteTexture* scriptSpriteTexture = ScriptSpriteTexture::toNative(value);
 						fieldData->value = static_resource_cast<SpriteTexture>(scriptSpriteTexture->getNativeHandle());
 						fieldData->value = static_resource_cast<SpriteTexture>(scriptSpriteTexture->getNativeHandle());
 					}
 					}
 
 
@@ -152,12 +163,11 @@ namespace BansheeEngine
 				}
 				}
 			case ScriptPrimitiveType::SceneObjectRef:
 			case ScriptPrimitiveType::SceneObjectRef:
 				{
 				{
-					MonoObject* objVal = *(MonoObject**)(value);
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataGameObjectRef>();
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataGameObjectRef>();
 
 
-					if(objVal != nullptr)
+					if(value != nullptr)
 					{
 					{
-						ScriptSceneObject* scriptSceneObject = ScriptSceneObject::toNative(objVal);
+						ScriptSceneObject* scriptSceneObject = ScriptSceneObject::toNative(value);
 						fieldData->value = static_object_cast<SceneObject>(scriptSceneObject->getNativeHandle());
 						fieldData->value = static_object_cast<SceneObject>(scriptSceneObject->getNativeHandle());
 					}
 					}
 
 
@@ -165,12 +175,11 @@ namespace BansheeEngine
 				}
 				}
 			case ScriptPrimitiveType::ComponentRef:
 			case ScriptPrimitiveType::ComponentRef:
 				{
 				{
-					MonoObject* objVal = *(MonoObject**)(value);
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataGameObjectRef>();
 					auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataGameObjectRef>();
 
 
-					if(objVal != nullptr)
+					if(value != nullptr)
 					{
 					{
-						ScriptComponent* scriptComponent = ScriptComponent::toNative(objVal);
+						ScriptComponent* scriptComponent = ScriptComponent::toNative(value);
 						fieldData->value = static_object_cast<Component>(scriptComponent->getNativeHandle());
 						fieldData->value = static_object_cast<Component>(scriptComponent->getNativeHandle());
 					}
 					}
 
 
@@ -180,48 +189,40 @@ namespace BansheeEngine
 		}
 		}
 		else if(typeInfo->getTypeId() == TID_SerializableTypeInfoObject)
 		else if(typeInfo->getTypeId() == TID_SerializableTypeInfoObject)
 		{
 		{
-			MonoObject* objVal = *(MonoObject**)(value);
-
 			auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataObject>();
 			auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataObject>();
-			if(objVal != nullptr)
+			if(value != nullptr)
 			{
 			{
-				fieldData->value = ScriptSerializableObject::create(objVal);
+				fieldData->value = ScriptSerializableObject::create(value);
 			}
 			}
 
 
 			return fieldData;
 			return fieldData;
 		}
 		}
 		else if(typeInfo->getTypeId() == TID_SerializableTypeInfoArray)
 		else if(typeInfo->getTypeId() == TID_SerializableTypeInfoArray)
 		{
 		{
-			MonoObject* objVal = *(MonoObject**)(value);
-
 			auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataArray>();
 			auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataArray>();
-			if(objVal != nullptr)
+			if(value != nullptr)
 			{
 			{
-				fieldData->value = ScriptSerializableArray::create(objVal, std::static_pointer_cast<ScriptSerializableTypeInfoArray>(typeInfo));
+				fieldData->value = ScriptSerializableArray::create(value, std::static_pointer_cast<ScriptSerializableTypeInfoArray>(typeInfo));
 			}
 			}
 
 
 			return fieldData;
 			return fieldData;
 		}
 		}
 		else if(typeInfo->getTypeId() == TID_SerializableTypeInfoList)
 		else if(typeInfo->getTypeId() == TID_SerializableTypeInfoList)
 		{
 		{
-			MonoObject* objVal = *(MonoObject**)(value);
-
 			auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataList>();
 			auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataList>();
-			if(objVal != nullptr)
+			if(value != nullptr)
 			{
 			{
-				fieldData->value = ScriptSerializableList::create(objVal, std::static_pointer_cast<ScriptSerializableTypeInfoList>(typeInfo));
+				fieldData->value = ScriptSerializableList::create(value, std::static_pointer_cast<ScriptSerializableTypeInfoList>(typeInfo));
 			}
 			}
 
 
 			return fieldData;
 			return fieldData;
 		}
 		}
 		else if(typeInfo->getTypeId() == TID_SerializableTypeInfoDictionary)
 		else if(typeInfo->getTypeId() == TID_SerializableTypeInfoDictionary)
 		{
 		{
-			MonoObject* objVal = *(MonoObject**)(value);
-
 			auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataDictionary>();
 			auto fieldData = cm_shared_ptr<ScriptSerializableFieldDataDictionary>();
-			if(objVal != nullptr)
+			if(value != nullptr)
 			{
 			{
-				fieldData->value = ScriptSerializableDictionary::create(objVal, std::static_pointer_cast<ScriptSerializableTypeInfoDictionary>(typeInfo));
+				fieldData->value = ScriptSerializableDictionary::create(value, std::static_pointer_cast<ScriptSerializableTypeInfoDictionary>(typeInfo));
 			}
 			}
 
 
 			return fieldData;
 			return fieldData;
@@ -470,7 +471,17 @@ namespace BansheeEngine
 			auto objectTypeInfo = std::static_pointer_cast<ScriptSerializableTypeInfoObject>(typeInfo);
 			auto objectTypeInfo = std::static_pointer_cast<ScriptSerializableTypeInfoObject>(typeInfo);
 
 
 			if(value != nullptr)
 			if(value != nullptr)
-				return value->getManagedInstance();
+			{
+				if(objectTypeInfo->mValueType)
+				{
+					MonoObject* managedInstance = value->getManagedInstance();
+					
+					if(managedInstance != nullptr)
+						return mono_object_unbox(managedInstance); // Structs are passed as raw types because mono expects them as such
+				}
+				else
+					return value->getManagedInstance();
+			}
 
 
 			return nullptr;
 			return nullptr;
 		}
 		}

+ 3 - 34
SBansheeEngine/Source/BsScriptSerializableList.cpp

@@ -89,47 +89,16 @@ namespace BansheeEngine
 
 
 	void ScriptSerializableList::addFieldData(const ScriptSerializableFieldDataPtr& val)
 	void ScriptSerializableList::addFieldData(const ScriptSerializableFieldDataPtr& val)
 	{
 	{
-		bool isBoxedValueType = false;
-		if(rtti_is_of_type<ScriptSerializableTypeInfoObject>(mListTypeInfo->mElementType))
-		{
-			ScriptSerializableTypeInfoObjectPtr objTypeInfo = std::static_pointer_cast<ScriptSerializableTypeInfoObject>(mListTypeInfo->mElementType);
-			isBoxedValueType = objTypeInfo->mValueType;
-		}
-
 		void* params[1];
 		void* params[1];
-		if(isBoxedValueType)
-		{
-			MonoObject* value = (MonoObject*)val->getValue(mListTypeInfo->mElementType);
-
-			if(value != nullptr)
-			{
-				params[0] = mono_object_unbox(value); // Value types need to be set as native unboxed types
-				mAddMethod->invoke(mManagedInstance, params);
-			}
-		}
-		else
-		{
-			params[0] = val->getValue(mListTypeInfo->mElementType);
-			mAddMethod->invoke(mManagedInstance, params);
-		}
+		params[0] = val->getValue(mListTypeInfo->mElementType);
+		mAddMethod->invoke(mManagedInstance, params);
 	}
 	}
 
 
 	ScriptSerializableFieldDataPtr ScriptSerializableList::getFieldData(CM::UINT32 arrayIdx)
 	ScriptSerializableFieldDataPtr ScriptSerializableList::getFieldData(CM::UINT32 arrayIdx)
 	{
 	{
 		MonoObject* obj = mItemProp->getIndexed(mManagedInstance, &arrayIdx);
 		MonoObject* obj = mItemProp->getIndexed(mManagedInstance, &arrayIdx);
 
 
-		if(mListTypeInfo->mElementType->isRawType())
-		{
-			void* unboxedValue = nullptr;
-			if(obj != nullptr)
-				unboxedValue = mono_object_unbox(obj);
-
-			return ScriptSerializableFieldData::create(mListTypeInfo->mElementType, unboxedValue);
-		}
-		else
-		{
-			return ScriptSerializableFieldData::create(mListTypeInfo->mElementType, &obj);
-		}	
+		return ScriptSerializableFieldData::create(mListTypeInfo->mElementType, obj);
 	}
 	}
 
 
 	UINT32 ScriptSerializableList::getLength() const
 	UINT32 ScriptSerializableList::getLength() const

+ 2 - 28
SBansheeEngine/Source/BsScriptSerializableObject.cpp

@@ -165,40 +165,14 @@ namespace BansheeEngine
 
 
 	void ScriptSerializableObject::setFieldData(const ScriptSerializableFieldInfoPtr& fieldInfo, const ScriptSerializableFieldDataPtr& val)
 	void ScriptSerializableObject::setFieldData(const ScriptSerializableFieldInfoPtr& fieldInfo, const ScriptSerializableFieldDataPtr& val)
 	{
 	{
-		bool isBoxedValueType = false;
-		if(rtti_is_of_type<ScriptSerializableTypeInfoObject>(fieldInfo->mTypeInfo))
-		{
-			ScriptSerializableTypeInfoObjectPtr objTypeInfo = std::static_pointer_cast<ScriptSerializableTypeInfoObject>(fieldInfo->mTypeInfo);
-			isBoxedValueType = objTypeInfo->mValueType;
-		}
-
-		if(isBoxedValueType)
-		{
-			MonoObject* value = (MonoObject*)val->getValue(fieldInfo->mTypeInfo);
-
-			if(value != nullptr)
-				fieldInfo->mMonoField->setValue(mManagedInstance, mono_object_unbox(value)); // Value types need to be set as native unboxed types
-		}
-		else
-			fieldInfo->mMonoField->setValue(mManagedInstance, val->getValue(fieldInfo->mTypeInfo));
+		fieldInfo->mMonoField->setValue(mManagedInstance, val->getValue(fieldInfo->mTypeInfo));
 	}
 	}
 
 
 	ScriptSerializableFieldDataPtr ScriptSerializableObject::getFieldData(const ScriptSerializableFieldInfoPtr& fieldInfo)
 	ScriptSerializableFieldDataPtr ScriptSerializableObject::getFieldData(const ScriptSerializableFieldInfoPtr& fieldInfo)
 	{
 	{
 		MonoObject* fieldValue = fieldInfo->mMonoField->getValueBoxed(mManagedInstance);
 		MonoObject* fieldValue = fieldInfo->mMonoField->getValueBoxed(mManagedInstance);
 
 
-		if(fieldInfo->mTypeInfo->isRawType())
-		{
-			void* unboxedValue = nullptr;
-			if(fieldValue != nullptr)
-				unboxedValue = mono_object_unbox(fieldValue);
-
-			return ScriptSerializableFieldData::create(fieldInfo->mTypeInfo, unboxedValue);
-		}
-		else
-		{
-			return ScriptSerializableFieldData::create(fieldInfo->mTypeInfo, &fieldValue);
-		}			
+		return ScriptSerializableFieldData::create(fieldInfo->mTypeInfo, fieldValue);		
 	}
 	}
 
 
 	RTTITypeBase* ScriptSerializableObject::getRTTIStatic()
 	RTTITypeBase* ScriptSerializableObject::getRTTIStatic()

+ 0 - 15
SBansheeEngine/Source/BsScriptSerializableObjectInfo.cpp

@@ -127,21 +127,6 @@ namespace BansheeEngine
 		return nullptr;
 		return nullptr;
 	}
 	}
 
 
-	bool ScriptSerializableTypeInfoPrimitive::isRawType() const
-	{
-		switch(mType)
-		{
-			case ScriptPrimitiveType::SceneObjectRef:
-			case ScriptPrimitiveType::ComponentRef:
-			case ScriptPrimitiveType::TextureRef:
-			case ScriptPrimitiveType::SpriteTextureRef:
-			case ScriptPrimitiveType::String:
-				return false;
-		}
-
-		return true;
-	}
-
 	RTTITypeBase* ScriptSerializableTypeInfoPrimitive::getRTTIStatic()
 	RTTITypeBase* ScriptSerializableTypeInfoPrimitive::getRTTIStatic()
 	{
 	{
 		return ScriptSerializableTypeInfoPrimitiveRTTI::instance();
 		return ScriptSerializableTypeInfoPrimitiveRTTI::instance();