use-rhino-loader
Version:
React hook for loading Rhino .3dm files with three.js and Rhino3dmLoader
1,407 lines • 71 kB
JavaScript
import { useState as rn, useEffect as on } from "react";
import { DataTextureLoader as sn, HalfFloatType as Ye, FloatType as Ve, RGBAFormat as an, LinearSRGBColorSpace as ht, RedFormat as cn, NoColorSpace as ln, LinearFilter as rt, DataUtils as gt, Loader as ft, FileLoader as Qe, MeshStandardMaterial as un, DoubleSide as dt, Color as Oe, MeshPhysicalMaterial as pn, TextureLoader as hn, RepeatWrapping as mt, ClampToEdgeWrapping as Xe, Object3D as yt, Matrix4 as gn, BufferGeometryLoader as fn, DirectionalLight as dn, RectAreaLight as mn, SpotLight as yn, PointLight as wn, CanvasTexture as bn, SpriteMaterial as Sn, Sprite as vn, LineBasicMaterial as Tn, Line as En, Mesh as _n, PointsMaterial as wt, Points as Cn } from "three";
/*!
fflate - fast JavaScript compression/decompression
<https://101arrowz.github.io/fflate>
Licensed under MIT. https://github.com/101arrowz/fflate/blob/master/LICENSE
version 0.8.2
*/
var de = Uint8Array, Ue = Uint16Array, xn = Int32Array, bt = new de([
0,
0,
0,
0,
0,
0,
0,
0,
1,
1,
1,
1,
2,
2,
2,
2,
3,
3,
3,
3,
4,
4,
4,
4,
5,
5,
5,
5,
0,
/* unused */
0,
0,
/* impossible */
0
]), St = new de([
0,
0,
0,
0,
1,
1,
2,
2,
3,
3,
4,
4,
5,
5,
6,
6,
7,
7,
8,
8,
9,
9,
10,
10,
11,
11,
12,
12,
13,
13,
/* unused */
0,
0
]), kn = new de([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]), vt = function(v, o) {
for (var l = new Ue(31), u = 0; u < 31; ++u)
l[u] = o += 1 << v[u - 1];
for (var m = new xn(l[30]), u = 1; u < 30; ++u)
for (var a = l[u]; a < l[u + 1]; ++a)
m[a] = a - l[u] << 5 | u;
return { b: l, r: m };
}, Tt = vt(bt, 2), Et = Tt.b, In = Tt.r;
Et[28] = 258, In[258] = 28;
var Mn = vt(St, 0), Rn = Mn.b, ot = new Ue(32768);
for (var K = 0; K < 32768; ++K) {
var Ie = (K & 43690) >> 1 | (K & 21845) << 1;
Ie = (Ie & 52428) >> 2 | (Ie & 13107) << 2, Ie = (Ie & 61680) >> 4 | (Ie & 3855) << 4, ot[K] = ((Ie & 65280) >> 8 | (Ie & 255) << 8) >> 1;
}
var Ze = function(v, o, l) {
for (var u = v.length, m = 0, a = new Ue(o); m < u; ++m)
v[m] && ++a[v[m] - 1];
var S = new Ue(o);
for (m = 1; m < o; ++m)
S[m] = S[m - 1] + a[m - 1] << 1;
var T;
if (l) {
T = new Ue(1 << o);
var R = 15 - o;
for (m = 0; m < u; ++m)
if (v[m])
for (var H = m << 4 | v[m], d = o - v[m], b = S[v[m] - 1]++ << d, y = b | (1 << d) - 1; b <= y; ++b)
T[ot[b] >> R] = H;
} else
for (T = new Ue(u), m = 0; m < u; ++m)
v[m] && (T[m] = ot[S[v[m] - 1]++] >> 15 - v[m]);
return T;
}, He = new de(288);
for (var K = 0; K < 144; ++K)
He[K] = 8;
for (var K = 144; K < 256; ++K)
He[K] = 9;
for (var K = 256; K < 280; ++K)
He[K] = 7;
for (var K = 280; K < 288; ++K)
He[K] = 8;
var _t = new de(32);
for (var K = 0; K < 32; ++K)
_t[K] = 5;
var An = /* @__PURE__ */ Ze(He, 9, 1), On = /* @__PURE__ */ Ze(_t, 5, 1), et = function(v) {
for (var o = v[0], l = 1; l < v.length; ++l)
v[l] > o && (o = v[l]);
return o;
}, ye = function(v, o, l) {
var u = o / 8 | 0;
return (v[u] | v[u + 1] << 8) >> (o & 7) & l;
}, tt = function(v, o) {
var l = o / 8 | 0;
return (v[l] | v[l + 1] << 8 | v[l + 2] << 16) >> (o & 7);
}, Pn = function(v) {
return (v + 7) / 8 | 0;
}, Nn = function(v, o, l) {
return (l == null || l > v.length) && (l = v.length), new de(v.subarray(o, l));
}, Un = [
"unexpected EOF",
"invalid block type",
"invalid length/literal",
"invalid distance",
"stream finished",
"no stream handler",
,
"no callback",
"invalid UTF-8 data",
"extra field too long",
"date not in range 1980-2099",
"filename too long",
"stream finishing",
"invalid zip data"
// determined by unknown compression method
], we = function(v, o, l) {
var u = new Error(o || Un[v]);
if (u.code = v, Error.captureStackTrace && Error.captureStackTrace(u, we), !l)
throw u;
return u;
}, Dn = function(v, o, l, u) {
var m = v.length, a = 0;
if (!m || o.f && !o.l)
return l || new de(0);
var S = !l, T = S || o.i != 2, R = o.i;
S && (l = new de(m * 3));
var H = function(De) {
var We = l.length;
if (De > We) {
var Le = new de(Math.max(We * 2, De));
Le.set(l), l = Le;
}
}, d = o.f || 0, b = o.p || 0, y = o.b || 0, i = o.l, P = o.d, A = o.m, B = o.n, N = m * 8;
do {
if (!i) {
d = ye(v, b, 1);
var F = ye(v, b + 1, 3);
if (b += 3, F)
if (F == 1)
i = An, P = On, A = 9, B = 5;
else if (F == 2) {
var ie = ye(v, b, 31) + 257, pe = ye(v, b + 10, 15) + 4, ae = ie + ye(v, b + 5, 31) + 1;
b += 14;
for (var q = new de(ae), be = new de(19), V = 0; V < pe; ++V)
be[kn[V]] = ye(v, b + V * 3, 7);
b += pe * 3;
for (var re = et(be), Me = (1 << re) - 1, Ee = Ze(be, re, 1), V = 0; V < ae; ) {
var D = Ee[ye(v, b, Me)];
b += D & 15;
var _ = D >> 4;
if (_ < 16)
q[V++] = _;
else {
var L = 0, W = 0;
for (_ == 16 ? (W = 3 + ye(v, b, 3), b += 2, L = q[V - 1]) : _ == 17 ? (W = 3 + ye(v, b, 7), b += 3) : _ == 18 && (W = 11 + ye(v, b, 127), b += 7); W--; )
q[V++] = L;
}
}
var Se = q.subarray(0, ie), oe = q.subarray(ie);
A = et(Se), B = et(oe), i = Ze(Se, A, 1), P = Ze(oe, B, 1);
} else
we(1);
else {
var _ = Pn(b) + 4, Y = v[_ - 4] | v[_ - 3] << 8, te = _ + Y;
if (te > m) {
R && we(0);
break;
}
T && H(y + Y), l.set(v.subarray(_, te), y), o.b = y += Y, o.p = b = te * 8, o.f = d;
continue;
}
if (b > N) {
R && we(0);
break;
}
}
T && H(y + 131072);
for (var se = (1 << A) - 1, Re = (1 << B) - 1, ce = b; ; ce = b) {
var L = i[tt(v, b) & se], me = L >> 4;
if (b += L & 15, b > N) {
R && we(0);
break;
}
if (L || we(2), me < 256)
l[y++] = me;
else if (me == 256) {
ce = b, i = null;
break;
} else {
var Pe = me - 254;
if (me > 264) {
var V = me - 257, xe = bt[V];
Pe = ye(v, b, (1 << xe) - 1) + Et[V], b += xe;
}
var j = P[tt(v, b) & Re], ve = j >> 4;
j || we(3), b += j & 15;
var oe = Rn[ve];
if (ve > 3) {
var xe = St[ve];
oe += tt(v, b) & (1 << xe) - 1, b += xe;
}
if (b > N) {
R && we(0);
break;
}
T && H(y + 131072);
var _e = y + Pe;
if (y < oe) {
var ze = a - oe, Ke = Math.min(oe, _e);
for (ze + y < 0 && we(3); y < Ke; ++y)
l[y] = u[ze + y];
}
for (; y < _e; ++y)
l[y] = l[y - oe];
}
}
o.l = i, o.p = ce, o.b = y, o.f = d, i && (d = 1, o.m = A, o.d = P, o.n = B);
} while (!d);
return y != l.length && S ? Nn(l, 0, y) : l.subarray(0, y);
}, Ln = /* @__PURE__ */ new de(0), Bn = function(v, o) {
return ((v[0] & 15) != 8 || v[0] >> 4 > 7 || (v[0] << 8 | v[1]) % 31) && we(6, "invalid zlib data"), (v[1] >> 5 & 1) == 1 && we(6, "invalid zlib data: " + (v[1] & 32 ? "need" : "unexpected") + " dictionary"), (v[1] >> 3 & 4) + 2;
};
function $e(v, o) {
return Dn(v.subarray(Bn(v), -4), { i: 2 }, o, o);
}
var Fn = typeof TextDecoder < "u" && /* @__PURE__ */ new TextDecoder(), Zn = 0;
try {
Fn.decode(Ln, { stream: !0 }), Zn = 1;
} catch {
}
class Hn extends sn {
/**
* Constructs a new EXR loader.
*
* @param {LoadingManager} [manager] - The loading manager.
*/
constructor(o) {
super(o), this.type = Ye;
}
/**
* Parses the given EXR texture data.
*
* @param {ArrayBuffer} buffer - The raw texture data.
* @return {DataTextureLoader~TexData} An object representing the parsed texture data.
*/
parse(o) {
const q = Math.pow(2.7182818, 2.2);
function be(e, t) {
let n = 0;
for (let c = 0; c < 65536; ++c)
(c == 0 || e[c >> 3] & 1 << (c & 7)) && (t[n++] = c);
const r = n - 1;
for (; n < 65536; ) t[n++] = 0;
return r;
}
function V(e) {
for (let t = 0; t < 16384; t++)
e[t] = {}, e[t].len = 0, e[t].lit = 0, e[t].p = null;
}
const re = { l: 0, c: 0, lc: 0 };
function Me(e, t, n, r, c) {
for (; n < e; )
t = t << 8 | ct(r, c), n += 8;
n -= e, re.l = t >> n & (1 << e) - 1, re.c = t, re.lc = n;
}
const Ee = new Array(59);
function D(e) {
for (let n = 0; n <= 58; ++n) Ee[n] = 0;
for (let n = 0; n < 65537; ++n) Ee[e[n]] += 1;
let t = 0;
for (let n = 58; n > 0; --n) {
const r = t + Ee[n] >> 1;
Ee[n] = t, t = r;
}
for (let n = 0; n < 65537; ++n) {
const r = e[n];
r > 0 && (e[n] = r | Ee[r]++ << 6);
}
}
function L(e, t, n, r, c, s) {
const g = t;
let w = 0, f = 0;
for (; r <= c; r++) {
if (g.value - t.value > n) return !1;
Me(6, w, f, e, g);
const h = re.l;
if (w = re.c, f = re.lc, s[r] = h, h == 63) {
if (g.value - t.value > n)
throw new Error("Something wrong with hufUnpackEncTable");
Me(8, w, f, e, g);
let p = re.l + 6;
if (w = re.c, f = re.lc, r + p > c + 1)
throw new Error("Something wrong with hufUnpackEncTable");
for (; p--; ) s[r++] = 0;
r--;
} else if (h >= 59) {
let p = h - 59 + 2;
if (r + p > c + 1)
throw new Error("Something wrong with hufUnpackEncTable");
for (; p--; ) s[r++] = 0;
r--;
}
}
D(s);
}
function W(e) {
return e & 63;
}
function Se(e) {
return e >> 6;
}
function oe(e, t, n, r) {
for (; t <= n; t++) {
const c = Se(e[t]), s = W(e[t]);
if (c >> s)
throw new Error("Invalid table entry");
if (s > 14) {
const g = r[c >> s - 14];
if (g.len)
throw new Error("Invalid table entry");
if (g.lit++, g.p) {
const w = g.p;
g.p = new Array(g.lit);
for (let f = 0; f < g.lit - 1; ++f)
g.p[f] = w[f];
} else
g.p = new Array(1);
g.p[g.lit - 1] = t;
} else if (s) {
let g = 0;
for (let w = 1 << 14 - s; w > 0; w--) {
const f = r[(c << 14 - s) + g];
if (f.len || f.p)
throw new Error("Invalid table entry");
f.len = s, f.lit = t, g++;
}
}
}
return !0;
}
const se = { c: 0, lc: 0 };
function Re(e, t, n, r) {
e = e << 8 | ct(n, r), t += 8, se.c = e, se.lc = t;
}
const ce = { c: 0, lc: 0 };
function me(e, t, n, r, c, s, g, w, f) {
if (e == t) {
r < 8 && (Re(n, r, c, s), n = se.c, r = se.lc), r -= 8;
let h = n >> r;
if (h = new Uint8Array([h])[0], w.value + h > f)
return !1;
const p = g[w.value - 1];
for (; h-- > 0; )
g[w.value++] = p;
} else if (w.value < f)
g[w.value++] = e;
else
return !1;
ce.c = n, ce.lc = r;
}
function Pe(e) {
return e & 65535;
}
function xe(e) {
const t = Pe(e);
return t > 32767 ? t - 65536 : t;
}
const j = { a: 0, b: 0 };
function ve(e, t) {
const n = xe(e), c = xe(t), s = n + (c & 1) + (c >> 1), g = s, w = s - c;
j.a = g, j.b = w;
}
function _e(e, t) {
const n = Pe(e), r = Pe(t), c = n - (r >> 1) & 65535, s = r + c - 32768 & 65535;
j.a = s, j.b = c;
}
function ze(e, t, n, r, c, s, g) {
const w = g < 16384, f = n > c ? c : n;
let h = 1, p, E;
for (; h <= f; ) h <<= 1;
for (h >>= 1, p = h, h >>= 1; h >= 1; ) {
E = 0;
const I = E + s * (c - p), C = s * h, O = s * p, x = r * h, M = r * p;
let U, G, J, ue;
for (; E <= I; E += O) {
let $ = E;
const Z = E + r * (n - p);
for (; $ <= Z; $ += M) {
const Q = $ + x, fe = $ + C, ee = fe + x;
w ? (ve(e[$ + t], e[fe + t]), U = j.a, J = j.b, ve(e[Q + t], e[ee + t]), G = j.a, ue = j.b, ve(U, G), e[$ + t] = j.a, e[Q + t] = j.b, ve(J, ue), e[fe + t] = j.a, e[ee + t] = j.b) : (_e(e[$ + t], e[fe + t]), U = j.a, J = j.b, _e(e[Q + t], e[ee + t]), G = j.a, ue = j.b, _e(U, G), e[$ + t] = j.a, e[Q + t] = j.b, _e(J, ue), e[fe + t] = j.a, e[ee + t] = j.b);
}
if (n & h) {
const Q = $ + C;
w ? ve(e[$ + t], e[Q + t]) : _e(e[$ + t], e[Q + t]), U = j.a, e[Q + t] = j.b, e[$ + t] = U;
}
}
if (c & h) {
let $ = E;
const Z = E + r * (n - p);
for (; $ <= Z; $ += M) {
const Q = $ + x;
w ? ve(e[$ + t], e[Q + t]) : _e(e[$ + t], e[Q + t]), U = j.a, e[Q + t] = j.b, e[$ + t] = U;
}
}
p = h, h >>= 1;
}
return E;
}
function Ke(e, t, n, r, c, s, g, w, f) {
let h = 0, p = 0;
const E = g, I = Math.trunc(r.value + (c + 7) / 8);
for (; r.value < I; )
for (Re(h, p, n, r), h = se.c, p = se.lc; p >= 14; ) {
const O = h >> p - 14 & 16383, x = t[O];
if (x.len)
p -= x.len, me(x.lit, s, h, p, n, r, w, f, E), h = ce.c, p = ce.lc;
else {
if (!x.p)
throw new Error("hufDecode issues");
let M;
for (M = 0; M < x.lit; M++) {
const U = W(e[x.p[M]]);
for (; p < U && r.value < I; )
Re(h, p, n, r), h = se.c, p = se.lc;
if (p >= U && Se(e[x.p[M]]) == (h >> p - U & (1 << U) - 1)) {
p -= U, me(x.p[M], s, h, p, n, r, w, f, E), h = ce.c, p = ce.lc;
break;
}
}
if (M == x.lit)
throw new Error("hufDecode issues");
}
}
const C = 8 - c & 7;
for (h >>= C, p -= C; p > 0; ) {
const O = t[h << 14 - p & 16383];
if (O.len)
p -= O.len, me(O.lit, s, h, p, n, r, w, f, E), h = ce.c, p = ce.lc;
else
throw new Error("hufDecode issues");
}
return !0;
}
function De(e, t, n, r, c, s) {
const g = { value: 0 }, w = n.value, f = ge(t, n), h = ge(t, n);
n.value += 4;
const p = ge(t, n);
if (n.value += 4, f < 0 || f >= 65537 || h < 0 || h >= 65537)
throw new Error("Something wrong with HUF_ENCSIZE");
const E = new Array(65537), I = new Array(16384);
V(I);
const C = r - (n.value - w);
if (L(e, n, C, f, h, E), p > 8 * (r - (n.value - w)))
throw new Error("Something wrong with hufUncompress");
oe(E, f, h, I), Ke(E, I, e, n, p, h, s, c, g);
}
function We(e, t, n) {
for (let r = 0; r < n; ++r)
t[r] = e[t[r]];
}
function Le(e) {
for (let t = 1; t < e.length; t++) {
const n = e[t - 1] + e[t] - 128;
e[t] = n;
}
}
function st(e, t) {
let n = 0, r = Math.floor((e.length + 1) / 2), c = 0;
const s = e.length - 1;
for (; !(c > s || (t[c++] = e[n++], c > s)); )
t[c++] = e[r++];
}
function it(e) {
let t = e.byteLength;
const n = new Array();
let r = 0;
const c = new DataView(e);
for (; t > 0; ) {
const s = c.getInt8(r++);
if (s < 0) {
const g = -s;
t -= g + 1;
for (let w = 0; w < g; w++)
n.push(c.getUint8(r++));
} else {
const g = s;
t -= 2;
const w = c.getUint8(r++);
for (let f = 0; f < g + 1; f++)
n.push(w);
}
}
return n;
}
function Ct(e, t, n, r, c, s) {
let g = new DataView(s.buffer);
const w = n[e.idx[0]].width, f = n[e.idx[0]].height, h = 3, p = Math.floor(w / 8), E = Math.ceil(w / 8), I = Math.ceil(f / 8), C = w - (E - 1) * 8, O = f - (I - 1) * 8, x = { value: 0 }, M = new Array(h), U = new Array(h), G = new Array(h), J = new Array(h), ue = new Array(h);
for (let Z = 0; Z < h; ++Z)
ue[Z] = t[e.idx[Z]], M[Z] = Z < 1 ? 0 : M[Z - 1] + E * I, U[Z] = new Float32Array(64), G[Z] = new Uint16Array(64), J[Z] = new Uint16Array(E * 64);
for (let Z = 0; Z < I; ++Z) {
let Q = 8;
Z == I - 1 && (Q = O);
let fe = 8;
for (let z = 0; z < E; ++z) {
z == E - 1 && (fe = C);
for (let X = 0; X < h; ++X)
G[X].fill(0), G[X][0] = c[M[X]++], xt(x, r, G[X]), kt(G[X], U[X]), It(U[X]);
Mt(U);
for (let X = 0; X < h; ++X)
Rt(U[X], J[X], z * 64);
}
let ee = 0;
for (let z = 0; z < h; ++z) {
const X = n[e.idx[z]].type;
for (let Ce = 8 * Z; Ce < 8 * Z + Q; ++Ce) {
ee = ue[z][Ce];
for (let Fe = 0; Fe < p; ++Fe) {
const Te = Fe * 64 + (Ce & 7) * 8;
g.setUint16(ee + 0 * 2 * X, J[z][Te + 0], !0), g.setUint16(ee + 1 * 2 * X, J[z][Te + 1], !0), g.setUint16(ee + 2 * 2 * X, J[z][Te + 2], !0), g.setUint16(ee + 3 * 2 * X, J[z][Te + 3], !0), g.setUint16(ee + 4 * 2 * X, J[z][Te + 4], !0), g.setUint16(ee + 5 * 2 * X, J[z][Te + 5], !0), g.setUint16(ee + 6 * 2 * X, J[z][Te + 6], !0), g.setUint16(ee + 7 * 2 * X, J[z][Te + 7], !0), ee += 8 * 2 * X;
}
}
if (p != E)
for (let Ce = 8 * Z; Ce < 8 * Z + Q; ++Ce) {
const Fe = ue[z][Ce] + 8 * p * 2 * X, Te = p * 64 + (Ce & 7) * 8;
for (let Ge = 0; Ge < fe; ++Ge)
g.setUint16(Fe + Ge * 2 * X, J[z][Te + Ge], !0);
}
}
}
const $ = new Uint16Array(w);
g = new DataView(s.buffer);
for (let Z = 0; Z < h; ++Z) {
n[e.idx[Z]].decoded = !0;
const Q = n[e.idx[Z]].type;
if (n[Z].type == 2)
for (let fe = 0; fe < f; ++fe) {
const ee = ue[Z][fe];
for (let z = 0; z < w; ++z)
$[z] = g.getUint16(ee + z * 2 * Q, !0);
for (let z = 0; z < w; ++z)
g.setFloat32(ee + z * 2 * Q, k($[z]), !0);
}
}
}
function xt(e, t, n) {
let r, c = 1;
for (; c < 64; )
r = t[e.value], r == 65280 ? c = 64 : r >> 8 == 255 ? c += r & 255 : (n[c] = r, c++), e.value++;
}
function kt(e, t) {
t[0] = k(e[0]), t[1] = k(e[1]), t[2] = k(e[5]), t[3] = k(e[6]), t[4] = k(e[14]), t[5] = k(e[15]), t[6] = k(e[27]), t[7] = k(e[28]), t[8] = k(e[2]), t[9] = k(e[4]), t[10] = k(e[7]), t[11] = k(e[13]), t[12] = k(e[16]), t[13] = k(e[26]), t[14] = k(e[29]), t[15] = k(e[42]), t[16] = k(e[3]), t[17] = k(e[8]), t[18] = k(e[12]), t[19] = k(e[17]), t[20] = k(e[25]), t[21] = k(e[30]), t[22] = k(e[41]), t[23] = k(e[43]), t[24] = k(e[9]), t[25] = k(e[11]), t[26] = k(e[18]), t[27] = k(e[24]), t[28] = k(e[31]), t[29] = k(e[40]), t[30] = k(e[44]), t[31] = k(e[53]), t[32] = k(e[10]), t[33] = k(e[19]), t[34] = k(e[23]), t[35] = k(e[32]), t[36] = k(e[39]), t[37] = k(e[45]), t[38] = k(e[52]), t[39] = k(e[54]), t[40] = k(e[20]), t[41] = k(e[22]), t[42] = k(e[33]), t[43] = k(e[38]), t[44] = k(e[46]), t[45] = k(e[51]), t[46] = k(e[55]), t[47] = k(e[60]), t[48] = k(e[21]), t[49] = k(e[34]), t[50] = k(e[37]), t[51] = k(e[47]), t[52] = k(e[50]), t[53] = k(e[56]), t[54] = k(e[59]), t[55] = k(e[61]), t[56] = k(e[35]), t[57] = k(e[36]), t[58] = k(e[48]), t[59] = k(e[49]), t[60] = k(e[57]), t[61] = k(e[58]), t[62] = k(e[62]), t[63] = k(e[63]);
}
function It(e) {
const t = 0.5 * Math.cos(0.7853975), n = 0.5 * Math.cos(3.14159 / 16), r = 0.5 * Math.cos(3.14159 / 8), c = 0.5 * Math.cos(3 * 3.14159 / 16), s = 0.5 * Math.cos(5 * 3.14159 / 16), g = 0.5 * Math.cos(3 * 3.14159 / 8), w = 0.5 * Math.cos(7 * 3.14159 / 16), f = new Array(4), h = new Array(4), p = new Array(4), E = new Array(4);
for (let I = 0; I < 8; ++I) {
const C = I * 8;
f[0] = r * e[C + 2], f[1] = g * e[C + 2], f[2] = r * e[C + 6], f[3] = g * e[C + 6], h[0] = n * e[C + 1] + c * e[C + 3] + s * e[C + 5] + w * e[C + 7], h[1] = c * e[C + 1] - w * e[C + 3] - n * e[C + 5] - s * e[C + 7], h[2] = s * e[C + 1] - n * e[C + 3] + w * e[C + 5] + c * e[C + 7], h[3] = w * e[C + 1] - s * e[C + 3] + c * e[C + 5] - n * e[C + 7], p[0] = t * (e[C + 0] + e[C + 4]), p[3] = t * (e[C + 0] - e[C + 4]), p[1] = f[0] + f[3], p[2] = f[1] - f[2], E[0] = p[0] + p[1], E[1] = p[3] + p[2], E[2] = p[3] - p[2], E[3] = p[0] - p[1], e[C + 0] = E[0] + h[0], e[C + 1] = E[1] + h[1], e[C + 2] = E[2] + h[2], e[C + 3] = E[3] + h[3], e[C + 4] = E[3] - h[3], e[C + 5] = E[2] - h[2], e[C + 6] = E[1] - h[1], e[C + 7] = E[0] - h[0];
}
for (let I = 0; I < 8; ++I)
f[0] = r * e[16 + I], f[1] = g * e[16 + I], f[2] = r * e[48 + I], f[3] = g * e[48 + I], h[0] = n * e[8 + I] + c * e[24 + I] + s * e[40 + I] + w * e[56 + I], h[1] = c * e[8 + I] - w * e[24 + I] - n * e[40 + I] - s * e[56 + I], h[2] = s * e[8 + I] - n * e[24 + I] + w * e[40 + I] + c * e[56 + I], h[3] = w * e[8 + I] - s * e[24 + I] + c * e[40 + I] - n * e[56 + I], p[0] = t * (e[I] + e[32 + I]), p[3] = t * (e[I] - e[32 + I]), p[1] = f[0] + f[3], p[2] = f[1] - f[2], E[0] = p[0] + p[1], E[1] = p[3] + p[2], E[2] = p[3] - p[2], E[3] = p[0] - p[1], e[0 + I] = E[0] + h[0], e[8 + I] = E[1] + h[1], e[16 + I] = E[2] + h[2], e[24 + I] = E[3] + h[3], e[32 + I] = E[3] - h[3], e[40 + I] = E[2] - h[2], e[48 + I] = E[1] - h[1], e[56 + I] = E[0] - h[0];
}
function Mt(e) {
for (let t = 0; t < 64; ++t) {
const n = e[0][t], r = e[1][t], c = e[2][t];
e[0][t] = n + 1.5747 * c, e[1][t] = n - 0.1873 * r - 0.4682 * c, e[2][t] = n + 1.8556 * r;
}
}
function Rt(e, t, n) {
for (let r = 0; r < 64; ++r)
t[n + r] = gt.toHalfFloat(At(e[r]));
}
function At(e) {
return e <= 1 ? Math.sign(e) * Math.pow(Math.abs(e), 2.2) : Math.sign(e) * Math.pow(q, Math.abs(e) - 1);
}
function Je(e) {
return new DataView(e.array.buffer, e.offset.value, e.size);
}
function Ot(e) {
const t = e.viewer.buffer.slice(e.offset.value, e.offset.value + e.size), n = new Uint8Array(it(t)), r = new Uint8Array(n.length);
return Le(n), st(n, r), new DataView(r.buffer);
}
function qe(e) {
const t = e.array.slice(e.offset.value, e.offset.value + e.size), n = $e(t), r = new Uint8Array(n.length);
return Le(n), st(n, r), new DataView(r.buffer);
}
function Pt(e) {
const t = e.viewer, n = { value: e.offset.value }, r = new Uint16Array(e.columns * e.lines * (e.inputChannels.length * e.type)), c = new Uint8Array(8192);
let s = 0;
const g = new Array(e.inputChannels.length);
for (let O = 0, x = e.inputChannels.length; O < x; O++)
g[O] = {}, g[O].start = s, g[O].end = g[O].start, g[O].nx = e.columns, g[O].ny = e.lines, g[O].size = e.type, s += g[O].nx * g[O].ny * g[O].size;
const w = Be(t, n), f = Be(t, n);
if (f >= 8192)
throw new Error("Something is wrong with PIZ_COMPRESSION BITMAP_SIZE");
if (w <= f)
for (let O = 0; O < f - w + 1; O++)
c[O + w] = ke(t, n);
const h = new Uint16Array(65536), p = be(c, h), E = ge(t, n);
De(e.array, t, n, E, r, s);
for (let O = 0; O < e.inputChannels.length; ++O) {
const x = g[O];
for (let M = 0; M < g[O].size; ++M)
ze(
r,
x.start + M,
x.nx,
x.size,
x.ny,
x.nx * x.size,
p
);
}
We(h, r, s);
let I = 0;
const C = new Uint8Array(r.buffer.byteLength);
for (let O = 0; O < e.lines; O++)
for (let x = 0; x < e.inputChannels.length; x++) {
const M = g[x], U = M.nx * M.size, G = new Uint8Array(r.buffer, M.end * 2, U * 2);
C.set(G, I), I += U * 2, M.end += U;
}
return new DataView(C.buffer);
}
function Nt(e) {
const t = e.array.slice(e.offset.value, e.offset.value + e.size), n = $e(t), r = e.inputChannels.length * e.lines * e.columns * e.totalBytes, c = new ArrayBuffer(r), s = new DataView(c);
let g = 0, w = 0;
const f = new Array(4);
for (let h = 0; h < e.lines; h++)
for (let p = 0; p < e.inputChannels.length; p++) {
let E = 0;
switch (e.inputChannels[p].pixelType) {
case 1:
f[0] = g, f[1] = f[0] + e.columns, g = f[1] + e.columns;
for (let C = 0; C < e.columns; ++C) {
const O = n[f[0]++] << 8 | n[f[1]++];
E += O, s.setUint16(w, E, !0), w += 2;
}
break;
case 2:
f[0] = g, f[1] = f[0] + e.columns, f[2] = f[1] + e.columns, g = f[2] + e.columns;
for (let C = 0; C < e.columns; ++C) {
const O = n[f[0]++] << 24 | n[f[1]++] << 16 | n[f[2]++] << 8;
E += O, s.setUint32(w, E, !0), w += 4;
}
break;
}
}
return s;
}
function at(e) {
const t = e.viewer, n = { value: e.offset.value }, r = new Uint8Array(e.columns * e.lines * (e.inputChannels.length * e.type * 2)), c = {
version: le(t, n),
unknownUncompressedSize: le(t, n),
unknownCompressedSize: le(t, n),
acCompressedSize: le(t, n),
dcCompressedSize: le(t, n),
rleCompressedSize: le(t, n),
rleUncompressedSize: le(t, n),
rleRawSize: le(t, n),
totalAcUncompressedCount: le(t, n),
totalDcUncompressedCount: le(t, n),
acCompression: le(t, n)
};
if (c.version < 2)
throw new Error("EXRLoader.parse: " + Ae.compression + " version " + c.version + " is unsupported");
const s = new Array();
let g = Be(t, n) - 2;
for (; g > 0; ) {
const x = je(t.buffer, n), M = ke(t, n), U = M >> 2 & 3, G = (M >> 4) - 1, J = new Int8Array([G])[0], ue = ke(t, n);
s.push({
name: x,
index: J,
type: ue,
compression: U
}), g -= x.length + 3;
}
const w = Ae.channels, f = new Array(e.inputChannels.length);
for (let x = 0; x < e.inputChannels.length; ++x) {
const M = f[x] = {}, U = w[x];
M.name = U.name, M.compression = 0, M.decoded = !1, M.type = U.pixelType, M.pLinear = U.pLinear, M.width = e.columns, M.height = e.lines;
}
const h = {
idx: new Array(3)
};
for (let x = 0; x < e.inputChannels.length; ++x) {
const M = f[x];
for (let U = 0; U < s.length; ++U) {
const G = s[U];
M.name == G.name && (M.compression = G.compression, G.index >= 0 && (h.idx[G.index] = x), M.offset = x);
}
}
let p, E, I;
if (c.acCompressedSize > 0)
switch (c.acCompression) {
case 0:
p = new Uint16Array(c.totalAcUncompressedCount), De(e.array, t, n, c.acCompressedSize, p, c.totalAcUncompressedCount);
break;
case 1:
const x = e.array.slice(n.value, n.value + c.totalAcUncompressedCount), M = $e(x);
p = new Uint16Array(M.buffer), n.value += c.totalAcUncompressedCount;
break;
}
if (c.dcCompressedSize > 0) {
const x = {
array: e.array,
offset: n,
size: c.dcCompressedSize
};
E = new Uint16Array(qe(x).buffer), n.value += c.dcCompressedSize;
}
if (c.rleRawSize > 0) {
const x = e.array.slice(n.value, n.value + c.rleCompressedSize), M = $e(x);
I = it(M.buffer), n.value += c.rleCompressedSize;
}
let C = 0;
const O = new Array(f.length);
for (let x = 0; x < O.length; ++x)
O[x] = new Array();
for (let x = 0; x < e.lines; ++x)
for (let M = 0; M < f.length; ++M)
O[M].push(C), C += f[M].width * e.type * 2;
Ct(h, O, f, p, E, r);
for (let x = 0; x < f.length; ++x) {
const M = f[x];
if (!M.decoded)
switch (M.compression) {
case 2:
let U = 0, G = 0;
for (let J = 0; J < e.lines; ++J) {
let ue = O[x][U];
for (let $ = 0; $ < M.width; ++$) {
for (let Z = 0; Z < 2 * M.type; ++Z)
r[ue++] = I[G + Z * M.width * M.height];
G++;
}
U++;
}
break;
case 1:
// skip
default:
throw new Error("EXRLoader.parse: unsupported channel compression");
}
}
return new DataView(r.buffer);
}
function je(e, t) {
const n = new Uint8Array(e);
let r = 0;
for (; n[t.value + r] != 0; )
r += 1;
const c = new TextDecoder().decode(
n.slice(t.value, t.value + r)
);
return t.value = t.value + r + 1, c;
}
function Ut(e, t, n) {
const r = new TextDecoder().decode(
new Uint8Array(e).slice(t.value, t.value + n)
);
return t.value = t.value + n, r;
}
function Dt(e, t) {
const n = he(e, t), r = ge(e, t);
return [n, r];
}
function Lt(e, t) {
const n = ge(e, t), r = ge(e, t);
return [n, r];
}
function he(e, t) {
const n = e.getInt32(t.value, !0);
return t.value = t.value + 4, n;
}
function ge(e, t) {
const n = e.getUint32(t.value, !0);
return t.value = t.value + 4, n;
}
function ct(e, t) {
const n = e[t.value];
return t.value = t.value + 1, n;
}
function ke(e, t) {
const n = e.getUint8(t.value);
return t.value = t.value + 1, n;
}
const le = function(e, t) {
let n;
return "getBigInt64" in DataView.prototype ? n = Number(e.getBigInt64(t.value, !0)) : n = e.getUint32(t.value + 4, !0) + Number(e.getUint32(t.value, !0) << 32), t.value += 8, n;
};
function ne(e, t) {
const n = e.getFloat32(t.value, !0);
return t.value += 4, n;
}
function Bt(e, t) {
return gt.toHalfFloat(ne(e, t));
}
function k(e) {
const t = (e & 31744) >> 10, n = e & 1023;
return (e >> 15 ? -1 : 1) * (t ? t === 31 ? n ? NaN : 1 / 0 : Math.pow(2, t - 15) * (1 + n / 1024) : 6103515625e-14 * (n / 1024));
}
function Be(e, t) {
const n = e.getUint16(t.value, !0);
return t.value += 2, n;
}
function Ft(e, t) {
return k(Be(e, t));
}
function Zt(e, t, n, r) {
const c = n.value, s = [];
for (; n.value < c + r - 1; ) {
const g = je(t, n), w = he(e, n), f = ke(e, n);
n.value += 3;
const h = he(e, n), p = he(e, n);
s.push({
name: g,
pixelType: w,
pLinear: f,
xSampling: h,
ySampling: p
});
}
return n.value += 1, s;
}
function Ht(e, t) {
const n = ne(e, t), r = ne(e, t), c = ne(e, t), s = ne(e, t), g = ne(e, t), w = ne(e, t), f = ne(e, t), h = ne(e, t);
return { redX: n, redY: r, greenX: c, greenY: s, blueX: g, blueY: w, whiteX: f, whiteY: h };
}
function zt(e, t) {
const n = [
"NO_COMPRESSION",
"RLE_COMPRESSION",
"ZIPS_COMPRESSION",
"ZIP_COMPRESSION",
"PIZ_COMPRESSION",
"PXR24_COMPRESSION",
"B44_COMPRESSION",
"B44A_COMPRESSION",
"DWAA_COMPRESSION",
"DWAB_COMPRESSION"
], r = ke(e, t);
return n[r];
}
function Wt(e, t) {
const n = he(e, t), r = he(e, t), c = he(e, t), s = he(e, t);
return { xMin: n, yMin: r, xMax: c, yMax: s };
}
function jt(e, t) {
const n = [
"INCREASING_Y",
"DECREASING_Y",
"RANDOM_Y"
], r = ke(e, t);
return n[r];
}
function Gt(e, t) {
const n = [
"ENVMAP_LATLONG",
"ENVMAP_CUBE"
], r = ke(e, t);
return n[r];
}
function Yt(e, t) {
const n = [
"ONE_LEVEL",
"MIPMAP_LEVELS",
"RIPMAP_LEVELS"
], r = [
"ROUND_DOWN",
"ROUND_UP"
], c = ge(e, t), s = ge(e, t), g = ke(e, t);
return {
xSize: c,
ySize: s,
levelMode: n[g & 15],
roundingMode: r[g >> 4]
};
}
function Xt(e, t) {
const n = ne(e, t), r = ne(e, t);
return [n, r];
}
function $t(e, t) {
const n = ne(e, t), r = ne(e, t), c = ne(e, t);
return [n, r, c];
}
function Kt(e, t, n, r, c) {
if (r === "string" || r === "stringvector" || r === "iccProfile")
return Ut(t, n, c);
if (r === "chlist")
return Zt(e, t, n, c);
if (r === "chromaticities")
return Ht(e, n);
if (r === "compression")
return zt(e, n);
if (r === "box2i")
return Wt(e, n);
if (r === "envmap")
return Gt(e, n);
if (r === "tiledesc")
return Yt(e, n);
if (r === "lineOrder")
return jt(e, n);
if (r === "float")
return ne(e, n);
if (r === "v2f")
return Xt(e, n);
if (r === "v3f")
return $t(e, n);
if (r === "int")
return he(e, n);
if (r === "rational")
return Dt(e, n);
if (r === "timecode")
return Lt(e, n);
if (r === "preview")
return n.value += c, "skipped";
n.value += c;
}
function Jt(e, t) {
const n = Math.log2(e);
return t == "ROUND_DOWN" ? Math.floor(n) : Math.ceil(n);
}
function qt(e, t, n) {
let r = 0;
switch (e.levelMode) {
case "ONE_LEVEL":
r = 1;
break;
case "MIPMAP_LEVELS":
r = Jt(Math.max(t, n), e.roundingMode) + 1;
break;
case "RIPMAP_LEVELS":
throw new Error("THREE.EXRLoader: RIPMAP_LEVELS tiles currently unsupported.");
}
return r;
}
function lt(e, t, n, r) {
const c = new Array(e);
for (let s = 0; s < e; s++) {
const g = 1 << s;
let w = t / g | 0;
r == "ROUND_UP" && w * g < t && (w += 1);
const f = Math.max(w, 1);
c[s] = (f + n - 1) / n | 0;
}
return c;
}
function Vt() {
const e = this, t = e.offset, n = { value: 0 };
for (let r = 0; r < e.tileCount; r++) {
const c = he(e.viewer, t), s = he(e.viewer, t);
t.value += 8, e.size = ge(e.viewer, t);
const g = c * e.blockWidth, w = s * e.blockHeight;
e.columns = g + e.blockWidth > e.width ? e.width - g : e.blockWidth, e.lines = w + e.blockHeight > e.height ? e.height - w : e.blockHeight;
const f = e.columns * e.totalBytes, p = e.size < e.lines * f ? e.uncompress(e) : Je(e);
t.value += e.size;
for (let E = 0; E < e.lines; E++) {
const I = E * e.columns * e.totalBytes;
for (let C = 0; C < e.inputChannels.length; C++) {
const O = Ae.channels[C].name, x = e.channelByteOffsets[O] * e.columns, M = e.decodeChannels[O];
if (M === void 0) continue;
n.value = I + x;
const U = (e.height - (1 + w + E)) * e.outLineWidth;
for (let G = 0; G < e.columns; G++) {
const J = U + (G + g) * e.outputChannels + M;
e.byteArray[J] = e.getter(p, n);
}
}
}
}
}
function Qt() {
const e = this, t = e.offset, n = { value: 0 };
for (let r = 0; r < e.height / e.blockHeight; r++) {
const c = he(e.viewer, t) - Ae.dataWindow.yMin;
e.size = ge(e.viewer, t), e.lines = c + e.blockHeight > e.height ? e.height - c : e.blockHeight;
const s = e.columns * e.totalBytes, w = e.size < e.lines * s ? e.uncompress(e) : Je(e);
t.value += e.size;
for (let f = 0; f < e.blockHeight; f++) {
const h = r * e.blockHeight, p = f + e.scanOrder(h);
if (p >= e.height) continue;
const E = f * s, I = (e.height - 1 - p) * e.outLineWidth;
for (let C = 0; C < e.inputChannels.length; C++) {
const O = Ae.channels[C].name, x = e.channelByteOffsets[O] * e.columns, M = e.decodeChannels[O];
if (M !== void 0) {
n.value = E + x;
for (let U = 0; U < e.columns; U++) {
const G = I + U * e.outputChannels + M;
e.byteArray[G] = e.getter(w, n);
}
}
}
}
}
}
function en(e, t, n) {
const r = {};
if (e.getUint32(0, !0) != 20000630)
throw new Error("THREE.EXRLoader: Provided file doesn't appear to be in OpenEXR format.");
r.version = e.getUint8(4);
const c = e.getUint8(5);
r.spec = {
singleTile: !!(c & 2),
longName: !!(c & 4),
deepFormat: !!(c & 8),
multiPart: !!(c & 16)
}, n.value = 8;
let s = !0;
for (; s; ) {
const g = je(t, n);
if (g === "")
s = !1;
else {
const w = je(t, n), f = ge(e, n), h = Kt(e, t, n, w, f);
h === void 0 ? console.warn(`THREE.EXRLoader: Skipped unknown header attribute type '${w}'.`) : r[g] = h;
}
}
if ((c & -7) != 0)
throw console.error("THREE.EXRHeader:", r), new Error("THREE.EXRLoader: Provided file is currently unsupported.");
return r;
}
function tn(e, t, n, r, c) {
const s = {
size: 0,
viewer: t,
array: n,
offset: r,
width: e.dataWindow.xMax - e.dataWindow.xMin + 1,
height: e.dataWindow.yMax - e.dataWindow.yMin + 1,
inputChannels: e.channels,
channelByteOffsets: {},
scanOrder: null,
totalBytes: null,
columns: null,
lines: null,
type: null,
uncompress: null,
getter: null,
format: null,
colorSpace: ht
};
switch (e.compression) {
case "NO_COMPRESSION":
s.blockHeight = 1, s.uncompress = Je;
break;
case "RLE_COMPRESSION":
s.blockHeight = 1, s.uncompress = Ot;
break;
case "ZIPS_COMPRESSION":
s.blockHeight = 1, s.uncompress = qe;
break;
case "ZIP_COMPRESSION":
s.blockHeight = 16, s.uncompress = qe;
break;
case "PIZ_COMPRESSION":
s.blockHeight = 32, s.uncompress = Pt;
break;
case "PXR24_COMPRESSION":
s.blockHeight = 16, s.uncompress = Nt;
break;
case "DWAA_COMPRESSION":
s.blockHeight = 32, s.uncompress = at;
break;
case "DWAB_COMPRESSION":
s.blockHeight = 256, s.uncompress = at;
break;
default:
throw new Error("EXRLoader.parse: " + e.compression + " is unsupported");
}
const g = {};
for (const p of e.channels)
switch (p.name) {
case "Y":
case "R":
case "G":
case "B":
case "A":
g[p.name] = !0, s.type = p.pixelType;
}
let w = !1;
if (g.R && g.G && g.B)
w = !g.A, s.outputChannels = 4, s.decodeChannels = { R: 0, G: 1, B: 2, A: 3 };
else if (g.Y)
s.outputChannels = 1, s.decodeChannels = { Y: 0 };
else
throw new Error("EXRLoader.parse: file contains unsupported data channels.");
if (s.type == 1)
switch (c) {
case Ve:
s.getter = Ft;
break;
case Ye:
s.getter = Be;
break;
}
else if (s.type == 2)
switch (c) {
case Ve:
s.getter = ne;
break;
case Ye:
s.getter = Bt;
}
else
throw new Error("EXRLoader.parse: unsupported pixelType " + s.type + " for " + e.compression + ".");
s.columns = s.width;
const f = s.width * s.height * s.outputChannels;
switch (c) {
case Ve:
s.byteArray = new Float32Array(f), w && s.byteArray.fill(1, 0, f);
break;
case Ye:
s.byteArray = new Uint16Array(f), w && s.byteArray.fill(15360, 0, f);
break;
default:
console.error("THREE.EXRLoader: unsupported type: ", c);
break;
}
let h = 0;
for (const p of e.channels)
s.decodeChannels[p.name] !== void 0 && (s.channelByteOffsets[p.name] = h), h += p.pixelType * 2;
if (s.totalBytes = h, s.outLineWidth = s.width * s.outputChannels, e.lineOrder === "INCREASING_Y" ? s.scanOrder = (p) => p : s.scanOrder = (p) => s.height - 1 - p, s.outputChannels == 4 ? (s.format = an, s.colorSpace = ht) : (s.format = cn, s.colorSpace = ln), e.spec.singleTile) {
s.blockHeight = e.tiles.ySize, s.blockWidth = e.tiles.xSize;
const p = qt(e.tiles, s.width, s.height), E = lt(p, s.width, e.tiles.xSize, e.tiles.roundingMode), I = lt(p, s.height, e.tiles.ySize, e.tiles.roundingMode);
s.tileCount = E[0] * I[0];
for (let C = 0; C < p; C++)
for (let O = 0; O < I[C]; O++)
for (let x = 0; x < E[C]; x++)
le(t, r);
s.decode = Vt.bind(s);
} else {
s.blockWidth = s.width;
const p = Math.ceil(s.height / s.blockHeight);
for (let E = 0; E < p; E++)
le(t, r);
s.decode = Qt.bind(s);
}
return s;
}
const ut = { value: 0 }, pt = new DataView(o), nn = new Uint8Array(o), Ae = en(pt, o, ut), Ne = tn(Ae, pt, nn, ut, this.type);
return Ne.decode(), {
header: Ae,
width: Ne.width,
height: Ne.height,
data: Ne.byteArray,
format: Ne.format,
colorSpace: Ne.colorSpace,
type: this.type
};
}
/**
* Sets the texture type.
*
* @param {(HalfFloatType|FloatType)} value - The texture type to set.
* @return {RGBMLoader} A reference to this loader.
*/
setDataType(o) {
return this.type = o, this;
}
load(o, l, u, m) {
function a(S, T) {
S.colorSpace = T.colorSpace, S.minFilter = rt, S.magFilter = rt, S.generateMipmaps = !1, S.flipY = !1, l && l(S, T);
}
return super.load(o, a, u, m);
}
}
const nt = /* @__PURE__ */ new WeakMap();
class zn extends ft {
/**
* Constructs a new Rhino 3DM loader.
*
* @param {LoadingManager} [manager] - The loading manager.
*/
constructor(o) {
super(o), this.libraryPath = "", this.libraryPending = null, this.libraryBinary = null, this.libraryConfig = {}, this.url = "", this.workerLimit = 4, this.workerPool = [], this.workerNextTaskID = 1, this.workerSourceURL = "", this.workerConfig = {}, this.materials = [], this.warnings = [];
}
/**
* Path to a folder containing the JS and WASM libraries.
*
* @param {string} path - The library path to set.
* @return {Rhino3dmLoader} A reference to this loader.
*/
setLibraryPath(o) {
return this.libraryPath = o, this;
}
/**
* Sets the maximum number of Web Workers to be used during decoding.
* A lower limit may be preferable if workers are also for other
* tasks in the application.
*
* @param {number} workerLimit - The worker limit.
* @return {Rhino3dmLoader} A reference to this loader.
*/
setWorkerLimit(o) {
return this.workerLimit = o, this;
}
/**
* Starts loading from the given URL and passes the loaded 3DM asset
* to the `onLoad()` callback.
*
* @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.
* @param {function(Object3D)} onLoad - Executed when the loading process has been finished.
* @param {onProgressCallback} onProgress - Executed while the loading is in progress.
* @param {onErrorCallback} onError - Executed when errors occur.
*/
load(o, l, u, m) {
const a = new Qe(this.manager);
a.setPath(this.path), a.setResponseType("arraybuffer"), a.setRequestHeader(this.requestHeader), this.url = o, a.load(o, (S) => {
if (nt.has(S))
return nt.get(S).promise.then(l).catch(m);
this.decodeObjects(S, o).then((T) => {
T.userData.warnings = this.warnings, l(T);
}).catch((T) => m(T));
}, u, m);
}
/**
* Prints debug messages to the browser console.
*/
debug() {
console.log("Task load: ", this.workerPool.map((o) => o._taskLoad));
}
/**
* Decodes the 3DM asset data with a Web Worker.
*
* @param {ArrayBuffer} buffer - The raw 3DM asset data as an array buffer.
* @param {string} url - The asset URL.
* @return {Promise<Object3D>} A Promise that resolved with the decoded 3D object.
*/
decodeObjects(o, l) {
let u, m;
const a = o.byteLength, S = this._getWorker(a).then((T) => (u = T, m = this.workerNextTaskID++, new Promise((R, H) => {
u._callbacks[m] = { resolve: R, reject: H }, u.postMessage({ type: "decode", id: m, buffer: o }, [o]);
}))).then((T) => this._createGeometry(T.data)).catch((T) => {
throw T;
});
return S.catch(() => !0).then(() => {
u && m && this._releaseTask(u, m);
}), nt.set(o, {
url: l,
promise: S
}), S;
}
/**
* Parses the given 3DM data and passes the loaded 3DM asset
* to the `onLoad()` callback.
*
* @param {ArrayBuffer} data - The raw 3DM asset data as an array buffer.
* @param {function(Object3D)} onLoad - Executed when the loading process has been finished.
* @param {onErrorCallback} onError - Executed when errors occur.
*/
parse(o, l, u) {
this.decodeObjects(o, "").then((m) => {
m.userData.warnings = this.warnings, l(m);
}).catch((m) => u(m));
}
_compareMaterials(o) {
const l = {};
l.name = o.name, l.color = {}, l.color.r = o.color.r, l.color.g = o.color.g, l.color.b = o.color.b, l.type = o.type, l.vertexColors = o.vertexColors;
const u = JSON.stringify(l);
for (let m = 0; m < this.materials.length; m++) {
const a = this.materials[m], S = {};
if (S.name = a.name, S.color = {}, S.color.r = a.color.r, S.color.g = a.color.g, S.color.b = a.color.b, S.type = a.type, S.vertexColors = a.vertexColors, JSON.stringify(S) === u)
return a;
}
return this.materials.push(o), o;
}
_createMaterial(o, l) {
if (o === void 0)
return new un({
color: new Oe(1, 1, 1),
metalness: 0.8,
name: ft.DEFAULT_MATERIAL_NAME,
side: dt
});
const u = new pn({
color: new Oe(o.diffuseColor.r / 255, o.diffuseColor.g / 255, o.diffuseColor.b / 255),
emissive: new Oe(o.emissionColor.r, o.emissionColor.g, o.emissionColor.b),
flatShading: o.disableLighting,
ior: o.indexOfRefraction,
name: o.name,
reflectivity: o.reflectivity,
opacity: 1 - o.transparency,
side: dt,
specularColor: o.specularColor,
transparent: o.transparency > 0
});
if (u.userData.id = o.id, o.pbrSupported) {
const a = o.pbr;
u.anisotropy = a.anisotropic, u.anisotropyRotation = a.anisotropicRotation, u.color = new Oe(a.baseColor.r, a.baseColor.g, a.baseColor.b), u.clearcoat = a.clearcoat, u.clearcoatRoughness = a.clearcoatRoughness, u.metalness = a.metallic, u.transmission = 1 - a.opacity, u.roughness = a.roughness, u.sheen = a.sheen, u.specularIntensity = a.specular, u.thickness = a.subsurface;
}
o.pbrSupported && o.pbr.opacity === 0 && o.transparency === 1 && (u.opacity = 0.2, u.transmission = 1);
const m = new hn();
for (let a = 0; a < o.textures.length; a++) {
const S = o.textures[a];
if (S.image !== null) {
const T = m.load(S.image);
switch (S.type) {
case "Bump":
u.bumpMap = T;
break;
case "Diffuse":
u.map = T;
break;
case "Emap":
u.envMap = T;
break;
case "Opacity":
u.transmissionMap = T;
break;
case "Transparency":
u.alphaMap = T, u.transparent = !0;
break;
case "PBR_Alpha":
u.alphaMap = T, u.transparent = !0;
break;
case "PBR_AmbientOcclusion":
u.aoMap = T;
break;
case "PBR_Anisotropic":
u.anisotropyMap = T;
break;
case "PBR_BaseColor":
u.map = T;
break;
case "PBR_Clearcoat":
u.clearcoatMap = T;
break;
case "PBR_ClearcoatBump":
u.clearcoatNormalMap = T;
break;
case "PBR_ClearcoatRoughness":
u.clearcoatRoughnessMap = T;
break;
case "PBR_Displacement":
u.displacementMap = T;
break;
case "PBR_Emission":
u.emissiveMap = T;
break;
case "PBR_Metallic":
u.metalnessMap = T;
break;
case "PBR_Roughness":
u.roughnessMap = T;
break;
case "PBR_Sheen":
u.sheenColorMap = T;
break;
case "PBR_Specular":
u.specularColorMap = T;
break;
case "PBR_Subsurface":
u.thicknessMap = T;
break;
default:
this.warnings.push({
message: `THREE.3DMLoader: No conversion exists for 3dm ${S.type}.`,
type: "no conversion"
});
break;
}
T.wrapS = S.wrapU === 0 ? mt : Xe, T.wrapT = S.wrapV === 0 ? mt : Xe, S.repeat && T.repeat.set(S.repeat[0], S.repeat[1]);
}
}
return l && new Hn().load(l.image, function(a) {
a.mapping = THREE.EquirectangularReflectionMapping, u.envMap = a;
}), u;
}
_createGeometry(o) {
const l = new yt(), u = [], m = [], a = [];
l.u