@loaders.gl/terrain 4.0.0-alpha.1 → 4.0.0-alpha.11

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 (112) hide show
  1. package/dist/bundle.d.ts +2 -0
  2. package/dist/bundle.d.ts.map +1 -0
  3. package/dist/bundle.js +2 -2
  4. package/dist/dist.min.js +1175 -0
  5. package/dist/es5/bundle.js +6 -0
  6. package/dist/es5/bundle.js.map +1 -0
  7. package/dist/es5/index.js +87 -0
  8. package/dist/es5/index.js.map +1 -0
  9. package/dist/es5/lib/decode-quantized-mesh.js +250 -0
  10. package/dist/es5/lib/decode-quantized-mesh.js.map +1 -0
  11. package/dist/es5/lib/delatin/index.js +408 -0
  12. package/dist/es5/lib/delatin/index.js.map +1 -0
  13. package/dist/es5/lib/helpers/skirt.js +105 -0
  14. package/dist/es5/lib/helpers/skirt.js.map +1 -0
  15. package/dist/es5/lib/parse-quantized-mesh.js +95 -0
  16. package/dist/es5/lib/parse-quantized-mesh.js.map +1 -0
  17. package/dist/es5/lib/parse-terrain.js +152 -0
  18. package/dist/es5/lib/parse-terrain.js.map +1 -0
  19. package/dist/es5/lib/utils/version.js +9 -0
  20. package/dist/es5/lib/utils/version.js.map +1 -0
  21. package/dist/es5/quantized-mesh-loader.js +24 -0
  22. package/dist/es5/quantized-mesh-loader.js.map +1 -0
  23. package/dist/es5/terrain-loader.js +32 -0
  24. package/dist/es5/terrain-loader.js.map +1 -0
  25. package/dist/es5/workers/quantized-mesh-worker.js +6 -0
  26. package/dist/es5/workers/quantized-mesh-worker.js.map +1 -0
  27. package/dist/es5/workers/terrain-worker.js +6 -0
  28. package/dist/es5/workers/terrain-worker.js.map +1 -0
  29. package/dist/esm/bundle.js +4 -0
  30. package/dist/esm/bundle.js.map +1 -0
  31. package/dist/esm/index.js +32 -0
  32. package/dist/esm/index.js.map +1 -0
  33. package/{src → dist/esm}/lib/decode-quantized-mesh.js +76 -165
  34. package/dist/esm/lib/decode-quantized-mesh.js.map +1 -0
  35. package/dist/esm/lib/delatin/index.js +355 -0
  36. package/dist/esm/lib/delatin/index.js.map +1 -0
  37. package/dist/esm/lib/helpers/skirt.js +89 -0
  38. package/dist/esm/lib/helpers/skirt.js.map +1 -0
  39. package/dist/esm/lib/parse-quantized-mesh.js +85 -0
  40. package/dist/esm/lib/parse-quantized-mesh.js.map +1 -0
  41. package/{src → dist/esm}/lib/parse-terrain.js +101 -129
  42. package/dist/esm/lib/parse-terrain.js.map +1 -0
  43. package/dist/esm/lib/utils/version.js +2 -0
  44. package/dist/esm/lib/utils/version.js.map +1 -0
  45. package/dist/esm/quantized-mesh-loader.js +17 -0
  46. package/dist/esm/quantized-mesh-loader.js.map +1 -0
  47. package/dist/esm/terrain-loader.js +25 -0
  48. package/dist/esm/terrain-loader.js.map +1 -0
  49. package/dist/esm/workers/quantized-mesh-worker.js +4 -0
  50. package/dist/esm/workers/quantized-mesh-worker.js.map +1 -0
  51. package/dist/esm/workers/terrain-worker.js +4 -0
  52. package/dist/esm/workers/terrain-worker.js.map +1 -0
  53. package/dist/index.d.ts +35 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +31 -14
  56. package/dist/lib/decode-quantized-mesh.d.ts +59 -0
  57. package/dist/lib/decode-quantized-mesh.d.ts.map +1 -0
  58. package/dist/lib/decode-quantized-mesh.js +200 -241
  59. package/dist/lib/delatin/index.d.ts +24 -0
  60. package/dist/lib/delatin/index.d.ts.map +1 -0
  61. package/dist/lib/delatin/index.js +397 -443
  62. package/dist/lib/helpers/skirt.d.ts +19 -0
  63. package/dist/lib/helpers/skirt.d.ts.map +1 -0
  64. package/dist/lib/helpers/skirt.js +119 -91
  65. package/dist/lib/parse-quantized-mesh.d.ts +7 -0
  66. package/dist/lib/parse-quantized-mesh.d.ts.map +1 -0
  67. package/dist/lib/parse-quantized-mesh.js +94 -93
  68. package/dist/lib/parse-terrain.d.ts +51 -0
  69. package/dist/lib/parse-terrain.d.ts.map +1 -0
  70. package/dist/lib/parse-terrain.js +146 -172
  71. package/dist/lib/utils/version.d.ts +2 -0
  72. package/dist/lib/utils/version.d.ts.map +1 -0
  73. package/dist/lib/utils/version.js +7 -2
  74. package/dist/quantized-mesh-loader.d.ts +12 -0
  75. package/dist/quantized-mesh-loader.d.ts.map +1 -0
  76. package/dist/quantized-mesh-loader.js +20 -16
  77. package/dist/quantized-mesh-worker.js +148 -119
  78. package/dist/terrain-loader.d.ts +12 -0
  79. package/dist/terrain-loader.d.ts.map +1 -0
  80. package/dist/terrain-loader.js +28 -24
  81. package/dist/terrain-worker.js +148 -119
  82. package/dist/workers/quantized-mesh-worker.d.ts +2 -0
  83. package/dist/workers/quantized-mesh-worker.d.ts.map +1 -0
  84. package/dist/workers/quantized-mesh-worker.js +5 -4
  85. package/dist/workers/terrain-worker.d.ts +2 -0
  86. package/dist/workers/terrain-worker.d.ts.map +1 -0
  87. package/dist/workers/terrain-worker.js +5 -4
  88. package/package.json +11 -10
  89. package/src/index.ts +29 -13
  90. package/src/lib/helpers/skirt.ts +7 -7
  91. package/src/lib/parse-quantized-mesh.ts +47 -43
  92. package/src/lib/parse-terrain.ts +84 -89
  93. package/src/quantized-mesh-loader.ts +9 -4
  94. package/src/terrain-loader.ts +14 -11
  95. package/dist/bundle.js.map +0 -1
  96. package/dist/index.js.map +0 -1
  97. package/dist/lib/decode-quantized-mesh.js.map +0 -1
  98. package/dist/lib/delatin/index.js.map +0 -1
  99. package/dist/lib/helpers/skirt.js.map +0 -1
  100. package/dist/lib/parse-quantized-mesh.js.map +0 -1
  101. package/dist/lib/parse-terrain.js.map +0 -1
  102. package/dist/lib/utils/version.js.map +0 -1
  103. package/dist/quantized-mesh-loader.js.map +0 -1
  104. package/dist/terrain-loader.js.map +0 -1
  105. package/dist/workers/quantized-mesh-worker.js.map +0 -1
  106. package/dist/workers/terrain-worker.js.map +0 -1
  107. package/src/lib/helpers/skirt.js +0 -161
  108. package/src/lib/parse-quantized-mesh.js +0 -98
  109. package/src/workers/quantized-mesh-worker.js +0 -4
  110. package/src/workers/terrain-worker.js +0 -4
  111. /package/src/lib/delatin/{index.js → index.ts} +0 -0
  112. /package/src/lib/utils/{version.js → version.ts} +0 -0
