@rtzh/engine 0.0.1 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/Source/Scene/GltfLoader.js +2 -2
  2. package/Source/Scene/Model/CustomShader.js +2 -2
  3. package/index.js +504 -504
  4. package/package.json +1 -1
  5. package/Build/ThirdParty/Workers/zip-web-worker.js +0 -640
  6. package/Build/Workers/chunk-245NZYCR.js +0 -124
  7. package/Build/Workers/chunk-25BA4527.js +0 -837
  8. package/Build/Workers/chunk-4HXPSZRC.js +0 -1483
  9. package/Build/Workers/chunk-4Z26IS65.js +0 -3514
  10. package/Build/Workers/chunk-55IROWAX.js +0 -139
  11. package/Build/Workers/chunk-56XTN5NJ.js +0 -1800
  12. package/Build/Workers/chunk-5VZISKJF.js +0 -629
  13. package/Build/Workers/chunk-5WAG5YKS.js +0 -368
  14. package/Build/Workers/chunk-66YGZWBI.js +0 -1317
  15. package/Build/Workers/chunk-6H33B6OL.js +0 -37
  16. package/Build/Workers/chunk-6LZBBEA7.js +0 -439
  17. package/Build/Workers/chunk-6XJO625E.js +0 -497
  18. package/Build/Workers/chunk-75UGCVME.js +0 -102
  19. package/Build/Workers/chunk-7B23DD46.js +0 -1054
  20. package/Build/Workers/chunk-7NCJH26L.js +0 -352
  21. package/Build/Workers/chunk-AIW5F22O.js +0 -352
  22. package/Build/Workers/chunk-AL22JVIA.js +0 -256
  23. package/Build/Workers/chunk-AVSQILVI.js +0 -75
  24. package/Build/Workers/chunk-B2VFNYD7.js +0 -280
  25. package/Build/Workers/chunk-BOV6T7FO.js +0 -44
  26. package/Build/Workers/chunk-DP76S3IQ.js +0 -1067
  27. package/Build/Workers/chunk-EDIUN7V3.js +0 -219
  28. package/Build/Workers/chunk-EKMWNF4U.js +0 -55
  29. package/Build/Workers/chunk-ELXGXAYS.js +0 -682
  30. package/Build/Workers/chunk-FVYRV2T6.js +0 -455
  31. package/Build/Workers/chunk-GDIBU55R.js +0 -778
  32. package/Build/Workers/chunk-HAY6YE7M.js +0 -97
  33. package/Build/Workers/chunk-I76SRIKN.js +0 -138
  34. package/Build/Workers/chunk-IELTSYPZ.js +0 -241
  35. package/Build/Workers/chunk-J4MIJCN5.js +0 -171
  36. package/Build/Workers/chunk-JFO3ELF3.js +0 -642
  37. package/Build/Workers/chunk-K4IMD7KH.js +0 -162
  38. package/Build/Workers/chunk-KFMCOG26.js +0 -692
  39. package/Build/Workers/chunk-KH2OWUUA.js +0 -163
  40. package/Build/Workers/chunk-KQIZ7AFF.js +0 -8366
  41. package/Build/Workers/chunk-KVE5EAPO.js +0 -398
  42. package/Build/Workers/chunk-OAOREOSO.js +0 -940
  43. package/Build/Workers/chunk-OFJRMGNX.js +0 -788
  44. package/Build/Workers/chunk-PLLZB3R4.js +0 -198
  45. package/Build/Workers/chunk-POY6ZE32.js +0 -2058
  46. package/Build/Workers/chunk-PV5B2YNB.js +0 -2719
  47. package/Build/Workers/chunk-Q2DXNFYW.js +0 -414
  48. package/Build/Workers/chunk-QWV2DM66.js +0 -1443
  49. package/Build/Workers/chunk-R73BHGGI.js +0 -305
  50. package/Build/Workers/chunk-S3AE3MZZ.js +0 -511
  51. package/Build/Workers/chunk-SBFTVHRW.js +0 -57
  52. package/Build/Workers/chunk-SOR7PD4V.js +0 -114
  53. package/Build/Workers/chunk-TO7TWUET.js +0 -476
  54. package/Build/Workers/chunk-TSAJNE4K.js +0 -101
  55. package/Build/Workers/chunk-TWF4XRZ6.js +0 -73
  56. package/Build/Workers/chunk-UTWLMOPM.js +0 -387
  57. package/Build/Workers/chunk-UYT2PBMV.js +0 -58
  58. package/Build/Workers/chunk-WAS3IHIQ.js +0 -288
  59. package/Build/Workers/chunk-WO5ZNC7S.js +0 -1045
  60. package/Build/Workers/chunk-X65Y2JSA.js +0 -55
  61. package/Build/Workers/chunk-XOVHLPKW.js +0 -299
  62. package/Build/Workers/chunk-YPGJSFOO.js +0 -1460
  63. package/Build/Workers/combineGeometry.js +0 -66
  64. package/Build/Workers/createBoxGeometry.js +0 -58
  65. package/Build/Workers/createBoxOutlineGeometry.js +0 -231
  66. package/Build/Workers/createCircleGeometry.js +0 -201
  67. package/Build/Workers/createCircleOutlineGeometry.js +0 -147
  68. package/Build/Workers/createCoplanarPolygonGeometry.js +0 -505
  69. package/Build/Workers/createCoplanarPolygonOutlineGeometry.js +0 -225
  70. package/Build/Workers/createCorridorGeometry.js +0 -1258
  71. package/Build/Workers/createCorridorOutlineGeometry.js +0 -563
  72. package/Build/Workers/createCylinderGeometry.js +0 -60
  73. package/Build/Workers/createCylinderOutlineGeometry.js +0 -231
  74. package/Build/Workers/createEllipseGeometry.js +0 -72
  75. package/Build/Workers/createEllipseOutlineGeometry.js +0 -65
  76. package/Build/Workers/createEllipsoidGeometry.js +0 -59
  77. package/Build/Workers/createEllipsoidOutlineGeometry.js +0 -61
  78. package/Build/Workers/createFrustumGeometry.js +0 -58
  79. package/Build/Workers/createFrustumOutlineGeometry.js +0 -234
  80. package/Build/Workers/createGeometry.js +0 -173
  81. package/Build/Workers/createGroundPolylineGeometry.js +0 -1602
  82. package/Build/Workers/createPlaneGeometry.js +0 -223
  83. package/Build/Workers/createPlaneOutlineGeometry.js +0 -124
  84. package/Build/Workers/createPolygonGeometry.js +0 -1404
  85. package/Build/Workers/createPolygonOutlineGeometry.js +0 -532
  86. package/Build/Workers/createPolylineGeometry.js +0 -491
  87. package/Build/Workers/createPolylineVolumeGeometry.js +0 -374
  88. package/Build/Workers/createPolylineVolumeOutlineGeometry.js +0 -272
  89. package/Build/Workers/createRectangleGeometry.js +0 -1264
  90. package/Build/Workers/createRectangleOutlineGeometry.js +0 -476
  91. package/Build/Workers/createSimplePolylineGeometry.js +0 -397
  92. package/Build/Workers/createSphereGeometry.js +0 -116
  93. package/Build/Workers/createSphereOutlineGeometry.js +0 -116
  94. package/Build/Workers/createTaskProcessorWorker.js +0 -32
  95. package/Build/Workers/createVectorTileClampedPolylines.js +0 -492
  96. package/Build/Workers/createVectorTileGeometries.js +0 -387
  97. package/Build/Workers/createVectorTilePoints.js +0 -114
  98. package/Build/Workers/createVectorTilePolygons.js +0 -386
  99. package/Build/Workers/createVectorTilePolylines.js +0 -262
  100. package/Build/Workers/createVerticesFromCesium3DTilesTerrain.js +0 -91
  101. package/Build/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +0 -565
  102. package/Build/Workers/createVerticesFromHeightmap.js +0 -2254
  103. package/Build/Workers/createVerticesFromQuantizedTerrainMesh.js +0 -499
  104. package/Build/Workers/createWallGeometry.js +0 -487
  105. package/Build/Workers/createWallOutlineGeometry.js +0 -335
  106. package/Build/Workers/decodeDraco.js +0 -369
  107. package/Build/Workers/decodeGoogleEarthEnterprisePacket.js +0 -2680
  108. package/Build/Workers/decodeI3S.js +0 -1339
  109. package/Build/Workers/gaussianSplatSorter.js +0 -62
  110. package/Build/Workers/gaussianSplatTextureGenerator.js +0 -68
  111. package/Build/Workers/incrementallyBuildTerrainPicker.js +0 -121
  112. package/Build/Workers/transcodeKTX2.js +0 -3463
  113. package/Build/Workers/transferTypedArrayTest.js +0 -41
  114. package/Build/Workers/upsampleQuantizedTerrainMesh.js +0 -820
  115. package/Build/Workers/upsampleVerticesFromCesium3DTilesTerrain.js +0 -95
