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. gMainSyncedCA().readSubresource(sharedMeshPtr, 0, meshData);
  22. gMainSyncedCA().submitToCoreThread(true); // We need the data right away, so execute the context and wait until we get it
  23. return meshData;
  24. }
  25. void setMeshData(Mesh* obj, MeshDataPtr meshData)
  26. {
  27. obj->mTempInitialMeshData = meshData;
  28. }
  29. public:
  30. MeshRTTI()
  31. {
  32. addReflectablePtrField("mVertexDesc", 0, &MeshRTTI::getVertexDesc, &MeshRTTI::setVertexDesc);
  33. addPlainField("mIndexType", 1, &MeshRTTI::getIndexType, &MeshRTTI::setIndexType);
  34. addPlainField("mBufferType", 2, &MeshRTTI::getBufferType, &MeshRTTI::setBufferType);
  35. addReflectablePtrField("mMeshData", 3, &MeshRTTI::getMeshData, &MeshRTTI::setMeshData);
  36. }
  37. virtual void onDeserializationEnded(IReflectable* obj)
  38. {
  39. Mesh* mesh = static_cast<Mesh*>(obj);
  40. mesh->initialize();
  41. }
  42. virtual std::shared_ptr<IReflectable> newRTTIObject()
  43. {
  44. return MeshManager::instance().createEmpty();
  45. }
  46. virtual const String& getRTTIName()
  47. {
  48. static String name = "Mesh";
  49. throw name;
  50. }
  51. virtual UINT32 getRTTIId()
  52. {
  53. return TID_Mesh;
  54. }
  55. };
  56. }