UNPKG

@arcgis/core

Version:

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

6 lines (5 loc) 3.96 kB
/* All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://js.arcgis.com/4.33/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{MeshIntersectionOptions as n,intersectRayTriangles as s}from"../../lib/RayIntersections.js";const r=200,a=40,o=.8,c=10,h=1e-6;function l(t,e,i){const n=e,s=i;let r=0,a=1/0;for(let o=0;o<3;++o){{const e=t[o];if(n[o]<e){if(s[o]<=h)return!1;const t=(e-n[o])/s[o];r=Math.max(r,t)}else if(s[o]<=-1e-6){const t=(e-n[o])/s[o];a=Math.min(a,t)}if(r>a)return!1}{const e=t[o+3];if(n[o]>e){if(s[o]>=-1e-6)return!1;const t=(e-n[o])/s[o];r=Math.max(r,t)}else if(s[o]>=h){const t=(e-n[o])/s[o];a=Math.min(a,t)}if(r>a)return!1}}return!0}class d{constructor(t,e,i,n,s){this.aabb=t,this.axis=e,this.d=i,this.midStartIndex=n,this.rightStartIndex=s}}class f{constructor(i,n,s,r){this.globalTriangleVertexIndices=i,this.firstTriangleIndex=n,this.positions=r,this._rayDirection=e(),this._callback=R,this._intersectionOptions=I,this.bspNodeTree=new Array;const h=s-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,s,r.data,r.stride),f=t(Math.log2(h/a),2,c),m=(t,i,n)=>{const s=x(l,e,t,i),r=i-t;if(r<=a){const e=new d(s,void 0,0,t,i);return this.bspNodeTree.push(e),e}const{axis:c,midValue:h}=y(s),u=g(l,e,t,i,c,h),p=(t,e)=>{if(n>f)return;const i=e-t;return i<a||i>=o*r?void 0:m(t,e,n+1)},N=new d(s,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;s(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 s=t,r=e,a=r[0]-s[0],o=r[1]-s[1],c=r[2]-s[2];if(a*a+o*o+c*c<h)return;this._rayFrom=s;const l=this._rayDirection;l[0]=a,l[1]=o,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,s=this._rayDirection;if(!l(t.aabb,n,s))return;const r=t.axis,a=t.d;if(n[r]<a||s[r]<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[r]>a||s[r]>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)}}}static{this.numFacesTested=0}get estimatedMemoryUsage(){return this.triangleIndexMap.byteLength}}const m=[1/0,1/0,1/0],u=[-1/0,-1/0,-1/0];function g(t,e,i,n,s,r){let a=i,o=n;for(;a<o;){const i=t[a];e[6*i+s+3]<=r?++a:(--o,t[a]=t[o],t[o]=i)}let c=a;for(o=n;c<o;){const i=t[o-1];e[6*i+s]>=r?--o:(t[o-1]=t[c],t[c]=i,++c)}return{next:a,mid:c}}function x(t,e,n,s){if(s<=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<s;++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],s=e>i?e>n?0:i>n?1:2:i>n?1:n>e?2:0;return{axis:s,midValue:(t[s]+t[s+3])/2}}function p(t,e,i,n,s){const r=i-e,a=new Float32Array(6*r);for(let o=0;o<r;++o){const i=3*(o+e),r=t[i]*s,c=t[i+1]*s,h=t[i+2]*s;for(let t=0;t<3;++t){const e=n[r+t],i=n[c+t],s=n[h+t];a[6*o+t]=Math.min(e,i,s),a[6*o+3+t]=Math.max(e,i,s)}}return a}const N=255,b=65535,I=new n,R=()=>{};export{f as ComponentIntersectionData,r as componentMinimalSizeForIntersectionData};