BsScriptSerializableArray.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #include "BsScriptSerializableArray.h"
  2. #include "BsScriptMeta.h"
  3. #include "BsMonoField.h"
  4. #include "BsMonoClass.h"
  5. #include "BsMonoManager.h"
  6. #include "BsRuntimeScriptObjects.h"
  7. #include "BsManagedSerializableObjectInfo.h"
  8. #include "BsScriptSerializableProperty.h"
  9. namespace BansheeEngine
  10. {
  11. ScriptSerializableArray::ScriptSerializableArray(const ManagedSerializableTypeInfoArrayPtr& typeInfo)
  12. :mTypeInfo(typeInfo)
  13. {
  14. }
  15. void ScriptSerializableArray::initMetaData()
  16. {
  17. metaData = ScriptMeta(BansheeEngineAssemblyName, "BansheeEngine", "SerializableArray", &ScriptSerializableArray::initRuntimeData);
  18. MonoManager::registerScriptType(&metaData);
  19. }
  20. void ScriptSerializableArray::initRuntimeData()
  21. {
  22. metaData.scriptClass->addInternalCall("Internal_DestroyInstance", &ScriptSerializableArray::internal_destroyInstance);
  23. metaData.scriptClass->addInternalCall("Internal_CreateProperty", &ScriptSerializableArray::internal_createProperty);
  24. }
  25. ScriptSerializableArray* ScriptSerializableArray::create(const ManagedSerializableTypeInfoArrayPtr& typeInfo, MonoObject* object)
  26. {
  27. ScriptSerializableArray* nativeInstance = new (cm_alloc<ScriptSerializableArray>()) ScriptSerializableArray(typeInfo);
  28. MonoType* monoInternalElementType = mono_class_get_type(typeInfo->mElementType->getMonoClass());
  29. MonoReflectionType* internalElementType = mono_type_get_object(MonoManager::instance().getDomain(), monoInternalElementType);
  30. void* params[2] = { object, internalElementType };
  31. MonoObject* managedInstance = metaData.scriptClass->createInstance(params, 2);
  32. nativeInstance->createInstance(managedInstance);
  33. metaData.thisPtrField->setValue(managedInstance, &nativeInstance);
  34. return nativeInstance;
  35. }
  36. MonoObject* ScriptSerializableArray::internal_createProperty(ScriptSerializableArray* nativeInstance)
  37. {
  38. ScriptSerializableProperty* newProperty = ScriptSerializableProperty::create(nativeInstance->mTypeInfo->mElementType);
  39. return newProperty->getManagedInstance();
  40. }
  41. void ScriptSerializableArray::internal_destroyInstance(ScriptSerializableArray* nativeInstance)
  42. {
  43. nativeInstance->~ScriptSerializableArray();
  44. cm_free(nativeInstance);
  45. }
  46. }