CmMeshRTTI.h 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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. CM_ALLOW_MEMCPY_SERIALIZATION(SubMesh);
  10. class MeshRTTI : public RTTIType<Mesh, GpuResource, MeshRTTI>
  11. {
  12. SubMesh& getSubMesh(Mesh* obj, UINT32 arrayIdx) { return obj->mSubMeshes[arrayIdx]; }
  13. void setSubMesh(Mesh* obj, UINT32 arrayIdx, SubMesh& value) { obj->mSubMeshes[arrayIdx] = value; }
  14. UINT32 getNumSubmeshes(Mesh* obj) { return (UINT32)obj->mSubMeshes.size(); }
  15. void setNumSubmeshes(Mesh* obj, UINT32 numElements) { obj->mSubMeshes.resize(numElements); }
  16. SubMesh& getDefaultSubMesh(Mesh* obj) { return obj->mDefaultSubMesh; }
  17. void setDefaultSubMesh(Mesh* obj, SubMesh& value) { obj->mDefaultSubMesh = value; }
  18. VertexDataDescPtr getVertexDesc(Mesh* obj) { return obj->mVertexDesc; }
  19. void setVertexDesc(Mesh* obj, VertexDataDescPtr value) { obj->mVertexDesc = value; }
  20. IndexBuffer::IndexType& getIndexType(Mesh* obj) { return obj->mIndexType; }
  21. void setIndexType(Mesh* obj, IndexBuffer::IndexType& value) { obj->mIndexType = value; }
  22. UINT32& getNumVertices(Mesh* obj) { return obj->mNumVertices; }
  23. void setNumVertices(Mesh* obj, UINT32& value) { obj->mNumVertices = value; }
  24. UINT32& getNumIndices(Mesh* obj) { return obj->mNumIndices; }
  25. void setNumIndices(Mesh* obj, UINT32& value) { obj->mNumIndices = value; }
  26. UINT32& getBufferType(Mesh* obj) { return (UINT32&)obj->mBufferType; }
  27. void setBufferType(Mesh* obj, UINT32& value) { obj->mBufferType = (MeshBufferType)value; }
  28. MeshDataPtr getMeshData(Mesh* obj)
  29. {
  30. MeshDataPtr meshData = obj->allocateSubresourceBuffer(0);
  31. GpuResourcePtr sharedMeshPtr = std::static_pointer_cast<GpuResource>(obj->getThisPtr());
  32. gMainSyncedCA().readSubresource(sharedMeshPtr, 0, meshData);
  33. gMainSyncedCA().submitToCoreThread(true); // We need the data right away, so execute the context and wait until we get it
  34. return meshData;
  35. }
  36. void setMeshData(Mesh* obj, MeshDataPtr meshData)
  37. {
  38. obj->mTempInitialMeshData = meshData;
  39. }
  40. public:
  41. MeshRTTI()
  42. {
  43. addReflectablePtrField("mVertexDesc", 0, &MeshRTTI::getVertexDesc, &MeshRTTI::setVertexDesc);
  44. addPlainField("mIndexType", 1, &MeshRTTI::getIndexType, &MeshRTTI::setIndexType);
  45. addPlainField("mNumVertices", 2, &MeshRTTI::getNumVertices, &MeshRTTI::setNumVertices);
  46. addPlainField("mNumIndices", 3, &MeshRTTI::getNumIndices, &MeshRTTI::setNumIndices);
  47. addPlainField("mBufferType", 4, &MeshRTTI::getBufferType, &MeshRTTI::setBufferType);
  48. addReflectablePtrField("mMeshData", 5, &MeshRTTI::getMeshData, &MeshRTTI::setMeshData);
  49. addPlainArrayField("mSubMeshes", 6, &MeshRTTI::getSubMesh,
  50. &MeshRTTI::getNumSubmeshes, &MeshRTTI::setSubMesh, &MeshRTTI::setNumSubmeshes);
  51. addPlainField("mDefaultSubMesh", 7, &MeshRTTI::getDefaultSubMesh, &MeshRTTI::setDefaultSubMesh);
  52. }
  53. virtual void onDeserializationEnded(IReflectable* obj)
  54. {
  55. Mesh* mesh = static_cast<Mesh*>(obj);
  56. mesh->initialize();
  57. }
  58. virtual std::shared_ptr<IReflectable> newRTTIObject()
  59. {
  60. return MeshManager::instance().createEmpty();
  61. }
  62. virtual const String& getRTTIName()
  63. {
  64. static String name = "Mesh";
  65. throw name;
  66. }
  67. virtual UINT32 getRTTIId()
  68. {
  69. return TID_Mesh;
  70. }
  71. };
  72. }