sceneview-web 3.6.2 → 4.0.1

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/package.json CHANGED
@@ -1,31 +1,14 @@
1
1
  {
2
2
  "name": "sceneview-web",
3
- "version": "3.6.2",
4
- "description": "SceneView for Web \u2014 3D rendering with Filament.js (WebGL2/WASM). Same engine as SceneView Android.",
5
- "main": "build/dist/js/productionExecutable/sceneview-web.js",
6
- "files": [
7
- "build/dist/js/productionExecutable/sceneview-web.js",
8
- "build/dist/js/productionExecutable/sceneview-web.js.map"
9
- ],
10
- "keywords": [
11
- "3d",
12
- "webgl",
13
- "filament",
14
- "sceneview",
15
- "gltf",
16
- "wasm",
17
- "pbr",
18
- "rendering",
19
- "kotlin"
20
- ],
3
+ "version": "4.0.1",
4
+ "description": "SceneView for Web 3D rendering with Filament.js (WebGL2/WASM)",
5
+ "main": "sceneview-web.js",
6
+ "keywords": ["3d", "webgl", "filament", "sceneview", "gltf", "wasm"],
21
7
  "homepage": "https://github.com/sceneview/sceneview",
22
8
  "repository": {
23
9
  "type": "git",
24
10
  "url": "https://github.com/sceneview/sceneview.git",
25
11
  "directory": "sceneview-web"
26
12
  },
27
- "license": "Apache-2.0",
28
- "peerDependencies": {
29
- "filament": ">=1.52.0"
30
- }
13
+ "license": "Apache-2.0"
31
14
  }
