CmMeshDataRTTI.h 6.7 KB

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