@egjs/view3d
Version:
Fast & Customizable glTF 3D model viewer, packed with full of features!
74 lines (52 loc) • 202 kB
JavaScript
/*
Copyright (c) NAVER Corp.
name: @egjs/view3d
license: MIT
author: NAVER Corp.
repository: https://github.com/naver/egjs-view3d
version: 2.10.1
*/
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("three"),require("@egjs/component")):"function"==typeof define&&define.amd?define(["three","@egjs/component"],t):(e=e||self).View3D=t(e.THREE,e.Component)}(this,function(O,o){"use strict";class l extends Error{constructor(e,t){super(e),Object.setPrototypeOf(this,l.prototype),this.name="View3DError",this.code=t}}var r={WRONG_TYPE:0,ELEMENT_NOT_FOUND:1,CANVAS_NOT_FOUND:2,WEBGL_NOT_SUPPORTED:3,PROVIDE_SRC_FIRST:4,FILE_NOT_SUPPORTED:5,NOT_INITIALIZED:6,MODEL_FAIL_TO_LOAD:7},h=r,c={WRONG_TYPE:(e,t)=>typeof e+` is not a ${t.map(e=>`"${e}"`).join(" or ")}.`,ELEMENT_NOT_FOUND:e=>`Element with selector "${e}" not found.`,CANVAS_NOT_FOUND:"The canvas element was not found inside the given root element.",WEBGL_NOT_SUPPORTED:"WebGL is not supported on this browser.",PROVIDE_SRC_FIRST:'"src" should be provided before initialization.',FILE_NOT_SUPPORTED:e=>`Given file "${e}" is not supported.`,NOT_INITIALIZED:"View3D is not initialized yet.",MODEL_FAIL_TO_LOAD:e=>`Failed to load/parse the 3D model with the given url: "${e}". Check "loadError" event for actual error instance.`};const P=e=>"number"==typeof e,n=e=>"string"==typeof e,N=e=>!!e&&e.nodeType===Node.ELEMENT_NODE,F=(e,t)=>{let i=null;if(n(e)){t=(t||document).querySelector(e);if(!t)return null;i=t}else N(e)&&(i=e);return i},ee=(e,t)=>{t=F(e,t);if(t)return t;throw n(e)?new l(c.ELEMENT_NOT_FOUND(e),h.ELEMENT_NOT_FOUND):new l(c.WRONG_TYPE(e,["HTMLElement","string"]),h.WRONG_TYPE)},U=(e,t)=>{e=e.querySelector(t);if(e)return e;throw new l(c.CANVAS_NOT_FOUND,h.CANVAS_NOT_FOUND)},B=e=>{if(!n(e))return!1;var t=document.createDocumentFragment();try{t.querySelector(e)}catch(e){return!1}return!0},k=e=>!e||e<=0?[]:Array.apply(0,Array(e)).map((e,t)=>t),_=e=>e*Math.PI/180,p=e=>180*e/Math.PI,d=(e,t,i)=>Math.max(Math.min(e,i),t),H=(e,t,i)=>e*(1-i)+t*i,u=(e,t,i)=>{var s=Math.abs(i-t);return e<t?e=i-(t-e)%s:i<e&&(e=t+(e-i)%s),e},G=(s,...e)=>(e.forEach(i=>{Object.keys(i).forEach(e=>{var t=i[e];Array.isArray(s[e])&&Array.isArray(t)?s[e]=[...s[e],...t]:s[e]=t})}),s);const V=e=>{let t=1;for(;t<e;)t*=2;return t};const z=(e,t,i)=>{t=(new O.Vector2).subVectors(t,e).normalize(),i=(new O.Vector2).subVectors(i,e).normalize().angle()-t.angle(),e=-Math.sign(i)*(2*Math.PI-Math.abs(i));return Math.abs(i)<Math.abs(e)?i:e},Z=e=>"object"==typeof e?e:{},W=e=>e?"true":"false",j=(e,t,i)=>{var t=_(t),i=_(i),s=new O.Vector3(0,0,0);return s.y=e*Math.sin(i),s.z=e*Math.cos(i),s.x=s.z*Math.sin(-t),s.z=s.z*Math.cos(-t),s},K=e=>{var t=new O.Vector2(e.x,e.z),i=new O.Vector2;return{yaw:Math.abs(e.y)<=.99?z(i,new O.Vector2(0,1),t):0,pitch:Math.atan2(e.y,t.distanceTo(i))}},X=(e,t)=>{t={src:t,loaded:0,total:0,lengthComputable:!1,initialized:!1};return e.loadingContext.push(t),t},q=e=>{var t;return e.normalized&&ArrayBuffer.isView(e.array)?(e=e.array,t=te(e),e=1/(Math.pow(2,8*e.BYTES_PER_ELEMENT)-1),t?2*e:e):1},Y=(e,t,i,s)=>{var r=t.geometry,n=r.attributes.position,a=r.attributes.skinIndex,r=r.attributes.skinWeight;const o=t.skeleton.boneMatrices;n=(new O.Vector3).fromBufferAttribute(n,e).multiplyScalar(i);const l=new O.Vector4(0,0,0,0),h=new O.Vector4(n.x,n.y,n.z).applyMatrix4(t.bindMatrix);i=[r.getX(e),r.getY(e),r.getZ(e),r.getW(e)].map(e=>e*s);const c=[a.getX(e),a.getY(e),a.getZ(e),a.getW(e)];i.forEach((e,t)=>{t=(new O.Matrix4).fromArray(o,16*c[t]);l.add(h.clone().applyMatrix4(t).multiplyScalar(e))});n=(new O.Vector3).fromArray(l.applyMatrix4(t.bindMatrixInverse).toArray());return n.applyMatrix4(t.matrixWorld),n},te=e=>{e=new e.constructor(1);return e[0]=-1,e[0]<0},ie=e=>{if(e.capabilities.isWebGL2)return!0;{var e=e.getContext(),i=e.createTexture();let t=!0;try{var s=new Uint16Array(4),r=e.getExtension("OES_texture_half_float");t=!!r&&(e.bindTexture(e.TEXTURE_2D,i),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,1,1,0,e.RGBA,r.HALF_FLOAT_OES,s),e.getError()===e.NO_ERROR)}catch(e){t=!1}return e.deleteTexture(i),t}},se=(e,t,i)=>{if(!e||t<0||i<0)return null;e=e.meshes[t];const s=null==(t=null==e?void 0:e.geometry.index)?void 0:t.array;t=s?k(3).map(e=>s[3*i+e]):null;if(!e||!s||!t||t.some(e=>null==e))return null;const r=e.geometry.getAttribute("position");return t.map(e=>(new O.Vector3).fromBufferAttribute(r,e))},re=(e,t,i)=>{var s=se(e,t,i);if(!s)return null;const r=e.meshes[t],n=r.geometry.getIndex().array.slice(3*i,3*i+3);if(r.isSkinnedMesh){e=r.geometry,t=e.attributes.position,i=e.attributes.skinWeight;const a=q(t),o=q(i);s.forEach((e,t)=>{t=n[t],t=Y(t,r,a,o);e.copy(t)})}else s.forEach(e=>{e.applyMatrix4(r.matrixWorld)});return s};var ne;const ae=(e,t,i=!1)=>!e||!i&&e.constructor===t?e:"number"==typeof t.BYTES_PER_ELEMENT?new t(e):Array.prototype.slice.call(e),oe=(e,t)=>{const s=t.min.toArray(),r=(new O.Vector3).subVectors(t.max,t.min).toArray();return(new O.Vector3).fromArray(e.map((e,t)=>{var i;return n(e)?(i=.01*parseFloat(e),s[t]+i*r[t]):e}))};function le(e,t){var i={};for(r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(i[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var s=0,r=Object.getOwnPropertySymbols(e);s<r.length;s++)t.indexOf(r[s])<0&&Object.prototype.propertyIsEnumerable.call(e,r[s])&&(i[r[s]]=e[r[s]]);return i}function Q(e,a,o,l){return new(o=o||Promise)(function(i,t){function s(e){try{n(l.next(e))}catch(e){t(e)}}function r(e){try{n(l.throw(e))}catch(e){t(e)}}function n(e){var t;e.done?i(e.value):((t=e.value)instanceof o?t:new o(function(e){e(t)})).then(s,r)}n((l=l.apply(e,a||[])).next())})}const m={MOUSE_DOWN:"mousedown",MOUSE_MOVE:"mousemove",MOUSE_UP:"mouseup",TOUCH_START:"touchstart",TOUCH_MOVE:"touchmove",TOUCH_END:"touchend",WHEEL:"wheel",RESIZE:"resize",CONTEXT_MENU:"contextmenu",MOUSE_ENTER:"mouseenter",MOUSE_LEAVE:"mouseleave",POINTER_DOWN:"pointerdown",POINTER_MOVE:"pointermove",POINTER_UP:"pointerup",POINTER_ENTER:"pointerenter",POINTER_LEAVE:"pointerleave",LOAD:"load",ERROR:"error",CLICK:"click",DOUBLE_CLICK:"dblclick",CONTEXT_LOST:"webglcontextlost",CONTEXT_RESTORED:"webglcontextrestored"},i={GRAB:"grab",GRABBING:"grabbing",NONE:""},he=((e=ne=ne||{})[e.LEFT=0]="LEFT",e[e.MIDDLE=1]="MIDDLE",e[e.RIGHT=2]="RIGHT","anonymous"),E="div",ce="button",$="auto",f={READY:"ready",LOAD_START:"loadStart",LOAD:"load",LOAD_ERROR:"loadError",LOAD_FINISH:"loadFinish",MODEL_CHANGE:"modelChange",RESIZE:"resize",BEFORE_RENDER:"beforeRender",RENDER:"render",PROGRESS:"progress",INPUT_START:"inputStart",INPUT_END:"inputEnd",CAMERA_CHANGE:"cameraChange",ANIMATION_START:"animationStart",ANIMATION_LOOP:"animationLoop",ANIMATION_FINISHED:"animationFinished",ANNOTATION_FOCUS:"annotationFocus",ANNOTATION_UNFOCUS:"annotationUnfocus",AR_START:"arStart",AR_END:"arEnd",AR_MODEL_PLACED:"arModelPlaced",QUICK_LOOK_TAP:"quickLookTap"},de={SINE_WAVE:e=>Math.sin(e*Math.PI*2),EASE_OUT_CUBIC:e=>1-Math.pow(1-e,3),EASE_OUT_BOUNCE:e=>{var t=7.5625,i=2.75;return e<1/i?t*e*e:e<2/i?t*(e-=1.5/i)*e+.75:e<2.5/i?t*(e-=2.25/i)*e+.9375:t*(e-=2.625/i)*e+.984375}},J={WRAPPER:"view3d-wrapper",CANVAS:"view3d-canvas",POSTER:"view3d-poster",AR_OVERLAY:"view3d-ar-overlay",ANNOTATION_WRAPPER:"view3d-annotation-wrapper",ANNOTATION:"view3d-annotation",ANNOTATION_TOOLTIP:"view3d-annotation-tooltip",ANNOTATION_DEFAULT:"default",ANNOTATION_SELECTED:"selected",ANNOTATION_HIDDEN:"hidden",ANNOTATION_FLIP_X:"flip-x",ANNOTATION_FLIP_Y:"flip-y",CTX_LOST:"ctx-lost"},ue={LINEAR:O.LinearToneMapping,REINHARD:O.ReinhardToneMapping,CINEON:O.CineonToneMapping,ACES_FILMIC:O.ACESFilmicToneMapping},_e={FOV:"fov",DISTANCE:"distance"};var e={WEBXR:"webAR",SCENE_VIEWER:"sceneViewer",QUICK_LOOK:"quickLook"};const pe={ONLY_AR:"ar_only",ONLY_3D:"3d_only",PREFER_AR:"ar_preferred",PREFER_3D:"3d_preferred"};var v;const g={ROTATE:0,TRANSLATE:1,ZOOM:2},me={ONE:"one",NONE:"none",ALL:"all"};class ve{constructor(e){this._defaultRenderLoop=e=>{var{control:t,autoPlayer:i,animator:s}=this._view3D;(s.animating||t.animating||i.animating)&&this._renderFrame(e)},this._onContextLost=()=>{this._canvas.classList.add(J.CTX_LOST)},this._onContextRestore=()=>{var e=this._canvas,t=this._view3D.scene;e.classList.remove(J.CTX_LOST),t.initTextures(),this.renderSingleFrame()};var t=U(e.rootEl,e.canvasSelector),i=(this._canvas=t,this._view3D=e,this._renderQueued=!1,new O.WebGLRenderer({canvas:t,alpha:!0,antialias:!0,preserveDrawingBuffer:!0}));i.toneMapping=e.toneMapping,i.toneMappingExposure=e.exposure,i.outputEncoding=O.sRGBEncoding,i.setClearColor(0,0),this._halfFloatAvailable=ie(i),this._renderer=i,this._clock=new O.Clock(!1),this._canvasSize=new O.Vector2,t.addEventListener(m.CONTEXT_LOST,this._onContextLost),t.addEventListener(m.CONTEXT_RESTORED,this._onContextRestore)}get canvas(){return this._canvas}get context(){return this._renderer.getContext()}get threeRenderer(){return this._renderer}get defaultRenderLoop(){return this._defaultRenderLoop}get size(){var e=this._renderer.getSize(new O.Vector2);return{width:e.width,height:e.y}}get canvasSize(){return this._canvasSize}get capabilities(){var e=this._renderer;return Object.assign(Object.assign({},e.capabilities),{halfFloat:this._halfFloatAvailable})}destroy(){var e=this._canvas;this.stopAnimationLoop(),this._renderer.dispose(),e.removeEventListener(m.CONTEXT_LOST,this._onContextLost),e.removeEventListener(m.CONTEXT_RESTORED,this._onContextRestore)}resize(){var e,t=this._renderer,i=this._canvas;t.xr.isPresenting||(e=i.clientWidth||1,i=i.clientHeight||1,t.setPixelRatio(window.devicePixelRatio),t.setSize(e,i,!1),this._canvasSize.set(e,i))}setAnimationLoop(s){const r=this._view3D,n=this._clock;n.start(),this._renderer.setAnimationLoop((e,t)=>{var i=Math.min(n.getDelta(),r.maxDeltaTime);s(i,t)})}stopAnimationLoop(){this._clock.stop(),this._renderer.setAnimationLoop(null)}renderSingleFrame(e=!1){this._renderer.xr.isPresenting||(e?this._renderFrame(0):this._renderQueued||(requestAnimationFrame(()=>{this._renderFrame(0)}),this._renderQueued=!0))}_renderFrame(e){var t,i=this._view3D,s=this._renderer,{scene:r,camera:n,control:a,autoPlayer:o,animator:l,annotation:h}=i;s.getContext().isContextLost()||(t=1e3*e,this._renderQueued=!1,l.update(e),a.update(t),o.update(t),i.trigger(f.BEFORE_RENDER,{type:f.BEFORE_RENDER,target:i,delta:t}),n.updatePosition(),r.shadowPlane.render(),s.render(r.root,n.threeCamera),h.render(),i.trigger(f.RENDER,{type:f.RENDER,target:i,delta:t}))}}class ge extends O.DataTextureLoader{constructor(e){super(e),this.type=O.HalfFloatType}parse(e){const i=-1,m=1,s=2,v=3,g=4,E=function(e,t){switch(e){case m:console.error("THREE.RGBELoader Read Error: "+(t||""));break;case s:console.error("THREE.RGBELoader Write Error: "+(t||""));break;case v:console.error("THREE.RGBELoader Bad File Format: "+(t||""));break;default:case g:console.error("THREE.RGBELoader: Error: "+(t||""))}return i},l=1,h=2,c=4,d="\n",u=function(e,t,i){t=t||1024;let s=e.pos,r=-1,n=0,a="",o=String.fromCharCode.apply(null,new Uint16Array(e.subarray(s,s+128)));for(;(r=o.indexOf(d))<0&&n<t&&s<e.byteLength;)a+=o,n+=o.length,s+=128,o+=String.fromCharCode.apply(null,new Uint16Array(e.subarray(s,s+128)));return-1<r&&(!1!==i&&(e.pos+=n+r+1),a+o.slice(0,r))};var r,n,a,o,_,p,f,T,w,b,e=new Uint8Array(e),y=(e.pos=0,function(e){var t=/^\s*GAMMA\s*=\s*(\d+(\.\d+)?)\s*$/,i=/^\s*EXPOSURE\s*=\s*(\d+(\.\d+)?)\s*$/,s=/^\s*FORMAT=(\S+)\s*$/,r=/^\s*\-Y\s+(\d+)\s+\+X\s+(\d+)\s*$/,n={valid:0,string:"",comments:"",programtype:"RGBE",format:"",gamma:1,exposure:1,width:0,height:0};let a,o;if(e.pos>=e.byteLength||!(a=u(e)))return E(m,"no header found");if(!(o=a.match(/^#\?(\S+)/)))return E(v,"bad initial token");for(n.valid|=l,n.programtype=o[1],n.string+=a+"\n";;){if(!1===(a=u(e)))break;if(n.string+=a+"\n","#"===a.charAt(0))n.comments+=a+"\n";else if((o=a.match(t))&&(n.gamma=parseFloat(o[1],10)),(o=a.match(i))&&(n.exposure=parseFloat(o[1],10)),(o=a.match(s))&&(n.valid|=h,n.format=o[1]),(o=a.match(r))&&(n.valid|=c,n.height=parseInt(o[1],10),n.width=parseInt(o[2],10)),n.valid&h&&n.valid&c)break}return n.valid&h?n.valid&c?n:E(v,"missing image size specifier"):E(v,"missing format specifier")}(e));if(i!==y){var S=y.width,A=y.height,L=function(e,t,i){var s=t;if(s<8||32767<s||2!==e[0]||2!==e[1]||128&e[2])return new Uint8Array(e);if(s!==(e[2]<<8|e[3]))return E(v,"wrong scanline width");var r=new Uint8Array(4*t*i);if(!r.length)return E(g,"unable to allocate buffer space");let n=0,a=0;var o=4*s,l=new Uint8Array(4),h=new Uint8Array(o);let c=i;for(;0<c&&a<e.byteLength;){if(a+4>e.byteLength)return E(m);if(l[0]=e[a++],l[1]=e[a++],l[2]=e[a++],l[3]=e[a++],2!=l[0]||2!=l[1]||(l[2]<<8|l[3])!=s)return E(v,"bad rgbe scanline format");let t=0,i;for(;t<o&&a<e.byteLength;){var d=128<(i=e[a++]);if(d&&(i-=128),0===i||t+i>o)return E(v,"bad scanline data");if(d){var u=e[a++];for(let e=0;e<i;e++)h[t++]=u}else h.set(e.subarray(a,a+i),t),t+=i,a+=i}var _=s;for(let e=0;e<_;e++){var p=0;r[n]=h[e+0],p+=s,r[n+1]=h[e+p],p+=s,r[n+2]=h[e+p],p+=s,r[n+3]=h[e+p],n+=4}c--}return r}(e.subarray(e.pos),S,A);if(i!==L){let e,t,i,s;switch(this.type){case O.UnsignedByteType:e=L,t=O.RGBEFormat,i=O.UnsignedByteType;break;case O.FloatType:s=L.length/4;var R=new Float32Array(3*s);for(let e=0;e<s;e++)p=L,f=4*e,T=R,w=3*e,b=void 0,b=p[f+3],b=Math.pow(2,b-128)/255,T[w+0]=p[f+0]*b,T[w+1]=p[f+1]*b,T[w+2]=p[f+2]*b;e=R,t=O.RGBFormat,i=O.FloatType;break;case O.HalfFloatType:s=L.length/4;var x=new Uint16Array(3*s);for(let e=0;e<s;e++)r=L,n=4*e,a=x,o=3*e,_=void 0,_=r[n+3],_=Math.pow(2,_-128)/255,a[o+0]=O.DataUtils.toHalfFloat(Math.min(r[n+0]*_,65504)),a[o+1]=O.DataUtils.toHalfFloat(Math.min(r[n+1]*_,65504)),a[o+2]=O.DataUtils.toHalfFloat(Math.min(r[n+2]*_,65504));e=x,t=O.RGBFormat,i=O.HalfFloatType;break;default:console.error("THREE.RGBELoader: unsupported type: ",this.type)}return{width:S,height:A,data:e,header:y.string,gamma:y.gamma,exposure:y.exposure,format:t,type:i}}}return null}setDataType(e){return this.type=e,this}load(e,i,t,s){return super.load(e,function(e,t){switch(e.type){case O.UnsignedByteType:e.encoding=O.RGBEEncoding,e.minFilter=O.NearestFilter,e.magFilter=O.NearestFilter,e.generateMipmaps=!1,e.flipY=!0;break;case O.FloatType:case O.HalfFloatType:e.encoding=O.LinearEncoding,e.minFilter=O.LinearFilter,e.magFilter=O.LinearFilter,e.generateMipmaps=!1,e.flipY=!0}i&&i(e,t)},t,s)}}class Ee{constructor(e){this._onLoadingProgress=(e,t,i)=>{var s=this._view3D;i.initialized=!0,i.lengthComputable=e.lengthComputable,i.loaded=e.loaded,i.total=e.total,s.trigger(f.PROGRESS,{type:f.PROGRESS,target:s,src:t,lengthComputable:e.lengthComputable,loaded:e.loaded,total:e.total})},this._view3D=e}}class fe extends Ee{constructor(e){super(e)}load(r){const n=this._view3D;return new Promise((e,t)=>{var i=new O.TextureLoader;const s=X(n,r);i.setCrossOrigin(he),i.load(r,e,e=>this._onLoadingProgress(e,r,s),e=>{s.initialized=!0,t(e)})})}loadHDRTexture(r){const n=this._view3D;return new Promise((t,i)=>{var e=new ge;n.renderer.capabilities.halfFloat||(e.type=O.FloatType);const s=X(n,r);e.setCrossOrigin(he),e.load(r,e=>{e.mapping=O.EquirectangularReflectionMapping,t(e)},e=>this._onLoadingProgress(e,r,s),e=>{s.initialized=!0,i(e)})})}}const Te=["alphaMap","aoMap","bumpMap","displacementMap","emissiveMap","envMap","lightMap","map","metalnessMap","normalMap","roughnessMap","sheenColorMap","sheenRoughnessMap","specularColorMap","specularIntensityMap","transmissionMap","clearcoatMap","clearcoatNormalMap"],T={HOLD:"hold",RELEASE:"release",ENABLE:"enable",DISABLE:"disable"},we=((t=v=v||{})[t.NONE=0]="NONE",t[t.ONE_FINGER_HORIZONTAL=1]="ONE_FINGER_HORIZONTAL",t[t.ONE_FINGER_VERTICAL=2]="ONE_FINGER_VERTICAL",t[t.ONE_FINGER=3]="ONE_FINGER",t[t.TWO_FINGER_HORIZONTAL=4]="TWO_FINGER_HORIZONTAL",t[t.TWO_FINGER_VERTICAL=8]="TWO_FINGER_VERTICAL",t[t.TWO_FINGER=12]="TWO_FINGER",t[t.PINCH=16]="PINCH","KHR_materials_variants"),be="EXT_View3D_texture_LOD",ye="view3d-lod",Se="view3d-annotation";var w,a,Ae={uniforms:{tDiffuse:{value:null},h:{value:1/512}},vertexShader:`
varying vec2 vUv;
void main() {
vUv = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
}`,fragmentShader:`
uniform sampler2D tDiffuse;
uniform float h;
varying vec2 vUv;
void main() {
vec4 sum = vec4( 0.0 );
sum += texture2D( tDiffuse, vec2( vUv.x - 4.0 * h, vUv.y ) ) * 0.051;
sum += texture2D( tDiffuse, vec2( vUv.x - 3.0 * h, vUv.y ) ) * 0.0918;
sum += texture2D( tDiffuse, vec2( vUv.x - 2.0 * h, vUv.y ) ) * 0.12245;
sum += texture2D( tDiffuse, vec2( vUv.x - 1.0 * h, vUv.y ) ) * 0.1531;
sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y ) ) * 0.1633;
sum += texture2D( tDiffuse, vec2( vUv.x + 1.0 * h, vUv.y ) ) * 0.1531;
sum += texture2D( tDiffuse, vec2( vUv.x + 2.0 * h, vUv.y ) ) * 0.12245;
sum += texture2D( tDiffuse, vec2( vUv.x + 3.0 * h, vUv.y ) ) * 0.0918;
sum += texture2D( tDiffuse, vec2( vUv.x + 4.0 * h, vUv.y ) ) * 0.051;
gl_FragColor = sum;
}`};const Le={uniforms:{tDiffuse:{value:null},v:{value:1/512}},vertexShader:`
varying vec2 vUv;
void main() {
vUv = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
}`,fragmentShader:`
uniform sampler2D tDiffuse;
uniform float v;
varying vec2 vUv;
void main() {
vec4 sum = vec4( 0.0 );
sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 4.0 * v ) ) * 0.051;
sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 3.0 * v ) ) * 0.0918;
sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 2.0 * v ) ) * 0.12245;
sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 1.0 * v ) ) * 0.1531;
sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y ) ) * 0.1633;
sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 1.0 * v ) ) * 0.1531;
sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 2.0 * v ) ) * 0.12245;
sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 3.0 * v ) ) * 0.0918;
sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * v ) ) * 0.051;
gl_FragColor = sum;
}`};class Re{constructor(e,{darkness:t=.5,mapSize:i=9,blur:s=3.5,shadowScale:r=1,planeScale:n=2}={}){this._view3D=e,this._darkness=t,this._mapSize=i,this._blur=s,this._shadowScale=r,this._planeScale=n;t=e.renderer.threeRenderer,s=Math.min(Math.pow(2,Math.floor(i)),t.capabilities.maxTextureSize),this._root=new O.Group,this._renderTarget=new O.WebGLRenderTarget(s,s,{format:O.RGBAFormat}),this._blurTarget=new O.WebGLRenderTarget(s,s,{format:O.RGBAFormat}),this._renderTarget.texture.generateMipmaps=!1,this._blurTarget.texture.generateMipmaps=!1,r=new O.OrthographicCamera(-.5,.5,.5,-.5,0),r.rotation.x=Math.PI/2,this._shadowCamera=r,this._root.add(r),n=new O.OrthographicCamera(-.5,.5,.5,-.5,0);this._blurCamera=n,this._setupPlanes()}get root(){return this._root}get darkness(){return this._darkness}get mapSize(){return this._mapSize}get blur(){return this._blur}get shadowScale(){return this._shadowScale}get planeScale(){return this._planeScale}set darkness(e){this._plane.material.opacity=e,this._darkness=e}set blur(e){this._blur=e}set shadowScale(e){this._shadowScale=e;e=this._view3D.model;e&&this.updateDimensions(e)}updateDimensions(e){var t=this._root,i=this._shadowCamera,s=this._planeScale,r=e.bbox.getBoundingSphere(new O.Sphere),s=2*s*r.radius,n=this._shadowScale;i.far=n*(e.bbox.max.y-e.bbox.min.y)/s,i.rotation.set(Math.PI/2,Math.PI,0,"YXZ"),t.position.copy(r.center).setY(e.bbox.min.y),t.scale.setScalar(s),i.updateProjectionMatrix()}render(){this._plane.visible=!1;var e=this._view3D,{renderer:t,ar:i}=e,s=this._shadowCamera,t=t.threeRenderer,i=i.activeSession?i.activeSession.arScene:e.scene,e=t.xr.enabled,i=(t.xr.enabled=!1,i.root),r=i.background,n=(i.background=null,i.overrideMaterial=this._depthMaterial,t.getClearAlpha()),a=(t.setClearAlpha(0),t.getRenderTarget());t.setRenderTarget(this._renderTarget),t.clear(),t.render(i,s),i.overrideMaterial=null,this._blurShadow(this._blur),this._blurShadow(.4*this._blur),t.xr.enabled=e,t.setRenderTarget(a),t.setClearAlpha(n),i.background=r,this._plane.visible=!0}_blurShadow(e){var t=this._view3D["renderer"],i=this._blurCamera,t=t.threeRenderer,s=this._blurPlane,r=this._renderTarget,n=this._blurTarget,a=this._horizontalBlurMaterial,o=this._verticalBlurMaterial;s.visible=!0,a.uniforms.tDiffuse.value=r.texture,a.uniforms.h.value=+e/256,a.needsUpdate=!0,s.material=a,t.setRenderTarget(n),t.render(s,i),o.uniforms.tDiffuse.value=n.texture,o.uniforms.v.value=+e/256,o.needsUpdate=!0,s.material=o,t.setRenderTarget(r),t.render(s,i),s.visible=!1}_setupPlanes(){var e=this._root,t=new O.PlaneBufferGeometry,i=new O.MeshBasicMaterial({opacity:this._darkness,transparent:!0,side:O.BackSide,depthWrite:!1,map:this._renderTarget.texture}),i=new O.Mesh(t,i),e=(i.renderOrder=1,i.scale.set(-1,-1,1),i.rotation.order="YXZ",i.rotation.x=Math.PI/2,this._plane=i,e.add(i),new O.Mesh(t)),i=(this._blurPlane=e,new O.MeshDepthMaterial),t=(i.onBeforeCompile=e=>{e.fragmentShader=`
`+e.fragmentShader.replace("gl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );","gl_FragColor = vec4( vec3( 0.0 ), ( 1.0 - fragCoordZ ) * opacity );")},this._depthMaterial=i,new O.ShaderMaterial(Ae)),e=(t.depthTest=!1,this._horizontalBlurMaterial=t,new O.ShaderMaterial(Le));e.depthTest=!1,this._verticalBlurMaterial=e}}class xe{static fromCubeTexture(s){let r=0;var n=new O.Vector3,a=new O.Vector3,o=new O.Color,l=[0,0,0,0,0,0,0,0,0],e=new O.SphericalHarmonics3,h=e.coefficients;for(let i=0;i<6;i++){var t=s.image[i],c=t.width,d=t.height,u=document.createElement("canvas"),u=(u.width=c,u.height=d,u.getContext("2d")),t=(u.drawImage(t,0,0,c,d),u.getImageData(0,0,c,d)),_=t.data,p=t.width,m=2/p;for(let e=0,t=_.length;e<t;e+=4){o.setRGB(_[e]/255,_[e+1]/255,_[e+2]/255),Oe(o,s.encoding);var v=e/4,g=(v%p+.5)*m-1,E=1-(Math.floor(v/p)+.5)*m;switch(i){case 0:n.set(-1,E,-g);break;case 1:n.set(1,E,g);break;case 2:n.set(-g,1,-E);break;case 3:n.set(-g,-1,E);break;case 4:n.set(-g,E,1);break;case 5:n.set(g,E,-1)}var v=n.lengthSq(),f=4/(Math.sqrt(v)*v);r+=f,a.copy(n).normalize(),O.SphericalHarmonics3.getBasisAt(a,l);for(let e=0;e<9;e++)h[e].x+=l[e]*o.r*f,h[e].y+=l[e]*o.g*f,h[e].z+=l[e]*o.b*f}}var i=4*Math.PI/r;for(let e=0;e<9;e++)h[e].x*=i,h[e].y*=i,h[e].z*=i;return new O.LightProbe(e)}static fromCubeRenderTarget(e,s){let r=0;var n=new O.Vector3,a=new O.Vector3,o=new O.Color,l=[0,0,0,0,0,0,0,0,0],t=new O.SphericalHarmonics3,h=t.coefficients;for(let i=0;i<6;i++){var c=s.width,d=new Uint8Array(c*c*4),u=(e.readRenderTargetPixels(s,0,0,c,c,d,i),2/c);for(let e=0,t=d.length;e<t;e+=4){o.setRGB(d[e]/255,d[e+1]/255,d[e+2]/255),Oe(o,s.texture.encoding);var _=e/4,p=(_%c+.5)*u-1,m=1-(Math.floor(_/c)+.5)*u;switch(i){case 0:n.set(1,m,-p);break;case 1:n.set(-1,m,p);break;case 2:n.set(p,1,-m);break;case 3:n.set(p,-1,m);break;case 4:n.set(p,m,1);break;case 5:n.set(-p,m,-1)}var _=n.lengthSq(),v=4/(Math.sqrt(_)*_);r+=v,a.copy(n).normalize(),O.SphericalHarmonics3.getBasisAt(a,l);for(let e=0;e<9;e++)h[e].x+=l[e]*o.r*v,h[e].y+=l[e]*o.g*v,h[e].z+=l[e]*o.b*v}}var i=4*Math.PI/r;for(let e=0;e<9;e++)h[e].x*=i,h[e].y*=i,h[e].z*=i;return new O.LightProbe(t)}}function Oe(e,t){switch(t){case O.sRGBEncoding:e.convertSRGBToLinear();break;case O.LinearEncoding:break;default:console.warn("WARNING: LightProbeGenerator convertColorToLinear() encountered an unsupported encoding.")}}class b{static createDefaultEnv(e){var t=new O.Scene,i=new O.PointLight(16777215,.8,20),i=(i.decay=2,i.position.set(0,7,0),t.add(i),new O.BoxBufferGeometry(1,1,1)),s=new O.MeshStandardMaterial({side:O.BackSide}),i=new O.Mesh(i,s),s=(i.castShadow=!1,i.scale.set(15,45,15),i.position.set(0,20,0),t.add(i),b._createRectAreaLightSource({intensity:4.5,width:4,height:4})),i=(s.position.set(0,2.5,0),s.rotateX(Math.PI/2),b._createRectAreaLightSource({intensity:3,width:2,height:2})),r=(i.position.set(0,1,4),i.lookAt(0,0,0),b._createRectAreaLightSource({intensity:3,width:2,height:2})),n=(r.position.set(-4,1,1),r.lookAt(0,0,0),b._createRectAreaLightSource({intensity:3,width:2,height:2})),a=(n.position.set(4,1,1),n.lookAt(0,0,0),b._createRectAreaLightSource({intensity:2.5,width:2,height:2})),o=(a.position.set(1.5,1,-4),a.lookAt(0,0,0),b._createRectAreaLightSource({intensity:2.5,width:2,height:2})),s=(o.position.set(-1.5,1,-4),o.lookAt(0,0,0),t.add(s,i,r,n,a,o),e.outputEncoding),i=e.toneMapping,r=(e.outputEncoding=O.LinearEncoding,e.toneMapping=O.NoToneMapping,new O.PMREMGenerator(e).fromScene(t,.035));return e.outputEncoding=s,e.toneMapping=i,r.texture}static createBlurredHDR(e,t){var e=e.renderer.threeRenderer,i=new O.Scene,t=(i.background=t,e.toneMappingExposure),s=(e.toneMappingExposure=1,new O.WebGLCubeRenderTarget(256,{encoding:O.sRGBEncoding,format:O.RGBAFormat})),r=new O.CubeCamera(.1,1e3,s),i=(r.update(e,i),xe.fromCubeRenderTarget(e,s)),n=new O.MeshStandardMaterial({side:O.BackSide}),a=new O.IcosahedronBufferGeometry(1,4),o=new O.Scene,n=new O.Mesh(a,n),l=a.getAttribute("normal");for(let e=0;e<l.count;e++)l.setXYZ(e,-l.getX(e),-l.getY(e),-l.getZ(e));return o.add(n),o.add(i),r.update(e,o),e.toneMappingExposure=t,s.texture}static _createRectAreaLightSource({intensity:e,width:t,height:i}){t=new O.PlaneBufferGeometry(t,i),i=new O.MeshBasicMaterial;return i.color.setScalar(e),new O.Mesh(t,i)}}class Ce{constructor(e){this._view3D=e,this._root=new O.Scene,this._userObjects=new O.Group,this._envObjects=new O.Group,this._fixedObjects=new O.Group,this._shadowPlane=new Re(e,Z(e.shadow));var t=this._root,i=this._userObjects,s=this._envObjects,r=this._fixedObjects,n=this._shadowPlane;i.name="userObjects",s.name="envObjects",r.name="fixedObjects",t.add(i,s,r),e.shadow&&r.add(n.root)}get root(){return this._root}get shadowPlane(){return this._shadowPlane}get userObjects(){return this._userObjects}get envObjects(){return this._envObjects}get fixedObjects(){return this._fixedObjects}reset({volatileOnly:e=!0}={}){this._removeChildsOf(this._userObjects),e||this._removeChildsOf(this._envObjects)}add(e,t=!0){t=t?this._userObjects:this._envObjects,e=Array.isArray(e)?e:[e];t.add(...e)}remove(e){e=Array.isArray(e)?e:[e];this._userObjects.remove(...e),this._envObjects.remove(...e)}setBackground(s){return Q(this,void 0,void 0,function*(){var e,t=this._view3D,i=this._root;"number"==typeof s||"#"===s.charAt(0)?i.background=new O.Color(s):((e=yield new fe(t).load(s)).encoding=O.sRGBEncoding,i.background=e),t.renderer.renderSingleFrame()})}setSkybox(s){return Q(this,void 0,void 0,function*(){var e,t=this._root,i=this._view3D;t.background&&t.background.isTexture&&t.background.dispose(),s?(e=yield new fe(i).loadHDRTexture(s),i.skyboxBlur?t.background=b.createBlurredHDR(i,e):t.background=e,t.environment=e):(t.background=null,t.environment=null),i.renderer.renderSingleFrame()})}setEnvMap(s){return Q(this,void 0,void 0,function*(){var e,t=this._view3D,i=this._root;s?(e=yield new fe(t).loadHDRTexture(s),i.environment=e):i.environment=null,t.renderer.renderSingleFrame()})}initTextures(){var{skybox:e,envmap:t,background:i,useDefaultEnv:s}=this._view3D,r=[],s=(s&&this.setDefaultEnv(),e||t);return s&&(s=e?this.setSkybox(e):this.setEnvMap(t),r.push(s)),!e&&i&&r.push(this.setBackground(i)),r}setDefaultEnv(){var e=this._view3D.renderer,e=b.createDefaultEnv(e.threeRenderer);this._root.environment=e}_removeChildsOf(e){for(e.traverse(e=>{e.isMesh&&((e=e).geometry.dispose(),(Array.isArray(e.material)?e.material:[e.material]).forEach(t=>{Te.forEach(e=>{t[e]&&t[e].dispose()})}))});0<e.children.length;)e.remove(e.children[0])}}const y=de.EASE_OUT_CUBIC,Me={min:0,max:1},Ie={min:-1/0,max:1/0},De={min:-89.9,max:89.9},Pe={165:0,135:.4,0:1},Ne=[e.WEBXR,e.SCENE_VIEWER,e.QUICK_LOOK];class S{constructor({duration:e=300,loop:t=!1,range:i=Me,easing:s=y}={}){this._duration=e,this._loop=t,this._range=i,this._easing=s,this._activated=!1,this.reset(0)}get val(){return this._val}get start(){return this._start}get end(){return this._end}get progress(){return this._progress}get duration(){return this._duration}get loop(){return this._loop}get range(){return this._range}get easing(){return this._easing}get activated(){return this._activated}set duration(e){this._duration=e}set loop(e){this._loop=e}set range(e){this._range=e}set easing(e){this._easing=e}update(e){var t,i,s,r,n;return this._activated?(t=this._start,i=this._end,n=this._duration,s=this._val,r=this._loop,e=this._progress+e/n,this._progress=(r?u:d)(e,0,1),n=this._easing(this._progress),this._val=H(t,i,n),!r&&1<=this._progress&&(this._activated=!1),this._val-s):0}reset(e){var t=this._range,e=d(e,t.min,t.max);this._start=e,this._end=e,this._val=e,this._progress=0,this._activated=!1}setEndDelta(e){var t=this._range;this._start=this._val,this._end=d(this._end+e,t.min,t.max),this._progress=0,this._activated=!0}}class Fe{constructor(e,t,i,{duration:s=300,easing:r=y,disableOnFinish:n=!0}={}){this._enabled=!1,this._finishCallbacks=[],this._view3D=e,this._motion=new S({duration:s,range:Me,easing:r}),this._disableOnFinish=n,this.changeStartEnd(t,i)}get element(){return null}get enabled(){return this._enabled}get duration(){return this._motion.duration}get easing(){return this._motion.easing}get animating(){return this._motion.activated}set duration(e){this._motion.duration=e}set easing(e){this._motion.easing=e}destroy(){this.disable()}changeStartEnd(e,t){e=e.clone(),t=t.clone(),e.yaw=u(e.yaw,0,360),t.yaw=u(t.yaw,0,360),180<Math.abs(t.yaw-e.yaw)&&(t.yaw=t.yaw<e.yaw?t.yaw+360:t.yaw-360),this._from=e,this._to=t}update(e){var t,i,s,r;this._enabled&&(t=this._view3D.camera,i=this._from,s=this._to,(r=this._motion).update(e),e=r.val,t.yaw=H(i.yaw,s.yaw,e),t.pitch=H(i.pitch,s.pitch,e),t.zoom=H(i.zoom,s.zoom,e),t.pivot=i.pivot.clone().lerp(s.pivot,e),1<=e)&&(this._disableOnFinish&&this.disable(),this._finishCallbacks.forEach(e=>e()),this.clearFinished())}enable(){this._enabled||(this._enabled=!0,this.reset())}disable(){this._enabled&&(this._enabled=!1)}reset(){this._motion.reset(0),this._motion.setEndDelta(1)}onFinished(e){this._finishCallbacks.push(e)}clearFinished(){this._finishCallbacks=[]}resize(e){}sync(){}}class A{constructor(e,t,i,s=[0,0,0]){this.yaw=e,this.pitch=t,this.zoom=i,this.pivot=(new O.Vector3).fromArray(s)}clone(){return new A(this.yaw,this.pitch,this.zoom,this.pivot.toArray())}copy(e){this.yaw=e.yaw,this.pitch=e.pitch,this.zoom=e.zoom,this.pivot.copy(e.pivot)}equals(e){var{yaw:t,pitch:i,zoom:s,pivot:r}=this;return u(t,0,360)===u(e.yaw,0,360)&&i===e.pitch&&s===e.zoom&&r.equals(e.pivot)}}class Ue{constructor(e){this._view3D=e,this._threeCamera=new O.PerspectiveCamera,this._maxTanHalfHFov=0,this._baseFov=45,this._baseDistance=0;var t=P(e.initialZoom)?e.initialZoom:0;this._defaultPose=new A(e.yaw,e.pitch,t),this._currentPose=this._defaultPose.clone(),this._newPose=this._currentPose.clone()}get threeCamera(){return this._threeCamera}get defaultPose(){return this._defaultPose}get currentPose(){return this._currentPose.clone()}get newPose(){return this._newPose}get yaw(){return this._currentPose.yaw}get pitch(){return this._currentPose.pitch}get zoom(){return this._currentPose.zoom}get distance(){return this._view3D.control.zoom.type===_e.FOV?this._baseDistance:this._baseDistance-this._currentPose.zoom}get baseDistance(){return this._baseDistance}get baseFov(){return this._baseFov}get pivot(){return this._currentPose.pivot}get fov(){return this._threeCamera.fov}get renderWidth(){return this.renderHeight*this._threeCamera.aspect}get renderHeight(){return 2*this.distance*Math.tan(_(this._threeCamera.getEffectiveFOV()/2))}set yaw(e){this._newPose.yaw=e}set pitch(e){this._newPose.pitch=e}set zoom(e){this._newPose.zoom=e}set pivot(e){this._newPose.pivot.copy(e)}set baseFov(e){this._baseFov=e}reset(e=0,t=y,i){var s=this._view3D;const r=s.control,n=s.autoPlayer,a=this._newPose,o=this._currentPose,l=null!=i?i:this._defaultPose;if(e<=0)return a.copy(l),o.copy(l),s.renderer.renderSingleFrame(),r.sync(),Promise.resolve();{const h=n.enabled,c=new Fe(s,o,l);return c.duration=e,c.easing=t,c.enable(),h&&n.disable(),r.add(c),new Promise(e=>{c.onFinished(()=>{a.copy(l),o.copy(l),r.remove(c),r.sync(),h&&n.enableAfterDelay(),e()})})}}resize({width:e,height:t},i=null){var{control:s,fov:r,maintainSize:n}=this._view3D;this._threeCamera.aspect=e/t,r===$?n&&null!=i?(e=t/i.height,n=this._currentPose.zoom,t=Math.tan(_((this._baseFov-n)/2)),this._baseFov=p(2*Math.atan(e*t))+n):this._applyEffectiveFov(45):this._baseFov=r,s.zoom.updateRange()}fit(e){var t=this._view3D,i=this._threeCamera,s=this._defaultPose,r=t.control,n=t.pivot,a=e.bbox,o=t.fov,l=o===$?45:o;const h=e.center;var c=t.ignoreCenterOnFit||t.center===$?(new O.Vector3).subVectors(a.max,a.min).lengthSq()/4:e.reduceVertices((e,t)=>Math.max(e,t.distanceToSquared(h)),0),c=Math.sqrt(c);const d=c/Math.sin(_(l/2));var u=e.reduceVertices((e,t)=>{var t=(new O.Vector3).subVectors(t,h),i=Math.hypot(t.x,t.z);return Math.max(e,i/(d-Math.abs(t.y)))},0);o===$?(this._maxTanHalfHFov=u,this._applyEffectiveFov(l)):this._maxTanHalfHFov=o,s.pivot=n===$?h.clone():oe(n,a),this._baseDistance=d,i.near=.1*(d-c),i.far=10*(d+c),r.zoom.updateRange(),P(t.initialZoom)?s.zoom=t.initialZoom:(u=this._baseFov,l=e.bbox,o=t.initialZoom.axis,n=t.initialZoom.ratio,c=(a=(new O.Vector3).subVectors(l.max,l.min))[o],r="y"===o?c/n:c/(n*i.aspect),e="z"!==o?d-a.z/2:d-a.x/2,t=p(2*Math.atan(r/(2*e))),s.zoom=u-t)}updatePosition(){var e=this._view3D,t=e.control,i=this._threeCamera,s=this._currentPose,r=this._newPose,n=this._baseFov,a=this._baseDistance,t=t.zoom.type===_e.FOV,o=s.clone(),n=(s.yaw=u(r.yaw,0,360),s.pitch=d(r.pitch,De.min,De.max),s.zoom=r.zoom,s.pivot.copy(r.pivot),t?n-s.zoom:n),t=t?a:a-s.zoom,a=j(t,s.yaw,s.pitch);a.add(s.pivot),i.fov=n,i.position.copy(a),i.lookAt(s.pivot),i.updateProjectionMatrix(),r.copy(s),e.trigger(f.CAMERA_CHANGE,{type:f.CAMERA_CHANGE,target:e,pose:s.clone(),prevPose:o})}_applyEffectiveFov(e){var t=this._threeCamera,e=Math.tan(_(e/2)),e=e*Math.max(1,this._maxTanHalfHFov/e/t.aspect);this._baseFov=p(2*Math.atan(e))}_parseBboxRatioOption(e,t){const s=t.min.toArray(),r=(new O.Vector3).subVectors(t.max,t.min).toArray();return e.map((e,t)=>{var i;return n(e)?(i=.01*parseFloat(e),s[t]+i*r[t]):e})}}class Be{constructor(e){this._onResize=()=>{this._view3d.resize()},this._skipFirstResize=(()=>{let e=!0;return()=>{e?e=!1:this._onResize()}})(),this._view3d=e,this._enabled=!1,this._resizeObserver=null}get enabled(){return this._enabled}enable(){var e,t,i=this._view3d;return this._enabled&&this.disable(),i.useResizeObserver&&window.ResizeObserver?(t=0!==(t=(e=i.renderer.canvas).getBoundingClientRect()).width||0!==t.height,(t=new ResizeObserver(t?this._skipFirstResize:this._onResize)).observe(e),this._resizeObserver=t):(i.resize(),window.addEventListener(m.RESIZE,this._onResize)),this._enabled=!0,this}disable(){var e;return this._enabled&&((e=this._resizeObserver)?(e.disconnect(),this._resizeObserver=null):window.removeEventListener(m.RESIZE,this._onResize),this._enabled=!1),this}}class ke{constructor(e){this._onAnimationLoop=t=>{var e=this._view3D,i=this._actions,s=this._clips,i=i.findIndex(e=>e===t.action);e.trigger(f.ANIMATION_LOOP,{type:f.ANIMATION_LOOP,target:e,index:i,action:t.action,clip:s[i]}),e.animationRepeatMode===me.ALL&&(e=i+1>=s.length?0:i+1,this.play(e))},this._onAnimationFinished=t=>{var e=this._view3D,i=this._actions,s=this._clips,i=i.findIndex(e=>e===t.action);e.trigger(f.ANIMATION_FINISHED,{type:f.ANIMATION_FINISHED,target:e,index:i,action:t.action,clip:s[i]})},this._view3D=e,this._mixer=new O.AnimationMixer(e.scene.userObjects),this._clips=[],this._actions=[],this._activeAnimationIdx=-1,this._timeScale=1,this._fadePromises=[]}get clips(){return this._clips}get mixer(){return this._mixer}get actions(){return this._actions}get animationCount(){return this._clips.length}get activeAnimation(){var e;return null!=(e=this._clips[this._activeAnimationIdx])?e:null}get activeAction(){var e;return null!=(e=this._actions[this._activeAnimationIdx])?e:null}get activeAnimationIndex(){return this._activeAnimationIdx}get paused(){return 0===this._mixer.timeScale}get animating(){var e;return(null==(e=this.activeAction)?void 0:e.isRunning())&&!this.paused}get timeScale(){return this._timeScale}set timeScale(e){this._timeScale=e}init(){this._mixer.addEventListener("loop",this._onAnimationLoop),this._mixer.addEventListener("finished",this._onAnimationFinished)}destroy(){this.reset(),this._mixer.removeEventListener("loop",this._onAnimationLoop),this._mixer.removeEventListener("finished",this._onAnimationFinished)}setClips(e){const t=this._mixer;this._clips=e,this._actions=e.map(e=>{e=t.clipAction(e);return e.setEffectiveWeight(0),e}),this.updateRepeatMode()}play(e){var t=this._view3D,i=this._actions[e];i&&(this.stop(),this._restoreTimeScale(),i.setEffectiveTimeScale(1),i.setEffectiveWeight(1),i.play(),this._activeAnimationIdx=e,this._flushFadePromises(),t.trigger(f.ANIMATION_START,{type:f.ANIMATION_START,target:t,index:e,action:i,clip:this._clips[e]}))}crossFade(h,c,{synchronize:d=!1}={}){var u;return Q(this,void 0,void 0,function*(){const i=this._view3D,t=this._mixer;var e=this._actions,s=this._activeAnimationIdx;const r=e[h],n=null!=(u=e[s])?u:r,a="loop",o=(this._restoreTimeScale(),()=>{r.enabled=!0,r.setEffectiveTimeScale(1),r.setEffectiveWeight(1),r.time=0,r.play(),n.crossFadeTo(r,c/1e3,!0),this._activeAnimationIdx=h});if(d){const l=e=>{e.action===n&&(t.removeEventListener(a,l),o())};t.addEventListener(a,l)}else o();return this._flushFadePromises(),new Promise(e=>{const t=()=>{r.getEffectiveWeight()<1||(i.off(f.BEFORE_RENDER,t),e(!0))};i.on(f.BEFORE_RENDER,t),this._fadePromises.push({listener:t,resolve:e})})})}fadeOut(e){return Q(this,void 0,void 0,function*(){const i=this._view3D;const s=this._actions[this._activeAnimationIdx];return!!s&&(this._flushFadePromises(),this._restoreTimeScale(),s.fadeOut(e/1e3),new Promise(e=>{const t=()=>{0<s.getEffectiveWeight()||(i.off(f.BEFORE_RENDER,t),this._activeAnimationIdx=-1,e(!0))};i.on(f.BEFORE_RENDER,t),this._fadePromises.push({listener:t,resolve:e})}))})}pause(){this._mixer.timeScale=0}resume(){this._restoreTimeScale()}stop(){this._actions.forEach(e=>{e.stop(),e.setEffectiveWeight(0)}),this._view3D.renderer.renderSingleFrame(),this._activeAnimationIdx=-1,this._flushFadePromises()}update(e){this._mixer.update(e)}updateRepeatMode(){var e=this._view3D,t=this._actions;e.animationRepeatMode===me.NONE?t.forEach(e=>{e.clampWhenFinished=!0,e.loop=O.LoopOnce}):t.forEach(e=>{e.clampWhenFinished=!1,e.loop=O.LoopRepeat})}reset(){var e=this._mixer;this.stop(),e.uncacheRoot(e.getRoot()),this._clips=[],this._actions=[]}_restoreTimeScale(){this._mixer.timeScale=this._timeScale}_flushFadePromises(){const i=this._view3D;this._fadePromises.forEach(({resolve:e,listener:t})=>{e(!1),i.off(f.BEFORE_RENDER,t)}),this._fadePromises=[]}}class He extends o{constructor({context:e=window,repeat:t=0,duration:i=300,easing:s=y}={}){super(),this._loop=()=>{var e=this._getDeltaTime(),t=this._duration,i=this._repeat,e=this._time+e,s=Math.floor(e/t),e=(this._time=(this._loopCount>=i?d:u)(e,0,t),this._time/t),r={progress:e,easedProgress:this._easing(e)};this.trigger("progress",r);for(let e=0;e<s;e++){if(this._loopCount++,this._loopCount>i)return this.trigger("finish"),void this.stop();this.trigger("loop",Object.assign(Object.assign({},r),{loopIndex:this._loopCount}))}this._rafId=this._ctx.requestAnimationFrame(this._loop)},this._repeat=t,this._duration=i,this._easing=s,this._ctx=e,this._rafId=-1,this._time=0,this._clock=0,this._loopCount=0}start(){0<=this._rafId||(this._updateClock(),this._loop())}stop(){this._rafId<0||(this._time=0,this._loopCount=0,this._stopLoop())}pause(){this._rafId<0||this._stopLoop()}_stopLoop(){this._ctx.cancelAnimationFrame(this._rafId),this._rafId=-1}_getDeltaTime(){var e=this._clock;return this._updateClock(),this._clock-e}_updateClock(){this._clock=Date.now()}}const Ge={AR:"immersive-ar",VR:"immersive-vr"},Ve={LOCAL:"local",LOCAL_FLOOR:"local-floor",VIEWER:"viewer"},L={SELECT_START:"selectstart",SELECT:"select",SELECT_END:"selectend",ESTIMATION_START:"estimationstart",ESTIMATION_END:"estimationend"},ze={TOUCH:"generic-touchscreen"},We={HIT_TEST:{requiredFeatures:["hit-test"]},DOM_OVERLAY:e=>e?{requiredFeatures:["dom-overlay"],domOverlay:{root:e}}:{},LIGHT_ESTIMATION:{optionalFeatures:["light-estimation"]}},je={},Ke={INTENT_AR_CORE:(e,t)=>`intent://arvr.google.com/scene-viewer/1.2?${e}#Intent;scheme=https;package=com.google.ar.core;action=android.intent.action.VIEW;${t?`S.browser_fallback_url=${t};`:""}end;`,INTENT_SEARCHBOX:(e,t)=>`intent://arvr.google.com/scene-viewer/1.2?${e}#Intent;scheme=https;package=com.google.android.googlequicksearchbox;action=android.intent.action.VIEW;${t?`S.browser_fallback_url=${t};`:""}end;`,FALLBACK_DEFAULT:e=>"https://arvr.google.com/scene-viewer?"+e};class Xe{constructor({scale:e=1}={}){this.rotation=new O.Quaternion,this._axis=new O.Vector3(0,1,0),this._enabled=!1,this._active=!1,this._prevPos=new O.Vector2,this._fromQuat=new O.Quaternion,this._toQuat=new O.Quaternion,this._motion=new S({range:Ie}),this._userScale=e}get enabled(){return this._enabled}get scale(){return this._userScale}set scale(e){this._userScale=e}updateRotation(e){this.rotation.copy(e),this._fromQuat.copy(e),this._toQuat.copy(e)}enable(){this._enabled=!0}disable(){this._enabled=!1}activate(){this._enabled&&(this._active=!0)}deactivate(){this._active=!1}updateAxis(e){this._axis.copy(e)}setInitialPos(e){this._prevPos.copy(e[0])}process({scene:e,xrCam:t},{coords:i}){var s,r;this._active&&1===i.length&&(s=this._prevPos,r=this._motion,i=i[0],e=e.modelMovable.getWorldPosition(new O.Vector3),e=(new O.Vector2).fromArray(e.project(t).toArray()),t=z(e,s,i)*this._userScale,e=(new O.Quaternion).setFromAxisAngle(this._axis,t),t=this._getInterpolatedQuaternion(),this._fromQuat.copy(t),this._toQuat.premultiply(e),r.reset(0),r.setEndDelta(1),s.copy(i))}update({scene:e},t){this._active&&(this._motion.update(t),t=this._getInterpolatedQuaternion(),this.rotation.copy(t),e.setModelRotation(t))}_getInterpolatedQuaternion(){var e=this._motion,t=this._toQuat,i=this._fromQuat,e=e.val;return(new O.Quaternion).copy(i).slerp(t,e)}}(t=w=w||{})[t.WAITING=0]="WAITING",t[t.TRANSLATING=1]="TRANSLATING",t[t.BOUNCING=2]="BOUNCING";class qe{constructor({hoverHeight:e=.1,bounceDuration:t=1e3,bounceEasing:i=de.EASE_OUT_BOUNCE}={}){this._hoverPosition=new O.Vector3,this._floorPosition=new O.Vector3,this._wallRotation=new O.Quaternion,this._dragPlane=new O.Plane,this._enabled=!1,this._vertical=!1,this._state=w.WAITING,this._initialPos=new O.Vector2,this._hoverHeight=e,this._bounceMotion=new S({duration:t,easing:i,range:Ie})}get enabled(){return this._enabled}get floorPosition(){return this._floorPosition.clone()}get hoverHeight(){return this._hoverHeight}set hoverHeight(e){this._hoverHeight=e}enable(){this._enabled=!0}disable(){this.deactivate(),this._enabled=!1}activate(){this._enabled&&(this._dragPlane.constant=this._calcDragPlaneConstant(this._floorPosition),this._state=w.TRANSLATING)}deactivate(){var e,t,i;!this._enabled||this._vertical||this._state===w.WAITING?this._state=w.WAITING:(this._state=w.BOUNCING,e=this._floorPosition,i=this._hoverPosition,t=this._bounceMotion,i=i.y-e.y,t.reset(i),t.setEndDelta(-i))}init(e,t,i){this._floorPosition.copy(e),this._hoverPosition.copy(e);e=i?new O.Vector3(0,1,0).applyQuaternion(t):new O.Vector3(0,1,0);this._dragPlane.normal.copy(e),this._wallRotation.copy(t),this._vertical=i}setInitialPos(e){this._initialPos.copy(e[0])}process({frame:e,referenceSpace:t,xrCam:i},{hitResults:s}){var r=this._state,r=r===w.WAITING||r===w.BOUNCING;if(s&&1===s.length&&!r){var r=s[0],s=this._floorPosition.clone(),n=this._floorPosition,a=this._hoverPosition,o=this._hoverHeight,l=this._dragPlane,h=this._vertical,c=r.results[0]&&r.results[0].getPose(t),d=c&&(new O.Matrix4).fromArray(c.transform.matrix),u=c&&.75<d.elements[5],_=c&&d.elements[5]<.25,i=(new O.Vector3).setFromMatrixPosition(i.matrixWorld),d=c&&(new O.Vector3).setFromMatrixPosition(d);if(h){if(e&&(!c||!_))return(h=e.getPose(r.inputSource.targetRaySpace,t))?(_=h.transform.position,h=new O.Vector3(_.x,_.y,_.z).sub(i).normalize(),void((_=new O.Ray(i,h).intersectPlane(l,new O.Vector3))&&n.copy(_))):void 0;var h=new O.Vector3(0,1,0),_=c.transform.orientation,_=h.clone().applyQuaternion(new O.Quaternion(_.x,_.y,_.z,_.w)).normalize(),p=(new O.Vector3).crossVectors(new O.Vector3(0,1,0),_),m=new O.Vector3(0,1,0).applyQuaternion(this._wallRotation).normalize(),h=(Math.acos(Math.abs(m.dot(_)))>=Math.PI/18&&(m=(new O.Matrix4).makeBasis(p,h,_),(p=new O.Euler(0,0,0,"YXZ").setFromRotationMatrix(m)).z=0,p.x=Math.PI/2,this._wallRotation.setFromEuler(p),l.normal.copy(new O.Vector3(0,1,0).applyQuaternion(this._wallRotation)),l.constant=this._calcDragPlaneConstant(d)),(new O.Vector3).subVectors(d,i).normalize()),_=new O.Ray(i,h).intersectPlane(l,new O.Vector3);_&&n.copy(_)}else{if(e&&(!c||!u))return(m=e.getPose(r.inputSource.targetRaySpace,t))?(p=m.transform.position,h=new O.Vector3(p.x,p.y,p.z).sub(i).normalize(),void((_=new O.Ray(i,h).intersectPlane(l,new O.Vector3))&&(n.copy(_),n.setY(s.y),a.copy(_)))):void 0;c=-l.constant,u=d.y+o,e=(.1<u-c&&(l.constant=-u),(new O.Vector3).subVectors(d,i).normalize()),r=new O.Ray(i,e).intersectPlane(l,new O.Vector3);r&&(n.copy(r),n.setY(d.y),a.copy(r))}}}update({scene:e},t){var i=this._state,s=this._floorPosition,r=this._hoverPosition,n=this._bounceMotion,a=this._vertical;i===w.BOUNCING&&(n.update(t),r.setY(s.y+n.val),1<=n.progress)&&(this._state=w.WAITING),e.setRootPosition(s),a?e.setWallRotation(this._wallRotation):e.setModelHovering(r.y-s.y)}_calcDragPlaneConstant(e){var t=this._vertical,i=this._dragPlane.normal.clone(),i=new O.Plane(i,0),t=t?0:this._hoverHeight;return-(i.distanceToPoint(e)+t)}}class Ye{constructor({width:e=.1,padding:t=20,offset:i=.05,font:s="64px sans-serif",color:r="white"}={}){var n=document.createElement("canvas"),a=n.getContext("2d"),o=(a.font=s,a.measureText("100%")),l=o.actualBoundingBoxLeft+o.actualBoundingBoxRight,o=o.actualBoundingBoxAscent+o.actualBoundingBoxDescent,h=V(l),e=(n.width=h,e*((n.height=h)/l)),h=(this._ctx=a,this._canvas=n,this._height=e*o/l,this._texture=new O.CanvasTexture(n),new O.PlaneGeometry(e,e)),a=new O.Mesh(h,new O.MeshBasicMaterial({map:this._texture,transparent:!0,depthTest:!1}));this._mesh=a,this._font=s,this._color=r,this._padding=t,this._offset=i,this.hide()}get mesh(){return this._mesh}get height(){return this._height}get visible(){return this._mesh.visible}updatePosition(e,t,i){var s=this._mesh,i=this._height/2+this._offset+i,i=new O.Vector3(0,i,0).applyQuaternion(e.clone().invert());s.position.copy(i),s.lookAt(t)}updateScale(e){var t=this._ctx,i=this._canvas,s=this._padding,r=(100*e).toFixed(0),n=(t.clearRect(0,0,i.width,i.height),i.width/2),i=i.height/2,a=t.measureText(r+"%"),o=(a.actualBoundingBoxLeft+a.actualBoundingBoxRight)/2,a=(a.actualBoundingBoxAscent+a.actualBoundingBoxDescent)/2;t.beginPath(),t.moveTo(n-o,i-a-s),t.lineTo(n+o,i-a-s),t.quadraticCurveTo(n+o+s,i-a-s,n+o+s,i-a),t.lineTo(n+o+s,i+a),t.quadraticCurveTo(n+o+s,i+a+s,n+o,i+a+s),t.lineTo(n-o,i+a+s),t.quadraticCurveTo(n-o-s,i+a+s,n-o-s,i+a),t.lineTo(n-o-s,i-a),t.quadraticCurveTo(n-o-s,i-a-s,n-o,i-a-s),t.closePath(),t.lineWidth=5,t.fillStyle="rgba(0, 0, 0, 0.3)",t.fill(),t.stroke(),t.font=this._font,t.textAlign="center",t.textBaseline="middle",t.strokeStyle=this._color,t.fillStyle=this._color,t.fillText(r+"%",n,i),this._texture.needsUpdate=!0,this._mesh.scale.setScalar(1/e)}show(){this._mesh.visible=!0}hide(){this._mesh.visible=!1}}class Ze{constructor({min:e=.05,max:t=5}={}){this._enabled=!1,this._active=!1,this._prevCoordDistance=-1,this._scaleMultiplier=1,this._ui=new Ye,this._motion=new S({duration:0,range:{min:e,max:t}}),this._motion.reset(1),this._ui=new Ye}get enabled(){return this._enabled}get scale(){return this._scaleMultiplier}get ui(){return this._ui}get range(){return this._motion.range}setInitialScale({scene:e,model:t,floorPosition:i,xrCam:s,initialScale:r}){var n=this._motion,a=n.range;if(r===$){var o=2*Math.atan(1/s.projectionMatrix.elements[5]),l=s.projectionMatrix.elements[0]/s.projectionMatrix.elements[5],s=s.position,h=t.bbox.max.y-t.bbox.min.y,s=s.distanceTo((new O.Vector3).addVectors(i,new O.Vector3(0,h/2,0)))*Math.tan(o/2),i=s*l,h=t.bbox.getBoundingSphere(new O.Sphere),o=s/h.radius,l=i/h.radius;const c=d(Math.min(l,o),a.min,1);n.reset(c)}else n.reset(d(r,a.min,a.max));const c=this._motion.val;this._scaleMultiplier=c,e.setModelScale(c)}setInitialPos(e){this._prevCoordDistance=(new O.Vector2).subVectors(e[0],e[1]).length()}enable(){this._enabled=!0}disable(){this._enabled=!1,this.deactivate()}activate(e){this._active=!0,this._ui.show(),this._updateUIPosition(e)}deactivate(){this._active=!1,this._ui.hide(),this._prevCoordDistance=-1}process(e,{coords:t}){var i,s;2===t.length&&this._enabled&&this._active&&(i=this._motion,s=(t=(new O.Vector2).subVectors(t[0],t[1]).length())-this._prevCoordDistance,i.setEndDelta(s),this._prevCoordDistance=t,this._updateUIPosition(e))}update({scene:e},t){var i;this._enabled&&this._active&&((i=this._motion).update(t),this._scaleMultiplier=i.val,this._ui.updateScale(this._scaleMultiplier),e.setModelScale(this._scaleMultiplier))}_updateUIPosition({view3D:e,scene:t,xrCam:i,vertical:s}){e=e.model,i=(new O.Vector3).setFromMatrixPosition(i.matrixWorld),s=s?e.bbox.getBoundingSphere(new O.Sphere).radius:e.bbox.max.y-e.bbox.min.y;this._ui.updatePosition(t.root.quaternion,i,s)}}class Qe{constructor({ringOpacity:e=.3,dirIndicatorOpacity:t=1,fadeoutDuration:i=1e3}={}){var s=Math.PI/18,r=new O.RingGeometry(.975,1,150,1,-6*s,30*s),s=(r.rotateX(-Math.PI/2),new O.RingGeometry(.96,1.015,30,1,25*s,4*s)),n=s.attributes["position"],a=Math.floor(11*n.count/16),o=Math.floor(13*n.count/16),l=Math.floor((o-a+1)/2),h=(new O.Vector3).fromBufferAttribute(n,a).y;for(let e=a;e<o;e++){var c=e-a,c=.025*(l-Math.abs(c-l));n.setY(e,h-c)}s.rotateX(-Math.PI/2);var d=new O.MeshBasicMaterial({transparent:!0,opacity:e,color:16777215})