You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

65 lines
2.6 KiB
JavaScript

import getAccessorByteStride from './getAccessorByteStride.js'
import getComponentReader from './getComponentReader.js'
import numberOfComponentsForType from './numberOfComponentsForType.js'
import arrayFill from '../../Core/arrayFill.js'
import ComponentDatatype from '../../Core/ComponentDatatype.js'
import defined from '../../Core/defined.js'
/**
* Finds the min and max values of the accessor.
*
* @param {Object} gltf A javascript object containing a glTF asset.
* @param {Object} accessor The accessor object from the glTF asset to read.
* @returns {{min: Array, max: Array}} min holding the array of minimum values and max holding the array of maximum values.
*
* @private
*/
function findAccessorMinMax(gltf, accessor) {
var bufferViews = gltf.bufferViews;
var buffers = gltf.buffers;
var bufferViewId = accessor.bufferView;
var numberOfComponents = numberOfComponentsForType(accessor.type);
// According to the spec, when bufferView is not defined, accessor must be initialized with zeros
if (!defined(accessor.bufferView)) {
return {
min: arrayFill(new Array(numberOfComponents), 0.0),
max: arrayFill(new Array(numberOfComponents), 0.0)
};
}
var min = arrayFill(new Array(numberOfComponents), Number.POSITIVE_INFINITY);
var max = arrayFill(new Array(numberOfComponents), Number.NEGATIVE_INFINITY);
var bufferView = bufferViews[bufferViewId];
var bufferId = bufferView.buffer;
var buffer = buffers[bufferId];
var source = buffer.extras._pipeline.source;
var count = accessor.count;
var byteStride = getAccessorByteStride(gltf, accessor);
var byteOffset = accessor.byteOffset + bufferView.byteOffset + source.byteOffset;
var componentType = accessor.componentType;
var componentTypeByteLength = ComponentDatatype.getSizeInBytes(componentType);
var dataView = new DataView(source.buffer);
var components = new Array(numberOfComponents);
var componentReader = getComponentReader(componentType);
for (var i = 0; i < count; i++) {
componentReader(dataView, byteOffset, numberOfComponents, componentTypeByteLength, components);
for (var j = 0; j < numberOfComponents; j++) {
var value = components[j];
min[j] = Math.min(min[j], value);
max[j] = Math.max(max[j], value);
}
byteOffset += byteStride;
}
return {
min: min,
max: max
};
}
export default findAccessorMinMax;