Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

S3ModelParser.js 36KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155
  1. import pako from './pako_inflate.js'
  2. import DXTTextureDecode from './DXTTextureDecode.js'
  3. const { Cesium } = DC.Namespace
  4. function S3ModelParser() {}
  5. S3ModelParser.s3tc = true
  6. S3ModelParser.pvrtc = false
  7. S3ModelParser.etc1 = false
  8. let S3MBVertexTag = {
  9. SV_Unkown: 0,
  10. SV_Standard: 1,
  11. SV_Compressed: 2
  12. }
  13. const S3MPixelFormat = {
  14. LUMINANCE_8: 1,
  15. LUMINANCE_16: 2,
  16. ALPHA: 3,
  17. ALPHA_4_LUMINANCE_4: 4,
  18. LUMINANCE_ALPHA: 5,
  19. RGB_565: 6,
  20. BGR565: 7,
  21. RGB: 10,
  22. BGR: 11,
  23. ARGB: 12,
  24. ABGR: 13,
  25. BGRA: 14,
  26. WEBP: 25,
  27. RGBA: 28,
  28. DXT1: 17,
  29. DXT2: 18,
  30. DXT3: 19,
  31. DXT4: 20,
  32. DXT5: 21,
  33. CRN_DXT5: 26,
  34. STANDARD_CRN: 27
  35. }
  36. const VertexCompressOption = {
  37. SVC_Vertex: 1,
  38. SVC_Normal: 2,
  39. SVC_VertexColor: 4,
  40. SVC_SecondColor: 8,
  41. SVC_TexutreCoord: 16,
  42. SVC_TexutreCoordIsW: 32
  43. }
  44. function unZip(buffer, bytesOffset) {
  45. let dataZip = new Uint8Array(buffer, bytesOffset)
  46. return pako.inflate(dataZip).buffer
  47. }
  48. function getStringFromTypedArray(uint8Array, byteOffset, byteLength) {
  49. var byteOffset = 0
  50. var byteLength = uint8Array.byteLength
  51. var codeType = 'utf-8'
  52. uint8Array = uint8Array.subarray(byteOffset, byteOffset + byteLength)
  53. var decoder = new TextDecoder(codeType)
  54. return decoder.decode(uint8Array)
  55. }
  56. function parseString(buffer, view, bytesOffset) {
  57. let length = view.getUint32(bytesOffset, true)
  58. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  59. let stringBufferView = new Uint8Array(buffer, bytesOffset, length)
  60. let string = getStringFromTypedArray(stringBufferView)
  61. bytesOffset += length
  62. return {
  63. string: string,
  64. bytesOffset: bytesOffset
  65. }
  66. }
  67. function parseGeode(buffer, view, bytesOffset, geodes) {
  68. let geode = {}
  69. let skeletonNames = []
  70. let geoMatrix = new Array(16)
  71. for (let i = 0; i < 16; i++) {
  72. geoMatrix[i] = view.getFloat64(bytesOffset, true)
  73. bytesOffset += Float64Array.BYTES_PER_ELEMENT
  74. }
  75. geode.matrix = geoMatrix
  76. geode.skeletonNames = skeletonNames
  77. let skeletonCount = view.getUint32(bytesOffset, true)
  78. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  79. for (let i = 0; i < skeletonCount; i++) {
  80. let res = parseString(buffer, view, bytesOffset)
  81. skeletonNames.push(res.string)
  82. bytesOffset = res.bytesOffset
  83. }
  84. geodes.push(geode)
  85. return bytesOffset
  86. }
  87. function parsePageLOD(buffer, view, bytesOffset, pageLods) {
  88. let pageLOD = {}
  89. pageLOD.rangeList = view.getFloat32(bytesOffset, true)
  90. bytesOffset += Float32Array.BYTES_PER_ELEMENT
  91. pageLOD.rangeMode = view.getUint16(bytesOffset, true)
  92. bytesOffset += Uint16Array.BYTES_PER_ELEMENT
  93. let center = {}
  94. center.x = view.getFloat64(bytesOffset, true)
  95. bytesOffset += Float64Array.BYTES_PER_ELEMENT
  96. center.y = view.getFloat64(bytesOffset, true)
  97. bytesOffset += Float64Array.BYTES_PER_ELEMENT
  98. center.z = view.getFloat64(bytesOffset, true)
  99. bytesOffset += Float64Array.BYTES_PER_ELEMENT
  100. let radius = view.getFloat64(bytesOffset, true)
  101. bytesOffset += Float64Array.BYTES_PER_ELEMENT
  102. pageLOD.boundingSphere = {
  103. center: center,
  104. radius: radius
  105. }
  106. let res = parseString(buffer, view, bytesOffset)
  107. let strChildTile = res.string
  108. bytesOffset = res.bytesOffset
  109. let index = strChildTile.indexOf('Geometry')
  110. if (index !== -1) {
  111. let ignoreString = strChildTile.substring(index)
  112. strChildTile = strChildTile.replace(ignoreString, '')
  113. }
  114. pageLOD.childTile = strChildTile
  115. pageLOD.geodes = []
  116. let geodeCount = view.getUint32(bytesOffset, true)
  117. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  118. for (let i = 0; i < geodeCount; i++) {
  119. bytesOffset = parseGeode(buffer, view, bytesOffset, pageLOD.geodes)
  120. }
  121. pageLods.push(pageLOD)
  122. return bytesOffset
  123. }
  124. function parseGroupNode(buffer, view, bytesOffset, result) {
  125. let groupNode = {}
  126. let geodes = []
  127. let pageLods = []
  128. let size = view.getUint32(bytesOffset, true)
  129. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  130. let count = view.getUint32(bytesOffset, true)
  131. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  132. for (let i = 0; i < count; i++) {
  133. bytesOffset = parsePageLOD(buffer, view, bytesOffset, pageLods)
  134. }
  135. groupNode.pageLods = pageLods
  136. let align = bytesOffset % 4
  137. if (align !== 0) {
  138. bytesOffset += 4 - align
  139. }
  140. result.groupNode = groupNode
  141. return bytesOffset
  142. }
  143. function parseVertex(buffer, view, bytesOffset, vertexPackage) {
  144. let verticesCount = view.getUint32(bytesOffset, true)
  145. vertexPackage.verticesCount = verticesCount
  146. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  147. if (bytesOffset <= 0) {
  148. return bytesOffset
  149. }
  150. let vertexDimension = view.getUint16(bytesOffset, true)
  151. bytesOffset += Uint16Array.BYTES_PER_ELEMENT
  152. let vertexStride = view.getUint16(bytesOffset, true)
  153. vertexStride = vertexDimension * Float32Array.BYTES_PER_ELEMENT
  154. bytesOffset += Uint16Array.BYTES_PER_ELEMENT
  155. let byteLength =
  156. verticesCount * vertexDimension * Float32Array.BYTES_PER_ELEMENT
  157. let vertexBuffer = new Uint8Array(buffer, bytesOffset, byteLength)
  158. bytesOffset += byteLength
  159. let attributes = vertexPackage.vertexAttributes
  160. let attrLocation = vertexPackage.attrLocation
  161. attrLocation['aPosition'] = attributes.length
  162. attributes.push({
  163. index: attrLocation['aPosition'],
  164. typedArray: vertexBuffer,
  165. componentsPerAttribute: vertexDimension,
  166. componentDatatype: 5126,
  167. offsetInBytes: 0,
  168. strideInBytes: vertexStride,
  169. normalize: false
  170. })
  171. return bytesOffset
  172. }
  173. function parseNormal(buffer, view, bytesOffset, vertexPackage) {
  174. let normalCount = view.getUint32(bytesOffset, true)
  175. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  176. if (normalCount <= 0) {
  177. return bytesOffset
  178. }
  179. let normalDimension = view.getUint16(bytesOffset, true)
  180. bytesOffset += Uint16Array.BYTES_PER_ELEMENT
  181. let normalStride = view.getUint16(bytesOffset, true)
  182. bytesOffset += Uint16Array.BYTES_PER_ELEMENT
  183. let byteLength =
  184. normalCount * normalDimension * Float32Array.BYTES_PER_ELEMENT
  185. let normalBuffer = new Uint8Array(buffer, bytesOffset, byteLength)
  186. bytesOffset += byteLength
  187. let attributes = vertexPackage.vertexAttributes
  188. let attrLocation = vertexPackage.attrLocation
  189. attrLocation['aNormal'] = attributes.length
  190. attributes.push({
  191. index: attrLocation['aNormal'],
  192. typedArray: normalBuffer,
  193. componentsPerAttribute: normalDimension,
  194. componentDatatype: 5126,
  195. offsetInBytes: 0,
  196. strideInBytes: normalStride,
  197. normalize: false
  198. })
  199. return bytesOffset
  200. }
  201. function parseVertexColor(buffer, view, bytesOffset, vertexPackage) {
  202. let colorCount = view.getUint32(bytesOffset, true)
  203. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  204. let verticesCount = vertexPackage.verticesCount
  205. let vertexColor
  206. if (colorCount > 0) {
  207. let colorStride = view.getUint16(bytesOffset, true)
  208. bytesOffset += Uint16Array.BYTES_PER_ELEMENT
  209. bytesOffset += Uint8Array.BYTES_PER_ELEMENT * 2
  210. let byteLength = colorCount * Uint8Array.BYTES_PER_ELEMENT * 4
  211. let typedArray = new Uint8Array(buffer, bytesOffset, byteLength)
  212. vertexColor = typedArray.slice(0, byteLength)
  213. bytesOffset += byteLength
  214. } else {
  215. vertexColor = new Uint8Array(4 * verticesCount)
  216. for (let m = 0; m < verticesCount; m++) {
  217. vertexColor[m * 4] = 255
  218. vertexColor[m * 4 + 1] = 255
  219. vertexColor[m * 4 + 2] = 255
  220. vertexColor[m * 4 + 3] = 255
  221. }
  222. }
  223. let attributes = vertexPackage.vertexAttributes
  224. let attrLocation = vertexPackage.attrLocation
  225. attrLocation['aColor'] = attributes.length
  226. attributes.push({
  227. index: attrLocation['aColor'],
  228. typedArray: vertexColor,
  229. componentsPerAttribute: 4,
  230. componentDatatype: 5121,
  231. offsetInBytes: 0,
  232. strideInBytes: 4,
  233. normalize: true
  234. })
  235. vertexPackage.vertexColor = vertexColor
  236. return bytesOffset
  237. }
  238. function parseSecondColor(buffer, view, bytesOffset, vertexPackage) {
  239. let secondColorCount = view.getUint32(bytesOffset, true)
  240. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  241. if (secondColorCount <= 0) {
  242. return bytesOffset
  243. }
  244. let secondColorStride = view.getUint16(bytesOffset, true)
  245. bytesOffset += Uint16Array.BYTES_PER_ELEMENT
  246. bytesOffset += Uint8Array.BYTES_PER_ELEMENT * 2
  247. let byteLength = secondColorCount * Uint8Array.BYTES_PER_ELEMENT * 4
  248. let secColorBuffer = new Uint8Array(buffer, bytesOffset, byteLength)
  249. bytesOffset += byteLength
  250. let attributes = vertexPackage.vertexAttributes
  251. let attrLocation = vertexPackage.attrLocation
  252. attrLocation['aSecondColor'] = attributes.length
  253. attributes.push({
  254. index: attrLocation['aSecondColor'],
  255. typedArray: secColorBuffer,
  256. componentsPerAttribute: 4,
  257. componentDatatype: 5121,
  258. offsetInBytes: 0,
  259. strideInBytes: 4,
  260. normalize: true
  261. })
  262. return bytesOffset
  263. }
  264. function parseTexCoord(buffer, view, bytesOffset, vertexPackage) {
  265. let count = view.getUint16(bytesOffset, true)
  266. bytesOffset += Uint16Array.BYTES_PER_ELEMENT
  267. bytesOffset += Uint16Array.BYTES_PER_ELEMENT
  268. for (let i = 0; i < count; i++) {
  269. let texCoordCount = view.getUint32(bytesOffset, true)
  270. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  271. let dimension = view.getUint16(bytesOffset, true)
  272. bytesOffset += Uint16Array.BYTES_PER_ELEMENT
  273. let texCoordStride = view.getUint16(bytesOffset, true)
  274. bytesOffset += Uint16Array.BYTES_PER_ELEMENT
  275. let byteLength = texCoordCount * dimension * Float32Array.BYTES_PER_ELEMENT
  276. let texCoordBuffer = new Uint8Array(buffer, bytesOffset, byteLength)
  277. bytesOffset += byteLength
  278. let str = 'aTexCoord' + i
  279. let attributes = vertexPackage.vertexAttributes
  280. let attrLocation = vertexPackage.attrLocation
  281. attrLocation[str] = attributes.length
  282. attributes.push({
  283. index: attrLocation[str],
  284. typedArray: texCoordBuffer,
  285. componentsPerAttribute: dimension,
  286. componentDatatype: 5126,
  287. offsetInBytes: 0,
  288. strideInBytes: dimension * Float32Array.BYTES_PER_ELEMENT,
  289. normalize: false
  290. })
  291. }
  292. return bytesOffset
  293. }
  294. function parseInstanceInfo(buffer, view, bytesOffset, vertexPackage) {
  295. let count = view.getUint16(bytesOffset, true)
  296. bytesOffset += Uint16Array.BYTES_PER_ELEMENT
  297. bytesOffset += Uint16Array.BYTES_PER_ELEMENT
  298. let attributes = vertexPackage.vertexAttributes
  299. let attrLocation = vertexPackage.attrLocation
  300. for (let i = 0; i < count; i++) {
  301. let texCoordCount = view.getUint32(bytesOffset, true)
  302. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  303. let texDimensions = view.getUint16(bytesOffset, true)
  304. bytesOffset += Uint16Array.BYTES_PER_ELEMENT
  305. let texCoordStride = view.getUint16(bytesOffset, true)
  306. bytesOffset += Uint16Array.BYTES_PER_ELEMENT
  307. let byteLength =
  308. texCoordCount * texDimensions * Float32Array.BYTES_PER_ELEMENT
  309. if (texDimensions === 17) {
  310. let instanceBuffer = new Uint8Array(buffer, bytesOffset, byteLength)
  311. vertexPackage.instanceCount = texCoordCount
  312. vertexPackage.instanceMode = texDimensions
  313. vertexPackage.instanceBuffer = instanceBuffer
  314. vertexPackage.instanceIndex = 1
  315. let len = texDimensions * texCoordCount * 4
  316. let vertexColorInstance = instanceBuffer.slice(0, len)
  317. vertexPackage.vertexColorInstance = vertexColorInstance
  318. let byteStride
  319. if (texDimensions === 17) {
  320. byteStride = Float32Array.BYTES_PER_ELEMENT * 17
  321. attrLocation['uv2'] = attributes.length
  322. attributes.push({
  323. index: attrLocation['uv2'],
  324. componentsPerAttribute: 4,
  325. componentDatatype: 5126,
  326. normalize: false,
  327. offsetInBytes: 0,
  328. strideInBytes: byteStride,
  329. instanceDivisor: 1
  330. })
  331. attrLocation['uv3'] = attributes.length
  332. attributes.push({
  333. index: attrLocation['uv3'],
  334. componentsPerAttribute: 4,
  335. componentDatatype: 5126,
  336. normalize: false,
  337. offsetInBytes: 4 * Float32Array.BYTES_PER_ELEMENT,
  338. strideInBytes: byteStride,
  339. instanceDivisor: 1
  340. })
  341. attrLocation['uv4'] = attributes.length
  342. attributes.push({
  343. index: attrLocation['uv4'],
  344. componentsPerAttribute: 4,
  345. componentDatatype: 5126,
  346. normalize: false,
  347. offsetInBytes: 8 * Float32Array.BYTES_PER_ELEMENT,
  348. strideInBytes: byteStride,
  349. instanceDivisor: 1
  350. })
  351. attrLocation['secondary_colour'] = attributes.length
  352. attributes.push({
  353. index: attrLocation['secondary_colour'],
  354. componentsPerAttribute: 4,
  355. componentDatatype: 5126,
  356. normalize: false,
  357. offsetInBytes: 12 * Float32Array.BYTES_PER_ELEMENT,
  358. strideInBytes: byteStride,
  359. instanceDivisor: 1
  360. })
  361. attrLocation['uv6'] = attributes.length
  362. attributes.push({
  363. index: attrLocation['uv6'],
  364. componentsPerAttribute: 4,
  365. componentDatatype: 5121,
  366. normalize: true,
  367. offsetInBytes: 16 * Float32Array.BYTES_PER_ELEMENT,
  368. strideInBytes: byteStride,
  369. instanceDivisor: 1
  370. })
  371. } else if (texDimensions === 29) {
  372. byteStride = Float32Array.BYTES_PER_ELEMENT * 29
  373. attrLocation['uv1'] = attributes.length
  374. attributes.push({
  375. index: attrLocation['uv1'],
  376. componentsPerAttribute: 4,
  377. componentDatatype: 5126,
  378. normalize: false,
  379. offsetInBytes: 0,
  380. strideInBytes: byteStride,
  381. instanceDivisor: 1,
  382. byteLength: byteLength
  383. })
  384. attrLocation['uv2'] = attributes.length
  385. attributes.push({
  386. index: attrLocation['uv2'],
  387. componentsPerAttribute: 4,
  388. componentDatatype: 5126,
  389. normalize: false,
  390. offsetInBytes: 4 * Float32Array.BYTES_PER_ELEMENT,
  391. strideInBytes: byteStride,
  392. instanceDivisor: 1
  393. })
  394. attrLocation['uv3'] = attributes.length
  395. attributes.push({
  396. index: attrLocation['uv3'],
  397. componentsPerAttribute: 4,
  398. componentDatatype: 5126,
  399. normalize: false,
  400. offsetInBytes: 8 * Float32Array.BYTES_PER_ELEMENT,
  401. strideInBytes: byteStride,
  402. instanceDivisor: 1
  403. })
  404. attrLocation['uv4'] = attributes.length
  405. attributes.push({
  406. index: attrLocation['uv4'],
  407. componentsPerAttribute: 4,
  408. componentDatatype: 5126,
  409. normalize: false,
  410. offsetInBytes: 12 * Float32Array.BYTES_PER_ELEMENT,
  411. strideInBytes: byteStride,
  412. instanceDivisor: 1
  413. })
  414. attrLocation['uv5'] = attributes.length
  415. attributes.push({
  416. index: attrLocation['uv5'],
  417. componentsPerAttribute: 4,
  418. componentDatatype: 5126,
  419. normalize: false,
  420. offsetInBytes: 16 * Float32Array.BYTES_PER_ELEMENT,
  421. strideInBytes: byteStride,
  422. instanceDivisor: 1
  423. })
  424. attrLocation['uv6'] = attributes.length
  425. attributes.push({
  426. index: attrLocation['uv6'],
  427. componentsPerAttribute: 4,
  428. componentDatatype: 5126,
  429. normalize: false,
  430. offsetInBytes: 20 * Float32Array.BYTES_PER_ELEMENT,
  431. strideInBytes: byteStride,
  432. instanceDivisor: 1
  433. })
  434. attrLocation['uv7'] = attributes.length
  435. attributes.push({
  436. index: attrLocation['uv7'],
  437. componentsPerAttribute: 3,
  438. componentDatatype: 5126,
  439. normalize: false,
  440. offsetInBytes: 24 * Float32Array.BYTES_PER_ELEMENT,
  441. strideInBytes: byteStride,
  442. instanceDivisor: 1
  443. })
  444. attrLocation['secondary_colour'] = attributes.length
  445. attributes.push({
  446. index: attrLocation['secondary_colour'],
  447. componentsPerAttribute: 4,
  448. componentDatatype: 5121,
  449. normalize: true,
  450. offsetInBytes: 27 * Float32Array.BYTES_PER_ELEMENT,
  451. strideInBytes: byteStride,
  452. instanceDivisor: 1
  453. })
  454. attrLocation['uv9'] = attributes.length
  455. attributes.push({
  456. index: attrLocation['uv9'],
  457. componentsPerAttribute: 4,
  458. componentDatatype: 5121,
  459. normalize: true,
  460. offsetInBytes: 28 * Float32Array.BYTES_PER_ELEMENT,
  461. strideInBytes: byteStride,
  462. instanceDivisor: 1
  463. })
  464. }
  465. } else {
  466. let len = texCoordCount * texDimensions
  467. vertexPackage.instanceBounds = new Float32Array(len)
  468. for (let k = 0; k < len; k++) {
  469. vertexPackage.instanceBounds[k] = view.getFloat32(
  470. bytesOffset + k * Float32Array.BYTES_PER_ELEMENT,
  471. true
  472. )
  473. }
  474. }
  475. bytesOffset += byteLength
  476. }
  477. return bytesOffset
  478. }
  479. function parseCompressVertex(buffer, view, bytesOffset, vertexPackage) {
  480. let verticesCount = view.getUint32(bytesOffset, true)
  481. vertexPackage.verticesCount = verticesCount
  482. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  483. if (bytesOffset <= 0) {
  484. return bytesOffset
  485. }
  486. let vertexDimension = view.getUint16(bytesOffset, true)
  487. bytesOffset += Uint16Array.BYTES_PER_ELEMENT
  488. let vertexStride = view.getUint16(bytesOffset, true)
  489. vertexStride = vertexDimension * Int16Array.BYTES_PER_ELEMENT
  490. bytesOffset += Uint16Array.BYTES_PER_ELEMENT
  491. let vertCompressConstant = view.getFloat32(bytesOffset, true)
  492. bytesOffset += Float32Array.BYTES_PER_ELEMENT
  493. let minVerticesValue = {}
  494. minVerticesValue.x = view.getFloat32(bytesOffset, true)
  495. bytesOffset += Float32Array.BYTES_PER_ELEMENT
  496. minVerticesValue.y = view.getFloat32(bytesOffset, true)
  497. bytesOffset += Float32Array.BYTES_PER_ELEMENT
  498. minVerticesValue.z = view.getFloat32(bytesOffset, true)
  499. bytesOffset += Float32Array.BYTES_PER_ELEMENT
  500. minVerticesValue.w = view.getFloat32(bytesOffset, true)
  501. bytesOffset += Float32Array.BYTES_PER_ELEMENT
  502. vertexPackage.vertCompressConstant = vertCompressConstant
  503. vertexPackage.minVerticesValue = minVerticesValue
  504. let byteLength =
  505. verticesCount * vertexDimension * Int16Array.BYTES_PER_ELEMENT
  506. let vertexBuffer = new Uint8Array(buffer, bytesOffset, byteLength)
  507. bytesOffset += byteLength
  508. let attributes = vertexPackage.vertexAttributes
  509. let attrLocation = vertexPackage.attrLocation
  510. attrLocation['aPosition'] = attributes.length
  511. attributes.push({
  512. index: attrLocation['aPosition'],
  513. typedArray: vertexBuffer,
  514. componentsPerAttribute: vertexDimension,
  515. componentDatatype: 5122,
  516. offsetInBytes: 0,
  517. strideInBytes: vertexStride,
  518. normalize: false
  519. })
  520. return bytesOffset
  521. }
  522. function parseCompressNormal(buffer, view, bytesOffset, vertexPackage) {
  523. let normalCount = view.getUint32(bytesOffset, true)
  524. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  525. if (normalCount <= 0) {
  526. return bytesOffset
  527. }
  528. let normalDimension = view.getUint16(bytesOffset, true)
  529. bytesOffset += Uint16Array.BYTES_PER_ELEMENT
  530. let normalStride = view.getUint16(bytesOffset, true)
  531. bytesOffset += Uint16Array.BYTES_PER_ELEMENT
  532. let byteLength = normalCount * 2 * Int16Array.BYTES_PER_ELEMENT
  533. let normalBuffer = new Uint8Array(buffer, bytesOffset, byteLength)
  534. bytesOffset += byteLength
  535. let attributes = vertexPackage.vertexAttributes
  536. let attrLocation = vertexPackage.attrLocation
  537. attrLocation['aNormal'] = attributes.length
  538. attributes.push({
  539. index: attrLocation['aNormal'],
  540. typedArray: normalBuffer,
  541. componentsPerAttribute: 2,
  542. componentDatatype: 5122,
  543. offsetInBytes: 0,
  544. strideInBytes: normalStride,
  545. normalize: false
  546. })
  547. return bytesOffset
  548. }
  549. function parseCompressTexCoord(buffer, view, bytesOffset, vertexPackage) {
  550. vertexPackage.texCoordCompressConstant = []
  551. vertexPackage.minTexCoordValue = []
  552. let count = view.getUint16(bytesOffset, true)
  553. bytesOffset += Uint16Array.BYTES_PER_ELEMENT
  554. bytesOffset += Uint16Array.BYTES_PER_ELEMENT
  555. for (let i = 0; i < count; i++) {
  556. let bNeedTexCoordZ = view.getUint8(bytesOffset, true)
  557. bytesOffset += Uint8Array.BYTES_PER_ELEMENT
  558. bytesOffset += Uint8Array.BYTES_PER_ELEMENT * 3
  559. let texCoordCount = view.getUint32(bytesOffset, true)
  560. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  561. let dimension = view.getUint16(bytesOffset, true)
  562. bytesOffset += Uint16Array.BYTES_PER_ELEMENT
  563. let texCoordStride = view.getUint16(bytesOffset, true)
  564. bytesOffset += Uint16Array.BYTES_PER_ELEMENT
  565. let texCoordCompressConstant = view.getFloat32(bytesOffset, true)
  566. bytesOffset += Float32Array.BYTES_PER_ELEMENT
  567. vertexPackage.texCoordCompressConstant.push(texCoordCompressConstant)
  568. let minTexCoordValue = {}
  569. minTexCoordValue.x = view.getFloat32(bytesOffset, true)
  570. bytesOffset += Float32Array.BYTES_PER_ELEMENT
  571. minTexCoordValue.y = view.getFloat32(bytesOffset, true)
  572. bytesOffset += Float32Array.BYTES_PER_ELEMENT
  573. minTexCoordValue.z = view.getFloat32(bytesOffset, true)
  574. bytesOffset += Float32Array.BYTES_PER_ELEMENT
  575. minTexCoordValue.w = view.getFloat32(bytesOffset, true)
  576. bytesOffset += Float32Array.BYTES_PER_ELEMENT
  577. vertexPackage.minTexCoordValue.push(minTexCoordValue)
  578. let byteLength = texCoordCount * dimension * Int16Array.BYTES_PER_ELEMENT
  579. let texCoordBuffer = new Uint8Array(buffer, bytesOffset, byteLength)
  580. bytesOffset += byteLength
  581. let align = bytesOffset % 4
  582. if (align !== 0) {
  583. bytesOffset += 4 - align
  584. }
  585. let str = 'aTexCoord' + i
  586. let attributes = vertexPackage.vertexAttributes
  587. let attrLocation = vertexPackage.attrLocation
  588. attrLocation[str] = attributes.length
  589. attributes.push({
  590. index: attrLocation[str],
  591. typedArray: texCoordBuffer,
  592. componentsPerAttribute: dimension,
  593. componentDatatype: 5122,
  594. offsetInBytes: 0,
  595. strideInBytes: dimension * Int16Array.BYTES_PER_ELEMENT,
  596. normalize: false
  597. })
  598. if (bNeedTexCoordZ) {
  599. byteLength = texCoordCount * Float32Array.BYTES_PER_ELEMENT
  600. let texCoordZBuffer = new Uint8Array(buffer, bytesOffset, byteLength)
  601. bytesOffset += byteLength
  602. vertexPackage.texCoordZMatrix = true
  603. str = 'aTexCoordZ' + i
  604. attrLocation[str] = attributes.length
  605. attributes.push({
  606. index: attrLocation[str],
  607. typedArray: texCoordZBuffer,
  608. componentsPerAttribute: 1,
  609. componentDatatype: 5126,
  610. offsetInBytes: 0,
  611. strideInBytes: Float32Array.BYTES_PER_ELEMENT,
  612. normalize: false
  613. })
  614. }
  615. }
  616. return bytesOffset
  617. }
  618. function parseStandardSkeleton(buffer, view, bytesOffset, vertexPackage) {
  619. bytesOffset = parseVertex(buffer, view, bytesOffset, vertexPackage)
  620. bytesOffset = parseNormal(buffer, view, bytesOffset, vertexPackage)
  621. bytesOffset = parseVertexColor(buffer, view, bytesOffset, vertexPackage)
  622. bytesOffset = parseSecondColor(buffer, view, bytesOffset, vertexPackage)
  623. bytesOffset = parseTexCoord(buffer, view, bytesOffset, vertexPackage)
  624. bytesOffset = parseInstanceInfo(buffer, view, bytesOffset, vertexPackage)
  625. return bytesOffset
  626. }
  627. function parseCompressSkeleton(buffer, view, bytesOffset, vertexPackage) {
  628. let compressOptions = view.getUint32(bytesOffset, true)
  629. vertexPackage.compressOptions = compressOptions
  630. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  631. if (
  632. (compressOptions & VertexCompressOption.SVC_Vertex) ===
  633. VertexCompressOption.SVC_Vertex
  634. ) {
  635. bytesOffset = parseCompressVertex(buffer, view, bytesOffset, vertexPackage)
  636. } else {
  637. bytesOffset = parseVertex(buffer, view, bytesOffset, vertexPackage)
  638. }
  639. if (
  640. (compressOptions & VertexCompressOption.SVC_Normal) ===
  641. VertexCompressOption.SVC_Normal
  642. ) {
  643. bytesOffset = parseCompressNormal(buffer, view, bytesOffset, vertexPackage)
  644. } else {
  645. bytesOffset = parseNormal(buffer, view, bytesOffset, vertexPackage)
  646. }
  647. bytesOffset = parseVertexColor(buffer, view, bytesOffset, vertexPackage)
  648. bytesOffset = parseSecondColor(buffer, view, bytesOffset, vertexPackage)
  649. if (
  650. (compressOptions & VertexCompressOption.SVC_TexutreCoord) ===
  651. VertexCompressOption.SVC_TexutreCoord
  652. ) {
  653. bytesOffset = parseCompressTexCoord(
  654. buffer,
  655. view,
  656. bytesOffset,
  657. vertexPackage
  658. )
  659. } else {
  660. bytesOffset = parseTexCoord(buffer, view, bytesOffset, vertexPackage)
  661. }
  662. if (
  663. (compressOptions & VertexCompressOption.SVC_TexutreCoordIsW) ===
  664. VertexCompressOption.SVC_TexutreCoordIsW
  665. ) {
  666. vertexPackage.textureCoordIsW = true
  667. }
  668. bytesOffset = parseInstanceInfo(buffer, view, bytesOffset, vertexPackage)
  669. return bytesOffset
  670. }
  671. function parseIndexPackage(buffer, view, bytesOffset, arrIndexPackage) {
  672. let count = view.getUint32(bytesOffset, true)
  673. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  674. for (let i = 0; i < count; i++) {
  675. let indexPackage = {}
  676. let indexCount = view.getUint32(bytesOffset, true)
  677. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  678. let indexType = view.getUint8(bytesOffset, true)
  679. bytesOffset += Uint8Array.BYTES_PER_ELEMENT
  680. let bUseIndex = view.getUint8(bytesOffset, true)
  681. bytesOffset += Uint8Array.BYTES_PER_ELEMENT
  682. let primitiveType = view.getUint8(bytesOffset, true)
  683. bytesOffset += Uint8Array.BYTES_PER_ELEMENT
  684. bytesOffset += Uint8Array.BYTES_PER_ELEMENT
  685. if (indexCount > 0) {
  686. let indexBuffer = null
  687. let byteLength
  688. if (indexType === 1 || indexType === 3) {
  689. byteLength = indexCount * Uint32Array.BYTES_PER_ELEMENT
  690. indexBuffer = new Uint8Array(buffer, bytesOffset, byteLength)
  691. } else {
  692. byteLength = indexCount * Uint16Array.BYTES_PER_ELEMENT
  693. indexBuffer = new Uint8Array(buffer, bytesOffset, byteLength)
  694. if (indexCount % 2 !== 0) {
  695. byteLength += 2
  696. }
  697. }
  698. indexPackage.indicesTypedArray = indexBuffer
  699. bytesOffset += byteLength
  700. }
  701. indexPackage.indicesCount = indexCount
  702. indexPackage.indexType = indexType
  703. indexPackage.primitiveType = primitiveType
  704. let arrPassName = []
  705. let passNameCount = view.getUint32(bytesOffset, true)
  706. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  707. for (let j = 0; j < passNameCount; j++) {
  708. let res = parseString(buffer, view, bytesOffset)
  709. let passName = res.string
  710. bytesOffset = res.bytesOffset
  711. arrPassName.push(passName)
  712. indexPackage.materialCode = passName
  713. }
  714. let align = bytesOffset % 4
  715. if (align !== 0) {
  716. let nReserved = 4 - (bytesOffset % 4)
  717. bytesOffset += nReserved
  718. }
  719. arrIndexPackage.push(indexPackage)
  720. }
  721. return bytesOffset
  722. }
  723. function parseSkeleton(buffer, view, bytesOffset, geoPackage) {
  724. let size = view.getUint32(bytesOffset, true)
  725. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  726. let count = view.getUint32(bytesOffset, true)
  727. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  728. for (let i = 0; i < count; i++) {
  729. let res = parseString(buffer, view, bytesOffset)
  730. let geometryName = res.string
  731. bytesOffset = res.bytesOffset
  732. let align = bytesOffset % 4
  733. if (align !== 0) {
  734. bytesOffset += 4 - align
  735. }
  736. let tag = view.getUint32(bytesOffset, true)
  737. bytesOffset += Int32Array.BYTES_PER_ELEMENT
  738. let vertexPackage = {
  739. vertexAttributes: [],
  740. attrLocation: {},
  741. instanceCount: 0,
  742. instanceMode: 0,
  743. instanceIndex: -1
  744. }
  745. if (tag === S3MBVertexTag.SV_Standard) {
  746. bytesOffset = parseStandardSkeleton(
  747. buffer,
  748. view,
  749. bytesOffset,
  750. vertexPackage
  751. )
  752. } else if (tag === S3MBVertexTag.SV_Compressed) {
  753. bytesOffset = parseCompressSkeleton(
  754. buffer,
  755. view,
  756. bytesOffset,
  757. vertexPackage
  758. )
  759. }
  760. let arrIndexPackage = []
  761. bytesOffset = parseIndexPackage(buffer, view, bytesOffset, arrIndexPackage)
  762. let edgeGeometry = undefined
  763. if (
  764. arrIndexPackage.length === 2 &&
  765. arrIndexPackage[1].primitiveType === 13 &&
  766. arrIndexPackage[1].indicesCount >= 3
  767. ) {
  768. edgeGeometry = S3MEdgeProcessor.createEdgeDataByIndices(
  769. vertexPackage,
  770. arrIndexPackage[1]
  771. )
  772. }
  773. geoPackage[geometryName] = {
  774. vertexPackage: vertexPackage,
  775. arrIndexPackage: arrIndexPackage,
  776. edgeGeometry: edgeGeometry
  777. }
  778. }
  779. let secColorSize = view.getUint32(bytesOffset, true)
  780. bytesOffset += secColorSize
  781. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  782. return bytesOffset
  783. }
  784. function parseTexturePackage(buffer, view, bytesOffset, texturePackage) {
  785. let size = view.getUint32(bytesOffset, true)
  786. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  787. let count = view.getUint32(bytesOffset, true)
  788. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  789. for (let i = 0; i < count; i++) {
  790. let res = parseString(buffer, view, bytesOffset)
  791. let textureCode = res.string
  792. bytesOffset = res.bytesOffset
  793. let align = bytesOffset % 4
  794. if (align !== 0) {
  795. bytesOffset += 4 - align
  796. }
  797. let level = view.getUint32(bytesOffset, true)
  798. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  799. let width = view.getUint32(bytesOffset, true)
  800. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  801. let height = view.getUint32(bytesOffset, true)
  802. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  803. let compressType = view.getUint32(bytesOffset, true)
  804. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  805. let size = view.getUint32(bytesOffset, true)
  806. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  807. let pixelFormat = view.getUint32(bytesOffset, true)
  808. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  809. let textureData = new Uint8Array(buffer, bytesOffset, size)
  810. bytesOffset += size
  811. let internalFormat =
  812. pixelFormat === S3MPixelFormat.RGB || pixelFormat === S3MPixelFormat.BGR
  813. ? 33776
  814. : 33779
  815. if (compressType === 22) {
  816. internalFormat = 36196 //rgb_etc1
  817. }
  818. if (
  819. !S3ModelParser.s3tc &&
  820. (internalFormat === 33776 || internalFormat === 33779)
  821. ) {
  822. let out = new Uint8Array(width * height * 4)
  823. DXTTextureDecode.decode(out, width, height, textureData, pixelFormat)
  824. textureData = out
  825. compressType = 0
  826. internalFormat =
  827. pixelFormat === S3MPixelFormat.RGB || pixelFormat === S3MPixelFormat.RGB
  828. ? 273
  829. : 4369
  830. }
  831. texturePackage[textureCode] = {
  832. id: textureCode,
  833. width: width,
  834. height: height,
  835. compressType: compressType,
  836. nFormat: pixelFormat,
  837. internalFormat: internalFormat,
  838. arrayBufferView: textureData
  839. }
  840. }
  841. return bytesOffset
  842. }
  843. function parseMaterial(buffer, view, bytesOffset, result) {
  844. let byteLength = view.getUint32(bytesOffset, true)
  845. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  846. let materialBuffer = new Uint8Array(buffer, bytesOffset, byteLength)
  847. let strMaterials = getStringFromTypedArray(materialBuffer)
  848. bytesOffset += byteLength
  849. result.materials = JSON.parse(strMaterials)
  850. return bytesOffset
  851. }
  852. let colorScratch = {
  853. red: 0,
  854. green: 0,
  855. blue: 0,
  856. alpha: 0
  857. }
  858. function unpackColor(array, startingIndex, result) {
  859. result.red = array[startingIndex++]
  860. result.green = array[startingIndex++]
  861. result.blue = array[startingIndex++]
  862. result.alpha = array[startingIndex]
  863. return result
  864. }
  865. let LEFT_16 = 65536
  866. function parsePickInfo(
  867. buffer,
  868. view,
  869. bytesOffset,
  870. nOptions,
  871. geoPackage,
  872. version
  873. ) {
  874. if ((nOptions & 1) === 1) {
  875. let size = view.getUint32(bytesOffset, true)
  876. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  877. let count = view.getUint32(bytesOffset, true)
  878. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  879. for (let i = 0; i < count; i++) {
  880. let res = parseString(buffer, view, bytesOffset)
  881. let geometryName = res.string
  882. bytesOffset = res.bytesOffset
  883. let selectInfoCount = view.getUint32(bytesOffset, true)
  884. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  885. let pickInfo = {}
  886. geoPackage[geometryName].pickInfo = pickInfo
  887. let bInstanced = geoPackage[geometryName].vertexPackage.instanceIndex
  888. if (bInstanced == -1) {
  889. //非实例化信息
  890. let batchIds = new Float32Array(
  891. geoPackage[geometryName].vertexPackage.verticesCount
  892. )
  893. for (let j = 0; j < selectInfoCount; j++) {
  894. let nDictID = view.getUint32(bytesOffset, true)
  895. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  896. let nSize = view.getUint32(bytesOffset, true)
  897. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  898. let infos = []
  899. for (let k = 0; k < nSize; k++) {
  900. let vertexColorOffset = view.getUint32(bytesOffset, true)
  901. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  902. let vertexCount = view.getUint32(bytesOffset, true)
  903. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  904. batchIds.fill(j, vertexColorOffset, vertexColorOffset + vertexCount)
  905. infos.push({
  906. vertexColorOffset: vertexColorOffset,
  907. vertexColorCount: vertexCount,
  908. batchId: j
  909. })
  910. }
  911. pickInfo[nDictID] = infos
  912. }
  913. createBatchIdAttribute(
  914. geoPackage[geometryName].vertexPackage,
  915. batchIds,
  916. undefined
  917. )
  918. } else {
  919. let instanceCount = geoPackage[geometryName].vertexPackage.instanceCount
  920. let instanceArray =
  921. geoPackage[geometryName].vertexPackage.instanceBuffer
  922. let instanceMode = geoPackage[geometryName].vertexPackage.instanceMode
  923. let instanceIds = new Float32Array(instanceCount)
  924. let selectionId = []
  925. for (let j = 0; j < selectInfoCount; j++) {
  926. let nDictID = view.getUint32(bytesOffset, true)
  927. selectionId.push(nDictID)
  928. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  929. let nSize = view.getUint32(bytesOffset, true)
  930. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  931. for (let k = 0; k < nSize; k++) {
  932. let instanceId = view.getUint32(bytesOffset, true)
  933. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  934. if (version === 3) {
  935. let vertexCount = view.getUint32(bytesOffset, true)
  936. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  937. }
  938. }
  939. }
  940. let beginOffset = instanceMode === 17 ? 16 : 28
  941. beginOffset *= Float32Array.BYTES_PER_ELEMENT
  942. for (let j = 0; j < instanceCount; j++) {
  943. instanceIds[j] = j
  944. let offset =
  945. j * instanceMode * Float32Array.BYTES_PER_ELEMENT + beginOffset
  946. Cesium.Color.unpack(instanceArray, offset, colorScratch)
  947. let pickId =
  948. version === 2
  949. ? selectionId[j]
  950. : colorScratch.red +
  951. colorScratch.green * 256 +
  952. colorScratch.blue * LEFT_16
  953. if (pickInfo[pickId] === undefined) {
  954. pickInfo[pickId] = {
  955. vertexColorCount: 1,
  956. instanceIds: [],
  957. vertexColorOffset: j
  958. }
  959. }
  960. pickInfo[pickId].instanceIds.push(j)
  961. }
  962. createBatchIdAttribute(
  963. geoPackage[geometryName].vertexPackage,
  964. instanceIds,
  965. 1
  966. )
  967. }
  968. }
  969. }
  970. return bytesOffset
  971. }
  972. function createBatchIdAttribute(vertexPackage, typedArray, instanceDivisor) {
  973. let vertexAttributes = vertexPackage.vertexAttributes
  974. let attrLocation = vertexPackage.attrLocation
  975. let len = vertexAttributes.length
  976. let attrName = instanceDivisor === 1 ? 'instanceId' : 'batchId'
  977. attrLocation[attrName] = len
  978. vertexAttributes.push({
  979. index: len,
  980. typedArray: typedArray,
  981. componentsPerAttribute: 1,
  982. componentDatatype: 5126,
  983. offsetInBytes: 0,
  984. strideInBytes: 0,
  985. instanceDivisor: instanceDivisor
  986. })
  987. }
  988. S3ModelParser.parseBuffer = function(buffer) {
  989. let bytesOffset = 0
  990. let result = {
  991. version: undefined,
  992. groupNode: undefined,
  993. geoPackage: {},
  994. matrials: undefined,
  995. texturePackage: {}
  996. }
  997. let view = new DataView(buffer)
  998. result.version = view.getFloat32(bytesOffset, true)
  999. bytesOffset += Float32Array.BYTES_PER_ELEMENT
  1000. if (result.version >= 2.0) {
  1001. let unzipSize = view.getUint32(bytesOffset, true)
  1002. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  1003. }
  1004. let byteSize = view.getUint32(bytesOffset, true)
  1005. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  1006. let unzipBuffer = unZip(buffer, bytesOffset)
  1007. view = new DataView(unzipBuffer)
  1008. bytesOffset = 0
  1009. let nOptions = view.getUint32(bytesOffset, true)
  1010. bytesOffset += Uint32Array.BYTES_PER_ELEMENT
  1011. bytesOffset = parseGroupNode(unzipBuffer, view, bytesOffset, result)
  1012. bytesOffset = parseSkeleton(unzipBuffer, view, bytesOffset, result.geoPackage)
  1013. bytesOffset = parseTexturePackage(
  1014. unzipBuffer,
  1015. view,
  1016. bytesOffset,
  1017. result.texturePackage
  1018. )
  1019. bytesOffset = parseMaterial(unzipBuffer, view, bytesOffset, result)
  1020. parsePickInfo(
  1021. unzipBuffer,
  1022. view,
  1023. bytesOffset,
  1024. nOptions,
  1025. result.geoPackage,
  1026. result.version
  1027. )
  1028. return result
  1029. }
  1030. export default S3ModelParser