@spearwolf/twopoint5d
Version:
a library to create 2.5d realtime graphics and pixelart with three.js
64 lines • 2.02 kB
JavaScript
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