UNPKG

@arcgis/core

Version:

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

3 lines (2 loc) 5.56 kB
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */ import{destroyMaybe as e}from"../../../../../core/maybe.js";import{squaredDistance as t,set as a,transformMat3 as r,add as o}from"../../../../../core/libs/gl-matrix-2/math/vec3.js";import{create as i}from"../../../../../core/libs/gl-matrix-2/factories/vec3f64.js";import{create as s}from"../../../../../geometry/support/aaBoundingBox.js";import{encodeSymbolColor as n}from"../../../layers/support/symbolColorUtils.js";import{computeOffsetObb as l}from"../../../support/orientedBoundingBox.js";import{ComponentParametersUniform as h,ComponentParametersVarying as m}from"./ComponentDrawParameters.js";import{UniformComponentParameters as c}from"./UniformComponentParameters.js";import{olidEnabled as d}from"../../effects/geometry/olidUtils.js";import{defaultHighlightName as p}from"../../../../support/HighlightDefaults.js";class u{constructor(e,t,a,r,o,i){this._collection=e,this.transform=t,this.obb=a,this._componentData=r,this._renderable=o,this._intersectionGeometry=i,this.visible=!1,this.offsetObb=null,this._aabbInWorldCoordinates=null}destroy(){this._collection.materialRepository.releaseMaterial(this._renderable.material),this._intersectionGeometry=e(this._intersectionGeometry),this._renderable=e(this._renderable),this._componentData=e(this._componentData)}get componentData(){return this._componentData}get renderable(){return this._renderable}get intersectionGeometry(){return this._intersectionGeometry}updateMaterial(e,t){this._updateMaterial(e,t)}get opacity(){return this.renderable.opacity}updateOpacity(e){this.opacity!==e&&(this._renderable.updateOpacity(e),this._updateMaterial({opacity:e}))}_updateMaterial(e,t){const{_renderable:a}=this,r=a.material,o=this._collection.materialRepository.acquireMaterial({...r.parameters,opacity:a.opacity,...e},a.geometry.parameters,t??a.drawParameters.componentParameters);this._collection.materialRepository.releaseMaterial(r),o!==r&&a.updateMaterial(o)}updateCameraDerivedParameters(e){const{eye:a}=e;this._renderable.meta.cameraDepthSquared=t(a,this.obb.center)}setComponentData(e,t){const a=this._componentData,{materialDataBuffer:r,materialDataIndices:o}=a,i=new c,s=r.textureBuffer,p=s.getVec4Field("colorAndCastShadows"),u=s.getScalarField("elevationOffset"),g=s.getScalarField("emissiveStrength"),b=s.getScalarField("emissiveSourceMode"),y=s.getVec4Field("olidColor"),_=new Uint8Array(4),M=new Uint32Array(_.buffer);let v,C=0,w=0,S=0,x=0,D=0,O=a.verticalOffsets,P=1/0,j=-1/0,A=!1,I=!1,k=!1,H=0;for(let l=0;l<a.count;l++){e(l,i),C+=+(i.externalColor[3]<1),w+=+(3===i.externalColorMixMode&&1===i.externalColor[3]),x+=+(i.emissiveStrength>0),D+=+(1===i.emissiveSource),I||=1!==i.emissiveStrength,S+=+i.castShadows,n(i.externalColor,i.externalColorMixMode,_),_[2]=254&_[2]|+i.castShadows,p.setArray(o[l],_),A||=l>0&&H!==M[0],H=M[0],k||=0!==i.elevationOffset,k&&null==O&&(O=new Array(l).fill(0)),null!=O&&(O[l]=i.elevationOffset),P=Math.min(P,i.elevationOffset),j=Math.max(j,i.elevationOffset),u.set(o[l],i.elevationOffset),g.set(o[l],i.emissiveStrength),b.set(o[l],0===i.emissiveSource?0:255);const t=i.olidColor;null!=t&&y.setArray(o[l],t),i.pickable!==a.isPickable(l)&&a.updatePickabilityWithCount(l,i.pickable)}if(a.verticalOffsets=k?O:null,this.offsetObb=k?l(this.obb,P,j,t,this.offsetObb??this.obb.clone()):null,A||k||d()||(I||D>0)&&x>0){const{count:e}=a;v=new m(f(C,e),f(w,e),f(x,e),f(D,e),f(S,e)),s.updateTexture(),this._renderable.updateComponentParametersVarying(v,s)}else v=new h(i.externalColor,i.externalColorMixMode,i.emissiveStrength,i.emissiveSource,i.castShadows?0:2),this._renderable.updateComponentParametersUniform(v);this._updateMaterial({},v)}addComponentHighlight(e,t){return this._componentData.addComponentHighlight(e,t)}removeComponentHighlight(e,t){return this._componentData.removeComponentHighlight(e,t)}clearHighlights(){this._componentData.clearHighlights()}get aabbInWorldCoordinates(){let e=this._aabbInWorldCoordinates;return e||(e=this._computeAabbInWorldCoordinates(),this._aabbInWorldCoordinates=e),e}_computeAabbInWorldCoordinates(){const e=s(),{positions:t}=this._intersectionGeometry;if(Math.floor(t.length/3)>0){const{rotationScale:s,position:n}=this.transform;let l=1/0,h=1/0,m=1/0,c=-1/0,d=-1/0,p=-1/0;const u=i();for(let e=0;e<t.length;e+=3)a(u,t[e+0],t[e+1],t[e+2]),r(u,u,s),o(u,u,n),l=Math.min(l,u[0]),h=Math.min(h,u[1]),m=Math.min(m,u[2]),c=Math.max(c,u[0]),d=Math.max(d,u[1]),p=Math.max(p,u[2]);e[0]=l,e[1]=h,e[2]=m,e[3]=c,e[4]=d,e[5]=p}return e}submit(e,t){const{componentData:a,renderable:r}=this;if(r.drawParameters.opacity<=0)return;const{geometry:o,drawParameters:i,material:s}=r,n=r.meta.cameraDepthSquared;a.updateHighlights(t.highlights);const{geometryRanges:l,highlightRangesMap:h,shadowmapRanges:m}=a,c=e=>e.submitDraw(s,i,o,l,n);switch(s.materialPass){case 0:c(e.opaque);break;case 1:c(e.transparent);break;case 2:c(e.opaque),c(e.transparent);break;case 3:c(e.integratedMesh),g(t)&&c(e.occludedGround),b(t)&&c(e.highlightIntegratedMesh);break;case 4:c(e.transparentIntegratedMesh)}if(i.castAnyShadows){if(null!=h)for(const t of h)t[0]===p&&e.highlightShadowMap.submitDraw(s,i,o,t[1],n,t[0]);null!=m&&e.defaultShadowMap.submitDraw(s,i,o,m,n),c(e.shadowMap)}if(null!=h)for(const d of h)e.highlight.submitDraw(s,i,o,d[1],n,d[0]);t.viewshedEnabled&&c(e.viewshedShadowMap)}}function f(e,t){return e===t?0:0===e?2:1}function g(e){return null!=e.overlay?.getTexture(e.overlay?.allSourcesOccluders?1:4)}function b(e){return null!=e.overlay?.getTexture(2)}export{u as ComponentObject};