in modules/core/src/lib/attribute/attribute.js [296:348]
_autoUpdater(attribute, {data, startRow, endRow, props, numInstances}) {
if (attribute.constant) {
return;
}
const {settings, state, value, size, startIndices} = attribute;
const {accessor, transform} = settings;
const accessorFunc =
state.binaryAccessor || (typeof accessor === 'function' ? accessor : props[accessor]);
assert(typeof accessorFunc === 'function', `accessor "${accessor}" is not a function`);
let i = attribute.getVertexOffset(startRow);
const {iterable, objectInfo} = createIterable(data, startRow, endRow);
for (const object of iterable) {
objectInfo.index++;
let objectValue = accessorFunc(object, objectInfo);
if (transform) {
// transform callbacks could be bound to a particular layer instance.
// always point `this` to the current layer.
objectValue = transform.call(this, objectValue);
}
if (startIndices) {
const numVertices =
(objectInfo.index < startIndices.length - 1
? startIndices[objectInfo.index + 1]
: numInstances) - startIndices[objectInfo.index];
if (objectValue && Array.isArray(objectValue[0])) {
let startIndex = i;
for (const item of objectValue) {
attribute._normalizeValue(item, value, startIndex);
startIndex += size;
}
} else if (objectValue && objectValue.length > size) {
value.set(objectValue, i);
} else {
attribute._normalizeValue(objectValue, objectInfo.target, 0);
fillArray({
target: value,
source: objectInfo.target,
start: i,
count: numVertices
});
}
i += numVertices * size;
} else {
attribute._normalizeValue(objectValue, value, i);
i += size;
}
}
}