2
0
Marko Pintera 11 жил өмнө
parent
commit
2053bd429f

+ 26 - 0
SBansheeEngine/Include/BsScriptSerializableArray.h

@@ -0,0 +1,26 @@
+#pragma once
+
+#include "BsScriptEnginePrerequisites.h"
+#include "BsScriptObject.h"
+
+namespace BansheeEngine
+{
+	class BS_SCR_BE_EXPORT ScriptSerializableArray : public ScriptObject<ScriptSerializableArray>
+	{
+	public:
+		static void initMetaData();
+
+		static ScriptSerializableArray* create(const ManagedSerializableTypeInfoArrayPtr& typeInfo, MonoObject* object);
+
+	private:
+		static void internal_destroyInstance(ScriptSerializableArray* nativeInstance);
+		static MonoObject* internal_createProperty(ScriptSerializableArray* nativeInstance);
+
+		static void initRuntimeData();
+
+		ScriptSerializableArray(const ManagedSerializableTypeInfoArrayPtr& typeInfo);
+		~ScriptSerializableArray() {}
+
+		ManagedSerializableTypeInfoArrayPtr mTypeInfo;
+	};
+}

+ 60 - 0
SBansheeEngine/Source/BsScriptSerializableArray.cpp

@@ -0,0 +1,60 @@
+#include "BsScriptSerializableArray.h"
+#include "BsScriptMeta.h"
+#include "BsMonoField.h"
+#include "BsMonoClass.h"
+#include "BsMonoManager.h"
+#include "BsRuntimeScriptObjects.h"
+#include "BsManagedSerializableObjectInfo.h"
+#include "BsScriptSerializableProperty.h"
+
+namespace BansheeEngine
+{
+	ScriptSerializableArray::ScriptSerializableArray(const ManagedSerializableTypeInfoArrayPtr& typeInfo)
+		:mTypeInfo(typeInfo)
+	{
+
+	}
+
+	void ScriptSerializableArray::initMetaData()
+	{
+		metaData = ScriptMeta(BansheeEngineAssemblyName, "BansheeEngine", "SerializableArray", &ScriptSerializableArray::initRuntimeData);
+
+		MonoManager::registerScriptType(&metaData);
+	}
+
+	void ScriptSerializableArray::initRuntimeData()
+	{
+		metaData.scriptClass->addInternalCall("Internal_DestroyInstance", &ScriptSerializableArray::internal_destroyInstance);
+		metaData.scriptClass->addInternalCall("Internal_CreateProperty", &ScriptSerializableArray::internal_createProperty);
+	}
+
+	ScriptSerializableArray* ScriptSerializableArray::create(const ManagedSerializableTypeInfoArrayPtr& typeInfo, MonoObject* object)
+	{
+		ScriptSerializableArray* nativeInstance = new (cm_alloc<ScriptSerializableArray>()) ScriptSerializableArray(typeInfo);
+
+		MonoType* monoInternalElementType = mono_class_get_type(typeInfo->mElementType->getMonoClass());
+		MonoReflectionType* internalElementType = mono_type_get_object(MonoManager::instance().getDomain(), monoInternalElementType);
+
+		void* params[2] = { object, internalElementType };
+		MonoObject* managedInstance = metaData.scriptClass->createInstance(params, 2);
+
+		nativeInstance->createInstance(managedInstance);
+
+		metaData.thisPtrField->setValue(managedInstance, &nativeInstance);
+
+		return nativeInstance;
+	}
+
+	MonoObject* ScriptSerializableArray::internal_createProperty(ScriptSerializableArray* nativeInstance)
+	{
+		ScriptSerializableProperty* newProperty = ScriptSerializableProperty::create(nativeInstance->mTypeInfo->mElementType);
+
+		return newProperty->getManagedInstance();
+	}
+
+	void ScriptSerializableArray::internal_destroyInstance(ScriptSerializableArray* nativeInstance)
+	{
+		nativeInstance->~ScriptSerializableArray();
+		cm_free(nativeInstance);
+	}
+}