UNPKG

@arcgis/core

Version:

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

6 lines (5 loc) 4.21 kB
/* All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://js.arcgis.com/4.33/esri/copyright.txt for details. */ import"../../../../core/has.js";import{FeatureBatchingStrategy as t,FeatureSymbologyDrawOrder as e}from"./enums.js";import{List as n}from"./cpuMapped/FreeList.js";import{isHittest as i}from"./shaderGraph/techniques/featureTechniqueUtils.js";import{PrimitiveType as a,DataType as s}from"../../../webgl/enums.js";function r(t,e){return t<<16|255&e}function d(t){return 255&t}class h{constructor(t,e,n,i,a){this.instance=t,this.materialKey=e,this.target=n,this.start=i,this.count=a}get textureKey(){return d(this.materialKey)}get indexEnd(){return this.start+this.count}extend(t){this.count+=t}render(t){this.instance.techniqueRef.render(t,this)}get key(){return this.target.key}getStencilReference(){return this.target.stencilRef}getAttributePrecisionPackFactors(){const t=this.instance.instanceId;return this.target.getMesh(t).getAttributePrecisionPackFactors()}draw(t,e){i(t)?this.drawCompute(t.context,e):this.drawGeometry(t.context,e)}drawCompute(t,e){const n=this.instance.instanceId,i=this.target.getMesh(n).getComputeVAO(t,e),r=this.start*Uint32Array.BYTES_PER_ELEMENT/3;t.bindVAO(i),t.drawElements(a.POINTS,this.count/3,s.UNSIGNED_INT,r),t.bindVAO(null)}drawGeometry(t,e){const n=this.instance.instanceId,i=this.target.getMesh(n).getGeometryVAO(t,e),r=this.start*Uint32Array.BYTES_PER_ELEMENT;t.bindVAO(i),t.drawElements(a.TRIANGLES,this.count,s.UNSIGNED_INT,r),t.bindVAO(null)}}class l{constructor(){this._length=0,this._minOrderedLength=0,this._materialKeys=new Set}static fromDisplayEntities(t,e,n,i){const a=new l;for(const s of t.values())for(const t of s.records){const s=n.getInstance(t.instanceId),d=r(s.instanceId,t.textureKey);a.addRecord(s,d,t.indexStart,t.indexCount,t.vertexStart,t.vertexCount,e,i)}return a}get length(){return this._length}get minOrderedLength(){return this._minOrderedLength}get minUnorderedLength(){return this._materialKeys.size}render(t,e){const{drawPhase:n}=t;for(const i of this.infos()){const a=i.instance.techniqueRef;a.drawPhase&n&&(null==e||a.type===e)&&i.render(t)}}addRecord(i,a,s,r,d,l,o,c){let u=s,_=r;if(_||(u=d,_=l),!_)return;if(null==this._head){const t=new h(i,a,o,u,_);return this._head=new n(t),this._tail=this._head,this._length++,void this._minOrderedLength++}if(c===t.STRICT_ORDER)return this._insert(i,a,o,u,_,this._tail,null);let g=null,m=this._head;const f=i.instanceId,y=i.techniqueRef.symbologyPlane;if(c===t.STRICT_MARKERS_AND_TEXT&&(y===e.MARKER||y===e.TEXT))return this._insert(i,a,o,u,_,this._tail,null);for(;m;){const t=m.data.instance,e=t.instanceId,n=t.techniqueRef.symbologyPlane,s=g?.data.instance.instanceId;if(y<n||f===s&&f!==e)return this._insert(i,a,o,u,_,g,m);g=m,m=m.next}this._insert(i,a,o,u,_,g,null)}*infos(){if(null!=this._head)for(const t of this._head.values())yield t}_insert(t,e,i,a,s,r,d){if(null==r&&null==d){const r=new h(t,e,i,a,s);return this._head=new n(r),this._tail=this._head,this._length++,void this._minOrderedLength++}return e!==this._tail.data.materialKey&&this._minOrderedLength++,this._materialKeys.add(e),null==r&&null!=d?this._insertAtHead(t,e,i,a,s,d):null!=r&&null==d?this._insertAtEnd(t,e,i,a,s,r):null!=r&&null!=d?this._insertAtMiddle(t,e,i,a,s,r,d):void 0}_insertAtHead(t,e,i,a,s,r){const d=a+s;if(e===r.data.materialKey&&i===r.data.target&&d===r.data.start)r.data.start=a,r.data.count+=s;else{const d=new h(t,e,i,a,s);this._head=new n(d),this._head.next=r,this._length++}}_insertAtEnd(t,e,i,a,s,r){if(r.data.materialKey===e&&r.data.indexEnd===a)r.data.count+=s;else{const d=new h(t,e,i,a,s);this._tail=new n(d),r.next=this._tail,this._length++}}_insertAtMiddle(t,e,i,a,s,r,d){const l=a+s;if(r.data.materialKey===e&&r.data.target===i&&r.data.indexEnd===a)r.data.count+=s,r.data.materialKey===d.data.materialKey&&r.data.target===d.data.target&&r.data.indexEnd===d.data.start&&(r.data.count+=d.data.count,r.next=d.next,this._length--);else if(e===d.data.materialKey&&i===d.data.target&&l===d.data.start)d.data.start=a,d.data.count+=s;else{const l=new h(t,e,i,a,s),o=new n(l);r.next=o,o.next=d,this._length++}}}export{l as DisplayList,h as DisplayListInfo};