S3MBTilesParser.js 78 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675
  1. /**
  2. * Cesium - https://github.com/AnalyticalGraphicsInc/cesium
  3. *
  4. * Copyright 2011-2017 Cesium Contributors
  5. *
  6. * Licensed under the Apache License, Version 2.0 (the "License");
  7. * you may not use this file except in compliance with the License.
  8. * You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing, software
  13. * distributed under the License is distributed on an "AS IS" BASIS,
  14. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. * See the License for the specific language governing permissions and
  16. * limitations under the License.
  17. *
  18. * Columbus View (Pat. Pend.)
  19. *
  20. * Portions licensed separately.
  21. * See https://github.com/AnalyticalGraphicsInc/cesium/blob/master/LICENSE.md for full licensing details.
  22. */
  23. define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './buildModuleUrl-14bfe498', './IndexDatatype-9435b55f', './createTaskProcessorWorker', './BoundingRectangle-dc808c42', './Color-69f1845f', './pako_inflate-8ea163f9', './S3MCompressType-3a5e0577', './unzip-b0fc9445'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, PrimitiveType, FeatureDetection, buildModuleUrl, IndexDatatype, createTaskProcessorWorker, BoundingRectangle, Color, pako_inflate, S3MCompressType, unzip) { 'use strict';
  24. /**
  25. * Create a shallow copy of an array from begin to end.
  26. *
  27. * @param {Array} array The array to fill.
  28. * @param {Number} [begin=0] The index to start at.
  29. * @param {Number} [end=array.length] The index to end at which is not included.
  30. *
  31. * @returns {Array} The resulting array.
  32. * @private
  33. */
  34. function arraySlice(array, begin, end) {
  35. //>>includeStart('debug', pragmas.debug);
  36. Check.Check.defined('array', array);
  37. if (when.defined(begin)) {
  38. Check.Check.typeOf.number('begin', begin);
  39. }
  40. if (when.defined(end)) {
  41. Check.Check.typeOf.number('end', end);
  42. }
  43. //>>includeEnd('debug');
  44. if (typeof array.slice === 'function') {
  45. return array.slice(begin, end);
  46. }
  47. var copy = Array.prototype.slice.call(array, begin, end);
  48. var typedArrayTypes = FeatureDetection.FeatureDetection.typedArrayTypes;
  49. var length = typedArrayTypes.length;
  50. for (var i = 0; i < length; ++i) {
  51. if (array instanceof typedArrayTypes[i]) {
  52. copy = new typedArrayTypes[i](copy);
  53. break;
  54. }
  55. }
  56. return copy;
  57. }
  58. function S3MDracoDecode() {
  59. }
  60. var draco;
  61. function decodeIndexArray(dracoGeometry, dracoDecoder) {
  62. var numPoints = dracoGeometry.num_points();
  63. var numFaces = dracoGeometry.num_faces();
  64. var faceIndices = new draco.DracoInt32Array();
  65. var numIndices = numFaces * 3;
  66. var indexArray = IndexDatatype.IndexDatatype.createTypedArray(numPoints, numIndices);
  67. var offset = 0;
  68. for (var i = 0; i < numFaces; ++i) {
  69. dracoDecoder.GetFaceFromMesh(dracoGeometry, i, faceIndices);
  70. indexArray[offset + 0] = faceIndices.GetValue(0);
  71. indexArray[offset + 1] = faceIndices.GetValue(1);
  72. indexArray[offset + 2] = faceIndices.GetValue(2);
  73. offset += 3;
  74. }
  75. var indexDataType = IndexDatatype.IndexDatatype.UNSIGNED_SHORT;
  76. if (indexArray instanceof Uint32Array) {
  77. indexDataType = IndexDatatype.IndexDatatype.UNSIGNED_INT;
  78. }
  79. draco.destroy(faceIndices);
  80. return {
  81. typedArray : indexArray,
  82. numberOfIndices : numIndices,
  83. indexDataType : indexDataType
  84. };
  85. }
  86. function decodeQuantizedDracoTypedArray(dracoGeometry, dracoDecoder, dracoAttribute, quantization, vertexArrayLength) {
  87. var vertexArray;
  88. var attributeData;
  89. if (quantization.quantizationBits <= 8) {
  90. attributeData = new draco.DracoUInt8Array();
  91. vertexArray = new Uint8Array(vertexArrayLength);
  92. dracoDecoder.GetAttributeUInt8ForAllPoints(dracoGeometry, dracoAttribute, attributeData);
  93. } else {
  94. attributeData = new draco.DracoUInt16Array();
  95. vertexArray = new Uint16Array(vertexArrayLength);
  96. dracoDecoder.GetAttributeUInt16ForAllPoints(dracoGeometry, dracoAttribute, attributeData);
  97. }
  98. for (var i = 0; i < vertexArrayLength; ++i) {
  99. vertexArray[i] = attributeData.GetValue(i);
  100. }
  101. draco.destroy(attributeData);
  102. return vertexArray;
  103. }
  104. function decodeDracoTypedArray(dracoGeometry, dracoDecoder, dracoAttribute, vertexArrayLength) {
  105. var vertexArray;
  106. var attributeData;
  107. // Some attribute types are casted down to 32 bit since Draco only returns 32 bit values
  108. switch (dracoAttribute.data_type()) {
  109. case 1: case 11: // DT_INT8 or DT_BOOL
  110. attributeData = new draco.DracoInt8Array();
  111. vertexArray = new Int8Array(vertexArrayLength);
  112. dracoDecoder.GetAttributeInt8ForAllPoints(dracoGeometry, dracoAttribute, attributeData);
  113. break;
  114. case 2: // DT_UINT8
  115. attributeData = new draco.DracoUInt8Array();
  116. vertexArray = new Uint8Array(vertexArrayLength);
  117. dracoDecoder.GetAttributeUInt8ForAllPoints(dracoGeometry, dracoAttribute, attributeData);
  118. break;
  119. case 3: // DT_INT16
  120. attributeData = new draco.DracoInt16Array();
  121. vertexArray = new Int16Array(vertexArrayLength);
  122. dracoDecoder.GetAttributeInt16ForAllPoints(dracoGeometry, dracoAttribute, attributeData);
  123. break;
  124. case 4: // DT_UINT16
  125. attributeData = new draco.DracoUInt16Array();
  126. vertexArray = new Uint16Array(vertexArrayLength);
  127. dracoDecoder.GetAttributeUInt16ForAllPoints(dracoGeometry, dracoAttribute, attributeData);
  128. break;
  129. case 5: case 7: // DT_INT32 or DT_INT64
  130. attributeData = new draco.DracoInt32Array();
  131. vertexArray = new Int32Array(vertexArrayLength);
  132. dracoDecoder.GetAttributeInt32ForAllPoints(dracoGeometry, dracoAttribute, attributeData);
  133. break;
  134. case 6: case 8: // DT_UINT32 or DT_UINT64
  135. attributeData = new draco.DracoUInt32Array();
  136. vertexArray = new Uint32Array(vertexArrayLength);
  137. dracoDecoder.GetAttributeUInt32ForAllPoints(dracoGeometry, dracoAttribute, attributeData);
  138. break;
  139. case 9: case 10: // DT_FLOAT32 or DT_FLOAT64
  140. attributeData = new draco.DracoFloat32Array();
  141. vertexArray = new Float32Array(vertexArrayLength);
  142. dracoDecoder.GetAttributeFloatForAllPoints(dracoGeometry, dracoAttribute, attributeData);
  143. break;
  144. }
  145. for (var i = 0; i < vertexArrayLength; ++i) {
  146. vertexArray[i] = attributeData.GetValue(i);
  147. }
  148. draco.destroy(attributeData);
  149. return vertexArray;
  150. }
  151. function decodeAttribute(dracoGeometry, dracoDecoder, dracoAttribute) {
  152. var numPoints = dracoGeometry.num_points();
  153. var numComponents = dracoAttribute.num_components();
  154. var quantization;
  155. var transform = new draco.AttributeQuantizationTransform();
  156. if (transform.InitFromAttribute(dracoAttribute)) {
  157. var minValues = new Array(numComponents);
  158. for (var i = 0; i < numComponents; ++i) {
  159. minValues[i] = transform.min_value(i);
  160. }
  161. quantization = {
  162. quantizationBits : transform.quantization_bits(),
  163. minValues : minValues,
  164. range : transform.range(),
  165. octEncoded : false
  166. };
  167. }
  168. draco.destroy(transform);
  169. transform = new draco.AttributeOctahedronTransform();
  170. if (transform.InitFromAttribute(dracoAttribute)) {
  171. quantization = {
  172. quantizationBits : transform.quantization_bits(),
  173. octEncoded : true
  174. };
  175. }
  176. draco.destroy(transform);
  177. var vertexArrayLength = numPoints * numComponents;
  178. var vertexArray;
  179. if (when.defined(quantization)) {
  180. vertexArray = decodeQuantizedDracoTypedArray(dracoGeometry, dracoDecoder, dracoAttribute, quantization, vertexArrayLength);
  181. } else {
  182. vertexArray = decodeDracoTypedArray(dracoGeometry, dracoDecoder, dracoAttribute, vertexArrayLength);
  183. }
  184. var componentDatatype = ComponentDatatype.ComponentDatatype.fromTypedArray(vertexArray);
  185. return {
  186. array : vertexArray,
  187. data : {
  188. componentsPerAttribute : numComponents,
  189. componentDatatype : componentDatatype,
  190. byteOffset : dracoAttribute.byte_offset(),
  191. byteStride : ComponentDatatype.ComponentDatatype.getSizeInBytes(componentDatatype) * numComponents,
  192. normalized : dracoAttribute.normalized(),
  193. quantization : quantization
  194. }
  195. };
  196. }
  197. function decodeAllAttributes(dracoGeometry, dracoDecoder, vertexPackage, vertexUniqueIDs){
  198. var attributes = vertexPackage.vertexAttributes;
  199. var attrLocation = vertexPackage.attrLocation;
  200. vertexPackage.nCompressOptions = 0;
  201. if(when.defined(vertexUniqueIDs.posUniqueID) && vertexUniqueIDs.posUniqueID >= 0){
  202. vertexPackage.nCompressOptions |= S3MCompressType.VertexCompressOption.SVC_Vertex;
  203. var posAttribute = dracoDecoder.GetAttribute(dracoGeometry, vertexUniqueIDs.posUniqueID);
  204. var posAttributeData = decodeAttribute(dracoGeometry, dracoDecoder, posAttribute);
  205. var componentsPerAttribute = posAttributeData.data.componentsPerAttribute;
  206. vertexPackage.verticesCount = posAttributeData.array.length / componentsPerAttribute;
  207. vertexPackage.vertCompressConstant = posAttributeData.data.quantization.range / (1 << posAttributeData.data.quantization.quantizationBits);
  208. var minValuesArray = posAttributeData.data.quantization.minValues;
  209. vertexPackage.minVerticesValue = new Cartesian4.Cartesian4(minValuesArray[0], minValuesArray[1], minValuesArray[2], 1.0);
  210. if(componentsPerAttribute > 3){
  211. vertexPackage.minVerticesValue.w = minValuesArray[3];
  212. }
  213. attrLocation['aPosition'] = attributes.length;
  214. attributes.push({
  215. index: attrLocation['aPosition'],
  216. typedArray: posAttributeData.array,
  217. componentsPerAttribute: componentsPerAttribute,
  218. componentDatatype: posAttributeData.data.componentDatatype,
  219. offsetInBytes: posAttributeData.data.byteOffset,
  220. strideInBytes: posAttributeData.data.byteStride,
  221. normalize: posAttributeData.data.normalized
  222. });
  223. }
  224. if(when.defined(vertexUniqueIDs.normalUniqueID) && vertexUniqueIDs.normalUniqueID >= 0){
  225. vertexPackage.nCompressOptions |= S3MCompressType.VertexCompressOption.SVC_Normal;
  226. var normalAttribute = dracoDecoder.GetAttribute(dracoGeometry, vertexUniqueIDs.normalUniqueID);
  227. var normalAttributeData = decodeAttribute(dracoGeometry, dracoDecoder, normalAttribute);
  228. var normalQuantization = normalAttributeData.data.quantization;
  229. vertexPackage.normalRangeConstant = (1 << normalQuantization.quantizationBits) - 1.0;
  230. attrLocation['aNormal'] = attributes.length;
  231. attributes.push({
  232. index: attrLocation['aNormal'],
  233. typedArray: normalAttributeData.array,
  234. componentsPerAttribute: normalAttributeData.data.componentsPerAttribute,
  235. componentDatatype: normalAttributeData.data.componentDatatype,
  236. offsetInBytes: normalAttributeData.data.byteOffset,
  237. strideInBytes: normalAttributeData.data.byteStride,
  238. normalize: normalAttributeData.data.normalized
  239. });
  240. }
  241. if(when.defined(vertexUniqueIDs.colorUniqueID) && vertexUniqueIDs.colorUniqueID >= 0){
  242. vertexPackage.nCompressOptions |= S3MCompressType.VertexCompressOption.SVC_VertexColor;
  243. var colorAttribute = dracoDecoder.GetAttribute(dracoGeometry, vertexUniqueIDs.colorUniqueID);
  244. var colorAttributeData = decodeAttribute(dracoGeometry, dracoDecoder, colorAttribute);
  245. attrLocation['aColor'] = attributes.length;
  246. attributes.push({
  247. index: attrLocation['aColor'],
  248. typedArray: colorAttributeData.array,
  249. componentsPerAttribute: colorAttributeData.data.componentsPerAttribute,
  250. componentDatatype: colorAttributeData.data.componentDatatype,
  251. offsetInBytes: colorAttributeData.data.byteOffset,
  252. strideInBytes: colorAttributeData.data.byteStride,
  253. normalize: colorAttributeData.data.normalized
  254. });
  255. }
  256. for(var i = 0 ; i < vertexUniqueIDs.texCoordUniqueIDs.length; i++){
  257. vertexPackage.texCoordCompressConstant = [];
  258. vertexPackage.minTexCoordValue = [];
  259. var texCoordUniqueID = vertexUniqueIDs.texCoordUniqueIDs[i];
  260. if(texCoordUniqueID < 0){
  261. continue;
  262. }
  263. var texCoordAttribute = dracoDecoder.GetAttribute(dracoGeometry, texCoordUniqueID);
  264. var texAttributeData = decodeAttribute(dracoGeometry, dracoDecoder, texCoordAttribute);
  265. if(when.defined(texAttributeData.data.quantization)){
  266. vertexPackage.nCompressOptions |= S3MCompressType.VertexCompressOption.SVC_TexutreCoord;
  267. vertexPackage.texCoordCompressConstant.push(texAttributeData.data.quantization.range / (1 << texAttributeData.data.quantization.quantizationBits));
  268. var minValuesArray = texAttributeData.data.quantization.minValues;
  269. vertexPackage.minTexCoordValue.push(new Cartesian2.Cartesian2(minValuesArray[0], minValuesArray[1]));
  270. }
  271. var attName = 'aTexCoord' + i;
  272. attrLocation[attName] = attributes.length;
  273. attributes.push({
  274. index: attrLocation[attName],
  275. typedArray: texAttributeData.array,
  276. componentsPerAttribute: texAttributeData.data.componentsPerAttribute,
  277. componentDatatype: texAttributeData.data.componentDatatype,
  278. offsetInBytes: texAttributeData.data.byteOffset,
  279. strideInBytes: texAttributeData.data.byteStride,
  280. normalize: texAttributeData.data.normalized
  281. });
  282. }
  283. }
  284. S3MDracoDecode.dracoDecodePointCloud = function(dracoLib, dataBuffer, byteLength, vertexPackage, vertexUniqueIDs){
  285. draco = dracoLib;
  286. var dracoDecoder = new draco.Decoder();
  287. // Skip all parameter types except generic
  288. var attributesToSkip = ['POSITION', 'NORMAL', 'COLOR'];
  289. for (var i = 0; i < attributesToSkip.length; ++i) {
  290. dracoDecoder.SkipAttributeTransform(draco[attributesToSkip[i]]);
  291. }
  292. var buffer = new draco.DecoderBuffer();
  293. buffer.Init(dataBuffer, byteLength);
  294. var geometryType = dracoDecoder.GetEncodedGeometryType(buffer);
  295. if (geometryType !== draco.POINT_CLOUD) {
  296. throw new RuntimeError.RuntimeError('Draco geometry type must be POINT_CLOUD.');
  297. }
  298. var dracoPointCloud = new draco.PointCloud();
  299. var decodingStatus = dracoDecoder.DecodeBufferToPointCloud(buffer, dracoPointCloud);
  300. if (!decodingStatus.ok() || dracoPointCloud.ptr === 0) {
  301. throw new RuntimeError.RuntimeError('Error decoding draco point cloud: ' + decodingStatus.error_msg());
  302. }
  303. draco.destroy(buffer);
  304. decodeAllAttributes(dracoPointCloud, dracoDecoder, vertexPackage, vertexUniqueIDs);
  305. draco.destroy(dracoPointCloud);
  306. draco.destroy(dracoDecoder);
  307. };
  308. S3MDracoDecode.dracoDecodeMesh = function(dracoLib, dataBuffer, byteLength, vertexPackage, indexPackage, vertexUniqueIDs){
  309. draco = dracoLib;
  310. var dracoDecoder = new draco.Decoder();
  311. // Skip all parameter types except generic
  312. var attributesToSkip = ['POSITION', 'NORMAL', 'COLOR', 'TEX_COORD'];
  313. for (var i = 0; i < attributesToSkip.length; ++i) {
  314. dracoDecoder.SkipAttributeTransform(draco[attributesToSkip[i]]);
  315. }
  316. var buffer = new draco.DecoderBuffer();
  317. buffer.Init(dataBuffer, byteLength);
  318. var geometryType = dracoDecoder.GetEncodedGeometryType(buffer);
  319. if (geometryType !== draco.TRIANGULAR_MESH) {
  320. throw new RuntimeError.RuntimeError('Unsupported draco mesh geometry type.');
  321. }
  322. var dracoGeometry = new draco.Mesh();
  323. var decodingStatus = dracoDecoder.DecodeBufferToMesh(buffer, dracoGeometry);
  324. if (!decodingStatus.ok() || dracoGeometry.ptr === 0) {
  325. throw new RuntimeError.RuntimeError('Error decoding draco mesh geometry: ' + decodingStatus.error_msg());
  326. }
  327. draco.destroy(buffer);
  328. decodeAllAttributes(dracoGeometry, dracoDecoder, vertexPackage, vertexUniqueIDs);
  329. var indexArray = decodeIndexArray(dracoGeometry, dracoDecoder);
  330. indexPackage.indicesTypedArray = indexArray.typedArray;
  331. indexPackage.indicesCount = indexArray.numberOfIndices;
  332. indexPackage.indexType = indexArray.indexDataType;
  333. indexPackage.primitiveType = PrimitiveType.PrimitiveType.TRIANGLES;
  334. draco.destroy(dracoGeometry);
  335. draco.destroy(dracoDecoder);
  336. };
  337. var VERSION = {
  338. S3M : 49,
  339. S3M4 : 1
  340. };
  341. var S3MVersion = Object.freeze(VERSION);
  342. var S3MBVertexOptions = {
  343. SVO_HasInstSelInfo: 1
  344. };
  345. var S3MBVertexTag = {
  346. SV_Unkown: 0,
  347. SV_Standard: 1,
  348. SV_Compressed: 2,
  349. SV_DracoCompressed: 3
  350. };
  351. var dracoLib;
  352. var colorScratch = new Color.Color();
  353. var CLAMP_GROUND_LINE_PASS_NAME = "ClampGroundAndObjectLinePass";
  354. var unzipwasmReady = false;
  355. if (when.defined(unzip.unzip)) {
  356. unzip.unzip.onRuntimeInitialized = function () {
  357. unzipwasmReady = true;
  358. };
  359. var unzipwasm = unzip.unzip.cwrap('unzip', 'number', ['number', 'number', 'number', 'number']);
  360. var freec = unzip.unzip.cwrap('freePointer', null, ['number']);
  361. }
  362. function loadStream(dataView, dataBuffer, byteOffset) {
  363. var newByteOffset = byteOffset;
  364. var streamSize = dataView.getUint32(newByteOffset, true);
  365. newByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  366. var bufferByteOffset = newByteOffset;
  367. var buffer = new Uint8Array(dataBuffer, newByteOffset, streamSize);
  368. newByteOffset += streamSize * Uint8Array.BYTES_PER_ELEMENT;
  369. return {
  370. dataViewByteOffset: bufferByteOffset,
  371. byteOffset: newByteOffset,
  372. buffer: buffer
  373. };
  374. }
  375. function loadString(dataView, viewByteOffset, typedArray, bufferByteOffset) {
  376. var stringLength = dataView.getUint32(bufferByteOffset + viewByteOffset, true);
  377. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  378. var stringBuffer = typedArray.subarray(bufferByteOffset, bufferByteOffset + stringLength);
  379. var strResult = S3MCompressType.getStringFromTypedArray(stringBuffer);
  380. bufferByteOffset += stringLength;
  381. return {
  382. string: strResult,
  383. bytesOffset: bufferByteOffset
  384. }
  385. }
  386. function loadTexCoord(view, typedArray, bufferByteOffset, viewByteOffset, vertexPackage, isOldVersion) {
  387. var newBytesOffset = bufferByteOffset;
  388. var nTexCount = view.getUint16(bufferByteOffset + viewByteOffset, true);
  389. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  390. if (!isOldVersion) {
  391. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  392. }
  393. for (var i = 0; i < nTexCount; i++) {
  394. var nTexCoordCount = view.getUint32(newBytesOffset + viewByteOffset, true);
  395. newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  396. var nDimension = view.getUint16(newBytesOffset + viewByteOffset, true);
  397. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  398. var nTexCoordStride = view.getUint16(newBytesOffset + viewByteOffset, true);
  399. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  400. if (nDimension == 20 || nDimension == 35) ;
  401. else {
  402. var byteLength = nTexCoordCount * nDimension * Float32Array.BYTES_PER_ELEMENT;
  403. var texCoordBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
  404. newBytesOffset += byteLength;
  405. var str = 'aTexCoord' + i;
  406. var attributes = vertexPackage.vertexAttributes;
  407. var attrLocation = vertexPackage.attrLocation;
  408. attrLocation[str] = attributes.length;
  409. attributes.push({
  410. index: attrLocation[str],
  411. typedArray: texCoordBuffer,
  412. componentsPerAttribute: nDimension,
  413. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  414. offsetInBytes: 0,
  415. strideInBytes: nDimension * Float32Array.BYTES_PER_ELEMENT,
  416. normalize: false
  417. });
  418. }
  419. }
  420. return {
  421. bytesOffset: newBytesOffset
  422. };
  423. }
  424. function loadCompressTexCoord(view, typedArray, bufferByteOffset, viewByteOffset, vertexPackage) {
  425. vertexPackage.texCoordCompressConstant = [];
  426. vertexPackage.minTexCoordValue = [];
  427. var newBytesOffset = bufferByteOffset;
  428. var nTexCount = view.getUint16(bufferByteOffset + viewByteOffset, true);
  429. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  430. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  431. var texIndex = 0;
  432. for (var i = 0; i < nTexCount; i++) {
  433. var bNeedTexCoordZ = view.getUint8(newBytesOffset + viewByteOffset, true);
  434. newBytesOffset += Uint8Array.BYTES_PER_ELEMENT;
  435. newBytesOffset += Uint8Array.BYTES_PER_ELEMENT * 3;
  436. var nTexCoordCount = view.getUint32(newBytesOffset + viewByteOffset, true);
  437. newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  438. var nDimension = view.getUint16(newBytesOffset + viewByteOffset, true);
  439. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  440. var nTexCoordStride = view.getUint16(newBytesOffset + viewByteOffset, true);
  441. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  442. var texCoordCompressConstant = view.getFloat32(newBytesOffset + viewByteOffset, true);
  443. newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
  444. vertexPackage.texCoordCompressConstant.push(texCoordCompressConstant);
  445. var minTexCoordValue = new Cartesian4.Cartesian4();
  446. minTexCoordValue.x = view.getFloat32(newBytesOffset + viewByteOffset, true);
  447. newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
  448. minTexCoordValue.y = view.getFloat32(newBytesOffset + viewByteOffset, true);
  449. newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
  450. minTexCoordValue.z = view.getFloat32(newBytesOffset + viewByteOffset, true);
  451. newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
  452. minTexCoordValue.w = view.getFloat32(newBytesOffset + viewByteOffset, true);
  453. newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
  454. vertexPackage.minTexCoordValue.push(minTexCoordValue);
  455. var byteLength = nTexCoordCount * nDimension * Int16Array.BYTES_PER_ELEMENT;
  456. var texCoordBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
  457. newBytesOffset += byteLength;
  458. var align = newBytesOffset % 4;
  459. if (align !== 0) {
  460. newBytesOffset += (4 - align);
  461. }
  462. var str = 'aTexCoord' + texIndex;
  463. var attributes = vertexPackage.vertexAttributes;
  464. var attrLocation = vertexPackage.attrLocation;
  465. attrLocation[str] = attributes.length;
  466. attributes.push({
  467. index: attrLocation[str],
  468. typedArray: texCoordBuffer,
  469. componentsPerAttribute: nDimension,
  470. componentDatatype: ComponentDatatype.ComponentDatatype.SHORT,
  471. offsetInBytes: 0,
  472. strideInBytes: nDimension * Int16Array.BYTES_PER_ELEMENT,
  473. normalize: false
  474. });
  475. if (bNeedTexCoordZ) {
  476. byteLength = nTexCoordCount * Float32Array.BYTES_PER_ELEMENT;
  477. var texCoordZBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
  478. newBytesOffset += byteLength;
  479. vertexPackage.texCoordZMatrix = true;
  480. str = 'aTexCoordZ' + texIndex;
  481. attrLocation[str] = attributes.length;
  482. attributes.push({
  483. index: attrLocation[str],
  484. typedArray: texCoordZBuffer,
  485. componentsPerAttribute: 1,
  486. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  487. offsetInBytes: 0,
  488. strideInBytes: Float32Array.BYTES_PER_ELEMENT,
  489. normalize: false
  490. });
  491. }
  492. texIndex++;
  493. }
  494. return {
  495. bytesOffset: newBytesOffset
  496. };
  497. }
  498. function loadInstanceInfo(view, typedArray, bufferByteOffset, viewByteOffset, vertexPackage) {
  499. var newBytesOffset = bufferByteOffset;
  500. var nInstanceInfo = view.getUint16(newBytesOffset + viewByteOffset, true);
  501. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  502. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  503. var attributes = vertexPackage.vertexAttributes;
  504. var attrLocation = vertexPackage.attrLocation;
  505. for (var iIndex = 0; iIndex < nInstanceInfo; iIndex++) {
  506. var nTexCoordCount = view.getUint32(newBytesOffset + viewByteOffset, true);
  507. newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  508. var nTexDimensions = view.getUint16(newBytesOffset + viewByteOffset, true);
  509. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  510. var nTexCoordStride = view.getUint16(newBytesOffset + viewByteOffset, true);
  511. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  512. var byteLength = nTexCoordCount * nTexDimensions * Float32Array.BYTES_PER_ELEMENT;
  513. if (nTexDimensions === 17 || nTexDimensions === 29) {
  514. var instanceBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
  515. vertexPackage.instanceCount = nTexCoordCount;
  516. vertexPackage.instanceMode = nTexDimensions;
  517. vertexPackage.instanceBuffer = instanceBuffer;
  518. vertexPackage.instanceIndex = 1;
  519. var byteStride;
  520. if (nTexDimensions === 17) {
  521. byteStride = Float32Array.BYTES_PER_ELEMENT * 17;
  522. attrLocation['uv2'] = attributes.length;
  523. attributes.push({
  524. index: attrLocation['uv2'],
  525. componentsPerAttribute: 4,
  526. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  527. normalize: false,
  528. offsetInBytes: 0,
  529. strideInBytes: byteStride,
  530. instanceDivisor: 1
  531. });
  532. attrLocation['uv3'] = attributes.length;
  533. attributes.push({
  534. index: attrLocation['uv3'],
  535. componentsPerAttribute: 4,
  536. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  537. normalize: false,
  538. offsetInBytes: 4 * Float32Array.BYTES_PER_ELEMENT,
  539. strideInBytes: byteStride,
  540. instanceDivisor: 1
  541. });
  542. attrLocation['uv4'] = attributes.length;
  543. attributes.push({
  544. index: attrLocation['uv4'],
  545. componentsPerAttribute: 4,
  546. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  547. normalize: false,
  548. offsetInBytes: 8 * Float32Array.BYTES_PER_ELEMENT,
  549. strideInBytes: byteStride,
  550. instanceDivisor: 1
  551. });
  552. attrLocation['secondary_colour'] = attributes.length;
  553. attributes.push({
  554. index: attrLocation['secondary_colour'],
  555. componentsPerAttribute: 4,
  556. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  557. normalize: false,
  558. offsetInBytes: 12 * Float32Array.BYTES_PER_ELEMENT,
  559. strideInBytes: byteStride,
  560. instanceDivisor: 1
  561. });
  562. attrLocation['uv6'] = attributes.length;
  563. attributes.push({
  564. index: attrLocation['uv6'],
  565. componentsPerAttribute: 4,
  566. componentDatatype: ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
  567. normalize: true,
  568. offsetInBytes: 16 * Float32Array.BYTES_PER_ELEMENT,
  569. strideInBytes: byteStride,
  570. instanceDivisor: 1
  571. });
  572. }
  573. else if (nTexDimensions === 29) {
  574. byteStride = Float32Array.BYTES_PER_ELEMENT * 29;
  575. attrLocation['uv1'] = attributes.length;
  576. attributes.push({
  577. index: attrLocation['uv1'],
  578. componentsPerAttribute: 4,
  579. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  580. normalize: false,
  581. offsetInBytes: 0,
  582. strideInBytes: byteStride,
  583. instanceDivisor: 1,
  584. byteLength: byteLength
  585. });
  586. attrLocation['uv2'] = attributes.length;
  587. attributes.push({
  588. index: attrLocation['uv2'],
  589. componentsPerAttribute: 4,
  590. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  591. normalize: false,
  592. offsetInBytes: 4 * Float32Array.BYTES_PER_ELEMENT,
  593. strideInBytes: byteStride,
  594. instanceDivisor: 1
  595. });
  596. attrLocation['uv3'] = attributes.length;
  597. attributes.push({
  598. index: attrLocation['uv3'],
  599. componentsPerAttribute: 4,
  600. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  601. normalize: false,
  602. offsetInBytes: 8 * Float32Array.BYTES_PER_ELEMENT,
  603. strideInBytes: byteStride,
  604. instanceDivisor: 1
  605. });
  606. attrLocation['uv4'] = attributes.length;
  607. attributes.push({
  608. index: attrLocation['uv4'],
  609. componentsPerAttribute: 4,
  610. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  611. normalize: false,
  612. offsetInBytes: 12 * Float32Array.BYTES_PER_ELEMENT,
  613. strideInBytes: byteStride,
  614. instanceDivisor: 1
  615. });
  616. attrLocation['uv5'] = attributes.length;
  617. attributes.push({
  618. index: attrLocation['uv5'],
  619. componentsPerAttribute: 4,
  620. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  621. normalize: false,
  622. offsetInBytes: 16 * Float32Array.BYTES_PER_ELEMENT,
  623. strideInBytes: byteStride,
  624. instanceDivisor: 1
  625. });
  626. attrLocation['uv6'] = attributes.length;
  627. attributes.push({
  628. index: attrLocation['uv6'],
  629. componentsPerAttribute: 4,
  630. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  631. normalize: false,
  632. offsetInBytes: 20 * Float32Array.BYTES_PER_ELEMENT,
  633. strideInBytes: byteStride,
  634. instanceDivisor: 1
  635. });
  636. attrLocation['uv7'] = attributes.length;
  637. attributes.push({
  638. index: attrLocation['uv7'],
  639. componentsPerAttribute: 3,
  640. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  641. normalize: false,
  642. offsetInBytes: 24 * Float32Array.BYTES_PER_ELEMENT,
  643. strideInBytes: byteStride,
  644. instanceDivisor: 1
  645. });
  646. attrLocation['secondary_colour'] = attributes.length;
  647. attributes.push({
  648. index: attrLocation['secondary_colour'],
  649. componentsPerAttribute: 4,
  650. componentDatatype: ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
  651. normalize: true,
  652. offsetInBytes: 27 * Float32Array.BYTES_PER_ELEMENT,
  653. strideInBytes: byteStride,
  654. instanceDivisor: 1
  655. });
  656. attrLocation['uv9'] = attributes.length;
  657. attributes.push({
  658. index: attrLocation['uv9'],
  659. componentsPerAttribute: 4,
  660. componentDatatype: ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
  661. normalize: true,
  662. offsetInBytes: 28 * Float32Array.BYTES_PER_ELEMENT,
  663. strideInBytes: byteStride,
  664. instanceDivisor: 1
  665. });
  666. }
  667. }
  668. else {
  669. var valueCount = nTexCoordCount * nTexDimensions;
  670. vertexPackage.instanceBounds = new Float32Array(valueCount);
  671. for (var k = 0; k < valueCount; k++) {
  672. vertexPackage.instanceBounds[k] = view.getFloat32(newBytesOffset + viewByteOffset + k * Float32Array.BYTES_PER_ELEMENT, true);
  673. }
  674. }
  675. newBytesOffset += byteLength;
  676. }
  677. return {
  678. bytesOffset: newBytesOffset
  679. };
  680. }
  681. function loadVertex(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage) {
  682. var newBytesOffset = bufferByteOffset;
  683. var nVerticesCount = view.getUint32(newBytesOffset + viewByteOffset, true);
  684. vertexPackage.verticesCount = nVerticesCount;
  685. newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  686. if (nVerticesCount <= 0) {
  687. return {
  688. bytesOffset: newBytesOffset
  689. };
  690. }
  691. var nVertexDimension = view.getUint16(newBytesOffset + viewByteOffset, true);
  692. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  693. var nVertexStride = view.getUint16(newBytesOffset + viewByteOffset, true);
  694. nVertexStride = nVertexDimension * Float32Array.BYTES_PER_ELEMENT;
  695. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  696. var byteLength = nVerticesCount * nVertexDimension * Float32Array.BYTES_PER_ELEMENT;
  697. var vertexBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
  698. newBytesOffset += byteLength;
  699. var attributes = vertexPackage.vertexAttributes;
  700. var attrLocation = vertexPackage.attrLocation;
  701. attrLocation['aPosition'] = attributes.length;
  702. attributes.push({
  703. index: attrLocation['aPosition'],
  704. typedArray: vertexBuffer,
  705. componentsPerAttribute: nVertexDimension,
  706. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  707. offsetInBytes: 0,
  708. strideInBytes: nVertexStride,
  709. normalize: false
  710. });
  711. return {
  712. bytesOffset: newBytesOffset
  713. }
  714. }
  715. function loadCompressVertex(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage) {
  716. var newBytesOffset = bufferByteOffset;
  717. var nVerticesCount = view.getUint32(newBytesOffset + viewByteOffset, true);
  718. vertexPackage.verticesCount = nVerticesCount;
  719. newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  720. if (nVerticesCount <= 0) {
  721. return {
  722. bytesOffset: newBytesOffset
  723. };
  724. }
  725. var nVertexDimension = view.getUint16(newBytesOffset + viewByteOffset, true);
  726. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  727. var nVertexStride = view.getUint16(newBytesOffset + viewByteOffset, true);
  728. nVertexStride = nVertexDimension * Int16Array.BYTES_PER_ELEMENT;
  729. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  730. var fVertCompressConstant = view.getFloat32(newBytesOffset + viewByteOffset, true);
  731. newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
  732. var minVerticesValue = new Cartesian4.Cartesian4();
  733. minVerticesValue.x = view.getFloat32(newBytesOffset + viewByteOffset, true);
  734. newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
  735. minVerticesValue.y = view.getFloat32(newBytesOffset + viewByteOffset, true);
  736. newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
  737. minVerticesValue.z = view.getFloat32(newBytesOffset + viewByteOffset, true);
  738. newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
  739. minVerticesValue.w = view.getFloat32(newBytesOffset + viewByteOffset, true);
  740. newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
  741. vertexPackage.vertCompressConstant = fVertCompressConstant;
  742. vertexPackage.minVerticesValue = minVerticesValue;
  743. var byteLength = nVerticesCount * nVertexDimension * Int16Array.BYTES_PER_ELEMENT;
  744. var vertexBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
  745. newBytesOffset += byteLength;
  746. var attributes = vertexPackage.vertexAttributes;
  747. var attrLocation = vertexPackage.attrLocation;
  748. attrLocation['aPosition'] = attributes.length;
  749. attributes.push({
  750. index: attrLocation['aPosition'],
  751. typedArray: vertexBuffer,
  752. componentsPerAttribute: nVertexDimension,
  753. componentDatatype: ComponentDatatype.ComponentDatatype.SHORT,
  754. offsetInBytes: 0,
  755. strideInBytes: nVertexStride,
  756. normalize: false
  757. });
  758. return {
  759. bytesOffset: newBytesOffset
  760. }
  761. }
  762. function loadNormal(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage) {
  763. var newBytesOffset = bufferByteOffset;
  764. var nNormalCount = view.getUint32(newBytesOffset + viewByteOffset, true);
  765. newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  766. if (nNormalCount <= 0) {
  767. return {
  768. bytesOffset: newBytesOffset
  769. };
  770. }
  771. var nNormalDimension = view.getUint16(newBytesOffset + viewByteOffset, true);
  772. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  773. var nNormalStride = view.getUint16(newBytesOffset + viewByteOffset, true);
  774. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  775. var byteLength = nNormalCount * nNormalDimension * Float32Array.BYTES_PER_ELEMENT;
  776. var normalBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
  777. newBytesOffset += byteLength;
  778. if (!vertexPackage.ignoreNormal) {
  779. var attributes = vertexPackage.vertexAttributes;
  780. var attrLocation = vertexPackage.attrLocation;
  781. attrLocation['aNormal'] = attributes.length;
  782. attributes.push({
  783. index: attrLocation['aNormal'],
  784. typedArray: normalBuffer,
  785. componentsPerAttribute: nNormalDimension,
  786. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  787. offsetInBytes: 0,
  788. strideInBytes: nNormalStride,
  789. normalize: false
  790. });
  791. }
  792. return {
  793. bytesOffset: newBytesOffset
  794. }
  795. }
  796. function loadCompressNormal(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage) {
  797. var newBytesOffset = bufferByteOffset;
  798. var nNormalCount = view.getUint32(newBytesOffset + viewByteOffset, true);
  799. newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  800. if (nNormalCount <= 0) {
  801. return {
  802. bytesOffset: newBytesOffset
  803. };
  804. }
  805. var nNormalDimension = view.getUint16(newBytesOffset + viewByteOffset, true);
  806. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  807. var nNormalStride = view.getUint16(newBytesOffset + viewByteOffset, true);
  808. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  809. var byteLength = nNormalCount * 2 * Int16Array.BYTES_PER_ELEMENT;
  810. var normalBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
  811. newBytesOffset += byteLength;
  812. if (!vertexPackage.ignoreNormal) {
  813. var attributes = vertexPackage.vertexAttributes;
  814. var attrLocation = vertexPackage.attrLocation;
  815. attrLocation['aNormal'] = attributes.length;
  816. attributes.push({
  817. index: attrLocation['aNormal'],
  818. typedArray: normalBuffer,
  819. componentsPerAttribute: 2,
  820. componentDatatype: ComponentDatatype.ComponentDatatype.SHORT,
  821. offsetInBytes: 0,
  822. strideInBytes: nNormalStride,
  823. normalize: false
  824. });
  825. }
  826. return {
  827. bytesOffset: newBytesOffset
  828. }
  829. }
  830. function loadVertexColor(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage) {
  831. var newBytesOffset = bufferByteOffset;
  832. var nColorCount = view.getUint32(newBytesOffset + viewByteOffset, true);
  833. newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  834. var verticesCount = vertexPackage.verticesCount;
  835. var vertexColor;
  836. if (nColorCount > 0) {
  837. var colorStride = view.getUint16(newBytesOffset + viewByteOffset, true);
  838. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  839. newBytesOffset += Uint8Array.BYTES_PER_ELEMENT * 2;
  840. var byteLength = nColorCount * Uint8Array.BYTES_PER_ELEMENT * 4;
  841. vertexColor = typedArray.slice(newBytesOffset, newBytesOffset + byteLength);
  842. newBytesOffset += byteLength;
  843. var attributes = vertexPackage.vertexAttributes;
  844. var attrLocation = vertexPackage.attrLocation;
  845. attrLocation['aColor'] = attributes.length;
  846. attributes.push({
  847. index: attrLocation['aColor'],
  848. typedArray: vertexColor,
  849. componentsPerAttribute: 4,
  850. componentDatatype: ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
  851. offsetInBytes: 0,
  852. strideInBytes: 4,
  853. normalize: true
  854. });
  855. }
  856. return {
  857. bytesOffset: newBytesOffset
  858. };
  859. }
  860. function loadSecondColor(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage) {
  861. var newBytesOffset = bufferByteOffset;
  862. var nSecondColorCount = view.getUint32(newBytesOffset + viewByteOffset, true);
  863. newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  864. if (nSecondColorCount <= 0) {
  865. return {
  866. bytesOffset: newBytesOffset
  867. };
  868. }
  869. var secondColorStride = view.getUint16(newBytesOffset + viewByteOffset, true);
  870. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  871. newBytesOffset += Uint8Array.BYTES_PER_ELEMENT * 2;
  872. var byteLength = nSecondColorCount * Uint8Array.BYTES_PER_ELEMENT * 4;
  873. newBytesOffset += byteLength;
  874. return {
  875. bytesOffset: newBytesOffset
  876. };
  877. }
  878. function loadIndexPackage(typedArray, view, viewByteOffset, bufferByteOffset) {
  879. var newBytesOffset = bufferByteOffset;
  880. var arrIndexPackage = [];
  881. var nIndexPackageCount = view.getUint32(newBytesOffset + viewByteOffset, true);
  882. newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  883. for (var k = 0; k < nIndexPackageCount; k++) {
  884. var indexPackage = {};
  885. var nIndexCount = view.getUint32(newBytesOffset + viewByteOffset, true);
  886. newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  887. var enIndexType = view.getUint8(newBytesOffset + viewByteOffset, true);
  888. newBytesOffset += Uint8Array.BYTES_PER_ELEMENT;
  889. var bUseIndex = view.getUint8(newBytesOffset + viewByteOffset, true);
  890. newBytesOffset += Uint8Array.BYTES_PER_ELEMENT;
  891. var operationType = view.getUint8(newBytesOffset + viewByteOffset, true);
  892. newBytesOffset += Uint8Array.BYTES_PER_ELEMENT;
  893. newBytesOffset += Uint8Array.BYTES_PER_ELEMENT;
  894. if (nIndexCount > 0) {
  895. var byteLength = 0;
  896. var indexBuffer = null;
  897. if (enIndexType === 1 || enIndexType === 3) {
  898. byteLength = nIndexCount * Uint32Array.BYTES_PER_ELEMENT;
  899. indexBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
  900. }
  901. else {
  902. byteLength = nIndexCount * Uint16Array.BYTES_PER_ELEMENT;
  903. indexBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
  904. if (nIndexCount % 2 != 0) {
  905. byteLength += 2;
  906. }
  907. }
  908. indexPackage.indicesTypedArray = indexBuffer;
  909. newBytesOffset += byteLength;
  910. }
  911. indexPackage.indicesCount = nIndexCount;
  912. indexPackage.indexType = enIndexType;
  913. indexPackage.primitiveType = operationType;
  914. var arrPassName = [];
  915. var nPassNameCount = view.getUint32(newBytesOffset + viewByteOffset, true);
  916. newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  917. for (var passIndex = 0; passIndex < nPassNameCount; passIndex++) {
  918. var res = loadString(view, viewByteOffset, typedArray, newBytesOffset);
  919. var strPassName = res.string;
  920. newBytesOffset = res.bytesOffset;
  921. arrPassName.push(strPassName);
  922. indexPackage.materialCode = strPassName;
  923. }
  924. arrIndexPackage.push(indexPackage);
  925. var align = newBytesOffset % 4;
  926. if (align !== 0) {
  927. var nReserved = 4 - newBytesOffset % 4;
  928. newBytesOffset += nReserved;
  929. }
  930. }
  931. return {
  932. bytesOffset: newBytesOffset,
  933. arrIndexPackage: arrIndexPackage
  934. };
  935. }
  936. function loadCompressSkeleton(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage, isOldVersion) {
  937. var newBytesOffset = bufferByteOffset;
  938. var nCompressOptions = view.getUint32(newBytesOffset + viewByteOffset, true);
  939. vertexPackage.nCompressOptions = nCompressOptions;
  940. var result;
  941. newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  942. if ((nCompressOptions & S3MCompressType.VertexCompressOption.SVC_Vertex) == S3MCompressType.VertexCompressOption.SVC_Vertex) {
  943. result = loadCompressVertex(typedArray, view, viewByteOffset, newBytesOffset, vertexPackage);
  944. newBytesOffset = result.bytesOffset;
  945. }
  946. else {
  947. result = loadVertex(typedArray, view, viewByteOffset, newBytesOffset, vertexPackage);
  948. newBytesOffset = result.bytesOffset;
  949. }
  950. if ((nCompressOptions & S3MCompressType.VertexCompressOption.SVC_Normal) == S3MCompressType.VertexCompressOption.SVC_Normal) {
  951. result = loadCompressNormal(typedArray, view, viewByteOffset, newBytesOffset, vertexPackage);
  952. newBytesOffset = result.bytesOffset;
  953. }
  954. else {
  955. result = loadNormal(typedArray, view, viewByteOffset, newBytesOffset, vertexPackage);
  956. newBytesOffset = result.bytesOffset;
  957. }
  958. result = loadVertexColor(typedArray, view, viewByteOffset, newBytesOffset, vertexPackage);
  959. newBytesOffset = result.bytesOffset;
  960. result = loadSecondColor(typedArray, view, viewByteOffset, newBytesOffset);
  961. newBytesOffset = result.bytesOffset;
  962. if ((nCompressOptions & S3MCompressType.VertexCompressOption.SVC_TexutreCoord) == S3MCompressType.VertexCompressOption.SVC_TexutreCoord) {
  963. result = loadCompressTexCoord(view, typedArray, newBytesOffset, viewByteOffset, vertexPackage);
  964. newBytesOffset = result.bytesOffset;
  965. }
  966. else {
  967. result = loadTexCoord(view, typedArray, newBytesOffset, viewByteOffset, vertexPackage, isOldVersion);
  968. newBytesOffset = result.bytesOffset;
  969. }
  970. if ((nCompressOptions & S3MCompressType.VertexCompressOption.SVC_TexutreCoordIsW) == S3MCompressType.VertexCompressOption.SVC_TexutreCoordIsW) {
  971. vertexPackage.textureCoordIsW = true;
  972. }
  973. result = loadInstanceInfo(view, typedArray, newBytesOffset, viewByteOffset, vertexPackage);
  974. newBytesOffset = result.bytesOffset;
  975. return {
  976. bytesOffset: newBytesOffset
  977. }
  978. }
  979. function loadStandardSkeleton(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage, isOldVersion) {
  980. var newBytesOffset = bufferByteOffset;
  981. var result;
  982. result = loadVertex(typedArray, view, viewByteOffset, newBytesOffset, vertexPackage);
  983. newBytesOffset = result.bytesOffset;
  984. result = loadNormal(typedArray, view, viewByteOffset, newBytesOffset, vertexPackage);
  985. newBytesOffset = result.bytesOffset;
  986. result = loadVertexColor(typedArray, view, viewByteOffset, newBytesOffset, vertexPackage);
  987. newBytesOffset = result.bytesOffset;
  988. result = loadSecondColor(typedArray, view, viewByteOffset, newBytesOffset);
  989. newBytesOffset = result.bytesOffset;
  990. result = loadTexCoord(view, typedArray, newBytesOffset, viewByteOffset, vertexPackage, isOldVersion);
  991. newBytesOffset = result.bytesOffset;
  992. result = loadInstanceInfo(view, typedArray, newBytesOffset, viewByteOffset, vertexPackage);
  993. newBytesOffset = result.bytesOffset;
  994. return {
  995. bytesOffset: newBytesOffset
  996. }
  997. }
  998. function isClampGroundLinePass(arrIndexPackage) {
  999. if (arrIndexPackage.length === 0) {
  1000. return false;
  1001. }
  1002. return arrIndexPackage[0].materialCode === CLAMP_GROUND_LINE_PASS_NAME;
  1003. }
  1004. function loadSkeletonEntities(skeletonBuffer, view, viewByteOffset, needCreateEdge, geoPackage, isOldVersion) {
  1005. var typedArray = skeletonBuffer;
  1006. var bufferByteOffset = 0;
  1007. var nCount = view.getUint32(bufferByteOffset + viewByteOffset, true);
  1008. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1009. for (var i = 0; i < nCount; i++) {
  1010. // S3MB头名字长度
  1011. var result = loadString(view, viewByteOffset, typedArray, bufferByteOffset);
  1012. var strGeometryName = result.string;
  1013. bufferByteOffset = result.bytesOffset;
  1014. var align = bufferByteOffset % 4;
  1015. if (align !== 0) {
  1016. bufferByteOffset += (4 - align);
  1017. }
  1018. var nTagValue = S3MBVertexTag.SV_Unkown;
  1019. nTagValue = view.getUint32(bufferByteOffset + viewByteOffset, true);
  1020. bufferByteOffset += Int32Array.BYTES_PER_ELEMENT;
  1021. var vertexPackage = {};
  1022. vertexPackage.vertexAttributes = [];
  1023. vertexPackage.attrLocation = {};
  1024. vertexPackage.instanceCount = 0;
  1025. vertexPackage.instanceMode = 0;
  1026. vertexPackage.instanceIndex = -1;
  1027. vertexPackage.ignoreNormal = geoPackage.ignoreNormal;
  1028. if (nTagValue == S3MBVertexTag.SV_DracoCompressed) {
  1029. var vertexUniqueIDs = {};
  1030. vertexUniqueIDs.posUniqueID = view.getInt32(bufferByteOffset + viewByteOffset, true);
  1031. bufferByteOffset += Int32Array.BYTES_PER_ELEMENT;
  1032. vertexUniqueIDs.normalUniqueID = view.getInt32(bufferByteOffset + viewByteOffset, true);
  1033. bufferByteOffset += Int32Array.BYTES_PER_ELEMENT;
  1034. vertexUniqueIDs.colorUniqueID = view.getInt32(bufferByteOffset + viewByteOffset, true);
  1035. bufferByteOffset += Int32Array.BYTES_PER_ELEMENT;
  1036. vertexUniqueIDs.secondColorUniqueID = view.getInt32(bufferByteOffset + viewByteOffset, true);
  1037. bufferByteOffset += Int32Array.BYTES_PER_ELEMENT;
  1038. var nTextureCoord = view.getUint16(bufferByteOffset + viewByteOffset, true);
  1039. bufferByteOffset += Int16Array.BYTES_PER_ELEMENT;
  1040. var texCoordUniqueIDs = [];
  1041. for (var nTexCoordIdx = 0; nTexCoordIdx < nTextureCoord; nTexCoordIdx++) {
  1042. var nTexCoordUniqueID = view.getInt32(bufferByteOffset + viewByteOffset, true);
  1043. texCoordUniqueIDs.push(nTexCoordUniqueID);
  1044. bufferByteOffset += Int32Array.BYTES_PER_ELEMENT;
  1045. }
  1046. vertexUniqueIDs.texCoordUniqueIDs = texCoordUniqueIDs;
  1047. var nIndexPackageCount = view.getInt32(bufferByteOffset + viewByteOffset, true);
  1048. bufferByteOffset += Int32Array.BYTES_PER_ELEMENT;
  1049. var arrIndexPackage = [];
  1050. // 目前只支持单索引
  1051. var indexPackage = {};
  1052. if (nIndexPackageCount > 0) {
  1053. var res = loadString(view, viewByteOffset, typedArray, bufferByteOffset);
  1054. var strPassName = res.string;
  1055. bufferByteOffset = res.bytesOffset;
  1056. indexPackage.materialCode = strPassName;
  1057. arrIndexPackage.push(indexPackage);
  1058. }
  1059. var nDracoBufferSize = view.getUint32(bufferByteOffset + viewByteOffset, true);
  1060. bufferByteOffset += Int32Array.BYTES_PER_ELEMENT;
  1061. var dataBuffer = arraySlice(typedArray, bufferByteOffset, bufferByteOffset + nDracoBufferSize);
  1062. if (nIndexPackageCount > 0) {
  1063. S3MDracoDecode.dracoDecodeMesh(dracoLib, dataBuffer, nDracoBufferSize, vertexPackage, indexPackage, vertexUniqueIDs);
  1064. }
  1065. else {
  1066. S3MDracoDecode.dracoDecodePointCloud(dracoLib, dataBuffer, nDracoBufferSize, vertexPackage, vertexUniqueIDs);
  1067. }
  1068. bufferByteOffset += nDracoBufferSize;
  1069. geoPackage[strGeometryName] = {
  1070. vertexPackage: vertexPackage,
  1071. arrIndexPackage: arrIndexPackage
  1072. };
  1073. }
  1074. else {
  1075. if (nTagValue == S3MBVertexTag.SV_Standard) {
  1076. result = loadStandardSkeleton(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage, isOldVersion);
  1077. bufferByteOffset = result.bytesOffset;
  1078. }
  1079. else if (nTagValue == S3MBVertexTag.SV_Compressed) {
  1080. result = loadCompressSkeleton(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage, isOldVersion);
  1081. bufferByteOffset = result.bytesOffset;
  1082. }
  1083. result = loadIndexPackage(typedArray, view, viewByteOffset, bufferByteOffset);
  1084. var arrIndexPackage = result.arrIndexPackage;
  1085. if (isClampGroundLinePass(arrIndexPackage)) {
  1086. vertexPackage.clampRegionEdge = true;
  1087. }
  1088. var edgeGeometry;
  1089. if (needCreateEdge) {
  1090. edgeGeometry = S3MCompressType.S3MVertexPackage.createEdge(vertexPackage, arrIndexPackage);
  1091. }
  1092. bufferByteOffset = result.bytesOffset;
  1093. geoPackage[strGeometryName] = {
  1094. vertexPackage: vertexPackage,
  1095. arrIndexPackage: arrIndexPackage,
  1096. edgeGeometry: edgeGeometry
  1097. };
  1098. }
  1099. }
  1100. }
  1101. function loadGeodeEntities(shellBuffer, view, bufferByteOffset, dataViewByteOffset) {
  1102. var geode = {};
  1103. var skeletonNames = [];
  1104. var geoMatrix = new BoundingSphere.Matrix4();
  1105. var typedArray = shellBuffer;
  1106. for (var matIndex = 0; matIndex < 16; matIndex++) {
  1107. geoMatrix[matIndex] = view.getFloat64(bufferByteOffset + dataViewByteOffset, true);
  1108. bufferByteOffset += Float64Array.BYTES_PER_ELEMENT;
  1109. }
  1110. geode.matrix = geoMatrix;
  1111. geode.skeletonNames = skeletonNames;
  1112. var nSkeletonCount = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1113. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1114. for (var i = 0; i < nSkeletonCount; i++) {
  1115. var res = loadString(view, dataViewByteOffset, typedArray, bufferByteOffset);
  1116. var strSkeletonName = res.string;
  1117. bufferByteOffset = res.bytesOffset;
  1118. skeletonNames.push(strSkeletonName);
  1119. }
  1120. return {
  1121. byteOffset: bufferByteOffset,
  1122. geode: geode
  1123. }
  1124. }
  1125. function removeUnusedStringTileName(oldTileName) {
  1126. var index = oldTileName.indexOf('Geometry');
  1127. if (index === -1) {
  1128. return oldTileName;
  1129. }
  1130. var ignoreString = oldTileName.substring(index, oldTileName.length);
  1131. return oldTileName.replace(ignoreString, '');
  1132. }
  1133. function loadPageLODEntities(shellBuffer, view, bufferByteOffset, dataViewByteOffset) {
  1134. var pageLOD = {};
  1135. var dbDis = view.getFloat32(bufferByteOffset + dataViewByteOffset, true);
  1136. bufferByteOffset += Float32Array.BYTES_PER_ELEMENT;
  1137. var uRangeMode = view.getUint16(bufferByteOffset + dataViewByteOffset, true);
  1138. bufferByteOffset += Uint16Array.BYTES_PER_ELEMENT;
  1139. pageLOD.rangeMode = uRangeMode;
  1140. pageLOD.rangeList = dbDis;
  1141. var boundingSphereCenter = new Cartographic.Cartesian3();
  1142. boundingSphereCenter.x = view.getFloat64(bufferByteOffset + dataViewByteOffset, true);
  1143. bufferByteOffset += Float64Array.BYTES_PER_ELEMENT;
  1144. boundingSphereCenter.y = view.getFloat64(bufferByteOffset + dataViewByteOffset, true);
  1145. bufferByteOffset += Float64Array.BYTES_PER_ELEMENT;
  1146. boundingSphereCenter.z = view.getFloat64(bufferByteOffset + dataViewByteOffset, true);
  1147. bufferByteOffset += Float64Array.BYTES_PER_ELEMENT;
  1148. var radius = view.getFloat64(bufferByteOffset + dataViewByteOffset, true);
  1149. bufferByteOffset += Float64Array.BYTES_PER_ELEMENT;
  1150. pageLOD.boundingSphere = new BoundingSphere.BoundingSphere(boundingSphereCenter, radius);
  1151. var typedArray = shellBuffer;
  1152. var res = loadString(view, dataViewByteOffset, typedArray, bufferByteOffset);
  1153. var strChildTile = res.string;
  1154. bufferByteOffset = res.bytesOffset;
  1155. strChildTile = strChildTile.replace(/(\.s3mbz)|(\.s3mb)/gi, '');
  1156. strChildTile = removeUnusedStringTileName(strChildTile);
  1157. pageLOD.childTile = strChildTile;
  1158. pageLOD.geodes = [];
  1159. var nGeodeCount = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1160. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1161. for (var i = 0; i < nGeodeCount; i++) {
  1162. var res = loadGeodeEntities(shellBuffer, view, bufferByteOffset, dataViewByteOffset);
  1163. bufferByteOffset = res.byteOffset;
  1164. pageLOD.geodes.push(res.geode);
  1165. }
  1166. return {
  1167. pageLOD: pageLOD,
  1168. bytesOffset: bufferByteOffset
  1169. }
  1170. }
  1171. function loadShellEntites(shellBuffer, view, dataViewByteOffset) {
  1172. var bufferByteOffset = 0;
  1173. var groupNode = {};
  1174. var pageLods = [];
  1175. var nCount = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1176. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1177. for (var i = 0; i < nCount; i++) {
  1178. var res = loadPageLODEntities(shellBuffer, view, bufferByteOffset, dataViewByteOffset);
  1179. bufferByteOffset = res.bytesOffset;
  1180. pageLods.push(res.pageLOD);
  1181. }
  1182. groupNode.pageLods = pageLods;
  1183. return groupNode;
  1184. }
  1185. function loadTextureEntities(supportCompressType, textureDataBuffer, dataView, dataViewByteOffset, texturePackage, transferableObjects) {
  1186. var bufferByteOffset = 0;
  1187. var nTextureCount = dataView.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1188. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1189. for (var i = 0; i < nTextureCount; i++) {
  1190. var res = loadString(dataView, dataViewByteOffset, textureDataBuffer, bufferByteOffset);
  1191. var strTextureName = res.string;
  1192. bufferByteOffset = res.bytesOffset;
  1193. var align = bufferByteOffset % 4;
  1194. if (align !== 0) {
  1195. bufferByteOffset += (4 - align);
  1196. }
  1197. var nLevel = dataView.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1198. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1199. var width = dataView.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1200. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1201. var height = dataView.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1202. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1203. var compressType = dataView.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1204. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1205. var nSize = dataView.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1206. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1207. var pixelFormat = dataView.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1208. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1209. var textureData = textureDataBuffer.subarray(bufferByteOffset, bufferByteOffset + nSize);
  1210. bufferByteOffset += nSize;
  1211. var imageTypedArray = null;
  1212. if (compressType === S3MCompressType.S3MCompressType.enrS3TCDXTN && supportCompressType != 1) {
  1213. S3MCompressType.DXTTextureDecode.decode(imageTypedArray, width, height, textureData, pixelFormat);
  1214. if (pixelFormat > S3MCompressType.S3MPixelFormat.BGR || pixelFormat === S3MCompressType.S3MPixelFormat.LUMINANCE_ALPHA) {
  1215. imageTypedArray = new Uint8Array(width * height * 4);
  1216. }
  1217. else {
  1218. imageTypedArray = new Uint16Array(width * height);
  1219. }
  1220. S3MCompressType.DXTTextureDecode.decode(imageTypedArray, width, height, textureData, pixelFormat);
  1221. transferableObjects.push(imageTypedArray.buffer);
  1222. compressType = 0;
  1223. }
  1224. else {
  1225. imageTypedArray = textureData;
  1226. }
  1227. texturePackage[strTextureName] = {
  1228. id: strTextureName,
  1229. width: width,
  1230. height: height,
  1231. compressType: compressType,
  1232. nFormat: pixelFormat,
  1233. imageBuffer: imageTypedArray
  1234. };
  1235. }
  1236. }
  1237. function createBatchIdAttribute(vertexPackage, typedArray, instanceDivisor) {
  1238. var vertexAttributes = vertexPackage.vertexAttributes;
  1239. var attrLocation = vertexPackage.attrLocation;
  1240. var len = vertexAttributes.length;
  1241. var attrName = instanceDivisor === 1 ? 'instanceId' : 'batchId';
  1242. attrLocation[attrName] = len;
  1243. vertexAttributes.push({
  1244. index: len,
  1245. typedArray: typedArray,
  1246. componentsPerAttribute: 1,
  1247. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  1248. offsetInBytes: 0,
  1249. strideInBytes: 0,
  1250. instanceDivisor: instanceDivisor
  1251. });
  1252. }
  1253. var LEFT_16 = 65536;
  1254. function loadSelectionInfo(selectionInfoBuffer, view, dataViewByteOffset, geoPackage) {
  1255. var bufferByteOffset = 0;
  1256. var typedArray = selectionInfoBuffer;
  1257. var nGeometryCount = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1258. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1259. for (var i = 0; i < nGeometryCount; i++) {
  1260. // S3MB头名字长度
  1261. var result = loadString(view, dataViewByteOffset, typedArray, bufferByteOffset);
  1262. var strGeometryName = result.string;
  1263. bufferByteOffset = result.bytesOffset;
  1264. var nSelectInfoCount = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1265. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1266. var pickInfo = {};
  1267. geoPackage[strGeometryName].pickInfo = pickInfo;
  1268. // 非实例化的选择信息
  1269. var bInstanced = geoPackage[strGeometryName].vertexPackage.instanceIndex;
  1270. if (bInstanced == -1) {
  1271. var batchIds = new Float32Array(geoPackage[strGeometryName].vertexPackage.verticesCount);
  1272. for (var j = 0; j < nSelectInfoCount; j++) {
  1273. var nDictID = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1274. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1275. var nSize = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1276. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1277. var vertexCount = 0, vertexColorOffset = 0;
  1278. pickInfo[nDictID] = {
  1279. batchId: j
  1280. };
  1281. for (var k = 0; k < nSize; k++) {
  1282. vertexColorOffset = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1283. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1284. vertexCount = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1285. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1286. batchIds.fill(j, vertexColorOffset, vertexColorOffset + vertexCount);
  1287. }
  1288. pickInfo[nDictID].vertexColorOffset = vertexColorOffset;
  1289. pickInfo[nDictID].vertexCount = vertexCount;
  1290. }
  1291. createBatchIdAttribute(geoPackage[strGeometryName].vertexPackage, batchIds, undefined);
  1292. }
  1293. else {
  1294. var instanceCount = geoPackage[strGeometryName].vertexPackage.instanceCount;
  1295. var instanceArray = geoPackage[strGeometryName].vertexPackage.instanceBuffer;
  1296. var instanceMode = geoPackage[strGeometryName].vertexPackage.instanceMode;
  1297. var instanceIds = new Float32Array(instanceCount);
  1298. for (var j = 0; j < nSelectInfoCount; j++) {
  1299. var nDictID = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1300. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1301. var nSize = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1302. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1303. for (var k = 0; k < nSize; k++) {
  1304. var instanceId = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1305. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1306. }
  1307. }
  1308. var beginOffset = instanceMode === 17 ? 16 : 28;
  1309. beginOffset *= Float32Array.BYTES_PER_ELEMENT;
  1310. for (j = 0; j < instanceCount; j++) {
  1311. instanceIds[j] = j;
  1312. var offset = j * instanceMode * Float32Array.BYTES_PER_ELEMENT + beginOffset;
  1313. Color.Color.unpack(instanceArray, offset, colorScratch);
  1314. var pickId = colorScratch.red + colorScratch.green * 256 + colorScratch.blue * LEFT_16;
  1315. if (pickInfo[pickId] === undefined) {
  1316. pickInfo[pickId] = {
  1317. vertexColorCount: 1,
  1318. instanceIds: [],
  1319. vertexColorOffset: j
  1320. };
  1321. }
  1322. pickInfo[pickId].instanceIds.push(j);
  1323. }
  1324. createBatchIdAttribute(geoPackage[strGeometryName].vertexPackage, instanceIds, 1);
  1325. }
  1326. }
  1327. }
  1328. function OGDCIS0(x) {
  1329. return (((x) < 1e-10) && ((x) > -1e-10));
  1330. }
  1331. function unzipWithwasm(datazip, unzipSize) {
  1332. var unzipsize = unzipSize || datazip.length * 4;//unzipSize;//
  1333. var offset = unzip.unzip._malloc(Uint8Array.BYTES_PER_ELEMENT * unzipsize); //开辟内存
  1334. var tar = new Uint8Array(unzipsize);
  1335. unzip.unzip.HEAPU8.set(tar, offset / Uint8Array.BYTES_PER_ELEMENT);
  1336. var offset1 = unzip.unzip._malloc(Uint8Array.BYTES_PER_ELEMENT * datazip.length);
  1337. unzip.unzip.HEAPU8.set(datazip, offset1 / Uint8Array.BYTES_PER_ELEMENT);
  1338. var resultLen;
  1339. while ((resultLen = unzipwasm(offset, unzipsize, offset1, datazip.length)) == 0) {
  1340. freec(offset); //释放内存
  1341. unzipsize *= 4;
  1342. offset = unzip.unzip._malloc(Uint8Array.BYTES_PER_ELEMENT * unzipsize);
  1343. tar = new Uint8Array(unzipsize);
  1344. unzip.unzip.HEAPU8.set(tar, offset / Uint8Array.BYTES_PER_ELEMENT);
  1345. }
  1346. var res = new Uint8Array(unzip.unzip.HEAPU8.buffer, offset, resultLen);
  1347. datazip = null;
  1348. tar = null;
  1349. var buffer = new Uint8Array(res).buffer;
  1350. freec(offset);
  1351. freec(offset1);
  1352. return buffer;
  1353. }
  1354. function parseS3MB(parameters, transferableObjects) {
  1355. var buffer = parameters.buffer;
  1356. var bZip = parameters.isS3MZ;
  1357. var fileType = parameters.fileType;
  1358. var createEdge = parameters.createEdge;
  1359. var supportCompressType = parameters.supportCompressType;
  1360. var bytesOffset = 0;
  1361. var geoPackage = {};
  1362. geoPackage.ignoreNormal = parameters.ignoreNormal;
  1363. var view = new DataView(buffer);
  1364. var version = view.getFloat32(bytesOffset, true);
  1365. bytesOffset += Float32Array.BYTES_PER_ELEMENT;
  1366. var isOldVersion = false;
  1367. var unzipSize;
  1368. if (version === 2) {
  1369. unzipSize = view.getUint32(bytesOffset, true);
  1370. bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  1371. }
  1372. if (OGDCIS0(version - 1) || OGDCIS0(version - 2)) {
  1373. //总字节大小
  1374. var byteSize = view.getUint32(bytesOffset, true);
  1375. bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  1376. var datazip = new Uint8Array(buffer, bytesOffset, byteSize);
  1377. if (unzipwasmReady === true) {
  1378. buffer = unzipWithwasm(datazip, unzipSize);
  1379. } else {
  1380. buffer = pako_inflate.pako.inflate(datazip).buffer;
  1381. }
  1382. transferableObjects.push(buffer);
  1383. view = new DataView(buffer);
  1384. bytesOffset = 0;
  1385. }
  1386. // 不zip压缩的解析性能,测试用
  1387. else if (version > 1.199 && version < 1.201) {
  1388. var byteSize = view.getUint32(bytesOffset, true);
  1389. bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  1390. transferableObjects.push(buffer);
  1391. }
  1392. else {
  1393. //老版本的s3mb缓存,解析方式跟UGC保持一致
  1394. isOldVersion = true;
  1395. bytesOffset = 0;
  1396. var byteSize = view.getInt32(bytesOffset, true);
  1397. bytesOffset += Int32Array.BYTES_PER_ELEMENT;
  1398. bytesOffset += Uint8Array.BYTES_PER_ELEMENT * byteSize;
  1399. if (bZip) {
  1400. var zipSize = view.getUint32(bytesOffset, true);
  1401. bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  1402. var dataZip = new Uint8Array(buffer, bytesOffset);
  1403. buffer = pako_inflate.pako.inflate(dataZip).buffer;
  1404. transferableObjects.push(buffer);
  1405. view = new DataView(buffer);
  1406. bytesOffset = 0;
  1407. }
  1408. }
  1409. var nOptions = view.getUint32(bytesOffset, true);
  1410. bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  1411. // load Shell
  1412. var loadStreamResult = loadStream(view, buffer, bytesOffset);
  1413. var shellBuffer = loadStreamResult.buffer;
  1414. bytesOffset = loadStreamResult.byteOffset;
  1415. var groupNode = loadShellEntites(shellBuffer, view, loadStreamResult.dataViewByteOffset);
  1416. var align = bytesOffset % 4;
  1417. if (align !== 0) {
  1418. bytesOffset += (4 - align);
  1419. }
  1420. // load skeleton
  1421. loadStreamResult = loadStream(view, buffer, bytesOffset);
  1422. var skeletonBuffer = loadStreamResult.buffer;
  1423. loadSkeletonEntities(skeletonBuffer, view, loadStreamResult.dataViewByteOffset, createEdge, geoPackage, isOldVersion);
  1424. bytesOffset = loadStreamResult.byteOffset;
  1425. // load secondColor
  1426. loadStreamResult = loadStream(view, buffer, bytesOffset);
  1427. var secondColorBuffer = loadStreamResult.buffer;
  1428. bytesOffset = loadStreamResult.byteOffset;
  1429. // load textureData
  1430. loadStreamResult = loadStream(view, buffer, bytesOffset);
  1431. var textureDataBuffer = loadStreamResult.buffer;
  1432. var texturePackage = {};
  1433. loadTextureEntities(supportCompressType, textureDataBuffer, view, loadStreamResult.dataViewByteOffset, texturePackage, transferableObjects);
  1434. bytesOffset = loadStreamResult.byteOffset;
  1435. var strJsonMaterialsLength = view.getUint32(bytesOffset, true);
  1436. bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  1437. var typedArray = new Uint8Array(buffer);
  1438. var materialBuffer = typedArray.subarray(bytesOffset, bytesOffset + strJsonMaterialsLength);
  1439. var strJsonMaterials = S3MCompressType.getStringFromTypedArray(materialBuffer);
  1440. bytesOffset += strJsonMaterialsLength;
  1441. var matrialObj = JSON.parse(strJsonMaterials);
  1442. var bHasSelectionInfo = (nOptions & S3MBVertexOptions.SVO_HasInstSelInfo) == S3MBVertexOptions.SVO_HasInstSelInfo;
  1443. if (bHasSelectionInfo) {
  1444. loadStreamResult = loadStream(view, buffer, bytesOffset);
  1445. var selectionInfoBuffer = loadStreamResult.buffer;
  1446. loadSelectionInfo(selectionInfoBuffer, view, loadStreamResult.dataViewByteOffset, geoPackage);
  1447. }
  1448. var pagelodList = groupNode.pageLods;
  1449. var isLeafNode = true;
  1450. for (var i = 0; i < pagelodList.length; i++) {
  1451. var pagelodNode = pagelodList[i];
  1452. isLeafNode = pagelodNode.childTile === '';
  1453. var geodeList = pagelodNode.geodes;
  1454. for (var m = 0; m < geodeList.length; m++) {
  1455. var geodeNode = geodeList[m];
  1456. var skeletonNames = geodeNode.skeletonNames;
  1457. for (var n = 0; n < skeletonNames.length; n++) {
  1458. var geoName = skeletonNames[n];
  1459. if (isLeafNode) {
  1460. var geo = geoPackage[geoName];
  1461. var vertexPackage = geo.vertexPackage;
  1462. vertexPackage.boundingSphere = S3MCompressType.S3MVertexPackage.calcBoundingSphereInWorker(fileType, vertexPackage);
  1463. }
  1464. }
  1465. }
  1466. }
  1467. return {
  1468. result: true,
  1469. groupNode: groupNode,
  1470. geoPackage: geoPackage,
  1471. matrials: matrialObj,
  1472. texturePackage: texturePackage,
  1473. version: S3MVersion.S3M4
  1474. };
  1475. }
  1476. function initWorker(dracoModule) {
  1477. dracoLib = dracoModule;
  1478. self.onmessage = createTaskProcessorWorker(parseS3MB);
  1479. self.postMessage(true);
  1480. }
  1481. function S3MBTilesParser(event) {
  1482. var data = event.data;
  1483. // Expect the first message to be to load a web assembly module
  1484. var wasmConfig = data.webAssemblyConfig;
  1485. if (when.defined(wasmConfig)) {
  1486. if (FeatureDetection.FeatureDetection.isInternetExplorer()) {
  1487. return require([buildModuleUrl.buildModuleUrl('ThirdParty/Workers/ie-webworker-promise-polyfill.js')], function (e) {
  1488. self.Promise = e;
  1489. return require([wasmConfig.modulePath], function (dracoModule) {
  1490. if (when.defined(wasmConfig.wasmBinaryFile)) {
  1491. if (!when.defined(dracoModule)) {
  1492. dracoModule = self.DracoDecoderModule;
  1493. }
  1494. dracoModule(wasmConfig).then(function (compiledModule) {
  1495. initWorker(compiledModule);
  1496. });
  1497. } else {
  1498. initWorker(dracoModule());
  1499. }
  1500. });
  1501. });
  1502. }
  1503. // Require and compile WebAssembly module, or use fallback if not supported
  1504. return require([wasmConfig.modulePath], function (dracoModule) {
  1505. if (when.defined(wasmConfig.wasmBinaryFile)) {
  1506. if (!when.defined(dracoModule)) {
  1507. dracoModule = self.DracoDecoderModule;
  1508. }
  1509. dracoModule(wasmConfig).then(function (compiledModule) {
  1510. initWorker(compiledModule);
  1511. });
  1512. } else {
  1513. initWorker(dracoModule());
  1514. }
  1515. });
  1516. }
  1517. }
  1518. //export default createTaskProcessorWorker(S3MBTilesParser);
  1519. return S3MBTilesParser;
  1520. });