@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 3.9 kB
JavaScript
/*
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/4.33/esri/copyright.txt for details.
*/
import{reallocShrinkThreshold as t,reallocGrowthFactor as i,reallocShrinkFactor as e}from"../../../../../core/arrayUtils.js";import{BufferViewVec3f as s,BufferViewMat3f as a,BufferViewVec4f as r,BufferViewVec4u8 as n}from"../../../../../geometry/support/buffer/BufferView.js";import{assert as h}from"../Util.js";import{VertexAttribute as d}from"../VertexAttribute.js";import _ from"./BackedBufferObject.js";class c{constructor(t){this.modelOriginHi=t.getField(d.INSTANCEMODELORIGINHI,s),this.modelOriginLo=t.getField(d.INSTANCEMODELORIGINLO,s),this.model=t.getField(d.INSTANCEMODEL,a),this.modelNormal=t.getField(d.INSTANCEMODELNORMAL,a),this.featureAttribute=t.getField(d.INSTANCEFEATUREATTRIBUTE,r),this.color=t.getField(d.INSTANCECOLOR,n),this.objectAndLayerIdColor=t.getField(d.INSTANCEOBJECTANDLAYERIDCOLOR,n)}}class f{constructor(t,i){this._rctx=t,this._instanceBufferLayout=i,this._headIndex=0,this._tailIndex=0,this._firstIndex=null,this._captureFirstIndex=!0,this._updating=!1,this._prevHeadIndex=0,this._resized=!1,this._capacity=1}destroy(){this._buffer&&this._buffer.destroy()}get buffer(){return this._buffer.buffer}get view(){return this._view}get capacity(){return this._capacity}get size(){const t=this._headIndex,i=this._tailIndex;return t>=i?t-i:t+this._capacity-i}get isEmpty(){return this._headIndex===this._tailIndex}get isFull(){return this._tailIndex===(this._headIndex+1)%this._capacity}get headIndex(){return this._headIndex}get tailIndex(){return this._tailIndex}get firstIndex(){return this._firstIndex}get usedMemory(){return this._buffer?.usedMemory??0}reset(){this._headIndex=0,this._tailIndex=0,this._firstIndex=null}startUpdateCycle(){this._captureFirstIndex=!0}beginUpdate(){h(!this._updating,"already updating"),this._updating=!0,this._prevHeadIndex=this._headIndex}endUpdate(){h(this._updating,"not updating"),this.size<t*this.capacity&&this._shrink(),this._resized?(this._buffer.transferAll(),this._resized=!1):this._transferRange(this._prevHeadIndex,this._headIndex),this._updating=!1}allocateHead(){h(this._updating,"not updating"),this.isFull&&this._grow();const t=this.headIndex;return this._captureFirstIndex&&(this._firstIndex=t,this._captureFirstIndex=!1),this._incrementHead(),h(this._headIndex!==this._tailIndex,"invalid pointers"),t}freeTail(){h(this._updating,"not updating"),h(this.size>0,"invalid size");const t=this._tailIndex===this._firstIndex;this._incrementTail(),t&&(this._firstIndex=this._tailIndex)}_grow(){const t=Math.max(u,Math.floor(this._capacity*i));this._resize(t)}_shrink(){const t=Math.max(u,Math.floor(this._capacity*e));this._resize(t)}_resize(t){if(h(this._updating,"not updating"),t===this._capacity)return;const i=new _(this._rctx,this._instanceBufferLayout.stride,t);if(this._buffer){this._firstIndex&&(this._firstIndex=(this._firstIndex+this._capacity-this._tailIndex)%this._capacity);const t=this.size,e=this._compactInstances(i);h(e===t,"invalid compaction"),this._buffer.destroy(),this._tailIndex=0,this._headIndex=e,this._prevHeadIndex=0}this._resized=!0,this._capacity=t,this._buffer=i,this._view=new c(this._instanceBufferLayout.createView(this._buffer.array))}_compactInstances(t){const i=this._headIndex,e=this._tailIndex;return e<i?(this._buffer.copyRange(e,i,t),i-e):e>i?(this._buffer.copyRange(e,this._capacity,t),i>0&&this._buffer.copyRange(0,i,t,this._capacity-e),i+(this._capacity-e)):0}_incrementHead(t=1){this._headIndex=(this._headIndex+t)%this._capacity}_incrementTail(t=1){this._tailIndex=(this._tailIndex+t)%this._capacity}_transferRange(t,i){t<i?this._buffer.transferRange(t,i):t>i&&(i>0&&this._buffer.transferRange(0,i),this._buffer.transferRange(t,this._capacity))}}const u=64;export{f as RenderInstanceData,c as RenderInstanceDataView,u as initialCapacity};