{
  "version": 3,
  "sources": ["../src/index.ts", "../src/potree-loader.ts", "../src/parsers/parse-potree-hierarchy-chunk.ts", "../src/potree-hierarchy-chunk-loader.ts", "../src/parsers/parse-potree-bin.ts", "../src/potree-bin-loader.ts", "../src/lib/potree-node-source.ts", "../src/utils/parse-version.ts", "../src/utils/projection-utils.ts", "../src/utils/bounding-box-utils.ts", "../src/potree-source.ts"],
  "sourcesContent": ["export {PotreeLoader} from './potree-loader';\nexport {PotreeHierarchyChunkLoader} from './potree-hierarchy-chunk-loader';\nexport {PotreeBinLoader} from './potree-bin-loader';\nexport {PotreeSource} from './potree-source';\n\nexport {type POTreeNode} from './parsers/parse-potree-hierarchy-chunk';\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright vis.gl contributors\n\nimport type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\nexport type POTreeLoaderOptions = LoaderOptions & {\n  potree?: {};\n};\n\n/** Potree loader */\nexport const PotreeLoader = {\n  dataType: null as unknown as any,\n  batchType: null as never,\n\n  name: 'potree metadata',\n  id: 'potree',\n  module: 'potree',\n  version: VERSION,\n  extensions: ['js'],\n  mimeTypes: ['application/json'],\n  testText: (text) => text.indexOf('octreeDir') >= 0,\n  parse: (data: ArrayBuffer) => JSON.parse(new TextDecoder().decode(data)),\n  parseTextSync: (text) => JSON.parse(text),\n  options: {\n    potree: {}\n  }\n} as const satisfies LoaderWithParser<any, never, POTreeLoaderOptions>;\n", "// This file is derived from the Cesium code base under BSD 2-clause license\n// See LICENSE.md and https://github.com/potree/potree/blob/develop/LICENSE\n\n// Potree Hierarchy Chunk file format\n// https://github.com/potree/potree/blob/develop/docs/potree-file-format.md#index-files\n\n/*\n### Hierarchy Chunk Files\n\nAs mentioned in the former section, the `.hrc` files contain the index structure\nmeaning a list of all the files stored within the directory tree.\n\nAn index file contains a list of tuple values with the first being a `uint8`\n\"mask\" and the second being `uint32` \"number of points\" of a hierarchy level\nin a [breadth first level order][breadth-first].\n\nPer hierarchy level we have 8 possible nodes. To indicate whether a node exists\na simple binary mask is used:\n\n| Position | Mask | [Binary][bin] |\n|----------|------|---------------|\n| 0        | 1    | 0b00000001    |\n| 1        | 2    | 0b00000010    |\n| 2        | 4    | 0b00000100    |\n| 3        | 8    | 0b00001000    |\n| 4        | 16   | 0b00010000    |\n| 5        | 32   | 0b00100000    |\n| 6        | 64   | 0b01000000    |\n| 7        | 128  | 0b10000000    |\n\nSo if in a hierarchy the child node 3 and node 7 exist then the hierarchies\nmask has to be `0b00001000 | 0b10000000` \u2192 `0b10001000` (=136).\n\n_Example:_ A simple, non-realistic tree:\n\n```\n|- r1\n|  |\n|  \\- r14 (2 Points)\n|\n\\- r3\n   |\n   \\- r36 (1 Point)\n```\n\nWould have an index looking like this:\n\n| name | mask               | points |\n|------|--------------------|--------|\n| r    | `0b00001010` (=10) | `3`    |\n| r1   | `0b00010000` (=16) | `2`    |\n| r3   | `0b01000000` (=64) | `1`    |\n| r14  | `0b00000000` (=0)  | `2`    |\n| r36  | `0b00000000` (=0)  | `1`    |\n*/\n\n/** Node metadata from index file */\nexport type POTreeTileHeader = {\n  /** Number of child nodes */\n  childCount: number;\n  /** Human readable name */\n  name: string;\n  /** Child availability mask */\n  childMask: number;\n};\n\n/** Hierarchical potree node structure */\nexport type POTreeNode = {\n  id: string;\n  type: 'pointcloud';\n  /** Index data */\n  header: POTreeTileHeader;\n  /** Human readable name */\n  name: string;\n  /** Number of points */\n  pointCount: number;\n  /** Node's level in the tree */\n  level: number;\n  /** Has children */\n  hasChildren: boolean;\n  /** Space between points */\n  spacing: number;\n  /** Available children */\n  children: POTreeNode[];\n  /** All children including unavailable */\n  childrenByIndex: POTreeNode[];\n  /** Is tile selected for rendering */\n  selected: boolean;\n  /** Points content data */\n  content?: unknown;\n  /** Is content loading */\n  isContentLoading?: boolean;\n  /** Viewport Ids */\n  viewportIds: unknown[];\n};\n\n/**\n * load hierarchy\n * @param arrayBuffer - binary index data\n * @returns root node\n **/\nexport function parsePotreeHierarchyChunk(arrayBuffer: ArrayBuffer): POTreeNode {\n  const tileHeaders = parseBinaryChunk(arrayBuffer);\n  return buildHierarchy(tileHeaders);\n}\n\n/**\n * Parses the binary rows\n * @param arrayBuffer - binary index data to parse\n * @param byteOffset - byte offset to start from\n * @returns flat nodes array\n * */\nfunction parseBinaryChunk(arrayBuffer: ArrayBuffer, byteOffset = 0): POTreeNode[] {\n  const dataView = new DataView(arrayBuffer);\n\n  const stack: POTreeNode[] = [];\n\n  // Get root mask\n  // @ts-expect-error\n  const topTileHeader: POTreeNode = {};\n  byteOffset = decodeRow(dataView, byteOffset, topTileHeader);\n\n  stack.push(topTileHeader);\n  const tileHeaders: POTreeNode[] = [topTileHeader];\n\n  while (stack.length > 0) {\n    const snode = stack.shift();\n    let mask = 1;\n\n    for (let i = 0; i < 8; i++) {\n      if (snode && (snode.header.childMask & mask) !== 0) {\n        // @ts-expect-error\n        const tileHeader: POTreeNode = {};\n        byteOffset = decodeRow(dataView, byteOffset, tileHeader);\n        tileHeader.name = snode.name + i;\n\n        stack.push(tileHeader);\n        tileHeaders.push(tileHeader);\n        snode.header.childCount++;\n      }\n      mask = mask * 2;\n    }\n\n    if (byteOffset === dataView.byteLength) {\n      break;\n    }\n  }\n\n  return tileHeaders;\n}\n\n/**\n * Reads next row from binary index file\n * @param dataView - index data\n * @param byteOffset - current offset in the index data\n * @param tileHeader - container to read to\n * @returns new offset\n */\nfunction decodeRow(dataView: DataView, byteOffset: number, tileHeader: POTreeNode): number {\n  tileHeader.header = tileHeader.header || {};\n  tileHeader.header.childMask = dataView.getUint8(byteOffset);\n  tileHeader.header.childCount = 0;\n  tileHeader.pointCount = dataView.getUint32(byteOffset + 1, true);\n  tileHeader.name = '';\n  byteOffset += 5;\n  return byteOffset;\n}\n\n/** Resolves the binary rows into a hierarchy (tree structure) */\nfunction buildHierarchy(flatNodes: POTreeNode[], options: {spacing?: number} = {}): POTreeNode {\n  const DEFAULT_OPTIONS = {spacing: 100}; // TODO assert instead of default?\n  options = {...DEFAULT_OPTIONS, ...options};\n\n  const topNode: POTreeNode = flatNodes[0];\n  const nodes = {};\n\n  for (const node of flatNodes) {\n    const {name} = node;\n\n    const index = parseInt(name.charAt(name.length - 1), 10);\n    const parentName = name.substring(0, name.length - 1);\n    const parentNode = nodes[parentName];\n    const level = name.length - 1;\n    // assert(parentNode && level >= 0);\n\n    node.level = level;\n    node.hasChildren = Boolean(node.header.childCount);\n    node.children = [];\n    node.childrenByIndex = new Array(8).fill(null);\n    node.spacing = (options?.spacing || 0) / Math.pow(2, level);\n    node.type = 'pointcloud';\n    node.id = node.name;\n    // tileHeader.boundingVolume = Utils.createChildAABB(parentNode.boundingBox, index);\n\n    if (parentNode) {\n      parentNode.children.push(node);\n      parentNode.childrenByIndex[index] = node;\n    }\n\n    // Add the node to the map\n    nodes[name] = node;\n  }\n\n  // First node is the root\n  return topNode;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright vis.gl contributors\n\nimport type {LoaderWithParser} from '@loaders.gl/loader-utils';\nimport type {POTreeLoaderOptions} from './potree-loader';\nimport type {POTreeNode} from './parsers/parse-potree-hierarchy-chunk';\nimport {parsePotreeHierarchyChunk} from './parsers/parse-potree-hierarchy-chunk';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\n/** Potree hierarchy chunk loader */\nexport const PotreeHierarchyChunkLoader = {\n  dataType: null as unknown as POTreeNode,\n  batchType: null as never,\n\n  name: 'potree Hierarchy Chunk',\n  id: 'potree-hrc',\n  module: 'potree',\n  version: VERSION,\n  extensions: ['hrc'],\n  mimeTypes: ['application/octet-stream'],\n  // binary potree files have no header bytes, no content test function possible\n  // test: ['...'],\n  parse: async (arrayBuffer, options) => parsePotreeHierarchyChunk(arrayBuffer),\n  parseSync: (arrayBuffer, options) => parsePotreeHierarchyChunk(arrayBuffer),\n  options: {\n    potree: {}\n  },\n  binary: true\n} as const satisfies LoaderWithParser<POTreeNode, never, POTreeLoaderOptions>;\n", "export function parsePotreeBin(\n  arrayBuffer: ArrayBuffer,\n  byteOffset: number,\n  options: unknown,\n  index: any\n) {\n  return null;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright vis.gl contributors\n\nimport type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';\nimport {parsePotreeBin} from './parsers/parse-potree-bin';\n\n/**\n * Loader for potree Binary Point Attributes\n * */\nexport const PotreeBinLoader = {\n  dataType: null as unknown as {},\n  batchType: null as never,\n\n  name: 'potree Binary Point Attributes',\n  id: 'potree',\n  extensions: ['bin'],\n  mimeTypes: ['application/octet-stream'],\n  // Unfortunately binary potree files have no header bytes, no test possible\n  // test: ['...'],\n  parseSync,\n  binary: true,\n  options: {}\n  // @ts-ignore\n} as const satisfies LoaderWithParser<{}, never, LoaderOptions>;\n\nfunction parseSync(arrayBuffer: ArrayBuffer, options?: LoaderOptions): {} {\n  const index = {};\n  const byteOffset = 0;\n  parsePotreeBin(arrayBuffer, byteOffset, options, index);\n  return index;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {PotreeSourceOptions} from '../potree-source';\nimport {load} from '@loaders.gl/core';\nimport {Mesh} from '@loaders.gl/schema';\nimport {DataSource, resolvePath} from '@loaders.gl/loader-utils';\nimport {LASLoader} from '@loaders.gl/las';\nimport {PotreeBoundingBox, PotreeMetadata} from '../types/potree-metadata';\nimport {POTreeNode} from '../parsers/parse-potree-hierarchy-chunk';\nimport {PotreeHierarchyChunkLoader} from '../potree-hierarchy-chunk-loader';\nimport {PotreeLoader} from '../potree-loader';\nimport {parseVersion} from '../utils/parse-version';\nimport {Proj4Projection} from '@math.gl/proj4';\nimport {LASMesh} from '@loaders.gl/las/src/lib/las-types';\nimport {createProjection} from '../utils/projection-utils';\nimport {getCartographicOriginFromBoundingBox} from '../utils/bounding-box-utils';\n\n// https://github.com/visgl/deck.gl/blob/9548f43cba2234a1f4877b6b17f6c88eb35b2e08/modules/core/src/lib/constants.js#L27\n// Describes the format of positions\nexport enum COORDINATE_SYSTEM {\n  /**\n   * `LNGLAT` if rendering into a geospatial viewport, `CARTESIAN` otherwise\n   */\n  DEFAULT = -1,\n  /**\n   * Positions are interpreted as [lng, lat, elevation]\n   * lng lat are degrees, elevation is meters. distances as meters.\n   */\n  LNGLAT = 1,\n  /**\n   * Positions are interpreted as meter offsets, distances as meters\n   */\n  METER_OFFSETS = 2,\n  /**\n   * Positions are interpreted as lng lat offsets: [deltaLng, deltaLat, elevation]\n   * deltaLng, deltaLat are delta degrees, elevation is meters.\n   * distances as meters.\n   */\n  LNGLAT_OFFSETS = 3,\n  /**\n   * Non-geospatial\n   */\n  CARTESIAN = 0\n}\n\nexport interface PotreeNodeMesh extends LASMesh {\n  cartographicOrigin: number[];\n  coordinateSystem: number;\n}\n\n/**\n * A Potree data source\n * @version 1.0 - @see https://github.com/potree/potree/blob/1.0RC/docs/file_format.md\n * @version 1.7 - @see https://github.com/potree/potree/blob/1.7/docs/potree-file-format.md\n * @note Point cloud nodes tile source\n */\nexport class PotreeNodesSource extends DataSource<string, PotreeSourceOptions> {\n  /** Dataset base URL */\n  baseUrl: string = '';\n  /** Meta information from `cloud.js` */\n  metadata: PotreeMetadata | null = null;\n  /** Root node */\n  root: POTreeNode | null = null;\n  /** Is data source ready to use after initial loading */\n  isReady = false;\n  /** local CRS to WGS84 projection */\n  projection: Proj4Projection | null = null;\n  /** The data set minimum bounding box */\n  boundingBox?: PotreeBoundingBox;\n\n  private initPromise: Promise<void> | null = null;\n\n  /**\n   * @constructor\n   * @param data  - if string - data set path url or path to `cloud.js` metadata file\n   *              - if Blob - single file data\n   * @param options - data source properties\n   */\n  constructor(data: string, options: PotreeSourceOptions) {\n    super(data, options);\n    this.makeBaseUrl(this.data);\n\n    this.initPromise = this.init();\n  }\n\n  /** Initial data source loading */\n  async init() {\n    if (this.initPromise) {\n      await this.initPromise;\n      return;\n    }\n    this.metadata = await load(`${this.baseUrl}/cloud.js`, PotreeLoader);\n    this.projection = createProjection(this.metadata?.projection);\n    this.parseBoundingVolume();\n\n    await this.loadHierarchy();\n    this.isReady = true;\n  }\n\n  /** Is data set supported */\n  isSupported(): boolean {\n    const {minor, major} = parseVersion(this.metadata?.version ?? '');\n    return (\n      this.isReady &&\n      major === 1 &&\n      minor <= 8 &&\n      typeof this.metadata?.pointAttributes === 'string' &&\n      ['LAS', 'LAZ'].includes(this.metadata?.pointAttributes)\n    );\n  }\n\n  /** Get content files extension */\n  getContentExtension(): string | null {\n    if (!this.isReady) {\n      return null;\n    }\n    switch (this.metadata?.pointAttributes) {\n      case 'LAS':\n        return 'las';\n      case 'LAZ':\n        return 'laz';\n      default:\n        return 'bin';\n    }\n  }\n\n  /**\n   * Load octree node content\n   * @param nodeName name of a node, string of numbers in range 0..7\n   * @return node content geometry or null if the node doesn't exist\n   */\n  async loadNodeContent(nodeName: string): Promise<Mesh | null> {\n    await this.initPromise;\n\n    if (!this.isSupported()) {\n      return null;\n    }\n\n    const isAvailable = await this.isNodeAvailable(nodeName);\n    if (isAvailable) {\n      const result: PotreeNodeMesh = (await load(\n        `${this.baseUrl}/${this.metadata?.octreeDir}/r/r${nodeName}.${this.getContentExtension()}`,\n        LASLoader\n      )) as PotreeNodeMesh;\n\n      if (result) {\n        result.cartographicOrigin = getCartographicOriginFromBoundingBox(\n          this.projection,\n          result.header?.boundingBox\n        );\n        const position = result.attributes.POSITION.value as Float32Array;\n        for (let i = 0; i < (result.header?.vertexCount ?? 0); i++) {\n          let vertex: Float32Array | number[] = position.slice(i * 3, i * 3 + 2);\n          if (this.projection) {\n            vertex = this.projection.project(Array.from(vertex));\n          }\n\n          const offsets = [\n            vertex[0] - result.cartographicOrigin[0],\n            vertex[1] - result.cartographicOrigin[1],\n            position[i * 3 + 2] - result.cartographicOrigin[2]\n          ];\n          position.set(offsets, i * 3);\n        }\n        result.attributes.positions = result.attributes.POSITION;\n        result.attributes.colors = result.attributes.COLOR_0;\n        result.attributes.normals = result.attributes.NORMAL;\n\n        result.coordinateSystem = COORDINATE_SYSTEM.LNGLAT_OFFSETS;\n        return result;\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Check if a node exists in the octree\n   * @param nodeName name of a node, string of numbers in range 0..7\n   * @returns true - the node does exist, false - the nodes doesn't exist\n   */\n  async isNodeAvailable(nodeName: string): Promise<boolean> {\n    if (this.metadata?.hierarchy) {\n      return this.metadata.hierarchy.findIndex((item) => item[0] === `r${nodeName}`) !== -1;\n    }\n\n    if (!this.root) {\n      return false;\n    }\n    let currentParent = this.root;\n    let name = '';\n    let result = true;\n    for (const char of nodeName) {\n      const newName = `${name}${char}`;\n      const node = currentParent.children.find((child) => child.name === newName);\n      if (node) {\n        currentParent = node;\n        name = newName;\n      } else {\n        result = false;\n        break;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Load data source hierarchy into tree of available nodes\n   */\n  private async loadHierarchy(): Promise<void> {\n    this.root = await load(\n      `${this.baseUrl}/${this.metadata?.octreeDir}/r/r.hrc`,\n      PotreeHierarchyChunkLoader\n    );\n  }\n\n  /**\n   * Deduce base url from the input url sring\n   * @param data - data source input data\n   */\n  private makeBaseUrl(data: string | Blob): void {\n    this.baseUrl = typeof data === 'string' ? resolvePath(data) : '';\n    if (this.baseUrl.endsWith('cloud.js')) {\n      this.baseUrl = this.baseUrl.substring(0, -8);\n    }\n    if (this.baseUrl.endsWith('/')) {\n      this.baseUrl = this.baseUrl.substring(0, -1);\n    }\n  }\n\n  private parseBoundingVolume(): void {\n    if (this.metadata?.projection && this.metadata.tightBoundingBox) {\n      const projection = new Proj4Projection({\n        from: this.metadata.projection,\n        to: 'WGS84'\n      });\n\n      const {lx, ly, ux, uy} = this.metadata.tightBoundingBox;\n      const lCoord = [lx, ly];\n      const wgs84LCood = projection.project(lCoord);\n\n      const uCoord = [ux, uy];\n      const wgs84UCood = projection.project(uCoord);\n\n      this.boundingBox = {\n        ...this.metadata.tightBoundingBox,\n        lx: wgs84LCood[0],\n        ly: wgs84LCood[1],\n        ux: wgs84UCood[0],\n        uy: wgs84UCood[1]\n      };\n    } else {\n      this.boundingBox = this.metadata?.tightBoundingBox;\n    }\n  }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nexport function parseVersion(version: string): {major: number; minor: number} {\n  const parts = version.split('.').map(Number);\n  return {major: parts[0], minor: parts[1]};\n}\n", "import {Proj4Projection} from '@math.gl/proj4';\n\n/**\n * Create projection from proj4 definition to WGS84\n * @param projectionData - proj4 definition\n * @returns projection instance\n */\nexport const createProjection = (projectionData?: string): Proj4Projection | null => {\n  if (!projectionData) {\n    return null;\n  }\n  return new Proj4Projection({\n    from: projectionData,\n    to: 'WGS84'\n  });\n};\n", "import {Proj4Projection} from '@math.gl/proj4';\n\n/**\n * Calculate cartographic origin from Potree bounding box\n * @param projection - Proj4Projection instance to reproject coordinates\n * @param boundingBox - bounding box data\n * @returns - origin of boudngin box in [lng, lat, z] mode\n */\nexport const getCartographicOriginFromBoundingBox = (\n  projection: Proj4Projection | null,\n  boundingBox?: [number[], number[]]\n): number[] => {\n  if (!boundingBox) {\n    return [0, 0, 0];\n  }\n  const [minXOriginal, minYOriginal, minZ] = boundingBox[0];\n  const [maxXOriginal, maxYOriginal, maxZ] = boundingBox[1];\n  let minX = minXOriginal;\n  let minY = minYOriginal;\n  let maxX = maxXOriginal;\n  let maxY = maxYOriginal;\n  if (projection) {\n    [minX, minY] = projection.project([minX, minY]);\n    [maxX, maxY] = projection.project([maxX, maxY]);\n  }\n  return [minX + (maxX - minX) / 2, minY + (maxY - minY) / 2, minZ + (maxZ - minZ) / 2];\n};\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Source, DataSourceOptions} from '@loaders.gl/loader-utils';\nimport {PotreeNodesSource} from './lib/potree-node-source';\n\nconst VERSION = '1.7';\n\nexport type PotreeSourceOptions = DataSourceOptions & {\n  potree?: {};\n};\n\n/**\n * Creates point cloud data sources for Potree urls\n */\nexport const PotreeSource = {\n  name: 'Potree',\n  id: 'potree',\n  module: 'potree',\n  version: VERSION,\n  extensions: ['bin', 'las', 'laz'],\n  mimeTypes: ['application/octet-stream'],\n  type: 'potree',\n  fromUrl: true,\n  fromBlob: true,\n\n  defaultOptions: {\n    potree: {}\n  },\n\n  testURL: (url: string) => url.endsWith('.js'),\n  createDataSource: (url: string, options: PotreeSourceOptions) =>\n    new PotreeNodesSource(url, options) // , PotreeNodesSource.defaultOptions)\n} as const satisfies Source<PotreeNodesSource>;\n"],
  "mappings": "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",
  "names": ["VERSION", "import_proj4", "COORDINATE_SYSTEM", "VERSION"]
}
