@d5techs/3dgs-lib 1.4.16 → 1.4.17

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/3dgs-lib.js CHANGED
@@ -4656,7 +4656,7 @@ function createSeededRandom(seed) {
4656
4656
  return ((t ^ t >>> 14) >>> 0) / 4294967296;
4657
4657
  };
4658
4658
  }
4659
- const SH_C0$1 = 0.28209479177387814;
4659
+ const SH_C0$2 = 0.28209479177387814;
4660
4660
  function computeImportanceSampling(buffer, dataOffset, stride, totalCount, sampleCount, opacityOffset, opacityType, scale0Offset, scale0Type, scale1Offset, scale1Type, scale2Offset, scale2Type, littleEndian, seed) {
4661
4661
  const dataView = new DataView(buffer, dataOffset);
4662
4662
  const random = createSeededRandom(seed);
@@ -4846,9 +4846,9 @@ async function parsePLYBuffer(buffer, options = {}) {
4846
4846
  const f_dc_0 = offsets.f_dc_0 >= 0 ? readProperty(dataView, base + offsets.f_dc_0, types.f_dc_0, littleEndian) : 0;
4847
4847
  const f_dc_1 = offsets.f_dc_1 >= 0 ? readProperty(dataView, base + offsets.f_dc_1, types.f_dc_1, littleEndian) : 0;
4848
4848
  const f_dc_2 = offsets.f_dc_2 >= 0 ? readProperty(dataView, base + offsets.f_dc_2, types.f_dc_2, littleEndian) : 0;
4849
- colors[outputIdx * 3 + 0] = 0.5 + SH_C0$1 * f_dc_0;
4850
- colors[outputIdx * 3 + 1] = 0.5 + SH_C0$1 * f_dc_1;
4851
- colors[outputIdx * 3 + 2] = 0.5 + SH_C0$1 * f_dc_2;
4849
+ colors[outputIdx * 3 + 0] = 0.5 + SH_C0$2 * f_dc_0;
4850
+ colors[outputIdx * 3 + 1] = 0.5 + SH_C0$2 * f_dc_1;
4851
+ colors[outputIdx * 3 + 2] = 0.5 + SH_C0$2 * f_dc_2;
4852
4852
  const rawOpacity = offsets.opacity >= 0 ? readProperty(dataView, base + offsets.opacity, types.opacity, littleEndian) : 0;
4853
4853
  opacities[outputIdx] = sigmoid(rawOpacity);
4854
4854
  if (shCoeffs && shProps.length > 0) {
@@ -5129,7 +5129,7 @@ var freb = function(eb, start) {
5129
5129
  };
5130
5130
  var _a = freb(fleb, 2), fl = _a.b, revfl = _a.r;
5131
5131
  fl[28] = 258, revfl[258] = 28;
5132
- var _b = freb(fdeb, 0), fd = _b.b;
5132
+ var _b = freb(fdeb, 0), fd = _b.b, revfd = _b.r;
5133
5133
  var rev = new u16(32768);
5134
5134
  for (var i = 0; i < 32768; ++i) {
5135
5135
  var x = (i & 43690) >> 1 | (i & 21845) << 1;
@@ -5185,8 +5185,8 @@ for (var i = 280; i < 288; ++i)
5185
5185
  var fdt = new u8(32);
5186
5186
  for (var i = 0; i < 32; ++i)
5187
5187
  fdt[i] = 5;
5188
- var flrm = /* @__PURE__ */ hMap(flt, 9, 1);
5189
- var fdrm = /* @__PURE__ */ hMap(fdt, 5, 1);
5188
+ var flm = /* @__PURE__ */ hMap(flt, 9, 0), flrm = /* @__PURE__ */ hMap(flt, 9, 1);
5189
+ var fdm = /* @__PURE__ */ hMap(fdt, 5, 0), fdrm = /* @__PURE__ */ hMap(fdt, 5, 1);
5190
5190
  var max = function(a) {
5191
5191
  var m = a[0];
5192
5192
  for (var i = 1; i < a.length; ++i) {
@@ -5380,7 +5380,353 @@ var inflt = function(dat, st, buf, dict) {
5380
5380
  } while (!final);
5381
5381
  return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);
5382
5382
  };
5383
+ var wbits = function(d, p, v) {
5384
+ v <<= p & 7;
5385
+ var o = p / 8 | 0;
5386
+ d[o] |= v;
5387
+ d[o + 1] |= v >> 8;
5388
+ };
5389
+ var wbits16 = function(d, p, v) {
5390
+ v <<= p & 7;
5391
+ var o = p / 8 | 0;
5392
+ d[o] |= v;
5393
+ d[o + 1] |= v >> 8;
5394
+ d[o + 2] |= v >> 16;
5395
+ };
5396
+ var hTree = function(d, mb) {
5397
+ var t = [];
5398
+ for (var i = 0; i < d.length; ++i) {
5399
+ if (d[i])
5400
+ t.push({ s: i, f: d[i] });
5401
+ }
5402
+ var s = t.length;
5403
+ var t2 = t.slice();
5404
+ if (!s)
5405
+ return { t: et, l: 0 };
5406
+ if (s == 1) {
5407
+ var v = new u8(t[0].s + 1);
5408
+ v[t[0].s] = 1;
5409
+ return { t: v, l: 1 };
5410
+ }
5411
+ t.sort(function(a, b) {
5412
+ return a.f - b.f;
5413
+ });
5414
+ t.push({ s: -1, f: 25001 });
5415
+ var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;
5416
+ t[0] = { s: -1, f: l.f + r.f, l, r };
5417
+ while (i1 != s - 1) {
5418
+ l = t[t[i0].f < t[i2].f ? i0++ : i2++];
5419
+ r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];
5420
+ t[i1++] = { s: -1, f: l.f + r.f, l, r };
5421
+ }
5422
+ var maxSym = t2[0].s;
5423
+ for (var i = 1; i < s; ++i) {
5424
+ if (t2[i].s > maxSym)
5425
+ maxSym = t2[i].s;
5426
+ }
5427
+ var tr = new u16(maxSym + 1);
5428
+ var mbt = ln(t[i1 - 1], tr, 0);
5429
+ if (mbt > mb) {
5430
+ var i = 0, dt = 0;
5431
+ var lft = mbt - mb, cst = 1 << lft;
5432
+ t2.sort(function(a, b) {
5433
+ return tr[b.s] - tr[a.s] || a.f - b.f;
5434
+ });
5435
+ for (; i < s; ++i) {
5436
+ var i2_1 = t2[i].s;
5437
+ if (tr[i2_1] > mb) {
5438
+ dt += cst - (1 << mbt - tr[i2_1]);
5439
+ tr[i2_1] = mb;
5440
+ } else
5441
+ break;
5442
+ }
5443
+ dt >>= lft;
5444
+ while (dt > 0) {
5445
+ var i2_2 = t2[i].s;
5446
+ if (tr[i2_2] < mb)
5447
+ dt -= 1 << mb - tr[i2_2]++ - 1;
5448
+ else
5449
+ ++i;
5450
+ }
5451
+ for (; i >= 0 && dt; --i) {
5452
+ var i2_3 = t2[i].s;
5453
+ if (tr[i2_3] == mb) {
5454
+ --tr[i2_3];
5455
+ ++dt;
5456
+ }
5457
+ }
5458
+ mbt = mb;
5459
+ }
5460
+ return { t: new u8(tr), l: mbt };
5461
+ };
5462
+ var ln = function(n, l, d) {
5463
+ return n.s == -1 ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1)) : l[n.s] = d;
5464
+ };
5465
+ var lc = function(c) {
5466
+ var s = c.length;
5467
+ while (s && !c[--s])
5468
+ ;
5469
+ var cl = new u16(++s);
5470
+ var cli = 0, cln = c[0], cls = 1;
5471
+ var w = function(v) {
5472
+ cl[cli++] = v;
5473
+ };
5474
+ for (var i = 1; i <= s; ++i) {
5475
+ if (c[i] == cln && i != s)
5476
+ ++cls;
5477
+ else {
5478
+ if (!cln && cls > 2) {
5479
+ for (; cls > 138; cls -= 138)
5480
+ w(32754);
5481
+ if (cls > 2) {
5482
+ w(cls > 10 ? cls - 11 << 5 | 28690 : cls - 3 << 5 | 12305);
5483
+ cls = 0;
5484
+ }
5485
+ } else if (cls > 3) {
5486
+ w(cln), --cls;
5487
+ for (; cls > 6; cls -= 6)
5488
+ w(8304);
5489
+ if (cls > 2)
5490
+ w(cls - 3 << 5 | 8208), cls = 0;
5491
+ }
5492
+ while (cls--)
5493
+ w(cln);
5494
+ cls = 1;
5495
+ cln = c[i];
5496
+ }
5497
+ }
5498
+ return { c: cl.subarray(0, cli), n: s };
5499
+ };
5500
+ var clen = function(cf, cl) {
5501
+ var l = 0;
5502
+ for (var i = 0; i < cl.length; ++i)
5503
+ l += cf[i] * cl[i];
5504
+ return l;
5505
+ };
5506
+ var wfblk = function(out, pos, dat) {
5507
+ var s = dat.length;
5508
+ var o = shft(pos + 2);
5509
+ out[o] = s & 255;
5510
+ out[o + 1] = s >> 8;
5511
+ out[o + 2] = out[o] ^ 255;
5512
+ out[o + 3] = out[o + 1] ^ 255;
5513
+ for (var i = 0; i < s; ++i)
5514
+ out[o + i + 4] = dat[i];
5515
+ return (o + 4 + s) * 8;
5516
+ };
5517
+ var wblk = function(dat, out, final, syms, lf, df, eb, li, bs, bl, p) {
5518
+ wbits(out, p++, final);
5519
+ ++lf[256];
5520
+ var _a2 = hTree(lf, 15), dlt = _a2.t, mlb = _a2.l;
5521
+ var _b2 = hTree(df, 15), ddt = _b2.t, mdb = _b2.l;
5522
+ var _c = lc(dlt), lclt = _c.c, nlc = _c.n;
5523
+ var _d = lc(ddt), lcdt = _d.c, ndc = _d.n;
5524
+ var lcfreq = new u16(19);
5525
+ for (var i = 0; i < lclt.length; ++i)
5526
+ ++lcfreq[lclt[i] & 31];
5527
+ for (var i = 0; i < lcdt.length; ++i)
5528
+ ++lcfreq[lcdt[i] & 31];
5529
+ var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l;
5530
+ var nlcc = 19;
5531
+ for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)
5532
+ ;
5533
+ var flen = bl + 5 << 3;
5534
+ var ftlen = clen(lf, flt) + clen(df, fdt) + eb;
5535
+ var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];
5536
+ if (bs >= 0 && flen <= ftlen && flen <= dtlen)
5537
+ return wfblk(out, p, dat.subarray(bs, bs + bl));
5538
+ var lm, ll, dm, dl;
5539
+ wbits(out, p, 1 + (dtlen < ftlen)), p += 2;
5540
+ if (dtlen < ftlen) {
5541
+ lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;
5542
+ var llm = hMap(lct, mlcb, 0);
5543
+ wbits(out, p, nlc - 257);
5544
+ wbits(out, p + 5, ndc - 1);
5545
+ wbits(out, p + 10, nlcc - 4);
5546
+ p += 14;
5547
+ for (var i = 0; i < nlcc; ++i)
5548
+ wbits(out, p + 3 * i, lct[clim[i]]);
5549
+ p += 3 * nlcc;
5550
+ var lcts = [lclt, lcdt];
5551
+ for (var it = 0; it < 2; ++it) {
5552
+ var clct = lcts[it];
5553
+ for (var i = 0; i < clct.length; ++i) {
5554
+ var len = clct[i] & 31;
5555
+ wbits(out, p, llm[len]), p += lct[len];
5556
+ if (len > 15)
5557
+ wbits(out, p, clct[i] >> 5 & 127), p += clct[i] >> 12;
5558
+ }
5559
+ }
5560
+ } else {
5561
+ lm = flm, ll = flt, dm = fdm, dl = fdt;
5562
+ }
5563
+ for (var i = 0; i < li; ++i) {
5564
+ var sym = syms[i];
5565
+ if (sym > 255) {
5566
+ var len = sym >> 18 & 31;
5567
+ wbits16(out, p, lm[len + 257]), p += ll[len + 257];
5568
+ if (len > 7)
5569
+ wbits(out, p, sym >> 23 & 31), p += fleb[len];
5570
+ var dst = sym & 31;
5571
+ wbits16(out, p, dm[dst]), p += dl[dst];
5572
+ if (dst > 3)
5573
+ wbits16(out, p, sym >> 5 & 8191), p += fdeb[dst];
5574
+ } else {
5575
+ wbits16(out, p, lm[sym]), p += ll[sym];
5576
+ }
5577
+ }
5578
+ wbits16(out, p, lm[256]);
5579
+ return p + ll[256];
5580
+ };
5581
+ var deo = /* @__PURE__ */ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);
5383
5582
  var et = /* @__PURE__ */ new u8(0);
