| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342 |
- /**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
- 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';
- /**
- * Create a shallow copy of an array from begin to end.
- *
- * @param {Array} array The array to fill.
- * @param {Number} [begin=0] The index to start at.
- * @param {Number} [end=array.length] The index to end at which is not included.
- *
- * @returns {Array} The resulting array.
- * @private
- */
- function arraySlice(array, begin, end) {
- //>>includeStart('debug', pragmas.debug);
- Check.Check.defined('array', array);
- if (when.defined(begin)) {
- Check.Check.typeOf.number('begin', begin);
- }
- if (when.defined(end)) {
- Check.Check.typeOf.number('end', end);
- }
- //>>includeEnd('debug');
- if (typeof array.slice === 'function') {
- return array.slice(begin, end);
- }
- var copy = Array.prototype.slice.call(array, begin, end);
- var typedArrayTypes = FeatureDetection.FeatureDetection.typedArrayTypes;
- var length = typedArrayTypes.length;
- for (var i = 0; i < length; ++i) {
- if (array instanceof typedArrayTypes[i]) {
- copy = new typedArrayTypes[i](copy);
- break;
- }
- }
- return copy;
- }
- function S3MDracoDecode() {
- }
- var draco;
- function decodeIndexArray(dracoGeometry, dracoDecoder) {
- var numPoints = dracoGeometry.num_points();
- var numFaces = dracoGeometry.num_faces();
- var faceIndices = new draco.DracoInt32Array();
- var numIndices = numFaces * 3;
- var indexArray = IndexDatatype.IndexDatatype.createTypedArray(numPoints, numIndices);
- var offset = 0;
- for (var i = 0; i < numFaces; ++i) {
- dracoDecoder.GetFaceFromMesh(dracoGeometry, i, faceIndices);
- indexArray[offset + 0] = faceIndices.GetValue(0);
- indexArray[offset + 1] = faceIndices.GetValue(1);
- indexArray[offset + 2] = faceIndices.GetValue(2);
- offset += 3;
- }
- var indexDataType = IndexDatatype.IndexDatatype.UNSIGNED_SHORT;
- if (indexArray instanceof Uint32Array) {
- indexDataType = IndexDatatype.IndexDatatype.UNSIGNED_INT;
- }
- draco.destroy(faceIndices);
- return {
- typedArray : indexArray,
- numberOfIndices : numIndices,
- indexDataType : indexDataType
- };
- }
- function decodeQuantizedDracoTypedArray(dracoGeometry, dracoDecoder, dracoAttribute, quantization, vertexArrayLength) {
- var vertexArray;
- var attributeData;
- if (quantization.quantizationBits <= 8) {
- attributeData = new draco.DracoUInt8Array();
- vertexArray = new Uint8Array(vertexArrayLength);
- dracoDecoder.GetAttributeUInt8ForAllPoints(dracoGeometry, dracoAttribute, attributeData);
- } else {
- attributeData = new draco.DracoUInt16Array();
- vertexArray = new Uint16Array(vertexArrayLength);
- dracoDecoder.GetAttributeUInt16ForAllPoints(dracoGeometry, dracoAttribute, attributeData);
- }
- for (var i = 0; i < vertexArrayLength; ++i) {
- vertexArray[i] = attributeData.GetValue(i);
- }
- draco.destroy(attributeData);
- return vertexArray;
- }
- function decodeDracoTypedArray(dracoGeometry, dracoDecoder, dracoAttribute, vertexArrayLength) {
- var vertexArray;
- var attributeData;
- // Some attribute types are casted down to 32 bit since Draco only returns 32 bit values
- switch (dracoAttribute.data_type()) {
- case 1: case 11: // DT_INT8 or DT_BOOL
- attributeData = new draco.DracoInt8Array();
- vertexArray = new Int8Array(vertexArrayLength);
- dracoDecoder.GetAttributeInt8ForAllPoints(dracoGeometry, dracoAttribute, attributeData);
- break;
- case 2: // DT_UINT8
- attributeData = new draco.DracoUInt8Array();
- vertexArray = new Uint8Array(vertexArrayLength);
- dracoDecoder.GetAttributeUInt8ForAllPoints(dracoGeometry, dracoAttribute, attributeData);
- break;
- case 3: // DT_INT16
- attributeData = new draco.DracoInt16Array();
- vertexArray = new Int16Array(vertexArrayLength);
- dracoDecoder.GetAttributeInt16ForAllPoints(dracoGeometry, dracoAttribute, attributeData);
- break;
- case 4: // DT_UINT16
- attributeData = new draco.DracoUInt16Array();
- vertexArray = new Uint16Array(vertexArrayLength);
- dracoDecoder.GetAttributeUInt16ForAllPoints(dracoGeometry, dracoAttribute, attributeData);
- break;
- case 5: case 7: // DT_INT32 or DT_INT64
- attributeData = new draco.DracoInt32Array();
- vertexArray = new Int32Array(vertexArrayLength);
- dracoDecoder.GetAttributeInt32ForAllPoints(dracoGeometry, dracoAttribute, attributeData);
- break;
- case 6: case 8: // DT_UINT32 or DT_UINT64
- attributeData = new draco.DracoUInt32Array();
- vertexArray = new Uint32Array(vertexArrayLength);
- dracoDecoder.GetAttributeUInt32ForAllPoints(dracoGeometry, dracoAttribute, attributeData);
- break;
- case 9: case 10: // DT_FLOAT32 or DT_FLOAT64
- attributeData = new draco.DracoFloat32Array();
- vertexArray = new Float32Array(vertexArrayLength);
- dracoDecoder.GetAttributeFloatForAllPoints(dracoGeometry, dracoAttribute, attributeData);
- break;
- }
- for (var i = 0; i < vertexArrayLength; ++i) {
- vertexArray[i] = attributeData.GetValue(i);
- }
- draco.destroy(attributeData);
- return vertexArray;
- }
- function decodeAttribute(dracoGeometry, dracoDecoder, dracoAttribute) {
- var numPoints = dracoGeometry.num_points();
- var numComponents = dracoAttribute.num_components();
- var quantization;
- var transform = new draco.AttributeQuantizationTransform();
- if (transform.InitFromAttribute(dracoAttribute)) {
- var minValues = new Array(numComponents);
- for (var i = 0; i < numComponents; ++i) {
- minValues[i] = transform.min_value(i);
- }
- quantization = {
- quantizationBits : transform.quantization_bits(),
- minValues : minValues,
- range : transform.range(),
- octEncoded : false
- };
- }
- draco.destroy(transform);
- transform = new draco.AttributeOctahedronTransform();
- if (transform.InitFromAttribute(dracoAttribute)) {
- quantization = {
- quantizationBits : transform.quantization_bits(),
- octEncoded : true
- };
- }
- draco.destroy(transform);
- var vertexArrayLength = numPoints * numComponents;
- var vertexArray;
- if (when.defined(quantization)) {
- vertexArray = decodeQuantizedDracoTypedArray(dracoGeometry, dracoDecoder, dracoAttribute, quantization, vertexArrayLength);
- } else {
- vertexArray = decodeDracoTypedArray(dracoGeometry, dracoDecoder, dracoAttribute, vertexArrayLength);
- }
- var componentDatatype = ComponentDatatype.ComponentDatatype.fromTypedArray(vertexArray);
- return {
- array : vertexArray,
- data : {
- componentsPerAttribute : numComponents,
- componentDatatype : componentDatatype,
- byteOffset : dracoAttribute.byte_offset(),
- byteStride : ComponentDatatype.ComponentDatatype.getSizeInBytes(componentDatatype) * numComponents,
- normalized : dracoAttribute.normalized(),
- quantization : quantization
- }
- };
- }
- function decodeAllAttributes(dracoGeometry, dracoDecoder, vertexPackage, vertexUniqueIDs){
- var attributes = vertexPackage.vertexAttributes;
- var attrLocation = vertexPackage.attrLocation;
- vertexPackage.nCompressOptions = 0;
- if(when.defined(vertexUniqueIDs.posUniqueID) && vertexUniqueIDs.posUniqueID >= 0){
- vertexPackage.nCompressOptions |= S3MCompressType.VertexCompressOption.SVC_Vertex;
- var posAttribute = dracoDecoder.GetAttribute(dracoGeometry, vertexUniqueIDs.posUniqueID);
- var posAttributeData = decodeAttribute(dracoGeometry, dracoDecoder, posAttribute);
- var componentsPerAttribute = posAttributeData.data.componentsPerAttribute;
- vertexPackage.verticesCount = posAttributeData.array.length / componentsPerAttribute;
- vertexPackage.vertCompressConstant = posAttributeData.data.quantization.range / (1 << posAttributeData.data.quantization.quantizationBits);
- var minValuesArray = posAttributeData.data.quantization.minValues;
- vertexPackage.minVerticesValue = new Cartesian4.Cartesian4(minValuesArray[0], minValuesArray[1], minValuesArray[2], 1.0);
- if(componentsPerAttribute > 3){
- vertexPackage.minVerticesValue.w = minValuesArray[3];
- }
- attrLocation['aPosition'] = attributes.length;
- attributes.push({
- index: attrLocation['aPosition'],
- typedArray: posAttributeData.array,
- componentsPerAttribute: componentsPerAttribute,
- componentDatatype: posAttributeData.data.componentDatatype,
- offsetInBytes: posAttributeData.data.byteOffset,
- strideInBytes: posAttributeData.data.byteStride,
- normalize: posAttributeData.data.normalized
- });
- }
- if(when.defined(vertexUniqueIDs.normalUniqueID) && vertexUniqueIDs.normalUniqueID >= 0){
- vertexPackage.nCompressOptions |= S3MCompressType.VertexCompressOption.SVC_Normal;
- var normalAttribute = dracoDecoder.GetAttribute(dracoGeometry, vertexUniqueIDs.normalUniqueID);
- var normalAttributeData = decodeAttribute(dracoGeometry, dracoDecoder, normalAttribute);
- var normalQuantization = normalAttributeData.data.quantization;
- vertexPackage.normalRangeConstant = (1 << normalQuantization.quantizationBits) - 1.0;
- attrLocation['aNormal'] = attributes.length;
- attributes.push({
- index: attrLocation['aNormal'],
- typedArray: normalAttributeData.array,
- componentsPerAttribute: normalAttributeData.data.componentsPerAttribute,
- componentDatatype: normalAttributeData.data.componentDatatype,
- offsetInBytes: normalAttributeData.data.byteOffset,
- strideInBytes: normalAttributeData.data.byteStride,
- normalize: normalAttributeData.data.normalized
- });
- }
- if(when.defined(vertexUniqueIDs.colorUniqueID) && vertexUniqueIDs.colorUniqueID >= 0){
- vertexPackage.nCompressOptions |= S3MCompressType.VertexCompressOption.SVC_VertexColor;
- var colorAttribute = dracoDecoder.GetAttribute(dracoGeometry, vertexUniqueIDs.colorUniqueID);
- var colorAttributeData = decodeAttribute(dracoGeometry, dracoDecoder, colorAttribute);
- attrLocation['aColor'] = attributes.length;
- attributes.push({
- index: attrLocation['aColor'],
- typedArray: colorAttributeData.array,
- componentsPerAttribute: colorAttributeData.data.componentsPerAttribute,
- componentDatatype: colorAttributeData.data.componentDatatype,
- offsetInBytes: colorAttributeData.data.byteOffset,
- strideInBytes: colorAttributeData.data.byteStride,
- normalize: colorAttributeData.data.normalized
- });
- }
- for(var i = 0 ; i < vertexUniqueIDs.texCoordUniqueIDs.length; i++){
- vertexPackage.texCoordCompressConstant = [];
- vertexPackage.minTexCoordValue = [];
- var texCoordUniqueID = vertexUniqueIDs.texCoordUniqueIDs[i];
- if(texCoordUniqueID < 0){
- continue;
- }
- var texCoordAttribute = dracoDecoder.GetAttribute(dracoGeometry, texCoordUniqueID);
- var texAttributeData = decodeAttribute(dracoGeometry, dracoDecoder, texCoordAttribute);
- if(when.defined(texAttributeData.data.quantization)){
- vertexPackage.nCompressOptions |= S3MCompressType.VertexCompressOption.SVC_TexutreCoord;
- vertexPackage.texCoordCompressConstant.push(texAttributeData.data.quantization.range / (1 << texAttributeData.data.quantization.quantizationBits));
- var minValuesArray = texAttributeData.data.quantization.minValues;
- vertexPackage.minTexCoordValue.push(new Cartesian2.Cartesian2(minValuesArray[0], minValuesArray[1]));
- }
- var attName = 'aTexCoord' + i;
- attrLocation[attName] = attributes.length;
- attributes.push({
- index: attrLocation[attName],
- typedArray: texAttributeData.array,
- componentsPerAttribute: texAttributeData.data.componentsPerAttribute,
- componentDatatype: texAttributeData.data.componentDatatype,
- offsetInBytes: texAttributeData.data.byteOffset,
- strideInBytes: texAttributeData.data.byteStride,
- normalize: texAttributeData.data.normalized
- });
- }
- }
- S3MDracoDecode.dracoDecodePointCloud = function(dracoLib, dataBuffer, byteLength, vertexPackage, vertexUniqueIDs){
- draco = dracoLib;
- var dracoDecoder = new draco.Decoder();
- // Skip all parameter types except generic
- var attributesToSkip = ['POSITION', 'NORMAL', 'COLOR'];
- for (var i = 0; i < attributesToSkip.length; ++i) {
- dracoDecoder.SkipAttributeTransform(draco[attributesToSkip[i]]);
- }
- var buffer = new draco.DecoderBuffer();
- buffer.Init(dataBuffer, byteLength);
- var geometryType = dracoDecoder.GetEncodedGeometryType(buffer);
- if (geometryType !== draco.POINT_CLOUD) {
- throw new RuntimeError.RuntimeError('Draco geometry type must be POINT_CLOUD.');
- }
- var dracoPointCloud = new draco.PointCloud();
- var decodingStatus = dracoDecoder.DecodeBufferToPointCloud(buffer, dracoPointCloud);
- if (!decodingStatus.ok() || dracoPointCloud.ptr === 0) {
- throw new RuntimeError.RuntimeError('Error decoding draco point cloud: ' + decodingStatus.error_msg());
- }
- draco.destroy(buffer);
- decodeAllAttributes(dracoPointCloud, dracoDecoder, vertexPackage, vertexUniqueIDs);
- draco.destroy(dracoPointCloud);
- draco.destroy(dracoDecoder);
- };
- S3MDracoDecode.dracoDecodeMesh = function(dracoLib, dataBuffer, byteLength, vertexPackage, indexPackage, vertexUniqueIDs){
- draco = dracoLib;
- var dracoDecoder = new draco.Decoder();
- // Skip all parameter types except generic
- var attributesToSkip = ['POSITION', 'NORMAL', 'COLOR', 'TEX_COORD'];
- for (var i = 0; i < attributesToSkip.length; ++i) {
- dracoDecoder.SkipAttributeTransform(draco[attributesToSkip[i]]);
- }
- var buffer = new draco.DecoderBuffer();
- buffer.Init(dataBuffer, byteLength);
- var geometryType = dracoDecoder.GetEncodedGeometryType(buffer);
- if (geometryType !== draco.TRIANGULAR_MESH) {
- throw new RuntimeError.RuntimeError('Unsupported draco mesh geometry type.');
- }
- var dracoGeometry = new draco.Mesh();
- var decodingStatus = dracoDecoder.DecodeBufferToMesh(buffer, dracoGeometry);
- if (!decodingStatus.ok() || dracoGeometry.ptr === 0) {
- throw new RuntimeError.RuntimeError('Error decoding draco mesh geometry: ' + decodingStatus.error_msg());
- }
- draco.destroy(buffer);
- decodeAllAttributes(dracoGeometry, dracoDecoder, vertexPackage, vertexUniqueIDs);
- var indexArray = decodeIndexArray(dracoGeometry, dracoDecoder);
- indexPackage.indicesTypedArray = indexArray.typedArray;
- indexPackage.indicesCount = indexArray.numberOfIndices;
- indexPackage.indexType = indexArray.indexDataType;
- indexPackage.primitiveType = PrimitiveType.PrimitiveType.TRIANGLES;
- draco.destroy(dracoGeometry);
- draco.destroy(dracoDecoder);
- };
- var VERSION = {
- S3M : 49,
- S3M4 : 1
- };
- var S3MVersion = Object.freeze(VERSION);
- var CRN_FORMAT = {
- cCRNFmtInvalid: -1,
- cCRNFmtDXT1: 0,
- // cCRNFmtDXT3 is not currently supported when writing to CRN - only DDS.
- cCRNFmtDXT3: 1,
- cCRNFmtDXT5: 2
- // Crunch supports more formats than this, but we can't use them here.
- };
- // Mapping of Crunch formats to DXT formats.
- var DXT_FORMAT_MAP = {};
- DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT1] = PixelFormat.PixelFormat.RGB_DXT1;
- DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT3] = PixelFormat.PixelFormat.RGBA_DXT3;
- DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT5] = PixelFormat.PixelFormat.RGBA_DXT5;
- var dst;
- var dxtData;
- var cachedDstSize = 0;
- var crunch;
- var crunchInitialized = false;
- // Copy an array of bytes into or out of the emscripten heap.
- function arrayBufferCopy(src, dst, dstByteOffset, numBytes) {
- var i;
- var dst32Offset = dstByteOffset / 4;
- var tail = (numBytes % 4);
- var src32 = new Uint32Array(src.buffer, 0, (numBytes - tail) / 4);
- var dst32 = new Uint32Array(dst.buffer);
- for (i = 0; i < src32.length; i++) {
- dst32[dst32Offset + i] = src32[i];
- }
- for (i = numBytes - tail; i < numBytes; i++) {
- dst[dstByteOffset + i] = src[i];
- }
- }
- /**
- * @private
- */
- function convertCRNToDXT(parameters, transferableObjects) {
- // Copy the contents of the arrayBuffer into emscriptens heap.
- var arrayBuffer = parameters.data;
- var srcSize = arrayBuffer.byteLength;
- var bytes = new Uint8Array(arrayBuffer);
- var src = crunch._malloc(srcSize);
- arrayBufferCopy(bytes, crunch.HEAPU8, src, srcSize);
- // Determine what type of compressed data the file contains.
- var crnFormat = crunch._crn_get_dxt_format(src, srcSize);
- var format = DXT_FORMAT_MAP[crnFormat];
- if (!when.defined(format)) {
- throw new RuntimeError.RuntimeError('Unsupported compressed format.');
- }
- // Gather basic metrics about the DXT data.
- var levels = crunch._crn_get_levels(src, srcSize);
- var width = crunch._crn_get_width(src, srcSize);
- var height = crunch._crn_get_height(src, srcSize);
- // Determine the size of the decoded DXT data.
- var dstSize = 0;
- var i;
- for (i = 0; i < levels; ++i) {
- dstSize += PixelFormat.PixelFormat.compressedTextureSizeInBytes(format, width >> i, height >> i);
- }
- // Allocate enough space on the emscripten heap to hold the decoded DXT data
- // or reuse the existing allocation if a previous call to this function has
- // already acquired a large enough buffer.
- if(cachedDstSize < dstSize) {
- if(when.defined(dst)) {
- crunch._free(dst);
- }
- dst = crunch._malloc(dstSize);
- dxtData = new Uint8Array(crunch.HEAPU8.buffer, dst, dstSize);
- cachedDstSize = dstSize;
- }
- // Decompress the DXT data from the Crunch file into the allocated space.
- crunch._crn_decompress(src, srcSize, dst, dstSize, 0, levels);
- // Release the crunch file data from the emscripten heap.
- crunch._free(src);
- var bOutMipMapData = when.defaultValue(parameters.bMipMap, false);
- if(bOutMipMapData){
- var dXTDataMipMap = dxtData.slice(0, dstSize);
- transferableObjects.push(dXTDataMipMap.buffer);
- return new PixelFormat.CompressedTextureBuffer(format, width, height, dXTDataMipMap);
- }
- else {
- // Mipmaps are unsupported, so copy the level 0 texture
- // When mipmaps are supported, a copy will still be necessary as dxtData is a view on the heap.
- var length = PixelFormat.PixelFormat.compressedTextureSizeInBytes(format, width, height);
- // Get a copy of the 0th mip level. dxtData will exceed length when there are more mip levels.
- // Equivalent to dxtData.slice(0, length), which is not supported in IE11
- var level0DXTDataView = dxtData.subarray(0, length);
- var level0DXTData = new Uint8Array(length);
- level0DXTData.set(level0DXTDataView, 0);
- transferableObjects.push(level0DXTData.buffer);
- return new PixelFormat.CompressedTextureBuffer(format, width, height, level0DXTData);
- }
- }
- var S3MBVertexOptions = {
- SVO_HasInstSelInfo: 1
- };
- var S3MBVertexTag = {
- SV_Unkown: 0,
- SV_Standard: 1,
- SV_Compressed: 2,
- SV_DracoCompressed: 3
- };
- var dracoLib;
- var colorScratch = new Color.Color();
- var CLAMP_GROUND_LINE_PASS_NAME = "ClampGroundAndObjectLinePass";
- var unzipwasmReady = false;
- if (when.defined(unzip.unzip)) {
- unzip.unzip.onRuntimeInitialized = function () {
- unzipwasmReady = true;
- };
- var unzipwasm = unzip.unzip.cwrap('unzip', 'number', ['number', 'number', 'number', 'number']);
- var freec = unzip.unzip.cwrap('freePointer', null, ['number']);
- }
- function Bound3D(left,bottom,right,top,minHeight,maxHeight){
- this.left = left;
- this.bottom = bottom;
- this.right = right;
- this.top = top;
- this.minHeight = minHeight;
- this.maxHeight = maxHeight;
- this.width = right-left;
- this.length = top - bottom;
- this.height = maxHeight - minHeight;
- }
- function loadStream(dataView, dataBuffer, byteOffset) {
- var newByteOffset = byteOffset;
- var streamSize = dataView.getUint32(newByteOffset, true);
- newByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var bufferByteOffset = newByteOffset;
- var buffer = new Uint8Array(dataBuffer, newByteOffset, streamSize);
- newByteOffset += streamSize * Uint8Array.BYTES_PER_ELEMENT;
- return {
- dataViewByteOffset: bufferByteOffset,
- byteOffset: newByteOffset,
- buffer: buffer
- };
- }
- function loadString(dataView, viewByteOffset, typedArray, bufferByteOffset) {
- var stringLength = dataView.getUint32(bufferByteOffset + viewByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var stringBuffer = typedArray.subarray(bufferByteOffset, bufferByteOffset + stringLength);
- var strResult = S3MCompressType.getStringFromTypedArray(stringBuffer);
- bufferByteOffset += stringLength;
- return {
- string: strResult,
- bytesOffset: bufferByteOffset
- }
- }
- function loadTexCoord(view, typedArray, bufferByteOffset, viewByteOffset, vertexPackage, isOldVersion) {
- var newBytesOffset = bufferByteOffset;
- var nTexCount = view.getUint16(bufferByteOffset + viewByteOffset, true);
- newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
- if (!isOldVersion) {
- newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
- }
- for (var i = 0; i < nTexCount; i++) {
- var nTexCoordCount = view.getUint32(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
- var nDimension = view.getUint16(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
- var nTexCoordStride = view.getUint16(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
- if (nDimension == 20 || nDimension == 35) ;
- else {
- var byteLength = nTexCoordCount * nDimension * Float32Array.BYTES_PER_ELEMENT;
- var texCoordBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
- newBytesOffset += byteLength;
- var str = 'aTexCoord' + i;
- var attributes = vertexPackage.vertexAttributes;
- var attrLocation = vertexPackage.attrLocation;
- attrLocation[str] = attributes.length;
- attributes.push({
- index: attrLocation[str],
- typedArray: texCoordBuffer,
- componentsPerAttribute: nDimension,
- componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
- offsetInBytes: 0,
- strideInBytes: nDimension * Float32Array.BYTES_PER_ELEMENT,
- normalize: false
- });
- }
- }
- return {
- bytesOffset: newBytesOffset
- };
- }
- function loadCompressTexCoord(view, typedArray, bufferByteOffset, viewByteOffset, vertexPackage) {
- vertexPackage.texCoordCompressConstant = [];
- vertexPackage.minTexCoordValue = [];
- var newBytesOffset = bufferByteOffset;
- var nTexCount = view.getUint16(bufferByteOffset + viewByteOffset, true);
- newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
- newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
- var texIndex = 0;
- for (var i = 0; i < nTexCount; i++) {
- var bNeedTexCoordZ = view.getUint8(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Uint8Array.BYTES_PER_ELEMENT;
- newBytesOffset += Uint8Array.BYTES_PER_ELEMENT * 3;
- var nTexCoordCount = view.getUint32(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
- var nDimension = view.getUint16(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
- var nTexCoordStride = view.getUint16(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
- var texCoordCompressConstant = view.getFloat32(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
- vertexPackage.texCoordCompressConstant.push(texCoordCompressConstant);
- var minTexCoordValue = new Cartesian4.Cartesian4();
- minTexCoordValue.x = view.getFloat32(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
- minTexCoordValue.y = view.getFloat32(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
- minTexCoordValue.z = view.getFloat32(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
- minTexCoordValue.w = view.getFloat32(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
- vertexPackage.minTexCoordValue.push(minTexCoordValue);
- var byteLength = nTexCoordCount * nDimension * Int16Array.BYTES_PER_ELEMENT;
- var texCoordBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
- newBytesOffset += byteLength;
- var align = newBytesOffset % 4;
- if (align !== 0) {
- newBytesOffset += (4 - align);
- }
- var str = 'aTexCoord' + texIndex;
- var attributes = vertexPackage.vertexAttributes;
- var attrLocation = vertexPackage.attrLocation;
- attrLocation[str] = attributes.length;
- attributes.push({
- index: attrLocation[str],
- typedArray: texCoordBuffer,
- componentsPerAttribute: nDimension,
- componentDatatype: ComponentDatatype.ComponentDatatype.SHORT,
- offsetInBytes: 0,
- strideInBytes: nDimension * Int16Array.BYTES_PER_ELEMENT,
- normalize: false
- });
- if (bNeedTexCoordZ) {
- byteLength = nTexCoordCount * Float32Array.BYTES_PER_ELEMENT;
- var texCoordZBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
- newBytesOffset += byteLength;
- vertexPackage.texCoordZMatrix = true;
- str = 'aTexCoordZ' + texIndex;
- attrLocation[str] = attributes.length;
- attributes.push({
- index: attrLocation[str],
- typedArray: texCoordZBuffer,
- componentsPerAttribute: 1,
- componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
- offsetInBytes: 0,
- strideInBytes: Float32Array.BYTES_PER_ELEMENT,
- normalize: false
- });
- }
- texIndex++;
- }
- return {
- bytesOffset: newBytesOffset
- };
- }
- function loadInstanceInfo(view, typedArray, bufferByteOffset, viewByteOffset, vertexPackage) {
- var newBytesOffset = bufferByteOffset;
- var nInstanceInfo = view.getUint16(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
- newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
- var attributes = vertexPackage.vertexAttributes;
- var attrLocation = vertexPackage.attrLocation;
- for (var iIndex = 0; iIndex < nInstanceInfo; iIndex++) {
- var nTexCoordCount = view.getUint32(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
- var nTexDimensions = view.getUint16(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
- var nTexCoordStride = view.getUint16(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
- var byteLength = nTexCoordCount * nTexDimensions * Float32Array.BYTES_PER_ELEMENT;
- if (nTexDimensions === 17 || nTexDimensions === 29) {
- var instanceBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
- vertexPackage.instanceCount = nTexCoordCount;
- vertexPackage.instanceMode = nTexDimensions;
- vertexPackage.instanceBuffer = instanceBuffer;
- vertexPackage.instanceIndex = 1;
- var byteStride;
- if (nTexDimensions === 17) {
- byteStride = Float32Array.BYTES_PER_ELEMENT * 17;
- attrLocation['uv2'] = attributes.length;
- attributes.push({
- index: attrLocation['uv2'],
- componentsPerAttribute: 4,
- componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
- normalize: false,
- offsetInBytes: 0,
- strideInBytes: byteStride,
- instanceDivisor: 1
- });
- attrLocation['uv3'] = attributes.length;
- attributes.push({
- index: attrLocation['uv3'],
- componentsPerAttribute: 4,
- componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
- normalize: false,
- offsetInBytes: 4 * Float32Array.BYTES_PER_ELEMENT,
- strideInBytes: byteStride,
- instanceDivisor: 1
- });
- attrLocation['uv4'] = attributes.length;
- attributes.push({
- index: attrLocation['uv4'],
- componentsPerAttribute: 4,
- componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
- normalize: false,
- offsetInBytes: 8 * Float32Array.BYTES_PER_ELEMENT,
- strideInBytes: byteStride,
- instanceDivisor: 1
- });
- attrLocation['secondary_colour'] = attributes.length;
- attributes.push({
- index: attrLocation['secondary_colour'],
- componentsPerAttribute: 4,
- componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
- normalize: false,
- offsetInBytes: 12 * Float32Array.BYTES_PER_ELEMENT,
- strideInBytes: byteStride,
- instanceDivisor: 1
- });
- attrLocation['uv6'] = attributes.length;
- attributes.push({
- index: attrLocation['uv6'],
- componentsPerAttribute: 4,
- componentDatatype: ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
- normalize: true,
- offsetInBytes: 16 * Float32Array.BYTES_PER_ELEMENT,
- strideInBytes: byteStride,
- instanceDivisor: 1
- });
- }
- else if (nTexDimensions === 29) {
- byteStride = Float32Array.BYTES_PER_ELEMENT * 29;
- attrLocation['uv1'] = attributes.length;
- attributes.push({
- index: attrLocation['uv1'],
- componentsPerAttribute: 4,
- componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
- normalize: false,
- offsetInBytes: 0,
- strideInBytes: byteStride,
- instanceDivisor: 1,
- byteLength: byteLength
- });
- attrLocation['uv2'] = attributes.length;
- attributes.push({
- index: attrLocation['uv2'],
- componentsPerAttribute: 4,
- componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
- normalize: false,
- offsetInBytes: 4 * Float32Array.BYTES_PER_ELEMENT,
- strideInBytes: byteStride,
- instanceDivisor: 1
- });
- attrLocation['uv3'] = attributes.length;
- attributes.push({
- index: attrLocation['uv3'],
- componentsPerAttribute: 4,
- componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
- normalize: false,
- offsetInBytes: 8 * Float32Array.BYTES_PER_ELEMENT,
- strideInBytes: byteStride,
- instanceDivisor: 1
- });
- attrLocation['uv4'] = attributes.length;
- attributes.push({
- index: attrLocation['uv4'],
- componentsPerAttribute: 4,
- componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
- normalize: false,
- offsetInBytes: 12 * Float32Array.BYTES_PER_ELEMENT,
- strideInBytes: byteStride,
- instanceDivisor: 1
- });
- attrLocation['uv5'] = attributes.length;
- attributes.push({
- index: attrLocation['uv5'],
- componentsPerAttribute: 4,
- componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
- normalize: false,
- offsetInBytes: 16 * Float32Array.BYTES_PER_ELEMENT,
- strideInBytes: byteStride,
- instanceDivisor: 1
- });
- attrLocation['uv6'] = attributes.length;
- attributes.push({
- index: attrLocation['uv6'],
- componentsPerAttribute: 4,
- componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
- normalize: false,
- offsetInBytes: 20 * Float32Array.BYTES_PER_ELEMENT,
- strideInBytes: byteStride,
- instanceDivisor: 1
- });
- attrLocation['uv7'] = attributes.length;
- attributes.push({
- index: attrLocation['uv7'],
- componentsPerAttribute: 3,
- componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
- normalize: false,
- offsetInBytes: 24 * Float32Array.BYTES_PER_ELEMENT,
- strideInBytes: byteStride,
- instanceDivisor: 1
- });
- attrLocation['secondary_colour'] = attributes.length;
- attributes.push({
- index: attrLocation['secondary_colour'],
- componentsPerAttribute: 4,
- componentDatatype: ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
- normalize: true,
- offsetInBytes: 27 * Float32Array.BYTES_PER_ELEMENT,
- strideInBytes: byteStride,
- instanceDivisor: 1
- });
- attrLocation['uv9'] = attributes.length;
- attributes.push({
- index: attrLocation['uv9'],
- componentsPerAttribute: 4,
- componentDatatype: ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
- normalize: true,
- offsetInBytes: 28 * Float32Array.BYTES_PER_ELEMENT,
- strideInBytes: byteStride,
- instanceDivisor: 1
- });
- }
- }
- else {
- var valueCount = nTexCoordCount * nTexDimensions;
- vertexPackage.instanceBounds = new Float32Array(valueCount);
- for (var k = 0; k < valueCount; k++) {
- vertexPackage.instanceBounds[k] = view.getFloat32(newBytesOffset + viewByteOffset + k * Float32Array.BYTES_PER_ELEMENT, true);
- }
- }
- newBytesOffset += byteLength;
- }
- return {
- bytesOffset: newBytesOffset
- };
- }
- function loadVertex(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage) {
- var newBytesOffset = bufferByteOffset;
- var nVerticesCount = view.getUint32(newBytesOffset + viewByteOffset, true);
- vertexPackage.verticesCount = nVerticesCount;
- newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
- if (nVerticesCount <= 0) {
- return {
- bytesOffset: newBytesOffset
- };
- }
- var nVertexDimension = view.getUint16(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
- var nVertexStride = view.getUint16(newBytesOffset + viewByteOffset, true);
- nVertexStride = nVertexDimension * Float32Array.BYTES_PER_ELEMENT;
- newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
- var byteLength = nVerticesCount * nVertexDimension * Float32Array.BYTES_PER_ELEMENT;
- var vertexBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
- newBytesOffset += byteLength;
- var attributes = vertexPackage.vertexAttributes;
- var attrLocation = vertexPackage.attrLocation;
- attrLocation['aPosition'] = attributes.length;
- attributes.push({
- index: attrLocation['aPosition'],
- typedArray: vertexBuffer,
- componentsPerAttribute: nVertexDimension,
- componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
- offsetInBytes: 0,
- strideInBytes: nVertexStride,
- normalize: false
- });
- return {
- bytesOffset: newBytesOffset
- }
- }
- function loadCompressVertex(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage) {
- var newBytesOffset = bufferByteOffset;
- var nVerticesCount = view.getUint32(newBytesOffset + viewByteOffset, true);
- vertexPackage.verticesCount = nVerticesCount;
- newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
- if (nVerticesCount <= 0) {
- return {
- bytesOffset: newBytesOffset
- };
- }
- var nVertexDimension = view.getUint16(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
- var nVertexStride = view.getUint16(newBytesOffset + viewByteOffset, true);
- nVertexStride = nVertexDimension * Int16Array.BYTES_PER_ELEMENT;
- newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
- var fVertCompressConstant = view.getFloat32(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
- var minVerticesValue = new Cartesian4.Cartesian4();
- minVerticesValue.x = view.getFloat32(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
- minVerticesValue.y = view.getFloat32(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
- minVerticesValue.z = view.getFloat32(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
- minVerticesValue.w = view.getFloat32(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
- vertexPackage.vertCompressConstant = fVertCompressConstant;
- vertexPackage.minVerticesValue = minVerticesValue;
- var byteLength = nVerticesCount * nVertexDimension * Int16Array.BYTES_PER_ELEMENT;
- var vertexBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
- newBytesOffset += byteLength;
- var attributes = vertexPackage.vertexAttributes;
- var attrLocation = vertexPackage.attrLocation;
- attrLocation['aPosition'] = attributes.length;
- attributes.push({
- index: attrLocation['aPosition'],
- typedArray: vertexBuffer,
- componentsPerAttribute: nVertexDimension,
- componentDatatype: ComponentDatatype.ComponentDatatype.SHORT,
- offsetInBytes: 0,
- strideInBytes: nVertexStride,
- normalize: false
- });
- return {
- bytesOffset: newBytesOffset
- }
- }
- function loadNormal(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage) {
- var newBytesOffset = bufferByteOffset;
- var nNormalCount = view.getUint32(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
- if (nNormalCount <= 0) {
- return {
- bytesOffset: newBytesOffset
- };
- }
- var nNormalDimension = view.getUint16(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
- var nNormalStride = view.getUint16(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
- var byteLength = nNormalCount * nNormalDimension * Float32Array.BYTES_PER_ELEMENT;
- var normalBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
- newBytesOffset += byteLength;
- if (!vertexPackage.ignoreNormal) {
- var attributes = vertexPackage.vertexAttributes;
- var attrLocation = vertexPackage.attrLocation;
- attrLocation['aNormal'] = attributes.length;
- attributes.push({
- index: attrLocation['aNormal'],
- typedArray: normalBuffer,
- componentsPerAttribute: nNormalDimension,
- componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
- offsetInBytes: 0,
- strideInBytes: nNormalStride,
- normalize: false
- });
- }
- return {
- bytesOffset: newBytesOffset
- }
- }
- function loadCompressNormal(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage) {
- var newBytesOffset = bufferByteOffset;
- var nNormalCount = view.getUint32(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
- if (nNormalCount <= 0) {
- return {
- bytesOffset: newBytesOffset
- };
- }
- var nNormalDimension = view.getUint16(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
- var nNormalStride = view.getUint16(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
- var byteLength = nNormalCount * 2 * Int16Array.BYTES_PER_ELEMENT;
- var normalBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
- newBytesOffset += byteLength;
- if (!vertexPackage.ignoreNormal) {
- var attributes = vertexPackage.vertexAttributes;
- var attrLocation = vertexPackage.attrLocation;
- attrLocation['aNormal'] = attributes.length;
- attributes.push({
- index: attrLocation['aNormal'],
- typedArray: normalBuffer,
- componentsPerAttribute: 2,
- componentDatatype: ComponentDatatype.ComponentDatatype.SHORT,
- offsetInBytes: 0,
- strideInBytes: nNormalStride,
- normalize: false
- });
- }
- return {
- bytesOffset: newBytesOffset
- }
- }
- function loadVertexColor(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage) {
- var newBytesOffset = bufferByteOffset;
- var nColorCount = view.getUint32(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
- var verticesCount = vertexPackage.verticesCount;
- var vertexColor;
- if (nColorCount > 0) {
- var colorStride = view.getUint16(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
- newBytesOffset += Uint8Array.BYTES_PER_ELEMENT * 2;
- var byteLength = nColorCount * Uint8Array.BYTES_PER_ELEMENT * 4;
- vertexColor = arraySlice(typedArray, newBytesOffset, newBytesOffset + byteLength);
- newBytesOffset += byteLength;
- var attributes = vertexPackage.vertexAttributes;
- var attrLocation = vertexPackage.attrLocation;
- attrLocation['aColor'] = attributes.length;
- attributes.push({
- index: attrLocation['aColor'],
- typedArray: vertexColor,
- componentsPerAttribute: 4,
- componentDatatype: ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
- offsetInBytes: 0,
- strideInBytes: 4,
- normalize: true
- });
- }
- return {
- bytesOffset: newBytesOffset
- };
- }
- function loadSecondColor(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage) {
- var newBytesOffset = bufferByteOffset;
- var nSecondColorCount = view.getUint32(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
- if (nSecondColorCount <= 0) {
- return {
- bytesOffset: newBytesOffset
- };
- }
- var secondColorStride = view.getUint16(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
- newBytesOffset += Uint8Array.BYTES_PER_ELEMENT * 2;
- var byteLength = nSecondColorCount * Uint8Array.BYTES_PER_ELEMENT * 4;
- newBytesOffset += byteLength;
- return {
- bytesOffset: newBytesOffset
- };
- }
- function loadIndexPackage(typedArray, view, viewByteOffset, bufferByteOffset) {
- var newBytesOffset = bufferByteOffset;
- var arrIndexPackage = [];
- var nIndexPackageCount = view.getUint32(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
- for (var k = 0; k < nIndexPackageCount; k++) {
- var indexPackage = {};
- var nIndexCount = view.getUint32(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
- var enIndexType = view.getUint8(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Uint8Array.BYTES_PER_ELEMENT;
- var bUseIndex = view.getUint8(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Uint8Array.BYTES_PER_ELEMENT;
- var operationType = view.getUint8(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Uint8Array.BYTES_PER_ELEMENT;
- newBytesOffset += Uint8Array.BYTES_PER_ELEMENT;
- if (nIndexCount > 0) {
- var byteLength = 0;
- var indexBuffer = null;
- if (enIndexType === 1 || enIndexType === 3) {
- byteLength = nIndexCount * Uint32Array.BYTES_PER_ELEMENT;
- indexBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
- }
- else {
- byteLength = nIndexCount * Uint16Array.BYTES_PER_ELEMENT;
- indexBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
- if (nIndexCount % 2 != 0) {
- byteLength += 2;
- }
- }
- indexPackage.indicesTypedArray = indexBuffer;
- newBytesOffset += byteLength;
- }
- indexPackage.indicesCount = nIndexCount;
- indexPackage.indexType = enIndexType;
- indexPackage.primitiveType = operationType;
- var arrPassName = [];
- var nPassNameCount = view.getUint32(newBytesOffset + viewByteOffset, true);
- newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
- for (var passIndex = 0; passIndex < nPassNameCount; passIndex++) {
- var res = loadString(view, viewByteOffset, typedArray, newBytesOffset);
- var strPassName = res.string;
- newBytesOffset = res.bytesOffset;
- arrPassName.push(strPassName);
- indexPackage.materialCode = strPassName;
- }
- arrIndexPackage.push(indexPackage);
- var align = newBytesOffset % 4;
- if (align !== 0) {
- var nReserved = 4 - newBytesOffset % 4;
- newBytesOffset += nReserved;
- }
- }
- return {
- bytesOffset: newBytesOffset,
- arrIndexPackage: arrIndexPackage
- };
- }
- function loadCompressSkeleton(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage, isOldVersion) {
- var newBytesOffset = bufferByteOffset;
- var nCompressOptions = view.getUint32(newBytesOffset + viewByteOffset, true);
- vertexPackage.nCompressOptions = nCompressOptions;
- var result;
- newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
- if ((nCompressOptions & S3MCompressType.VertexCompressOption.SVC_Vertex) == S3MCompressType.VertexCompressOption.SVC_Vertex) {
- result = loadCompressVertex(typedArray, view, viewByteOffset, newBytesOffset, vertexPackage);
- newBytesOffset = result.bytesOffset;
- }
- else {
- result = loadVertex(typedArray, view, viewByteOffset, newBytesOffset, vertexPackage);
- newBytesOffset = result.bytesOffset;
- }
- if ((nCompressOptions & S3MCompressType.VertexCompressOption.SVC_Normal) == S3MCompressType.VertexCompressOption.SVC_Normal) {
- result = loadCompressNormal(typedArray, view, viewByteOffset, newBytesOffset, vertexPackage);
- newBytesOffset = result.bytesOffset;
- }
- else {
- result = loadNormal(typedArray, view, viewByteOffset, newBytesOffset, vertexPackage);
- newBytesOffset = result.bytesOffset;
- }
- result = loadVertexColor(typedArray, view, viewByteOffset, newBytesOffset, vertexPackage);
- newBytesOffset = result.bytesOffset;
- result = loadSecondColor(typedArray, view, viewByteOffset, newBytesOffset);
- newBytesOffset = result.bytesOffset;
- if ((nCompressOptions & S3MCompressType.VertexCompressOption.SVC_TexutreCoord) == S3MCompressType.VertexCompressOption.SVC_TexutreCoord) {
- result = loadCompressTexCoord(view, typedArray, newBytesOffset, viewByteOffset, vertexPackage);
- newBytesOffset = result.bytesOffset;
- }
- else {
- result = loadTexCoord(view, typedArray, newBytesOffset, viewByteOffset, vertexPackage, isOldVersion);
- newBytesOffset = result.bytesOffset;
- }
- if ((nCompressOptions & S3MCompressType.VertexCompressOption.SVC_TexutreCoordIsW) == S3MCompressType.VertexCompressOption.SVC_TexutreCoordIsW) {
- vertexPackage.textureCoordIsW = true;
- }
- result = loadInstanceInfo(view, typedArray, newBytesOffset, viewByteOffset, vertexPackage);
- newBytesOffset = result.bytesOffset;
- return {
- bytesOffset: newBytesOffset
- }
- }
- function loadStandardSkeleton(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage, isOldVersion) {
- var newBytesOffset = bufferByteOffset;
- var result;
- result = loadVertex(typedArray, view, viewByteOffset, newBytesOffset, vertexPackage);
- newBytesOffset = result.bytesOffset;
- result = loadNormal(typedArray, view, viewByteOffset, newBytesOffset, vertexPackage);
- newBytesOffset = result.bytesOffset;
- result = loadVertexColor(typedArray, view, viewByteOffset, newBytesOffset, vertexPackage);
- newBytesOffset = result.bytesOffset;
- result = loadSecondColor(typedArray, view, viewByteOffset, newBytesOffset);
- newBytesOffset = result.bytesOffset;
- result = loadTexCoord(view, typedArray, newBytesOffset, viewByteOffset, vertexPackage, isOldVersion);
- newBytesOffset = result.bytesOffset;
- result = loadInstanceInfo(view, typedArray, newBytesOffset, viewByteOffset, vertexPackage);
- newBytesOffset = result.bytesOffset;
- return {
- bytesOffset: newBytesOffset
- }
- }
- function isClampGroundLinePass(arrIndexPackage) {
- if (arrIndexPackage.length === 0) {
- return false;
- }
- return arrIndexPackage[0].materialCode === CLAMP_GROUND_LINE_PASS_NAME;
- }
- function loadSkeletonEntities(skeletonBuffer, view, viewByteOffset, geoPackage, isOldVersion, transferableObjects, isHasOBB) {
- var typedArray = skeletonBuffer;
- var bufferByteOffset = 0;
- var nCount = view.getUint32(bufferByteOffset + viewByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- for (var i = 0; i < nCount; i++) {
- // S3MB头名字长度
- var result = loadString(view, viewByteOffset, typedArray, bufferByteOffset);
- var strGeometryName = result.string;
- bufferByteOffset = result.bytesOffset;
- var align = bufferByteOffset % 4;
- if (align !== 0) {
- bufferByteOffset += (4 - align);
- }
- var nTagValue = S3MBVertexTag.SV_Unkown;
- nTagValue = view.getUint32(bufferByteOffset + viewByteOffset, true);
- bufferByteOffset += Int32Array.BYTES_PER_ELEMENT;
- var vertexPackage = {};
- vertexPackage.vertexAttributes = [];
- vertexPackage.attrLocation = {};
- vertexPackage.instanceCount = 0;
- vertexPackage.instanceMode = 0;
- vertexPackage.instanceIndex = -1;
- vertexPackage.ignoreNormal = geoPackage.ignoreNormal;
- if (nTagValue == S3MBVertexTag.SV_DracoCompressed) {
- var vertexUniqueIDs = {};
- vertexUniqueIDs.posUniqueID = view.getInt32(bufferByteOffset + viewByteOffset, true);
- bufferByteOffset += Int32Array.BYTES_PER_ELEMENT;
- vertexUniqueIDs.normalUniqueID = view.getInt32(bufferByteOffset + viewByteOffset, true);
- bufferByteOffset += Int32Array.BYTES_PER_ELEMENT;
- vertexUniqueIDs.colorUniqueID = view.getInt32(bufferByteOffset + viewByteOffset, true);
- bufferByteOffset += Int32Array.BYTES_PER_ELEMENT;
- vertexUniqueIDs.secondColorUniqueID = view.getInt32(bufferByteOffset + viewByteOffset, true);
- bufferByteOffset += Int32Array.BYTES_PER_ELEMENT;
- var nTextureCoord = view.getUint16(bufferByteOffset + viewByteOffset, true);
- bufferByteOffset += Int16Array.BYTES_PER_ELEMENT;
- var texCoordUniqueIDs = [];
- for (var nTexCoordIdx = 0; nTexCoordIdx < nTextureCoord; nTexCoordIdx++) {
- var nTexCoordUniqueID = view.getInt32(bufferByteOffset + viewByteOffset, true);
- texCoordUniqueIDs.push(nTexCoordUniqueID);
- bufferByteOffset += Int32Array.BYTES_PER_ELEMENT;
- }
- vertexUniqueIDs.texCoordUniqueIDs = texCoordUniqueIDs;
- var nIndexPackageCount = view.getInt32(bufferByteOffset + viewByteOffset, true);
- bufferByteOffset += Int32Array.BYTES_PER_ELEMENT;
- var arrIndexPackage = [];
- // 目前只支持单索引
- var indexPackage = {};
- if (nIndexPackageCount > 0) {
- var res = loadString(view, viewByteOffset, typedArray, bufferByteOffset);
- var strPassName = res.string;
- bufferByteOffset = res.bytesOffset;
- indexPackage.materialCode = strPassName;
- arrIndexPackage.push(indexPackage);
- }
- var nDracoBufferSize = view.getUint32(bufferByteOffset + viewByteOffset, true);
- bufferByteOffset += Int32Array.BYTES_PER_ELEMENT;
- var dataBuffer = arraySlice(typedArray, bufferByteOffset, bufferByteOffset + nDracoBufferSize);
- if (nIndexPackageCount > 0) {
- S3MDracoDecode.dracoDecodeMesh(dracoLib, dataBuffer, nDracoBufferSize, vertexPackage, indexPackage, vertexUniqueIDs);
- }
- else {
- S3MDracoDecode.dracoDecodePointCloud(dracoLib, dataBuffer, nDracoBufferSize, vertexPackage, vertexUniqueIDs);
- }
- bufferByteOffset += nDracoBufferSize;
- geoPackage[strGeometryName] = {
- vertexPackage: vertexPackage,
- arrIndexPackage: arrIndexPackage
- };
- }
- else {
- if (nTagValue == S3MBVertexTag.SV_Standard) {
- result = loadStandardSkeleton(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage, isOldVersion);
- bufferByteOffset = result.bytesOffset;
- }
- else if (nTagValue == S3MBVertexTag.SV_Compressed) {
- result = loadCompressSkeleton(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage, isOldVersion);
- bufferByteOffset = result.bytesOffset;
- }
- result = loadIndexPackage(typedArray, view, viewByteOffset, bufferByteOffset);
- var arrIndexPackage = result.arrIndexPackage;
- if (isClampGroundLinePass(arrIndexPackage)) {
- vertexPackage.clampRegionEdge = true;
- }
- var edgeGeometry;
- if(arrIndexPackage.length === 2 && arrIndexPackage[1].primitiveType === 13){ // 13表示EffectOutline线框
- edgeGeometry = S3MCompressType.S3MEdgeProcessor.createEdgeDataByIndices(vertexPackage, arrIndexPackage[1], transferableObjects);
- }
- bufferByteOffset = result.bytesOffset;
- geoPackage[strGeometryName] = {
- vertexPackage: vertexPackage,
- arrIndexPackage: arrIndexPackage,
- edgeGeometry: edgeGeometry
- };
- }
- if(when.defined(isHasOBB) && isHasOBB){
- var min = new Cartographic.Cartesian3();
- var max = new Cartographic.Cartesian3();
- min.x = view.getFloat64(bufferByteOffset + viewByteOffset, true);
- bufferByteOffset += Float64Array.BYTES_PER_ELEMENT;
- min.y = view.getFloat64(bufferByteOffset + viewByteOffset, true);
- bufferByteOffset += Float64Array.BYTES_PER_ELEMENT;
- min.z = view.getFloat64(bufferByteOffset + viewByteOffset, true);
- bufferByteOffset += Float64Array.BYTES_PER_ELEMENT;
- max.x = view.getFloat64(bufferByteOffset + viewByteOffset, true);
- bufferByteOffset += Float64Array.BYTES_PER_ELEMENT;
- max.y = view.getFloat64(bufferByteOffset + viewByteOffset, true);
- bufferByteOffset += Float64Array.BYTES_PER_ELEMENT;
- max.z = view.getFloat64(bufferByteOffset + viewByteOffset, true);
- bufferByteOffset += Float64Array.BYTES_PER_ELEMENT;
- geoPackage[strGeometryName].min = min;
- geoPackage[strGeometryName].max = max;
- }
- }
- }
- function loadGeodeEntities(shellBuffer, view, bufferByteOffset, dataViewByteOffset) {
- var geode = {};
- var skeletonNames = [];
- var geoMatrix = new BoundingSphere.Matrix4();
- var typedArray = shellBuffer;
- for (var matIndex = 0; matIndex < 16; matIndex++) {
- geoMatrix[matIndex] = view.getFloat64(bufferByteOffset + dataViewByteOffset, true);
- bufferByteOffset += Float64Array.BYTES_PER_ELEMENT;
- }
- geode.matrix = geoMatrix;
- geode.skeletonNames = skeletonNames;
- var nSkeletonCount = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- for (var i = 0; i < nSkeletonCount; i++) {
- var res = loadString(view, dataViewByteOffset, typedArray, bufferByteOffset);
- var strSkeletonName = res.string;
- bufferByteOffset = res.bytesOffset;
- skeletonNames.push(strSkeletonName);
- }
- return {
- byteOffset: bufferByteOffset,
- geode: geode
- }
- }
- function removeUnusedStringTileName(oldTileName) {
- var index = oldTileName.indexOf('Geometry');
- if (index === -1) {
- return oldTileName;
- }
- var ignoreString = oldTileName.substring(index, oldTileName.length);
- return oldTileName.replace(ignoreString, '');
- }
- function loadPageLODEntities(shellBuffer, view, bufferByteOffset, dataViewByteOffset) {
- var pageLOD = {};
- var dbDis = view.getFloat32(bufferByteOffset + dataViewByteOffset, true);
- bufferByteOffset += Float32Array.BYTES_PER_ELEMENT;
- var uRangeMode = view.getUint16(bufferByteOffset + dataViewByteOffset, true);
- bufferByteOffset += Uint16Array.BYTES_PER_ELEMENT;
- pageLOD.rangeMode = uRangeMode;
- pageLOD.rangeList = dbDis;
- var boundingSphereCenter = new Cartographic.Cartesian3();
- boundingSphereCenter.x = view.getFloat64(bufferByteOffset + dataViewByteOffset, true);
- bufferByteOffset += Float64Array.BYTES_PER_ELEMENT;
- boundingSphereCenter.y = view.getFloat64(bufferByteOffset + dataViewByteOffset, true);
- bufferByteOffset += Float64Array.BYTES_PER_ELEMENT;
- boundingSphereCenter.z = view.getFloat64(bufferByteOffset + dataViewByteOffset, true);
- bufferByteOffset += Float64Array.BYTES_PER_ELEMENT;
- var radius = view.getFloat64(bufferByteOffset + dataViewByteOffset, true);
- bufferByteOffset += Float64Array.BYTES_PER_ELEMENT;
- pageLOD.boundingSphere = new BoundingSphere.BoundingSphere(boundingSphereCenter, radius);
- var typedArray = shellBuffer;
- var res = loadString(view, dataViewByteOffset, typedArray, bufferByteOffset);
- var strChildTile = res.string;
- bufferByteOffset = res.bytesOffset;
- strChildTile = strChildTile.replace(/(\.s3mblock)|(\.s3mbz)|(\.s3mb)/gi, '');
- strChildTile = removeUnusedStringTileName(strChildTile);
- pageLOD.childTile = strChildTile;
- pageLOD.geodes = [];
- var nGeodeCount = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- for (var i = 0; i < nGeodeCount; i++) {
- var res = loadGeodeEntities(shellBuffer, view, bufferByteOffset, dataViewByteOffset);
- bufferByteOffset = res.byteOffset;
- pageLOD.geodes.push(res.geode);
- }
- return {
- pageLOD: pageLOD,
- bytesOffset: bufferByteOffset
- }
- }
- function loadShellEntites(shellBuffer, view, dataViewByteOffset) {
- var bufferByteOffset = 0;
- var groupNode = {};
- var pageLods = [];
- var nCount = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- for (var i = 0; i < nCount; i++) {
- var res = loadPageLODEntities(shellBuffer, view, bufferByteOffset, dataViewByteOffset);
- bufferByteOffset = res.bytesOffset;
- pageLods.push(res.pageLOD);
- }
- groupNode.pageLods = pageLods;
- return groupNode;
- }
- function loadTextureEntities(supportCompressType, textureDataBuffer, dataView, dataViewByteOffset, texturePackage, transferableObjects) {
- var bufferByteOffset = 0;
- var nTextureCount = dataView.getUint32(bufferByteOffset + dataViewByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- for (var i = 0; i < nTextureCount; i++) {
- var res = loadString(dataView, dataViewByteOffset, textureDataBuffer, bufferByteOffset);
- var strTextureName = res.string;
- bufferByteOffset = res.bytesOffset;
- var align = bufferByteOffset % 4;
- if (align !== 0) {
- bufferByteOffset += (4 - align);
- }
- var nLevel = dataView.getUint32(bufferByteOffset + dataViewByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var width = dataView.getUint32(bufferByteOffset + dataViewByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var height = dataView.getUint32(bufferByteOffset + dataViewByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var compressType = dataView.getUint32(bufferByteOffset + dataViewByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var nSize = dataView.getUint32(bufferByteOffset + dataViewByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var pixelFormat = dataView.getUint32(bufferByteOffset + dataViewByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var textureData = textureDataBuffer.subarray(bufferByteOffset, bufferByteOffset + nSize);
- bufferByteOffset += nSize;
- var imageTypedArray = null;
- if (compressType === S3MCompressType.S3MCompressType.enrS3TCDXTN && supportCompressType != 1) {
- S3MCompressType.DXTTextureDecode.decode(imageTypedArray, width, height, textureData, pixelFormat);
- if (pixelFormat > S3MCompressType.S3MPixelFormat.BGR || pixelFormat === S3MCompressType.S3MPixelFormat.LUMINANCE_ALPHA) {
- imageTypedArray = new Uint8Array(width * height * 4);
- }
- else {
- imageTypedArray = new Uint16Array(width * height);
- }
- S3MCompressType.DXTTextureDecode.decode(imageTypedArray, width, height, textureData, pixelFormat);
- transferableObjects.push(imageTypedArray.buffer);
- compressType = 0;
- }
- else {
- imageTypedArray = textureData;
- }
- texturePackage[strTextureName] = {
- id: strTextureName,
- width: width,
- height: height,
- compressType: compressType,
- nFormat: pixelFormat,
- imageBuffer: imageTypedArray
- };
- }
- }
- function createTexBatchIdAttribute(vertexPackage, typedArray, texUnitIndex) {
- var vertexAttributes = vertexPackage.vertexAttributes;
- var attrLocation = vertexPackage.attrLocation;
- var len = vertexAttributes.length;
- attrLocation['aTextureBatchId' + texUnitIndex] = len;
- vertexAttributes.push({
- index: len,
- typedArray: typedArray,
- componentsPerAttribute: 1,
- componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
- offsetInBytes: 0,
- strideInBytes: 0
- });
- }
- function createTextureBatch(rootInfo, geoPackages, subTexInfos, batchIdsMap) {
- var len = subTexInfos.length;
- for(var i = 0;i < len;i++){
- var subInfo = subTexInfos[i];
- var subName = subInfo.subName.split('_')[0];
- var subVertexOffsetArr = subInfo.subVertexOffsetArr;
- for(var j = 0;j < subVertexOffsetArr.length;j++){
- var subVertexOffsetInfo = subVertexOffsetArr[j];
- var geoName = subVertexOffsetInfo.geoName;
- var offset = subVertexOffsetInfo.offset;
- var count = subVertexOffsetInfo.count;
- var texUnitIndex = subVertexOffsetInfo.texUnitIndex;
- var vertexPackage = geoPackages[geoName].vertexPackage;
- var verticesCount = vertexPackage.verticesCount;
- var batchIdsObj = batchIdsMap[geoName];
- if(!when.defined(batchIdsObj)){
- batchIdsObj = batchIdsMap[geoName] = {};
- }
- var batchIds = batchIdsObj[texUnitIndex];
- if(!when.defined(batchIds)){
- batchIds = batchIdsObj[texUnitIndex] = new Float32Array(verticesCount);
- arrayFill.arrayFill(batchIds, -1);
- }
- var batchId = when.defined(rootInfo) ? rootInfo[subName] : i;
- arrayFill.arrayFill(batchIds, batchId, offset, offset + count);
- }
- }
- }
- function loadTextureEntitiesForBlock(geoPackages, rootMap, ancestorMap, isRoot, supportCompressType, textureDataBuffer, dataView, dataViewByteOffset, texturePackage, transferableObjects) {
- var bufferByteOffset = dataViewByteOffset;
- var nTextureCount = dataView.getUint32(bufferByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var batchIdsMap = {};
- for (var i = 0; i < nTextureCount; i++) {
- var len = dataView.getUint32(bufferByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var curTextureName = S3MCompressType.getStringFromTypedArray(textureDataBuffer, bufferByteOffset - dataViewByteOffset, len);
- bufferByteOffset += len;
- var align = bufferByteOffset % 4;
- if (align !== 0) {
- bufferByteOffset += (4 - align);
- }
- var nLevel = dataView.getUint32(bufferByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var isSaveData = dataView.getUint8(bufferByteOffset, true);
- bufferByteOffset += Uint8Array.BYTES_PER_ELEMENT;
- var width = dataView.getUint32(bufferByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var height = dataView.getUint32(bufferByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var compressType = dataView.getUint32(bufferByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var size = dataView.getUint32(bufferByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var format = dataView.getUint32(bufferByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var textureData;
- if(isRoot){
- var offset = bufferByteOffset - dataViewByteOffset;
- textureData = textureDataBuffer.subarray(offset, offset + size);
- bufferByteOffset += size;
- }
- var childTexCount = dataView.getUint32(bufferByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var childrenTexNames = [];
- for(var j = 0;j < childTexCount;j++){
- len = dataView.getUint32(bufferByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var childTexName = S3MCompressType.getStringFromTypedArray(textureDataBuffer, bufferByteOffset - dataViewByteOffset, len);
- bufferByteOffset += len;
- childrenTexNames.push(childTexName);
- ancestorMap[childTexName] = curTextureName;
- }
- var requestNameCount = dataView.getUint32(bufferByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var requestNames = [];
- for(j = 0;j < requestNameCount;j++){
- len = dataView.getUint32(bufferByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var reqName = S3MCompressType.getStringFromTypedArray(textureDataBuffer, bufferByteOffset - dataViewByteOffset, len);
- bufferByteOffset += len;
- requestNames.push(reqName);
- }
- var subTexCount = dataView.getUint32(bufferByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var subTexInfos = [];
- var rootInfo = undefined;
- var rootName = curTextureName;
- if(isRoot){
- rootInfo = rootMap[curTextureName] = {};
- }
- else{
- var parent = ancestorMap[curTextureName];
- rootName = parent;
- while(when.defined(parent)){
- rootName = parent;
- parent = ancestorMap[parent];
- }
- if(when.defined(rootName)){
- rootInfo = rootMap[rootName];
- }
- }
- var decream = 0;
- for(j = 0;j < subTexCount;j++){
- len = dataView.getUint32(bufferByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var subName = S3MCompressType.getStringFromTypedArray(textureDataBuffer, bufferByteOffset - dataViewByteOffset, len);
- bufferByteOffset += len;
- if(isRoot){
- var firstName = subName.split('_')[0];
- if(!when.defined(rootInfo[firstName])){
- rootInfo[firstName] = j - decream;
- }
- else{
- decream++;
- }
- }
- var offsetX = dataView.getUint32(bufferByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var offsetY = dataView.getUint32(bufferByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var subWidth = dataView.getUint32(bufferByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var subHeight = dataView.getUint32(bufferByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var geoCount = dataView.getUint32(bufferByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var subVertexOffsetArr = [];
- for(var k = 0;k < geoCount;k++){
- len = dataView.getUint32(bufferByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var geoName = S3MCompressType.getStringFromTypedArray(textureDataBuffer, bufferByteOffset - dataViewByteOffset, len);
- bufferByteOffset += len;
- var vertexOffset = dataView.getUint32(bufferByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var vertexCount = dataView.getUint32(bufferByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var texUnitIndex = dataView.getUint32(bufferByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- subVertexOffsetArr.push({
- geoName : geoName,
- offset : vertexOffset,
- count : vertexCount,
- texUnitIndex : texUnitIndex
- });
- }
- subTexInfos.push({
- subName : subName,
- offsetX : offsetX,
- offsetY : offsetY,
- width : subWidth,
- height : subHeight,
- subVertexOffsetArr : subVertexOffsetArr
- });
- }
- createTextureBatch(rootInfo, geoPackages, subTexInfos, batchIdsMap);
- if(when.defined(textureData) && compressType === S3MCompressType.S3MPixelFormat.CRN_DXT5 && crunchInitialized){
- textureData = convertCRNToDXT({data : textureData}, transferableObjects).bufferView;
- }
- texturePackage[curTextureName] = {
- id: curTextureName,
- rootTextureName : rootName,
- width : width,
- height : height,
- compressType : compressType,
- size : size,
- format : format,
- textureData : textureData,
- subTexInfos : subTexInfos,
- requestNames : requestNames
- };
- }
- for(var geoName in batchIdsMap){
- if(batchIdsMap.hasOwnProperty(geoName)){
- var vertexPackage = geoPackages[geoName].vertexPackage;
- var obj = batchIdsMap[geoName];
- for(var texUnitIndex in obj){
- if(obj.hasOwnProperty(texUnitIndex)){
- var batchIds = obj[texUnitIndex];
- createTexBatchIdAttribute(vertexPackage, batchIds, texUnitIndex);
- }
- }
- }
- }
- }
- function createBatchIdAttribute(vertexPackage, typedArray, instanceDivisor) {
- var vertexAttributes = vertexPackage.vertexAttributes;
- var attrLocation = vertexPackage.attrLocation;
- var len = vertexAttributes.length;
- var attrName = instanceDivisor === 1 ? 'instanceId' : 'batchId';
- attrLocation[attrName] = len;
- vertexAttributes.push({
- index: len,
- typedArray: typedArray,
- componentsPerAttribute: 1,
- componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
- offsetInBytes: 0,
- strideInBytes: 0,
- instanceDivisor: instanceDivisor
- });
- }
- var LEFT_16 = 65536;
- function loadSelectionInfo(selectionInfoBuffer, view, dataViewByteOffset, geoPackage) {
- var bufferByteOffset = 0;
- var typedArray = selectionInfoBuffer;
- var nGeometryCount = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- for (var i = 0; i < nGeometryCount; i++) {
- // S3MB头名字长度
- var result = loadString(view, dataViewByteOffset, typedArray, bufferByteOffset);
- var strGeometryName = result.string;
- bufferByteOffset = result.bytesOffset;
- var nSelectInfoCount = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var pickInfo = {};
- geoPackage[strGeometryName].pickInfo = pickInfo;
- // 非实例化的选择信息
- var bInstanced = geoPackage[strGeometryName].vertexPackage.instanceIndex;
- if (bInstanced == -1) {
- var batchIds = new Float32Array(geoPackage[strGeometryName].vertexPackage.verticesCount);
- for (var j = 0; j < nSelectInfoCount; j++) {
- var nDictID = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var nSize = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var vertexCount = 0, vertexColorOffset = 0;
- pickInfo[nDictID] = {
- batchId: j
- };
- for (var k = 0; k < nSize; k++) {
- vertexColorOffset = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- vertexCount = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- arrayFill.arrayFill(batchIds, j, vertexColorOffset, vertexColorOffset + vertexCount);
- }
- pickInfo[nDictID].vertexColorOffset = vertexColorOffset;
- pickInfo[nDictID].vertexCount = vertexCount;
- }
- createBatchIdAttribute(geoPackage[strGeometryName].vertexPackage, batchIds, undefined);
- }
- else {
- var instanceCount = geoPackage[strGeometryName].vertexPackage.instanceCount;
- var instanceArray = geoPackage[strGeometryName].vertexPackage.instanceBuffer;
- var instanceMode = geoPackage[strGeometryName].vertexPackage.instanceMode;
- var instanceIds = new Float32Array(instanceCount);
- for (var j = 0; j < nSelectInfoCount; j++) {
- var nDictID = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- var nSize = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- for (var k = 0; k < nSize; k++) {
- var instanceId = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
- bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
- }
- }
- var beginOffset = instanceMode === 17 ? 16 : 28;
- beginOffset *= Float32Array.BYTES_PER_ELEMENT;
- for (j = 0; j < instanceCount; j++) {
- instanceIds[j] = j;
- var offset = j * instanceMode * Float32Array.BYTES_PER_ELEMENT + beginOffset;
- Color.Color.unpack(instanceArray, offset, colorScratch);
- var pickId = colorScratch.red + colorScratch.green * 256 + colorScratch.blue * LEFT_16;
- if (pickInfo[pickId] === undefined) {
- pickInfo[pickId] = {
- vertexColorCount: 1,
- instanceIds: [],
- vertexColorOffset: j
- };
- }
- pickInfo[pickId].instanceIds.push(j);
- }
- createBatchIdAttribute(geoPackage[strGeometryName].vertexPackage, instanceIds, 1);
- }
- }
- }
- function OGDCIS0(x) {
- return (((x) < 1e-10) && ((x) > -1e-10));
- }
- function unzipWithwasm(datazip, unzipSize) {
- var unzipsize = unzipSize || datazip.length * 4;//unzipSize;//
- var offset = unzip.unzip._malloc(Uint8Array.BYTES_PER_ELEMENT * unzipsize); //开辟内存
- var tar = new Uint8Array(unzipsize);
- unzip.unzip.HEAPU8.set(tar, offset / Uint8Array.BYTES_PER_ELEMENT);
- var offset1 = unzip.unzip._malloc(Uint8Array.BYTES_PER_ELEMENT * datazip.length);
- unzip.unzip.HEAPU8.set(datazip, offset1 / Uint8Array.BYTES_PER_ELEMENT);
-
- var resultLen;
- while ((resultLen = unzipwasm(offset, unzipsize, offset1, datazip.length)) == 0) {
- freec(offset); //释放内存
- unzipsize *= 4;
- offset = unzip.unzip._malloc(Uint8Array.BYTES_PER_ELEMENT * unzipsize);
- tar = new Uint8Array(unzipsize);
- unzip.unzip.HEAPU8.set(tar, offset / Uint8Array.BYTES_PER_ELEMENT);
- }
- var res = new Uint8Array(unzip.unzip.HEAPU8.buffer, offset, resultLen);
- datazip = null;
- tar = null;
- var buffer = new Uint8Array(res).buffer;
- freec(offset);
- freec(offset1);
- return buffer;
- }
- function parseBuffer(oriBuffer, totalByteLength, bytesOffset, rootMap, ancestorMap, isRoot, childGroup, transferableObjects) {
- var supportCompressType = 1;
- var fileType = 1;
- var view = new DataView(oriBuffer);
- var typedArray = new Uint8Array(oriBuffer);
- var len = view.getUint32(bytesOffset, true);
- bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
- var name = S3MCompressType.getStringFromTypedArray(typedArray, bytesOffset, len);
- name = name.replace(/(\.s3mblock)|(\.s3mbz)|(\.s3mb)/gi, '');
- bytesOffset += len;
- var pagelodCount = view.getUint32(bytesOffset, true);
- bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
- for(var i = 0;i < pagelodCount;i++){
- var pageLOD = {};
- var dbDis = view.getFloat32(bytesOffset, true);
- bytesOffset += Float32Array.BYTES_PER_ELEMENT;
- var uRangeMode = view.getUint16(bytesOffset, true);
- bytesOffset += Uint16Array.BYTES_PER_ELEMENT;
- pageLOD.rangeMode = uRangeMode;
- pageLOD.rangeList = dbDis;
- var boundingSphereCenter = {};
- boundingSphereCenter.x = view.getFloat64(bytesOffset, true);
- bytesOffset += Float64Array.BYTES_PER_ELEMENT;
- boundingSphereCenter.y = view.getFloat64(bytesOffset, true);
- bytesOffset += Float64Array.BYTES_PER_ELEMENT;
- boundingSphereCenter.z = view.getFloat64(bytesOffset, true);
- bytesOffset += Float64Array.BYTES_PER_ELEMENT;
- var radius = view.getFloat64(bytesOffset, true);
- bytesOffset += Float64Array.BYTES_PER_ELEMENT;
- pageLOD.boundingSphere = {
- center : boundingSphereCenter,
- radius : radius
- };
- len = view.getUint32(bytesOffset, true);
- bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
- var childTileName = S3MCompressType.getStringFromTypedArray(typedArray, bytesOffset, len);
- bytesOffset += len;
- childTileName = childTileName.replace(/(\.s3mblock)|(\.s3mbz)|(\.s3mb)/gi, '');
- childTileName = removeUnusedStringTileName(childTileName);
- pageLOD.childTile = childTileName;
- }
- var geoPackage = {};
- var version = view.getFloat32(bytesOffset, true);
- bytesOffset += Float32Array.BYTES_PER_ELEMENT;
- var isOldVersion = false;
- var unzipByteSize = view.getUint32(bytesOffset, true);
- bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
- var byteSize = view.getUint32(bytesOffset, true);
- bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
- var datazip = new Uint8Array(oriBuffer, bytesOffset, byteSize);
- var oriOffset = bytesOffset + byteSize;
- var buffer = pako_inflate.pako.inflate(datazip).buffer;
- transferableObjects.push(buffer);
- view = new DataView(buffer);
- var typedArray = new Uint8Array(buffer);
- bytesOffset = 0;
- var nOptions = view.getUint32(bytesOffset, true);
- bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
- // load Shell
- var loadStreamResult = loadStream(view, buffer, bytesOffset);
- var shellBuffer = loadStreamResult.buffer;
- bytesOffset = loadStreamResult.byteOffset;
- var groupNode = loadShellEntites(shellBuffer, view, loadStreamResult.dataViewByteOffset);
- var align = bytesOffset % 4;
- if (align !== 0) {
- bytesOffset += (4 - align);
- }
- // load skeleton
- loadStreamResult = loadStream(view, buffer, bytesOffset);
- var skeletonBuffer = loadStreamResult.buffer;
- loadSkeletonEntities(skeletonBuffer, view, loadStreamResult.dataViewByteOffset, geoPackage, isOldVersion);
- bytesOffset = loadStreamResult.byteOffset;
- // load secondColor
- loadStreamResult = loadStream(view, buffer, bytesOffset);
- var secondColorBuffer = loadStreamResult.buffer;
- bytesOffset = loadStreamResult.byteOffset;
- // load textureData
- loadStreamResult = loadStream(view, buffer, bytesOffset);
- var textureDataBuffer = loadStreamResult.buffer;
- var texturePackage = {};
- loadTextureEntitiesForBlock(geoPackage, rootMap, ancestorMap, isRoot, supportCompressType, textureDataBuffer, view, loadStreamResult.dataViewByteOffset, texturePackage, transferableObjects);
- bytesOffset = loadStreamResult.byteOffset;
- var strJsonMaterialsLength = view.getUint32(bytesOffset, true);
- bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
- var materialBuffer = typedArray.subarray(bytesOffset, bytesOffset + strJsonMaterialsLength);
- var strJsonMaterials = S3MCompressType.getStringFromTypedArray(materialBuffer);
- bytesOffset += strJsonMaterialsLength;
- var matrialObj = JSON.parse(strJsonMaterials);
- var bHasSelectionInfo = (nOptions & S3MBVertexOptions.SVO_HasInstSelInfo) == S3MBVertexOptions.SVO_HasInstSelInfo;
- if (bHasSelectionInfo) {
- loadStreamResult = loadStream(view, buffer, bytesOffset);
- var selectionInfoBuffer = loadStreamResult.buffer;
- loadSelectionInfo(selectionInfoBuffer, view, loadStreamResult.dataViewByteOffset, geoPackage);
- bytesOffset = loadStreamResult.byteOffset;
- }
- var pagelodList = groupNode.pageLods;
- var isLeafNode = true;
- for (var i = 0; i < pagelodList.length; i++) {
- var pagelodNode = pagelodList[i];
- isLeafNode = pagelodNode.childTile === '';
- var geodeList = pagelodNode.geodes;
- for (var m = 0; m < geodeList.length; m++) {
- var geodeNode = geodeList[m];
- var skeletonNames = geodeNode.skeletonNames;
- for (var n = 0; n < skeletonNames.length; n++) {
- var geoName = skeletonNames[n];
- if (isLeafNode) {
- var geo = geoPackage[geoName];
- var vertexPackage = geo.vertexPackage;
- vertexPackage.boundingSphere = S3MCompressType.S3MVertexPackage.calcBoundingSphereInWorker(fileType, vertexPackage);
- }
- }
- }
- }
- childGroup[name] = {
- result: true,
- groupNode: groupNode,
- geoPackage: geoPackage,
- matrials: matrialObj,
- texturePackage: texturePackage,
- version: S3MVersion.S3M4,
- rootBatchIdMap : rootMap,
- ancestorMap : ancestorMap
- };
- if(oriOffset < totalByteLength){
- parseBuffer(oriBuffer, totalByteLength, oriOffset, rootMap, ancestorMap, false, childGroup, transferableObjects);
- }
- }
- function parseS3MB(parameters, transferableObjects) {
- var buffer = parameters.buffer;
- var bZip = parameters.isS3MZ;
- var fileType = parameters.fileType;
- var supportCompressType = parameters.supportCompressType;
- var bVolume = parameters.bVolume;//是否是体渲染数据;
- var bound3D = null;
- var volBounds = null;
- var volImageBuffer = null;
- if(bVolume){
- if(parameters.volbuffer.byteLength < 8){
- bVolume = false;
- }
- }
- if(bVolume){
- var volData = parameters.volbuffer;
- var dataZip = new Uint8Array(volData,8);
- var volumeBuffer = pako_inflate.pako.inflate(dataZip).buffer;
- var volVersion = new Float64Array(volumeBuffer,0,1);
- var volFormat = new Uint32Array(volumeBuffer,48,1);
- if(volVersion[0] === 0.0 || volFormat[0] === 3200 || volFormat[0] === 3201){
- var nHeaderOffset = 0;
- if(volVersion[0] == 0.0){
- nHeaderOffset = 8;
- }
- transferableObjects.push(volumeBuffer);
- var boundsArray = new Float64Array(volumeBuffer, nHeaderOffset, 6);
- var left = boundsArray[0];
- var top = boundsArray[1];
- var right = boundsArray[2];
- var bottom = boundsArray[3];
- var minHeight = boundsArray[4] < boundsArray[5] ? boundsArray[4] : boundsArray[5];
- var maxHeight = boundsArray[4] > boundsArray[5] ? boundsArray[4] : boundsArray[5];
- bound3D = new Bound3D(left, bottom, right, top, minHeight, maxHeight);
- volBounds = {
- left: left,
- top: top,
- right: right,
- bottom: bottom,
- minHeight: minHeight,
- maxHeight: maxHeight,
- width: bound3D.width,
- length: bound3D.length,
- height: bound3D.height
- };
- // 中间空出来
- var infoVolume = new Uint32Array(volumeBuffer, 48 + nHeaderOffset, 7);
- var nFormat = infoVolume[0];
- var nSideBlockCount = infoVolume[1];
- var nBlockLength = infoVolume[2];
- var nLength = infoVolume[3];
- var nWidth = infoVolume[4];
- var nHeight = infoVolume[5];
- var nDepth = infoVolume[6];
- var nCount = nLength * nLength * 4;
- var image = new Uint8Array(volumeBuffer, 76 + nHeaderOffset, nCount);
- volImageBuffer = {
- nFormat: nFormat,
- nSideBlockCount: nSideBlockCount,
- nBlockLength: nBlockLength,
- nLength: nLength,
- nWidth: nWidth,
- nHeight: nHeight,
- nDepth: nDepth,
- imageArray: image
- };
- }
- }
- var bytesOffset = 0;
- var geoPackage = {};
- geoPackage.ignoreNormal = parameters.ignoreNormal;
- var rootMap = parameters.rootBatchIdMap || {};
- var ancesotrMap = parameters.ancestorMap || {};
- var childGroup = {};
- var view = new DataView(buffer);
- var version = view.getFloat32(bytesOffset, true);
- bytesOffset += Float32Array.BYTES_PER_ELEMENT;
- if(version > 2.0 && version < 2.2){
- var count = view.getUint32(bytesOffset, true);
- bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
- var totalByteLength = buffer.byteLength;
- parseBuffer(buffer, totalByteLength, bytesOffset, rootMap, ancesotrMap, parameters.isRoot, childGroup, transferableObjects);
- return childGroup;
- }
- var isOldVersion = false;
- var unzipSize;
- if (version === 2) {
- unzipSize = view.getUint32(bytesOffset, true);
- bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
- }
- if (OGDCIS0(version - 1) || OGDCIS0(version - 2)) {
- //总字节大小
- var byteSize = view.getUint32(bytesOffset, true);
- bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
- var datazip = new Uint8Array(buffer, bytesOffset, byteSize);
- if (unzipwasmReady === true) {
- buffer = unzipWithwasm(datazip, unzipSize);
- } else {
- buffer = pako_inflate.pako.inflate(datazip).buffer;
- }
- transferableObjects.push(buffer);
- view = new DataView(buffer);
- bytesOffset = 0;
- }
- // 不zip压缩的解析性能,测试用
- else if (version > 1.199 && version < 1.201) {
- var byteSize = view.getUint32(bytesOffset, true);
- bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
- transferableObjects.push(buffer);
- }
- else {
- //老版本的s3mb缓存,解析方式跟UGC保持一致
- isOldVersion = true;
- bytesOffset = 0;
- var byteSize = view.getInt32(bytesOffset, true);
- bytesOffset += Int32Array.BYTES_PER_ELEMENT;
- bytesOffset += Uint8Array.BYTES_PER_ELEMENT * byteSize;
- if (bZip) {
- var zipSize = view.getUint32(bytesOffset, true);
- bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
- var dataZip = new Uint8Array(buffer, bytesOffset);
- buffer = pako_inflate.pako.inflate(dataZip).buffer;
- transferableObjects.push(buffer);
- view = new DataView(buffer);
- bytesOffset = 0;
- }
- }
- var nOptions = view.getUint32(bytesOffset, true);
- bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
- // load Shell
- var loadStreamResult = loadStream(view, buffer, bytesOffset);
- var shellBuffer = loadStreamResult.buffer;
- bytesOffset = loadStreamResult.byteOffset;
- var groupNode = loadShellEntites(shellBuffer, view, loadStreamResult.dataViewByteOffset);
- var align = bytesOffset % 4;
- if (align !== 0) {
- bytesOffset += (4 - align);
- }
- // load skeleton
- loadStreamResult = loadStream(view, buffer, bytesOffset);
- var skeletonBuffer = loadStreamResult.buffer;
- var hasOBB = version > 1.999 ? true:false;
- loadSkeletonEntities(skeletonBuffer, view, loadStreamResult.dataViewByteOffset, geoPackage, isOldVersion, transferableObjects, hasOBB);
- bytesOffset = loadStreamResult.byteOffset;
- if(hasOBB){
- //计算OBB
- for(var i=0; i<groupNode.pageLods.length; i++){
- var pageLod = groupNode.pageLods[i];
- var geodes = pageLod.geodes;
- for(var j=0; j<geodes.length; j++){
- var skeletonNames = geodes[j].skeletonNames;
- for(var k = 0; k<skeletonNames.length; k++){
- var skeletonName = skeletonNames[k];
- if(when.defined(geoPackage[skeletonName].max)){
- if(!when.defined(pageLod.max)){
- pageLod.max = geoPackage[skeletonName].max;
- pageLod.min = geoPackage[skeletonName].min;
- }
- else {
- pageLod.max.x = Math.max(geoPackage[skeletonName].max.x, pageLod.max.x);
- pageLod.max.y = Math.max(geoPackage[skeletonName].max.y, pageLod.max.y);
- pageLod.max.z = Math.max(geoPackage[skeletonName].max.z, pageLod.max.z);
- pageLod.min.x = Math.min(geoPackage[skeletonName].min.x, pageLod.min.x);
- pageLod.min.y = Math.min(geoPackage[skeletonName].min.y, pageLod.min.y);
- pageLod.min.z = Math.min(geoPackage[skeletonName].min.z, pageLod.min.z);
- }
- }
- }
- }
- }
- }
- // load secondColor
- loadStreamResult = loadStream(view, buffer, bytesOffset);
- var secondColorBuffer = loadStreamResult.buffer;
- bytesOffset = loadStreamResult.byteOffset;
- // load textureData
- loadStreamResult = loadStream(view, buffer, bytesOffset);
- var textureDataBuffer = loadStreamResult.buffer;
- var texturePackage = {};
- loadTextureEntities(supportCompressType, textureDataBuffer, view, loadStreamResult.dataViewByteOffset, texturePackage, transferableObjects);
- bytesOffset = loadStreamResult.byteOffset;
- var strJsonMaterialsLength = view.getUint32(bytesOffset, true);
- bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
- var typedArray = new Uint8Array(buffer);
- var materialBuffer = typedArray.subarray(bytesOffset, bytesOffset + strJsonMaterialsLength);
- var strJsonMaterials = S3MCompressType.getStringFromTypedArray(materialBuffer);
- bytesOffset += strJsonMaterialsLength;
- var matrialObj = JSON.parse(strJsonMaterials);
- var bHasSelectionInfo = (nOptions & S3MBVertexOptions.SVO_HasInstSelInfo) == S3MBVertexOptions.SVO_HasInstSelInfo;
- if (bHasSelectionInfo) {
- loadStreamResult = loadStream(view, buffer, bytesOffset);
- var selectionInfoBuffer = loadStreamResult.buffer;
- loadSelectionInfo(selectionInfoBuffer, view, loadStreamResult.dataViewByteOffset, geoPackage);
- }
- var pagelodList = groupNode.pageLods;
- var isLeafNode = true;
- for (var i = 0; i < pagelodList.length; i++) {
- var pagelodNode = pagelodList[i];
- isLeafNode = pagelodNode.childTile === '';
- var geodeList = pagelodNode.geodes;
- for (var m = 0; m < geodeList.length; m++) {
- var geodeNode = geodeList[m];
- var skeletonNames = geodeNode.skeletonNames;
- for (var n = 0; n < skeletonNames.length; n++) {
- var geoName = skeletonNames[n];
- if (isLeafNode) {
- var geo = geoPackage[geoName];
- var vertexPackage = geo.vertexPackage;
- vertexPackage.boundingSphere = S3MCompressType.S3MVertexPackage.calcBoundingSphereInWorker(fileType, vertexPackage);
- }
- }
- }
- }
- return {
- result: true,
- groupNode: groupNode,
- geoPackage: geoPackage,
- matrials: matrialObj,
- texturePackage: texturePackage,
- version: S3MVersion.S3M4,
- volImageBuffer:volImageBuffer,
- volBounds:volBounds
- };
- }
- function initWorker() {
- if(when.defined(crunch) && when.defined(dracoLib)){
- crunch.onRuntimeInitialized = function () {
- crunchInitialized = true;
- };
- self.onmessage = createTaskProcessorWorker(parseS3MB);
- self.postMessage(true);
- }
- }
- function S3MBTilesParser(event) {
- var data = event.data;
- // Expect the first message to be to load a web assembly module
- var wasmConfig = data.webAssemblyConfig;
- if (when.defined(wasmConfig)) {
- if (FeatureDetection.FeatureDetection.isInternetExplorer()) {
- return require([buildModuleUrl.buildModuleUrl('ThirdParty/Workers/ie-webworker-promise-polyfill.js')], function (e) {
- self.Promise = e;
- if(wasmConfig.modulePath.indexOf('crunch') !== -1){
- return require([wasmConfig.modulePath], function (crnModule) {
- if (when.defined(wasmConfig.wasmBinaryFile)) {
- if (!when.defined(crnModule)) {
- crnModule = self.Module;
- }
- crunch = crnModule;
- initWorker();
- } else {
- crunch = crnModule;
- initWorker();
- }
- });
- }
- return require([wasmConfig.modulePath], function (dracoModule) {
- if (when.defined(wasmConfig.wasmBinaryFile)) {
- if (!when.defined(dracoModule)) {
- dracoModule = self.DracoDecoderModule;
- }
- dracoModule(wasmConfig).then(function (compiledModule) {
- dracoLib = compiledModule;
- initWorker();
- });
- } else {
- dracoLib = dracoModule();
- initWorker();
- }
- });
- });
- }
- // Require and compile WebAssembly module, or use fallback if not supported
- if(wasmConfig.modulePath.indexOf('crunch') !== -1){
- return require([wasmConfig.modulePath], function (crnModule) {
- if (when.defined(wasmConfig.wasmBinaryFile)) {
- if (!when.defined(crnModule)) {
- crnModule = self.Module;
- }
- crunch = crnModule;
- initWorker();
- } else {
- crunch = crnModule;
- initWorker();
- }
- });
- }
- return require([wasmConfig.modulePath], function (dracoModule) {
- if (when.defined(wasmConfig.wasmBinaryFile)) {
- if (!when.defined(dracoModule)) {
- dracoModule = self.DracoDecoderModule;
- }
- dracoModule(wasmConfig).then(function (compiledModule) {
- dracoLib = compiledModule;
- initWorker();
- });
- } else {
- dracoLib = dracoModule();
- initWorker();
- }
- });
- }
- }
- //export default createTaskProcessorWorker(S3MBTilesParser);
- return S3MBTilesParser;
- });
|