UNPKG

@arcgis/core

Version:

ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API

6 lines (5 loc) 3.95 kB
/* All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://js.arcgis.com/4.32/esri/copyright.txt for details. */ import{clamp as t}from"../../../../../core/mathUtils.js";import{create as e}from"../../../../../core/libs/gl-matrix-2/factories/vec3f64.js";import{fromValues as i}from"../../../../../geometry/support/aaBoundingBox.js";import{intersectRayTriangles as n,MeshIntersectionOptions as r}from"../../lib/RayIntersections.js";const s=200,o=40,a=.8,c=10,h=1e-6;function l(t,e,i){const n=e,r=i;let s=0,o=1/0;for(let a=0;a<3;++a){{const e=t[a];if(n[a]<e){if(r[a]<=h)return!1;const t=(e-n[a])/r[a];s=Math.max(s,t)}else if(r[a]<=-1e-6){const t=(e-n[a])/r[a];o=Math.min(o,t)}if(s>o)return!1}{const e=t[a+3];if(n[a]>e){if(r[a]>=-1e-6)return!1;const t=(e-n[a])/r[a];s=Math.max(s,t)}else if(r[a]>=h){const t=(e-n[a])/r[a];o=Math.min(o,t)}if(s>o)return!1}}return!0}class d{constructor(t,e,i,n,r){this.aabb=t,this.axis=e,this.d=i,this.midStartIndex=n,this.rightStartIndex=r}}class f{constructor(i,n,r,s){this.globalTriangleVertexIndices=i,this.firstTriangleIndex=n,this.positions=s,this._rayDirection=e(),this._callback=R,this._intersectionOptions=I,this.bspNodeTree=new Array;const h=r-n,l=new(h<N?Uint8Array:h<b?Uint16Array:Uint32Array)(h);this.triangleIndexMap=l;for(let t=0;t<h;++t)l[t]=t;{const e=p(i,n,r,s.data,s.stride),f=t(Math.log2(h/o),2,c),m=(t,i,n)=>{const r=x(l,e,t,i),s=i-t;if(s<=o){const e=new d(r,void 0,0,t,i);return this.bspNodeTree.push(e),e}const{axis:c,midValue:h}=y(r),u=g(l,e,t,i,c,h),p=(t,e)=>{if(n>f)return;const i=e-t;return i<o||i>=a*s?void 0:m(t,e,n+1)},N=new d(r,c,h,u.next,u.mid);return this.bspNodeTree.push(N),N.leftNode=p(t,u.next),N.rightNode=p(u.mid,i),N};m(0,h,0)}}intersectRayTriangleRange(t,e){if(t>=e)return;const i=this.positions;n(this._rayFrom,this._rayDirection,t,e,this.globalTriangleVertexIndices,i.data,i.stride,this._intersectionOptions.normalRequired,this._callback,this.triangleIndexMap,this.firstTriangleIndex),f.numFacesTested+=e-t}intersectRay(t,e,i,n){f.numFacesTested=0;const r=t,s=e,o=s[0]-r[0],a=s[1]-r[1],c=s[2]-r[2];if(o*o+a*a+c*c<h)return;this._rayFrom=r;const l=this._rayDirection;l[0]=o,l[1]=a,l[2]=c;const d=this.triangleIndexMap.length;this._callback=n,this._intersectionOptions=i,this.intersectRayBSP(this.bspNodeTree[0],0,d),this._callback=R,this._intersectionOptions=I}intersectRayBSP(t,e,i){const n=this._rayFrom,r=this._rayDirection;if(!l(t.aabb,n,r))return;const s=t.axis,o=t.d;if(n[s]<o||r[s]<0){const i=e,n=t.midStartIndex;if(i<n){const e=t.leftNode;void 0!==e?this.intersectRayBSP(e,i,n):this.intersectRayTriangleRange(i,n)}}if(this.intersectRayTriangleRange(t.midStartIndex,t.rightStartIndex),n[s]>o||r[s]>0){const e=t.rightStartIndex,n=i;if(e<n){const i=t.rightNode;void 0!==i?this.intersectRayBSP(i,e,n):this.intersectRayTriangleRange(e,n)}}}get estimatedMemoryUsage(){return this.triangleIndexMap.byteLength}}f.numFacesTested=0;const m=[1/0,1/0,1/0],u=[-1/0,-1/0,-1/0];function g(t,e,i,n,r,s){let o=i,a=n;for(;o<a;){const i=t[o];e[6*i+r+3]<=s?++o:(--a,t[o]=t[a],t[a]=i)}let c=o;for(a=n;c<a;){const i=t[a-1];e[6*i+r]>=s?--a:(t[a-1]=t[c],t[c]=i,++c)}return{next:o,mid:c}}function x(t,e,n,r){if(r<=n)return i(NaN,NaN,NaN,NaN,NaN,NaN);{const i=6*t[n];for(let t=0;t<3;++t)m[t]=e[i+0+t],u[t]=e[i+3+t]}for(let i=n+1;i<r;++i){const n=6*t[i];for(let t=0;t<3;++t)m[t]=Math.min(m[t],e[n+0+t]),u[t]=Math.max(u[t],e[n+3+t])}return i(m[0],m[1],m[2],u[0],u[1],u[2])}function y(t){const e=t[3]-t[0],i=t[4]-t[1],n=t[5]-t[2],r=e>i?e>n?0:i>n?1:2:i>n?1:n>e?2:0;return{axis:r,midValue:(t[r]+t[r+3])/2}}function p(t,e,i,n,r){const s=i-e,o=new Float32Array(6*s);for(let a=0;a<s;++a){const i=3*(a+e),s=t[i]*r,c=t[i+1]*r,h=t[i+2]*r;for(let t=0;t<3;++t){const e=n[s+t],i=n[c+t],r=n[h+t];o[6*a+t]=Math.min(e,i,r),o[6*a+3+t]=Math.max(e,i,r)}}return o}const N=255,b=65535,I=new r,R=()=>{};export{f as ComponentIntersectionData,s as componentMinimalSizeForIntersectionData};