@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 2.78 kB
JavaScript
import{range as e}from"../../../../../core/arrayUtils.js";import{deg2rad as t,acosClamped as n}from"../../../../../core/mathUtils.js";import{i as o,s as r,c,e as s,r as a,f as i,b as l,n as f}from"../../../../../chunks/vec3.js";import{c as g}from"../../../../../chunks/vec3f64.js";const m=-1;var u;function p(n,a,i,l=V){const f=n.vertices.position,g=n.vertices.componentIndex,u=t(l.anglePlanar),p=t(l.angleSignificantEdge),y=Math.cos(p),E=Math.cos(u),N=I.edge,S=N.position0,x=N.position1,j=N.faceNormal0,D=N.faceNormal1,F=w(n),L=d(n),b=L.length/4,k=a.allocate(b);let C=0;const H=b,K=i.allocate(H);let M=0,O=0,P=0;const T=e(0,b),U=new Float32Array(b);U.forEach(((e,t,n)=>{f.getVec(L[4*t+0],S),f.getVec(L[4*t+1],x),n[t]=o(S,x)})),T.sort(((e,t)=>U[t]-U[e]));const q=new Array,z=new Array;for(let e=0;e<b;e++){const t=T[e],n=U[t],o=L[4*t+0],l=L[4*t+1],p=L[4*t+2],d=L[4*t+3],w=d===m;if(f.getVec(o,S),f.getVec(l,x),w)r(j,F[3*p+0],F[3*p+1],F[3*p+2]),c(D,j),N.componentIndex=g.get(o),N.cosAngle=s(j,D);else{if(r(j,F[3*p+0],F[3*p+1],F[3*p+2]),r(D,F[3*d+0],F[3*d+1],F[3*d+2]),N.componentIndex=g.get(o),N.cosAngle=s(j,D),v(N,E))continue;N.cosAngle<-.9999&&c(D,j)}O+=n,P++,w||h(N,y)?(a.write(k,C++,N),q.push(n)):A(N,u)&&(i.write(K,M++,N),z.push(n))}const B=new Float32Array(q.reverse()),G=new Float32Array(z.reverse());return{regular:{instancesData:a.trim(k,C),lodInfo:{lengths:B}},silhouette:{instancesData:i.trim(K,M),lodInfo:{lengths:G}},averageEdgeLength:O/P}}function h(e,t){return e.cosAngle<t}function v(e,t){return e.cosAngle>t}function A(e,t){const o=n(e.cosAngle),r=I.fwd,c=I.ortho;a(r,e.position1,e.position0);return o*(s(i(c,e.faceNormal0,e.faceNormal1),r)>0?-1:1)>t}function d(e){const t=e.faces.length/3,n=e.faces,o=e.neighbors;let r=0;for(let a=0;a<t;a++){const e=o[3*a+0],t=o[3*a+1],c=o[3*a+2],s=n[3*a+0],i=n[3*a+1],l=n[3*a+2];r+=e===m||s<i?1:0,r+=t===m||i<l?1:0,r+=c===m||l<s?1:0}const c=new Int32Array(4*r);let s=0;for(let a=0;a<t;a++){const e=o[3*a+0],t=o[3*a+1],r=o[3*a+2],i=n[3*a+0],l=n[3*a+1],f=n[3*a+2];(e===m||i<l)&&(c[s++]=i,c[s++]=l,c[s++]=a,c[s++]=e),(t===m||l<f)&&(c[s++]=l,c[s++]=f,c[s++]=a,c[s++]=t),(r===m||f<i)&&(c[s++]=f,c[s++]=i,c[s++]=a,c[s++]=r)}return c}function w(e){const t=e.faces.length/3,n=e.vertices.position,o=e.faces,r=y.v0,c=y.v1,s=y.v2,a=new Float32Array(3*t);for(let g=0;g<t;g++){const e=o[3*g+0],t=o[3*g+1],m=o[3*g+2];n.getVec(e,r),n.getVec(t,c),n.getVec(m,s),l(c,c,r),l(s,s,r),i(r,c,s),f(r,r),a[3*g+0]=r[0],a[3*g+1]=r[1],a[3*g+2]=r[2]}return a}!function(e){e[e.SOLID=0]="SOLID",e[e.SKETCH=1]="SKETCH"}(u||(u={}));const I={edge:{position0:g(),position1:g(),faceNormal0:g(),faceNormal1:g(),componentIndex:0,cosAngle:0},ortho:g(),fwd:g()},y={v0:g(),v1:g(),v2:g()},V={anglePlanar:4,angleSignificantEdge:35};export{u as EdgeType,p as extractEdges};