@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 5.96 kB
JavaScript
import{toNullable as e,unwrap as t}from"../../../../core/maybe.js";import{watch as r}from"../../../../core/reactiveUtils.js";import{f as i,k as s,c as a}from"../../../../chunks/mat4.js";import{c as o}from"../../../../chunks/mat4f64.js";import{i as n,n as u,b as c,c as l,k as d,a as h}from"../../../../chunks/vec3.js";import{c as m,Z as _}from"../../../../chunks/vec3f64.js";import{c as p}from"../../../../chunks/vec4.js";import{f}from"../../../../chunks/vec4f64.js";import{sv3d as g}from"../../../../geometry/support/vectorStacks.js";import{makeDehydratedPoint as b}from"../../../../layers/graphics/dehydratedFeatures.js";import{EngineVisualElement as O}from"./EngineVisualElement.js";import{DRAPED_Z as M}from"../../terrain/OverlayRenderer.js";import{Attribute as R}from"../../webgl-engine/lib/Attribute.js";import{Geometry as j}from"../../webgl-engine/lib/Geometry.js";import{createPolylineGeometry as y}from"../../webgl-engine/lib/GeometryUtil.js";import{RenderOccludedFlag as z}from"../../webgl-engine/lib/Material.js";import{RenderGeometry as D}from"../../webgl-engine/lib/RenderGeometry.js";import{VertexAttribute as w}from"../../webgl-engine/lib/VertexAttribute.js";import{ColorMaterial as P}from"../../webgl-engine/materials/ColorMaterial.js";import{RibbonLineMaterial as v}from"../../webgl-engine/materials/RibbonLineMaterial.js";class S extends O{constructor(e){super(e),this._maxSize=0,this._position=m(),this._up=m(),this._right=m(),this._renderOccluded=z.OccludeAndTransparent,this._color=f(1,0,0,1),this._outlineColor=f(0,0,0,1),this._outlineSize=0,this._size=32,this._outlineRenderOccluded=z.Opaque,this.applyProps(e)}createObject3DResourceFactory(e){return{view:e,createResources:e=>this._createObject3DResources(e),destroyResources:e=>this._destroyObject3DResources(e),cameraChanged:()=>this._updateTransformObject3D()}}createDrapedResourceFactory(e){return{view:e,createResources:()=>this._createDrapedResources(),destroyResources:e=>this._destroyDrapedResources(e)}}get renderOccluded(){return this._renderOccluded}set renderOccluded(e){e!==this._renderOccluded&&(this._renderOccluded=e,this._updateQuadMaterial())}get color(){return this._color}set color(e){p(this._color,e),this._updateQuadMaterial()}get outlineColor(){return this._outlineColor}set outlineColor(e){p(this._outlineColor,e),this._updateOutlineMaterial()}get outlineSize(){return this._outlineSize}set outlineSize(e){const t=0===this._outlineSize!=(0===e);this._outlineSize=e,t?this.recreateGeometry():this._updateOutlineMaterial()}get size(){return this._size}set size(e){e!==this._size&&(this._size=e,this._updateTransform())}get outlineRenderOccluded(){return this._outlineRenderOccluded}set outlineRenderOccluded(e){this._outlineRenderOccluded=e,this._updateOutlineMaterial()}set geometry({previous:e,center:t,next:r}){this._maxSize=Math.min(n(t,e),n(t,r))/3,u(this._up,c(this._up,e,t)),u(this._right,c(this._right,r,t)),l(this._position,t),this.recreateGeometry()}_createObject3DResources(e){const t=new P(this._quadMaterialParameters),r=0===this._outlineSize?void 0:new v(this._outlineMaterialParameters);return this._createObject3DGeometries(e,t,r),{quadMaterial:t,outlineMaterial:r,forEach:e=>{e(t),r&&e(r)}}}_destroyObject3DResources(e){e.quadMaterial.dispose(),e.outlineMaterial?.dispose()}_createObject3DGeometries(e,t,r){if(d(this._up,_)&&d(this._right,_))return;const i=this._createGeometries(t,r);for(const s of i)e.addGeometry(s);this._updateTransformObject3D(e)}_createDrapedResources(){const e=new P(this._quadMaterialParameters),t=0===this._outlineSize?void 0:new v(this._outlineMaterialParameters),i=this._createGeometries(e,t).map((e=>new D(e,{boundingInfo:e.boundingInfo})));this._setTransformDraped(i);return{quadMaterial:e,outlineMaterial:t,geometries:i,pixelRatioHandle:r((()=>this.view.state.contentPixelRatio),(()=>{this.drapedResources.recreateGeometry()}))}}_destroyDrapedResources(e){e.pixelRatioHandle.remove(),e.geometries=[],e.outlineMaterial?.dispose(),e.quadMaterial.dispose()}_createGeometries(e,t){const{up:r,right:i,corner:s}=this._getVertices(),a=this._quadGeometryData(r,i,s,e);if(!t)return[a];return[a,y(t,[r,s,i])]}_getVertices(){let e=this._up,t=this._right;const r=h(g.get(),e,t);return this.isDraped&&(e=l(g.get(),e),t=l(g.get(),t),e[2]=0,t[2]=0,r[2]=0),{up:e,right:t,corner:r}}_updateTransform(){this.isDraped?this.drapedResources.recreateGeometry():this._updateTransformObject3D()}_updateTransformObject3D(t=e(this.object3dResources.object)){if(!t)return;const r=this.view.state.camera,a=this._size*r.computeScreenPixelSizeAt(this._position),o=Math.min(this._maxSize,a);i(x,this._position),s(x,x,[o,o,o]),t.transformation=x}_setTransformDraped(e){if(0===e.length)return;const{view:{basemapTerrain:{overlayManager:r},state:{contentPixelRatio:o}}}=this,{_position:n,_size:u}=this,c=l(g.get(),n);c[2]=M;const d=G;d.spatialReference=t(r.renderer.spatialReference),d.x=c[0],d.y=c[1];const h=u*(r.overlayPixelSizeInMapUnits(d)*o),m=Math.min(this._maxSize,h);i(x,c),s(x,x,[m,m,1]);for(const t of e)t.updateTransformation((e=>{a(e,x)}))}_quadGeometryData(e,t,r,i){return new j(i,[[w.POSITION,new R([0,0,0,...t,...e,...r],3,!0)]],[[w.POSITION,[0,1,2,1,2,3]]])}get _quadMaterialParameters(){return{color:this._color,transparent:!0,writeDepth:!1,polygonOffset:!0,renderOccluded:this._renderOccluded}}_updateQuadMaterial(){e(this.object3dResources.resources)?.quadMaterial.setParameters(this._quadMaterialParameters),e(this.drapedResources.resources)?.quadMaterial.setParameters(this._quadMaterialParameters)}get _outlineMaterialParameters(){return{color:this._outlineColor,width:this._outlineSize,renderOccluded:this._outlineRenderOccluded}}_updateOutlineMaterial(){e(this.object3dResources.resources)?.outlineMaterial?.setParameters(this._outlineMaterialParameters),e(this.drapedResources.resources)?.outlineMaterial?.setParameters(this._outlineMaterialParameters)}}const x=o(),G=b(0,0,void 0,null);export{S as RightAngleQuadVisualElement};