@vizbl/room-viewer 0.0.18 → 0.0.19

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.
@@ -143,17 +143,17 @@ void main() {
143
143
  vec3 clampedHdrColor = max( HALF_FLOAT_MIN, min( HALF_FLOAT_MAX, hdrColor ));
144
144
  gl_FragColor = vec4( clampedHdrColor , 1.0 );
145
145
  }
146
- `;class SM extends F.ShaderMaterial{_maxDisplayBoost;_hdrCapacityMin;_hdrCapacityMax;constructor({gamma:e,offsetHdr:t,offsetSdr:r,gainMapMin:n,gainMapMax:i,maxDisplayBoost:a,hdrCapacityMin:o,hdrCapacityMax:s,sdr:l,gainMap:u}){super({name:"GainMapDecoderMaterial",vertexShader:SE,fragmentShader:Sz,uniforms:{sdr:{value:l},gainMap:{value:u},gamma:{value:new F.Vector3(1/e[0],1/e[1],1/e[2])},offsetHdr:{value:new F.Vector3().fromArray(t)},offsetSdr:{value:new F.Vector3().fromArray(r)},gainMapMin:{value:new F.Vector3().fromArray(n)},gainMapMax:{value:new F.Vector3().fromArray(i)},weightFactor:{value:(Math.log2(a)-o)/(s-o)}},blending:F.NoBlending,depthTest:!1,depthWrite:!1}),this._maxDisplayBoost=a,this._hdrCapacityMin=o,this._hdrCapacityMax=s,this.needsUpdate=!0,this.uniformsNeedUpdate=!0}get sdr(){return this.uniforms.sdr.value}set sdr(e){this.uniforms.sdr.value=e}get gainMap(){return this.uniforms.gainMap.value}set gainMap(e){this.uniforms.gainMap.value=e}get offsetHdr(){return this.uniforms.offsetHdr.value.toArray()}set offsetHdr(e){this.uniforms.offsetHdr.value.fromArray(e)}get offsetSdr(){return this.uniforms.offsetSdr.value.toArray()}set offsetSdr(e){this.uniforms.offsetSdr.value.fromArray(e)}get gainMapMin(){return this.uniforms.gainMapMin.value.toArray()}set gainMapMin(e){this.uniforms.gainMapMin.value.fromArray(e)}get gainMapMax(){return this.uniforms.gainMapMax.value.toArray()}set gainMapMax(e){this.uniforms.gainMapMax.value.fromArray(e)}get gamma(){let e=this.uniforms.gamma.value;return[1/e.x,1/e.y,1/e.z]}set gamma(e){let t=this.uniforms.gamma.value;t.x=1/e[0],t.y=1/e[1],t.z=1/e[2]}get hdrCapacityMin(){return this._hdrCapacityMin}set hdrCapacityMin(e){this._hdrCapacityMin=e,this.calculateWeight()}get hdrCapacityMax(){return this._hdrCapacityMax}set hdrCapacityMax(e){this._hdrCapacityMax=e,this.calculateWeight()}get maxDisplayBoost(){return this._maxDisplayBoost}set maxDisplayBoost(e){this._maxDisplayBoost=Math.max(1,Math.min(65504,e)),this.calculateWeight()}calculateWeight(){let e=(Math.log2(this._maxDisplayBoost)-this._hdrCapacityMin)/(this._hdrCapacityMax-this._hdrCapacityMin);this.uniforms.weightFactor.value=Math.max(0,Math.min(1,e))}}en={renderer:F.WebGLRenderer,createMaterial:e=>new SM(e),createQuadRenderer:e=>new Sb(e)},e=>{let{sdr:t,gainMap:r,renderer:n}=e;t.colorSpace!==F.SRGBColorSpace&&(console.warn("SDR Colorspace needs to be *SRGBColorSpace*, setting it automatically"),t.colorSpace=F.SRGBColorSpace),t.needsUpdate=!0,r.colorSpace!==F.LinearSRGBColorSpace&&(console.warn("Gainmap Colorspace needs to be *LinearSRGBColorSpace*, setting it automatically"),r.colorSpace=F.LinearSRGBColorSpace),r.needsUpdate=!0;let i=en.createMaterial({...e,sdr:t,gainMap:r});return en.createQuadRenderer({width:t.image.width,height:t.image.height,type:F.HalfFloatType,colorSpace:F.LinearSRGBColorSpace,material:i,renderer:n,renderTargetOptions:e.renderTargetOptions})};class ST extends Sk{constructor(e,t){super({renderer:e,createMaterial:e=>new SM(e),createQuadRenderer:e=>new Sb(e)},t)}async render(e,t,r,n){let{sdrImage:i,gainMapImage:a,needsFlip:o}=await this.processImages(r,n,"flipY"),{gainMap:s,sdr:l}=this.createTextures(i,a,o);this.updateQuadRenderer(e,i,s,l,t),e.render()}}class SB extends ST{load([e,t,r],n,i,a){let o,s,l,u=this.prepareQuadRenderer(),c=async()=>{if(o&&s&&l){try{await this.render(u,l,o,s)}catch(n){this.manager.itemError(e),this.manager.itemError(t),this.manager.itemError(r),"function"==typeof a&&a(n),u.disposeOnDemandRenderer();return}"function"==typeof n&&n(u),this.manager.itemEnd(e),this.manager.itemEnd(t),this.manager.itemEnd(r),u.disposeOnDemandRenderer()}},d=!0,f=0,p=0,h=!0,m=0,g=0,v=!0,b=0,w=0,y=()=>{"function"==typeof i&&i(new ProgressEvent("progress",{lengthComputable:d&&h&&v,loaded:p+g+w,total:f+m+b}))};this.manager.itemStart(e),this.manager.itemStart(t),this.manager.itemStart(r);let x=new F.FileLoader(this._internalLoadingManager);x.setResponseType("arraybuffer"),x.setRequestHeader(this.requestHeader),x.setPath(this.path),x.setWithCredentials(this.withCredentials),x.load(e,async e=>{if("string"==typeof e)throw Error("Invalid sdr buffer");o=e,await c()},e=>{d=e.lengthComputable,p=e.loaded,f=e.total,y()},t=>{this.manager.itemError(e),"function"==typeof a&&a(t)});let C=new F.FileLoader(this._internalLoadingManager);C.setResponseType("arraybuffer"),C.setRequestHeader(this.requestHeader),C.setPath(this.path),C.setWithCredentials(this.withCredentials),C.load(t,async e=>{if("string"==typeof e)throw Error("Invalid gainmap buffer");s=e,await c()},e=>{h=e.lengthComputable,g=e.loaded,m=e.total,y()},e=>{this.manager.itemError(t),"function"==typeof a&&a(e)});let A=new F.FileLoader(this._internalLoadingManager);return A.setRequestHeader(this.requestHeader),A.setPath(this.path),A.setWithCredentials(this.withCredentials),A.load(r,async e=>{if("string"!=typeof e)throw Error("Invalid metadata string");l=JSON.parse(e),await c()},e=>{v=e.lengthComputable,w=e.loaded,b=e.total,y()},e=>{this.manager.itemError(r),"function"==typeof a&&a(e)}),u}}class SP extends ST{load(e,t,r,n){let i=this.prepareQuadRenderer(),a=new F.FileLoader(this._internalLoadingManager);return a.setResponseType("arraybuffer"),a.setRequestHeader(this.requestHeader),a.setPath(this.path),a.setWithCredentials(this.withCredentials),this.manager.itemStart(e),a.load(e,async r=>{let a,o,s;if("string"==typeof r)throw Error("Invalid buffer, received [string], was expecting [ArrayBuffer]");let l=new Uint8Array(r);try{let e=await SA(l);a=e.sdr,o=e.gainMap,s=e.metadata}catch(t){if(t instanceof Sy||t instanceof Sw)console.warn(`Failure to reconstruct an HDR image from ${e}: Gain map metadata not found in the file, HDRJPGLoader will render the SDR jpeg`),s={gainMapMin:[0,0,0],gainMapMax:[1,1,1],gamma:[1,1,1],hdrCapacityMin:0,hdrCapacityMax:1,offsetHdr:[0,0,0],offsetSdr:[0,0,0]},a=l;else throw t}try{await this.render(i,s,a.buffer,o?.buffer)}catch(t){this.manager.itemError(e),"function"==typeof n&&n(t),i.disposeOnDemandRenderer();return}"function"==typeof t&&t(i),this.manager.itemEnd(e),i.disposeOnDemandRenderer()},r,t=>{this.manager.itemError(e),"function"==typeof n&&n(t)}),i}}let SR={apartment:"lebombo_1k.hdr",city:"potsdamer_platz_1k.hdr",dawn:"kiara_1_dawn_1k.hdr",forest:"forest_slope_1k.hdr",lobby:"st_fagans_interior_1k.hdr",night:"dikhololo_night_1k.hdr",park:"rooitou_park_1k.hdr",studio:"studio_small_03_1k.hdr",sunset:"venice_sunset_1k.hdr",warehouse:"empty_warehouse_01_1k.hdr"},S_="https://raw.githack.com/pmndrs/drei-assets/456060a26bbeb8fdf79326f224b6d99b8bcce736/hdri/",SI=["/px.png","/nx.png","/py.png","/ny.png","/pz.png","/nz.png"];function SO({files:e=SI,path:t="",preset:r,colorSpace:n,extensions:i}={}){r&&(SD(r),e=SR[r],t=S_);let a=Array.isArray(e),{extension:o,isCubemap:s}=SN(e),l=Sj(o);if(!l)throw Error("useEnvironment: Unrecognized file extension: "+e);let u=x6(e=>e.gl);(0,ep.useLayoutEffect)(()=>{("webp"===o||"jpg"===o||"jpeg"===o)&&u.domElement.addEventListener("webglcontextlost",function(){Ce.clear(l,a?[e]:e)},{once:!0})},[e,u.domElement]);let c=Ce(l,a?[e]:e,e=>{("webp"===o||"jpg"===o||"jpeg"===o)&&e.setRenderer(u),null==e.setPath||e.setPath(t),i&&i(e)}),d=a?c[0]:c;if("jpg"===o||"jpeg"===o||"webp"===o){var f;d=null==(f=d.renderTarget)?void 0:f.texture}return d.mapping=s?F.CubeReflectionMapping:F.EquirectangularReflectionMapping,d.colorSpace=null!=n?n:s?"srgb":"srgb-linear",d}let SL={files:SI,path:"",preset:void 0,extensions:void 0};SO.preload=e=>{let t={...SL,...e},{files:r,path:n=""}=t,{preset:i,extensions:a}=t;i&&(SD(i),r=SR[i],n=S_);let{extension:o}=SN(r);if("webp"===o||"jpg"===o||"jpeg"===o)throw Error("useEnvironment: Preloading gainmaps is not supported");let s=Sj(o);if(!s)throw Error("useEnvironment: Unrecognized file extension: "+r);Ce.preload(s,Array.isArray(r)?[r]:r,e=>{null==e.setPath||e.setPath(n),a&&a(e)})};let SF={files:SI,preset:void 0};function SD(e){if(!(e in SR))throw Error("Preset must be one of: "+Object.keys(SR).join(", "))}function SN(e){var t;let r=Array.isArray(e)&&6===e.length,n=Array.isArray(e)&&3===e.length&&e.some(e=>e.endsWith("json")),i=Array.isArray(e)?e[0]:e;return{extension:r?"cube":n?"webp":i.startsWith("data:application/exr")?"exr":i.startsWith("data:application/hdr")?"hdr":i.startsWith("data:image/jpeg")?"jpg":null==(t=i.split(".").pop())||null==(t=t.split("?"))||null==(t=t.shift())?void 0:t.toLowerCase(),isCubemap:r,isGainmap:n}}function Sj(e){return"cube"===e?F.CubeTextureLoader:"hdr"===e?AQ:"exr"===e?Sg:"jpg"===e||"jpeg"===e?SP:"webp"===e?SB:null}function SH(e,t,r,n,i={}){var a,o,s,l,u;let c;i={backgroundBlurriness:0,backgroundIntensity:1,backgroundRotation:[0,0,0],environmentIntensity:1,environmentRotation:[0,0,0],...i};let d=(c=u=t||r).current&&c.current.isScene?u.current:u,f=d.background,p=d.environment,h={backgroundBlurriness:d.backgroundBlurriness,backgroundIntensity:d.backgroundIntensity,backgroundRotation:null!=(a=null==(o=d.backgroundRotation)||null==o.clone?void 0:o.clone())?a:[0,0,0],environmentIntensity:d.environmentIntensity,environmentRotation:null!=(s=null==(l=d.environmentRotation)||null==l.clone?void 0:l.clone())?s:[0,0,0]};return"only"!==e&&(d.environment=n),e&&(d.background=n),xY(d,i),()=>{"only"!==e&&(d.environment=p),e&&(d.background=f),xY(d,h)}}function SU({scene:e,background:t=!1,map:r,...n}){let i=x6(e=>e.scene);return ep.useLayoutEffect(()=>{if(r)return SH(t,e,i,r,n)}),null}function SG({background:e=!1,scene:t,blur:r,backgroundBlurriness:n,backgroundIntensity:i,backgroundRotation:a,environmentIntensity:o,environmentRotation:s,...l}){let u=SO(l),c=x6(e=>e.scene);return ep.useLayoutEffect(()=>SH(e,t,c,u,{backgroundBlurriness:null!=r?r:n,backgroundIntensity:i,backgroundRotation:a,environmentIntensity:o,environmentRotation:s})),ep.useEffect(()=>()=>{u.dispose()},[u]),null}function Sq({children:e,near:t=.1,far:r=1e3,resolution:n=256,frames:i=1,map:a,background:o=!1,blur:s,backgroundBlurriness:l,backgroundIntensity:u,backgroundRotation:c,environmentIntensity:d,environmentRotation:f,scene:p,files:h,path:m,preset:g,extensions:v}){var b;let w=x6(e=>e.gl),y=x6(e=>e.scene),x=ep.useRef(null),[C]=ep.useState(()=>new F.Scene),A=ep.useMemo(()=>{let e=new F.WebGLCubeRenderTarget(n);return e.texture.type=F.HalfFloatType,e},[n]);ep.useEffect(()=>()=>{A.dispose()},[A]),ep.useLayoutEffect(()=>{if(1===i){let e=w.autoClear;w.autoClear=!0,x.current.update(w,C),w.autoClear=e}return SH(o,p,y,A.texture,{backgroundBlurriness:null!=s?s:l,backgroundIntensity:u,backgroundRotation:c,environmentIntensity:d,environmentRotation:f})},[e,C,A.texture,p,y,o,i,w]);let S=1;return!function(e,t=0){let r=x9(),n=r.getState().internal.subscribe,i=xL(e);xO(()=>n(i,t,r),[t,n,r])}(()=>{if(i===1/0||S<i){let e=w.autoClear;w.autoClear=!0,x.current.update(w,C),w.autoClear=e,S++}}),ep.createElement(ep.Fragment,null,(b=ep.createElement(ep.Fragment,null,e,ep.createElement("cubeCamera",{ref:x,args:[t,r,A]}),h||g?ep.createElement(SG,{background:!0,files:h,preset:g,path:m,extensions:v}):a?ep.createElement(SU,{background:!0,map:a,extensions:v}):null),(0,eg.jsx)(Ck,{children:b,container:C,state:void 0})))}function S$(e){var t,r,n,i;let a=SO(e),o=e.map||a;ep.useMemo(()=>Cl({GroundProjectedEnvImpl:AJ}),[]),ep.useEffect(()=>()=>{a.dispose()},[a]);let s=ep.useMemo(()=>[o],[o]),l=null==(t=e.ground)?void 0:t.height,u=null==(r=e.ground)?void 0:r.radius,c=null!=(n=null==(i=e.ground)?void 0:i.scale)?n:1e3;return ep.createElement(ep.Fragment,null,ep.createElement(SU,yz({},e,{map:o})),ep.createElement("groundProjectedEnvImpl",{args:s,scale:c,height:l,radius:u}))}function SV(e){return e.ground?ep.createElement(S$,e):e.map?ep.createElement(SU,e):e.children?ep.createElement(Sq,e):ep.createElement(SG,e)}function SK(e,t){let r;return(...n)=>{window.clearTimeout(r),r=window.setTimeout(()=>e(...n),t)}}SO.clear=e=>{let t={...SF,...e},{files:r}=t,{preset:n}=t;n&&(SD(n),r=SR[n]);let{extension:i}=SN(r),a=Sj(i);if(!a)throw Error("useEnvironment: Unrecognized file extension: "+r);Ce.clear(a,Array.isArray(r)?[r]:r)};let SJ=["x","y","top","bottom","left","right","width","height"];function SQ({ref:e,children:t,fallback:r,resize:n,style:i,gl:a,events:o=CD,eventSource:s,eventPrefix:l,shadows:u,linear:c,flat:d,legacy:f,orthographic:p,frameloop:h,dpr:m,performance:g,raycaster:v,camera:b,scene:w,onPointerMissed:y,onCreated:x,...C}){let A,S,k;ep.useMemo(()=>Cl(F),[]);let E=(A=xB(),S=function(){let e=xB(),[t]=ep.useState(()=>new Map);t.clear();let r=e;for(;r;){let e=r.type;xR(e)&&e!==xM&&!t.has(e)&&t.set(e,ep.use(xz(e))),r=r.return}return t}(),k=ep.useMemo(()=>Array.from(S.keys()).reduce((e,t)=>r=>ep.createElement(e,null,ep.createElement(t.Provider,{...r,value:S.get(t)})),e=>ep.createElement(xT,{...e})),[S]),ep.useMemo(()=>({children:e})=>{let t=xE(A,!0,e=>e.type===ep.StrictMode)?ep.StrictMode:ep.Fragment;return(0,eg.jsx)(t,{children:(0,eg.jsx)(k,{children:e})})},[A,k])),[z,M]=function({debounce:e,scroll:t,polyfill:r,offsetSize:n}={debounce:0,scroll:!1,offsetSize:!1}){var i,a,o;let s=r||("undefined"==typeof window?class{}:window.ResizeObserver);if(!s)throw Error("This browser does not support ResizeObserver out of the box. See: https://github.com/react-spring/react-use-measure/#resize-observer-polyfills");let[l,u]=(0,ep.useState)({left:0,top:0,width:0,height:0,bottom:0,right:0,x:0,y:0}),c=(0,ep.useRef)({element:null,scrollContainers:null,resizeObserver:null,lastBounds:l,orientationHandler:null}),d=e?"number"==typeof e?e:e.scroll:null,f=e?"number"==typeof e?e:e.resize:null,p=(0,ep.useRef)(!1);(0,ep.useEffect)(()=>(p.current=!0,()=>void(p.current=!1)));let[h,m,g]=(0,ep.useMemo)(()=>{let e=()=>{let e,t;if(!c.current.element)return;let{left:r,top:i,width:a,height:o,bottom:s,right:l,x:d,y:f}=c.current.element.getBoundingClientRect(),h={left:r,top:i,width:a,height:o,bottom:s,right:l,x:d,y:f};c.current.element instanceof HTMLElement&&n&&(h.height=c.current.element.offsetHeight,h.width=c.current.element.offsetWidth),Object.freeze(h),p.current&&(e=c.current.lastBounds,t=h,!SJ.every(r=>e[r]===t[r]))&&u(c.current.lastBounds=h)};return[e,f?SK(e,f):e,d?SK(e,d):e]},[u,n,d,f]);function v(){c.current.scrollContainers&&(c.current.scrollContainers.forEach(e=>e.removeEventListener("scroll",g,!0)),c.current.scrollContainers=null),c.current.resizeObserver&&(c.current.resizeObserver.disconnect(),c.current.resizeObserver=null),c.current.orientationHandler&&("orientation"in screen&&"removeEventListener"in screen.orientation?screen.orientation.removeEventListener("change",c.current.orientationHandler):"onorientationchange"in window&&window.removeEventListener("orientationchange",c.current.orientationHandler))}function b(){c.current.element&&(c.current.resizeObserver=new s(g),c.current.resizeObserver.observe(c.current.element),t&&c.current.scrollContainers&&c.current.scrollContainers.forEach(e=>e.addEventListener("scroll",g,{capture:!0,passive:!0})),c.current.orientationHandler=()=>{g()},"orientation"in screen&&"addEventListener"in screen.orientation?screen.orientation.addEventListener("change",c.current.orientationHandler):"onorientationchange"in window&&window.addEventListener("orientationchange",c.current.orientationHandler))}return i=g,a=!!t,(0,ep.useEffect)(()=>{if(a)return window.addEventListener("scroll",i,{capture:!0,passive:!0}),()=>void window.removeEventListener("scroll",i,!0)},[i,a]),o=m,(0,ep.useEffect)(()=>(window.addEventListener("resize",o),()=>void window.removeEventListener("resize",o)),[o]),(0,ep.useEffect)(()=>{v(),b()},[t,g,m]),(0,ep.useEffect)(()=>v,[]),[e=>{e&&e!==c.current.element&&(v(),c.current.element=e,c.current.scrollContainers=function e(t){let r=[];if(!t||t===document.body)return r;let{overflow:n,overflowX:i,overflowY:a}=window.getComputedStyle(t);return[n,i,a].some(e=>"auto"===e||"scroll"===e)&&r.push(t),[...r,...e(t.parentElement)]}(e),b())},l,h]}({scroll:!0,debounce:{scroll:50,resize:0},...n}),T=ep.useRef(null),B=ep.useRef(null);ep.useImperativeHandle(e,()=>T.current);let P=xL(y),[R,_]=ep.useState(!1),[I,O]=ep.useState(!1);if(R)throw R;if(I)throw I;let L=ep.useRef(null);xO(()=>{let e=T.current;if(M.width>0&&M.height>0&&e){let r,n,i,y,C,A,S,k,z,T,R,I,D,N,j;L.current||(y=null==(i=Cx.get(e))?void 0:i.fiber,C=null==i?void 0:i.store,i&&console.warn("R3F.createRoot should only be called once!"),A="function"==typeof reportError?reportError:console.error,I=C||(z=(k=(S=xx((e,t)=>{let r,n=new F.Vector3,i=new F.Vector3,a=new F.Vector3;function o(e=t().camera,r=i,s=t().size){let{width:l,height:u,top:c,left:d}=s,f=l/u;r.isVector3?a.copy(r):a.set(...r);let p=e.getWorldPosition(n).distanceTo(a);if(e&&e.isOrthographicCamera)return{width:l/e.zoom,height:u/e.zoom,top:c,left:d,factor:1,distance:p,aspect:f};{let t=2*Math.tan(e.fov*Math.PI/180/2)*p,r=l/u*t;return{width:r,height:t,top:c,left:d,factor:l/r,distance:p,aspect:f}}}let s=t=>e(e=>({performance:{...e.performance,current:t}})),l=new F.Vector2;return{set:e,get:t,gl:null,camera:null,raycaster:null,events:{priority:1,enabled:!0,connected:!1},scene:null,xr:null,invalidate:(e=1)=>CO(t(),e),advance:(e,r)=>CL(e,r,t()),legacy:!1,linear:!1,flat:!1,controls:null,clock:new F.Clock,pointer:l,mouse:l,frameloop:"always",onPointerMissed:void 0,performance:{current:1,min:.5,max:1,debounce:200,regress:()=>{let e=t();r&&clearTimeout(r),e.performance.current!==e.performance.min&&s(e.performance.min),r=setTimeout(()=>s(t().performance.max),e.performance.debounce)}},size:{width:0,height:0,top:0,left:0},viewport:{initialDpr:0,dpr:0,width:0,height:0,top:0,left:0,aspect:0,distance:0,factor:0,getCurrentViewport:o},setEvents:t=>e(e=>({...e,events:{...e.events,...t}})),setSize:(r,n,a=0,s=0)=>{let l=t().camera,u={width:r,height:n,top:a,left:s};e(e=>({size:u,viewport:{...e.viewport,...o(l,i,u)}}))},setDpr:t=>e(e=>{let r=xN(t);return{viewport:{...e.viewport,dpr:r,initialDpr:e.viewport.initialDpr||r}}}),setFrameloop:(r="always")=>{let n=t().clock;n.stop(),n.elapsedTime=0,"never"!==r&&(n.start(),n.elapsedTime=0),e(()=>({frameloop:r}))},previousRoot:void 0,internal:{interaction:[],hovered:new Map,subscribers:[],initialClick:[0,0],initialHits:[],capturedMap:new Map,lastEvent:ep.createRef(),active:!1,frames:0,priority:0,subscribe:(e,r,n)=>{let i=t().internal;return i.priority=i.priority+ +(r>0),i.subscribers.push({ref:e,priority:r,store:n}),i.subscribers=i.subscribers.sort((e,t)=>e.priority-t.priority),()=>{let n=t().internal;null!=n&&n.subscribers&&(n.priority=n.priority-(r>0),n.subscribers=n.subscribers.filter(t=>t.ref!==e))}}}}})).getState()).size,T=k.viewport.dpr,R=k.camera,S.subscribe(()=>{let{camera:e,size:t,viewport:r,gl:n,set:i}=S.getState();if(t.width!==z.width||t.height!==z.height||r.dpr!==T){z=t,T=r.dpr,x0(e,t),r.dpr>0&&n.setPixelRatio(r.dpr);let i="undefined"!=typeof HTMLCanvasElement&&n.domElement instanceof HTMLCanvasElement;n.setSize(t.width,t.height,i)}e!==R&&(R=e,i(t=>({viewport:{...t.viewport,...t.viewport.getCurrentViewport(e)}})))}),S.subscribe(e=>CO(e)),S),D=y||Cy.createContainer(I,1,null,!1,null,"",A,A,A,null),i||Cx.set(e,{fiber:D,store:I}),N=!1,j=null,L.current={async configure(t={}){var i,a;let o;j=new Promise(e=>o=e);let{gl:s,size:l,scene:u,events:c,onCreated:d,shadows:f=!1,linear:p=!1,flat:h=!1,legacy:m=!1,orthographic:g=!1,frameloop:v="always",dpr:b=[1,2],performance:w,raycaster:y,camera:x,onPointerMissed:C}=t,A=I.getState(),S=A.gl;if(!A.gl){let t={canvas:e,powerPreference:"high-performance",antialias:!0,alpha:!0},r="function"==typeof s?await s(t):s;S=x5(r)?r:new F.WebGLRenderer({...t,...s}),A.set({gl:S})}let k=A.raycaster;k||A.set({raycaster:k=new F.Raycaster});let{params:E,...z}=y||{};if(xH.equ(z,k,CC)||xY(k,{...z}),xH.equ(E,k.params,CC)||xY(k,{params:{...k.params,...E}}),!A.camera||A.camera===n&&!xH.equ(n,x,CC)){n=x;let e=null==x?void 0:x.isCamera,t=e?x:g?new F.OrthographicCamera(0,0,0,0,.1,1e3):new F.PerspectiveCamera(75,0,.1,1e3);!e&&(t.position.z=5,x&&(xY(t,x),!t.manual&&("aspect"in x||"left"in x||"right"in x||"bottom"in x||"top"in x)&&(t.manual=!0,t.updateProjectionMatrix())),A.camera||null!=x&&x.rotation||t.lookAt(0,0,0)),A.set({camera:t}),k.camera=t}if(!A.scene){let e;null!=u&&u.isScene?xG(e=u,I,"",{}):(xG(e=new F.Scene,I,"",{}),u&&xY(e,u)),A.set({scene:e})}c&&!A.events.handlers&&A.set({events:c(I)});let M=function(e,t){if(!t&&"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement&&e.parentElement){let{width:t,height:r,top:n,left:i}=e.parentElement.getBoundingClientRect();return{width:t,height:r,top:n,left:i}}return!t&&"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas?{width:e.width,height:e.height,top:0,left:0}:{width:0,height:0,top:0,left:0,...t}}(e,l);if(xH.equ(M,A.size,CC)||A.setSize(M.width,M.height,M.top,M.left),b&&A.viewport.dpr!==xN(b)&&A.setDpr(b),A.frameloop!==v&&A.setFrameloop(v),A.onPointerMissed||A.set({onPointerMissed:C}),w&&!xH.equ(w,A.performance,CC)&&A.set(e=>({performance:{...e.performance,...w}})),!A.xr){let e=(e,t)=>{let r=I.getState();"never"!==r.frameloop&&CL(e,!0,r,t)},t=()=>{let t=I.getState();t.gl.xr.enabled=t.gl.xr.isPresenting,t.gl.xr.setAnimationLoop(t.gl.xr.isPresenting?e:null),t.gl.xr.isPresenting||CO(t)},r={connect(){let e=I.getState().gl;e.xr.addEventListener("sessionstart",t),e.xr.addEventListener("sessionend",t)},disconnect(){let e=I.getState().gl;e.xr.removeEventListener("sessionstart",t),e.xr.removeEventListener("sessionend",t)}};"function"==typeof(null==(i=S.xr)?void 0:i.addEventListener)&&r.connect(),A.set({xr:r})}if(S.shadowMap){let e=S.shadowMap.enabled,t=S.shadowMap.type;if(S.shadowMap.enabled=!!f,xH.boo(f))S.shadowMap.type=F.PCFSoftShadowMap;else if(xH.str(f)){let e={basic:F.BasicShadowMap,percentage:F.PCFShadowMap,soft:F.PCFSoftShadowMap,variance:F.VSMShadowMap};S.shadowMap.type=null!=(a=e[f])?a:F.PCFSoftShadowMap}else xH.obj(f)&&Object.assign(S.shadowMap,f);(e!==S.shadowMap.enabled||t!==S.shadowMap.type)&&(S.shadowMap.needsUpdate=!0)}return F.ColorManagement.enabled=!m,N||(S.outputColorSpace=p?F.LinearSRGBColorSpace:F.SRGBColorSpace,S.toneMapping=h?F.NoToneMapping:F.ACESFilmicToneMapping),A.legacy!==m&&A.set(()=>({legacy:m})),A.linear!==p&&A.set(()=>({linear:p})),A.flat!==h&&A.set(()=>({flat:h})),!s||xH.fun(s)||x5(s)||xH.equ(s,S,CC)||xY(S,s),r=d,N=!0,o(),this},render(t){return N||j||this.configure(),j.then(()=>{Cy.updateContainer((0,eg.jsx)(CA,{store:I,children:t,onCreated:r,rootElement:e}),D,null,()=>void 0)}),I},unmount(){CS(e)}}),async function(){await L.current.configure({gl:a,scene:w,events:o,shadows:u,linear:c,flat:d,legacy:f,orthographic:p,frameloop:h,dpr:m,performance:g,raycaster:v,camera:b,size:M,onPointerMissed:(...e)=>null==P.current?void 0:P.current(...e),onCreated:e=>{null==e.events.connect||e.events.connect(s?s&&s.hasOwnProperty("current")?s.current:s:B.current),l&&e.setEvents({compute:(e,t)=>{let r=e[l+"X"],n=e[l+"Y"];t.pointer.set(r/t.size.width*2-1,-(2*(n/t.size.height))+1),t.raycaster.setFromCamera(t.pointer,t.camera)}}),null==x||x(e)}}),L.current.render((0,eg.jsx)(E,{children:(0,eg.jsx)(xD,{set:O,children:(0,eg.jsx)(ep.Suspense,{fallback:(0,eg.jsx)(xF,{set:_}),children:null!=t?t:null})})}))}()}}),ep.useEffect(()=>{let e=T.current;if(e)return()=>CS(e)},[]);let D=s?"none":"auto";return(0,eg.jsx)("div",{ref:B,style:{position:"relative",width:"100%",height:"100%",overflow:"hidden",pointerEvents:D,...i},...C,children:(0,eg.jsx)("div",{ref:z,style:{width:"100%",height:"100%"},children:(0,eg.jsx)("canvas",{ref:T,style:{display:"block"},children:r})})})}function SW(e){return(0,eg.jsx)(xT,{children:(0,eg.jsx)(SQ,{...e})})}let SX={width:void 0,height:void 0};function SY(e,t,r){return e[t]?Array.isArray(e[t])?e[t][0][r]:e[t][r]:"contentBoxSize"===t?e.contentRect["inlineSize"===r?"width":"height"]:void 0}let{slice:SZ,forEach:S0}=[],S1=/^[\u0009\u0020-\u007e\u0080-\u00ff]+$/,S2=function(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{path:"/"},n=encodeURIComponent(t),i=`${e}=${n}`;if(r.maxAge>0){let e=r.maxAge-0;if(Number.isNaN(e))throw Error("maxAge should be a Number");i+=`; Max-Age=${Math.floor(e)}`}if(r.domain){if(!S1.test(r.domain))throw TypeError("option domain is invalid");i+=`; Domain=${r.domain}`}if(r.path){if(!S1.test(r.path))throw TypeError("option path is invalid");i+=`; Path=${r.path}`}if(r.expires){if("function"!=typeof r.expires.toUTCString)throw TypeError("option expires is invalid");i+=`; Expires=${r.expires.toUTCString()}`}if(r.httpOnly&&(i+="; HttpOnly"),r.secure&&(i+="; Secure"),r.sameSite)switch("string"==typeof r.sameSite?r.sameSite.toLowerCase():r.sameSite){case!0:case"strict":i+="; SameSite=Strict";break;case"lax":i+="; SameSite=Lax";break;case"none":i+="; SameSite=None";break;default:throw TypeError("option sameSite is invalid")}return r.partitioned&&(i+="; Partitioned"),i},S3={create(e,t,r,n){let i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{path:"/",sameSite:"strict"};r&&(i.expires=new Date,i.expires.setTime(i.expires.getTime()+60*r*1e3)),n&&(i.domain=n),document.cookie=S2(e,t,i)},read(e){let t=`${e}=`,r=document.cookie.split(";");for(let e=0;e<r.length;e++){let n=r[e];for(;" "===n.charAt(0);)n=n.substring(1,n.length);if(0===n.indexOf(t))return n.substring(t.length,n.length)}return null},remove(e,t){this.create(e,"",-1,t)}};var S5={name:"cookie",lookup(e){let{lookupCookie:t}=e;if(t&&"undefined"!=typeof document)return S3.read(t)||void 0},cacheUserLanguage(e,t){let{lookupCookie:r,cookieMinutes:n,cookieDomain:i,cookieOptions:a}=t;r&&"undefined"!=typeof document&&S3.create(r,e,n,i,a)}},S4={name:"querystring",lookup(e){let t,{lookupQuerystring:r}=e;if("undefined"!=typeof window){let{search:e}=window.location;!window.location.search&&window.location.hash?.indexOf("?")>-1&&(e=window.location.hash.substring(window.location.hash.indexOf("?")));let n=e.substring(1).split("&");for(let e=0;e<n.length;e++){let i=n[e].indexOf("=");i>0&&n[e].substring(0,i)===r&&(t=n[e].substring(i+1))}}return t}},S9={name:"hash",lookup(e){let t,{lookupHash:r,lookupFromHashIndex:n}=e;if("undefined"!=typeof window){let{hash:e}=window.location;if(e&&e.length>2){let i=e.substring(1);if(r){let e=i.split("&");for(let n=0;n<e.length;n++){let i=e[n].indexOf("=");i>0&&e[n].substring(0,i)===r&&(t=e[n].substring(i+1))}}if(t)return t;if(!t&&n>-1){let t=e.match(/\/([a-zA-Z-]*)/g);if(!Array.isArray(t))return;return t["number"==typeof n?n:0]?.replace("/","")}}}return t}};let S6=null,S8=()=>{if(null!==S6)return S6;try{if(!(S6="undefined"!=typeof window&&null!==window.localStorage))return!1;let e="i18next.translate.boo";window.localStorage.setItem(e,"foo"),window.localStorage.removeItem(e)}catch(e){S6=!1}return S6};var S7={name:"localStorage",lookup(e){let{lookupLocalStorage:t}=e;if(t&&S8())return window.localStorage.getItem(t)||void 0},cacheUserLanguage(e,t){let{lookupLocalStorage:r}=t;r&&S8()&&window.localStorage.setItem(r,e)}};let ke=null,kt=()=>{if(null!==ke)return ke;try{if(!(ke="undefined"!=typeof window&&null!==window.sessionStorage))return!1;let e="i18next.translate.boo";window.sessionStorage.setItem(e,"foo"),window.sessionStorage.removeItem(e)}catch(e){ke=!1}return ke};var kr={name:"sessionStorage",lookup(e){let{lookupSessionStorage:t}=e;if(t&&kt())return window.sessionStorage.getItem(t)||void 0},cacheUserLanguage(e,t){let{lookupSessionStorage:r}=t;r&&kt()&&window.sessionStorage.setItem(r,e)}},kn={name:"navigator",lookup(e){let t=[];if("undefined"!=typeof navigator){let{languages:e,userLanguage:r,language:n}=navigator;if(e)for(let r=0;r<e.length;r++)t.push(e[r]);r&&t.push(r),n&&t.push(n)}return t.length>0?t:void 0}},ki={name:"htmlTag",lookup(e){let t,{htmlTag:r}=e,n=r||("undefined"!=typeof document?document.documentElement:null);return n&&"function"==typeof n.getAttribute&&(t=n.getAttribute("lang")),t}},ka={name:"path",lookup(e){let{lookupFromPathIndex:t}=e;if("undefined"==typeof window)return;let r=window.location.pathname.match(/\/([a-zA-Z-]*)/g);if(Array.isArray(r))return r["number"==typeof t?t:0]?.replace("/","")}},ko={name:"subdomain",lookup(e){let{lookupFromSubdomainIndex:t}=e,r="undefined"!=typeof window&&window.location?.hostname?.match(/^(\w{2,5})\.(([a-z0-9-]{1,63}\.[a-z]{2,6})|localhost)/i);if(r)return r["number"==typeof t?t+1:1]}};let ks=!1;try{document.cookie,ks=!0}catch(e){}let kl=["querystring","cookie","localStorage","sessionStorage","navigator","htmlTag"];ks||kl.splice(1,1);class ku{constructor(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.type="languageDetector",this.detectors={},this.init(e,t)}init(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{languageUtils:{}},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};this.services=e,this.options=function(e){return S0.call(SZ.call(arguments,1),t=>{if(t)for(let r in t)void 0===e[r]&&(e[r]=t[r])}),e}(t,this.options||{},{order:kl,lookupQuerystring:"lng",lookupCookie:"i18next",lookupLocalStorage:"i18nextLng",lookupSessionStorage:"i18nextLng",caches:["localStorage"],excludeCacheFor:["cimode"],convertDetectedLanguage:e=>e}),"string"==typeof this.options.convertDetectedLanguage&&this.options.convertDetectedLanguage.indexOf("15897")>-1&&(this.options.convertDetectedLanguage=e=>e.replace("-","_")),this.options.lookupFromUrlIndex&&(this.options.lookupFromPathIndex=this.options.lookupFromUrlIndex),this.i18nOptions=r,this.addDetector(S5),this.addDetector(S4),this.addDetector(S7),this.addDetector(kr),this.addDetector(kn),this.addDetector(ki),this.addDetector(ka),this.addDetector(ko),this.addDetector(S9)}addDetector(e){return this.detectors[e.name]=e,this}detect(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.options.order,t=[];return(e.forEach(e=>{if(this.detectors[e]){let r=this.detectors[e].lookup(this.options);r&&"string"==typeof r&&(r=[r]),r&&(t=t.concat(r))}}),t=t.filter(e=>null!=e&&!("string"==typeof e&&[/<\s*script.*?>/i,/<\s*\/\s*script\s*>/i,/<\s*img.*?on\w+\s*=/i,/<\s*\w+\s*on\w+\s*=.*?>/i,/javascript\s*:/i,/vbscript\s*:/i,/expression\s*\(/i,/eval\s*\(/i,/alert\s*\(/i,/document\.cookie/i,/document\.write\s*\(/i,/window\.location/i,/innerHTML/i].some(t=>t.test(e)))).map(e=>this.options.convertDetectedLanguage(e)),this.services&&this.services.languageUtils&&this.services.languageUtils.getBestMatchFromCodes)?t:t.length>0?t[0]:null}cacheUserLanguage(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.options.caches;!t||this.options.excludeCacheFor&&this.options.excludeCacheFor.indexOf(e)>-1||t.forEach(t=>{this.detectors[t]&&this.detectors[t].cacheUserLanguage(e,this.options)})}}ku.type="languageDetector";var kc=JSON.parse('{"camera":{"fov":45},"floor":{"z":185.0,"pitchDeg":-87.0,"rollDeg":0},"walls":[{"id":"backWall","z":580.0,"pitchDeg":0,"rollDeg":0},{"id":"rightWall","z":315.0,"pitchDeg":0,"rollDeg":-90.0},{"id":"leftWall","z":560.0,"pitchDeg":0,"rollDeg":55.0},{"id":"ceiling","z":1000.0,"pitchDeg":90.0,"rollDeg":0}]}'),kd=JSON.parse('{"camera":{"fov":45},"floor":{"z":205.0,"pitchDeg":-87.0,"rollDeg":0},"walls":[{"id":"backWall","z":570.0,"pitchDeg":0,"rollDeg":0},{"id":"rightWall","z":315.0,"pitchDeg":0,"rollDeg":-90.0},{"id":"leftWall","z":1000.0,"pitchDeg":0,"rollDeg":90.0},{"id":"ceiling","z":1000.0,"pitchDeg":90.0,"rollDeg":0}]}'),kf=JSON.parse('{"camera":{"fov":45},"floor":{"z":185.0,"pitchDeg":-90.0,"rollDeg":0},"walls":[{"id":"backWall","z":550.0,"pitchDeg":0,"rollDeg":0},{"id":"rightWall","z":220.0,"pitchDeg":0,"rollDeg":-90.0},{"id":"leftWall","z":218.0,"pitchDeg":0,"rollDeg":90.0},{"id":"ceiling","z":185.0,"pitchDeg":90.0,"rollDeg":0}]}'),kp=JSON.parse('{"camera":{"fov":45},"maskUrl":"https://vizbl-2.s3.us-west-1.amazonaws.com/public/room-example/room-example-4-mask.png","floor":{"z":76.41371488571167,"pitchDeg":-88.08860421180725,"rollDeg":-1.1962583474814892},"walls":[]}'),kh=JSON.parse('{"camera":{"fov":45},"maskUrl":"https://vizbl-2.s3.us-west-1.amazonaws.com/public/room-example/room-example-5-mask.png","floor":{"z":86.81210279464722,"pitchDeg":-84.67234969139099,"rollDeg":-4.7433755826205015e-2},"walls":[]}'),km=JSON.parse('{"camera":{"fov":45},"maskUrl":"https://vizbl-2.s3.us-west-1.amazonaws.com/public/room-example/room-example-6-mask.png","floor":{"z":124.4072675704956,"pitchDeg":-70.20531892776489,"rollDeg":-0.7209355384111404},"walls":[]}');let kg=0,kv=new F.Vector3(1,0,0),kb=new F.Vector3(0,1,0),kw=new F.Vector3(0,0,1);function ky(e,t,r,n){let i=kw.clone().applyAxisAngle(kv,F.MathUtils.degToRad(t)).applyAxisAngle(kb,F.MathUtils.degToRad(r)).applyQuaternion(n.quaternion).normalize(),a=new F.Quaternion().setFromUnitVectors(kw,i);return{position:n.position.clone().addScaledVector(i,-(e*kE)).toArray(),quaternion:a.toArray()}}function kx(e){return{camera:e.camera,maskUrl:e.maskUrl,surfaces:[{...e.floor,id:kz},...e.walls]}}let kC="https://vizbl-2.s3.us-west-1.amazonaws.com/public/room-example/",kA=`https://cdn.jsdelivr.net/npm/onnxruntime-web@${D.env.versions.common}/dist/`,kS,kk,kE=.01,kz="floor",kM=[{id:"room-example-1",name:"Living room",image:`${kC}room-example-1.jpg`,config:kx(kc)},{id:"room-example-2",name:"Bedroom",image:`${kC}room-example-2.jpg`,config:kx(kd)},{id:"room-example-3",name:"Kitchen",image:`${kC}room-example-3.jpg`,config:kx(kf)}],kT=[{id:"room-example-4",name:"Hallway",image:`${kC}room-example-4.png`,config:kx(kp)},{id:"room-example-5",name:"Dining room",image:`${kC}room-example-5.png`,config:kx(kh)},{id:"room-example-6",name:"Office",image:`${kC}room-example-6.png`,config:kx(km)}],kB=["RcSd3KphTyq_JQEjNCqKQA","gu0109ftQmS-UQkwcW010Q","nOfGLIZcRVeU93wOkHWSbg","ozzH5I2kQMW20ao-33C86A","DBA4wR-zT92vjtuOk9varg"],kP="97f6e38a-d092-41b4-ba62-1a870b54e964";function kR(){let{t:e}=oi();return(0,ep.useMemo)(()=>[{value:0,label:e("mattingOptions.none")},{value:.05,label:`5 ${e("units.cm")}`}],[e])}let k_=(0,ep.createContext)(null);function kI({children:e,resource:t,type:r,width:n,height:i,name:a}){let o=function(){let{t:e}=oi();return(0,ep.useMemo)(()=>[{value:.025,label:`2.5 ${e("units.cm")}`},{value:.05,label:`5 ${e("units.cm")}`}],[e])}(),s=kR(),l="carpet"===r?kT:kM,[u,c]=(0,ep.useState)(l),[d,f]=(0,ep.useState)(l[0].id),p=(0,ep.useMemo)(()=>u.find(e=>e.id===d)??u[0],[u,d]),[h,m]=(0,ep.useState)(null),[g,v]=(0,ep.useState)(null),[b,w]=(0,ep.useState)(o[0].value),[y,x]=(0,ep.useState)(s[0].value),[C,A]=(0,ep.useState)(0),[S,k]=(0,ep.useState)(0),[E,z]=(0,ep.useState)(!1),[M,T]=(0,ep.useState)(null),[B,P]=(0,ep.useState)(!0),[R,_]=(0,ep.useState)("carpet"===r),[I,O]=(0,ep.useState)(!1),[L,F]=(0,ep.useState)(!1),D=(0,ep.useRef)(null),N=(0,ep.useMemo)(()=>({resource:t,tinuuid:h,type:r,name:a,rooms:u,setRooms:c,room:p,setRoomId:f,material:g,setTinuuid:m,width:n,height:i,frameWidth:b,matting:y,angle:C,rotation:S,isDragging:E,containerRef:M,setMaterial:v,setFrameWidth:w,setMatting:x,setAngle:A,setRotation:k,setIsDragging:z,setContainerRef:T,resourceRef:D,isSceneLoading:B,setIsSceneLoading:P,isInferenceLoading:R,setIsInferenceLoading:_,isSceneResourceReady:I,setIsSceneResourceReady:O,isSceneRenderedReady:L,setIsSceneRenderedReady:F}),[t,h,r,a,u,p,g,n,i,b,y,C,S,M,E,D,B,R,I,L]);return(0,eg.jsx)(k_,{value:N,children:e})}function kO(){let e=(0,ep.use)(k_);if(!e)throw Error("useRoomViewer must be used within a RoomViewerProvider");return e}function kL({className:e,...t}){let{containerRef:r,material:n,setMaterial:i,setTinuuid:a}=kO(),{t:o}=oi(),s=function({queries:e,...t},r){let n=tL(void 0),i=ep.useContext(tD),a=ep.useContext(tN),o=ep.useMemo(()=>e.map(e=>{let t=n.defaultQueryOptions(e);return t._optimisticResults=i?"isRestoring":"optimistic",t}),[e,n,i]);o.forEach(e=>{tG(e),tj(e,a)}),tH(a);let[s]=ep.useState(()=>new tI(n,o,t)),[l,u,c]=s.getOptimisticResult(o,t.combine),d=!i&&!1!==t.subscribed;ep.useSyncExternalStore(ep.useCallback(e=>d?s.subscribe(e2.batchCalls(e)):e4,[s,d]),()=>s.getCurrentResult(),()=>s.getCurrentResult()),ep.useEffect(()=>{s.setQueries(o,t)},[o,t,s]);let f=l.some((e,t)=>t$(o[t],e))?l.flatMap((e,t)=>{let r=o[t];if(r){let t=new tM(n,r);if(t$(r,e))return tV(r,t,a);tq(e,i)&&tV(r,t,a)}return[]}):[];if(f.length>0)throw Promise.all(f);let p=l.find((e,t)=>{let r=o[t];return r&&tU({result:e,errorResetBoundary:a,throwOnError:r.throwOnError,query:n.getQueryCache().get(r.queryHash),suspense:r.suspense})});if(p?.error)throw p.error;return u(c())}({queries:kB.map(e=>({queryKey:((e={})=>[{url:"/obj/Fetch"},...e?[e]:[]])({tinuuid:e}),queryFn:()=>lC({tinuuid:e})}))});return(0,ep.useEffect)(()=>{let e=s[0]?.data,t=e?.materials?.[0],r=e?.tinuuid;null===n&&t&&r&&(i(t),a(r))},[n,s,i,a]),(0,eg.jsxs)(lz,{className:r7("w-fit",e),...t,children:[(0,eg.jsx)(lM,{className:"text-xs text-text-sub font-medium",children:o("material")}),(0,eg.jsxs)(c9,{value:n?.hid??void 0,onValueChange:e=>{let t=s.find(t=>t.data?.materials?.[0]?.hid===e)?.data;if(!t?.materials?.[0]||!t.tinuuid)return;let r=t.materials[0],n=t.tinuuid;i(r),a(n)},children:[(0,eg.jsx)(c8,{className:"w-[145px]",size:"md",children:(0,eg.jsxs)(c6,{placeholder:o("chooseMaterial"),children:[(0,eg.jsx)("div",{className:"size-5 rounded-full",style:{backgroundColor:`#${n?.miniature?.color?.hex}`}}),n?.miniature?.color?.name]})}),(0,eg.jsx)(c7,{portalContainer:r,children:s.map(e=>{let t=e.data;if(!t?.materials?.[0]||!t.tinuuid)return null;let r=t.materials[0];return(0,eg.jsxs)(de,{value:r.hid,children:[(0,eg.jsx)("div",{className:"size-5 rounded-full",style:{backgroundColor:`#${r?.miniature?.color?.hex}`}}),r.miniature?.color?.name]},`${t.tinuuid}-${r.hid}`)})})]})]})}function kF({className:e,children:t,...r}){let{className:n,onReachEnd:i,...a}=r.swiperOptions??{},{t:o}=oi(),[s,l]=(0,ep.useState)(null),[u,c]=(0,ep.useState)(!0),[d,f]=(0,ep.useState)(!1),[p,h]=(0,ep.useState)(!1),m=(0,ep.useCallback)(e=>{c(e.isBeginning),f(e.isEnd),h(e.isLocked)},[]),g=(0,ep.useCallback)(e=>{l(e),m(e)},[m]),v=(0,ep.useCallback)(e=>{f(!0),i?.(e)},[i]);return(0,eg.jsxs)("div",{className:r7("relative w-full overflow-hidden",e),children:[(0,eg.jsx)(fD,{className:r7("w-full py-5",n),slidesPerView:"auto",slidesPerGroup:2,onSwiper:g,onReachBeginning:()=>c(!0),onReachEnd:v,onFromEdge:m,onLock:()=>h(!0),onUnlock:()=>h(!1),onResize:m,slidesOffsetBefore:24,slidesOffsetAfter:24,spaceBetween:12,...a,children:t}),(0,eg.jsxs)(nn,{className:r7("absolute top-1/2 left-8 -translate-y-1/2 z-1",{hidden:u||p}),variant:"contrast",size:"icon",onClick:()=>s?.slidePrev(),children:[(0,eg.jsx)(ao,{}),(0,eg.jsx)("span",{className:"sr-only",children:o("previousSlide")})]}),(0,eg.jsxs)(nn,{className:r7("absolute top-1/2 right-8 -translate-y-1/2 z-1",{hidden:d||p}),variant:"contrast",size:"icon",onClick:()=>s?.slideNext(),children:[(0,eg.jsx)(as,{}),(0,eg.jsx)("span",{className:"sr-only",children:o("nextSlide")})]})]})}function kD(e){return e.hid??e.uuid??""}function kN({className:e,...t}){let{material:r,resource:n,setMaterial:i,setTinuuid:a}=kO(),o=r?kD(r):"",{data:s,isFetchingNextPage:l,fetchNextPage:u,hasNextPage:c}=tX({queryKey:["room-viewer","carpet-materials",kP],queryFn:({pageParam:e})=>lA({page:e,owners:[kP]}),initialPageParam:1,getNextPageParam:(e,t,r)=>{if(e.objs?.length)return r+1},getPreviousPageParam:(e,t,r)=>{if(!(r<=1))return r-1}},tW,void 0),d=(0,ep.useMemo)(()=>s?.pages.flatMap(e=>e.objs??[])??[],[s]),f=d.find(e=>e.materials?.some(e=>e.native?.glbUrl===n));(0,ep.useEffect)(()=>{if(null!==r)return;let e=f?.materials?.find(e=>e.native?.glbUrl===n);if(f&&e&&f.tinuuid){i(e),a(f.tinuuid);return}let t=d[0];!n&&t?.materials?.[0]&&t.tinuuid&&(i(t.materials[0]),a(t.tinuuid))},[f,r,d,n,i,a]);let p=(0,ep.useCallback)(()=>{c&&!l&&u()},[u,c,l]);return(0,eg.jsx)("div",{className:r7(e),...t,children:(0,eg.jsx)(dq,{value:o||void 0,onValueChange:e=>{let t=d.find(t=>t.materials?.some(t=>kD(t)===e)),r=t?.materials?.find(t=>kD(t)===e);t&&r&&t.tinuuid&&(i(r),a(t.tinuuid))},children:(0,eg.jsx)(kF,{swiperOptions:{onReachEnd:p},children:d.flatMap(e=>e.materials?.map(t=>{let r=kD(t);return e.tinuuid?(0,eg.jsx)(fN,{className:r7("w-25! transition-transform duration-200",r!==o&&"hover:scale-110"),children:(0,eg.jsxs)(lM,{htmlFor:`material-${r}`,className:"size-full flex flex-col gap-1 has-data-[state=checked]:bg-transparent",children:[(0,eg.jsxs)("div",{className:"size-full relative h-19 rounded-[0.75rem] overflow-hidden",children:[(0,eg.jsx)("img",{src:t.previews?.[0]?.subRes?.small??t.previews?.[0]?.url,alt:t.name??"",className:"size-full object-cover"}),(0,eg.jsx)(dV,{value:r,id:`material-${r}`,variant:"check",className:r7("absolute top-1.75 right-1.75",{"sr-only":r!==o})})]}),(0,eg.jsx)("span",{className:r7("block w-full text-xs text-left text-text-light truncate",{"text-text-dark":r===o}),children:t.name})]})},`${e.tinuuid}-${r}`):null})??[])})})})}function kj({className:e,...t}){let{matting:r,setMatting:n}=kO(),{t:i}=oi(),a=kR();return(0,eg.jsxs)(lz,{className:r7("w-fit",e),...t,children:[(0,eg.jsx)(lM,{className:"text-xs text-text-sub font-medium",children:i("matting")}),(0,eg.jsx)(ps,{value:r.toString(),onValueChange:e=>n(Number(e)),children:(0,eg.jsx)(pu,{children:a.map(e=>(0,eg.jsx)(pc,{value:e.value.toString(),children:e.label},e.value))})})]})}function kH({className:e,...t}){let{t:r}=oi(),{rooms:n,room:i,setRoomId:a,setRooms:o,type:s}=kO(),l=(0,ep.useId)(),u=(0,ep.useCallback)(e=>{let t=e.target.files?.[0];if(e.target.value="",!t)return;let r=URL.createObjectURL(t),n={id:(kg+=1,`room-custom-${kg}`),name:t.name,image:r,config:{camera:{fov:45},surfaces:[{id:kz,z:0,pitchDeg:-90,rollDeg:0}]}};o(e=>[n,...e]),a(n.id)},[a,o]);return(0,eg.jsx)("div",{className:r7(e),...t,children:(0,eg.jsx)(dq,{value:i.id,onValueChange:a,children:(0,eg.jsxs)(kF,{children:["carpet"===s&&(0,eg.jsx)(fN,{className:"w-25! h-auto",children:(0,eg.jsxs)(lM,{htmlFor:l,className:r7("flex size-full cursor-pointer items-center justify-center rounded-[0.75rem] border border-dashed border-muted-foreground/40 bg-transparent px-2 text-center text-xs leading-tight text-muted-foreground transition-colors hover:border-foreground/40 hover:text-foreground"),children:[r("uploadOwnPhoto"),(0,eg.jsx)("input",{id:l,type:"file",accept:"image/*",className:"sr-only",onChange:u})]})}),n.map(e=>(0,eg.jsx)(fN,{className:r7("w-25! transition-transform duration-200",e.id!==i.id&&"hover:scale-110"),children:(0,eg.jsxs)(lM,{htmlFor:`room-${e.id}`,className:"size-full flex flex-col gap-1 has-data-[state=checked]:bg-transparent",children:[(0,eg.jsxs)("div",{className:"size-full relative h-19 rounded-[0.75rem] overflow-hidden",children:[(0,eg.jsx)("img",{src:e.image,alt:e.name,className:"size-full object-cover"}),(0,eg.jsx)(dV,{value:e.id,id:`room-${e.id}`,variant:"check",className:r7("absolute top-1.75 right-1.75",{"sr-only":e.id!==i.id})})]}),(0,eg.jsx)("span",{className:r7("block w-full text-xs text-left text-text-light truncate",{"text-text-dark":e.id===i.id}),children:e.name})]})},e.id))]})})})}function kU({className:e,...t}){let{type:r}=kO();return(0,eg.jsxs)("div",{className:r7("flex items-end pl-0 overflow-hidden",e),...t,children:[(0,eg.jsx)(kH,{className:r7("shrink-0",{"min-w-120.5":"carpet"===r,grow:"poster"===r})}),"poster"===r&&(0,eg.jsxs)("div",{className:"hidden gap-5 pr-6 pb-5 md:flex",children:[(0,eg.jsx)(kL,{}),(0,eg.jsx)(kj,{})]}),"carpet"===r&&(0,eg.jsxs)(eg.Fragment,{children:[(0,eg.jsx)(om,{orientation:"vertical"}),(0,eg.jsx)(kN,{})]})]})}function kG({className:e,...t}){let{t:r}=oi();return(0,eg.jsxs)("div",{className:r7("group inline-flex gap-2 text-sm text-muted-foreground","hover:text-text-dark","transition-colors duration-200 ease-in-out",e),...t,children:[(0,eg.jsx)("div",{className:"size-5 flex items-center justify-center rounded-full bg-icons-light group-hover:bg-icons-red transition-colors duration-200 ease-in-out",children:(0,eg.jsx)(oc,{className:"size-4.25 text-icons-white"})}),r("poweredBy")]})}function kq({className:e,...t}){let{name:r}=kO();return(0,eg.jsxs)("div",{className:r7("h-16 grid gap-5 items-center px-6 sm:grid-cols-3",e),...t,children:[(0,eg.jsx)("div",{className:"truncate",children:r}),(0,eg.jsx)("div",{className:"hidden justify-center sm:flex",children:(0,eg.jsx)(kG,{})}),(0,eg.jsx)("div",{className:"hidden sm:block"})]})}let k$="iOS"===new yE().getOS().name;function kV({className:e,...t}){let{resource:r,tinuuid:n,type:i,width:a,height:o,containerRef:s,resourceRef:l}=kO(),{t:u}=oi(),[c,d]=(0,ep.useState)(""),[f,p]=(0,ep.useState)(""),[h,m]=(0,ep.useState)(!1),[g,v]=(0,ep.useState)(!1),b=(0,ep.useRef)(null),w=(0,ep.useMemo)(()=>{if("carpet"===i&&n){let e=new URL(kS);return e.searchParams.set("tinuuid",n),e.searchParams.set("appview","true"),e.toString()}let e=new URL("https://viewer.vizbl.com/poster/app/index.html");return e.searchParams.set("texture",r),e.searchParams.set("texture_width",(100*a).toString()),e.searchParams.set("texture_height",(100*o).toString()),decodeURIComponent(e.toString())},[r,n,i,a,o]),y=(0,ep.useMemo)(()=>{if(!n)return null;let e=new URL("https://appclip.apple.com/id");return e.searchParams.set("p",kk),e.searchParams.set("tinuuid",n),e.toString()},[n]),x=async()=>{if("carpet"===i)return n?k$&&y?void window.location.assign(y):void m(!0):void 0;let e=b.current,t=l.current;if(e&&t)if(e.canActivateAR)try{v(!0);let e=t.clone(!0);if(e.position.set(0,0,0),k$){let t=new bM,r=await t.parseAsync(e),n=new File([r],"scene.usdz",{type:"model/vnd.usdz+zip"});d(URL.createObjectURL(n))}else{let t=new bD,r=await t.parseAsync(e,{binary:!0}),n=new File([r],"scene.glb",{type:"model/gltf-binary"});p(URL.createObjectURL(n))}}finally{v(!1)}else m(!0)};return((0,ep.useEffect)(()=>((""!==c||""!==f)&&b.current?.activateAR(),()=>{""!==c&&URL.revokeObjectURL(c),""!==f&&URL.revokeObjectURL(f)}),[c,f]),"carpet"!==i||n)?(0,eg.jsxs)("div",{className:r7(e),...t,children:[(0,eg.jsx)(nn,{variant:"contrast",disabled:g,onClick:x,children:u("ar.viewInPlace")}),(0,eg.jsx)(i9,{open:h,onOpenChange:m,children:(0,eg.jsxs)(ae,{className:"gap-6 sm:max-w-120",showCloseButton:!1,portalContainer:s,children:[(0,eg.jsx)("div",{className:"flex items-center justify-center p-10 bg-constant-white rounded-2xl",children:(0,eg.jsx)(vG,{className:"size-48",robustness:"H",data:w})}),(0,eg.jsx)("p",{className:"text-lg text-center text-text-sub font-medium",children:u("ar.scanQrCode")}),(0,eg.jsx)(i8,{asChild:!0,children:(0,eg.jsx)(nn,{variant:"contrast",size:"lg",children:u("close")})})]})}),(0,eg.jsx)("model-viewer",{ref:b,className:"fixed w-px h-px opacity-0 pointer-events-none",src:f,iosSrc:c,reveal:"manual",ar:!0,cameraControls:!0,arPlacement:"wall",arModes:"webxr",arScale:"fixed",shadowIntensity:1,interactionPromptThreshold:100})]}):null}async function kK(e,t){return new Promise((r,n)=>{e.toBlob(e=>{e?r(e):n(Error(t))},"image/png")})}function kJ({ref:e}){let{camera:t,gl:r,invalidate:n,scene:i}=x6();return(0,ep.useImperativeHandle)(e,()=>({capture:async()=>(n(),await new Promise(e=>requestAnimationFrame(()=>e())),r.render(i,t),kK(r.domElement,"Failed to create scene share image"))}),[t,r,n,i]),null}function kQ(e){return 2===e||3===e}function kW(e,t,r){let n=ky(e.z,e.pitchDeg,e.rollDeg,r),i=function(e){let t=0,r=0,n=0;for(let i=0;i<e.height;i++)for(let a=0;a<e.width;a++)kQ(e.classes[i*e.width+a])&&(t+=a+.5,r+=i+.5,n+=1);return 0===n?null:{x:t/n,y:r/n}}(t);if(!i)return null;let a=new F.Quaternion(...n.quaternion),o=new F.Vector3(0,0,1).applyQuaternion(a).normalize(),s=new F.Vector3(...n.position),l=i.x/t.width*2-1,u=1-i.y/t.height*2,c=new F.Raycaster;c.setFromCamera(new F.Vector2(l,u),r);let d=new F.Plane().setFromNormalAndCoplanarPoint(o,s),f=c.ray.intersectPlane(d,new F.Vector3);return f?(f.addScaledVector(o,.05),{position:f.toArray(),quaternion:n.quaternion}):null}function kX(e){return new Promise((t,r)=>{let n=new Image;n.crossOrigin="anonymous",n.onload=()=>t(n),n.onerror=()=>r(Error(`Failed to load image from ${e}`)),n.src=e})}function kY(e,t,r){let n=document.createElement("canvas");n.width=t,n.height=r;let i=n.getContext("2d");if(!i)throw Error("Failed to get 2D context for segmentation mask.");let a=i.createImageData(t,r),o=t*r;for(let t=0;t<o;t++){let r=kQ(e[t]);a.data[4*t]=255,a.data[4*t+1]=255,a.data[4*t+2]=255,a.data[4*t+3]=255*!!r}return i.putImageData(a,0,0),n}async function kZ(e){let t=await kX(e),r=document.createElement("canvas");r.width=t.naturalWidth||t.width,r.height=t.naturalHeight||t.height;let n=r.getContext("2d");if(!n)throw Error("Failed to get 2D context for segmentation mask.");n.drawImage(t,0,0);let{width:i,height:a}=r,o=n.getImageData(0,0,i,a),s=new Uint8Array(i*a);for(let e=0;e<s.length;e++){let t=o.data[4*e+3];s[e]=2*(t>127)}return{segmentationClasses:{classes:s,width:i,height:a}}}async function k0(e){let t=kY(e.classes,e.width,e.height),r=await kK(t,"Failed to serialize segmentation mask PNG.");return URL.createObjectURL(r)}D.env.wasm.wasmPaths=kA,D.env.wasm.proxy=!0;async function k1(e){let[t,r]=await Promise.all([D.InferenceSession.create("https://vizbl-2.s3.us-west-1.amazonaws.com/public/mod/model_infer.onnx",{executionProviders:["wasm"]}),kX(e)]),n=t.inputNames[0];if(!n)throw Error("ONNX model input tensor is missing.");let i=function(e,t){let r=document.createElement("canvas");r.width=512,r.height=512;let n=r.getContext("2d");if(!n)throw Error("Failed to get 2D context for ONNX input.");n.drawImage(e,0,0,512,512);let i=n.getImageData(0,0,512,512),a=new Uint8Array(786432);for(let e=0,t=0;e<1048576;e+=4,t+=3)a[t]=i.data[e],a[t+1]=i.data[e+1],a[t+2]=i.data[e+2];return new t.Tensor("uint8",a,[1,512,512,3])}(r,D),a=await t.run({[n]:i}),{zOutput:o,rollOutput:s,pitchOutput:l,segmentationOutput:u}=function(e,t){if(e.outputNames.length<4)throw Error(`Invalid ONNX output count: ${e.outputNames.length}`);let[r,n,i,a]=e.outputNames,o=t[r],s=t[n],l=t[i],u=t[a];if(!o||!s||!l||!u)throw Error("ONNX output tensor mapping failed.");return{zOutput:o,rollOutput:s,pitchOutput:l,segmentationOutput:u}}(t,a),c=400*Number(o.data[0]??0),d=45*Number(s.data[0]??0),f=90*Number(l.data[0]??0);return{decodedSegmentation:function(e){let t=function(e){let t=e.dims.map(Number);if(4!==t.length)throw Error(`Unsupported segmentation output shape: [${t.join(", ")}]`);let[,r,n,i]=t;if(r<=0||n<=0||i<=0)throw Error(`Invalid segmentation output shape: [${t.join(", ")}]`);if(4!==i)throw Error(`Unsupported segmentation channels: ${i}. Expected 4.`);return{width:n,height:r}}(e),r=e.data,n=t.width*t.height,i=new Uint8Array(n);for(let e=0,t=0;e<n;e++,t+=4){let n=0,a=Number(r[t]??0);for(let e=1;e<4;e++){let i=Number(r[t+e]??0);i>a&&(a=i,n=e)}i[e]=n}return{classes:i,width:t.width,height:t.height}}(u),floor:{z:c,pitchDeg:-f,rollDeg:d}}}function k2(e){let t=e.getContext("2d");if(!t)throw Error("Failed to get 2D context for carpet lighting map.");return t}function k3(e,t){let r=document.createElement("canvas");return r.width=e,r.height=t,r}function k5(e,t){let r=k3(e,t),n=k2(r),i=n.createImageData(e,t);for(let r=0;r<e*t;r++){let e=4*r;i.data[e]=128,i.data[e+1]=128,i.data[e+2]=128,i.data[e+3]=255}return n.putImageData(i,0,0),r}function k4(e){let t=new Uint8ClampedArray(e.width*e.height);for(let r=0;r<t.length;r++){let n=4*r,i=e.data[n],a=e.data[n+1],o=e.data[n+2];t[r]=Math.round(.299*i+.587*a+.114*o)}return t}function k9(e,t,r,n,i){let a=function(e,t,r){let n=k3(t,r),i=k2(n),a=i.createImageData(t,r);for(let n=0;n<t*r;n++){let t=Math.max(0,Math.min(255,Math.round(Number(e[n]??0)))),r=4*n;a.data[r]=t,a.data[r+1]=t,a.data[r+2]=t,a.data[r+3]=255}return i.putImageData(a,0,0),n}(e,t,r),o=k2(k3(n,i));return o.imageSmoothingEnabled=!0,o.drawImage(a,0,0,n,i),k4(o.getImageData(0,0,n,i))}function k6(e,t){let r=new Float32Array(e.length);for(let n=0;n<e.length;n++)r[n]=Number(e[n]??0)*(Number(t[n]??0)/255);return r}function k8(e,t){let r=new Uint8ClampedArray(e.length);for(let n=0;n<e.length;n++){let i=Number(t[n]??0)/255;if(i<=1e-4){r[n]=0;continue}let a=Number(e[n]??0)/i;r[n]=Math.max(0,Math.min(255,Math.round(a)))}return r}function k7(e){return 2===e||3===e}async function Ee(e,t,r={}){let{width:n,height:i,classes:a}=t;if(n<=0||i<=0||0===a.length)return k5(n,i);let o=await kX(e),s=k2(k3(n,i));s.drawImage(o,0,0,n,i);let l=k4(s.getImageData(0,0,n,i)),u=function(e){let t=new Uint8ClampedArray(e.length);for(let r=0;r<e.length;r++)t[r]=255*!!k7(e[r]);return t}(a),c=Math.max(1,Math.round(r.scaleDiv??8)),d=Math.max(1,Math.round(r.filterDiameter??4)),f=r.sigmaColor??70,p=r.sigmaSpace??70,h=Math.max(1,Math.round(n/c)),m=Math.max(1,Math.round(i/c)),g=k9(k6(l,u),n,i,h,m),v=k9(u,n,i,h,m),b=k9(k6(function(e,t,r,n,i,a,o){let s=new Uint8ClampedArray(e.length),l=Math.max(1,Math.floor(n/2)),u=Math.max(1,i),c=Math.max(1,a),d=2*u*u,f=2*c*c,p=new Float32Array((2*l+1)*(2*l+1)),h=0;for(let e=-l;e<=l;e++)for(let t=-l;t<=l;t++){let r=t*t+e*e;p[h]=Math.exp(-r/f),h+=1}for(let n=0;n<r;n++)for(let i=0;i<t;i++){let a=n*t+i;if(Number(o?.[a]??255)/255<=1e-4){s[a]=0;continue}let u=e[a],c=0,f=0,h=0;for(let a=-l;a<=l;a++){let s=Math.max(0,Math.min(r-1,n+a));for(let r=-l;r<=l;r++){let n=Math.max(0,Math.min(t-1,i+r)),a=s*t+n,l=Number(o?.[a]??255)/255;if(l<=1e-4){h+=1;continue}let m=e[a],g=m-u,v=Math.exp(-(g*g)/d),b=p[h]*v*l;c+=b,f+=m*b,h+=1}}s[a]=c>0?Math.round(f/c):u}return s}(k8(g,v),h,m,d,f,p,v),v),h,m,n,i),w=k8(b,k9(v,h,m,n,i)),y=0,x=0;for(let e=0;e<a.length;e++)k7(a[e])&&(x+=w[e],y+=1);if(0===y)return k5(n,i);let C=x/y,A=0;for(let e=0;e<a.length;e++){if(!k7(a[e]))continue;let t=Math.abs(w[e]-C);t>A&&(A=t)}if(A<=0)return k5(n,i);let S=k3(n,i),k=k2(S),E=k.createImageData(n,i);for(let e=0;e<a.length;e++){let t=4*e,r=128;k7(a[e])&&(r=Math.max(0,Math.min(255,Math.round(255*(.5+(w[e]-C)/A*.4))))),E.data[t]=r,E.data[t+1]=r,E.data[t+2]=r,E.data[t+3]=255}return k.putImageData(E,0,0),S}let Et=Math.PI/2,Er="uRoomMask",En="uRoomLightingMap",Ei="uRoomLightingStrength",Ea="uRoomMaskResolution",Eo="uRoomMaskTextureSize";function Es(e,t=F.LinearFilter,r=F.LinearFilter){let n=new F.CanvasTexture(e);return n.needsUpdate=!0,n.minFilter=t,n.magFilter=r,n.generateMipmaps=!1,n}async function El(e,t,r,n){"function"==typeof e.compileAsync?await e.compileAsync(t,r,n):e.compile(t,r,n)}function Eu({resource:e,position:t,quaternion:r,maskCanvas:n,lightingCanvas:i}){let{resourceRef:a,rotation:o,setIsDragging:s,setIsSceneResourceReady:l,setIsSceneRenderedReady:u}=kO(),{gl:c,size:d,camera:f,scene:p,invalidate:h}=x6(),m=CU(e),g=(0,ep.useRef)(null),v=(0,ep.useRef)(null),b=(0,ep.useRef)(null),w=(0,ep.useRef)(null),y=(0,ep.useRef)(!1);null===g.current&&(g.current=new F.Vector2(1,1)),null===b.current&&(b.current=Es(n,F.NearestFilter,F.NearestFilter)),null===v.current&&(v.current=new F.Vector2(1,1)),null===w.current&&(w.current=Es(i));let x=g.current,C=v.current,A=b.current,S=w.current,k=(0,ep.useMemo)(()=>m.scene.clone(!0),[m]),E=(0,ep.useMemo)(()=>F.MathUtils.degToRad(o),[o]),{materials:z,meshes:M}=(0,ep.useMemo)(()=>{let e,t;return e=new Set,t=[],k.traverse(r=>{if(!r.isMesh||(t.push(r),!r.material))return;if(Array.isArray(r.material)){let t=r.material.map(t=>{let r=t.clone();return e.add(r),r});r.material=t;return}let n=r.material.clone();e.add(n),r.material=n}),{materials:Array.from(e),meshes:t}},[k]),T=(0,ep.useCallback)(()=>{s(!0)},[s]),B=(0,ep.useCallback)(()=>{s(!1)},[s]);return(0,ep.useLayoutEffect)(()=>{let e=[],t=()=>{e.forEach(e=>e()),e.length=0};return y.current=!1,M.forEach(r=>{let n=r.onAfterRender,i=(...e)=>{n?.(...e),y.current||(y.current=!0,t(),u(!0),h())};r.onAfterRender=i,e.push(()=>{r.onAfterRender===i&&(r.onAfterRender=n)})}),()=>{t()}},[h,M,u]),(0,ep.useEffect)(()=>()=>{z.forEach(e=>e.dispose())},[z]),(0,ep.useLayoutEffect)(()=>{A.image=n,A.needsUpdate=!0,C.set(Math.max(1,n.width),Math.max(1,n.height))},[n,A,C]),(0,ep.useLayoutEffect)(()=>{S.image=i,S.needsUpdate=!0},[i,S]),(0,ep.useLayoutEffect)(()=>{c.getDrawingBufferSize(x),x.set(Math.max(1,x.x),Math.max(1,x.y))},[c,x,d.width,d.height]),(0,ep.useLayoutEffect)(()=>{let e=z.map(e=>{let t,r,n;return t=e.onBeforeCompile,r=e.customProgramCacheKey.bind(e),n=e.transparent,e.onBeforeCompile=(r,n)=>{t?.call(e,r,n),r.uniforms[Er]={value:A},r.uniforms[En]={value:S},r.uniforms[Ei]={value:.13},r.uniforms[Ea]={value:x},r.uniforms[Eo]={value:C},r.fragmentShader=r.fragmentShader.replace("#include <common>",`
146
+ `;class SM extends F.ShaderMaterial{_maxDisplayBoost;_hdrCapacityMin;_hdrCapacityMax;constructor({gamma:e,offsetHdr:t,offsetSdr:r,gainMapMin:n,gainMapMax:i,maxDisplayBoost:a,hdrCapacityMin:o,hdrCapacityMax:s,sdr:l,gainMap:u}){super({name:"GainMapDecoderMaterial",vertexShader:SE,fragmentShader:Sz,uniforms:{sdr:{value:l},gainMap:{value:u},gamma:{value:new F.Vector3(1/e[0],1/e[1],1/e[2])},offsetHdr:{value:new F.Vector3().fromArray(t)},offsetSdr:{value:new F.Vector3().fromArray(r)},gainMapMin:{value:new F.Vector3().fromArray(n)},gainMapMax:{value:new F.Vector3().fromArray(i)},weightFactor:{value:(Math.log2(a)-o)/(s-o)}},blending:F.NoBlending,depthTest:!1,depthWrite:!1}),this._maxDisplayBoost=a,this._hdrCapacityMin=o,this._hdrCapacityMax=s,this.needsUpdate=!0,this.uniformsNeedUpdate=!0}get sdr(){return this.uniforms.sdr.value}set sdr(e){this.uniforms.sdr.value=e}get gainMap(){return this.uniforms.gainMap.value}set gainMap(e){this.uniforms.gainMap.value=e}get offsetHdr(){return this.uniforms.offsetHdr.value.toArray()}set offsetHdr(e){this.uniforms.offsetHdr.value.fromArray(e)}get offsetSdr(){return this.uniforms.offsetSdr.value.toArray()}set offsetSdr(e){this.uniforms.offsetSdr.value.fromArray(e)}get gainMapMin(){return this.uniforms.gainMapMin.value.toArray()}set gainMapMin(e){this.uniforms.gainMapMin.value.fromArray(e)}get gainMapMax(){return this.uniforms.gainMapMax.value.toArray()}set gainMapMax(e){this.uniforms.gainMapMax.value.fromArray(e)}get gamma(){let e=this.uniforms.gamma.value;return[1/e.x,1/e.y,1/e.z]}set gamma(e){let t=this.uniforms.gamma.value;t.x=1/e[0],t.y=1/e[1],t.z=1/e[2]}get hdrCapacityMin(){return this._hdrCapacityMin}set hdrCapacityMin(e){this._hdrCapacityMin=e,this.calculateWeight()}get hdrCapacityMax(){return this._hdrCapacityMax}set hdrCapacityMax(e){this._hdrCapacityMax=e,this.calculateWeight()}get maxDisplayBoost(){return this._maxDisplayBoost}set maxDisplayBoost(e){this._maxDisplayBoost=Math.max(1,Math.min(65504,e)),this.calculateWeight()}calculateWeight(){let e=(Math.log2(this._maxDisplayBoost)-this._hdrCapacityMin)/(this._hdrCapacityMax-this._hdrCapacityMin);this.uniforms.weightFactor.value=Math.max(0,Math.min(1,e))}}en={renderer:F.WebGLRenderer,createMaterial:e=>new SM(e),createQuadRenderer:e=>new Sb(e)},e=>{let{sdr:t,gainMap:r,renderer:n}=e;t.colorSpace!==F.SRGBColorSpace&&(console.warn("SDR Colorspace needs to be *SRGBColorSpace*, setting it automatically"),t.colorSpace=F.SRGBColorSpace),t.needsUpdate=!0,r.colorSpace!==F.LinearSRGBColorSpace&&(console.warn("Gainmap Colorspace needs to be *LinearSRGBColorSpace*, setting it automatically"),r.colorSpace=F.LinearSRGBColorSpace),r.needsUpdate=!0;let i=en.createMaterial({...e,sdr:t,gainMap:r});return en.createQuadRenderer({width:t.image.width,height:t.image.height,type:F.HalfFloatType,colorSpace:F.LinearSRGBColorSpace,material:i,renderer:n,renderTargetOptions:e.renderTargetOptions})};class ST extends Sk{constructor(e,t){super({renderer:e,createMaterial:e=>new SM(e),createQuadRenderer:e=>new Sb(e)},t)}async render(e,t,r,n){let{sdrImage:i,gainMapImage:a,needsFlip:o}=await this.processImages(r,n,"flipY"),{gainMap:s,sdr:l}=this.createTextures(i,a,o);this.updateQuadRenderer(e,i,s,l,t),e.render()}}class SB extends ST{load([e,t,r],n,i,a){let o,s,l,u=this.prepareQuadRenderer(),c=async()=>{if(o&&s&&l){try{await this.render(u,l,o,s)}catch(n){this.manager.itemError(e),this.manager.itemError(t),this.manager.itemError(r),"function"==typeof a&&a(n),u.disposeOnDemandRenderer();return}"function"==typeof n&&n(u),this.manager.itemEnd(e),this.manager.itemEnd(t),this.manager.itemEnd(r),u.disposeOnDemandRenderer()}},d=!0,f=0,p=0,h=!0,m=0,g=0,v=!0,b=0,w=0,y=()=>{"function"==typeof i&&i(new ProgressEvent("progress",{lengthComputable:d&&h&&v,loaded:p+g+w,total:f+m+b}))};this.manager.itemStart(e),this.manager.itemStart(t),this.manager.itemStart(r);let x=new F.FileLoader(this._internalLoadingManager);x.setResponseType("arraybuffer"),x.setRequestHeader(this.requestHeader),x.setPath(this.path),x.setWithCredentials(this.withCredentials),x.load(e,async e=>{if("string"==typeof e)throw Error("Invalid sdr buffer");o=e,await c()},e=>{d=e.lengthComputable,p=e.loaded,f=e.total,y()},t=>{this.manager.itemError(e),"function"==typeof a&&a(t)});let C=new F.FileLoader(this._internalLoadingManager);C.setResponseType("arraybuffer"),C.setRequestHeader(this.requestHeader),C.setPath(this.path),C.setWithCredentials(this.withCredentials),C.load(t,async e=>{if("string"==typeof e)throw Error("Invalid gainmap buffer");s=e,await c()},e=>{h=e.lengthComputable,g=e.loaded,m=e.total,y()},e=>{this.manager.itemError(t),"function"==typeof a&&a(e)});let A=new F.FileLoader(this._internalLoadingManager);return A.setRequestHeader(this.requestHeader),A.setPath(this.path),A.setWithCredentials(this.withCredentials),A.load(r,async e=>{if("string"!=typeof e)throw Error("Invalid metadata string");l=JSON.parse(e),await c()},e=>{v=e.lengthComputable,w=e.loaded,b=e.total,y()},e=>{this.manager.itemError(r),"function"==typeof a&&a(e)}),u}}class SP extends ST{load(e,t,r,n){let i=this.prepareQuadRenderer(),a=new F.FileLoader(this._internalLoadingManager);return a.setResponseType("arraybuffer"),a.setRequestHeader(this.requestHeader),a.setPath(this.path),a.setWithCredentials(this.withCredentials),this.manager.itemStart(e),a.load(e,async r=>{let a,o,s;if("string"==typeof r)throw Error("Invalid buffer, received [string], was expecting [ArrayBuffer]");let l=new Uint8Array(r);try{let e=await SA(l);a=e.sdr,o=e.gainMap,s=e.metadata}catch(t){if(t instanceof Sy||t instanceof Sw)console.warn(`Failure to reconstruct an HDR image from ${e}: Gain map metadata not found in the file, HDRJPGLoader will render the SDR jpeg`),s={gainMapMin:[0,0,0],gainMapMax:[1,1,1],gamma:[1,1,1],hdrCapacityMin:0,hdrCapacityMax:1,offsetHdr:[0,0,0],offsetSdr:[0,0,0]},a=l;else throw t}try{await this.render(i,s,a.buffer,o?.buffer)}catch(t){this.manager.itemError(e),"function"==typeof n&&n(t),i.disposeOnDemandRenderer();return}"function"==typeof t&&t(i),this.manager.itemEnd(e),i.disposeOnDemandRenderer()},r,t=>{this.manager.itemError(e),"function"==typeof n&&n(t)}),i}}let SR={apartment:"lebombo_1k.hdr",city:"potsdamer_platz_1k.hdr",dawn:"kiara_1_dawn_1k.hdr",forest:"forest_slope_1k.hdr",lobby:"st_fagans_interior_1k.hdr",night:"dikhololo_night_1k.hdr",park:"rooitou_park_1k.hdr",studio:"studio_small_03_1k.hdr",sunset:"venice_sunset_1k.hdr",warehouse:"empty_warehouse_01_1k.hdr"},S_="https://raw.githack.com/pmndrs/drei-assets/456060a26bbeb8fdf79326f224b6d99b8bcce736/hdri/",SI=["/px.png","/nx.png","/py.png","/ny.png","/pz.png","/nz.png"];function SO({files:e=SI,path:t="",preset:r,colorSpace:n,extensions:i}={}){r&&(SD(r),e=SR[r],t=S_);let a=Array.isArray(e),{extension:o,isCubemap:s}=SN(e),l=Sj(o);if(!l)throw Error("useEnvironment: Unrecognized file extension: "+e);let u=x6(e=>e.gl);(0,ep.useLayoutEffect)(()=>{("webp"===o||"jpg"===o||"jpeg"===o)&&u.domElement.addEventListener("webglcontextlost",function(){Ce.clear(l,a?[e]:e)},{once:!0})},[e,u.domElement]);let c=Ce(l,a?[e]:e,e=>{("webp"===o||"jpg"===o||"jpeg"===o)&&e.setRenderer(u),null==e.setPath||e.setPath(t),i&&i(e)}),d=a?c[0]:c;if("jpg"===o||"jpeg"===o||"webp"===o){var f;d=null==(f=d.renderTarget)?void 0:f.texture}return d.mapping=s?F.CubeReflectionMapping:F.EquirectangularReflectionMapping,d.colorSpace=null!=n?n:s?"srgb":"srgb-linear",d}let SL={files:SI,path:"",preset:void 0,extensions:void 0};SO.preload=e=>{let t={...SL,...e},{files:r,path:n=""}=t,{preset:i,extensions:a}=t;i&&(SD(i),r=SR[i],n=S_);let{extension:o}=SN(r);if("webp"===o||"jpg"===o||"jpeg"===o)throw Error("useEnvironment: Preloading gainmaps is not supported");let s=Sj(o);if(!s)throw Error("useEnvironment: Unrecognized file extension: "+r);Ce.preload(s,Array.isArray(r)?[r]:r,e=>{null==e.setPath||e.setPath(n),a&&a(e)})};let SF={files:SI,preset:void 0};function SD(e){if(!(e in SR))throw Error("Preset must be one of: "+Object.keys(SR).join(", "))}function SN(e){var t;let r=Array.isArray(e)&&6===e.length,n=Array.isArray(e)&&3===e.length&&e.some(e=>e.endsWith("json")),i=Array.isArray(e)?e[0]:e;return{extension:r?"cube":n?"webp":i.startsWith("data:application/exr")?"exr":i.startsWith("data:application/hdr")?"hdr":i.startsWith("data:image/jpeg")?"jpg":null==(t=i.split(".").pop())||null==(t=t.split("?"))||null==(t=t.shift())?void 0:t.toLowerCase(),isCubemap:r,isGainmap:n}}function Sj(e){return"cube"===e?F.CubeTextureLoader:"hdr"===e?AQ:"exr"===e?Sg:"jpg"===e||"jpeg"===e?SP:"webp"===e?SB:null}function SH(e,t,r,n,i={}){var a,o,s,l,u;let c;i={backgroundBlurriness:0,backgroundIntensity:1,backgroundRotation:[0,0,0],environmentIntensity:1,environmentRotation:[0,0,0],...i};let d=(c=u=t||r).current&&c.current.isScene?u.current:u,f=d.background,p=d.environment,h={backgroundBlurriness:d.backgroundBlurriness,backgroundIntensity:d.backgroundIntensity,backgroundRotation:null!=(a=null==(o=d.backgroundRotation)||null==o.clone?void 0:o.clone())?a:[0,0,0],environmentIntensity:d.environmentIntensity,environmentRotation:null!=(s=null==(l=d.environmentRotation)||null==l.clone?void 0:l.clone())?s:[0,0,0]};return"only"!==e&&(d.environment=n),e&&(d.background=n),xY(d,i),()=>{"only"!==e&&(d.environment=p),e&&(d.background=f),xY(d,h)}}function SU({scene:e,background:t=!1,map:r,...n}){let i=x6(e=>e.scene);return ep.useLayoutEffect(()=>{if(r)return SH(t,e,i,r,n)}),null}function SG({background:e=!1,scene:t,blur:r,backgroundBlurriness:n,backgroundIntensity:i,backgroundRotation:a,environmentIntensity:o,environmentRotation:s,...l}){let u=SO(l),c=x6(e=>e.scene);return ep.useLayoutEffect(()=>SH(e,t,c,u,{backgroundBlurriness:null!=r?r:n,backgroundIntensity:i,backgroundRotation:a,environmentIntensity:o,environmentRotation:s})),ep.useEffect(()=>()=>{u.dispose()},[u]),null}function Sq({children:e,near:t=.1,far:r=1e3,resolution:n=256,frames:i=1,map:a,background:o=!1,blur:s,backgroundBlurriness:l,backgroundIntensity:u,backgroundRotation:c,environmentIntensity:d,environmentRotation:f,scene:p,files:h,path:m,preset:g,extensions:v}){var b;let w=x6(e=>e.gl),y=x6(e=>e.scene),x=ep.useRef(null),[C]=ep.useState(()=>new F.Scene),A=ep.useMemo(()=>{let e=new F.WebGLCubeRenderTarget(n);return e.texture.type=F.HalfFloatType,e},[n]);ep.useEffect(()=>()=>{A.dispose()},[A]),ep.useLayoutEffect(()=>{if(1===i){let e=w.autoClear;w.autoClear=!0,x.current.update(w,C),w.autoClear=e}return SH(o,p,y,A.texture,{backgroundBlurriness:null!=s?s:l,backgroundIntensity:u,backgroundRotation:c,environmentIntensity:d,environmentRotation:f})},[e,C,A.texture,p,y,o,i,w]);let S=1;return!function(e,t=0){let r=x9(),n=r.getState().internal.subscribe,i=xL(e);xO(()=>n(i,t,r),[t,n,r])}(()=>{if(i===1/0||S<i){let e=w.autoClear;w.autoClear=!0,x.current.update(w,C),w.autoClear=e,S++}}),ep.createElement(ep.Fragment,null,(b=ep.createElement(ep.Fragment,null,e,ep.createElement("cubeCamera",{ref:x,args:[t,r,A]}),h||g?ep.createElement(SG,{background:!0,files:h,preset:g,path:m,extensions:v}):a?ep.createElement(SU,{background:!0,map:a,extensions:v}):null),(0,eg.jsx)(Ck,{children:b,container:C,state:void 0})))}function S$(e){var t,r,n,i;let a=SO(e),o=e.map||a;ep.useMemo(()=>Cl({GroundProjectedEnvImpl:AJ}),[]),ep.useEffect(()=>()=>{a.dispose()},[a]);let s=ep.useMemo(()=>[o],[o]),l=null==(t=e.ground)?void 0:t.height,u=null==(r=e.ground)?void 0:r.radius,c=null!=(n=null==(i=e.ground)?void 0:i.scale)?n:1e3;return ep.createElement(ep.Fragment,null,ep.createElement(SU,yz({},e,{map:o})),ep.createElement("groundProjectedEnvImpl",{args:s,scale:c,height:l,radius:u}))}function SV(e){return e.ground?ep.createElement(S$,e):e.map?ep.createElement(SU,e):e.children?ep.createElement(Sq,e):ep.createElement(SG,e)}function SK(e,t){let r;return(...n)=>{window.clearTimeout(r),r=window.setTimeout(()=>e(...n),t)}}SO.clear=e=>{let t={...SF,...e},{files:r}=t,{preset:n}=t;n&&(SD(n),r=SR[n]);let{extension:i}=SN(r),a=Sj(i);if(!a)throw Error("useEnvironment: Unrecognized file extension: "+r);Ce.clear(a,Array.isArray(r)?[r]:r)};let SJ=["x","y","top","bottom","left","right","width","height"];function SQ({ref:e,children:t,fallback:r,resize:n,style:i,gl:a,events:o=CD,eventSource:s,eventPrefix:l,shadows:u,linear:c,flat:d,legacy:f,orthographic:p,frameloop:h,dpr:m,performance:g,raycaster:v,camera:b,scene:w,onPointerMissed:y,onCreated:x,...C}){let A,S,k;ep.useMemo(()=>Cl(F),[]);let E=(A=xB(),S=function(){let e=xB(),[t]=ep.useState(()=>new Map);t.clear();let r=e;for(;r;){let e=r.type;xR(e)&&e!==xM&&!t.has(e)&&t.set(e,ep.use(xz(e))),r=r.return}return t}(),k=ep.useMemo(()=>Array.from(S.keys()).reduce((e,t)=>r=>ep.createElement(e,null,ep.createElement(t.Provider,{...r,value:S.get(t)})),e=>ep.createElement(xT,{...e})),[S]),ep.useMemo(()=>({children:e})=>{let t=xE(A,!0,e=>e.type===ep.StrictMode)?ep.StrictMode:ep.Fragment;return(0,eg.jsx)(t,{children:(0,eg.jsx)(k,{children:e})})},[A,k])),[z,M]=function({debounce:e,scroll:t,polyfill:r,offsetSize:n}={debounce:0,scroll:!1,offsetSize:!1}){var i,a,o;let s=r||("undefined"==typeof window?class{}:window.ResizeObserver);if(!s)throw Error("This browser does not support ResizeObserver out of the box. See: https://github.com/react-spring/react-use-measure/#resize-observer-polyfills");let[l,u]=(0,ep.useState)({left:0,top:0,width:0,height:0,bottom:0,right:0,x:0,y:0}),c=(0,ep.useRef)({element:null,scrollContainers:null,resizeObserver:null,lastBounds:l,orientationHandler:null}),d=e?"number"==typeof e?e:e.scroll:null,f=e?"number"==typeof e?e:e.resize:null,p=(0,ep.useRef)(!1);(0,ep.useEffect)(()=>(p.current=!0,()=>void(p.current=!1)));let[h,m,g]=(0,ep.useMemo)(()=>{let e=()=>{let e,t;if(!c.current.element)return;let{left:r,top:i,width:a,height:o,bottom:s,right:l,x:d,y:f}=c.current.element.getBoundingClientRect(),h={left:r,top:i,width:a,height:o,bottom:s,right:l,x:d,y:f};c.current.element instanceof HTMLElement&&n&&(h.height=c.current.element.offsetHeight,h.width=c.current.element.offsetWidth),Object.freeze(h),p.current&&(e=c.current.lastBounds,t=h,!SJ.every(r=>e[r]===t[r]))&&u(c.current.lastBounds=h)};return[e,f?SK(e,f):e,d?SK(e,d):e]},[u,n,d,f]);function v(){c.current.scrollContainers&&(c.current.scrollContainers.forEach(e=>e.removeEventListener("scroll",g,!0)),c.current.scrollContainers=null),c.current.resizeObserver&&(c.current.resizeObserver.disconnect(),c.current.resizeObserver=null),c.current.orientationHandler&&("orientation"in screen&&"removeEventListener"in screen.orientation?screen.orientation.removeEventListener("change",c.current.orientationHandler):"onorientationchange"in window&&window.removeEventListener("orientationchange",c.current.orientationHandler))}function b(){c.current.element&&(c.current.resizeObserver=new s(g),c.current.resizeObserver.observe(c.current.element),t&&c.current.scrollContainers&&c.current.scrollContainers.forEach(e=>e.addEventListener("scroll",g,{capture:!0,passive:!0})),c.current.orientationHandler=()=>{g()},"orientation"in screen&&"addEventListener"in screen.orientation?screen.orientation.addEventListener("change",c.current.orientationHandler):"onorientationchange"in window&&window.addEventListener("orientationchange",c.current.orientationHandler))}return i=g,a=!!t,(0,ep.useEffect)(()=>{if(a)return window.addEventListener("scroll",i,{capture:!0,passive:!0}),()=>void window.removeEventListener("scroll",i,!0)},[i,a]),o=m,(0,ep.useEffect)(()=>(window.addEventListener("resize",o),()=>void window.removeEventListener("resize",o)),[o]),(0,ep.useEffect)(()=>{v(),b()},[t,g,m]),(0,ep.useEffect)(()=>v,[]),[e=>{e&&e!==c.current.element&&(v(),c.current.element=e,c.current.scrollContainers=function e(t){let r=[];if(!t||t===document.body)return r;let{overflow:n,overflowX:i,overflowY:a}=window.getComputedStyle(t);return[n,i,a].some(e=>"auto"===e||"scroll"===e)&&r.push(t),[...r,...e(t.parentElement)]}(e),b())},l,h]}({scroll:!0,debounce:{scroll:50,resize:0},...n}),T=ep.useRef(null),B=ep.useRef(null);ep.useImperativeHandle(e,()=>T.current);let P=xL(y),[R,_]=ep.useState(!1),[I,O]=ep.useState(!1);if(R)throw R;if(I)throw I;let L=ep.useRef(null);xO(()=>{let e=T.current;if(M.width>0&&M.height>0&&e){let r,n,i,y,C,A,S,k,z,T,R,I,D,N,j;L.current||(y=null==(i=Cx.get(e))?void 0:i.fiber,C=null==i?void 0:i.store,i&&console.warn("R3F.createRoot should only be called once!"),A="function"==typeof reportError?reportError:console.error,I=C||(z=(k=(S=xx((e,t)=>{let r,n=new F.Vector3,i=new F.Vector3,a=new F.Vector3;function o(e=t().camera,r=i,s=t().size){let{width:l,height:u,top:c,left:d}=s,f=l/u;r.isVector3?a.copy(r):a.set(...r);let p=e.getWorldPosition(n).distanceTo(a);if(e&&e.isOrthographicCamera)return{width:l/e.zoom,height:u/e.zoom,top:c,left:d,factor:1,distance:p,aspect:f};{let t=2*Math.tan(e.fov*Math.PI/180/2)*p,r=l/u*t;return{width:r,height:t,top:c,left:d,factor:l/r,distance:p,aspect:f}}}let s=t=>e(e=>({performance:{...e.performance,current:t}})),l=new F.Vector2;return{set:e,get:t,gl:null,camera:null,raycaster:null,events:{priority:1,enabled:!0,connected:!1},scene:null,xr:null,invalidate:(e=1)=>CO(t(),e),advance:(e,r)=>CL(e,r,t()),legacy:!1,linear:!1,flat:!1,controls:null,clock:new F.Clock,pointer:l,mouse:l,frameloop:"always",onPointerMissed:void 0,performance:{current:1,min:.5,max:1,debounce:200,regress:()=>{let e=t();r&&clearTimeout(r),e.performance.current!==e.performance.min&&s(e.performance.min),r=setTimeout(()=>s(t().performance.max),e.performance.debounce)}},size:{width:0,height:0,top:0,left:0},viewport:{initialDpr:0,dpr:0,width:0,height:0,top:0,left:0,aspect:0,distance:0,factor:0,getCurrentViewport:o},setEvents:t=>e(e=>({...e,events:{...e.events,...t}})),setSize:(r,n,a=0,s=0)=>{let l=t().camera,u={width:r,height:n,top:a,left:s};e(e=>({size:u,viewport:{...e.viewport,...o(l,i,u)}}))},setDpr:t=>e(e=>{let r=xN(t);return{viewport:{...e.viewport,dpr:r,initialDpr:e.viewport.initialDpr||r}}}),setFrameloop:(r="always")=>{let n=t().clock;n.stop(),n.elapsedTime=0,"never"!==r&&(n.start(),n.elapsedTime=0),e(()=>({frameloop:r}))},previousRoot:void 0,internal:{interaction:[],hovered:new Map,subscribers:[],initialClick:[0,0],initialHits:[],capturedMap:new Map,lastEvent:ep.createRef(),active:!1,frames:0,priority:0,subscribe:(e,r,n)=>{let i=t().internal;return i.priority=i.priority+ +(r>0),i.subscribers.push({ref:e,priority:r,store:n}),i.subscribers=i.subscribers.sort((e,t)=>e.priority-t.priority),()=>{let n=t().internal;null!=n&&n.subscribers&&(n.priority=n.priority-(r>0),n.subscribers=n.subscribers.filter(t=>t.ref!==e))}}}}})).getState()).size,T=k.viewport.dpr,R=k.camera,S.subscribe(()=>{let{camera:e,size:t,viewport:r,gl:n,set:i}=S.getState();if(t.width!==z.width||t.height!==z.height||r.dpr!==T){z=t,T=r.dpr,x0(e,t),r.dpr>0&&n.setPixelRatio(r.dpr);let i="undefined"!=typeof HTMLCanvasElement&&n.domElement instanceof HTMLCanvasElement;n.setSize(t.width,t.height,i)}e!==R&&(R=e,i(t=>({viewport:{...t.viewport,...t.viewport.getCurrentViewport(e)}})))}),S.subscribe(e=>CO(e)),S),D=y||Cy.createContainer(I,1,null,!1,null,"",A,A,A,null),i||Cx.set(e,{fiber:D,store:I}),N=!1,j=null,L.current={async configure(t={}){var i,a;let o;j=new Promise(e=>o=e);let{gl:s,size:l,scene:u,events:c,onCreated:d,shadows:f=!1,linear:p=!1,flat:h=!1,legacy:m=!1,orthographic:g=!1,frameloop:v="always",dpr:b=[1,2],performance:w,raycaster:y,camera:x,onPointerMissed:C}=t,A=I.getState(),S=A.gl;if(!A.gl){let t={canvas:e,powerPreference:"high-performance",antialias:!0,alpha:!0},r="function"==typeof s?await s(t):s;S=x5(r)?r:new F.WebGLRenderer({...t,...s}),A.set({gl:S})}let k=A.raycaster;k||A.set({raycaster:k=new F.Raycaster});let{params:E,...z}=y||{};if(xH.equ(z,k,CC)||xY(k,{...z}),xH.equ(E,k.params,CC)||xY(k,{params:{...k.params,...E}}),!A.camera||A.camera===n&&!xH.equ(n,x,CC)){n=x;let e=null==x?void 0:x.isCamera,t=e?x:g?new F.OrthographicCamera(0,0,0,0,.1,1e3):new F.PerspectiveCamera(75,0,.1,1e3);!e&&(t.position.z=5,x&&(xY(t,x),!t.manual&&("aspect"in x||"left"in x||"right"in x||"bottom"in x||"top"in x)&&(t.manual=!0,t.updateProjectionMatrix())),A.camera||null!=x&&x.rotation||t.lookAt(0,0,0)),A.set({camera:t}),k.camera=t}if(!A.scene){let e;null!=u&&u.isScene?xG(e=u,I,"",{}):(xG(e=new F.Scene,I,"",{}),u&&xY(e,u)),A.set({scene:e})}c&&!A.events.handlers&&A.set({events:c(I)});let M=function(e,t){if(!t&&"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement&&e.parentElement){let{width:t,height:r,top:n,left:i}=e.parentElement.getBoundingClientRect();return{width:t,height:r,top:n,left:i}}return!t&&"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas?{width:e.width,height:e.height,top:0,left:0}:{width:0,height:0,top:0,left:0,...t}}(e,l);if(xH.equ(M,A.size,CC)||A.setSize(M.width,M.height,M.top,M.left),b&&A.viewport.dpr!==xN(b)&&A.setDpr(b),A.frameloop!==v&&A.setFrameloop(v),A.onPointerMissed||A.set({onPointerMissed:C}),w&&!xH.equ(w,A.performance,CC)&&A.set(e=>({performance:{...e.performance,...w}})),!A.xr){let e=(e,t)=>{let r=I.getState();"never"!==r.frameloop&&CL(e,!0,r,t)},t=()=>{let t=I.getState();t.gl.xr.enabled=t.gl.xr.isPresenting,t.gl.xr.setAnimationLoop(t.gl.xr.isPresenting?e:null),t.gl.xr.isPresenting||CO(t)},r={connect(){let e=I.getState().gl;e.xr.addEventListener("sessionstart",t),e.xr.addEventListener("sessionend",t)},disconnect(){let e=I.getState().gl;e.xr.removeEventListener("sessionstart",t),e.xr.removeEventListener("sessionend",t)}};"function"==typeof(null==(i=S.xr)?void 0:i.addEventListener)&&r.connect(),A.set({xr:r})}if(S.shadowMap){let e=S.shadowMap.enabled,t=S.shadowMap.type;if(S.shadowMap.enabled=!!f,xH.boo(f))S.shadowMap.type=F.PCFSoftShadowMap;else if(xH.str(f)){let e={basic:F.BasicShadowMap,percentage:F.PCFShadowMap,soft:F.PCFSoftShadowMap,variance:F.VSMShadowMap};S.shadowMap.type=null!=(a=e[f])?a:F.PCFSoftShadowMap}else xH.obj(f)&&Object.assign(S.shadowMap,f);(e!==S.shadowMap.enabled||t!==S.shadowMap.type)&&(S.shadowMap.needsUpdate=!0)}return F.ColorManagement.enabled=!m,N||(S.outputColorSpace=p?F.LinearSRGBColorSpace:F.SRGBColorSpace,S.toneMapping=h?F.NoToneMapping:F.ACESFilmicToneMapping),A.legacy!==m&&A.set(()=>({legacy:m})),A.linear!==p&&A.set(()=>({linear:p})),A.flat!==h&&A.set(()=>({flat:h})),!s||xH.fun(s)||x5(s)||xH.equ(s,S,CC)||xY(S,s),r=d,N=!0,o(),this},render(t){return N||j||this.configure(),j.then(()=>{Cy.updateContainer((0,eg.jsx)(CA,{store:I,children:t,onCreated:r,rootElement:e}),D,null,()=>void 0)}),I},unmount(){CS(e)}}),async function(){await L.current.configure({gl:a,scene:w,events:o,shadows:u,linear:c,flat:d,legacy:f,orthographic:p,frameloop:h,dpr:m,performance:g,raycaster:v,camera:b,size:M,onPointerMissed:(...e)=>null==P.current?void 0:P.current(...e),onCreated:e=>{null==e.events.connect||e.events.connect(s?s&&s.hasOwnProperty("current")?s.current:s:B.current),l&&e.setEvents({compute:(e,t)=>{let r=e[l+"X"],n=e[l+"Y"];t.pointer.set(r/t.size.width*2-1,-(2*(n/t.size.height))+1),t.raycaster.setFromCamera(t.pointer,t.camera)}}),null==x||x(e)}}),L.current.render((0,eg.jsx)(E,{children:(0,eg.jsx)(xD,{set:O,children:(0,eg.jsx)(ep.Suspense,{fallback:(0,eg.jsx)(xF,{set:_}),children:null!=t?t:null})})}))}()}}),ep.useEffect(()=>{let e=T.current;if(e)return()=>CS(e)},[]);let D=s?"none":"auto";return(0,eg.jsx)("div",{ref:B,style:{position:"relative",width:"100%",height:"100%",overflow:"hidden",pointerEvents:D,...i},...C,children:(0,eg.jsx)("div",{ref:z,style:{width:"100%",height:"100%"},children:(0,eg.jsx)("canvas",{ref:T,style:{display:"block"},children:r})})})}function SW(e){return(0,eg.jsx)(xT,{children:(0,eg.jsx)(SQ,{...e})})}let SX={width:void 0,height:void 0};function SY(e,t,r){return e[t]?Array.isArray(e[t])?e[t][0][r]:e[t][r]:"contentBoxSize"===t?e.contentRect["inlineSize"===r?"width":"height"]:void 0}let{slice:SZ,forEach:S0}=[],S1=/^[\u0009\u0020-\u007e\u0080-\u00ff]+$/,S2=function(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{path:"/"},n=encodeURIComponent(t),i=`${e}=${n}`;if(r.maxAge>0){let e=r.maxAge-0;if(Number.isNaN(e))throw Error("maxAge should be a Number");i+=`; Max-Age=${Math.floor(e)}`}if(r.domain){if(!S1.test(r.domain))throw TypeError("option domain is invalid");i+=`; Domain=${r.domain}`}if(r.path){if(!S1.test(r.path))throw TypeError("option path is invalid");i+=`; Path=${r.path}`}if(r.expires){if("function"!=typeof r.expires.toUTCString)throw TypeError("option expires is invalid");i+=`; Expires=${r.expires.toUTCString()}`}if(r.httpOnly&&(i+="; HttpOnly"),r.secure&&(i+="; Secure"),r.sameSite)switch("string"==typeof r.sameSite?r.sameSite.toLowerCase():r.sameSite){case!0:case"strict":i+="; SameSite=Strict";break;case"lax":i+="; SameSite=Lax";break;case"none":i+="; SameSite=None";break;default:throw TypeError("option sameSite is invalid")}return r.partitioned&&(i+="; Partitioned"),i},S3={create(e,t,r,n){let i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{path:"/",sameSite:"strict"};r&&(i.expires=new Date,i.expires.setTime(i.expires.getTime()+60*r*1e3)),n&&(i.domain=n),document.cookie=S2(e,t,i)},read(e){let t=`${e}=`,r=document.cookie.split(";");for(let e=0;e<r.length;e++){let n=r[e];for(;" "===n.charAt(0);)n=n.substring(1,n.length);if(0===n.indexOf(t))return n.substring(t.length,n.length)}return null},remove(e,t){this.create(e,"",-1,t)}};var S5={name:"cookie",lookup(e){let{lookupCookie:t}=e;if(t&&"undefined"!=typeof document)return S3.read(t)||void 0},cacheUserLanguage(e,t){let{lookupCookie:r,cookieMinutes:n,cookieDomain:i,cookieOptions:a}=t;r&&"undefined"!=typeof document&&S3.create(r,e,n,i,a)}},S4={name:"querystring",lookup(e){let t,{lookupQuerystring:r}=e;if("undefined"!=typeof window){let{search:e}=window.location;!window.location.search&&window.location.hash?.indexOf("?")>-1&&(e=window.location.hash.substring(window.location.hash.indexOf("?")));let n=e.substring(1).split("&");for(let e=0;e<n.length;e++){let i=n[e].indexOf("=");i>0&&n[e].substring(0,i)===r&&(t=n[e].substring(i+1))}}return t}},S9={name:"hash",lookup(e){let t,{lookupHash:r,lookupFromHashIndex:n}=e;if("undefined"!=typeof window){let{hash:e}=window.location;if(e&&e.length>2){let i=e.substring(1);if(r){let e=i.split("&");for(let n=0;n<e.length;n++){let i=e[n].indexOf("=");i>0&&e[n].substring(0,i)===r&&(t=e[n].substring(i+1))}}if(t)return t;if(!t&&n>-1){let t=e.match(/\/([a-zA-Z-]*)/g);if(!Array.isArray(t))return;return t["number"==typeof n?n:0]?.replace("/","")}}}return t}};let S6=null,S8=()=>{if(null!==S6)return S6;try{if(!(S6="undefined"!=typeof window&&null!==window.localStorage))return!1;let e="i18next.translate.boo";window.localStorage.setItem(e,"foo"),window.localStorage.removeItem(e)}catch(e){S6=!1}return S6};var S7={name:"localStorage",lookup(e){let{lookupLocalStorage:t}=e;if(t&&S8())return window.localStorage.getItem(t)||void 0},cacheUserLanguage(e,t){let{lookupLocalStorage:r}=t;r&&S8()&&window.localStorage.setItem(r,e)}};let ke=null,kt=()=>{if(null!==ke)return ke;try{if(!(ke="undefined"!=typeof window&&null!==window.sessionStorage))return!1;let e="i18next.translate.boo";window.sessionStorage.setItem(e,"foo"),window.sessionStorage.removeItem(e)}catch(e){ke=!1}return ke};var kr={name:"sessionStorage",lookup(e){let{lookupSessionStorage:t}=e;if(t&&kt())return window.sessionStorage.getItem(t)||void 0},cacheUserLanguage(e,t){let{lookupSessionStorage:r}=t;r&&kt()&&window.sessionStorage.setItem(r,e)}},kn={name:"navigator",lookup(e){let t=[];if("undefined"!=typeof navigator){let{languages:e,userLanguage:r,language:n}=navigator;if(e)for(let r=0;r<e.length;r++)t.push(e[r]);r&&t.push(r),n&&t.push(n)}return t.length>0?t:void 0}},ki={name:"htmlTag",lookup(e){let t,{htmlTag:r}=e,n=r||("undefined"!=typeof document?document.documentElement:null);return n&&"function"==typeof n.getAttribute&&(t=n.getAttribute("lang")),t}},ka={name:"path",lookup(e){let{lookupFromPathIndex:t}=e;if("undefined"==typeof window)return;let r=window.location.pathname.match(/\/([a-zA-Z-]*)/g);if(Array.isArray(r))return r["number"==typeof t?t:0]?.replace("/","")}},ko={name:"subdomain",lookup(e){let{lookupFromSubdomainIndex:t}=e,r="undefined"!=typeof window&&window.location?.hostname?.match(/^(\w{2,5})\.(([a-z0-9-]{1,63}\.[a-z]{2,6})|localhost)/i);if(r)return r["number"==typeof t?t+1:1]}};let ks=!1;try{document.cookie,ks=!0}catch(e){}let kl=["querystring","cookie","localStorage","sessionStorage","navigator","htmlTag"];ks||kl.splice(1,1);class ku{constructor(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.type="languageDetector",this.detectors={},this.init(e,t)}init(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{languageUtils:{}},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};this.services=e,this.options=function(e){return S0.call(SZ.call(arguments,1),t=>{if(t)for(let r in t)void 0===e[r]&&(e[r]=t[r])}),e}(t,this.options||{},{order:kl,lookupQuerystring:"lng",lookupCookie:"i18next",lookupLocalStorage:"i18nextLng",lookupSessionStorage:"i18nextLng",caches:["localStorage"],excludeCacheFor:["cimode"],convertDetectedLanguage:e=>e}),"string"==typeof this.options.convertDetectedLanguage&&this.options.convertDetectedLanguage.indexOf("15897")>-1&&(this.options.convertDetectedLanguage=e=>e.replace("-","_")),this.options.lookupFromUrlIndex&&(this.options.lookupFromPathIndex=this.options.lookupFromUrlIndex),this.i18nOptions=r,this.addDetector(S5),this.addDetector(S4),this.addDetector(S7),this.addDetector(kr),this.addDetector(kn),this.addDetector(ki),this.addDetector(ka),this.addDetector(ko),this.addDetector(S9)}addDetector(e){return this.detectors[e.name]=e,this}detect(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.options.order,t=[];return(e.forEach(e=>{if(this.detectors[e]){let r=this.detectors[e].lookup(this.options);r&&"string"==typeof r&&(r=[r]),r&&(t=t.concat(r))}}),t=t.filter(e=>null!=e&&!("string"==typeof e&&[/<\s*script.*?>/i,/<\s*\/\s*script\s*>/i,/<\s*img.*?on\w+\s*=/i,/<\s*\w+\s*on\w+\s*=.*?>/i,/javascript\s*:/i,/vbscript\s*:/i,/expression\s*\(/i,/eval\s*\(/i,/alert\s*\(/i,/document\.cookie/i,/document\.write\s*\(/i,/window\.location/i,/innerHTML/i].some(t=>t.test(e)))).map(e=>this.options.convertDetectedLanguage(e)),this.services&&this.services.languageUtils&&this.services.languageUtils.getBestMatchFromCodes)?t:t.length>0?t[0]:null}cacheUserLanguage(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.options.caches;!t||this.options.excludeCacheFor&&this.options.excludeCacheFor.indexOf(e)>-1||t.forEach(t=>{this.detectors[t]&&this.detectors[t].cacheUserLanguage(e,this.options)})}}ku.type="languageDetector";var kc=JSON.parse('{"camera":{"fov":45},"floor":{"z":185.0,"pitchDeg":-87.0,"rollDeg":0},"walls":[{"id":"backWall","z":580.0,"pitchDeg":0,"rollDeg":0},{"id":"rightWall","z":315.0,"pitchDeg":0,"rollDeg":-90.0},{"id":"leftWall","z":560.0,"pitchDeg":0,"rollDeg":55.0},{"id":"ceiling","z":1000.0,"pitchDeg":90.0,"rollDeg":0}]}'),kd=JSON.parse('{"camera":{"fov":45},"floor":{"z":205.0,"pitchDeg":-87.0,"rollDeg":0},"walls":[{"id":"backWall","z":570.0,"pitchDeg":0,"rollDeg":0},{"id":"rightWall","z":315.0,"pitchDeg":0,"rollDeg":-90.0},{"id":"leftWall","z":1000.0,"pitchDeg":0,"rollDeg":90.0},{"id":"ceiling","z":1000.0,"pitchDeg":90.0,"rollDeg":0}]}'),kf=JSON.parse('{"camera":{"fov":45},"floor":{"z":185.0,"pitchDeg":-90.0,"rollDeg":0},"walls":[{"id":"backWall","z":550.0,"pitchDeg":0,"rollDeg":0},{"id":"rightWall","z":220.0,"pitchDeg":0,"rollDeg":-90.0},{"id":"leftWall","z":218.0,"pitchDeg":0,"rollDeg":90.0},{"id":"ceiling","z":185.0,"pitchDeg":90.0,"rollDeg":0}]}'),kp=JSON.parse('{"camera":{"fov":45},"maskUrl":"https://vizbl-2.s3.us-west-1.amazonaws.com/public/room-example/room-example-4-mask.png","floor":{"z":76.41371488571167,"pitchDeg":-88.08860421180725,"rollDeg":-1.1962583474814892},"walls":[]}'),kh=JSON.parse('{"camera":{"fov":45},"maskUrl":"https://vizbl-2.s3.us-west-1.amazonaws.com/public/room-example/room-example-5-mask.png","floor":{"z":86.81210279464722,"pitchDeg":-84.67234969139099,"rollDeg":-4.7433755826205015e-2},"walls":[]}'),km=JSON.parse('{"camera":{"fov":45},"maskUrl":"https://vizbl-2.s3.us-west-1.amazonaws.com/public/room-example/room-example-6-mask.png","floor":{"z":124.4072675704956,"pitchDeg":-70.20531892776489,"rollDeg":-0.7209355384111404},"walls":[]}');let kg=0,kv=new F.Vector3(1,0,0),kb=new F.Vector3(0,1,0),kw=new F.Vector3(0,0,1);function ky(e,t,r,n){let i=kw.clone().applyAxisAngle(kv,F.MathUtils.degToRad(t)).applyAxisAngle(kb,F.MathUtils.degToRad(r)).applyQuaternion(n.quaternion).normalize(),a=new F.Quaternion().setFromUnitVectors(kw,i);return{position:n.position.clone().addScaledVector(i,-(e*kS)).toArray(),quaternion:a.toArray()}}function kx(e){return{camera:e.camera,maskUrl:e.maskUrl,surfaces:[{...e.floor,id:kk},...e.walls]}}let kC="https://vizbl-2.s3.us-west-1.amazonaws.com/public/room-example/",kA=`https://cdn.jsdelivr.net/npm/onnxruntime-web@${D.env.versions.common}/dist/`,kS=.01,kk="floor",kE=[{id:"room-example-1",name:"Living room",image:`${kC}room-example-1.jpg`,config:kx(kc)},{id:"room-example-2",name:"Bedroom",image:`${kC}room-example-2.jpg`,config:kx(kd)},{id:"room-example-3",name:"Kitchen",image:`${kC}room-example-3.jpg`,config:kx(kf)}],kz=[{id:"room-example-4",name:"Hallway",image:`${kC}room-example-4.png`,config:kx(kp)},{id:"room-example-5",name:"Dining room",image:`${kC}room-example-5.png`,config:kx(kh)},{id:"room-example-6",name:"Office",image:`${kC}room-example-6.png`,config:kx(km)}],kM=["RcSd3KphTyq_JQEjNCqKQA","gu0109ftQmS-UQkwcW010Q","nOfGLIZcRVeU93wOkHWSbg","ozzH5I2kQMW20ao-33C86A","DBA4wR-zT92vjtuOk9varg"],kT="97f6e38a-d092-41b4-ba62-1a870b54e964";function kB(){let{t:e}=oi();return(0,ep.useMemo)(()=>[{value:0,label:e("mattingOptions.none")},{value:.05,label:`5 ${e("units.cm")}`}],[e])}let kP=(0,ep.createContext)(null);function kR({children:e,resource:t,type:r,width:n,height:i,name:a}){let o=function(){let{t:e}=oi();return(0,ep.useMemo)(()=>[{value:.025,label:`2.5 ${e("units.cm")}`},{value:.05,label:`5 ${e("units.cm")}`}],[e])}(),s=kB(),l="carpet"===r?kz:kE,[u,c]=(0,ep.useState)(l),[d,f]=(0,ep.useState)(l[0].id),p=(0,ep.useMemo)(()=>u.find(e=>e.id===d)??u[0],[u,d]),[h,m]=(0,ep.useState)(null),[g,v]=(0,ep.useState)(null),[b,w]=(0,ep.useState)(o[0].value),[y,x]=(0,ep.useState)(s[0].value),[C,A]=(0,ep.useState)(0),[S,k]=(0,ep.useState)(0),[E,z]=(0,ep.useState)(!1),[M,T]=(0,ep.useState)(null),[B,P]=(0,ep.useState)(!0),[R,_]=(0,ep.useState)("carpet"===r),[I,O]=(0,ep.useState)(!1),[L,F]=(0,ep.useState)(!1),D=(0,ep.useRef)(null),N=(0,ep.useMemo)(()=>({resource:t,tinuuid:h,type:r,name:a,rooms:u,setRooms:c,room:p,setRoomId:f,material:g,setTinuuid:m,width:n,height:i,frameWidth:b,matting:y,angle:C,rotation:S,isDragging:E,containerRef:M,setMaterial:v,setFrameWidth:w,setMatting:x,setAngle:A,setRotation:k,setIsDragging:z,setContainerRef:T,resourceRef:D,isSceneLoading:B,setIsSceneLoading:P,isInferenceLoading:R,setIsInferenceLoading:_,isSceneResourceReady:I,setIsSceneResourceReady:O,isSceneRenderedReady:L,setIsSceneRenderedReady:F}),[t,h,r,a,u,p,g,n,i,b,y,C,S,M,E,D,B,R,I,L]);return(0,eg.jsx)(kP,{value:N,children:e})}function k_(){let e=(0,ep.use)(kP);if(!e)throw Error("useRoomViewer must be used within a RoomViewerProvider");return e}function kI({className:e,...t}){let{containerRef:r,material:n,setMaterial:i,setTinuuid:a}=k_(),{t:o}=oi(),s=function({queries:e,...t},r){let n=tL(void 0),i=ep.useContext(tD),a=ep.useContext(tN),o=ep.useMemo(()=>e.map(e=>{let t=n.defaultQueryOptions(e);return t._optimisticResults=i?"isRestoring":"optimistic",t}),[e,n,i]);o.forEach(e=>{tG(e),tj(e,a)}),tH(a);let[s]=ep.useState(()=>new tI(n,o,t)),[l,u,c]=s.getOptimisticResult(o,t.combine),d=!i&&!1!==t.subscribed;ep.useSyncExternalStore(ep.useCallback(e=>d?s.subscribe(e2.batchCalls(e)):e4,[s,d]),()=>s.getCurrentResult(),()=>s.getCurrentResult()),ep.useEffect(()=>{s.setQueries(o,t)},[o,t,s]);let f=l.some((e,t)=>t$(o[t],e))?l.flatMap((e,t)=>{let r=o[t];if(r){let t=new tM(n,r);if(t$(r,e))return tV(r,t,a);tq(e,i)&&tV(r,t,a)}return[]}):[];if(f.length>0)throw Promise.all(f);let p=l.find((e,t)=>{let r=o[t];return r&&tU({result:e,errorResetBoundary:a,throwOnError:r.throwOnError,query:n.getQueryCache().get(r.queryHash),suspense:r.suspense})});if(p?.error)throw p.error;return u(c())}({queries:kM.map(e=>({queryKey:((e={})=>[{url:"/obj/Fetch"},...e?[e]:[]])({tinuuid:e}),queryFn:()=>lC({tinuuid:e})}))});return(0,ep.useEffect)(()=>{let e=s[0]?.data,t=e?.materials?.[0],r=e?.tinuuid;null===n&&t&&r&&(i(t),a(r))},[n,s,i,a]),(0,eg.jsxs)(lz,{className:r7("w-fit",e),...t,children:[(0,eg.jsx)(lM,{className:"text-xs text-text-sub font-medium",children:o("material")}),(0,eg.jsxs)(c9,{value:n?.hid??void 0,onValueChange:e=>{let t=s.find(t=>t.data?.materials?.[0]?.hid===e)?.data;if(!t?.materials?.[0]||!t.tinuuid)return;let r=t.materials[0],n=t.tinuuid;i(r),a(n)},children:[(0,eg.jsx)(c8,{className:"w-[145px]",size:"md",children:(0,eg.jsxs)(c6,{placeholder:o("chooseMaterial"),children:[(0,eg.jsx)("div",{className:"size-5 rounded-full",style:{backgroundColor:`#${n?.miniature?.color?.hex}`}}),n?.miniature?.color?.name]})}),(0,eg.jsx)(c7,{portalContainer:r,children:s.map(e=>{let t=e.data;if(!t?.materials?.[0]||!t.tinuuid)return null;let r=t.materials[0];return(0,eg.jsxs)(de,{value:r.hid,children:[(0,eg.jsx)("div",{className:"size-5 rounded-full",style:{backgroundColor:`#${r?.miniature?.color?.hex}`}}),r.miniature?.color?.name]},`${t.tinuuid}-${r.hid}`)})})]})]})}function kO({className:e,children:t,...r}){let{className:n,onReachEnd:i,...a}=r.swiperOptions??{},{t:o}=oi(),[s,l]=(0,ep.useState)(null),[u,c]=(0,ep.useState)(!0),[d,f]=(0,ep.useState)(!1),[p,h]=(0,ep.useState)(!1),m=(0,ep.useCallback)(e=>{c(e.isBeginning),f(e.isEnd),h(e.isLocked)},[]),g=(0,ep.useCallback)(e=>{l(e),m(e)},[m]),v=(0,ep.useCallback)(e=>{f(!0),i?.(e)},[i]);return(0,eg.jsxs)("div",{className:r7("relative w-full overflow-hidden",e),children:[(0,eg.jsx)(fD,{className:r7("w-full py-5",n),slidesPerView:"auto",slidesPerGroup:2,onSwiper:g,onReachBeginning:()=>c(!0),onReachEnd:v,onFromEdge:m,onLock:()=>h(!0),onUnlock:()=>h(!1),onResize:m,slidesOffsetBefore:24,slidesOffsetAfter:24,spaceBetween:12,...a,children:t}),(0,eg.jsxs)(nn,{className:r7("absolute top-1/2 left-8 -translate-y-1/2 z-1",{hidden:u||p}),variant:"contrast",size:"icon",onClick:()=>s?.slidePrev(),children:[(0,eg.jsx)(ao,{}),(0,eg.jsx)("span",{className:"sr-only",children:o("previousSlide")})]}),(0,eg.jsxs)(nn,{className:r7("absolute top-1/2 right-8 -translate-y-1/2 z-1",{hidden:d||p}),variant:"contrast",size:"icon",onClick:()=>s?.slideNext(),children:[(0,eg.jsx)(as,{}),(0,eg.jsx)("span",{className:"sr-only",children:o("nextSlide")})]})]})}function kL(e){return e.hid??e.uuid??""}function kF({className:e,...t}){let{material:r,resource:n,setMaterial:i,setTinuuid:a}=k_(),o=r?kL(r):"",{data:s,isFetchingNextPage:l,fetchNextPage:u,hasNextPage:c}=tX({queryKey:["room-viewer","carpet-materials",kT],queryFn:({pageParam:e})=>lA({page:e,owners:[kT]}),initialPageParam:1,getNextPageParam:(e,t,r)=>{if(e.objs?.length)return r+1},getPreviousPageParam:(e,t,r)=>{if(!(r<=1))return r-1}},tW,void 0),d=(0,ep.useMemo)(()=>s?.pages.flatMap(e=>e.objs??[])??[],[s]),f=d.find(e=>e.materials?.some(e=>e.native?.glbUrl===n));(0,ep.useEffect)(()=>{if(null!==r)return;let e=f?.materials?.find(e=>e.native?.glbUrl===n);if(f&&e&&f.tinuuid){i(e),a(f.tinuuid);return}let t=d[0];!n&&t?.materials?.[0]&&t.tinuuid&&(i(t.materials[0]),a(t.tinuuid))},[f,r,d,n,i,a]);let p=(0,ep.useCallback)(()=>{c&&!l&&u()},[u,c,l]);return(0,eg.jsx)("div",{className:r7(e),...t,children:(0,eg.jsx)(dq,{value:o||void 0,onValueChange:e=>{let t=d.find(t=>t.materials?.some(t=>kL(t)===e)),r=t?.materials?.find(t=>kL(t)===e);t&&r&&t.tinuuid&&(i(r),a(t.tinuuid))},children:(0,eg.jsx)(kO,{swiperOptions:{onReachEnd:p},children:d.flatMap(e=>e.materials?.map(t=>{let r=kL(t);return e.tinuuid?(0,eg.jsx)(fN,{className:r7("w-25! transition-transform duration-200",r!==o&&"hover:scale-110"),children:(0,eg.jsxs)(lM,{htmlFor:`material-${r}`,className:"size-full flex flex-col gap-1 has-data-[state=checked]:bg-transparent",children:[(0,eg.jsxs)("div",{className:"size-full relative h-19 rounded-[0.75rem] overflow-hidden",children:[(0,eg.jsx)("img",{src:t.previews?.[0]?.subRes?.small??t.previews?.[0]?.url,alt:t.name??"",className:"size-full object-cover"}),(0,eg.jsx)(dV,{value:r,id:`material-${r}`,variant:"check",className:r7("absolute top-1.75 right-1.75",{"sr-only":r!==o})})]}),(0,eg.jsx)("span",{className:r7("block w-full text-xs text-left text-text-light truncate",{"text-text-dark":r===o}),children:t.name})]})},`${e.tinuuid}-${r}`):null})??[])})})})}function kD({className:e,...t}){let{matting:r,setMatting:n}=k_(),{t:i}=oi(),a=kB();return(0,eg.jsxs)(lz,{className:r7("w-fit",e),...t,children:[(0,eg.jsx)(lM,{className:"text-xs text-text-sub font-medium",children:i("matting")}),(0,eg.jsx)(ps,{value:r.toString(),onValueChange:e=>n(Number(e)),children:(0,eg.jsx)(pu,{children:a.map(e=>(0,eg.jsx)(pc,{value:e.value.toString(),children:e.label},e.value))})})]})}function kN({className:e,...t}){let{t:r}=oi(),{rooms:n,room:i,setRoomId:a,setRooms:o,type:s}=k_(),l=(0,ep.useId)(),u=(0,ep.useCallback)(e=>{let t=e.target.files?.[0];if(e.target.value="",!t)return;let r=URL.createObjectURL(t),n={id:(kg+=1,`room-custom-${kg}`),name:t.name,image:r,config:{camera:{fov:45},surfaces:[{id:kk,z:0,pitchDeg:-90,rollDeg:0}]}};o(e=>[n,...e]),a(n.id)},[a,o]);return(0,eg.jsx)("div",{className:r7(e),...t,children:(0,eg.jsx)(dq,{value:i.id,onValueChange:a,children:(0,eg.jsxs)(kO,{children:["carpet"===s&&(0,eg.jsx)(fN,{className:"w-25! h-auto",children:(0,eg.jsxs)(lM,{htmlFor:l,className:r7("flex size-full cursor-pointer items-center justify-center rounded-[0.75rem] border border-dashed border-muted-foreground/40 bg-transparent px-2 text-center text-xs leading-tight text-muted-foreground transition-colors hover:border-foreground/40 hover:text-foreground"),children:[r("uploadOwnPhoto"),(0,eg.jsx)("input",{id:l,type:"file",accept:"image/*",className:"sr-only",onChange:u})]})}),n.map(e=>(0,eg.jsx)(fN,{className:r7("w-25! transition-transform duration-200",e.id!==i.id&&"hover:scale-110"),children:(0,eg.jsxs)(lM,{htmlFor:`room-${e.id}`,className:"size-full flex flex-col gap-1 has-data-[state=checked]:bg-transparent",children:[(0,eg.jsxs)("div",{className:"size-full relative h-19 rounded-[0.75rem] overflow-hidden",children:[(0,eg.jsx)("img",{src:e.image,alt:e.name,className:"size-full object-cover"}),(0,eg.jsx)(dV,{value:e.id,id:`room-${e.id}`,variant:"check",className:r7("absolute top-1.75 right-1.75",{"sr-only":e.id!==i.id})})]}),(0,eg.jsx)("span",{className:r7("block w-full text-xs text-left text-text-light truncate",{"text-text-dark":e.id===i.id}),children:e.name})]})},e.id))]})})})}function kj({className:e,...t}){let{type:r}=k_();return(0,eg.jsxs)("div",{className:r7("flex items-end pl-0 overflow-hidden",e),...t,children:[(0,eg.jsx)(kN,{className:r7("shrink-0",{"min-w-120.5":"carpet"===r,grow:"poster"===r})}),"poster"===r&&(0,eg.jsxs)("div",{className:"hidden gap-5 pr-6 pb-5 md:flex",children:[(0,eg.jsx)(kI,{}),(0,eg.jsx)(kD,{})]}),"carpet"===r&&(0,eg.jsxs)(eg.Fragment,{children:[(0,eg.jsx)(om,{orientation:"vertical"}),(0,eg.jsx)(kF,{})]})]})}function kH({className:e,...t}){let{t:r}=oi();return(0,eg.jsxs)("div",{className:r7("group inline-flex gap-2 text-sm text-muted-foreground","hover:text-text-dark","transition-colors duration-200 ease-in-out",e),...t,children:[(0,eg.jsx)("div",{className:"size-5 flex items-center justify-center rounded-full bg-icons-light group-hover:bg-icons-red transition-colors duration-200 ease-in-out",children:(0,eg.jsx)(oc,{className:"size-4.25 text-icons-white"})}),r("poweredBy")]})}function kU({className:e,...t}){let{name:r}=k_();return(0,eg.jsxs)("div",{className:r7("h-16 grid gap-5 items-center px-6 sm:grid-cols-3",e),...t,children:[(0,eg.jsx)("div",{className:"truncate",children:r}),(0,eg.jsx)("div",{className:"hidden justify-center sm:flex",children:(0,eg.jsx)(kH,{})}),(0,eg.jsx)("div",{className:"hidden sm:block"})]})}let kG="iOS"===new yE().getOS().name;function kq({className:e,...t}){let{resource:r,tinuuid:n,type:i,width:a,height:o,containerRef:s,resourceRef:l}=k_(),{t:u}=oi(),[c,d]=(0,ep.useState)(""),[f,p]=(0,ep.useState)(""),[h,m]=(0,ep.useState)(!1),[g,v]=(0,ep.useState)(!1),b=(0,ep.useRef)(null),w=(0,ep.useMemo)(()=>{if("carpet"===i&&n){let e=new URL("https://viewer.vizbl.com/ar/index.html");return e.searchParams.set("tinuuid",n),e.searchParams.set("appview","true"),e.toString()}let e=new URL("https://viewer.vizbl.com/poster/app/index.html");return e.searchParams.set("texture",r),e.searchParams.set("texture_width",(100*a).toString()),e.searchParams.set("texture_height",(100*o).toString()),decodeURIComponent(e.toString())},[r,n,i,a,o]),y=(0,ep.useMemo)(()=>{if(!n)return null;let e=new URL("https://appclip.apple.com/id");return e.searchParams.set("p","com.us.vizbl.Clip"),e.searchParams.set("tinuuid",n),e.toString()},[n]),x=async()=>{if("carpet"===i)return n?kG&&y?void window.location.assign(y):void m(!0):void 0;let e=b.current,t=l.current;if(e&&t)if(e.canActivateAR)try{v(!0);let e=t.clone(!0);if(e.position.set(0,0,0),kG){let t=new bM,r=await t.parseAsync(e),n=new File([r],"scene.usdz",{type:"model/vnd.usdz+zip"});d(URL.createObjectURL(n))}else{let t=new bD,r=await t.parseAsync(e,{binary:!0}),n=new File([r],"scene.glb",{type:"model/gltf-binary"});p(URL.createObjectURL(n))}}finally{v(!1)}else m(!0)};return((0,ep.useEffect)(()=>((""!==c||""!==f)&&b.current?.activateAR(),()=>{""!==c&&URL.revokeObjectURL(c),""!==f&&URL.revokeObjectURL(f)}),[c,f]),"carpet"!==i||n)?(0,eg.jsxs)("div",{className:r7(e),...t,children:[(0,eg.jsx)(nn,{variant:"contrast",disabled:g,onClick:x,children:u("ar.viewInPlace")}),(0,eg.jsx)(i9,{open:h,onOpenChange:m,children:(0,eg.jsxs)(ae,{className:"gap-6 sm:max-w-120",showCloseButton:!1,portalContainer:s,children:[(0,eg.jsx)("div",{className:"flex items-center justify-center p-10 bg-constant-white rounded-2xl",children:(0,eg.jsx)(vG,{className:"size-48",robustness:"H",data:w})}),(0,eg.jsx)("p",{className:"text-lg text-center text-text-sub font-medium",children:u("ar.scanQrCode")}),(0,eg.jsx)(i8,{asChild:!0,children:(0,eg.jsx)(nn,{variant:"contrast",size:"lg",children:u("close")})})]})}),(0,eg.jsx)("model-viewer",{ref:b,className:"fixed w-px h-px opacity-0 pointer-events-none",src:f,iosSrc:c,reveal:"manual",ar:!0,cameraControls:!0,arPlacement:"wall",arModes:"webxr",arScale:"fixed",shadowIntensity:1,interactionPromptThreshold:100})]}):null}async function k$(e,t){return new Promise((r,n)=>{e.toBlob(e=>{e?r(e):n(Error(t))},"image/png")})}function kV({ref:e}){let{camera:t,gl:r,invalidate:n,scene:i}=x6();return(0,ep.useImperativeHandle)(e,()=>({capture:async()=>(n(),await new Promise(e=>requestAnimationFrame(()=>e())),r.render(i,t),k$(r.domElement,"Failed to create scene share image"))}),[t,r,n,i]),null}function kK(e){return 2===e||3===e}function kJ(e,t,r){let n=ky(e.z,e.pitchDeg,e.rollDeg,r),i=function(e){let t=0,r=0,n=0;for(let i=0;i<e.height;i++)for(let a=0;a<e.width;a++)kK(e.classes[i*e.width+a])&&(t+=a+.5,r+=i+.5,n+=1);return 0===n?null:{x:t/n,y:r/n}}(t);if(!i)return null;let a=new F.Quaternion(...n.quaternion),o=new F.Vector3(0,0,1).applyQuaternion(a).normalize(),s=new F.Vector3(...n.position),l=i.x/t.width*2-1,u=1-i.y/t.height*2,c=new F.Raycaster;c.setFromCamera(new F.Vector2(l,u),r);let d=new F.Plane().setFromNormalAndCoplanarPoint(o,s),f=c.ray.intersectPlane(d,new F.Vector3);return f?(f.addScaledVector(o,.05),{position:f.toArray(),quaternion:n.quaternion}):null}function kQ(e){return new Promise((t,r)=>{let n=new Image;n.crossOrigin="anonymous",n.onload=()=>t(n),n.onerror=()=>r(Error(`Failed to load image from ${e}`)),n.src=e})}function kW(e,t,r){let n=document.createElement("canvas");n.width=t,n.height=r;let i=n.getContext("2d");if(!i)throw Error("Failed to get 2D context for segmentation mask.");let a=i.createImageData(t,r),o=t*r;for(let t=0;t<o;t++){let r=kK(e[t]);a.data[4*t]=255,a.data[4*t+1]=255,a.data[4*t+2]=255,a.data[4*t+3]=255*!!r}return i.putImageData(a,0,0),n}async function kX(e){let t=await kQ(e),r=document.createElement("canvas");r.width=t.naturalWidth||t.width,r.height=t.naturalHeight||t.height;let n=r.getContext("2d");if(!n)throw Error("Failed to get 2D context for segmentation mask.");n.drawImage(t,0,0);let{width:i,height:a}=r,o=n.getImageData(0,0,i,a),s=new Uint8Array(i*a);for(let e=0;e<s.length;e++){let t=o.data[4*e+3];s[e]=2*(t>127)}return{segmentationClasses:{classes:s,width:i,height:a}}}async function kY(e){let t=kW(e.classes,e.width,e.height),r=await k$(t,"Failed to serialize segmentation mask PNG.");return URL.createObjectURL(r)}D.env.wasm.wasmPaths=kA,D.env.wasm.proxy=!0;async function kZ(e){let[t,r]=await Promise.all([D.InferenceSession.create("https://vizbl-2.s3.us-west-1.amazonaws.com/public/mod/model_infer.onnx",{executionProviders:["wasm"]}),kQ(e)]),n=t.inputNames[0];if(!n)throw Error("ONNX model input tensor is missing.");let i=function(e,t){let r=document.createElement("canvas");r.width=512,r.height=512;let n=r.getContext("2d");if(!n)throw Error("Failed to get 2D context for ONNX input.");n.drawImage(e,0,0,512,512);let i=n.getImageData(0,0,512,512),a=new Uint8Array(786432);for(let e=0,t=0;e<1048576;e+=4,t+=3)a[t]=i.data[e],a[t+1]=i.data[e+1],a[t+2]=i.data[e+2];return new t.Tensor("uint8",a,[1,512,512,3])}(r,D),a=await t.run({[n]:i}),{zOutput:o,rollOutput:s,pitchOutput:l,segmentationOutput:u}=function(e,t){if(e.outputNames.length<4)throw Error(`Invalid ONNX output count: ${e.outputNames.length}`);let[r,n,i,a]=e.outputNames,o=t[r],s=t[n],l=t[i],u=t[a];if(!o||!s||!l||!u)throw Error("ONNX output tensor mapping failed.");return{zOutput:o,rollOutput:s,pitchOutput:l,segmentationOutput:u}}(t,a),c=400*Number(o.data[0]??0),d=45*Number(s.data[0]??0),f=90*Number(l.data[0]??0);return{decodedSegmentation:function(e){let t=function(e){let t=e.dims.map(Number);if(4!==t.length)throw Error(`Unsupported segmentation output shape: [${t.join(", ")}]`);let[,r,n,i]=t;if(r<=0||n<=0||i<=0)throw Error(`Invalid segmentation output shape: [${t.join(", ")}]`);if(4!==i)throw Error(`Unsupported segmentation channels: ${i}. Expected 4.`);return{width:n,height:r}}(e),r=e.data,n=t.width*t.height,i=new Uint8Array(n);for(let e=0,t=0;e<n;e++,t+=4){let n=0,a=Number(r[t]??0);for(let e=1;e<4;e++){let i=Number(r[t+e]??0);i>a&&(a=i,n=e)}i[e]=n}return{classes:i,width:t.width,height:t.height}}(u),floor:{z:c,pitchDeg:-f,rollDeg:d}}}function k0(e){let t=e.getContext("2d");if(!t)throw Error("Failed to get 2D context for carpet lighting map.");return t}function k1(e,t){let r=document.createElement("canvas");return r.width=e,r.height=t,r}function k2(e,t){let r=k1(e,t),n=k0(r),i=n.createImageData(e,t);for(let r=0;r<e*t;r++){let e=4*r;i.data[e]=128,i.data[e+1]=128,i.data[e+2]=128,i.data[e+3]=255}return n.putImageData(i,0,0),r}function k3(e){let t=new Uint8ClampedArray(e.width*e.height);for(let r=0;r<t.length;r++){let n=4*r,i=e.data[n],a=e.data[n+1],o=e.data[n+2];t[r]=Math.round(.299*i+.587*a+.114*o)}return t}function k5(e,t,r,n,i){let a=function(e,t,r){let n=k1(t,r),i=k0(n),a=i.createImageData(t,r);for(let n=0;n<t*r;n++){let t=Math.max(0,Math.min(255,Math.round(Number(e[n]??0)))),r=4*n;a.data[r]=t,a.data[r+1]=t,a.data[r+2]=t,a.data[r+3]=255}return i.putImageData(a,0,0),n}(e,t,r),o=k0(k1(n,i));return o.imageSmoothingEnabled=!0,o.drawImage(a,0,0,n,i),k3(o.getImageData(0,0,n,i))}function k4(e,t){let r=new Float32Array(e.length);for(let n=0;n<e.length;n++)r[n]=Number(e[n]??0)*(Number(t[n]??0)/255);return r}function k9(e,t){let r=new Uint8ClampedArray(e.length);for(let n=0;n<e.length;n++){let i=Number(t[n]??0)/255;if(i<=1e-4){r[n]=0;continue}let a=Number(e[n]??0)/i;r[n]=Math.max(0,Math.min(255,Math.round(a)))}return r}function k6(e){return 2===e||3===e}async function k8(e,t,r={}){let{width:n,height:i,classes:a}=t;if(n<=0||i<=0||0===a.length)return k2(n,i);let o=await kQ(e),s=k0(k1(n,i));s.drawImage(o,0,0,n,i);let l=k3(s.getImageData(0,0,n,i)),u=function(e){let t=new Uint8ClampedArray(e.length);for(let r=0;r<e.length;r++)t[r]=255*!!k6(e[r]);return t}(a),c=Math.max(1,Math.round(r.scaleDiv??8)),d=Math.max(1,Math.round(r.filterDiameter??4)),f=r.sigmaColor??70,p=r.sigmaSpace??70,h=Math.max(1,Math.round(n/c)),m=Math.max(1,Math.round(i/c)),g=k5(k4(l,u),n,i,h,m),v=k5(u,n,i,h,m),b=k5(k4(function(e,t,r,n,i,a,o){let s=new Uint8ClampedArray(e.length),l=Math.max(1,Math.floor(n/2)),u=Math.max(1,i),c=Math.max(1,a),d=2*u*u,f=2*c*c,p=new Float32Array((2*l+1)*(2*l+1)),h=0;for(let e=-l;e<=l;e++)for(let t=-l;t<=l;t++){let r=t*t+e*e;p[h]=Math.exp(-r/f),h+=1}for(let n=0;n<r;n++)for(let i=0;i<t;i++){let a=n*t+i;if(Number(o?.[a]??255)/255<=1e-4){s[a]=0;continue}let u=e[a],c=0,f=0,h=0;for(let a=-l;a<=l;a++){let s=Math.max(0,Math.min(r-1,n+a));for(let r=-l;r<=l;r++){let n=Math.max(0,Math.min(t-1,i+r)),a=s*t+n,l=Number(o?.[a]??255)/255;if(l<=1e-4){h+=1;continue}let m=e[a],g=m-u,v=Math.exp(-(g*g)/d),b=p[h]*v*l;c+=b,f+=m*b,h+=1}}s[a]=c>0?Math.round(f/c):u}return s}(k9(g,v),h,m,d,f,p,v),v),h,m,n,i),w=k9(b,k5(v,h,m,n,i)),y=0,x=0;for(let e=0;e<a.length;e++)k6(a[e])&&(x+=w[e],y+=1);if(0===y)return k2(n,i);let C=x/y,A=0;for(let e=0;e<a.length;e++){if(!k6(a[e]))continue;let t=Math.abs(w[e]-C);t>A&&(A=t)}if(A<=0)return k2(n,i);let S=k1(n,i),k=k0(S),E=k.createImageData(n,i);for(let e=0;e<a.length;e++){let t=4*e,r=128;k6(a[e])&&(r=Math.max(0,Math.min(255,Math.round(255*(.5+(w[e]-C)/A*.4))))),E.data[t]=r,E.data[t+1]=r,E.data[t+2]=r,E.data[t+3]=255}return k.putImageData(E,0,0),S}let k7=Math.PI/2,Ee="uRoomMask",Et="uRoomLightingMap",Er="uRoomLightingStrength",En="uRoomMaskResolution",Ei="uRoomMaskTextureSize";function Ea(e,t=F.LinearFilter,r=F.LinearFilter){let n=new F.CanvasTexture(e);return n.needsUpdate=!0,n.minFilter=t,n.magFilter=r,n.generateMipmaps=!1,n}async function Eo(e,t,r,n){"function"==typeof e.compileAsync?await e.compileAsync(t,r,n):e.compile(t,r,n)}function Es({resource:e,position:t,quaternion:r,maskCanvas:n,lightingCanvas:i}){let{resourceRef:a,rotation:o,setIsDragging:s,setIsSceneResourceReady:l,setIsSceneRenderedReady:u}=k_(),{gl:c,size:d,camera:f,scene:p,invalidate:h}=x6(),m=CU(e),g=(0,ep.useRef)(null),v=(0,ep.useRef)(null),b=(0,ep.useRef)(null),w=(0,ep.useRef)(null),y=(0,ep.useRef)(!1);null===g.current&&(g.current=new F.Vector2(1,1)),null===b.current&&(b.current=Ea(n,F.NearestFilter,F.NearestFilter)),null===v.current&&(v.current=new F.Vector2(1,1)),null===w.current&&(w.current=Ea(i));let x=g.current,C=v.current,A=b.current,S=w.current,k=(0,ep.useMemo)(()=>m.scene.clone(!0),[m]),E=(0,ep.useMemo)(()=>F.MathUtils.degToRad(o),[o]),{materials:z,meshes:M}=(0,ep.useMemo)(()=>{let e,t;return e=new Set,t=[],k.traverse(r=>{if(!r.isMesh||(t.push(r),!r.material))return;if(Array.isArray(r.material)){let t=r.material.map(t=>{let r=t.clone();return e.add(r),r});r.material=t;return}let n=r.material.clone();e.add(n),r.material=n}),{materials:Array.from(e),meshes:t}},[k]),T=(0,ep.useCallback)(()=>{s(!0)},[s]),B=(0,ep.useCallback)(()=>{s(!1)},[s]);return(0,ep.useLayoutEffect)(()=>{let e=[],t=()=>{e.forEach(e=>e()),e.length=0};return y.current=!1,M.forEach(r=>{let n=r.onAfterRender,i=(...e)=>{n?.(...e),y.current||(y.current=!0,t(),u(!0),h())};r.onAfterRender=i,e.push(()=>{r.onAfterRender===i&&(r.onAfterRender=n)})}),()=>{t()}},[h,M,u]),(0,ep.useEffect)(()=>()=>{z.forEach(e=>e.dispose())},[z]),(0,ep.useLayoutEffect)(()=>{A.image=n,A.needsUpdate=!0,C.set(Math.max(1,n.width),Math.max(1,n.height))},[n,A,C]),(0,ep.useLayoutEffect)(()=>{S.image=i,S.needsUpdate=!0},[i,S]),(0,ep.useLayoutEffect)(()=>{c.getDrawingBufferSize(x),x.set(Math.max(1,x.x),Math.max(1,x.y))},[c,x,d.width,d.height]),(0,ep.useLayoutEffect)(()=>{let e=z.map(e=>{let t,r,n;return t=e.onBeforeCompile,r=e.customProgramCacheKey.bind(e),n=e.transparent,e.onBeforeCompile=(r,n)=>{t?.call(e,r,n),r.uniforms[Ee]={value:A},r.uniforms[Et]={value:S},r.uniforms[Er]={value:.13},r.uniforms[En]={value:x},r.uniforms[Ei]={value:C},r.fragmentShader=r.fragmentShader.replace("#include <common>",`
147
147
  #include <common>
