@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 9.05 kB
JavaScript
import{isNone as e,unwrap as t,disposeMaybe as s,isSome as i}from"../../../../core/maybe.js";import r from"../../../../core/PooledArray.js";import{b as n,l as o,g as a,o as h,e as l,p as c}from"../../../../chunks/vec3.js";import{c as d}from"../../../../chunks/vec3f64.js";import{s as u}from"../../../../chunks/vec4.js";import{create as p,offset as m,contains as g,containsPoint as _,set as f,POSITIVE_INFINITY as P,equals as b}from"../../../../geometry/support/aaBoundingBox.js";import{create as S}from"../../../../geometry/support/plane.js";import{fromPoints as x}from"../../../../geometry/support/ray.js";import{PclTarget as z}from"./Intersector.js";import{PointHighlights as R}from"./PointHighlights.js";import{minimumDistancePlane as q,maximumDistancePlane as w,intersectLine as y,toAaBoundingBox as A}from"../../support/orientedBoundingBox.js";import{ShaderOutput as j}from"../../webgl-engine/core/shaderLibrary/ShaderOutput.js";import{Default3D as I}from"../../webgl-engine/lib/DefaultVertexAttributeLocations.js";import{newIntersectorResult as F}from"../../webgl-engine/lib/Intersector.js";import{IntersectorType as v,StoreResults as C}from"../../webgl-engine/lib/IntersectorInterfaces.js";import{VertexArrayObject as E}from"../../webgl-engine/lib/VertexArrayObject.js";import{VertexAttribute as H}from"../../webgl-engine/lib/VertexAttribute.js";import{P as N,a as O,g as L}from"../../../../chunks/PointRenderer.glsl.js";import{PointRendererTechnique as T}from"../../webgl-engine/shaders/PointRendererTechnique.js";import{PointRendererTechniqueConfiguration as B}from"../../webgl-engine/shaders/PointRendererTechniqueConfiguration.js";import{BufferObject as D}from"../../../webgl/BufferObject.js";import{DataType as M,PrimitiveType as V,Usage as W}from"../../../webgl/enums.js";import{VertexElementDescriptor as U}from"../../../webgl/VertexElementDescriptor.js";const k={positions:[new U(H.POSITION,3,M.FLOAT,0,12)],colors:[new U(H.COLOR,3,M.UNSIGNED_BYTE,0,3,!0)]};class G{get needsHighlight(){return this._highlights.hasHighlights}constructor(e){this._params=e,this.type=v.PCL,this.isGround=!1,this._passParameters=new N,this._highlights=new R({forEachNode:e=>this.forEachNode(e),addHighlight:(e,t,s)=>this._addHighlight(e,t,s),removeHighlight:(e,t)=>this._removeHighlight(e,t)}),this.canRender=!0,this.layerUid="",this._slicePlaneEnabled=!1,this._techniqueConfig=new B,this._nodes=new r}initializeRenderContext(e){this._context=e,this._techniqueRepository=this._context.techniqueRepository,e.requestRender()}uninitializeRenderContext(){}intersect(e,t,s,i){const r=d(),f=d(),P=d(),b=d(),R=S(),j=e.camera.perScreenPixelRatio/2,I=e.camera.near;n(f,i,s);const v=1/o(f);a(f,f,v),h(P,f),u(R,f[0],f[1],f[2],-l(f,s));const E=new te,H=new te,N=new Array,O=p(),L=p(this._passParameters.clipBox);m(L,-s[0],-s[1],-s[2],L),this._nodes.forAll((o=>{const a=o.splatSize*this._passParameters.scaleFactor;let h=q(o.obb,R),d=w(o.obb,R);h-=Q(a,h+I,this._passParameters,j,o.isLeaf),d-=Q(a,d+I,this._passParameters,j,o.isLeaf);const u=d<0,p=null!=E.dist&&null!=H.dist&&E.dist<h*v&&H.dist>d*v;if(u||p)return;const S=K(a,d+I,this._passParameters,j,o.isLeaf);if(!y(o.obb,s,f,S))return;const x=S*S;A(o.obb,O),m(O,-s[0],-s[1],-s[2],O);const z=!g(L,O);n(b,o.origin,s);const F=o.coordinates.length/3;for(let n=0;n<F;n++){if(r[0]=b[0]+o.coordinates[3*n],r[1]=b[1]+o.coordinates[3*n+1],r[2]=b[2]+o.coordinates[3*n+2],z&&!_(L,r))continue;const h=l(r,f),d=c(r)-h*h;if(d>x)continue;let u=h+I;const p=Q(a,u,this._passParameters,j,o.isLeaf);if(h-p<0)continue;u-=p;const m=K(a,u,this._passParameters,j,o.isLeaf);if(d>m*m)continue;const g=(h-p)*v,S=e=>(e.point=X(o,n,e.point),e.dist=g,e.normal=P,e.node=o,e.pointId=n,e.layerUid=this.layerUid,e);if((null==E.dist||g<E.dist)&&(null==t||t(s,i,g))&&S(E),e.options.store!==C.MIN&&(null==H.dist||g>H.dist)&&(null==t||t(s,i,g))&&S(H),e.options.store===C.ALL&&(null==t||t(s,i,g))){const e=new te;N.push(S(e))}}}));const T=e=>{const{layerUid:t,node:s,pointId:i}=e;return new z(e.point,t,i,(()=>this._params.createGraphic(s,i,e.point)))},B=(e,t)=>{const s=T(t);e.set(this.type,s,t.dist,t.normal)};if(se(E)){const t=e.results.min;(null==t.dist||E.dist<t.dist)&&B(t,E)}if(se(H)&&e.options.store!==C.MIN){const t=e.results.max;(null==t.dist||H.dist>t.dist)&&B(t,H)}if(e.options.store===C.ALL){const t=x(s,i);for(const s of N){const i=F(t);B(i,s),e.results.all.push(i)}}}prepareTechnique(e){return 0===this._nodes.length||e.output!==j.Color&&e.output!==j.Depth&&e.output!==j.Highlight?null:(this._nodes.forAll((t=>{null==t.vao&&this._initNode(e,t)})),this._techniqueConfig.drawScreenSize=this._passParameters.drawScreenSpace,this._techniqueConfig.useFixedSizes=this._passParameters.useFixedSizes,this._techniqueConfig.hasSlicePlane=this._slicePlaneEnabled,this._techniqueConfig.hasOccludees=e.bindParameters.hasOccludees,this._techniqueConfig.clippingEnabled=this._clippingEnabled,this._techniqueConfig.output=e.output===j.Depth?j.Depth:e.output===j.Highlight?j.Highlight:j.Color,this._techniqueRepository.releaseAndAcquire(T,this._techniqueConfig,this._technique))}render(e,t){const s=e.rctx,i=s.bindTechnique(t,this._passParameters,e.bindParameters),r=e.output===j.Highlight;this._nodes.forAll((t=>{0===t.coordinates.length||r&&!t.highlights||(i.bindDraw(t,e.bindParameters,this._passParameters),s.bindVAO(t.vao),r?this._renderHighlightFragments(s,t):s.drawArrays(V.POINTS,0,t.coordinates.length/3))}))}_renderHighlightFragments(s,i){const r=i.highlights;if(e(r))return;let n=t(r[0].component),o=n+1;for(let e=1;e<r.length;e++){const i=t(r[e].component);if(i!==o){const e=o-n;e>0&&s.drawArrays(V.POINTS,n,e),n=i}o=i+1}const a=o-n;a>0&&s.drawArrays(V.POINTS,n,a)}set useFixedSizes(e){this._passParameters.useFixedSizes!==e&&(this._passParameters.useFixedSizes=e,this._requestRender())}get useFixedSizes(){return this._passParameters.useFixedSizes}set scaleFactor(e){this._passParameters.scaleFactor!==e&&(this._passParameters.scaleFactor=e,this._requestRender())}get scaleFactor(){return this._passParameters.scaleFactor}set minSizePx(e){this._passParameters.minSizePx!==e&&(this._passParameters.minSizePx=e,this._requestRender())}get minSizePx(){return this._passParameters.minSizePx}set useRealWorldSymbolSizes(e){this._passParameters.useRealWorldSymbolSizes!==e&&(this._passParameters.useRealWorldSymbolSizes=e,this._requestRender())}get useRealWorldSymbolSizes(){return this._passParameters.useRealWorldSymbolSizes}set size(e){this._passParameters.size!==e&&(this._passParameters.size=e,this._requestRender())}get size(){return this._passParameters.size}set sizePx(e){this._passParameters.sizePx!==e&&(this._passParameters.sizePx=e,this._requestRender())}get sizePx(){return this._passParameters.sizePx}set clippingBox(e){f(this._passParameters.clipBox,e||P)}get _clippingEnabled(){return!b(this._passParameters.clipBox,P,((e,t)=>e===t))}get slicePlaneEnabled(){return this._slicePlaneEnabled}set slicePlaneEnabled(e){this._slicePlaneEnabled!==e&&(this._slicePlaneEnabled=e,this._requestRender())}addNode(e){this._nodes.push(e),this._highlights.nodeAdded(e),this._requestRender()}removeNode(e){let t=null;return this._nodes.filterInPlace((i=>i.id!==e||(t=i,i.vao=s(i.vao),this._highlights.nodeRemoved(i),!1))),this._requestRender(),t}forEachNode(e){this._nodes.forAll(e)}removeAll(){this._nodes.forAll((e=>e.vao=s(e.vao))),this._highlights.removeAll(),this._nodes.clear(),this._requestRender()}highlight(e){return this._highlights.add(e)}_addHighlight(e,t,s){e.highlights=$(e.highlights,t,s),this._requestRender()}_removeHighlight(e,t){e.highlights=ee(e.highlights,t),this._requestRender()}_initNode(e,t){const s=e.rctx;t.vao=new E(s,I,k,{positions:D.createVertex(s,W.STATIC_DRAW,t.coordinates),colors:D.createVertex(s,W.STATIC_DRAW,t.rgb)})}_requestRender(){this._context&&this._context.requestRender()}}class Y extends O{constructor(e,t,s,i,r,n,o,a,h=null,l=null){super(s,r,t),this.id=e,this.obb=i,this.coordinates=n,this.rgb=o,this.attributes=a,this.pointIdFilterMap=h,this.highlights=l}}function J(e){return e.hasOwnProperty("splatSize")}function K(e,t,s,i,r){if(s.drawScreenSpace)return s.fixedSize*t*i;const n=L(r)*t*i;return s.useFixedSizes?Math.min(s.fixedSize/2,n):s.screenMinSize>0?Math.min(Math.max(s.screenMinSize*t*i,e/2),n):Math.min(e/2,n)}function Q(e,t,s,i,r){return s.drawScreenSpace?0:K(e,t,s,i,r)}function X(t,s,i){return e(i)&&(i=d()),i[0]=t.origin[0]+t.coordinates[3*s],i[1]=t.origin[1]+t.coordinates[3*s+1],i[2]=t.origin[2]+t.coordinates[3*s+2],i}function Z(e){return i(e.component)?e.component:-1}function $(t,s,i){e(t)&&(t=[]);const r={component:s,id:i};t.push(r);const n=Z(r);let o=t.length-1;for(;o>0&&n<Z(t[o-1]);)[t[o-1],t[o]]=[t[o],t[o-1]],--o;return t}function ee(t,s){if(e(t))return t;const i=t.filter((e=>e.id!==s));return 0===i.length?null:i}class te{constructor(){this.node=null,this.pointId=null,this.point=null,this.dist=null,this.normal=null,this.layerUid=""}}function se(e){return i(e.dist)&&i(e.point)&&i(e.pointId)&&i(e.node)}export{G as PointRenderer,Y as PointRendererNode,J as isInstanceOfNode};