@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.
- package/dist/bundle.d.ts +2 -0
- package/dist/bundle.d.ts.map +1 -0
- package/dist/bundle.js +2 -2
- package/dist/dist.min.js +1175 -0
- package/dist/es5/bundle.js +6 -0
- package/dist/es5/bundle.js.map +1 -0
- package/dist/es5/index.js +87 -0
- package/dist/es5/index.js.map +1 -0
- package/dist/es5/lib/decode-quantized-mesh.js +250 -0
- package/dist/es5/lib/decode-quantized-mesh.js.map +1 -0
- package/dist/es5/lib/delatin/index.js +408 -0
- package/dist/es5/lib/delatin/index.js.map +1 -0
- package/dist/es5/lib/helpers/skirt.js +105 -0
- package/dist/es5/lib/helpers/skirt.js.map +1 -0
- package/dist/es5/lib/parse-quantized-mesh.js +95 -0
- package/dist/es5/lib/parse-quantized-mesh.js.map +1 -0
- package/dist/es5/lib/parse-terrain.js +152 -0
- package/dist/es5/lib/parse-terrain.js.map +1 -0
- package/dist/es5/lib/utils/version.js +9 -0
- package/dist/es5/lib/utils/version.js.map +1 -0
- package/dist/es5/quantized-mesh-loader.js +24 -0
- package/dist/es5/quantized-mesh-loader.js.map +1 -0
- package/dist/es5/terrain-loader.js +32 -0
- package/dist/es5/terrain-loader.js.map +1 -0
- package/dist/es5/workers/quantized-mesh-worker.js +6 -0
- package/dist/es5/workers/quantized-mesh-worker.js.map +1 -0
- package/dist/es5/workers/terrain-worker.js +6 -0
- package/dist/es5/workers/terrain-worker.js.map +1 -0
- package/dist/esm/bundle.js +4 -0
- package/dist/esm/bundle.js.map +1 -0
- package/dist/esm/index.js +32 -0
- package/dist/esm/index.js.map +1 -0
- package/{src → dist/esm}/lib/decode-quantized-mesh.js +76 -165
- package/dist/esm/lib/decode-quantized-mesh.js.map +1 -0
- package/dist/esm/lib/delatin/index.js +355 -0
- package/dist/esm/lib/delatin/index.js.map +1 -0
- package/dist/esm/lib/helpers/skirt.js +89 -0
- package/dist/esm/lib/helpers/skirt.js.map +1 -0
- package/dist/esm/lib/parse-quantized-mesh.js +85 -0
- package/dist/esm/lib/parse-quantized-mesh.js.map +1 -0
- package/{src → dist/esm}/lib/parse-terrain.js +101 -129
- package/dist/esm/lib/parse-terrain.js.map +1 -0
- package/dist/esm/lib/utils/version.js +2 -0
- package/dist/esm/lib/utils/version.js.map +1 -0
- package/dist/esm/quantized-mesh-loader.js +17 -0
- package/dist/esm/quantized-mesh-loader.js.map +1 -0
- package/dist/esm/terrain-loader.js +25 -0
- package/dist/esm/terrain-loader.js.map +1 -0
- package/dist/esm/workers/quantized-mesh-worker.js +4 -0
- package/dist/esm/workers/quantized-mesh-worker.js.map +1 -0
- package/dist/esm/workers/terrain-worker.js +4 -0
- package/dist/esm/workers/terrain-worker.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -14
- package/dist/lib/decode-quantized-mesh.d.ts +59 -0
- package/dist/lib/decode-quantized-mesh.d.ts.map +1 -0
- package/dist/lib/decode-quantized-mesh.js +200 -241
- package/dist/lib/delatin/index.d.ts +24 -0
- package/dist/lib/delatin/index.d.ts.map +1 -0
- package/dist/lib/delatin/index.js +397 -443
- package/dist/lib/helpers/skirt.d.ts +19 -0
- package/dist/lib/helpers/skirt.d.ts.map +1 -0
- package/dist/lib/helpers/skirt.js +119 -91
- package/dist/lib/parse-quantized-mesh.d.ts +7 -0
- package/dist/lib/parse-quantized-mesh.d.ts.map +1 -0
- package/dist/lib/parse-quantized-mesh.js +94 -93
- package/dist/lib/parse-terrain.d.ts +51 -0
- package/dist/lib/parse-terrain.d.ts.map +1 -0
- package/dist/lib/parse-terrain.js +146 -172
- package/dist/lib/utils/version.d.ts +2 -0
- package/dist/lib/utils/version.d.ts.map +1 -0
- package/dist/lib/utils/version.js +7 -2
- package/dist/quantized-mesh-loader.d.ts +12 -0
- package/dist/quantized-mesh-loader.d.ts.map +1 -0
- package/dist/quantized-mesh-loader.js +20 -16
- package/dist/quantized-mesh-worker.js +148 -119
- package/dist/terrain-loader.d.ts +12 -0
- package/dist/terrain-loader.d.ts.map +1 -0
- package/dist/terrain-loader.js +28 -24
- package/dist/terrain-worker.js +148 -119
- package/dist/workers/quantized-mesh-worker.d.ts +2 -0
- package/dist/workers/quantized-mesh-worker.d.ts.map +1 -0
- package/dist/workers/quantized-mesh-worker.js +5 -4
- package/dist/workers/terrain-worker.d.ts +2 -0
- package/dist/workers/terrain-worker.d.ts.map +1 -0
- package/dist/workers/terrain-worker.js +5 -4
- package/package.json +11 -10
- package/src/index.ts +29 -13
- package/src/lib/helpers/skirt.ts +7 -7
- package/src/lib/parse-quantized-mesh.ts +47 -43
- package/src/lib/parse-terrain.ts +84 -89
- package/src/quantized-mesh-loader.ts +9 -4
- package/src/terrain-loader.ts +14 -11
- package/dist/bundle.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/decode-quantized-mesh.js.map +0 -1
- package/dist/lib/delatin/index.js.map +0 -1
- package/dist/lib/helpers/skirt.js.map +0 -1
- package/dist/lib/parse-quantized-mesh.js.map +0 -1
- package/dist/lib/parse-terrain.js.map +0 -1
- package/dist/lib/utils/version.js.map +0 -1
- package/dist/quantized-mesh-loader.js.map +0 -1
- package/dist/terrain-loader.js.map +0 -1
- package/dist/workers/quantized-mesh-worker.js.map +0 -1
- package/dist/workers/terrain-worker.js.map +0 -1
- package/src/lib/helpers/skirt.js +0 -161
- package/src/lib/parse-quantized-mesh.js +0 -98
- package/src/workers/quantized-mesh-worker.js +0 -4
- package/src/workers/terrain-worker.js +0 -4
- /package/src/lib/delatin/{index.js → index.ts} +0 -0
- /package/src/lib/utils/{version.js → version.ts} +0 -0
package/dist/terrain-worker.js
CHANGED
|
@@ -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
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
|
73
|
+
const parentPort3 = getParentPort();
|
|
74
|
+
const { type, payload } = parentPort3 ? message : message.data;
|
|
57
75
|
onMessage(type, payload);
|
|
58
76
|
};
|
|
59
77
|
}
|
|
60
|
-
|
|
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
|
-
|
|
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
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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 (
|
|
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/
|
|
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 =
|
|
469
|
+
let index = 0;
|
|
438
470
|
while (index < edges.length) {
|
|
439
|
-
if (edges[index][0] === edges[index
|
|
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
|
|
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] =
|
|
483
|
-
newTriangles[triangle1Offset + 2] =
|
|
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] =
|
|
486
|
-
newTriangles[triangle1Offset + 5] =
|
|
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
|
|
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
|
|
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
|
|
555
|
-
|
|
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.
|
|
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
|
|
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
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
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.
|
|
1161
|
-
var VERSION =
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
1213
|
-
parse: async (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.
|
|
1245
|
+
// src/workers/terrain-worker.ts
|
|
1217
1246
|
createLoaderWorker(TerrainLoader2);
|
|
1218
1247
|
})();
|
|
@@ -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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"terrain-worker.d.ts","sourceRoot":"","sources":["../../src/workers/terrain-worker.ts"],"names":[],"mappings":""}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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.
|
|
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": "
|
|
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/
|
|
33
|
-
"build-worker": "esbuild src/workers/terrain-worker.
|
|
34
|
-
"build-worker2": "esbuild src/workers/quantized-mesh-worker.
|
|
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/
|
|
39
|
-
"@loaders.gl/
|
|
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": "
|
|
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
|
|
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 {
|
|
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:
|
|
17
|
+
parse: parseTerrain
|
|
15
18
|
};
|
|
16
19
|
|
|
17
|
-
export
|
|
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) =>
|
|
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;
|
package/src/lib/helpers/skirt.ts
CHANGED
|
@@ -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 =
|
|
73
|
+
let index = 0;
|
|
74
74
|
while (index < edges.length) {
|
|
75
|
-
if (edges[index][0] === edges[index
|
|
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
|
|
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] =
|
|
163
|
-
newTriangles[triangle1Offset + 2] =
|
|
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] =
|
|
167
|
-
newTriangles[triangle1Offset + 5] =
|
|
166
|
+
newTriangles[triangle1Offset + 4] = edge[0];
|
|
167
|
+
newTriangles[triangle1Offset + 5] = positionsLength / 3 + vertex1Offset;
|
|
168
168
|
}
|