zeroxr
Version:
ZeroXR is a lightweight React Renderer for WebGL run on WebXR devices
1 lines • 3.85 kB
JavaScript
;(self.webpackChunkzeroxr=self.webpackChunkzeroxr||[]).push([[208],{650:(e,t,A)=>{A.r(t),A.d(t,{onSelect:()=>l,requestAR:()=>T,requestXR:()=>X});var n=A(931),r=A(605),o=A(895);let a=null,L=null,s=new Set;if(window.XRHand){const e={};e.THUMB_METACARPAL,e.THUMB_PHALANX_PROXIMAL,e.THUMB_PHALANX_DISTAL,e.THUMB_PHALANX_TIP,e.INDEX_METACARPAL,e.INDEX_PHALANX_PROXIMAL,e.INDEX_PHALANX_INTERMEDIATE,e.INDEX_PHALANX_DISTAL,e.INDEX_PHALANX_TIP,e.MIDDLE_METACARPAL,e.MIDDLE_PHALANX_PROXIMAL,e.MIDDLE_PHALANX_INTERMEDIATE,e.MIDDLE_PHALANX_DISTAL,e.MIDDLE_PHALANX_TIP,e.RING_METACARPAL,e.RING_PHALANX_PROXIMAL,e.RING_PHALANX_INTERMEDIATE,e.RING_PHALANX_DISTAL,e.RING_PHALANX_TIP,e.LITTLE_METACARPAL,e.LITTLE_PHALANX_PROXIMAL,e.LITTLE_PHALANX_INTERMEDIATE,e.LITTLE_PHALANX_DISTAL,e.LITTLE_PHALANX_TIP}if(window.XRHand){const e={};e.THUMB_METACARPAL,e.THUMB_PHALANX_PROXIMAL,e.THUMB_PHALANX_DISTAL,e.THUMB_PHALANX_TIP,e.INDEX_METACARPAL,e.INDEX_PHALANX_PROXIMAL,e.INDEX_PHALANX_INTERMEDIATE,e.INDEX_PHALANX_DISTAL,e.INDEX_PHALANX_TIP,e.MIDDLE_METACARPAL,e.MIDDLE_PHALANX_PROXIMAL,e.MIDDLE_PHALANX_INTERMEDIATE,e.MIDDLE_PHALANX_DISTAL,e.MIDDLE_PHALANX_TIP,e.RING_METACARPAL,e.RING_PHALANX_PROXIMAL,e.RING_PHALANX_INTERMEDIATE,e.RING_PHALANX_DISTAL,e.RING_PHALANX_TIP,e.LITTLE_METACARPAL,e.LITTLE_PHALANX_PROXIMAL,e.LITTLE_PHALANX_INTERMEDIATE,e.LITTLE_PHALANX_DISTAL,e.LITTLE_PHALANX_TIP}let i=!0,I=null,_=null,c=null,E=null;const P=[];async function T(){i=!1;try{I=await navigator.xr.requestSession("immersive-ar",{requiredFeatures:[],optionalFeatures:[]}),N()}catch(e){console.error(e)}}async function X(){try{I=await navigator.xr.requestSession("immersive-ar",{requiredFeatures:["anchors","local","hit-test","light-estimation","camera-access","plane-detection"],optionalFeatures:[],depthSensing:{usagePreference:["cpu-optimized","gpu-optimized"],dataFormatPreference:["luminance-alpha","float32"]}}),N()}catch(e){console.error(e)}}function N(){I.addEventListener("select",R),I.updateRenderState({baseLayer:new XRWebGLLayer(I,n.gl)}),I.requestReferenceSpace("local").then((e=>{_=e,i&&(async function(e){L=await e.requestLightProbe()}(I),E=new XRWebGLBinding(I,n.gl)),I.requestAnimationFrame(u)})),I.requestReferenceSpace("viewer").then((e=>{c=e,i&&((0,o.lU)(I,c),(0,o.oX)(I))}))}function u(e,t){I.requestAnimationFrame(u);const A=t.getViewerPose(_);if(!A)return;i&&(function(e,t,A,r){let o=null;if(0==t.session.inputSources.length)o=r;else{const e=t.session.inputSources[0];e.targetRayMode,o=t.getPose(e.targetRaySpace,A)}const L=n.Ah.hitTestXR(o.transform);L&&a?L.node!=a.node&&(L.node.dispatchEvent("onEnter",{}),a.node.dispatchEvent("onExit",{})):L?L.node.dispatchEvent("onEnter",{}):a&&a.node.dispatchEvent("onExit",{}),a=L}(0,t,_,A),function(e,t){for(let e of t.session.inputSources){const t=e.hand;t&&console.log(t)}}(0,t),function(e,t){const A=t.detectedPlanes;s.forEach((e=>{A.has(e)})),A.forEach((e=>{})),s=A}(0,t),function(e,t,A){for(const e of t.trackedAnchors)e.node&&!e.isDelete&&(e.node.matrix=t.getPose(e.anchorSpace,A).transform.matrix)}(0,t,_),function(e,t,A){t.getPose(L.probeSpace,A),t.getLightEstimate(L)}(0,t,_));const c=I.renderState.baseLayer;n.Ah._onXRFrame(e,t);for(const a of A.views){const A=c.getViewport(a);if(n.gl.viewport(A.x,A.y,A.width,A.height),i){(0,o.wX)(e,t,a);const A=E.getCameraImage(a.camera);(0,r.Fq)(A,a)}else(0,r.H4)(e,t,a,A);n.gl.bindFramebuffer(n.gl.FRAMEBUFFER,c.framebuffer),n.Ah.render(e,a.projectionMatrix,a.transform.inverse.matrix)}}function R(e){e.data=function(e){let t=null;if("screen"===e.inputSource.targetRayMode){let A=e.frame.getPose(e.inputSource.targetRaySpace,c),r=e.frame.getPose(e.inputSource.targetRaySpace,_);t=n.Ah.hitTest(A.transform,r.transform),t&&t.node.dispatchEvent("onSelect",e)}return{selectObject:t,hitTestResult:o.wF}}(e);for(let t of P)t(e)}function l(e){P.push(e)}}}]);