BsManagedResourceRTTI.h 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #pragma once
  4. #include "BsScriptEnginePrerequisites.h"
  5. #include "Reflection/BsRTTIType.h"
  6. #include "Private/RTTI/BsResourceRTTI.h"
  7. #include "BsManagedResource.h"
  8. #include "BsMonoManager.h"
  9. #include "Serialization/BsManagedSerializableObject.h"
  10. #include "Resources/BsResources.h"
  11. namespace bs
  12. {
  13. /** @cond RTTI */
  14. /** @addtogroup RTTI-Impl-SEngine
  15. * @{
  16. */
  17. class BS_SCR_BE_EXPORT ManagedResourceRTTI : public RTTIType<ManagedResource, Resource, ManagedResourceRTTI>
  18. {
  19. private:
  20. SPtr<ManagedSerializableObject> getObjectData(ManagedResource* obj)
  21. {
  22. return any_cast<SPtr<ManagedSerializableObject>>(obj->mRTTIData);
  23. }
  24. void setObjectData(ManagedResource* obj, SPtr<ManagedSerializableObject> val)
  25. {
  26. obj->mRTTIData = val;
  27. }
  28. public:
  29. ManagedResourceRTTI()
  30. {
  31. addReflectablePtrField("mObjectData", 0, &ManagedResourceRTTI::getObjectData, &ManagedResourceRTTI::setObjectData);
  32. }
  33. void onSerializationStarted(IReflectable* obj, const UnorderedMap<String, UINT64>& params) override
  34. {
  35. ManagedResource* mc = static_cast<ManagedResource*>(obj);
  36. mc->mRTTIData = ManagedSerializableObject::createFromExisting(mc->getManagedInstance());
  37. }
  38. void onDeserializationEnded(IReflectable* obj, const UnorderedMap<String, UINT64>& params) override
  39. {
  40. ManagedResource* mr = static_cast<ManagedResource*>(obj);
  41. SPtr<ManagedSerializableObject> serializableObject = any_cast<SPtr<ManagedSerializableObject>>(mr->mRTTIData);
  42. SPtr<Resource> mrPtr = std::static_pointer_cast<Resource>(mr->getThisPtr());
  43. HManagedResource handle = static_resource_cast<ManagedResource>(gResources()._createResourceHandle(mrPtr));
  44. mr->setHandle(serializableObject->deserialize(), handle);
  45. mr->mRTTIData = nullptr;
  46. }
  47. const String& getRTTIName() override
  48. {
  49. static String name = "ManagedResource";
  50. return name;
  51. }
  52. UINT32 getRTTIId() override
  53. {
  54. return TID_ManagedResource;
  55. }
  56. SPtr<IReflectable> newRTTIObject() override
  57. {
  58. return ManagedResource::createEmpty();
  59. }
  60. };
  61. /** @} */
  62. /** @endcond */
  63. }