three-stdlib 2.30.2 → 2.30.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. package/_polyfill/LoaderUtils.cjs +18 -0
  2. package/_polyfill/LoaderUtils.cjs.map +1 -0
  3. package/_polyfill/LoaderUtils.js +18 -0
  4. package/_polyfill/LoaderUtils.js.map +1 -0
  5. package/loaders/3MFLoader.cjs +4 -3
  6. package/loaders/3MFLoader.cjs.map +1 -1
  7. package/loaders/3MFLoader.js +5 -4
  8. package/loaders/3MFLoader.js.map +1 -1
  9. package/loaders/AMFLoader.cjs +2 -1
  10. package/loaders/AMFLoader.cjs.map +1 -1
  11. package/loaders/AMFLoader.js +3 -2
  12. package/loaders/AMFLoader.js.map +1 -1
  13. package/loaders/FBXLoader.cjs +3 -2
  14. package/loaders/FBXLoader.cjs.map +1 -1
  15. package/loaders/FBXLoader.js +3 -2
  16. package/loaders/FBXLoader.js.map +1 -1
  17. package/loaders/GLTFLoader.cjs +5 -4
  18. package/loaders/GLTFLoader.cjs.map +1 -1
  19. package/loaders/GLTFLoader.js +5 -4
  20. package/loaders/GLTFLoader.js.map +1 -1
  21. package/loaders/KTX2Loader.cjs +3 -3
  22. package/loaders/KTX2Loader.cjs.map +1 -1
  23. package/loaders/KTX2Loader.js +3 -3
  24. package/loaders/KTX2Loader.js.map +1 -1
  25. package/loaders/PCDLoader.cjs +2 -1
  26. package/loaders/PCDLoader.cjs.map +1 -1
  27. package/loaders/PCDLoader.js +3 -2
  28. package/loaders/PCDLoader.js.map +1 -1
  29. package/loaders/PLYLoader.cjs +2 -1
  30. package/loaders/PLYLoader.cjs.map +1 -1
  31. package/loaders/PLYLoader.js +3 -2
  32. package/loaders/PLYLoader.js.map +1 -1
  33. package/loaders/STLLoader.cjs +2 -1
  34. package/loaders/STLLoader.cjs.map +1 -1
  35. package/loaders/STLLoader.js +3 -2
  36. package/loaders/STLLoader.js.map +1 -1
  37. package/loaders/VTKLoader.cjs +4 -3
  38. package/loaders/VTKLoader.cjs.map +1 -1
  39. package/loaders/VTKLoader.js +5 -4
  40. package/loaders/VTKLoader.js.map +1 -1
  41. package/loaders/XLoader.cjs +3 -2
  42. package/loaders/XLoader.cjs.map +1 -1
  43. package/loaders/XLoader.js +3 -2
  44. package/loaders/XLoader.js.map +1 -1
  45. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"PCDLoader.js","sources":["../../src/loaders/PCDLoader.js"],"sourcesContent":["import { BufferGeometry, FileLoader, Float32BufferAttribute, Loader, LoaderUtils, Points, PointsMaterial } from 'three'\n\nclass PCDLoader extends Loader {\n constructor(manager) {\n super(manager)\n\n this.littleEndian = true\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 loader.load(\n url,\n function (data) {\n try {\n onLoad(scope.parse(data, url))\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(data, url) {\n // from https://gitlab.com/taketwo/three-pcd-loader/blob/master/decompress-lzf.js\n\n function decompressLZF(inData, outLength) {\n const inLength = inData.length\n const outData = new Uint8Array(outLength)\n let inPtr = 0\n let outPtr = 0\n let ctrl\n let len\n let ref\n do {\n ctrl = inData[inPtr++]\n if (ctrl < 1 << 5) {\n ctrl++\n if (outPtr + ctrl > outLength) throw new Error('Output buffer is not large enough')\n if (inPtr + ctrl > inLength) throw new Error('Invalid compressed data')\n do {\n outData[outPtr++] = inData[inPtr++]\n } while (--ctrl)\n } else {\n len = ctrl >> 5\n ref = outPtr - ((ctrl & 0x1f) << 8) - 1\n if (inPtr >= inLength) throw new Error('Invalid compressed data')\n if (len === 7) {\n len += inData[inPtr++]\n if (inPtr >= inLength) throw new Error('Invalid compressed data')\n }\n\n ref -= inData[inPtr++]\n if (outPtr + len + 2 > outLength) throw new Error('Output buffer is not large enough')\n if (ref < 0) throw new Error('Invalid compressed data')\n if (ref >= outPtr) throw new Error('Invalid compressed data')\n do {\n outData[outPtr++] = outData[ref++]\n } while (--len + 2)\n }\n } while (inPtr < inLength)\n\n return outData\n }\n\n function parseHeader(data) {\n const PCDheader = {}\n const result1 = data.search(/[\\r\\n]DATA\\s(\\S*)\\s/i)\n const result2 = /[\\r\\n]DATA\\s(\\S*)\\s/i.exec(data.substr(result1 - 1))\n\n PCDheader.data = result2[1]\n PCDheader.headerLen = result2[0].length + result1\n PCDheader.str = data.substr(0, PCDheader.headerLen)\n\n // remove comments\n\n PCDheader.str = PCDheader.str.replace(/\\#.*/gi, '')\n\n // parse\n\n PCDheader.version = /VERSION (.*)/i.exec(PCDheader.str)\n PCDheader.fields = /FIELDS (.*)/i.exec(PCDheader.str)\n PCDheader.size = /SIZE (.*)/i.exec(PCDheader.str)\n PCDheader.type = /TYPE (.*)/i.exec(PCDheader.str)\n PCDheader.count = /COUNT (.*)/i.exec(PCDheader.str)\n PCDheader.width = /WIDTH (.*)/i.exec(PCDheader.str)\n PCDheader.height = /HEIGHT (.*)/i.exec(PCDheader.str)\n PCDheader.viewpoint = /VIEWPOINT (.*)/i.exec(PCDheader.str)\n PCDheader.points = /POINTS (.*)/i.exec(PCDheader.str)\n\n // evaluate\n\n if (PCDheader.version !== null) PCDheader.version = parseFloat(PCDheader.version[1])\n\n if (PCDheader.fields !== null) PCDheader.fields = PCDheader.fields[1].split(' ')\n\n if (PCDheader.type !== null) PCDheader.type = PCDheader.type[1].split(' ')\n\n if (PCDheader.width !== null) PCDheader.width = parseInt(PCDheader.width[1])\n\n if (PCDheader.height !== null) PCDheader.height = parseInt(PCDheader.height[1])\n\n if (PCDheader.viewpoint !== null) PCDheader.viewpoint = PCDheader.viewpoint[1]\n\n if (PCDheader.points !== null) PCDheader.points = parseInt(PCDheader.points[1], 10)\n\n if (PCDheader.points === null) PCDheader.points = PCDheader.width * PCDheader.height\n\n if (PCDheader.size !== null) {\n PCDheader.size = PCDheader.size[1].split(' ').map(function (x) {\n return parseInt(x, 10)\n })\n }\n\n if (PCDheader.count !== null) {\n PCDheader.count = PCDheader.count[1].split(' ').map(function (x) {\n return parseInt(x, 10)\n })\n } else {\n PCDheader.count = []\n\n for (let i = 0, l = PCDheader.fields.length; i < l; i++) {\n PCDheader.count.push(1)\n }\n }\n\n PCDheader.offset = {}\n\n let sizeSum = 0\n\n for (let i = 0, l = PCDheader.fields.length; i < l; i++) {\n if (PCDheader.data === 'ascii') {\n PCDheader.offset[PCDheader.fields[i]] = i\n } else {\n PCDheader.offset[PCDheader.fields[i]] = sizeSum\n sizeSum += PCDheader.size[i] * PCDheader.count[i]\n }\n }\n\n // for binary only\n\n PCDheader.rowSize = sizeSum\n\n return PCDheader\n }\n\n const textData = LoaderUtils.decodeText(new Uint8Array(data))\n\n // parse header (always ascii format)\n\n const PCDheader = parseHeader(textData)\n\n // parse data\n\n const position = []\n const normal = []\n const color = []\n\n // ascii\n\n if (PCDheader.data === 'ascii') {\n const offset = PCDheader.offset\n const pcdData = textData.substr(PCDheader.headerLen)\n const lines = pcdData.split('\\n')\n\n for (let i = 0, l = lines.length; i < l; i++) {\n if (lines[i] === '') continue\n\n const line = lines[i].split(' ')\n\n if (offset.x !== undefined) {\n position.push(parseFloat(line[offset.x]))\n position.push(parseFloat(line[offset.y]))\n position.push(parseFloat(line[offset.z]))\n }\n\n if (offset.rgb !== undefined) {\n const rgb = parseFloat(line[offset.rgb])\n const r = (rgb >> 16) & 0x0000ff\n const g = (rgb >> 8) & 0x0000ff\n const b = (rgb >> 0) & 0x0000ff\n color.push(r / 255, g / 255, b / 255)\n }\n\n if (offset.normal_x !== undefined) {\n normal.push(parseFloat(line[offset.normal_x]))\n normal.push(parseFloat(line[offset.normal_y]))\n normal.push(parseFloat(line[offset.normal_z]))\n }\n }\n }\n\n // binary-compressed\n\n // normally data in PCD files are organized as array of structures: XYZRGBXYZRGB\n // binary compressed PCD files organize their data as structure of arrays: XXYYZZRGBRGB\n // that requires a totally different parsing approach compared to non-compressed data\n\n if (PCDheader.data === 'binary_compressed') {\n const sizes = new Uint32Array(data.slice(PCDheader.headerLen, PCDheader.headerLen + 8))\n const compressedSize = sizes[0]\n const decompressedSize = sizes[1]\n const decompressed = decompressLZF(\n new Uint8Array(data, PCDheader.headerLen + 8, compressedSize),\n decompressedSize,\n )\n const dataview = new DataView(decompressed.buffer)\n\n const offset = PCDheader.offset\n\n for (let i = 0; i < PCDheader.points; i++) {\n if (offset.x !== undefined) {\n position.push(dataview.getFloat32(PCDheader.points * offset.x + PCDheader.size[0] * i, this.littleEndian))\n position.push(dataview.getFloat32(PCDheader.points * offset.y + PCDheader.size[1] * i, this.littleEndian))\n position.push(dataview.getFloat32(PCDheader.points * offset.z + PCDheader.size[2] * i, this.littleEndian))\n }\n\n if (offset.rgb !== undefined) {\n color.push(dataview.getUint8(PCDheader.points * offset.rgb + PCDheader.size[3] * i + 2) / 255.0)\n color.push(dataview.getUint8(PCDheader.points * offset.rgb + PCDheader.size[3] * i + 1) / 255.0)\n color.push(dataview.getUint8(PCDheader.points * offset.rgb + PCDheader.size[3] * i + 0) / 255.0)\n }\n\n if (offset.normal_x !== undefined) {\n normal.push(\n dataview.getFloat32(PCDheader.points * offset.normal_x + PCDheader.size[4] * i, this.littleEndian),\n )\n normal.push(\n dataview.getFloat32(PCDheader.points * offset.normal_y + PCDheader.size[5] * i, this.littleEndian),\n )\n normal.push(\n dataview.getFloat32(PCDheader.points * offset.normal_z + PCDheader.size[6] * i, this.littleEndian),\n )\n }\n }\n }\n\n // binary\n\n if (PCDheader.data === 'binary') {\n const dataview = new DataView(data, PCDheader.headerLen)\n const offset = PCDheader.offset\n\n for (let i = 0, row = 0; i < PCDheader.points; i++, row += PCDheader.rowSize) {\n if (offset.x !== undefined) {\n position.push(dataview.getFloat32(row + offset.x, this.littleEndian))\n position.push(dataview.getFloat32(row + offset.y, this.littleEndian))\n position.push(dataview.getFloat32(row + offset.z, this.littleEndian))\n }\n\n if (offset.rgb !== undefined) {\n color.push(dataview.getUint8(row + offset.rgb + 2) / 255.0)\n color.push(dataview.getUint8(row + offset.rgb + 1) / 255.0)\n color.push(dataview.getUint8(row + offset.rgb + 0) / 255.0)\n }\n\n if (offset.normal_x !== undefined) {\n normal.push(dataview.getFloat32(row + offset.normal_x, this.littleEndian))\n normal.push(dataview.getFloat32(row + offset.normal_y, this.littleEndian))\n normal.push(dataview.getFloat32(row + offset.normal_z, this.littleEndian))\n }\n }\n }\n\n // build geometry\n\n const geometry = new BufferGeometry()\n\n if (position.length > 0) geometry.setAttribute('position', new Float32BufferAttribute(position, 3))\n if (normal.length > 0) geometry.setAttribute('normal', new Float32BufferAttribute(normal, 3))\n if (color.length > 0) geometry.setAttribute('color', new Float32BufferAttribute(color, 3))\n\n geometry.computeBoundingSphere()\n\n // build material\n\n const material = new PointsMaterial({ size: 0.005 })\n\n if (color.length > 0) {\n material.vertexColors = true\n } else {\n material.color.setHex(Math.random() * 0xffffff)\n }\n\n // build point cloud\n\n const mesh = new Points(geometry, material)\n let name = url.split('').reverse().join('')\n name = /([^\\/]*)/.exec(name)\n name = name[1].split('').reverse().join('')\n mesh.name = name\n\n return mesh\n }\n}\n\nexport { PCDLoader }\n"],"names":["data","PCDheader"],"mappings":";AAEA,MAAM,kBAAkB,OAAO;AAAA,EAC7B,YAAY,SAAS;AACnB,UAAM,OAAO;AAEb,SAAK,eAAe;AAAA,EACrB;AAAA,EAED,KAAK,KAAK,QAAQ,YAAY,SAAS;AACrC,UAAM,QAAQ;AAEd,UAAM,SAAS,IAAI,WAAW,MAAM,OAAO;AAC3C,WAAO,QAAQ,MAAM,IAAI;AACzB,WAAO,gBAAgB,aAAa;AACpC,WAAO,iBAAiB,MAAM,aAAa;AAC3C,WAAO,mBAAmB,MAAM,eAAe;AAC/C,WAAO;AAAA,MACL;AAAA,MACA,SAAU,MAAM;AACd,YAAI;AACF,iBAAO,MAAM,MAAM,MAAM,GAAG,CAAC;AAAA,QAC9B,SAAQ,GAAP;AACA,cAAI,SAAS;AACX,oBAAQ,CAAC;AAAA,UACrB,OAAiB;AACL,oBAAQ,MAAM,CAAC;AAAA,UAChB;AAED,gBAAM,QAAQ,UAAU,GAAG;AAAA,QAC5B;AAAA,MACF;AAAA,MACD;AAAA,MACA;AAAA,IACD;AAAA,EACF;AAAA,EAED,MAAM,MAAM,KAAK;AAGf,aAAS,cAAc,QAAQ,WAAW;AACxC,YAAM,WAAW,OAAO;AACxB,YAAM,UAAU,IAAI,WAAW,SAAS;AACxC,UAAI,QAAQ;AACZ,UAAI,SAAS;AACb,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,SAAG;AACD,eAAO,OAAO,OAAO;AACrB,YAAI,OAAO,KAAK,GAAG;AACjB;AACA,cAAI,SAAS,OAAO;AAAW,kBAAM,IAAI,MAAM,mCAAmC;AAClF,cAAI,QAAQ,OAAO;AAAU,kBAAM,IAAI,MAAM,yBAAyB;AACtE,aAAG;AACD,oBAAQ,QAAQ,IAAI,OAAO,OAAO;AAAA,UACnC,SAAQ,EAAE;AAAA,QACrB,OAAe;AACL,gBAAM,QAAQ;AACd,gBAAM,WAAW,OAAO,OAAS,KAAK;AACtC,cAAI,SAAS;AAAU,kBAAM,IAAI,MAAM,yBAAyB;AAChE,cAAI,QAAQ,GAAG;AACb,mBAAO,OAAO,OAAO;AACrB,gBAAI,SAAS;AAAU,oBAAM,IAAI,MAAM,yBAAyB;AAAA,UACjE;AAED,iBAAO,OAAO,OAAO;AACrB,cAAI,SAAS,MAAM,IAAI;AAAW,kBAAM,IAAI,MAAM,mCAAmC;AACrF,cAAI,MAAM;AAAG,kBAAM,IAAI,MAAM,yBAAyB;AACtD,cAAI,OAAO;AAAQ,kBAAM,IAAI,MAAM,yBAAyB;AAC5D,aAAG;AACD,oBAAQ,QAAQ,IAAI,QAAQ,KAAK;AAAA,UAC7C,SAAmB,EAAE,MAAM;AAAA,QAClB;AAAA,MACT,SAAe,QAAQ;AAEjB,aAAO;AAAA,IACR;AAED,aAAS,YAAYA,OAAM;AACzB,YAAMC,aAAY,CAAE;AACpB,YAAM,UAAUD,MAAK,OAAO,sBAAsB;AAClD,YAAM,UAAU,uBAAuB,KAAKA,MAAK,OAAO,UAAU,CAAC,CAAC;AAEpE,MAAAC,WAAU,OAAO,QAAQ,CAAC;AAC1B,MAAAA,WAAU,YAAY,QAAQ,CAAC,EAAE,SAAS;AAC1C,MAAAA,WAAU,MAAMD,MAAK,OAAO,GAAGC,WAAU,SAAS;AAIlD,MAAAA,WAAU,MAAMA,WAAU,IAAI,QAAQ,UAAU,EAAE;AAIlD,MAAAA,WAAU,UAAU,gBAAgB,KAAKA,WAAU,GAAG;AACtD,MAAAA,WAAU,SAAS,eAAe,KAAKA,WAAU,GAAG;AACpD,MAAAA,WAAU,OAAO,aAAa,KAAKA,WAAU,GAAG;AAChD,MAAAA,WAAU,OAAO,aAAa,KAAKA,WAAU,GAAG;AAChD,MAAAA,WAAU,QAAQ,cAAc,KAAKA,WAAU,GAAG;AAClD,MAAAA,WAAU,QAAQ,cAAc,KAAKA,WAAU,GAAG;AAClD,MAAAA,WAAU,SAAS,eAAe,KAAKA,WAAU,GAAG;AACpD,MAAAA,WAAU,YAAY,kBAAkB,KAAKA,WAAU,GAAG;AAC1D,MAAAA,WAAU,SAAS,eAAe,KAAKA,WAAU,GAAG;AAIpD,UAAIA,WAAU,YAAY;AAAM,QAAAA,WAAU,UAAU,WAAWA,WAAU,QAAQ,CAAC,CAAC;AAEnF,UAAIA,WAAU,WAAW;AAAM,QAAAA,WAAU,SAASA,WAAU,OAAO,CAAC,EAAE,MAAM,GAAG;AAE/E,UAAIA,WAAU,SAAS;AAAM,QAAAA,WAAU,OAAOA,WAAU,KAAK,CAAC,EAAE,MAAM,GAAG;AAEzE,UAAIA,WAAU,UAAU;AAAM,QAAAA,WAAU,QAAQ,SAASA,WAAU,MAAM,CAAC,CAAC;AAE3E,UAAIA,WAAU,WAAW;AAAM,QAAAA,WAAU,SAAS,SAASA,WAAU,OAAO,CAAC,CAAC;AAE9E,UAAIA,WAAU,cAAc;AAAM,QAAAA,WAAU,YAAYA,WAAU,UAAU,CAAC;AAE7E,UAAIA,WAAU,WAAW;AAAM,QAAAA,WAAU,SAAS,SAASA,WAAU,OAAO,CAAC,GAAG,EAAE;AAElF,UAAIA,WAAU,WAAW;AAAM,QAAAA,WAAU,SAASA,WAAU,QAAQA,WAAU;AAE9E,UAAIA,WAAU,SAAS,MAAM;AAC3B,QAAAA,WAAU,OAAOA,WAAU,KAAK,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,SAAU,GAAG;AAC7D,iBAAO,SAAS,GAAG,EAAE;AAAA,QAC/B,CAAS;AAAA,MACF;AAED,UAAIA,WAAU,UAAU,MAAM;AAC5B,QAAAA,WAAU,QAAQA,WAAU,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,SAAU,GAAG;AAC/D,iBAAO,SAAS,GAAG,EAAE;AAAA,QAC/B,CAAS;AAAA,MACT,OAAa;AACL,QAAAA,WAAU,QAAQ,CAAE;AAEpB,iBAAS,IAAI,GAAG,IAAIA,WAAU,OAAO,QAAQ,IAAI,GAAG,KAAK;AACvD,UAAAA,WAAU,MAAM,KAAK,CAAC;AAAA,QACvB;AAAA,MACF;AAED,MAAAA,WAAU,SAAS,CAAE;AAErB,UAAI,UAAU;AAEd,eAAS,IAAI,GAAG,IAAIA,WAAU,OAAO,QAAQ,IAAI,GAAG,KAAK;AACvD,YAAIA,WAAU,SAAS,SAAS;AAC9B,UAAAA,WAAU,OAAOA,WAAU,OAAO,CAAC,CAAC,IAAI;AAAA,QAClD,OAAe;AACL,UAAAA,WAAU,OAAOA,WAAU,OAAO,CAAC,CAAC,IAAI;AACxC,qBAAWA,WAAU,KAAK,CAAC,IAAIA,WAAU,MAAM,CAAC;AAAA,QACjD;AAAA,MACF;AAID,MAAAA,WAAU,UAAU;AAEpB,aAAOA;AAAA,IACR;AAED,UAAM,WAAW,YAAY,WAAW,IAAI,WAAW,IAAI,CAAC;AAI5D,UAAM,YAAY,YAAY,QAAQ;AAItC,UAAM,WAAW,CAAE;AACnB,UAAM,SAAS,CAAE;AACjB,UAAM,QAAQ,CAAE;AAIhB,QAAI,UAAU,SAAS,SAAS;AAC9B,YAAM,SAAS,UAAU;AACzB,YAAM,UAAU,SAAS,OAAO,UAAU,SAAS;AACnD,YAAM,QAAQ,QAAQ,MAAM,IAAI;AAEhC,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,IAAI,GAAG,KAAK;AAC5C,YAAI,MAAM,CAAC,MAAM;AAAI;AAErB,cAAM,OAAO,MAAM,CAAC,EAAE,MAAM,GAAG;AAE/B,YAAI,OAAO,MAAM,QAAW;AAC1B,mBAAS,KAAK,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC;AACxC,mBAAS,KAAK,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC;AACxC,mBAAS,KAAK,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC;AAAA,QACzC;AAED,YAAI,OAAO,QAAQ,QAAW;AAC5B,gBAAM,MAAM,WAAW,KAAK,OAAO,GAAG,CAAC;AACvC,gBAAM,IAAK,OAAO,KAAM;AACxB,gBAAM,IAAK,OAAO,IAAK;AACvB,gBAAM,IAAK,OAAO,IAAK;AACvB,gBAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG;AAAA,QACrC;AAED,YAAI,OAAO,aAAa,QAAW;AACjC,iBAAO,KAAK,WAAW,KAAK,OAAO,QAAQ,CAAC,CAAC;AAC7C,iBAAO,KAAK,WAAW,KAAK,OAAO,QAAQ,CAAC,CAAC;AAC7C,iBAAO,KAAK,WAAW,KAAK,OAAO,QAAQ,CAAC,CAAC;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAQD,QAAI,UAAU,SAAS,qBAAqB;AAC1C,YAAM,QAAQ,IAAI,YAAY,KAAK,MAAM,UAAU,WAAW,UAAU,YAAY,CAAC,CAAC;AACtF,YAAM,iBAAiB,MAAM,CAAC;AAC9B,YAAM,mBAAmB,MAAM,CAAC;AAChC,YAAM,eAAe;AAAA,QACnB,IAAI,WAAW,MAAM,UAAU,YAAY,GAAG,cAAc;AAAA,QAC5D;AAAA,MACD;AACD,YAAM,WAAW,IAAI,SAAS,aAAa,MAAM;AAEjD,YAAM,SAAS,UAAU;AAEzB,eAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,YAAI,OAAO,MAAM,QAAW;AAC1B,mBAAS,KAAK,SAAS,WAAW,UAAU,SAAS,OAAO,IAAI,UAAU,KAAK,CAAC,IAAI,GAAG,KAAK,YAAY,CAAC;AACzG,mBAAS,KAAK,SAAS,WAAW,UAAU,SAAS,OAAO,IAAI,UAAU,KAAK,CAAC,IAAI,GAAG,KAAK,YAAY,CAAC;AACzG,mBAAS,KAAK,SAAS,WAAW,UAAU,SAAS,OAAO,IAAI,UAAU,KAAK,CAAC,IAAI,GAAG,KAAK,YAAY,CAAC;AAAA,QAC1G;AAED,YAAI,OAAO,QAAQ,QAAW;AAC5B,gBAAM,KAAK,SAAS,SAAS,UAAU,SAAS,OAAO,MAAM,UAAU,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,GAAK;AAC/F,gBAAM,KAAK,SAAS,SAAS,UAAU,SAAS,OAAO,MAAM,UAAU,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,GAAK;AAC/F,gBAAM,KAAK,SAAS,SAAS,UAAU,SAAS,OAAO,MAAM,UAAU,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,GAAK;AAAA,QAChG;AAED,YAAI,OAAO,aAAa,QAAW;AACjC,iBAAO;AAAA,YACL,SAAS,WAAW,UAAU,SAAS,OAAO,WAAW,UAAU,KAAK,CAAC,IAAI,GAAG,KAAK,YAAY;AAAA,UAClG;AACD,iBAAO;AAAA,YACL,SAAS,WAAW,UAAU,SAAS,OAAO,WAAW,UAAU,KAAK,CAAC,IAAI,GAAG,KAAK,YAAY;AAAA,UAClG;AACD,iBAAO;AAAA,YACL,SAAS,WAAW,UAAU,SAAS,OAAO,WAAW,UAAU,KAAK,CAAC,IAAI,GAAG,KAAK,YAAY;AAAA,UAClG;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAID,QAAI,UAAU,SAAS,UAAU;AAC/B,YAAM,WAAW,IAAI,SAAS,MAAM,UAAU,SAAS;AACvD,YAAM,SAAS,UAAU;AAEzB,eAAS,IAAI,GAAG,MAAM,GAAG,IAAI,UAAU,QAAQ,KAAK,OAAO,UAAU,SAAS;AAC5E,YAAI,OAAO,MAAM,QAAW;AAC1B,mBAAS,KAAK,SAAS,WAAW,MAAM,OAAO,GAAG,KAAK,YAAY,CAAC;AACpE,mBAAS,KAAK,SAAS,WAAW,MAAM,OAAO,GAAG,KAAK,YAAY,CAAC;AACpE,mBAAS,KAAK,SAAS,WAAW,MAAM,OAAO,GAAG,KAAK,YAAY,CAAC;AAAA,QACrE;AAED,YAAI,OAAO,QAAQ,QAAW;AAC5B,gBAAM,KAAK,SAAS,SAAS,MAAM,OAAO,MAAM,CAAC,IAAI,GAAK;AAC1D,gBAAM,KAAK,SAAS,SAAS,MAAM,OAAO,MAAM,CAAC,IAAI,GAAK;AAC1D,gBAAM,KAAK,SAAS,SAAS,MAAM,OAAO,MAAM,CAAC,IAAI,GAAK;AAAA,QAC3D;AAED,YAAI,OAAO,aAAa,QAAW;AACjC,iBAAO,KAAK,SAAS,WAAW,MAAM,OAAO,UAAU,KAAK,YAAY,CAAC;AACzE,iBAAO,KAAK,SAAS,WAAW,MAAM,OAAO,UAAU,KAAK,YAAY,CAAC;AACzE,iBAAO,KAAK,SAAS,WAAW,MAAM,OAAO,UAAU,KAAK,YAAY,CAAC;AAAA,QAC1E;AAAA,MACF;AAAA,IACF;AAID,UAAM,WAAW,IAAI,eAAgB;AAErC,QAAI,SAAS,SAAS;AAAG,eAAS,aAAa,YAAY,IAAI,uBAAuB,UAAU,CAAC,CAAC;AAClG,QAAI,OAAO,SAAS;AAAG,eAAS,aAAa,UAAU,IAAI,uBAAuB,QAAQ,CAAC,CAAC;AAC5F,QAAI,MAAM,SAAS;AAAG,eAAS,aAAa,SAAS,IAAI,uBAAuB,OAAO,CAAC,CAAC;AAEzF,aAAS,sBAAuB;AAIhC,UAAM,WAAW,IAAI,eAAe,EAAE,MAAM,KAAK,CAAE;AAEnD,QAAI,MAAM,SAAS,GAAG;AACpB,eAAS,eAAe;AAAA,IAC9B,OAAW;AACL,eAAS,MAAM,OAAO,KAAK,OAAM,IAAK,QAAQ;AAAA,IAC/C;AAID,UAAM,OAAO,IAAI,OAAO,UAAU,QAAQ;AAC1C,QAAI,OAAO,IAAI,MAAM,EAAE,EAAE,QAAS,EAAC,KAAK,EAAE;AAC1C,WAAO,WAAW,KAAK,IAAI;AAC3B,WAAO,KAAK,CAAC,EAAE,MAAM,EAAE,EAAE,QAAO,EAAG,KAAK,EAAE;AAC1C,SAAK,OAAO;AAEZ,WAAO;AAAA,EACR;AACH;"}
