BsMeshRTTI.h 2.4 KB

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