| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- #include "BsScriptSerializableObject.h"
- #include "BsScriptSerializableObjectRTTI.h"
- #include "BsScriptSerializableObjectInfo.h"
- #include "BsScriptSerializableField.h"
- #include "BsRuntimeScriptObjects.h"
- #include "BsMonoField.h"
- using namespace CamelotFramework;
- namespace BansheeEngine
- {
- ScriptSerializableObject::ScriptSerializableObject(const ConstructPrivately& dummy)
- :mManagedInstance(nullptr)
- {
- }
- ScriptSerializableObject::ScriptSerializableObject(const ConstructPrivately& dummy, ScriptSerializableObjectInfoPtr objInfo, MonoObject* managedInstance)
- :mObjInfo(objInfo), mManagedInstance(managedInstance)
- {
- ScriptSerializableObjectInfoPtr curType = mObjInfo;
- UINT32 numFields = 0;
- while(curType != nullptr)
- {
- for(auto& field : mObjInfo->mFields)
- {
- if(field.second->isSerializable())
- numFields++;
- }
- curType = curType->mBaseClass;
- }
- mFieldEntries.resize(numFields);
- curType = mObjInfo;
- UINT32 curIdx = 0;
- while(curType != nullptr)
- {
- for(auto& field : mObjInfo->mFields)
- {
- if(!field.second->isSerializable())
- continue;
- ScriptSerializableFieldKeyPtr fieldKey = ScriptSerializableFieldKey::create(curType->mTypeId, field.second->mFieldId);
- ScriptSerializableFieldDataPtr fieldData = getFieldData(field.second);
- mFieldEntries[curIdx] = ScriptSerializableFieldDataEntry::create(fieldKey, fieldData);
- curIdx++;
- }
- curType = curType->mBaseClass;
- }
- }
- ScriptSerializableObjectPtr ScriptSerializableObject::create(MonoObject* managedInstance)
- {
- ::MonoClass* monoClass = mono_object_get_class(managedInstance);
- String elementNs = mono_class_get_namespace(monoClass);
- String elementTypeName = mono_class_get_name(monoClass);
- ScriptSerializableObjectInfoPtr objInfo;
- if(!RuntimeScriptObjects::instance().getSerializableObjectInfo(elementNs, elementTypeName, objInfo))
- return nullptr;
- return cm_shared_ptr<ScriptSerializableObject>(ConstructPrivately(), objInfo, managedInstance);
- }
- ScriptSerializableObjectPtr ScriptSerializableObject::createEmpty()
- {
- return cm_shared_ptr<ScriptSerializableObject>(ConstructPrivately());
- }
- void ScriptSerializableObject::setFieldData(const ScriptSerializableFieldInfoPtr& fieldInfo, const ScriptSerializableFieldDataPtr& val)
- {
- setValue(fieldInfo, val->getValue(fieldInfo->mTypeInfo));
- }
- ScriptSerializableFieldDataPtr ScriptSerializableObject::getFieldData(const ScriptSerializableFieldInfoPtr& fieldInfo)
- {
- return ScriptSerializableFieldData::create(fieldInfo->mTypeInfo, getValue(fieldInfo));
- }
- void ScriptSerializableObject::setValue(const ScriptSerializableFieldInfoPtr& fieldInfo, void* val)
- {
- fieldInfo->mMonoField->setValue(mManagedInstance, val);
- }
- void* ScriptSerializableObject::getValue(const ScriptSerializableFieldInfoPtr& fieldInfo)
- {
- return fieldInfo->mMonoField->getValue(mManagedInstance);
- }
- RTTITypeBase* ScriptSerializableObject::getRTTIStatic()
- {
- return ScriptSerializableObjectRTTI::instance();
- }
- RTTITypeBase* ScriptSerializableObject::getRTTI() const
- {
- return ScriptSerializableObject::getRTTIStatic();
- }
- }
|