@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) • 10.8 kB
JavaScript
import{aY as t,V as e,aZ as i,a_ as n,aS as r,M as o,H as s,a$ as a,b0 as c,F as h,a2 as l}from"./index-Bw2N6w1y.esm.min.js";class u{constructor(t,e,n=Number.MAX_VALUE,r=i){this.origin=t,this.direction=e,this.length=n,this.epsilon=r}clone(){return new u(this.origin.clone(),this.direction.clone(),this.length)}intersectsBoxMinMax(t,e,i=0){const n=u._TmpVector3[0].copyFromFloats(t.x-i,t.y-i,t.z-i),r=u._TmpVector3[1].copyFromFloats(e.x+i,e.y+i,e.z+i);let o,s,a,c,h=0,l=Number.MAX_VALUE;if(Math.abs(this.direction.x)<1e-7){if(this.origin.x<n.x||this.origin.x>r.x)return!1}else if(o=1/this.direction.x,s=(n.x-this.origin.x)*o,a=(r.x-this.origin.x)*o,a===-1/0&&(a=1/0),s>a&&(c=s,s=a,a=c),h=Math.max(s,h),l=Math.min(a,l),h>l)return!1;if(Math.abs(this.direction.y)<1e-7){if(this.origin.y<n.y||this.origin.y>r.y)return!1}else if(o=1/this.direction.y,s=(n.y-this.origin.y)*o,a=(r.y-this.origin.y)*o,a===-1/0&&(a=1/0),s>a&&(c=s,s=a,a=c),h=Math.max(s,h),l=Math.min(a,l),h>l)return!1;if(Math.abs(this.direction.z)<1e-7){if(this.origin.z<n.z||this.origin.z>r.z)return!1}else if(o=1/this.direction.z,s=(n.z-this.origin.z)*o,a=(r.z-this.origin.z)*o,a===-1/0&&(a=1/0),s>a&&(c=s,s=a,a=c),h=Math.max(s,h),l=Math.min(a,l),h>l)return!1;return!0}intersectsBox(t,e=0){return this.intersectsBoxMinMax(t.minimum,t.maximum,e)}intersectsSphere(t,e=0){const i=t.center.x-this.origin.x,n=t.center.y-this.origin.y,r=t.center.z-this.origin.z,o=i*i+n*n+r*r,s=t.radius+e,a=s*s;if(o<=a)return!0;const c=i*this.direction.x+n*this.direction.y+r*this.direction.z;if(c<0)return!1;return o-c*c<=a}intersectsTriangle(t,i,r){const o=u._TmpVector3[0],s=u._TmpVector3[1],a=u._TmpVector3[2],c=u._TmpVector3[3],h=u._TmpVector3[4];i.subtractToRef(t,o),r.subtractToRef(t,s),e.CrossToRef(this.direction,s,a);const l=e.Dot(o,a);if(0===l)return null;const f=1/l;this.origin.subtractToRef(t,c);const m=e.Dot(c,a)*f;if(m<-this.epsilon||m>1+this.epsilon)return null;e.CrossToRef(c,o,h);const y=e.Dot(this.direction,h)*f;if(y<-this.epsilon||m+y>1+this.epsilon)return null;const d=e.Dot(s,h)*f;return d>this.length?null:new n(1-m-y,m,d)}intersectsPlane(t){let i;const n=e.Dot(t.normal,this.direction);if(Math.abs(n)<9.99999997475243e-7)return null;{const r=e.Dot(t.normal,this.origin);return i=(-t.d-r)/n,i<0?i<-9.99999997475243e-7?null:0:i}}intersectsAxis(t,i=0){switch(t){case"y":{const t=(this.origin.y-i)/this.direction.y;return t>0?null:new e(this.origin.x+this.direction.x*-t,i,this.origin.z+this.direction.z*-t)}case"x":{const t=(this.origin.x-i)/this.direction.x;return t>0?null:new e(i,this.origin.y+this.direction.y*-t,this.origin.z+this.direction.z*-t)}case"z":{const t=(this.origin.z-i)/this.direction.z;return t>0?null:new e(this.origin.x+this.direction.x*-t,this.origin.y+this.direction.y*-t,i)}default:return null}}intersectsMesh(t,e,i,n=!1,o,s=!1){const a=r.Matrix[0];return t.getWorldMatrix().invertToRef(a),this._tmpRay?u.TransformToRef(this,a,this._tmpRay):this._tmpRay=u.Transform(this,a),t.intersects(this._tmpRay,e,i,n,o,s)}intersectsMeshes(t,e,i){i?i.length=0:i=[];for(let n=0;n<t.length;n++){const r=this.intersectsMesh(t[n],e);r.hit&&i.push(r)}return i.sort(this._comparePickingInfo),i}_comparePickingInfo(t,e){return t.distance<e.distance?-1:t.distance>e.distance?1:0}intersectionSegment(t,i,n){const o=this.origin,s=r.Vector3[0],a=r.Vector3[1],c=r.Vector3[2],h=r.Vector3[3];i.subtractToRef(t,s),this.direction.scaleToRef(u._Rayl,c),o.addToRef(c,a),t.subtractToRef(o,h);const l=e.Dot(s,s),f=e.Dot(s,c),m=e.Dot(c,c),y=e.Dot(s,h),d=e.Dot(c,h),g=l*m-f*f;let R,p,T=g,x=g;g<u._Smallnum?(R=0,T=1,p=d,x=m):(R=f*d-m*y,p=l*d-f*y,R<0?(R=0,p=d,x=m):R>T&&(R=T,p=d+f,x=m)),p<0?(p=0,-y<0?R=0:-y>l?R=T:(R=-y,T=l)):p>x&&(p=x,-y+f<0?R=0:-y+f>l?R=T:(R=-y+f,T=l));const _=Math.abs(R)<u._Smallnum?0:R/T,M=Math.abs(p)<u._Smallnum?0:p/x,I=r.Vector3[4];c.scaleToRef(M,I);const k=r.Vector3[5];s.scaleToRef(_,k),k.addInPlace(h);const v=r.Vector3[6];k.subtractToRef(I,v);return M>0&&M<=this.length&&v.lengthSquared()<n*n?k.length():-1}update(t,e,i,n,s,a,c,h=!1){if(h){u._RayDistant||(u._RayDistant=u.Zero()),u._RayDistant.unprojectRayToRef(t,e,i,n,o.IdentityReadOnly,a,c);const h=r.Matrix[0];s.invertToRef(h),u.TransformToRef(u._RayDistant,h,this)}else this.unprojectRayToRef(t,e,i,n,s,a,c);return this}static Zero(){return new u(e.Zero(),e.Zero())}static CreateNew(t,e,i,n,r,o,s){return u.Zero().update(t,e,i,n,r,o,s)}static CreateNewFromTo(t,i,n=o.IdentityReadOnly){const r=new u(new e(0,0,0),new e(0,0,0));return u.CreateFromToToRef(t,i,r,n)}static CreateFromToToRef(t,e,i,n=o.IdentityReadOnly){i.origin.copyFrom(t);const r=e.subtractToRef(t,i.direction),s=Math.sqrt(r.x*r.x+r.y*r.y+r.z*r.z);return i.length=s,i.direction.normalize(),u.TransformToRef(i,n,i)}static Transform(t,i){const n=new u(new e(0,0,0),new e(0,0,0));return u.TransformToRef(t,i,n),n}static TransformToRef(t,i,n){e.TransformCoordinatesToRef(t.origin,i,n.origin),e.TransformNormalToRef(t.direction,i,n.direction),n.length=t.length,n.epsilon=t.epsilon;const r=n.direction,o=r.length();if(0!==o&&1!==o){const t=1/o;r.x*=t,r.y*=t,r.z*=t,n.length*=o}return n}unprojectRayToRef(t,i,n,o,a,c,h){const l=r.Matrix[0];a.multiplyToRef(c,l),l.multiplyToRef(h,l),l.invert();const u=s.LastCreatedEngine,f=r.Vector3[0];f.x=t/n*2-1,f.y=-(i/o*2-1),f.z=u?.useReverseDepthBuffer?1:u?.isNDCHalfZRange?0:-1;const m=r.Vector3[1].copyFromFloats(f.x,f.y,1-1e-8),y=r.Vector3[2],d=r.Vector3[3];e._UnprojectFromInvertedMatrixToRef(f,l,y),e._UnprojectFromInvertedMatrixToRef(m,l,d),this.origin.copyFrom(y),d.subtractToRef(y,this.direction),this.direction.normalize()}}function f(t,e,i,n,r,o=!1){const s=u.Zero();return m(t,e,i,n,s,r,o),s}function m(t,e,i,n,r,s,a=!1,c=!1){const h=t.getEngine();if(!s&&!(s=t.activeCamera))return t;const l=s.viewport,u=h.getRenderHeight(),{x:f,y:m,width:y,height:d}=l.toGlobal(h.getRenderWidth(),u),g=1/h.getHardwareScalingLevel();return e=e*g-f,i=i*g-(u-m-d),r.update(e,i,y,d,n||o.IdentityReadOnly,a?o.IdentityReadOnly:s.getViewMatrix(),s.getProjectionMatrix(),c),t}function y(t,e,i,n){const r=u.Zero();return d(t,e,i,r,n),r}function d(t,e,i,n,r){if(!c)return t;const s=t.getEngine();if(!r&&!(r=t.activeCamera))throw new Error("Active camera not set");const a=r.viewport,h=s.getRenderHeight(),{x:l,y:u,width:f,height:m}=a.toGlobal(s.getRenderWidth(),h),y=o.Identity(),d=1/s.getHardwareScalingLevel();return e=e*d-l,i=i*d-(h-u-m),n.update(e,i,f,m,y,y,r.getProjectionMatrix()),t}function g(t,e,i,n,r,o,s,a){const c=e(n,i.enableDistantPicking),h=i.intersects(c,r,s,o,n,a);return h&&h.hit?!r&&null!=t&&h.distance>=t.distance?null:h:null}function R(t,e,i,n,o,s){let a=null;const h=!!(t.activeCameras&&t.activeCameras.length>1&&t.cameraToUseForPointers!==t.activeCamera),l=t.cameraToUseForPointers||t.activeCamera,u=g;for(let c=0;c<t.meshes.length;c++){const f=t.meshes[c];if(i){if(!i(f,-1))continue}else if(!f.isEnabled()||!f.isVisible||!f.isPickable)continue;const m=h&&f.isWorldMatrixCameraDependent(),y=f.computeWorldMatrix(m,l);if(f.hasThinInstances&&f.thinInstanceEnablePicking){const t=u(a,e,f,y,!0,!0,s);if(t){if(o)return t;const c=r.Matrix[1],h=f.thinInstanceGetWorldMatrices();for(let t=0;t<h.length;t++){if(i&&!i(f,t))continue;h[t].multiplyToRef(y,c);const r=u(a,e,f,c,n,o,s,!0);if(r&&(a=r,a.thinInstanceIndex=t,n))return a}}}else{const t=u(a,e,f,y,n,o,s);if(t&&(a=t,n))return a}}return a||new c}function p(t,e,i,n){if(!c)return null;const o=[],s=!!(t.activeCameras&&t.activeCameras.length>1&&t.cameraToUseForPointers!==t.activeCamera),a=t.cameraToUseForPointers||t.activeCamera,h=g;for(let c=0;c<t.meshes.length;c++){const l=t.meshes[c];if(i){if(!i(l,-1))continue}else if(!l.isEnabled()||!l.isVisible||!l.isPickable)continue;const u=s&&l.isWorldMatrixCameraDependent(),f=l.computeWorldMatrix(u,a);if(l.hasThinInstances&&l.thinInstanceEnablePicking){if(h(null,e,l,f,!0,!0,n)){const t=r.Matrix[1],s=l.thinInstanceGetWorldMatrices();for(let r=0;r<s.length;r++){if(i&&!i(l,r))continue;s[r].multiplyToRef(f,t);const a=h(null,e,l,t,!1,!1,n,!0);a&&(a.thinInstanceIndex=r,o.push(a))}}}else{const t=h(null,e,l,f,!1,!1,n);t&&o.push(t)}}return o}function T(t,e,i,n,r,s){if(!c)return null;const a=R(t,(n=>(t._tempPickingRay||(t._tempPickingRay=u.Zero()),m(t,e,i,n,t._tempPickingRay,s||null),t._tempPickingRay)),n,r,!0);return a&&(a.ray=f(t,e,i,o.Identity(),s||null)),a}function x(t,e,i,n,r,s,a,c=!1){const h=R(t,((n,r)=>(t._tempPickingRay||(t._tempPickingRay=u.Zero()),m(t,e,i,n,t._tempPickingRay,s||null,!1,r),t._tempPickingRay)),n,r,!1,a);return h&&(h.ray=f(t,e,i,o.Identity(),s||null)),h}function _(t,e,i,n,r){const s=R(t,(i=>(t._pickWithRayInverseMatrix||(t._pickWithRayInverseMatrix=o.Identity()),i.invertToRef(t._pickWithRayInverseMatrix),t._cachedRayForTransform||(t._cachedRayForTransform=u.Zero()),u.TransformToRef(e,t._pickWithRayInverseMatrix,t._cachedRayForTransform),t._cachedRayForTransform)),i,n,!1,r);return s&&(s.ray=e),s}function M(t,e,i,n,r,o){return p(t,(n=>f(t,e,i,n,r||null)),n,o)}function I(t,e,i,n){return p(t,(i=>(t._pickWithRayInverseMatrix||(t._pickWithRayInverseMatrix=o.Identity()),i.invertToRef(t._pickWithRayInverseMatrix),t._cachedRayForTransform||(t._cachedRayForTransform=u.Zero()),u.TransformToRef(e,t._pickWithRayInverseMatrix,t._cachedRayForTransform),t._cachedRayForTransform)),i,n)}function k(t,i,n=100,o,s){o||(o=t.getWorldMatrix()),i.length=n,s?i.origin.copyFrom(s):i.origin.copyFrom(t.position);const a=r.Vector3[2];a.set(0,0,t._scene.useRightHandedSystem?-1:1);const c=r.Vector3[3];return e.TransformNormalToRef(a,o,c),e.NormalizeToRef(c,i.direction),i}function v(t,i){i&&(i.prototype.getForwardRay=function(t=100,i,n){return k(this,new u(e.Zero(),e.Zero(),t),t,i,n)},i.prototype.getForwardRayToRef=function(t,e=100,i,n){return k(this,t,e,i,n)}),t&&(a._IsPickingAvailable=!0,t.prototype.createPickingRay=function(t,e,i,n,r=!1){return f(this,t,e,i,n,r)})}u._TmpVector3=t(6,e.Zero),u._RayDistant=u.Zero(),u._Smallnum=1e-8,u._Rayl=1e9,v(h,l),h.prototype.createPickingRayToRef=function(t,e,i,n,r,o=!1,s=!1){return m(this,t,e,i,n,r,o,s)},h.prototype.createPickingRayInCameraSpace=function(t,e,i){return y(this,t,e,i)},h.prototype.createPickingRayInCameraSpaceToRef=function(t,e,i,n){return d(this,t,e,i,n)},h.prototype.pickWithBoundingInfo=function(t,e,i,n,r){return T(this,t,e,i,n,r)},h.prototype.pick=function(t,e,i,n,r,o,s=!1){return x(this,t,e,i,n,r,o,s)},h.prototype.pickWithRay=function(t,e,i,n){return _(this,t,e,i,n)},h.prototype.multiPick=function(t,e,i,n,r){return M(this,t,e,i,n,r)},h.prototype.multiPickWithRay=function(t,e,i){return I(this,t,e,i)};export{v as AddRayExtensions,f as CreatePickingRay,y as CreatePickingRayInCameraSpace,d as CreatePickingRayInCameraSpaceToRef,m as CreatePickingRayToRef,k as GetForwardRayToRef,M as MultiPick,I as MultiPickWithRay,x as Pick,T as PickWithBoundingInfo,_ as PickWithRay,u as Ray};
//# sourceMappingURL=ray-CjC2DcOu.esm.min.js.map