//********************************** Banshee Engine (www.banshee3d.com) **************************************************// //**************** Copyright (c) 2016 Marko Pintera (marko.pintera@gmail.com). All rights reserved. **********************// #pragma once #include "BsScriptEnginePrerequisites.h" #include "Reflection/BsRTTIType.h" #include "Serialization/BsScriptAssemblyManager.h" #include "Serialization/BsManagedSerializableObject.h" #include "Serialization/BsManagedSerializableField.h" #include "Serialization/BsManagedDiff.h" namespace bs { /** @cond RTTI */ /** @addtogroup RTTI-Impl-SEngine * @{ */ class BS_SCR_BE_EXPORT ManagedSerializableObjectRTTI : public RTTIType { private: SPtr getInfo(ManagedSerializableObject* obj) { return obj->mObjInfo; } void setInfo(ManagedSerializableObject* obj, SPtr val) { obj->mObjInfo = val; } SPtr getFieldEntry(ManagedSerializableObject* obj, UINT32 arrayIdx) { Vector>& sequentialFields = any_cast_ref>>(obj->mRTTIData); SPtr field = sequentialFields[arrayIdx]; SPtr fieldKey = ManagedSerializableFieldKey::create(field->mParentTypeId, field->mFieldId); SPtr fieldData = obj->getFieldData(field); return ManagedSerializableFieldDataEntry::create(fieldKey, fieldData); } void setFieldsEntry(ManagedSerializableObject* obj, UINT32 arrayIdx, SPtr val) { obj->mCachedData[*val->mKey] = val->mValue; } UINT32 getNumFieldEntries(ManagedSerializableObject* obj) { Vector>& sequentialFields = any_cast_ref>>(obj->mRTTIData); return (UINT32)sequentialFields.size(); } void setNumFieldEntries(ManagedSerializableObject* obj, UINT32 numEntries) { // Do nothing } public: ManagedSerializableObjectRTTI() { addReflectablePtrField("mObjInfo", 0, &ManagedSerializableObjectRTTI::getInfo, &ManagedSerializableObjectRTTI::setInfo); addReflectablePtrArrayField("mFieldEntries", 1, &ManagedSerializableObjectRTTI::getFieldEntry, &ManagedSerializableObjectRTTI::getNumFieldEntries, &ManagedSerializableObjectRTTI::setFieldsEntry, &ManagedSerializableObjectRTTI::setNumFieldEntries); } void onSerializationStarted(IReflectable* obj, const UnorderedMap& params) override { ManagedSerializableObject* castObj = static_cast(obj); Vector> sequentialFields; SPtr curType = castObj->mObjInfo; while (curType != nullptr) { for (auto& field : curType->mFields) { if (field.second->isSerializable()) sequentialFields.push_back(field.second); } curType = curType->mBaseClass; } castObj->mRTTIData = sequentialFields; } void onSerializationEnded(IReflectable* obj, const UnorderedMap& params) override { ManagedSerializableObject* castObj = static_cast(obj); castObj->mRTTIData = nullptr; } IDiff& getDiffHandler() const override { static ManagedDiff managedDiffHandler; return managedDiffHandler; } const String& getRTTIName() override { static String name = "ScriptSerializableObject"; return name; } UINT32 getRTTIId() override { return TID_ScriptSerializableObject; } SPtr newRTTIObject() override { return ManagedSerializableObject::createEmpty(); } }; /** @} */ /** @endcond */ }