UNPKG

@spearwolf/twopoint5d

Version:

a library to create 2.5d realtime graphics and pixelart with three.js

64 lines 2.02 kB
import { VOBufferPool } from './VOBufferPool.js'; import { VOUtils } from './VOUtils.js'; import { VertexObjectDescriptor } from './VertexObjectDescriptor.js'; import { createVertexObject } from './createVertexObject.js'; export class VertexObjectPool extends VOBufferPool { #voIndex; constructor(descriptor, capacityOrData) { super(descriptor, capacityOrData); this.#voIndex = new Array(this.capacity); } createVO() { if (this.usedCount < this.capacity) { const idx = this.usedCount++; const vo = this.#createVO(idx); this.#voIndex[idx] = vo; return vo; } return undefined; } containsVO(vo) { return VOUtils.isBuffer(vo, this.buffer); } freeVO(vo) { if (!this.containsVO(vo)) return; const idx = VOUtils.getIndex(vo); const lastUsedIdx = this.usedCount - 1; if (idx === lastUsedIdx) { this.#destroyVO(idx); } else { this.buffer.copyWithin(idx, lastUsedIdx, lastUsedIdx + 1); const lastUsedVO = this.#voIndex[lastUsedIdx]; VOUtils.setIndex(lastUsedVO, idx); this.#voIndex[idx] = lastUsedVO; } this.usedCount--; VOUtils.clearBuffer(vo); } getVO(idx) { let vo = this.#voIndex[idx]; if (vo == null && idx < this.usedCount) { vo = this.#createVO(idx); this.#voIndex[idx] = vo; } return vo; } #destroyVO(idx) { const vo = this.#voIndex[idx]; if (vo != null && this.onDestroyVO != null) { this.onDestroyVO(vo); } this.#voIndex[idx] = undefined; } #createVO(idx) { const vo = createVertexObject(this.descriptor, this.buffer, idx); this.buffer.touch(); if (this.onCreateVO != null) { return this.onCreateVO(vo) ?? vo; } return vo; } } //# sourceMappingURL=VertexObjectPool.js.map