CmMeshRTTI.h 2.1 KB

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