{"version":3,"file":"LUT3dlLoader.cjs","sources":["../../src/loaders/LUT3dlLoader.js"],"sourcesContent":["// http://download.autodesk.com/us/systemdocs/help/2011/lustre/index.html?url=./files/WSc4e151a45a3b785a24c3d9a411df9298473-7ffd.htm,topicNumber=d0e9492\n// https://community.foundry.com/discuss/topic/103636/format-spec-for-3dl?mode=Post&postID=895258\nimport { Loader, FileLoader, DataTexture, RGBAFormat, UnsignedByteType, ClampToEdgeWrapping, LinearFilter } from 'three'\nimport { Data3DTexture } from '../_polyfill/Data3DTexture'\n\nexport class LUT3dlLoader extends Loader {\n  load(url, onLoad, onProgress, onError) {\n    const loader = new FileLoader(this.manager)\n    loader.setPath(this.path)\n    loader.setResponseType('text')\n    loader.load(\n      url,\n      (text) => {\n        try {\n          onLoad(this.parse(text))\n        } catch (e) {\n          if (onError) {\n            onError(e)\n          } else {\n            console.error(e)\n          }\n\n          this.manager.itemError(url)\n        }\n      },\n      onProgress,\n      onError,\n    )\n  }\n\n  parse(str) {\n    // remove empty lines and comment lints\n    str = str\n      .replace(/^#.*?(\\n|\\r)/gm, '')\n      .replace(/^\\s*?(\\n|\\r)/gm, '')\n      .trim()\n\n    const lines = str.split(/[\\n\\r]+/g)\n\n    // first line is the positions on the grid that are provided by the LUT\n    const gridLines = lines[0]\n      .trim()\n      .split(/\\s+/g)\n      .map((e) => parseFloat(e))\n    const gridStep = gridLines[1] - gridLines[0]\n    const size = gridLines.length\n\n    for (let i = 1, l = gridLines.length; i < l; i++) {\n      if (gridStep !== gridLines[i] - gridLines[i - 1]) {\n        throw new Error('LUT3dlLoader: Inconsistent grid size not supported.')\n      }\n    }\n\n    const dataArray = new Array(size * size * size * 4)\n    let index = 0\n    let maxOutputValue = 0.0\n    for (let i = 1, l = lines.length; i < l; i++) {\n      const line = lines[i].trim()\n      const split = line.split(/\\s/g)\n\n      const r = parseFloat(split[0])\n      const g = parseFloat(split[1])\n      const b = parseFloat(split[2])\n      maxOutputValue = Math.max(maxOutputValue, r, g, b)\n\n      const bLayer = index % size\n      const gLayer = Math.floor(index / size) % size\n      const rLayer = Math.floor(index / (size * size)) % size\n\n      // b grows first, then g, then r\n      const pixelIndex = bLayer * size * size + gLayer * size + rLayer\n      dataArray[4 * pixelIndex + 0] = r\n      dataArray[4 * pixelIndex + 1] = g\n      dataArray[4 * pixelIndex + 2] = b\n      dataArray[4 * pixelIndex + 3] = 1.0\n      index += 1\n    }\n\n    // Find the apparent bit depth of the stored RGB values and map the\n    // values to [ 0, 255 ].\n    const bits = Math.ceil(Math.log2(maxOutputValue))\n    const maxBitValue = Math.pow(2.0, bits)\n    for (let i = 0, l = dataArray.length; i < l; i += 4) {\n      const r = dataArray[i + 0]\n      const g = dataArray[i + 1]\n      const b = dataArray[i + 2]\n      dataArray[i + 0] = (255 * r) / maxBitValue // r\n      dataArray[i + 1] = (255 * g) / maxBitValue // g\n      dataArray[i + 2] = (255 * b) / maxBitValue // b\n    }\n\n    const data = new Uint8Array(dataArray)\n    const texture = new DataTexture()\n    texture.image.data = data\n    texture.image.width = size\n    texture.image.height = size * size\n    texture.format = RGBAFormat\n    texture.type = UnsignedByteType\n    texture.magFilter = LinearFilter\n    texture.minFilter = LinearFilter\n    texture.wrapS = ClampToEdgeWrapping\n    texture.wrapT = ClampToEdgeWrapping\n    texture.generateMipmaps = false\n    texture.needsUpdate = true\n\n    const texture3D = new Data3DTexture()\n    texture3D.image.data = data\n    texture3D.image.width = size\n    texture3D.image.height = size\n    texture3D.image.depth = size\n    texture3D.format = RGBAFormat\n    texture3D.type = UnsignedByteType\n    texture3D.magFilter = LinearFilter\n    texture3D.minFilter = LinearFilter\n    texture3D.wrapS = ClampToEdgeWrapping\n    texture3D.wrapT = ClampToEdgeWrapping\n    texture3D.wrapR = ClampToEdgeWrapping\n    texture3D.generateMipmaps = false\n    texture3D.needsUpdate = true\n\n    return {\n      size,\n      texture,\n      texture3D,\n    }\n  }\n}\n"],"names":["Loader","FileLoader","DataTexture","RGBAFormat","UnsignedByteType","LinearFilter","ClampToEdgeWrapping","Data3DTexture"],"mappings":"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"}