148
- uniform sampler2D ${Er};
149
- uniform sampler2D ${En};
150
- uniform float ${Ei};
151
- uniform vec2 ${Ea};
152
- uniform vec2 ${Eo};
148
+ uniform sampler2D ${Ee};
149
+ uniform sampler2D ${Et};
150
+ uniform float ${Er};
151
+ uniform vec2 ${En};
152
+ uniform vec2 ${Ei};
153
153
 
154
154
  float sampleRoomMaskAlpha(vec2 uv) {
155
- vec2 texel = vec2(5.0) / ${Eo};
156
- float centerAlpha = texture2D(${Er}, uv).a;
155
+ vec2 texel = vec2(5.0) / ${Ei};
156
+ float centerAlpha = texture2D(${Ee}, uv).a;
157
157
  float spatialDenominator = 2.0 * 4.0 * 4.0;
158
158
  float rangeDenominator = 2.0 * 0.7 * 0.7;
159
159
  float weightSum = 0.0;
@@ -162,7 +162,7 @@ void main() {
162
162
  for (int offsetY = -2; offsetY <= 2; offsetY++) {
163
163
  for (int offsetX = -2; offsetX <= 2; offsetX++) {
164
164
  vec2 offset = vec2(float(offsetX), float(offsetY));
165
- float sampleAlpha = texture2D(${Er}, uv + offset * texel).a;
165
+ float sampleAlpha = texture2D(${Ee}, uv + offset * texel).a;
166
166
  float spatialWeight = exp(-dot(offset, offset) / spatialDenominator);
167
167
  float rangeDelta = sampleAlpha - centerAlpha;
168
168
  float rangeWeight = exp(-(rangeDelta * rangeDelta) / rangeDenominator);
@@ -176,18 +176,18 @@ void main() {
176
176
  return weightSum > 0.0 ? alphaSum / weightSum : centerAlpha;
177
177
  }
178
178
  `),r.fragmentShader=r.fragmentShader.replace("#include <dithering_fragment>",`
179
- vec2 roomMaskUv = gl_FragCoord.xy / ${Ea};
179
+ vec2 roomMaskUv = gl_FragCoord.xy / ${En};
180
180
  float roomMaskAlpha = sampleRoomMaskAlpha(roomMaskUv);
181
181
  if (roomMaskAlpha < 0.01) discard;
182
- float roomLightingEncoded = texture2D(${En}, roomMaskUv).r;
182
+ float roomLightingEncoded = texture2D(${Et}, roomMaskUv).r;
183
183
  float roomLightingSigned = roomLightingEncoded * 2.0 - 1.0;
184
184
  float roomLightingFactor = clamp(
185
- 1.0 + roomLightingSigned * ${Ei},
185
+ 1.0 + roomLightingSigned * ${Er},
186
186
  0.84,
187
187
  1.10
188
188
  );
189
189
  gl_FragColor.rgb *= roomLightingFactor;
190
190
  gl_FragColor.a *= smoothstep(0.0, 0.42, roomMaskAlpha);
191
191
  #include <dithering_fragment>
192
- `)},e.customProgramCacheKey=()=>`${r()}|vizbl-carpet-mask-v2`,e.transparent=!0,e.needsUpdate=!0,()=>{e.onBeforeCompile=t,e.customProgramCacheKey=r,e.transparent=n,e.needsUpdate=!0}});return h(),()=>{e.forEach(e=>e())}},[h,S,C,z,A,x]),(0,ep.useLayoutEffect)(()=>{let e=!1;return(async()=>{try{await El(c,k,f,p)}catch{}finally{e||(l(!0),h())}})(),()=>{e=!0}},[f,c,h,p,k,l]),(0,ep.useEffect)(()=>()=>{A.dispose(),S.dispose()},[S,A]),(0,eg.jsx)("group",{ref:a,position:t,quaternion:r,onPointerDown:T,onPointerUp:B,onPointerLeave:B,children:(0,eg.jsx)("group",{"rotation-z":E,children:(0,eg.jsx)("group",{"rotation-x":Et,children:(0,eg.jsx)("primitive",{object:k})})})})}function Ec({resource:e,position:t,quaternion:r,segmentationClasses:n}){let{data:i}=function(e){let{room:t,setIsInferenceLoading:r}=kO(),n=null!=e,i=tX({queryKey:["room-viewer","carpet-canvases",t.id,t.image],enabled:n,retry:1,staleTime:0,gcTime:0,refetchOnWindowFocus:!1,refetchOnReconnect:!1,queryFn:async()=>{if(!e)throw Error("Segmentation classes are required to create carpet canvases.");let r=function(e,t){let r=kY(e.classes,e.width,e.height),n=Math.max(1,4*e.width),i=Math.max(1,4*e.height),a=document.createElement("canvas");a.width=n,a.height=i;let o=a.getContext("2d");if(!o)throw Error("Failed to get 2D context for upscaled segmentation mask.");return o.imageSmoothingEnabled=!0,o.imageSmoothingQuality="high",o.drawImage(r,0,0,n,i),a}(e,0);return{lightingCanvas:await Ee(t.image,e),maskCanvas:r}}},tM,void 0);return(0,ep.useEffect)(()=>{r(n&&i.isLoading)},[n,i.isLoading,r]),i}(n);return i?(0,eg.jsx)(Eu,{resource:e,position:t,quaternion:r,maskCanvas:i.maskCanvas,lightingCanvas:i.lightingCanvas}):null}function Ed({ref:e,z:t,pitchDeg:r,rollDeg:n,userData:i}){let{position:a,quaternion:o}=function(e){let{z:t,pitchDeg:r,rollDeg:n}=e,i=x6(e=>e.camera);return(0,ep.useMemo)(()=>ky(t,r,n,i),[t,r,n])}({z:t,pitchDeg:r,rollDeg:n});return(0,eg.jsxs)("mesh",{ref:e,position:a,quaternion:o,userData:i,children:[(0,eg.jsx)("planeGeometry",{args:[64,64]}),(0,eg.jsx)("meshStandardMaterial",{transparent:!0,opacity:0})]})}function Ef({node:e,position:t,scale:r=[1,1,1],uvScale:n}){let i=(0,ep.useRef)(null);return(0,ep.useEffect)(()=>{if(!i.current||void 0===n)return;let t=i.current.geometry.attributes.uv,r=e.geometry.attributes.uv.array;for(let e=0;e<t.count;e++){let i=r[2*e],a=r[2*e+1];t.setXY(e,i*n,a)}t.needsUpdate=!0},[n,e.geometry]),(0,eg.jsx)(Cq,{ref:i,object:e,position:t,scale:r})}function Ep({width:e,height:t}){let{material:r}=kO(),{nodes:n}=CU(r?.native?.glbUrl),i=(0,ep.useMemo)(()=>{let e=new F.Vector3,t={};["vizbl0","vizbl1","vizbl2","vizbl3","vizbl4","vizbl5","vizbl6","vizbl7"].forEach(r=>{let i=n[r];if(!i?.geometry)return;let a=i.clone();a.updateMatrixWorld(!0),a.geometry.applyMatrix4(a.matrixWorld),a.position.set(0,0,0),a.rotation.set(0,0,0),a.scale.set(1,1,1),a.updateMatrixWorld(!0),a.geometry.computeBoundingBox(),a.geometry.boundingBox&&(a.geometry.boundingBox.getCenter(e),a.geometry.translate(-e.x,-e.y,-e.z)),a.geometry.computeBoundingBox(),t[r]=a});let r=t.vizbl0;if(!r?.geometry)throw Error("Corner mesh not found");let i=r.geometry.boundingBox,a=i.max.x-i.min.x,o=i.max.y-i.min.y,s={top:0,bottom:0,left:0,right:0},l={top:0,bottom:0,left:0,right:0},u=t.vizbl1;if(u?.geometry){let e=u.geometry.boundingBox;s.top=e.max.x-e.min.x,l.top=e.max.y-e.min.y}let c=t.vizbl3;if(c?.geometry){let e=c.geometry.boundingBox;s.right=e.max.y-e.min.y,l.right=e.max.x-e.min.x}let d=t.vizbl5;if(d?.geometry){let e=d.geometry.boundingBox;s.bottom=e.max.x-e.min.x,l.bottom=e.max.y-e.min.y}let f=t.vizbl7;if(f?.geometry){let e=f.geometry.boundingBox;s.left=e.max.y-e.min.y,l.left=e.max.x-e.min.x}return{cornerSize:{width:a,height:o},barLengths:s,barThickness:l,normalizedNodes:t}},[n]),a=e-2*i.cornerSize.width+.002,o=t-2*i.cornerSize.height+.002,s=a/i.barLengths.top,l=a/i.barLengths.bottom,u=o/i.barLengths.left,c=o/i.barLengths.right;return(0,eg.jsxs)("group",{children:[(0,eg.jsx)(Ef,{node:i.normalizedNodes.vizbl0,position:[-e/2+i.cornerSize.width/2-.001,t/2-i.cornerSize.height/2+.001,0]}),(0,eg.jsx)(Ef,{node:i.normalizedNodes.vizbl1,position:[0,t/2-i.barThickness.top/2+.001,0],scale:[s,1,1],uvScale:s}),(0,eg.jsx)(Ef,{node:i.normalizedNodes.vizbl2,position:[e/2-i.cornerSize.width/2+.001,t/2-i.cornerSize.height/2+.001,0]}),(0,eg.jsx)(Ef,{node:i.normalizedNodes.vizbl3,position:[e/2-i.barThickness.right/2+.001,0,0],scale:[1,c,1],uvScale:c}),(0,eg.jsx)(Ef,{node:i.normalizedNodes.vizbl4,position:[e/2-i.cornerSize.width/2+.001,-t/2+i.cornerSize.height/2-.001,0]}),(0,eg.jsx)(Ef,{node:i.normalizedNodes.vizbl5,position:[0,-t/2+i.barThickness.bottom/2-.001,0],scale:[l,1,1],uvScale:l}),(0,eg.jsx)(Ef,{node:i.normalizedNodes.vizbl6,position:[-e/2+i.cornerSize.width/2-.001,-t/2+i.cornerSize.height/2-.001,0]}),(0,eg.jsx)(Ef,{node:i.normalizedNodes.vizbl7,position:[-e/2+i.barThickness.left/2-.001,0,0],scale:[1,u,1],uvScale:u})]})}function Eh({width:e,height:t,position:r,quaternion:n}){return(0,eg.jsxs)("mesh",{position:r,quaternion:n,children:[(0,eg.jsx)("planeGeometry",{args:[e,t]}),(0,eg.jsx)("meshStandardMaterial",{color:"white"})]})}function Em({resource:e,position:t,quaternion:r}){let{width:n,height:i,material:a,frameWidth:o,rotation:s,resourceRef:l,matting:u,setIsDragging:c}=kO(),d=Ce(F.TextureLoader,e),f=(0,ep.useMemo)(()=>F.MathUtils.degToRad(s),[s]),p=n+2*u,h=i+2*u,m=u>0?p:n,g=u>0?h:i;return(0,eg.jsx)("group",{ref:l,position:t,quaternion:r,onPointerDown:()=>c(!0),onPointerUp:()=>c(!1),onPointerLeave:()=>c(!1),children:(0,eg.jsxs)("group",{"rotation-y":f,children:[a?.native?.glbUrl&&o>0&&(0,eg.jsx)(Ep,{width:m,height:g}),u>0&&(0,eg.jsx)(Eh,{width:p,height:h,position:[0,0,.01]}),(0,eg.jsxs)("mesh",{position:[0,0,.02],children:[(0,eg.jsx)("planeGeometry",{args:[n,i]}),(0,eg.jsx)("meshStandardMaterial",{map:d})]})]})})}function Eg(){let{room:e}=kO(),t=x6(e=>e.scene),r=Ce(F.TextureLoader,e.image);return(0,ep.useLayoutEffect)(()=>(r.colorSpace=F.SRGBColorSpace,t.background=r,()=>{t.background===r&&(t.background=null)}),[t,r]),null}let Ev=new F.Vector2(0,0);function Eb(){let{resource:e,type:t,room:r,material:n}=kO(),i="carpet"===t,a=x6(e=>e.get),[o,s]=(0,ep.useState)(null),l=(0,ep.useRef)(new Map),u=(0,ep.useRef)([]),c="carpet"===t?n?.native?.glbUrl??e:e,{data:d}=function(e){let{room:t,setRooms:r,setIsInferenceLoading:n}=kO(),i=x6(e=>e.get),a=t.config.surfaces.find(e=>e.id===kz)??null,o=tX({queryKey:["room-viewer","carpet-inference",t.id,t.image],enabled:e,retry:1,staleTime:0,gcTime:0,refetchOnWindowFocus:!1,refetchOnReconnect:!1,queryFn:async()=>{if(!a)throw Error("Floor surface is missing for carpet inference.");let{camera:e}=i();if(t.config.maskUrl){let r=await kZ(t.config.maskUrl);return{...r,initialPose:kW(a,r.segmentationClasses,e)}}let r=await k1(t.image),n=r.decodedSegmentation,o={id:kz,...r.floor},s=await k0(n);return{segmentationClasses:n,floor:o,initialPose:kW(o,n,e),maskUrl:s}}},tM,void 0);return(0,ep.useEffect)(()=>{if(!o.data?.maskUrl||!o.data.floor||t.config.maskUrl===o.data.maskUrl)return;let{floor:e,maskUrl:n}=o.data;r(r=>r.map(r=>r.id!==t.id?r:{...r,config:{...r.config,maskUrl:n,surfaces:r.config.surfaces.map(t=>t.id===kz?e:t)}}))},[o.data,t.config.maskUrl,t.id,r]),(0,ep.useEffect)(()=>{n(e&&o.isLoading)},[e,o.isLoading,n]),o}(i),{findPlacementHit:f}=function(){let{type:e}=kO(),t=x6(e=>e.get);return{findPlacementHit:(0,ep.useCallback)((r,n)=>{let{camera:i,raycaster:a}=t();return a.setFromCamera(r,i),a.intersectObjects(n,!1).find(t=>{let r=t.object.userData.surfaceId;return!!r&&("carpet"===e?r===kz:r!==kz)})},[t,e])}}(),p=(0,ep.useMemo)(()=>i?r.config.surfaces.filter(e=>e.id===kz):r.config.surfaces,[i,r.config.surfaces]),h=(0,ep.useCallback)((e,t)=>{let r,n;if(!e){t&&s(null);return}s((r=e.point.clone(),n=new F.Vector3(0,0,1).applyQuaternion(e.object.quaternion),r.addScaledVector(n,.05),{position:r.toArray(),quaternion:e.object.quaternion.toArray()}))},[]),m=(0,ep.useCallback)((e,t)=>{let r=l.current;if(!t){r.delete(e),u.current=Array.from(r.values());return}return r.set(e,t),u.current=Array.from(r.values()),()=>{r.delete(e),u.current=Array.from(r.values())}},[]);(0,ep.useEffect)(()=>{i?s(d?.initialPose??null):h(f(Ev,u.current),!0)},[i,r.id,p,d?.initialPose,f,h]);let g=(0,ep.useCallback)(()=>{let{pointer:e}=a();h(f(e,u.current),!1)},[a,f,h]);return(0,eg.jsxs)(eg.Fragment,{children:[i?o&&d?.segmentationClasses&&(0,eg.jsx)(Aq,{autoTransform:!1,onDrag:g,children:(0,eg.jsx)(Ec,{resource:c,position:o.position,quaternion:o.quaternion,segmentationClasses:d.segmentationClasses})}):o&&(0,eg.jsx)(Aq,{autoTransform:!1,onDrag:g,children:(0,eg.jsx)(Em,{resource:c,position:o.position,quaternion:o.quaternion})}),p.map(e=>(0,eg.jsx)(Ed,{ref:t=>m(e.id,t),userData:{surfaceId:e.id},z:e.z,pitchDeg:e.pitchDeg,rollDeg:e.rollDeg},e.id)),(0,eg.jsx)(Eg,{})]})}function Ew({className:e,ref:t,captureRef:r,onSizeChange:n,...i}){let{room:a,resource:o,type:s,material:l,isInferenceLoading:u,isSceneResourceReady:c,isSceneRenderedReady:d,setIsSceneResourceReady:f,setIsSceneRenderedReady:p,setIsSceneLoading:h}=kO(),{active:m}=AK(),g="carpet"===s?l?.native?.glbUrl??o:o,v="poster"===s?l?.native?.glbUrl:void 0,b=function(e){let[t,r]=(0,ep.useState)(null);return(0,ep.useEffect)(()=>{let t=!1,n=new Image;return r(null),n.crossOrigin="anonymous",n.decoding="async",n.onload=()=>{!t&&n.height>0&&r(n.width/n.height)},n.onerror=()=>{t||r(null)},n.src=e,()=>{t=!0}},[e]),t}(a.image),w=(0,ep.useRef)(null),y=(0,ep.useRef)(!1),x=(0,ep.useCallback)(e=>{(w.current=e,"function"==typeof t)?t(e):t&&(t.current=e)},[t]),C=ht("(max-width: 639px)"),{width:A,height:S}=function(e){let t,{ref:r,box:n="content-box"}=e,[{width:i,height:a},o]=ep.useState(SX),s=(t=ep.useRef(!1),ep.useEffect(()=>(t.current=!0,()=>{t.current=!1}),[]),ep.useCallback(()=>t.current,[])),l=ep.useRef({...SX}),u=ep.useRef(void 0);return u.current=e.onResize,ep.useEffect(()=>{if(!r.current||"undefined"==typeof window||!("ResizeObserver"in window))return;let e=new ResizeObserver(([e])=>{let t="border-box"===n?"borderBoxSize":"device-pixel-content-box"===n?"devicePixelContentBoxSize":"contentBoxSize",r=SY(e,t,"inlineSize"),i=SY(e,t,"blockSize");if(l.current.width!==r||l.current.height!==i){let e={width:r,height:i};l.current.width=r,l.current.height=i,u.current?u.current(e):s()&&o(e)}});return e.observe(r.current,{box:n}),()=>{e.disconnect()}},[n,r,s]),{width:i,height:a}}({ref:w}),k=(0,ep.useMemo)(()=>{if(!A||!S||!b)return null;let e=A,t=S;return C?e=(t=S)*b:A/S>b?e=S*b:t=A/b,{width:e,height:t}},[A,S,b,C]);(0,ep.useLayoutEffect)(()=>{k&&n?.(k.width,k.height)},[k,n]),(0,ep.useEffect)(()=>{if(!k||y.current)return;y.current=!0;let e=window.setTimeout(()=>{window.dispatchEvent(new Event("resize"))},250);return()=>{window.clearTimeout(e)}},[k]),(0,ep.useLayoutEffect)(()=>{f(!1),p(!1)},[s,a.id,g,v,f,p]);let E=null===k||m,z=l?.native?.glbUrl===void 0,M="poster"===s?E||z:E||u||!c||!d;return(0,ep.useEffect)(()=>{h(M)},[M,h]),(0,eg.jsx)("div",{ref:x,className:r7("size-full flex items-center justify-center sm:pt-21 sm:pb-12",e),...i,children:k&&(0,eg.jsx)(SW,{className:"bg-transparent",frameloop:"demand",camera:{fov:a.config.camera.fov},gl:{toneMapping:F.ACESFilmicToneMapping,toneMappingExposure:1.2,alpha:!0,preserveDrawingBuffer:!0},style:{width:`${k.width}px`,height:`${k.height}px`},children:(0,eg.jsxs)(ep.Suspense,{fallback:null,children:[(0,eg.jsx)(kJ,{ref:r}),(0,eg.jsx)(SV,{files:"poster"===s?["https://vizbl.com/hdr/neutral.hdr"]:void 0,preset:"carpet"===s?"warehouse":void 0}),(0,eg.jsx)(Eb,{})]})})})}function Ey({className:e,...t}){let{containerRef:r,isDragging:n,rotation:i,setRotation:a,type:o}=kO(),{t:s}=oi(),l=(0,ep.useRef)(null),u=(0,ep.useRef)(null),[c,d]=(0,ep.useState)(!1),f=ht("(max-width: 639px)"),p=(0,ep.useMemo)(()=>"undefined"!=typeof navigator&&"function"==typeof navigator.share,[]),h=(0,ep.useCallback)(()=>{f&&l.current?.centerView()},[f]),m=(0,ep.useCallback)(async()=>{if(!p)return;let e=window.location.href,t=s("poster"===o?"shareMessage.poster":"shareMessage.carpet"),r=`${t}
193
- ${e}`;d(!0);try{let t=u.current;if(t)try{let e=await t.capture(),n=new File([e],"room-scene.png",{type:e.type||"image/png"});if(navigator.canShare?.({files:[n]}))return void await navigator.share({text:r,files:[n]})}catch(e){console.error("Failed to generate scene screenshot for sharing",e)}await navigator.share({text:r,url:e})}catch(e){e instanceof DOMException&&"AbortError"===e.name||console.error("Failed to share scene",e)}finally{d(!1)}},[p,s,o]);return(0,eg.jsxs)("div",{className:r7("relative flex items-center justify-center overflow-hidden",e),...t,children:[(0,eg.jsx)(mi,{ref:l,disabled:n,children:(0,eg.jsx)(ma,{wrapperClass:"size-full!",contentClass:"h-full! min-w-full sm:max-w-full",children:(0,eg.jsx)(Ew,{captureRef:u,onSizeChange:h})})}),(0,eg.jsx)(kV,{className:"absolute bottom-4 left-4 sm:bottom-6 sm:left-6"}),(0,eg.jsxs)("div",{className:"bg-button-dark typo-button-normal absolute bottom-4 left-1/2 hidden h-9 -translate-x-1/2 items-center gap-1.5 rounded-lg px-3.75 text-text-white md:inline-flex md:bottom-6",children:[(0,eg.jsx)("span",{className:"shrink-0",children:s("scene.position")}),(0,eg.jsx)(p7,{value:[i],onValueChange:([e])=>a(e??0),min:-180,max:180,step:1,className:"w-29.5 **:data-[slot=slider-range]:bg-transparent **:data-[slot=slider-thumb]:border-background-base-3 **:data-[slot=slider-thumb]]:bg-background-base-3 **:data-[slot=slider-track]:bg-icons-normal","aria-label":s("scene.position")})]}),(0,eg.jsxs)("div",{className:"absolute right-4 bottom-4 inline-flex items-center gap-2 sm:right-6 sm:bottom-6",children:["poster"===o&&(0,eg.jsxs)(nn,{variant:"contrast",size:f?"icon":"default",disabled:!p||c,onClick:m,children:[(0,eg.jsx)(ou,{className:"size-5"}),(0,eg.jsx)("span",{className:"sr-only sm:not-sr-only",children:s("scene.share")})]}),f&&"poster"===o&&(0,eg.jsxs)(p_,{children:[(0,eg.jsx)(pI,{asChild:!0,children:(0,eg.jsx)(nn,{variant:"contrast",size:"icon",children:(0,eg.jsx)(ol,{})})}),(0,eg.jsxs)(pO,{className:"grid gap-5",portalContainer:r,children:[(0,eg.jsx)(kL,{}),(0,eg.jsx)(kj,{})]})]})]})]})}function Ex(){let{setContainerRef:e,isSceneLoading:t}=kO();return(0,eg.jsxs)("div",{ref:e,className:"relative size-full bg-radial from-background-containers to-background-base-2 text-foreground overflow-hidden",children:[(0,eg.jsx)(kq,{className:"absolute top-0 right-0 left-0 z-15"}),(0,eg.jsxs)("div",{className:"size-full max-w-full grid grid-rows-[1fr_auto]",children:[(0,eg.jsx)(Ey,{className:"size-full min-h-0"}),(0,eg.jsx)(kU,{className:"bg-background"})]}),(0,eg.jsx)("div",{"aria-hidden":!t,className:r7("absolute inset-0 z-10 flex items-center justify-center bg-radial from-background-containers to-background-base-2 transition-opacity",t?"opacity-100 pointer-events-auto duration-0":"opacity-0 pointer-events-none duration-250ms"),children:(0,eg.jsx)(od,{variant:"logo"})})]})}aQ.use(ku).use({type:"3rdParty",init(t){((e={})=>{a9={...a9,...e}})(t.options.react),e=t}}).init({debug:!1,detection:{caches:[]},fallbackLng:"en",resources:{en:{translation:{matting:"Matting",material:"Material",chooseMaterial:"Choose material",frameWidth:"Frame width",close:"Close",uploadOwnPhoto:"Upload your photo",previousSlide:"Previous slide",nextSlide:"Next slide",mattingOptions:{none:"None"},units:{cm:"cm"},poweredBy:"Powered by Vizbl",ar:{viewInPlace:"View in place",scanQrCode:"Scan this QR code with your phone's camera to view the object in Augmented Reality"},shareMessage:{poster:"Preview poster",carpet:"Preview carpet"},scene:{tunePosition:"Tune position",position:"Position",share:"Share",angle:"Angle",rotation:"Rotation",reset:"Reset"}}},ru:{translation:{matting:"Паспарту",material:"Материал",chooseMaterial:"Выберите материал",frameWidth:"Ширина рамки",close:"Закрыть",uploadOwnPhoto:"Загрузить свое фото",previousSlide:"Предыдущий слайд",nextSlide:"Следующий слайд",mattingOptions:{none:"Без паспарту"},units:{cm:"см"},poweredBy:"Технологии Аризо",ar:{viewInPlace:"Просмотреть на месте",scanQrCode:"Отсканируйте этот QR-код камерой телефона, чтобы просмотреть объект в дополненной реальности"},shareMessage:{poster:"Примерить постер",carpet:"Примерить ковер"},scene:{tunePosition:"Настроить положение",position:"Положение",share:"Поделиться",angle:"Угол",rotation:"Поворот",reset:"Сбросить"}}}},interpolation:{escapeValue:!1}});let EC=new t2;function EA({resource:e,type:t,width:r,height:n,name:i,language:a,...o}){let[s,l]=(0,ep.useState)(null),{t:u,i18n:c}=oi();return(0,ep.useEffect)(()=>{"string"==typeof a&&c.changeLanguage(a)},[c,a]),(0,eg.jsxs)(eg.Fragment,{children:[s&&(0,eg.jsx)(aa,{root:s,children:(0,eg.jsx)(i9,{...o,children:(0,eg.jsxs)(ae,{className:"min-w-full h-svh p-0 rounded-none sm:p-0",portalContainer:s,showCloseButton:!1,onInteractOutside:e=>{e.preventDefault()},children:[(0,eg.jsxs)(at,{className:"sr-only",children:[(0,eg.jsx)(ar,{children:i}),(0,eg.jsx)(an,{})]}),(0,eg.jsx)(i8,{asChild:!0,children:(0,eg.jsxs)(nn,{className:"absolute top-3 right-6 z-20",variant:"secondary",children:[u("close"),(0,eg.jsx)(i4,{})]})}),(0,eg.jsx)(tF,{client:EC,children:(0,eg.jsx)(kI,{resource:e,type:t,name:i,width:"poster"===t?r??0:0,height:"poster"===t?n??0:0,children:(0,eg.jsx)(Ex,{})})})]})})}),(0,nf.createPortal)((0,eg.jsx)("div",{className:"vizbl-room-viewer",children:(0,eg.jsx)("div",{ref:l})}),document.body)]})}function ES({trigger:e,...t}){let[r,n]=(0,ep.useState)(!1),i=(0,ep.useCallback)(()=>{n(!0)},[]),a=(0,ep.useCallback)(e=>{n(e)},[]);return(0,ep.useEffect)(()=>(e.addEventListener("click",i),()=>{e.removeEventListener("click",i)}),[e,i]),(0,eg.jsx)(EA,{open:r,onOpenChange:a,...t})}let Ek=0;var EE=ed("../../node_modules/.pnpm/@rsbuild+core@1.6.14/node_modules/@rsbuild/core/compiled/css-loader/index.js??ruleSet[1].rules[1].use[1]!builtin:lightningcss-loader??ruleSet[1].rules[1].use[2]!../../node_modules/.pnpm/@rsbuild+core@1.6.14/node_modules/@rsbuild/core/compiled/postcss-loader/index.js??ruleSet[1].rules[1].use[3]!../react-room-viewer/dist/index.css"),Ez={};Ez.styleTagTransform=fX(),Ez.setAttributes=fK(),Ez.insert=f$().bind(null,"head"),Ez.domAPI=fG(),Ez.insertStyleElement=fQ(),fH()(EE.A,Ez),EE.A&&EE.A.locals&&EE.A.locals;let EM=document.createElement("div");EM.id="vizbl-room-viewer-dialog-manager",document.body.appendChild(EM),em.createRoot(EM).render((0,ep.createElement)(function(){let[e,t]=(0,ep.useState)([]);return(0,ep.useEffect)(()=>{let e=function(){var e;return(!eZ&&(eZ=new eK(window.document)),e=eZ).observe.apply(e,arguments)}("[data-vizbl-room-viewer-dialog]",{initialize(e){let r=e.getAttribute("data-vizbl-room-viewer-resource"),n=e.getAttribute("data-vizbl-room-viewer-type"),i=e.getAttribute("data-vizbl-room-viewer-name"),a=e.getAttribute("data-vizbl-room-viewer-language"),o=e.getAttribute("data-vizbl-room-viewer-width"),s=e.getAttribute("data-vizbl-room-viewer-height"),l=o?Number(o):void 0,u=s?Number(s):void 0,c=Ek++;return{add(){t(t=>[...t,{id:c,trigger:e,resource:r,type:n,name:i,language:a,width:l,height:u}])},remove(){t(e=>e.filter(e=>e.id!==c))}}}});return()=>{e.abort()}},[]),(0,eg.jsx)(eg.Fragment,{children:e.map(e=>(0,eg.jsx)(ES,{trigger:e.trigger,resource:e.resource,type:e.type,name:e.name,language:e.language,width:e.width,height:e.height},e.id))})}));
192
+ `)},e.customProgramCacheKey=()=>`${r()}|vizbl-carpet-mask-v2`,e.transparent=!0,e.needsUpdate=!0,()=>{e.onBeforeCompile=t,e.customProgramCacheKey=r,e.transparent=n,e.needsUpdate=!0}});return h(),()=>{e.forEach(e=>e())}},[h,S,C,z,A,x]),(0,ep.useLayoutEffect)(()=>{let e=!1;return(async()=>{try{await Eo(c,k,f,p)}catch{}finally{e||(l(!0),h())}})(),()=>{e=!0}},[f,c,h,p,k,l]),(0,ep.useEffect)(()=>()=>{A.dispose(),S.dispose()},[S,A]),(0,eg.jsx)("group",{ref:a,position:t,quaternion:r,onPointerDown:T,onPointerUp:B,onPointerLeave:B,children:(0,eg.jsx)("group",{"rotation-z":E,children:(0,eg.jsx)("group",{"rotation-x":k7,children:(0,eg.jsx)("primitive",{object:k})})})})}function El({resource:e,position:t,quaternion:r,segmentationClasses:n}){let{data:i}=function(e){let{room:t,setIsInferenceLoading:r}=k_(),n=null!=e,i=tX({queryKey:["room-viewer","carpet-canvases",t.id,t.image],enabled:n,retry:1,staleTime:0,gcTime:0,refetchOnWindowFocus:!1,refetchOnReconnect:!1,queryFn:async()=>{if(!e)throw Error("Segmentation classes are required to create carpet canvases.");let r=function(e,t){let r=kW(e.classes,e.width,e.height),n=Math.max(1,4*e.width),i=Math.max(1,4*e.height),a=document.createElement("canvas");a.width=n,a.height=i;let o=a.getContext("2d");if(!o)throw Error("Failed to get 2D context for upscaled segmentation mask.");return o.imageSmoothingEnabled=!0,o.imageSmoothingQuality="high",o.drawImage(r,0,0,n,i),a}(e,0);return{lightingCanvas:await k8(t.image,e),maskCanvas:r}}},tM,void 0);return(0,ep.useEffect)(()=>{r(n&&i.isLoading)},[n,i.isLoading,r]),i}(n);return i?(0,eg.jsx)(Es,{resource:e,position:t,quaternion:r,maskCanvas:i.maskCanvas,lightingCanvas:i.lightingCanvas}):null}function Eu({ref:e,z:t,pitchDeg:r,rollDeg:n,userData:i}){let{position:a,quaternion:o}=function(e){let{z:t,pitchDeg:r,rollDeg:n}=e,i=x6(e=>e.camera);return(0,ep.useMemo)(()=>ky(t,r,n,i),[t,r,n])}({z:t,pitchDeg:r,rollDeg:n});return(0,eg.jsxs)("mesh",{ref:e,position:a,quaternion:o,userData:i,children:[(0,eg.jsx)("planeGeometry",{args:[64,64]}),(0,eg.jsx)("meshStandardMaterial",{transparent:!0,opacity:0})]})}function Ec({node:e,position:t,scale:r=[1,1,1],uvScale:n}){let i=(0,ep.useRef)(null);return(0,ep.useEffect)(()=>{if(!i.current||void 0===n)return;let t=i.current.geometry.attributes.uv,r=e.geometry.attributes.uv.array;for(let e=0;e<t.count;e++){let i=r[2*e],a=r[2*e+1];t.setXY(e,i*n,a)}t.needsUpdate=!0},[n,e.geometry]),(0,eg.jsx)(Cq,{ref:i,object:e,position:t,scale:r})}function Ed({width:e,height:t}){let{material:r}=k_(),{nodes:n}=CU(r?.native?.glbUrl),i=(0,ep.useMemo)(()=>{let e=new F.Vector3,t={};["vizbl0","vizbl1","vizbl2","vizbl3","vizbl4","vizbl5","vizbl6","vizbl7"].forEach(r=>{let i=n[r];if(!i?.geometry)return;let a=i.clone();a.updateMatrixWorld(!0),a.geometry.applyMatrix4(a.matrixWorld),a.position.set(0,0,0),a.rotation.set(0,0,0),a.scale.set(1,1,1),a.updateMatrixWorld(!0),a.geometry.computeBoundingBox(),a.geometry.boundingBox&&(a.geometry.boundingBox.getCenter(e),a.geometry.translate(-e.x,-e.y,-e.z)),a.geometry.computeBoundingBox(),t[r]=a});let r=t.vizbl0;if(!r?.geometry)throw Error("Corner mesh not found");let i=r.geometry.boundingBox,a=i.max.x-i.min.x,o=i.max.y-i.min.y,s={top:0,bottom:0,left:0,right:0},l={top:0,bottom:0,left:0,right:0},u=t.vizbl1;if(u?.geometry){let e=u.geometry.boundingBox;s.top=e.max.x-e.min.x,l.top=e.max.y-e.min.y}let c=t.vizbl3;if(c?.geometry){let e=c.geometry.boundingBox;s.right=e.max.y-e.min.y,l.right=e.max.x-e.min.x}let d=t.vizbl5;if(d?.geometry){let e=d.geometry.boundingBox;s.bottom=e.max.x-e.min.x,l.bottom=e.max.y-e.min.y}let f=t.vizbl7;if(f?.geometry){let e=f.geometry.boundingBox;s.left=e.max.y-e.min.y,l.left=e.max.x-e.min.x}return{cornerSize:{width:a,height:o},barLengths:s,barThickness:l,normalizedNodes:t}},[n]),a=e-2*i.cornerSize.width+.002,o=t-2*i.cornerSize.height+.002,s=a/i.barLengths.top,l=a/i.barLengths.bottom,u=o/i.barLengths.left,c=o/i.barLengths.right;return(0,eg.jsxs)("group",{children:[(0,eg.jsx)(Ec,{node:i.normalizedNodes.vizbl0,position:[-e/2+i.cornerSize.width/2-.001,t/2-i.cornerSize.height/2+.001,0]}),(0,eg.jsx)(Ec,{node:i.normalizedNodes.vizbl1,position:[0,t/2-i.barThickness.top/2+.001,0],scale:[s,1,1],uvScale:s}),(0,eg.jsx)(Ec,{node:i.normalizedNodes.vizbl2,position:[e/2-i.cornerSize.width/2+.001,t/2-i.cornerSize.height/2+.001,0]}),(0,eg.jsx)(Ec,{node:i.normalizedNodes.vizbl3,position:[e/2-i.barThickness.right/2+.001,0,0],scale:[1,c,1],uvScale:c}),(0,eg.jsx)(Ec,{node:i.normalizedNodes.vizbl4,position:[e/2-i.cornerSize.width/2+.001,-t/2+i.cornerSize.height/2-.001,0]}),(0,eg.jsx)(Ec,{node:i.normalizedNodes.vizbl5,position:[0,-t/2+i.barThickness.bottom/2-.001,0],scale:[l,1,1],uvScale:l}),(0,eg.jsx)(Ec,{node:i.normalizedNodes.vizbl6,position:[-e/2+i.cornerSize.width/2-.001,-t/2+i.cornerSize.height/2-.001,0]}),(0,eg.jsx)(Ec,{node:i.normalizedNodes.vizbl7,position:[-e/2+i.barThickness.left/2-.001,0,0],scale:[1,u,1],uvScale:u})]})}function Ef({width:e,height:t,position:r,quaternion:n}){return(0,eg.jsxs)("mesh",{position:r,quaternion:n,children:[(0,eg.jsx)("planeGeometry",{args:[e,t]}),(0,eg.jsx)("meshStandardMaterial",{color:"white"})]})}function Ep({resource:e,position:t,quaternion:r}){let{width:n,height:i,material:a,frameWidth:o,rotation:s,resourceRef:l,matting:u,setIsDragging:c}=k_(),d=Ce(F.TextureLoader,e),f=(0,ep.useMemo)(()=>F.MathUtils.degToRad(s),[s]),p=n+2*u,h=i+2*u,m=u>0?p:n,g=u>0?h:i;return(0,eg.jsx)("group",{ref:l,position:t,quaternion:r,onPointerDown:()=>c(!0),onPointerUp:()=>c(!1),onPointerLeave:()=>c(!1),children:(0,eg.jsxs)("group",{"rotation-y":f,children:[a?.native?.glbUrl&&o>0&&(0,eg.jsx)(Ed,{width:m,height:g}),u>0&&(0,eg.jsx)(Ef,{width:p,height:h,position:[0,0,.01]}),(0,eg.jsxs)("mesh",{position:[0,0,.02],children:[(0,eg.jsx)("planeGeometry",{args:[n,i]}),(0,eg.jsx)("meshStandardMaterial",{map:d})]})]})})}function Eh(){let{room:e}=k_(),t=x6(e=>e.scene),r=Ce(F.TextureLoader,e.image);return(0,ep.useLayoutEffect)(()=>(r.colorSpace=F.SRGBColorSpace,t.background=r,()=>{t.background===r&&(t.background=null)}),[t,r]),null}let Em=new F.Vector2(0,0);function Eg(){let{resource:e,type:t,room:r,material:n}=k_(),i="carpet"===t,a=x6(e=>e.get),[o,s]=(0,ep.useState)(null),l=(0,ep.useRef)(new Map),u=(0,ep.useRef)([]),c="carpet"===t?n?.native?.glbUrl??e:e,{data:d}=function(e){let{room:t,setRooms:r,setIsInferenceLoading:n}=k_(),i=x6(e=>e.get),a=t.config.surfaces.find(e=>e.id===kk)??null,o=tX({queryKey:["room-viewer","carpet-inference",t.id,t.image],enabled:e,retry:1,staleTime:0,gcTime:0,refetchOnWindowFocus:!1,refetchOnReconnect:!1,queryFn:async()=>{if(!a)throw Error("Floor surface is missing for carpet inference.");let{camera:e}=i();if(t.config.maskUrl){let r=await kX(t.config.maskUrl);return{...r,initialPose:kJ(a,r.segmentationClasses,e)}}let r=await kZ(t.image),n=r.decodedSegmentation,o={id:kk,...r.floor},s=await kY(n);return{segmentationClasses:n,floor:o,initialPose:kJ(o,n,e),maskUrl:s}}},tM,void 0);return(0,ep.useEffect)(()=>{if(!o.data?.maskUrl||!o.data.floor||t.config.maskUrl===o.data.maskUrl)return;let{floor:e,maskUrl:n}=o.data;r(r=>r.map(r=>r.id!==t.id?r:{...r,config:{...r.config,maskUrl:n,surfaces:r.config.surfaces.map(t=>t.id===kk?e:t)}}))},[o.data,t.config.maskUrl,t.id,r]),(0,ep.useEffect)(()=>{n(e&&o.isLoading)},[e,o.isLoading,n]),o}(i),{findPlacementHit:f}=function(){let{type:e}=k_(),t=x6(e=>e.get);return{findPlacementHit:(0,ep.useCallback)((r,n)=>{let{camera:i,raycaster:a}=t();return a.setFromCamera(r,i),a.intersectObjects(n,!1).find(t=>{let r=t.object.userData.surfaceId;return!!r&&("carpet"===e?r===kk:r!==kk)})},[t,e])}}(),p=(0,ep.useMemo)(()=>i?r.config.surfaces.filter(e=>e.id===kk):r.config.surfaces,[i,r.config.surfaces]),h=(0,ep.useCallback)((e,t)=>{let r,n;if(!e){t&&s(null);return}s((r=e.point.clone(),n=new F.Vector3(0,0,1).applyQuaternion(e.object.quaternion),r.addScaledVector(n,.05),{position:r.toArray(),quaternion:e.object.quaternion.toArray()}))},[]),m=(0,ep.useCallback)((e,t)=>{let r=l.current;if(!t){r.delete(e),u.current=Array.from(r.values());return}return r.set(e,t),u.current=Array.from(r.values()),()=>{r.delete(e),u.current=Array.from(r.values())}},[]);(0,ep.useEffect)(()=>{i?s(d?.initialPose??null):h(f(Em,u.current),!0)},[i,r.id,p,d?.initialPose,f,h]);let g=(0,ep.useCallback)(()=>{let{pointer:e}=a();h(f(e,u.current),!1)},[a,f,h]);return(0,eg.jsxs)(eg.Fragment,{children:[i?o&&d?.segmentationClasses&&(0,eg.jsx)(Aq,{autoTransform:!1,onDrag:g,children:(0,eg.jsx)(El,{resource:c,position:o.position,quaternion:o.quaternion,segmentationClasses:d.segmentationClasses})}):o&&(0,eg.jsx)(Aq,{autoTransform:!1,onDrag:g,children:(0,eg.jsx)(Ep,{resource:c,position:o.position,quaternion:o.quaternion})}),p.map(e=>(0,eg.jsx)(Eu,{ref:t=>m(e.id,t),userData:{surfaceId:e.id},z:e.z,pitchDeg:e.pitchDeg,rollDeg:e.rollDeg},e.id)),(0,eg.jsx)(Eh,{})]})}function Ev({className:e,ref:t,captureRef:r,onSizeChange:n,...i}){let{room:a,resource:o,type:s,material:l,isInferenceLoading:u,isSceneResourceReady:c,isSceneRenderedReady:d,setIsSceneResourceReady:f,setIsSceneRenderedReady:p,setIsSceneLoading:h}=k_(),{active:m}=AK(),g="carpet"===s?l?.native?.glbUrl??o:o,v="poster"===s?l?.native?.glbUrl:void 0,b=function(e){let[t,r]=(0,ep.useState)(null);return(0,ep.useEffect)(()=>{let t=!1,n=new Image;return r(null),n.crossOrigin="anonymous",n.decoding="async",n.onload=()=>{!t&&n.height>0&&r(n.width/n.height)},n.onerror=()=>{t||r(null)},n.src=e,()=>{t=!0}},[e]),t}(a.image),w=(0,ep.useRef)(null),y=(0,ep.useRef)(!1),x=(0,ep.useCallback)(e=>{(w.current=e,"function"==typeof t)?t(e):t&&(t.current=e)},[t]),C=ht("(max-width: 639px)"),{width:A,height:S}=function(e){let t,{ref:r,box:n="content-box"}=e,[{width:i,height:a},o]=ep.useState(SX),s=(t=ep.useRef(!1),ep.useEffect(()=>(t.current=!0,()=>{t.current=!1}),[]),ep.useCallback(()=>t.current,[])),l=ep.useRef({...SX}),u=ep.useRef(void 0);return u.current=e.onResize,ep.useEffect(()=>{if(!r.current||"undefined"==typeof window||!("ResizeObserver"in window))return;let e=new ResizeObserver(([e])=>{let t="border-box"===n?"borderBoxSize":"device-pixel-content-box"===n?"devicePixelContentBoxSize":"contentBoxSize",r=SY(e,t,"inlineSize"),i=SY(e,t,"blockSize");if(l.current.width!==r||l.current.height!==i){let e={width:r,height:i};l.current.width=r,l.current.height=i,u.current?u.current(e):s()&&o(e)}});return e.observe(r.current,{box:n}),()=>{e.disconnect()}},[n,r,s]),{width:i,height:a}}({ref:w}),k=(0,ep.useMemo)(()=>{if(!A||!S||!b)return null;let e=A,t=S;return C?e=(t=S)*b:A/S>b?e=S*b:t=A/b,{width:e,height:t}},[A,S,b,C]);(0,ep.useLayoutEffect)(()=>{k&&n?.(k.width,k.height)},[k,n]),(0,ep.useEffect)(()=>{if(!k||y.current)return;y.current=!0;let e=window.setTimeout(()=>{window.dispatchEvent(new Event("resize"))},250);return()=>{window.clearTimeout(e)}},[k]),(0,ep.useLayoutEffect)(()=>{f(!1),p(!1)},[s,a.id,g,v,f,p]);let E=null===k||m,z=l?.native?.glbUrl===void 0,M="poster"===s?E||z:E||u||!c||!d;return(0,ep.useEffect)(()=>{h(M)},[M,h]),(0,eg.jsx)("div",{ref:x,className:r7("size-full flex items-center justify-center sm:pt-21 sm:pb-12",e),...i,children:k&&(0,eg.jsx)(SW,{className:"bg-transparent",frameloop:"demand",camera:{fov:a.config.camera.fov},gl:{toneMapping:F.ACESFilmicToneMapping,toneMappingExposure:1.2,alpha:!0,preserveDrawingBuffer:!0},style:{width:`${k.width}px`,height:`${k.height}px`},children:(0,eg.jsxs)(ep.Suspense,{fallback:null,children:[(0,eg.jsx)(kV,{ref:r}),(0,eg.jsx)(SV,{files:"poster"===s?["https://vizbl.com/hdr/neutral.hdr"]:void 0,preset:"carpet"===s?"warehouse":void 0}),(0,eg.jsx)(Eg,{})]})})})}function Eb({className:e,...t}){let{containerRef:r,isDragging:n,rotation:i,setRotation:a,type:o}=k_(),{t:s}=oi(),l=(0,ep.useRef)(null),u=(0,ep.useRef)(null),[c,d]=(0,ep.useState)(!1),f=ht("(max-width: 639px)"),p=(0,ep.useMemo)(()=>"undefined"!=typeof navigator&&"function"==typeof navigator.share,[]),h=(0,ep.useCallback)(()=>{f&&l.current?.centerView()},[f]),m=(0,ep.useCallback)(async()=>{if(!p)return;let e=window.location.href,t=s("poster"===o?"shareMessage.poster":"shareMessage.carpet"),r=`${t}
193
+ ${e}`;d(!0);try{let t=u.current;if(t)try{let e=await t.capture(),n=new File([e],"room-scene.png",{type:e.type||"image/png"});if(navigator.canShare?.({files:[n]}))return void await navigator.share({text:r,files:[n]})}catch(e){console.error("Failed to generate scene screenshot for sharing",e)}await navigator.share({text:r,url:e})}catch(e){e instanceof DOMException&&"AbortError"===e.name||console.error("Failed to share scene",e)}finally{d(!1)}},[p,s,o]);return(0,eg.jsxs)("div",{className:r7("relative flex items-center justify-center overflow-hidden",e),...t,children:[(0,eg.jsx)(mi,{ref:l,disabled:n,children:(0,eg.jsx)(ma,{wrapperClass:"size-full!",contentClass:"h-full! min-w-full sm:max-w-full",children:(0,eg.jsx)(Ev,{captureRef:u,onSizeChange:h})})}),(0,eg.jsx)(kq,{className:"absolute bottom-4 left-4 sm:bottom-6 sm:left-6"}),(0,eg.jsxs)("div",{className:"bg-button-dark typo-button-normal absolute bottom-4 left-1/2 hidden h-9 -translate-x-1/2 items-center gap-1.5 rounded-lg px-3.75 text-text-white md:inline-flex md:bottom-6",children:[(0,eg.jsx)("span",{className:"shrink-0",children:s("scene.position")}),(0,eg.jsx)(p7,{value:[i],onValueChange:([e])=>a(e??0),min:-180,max:180,step:1,className:"w-29.5 **:data-[slot=slider-range]:bg-transparent **:data-[slot=slider-thumb]:border-background-base-3 **:data-[slot=slider-thumb]]:bg-background-base-3 **:data-[slot=slider-track]:bg-icons-normal","aria-label":s("scene.position")})]}),(0,eg.jsxs)("div",{className:"absolute right-4 bottom-4 inline-flex items-center gap-2 sm:right-6 sm:bottom-6",children:["poster"===o&&(0,eg.jsxs)(nn,{variant:"contrast",size:f?"icon":"default",disabled:!p||c,onClick:m,children:[(0,eg.jsx)(ou,{className:"size-5"}),(0,eg.jsx)("span",{className:"sr-only sm:not-sr-only",children:s("scene.share")})]}),f&&"poster"===o&&(0,eg.jsxs)(p_,{children:[(0,eg.jsx)(pI,{asChild:!0,children:(0,eg.jsx)(nn,{variant:"contrast",size:"icon",children:(0,eg.jsx)(ol,{})})}),(0,eg.jsxs)(pO,{className:"grid gap-5",portalContainer:r,children:[(0,eg.jsx)(kI,{}),(0,eg.jsx)(kD,{})]})]})]})]})}function Ew(){let{setContainerRef:e,isSceneLoading:t}=k_();return(0,eg.jsxs)("div",{ref:e,className:"relative size-full bg-radial from-background-containers to-background-base-2 text-foreground overflow-hidden",children:[(0,eg.jsx)(kU,{className:"absolute top-0 right-0 left-0 z-15"}),(0,eg.jsxs)("div",{className:"size-full max-w-full grid grid-rows-[1fr_auto]",children:[(0,eg.jsx)(Eb,{className:"size-full min-h-0"}),(0,eg.jsx)(kj,{className:"bg-background"})]}),(0,eg.jsx)("div",{"aria-hidden":!t,className:r7("absolute inset-0 z-10 flex items-center justify-center bg-radial from-background-containers to-background-base-2 transition-opacity",t?"opacity-100 pointer-events-auto duration-0":"opacity-0 pointer-events-none duration-250ms"),children:(0,eg.jsx)(od,{variant:"logo"})})]})}aQ.use(ku).use({type:"3rdParty",init(t){((e={})=>{a9={...a9,...e}})(t.options.react),e=t}}).init({debug:!1,detection:{caches:[]},fallbackLng:"en",resources:{en:{translation:{matting:"Matting",material:"Material",chooseMaterial:"Choose material",frameWidth:"Frame width",close:"Close",uploadOwnPhoto:"Upload your photo",previousSlide:"Previous slide",nextSlide:"Next slide",mattingOptions:{none:"None"},units:{cm:"cm"},poweredBy:"Powered by Vizbl",ar:{viewInPlace:"View in place",scanQrCode:"Scan this QR code with your phone's camera to view the object in Augmented Reality"},shareMessage:{poster:"Preview poster",carpet:"Preview carpet"},scene:{tunePosition:"Tune position",position:"Position",share:"Share",angle:"Angle",rotation:"Rotation",reset:"Reset"}}},ru:{translation:{matting:"Паспарту",material:"Материал",chooseMaterial:"Выберите материал",frameWidth:"Ширина рамки",close:"Закрыть",uploadOwnPhoto:"Загрузить свое фото",previousSlide:"Предыдущий слайд",nextSlide:"Следующий слайд",mattingOptions:{none:"Без паспарту"},units:{cm:"см"},poweredBy:"Технологии Аризо",ar:{viewInPlace:"Просмотреть на месте",scanQrCode:"Отсканируйте этот QR-код камерой телефона, чтобы просмотреть объект в дополненной реальности"},shareMessage:{poster:"Примерить постер",carpet:"Примерить ковер"},scene:{tunePosition:"Настроить положение",position:"Положение",share:"Поделиться",angle:"Угол",rotation:"Поворот",reset:"Сбросить"}}}},interpolation:{escapeValue:!1}});let Ey=new t2;function Ex({resource:e,type:t,width:r,height:n,name:i,language:a,...o}){let[s,l]=(0,ep.useState)(null),{t:u,i18n:c}=oi();return(0,ep.useEffect)(()=>{"string"==typeof a&&c.changeLanguage(a)},[c,a]),(0,eg.jsxs)(eg.Fragment,{children:[s&&(0,eg.jsx)(aa,{root:s,children:(0,eg.jsx)(i9,{...o,children:(0,eg.jsxs)(ae,{className:"min-w-full h-svh p-0 rounded-none sm:p-0",portalContainer:s,showCloseButton:!1,onInteractOutside:e=>{e.preventDefault()},children:[(0,eg.jsxs)(at,{className:"sr-only",children:[(0,eg.jsx)(ar,{children:i}),(0,eg.jsx)(an,{})]}),(0,eg.jsx)(i8,{asChild:!0,children:(0,eg.jsxs)(nn,{className:"absolute top-3 right-6 z-20",variant:"secondary",children:[u("close"),(0,eg.jsx)(i4,{})]})}),(0,eg.jsx)(tF,{client:Ey,children:(0,eg.jsx)(kR,{resource:e,type:t,name:i,width:"poster"===t?r??0:0,height:"poster"===t?n??0:0,children:(0,eg.jsx)(Ew,{})})})]})})}),(0,nf.createPortal)((0,eg.jsx)("div",{className:"vizbl-room-viewer",children:(0,eg.jsx)("div",{ref:l})}),document.body)]})}function EC({trigger:e,...t}){let[r,n]=(0,ep.useState)(!1),i=(0,ep.useCallback)(()=>{n(!0)},[]),a=(0,ep.useCallback)(e=>{n(e)},[]);return(0,ep.useEffect)(()=>(e.addEventListener("click",i),()=>{e.removeEventListener("click",i)}),[e,i]),(0,eg.jsx)(Ex,{open:r,onOpenChange:a,...t})}let EA=0;var ES=ed("../../node_modules/.pnpm/@rsbuild+core@1.6.14/node_modules/@rsbuild/core/compiled/css-loader/index.js??ruleSet[1].rules[1].use[1]!builtin:lightningcss-loader??ruleSet[1].rules[1].use[2]!../../node_modules/.pnpm/@rsbuild+core@1.6.14/node_modules/@rsbuild/core/compiled/postcss-loader/index.js??ruleSet[1].rules[1].use[3]!../react-room-viewer/dist/index.css"),Ek={};Ek.styleTagTransform=fX(),Ek.setAttributes=fK(),Ek.insert=f$().bind(null,"head"),Ek.domAPI=fG(),Ek.insertStyleElement=fQ(),fH()(ES.A,Ek),ES.A&&ES.A.locals&&ES.A.locals;let EE=document.createElement("div");EE.id="vizbl-room-viewer-dialog-manager",document.body.appendChild(EE),em.createRoot(EE).render((0,ep.createElement)(function(){let[e,t]=(0,ep.useState)([]);return(0,ep.useEffect)(()=>{let e=function(){var e;return(!eZ&&(eZ=new eK(window.document)),e=eZ).observe.apply(e,arguments)}("[data-vizbl-room-viewer-dialog]",{initialize(e){let r=e.getAttribute("data-vizbl-room-viewer-resource"),n=e.getAttribute("data-vizbl-room-viewer-type"),i=e.getAttribute("data-vizbl-room-viewer-name"),a=e.getAttribute("data-vizbl-room-viewer-language"),o=e.getAttribute("data-vizbl-room-viewer-width"),s=e.getAttribute("data-vizbl-room-viewer-height"),l=o?Number(o):void 0,u=s?Number(s):void 0,c=EA++;return{add(){t(t=>[...t,{id:c,trigger:e,resource:r,type:n,name:i,language:a,width:l,height:u}])},remove(){t(e=>e.filter(e=>e.id!==c))}}}});return()=>{e.abort()}},[]),(0,eg.jsx)(eg.Fragment,{children:e.map(e=>(0,eg.jsx)(EC,{trigger:e.trigger,resource:e.resource,type:e.type,name:e.name,language:e.language,width:e.width,height:e.height},e.id))})}));
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vizbl/room-viewer",
3
3
  "type": "module",
4
- "version": "0.0.18",
4
+ "version": "0.0.19",
5
5
  "exports": {
6
6
  ".": "./dist/index.js"
7
7
  },
@@ -14,7 +14,7 @@
14
14
  "peerDependencies": {
15
15
  "react": "^19.2.0",
16
16
  "react-dom": "^19.2.0",
17
- "@vizbl/react-room-viewer": "0.0.10"
17
+ "@vizbl/react-room-viewer": "0.0.11"
18
18
  },
19
19
  "dependencies": {
20
20
  "selector-observer": "^2.1.6"
@@ -35,7 +35,7 @@
35
35
  "three": "^0.181.1",
36
36
  "typescript": "^5.9.3",
37
37
  "@vizbl/eslint-config": "0.0.0",
38
- "@vizbl/react-room-viewer": "0.0.10",
38
+ "@vizbl/react-room-viewer": "0.0.11",
39
39
  "@vizbl/typescript-config": "0.0.0"
40
40
  },
41
41
  "scripts": {