JTImporter.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. #include "JTImporter.h"
  2. #include <assimp/StreamReader.h>
  3. #include <assimp/MemoryIOWrapper.h>
  4. #include <assimp/Importer.hpp>
  5. #include <assimp/importerdesc.h>
  6. #include <assimp/ai_assert.h>
  7. #ifndef ASSIMP_BUILD_NO_JT_IMPORTER
  8. namespace Assimp {
  9. namespace {
  10. static const aiImporterDesc desc = {
  11. "Siemens JF File format importer",
  12. "",
  13. "",
  14. "",
  15. aiImporterFlags_SupportTextFlavour,
  16. 0,
  17. 0,
  18. 0,
  19. 0,
  20. "jt"
  21. };
  22. }
  23. enum SegmentType {
  24. LogicalSceneGraph = 1,
  25. JT_B_Rep,
  26. PMI_Data,
  27. MetaData,
  28. Shape,
  29. Shape_LOD0,
  30. Shape_LOD1,
  31. Shape_LOD2,
  32. Shape_LOD3,
  33. Shape_LOD4,
  34. Shape_LOD5,
  35. Shape_LOD6,
  36. Shape_LOD7,
  37. Shape_LOD8,
  38. Shape_LOD9,
  39. XT_B_Rep,
  40. Wireframe_Rep,
  41. ULP,
  42. LWPA
  43. };
  44. JTImporter::JTImporter()
  45. : BaseImporter()
  46. , mJTModel()
  47. , mDataSegments()
  48. , mCurrentDataSegment( nullptr ){
  49. // empty
  50. }
  51. JTImporter::~JTImporter() {
  52. // empty
  53. }
  54. bool JTImporter::CanRead(const std::string &file, IOSystem* pIOHandler, bool checkSig) const {
  55. const std::string& extension = GetExtension(file);
  56. if (extension == std::string(desc.mFileExtensions)) {
  57. return true;
  58. }
  59. return false;
  60. }
  61. const aiImporterDesc* JTImporter::GetInfo() const {
  62. return &desc;
  63. }
  64. void JTImporter::InternReadFile(const std::string &file, aiScene* pScene, IOSystem* pIOHandler) {
  65. std::unique_ptr<IOStream> stream(pIOHandler->Open(file, "rb"));
  66. if (!stream) {
  67. throw DeadlyImportError("JT: Cannot open file " + file );
  68. }
  69. std::vector<char> contents;
  70. contents.resize(stream->FileSize() + 1);
  71. stream->Read(&*contents.begin(), 1, contents.size() - 1);
  72. contents[contents.size() - 1] = 0;
  73. BinReader reader(contents);
  74. ReadHeader(reader);
  75. }
  76. void JTImporter::ReadHeader(BinReader& reader) {
  77. reader.readChars(VersionLen, mJTModel.mJTHeader.mVersion);
  78. reader.readUChar(mJTModel.mJTHeader.mByteOrder);
  79. reader.readI32(mJTModel.mJTHeader.mReserved);
  80. int toc_offset;
  81. reader.readI32(toc_offset);
  82. }
  83. void JTImporter::ReadTokenSegment(BinReader& reader) {
  84. int toc_count;
  85. reader.readI32(toc_count);
  86. if (0 == toc_count) {
  87. return;
  88. }
  89. for (int i = 0; i < toc_count; ++i) {
  90. ReadTokenEntry(reader);
  91. }
  92. }
  93. void JTImporter::ReadTokenEntry(BinReader& reader) {
  94. TokenEntry* entry = new TokenEntry;
  95. reader.readGUID(entry->guid);
  96. reader.readI32(entry->offset);
  97. reader.readI32(entry->length);
  98. reader.readU32(entry->attributes);
  99. mJTModel.mTokenEntryMap[entry->guid] = entry;
  100. }
  101. TokenEntry* JTImporter::FindTokenEntryByGuid(GUID& guid) {
  102. if (mJTModel.mTokenEntryMap.empty()) {
  103. return nullptr;
  104. }
  105. JTModel::TokenEntryMap::const_iterator it(mJTModel.mTokenEntryMap.find(guid));
  106. if (it == mJTModel.mTokenEntryMap.end()) {
  107. return nullptr;
  108. }
  109. return it->second;
  110. }
  111. static bool SupportsZlibCompression(SegmentType type) {
  112. switch (type) {
  113. case LogicalSceneGraph:
  114. case JT_B_Rep:
  115. case PMI_Data:
  116. case MetaData:
  117. return true;
  118. case Shape:
  119. case Shape_LOD0:
  120. case Shape_LOD1:
  121. case Shape_LOD2:
  122. case Shape_LOD3:
  123. case Shape_LOD4:
  124. case Shape_LOD5:
  125. case Shape_LOD6:
  126. case Shape_LOD7:
  127. case Shape_LOD8:
  128. case Shape_LOD9:
  129. return false;
  130. case XT_B_Rep:
  131. case Wireframe_Rep:
  132. case ULP:
  133. case LWPA:
  134. return true;
  135. default:
  136. ai_assert_entry();
  137. break;
  138. }
  139. return false;
  140. }
  141. void JTImporter::ReadDataSegment(BinReader& reader) {
  142. mCurrentDataSegment = new DataSegment;
  143. mDataSegments.push_back(mCurrentDataSegment);
  144. ReadDataSegmentHeader(reader);
  145. }
  146. void JTImporter::ReadDataSegmentHeader(BinReader& reader) {
  147. if (nullptr == mCurrentDataSegment) {
  148. return;
  149. }
  150. reader.readGUID(mCurrentDataSegment->m_DataSegmentHeader.guid);
  151. reader.readI32(mCurrentDataSegment->m_DataSegmentHeader.type);
  152. reader.readI32(mCurrentDataSegment->m_DataSegmentHeader.length);
  153. }
  154. void JTImporter::ReadLogicalElementHeaderZLib(BinReader& reader) {
  155. i32 compressionFlag;
  156. reader.readI32(compressionFlag);
  157. i32 compressedLen;
  158. reader.readI32(compressedLen);
  159. u8 compressionAlgo;
  160. reader.readUChar(compressionAlgo);
  161. }
  162. void JTImporter::ReadSegmentType(BinReader& reader) {
  163. SegmentType type = static_cast<SegmentType>(mCurrentDataSegment->m_DataSegmentHeader.type);
  164. switch (type) {
  165. case LogicalSceneGraph:
  166. ReadLSG(reader);
  167. break;
  168. case JT_B_Rep:
  169. break;
  170. case PMI_Data:
  171. break;
  172. case MetaData:
  173. break;
  174. case Shape:
  175. break;
  176. case Shape_LOD0:
  177. break;
  178. case Shape_LOD1:
  179. break;
  180. case Shape_LOD2:
  181. break;
  182. case Shape_LOD3:
  183. break;
  184. case Shape_LOD4:
  185. break;
  186. case Shape_LOD5:
  187. break;
  188. case Shape_LOD6:
  189. break;
  190. case Shape_LOD7:
  191. break;
  192. case Shape_LOD8:
  193. break;
  194. case Shape_LOD9:
  195. break;
  196. case XT_B_Rep:
  197. break;
  198. case Wireframe_Rep:
  199. break;
  200. case ULP:
  201. break;
  202. case LWPA:
  203. break;
  204. default:
  205. break;
  206. }
  207. }
  208. void JTImporter::ReadLSG(BinReader& reader) {
  209. ReadLogicalElementHeaderZLib(reader);
  210. }
  211. } // end namespace Assimp
  212. #endif // ASSIMP_BUILD_NO_JT_IMPORTER