@@ -1,2254 +0,0 @@
1
- /**
2
- * @license
3
- * Cesium - https://github.com/CesiumGS/cesium
4
- * Version 0.0.1
5
- *
6
- * Copyright 2011-2022 Cesium Contributors
7
- *
8
- * Licensed under the Apache License, Version 2.0 (the "License");
9
- * you may not use this file except in compliance with the License.
10
- * You may obtain a copy of the License at
11
- *
12
- * http://www.apache.org/licenses/LICENSE-2.0
13
- *
14
- * Unless required by applicable law or agreed to in writing, software
15
- * distributed under the License is distributed on an "AS IS" BASIS,
16
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
- * See the License for the specific language governing permissions and
18
- * limitations under the License.
19
- *
20
- * Columbus View (Pat. Pend.)
21
- *
22
- * Portions licensed separately.
23
- * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details.
24
- */
25
-
26
- import {
27
- EllipsoidalOccluder_default,
28
- TerrainEncoding_default
29
- } from "./chunk-OFJRMGNX.js";
30
- import {
31
- createTaskProcessorWorker_default
32
- } from "./chunk-TSAJNE4K.js";
33
- import {
34
- WebMercatorProjection_default
35
- } from "./chunk-SOR7PD4V.js";
36
- import {
37
- OrientedBoundingBox_default
38
- } from "./chunk-25BA4527.js";
39
- import "./chunk-6LZBBEA7.js";
40
- import "./chunk-WAS3IHIQ.js";
41
- import {
42
- AxisAlignedBoundingBox_default
43
- } from "./chunk-K4IMD7KH.js";
44
- import "./chunk-66YGZWBI.js";
45
- import "./chunk-J4MIJCN5.js";
46
- import {
47
- BoundingSphere_default
48
- } from "./chunk-OAOREOSO.js";
49
- import "./chunk-EKMWNF4U.js";
50
- import {
51
- Rectangle_default,
52
- Transforms_default
53
- } from "./chunk-KQIZ7AFF.js";
54
- import {
55
- Matrix4_default
56
- } from "./chunk-POY6ZE32.js";
57
- import "./chunk-AL22JVIA.js";
58
- import "./chunk-5VZISKJF.js";
59
- import {
60
- RuntimeError_default
61
- } from "./chunk-UYT2PBMV.js";
62
- import {
63
- Cartesian2_default,
64
- Ellipsoid_default
65
- } from "./chunk-YPGJSFOO.js";
66
- import {
67
- Cartesian3_default
68
- } from "./chunk-QWV2DM66.js";
69
- import {
70
- Math_default
71
- } from "./chunk-6XJO625E.js";
72
- import {
73
- DeveloperError_default
74
- } from "./chunk-KH2OWUUA.js";
75
- import {
76
- __commonJS,
77
- __toESM,
78
- defined_default
79
- } from "./chunk-AVSQILVI.js";
80
-
81
- // node_modules/lerc/LercDecode.js
82
- var require_LercDecode = __commonJS({
83
- "node_modules/lerc/LercDecode.js"(exports, module) {
84
- /* Copyright 2015-2018 Esri. 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 @preserve */
85
- (function() {
86
- var LercDecode = (function() {
87
- var CntZImage = {};
88
- CntZImage.defaultNoDataValue = -34027999387901484e22;
89
- CntZImage.decode = function(input, options) {
90
- options = options || {};
91
- var skipMask = options.encodedMaskData || options.encodedMaskData === null;
92
- var parsedData = parse(input, options.inputOffset || 0, skipMask);
93
- var noDataValue = options.noDataValue !== null ? options.noDataValue : CntZImage.defaultNoDataValue;
94
- var uncompressedData = uncompressPixelValues(
95
- parsedData,
96
- options.pixelType || Float32Array,
97
- options.encodedMaskData,
98
- noDataValue,
99
- options.returnMask
100
- );
101
- var result = {
102
- width: parsedData.width,
103
- height: parsedData.height,
104
- pixelData: uncompressedData.resultPixels,
105
- minValue: uncompressedData.minValue,
106
- maxValue: parsedData.pixels.maxValue,
107
- noDataValue
108
- };
109
- if (uncompressedData.resultMask) {
110
- result.maskData = uncompressedData.resultMask;
111
- }
112
- if (options.returnEncodedMask && parsedData.mask) {
113
- result.encodedMaskData = parsedData.mask.bitset ? parsedData.mask.bitset : null;
114
- }
115
- if (options.returnFileInfo) {
116
- result.fileInfo = formatFileInfo(parsedData);
117
- if (options.computeUsedBitDepths) {
118
- result.fileInfo.bitDepths = computeUsedBitDepths(parsedData);
119
- }
120
- }
121
- return result;
122
- };
123
- var uncompressPixelValues = function(data, TypedArrayClass, maskBitset, noDataValue, storeDecodedMask) {
124
- var blockIdx = 0;
125
- var numX = data.pixels.numBlocksX;
126
- var numY = data.pixels.numBlocksY;
127
- var blockWidth = Math.floor(data.width / numX);
128
- var blockHeight = Math.floor(data.height / numY);
129
- var scale = 2 * data.maxZError;
130
- var minValue = Number.MAX_VALUE, currentValue;
131
- maskBitset = maskBitset || (data.mask ? data.mask.bitset : null);
132
- var resultPixels, resultMask;
133
- resultPixels = new TypedArrayClass(data.width * data.height);
134
- if (storeDecodedMask && maskBitset) {
135
- resultMask = new Uint8Array(data.width * data.height);
136
- }
137
- var blockDataBuffer = new Float32Array(blockWidth * blockHeight);
138
- var xx, yy;
139
- for (var y = 0; y <= numY; y++) {
140
- var thisBlockHeight = y !== numY ? blockHeight : data.height % numY;
141
- if (thisBlockHeight === 0) {
142
- continue;
143
- }
144
- for (var x = 0; x <= numX; x++) {
145
- var thisBlockWidth = x !== numX ? blockWidth : data.width % numX;
146
- if (thisBlockWidth === 0) {
147
- continue;
148
- }
149
- var outPtr = y * data.width * blockHeight + x * blockWidth;
150
- var outStride = data.width - thisBlockWidth;
151
- var block = data.pixels.blocks[blockIdx];
152
- var blockData, blockPtr, constValue;
153
- if (block.encoding < 2) {
154
- if (block.encoding === 0) {
155
- blockData = block.rawData;
156
- } else {
157
- unstuff(block.stuffedData, block.bitsPerPixel, block.numValidPixels, block.offset, scale, blockDataBuffer, data.pixels.maxValue);
158
- blockData = blockDataBuffer;
159
- }
160
- blockPtr = 0;
161
- } else if (block.encoding === 2) {
162
- constValue = 0;
163
- } else {
164
- constValue = block.offset;
165
- }
166
- var maskByte;
167
- if (maskBitset) {
168
- for (yy = 0; yy < thisBlockHeight; yy++) {
169
- if (outPtr & 7) {
170
- maskByte = maskBitset[outPtr >> 3];
171
- maskByte <<= outPtr & 7;
172
- }
173
- for (xx = 0; xx < thisBlockWidth; xx++) {
174
- if (!(outPtr & 7)) {
175
- maskByte = maskBitset[outPtr >> 3];
176
- }
177
- if (maskByte & 128) {
178
- if (resultMask) {
179
- resultMask[outPtr] = 1;
180
- }
181
- currentValue = block.encoding < 2 ? blockData[blockPtr++] : constValue;
182
- minValue = minValue > currentValue ? currentValue : minValue;
183
- resultPixels[outPtr++] = currentValue;
184
- } else {
185
- if (resultMask) {
186
- resultMask[outPtr] = 0;
187
- }
188
- resultPixels[outPtr++] = noDataValue;
189
- }
190
- maskByte <<= 1;
191
- }
192
- outPtr += outStride;
193
- }
194
- } else {
195
- if (block.encoding < 2) {
196
- for (yy = 0; yy < thisBlockHeight; yy++) {
197
- for (xx = 0; xx < thisBlockWidth; xx++) {
198
- currentValue = blockData[blockPtr++];
199
- minValue = minValue > currentValue ? currentValue : minValue;
200
- resultPixels[outPtr++] = currentValue;
201
- }
202
- outPtr += outStride;
203
- }
204
- } else {
205
- minValue = minValue > constValue ? constValue : minValue;
206
- for (yy = 0; yy < thisBlockHeight; yy++) {
207
- for (xx = 0; xx < thisBlockWidth; xx++) {
208
- resultPixels[outPtr++] = constValue;
209
- }
210
- outPtr += outStride;
211
- }
212
- }
213
- }
214
- if (block.encoding === 1 && blockPtr !== block.numValidPixels) {
215
- throw "Block and Mask do not match";
216
- }
217
- blockIdx++;
218
- }
219
- }
220
- return {
221
- resultPixels,
222
- resultMask,
223
- minValue
224
- };
225
- };
226
- var formatFileInfo = function(data) {
227
- return {
228
- "fileIdentifierString": data.fileIdentifierString,
229
- "fileVersion": data.fileVersion,
230
- "imageType": data.imageType,
231
- "height": data.height,
232
- "width": data.width,
233
- "maxZError": data.maxZError,
234
- "eofOffset": data.eofOffset,
235
- "mask": data.mask ? {
236
- "numBlocksX": data.mask.numBlocksX,
237
- "numBlocksY": data.mask.numBlocksY,
238
- "numBytes": data.mask.numBytes,
239
- "maxValue": data.mask.maxValue
240
- } : null,
241
- "pixels": {
242
- "numBlocksX": data.pixels.numBlocksX,
243
- "numBlocksY": data.pixels.numBlocksY,
244
- "numBytes": data.pixels.numBytes,
245
- "maxValue": data.pixels.maxValue,
246
- "noDataValue": data.noDataValue
247
- }
248
- };
249
- };
250
- var computeUsedBitDepths = function(data) {
251
- var numBlocks = data.pixels.numBlocksX * data.pixels.numBlocksY;
252
- var bitDepths = {};
253
- for (var i = 0; i < numBlocks; i++) {
254
- var block = data.pixels.blocks[i];
255
- if (block.encoding === 0) {
256
- bitDepths.float32 = true;
257
- } else if (block.encoding === 1) {
258
- bitDepths[block.bitsPerPixel] = true;
259
- } else {
260
- bitDepths[0] = true;
261
- }
262
- }
263
- return Object.keys(bitDepths);
264
- };
265
- var parse = function(input, fp, skipMask) {
266
- var data = {};
267
- var fileIdView = new Uint8Array(input, fp, 10);
268
- data.fileIdentifierString = String.fromCharCode.apply(null, fileIdView);
269
- if (data.fileIdentifierString.trim() !== "CntZImage") {
270
- throw "Unexpected file identifier string: " + data.fileIdentifierString;
271
- }
272
- fp += 10;
273
- var view = new DataView(input, fp, 24);
274
- data.fileVersion = view.getInt32(0, true);
275
- data.imageType = view.getInt32(4, true);
276
- data.height = view.getUint32(8, true);
277
- data.width = view.getUint32(12, true);
278
- data.maxZError = view.getFloat64(16, true);
279
- fp += 24;
280
- if (!skipMask) {
281
- view = new DataView(input, fp, 16);
282
- data.mask = {};
283
- data.mask.numBlocksY = view.getUint32(0, true);
284
- data.mask.numBlocksX = view.getUint32(4, true);
285
- data.mask.numBytes = view.getUint32(8, true);
286
- data.mask.maxValue = view.getFloat32(12, true);
287
- fp += 16;
288
- if (data.mask.numBytes > 0) {
289
- var bitset = new Uint8Array(Math.ceil(data.width * data.height / 8));
290
- view = new DataView(input, fp, data.mask.numBytes);
291
- var cnt = view.getInt16(0, true);
292
- var ip = 2, op = 0;
293
- do {
294
- if (cnt > 0) {
295
- while (cnt--) {
296
- bitset[op++] = view.getUint8(ip++);
297
- }
298
- } else {
299
- var val = view.getUint8(ip++);
300
- cnt = -cnt;
301
- while (cnt--) {
302
- bitset[op++] = val;
303
- }
304
- }
305
- cnt = view.getInt16(ip, true);
306
- ip += 2;
307
- } while (ip < data.mask.numBytes);
308
- if (cnt !== -32768 || op < bitset.length) {
309
- throw "Unexpected end of mask RLE encoding";
310
- }
311
- data.mask.bitset = bitset;
312
- fp += data.mask.numBytes;
313
- } else if ((data.mask.numBytes | data.mask.numBlocksY | data.mask.maxValue) === 0) {
314
- data.mask.bitset = new Uint8Array(Math.ceil(data.width * data.height / 8));
315
- }
316
- }
317
- view = new DataView(input, fp, 16);
318
- data.pixels = {};
319
- data.pixels.numBlocksY = view.getUint32(0, true);
320
- data.pixels.numBlocksX = view.getUint32(4, true);
321
- data.pixels.numBytes = view.getUint32(8, true);
322
- data.pixels.maxValue = view.getFloat32(12, true);
323
- fp += 16;
324
- var numBlocksX = data.pixels.numBlocksX;
325
- var numBlocksY = data.pixels.numBlocksY;
326
- var actualNumBlocksX = numBlocksX + (data.width % numBlocksX > 0 ? 1 : 0);
327
- var actualNumBlocksY = numBlocksY + (data.height % numBlocksY > 0 ? 1 : 0);
328
- data.pixels.blocks = new Array(actualNumBlocksX * actualNumBlocksY);
329
- var blockI = 0;
330
- for (var blockY = 0; blockY < actualNumBlocksY; blockY++) {
331
- for (var blockX = 0; blockX < actualNumBlocksX; blockX++) {
332
- var size = 0;
333
- var bytesLeft = input.byteLength - fp;
334
- view = new DataView(input, fp, Math.min(10, bytesLeft));
335
- var block = {};
336
- data.pixels.blocks[blockI++] = block;
337
- var headerByte = view.getUint8(0);
338
- size++;
339
- block.encoding = headerByte & 63;
340
- if (block.encoding > 3) {
341
- throw "Invalid block encoding (" + block.encoding + ")";
342
- }
343
- if (block.encoding === 2) {
344
- fp++;
345
- continue;
346
- }
347
- if (headerByte !== 0 && headerByte !== 2) {
348
- headerByte >>= 6;
349
- block.offsetType = headerByte;
350
- if (headerByte === 2) {
351
- block.offset = view.getInt8(1);
352
- size++;
353
- } else if (headerByte === 1) {
354
- block.offset = view.getInt16(1, true);
355
- size += 2;
356
- } else if (headerByte === 0) {
357
- block.offset = view.getFloat32(1, true);
358
- size += 4;
359
- } else {
360
- throw "Invalid block offset type";
361
- }
362
- if (block.encoding === 1) {
363
- headerByte = view.getUint8(size);
364
- size++;
365
- block.bitsPerPixel = headerByte & 63;
366
- headerByte >>= 6;
367
- block.numValidPixelsType = headerByte;
368
- if (headerByte === 2) {
369
- block.numValidPixels = view.getUint8(size);
370
- size++;
371
- } else if (headerByte === 1) {
372
- block.numValidPixels = view.getUint16(size, true);
373
- size += 2;
374
- } else if (headerByte === 0) {
375
- block.numValidPixels = view.getUint32(size, true);
376
- size += 4;
377
- } else {
378
- throw "Invalid valid pixel count type";
379
- }
380
- }
381
- }
382
- fp += size;
383
- if (block.encoding === 3) {
384
- continue;
385
- }
386
- var arrayBuf, store8;
387
- if (block.encoding === 0) {
388
- var numPixels = (data.pixels.numBytes - 1) / 4;
389
- if (numPixels !== Math.floor(numPixels)) {
390
- throw "uncompressed block has invalid length";
391
- }
392
- arrayBuf = new ArrayBuffer(numPixels * 4);
393
- store8 = new Uint8Array(arrayBuf);
394
- store8.set(new Uint8Array(input, fp, numPixels * 4));
395
- var rawData = new Float32Array(arrayBuf);
396
- block.rawData = rawData;
397
- fp += numPixels * 4;
398
- } else if (block.encoding === 1) {
399
- var dataBytes = Math.ceil(block.numValidPixels * block.bitsPerPixel / 8);
400
- var dataWords = Math.ceil(dataBytes / 4);
401
- arrayBuf = new ArrayBuffer(dataWords * 4);
402
- store8 = new Uint8Array(arrayBuf);
403
- store8.set(new Uint8Array(input, fp, dataBytes));
404
- block.stuffedData = new Uint32Array(arrayBuf);
405
- fp += dataBytes;
406
- }
407
- }
408
- }
409
- data.eofOffset = fp;
410
- return data;
411
- };
412
- var unstuff = function(src, bitsPerPixel, numPixels, offset, scale, dest, maxValue) {
413
- var bitMask = (1 << bitsPerPixel) - 1;
414
- var i = 0, o;
415
- var bitsLeft = 0;
416
- var n, buffer;
417
- var nmax = Math.ceil((maxValue - offset) / scale);
418
- var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8);
419
- src[src.length - 1] <<= 8 * numInvalidTailBytes;
420
- for (o = 0; o < numPixels; o++) {
421
- if (bitsLeft === 0) {
422
- buffer = src[i++];
423
- bitsLeft = 32;
424
- }
425
- if (bitsLeft >= bitsPerPixel) {
426
- n = buffer >>> bitsLeft - bitsPerPixel & bitMask;
427
- bitsLeft -= bitsPerPixel;
428
- } else {
429
- var missingBits = bitsPerPixel - bitsLeft;
430
- n = (buffer & bitMask) << missingBits & bitMask;
431
- buffer = src[i++];
432
- bitsLeft = 32 - missingBits;
433
- n += buffer >>> bitsLeft;
434
- }
435
- dest[o] = n < nmax ? offset + n * scale : maxValue;
436
- }
437
- return dest;
438
- };
439
- return CntZImage;
440
- })();
441
- var Lerc2Decode = (function() {
442
- "use strict";
443
- var BitStuffer = {
444
- //methods ending with 2 are for the new byte order used by Lerc2.3 and above.
445
- //originalUnstuff is used to unpack Huffman code table. code is duplicated to unstuffx for performance reasons.
446
- unstuff: function(src, dest, bitsPerPixel, numPixels, lutArr, offset, scale, maxValue) {
447
- var bitMask = (1 << bitsPerPixel) - 1;
448
- var i = 0, o;
449
- var bitsLeft = 0;
450
- var n, buffer, missingBits, nmax;
451
- var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8);
452
- src[src.length - 1] <<= 8 * numInvalidTailBytes;
453
- if (lutArr) {
454
- for (o = 0; o < numPixels; o++) {
455
- if (bitsLeft === 0) {
456
- buffer = src[i++];
457
- bitsLeft = 32;
458
- }
459
- if (bitsLeft >= bitsPerPixel) {
460
- n = buffer >>> bitsLeft - bitsPerPixel & bitMask;
461
- bitsLeft -= bitsPerPixel;
462
- } else {
463
- missingBits = bitsPerPixel - bitsLeft;
464
- n = (buffer & bitMask) << missingBits & bitMask;
465
- buffer = src[i++];
466
- bitsLeft = 32 - missingBits;
467
- n += buffer >>> bitsLeft;
468
- }
469
- dest[o] = lutArr[n];
470
- }
471
- } else {
472
- nmax = Math.ceil((maxValue - offset) / scale);
473
- for (o = 0; o < numPixels; o++) {
474
- if (bitsLeft === 0) {
475
- buffer = src[i++];
476
- bitsLeft = 32;
477
- }
478
- if (bitsLeft >= bitsPerPixel) {
479
- n = buffer >>> bitsLeft - bitsPerPixel & bitMask;
480
- bitsLeft -= bitsPerPixel;
481
- } else {
482
- missingBits = bitsPerPixel - bitsLeft;
483
- n = (buffer & bitMask) << missingBits & bitMask;
484
- buffer = src[i++];
485
- bitsLeft = 32 - missingBits;
486
- n += buffer >>> bitsLeft;
487
- }
488
- dest[o] = n < nmax ? offset + n * scale : maxValue;
489
- }
490
- }
491
- },
492
- unstuffLUT: function(src, bitsPerPixel, numPixels, offset, scale, maxValue) {
493
- var bitMask = (1 << bitsPerPixel) - 1;
494
- var i = 0, o = 0, missingBits = 0, bitsLeft = 0, n = 0;
495
- var buffer;
496
- var dest = [];
497
- var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8);
498
- src[src.length - 1] <<= 8 * numInvalidTailBytes;
499
- var nmax = Math.ceil((maxValue - offset) / scale);
500
- for (o = 0; o < numPixels; o++) {
501
- if (bitsLeft === 0) {
502
- buffer = src[i++];
503
- bitsLeft = 32;
504
- }
505
- if (bitsLeft >= bitsPerPixel) {
506
- n = buffer >>> bitsLeft - bitsPerPixel & bitMask;
507
- bitsLeft -= bitsPerPixel;
508
- } else {
509
- missingBits = bitsPerPixel - bitsLeft;
510
- n = (buffer & bitMask) << missingBits & bitMask;
511
- buffer = src[i++];
512
- bitsLeft = 32 - missingBits;
513
- n += buffer >>> bitsLeft;
514
- }
515
- dest[o] = n < nmax ? offset + n * scale : maxValue;
516
- }
517
- dest.unshift(offset);
518
- return dest;
519
- },
520
- unstuff2: function(src, dest, bitsPerPixel, numPixels, lutArr, offset, scale, maxValue) {
521
- var bitMask = (1 << bitsPerPixel) - 1;
522
- var i = 0, o;
523
- var bitsLeft = 0, bitPos = 0;
524
- var n, buffer, missingBits;
525
- if (lutArr) {
526
- for (o = 0; o < numPixels; o++) {
527
- if (bitsLeft === 0) {
528
- buffer = src[i++];
529
- bitsLeft = 32;
530
- bitPos = 0;
531
- }
532
- if (bitsLeft >= bitsPerPixel) {
533
- n = buffer >>> bitPos & bitMask;
534
- bitsLeft -= bitsPerPixel;
535
- bitPos += bitsPerPixel;
536
- } else {
537
- missingBits = bitsPerPixel - bitsLeft;
538
- n = buffer >>> bitPos & bitMask;
539
- buffer = src[i++];
540
- bitsLeft = 32 - missingBits;
541
- n |= (buffer & (1 << missingBits) - 1) << bitsPerPixel - missingBits;
542
- bitPos = missingBits;
543
- }
544
- dest[o] = lutArr[n];
545
- }
546
- } else {
547
- var nmax = Math.ceil((maxValue - offset) / scale);
548
- for (o = 0; o < numPixels; o++) {
549
- if (bitsLeft === 0) {
550
- buffer = src[i++];
551
- bitsLeft = 32;
552
- bitPos = 0;
553
- }
554
- if (bitsLeft >= bitsPerPixel) {
555
- n = buffer >>> bitPos & bitMask;
556
- bitsLeft -= bitsPerPixel;
557
- bitPos += bitsPerPixel;
558
- } else {
559
- missingBits = bitsPerPixel - bitsLeft;
560
- n = buffer >>> bitPos & bitMask;
561
- buffer = src[i++];
562
- bitsLeft = 32 - missingBits;
563
- n |= (buffer & (1 << missingBits) - 1) << bitsPerPixel - missingBits;
564
- bitPos = missingBits;
565
- }
566
- dest[o] = n < nmax ? offset + n * scale : maxValue;
567
- }
568
- }
569
- return dest;
570
- },
571
- unstuffLUT2: function(src, bitsPerPixel, numPixels, offset, scale, maxValue) {
572
- var bitMask = (1 << bitsPerPixel) - 1;
573
- var i = 0, o = 0, missingBits = 0, bitsLeft = 0, n = 0, bitPos = 0;
574
- var buffer;
575
- var dest = [];
576
- var nmax = Math.ceil((maxValue - offset) / scale);
577
- for (o = 0; o < numPixels; o++) {
578
- if (bitsLeft === 0) {
579
- buffer = src[i++];
580
- bitsLeft = 32;
581
- bitPos = 0;
582
- }
583
- if (bitsLeft >= bitsPerPixel) {
584
- n = buffer >>> bitPos & bitMask;
585
- bitsLeft -= bitsPerPixel;
586
- bitPos += bitsPerPixel;
587
- } else {
588
- missingBits = bitsPerPixel - bitsLeft;
589
- n = buffer >>> bitPos & bitMask;
590
- buffer = src[i++];
591
- bitsLeft = 32 - missingBits;
592
- n |= (buffer & (1 << missingBits) - 1) << bitsPerPixel - missingBits;
593
- bitPos = missingBits;
594
- }
595
- dest[o] = n < nmax ? offset + n * scale : maxValue;
596
- }
597
- dest.unshift(offset);
598
- return dest;
599
- },
600
- originalUnstuff: function(src, dest, bitsPerPixel, numPixels) {
601
- var bitMask = (1 << bitsPerPixel) - 1;
602
- var i = 0, o;
603
- var bitsLeft = 0;
604
- var n, buffer, missingBits;
605
- var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8);
606
- src[src.length - 1] <<= 8 * numInvalidTailBytes;
607
- for (o = 0; o < numPixels; o++) {
608
- if (bitsLeft === 0) {
609
- buffer = src[i++];
610
- bitsLeft = 32;
611
- }
612
- if (bitsLeft >= bitsPerPixel) {
613
- n = buffer >>> bitsLeft - bitsPerPixel & bitMask;
614
- bitsLeft -= bitsPerPixel;
615
- } else {
616
- missingBits = bitsPerPixel - bitsLeft;
617
- n = (buffer & bitMask) << missingBits & bitMask;
618
- buffer = src[i++];
619
- bitsLeft = 32 - missingBits;
620
- n += buffer >>> bitsLeft;
621
- }
622
- dest[o] = n;
623
- }
624
- return dest;
625
- },
626
- originalUnstuff2: function(src, dest, bitsPerPixel, numPixels) {
627
- var bitMask = (1 << bitsPerPixel) - 1;
628
- var i = 0, o;
629
- var bitsLeft = 0, bitPos = 0;
630
- var n, buffer, missingBits;
631
- for (o = 0; o < numPixels; o++) {
632
- if (bitsLeft === 0) {
633
- buffer = src[i++];
634
- bitsLeft = 32;
635
- bitPos = 0;
636
- }
637
- if (bitsLeft >= bitsPerPixel) {
638
- n = buffer >>> bitPos & bitMask;
639
- bitsLeft -= bitsPerPixel;
640
- bitPos += bitsPerPixel;
641
- } else {
642
- missingBits = bitsPerPixel - bitsLeft;
643
- n = buffer >>> bitPos & bitMask;
644
- buffer = src[i++];
645
- bitsLeft = 32 - missingBits;
646
- n |= (buffer & (1 << missingBits) - 1) << bitsPerPixel - missingBits;
647
- bitPos = missingBits;
648
- }
649
- dest[o] = n;
650
- }
651
- return dest;
652
- }
653
- };
654
- var Lerc2Helpers = {
655
- HUFFMAN_LUT_BITS_MAX: 12,
656
- //use 2^12 lut, treat it like constant
657
- computeChecksumFletcher32: function(input) {
658
- var sum1 = 65535, sum2 = 65535;
659
- var len = input.length;
660
- var words = Math.floor(len / 2);
661
- var i = 0;
662
- while (words) {
663
- var tlen = words >= 359 ? 359 : words;
664
- words -= tlen;
665
- do {
666
- sum1 += input[i++] << 8;
667
- sum2 += sum1 += input[i++];
668
- } while (--tlen);
669
- sum1 = (sum1 & 65535) + (sum1 >>> 16);
670
- sum2 = (sum2 & 65535) + (sum2 >>> 16);
671
- }
672
- if (len & 1) {
673
- sum2 += sum1 += input[i] << 8;
674
- }
675
- sum1 = (sum1 & 65535) + (sum1 >>> 16);
676
- sum2 = (sum2 & 65535) + (sum2 >>> 16);
677
- return (sum2 << 16 | sum1) >>> 0;
678
- },
679
- readHeaderInfo: function(input, data) {
680
- var ptr = data.ptr;
681
- var fileIdView = new Uint8Array(input, ptr, 6);
682
- var headerInfo = {};
683
- headerInfo.fileIdentifierString = String.fromCharCode.apply(null, fileIdView);
684
- if (headerInfo.fileIdentifierString.lastIndexOf("Lerc2", 0) !== 0) {
685
- throw "Unexpected file identifier string (expect Lerc2 ): " + headerInfo.fileIdentifierString;
686
- }
687
- ptr += 6;
688
- var view = new DataView(input, ptr, 8);
689
- var fileVersion = view.getInt32(0, true);
690
- headerInfo.fileVersion = fileVersion;
691
- ptr += 4;
692
- if (fileVersion >= 3) {
693
- headerInfo.checksum = view.getUint32(4, true);
694
- ptr += 4;
695
- }
696
- view = new DataView(input, ptr, 12);
697
- headerInfo.height = view.getUint32(0, true);
698
- headerInfo.width = view.getUint32(4, true);
699
- ptr += 8;
700
- if (fileVersion >= 4) {
701
- headerInfo.numDims = view.getUint32(8, true);
702
- ptr += 4;
703
- } else {
704
- headerInfo.numDims = 1;
705
- }
706
- view = new DataView(input, ptr, 40);
707
- headerInfo.numValidPixel = view.getUint32(0, true);
708
- headerInfo.microBlockSize = view.getInt32(4, true);
709
- headerInfo.blobSize = view.getInt32(8, true);
710
- headerInfo.imageType = view.getInt32(12, true);
711
- headerInfo.maxZError = view.getFloat64(16, true);
712
- headerInfo.zMin = view.getFloat64(24, true);
713
- headerInfo.zMax = view.getFloat64(32, true);
714
- ptr += 40;
715
- data.headerInfo = headerInfo;
716
- data.ptr = ptr;
717
- var checksum, keyLength;
718
- if (fileVersion >= 3) {
719
- keyLength = fileVersion >= 4 ? 52 : 48;
720
- checksum = this.computeChecksumFletcher32(new Uint8Array(input, ptr - keyLength, headerInfo.blobSize - 14));
721
- if (checksum !== headerInfo.checksum) {
722
- throw "Checksum failed.";
723
- }
724
- }
725
- return true;
726
- },
727
- checkMinMaxRanges: function(input, data) {
728
- var headerInfo = data.headerInfo;
729
- var OutPixelTypeArray = this.getDataTypeArray(headerInfo.imageType);
730
- var rangeBytes = headerInfo.numDims * this.getDataTypeSize(headerInfo.imageType);
731
- var minValues = this.readSubArray(input, data.ptr, OutPixelTypeArray, rangeBytes);
732
- var maxValues = this.readSubArray(input, data.ptr + rangeBytes, OutPixelTypeArray, rangeBytes);
733
- data.ptr += 2 * rangeBytes;
734
- var i, equal = true;
735
- for (i = 0; i < headerInfo.numDims; i++) {
736
- if (minValues[i] !== maxValues[i]) {
737
- equal = false;
738
- break;
739
- }
740
- }
741
- headerInfo.minValues = minValues;
742
- headerInfo.maxValues = maxValues;
743
- return equal;
744
- },
745
- readSubArray: function(input, ptr, OutPixelTypeArray, numBytes) {
746
- var rawData;
747
- if (OutPixelTypeArray === Uint8Array) {
748
- rawData = new Uint8Array(input, ptr, numBytes);
749
- } else {
750
- var arrayBuf = new ArrayBuffer(numBytes);
751
- var store8 = new Uint8Array(arrayBuf);
752
- store8.set(new Uint8Array(input, ptr, numBytes));
753
- rawData = new OutPixelTypeArray(arrayBuf);
754
- }
755
- return rawData;
756
- },
757
- readMask: function(input, data) {
758
- var ptr = data.ptr;
759
- var headerInfo = data.headerInfo;
760
- var numPixels = headerInfo.width * headerInfo.height;
761
- var numValidPixel = headerInfo.numValidPixel;
762
- var view = new DataView(input, ptr, 4);
763
- var mask = {};
764
- mask.numBytes = view.getUint32(0, true);
765
- ptr += 4;
766
- if ((0 === numValidPixel || numPixels === numValidPixel) && 0 !== mask.numBytes) {
767
- throw "invalid mask";
768
- }
769
- var bitset, resultMask;
770
- if (numValidPixel === 0) {
771
- bitset = new Uint8Array(Math.ceil(numPixels / 8));
772
- mask.bitset = bitset;
773
- resultMask = new Uint8Array(numPixels);
774
- data.pixels.resultMask = resultMask;
775
- ptr += mask.numBytes;
776
- } else if (mask.numBytes > 0) {
777
- bitset = new Uint8Array(Math.ceil(numPixels / 8));
778
- view = new DataView(input, ptr, mask.numBytes);
779
- var cnt = view.getInt16(0, true);
780
- var ip = 2, op = 0, val = 0;
781
- do {
782
- if (cnt > 0) {
783
- while (cnt--) {
784
- bitset[op++] = view.getUint8(ip++);
785
- }
786
- } else {
787
- val = view.getUint8(ip++);
788
- cnt = -cnt;
789
- while (cnt--) {
790
- bitset[op++] = val;
791
- }
792
- }
793
- cnt = view.getInt16(ip, true);
794
- ip += 2;
795
- } while (ip < mask.numBytes);
796
- if (cnt !== -32768 || op < bitset.length) {
797
- throw "Unexpected end of mask RLE encoding";
798
- }
799
- resultMask = new Uint8Array(numPixels);
800
- var mb = 0, k = 0;
801
- for (k = 0; k < numPixels; k++) {
802
- if (k & 7) {
803
- mb = bitset[k >> 3];
804
- mb <<= k & 7;
805
- } else {
806
- mb = bitset[k >> 3];
807
- }
808
- if (mb & 128) {
809
- resultMask[k] = 1;
810
- }
811
- }
812
- data.pixels.resultMask = resultMask;
813
- mask.bitset = bitset;
814
- ptr += mask.numBytes;
815
- }
816
- data.ptr = ptr;
817
- data.mask = mask;
818
- return true;
819
- },
820
- readDataOneSweep: function(input, data, OutPixelTypeArray) {
821
- var ptr = data.ptr;
822
- var headerInfo = data.headerInfo;
823
- var numDims = headerInfo.numDims;
824
- var numPixels = headerInfo.width * headerInfo.height;
825
- var imageType = headerInfo.imageType;
826
- var numBytes = headerInfo.numValidPixel * Lerc2Helpers.getDataTypeSize(imageType) * numDims;
827
- var rawData;
828
- var mask = data.pixels.resultMask;
829
- if (OutPixelTypeArray === Uint8Array) {
830
- rawData = new Uint8Array(input, ptr, numBytes);
831
- } else {
832
- var arrayBuf = new ArrayBuffer(numBytes);
833
- var store8 = new Uint8Array(arrayBuf);
834
- store8.set(new Uint8Array(input, ptr, numBytes));
835
- rawData = new OutPixelTypeArray(arrayBuf);
836
- }
837
- if (rawData.length === numPixels * numDims) {
838
- data.pixels.resultPixels = rawData;
839
- } else {
840
- data.pixels.resultPixels = new OutPixelTypeArray(numPixels * numDims);
841
- var z = 0, k = 0, i = 0, nStart = 0;
842
- if (numDims > 1) {
843
- for (i = 0; i < numDims; i++) {
844
- nStart = i * numPixels;
845
- for (k = 0; k < numPixels; k++) {
846
- if (mask[k]) {
847
- data.pixels.resultPixels[nStart + k] = rawData[z++];
848
- }
849
- }
850
- }
851
- } else {
852
- for (k = 0; k < numPixels; k++) {
853
- if (mask[k]) {
854
- data.pixels.resultPixels[k] = rawData[z++];
855
- }
856
- }
857
- }
858
- }
859
- ptr += numBytes;
860
- data.ptr = ptr;
861
- return true;
862
- },
863
- readHuffmanTree: function(input, data) {
864
- var BITS_MAX = this.HUFFMAN_LUT_BITS_MAX;
865
- var view = new DataView(input, data.ptr, 16);
866
- data.ptr += 16;
867
- var version = view.getInt32(0, true);
868
- if (version < 2) {
869
- throw "unsupported Huffman version";
870
- }
871
- var size = view.getInt32(4, true);
872
- var i0 = view.getInt32(8, true);
873
- var i1 = view.getInt32(12, true);
874
- if (i0 >= i1) {
875
- return false;
876
- }
877
- var blockDataBuffer = new Uint32Array(i1 - i0);
878
- Lerc2Helpers.decodeBits(input, data, blockDataBuffer);
879
- var codeTable = [];
880
- var i, j, k, len;
881
- for (i = i0; i < i1; i++) {
882
- j = i - (i < size ? 0 : size);
883
- codeTable[j] = { first: blockDataBuffer[i - i0], second: null };
884
- }
885
- var dataBytes = input.byteLength - data.ptr;
886
- var dataWords = Math.ceil(dataBytes / 4);
887
- var arrayBuf = new ArrayBuffer(dataWords * 4);
888
- var store8 = new Uint8Array(arrayBuf);
889
- store8.set(new Uint8Array(input, data.ptr, dataBytes));
890
- var stuffedData = new Uint32Array(arrayBuf);
891
- var bitPos = 0, word, srcPtr = 0;
892
- word = stuffedData[0];
893
- for (i = i0; i < i1; i++) {
894
- j = i - (i < size ? 0 : size);
895
- len = codeTable[j].first;
896
- if (len > 0) {
897
- codeTable[j].second = word << bitPos >>> 32 - len;
898
- if (32 - bitPos >= len) {
899
- bitPos += len;
900
- if (bitPos === 32) {
901
- bitPos = 0;
902
- srcPtr++;
903
- word = stuffedData[srcPtr];
904
- }
905
- } else {
906
- bitPos += len - 32;
907
- srcPtr++;
908
- word = stuffedData[srcPtr];
909
- codeTable[j].second |= word >>> 32 - bitPos;
910
- }
911
- }
912
- }
913
- var numBitsLUT = 0, numBitsLUTQick = 0;
914
- var tree = new TreeNode();
915
- for (i = 0; i < codeTable.length; i++) {
916
- if (codeTable[i] !== void 0) {
917
- numBitsLUT = Math.max(numBitsLUT, codeTable[i].first);
918
- }
919
- }
920
- if (numBitsLUT >= BITS_MAX) {
921
- numBitsLUTQick = BITS_MAX;
922
- } else {
923
- numBitsLUTQick = numBitsLUT;
924
- }
925
- if (numBitsLUT >= 30) {
926
- console.log("WARning, large NUM LUT BITS IS " + numBitsLUT);
927
- }
928
- var decodeLut = [], entry, code, numEntries, jj, currentBit, node;
929
- for (i = i0; i < i1; i++) {
930
- j = i - (i < size ? 0 : size);
931
- len = codeTable[j].first;
932
- if (len > 0) {
933
- entry = [len, j];
934
- if (len <= numBitsLUTQick) {
935
- code = codeTable[j].second << numBitsLUTQick - len;
936
- numEntries = 1 << numBitsLUTQick - len;
937
- for (k = 0; k < numEntries; k++) {
938
- decodeLut[code | k] = entry;
939
- }
940
- } else {
941
- code = codeTable[j].second;
942
- node = tree;
943
- for (jj = len - 1; jj >= 0; jj--) {
944
- currentBit = code >>> jj & 1;
945
- if (currentBit) {
946
- if (!node.right) {
947
- node.right = new TreeNode();
948
- }
949
- node = node.right;
950
- } else {
951
- if (!node.left) {
952
- node.left = new TreeNode();
953
- }
954
- node = node.left;
955
- }
956
- if (jj === 0 && !node.val) {
957
- node.val = entry[1];
958
- }
959
- }
960
- }
961
- }
962
- }
963
- return {
964
- decodeLut,
965
- numBitsLUTQick,
966
- numBitsLUT,
967
- tree,
968
- stuffedData,
969
- srcPtr,
970
- bitPos
971
- };
972
- },
973
- readHuffman: function(input, data, OutPixelTypeArray) {
974
- var headerInfo = data.headerInfo;
975
- var numDims = headerInfo.numDims;
976
- var height = data.headerInfo.height;
977
- var width = data.headerInfo.width;
978
- var numPixels = width * height;
979
- var huffmanInfo = this.readHuffmanTree(input, data);
980
- var decodeLut = huffmanInfo.decodeLut;
981
- var tree = huffmanInfo.tree;
982
- var stuffedData = huffmanInfo.stuffedData;
983
- var srcPtr = huffmanInfo.srcPtr;
984
- var bitPos = huffmanInfo.bitPos;
985
- var numBitsLUTQick = huffmanInfo.numBitsLUTQick;
986
- var numBitsLUT = huffmanInfo.numBitsLUT;
987
- var offset = data.headerInfo.imageType === 0 ? 128 : 0;
988
- var node, val, delta, mask = data.pixels.resultMask, valTmp, valTmpQuick, currentBit;
989
- var i, j, k, ii;
990
- var prevVal = 0;
991
- if (bitPos > 0) {
992
- srcPtr++;
993
- bitPos = 0;
994
- }
995
- var word = stuffedData[srcPtr];
996
- var deltaEncode = data.encodeMode === 1;
997
- var resultPixelsAllDim = new OutPixelTypeArray(numPixels * numDims);
998
- var resultPixels = resultPixelsAllDim;
999
- var iDim;
1000
- for (iDim = 0; iDim < headerInfo.numDims; iDim++) {
1001
- if (numDims > 1) {
1002
- resultPixels = new OutPixelTypeArray(resultPixelsAllDim.buffer, numPixels * iDim, numPixels);
1003
- prevVal = 0;
1004
- }
1005
- if (data.headerInfo.numValidPixel === width * height) {
1006
- for (k = 0, i = 0; i < height; i++) {
1007
- for (j = 0; j < width; j++, k++) {
1008
- val = 0;
1009
- valTmp = word << bitPos >>> 32 - numBitsLUTQick;
1010
- valTmpQuick = valTmp;
1011
- if (32 - bitPos < numBitsLUTQick) {
1012
- valTmp |= stuffedData[srcPtr + 1] >>> 64 - bitPos - numBitsLUTQick;
1013
- valTmpQuick = valTmp;
1014
- }
1015
- if (decodeLut[valTmpQuick]) {
1016
- val = decodeLut[valTmpQuick][1];
1017
- bitPos += decodeLut[valTmpQuick][0];
1018
- } else {
1019
- valTmp = word << bitPos >>> 32 - numBitsLUT;
1020
- valTmpQuick = valTmp;
1021
- if (32 - bitPos < numBitsLUT) {
1022
- valTmp |= stuffedData[srcPtr + 1] >>> 64 - bitPos - numBitsLUT;
1023
- valTmpQuick = valTmp;
1024
- }
1025
- node = tree;
1026
- for (ii = 0; ii < numBitsLUT; ii++) {
1027
- currentBit = valTmp >>> numBitsLUT - ii - 1 & 1;
1028
- node = currentBit ? node.right : node.left;
1029
- if (!(node.left || node.right)) {
1030
- val = node.val;
1031
- bitPos = bitPos + ii + 1;
1032
- break;
1033
- }
1034
- }
1035
- }
1036
- if (bitPos >= 32) {
1037
- bitPos -= 32;
1038
- srcPtr++;
1039
- word = stuffedData[srcPtr];
1040
- }
1041
- delta = val - offset;
1042
- if (deltaEncode) {
1043
- if (j > 0) {
1044
- delta += prevVal;
1045
- } else if (i > 0) {
1046
- delta += resultPixels[k - width];
1047
- } else {
1048
- delta += prevVal;
1049
- }
1050
- delta &= 255;
1051
- resultPixels[k] = delta;
1052
- prevVal = delta;
1053
- } else {
1054
- resultPixels[k] = delta;
1055
- }
1056
- }
1057
- }
1058
- } else {
1059
- for (k = 0, i = 0; i < height; i++) {
1060
- for (j = 0; j < width; j++, k++) {
1061
- if (mask[k]) {
1062
- val = 0;
1063
- valTmp = word << bitPos >>> 32 - numBitsLUTQick;
1064
- valTmpQuick = valTmp;
1065
- if (32 - bitPos < numBitsLUTQick) {
1066
- valTmp |= stuffedData[srcPtr + 1] >>> 64 - bitPos - numBitsLUTQick;
1067
- valTmpQuick = valTmp;
1068
- }
1069
- if (decodeLut[valTmpQuick]) {
1070
- val = decodeLut[valTmpQuick][1];
1071
- bitPos += decodeLut[valTmpQuick][0];
1072
- } else {
1073
- valTmp = word << bitPos >>> 32 - numBitsLUT;
1074
- valTmpQuick = valTmp;
1075
- if (32 - bitPos < numBitsLUT) {
1076
- valTmp |= stuffedData[srcPtr + 1] >>> 64 - bitPos - numBitsLUT;
1077
- valTmpQuick = valTmp;
1078
- }
1079
- node = tree;
1080
- for (ii = 0; ii < numBitsLUT; ii++) {
1081
- currentBit = valTmp >>> numBitsLUT - ii - 1 & 1;
1082
- node = currentBit ? node.right : node.left;
1083
- if (!(node.left || node.right)) {
1084
- val = node.val;
1085
- bitPos = bitPos + ii + 1;
1086
- break;
1087
- }
1088
- }
1089
- }
1090
- if (bitPos >= 32) {
1091
- bitPos -= 32;
1092
- srcPtr++;
1093
- word = stuffedData[srcPtr];
1094
- }
1095
- delta = val - offset;
1096
- if (deltaEncode) {
1097
- if (j > 0 && mask[k - 1]) {
1098
- delta += prevVal;
1099
- } else if (i > 0 && mask[k - width]) {
1100
- delta += resultPixels[k - width];
1101
- } else {
1102
- delta += prevVal;
1103
- }
1104
- delta &= 255;
1105
- resultPixels[k] = delta;
1106
- prevVal = delta;
1107
- } else {
1108
- resultPixels[k] = delta;
1109
- }
1110
- }
1111
- }
1112
- }
1113
- }
1114
- data.ptr = data.ptr + (srcPtr + 1) * 4 + (bitPos > 0 ? 4 : 0);
1115
- }
1116
- data.pixels.resultPixels = resultPixelsAllDim;
1117
- },
1118
- decodeBits: function(input, data, blockDataBuffer, offset, iDim) {
1119
- {
1120
- var headerInfo = data.headerInfo;
1121
- var fileVersion = headerInfo.fileVersion;
1122
- var blockPtr = 0;
1123
- var view = new DataView(input, data.ptr, 5);
1124
- var headerByte = view.getUint8(0);
1125
- blockPtr++;
1126
- var bits67 = headerByte >> 6;
1127
- var n = bits67 === 0 ? 4 : 3 - bits67;
1128
- var doLut = (headerByte & 32) > 0 ? true : false;
1129
- var numBits = headerByte & 31;
1130
- var numElements = 0;
1131
- if (n === 1) {
1132
- numElements = view.getUint8(blockPtr);
1133
- blockPtr++;
1134
- } else if (n === 2) {
1135
- numElements = view.getUint16(blockPtr, true);
1136
- blockPtr += 2;
1137
- } else if (n === 4) {
1138
- numElements = view.getUint32(blockPtr, true);
1139
- blockPtr += 4;
1140
- } else {
1141
- throw "Invalid valid pixel count type";
1142
- }
1143
- var scale = 2 * headerInfo.maxZError;
1144
- var stuffedData, arrayBuf, store8, dataBytes, dataWords;
1145
- var lutArr, lutData, lutBytes, lutBitsPerElement, bitsPerPixel;
1146
- var zMax = headerInfo.numDims > 1 ? headerInfo.maxValues[iDim] : headerInfo.zMax;
1147
- if (doLut) {
1148
- data.counter.lut++;
1149
- lutBytes = view.getUint8(blockPtr);
1150
- lutBitsPerElement = numBits;
1151
- blockPtr++;
1152
- dataBytes = Math.ceil((lutBytes - 1) * numBits / 8);
1153
- dataWords = Math.ceil(dataBytes / 4);
1154
- arrayBuf = new ArrayBuffer(dataWords * 4);
1155
- store8 = new Uint8Array(arrayBuf);
1156
- data.ptr += blockPtr;
1157
- store8.set(new Uint8Array(input, data.ptr, dataBytes));
1158
- lutData = new Uint32Array(arrayBuf);
1159
- data.ptr += dataBytes;
1160
- bitsPerPixel = 0;
1161
- while (lutBytes - 1 >>> bitsPerPixel) {
1162
- bitsPerPixel++;
1163
- }
1164
- dataBytes = Math.ceil(numElements * bitsPerPixel / 8);
1165
- dataWords = Math.ceil(dataBytes / 4);
1166
- arrayBuf = new ArrayBuffer(dataWords * 4);
1167
- store8 = new Uint8Array(arrayBuf);
1168
- store8.set(new Uint8Array(input, data.ptr, dataBytes));
1169
- stuffedData = new Uint32Array(arrayBuf);
1170
- data.ptr += dataBytes;
1171
- if (fileVersion >= 3) {
1172
- lutArr = BitStuffer.unstuffLUT2(lutData, numBits, lutBytes - 1, offset, scale, zMax);
1173
- } else {
1174
- lutArr = BitStuffer.unstuffLUT(lutData, numBits, lutBytes - 1, offset, scale, zMax);
1175
- }
1176
- if (fileVersion >= 3) {
1177
- BitStuffer.unstuff2(stuffedData, blockDataBuffer, bitsPerPixel, numElements, lutArr);
1178
- } else {
1179
- BitStuffer.unstuff(stuffedData, blockDataBuffer, bitsPerPixel, numElements, lutArr);
1180
- }
1181
- } else {
1182
- data.counter.bitstuffer++;
1183
- bitsPerPixel = numBits;
1184
- data.ptr += blockPtr;
1185
- if (bitsPerPixel > 0) {
1186
- dataBytes = Math.ceil(numElements * bitsPerPixel / 8);
1187
- dataWords = Math.ceil(dataBytes / 4);
1188
- arrayBuf = new ArrayBuffer(dataWords * 4);
1189
- store8 = new Uint8Array(arrayBuf);
1190
- store8.set(new Uint8Array(input, data.ptr, dataBytes));
1191
- stuffedData = new Uint32Array(arrayBuf);
1192
- data.ptr += dataBytes;
1193
- if (fileVersion >= 3) {
1194
- if (offset == null) {
1195
- BitStuffer.originalUnstuff2(stuffedData, blockDataBuffer, bitsPerPixel, numElements);
1196
- } else {
1197
- BitStuffer.unstuff2(stuffedData, blockDataBuffer, bitsPerPixel, numElements, false, offset, scale, zMax);
1198
- }
1199
- } else {
1200
- if (offset == null) {
1201
- BitStuffer.originalUnstuff(stuffedData, blockDataBuffer, bitsPerPixel, numElements);
1202
- } else {
1203
- BitStuffer.unstuff(stuffedData, blockDataBuffer, bitsPerPixel, numElements, false, offset, scale, zMax);
1204
- }
1205
- }
1206
- }
1207
- }
1208
- }
1209
- },
1210
- readTiles: function(input, data, OutPixelTypeArray) {
1211
- var headerInfo = data.headerInfo;
1212
- var width = headerInfo.width;
1213
- var height = headerInfo.height;
1214
- var microBlockSize = headerInfo.microBlockSize;
1215
- var imageType = headerInfo.imageType;
1216
- var dataTypeSize = Lerc2Helpers.getDataTypeSize(imageType);
1217
- var numBlocksX = Math.ceil(width / microBlockSize);
1218
- var numBlocksY = Math.ceil(height / microBlockSize);
1219
- data.pixels.numBlocksY = numBlocksY;
1220
- data.pixels.numBlocksX = numBlocksX;
1221
- data.pixels.ptr = 0;
1222
- var row = 0, col = 0, blockY = 0, blockX = 0, thisBlockHeight = 0, thisBlockWidth = 0, bytesLeft = 0, headerByte = 0, bits67 = 0, testCode = 0, outPtr = 0, outStride = 0, numBytes = 0, bytesleft = 0, z = 0, blockPtr = 0;
1223
- var view, block, arrayBuf, store8, rawData;
1224
- var blockEncoding;
1225
- var blockDataBuffer = new OutPixelTypeArray(microBlockSize * microBlockSize);
1226
- var lastBlockHeight = height % microBlockSize || microBlockSize;
1227
- var lastBlockWidth = width % microBlockSize || microBlockSize;
1228
- var offsetType, offset;
1229
- var numDims = headerInfo.numDims, iDim;
1230
- var mask = data.pixels.resultMask;
1231
- var resultPixels = data.pixels.resultPixels;
1232
- for (blockY = 0; blockY < numBlocksY; blockY++) {
1233
- thisBlockHeight = blockY !== numBlocksY - 1 ? microBlockSize : lastBlockHeight;
1234
- for (blockX = 0; blockX < numBlocksX; blockX++) {
1235
- thisBlockWidth = blockX !== numBlocksX - 1 ? microBlockSize : lastBlockWidth;
1236
- outPtr = blockY * width * microBlockSize + blockX * microBlockSize;
1237
- outStride = width - thisBlockWidth;
1238
- for (iDim = 0; iDim < numDims; iDim++) {
1239
- if (numDims > 1) {
1240
- resultPixels = new OutPixelTypeArray(data.pixels.resultPixels.buffer, width * height * iDim * dataTypeSize, width * height);
1241
- }
1242
- bytesLeft = input.byteLength - data.ptr;
1243
- view = new DataView(input, data.ptr, Math.min(10, bytesLeft));
1244
- block = {};
1245
- blockPtr = 0;
1246
- headerByte = view.getUint8(0);
1247
- blockPtr++;
1248
- bits67 = headerByte >> 6 & 255;
1249
- testCode = headerByte >> 2 & 15;
1250
- if (testCode !== (blockX * microBlockSize >> 3 & 15)) {
1251
- throw "integrity issue";
1252
- }
1253
- blockEncoding = headerByte & 3;
1254
- if (blockEncoding > 3) {
1255
- data.ptr += blockPtr;
1256
- throw "Invalid block encoding (" + blockEncoding + ")";
1257
- } else if (blockEncoding === 2) {
1258
- data.counter.constant++;
1259
- data.ptr += blockPtr;
1260
- continue;
1261
- } else if (blockEncoding === 0) {
1262
- data.counter.uncompressed++;
1263
- data.ptr += blockPtr;
1264
- numBytes = thisBlockHeight * thisBlockWidth * dataTypeSize;
1265
- bytesleft = input.byteLength - data.ptr;
1266
- numBytes = numBytes < bytesleft ? numBytes : bytesleft;
1267
- arrayBuf = new ArrayBuffer(numBytes % dataTypeSize === 0 ? numBytes : numBytes + dataTypeSize - numBytes % dataTypeSize);
1268
- store8 = new Uint8Array(arrayBuf);
1269
- store8.set(new Uint8Array(input, data.ptr, numBytes));
1270
- rawData = new OutPixelTypeArray(arrayBuf);
1271
- z = 0;
1272
- if (mask) {
1273
- for (row = 0; row < thisBlockHeight; row++) {
1274
- for (col = 0; col < thisBlockWidth; col++) {
1275
- if (mask[outPtr]) {
1276
- resultPixels[outPtr] = rawData[z++];
1277
- }
1278
- outPtr++;
1279
- }
1280
- outPtr += outStride;
1281
- }
1282
- } else {
1283
- for (row = 0; row < thisBlockHeight; row++) {
1284
- for (col = 0; col < thisBlockWidth; col++) {
1285
- resultPixels[outPtr++] = rawData[z++];
1286
- }
1287
- outPtr += outStride;
1288
- }
1289
- }
1290
- data.ptr += z * dataTypeSize;
1291
- } else {
1292
- offsetType = Lerc2Helpers.getDataTypeUsed(imageType, bits67);
1293
- offset = Lerc2Helpers.getOnePixel(block, blockPtr, offsetType, view);
1294
- blockPtr += Lerc2Helpers.getDataTypeSize(offsetType);
1295
- if (blockEncoding === 3) {
1296
- data.ptr += blockPtr;
1297
- data.counter.constantoffset++;
1298
- if (mask) {
1299
- for (row = 0; row < thisBlockHeight; row++) {
1300
- for (col = 0; col < thisBlockWidth; col++) {
1301
- if (mask[outPtr]) {
1302
- resultPixels[outPtr] = offset;
1303
- }
1304
- outPtr++;
1305
- }
1306
- outPtr += outStride;
1307
- }
1308
- } else {
1309
- for (row = 0; row < thisBlockHeight; row++) {
1310
- for (col = 0; col < thisBlockWidth; col++) {
1311
- resultPixels[outPtr++] = offset;
1312
- }
1313
- outPtr += outStride;
1314
- }
1315
- }
1316
- } else {
1317
- data.ptr += blockPtr;
1318
- Lerc2Helpers.decodeBits(input, data, blockDataBuffer, offset, iDim);
1319
- blockPtr = 0;
1320
- if (mask) {
1321
- for (row = 0; row < thisBlockHeight; row++) {
1322
- for (col = 0; col < thisBlockWidth; col++) {
1323
- if (mask[outPtr]) {
1324
- resultPixels[outPtr] = blockDataBuffer[blockPtr++];
1325
- }
1326
- outPtr++;
1327
- }
1328
- outPtr += outStride;
1329
- }
1330
- } else {
1331
- for (row = 0; row < thisBlockHeight; row++) {
1332
- for (col = 0; col < thisBlockWidth; col++) {
1333
- resultPixels[outPtr++] = blockDataBuffer[blockPtr++];
1334
- }
1335
- outPtr += outStride;
1336
- }
1337
- }
1338
- }
1339
- }
1340
- }
1341
- }
1342
- }
1343
- },
1344
- /*****************
1345
- * private methods (helper methods)
1346
- *****************/
1347
- formatFileInfo: function(data) {
1348
- return {
1349
- "fileIdentifierString": data.headerInfo.fileIdentifierString,
1350
- "fileVersion": data.headerInfo.fileVersion,
1351
- "imageType": data.headerInfo.imageType,
1352
- "height": data.headerInfo.height,
1353
- "width": data.headerInfo.width,
1354
- "numValidPixel": data.headerInfo.numValidPixel,
1355
- "microBlockSize": data.headerInfo.microBlockSize,
1356
- "blobSize": data.headerInfo.blobSize,
1357
- "maxZError": data.headerInfo.maxZError,
1358
- "pixelType": Lerc2Helpers.getPixelType(data.headerInfo.imageType),
1359
- "eofOffset": data.eofOffset,
1360
- "mask": data.mask ? {
1361
- "numBytes": data.mask.numBytes
1362
- } : null,
1363
- "pixels": {
1364
- "numBlocksX": data.pixels.numBlocksX,
1365
- "numBlocksY": data.pixels.numBlocksY,
1366
- //"numBytes": data.pixels.numBytes,
1367
- "maxValue": data.headerInfo.zMax,
1368
- "minValue": data.headerInfo.zMin,
1369
- "noDataValue": data.noDataValue
1370
- }
1371
- };
1372
- },
1373
- constructConstantSurface: function(data) {
1374
- var val = data.headerInfo.zMax;
1375
- var numDims = data.headerInfo.numDims;
1376
- var numPixels = data.headerInfo.height * data.headerInfo.width;
1377
- var numPixelAllDims = numPixels * numDims;
1378
- var i = 0, k = 0, nStart = 0;
1379
- var mask = data.pixels.resultMask;
1380
- if (mask) {
1381
- if (numDims > 1) {
1382
- for (i = 0; i < numDims; i++) {
1383
- nStart = i * numPixels;
1384
- for (k = 0; k < numPixels; k++) {
1385
- if (mask[k]) {
1386
- data.pixels.resultPixels[nStart + k] = val;
1387
- }
1388
- }
1389
- }
1390
- } else {
1391
- for (k = 0; k < numPixels; k++) {
1392
- if (mask[k]) {
1393
- data.pixels.resultPixels[k] = val;
1394
- }
1395
- }
1396
- }
1397
- } else {
1398
- if (data.pixels.resultPixels.fill) {
1399
- data.pixels.resultPixels.fill(val);
1400
- } else {
1401
- for (k = 0; k < numPixelAllDims; k++) {
1402
- data.pixels.resultPixels[k] = val;
1403
- }
1404
- }
1405
- }
1406
- return;
1407
- },
1408
- getDataTypeArray: function(t) {
1409
- var tp;
1410
- switch (t) {
1411
- case 0:
1412
- tp = Int8Array;
1413
- break;
1414
- case 1:
1415
- tp = Uint8Array;
1416
- break;
1417
- case 2:
1418
- tp = Int16Array;
1419
- break;
1420
- case 3:
1421
- tp = Uint16Array;
1422
- break;
1423
- case 4:
1424
- tp = Int32Array;
1425
- break;
1426
- case 5:
1427
- tp = Uint32Array;
1428
- break;
1429
- case 6:
1430
- tp = Float32Array;
1431
- break;
1432
- case 7:
1433
- tp = Float64Array;
1434
- break;
1435
- default:
1436
- tp = Float32Array;
1437
- }
1438
- return tp;
1439
- },
1440
- getPixelType: function(t) {
1441
- var tp;
1442
- switch (t) {
1443
- case 0:
1444
- tp = "S8";
1445
- break;
1446
- case 1:
1447
- tp = "U8";
1448
- break;
1449
- case 2:
1450
- tp = "S16";
1451
- break;
1452
- case 3:
1453
- tp = "U16";
1454
- break;
1455
- case 4:
1456
- tp = "S32";
1457
- break;
1458
- case 5:
1459
- tp = "U32";
1460
- break;
1461
- case 6:
1462
- tp = "F32";
1463
- break;
1464
- case 7:
1465
- tp = "F64";
1466
- break;
1467
- default:
1468
- tp = "F32";
1469
- }
1470
- return tp;
1471
- },
1472
- isValidPixelValue: function(t, val) {
1473
- if (val == null) {
1474
- return false;
1475
- }
1476
- var isValid;
1477
- switch (t) {
1478
- case 0:
1479
- isValid = val >= -128 && val <= 127;
1480
- break;
1481
- case 1:
1482
- isValid = val >= 0 && val <= 255;
1483
- break;
1484
- case 2:
1485
- isValid = val >= -32768 && val <= 32767;
1486
- break;
1487
- case 3:
1488
- isValid = val >= 0 && val <= 65536;
1489
- break;
1490
- case 4:
1491
- isValid = val >= -2147483648 && val <= 2147483647;
1492
- break;
1493
- case 5:
1494
- isValid = val >= 0 && val <= 4294967296;
1495
- break;
1496
- case 6:
1497
- isValid = val >= -34027999387901484e22 && val <= 34027999387901484e22;
1498
- break;
1499
- case 7:
1500
- isValid = val >= 5e-324 && val <= 17976931348623157e292;
1501
- break;
1502
- default:
1503
- isValid = false;
1504
- }
1505
- return isValid;
1506
- },
1507
- getDataTypeSize: function(t) {
1508
- var s = 0;
1509
- switch (t) {
1510
- case 0:
1511
- //ubyte
1512
- case 1:
1513
- s = 1;
1514
- break;
1515
- case 2:
1516
- //short
1517
- case 3:
1518
- s = 2;
1519
- break;
1520
- case 4:
1521
- case 5:
1522
- case 6:
1523
- s = 4;
1524
- break;
1525
- case 7:
1526
- s = 8;
1527
- break;
1528
- default:
1529
- s = t;
1530
- }
1531
- return s;
1532
- },
1533
- getDataTypeUsed: function(dt, tc) {
1534
- var t = dt;
1535
- switch (dt) {
1536
- case 2:
1537
- //short
1538
- case 4:
1539
- t = dt - tc;
1540
- break;
1541
- case 3:
1542
- //ushort
1543
- case 5:
1544
- t = dt - 2 * tc;
1545
- break;
1546
- case 6:
1547
- if (0 === tc) {
1548
- t = dt;
1549
- } else if (1 === tc) {
1550
- t = 2;
1551
- } else {
1552
- t = 1;
1553
- }
1554
- break;
1555
- case 7:
1556
- if (0 === tc) {
1557
- t = dt;
1558
- } else {
1559
- t = dt - 2 * tc + 1;
1560
- }
1561
- break;
1562
- default:
1563
- t = dt;
1564
- break;
1565
- }
1566
- return t;
1567
- },
1568
- getOnePixel: function(block, blockPtr, offsetType, view) {
1569
- var temp = 0;
1570
- switch (offsetType) {
1571
- case 0:
1572
- temp = view.getInt8(blockPtr);
1573
- break;
1574
- case 1:
1575
- temp = view.getUint8(blockPtr);
1576
- break;
1577
- case 2:
1578
- temp = view.getInt16(blockPtr, true);
1579
- break;
1580
- case 3:
1581
- temp = view.getUint16(blockPtr, true);
1582
- break;
1583
- case 4:
1584
- temp = view.getInt32(blockPtr, true);
1585
- break;
1586
- case 5:
1587
- temp = view.getUInt32(blockPtr, true);
1588
- break;
1589
- case 6:
1590
- temp = view.getFloat32(blockPtr, true);
1591
- break;
1592
- case 7:
1593
- temp = view.getFloat64(blockPtr, true);
1594
- break;
1595
- default:
1596
- throw "the decoder does not understand this pixel type";
1597
- }
1598
- return temp;
1599
- }
1600
- };
1601
- var TreeNode = function(val, left, right) {
1602
- this.val = val;
1603
- this.left = left;
1604
- this.right = right;
1605
- };
1606
- var Lerc2Decode2 = {
1607
- /*
1608
- * ********removed options compared to LERC1. We can bring some of them back if needed.
1609
- * removed pixel type. LERC2 is typed and doesn't require user to give pixel type
1610
- * changed encodedMaskData to maskData. LERC2 's js version make it faster to use maskData directly.
1611
- * removed returnMask. mask is used by LERC2 internally and is cost free. In case of user input mask, it's returned as well and has neglible cost.
1612
- * removed nodatavalue. Because LERC2 pixels are typed, nodatavalue will sacrify a useful value for many types (8bit, 16bit) etc,
1613
- * user has to be knowledgable enough about raster and their data to avoid usability issues. so nodata value is simply removed now.
1614
- * We can add it back later if their's a clear requirement.
1615
- * removed encodedMask. This option was not implemented in LercDecode. It can be done after decoding (less efficient)
1616
- * removed computeUsedBitDepths.
1617
- *
1618
- *
1619
- * response changes compared to LERC1
1620
- * 1. encodedMaskData is not available
1621
- * 2. noDataValue is optional (returns only if user's noDataValue is with in the valid data type range)
1622
- * 3. maskData is always available
1623
- */
1624
- /*****************
1625
- * public properties
1626
- ******************/
1627
- //HUFFMAN_LUT_BITS_MAX: 12, //use 2^12 lut, not configurable
1628
- /*****************
1629
- * public methods
1630
- *****************/
1631
- /**
1632
- * Decode a LERC2 byte stream and return an object containing the pixel data and optional metadata.
1633
- *
1634
- * @param {ArrayBuffer} input The LERC input byte stream
1635
- * @param {object} [options] options Decoding options
1636
- * @param {number} [options.inputOffset] The number of bytes to skip in the input byte stream. A valid LERC file is expected at that position
1637
- * @param {boolean} [options.returnFileInfo] If true, the return value will have a fileInfo property that contains metadata obtained from the LERC headers and the decoding process
1638
- */
1639
- decode: function(input, options) {
1640
- options = options || {};
1641
- var noDataValue = options.noDataValue;
1642
- var i = 0, data = {};
1643
- data.ptr = options.inputOffset || 0;
1644
- data.pixels = {};
1645
- if (!Lerc2Helpers.readHeaderInfo(input, data)) {
1646
- return;
1647
- }
1648
- var headerInfo = data.headerInfo;
1649
- var fileVersion = headerInfo.fileVersion;
1650
- var OutPixelTypeArray = Lerc2Helpers.getDataTypeArray(headerInfo.imageType);
1651
- Lerc2Helpers.readMask(input, data);
1652
- if (headerInfo.numValidPixel !== headerInfo.width * headerInfo.height && !data.pixels.resultMask) {
1653
- data.pixels.resultMask = options.maskData;
1654
- }
1655
- var numPixels = headerInfo.width * headerInfo.height;
1656
- data.pixels.resultPixels = new OutPixelTypeArray(numPixels * headerInfo.numDims);
1657
- data.counter = {
1658
- onesweep: 0,
1659
- uncompressed: 0,
1660
- lut: 0,
1661
- bitstuffer: 0,
1662
- constant: 0,
1663
- constantoffset: 0
1664
- };
1665
- if (headerInfo.numValidPixel !== 0) {
1666
- if (headerInfo.zMax === headerInfo.zMin) {
1667
- Lerc2Helpers.constructConstantSurface(data);
1668
- } else if (fileVersion >= 4 && Lerc2Helpers.checkMinMaxRanges(input, data)) {
1669
- Lerc2Helpers.constructConstantSurface(data);
1670
- } else {
1671
- var view = new DataView(input, data.ptr, 2);
1672
- var bReadDataOneSweep = view.getUint8(0);
1673
- data.ptr++;
1674
- if (bReadDataOneSweep) {
1675
- Lerc2Helpers.readDataOneSweep(input, data, OutPixelTypeArray);
1676
- } else {
1677
- if (fileVersion > 1 && headerInfo.imageType <= 1 && Math.abs(headerInfo.maxZError - 0.5) < 1e-5) {
1678
- var flagHuffman = view.getUint8(1);
1679
- data.ptr++;
1680
- data.encodeMode = flagHuffman;
1681
- if (flagHuffman > 2 || fileVersion < 4 && flagHuffman > 1) {
1682
- throw "Invalid Huffman flag " + flagHuffman;
1683
- }
1684
- if (flagHuffman) {
1685
- Lerc2Helpers.readHuffman(input, data, OutPixelTypeArray);
1686
- } else {
1687
- Lerc2Helpers.readTiles(input, data, OutPixelTypeArray);
1688
- }
1689
- } else {
1690
- Lerc2Helpers.readTiles(input, data, OutPixelTypeArray);
1691
- }
1692
- }
1693
- }
1694
- }
1695
- data.eofOffset = data.ptr;
1696
- var diff;
1697
- if (options.inputOffset) {
1698
- diff = data.headerInfo.blobSize + options.inputOffset - data.ptr;
1699
- if (Math.abs(diff) >= 1) {
1700
- data.eofOffset = options.inputOffset + data.headerInfo.blobSize;
1701
- }
1702
- } else {
1703
- diff = data.headerInfo.blobSize - data.ptr;
1704
- if (Math.abs(diff) >= 1) {
1705
- data.eofOffset = data.headerInfo.blobSize;
1706
- }
1707
- }
1708
- var result = {
1709
- width: headerInfo.width,
1710
- height: headerInfo.height,
1711
- pixelData: data.pixels.resultPixels,
1712
- minValue: headerInfo.zMin,
1713
- maxValue: headerInfo.zMax,
1714
- validPixelCount: headerInfo.numValidPixel,
1715
- dimCount: headerInfo.numDims,
1716
- dimStats: {
1717
- minValues: headerInfo.minValues,
1718
- maxValues: headerInfo.maxValues
1719
- },
1720
- maskData: data.pixels.resultMask
1721
- //noDataValue: noDataValue
1722
- };
1723
- if (data.pixels.resultMask && Lerc2Helpers.isValidPixelValue(headerInfo.imageType, noDataValue)) {
1724
- var mask = data.pixels.resultMask;
1725
- for (i = 0; i < numPixels; i++) {
1726
- if (!mask[i]) {
1727
- result.pixelData[i] = noDataValue;
1728
- }
1729
- }
1730
- result.noDataValue = noDataValue;
1731
- }
1732
- data.noDataValue = noDataValue;
1733
- if (options.returnFileInfo) {
1734
- result.fileInfo = Lerc2Helpers.formatFileInfo(data);
1735
- }
1736
- return result;
1737
- },
1738
- getBandCount: function(input) {
1739
- var count = 0;
1740
- var i = 0;
1741
- var temp = {};
1742
- temp.ptr = 0;
1743
- temp.pixels = {};
1744
- while (i < input.byteLength - 58) {
1745
- Lerc2Helpers.readHeaderInfo(input, temp);
1746
- i += temp.headerInfo.blobSize;
1747
- count++;
1748
- temp.ptr = i;
1749
- }
1750
- return count;
1751
- }
1752
- };
1753
- return Lerc2Decode2;
1754
- })();
1755
- var isPlatformLittleEndian = (function() {
1756
- var a = new ArrayBuffer(4);
1757
- var b = new Uint8Array(a);
1758
- var c = new Uint32Array(a);
1759
- c[0] = 1;
1760
- return b[0] === 1;
1761
- })();
1762
- var Lerc2 = {
1763
- /************wrapper**********************************************/
1764
- /**
1765
- * A wrapper for decoding both LERC1 and LERC2 byte streams capable of handling multiband pixel blocks for various pixel types.
1766
- *
1767
- * @alias module:Lerc
1768
- * @param {ArrayBuffer} input The LERC input byte stream
1769
- * @param {object} [options] The decoding options below are optional.
1770
- * @param {number} [options.inputOffset] The number of bytes to skip in the input byte stream. A valid Lerc file is expected at that position.
1771
- * @param {string} [options.pixelType] (LERC1 only) Default value is F32. Valid pixel types for input are U8/S8/S16/U16/S32/U32/F32.
1772
- * @param {number} [options.noDataValue] (LERC1 only). It is recommended to use the returned mask instead of setting this value.
1773
- * @returns {{width, height, pixels, pixelType, mask, statistics}}
1774
- * @property {number} width Width of decoded image.
1775
- * @property {number} height Height of decoded image.
1776
- * @property {array} pixels [band1, band2, …] Each band is a typed array of width*height.
1777
- * @property {string} pixelType The type of pixels represented in the output.
1778
- * @property {mask} mask Typed array with a size of width*height, or null if all pixels are valid.
1779
- * @property {array} statistics [statistics_band1, statistics_band2, …] Each element is a statistics object representing min and max values
1780
- **/
1781
- decode: function(encodedData, options) {
1782
- if (!isPlatformLittleEndian) {
1783
- throw "Big endian system is not supported.";
1784
- }
1785
- options = options || {};
1786
- var inputOffset = options.inputOffset || 0;
1787
- var fileIdView = new Uint8Array(encodedData, inputOffset, 10);
1788
- var fileIdentifierString = String.fromCharCode.apply(null, fileIdView);
1789
- var lerc, majorVersion;
1790
- if (fileIdentifierString.trim() === "CntZImage") {
1791
- lerc = LercDecode;
1792
- majorVersion = 1;
1793
- } else if (fileIdentifierString.substring(0, 5) === "Lerc2") {
1794
- lerc = Lerc2Decode;
1795
- majorVersion = 2;
1796
- } else {
1797
- throw "Unexpected file identifier string: " + fileIdentifierString;
1798
- }
1799
- var iPlane = 0, eof = encodedData.byteLength - 10, encodedMaskData, bandMasks = [], bandMask, maskData;
1800
- var decodedPixelBlock = {
1801
- width: 0,
1802
- height: 0,
1803
- pixels: [],
1804
- pixelType: options.pixelType,
1805
- mask: null,
1806
- statistics: []
1807
- };
1808
- while (inputOffset < eof) {
1809
- var result = lerc.decode(encodedData, {
1810
- inputOffset,
1811
- //for both lerc1 and lerc2
1812
- encodedMaskData,
1813
- //lerc1 only
1814
- maskData,
1815
- //lerc2 only
1816
- returnMask: iPlane === 0 ? true : false,
1817
- //lerc1 only
1818
- returnEncodedMask: iPlane === 0 ? true : false,
1819
- //lerc1 only
1820
- returnFileInfo: true,
1821
- //for both lerc1 and lerc2
1822
- pixelType: options.pixelType || null,
1823
- //lerc1 only
1824
- noDataValue: options.noDataValue || null
1825
- //lerc1 only
1826
- });
1827
- inputOffset = result.fileInfo.eofOffset;
1828
- if (iPlane === 0) {
1829
- encodedMaskData = result.encodedMaskData;
1830
- maskData = result.maskData;
1831
- decodedPixelBlock.width = result.width;
1832
- decodedPixelBlock.height = result.height;
1833
- decodedPixelBlock.dimCount = result.dimCount || 1;
1834
- decodedPixelBlock.pixelType = result.pixelType || result.fileInfo.pixelType;
1835
- decodedPixelBlock.mask = result.maskData;
1836
- }
1837
- if (majorVersion > 1 && result.fileInfo.mask && result.fileInfo.mask.numBytes > 0) {
1838
- bandMasks.push(result.maskData);
1839
- }
1840
- iPlane++;
1841
- decodedPixelBlock.pixels.push(result.pixelData);
1842
- decodedPixelBlock.statistics.push({
1843
- minValue: result.minValue,
1844
- maxValue: result.maxValue,
1845
- noDataValue: result.noDataValue,
1846
- dimStats: result.dimStats
1847
- });
1848
- }
1849
- var i, j, numPixels;
1850
- if (majorVersion > 1 && bandMasks.length > 1) {
1851
- numPixels = decodedPixelBlock.width * decodedPixelBlock.height;
1852
- decodedPixelBlock.bandMasks = bandMasks;
1853
- maskData = new Uint8Array(numPixels);
1854
- maskData.set(bandMasks[0]);
1855
- for (i = 1; i < bandMasks.length; i++) {
1856
- bandMask = bandMasks[i];
1857
- for (j = 0; j < numPixels; j++) {
1858
- maskData[j] = maskData[j] & bandMask[j];
1859
- }
1860
- }
1861
- decodedPixelBlock.maskData = maskData;
1862
- }
1863
- return decodedPixelBlock;
1864
- }
1865
- };
1866
- if (typeof define === "function" && define.amd) {
1867
- define([], function() {
1868
- return Lerc2;
1869
- });
1870
- } else if (typeof module !== "undefined" && module.exports) {
1871
- module.exports = Lerc2;
1872
- } else {
1873
- this.Lerc = Lerc2;
1874
- }
1875
- })();
1876
- }
1877
- });
1878
-
1879
- // packages/engine/Source/Core/HeightmapEncoding.js
1880
- var HeightmapEncoding = {
1881
- /**
1882
- * No encoding
1883
- *
1884
- * @type {number}
1885
- * @constant
1886
- */
1887
- NONE: 0,
1888
- /**
1889
- * LERC encoding
1890
- *
1891
- * @type {number}
1892
- * @constant
1893
- *
1894
- * @see {@link https://github.com/Esri/lerc|The LERC specification}
1895
- */
1896
- LERC: 1
1897
- };
1898
- var HeightmapEncoding_default = Object.freeze(HeightmapEncoding);
1899
-
1900
- // packages/engine/Source/Core/HeightmapTessellator.js
1901
- var HeightmapTessellator = {};
1902
- HeightmapTessellator.DEFAULT_STRUCTURE = Object.freeze({
1903
- heightScale: 1,
1904
- heightOffset: 0,
1905
- elementsPerHeight: 1,
1906
- stride: 1,
1907
- elementMultiplier: 256,
1908
- isBigEndian: false
1909
- });
1910
- var cartesian3Scratch = new Cartesian3_default();
1911
- var matrix4Scratch = new Matrix4_default();
1912
- var minimumScratch = new Cartesian3_default();
1913
- var maximumScratch = new Cartesian3_default();
1914
- HeightmapTessellator.computeVertices = function(options) {
1915
- if (!defined_default(options) || !defined_default(options.heightmap)) {
1916
- throw new DeveloperError_default("options.heightmap is required.");
1917
- }
1918
- if (!defined_default(options.width) || !defined_default(options.height)) {
1919
- throw new DeveloperError_default("options.width and options.height are required.");
1920
- }
1921
- if (!defined_default(options.nativeRectangle)) {
1922
- throw new DeveloperError_default("options.nativeRectangle is required.");
1923
- }
1924
- if (!defined_default(options.skirtHeight)) {
1925
- throw new DeveloperError_default("options.skirtHeight is required.");
1926
- }
1927
- const cos = Math.cos;
1928
- const sin = Math.sin;
1929
- const sqrt = Math.sqrt;
1930
- const atan = Math.atan;
1931
- const exp = Math.exp;
1932
- const piOverTwo = Math_default.PI_OVER_TWO;
1933
- const toRadians = Math_default.toRadians;
1934
- const heightmap = options.heightmap;
1935
- const width = options.width;
1936
- const height = options.height;
1937
- const skirtHeight = options.skirtHeight;
1938
- const hasSkirts = skirtHeight > 0;
1939
- const isGeographic = options.isGeographic ?? true;
1940
- const ellipsoid = options.ellipsoid ?? Ellipsoid_default.default;
1941
- const oneOverGlobeSemimajorAxis = 1 / ellipsoid.maximumRadius;
1942
- const nativeRectangle = Rectangle_default.clone(options.nativeRectangle);
1943
- const rectangle = Rectangle_default.clone(options.rectangle);
1944
- let geographicWest;
1945
- let geographicSouth;
1946
- let geographicEast;
1947
- let geographicNorth;
1948
- if (!defined_default(rectangle)) {
1949
- if (isGeographic) {
1950
- geographicWest = toRadians(nativeRectangle.west);
1951
- geographicSouth = toRadians(nativeRectangle.south);
1952
- geographicEast = toRadians(nativeRectangle.east);
1953
- geographicNorth = toRadians(nativeRectangle.north);
1954
- } else {
1955
- geographicWest = nativeRectangle.west * oneOverGlobeSemimajorAxis;
1956
- geographicSouth = piOverTwo - 2 * atan(exp(-nativeRectangle.south * oneOverGlobeSemimajorAxis));
1957
- geographicEast = nativeRectangle.east * oneOverGlobeSemimajorAxis;
1958
- geographicNorth = piOverTwo - 2 * atan(exp(-nativeRectangle.north * oneOverGlobeSemimajorAxis));
1959
- }
1960
- } else {
1961
- geographicWest = rectangle.west;
1962
- geographicSouth = rectangle.south;
1963
- geographicEast = rectangle.east;
1964
- geographicNorth = rectangle.north;
1965
- }
1966
- let relativeToCenter = options.relativeToCenter;
1967
- const hasRelativeToCenter = defined_default(relativeToCenter);
1968
- relativeToCenter = hasRelativeToCenter ? relativeToCenter : Cartesian3_default.ZERO;
1969
- const includeWebMercatorT = options.includeWebMercatorT ?? false;
1970
- const exaggeration = options.exaggeration ?? 1;
1971
- const exaggerationRelativeHeight = options.exaggerationRelativeHeight ?? 0;
1972
- const hasExaggeration = exaggeration !== 1;
1973
- const includeGeodeticSurfaceNormals = hasExaggeration;
1974
- const structure = options.structure ?? HeightmapTessellator.DEFAULT_STRUCTURE;
1975
- const heightScale = structure.heightScale ?? HeightmapTessellator.DEFAULT_STRUCTURE.heightScale;
1976
- const heightOffset = structure.heightOffset ?? HeightmapTessellator.DEFAULT_STRUCTURE.heightOffset;
1977
- const elementsPerHeight = structure.elementsPerHeight ?? HeightmapTessellator.DEFAULT_STRUCTURE.elementsPerHeight;
1978
- const stride = structure.stride ?? HeightmapTessellator.DEFAULT_STRUCTURE.stride;
1979
- const elementMultiplier = structure.elementMultiplier ?? HeightmapTessellator.DEFAULT_STRUCTURE.elementMultiplier;
1980
- const isBigEndian = structure.isBigEndian ?? HeightmapTessellator.DEFAULT_STRUCTURE.isBigEndian;
1981
- let rectangleWidth = Rectangle_default.computeWidth(nativeRectangle);
1982
- let rectangleHeight = Rectangle_default.computeHeight(nativeRectangle);
1983
- const granularityX = rectangleWidth / (width - 1);
1984
- const granularityY = rectangleHeight / (height - 1);
1985
- if (!isGeographic) {
1986
- rectangleWidth *= oneOverGlobeSemimajorAxis;
1987
- rectangleHeight *= oneOverGlobeSemimajorAxis;
1988
- }
1989
- const radiiSquared = ellipsoid.radiiSquared;
1990
- const radiiSquaredX = radiiSquared.x;
1991
- const radiiSquaredY = radiiSquared.y;
1992
- const radiiSquaredZ = radiiSquared.z;
1993
- let minimumHeight = 65536;
1994
- let maximumHeight = -65536;
1995
- const fromENU = Transforms_default.eastNorthUpToFixedFrame(
1996
- relativeToCenter,
1997
- ellipsoid
1998
- );
1999
- const toENU = Matrix4_default.inverseTransformation(fromENU, matrix4Scratch);
2000
- let southMercatorY;
2001
- let oneOverMercatorHeight;
2002
- if (includeWebMercatorT) {
2003
- southMercatorY = WebMercatorProjection_default.geodeticLatitudeToMercatorAngle(geographicSouth);
2004
- oneOverMercatorHeight = 1 / (WebMercatorProjection_default.geodeticLatitudeToMercatorAngle(geographicNorth) - southMercatorY);
2005
- }
2006
- const minimum = minimumScratch;
2007
- minimum.x = Number.POSITIVE_INFINITY;
2008
- minimum.y = Number.POSITIVE_INFINITY;
2009
- minimum.z = Number.POSITIVE_INFINITY;
2010
- const maximum = maximumScratch;
2011
- maximum.x = Number.NEGATIVE_INFINITY;
2012
- maximum.y = Number.NEGATIVE_INFINITY;
2013
- maximum.z = Number.NEGATIVE_INFINITY;
2014
- let hMin = Number.POSITIVE_INFINITY;
2015
- const gridVertexCount = width * height;
2016
- const edgeVertexCount = skirtHeight > 0 ? width * 2 + height * 2 : 0;
2017
- const vertexCount = gridVertexCount + edgeVertexCount;
2018
- const positions = new Array(vertexCount);
2019
- const heights = new Array(vertexCount);
2020
- const uvs = new Array(vertexCount);
2021
- const webMercatorTs = includeWebMercatorT ? new Array(vertexCount) : [];
2022
- const geodeticSurfaceNormals = includeGeodeticSurfaceNormals ? new Array(vertexCount) : [];
2023
- let startRow = 0;
2024
- let endRow = height;
2025
- let startCol = 0;
2026
- let endCol = width;
2027
- if (hasSkirts) {
2028
- --startRow;
2029
- ++endRow;
2030
- --startCol;
2031
- ++endCol;
2032
- }
2033
- const skirtOffsetPercentage = 1e-5;
2034
- for (let rowIndex = startRow; rowIndex < endRow; ++rowIndex) {
2035
- let row = rowIndex;
2036
- if (row < 0) {
2037
- row = 0;
2038
- }
2039
- if (row >= height) {
2040
- row = height - 1;
2041
- }
2042
- let latitude = nativeRectangle.north - granularityY * row;
2043
- if (!isGeographic) {
2044
- latitude = piOverTwo - 2 * atan(exp(-latitude * oneOverGlobeSemimajorAxis));
2045
- } else {
2046
- latitude = toRadians(latitude);
2047
- }
2048
- let v = (latitude - geographicSouth) / (geographicNorth - geographicSouth);
2049
- v = Math_default.clamp(v, 0, 1);
2050
- const isNorthEdge = rowIndex === startRow;
2051
- const isSouthEdge = rowIndex === endRow - 1;
2052
- if (skirtHeight > 0) {
2053
- if (isNorthEdge) {
2054
- latitude += skirtOffsetPercentage * rectangleHeight;
2055
- } else if (isSouthEdge) {
2056
- latitude -= skirtOffsetPercentage * rectangleHeight;
2057
- }
2058
- }
2059
- const cosLatitude = cos(latitude);
2060
- const nZ = sin(latitude);
2061
- const kZ = radiiSquaredZ * nZ;
2062
- let webMercatorT;
2063
- if (includeWebMercatorT) {
2064
- webMercatorT = (WebMercatorProjection_default.geodeticLatitudeToMercatorAngle(latitude) - southMercatorY) * oneOverMercatorHeight;
2065
- }
2066
- for (let colIndex = startCol; colIndex < endCol; ++colIndex) {
2067
- let col = colIndex;
2068
- if (col < 0) {
2069
- col = 0;
2070
- }
2071
- if (col >= width) {
2072
- col = width - 1;
2073
- }
2074
- const terrainOffset = row * (width * stride) + col * stride;
2075
- let heightSample;
2076
- if (elementsPerHeight === 1) {
2077
- heightSample = heightmap[terrainOffset];
2078
- } else {
2079
- heightSample = 0;
2080
- let elementOffset;
2081
- if (isBigEndian) {
2082
- for (elementOffset = 0; elementOffset < elementsPerHeight; ++elementOffset) {
2083
- heightSample = heightSample * elementMultiplier + heightmap[terrainOffset + elementOffset];
2084
- }
2085
- } else {
2086
- for (elementOffset = elementsPerHeight - 1; elementOffset >= 0; --elementOffset) {
2087
- heightSample = heightSample * elementMultiplier + heightmap[terrainOffset + elementOffset];
2088
- }
2089
- }
2090
- }
2091
- heightSample = heightSample * heightScale + heightOffset;
2092
- maximumHeight = Math.max(maximumHeight, heightSample);
2093
- minimumHeight = Math.min(minimumHeight, heightSample);
2094
- let longitude = nativeRectangle.west + granularityX * col;
2095
- if (!isGeographic) {
2096
- longitude = longitude * oneOverGlobeSemimajorAxis;
2097
- } else {
2098
- longitude = toRadians(longitude);
2099
- }
2100
- let u = (longitude - geographicWest) / (geographicEast - geographicWest);
2101
- u = Math_default.clamp(u, 0, 1);
2102
- let index = row * width + col;
2103
- if (skirtHeight > 0) {
2104
- const isWestEdge = colIndex === startCol;
2105
- const isEastEdge = colIndex === endCol - 1;
2106
- const isEdge = isNorthEdge || isSouthEdge || isWestEdge || isEastEdge;
2107
- const isCorner = (isNorthEdge || isSouthEdge) && (isWestEdge || isEastEdge);
2108
- if (isCorner) {
2109
- continue;
2110
- } else if (isEdge) {
2111
- heightSample -= skirtHeight;
2112
- if (isWestEdge) {
2113
- index = gridVertexCount + (height - row - 1);
2114
- longitude -= skirtOffsetPercentage * rectangleWidth;
2115
- } else if (isSouthEdge) {
2116
- index = gridVertexCount + height + (width - col - 1);
2117
- } else if (isEastEdge) {
2118
- index = gridVertexCount + height + width + row;
2119
- longitude += skirtOffsetPercentage * rectangleWidth;
2120
- } else if (isNorthEdge) {
2121
- index = gridVertexCount + height + width + height + col;
2122
- }
2123
- }
2124
- }
2125
- const nX = cosLatitude * cos(longitude);
2126
- const nY = cosLatitude * sin(longitude);
2127
- const kX = radiiSquaredX * nX;
2128
- const kY = radiiSquaredY * nY;
2129
- const gamma = sqrt(kX * nX + kY * nY + kZ * nZ);
2130
- const oneOverGamma = 1 / gamma;
2131
- const rSurfaceX = kX * oneOverGamma;
2132
- const rSurfaceY = kY * oneOverGamma;
2133
- const rSurfaceZ = kZ * oneOverGamma;
2134
- const position = new Cartesian3_default();
2135
- position.x = rSurfaceX + nX * heightSample;
2136
- position.y = rSurfaceY + nY * heightSample;
2137
- position.z = rSurfaceZ + nZ * heightSample;
2138
- Matrix4_default.multiplyByPoint(toENU, position, cartesian3Scratch);
2139
- Cartesian3_default.minimumByComponent(cartesian3Scratch, minimum, minimum);
2140
- Cartesian3_default.maximumByComponent(cartesian3Scratch, maximum, maximum);
2141
- hMin = Math.min(hMin, heightSample);
2142
- positions[index] = position;
2143
- uvs[index] = new Cartesian2_default(u, v);
2144
- heights[index] = heightSample;
2145
- if (includeWebMercatorT) {
2146
- webMercatorTs[index] = webMercatorT;
2147
- }
2148
- if (includeGeodeticSurfaceNormals) {
2149
- geodeticSurfaceNormals[index] = ellipsoid.geodeticSurfaceNormal(position);
2150
- }
2151
- }
2152
- }
2153
- const boundingSphere3D = BoundingSphere_default.fromPoints(positions);
2154
- let orientedBoundingBox;
2155
- if (defined_default(rectangle)) {
2156
- orientedBoundingBox = OrientedBoundingBox_default.fromRectangle(
2157
- rectangle,
2158
- minimumHeight,
2159
- maximumHeight,
2160
- ellipsoid
2161
- );
2162
- }
2163
- let occludeePointInScaledSpace;
2164
- if (hasRelativeToCenter) {
2165
- const occluder = new EllipsoidalOccluder_default(ellipsoid);
2166
- occludeePointInScaledSpace = occluder.computeHorizonCullingPointPossiblyUnderEllipsoid(
2167
- relativeToCenter,
2168
- positions,
2169
- minimumHeight
2170
- );
2171
- }
2172
- const aaBox = new AxisAlignedBoundingBox_default(minimum, maximum, relativeToCenter);
2173
- const encoding = new TerrainEncoding_default(
2174
- relativeToCenter,
2175
- aaBox,
2176
- hMin,
2177
- maximumHeight,
2178
- fromENU,
2179
- false,
2180
- includeWebMercatorT,
2181
- includeGeodeticSurfaceNormals,
2182
- exaggeration,
2183
- exaggerationRelativeHeight
2184
- );
2185
- const vertices = new Float32Array(vertexCount * encoding.stride);
2186
- let bufferIndex = 0;
2187
- for (let j = 0; j < vertexCount; ++j) {
2188
- bufferIndex = encoding.encode(
2189
- vertices,
2190
- bufferIndex,
2191
- positions[j],
2192
- uvs[j],
2193
- heights[j],
2194
- void 0,
2195
- webMercatorTs[j],
2196
- geodeticSurfaceNormals[j]
2197
- );
2198
- }
2199
- return {
2200
- vertices,
2201
- maximumHeight,
2202
- minimumHeight,
2203
- encoding,
2204
- boundingSphere3D,
2205
- orientedBoundingBox,
2206
- occludeePointInScaledSpace
2207
- };
2208
- };
2209
- var HeightmapTessellator_default = HeightmapTessellator;
2210
-
2211
- // packages/engine/Source/Workers/createVerticesFromHeightmap.js
2212
- var import_lerc = __toESM(require_LercDecode(), 1);
2213
- function createVerticesFromHeightmap(parameters, transferableObjects) {
2214
- if (parameters.encoding === HeightmapEncoding_default.LERC) {
2215
- let result;
2216
- try {
2217
- result = import_lerc.default.decode(parameters.heightmap);
2218
- } catch (error) {
2219
- throw new RuntimeError_default(error);
2220
- }
2221
- const lercStatistics = result.statistics[0];
2222
- if (lercStatistics.minValue === Number.MAX_VALUE) {
2223
- throw new RuntimeError_default("Invalid tile data");
2224
- }
2225
- parameters.heightmap = result.pixels[0];
2226
- parameters.width = result.width;
2227
- parameters.height = result.height;
2228
- }
2229
- parameters.ellipsoid = Ellipsoid_default.clone(parameters.ellipsoid);
2230
- parameters.rectangle = Rectangle_default.clone(parameters.rectangle);
2231
- const statistics = HeightmapTessellator_default.computeVertices(parameters);
2232
- const vertices = statistics.vertices;
2233
- transferableObjects.push(vertices.buffer);
2234
- return {
2235
- vertices: vertices.buffer,
2236
- numberOfAttributes: statistics.encoding.stride,
2237
- minimumHeight: statistics.minimumHeight,
2238
- maximumHeight: statistics.maximumHeight,
2239
- gridWidth: parameters.width,
2240
- gridHeight: parameters.height,
2241
- boundingSphere3D: statistics.boundingSphere3D,
2242
- orientedBoundingBox: statistics.orientedBoundingBox,
2243
- occludeePointInScaledSpace: statistics.occludeePointInScaledSpace,
2244
- encoding: statistics.encoding,
2245
- westIndicesSouthToNorth: statistics.westIndicesSouthToNorth,
2246
- southIndicesEastToWest: statistics.southIndicesEastToWest,
2247
- eastIndicesNorthToSouth: statistics.eastIndicesNorthToSouth,
2248
- northIndicesWestToEast: statistics.northIndicesWestToEast
2249
- };
2250
- }
2251
- var createVerticesFromHeightmap_default = createTaskProcessorWorker_default(createVerticesFromHeightmap);
2252
- export {
2253
- createVerticesFromHeightmap_default as default
2254
- };