@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.97 kB
JavaScript
import{aB as e,aC as t,o as n,B as i,F as r}from"./index-B8IgtevW.esm.min.js";function a(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 c(e,t){if(t.detail)return t.detail;const r=e._device.createTexture({label:"pick-detail",size:[1,1],format:"rgba32uint",usage:n.RENDER_ATTACHMENT|n.COPY_SRC});return t.detail={texture:r,view:r.createView(),staging:e._device.createBuffer({label:"pick-detail-staging",size:256,usage:i.COPY_DST|i.MAP_READ})}}function u(e,t){e.copyTextureToBuffer({texture:t.texture},{buffer:t.staging,bytesPerRow:256},{width:1,height:1})}async function o(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 s(e){e._detailedPicking=e._scene.surface.engine._device.features.has("primitive-index")}function l(e){return new r(e)}function f(n,i,a){const c=i.thinInstances;if(a<0||!c)return n;const u=16*a,o=c.matrices.subarray(u,u+16),s=new r(16);return s[0]=o[0],s[1]=o[1],s[2]=o[2],s[3]=0,s[4]=o[4],s[5]=o[5],s[6]=o[6],s[7]=0,s[8]=o[8],s[9]=o[9],s[10]=o[10],s[11]=0,s[12]=o[12],s[13]=o[13],s[14]=o[14],s[15]=1,function(n,i){const r=e();return t(r,0,n,0,i,0),r}(n,s)}let d=null;function g(e,t){return a(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 b(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 p(e){return Math.abs(e)<1e-12?0:e}function h(e,t,n,i,c,u,o,s,l){e.faceId=n;const f=t._cpuIndices;if(!c||!f||n<0||3*n+2>=f.length)return;const h=f[3*n],m=f[3*n+1],v=f[3*n+2];if(3*h+2>=c.length||3*m+2>=c.length||3*v+2>=c.length)return;const _=3*h,w=3*m,x=3*v,y=c[_],A=c[_+1],M=c[_+2],N=c[w]-y,P=c[w+1]-A,k=c[w+2]-M,R=c[x]-y,T=c[x+1]-A,E=c[x+2]-M,I=i[0]-y,C=i[1]-A,B=i[2]-M,D=N*N+P*P+k*k,F=N*R+P*T+k*E,O=R*R+T*T+E*E,S=I*N+C*P+B*k,z=I*R+C*T+B*E,U=D*O-F*F;if(Math.abs(U)<=Number.EPSILON)return;const W=(O*S-F*z)/U,Y=(D*z-F*S)/U;if(e.bu=p(1-W-Y),e.bv=p(W),!s)return void(e._normalsInvalid=!0);if(u&&3*h+2<u.length&&3*m+2<u.length&&3*v+2<u.length){const t=1-e.bu-e.bv;let n=a(e.bu*u[3*h]+e.bv*u[3*m]+t*u[3*v],e.bu*u[3*h+1]+e.bv*u[3*m+1]+t*u[3*v+1],e.bu*u[3*h+2]+e.bv*u[3*m+2]+t*u[3*v+2]),i=g(o,n);b(i,e)&&(n=[-n[0],-n[1],-n[2]],i=[-i[0],-i[1],-i[2]]),e.pickedNormal=n,e.pickedNormalWorld=i}let j=N,G=P,H=k,L=R,V=T,q=E;if(l){const e=d??=new r(9);l(t,h,m,v,e)&&(j=e[3]-e[0],G=e[4]-e[1],H=e[5]-e[2],L=e[6]-e[0],V=e[7]-e[1],q=e[8]-e[2])}let J=a(G*q-H*V,H*L-j*q,j*V-G*L),K=g(o,J);b(K,e)&&(J=[-J[0],-J[1],-J[2]],K=[-K[0],-K[1],-K[2]]),e.pickedFaceNormal=J,e.pickedFaceNormalWorld=K}export{u as copyDetailTarget,l as copyDetailedWorldMatrix,f as detailedWorldMatrix,s as enableDetailedPicking,c as ensureDetailTarget,h as populateDetailedMeshInfo,o as readDetailTarget};
//# sourceMappingURL=detailed-picking-BWY0nhrI.esm.min.js.map