1
+ {"version":3,"file":"PCDLoader.js","sources":["../../src/loaders/PCDLoader.js"],"sourcesContent":["import { BufferGeometry, FileLoader, Float32BufferAttribute, Loader, LoaderUtils, Points, PointsMaterial } from 'three'\nimport { decodeText } from '../_polyfill/LoaderUtils'\n\nclass PCDLoader extends Loader {\n constructor(manager) {\n super(manager)\n\n this.littleEndian = true\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 loader.load(\n url,\n function (data) {\n try {\n onLoad(scope.parse(data, url))\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(data, url) {\n // from https://gitlab.com/taketwo/three-pcd-loader/blob/master/decompress-lzf.js\n\n function decompressLZF(inData, outLength) {\n const inLength = inData.length\n const outData = new Uint8Array(outLength)\n let inPtr = 0\n let outPtr = 0\n let ctrl\n let len\n let ref\n do {\n ctrl = inData[inPtr++]\n if (ctrl < 1 << 5) {\n ctrl++\n if (outPtr + ctrl > outLength) throw new Error('Output buffer is not large enough')\n if (inPtr + ctrl > inLength) throw new Error('Invalid compressed data')\n do {\n outData[outPtr++] = inData[inPtr++]\n } while (--ctrl)\n } else {\n len = ctrl >> 5\n ref = outPtr - ((ctrl & 0x1f) << 8) - 1\n if (inPtr >= inLength) throw new Error('Invalid compressed data')\n if (len === 7) {\n len += inData[inPtr++]\n if (inPtr >= inLength) throw new Error('Invalid compressed data')\n }\n\n ref -= inData[inPtr++]\n if (outPtr + len + 2 > outLength) throw new Error('Output buffer is not large enough')\n if (ref < 0) throw new Error('Invalid compressed data')\n if (ref >= outPtr) throw new Error('Invalid compressed data')\n do {\n outData[outPtr++] = outData[ref++]\n } while (--len + 2)\n }\n } while (inPtr < inLength)\n\n return outData\n }\n\n function parseHeader(data) {\n const PCDheader = {}\n const result1 = data.search(/[\\r\\n]DATA\\s(\\S*)\\s/i)\n const result2 = /[\\r\\n]DATA\\s(\\S*)\\s/i.exec(data.substr(result1 - 1))\n\n PCDheader.data = result2[1]\n PCDheader.headerLen = result2[0].length + result1\n PCDheader.str = data.substr(0, PCDheader.headerLen)\n\n // remove comments\n\n PCDheader.str = PCDheader.str.replace(/\\#.*/gi, '')\n\n // parse\n\n PCDheader.version = /VERSION (.*)/i.exec(PCDheader.str)\n PCDheader.fields = /FIELDS (.*)/i.exec(PCDheader.str)\n PCDheader.size = /SIZE (.*)/i.exec(PCDheader.str)\n PCDheader.type = /TYPE (.*)/i.exec(PCDheader.str)\n PCDheader.count = /COUNT (.*)/i.exec(PCDheader.str)\n PCDheader.width = /WIDTH (.*)/i.exec(PCDheader.str)\n PCDheader.height = /HEIGHT (.*)/i.exec(PCDheader.str)\n PCDheader.viewpoint = /VIEWPOINT (.*)/i.exec(PCDheader.str)\n PCDheader.points = /POINTS (.*)/i.exec(PCDheader.str)\n\n // evaluate\n\n if (PCDheader.version !== null) PCDheader.version = parseFloat(PCDheader.version[1])\n\n if (PCDheader.fields !== null) PCDheader.fields = PCDheader.fields[1].split(' ')\n\n if (PCDheader.type !== null) PCDheader.type = PCDheader.type[1].split(' ')\n\n if (PCDheader.width !== null) PCDheader.width = parseInt(PCDheader.width[1])\n\n if (PCDheader.height !== null) PCDheader.height = parseInt(PCDheader.height[1])\n\n if (PCDheader.viewpoint !== null) PCDheader.viewpoint = PCDheader.viewpoint[1]\n\n if (PCDheader.points !== null) PCDheader.points = parseInt(PCDheader.points[1], 10)\n\n if (PCDheader.points === null) PCDheader.points = PCDheader.width * PCDheader.height\n\n if (PCDheader.size !== null) {\n PCDheader.size = PCDheader.size[1].split(' ').map(function (x) {\n return parseInt(x, 10)\n })\n }\n\n if (PCDheader.count !== null) {\n PCDheader.count = PCDheader.count[1].split(' ').map(function (x) {\n return parseInt(x, 10)\n })\n } else {\n PCDheader.count = []\n\n for (let i = 0, l = PCDheader.fields.length; i < l; i++) {\n PCDheader.count.push(1)\n }\n }\n\n PCDheader.offset = {}\n\n let sizeSum = 0\n\n for (let i = 0, l = PCDheader.fields.length; i < l; i++) {\n if (PCDheader.data === 'ascii') {\n PCDheader.offset[PCDheader.fields[i]] = i\n } else {\n PCDheader.offset[PCDheader.fields[i]] = sizeSum\n sizeSum += PCDheader.size[i] * PCDheader.count[i]\n }\n }\n\n // for binary only\n\n PCDheader.rowSize = sizeSum\n\n return PCDheader\n }\n\n const textData = decodeText(new Uint8Array(data))\n\n // parse header (always ascii format)\n\n const PCDheader = parseHeader(textData)\n\n // parse data\n\n const position = []\n const normal = []\n const color = []\n\n // ascii\n\n if (PCDheader.data === 'ascii') {\n const offset = PCDheader.offset\n const pcdData = textData.substr(PCDheader.headerLen)\n const lines = pcdData.split('\\n')\n\n for (let i = 0, l = lines.length; i < l; i++) {\n if (lines[i] === '') continue\n\n const line = lines[i].split(' ')\n\n if (offset.x !== undefined) {\n position.push(parseFloat(line[offset.x]))\n position.push(parseFloat(line[offset.y]))\n position.push(parseFloat(line[offset.z]))\n }\n\n if (offset.rgb !== undefined) {\n const rgb = parseFloat(line[offset.rgb])\n const r = (rgb >> 16) & 0x0000ff\n const g = (rgb >> 8) & 0x0000ff\n const b = (rgb >> 0) & 0x0000ff\n color.push(r / 255, g / 255, b / 255)\n }\n\n if (offset.normal_x !== undefined) {\n normal.push(parseFloat(line[offset.normal_x]))\n normal.push(parseFloat(line[offset.normal_y]))\n normal.push(parseFloat(line[offset.normal_z]))\n }\n }\n }\n\n // binary-compressed\n\n // normally data in PCD files are organized as array of structures: XYZRGBXYZRGB\n // binary compressed PCD files organize their data as structure of arrays: XXYYZZRGBRGB\n // that requires a totally different parsing approach compared to non-compressed data\n\n if (PCDheader.data === 'binary_compressed') {\n const sizes = new Uint32Array(data.slice(PCDheader.headerLen, PCDheader.headerLen + 8))\n const compressedSize = sizes[0]\n const decompressedSize = sizes[1]\n const decompressed = decompressLZF(\n new Uint8Array(data, PCDheader.headerLen + 8, compressedSize),\n decompressedSize,\n )\n const dataview = new DataView(decompressed.buffer)\n\n const offset = PCDheader.offset\n\n for (let i = 0; i < PCDheader.points; i++) {\n if (offset.x !== undefined) {\n position.push(dataview.getFloat32(PCDheader.points * offset.x + PCDheader.size[0] * i, this.littleEndian))\n position.push(dataview.getFloat32(PCDheader.points * offset.y + PCDheader.size[1] * i, this.littleEndian))\n position.push(dataview.getFloat32(PCDheader.points * offset.z + PCDheader.size[2] * i, this.littleEndian))\n }\n\n if (offset.rgb !== undefined) {\n color.push(dataview.getUint8(PCDheader.points * offset.rgb + PCDheader.size[3] * i + 2) / 255.0)\n color.push(dataview.getUint8(PCDheader.points * offset.rgb + PCDheader.size[3] * i + 1) / 255.0)\n color.push(dataview.getUint8(PCDheader.points * offset.rgb + PCDheader.size[3] * i + 0) / 255.0)\n }\n\n if (offset.normal_x !== undefined) {\n normal.push(\n dataview.getFloat32(PCDheader.points * offset.normal_x + PCDheader.size[4] * i, this.littleEndian),\n )\n normal.push(\n dataview.getFloat32(PCDheader.points * offset.normal_y + PCDheader.size[5] * i, this.littleEndian),\n )\n normal.push(\n dataview.getFloat32(PCDheader.points * offset.normal_z + PCDheader.size[6] * i, this.littleEndian),\n )\n }\n }\n }\n\n // binary\n\n if (PCDheader.data === 'binary') {\n const dataview = new DataView(data, PCDheader.headerLen)\n const offset = PCDheader.offset\n\n for (let i = 0, row = 0; i < PCDheader.points; i++, row += PCDheader.rowSize) {\n if (offset.x !== undefined) {\n position.push(dataview.getFloat32(row + offset.x, this.littleEndian))\n position.push(dataview.getFloat32(row + offset.y, this.littleEndian))\n position.push(dataview.getFloat32(row + offset.z, this.littleEndian))\n }\n\n if (offset.rgb !== undefined) {\n color.push(dataview.getUint8(row + offset.rgb + 2) / 255.0)\n color.push(dataview.getUint8(row + offset.rgb + 1) / 255.0)\n color.push(dataview.getUint8(row + offset.rgb + 0) / 255.0)\n }\n\n if (offset.normal_x !== undefined) {\n normal.push(dataview.getFloat32(row + offset.normal_x, this.littleEndian))\n normal.push(dataview.getFloat32(row + offset.normal_y, this.littleEndian))\n normal.push(dataview.getFloat32(row + offset.normal_z, this.littleEndian))\n }\n }\n }\n\n // build geometry\n\n const geometry = new BufferGeometry()\n\n if (position.length > 0) geometry.setAttribute('position', new Float32BufferAttribute(position, 3))\n if (normal.length > 0) geometry.setAttribute('normal', new Float32BufferAttribute(normal, 3))\n if (color.length > 0) geometry.setAttribute('color', new Float32BufferAttribute(color, 3))\n\n geometry.computeBoundingSphere()\n\n // build material\n\n const material = new PointsMaterial({ size: 0.005 })\n\n if (color.length > 0) {\n material.vertexColors = true\n } else {\n material.color.setHex(Math.random() * 0xffffff)\n }\n\n // build point cloud\n\n const mesh = new Points(geometry, material)\n let name = url.split('').reverse().join('')\n name = /([^\\/]*)/.exec(name)\n name = name[1].split('').reverse().join('')\n mesh.name = name\n\n return mesh\n }\n}\n\nexport { PCDLoader }\n"],"names":["data","PCDheader"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const THREE = require("three");
4
+ const LoaderUtils = require("../_polyfill/LoaderUtils.cjs");
4
5
  class PLYLoader extends THREE.Loader {
5
6
  constructor(manager) {
6
7
  super(manager);
@@ -305,7 +306,7 @@ class PLYLoader extends THREE.Loader {
305
306
  let geometry;
306
307
  const scope = this;
307
308
  if (data instanceof ArrayBuffer) {
308
- const text = THREE.LoaderUtils.decodeText(new Uint8Array(data));
309
+ const text = LoaderUtils.decodeText(new Uint8Array(data));
309
310
  const header = parseHeader(text);
310
311
  geometry = header.format === "ascii" ? parseASCII(text, header) : parseBinary(data, header);
311
312
  } else {
@@ -1 +1 @@
1
- {"version":3,"file":"PLYLoader.cjs","sources":["../../src/loaders/PLYLoader.js"],"sourcesContent":["import { BufferGeometry, FileLoader, Float32BufferAttribute, Loader, LoaderUtils } from 'three'\n\n/**\n * Description: A THREE loader for PLY ASCII files (known as the Polygon\n * File Format or the Stanford Triangle Format).\n *\n * Limitations: ASCII decoding assumes file is UTF-8.\n *\n * Usage:\n *\tconst loader = new PLYLoader();\n *\tloader.load('./models/ply/ascii/dolphins.ply', function (geometry) {\n *\n *\t\tscene.add( new THREE.Mesh( geometry ) );\n *\n *\t} );\n *\n * If the PLY file uses non standard property names, they can be mapped while\n * loading. For example, the following maps the properties\n * “diffuse_(red|green|blue)” in the file to standard color names.\n *\n * loader.setPropertyNameMapping( {\n *\tdiffuse_red: 'red',\n *\tdiffuse_green: 'green',\n *\tdiffuse_blue: 'blue'\n * } );\n *\n */\n\nclass PLYLoader extends Loader {\n constructor(manager) {\n super(manager)\n\n this.propertyNameMapping = {}\n }\n\n load(url, onLoad, onProgress, onError) {\n const scope = this\n\n const loader = new FileLoader(this.manager)\n loader.setPath(this.path)\n loader.setResponseType('arraybuffer')\n loader.setRequestHeader(this.requestHeader)\n loader.setWithCredentials(this.withCredentials)\n loader.load(\n url,\n function (text) {\n try {\n onLoad(scope.parse(text))\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 setPropertyNameMapping(mapping) {\n this.propertyNameMapping = mapping\n }\n\n parse(data) {\n function parseHeader(data) {\n const patternHeader = /ply([\\s\\S]*)end_header\\r?\\n/\n let headerText = ''\n let headerLength = 0\n const result = patternHeader.exec(data)\n\n if (result !== null) {\n headerText = result[1]\n headerLength = new Blob([result[0]]).size\n }\n\n const header = {\n comments: [],\n elements: [],\n headerLength: headerLength,\n objInfo: '',\n }\n\n const lines = headerText.split('\\n')\n let currentElement\n\n function make_ply_element_property(propertValues, propertyNameMapping) {\n const property = { type: propertValues[0] }\n\n if (property.type === 'list') {\n property.name = propertValues[3]\n property.countType = propertValues[1]\n property.itemType = propertValues[2]\n } else {\n property.name = propertValues[1]\n }\n\n if (property.name in propertyNameMapping) {\n property.name = propertyNameMapping[property.name]\n }\n\n return property\n }\n\n for (let i = 0; i < lines.length; i++) {\n let line = lines[i]\n line = line.trim()\n\n if (line === '') continue\n\n const lineValues = line.split(/\\s+/)\n const lineType = lineValues.shift()\n line = lineValues.join(' ')\n\n switch (lineType) {\n case 'format':\n header.format = lineValues[0]\n header.version = lineValues[1]\n\n break\n\n case 'comment':\n header.comments.push(line)\n\n break\n\n case 'element':\n if (currentElement !== undefined) {\n header.elements.push(currentElement)\n }\n\n currentElement = {}\n currentElement.name = lineValues[0]\n currentElement.count = parseInt(lineValues[1])\n currentElement.properties = []\n\n break\n\n case 'property':\n currentElement.properties.push(make_ply_element_property(lineValues, scope.propertyNameMapping))\n\n break\n\n case 'obj_info':\n header.objInfo = line\n\n break\n\n default:\n console.log('unhandled', lineType, lineValues)\n }\n }\n\n if (currentElement !== undefined) {\n header.elements.push(currentElement)\n }\n\n return header\n }\n\n function parseASCIINumber(n, type) {\n switch (type) {\n case 'char':\n case 'uchar':\n case 'short':\n case 'ushort':\n case 'int':\n case 'uint':\n case 'int8':\n case 'uint8':\n case 'int16':\n case 'uint16':\n case 'int32':\n case 'uint32':\n return parseInt(n)\n\n case 'float':\n case 'double':\n case 'float32':\n case 'float64':\n return parseFloat(n)\n }\n }\n\n function parseASCIIElement(properties, line) {\n const values = line.split(/\\s+/)\n\n const element = {}\n\n for (let i = 0; i < properties.length; i++) {\n if (properties[i].type === 'list') {\n const list = []\n const n = parseASCIINumber(values.shift(), properties[i].countType)\n\n for (let j = 0; j < n; j++) {\n list.push(parseASCIINumber(values.shift(), properties[i].itemType))\n }\n\n element[properties[i].name] = list\n } else {\n element[properties[i].name] = parseASCIINumber(values.shift(), properties[i].type)\n }\n }\n\n return element\n }\n\n function parseASCII(data, header) {\n // PLY ascii format specification, as per http://en.wikipedia.org/wiki/PLY_(file_format)\n\n const buffer = {\n indices: [],\n vertices: [],\n normals: [],\n uvs: [],\n faceVertexUvs: [],\n colors: [],\n }\n\n let result\n\n const patternBody = /end_header\\s([\\s\\S]*)$/\n let body = ''\n if ((result = patternBody.exec(data)) !== null) {\n body = result[1]\n }\n\n const lines = body.split('\\n')\n let currentElement = 0\n let currentElementCount = 0\n\n for (let i = 0; i < lines.length; i++) {\n let line = lines[i]\n line = line.trim()\n if (line === '') {\n continue\n }\n\n if (currentElementCount >= header.elements[currentElement].count) {\n currentElement++\n currentElementCount = 0\n }\n\n const element = parseASCIIElement(header.elements[currentElement].properties, line)\n\n handleElement(buffer, header.elements[currentElement].name, element)\n\n currentElementCount++\n }\n\n return postProcess(buffer)\n }\n\n function postProcess(buffer) {\n let geometry = new BufferGeometry()\n\n // mandatory buffer data\n\n if (buffer.indices.length > 0) {\n geometry.setIndex(buffer.indices)\n }\n\n geometry.setAttribute('position', new Float32BufferAttribute(buffer.vertices, 3))\n\n // optional buffer data\n\n if (buffer.normals.length > 0) {\n geometry.setAttribute('normal', new Float32BufferAttribute(buffer.normals, 3))\n }\n\n if (buffer.uvs.length > 0) {\n geometry.setAttribute('uv', new Float32BufferAttribute(buffer.uvs, 2))\n }\n\n if (buffer.colors.length > 0) {\n geometry.setAttribute('color', new Float32BufferAttribute(buffer.colors, 3))\n }\n\n if (buffer.faceVertexUvs.length > 0) {\n geometry = geometry.toNonIndexed()\n geometry.setAttribute('uv', new Float32BufferAttribute(buffer.faceVertexUvs, 2))\n }\n\n geometry.computeBoundingSphere()\n\n return geometry\n }\n\n function handleElement(buffer, elementName, element) {\n if (elementName === 'vertex') {\n buffer.vertices.push(element.x, element.y, element.z)\n\n if ('nx' in element && 'ny' in element && 'nz' in element) {\n buffer.normals.push(element.nx, element.ny, element.nz)\n }\n\n if ('s' in element && 't' in element) {\n buffer.uvs.push(element.s, element.t)\n }\n\n if ('red' in element && 'green' in element && 'blue' in element) {\n buffer.colors.push(element.red / 255.0, element.green / 255.0, element.blue / 255.0)\n }\n } else if (elementName === 'face') {\n const vertex_indices = element.vertex_indices || element.vertex_index // issue #9338\n const texcoord = element.texcoord\n\n if (vertex_indices.length === 3) {\n buffer.indices.push(vertex_indices[0], vertex_indices[1], vertex_indices[2])\n\n if (texcoord && texcoord.length === 6) {\n buffer.faceVertexUvs.push(texcoord[0], texcoord[1])\n buffer.faceVertexUvs.push(texcoord[2], texcoord[3])\n buffer.faceVertexUvs.push(texcoord[4], texcoord[5])\n }\n } else if (vertex_indices.length === 4) {\n buffer.indices.push(vertex_indices[0], vertex_indices[1], vertex_indices[3])\n buffer.indices.push(vertex_indices[1], vertex_indices[2], vertex_indices[3])\n }\n }\n }\n\n function binaryRead(dataview, at, type, little_endian) {\n switch (type) {\n // corespondences for non-specific length types here match rply:\n case 'int8':\n case 'char':\n return [dataview.getInt8(at), 1]\n case 'uint8':\n case 'uchar':\n return [dataview.getUint8(at), 1]\n case 'int16':\n case 'short':\n return [dataview.getInt16(at, little_endian), 2]\n case 'uint16':\n case 'ushort':\n return [dataview.getUint16(at, little_endian), 2]\n case 'int32':\n case 'int':\n return [dataview.getInt32(at, little_endian), 4]\n case 'uint32':\n case 'uint':\n return [dataview.getUint32(at, little_endian), 4]\n case 'float32':\n case 'float':\n return [dataview.getFloat32(at, little_endian), 4]\n case 'float64':\n case 'double':\n return [dataview.getFloat64(at, little_endian), 8]\n }\n }\n\n function binaryReadElement(dataview, at, properties, little_endian) {\n const element = {}\n let result,\n read = 0\n\n for (let i = 0; i < properties.length; i++) {\n if (properties[i].type === 'list') {\n const list = []\n\n result = binaryRead(dataview, at + read, properties[i].countType, little_endian)\n const n = result[0]\n read += result[1]\n\n for (let j = 0; j < n; j++) {\n result = binaryRead(dataview, at + read, properties[i].itemType, little_endian)\n list.push(result[0])\n read += result[1]\n }\n\n element[properties[i].name] = list\n } else {\n result = binaryRead(dataview, at + read, properties[i].type, little_endian)\n element[properties[i].name] = result[0]\n read += result[1]\n }\n }\n\n return [element, read]\n }\n\n function parseBinary(data, header) {\n const buffer = {\n indices: [],\n vertices: [],\n normals: [],\n uvs: [],\n faceVertexUvs: [],\n colors: [],\n }\n\n const little_endian = header.format === 'binary_little_endian'\n const body = new DataView(data, header.headerLength)\n let result,\n loc = 0\n\n for (let currentElement = 0; currentElement < header.elements.length; currentElement++) {\n for (\n let currentElementCount = 0;\n currentElementCount < header.elements[currentElement].count;\n currentElementCount++\n ) {\n result = binaryReadElement(body, loc, header.elements[currentElement].properties, little_endian)\n loc += result[1]\n const element = result[0]\n\n handleElement(buffer, header.elements[currentElement].name, element)\n }\n }\n\n return postProcess(buffer)\n }\n\n //\n\n let geometry\n const scope = this\n\n if (data instanceof ArrayBuffer) {\n const text = LoaderUtils.decodeText(new Uint8Array(data))\n const header = parseHeader(text)\n\n geometry = header.format === 'ascii' ? parseASCII(text, header) : parseBinary(data, header)\n } else {\n geometry = parseASCII(data, parseHeader(data))\n }\n\n return geometry\n }\n}\n\nexport { PLYLoader }\n"],"names":["Loader","FileLoader","data","geometry","BufferGeometry","Float32BufferAttribute","LoaderUtils"],"mappings":"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"}
1
+ {"version":3,"file":"PLYLoader.cjs","sources":["../../src/loaders/PLYLoader.js"],"sourcesContent":["import { BufferGeometry, FileLoader, Float32BufferAttribute, Loader, LoaderUtils } from 'three'\nimport { decodeText } from '../_polyfill/LoaderUtils'\n\n/**\n * Description: A THREE loader for PLY ASCII files (known as the Polygon\n * File Format or the Stanford Triangle Format).\n *\n * Limitations: ASCII decoding assumes file is UTF-8.\n *\n * Usage:\n *\tconst loader = new PLYLoader();\n *\tloader.load('./models/ply/ascii/dolphins.ply', function (geometry) {\n *\n *\t\tscene.add( new THREE.Mesh( geometry ) );\n *\n *\t} );\n *\n * If the PLY file uses non standard property names, they can be mapped while\n * loading. For example, the following maps the properties\n * “diffuse_(red|green|blue)” in the file to standard color names.\n *\n * loader.setPropertyNameMapping( {\n *\tdiffuse_red: 'red',\n *\tdiffuse_green: 'green',\n *\tdiffuse_blue: 'blue'\n * } );\n *\n */\n\nclass PLYLoader extends Loader {\n constructor(manager) {\n super(manager)\n\n this.propertyNameMapping = {}\n }\n\n load(url, onLoad, onProgress, onError) {\n const scope = this\n\n const loader = new FileLoader(this.manager)\n loader.setPath(this.path)\n loader.setResponseType('arraybuffer')\n loader.setRequestHeader(this.requestHeader)\n loader.setWithCredentials(this.withCredentials)\n loader.load(\n url,\n function (text) {\n try {\n onLoad(scope.parse(text))\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 setPropertyNameMapping(mapping) {\n this.propertyNameMapping = mapping\n }\n\n parse(data) {\n function parseHeader(data) {\n const patternHeader = /ply([\\s\\S]*)end_header\\r?\\n/\n let headerText = ''\n let headerLength = 0\n const result = patternHeader.exec(data)\n\n if (result !== null) {\n headerText = result[1]\n headerLength = new Blob([result[0]]).size\n }\n\n const header = {\n comments: [],\n elements: [],\n headerLength: headerLength,\n objInfo: '',\n }\n\n const lines = headerText.split('\\n')\n let currentElement\n\n function make_ply_element_property(propertValues, propertyNameMapping) {\n const property = { type: propertValues[0] }\n\n if (property.type === 'list') {\n property.name = propertValues[3]\n property.countType = propertValues[1]\n property.itemType = propertValues[2]\n } else {\n property.name = propertValues[1]\n }\n\n if (property.name in propertyNameMapping) {\n property.name = propertyNameMapping[property.name]\n }\n\n return property\n }\n\n for (let i = 0; i < lines.length; i++) {\n let line = lines[i]\n line = line.trim()\n\n if (line === '') continue\n\n const lineValues = line.split(/\\s+/)\n const lineType = lineValues.shift()\n line = lineValues.join(' ')\n\n switch (lineType) {\n case 'format':\n header.format = lineValues[0]\n header.version = lineValues[1]\n\n break\n\n case 'comment':\n header.comments.push(line)\n\n break\n\n case 'element':\n if (currentElement !== undefined) {\n header.elements.push(currentElement)\n }\n\n currentElement = {}\n currentElement.name = lineValues[0]\n currentElement.count = parseInt(lineValues[1])\n currentElement.properties = []\n\n break\n\n case 'property':\n currentElement.properties.push(make_ply_element_property(lineValues, scope.propertyNameMapping))\n\n break\n\n case 'obj_info':\n header.objInfo = line\n\n break\n\n default:\n console.log('unhandled', lineType, lineValues)\n }\n }\n\n if (currentElement !== undefined) {\n header.elements.push(currentElement)\n }\n\n return header\n }\n\n function parseASCIINumber(n, type) {\n switch (type) {\n case 'char':\n case 'uchar':\n case 'short':\n case 'ushort':\n case 'int':\n case 'uint':\n case 'int8':\n case 'uint8':\n case 'int16':\n case 'uint16':\n case 'int32':\n case 'uint32':\n return parseInt(n)\n\n case 'float':\n case 'double':\n case 'float32':\n case 'float64':\n return parseFloat(n)\n }\n }\n\n function parseASCIIElement(properties, line) {\n const values = line.split(/\\s+/)\n\n const element = {}\n\n for (let i = 0; i < properties.length; i++) {\n if (properties[i].type === 'list') {\n const list = []\n const n = parseASCIINumber(values.shift(), properties[i].countType)\n\n for (let j = 0; j < n; j++) {\n list.push(parseASCIINumber(values.shift(), properties[i].itemType))\n }\n\n element[properties[i].name] = list\n } else {\n element[properties[i].name] = parseASCIINumber(values.shift(), properties[i].type)\n }\n }\n\n return element\n }\n\n function parseASCII(data, header) {\n // PLY ascii format specification, as per http://en.wikipedia.org/wiki/PLY_(file_format)\n\n const buffer = {\n indices: [],\n vertices: [],\n normals: [],\n uvs: [],\n faceVertexUvs: [],\n colors: [],\n }\n\n let result\n\n const patternBody = /end_header\\s([\\s\\S]*)$/\n let body = ''\n if ((result = patternBody.exec(data)) !== null) {\n body = result[1]\n }\n\n const lines = body.split('\\n')\n let currentElement = 0\n let currentElementCount = 0\n\n for (let i = 0; i < lines.length; i++) {\n let line = lines[i]\n line = line.trim()\n if (line === '') {\n continue\n }\n\n if (currentElementCount >= header.elements[currentElement].count) {\n currentElement++\n currentElementCount = 0\n }\n\n const element = parseASCIIElement(header.elements[currentElement].properties, line)\n\n handleElement(buffer, header.elements[currentElement].name, element)\n\n currentElementCount++\n }\n\n return postProcess(buffer)\n }\n\n function postProcess(buffer) {\n let geometry = new BufferGeometry()\n\n // mandatory buffer data\n\n if (buffer.indices.length > 0) {\n geometry.setIndex(buffer.indices)\n }\n\n geometry.setAttribute('position', new Float32BufferAttribute(buffer.vertices, 3))\n\n // optional buffer data\n\n if (buffer.normals.length > 0) {\n geometry.setAttribute('normal', new Float32BufferAttribute(buffer.normals, 3))\n }\n\n if (buffer.uvs.length > 0) {\n geometry.setAttribute('uv', new Float32BufferAttribute(buffer.uvs, 2))\n }\n\n if (buffer.colors.length > 0) {\n geometry.setAttribute('color', new Float32BufferAttribute(buffer.colors, 3))\n }\n\n if (buffer.faceVertexUvs.length > 0) {\n geometry = geometry.toNonIndexed()\n geometry.setAttribute('uv', new Float32BufferAttribute(buffer.faceVertexUvs, 2))\n }\n\n geometry.computeBoundingSphere()\n\n return geometry\n }\n\n function handleElement(buffer, elementName, element) {\n if (elementName === 'vertex') {\n buffer.vertices.push(element.x, element.y, element.z)\n\n if ('nx' in element && 'ny' in element && 'nz' in element) {\n buffer.normals.push(element.nx, element.ny, element.nz)\n }\n\n if ('s' in element && 't' in element) {\n buffer.uvs.push(element.s, element.t)\n }\n\n if ('red' in element && 'green' in element && 'blue' in element) {\n buffer.colors.push(element.red / 255.0, element.green / 255.0, element.blue / 255.0)\n }\n } else if (elementName === 'face') {\n const vertex_indices = element.vertex_indices || element.vertex_index // issue #9338\n const texcoord = element.texcoord\n\n if (vertex_indices.length === 3) {\n buffer.indices.push(vertex_indices[0], vertex_indices[1], vertex_indices[2])\n\n if (texcoord && texcoord.length === 6) {\n buffer.faceVertexUvs.push(texcoord[0], texcoord[1])\n buffer.faceVertexUvs.push(texcoord[2], texcoord[3])\n buffer.faceVertexUvs.push(texcoord[4], texcoord[5])\n }\n } else if (vertex_indices.length === 4) {\n buffer.indices.push(vertex_indices[0], vertex_indices[1], vertex_indices[3])\n buffer.indices.push(vertex_indices[1], vertex_indices[2], vertex_indices[3])\n }\n }\n }\n\n function binaryRead(dataview, at, type, little_endian) {\n switch (type) {\n // corespondences for non-specific length types here match rply:\n case 'int8':\n case 'char':\n return [dataview.getInt8(at), 1]\n case 'uint8':\n case 'uchar':\n return [dataview.getUint8(at), 1]\n case 'int16':\n case 'short':\n return [dataview.getInt16(at, little_endian), 2]\n case 'uint16':\n case 'ushort':\n return [dataview.getUint16(at, little_endian), 2]\n case 'int32':\n case 'int':\n return [dataview.getInt32(at, little_endian), 4]\n case 'uint32':\n case 'uint':\n return [dataview.getUint32(at, little_endian), 4]\n case 'float32':\n case 'float':\n return [dataview.getFloat32(at, little_endian), 4]\n case 'float64':\n case 'double':\n return [dataview.getFloat64(at, little_endian), 8]\n }\n }\n\n function binaryReadElement(dataview, at, properties, little_endian) {\n const element = {}\n let result,\n read = 0\n\n for (let i = 0; i < properties.length; i++) {\n if (properties[i].type === 'list') {\n const list = []\n\n result = binaryRead(dataview, at + read, properties[i].countType, little_endian)\n const n = result[0]\n read += result[1]\n\n for (let j = 0; j < n; j++) {\n result = binaryRead(dataview, at + read, properties[i].itemType, little_endian)\n list.push(result[0])\n read += result[1]\n }\n\n element[properties[i].name] = list\n } else {\n result = binaryRead(dataview, at + read, properties[i].type, little_endian)\n element[properties[i].name] = result[0]\n read += result[1]\n }\n }\n\n return [element, read]\n }\n\n function parseBinary(data, header) {\n const buffer = {\n indices: [],\n vertices: [],\n normals: [],\n uvs: [],\n faceVertexUvs: [],\n colors: [],\n }\n\n const little_endian = header.format === 'binary_little_endian'\n const body = new DataView(data, header.headerLength)\n let result,\n loc = 0\n\n for (let currentElement = 0; currentElement < header.elements.length; currentElement++) {\n for (\n let currentElementCount = 0;\n currentElementCount < header.elements[currentElement].count;\n currentElementCount++\n ) {\n result = binaryReadElement(body, loc, header.elements[currentElement].properties, little_endian)\n loc += result[1]\n const element = result[0]\n\n handleElement(buffer, header.elements[currentElement].name, element)\n }\n }\n\n return postProcess(buffer)\n }\n\n //\n\n let geometry\n const scope = this\n\n if (data instanceof ArrayBuffer) {\n const text = decodeText(new Uint8Array(data))\n const header = parseHeader(text)\n\n geometry = header.format === 'ascii' ? parseASCII(text, header) : parseBinary(data, header)\n } else {\n geometry = parseASCII(data, parseHeader(data))\n }\n\n return geometry\n }\n}\n\nexport { PLYLoader }\n"],"names":["Loader","FileLoader","data","geometry","BufferGeometry","Float32BufferAttribute","decodeText"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
- import { Loader, FileLoader, LoaderUtils, BufferGeometry, Float32BufferAttribute } from "three";
1
+ import { Loader, FileLoader, BufferGeometry, Float32BufferAttribute } from "three";
2
+ import { decodeText } from "../_polyfill/LoaderUtils.js";
2
3
  class PLYLoader extends Loader {
3
4
  constructor(manager) {
4
5
  super(manager);
@@ -303,7 +304,7 @@ class PLYLoader extends Loader {
303
304
  let geometry;
304
305
  const scope = this;
305
306
  if (data instanceof ArrayBuffer) {
306
- const text = LoaderUtils.decodeText(new Uint8Array(data));
307
+ const text = decodeText(new Uint8Array(data));
307
308
  const header = parseHeader(text);
308
309
  geometry = header.format === "ascii" ? parseASCII(text, header) : parseBinary(data, header);
309
310
  } else {
@@ -1 +1 @@
1
- {"version":3,"file":"PLYLoader.js","sources":["../../src/loaders/PLYLoader.js"],"sourcesContent":["import { BufferGeometry, FileLoader, Float32BufferAttribute, Loader, LoaderUtils } from 'three'\n\n/**\n * Description: A THREE loader for PLY ASCII files (known as the Polygon\n * File Format or the Stanford Triangle Format).\n *\n * Limitations: ASCII decoding assumes file is UTF-8.\n *\n * Usage:\n *\tconst loader = new PLYLoader();\n *\tloader.load('./models/ply/ascii/dolphins.ply', function (geometry) {\n *\n *\t\tscene.add( new THREE.Mesh( geometry ) );\n *\n *\t} );\n *\n * If the PLY file uses non standard property names, they can be mapped while\n * loading. For example, the following maps the properties\n * “diffuse_(red|green|blue)” in the file to standard color names.\n *\n * loader.setPropertyNameMapping( {\n *\tdiffuse_red: 'red',\n *\tdiffuse_green: 'green',\n *\tdiffuse_blue: 'blue'\n * } );\n *\n */\n\nclass PLYLoader extends Loader {\n constructor(manager) {\n super(manager)\n\n this.propertyNameMapping = {}\n }\n\n load(url, onLoad, onProgress, onError) {\n const scope = this\n\n const loader = new FileLoader(this.manager)\n loader.setPath(this.path)\n loader.setResponseType('arraybuffer')\n loader.setRequestHeader(this.requestHeader)\n loader.setWithCredentials(this.withCredentials)\n loader.load(\n url,\n function (text) {\n try {\n onLoad(scope.parse(text))\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 setPropertyNameMapping(mapping) {\n this.propertyNameMapping = mapping\n }\n\n parse(data) {\n function parseHeader(data) {\n const patternHeader = /ply([\\s\\S]*)end_header\\r?\\n/\n let headerText = ''\n let headerLength = 0\n const result = patternHeader.exec(data)\n\n if (result !== null) {\n headerText = result[1]\n headerLength = new Blob([result[0]]).size\n }\n\n const header = {\n comments: [],\n elements: [],\n headerLength: headerLength,\n objInfo: '',\n }\n\n const lines = headerText.split('\\n')\n let currentElement\n\n function make_ply_element_property(propertValues, propertyNameMapping) {\n const property = { type: propertValues[0] }\n\n if (property.type === 'list') {\n property.name = propertValues[3]\n property.countType = propertValues[1]\n property.itemType = propertValues[2]\n } else {\n property.name = propertValues[1]\n }\n\n if (property.name in propertyNameMapping) {\n property.name = propertyNameMapping[property.name]\n }\n\n return property\n }\n\n for (let i = 0; i < lines.length; i++) {\n let line = lines[i]\n line = line.trim()\n\n if (line === '') continue\n\n const lineValues = line.split(/\\s+/)\n const lineType = lineValues.shift()\n line = lineValues.join(' ')\n\n switch (lineType) {\n case 'format':\n header.format = lineValues[0]\n header.version = lineValues[1]\n\n break\n\n case 'comment':\n header.comments.push(line)\n\n break\n\n case 'element':\n if (currentElement !== undefined) {\n header.elements.push(currentElement)\n }\n\n currentElement = {}\n currentElement.name = lineValues[0]\n currentElement.count = parseInt(lineValues[1])\n currentElement.properties = []\n\n break\n\n case 'property':\n currentElement.properties.push(make_ply_element_property(lineValues, scope.propertyNameMapping))\n\n break\n\n case 'obj_info':\n header.objInfo = line\n\n break\n\n default:\n console.log('unhandled', lineType, lineValues)\n }\n }\n\n if (currentElement !== undefined) {\n header.elements.push(currentElement)\n }\n\n return header\n }\n\n function parseASCIINumber(n, type) {\n switch (type) {\n case 'char':\n case 'uchar':\n case 'short':\n case 'ushort':\n case 'int':\n case 'uint':\n case 'int8':\n case 'uint8':\n case 'int16':\n case 'uint16':\n case 'int32':\n case 'uint32':\n return parseInt(n)\n\n case 'float':\n case 'double':\n case 'float32':\n case 'float64':\n return parseFloat(n)\n }\n }\n\n function parseASCIIElement(properties, line) {\n const values = line.split(/\\s+/)\n\n const element = {}\n\n for (let i = 0; i < properties.length; i++) {\n if (properties[i].type === 'list') {\n const list = []\n const n = parseASCIINumber(values.shift(), properties[i].countType)\n\n for (let j = 0; j < n; j++) {\n list.push(parseASCIINumber(values.shift(), properties[i].itemType))\n }\n\n element[properties[i].name] = list\n } else {\n element[properties[i].name] = parseASCIINumber(values.shift(), properties[i].type)\n }\n }\n\n return element\n }\n\n function parseASCII(data, header) {\n // PLY ascii format specification, as per http://en.wikipedia.org/wiki/PLY_(file_format)\n\n const buffer = {\n indices: [],\n vertices: [],\n normals: [],\n uvs: [],\n faceVertexUvs: [],\n colors: [],\n }\n\n let result\n\n const patternBody = /end_header\\s([\\s\\S]*)$/\n let body = ''\n if ((result = patternBody.exec(data)) !== null) {\n body = result[1]\n }\n\n const lines = body.split('\\n')\n let currentElement = 0\n let currentElementCount = 0\n\n for (let i = 0; i < lines.length; i++) {\n let line = lines[i]\n line = line.trim()\n if (line === '') {\n continue\n }\n\n if (currentElementCount >= header.elements[currentElement].count) {\n currentElement++\n currentElementCount = 0\n }\n\n const element = parseASCIIElement(header.elements[currentElement].properties, line)\n\n handleElement(buffer, header.elements[currentElement].name, element)\n\n currentElementCount++\n }\n\n return postProcess(buffer)\n }\n\n function postProcess(buffer) {\n let geometry = new BufferGeometry()\n\n // mandatory buffer data\n\n if (buffer.indices.length > 0) {\n geometry.setIndex(buffer.indices)\n }\n\n geometry.setAttribute('position', new Float32BufferAttribute(buffer.vertices, 3))\n\n // optional buffer data\n\n if (buffer.normals.length > 0) {\n geometry.setAttribute('normal', new Float32BufferAttribute(buffer.normals, 3))\n }\n\n if (buffer.uvs.length > 0) {\n geometry.setAttribute('uv', new Float32BufferAttribute(buffer.uvs, 2))\n }\n\n if (buffer.colors.length > 0) {\n geometry.setAttribute('color', new Float32BufferAttribute(buffer.colors, 3))\n }\n\n if (buffer.faceVertexUvs.length > 0) {\n geometry = geometry.toNonIndexed()\n geometry.setAttribute('uv', new Float32BufferAttribute(buffer.faceVertexUvs, 2))\n }\n\n geometry.computeBoundingSphere()\n\n return geometry\n }\n\n function handleElement(buffer, elementName, element) {\n if (elementName === 'vertex') {\n buffer.vertices.push(element.x, element.y, element.z)\n\n if ('nx' in element && 'ny' in element && 'nz' in element) {\n buffer.normals.push(element.nx, element.ny, element.nz)\n }\n\n if ('s' in element && 't' in element) {\n buffer.uvs.push(element.s, element.t)\n }\n\n if ('red' in element && 'green' in element && 'blue' in element) {\n buffer.colors.push(element.red / 255.0, element.green / 255.0, element.blue / 255.0)\n }\n } else if (elementName === 'face') {\n const vertex_indices = element.vertex_indices || element.vertex_index // issue #9338\n const texcoord = element.texcoord\n\n if (vertex_indices.length === 3) {\n buffer.indices.push(vertex_indices[0], vertex_indices[1], vertex_indices[2])\n\n if (texcoord && texcoord.length === 6) {\n buffer.faceVertexUvs.push(texcoord[0], texcoord[1])\n buffer.faceVertexUvs.push(texcoord[2], texcoord[3])\n buffer.faceVertexUvs.push(texcoord[4], texcoord[5])\n }\n } else if (vertex_indices.length === 4) {\n buffer.indices.push(vertex_indices[0], vertex_indices[1], vertex_indices[3])\n buffer.indices.push(vertex_indices[1], vertex_indices[2], vertex_indices[3])\n }\n }\n }\n\n function binaryRead(dataview, at, type, little_endian) {\n switch (type) {\n // corespondences for non-specific length types here match rply:\n case 'int8':\n case 'char':\n return [dataview.getInt8(at), 1]\n case 'uint8':\n case 'uchar':\n return [dataview.getUint8(at), 1]\n case 'int16':\n case 'short':\n return [dataview.getInt16(at, little_endian), 2]\n case 'uint16':\n case 'ushort':\n return [dataview.getUint16(at, little_endian), 2]\n case 'int32':\n case 'int':\n return [dataview.getInt32(at, little_endian), 4]\n case 'uint32':\n case 'uint':\n return [dataview.getUint32(at, little_endian), 4]\n case 'float32':\n case 'float':\n return [dataview.getFloat32(at, little_endian), 4]\n case 'float64':\n case 'double':\n return [dataview.getFloat64(at, little_endian), 8]\n }\n }\n\n function binaryReadElement(dataview, at, properties, little_endian) {\n const element = {}\n let result,\n read = 0\n\n for (let i = 0; i < properties.length; i++) {\n if (properties[i].type === 'list') {\n const list = []\n\n result = binaryRead(dataview, at + read, properties[i].countType, little_endian)\n const n = result[0]\n read += result[1]\n\n for (let j = 0; j < n; j++) {\n result = binaryRead(dataview, at + read, properties[i].itemType, little_endian)\n list.push(result[0])\n read += result[1]\n }\n\n element[properties[i].name] = list\n } else {\n result = binaryRead(dataview, at + read, properties[i].type, little_endian)\n element[properties[i].name] = result[0]\n read += result[1]\n }\n }\n\n return [element, read]\n }\n\n function parseBinary(data, header) {\n const buffer = {\n indices: [],\n vertices: [],\n normals: [],\n uvs: [],\n faceVertexUvs: [],\n colors: [],\n }\n\n const little_endian = header.format === 'binary_little_endian'\n const body = new DataView(data, header.headerLength)\n let result,\n loc = 0\n\n for (let currentElement = 0; currentElement < header.elements.length; currentElement++) {\n for (\n let currentElementCount = 0;\n currentElementCount < header.elements[currentElement].count;\n currentElementCount++\n ) {\n result = binaryReadElement(body, loc, header.elements[currentElement].properties, little_endian)\n loc += result[1]\n const element = result[0]\n\n handleElement(buffer, header.elements[currentElement].name, element)\n }\n }\n\n return postProcess(buffer)\n }\n\n //\n\n let geometry\n const scope = this\n\n if (data instanceof ArrayBuffer) {\n const text = LoaderUtils.decodeText(new Uint8Array(data))\n const header = parseHeader(text)\n\n geometry = header.format === 'ascii' ? parseASCII(text, header) : parseBinary(data, header)\n } else {\n geometry = parseASCII(data, parseHeader(data))\n }\n\n return geometry\n }\n}\n\nexport { PLYLoader }\n"],"names":["data","geometry"],"mappings":"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"}
1
+ {"version":3,"file":"PLYLoader.js","sources":["../../src/loaders/PLYLoader.js"],"sourcesContent":["import { BufferGeometry, FileLoader, Float32BufferAttribute, Loader, LoaderUtils } from 'three'\nimport { decodeText } from '../_polyfill/LoaderUtils'\n\n/**\n * Description: A THREE loader for PLY ASCII files (known as the Polygon\n * File Format or the Stanford Triangle Format).\n *\n * Limitations: ASCII decoding assumes file is UTF-8.\n *\n * Usage:\n *\tconst loader = new PLYLoader();\n *\tloader.load('./models/ply/ascii/dolphins.ply', function (geometry) {\n *\n *\t\tscene.add( new THREE.Mesh( geometry ) );\n *\n *\t} );\n *\n * If the PLY file uses non standard property names, they can be mapped while\n * loading. For example, the following maps the properties\n * “diffuse_(red|green|blue)” in the file to standard color names.\n *\n * loader.setPropertyNameMapping( {\n *\tdiffuse_red: 'red',\n *\tdiffuse_green: 'green',\n *\tdiffuse_blue: 'blue'\n * } );\n *\n */\n\nclass PLYLoader extends Loader {\n constructor(manager) {\n super(manager)\n\n this.propertyNameMapping = {}\n }\n\n load(url, onLoad, onProgress, onError) {\n const scope = this\n\n const loader = new FileLoader(this.manager)\n loader.setPath(this.path)\n loader.setResponseType('arraybuffer')\n loader.setRequestHeader(this.requestHeader)\n loader.setWithCredentials(this.withCredentials)\n loader.load(\n url,\n function (text) {\n try {\n onLoad(scope.parse(text))\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 setPropertyNameMapping(mapping) {\n this.propertyNameMapping = mapping\n }\n\n parse(data) {\n function parseHeader(data) {\n const patternHeader = /ply([\\s\\S]*)end_header\\r?\\n/\n let headerText = ''\n let headerLength = 0\n const result = patternHeader.exec(data)\n\n if (result !== null) {\n headerText = result[1]\n headerLength = new Blob([result[0]]).size\n }\n\n const header = {\n comments: [],\n elements: [],\n headerLength: headerLength,\n objInfo: '',\n }\n\n const lines = headerText.split('\\n')\n let currentElement\n\n function make_ply_element_property(propertValues, propertyNameMapping) {\n const property = { type: propertValues[0] }\n\n if (property.type === 'list') {\n property.name = propertValues[3]\n property.countType = propertValues[1]\n property.itemType = propertValues[2]\n } else {\n property.name = propertValues[1]\n }\n\n if (property.name in propertyNameMapping) {\n property.name = propertyNameMapping[property.name]\n }\n\n return property\n }\n\n for (let i = 0; i < lines.length; i++) {\n let line = lines[i]\n line = line.trim()\n\n if (line === '') continue\n\n const lineValues = line.split(/\\s+/)\n const lineType = lineValues.shift()\n line = lineValues.join(' ')\n\n switch (lineType) {\n case 'format':\n header.format = lineValues[0]\n header.version = lineValues[1]\n\n break\n\n case 'comment':\n header.comments.push(line)\n\n break\n\n case 'element':\n if (currentElement !== undefined) {\n header.elements.push(currentElement)\n }\n\n currentElement = {}\n currentElement.name = lineValues[0]\n currentElement.count = parseInt(lineValues[1])\n currentElement.properties = []\n\n break\n\n case 'property':\n currentElement.properties.push(make_ply_element_property(lineValues, scope.propertyNameMapping))\n\n break\n\n case 'obj_info':\n header.objInfo = line\n\n break\n\n default:\n console.log('unhandled', lineType, lineValues)\n }\n }\n\n if (currentElement !== undefined) {\n header.elements.push(currentElement)\n }\n\n return header\n }\n\n function parseASCIINumber(n, type) {\n switch (type) {\n case 'char':\n case 'uchar':\n case 'short':\n case 'ushort':\n case 'int':\n case 'uint':\n case 'int8':\n case 'uint8':\n case 'int16':\n case 'uint16':\n case 'int32':\n case 'uint32':\n return parseInt(n)\n\n case 'float':\n case 'double':\n case 'float32':\n case 'float64':\n return parseFloat(n)\n }\n }\n\n function parseASCIIElement(properties, line) {\n const values = line.split(/\\s+/)\n\n const element = {}\n\n for (let i = 0; i < properties.length; i++) {\n if (properties[i].type === 'list') {\n const list = []\n const n = parseASCIINumber(values.shift(), properties[i].countType)\n\n for (let j = 0; j < n; j++) {\n list.push(parseASCIINumber(values.shift(), properties[i].itemType))\n }\n\n element[properties[i].name] = list\n } else {\n element[properties[i].name] = parseASCIINumber(values.shift(), properties[i].type)\n }\n }\n\n return element\n }\n\n function parseASCII(data, header) {\n // PLY ascii format specification, as per http://en.wikipedia.org/wiki/PLY_(file_format)\n\n const buffer = {\n indices: [],\n vertices: [],\n normals: [],\n uvs: [],\n faceVertexUvs: [],\n colors: [],\n }\n\n let result\n\n const patternBody = /end_header\\s([\\s\\S]*)$/\n let body = ''\n if ((result = patternBody.exec(data)) !== null) {\n body = result[1]\n }\n\n const lines = body.split('\\n')\n let currentElement = 0\n let currentElementCount = 0\n\n for (let i = 0; i < lines.length; i++) {\n let line = lines[i]\n line = line.trim()\n if (line === '') {\n continue\n }\n\n if (currentElementCount >= header.elements[currentElement].count) {\n currentElement++\n currentElementCount = 0\n }\n\n const element = parseASCIIElement(header.elements[currentElement].properties, line)\n\n handleElement(buffer, header.elements[currentElement].name, element)\n\n currentElementCount++\n }\n\n return postProcess(buffer)\n }\n\n function postProcess(buffer) {\n let geometry = new BufferGeometry()\n\n // mandatory buffer data\n\n if (buffer.indices.length > 0) {\n geometry.setIndex(buffer.indices)\n }\n\n geometry.setAttribute('position', new Float32BufferAttribute(buffer.vertices, 3))\n\n // optional buffer data\n\n if (buffer.normals.length > 0) {\n geometry.setAttribute('normal', new Float32BufferAttribute(buffer.normals, 3))\n }\n\n if (buffer.uvs.length > 0) {\n geometry.setAttribute('uv', new Float32BufferAttribute(buffer.uvs, 2))\n }\n\n if (buffer.colors.length > 0) {\n geometry.setAttribute('color', new Float32BufferAttribute(buffer.colors, 3))\n }\n\n if (buffer.faceVertexUvs.length > 0) {\n geometry = geometry.toNonIndexed()\n geometry.setAttribute('uv', new Float32BufferAttribute(buffer.faceVertexUvs, 2))\n }\n\n geometry.computeBoundingSphere()\n\n return geometry\n }\n\n function handleElement(buffer, elementName, element) {\n if (elementName === 'vertex') {\n buffer.vertices.push(element.x, element.y, element.z)\n\n if ('nx' in element && 'ny' in element && 'nz' in element) {\n buffer.normals.push(element.nx, element.ny, element.nz)\n }\n\n if ('s' in element && 't' in element) {\n buffer.uvs.push(element.s, element.t)\n }\n\n if ('red' in element && 'green' in element && 'blue' in element) {\n buffer.colors.push(element.red / 255.0, element.green / 255.0, element.blue / 255.0)\n }\n } else if (elementName === 'face') {\n const vertex_indices = element.vertex_indices || element.vertex_index // issue #9338\n const texcoord = element.texcoord\n\n if (vertex_indices.length === 3) {\n buffer.indices.push(vertex_indices[0], vertex_indices[1], vertex_indices[2])\n\n if (texcoord && texcoord.length === 6) {\n buffer.faceVertexUvs.push(texcoord[0], texcoord[1])\n buffer.faceVertexUvs.push(texcoord[2], texcoord[3])\n buffer.faceVertexUvs.push(texcoord[4], texcoord[5])\n }\n } else if (vertex_indices.length === 4) {\n buffer.indices.push(vertex_indices[0], vertex_indices[1], vertex_indices[3])\n buffer.indices.push(vertex_indices[1], vertex_indices[2], vertex_indices[3])\n }\n }\n }\n\n function binaryRead(dataview, at, type, little_endian) {\n switch (type) {\n // corespondences for non-specific length types here match rply:\n case 'int8':\n case 'char':\n return [dataview.getInt8(at), 1]\n case 'uint8':\n case 'uchar':\n return [dataview.getUint8(at), 1]\n case 'int16':\n case 'short':\n return [dataview.getInt16(at, little_endian), 2]\n case 'uint16':\n case 'ushort':\n return [dataview.getUint16(at, little_endian), 2]\n case 'int32':\n case 'int':\n return [dataview.getInt32(at, little_endian), 4]\n case 'uint32':\n case 'uint':\n return [dataview.getUint32(at, little_endian), 4]\n case 'float32':\n case 'float':\n return [dataview.getFloat32(at, little_endian), 4]\n case 'float64':\n case 'double':\n return [dataview.getFloat64(at, little_endian), 8]\n }\n }\n\n function binaryReadElement(dataview, at, properties, little_endian) {\n const element = {}\n let result,\n read = 0\n\n for (let i = 0; i < properties.length; i++) {\n if (properties[i].type === 'list') {\n const list = []\n\n result = binaryRead(dataview, at + read, properties[i].countType, little_endian)\n const n = result[0]\n read += result[1]\n\n for (let j = 0; j < n; j++) {\n result = binaryRead(dataview, at + read, properties[i].itemType, little_endian)\n list.push(result[0])\n read += result[1]\n }\n\n element[properties[i].name] = list\n } else {\n result = binaryRead(dataview, at + read, properties[i].type, little_endian)\n element[properties[i].name] = result[0]\n read += result[1]\n }\n }\n\n return [element, read]\n }\n\n function parseBinary(data, header) {\n const buffer = {\n indices: [],\n vertices: [],\n normals: [],\n uvs: [],\n faceVertexUvs: [],\n colors: [],\n }\n\n const little_endian = header.format === 'binary_little_endian'\n const body = new DataView(data, header.headerLength)\n let result,\n loc = 0\n\n for (let currentElement = 0; currentElement < header.elements.length; currentElement++) {\n for (\n let currentElementCount = 0;\n currentElementCount < header.elements[currentElement].count;\n currentElementCount++\n ) {\n result = binaryReadElement(body, loc, header.elements[currentElement].properties, little_endian)\n loc += result[1]\n const element = result[0]\n\n handleElement(buffer, header.elements[currentElement].name, element)\n }\n }\n\n return postProcess(buffer)\n }\n\n //\n\n let geometry\n const scope = this\n\n if (data instanceof ArrayBuffer) {\n const text = decodeText(new Uint8Array(data))\n const header = parseHeader(text)\n\n geometry = header.format === 'ascii' ? parseASCII(text, header) : parseBinary(data, header)\n } else {\n geometry = parseASCII(data, parseHeader(data))\n }\n\n return geometry\n }\n}\n\nexport { PLYLoader }\n"],"names":["data","geometry"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const THREE = require("three");
4
+ const LoaderUtils = require("../_polyfill/LoaderUtils.cjs");
4
5
  class STLLoader extends THREE.Loader {
5
6
  constructor(manager) {
6
7
  super(manager);
@@ -168,7 +169,7 @@ class STLLoader extends THREE.Loader {
168
169
  }
169
170
  function ensureString(buffer) {
170
171
  if (typeof buffer !== "string") {
171
- return THREE.LoaderUtils.decodeText(new Uint8Array(buffer));
172
+ return LoaderUtils.decodeText(new Uint8Array(buffer));
172
173
  }
173
174
  return buffer;
174
175
  }
@@ -1 +1 @@
1
- {"version":3,"file":"STLLoader.cjs","sources":["../../src/loaders/STLLoader.js"],"sourcesContent":["import {\n BufferAttribute,\n BufferGeometry,\n FileLoader,\n Float32BufferAttribute,\n Loader,\n LoaderUtils,\n Vector3,\n} from 'three'\n\n/**\n * Description: A THREE loader for STL ASCII files, as created by Solidworks and other CAD programs.\n *\n * Supports both binary and ASCII encoded files, with automatic detection of type.\n *\n * The loader returns a non-indexed buffer geometry.\n *\n * Limitations:\n * Binary decoding supports \"Magics\" color format (http://en.wikipedia.org/wiki/STL_(file_format)#Color_in_binary_STL).\n * There is perhaps some question as to how valid it is to always assume little-endian-ness.\n * ASCII decoding assumes file is UTF-8.\n *\n * Usage:\n * const loader = new STLLoader();\n * loader.load( './models/stl/slotted_disk.stl', function ( geometry ) {\n * scene.add( new THREE.Mesh( geometry ) );\n * });\n *\n * For binary STLs geometry might contain colors for vertices. To use it:\n * // use the same code to load STL as above\n * if (geometry.hasColors) {\n * material = new THREE.MeshPhongMaterial({ opacity: geometry.alpha, vertexColors: true });\n * } else { .... }\n * const mesh = new THREE.Mesh( geometry, material );\n *\n * For ASCII STLs containing multiple solids, each solid is assigned to a different group.\n * Groups can be used to assign a different color by defining an array of materials with the same length of\n * geometry.groups and passing it to the Mesh constructor:\n *\n * const mesh = new THREE.Mesh( geometry, material );\n *\n * For example:\n *\n * const materials = [];\n * const nGeometryGroups = geometry.groups.length;\n *\n * const colorMap = ...; // Some logic to index colors.\n *\n * for (let i = 0; i < nGeometryGroups; i++) {\n *\n *\t\tconst material = new THREE.MeshPhongMaterial({\n *\t\t\tcolor: colorMap[i],\n *\t\t\twireframe: false\n *\t\t});\n *\n * }\n *\n * materials.push(material);\n * const mesh = new THREE.Mesh(geometry, materials);\n */\n\nclass STLLoader 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(this.manager)\n loader.setPath(this.path)\n loader.setResponseType('arraybuffer')\n loader.setRequestHeader(this.requestHeader)\n loader.setWithCredentials(this.withCredentials)\n\n loader.load(\n url,\n function (text) {\n try {\n onLoad(scope.parse(text))\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(data) {\n function isBinary(data) {\n const reader = new DataView(data)\n const face_size = (32 / 8) * 3 + (32 / 8) * 3 * 3 + 16 / 8\n const n_faces = reader.getUint32(80, true)\n const expect = 80 + 32 / 8 + n_faces * face_size\n\n if (expect === reader.byteLength) {\n return true\n }\n\n // An ASCII STL data must begin with 'solid ' as the first six bytes.\n // However, ASCII STLs lacking the SPACE after the 'd' are known to be\n // plentiful. So, check the first 5 bytes for 'solid'.\n\n // Several encodings, such as UTF-8, precede the text with up to 5 bytes:\n // https://en.wikipedia.org/wiki/Byte_order_mark#Byte_order_marks_by_encoding\n // Search for \"solid\" to start anywhere after those prefixes.\n\n // US-ASCII ordinal values for 's', 'o', 'l', 'i', 'd'\n\n const solid = [115, 111, 108, 105, 100]\n\n for (let off = 0; off < 5; off++) {\n // If \"solid\" text is matched to the current offset, declare it to be an ASCII STL.\n\n if (matchDataViewAt(solid, reader, off)) return false\n }\n\n // Couldn't find \"solid\" text at the beginning; it is binary STL.\n\n return true\n }\n\n function matchDataViewAt(query, reader, offset) {\n // Check if each byte in query matches the corresponding byte from the current offset\n\n for (let i = 0, il = query.length; i < il; i++) {\n if (query[i] !== reader.getUint8(offset + i, false)) return false\n }\n\n return true\n }\n\n function parseBinary(data) {\n const reader = new DataView(data)\n const faces = reader.getUint32(80, true)\n\n let r,\n g,\n b,\n hasColors = false,\n colors\n let defaultR, defaultG, defaultB, alpha\n\n // process STL header\n // check for default color in header (\"COLOR=rgba\" sequence).\n\n for (let index = 0; index < 80 - 10; index++) {\n if (\n reader.getUint32(index, false) == 0x434f4c4f /*COLO*/ &&\n reader.getUint8(index + 4) == 0x52 /*'R'*/ &&\n reader.getUint8(index + 5) == 0x3d /*'='*/\n ) {\n hasColors = true\n colors = new Float32Array(faces * 3 * 3)\n\n defaultR = reader.getUint8(index + 6) / 255\n defaultG = reader.getUint8(index + 7) / 255\n defaultB = reader.getUint8(index + 8) / 255\n alpha = reader.getUint8(index + 9) / 255\n }\n }\n\n const dataOffset = 84\n const faceLength = 12 * 4 + 2\n\n const geometry = new BufferGeometry()\n\n const vertices = new Float32Array(faces * 3 * 3)\n const normals = new Float32Array(faces * 3 * 3)\n\n for (let face = 0; face < faces; face++) {\n const start = dataOffset + face * faceLength\n const normalX = reader.getFloat32(start, true)\n const normalY = reader.getFloat32(start + 4, true)\n const normalZ = reader.getFloat32(start + 8, true)\n\n if (hasColors) {\n const packedColor = reader.getUint16(start + 48, true)\n\n if ((packedColor & 0x8000) === 0) {\n // facet has its own unique color\n\n r = (packedColor & 0x1f) / 31\n g = ((packedColor >> 5) & 0x1f) / 31\n b = ((packedColor >> 10) & 0x1f) / 31\n } else {\n r = defaultR\n g = defaultG\n b = defaultB\n }\n }\n\n for (let i = 1; i <= 3; i++) {\n const vertexstart = start + i * 12\n const componentIdx = face * 3 * 3 + (i - 1) * 3\n\n vertices[componentIdx] = reader.getFloat32(vertexstart, true)\n vertices[componentIdx + 1] = reader.getFloat32(vertexstart + 4, true)\n vertices[componentIdx + 2] = reader.getFloat32(vertexstart + 8, true)\n\n normals[componentIdx] = normalX\n normals[componentIdx + 1] = normalY\n normals[componentIdx + 2] = normalZ\n\n if (hasColors) {\n colors[componentIdx] = r\n colors[componentIdx + 1] = g\n colors[componentIdx + 2] = b\n }\n }\n }\n\n geometry.setAttribute('position', new BufferAttribute(vertices, 3))\n geometry.setAttribute('normal', new BufferAttribute(normals, 3))\n\n if (hasColors) {\n geometry.setAttribute('color', new BufferAttribute(colors, 3))\n geometry.hasColors = true\n geometry.alpha = alpha\n }\n\n return geometry\n }\n\n function parseASCII(data) {\n const geometry = new BufferGeometry()\n const patternSolid = /solid([\\s\\S]*?)endsolid/g\n const patternFace = /facet([\\s\\S]*?)endfacet/g\n let faceCounter = 0\n\n const patternFloat = /[\\s]+([+-]?(?:\\d*)(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)/.source\n const patternVertex = new RegExp('vertex' + patternFloat + patternFloat + patternFloat, 'g')\n const patternNormal = new RegExp('normal' + patternFloat + patternFloat + patternFloat, 'g')\n\n const vertices = []\n const normals = []\n\n const normal = new Vector3()\n\n let result\n\n let groupCount = 0\n let startVertex = 0\n let endVertex = 0\n\n while ((result = patternSolid.exec(data)) !== null) {\n startVertex = endVertex\n\n const solid = result[0]\n\n while ((result = patternFace.exec(solid)) !== null) {\n let vertexCountPerFace = 0\n let normalCountPerFace = 0\n\n const text = result[0]\n\n while ((result = patternNormal.exec(text)) !== null) {\n normal.x = parseFloat(result[1])\n normal.y = parseFloat(result[2])\n normal.z = parseFloat(result[3])\n normalCountPerFace++\n }\n\n while ((result = patternVertex.exec(text)) !== null) {\n vertices.push(parseFloat(result[1]), parseFloat(result[2]), parseFloat(result[3]))\n normals.push(normal.x, normal.y, normal.z)\n vertexCountPerFace++\n endVertex++\n }\n\n // every face have to own ONE valid normal\n\n if (normalCountPerFace !== 1) {\n console.error(\"THREE.STLLoader: Something isn't right with the normal of face number \" + faceCounter)\n }\n\n // each face have to own THREE valid vertices\n\n if (vertexCountPerFace !== 3) {\n console.error(\"THREE.STLLoader: Something isn't right with the vertices of face number \" + faceCounter)\n }\n\n faceCounter++\n }\n\n const start = startVertex\n const count = endVertex - startVertex\n\n geometry.addGroup(start, count, groupCount)\n groupCount++\n }\n\n geometry.setAttribute('position', new Float32BufferAttribute(vertices, 3))\n geometry.setAttribute('normal', new Float32BufferAttribute(normals, 3))\n\n return geometry\n }\n\n function ensureString(buffer) {\n if (typeof buffer !== 'string') {\n return LoaderUtils.decodeText(new Uint8Array(buffer))\n }\n\n return buffer\n }\n\n function ensureBinary(buffer) {\n if (typeof buffer === 'string') {\n const array_buffer = new Uint8Array(buffer.length)\n for (let i = 0; i < buffer.length; i++) {\n array_buffer[i] = buffer.charCodeAt(i) & 0xff // implicitly assumes little-endian\n }\n\n return array_buffer.buffer || array_buffer\n } else {\n return buffer\n }\n }\n\n // start\n\n const binData = ensureBinary(data)\n\n return isBinary(binData) ? parseBinary(binData) : parseASCII(ensureString(data))\n }\n}\n\nexport { STLLoader }\n"],"names":["Loader","FileLoader","data","BufferGeometry","BufferAttribute","Vector3","Float32BufferAttribute","LoaderUtils"],"mappings":"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"}
1
+ {"version":3,"file":"STLLoader.cjs","sources":["../../src/loaders/STLLoader.js"],"sourcesContent":["import {\n BufferAttribute,\n BufferGeometry,\n FileLoader,\n Float32BufferAttribute,\n Loader,\n LoaderUtils,\n Vector3,\n} from 'three'\nimport { decodeText } from '../_polyfill/LoaderUtils'\n\n/**\n * Description: A THREE loader for STL ASCII files, as created by Solidworks and other CAD programs.\n *\n * Supports both binary and ASCII encoded files, with automatic detection of type.\n *\n * The loader returns a non-indexed buffer geometry.\n *\n * Limitations:\n * Binary decoding supports \"Magics\" color format (http://en.wikipedia.org/wiki/STL_(file_format)#Color_in_binary_STL).\n * There is perhaps some question as to how valid it is to always assume little-endian-ness.\n * ASCII decoding assumes file is UTF-8.\n *\n * Usage:\n * const loader = new STLLoader();\n * loader.load( './models/stl/slotted_disk.stl', function ( geometry ) {\n * scene.add( new THREE.Mesh( geometry ) );\n * });\n *\n * For binary STLs geometry might contain colors for vertices. To use it:\n * // use the same code to load STL as above\n * if (geometry.hasColors) {\n * material = new THREE.MeshPhongMaterial({ opacity: geometry.alpha, vertexColors: true });\n * } else { .... }\n * const mesh = new THREE.Mesh( geometry, material );\n *\n * For ASCII STLs containing multiple solids, each solid is assigned to a different group.\n * Groups can be used to assign a different color by defining an array of materials with the same length of\n * geometry.groups and passing it to the Mesh constructor:\n *\n * const mesh = new THREE.Mesh( geometry, material );\n *\n * For example:\n *\n * const materials = [];\n * const nGeometryGroups = geometry.groups.length;\n *\n * const colorMap = ...; // Some logic to index colors.\n *\n * for (let i = 0; i < nGeometryGroups; i++) {\n *\n *\t\tconst material = new THREE.MeshPhongMaterial({\n *\t\t\tcolor: colorMap[i],\n *\t\t\twireframe: false\n *\t\t});\n *\n * }\n *\n * materials.push(material);\n * const mesh = new THREE.Mesh(geometry, materials);\n */\n\nclass STLLoader 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(this.manager)\n loader.setPath(this.path)\n loader.setResponseType('arraybuffer')\n loader.setRequestHeader(this.requestHeader)\n loader.setWithCredentials(this.withCredentials)\n\n loader.load(\n url,\n function (text) {\n try {\n onLoad(scope.parse(text))\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(data) {\n function isBinary(data) {\n const reader = new DataView(data)\n const face_size = (32 / 8) * 3 + (32 / 8) * 3 * 3 + 16 / 8\n const n_faces = reader.getUint32(80, true)\n const expect = 80 + 32 / 8 + n_faces * face_size\n\n if (expect === reader.byteLength) {\n return true\n }\n\n // An ASCII STL data must begin with 'solid ' as the first six bytes.\n // However, ASCII STLs lacking the SPACE after the 'd' are known to be\n // plentiful. So, check the first 5 bytes for 'solid'.\n\n // Several encodings, such as UTF-8, precede the text with up to 5 bytes:\n // https://en.wikipedia.org/wiki/Byte_order_mark#Byte_order_marks_by_encoding\n // Search for \"solid\" to start anywhere after those prefixes.\n\n // US-ASCII ordinal values for 's', 'o', 'l', 'i', 'd'\n\n const solid = [115, 111, 108, 105, 100]\n\n for (let off = 0; off < 5; off++) {\n // If \"solid\" text is matched to the current offset, declare it to be an ASCII STL.\n\n if (matchDataViewAt(solid, reader, off)) return false\n }\n\n // Couldn't find \"solid\" text at the beginning; it is binary STL.\n\n return true\n }\n\n function matchDataViewAt(query, reader, offset) {\n // Check if each byte in query matches the corresponding byte from the current offset\n\n for (let i = 0, il = query.length; i < il; i++) {\n if (query[i] !== reader.getUint8(offset + i, false)) return false\n }\n\n return true\n }\n\n function parseBinary(data) {\n const reader = new DataView(data)\n const faces = reader.getUint32(80, true)\n\n let r,\n g,\n b,\n hasColors = false,\n colors\n let defaultR, defaultG, defaultB, alpha\n\n // process STL header\n // check for default color in header (\"COLOR=rgba\" sequence).\n\n for (let index = 0; index < 80 - 10; index++) {\n if (\n reader.getUint32(index, false) == 0x434f4c4f /*COLO*/ &&\n reader.getUint8(index + 4) == 0x52 /*'R'*/ &&\n reader.getUint8(index + 5) == 0x3d /*'='*/\n ) {\n hasColors = true\n colors = new Float32Array(faces * 3 * 3)\n\n defaultR = reader.getUint8(index + 6) / 255\n defaultG = reader.getUint8(index + 7) / 255\n defaultB = reader.getUint8(index + 8) / 255\n alpha = reader.getUint8(index + 9) / 255\n }\n }\n\n const dataOffset = 84\n const faceLength = 12 * 4 + 2\n\n const geometry = new BufferGeometry()\n\n const vertices = new Float32Array(faces * 3 * 3)\n const normals = new Float32Array(faces * 3 * 3)\n\n for (let face = 0; face < faces; face++) {\n const start = dataOffset + face * faceLength\n const normalX = reader.getFloat32(start, true)\n const normalY = reader.getFloat32(start + 4, true)\n const normalZ = reader.getFloat32(start + 8, true)\n\n if (hasColors) {\n const packedColor = reader.getUint16(start + 48, true)\n\n if ((packedColor & 0x8000) === 0) {\n // facet has its own unique color\n\n r = (packedColor & 0x1f) / 31\n g = ((packedColor >> 5) & 0x1f) / 31\n b = ((packedColor >> 10) & 0x1f) / 31\n } else {\n r = defaultR\n g = defaultG\n b = defaultB\n }\n }\n\n for (let i = 1; i <= 3; i++) {\n const vertexstart = start + i * 12\n const componentIdx = face * 3 * 3 + (i - 1) * 3\n\n vertices[componentIdx] = reader.getFloat32(vertexstart, true)\n vertices[componentIdx + 1] = reader.getFloat32(vertexstart + 4, true)\n vertices[componentIdx + 2] = reader.getFloat32(vertexstart + 8, true)\n\n normals[componentIdx] = normalX\n normals[componentIdx + 1] = normalY\n normals[componentIdx + 2] = normalZ\n\n if (hasColors) {\n colors[componentIdx] = r\n colors[componentIdx + 1] = g\n colors[componentIdx + 2] = b\n }\n }\n }\n\n geometry.setAttribute('position', new BufferAttribute(vertices, 3))\n geometry.setAttribute('normal', new BufferAttribute(normals, 3))\n\n if (hasColors) {\n geometry.setAttribute('color', new BufferAttribute(colors, 3))\n geometry.hasColors = true\n geometry.alpha = alpha\n }\n\n return geometry\n }\n\n function parseASCII(data) {\n const geometry = new BufferGeometry()\n const patternSolid = /solid([\\s\\S]*?)endsolid/g\n const patternFace = /facet([\\s\\S]*?)endfacet/g\n let faceCounter = 0\n\n const patternFloat = /[\\s]+([+-]?(?:\\d*)(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)/.source\n const patternVertex = new RegExp('vertex' + patternFloat + patternFloat + patternFloat, 'g')\n const patternNormal = new RegExp('normal' + patternFloat + patternFloat + patternFloat, 'g')\n\n const vertices = []\n const normals = []\n\n const normal = new Vector3()\n\n let result\n\n let groupCount = 0\n let startVertex = 0\n let endVertex = 0\n\n while ((result = patternSolid.exec(data)) !== null) {\n startVertex = endVertex\n\n const solid = result[0]\n\n while ((result = patternFace.exec(solid)) !== null) {\n let vertexCountPerFace = 0\n let normalCountPerFace = 0\n\n const text = result[0]\n\n while ((result = patternNormal.exec(text)) !== null) {\n normal.x = parseFloat(result[1])\n normal.y = parseFloat(result[2])\n normal.z = parseFloat(result[3])\n normalCountPerFace++\n }\n\n while ((result = patternVertex.exec(text)) !== null) {\n vertices.push(parseFloat(result[1]), parseFloat(result[2]), parseFloat(result[3]))\n normals.push(normal.x, normal.y, normal.z)\n vertexCountPerFace++\n endVertex++\n }\n\n // every face have to own ONE valid normal\n\n if (normalCountPerFace !== 1) {\n console.error(\"THREE.STLLoader: Something isn't right with the normal of face number \" + faceCounter)\n }\n\n // each face have to own THREE valid vertices\n\n if (vertexCountPerFace !== 3) {\n console.error(\"THREE.STLLoader: Something isn't right with the vertices of face number \" + faceCounter)\n }\n\n faceCounter++\n }\n\n const start = startVertex\n const count = endVertex - startVertex\n\n geometry.addGroup(start, count, groupCount)\n groupCount++\n }\n\n geometry.setAttribute('position', new Float32BufferAttribute(vertices, 3))\n geometry.setAttribute('normal', new Float32BufferAttribute(normals, 3))\n\n return geometry\n }\n\n function ensureString(buffer) {\n if (typeof buffer !== 'string') {\n return decodeText(new Uint8Array(buffer))\n }\n\n return buffer\n }\n\n function ensureBinary(buffer) {\n if (typeof buffer === 'string') {\n const array_buffer = new Uint8Array(buffer.length)\n for (let i = 0; i < buffer.length; i++) {\n array_buffer[i] = buffer.charCodeAt(i) & 0xff // implicitly assumes little-endian\n }\n\n return array_buffer.buffer || array_buffer\n } else {\n return buffer\n }\n }\n\n // start\n\n const binData = ensureBinary(data)\n\n return isBinary(binData) ? parseBinary(binData) : parseASCII(ensureString(data))\n }\n}\n\nexport { STLLoader }\n"],"names":["Loader","FileLoader","data","BufferGeometry","BufferAttribute","Vector3","Float32BufferAttribute","decodeText"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
- import { Loader, FileLoader, BufferGeometry, BufferAttribute, Vector3, Float32BufferAttribute, LoaderUtils } from "three";
1
+ import { Loader, FileLoader, BufferGeometry, BufferAttribute, Vector3, Float32BufferAttribute } from "three";
2
+ import { decodeText } from "../_polyfill/LoaderUtils.js";
2
3
  class STLLoader extends Loader {
3
4
  constructor(manager) {
4
5
  super(manager);
@@ -166,7 +167,7 @@ class STLLoader extends Loader {
166
167
  }
167
168
  function ensureString(buffer) {
168
169
  if (typeof buffer !== "string") {
169
- return LoaderUtils.decodeText(new Uint8Array(buffer));
170
+ return decodeText(new Uint8Array(buffer));
170
171
  }
171
172
  return buffer;
172
173
  }
@@ -1 +1 @@
1
- {"version":3,"file":"STLLoader.js","sources":["../../src/loaders/STLLoader.js"],"sourcesContent":["import {\n BufferAttribute,\n BufferGeometry,\n FileLoader,\n Float32BufferAttribute,\n Loader,\n LoaderUtils,\n Vector3,\n} from 'three'\n\n/**\n * Description: A THREE loader for STL ASCII files, as created by Solidworks and other CAD programs.\n *\n * Supports both binary and ASCII encoded files, with automatic detection of type.\n *\n * The loader returns a non-indexed buffer geometry.\n *\n * Limitations:\n * Binary decoding supports \"Magics\" color format (http://en.wikipedia.org/wiki/STL_(file_format)#Color_in_binary_STL).\n * There is perhaps some question as to how valid it is to always assume little-endian-ness.\n * ASCII decoding assumes file is UTF-8.\n *\n * Usage:\n * const loader = new STLLoader();\n * loader.load( './models/stl/slotted_disk.stl', function ( geometry ) {\n * scene.add( new THREE.Mesh( geometry ) );\n * });\n *\n * For binary STLs geometry might contain colors for vertices. To use it:\n * // use the same code to load STL as above\n * if (geometry.hasColors) {\n * material = new THREE.MeshPhongMaterial({ opacity: geometry.alpha, vertexColors: true });\n * } else { .... }\n * const mesh = new THREE.Mesh( geometry, material );\n *\n * For ASCII STLs containing multiple solids, each solid is assigned to a different group.\n * Groups can be used to assign a different color by defining an array of materials with the same length of\n * geometry.groups and passing it to the Mesh constructor:\n *\n * const mesh = new THREE.Mesh( geometry, material );\n *\n * For example:\n *\n * const materials = [];\n * const nGeometryGroups = geometry.groups.length;\n *\n * const colorMap = ...; // Some logic to index colors.\n *\n * for (let i = 0; i < nGeometryGroups; i++) {\n *\n *\t\tconst material = new THREE.MeshPhongMaterial({\n *\t\t\tcolor: colorMap[i],\n *\t\t\twireframe: false\n *\t\t});\n *\n * }\n *\n * materials.push(material);\n * const mesh = new THREE.Mesh(geometry, materials);\n */\n\nclass STLLoader 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(this.manager)\n loader.setPath(this.path)\n loader.setResponseType('arraybuffer')\n loader.setRequestHeader(this.requestHeader)\n loader.setWithCredentials(this.withCredentials)\n\n loader.load(\n url,\n function (text) {\n try {\n onLoad(scope.parse(text))\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(data) {\n function isBinary(data) {\n const reader = new DataView(data)\n const face_size = (32 / 8) * 3 + (32 / 8) * 3 * 3 + 16 / 8\n const n_faces = reader.getUint32(80, true)\n const expect = 80 + 32 / 8 + n_faces * face_size\n\n if (expect === reader.byteLength) {\n return true\n }\n\n // An ASCII STL data must begin with 'solid ' as the first six bytes.\n // However, ASCII STLs lacking the SPACE after the 'd' are known to be\n // plentiful. So, check the first 5 bytes for 'solid'.\n\n // Several encodings, such as UTF-8, precede the text with up to 5 bytes:\n // https://en.wikipedia.org/wiki/Byte_order_mark#Byte_order_marks_by_encoding\n // Search for \"solid\" to start anywhere after those prefixes.\n\n // US-ASCII ordinal values for 's', 'o', 'l', 'i', 'd'\n\n const solid = [115, 111, 108, 105, 100]\n\n for (let off = 0; off < 5; off++) {\n // If \"solid\" text is matched to the current offset, declare it to be an ASCII STL.\n\n if (matchDataViewAt(solid, reader, off)) return false\n }\n\n // Couldn't find \"solid\" text at the beginning; it is binary STL.\n\n return true\n }\n\n function matchDataViewAt(query, reader, offset) {\n // Check if each byte in query matches the corresponding byte from the current offset\n\n for (let i = 0, il = query.length; i < il; i++) {\n if (query[i] !== reader.getUint8(offset + i, false)) return false\n }\n\n return true\n }\n\n function parseBinary(data) {\n const reader = new DataView(data)\n const faces = reader.getUint32(80, true)\n\n let r,\n g,\n b,\n hasColors = false,\n colors\n let defaultR, defaultG, defaultB, alpha\n\n // process STL header\n // check for default color in header (\"COLOR=rgba\" sequence).\n\n for (let index = 0; index < 80 - 10; index++) {\n if (\n reader.getUint32(index, false) == 0x434f4c4f /*COLO*/ &&\n reader.getUint8(index + 4) == 0x52 /*'R'*/ &&\n reader.getUint8(index + 5) == 0x3d /*'='*/\n ) {\n hasColors = true\n colors = new Float32Array(faces * 3 * 3)\n\n defaultR = reader.getUint8(index + 6) / 255\n defaultG = reader.getUint8(index + 7) / 255\n defaultB = reader.getUint8(index + 8) / 255\n alpha = reader.getUint8(index + 9) / 255\n }\n }\n\n const dataOffset = 84\n const faceLength = 12 * 4 + 2\n\n const geometry = new BufferGeometry()\n\n const vertices = new Float32Array(faces * 3 * 3)\n const normals = new Float32Array(faces * 3 * 3)\n\n for (let face = 0; face < faces; face++) {\n const start = dataOffset + face * faceLength\n const normalX = reader.getFloat32(start, true)\n const normalY = reader.getFloat32(start + 4, true)\n const normalZ = reader.getFloat32(start + 8, true)\n\n if (hasColors) {\n const packedColor = reader.getUint16(start + 48, true)\n\n if ((packedColor & 0x8000) === 0) {\n // facet has its own unique color\n\n r = (packedColor & 0x1f) / 31\n g = ((packedColor >> 5) & 0x1f) / 31\n b = ((packedColor >> 10) & 0x1f) / 31\n } else {\n r = defaultR\n g = defaultG\n b = defaultB\n }\n }\n\n for (let i = 1; i <= 3; i++) {\n const vertexstart = start + i * 12\n const componentIdx = face * 3 * 3 + (i - 1) * 3\n\n vertices[componentIdx] = reader.getFloat32(vertexstart, true)\n vertices[componentIdx + 1] = reader.getFloat32(vertexstart + 4, true)\n vertices[componentIdx + 2] = reader.getFloat32(vertexstart + 8, true)\n\n normals[componentIdx] = normalX\n normals[componentIdx + 1] = normalY\n normals[componentIdx + 2] = normalZ\n\n if (hasColors) {\n colors[componentIdx] = r\n colors[componentIdx + 1] = g\n colors[componentIdx + 2] = b\n }\n }\n }\n\n geometry.setAttribute('position', new BufferAttribute(vertices, 3))\n geometry.setAttribute('normal', new BufferAttribute(normals, 3))\n\n if (hasColors) {\n geometry.setAttribute('color', new BufferAttribute(colors, 3))\n geometry.hasColors = true\n geometry.alpha = alpha\n }\n\n return geometry\n }\n\n function parseASCII(data) {\n const geometry = new BufferGeometry()\n const patternSolid = /solid([\\s\\S]*?)endsolid/g\n const patternFace = /facet([\\s\\S]*?)endfacet/g\n let faceCounter = 0\n\n const patternFloat = /[\\s]+([+-]?(?:\\d*)(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)/.source\n const patternVertex = new RegExp('vertex' + patternFloat + patternFloat + patternFloat, 'g')\n const patternNormal = new RegExp('normal' + patternFloat + patternFloat + patternFloat, 'g')\n\n const vertices = []\n const normals = []\n\n const normal = new Vector3()\n\n let result\n\n let groupCount = 0\n let startVertex = 0\n let endVertex = 0\n\n while ((result = patternSolid.exec(data)) !== null) {\n startVertex = endVertex\n\n const solid = result[0]\n\n while ((result = patternFace.exec(solid)) !== null) {\n let vertexCountPerFace = 0\n let normalCountPerFace = 0\n\n const text = result[0]\n\n while ((result = patternNormal.exec(text)) !== null) {\n normal.x = parseFloat(result[1])\n normal.y = parseFloat(result[2])\n normal.z = parseFloat(result[3])\n normalCountPerFace++\n }\n\n while ((result = patternVertex.exec(text)) !== null) {\n vertices.push(parseFloat(result[1]), parseFloat(result[2]), parseFloat(result[3]))\n normals.push(normal.x, normal.y, normal.z)\n vertexCountPerFace++\n endVertex++\n }\n\n // every face have to own ONE valid normal\n\n if (normalCountPerFace !== 1) {\n console.error(\"THREE.STLLoader: Something isn't right with the normal of face number \" + faceCounter)\n }\n\n // each face have to own THREE valid vertices\n\n if (vertexCountPerFace !== 3) {\n console.error(\"THREE.STLLoader: Something isn't right with the vertices of face number \" + faceCounter)\n }\n\n faceCounter++\n }\n\n const start = startVertex\n const count = endVertex - startVertex\n\n geometry.addGroup(start, count, groupCount)\n groupCount++\n }\n\n geometry.setAttribute('position', new Float32BufferAttribute(vertices, 3))\n geometry.setAttribute('normal', new Float32BufferAttribute(normals, 3))\n\n return geometry\n }\n\n function ensureString(buffer) {\n if (typeof buffer !== 'string') {\n return LoaderUtils.decodeText(new Uint8Array(buffer))\n }\n\n return buffer\n }\n\n function ensureBinary(buffer) {\n if (typeof buffer === 'string') {\n const array_buffer = new Uint8Array(buffer.length)\n for (let i = 0; i < buffer.length; i++) {\n array_buffer[i] = buffer.charCodeAt(i) & 0xff // implicitly assumes little-endian\n }\n\n return array_buffer.buffer || array_buffer\n } else {\n return buffer\n }\n }\n\n // start\n\n const binData = ensureBinary(data)\n\n return isBinary(binData) ? parseBinary(binData) : parseASCII(ensureString(data))\n }\n}\n\nexport { STLLoader }\n"],"names":["data"],"mappings":"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"}
1
+ {"version":3,"file":"STLLoader.js","sources":["../../src/loaders/STLLoader.js"],"sourcesContent":["import {\n BufferAttribute,\n BufferGeometry,\n FileLoader,\n Float32BufferAttribute,\n Loader,\n LoaderUtils,\n Vector3,\n} from 'three'\nimport { decodeText } from '../_polyfill/LoaderUtils'\n\n/**\n * Description: A THREE loader for STL ASCII files, as created by Solidworks and other CAD programs.\n *\n * Supports both binary and ASCII encoded files, with automatic detection of type.\n *\n * The loader returns a non-indexed buffer geometry.\n *\n * Limitations:\n * Binary decoding supports \"Magics\" color format (http://en.wikipedia.org/wiki/STL_(file_format)#Color_in_binary_STL).\n * There is perhaps some question as to how valid it is to always assume little-endian-ness.\n * ASCII decoding assumes file is UTF-8.\n *\n * Usage:\n * const loader = new STLLoader();\n * loader.load( './models/stl/slotted_disk.stl', function ( geometry ) {\n * scene.add( new THREE.Mesh( geometry ) );\n * });\n *\n * For binary STLs geometry might contain colors for vertices. To use it:\n * // use the same code to load STL as above\n * if (geometry.hasColors) {\n * material = new THREE.MeshPhongMaterial({ opacity: geometry.alpha, vertexColors: true });\n * } else { .... }\n * const mesh = new THREE.Mesh( geometry, material );\n *\n * For ASCII STLs containing multiple solids, each solid is assigned to a different group.\n * Groups can be used to assign a different color by defining an array of materials with the same length of\n * geometry.groups and passing it to the Mesh constructor:\n *\n * const mesh = new THREE.Mesh( geometry, material );\n *\n * For example:\n *\n * const materials = [];\n * const nGeometryGroups = geometry.groups.length;\n *\n * const colorMap = ...; // Some logic to index colors.\n *\n * for (let i = 0; i < nGeometryGroups; i++) {\n *\n *\t\tconst material = new THREE.MeshPhongMaterial({\n *\t\t\tcolor: colorMap[i],\n *\t\t\twireframe: false\n *\t\t});\n *\n * }\n *\n * materials.push(material);\n * const mesh = new THREE.Mesh(geometry, materials);\n */\n\nclass STLLoader 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(this.manager)\n loader.setPath(this.path)\n loader.setResponseType('arraybuffer')\n loader.setRequestHeader(this.requestHeader)\n loader.setWithCredentials(this.withCredentials)\n\n loader.load(\n url,\n function (text) {\n try {\n onLoad(scope.parse(text))\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(data) {\n function isBinary(data) {\n const reader = new DataView(data)\n const face_size = (32 / 8) * 3 + (32 / 8) * 3 * 3 + 16 / 8\n const n_faces = reader.getUint32(80, true)\n const expect = 80 + 32 / 8 + n_faces * face_size\n\n if (expect === reader.byteLength) {\n return true\n }\n\n // An ASCII STL data must begin with 'solid ' as the first six bytes.\n // However, ASCII STLs lacking the SPACE after the 'd' are known to be\n // plentiful. So, check the first 5 bytes for 'solid'.\n\n // Several encodings, such as UTF-8, precede the text with up to 5 bytes:\n // https://en.wikipedia.org/wiki/Byte_order_mark#Byte_order_marks_by_encoding\n // Search for \"solid\" to start anywhere after those prefixes.\n\n // US-ASCII ordinal values for 's', 'o', 'l', 'i', 'd'\n\n const solid = [115, 111, 108, 105, 100]\n\n for (let off = 0; off < 5; off++) {\n // If \"solid\" text is matched to the current offset, declare it to be an ASCII STL.\n\n if (matchDataViewAt(solid, reader, off)) return false\n }\n\n // Couldn't find \"solid\" text at the beginning; it is binary STL.\n\n return true\n }\n\n function matchDataViewAt(query, reader, offset) {\n // Check if each byte in query matches the corresponding byte from the current offset\n\n for (let i = 0, il = query.length; i < il; i++) {\n if (query[i] !== reader.getUint8(offset + i, false)) return false\n }\n\n return true\n }\n\n function parseBinary(data) {\n const reader = new DataView(data)\n const faces = reader.getUint32(80, true)\n\n let r,\n g,\n b,\n hasColors = false,\n colors\n let defaultR, defaultG, defaultB, alpha\n\n // process STL header\n // check for default color in header (\"COLOR=rgba\" sequence).\n\n for (let index = 0; index < 80 - 10; index++) {\n if (\n reader.getUint32(index, false) == 0x434f4c4f /*COLO*/ &&\n reader.getUint8(index + 4) == 0x52 /*'R'*/ &&\n reader.getUint8(index + 5) == 0x3d /*'='*/\n ) {\n hasColors = true\n colors = new Float32Array(faces * 3 * 3)\n\n defaultR = reader.getUint8(index + 6) / 255\n defaultG = reader.getUint8(index + 7) / 255\n defaultB = reader.getUint8(index + 8) / 255\n alpha = reader.getUint8(index + 9) / 255\n }\n }\n\n const dataOffset = 84\n const faceLength = 12 * 4 + 2\n\n const geometry = new BufferGeometry()\n\n const vertices = new Float32Array(faces * 3 * 3)\n const normals = new Float32Array(faces * 3 * 3)\n\n for (let face = 0; face < faces; face++) {\n const start = dataOffset + face * faceLength\n const normalX = reader.getFloat32(start, true)\n const normalY = reader.getFloat32(start + 4, true)\n const normalZ = reader.getFloat32(start + 8, true)\n\n if (hasColors) {\n const packedColor = reader.getUint16(start + 48, true)\n\n if ((packedColor & 0x8000) === 0) {\n // facet has its own unique color\n\n r = (packedColor & 0x1f) / 31\n g = ((packedColor >> 5) & 0x1f) / 31\n b = ((packedColor >> 10) & 0x1f) / 31\n } else {\n r = defaultR\n g = defaultG\n b = defaultB\n }\n }\n\n for (let i = 1; i <= 3; i++) {\n const vertexstart = start + i * 12\n const componentIdx = face * 3 * 3 + (i - 1) * 3\n\n vertices[componentIdx] = reader.getFloat32(vertexstart, true)\n vertices[componentIdx + 1] = reader.getFloat32(vertexstart + 4, true)\n vertices[componentIdx + 2] = reader.getFloat32(vertexstart + 8, true)\n\n normals[componentIdx] = normalX\n normals[componentIdx + 1] = normalY\n normals[componentIdx + 2] = normalZ\n\n if (hasColors) {\n colors[componentIdx] = r\n colors[componentIdx + 1] = g\n colors[componentIdx + 2] = b\n }\n }\n }\n\n geometry.setAttribute('position', new BufferAttribute(vertices, 3))\n geometry.setAttribute('normal', new BufferAttribute(normals, 3))\n\n if (hasColors) {\n geometry.setAttribute('color', new BufferAttribute(colors, 3))\n geometry.hasColors = true\n geometry.alpha = alpha\n }\n\n return geometry\n }\n\n function parseASCII(data) {\n const geometry = new BufferGeometry()\n const patternSolid = /solid([\\s\\S]*?)endsolid/g\n const patternFace = /facet([\\s\\S]*?)endfacet/g\n let faceCounter = 0\n\n const patternFloat = /[\\s]+([+-]?(?:\\d*)(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)/.source\n const patternVertex = new RegExp('vertex' + patternFloat + patternFloat + patternFloat, 'g')\n const patternNormal = new RegExp('normal' + patternFloat + patternFloat + patternFloat, 'g')\n\n const vertices = []\n const normals = []\n\n const normal = new Vector3()\n\n let result\n\n let groupCount = 0\n let startVertex = 0\n let endVertex = 0\n\n while ((result = patternSolid.exec(data)) !== null) {\n startVertex = endVertex\n\n const solid = result[0]\n\n while ((result = patternFace.exec(solid)) !== null) {\n let vertexCountPerFace = 0\n let normalCountPerFace = 0\n\n const text = result[0]\n\n while ((result = patternNormal.exec(text)) !== null) {\n normal.x = parseFloat(result[1])\n normal.y = parseFloat(result[2])\n normal.z = parseFloat(result[3])\n normalCountPerFace++\n }\n\n while ((result = patternVertex.exec(text)) !== null) {\n vertices.push(parseFloat(result[1]), parseFloat(result[2]), parseFloat(result[3]))\n normals.push(normal.x, normal.y, normal.z)\n vertexCountPerFace++\n endVertex++\n }\n\n // every face have to own ONE valid normal\n\n if (normalCountPerFace !== 1) {\n console.error(\"THREE.STLLoader: Something isn't right with the normal of face number \" + faceCounter)\n }\n\n // each face have to own THREE valid vertices\n\n if (vertexCountPerFace !== 3) {\n console.error(\"THREE.STLLoader: Something isn't right with the vertices of face number \" + faceCounter)\n }\n\n faceCounter++\n }\n\n const start = startVertex\n const count = endVertex - startVertex\n\n geometry.addGroup(start, count, groupCount)\n groupCount++\n }\n\n geometry.setAttribute('position', new Float32BufferAttribute(vertices, 3))\n geometry.setAttribute('normal', new Float32BufferAttribute(normals, 3))\n\n return geometry\n }\n\n function ensureString(buffer) {\n if (typeof buffer !== 'string') {\n return decodeText(new Uint8Array(buffer))\n }\n\n return buffer\n }\n\n function ensureBinary(buffer) {\n if (typeof buffer === 'string') {\n const array_buffer = new Uint8Array(buffer.length)\n for (let i = 0; i < buffer.length; i++) {\n array_buffer[i] = buffer.charCodeAt(i) & 0xff // implicitly assumes little-endian\n }\n\n return array_buffer.buffer || array_buffer\n } else {\n return buffer\n }\n }\n\n // start\n\n const binData = ensureBinary(data)\n\n return isBinary(binData) ? parseBinary(binData) : parseASCII(ensureString(data))\n }\n}\n\nexport { STLLoader }\n"],"names":["data"],"mappings":"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"}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const THREE = require("three");
4
4
  const fflate = require("fflate");
5
+ const LoaderUtils = require("../_polyfill/LoaderUtils.cjs");
5
6
  class VTKLoader extends THREE.Loader {
6
7
  constructor(manager) {
7
8
  super(manager);
@@ -629,11 +630,11 @@ class VTKLoader extends THREE.Loader {
629
630
  throw new Error("Unsupported DATASET type");
630
631
  }
631
632
  }
632
- var meta = THREE.LoaderUtils.decodeText(new Uint8Array(data, 0, 250)).split("\n");
633
+ var meta = LoaderUtils.decodeText(new Uint8Array(data, 0, 250)).split("\n");
633
634
  if (meta[0].indexOf("xml") !== -1) {
634
- return parseXML(THREE.LoaderUtils.decodeText(data));
635
+ return parseXML(LoaderUtils.decodeText(data));
635
636
  } else if (meta[2].includes("ASCII")) {
636
- return parseASCII(THREE.LoaderUtils.decodeText(data));
637
+ return parseASCII(LoaderUtils.decodeText(data));
637
638
  } else {
638
639
  return parseBinary(data);
639
640
  }