findAccessorMinMax.js 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import getAccessorByteStride from './getAccessorByteStride.js'
  2. import getComponentReader from './getComponentReader.js'
  3. import numberOfComponentsForType from './numberOfComponentsForType.js'
  4. import arrayFill from '../../Core/arrayFill.js'
  5. import ComponentDatatype from '../../Core/ComponentDatatype.js'
  6. import defined from '../../Core/defined.js'
  7. /**
  8. * Finds the min and max values of the accessor.
  9. *
  10. * @param {Object} gltf A javascript object containing a glTF asset.
  11. * @param {Object} accessor The accessor object from the glTF asset to read.
  12. * @returns {{min: Array, max: Array}} min holding the array of minimum values and max holding the array of maximum values.
  13. *
  14. * @private
  15. */
  16. function findAccessorMinMax(gltf, accessor) {
  17. var bufferViews = gltf.bufferViews;
  18. var buffers = gltf.buffers;
  19. var bufferViewId = accessor.bufferView;
  20. var numberOfComponents = numberOfComponentsForType(accessor.type);
  21. // According to the spec, when bufferView is not defined, accessor must be initialized with zeros
  22. if (!defined(accessor.bufferView)) {
  23. return {
  24. min: arrayFill(new Array(numberOfComponents), 0.0),
  25. max: arrayFill(new Array(numberOfComponents), 0.0)
  26. };
  27. }
  28. var min = arrayFill(new Array(numberOfComponents), Number.POSITIVE_INFINITY);
  29. var max = arrayFill(new Array(numberOfComponents), Number.NEGATIVE_INFINITY);
  30. var bufferView = bufferViews[bufferViewId];
  31. var bufferId = bufferView.buffer;
  32. var buffer = buffers[bufferId];
  33. var source = buffer.extras._pipeline.source;
  34. var count = accessor.count;
  35. var byteStride = getAccessorByteStride(gltf, accessor);
  36. var byteOffset = accessor.byteOffset + bufferView.byteOffset + source.byteOffset;
  37. var componentType = accessor.componentType;
  38. var componentTypeByteLength = ComponentDatatype.getSizeInBytes(componentType);
  39. var dataView = new DataView(source.buffer);
  40. var components = new Array(numberOfComponents);
  41. var componentReader = getComponentReader(componentType);
  42. for (var i = 0; i < count; i++) {
  43. componentReader(dataView, byteOffset, numberOfComponents, componentTypeByteLength, components);
  44. for (var j = 0; j < numberOfComponents; j++) {
  45. var value = components[j];
  46. min[j] = Math.min(min[j], value);
  47. max[j] = Math.max(max[j], value);
  48. }
  49. byteOffset += byteStride;
  50. }
  51. return {
  52. min: min,
  53. max: max
  54. };
  55. }
  56. export default findAccessorMinMax;