UNPKG

@babylonjs/viewer

Version:

The Babylon Viewer aims to simplify a specific but common Babylon.js use case: loading, viewing, and interacting with a 3D model.

3 lines (2 loc) 2.8 kB
import{i as e,B as t,F as n}from"./index-DFZFpUG-.esm.min.js";import{m as i}from"./mat4-multiply-5fY_prZ3.esm.min.js";function r(e,t,n,i=1e-10){const r=Math.hypot(e,t,n);return r<=i?[0,1,0]:[e/r,t/r,n/r]}function a(n,i){if(i.detail)return i.detail;const r=n._device.createTexture({label:"pick-detail",size:[1,1],format:"rgba32uint",usage:e.RENDER_ATTACHMENT|e.COPY_SRC});return i.detail={texture:r,view:r.createView(),staging:n._device.createBuffer({label:"pick-detail-staging",size:256,usage:t.COPY_DST|t.MAP_READ})}}function c(e,t){e.copyTextureToBuffer({texture:t.texture},{buffer:t.staging,bytesPerRow:256},{width:1,height:1})}async function u(e){await e.staging.mapAsync(GPUMapMode.READ);const t=e.staging.getMappedRange(),n=new Uint32Array(t),i=4294967295===n[0]?-1:n[0],r=new Float32Array(t),a=i<0?null:[r[1],r[2],r[3]];return e.staging.unmap(),{primitiveIndex:i,localPoint:a}}function o(e){e._detailedPicking=e._scene.surface.engine._device.features.has("primitive-index")}function s(e){return new n(e)}function l(e,t,r){const a=t.thinInstances;if(r<0||!a)return e;const c=16*r,u=a.matrices.subarray(c,c+16),o=new n(16);return o[0]=u[0],o[1]=u[1],o[2]=u[2],o[3]=0,o[4]=u[4],o[5]=u[5],o[6]=u[6],o[7]=0,o[8]=u[8],o[9]=u[9],o[10]=u[10],o[11]=0,o[12]=u[12],o[13]=u[13],o[14]=u[14],o[15]=1,i(e,o)}function f(e,t){return r(e[0]*t[0]+e[4]*t[1]+e[8]*t[2],e[1]*t[0]+e[5]*t[1]+e[9]*t[2],e[2]*t[0]+e[6]*t[1]+e[10]*t[2])}function d(e,t){const n=t.ray;return!!n&&e[0]*n.direction[0]+e[1]*n.direction[1]+e[2]*n.direction[2]>0}function g(e){return Math.abs(e)<1e-12?0:e}function m(e,t,n,i,a,c,u,o){e.faceId=n;const s=t._cpuIndices;if(!a||!s||n<0||3*n+2>=s.length)return;const l=s[3*n],m=s[3*n+1],p=s[3*n+2];if(3*l+2>=a.length||3*m+2>=a.length||3*p+2>=a.length)return;const b=a[3*l],h=a[3*l+1],v=a[3*l+2],_=a[3*m]-b,y=a[3*m+1]-h,w=a[3*m+2]-v,x=a[3*p]-b,A=a[3*p+1]-h,M=a[3*p+2]-v,N=i[0]-b,P=i[1]-h,k=i[2]-v,R=_*_+y*y+w*w,T=_*x+y*A+w*M,E=x*x+A*A+M*M,I=N*_+P*y+k*w,B=N*x+P*A+k*M,C=R*E-T*T;if(Math.abs(C)<=Number.EPSILON)return;const D=(E*I-T*B)/C,F=(R*B-T*I)/C;if(e.bu=g(1-D-F),e.bv=g(D),!o)return void(e._normalsInvalid=!0);if(c&&3*l+2<c.length&&3*m+2<c.length&&3*p+2<c.length){const t=1-e.bu-e.bv;let n=r(e.bu*c[3*l]+e.bv*c[3*m]+t*c[3*p],e.bu*c[3*l+1]+e.bv*c[3*m+1]+t*c[3*p+1],e.bu*c[3*l+2]+e.bv*c[3*m+2]+t*c[3*p+2]),i=f(u,n);d(i,e)&&(n=[-n[0],-n[1],-n[2]],i=[-i[0],-i[1],-i[2]]),e.pickedNormal=n,e.pickedNormalWorld=i}let O=r(y*M-w*A,w*x-_*M,_*A-y*x),S=f(u,O);d(S,e)&&(O=[-O[0],-O[1],-O[2]],S=[-S[0],-S[1],-S[2]]),e.pickedFaceNormal=O,e.pickedFaceNormalWorld=S}export{c as copyDetailTarget,s as copyDetailedWorldMatrix,l as detailedWorldMatrix,o as enableDetailedPicking,a as ensureDetailTarget,m as populateDetailedMeshInfo,u as readDetailTarget}; //# sourceMappingURL=detailed-picking-Dzs8bKIO.esm.min.js.map