CmMeshDataRTTI.h 6.1 KB

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