b3dm_loader_Interface.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #pragma once
  2. #include <iostream>
  3. #include "b3dm_loader.h"
  4. #define DLLEXPORT
  5. extern "C" DLLEXPORT b3dm_loader* LoadB3dmFromData(unsigned char* totalData, int totalLength)
  6. {
  7. Model model;
  8. TinyGLTF loader;
  9. std::string err;
  10. std::string warn;
  11. std::string basedir;
  12. int header[7];
  13. ::memcpy(header, totalData, 7 * sizeof(int));
  14. int len_b3dm = 7 * sizeof(int) + header[3] + header[4] + header[5] + header[6];
  15. int gltfSize = totalLength - len_b3dm;
  16. std::vector<char> buf(gltfSize);
  17. ::memcpy(&buf.at(0), totalData + len_b3dm, gltfSize);
  18. unsigned char* data = reinterpret_cast<unsigned char*>(&buf.at(0));
  19. int length = static_cast<unsigned int>(buf.size());
  20. bool ret = loader.LoadBinaryFromMemory(&model, &err, &warn, data, length, basedir);
  21. if (!ret)
  22. {
  23. return nullptr;
  24. }
  25. else
  26. {
  27. b3dm_loader* loader = new b3dm_loader();
  28. loader->VisitorModel(model);
  29. return loader;
  30. }
  31. }
  32. //OpenB3dmFile
  33. extern "C" DLLEXPORT b3dm_loader* OpenB3dmFile(const char* file)
  34. {
  35. b3dm_loader* loader = b3dm_loader::LoadB3dmFromFile(file);
  36. return loader;
  37. }
  38. //CloseOsgbFile
  39. extern "C" DLLEXPORT void CloseB3dmFile(b3dm_loader * visitor)
  40. {
  41. delete visitor;
  42. visitor = nullptr;
  43. }
  44. //GetMeshCount
  45. extern "C" DLLEXPORT int GetMeshCount(b3dm_loader * visitor)
  46. {
  47. return visitor->mMeshInfos.size();
  48. }
  49. //GetVertexCount
  50. extern "C" DLLEXPORT int GetVertexCount(b3dm_loader * visitor, int meshIndex)
  51. {
  52. return visitor->mMeshInfos[meshIndex]->mVertexCount;
  53. }
  54. //Ö±½Ó¿½±´ÄÚ´æ GetVertexs
  55. extern "C" DLLEXPORT void GetVertexs(b3dm_loader * visitor, int meshIndex, float* destVertexs)
  56. {
  57. int count = visitor->mMeshInfos[meshIndex]->mVertexCount;
  58. float* srcVertexs = visitor->mMeshInfos[meshIndex]->mVertexs;
  59. memcpy(destVertexs, srcVertexs, sizeof(float) * count * 3);
  60. }
  61. //GetVertexPointer
  62. extern "C" DLLEXPORT float* GetVertexPointer(b3dm_loader * visitor, int meshIndex, int vertexIndex)
  63. {
  64. return visitor->mMeshInfos[meshIndex]->mVertexs + vertexIndex * 3;
  65. }
  66. //GetTriangleCount
  67. extern "C" DLLEXPORT int GetTriangleCount(b3dm_loader * visitor, int meshIndex)
  68. {
  69. return visitor->mMeshInfos[meshIndex]->mTriangleCount;
  70. }
  71. //Ö±½Ó¿½±´ÄÚ´æ GetTriangles
  72. extern "C" DLLEXPORT void GetTriangles(b3dm_loader * visitor, int meshIndex, unsigned int* destTriangles)
  73. {
  74. int count = visitor->mMeshInfos[meshIndex]->mTriangleCount;
  75. unsigned int* srcTriangles = visitor->mMeshInfos[meshIndex]->mTriangles;
  76. memcpy(destTriangles, srcTriangles, sizeof(int) * count);
  77. }
  78. //GetTrianglePointer
  79. extern "C" DLLEXPORT unsigned int* GetTrianglePointer(b3dm_loader * visitor, int meshIndex)
  80. {
  81. return visitor->mMeshInfos[meshIndex]->mTriangles;
  82. }
  83. //GetImageSize
  84. extern "C" DLLEXPORT unsigned int GetImageSize(b3dm_loader * visitor, int meshIndex)
  85. {
  86. return visitor->mMeshInfos[meshIndex]->mImageSize;
  87. }
  88. //GetImageResolutionS
  89. extern "C" DLLEXPORT int GetImageResolutionS(b3dm_loader * visitor, int meshIndex)
  90. {
  91. return visitor->mMeshInfos[meshIndex]->mImageResolutionS;
  92. }
  93. //GetImageResolutionT
  94. extern "C" DLLEXPORT int GetImageResolutionT(b3dm_loader * visitor, int meshIndex)
  95. {
  96. return visitor->mMeshInfos[meshIndex]->mImageResolutionT;
  97. }
  98. //GetImageFormat
  99. extern "C" DLLEXPORT int GetImageFormat(b3dm_loader * visitor, int meshIndex)
  100. {
  101. return visitor->mMeshInfos[meshIndex]->mTextureFormat;
  102. }
  103. //GetImagePointer
  104. extern "C" DLLEXPORT unsigned char* GetImagePointer(b3dm_loader * visitor, int meshIndex)
  105. {
  106. return visitor->mMeshInfos[meshIndex]->mImageData;
  107. }
  108. //Ö±½Ó¿½±´ÄÚ´æ GetImageData
  109. extern "C" DLLEXPORT void GetImageData(b3dm_loader * visitor, int meshIndex, unsigned char* destData)
  110. {
  111. unsigned char* srcData = visitor->mMeshInfos[meshIndex]->mImageData;
  112. memcpy(destData, srcData, visitor->mMeshInfos[meshIndex]->mImageSize);
  113. }
  114. //GetTexCoordCount
  115. extern "C" DLLEXPORT int GetTexCoordCount(b3dm_loader * visitor, int meshIndex)
  116. {
  117. return visitor->mMeshInfos[meshIndex]->mTexCoordCount;
  118. }
  119. //Ö±½Ó¿½±´ÄÚ´æ GetTexCoords
  120. extern "C" DLLEXPORT void GetTexCoords(b3dm_loader * visitor, int meshIndex, float* destVertexs)
  121. {
  122. int count = visitor->mMeshInfos[meshIndex]->mTexCoordCount;
  123. float* srcVertexs = visitor->mMeshInfos[meshIndex]->mTexCoords;
  124. memcpy(destVertexs, srcVertexs, sizeof(float) * count * 2);
  125. }
  126. //GetTexCoordPointer
  127. extern "C" DLLEXPORT float* GetTexCoordPointer(b3dm_loader * visitor, int meshIndex, int texCoordIndex)
  128. {
  129. return visitor->mMeshInfos[meshIndex]->mTexCoords + texCoordIndex * 2;
  130. }