BsMeshRTTI.h 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #pragma once
  2. #include "BsCorePrerequisites.h"
  3. #include "BsRTTIType.h"
  4. #include "BsCoreApplication.h"
  5. #include "BsMesh.h"
  6. #include "BsMeshManager.h"
  7. #include "BsCoreThread.h"
  8. namespace BansheeEngine
  9. {
  10. class MeshRTTI : public RTTIType<Mesh, MeshBase, MeshRTTI>
  11. {
  12. VertexDataDescPtr getVertexDesc(Mesh* obj) { return obj->mVertexDesc; }
  13. void setVertexDesc(Mesh* obj, VertexDataDescPtr value) { obj->mVertexDesc = value; }
  14. IndexBuffer::IndexType& getIndexType(Mesh* obj) { return obj->mIndexType; }
  15. void setIndexType(Mesh* obj, IndexBuffer::IndexType& value) { obj->mIndexType = value; }
  16. UINT32& getBufferType(Mesh* obj) { return (UINT32&)obj->mBufferType; }
  17. void setBufferType(Mesh* obj, UINT32& value) { obj->mBufferType = (MeshBufferType)value; }
  18. MeshDataPtr getMeshData(Mesh* obj)
  19. {
  20. MeshDataPtr meshData = obj->allocateSubresourceBuffer(0);
  21. GpuResourcePtr sharedMeshPtr = std::static_pointer_cast<GpuResource>(obj->getThisPtr());
  22. meshData->_lock();
  23. gCoreThread().queueReturnCommand(std::bind(&RenderSystem::readSubresource, RenderSystem::instancePtr(),
  24. sharedMeshPtr, 0, std::static_pointer_cast<GpuResourceData>(meshData), std::placeholders::_1), true);
  25. return meshData;
  26. }
  27. void setMeshData(Mesh* obj, MeshDataPtr meshData)
  28. {
  29. obj->mTempInitialMeshData = meshData;
  30. }
  31. public:
  32. MeshRTTI()
  33. {
  34. addReflectablePtrField("mVertexDesc", 0, &MeshRTTI::getVertexDesc, &MeshRTTI::setVertexDesc);
  35. addPlainField("mIndexType", 1, &MeshRTTI::getIndexType, &MeshRTTI::setIndexType);
  36. addPlainField("mBufferType", 2, &MeshRTTI::getBufferType, &MeshRTTI::setBufferType);
  37. addReflectablePtrField("mMeshData", 3, &MeshRTTI::getMeshData, &MeshRTTI::setMeshData);
  38. }
  39. virtual void onDeserializationEnded(IReflectable* obj)
  40. {
  41. Mesh* mesh = static_cast<Mesh*>(obj);
  42. mesh->initialize();
  43. }
  44. virtual std::shared_ptr<IReflectable> newRTTIObject()
  45. {
  46. return MeshManager::instance().createEmpty();
  47. }
  48. virtual const String& getRTTIName()
  49. {
  50. static String name = "Mesh";
  51. throw name;
  52. }
  53. virtual UINT32 getRTTIId()
  54. {
  55. return TID_Mesh;
  56. }
  57. };
  58. }