@loaders.gl/terrain 3.3.0-alpha.1 → 3.3.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 (54) hide show
  1. package/dist/es5/bundle.js +0 -1
  2. package/dist/es5/bundle.js.map +1 -1
  3. package/dist/es5/index.js +10 -24
  4. package/dist/es5/index.js.map +1 -1
  5. package/dist/es5/lib/decode-quantized-mesh.js +18 -65
  6. package/dist/es5/lib/decode-quantized-mesh.js.map +1 -1
  7. package/dist/es5/lib/delatin/index.js +46 -104
  8. package/dist/es5/lib/delatin/index.js.map +1 -1
  9. package/dist/es5/lib/helpers/skirt.js +12 -20
  10. package/dist/es5/lib/helpers/skirt.js.map +1 -1
  11. package/dist/es5/lib/parse-quantized-mesh.js +22 -39
  12. package/dist/es5/lib/parse-quantized-mesh.js.map +1 -1
  13. package/dist/es5/lib/parse-terrain.js +23 -57
  14. package/dist/es5/lib/parse-terrain.js.map +1 -1
  15. package/dist/es5/lib/utils/version.js +1 -1
  16. package/dist/es5/lib/utils/version.js.map +1 -1
  17. package/dist/es5/quantized-mesh-loader.js +0 -2
  18. package/dist/es5/quantized-mesh-loader.js.map +1 -1
  19. package/dist/es5/terrain-loader.js +1 -2
  20. package/dist/es5/terrain-loader.js.map +1 -1
  21. package/dist/es5/workers/quantized-mesh-worker.js +0 -2
  22. package/dist/es5/workers/quantized-mesh-worker.js.map +1 -1
  23. package/dist/es5/workers/terrain-worker.js +0 -2
  24. package/dist/es5/workers/terrain-worker.js.map +1 -1
  25. package/dist/esm/bundle.js +1 -1
  26. package/dist/esm/bundle.js.map +1 -1
  27. package/dist/esm/index.js +7 -2
  28. package/dist/esm/index.js.map +1 -1
  29. package/dist/esm/lib/decode-quantized-mesh.js +6 -40
  30. package/dist/esm/lib/decode-quantized-mesh.js.map +1 -1
  31. package/dist/esm/lib/delatin/index.js +18 -98
  32. package/dist/esm/lib/delatin/index.js.map +1 -1
  33. package/dist/esm/lib/helpers/skirt.js +16 -19
  34. package/dist/esm/lib/helpers/skirt.js.map +1 -1
  35. package/dist/esm/lib/parse-quantized-mesh.js +2 -6
  36. package/dist/esm/lib/parse-quantized-mesh.js.map +1 -1
  37. package/dist/esm/lib/parse-terrain.js +6 -19
  38. package/dist/esm/lib/parse-terrain.js.map +1 -1
  39. package/dist/esm/lib/utils/version.js +2 -1
  40. package/dist/esm/lib/utils/version.js.map +1 -1
  41. package/dist/esm/quantized-mesh-loader.js +1 -0
  42. package/dist/esm/quantized-mesh-loader.js.map +1 -1
  43. package/dist/esm/terrain-loader.js +2 -0
  44. package/dist/esm/terrain-loader.js.map +1 -1
  45. package/dist/esm/workers/quantized-mesh-worker.js.map +1 -1
  46. package/dist/esm/workers/terrain-worker.js.map +1 -1
  47. package/dist/lib/decode-quantized-mesh.d.ts +1 -1
  48. package/dist/lib/decode-quantized-mesh.d.ts.map +1 -1
  49. package/dist/lib/helpers/skirt.d.ts +1 -1
  50. package/dist/lib/helpers/skirt.d.ts.map +1 -1
  51. package/dist/lib/parse-quantized-mesh.js +5 -1
  52. package/dist/quantized-mesh-worker.js +1 -1
  53. package/dist/terrain-worker.js +1 -1
  54. package/package.json +4 -4
@@ -1,10 +1,14 @@
1
+
2
+
1
3
  export default class Delatin {
2
- constructor(data, width, height = 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(maxError = 1) {
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, e = this.triangles.length) {
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
- edge,
77
- edgeIndex,
78
- attributes,
79
- skirtHeight,
80
- newPosition,
81
- newTexcoord0,
82
- newTriangles
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;