12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- 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;
|