5583
+ var dflt = function(dat, lvl, plvl, pre, post, st) {
5584
+ var s = st.z || dat.length;
5585
+ var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7e3)) + post);
5586
+ var w = o.subarray(pre, o.length - post);
5587
+ var lst = st.l;
5588
+ var pos = (st.r || 0) & 7;
5589
+ if (lvl) {
5590
+ if (pos)
5591
+ w[0] = st.r >> 3;
5592
+ var opt = deo[lvl - 1];
5593
+ var n = opt >> 13, c = opt & 8191;
5594
+ var msk_1 = (1 << plvl) - 1;
5595
+ var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1);
5596
+ var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;
5597
+ var hsh = function(i2) {
5598
+ return (dat[i2] ^ dat[i2 + 1] << bs1_1 ^ dat[i2 + 2] << bs2_1) & msk_1;
5599
+ };
5600
+ var syms = new i32(25e3);
5601
+ var lf = new u16(288), df = new u16(32);
5602
+ var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0;
5603
+ for (; i + 2 < s; ++i) {
5604
+ var hv = hsh(i);
5605
+ var imod = i & 32767, pimod = head[hv];
5606
+ prev[imod] = pimod;
5607
+ head[hv] = imod;
5608
+ if (wi <= i) {
5609
+ var rem = s - i;
5610
+ if ((lc_1 > 7e3 || li > 24576) && (rem > 423 || !lst)) {
5611
+ pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);
5612
+ li = lc_1 = eb = 0, bs = i;
5613
+ for (var j = 0; j < 286; ++j)
5614
+ lf[j] = 0;
5615
+ for (var j = 0; j < 30; ++j)
5616
+ df[j] = 0;
5617
+ }
5618
+ var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;
5619
+ if (rem > 2 && hv == hsh(i - dif)) {
5620
+ var maxn = Math.min(n, rem) - 1;
5621
+ var maxd = Math.min(32767, i);
5622
+ var ml = Math.min(258, rem);
5623
+ while (dif <= maxd && --ch_1 && imod != pimod) {
5624
+ if (dat[i + l] == dat[i + l - dif]) {
5625
+ var nl = 0;
5626
+ for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)
5627
+ ;
5628
+ if (nl > l) {
5629
+ l = nl, d = dif;
5630
+ if (nl > maxn)
5631
+ break;
5632
+ var mmd = Math.min(dif, nl - 2);
5633
+ var md = 0;
5634
+ for (var j = 0; j < mmd; ++j) {
5635
+ var ti = i - dif + j & 32767;
5636
+ var pti = prev[ti];
5637
+ var cd = ti - pti & 32767;
5638
+ if (cd > md)
5639
+ md = cd, pimod = ti;
5640
+ }
5641
+ }
5642
+ }
5643
+ imod = pimod, pimod = prev[imod];
5644
+ dif += imod - pimod & 32767;
5645
+ }
5646
+ }
5647
+ if (d) {
5648
+ syms[li++] = 268435456 | revfl[l] << 18 | revfd[d];
5649
+ var lin = revfl[l] & 31, din = revfd[d] & 31;
5650
+ eb += fleb[lin] + fdeb[din];
5651
+ ++lf[257 + lin];
5652
+ ++df[din];
5653
+ wi = i + l;
5654
+ ++lc_1;
5655
+ } else {
5656
+ syms[li++] = dat[i];
5657
+ ++lf[dat[i]];
5658
+ }
5659
+ }
5660
+ }
5661
+ for (i = Math.max(i, wi); i < s; ++i) {
5662
+ syms[li++] = dat[i];
5663
+ ++lf[dat[i]];
5664
+ }
5665
+ pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);
5666
+ if (!lst) {
5667
+ st.r = pos & 7 | w[pos / 8 | 0] << 3;
5668
+ pos -= 7;
5669
+ st.h = head, st.p = prev, st.i = i, st.w = wi;
5670
+ }
5671
+ } else {
5672
+ for (var i = st.w || 0; i < s + lst; i += 65535) {
5673
+ var e = i + 65535;
5674
+ if (e >= s) {
5675
+ w[pos / 8 | 0] = lst;
5676
+ e = s;
5677
+ }
5678
+ pos = wfblk(w, pos + 1, dat.subarray(i, e));
5679
+ }
5680
+ st.i = s;
5681
+ }
5682
+ return slc(o, 0, pre + shft(pos) + post);
5683
+ };
5684
+ var crct = /* @__PURE__ */ function() {
5685
+ var t = new Int32Array(256);
5686
+ for (var i = 0; i < 256; ++i) {
5687
+ var c = i, k = 9;
5688
+ while (--k)
5689
+ c = (c & 1 && -306674912) ^ c >>> 1;
5690
+ t[i] = c;
5691
+ }
5692
+ return t;
5693
+ }();
5694
+ var crc = function() {
5695
+ var c = -1;
5696
+ return {
5697
+ p: function(d) {
5698
+ var cr = c;
5699
+ for (var i = 0; i < d.length; ++i)
5700
+ cr = crct[cr & 255 ^ d[i]] ^ cr >>> 8;
5701
+ c = cr;
5702
+ },
5703
+ d: function() {
5704
+ return ~c;
5705
+ }
5706
+ };
5707
+ };
5708
+ var dopt = function(dat, opt, pre, post, st) {
5709
+ if (!st) {
5710
+ st = { l: 1 };
5711
+ if (opt.dictionary) {
5712
+ var dict = opt.dictionary.subarray(-32768);
5713
+ var newDat = new u8(dict.length + dat.length);
5714
+ newDat.set(dict);
5715
+ newDat.set(dat, dict.length);
5716
+ dat = newDat;
5717
+ st.w = dict.length;
5718
+ }
5719
+ }
5720
+ return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20 : 12 + opt.mem, pre, post, st);
5721
+ };
5722
+ var mrg = function(a, b) {
5723
+ var o = {};
5724
+ for (var k in a)
5725
+ o[k] = a[k];
5726
+ for (var k in b)
5727
+ o[k] = b[k];
5728
+ return o;
5729
+ };
5384
5730
  var b2 = function(d, b) {
5385
5731
  return d[b] | d[b + 1] << 8;
5386
5732
  };
