readAccessorPacked.js 1.7 KB

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