readAccessorPacked.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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. * Returns the accessor data in a contiguous array.
  9. *
  10. * @param {Object} gltf A javascript object containing a glTF asset.
  11. * @param {Object} accessor The accessor.
  12. * @returns {Array} The accessor values in a contiguous array.
  13. *
  14. * @private
  15. */
  16. function readAccessorPacked(gltf, accessor) {
  17. const byteStride = getAccessorByteStride(gltf, accessor);
  18. const componentTypeByteLength = ComponentDatatype.getSizeInBytes(
  19. accessor.componentType
  20. );
  21. const numberOfComponents = numberOfComponentsForType(accessor.type);
  22. const count = accessor.count;
  23. const values = new Array(numberOfComponents * count);
  24. if (!defined(accessor.bufferView)) {
  25. arrayFill(values, 0);
  26. return values;
  27. }
  28. const bufferView = gltf.bufferViews[accessor.bufferView];
  29. const source = gltf.buffers[bufferView.buffer].extras._pipeline.source;
  30. let byteOffset =
  31. accessor.byteOffset + bufferView.byteOffset + source.byteOffset;
  32. const dataView = new DataView(source.buffer);
  33. const components = new Array(numberOfComponents);
  34. const componentReader = getComponentReader(accessor.componentType);
  35. for (let i = 0; i < count; ++i) {
  36. componentReader(
  37. dataView,
  38. byteOffset,
  39. numberOfComponents,
  40. componentTypeByteLength,
  41. components
  42. );
  43. for (let j = 0; j < numberOfComponents; ++j) {
  44. values[i * numberOfComponents + j] = components[j];
  45. }
  46. byteOffset += byteStride;
  47. }
  48. return values;
  49. }
  50. export default readAccessorPacked;