UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 3.61 kB
import{applySome as t,isNone as i,unwrapOrThrow as e}from"../../../../../core/maybe.js";import{TypedBuffer as r}from"../BufferPool.js";import{FreeList as s}from"./FreeList.js";import{BufferObject as h}from"../../../../webgl/BufferObject.js";import{Usage as n}from"../../../../webgl/enums.js";const a=1.25,u=32767,d=u<<16|u;class f{constructor(t,i,e,s){const h=r.create(i*e*Uint32Array.BYTES_PER_ELEMENT,s);this.size=i,this.strideInt=e,this.bufferType=t,this.dirty={start:1/0,end:0},this._gpu=null,this._cpu=h,this.clear()}get elementSize(){return this._cpu.length/this.strideInt}get invalidated(){return this.bufferSize>0&&!this._gpu}get invalidatedComputeBuffer(){return this.bufferSize>0&&!this._gpuComputeTriangles}invalidate(){this._invalidateTriangleBuffer(),t(this._gpu,(t=>t.dispose())),this._gpu=null}_invalidateTriangleBuffer(){t(this._gpuComputeTriangles,(t=>t.dispose())),this._gpuComputeTriangles=null}destroy(){t(this._gpu,(t=>t.dispose())),t(this._gpuComputeTriangles,(t=>t.dispose())),t(this._cpu,(t=>t.destroy())),t(this._cpu2,(t=>t.destroy()))}clear(){this.dirty.start=1/0,this.dirty.end=0,this.freeList=new s({start:0,end:this._cpu.length/this.strideInt}),this.fillPointer=0}ensure(t){if(this.maxAvailableSpace()>=t)return;if(t*this.strideInt>this._cpu.length-this.fillPointer){this.invalidate();const i=this._cpu.length/this.strideInt,e=Math.round((i+t)*a),r=e*this.strideInt;this._cpu.expand(r*Uint32Array.BYTES_PER_ELEMENT),this.freeList.free(i,e-i)}}set(t,i){this._cpu.array[t]!==i&&(this._cpu.array[t]=i,this.dirty.start=Math.min(t,this.dirty.start),this.dirty.end=Math.max(t,this.dirty.end))}getGPUBuffer(t,e=!1){if(!this.bufferSize)return null;if(e){if("index"!==this.bufferType)throw new Error("Tired to get triangle buffer, but target is not an index buffer");return i(this._gpuComputeTriangles)&&(this._gpuComputeTriangles=this._createComputeBuffer(t)),this._gpuComputeTriangles}return i(this._gpu)&&(this._gpu=this._createBuffer(t)),this._gpu}getCPUBuffer(){if(!this._cpu2){const t=this._cpu.slice();this._cpu2=t}return this._cpu2.length!==this._cpu.length&&this._cpu2.expand(this._cpu.length*this._cpu.array.BYTES_PER_ELEMENT),this._cpu2.set(this._cpu),this._cpu2}get bufferSize(){return this._cpu.length/this.strideInt}maxAvailableSpace(){return this.freeList.maxAvailableSpace()}insert(t,i,r,s){const h=r*this.strideInt;if(!h)return 0;const n=i*this.strideInt*Uint32Array.BYTES_PER_ELEMENT,a=new Uint32Array(t,n,h),u=e(this.freeList.firstFit(r),"First fit region must be defined")*this.strideInt,d=h,f=u/this.strideInt-i;if(0!==s)for(let e=0;e<a.length;e++)a[e]+=s;return this._cpu.array.set(a,u),this.dirty.start=Math.min(this.dirty.start,u),this.dirty.end=Math.max(this.dirty.end,u+d),this.fillPointer=Math.max(this.fillPointer,u+d),f}free(t,i,e){const r=t*this.strideInt,s=(t+i)*this.strideInt;if(!0===e)for(let h=t;h!==t+i;h++)this._cpu.array[h*this.strideInt]=d;this.dirty.start=Math.min(this.dirty.start,r),this.dirty.end=Math.max(this.dirty.end,s),this.freeList.free(t,i)}upload(){if(this.dirty.end){if(this._invalidateTriangleBuffer(),i(this._gpu))return this.dirty.start=1/0,void(this.dirty.end=0);this._gpu.setSubData(this._cpu.array,this.dirty.start,this.dirty.start,this.dirty.end),this.dirty.start=1/0,this.dirty.end=0}}_createBuffer(t){const i=n.DYNAMIC_DRAW;return"index"===this.bufferType?h.createIndex(t,i,this._cpu.array):h.createVertex(t,i,this._cpu.array)}_createComputeBuffer(t){const i=n.DYNAMIC_DRAW,e=new Uint32Array(this.fillPointer/3);for(let r=0;r<this.fillPointer;r+=3)e[r/3]=this._cpu.array[r];return h.createIndex(t,i,e)}}export{f as Buffer};