CmMeshDataRTTI.h 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  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 CamelotEngine
  8. {
  9. class CM_EXPORT VertexElementDataRTTI : public RTTIType<MeshData::VertexElementData, IReflectable, VertexElementDataRTTI>
  10. {
  11. private:
  12. ManagedDataBlock getVertexData(MeshData::VertexElementData* obj) { return ManagedDataBlock(obj->data, obj->elementCount * obj->element.getSize()); }
  13. void setVertexData(MeshData::VertexElementData* obj, ManagedDataBlock val) { obj->data = val.getData(); }
  14. UINT32& getNumElements(MeshData::VertexElementData* obj) { return obj->elementCount; }
  15. void setNumElements(MeshData::VertexElementData* obj, UINT32& value) { obj->elementCount = value; }
  16. VertexElement& getVertexElement(MeshData::VertexElementData* obj) { return obj->element; }
  17. void setVertexElement(MeshData::VertexElementData* obj, VertexElement& value) { obj->element = value; }
  18. public:
  19. VertexElementDataRTTI()
  20. {
  21. addDataBlockField("data", 0, &VertexElementDataRTTI::getVertexData, &VertexElementDataRTTI::setVertexData);
  22. addPlainField("elementCount", 1, &VertexElementDataRTTI::getNumElements, &VertexElementDataRTTI::setNumElements);
  23. addPlainField("element", 2, &VertexElementDataRTTI::getVertexElement, &VertexElementDataRTTI::setVertexElement);
  24. }
  25. virtual std::shared_ptr<IReflectable> newRTTIObject()
  26. {
  27. return std::shared_ptr<MeshData::VertexElementData>(CM_NEW(MeshData::VertexElementData, PoolAlloc) MeshData::VertexElementData(),
  28. &MemAllocDeleter<MeshData::VertexElementData, PoolAlloc>::deleter);
  29. }
  30. virtual const String& getRTTIName()
  31. {
  32. static String name = "VertexElementData";
  33. throw name;
  34. }
  35. virtual UINT32 getRTTIId()
  36. {
  37. return TID_VertexElementData;
  38. }
  39. };
  40. class CM_EXPORT IndexElementDataRTTI : public RTTIType<MeshData::IndexElementData, IReflectable, IndexElementDataRTTI>
  41. {
  42. private:
  43. ManagedDataBlock getIndexData(MeshData::IndexElementData* obj) { return ManagedDataBlock(obj->indices, obj->numIndices * obj->elementSize); }
  44. void setIndexData(MeshData::IndexElementData* obj, ManagedDataBlock val) { obj->indices = val.getData(); }
  45. UINT32& getNumIndices(MeshData::IndexElementData* obj) { return obj->numIndices; }
  46. void setNumIndices(MeshData::IndexElementData* obj, UINT32& value) { obj->numIndices = value; }
  47. UINT32& getElementSize(MeshData::IndexElementData* obj) { return obj->elementSize; }
  48. void setElementSize(MeshData::IndexElementData* obj, UINT32& value) { obj->elementSize = value; }
  49. UINT32& getSubMesh(MeshData::IndexElementData* obj) { return obj->subMesh; }
  50. void setSubMesh(MeshData::IndexElementData* obj, UINT32& value) { obj->subMesh = value; }
  51. public:
  52. IndexElementDataRTTI()
  53. {
  54. addDataBlockField("indices", 0, &IndexElementDataRTTI::getIndexData, &IndexElementDataRTTI::setIndexData);
  55. addPlainField("numIndices", 1, &IndexElementDataRTTI::getNumIndices, &IndexElementDataRTTI::setNumIndices);
  56. addPlainField("elementSize", 2, &IndexElementDataRTTI::getElementSize, &IndexElementDataRTTI::setElementSize);
  57. addPlainField("subMesh", 3, &IndexElementDataRTTI::getSubMesh, &IndexElementDataRTTI::setSubMesh);
  58. }
  59. virtual std::shared_ptr<IReflectable> newRTTIObject()
  60. {
  61. return std::shared_ptr<MeshData::IndexElementData>(CM_NEW(MeshData::IndexElementData, PoolAlloc) MeshData::IndexElementData(),
  62. &MemAllocDeleter<MeshData::IndexElementData, PoolAlloc>::deleter);
  63. }
  64. virtual const String& getRTTIName()
  65. {
  66. static String name = "IndexElementData";
  67. throw name;
  68. }
  69. virtual UINT32 getRTTIId()
  70. {
  71. return TID_IndexElementData;
  72. }
  73. };
  74. CM_ALLOW_MEMCPY_SERIALIZATION(IndexBuffer::IndexType);
  75. class CM_EXPORT MeshDataRTTI : public RTTIType<MeshData, IReflectable, MeshDataRTTI>
  76. {
  77. private:
  78. struct TempMeshData
  79. {
  80. vector<MeshData::VertexElementData>::type vertexElements;
  81. };
  82. MeshData::VertexElementData& getVertexElementData(MeshData* obj, UINT32 arrayIdx)
  83. {
  84. auto tempData = boost::any_cast<std::shared_ptr<TempMeshData>>(obj->mRTTIData);
  85. return tempData->vertexElements[arrayIdx];
  86. }
  87. void setVertexElementData(MeshData* obj, UINT32 arrayIdx, MeshData::VertexElementData& value)
  88. {
  89. obj->clearIfItExists(value.element.getType(), value.element.getSemantic(), value.element.getIndex(), value.element.getSource());
  90. obj->mVertexData[value.element.getSource()].push_back(value);
  91. }
  92. UINT32 getNumVertexElementData(MeshData* obj)
  93. {
  94. auto tempData = boost::any_cast<std::shared_ptr<TempMeshData>>(obj->mRTTIData);
  95. return (UINT32)tempData->vertexElements.size();
  96. }
  97. void setNumVertexElementData(MeshData* obj, UINT32 numElements)
  98. {
  99. // Do nothing
  100. }
  101. MeshData::IndexElementData& getIndexElementData(MeshData* obj, UINT32 arrayIdx)
  102. {
  103. return obj->mIndices[arrayIdx];
  104. }
  105. void setIndexElementData(MeshData* obj, UINT32 arrayIdx, MeshData::IndexElementData& value)
  106. {
  107. obj->mIndices[arrayIdx] = value;
  108. }
  109. UINT32 getNumIndexElementData(MeshData* obj)
  110. {
  111. return (UINT32)obj->mIndices.size();
  112. }
  113. void setNumIndexElementData(MeshData* obj, UINT32 numElements)
  114. {
  115. obj->mIndices.resize(numElements);
  116. }
  117. IndexBuffer::IndexType& getIndexType(MeshData* obj)
  118. {
  119. return obj->mIndexType;
  120. }
  121. void setIndexType(MeshData* obj, IndexBuffer::IndexType& value)
  122. {
  123. obj->mIndexType = value;
  124. }
  125. public:
  126. MeshDataRTTI()
  127. {
  128. addReflectableArrayField("mVertexData", 0, &MeshDataRTTI::getVertexElementData,
  129. &MeshDataRTTI::getNumVertexElementData, &MeshDataRTTI::setVertexElementData, &MeshDataRTTI::setNumVertexElementData);
  130. addReflectableArrayField("mIndexBuffer", 1, &MeshDataRTTI::getIndexElementData,
  131. &MeshDataRTTI::getNumIndexElementData, &MeshDataRTTI::setIndexElementData, &MeshDataRTTI::setNumIndexElementData);
  132. addPlainField("mIndexType", 2, &MeshDataRTTI::getIndexType, &MeshDataRTTI::setIndexType);
  133. }
  134. virtual void onSerializationStarted(IReflectable* obj);
  135. virtual void onSerializationEnded(IReflectable* obj);
  136. virtual std::shared_ptr<IReflectable> newRTTIObject()
  137. {
  138. return std::shared_ptr<MeshData>(CM_NEW(MeshData, PoolAlloc) MeshData(),
  139. &MemAllocDeleter<MeshData, PoolAlloc>::deleter);
  140. }
  141. virtual const String& getRTTIName()
  142. {
  143. static String name = "MeshData";
  144. throw name;
  145. }
  146. virtual UINT32 getRTTIId()
  147. {
  148. return TID_MeshData;
  149. }
  150. };
  151. }