{"version":3,"file":"VOXLoader.cjs","sources":["../../src/loaders/VOXLoader.js"],"sourcesContent":["import {\n  BufferGeometry,\n  FileLoader,\n  Float32BufferAttribute,\n  Loader,\n  LinearFilter,\n  Mesh,\n  MeshStandardMaterial,\n  NearestFilter,\n  RedFormat,\n} from 'three'\nimport { Data3DTexture } from '../_polyfill/Data3DTexture'\n\nclass VOXLoader extends Loader {\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.load(\n      url,\n      function (buffer) {\n        try {\n          onLoad(scope.parse(buffer))\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(buffer) {\n    const data = new DataView(buffer)\n\n    const id = data.getUint32(0, true)\n    const version = data.getUint32(4, true)\n\n    if (id !== 542658390 || version !== 150) {\n      console.error('Not a valid VOX file')\n      return\n    }\n\n    const DEFAULT_PALETTE = [\n      0x00000000,\n      0xffffffff,\n      0xffccffff,\n      0xff99ffff,\n      0xff66ffff,\n      0xff33ffff,\n      0xff00ffff,\n      0xffffccff,\n      0xffccccff,\n      0xff99ccff,\n      0xff66ccff,\n      0xff33ccff,\n      0xff00ccff,\n      0xffff99ff,\n      0xffcc99ff,\n      0xff9999ff,\n      0xff6699ff,\n      0xff3399ff,\n      0xff0099ff,\n      0xffff66ff,\n      0xffcc66ff,\n      0xff9966ff,\n      0xff6666ff,\n      0xff3366ff,\n      0xff0066ff,\n      0xffff33ff,\n      0xffcc33ff,\n      0xff9933ff,\n      0xff6633ff,\n      0xff3333ff,\n      0xff0033ff,\n      0xffff00ff,\n      0xffcc00ff,\n      0xff9900ff,\n      0xff6600ff,\n      0xff3300ff,\n      0xff0000ff,\n      0xffffffcc,\n      0xffccffcc,\n      0xff99ffcc,\n      0xff66ffcc,\n      0xff33ffcc,\n      0xff00ffcc,\n      0xffffcccc,\n      0xffcccccc,\n      0xff99cccc,\n      0xff66cccc,\n      0xff33cccc,\n      0xff00cccc,\n      0xffff99cc,\n      0xffcc99cc,\n      0xff9999cc,\n      0xff6699cc,\n      0xff3399cc,\n      0xff0099cc,\n      0xffff66cc,\n      0xffcc66cc,\n      0xff9966cc,\n      0xff6666cc,\n      0xff3366cc,\n      0xff0066cc,\n      0xffff33cc,\n      0xffcc33cc,\n      0xff9933cc,\n      0xff6633cc,\n      0xff3333cc,\n      0xff0033cc,\n      0xffff00cc,\n      0xffcc00cc,\n      0xff9900cc,\n      0xff6600cc,\n      0xff3300cc,\n      0xff0000cc,\n      0xffffff99,\n      0xffccff99,\n      0xff99ff99,\n      0xff66ff99,\n      0xff33ff99,\n      0xff00ff99,\n      0xffffcc99,\n      0xffcccc99,\n      0xff99cc99,\n      0xff66cc99,\n      0xff33cc99,\n      0xff00cc99,\n      0xffff9999,\n      0xffcc9999,\n      0xff999999,\n      0xff669999,\n      0xff339999,\n      0xff009999,\n      0xffff6699,\n      0xffcc6699,\n      0xff996699,\n      0xff666699,\n      0xff336699,\n      0xff006699,\n      0xffff3399,\n      0xffcc3399,\n      0xff993399,\n      0xff663399,\n      0xff333399,\n      0xff003399,\n      0xffff0099,\n      0xffcc0099,\n      0xff990099,\n      0xff660099,\n      0xff330099,\n      0xff000099,\n      0xffffff66,\n      0xffccff66,\n      0xff99ff66,\n      0xff66ff66,\n      0xff33ff66,\n      0xff00ff66,\n      0xffffcc66,\n      0xffcccc66,\n      0xff99cc66,\n      0xff66cc66,\n      0xff33cc66,\n      0xff00cc66,\n      0xffff9966,\n      0xffcc9966,\n      0xff999966,\n      0xff669966,\n      0xff339966,\n      0xff009966,\n      0xffff6666,\n      0xffcc6666,\n      0xff996666,\n      0xff666666,\n      0xff336666,\n      0xff006666,\n      0xffff3366,\n      0xffcc3366,\n      0xff993366,\n      0xff663366,\n      0xff333366,\n      0xff003366,\n      0xffff0066,\n      0xffcc0066,\n      0xff990066,\n      0xff660066,\n      0xff330066,\n      0xff000066,\n      0xffffff33,\n      0xffccff33,\n      0xff99ff33,\n      0xff66ff33,\n      0xff33ff33,\n      0xff00ff33,\n      0xffffcc33,\n      0xffcccc33,\n      0xff99cc33,\n      0xff66cc33,\n      0xff33cc33,\n      0xff00cc33,\n      0xffff9933,\n      0xffcc9933,\n      0xff999933,\n      0xff669933,\n      0xff339933,\n      0xff009933,\n      0xffff6633,\n      0xffcc6633,\n      0xff996633,\n      0xff666633,\n      0xff336633,\n      0xff006633,\n      0xffff3333,\n      0xffcc3333,\n      0xff993333,\n      0xff663333,\n      0xff333333,\n      0xff003333,\n      0xffff0033,\n      0xffcc0033,\n      0xff990033,\n      0xff660033,\n      0xff330033,\n      0xff000033,\n      0xffffff00,\n      0xffccff00,\n      0xff99ff00,\n      0xff66ff00,\n      0xff33ff00,\n      0xff00ff00,\n      0xffffcc00,\n      0xffcccc00,\n      0xff99cc00,\n      0xff66cc00,\n      0xff33cc00,\n      0xff00cc00,\n      0xffff9900,\n      0xffcc9900,\n      0xff999900,\n      0xff669900,\n      0xff339900,\n      0xff009900,\n      0xffff6600,\n      0xffcc6600,\n      0xff996600,\n      0xff666600,\n      0xff336600,\n      0xff006600,\n      0xffff3300,\n      0xffcc3300,\n      0xff993300,\n      0xff663300,\n      0xff333300,\n      0xff003300,\n      0xffff0000,\n      0xffcc0000,\n      0xff990000,\n      0xff660000,\n      0xff330000,\n      0xff0000ee,\n      0xff0000dd,\n      0xff0000bb,\n      0xff0000aa,\n      0xff000088,\n      0xff000077,\n      0xff000055,\n      0xff000044,\n      0xff000022,\n      0xff000011,\n      0xff00ee00,\n      0xff00dd00,\n      0xff00bb00,\n      0xff00aa00,\n      0xff008800,\n      0xff007700,\n      0xff005500,\n      0xff004400,\n      0xff002200,\n      0xff001100,\n      0xffee0000,\n      0xffdd0000,\n      0xffbb0000,\n      0xffaa0000,\n      0xff880000,\n      0xff770000,\n      0xff550000,\n      0xff440000,\n      0xff220000,\n      0xff110000,\n      0xffeeeeee,\n      0xffdddddd,\n      0xffbbbbbb,\n      0xffaaaaaa,\n      0xff888888,\n      0xff777777,\n      0xff555555,\n      0xff444444,\n      0xff222222,\n      0xff111111,\n    ]\n\n    let i = 8\n\n    let chunk\n    const chunks = []\n\n    while (i < data.byteLength) {\n      let id = ''\n\n      for (let j = 0; j < 4; j++) {\n        id += String.fromCharCode(data.getUint8(i++))\n      }\n\n      const chunkSize = data.getUint32(i, true)\n      i += 4\n      i += 4 // childChunks\n\n      if (id === 'SIZE') {\n        const x = data.getUint32(i, true)\n        i += 4\n        const y = data.getUint32(i, true)\n        i += 4\n        const z = data.getUint32(i, true)\n        i += 4\n\n        chunk = {\n          palette: DEFAULT_PALETTE,\n          size: { x: x, y: y, z: z },\n        }\n\n        chunks.push(chunk)\n\n        i += chunkSize - 3 * 4\n      } else if (id === 'XYZI') {\n        const numVoxels = data.getUint32(i, true)\n        i += 4\n        chunk.data = new Uint8Array(buffer, i, numVoxels * 4)\n\n        i += numVoxels * 4\n      } else if (id === 'RGBA') {\n        const palette = [0]\n\n        for (let j = 0; j < 256; j++) {\n          palette[j + 1] = data.getUint32(i, true)\n          i += 4\n        }\n\n        chunk.palette = palette\n      } else {\n        // console.log( id, chunkSize, childChunks );\n\n        i += chunkSize\n      }\n    }\n\n    return chunks\n  }\n}\n\nclass VOXMesh extends Mesh {\n  constructor(chunk) {\n    const data = chunk.data\n    const size = chunk.size\n    const palette = chunk.palette\n\n    //\n\n    const vertices = []\n    const colors = []\n\n    const nx = [0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1]\n    const px = [1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0]\n    const py = [0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1]\n    const ny = [0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0]\n    const nz = [0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0]\n    const pz = [0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1]\n\n    function add(tile, x, y, z, r, g, b) {\n      x -= size.x / 2\n      y -= size.z / 2\n      z += size.y / 2\n\n      for (let i = 0; i < 18; i += 3) {\n        vertices.push(tile[i + 0] + x, tile[i + 1] + y, tile[i + 2] + z)\n        colors.push(r, g, b)\n      }\n    }\n\n    // Store data in a volume for sampling\n\n    const offsety = size.x\n    const offsetz = size.x * size.y\n\n    const array = new Uint8Array(size.x * size.y * size.z)\n\n    for (let j = 0; j < data.length; j += 4) {\n      const x = data[j + 0]\n      const y = data[j + 1]\n      const z = data[j + 2]\n\n      const index = x + y * offsety + z * offsetz\n\n      array[index] = 255\n    }\n\n    // Construct geometry\n\n    let hasColors = false\n\n    for (let j = 0; j < data.length; j += 4) {\n      const x = data[j + 0]\n      const y = data[j + 1]\n      const z = data[j + 2]\n      const c = data[j + 3]\n\n      const hex = palette[c]\n      const r = ((hex >> 0) & 0xff) / 0xff\n      const g = ((hex >> 8) & 0xff) / 0xff\n      const b = ((hex >> 16) & 0xff) / 0xff\n\n      if (r > 0 || g > 0 || b > 0) hasColors = true\n\n      const index = x + y * offsety + z * offsetz\n\n      if (array[index + 1] === 0 || x === size.x - 1) add(px, x, z, -y, r, g, b)\n      if (array[index - 1] === 0 || x === 0) add(nx, x, z, -y, r, g, b)\n      if (array[index + offsety] === 0 || y === size.y - 1) add(ny, x, z, -y, r, g, b)\n      if (array[index - offsety] === 0 || y === 0) add(py, x, z, -y, r, g, b)\n      if (array[index + offsetz] === 0 || z === size.z - 1) add(pz, x, z, -y, r, g, b)\n      if (array[index - offsetz] === 0 || z === 0) add(nz, x, z, -y, r, g, b)\n    }\n\n    const geometry = new BufferGeometry()\n    geometry.setAttribute('position', new Float32BufferAttribute(vertices, 3))\n    geometry.computeVertexNormals()\n\n    const material = new MeshStandardMaterial()\n\n    if (hasColors) {\n      geometry.setAttribute('color', new Float32BufferAttribute(colors, 3))\n      material.vertexColors = true\n    }\n\n    super(geometry, material)\n  }\n}\n\nclass VOXData3DTexture extends Data3DTexture {\n  constructor(chunk) {\n    const data = chunk.data\n    const size = chunk.size\n\n    const offsety = size.x\n    const offsetz = size.x * size.y\n\n    const array = new Uint8Array(size.x * size.y * size.z)\n\n    for (let j = 0; j < data.length; j += 4) {\n      const x = data[j + 0]\n      const y = data[j + 1]\n      const z = data[j + 2]\n\n      const index = x + y * offsety + z * offsetz\n\n      array[index] = 255\n    }\n\n    super(array, size.x, size.y, size.z)\n\n    this.format = RedFormat\n    this.minFilter = NearestFilter\n    this.magFilter = LinearFilter\n    this.unpackAlignment = 1\n    this.needsUpdate = true\n  }\n}\n\nexport { VOXLoader, VOXMesh, VOXData3DTexture }\n"],"names":["Loader","FileLoader","id","Mesh","BufferGeometry","Float32BufferAttribute","MeshStandardMaterial","Data3DTexture","RedFormat","NearestFilter","LinearFilter"],"mappings":";;;;AAaA,MAAM,kBAAkBA,MAAAA,OAAO;AAAA,EAC7B,KAAK,KAAK,QAAQ,YAAY,SAAS;AACrC,UAAM,QAAQ;AAEd,UAAM,SAAS,IAAIC,iBAAW,MAAM,OAAO;AAC3C,WAAO,QAAQ,MAAM,IAAI;AACzB,WAAO,gBAAgB,aAAa;AACpC,WAAO,iBAAiB,MAAM,aAAa;AAC3C,WAAO;AAAA,MACL;AAAA,MACA,SAAU,QAAQ;AAChB,YAAI;AACF,iBAAO,MAAM,MAAM,MAAM,CAAC;AAAA,QAC3B,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,QAAQ;AACZ,UAAM,OAAO,IAAI,SAAS,MAAM;AAEhC,UAAM,KAAK,KAAK,UAAU,GAAG,IAAI;AACjC,UAAM,UAAU,KAAK,UAAU,GAAG,IAAI;AAEtC,QAAI,OAAO,aAAa,YAAY,KAAK;AACvC,cAAQ,MAAM,sBAAsB;AACpC;AAAA,IACD;AAED,UAAM,kBAAkB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;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"}