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) 11 kB
import{B as t,V as e,E as n,I as i,T as r,M as o,a as s,_ as a,P as c}from"./index-BPURObVq.esm.min.js";class h{constructor(t,e,i=Number.MAX_VALUE,r=n){this.origin=t,this.direction=e,this.length=i,this.epsilon=r}clone(){return new h(this.origin.clone(),this.direction.clone(),this.length)}intersectsBoxMinMax(t,e,n=0){const i=h._TmpVector3[0].copyFromFloats(t.x-n,t.y-n,t.z-n),r=h._TmpVector3[1].copyFromFloats(e.x+n,e.y+n,e.z+n);let o,s,a,c,l=0,u=Number.MAX_VALUE;if(Math.abs(this.direction.x)<1e-7){if(this.origin.x<i.x||this.origin.x>r.x)return!1}else if(o=1/this.direction.x,s=(i.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),l=Math.max(s,l),u=Math.min(a,u),l>u)return!1;if(Math.abs(this.direction.y)<1e-7){if(this.origin.y<i.y||this.origin.y>r.y)return!1}else if(o=1/this.direction.y,s=(i.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),l=Math.max(s,l),u=Math.min(a,u),l>u)return!1;if(Math.abs(this.direction.z)<1e-7){if(this.origin.z<i.z||this.origin.z>r.z)return!1}else if(o=1/this.direction.z,s=(i.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),l=Math.max(s,l),u=Math.min(a,u),l>u)return!1;return!0}intersectsBox(t,e=0){return this.intersectsBoxMinMax(t.minimum,t.maximum,e)}intersectsSphere(t,e=0){const n=t.center.x-this.origin.x,i=t.center.y-this.origin.y,r=t.center.z-this.origin.z,o=n*n+i*i+r*r,s=t.radius+e,a=s*s;if(o<=a)return!0;const c=n*this.direction.x+i*this.direction.y+r*this.direction.z;if(c<0)return!1;return o-c*c<=a}intersectsTriangle(t,n,r){const o=h._TmpVector3[0],s=h._TmpVector3[1],a=h._TmpVector3[2],c=h._TmpVector3[3],l=h._TmpVector3[4];n.subtractToRef(t,o),r.subtractToRef(t,s),e.CrossToRef(this.direction,s,a);const u=e.Dot(o,a);if(0===u)return null;const f=1/u;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,l);const d=e.Dot(this.direction,l)*f;if(d<-this.epsilon||m+d>1+this.epsilon)return null;const g=e.Dot(s,l)*f;return g>this.length||g<0?null:new i(1-m-d,m,g)}intersectsPlane(t){let n;const i=e.Dot(t.normal,this.direction);if(Math.abs(i)<9.99999997475243e-7)return null;{const r=e.Dot(t.normal,this.origin);return n=(-t.d-r)/i,n<0?n<-9.99999997475243e-7?null:0:n}}intersectsAxis(t,n=0){switch(t){case"y":{const t=(this.origin.y-n)/this.direction.y;return t>0?null:new e(this.origin.x+this.direction.x*-t,n,this.origin.z+this.direction.z*-t)}case"x":{const t=(this.origin.x-n)/this.direction.x;return t>0?null:new e(n,this.origin.y+this.direction.y*-t,this.origin.z+this.direction.z*-t)}case"z":{const t=(this.origin.z-n)/this.direction.z;return t>0?null:new e(this.origin.x+this.direction.x*-t,this.origin.y+this.direction.y*-t,n)}default:return null}}intersectsMesh(t,e,n,i=!1,o,s=!1){const a=r.Matrix[0];return t.getWorldMatrix().invertToRef(a),this._tmpRay?h.TransformToRef(this,a,this._tmpRay):this._tmpRay=h.Transform(this,a),t.intersects(this._tmpRay,e,n,i,o,s)}intersectsMeshes(t,e,n){n?n.length=0:n=[];for(let i=0;i<t.length;i++){const r=this.intersectsMesh(t[i],e);r.hit&&n.push(r)}return n.sort(this._comparePickingInfo),n}_comparePickingInfo(t,e){return t.distance<e.distance?-1:t.distance>e.distance?1:0}intersectionSegment(t,n,i){const o=this.origin,s=r.Vector3[0],a=r.Vector3[1],c=r.Vector3[2],l=r.Vector3[3];n.subtractToRef(t,s),this.direction.scaleToRef(h._Rayl,c),o.addToRef(c,a),t.subtractToRef(o,l);const u=e.Dot(s,s),f=e.Dot(s,c),m=e.Dot(c,c),d=e.Dot(s,l),g=e.Dot(c,l),y=u*m-f*f;let R,T,p=y,x=y;y<h._Smallnum?(R=0,p=1,T=g,x=m):(R=f*g-m*d,T=u*g-f*d,R<0?(R=0,T=g,x=m):R>p&&(R=p,T=g+f,x=m)),T<0?(T=0,-d<0?R=0:-d>u?R=p:(R=-d,p=u)):T>x&&(T=x,-d+f<0?R=0:-d+f>u?R=p:(R=-d+f,p=u));const _=Math.abs(R)<h._Smallnum?0:R/p,M=Math.abs(T)<h._Smallnum?0:T/x,I=r.Vector3[4];c.scaleToRef(M,I);const w=r.Vector3[5];s.scaleToRef(_,w),w.addInPlace(l);const b=r.Vector3[6];w.subtractToRef(I,b);return M>0&&M<=this.length&&b.lengthSquared()<i*i?w.length():-1}update(t,e,n,i,s,a,c,l=!1){if(l){h._RayDistant||(h._RayDistant=h.Zero()),h._RayDistant.unprojectRayToRef(t,e,n,i,o.IdentityReadOnly,a,c);const l=r.Matrix[0];s.invertToRef(l),h.TransformToRef(h._RayDistant,l,this)}else this.unprojectRayToRef(t,e,n,i,s,a,c);return this}static Zero(){return new h(e.Zero(),e.Zero())}static CreateNew(t,e,n,i,r,o,s){return h.Zero().update(t,e,n,i,r,o,s)}static CreateNewFromTo(t,n,i=o.IdentityReadOnly){const r=new h(new e(0,0,0),new e(0,0,0));return h.CreateFromToToRef(t,n,r,i)}static CreateFromToToRef(t,e,n,i=o.IdentityReadOnly){n.origin.copyFrom(t);const r=e.subtractToRef(t,n.direction),s=Math.sqrt(r.x*r.x+r.y*r.y+r.z*r.z);return n.length=s,n.direction.normalize(),h.TransformToRef(n,i,n)}static Transform(t,n){const i=new h(new e(0,0,0),new e(0,0,0));return h.TransformToRef(t,n,i),i}static TransformToRef(t,n,i){e.TransformCoordinatesToRef(t.origin,n,i.origin),e.TransformNormalToRef(t.direction,n,i.direction),i.length=t.length,i.epsilon=t.epsilon;const r=i.direction,o=r.length();if(0!==o&&1!==o){const t=1/o;r.x*=t,r.y*=t,r.z*=t,i.length*=o}return i}unprojectRayToRef(t,n,i,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/i*2-1,f.y=-(n/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),d=r.Vector3[2],g=r.Vector3[3];e.TransformCoordinatesToRef(f,l,d),e.TransformCoordinatesToRef(m,l,g),this.origin.copyFrom(d),g.subtractToRef(d,this.direction),this.direction.normalize()}}function l(t,e,n,i,r,o=!1){const s=h.Zero();return u(t,e,n,i,s,r,o),s}function u(t,e,n,i,r,s,a=!1,c=!1){const h=t.getEngine();if(!s&&!(s=t.activeCamera)&&!(s=t.cameraToUseForPointers))return t;const l=s.viewport,u=h.getRenderHeight(),{x:f,y:m,width:d,height:g}=l.toGlobal(h.getRenderWidth(),u),y=1/h.getHardwareScalingLevel();return e=e*y-f,n=n*y-(u-m-g),r.update(e,n,d,g,i||o.IdentityReadOnly,a?o.IdentityReadOnly:s.getViewMatrix(),s.getProjectionMatrix(),c),t}function f(t,e,n,i){const r=h.Zero();return m(t,e,n,r,i),r}function m(t,e,n,i,r){if(!c)return t;const s=t.getEngine();if(!r&&!(r=t.activeCamera)&&!(r=t.cameraToUseForPointers))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),d=o.Identity(),g=1/s.getHardwareScalingLevel();return e=e*g-l,n=n*g-(h-u-m),i.update(e,n,f,m,d,d,r.getProjectionMatrix()),t}function d(t,e,n,i,r,o,s,a){return g(t,n,i,e(i,n.enableDistantPicking),r,o,s,a)}function g(t,e,n,i,r,o,s,a){const c=e.intersects(i,r,s,o,n,a);return c&&c.hit?!r&&null!=t&&c.distance>=t.distance?null:c:null}function y(t,e){return"InstancedLinesMesh"===t||"LinesMesh"===t?e.intersectionThreshold:0}function R(t){const e=t.getClassName();if("GreasedLineMesh"===e)return{rawBoundingInfo:null,intersectionThreshold:0};const n=t.rawBoundingInfo;return{rawBoundingInfo:n,intersectionThreshold:n?y(e,t):0}}function T(t,e,n,i,r){const o=t(n,e.enableDistantPicking);return o.intersectsSphere(i.boundingSphere,r)&&o.intersectsBox(i.boundingBox,r)?o:null}function p(t,e,n,i,s,a){let h=null;const l=!!(t.activeCameras&&t.activeCameras.length>1&&t.cameraToUseForPointers!==t.activeCamera),u=t.cameraToUseForPointers||t.activeCamera,f=d,m=f===d;for(let c=0;c<t.meshes.length;c++){const d=t.meshes[c];if(n){if(!n(d,-1))continue}else if(!d.isEnabled()||!d.isVisible||!d.isPickable)continue;const y=l&&d.isWorldMatrixCameraDependent(),p=d.computeWorldMatrix(y,u);if(d.hasThinInstances&&d.thinInstanceEnablePicking){const t=f(h,e,d,p,!0,!0,a);if(t){if(s)return t;const{rawBoundingInfo:c,intersectionThreshold:l}=R(d),u=d._thinInstanceDataStorage.matrixData;if(u){const t=r.Matrix[0],y=r.Matrix[1],R=Math.min(d.thinInstanceCount,u.length>>4);for(let r=0;r<R;r++){if(n&&!n(d,r))continue;o.FromArrayToRef(u,r<<4,t),t.multiplyToRef(p,y);const R=m&&c?T(e,d,y,c,l):null;if(m&&c&&!R)continue;const x=m&&R?g(h,d,y,R,i,s,a,!0):f(h,e,d,y,i,s,a,!0);if(x&&(h=x,h.thinInstanceIndex=r,i))return h}}}}else{const t=f(h,e,d,p,i,s,a);if(t&&(h=t,i))return h}}return h||new c}function x(t,e,n,i){if(!c)return null;const s=[],a=!!(t.activeCameras&&t.activeCameras.length>1&&t.cameraToUseForPointers!==t.activeCamera),h=t.cameraToUseForPointers||t.activeCamera,l=d,u=l===d;for(let c=0;c<t.meshes.length;c++){const f=t.meshes[c];if(n){if(!n(f,-1))continue}else if(!f.isEnabled()||!f.isVisible||!f.isPickable)continue;const m=a&&f.isWorldMatrixCameraDependent(),d=f.computeWorldMatrix(m,h);if(f.hasThinInstances&&f.thinInstanceEnablePicking){if(l(null,e,f,d,!0,!0,i)){const{rawBoundingInfo:t,intersectionThreshold:a}=R(f),c=f._thinInstanceDataStorage.matrixData;if(c){const h=r.Matrix[0],m=r.Matrix[1],y=Math.min(f.thinInstanceCount,c.length>>4);for(let r=0;r<y;r++){if(n&&!n(f,r))continue;o.FromArrayToRef(c,r<<4,h),h.multiplyToRef(d,m);const y=u&&t?T(e,f,m,t,a):null;if(u&&t&&!y)continue;const R=u&&y?g(null,f,m,y,!1,!1,i,!0):l(null,e,f,m,!1,!1,i,!0);R&&(R.thinInstanceIndex=r,s.push(R))}}}}else{const t=l(null,e,f,d,!1,!1,i);t&&s.push(t)}}return s}function _(t,e,n,i,r,s){if(!c)return null;const a=p(t,i=>(t._tempPickingRay||(t._tempPickingRay=h.Zero()),u(t,e,n,i,t._tempPickingRay,s||null),t._tempPickingRay),i,r,!0);return a&&(a.ray=l(t,e,n,o.Identity(),s||null)),a}function M(t,e,n,i,r,s,a,c=!1){const f=p(t,(i,r)=>(t._tempPickingRay||(t._tempPickingRay=h.Zero()),u(t,e,n,i,t._tempPickingRay,s||null,!1,r),t._tempPickingRay),i,r,!1,a);return f&&(f.ray=l(t,e,n,o.Identity(),s||null)),f}function I(t,e,n,i,r){const s=p(t,n=>(t._pickWithRayInverseMatrix||(t._pickWithRayInverseMatrix=o.Identity()),n.invertToRef(t._pickWithRayInverseMatrix),t._cachedRayForTransform||(t._cachedRayForTransform=h.Zero()),h.TransformToRef(e,t._pickWithRayInverseMatrix,t._cachedRayForTransform),t._cachedRayForTransform),n,i,!1,r);return s&&(s.ray=e),s}function w(t,e,n,i,r,o){return x(t,i=>l(t,e,n,i,r||null),i,o)}function b(t,e,n,i){return x(t,n=>(t._pickWithRayInverseMatrix||(t._pickWithRayInverseMatrix=o.Identity()),n.invertToRef(t._pickWithRayInverseMatrix),t._cachedRayForTransform||(t._cachedRayForTransform=h.Zero()),h.TransformToRef(e,t._pickWithRayInverseMatrix,t._cachedRayForTransform),t._cachedRayForTransform),n,i)}function F(t,n,i=100,o,s){o||(o=t.getWorldMatrix()),n.length=i,s?n.origin.copyFrom(s):n.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,n.direction),n}function v(t,n){n&&(n.prototype.getForwardRay=function(t=100,n,i){return F(this,new h(e.Zero(),e.Zero(),t),t,n,i)},n.prototype.getForwardRayToRef=function(t,e=100,n,i){return F(this,t,e,n,i)}),t&&(a._IsPickingAvailable=!0,t.prototype.createPickingRay=function(t,e,n,i,r=!1){return l(this,t,e,n,i,r)})}h._TmpVector3=t(6,e.Zero),h._RayDistant=h.Zero(),h._Smallnum=1e-8,h._Rayl=1e9;export{v as A,u as C,F as G,w as M,_ as P,h as R,f as a,m as b,M as c,I as d,b as e,l as f}; //# sourceMappingURL=ray.core-GrAvg8d_.esm.min.js.map