{"version":3,"file":"PRWMLoader.cjs","sources":["../../src/loaders/PRWMLoader.js"],"sourcesContent":["import { BufferAttribute, BufferGeometry, FileLoader, Loader } from 'three'\n\n/**\n * See https://github.com/kchapelier/PRWM for more informations about this file format\n */\n\nlet bigEndianPlatform = null\n\n/**\n * Check if the endianness of the platform is big-endian (most significant bit first)\n * @returns {boolean} True if big-endian, false if little-endian\n */\nfunction isBigEndianPlatform() {\n  if (bigEndianPlatform === null) {\n    const buffer = new ArrayBuffer(2),\n      uint8Array = new Uint8Array(buffer),\n      uint16Array = new Uint16Array(buffer)\n\n    uint8Array[0] = 0xaa // set first byte\n    uint8Array[1] = 0xbb // set second byte\n    bigEndianPlatform = uint16Array[0] === 0xaabb\n  }\n\n  return bigEndianPlatform\n}\n\n// match the values defined in the spec to the TypedArray types\nconst InvertedEncodingTypes = [\n  null,\n  Float32Array,\n  null,\n  Int8Array,\n  Int16Array,\n  null,\n  Int32Array,\n  Uint8Array,\n  Uint16Array,\n  null,\n  Uint32Array,\n]\n\n// define the method to use on a DataView, corresponding the TypedArray type\nconst getMethods = {\n  Uint16Array: 'getUint16',\n  Uint32Array: 'getUint32',\n  Int16Array: 'getInt16',\n  Int32Array: 'getInt32',\n  Float32Array: 'getFloat32',\n  Float64Array: 'getFloat64',\n}\n\nfunction copyFromBuffer(sourceArrayBuffer, viewType, position, length, fromBigEndian) {\n  const bytesPerElement = viewType.BYTES_PER_ELEMENT\n  let result\n\n  if (fromBigEndian === isBigEndianPlatform() || bytesPerElement === 1) {\n    result = new viewType(sourceArrayBuffer, position, length)\n  } else {\n    const readView = new DataView(sourceArrayBuffer, position, length * bytesPerElement),\n      getMethod = getMethods[viewType.name],\n      littleEndian = !fromBigEndian\n\n    result = new viewType(length)\n\n    for (let i = 0; i < length; i++) {\n      result[i] = readView[getMethod](i * bytesPerElement, littleEndian)\n    }\n  }\n\n  return result\n}\n\nfunction decodePrwm(buffer) {\n  const array = new Uint8Array(buffer),\n    version = array[0]\n\n  let flags = array[1]\n\n  const indexedGeometry = !!((flags >> 7) & 0x01),\n    indicesType = (flags >> 6) & 0x01,\n    bigEndian = ((flags >> 5) & 0x01) === 1,\n    attributesNumber = flags & 0x1f\n\n  let valuesNumber = 0,\n    indicesNumber = 0\n\n  if (bigEndian) {\n    valuesNumber = (array[2] << 16) + (array[3] << 8) + array[4]\n    indicesNumber = (array[5] << 16) + (array[6] << 8) + array[7]\n  } else {\n    valuesNumber = array[2] + (array[3] << 8) + (array[4] << 16)\n    indicesNumber = array[5] + (array[6] << 8) + (array[7] << 16)\n  }\n\n  /** PRELIMINARY CHECKS **/\n\n  if (version === 0) {\n    throw new Error('PRWM decoder: Invalid format version: 0')\n  } else if (version !== 1) {\n    throw new Error('PRWM decoder: Unsupported format version: ' + version)\n  }\n\n  if (!indexedGeometry) {\n    if (indicesType !== 0) {\n      throw new Error('PRWM decoder: Indices type must be set to 0 for non-indexed geometries')\n    } else if (indicesNumber !== 0) {\n      throw new Error('PRWM decoder: Number of indices must be set to 0 for non-indexed geometries')\n    }\n  }\n\n  /** PARSING **/\n\n  let pos = 8\n\n  const attributes = {}\n\n  for (let i = 0; i < attributesNumber; i++) {\n    let attributeName = ''\n\n    while (pos < array.length) {\n      const char = array[pos]\n      pos++\n\n      if (char === 0) {\n        break\n      } else {\n        attributeName += String.fromCharCode(char)\n      }\n    }\n\n    flags = array[pos]\n\n    const attributeType = (flags >> 7) & 0x01\n    const cardinality = ((flags >> 4) & 0x03) + 1\n    const encodingType = flags & 0x0f\n    const arrayType = InvertedEncodingTypes[encodingType]\n\n    pos++\n\n    // padding to next multiple of 4\n    pos = Math.ceil(pos / 4) * 4\n\n    const values = copyFromBuffer(buffer, arrayType, pos, cardinality * valuesNumber, bigEndian)\n\n    pos += arrayType.BYTES_PER_ELEMENT * cardinality * valuesNumber\n\n    attributes[attributeName] = {\n      type: attributeType,\n      cardinality: cardinality,\n      values: values,\n    }\n  }\n\n  pos = Math.ceil(pos / 4) * 4\n\n  let indices = null\n\n  if (indexedGeometry) {\n    indices = copyFromBuffer(buffer, indicesType === 1 ? Uint32Array : Uint16Array, pos, indicesNumber, bigEndian)\n  }\n\n  return {\n    version: version,\n    attributes: attributes,\n    indices: indices,\n  }\n}\n\n// Define the public interface\n\nconst PRWMLoader = /* @__PURE__ */ (() => {\n  class PRWMLoader extends Loader {\n    constructor(manager) {\n      super(manager)\n    }\n\n    load(url, onLoad, onProgress, onError) {\n      const scope = this\n\n      const loader = new FileLoader(scope.manager)\n      loader.setPath(scope.path)\n      loader.setResponseType('arraybuffer')\n      loader.setRequestHeader(scope.requestHeader)\n      loader.setWithCredentials(scope.withCredentials)\n\n      url = url.replace(/\\*/g, isBigEndianPlatform() ? 'be' : 'le')\n\n      loader.load(\n        url,\n        function (arrayBuffer) {\n          try {\n            onLoad(scope.parse(arrayBuffer))\n          } catch (e) {\n            if (onError) {\n              onError(e)\n            } else {\n              console.error(e)\n            }\n\n            scope.manager.itemError(url)\n          }\n        },\n        onProgress,\n        onError,\n      )\n    }\n\n    parse(arrayBuffer) {\n      const data = decodePrwm(arrayBuffer),\n        attributesKey = Object.keys(data.attributes),\n        bufferGeometry = new BufferGeometry()\n\n      for (let i = 0; i < attributesKey.length; i++) {\n        const attribute = data.attributes[attributesKey[i]]\n        bufferGeometry.setAttribute(\n          attributesKey[i],\n          new BufferAttribute(attribute.values, attribute.cardinality, attribute.normalized),\n        )\n      }\n\n      if (data.indices !== null) {\n        bufferGeometry.setIndex(new BufferAttribute(data.indices, 1))\n      }\n\n      return bufferGeometry\n    }\n\n    static isBigEndianPlatform() {\n      return isBigEndianPlatform()\n    }\n  }\n\n  return PRWMLoader\n})()\n\nexport { PRWMLoader }\n"],"names":["PRWMLoader","Loader","FileLoader","BufferGeometry","BufferAttribute"],"mappings":"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"}