@@ -5390,9 +5736,30 @@ var b4 = function(d, b) {
5390
5736
  var b8 = function(d, b) {
5391
5737
  return b4(d, b) + b4(d, b + 4) * 4294967296;
5392
5738
  };
5739
+ var wbytes = function(d, b, v) {
5740
+ for (; v; ++b)
5741
+ d[b] = v, v >>>= 8;
5742
+ };
5743
+ function deflateSync(data, opts) {
5744
+ return dopt(data, opts || {}, 0, 0);
5745
+ }
5393
5746
  function inflateSync(data, opts) {
5394
5747
  return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary);
5395
5748
  }
5749
+ var fltn = function(d, p, t, o) {
5750
+ for (var k in d) {
5751
+ var val = d[k], n = p + k, op = o;
5752
+ if (Array.isArray(val))
5753
+ op = mrg(o, val[1]), val = val[0];
5754
+ if (val instanceof u8)
5755
+ t[n] = [val, op];
5756
+ else {
5757
+ t[n += "/"] = [new u8(0), op];
5758
+ fltn(val, n, t, o);
5759
+ }
5760
+ }
5761
+ };
5762
+ var te = typeof TextEncoder != "undefined" && /* @__PURE__ */ new TextEncoder();
5396
5763
  var td = typeof TextDecoder != "undefined" && /* @__PURE__ */ new TextDecoder();
