@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 3.63 kB
JavaScript
import{BufferViewVec3f as t,BufferViewMat3f as i,BufferViewVec4f as e,BufferViewVec4u8 as s}from"../../../../../geometry/support/buffer/BufferView.js";import{assert as a}from"../Util.js";import{VertexAttribute as r}from"../VertexAttribute.js";import h from"./BackedBufferObject.js";class n{constructor(a){this.modelOriginHi=a.getField(r.MODELORIGINHI,t),this.modelOriginLo=a.getField(r.MODELORIGINLO,t),this.model=a.getField(r.MODEL,i),this.modelNormal=a.getField(r.MODELNORMAL,i),this.color=a.getField(r.INSTANCECOLOR,e),this.featureAttribute=a.getField(r.INSTANCEFEATUREATTRIBUTE,e),this.objectAndLayerIdColor=a.getField(r.OBJECTANDLAYERIDCOLOR_INSTANCED,s)}}class d{constructor(t,i){this._headIndex=0,this._tailIndex=0,this._firstIndex=null,this._captureFirstIndex=!0,this._updating=!1,this._prevHeadIndex=0,this._resized=!1,this._rctx=t,this._instanceBufferLayout=i,this._elementSize=i.stride,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 memoryUsage(){return this._buffer?this._buffer.memoryUsage:{cpu:0,gpu:0}}reset(){this._headIndex=0,this._tailIndex=0,this._firstIndex=null}startUpdateCycle(){this._captureFirstIndex=!0}beginUpdate(){a(!this._updating,"already updating"),this._updating=!0,this._prevHeadIndex=this._headIndex}endUpdate(){a(this._updating,"not updating"),this.size<f*this.capacity&&this._shrink(),this._resized?(this._buffer.transferAll(),this._resized=!1):this._transferRange(this._prevHeadIndex,this._headIndex),this._updating=!1}allocateHead(){a(this._updating,"not updating"),this.isFull&&this._grow();const t=this.headIndex;return this._captureFirstIndex&&(this._firstIndex=t,this._captureFirstIndex=!1),this._incrementHead(),a(this._headIndex!==this._tailIndex,"invalid pointers"),t}freeTail(){a(this._updating,"not updating"),a(this.size>0,"invalid size");const t=this._tailIndex===this._firstIndex;this._incrementTail(),t&&(this._firstIndex=this._tailIndex)}_grow(){const t=Math.max(_,Math.floor(this._capacity*c));this._resize(t)}_shrink(){const t=Math.max(_,Math.floor(this._capacity*u));this._resize(t)}_resize(t){if(a(this._updating,"not updating"),t===this._capacity)return;const i=new h(this._rctx,this._elementSize,t);if(this._buffer){this._firstIndex&&(this._firstIndex=(this._firstIndex+this._capacity-this._tailIndex)%this._capacity);const t=this.size,e=this._compactInstances(i);a(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 n(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 _=1024,c=2,f=.3,u=.5;export{d as RenderInstanceData,n as RenderInstanceDataView};