@@ -35,16 +35,33 @@
35
35
  }
36
36
 
37
37
  // ../worker-utils/src/lib/worker-farm/worker-body.ts
38
+ function getParentPort() {
39
+ let parentPort;
40
+ try {
41
+ eval("globalThis.parentPort = require('worker_threads').parentPort");
42
+ parentPort = globalThis.parentPort;
43
+ } catch {
44
+ }
45
+ return parentPort;
46
+ }
38
47
  var onMessageWrapperMap = new Map();
39
48
  var WorkerBody = class {
49
+ static inWorkerThread() {
50
+ return typeof self !== "undefined" || Boolean(getParentPort());
51
+ }
40
52
  static set onmessage(onMessage) {
41
- self.onmessage = (message) => {
42
- if (!isKnownMessage(message)) {
43
- return;
44
- }
45
- const { type, payload } = message.data;
53
+ function handleMessage(message) {
54
+ const parentPort3 = getParentPort();
55
+ const { type, payload } = parentPort3 ? message : message.data;
46
56
  onMessage(type, payload);
47
- };
57
+ }
58
+ const parentPort2 = getParentPort();
59
+ if (parentPort2) {
60
+ parentPort2.on("message", handleMessage);
61
+ parentPort2.on("exit", () => console.debug("Node worker closing"));
62
+ } else {
63
+ globalThis.onmessage = handleMessage;
64
+ }
48
65
  }
49
66
  static addEventListener(onMessage) {
50
67
  let onMessageWrapper = onMessageWrapperMap.get(onMessage);
@@ -53,22 +70,36 @@
53
70
  if (!isKnownMessage(message)) {
54
71
  return;
55
72
  }
56
- const { type, payload } = message.data;
73
+ const parentPort3 = getParentPort();
74
+ const { type, payload } = parentPort3 ? message : message.data;
57
75
  onMessage(type, payload);
58
76
  };
59
77
  }