5397
5764
  var tds = 0;
5398
5765
  try {
@@ -5416,6 +5783,34 @@ var dutf8 = function(d) {
5416
5783
  r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | d[i++] & 63);
5417
5784
  }
5418
5785
  };
5786
+ function strToU8(str, latin1) {
5787
+ var i;
5788
+ if (te)
5789
+ return te.encode(str);
5790
+ var l = str.length;
5791
+ var ar = new u8(str.length + (str.length >> 1));
5792
+ var ai = 0;
5793
+ var w = function(v) {
5794
+ ar[ai++] = v;
5795
+ };
5796
+ for (var i = 0; i < l; ++i) {
5797
+ if (ai + 5 > ar.length) {
5798
+ var n = new u8(ai + 8 + (l - i << 1));
5799
+ n.set(ar);
5800
+ ar = n;
5801
+ }
5802
+ var c = str.charCodeAt(i);
5803
+ if (c < 128 || latin1)
5804
+ w(c);
5805
+ else if (c < 2048)
5806
+ w(192 | c >> 6), w(128 | c & 63);
5807
+ else if (c > 55295 && c < 57344)
5808
+ c = 65536 + (c & 1023 << 10) | str.charCodeAt(++i) & 1023, w(240 | c >> 18), w(128 | c >> 12 & 63), w(128 | c >> 6 & 63), w(128 | c & 63);
5809
+ else
5810
+ w(224 | c >> 12), w(128 | c >> 6 & 63), w(128 | c & 63);
5811
+ }
5812
+ return slc(ar, 0, ai);
5813
+ }
5419
5814
  function strFromU8(dat, latin1) {
5420
5815
  if (latin1) {
5421
5816
  var r = "";
@@ -5444,6 +5839,107 @@ var z64e = function(d, b) {
5444
5839
  ;
5445
5840
  return [b8(d, b + 12), b8(d, b + 4), b8(d, b + 20)];
5446
5841
  };
5842
+ var exfl = function(ex) {
5843
+ var le = 0;
5844
+ if (ex) {
5845
+ for (var k in ex) {
5846
+ var l = ex[k].length;
5847
+ if (l > 65535)
5848
+ err(9);
5849
+ le += l + 4;
5850
+ }
5851
+ }
5852
+ return le;
5853
+ };
5854
+ var wzh = function(d, b, f, fn, u, c, ce, co) {
5855
+ var fl2 = fn.length, ex = f.extra, col = co && co.length;
5856
+ var exl = exfl(ex);
5857
+ wbytes(d, b, ce != null ? 33639248 : 67324752), b += 4;
5858
+ if (ce != null)
5859
+ d[b++] = 20, d[b++] = f.os;
5860
+ d[b] = 20, b += 2;
5861
+ d[b++] = f.flag << 1 | (c < 0 && 8), d[b++] = u && 8;
5862
+ d[b++] = f.compression & 255, d[b++] = f.compression >> 8;
5863
+ var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;
5864
+ if (y < 0 || y > 119)
5865
+ err(10);
5866
+ wbytes(d, b, y << 25 | dt.getMonth() + 1 << 21 | dt.getDate() << 16 | dt.getHours() << 11 | dt.getMinutes() << 5 | dt.getSeconds() >> 1), b += 4;
5867
+ if (c != -1) {
5868
+ wbytes(d, b, f.crc);
5869
+ wbytes(d, b + 4, c < 0 ? -c - 2 : c);
5870
+ wbytes(d, b + 8, f.size);
5871
+ }
5872
+ wbytes(d, b + 12, fl2);
5873
+ wbytes(d, b + 14, exl), b += 16;
5874
+ if (ce != null) {
5875
+ wbytes(d, b, col);
5876
+ wbytes(d, b + 6, f.attrs);
5877
+ wbytes(d, b + 10, ce), b += 14;
5878
+ }
5879
+ d.set(fn, b);
5880
+ b += fl2;
5881
+ if (exl) {
5882
+ for (var k in ex) {
5883
+ var exf = ex[k], l = exf.length;
5884
+ wbytes(d, b, +k);
5885
+ wbytes(d, b + 2, l);
5886
+ d.set(exf, b + 4), b += 4 + l;
5887
+ }
5888
+ }
5889
+ if (col)
5890
+ d.set(co, b), b += col;
5891
+ return b;
5892
+ };
5893
+ var wzf = function(o, b, c, d, e) {
5894
+ wbytes(o, b, 101010256);
5895
+ wbytes(o, b + 8, c);
5896
+ wbytes(o, b + 10, c);
5897
+ wbytes(o, b + 12, d);
5898
+ wbytes(o, b + 16, e);
5899
+ };
5900
+ function zipSync(data, opts) {
5901
+ if (!opts)
5902
+ opts = {};
5903
+ var r = {};
5904
+ var files = [];
5905
+ fltn(data, "", r, opts);
5906
+ var o = 0;
5907
+ var tot = 0;
5908
+ for (var fn in r) {
5909
+ var _a2 = r[fn], file = _a2[0], p = _a2[1];
5910
+ var compression = p.level == 0 ? 0 : 8;
5911
+ var f = strToU8(fn), s = f.length;
5912
+ var com = p.comment, m = com && strToU8(com), ms = m && m.length;
5913
+ var exl = exfl(p.extra);
5914
+ if (s > 65535)
5915
+ err(11);
5916
+ var d = compression ? deflateSync(file, p) : file, l = d.length;
5917
+ var c = crc();
5918
+ c.p(file);
5919
+ files.push(mrg(p, {
5920
+ size: file.length,
5921
+ crc: c.d(),
5922
+ c: d,
5923
+ f,
5924
+ m,
5925
+ u: s != fn.length || m && com.length != ms,
5926
+ o,
5927
+ compression
5928
+ }));
5929
+ o += 30 + s + exl + l;
5930
+ tot += 76 + 2 * (s + exl) + (ms || 0) + l;
5931
+ }
5932
+ var out = new u8(tot + 22), oe = o, cdl = tot - o;
5933
+ for (var i = 0; i < files.length; ++i) {
5934
+ var f = files[i];
5935
+ wzh(out, f.o, f, f.f, f.u, f.c.length);
5936
+ var badd = 30 + f.f.length + exfl(f.extra);
5937
+ out.set(f.c, f.o + badd);
5938
+ wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);
5939
+ }
5940
+ wzf(out, o, files.length, cdl, oe);
5941
+ return out;
5942
+ }
5447
5943
  function unzipSync(data, opts) {
5448
5944
  var files = {};
5449
5945
  var e = data.length - 22;
@@ -5478,7 +5974,7 @@ function unzipSync(data, opts) {
5478
5974
  }
5479
5975
  return files;
5480
5976
  }
5481
- const SH_C0 = 0.28209479177387814;
5977
+ const SH_C0$1 = 0.28209479177387814;
5482
5978
  const COEFFS_PER_BAND = [3, 8, 15];
5483
5979
  function lerp(a, b, t) {
5484
5980
  return a + (b - a) * t;
@@ -5625,9 +6121,9 @@ async function deserializeSOG(data, onProgress) {
5625
6121
  rotations[i * 4 + 1] = qX;
5626
6122
  rotations[i * 4 + 2] = qY;
5627
6123
  rotations[i * 4 + 3] = qZ;
5628
- colors[i * 3 + 0] = 0.5 + dcCB[sh0Img.data[off + 0]] * SH_C0;
5629
- colors[i * 3 + 1] = 0.5 + dcCB[sh0Img.data[off + 1]] * SH_C0;
5630
- colors[i * 3 + 2] = 0.5 + dcCB[sh0Img.data[off + 2]] * SH_C0;
6124
+ colors[i * 3 + 0] = 0.5 + dcCB[sh0Img.data[off + 0]] * SH_C0$1;
6125
+ colors[i * 3 + 1] = 0.5 + dcCB[sh0Img.data[off + 1]] * SH_C0$1;
6126
+ colors[i * 3 + 2] = 0.5 + dcCB[sh0Img.data[off + 2]] * SH_C0$1;
5631
6127
  opacities[i] = sh0Img.data[off + 3] / 255;
5632
6128
  if (shCoeffs && shPalette && labelsImg) {
5633
6129
  const lOff = (py * labelsImg.width + px) * 4;
@@ -5648,6 +6144,240 @@ async function deserializeSOG(data, onProgress) {
5648
6144
  if (onProgress) onProgress(95, "parse");
5649
6145
  return { count, positions, scales, rotations, colors, opacities, shCoeffs };
5650
6146
  }
6147
+ const SH_C0 = 0.28209479177387814;
6148
+ function symLog(x) {
6149
+ return Math.sign(x) * Math.log(1 + Math.abs(x));
6150
+ }
6151
+ function buildCodebook(values, size = 256, iterations = 8) {
6152
+ if (values.length === 0) return new Array(size).fill(0);
6153
+ const sorted = Float32Array.from(values).sort();
6154
+ const codebook = new Float64Array(size);
6155
+ for (let i = 0; i < size; i++) {
6156
+ codebook[i] = sorted[Math.floor(i / (size - 1) * (sorted.length - 1))];
6157
+ }
6158
+ const assignments = new Uint8Array(values.length);
6159
+ for (let iter = 0; iter < iterations; iter++) {
6160
+ for (let i = 0; i < values.length; i++) {
6161
+ let bestIdx = 0;
6162
+ let bestDist = Math.abs(values[i] - codebook[0]);
6163
+ for (let j = 1; j < size; j++) {
6164
+ const d = Math.abs(values[i] - codebook[j]);
6165
+ if (d < bestDist) {
6166
+ bestDist = d;
6167
+ bestIdx = j;
6168
+ }
6169
+ }
6170
+ assignments[i] = bestIdx;
6171
+ }
6172
+ const sums = new Float64Array(size);
6173
+ const counts = new Uint32Array(size);
6174
+ for (let i = 0; i < values.length; i++) {
6175
+ sums[assignments[i]] += values[i];
6176
+ counts[assignments[i]]++;
6177
+ }
6178
+ for (let j = 0; j < size; j++) {
6179
+ if (counts[j] > 0) codebook[j] = sums[j] / counts[j];
6180
+ }
6181
+ }
6182
+ return Array.from(codebook);
6183
+ }
6184
+ function findNearest(codebook, value) {
6185
+ let bestIdx = 0;
6186
+ let bestDist = Math.abs(value - codebook[0]);
6187
+ for (let j = 1; j < codebook.length; j++) {
6188
+ const d = Math.abs(value - codebook[j]);
6189
+ if (d < bestDist) {
6190
+ bestDist = d;
6191
+ bestIdx = j;
6192
+ }
6193
+ }
6194
+ return bestIdx;
6195
+ }
6196
+ function calcImageDimensions(count) {
6197
+ const width = Math.ceil(Math.sqrt(count));
6198
+ const height = Math.ceil(count / width);
6199
+ return { width, height };
6200
+ }
6201
+ async function encodeWebP(width, height, pixelData) {
6202
+ let canvas;
6203
+ let ctx;
6204
+ if (typeof OffscreenCanvas !== "undefined") {
6205
+ canvas = new OffscreenCanvas(width, height);
6206
+ ctx = canvas.getContext("2d");
6207
+ } else {
6208
+ canvas = document.createElement("canvas");
6209
+ canvas.width = width;
6210
+ canvas.height = height;
6211
+ ctx = canvas.getContext("2d");
6212
+ }
6213
+ const imageData = ctx.createImageData(width, height);
6214
+ imageData.data.set(pixelData);
6215
+ ctx.putImageData(imageData, 0, 0);
6216
+ let blob;
6217
+ if (canvas instanceof OffscreenCanvas) {
6218
+ blob = await canvas.convertToBlob({ type: "image/webp", quality: 1 });
6219
+ } else {
6220
+ blob = await new Promise((resolve, reject) => {
6221
+ canvas.toBlob(
6222
+ (b) => b ? resolve(b) : reject(new Error("toBlob failed")),
6223
+ "image/webp",
6224
+ 1
6225
+ );
6226
+ });
6227
+ }
6228
+ return new Uint8Array(await blob.arrayBuffer());
6229
+ }
6230
+ async function serializeSOG(data) {
6231
+ const { count, positions, scales, rotations, colors, opacities } = data;
6232
+ const { width, height } = calcImageDimensions(count);
6233
+ const totalPixels = width * height;
6234
+ const logPositions = new Float32Array(count * 3);
6235
+ for (let i = 0; i < count * 3; i++) {
6236
+ logPositions[i] = symLog(positions[i]);
6237
+ }
6238
+ const mins = [Infinity, Infinity, Infinity];
6239
+ const maxs = [-Infinity, -Infinity, -Infinity];
6240
+ for (let i = 0; i < count; i++) {
6241
+ for (let c = 0; c < 3; c++) {
6242
+ const v = logPositions[i * 3 + c];
6243
+ if (v < mins[c]) mins[c] = v;
6244
+ if (v > maxs[c]) maxs[c] = v;
6245
+ }
6246
+ }
6247
+ const meansLData = new Uint8ClampedArray(totalPixels * 4);
6248
+ const meansUData = new Uint8ClampedArray(totalPixels * 4);
6249
+ meansLData.fill(255);
6250
+ meansUData.fill(255);
6251
+ for (let i = 0; i < count; i++) {
6252
+ const off = i * 4;
6253
+ for (let c = 0; c < 3; c++) {
6254
+ const range = maxs[c] - mins[c];
6255
+ const norm = range < 1e-10 ? 0 : (logPositions[i * 3 + c] - mins[c]) / range;
6256
+ const q16 = Math.round(norm * 65535);
6257
+ meansLData[off + c] = q16 & 255;
6258
+ meansUData[off + c] = q16 >> 8 & 255;
6259
+ }
6260
+ meansLData[off + 3] = 255;
6261
+ meansUData[off + 3] = 255;
6262
+ }
6263
+ const logScales = new Float32Array(count * 3);
6264
+ for (let i = 0; i < count * 3; i++) {
6265
+ logScales[i] = Math.log(Math.max(1e-8, scales[i]));
6266
+ }
6267
+ const scaleCodebook = buildCodebook(logScales);
6268
+ const scalesData = new Uint8ClampedArray(totalPixels * 4);
6269
+ scalesData.fill(255);
6270
+ for (let i = 0; i < count; i++) {
6271
+ const off = i * 4;
6272
+ scalesData[off + 0] = findNearest(scaleCodebook, logScales[i * 3 + 0]);
6273
+ scalesData[off + 1] = findNearest(scaleCodebook, logScales[i * 3 + 1]);
6274
+ scalesData[off + 2] = findNearest(scaleCodebook, logScales[i * 3 + 2]);
6275
+ scalesData[off + 3] = 255;
6276
+ }
6277
+ const quatsData = new Uint8ClampedArray(totalPixels * 4);
6278
+ quatsData.fill(255);
6279
+ const SQRT2 = Math.SQRT2;
6280
+ for (let i = 0; i < count; i++) {
6281
+ const off = i * 4;
6282
+ let qw = rotations[i * 4 + 0];
6283
+ let qx = rotations[i * 4 + 1];
6284
+ let qy = rotations[i * 4 + 2];
6285
+ let qz = rotations[i * 4 + 3];
6286
+ const comps = [qw, qx, qy, qz];
6287
+ let largest = 0;
6288
+ let largestAbs = Math.abs(comps[0]);
6289
+ for (let j = 1; j < 4; j++) {
6290
+ const a = Math.abs(comps[j]);
6291
+ if (a > largestAbs) {
6292
+ largestAbs = a;
6293
+ largest = j;
6294
+ }
6295
+ }
6296
+ if (comps[largest] < 0) {
6297
+ qw = -qw;
6298
+ qx = -qx;
6299
+ qy = -qy;
6300
+ qz = -qz;
6301
+ }
6302
+ let r0, r1, r2;
6303
+ if (largest === 0) {
6304
+ r0 = qx;
6305
+ r1 = qy;
6306
+ r2 = qz;
6307
+ } else if (largest === 1) {
6308
+ r0 = qw;
6309
+ r1 = qy;
6310
+ r2 = qz;
6311
+ } else if (largest === 2) {
6312
+ r0 = qw;
6313
+ r1 = qx;
6314
+ r2 = qz;
6315
+ } else {
6316
+ r0 = qw;
6317
+ r1 = qx;
6318
+ r2 = qy;
6319
+ }
6320
+ quatsData[off + 0] = Math.round(Math.max(0, Math.min(255, (r0 / SQRT2 + 0.5) * 255)));
6321
+ quatsData[off + 1] = Math.round(Math.max(0, Math.min(255, (r1 / SQRT2 + 0.5) * 255)));
6322
+ quatsData[off + 2] = Math.round(Math.max(0, Math.min(255, (r2 / SQRT2 + 0.5) * 255)));
6323
+ quatsData[off + 3] = largest + 252;
6324
+ }
6325
+ const dcValues = new Float32Array(count * 3);
6326
+ for (let i = 0; i < count; i++) {
6327
+ dcValues[i * 3 + 0] = (colors[i * 3 + 0] - 0.5) / SH_C0;
6328
+ dcValues[i * 3 + 1] = (colors[i * 3 + 1] - 0.5) / SH_C0;
6329
+ dcValues[i * 3 + 2] = (colors[i * 3 + 2] - 0.5) / SH_C0;
6330
+ }
6331
+ const dcCodebook = buildCodebook(dcValues);
6332
+ const sh0Data = new Uint8ClampedArray(totalPixels * 4);
6333
+ sh0Data.fill(255);
6334
+ for (let i = 0; i < count; i++) {
6335
+ const off = i * 4;
6336
+ sh0Data[off + 0] = findNearest(dcCodebook, dcValues[i * 3 + 0]);
6337
+ sh0Data[off + 1] = findNearest(dcCodebook, dcValues[i * 3 + 1]);
6338
+ sh0Data[off + 2] = findNearest(dcCodebook, dcValues[i * 3 + 2]);
6339
+ sh0Data[off + 3] = Math.round(Math.max(0, Math.min(255, opacities[i] * 255)));
6340
+ }
6341
+ const [meansLWebP, meansUWebP, scalesWebP, quatsWebP, sh0WebP] = await Promise.all([
6342
+ encodeWebP(width, height, meansLData),
6343
+ encodeWebP(width, height, meansUData),
6344
+ encodeWebP(width, height, scalesData),
6345
+ encodeWebP(width, height, quatsData),
6346
+ encodeWebP(width, height, sh0Data)
6347
+ ]);
6348
+ const meta = {
6349
+ version: 2,
6350
+ asset: { generator: "d5techs/3dgs-lib" },
6351
+ count,
6352
+ antialias: false,
6353
+ means: {
6354
+ mins,
6355
+ maxs,
6356
+ files: ["means_l.webp", "means_u.webp"]
6357
+ },
6358
+ scales: {
6359
+ codebook: scaleCodebook,
6360
+ files: ["scales.webp"]
6361
+ },
6362
+ quats: {
6363
+ files: ["quats.webp"]
6364
+ },
6365
+ sh0: {
6366
+ codebook: dcCodebook,
6367
+ files: ["sh0.webp"]
6368
+ }
6369
+ };
6370
+ const metaBytes = new TextEncoder().encode(JSON.stringify(meta));
6371
+ const zipData = zipSync({
6372
+ "meta.json": metaBytes,
6373
+ "means_l.webp": meansLWebP,
6374
+ "means_u.webp": meansUWebP,
6375
+ "scales.webp": scalesWebP,
6376
+ "quats.webp": quatsWebP,
6377
+ "sh0.webp": sh0WebP
6378
+ }, { level: 0 });
6379
+ return zipData.buffer;
6380
+ }
5651
6381
  const WORKGROUP_SIZE$1 = 256;
5652
6382
  const RADIX_BITS = 8;
5653
6383
  const RADIX_SIZE = 256;
@@ -16451,6 +17181,50 @@ class SplatEditor {
16451
17181
  const { positions, scales, rotations, colors, opacities, shCoeffs } = this.compactData;
16452
17182
  return exportEditedPLY(positions, scales, rotations, colors, opacities, shCoeffs ?? null, this.splatState);
16453
17183
  }
17184
+ async exportSOG() {
17185
+ if (!this.compactData) return null;
17186
+ const filtered = this.getFilteredCompactData();
17187
+ if (!filtered) return null;
17188
+ return serializeSOG(filtered);
17189
+ }
17190
+ getFilteredCompactData() {
17191
+ if (!this.compactData) return null;
17192
+ const src = this.compactData;
17193
+ const { count, data } = this.splatState;
17194
+ let keepCount = 0;
17195
+ for (let i = 0; i < count; i++) {
17196
+ if (!(data[i] & State.deleted)) keepCount++;
17197
+ }
17198
+ if (keepCount === 0) return null;
17199
+ if (keepCount === count) return src;
17200
+ const positions = new Float32Array(keepCount * 3);
17201
+ const scales = new Float32Array(keepCount * 3);
17202
+ const rotations = new Float32Array(keepCount * 4);
17203
+ const colors = new Float32Array(keepCount * 3);
17204
+ const opacities = new Float32Array(keepCount);
17205
+ let dst = 0;
17206
+ for (let i = 0; i < count; i++) {
17207
+ if (data[i] & State.deleted) continue;
17208
+ const i3 = i * 3, d3 = dst * 3;
17209
+ positions[d3] = src.positions[i3];
17210
+ positions[d3 + 1] = src.positions[i3 + 1];
17211
+ positions[d3 + 2] = src.positions[i3 + 2];
17212
+ scales[d3] = src.scales[i3];
17213
+ scales[d3 + 1] = src.scales[i3 + 1];
17214
+ scales[d3 + 2] = src.scales[i3 + 2];
17215
+ colors[d3] = src.colors[i3];
17216
+ colors[d3 + 1] = src.colors[i3 + 1];
17217
+ colors[d3 + 2] = src.colors[i3 + 2];
17218
+ const i4 = i * 4, d4 = dst * 4;
17219
+ rotations[d4] = src.rotations[i4];
17220
+ rotations[d4 + 1] = src.rotations[i4 + 1];
17221
+ rotations[d4 + 2] = src.rotations[i4 + 2];
17222
+ rotations[d4 + 3] = src.rotations[i4 + 3];
17223
+ opacities[dst] = src.opacities[i];
17224
+ dst++;
17225
+ }
17226
+ return { count: keepCount, positions, scales, rotations, colors, opacities };
17227
+ }
16454
17228
  downloadPLY(filename = "edited.ply") {
16455
17229
  const buffer = this.exportPLY();
16456
17230
  if (!buffer) return;
@@ -17788,6 +18562,7 @@ export {
17788
18562
  loadTextureFromURL,
17789
18563
  mergeBoundingBoxes,
17790
18564
  parsePLYBuffer,
18565
+ serializeSOG,
17791
18566
  transformBoundingBox
17792
18567
  };
17793
18568
  //# sourceMappingURL=3dgs-lib.js.map