in modules/core/src/lib/attribute/attribute.js [139:186]
updateBuffer({numInstances, data, props, context}) {
if (!this.needsUpdate()) {
return false;
}
const {
state: {updateRanges},
settings: {update, noAlloc}
} = this;
let updated = true;
if (update) {
// Custom updater - typically for non-instanced layers
for (const [startRow, endRow] of updateRanges) {
update.call(context, this, {data, startRow, endRow, props, numInstances});
}
if (!this.value) {
// no value was assigned during update
} else if (
this.constant ||
this.buffer.byteLength < this.value.byteLength + this.byteOffset
) {
this.setData({
value: this.value,
constant: this.constant
});
} else {
for (const [startRow, endRow] of updateRanges) {
const startOffset = Number.isFinite(startRow) ? this.getVertexOffset(startRow) : 0;
const endOffset = Number.isFinite(endRow)
? this.getVertexOffset(endRow)
: noAlloc || !Number.isFinite(numInstances)
? this.value.length
: numInstances * this.size;
super.updateSubBuffer({startOffset, endOffset});
}
}
this._checkAttributeArray();
} else {
updated = false;
}
this.clearNeedsUpdate();
this.setNeedsRedraw();
return updated;
}