60
- self.addEventListener("message", onMessageWrapper);
78
+ const parentPort2 = getParentPort();
79
+ if (parentPort2) {
80
+ console.error("not implemented");
81
+ } else {
82
+ globalThis.addEventListener("message", onMessageWrapper);
83
+ }
61
84
  }
62
85
  static removeEventListener(onMessage) {
63
86
  const onMessageWrapper = onMessageWrapperMap.get(onMessage);
64
87
  onMessageWrapperMap.delete(onMessage);
65
- self.removeEventListener("message", onMessageWrapper);
88
+ const parentPort2 = getParentPort();
89
+ if (parentPort2) {
90
+ console.error("not implemented");
91
+ } else {
92
+ globalThis.removeEventListener("message", onMessageWrapper);
93
+ }
66
94
  }
67
95
  static postMessage(type, payload) {
68
- if (self) {
69
- const data = { source: "loaders.gl", type, payload };
70
- const transferList = getTransferList(payload);
71
- self.postMessage(data, transferList);
96
+ const data = { source: "loaders.gl", type, payload };
97
+ const transferList = getTransferList(payload);
98
+ const parentPort2 = getParentPort();
99
+ if (parentPort2) {
100
+ parentPort2.postMessage(data, transferList);
101
+ } else {
102
+ globalThis.postMessage(data, transferList);
72
103
  }
73
104
  }
74
105
  };
@@ -80,19 +111,20 @@
80
111
  // ../loader-utils/src/lib/worker-loader-utils/create-loader-worker.ts
81
112
  var requestId = 0;