@@ -0,0 +1,2 @@
1
+ !function(t,n){"object"==typeof exports&&"object"==typeof module?module.exports=n(require("Filament")):"function"==typeof define&&define.amd?define(["Filament"],n):"object"==typeof exports?exports["sceneview-web"]=n(require("Filament")):t["sceneview-web"]=n(t.Filament)}(globalThis,t=>{return n={883(t,n,e){var i,r,o;r=[n,e(580),e(36)],void 0===(o="function"==typeof(i=function(t,n,e){"use strict";var i=Math.imul,r=n.$_$.e,o=e.$_$.a,u=n.$_$.b,s=n.$_$.a,_=e.$_$.f,a=e.$_$.c,h=(e.$_$.b,n.$_$.c),c=e.$_$.s,f=e.$_$.p,l=e.$_$.i,v=n.$_$.d,w=e.$_$.y;function g(t,n){this.l2_1=t,this.m2_1=n}function d(t,n,e,i){t=t===o?new u:t,n=n===o?null:n,e=e===o?null:e,i=i===o?null:i,this.n2_1=t,this.o2_1=n,this.p2_1=e,this.q2_1=i}return l(g,"GeometryData"),l(d,"Vertex",d),f(g).toString=function(){return"GeometryData(vertices="+c(this.l2_1)+", indices="+c(this.m2_1)+")"},f(d).toString=function(){return"Vertex(position="+this.n2_1.toString()+", normal="+w(this.o2_1)+", uvCoordinate="+w(this.p2_1)+", color="+w(this.q2_1)+")"},t.$_$=t.$_$||{},t.$_$.a=function(t,n){t=t===o?r(1):t,n=n===o?r(0):n;var e=new u(.5*t.g2_1,.5*t.h2_1,.5*t.i2_1),h=new u(-e.g2_1,-e.h2_1,e.i2_1),c=new u(n.g2_1+h.g2_1,n.h2_1+h.h2_1,n.i2_1+h.i2_1),f=new u(e.g2_1,-e.h2_1,e.i2_1),l=new u(n.g2_1+f.g2_1,n.h2_1+f.h2_1,n.i2_1+f.i2_1),v=new u(e.g2_1,-e.h2_1,-e.i2_1),w=new u(n.g2_1+v.g2_1,n.h2_1+v.h2_1,n.i2_1+v.i2_1),p=new u(-e.g2_1,-e.h2_1,-e.i2_1),m=new u(n.g2_1+p.g2_1,n.h2_1+p.h2_1,n.i2_1+p.i2_1),$=new u(-e.g2_1,e.h2_1,e.i2_1),y=new u(n.g2_1+$.g2_1,n.h2_1+$.h2_1,n.i2_1+$.i2_1),b=new u(e.g2_1,e.h2_1,e.i2_1),x=new u(n.g2_1+b.g2_1,n.h2_1+b.h2_1,n.i2_1+b.i2_1),S=new u(e.g2_1,e.h2_1,-e.i2_1),M=new u(n.g2_1+S.g2_1,n.h2_1+S.h2_1,n.i2_1+S.i2_1),k=new u(-e.g2_1,e.h2_1,-e.i2_1),E=new u(n.g2_1+k.g2_1,n.h2_1+k.h2_1,n.i2_1+k.i2_1),A=new u(o,1),j=new u(o,-1),C=new u(o,o,-1),V=new u(o,o,1),L=new u(-1),q=new u(1),O=new s(0,0),z=new s(1,0),F=new s(0,1),I=new s(1,1),B=_([new d(c,j,F),new d(l,j,I),new d(w,j,z),new d(m,j,O),new d(E,L,F),new d(y,L,I),new d(c,L,z),new d(m,L,O),new d(y,V,F),new d(x,V,I),new d(l,V,z),new d(c,V,O),new d(M,C,F),new d(E,C,I),new d(m,C,z),new d(w,C,O),new d(x,q,F),new d(M,q,I),new d(w,q,z),new d(l,q,O),new d(E,A,F),new d(M,A,I),new d(x,A,z),new d(y,A,O)]),R=a(),N=0;if(N<6)do{var U=N;N=N+1|0;var T=i(4,U);R.r(3+T|0),R.r(1+T|0),R.r(0+T|0),R.r(3+T|0),R.r(2+T|0),R.r(1+T|0)}while(N<6);return new g(B,R.s1())},t.$_$.b=function(t,n,e,_){t=t===o?1:t,n=n===o?2:n,e=e===o?r(0):e,_=_===o?24:_;var c=a(),f=n/2,l=6.2831855/_,v=0,w=1/_,p=a(),m=a(),$=a(),y=0;if(y<=_)do{var b=y;y=y+1|0;var x=v,S=t*Math.cos(x),M=-f,k=v,E=Math.sin(k),A=new u(S,M,t*E),j=new u(A.g2_1+e.g2_1,A.h2_1+e.h2_1,A.i2_1+e.i2_1);c.r(new d(j,h(new u(j.g2_1-e.g2_1,0,j.i2_1-e.i2_1)),new s(w*b,0))),p.r(new d(j,new u(o,-1),new s(w*b,0)));var C=v,V=t*Math.cos(C),L=v,q=Math.sin(L),O=new u(V,f,t*q),z=new u(O.g2_1+e.g2_1,O.h2_1+e.h2_1,O.i2_1+e.i2_1);$.r(new d(z,h(new u(z.g2_1-e.g2_1,0,z.i2_1-e.i2_1)),new s(w*b,1)));var F=new u(o,1),I=v,B=(Math.cos(I)+1)/2,R=v,N=Math.sin(R);m.r(new d(z,F,new s(B,(N+1)/2))),v+=l}while(b!==_);c.s($);var U=new u(o,-f),T=new u(e.g2_1+U.g2_1,e.h2_1+U.h2_1,e.i2_1+U.i2_1);c.r(new d(T,new u(o,-1),new s(.5,.5))),c.s(p);var D=new u(o,f),P=new u(e.g2_1+D.g2_1,e.h2_1+D.h2_1,e.i2_1+D.i2_1);c.r(new d(P,new u(o,1),new s(.5,.5))),c.s(m);var Y=c.s1(),W=a(),X=0;if(X<_)do{var G=X;X=X+1|0;var K=G+1|0,H=1+(G+_|0)|0,J=2+(G+_|0)|0,Z=i(2,_+1|0),Q=2+(Z+_|0)|0;W.r(G),W.r(J),W.r(K),W.r(G),W.r(H),W.r(J),W.r(Z),W.r(1+(Z+G|0)|0),W.r(2+(Z+G|0)|0),W.r(Q),W.r(2+(Q+G|0)|0),W.r(1+(Q+G|0)|0)}while(X<_);return new g(Y,W.s1())},t.$_$.c=function(t,n,e){t=t===o?v(1):t,n=n===o?r(0):n,e=e===o?new u(o,1):e;var i=new u(t.j2_1,t.k2_1,0),a=new u(i.g2_1/2,i.h2_1/2,i.i2_1/2),h=new u(-a.g2_1,-a.h2_1,a.i2_1),c=new d(new u(n.g2_1+h.g2_1,n.h2_1+h.h2_1,n.i2_1+h.i2_1),e,new s(0,0)),f=new u(-a.g2_1,a.h2_1,-a.i2_1),l=new d(new u(n.g2_1+f.g2_1,n.h2_1+f.h2_1,n.i2_1+f.i2_1),e,new s(0,1)),w=new u(a.g2_1,a.h2_1,-a.i2_1),p=new d(new u(n.g2_1+w.g2_1,n.h2_1+w.h2_1,n.i2_1+w.i2_1),e,new s(1,1)),m=new u(a.g2_1,-a.h2_1,a.i2_1),$=new u(n.g2_1+m.g2_1,n.h2_1+m.h2_1,n.i2_1+m.i2_1);return new g(_([c,l,p,new d($,e,new s(1,0))]),_([3,1,0,3,2,1]))},t.$_$.d=function(t,n,e,i){t=t===o?1:t,n=n===o?r(0):n,e=e===o?24:e,i=i===o?24:i;var _=a(),c=0;if(c<=e)do{var f=c;c=c+1|0;var l=3.1415927*f/e,v=0;if(v<=i)do{var w=v;v=v+1|0;var p=6.2831855*(w===i?0:w)/i,m=Math.sin(l)*Math.cos(p),$=Math.cos(l),y=Math.sin(l),b=Math.sin(p),x=new u(m,$,y*b),S=new u(x.g2_1*t,x.h2_1*t,x.i2_1*t),M=h(S),k=S;S=new u(k.g2_1+n.g2_1,k.h2_1+n.h2_1,k.i2_1+n.i2_1);var E=new s(1-w/i,1-f/e);_.r(new d(S,M,E))}while(w!==i)}while(f!==e);var A=_.s1(),j=a(),C=0,V=0;if(V<e)do{var L=V;V=V+1|0;var q=0;if(q<i)do{var O=q;q=q+1|0;var z=L===(e-1|0),F=O+1|0;0===L||(j.r(C+O|0),j.r(C+F|0),j.r(1+((C+O|0)+i|0)|0)),z||(j.r(C+F|0),j.r(1+((C+F|0)+i|0)|0),j.r(1+((C+O|0)+i|0)|0))}while(q<i);C=C+(i+1|0)|0}while(V<e);return new g(A,j.s1())},t})?i.apply(n,r):i)||(t.exports=o)},36(t,n){var e,i;"object"!=typeof globalThis&&(Object.defineProperty(Object.prototype,"__magic__",{get:function(){return this},configurable:!0}),__magic__.globalThis=__magic__,delete Object.prototype.__magic__),void 0===Math.imul&&(Math.imul=function(t,n){return(4294901760&t)*(65535&n)+(65535&t)*(0|n)|0}),void 0===ArrayBuffer.isView&&(ArrayBuffer.isView=function(t){return null!=t&&null!=t.__proto__&&t.__proto__.__proto__===Int8Array.prototype.__proto__}),void 0===(i="function"==typeof(e=function(t){"use strict";var n,e,i,r,o,u,s,_,a,h,c,f,l,v,w,g,d,p,m,$,y,b,x=Math.imul,S=ArrayBuffer.isView;function M(){}function k(){}function E(t,n,e,i,r,o,u){return n=n===h?", ":n,e=e===h?"":e,i=i===h?"":i,r=r===h?-1:r,o=o===h?"...":o,u=u===h?null:u,function(t,n,e,i,r,o,u,s){e=e===h?", ":e,i=i===h?"":i,r=r===h?"":r,o=o===h?-1:o,u=u===h?"...":u,s=s===h?null:s,n.c(i);var _=0,a=0,c=t.length;t:for(;a<c;){var f=t[a];if(a=a+1|0,(_=_+1|0)>1&&n.c(e),!(o<0||_<=o))break t;En(n,f,s)}return o>=0&&_>o&&n.c(u),n.c(r),n}(t,dn(),n,e,i,r,o,u).toString()}function A(t,n,e,i,r,o,u){return n=n===h?", ":n,e=e===h?"":e,i=i===h?"":i,r=r===h?-1:r,o=o===h?"...":o,u=u===h?null:u,function(t,n,e,i,r,o,u,s){e=e===h?", ":e,i=i===h?"":i,r=r===h?"":r,o=o===h?-1:o,u=u===h?"...":u,s=s===h?null:s,n.c(i);var _=0,a=t.d();t:for(;a.e();){var c=a.f();if((_=_+1|0)>1&&n.c(e),!(o<0||_<=o))break t;En(n,c,s)}return o>=0&&_>o&&n.c(u),n.c(r),n}(t,dn(),n,e,i,r,o,u).toString()}function j(t,n){return t-n|0}function C(t){return String.fromCharCode(t)}function V(){}function L(){}function q(t,n){this.g_1=t,this.h_1=n}function O(t){var n=null==t?null:dt(t);return null==n?"null":n}function z(){n=this,this.k_1=new F(0,-2147483648),this.l_1=new F(-1,2147483647),this.m_1=8,this.n_1=64}function F(t,e){null==n&&new z,k.call(this),this.o_1=t,this.p_1=e}function I(){return st(),e}function B(){return st(),i}function R(){return st(),r}function N(){return st(),u}function U(){return st(),s}function T(t,n){if(st(),W(t,n))return 0;var e=G(t),i=G(n);return e&&!i?-1:!e&&i?1:G(K(t,n))?-1:1}function D(t){return st(),t.o_1}function P(t){return st(),4294967296*t.p_1+function(t){return st(),t.o_1>=0?t.o_1:4294967296+t.o_1}(t)}function Y(t,n){if(st(),H(t))return"0";if(G(t)){if(W(t,N())){var e=X(n),i=it(t,e),r=D(K(J(i,e),t));return Y(i,n)+r.toString(n)}return"-"+Y(Z(t),n)}for(var o=2===n?31:n<=10?9:n<=21?7:n<=35?6:5,u=Q(Math.pow(n,o)),s=t,_="";;){var a=it(s,u),h=D(K(s,J(a,u))).toString(n);if(H(s=a))return h+_;for(;h.length<o;)h="0"+h;_=h+_}}function W(t,n){return st(),t.p_1===n.p_1&&t.o_1===n.o_1}function X(t){return st(),new F(t,t<0?-1:0)}function G(t){return st(),t.p_1<0}function K(t,n){return st(),tt(t,Z(n))}function H(t){return st(),0===t.p_1&&0===t.o_1}function J(t,n){if(st(),H(t))return I();if(H(n))return I();if(W(t,N()))return nt(n)?N():I();if(W(n,N()))return nt(t)?N():I();if(G(t))return G(n)?J(Z(t),Z(n)):Z(J(Z(t),n));if(G(n))return Z(J(t,Z(n)));if(et(t,U())&&et(n,U()))return Q(P(t)*P(n));var e=t.p_1>>>16|0,i=65535&t.p_1,r=t.o_1>>>16|0,o=65535&t.o_1,u=n.p_1>>>16|0,s=65535&n.p_1,_=n.o_1>>>16|0,a=65535&n.o_1,h=0,c=0,f=0,l=0;return f=f+((l=l+x(o,a)|0)>>>16|0)|0,l&=65535,c=(c=c+((f=f+x(r,a)|0)>>>16|0)|0)+((f=(f&=65535)+x(o,_)|0)>>>16|0)|0,f&=65535,h=(h=(h=h+((c=c+x(i,a)|0)>>>16|0)|0)+((c=(c&=65535)+x(r,_)|0)>>>16|0)|0)+((c=(c&=65535)+x(o,s)|0)>>>16|0)|0,c&=65535,h=h+(((x(e,a)+x(i,_)|0)+x(r,s)|0)+x(o,u)|0)|0,new F(f<<16|l,(h&=65535)<<16|c)}function Z(t){return st(),tt(function(t){return st(),new F(~t.o_1,~t.p_1)}(t),new F(1,0))}function Q(t){if(st(),(n=t)!=n)return I();var n;if(t<=-0x8000000000000000)return N();if(t+1>=0x8000000000000000)return st(),o;if(t<0)return Z(Q(-t));var e=4294967296;return new F(t%e|0,t/e|0)}function tt(t,n){st();var e=t.p_1>>>16|0,i=65535&t.p_1,r=t.o_1>>>16|0,o=65535&t.o_1,u=n.p_1>>>16|0,s=65535&n.p_1,_=n.o_1>>>16|0,a=0,h=0,c=0,f=0;return a=(a=a+((h=(h=h+((c=(c=c+((f=f+(o+(65535&n.o_1)|0)|0)>>>16|0)|0)+(r+_|0)|0)>>>16|0)|0)+(i+s|0)|0)>>>16|0)|0)+(e+u|0)|0,new F((c&=65535)<<16|(f&=65535),(a&=65535)<<16|(h&=65535))}function nt(t){return st(),!(1&~t.o_1)}function et(t,n){return st(),T(t,n)<0}function it(t,n){if(st(),H(n))throw Qt("division by zero");if(H(t))return I();if(W(t,N())){if(W(n,B())||W(n,R()))return N();if(W(n,N()))return B();var e=function(t,n){st();var e=63&n;return 0===e?t:e<32?new F(t.o_1<<e,t.p_1<<e|t.o_1>>>(32-e|0)):new F(0,t.o_1<<(e-32|0))}(it(function(t,n){st();var e=63&n;return 0===e?t:e<32?new F(t.o_1>>>e|t.p_1<<(32-e|0),t.p_1>>e):new F(t.p_1>>(e-32|0),t.p_1>=0?0:-1)}(t,1),n),1);return W(e,I())?G(n)?B():R():tt(e,it(K(t,J(n,e)),n))}if(W(n,N()))return I();if(G(t))return G(n)?it(Z(t),Z(n)):Z(it(Z(t),n));if(G(n))return Z(it(t,Z(n)));for(var i=I(),r=t;ot(r,n);){for(var o=P(r)/P(n),u=Math.max(1,Math.floor(o)),s=Math.ceil(Math.log(u)/Math.LN2),_=s<=48?1:Math.pow(2,s-48),a=Q(u),h=J(a,n);G(h)||rt(h,r);)h=J(a=Q(u-=_),n);H(a)&&(a=B()),i=tt(i,a),r=K(r,h)}return i}function rt(t,n){return st(),T(t,n)>0}function ot(t,n){return st(),T(t,n)>=0}function ut(t){return st(),null!=t&&(n=t,st(),jt(n)&&"LongArray"===n.$type$);var n}function st(){_||(_=!0,e=X(0),i=X(1),r=X(-1),o=new F(-1,2147483647),u=new F(0,-2147483648),s=X(16777216),new wn(Array,"LongArray",ut))}function _t(t,n){return at(t)?ht(t,n):t.b(n)}function at(t){return"string"==typeof t}function ht(t,n){return t.charCodeAt(n)}function ct(t){return at(t)?t.length:t.a()}function ft(t){return dt(t)}function lt(t,n){var e;switch(typeof t){case"number":e="number"==typeof n?vt(t,n):n instanceof F?vt(t,P(n)):wt(t,n);break;case"string":case"boolean":case"bigint":e=wt(t,n);break;default:e=function(t,n){return t.j(n)}(t,n)}return e}function vt(t,n){var e;if(t<n)e=-1;else if(t>n)e=1;else if(t===n){var i;if(0!==t)i=0;else{var r=1/t;i=r===1/n?0:r<0?-1:1}e=i}else e=t!=t?n!=n?0:1:-1;return e}function wt(t,n){return t<n?-1:t>n?1:0}function gt(t){return t=t===h?null:t,Object.create(t)}function dt(t){return null==t?"null":function(t){return jt(t)||S(t)}(t)?"[...]":"function"!=typeof t.toString?function(t){return Object.prototype.toString.call(t)}(t):t.toString()}function pt(t,n){null!=Error.captureStackTrace?Error.captureStackTrace(t,n):t.stack=(new Error).stack}function mt(t){return t.prototype}function $t(t,n){var e;if(yt(t)){var i;if(yt(n))i=t;else{var r=null==n?null:n.toString();i=null==r?h:r}e=i}else e=null==t?h:t;return e}function yt(t){return t===h}function bt(t,n,e){xt(t,"message",$t(n,e)),xt(t,"cause",e),xt(t,"name",Object.getPrototypeOf(t).constructor.name)}function xt(t,n,e){Object.defineProperty(t,n,{configurable:!0,writable:!0,value:e})}function St(){throw ln()}function Mt(t,n,e,i,r,o,u,s){kt("class",t,n,e,i,r,o,u,s)}function kt(t,n,e,i,r,o,u,s,_){null!=r&&(n.prototype=Object.create(r.prototype),n.prototype.constructor=n);var c=function(t,n,e,i,r,o){return{kind:t,simpleName:n,associatedObjectKey:i,associatedObjects:r,suspendArity:o,$kClass$:h,defaultConstructor:e}}(t,e,i,s,_,u);n.$metadata$=c;var f=n.prototype;if(null!=o)for(var l=0,v=o.length;l<v;){var w=o[l];l=l+1|0,Object.assign(f,w.prototype),f[w.Symbol]=!0}"interface"===t&&(n.Symbol="#__interface_"+(a===h&&(a=0),a=a+1|0))}function Et(t,n,e,i,r,o,u,s){kt("object",t,n,e,i,r,o,u,s)}function At(t,n,e,i){Et(t,"Companion",h,n,e,i,h,h)}function jt(t){return Array.isArray(t)}function Ct(){}function Vt(t){return function(t){if(t.v())return[];for(var n=t.u(),e=Array(n),i=t.d(),r=0;i.e();){var o=r;r=o+1|0,e[o]=i.f()}return e}(t)}function Lt(t){return t<0&&function(){throw sn("Index overflow has happened.")}(),t}function qt(){xn.call(this)}function Ot(t){this.y_1=t,this.w_1=0,this.x_1=-1}function zt(t,n){this.g1_1=t,Ot.call(this,t),v.i1(n,this.g1_1.u()),this.w_1=n}function Ft(){qt.call(this),this.b1_1=0}function It(){f=this;var t=function(t,n){var e=[];if(Ut.call(n,e),!(t>=0))throw Wt(dt("Negative initial capacity: "+t));return n}(0,gt(mt(Ut)));t.p1_1=!0,this.q1_1=t}function Bt(){return null==f&&new It,f}function Rt(){return t=gt(mt(Ut)),Ut.call(t,[]),t;var t}function Nt(t,n){return v.r1(n,t.u()),n}function Ut(t){Bt(),Ft.call(this),this.o1_1=t,this.p1_1=!1}function Tt(){var t,n=(Gt(t=gt(mt(Dt))),Dt.call(t),t);return pt(n,Tt),n}function Dt(){pt(this,Dt)}function Pt(t){var n=function(t,n){return Kt(t,n),Yt.call(n),n}(t,gt(mt(Yt)));return pt(n,Pt),n}function Yt(){pt(this,Yt)}function Wt(t){var n=function(t,n){return Kt(t,n),Xt.call(n),n}(t,gt(mt(Xt)));return pt(n,Wt),n}function Xt(){pt(this,Xt)}function Gt(t){return Jt(t),Ht.call(t),t}function Kt(t,n){return Zt(t,n),Ht.call(n),n}function Ht(){pt(this,Ht)}function Jt(t){return bt(t),tn.call(t),t}function Zt(t,n){return bt(n,t),tn.call(n),n}function Qt(t){var n=Zt(t,gt(mt(tn)));return pt(n,Qt),n}function tn(){pt(this,tn)}function nn(){var t,n=(Gt(t=gt(mt(rn))),rn.call(t),t);return pt(n,nn),n}function en(t){var n=function(t,n){return Kt(t,n),rn.call(n),n}(t,gt(mt(rn)));return pt(n,en),n}function rn(){pt(this,rn)}function on(t){var n=function(t,n){return Kt(t,n),un.call(n),n}(t,gt(mt(un)));return pt(n,on),n}function un(){pt(this,un)}function sn(t){var n=function(t,n){return Kt(t,n),_n.call(n),n}(t,gt(mt(_n)));return pt(n,sn),n}function _n(){pt(this,_n)}function an(){var t,n=(Gt(t=gt(mt(hn))),hn.call(t),t);return pt(n,an),n}function hn(){pt(this,hn)}function cn(){var t,n=(Gt(t=gt(mt(fn))),fn.call(t),t);return pt(n,cn),n}function fn(){pt(this,fn)}function ln(){var t,n=(Gt(t=gt(mt(vn))),vn.call(t),t);return pt(n,ln),n}function vn(){pt(this,vn)}function wn(t,n,e){gn.call(this),this.w1_1=t,this.x1_1=n,this.y1_1=e}function gn(){}function dn(){return t=gt(mt(pn)),pn.call(t,""),t;var t}function pn(t){this.a2_1=t}function mn(t){var n=C(t).toUpperCase();return n.length>1?t:ht(n,0)}function $n(t){this.c2_1=t}function yn(t,n){return bn(),function(t,n,e){if(e=e!==h&&e,bn(),e){var i=t.length,r=n.length,o=Math.min(i,r);if(0===o)return i-r|0;var u=0;if(u<o)do{var s=u;u=u+1|0;var _=ht(t,s),a=ht(n,s);if(_!==a&&(_=mn(_))!==(a=mn(a))&&(_=ht(C(_).toLowerCase(),0))!==(a=ht(C(a).toLowerCase(),0)))return j(_,a)}while(u<o);return i-r|0}return lt(t,n)}(t,n,!0)}function bn(){l||(l=!0,new $n(yn))}function xn(){}function Sn(){this.h1_1=2147483639}function Mn(){}function kn(){g=this,this.e2_1=new F(-1478467534,-1720727600)}function En(t,n,e){var i;null!=e?t.c(e(n)):null==n||("string"==typeof(i=n)||!0===i[M.Symbol])?t.c(n):n instanceof V?t.b2(n.f2_1):t.c(dt(n))}function An(t,n,e){if(t===n)return!0;if(!(e=e!==h&&e))return!1;var i=mn(t),r=mn(n);return i===r||ht(C(i).toLowerCase(),0)===ht(C(r).toLowerCase(),0)}function jn(t){return ct(t)-1|0}return kt("interface",M,"CharSequence",d,p,m,$,y,b),Mt(k,"Number"),Mt(V,"Char"),At(L),Mt(q,"Enum"),At(z),Mt(F,"Long",h,k),Et(Ct,"Unit"),Mt(xn,"AbstractCollection"),Mt(qt,"AbstractMutableCollection",h,xn),Mt(Ot,"IteratorImpl"),Mt(zt,"ListIteratorImpl",h,Ot),Mt(Ft,"AbstractMutableList",h,qt),At(It),Mt(Ut,"ArrayList",Rt,Ft),Mt(tn,"Exception",function t(){var n=Jt(gt(mt(tn)));return pt(n,t),n},Error),Mt(Ht,"RuntimeException",function t(){var n=Gt(gt(mt(Ht)));return pt(n,t),n},tn),Mt(Dt,"UnsupportedOperationException",Tt,Ht),Mt(Yt,"IllegalStateException",function t(){var n,e=(Gt(n=gt(mt(Yt))),Yt.call(n),n);return pt(e,t),e},Ht),Mt(Xt,"IllegalArgumentException",function t(){var n,e=(Gt(n=gt(mt(Xt))),Xt.call(n),n);return pt(e,t),e},Ht),Mt(rn,"NoSuchElementException",nn,Ht),Mt(un,"IndexOutOfBoundsException",function t(){var n,e=(Gt(n=gt(mt(un))),un.call(n),n);return pt(e,t),e},Ht),Mt(_n,"ArithmeticException",function t(){var n,e=(Gt(n=gt(mt(_n))),_n.call(n),n);return pt(e,t),e},Ht),Mt(hn,"NoWhenBranchMatchedException",an,Ht),Mt(fn,"NullPointerException",cn,Ht),Mt(vn,"ClassCastException",ln,Ht),Mt(gn,"KClassImpl"),Mt(wn,"PrimitiveKClassImpl",h,gn),Mt(pn,"StringBuilder",dn,h,[M]),Mt($n,"sam$kotlin_Comparator$0"),At(Sn),Et(Mn,"EmptyIterator"),Et(kn,"EmptyList"),mt(q).i=function(t){return lt(this.h_1,t.h_1)},mt(q).j=function(t){return this.i(t instanceof q?t:St())},mt(q).equals=function(t){return this===t},mt(q).toString=function(){return this.g_1},mt(F).q=function(t){return T(this,t)},mt(F).j=function(t){return this.q(t instanceof F?t:St())},mt(F).toString=function(){return Y(this,10)},mt(F).valueOf=function(){return P(this)},mt(Ct).toString=function(){return"kotlin.Unit"},mt(qt).s=function(t){this.t();for(var n=!1,e=t.d();e.e();){var i=e.f();this.r(i)&&(n=!0)}return n},mt(qt).toJSON=function(){return this.toArray()},mt(qt).t=function(){},mt(Ot).e=function(){return this.w_1<this.y_1.u()},mt(Ot).f=function(){if(!this.e())throw nn();var t=this.w_1;return this.w_1=t+1|0,this.x_1=t,this.y_1.z(this.x_1)},mt(Ot).a1=function(){if(-1===this.x_1)throw Pt(dt("Call next() or previous() before removing element from the iterator."));this.y_1.c1(this.x_1),this.w_1=this.x_1,this.x_1=-1},mt(Ft).r=function(t){return this.t(),this.j1(this.u(),t),!0},mt(Ft).k1=function(){this.t(),this.l1(0,this.u())},mt(Ft).d=function(){return new Ot(this)},mt(Ft).m1=function(t){return new zt(this,t)},mt(Ft).l1=function(t,n){var e=this.m1(t),i=n-t|0,r=0;if(r<i)do{r=r+1|0,e.f(),e.a1()}while(r<i)},mt(Ut).s1=function(){return this.t(),this.p1_1=!0,this.u()>0?this:Bt().q1_1},mt(Ut).u=function(){return this.o1_1.length},mt(Ut).z=function(t){return this.o1_1[Nt(this,t)]},mt(Ut).r=function(t){return this.t(),this.o1_1.push(t),this.b1_1=this.b1_1+1|0,!0},mt(Ut).j1=function(t,n){this.t(),this.o1_1.splice(function(t,n){return v.i1(n,t.u()),n}(this,t),0,n),this.b1_1=this.b1_1+1|0},mt(Ut).s=function(t){if(this.t(),t.v())return!1;for(var n=(s=this,_=t.u(),a=void 0,a=s.u(),s.o1_1.length=s.u()+_|0,a),e=0,i=t.d();i.e();){var r=i.f(),o=e;e=o+1|0;var u=Lt(o);this.o1_1[n+u|0]=r}var s,_,a;return this.b1_1=this.b1_1+1|0,!0},mt(Ut).c1=function(t){return this.t(),Nt(this,t),this.b1_1=this.b1_1+1|0,t===(this.u()-1|0)?this.o1_1.pop():this.o1_1.splice(t,1)[0]},mt(Ut).l1=function(t,n){this.t(),this.b1_1=this.b1_1+1|0,this.o1_1.splice(t,n-t|0)},mt(Ut).k1=function(){this.t(),this.o1_1=[],this.b1_1=this.b1_1+1|0},mt(Ut).toString=function(){return E(this.o1_1,", ","[","]",h,h,ft)},mt(Ut).t1=function(){return[].slice.call(this.o1_1)},mt(Ut).toArray=function(){return this.t1()},mt(Ut).t=function(){if(this.p1_1)throw Tt()},mt(wn).z1=function(){return this.x1_1},mt(gn).toString=function(){return"class "+this.z1()},mt(pn).a=function(){return this.a2_1.length},mt(pn).b=function(t){var n=this.a2_1;if(!(0<=t&&t<=(ct(n)-1|0)))throw on("index: "+t+", length: "+this.a()+"}");return _t(n,t)},mt(pn).b2=function(t){return this.a2_1=this.a2_1+C(t),this},mt(pn).c=function(t){return this.a2_1=this.a2_1+O(t),this},mt(pn).toString=function(){return this.a2_1},mt($n).d2=function(t,n){return this.c2_1(t,n)},mt($n).compare=function(t,n){return this.d2(t,n)},mt(xn).v=function(){return 0===this.u()},mt(xn).toString=function(){return A(this,", ","[","]",h,h,(t=this,function(n){return n===t?"(this Collection)":O(n)}));var t},mt(xn).toArray=function(){return Vt(this)},mt(Sn).r1=function(t,n){if(t<0||t>=n)throw on("index: "+t+", size: "+n)},mt(Sn).i1=function(t,n){if(t<0||t>n)throw on("index: "+t+", size: "+n)},mt(Mn).e=function(){return!1},mt(Mn).f=function(){throw nn()},mt(kn).toString=function(){return"[]"},mt(kn).u=function(){return 0},mt(kn).v=function(){return!0},mt(kn).z=function(t){throw on("Empty list doesn't contain element at index "+t+".")},mt(kn).d=function(){return w},new L,c=new Ct,v=new Sn,w=new Mn,t.$_$=t.$_$||{},t.$_$.a=h,t.$_$.b=c,t.$_$.c=Rt,t.$_$.d=function(t){return t},t.$_$.e=function(t){return t},t.$_$.f=function(t){return t.length>0?new Ut(t):(null==g&&new kn,g)},t.$_$.g=ht,t.$_$.h=ct,t.$_$.i=Mt,t.$_$.j=At,t.$_$.k=Et,t.$_$.l=function(t){return"number"==typeof t||t instanceof F},t.$_$.m=function(t,n){var e=new Error;return e.message=$t(t,n),e.cause=n,e.name="Throwable",e},t.$_$.n=function(t){return Number(t)},t.$_$.o=gt,t.$_$.p=mt,t.$_$.q=function(t){return t<<24>>24},t.$_$.r=function(t){return t<<16>>16},t.$_$.s=dt,t.$_$.t=function(t,n,e){e=e===h?t:e;var i=function(t,n,e,i){var r;if(e=e===h?jn(t):e,(i=i!==h&&i)||"string"!=typeof t)r=function(t,n,e,i){if(e=e===h?jn(t):e,!(i=i!==h&&i)&&1===n.length&&"string"==typeof t){var r=C(function(t){var n;switch(t.length){case 0:throw en("Array is empty.");case 1:n=t[0];break;default:throw Wt("Array has more than one element.")}return n}(n));return t.lastIndexOf(r,e)}var o=function(t,n){return t>n?n:t}(e,jn(t));if(0<=o)do{var u=o;o=o+-1|0;var s,_=_t(t,u);t:{for(var a=0,c=n.length;a<c;){var f=n[a];if(a=a+1|0,An(f,_,i)){s=!0;break t}}s=!1}if(s)return u}while(0<=o);return-1}(t,(u=[n],s=new Uint16Array(u),s.$type$="CharArray",s),e,i);else{var o=C(n);r=t.lastIndexOf(o,e)}var u,s;return r}(t,n);return-1===i?e:function(t,n,e){return bn(),t.substring(n,e)}(t,0,i)},t.$_$.u=q,t.$_$.v=St,t.$_$.w=function(t){var n;return null==t?function(){throw cn()}():n=t,n},t.$_$.x=function(){throw an()},t.$_$.y=O,t})?e.apply(n,[n]):e)||(t.exports=i)},580(t,n,e){var i,r,o;r=[n,e(36)],void 0===(o="function"==typeof(i=function(t,n){"use strict";var e=n.$_$.p,i=n.$_$.o,r=n.$_$.a,o=n.$_$.i;function u(t,n,e){t=t===r?0:t,n=n===r?0:n,e=e===r?0:e,this.g2_1=t,this.h2_1=n,this.i2_1=e}function s(t,n){t=t===r?0:t,n=n===r?0:n,this.j2_1=t,this.k2_1=n}return o(u,"Float3",u),o(s,"Float2",s),e(u).toString=function(){return"Float3(x="+this.g2_1+", y="+this.h2_1+", z="+this.i2_1+")"},e(s).toString=function(){return"Float2(x="+this.j2_1+", y="+this.k2_1+")"},t.$_$=t.$_$||{},t.$_$.a=s,t.$_$.b=u,t.$_$.c=function(t){var n=t.g2_1*t.g2_1+t.h2_1*t.h2_1+t.i2_1*t.i2_1,e=1/Math.sqrt(n);return new u(t.g2_1*e,t.h2_1*e,t.i2_1*e)},t.$_$.d=function(t){return function(t,n){return s.call(n,t,t),n}(t,i(e(s)))},t.$_$.e=function(t){return function(t,n){return u.call(n,t,t,t),n}(t,i(e(u)))},t})?i.apply(n,r):i)||(t.exports=o)},607(t,n,e){var i,r,o;r=[n,e(650),e(580),e(883),e(36)],void 0===(o="function"==typeof(i=function(t,n,e,i,r){"use strict";var o,u,s,_,a=Math.imul,h=n.Entity,c=n.init,f=n.LightManager,l=e.$_$.b,v=i.$_$.a,w=i.$_$.d,g=i.$_$.b,d=e.$_$.a,p=i.$_$.c,m=r.$_$.x,$=r.$_$.b,y=r.$_$.h,b=r.$_$.g,x=r.$_$.e,S=r.$_$.q,M=r.$_$.r,k=r.$_$.p,E=r.$_$.k,A=r.$_$.a,j=r.$_$.m,C=r.$_$.v,V=r.$_$.l,L=r.$_$.n,q=r.$_$.i,O=r.$_$.j,z=r.$_$.c,F=r.$_$.d,I=r.$_$.t,B=r.$_$.w,R=r.$_$.u;function N(){}function U(){var t,n={version:"3.6.0"};n.createViewer=((t=function(t){return T(t,!0,!0)}).callableName="jsCreateViewer",t),n.createViewerAutoRotate=function(){var t=function(t,n){return T(t,n,!0)};return t.callableName="jsCreateViewerAutoRotate",t}(),n.createViewerFull=function(){var t=function(t,n,e,i,r,o,u,s){return T(t,n,e,i,r,o,u,s)};return t.callableName="jsCreateViewerFull",t}(),n.modelViewer=function(){var t=function(t,n){return e=n,T(t,!0,!0).then((i=e,function(t){return t.loadModel(i),t}));var e,i};return t.callableName="jsModelViewer",t}(),n.modelViewerAutoRotate=function(){var t=function(t,n,e){return i=n,T(t,e,!0).then((r=i,function(t){return t.loadModel(r),t}));var i,r};return t.callableName="jsModelViewerAutoRotate",t}(),window.sceneview=n,console.log("SceneView Web v3.6.0 loaded")}function T(t,n,e,i,r,o,s,_){i=i===A?0:i,r=r===A?1.5:r,o=o===A?5:o,s=s===A?45:s,_=_===A?5e4:_;var a=document.getElementById(t),h=a instanceof HTMLCanvasElement?a:null;if(null==h)return Promise.reject(j("Canvas element '"+t+"' not found"));var c,f,l,v,w,g,d,p,m=h;return 0!==m.width&&0!==m.height||(m.width=m.clientWidth,m.height=m.clientHeight),new Promise((c=m,f=n,l=e,v=i,w=r,g=o,d=s,p=_,function(t,n){try{var e=u,i=function(t,n,e,i,r,o,u){return function(s){return s.d5(function(t,n,e,i){return function(r){return r.c4(t,n,e),r.d4(0,0,0),r.e4(i),$}}(e,i,r,o)),s.e5(function(t){return function(n){return n.q4(),n.r4(t),n.s4(.6,-1,-.8),$}}(u)),s.f5(t),s.g5(n),$}}(f,l,v,w,g,d,p);e.d6(c,A,i,function(t,n){return function(e){e.x5(),window.addEventListener("resize",function(t){return function(n){return t.width=t.clientWidth,t.height=t.clientHeight,$}}(n));var i=new it;return i.a6(e),t(i),$}}(t,c))}catch(t){if(!(t instanceof Error))throw t;n(t)}return $}))}function D(t){var n;t.e6_1.addEventListener("mousedown",(n=t,function(t){var e=t instanceof MouseEvent?t:C(),i=e.button;return 0===i?n.z6_1=!0:2===i&&(n.a7_1=!0),n.b7_1=e.clientX,n.c7_1=e.clientY,e.preventDefault(),$})),t.e6_1.addEventListener("mousemove",function(t){return function(n){var e=n instanceof MouseEvent?n:C(),i=e.clientX-t.b7_1,r=e.clientY-t.c7_1;return t.b7_1=e.clientX,t.c7_1=e.clientY,t.z6_1?t.v6_1?(t.x6_1=-i*t.q6_1,t.y6_1=-r*t.q6_1):(t.g6_1=t.g6_1-i*t.q6_1,t.h6_1=t.h6_1-r*t.q6_1):t.a7_1&&(t.j6_1=t.j6_1+i*t.s6_1*t.i6_1,t.k6_1=t.k6_1-r*t.s6_1*t.i6_1),$}}(t)),t.e6_1.addEventListener("mouseup",function(t){return function(n){return t.z6_1=!1,t.a7_1=!1,$}}(t)),t.e6_1.addEventListener("mouseleave",function(t){return function(n){return t.z6_1=!1,t.a7_1=!1,$}}(t)),t.e6_1.addEventListener("wheel",function(t){return function(n){var e=n instanceof WheelEvent?n:C(),i=e.deltaY>0?1:-1;t.i6_1=t.i6_1*(1+i*t.r6_1);var r=t,o=t.m6_1,u=t.n6_1,s=t.i6_1,_=Math.min(u,s);return r.i6_1=Math.max(o,_),e.preventDefault(),$}}(t),{passive:!1}),t.e6_1.addEventListener("contextmenu",P),t.e6_1.addEventListener("touchstart",function(t){return function(n){var e=n;if(1==e.touches.length){t.z6_1=!0;var i=t,r=e.touches[0].clientX;i.b7_1=L(V(r)?r:C());var o=t,u=e.touches[0].clientY;o.c7_1=L(V(u)?u:C())}return n.preventDefault(),$}}(t),{passive:!1}),t.e6_1.addEventListener("touchmove",function(t){return function(n){var e=n;if(t.z6_1&&1==e.touches.length){var i=e.touches[0].clientX,r=L(V(i)?i:C())-t.b7_1,o=e.touches[0].clientY,u=L(V(o)?o:C())-t.c7_1,s=t,_=e.touches[0].clientX;s.b7_1=L(V(_)?_:C());var a=t,h=e.touches[0].clientY;a.c7_1=L(V(h)?h:C()),t.v6_1?(t.x6_1=-r*t.q6_1,t.y6_1=-u*t.q6_1):(t.g6_1=t.g6_1-r*t.q6_1,t.h6_1=t.h6_1-u*t.q6_1)}else if(2==e.touches.length){var c=e.touches[0].clientX,f=L(V(c)?c:C()),l=e.touches[1].clientX,v=f-L(V(l)?l:C()),w=e.touches[0].clientY,g=L(V(w)?w:C()),d=e.touches[1].clientY,p=g-L(V(d)?d:C()),m=v*v+p*p,y=Math.sqrt(m);if(t.d7_1>0){var b=t.d7_1-y;t.i6_1=t.i6_1*(1+.005*b);var x=t,S=t.m6_1,M=t.n6_1,k=t.i6_1,E=Math.min(M,k);x.i6_1=Math.max(S,E)}t.d7_1=y}return n.preventDefault(),$}}(t),{passive:!1}),t.e6_1.addEventListener("touchend",function(t){return function(n){return t.z6_1=!1,t.d7_1=-1,$}}(t))}function P(t){return t.preventDefault(),$}function Y(t,n){this.e6_1=t,this.f6_1=n,this.g6_1=.7853981633974483,this.h6_1=1.2217304763960306,this.i6_1=5,this.j6_1=0,this.k6_1=0,this.l6_1=0,this.m6_1=.5,this.n6_1=50,this.o6_1=.1,this.p6_1=3.041592653589793,this.q6_1=.005,this.r6_1=.1,this.s6_1=.003,this.t6_1=!1,this.u6_1=.008726646259971648,this.v6_1=!0,this.w6_1=.95,this.x6_1=0,this.y6_1=0,this.z6_1=!1,this.a7_1=!1,this.b7_1=0,this.c7_1=0,D(this),this.d7_1=-1}function W(t){return $}function X(t,n,e){e=e===A?0:e,this.h7_1=t,this.i7_1=n,this.j7_1=e}function G(){this.b6_1="https://sceneview.github.io/assets/environments/neutral_ibl.ktx",this.c6_1="https://sceneview.github.io/assets/environments/neutral_skybox.ktx"}function K(t,n){if(!t.q5_1)return $;if(t.w5_1){var e=t.h5_1.clientWidth,i=t.h5_1.clientHeight;e>0&&i>0&&(e!==t.h5_1.width||i!==t.h5_1.height)&&t.l7(e,i)}var r=t.v5_1;null==r||r.e7();var o=t.r5_1>0?(n-t.r5_1)/1e3:0;t.r5_1=n;for(var u=t.s5_1.d();u.e();){var s=u.f(),_=s.i7_1;if(null==_);else if(_.getAnimationCount()>0){s.j7_1=s.j7_1+o;var a=_.getAnimationDuration(0);a>0&&(s.j7_1=s.j7_1%a),_.applyAnimation(0),_.updateBoneMatrices()}}t.i5_1.execute(),t.j5_1.beginFrame(t.n5_1)&&(t.j5_1.renderView(t.l5_1),t.j5_1.endFrame());var h,c,f=window;t.p5_1=f.requestAnimationFrame((h=t,(c=function(t){return K(h,t),$}).callableName="renderLoop",c))}function H(t){return t.arrayBuffer()}function J(t,n,e,i,r){return function(o){var u=t.createAsset(o);if(null!=u){var s,_=u.getEntities();n.k5_1.addEntities(_);try{s=u.getInstance().getAnimator()}catch(t){if(!(t instanceof Error))throw t;s=null}var a=new X(u,s);n.s5_1.r(a),u.loadResources(function(t,n,e,i){return function(){return t.releaseSourceData(),console.log("SceneView: Model loaded from "+n+" ("+e.length+" entities)"),null==i||i(t),$}}(u,i,_,r),null,e,null)}else console.error("SceneView: AssetLoader failed to parse model from "+i);return $}}function Z(t){return t.arrayBuffer()}function Q(t){return t.arrayBuffer()}function tt(t,n,e,i,r,o,u,s){this.h5_1=t,this.i5_1=n,this.j5_1=e,this.k5_1=i,this.l5_1=r,this.m5_1=o,this.n5_1=u,this.o5_1=s,this.p5_1=null,this.q5_1=!1,this.r5_1=0,this.s5_1=z(),this.t5_1=null,this.u5_1=z(),this.v5_1=null,this.w5_1=!0}function nt(t){this.t4_1=t,this.u4_1=null,this.v4_1=null,this.w4_1=z(),this.x4_1=z(),this.y4_1=null,this.z4_1=null,this.a5_1=!0,this.b5_1=!1,this.c5_1=!0}function et(t,n){return function(e,i){try{t.o7(n,function(t,n){return function(e){return t(n),$}}(e,n))}catch(t){if(!(t instanceof Error))throw t;i(t)}return $}}function it(){this.y5_1=null,this.z5_1=!1}function rt(t,n,e){var i=[];return i.push(t,n,e),i}function ot(t,n,e,i){var r=[];return r.push(t,n,e,i),r}function ut(){this.l3_1=0,this.m3_1=1.5,this.n3_1=5,this.o3_1=0,this.p3_1=0,this.q3_1=0,this.r3_1=0,this.s3_1=1,this.t3_1=0,this.u3_1=45,this.v3_1=.1,this.w3_1=1e3,this.x3_1=16,this.y3_1=.008,this.z3_1=100,this.a4_1=1.1,this.b4_1=!0}function st(){this.f4_1=at(),this.g4_1=1e5,this.h4_1=1,this.i4_1=1,this.j4_1=1,this.k4_1=0,this.l4_1=-1,this.m4_1=-.5,this.n4_1=0,this.o4_1=3,this.p4_1=0}function _t(t,n){R.call(this,t,n)}function at(){return function(){if(_)return $;_=!0,s=new _t("DIRECTIONAL",0),new _t("POINT",1),new _t("SPOT",2)}(),s}return E(N,"GeometryGLBBuilder"),q(Y,"OrbitCameraController"),q(X,"LoadedModel"),O(G),q(tt,"SceneView"),q(nt,"SceneViewBuilder"),q(it,"SceneViewJS",it),q(ut,"CameraConfig",ut),q(st,"LightConfig",st),q(_t,"LightType",A,R),k(N).k3=function(t){var n=function(t,n){var e;switch(n.r2_1.h_1){case 0:e=v(new l(n.s2_1,n.t2_1,n.u2_1));break;case 1:e=w(n.v2_1);break;case 2:e=g(n.v2_1,n.w2_1);break;case 3:e=p(new d(n.s2_1,n.t2_1));break;default:m()}return e}(0,t),e=n.l2_1,i=n.m2_1,r=e.u(),o=i.u(),u=new Float32Array(a(r,3)),s=new Float32Array(a(r,3)),_=34028235e31,h=34028235e31,c=34028235e31,f=-34028235e31,$=-34028235e31,k=-34028235e31,E=0,A=e.u()-1|0;if(E<=A)do{var j=E;E=E+1|0;var C=e.z(j),V=C.n2_1.g2_1,L=C.n2_1.h2_1,q=C.n2_1.i2_1;u[a(j,3)]=V,u[a(j,3)+1|0]=L,u[a(j,3)+2|0]=q;var O=C.o2_1,z=null==O?new l(0,1,0):O;s[a(j,3)]=z.g2_1,s[a(j,3)+1|0]=z.h2_1,s[a(j,3)+2|0]=z.i2_1,V<_&&(_=V),L<h&&(h=L),q<c&&(c=q),V>f&&(f=V),L>$&&($=L),q>k&&(k=q)}while(E<=A);var F=new Uint16Array(o),I=0,B=i.u()-1|0;if(I<=B)do{var R=I;I=I+1|0,F[R]=M(i.z(R))}while(I<=B);return function(t,n,e,i,r,o,u,s,_){var h=a(a(o,3),4),c=a(a(o,3),4),f=a(u,2),l=n.r2_1.g_1.toLowerCase(),v={mesh:0};if(v.name=l,0===n.b3_1&&0===n.c3_1&&0===n.d3_1||(v.translation=[],v.translation.push(n.b3_1,n.c3_1,n.d3_1)),1===n.h3_1&&1===n.i3_1&&1===n.j3_1||(v.scale=[],v.scale.push(n.h3_1,n.i3_1,n.j3_1)),0!==n.e3_1||0!==n.f3_1||0!==n.g3_1){var w=3.141592653589793*n.e3_1/180,g=3.141592653589793*n.f3_1/180,d=3.141592653589793*n.g3_1/180,p=w/2,m=Math.cos(p),$=w/2,M=Math.sin($),k=g/2,E=Math.cos(k),A=g/2,j=Math.sin(A),C=d/2,V=Math.cos(C),L=d/2,q=Math.sin(L),O=M*E*V-m*j*q,z=m*j*V+M*E*q,F=m*E*q-M*j*V,I=m*E*V+M*j*q;v.rotation=[],v.rotation.push(O,z,F,I)}var B={asset:{version:"2.0",generator:"SceneView-Web"},scene:0,scenes:[{nodes:[0]}],nodes:[]};B.nodes.push(v),B.meshes=[{primitives:[{attributes:{POSITION:0,NORMAL:1},indices:2,material:0,mode:4}]}];var R={};R.name=l+"_mat",R.pbrMetallicRoughness={},R.pbrMetallicRoughness.baseColorFactor=[],R.pbrMetallicRoughness.baseColorFactor.push(n.x2_1,n.y2_1,n.z2_1,n.a3_1),R.pbrMetallicRoughness.metallicFactor=.1,R.pbrMetallicRoughness.roughnessFactor=.6,R.doubleSided=!1,B.materials=[],B.materials.push(R);var N={bufferView:0,componentType:5126};N.count=o,N.type="VEC3",N.min=[],N.min.push(s[0],s[1],s[2]),N.max=[],N.max.push(_[0],_[1],_[2]);var U={bufferView:1,componentType:5126};U.count=o,U.type="VEC3";var T={bufferView:2,componentType:5123};T.count=u,T.type="SCALAR",B.accessors=[],B.accessors.push(N,U,T);var D={buffer:0,byteOffset:0};D.byteLength=h,D.target=34962;var P={buffer:0};P.byteOffset=h,P.byteLength=c,P.target=34962;var Y={buffer:0};Y.byteOffset=h+c|0,Y.byteLength=f,Y.target=34963,B.bufferViews=[],B.bufferViews.push(D,P,Y);var W=(h+c|0)+f|0,X=(4-(W%4|0)|0)%4|0,G=W+X|0;B.buffers=[];var K={};K.byteLength=W,B.buffers.push(K);for(var H=JSON.stringify(B);H.length%4|0;)H+=" ";var J=H.length,Z=(8+(20+J|0)|0)+G|0,Q=new ArrayBuffer(Z),tt=new DataView(Q),nt=0;tt.setUint32(nt,1179937895,!0),nt=nt+4|0,tt.setUint32(nt,2,!0),nt=nt+4|0,tt.setUint32(nt,Z,!0),nt=nt+4|0,tt.setUint32(nt,J,!0),nt=nt+4|0,tt.setUint32(nt,1313821514,!0),nt=nt+4|0;var et=0,it=y(H)-1|0;if(et<=it)do{var rt=et;et=et+1|0;var ot=nt;nt=ot+1|0;var ut=b(H,rt),st=x(ut);tt.setUint8(ot,S(st))}while(et<=it);tt.setUint32(nt,G,!0),nt=nt+4|0,tt.setUint32(nt,5130562,!0),nt=nt+4|0;var _t=new Uint8Array(Q),at=new Uint8Array(e.buffer),ht=0;if(ht<h)do{var ct=ht;ht=ht+1|0,_t[nt+ct|0]=at[ct]}while(ht<h);nt=nt+h|0;var ft=new Uint8Array(i.buffer),lt=0;if(lt<c)do{var vt=lt;lt=lt+1|0,_t[nt+vt|0]=ft[vt]}while(lt<c);nt=nt+c|0;var wt=new Uint8Array(r.buffer),gt=0;if(gt<f)do{var dt=gt;gt=gt+1|0,_t[nt+dt|0]=wt[dt]}while(gt<f);nt=nt+f|0;var pt=0;if(pt<X)do{pt=pt+1|0;var mt=nt;nt=mt+1|0,tt.setUint8(mt,0)}while(pt<X);return Q}(0,t,u,s,F,r,o,new Float32Array([_,h,c]),new Float32Array([f,$,k]))},k(Y).d4=function(t,n,e){this.j6_1=t,this.k6_1=n,this.l6_1=e},k(Y).e7=function(){this.t6_1&&!this.z6_1&&(this.g6_1=this.g6_1+this.u6_1),this.v6_1&&(this.g6_1=this.g6_1+this.x6_1,this.h6_1=this.h6_1+this.y6_1,this.x6_1=this.x6_1*this.w6_1,this.y6_1=this.y6_1*this.w6_1);var t=this.o6_1,n=this.p6_1,e=this.h6_1,i=Math.min(n,e);this.h6_1=Math.max(t,i);var r=this.m6_1,o=this.n6_1,u=this.i6_1,s=Math.min(o,u);this.i6_1=Math.max(r,s);var _=this.j6_1,a=this.i6_1,h=this.h6_1,c=a*Math.sin(h),f=this.g6_1,l=_+c*Math.sin(f),v=this.k6_1,w=this.i6_1,g=this.h6_1,d=v+w*Math.cos(g),p=this.l6_1,m=this.i6_1,$=this.h6_1,y=m*Math.sin($),b=this.g6_1,x=p+y*Math.cos(b);this.f6_1.lookAt(rt(l,d,x),rt(this.j6_1,this.k6_1,this.l6_1),rt(0,1,0))},k(Y).f7=function(){},k(G).k7=function(t,n,e,i){var r,o,u;c(n,(r=t,o=e,u=i,function(){try{var t=Filament.Engine.create(r),n=t.createRenderer(),e=t.createScene(),i=t.createSwapChain(),s=t.createView(),_=Filament.EntityManager.get().create(),a=_ instanceof h?_:C(),c=t.createCamera(a);s.setCamera(c),s.setScene(e);var f=r.width,l=r.height;s.setViewport(ot(0,0,f,l));var v=l>0?f/l:1;c.setProjectionFov(45,v,.1,1e3),c.lookAt(rt(0,1.5,5),rt(0,0,0),rt(0,1,0)),c.setExposureDirect(1.1),n.setClearOptions({clearColor:[.05,.05,.07,1],clear:!0}),s.setAmbientOcclusionOptions({enabled:!0,radius:.3,bias:5e-4,intensity:1,quality:1}),s.setBloomOptions({enabled:!0,strength:.1,threshold:!0,levels:4}),s.setTemporalAntiAliasingOptions({enabled:!0});var w=new tt(r,t,n,e,s,c,i,a),g=new nt(w);o(g),g.g7(),u(w)}catch(t){if(!(t instanceof Error))throw t;var d=t;console.error("SceneView: Failed to initialize Filament engine",d)}return $}))},k(G).d6=function(t,n,e,i,r){var o;return n=n===A?[]:n,e=e===A?W:e,r===A?(this.k7(t,n,e,i),o=$):o=r.k7.call(this,t,n,e,i),o},k(tt).m7=function(t,n,e,i,r){var o=new Y(this.h5_1,this.m5_1);o.i6_1=t,o.d4(n,e,i),o.t6_1=r;var u=o;return this.v5_1=u,u},k(tt).l7=function(t,n){if(t<=0||n<=0)return $;this.h5_1.width=t,this.h5_1.height=n,this.l5_1.setViewport(ot(0,0,t,n)),this.m5_1.setProjectionFov(45,t/n,.1,1e3)},k(tt).x5=function(){if(this.q5_1)return $;this.q5_1=!0,this.r5_1=0,K(this,0)},k(tt).n7=function(){this.q5_1=!1;var t=this.p5_1;null==t||window.cancelAnimationFrame(t),this.p5_1=null},k(tt).o7=function(t,n){var e,i=this.t5_1;if(null==i){var r=this.i5_1.createAssetLoader();this.t5_1=r,e=r}else e=i;var o,u=e,s=I(t,F(47))+"/",_=window.fetch(t).then(H),a=J(u,this,s,t,n);_.then(a).catch((o=t,function(t){return console.error("SceneView: Error fetching model from "+o,t),$}))},k(tt).p7=function(){this.q7("https://sceneview.github.io/assets/environments/neutral_ibl.ktx")},k(tt).r7=function(t,n){var e,i,r,o=window.fetch(t).then(Z),u=(e=this,i=t,function(t){var n=e.i5_1.createIblFromKtx1(t);return e.k5_1.setIndirectLight(n),console.log("SceneView: IBL loaded from "+i),$});if(o.then(u).catch(function(t){return function(n){return console.error("SceneView: Error loading IBL from "+t,n),$}}(t)),null==n);else{var s=window.fetch(n).then(Q),_=function(t,n){return function(e){var i=t.i5_1.createSkyFromKtx1(e);return t.k5_1.setSkybox(i),console.log("SceneView: Skybox loaded from "+n),$}}(this,n);s.then(_).catch((r=n,function(t){return console.error("SceneView: Error loading skybox from "+r,t),$}))}},k(tt).q7=function(t,n,e){var i;return n=n===A?null:n,e===A?(this.r7(t,n),i=$):i=e.r7.call(this,t,n),i},k(tt).s7=function(t){var n,e=Filament.EntityManager.get().create(),i=e instanceof h?e:C();switch(t.f4_1.h_1){case 0:n=1;break;case 1:n=2;break;case 2:n=4;break;default:m()}var r=n,o=f.Builder(r);o.intensity(t.g4_1),o.color(rt(t.h4_1,t.i4_1,t.j4_1)),o.castShadows(!0),t.f4_1.equals(at())?o.direction(rt(t.k4_1,t.l4_1,t.m4_1)):(o.position(rt(t.n4_1,t.o4_1,t.p4_1)),o.falloff(10)),o.build(this.i5_1,i),this.k5_1.addEntity(i),this.u5_1.r(i)},k(tt).t7=function(t){var n,e=o.k3(t),i=this.t5_1;if(null==i){var r=this.i5_1.createAssetLoader();this.t5_1=r,n=r}else n=i;var u,s=n;try{var _=s.createAsset(e);if(null!=_){var a,h=_.getEntities();this.k5_1.addEntities(h);try{a=_.getInstance().getAnimator()}catch(t){if(!(t instanceof Error))throw t;a=null}var c=a;this.s5_1.r(new X(_,c)),_.loadResources((u=_,function(){return u.releaseSourceData(),$}),null,"",null);var f=console,l=t.r2_1.g_1.toLowerCase();f.log("SceneView: Geometry '"+l+"' added")}else console.error("SceneView: Failed to create geometry asset for "+t.r2_1.toString())}catch(n){if(!(n instanceof Error))throw n;var v=n;console.error("SceneView: Error creating geometry "+t.r2_1.toString(),v)}},k(tt).u7=function(){if(this.s5_1.v())return $;var t=this.v5_1;if(null==t)return $;for(var n=t,e=17976931348623157e292,i=17976931348623157e292,r=17976931348623157e292,o=-17976931348623157e292,u=-17976931348623157e292,s=-17976931348623157e292,_=this.s5_1.d();_.e();){var a=_.f().h7_1.getBoundingBox(),h=a.min,c=a.max,f=h[0];if(L(V(f)?f:C())<e){var l=h[0];e=L(V(l)?l:C())}var v=h[1];if(L(V(v)?v:C())<i){var w=h[1];i=L(V(w)?w:C())}var g=h[2];if(L(V(g)?g:C())<r){var d=h[2];r=L(V(d)?d:C())}var p=c[0];if(L(V(p)?p:C())>o){var m=c[0];o=L(V(m)?m:C())}var y=c[1];if(L(V(y)?y:C())>u){var b=c[1];u=L(V(b)?b:C())}var x=c[2];if(L(V(x)?x:C())>s){var S=c[2];s=L(V(S)?S:C())}}var M=(e+o)/2,k=(i+u)/2,E=(r+s)/2,A=o-e,j=u-i,q=s-r,O=A*A+j*j+q*q,z=Math.sqrt(O)/2;n.d4(M,k,E),n.i6_1=2.5*z,n.m6_1=.5*z,n.n6_1=10*z},k(tt).v7=function(){this.n7();var t=this.v5_1;null==t||t.f7();var n=this.t5_1;if(null==n);else{for(var e=this.s5_1.d();e.e();){var i=e.f();n.destroyAsset(i.h7_1)}n.delete()}this.s5_1.k1();for(var r=this.u5_1.d();r.e();){var o=r.f();this.i5_1.destroyEntity(o)}this.u5_1.k1(),this.i5_1.destroyRenderer(this.j5_1),this.i5_1.destroyView(this.l5_1),this.i5_1.destroyScene(this.k5_1),this.i5_1.destroyCameraComponent(this.o5_1),this.i5_1.destroySwapChain(this.n5_1),Filament.Engine.destroy(this.i5_1)},k(nt).d5=function(t){var n=new ut;t(n),this.u4_1=n},k(nt).e5=function(t){var n=new st;t(n),this.v4_1=n},k(nt).g5=function(t){this.a5_1=t},k(nt).f5=function(t){this.b5_1=t},k(nt).g7=function(){var t=this.u4_1;if(null==t||t.w7(this.t4_1.m5_1),null!=this.v4_1)this.t4_1.s7(B(this.v4_1));else{var n=new st;n.q4(),n.r4(5e4),n.s4(.6,-1,-.8);var e=n;this.t4_1.s7(e);var i=new st;i.q4(),i.r4(25e3),i.s4(-.6,-.5,.8);var r=i;this.t4_1.s7(r);var o=new st;o.q4(),o.r4(3e4),o.x7(.85,.9,1),o.s4(0,-.3,1);var u=o;this.t4_1.s7(u)}null!=this.y4_1?this.t4_1.r7(B(this.y4_1),this.z4_1):this.c5_1&&this.t4_1.p7();for(var s=this.w4_1.d();s.e();){var _=s.f();this.t4_1.o7(_.y7_1,_.z7_1)}for(var a=this.x4_1.d();a.e();){var h=a.f();this.t4_1.t7(h)}if(this.a5_1){var c=this.u4_1,f=null==c?null:c.n3_1,l=null==f?5:f,v=null==c?null:c.o3_1,w=null==v?0:v,g=null==c?null:c.p3_1,d=null==g?0:g,p=null==c?null:c.q3_1;this.t4_1.m7(l,w,d,null==p?0:p,this.b5_1)}},k(it).a6=function(t){this.y5_1=t},k(it).loadModel=function(t){var n=this.y5_1;return null==n?Promise.reject(j("SceneViewer not initialized")):new Promise(et(n,t))},k(it).setEnvironment=function(t){var n=this.y5_1;null==n||n.r7(t,null)},k(it).setEnvironmentWithSkybox=function(t,n){var e=this.y5_1;null==e||e.r7(t,n)},k(it).setCameraOrbit=function(t,n,e){var i=this.y5_1,r=null==i?null:i.v5_1;null==r||(r.g6_1=t,r.h6_1=n,r.i6_1=e)},k(it).setCameraTarget=function(t,n,e){var i=this.y5_1,r=null==i?null:i.v5_1;null==r||r.d4(t,n,e)},k(it).setAutoRotate=function(t){var n=this.y5_1,e=null==n?null:n.v5_1;null==e||(e.t6_1=t)},k(it).setAutoRotateSpeed=function(t){var n=this.y5_1,e=null==n?null:n.v5_1;null==e||(e.u6_1=t)},k(it).setZoomLimits=function(t,n){var e=this.y5_1,i=null==e?null:e.v5_1;null==i||(i.m6_1=t,i.n6_1=n)},k(it).startRendering=function(){var t=this.y5_1;null==t||t.x5()},k(it).stopRendering=function(){var t=this.y5_1;null==t||t.n7()},k(it).resize=function(t,n){var e=this.y5_1;null==e||e.l7(t,n)},k(it).setBackgroundColor=function(t,n,e,i){var r=this.y5_1;if(null==r)return $;var o=r,u={},s=[];s.push(t,n,e,i),u.clearColor=s,u.clear=!0,o.j5_1.setClearOptions(u)},k(it).fitToModels=function(){var t=this.y5_1;null==t||t.u7()},k(it).dispose=function(){if(!this.z5_1){this.z5_1=!0;var t=this.y5_1;null==t||t.v7(),this.y5_1=null}},k(ut).c4=function(t,n,e){this.l3_1=t,this.m3_1=n,this.n3_1=e},k(ut).d4=function(t,n,e){this.o3_1=t,this.p3_1=n,this.q3_1=e},k(ut).e4=function(t){this.u3_1=t},k(ut).w7=function(t){t.lookAt(rt(this.l3_1,this.m3_1,this.n3_1),rt(this.o3_1,this.p3_1,this.q3_1),rt(this.r3_1,this.s3_1,this.t3_1)),this.b4_1&&null!=this.a4_1?t.setExposureDirect(B(this.a4_1)):t.setExposure(this.x3_1,this.y3_1,this.z3_1)},k(st).q4=function(){this.f4_1=at()},k(st).r4=function(t){this.g4_1=t},k(st).x7=function(t,n,e){this.h4_1=t,this.i4_1=n,this.j4_1=e},k(st).s4=function(t,n,e){this.k4_1=t,this.l4_1=n,this.m4_1=e},o=new N,u=new G,function(t){var n=t.io||(t.io={}),e=n.github||(n.github={}),i=e.sceneview||(e.sceneview={});(i.web||(i.web={})).SceneViewer=it}(t),U(),t})?i.apply(n,r):i)||(t.exports=o)},650(n){"use strict";n.exports=t}},e={},function t(i){var r=e[i];if(void 0!==r)return r.exports;var o=e[i]={exports:{}};return n[i](o,o.exports,t),o.exports}(607);var n,e});
2
+ //# sourceMappingURL=sceneview-web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sceneview-web.js","mappings":"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","sources":["webpack://sceneview-web/webpack/universalModuleDefinition","webpack://sceneview-web/../../../../sceneview-core/src/commonMain/kotlin/io/github/sceneview/geometries/GeometryData.kt","webpack://sceneview-web/../../../../sceneview-core/src/commonMain/kotlin/io/github/sceneview/rendering/Vertex.kt","webpack://sceneview-web/../../../../sceneview-core/src/commonMain/kotlin/io/github/sceneview/geometries/CubeGeometry.kt","webpack://sceneview-web/../../../../../../../../../Users/romainguy/Source/kotlin-math/src/commonMain/kotlin/dev/romainguy/kotlin/math/Vector.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/src/kotlin/collectionJs.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/src/kotlin/util/Standard.kt","webpack://sceneview-web/../../../../sceneview-core/src/commonMain/kotlin/io/github/sceneview/geometries/CylinderGeometry.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/src/kotlin/collections/Collections.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/src/kotlin/math.kt","webpack://sceneview-web/../../../../sceneview-core/src/commonMain/kotlin/io/github/sceneview/geometries/PlaneGeometry.kt","webpack://sceneview-web/../../../../sceneview-core/src/commonMain/kotlin/io/github/sceneview/geometries/SphereGeometry.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/runtime/globalThis.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/runtime/math.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/src/kotlin/ArrayBuffer.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/runtime/metadataUtils.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/src/js-builtin-sources/libraries/stdlib/jvm/builtins/Number.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/common/src/generated/_Arrays.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/common/src/generated/_Collections.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/builtins/Char.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/builtins/Enum.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/builtins/Library.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/builtins/Primitives.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/runtime/boxedLong.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/src/kotlin/NumbersJs.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/runtime/charSequenceJs.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/runtime/collectionsHacks.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/runtime/compareTo.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/runtime/coreRuntime.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/coreRuntime.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/runtime/typeCheckUtils.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/runtime/hacks.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/metadataUtils.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/src/kotlin/Unit.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/src/kotlin/kotlin.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/src/kotlin/collections/AbstractMutableCollection.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/src/kotlin/collections/AbstractMutableList.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/src/kotlin/collections/ArrayList.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/src/kotlin/util/Preconditions.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/src/kotlin/exceptions.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/src/kotlin/reflect/KClassImpl.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/src/kotlin/text/StringBuilderJs.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/src/kotlin/text/charJs.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/src/kotlin/text/stringJs.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/src/generated/_ComparisonsJs.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/src/kotlin/collections/AbstractCollection.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/src/kotlin/collections/AbstractList.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/src/kotlin/text/Appendable.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/src/kotlin/text/Char.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/src/kotlin/text/Strings.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/common/src/generated/_Strings.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/src/generated/_ArraysJs.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/runtime/numberConversion.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/numberConversion.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/src/kotlin/text/stringsCode.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/common/src/generated/_Ranges.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/runtime/arrays.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/arrays.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/runtime/noPackageHacks.kt","webpack://sceneview-web/../../../../sceneview-web/src/jsMain/kotlin/io/github/sceneview/web/GeometryGLBBuilder.kt","webpack://sceneview-web/../../../../sceneview-web/src/jsMain/kotlin/io/github/sceneview/web/Main.kt","webpack://sceneview-web/../../../../sceneview-web/src/jsMain/kotlin/io/github/sceneview/web/OrbitCameraController.kt","webpack://sceneview-web/../../../../sceneview-web/src/jsMain/kotlin/io/github/sceneview/web/SceneView.kt","webpack://sceneview-web/../../../../sceneview-web/src/jsMain/kotlin/io/github/sceneview/web/SceneViewJS.kt","webpack://sceneview-web/../../../../sceneview-web/src/jsMain/kotlin/io/github/sceneview/web/bindings/FilamentHelpers.kt","webpack://sceneview-web/../../../../sceneview-web/src/jsMain/kotlin/io/github/sceneview/web/nodes/CameraConfig.kt","webpack://sceneview-web/../../../../sceneview-web/src/jsMain/kotlin/io/github/sceneview/web/nodes/LightConfig.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/libraries/stdlib/js/src/org.w3c/org.khronos.webgl.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/src/kotlin/CharCode.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/src/kotlin/Promise.kt","webpack://sceneview-web/external umd \"Filament\"","webpack://sceneview-web/webpack/bootstrap","webpack://sceneview-web/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"Filament\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"Filament\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"sceneview-web\"] = factory(require(\"Filament\"));\n\telse\n\t\troot[\"sceneview-web\"] = factory(root[\"Filament\"]);\n})(globalThis, (__WEBPACK_EXTERNAL_MODULE__650__) => {\nreturn ","package io.github.sceneview.geometries\n\nimport dev.romainguy.kotlin.math.Float3\nimport dev.romainguy.kotlin.math.max\nimport dev.romainguy.kotlin.math.min\nimport io.github.sceneview.math.Position\nimport io.github.sceneview.math.Size\nimport io.github.sceneview.rendering.Vertex\n\n/**\n * Pure geometry data — vertices and triangle indices — with no rendering-engine dependency.\n *\n * Platform-specific code converts this into native vertex/index buffers.\n */\ndata class GeometryData(\n val vertices: List<Vertex>,\n val indices: List<Int>\n)\n\n/**\n * Axis-aligned bounding box computed from vertex positions.\n */\ndata class BoundingBox(\n val center: Position,\n val halfExtent: Size\n) {\n val min: Position get() = center - halfExtent\n val max: Position get() = center + halfExtent\n}\n\n/**\n * Computes the axis-aligned bounding box of this geometry's vertices.\n */\nfun GeometryData.boundingBox(): BoundingBox {\n require(vertices.isNotEmpty()) { \"Cannot compute bounding box of empty geometry\" }\n var minPos = Float3(vertices.first().position)\n var maxPos = Float3(vertices.first().position)\n for (vertex in vertices) {\n minPos = min(minPos, vertex.position)\n maxPos = max(maxPos, vertex.position)\n }\n val halfExtent = (maxPos - minPos) / 2.0f\n val center = minPos + halfExtent\n return BoundingBox(center, halfExtent)\n}\n\n/**\n * Whether any vertex has a normal defined.\n */\nval GeometryData.hasNormals: Boolean get() = vertices.any { it.normal != null }\n\n/**\n * Whether any vertex has UV coordinates defined.\n */\nval GeometryData.hasUvCoordinates: Boolean get() = vertices.any { it.uvCoordinate != null }\n\n/**\n * Whether any vertex has color defined.\n */\nval GeometryData.hasColors: Boolean get() = vertices.any { it.color != null }\n","package io.github.sceneview.rendering\n\nimport dev.romainguy.kotlin.math.Float2\nimport io.github.sceneview.math.Color\nimport io.github.sceneview.math.Direction\nimport io.github.sceneview.math.Position\n\n/**\n * Cross-platform vertex definition for geometry construction.\n *\n * Used to define the vertices of a mesh in a platform-agnostic way.\n * Platform-specific geometry builders convert these to native vertex buffers.\n *\n * @param position The position of the vertex in local space.\n * @param normal The surface normal direction at this vertex (for lighting).\n * @param uvCoordinate Texture coordinate. Values should be between 0 and 1.\n * @param color Per-vertex color (RGBA).\n */\ndata class Vertex(\n val position: Position = Position(),\n val normal: Direction? = null,\n val uvCoordinate: Float2? = null,\n val color: Color? = null\n)\n\nval List<Vertex>.hasNormals get() = any { it.normal != null }\nval List<Vertex>.hasUvCoordinates get() = any { it.uvCoordinate != null }\nval List<Vertex>.hasColors get() = any { it.color != null }\n\n/**\n * Computes primitive offset ranges from a list of index lists.\n */\nfun List<List<Int>>.getOffsets(): List<IntRange> {\n var indexStart = 0\n return map { primitiveIndices ->\n (indexStart until indexStart + primitiveIndices.size).also {\n indexStart += primitiveIndices.size\n }\n }\n}\n","package io.github.sceneview.geometries\n\nimport dev.romainguy.kotlin.math.Float2\nimport dev.romainguy.kotlin.math.Float3\nimport io.github.sceneview.rendering.Vertex\n\n/**\n * Generates a unit cube (or sized box) as a list of vertices and triangle indices.\n *\n * Each face has 4 unique vertices (with per-face normals), giving 24 vertices total.\n * Indices form 12 triangles (2 per face), giving 36 indices.\n *\n * @param size Full extents along each axis. Default is 1x1x1.\n * @param center Offset applied to every vertex position.\n */\nfun generateCube(\n size: Float3 = Float3(1f),\n center: Float3 = Float3(0f)\n): GeometryData {\n val extents = size * 0.5f\n\n val p0 = center + Float3(-extents.x, -extents.y, extents.z)\n val p1 = center + Float3(extents.x, -extents.y, extents.z)\n val p2 = center + Float3(extents.x, -extents.y, -extents.z)\n val p3 = center + Float3(-extents.x, -extents.y, -extents.z)\n val p4 = center + Float3(-extents.x, extents.y, extents.z)\n val p5 = center + Float3(extents.x, extents.y, extents.z)\n val p6 = center + Float3(extents.x, extents.y, -extents.z)\n val p7 = center + Float3(-extents.x, extents.y, -extents.z)\n\n val up = Float3(y = 1f)\n val down = Float3(y = -1f)\n val front = Float3(z = -1f)\n val back = Float3(z = 1f)\n val left = Float3(x = -1f)\n val right = Float3(x = 1f)\n\n val uv00 = Float2(0f, 0f)\n val uv10 = Float2(1f, 0f)\n val uv01 = Float2(0f, 1f)\n val uv11 = Float2(1f, 1f)\n\n val vertices = listOf(\n // Bottom\n Vertex(position = p0, normal = down, uvCoordinate = uv01),\n Vertex(position = p1, normal = down, uvCoordinate = uv11),\n Vertex(position = p2, normal = down, uvCoordinate = uv10),\n Vertex(position = p3, normal = down, uvCoordinate = uv00),\n // Left\n Vertex(position = p7, normal = left, uvCoordinate = uv01),\n Vertex(position = p4, normal = left, uvCoordinate = uv11),\n Vertex(position = p0, normal = left, uvCoordinate = uv10),\n Vertex(position = p3, normal = left, uvCoordinate = uv00),\n // Back\n Vertex(position = p4, normal = back, uvCoordinate = uv01),\n Vertex(position = p5, normal = back, uvCoordinate = uv11),\n Vertex(position = p1, normal = back, uvCoordinate = uv10),\n Vertex(position = p0, normal = back, uvCoordinate = uv00),\n // Front\n Vertex(position = p6, normal = front, uvCoordinate = uv01),\n Vertex(position = p7, normal = front, uvCoordinate = uv11),\n Vertex(position = p3, normal = front, uvCoordinate = uv10),\n Vertex(position = p2, normal = front, uvCoordinate = uv00),\n // Right\n Vertex(position = p5, normal = right, uvCoordinate = uv01),\n Vertex(position = p6, normal = right, uvCoordinate = uv11),\n Vertex(position = p2, normal = right, uvCoordinate = uv10),\n Vertex(position = p1, normal = right, uvCoordinate = uv00),\n // Top\n Vertex(position = p7, normal = up, uvCoordinate = uv01),\n Vertex(position = p6, normal = up, uvCoordinate = uv11),\n Vertex(position = p5, normal = up, uvCoordinate = uv10),\n Vertex(position = p4, normal = up, uvCoordinate = uv00)\n )\n\n val indices = buildList {\n val sideCount = 6\n val verticesPerSide = 4\n for (i in 0 until sideCount) {\n val base = verticesPerSide * i\n // First triangle\n add(3 + base); add(1 + base); add(0 + base)\n // Second triangle\n add(3 + base); add(2 + base); add(1 + base)\n }\n }\n\n return GeometryData(vertices, indices)\n}\n",null,null,null,"package io.github.sceneview.geometries\n\nimport dev.romainguy.kotlin.math.Float2\nimport dev.romainguy.kotlin.math.Float3\nimport dev.romainguy.kotlin.math.TWO_PI\nimport dev.romainguy.kotlin.math.normalize\nimport io.github.sceneview.rendering.Vertex\nimport kotlin.math.cos\nimport kotlin.math.sin\n\n/**\n * Generates a capped cylinder as a list of vertices and triangle indices.\n *\n * The cylinder is centred at [center] with its axis along Y.\n *\n * @param radius Cylinder radius. Default 1.\n * @param height Full height along Y. Default 2.\n * @param center Offset applied to every vertex position.\n * @param sideCount Number of radial subdivisions. Default 24.\n */\nfun generateCylinder(\n radius: Float = 1f,\n height: Float = 2f,\n center: Float3 = Float3(0f),\n sideCount: Int = 24\n): GeometryData {\n val vertices = buildList {\n val halfHeight = height / 2f\n val thetaIncrement = TWO_PI / sideCount\n var theta = 0f\n val uStep = 1f / sideCount\n\n val lowerCapVertices = mutableListOf<Vertex>()\n val upperCapVertices = mutableListOf<Vertex>()\n val upperEdgeVertices = mutableListOf<Vertex>()\n\n for (side in 0..sideCount) {\n // Lower edge vertex (side normal)\n val lowerPosition = Float3(\n x = radius * cos(theta), y = -halfHeight, z = radius * sin(theta)\n ) + center\n add(\n Vertex(\n position = lowerPosition,\n normal = normalize(Float3(x = lowerPosition.x - center.x, y = 0f, z = lowerPosition.z - center.z)),\n uvCoordinate = Float2(x = uStep * side, y = 0f)\n )\n )\n\n // Lower cap copy (downward normal)\n lowerCapVertices.add(\n Vertex(\n position = lowerPosition,\n normal = Float3(y = -1f),\n uvCoordinate = Float2(x = uStep * side, y = 0f)\n )\n )\n\n // Upper edge vertex (side normal)\n val upperPosition = Float3(\n x = radius * cos(theta), y = halfHeight, z = radius * sin(theta)\n ) + center\n upperEdgeVertices.add(\n Vertex(\n position = upperPosition,\n normal = normalize(Float3(x = upperPosition.x - center.x, y = 0f, z = upperPosition.z - center.z)),\n uvCoordinate = Float2(x = uStep * side, y = 1f)\n )\n )\n\n // Upper cap copy (upward normal)\n upperCapVertices.add(\n Vertex(\n position = upperPosition,\n normal = Float3(y = 1f),\n uvCoordinate = Float2(\n x = (cos(theta) + 1f) / 2f,\n y = (sin(theta) + 1f) / 2f\n )\n )\n )\n theta += thetaIncrement\n }\n\n addAll(upperEdgeVertices)\n\n // Lower cap center\n add(\n Vertex(\n position = center + Float3(y = -halfHeight),\n normal = Float3(y = -1f),\n uvCoordinate = Float2(x = 0.5f, y = 0.5f)\n )\n )\n addAll(lowerCapVertices)\n\n // Upper cap center\n add(\n Vertex(\n position = center + Float3(y = halfHeight),\n normal = Float3(y = 1f),\n uvCoordinate = Float2(x = 0.5f, y = 0.5f)\n )\n )\n addAll(upperCapVertices)\n }\n\n val indices = buildList {\n for (side in 0 until sideCount) {\n val bottomRight = side + 1\n val topLeft = side + sideCount + 1\n val topRight = side + sideCount + 2\n val lowerCenterIndex = 2 * (sideCount + 1)\n val upperCenterIndex = lowerCenterIndex + sideCount + 2\n\n // First triangle of side\n add(side); add(topRight); add(bottomRight)\n // Second triangle of side\n add(side); add(topLeft); add(topRight)\n // Bottom cap triangle\n add(lowerCenterIndex); add(lowerCenterIndex + side + 1); add(lowerCenterIndex + side + 2)\n // Top cap triangle\n add(upperCenterIndex); add(upperCenterIndex + side + 2); add(upperCenterIndex + side + 1)\n }\n }\n\n return GeometryData(vertices, indices)\n}\n",null,null,"package io.github.sceneview.geometries\n\nimport dev.romainguy.kotlin.math.Float2\nimport dev.romainguy.kotlin.math.Float3\nimport io.github.sceneview.rendering.Vertex\n\n/**\n * Generates a quad (two-triangle plane) as a list of vertices and triangle indices.\n *\n * The plane lies in the XY plane (z = 0) by default.\n *\n * @param size Width (X) and height (Y) of the plane.\n * @param center Offset applied to every vertex position.\n * @param normal Surface normal for all four vertices. Default is +Y.\n */\nfun generatePlane(\n size: Float2 = Float2(1f),\n center: Float3 = Float3(0f),\n normal: Float3 = Float3(y = 1f)\n): GeometryData {\n val extents = Float3(size.x, size.y, 0f) / 2f\n\n val vertices = listOf(\n Vertex(\n position = center + Float3(x = -extents.x, y = -extents.y, z = extents.z),\n normal = normal,\n uvCoordinate = Float2(0f, 0f)\n ),\n Vertex(\n position = center + Float3(x = -extents.x, y = extents.y, z = -extents.z),\n normal = normal,\n uvCoordinate = Float2(0f, 1f)\n ),\n Vertex(\n position = center + Float3(x = extents.x, y = extents.y, z = -extents.z),\n normal = normal,\n uvCoordinate = Float2(1f, 1f)\n ),\n Vertex(\n position = center + Float3(x = extents.x, y = -extents.y, z = extents.z),\n normal = normal,\n uvCoordinate = Float2(1f, 0f)\n )\n )\n\n val indices = listOf(\n 3, 1, 0, // First triangle\n 3, 2, 1 // Second triangle\n )\n\n return GeometryData(vertices, indices)\n}\n","package io.github.sceneview.geometries\n\nimport dev.romainguy.kotlin.math.Float2\nimport dev.romainguy.kotlin.math.Float3\nimport dev.romainguy.kotlin.math.PI\nimport dev.romainguy.kotlin.math.TWO_PI\nimport dev.romainguy.kotlin.math.normalize\nimport io.github.sceneview.rendering.Vertex\nimport kotlin.math.cos\nimport kotlin.math.sin\n\n/**\n * Generates a UV sphere as a list of vertices and triangle indices.\n *\n * @param radius Sphere radius. Default 1.\n * @param center Offset applied to every vertex position.\n * @param stacks Number of horizontal subdivisions (latitude). Default 24.\n * @param slices Number of vertical subdivisions (longitude). Default 24.\n */\nfun generateSphere(\n radius: Float = 1f,\n center: Float3 = Float3(0f),\n stacks: Int = 24,\n slices: Int = 24\n): GeometryData {\n val vertices = buildList {\n for (stack in 0..stacks) {\n val phi = PI * stack.toFloat() / stacks.toFloat()\n for (slice in 0..slices) {\n val theta = TWO_PI * (if (slice == slices) 0 else slice).toFloat() / slices\n var position = Float3(\n x = sin(phi) * cos(theta),\n y = cos(phi),\n z = sin(phi) * sin(theta)\n ) * radius\n val normal = normalize(position)\n position += center\n val uvCoordinate = Float2(\n x = 1f - slice.toFloat() / slices,\n y = 1f - stack.toFloat() / stacks\n )\n add(Vertex(position = position, normal = normal, uvCoordinate = uvCoordinate))\n }\n }\n }\n\n val indices = buildList {\n var v = 0\n for (stack in 0 until stacks) {\n for (slice in 0 until slices) {\n val topCap = stack == 0\n val bottomCap = stack == stacks - 1\n val next = slice + 1\n if (!topCap) {\n add(v + slice)\n add(v + next)\n add(v + slice + slices + 1)\n }\n if (!bottomCap) {\n add(v + next)\n add(v + next + slices + 1)\n add(v + slice + slices + 1)\n }\n }\n v += slices + 1\n }\n }\n\n return GeometryData(vertices, indices)\n}\n",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"package io.github.sceneview.web\n\nimport dev.romainguy.kotlin.math.Float2\nimport dev.romainguy.kotlin.math.Float3\nimport io.github.sceneview.geometries.GeometryData\nimport io.github.sceneview.geometries.generateCube\nimport io.github.sceneview.geometries.generateCylinder\nimport io.github.sceneview.geometries.generatePlane\nimport io.github.sceneview.geometries.generateSphere\nimport io.github.sceneview.web.nodes.GeometryConfig\nimport io.github.sceneview.web.nodes.GeometryType\nimport org.khronos.webgl.ArrayBuffer\nimport org.khronos.webgl.DataView\nimport org.khronos.webgl.Float32Array\nimport org.khronos.webgl.Uint16Array\nimport org.khronos.webgl.Uint8Array\nimport org.khronos.webgl.get\nimport org.khronos.webgl.set\n\n/**\n * Builds an in-memory GLB (glTF-Binary) from a [GeometryConfig] using the KMP core\n * geometry generators.\n *\n * The generated GLB is loaded through gltfio's UbershaderProvider pipeline,\n * which means geometry nodes get the same PBR material system as loaded models.\n *\n * This approach avoids the need for custom `.filamat` material files and reuses\n * the existing [SceneView.loadModel] infrastructure.\n */\ninternal object GeometryGLBBuilder {\n\n /**\n * Generate a GLB [ArrayBuffer] for the given geometry config.\n *\n * The GLB contains a single mesh node with:\n * - Position and normal vertex attributes\n * - A PBR material with the configured baseColorFactor\n * - A translation matching the configured position\n * - A scale matching the configured scale\n */\n fun buildGLB(config: GeometryConfig): ArrayBuffer {\n val geometryData = generateGeometryData(config)\n val vertices = geometryData.vertices\n val indices = geometryData.indices\n\n val vertexCount = vertices.size\n val indexCount = indices.size\n\n // Extract positions and normals into flat Float32Arrays\n val positions = Float32Array(vertexCount * 3)\n val normals = Float32Array(vertexCount * 3)\n\n // Track bounding box\n var minX = Float.MAX_VALUE; var minY = Float.MAX_VALUE; var minZ = Float.MAX_VALUE\n var maxX = -Float.MAX_VALUE; var maxY = -Float.MAX_VALUE; var maxZ = -Float.MAX_VALUE\n\n for (i in vertices.indices) {\n val v = vertices[i]\n val px = v.position.x\n val py = v.position.y\n val pz = v.position.z\n\n positions[i * 3] = px\n positions[i * 3 + 1] = py\n positions[i * 3 + 2] = pz\n\n val n = v.normal ?: Float3(0f, 1f, 0f)\n normals[i * 3] = n.x\n normals[i * 3 + 1] = n.y\n normals[i * 3 + 2] = n.z\n\n if (px < minX) minX = px\n if (py < minY) minY = py\n if (pz < minZ) minZ = pz\n if (px > maxX) maxX = px\n if (py > maxY) maxY = py\n if (pz > maxZ) maxZ = pz\n }\n\n // Build index buffer\n val indexArray = Uint16Array(indexCount)\n for (i in indices.indices) {\n indexArray[i] = indices[i].toShort()\n }\n\n // Build the GLB from positions, normals, indices\n return buildGLBFromArrays(\n config = config,\n positions = positions,\n normals = normals,\n indices = indexArray,\n vertexCount = vertexCount,\n indexCount = indexCount,\n bboxMin = floatArrayOf(minX, minY, minZ),\n bboxMax = floatArrayOf(maxX, maxY, maxZ)\n )\n }\n\n private fun generateGeometryData(config: GeometryConfig): GeometryData {\n return when (config.geometryType) {\n GeometryType.CUBE -> generateCube(\n size = Float3(\n config.sizeX.toFloat(),\n config.sizeY.toFloat(),\n config.sizeZ.toFloat()\n )\n )\n\n GeometryType.SPHERE -> generateSphere(\n radius = config.radius.toFloat()\n )\n\n GeometryType.CYLINDER -> generateCylinder(\n radius = config.radius.toFloat(),\n height = config.height.toFloat()\n )\n\n GeometryType.PLANE -> generatePlane(\n size = Float2(\n config.sizeX.toFloat(),\n config.sizeY.toFloat()\n )\n )\n }\n }\n\n private fun buildGLBFromArrays(\n config: GeometryConfig,\n positions: Float32Array,\n normals: Float32Array,\n indices: Uint16Array,\n vertexCount: Int,\n indexCount: Int,\n bboxMin: FloatArray,\n bboxMax: FloatArray\n ): ArrayBuffer {\n val posBytes = (vertexCount * 3 * 4) // Float32 = 4 bytes\n val normBytes = (vertexCount * 3 * 4)\n val idxBytes = (indexCount * 2) // Uint16 = 2 bytes\n\n val typeName = config.geometryType.name.lowercase()\n\n // Build the node transform: translation + scale\n val node = js(\"{}\")\n node.mesh = 0\n node.name = typeName\n\n // Set translation if non-zero\n if (config.positionX != 0.0 || config.positionY != 0.0 || config.positionZ != 0.0) {\n node.translation = js(\"[]\")\n node.translation.push(config.positionX, config.positionY, config.positionZ)\n }\n\n // Set scale if non-uniform\n if (config.scaleX != 1.0 || config.scaleY != 1.0 || config.scaleZ != 1.0) {\n node.scale = js(\"[]\")\n node.scale.push(config.scaleX, config.scaleY, config.scaleZ)\n }\n\n // Set rotation (Euler degrees → quaternion for glTF)\n if (config.rotationX != 0.0 || config.rotationY != 0.0 || config.rotationZ != 0.0) {\n val rx = config.rotationX * kotlin.math.PI / 180.0\n val ry = config.rotationY * kotlin.math.PI / 180.0\n val rz = config.rotationZ * kotlin.math.PI / 180.0\n // Euler XYZ to quaternion\n val cx = kotlin.math.cos(rx / 2); val sx = kotlin.math.sin(rx / 2)\n val cy = kotlin.math.cos(ry / 2); val sy = kotlin.math.sin(ry / 2)\n val cz = kotlin.math.cos(rz / 2); val sz = kotlin.math.sin(rz / 2)\n val qx = sx * cy * cz - cx * sy * sz\n val qy = cx * sy * cz + sx * cy * sz\n val qz = cx * cy * sz - sx * sy * cz\n val qw = cx * cy * cz + sx * sy * sz\n node.rotation = js(\"[]\")\n node.rotation.push(qx, qy, qz, qw)\n }\n\n // Build glTF JSON\n val gltf = js(\"{}\")\n gltf.asset = js(\"({version: '2.0', generator: 'SceneView-Web'})\")\n gltf.scene = 0\n gltf.scenes = js(\"([{nodes: [0]}])\")\n\n gltf.nodes = js(\"[]\")\n gltf.nodes.push(node)\n\n // Mesh with position + normal attributes\n gltf.meshes = js(\"([{primitives: [{attributes: {POSITION: 0, NORMAL: 1}, indices: 2, material: 0, mode: 4}]}])\")\n\n // PBR material with the configured color\n val material = js(\"{}\")\n material.name = \"${typeName}_mat\"\n material.pbrMetallicRoughness = js(\"{}\")\n material.pbrMetallicRoughness.baseColorFactor = js(\"[]\")\n material.pbrMetallicRoughness.baseColorFactor.push(config.colorR, config.colorG, config.colorB, config.colorA)\n material.pbrMetallicRoughness.metallicFactor = 0.1\n material.pbrMetallicRoughness.roughnessFactor = 0.6\n material.doubleSided = false\n\n gltf.materials = js(\"[]\")\n gltf.materials.push(material)\n\n // Accessors: position (VEC3), normal (VEC3), indices (SCALAR)\n val posAccessor = js(\"{}\")\n posAccessor.bufferView = 0\n posAccessor.componentType = 5126 // FLOAT\n posAccessor.count = vertexCount\n posAccessor.type = \"VEC3\"\n posAccessor.min = js(\"[]\")\n posAccessor.min.push(bboxMin[0], bboxMin[1], bboxMin[2])\n posAccessor.max = js(\"[]\")\n posAccessor.max.push(bboxMax[0], bboxMax[1], bboxMax[2])\n\n val normAccessor = js(\"{}\")\n normAccessor.bufferView = 1\n normAccessor.componentType = 5126 // FLOAT\n normAccessor.count = vertexCount\n normAccessor.type = \"VEC3\"\n\n val idxAccessor = js(\"{}\")\n idxAccessor.bufferView = 2\n idxAccessor.componentType = 5123 // UNSIGNED_SHORT\n idxAccessor.count = indexCount\n idxAccessor.type = \"SCALAR\"\n\n gltf.accessors = js(\"[]\")\n gltf.accessors.push(posAccessor, normAccessor, idxAccessor)\n\n // Buffer views\n val bv0 = js(\"{}\")\n bv0.buffer = 0; bv0.byteOffset = 0; bv0.byteLength = posBytes; bv0.target = 34962\n\n val bv1 = js(\"{}\")\n bv1.buffer = 0; bv1.byteOffset = posBytes; bv1.byteLength = normBytes; bv1.target = 34962\n\n val bv2 = js(\"{}\")\n bv2.buffer = 0; bv2.byteOffset = posBytes + normBytes; bv2.byteLength = idxBytes; bv2.target = 34963\n\n gltf.bufferViews = js(\"[]\")\n gltf.bufferViews.push(bv0, bv1, bv2)\n\n // Binary data length (padded to 4-byte alignment)\n val binLength = posBytes + normBytes + idxBytes\n val binPad = (4 - (binLength % 4)) % 4\n val binLengthAligned = binLength + binPad\n\n gltf.buffers = js(\"[]\")\n val buf = js(\"{}\")\n buf.byteLength = binLength // glTF spec: logical buffer size, not padded chunk size\n gltf.buffers.push(buf)\n\n // Serialize JSON chunk (padded to 4-byte alignment with spaces)\n var jsonStr: String = JSON.stringify(gltf)\n while (jsonStr.length % 4 != 0) jsonStr += \" \"\n val jsonLength = jsonStr.length\n\n // Total GLB size: header(12) + JSON chunk header(8) + JSON + BIN chunk header(8) + BIN\n val totalLength = 12 + 8 + jsonLength + 8 + binLengthAligned\n\n val glb = ArrayBuffer(totalLength)\n val view = DataView(glb)\n var offset = 0\n\n // GLB header: magic + version + length\n view.setUint32(offset, 0x46546C67, true); offset += 4 // \"glTF\"\n view.setUint32(offset, 2, true); offset += 4 // version 2\n view.setUint32(offset, totalLength, true); offset += 4\n\n // JSON chunk: length + type + data\n view.setUint32(offset, jsonLength, true); offset += 4\n view.setUint32(offset, 0x4E4F534A, true); offset += 4 // \"JSON\"\n for (i in jsonStr.indices) {\n view.setUint8(offset++, jsonStr[i].code.toByte())\n }\n\n // BIN chunk: length + type + data\n view.setUint32(offset, binLengthAligned, true); offset += 4\n view.setUint32(offset, 0x004E4942, true); offset += 4 // \"BIN\\0\"\n\n // Copy position data\n val glbBytes = Uint8Array(glb)\n val posBytes8 = Uint8Array(positions.buffer)\n for (i in 0 until posBytes) {\n glbBytes[offset + i] = posBytes8[i]\n }\n offset += posBytes\n\n // Copy normal data\n val normBytes8 = Uint8Array(normals.buffer)\n for (i in 0 until normBytes) {\n glbBytes[offset + i] = normBytes8[i]\n }\n offset += normBytes\n\n // Copy index data\n val idxBytes8 = Uint8Array(indices.buffer)\n for (i in 0 until idxBytes) {\n glbBytes[offset + i] = idxBytes8[i]\n }\n offset += idxBytes\n\n // Pad remaining bytes with zeros\n for (p in 0 until binPad) {\n view.setUint8(offset++, 0.toByte())\n }\n\n return glb\n }\n}\n","package io.github.sceneview.web\n\nimport kotlinx.browser.document\nimport kotlinx.browser.window\nimport org.w3c.dom.HTMLCanvasElement\nimport kotlin.js.Promise\n\n/**\n * Entry point for the SceneView Web library.\n *\n * Registers the SceneView API on `window.sceneview` so it can be used\n * from plain JavaScript after loading via `<script>` tag.\n *\n * Usage:\n * ```html\n * <script src=\"sceneview-web.js\"></script>\n * <script>\n * sceneview.createViewer(\"canvas\").then(sv => sv.loadModel(\"model.glb\"));\n * </script>\n * ```\n */\nfun main() {\n // Register the API on the global window object\n val api: dynamic = js(\"{}\")\n\n api[\"version\"] = SCENEVIEW_VERSION\n api[\"createViewer\"] = ::jsCreateViewer\n api[\"createViewerAutoRotate\"] = ::jsCreateViewerAutoRotate\n api[\"createViewerFull\"] = ::jsCreateViewerFull\n api[\"modelViewer\"] = ::jsModelViewer\n api[\"modelViewerAutoRotate\"] = ::jsModelViewerAutoRotate\n\n js(\"window\")[\"sceneview\"] = api\n\n console.log(\"SceneView Web v$SCENEVIEW_VERSION loaded\")\n}\n\n// --- JS-callable bridge functions ---\n// These use explicit types that map cleanly to JavaScript\n\nfun jsCreateViewer(canvasId: String): Promise<SceneViewJS> {\n return createViewerImpl(canvasId, autoRotate = true, cameraControls = true)\n}\n\nfun jsCreateViewerAutoRotate(canvasId: String, autoRotate: Boolean): Promise<SceneViewJS> {\n return createViewerImpl(canvasId, autoRotate = autoRotate, cameraControls = true)\n}\n\nfun jsCreateViewerFull(\n canvasId: String,\n autoRotate: Boolean,\n cameraControls: Boolean,\n cameraX: Double,\n cameraY: Double,\n cameraZ: Double,\n fov: Double,\n lightIntensity: Double\n): Promise<SceneViewJS> {\n return createViewerImpl(canvasId, autoRotate, cameraControls, cameraX, cameraY, cameraZ, fov, lightIntensity)\n}\n\nfun jsModelViewer(canvasId: String, modelUrl: String): Promise<SceneViewJS> {\n return createViewerImpl(canvasId, autoRotate = true, cameraControls = true).then { viewer ->\n viewer.loadModel(modelUrl)\n viewer\n }\n}\n\nfun jsModelViewerAutoRotate(canvasId: String, modelUrl: String, autoRotate: Boolean): Promise<SceneViewJS> {\n return createViewerImpl(canvasId, autoRotate = autoRotate, cameraControls = true).then { viewer ->\n viewer.loadModel(modelUrl)\n viewer\n }\n}\n\n// --- Internal implementation ---\n\ninternal fun createViewerImpl(\n canvasId: String,\n autoRotate: Boolean,\n cameraControls: Boolean,\n cameraX: Double = 0.0,\n cameraY: Double = 1.5,\n cameraZ: Double = 5.0,\n fov: Double = 45.0,\n lightIntensity: Double = 50_000.0\n): Promise<SceneViewJS> {\n val canvas = document.getElementById(canvasId) as? HTMLCanvasElement\n ?: return Promise.reject(Throwable(\"Canvas element '$canvasId' not found\"))\n\n // Ensure canvas has physical pixel dimensions\n if (canvas.width == 0 || canvas.height == 0) {\n canvas.width = canvas.clientWidth\n canvas.height = canvas.clientHeight\n }\n\n return Promise { resolve, reject ->\n try {\n SceneView.create(\n canvas = canvas,\n configure = {\n camera {\n eye(cameraX, cameraY, cameraZ)\n target(0.0, 0.0, 0.0)\n fov(fov)\n }\n light {\n directional()\n intensity(lightIntensity)\n direction(0.6f, -1.0f, -0.8f)\n }\n autoRotate(autoRotate)\n cameraControls(cameraControls)\n },\n onReady = { sceneView ->\n sceneView.startRendering()\n\n // Auto-resize on window resize\n window.addEventListener(\"resize\", {\n canvas.width = canvas.clientWidth\n canvas.height = canvas.clientHeight\n })\n\n val viewer = SceneViewJS()\n viewer.attach(sceneView)\n resolve(viewer)\n }\n )\n } catch (e: Throwable) {\n reject(e)\n }\n }\n}\n","package io.github.sceneview.web\n\nimport io.github.sceneview.web.bindings.Camera\nimport io.github.sceneview.web.bindings.float3\nimport kotlinx.browser.window\nimport org.w3c.dom.HTMLCanvasElement\nimport org.w3c.dom.events.MouseEvent\nimport org.w3c.dom.events.WheelEvent\nimport kotlin.math.PI\nimport kotlin.math.cos\nimport kotlin.math.max\nimport kotlin.math.min\nimport kotlin.math.sin\n\n/**\n * Orbit camera controller for SceneView Web.\n *\n * Provides mouse/touch-based orbit, zoom, and pan controls similar to\n * three.js OrbitControls or Google model-viewer's camera-controls.\n *\n * Usage:\n * ```kotlin\n * val controller = OrbitCameraController(canvas, sceneView.camera)\n * controller.target(0.0, 0.0, 0.0)\n * controller.distance = 5.0\n * // Call update() each frame in the render loop\n * ```\n */\nclass OrbitCameraController(\n private val canvas: HTMLCanvasElement,\n private val camera: Camera\n) {\n // Spherical coordinates — defaults match model-viewer's \"45deg 70deg 2.5m\"\n var theta = 45.0 * PI / 180.0 // horizontal angle (radians) — 45° like model-viewer\n var phi = 70.0 * PI / 180.0 // vertical angle (radians) — 70° like model-viewer\n var distance = 5.0 // distance from target\n\n // Target point (orbit center)\n var targetX = 0.0\n var targetY = 0.0\n var targetZ = 0.0\n\n // Limits\n var minDistance = 0.5\n var maxDistance = 50.0\n var minPhi = 0.1 // prevent looking straight down\n var maxPhi = PI - 0.1 // prevent looking straight up\n\n // Sensitivity\n var rotateSensitivity = 0.005\n var zoomSensitivity = 0.1\n var panSensitivity = 0.003\n\n // Auto-rotation — default speed matches model-viewer's 30deg/sec at 60fps\n var autoRotate = false\n var autoRotateSpeed = 30.0 * PI / 180.0 / 60.0 // 30°/sec ÷ 60fps ≈ 0.00873 rad/frame\n\n // Damping (inertia) — higher factor = smoother, more model-viewer-like\n var enableDamping = true\n var dampingFactor = 0.95\n private var velocityTheta = 0.0\n private var velocityPhi = 0.0\n\n // Mouse state\n private var isDragging = false\n private var isRightDragging = false\n private var lastX = 0.0\n private var lastY = 0.0\n\n init {\n setupEventListeners()\n }\n\n fun target(x: Double, y: Double, z: Double) {\n targetX = x; targetY = y; targetZ = z\n }\n\n /**\n * Update camera position from spherical coordinates.\n * Call this every frame in the render loop.\n *\n * Converts spherical coordinates (theta, phi, distance) to Cartesian\n * and calls camera.lookAt() with float3 arrays as required by Filament.js.\n */\n fun update() {\n // Apply auto-rotation\n if (autoRotate && !isDragging) {\n theta += autoRotateSpeed\n }\n\n // Apply damping\n if (enableDamping) {\n theta += velocityTheta\n phi += velocityPhi\n velocityTheta *= dampingFactor\n velocityPhi *= dampingFactor\n }\n\n // Clamp phi\n phi = max(minPhi, min(maxPhi, phi))\n distance = max(minDistance, min(maxDistance, distance))\n\n // Convert spherical to cartesian\n val eyeX = targetX + distance * sin(phi) * sin(theta)\n val eyeY = targetY + distance * cos(phi)\n val eyeZ = targetZ + distance * sin(phi) * cos(theta)\n\n // Filament.js Camera.lookAt takes float3 arrays, not 9 separate doubles\n camera.lookAt(\n float3(eyeX, eyeY, eyeZ), // eye\n float3(targetX, targetY, targetZ), // center\n float3(0.0, 1.0, 0.0) // up\n )\n }\n\n /** Remove all event listeners. Call when destroying the SceneView. */\n fun dispose() {\n // Event listeners are attached to the canvas and will be GC'd with it\n }\n\n private fun setupEventListeners() {\n // Mouse down\n canvas.addEventListener(\"mousedown\", { event ->\n val e = event as MouseEvent\n when (e.button.toInt()) {\n 0 -> { isDragging = true } // Left button = orbit\n 2 -> { isRightDragging = true } // Right button = pan\n }\n lastX = e.clientX.toDouble()\n lastY = e.clientY.toDouble()\n e.preventDefault()\n })\n\n // Mouse move\n canvas.addEventListener(\"mousemove\", { event ->\n val e = event as MouseEvent\n val dx = e.clientX.toDouble() - lastX\n val dy = e.clientY.toDouble() - lastY\n lastX = e.clientX.toDouble()\n lastY = e.clientY.toDouble()\n\n if (isDragging) {\n // Orbit\n if (enableDamping) {\n velocityTheta = -dx * rotateSensitivity\n velocityPhi = -dy * rotateSensitivity\n } else {\n theta -= dx * rotateSensitivity\n phi -= dy * rotateSensitivity\n }\n } else if (isRightDragging) {\n // Pan\n targetX += dx * panSensitivity * distance\n targetY -= dy * panSensitivity * distance\n }\n })\n\n // Mouse up\n canvas.addEventListener(\"mouseup\", {\n isDragging = false\n isRightDragging = false\n })\n\n canvas.addEventListener(\"mouseleave\", {\n isDragging = false\n isRightDragging = false\n })\n\n // Scroll wheel = zoom\n canvas.addEventListener(\"wheel\", { event ->\n val e = event as WheelEvent\n val delta = if (e.deltaY > 0) 1.0 else -1.0\n distance *= 1.0 + delta * zoomSensitivity\n distance = max(minDistance, min(maxDistance, distance))\n e.preventDefault()\n }, js(\"{passive: false}\"))\n\n // Prevent context menu on right-click\n canvas.addEventListener(\"contextmenu\", { event ->\n event.preventDefault()\n })\n\n // Touch support\n canvas.addEventListener(\"touchstart\", { event ->\n val e = event.asDynamic()\n if (e.touches.length == 1) {\n isDragging = true\n lastX = (e.touches[0].clientX as Number).toDouble()\n lastY = (e.touches[0].clientY as Number).toDouble()\n }\n event.preventDefault()\n }, js(\"{passive: false}\"))\n\n canvas.addEventListener(\"touchmove\", { event ->\n val e = event.asDynamic()\n if (isDragging && e.touches.length == 1) {\n val dx = (e.touches[0].clientX as Number).toDouble() - lastX\n val dy = (e.touches[0].clientY as Number).toDouble() - lastY\n lastX = (e.touches[0].clientX as Number).toDouble()\n lastY = (e.touches[0].clientY as Number).toDouble()\n\n if (enableDamping) {\n velocityTheta = -dx * rotateSensitivity\n velocityPhi = -dy * rotateSensitivity\n } else {\n theta -= dx * rotateSensitivity\n phi -= dy * rotateSensitivity\n }\n } else if (e.touches.length == 2) {\n // Pinch-to-zoom\n val dx = (e.touches[0].clientX as Number).toDouble() - (e.touches[1].clientX as Number).toDouble()\n val dy = (e.touches[0].clientY as Number).toDouble() - (e.touches[1].clientY as Number).toDouble()\n val pinchDistance = kotlin.math.sqrt(dx * dx + dy * dy)\n\n if (lastPinchDistance > 0) {\n val delta = lastPinchDistance - pinchDistance\n distance *= 1.0 + delta * 0.005\n distance = max(minDistance, min(maxDistance, distance))\n }\n lastPinchDistance = pinchDistance\n }\n event.preventDefault()\n }, js(\"{passive: false}\"))\n\n canvas.addEventListener(\"touchend\", {\n isDragging = false\n lastPinchDistance = -1.0\n })\n }\n\n private var lastPinchDistance = -1.0\n}\n","package io.github.sceneview.web\n\nimport io.github.sceneview.web.bindings.*\nimport io.github.sceneview.web.nodes.CameraConfig\nimport io.github.sceneview.web.nodes.GeometryConfig\nimport io.github.sceneview.web.nodes.LightConfig\nimport io.github.sceneview.web.nodes.LightType\nimport io.github.sceneview.web.nodes.ModelConfig\nimport kotlinx.browser.window\nimport org.w3c.dom.HTMLCanvasElement\n\n/**\n * SceneView for Web -- Filament.js based 3D viewer.\n *\n * Uses the same Filament rendering engine as SceneView Android,\n * compiled to WebAssembly for browser execution.\n *\n * This class actually initializes the Filament WASM module, creates a real\n * WebGL2 rendering context, and renders 3D content using the GPU.\n *\n * Basic usage:\n * ```kotlin\n * SceneView.create(canvas) {\n * camera {\n * eye(0.0, 1.5, 5.0)\n * target(0.0, 0.0, 0.0)\n * }\n * light {\n * directional()\n * intensity(100_000.0)\n * }\n * model(\"models/damaged_helmet.glb\")\n * }\n * ```\n */\nclass SceneView private constructor(\n val canvas: HTMLCanvasElement,\n val engine: Engine,\n val renderer: Renderer,\n val scene: Scene,\n val view: View,\n val camera: Camera,\n val swapChain: SwapChain,\n private val cameraEntity: Entity\n) {\n private var animationFrameId: Int? = null\n private var isRunning = false\n private var lastTimestamp = 0.0\n\n private val models = mutableListOf<LoadedModel>()\n private var assetLoader: AssetLoader? = null\n private val lightEntities = mutableListOf<Entity>()\n\n /** Tracks a loaded glTF asset with its animation state. */\n private class LoadedModel(\n val asset: FilamentAsset,\n val animator: Animator?,\n var animationTime: Double = 0.0\n )\n\n /** Orbit camera controller -- initialized when cameraControls is enabled. */\n var cameraController: OrbitCameraController? = null\n private set\n\n /** Enable orbit camera controls (mouse drag to orbit, scroll to zoom, touch support). */\n fun enableCameraControls(\n distance: Double = 5.0,\n targetX: Double = 0.0,\n targetY: Double = 0.0,\n targetZ: Double = 0.0,\n autoRotate: Boolean = false\n ): OrbitCameraController {\n val controller = OrbitCameraController(canvas, camera).apply {\n this.distance = distance\n target(targetX, targetY, targetZ)\n this.autoRotate = autoRotate\n }\n cameraController = controller\n return controller\n }\n\n companion object {\n /** Default IBL URL — same \"neutral\" environment as SceneView Android. */\n const val DEFAULT_IBL_URL = \"https://sceneview.github.io/assets/environments/neutral_ibl.ktx\"\n const val DEFAULT_SKYBOX_URL = \"https://sceneview.github.io/assets/environments/neutral_skybox.ktx\"\n\n /**\n * Initialize Filament WASM and create a SceneView instance.\n *\n * This is the main entry point. It:\n * 1. Calls Filament.init() to load and compile the WASM module\n * 2. Creates a Filament Engine with a WebGL2 context on the canvas\n * 3. Sets up Scene, View, Camera, Renderer, and SwapChain\n * 4. Applies the user's configuration (camera, lights, models)\n * 5. Calls onReady with the fully initialized SceneView\n *\n * @param canvas The HTML canvas element to render into\n * @param assets List of asset URLs to preload (IBL, skybox KTX files)\n * @param configure DSL block to configure the scene\n * @param onReady Callback when the SceneView is fully initialized\n */\n fun create(\n canvas: HTMLCanvasElement,\n assets: Array<String> = emptyArray(),\n configure: SceneViewBuilder.() -> Unit = {},\n onReady: (SceneView) -> Unit\n ) {\n // Step 1: Initialize Filament WASM module and preload any assets\n init(assets) {\n try {\n // Step 2: Create the Filament engine with WebGL2 context\n // Use dynamic call because webpack externals + Kotlin companion objects\n // don't resolve correctly for Filament's static Engine.create()\n val filament: dynamic = js(\"Filament\")\n val engine: Engine = filament.Engine.create(canvas).unsafeCast<Engine>()\n val renderer = engine.createRenderer()\n val scene = engine.createScene()\n val swapChain = engine.createSwapChain()\n val view = engine.createView()\n\n // Step 3: Create camera entity and camera\n val cameraEntity = (js(\"Filament.EntityManager.get().create()\") as Entity)\n val camera = engine.createCamera(cameraEntity)\n\n // Step 4: Connect view to camera and scene\n view.setCamera(camera)\n view.setScene(scene)\n\n // Step 5: Set viewport to canvas pixel dimensions\n val width = canvas.width\n val height = canvas.height\n view.setViewport(viewport(0, 0, width, height))\n\n // Step 6: Default camera setup -- perspective projection\n val aspect = if (height > 0) width.toDouble() / height.toDouble() else 1.0\n camera.setProjectionFov(\n fovInDegrees = 45.0,\n aspect = aspect,\n near = 0.1,\n far = 1000.0\n )\n\n // Default camera position: slightly above and back, looking at origin\n camera.lookAt(\n float3(0.0, 1.5, 5.0), // eye\n float3(0.0, 0.0, 0.0), // center\n float3(0.0, 1.0, 0.0) // up\n )\n\n // Default exposure matching model-viewer's exposure=1.1\n // This makes IBL-lit models look bright and vibrant\n camera.setExposureDirect(1.1)\n\n // Set clear color to near-black (clean dark background)\n renderer.setClearOptions(js(\"({clearColor: [0.05, 0.05, 0.07, 1.0], clear: true})\"))\n\n // --- Quality defaults for PBR rendering ---\n // Screen-space ambient occlusion (soft contact shadows)\n view.setAmbientOcclusionOptions(js(\"\"\"({\n enabled: true,\n radius: 0.3,\n bias: 0.0005,\n intensity: 1.0,\n quality: 1\n })\"\"\"))\n\n // Subtle bloom for emissive/bright highlights\n view.setBloomOptions(js(\"\"\"({\n enabled: true,\n strength: 0.1,\n threshold: true,\n levels: 4\n })\"\"\"))\n\n // Temporal anti-aliasing for smooth edges\n view.setTemporalAntiAliasingOptions(js(\"\"\"({\n enabled: true\n })\"\"\"))\n\n val sceneView = SceneView(\n canvas, engine, renderer, scene, view, camera, swapChain, cameraEntity\n )\n\n // Step 7: Apply user configuration (camera, lights, models, environment)\n val builder = SceneViewBuilder(sceneView)\n builder.configure()\n builder.apply()\n\n onReady(sceneView)\n } catch (e: Throwable) {\n console.error(\"SceneView: Failed to initialize Filament engine\", e)\n }\n }\n }\n }\n\n /** Resize the viewport to match the canvas dimensions. Call on window resize. */\n fun resize(width: Int = canvas.clientWidth, height: Int = canvas.clientHeight) {\n if (width <= 0 || height <= 0) return\n canvas.width = width\n canvas.height = height\n view.setViewport(viewport(0, 0, width, height))\n camera.setProjectionFov(\n fovInDegrees = 45.0,\n aspect = width.toDouble() / height.toDouble(),\n near = 0.1,\n far = 1000.0\n )\n }\n\n /** Enable automatic viewport resizing when the canvas CSS size changes. */\n var autoResize = true\n\n /** Start the render loop using requestAnimationFrame. */\n fun startRendering() {\n if (isRunning) return\n isRunning = true\n lastTimestamp = 0.0\n renderLoop(0.0)\n }\n\n /** Stop the render loop. */\n fun stopRendering() {\n isRunning = false\n animationFrameId?.let { window.cancelAnimationFrame(it) }\n animationFrameId = null\n }\n\n /**\n * Load a glTF/GLB model from a URL and add it to the scene.\n *\n * This performs the full loading pipeline:\n * 1. Fetch the .glb/.gltf file as an ArrayBuffer\n * 2. Create a FilamentAsset via the AssetLoader\n * 3. Add all renderable entities to the scene\n * 4. Call loadResources() to fetch external textures/buffers\n * 5. Release source data to free memory\n *\n * @param url URL to the .glb or .gltf file\n * @param onLoaded Optional callback when the model is fully loaded (with resources)\n */\n fun loadModel(\n url: String,\n onLoaded: ((FilamentAsset) -> Unit)? = null\n ) {\n val loader = assetLoader ?: engine.createAssetLoader().also { assetLoader = it }\n\n // Derive the base path for resolving relative resource URIs\n val basePath = url.substringBeforeLast('/') + \"/\"\n\n window.fetch(url).then { response ->\n response.arrayBuffer()\n }.then { buffer ->\n val asset = loader.createAsset(buffer)\n if (asset != null) {\n // Add all entities to the scene so they become visible\n val entities = asset.getEntities()\n scene.addEntities(entities)\n\n // Get the animator from the asset instance for animation playback\n val animator = try {\n asset.getInstance().getAnimator()\n } catch (e: Throwable) {\n null\n }\n\n val loadedModel = LoadedModel(asset, animator)\n models.add(loadedModel)\n\n // Load external resources (textures, buffers) referenced by the glTF.\n // This is REQUIRED for models to render with correct materials.\n asset.loadResources(\n onDone = {\n // Release the source glTF data now that resources are loaded\n asset.releaseSourceData()\n console.log(\"SceneView: Model loaded from $url (${entities.size} entities)\")\n onLoaded?.invoke(asset)\n },\n onFetched = null,\n basePath = basePath,\n asyncInterval = null\n )\n } else {\n console.error(\"SceneView: AssetLoader failed to parse model from $url\")\n }\n }.catch { error ->\n console.error(\"SceneView: Error fetching model from $url\", error)\n }\n }\n\n /**\n * Load the default neutral IBL environment.\n * Provides physically-correct PBR reflections without a visible skybox —\n * models look like they're in a photography studio.\n */\n fun loadDefaultEnvironment() {\n loadEnvironment(DEFAULT_IBL_URL)\n }\n\n /** Load an IBL (Image-Based Lighting) from a KTX file URL. */\n fun loadEnvironment(iblUrl: String, skyboxUrl: String? = null) {\n // Fetch and create IBL (indirect lighting) from a KTX1 file\n window.fetch(iblUrl).then { it.arrayBuffer() }.then { buffer ->\n val ibl = engine.createIblFromKtx1(buffer)\n scene.setIndirectLight(ibl)\n console.log(\"SceneView: IBL loaded from $iblUrl\")\n }.catch { error ->\n console.error(\"SceneView: Error loading IBL from $iblUrl\", error)\n }\n\n // Optionally load a skybox from a separate KTX file\n skyboxUrl?.let { url ->\n window.fetch(url).then { it.arrayBuffer() }.then { buffer ->\n val skybox = engine.createSkyFromKtx1(buffer)\n scene.setSkybox(skybox)\n console.log(\"SceneView: Skybox loaded from $url\")\n }.catch { error ->\n console.error(\"SceneView: Error loading skybox from $url\", error)\n }\n }\n }\n\n /**\n * Add a light to the scene using the Filament LightManager Builder API.\n *\n * The Filament.js LightManager.Builder is accessed via:\n * Filament.LightManager.Builder(type).intensity(n).direction([x,y,z]).build(engine, entity)\n */\n fun addLight(config: LightConfig) {\n val entity = (js(\"Filament.EntityManager.get().create()\") as Entity)\n\n // Map our LightType enum to Filament's numeric type constants\n // In Filament.js: 0 = SUN, 1 = DIRECTIONAL, 2 = POINT, 3 = FOCUSED_SPOT, 4 = SPOT\n val lightType = when (config.type) {\n LightType.DIRECTIONAL -> 1\n LightType.POINT -> 2\n LightType.SPOT -> 4\n }\n\n // Use the Builder pattern: LightManager.Builder(type).intensity(...).build(engine, entity)\n val builder = LightManager.Builder(lightType)\n builder.intensity(config.intensity)\n builder.color(float3(\n config.colorR.toDouble(),\n config.colorG.toDouble(),\n config.colorB.toDouble()\n ))\n builder.castShadows(true)\n\n if (config.type == LightType.DIRECTIONAL) {\n builder.direction(float3(\n config.directionX.toDouble(),\n config.directionY.toDouble(),\n config.directionZ.toDouble()\n ))\n } else {\n builder.position(float3(\n config.positionX.toDouble(),\n config.positionY.toDouble(),\n config.positionZ.toDouble()\n ))\n builder.falloff(10.0)\n }\n\n builder.build(engine, entity)\n scene.addEntity(entity)\n lightEntities.add(entity)\n }\n\n /**\n * Add a procedural geometry primitive to the scene.\n *\n * Generates an in-memory GLB from the KMP core geometry generators\n * and loads it through the gltfio pipeline, giving geometry nodes\n * the same PBR material system as loaded glTF models.\n *\n * @param config Geometry configuration (type, size, color, position, scale)\n */\n fun addGeometry(config: GeometryConfig) {\n val glbBuffer = GeometryGLBBuilder.buildGLB(config)\n val loader = assetLoader ?: engine.createAssetLoader().also { assetLoader = it }\n\n try {\n val asset = loader.createAsset(glbBuffer)\n if (asset != null) {\n val entities = asset.getEntities()\n scene.addEntities(entities)\n\n val animator = try {\n asset.getInstance().getAnimator()\n } catch (e: Throwable) {\n null\n }\n\n models.add(LoadedModel(asset, animator))\n\n // Finalize the asset — loadResources uploads vertex/index buffers to GPU.\n // Even for self-contained GLBs (no external resources), this step is required.\n asset.loadResources(\n onDone = { asset.releaseSourceData() },\n onFetched = null,\n basePath = \"\",\n asyncInterval = null\n )\n console.log(\"SceneView: Geometry '${config.geometryType.name.lowercase()}' added\")\n } else {\n console.error(\"SceneView: Failed to create geometry asset for ${config.geometryType}\")\n }\n } catch (e: Throwable) {\n console.error(\"SceneView: Error creating geometry ${config.geometryType}\", e)\n }\n }\n\n /**\n * Auto-fit the camera to frame all loaded models.\n * Computes the bounding box of all assets and adjusts the orbit controller distance.\n */\n fun fitToModels() {\n if (models.isEmpty()) return\n val controller = cameraController ?: return\n\n // Compute the union bounding box of all loaded models\n var minX = Double.MAX_VALUE; var minY = Double.MAX_VALUE; var minZ = Double.MAX_VALUE\n var maxX = -Double.MAX_VALUE; var maxY = -Double.MAX_VALUE; var maxZ = -Double.MAX_VALUE\n\n for (model in models) {\n val aabb = model.asset.getBoundingBox()\n val mn: dynamic = aabb.min\n val mx: dynamic = aabb.max\n if ((mn[0] as Number).toDouble() < minX) minX = (mn[0] as Number).toDouble()\n if ((mn[1] as Number).toDouble() < minY) minY = (mn[1] as Number).toDouble()\n if ((mn[2] as Number).toDouble() < minZ) minZ = (mn[2] as Number).toDouble()\n if ((mx[0] as Number).toDouble() > maxX) maxX = (mx[0] as Number).toDouble()\n if ((mx[1] as Number).toDouble() > maxY) maxY = (mx[1] as Number).toDouble()\n if ((mx[2] as Number).toDouble() > maxZ) maxZ = (mx[2] as Number).toDouble()\n }\n\n val cx = (minX + maxX) / 2.0\n val cy = (minY + maxY) / 2.0\n val cz = (minZ + maxZ) / 2.0\n val dx = maxX - minX\n val dy = maxY - minY\n val dz = maxZ - minZ\n val radius = kotlin.math.sqrt(dx * dx + dy * dy + dz * dz) / 2.0\n\n controller.target(cx, cy, cz)\n controller.distance = radius * 2.5\n controller.minDistance = radius * 0.5\n controller.maxDistance = radius * 10.0\n }\n\n /** Clean up all Filament resources. */\n fun destroy() {\n stopRendering()\n cameraController?.dispose()\n\n // Destroy loaded assets\n assetLoader?.let { loader ->\n models.forEach { loader.destroyAsset(it.asset) }\n loader.delete()\n }\n models.clear()\n\n // Destroy light entities\n lightEntities.forEach { engine.destroyEntity(it) }\n lightEntities.clear()\n\n // Destroy core Filament objects\n engine.destroyRenderer(renderer)\n engine.destroyView(view)\n engine.destroyScene(scene)\n engine.destroyCameraComponent(cameraEntity)\n engine.destroySwapChain(swapChain)\n val filament: dynamic = js(\"Filament\")\n filament.Engine.destroy(engine)\n }\n\n /**\n * The render loop -- called every frame via requestAnimationFrame.\n *\n * Each frame:\n * 1. Auto-resizes viewport if CSS size changed\n * 2. Updates orbit camera controller (rotation, damping)\n * 3. Advances glTF animations\n * 4. Calls engine.execute() to process pending async operations\n * 5. Renders the frame via beginFrame/renderView/endFrame\n */\n private fun renderLoop(timestamp: Double) {\n if (!isRunning) return\n\n // Auto-resize viewport if canvas CSS size changed\n if (autoResize) {\n val w = canvas.clientWidth\n val h = canvas.clientHeight\n if (w > 0 && h > 0 && (w != canvas.width || h != canvas.height)) {\n resize(w, h)\n }\n }\n\n // Update orbit camera\n cameraController?.update()\n\n // Track animation time\n val deltaSeconds = if (lastTimestamp > 0) (timestamp - lastTimestamp) / 1000.0 else 0.0\n lastTimestamp = timestamp\n\n // Update glTF animations for all loaded models\n models.forEach { model ->\n model.animator?.let { animator ->\n val count = animator.getAnimationCount()\n if (count > 0) {\n model.animationTime += deltaSeconds\n val duration = animator.getAnimationDuration(0)\n if (duration > 0) {\n // Loop the animation\n model.animationTime = model.animationTime % duration\n }\n // In Filament.js, applyAnimation only takes the index.\n // The animation time is set by calling the animator at the right moment.\n // Actually, the gltfio$Animator.applyAnimation(index) applies the animation\n // at the CURRENT time set internally -- we need to advance it.\n // The proper way is: animator.applyAnimation(index) after setting time\n // via the asset's animation system.\n // For Filament.js, we use the asset instance animator which tracks time internally.\n animator.applyAnimation(0)\n animator.updateBoneMatrices()\n }\n }\n }\n\n // Process any pending async Filament operations (texture uploads, etc.)\n engine.execute()\n\n // Render frame\n if (renderer.beginFrame(swapChain)) {\n renderer.renderView(view)\n renderer.endFrame()\n }\n\n animationFrameId = window.requestAnimationFrame(::renderLoop)\n }\n}\n\n/**\n * DSL builder for SceneView configuration.\n */\nclass SceneViewBuilder(private val sceneView: SceneView) {\n private var cameraConfig: CameraConfig? = null\n private var lightConfig: LightConfig? = null\n private val modelConfigs = mutableListOf<ModelConfig>()\n private val geometryConfigs = mutableListOf<GeometryConfig>()\n private var iblUrl: String? = null\n private var skyboxUrl: String? = null\n private var cameraControlsEnabled = true\n private var autoRotateEnabled = false\n private var useDefaultEnvironment = true\n\n /** Configure the camera. */\n fun camera(block: CameraConfig.() -> Unit) {\n cameraConfig = CameraConfig().apply(block)\n }\n\n /** Configure a directional light. */\n fun light(block: LightConfig.() -> Unit) {\n lightConfig = LightConfig().apply(block)\n }\n\n /** Add a glTF/GLB model by URL. */\n fun model(url: String, block: ModelConfig.() -> Unit = {}) {\n modelConfigs.add(ModelConfig(url).apply(block))\n }\n\n /** Add a procedural geometry primitive (cube, sphere, cylinder, plane). */\n fun geometry(block: GeometryConfig.() -> Unit) {\n geometryConfigs.add(GeometryConfig().apply(block))\n }\n\n /** Set environment lighting from KTX IBL files. */\n fun environment(iblUrl: String, skyboxUrl: String? = null) {\n this.iblUrl = iblUrl\n this.skyboxUrl = skyboxUrl\n this.useDefaultEnvironment = false\n }\n\n /** Disable the default neutral IBL environment. */\n fun noEnvironment() {\n this.useDefaultEnvironment = false\n }\n\n /** Enable orbit camera controls (drag to orbit, scroll to zoom, touch). Enabled by default. */\n fun cameraControls(enabled: Boolean = true) {\n cameraControlsEnabled = enabled\n }\n\n /** Enable auto-rotation of the camera around the target. */\n fun autoRotate(enabled: Boolean = true) {\n autoRotateEnabled = enabled\n }\n\n internal fun apply() {\n cameraConfig?.applyTo(sceneView.camera)\n\n // If no explicit light was configured, add model-viewer-like 3-point lighting\n if (lightConfig != null) {\n sceneView.addLight(lightConfig!!)\n } else {\n // Key light — main directional, slightly warm\n val keyLight = LightConfig().apply {\n directional()\n intensity(50_000.0)\n direction(0.6f, -1.0f, -0.8f)\n }\n sceneView.addLight(keyLight)\n\n // Fill light — softer, from the opposite side\n val fillLight = LightConfig().apply {\n directional()\n intensity(25_000.0)\n direction(-0.6f, -0.5f, 0.8f)\n }\n sceneView.addLight(fillLight)\n\n // Rim/back light — highlights edges, cool tint\n val rimLight = LightConfig().apply {\n directional()\n intensity(30_000.0)\n color(0.85f, 0.9f, 1.0f) // slight cool tint\n direction(0.0f, -0.3f, 1.0f)\n }\n sceneView.addLight(rimLight)\n }\n\n // Load IBL environment for physically-correct PBR reflections\n if (iblUrl != null) {\n sceneView.loadEnvironment(iblUrl!!, skyboxUrl)\n } else if (useDefaultEnvironment) {\n // Load the bundled neutral IBL — same as Android SceneView default\n sceneView.loadDefaultEnvironment()\n }\n\n modelConfigs.forEach { config ->\n sceneView.loadModel(config.url, config.onLoaded)\n }\n geometryConfigs.forEach { config ->\n sceneView.addGeometry(config)\n }\n if (cameraControlsEnabled) {\n val cam = cameraConfig\n sceneView.enableCameraControls(\n distance = cam?.eyeZ ?: 5.0,\n targetX = cam?.targetX ?: 0.0,\n targetY = cam?.targetY ?: 0.0,\n targetZ = cam?.targetZ ?: 0.0,\n autoRotate = autoRotateEnabled\n )\n }\n }\n}\n","package io.github.sceneview.web\n\nimport kotlin.js.Promise\n\n/**\n * SceneViewer — the JavaScript-facing 3D viewer class.\n *\n * Instances are created via `sceneview.createViewer()` or `sceneview.modelViewer()`.\n * All methods use `@JsName` to ensure stable, unmangled names in compiled JS.\n *\n * ```js\n * sceneview.createViewer(\"canvas\").then(function(sv) {\n * sv.loadModel(\"model.glb\");\n * sv.setAutoRotate(true);\n * });\n * ```\n */\n@JsExport\n@JsName(\"SceneViewer\")\nclass SceneViewJS {\n private var _sceneView: SceneView? = null\n private var disposed = false\n\n internal fun attach(sv: SceneView) {\n _sceneView = sv\n }\n\n /**\n * Load a glTF/GLB model from a URL.\n * Returns a Promise that resolves with the URL when loaded.\n */\n @JsName(\"loadModel\")\n fun loadModel(url: String): Promise<String> {\n val sv = _sceneView ?: return Promise.reject(Throwable(\"SceneViewer not initialized\"))\n return Promise { resolve, reject ->\n try {\n sv.loadModel(url) {\n resolve(url)\n }\n } catch (e: Throwable) {\n reject(e)\n }\n }\n }\n\n /**\n * Load environment lighting from a KTX IBL file URL.\n */\n @JsName(\"setEnvironment\")\n fun setEnvironment(iblUrl: String) {\n _sceneView?.loadEnvironment(iblUrl, null)\n }\n\n /**\n * Load environment lighting with skybox.\n */\n @JsName(\"setEnvironmentWithSkybox\")\n fun setEnvironmentWithSkybox(iblUrl: String, skyboxUrl: String) {\n _sceneView?.loadEnvironment(iblUrl, skyboxUrl)\n }\n\n /**\n * Set the camera orbit position in spherical coordinates.\n * @param theta Horizontal angle in radians\n * @param phi Vertical angle in radians\n * @param distance Distance from target\n */\n @JsName(\"setCameraOrbit\")\n fun setCameraOrbit(theta: Double, phi: Double, distance: Double) {\n _sceneView?.cameraController?.let {\n it.theta = theta\n it.phi = phi\n it.distance = distance\n }\n }\n\n /**\n * Set the camera orbit target (look-at point).\n */\n @JsName(\"setCameraTarget\")\n fun setCameraTarget(x: Double, y: Double, z: Double) {\n _sceneView?.cameraController?.target(x, y, z)\n }\n\n /**\n * Enable or disable auto-rotation.\n */\n @JsName(\"setAutoRotate\")\n fun setAutoRotate(enabled: Boolean) {\n _sceneView?.cameraController?.autoRotate = enabled\n }\n\n /**\n * Set auto-rotation speed in radians per frame.\n */\n @JsName(\"setAutoRotateSpeed\")\n fun setAutoRotateSpeed(speed: Double) {\n _sceneView?.cameraController?.autoRotateSpeed = speed\n }\n\n /**\n * Set minimum and maximum zoom distances.\n */\n @JsName(\"setZoomLimits\")\n fun setZoomLimits(min: Double, max: Double) {\n _sceneView?.cameraController?.let {\n it.minDistance = min\n it.maxDistance = max\n }\n }\n\n /**\n * Start the render loop. Called automatically by createViewer().\n */\n @JsName(\"startRendering\")\n fun startRendering() {\n _sceneView?.startRendering()\n }\n\n /**\n * Stop the render loop.\n */\n @JsName(\"stopRendering\")\n fun stopRendering() {\n _sceneView?.stopRendering()\n }\n\n /**\n * Resize the viewport. Normally handled automatically.\n */\n @JsName(\"resize\")\n fun resize(width: Int, height: Int) {\n _sceneView?.resize(width, height)\n }\n\n /**\n * Set the background clear color (RGBA, 0-1 range).\n * Use this to sync the 3D canvas background with your page theme.\n */\n @JsName(\"setBackgroundColor\")\n fun setBackgroundColor(r: Double, g: Double, b: Double, a: Double) {\n val sv = _sceneView ?: return\n val opts = js(\"{}\")\n val color = js(\"[]\")\n color.push(r, g, b, a)\n opts[\"clearColor\"] = color\n opts[\"clear\"] = true\n sv.renderer.setClearOptions(opts)\n }\n\n /**\n * Fit the camera to frame all loaded models.\n */\n @JsName(\"fitToModels\")\n fun fitToModels() {\n _sceneView?.fitToModels()\n }\n\n /**\n * Clean up all GPU resources. Call when removing the viewer.\n */\n @JsName(\"dispose\")\n fun dispose() {\n if (!disposed) {\n disposed = true\n _sceneView?.destroy()\n _sceneView = null\n }\n }\n}\n\n/**\n * Library version.\n */\nconst val SCENEVIEW_VERSION = \"3.6.0\"\n","package io.github.sceneview.web.bindings\n\n// -----------------------------------------------------------------------\n// Helper functions for creating Filament.js array types.\n//\n// Filament.js uses number[] (JavaScript arrays) for float3, float4, mat4, etc.\n// These helpers create the arrays in a Kotlin/JS-friendly way.\n//\n// NOTE: These MUST NOT be in the @JsModule(\"filament\") file (Filament.kt)\n// because non-external declarations are not allowed in @JsModule files.\n// -----------------------------------------------------------------------\n\n/**\n * Create a float3 array [x, y, z] for Filament.js API calls.\n *\n * Used by Camera.lookAt, LightManager.Builder.direction/position/color, etc.\n */\nfun float3(x: Double, y: Double, z: Double): dynamic {\n val arr = js(\"[]\")\n arr.push(x, y, z)\n return arr\n}\n\n/**\n * Create a float4 array [x, y, z, w] for Filament.js API calls.\n *\n * Used by Renderer.setClearOptions, Skybox.setColor, etc.\n */\nfun float4(x: Double, y: Double, z: Double, w: Double): dynamic {\n val arr = js(\"[]\")\n arr.push(x, y, z, w)\n return arr\n}\n\n/**\n * Create a viewport array [x, y, width, height] for View.setViewport().\n */\nfun viewport(x: Int, y: Int, width: Int, height: Int): dynamic {\n val arr = js(\"[]\")\n arr.push(x, y, width, height)\n return arr\n}\n","package io.github.sceneview.web.nodes\n\nimport io.github.sceneview.web.bindings.Camera\nimport io.github.sceneview.web.bindings.float3\n\n/**\n * Camera configuration for SceneView web.\n *\n * ```kotlin\n * camera {\n * eye(0.0, 1.5, 5.0)\n * target(0.0, 0.0, 0.0)\n * up(0.0, 1.0, 0.0)\n * fov(45.0)\n * near(0.1)\n * far(1000.0)\n * }\n * ```\n */\nclass CameraConfig {\n var eyeX = 0.0; private set\n var eyeY = 1.5; private set\n var eyeZ = 5.0; private set\n var targetX = 0.0; private set\n var targetY = 0.0; private set\n var targetZ = 0.0; private set\n var upX = 0.0; private set\n var upY = 1.0; private set\n var upZ = 0.0; private set\n var fovDegrees = 45.0; private set\n var nearPlane = 0.1; private set\n var farPlane = 1000.0; private set\n // Exposure defaults — matching model-viewer's exposure=1.1\n var aperture = 16.0; private set\n var shutterSpeed = 1.0 / 125.0; private set\n var sensitivity = 100.0; private set\n var directExposure: Double? = 1.1; private set\n var useDirectExposure = true; private set\n\n fun eye(x: Double, y: Double, z: Double) {\n eyeX = x; eyeY = y; eyeZ = z\n }\n\n fun target(x: Double, y: Double, z: Double) {\n targetX = x; targetY = y; targetZ = z\n }\n\n fun up(x: Double, y: Double, z: Double) {\n upX = x; upY = y; upZ = z\n }\n\n fun fov(degrees: Double) { fovDegrees = degrees }\n fun near(value: Double) { nearPlane = value }\n fun far(value: Double) { farPlane = value }\n\n fun exposure(aperture: Double, shutterSpeed: Double, sensitivity: Double) {\n this.aperture = aperture\n this.shutterSpeed = shutterSpeed\n this.sensitivity = sensitivity\n this.useDirectExposure = false\n }\n\n /** Set exposure directly (model-viewer-style, default 1.1). Higher = brighter. */\n fun exposure(value: Double) {\n this.directExposure = value\n this.useDirectExposure = true\n }\n\n /** Apply this config to a Filament.js Camera using float3 arrays for lookAt. */\n fun applyTo(camera: Camera) {\n camera.lookAt(\n float3(eyeX, eyeY, eyeZ),\n float3(targetX, targetY, targetZ),\n float3(upX, upY, upZ)\n )\n if (useDirectExposure && directExposure != null) {\n camera.setExposureDirect(directExposure!!)\n } else {\n camera.setExposure(aperture, shutterSpeed, sensitivity)\n }\n }\n}\n","package io.github.sceneview.web.nodes\n\n/**\n * Light configuration for SceneView web.\n *\n * ```kotlin\n * light {\n * directional()\n * intensity(100_000.0)\n * color(1.0f, 1.0f, 1.0f)\n * direction(0.0f, -1.0f, -0.5f)\n * }\n * ```\n */\nclass LightConfig {\n var type = LightType.DIRECTIONAL; private set\n var intensity = 100_000.0; private set\n var colorR = 1.0f; private set\n var colorG = 1.0f; private set\n var colorB = 1.0f; private set\n var directionX = 0.0f; private set\n var directionY = -1.0f; private set\n var directionZ = -0.5f; private set\n var positionX = 0.0f; private set\n var positionY = 3.0f; private set\n var positionZ = 0.0f; private set\n\n fun directional() { type = LightType.DIRECTIONAL }\n fun point() { type = LightType.POINT }\n fun spot() { type = LightType.SPOT }\n\n fun intensity(value: Double) { intensity = value }\n\n fun color(r: Float, g: Float, b: Float) {\n colorR = r; colorG = g; colorB = b\n }\n\n fun direction(x: Float, y: Float, z: Float) {\n directionX = x; directionY = y; directionZ = z\n }\n\n fun position(x: Float, y: Float, z: Float) {\n positionX = x; positionY = y; positionZ = z\n }\n}\n\nenum class LightType {\n DIRECTIONAL,\n POINT,\n SPOT\n}\n",null,null,null,"module.exports = __WEBPACK_EXTERNAL_MODULE__650__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module used 'module' so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(607);\n"],"names":["root","factory","exports","module","require","define","amd","globalThis","__WEBPACK_EXTERNAL_MODULE__650__","vertices","indices","position","normal","uvCoordinate","color","size","center","extents","Float3","p0","p1","p2","p3","p4","p5","p6","p7","up","down","front","back","left","right","uv00","Float2","uv10","uv01","uv11","listOf","Vertex","i","base","GeometryData","radius","height","sideCount","halfHeight","thetaIncrement","theta","uStep","lowerCapVertices","upperCapVertices","upperEdgeVertices","side","lowerPosition","normalize","upperPosition","bottomRight","topLeft","topRight","lowerCenterIndex","upperCenterIndex","stacks","slices","stack","phi","slice","v","bottomCap","next","a","b","defaultConstructor","parent","interfaces","suspendArity","associatedObjectKey","associatedObjects","<this>","separator","prefix","postfix","limit","truncated","transform","buffer","count","element","other","name","ordinal","low","high","thisNeg","otherNeg","radix","radixLong","div","rem","digitsPerTime","radixToPower","result","remDiv","digits","value","a48","a32","a16","a00","b48","b32","b16","b00","c48","c32","c16","c00","twoPwr32","approx","numBits","res","approxDouble","approx2","log2","delta","approxRes","approxRem","index","ia","proto","o","instance","constructorFunction","constructor","message","cause","this_","ctor","kind","metadata","prototype","obj","collection","destination","iterator","initialCapacity","$this","array","jClass","givenSimpleName","isInstanceFunction","content","uppercase","ignoreCase","n1","n2","min","thisChar","otherChar","thisUpper","otherUpper","elements","modified","fromIndex","toIndex","offset","amount","previous","item","throwable","delimiter","missingDelimiterValue","char","startIndex","chars","maximumValue","charAtIndex","arr","endIndex","x","y","z","l","api","createViewerImpl","modelUrl","then","viewer","loadModel","console","log","canvasId","autoRotate","cameraControls","cameraX","cameraY","cameraZ","fov","lightIntensity","document","getElementById","Promise","reject","canvas","width","clientWidth","clientHeight","resolve","sceneView","window","addEventListener","e","event","button","clientX","clientY","preventDefault","dx","dy","deltaY","touches","length","pinchDistance","camera","setupEventListeners","asset","animator","animationTime","timestamp","w","h","deltaSeconds","getAnimationCount","duration","getAnimationDuration","applyAnimation","updateBoneMatrices","execute","beginFrame","renderView","endFrame","requestAnimationFrame","response","arrayBuffer","createAsset","entities","getEntities","addEntities","getInstance","getAnimator","loadedModel","LoadedModel","loadResources","releaseSourceData","error","it","engine","renderer","scene","view","swapChain","cameraEntity","push","config","geometryData","generateCube","generateSphere","generateCylinder","generatePlane","generateGeometryData","vertexCount","indexCount","positions","Float32Array","normals","minX","minY","minZ","maxX","maxY","maxZ","px","py","pz","n","indexArray","Uint16Array","toShort","bboxMin","bboxMax","posBytes","normBytes","idxBytes","typeName","node","translation","scale","rx","ry","rz","cx","sx","cy","sy","cz","sz","qx","qy","qz","qw","rotation","gltf","nodes","meshes","material","pbrMetallicRoughness","baseColorFactor","doubleSided","materials","posAccessor","type","max","normAccessor","idxAccessor","accessors","bv0","byteLength","target","bv1","byteOffset","bv2","bufferViews","binLength","binPad","binLengthAligned","buffers","buf","jsonStr","JSON","stringify","jsonLength","totalLength","glb","ArrayBuffer","DataView","setUint32","setUint8","toByte","glbBytes","Uint8Array","posBytes8","normBytes8","idxBytes8","buildGLBFromArrays","eyeX","eyeY","eyeZ","lookAt","float3","assets","configure","onReady","init","Engine","create","createRenderer","createScene","createSwapChain","createView","createCamera","setCamera","setScene","setViewport","viewport","aspect","setProjectionFov","setExposureDirect","setClearOptions","setAmbientOcclusionOptions","setBloomOptions","setTemporalAntiAliasingOptions","SceneView","builder","SceneViewBuilder","distance","targetX","targetY","targetZ","OrbitCameraController","controller","renderLoop","cancelAnimationFrame","url","onLoaded","createAssetLoader","loader","basePath","substringBeforeLast","fetch","catch","iblUrl","skyboxUrl","ibl","createIblFromKtx1","setIndirectLight","skybox","createSkyFromKtx1","setSkybox","entity","lightType","LightManager","Builder","intensity","castShadows","direction","falloff","build","addEntity","glbBuffer","aabb","getBoundingBox","mn","mx","dz","destroyAsset","delete","destroyEntity","destroyRenderer","destroyView","destroyScene","destroyCameraComponent","destroySwapChain","destroy","block","CameraConfig","LightConfig","enabled","keyLight","fillLight","rimLight","cam","sv","speed","r","g","opts","degrees","setExposure","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__"],"sourceRoot":""}
package/README.md DELETED
@@ -1,90 +0,0 @@
1
- # SceneView Web
2
-
3
- 3D rendering for browsers using **Filament.js** (WebGL2/WASM) — the same rendering engine as SceneView Android.
4
-
5
- ## Install
6
-
7
- ```bash
8
- npm install @sceneview/sceneview-web
9
- ```
10
-
11
- ## Quick Start
12
-
13
- ```html
14
- <canvas id="scene-canvas" style="width:100%;height:100vh"></canvas>
15
- <script src="sceneview-web.js"></script>
16
- ```
17
-
18
- ```kotlin
19
- SceneView.create(
20
- canvas = document.getElementById("scene-canvas") as HTMLCanvasElement,
21
- configure = {
22
- camera {
23
- eye(0.0, 1.5, 5.0)
24
- target(0.0, 0.0, 0.0)
25
- }
26
- model("models/DamagedHelmet.glb")
27
- },
28
- onReady = { it.startRendering() }
29
- )
30
- ```
31
-
32
- ## JavaScript API (sceneview.js v3.6.0)
33
-
34
- For browser usage without Kotlin, use `sceneview.js` directly:
35
-
36
- ```html
37
- <script src="https://cdn.jsdelivr.net/npm/sceneview-web@3.6.0/sceneview.js"></script>
38
- <script>
39
- SceneView.modelViewer("canvas", "model.glb", {
40
- backgroundColor: [0.05, 0.05, 0.08, 1],
41
- lightIntensity: 150000,
42
- fov: 35
43
- });
44
- </script>
45
- ```
46
-
47
- ### Full API
48
-
49
- | Method | Description |
50
- |---|---|
51
- | `SceneView.modelViewer(canvas, url, options?)` | One-line 3D model viewer |
52
- | `SceneView.create(canvas, options?)` | Create instance for full API |
53
- | `instance.loadModel(url)` | Load glTF/GLB model |
54
- | `instance.setAutoRotate(enabled)` | Toggle auto-rotation |
55
- | `instance.setCameraDistance(d)` | Set orbit camera distance |
56
- | `instance.setBackgroundColor(r, g, b, a?)` | Set clear color |
57
- | `instance.setQuality('low'\|'medium'\|'high')` | AO + anti-aliasing quality |
58
- | `instance.setBloom(true\|false\|options)` | Bloom post-processing |
59
- | `instance.addLight(options)` | Add directional/point/spot light |
60
- | `instance.createText(options)` | Render text as 3D quad |
61
- | `instance.createImage(options)` | Render image as 3D quad |
62
- | `instance.createVideo(options)` | Stream video to 3D quad |
63
- | `instance.removeNode(entity)` | Remove node from scene |
64
- | `instance.dispose()` | Clean up resources |
65
-
66
- ## Features
67
-
68
- - Same Filament PBR renderer as Android (compiled to WASM)
69
- - glTF 2.0 / GLB model loading
70
- - IBL environment lighting (KTX)
71
- - Camera configuration (FOV, position, exposure)
72
- - Directional, point, and spot lights
73
- - Animation playback
74
- - Quality presets (low/medium/high)
75
- - Bloom post-processing
76
- - Text, image, and video nodes
77
- - Billboard mode (always face camera)
78
- - Kotlin/JS DSL API + vanilla JavaScript API
79
-
80
- ## Requirements
81
-
82
- - WebGL2 browser (~95% coverage)
83
- - No AR support (requires native sensors)
84
-
85
- ## Part of SceneView
86
-
87
- SceneView is a declarative 3D/AR SDK for Android, iOS, macOS, visionOS, Web, and Desktop.
88
-
89
- - [GitHub](https://github.com/sceneview/sceneview)
90
- - [Documentation](https://sceneview.github.io)
@@ -1,2 +0,0 @@
1
- !function(t,n){"object"==typeof exports&&"object"==typeof module?module.exports=n(require("Filament")):"function"==typeof define&&define.amd?define(["Filament"],n):"object"==typeof exports?exports["sceneview-web"]=n(require("Filament")):t["sceneview-web"]=n(t.Filament)}(globalThis,t=>{return n={36(t,n){var i,e;"object"!=typeof globalThis&&(Object.defineProperty(Object.prototype,"__magic__",{get:function(){return this},configurable:!0}),__magic__.globalThis=__magic__,delete Object.prototype.__magic__),void 0===ArrayBuffer.isView&&(ArrayBuffer.isView=function(t){return null!=t&&null!=t.__proto__&&t.__proto__.__proto__===Int8Array.prototype.__proto__}),void 0===(e="function"==typeof(i=function(t){"use strict";var n,i,e,r,o,u=ArrayBuffer.isView;function s(){}function a(){}function c(t,n,e,r,o,u,s){return n=n===i?", ":n,e=e===i?"":e,r=r===i?"":r,o=o===i?-1:o,u=u===i?"...":u,s=s===i?null:s,function(t,n,e,r,o,u,s,a){e=e===i?", ":e,r=r===i?"":r,o=o===i?"":o,u=u===i?-1:u,s=s===i?"...":s,a=a===i?null:a,n.c(r);var c=0,l=0,h=t.length;t:for(;l<h;){var _=t[l];if(l=l+1|0,(c=c+1|0)>1&&n.c(e),!(u<0||c<=u))break t;Et(n,_,a)}return u>=0&&c>u&&n.c(s),n.c(o),n}(t,gt(),n,e,r,o,u,s).toString()}function l(t,n,e,r,o,u,s){return n=n===i?", ":n,e=e===i?"":e,r=r===i?"":r,o=o===i?-1:o,u=u===i?"...":u,s=s===i?null:s,function(t,n,e,r,o,u,s,a){e=e===i?", ":e,r=r===i?"":r,o=o===i?"":o,u=u===i?-1:u,s=s===i?"...":s,a=a===i?null:a,n.c(r);var c=0,l=t.d();t:for(;l.e();){var h=l.f();if((c=c+1|0)>1&&n.c(e),!(u<0||c<=u))break t;Et(n,h,a)}return u>=0&&c>u&&n.c(s),n.c(o),n}(t,gt(),n,e,r,o,u,s).toString()}function h(t){return t}function _(t){return String.fromCharCode(t)}function f(){}function v(){}function d(){}function p(t,n){this.j_1=t,this.k_1=n}function m(t){var n=null==t?null:S(t);return null==n?"null":n}function w(){}function g(t){for(var n=1,i=[],e=0,r=t.length;e<r;){var o=t[e];e=e+1|0;var u=n,s=o.prototype.$imask$,a=null==s?o.$imask$:s;null!=a&&(i.push(a),u=a.length);var c=o.$metadata$.iid,l=null==c?null:y(c);null!=l&&(i.push(l),u=Math.max(u,l.length)),u>n&&(n=u)}return function(t,n){for(var i=0,e=new Int32Array(t);i<t;){for(var r=i,o=0,u=0,s=n.length;u<s;){var a=n[u];u=u+1|0,r<a.length&&(o|=a[r])}e[r]=o,i=i+1|0}return e}(n,i)}function y(t){var n=t>>5,i=new Int32Array(n+1|0),e=1<<(31&t);return i[n]=i[n]|e,i}function b(t,n){return $(t)?function(t){return n=function(t){return t<<16>>16}(function(t){return t instanceof w?t.m():function(t){return t>2147483647?2147483647:t<-2147483648?-2147483648:0|t}(t)}(t)),65535&n;var n}(t.charCodeAt(n)):t.b(n)}function $(t){return"string"==typeof t}function x(t){return $(t)?t.length:t.a()}function E(t){return S(t)}function j(t){return t=t===i?null:t,Object.create(t)}function S(t){return null==t?"null":function(t){return n=t,Array.isArray(n)||u(t);var n}(t)?"[...]":"function"!=typeof t.toString?function(t){return Object.prototype.toString.call(t)}(t):t.toString()}function A(t,n){return null==t?null==n:null!=n&&("object"==typeof t&&"function"==typeof t.equals?t.equals(n):t!=t?n!=n:"number"==typeof t&&"number"==typeof n?t===n&&(0!==t||1/t==1/n):t===n)}function k(t,n){null!=Error.captureStackTrace?Error.captureStackTrace(t,n):t.stack=(new Error).stack}function C(t){return t.prototype}function M(t){return t===i}function O(t,n,e){Error.call(t),function(t,n,e){var r=N(Object.getPrototypeOf(t));if(!(1&r)){var o;if(null==n){var u;if(null!==n){var s=null==e?null:e.toString();u=null==s?i:s}else u=i;o=u}else o=n;t.message=o}2&r||(t.cause=e),t.name=Object.getPrototypeOf(t).constructor.name}(t,n,e)}function V(){throw mt()}function q(t,e,r,o,u,s,a,c,l){null!=u&&(e.prototype=Object.create(u.prototype),e.prototype.constructor=e);var h=function(t,e,r,o,u,s){return{kind:t,simpleName:e,associatedObjectKey:o,associatedObjects:u,suspendArity:s,$kClass$:i,defaultConstructor:r,iid:"interface"===t?(n===i&&(n=0),n=n+1|0):i}}(t,r,o,c,l,a);e.$metadata$=h,null!=s&&((A(h.iid,i)?e.prototype:e).$imask$=g(s))}function z(t,n,i,e,r,o,u,s){q("class",t,n,i,e,r,o,u,s)}function L(t,n,i,e,r,o,u,s){q("object",t,n,i,e,r,o,u,s)}function I(t,n,i,e,r,o,u,s){q("interface",t,n,i,e,r,o,u,s)}function F(t,n,e,r){L(t,"Companion",i,n,e,r,i,i)}function B(t,n){return function(t,n){var i=t.$imask$;return null!=i&&function(t,n){var i=n>>5;if(i>t.length)return!1;var e=1<<(31&n);return!(0===(t[i]&e))}(i,n)}(t,n.$metadata$.iid)}function N(t){var n=t.constructor,i=null==n?null:n.$metadata$,e=null==i?null:i.errorInfo;if(null!=e)return e;var r,o=0;if(P(t,"message")&&(o|=1),P(t,"cause")&&(o|=2),3!==o){var u=(r=t,Object.getPrototypeOf(r));u!=Error.prototype&&(o|=N(u))}return null!=i&&(i.errorInfo=o),o}function P(t,n){return t.hasOwnProperty(n)}function T(){}function R(t){return function(t){if(t.h())return[];for(var n=t.g(),i=Array(n),e=t.d(),r=0;e.e();){var o=r;r=o+1|0,i[o]=e.f()}return i}(t)}function D(){$t.call(this)}function Y(t){this.q_1=t,this.o_1=0,this.p_1=-1}function X(t,n){this.x_1=t,Y.call(this,t),o.z(n,this.x_1.g()),this.o_1=n}function W(){D.call(this),this.s_1=0}function U(){r=this;var t=function(t,n){var i=[];if(J.call(n,i),!(t>=0))throw Q(S("Negative initial capacity: "+t));return n}(0,j(C(J)));t.i1_1=!0,this.j1_1=t}function H(){return t=j(C(J)),J.call(t,[]),t;var t}function K(t,n){return o.k1(n,t.g()),n}function J(t){null==r&&new U,W.call(this),this.h1_1=t,this.i1_1=!1}function Z(t){return O(t),G.call(t),t}function G(){k(this,G)}function Q(t){var n=function(t,n){return ut(t,n),tt.call(n),n}(t,j(C(tt)));return k(n,Q),n}function tt(){k(this,tt)}function nt(t){var n=function(t,n){return ut(t,n),it.call(n),n}(t,j(C(it)));return k(n,nt),n}function it(){k(this,it)}function et(){var t,n=(ot(t=j(C(rt))),rt.call(t),t);return k(n,et),n}function rt(){k(this,rt)}function ot(t){return Z(t),st.call(t),t}function ut(t,n){return function(t,n){O(n,t),G.call(n)}(t,n),st.call(n),n}function st(){k(this,st)}function at(){var t,n=(ot(t=j(C(lt))),lt.call(t),t);return k(n,at),n}function ct(t){var n=function(t,n){return ut(t,n),lt.call(n),n}(t,j(C(lt)));return k(n,ct),n}function lt(){k(this,lt)}function ht(t){var n=function(t,n){return ut(t,n),_t.call(n),n}(t,j(C(_t)));return k(n,ht),n}function _t(){k(this,_t)}function ft(){var t,n=(ot(t=j(C(vt))),vt.call(t),t);return k(n,ft),n}function vt(){k(this,vt)}function dt(){var t,n=(ot(t=j(C(pt))),pt.call(t),t);return k(n,dt),n}function pt(){k(this,pt)}function mt(){var t,n=(ot(t=j(C(wt))),wt.call(t),t);return k(n,mt),n}function wt(){k(this,wt)}function gt(){return t=j(C(yt)),yt.call(t,""),t;var t}function yt(t){this.o1_1=t}function bt(t){var n=_(t).toUpperCase();return n.length>1?t:b(n,0)}function $t(){}function xt(){this.y_1=2147483639}function Et(t,n,i){var e;null!=i?t.c(i(n)):null==n||("string"==typeof(e=n)||B(e,s))?t.c(n):n instanceof f?t.p1(n.q1_1):t.c(S(n))}function jt(t,n,e){if(t===n)return!0;if(!(e=e!==i&&e))return!1;var r=bt(t),o=bt(n);return r===o||b(_(r).toLowerCase(),0)===b(_(o).toLowerCase(),0)}function St(t){return x(t)-1|0}return I(s,"CharSequence"),z(a,"Number"),z(f,"Char"),I(v,"List"),F(d),z(p,"Enum"),z(w,"Long",i,a),L(T,"Unit"),z($t,"AbstractCollection"),z(D,"AbstractMutableCollection",i,$t),z(Y,"IteratorImpl"),z(X,"ListIteratorImpl",i,Y),z(W,"AbstractMutableList",i,D,[D,v]),F(U),z(J,"ArrayList",H,W,[W,v]),z(G,"Exception",function t(){var n=Z(j(C(G)));return k(n,t),n},Error),z(st,"RuntimeException",function t(){var n=ot(j(C(st)));return k(n,t),n},G),z(tt,"IllegalArgumentException",function t(){var n,i=(ot(n=j(C(tt))),tt.call(n),n);return k(i,t),i},st),z(it,"IllegalStateException",function t(){var n,i=(ot(n=j(C(it))),it.call(n),n);return k(i,t),i},st),z(rt,"UnsupportedOperationException",et,st),z(lt,"NoSuchElementException",at,st),z(_t,"IndexOutOfBoundsException",function t(){var n,i=(ot(n=j(C(_t))),_t.call(n),n);return k(i,t),i},st),z(vt,"NullPointerException",ft,st),z(pt,"NoWhenBranchMatchedException",dt,st),z(wt,"ClassCastException",mt,st),z(yt,"StringBuilder",gt,i,[s]),F(xt),C(p).equals=function(t){return this===t},C(p).toString=function(){return this.j_1},C(w).m=function(){return this.l_1},C(T).toString=function(){return"kotlin.Unit"},C(D).toJSON=function(){return this.toArray()},C(D).n=function(){},C(Y).e=function(){return this.o_1<this.q_1.g()},C(Y).f=function(){if(!this.e())throw at();var t=this.o_1;return this.o_1=t+1|0,this.p_1=t,this.q_1.i(this.p_1)},C(Y).r=function(){if(-1===this.p_1)throw nt(S("Call next() or previous() before removing element from the iterator."));this.q_1.t(this.p_1),this.o_1=this.p_1,this.p_1=-1},C(W).b1=function(t){return this.n(),this.a1(this.g(),t),!0},C(W).c1=function(){this.n(),this.d1(0,this.g())},C(W).d=function(){return new Y(this)},C(W).e1=function(t){return new X(this,t)},C(W).d1=function(t,n){var i=this.e1(t),e=n-t|0,r=0;if(r<e)do{r=r+1|0,i.f(),i.r()}while(r<e)},C(W).equals=function(t){return t===this||!(null==t||!B(t,v))&&o.f1(this,t)},C(J).g=function(){return this.h1_1.length},C(J).i=function(t){var n=this.h1_1[K(this,t)];return null==n||null!=n?n:V()},C(J).b1=function(t){return this.n(),this.h1_1.push(t),this.s_1=this.s_1+1|0,!0},C(J).a1=function(t,n){this.n(),this.h1_1.splice(function(t,n){return o.z(n,t.g()),n}(this,t),0,n),this.s_1=this.s_1+1|0},C(J).t=function(t){return this.n(),K(this,t),this.s_1=this.s_1+1|0,t===(this.g()-1|0)?this.h1_1.pop():this.h1_1.splice(t,1)[0]},C(J).d1=function(t,n){this.n(),this.s_1=this.s_1+1|0,this.h1_1.splice(t,n-t|0)},C(J).c1=function(){this.n(),this.h1_1=[],this.s_1=this.s_1+1|0},C(J).toString=function(){return c(this.h1_1,", ","[","]",i,i,E)},C(J).l1=function(){return[].slice.call(this.h1_1)},C(J).toArray=function(){return this.l1()},C(J).n=function(){if(this.i1_1)throw et()},C(yt).a=function(){return this.o1_1.length},C(yt).b=function(t){var n=this.o1_1;if(!(0<=t&&t<=(x(n)-1|0)))throw ht("index: "+t+", length: "+this.a()+"}");return b(n,t)},C(yt).p1=function(t){return this.o1_1=this.o1_1+_(t),this},C(yt).c=function(t){return this.o1_1=this.o1_1+m(t),this},C(yt).toString=function(){return this.o1_1},C($t).h=function(){return 0===this.g()},C($t).toString=function(){return l(this,", ","[","]",i,i,(t=this,function(n){return n===t?"(this Collection)":m(n)}));var t},C($t).toArray=function(){return R(this)},C(xt).k1=function(t,n){if(t<0||t>=n)throw ht("index: "+t+", size: "+n)},C(xt).z=function(t,n){if(t<0||t>n)throw ht("index: "+t+", size: "+n)},C(xt).f1=function(t,n){if(t.g()!==n.g())return!1;for(var i=n.d(),e=t.d();e.e();)if(!A(e.f(),i.f()))return!1;return!0},new d,e=new T,o=new xt,t.$_$=t.$_$||{},t.$_$.a=i,t.$_$.b=H,t.$_$.c=h,t.$_$.d=e,t.$_$.e=z,t.$_$.f=F,t.$_$.g=function(t){return"number"==typeof t||t instanceof w},t.$_$.h=function(t,n){var e,r=new Error;if(M(t)){var o;if(M(n))o=t;else{var u=null==n?null:n.toString();o=null==u?i:u}e=o}else e=null==t?i:t;return r.message=e,r.cause=n,r.name="Throwable",r},t.$_$.i=function(t){return+t},t.$_$.j=C,t.$_$.k=function(t,n,e){e=e===i?t:e;var r=function(t,n,e,r){var o;if(e=e===i?St(t):e,(r=r!==i&&r)||"string"!=typeof t)o=function(t,n,e,r){if(e=e===i?St(t):e,!(r=r!==i&&r)&&1===n.length&&"string"==typeof t){var o=_(function(t){var n;switch(t.length){case 0:throw ct("Array is empty.");case 1:n=t[0];break;default:throw Q("Array has more than one element.")}return n}(n));return t.lastIndexOf(o,e)}var u=function(t,n){return t>n?n:t}(e,St(t));if(0<=u)do{var s=u;u=u+-1|0;var a,c=b(t,s);t:{for(var l=0,h=n.length;l<h;){var f=n[l];if(l=l+1|0,jt(f,c,r)){a=!0;break t}}a=!1}if(a)return s}while(0<=u);return-1}(t,(s=[n],a=new Uint16Array(s),a.$type$="CharArray",a),e,r);else{var u=_(n);o=t.lastIndexOf(u,e)}var s,a;return o}(t,n);return-1===r?e:t.substring(0,r)},t.$_$.l=p,t.$_$.m=V,t.$_$.n=function(t){var n;return null==t?function(){throw ft()}():n=t,n},t.$_$.o=function(){throw dt()},t})?i.apply(n,[n]):i)||(t.exports=e)},607(t,n,i){var e,r,o;r=[n,i(650),i(36)],void 0===(o="function"==typeof(e=function(t,n,i){"use strict";var e,r,o,u=n.Entity,s=n.init,a=n.LightManager,c=i.$_$.d,l=i.$_$.a,h=i.$_$.h,_=i.$_$.m,f=i.$_$.g,v=i.$_$.i,d=i.$_$.j,p=i.$_$.e,m=i.$_$.f,w=i.$_$.b,g=i.$_$.c,y=i.$_$.k,b=i.$_$.o,$=i.$_$.n,x=i.$_$.l;function E(){var t,n={version:"1.3.0"};n.createViewer=((t=function(t){return j(t,!0,!0)}).callableName="jsCreateViewer",t),n.createViewerAutoRotate=function(){var t=function(t,n){return j(t,n,!0)};return t.callableName="jsCreateViewerAutoRotate",t}(),n.createViewerFull=function(){var t=function(t,n,i,e,r,o,u,s){return j(t,n,i,e,r,o,u,s)};return t.callableName="jsCreateViewerFull",t}(),n.modelViewer=function(){var t=function(t,n){return i=n,j(t,!0,!0).then((e=i,function(t){return t.loadModel(e),t}));var i,e};return t.callableName="jsModelViewer",t}(),n.modelViewerAutoRotate=function(){var t=function(t,n,i){return e=n,j(t,i,!0).then((r=e,function(t){return t.loadModel(r),t}));var e,r};return t.callableName="jsModelViewerAutoRotate",t}(),window.sceneview=n,console.log("SceneView Web v1.3.0 loaded")}function j(t,n,i,r,o,u,s,a){r=r===l?0:r,o=o===l?1.5:o,u=u===l?5:u,s=s===l?45:s,a=a===l?5e4:a;var _=document.getElementById(t),f=_ instanceof HTMLCanvasElement?_:null;if(null==f)return Promise.reject(h("Canvas element '"+t+"' not found"));var v,d,p,m,w,g,y,b,$=f;return 0!==$.width&&0!==$.height||($.width=$.clientWidth,$.height=$.clientHeight),new Promise((v=$,d=n,p=i,m=r,w=o,g=u,y=s,b=a,function(t,n){try{var i=e,r=function(t,n,i,e,r,o,u){return function(s){return s.i3(function(t,n,i,e){return function(r){return r.i2(t,n,i),r.j2(0,0,0),r.k2(e),c}}(i,e,r,o)),s.j3(function(t){return function(n){return n.w2(),n.x2(t),n.y2(.6,-1,-.8),c}}(u)),s.k3(t),s.l3(n),c}}(d,p,m,w,g,y,b);i.i4(v,l,r,function(t,n){return function(i){i.c4(),window.addEventListener("resize",function(t){return function(n){return t.width=t.clientWidth,t.height=t.clientHeight,c}}(n));var e=new P;return e.f4(i),t(e),c}}(t,v))}catch(t){if(!(t instanceof Error))throw t;n(t)}return c}))}function S(t){var n;t.j4_1.addEventListener("mousedown",(n=t,function(t){var i=t instanceof MouseEvent?t:_(),e=i.button;return 0===e?n.e5_1=!0:2===e&&(n.f5_1=!0),n.g5_1=i.clientX,n.h5_1=i.clientY,i.preventDefault(),c})),t.j4_1.addEventListener("mousemove",function(t){return function(n){var i=n instanceof MouseEvent?n:_(),e=i.clientX-t.g5_1,r=i.clientY-t.h5_1;return t.g5_1=i.clientX,t.h5_1=i.clientY,t.e5_1?t.a5_1?(t.c5_1=-e*t.v4_1,t.d5_1=-r*t.v4_1):(t.l4_1=t.l4_1-e*t.v4_1,t.m4_1=t.m4_1-r*t.v4_1):t.f5_1&&(t.o4_1=t.o4_1+e*t.x4_1*t.n4_1,t.p4_1=t.p4_1-r*t.x4_1*t.n4_1),c}}(t)),t.j4_1.addEventListener("mouseup",function(t){return function(n){return t.e5_1=!1,t.f5_1=!1,c}}(t)),t.j4_1.addEventListener("mouseleave",function(t){return function(n){return t.e5_1=!1,t.f5_1=!1,c}}(t)),t.j4_1.addEventListener("wheel",function(t){return function(n){var i=n instanceof WheelEvent?n:_(),e=i.deltaY>0?1:-1;t.n4_1=t.n4_1*(1+e*t.w4_1);var r=t,o=t.r4_1,u=t.s4_1,s=t.n4_1,a=Math.min(u,s);return r.n4_1=Math.max(o,a),i.preventDefault(),c}}(t),{passive:!1}),t.j4_1.addEventListener("contextmenu",A),t.j4_1.addEventListener("touchstart",function(t){return function(n){var i=n;if(1==i.touches.length){t.e5_1=!0;var e=t,r=i.touches[0].clientX;e.g5_1=v(f(r)?r:_());var o=t,u=i.touches[0].clientY;o.h5_1=v(f(u)?u:_())}return n.preventDefault(),c}}(t),{passive:!1}),t.j4_1.addEventListener("touchmove",function(t){return function(n){var i=n;if(t.e5_1&&1==i.touches.length){var e=i.touches[0].clientX,r=v(f(e)?e:_())-t.g5_1,o=i.touches[0].clientY,u=v(f(o)?o:_())-t.h5_1,s=t,a=i.touches[0].clientX;s.g5_1=v(f(a)?a:_());var l=t,h=i.touches[0].clientY;l.h5_1=v(f(h)?h:_()),t.a5_1?(t.c5_1=-r*t.v4_1,t.d5_1=-u*t.v4_1):(t.l4_1=t.l4_1-r*t.v4_1,t.m4_1=t.m4_1-u*t.v4_1)}else if(2==i.touches.length){var d=i.touches[0].clientX,p=v(f(d)?d:_()),m=i.touches[1].clientX,w=p-v(f(m)?m:_()),g=i.touches[0].clientY,y=v(f(g)?g:_()),b=i.touches[1].clientY,$=y-v(f(b)?b:_()),x=w*w+$*$,E=Math.sqrt(x);if(t.i5_1>0){var j=t.i5_1-E;t.n4_1=t.n4_1*(1+.005*j);var S=t,A=t.r4_1,k=t.s4_1,C=t.n4_1,M=Math.min(k,C);S.n4_1=Math.max(A,M)}t.i5_1=E}return n.preventDefault(),c}}(t),{passive:!1}),t.j4_1.addEventListener("touchend",function(t){return function(n){return t.e5_1=!1,t.i5_1=-1,c}}(t))}function A(t){return t.preventDefault(),c}function k(t,n){this.j4_1=t,this.k4_1=n,this.l4_1=.7853981633974483,this.m4_1=1.2217304763960306,this.n4_1=5,this.o4_1=0,this.p4_1=0,this.q4_1=0,this.r4_1=.5,this.s4_1=50,this.t4_1=.1,this.u4_1=3.041592653589793,this.v4_1=.005,this.w4_1=.1,this.x4_1=.003,this.y4_1=!1,this.z4_1=.008726646259971648,this.a5_1=!0,this.b5_1=.95,this.c5_1=0,this.d5_1=0,this.e5_1=!1,this.f5_1=!1,this.g5_1=0,this.h5_1=0,S(this),this.i5_1=-1}function C(t){return c}function M(t,n,i){i=i===l?0:i,this.m5_1=t,this.n5_1=n,this.o5_1=i}function O(){this.g4_1="https://sceneview.github.io/assets/environments/neutral_ibl.ktx",this.h4_1="https://sceneview.github.io/assets/environments/neutral_skybox.ktx"}function V(t,n){if(!t.v3_1)return c;if(t.b4_1){var i=t.m3_1.clientWidth,e=t.m3_1.clientHeight;i>0&&e>0&&(i!==t.m3_1.width||e!==t.m3_1.height)&&t.q5(i,e)}var r=t.a4_1;null==r||r.j5();var o=t.w3_1>0?(n-t.w3_1)/1e3:0;t.w3_1=n;for(var u=t.x3_1.d();u.e();){var s=u.f(),a=s.n5_1;if(null==a);else if(a.getAnimationCount()>0){s.o5_1=s.o5_1+o;var l=a.getAnimationDuration(0);l>0&&(s.o5_1=s.o5_1%l),a.applyAnimation(0),a.updateBoneMatrices()}}t.n3_1.execute(),t.o3_1.beginFrame(t.s3_1)&&(t.o3_1.renderView(t.q3_1),t.o3_1.endFrame());var h,_,f=window;t.u3_1=f.requestAnimationFrame((h=t,(_=function(t){return V(h,t),c}).callableName="renderLoop",_))}function q(t){return t.arrayBuffer()}function z(t,n,i,e,r){return function(o){var u=t.createAsset(o);if(null!=u){var s,a=u.getEntities();n.p3_1.addEntities(a);try{s=u.getInstance().getAnimator()}catch(t){if(!(t instanceof Error))throw t;s=null}var l=new M(u,s);n.x3_1.b1(l),u.loadResources(function(t,n,i,e){return function(){return t.releaseSourceData(),console.log("SceneView: Model loaded from "+n+" ("+i.length+" entities)"),null==e||e(t),c}}(u,e,a,r),null,i,null)}else console.error("SceneView: AssetLoader failed to parse model from "+e);return c}}function L(t){return t.arrayBuffer()}function I(t){return t.arrayBuffer()}function F(t,n,i,e,r,o,u,s){this.m3_1=t,this.n3_1=n,this.o3_1=i,this.p3_1=e,this.q3_1=r,this.r3_1=o,this.s3_1=u,this.t3_1=s,this.u3_1=null,this.v3_1=!1,this.w3_1=0,this.x3_1=w(),this.y3_1=null,this.z3_1=w(),this.a4_1=null,this.b4_1=!0}function B(t){this.z2_1=t,this.a3_1=null,this.b3_1=null,this.c3_1=w(),this.d3_1=null,this.e3_1=null,this.f3_1=!0,this.g3_1=!1,this.h3_1=!0}function N(t,n){return function(i,e){try{t.t5(n,function(t,n){return function(i){return t(n),c}}(i,n))}catch(t){if(!(t instanceof Error))throw t;e(t)}return c}}function P(){this.d4_1=null,this.e4_1=!1}function T(t,n,i){var e=[];return e.push(t,n,i),e}function R(t,n,i,e){var r=[];return r.push(t,n,i,e),r}function D(){this.r1_1=0,this.s1_1=1.5,this.t1_1=5,this.u1_1=0,this.v1_1=0,this.w1_1=0,this.x1_1=0,this.y1_1=1,this.z1_1=0,this.a2_1=45,this.b2_1=.1,this.c2_1=1e3,this.d2_1=16,this.e2_1=.008,this.f2_1=100,this.g2_1=1.1,this.h2_1=!0}function Y(){this.l2_1=W(),this.m2_1=1e5,this.n2_1=1,this.o2_1=1,this.p2_1=1,this.q2_1=0,this.r2_1=-1,this.s2_1=-.5,this.t2_1=0,this.u2_1=3,this.v2_1=0}function X(t,n){x.call(this,t,n)}function W(){return function(){if(o)return c;o=!0,r=new X("DIRECTIONAL",0),new X("POINT",1),new X("SPOT",2)}(),r}return p(k,"OrbitCameraController"),p(M,"LoadedModel"),m(O),p(F,"SceneView"),p(B,"SceneViewBuilder"),p(P,"SceneViewJS",P),p(D,"CameraConfig",D),p(Y,"LightConfig",Y),p(X,"LightType",l,x),d(k).j2=function(t,n,i){this.o4_1=t,this.p4_1=n,this.q4_1=i},d(k).j5=function(){this.y4_1&&!this.e5_1&&(this.l4_1=this.l4_1+this.z4_1),this.a5_1&&(this.l4_1=this.l4_1+this.c5_1,this.m4_1=this.m4_1+this.d5_1,this.c5_1=this.c5_1*this.b5_1,this.d5_1=this.d5_1*this.b5_1);var t=this.t4_1,n=this.u4_1,i=this.m4_1,e=Math.min(n,i);this.m4_1=Math.max(t,e);var r=this.r4_1,o=this.s4_1,u=this.n4_1,s=Math.min(o,u);this.n4_1=Math.max(r,s);var a=this.o4_1,c=this.n4_1,l=this.m4_1,h=c*Math.sin(l),_=this.l4_1,f=a+h*Math.sin(_),v=this.p4_1,d=this.n4_1,p=this.m4_1,m=v+d*Math.cos(p),w=this.q4_1,g=this.n4_1,y=this.m4_1,b=g*Math.sin(y),$=this.l4_1,x=w+b*Math.cos($);this.k4_1.lookAt(T(f,m,x),T(this.o4_1,this.p4_1,this.q4_1),T(0,1,0))},d(k).k5=function(){},d(O).p5=function(t,n,i,e){var r,o,a;s(n,(r=t,o=i,a=e,function(){try{var t=Filament.Engine.create(r),n=t.createRenderer(),i=t.createScene(),e=t.createSwapChain(),s=t.createView(),l=Filament.EntityManager.get().create(),h=l instanceof u?l:_(),f=t.createCamera(h);s.setCamera(f),s.setScene(i);var v=r.width,d=r.height;s.setViewport(R(0,0,v,d));var p=d>0?v/d:1;f.setProjectionFov(45,p,.1,1e3),f.lookAt(T(0,1.5,5),T(0,0,0),T(0,1,0)),f.setExposureDirect(1.1),n.setClearOptions({clearColor:[.05,.05,.07,1],clear:!0}),s.setAmbientOcclusionOptions({enabled:!0,radius:.3,bias:5e-4,intensity:1,quality:1}),s.setBloomOptions({enabled:!0,strength:.1,threshold:!0,levels:4}),s.setTemporalAntiAliasingOptions({enabled:!0});var m=new F(r,t,n,i,s,f,e,h),w=new B(m);o(w),w.l5(),a(m)}catch(t){if(!(t instanceof Error))throw t;var g=t;console.error("SceneView: Failed to initialize Filament engine",g)}return c}))},d(O).i4=function(t,n,i,e,r){var o;return n=n===l?[]:n,i=i===l?C:i,r===l?(this.p5(t,n,i,e),o=c):o=r.p5.call(this,t,n,i,e),o},d(F).r5=function(t,n,i,e,r){var o=new k(this.m3_1,this.r3_1);o.n4_1=t,o.j2(n,i,e),o.y4_1=r;var u=o;return this.a4_1=u,u},d(F).q5=function(t,n){if(t<=0||n<=0)return c;this.m3_1.width=t,this.m3_1.height=n,this.q3_1.setViewport(R(0,0,t,n)),this.r3_1.setProjectionFov(45,t/n,.1,1e3)},d(F).c4=function(){if(this.v3_1)return c;this.v3_1=!0,this.w3_1=0,V(this,0)},d(F).s5=function(){this.v3_1=!1;var t=this.u3_1;null==t||window.cancelAnimationFrame(t),this.u3_1=null},d(F).t5=function(t,n){var i,e=this.y3_1;if(null==e){var r=this.n3_1.createAssetLoader();this.y3_1=r,i=r}else i=e;var o,u=i,s=y(t,g(47))+"/",a=window.fetch(t).then(q),l=z(u,this,s,t,n);a.then(l).catch((o=t,function(t){return console.error("SceneView: Error fetching model from "+o,t),c}))},d(F).u5=function(){this.v5("https://sceneview.github.io/assets/environments/neutral_ibl.ktx")},d(F).w5=function(t,n){var i,e,r,o=window.fetch(t).then(L),u=(i=this,e=t,function(t){var n=i.n3_1.createIblFromKtx1(t);return i.p3_1.setIndirectLight(n),console.log("SceneView: IBL loaded from "+e),c});if(o.then(u).catch(function(t){return function(n){return console.error("SceneView: Error loading IBL from "+t,n),c}}(t)),null==n);else{var s=window.fetch(n).then(I),a=function(t,n){return function(i){var e=t.n3_1.createSkyFromKtx1(i);return t.p3_1.setSkybox(e),console.log("SceneView: Skybox loaded from "+n),c}}(this,n);s.then(a).catch((r=n,function(t){return console.error("SceneView: Error loading skybox from "+r,t),c}))}},d(F).v5=function(t,n,i){var e;return n=n===l?null:n,i===l?(this.w5(t,n),e=c):e=i.w5.call(this,t,n),e},d(F).x5=function(t){var n,i=Filament.EntityManager.get().create(),e=i instanceof u?i:_();switch(t.l2_1.k_1){case 0:n=1;break;case 1:n=2;break;case 2:n=4;break;default:b()}var r=n,o=a.Builder(r);o.intensity(t.m2_1),o.color(T(t.n2_1,t.o2_1,t.p2_1)),o.castShadows(!0),t.l2_1.equals(W())?o.direction(T(t.q2_1,t.r2_1,t.s2_1)):(o.position(T(t.t2_1,t.u2_1,t.v2_1)),o.falloff(10)),o.build(this.n3_1,e),this.p3_1.addEntity(e),this.z3_1.b1(e)},d(F).y5=function(){if(this.x3_1.h())return c;var t=this.a4_1;if(null==t)return c;for(var n=t,i=17976931348623157e292,e=17976931348623157e292,r=17976931348623157e292,o=-17976931348623157e292,u=-17976931348623157e292,s=-17976931348623157e292,a=this.x3_1.d();a.e();){var l=a.f().m5_1.getBoundingBox(),h=l.min,d=l.max,p=h[0];if(v(f(p)?p:_())<i){var m=h[0];i=v(f(m)?m:_())}var w=h[1];if(v(f(w)?w:_())<e){var g=h[1];e=v(f(g)?g:_())}var y=h[2];if(v(f(y)?y:_())<r){var b=h[2];r=v(f(b)?b:_())}var $=d[0];if(v(f($)?$:_())>o){var x=d[0];o=v(f(x)?x:_())}var E=d[1];if(v(f(E)?E:_())>u){var j=d[1];u=v(f(j)?j:_())}var S=d[2];if(v(f(S)?S:_())>s){var A=d[2];s=v(f(A)?A:_())}}var k=(i+o)/2,C=(e+u)/2,M=(r+s)/2,O=o-i,V=u-e,q=s-r,z=O*O+V*V+q*q,L=Math.sqrt(z)/2;n.j2(k,C,M),n.n4_1=2.5*L,n.r4_1=.5*L,n.s4_1=10*L},d(F).z5=function(){this.s5();var t=this.a4_1;null==t||t.k5();var n=this.y3_1;if(null==n);else{for(var i=this.x3_1.d();i.e();){var e=i.f();n.destroyAsset(e.m5_1)}n.delete()}this.x3_1.c1();for(var r=this.z3_1.d();r.e();){var o=r.f();this.n3_1.destroyEntity(o)}this.z3_1.c1(),this.n3_1.destroyRenderer(this.o3_1),this.n3_1.destroyView(this.q3_1),this.n3_1.destroyScene(this.p3_1),this.n3_1.destroyCameraComponent(this.t3_1),this.n3_1.destroySwapChain(this.s3_1),Filament.Engine.destroy(this.n3_1)},d(B).i3=function(t){var n=new D;t(n),this.a3_1=n},d(B).j3=function(t){var n=new Y;t(n),this.b3_1=n},d(B).l3=function(t){this.f3_1=t},d(B).k3=function(t){this.g3_1=t},d(B).l5=function(){var t=this.a3_1;if(null==t||t.a6(this.z2_1.r3_1),null!=this.b3_1)this.z2_1.x5($(this.b3_1));else{var n=new Y;n.w2(),n.x2(5e4),n.y2(.6,-1,-.8);var i=n;this.z2_1.x5(i);var e=new Y;e.w2(),e.x2(25e3),e.y2(-.6,-.5,.8);var r=e;this.z2_1.x5(r);var o=new Y;o.w2(),o.x2(3e4),o.b6(.85,.9,1),o.y2(0,-.3,1);var u=o;this.z2_1.x5(u)}null!=this.d3_1?this.z2_1.w5($(this.d3_1),this.e3_1):this.h3_1&&this.z2_1.u5();for(var s=this.c3_1.d();s.e();){var a=s.f();this.z2_1.t5(a.c6_1,a.d6_1)}if(this.f3_1){var c=this.a3_1,l=null==c?null:c.t1_1,h=null==l?5:l,_=null==c?null:c.u1_1,f=null==_?0:_,v=null==c?null:c.v1_1,d=null==v?0:v,p=null==c?null:c.w1_1;this.z2_1.r5(h,f,d,null==p?0:p,this.g3_1)}},d(P).f4=function(t){this.d4_1=t},d(P).loadModel=function(t){var n=this.d4_1;return null==n?Promise.reject(h("SceneViewer not initialized")):new Promise(N(n,t))},d(P).setEnvironment=function(t){var n=this.d4_1;null==n||n.w5(t,null)},d(P).setEnvironmentWithSkybox=function(t,n){var i=this.d4_1;null==i||i.w5(t,n)},d(P).setCameraOrbit=function(t,n,i){var e=this.d4_1,r=null==e?null:e.a4_1;null==r||(r.l4_1=t,r.m4_1=n,r.n4_1=i)},d(P).setCameraTarget=function(t,n,i){var e=this.d4_1,r=null==e?null:e.a4_1;null==r||r.j2(t,n,i)},d(P).setAutoRotate=function(t){var n=this.d4_1,i=null==n?null:n.a4_1;null==i||(i.y4_1=t)},d(P).setAutoRotateSpeed=function(t){var n=this.d4_1,i=null==n?null:n.a4_1;null==i||(i.z4_1=t)},d(P).setZoomLimits=function(t,n){var i=this.d4_1,e=null==i?null:i.a4_1;null==e||(e.r4_1=t,e.s4_1=n)},d(P).startRendering=function(){var t=this.d4_1;null==t||t.c4()},d(P).stopRendering=function(){var t=this.d4_1;null==t||t.s5()},d(P).resize=function(t,n){var i=this.d4_1;null==i||i.q5(t,n)},d(P).setBackgroundColor=function(t,n,i,e){var r=this.d4_1;if(null==r)return c;var o=r,u={},s=[];s.push(t,n,i,e),u.clearColor=s,u.clear=!0,o.o3_1.setClearOptions(u)},d(P).fitToModels=function(){var t=this.d4_1;null==t||t.y5()},d(P).dispose=function(){if(!this.e4_1){this.e4_1=!0;var t=this.d4_1;null==t||t.z5(),this.d4_1=null}},d(D).i2=function(t,n,i){this.r1_1=t,this.s1_1=n,this.t1_1=i},d(D).j2=function(t,n,i){this.u1_1=t,this.v1_1=n,this.w1_1=i},d(D).k2=function(t){this.a2_1=t},d(D).a6=function(t){t.lookAt(T(this.r1_1,this.s1_1,this.t1_1),T(this.u1_1,this.v1_1,this.w1_1),T(this.x1_1,this.y1_1,this.z1_1)),this.h2_1&&null!=this.g2_1?t.setExposureDirect($(this.g2_1)):t.setExposure(this.d2_1,this.e2_1,this.f2_1)},d(Y).w2=function(){this.l2_1=W()},d(Y).x2=function(t){this.m2_1=t},d(Y).b6=function(t,n,i){this.n2_1=t,this.o2_1=n,this.p2_1=i},d(Y).y2=function(t,n,i){this.q2_1=t,this.r2_1=n,this.s2_1=i},e=new O,function(t){var n=t.io||(t.io={}),i=n.github||(n.github={}),e=i.sceneview||(i.sceneview={});(e.web||(e.web={})).SceneViewer=P}(t),E(),t})?e.apply(n,r):e)||(t.exports=o)},650(n){"use strict";n.exports=t}},i={},function t(e){var r=i[e];if(void 0!==r)return r.exports;var o=i[e]={exports:{}};return n[e](o,o.exports,t),o.exports}(607);var n,i});
2
- //# sourceMappingURL=sceneview-web.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sceneview-web.js","mappings":"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","sources":["webpack://sceneview-web/webpack/universalModuleDefinition","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/runtime/globalThis.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/src/kotlin/ArrayBuffer.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/common/src/generated/_Arrays.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/common/src/generated/_Collections.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/builtins/Char.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/builtins/Enum.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/builtins/Library.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/runtime/BitMask.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/runtime/charSequenceJs.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/runtime/numberConversion.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/unsigned/src/kotlin/UShort.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/runtime/collectionsHacks.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/runtime/coreRuntime.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/runtime/typeCheckUtils.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/runtime/hacks.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/runtime/metadataUtils.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/src/kotlin/util/Standard.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/src/kotlin/Unit.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/src/kotlin/collectionJs.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/src/kotlin/collections/Collections.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/src/kotlin/kotlin.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/src/kotlin/collections/AbstractMutableCollection.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/src/kotlin/collections/AbstractMutableList.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/src/kotlin/collections/ArrayList.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/src/kotlin/util/Preconditions.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/src/kotlin/exceptions.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/src/kotlin/text/StringBuilderJs.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/src/kotlin/text/charJs.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/src/kotlin/collections/AbstractCollection.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/src/kotlin/collections/AbstractList.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/src/kotlin/text/Appendable.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/src/kotlin/text/Char.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/src/kotlin/text/Strings.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/builtins/Primitives.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/common/src/generated/_Strings.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/src/kotlin/text/stringsCode.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/src/kotlin/text/stringJs.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/common/src/generated/_Ranges.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/runtime/arrays.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/runtime/noPackageHacks.kt","webpack://sceneview-web/../../../../sceneview-web/src/jsMain/kotlin/io/github/sceneview/web/Main.kt","webpack://sceneview-web/../../../../sceneview-web/src/jsMain/kotlin/io/github/sceneview/web/OrbitCameraController.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/src/kotlin/math.kt","webpack://sceneview-web/../../../../sceneview-web/src/jsMain/kotlin/io/github/sceneview/web/SceneView.kt","webpack://sceneview-web/../../../../sceneview-web/src/jsMain/kotlin/io/github/sceneview/web/SceneViewJS.kt","webpack://sceneview-web/../../../../sceneview-web/src/jsMain/kotlin/io/github/sceneview/web/bindings/FilamentHelpers.kt","webpack://sceneview-web/../../../../sceneview-web/src/jsMain/kotlin/io/github/sceneview/web/nodes/CameraConfig.kt","webpack://sceneview-web/../../../../sceneview-web/src/jsMain/kotlin/io/github/sceneview/web/nodes/LightConfig.kt","webpack://sceneview-web/../../../../../sceneview-web/build/compileSync/js/main/productionExecutable/kotlin/js/src/kotlin/promise.kt","webpack://sceneview-web/external umd \"Filament\"","webpack://sceneview-web/webpack/bootstrap","webpack://sceneview-web/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"Filament\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"Filament\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"sceneview-web\"] = factory(require(\"Filament\"));\n\telse\n\t\troot[\"sceneview-web\"] = factory(root[\"Filament\"]);\n})(globalThis, (__WEBPACK_EXTERNAL_MODULE__650__) => {\nreturn ",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"package io.github.sceneview.web\n\nimport kotlinx.browser.document\nimport kotlinx.browser.window\nimport org.w3c.dom.HTMLCanvasElement\nimport kotlin.js.Promise\n\n/**\n * Entry point for the SceneView Web library.\n *\n * Registers the SceneView API on `window.sceneview` so it can be used\n * from plain JavaScript after loading via `<script>` tag.\n *\n * Usage:\n * ```html\n * <script src=\"sceneview-web.js\"></script>\n * <script>\n * sceneview.createViewer(\"canvas\").then(sv => sv.loadModel(\"model.glb\"));\n * </script>\n * ```\n */\nfun main() {\n // Register the API on the global window object\n val api: dynamic = js(\"{}\")\n\n api[\"version\"] = SCENEVIEW_VERSION\n api[\"createViewer\"] = ::jsCreateViewer\n api[\"createViewerAutoRotate\"] = ::jsCreateViewerAutoRotate\n api[\"createViewerFull\"] = ::jsCreateViewerFull\n api[\"modelViewer\"] = ::jsModelViewer\n api[\"modelViewerAutoRotate\"] = ::jsModelViewerAutoRotate\n\n js(\"window\")[\"sceneview\"] = api\n\n console.log(\"SceneView Web v$SCENEVIEW_VERSION loaded\")\n}\n\n// --- JS-callable bridge functions ---\n// These use explicit types that map cleanly to JavaScript\n\nfun jsCreateViewer(canvasId: String): Promise<SceneViewJS> {\n return createViewerImpl(canvasId, autoRotate = true, cameraControls = true)\n}\n\nfun jsCreateViewerAutoRotate(canvasId: String, autoRotate: Boolean): Promise<SceneViewJS> {\n return createViewerImpl(canvasId, autoRotate = autoRotate, cameraControls = true)\n}\n\nfun jsCreateViewerFull(\n canvasId: String,\n autoRotate: Boolean,\n cameraControls: Boolean,\n cameraX: Double,\n cameraY: Double,\n cameraZ: Double,\n fov: Double,\n lightIntensity: Double\n): Promise<SceneViewJS> {\n return createViewerImpl(canvasId, autoRotate, cameraControls, cameraX, cameraY, cameraZ, fov, lightIntensity)\n}\n\nfun jsModelViewer(canvasId: String, modelUrl: String): Promise<SceneViewJS> {\n return createViewerImpl(canvasId, autoRotate = true, cameraControls = true).then { viewer ->\n viewer.loadModel(modelUrl)\n viewer\n }\n}\n\nfun jsModelViewerAutoRotate(canvasId: String, modelUrl: String, autoRotate: Boolean): Promise<SceneViewJS> {\n return createViewerImpl(canvasId, autoRotate = autoRotate, cameraControls = true).then { viewer ->\n viewer.loadModel(modelUrl)\n viewer\n }\n}\n\n// --- Internal implementation ---\n\ninternal fun createViewerImpl(\n canvasId: String,\n autoRotate: Boolean,\n cameraControls: Boolean,\n cameraX: Double = 0.0,\n cameraY: Double = 1.5,\n cameraZ: Double = 5.0,\n fov: Double = 45.0,\n lightIntensity: Double = 50_000.0\n): Promise<SceneViewJS> {\n val canvas = document.getElementById(canvasId) as? HTMLCanvasElement\n ?: return Promise.reject(Throwable(\"Canvas element '$canvasId' not found\"))\n\n // Ensure canvas has physical pixel dimensions\n if (canvas.width == 0 || canvas.height == 0) {\n canvas.width = canvas.clientWidth\n canvas.height = canvas.clientHeight\n }\n\n return Promise { resolve, reject ->\n try {\n SceneView.create(\n canvas = canvas,\n configure = {\n camera {\n eye(cameraX, cameraY, cameraZ)\n target(0.0, 0.0, 0.0)\n fov(fov)\n }\n light {\n directional()\n intensity(lightIntensity)\n direction(0.6f, -1.0f, -0.8f)\n }\n autoRotate(autoRotate)\n cameraControls(cameraControls)\n },\n onReady = { sceneView ->\n sceneView.startRendering()\n\n // Auto-resize on window resize\n window.addEventListener(\"resize\", {\n canvas.width = canvas.clientWidth\n canvas.height = canvas.clientHeight\n })\n\n val viewer = SceneViewJS()\n viewer.attach(sceneView)\n resolve(viewer)\n }\n )\n } catch (e: Throwable) {\n reject(e)\n }\n }\n}\n","package io.github.sceneview.web\n\nimport io.github.sceneview.web.bindings.Camera\nimport io.github.sceneview.web.bindings.float3\nimport kotlinx.browser.window\nimport org.w3c.dom.HTMLCanvasElement\nimport org.w3c.dom.events.MouseEvent\nimport org.w3c.dom.events.WheelEvent\nimport kotlin.math.PI\nimport kotlin.math.cos\nimport kotlin.math.max\nimport kotlin.math.min\nimport kotlin.math.sin\n\n/**\n * Orbit camera controller for SceneView Web.\n *\n * Provides mouse/touch-based orbit, zoom, and pan controls similar to\n * three.js OrbitControls or Google model-viewer's camera-controls.\n *\n * Usage:\n * ```kotlin\n * val controller = OrbitCameraController(canvas, sceneView.camera)\n * controller.target(0.0, 0.0, 0.0)\n * controller.distance = 5.0\n * // Call update() each frame in the render loop\n * ```\n */\nclass OrbitCameraController(\n private val canvas: HTMLCanvasElement,\n private val camera: Camera\n) {\n // Spherical coordinates — defaults match model-viewer's \"45deg 70deg 2.5m\"\n var theta = 45.0 * PI / 180.0 // horizontal angle (radians) — 45° like model-viewer\n var phi = 70.0 * PI / 180.0 // vertical angle (radians) — 70° like model-viewer\n var distance = 5.0 // distance from target\n\n // Target point (orbit center)\n var targetX = 0.0\n var targetY = 0.0\n var targetZ = 0.0\n\n // Limits\n var minDistance = 0.5\n var maxDistance = 50.0\n var minPhi = 0.1 // prevent looking straight down\n var maxPhi = PI - 0.1 // prevent looking straight up\n\n // Sensitivity\n var rotateSensitivity = 0.005\n var zoomSensitivity = 0.1\n var panSensitivity = 0.003\n\n // Auto-rotation — default speed matches model-viewer's 30deg/sec at 60fps\n var autoRotate = false\n var autoRotateSpeed = 30.0 * PI / 180.0 / 60.0 // 30°/sec ÷ 60fps ≈ 0.00873 rad/frame\n\n // Damping (inertia) — higher factor = smoother, more model-viewer-like\n var enableDamping = true\n var dampingFactor = 0.95\n private var velocityTheta = 0.0\n private var velocityPhi = 0.0\n\n // Mouse state\n private var isDragging = false\n private var isRightDragging = false\n private var lastX = 0.0\n private var lastY = 0.0\n\n init {\n setupEventListeners()\n }\n\n fun target(x: Double, y: Double, z: Double) {\n targetX = x; targetY = y; targetZ = z\n }\n\n /**\n * Update camera position from spherical coordinates.\n * Call this every frame in the render loop.\n *\n * Converts spherical coordinates (theta, phi, distance) to Cartesian\n * and calls camera.lookAt() with float3 arrays as required by Filament.js.\n */\n fun update() {\n // Apply auto-rotation\n if (autoRotate && !isDragging) {\n theta += autoRotateSpeed\n }\n\n // Apply damping\n if (enableDamping) {\n theta += velocityTheta\n phi += velocityPhi\n velocityTheta *= dampingFactor\n velocityPhi *= dampingFactor\n }\n\n // Clamp phi\n phi = max(minPhi, min(maxPhi, phi))\n distance = max(minDistance, min(maxDistance, distance))\n\n // Convert spherical to cartesian\n val eyeX = targetX + distance * sin(phi) * sin(theta)\n val eyeY = targetY + distance * cos(phi)\n val eyeZ = targetZ + distance * sin(phi) * cos(theta)\n\n // Filament.js Camera.lookAt takes float3 arrays, not 9 separate doubles\n camera.lookAt(\n float3(eyeX, eyeY, eyeZ), // eye\n float3(targetX, targetY, targetZ), // center\n float3(0.0, 1.0, 0.0) // up\n )\n }\n\n /** Remove all event listeners. Call when destroying the SceneView. */\n fun dispose() {\n // Event listeners are attached to the canvas and will be GC'd with it\n }\n\n private fun setupEventListeners() {\n // Mouse down\n canvas.addEventListener(\"mousedown\", { event ->\n val e = event as MouseEvent\n when (e.button.toInt()) {\n 0 -> { isDragging = true } // Left button = orbit\n 2 -> { isRightDragging = true } // Right button = pan\n }\n lastX = e.clientX.toDouble()\n lastY = e.clientY.toDouble()\n e.preventDefault()\n })\n\n // Mouse move\n canvas.addEventListener(\"mousemove\", { event ->\n val e = event as MouseEvent\n val dx = e.clientX.toDouble() - lastX\n val dy = e.clientY.toDouble() - lastY\n lastX = e.clientX.toDouble()\n lastY = e.clientY.toDouble()\n\n if (isDragging) {\n // Orbit\n if (enableDamping) {\n velocityTheta = -dx * rotateSensitivity\n velocityPhi = -dy * rotateSensitivity\n } else {\n theta -= dx * rotateSensitivity\n phi -= dy * rotateSensitivity\n }\n } else if (isRightDragging) {\n // Pan\n targetX += dx * panSensitivity * distance\n targetY -= dy * panSensitivity * distance\n }\n })\n\n // Mouse up\n canvas.addEventListener(\"mouseup\", {\n isDragging = false\n isRightDragging = false\n })\n\n canvas.addEventListener(\"mouseleave\", {\n isDragging = false\n isRightDragging = false\n })\n\n // Scroll wheel = zoom\n canvas.addEventListener(\"wheel\", { event ->\n val e = event as WheelEvent\n val delta = if (e.deltaY > 0) 1.0 else -1.0\n distance *= 1.0 + delta * zoomSensitivity\n distance = max(minDistance, min(maxDistance, distance))\n e.preventDefault()\n }, js(\"{passive: false}\"))\n\n // Prevent context menu on right-click\n canvas.addEventListener(\"contextmenu\", { event ->\n event.preventDefault()\n })\n\n // Touch support\n canvas.addEventListener(\"touchstart\", { event ->\n val e = event.asDynamic()\n if (e.touches.length == 1) {\n isDragging = true\n lastX = (e.touches[0].clientX as Number).toDouble()\n lastY = (e.touches[0].clientY as Number).toDouble()\n }\n event.preventDefault()\n }, js(\"{passive: false}\"))\n\n canvas.addEventListener(\"touchmove\", { event ->\n val e = event.asDynamic()\n if (isDragging && e.touches.length == 1) {\n val dx = (e.touches[0].clientX as Number).toDouble() - lastX\n val dy = (e.touches[0].clientY as Number).toDouble() - lastY\n lastX = (e.touches[0].clientX as Number).toDouble()\n lastY = (e.touches[0].clientY as Number).toDouble()\n\n if (enableDamping) {\n velocityTheta = -dx * rotateSensitivity\n velocityPhi = -dy * rotateSensitivity\n } else {\n theta -= dx * rotateSensitivity\n phi -= dy * rotateSensitivity\n }\n } else if (e.touches.length == 2) {\n // Pinch-to-zoom\n val dx = (e.touches[0].clientX as Number).toDouble() - (e.touches[1].clientX as Number).toDouble()\n val dy = (e.touches[0].clientY as Number).toDouble() - (e.touches[1].clientY as Number).toDouble()\n val pinchDistance = kotlin.math.sqrt(dx * dx + dy * dy)\n\n if (lastPinchDistance > 0) {\n val delta = lastPinchDistance - pinchDistance\n distance *= 1.0 + delta * 0.005\n distance = max(minDistance, min(maxDistance, distance))\n }\n lastPinchDistance = pinchDistance\n }\n event.preventDefault()\n }, js(\"{passive: false}\"))\n\n canvas.addEventListener(\"touchend\", {\n isDragging = false\n lastPinchDistance = -1.0\n })\n }\n\n private var lastPinchDistance = -1.0\n}\n",null,"package io.github.sceneview.web\n\nimport io.github.sceneview.web.bindings.*\nimport io.github.sceneview.web.nodes.CameraConfig\nimport io.github.sceneview.web.nodes.LightConfig\nimport io.github.sceneview.web.nodes.LightType\nimport io.github.sceneview.web.nodes.ModelConfig\nimport kotlinx.browser.window\nimport org.w3c.dom.HTMLCanvasElement\n\n/**\n * SceneView for Web -- Filament.js based 3D viewer.\n *\n * Uses the same Filament rendering engine as SceneView Android,\n * compiled to WebAssembly for browser execution.\n *\n * This class actually initializes the Filament WASM module, creates a real\n * WebGL2 rendering context, and renders 3D content using the GPU.\n *\n * Basic usage:\n * ```kotlin\n * SceneView.create(canvas) {\n * camera {\n * eye(0.0, 1.5, 5.0)\n * target(0.0, 0.0, 0.0)\n * }\n * light {\n * directional()\n * intensity(100_000.0)\n * }\n * model(\"models/damaged_helmet.glb\")\n * }\n * ```\n */\nclass SceneView private constructor(\n val canvas: HTMLCanvasElement,\n val engine: Engine,\n val renderer: Renderer,\n val scene: Scene,\n val view: View,\n val camera: Camera,\n val swapChain: SwapChain,\n private val cameraEntity: Entity\n) {\n private var animationFrameId: Int? = null\n private var isRunning = false\n private var lastTimestamp = 0.0\n\n private val models = mutableListOf<LoadedModel>()\n private var assetLoader: AssetLoader? = null\n private val lightEntities = mutableListOf<Entity>()\n\n /** Tracks a loaded glTF asset with its animation state. */\n private class LoadedModel(\n val asset: FilamentAsset,\n val animator: Animator?,\n var animationTime: Double = 0.0\n )\n\n /** Orbit camera controller -- initialized when cameraControls is enabled. */\n var cameraController: OrbitCameraController? = null\n private set\n\n /** Enable orbit camera controls (mouse drag to orbit, scroll to zoom, touch support). */\n fun enableCameraControls(\n distance: Double = 5.0,\n targetX: Double = 0.0,\n targetY: Double = 0.0,\n targetZ: Double = 0.0,\n autoRotate: Boolean = false\n ): OrbitCameraController {\n val controller = OrbitCameraController(canvas, camera).apply {\n this.distance = distance\n target(targetX, targetY, targetZ)\n this.autoRotate = autoRotate\n }\n cameraController = controller\n return controller\n }\n\n companion object {\n /** Default IBL URL — same \"neutral\" environment as SceneView Android. */\n const val DEFAULT_IBL_URL = \"https://sceneview.github.io/assets/environments/neutral_ibl.ktx\"\n const val DEFAULT_SKYBOX_URL = \"https://sceneview.github.io/assets/environments/neutral_skybox.ktx\"\n\n /**\n * Initialize Filament WASM and create a SceneView instance.\n *\n * This is the main entry point. It:\n * 1. Calls Filament.init() to load and compile the WASM module\n * 2. Creates a Filament Engine with a WebGL2 context on the canvas\n * 3. Sets up Scene, View, Camera, Renderer, and SwapChain\n * 4. Applies the user's configuration (camera, lights, models)\n * 5. Calls onReady with the fully initialized SceneView\n *\n * @param canvas The HTML canvas element to render into\n * @param assets List of asset URLs to preload (IBL, skybox KTX files)\n * @param configure DSL block to configure the scene\n * @param onReady Callback when the SceneView is fully initialized\n */\n fun create(\n canvas: HTMLCanvasElement,\n assets: Array<String> = emptyArray(),\n configure: SceneViewBuilder.() -> Unit = {},\n onReady: (SceneView) -> Unit\n ) {\n // Step 1: Initialize Filament WASM module and preload any assets\n init(assets) {\n try {\n // Step 2: Create the Filament engine with WebGL2 context\n // Use dynamic call because webpack externals + Kotlin companion objects\n // don't resolve correctly for Filament's static Engine.create()\n val filament: dynamic = js(\"Filament\")\n val engine: Engine = filament.Engine.create(canvas).unsafeCast<Engine>()\n val renderer = engine.createRenderer()\n val scene = engine.createScene()\n val swapChain = engine.createSwapChain()\n val view = engine.createView()\n\n // Step 3: Create camera entity and camera\n val cameraEntity = (js(\"Filament.EntityManager.get().create()\") as Entity)\n val camera = engine.createCamera(cameraEntity)\n\n // Step 4: Connect view to camera and scene\n view.setCamera(camera)\n view.setScene(scene)\n\n // Step 5: Set viewport to canvas pixel dimensions\n val width = canvas.width\n val height = canvas.height\n view.setViewport(viewport(0, 0, width, height))\n\n // Step 6: Default camera setup -- perspective projection\n val aspect = if (height > 0) width.toDouble() / height.toDouble() else 1.0\n camera.setProjectionFov(\n fovInDegrees = 45.0,\n aspect = aspect,\n near = 0.1,\n far = 1000.0\n )\n\n // Default camera position: slightly above and back, looking at origin\n camera.lookAt(\n float3(0.0, 1.5, 5.0), // eye\n float3(0.0, 0.0, 0.0), // center\n float3(0.0, 1.0, 0.0) // up\n )\n\n // Default exposure matching model-viewer's exposure=1.1\n // This makes IBL-lit models look bright and vibrant\n camera.setExposureDirect(1.1)\n\n // Set clear color to near-black (clean dark background)\n renderer.setClearOptions(js(\"({clearColor: [0.05, 0.05, 0.07, 1.0], clear: true})\"))\n\n // --- Quality defaults for PBR rendering ---\n // Screen-space ambient occlusion (soft contact shadows)\n view.setAmbientOcclusionOptions(js(\"\"\"({\n enabled: true,\n radius: 0.3,\n bias: 0.0005,\n intensity: 1.0,\n quality: 1\n })\"\"\"))\n\n // Subtle bloom for emissive/bright highlights\n view.setBloomOptions(js(\"\"\"({\n enabled: true,\n strength: 0.1,\n threshold: true,\n levels: 4\n })\"\"\"))\n\n // Temporal anti-aliasing for smooth edges\n view.setTemporalAntiAliasingOptions(js(\"\"\"({\n enabled: true\n })\"\"\"))\n\n val sceneView = SceneView(\n canvas, engine, renderer, scene, view, camera, swapChain, cameraEntity\n )\n\n // Step 7: Apply user configuration (camera, lights, models, environment)\n val builder = SceneViewBuilder(sceneView)\n builder.configure()\n builder.apply()\n\n onReady(sceneView)\n } catch (e: Throwable) {\n console.error(\"SceneView: Failed to initialize Filament engine\", e)\n }\n }\n }\n }\n\n /** Resize the viewport to match the canvas dimensions. Call on window resize. */\n fun resize(width: Int = canvas.clientWidth, height: Int = canvas.clientHeight) {\n if (width <= 0 || height <= 0) return\n canvas.width = width\n canvas.height = height\n view.setViewport(viewport(0, 0, width, height))\n camera.setProjectionFov(\n fovInDegrees = 45.0,\n aspect = width.toDouble() / height.toDouble(),\n near = 0.1,\n far = 1000.0\n )\n }\n\n /** Enable automatic viewport resizing when the canvas CSS size changes. */\n var autoResize = true\n\n /** Start the render loop using requestAnimationFrame. */\n fun startRendering() {\n if (isRunning) return\n isRunning = true\n lastTimestamp = 0.0\n renderLoop(0.0)\n }\n\n /** Stop the render loop. */\n fun stopRendering() {\n isRunning = false\n animationFrameId?.let { window.cancelAnimationFrame(it) }\n animationFrameId = null\n }\n\n /**\n * Load a glTF/GLB model from a URL and add it to the scene.\n *\n * This performs the full loading pipeline:\n * 1. Fetch the .glb/.gltf file as an ArrayBuffer\n * 2. Create a FilamentAsset via the AssetLoader\n * 3. Add all renderable entities to the scene\n * 4. Call loadResources() to fetch external textures/buffers\n * 5. Release source data to free memory\n *\n * @param url URL to the .glb or .gltf file\n * @param onLoaded Optional callback when the model is fully loaded (with resources)\n */\n fun loadModel(\n url: String,\n onLoaded: ((FilamentAsset) -> Unit)? = null\n ) {\n val loader = assetLoader ?: engine.createAssetLoader().also { assetLoader = it }\n\n // Derive the base path for resolving relative resource URIs\n val basePath = url.substringBeforeLast('/') + \"/\"\n\n window.fetch(url).then { response ->\n response.arrayBuffer()\n }.then { buffer ->\n val asset = loader.createAsset(buffer)\n if (asset != null) {\n // Add all entities to the scene so they become visible\n val entities = asset.getEntities()\n scene.addEntities(entities)\n\n // Get the animator from the asset instance for animation playback\n val animator = try {\n asset.getInstance().getAnimator()\n } catch (e: Throwable) {\n null\n }\n\n val loadedModel = LoadedModel(asset, animator)\n models.add(loadedModel)\n\n // Load external resources (textures, buffers) referenced by the glTF.\n // This is REQUIRED for models to render with correct materials.\n asset.loadResources(\n onDone = {\n // Release the source glTF data now that resources are loaded\n asset.releaseSourceData()\n console.log(\"SceneView: Model loaded from $url (${entities.size} entities)\")\n onLoaded?.invoke(asset)\n },\n onFetched = null,\n basePath = basePath,\n asyncInterval = null\n )\n } else {\n console.error(\"SceneView: AssetLoader failed to parse model from $url\")\n }\n }.catch { error ->\n console.error(\"SceneView: Error fetching model from $url\", error)\n }\n }\n\n /**\n * Load the default neutral IBL environment.\n * Provides physically-correct PBR reflections without a visible skybox —\n * models look like they're in a photography studio.\n */\n fun loadDefaultEnvironment() {\n loadEnvironment(DEFAULT_IBL_URL)\n }\n\n /** Load an IBL (Image-Based Lighting) from a KTX file URL. */\n fun loadEnvironment(iblUrl: String, skyboxUrl: String? = null) {\n // Fetch and create IBL (indirect lighting) from a KTX1 file\n window.fetch(iblUrl).then { it.arrayBuffer() }.then { buffer ->\n val ibl = engine.createIblFromKtx1(buffer)\n scene.setIndirectLight(ibl)\n console.log(\"SceneView: IBL loaded from $iblUrl\")\n }.catch { error ->\n console.error(\"SceneView: Error loading IBL from $iblUrl\", error)\n }\n\n // Optionally load a skybox from a separate KTX file\n skyboxUrl?.let { url ->\n window.fetch(url).then { it.arrayBuffer() }.then { buffer ->\n val skybox = engine.createSkyFromKtx1(buffer)\n scene.setSkybox(skybox)\n console.log(\"SceneView: Skybox loaded from $url\")\n }.catch { error ->\n console.error(\"SceneView: Error loading skybox from $url\", error)\n }\n }\n }\n\n /**\n * Add a light to the scene using the Filament LightManager Builder API.\n *\n * The Filament.js LightManager.Builder is accessed via:\n * Filament.LightManager.Builder(type).intensity(n).direction([x,y,z]).build(engine, entity)\n */\n fun addLight(config: LightConfig) {\n val entity = (js(\"Filament.EntityManager.get().create()\") as Entity)\n\n // Map our LightType enum to Filament's numeric type constants\n // In Filament.js: 0 = SUN, 1 = DIRECTIONAL, 2 = POINT, 3 = FOCUSED_SPOT, 4 = SPOT\n val lightType = when (config.type) {\n LightType.DIRECTIONAL -> 1\n LightType.POINT -> 2\n LightType.SPOT -> 4\n }\n\n // Use the Builder pattern: LightManager.Builder(type).intensity(...).build(engine, entity)\n val builder = LightManager.Builder(lightType)\n builder.intensity(config.intensity)\n builder.color(float3(\n config.colorR.toDouble(),\n config.colorG.toDouble(),\n config.colorB.toDouble()\n ))\n builder.castShadows(true)\n\n if (config.type == LightType.DIRECTIONAL) {\n builder.direction(float3(\n config.directionX.toDouble(),\n config.directionY.toDouble(),\n config.directionZ.toDouble()\n ))\n } else {\n builder.position(float3(\n config.positionX.toDouble(),\n config.positionY.toDouble(),\n config.positionZ.toDouble()\n ))\n builder.falloff(10.0)\n }\n\n builder.build(engine, entity)\n scene.addEntity(entity)\n lightEntities.add(entity)\n }\n\n /**\n * Auto-fit the camera to frame all loaded models.\n * Computes the bounding box of all assets and adjusts the orbit controller distance.\n */\n fun fitToModels() {\n if (models.isEmpty()) return\n val controller = cameraController ?: return\n\n // Compute the union bounding box of all loaded models\n var minX = Double.MAX_VALUE; var minY = Double.MAX_VALUE; var minZ = Double.MAX_VALUE\n var maxX = -Double.MAX_VALUE; var maxY = -Double.MAX_VALUE; var maxZ = -Double.MAX_VALUE\n\n for (model in models) {\n val aabb = model.asset.getBoundingBox()\n val mn: dynamic = aabb.min\n val mx: dynamic = aabb.max\n if ((mn[0] as Number).toDouble() < minX) minX = (mn[0] as Number).toDouble()\n if ((mn[1] as Number).toDouble() < minY) minY = (mn[1] as Number).toDouble()\n if ((mn[2] as Number).toDouble() < minZ) minZ = (mn[2] as Number).toDouble()\n if ((mx[0] as Number).toDouble() > maxX) maxX = (mx[0] as Number).toDouble()\n if ((mx[1] as Number).toDouble() > maxY) maxY = (mx[1] as Number).toDouble()\n if ((mx[2] as Number).toDouble() > maxZ) maxZ = (mx[2] as Number).toDouble()\n }\n\n val cx = (minX + maxX) / 2.0\n val cy = (minY + maxY) / 2.0\n val cz = (minZ + maxZ) / 2.0\n val dx = maxX - minX\n val dy = maxY - minY\n val dz = maxZ - minZ\n val radius = kotlin.math.sqrt(dx * dx + dy * dy + dz * dz) / 2.0\n\n controller.target(cx, cy, cz)\n controller.distance = radius * 2.5\n controller.minDistance = radius * 0.5\n controller.maxDistance = radius * 10.0\n }\n\n /** Clean up all Filament resources. */\n fun destroy() {\n stopRendering()\n cameraController?.dispose()\n\n // Destroy loaded assets\n assetLoader?.let { loader ->\n models.forEach { loader.destroyAsset(it.asset) }\n loader.delete()\n }\n models.clear()\n\n // Destroy light entities\n lightEntities.forEach { engine.destroyEntity(it) }\n lightEntities.clear()\n\n // Destroy core Filament objects\n engine.destroyRenderer(renderer)\n engine.destroyView(view)\n engine.destroyScene(scene)\n engine.destroyCameraComponent(cameraEntity)\n engine.destroySwapChain(swapChain)\n val filament: dynamic = js(\"Filament\")\n filament.Engine.destroy(engine)\n }\n\n /**\n * The render loop -- called every frame via requestAnimationFrame.\n *\n * Each frame:\n * 1. Auto-resizes viewport if CSS size changed\n * 2. Updates orbit camera controller (rotation, damping)\n * 3. Advances glTF animations\n * 4. Calls engine.execute() to process pending async operations\n * 5. Renders the frame via beginFrame/renderView/endFrame\n */\n private fun renderLoop(timestamp: Double) {\n if (!isRunning) return\n\n // Auto-resize viewport if canvas CSS size changed\n if (autoResize) {\n val w = canvas.clientWidth\n val h = canvas.clientHeight\n if (w > 0 && h > 0 && (w != canvas.width || h != canvas.height)) {\n resize(w, h)\n }\n }\n\n // Update orbit camera\n cameraController?.update()\n\n // Track animation time\n val deltaSeconds = if (lastTimestamp > 0) (timestamp - lastTimestamp) / 1000.0 else 0.0\n lastTimestamp = timestamp\n\n // Update glTF animations for all loaded models\n models.forEach { model ->\n model.animator?.let { animator ->\n val count = animator.getAnimationCount()\n if (count > 0) {\n model.animationTime += deltaSeconds\n val duration = animator.getAnimationDuration(0)\n if (duration > 0) {\n // Loop the animation\n model.animationTime = model.animationTime % duration\n }\n // In Filament.js, applyAnimation only takes the index.\n // The animation time is set by calling the animator at the right moment.\n // Actually, the gltfio$Animator.applyAnimation(index) applies the animation\n // at the CURRENT time set internally -- we need to advance it.\n // The proper way is: animator.applyAnimation(index) after setting time\n // via the asset's animation system.\n // For Filament.js, we use the asset instance animator which tracks time internally.\n animator.applyAnimation(0)\n animator.updateBoneMatrices()\n }\n }\n }\n\n // Process any pending async Filament operations (texture uploads, etc.)\n engine.execute()\n\n // Render frame\n if (renderer.beginFrame(swapChain)) {\n renderer.renderView(view)\n renderer.endFrame()\n }\n\n animationFrameId = window.requestAnimationFrame(::renderLoop)\n }\n}\n\n/**\n * DSL builder for SceneView configuration.\n */\nclass SceneViewBuilder(private val sceneView: SceneView) {\n private var cameraConfig: CameraConfig? = null\n private var lightConfig: LightConfig? = null\n private val modelConfigs = mutableListOf<ModelConfig>()\n private var iblUrl: String? = null\n private var skyboxUrl: String? = null\n private var cameraControlsEnabled = true\n private var autoRotateEnabled = false\n private var useDefaultEnvironment = true\n\n /** Configure the camera. */\n fun camera(block: CameraConfig.() -> Unit) {\n cameraConfig = CameraConfig().apply(block)\n }\n\n /** Configure a directional light. */\n fun light(block: LightConfig.() -> Unit) {\n lightConfig = LightConfig().apply(block)\n }\n\n /** Add a glTF/GLB model by URL. */\n fun model(url: String, block: ModelConfig.() -> Unit = {}) {\n modelConfigs.add(ModelConfig(url).apply(block))\n }\n\n /** Set environment lighting from KTX IBL files. */\n fun environment(iblUrl: String, skyboxUrl: String? = null) {\n this.iblUrl = iblUrl\n this.skyboxUrl = skyboxUrl\n this.useDefaultEnvironment = false\n }\n\n /** Disable the default neutral IBL environment. */\n fun noEnvironment() {\n this.useDefaultEnvironment = false\n }\n\n /** Enable orbit camera controls (drag to orbit, scroll to zoom, touch). Enabled by default. */\n fun cameraControls(enabled: Boolean = true) {\n cameraControlsEnabled = enabled\n }\n\n /** Enable auto-rotation of the camera around the target. */\n fun autoRotate(enabled: Boolean = true) {\n autoRotateEnabled = enabled\n }\n\n internal fun apply() {\n cameraConfig?.applyTo(sceneView.camera)\n\n // If no explicit light was configured, add model-viewer-like 3-point lighting\n if (lightConfig != null) {\n sceneView.addLight(lightConfig!!)\n } else {\n // Key light — main directional, slightly warm\n val keyLight = LightConfig().apply {\n directional()\n intensity(50_000.0)\n direction(0.6f, -1.0f, -0.8f)\n }\n sceneView.addLight(keyLight)\n\n // Fill light — softer, from the opposite side\n val fillLight = LightConfig().apply {\n directional()\n intensity(25_000.0)\n direction(-0.6f, -0.5f, 0.8f)\n }\n sceneView.addLight(fillLight)\n\n // Rim/back light — highlights edges, cool tint\n val rimLight = LightConfig().apply {\n directional()\n intensity(30_000.0)\n color(0.85f, 0.9f, 1.0f) // slight cool tint\n direction(0.0f, -0.3f, 1.0f)\n }\n sceneView.addLight(rimLight)\n }\n\n // Load IBL environment for physically-correct PBR reflections\n if (iblUrl != null) {\n sceneView.loadEnvironment(iblUrl!!, skyboxUrl)\n } else if (useDefaultEnvironment) {\n // Load the bundled neutral IBL — same as Android SceneView default\n sceneView.loadDefaultEnvironment()\n }\n\n modelConfigs.forEach { config ->\n sceneView.loadModel(config.url, config.onLoaded)\n }\n if (cameraControlsEnabled) {\n val cam = cameraConfig\n sceneView.enableCameraControls(\n distance = cam?.eyeZ ?: 5.0,\n targetX = cam?.targetX ?: 0.0,\n targetY = cam?.targetY ?: 0.0,\n targetZ = cam?.targetZ ?: 0.0,\n autoRotate = autoRotateEnabled\n )\n }\n }\n}\n","package io.github.sceneview.web\n\nimport kotlin.js.Promise\n\n/**\n * SceneViewer — the JavaScript-facing 3D viewer class.\n *\n * Instances are created via `sceneview.createViewer()` or `sceneview.modelViewer()`.\n * All methods use `@JsName` to ensure stable, unmangled names in compiled JS.\n *\n * ```js\n * sceneview.createViewer(\"canvas\").then(function(sv) {\n * sv.loadModel(\"model.glb\");\n * sv.setAutoRotate(true);\n * });\n * ```\n */\n@JsExport\n@JsName(\"SceneViewer\")\nclass SceneViewJS {\n private var _sceneView: SceneView? = null\n private var disposed = false\n\n internal fun attach(sv: SceneView) {\n _sceneView = sv\n }\n\n /**\n * Load a glTF/GLB model from a URL.\n * Returns a Promise that resolves with the URL when loaded.\n */\n @JsName(\"loadModel\")\n fun loadModel(url: String): Promise<String> {\n val sv = _sceneView ?: return Promise.reject(Throwable(\"SceneViewer not initialized\"))\n return Promise { resolve, reject ->\n try {\n sv.loadModel(url) {\n resolve(url)\n }\n } catch (e: Throwable) {\n reject(e)\n }\n }\n }\n\n /**\n * Load environment lighting from a KTX IBL file URL.\n */\n @JsName(\"setEnvironment\")\n fun setEnvironment(iblUrl: String) {\n _sceneView?.loadEnvironment(iblUrl, null)\n }\n\n /**\n * Load environment lighting with skybox.\n */\n @JsName(\"setEnvironmentWithSkybox\")\n fun setEnvironmentWithSkybox(iblUrl: String, skyboxUrl: String) {\n _sceneView?.loadEnvironment(iblUrl, skyboxUrl)\n }\n\n /**\n * Set the camera orbit position in spherical coordinates.\n * @param theta Horizontal angle in radians\n * @param phi Vertical angle in radians\n * @param distance Distance from target\n */\n @JsName(\"setCameraOrbit\")\n fun setCameraOrbit(theta: Double, phi: Double, distance: Double) {\n _sceneView?.cameraController?.let {\n it.theta = theta\n it.phi = phi\n it.distance = distance\n }\n }\n\n /**\n * Set the camera orbit target (look-at point).\n */\n @JsName(\"setCameraTarget\")\n fun setCameraTarget(x: Double, y: Double, z: Double) {\n _sceneView?.cameraController?.target(x, y, z)\n }\n\n /**\n * Enable or disable auto-rotation.\n */\n @JsName(\"setAutoRotate\")\n fun setAutoRotate(enabled: Boolean) {\n _sceneView?.cameraController?.autoRotate = enabled\n }\n\n /**\n * Set auto-rotation speed in radians per frame.\n */\n @JsName(\"setAutoRotateSpeed\")\n fun setAutoRotateSpeed(speed: Double) {\n _sceneView?.cameraController?.autoRotateSpeed = speed\n }\n\n /**\n * Set minimum and maximum zoom distances.\n */\n @JsName(\"setZoomLimits\")\n fun setZoomLimits(min: Double, max: Double) {\n _sceneView?.cameraController?.let {\n it.minDistance = min\n it.maxDistance = max\n }\n }\n\n /**\n * Start the render loop. Called automatically by createViewer().\n */\n @JsName(\"startRendering\")\n fun startRendering() {\n _sceneView?.startRendering()\n }\n\n /**\n * Stop the render loop.\n */\n @JsName(\"stopRendering\")\n fun stopRendering() {\n _sceneView?.stopRendering()\n }\n\n /**\n * Resize the viewport. Normally handled automatically.\n */\n @JsName(\"resize\")\n fun resize(width: Int, height: Int) {\n _sceneView?.resize(width, height)\n }\n\n /**\n * Set the background clear color (RGBA, 0-1 range).\n * Use this to sync the 3D canvas background with your page theme.\n */\n @JsName(\"setBackgroundColor\")\n fun setBackgroundColor(r: Double, g: Double, b: Double, a: Double) {\n val sv = _sceneView ?: return\n val opts = js(\"{}\")\n val color = js(\"[]\")\n color.push(r, g, b, a)\n opts[\"clearColor\"] = color\n opts[\"clear\"] = true\n sv.renderer.setClearOptions(opts)\n }\n\n /**\n * Fit the camera to frame all loaded models.\n */\n @JsName(\"fitToModels\")\n fun fitToModels() {\n _sceneView?.fitToModels()\n }\n\n /**\n * Clean up all GPU resources. Call when removing the viewer.\n */\n @JsName(\"dispose\")\n fun dispose() {\n if (!disposed) {\n disposed = true\n _sceneView?.destroy()\n _sceneView = null\n }\n }\n}\n\n/**\n * Library version.\n */\nconst val SCENEVIEW_VERSION = \"1.3.0\"\n","package io.github.sceneview.web.bindings\n\n// -----------------------------------------------------------------------\n// Helper functions for creating Filament.js array types.\n//\n// Filament.js uses number[] (JavaScript arrays) for float3, float4, mat4, etc.\n// These helpers create the arrays in a Kotlin/JS-friendly way.\n//\n// NOTE: These MUST NOT be in the @JsModule(\"filament\") file (Filament.kt)\n// because non-external declarations are not allowed in @JsModule files.\n// -----------------------------------------------------------------------\n\n/**\n * Create a float3 array [x, y, z] for Filament.js API calls.\n *\n * Used by Camera.lookAt, LightManager.Builder.direction/position/color, etc.\n */\nfun float3(x: Double, y: Double, z: Double): dynamic {\n val arr = js(\"[]\")\n arr.push(x, y, z)\n return arr\n}\n\n/**\n * Create a float4 array [x, y, z, w] for Filament.js API calls.\n *\n * Used by Renderer.setClearOptions, Skybox.setColor, etc.\n */\nfun float4(x: Double, y: Double, z: Double, w: Double): dynamic {\n val arr = js(\"[]\")\n arr.push(x, y, z, w)\n return arr\n}\n\n/**\n * Create a viewport array [x, y, width, height] for View.setViewport().\n */\nfun viewport(x: Int, y: Int, width: Int, height: Int): dynamic {\n val arr = js(\"[]\")\n arr.push(x, y, width, height)\n return arr\n}\n","package io.github.sceneview.web.nodes\n\nimport io.github.sceneview.web.bindings.Camera\nimport io.github.sceneview.web.bindings.float3\n\n/**\n * Camera configuration for SceneView web.\n *\n * ```kotlin\n * camera {\n * eye(0.0, 1.5, 5.0)\n * target(0.0, 0.0, 0.0)\n * up(0.0, 1.0, 0.0)\n * fov(45.0)\n * near(0.1)\n * far(1000.0)\n * }\n * ```\n */\nclass CameraConfig {\n var eyeX = 0.0; private set\n var eyeY = 1.5; private set\n var eyeZ = 5.0; private set\n var targetX = 0.0; private set\n var targetY = 0.0; private set\n var targetZ = 0.0; private set\n var upX = 0.0; private set\n var upY = 1.0; private set\n var upZ = 0.0; private set\n var fovDegrees = 45.0; private set\n var nearPlane = 0.1; private set\n var farPlane = 1000.0; private set\n // Exposure defaults — matching model-viewer's exposure=1.1\n var aperture = 16.0; private set\n var shutterSpeed = 1.0 / 125.0; private set\n var sensitivity = 100.0; private set\n var directExposure: Double? = 1.1; private set\n var useDirectExposure = true; private set\n\n fun eye(x: Double, y: Double, z: Double) {\n eyeX = x; eyeY = y; eyeZ = z\n }\n\n fun target(x: Double, y: Double, z: Double) {\n targetX = x; targetY = y; targetZ = z\n }\n\n fun up(x: Double, y: Double, z: Double) {\n upX = x; upY = y; upZ = z\n }\n\n fun fov(degrees: Double) { fovDegrees = degrees }\n fun near(value: Double) { nearPlane = value }\n fun far(value: Double) { farPlane = value }\n\n fun exposure(aperture: Double, shutterSpeed: Double, sensitivity: Double) {\n this.aperture = aperture\n this.shutterSpeed = shutterSpeed\n this.sensitivity = sensitivity\n this.useDirectExposure = false\n }\n\n /** Set exposure directly (model-viewer-style, default 1.1). Higher = brighter. */\n fun exposure(value: Double) {\n this.directExposure = value\n this.useDirectExposure = true\n }\n\n /** Apply this config to a Filament.js Camera using float3 arrays for lookAt. */\n fun applyTo(camera: Camera) {\n camera.lookAt(\n float3(eyeX, eyeY, eyeZ),\n float3(targetX, targetY, targetZ),\n float3(upX, upY, upZ)\n )\n if (useDirectExposure && directExposure != null) {\n camera.setExposureDirect(directExposure!!)\n } else {\n camera.setExposure(aperture, shutterSpeed, sensitivity)\n }\n }\n}\n","package io.github.sceneview.web.nodes\n\n/**\n * Light configuration for SceneView web.\n *\n * ```kotlin\n * light {\n * directional()\n * intensity(100_000.0)\n * color(1.0f, 1.0f, 1.0f)\n * direction(0.0f, -1.0f, -0.5f)\n * }\n * ```\n */\nclass LightConfig {\n var type = LightType.DIRECTIONAL; private set\n var intensity = 100_000.0; private set\n var colorR = 1.0f; private set\n var colorG = 1.0f; private set\n var colorB = 1.0f; private set\n var directionX = 0.0f; private set\n var directionY = -1.0f; private set\n var directionZ = -0.5f; private set\n var positionX = 0.0f; private set\n var positionY = 3.0f; private set\n var positionZ = 0.0f; private set\n\n fun directional() { type = LightType.DIRECTIONAL }\n fun point() { type = LightType.POINT }\n fun spot() { type = LightType.SPOT }\n\n fun intensity(value: Double) { intensity = value }\n\n fun color(r: Float, g: Float, b: Float) {\n colorR = r; colorG = g; colorB = b\n }\n\n fun direction(x: Float, y: Float, z: Float) {\n directionX = x; directionY = y; directionZ = z\n }\n\n fun position(x: Float, y: Float, z: Float) {\n positionX = x; positionY = y; positionZ = z\n }\n}\n\nenum class LightType {\n DIRECTIONAL,\n POINT,\n SPOT\n}\n",null,"module.exports = __WEBPACK_EXTERNAL_MODULE__650__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module used 'module' so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(607);\n"],"names":["root","factory","exports","module","require","define","amd","globalThis","__WEBPACK_EXTERNAL_MODULE__650__","a","<this>","separator","prefix","postfix","limit","truncated","transform","buffer","count","element","value","name","ordinal","interfaces","maxSize","masks","i","currentSize","imask","iid","iidImask","capacity","result","mask","activeBit","numberIndex","intArray","numberWithSettledBit","index","code","it","proto","o","obj","obj1","obj2","instance","constructorFunction","constructor","this_","message","cause","errorInfo","kind","ctor","defaultConstructor","parent","suspendArity","associatedObjectKey","associatedObjects","metadata","iface","possibleActiveBit","parentProto","propName","collection","destination","iterator","initialCapacity","array","content","uppercase","other","ignoreCase","thisUpper","otherUpper","fromIndex","toIndex","size","c","otherIterator","throwable","delimiter","missingDelimiterValue","char","startIndex","chars","maximumValue","charAtIndex","arr","v","api","createViewerImpl","modelUrl","then","$modelUrl","viewer","loadModel","console","log","canvasId","autoRotate","cameraControls","cameraX","cameraY","cameraZ","fov","lightIntensity","document","getElementById","Promise","reject","$canvas","$autoRotate","$cameraControls","$cameraX","$cameraY","$cameraZ","$fov","$lightIntensity","canvas","width","height","clientWidth","clientHeight","resolve","$this$create","$this$camera","$this$light","$resolve","sceneView","window","addEventListener","e","event","button","clientX","clientY","preventDefault","dx","dy","delta","deltaY","touches","length","pinchDistance","camera","setupEventListeners","asset","animator","animationTime","timestamp","w","h","deltaSeconds","getAnimationCount","duration","getAnimationDuration","applyAnimation","updateBoneMatrices","execute","beginFrame","renderView","endFrame","requestAnimationFrame","response","arrayBuffer","$loader","$basePath","$url","$onLoaded","createAsset","entities","getEntities","addEntities","getInstance","getAnimator","loadedModel","LoadedModel","loadResources","$asset","$entities","releaseSourceData","error","engine","renderer","scene","view","swapChain","cameraEntity","$sv","x","y","z","push","eyeX","eyeY","eyeZ","lookAt","float3","assets","configure","onReady","$configure","$onReady","init","Engine","create","createRenderer","createScene","createSwapChain","createView","createCamera","setCamera","setScene","setViewport","viewport","aspect","setProjectionFov","setExposureDirect","setClearOptions","setAmbientOcclusionOptions","enabled","radius","bias","intensity","quality","setBloomOptions","strength","threshold","levels","setTemporalAntiAliasingOptions","SceneView","builder","SceneViewBuilder","distance","targetX","targetY","targetZ","OrbitCameraController","controller","renderLoop","cancelAnimationFrame","url","onLoaded","createAssetLoader","loader","basePath","substringBeforeLast","fetch","catch","iblUrl","skyboxUrl","$iblUrl","ibl","createIblFromKtx1","setIndirectLight","skybox","createSkyFromKtx1","setSkybox","config","entity","lightType","LightManager","Builder","color","castShadows","direction","position","falloff","build","addEntity","minX","minY","minZ","maxX","maxY","maxZ","aabb","getBoundingBox","mn","min","mx","max","cx","cy","cz","dz","destroyAsset","delete","destroyEntity","destroyRenderer","destroyView","destroyScene","destroyCameraComponent","destroySwapChain","destroy","block","CameraConfig","LightConfig","keyLight","fillLight","rimLight","cam","sv","theta","phi","speed","r","g","b","opts","degrees","setExposure","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__"],"sourceRoot":""}