CmMeshDataRTTI.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #pragma once
  2. #include "CmPrerequisites.h"
  3. #include "CmRTTIType.h"
  4. #include "CmMeshData.h"
  5. #include "CmManagedDataBlock.h"
  6. #include "CmVertexDeclaration.h"
  7. namespace CamelotFramework
  8. {
  9. CM_ALLOW_MEMCPY_SERIALIZATION(MeshData::IndexElementData);
  10. CM_ALLOW_MEMCPY_SERIALIZATION(IndexBuffer::IndexType);
  11. class CM_EXPORT MeshDataRTTI : public RTTIType<MeshData, GpuResourceData, MeshDataRTTI>
  12. {
  13. private:
  14. VertexElement& getVertexElementData(MeshData* obj, UINT32 arrayIdx)
  15. {
  16. return obj->mVertexElements[arrayIdx];
  17. }
  18. void setVertexElementData(MeshData* obj, UINT32 arrayIdx, VertexElement& value)
  19. {
  20. obj->mVertexElements[arrayIdx] = value;
  21. }
  22. UINT32 getNumVertexElementData(MeshData* obj)
  23. {
  24. return (UINT32)obj->mVertexElements.size();
  25. }
  26. void setNumVertexElementData(MeshData* obj, UINT32 numElements)
  27. {
  28. obj->mVertexElements.resize(numElements);
  29. }
  30. MeshData::IndexElementData& getIndexElementData(MeshData* obj, UINT32 arrayIdx)
  31. {
  32. return obj->mSubMeshes[arrayIdx];
  33. }
  34. void setIndexElementData(MeshData* obj, UINT32 arrayIdx, MeshData::IndexElementData& value)
  35. {
  36. obj->mSubMeshes[arrayIdx] = value;
  37. }
  38. UINT32 getNumIndexElementData(MeshData* obj)
  39. {
  40. return (UINT32)obj->mSubMeshes.size();
  41. }
  42. void setNumIndexElementData(MeshData* obj, UINT32 numElements)
  43. {
  44. obj->mSubMeshes.resize(numElements);
  45. }
  46. IndexBuffer::IndexType& getIndexType(MeshData* obj)
  47. {
  48. return obj->mIndexType;
  49. }
  50. void setIndexType(MeshData* obj, IndexBuffer::IndexType& value)
  51. {
  52. obj->mIndexType = value;
  53. }
  54. UINT32& getNumVertices(MeshData* obj)
  55. {
  56. return obj->mNumVertices;
  57. }
  58. void setNumVertices(MeshData* obj, UINT32& value)
  59. {
  60. obj->mNumVertices = value;
  61. }
  62. ManagedDataBlock getData(MeshData* obj)
  63. {
  64. ManagedDataBlock dataBlock((UINT8*)obj->getData(), obj->getInternalBufferSize());
  65. return dataBlock;
  66. }
  67. void setData(MeshData* obj, ManagedDataBlock val)
  68. {
  69. // Nothing to do here, the pointer we provided already belongs to PixelData
  70. // so the data is already written
  71. }
  72. static UINT8* allocateData(MeshData* obj, UINT32 numBytes)
  73. {
  74. obj->allocateInternalBuffer(numBytes);
  75. return obj->getData();
  76. }
  77. public:
  78. MeshDataRTTI()
  79. {
  80. addPlainArrayField("mVertexData", 0, &MeshDataRTTI::getVertexElementData,
  81. &MeshDataRTTI::getNumVertexElementData, &MeshDataRTTI::setVertexElementData, &MeshDataRTTI::setNumVertexElementData);
  82. addPlainArrayField("mIndexBuffer", 1, &MeshDataRTTI::getIndexElementData,
  83. &MeshDataRTTI::getNumIndexElementData, &MeshDataRTTI::setIndexElementData, &MeshDataRTTI::setNumIndexElementData);
  84. addPlainField("mIndexType", 2, &MeshDataRTTI::getIndexType, &MeshDataRTTI::setIndexType);
  85. addPlainField("mNumVertices", 3, &MeshDataRTTI::getNumVertices, &MeshDataRTTI::setNumVertices);
  86. addDataBlockField("data", 4, &MeshDataRTTI::getData, &MeshDataRTTI::setData, 0, &MeshDataRTTI::allocateData);
  87. }
  88. virtual std::shared_ptr<IReflectable> newRTTIObject()
  89. {
  90. return cm_shared_ptr<MeshData, PoolAlloc>(new (cm_alloc<MeshData, PoolAlloc>()) MeshData());
  91. }
  92. virtual const String& getRTTIName()
  93. {
  94. static String name = "MeshData";
  95. throw name;
  96. }
  97. virtual UINT32 getRTTIId()
  98. {
  99. return TID_MeshData;
  100. }
  101. };
  102. }