82
113
  function createLoaderWorker(loader) {
83
- if (typeof self === "undefined") {
114
+ if (!WorkerBody.inWorkerThread()) {
84
115
  return;
85
116
  }
86
117
  WorkerBody.onmessage = async (type, payload) => {
87
118
  switch (type) {
88
119
  case "process":
89
120
  try {
90
- const { input, options = {} } = payload;
121
+ const { input, options = {}, context = {} } = payload;
91
122
  const result = await parseData({
92
123
  loader,
93
124
  arrayBuffer: input,
94
125
  options,
95
126
  context: {
127
+ ...context,
96
128
  parse: parseOnMainThread
97
129
  }
98
130
  });
@@ -168,7 +200,7 @@
168
200
  return result;
169
201
  }
170
202
 
171
- // ../schema/src/category/mesh/mesh-utils.ts
203
+ // ../schema/src/lib/mesh/mesh-utils.ts
172
204
  function getMeshBoundingBox(attributes) {
173
205
  let minX = Infinity;
174
206
  let minY = Infinity;
@@ -434,12 +466,12 @@
434
466
  }
435
467
  edges.sort((a, b) => Math.min(...a) - Math.min(...b) || Math.max(...a) - Math.max(...b));
436
468
  const outsideEdges = [];
437
- let index = 1;
469
+ let index = 0;
438
470
  while (index < edges.length) {
439
- if (edges[index][0] === edges[index - 1][1] && edges[index][1] === edges[index - 1][0]) {
471
+ if (edges[index][0] === edges[index + 1]?.[1] && edges[index][1] === edges[index + 1]?.[0]) {
440
472
  index += 2;
441
473
  } else {
442
- outsideEdges.push(edges[index - 1]);
474
+ outsideEdges.push(edges[index]);
443
475
  index++;
444
476
  }
445
477
  }
@@ -479,42 +511,15 @@
479
511
  newTexcoord0.set(attributes.TEXCOORD_0.value.subarray(edge[1] * 2, edge[1] * 2 + 2), vertex2Offset * 2);
480
512
  const triangle1Offset = edgeIndex * 2 * 3;
481
513
  newTriangles[triangle1Offset] = edge[0];
482
- newTriangles[triangle1Offset + 1] = edge[1];
483
- newTriangles[triangle1Offset + 2] = positionsLength / 3 + vertex2Offset;
514
+ newTriangles[triangle1Offset + 1] = positionsLength / 3 + vertex2Offset;
515
+ newTriangles[triangle1Offset + 2] = edge[1];
484
516
  newTriangles[triangle1Offset + 3] = positionsLength / 3 + vertex2Offset;
485
- newTriangles[triangle1Offset + 4] = positionsLength / 3 + vertex1Offset;
486
- newTriangles[triangle1Offset + 5] = edge[0];
517
+ newTriangles[triangle1Offset + 4] = edge[0];
518
+ newTriangles[triangle1Offset + 5] = positionsLength / 3 + vertex1Offset;
487
519
  }
488
520
 
489
521
  // src/lib/parse-quantized-mesh.ts
490
- function getMeshAttributes(vertexData, header, bounds) {
491
- const { minHeight, maxHeight } = header;
492
- const [minX, minY, maxX, maxY] = bounds || [0, 0, 1, 1];
493
- const xScale = maxX - minX;
494
- const yScale = maxY - minY;
495
- const zScale = maxHeight - minHeight;
496
- const nCoords = vertexData.length / 3;
497
- const positions = new Float32Array(nCoords * 3);
498
- const texCoords = new Float32Array(nCoords * 2);
499
- for (let i = 0; i < nCoords; i++) {
500
- const x = vertexData[i] / 32767;
501
- const y = vertexData[i + nCoords] / 32767;
502
- const z = vertexData[i + nCoords * 2] / 32767;
503
- positions[3 * i + 0] = x * xScale + minX;
504
- positions[3 * i + 1] = y * yScale + minY;
505
- positions[3 * i + 2] = z * zScale + minHeight;
506
- texCoords[2 * i + 0] = x;
507
- texCoords[2 * i + 1] = y;
508
- }
509
- return {
510
- POSITION: { value: positions, size: 3 },
511
- TEXCOORD_0: { value: texCoords, size: 2 }
512
- };
513
- }
514
- function getTileMesh(arrayBuffer, options) {
515
- if (!arrayBuffer) {
516
- return null;
517
- }
522
+ function parseQuantizedMesh(arrayBuffer, options = {}) {
518
523
  const { bounds } = options;
519
524
  const {
520
525
  header,
@@ -528,7 +533,7 @@
528
533
  let triangleIndices = originalTriangleIndices;
529
534
  let attributes = getMeshAttributes(vertexData, header, bounds);
530
535
  const boundingBox = getMeshBoundingBox(attributes);
531
- if (options.skirtHeight) {
536
+ if (options?.skirtHeight) {
532
537
  const { attributes: newAttributes, triangles: newTriangles } = addSkirt(attributes, triangleIndices, options.skirtHeight, {
533
538
  westIndices,
534
539
  northIndices,
@@ -546,13 +551,36 @@
546
551
  vertexCount: triangleIndices.length,
547
552
  boundingBox
548
553
  },
554
+ schema: void 0,
555
+ topology: "triangle-list",
549
556
  mode: 4,
550
557
  indices: { value: triangleIndices, size: 1 },
551
558
  attributes
552
559
  };
553
560
  }
554
- function loadQuantizedMesh(arrayBuffer, options) {
555
- return getTileMesh(arrayBuffer, options["quantized-mesh"]);
561
+ function getMeshAttributes(vertexData, header, bounds) {
562
+ const { minHeight, maxHeight } = header;
563
+ const [minX, minY, maxX, maxY] = bounds || [0, 0, 1, 1];
564
+ const xScale = maxX - minX;
565
+ const yScale = maxY - minY;
566
+ const zScale = maxHeight - minHeight;
567
+ const nCoords = vertexData.length / 3;
568
+ const positions = new Float32Array(nCoords * 3);
569
+ const texCoords = new Float32Array(nCoords * 2);
570
+ for (let i = 0; i < nCoords; i++) {
571
+ const x = vertexData[i] / 32767;
572
+ const y = vertexData[i + nCoords] / 32767;
573
+ const z = vertexData[i + nCoords * 2] / 32767;
574
+ positions[3 * i + 0] = x * xScale + minX;
575
+ positions[3 * i + 1] = y * yScale + minY;
576
+ positions[3 * i + 2] = z * zScale + minHeight;
577
+ texCoords[2 * i + 0] = x;
578
+ texCoords[2 * i + 1] = y;
579
+ }
580
+ return {
581
+ POSITION: { value: positions, size: 3 },
582
+ TEXCOORD_0: { value: texCoords, size: 2 }
583
+ };
556
584
  }
557
585
 
558
586
  // ../../node_modules/@mapbox/martini/index.js
@@ -688,7 +716,7 @@
688
716
  }
689
717
  };
690
718
 
691
- // src/lib/delatin/index.js
719
+ // src/lib/delatin/index.ts
692
720
  var Delatin = class {
693
721
  constructor(data, width, height = width) {
694
722
  this.data = data;
@@ -1042,55 +1070,7 @@
1042
1070
  }
1043
1071
 
1044
1072
  // src/lib/parse-terrain.ts
1045
- function getTerrain(imageData, width, height, elevationDecoder, tesselator) {
1046
- const { rScaler, bScaler, gScaler, offset } = elevationDecoder;
1047
- const terrain = new Float32Array((width + 1) * (height + 1));
1048
- for (let i = 0, y = 0; y < height; y++) {
1049
- for (let x = 0; x < width; x++, i++) {
1050
- const k = i * 4;
1051
- const r = imageData[k + 0];
1052
- const g = imageData[k + 1];
1053
- const b = imageData[k + 2];
1054
- terrain[i + y] = r * rScaler + g * gScaler + b * bScaler + offset;
1055
- }
1056
- }
1057
- if (tesselator === "martini") {
1058
- for (let i = (width + 1) * width, x = 0; x < width; x++, i++) {
1059
- terrain[i] = terrain[i - width - 1];
1060
- }
1061
- for (let i = height, y = 0; y < height + 1; y++, i += height + 1) {
1062
- terrain[i] = terrain[i - 1];
1063
- }
1064
- }
1065
- return terrain;
1066
- }
1067
- function getMeshAttributes2(vertices, terrain, width, height, bounds) {
1068
- const gridSize = width + 1;
1069
- const numOfVerticies = vertices.length / 2;
1070
- const positions = new Float32Array(numOfVerticies * 3);
1071
- const texCoords = new Float32Array(numOfVerticies * 2);
1072
- const [minX, minY, maxX, maxY] = bounds || [0, 0, width, height];
1073
- const xScale = (maxX - minX) / width;
1074
- const yScale = (maxY - minY) / height;
1075
- for (let i = 0; i < numOfVerticies; i++) {
1076
- const x = vertices[i * 2];
1077
- const y = vertices[i * 2 + 1];
1078
- const pixelIdx = y * gridSize + x;
1079
- positions[3 * i + 0] = x * xScale + minX;
1080
- positions[3 * i + 1] = -y * yScale + maxY;
1081
- positions[3 * i + 2] = terrain[pixelIdx];
1082
- texCoords[2 * i + 0] = x / width;
1083
- texCoords[2 * i + 1] = y / height;
1084
- }
1085
- return {
1086
- POSITION: { value: positions, size: 3 },
1087
- TEXCOORD_0: { value: texCoords, size: 2 }
1088
- };
1089
- }
1090
- function getMesh(terrainImage, terrainOptions) {
1091
- if (terrainImage === null) {
1092
- return null;
1093
- }
1073
+ function makeTerrainMeshFromImage(terrainImage, terrainOptions) {
1094
1074
  const { meshMaxError, bounds, elevationDecoder } = terrainOptions;
1095
1075
  const { data, width, height } = terrainImage;
1096
1076
  let terrain;
@@ -1150,15 +1130,54 @@
1150
1130
  const vertices = coords;
1151
1131
  return { vertices, triangles };
1152
1132
  }
1153
- async function loadTerrain(arrayBuffer, options, context) {
1154
- options.image = options.image || {};
1155
- options.image.type = "data";
1156
- const image = await context.parse(arrayBuffer, options, options.baseUri);
1157
- return getMesh(image, options.terrain);
1133
+ function getTerrain(imageData, width, height, elevationDecoder, tesselator) {
1134
+ const { rScaler, bScaler, gScaler, offset } = elevationDecoder;
1135
+ const terrain = new Float32Array((width + 1) * (height + 1));
1136
+ for (let i = 0, y = 0; y < height; y++) {
1137
+ for (let x = 0; x < width; x++, i++) {
1138
+ const k = i * 4;
1139
+ const r = imageData[k + 0];
1140
+ const g = imageData[k + 1];
1141
+ const b = imageData[k + 2];
1142
+ terrain[i + y] = r * rScaler + g * gScaler + b * bScaler + offset;
1143
+ }
1144
+ }
1145
+ if (tesselator === "martini") {
1146
+ for (let i = (width + 1) * width, x = 0; x < width; x++, i++) {
1147
+ terrain[i] = terrain[i - width - 1];
1148
+ }
1149
+ for (let i = height, y = 0; y < height + 1; y++, i += height + 1) {
1150
+ terrain[i] = terrain[i - 1];
1151
+ }
1152
+ }
1153
+ return terrain;
1154
+ }
1155
+ function getMeshAttributes2(vertices, terrain, width, height, bounds) {
1156
+ const gridSize = width + 1;
1157
+ const numOfVerticies = vertices.length / 2;
1158
+ const positions = new Float32Array(numOfVerticies * 3);
1159
+ const texCoords = new Float32Array(numOfVerticies * 2);
1160
+ const [minX, minY, maxX, maxY] = bounds || [0, 0, width, height];
1161
+ const xScale = (maxX - minX) / width;
1162
+ const yScale = (maxY - minY) / height;
1163
+ for (let i = 0; i < numOfVerticies; i++) {
1164
+ const x = vertices[i * 2];
1165
+ const y = vertices[i * 2 + 1];
1166
+ const pixelIdx = y * gridSize + x;
1167
+ positions[3 * i + 0] = x * xScale + minX;
1168
+ positions[3 * i + 1] = -y * yScale + maxY;
1169
+ positions[3 * i + 2] = terrain[pixelIdx];
1170
+ texCoords[2 * i + 0] = x / width;
1171
+ texCoords[2 * i + 1] = y / height;
1172
+ }
1173
+ return {
1174
+ POSITION: { value: positions, size: 3 },
1175
+ TEXCOORD_0: { value: texCoords, size: 2 }
1176
+ };
1158
1177
  }
1159
1178
 
1160
- // src/lib/utils/version.js
1161
- var VERSION = typeof __VERSION__ !== "undefined" ? __VERSION__ : "latest";
1179
+ // src/lib/utils/version.ts
1180
+ var VERSION = true ? "4.0.0-alpha.11" : "latest";
1162
1181
 
1163
1182
  // src/terrain-loader.ts
1164
1183
  var TerrainLoader = {
@@ -1167,12 +1186,12 @@
1167
1186
  module: "terrain",
1168
1187
  version: VERSION,
1169
1188
  worker: true,
1170
- extensions: ["png", "pngraw"],
1171
- mimeTypes: ["image/png"],
1189
+ extensions: ["png", "pngraw", "jpg", "jpeg", "gif", "webp", "bmp"],
1190
+ mimeTypes: ["image/png", "image/jpeg", "image/gif", "image/webp", "image/bmp"],
1172
1191
  options: {
1173
1192
  terrain: {
1174
1193
  tesselator: "auto",
1175
- bounds: null,
1194
+ bounds: void 0,
1176
1195
  meshMaxError: 10,
1177
1196
  elevationDecoder: {
1178
1197
  rScaler: 1,
@@ -1180,7 +1199,7 @@
1180
1199
  bScaler: 0,
1181
1200
  offset: 0
1182
1201
  },
1183
- skirtHeight: null
1202
+ skirtHeight: void 0
1184
1203
  }
1185
1204
  }
1186
1205
  };
@@ -1205,14 +1224,24 @@
1205
1224
  // src/index.ts
1206
1225
  var TerrainLoader2 = {
1207
1226
  ...TerrainLoader,
1208
- parse: loadTerrain
1227
+ parse: parseTerrain
1209
1228
  };
1229
+ async function parseTerrain(arrayBuffer, options, context) {
1230
+ const loadImageOptions = {
1231
+ ...options,
1232
+ mimeType: "application/x.image",
1233
+ image: { ...options?.image, type: "data" }
1234
+ };
1235
+ const image = await context?.parse(arrayBuffer, loadImageOptions);
1236
+ const terrainOptions = { ...TerrainLoader2.options.terrain, ...options?.terrain };
1237
+ return makeTerrainMeshFromImage(image, terrainOptions);
1238
+ }
1210
1239
  var QuantizedMeshLoader2 = {
1211
1240
  ...QuantizedMeshLoader,
1212
- parseSync: loadQuantizedMesh,
1213
- parse: async (arrayBuffer, options) => loadQuantizedMesh(arrayBuffer, options)
1241
+ parseSync: (arrayBuffer, options) => parseQuantizedMesh(arrayBuffer, options?.["quantized-mesh"]),
1242
+ parse: async (arrayBuffer, options) => parseQuantizedMesh(arrayBuffer, options?.["quantized-mesh"])
1214
1243
  };
1215
1244
 
1216
- // src/workers/terrain-worker.js
1245
+ // src/workers/terrain-worker.ts
1217
1246
  createLoaderWorker(TerrainLoader2);
1218
1247
  })();
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=quantized-mesh-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quantized-mesh-worker.d.ts","sourceRoot":"","sources":["../../src/workers/quantized-mesh-worker.ts"],"names":[],"mappings":""}
@@ -1,4 +1,5 @@
1
- import { createLoaderWorker } from '@loaders.gl/loader-utils';
2
- import { QuantizedMeshLoader } from '../index';
3
- createLoaderWorker(QuantizedMeshLoader);
4
- //# sourceMappingURL=quantized-mesh-worker.js.map
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const loader_utils_1 = require("@loaders.gl/loader-utils");
4
+ const index_1 = require("../index");
5
+ (0, loader_utils_1.createLoaderWorker)(index_1.QuantizedMeshLoader);
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=terrain-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terrain-worker.d.ts","sourceRoot":"","sources":["../../src/workers/terrain-worker.ts"],"names":[],"mappings":""}
@@ -1,4 +1,5 @@
1
- import { createLoaderWorker } from '@loaders.gl/loader-utils';
2
- import { TerrainLoader } from '../index';
3
- createLoaderWorker(TerrainLoader);
4
- //# sourceMappingURL=terrain-worker.js.map
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const loader_utils_1 = require("@loaders.gl/loader-utils");
4
+ const index_1 = require("../index");
5
+ (0, loader_utils_1.createLoaderWorker)(index_1.TerrainLoader);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loaders.gl/terrain",
3
- "version": "4.0.0-alpha.1",
3
+ "version": "4.0.0-alpha.11",
4
4
  "description": "Framework-independent loader for terrain raster formats",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -18,9 +18,9 @@
18
18
  "point cloud",
19
19
  "OBJ"
20
20
  ],
21
- "types": "src/index.ts",
22
- "main": "dist/index.js",
23
- "module": "dist/index.js",
21
+ "types": "dist/index.d.ts",
22
+ "main": "dist/es5/index.js",
23
+ "module": "dist/esm/index.js",
24
24
  "sideEffects": false,
25
25
  "files": [
26
26
  "src",
@@ -29,15 +29,16 @@
29
29
  ],
30
30
  "scripts": {
31
31
  "pre-build": "npm run build-worker && npm run build-worker2 && npm run build-bundle",
32
- "build-bundle": "esbuild src/bundle.ts --bundle --outfile=dist/bundle.js",
33
- "build-worker": "esbuild src/workers/terrain-worker.js --bundle --outfile=dist/terrain-worker.js",
34
- "build-worker2": "esbuild src/workers/quantized-mesh-worker.js --bundle --outfile=dist/quantized-mesh-worker.js"
32
+ "build-bundle": "esbuild src/bundle.ts --bundle --outfile=dist/dist.min.js",
33
+ "build-worker": "esbuild src/workers/terrain-worker.ts --bundle --outfile=dist/terrain-worker.js --define:__VERSION__=\\\"$npm_package_version\\\"",
34
+ "build-worker2": "esbuild src/workers/quantized-mesh-worker.ts --bundle --outfile=dist/quantized-mesh-worker.js --define:__VERSION__=\\\"$npm_package_version\\\""
35
35
  },
36
36
  "dependencies": {
37
37
  "@babel/runtime": "^7.3.1",
38
- "@loaders.gl/loader-utils": "4.0.0-alpha.1",
39
- "@loaders.gl/schema": "4.0.0-alpha.1",
38
+ "@loaders.gl/images": "4.0.0-alpha.11",
39
+ "@loaders.gl/loader-utils": "4.0.0-alpha.11",
40
+ "@loaders.gl/schema": "4.0.0-alpha.11",
40
41
  "@mapbox/martini": "^0.2.0"
41
42
  },
42
- "gitHead": "e48f5534fe7188c810f23f965a440c144b3cf6d0"
43
+ "gitHead": "bc680098cfea790c67b7fb95bab96e8d9288d34f"
43
44
  }
package/src/index.ts CHANGED
@@ -1,20 +1,37 @@
1
- import type {LoaderWithParser} from '@loaders.gl/loader-utils';
2
- import parseQuantizedMesh from './lib/parse-quantized-mesh';
3
- import loadTerrain from './lib/parse-terrain';
1
+ import type {LoaderContext, LoaderWithParser} from '@loaders.gl/loader-utils';
2
+ import {parseQuantizedMesh} from './lib/parse-quantized-mesh';
3
+ import {TerrainOptions, makeTerrainMeshFromImage} from './lib/parse-terrain';
4
4
 
5
- import {TerrainLoader as TerrainWorkerLoader} from './terrain-loader';
6
- import {QuantizedMeshLoader as QuantizedMeshWorkerLoader} from './quantized-mesh-loader';
5
+ import {TerrainLoader as TerrainWorkerLoader, TerrainLoaderOptions} from './terrain-loader';
6
+ import {
7
+ QuantizedMeshLoader as QuantizedMeshWorkerLoader,
8
+ QuantizedMeshLoaderOptions
9
+ } from './quantized-mesh-loader';
7
10
 
8
11
  // TerrainLoader
9
12
 
10
13
  export {TerrainWorkerLoader};
11
14
 
12
- export const TerrainLoader = {
15
+ export const TerrainLoader: LoaderWithParser<any, never, TerrainLoaderOptions> = {
13
16
  ...TerrainWorkerLoader,
14
- parse: loadTerrain
17
+ parse: parseTerrain
15
18
  };
16
19
 
17
- export const _typecheckTerrainLoader: LoaderWithParser = TerrainLoader; // eslint-disable-line
20
+ export async function parseTerrain(
21
+ arrayBuffer: ArrayBuffer,
22
+ options?: TerrainLoaderOptions,
23
+ context?: LoaderContext
24
+ ) {
25
+ const loadImageOptions = {
26
+ ...options,
27
+ mimeType: 'application/x.image',
28
+ image: {...options?.image, type: 'data'}
29
+ };
30
+ const image = await context?.parse(arrayBuffer, loadImageOptions);
31
+ // Extend function to support additional mesh generation options (square grid or delatin)
32
+ const terrainOptions = {...TerrainLoader.options.terrain, ...options?.terrain} as TerrainOptions;
33
+ return makeTerrainMeshFromImage(image, terrainOptions);
34
+ }
18
35
 
19
36
  // QuantizedMeshLoader
20
37
 
@@ -23,10 +40,9 @@ export {QuantizedMeshWorkerLoader};
23
40
  /**
24
41
  * Loader for quantized meshes
25
42
  */
26
- export const QuantizedMeshLoader = {
43
+ export const QuantizedMeshLoader: LoaderWithParser<any, never, QuantizedMeshLoaderOptions> = {
27
44
  ...QuantizedMeshWorkerLoader,
28
- parseSync: parseQuantizedMesh,
29
- parse: async (arrayBuffer, options) => parseQuantizedMesh(arrayBuffer, options)
45
+ parseSync: (arrayBuffer, options) => parseQuantizedMesh(arrayBuffer, options?.['quantized-mesh']),
46
+ parse: async (arrayBuffer, options) =>
47
+ parseQuantizedMesh(arrayBuffer, options?.['quantized-mesh'])
30
48
  };
31
-
32
- export const _typecheckQuantizedMeshLoader: LoaderWithParser = QuantizedMeshLoader;
@@ -70,12 +70,12 @@ function getOutsideEdgesFromTriangles(triangles) {
70
70
  edges.sort((a, b) => Math.min(...a) - Math.min(...b) || Math.max(...a) - Math.max(...b));
71
71
 
72
72
  const outsideEdges: number[][] = [];
73
- let index = 1;
73
+ let index = 0;
74
74
  while (index < edges.length) {
75
- if (edges[index][0] === edges[index - 1][1] && edges[index][1] === edges[index - 1][0]) {
75
+ if (edges[index][0] === edges[index + 1]?.[1] && edges[index][1] === edges[index + 1]?.[0]) {
76
76
  index += 2;
77
77
  } else {
78
- outsideEdges.push(edges[index - 1]);
78
+ outsideEdges.push(edges[index]);
79
79
  index++;
80
80
  }
81
81
  }
@@ -159,10 +159,10 @@ function updateAttributesForNewEdge({
159
159
  // Define new triangles
160
160
  const triangle1Offset = edgeIndex * 2 * 3;
161
161
  newTriangles[triangle1Offset] = edge[0];
162
- newTriangles[triangle1Offset + 1] = edge[1];
163
- newTriangles[triangle1Offset + 2] = positionsLength / 3 + vertex2Offset;
162
+ newTriangles[triangle1Offset + 1] = positionsLength / 3 + vertex2Offset;
163
+ newTriangles[triangle1Offset + 2] = edge[1];
164
164
 
165
165
  newTriangles[triangle1Offset + 3] = positionsLength / 3 + vertex2Offset;
166
- newTriangles[triangle1Offset + 4] = positionsLength / 3 + vertex1Offset;
167
- newTriangles[triangle1Offset + 5] = edge[0];
166
+ newTriangles[triangle1Offset + 4] = edge[0];
167
+ newTriangles[triangle1Offset + 5] = positionsLength / 3 + vertex1Offset;
168
168
  }