S3MBTilesParser.js 107 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342
  1. /**
  2. * Cesium - https://github.com/CesiumGS/cesium
  3. *
  4. * Copyright 2011-2020 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/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
  22. */
  23. define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian4-5af5bb24', './createTaskProcessorWorker', './arrayFill-9766fb2e', './Cartesian2-85064f09', './BoundingSphere-8f8a682c', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './buildModuleUrl-e7952659', './IndexDatatype-9435b55f', './BoundingRectangle-dc808c42', './Color-69f1845f', './pako_inflate-8ea163f9', './S3MCompressType-8d63b515', './unzip-b0fc9445', './PixelFormat-e6d821ed'], function (when, Check, _Math, Cartographic, Cartesian4, createTaskProcessorWorker, arrayFill, Cartesian2, BoundingSphere, RuntimeError, WebGLConstants, ComponentDatatype, PrimitiveType, FeatureDetection, buildModuleUrl, IndexDatatype, BoundingRectangle, Color, pako_inflate, S3MCompressType, unzip, PixelFormat) { '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 CRN_FORMAT = {
  343. cCRNFmtInvalid: -1,
  344. cCRNFmtDXT1: 0,
  345. // cCRNFmtDXT3 is not currently supported when writing to CRN - only DDS.
  346. cCRNFmtDXT3: 1,
  347. cCRNFmtDXT5: 2
  348. // Crunch supports more formats than this, but we can't use them here.
  349. };
  350. // Mapping of Crunch formats to DXT formats.
  351. var DXT_FORMAT_MAP = {};
  352. DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT1] = PixelFormat.PixelFormat.RGB_DXT1;
  353. DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT3] = PixelFormat.PixelFormat.RGBA_DXT3;
  354. DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT5] = PixelFormat.PixelFormat.RGBA_DXT5;
  355. var dst;
  356. var dxtData;
  357. var cachedDstSize = 0;
  358. var crunch;
  359. var crunchInitialized = false;
  360. // Copy an array of bytes into or out of the emscripten heap.
  361. function arrayBufferCopy(src, dst, dstByteOffset, numBytes) {
  362. var i;
  363. var dst32Offset = dstByteOffset / 4;
  364. var tail = (numBytes % 4);
  365. var src32 = new Uint32Array(src.buffer, 0, (numBytes - tail) / 4);
  366. var dst32 = new Uint32Array(dst.buffer);
  367. for (i = 0; i < src32.length; i++) {
  368. dst32[dst32Offset + i] = src32[i];
  369. }
  370. for (i = numBytes - tail; i < numBytes; i++) {
  371. dst[dstByteOffset + i] = src[i];
  372. }
  373. }
  374. /**
  375. * @private
  376. */
  377. function convertCRNToDXT(parameters, transferableObjects) {
  378. // Copy the contents of the arrayBuffer into emscriptens heap.
  379. var arrayBuffer = parameters.data;
  380. var srcSize = arrayBuffer.byteLength;
  381. var bytes = new Uint8Array(arrayBuffer);
  382. var src = crunch._malloc(srcSize);
  383. arrayBufferCopy(bytes, crunch.HEAPU8, src, srcSize);
  384. // Determine what type of compressed data the file contains.
  385. var crnFormat = crunch._crn_get_dxt_format(src, srcSize);
  386. var format = DXT_FORMAT_MAP[crnFormat];
  387. if (!when.defined(format)) {
  388. throw new RuntimeError.RuntimeError('Unsupported compressed format.');
  389. }
  390. // Gather basic metrics about the DXT data.
  391. var levels = crunch._crn_get_levels(src, srcSize);
  392. var width = crunch._crn_get_width(src, srcSize);
  393. var height = crunch._crn_get_height(src, srcSize);
  394. // Determine the size of the decoded DXT data.
  395. var dstSize = 0;
  396. var i;
  397. for (i = 0; i < levels; ++i) {
  398. dstSize += PixelFormat.PixelFormat.compressedTextureSizeInBytes(format, width >> i, height >> i);
  399. }
  400. // Allocate enough space on the emscripten heap to hold the decoded DXT data
  401. // or reuse the existing allocation if a previous call to this function has
  402. // already acquired a large enough buffer.
  403. if(cachedDstSize < dstSize) {
  404. if(when.defined(dst)) {
  405. crunch._free(dst);
  406. }
  407. dst = crunch._malloc(dstSize);
  408. dxtData = new Uint8Array(crunch.HEAPU8.buffer, dst, dstSize);
  409. cachedDstSize = dstSize;
  410. }
  411. // Decompress the DXT data from the Crunch file into the allocated space.
  412. crunch._crn_decompress(src, srcSize, dst, dstSize, 0, levels);
  413. // Release the crunch file data from the emscripten heap.
  414. crunch._free(src);
  415. var bOutMipMapData = when.defaultValue(parameters.bMipMap, false);
  416. if(bOutMipMapData){
  417. var dXTDataMipMap = dxtData.slice(0, dstSize);
  418. transferableObjects.push(dXTDataMipMap.buffer);
  419. return new PixelFormat.CompressedTextureBuffer(format, width, height, dXTDataMipMap);
  420. }
  421. else {
  422. // Mipmaps are unsupported, so copy the level 0 texture
  423. // When mipmaps are supported, a copy will still be necessary as dxtData is a view on the heap.
  424. var length = PixelFormat.PixelFormat.compressedTextureSizeInBytes(format, width, height);
  425. // Get a copy of the 0th mip level. dxtData will exceed length when there are more mip levels.
  426. // Equivalent to dxtData.slice(0, length), which is not supported in IE11
  427. var level0DXTDataView = dxtData.subarray(0, length);
  428. var level0DXTData = new Uint8Array(length);
  429. level0DXTData.set(level0DXTDataView, 0);
  430. transferableObjects.push(level0DXTData.buffer);
  431. return new PixelFormat.CompressedTextureBuffer(format, width, height, level0DXTData);
  432. }
  433. }
  434. var S3MBVertexOptions = {
  435. SVO_HasInstSelInfo: 1
  436. };
  437. var S3MBVertexTag = {
  438. SV_Unkown: 0,
  439. SV_Standard: 1,
  440. SV_Compressed: 2,
  441. SV_DracoCompressed: 3
  442. };
  443. var dracoLib;
  444. var colorScratch = new Color.Color();
  445. var CLAMP_GROUND_LINE_PASS_NAME = "ClampGroundAndObjectLinePass";
  446. var unzipwasmReady = false;
  447. if (when.defined(unzip.unzip)) {
  448. unzip.unzip.onRuntimeInitialized = function () {
  449. unzipwasmReady = true;
  450. };
  451. var unzipwasm = unzip.unzip.cwrap('unzip', 'number', ['number', 'number', 'number', 'number']);
  452. var freec = unzip.unzip.cwrap('freePointer', null, ['number']);
  453. }
  454. function Bound3D(left,bottom,right,top,minHeight,maxHeight){
  455. this.left = left;
  456. this.bottom = bottom;
  457. this.right = right;
  458. this.top = top;
  459. this.minHeight = minHeight;
  460. this.maxHeight = maxHeight;
  461. this.width = right-left;
  462. this.length = top - bottom;
  463. this.height = maxHeight - minHeight;
  464. }
  465. function loadStream(dataView, dataBuffer, byteOffset) {
  466. var newByteOffset = byteOffset;
  467. var streamSize = dataView.getUint32(newByteOffset, true);
  468. newByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  469. var bufferByteOffset = newByteOffset;
  470. var buffer = new Uint8Array(dataBuffer, newByteOffset, streamSize);
  471. newByteOffset += streamSize * Uint8Array.BYTES_PER_ELEMENT;
  472. return {
  473. dataViewByteOffset: bufferByteOffset,
  474. byteOffset: newByteOffset,
  475. buffer: buffer
  476. };
  477. }
  478. function loadString(dataView, viewByteOffset, typedArray, bufferByteOffset) {
  479. var stringLength = dataView.getUint32(bufferByteOffset + viewByteOffset, true);
  480. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  481. var stringBuffer = typedArray.subarray(bufferByteOffset, bufferByteOffset + stringLength);
  482. var strResult = S3MCompressType.getStringFromTypedArray(stringBuffer);
  483. bufferByteOffset += stringLength;
  484. return {
  485. string: strResult,
  486. bytesOffset: bufferByteOffset
  487. }
  488. }
  489. function loadTexCoord(view, typedArray, bufferByteOffset, viewByteOffset, vertexPackage, isOldVersion) {
  490. var newBytesOffset = bufferByteOffset;
  491. var nTexCount = view.getUint16(bufferByteOffset + viewByteOffset, true);
  492. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  493. if (!isOldVersion) {
  494. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  495. }
  496. for (var i = 0; i < nTexCount; i++) {
  497. var nTexCoordCount = view.getUint32(newBytesOffset + viewByteOffset, true);
  498. newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  499. var nDimension = view.getUint16(newBytesOffset + viewByteOffset, true);
  500. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  501. var nTexCoordStride = view.getUint16(newBytesOffset + viewByteOffset, true);
  502. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  503. if (nDimension == 20 || nDimension == 35) ;
  504. else {
  505. var byteLength = nTexCoordCount * nDimension * Float32Array.BYTES_PER_ELEMENT;
  506. var texCoordBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
  507. newBytesOffset += byteLength;
  508. var str = 'aTexCoord' + i;
  509. var attributes = vertexPackage.vertexAttributes;
  510. var attrLocation = vertexPackage.attrLocation;
  511. attrLocation[str] = attributes.length;
  512. attributes.push({
  513. index: attrLocation[str],
  514. typedArray: texCoordBuffer,
  515. componentsPerAttribute: nDimension,
  516. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  517. offsetInBytes: 0,
  518. strideInBytes: nDimension * Float32Array.BYTES_PER_ELEMENT,
  519. normalize: false
  520. });
  521. }
  522. }
  523. return {
  524. bytesOffset: newBytesOffset
  525. };
  526. }
  527. function loadCompressTexCoord(view, typedArray, bufferByteOffset, viewByteOffset, vertexPackage) {
  528. vertexPackage.texCoordCompressConstant = [];
  529. vertexPackage.minTexCoordValue = [];
  530. var newBytesOffset = bufferByteOffset;
  531. var nTexCount = view.getUint16(bufferByteOffset + viewByteOffset, true);
  532. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  533. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  534. var texIndex = 0;
  535. for (var i = 0; i < nTexCount; i++) {
  536. var bNeedTexCoordZ = view.getUint8(newBytesOffset + viewByteOffset, true);
  537. newBytesOffset += Uint8Array.BYTES_PER_ELEMENT;
  538. newBytesOffset += Uint8Array.BYTES_PER_ELEMENT * 3;
  539. var nTexCoordCount = view.getUint32(newBytesOffset + viewByteOffset, true);
  540. newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  541. var nDimension = view.getUint16(newBytesOffset + viewByteOffset, true);
  542. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  543. var nTexCoordStride = view.getUint16(newBytesOffset + viewByteOffset, true);
  544. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  545. var texCoordCompressConstant = view.getFloat32(newBytesOffset + viewByteOffset, true);
  546. newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
  547. vertexPackage.texCoordCompressConstant.push(texCoordCompressConstant);
  548. var minTexCoordValue = new Cartesian4.Cartesian4();
  549. minTexCoordValue.x = view.getFloat32(newBytesOffset + viewByteOffset, true);
  550. newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
  551. minTexCoordValue.y = view.getFloat32(newBytesOffset + viewByteOffset, true);
  552. newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
  553. minTexCoordValue.z = view.getFloat32(newBytesOffset + viewByteOffset, true);
  554. newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
  555. minTexCoordValue.w = view.getFloat32(newBytesOffset + viewByteOffset, true);
  556. newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
  557. vertexPackage.minTexCoordValue.push(minTexCoordValue);
  558. var byteLength = nTexCoordCount * nDimension * Int16Array.BYTES_PER_ELEMENT;
  559. var texCoordBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
  560. newBytesOffset += byteLength;
  561. var align = newBytesOffset % 4;
  562. if (align !== 0) {
  563. newBytesOffset += (4 - align);
  564. }
  565. var str = 'aTexCoord' + texIndex;
  566. var attributes = vertexPackage.vertexAttributes;
  567. var attrLocation = vertexPackage.attrLocation;
  568. attrLocation[str] = attributes.length;
  569. attributes.push({
  570. index: attrLocation[str],
  571. typedArray: texCoordBuffer,
  572. componentsPerAttribute: nDimension,
  573. componentDatatype: ComponentDatatype.ComponentDatatype.SHORT,
  574. offsetInBytes: 0,
  575. strideInBytes: nDimension * Int16Array.BYTES_PER_ELEMENT,
  576. normalize: false
  577. });
  578. if (bNeedTexCoordZ) {
  579. byteLength = nTexCoordCount * Float32Array.BYTES_PER_ELEMENT;
  580. var texCoordZBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
  581. newBytesOffset += byteLength;
  582. vertexPackage.texCoordZMatrix = true;
  583. str = 'aTexCoordZ' + texIndex;
  584. attrLocation[str] = attributes.length;
  585. attributes.push({
  586. index: attrLocation[str],
  587. typedArray: texCoordZBuffer,
  588. componentsPerAttribute: 1,
  589. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  590. offsetInBytes: 0,
  591. strideInBytes: Float32Array.BYTES_PER_ELEMENT,
  592. normalize: false
  593. });
  594. }
  595. texIndex++;
  596. }
  597. return {
  598. bytesOffset: newBytesOffset
  599. };
  600. }
  601. function loadInstanceInfo(view, typedArray, bufferByteOffset, viewByteOffset, vertexPackage) {
  602. var newBytesOffset = bufferByteOffset;
  603. var nInstanceInfo = view.getUint16(newBytesOffset + viewByteOffset, true);
  604. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  605. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  606. var attributes = vertexPackage.vertexAttributes;
  607. var attrLocation = vertexPackage.attrLocation;
  608. for (var iIndex = 0; iIndex < nInstanceInfo; iIndex++) {
  609. var nTexCoordCount = view.getUint32(newBytesOffset + viewByteOffset, true);
  610. newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  611. var nTexDimensions = view.getUint16(newBytesOffset + viewByteOffset, true);
  612. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  613. var nTexCoordStride = view.getUint16(newBytesOffset + viewByteOffset, true);
  614. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  615. var byteLength = nTexCoordCount * nTexDimensions * Float32Array.BYTES_PER_ELEMENT;
  616. if (nTexDimensions === 17 || nTexDimensions === 29) {
  617. var instanceBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
  618. vertexPackage.instanceCount = nTexCoordCount;
  619. vertexPackage.instanceMode = nTexDimensions;
  620. vertexPackage.instanceBuffer = instanceBuffer;
  621. vertexPackage.instanceIndex = 1;
  622. var byteStride;
  623. if (nTexDimensions === 17) {
  624. byteStride = Float32Array.BYTES_PER_ELEMENT * 17;
  625. attrLocation['uv2'] = attributes.length;
  626. attributes.push({
  627. index: attrLocation['uv2'],
  628. componentsPerAttribute: 4,
  629. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  630. normalize: false,
  631. offsetInBytes: 0,
  632. strideInBytes: byteStride,
  633. instanceDivisor: 1
  634. });
  635. attrLocation['uv3'] = attributes.length;
  636. attributes.push({
  637. index: attrLocation['uv3'],
  638. componentsPerAttribute: 4,
  639. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  640. normalize: false,
  641. offsetInBytes: 4 * Float32Array.BYTES_PER_ELEMENT,
  642. strideInBytes: byteStride,
  643. instanceDivisor: 1
  644. });
  645. attrLocation['uv4'] = attributes.length;
  646. attributes.push({
  647. index: attrLocation['uv4'],
  648. componentsPerAttribute: 4,
  649. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  650. normalize: false,
  651. offsetInBytes: 8 * Float32Array.BYTES_PER_ELEMENT,
  652. strideInBytes: byteStride,
  653. instanceDivisor: 1
  654. });
  655. attrLocation['secondary_colour'] = attributes.length;
  656. attributes.push({
  657. index: attrLocation['secondary_colour'],
  658. componentsPerAttribute: 4,
  659. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  660. normalize: false,
  661. offsetInBytes: 12 * Float32Array.BYTES_PER_ELEMENT,
  662. strideInBytes: byteStride,
  663. instanceDivisor: 1
  664. });
  665. attrLocation['uv6'] = attributes.length;
  666. attributes.push({
  667. index: attrLocation['uv6'],
  668. componentsPerAttribute: 4,
  669. componentDatatype: ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
  670. normalize: true,
  671. offsetInBytes: 16 * Float32Array.BYTES_PER_ELEMENT,
  672. strideInBytes: byteStride,
  673. instanceDivisor: 1
  674. });
  675. }
  676. else if (nTexDimensions === 29) {
  677. byteStride = Float32Array.BYTES_PER_ELEMENT * 29;
  678. attrLocation['uv1'] = attributes.length;
  679. attributes.push({
  680. index: attrLocation['uv1'],
  681. componentsPerAttribute: 4,
  682. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  683. normalize: false,
  684. offsetInBytes: 0,
  685. strideInBytes: byteStride,
  686. instanceDivisor: 1,
  687. byteLength: byteLength
  688. });
  689. attrLocation['uv2'] = attributes.length;
  690. attributes.push({
  691. index: attrLocation['uv2'],
  692. componentsPerAttribute: 4,
  693. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  694. normalize: false,
  695. offsetInBytes: 4 * Float32Array.BYTES_PER_ELEMENT,
  696. strideInBytes: byteStride,
  697. instanceDivisor: 1
  698. });
  699. attrLocation['uv3'] = attributes.length;
  700. attributes.push({
  701. index: attrLocation['uv3'],
  702. componentsPerAttribute: 4,
  703. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  704. normalize: false,
  705. offsetInBytes: 8 * Float32Array.BYTES_PER_ELEMENT,
  706. strideInBytes: byteStride,
  707. instanceDivisor: 1
  708. });
  709. attrLocation['uv4'] = attributes.length;
  710. attributes.push({
  711. index: attrLocation['uv4'],
  712. componentsPerAttribute: 4,
  713. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  714. normalize: false,
  715. offsetInBytes: 12 * Float32Array.BYTES_PER_ELEMENT,
  716. strideInBytes: byteStride,
  717. instanceDivisor: 1
  718. });
  719. attrLocation['uv5'] = attributes.length;
  720. attributes.push({
  721. index: attrLocation['uv5'],
  722. componentsPerAttribute: 4,
  723. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  724. normalize: false,
  725. offsetInBytes: 16 * Float32Array.BYTES_PER_ELEMENT,
  726. strideInBytes: byteStride,
  727. instanceDivisor: 1
  728. });
  729. attrLocation['uv6'] = attributes.length;
  730. attributes.push({
  731. index: attrLocation['uv6'],
  732. componentsPerAttribute: 4,
  733. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  734. normalize: false,
  735. offsetInBytes: 20 * Float32Array.BYTES_PER_ELEMENT,
  736. strideInBytes: byteStride,
  737. instanceDivisor: 1
  738. });
  739. attrLocation['uv7'] = attributes.length;
  740. attributes.push({
  741. index: attrLocation['uv7'],
  742. componentsPerAttribute: 3,
  743. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  744. normalize: false,
  745. offsetInBytes: 24 * Float32Array.BYTES_PER_ELEMENT,
  746. strideInBytes: byteStride,
  747. instanceDivisor: 1
  748. });
  749. attrLocation['secondary_colour'] = attributes.length;
  750. attributes.push({
  751. index: attrLocation['secondary_colour'],
  752. componentsPerAttribute: 4,
  753. componentDatatype: ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
  754. normalize: true,
  755. offsetInBytes: 27 * Float32Array.BYTES_PER_ELEMENT,
  756. strideInBytes: byteStride,
  757. instanceDivisor: 1
  758. });
  759. attrLocation['uv9'] = attributes.length;
  760. attributes.push({
  761. index: attrLocation['uv9'],
  762. componentsPerAttribute: 4,
  763. componentDatatype: ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
  764. normalize: true,
  765. offsetInBytes: 28 * Float32Array.BYTES_PER_ELEMENT,
  766. strideInBytes: byteStride,
  767. instanceDivisor: 1
  768. });
  769. }
  770. }
  771. else {
  772. var valueCount = nTexCoordCount * nTexDimensions;
  773. vertexPackage.instanceBounds = new Float32Array(valueCount);
  774. for (var k = 0; k < valueCount; k++) {
  775. vertexPackage.instanceBounds[k] = view.getFloat32(newBytesOffset + viewByteOffset + k * Float32Array.BYTES_PER_ELEMENT, true);
  776. }
  777. }
  778. newBytesOffset += byteLength;
  779. }
  780. return {
  781. bytesOffset: newBytesOffset
  782. };
  783. }
  784. function loadVertex(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage) {
  785. var newBytesOffset = bufferByteOffset;
  786. var nVerticesCount = view.getUint32(newBytesOffset + viewByteOffset, true);
  787. vertexPackage.verticesCount = nVerticesCount;
  788. newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  789. if (nVerticesCount <= 0) {
  790. return {
  791. bytesOffset: newBytesOffset
  792. };
  793. }
  794. var nVertexDimension = view.getUint16(newBytesOffset + viewByteOffset, true);
  795. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  796. var nVertexStride = view.getUint16(newBytesOffset + viewByteOffset, true);
  797. nVertexStride = nVertexDimension * Float32Array.BYTES_PER_ELEMENT;
  798. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  799. var byteLength = nVerticesCount * nVertexDimension * Float32Array.BYTES_PER_ELEMENT;
  800. var vertexBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
  801. newBytesOffset += byteLength;
  802. var attributes = vertexPackage.vertexAttributes;
  803. var attrLocation = vertexPackage.attrLocation;
  804. attrLocation['aPosition'] = attributes.length;
  805. attributes.push({
  806. index: attrLocation['aPosition'],
  807. typedArray: vertexBuffer,
  808. componentsPerAttribute: nVertexDimension,
  809. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  810. offsetInBytes: 0,
  811. strideInBytes: nVertexStride,
  812. normalize: false
  813. });
  814. return {
  815. bytesOffset: newBytesOffset
  816. }
  817. }
  818. function loadCompressVertex(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage) {
  819. var newBytesOffset = bufferByteOffset;
  820. var nVerticesCount = view.getUint32(newBytesOffset + viewByteOffset, true);
  821. vertexPackage.verticesCount = nVerticesCount;
  822. newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  823. if (nVerticesCount <= 0) {
  824. return {
  825. bytesOffset: newBytesOffset
  826. };
  827. }
  828. var nVertexDimension = view.getUint16(newBytesOffset + viewByteOffset, true);
  829. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  830. var nVertexStride = view.getUint16(newBytesOffset + viewByteOffset, true);
  831. nVertexStride = nVertexDimension * Int16Array.BYTES_PER_ELEMENT;
  832. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  833. var fVertCompressConstant = view.getFloat32(newBytesOffset + viewByteOffset, true);
  834. newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
  835. var minVerticesValue = new Cartesian4.Cartesian4();
  836. minVerticesValue.x = view.getFloat32(newBytesOffset + viewByteOffset, true);
  837. newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
  838. minVerticesValue.y = view.getFloat32(newBytesOffset + viewByteOffset, true);
  839. newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
  840. minVerticesValue.z = view.getFloat32(newBytesOffset + viewByteOffset, true);
  841. newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
  842. minVerticesValue.w = view.getFloat32(newBytesOffset + viewByteOffset, true);
  843. newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
  844. vertexPackage.vertCompressConstant = fVertCompressConstant;
  845. vertexPackage.minVerticesValue = minVerticesValue;
  846. var byteLength = nVerticesCount * nVertexDimension * Int16Array.BYTES_PER_ELEMENT;
  847. var vertexBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
  848. newBytesOffset += byteLength;
  849. var attributes = vertexPackage.vertexAttributes;
  850. var attrLocation = vertexPackage.attrLocation;
  851. attrLocation['aPosition'] = attributes.length;
  852. attributes.push({
  853. index: attrLocation['aPosition'],
  854. typedArray: vertexBuffer,
  855. componentsPerAttribute: nVertexDimension,
  856. componentDatatype: ComponentDatatype.ComponentDatatype.SHORT,
  857. offsetInBytes: 0,
  858. strideInBytes: nVertexStride,
  859. normalize: false
  860. });
  861. return {
  862. bytesOffset: newBytesOffset
  863. }
  864. }
  865. function loadNormal(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage) {
  866. var newBytesOffset = bufferByteOffset;
  867. var nNormalCount = view.getUint32(newBytesOffset + viewByteOffset, true);
  868. newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  869. if (nNormalCount <= 0) {
  870. return {
  871. bytesOffset: newBytesOffset
  872. };
  873. }
  874. var nNormalDimension = view.getUint16(newBytesOffset + viewByteOffset, true);
  875. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  876. var nNormalStride = view.getUint16(newBytesOffset + viewByteOffset, true);
  877. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  878. var byteLength = nNormalCount * nNormalDimension * Float32Array.BYTES_PER_ELEMENT;
  879. var normalBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
  880. newBytesOffset += byteLength;
  881. if (!vertexPackage.ignoreNormal) {
  882. var attributes = vertexPackage.vertexAttributes;
  883. var attrLocation = vertexPackage.attrLocation;
  884. attrLocation['aNormal'] = attributes.length;
  885. attributes.push({
  886. index: attrLocation['aNormal'],
  887. typedArray: normalBuffer,
  888. componentsPerAttribute: nNormalDimension,
  889. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  890. offsetInBytes: 0,
  891. strideInBytes: nNormalStride,
  892. normalize: false
  893. });
  894. }
  895. return {
  896. bytesOffset: newBytesOffset
  897. }
  898. }
  899. function loadCompressNormal(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage) {
  900. var newBytesOffset = bufferByteOffset;
  901. var nNormalCount = view.getUint32(newBytesOffset + viewByteOffset, true);
  902. newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  903. if (nNormalCount <= 0) {
  904. return {
  905. bytesOffset: newBytesOffset
  906. };
  907. }
  908. var nNormalDimension = view.getUint16(newBytesOffset + viewByteOffset, true);
  909. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  910. var nNormalStride = view.getUint16(newBytesOffset + viewByteOffset, true);
  911. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  912. var byteLength = nNormalCount * 2 * Int16Array.BYTES_PER_ELEMENT;
  913. var normalBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
  914. newBytesOffset += byteLength;
  915. if (!vertexPackage.ignoreNormal) {
  916. var attributes = vertexPackage.vertexAttributes;
  917. var attrLocation = vertexPackage.attrLocation;
  918. attrLocation['aNormal'] = attributes.length;
  919. attributes.push({
  920. index: attrLocation['aNormal'],
  921. typedArray: normalBuffer,
  922. componentsPerAttribute: 2,
  923. componentDatatype: ComponentDatatype.ComponentDatatype.SHORT,
  924. offsetInBytes: 0,
  925. strideInBytes: nNormalStride,
  926. normalize: false
  927. });
  928. }
  929. return {
  930. bytesOffset: newBytesOffset
  931. }
  932. }
  933. function loadVertexColor(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage) {
  934. var newBytesOffset = bufferByteOffset;
  935. var nColorCount = view.getUint32(newBytesOffset + viewByteOffset, true);
  936. newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  937. var verticesCount = vertexPackage.verticesCount;
  938. var vertexColor;
  939. if (nColorCount > 0) {
  940. var colorStride = view.getUint16(newBytesOffset + viewByteOffset, true);
  941. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  942. newBytesOffset += Uint8Array.BYTES_PER_ELEMENT * 2;
  943. var byteLength = nColorCount * Uint8Array.BYTES_PER_ELEMENT * 4;
  944. vertexColor = arraySlice(typedArray, newBytesOffset, newBytesOffset + byteLength);
  945. newBytesOffset += byteLength;
  946. var attributes = vertexPackage.vertexAttributes;
  947. var attrLocation = vertexPackage.attrLocation;
  948. attrLocation['aColor'] = attributes.length;
  949. attributes.push({
  950. index: attrLocation['aColor'],
  951. typedArray: vertexColor,
  952. componentsPerAttribute: 4,
  953. componentDatatype: ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
  954. offsetInBytes: 0,
  955. strideInBytes: 4,
  956. normalize: true
  957. });
  958. }
  959. return {
  960. bytesOffset: newBytesOffset
  961. };
  962. }
  963. function loadSecondColor(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage) {
  964. var newBytesOffset = bufferByteOffset;
  965. var nSecondColorCount = view.getUint32(newBytesOffset + viewByteOffset, true);
  966. newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  967. if (nSecondColorCount <= 0) {
  968. return {
  969. bytesOffset: newBytesOffset
  970. };
  971. }
  972. var secondColorStride = view.getUint16(newBytesOffset + viewByteOffset, true);
  973. newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  974. newBytesOffset += Uint8Array.BYTES_PER_ELEMENT * 2;
  975. var byteLength = nSecondColorCount * Uint8Array.BYTES_PER_ELEMENT * 4;
  976. newBytesOffset += byteLength;
  977. return {
  978. bytesOffset: newBytesOffset
  979. };
  980. }
  981. function loadIndexPackage(typedArray, view, viewByteOffset, bufferByteOffset) {
  982. var newBytesOffset = bufferByteOffset;
  983. var arrIndexPackage = [];
  984. var nIndexPackageCount = view.getUint32(newBytesOffset + viewByteOffset, true);
  985. newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  986. for (var k = 0; k < nIndexPackageCount; k++) {
  987. var indexPackage = {};
  988. var nIndexCount = view.getUint32(newBytesOffset + viewByteOffset, true);
  989. newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  990. var enIndexType = view.getUint8(newBytesOffset + viewByteOffset, true);
  991. newBytesOffset += Uint8Array.BYTES_PER_ELEMENT;
  992. var bUseIndex = view.getUint8(newBytesOffset + viewByteOffset, true);
  993. newBytesOffset += Uint8Array.BYTES_PER_ELEMENT;
  994. var operationType = view.getUint8(newBytesOffset + viewByteOffset, true);
  995. newBytesOffset += Uint8Array.BYTES_PER_ELEMENT;
  996. newBytesOffset += Uint8Array.BYTES_PER_ELEMENT;
  997. if (nIndexCount > 0) {
  998. var byteLength = 0;
  999. var indexBuffer = null;
  1000. if (enIndexType === 1 || enIndexType === 3) {
  1001. byteLength = nIndexCount * Uint32Array.BYTES_PER_ELEMENT;
  1002. indexBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
  1003. }
  1004. else {
  1005. byteLength = nIndexCount * Uint16Array.BYTES_PER_ELEMENT;
  1006. indexBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
  1007. if (nIndexCount % 2 != 0) {
  1008. byteLength += 2;
  1009. }
  1010. }
  1011. indexPackage.indicesTypedArray = indexBuffer;
  1012. newBytesOffset += byteLength;
  1013. }
  1014. indexPackage.indicesCount = nIndexCount;
  1015. indexPackage.indexType = enIndexType;
  1016. indexPackage.primitiveType = operationType;
  1017. var arrPassName = [];
  1018. var nPassNameCount = view.getUint32(newBytesOffset + viewByteOffset, true);
  1019. newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  1020. for (var passIndex = 0; passIndex < nPassNameCount; passIndex++) {
  1021. var res = loadString(view, viewByteOffset, typedArray, newBytesOffset);
  1022. var strPassName = res.string;
  1023. newBytesOffset = res.bytesOffset;
  1024. arrPassName.push(strPassName);
  1025. indexPackage.materialCode = strPassName;
  1026. }
  1027. arrIndexPackage.push(indexPackage);
  1028. var align = newBytesOffset % 4;
  1029. if (align !== 0) {
  1030. var nReserved = 4 - newBytesOffset % 4;
  1031. newBytesOffset += nReserved;
  1032. }
  1033. }
  1034. return {
  1035. bytesOffset: newBytesOffset,
  1036. arrIndexPackage: arrIndexPackage
  1037. };
  1038. }
  1039. function loadCompressSkeleton(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage, isOldVersion) {
  1040. var newBytesOffset = bufferByteOffset;
  1041. var nCompressOptions = view.getUint32(newBytesOffset + viewByteOffset, true);
  1042. vertexPackage.nCompressOptions = nCompressOptions;
  1043. var result;
  1044. newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  1045. if ((nCompressOptions & S3MCompressType.VertexCompressOption.SVC_Vertex) == S3MCompressType.VertexCompressOption.SVC_Vertex) {
  1046. result = loadCompressVertex(typedArray, view, viewByteOffset, newBytesOffset, vertexPackage);
  1047. newBytesOffset = result.bytesOffset;
  1048. }
  1049. else {
  1050. result = loadVertex(typedArray, view, viewByteOffset, newBytesOffset, vertexPackage);
  1051. newBytesOffset = result.bytesOffset;
  1052. }
  1053. if ((nCompressOptions & S3MCompressType.VertexCompressOption.SVC_Normal) == S3MCompressType.VertexCompressOption.SVC_Normal) {
  1054. result = loadCompressNormal(typedArray, view, viewByteOffset, newBytesOffset, vertexPackage);
  1055. newBytesOffset = result.bytesOffset;
  1056. }
  1057. else {
  1058. result = loadNormal(typedArray, view, viewByteOffset, newBytesOffset, vertexPackage);
  1059. newBytesOffset = result.bytesOffset;
  1060. }
  1061. result = loadVertexColor(typedArray, view, viewByteOffset, newBytesOffset, vertexPackage);
  1062. newBytesOffset = result.bytesOffset;
  1063. result = loadSecondColor(typedArray, view, viewByteOffset, newBytesOffset);
  1064. newBytesOffset = result.bytesOffset;
  1065. if ((nCompressOptions & S3MCompressType.VertexCompressOption.SVC_TexutreCoord) == S3MCompressType.VertexCompressOption.SVC_TexutreCoord) {
  1066. result = loadCompressTexCoord(view, typedArray, newBytesOffset, viewByteOffset, vertexPackage);
  1067. newBytesOffset = result.bytesOffset;
  1068. }
  1069. else {
  1070. result = loadTexCoord(view, typedArray, newBytesOffset, viewByteOffset, vertexPackage, isOldVersion);
  1071. newBytesOffset = result.bytesOffset;
  1072. }
  1073. if ((nCompressOptions & S3MCompressType.VertexCompressOption.SVC_TexutreCoordIsW) == S3MCompressType.VertexCompressOption.SVC_TexutreCoordIsW) {
  1074. vertexPackage.textureCoordIsW = true;
  1075. }
  1076. result = loadInstanceInfo(view, typedArray, newBytesOffset, viewByteOffset, vertexPackage);
  1077. newBytesOffset = result.bytesOffset;
  1078. return {
  1079. bytesOffset: newBytesOffset
  1080. }
  1081. }
  1082. function loadStandardSkeleton(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage, isOldVersion) {
  1083. var newBytesOffset = bufferByteOffset;
  1084. var result;
  1085. result = loadVertex(typedArray, view, viewByteOffset, newBytesOffset, vertexPackage);
  1086. newBytesOffset = result.bytesOffset;
  1087. result = loadNormal(typedArray, view, viewByteOffset, newBytesOffset, vertexPackage);
  1088. newBytesOffset = result.bytesOffset;
  1089. result = loadVertexColor(typedArray, view, viewByteOffset, newBytesOffset, vertexPackage);
  1090. newBytesOffset = result.bytesOffset;
  1091. result = loadSecondColor(typedArray, view, viewByteOffset, newBytesOffset);
  1092. newBytesOffset = result.bytesOffset;
  1093. result = loadTexCoord(view, typedArray, newBytesOffset, viewByteOffset, vertexPackage, isOldVersion);
  1094. newBytesOffset = result.bytesOffset;
  1095. result = loadInstanceInfo(view, typedArray, newBytesOffset, viewByteOffset, vertexPackage);
  1096. newBytesOffset = result.bytesOffset;
  1097. return {
  1098. bytesOffset: newBytesOffset
  1099. }
  1100. }
  1101. function isClampGroundLinePass(arrIndexPackage) {
  1102. if (arrIndexPackage.length === 0) {
  1103. return false;
  1104. }
  1105. return arrIndexPackage[0].materialCode === CLAMP_GROUND_LINE_PASS_NAME;
  1106. }
  1107. function loadSkeletonEntities(skeletonBuffer, view, viewByteOffset, geoPackage, isOldVersion, transferableObjects, isHasOBB) {
  1108. var typedArray = skeletonBuffer;
  1109. var bufferByteOffset = 0;
  1110. var nCount = view.getUint32(bufferByteOffset + viewByteOffset, true);
  1111. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1112. for (var i = 0; i < nCount; i++) {
  1113. // S3MB头名字长度
  1114. var result = loadString(view, viewByteOffset, typedArray, bufferByteOffset);
  1115. var strGeometryName = result.string;
  1116. bufferByteOffset = result.bytesOffset;
  1117. var align = bufferByteOffset % 4;
  1118. if (align !== 0) {
  1119. bufferByteOffset += (4 - align);
  1120. }
  1121. var nTagValue = S3MBVertexTag.SV_Unkown;
  1122. nTagValue = view.getUint32(bufferByteOffset + viewByteOffset, true);
  1123. bufferByteOffset += Int32Array.BYTES_PER_ELEMENT;
  1124. var vertexPackage = {};
  1125. vertexPackage.vertexAttributes = [];
  1126. vertexPackage.attrLocation = {};
  1127. vertexPackage.instanceCount = 0;
  1128. vertexPackage.instanceMode = 0;
  1129. vertexPackage.instanceIndex = -1;
  1130. vertexPackage.ignoreNormal = geoPackage.ignoreNormal;
  1131. if (nTagValue == S3MBVertexTag.SV_DracoCompressed) {
  1132. var vertexUniqueIDs = {};
  1133. vertexUniqueIDs.posUniqueID = view.getInt32(bufferByteOffset + viewByteOffset, true);
  1134. bufferByteOffset += Int32Array.BYTES_PER_ELEMENT;
  1135. vertexUniqueIDs.normalUniqueID = view.getInt32(bufferByteOffset + viewByteOffset, true);
  1136. bufferByteOffset += Int32Array.BYTES_PER_ELEMENT;
  1137. vertexUniqueIDs.colorUniqueID = view.getInt32(bufferByteOffset + viewByteOffset, true);
  1138. bufferByteOffset += Int32Array.BYTES_PER_ELEMENT;
  1139. vertexUniqueIDs.secondColorUniqueID = view.getInt32(bufferByteOffset + viewByteOffset, true);
  1140. bufferByteOffset += Int32Array.BYTES_PER_ELEMENT;
  1141. var nTextureCoord = view.getUint16(bufferByteOffset + viewByteOffset, true);
  1142. bufferByteOffset += Int16Array.BYTES_PER_ELEMENT;
  1143. var texCoordUniqueIDs = [];
  1144. for (var nTexCoordIdx = 0; nTexCoordIdx < nTextureCoord; nTexCoordIdx++) {
  1145. var nTexCoordUniqueID = view.getInt32(bufferByteOffset + viewByteOffset, true);
  1146. texCoordUniqueIDs.push(nTexCoordUniqueID);
  1147. bufferByteOffset += Int32Array.BYTES_PER_ELEMENT;
  1148. }
  1149. vertexUniqueIDs.texCoordUniqueIDs = texCoordUniqueIDs;
  1150. var nIndexPackageCount = view.getInt32(bufferByteOffset + viewByteOffset, true);
  1151. bufferByteOffset += Int32Array.BYTES_PER_ELEMENT;
  1152. var arrIndexPackage = [];
  1153. // 目前只支持单索引
  1154. var indexPackage = {};
  1155. if (nIndexPackageCount > 0) {
  1156. var res = loadString(view, viewByteOffset, typedArray, bufferByteOffset);
  1157. var strPassName = res.string;
  1158. bufferByteOffset = res.bytesOffset;
  1159. indexPackage.materialCode = strPassName;
  1160. arrIndexPackage.push(indexPackage);
  1161. }
  1162. var nDracoBufferSize = view.getUint32(bufferByteOffset + viewByteOffset, true);
  1163. bufferByteOffset += Int32Array.BYTES_PER_ELEMENT;
  1164. var dataBuffer = arraySlice(typedArray, bufferByteOffset, bufferByteOffset + nDracoBufferSize);
  1165. if (nIndexPackageCount > 0) {
  1166. S3MDracoDecode.dracoDecodeMesh(dracoLib, dataBuffer, nDracoBufferSize, vertexPackage, indexPackage, vertexUniqueIDs);
  1167. }
  1168. else {
  1169. S3MDracoDecode.dracoDecodePointCloud(dracoLib, dataBuffer, nDracoBufferSize, vertexPackage, vertexUniqueIDs);
  1170. }
  1171. bufferByteOffset += nDracoBufferSize;
  1172. geoPackage[strGeometryName] = {
  1173. vertexPackage: vertexPackage,
  1174. arrIndexPackage: arrIndexPackage
  1175. };
  1176. }
  1177. else {
  1178. if (nTagValue == S3MBVertexTag.SV_Standard) {
  1179. result = loadStandardSkeleton(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage, isOldVersion);
  1180. bufferByteOffset = result.bytesOffset;
  1181. }
  1182. else if (nTagValue == S3MBVertexTag.SV_Compressed) {
  1183. result = loadCompressSkeleton(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage, isOldVersion);
  1184. bufferByteOffset = result.bytesOffset;
  1185. }
  1186. result = loadIndexPackage(typedArray, view, viewByteOffset, bufferByteOffset);
  1187. var arrIndexPackage = result.arrIndexPackage;
  1188. if (isClampGroundLinePass(arrIndexPackage)) {
  1189. vertexPackage.clampRegionEdge = true;
  1190. }
  1191. var edgeGeometry;
  1192. if(arrIndexPackage.length === 2 && arrIndexPackage[1].primitiveType === 13){ // 13表示EffectOutline线框
  1193. edgeGeometry = S3MCompressType.S3MEdgeProcessor.createEdgeDataByIndices(vertexPackage, arrIndexPackage[1], transferableObjects);
  1194. }
  1195. bufferByteOffset = result.bytesOffset;
  1196. geoPackage[strGeometryName] = {
  1197. vertexPackage: vertexPackage,
  1198. arrIndexPackage: arrIndexPackage,
  1199. edgeGeometry: edgeGeometry
  1200. };
  1201. }
  1202. if(when.defined(isHasOBB) && isHasOBB){
  1203. var min = new Cartographic.Cartesian3();
  1204. var max = new Cartographic.Cartesian3();
  1205. min.x = view.getFloat64(bufferByteOffset + viewByteOffset, true);
  1206. bufferByteOffset += Float64Array.BYTES_PER_ELEMENT;
  1207. min.y = view.getFloat64(bufferByteOffset + viewByteOffset, true);
  1208. bufferByteOffset += Float64Array.BYTES_PER_ELEMENT;
  1209. min.z = view.getFloat64(bufferByteOffset + viewByteOffset, true);
  1210. bufferByteOffset += Float64Array.BYTES_PER_ELEMENT;
  1211. max.x = view.getFloat64(bufferByteOffset + viewByteOffset, true);
  1212. bufferByteOffset += Float64Array.BYTES_PER_ELEMENT;
  1213. max.y = view.getFloat64(bufferByteOffset + viewByteOffset, true);
  1214. bufferByteOffset += Float64Array.BYTES_PER_ELEMENT;
  1215. max.z = view.getFloat64(bufferByteOffset + viewByteOffset, true);
  1216. bufferByteOffset += Float64Array.BYTES_PER_ELEMENT;
  1217. geoPackage[strGeometryName].min = min;
  1218. geoPackage[strGeometryName].max = max;
  1219. }
  1220. }
  1221. }
  1222. function loadGeodeEntities(shellBuffer, view, bufferByteOffset, dataViewByteOffset) {
  1223. var geode = {};
  1224. var skeletonNames = [];
  1225. var geoMatrix = new BoundingSphere.Matrix4();
  1226. var typedArray = shellBuffer;
  1227. for (var matIndex = 0; matIndex < 16; matIndex++) {
  1228. geoMatrix[matIndex] = view.getFloat64(bufferByteOffset + dataViewByteOffset, true);
  1229. bufferByteOffset += Float64Array.BYTES_PER_ELEMENT;
  1230. }
  1231. geode.matrix = geoMatrix;
  1232. geode.skeletonNames = skeletonNames;
  1233. var nSkeletonCount = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1234. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1235. for (var i = 0; i < nSkeletonCount; i++) {
  1236. var res = loadString(view, dataViewByteOffset, typedArray, bufferByteOffset);
  1237. var strSkeletonName = res.string;
  1238. bufferByteOffset = res.bytesOffset;
  1239. skeletonNames.push(strSkeletonName);
  1240. }
  1241. return {
  1242. byteOffset: bufferByteOffset,
  1243. geode: geode
  1244. }
  1245. }
  1246. function removeUnusedStringTileName(oldTileName) {
  1247. var index = oldTileName.indexOf('Geometry');
  1248. if (index === -1) {
  1249. return oldTileName;
  1250. }
  1251. var ignoreString = oldTileName.substring(index, oldTileName.length);
  1252. return oldTileName.replace(ignoreString, '');
  1253. }
  1254. function loadPageLODEntities(shellBuffer, view, bufferByteOffset, dataViewByteOffset) {
  1255. var pageLOD = {};
  1256. var dbDis = view.getFloat32(bufferByteOffset + dataViewByteOffset, true);
  1257. bufferByteOffset += Float32Array.BYTES_PER_ELEMENT;
  1258. var uRangeMode = view.getUint16(bufferByteOffset + dataViewByteOffset, true);
  1259. bufferByteOffset += Uint16Array.BYTES_PER_ELEMENT;
  1260. pageLOD.rangeMode = uRangeMode;
  1261. pageLOD.rangeList = dbDis;
  1262. var boundingSphereCenter = new Cartographic.Cartesian3();
  1263. boundingSphereCenter.x = view.getFloat64(bufferByteOffset + dataViewByteOffset, true);
  1264. bufferByteOffset += Float64Array.BYTES_PER_ELEMENT;
  1265. boundingSphereCenter.y = view.getFloat64(bufferByteOffset + dataViewByteOffset, true);
  1266. bufferByteOffset += Float64Array.BYTES_PER_ELEMENT;
  1267. boundingSphereCenter.z = view.getFloat64(bufferByteOffset + dataViewByteOffset, true);
  1268. bufferByteOffset += Float64Array.BYTES_PER_ELEMENT;
  1269. var radius = view.getFloat64(bufferByteOffset + dataViewByteOffset, true);
  1270. bufferByteOffset += Float64Array.BYTES_PER_ELEMENT;
  1271. pageLOD.boundingSphere = new BoundingSphere.BoundingSphere(boundingSphereCenter, radius);
  1272. var typedArray = shellBuffer;
  1273. var res = loadString(view, dataViewByteOffset, typedArray, bufferByteOffset);
  1274. var strChildTile = res.string;
  1275. bufferByteOffset = res.bytesOffset;
  1276. strChildTile = strChildTile.replace(/(\.s3mblock)|(\.s3mbz)|(\.s3mb)/gi, '');
  1277. strChildTile = removeUnusedStringTileName(strChildTile);
  1278. pageLOD.childTile = strChildTile;
  1279. pageLOD.geodes = [];
  1280. var nGeodeCount = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1281. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1282. for (var i = 0; i < nGeodeCount; i++) {
  1283. var res = loadGeodeEntities(shellBuffer, view, bufferByteOffset, dataViewByteOffset);
  1284. bufferByteOffset = res.byteOffset;
  1285. pageLOD.geodes.push(res.geode);
  1286. }
  1287. return {
  1288. pageLOD: pageLOD,
  1289. bytesOffset: bufferByteOffset
  1290. }
  1291. }
  1292. function loadShellEntites(shellBuffer, view, dataViewByteOffset) {
  1293. var bufferByteOffset = 0;
  1294. var groupNode = {};
  1295. var pageLods = [];
  1296. var nCount = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1297. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1298. for (var i = 0; i < nCount; i++) {
  1299. var res = loadPageLODEntities(shellBuffer, view, bufferByteOffset, dataViewByteOffset);
  1300. bufferByteOffset = res.bytesOffset;
  1301. pageLods.push(res.pageLOD);
  1302. }
  1303. groupNode.pageLods = pageLods;
  1304. return groupNode;
  1305. }
  1306. function loadTextureEntities(supportCompressType, textureDataBuffer, dataView, dataViewByteOffset, texturePackage, transferableObjects) {
  1307. var bufferByteOffset = 0;
  1308. var nTextureCount = dataView.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1309. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1310. for (var i = 0; i < nTextureCount; i++) {
  1311. var res = loadString(dataView, dataViewByteOffset, textureDataBuffer, bufferByteOffset);
  1312. var strTextureName = res.string;
  1313. bufferByteOffset = res.bytesOffset;
  1314. var align = bufferByteOffset % 4;
  1315. if (align !== 0) {
  1316. bufferByteOffset += (4 - align);
  1317. }
  1318. var nLevel = dataView.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1319. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1320. var width = dataView.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1321. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1322. var height = dataView.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1323. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1324. var compressType = dataView.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1325. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1326. var nSize = dataView.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1327. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1328. var pixelFormat = dataView.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1329. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1330. var textureData = textureDataBuffer.subarray(bufferByteOffset, bufferByteOffset + nSize);
  1331. bufferByteOffset += nSize;
  1332. var imageTypedArray = null;
  1333. if (compressType === S3MCompressType.S3MCompressType.enrS3TCDXTN && supportCompressType != 1) {
  1334. S3MCompressType.DXTTextureDecode.decode(imageTypedArray, width, height, textureData, pixelFormat);
  1335. if (pixelFormat > S3MCompressType.S3MPixelFormat.BGR || pixelFormat === S3MCompressType.S3MPixelFormat.LUMINANCE_ALPHA) {
  1336. imageTypedArray = new Uint8Array(width * height * 4);
  1337. }
  1338. else {
  1339. imageTypedArray = new Uint16Array(width * height);
  1340. }
  1341. S3MCompressType.DXTTextureDecode.decode(imageTypedArray, width, height, textureData, pixelFormat);
  1342. transferableObjects.push(imageTypedArray.buffer);
  1343. compressType = 0;
  1344. }
  1345. else {
  1346. imageTypedArray = textureData;
  1347. }
  1348. texturePackage[strTextureName] = {
  1349. id: strTextureName,
  1350. width: width,
  1351. height: height,
  1352. compressType: compressType,
  1353. nFormat: pixelFormat,
  1354. imageBuffer: imageTypedArray
  1355. };
  1356. }
  1357. }
  1358. function createTexBatchIdAttribute(vertexPackage, typedArray, texUnitIndex) {
  1359. var vertexAttributes = vertexPackage.vertexAttributes;
  1360. var attrLocation = vertexPackage.attrLocation;
  1361. var len = vertexAttributes.length;
  1362. attrLocation['aTextureBatchId' + texUnitIndex] = len;
  1363. vertexAttributes.push({
  1364. index: len,
  1365. typedArray: typedArray,
  1366. componentsPerAttribute: 1,
  1367. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  1368. offsetInBytes: 0,
  1369. strideInBytes: 0
  1370. });
  1371. }
  1372. function createTextureBatch(rootInfo, geoPackages, subTexInfos, batchIdsMap) {
  1373. var len = subTexInfos.length;
  1374. for(var i = 0;i < len;i++){
  1375. var subInfo = subTexInfos[i];
  1376. var subName = subInfo.subName.split('_')[0];
  1377. var subVertexOffsetArr = subInfo.subVertexOffsetArr;
  1378. for(var j = 0;j < subVertexOffsetArr.length;j++){
  1379. var subVertexOffsetInfo = subVertexOffsetArr[j];
  1380. var geoName = subVertexOffsetInfo.geoName;
  1381. var offset = subVertexOffsetInfo.offset;
  1382. var count = subVertexOffsetInfo.count;
  1383. var texUnitIndex = subVertexOffsetInfo.texUnitIndex;
  1384. var vertexPackage = geoPackages[geoName].vertexPackage;
  1385. var verticesCount = vertexPackage.verticesCount;
  1386. var batchIdsObj = batchIdsMap[geoName];
  1387. if(!when.defined(batchIdsObj)){
  1388. batchIdsObj = batchIdsMap[geoName] = {};
  1389. }
  1390. var batchIds = batchIdsObj[texUnitIndex];
  1391. if(!when.defined(batchIds)){
  1392. batchIds = batchIdsObj[texUnitIndex] = new Float32Array(verticesCount);
  1393. arrayFill.arrayFill(batchIds, -1);
  1394. }
  1395. var batchId = when.defined(rootInfo) ? rootInfo[subName] : i;
  1396. arrayFill.arrayFill(batchIds, batchId, offset, offset + count);
  1397. }
  1398. }
  1399. }
  1400. function loadTextureEntitiesForBlock(geoPackages, rootMap, ancestorMap, isRoot, supportCompressType, textureDataBuffer, dataView, dataViewByteOffset, texturePackage, transferableObjects) {
  1401. var bufferByteOffset = dataViewByteOffset;
  1402. var nTextureCount = dataView.getUint32(bufferByteOffset, true);
  1403. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1404. var batchIdsMap = {};
  1405. for (var i = 0; i < nTextureCount; i++) {
  1406. var len = dataView.getUint32(bufferByteOffset, true);
  1407. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1408. var curTextureName = S3MCompressType.getStringFromTypedArray(textureDataBuffer, bufferByteOffset - dataViewByteOffset, len);
  1409. bufferByteOffset += len;
  1410. var align = bufferByteOffset % 4;
  1411. if (align !== 0) {
  1412. bufferByteOffset += (4 - align);
  1413. }
  1414. var nLevel = dataView.getUint32(bufferByteOffset, true);
  1415. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1416. var isSaveData = dataView.getUint8(bufferByteOffset, true);
  1417. bufferByteOffset += Uint8Array.BYTES_PER_ELEMENT;
  1418. var width = dataView.getUint32(bufferByteOffset, true);
  1419. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1420. var height = dataView.getUint32(bufferByteOffset, true);
  1421. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1422. var compressType = dataView.getUint32(bufferByteOffset, true);
  1423. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1424. var size = dataView.getUint32(bufferByteOffset, true);
  1425. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1426. var format = dataView.getUint32(bufferByteOffset, true);
  1427. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1428. var textureData;
  1429. if(isRoot){
  1430. var offset = bufferByteOffset - dataViewByteOffset;
  1431. textureData = textureDataBuffer.subarray(offset, offset + size);
  1432. bufferByteOffset += size;
  1433. }
  1434. var childTexCount = dataView.getUint32(bufferByteOffset, true);
  1435. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1436. var childrenTexNames = [];
  1437. for(var j = 0;j < childTexCount;j++){
  1438. len = dataView.getUint32(bufferByteOffset, true);
  1439. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1440. var childTexName = S3MCompressType.getStringFromTypedArray(textureDataBuffer, bufferByteOffset - dataViewByteOffset, len);
  1441. bufferByteOffset += len;
  1442. childrenTexNames.push(childTexName);
  1443. ancestorMap[childTexName] = curTextureName;
  1444. }
  1445. var requestNameCount = dataView.getUint32(bufferByteOffset, true);
  1446. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1447. var requestNames = [];
  1448. for(j = 0;j < requestNameCount;j++){
  1449. len = dataView.getUint32(bufferByteOffset, true);
  1450. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1451. var reqName = S3MCompressType.getStringFromTypedArray(textureDataBuffer, bufferByteOffset - dataViewByteOffset, len);
  1452. bufferByteOffset += len;
  1453. requestNames.push(reqName);
  1454. }
  1455. var subTexCount = dataView.getUint32(bufferByteOffset, true);
  1456. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1457. var subTexInfos = [];
  1458. var rootInfo = undefined;
  1459. var rootName = curTextureName;
  1460. if(isRoot){
  1461. rootInfo = rootMap[curTextureName] = {};
  1462. }
  1463. else{
  1464. var parent = ancestorMap[curTextureName];
  1465. rootName = parent;
  1466. while(when.defined(parent)){
  1467. rootName = parent;
  1468. parent = ancestorMap[parent];
  1469. }
  1470. if(when.defined(rootName)){
  1471. rootInfo = rootMap[rootName];
  1472. }
  1473. }
  1474. var decream = 0;
  1475. for(j = 0;j < subTexCount;j++){
  1476. len = dataView.getUint32(bufferByteOffset, true);
  1477. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1478. var subName = S3MCompressType.getStringFromTypedArray(textureDataBuffer, bufferByteOffset - dataViewByteOffset, len);
  1479. bufferByteOffset += len;
  1480. if(isRoot){
  1481. var firstName = subName.split('_')[0];
  1482. if(!when.defined(rootInfo[firstName])){
  1483. rootInfo[firstName] = j - decream;
  1484. }
  1485. else{
  1486. decream++;
  1487. }
  1488. }
  1489. var offsetX = dataView.getUint32(bufferByteOffset, true);
  1490. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1491. var offsetY = dataView.getUint32(bufferByteOffset, true);
  1492. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1493. var subWidth = dataView.getUint32(bufferByteOffset, true);
  1494. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1495. var subHeight = dataView.getUint32(bufferByteOffset, true);
  1496. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1497. var geoCount = dataView.getUint32(bufferByteOffset, true);
  1498. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1499. var subVertexOffsetArr = [];
  1500. for(var k = 0;k < geoCount;k++){
  1501. len = dataView.getUint32(bufferByteOffset, true);
  1502. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1503. var geoName = S3MCompressType.getStringFromTypedArray(textureDataBuffer, bufferByteOffset - dataViewByteOffset, len);
  1504. bufferByteOffset += len;
  1505. var vertexOffset = dataView.getUint32(bufferByteOffset, true);
  1506. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1507. var vertexCount = dataView.getUint32(bufferByteOffset, true);
  1508. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1509. var texUnitIndex = dataView.getUint32(bufferByteOffset, true);
  1510. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1511. subVertexOffsetArr.push({
  1512. geoName : geoName,
  1513. offset : vertexOffset,
  1514. count : vertexCount,
  1515. texUnitIndex : texUnitIndex
  1516. });
  1517. }
  1518. subTexInfos.push({
  1519. subName : subName,
  1520. offsetX : offsetX,
  1521. offsetY : offsetY,
  1522. width : subWidth,
  1523. height : subHeight,
  1524. subVertexOffsetArr : subVertexOffsetArr
  1525. });
  1526. }
  1527. createTextureBatch(rootInfo, geoPackages, subTexInfos, batchIdsMap);
  1528. if(when.defined(textureData) && compressType === S3MCompressType.S3MPixelFormat.CRN_DXT5 && crunchInitialized){
  1529. textureData = convertCRNToDXT({data : textureData}, transferableObjects).bufferView;
  1530. }
  1531. texturePackage[curTextureName] = {
  1532. id: curTextureName,
  1533. rootTextureName : rootName,
  1534. width : width,
  1535. height : height,
  1536. compressType : compressType,
  1537. size : size,
  1538. format : format,
  1539. textureData : textureData,
  1540. subTexInfos : subTexInfos,
  1541. requestNames : requestNames
  1542. };
  1543. }
  1544. for(var geoName in batchIdsMap){
  1545. if(batchIdsMap.hasOwnProperty(geoName)){
  1546. var vertexPackage = geoPackages[geoName].vertexPackage;
  1547. var obj = batchIdsMap[geoName];
  1548. for(var texUnitIndex in obj){
  1549. if(obj.hasOwnProperty(texUnitIndex)){
  1550. var batchIds = obj[texUnitIndex];
  1551. createTexBatchIdAttribute(vertexPackage, batchIds, texUnitIndex);
  1552. }
  1553. }
  1554. }
  1555. }
  1556. }
  1557. function createBatchIdAttribute(vertexPackage, typedArray, instanceDivisor) {
  1558. var vertexAttributes = vertexPackage.vertexAttributes;
  1559. var attrLocation = vertexPackage.attrLocation;
  1560. var len = vertexAttributes.length;
  1561. var attrName = instanceDivisor === 1 ? 'instanceId' : 'batchId';
  1562. attrLocation[attrName] = len;
  1563. vertexAttributes.push({
  1564. index: len,
  1565. typedArray: typedArray,
  1566. componentsPerAttribute: 1,
  1567. componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
  1568. offsetInBytes: 0,
  1569. strideInBytes: 0,
  1570. instanceDivisor: instanceDivisor
  1571. });
  1572. }
  1573. var LEFT_16 = 65536;
  1574. function loadSelectionInfo(selectionInfoBuffer, view, dataViewByteOffset, geoPackage) {
  1575. var bufferByteOffset = 0;
  1576. var typedArray = selectionInfoBuffer;
  1577. var nGeometryCount = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1578. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1579. for (var i = 0; i < nGeometryCount; i++) {
  1580. // S3MB头名字长度
  1581. var result = loadString(view, dataViewByteOffset, typedArray, bufferByteOffset);
  1582. var strGeometryName = result.string;
  1583. bufferByteOffset = result.bytesOffset;
  1584. var nSelectInfoCount = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1585. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1586. var pickInfo = {};
  1587. geoPackage[strGeometryName].pickInfo = pickInfo;
  1588. // 非实例化的选择信息
  1589. var bInstanced = geoPackage[strGeometryName].vertexPackage.instanceIndex;
  1590. if (bInstanced == -1) {
  1591. var batchIds = new Float32Array(geoPackage[strGeometryName].vertexPackage.verticesCount);
  1592. for (var j = 0; j < nSelectInfoCount; j++) {
  1593. var nDictID = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1594. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1595. var nSize = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1596. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1597. var vertexCount = 0, vertexColorOffset = 0;
  1598. pickInfo[nDictID] = {
  1599. batchId: j
  1600. };
  1601. for (var k = 0; k < nSize; k++) {
  1602. vertexColorOffset = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1603. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1604. vertexCount = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1605. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1606. arrayFill.arrayFill(batchIds, j, vertexColorOffset, vertexColorOffset + vertexCount);
  1607. }
  1608. pickInfo[nDictID].vertexColorOffset = vertexColorOffset;
  1609. pickInfo[nDictID].vertexCount = vertexCount;
  1610. }
  1611. createBatchIdAttribute(geoPackage[strGeometryName].vertexPackage, batchIds, undefined);
  1612. }
  1613. else {
  1614. var instanceCount = geoPackage[strGeometryName].vertexPackage.instanceCount;
  1615. var instanceArray = geoPackage[strGeometryName].vertexPackage.instanceBuffer;
  1616. var instanceMode = geoPackage[strGeometryName].vertexPackage.instanceMode;
  1617. var instanceIds = new Float32Array(instanceCount);
  1618. for (var j = 0; j < nSelectInfoCount; j++) {
  1619. var nDictID = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1620. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1621. var nSize = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1622. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1623. for (var k = 0; k < nSize; k++) {
  1624. var instanceId = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
  1625. bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
  1626. }
  1627. }
  1628. var beginOffset = instanceMode === 17 ? 16 : 28;
  1629. beginOffset *= Float32Array.BYTES_PER_ELEMENT;
  1630. for (j = 0; j < instanceCount; j++) {
  1631. instanceIds[j] = j;
  1632. var offset = j * instanceMode * Float32Array.BYTES_PER_ELEMENT + beginOffset;
  1633. Color.Color.unpack(instanceArray, offset, colorScratch);
  1634. var pickId = colorScratch.red + colorScratch.green * 256 + colorScratch.blue * LEFT_16;
  1635. if (pickInfo[pickId] === undefined) {
  1636. pickInfo[pickId] = {
  1637. vertexColorCount: 1,
  1638. instanceIds: [],
  1639. vertexColorOffset: j
  1640. };
  1641. }
  1642. pickInfo[pickId].instanceIds.push(j);
  1643. }
  1644. createBatchIdAttribute(geoPackage[strGeometryName].vertexPackage, instanceIds, 1);
  1645. }
  1646. }
  1647. }
  1648. function OGDCIS0(x) {
  1649. return (((x) < 1e-10) && ((x) > -1e-10));
  1650. }
  1651. function unzipWithwasm(datazip, unzipSize) {
  1652. var unzipsize = unzipSize || datazip.length * 4;//unzipSize;//
  1653. var offset = unzip.unzip._malloc(Uint8Array.BYTES_PER_ELEMENT * unzipsize); //开辟内存
  1654. var tar = new Uint8Array(unzipsize);
  1655. unzip.unzip.HEAPU8.set(tar, offset / Uint8Array.BYTES_PER_ELEMENT);
  1656. var offset1 = unzip.unzip._malloc(Uint8Array.BYTES_PER_ELEMENT * datazip.length);
  1657. unzip.unzip.HEAPU8.set(datazip, offset1 / Uint8Array.BYTES_PER_ELEMENT);
  1658. var resultLen;
  1659. while ((resultLen = unzipwasm(offset, unzipsize, offset1, datazip.length)) == 0) {
  1660. freec(offset); //释放内存
  1661. unzipsize *= 4;
  1662. offset = unzip.unzip._malloc(Uint8Array.BYTES_PER_ELEMENT * unzipsize);
  1663. tar = new Uint8Array(unzipsize);
  1664. unzip.unzip.HEAPU8.set(tar, offset / Uint8Array.BYTES_PER_ELEMENT);
  1665. }
  1666. var res = new Uint8Array(unzip.unzip.HEAPU8.buffer, offset, resultLen);
  1667. datazip = null;
  1668. tar = null;
  1669. var buffer = new Uint8Array(res).buffer;
  1670. freec(offset);
  1671. freec(offset1);
  1672. return buffer;
  1673. }
  1674. function parseBuffer(oriBuffer, totalByteLength, bytesOffset, rootMap, ancestorMap, isRoot, childGroup, transferableObjects) {
  1675. var supportCompressType = 1;
  1676. var fileType = 1;
  1677. var view = new DataView(oriBuffer);
  1678. var typedArray = new Uint8Array(oriBuffer);
  1679. var len = view.getUint32(bytesOffset, true);
  1680. bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  1681. var name = S3MCompressType.getStringFromTypedArray(typedArray, bytesOffset, len);
  1682. name = name.replace(/(\.s3mblock)|(\.s3mbz)|(\.s3mb)/gi, '');
  1683. bytesOffset += len;
  1684. var pagelodCount = view.getUint32(bytesOffset, true);
  1685. bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  1686. for(var i = 0;i < pagelodCount;i++){
  1687. var pageLOD = {};
  1688. var dbDis = view.getFloat32(bytesOffset, true);
  1689. bytesOffset += Float32Array.BYTES_PER_ELEMENT;
  1690. var uRangeMode = view.getUint16(bytesOffset, true);
  1691. bytesOffset += Uint16Array.BYTES_PER_ELEMENT;
  1692. pageLOD.rangeMode = uRangeMode;
  1693. pageLOD.rangeList = dbDis;
  1694. var boundingSphereCenter = {};
  1695. boundingSphereCenter.x = view.getFloat64(bytesOffset, true);
  1696. bytesOffset += Float64Array.BYTES_PER_ELEMENT;
  1697. boundingSphereCenter.y = view.getFloat64(bytesOffset, true);
  1698. bytesOffset += Float64Array.BYTES_PER_ELEMENT;
  1699. boundingSphereCenter.z = view.getFloat64(bytesOffset, true);
  1700. bytesOffset += Float64Array.BYTES_PER_ELEMENT;
  1701. var radius = view.getFloat64(bytesOffset, true);
  1702. bytesOffset += Float64Array.BYTES_PER_ELEMENT;
  1703. pageLOD.boundingSphere = {
  1704. center : boundingSphereCenter,
  1705. radius : radius
  1706. };
  1707. len = view.getUint32(bytesOffset, true);
  1708. bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  1709. var childTileName = S3MCompressType.getStringFromTypedArray(typedArray, bytesOffset, len);
  1710. bytesOffset += len;
  1711. childTileName = childTileName.replace(/(\.s3mblock)|(\.s3mbz)|(\.s3mb)/gi, '');
  1712. childTileName = removeUnusedStringTileName(childTileName);
  1713. pageLOD.childTile = childTileName;
  1714. }
  1715. var geoPackage = {};
  1716. var version = view.getFloat32(bytesOffset, true);
  1717. bytesOffset += Float32Array.BYTES_PER_ELEMENT;
  1718. var isOldVersion = false;
  1719. var unzipByteSize = view.getUint32(bytesOffset, true);
  1720. bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  1721. var byteSize = view.getUint32(bytesOffset, true);
  1722. bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  1723. var datazip = new Uint8Array(oriBuffer, bytesOffset, byteSize);
  1724. var oriOffset = bytesOffset + byteSize;
  1725. var buffer = pako_inflate.pako.inflate(datazip).buffer;
  1726. transferableObjects.push(buffer);
  1727. view = new DataView(buffer);
  1728. var typedArray = new Uint8Array(buffer);
  1729. bytesOffset = 0;
  1730. var nOptions = view.getUint32(bytesOffset, true);
  1731. bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  1732. // load Shell
  1733. var loadStreamResult = loadStream(view, buffer, bytesOffset);
  1734. var shellBuffer = loadStreamResult.buffer;
  1735. bytesOffset = loadStreamResult.byteOffset;
  1736. var groupNode = loadShellEntites(shellBuffer, view, loadStreamResult.dataViewByteOffset);
  1737. var align = bytesOffset % 4;
  1738. if (align !== 0) {
  1739. bytesOffset += (4 - align);
  1740. }
  1741. // load skeleton
  1742. loadStreamResult = loadStream(view, buffer, bytesOffset);
  1743. var skeletonBuffer = loadStreamResult.buffer;
  1744. loadSkeletonEntities(skeletonBuffer, view, loadStreamResult.dataViewByteOffset, geoPackage, isOldVersion);
  1745. bytesOffset = loadStreamResult.byteOffset;
  1746. // load secondColor
  1747. loadStreamResult = loadStream(view, buffer, bytesOffset);
  1748. var secondColorBuffer = loadStreamResult.buffer;
  1749. bytesOffset = loadStreamResult.byteOffset;
  1750. // load textureData
  1751. loadStreamResult = loadStream(view, buffer, bytesOffset);
  1752. var textureDataBuffer = loadStreamResult.buffer;
  1753. var texturePackage = {};
  1754. loadTextureEntitiesForBlock(geoPackage, rootMap, ancestorMap, isRoot, supportCompressType, textureDataBuffer, view, loadStreamResult.dataViewByteOffset, texturePackage, transferableObjects);
  1755. bytesOffset = loadStreamResult.byteOffset;
  1756. var strJsonMaterialsLength = view.getUint32(bytesOffset, true);
  1757. bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  1758. var materialBuffer = typedArray.subarray(bytesOffset, bytesOffset + strJsonMaterialsLength);
  1759. var strJsonMaterials = S3MCompressType.getStringFromTypedArray(materialBuffer);
  1760. bytesOffset += strJsonMaterialsLength;
  1761. var matrialObj = JSON.parse(strJsonMaterials);
  1762. var bHasSelectionInfo = (nOptions & S3MBVertexOptions.SVO_HasInstSelInfo) == S3MBVertexOptions.SVO_HasInstSelInfo;
  1763. if (bHasSelectionInfo) {
  1764. loadStreamResult = loadStream(view, buffer, bytesOffset);
  1765. var selectionInfoBuffer = loadStreamResult.buffer;
  1766. loadSelectionInfo(selectionInfoBuffer, view, loadStreamResult.dataViewByteOffset, geoPackage);
  1767. bytesOffset = loadStreamResult.byteOffset;
  1768. }
  1769. var pagelodList = groupNode.pageLods;
  1770. var isLeafNode = true;
  1771. for (var i = 0; i < pagelodList.length; i++) {
  1772. var pagelodNode = pagelodList[i];
  1773. isLeafNode = pagelodNode.childTile === '';
  1774. var geodeList = pagelodNode.geodes;
  1775. for (var m = 0; m < geodeList.length; m++) {
  1776. var geodeNode = geodeList[m];
  1777. var skeletonNames = geodeNode.skeletonNames;
  1778. for (var n = 0; n < skeletonNames.length; n++) {
  1779. var geoName = skeletonNames[n];
  1780. if (isLeafNode) {
  1781. var geo = geoPackage[geoName];
  1782. var vertexPackage = geo.vertexPackage;
  1783. vertexPackage.boundingSphere = S3MCompressType.S3MVertexPackage.calcBoundingSphereInWorker(fileType, vertexPackage);
  1784. }
  1785. }
  1786. }
  1787. }
  1788. childGroup[name] = {
  1789. result: true,
  1790. groupNode: groupNode,
  1791. geoPackage: geoPackage,
  1792. matrials: matrialObj,
  1793. texturePackage: texturePackage,
  1794. version: S3MVersion.S3M4,
  1795. rootBatchIdMap : rootMap,
  1796. ancestorMap : ancestorMap
  1797. };
  1798. if(oriOffset < totalByteLength){
  1799. parseBuffer(oriBuffer, totalByteLength, oriOffset, rootMap, ancestorMap, false, childGroup, transferableObjects);
  1800. }
  1801. }
  1802. function parseS3MB(parameters, transferableObjects) {
  1803. var buffer = parameters.buffer;
  1804. var bZip = parameters.isS3MZ;
  1805. var fileType = parameters.fileType;
  1806. var supportCompressType = parameters.supportCompressType;
  1807. var bVolume = parameters.bVolume;//是否是体渲染数据;
  1808. var bound3D = null;
  1809. var volBounds = null;
  1810. var volImageBuffer = null;
  1811. if(bVolume){
  1812. if(parameters.volbuffer.byteLength < 8){
  1813. bVolume = false;
  1814. }
  1815. }
  1816. if(bVolume){
  1817. var volData = parameters.volbuffer;
  1818. var dataZip = new Uint8Array(volData,8);
  1819. var volumeBuffer = pako_inflate.pako.inflate(dataZip).buffer;
  1820. var volVersion = new Float64Array(volumeBuffer,0,1);
  1821. var volFormat = new Uint32Array(volumeBuffer,48,1);
  1822. if(volVersion[0] === 0.0 || volFormat[0] === 3200 || volFormat[0] === 3201){
  1823. var nHeaderOffset = 0;
  1824. if(volVersion[0] == 0.0){
  1825. nHeaderOffset = 8;
  1826. }
  1827. transferableObjects.push(volumeBuffer);
  1828. var boundsArray = new Float64Array(volumeBuffer, nHeaderOffset, 6);
  1829. var left = boundsArray[0];
  1830. var top = boundsArray[1];
  1831. var right = boundsArray[2];
  1832. var bottom = boundsArray[3];
  1833. var minHeight = boundsArray[4] < boundsArray[5] ? boundsArray[4] : boundsArray[5];
  1834. var maxHeight = boundsArray[4] > boundsArray[5] ? boundsArray[4] : boundsArray[5];
  1835. bound3D = new Bound3D(left, bottom, right, top, minHeight, maxHeight);
  1836. volBounds = {
  1837. left: left,
  1838. top: top,
  1839. right: right,
  1840. bottom: bottom,
  1841. minHeight: minHeight,
  1842. maxHeight: maxHeight,
  1843. width: bound3D.width,
  1844. length: bound3D.length,
  1845. height: bound3D.height
  1846. };
  1847. // 中间空出来
  1848. var infoVolume = new Uint32Array(volumeBuffer, 48 + nHeaderOffset, 7);
  1849. var nFormat = infoVolume[0];
  1850. var nSideBlockCount = infoVolume[1];
  1851. var nBlockLength = infoVolume[2];
  1852. var nLength = infoVolume[3];
  1853. var nWidth = infoVolume[4];
  1854. var nHeight = infoVolume[5];
  1855. var nDepth = infoVolume[6];
  1856. var nCount = nLength * nLength * 4;
  1857. var image = new Uint8Array(volumeBuffer, 76 + nHeaderOffset, nCount);
  1858. volImageBuffer = {
  1859. nFormat: nFormat,
  1860. nSideBlockCount: nSideBlockCount,
  1861. nBlockLength: nBlockLength,
  1862. nLength: nLength,
  1863. nWidth: nWidth,
  1864. nHeight: nHeight,
  1865. nDepth: nDepth,
  1866. imageArray: image
  1867. };
  1868. }
  1869. }
  1870. var bytesOffset = 0;
  1871. var geoPackage = {};
  1872. geoPackage.ignoreNormal = parameters.ignoreNormal;
  1873. var rootMap = parameters.rootBatchIdMap || {};
  1874. var ancesotrMap = parameters.ancestorMap || {};
  1875. var childGroup = {};
  1876. var view = new DataView(buffer);
  1877. var version = view.getFloat32(bytesOffset, true);
  1878. bytesOffset += Float32Array.BYTES_PER_ELEMENT;
  1879. if(version > 2.0 && version < 2.2){
  1880. var count = view.getUint32(bytesOffset, true);
  1881. bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  1882. var totalByteLength = buffer.byteLength;
  1883. parseBuffer(buffer, totalByteLength, bytesOffset, rootMap, ancesotrMap, parameters.isRoot, childGroup, transferableObjects);
  1884. return childGroup;
  1885. }
  1886. var isOldVersion = false;
  1887. var unzipSize;
  1888. if (version === 2) {
  1889. unzipSize = view.getUint32(bytesOffset, true);
  1890. bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  1891. }
  1892. if (OGDCIS0(version - 1) || OGDCIS0(version - 2)) {
  1893. //总字节大小
  1894. var byteSize = view.getUint32(bytesOffset, true);
  1895. bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  1896. var datazip = new Uint8Array(buffer, bytesOffset, byteSize);
  1897. if (unzipwasmReady === true) {
  1898. buffer = unzipWithwasm(datazip, unzipSize);
  1899. } else {
  1900. buffer = pako_inflate.pako.inflate(datazip).buffer;
  1901. }
  1902. transferableObjects.push(buffer);
  1903. view = new DataView(buffer);
  1904. bytesOffset = 0;
  1905. }
  1906. // 不zip压缩的解析性能,测试用
  1907. else if (version > 1.199 && version < 1.201) {
  1908. var byteSize = view.getUint32(bytesOffset, true);
  1909. bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  1910. transferableObjects.push(buffer);
  1911. }
  1912. else {
  1913. //老版本的s3mb缓存,解析方式跟UGC保持一致
  1914. isOldVersion = true;
  1915. bytesOffset = 0;
  1916. var byteSize = view.getInt32(bytesOffset, true);
  1917. bytesOffset += Int32Array.BYTES_PER_ELEMENT;
  1918. bytesOffset += Uint8Array.BYTES_PER_ELEMENT * byteSize;
  1919. if (bZip) {
  1920. var zipSize = view.getUint32(bytesOffset, true);
  1921. bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  1922. var dataZip = new Uint8Array(buffer, bytesOffset);
  1923. buffer = pako_inflate.pako.inflate(dataZip).buffer;
  1924. transferableObjects.push(buffer);
  1925. view = new DataView(buffer);
  1926. bytesOffset = 0;
  1927. }
  1928. }
  1929. var nOptions = view.getUint32(bytesOffset, true);
  1930. bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  1931. // load Shell
  1932. var loadStreamResult = loadStream(view, buffer, bytesOffset);
  1933. var shellBuffer = loadStreamResult.buffer;
  1934. bytesOffset = loadStreamResult.byteOffset;
  1935. var groupNode = loadShellEntites(shellBuffer, view, loadStreamResult.dataViewByteOffset);
  1936. var align = bytesOffset % 4;
  1937. if (align !== 0) {
  1938. bytesOffset += (4 - align);
  1939. }
  1940. // load skeleton
  1941. loadStreamResult = loadStream(view, buffer, bytesOffset);
  1942. var skeletonBuffer = loadStreamResult.buffer;
  1943. var hasOBB = version > 1.999 ? true:false;
  1944. loadSkeletonEntities(skeletonBuffer, view, loadStreamResult.dataViewByteOffset, geoPackage, isOldVersion, transferableObjects, hasOBB);
  1945. bytesOffset = loadStreamResult.byteOffset;
  1946. if(hasOBB){
  1947. //计算OBB
  1948. for(var i=0; i<groupNode.pageLods.length; i++){
  1949. var pageLod = groupNode.pageLods[i];
  1950. var geodes = pageLod.geodes;
  1951. for(var j=0; j<geodes.length; j++){
  1952. var skeletonNames = geodes[j].skeletonNames;
  1953. for(var k = 0; k<skeletonNames.length; k++){
  1954. var skeletonName = skeletonNames[k];
  1955. if(when.defined(geoPackage[skeletonName].max)){
  1956. if(!when.defined(pageLod.max)){
  1957. pageLod.max = geoPackage[skeletonName].max;
  1958. pageLod.min = geoPackage[skeletonName].min;
  1959. }
  1960. else {
  1961. pageLod.max.x = Math.max(geoPackage[skeletonName].max.x, pageLod.max.x);
  1962. pageLod.max.y = Math.max(geoPackage[skeletonName].max.y, pageLod.max.y);
  1963. pageLod.max.z = Math.max(geoPackage[skeletonName].max.z, pageLod.max.z);
  1964. pageLod.min.x = Math.min(geoPackage[skeletonName].min.x, pageLod.min.x);
  1965. pageLod.min.y = Math.min(geoPackage[skeletonName].min.y, pageLod.min.y);
  1966. pageLod.min.z = Math.min(geoPackage[skeletonName].min.z, pageLod.min.z);
  1967. }
  1968. }
  1969. }
  1970. }
  1971. }
  1972. }
  1973. // load secondColor
  1974. loadStreamResult = loadStream(view, buffer, bytesOffset);
  1975. var secondColorBuffer = loadStreamResult.buffer;
  1976. bytesOffset = loadStreamResult.byteOffset;
  1977. // load textureData
  1978. loadStreamResult = loadStream(view, buffer, bytesOffset);
  1979. var textureDataBuffer = loadStreamResult.buffer;
  1980. var texturePackage = {};
  1981. loadTextureEntities(supportCompressType, textureDataBuffer, view, loadStreamResult.dataViewByteOffset, texturePackage, transferableObjects);
  1982. bytesOffset = loadStreamResult.byteOffset;
  1983. var strJsonMaterialsLength = view.getUint32(bytesOffset, true);
  1984. bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
  1985. var typedArray = new Uint8Array(buffer);
  1986. var materialBuffer = typedArray.subarray(bytesOffset, bytesOffset + strJsonMaterialsLength);
  1987. var strJsonMaterials = S3MCompressType.getStringFromTypedArray(materialBuffer);
  1988. bytesOffset += strJsonMaterialsLength;
  1989. var matrialObj = JSON.parse(strJsonMaterials);
  1990. var bHasSelectionInfo = (nOptions & S3MBVertexOptions.SVO_HasInstSelInfo) == S3MBVertexOptions.SVO_HasInstSelInfo;
  1991. if (bHasSelectionInfo) {
  1992. loadStreamResult = loadStream(view, buffer, bytesOffset);
  1993. var selectionInfoBuffer = loadStreamResult.buffer;
  1994. loadSelectionInfo(selectionInfoBuffer, view, loadStreamResult.dataViewByteOffset, geoPackage);
  1995. }
  1996. var pagelodList = groupNode.pageLods;
  1997. var isLeafNode = true;
  1998. for (var i = 0; i < pagelodList.length; i++) {
  1999. var pagelodNode = pagelodList[i];
  2000. isLeafNode = pagelodNode.childTile === '';
  2001. var geodeList = pagelodNode.geodes;
  2002. for (var m = 0; m < geodeList.length; m++) {
  2003. var geodeNode = geodeList[m];
  2004. var skeletonNames = geodeNode.skeletonNames;
  2005. for (var n = 0; n < skeletonNames.length; n++) {
  2006. var geoName = skeletonNames[n];
  2007. if (isLeafNode) {
  2008. var geo = geoPackage[geoName];
  2009. var vertexPackage = geo.vertexPackage;
  2010. vertexPackage.boundingSphere = S3MCompressType.S3MVertexPackage.calcBoundingSphereInWorker(fileType, vertexPackage);
  2011. }
  2012. }
  2013. }
  2014. }
  2015. return {
  2016. result: true,
  2017. groupNode: groupNode,
  2018. geoPackage: geoPackage,
  2019. matrials: matrialObj,
  2020. texturePackage: texturePackage,
  2021. version: S3MVersion.S3M4,
  2022. volImageBuffer:volImageBuffer,
  2023. volBounds:volBounds
  2024. };
  2025. }
  2026. function initWorker() {
  2027. if(when.defined(crunch) && when.defined(dracoLib)){
  2028. crunch.onRuntimeInitialized = function () {
  2029. crunchInitialized = true;
  2030. };
  2031. self.onmessage = createTaskProcessorWorker(parseS3MB);
  2032. self.postMessage(true);
  2033. }
  2034. }
  2035. function S3MBTilesParser(event) {
  2036. var data = event.data;
  2037. // Expect the first message to be to load a web assembly module
  2038. var wasmConfig = data.webAssemblyConfig;
  2039. if (when.defined(wasmConfig)) {
  2040. if (FeatureDetection.FeatureDetection.isInternetExplorer()) {
  2041. return require([buildModuleUrl.buildModuleUrl('ThirdParty/Workers/ie-webworker-promise-polyfill.js')], function (e) {
  2042. self.Promise = e;
  2043. if(wasmConfig.modulePath.indexOf('crunch') !== -1){
  2044. return require([wasmConfig.modulePath], function (crnModule) {
  2045. if (when.defined(wasmConfig.wasmBinaryFile)) {
  2046. if (!when.defined(crnModule)) {
  2047. crnModule = self.Module;
  2048. }
  2049. crunch = crnModule;
  2050. initWorker();
  2051. } else {
  2052. crunch = crnModule;
  2053. initWorker();
  2054. }
  2055. });
  2056. }
  2057. return require([wasmConfig.modulePath], function (dracoModule) {
  2058. if (when.defined(wasmConfig.wasmBinaryFile)) {
  2059. if (!when.defined(dracoModule)) {
  2060. dracoModule = self.DracoDecoderModule;
  2061. }
  2062. dracoModule(wasmConfig).then(function (compiledModule) {
  2063. dracoLib = compiledModule;
  2064. initWorker();
  2065. });
  2066. } else {
  2067. dracoLib = dracoModule();
  2068. initWorker();
  2069. }
  2070. });
  2071. });
  2072. }
  2073. // Require and compile WebAssembly module, or use fallback if not supported
  2074. if(wasmConfig.modulePath.indexOf('crunch') !== -1){
  2075. return require([wasmConfig.modulePath], function (crnModule) {
  2076. if (when.defined(wasmConfig.wasmBinaryFile)) {
  2077. if (!when.defined(crnModule)) {
  2078. crnModule = self.Module;
  2079. }
  2080. crunch = crnModule;
  2081. initWorker();
  2082. } else {
  2083. crunch = crnModule;
  2084. initWorker();
  2085. }
  2086. });
  2087. }
  2088. return require([wasmConfig.modulePath], function (dracoModule) {
  2089. if (when.defined(wasmConfig.wasmBinaryFile)) {
  2090. if (!when.defined(dracoModule)) {
  2091. dracoModule = self.DracoDecoderModule;
  2092. }
  2093. dracoModule(wasmConfig).then(function (compiledModule) {
  2094. dracoLib = compiledModule;
  2095. initWorker();
  2096. });
  2097. } else {
  2098. dracoLib = dracoModule();
  2099. initWorker();
  2100. }
  2101. });
  2102. }
  2103. }
  2104. //export default createTaskProcessorWorker(S3MBTilesParser);
  2105. return S3MBTilesParser;
  2106. });