@loaders.gl/terrain 3.2.12 → 3.3.0-alpha.10
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/es5/bundle.js +0 -1
- package/dist/es5/bundle.js.map +1 -1
- package/dist/es5/index.js +10 -24
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/lib/decode-quantized-mesh.js +18 -65
- package/dist/es5/lib/decode-quantized-mesh.js.map +1 -1
- package/dist/es5/lib/delatin/index.js +46 -104
- package/dist/es5/lib/delatin/index.js.map +1 -1
- package/dist/es5/lib/helpers/skirt.js +12 -20
- package/dist/es5/lib/helpers/skirt.js.map +1 -1
- package/dist/es5/lib/parse-quantized-mesh.js +22 -39
- package/dist/es5/lib/parse-quantized-mesh.js.map +1 -1
- package/dist/es5/lib/parse-terrain.js +23 -57
- package/dist/es5/lib/parse-terrain.js.map +1 -1
- package/dist/es5/lib/utils/version.js +1 -1
- package/dist/es5/lib/utils/version.js.map +1 -1
- package/dist/es5/quantized-mesh-loader.js +0 -2
- package/dist/es5/quantized-mesh-loader.js.map +1 -1
- package/dist/es5/terrain-loader.js +1 -2
- package/dist/es5/terrain-loader.js.map +1 -1
- package/dist/es5/workers/quantized-mesh-worker.js +0 -2
- package/dist/es5/workers/quantized-mesh-worker.js.map +1 -1
- package/dist/es5/workers/terrain-worker.js +0 -2
- package/dist/es5/workers/terrain-worker.js.map +1 -1
- package/dist/esm/bundle.js +1 -1
- package/dist/esm/bundle.js.map +1 -1
- package/dist/esm/index.js +7 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/decode-quantized-mesh.js +6 -40
- package/dist/esm/lib/decode-quantized-mesh.js.map +1 -1
- package/dist/esm/lib/delatin/index.js +18 -98
- package/dist/esm/lib/delatin/index.js.map +1 -1
- package/dist/esm/lib/helpers/skirt.js +16 -19
- package/dist/esm/lib/helpers/skirt.js.map +1 -1
- package/dist/esm/lib/parse-quantized-mesh.js +2 -6
- package/dist/esm/lib/parse-quantized-mesh.js.map +1 -1
- package/dist/esm/lib/parse-terrain.js +6 -19
- package/dist/esm/lib/parse-terrain.js.map +1 -1
- package/dist/esm/lib/utils/version.js +2 -1
- package/dist/esm/lib/utils/version.js.map +1 -1
- package/dist/esm/quantized-mesh-loader.js +1 -0
- package/dist/esm/quantized-mesh-loader.js.map +1 -1
- package/dist/esm/terrain-loader.js +2 -0
- package/dist/esm/terrain-loader.js.map +1 -1
- package/dist/esm/workers/quantized-mesh-worker.js.map +1 -1
- package/dist/esm/workers/terrain-worker.js.map +1 -1
- package/dist/lib/decode-quantized-mesh.d.ts +1 -1
- package/dist/lib/decode-quantized-mesh.d.ts.map +1 -1
- package/dist/lib/helpers/skirt.d.ts +1 -1
- package/dist/lib/helpers/skirt.d.ts.map +1 -1
- package/dist/lib/parse-quantized-mesh.js +5 -1
- package/dist/quantized-mesh-worker.js +1 -1
- package/dist/terrain-worker.js +1 -1
- package/package.json +4 -4
|
@@ -1,10 +1,14 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
1
3
|
export default class Delatin {
|
|
2
|
-
constructor(data, width
|
|
4
|
+
constructor(data, width) {
|
|
5
|
+
let height = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : width;
|
|
3
6
|
this.data = data;
|
|
4
7
|
this.width = width;
|
|
5
8
|
this.height = height;
|
|
6
9
|
this.coords = [];
|
|
7
10
|
this.triangles = [];
|
|
11
|
+
|
|
8
12
|
this._halfedges = [];
|
|
9
13
|
this._candidates = [];
|
|
10
14
|
this._queueIndices = [];
|
|
@@ -16,23 +20,18 @@ export default class Delatin {
|
|
|
16
20
|
this._rmsSum = 0;
|
|
17
21
|
const x1 = width - 1;
|
|
18
22
|
const y1 = height - 1;
|
|
19
|
-
|
|
20
23
|
const p0 = this._addPoint(0, 0);
|
|
21
|
-
|
|
22
24
|
const p1 = this._addPoint(x1, 0);
|
|
23
|
-
|
|
24
25
|
const p2 = this._addPoint(0, y1);
|
|
25
|
-
|
|
26
26
|
const p3 = this._addPoint(x1, y1);
|
|
27
27
|
|
|
28
28
|
const t0 = this._addTriangle(p3, p0, p2, -1, -1, -1);
|
|
29
|
-
|
|
30
29
|
this._addTriangle(p0, p3, p1, t0, -1, -1);
|
|
31
|
-
|
|
32
30
|
this._flush();
|
|
33
31
|
}
|
|
34
32
|
|
|
35
|
-
run(
|
|
33
|
+
run() {
|
|
34
|
+
let maxError = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
|
|
36
35
|
while (this.getMaxError() > maxError) {
|
|
37
36
|
this.refine();
|
|
38
37
|
}
|
|
@@ -40,7 +39,6 @@ export default class Delatin {
|
|
|
40
39
|
|
|
41
40
|
refine() {
|
|
42
41
|
this._step();
|
|
43
|
-
|
|
44
42
|
this._flush();
|
|
45
43
|
}
|
|
46
44
|
|
|
@@ -58,16 +56,13 @@ export default class Delatin {
|
|
|
58
56
|
|
|
59
57
|
_flush() {
|
|
60
58
|
const coords = this.coords;
|
|
61
|
-
|
|
62
59
|
for (let i = 0; i < this._pendingLen; i++) {
|
|
63
60
|
const t = this._pending[i];
|
|
64
61
|
const a = 2 * this.triangles[t * 3 + 0];
|
|
65
62
|
const b = 2 * this.triangles[t * 3 + 1];
|
|
66
63
|
const c = 2 * this.triangles[t * 3 + 2];
|
|
67
|
-
|
|
68
64
|
this._findCandidate(coords[a], coords[a + 1], coords[b], coords[b + 1], coords[c], coords[c + 1], t);
|
|
69
65
|
}
|
|
70
|
-
|
|
71
66
|
this._pendingLen = 0;
|
|
72
67
|
}
|
|
73
68
|
|
|
@@ -76,6 +71,7 @@ export default class Delatin {
|
|
|
76
71
|
const minY = Math.min(p0y, p1y, p2y);
|
|
77
72
|
const maxX = Math.max(p0x, p1x, p2x);
|
|
78
73
|
const maxY = Math.max(p0y, p1y, p2y);
|
|
74
|
+
|
|
79
75
|
let w00 = orient(p1x, p1y, p2x, p2y, minX, minY);
|
|
80
76
|
let w01 = orient(p2x, p2y, p0x, p0y, minX, minY);
|
|
81
77
|
let w02 = orient(p0x, p0y, p1x, p1y, minX, minY);
|
|
@@ -85,42 +81,38 @@ export default class Delatin {
|
|
|
85
81
|
const b12 = p1x - p2x;
|
|
86
82
|
const a20 = p0y - p2y;
|
|
87
83
|
const b20 = p2x - p0x;
|
|
84
|
+
|
|
88
85
|
const a = orient(p0x, p0y, p1x, p1y, p2x, p2y);
|
|
89
86
|
const z0 = this.heightAt(p0x, p0y) / a;
|
|
90
87
|
const z1 = this.heightAt(p1x, p1y) / a;
|
|
91
88
|
const z2 = this.heightAt(p2x, p2y) / a;
|
|
89
|
+
|
|
92
90
|
let maxError = 0;
|
|
93
91
|
let mx = 0;
|
|
94
92
|
let my = 0;
|
|
95
93
|
let rms = 0;
|
|
96
|
-
|
|
97
94
|
for (let y = minY; y <= maxY; y++) {
|
|
98
95
|
let dx = 0;
|
|
99
|
-
|
|
100
96
|
if (w00 < 0 && a12 !== 0) {
|
|
101
97
|
dx = Math.max(dx, Math.floor(-w00 / a12));
|
|
102
98
|
}
|
|
103
|
-
|
|
104
99
|
if (w01 < 0 && a20 !== 0) {
|
|
105
100
|
dx = Math.max(dx, Math.floor(-w01 / a20));
|
|
106
101
|
}
|
|
107
|
-
|
|
108
102
|
if (w02 < 0 && a01 !== 0) {
|
|
109
103
|
dx = Math.max(dx, Math.floor(-w02 / a01));
|
|
110
104
|
}
|
|
111
|
-
|
|
112
105
|
let w0 = w00 + a12 * dx;
|
|
113
106
|
let w1 = w01 + a20 * dx;
|
|
114
107
|
let w2 = w02 + a01 * dx;
|
|
115
108
|
let wasInside = false;
|
|
116
|
-
|
|
117
109
|
for (let x = minX + dx; x <= maxX; x++) {
|
|
118
110
|
if (w0 >= 0 && w1 >= 0 && w2 >= 0) {
|
|
119
111
|
wasInside = true;
|
|
112
|
+
|
|
120
113
|
const z = z0 * w0 + z1 * w1 + z2 * w2;
|
|
121
114
|
const dz = Math.abs(z - this.heightAt(x, y));
|
|
122
115
|
rms += dz * dz;
|
|
123
|
-
|
|
124
116
|
if (dz > maxError) {
|
|
125
117
|
maxError = dz;
|
|
126
118
|
mx = x;
|
|
@@ -129,17 +121,14 @@ export default class Delatin {
|
|
|
129
121
|
} else if (wasInside) {
|
|
130
122
|
break;
|
|
131
123
|
}
|
|
132
|
-
|
|
133
124
|
w0 += a12;
|
|
134
125
|
w1 += a20;
|
|
135
126
|
w2 += a01;
|
|
136
127
|
}
|
|
137
|
-
|
|
138
128
|
w00 += b12;
|
|
139
129
|
w01 += b20;
|
|
140
130
|
w02 += b01;
|
|
141
131
|
}
|
|
142
|
-
|
|
143
132
|
if (mx === p0x && my === p0y || mx === p1x && my === p1y || mx === p2x && my === p2y) {
|
|
144
133
|
maxError = 0;
|
|
145
134
|
}
|
|
@@ -153,7 +142,6 @@ export default class Delatin {
|
|
|
153
142
|
|
|
154
143
|
_step() {
|
|
155
144
|
const t = this._queuePop();
|
|
156
|
-
|
|
157
145
|
const e0 = t * 3 + 0;
|
|
158
146
|
const e1 = t * 3 + 1;
|
|
159
147
|
const e2 = t * 3 + 2;
|
|
@@ -168,9 +156,7 @@ export default class Delatin {
|
|
|
168
156
|
const cy = this.coords[2 * p2 + 1];
|
|
169
157
|
const px = this._candidates[2 * t];
|
|
170
158
|
const py = this._candidates[2 * t + 1];
|
|
171
|
-
|
|
172
159
|
const pn = this._addPoint(px, py);
|
|
173
|
-
|
|
174
160
|
if (orient(ax, ay, bx, by, px, py) === 0) {
|
|
175
161
|
this._handleCollinear(pn, e0);
|
|
176
162
|
} else if (orient(bx, by, cx, cy, px, py) === 0) {
|
|
@@ -181,17 +167,11 @@ export default class Delatin {
|
|
|
181
167
|
const h0 = this._halfedges[e0];
|
|
182
168
|
const h1 = this._halfedges[e1];
|
|
183
169
|
const h2 = this._halfedges[e2];
|
|
184
|
-
|
|
185
170
|
const t0 = this._addTriangle(p0, p1, pn, h0, -1, -1, e0);
|
|
186
|
-
|
|
187
171
|
const t1 = this._addTriangle(p1, p2, pn, h1, -1, t0 + 1);
|
|
188
|
-
|
|
189
172
|
const t2 = this._addTriangle(p2, p0, pn, h2, t0 + 2, t1 + 1);
|
|
190
|
-
|
|
191
173
|
this._legalize(t0);
|
|
192
|
-
|
|
193
174
|
this._legalize(t1);
|
|
194
|
-
|
|
195
175
|
this._legalize(t2);
|
|
196
176
|
}
|
|
197
177
|
}
|
|
@@ -202,11 +182,14 @@ export default class Delatin {
|
|
|
202
182
|
return i;
|
|
203
183
|
}
|
|
204
184
|
|
|
205
|
-
_addTriangle(a, b, c, ab, bc, ca
|
|
185
|
+
_addTriangle(a, b, c, ab, bc, ca) {
|
|
186
|
+
let e = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : this.triangles.length;
|
|
206
187
|
const t = e / 3;
|
|
188
|
+
|
|
207
189
|
this.triangles[e + 0] = a;
|
|
208
190
|
this.triangles[e + 1] = b;
|
|
209
191
|
this.triangles[e + 2] = c;
|
|
192
|
+
|
|
210
193
|
this._halfedges[e + 0] = ab;
|
|
211
194
|
this._halfedges[e + 1] = bc;
|
|
212
195
|
this._halfedges[e + 2] = ca;
|
|
@@ -214,11 +197,9 @@ export default class Delatin {
|
|
|
214
197
|
if (ab >= 0) {
|
|
215
198
|
this._halfedges[ab] = e + 0;
|
|
216
199
|
}
|
|
217
|
-
|
|
218
200
|
if (bc >= 0) {
|
|
219
201
|
this._halfedges[bc] = e + 1;
|
|
220
202
|
}
|
|
221
|
-
|
|
222
203
|
if (ca >= 0) {
|
|
223
204
|
this._halfedges[ca] = e + 2;
|
|
224
205
|
}
|
|
@@ -227,17 +208,17 @@ export default class Delatin {
|
|
|
227
208
|
this._candidates[2 * t + 1] = 0;
|
|
228
209
|
this._queueIndices[t] = -1;
|
|
229
210
|
this._rms[t] = 0;
|
|
211
|
+
|
|
230
212
|
this._pending[this._pendingLen++] = t;
|
|
213
|
+
|
|
231
214
|
return e;
|
|
232
215
|
}
|
|
233
|
-
|
|
234
216
|
_legalize(a) {
|
|
235
|
-
const b = this._halfedges[a];
|
|
236
217
|
|
|
218
|
+
const b = this._halfedges[a];
|
|
237
219
|
if (b < 0) {
|
|
238
220
|
return;
|
|
239
221
|
}
|
|
240
|
-
|
|
241
222
|
const a0 = a - a % 3;
|
|
242
223
|
const b0 = b - b % 3;
|
|
243
224
|
const al = a0 + (a + 1) % 3;
|
|
@@ -249,26 +230,18 @@ export default class Delatin {
|
|
|
249
230
|
const pl = this.triangles[al];
|
|
250
231
|
const p1 = this.triangles[bl];
|
|
251
232
|
const coords = this.coords;
|
|
252
|
-
|
|
253
233
|
if (!inCircle(coords[2 * p0], coords[2 * p0 + 1], coords[2 * pr], coords[2 * pr + 1], coords[2 * pl], coords[2 * pl + 1], coords[2 * p1], coords[2 * p1 + 1])) {
|
|
254
234
|
return;
|
|
255
235
|
}
|
|
256
|
-
|
|
257
236
|
const hal = this._halfedges[al];
|
|
258
237
|
const har = this._halfedges[ar];
|
|
259
238
|
const hbl = this._halfedges[bl];
|
|
260
239
|
const hbr = this._halfedges[br];
|
|
261
|
-
|
|
262
240
|
this._queueRemove(a0 / 3);
|
|
263
|
-
|
|
264
241
|
this._queueRemove(b0 / 3);
|
|
265
|
-
|
|
266
242
|
const t0 = this._addTriangle(p0, p1, pl, -1, hbl, hal, a0);
|
|
267
|
-
|
|
268
243
|
const t1 = this._addTriangle(p1, p0, pr, t0, har, hbr, b0);
|
|
269
|
-
|
|
270
244
|
this._legalize(t0 + 1);
|
|
271
|
-
|
|
272
245
|
this._legalize(t1 + 2);
|
|
273
246
|
}
|
|
274
247
|
|
|
@@ -282,110 +255,74 @@ export default class Delatin {
|
|
|
282
255
|
const hal = this._halfedges[al];
|
|
283
256
|
const har = this._halfedges[ar];
|
|
284
257
|
const b = this._halfedges[a];
|
|
285
|
-
|
|
286
258
|
if (b < 0) {
|
|
287
259
|
const t0 = this._addTriangle(pn, p0, pr, -1, har, -1, a0);
|
|
288
|
-
|
|
289
260
|
const t1 = this._addTriangle(p0, pn, pl, t0, -1, hal);
|
|
290
|
-
|
|
291
261
|
this._legalize(t0 + 1);
|
|
292
|
-
|
|
293
262
|
this._legalize(t1 + 2);
|
|
294
|
-
|
|
295
263
|
return;
|
|
296
264
|
}
|
|
297
|
-
|
|
298
265
|
const b0 = b - b % 3;
|
|
299
266
|
const bl = b0 + (b + 2) % 3;
|
|
300
267
|
const br = b0 + (b + 1) % 3;
|
|
301
268
|
const p1 = this.triangles[bl];
|
|
302
269
|
const hbl = this._halfedges[bl];
|
|
303
270
|
const hbr = this._halfedges[br];
|
|
304
|
-
|
|
305
271
|
this._queueRemove(b0 / 3);
|
|
306
|
-
|
|
307
272
|
const t0 = this._addTriangle(p0, pr, pn, har, -1, -1, a0);
|
|
308
|
-
|
|
309
273
|
const t1 = this._addTriangle(pr, p1, pn, hbr, -1, t0 + 1, b0);
|
|
310
|
-
|
|
311
274
|
const t2 = this._addTriangle(p1, pl, pn, hbl, -1, t1 + 1);
|
|
312
|
-
|
|
313
275
|
const t3 = this._addTriangle(pl, p0, pn, hal, t0 + 2, t2 + 1);
|
|
314
|
-
|
|
315
276
|
this._legalize(t0);
|
|
316
|
-
|
|
317
277
|
this._legalize(t1);
|
|
318
|
-
|
|
319
278
|
this._legalize(t2);
|
|
320
|
-
|
|
321
279
|
this._legalize(t3);
|
|
322
280
|
}
|
|
323
281
|
|
|
324
282
|
_queuePush(t, error, rms) {
|
|
325
283
|
const i = this._queue.length;
|
|
326
284
|
this._queueIndices[t] = i;
|
|
327
|
-
|
|
328
285
|
this._queue.push(t);
|
|
329
|
-
|
|
330
286
|
this._errors.push(error);
|
|
331
|
-
|
|
332
287
|
this._rmsSum += rms;
|
|
333
|
-
|
|
334
288
|
this._queueUp(i);
|
|
335
289
|
}
|
|
336
|
-
|
|
337
290
|
_queuePop() {
|
|
338
291
|
const n = this._queue.length - 1;
|
|
339
|
-
|
|
340
292
|
this._queueSwap(0, n);
|
|
341
|
-
|
|
342
293
|
this._queueDown(0, n);
|
|
343
|
-
|
|
344
294
|
return this._queuePopBack();
|
|
345
295
|
}
|
|
346
|
-
|
|
347
296
|
_queuePopBack() {
|
|
348
297
|
const t = this._queue.pop();
|
|
349
|
-
|
|
350
298
|
this._errors.pop();
|
|
351
|
-
|
|
352
299
|
this._rmsSum -= this._rms[t];
|
|
353
300
|
this._queueIndices[t] = -1;
|
|
354
301
|
return t;
|
|
355
302
|
}
|
|
356
|
-
|
|
357
303
|
_queueRemove(t) {
|
|
358
304
|
const i = this._queueIndices[t];
|
|
359
|
-
|
|
360
305
|
if (i < 0) {
|
|
361
306
|
const it = this._pending.indexOf(t);
|
|
362
|
-
|
|
363
307
|
if (it !== -1) {
|
|
364
308
|
this._pending[it] = this._pending[--this._pendingLen];
|
|
365
309
|
} else {
|
|
366
310
|
throw new Error('Broken triangulation (something went wrong).');
|
|
367
311
|
}
|
|
368
|
-
|
|
369
312
|
return;
|
|
370
313
|
}
|
|
371
|
-
|
|
372
314
|
const n = this._queue.length - 1;
|
|
373
|
-
|
|
374
315
|
if (n !== i) {
|
|
375
316
|
this._queueSwap(i, n);
|
|
376
|
-
|
|
377
317
|
if (!this._queueDown(i, n)) {
|
|
378
318
|
this._queueUp(i);
|
|
379
319
|
}
|
|
380
320
|
}
|
|
381
|
-
|
|
382
321
|
this._queuePopBack();
|
|
383
322
|
}
|
|
384
|
-
|
|
385
323
|
_queueLess(i, j) {
|
|
386
324
|
return this._errors[i] > this._errors[j];
|
|
387
325
|
}
|
|
388
|
-
|
|
389
326
|
_queueSwap(i, j) {
|
|
390
327
|
const pi = this._queue[i];
|
|
391
328
|
const pj = this._queue[j];
|
|
@@ -397,58 +334,41 @@ export default class Delatin {
|
|
|
397
334
|
this._errors[i] = this._errors[j];
|
|
398
335
|
this._errors[j] = e;
|
|
399
336
|
}
|
|
400
|
-
|
|
401
337
|
_queueUp(j0) {
|
|
402
338
|
let j = j0;
|
|
403
|
-
|
|
404
339
|
while (true) {
|
|
405
340
|
const i = j - 1 >> 1;
|
|
406
|
-
|
|
407
341
|
if (i === j || !this._queueLess(j, i)) {
|
|
408
342
|
break;
|
|
409
343
|
}
|
|
410
|
-
|
|
411
344
|
this._queueSwap(i, j);
|
|
412
|
-
|
|
413
345
|
j = i;
|
|
414
346
|
}
|
|
415
347
|
}
|
|
416
|
-
|
|
417
348
|
_queueDown(i0, n) {
|
|
418
349
|
let i = i0;
|
|
419
|
-
|
|
420
350
|
while (true) {
|
|
421
351
|
const j1 = 2 * i + 1;
|
|
422
|
-
|
|
423
352
|
if (j1 >= n || j1 < 0) {
|
|
424
353
|
break;
|
|
425
354
|
}
|
|
426
|
-
|
|
427
355
|
const j2 = j1 + 1;
|
|
428
356
|
let j = j1;
|
|
429
|
-
|
|
430
357
|
if (j2 < n && this._queueLess(j2, j1)) {
|
|
431
358
|
j = j2;
|
|
432
359
|
}
|
|
433
|
-
|
|
434
360
|
if (!this._queueLess(j, i)) {
|
|
435
361
|
break;
|
|
436
362
|
}
|
|
437
|
-
|
|
438
363
|
this._queueSwap(i, j);
|
|
439
|
-
|
|
440
364
|
i = j;
|
|
441
365
|
}
|
|
442
|
-
|
|
443
366
|
return i > i0;
|
|
444
367
|
}
|
|
445
|
-
|
|
446
368
|
}
|
|
447
|
-
|
|
448
369
|
function orient(ax, ay, bx, by, cx, cy) {
|
|
449
370
|
return (bx - cx) * (ay - cy) - (by - cy) * (ax - cx);
|
|
450
371
|
}
|
|
451
|
-
|
|
452
372
|
function inCircle(ax, ay, bx, by, cx, cy, px, py) {
|
|
453
373
|
const dx = ax - px;
|
|
454
374
|
const dy = ay - py;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/delatin/index.ts"],"names":["Delatin","constructor","data","width","height","coords","triangles","_halfedges","_candidates","_queueIndices","_queue","_errors","_rms","_pending","_pendingLen","_rmsSum","x1","y1","p0","_addPoint","p1","p2","p3","t0","_addTriangle","_flush","run","maxError","getMaxError","refine","_step","getRMSD","Math","sqrt","heightAt","x","y","i","t","a","b","c","_findCandidate","p0x","p0y","p1x","p1y","p2x","p2y","minX","min","minY","maxX","max","maxY","w00","orient","w01","w02","a01","b01","a12","b12","a20","b20","z0","z1","z2","mx","my","rms","dx","floor","w0","w1","w2","wasInside","z","dz","abs","_queuePush","_queuePop","e0","e1","e2","ax","ay","bx","by","cx","cy","px","py","pn","_handleCollinear","h0","h1","h2","t1","t2","_legalize","length","push","ab","bc","ca","e","a0","b0","al","ar","bl","br","pr","pl","inCircle","hal","har","hbl","hbr","_queueRemove","t3","error","_queueUp","n","_queueSwap","_queueDown","_queuePopBack","pop","it","indexOf","Error","_queueLess","j","pi","pj","j0","i0","j1","j2","dy","ex","ey","fx","fy","ap","bp","cp"],"mappings":"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","sourcesContent":["// ISC License\n\n// Copyright(c) 2019, Michael Fogleman, Vladimir Agafonkin\n\n// Permission to use, copy, modify, and / or distribute this software for any purpose\n// with or without fee is hereby granted, provided that the above copyright notice\n// and this permission notice appear in all copies.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\n// FITNESS.IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS\n// OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER\n// TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF\n// THIS SOFTWARE.\n\n// @ts-nocheck\n\n/* eslint-disable complexity, max-params, max-statements, max-depth, no-constant-condition */\nexport default class Delatin {\n constructor(data, width, height = width) {\n this.data = data; // height data\n this.width = width;\n this.height = height;\n\n this.coords = []; // vertex coordinates (x, y)\n this.triangles = []; // mesh triangle indices\n\n // additional triangle data\n this._halfedges = [];\n this._candidates = [];\n this._queueIndices = [];\n\n this._queue = []; // queue of added triangles\n this._errors = [];\n this._rms = [];\n this._pending = []; // triangles pending addition to queue\n this._pendingLen = 0;\n\n this._rmsSum = 0;\n\n const x1 = width - 1;\n const y1 = height - 1;\n const p0 = this._addPoint(0, 0);\n const p1 = this._addPoint(x1, 0);\n const p2 = this._addPoint(0, y1);\n const p3 = this._addPoint(x1, y1);\n\n // add initial two triangles\n const t0 = this._addTriangle(p3, p0, p2, -1, -1, -1);\n this._addTriangle(p0, p3, p1, t0, -1, -1);\n this._flush();\n }\n\n // refine the mesh until its maximum error gets below the given one\n run(maxError = 1) {\n while (this.getMaxError() > maxError) {\n this.refine();\n }\n }\n\n // refine the mesh with a single point\n refine() {\n this._step();\n this._flush();\n }\n\n // max error of the current mesh\n getMaxError() {\n return this._errors[0];\n }\n\n // root-mean-square deviation of the current mesh\n getRMSD() {\n return this._rmsSum > 0 ? Math.sqrt(this._rmsSum / (this.width * this.height)) : 0;\n }\n\n // height value at a given position\n heightAt(x, y) {\n return this.data[this.width * y + x];\n }\n\n // rasterize and queue all triangles that got added or updated in _step\n _flush() {\n const coords = this.coords;\n for (let i = 0; i < this._pendingLen; i++) {\n const t = this._pending[i];\n // rasterize triangle to find maximum pixel error\n const a = 2 * this.triangles[t * 3 + 0];\n const b = 2 * this.triangles[t * 3 + 1];\n const c = 2 * this.triangles[t * 3 + 2];\n this._findCandidate(\n coords[a],\n coords[a + 1],\n coords[b],\n coords[b + 1],\n coords[c],\n coords[c + 1],\n t\n );\n }\n this._pendingLen = 0;\n }\n\n // rasterize a triangle, find its max error, and queue it for processing\n _findCandidate(p0x, p0y, p1x, p1y, p2x, p2y, t) {\n // triangle bounding box\n const minX = Math.min(p0x, p1x, p2x);\n const minY = Math.min(p0y, p1y, p2y);\n const maxX = Math.max(p0x, p1x, p2x);\n const maxY = Math.max(p0y, p1y, p2y);\n\n // forward differencing variables\n let w00 = orient(p1x, p1y, p2x, p2y, minX, minY);\n let w01 = orient(p2x, p2y, p0x, p0y, minX, minY);\n let w02 = orient(p0x, p0y, p1x, p1y, minX, minY);\n const a01 = p1y - p0y;\n const b01 = p0x - p1x;\n const a12 = p2y - p1y;\n const b12 = p1x - p2x;\n const a20 = p0y - p2y;\n const b20 = p2x - p0x;\n\n // pre-multiplied z values at vertices\n const a = orient(p0x, p0y, p1x, p1y, p2x, p2y);\n const z0 = this.heightAt(p0x, p0y) / a;\n const z1 = this.heightAt(p1x, p1y) / a;\n const z2 = this.heightAt(p2x, p2y) / a;\n\n // iterate over pixels in bounding box\n let maxError = 0;\n let mx = 0;\n let my = 0;\n let rms = 0;\n for (let y = minY; y <= maxY; y++) {\n // compute starting offset\n let dx = 0;\n if (w00 < 0 && a12 !== 0) {\n dx = Math.max(dx, Math.floor(-w00 / a12));\n }\n if (w01 < 0 && a20 !== 0) {\n dx = Math.max(dx, Math.floor(-w01 / a20));\n }\n if (w02 < 0 && a01 !== 0) {\n dx = Math.max(dx, Math.floor(-w02 / a01));\n }\n\n let w0 = w00 + a12 * dx;\n let w1 = w01 + a20 * dx;\n let w2 = w02 + a01 * dx;\n\n let wasInside = false;\n\n for (let x = minX + dx; x <= maxX; x++) {\n // check if inside triangle\n if (w0 >= 0 && w1 >= 0 && w2 >= 0) {\n wasInside = true;\n\n // compute z using barycentric coordinates\n const z = z0 * w0 + z1 * w1 + z2 * w2;\n const dz = Math.abs(z - this.heightAt(x, y));\n rms += dz * dz;\n if (dz > maxError) {\n maxError = dz;\n mx = x;\n my = y;\n }\n } else if (wasInside) {\n break;\n }\n\n w0 += a12;\n w1 += a20;\n w2 += a01;\n }\n\n w00 += b12;\n w01 += b20;\n w02 += b01;\n }\n\n if ((mx === p0x && my === p0y) || (mx === p1x && my === p1y) || (mx === p2x && my === p2y)) {\n maxError = 0;\n }\n\n // update triangle metadata\n this._candidates[2 * t] = mx;\n this._candidates[2 * t + 1] = my;\n this._rms[t] = rms;\n\n // add triangle to priority queue\n this._queuePush(t, maxError, rms);\n }\n\n // process the next triangle in the queue, splitting it with a new point\n _step() {\n // pop triangle with highest error from priority queue\n const t = this._queuePop();\n\n const e0 = t * 3 + 0;\n const e1 = t * 3 + 1;\n const e2 = t * 3 + 2;\n\n const p0 = this.triangles[e0];\n const p1 = this.triangles[e1];\n const p2 = this.triangles[e2];\n\n const ax = this.coords[2 * p0];\n const ay = this.coords[2 * p0 + 1];\n const bx = this.coords[2 * p1];\n const by = this.coords[2 * p1 + 1];\n const cx = this.coords[2 * p2];\n const cy = this.coords[2 * p2 + 1];\n const px = this._candidates[2 * t];\n const py = this._candidates[2 * t + 1];\n\n const pn = this._addPoint(px, py);\n\n if (orient(ax, ay, bx, by, px, py) === 0) {\n this._handleCollinear(pn, e0);\n } else if (orient(bx, by, cx, cy, px, py) === 0) {\n this._handleCollinear(pn, e1);\n } else if (orient(cx, cy, ax, ay, px, py) === 0) {\n this._handleCollinear(pn, e2);\n } else {\n const h0 = this._halfedges[e0];\n const h1 = this._halfedges[e1];\n const h2 = this._halfedges[e2];\n\n const t0 = this._addTriangle(p0, p1, pn, h0, -1, -1, e0);\n const t1 = this._addTriangle(p1, p2, pn, h1, -1, t0 + 1);\n const t2 = this._addTriangle(p2, p0, pn, h2, t0 + 2, t1 + 1);\n\n this._legalize(t0);\n this._legalize(t1);\n this._legalize(t2);\n }\n }\n\n // add coordinates for a new vertex\n _addPoint(x, y) {\n const i = this.coords.length >> 1;\n this.coords.push(x, y);\n return i;\n }\n\n // add or update a triangle in the mesh\n _addTriangle(a, b, c, ab, bc, ca, e = this.triangles.length) {\n const t = e / 3; // new triangle index\n\n // add triangle vertices\n this.triangles[e + 0] = a;\n this.triangles[e + 1] = b;\n this.triangles[e + 2] = c;\n\n // add triangle halfedges\n this._halfedges[e + 0] = ab;\n this._halfedges[e + 1] = bc;\n this._halfedges[e + 2] = ca;\n\n // link neighboring halfedges\n if (ab >= 0) {\n this._halfedges[ab] = e + 0;\n }\n if (bc >= 0) {\n this._halfedges[bc] = e + 1;\n }\n if (ca >= 0) {\n this._halfedges[ca] = e + 2;\n }\n\n // init triangle metadata\n this._candidates[2 * t + 0] = 0;\n this._candidates[2 * t + 1] = 0;\n this._queueIndices[t] = -1;\n this._rms[t] = 0;\n\n // add triangle to pending queue for later rasterization\n this._pending[this._pendingLen++] = t;\n\n // return first halfedge index\n return e;\n }\n\n _legalize(a) {\n // if the pair of triangles doesn't satisfy the Delaunay condition\n // (p1 is inside the circumcircle of [p0, pl, pr]), flip them,\n // then do the same check/flip recursively for the new pair of triangles\n //\n // pl pl\n // /||\\ / \\\n // al/ || \\bl al/ \\a\n // / || \\ / \\\n // / a||b \\ flip /___ar___\\\n // p0\\ || /p1 => p0\\---bl---/p1\n // \\ || / \\ /\n // ar\\ || /br b\\ /br\n // \\||/ \\ /\n // pr pr\n\n const b = this._halfedges[a];\n\n if (b < 0) {\n return;\n }\n\n const a0 = a - (a % 3);\n const b0 = b - (b % 3);\n const al = a0 + ((a + 1) % 3);\n const ar = a0 + ((a + 2) % 3);\n const bl = b0 + ((b + 2) % 3);\n const br = b0 + ((b + 1) % 3);\n const p0 = this.triangles[ar];\n const pr = this.triangles[a];\n const pl = this.triangles[al];\n const p1 = this.triangles[bl];\n const coords = this.coords;\n\n if (\n !inCircle(\n coords[2 * p0],\n coords[2 * p0 + 1],\n coords[2 * pr],\n coords[2 * pr + 1],\n coords[2 * pl],\n coords[2 * pl + 1],\n coords[2 * p1],\n coords[2 * p1 + 1]\n )\n ) {\n return;\n }\n\n const hal = this._halfedges[al];\n const har = this._halfedges[ar];\n const hbl = this._halfedges[bl];\n const hbr = this._halfedges[br];\n\n this._queueRemove(a0 / 3);\n this._queueRemove(b0 / 3);\n\n const t0 = this._addTriangle(p0, p1, pl, -1, hbl, hal, a0);\n const t1 = this._addTriangle(p1, p0, pr, t0, har, hbr, b0);\n\n this._legalize(t0 + 1);\n this._legalize(t1 + 2);\n }\n\n // handle a case where new vertex is on the edge of a triangle\n _handleCollinear(pn, a) {\n const a0 = a - (a % 3);\n const al = a0 + ((a + 1) % 3);\n const ar = a0 + ((a + 2) % 3);\n const p0 = this.triangles[ar];\n const pr = this.triangles[a];\n const pl = this.triangles[al];\n const hal = this._halfedges[al];\n const har = this._halfedges[ar];\n\n const b = this._halfedges[a];\n\n if (b < 0) {\n const t0 = this._addTriangle(pn, p0, pr, -1, har, -1, a0);\n const t1 = this._addTriangle(p0, pn, pl, t0, -1, hal);\n this._legalize(t0 + 1);\n this._legalize(t1 + 2);\n return;\n }\n\n const b0 = b - (b % 3);\n const bl = b0 + ((b + 2) % 3);\n const br = b0 + ((b + 1) % 3);\n const p1 = this.triangles[bl];\n const hbl = this._halfedges[bl];\n const hbr = this._halfedges[br];\n\n this._queueRemove(b0 / 3);\n\n const t0 = this._addTriangle(p0, pr, pn, har, -1, -1, a0);\n const t1 = this._addTriangle(pr, p1, pn, hbr, -1, t0 + 1, b0);\n const t2 = this._addTriangle(p1, pl, pn, hbl, -1, t1 + 1);\n const t3 = this._addTriangle(pl, p0, pn, hal, t0 + 2, t2 + 1);\n\n this._legalize(t0);\n this._legalize(t1);\n this._legalize(t2);\n this._legalize(t3);\n }\n\n // priority queue methods\n\n _queuePush(t, error, rms) {\n const i = this._queue.length;\n this._queueIndices[t] = i;\n this._queue.push(t);\n this._errors.push(error);\n this._rmsSum += rms;\n this._queueUp(i);\n }\n\n _queuePop() {\n const n = this._queue.length - 1;\n this._queueSwap(0, n);\n this._queueDown(0, n);\n return this._queuePopBack();\n }\n\n _queuePopBack() {\n const t = this._queue.pop();\n this._errors.pop();\n this._rmsSum -= this._rms[t];\n this._queueIndices[t] = -1;\n return t;\n }\n\n _queueRemove(t) {\n const i = this._queueIndices[t];\n if (i < 0) {\n const it = this._pending.indexOf(t);\n if (it !== -1) {\n this._pending[it] = this._pending[--this._pendingLen];\n } else {\n throw new Error('Broken triangulation (something went wrong).');\n }\n return;\n }\n const n = this._queue.length - 1;\n if (n !== i) {\n this._queueSwap(i, n);\n if (!this._queueDown(i, n)) {\n this._queueUp(i);\n }\n }\n this._queuePopBack();\n }\n\n _queueLess(i, j) {\n return this._errors[i] > this._errors[j];\n }\n\n _queueSwap(i, j) {\n const pi = this._queue[i];\n const pj = this._queue[j];\n this._queue[i] = pj;\n this._queue[j] = pi;\n this._queueIndices[pi] = j;\n this._queueIndices[pj] = i;\n const e = this._errors[i];\n this._errors[i] = this._errors[j];\n this._errors[j] = e;\n }\n\n _queueUp(j0) {\n let j = j0;\n while (true) {\n const i = (j - 1) >> 1;\n if (i === j || !this._queueLess(j, i)) {\n break;\n }\n this._queueSwap(i, j);\n j = i;\n }\n }\n\n _queueDown(i0, n) {\n let i = i0;\n while (true) {\n const j1 = 2 * i + 1;\n if (j1 >= n || j1 < 0) {\n break;\n }\n const j2 = j1 + 1;\n let j = j1;\n if (j2 < n && this._queueLess(j2, j1)) {\n j = j2;\n }\n if (!this._queueLess(j, i)) {\n break;\n }\n this._queueSwap(i, j);\n i = j;\n }\n return i > i0;\n }\n}\n\nfunction orient(ax, ay, bx, by, cx, cy) {\n return (bx - cx) * (ay - cy) - (by - cy) * (ax - cx);\n}\n\nfunction inCircle(ax, ay, bx, by, cx, cy, px, py) {\n const dx = ax - px;\n const dy = ay - py;\n const ex = bx - px;\n const ey = by - py;\n const fx = cx - px;\n const fy = cy - py;\n\n const ap = dx * dx + dy * dy;\n const bp = ex * ex + ey * ey;\n const cp = fx * fx + fy * fy;\n\n return dx * (ey * cp - bp * fy) - dy * (ex * cp - bp * fx) + ap * (ex * fy - ey * fx) < 0;\n}\n"],"file":"index.js"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["Delatin","constructor","data","width","height","coords","triangles","_halfedges","_candidates","_queueIndices","_queue","_errors","_rms","_pending","_pendingLen","_rmsSum","x1","y1","p0","_addPoint","p1","p2","p3","t0","_addTriangle","_flush","run","maxError","getMaxError","refine","_step","getRMSD","Math","sqrt","heightAt","x","y","i","t","a","b","c","_findCandidate","p0x","p0y","p1x","p1y","p2x","p2y","minX","min","minY","maxX","max","maxY","w00","orient","w01","w02","a01","b01","a12","b12","a20","b20","z0","z1","z2","mx","my","rms","dx","floor","w0","w1","w2","wasInside","z","dz","abs","_queuePush","_queuePop","e0","e1","e2","ax","ay","bx","by","cx","cy","px","py","pn","_handleCollinear","h0","h1","h2","t1","t2","_legalize","length","push","ab","bc","ca","e","a0","b0","al","ar","bl","br","pr","pl","inCircle","hal","har","hbl","hbr","_queueRemove","t3","error","_queueUp","n","_queueSwap","_queueDown","_queuePopBack","pop","it","indexOf","Error","_queueLess","j","pi","pj","j0","i0","j1","j2","dy","ex","ey","fx","fy","ap","bp","cp"],"sources":["../../../../src/lib/delatin/index.ts"],"sourcesContent":["// ISC License\n\n// Copyright(c) 2019, Michael Fogleman, Vladimir Agafonkin\n\n// Permission to use, copy, modify, and / or distribute this software for any purpose\n// with or without fee is hereby granted, provided that the above copyright notice\n// and this permission notice appear in all copies.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\n// FITNESS.IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS\n// OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER\n// TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF\n// THIS SOFTWARE.\n\n// @ts-nocheck\n\n/* eslint-disable complexity, max-params, max-statements, max-depth, no-constant-condition */\nexport default class Delatin {\n constructor(data, width, height = width) {\n this.data = data; // height data\n this.width = width;\n this.height = height;\n\n this.coords = []; // vertex coordinates (x, y)\n this.triangles = []; // mesh triangle indices\n\n // additional triangle data\n this._halfedges = [];\n this._candidates = [];\n this._queueIndices = [];\n\n this._queue = []; // queue of added triangles\n this._errors = [];\n this._rms = [];\n this._pending = []; // triangles pending addition to queue\n this._pendingLen = 0;\n\n this._rmsSum = 0;\n\n const x1 = width - 1;\n const y1 = height - 1;\n const p0 = this._addPoint(0, 0);\n const p1 = this._addPoint(x1, 0);\n const p2 = this._addPoint(0, y1);\n const p3 = this._addPoint(x1, y1);\n\n // add initial two triangles\n const t0 = this._addTriangle(p3, p0, p2, -1, -1, -1);\n this._addTriangle(p0, p3, p1, t0, -1, -1);\n this._flush();\n }\n\n // refine the mesh until its maximum error gets below the given one\n run(maxError = 1) {\n while (this.getMaxError() > maxError) {\n this.refine();\n }\n }\n\n // refine the mesh with a single point\n refine() {\n this._step();\n this._flush();\n }\n\n // max error of the current mesh\n getMaxError() {\n return this._errors[0];\n }\n\n // root-mean-square deviation of the current mesh\n getRMSD() {\n return this._rmsSum > 0 ? Math.sqrt(this._rmsSum / (this.width * this.height)) : 0;\n }\n\n // height value at a given position\n heightAt(x, y) {\n return this.data[this.width * y + x];\n }\n\n // rasterize and queue all triangles that got added or updated in _step\n _flush() {\n const coords = this.coords;\n for (let i = 0; i < this._pendingLen; i++) {\n const t = this._pending[i];\n // rasterize triangle to find maximum pixel error\n const a = 2 * this.triangles[t * 3 + 0];\n const b = 2 * this.triangles[t * 3 + 1];\n const c = 2 * this.triangles[t * 3 + 2];\n this._findCandidate(\n coords[a],\n coords[a + 1],\n coords[b],\n coords[b + 1],\n coords[c],\n coords[c + 1],\n t\n );\n }\n this._pendingLen = 0;\n }\n\n // rasterize a triangle, find its max error, and queue it for processing\n _findCandidate(p0x, p0y, p1x, p1y, p2x, p2y, t) {\n // triangle bounding box\n const minX = Math.min(p0x, p1x, p2x);\n const minY = Math.min(p0y, p1y, p2y);\n const maxX = Math.max(p0x, p1x, p2x);\n const maxY = Math.max(p0y, p1y, p2y);\n\n // forward differencing variables\n let w00 = orient(p1x, p1y, p2x, p2y, minX, minY);\n let w01 = orient(p2x, p2y, p0x, p0y, minX, minY);\n let w02 = orient(p0x, p0y, p1x, p1y, minX, minY);\n const a01 = p1y - p0y;\n const b01 = p0x - p1x;\n const a12 = p2y - p1y;\n const b12 = p1x - p2x;\n const a20 = p0y - p2y;\n const b20 = p2x - p0x;\n\n // pre-multiplied z values at vertices\n const a = orient(p0x, p0y, p1x, p1y, p2x, p2y);\n const z0 = this.heightAt(p0x, p0y) / a;\n const z1 = this.heightAt(p1x, p1y) / a;\n const z2 = this.heightAt(p2x, p2y) / a;\n\n // iterate over pixels in bounding box\n let maxError = 0;\n let mx = 0;\n let my = 0;\n let rms = 0;\n for (let y = minY; y <= maxY; y++) {\n // compute starting offset\n let dx = 0;\n if (w00 < 0 && a12 !== 0) {\n dx = Math.max(dx, Math.floor(-w00 / a12));\n }\n if (w01 < 0 && a20 !== 0) {\n dx = Math.max(dx, Math.floor(-w01 / a20));\n }\n if (w02 < 0 && a01 !== 0) {\n dx = Math.max(dx, Math.floor(-w02 / a01));\n }\n\n let w0 = w00 + a12 * dx;\n let w1 = w01 + a20 * dx;\n let w2 = w02 + a01 * dx;\n\n let wasInside = false;\n\n for (let x = minX + dx; x <= maxX; x++) {\n // check if inside triangle\n if (w0 >= 0 && w1 >= 0 && w2 >= 0) {\n wasInside = true;\n\n // compute z using barycentric coordinates\n const z = z0 * w0 + z1 * w1 + z2 * w2;\n const dz = Math.abs(z - this.heightAt(x, y));\n rms += dz * dz;\n if (dz > maxError) {\n maxError = dz;\n mx = x;\n my = y;\n }\n } else if (wasInside) {\n break;\n }\n\n w0 += a12;\n w1 += a20;\n w2 += a01;\n }\n\n w00 += b12;\n w01 += b20;\n w02 += b01;\n }\n\n if ((mx === p0x && my === p0y) || (mx === p1x && my === p1y) || (mx === p2x && my === p2y)) {\n maxError = 0;\n }\n\n // update triangle metadata\n this._candidates[2 * t] = mx;\n this._candidates[2 * t + 1] = my;\n this._rms[t] = rms;\n\n // add triangle to priority queue\n this._queuePush(t, maxError, rms);\n }\n\n // process the next triangle in the queue, splitting it with a new point\n _step() {\n // pop triangle with highest error from priority queue\n const t = this._queuePop();\n\n const e0 = t * 3 + 0;\n const e1 = t * 3 + 1;\n const e2 = t * 3 + 2;\n\n const p0 = this.triangles[e0];\n const p1 = this.triangles[e1];\n const p2 = this.triangles[e2];\n\n const ax = this.coords[2 * p0];\n const ay = this.coords[2 * p0 + 1];\n const bx = this.coords[2 * p1];\n const by = this.coords[2 * p1 + 1];\n const cx = this.coords[2 * p2];\n const cy = this.coords[2 * p2 + 1];\n const px = this._candidates[2 * t];\n const py = this._candidates[2 * t + 1];\n\n const pn = this._addPoint(px, py);\n\n if (orient(ax, ay, bx, by, px, py) === 0) {\n this._handleCollinear(pn, e0);\n } else if (orient(bx, by, cx, cy, px, py) === 0) {\n this._handleCollinear(pn, e1);\n } else if (orient(cx, cy, ax, ay, px, py) === 0) {\n this._handleCollinear(pn, e2);\n } else {\n const h0 = this._halfedges[e0];\n const h1 = this._halfedges[e1];\n const h2 = this._halfedges[e2];\n\n const t0 = this._addTriangle(p0, p1, pn, h0, -1, -1, e0);\n const t1 = this._addTriangle(p1, p2, pn, h1, -1, t0 + 1);\n const t2 = this._addTriangle(p2, p0, pn, h2, t0 + 2, t1 + 1);\n\n this._legalize(t0);\n this._legalize(t1);\n this._legalize(t2);\n }\n }\n\n // add coordinates for a new vertex\n _addPoint(x, y) {\n const i = this.coords.length >> 1;\n this.coords.push(x, y);\n return i;\n }\n\n // add or update a triangle in the mesh\n _addTriangle(a, b, c, ab, bc, ca, e = this.triangles.length) {\n const t = e / 3; // new triangle index\n\n // add triangle vertices\n this.triangles[e + 0] = a;\n this.triangles[e + 1] = b;\n this.triangles[e + 2] = c;\n\n // add triangle halfedges\n this._halfedges[e + 0] = ab;\n this._halfedges[e + 1] = bc;\n this._halfedges[e + 2] = ca;\n\n // link neighboring halfedges\n if (ab >= 0) {\n this._halfedges[ab] = e + 0;\n }\n if (bc >= 0) {\n this._halfedges[bc] = e + 1;\n }\n if (ca >= 0) {\n this._halfedges[ca] = e + 2;\n }\n\n // init triangle metadata\n this._candidates[2 * t + 0] = 0;\n this._candidates[2 * t + 1] = 0;\n this._queueIndices[t] = -1;\n this._rms[t] = 0;\n\n // add triangle to pending queue for later rasterization\n this._pending[this._pendingLen++] = t;\n\n // return first halfedge index\n return e;\n }\n\n _legalize(a) {\n // if the pair of triangles doesn't satisfy the Delaunay condition\n // (p1 is inside the circumcircle of [p0, pl, pr]), flip them,\n // then do the same check/flip recursively for the new pair of triangles\n //\n // pl pl\n // /||\\ / \\\n // al/ || \\bl al/ \\a\n // / || \\ / \\\n // / a||b \\ flip /___ar___\\\n // p0\\ || /p1 => p0\\---bl---/p1\n // \\ || / \\ /\n // ar\\ || /br b\\ /br\n // \\||/ \\ /\n // pr pr\n\n const b = this._halfedges[a];\n\n if (b < 0) {\n return;\n }\n\n const a0 = a - (a % 3);\n const b0 = b - (b % 3);\n const al = a0 + ((a + 1) % 3);\n const ar = a0 + ((a + 2) % 3);\n const bl = b0 + ((b + 2) % 3);\n const br = b0 + ((b + 1) % 3);\n const p0 = this.triangles[ar];\n const pr = this.triangles[a];\n const pl = this.triangles[al];\n const p1 = this.triangles[bl];\n const coords = this.coords;\n\n if (\n !inCircle(\n coords[2 * p0],\n coords[2 * p0 + 1],\n coords[2 * pr],\n coords[2 * pr + 1],\n coords[2 * pl],\n coords[2 * pl + 1],\n coords[2 * p1],\n coords[2 * p1 + 1]\n )\n ) {\n return;\n }\n\n const hal = this._halfedges[al];\n const har = this._halfedges[ar];\n const hbl = this._halfedges[bl];\n const hbr = this._halfedges[br];\n\n this._queueRemove(a0 / 3);\n this._queueRemove(b0 / 3);\n\n const t0 = this._addTriangle(p0, p1, pl, -1, hbl, hal, a0);\n const t1 = this._addTriangle(p1, p0, pr, t0, har, hbr, b0);\n\n this._legalize(t0 + 1);\n this._legalize(t1 + 2);\n }\n\n // handle a case where new vertex is on the edge of a triangle\n _handleCollinear(pn, a) {\n const a0 = a - (a % 3);\n const al = a0 + ((a + 1) % 3);\n const ar = a0 + ((a + 2) % 3);\n const p0 = this.triangles[ar];\n const pr = this.triangles[a];\n const pl = this.triangles[al];\n const hal = this._halfedges[al];\n const har = this._halfedges[ar];\n\n const b = this._halfedges[a];\n\n if (b < 0) {\n const t0 = this._addTriangle(pn, p0, pr, -1, har, -1, a0);\n const t1 = this._addTriangle(p0, pn, pl, t0, -1, hal);\n this._legalize(t0 + 1);\n this._legalize(t1 + 2);\n return;\n }\n\n const b0 = b - (b % 3);\n const bl = b0 + ((b + 2) % 3);\n const br = b0 + ((b + 1) % 3);\n const p1 = this.triangles[bl];\n const hbl = this._halfedges[bl];\n const hbr = this._halfedges[br];\n\n this._queueRemove(b0 / 3);\n\n const t0 = this._addTriangle(p0, pr, pn, har, -1, -1, a0);\n const t1 = this._addTriangle(pr, p1, pn, hbr, -1, t0 + 1, b0);\n const t2 = this._addTriangle(p1, pl, pn, hbl, -1, t1 + 1);\n const t3 = this._addTriangle(pl, p0, pn, hal, t0 + 2, t2 + 1);\n\n this._legalize(t0);\n this._legalize(t1);\n this._legalize(t2);\n this._legalize(t3);\n }\n\n // priority queue methods\n\n _queuePush(t, error, rms) {\n const i = this._queue.length;\n this._queueIndices[t] = i;\n this._queue.push(t);\n this._errors.push(error);\n this._rmsSum += rms;\n this._queueUp(i);\n }\n\n _queuePop() {\n const n = this._queue.length - 1;\n this._queueSwap(0, n);\n this._queueDown(0, n);\n return this._queuePopBack();\n }\n\n _queuePopBack() {\n const t = this._queue.pop();\n this._errors.pop();\n this._rmsSum -= this._rms[t];\n this._queueIndices[t] = -1;\n return t;\n }\n\n _queueRemove(t) {\n const i = this._queueIndices[t];\n if (i < 0) {\n const it = this._pending.indexOf(t);\n if (it !== -1) {\n this._pending[it] = this._pending[--this._pendingLen];\n } else {\n throw new Error('Broken triangulation (something went wrong).');\n }\n return;\n }\n const n = this._queue.length - 1;\n if (n !== i) {\n this._queueSwap(i, n);\n if (!this._queueDown(i, n)) {\n this._queueUp(i);\n }\n }\n this._queuePopBack();\n }\n\n _queueLess(i, j) {\n return this._errors[i] > this._errors[j];\n }\n\n _queueSwap(i, j) {\n const pi = this._queue[i];\n const pj = this._queue[j];\n this._queue[i] = pj;\n this._queue[j] = pi;\n this._queueIndices[pi] = j;\n this._queueIndices[pj] = i;\n const e = this._errors[i];\n this._errors[i] = this._errors[j];\n this._errors[j] = e;\n }\n\n _queueUp(j0) {\n let j = j0;\n while (true) {\n const i = (j - 1) >> 1;\n if (i === j || !this._queueLess(j, i)) {\n break;\n }\n this._queueSwap(i, j);\n j = i;\n }\n }\n\n _queueDown(i0, n) {\n let i = i0;\n while (true) {\n const j1 = 2 * i + 1;\n if (j1 >= n || j1 < 0) {\n break;\n }\n const j2 = j1 + 1;\n let j = j1;\n if (j2 < n && this._queueLess(j2, j1)) {\n j = j2;\n }\n if (!this._queueLess(j, i)) {\n break;\n }\n this._queueSwap(i, j);\n i = j;\n }\n return i > i0;\n }\n}\n\nfunction orient(ax, ay, bx, by, cx, cy) {\n return (bx - cx) * (ay - cy) - (by - cy) * (ax - cx);\n}\n\nfunction inCircle(ax, ay, bx, by, cx, cy, px, py) {\n const dx = ax - px;\n const dy = ay - py;\n const ex = bx - px;\n const ey = by - py;\n const fx = cx - px;\n const fy = cy - py;\n\n const ap = dx * dx + dy * dy;\n const bp = ex * ex + ey * ey;\n const cp = fx * fx + fy * fy;\n\n return dx * (ey * cp - bp * fy) - dy * (ex * cp - bp * fx) + ap * (ex * fy - ey * fx) < 0;\n}\n"],"mappings":"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"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { concatenateTypedArrays } from '@loaders.gl/loader-utils';
|
|
2
2
|
export function addSkirt(attributes, triangles, skirtHeight, outsideIndices) {
|
|
3
3
|
const outsideEdges = outsideIndices ? getOutsideEdgesFromIndices(outsideIndices, attributes.POSITION.value) : getOutsideEdgesFromTriangles(triangles);
|
|
4
|
+
|
|
4
5
|
const newPosition = new attributes.POSITION.value.constructor(outsideEdges.length * 6);
|
|
5
6
|
const newTexcoord0 = new attributes.TEXCOORD_0.value.constructor(outsideEdges.length * 4);
|
|
6
|
-
const newTriangles = new triangles.constructor(outsideEdges.length * 6);
|
|
7
7
|
|
|
8
|
+
const newTriangles = new triangles.constructor(outsideEdges.length * 6);
|
|
8
9
|
for (let i = 0; i < outsideEdges.length; i++) {
|
|
9
10
|
const edge = outsideEdges[i];
|
|
10
11
|
updateAttributesForNewEdge({
|
|
@@ -17,7 +18,6 @@ export function addSkirt(attributes, triangles, skirtHeight, outsideIndices) {
|
|
|
17
18
|
newTriangles
|
|
18
19
|
});
|
|
19
20
|
}
|
|
20
|
-
|
|
21
21
|
attributes.POSITION.value = concatenateTypedArrays(attributes.POSITION.value, newPosition);
|
|
22
22
|
attributes.TEXCOORD_0.value = concatenateTypedArrays(attributes.TEXCOORD_0.value, newTexcoord0);
|
|
23
23
|
const resultTriangles = triangles instanceof Array ? triangles.concat(newTriangles) : concatenateTypedArrays(triangles, newTriangles);
|
|
@@ -29,20 +29,16 @@ export function addSkirt(attributes, triangles, skirtHeight, outsideIndices) {
|
|
|
29
29
|
|
|
30
30
|
function getOutsideEdgesFromTriangles(triangles) {
|
|
31
31
|
const edges = [];
|
|
32
|
-
|
|
33
32
|
for (let i = 0; i < triangles.length; i += 3) {
|
|
34
33
|
edges.push([triangles[i], triangles[i + 1]]);
|
|
35
34
|
edges.push([triangles[i + 1], triangles[i + 2]]);
|
|
36
35
|
edges.push([triangles[i + 2], triangles[i]]);
|
|
37
36
|
}
|
|
38
|
-
|
|
39
37
|
edges.sort((a, b) => Math.min(...a) - Math.min(...b) || Math.max(...a) - Math.max(...b));
|
|
40
38
|
const outsideEdges = [];
|
|
41
39
|
let index = 0;
|
|
42
|
-
|
|
43
40
|
while (index < edges.length) {
|
|
44
41
|
var _edges, _edges2;
|
|
45
|
-
|
|
46
42
|
if (edges[index][0] === ((_edges = edges[index + 1]) === null || _edges === void 0 ? void 0 : _edges[1]) && edges[index][1] === ((_edges2 = edges[index + 1]) === null || _edges2 === void 0 ? void 0 : _edges2[0])) {
|
|
47
43
|
index += 2;
|
|
48
44
|
} else {
|
|
@@ -50,7 +46,6 @@ function getOutsideEdgesFromTriangles(triangles) {
|
|
|
50
46
|
index++;
|
|
51
47
|
}
|
|
52
48
|
}
|
|
53
|
-
|
|
54
49
|
return outsideEdges;
|
|
55
50
|
}
|
|
56
51
|
|
|
@@ -60,36 +55,38 @@ function getOutsideEdgesFromIndices(indices, position) {
|
|
|
60
55
|
indices.southIndices.sort((a, b) => position[3 * b] - position[3 * a]);
|
|
61
56
|
indices.northIndices.sort((a, b) => position[3 * a] - position[3 * b]);
|
|
62
57
|
const edges = [];
|
|
63
|
-
|
|
64
58
|
for (const index in indices) {
|
|
65
59
|
const indexGroup = indices[index];
|
|
66
|
-
|
|
67
60
|
for (let i = 0; i < indexGroup.length - 1; i++) {
|
|
68
61
|
edges.push([indexGroup[i], indexGroup[i + 1]]);
|
|
69
62
|
}
|
|
70
63
|
}
|
|
71
|
-
|
|
72
64
|
return edges;
|
|
73
65
|
}
|
|
74
66
|
|
|
75
|
-
function updateAttributesForNewEdge({
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
67
|
+
function updateAttributesForNewEdge(_ref) {
|
|
68
|
+
let {
|
|
69
|
+
edge,
|
|
70
|
+
edgeIndex,
|
|
71
|
+
attributes,
|
|
72
|
+
skirtHeight,
|
|
73
|
+
newPosition,
|
|
74
|
+
newTexcoord0,
|
|
75
|
+
newTriangles
|
|
76
|
+
} = _ref;
|
|
84
77
|
const positionsLength = attributes.POSITION.value.length;
|
|
85
78
|
const vertex1Offset = edgeIndex * 2;
|
|
86
79
|
const vertex2Offset = edgeIndex * 2 + 1;
|
|
80
|
+
|
|
87
81
|
newPosition.set(attributes.POSITION.value.subarray(edge[0] * 3, edge[0] * 3 + 3), vertex1Offset * 3);
|
|
88
82
|
newPosition[vertex1Offset * 3 + 2] = newPosition[vertex1Offset * 3 + 2] - skirtHeight;
|
|
83
|
+
|
|
89
84
|
newPosition.set(attributes.POSITION.value.subarray(edge[1] * 3, edge[1] * 3 + 3), vertex2Offset * 3);
|
|
90
85
|
newPosition[vertex2Offset * 3 + 2] = newPosition[vertex2Offset * 3 + 2] - skirtHeight;
|
|
86
|
+
|
|
91
87
|
newTexcoord0.set(attributes.TEXCOORD_0.value.subarray(edge[0] * 2, edge[0] * 2 + 2), vertex1Offset * 2);
|
|
92
88
|
newTexcoord0.set(attributes.TEXCOORD_0.value.subarray(edge[1] * 2, edge[1] * 2 + 2), vertex2Offset * 2);
|
|
89
|
+
|
|
93
90
|
const triangle1Offset = edgeIndex * 2 * 3;
|
|
94
91
|
newTriangles[triangle1Offset] = edge[0];
|
|
95
92
|
newTriangles[triangle1Offset + 1] = positionsLength / 3 + vertex2Offset;
|