CmMeshDataRTTI.h 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. #pragma once
  2. #include "CmPrerequisites.h"
  3. #include "CmRTTIType.h"
  4. #include "CmMeshData.h"
  5. #include "CmManagedDataBlock.h"
  6. namespace CamelotEngine
  7. {
  8. class CM_EXPORT VertexDataRTTI : public RTTIType<MeshData::VertexData, IReflectable, VertexDataRTTI>
  9. {
  10. private:
  11. ManagedDataBlock getVertex(MeshData::VertexData* obj) { return ManagedDataBlock((UINT8*)obj->vertex, obj->vertexCount * sizeof(Vector3), false); }
  12. void setVertex(MeshData::VertexData* obj, ManagedDataBlock val) { obj->vertex = (Vector3*)val.getData(); }
  13. ManagedDataBlock getColor(MeshData::VertexData* obj) { return ManagedDataBlock((UINT8*)obj->color, obj->vertexCount * sizeof(Color), false); }
  14. void setColor(MeshData::VertexData* obj, ManagedDataBlock val) { obj->color = (Color*)val.getData(); }
  15. ManagedDataBlock getNormal(MeshData::VertexData* obj) { return ManagedDataBlock((UINT8*)obj->normal, obj->vertexCount * sizeof(Vector3), false); }
  16. void setNormal(MeshData::VertexData* obj, ManagedDataBlock val) { obj->normal = (Vector3*)val.getData(); }
  17. ManagedDataBlock getTangent(MeshData::VertexData* obj) { return ManagedDataBlock((UINT8*)obj->tangent, obj->vertexCount * sizeof(Vector3), false); }
  18. void setTangent(MeshData::VertexData* obj, ManagedDataBlock val) { obj->tangent = (Vector3*)val.getData(); }
  19. ManagedDataBlock getBitangent(MeshData::VertexData* obj) { return ManagedDataBlock((UINT8*)obj->bitangent, obj->vertexCount * sizeof(Vector3), false); }
  20. void setBitangent(MeshData::VertexData* obj, ManagedDataBlock val) { obj->bitangent = (Vector3*)val.getData(); }
  21. ManagedDataBlock getUV0(MeshData::VertexData* obj) { return ManagedDataBlock((UINT8*)obj->uv0, obj->vertexCount * sizeof(Vector2), false); }
  22. void setUV0(MeshData::VertexData* obj, ManagedDataBlock val) { obj->uv0 = (Vector2*)val.getData(); }
  23. ManagedDataBlock getUV1(MeshData::VertexData* obj) { return ManagedDataBlock((UINT8*)obj->uv1, obj->vertexCount * sizeof(Vector2), false); }
  24. void setUV1(MeshData::VertexData* obj, ManagedDataBlock val) { obj->uv1 = (Vector2*)val.getData(); }
  25. CM_SETGET_MEMBER(vertexCount, UINT32, MeshData::VertexData);
  26. CM_SETGET_MEMBER(streamIdx, UINT32, MeshData::VertexData);
  27. public:
  28. VertexDataRTTI()
  29. {
  30. addDataBlockField("vertex", 0, &VertexDataRTTI::getVertex, &VertexDataRTTI::setVertex);
  31. addDataBlockField("color", 1, &VertexDataRTTI::getColor, &VertexDataRTTI::setColor);
  32. addDataBlockField("normal", 2, &VertexDataRTTI::getNormal, &VertexDataRTTI::setNormal);
  33. addDataBlockField("tangent", 3, &VertexDataRTTI::getTangent, &VertexDataRTTI::setTangent);
  34. addDataBlockField("bitangent", 4, &VertexDataRTTI::getBitangent, &VertexDataRTTI::setBitangent);
  35. addDataBlockField("uv0", 5, &VertexDataRTTI::getUV0, &VertexDataRTTI::setUV0);
  36. addDataBlockField("uv1", 6, &VertexDataRTTI::getUV1, &VertexDataRTTI::setUV1);
  37. CM_ADD_PLAINFIELD(vertexCount, 7, VertexDataRTTI)
  38. CM_ADD_PLAINFIELD(streamIdx, 8, VertexDataRTTI)
  39. }
  40. virtual std::shared_ptr<IReflectable> newRTTIObject()
  41. {
  42. return std::shared_ptr<MeshData::VertexData>(new MeshData::VertexData(0));
  43. }
  44. virtual const String& getRTTIName()
  45. {
  46. static String name = "MeshData::VertexData";
  47. throw name;
  48. }
  49. virtual UINT32 getRTTIId()
  50. {
  51. return TID_VertexData;
  52. }
  53. };
  54. class CM_EXPORT MeshDataRTTI : public RTTIType<MeshData, IReflectable, MeshDataRTTI>
  55. {
  56. private:
  57. CM_SETGET_MEMBER(indexCount, INT32, MeshData)
  58. CM_SETGET_MEMBER(vertexCount, INT32, MeshData);
  59. ManagedDataBlock getIndex(MeshData* obj) { return ManagedDataBlock((UINT8*)obj->index, obj->indexCount * sizeof(int), false); }
  60. void setIndex(MeshData* obj, ManagedDataBlock val) { obj->index = (int*)val.getData(); }
  61. /************************************************************************/
  62. /* subMeshes */
  63. /************************************************************************/
  64. MeshData::SubMeshData& getSubmesh(MeshData* obj, UINT32 idx)
  65. {
  66. return obj->subMeshes[idx];
  67. }
  68. void setSubmesh(MeshData* obj, UINT32 idx, MeshData::SubMeshData& data)
  69. {
  70. obj->subMeshes[idx] = data;
  71. }
  72. UINT32 getSubmeshArraySize(MeshData* obj)
  73. {
  74. return obj->subMeshes.size();
  75. }
  76. void setSubmeshArraySize(MeshData* obj, UINT32 size)
  77. {
  78. obj->subMeshes.resize(size);
  79. }
  80. /************************************************************************/
  81. /* vertexDeclaration */
  82. /************************************************************************/
  83. VertexDeclarationPtr getVertexDecl(MeshData* obj) { return obj->declaration; }
  84. void setVertexDecl(MeshData* obj, VertexDeclarationPtr vertexDecl) { obj->declaration = vertexDecl; }
  85. /************************************************************************/
  86. /* vertexData */
  87. /************************************************************************/
  88. std::shared_ptr<MeshData::VertexData> getVertexData(MeshData* obj, UINT32 idx)
  89. {
  90. int curIdx = 0;
  91. for(auto iter = obj->vertexBuffers.begin(); iter != obj->vertexBuffers.end(); ++iter)
  92. {
  93. if(curIdx == idx)
  94. return iter->second;
  95. curIdx++;
  96. }
  97. CM_EXCEPT(InvalidParametersException, "Invalid index: " + toString(idx));
  98. }
  99. void setVertexData(MeshData* obj, UINT32 idx, std::shared_ptr<MeshData::VertexData> data)
  100. {
  101. obj->vertexBuffers[data->streamIdx] = data;
  102. }
  103. UINT32 getVertexDataArraySize(MeshData* obj)
  104. {
  105. return obj->vertexBuffers.size();
  106. }
  107. void setVertexDataArraySize(MeshData* obj, UINT32 size)
  108. {
  109. // Do nothing, map will expand as entries are added
  110. }
  111. public:
  112. MeshDataRTTI()
  113. {
  114. addDataBlockField("index", 0, &MeshDataRTTI::getIndex, &MeshDataRTTI::setIndex);
  115. CM_ADD_PLAINFIELD(indexCount, 1, MeshDataRTTI)
  116. CM_ADD_PLAINFIELD(vertexCount, 2, MeshDataRTTI)
  117. addPlainArrayField("subMeshes", 3, &MeshDataRTTI::getSubmesh, &MeshDataRTTI::getSubmeshArraySize, &MeshDataRTTI::setSubmesh, &MeshDataRTTI::setSubmeshArraySize);
  118. addReflectablePtrField("vertexDeclaration", 4, &MeshDataRTTI::getVertexDecl, &MeshDataRTTI::setVertexDecl);
  119. addReflectablePtrArrayField("vertexBuffer", 5, &MeshDataRTTI::getVertexData, &MeshDataRTTI::getVertexDataArraySize,
  120. &MeshDataRTTI::setVertexData, &MeshDataRTTI::setVertexDataArraySize);
  121. }
  122. virtual std::shared_ptr<IReflectable> newRTTIObject()
  123. {
  124. return std::shared_ptr<MeshData>(new MeshData());
  125. }
  126. virtual const String& getRTTIName()
  127. {
  128. static String name = "MeshData";
  129. throw name;
  130. }
  131. virtual UINT32 getRTTIId()
  132. {
  133. return TID_MeshData;
  134. }
  135. };
  136. }