{"version":3,"file":"index.cjs","sources":["../../src/core/InstancedEntity.ts","../../src/utils/CreateTexture.ts","../../src/core/utils/GLInstancedBufferAttribute.ts","../../src/utils/MatrixUtils.ts","../../src/core/InstancedMeshBVH.ts","../../src/core/InstancedMesh2.ts","../../src/utils/SortingUtils.ts","../../src/core/utils/InstancedRenderList.ts","../../src/core/feature/FrustumCulling.ts","../../src/core/feature/LOD.ts","../../src/core/feature/Raycasting.ts","../../src/shaders/chunks/get_from_texture.glsl.ts","../../src/shaders/chunks/instanced_pars_vertex.glsl.ts","../../src/shaders/chunks/instanced_vertex.glsl.ts","../../src/shaders/ShaderChunk.ts"],"sourcesContent":["import { Color, ColorRepresentation, Euler, Matrix3, Matrix4, Mesh, Object3D, Quaternion, Vector2, Vector3, Vector4 } from 'three';\r\nimport { InstancedMesh2 } from './InstancedMesh2.js';\r\n\r\nexport type UniformValueNoNumber = Vector2 | Vector3 | Vector4 | Matrix3 | Matrix4;\r\nexport type UniformValue = number | UniformValueNoNumber;\r\n\r\nexport class InstancedEntity {\r\n  public readonly isInstanceEntity = true;\r\n  public readonly id: number;\r\n  public readonly owner: InstancedMesh2;\r\n  public position = new Vector3();\r\n  public scale = new Vector3(1, 1, 1);\r\n  public quaternion: Quaternion;\r\n  public rotation: Euler;\r\n  protected _parent: Object3D; // TODO implement\r\n\r\n  public get visible(): boolean { return this.owner.getVisibilityAt(this.id); }\r\n  public set visible(value: boolean) { this.owner.setVisibilityAt(this.id, value); }\r\n\r\n  public get color(): Color { return this.owner.getColorAt(this.id); }\r\n  public set color(value: ColorRepresentation) { this.owner.setColorAt(this.id, value); }\r\n\r\n  public get morph(): Mesh { return this.owner.getMorphAt(this.id); }\r\n  public set morph(value: Mesh) { this.owner.setMorphAt(this.id, value); }\r\n\r\n  public get matrix(): Matrix4 { return this.owner.getMatrixAt(this.id); }\r\n  public get matrixWorld(): Matrix4 { return this.matrix.premultiply(this.owner.matrixWorld); }\r\n\r\n  constructor(owner: InstancedMesh2, id: number, useEuler: boolean) {\r\n    this.id = id;\r\n    this.owner = owner;\r\n    const quaternion = this.quaternion = new Quaternion();\r\n\r\n    if (useEuler) {\r\n      const rotation = this.rotation = new Euler();\r\n\r\n      rotation._onChange(() => quaternion.setFromEuler(rotation, false));\r\n      quaternion._onChange(() => rotation.setFromQuaternion(quaternion, undefined, false));\r\n    }\r\n  }\r\n\r\n  public updateMatrix(): void {\r\n    const owner = this.owner;\r\n    const position = this.position;\r\n    const quaternion = this.quaternion as any;\r\n    const scale = this.scale;\r\n    const te = owner._matrixArray;\r\n    const id = this.id;\r\n    const offset = id * 16;\r\n\r\n    const x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;\r\n    const x2 = x + x, y2 = y + y, z2 = z + z;\r\n    const xx = x * x2, xy = x * y2, xz = x * z2;\r\n    const yy = y * y2, yz = y * z2, zz = z * z2;\r\n    const wx = w * x2, wy = w * y2, wz = w * z2;\r\n\r\n    const sx = scale.x, sy = scale.y, sz = scale.z;\r\n\r\n    te[offset + 0] = (1 - (yy + zz)) * sx;\r\n    te[offset + 1] = (xy + wz) * sx;\r\n    te[offset + 2] = (xz - wy) * sx;\r\n    te[offset + 3] = 0;\r\n\r\n    te[offset + 4] = (xy - wz) * sy;\r\n    te[offset + 5] = (1 - (xx + zz)) * sy;\r\n    te[offset + 6] = (yz + wx) * sy;\r\n    te[offset + 7] = 0;\r\n\r\n    te[offset + 8] = (xz + wy) * sz;\r\n    te[offset + 9] = (yz - wx) * sz;\r\n    te[offset + 10] = (1 - (xx + yy)) * sz;\r\n    te[offset + 11] = 0;\r\n\r\n    te[offset + 12] = position.x;\r\n    te[offset + 13] = position.y;\r\n    te[offset + 14] = position.z;\r\n    te[offset + 15] = 1;\r\n\r\n    owner.matricesTexture.needsUpdate = true;\r\n    owner.bvh?.move(id);\r\n  }\r\n\r\n  public updateMatrixPosition(): void {\r\n    const owner = this.owner;\r\n    const position = this.position;\r\n    const te = owner._matrixArray;\r\n    const id = this.id;\r\n    const offset = id * 16;\r\n\r\n    te[offset + 12] = position.x;\r\n    te[offset + 13] = position.y;\r\n    te[offset + 14] = position.z;\r\n\r\n    owner.matricesTexture.needsUpdate = true;\r\n    owner.bvh?.move(id);\r\n  }\r\n\r\n  public setUniform(name: string, value: UniformValue): void {\r\n    this.owner.setUniformAt(this.id, name, value);\r\n  }\r\n\r\n  public copyTo(target: Object3D): void {\r\n    target.position.copy(this.position);\r\n    target.scale.copy(this.scale);\r\n    target.quaternion.copy(this.quaternion);\r\n    if (this.rotation) target.rotation.copy(this.rotation);\r\n  }\r\n\r\n  public applyMatrix4(m: Matrix4): this {\r\n    this.matrix.premultiply(m).decompose(this.position, this.quaternion, this.scale);\r\n    return this;\r\n  }\r\n\r\n  public applyQuaternion(q: Quaternion): this {\r\n    this.quaternion.premultiply(q);\r\n    return this;\r\n  }\r\n\r\n  public rotateOnAxis(axis: Vector3, angle: number): this {\r\n    _quat.setFromAxisAngle(axis, angle);\r\n    this.quaternion.multiply(_quat);\r\n    return this;\r\n  }\r\n\r\n  public rotateOnWorldAxis(axis: Vector3, angle: number): this {\r\n    _quat.setFromAxisAngle(axis, angle);\r\n    this.quaternion.premultiply(_quat);\r\n    return this;\r\n  }\r\n\r\n  public rotateX(angle: number): this {\r\n    return this.rotateOnAxis(_xAxis, angle);\r\n  }\r\n\r\n  public rotateY(angle: number): this {\r\n    return this.rotateOnAxis(_yAxis, angle);\r\n  }\r\n\r\n  public rotateZ(angle: number): this {\r\n    return this.rotateOnAxis(_zAxis, angle);\r\n  }\r\n\r\n  public translateOnAxis(axis: Vector3, distance: number): this {\r\n    _vec3.copy(axis).applyQuaternion(this.quaternion);\r\n    this.position.add(_vec3.multiplyScalar(distance));\r\n    return this;\r\n  }\r\n\r\n  public translateX(distance: number): this {\r\n    return this.translateOnAxis(_xAxis, distance);\r\n  }\r\n\r\n  public translateY(distance: number): this {\r\n    return this.translateOnAxis(_yAxis, distance);\r\n  }\r\n\r\n  public translateZ(distance: number): this {\r\n    return this.translateOnAxis(_zAxis, distance);\r\n  }\r\n\r\n  // TODO add other object3D methods\r\n}\r\n\r\nconst _quat = new Quaternion();\r\nconst _vec3 = new Vector3();\r\nconst _xAxis = new Vector3(1, 0, 0);\r\nconst _yAxis = new Vector3(0, 1, 0);\r\nconst _zAxis = new Vector3(0, 0, 1);\r\n","import { DataTexture, FloatType, RedFormat, RedIntegerFormat, RGBAFormat, RGFormat, UnsignedIntType } from 'three';\r\n\r\nexport function createTexture_float(count: number): DataTexture {\r\n  const size = Math.ceil(Math.sqrt(count));\r\n  const array = new Float32Array(size * size);\r\n  const texture = new DataTexture(array, size, size, RedFormat, FloatType);\r\n  texture.needsUpdate = true;\r\n  return texture;\r\n}\r\n\r\nexport function createTexture_uint(count: number): DataTexture {\r\n  const size = Math.ceil(Math.sqrt(count));\r\n  const array = new Uint32Array(size * size);\r\n  const texture = new DataTexture(array, size, size, RedIntegerFormat, UnsignedIntType);\r\n  texture.needsUpdate = true;\r\n  return texture;\r\n}\r\n\r\nexport function createTexture_vec2(count: number): DataTexture {\r\n  const size = Math.ceil(Math.sqrt(count));\r\n  const array = new Float32Array(size * size * 2);\r\n  const texture = new DataTexture(array, size, size, RGFormat, FloatType);\r\n  texture.needsUpdate = true;\r\n  return texture;\r\n}\r\n\r\nexport function createTexture_vec4(count: number): DataTexture {\r\n  const size = Math.ceil(Math.sqrt(count));\r\n  const array = new Float32Array(size * size * 4);\r\n  const texture = new DataTexture(array, size, size, RGBAFormat, FloatType);\r\n  texture.needsUpdate = true;\r\n  return texture;\r\n}\r\n\r\nexport function createTexture_mat3(count: number): DataTexture {\r\n  let size = Math.sqrt(count * 3); // 3 pixels needed for 1 matrix\r\n  size = Math.ceil(size / 3) * 3;\r\n  size = Math.max(size, 3);\r\n  const array = new Float32Array(size * size * 4);\r\n  const texture = new DataTexture(array, size, size, RGBAFormat, FloatType);\r\n  texture.needsUpdate = true;\r\n  return texture;\r\n}\r\n\r\nexport function createTexture_mat4(count: number): DataTexture {\r\n  let size = Math.sqrt(count * 4); // 4 pixels needed for 1 matrix\r\n  size = Math.ceil(size / 4) * 4;\r\n  size = Math.max(size, 4);\r\n  const array = new Float32Array(size * size * 4);\r\n  const texture = new DataTexture(array, size, size, RGBAFormat, FloatType);\r\n  texture.needsUpdate = true;\r\n  return texture;\r\n}\r\n\r\n/**\r\n * 'createTexture_vec3' doesn't exist because of\r\n *  https://github.com/mrdoob/three.js/pull/23228\r\n */\r\n","import { GLBufferAttribute, TypedArray, WebGLRenderer } from 'three';\r\n\r\nexport class GLInstancedBufferAttribute extends GLBufferAttribute {\r\n  public isInstancedBufferAttribute = true;\r\n  public isGLInstancedBufferAttribute = true;\r\n  public meshPerAttribute: number;\r\n  public array: TypedArray;\r\n  /** @internal */ _needsUpdate = false;\r\n\r\n  constructor(gl: WebGL2RenderingContext, type: GLenum, itemSize: number, elementSize: 1 | 2 | 4, array: TypedArray, meshPerAttribute = 1) {\r\n    const buffer = gl.createBuffer();\r\n    super(buffer, type, itemSize, elementSize, array.length / itemSize);\r\n\r\n    this.meshPerAttribute = meshPerAttribute;\r\n    this.array = array;\r\n\r\n    gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\r\n    gl.bufferData(gl.ARRAY_BUFFER, array, gl.DYNAMIC_DRAW);\r\n  }\r\n\r\n  public update(renderer: WebGLRenderer, count: number): void {\r\n    if (!this._needsUpdate) return;\r\n\r\n    const gl = renderer.getContext(); // TODO check performance or cache it\r\n    gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);\r\n    gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.array, 0, count);\r\n\r\n    this._needsUpdate = false;\r\n  }\r\n\r\n  public clone(): this {\r\n    return this;\r\n  }\r\n}\r\n","import { FloatArray } from 'bvh.js';\r\nimport { Vector3 } from 'three';\r\n\r\nexport interface SphereTarget {\r\n  centerX: number;\r\n  centerY: number;\r\n  centerZ: number;\r\n  maxScale: number;\r\n}\r\n\r\nexport function getSphereFromMatrix_centeredGeometry(id: number, array: FloatArray, target: SphereTarget): SphereTarget {\r\n  const offset = id * 16;\r\n\r\n  const m0 = array[offset + 0];\r\n  const m1 = array[offset + 1];\r\n  const m2 = array[offset + 2];\r\n  const m4 = array[offset + 4];\r\n  const m5 = array[offset + 5];\r\n  const m6 = array[offset + 6];\r\n  const m8 = array[offset + 8];\r\n  const m9 = array[offset + 9];\r\n  const m10 = array[offset + 10];\r\n\r\n  const scaleXSq = m0 * m0 + m1 * m1 + m2 * m2;\r\n  const scaleYSq = m4 * m4 + m5 * m5 + m6 * m6;\r\n  const scaleZSq = m8 * m8 + m9 * m9 + m10 * m10;\r\n\r\n  target.maxScale = Math.sqrt(Math.max(scaleXSq, scaleYSq, scaleZSq));\r\n\r\n  target.centerX = array[offset + 12];\r\n  target.centerY = array[offset + 13];\r\n  target.centerZ = array[offset + 14];\r\n\r\n  return target;\r\n}\r\n\r\n// TODO move it\r\nexport function getPositionAt(index: number, array: FloatArray, target: Vector3): Vector3 {\r\n  const offset = index * 16;\r\n  target.x = array[offset + 12];\r\n  target.y = array[offset + 13];\r\n  target.z = array[offset + 14];\r\n  return target;\r\n}\r\n\r\nexport function getMaxScaleOnAxisAt(index: number, array: FloatArray): number {\r\n  const offset = index * 16;\r\n\r\n  const te0 = array[offset + 0];\r\n  const te1 = array[offset + 1];\r\n  const te2 = array[offset + 2];\r\n  const scaleXSq = te0 * te0 + te1 * te1 + te2 * te2;\r\n\r\n  const te4 = array[offset + 4];\r\n  const te5 = array[offset + 5];\r\n  const te6 = array[offset + 6];\r\n  const scaleYSq = te4 * te4 + te5 * te5 + te6 * te6;\r\n\r\n  const te8 = array[offset + 8];\r\n  const te9 = array[offset + 9];\r\n  const te10 = array[offset + 10];\r\n  const scaleZSq = te8 * te8 + te9 * te9 + te10 * te10;\r\n\r\n  return Math.sqrt(Math.max(scaleXSq, scaleYSq, scaleZSq));\r\n}\r\n","import { box3ToArray, BVH, BVHNode, FloatArray, HybridBuilder, onFrustumIntersectionCallback, onFrustumIntersectionLODCallback, onIntersectionCallback, onIntersectionRayCallback, vec3ToArray, WebGLCoordinateSystem } from 'bvh.js';\r\nimport { Box3, Matrix4, Raycaster, Sphere, Vector3 } from 'three';\r\nimport { getSphereFromMatrix_centeredGeometry, SphereTarget } from '../utils/MatrixUtils.js';\r\nimport { LODLevel } from './feature/LOD.js';\r\nimport { InstancedMesh2 } from './InstancedMesh2.js';\r\n\r\n// TODO handle multiplier parameter\r\n// TODO getBoxFromSphere updated if change geometry (and create accessor)\r\n\r\nexport class InstancedMeshBVH {\r\n  public target: InstancedMesh2;\r\n  public geoBoundingBox: Box3;\r\n  public bvh: BVH<{}, number>;\r\n  public nodesMap = new Map<number, BVHNode<{}, number>>();\r\n  protected LODsMap = new Map<LODLevel[], FloatArray>();\r\n  protected _arrayType: typeof Float32Array | typeof Float64Array;\r\n  protected _margin: number;\r\n  protected _origin: FloatArray;\r\n  protected _dir: FloatArray;\r\n  protected _boxArray: FloatArray;\r\n  protected _cameraPos: FloatArray;\r\n  protected _getBoxFromSphere: boolean;\r\n  protected _geoBoundingSphere: Sphere = null;\r\n  protected _sphereTarget: SphereTarget = null;\r\n\r\n  constructor(target: InstancedMesh2, margin = 0, highPrecision = false, getBoxFromSphere = false) {\r\n    this._margin = margin;\r\n    this.target = target;\r\n\r\n    const geometry = target._geometry;\r\n\r\n    if (!geometry.boundingBox) geometry.computeBoundingBox();\r\n    this.geoBoundingBox = geometry.boundingBox;\r\n\r\n    if (getBoxFromSphere) {\r\n      if (!geometry.boundingSphere) geometry.computeBoundingSphere();\r\n\r\n      const center = geometry.boundingSphere.center;\r\n      if (center.x === 0 && center.y === 0 && center.z === 0) {\r\n        this._geoBoundingSphere = geometry.boundingSphere;\r\n        this._sphereTarget = { centerX: 0, centerY: 0, centerZ: 0, maxScale: 0 };\r\n      } else {\r\n        console.warn('\"getBoxFromSphere\" is ignored because geometry is not centered.');\r\n        getBoxFromSphere = false;\r\n      }\r\n    }\r\n\r\n    this._arrayType = highPrecision ? Float64Array : Float32Array;\r\n    this.bvh = new BVH(new HybridBuilder(highPrecision), WebGLCoordinateSystem);\r\n    this._origin = new this._arrayType(3);\r\n    this._dir = new this._arrayType(3);\r\n    this._cameraPos = new this._arrayType(3);\r\n    this._getBoxFromSphere = getBoxFromSphere;\r\n  }\r\n\r\n  public create(): void {\r\n    const count = this.target.instancesCount;\r\n    const boxes: FloatArray[] = new Array(count); // test if single array and recreation inside node creation is faster due to memory location\r\n    const objects: Uint32Array = new Uint32Array(count); // TODO could be opt if instances are less than 65k\r\n\r\n    this.clear();\r\n\r\n    for (let i = 0; i < count; i++) {\r\n      boxes[i] = this.getBox(i, new this._arrayType(6));\r\n      objects[i] = i;\r\n    }\r\n\r\n    this.bvh.createFromArray(objects as unknown as number[], boxes, (node) => {\r\n      this.nodesMap.set(node.object, node);\r\n    });\r\n  }\r\n\r\n  public insert(id: number): void {\r\n    const node = this.bvh.insert(id, this.getBox(id, new this._arrayType(6)), this._margin);\r\n    this.nodesMap.set(id, node);\r\n  }\r\n\r\n  public insertRange(ids: number[]): void {\r\n    const count = ids.length;\r\n    const boxes: FloatArray[] = new Array(count);\r\n\r\n    for (let i = 0; i < count; i++) {\r\n      boxes[i] = this.getBox(ids[i], new this._arrayType(6));\r\n    }\r\n\r\n    this.bvh.insertRange(ids, boxes, this._margin, (node) => {\r\n      this.nodesMap.set(node.object, node);\r\n    });\r\n  }\r\n\r\n  public move(id: number): void {\r\n    const node = this.nodesMap.get(id);\r\n    if (!node) return;\r\n    this.getBox(id, node.box); // this also updates box\r\n    this.bvh.move(node, this._margin);\r\n  }\r\n\r\n  public delete(id: number): void {\r\n    const node = this.nodesMap.get(id);\r\n    if (!node) return;\r\n    this.bvh.delete(node);\r\n    this.nodesMap.delete(id);\r\n  }\r\n\r\n  public clear(): void {\r\n    this.bvh.clear();\r\n    this.nodesMap = new Map();\r\n  }\r\n\r\n  public frustumCulling(projScreenMatrix: Matrix4, onFrustumIntersection: onFrustumIntersectionCallback<{}, number>): void {\r\n    if (this._margin > 0) {\r\n      this.bvh.frustumCulling(projScreenMatrix.elements, (node, frustum, mask) => {\r\n        if (frustum.isIntersectedMargin(node.box, mask, this._margin)) {\r\n          onFrustumIntersection(node);\r\n        }\r\n      });\r\n    } else {\r\n      this.bvh.frustumCulling(projScreenMatrix.elements, onFrustumIntersection);\r\n    }\r\n  }\r\n\r\n  public frustumCullingLOD(projScreenMatrix: Matrix4, cameraPosition: Vector3, levels: LODLevel[], onFrustumIntersection: onFrustumIntersectionLODCallback<{}, number>): void {\r\n    if (!this.LODsMap.has(levels)) {\r\n      this.LODsMap.set(levels, new this._arrayType(levels.length));\r\n    }\r\n\r\n    const levelsArray = this.LODsMap.get(levels);\r\n    for (let i = 0; i < levels.length; i++) {\r\n      levelsArray[i] = levels[i].distance;\r\n    }\r\n\r\n    const camera = this._cameraPos;\r\n    camera[0] = cameraPosition.x;\r\n    camera[1] = cameraPosition.y;\r\n    camera[2] = cameraPosition.z;\r\n\r\n    if (this._margin > 0) {\r\n      this.bvh.frustumCullingLOD(projScreenMatrix.elements, camera, levelsArray, (node, level, frustum, mask) => {\r\n        if (frustum.isIntersectedMargin(node.box, mask, this._margin)) {\r\n          onFrustumIntersection(node, level);\r\n        }\r\n      });\r\n    } else {\r\n      this.bvh.frustumCullingLOD(projScreenMatrix.elements, camera, levelsArray, onFrustumIntersection);\r\n    }\r\n  }\r\n\r\n  public raycast(raycaster: Raycaster, onIntersection: onIntersectionRayCallback<number>): void {\r\n    const ray = raycaster.ray;\r\n    const origin = this._origin;\r\n    const dir = this._dir;\r\n\r\n    vec3ToArray(ray.origin, origin);\r\n    vec3ToArray(ray.direction, dir);\r\n\r\n    this.bvh.rayIntersections(dir, origin, onIntersection, raycaster.near, raycaster.far);\r\n  }\r\n\r\n  public intersectBox(target: Box3, onIntersection: onIntersectionCallback<number>): boolean {\r\n    if (!this._boxArray) this._boxArray = new this._arrayType(6);\r\n    const array = this._boxArray;\r\n    box3ToArray(target, array);\r\n    return this.bvh.intersectsBox(array, onIntersection);\r\n  }\r\n\r\n  protected getBox(id: number, array: FloatArray): FloatArray {\r\n    // TODO add check if geometry is centered. adjust ref using this._matrixArray insteaad of this.target._matrixArray\r\n    if (this._getBoxFromSphere) {\r\n      const { centerX, centerY, centerZ, maxScale } = getSphereFromMatrix_centeredGeometry(id, this.target._matrixArray, this._sphereTarget);\r\n      const radius = this._geoBoundingSphere.radius * maxScale;\r\n      array[0] = centerX - radius;\r\n      array[1] = centerX + radius;\r\n      array[2] = centerY - radius;\r\n      array[3] = centerY + radius;\r\n      array[4] = centerZ - radius;\r\n      array[5] = centerZ + radius;\r\n    } else {\r\n      _box3.copy(this.geoBoundingBox).applyMatrix4(this.target.getMatrixAt(id));\r\n      box3ToArray(_box3, array);\r\n    }\r\n\r\n    return array;\r\n  }\r\n}\r\n\r\nconst _box3 = new Box3();\r\n","import { Box3, BufferAttribute, BufferGeometry, Camera, Color, ColorManagement, ColorRepresentation, DataTexture, FloatType, Group, InstancedBufferAttribute, Material, Matrix4, Mesh, MeshDepthMaterial, MeshDistanceMaterial, Object3D, Object3DEventMap, RGBADepthPacking, RGFormat, RedFormat, Scene, ShaderMaterial, Sphere, WebGLRenderer } from 'three';\r\nimport { createTexture_mat4, createTexture_vec4 } from '../utils/CreateTexture.js';\r\nimport { GLInstancedBufferAttribute } from './utils/GLInstancedBufferAttribute.js';\r\nimport { InstancedEntity, UniformValue, UniformValueNoNumber } from './InstancedEntity.js';\r\nimport { InstancedMeshBVH } from './InstancedMeshBVH.js';\r\nimport { InstancedRenderItem } from './utils/InstancedRenderList.js';\r\nimport { LODInfo } from './feature/LOD.js';\r\n\r\n// TODO: Add expand and count/maxCount when create?\r\n// TODO: partial texture update\r\n// TODO: Use BVH only for raycasting\r\n\r\n// TODO SOON: sync all textures\r\n// TODO SOON: instancedMeshLOD rendering first nearest levels, look out to transparent\r\n\r\n// public raycastOnlyFrustum = false;\r\n// public override customDepthMaterial = new MeshDepthMaterial({ depthPacking: RGBADepthPacking });\r\n// public override customDistanceMaterial = new MeshDistanceMaterial();\r\n\r\nexport type Entity<T> = InstancedEntity & T;\r\nexport type UpdateEntityCallback<T> = (obj: Entity<T>, index: number) => void;\r\nexport type CustomSortCallback = (list: InstancedRenderItem[]) => void;\r\n\r\nexport interface BVHParams {\r\n  margin?: number;\r\n  highPrecision?: boolean;\r\n  getBBoxFromBSphere?: boolean;\r\n  multiplier?: number;\r\n}\r\n\r\nexport class InstancedMesh2<\r\n  TCustomData = {},\r\n  TGeometry extends BufferGeometry = BufferGeometry,\r\n  TMaterial extends Material | Material[] = Material | Material[],\r\n  TEventMap extends Object3DEventMap = Object3DEventMap\r\n> extends Mesh<TGeometry, TMaterial, TEventMap> {\r\n  public override readonly type = 'InstancedMesh2';\r\n  public readonly isInstancedMesh2 = true;\r\n  public instances: Entity<TCustomData>[] = null;\r\n  public instanceIndex: GLInstancedBufferAttribute;\r\n  public matricesTexture: DataTexture;\r\n  public colorsTexture: DataTexture = null;\r\n  public morphTexture: DataTexture = null;\r\n  public boundingBox: Box3 = null;\r\n  public boundingSphere: Sphere = null;\r\n  public instancesCount: number; // TODO handle update from dynamic to static\r\n  public bvh: InstancedMeshBVH = null;\r\n  public customSort: CustomSortCallback = null;\r\n  public raycastOnlyFrustum = false;\r\n  public visibilityArray: boolean[];\r\n  public infoLOD: LODInfo<TCustomData> = null; // TODO rename\r\n  /** @internal */ _renderer: WebGLRenderer = null;\r\n  /** @internal */ _indexArray: Uint16Array | Uint32Array;\r\n  /** @internal */ _matrixArray: Float32Array;\r\n  /** @internal */ _colorArray: Float32Array = null;\r\n  /** @internal */ _count: number;\r\n  /** @internal */ _perObjectFrustumCulled = true;\r\n  /** @internal */ _sortObjects = false;\r\n  /** @internal */ _maxCount: number;\r\n  /** @internal */ _visibilityChanged = false;\r\n  /** @internal */ _geometry: TGeometry;\r\n  /** @internal */ _material: TMaterial;\r\n  /** @internal */ _parentLOD: InstancedMesh2;\r\n  protected _uniformsSetCallback = new Map<string, (id: number, value: UniformValue) => void>();\r\n  protected readonly _instancesUseEuler: boolean;\r\n  protected readonly _instance: InstancedEntity;\r\n\r\n  public override customDepthMaterial = new MeshDepthMaterial({ depthPacking: RGBADepthPacking });\r\n  public override customDistanceMaterial = new MeshDistanceMaterial();\r\n\r\n  // HACK TO MAKE IT WORK WITHOUT UPDATE CORE\r\n  private readonly isInstancedMesh = true; // must be set to use instancing rendering\r\n  private readonly instanceMatrix = new InstancedBufferAttribute(new Float32Array(0), 16); // must be init to avoid exception\r\n  private readonly instanceColor = null; // must be null to avoid exception\r\n\r\n  public get count(): number { return this._count; }\r\n  public get maxCount(): number { return this._maxCount; }\r\n\r\n  public get perObjectFrustumCulled(): boolean { return this._perObjectFrustumCulled; }\r\n  public set perObjectFrustumCulled(value: boolean) {\r\n    this._perObjectFrustumCulled = value;\r\n    this._visibilityChanged = true;\r\n  }\r\n\r\n  public get sortObjects(): boolean { return this._sortObjects; }\r\n  public set sortObjects(value: boolean) {\r\n    this._sortObjects = value;\r\n    this._visibilityChanged = true;\r\n  }\r\n\r\n  // @ts-expect-error it's defined as a property, but is overridden as an accessor.\r\n  public override get geometry(): TGeometry { return this._geometry; }\r\n  public override set geometry(value: TGeometry) {\r\n    this._geometry = value;\r\n    this.patchGeometry(value);\r\n  }\r\n\r\n  // @ts-expect-error it's defined as a property, but is overridden as an accessor.\r\n  public override get material(): TMaterial { return this._material; }\r\n  public override set material(value: TMaterial) {\r\n    this._material = value;\r\n    this.patchMaterials(value);\r\n  }\r\n\r\n  /** MATERIAL CANNOT BE SHARED AND GEOMETRY IS CLONED IF ALREADY PATCHED */\r\n  constructor(renderer: WebGLRenderer, count: number, geometry?: TGeometry, material?: TMaterial, LOD?: InstancedMesh2, instancesUseEuler = false) {\r\n    if (!count || count < 0) throw new Error('\"count\" must be greater than 0.');\r\n\r\n    super(geometry, material);\r\n\r\n    this._renderer = renderer;\r\n    this._instancesUseEuler = instancesUseEuler;\r\n    this._instance = new InstancedEntity(this, -1, instancesUseEuler);\r\n    this.instancesCount = count;\r\n    this._maxCount = count;\r\n    this._count = count;\r\n    this._geometry = geometry;\r\n    this._material = material;\r\n    this._parentLOD = LOD;\r\n    this.visibilityArray = LOD?.visibilityArray ?? new Array(count).fill(true);\r\n\r\n    this.initIndexArray();\r\n    this.initIndexAttribute();\r\n    this.initMatricesTexture();\r\n\r\n    this.patchMaterial(this.customDepthMaterial); // TODO check if with LOD can reuse it\r\n    this.patchMaterial(this.customDistanceMaterial);\r\n  }\r\n\r\n  public override onBeforeShadow(renderer: WebGLRenderer, scene: Scene, camera: Camera, shadowCamera: Camera, geometry: BufferGeometry, depthMaterial: Material, group: Group): void {\r\n    if (this.instanceIndex) this.performFrustumCulling(shadowCamera, camera);\r\n  }\r\n\r\n  public override onBeforeRender(renderer: WebGLRenderer, scene: Scene, camera: Camera, geometry: BufferGeometry, material: Material, group: Group): void {\r\n    if (this.instanceIndex) this.performFrustumCulling(camera);\r\n    else this._renderer = renderer;\r\n  }\r\n\r\n  public override onAfterRender(renderer: WebGLRenderer, scene: Scene, camera: Camera, geometry: BufferGeometry, material: Material, group: Group): void {\r\n    if (!this.instanceIndex) this.initIndexAttribute();\r\n  }\r\n\r\n  protected initIndexArray(): void {\r\n    const count = this._maxCount;\r\n    const array = new Uint32Array(count); // use uint16 if less 32k\r\n\r\n    for (let i = 0; i < count; i++) {\r\n      array[i] = i;\r\n    }\r\n\r\n    this._indexArray = array;\r\n  }\r\n\r\n  protected initIndexAttribute(): void {\r\n    if (!this._renderer) {\r\n      this._count = 0;\r\n      return;\r\n    }\r\n\r\n    const array = this._indexArray;\r\n    const gl = this._renderer.getContext() as WebGL2RenderingContext;\r\n\r\n    this.instanceIndex = new GLInstancedBufferAttribute(gl, gl.UNSIGNED_INT, 1, 4, array); // UNSIGNED_SHORT usare anche questo se < 65k\r\n    this._geometry?.setAttribute('instanceIndex', this.instanceIndex as unknown as BufferAttribute);\r\n  }\r\n\r\n  protected initMatricesTexture(): void {\r\n    this.matricesTexture = this._parentLOD ? this._parentLOD.matricesTexture : createTexture_mat4(this._maxCount);\r\n    this._matrixArray = this.matricesTexture.image.data as unknown as Float32Array;\r\n  }\r\n\r\n  protected patchGeometry(geometry: TGeometry): void {\r\n    if (geometry.hasAttribute('instanceIndex')) {\r\n      geometry = geometry.clone();\r\n      geometry.deleteAttribute('instanceIndex');\r\n    }\r\n\r\n    if (this.instanceIndex) {\r\n      geometry.setAttribute('instanceIndex', this.instanceIndex as unknown as BufferAttribute);\r\n    }\r\n  }\r\n\r\n  protected patchMaterials(material: TMaterial): void {\r\n    if (!material) return;\r\n\r\n    if ((material as Material).isMaterial) {\r\n      this.patchMaterial(material as Material);\r\n      return;\r\n    }\r\n\r\n    for (const m of material as Material[]) {\r\n      this.patchMaterial(m);\r\n    }\r\n  }\r\n\r\n  protected patchMaterial(material: Material): void {\r\n    if (material.isInstancedMeshPatched) throw new Error('Cannot reuse already patched material.');\r\n\r\n    const onBeforeCompile = material.onBeforeCompile.bind(material);\r\n\r\n    material.onBeforeCompile = (shader, renderer) => {\r\n      if (onBeforeCompile) onBeforeCompile(shader, renderer);\r\n\r\n      if (!shader.instancing) return;\r\n\r\n      shader.instancing = false;\r\n      shader.instancingColor = false;\r\n      shader.uniforms.matricesTexture = { value: this.matricesTexture };\r\n\r\n      if (!shader.defines) shader.defines = {};\r\n      shader.defines['USE_INSTANCING_INDIRECT'] = '';\r\n\r\n      if (this.colorsTexture !== null) {\r\n        if (!shader.fragmentShader.includes('#include <color_pars_fragment>')) return;\r\n\r\n        shader.uniforms.colorsTexture = { value: this.colorsTexture };\r\n        shader.defines['USE_INSTANCING_COLOR_INDIRECT'] = '';\r\n        shader.fragmentShader = shader.fragmentShader.replace('#include <common>', '#define USE_COLOR\\n#include <common>');\r\n        // NOTE that '#defined USE_COLOR' is defined only in fragment shader to make it work.\r\n      }\r\n    };\r\n\r\n    material.isInstancedMeshPatched = true;\r\n  }\r\n\r\n  public updateInstances(onUpdate: UpdateEntityCallback<Entity<TCustomData>>): void {\r\n    const count = this.instancesCount;\r\n    const instances = this.instances;\r\n\r\n    if (instances) {\r\n      const instances = this.instances;\r\n\r\n      for (let i = 0; i < count; i++) {\r\n        const instance = instances[i];\r\n        onUpdate(instance, i);\r\n        instance.updateMatrix();\r\n      }\r\n\r\n      return;\r\n    }\r\n\r\n    const instance = this._instance;\r\n\r\n    for (let i = 0; i < count; i++) {\r\n      (instance as any).id = i;\r\n      instance.position.set(0, 0, 0);\r\n      instance.scale.set(1, 1, 1);\r\n      instance.quaternion.set(0, 0, 0, 1);\r\n      instance.rotation?.set(0, 0, 0);\r\n\r\n      onUpdate(instance as Entity<TCustomData>, i);\r\n      instance.updateMatrix();\r\n    }\r\n  }\r\n\r\n  public createInstances(onInstanceCreation?: UpdateEntityCallback<Entity<TCustomData>>): void {\r\n    const count = this._maxCount; // TODO we can create only first N count ?\r\n    const instancesUseEuler = this._instancesUseEuler;\r\n    const instances = this.instances = new Array(count);\r\n\r\n    for (let i = 0; i < count; i++) {\r\n      const instance = new InstancedEntity(this, i, instancesUseEuler) as Entity<TCustomData>;\r\n      instances[i] = instance;\r\n\r\n      if (onInstanceCreation) {\r\n        onInstanceCreation(instance, i);\r\n        instance.updateMatrix();\r\n      }\r\n    }\r\n  }\r\n\r\n  public computeBVH(config: BVHParams = {}): void {\r\n    if (!this.bvh) this.bvh = new InstancedMeshBVH(this, config.margin, config.highPrecision, config.getBBoxFromBSphere);\r\n    this.bvh.clear();\r\n    this.bvh.create();\r\n  }\r\n\r\n  public disposeBVH(): void {\r\n    this.bvh = null;\r\n  }\r\n\r\n  public setMatrixAt(id: number, matrix: Matrix4): void {\r\n    matrix.toArray(this._matrixArray, id * 16);\r\n\r\n    if (this.instances) {\r\n      const instance = this.instances[id];\r\n      matrix.decompose(instance.position, instance.quaternion, instance.scale);\r\n    }\r\n\r\n    this.matricesTexture.needsUpdate = true;\r\n    this.bvh?.move(id);\r\n  }\r\n\r\n  public getMatrixAt(id: number, matrix = _tempMat4): Matrix4 {\r\n    return matrix.fromArray(this._matrixArray, id * 16);\r\n  }\r\n\r\n  public setVisibilityAt(id: number, visible: boolean): void {\r\n    this.visibilityArray[id] = visible;\r\n    this._visibilityChanged = true;\r\n  }\r\n\r\n  public getVisibilityAt(id: number): boolean {\r\n    return this.visibilityArray[id];\r\n  }\r\n\r\n  public setColorAt(id: number, color: ColorRepresentation): void {\r\n    if (this.colorsTexture === null) {\r\n      this.colorsTexture = createTexture_vec4(this._maxCount);\r\n      this.colorsTexture.colorSpace = ColorManagement.workingColorSpace;\r\n      this._colorArray = this.colorsTexture.image.data as unknown as Float32Array;\r\n      this._colorArray.fill(1);\r\n    }\r\n\r\n    if ((color as Color).isColor) {\r\n      (color as Color).toArray(this._colorArray, id * 4);\r\n    } else {\r\n      _tempCol.set(color).toArray(this._colorArray, id * 4);\r\n    }\r\n\r\n    this.colorsTexture.needsUpdate = true;\r\n  }\r\n\r\n  public getColorAt(id: number, color = _tempCol): Color {\r\n    return color.fromArray(this._colorArray, id * 4);\r\n  }\r\n\r\n  public setUniformAt(id: number, name: string, value: UniformValue): void { // TODO support multimaterial?\r\n    const texture = (this._material as ShaderMaterial).uniforms[name].value as DataTexture; // TODO fix type\r\n    let setCallback = this._uniformsSetCallback.get(name);\r\n\r\n    if (!setCallback) {\r\n      const array = texture.image.data;\r\n\r\n      if (texture.format === RedFormat) {\r\n        setCallback = (id: number, value: UniformValue) => array[id] = value as number;\r\n      } else {\r\n        const size = texture.format === RGFormat ? 2 : 4; // 3 is not supported\r\n        setCallback = (id: number, value: UniformValue) => (value as UniformValueNoNumber).toArray(array, id * size);\r\n      }\r\n\r\n      this._uniformsSetCallback.set(name, setCallback);\r\n    }\r\n\r\n    setCallback(id, value);\r\n    texture.needsUpdate = true;\r\n  }\r\n\r\n  public getMorphAt(index: number, object = _tempMesh): Mesh {\r\n    const objectInfluences = object.morphTargetInfluences;\r\n    const array = this.morphTexture.source.data.data;\r\n    const len = objectInfluences.length + 1; // All influences + the baseInfluenceSum\r\n    const dataIndex = index * len + 1; // Skip the baseInfluenceSum at the beginning\r\n\r\n    for (let i = 0; i < objectInfluences.length; i++) {\r\n      objectInfluences[i] = array[dataIndex + i];\r\n    }\r\n\r\n    return object;\r\n  }\r\n\r\n  public setMorphAt(index: number, object: Mesh): void {\r\n    const objectInfluences = object.morphTargetInfluences;\r\n    const len = objectInfluences.length + 1; // morphBaseInfluence + all influences\r\n\r\n    if (this.morphTexture === null) {\r\n      this.morphTexture = new DataTexture(new Float32Array(len * this._maxCount), len, this._maxCount, RedFormat, FloatType);\r\n    }\r\n\r\n    const array = this.morphTexture.source.data.data;\r\n    let morphInfluencesSum = 0;\r\n\r\n    for (const objectInfluence of objectInfluences) {\r\n      morphInfluencesSum += objectInfluence;\r\n    }\r\n\r\n    const morphBaseInfluence = this._geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\r\n    const dataIndex = len * index;\r\n    array[dataIndex] = morphBaseInfluence;\r\n    array.set(objectInfluences, dataIndex + 1);\r\n  }\r\n\r\n  public copyTo(id: number, target: Object3D): void {\r\n    this.getMatrixAt(id, target.matrix).decompose(target.position, target.quaternion, target.scale);\r\n  }\r\n\r\n  public computeBoundingBox(): void { // if bvh present, can override? TODO\r\n    const geometry = this._geometry;\r\n    const count = this.instancesCount;\r\n\r\n    if (this.boundingBox === null) this.boundingBox = new Box3();\r\n    if (geometry.boundingBox === null) geometry.computeBoundingBox();\r\n\r\n    const geoBoundingBox = geometry.boundingBox;\r\n    const boundingBox = this.boundingBox;\r\n\r\n    boundingBox.makeEmpty();\r\n\r\n    for (let i = 0; i < count; i++) {\r\n      _box3.copy(geoBoundingBox).applyMatrix4(this.getMatrixAt(i));\r\n      boundingBox.union(_box3);\r\n    }\r\n  }\r\n\r\n  public computeBoundingSphere(): void {\r\n    const geometry = this._geometry;\r\n    const count = this.instancesCount;\r\n\r\n    if (this.boundingSphere === null) this.boundingSphere = new Sphere();\r\n    if (geometry.boundingSphere === null) geometry.computeBoundingSphere();\r\n\r\n    const geoBoundingSphere = geometry.boundingSphere;\r\n    const boundingSphere = this.boundingSphere;\r\n\r\n    boundingSphere.makeEmpty();\r\n\r\n    for (let i = 0; i < count; i++) {\r\n      _sphere.copy(geoBoundingSphere).applyMatrix4(this.getMatrixAt(i));\r\n      boundingSphere.union(_sphere);\r\n    }\r\n  }\r\n\r\n  public override copy(source: InstancedMesh2, recursive?: boolean): this {\r\n    super.copy(source, recursive);\r\n\r\n    // this.instanceIndex.copy(source.instanceIndex);\r\n    this.matricesTexture = source.matricesTexture.clone();\r\n\r\n    // this._matricesTexture = source._matricesTexture.clone();\r\n    // this._matricesTexture.image.data = this._matricesTexture.image.data.slice();\r\n\r\n    if (source.colorsTexture !== null) this.colorsTexture = source.colorsTexture.clone();\r\n    if (source.morphTexture !== null) this.morphTexture = source.morphTexture.clone();\r\n\r\n    // TODO copy uniform?\r\n\r\n    this.instancesCount = source.instancesCount;\r\n    this._count = source._maxCount;\r\n    this._maxCount = source._maxCount;\r\n\r\n    if (source.boundingBox !== null) this.boundingBox = source.boundingBox.clone();\r\n    if (source.boundingSphere !== null) this.boundingSphere = source.boundingSphere.clone();\r\n\r\n    return this;\r\n  }\r\n\r\n  public dispose(): this {\r\n    this.dispatchEvent<any>({ type: 'dispose' }); // TODO fix d.ts\r\n\r\n    this.matricesTexture.dispose();\r\n    this.matricesTexture = null;\r\n\r\n    // TODO dispose uniform\r\n\r\n    if (this.colorsTexture !== null) {\r\n      this.colorsTexture.dispose();\r\n      this.colorsTexture = null;\r\n    }\r\n\r\n    if (this.morphTexture !== null) {\r\n      this.morphTexture.dispose();\r\n      this.morphTexture = null;\r\n    }\r\n\r\n    return this;\r\n  }\r\n}\r\n\r\nconst _box3 = new Box3();\r\nconst _sphere = new Sphere();\r\nconst _tempMat4 = new Matrix4();\r\nconst _tempCol = new Color();\r\nconst _tempMesh = new Mesh();\r\n","import { Intersection, Material } from 'three';\r\nimport { InstancedRenderItem } from '../core/utils/InstancedRenderList.js';\r\nimport { radixSort, RadixSortOptions } from 'three/examples/jsm/utils/SortUtils.js';\r\nimport { InstancedMesh2 } from '../core/InstancedMesh2.js';\r\n\r\n// REFERENCE: https://github.com/mrdoob/three.js/blob/master/examples/webgl_mesh_batch.html#L291\r\n\r\nexport function createRadixSort(target: InstancedMesh2): typeof radixSort<InstancedRenderItem> {\r\n  const options: RadixSortOptions<InstancedRenderItem> = {\r\n    get: (el) => el.depthSort,\r\n    aux: new Array(target.maxCount),\r\n    reversed: null\r\n  };\r\n\r\n  return function sortFunction(list: InstancedRenderItem[]): void {\r\n    const material = target._material as Material;\r\n\r\n    if (!material.isMaterial) throw new Error('Multi material is not supported.');\r\n\r\n    options.reversed = material.transparent;\r\n\r\n    if (target.maxCount > options.aux.length) {\r\n      options.aux.length = target.maxCount;\r\n    }\r\n\r\n    let minZ = Infinity;\r\n    let maxZ = -Infinity;\r\n\r\n    for (const { depth } of list) {\r\n      if (depth > maxZ) maxZ = depth;\r\n      if (depth < minZ) minZ = depth;\r\n    }\r\n\r\n    const depthDelta = maxZ - minZ;\r\n    const factor = (2 ** 32 - 1) / depthDelta;\r\n\r\n    for (const item of list) {\r\n      item.depthSort = (item.depth - minZ) * factor;\r\n    }\r\n\r\n    radixSort(list, options);\r\n  };\r\n}\r\n\r\n/** @internal */\r\nexport function sortOpaque(a: InstancedRenderItem, b: InstancedRenderItem): number {\r\n  return a.depth - b.depth;\r\n}\r\n\r\n/** @internal */\r\nexport function sortTransparent(a: InstancedRenderItem, b: InstancedRenderItem): number {\r\n  return b.depth - a.depth;\r\n}\r\n\r\n/** @internal */\r\nexport function ascSortIntersection(a: Intersection, b: Intersection): number {\r\n  return a.distance - b.distance;\r\n}\r\n","export type InstancedRenderItem = { index: number; depth: number; depthSort: number };\r\n\r\nexport class InstancedRenderList {\r\n  public list: InstancedRenderItem[] = [];\r\n  protected pool: InstancedRenderItem[] = [];\r\n\r\n  public push(depth: number, index: number): void {\r\n    const pool = this.pool;\r\n    const list = this.list;\r\n    const count = list.length;\r\n\r\n    if (count >= pool.length) {\r\n      pool.push({ depth: null, index: null, depthSort: null });\r\n    }\r\n\r\n    const item = pool[count];\r\n    item.depth = depth;\r\n    item.index = index;\r\n\r\n    list.push(item);\r\n  }\r\n\r\n  public reset(): void {\r\n    this.list.length = 0;\r\n  }\r\n}\r\n","import { BVHNode } from 'bvh.js';\r\nimport { Camera, Frustum, Material, Matrix4, Sphere, Vector3 } from 'three';\r\nimport { getMaxScaleOnAxisAt, getPositionAt } from '../../utils/MatrixUtils.js';\r\nimport { sortOpaque, sortTransparent } from '../../utils/SortingUtils.js';\r\nimport { InstancedMesh2 } from '../InstancedMesh2.js';\r\nimport { InstancedRenderList } from '../utils/InstancedRenderList.js';\r\nimport { LODRenderList } from './LOD.js';\r\n\r\n// TODO: fix shadowMap LOD sorting objects?\r\n\r\ndeclare module '../InstancedMesh2.js' {\r\n  interface InstancedMesh2 {\r\n    performFrustumCulling(camera: Camera, cameraLOD?: Camera): void;\r\n\r\n    /** @internal */ frustumCulling(camera: Camera): void;\r\n    /** @internal */ updateIndexArray(): void;\r\n    /** @internal */ updateRenderList(): void;\r\n    /** @internal */ BVHCulling(): void;\r\n    /** @internal */ linearCulling(): void;\r\n\r\n    /** @internal */ frustumCullingLOD(renderList: LODRenderList, objects: InstancedMesh2[], camera: Camera, cameraLOD: Camera): void;\r\n    /** @internal */ BVHCullingLOD(renderList: LODRenderList, sortObjects: boolean): void;\r\n    /** @internal */ linearCullingLOD(renderList: LODRenderList, sortObjects: boolean): void;\r\n  }\r\n}\r\n\r\nconst _frustum = new Frustum();\r\nconst _renderList = new InstancedRenderList();\r\nconst _projScreenMatrix = new Matrix4();\r\nconst _invMatrixWorld = new Matrix4();\r\nconst _forward = new Vector3();\r\nconst _cameraPos = new Vector3();\r\nconst _cameraLODPos = new Vector3();\r\nconst _position = new Vector3();\r\nconst _sphere = new Sphere();\r\n\r\nInstancedMesh2.prototype.performFrustumCulling = function (camera: Camera, cameraLOD = camera): void {\r\n  const info = this.infoLOD;\r\n  const isShadowRendering = camera !== cameraLOD;\r\n  let renderList: LODRenderList;\r\n\r\n  if (info) {\r\n    renderList = !isShadowRendering ? info.render : (info.shadowRender ?? info.render);\r\n\r\n    // Hide all LODs except this one. They will be shown after frustum culling if at least one instance is visible.\r\n    for (const object of info.objects) {\r\n      if (object === this) object._count = 0;\r\n      else object.visible = false;\r\n    }\r\n  }\r\n\r\n  if (renderList?.levels.length > 0) this.frustumCullingLOD(renderList, info.objects, camera, cameraLOD);\r\n  else if (!this._parentLOD) this.frustumCulling(camera);\r\n\r\n  this.instanceIndex.update(this._renderer, this._count);\r\n};\r\n\r\nInstancedMesh2.prototype.frustumCulling = function (camera: Camera): void {\r\n  const sortObjects = this._sortObjects;\r\n  const perObjectFrustumCulled = this._perObjectFrustumCulled;\r\n  const array = this._indexArray;\r\n\r\n  this.instanceIndex._needsUpdate = true; // TODO improve\r\n\r\n  if (!perObjectFrustumCulled && !sortObjects) {\r\n    this.updateIndexArray();\r\n    return;\r\n  }\r\n\r\n  if (sortObjects) {\r\n    _invMatrixWorld.copy(this.matrixWorld).invert();\r\n    _cameraPos.setFromMatrixPosition(camera.matrixWorld).applyMatrix4(_invMatrixWorld);\r\n    _forward.set(0, 0, -1).transformDirection(camera.matrixWorld).transformDirection(_invMatrixWorld);\r\n  }\r\n\r\n  if (!perObjectFrustumCulled) {\r\n    this.updateRenderList();\r\n  } else {\r\n    _projScreenMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse).multiply(this.matrixWorld);\r\n\r\n    if (this.bvh) this.BVHCulling();\r\n    else this.linearCulling();\r\n  }\r\n\r\n  if (sortObjects) {\r\n    const customSort = this.customSort;\r\n\r\n    if (customSort === null) {\r\n      _renderList.list.sort(!(this._material as Material)?.transparent ? sortOpaque : sortTransparent);\r\n    } else {\r\n      customSort(_renderList.list);\r\n    }\r\n\r\n    const list = _renderList.list;\r\n    const count = list.length;\r\n    for (let i = 0; i < count; i++) {\r\n      array[i] = list[i].index;\r\n    }\r\n\r\n    this._count = count;\r\n    _renderList.reset();\r\n  }\r\n};\r\n\r\nInstancedMesh2.prototype.updateIndexArray = function (): void {\r\n  if (!this._visibilityChanged) return;\r\n\r\n  const array = this._indexArray;\r\n  const instancesCount = this.instancesCount;\r\n  let count = 0;\r\n\r\n  for (let i = 0; i < instancesCount; i++) {\r\n    if (this.getVisibilityAt(i)) {\r\n      array[count++] = i;\r\n    }\r\n  }\r\n\r\n  this._count = count;\r\n  this._visibilityChanged = false;\r\n};\r\n\r\nInstancedMesh2.prototype.updateRenderList = function (): void {\r\n  const instancesCount = this.instancesCount;\r\n\r\n  for (let i = 0; i < instancesCount; i++) {\r\n    if (this.getVisibilityAt(i)) {\r\n      const matrix = this.getMatrixAt(i); // TODO improve avoiding copy\r\n      const depth = _position.setFromMatrixPosition(matrix).sub(_cameraPos).dot(_forward);\r\n      _renderList.push(depth, i);\r\n    }\r\n  }\r\n};\r\n\r\nInstancedMesh2.prototype.BVHCulling = function (): void {\r\n  const array = this._indexArray;\r\n  const matrixArray = this._matrixArray;\r\n  const instancesCount = this.instancesCount;\r\n  const sortObjects = this._sortObjects;\r\n  let count = 0;\r\n\r\n  this.bvh.frustumCulling(_projScreenMatrix, (node: BVHNode<{}, number>) => {\r\n    const index = node.object;\r\n\r\n    if (index < instancesCount && this.getVisibilityAt(index)) {\r\n      if (sortObjects) {\r\n        getPositionAt(index, matrixArray, _position);\r\n        const depth = _position.sub(_cameraPos).dot(_forward); // instancedMesh can be less precise than sphere.center\r\n        _renderList.push(depth, index);\r\n      } else {\r\n        array[count++] = index;\r\n      }\r\n    }\r\n  });\r\n\r\n  this._count = count;\r\n};\r\n\r\nInstancedMesh2.prototype.linearCulling = function (): void {\r\n  const array = this._indexArray;\r\n  const matrixArray = this._matrixArray;\r\n  const bSphere = this._geometry.boundingSphere;\r\n  const radius = bSphere.radius;\r\n  const center = bSphere.center;\r\n  const instancesCount = this.instancesCount;\r\n  const geometryCentered = center.x === 0 && center.y === 0 && center.z === 0;\r\n  const sortObjects = this._sortObjects;\r\n  let count = 0;\r\n\r\n  _frustum.setFromProjectionMatrix(_projScreenMatrix);\r\n\r\n  for (let i = 0; i < instancesCount; i++) {\r\n    if (!this.getVisibilityAt(i)) continue;\r\n\r\n    if (geometryCentered) {\r\n      getPositionAt(i, matrixArray, _sphere.center);\r\n      _sphere.radius = radius * getMaxScaleOnAxisAt(i, matrixArray);\r\n    } else {\r\n      const matrix = this.getMatrixAt(i); // TODO: can be a little improved\r\n      _sphere.center.copy(center).applyMatrix4(matrix);\r\n      _sphere.radius = radius * matrix.getMaxScaleOnAxis();\r\n    }\r\n\r\n    if (_frustum.intersectsSphere(_sphere)) {\r\n      if (sortObjects) {\r\n        const depth = _position.subVectors(_sphere.center, _cameraPos).dot(_forward);\r\n        _renderList.push(depth, i);\r\n      } else {\r\n        array[count++] = i;\r\n      }\r\n    }\r\n  }\r\n\r\n  this._count = count;\r\n};\r\n\r\nInstancedMesh2.prototype.frustumCullingLOD = function (renderList: LODRenderList, objects: InstancedMesh2[], camera: Camera, cameraLOD: Camera): void {\r\n  const { count, levels } = renderList;\r\n  const isShadowRendering = camera !== cameraLOD;\r\n  const sortObjects = !isShadowRendering && this._sortObjects; // sort is disabled when render shadows\r\n\r\n  for (let i = 0; i < levels.length; i++) {\r\n    count[i] = 0;\r\n\r\n    if (levels[i].object.instanceIndex) {\r\n      levels[i].object.instanceIndex._needsUpdate = true; // TODO improve\r\n    }\r\n  }\r\n\r\n  _projScreenMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse).multiply(this.matrixWorld);\r\n  _invMatrixWorld.copy(this.matrixWorld).invert();\r\n  _cameraPos.setFromMatrixPosition(camera.matrixWorld).applyMatrix4(_invMatrixWorld);\r\n  _cameraLODPos.setFromMatrixPosition(cameraLOD.matrixWorld).applyMatrix4(_invMatrixWorld);\r\n\r\n  if (this.bvh) this.BVHCullingLOD(renderList, sortObjects);\r\n  else this.linearCullingLOD(renderList, sortObjects);\r\n\r\n  if (sortObjects) {\r\n    const customSort = this.customSort;\r\n    const list = _renderList.list; // TODO better name...\r\n    const indexes = renderList.indexes;\r\n    let levelIndex = 0;\r\n    let levelDistance = levels[1].distance;\r\n\r\n    if (customSort === null) {\r\n      list.sort(!(levels[0].object._material as Material)?.transparent ? sortOpaque : sortTransparent); // todo IMPROVE\r\n    } else {\r\n      customSort(list);\r\n    }\r\n\r\n    for (let i = 0, l = list.length; i < l; i++) {\r\n      const item = list[i];\r\n\r\n      if (item.depth > levelDistance) { // > or >= ? capire in base all'altro algoritmo\r\n        levelIndex++;\r\n        levelDistance = levels[levelIndex + 1]?.distance ?? Infinity; // improve this condition and use for of instead\r\n      }\r\n\r\n      indexes[levelIndex][count[levelIndex]++] = item.index;\r\n    }\r\n\r\n    _renderList.reset();\r\n  }\r\n\r\n  for (let i = 0; i < levels.length; i++) {\r\n    const object = levels[i].object;\r\n    object.visible = object === this || count[i] > 0;\r\n    object._count = count[i];\r\n  }\r\n};\r\n\r\nInstancedMesh2.prototype.BVHCullingLOD = function (renderList: LODRenderList, sortObjects: boolean): void {\r\n  const { count, indexes, levels } = renderList;\r\n  const matrixArray = this._matrixArray;\r\n  const instancesCount = this.instancesCount;\r\n  const visibilityArray = this.visibilityArray;\r\n\r\n  if (sortObjects) { // todo refactor\r\n    this.bvh.frustumCulling(_projScreenMatrix, (node: BVHNode<{}, number>) => {\r\n      const index = node.object;\r\n      if (index < instancesCount && visibilityArray[index]) {\r\n        const distance = getPositionAt(index, matrixArray, _position).distanceToSquared(_cameraLODPos);\r\n        _renderList.push(distance, index);\r\n      }\r\n    });\r\n  } else {\r\n    this.bvh.frustumCullingLOD(_projScreenMatrix, _cameraLODPos, levels, (node: BVHNode<{}, number>, level: number) => {\r\n      const index = node.object;\r\n      if (index < instancesCount && visibilityArray[index]) {\r\n        if (level === null) {\r\n          const distance = getPositionAt(index, matrixArray, _position).distanceToSquared(_cameraLODPos); // distance can be get by BVH\r\n          level = this.getObjectLODIndexForDistance(levels, distance);\r\n        }\r\n\r\n        indexes[level][count[level]++] = index;\r\n      }\r\n    });\r\n  }\r\n};\r\n\r\nInstancedMesh2.prototype.linearCullingLOD = function (renderList: LODRenderList, sortObjects: boolean): void {\r\n  const { count, indexes, levels } = renderList;\r\n  const matrixArray = this._matrixArray;\r\n  const bSphere = this._geometry.boundingSphere; // TODO check se esiste?\r\n  const radius = bSphere.radius;\r\n  const center = bSphere.center;\r\n  const instancesCount = this.instancesCount;\r\n  const geometryCentered = center.x === 0 && center.y === 0 && center.z === 0;\r\n\r\n  _frustum.setFromProjectionMatrix(_projScreenMatrix);\r\n\r\n  for (let i = 0; i < instancesCount; i++) {\r\n    if (!this.visibilityArray[i]) continue; // TODO check if getVisibleTo has same perf and use that instead\r\n\r\n    if (geometryCentered) {\r\n      getPositionAt(i, matrixArray, _sphere.center);\r\n      _sphere.radius = radius * getMaxScaleOnAxisAt(i, matrixArray);\r\n    } else {\r\n      const matrix = this.getMatrixAt(i); // opt instancedMesh getting only pos and scale\r\n      _sphere.center.copy(center).applyMatrix4(matrix);\r\n      _sphere.radius = radius * matrix.getMaxScaleOnAxis();\r\n    }\r\n\r\n    if (_frustum.intersectsSphere(_sphere)) {\r\n      const distance = _sphere.center.distanceToSquared(_cameraLODPos);\r\n\r\n      if (sortObjects) {\r\n        _renderList.push(distance, i);\r\n      } else {\r\n        const levelIndex = this.getObjectLODIndexForDistance(levels, distance);\r\n        indexes[levelIndex][count[levelIndex]++] = i;\r\n      }\r\n    }\r\n  }\r\n};\r\n","import { BufferGeometry, Material, ShaderMaterial } from 'three';\r\nimport { InstancedMesh2 } from '../InstancedMesh2.js';\r\n\r\ndeclare module '../InstancedMesh2.js' {\r\n  interface InstancedMesh2 {\r\n    getObjectLODIndexForDistance(levels: LODLevel[], distance: number): number;\r\n    setFirstLODDistance(distance?: number, hysteresis?: number): this;\r\n    addLOD(geometry: BufferGeometry, material: Material, distance?: number, hysteresis?: number): this;\r\n    addShadowLOD(geometry: BufferGeometry, distance?: number, hysteresis?: number): this;\r\n    /** @internal */ addLevel(renderList: LODRenderList, geometry: BufferGeometry, material: Material, distance: number, hysteresis: number): InstancedMesh2;\r\n  }\r\n}\r\n\r\nexport interface LODInfo<TCustomData = {}> {\r\n  render: LODRenderList<TCustomData>;\r\n  shadowRender: LODRenderList<TCustomData>;\r\n  objects: InstancedMesh2<TCustomData>[];\r\n}\r\n\r\nexport interface LODRenderList<TCustomData = {}> {\r\n  levels: LODLevel<TCustomData>[];\r\n  indexes: (Uint16Array | Uint32Array)[];\r\n  count: number[];\r\n}\r\n\r\nexport interface LODLevel<TCustomData = {}> {\r\n  distance: number;\r\n  hysteresis: number;\r\n  object: InstancedMesh2<TCustomData>;\r\n}\r\n\r\nInstancedMesh2.prototype.getObjectLODIndexForDistance = function (levels: LODLevel[], distance: number): number {\r\n  for (let i = levels.length - 1; i > 0; i--) {\r\n    const level = levels[i];\r\n    const levelDistance = level.distance - (level.distance * level.hysteresis);\r\n    if (distance >= levelDistance) return i;\r\n  }\r\n\r\n  return 0;\r\n};\r\n\r\nInstancedMesh2.prototype.setFirstLODDistance = function (distance = 0, hysteresis = 0): InstancedMesh2 {\r\n  if (this._parentLOD) {\r\n    console.error('Cannot create LOD for this InstancedMesh2.');\r\n    return;\r\n  }\r\n\r\n  if (!this.infoLOD) {\r\n    this.infoLOD = { render: null, shadowRender: null, objects: [this] };\r\n  }\r\n\r\n  if (!this.infoLOD.render) {\r\n    this.infoLOD.render = {\r\n      levels: [{ distance, hysteresis, object: this }],\r\n      indexes: [this._indexArray],\r\n      count: [0]\r\n    };\r\n  }\r\n\r\n  return this;\r\n};\r\n\r\nInstancedMesh2.prototype.addLOD = function (geometry: BufferGeometry, material: Material, distance = 0, hysteresis = 0): InstancedMesh2 {\r\n  if (this._parentLOD) {\r\n    console.error('Cannot create LOD for this InstancedMesh2.');\r\n    return;\r\n  }\r\n\r\n  if (!this.infoLOD?.render && distance === 0) {\r\n    console.error('Cannot set distance to 0 for the first LOD. Use \"setFirstLODDistance\" before use \"addLOD\".');\r\n    return;\r\n  } else {\r\n    this.setFirstLODDistance(0, hysteresis);\r\n  }\r\n\r\n  this.addLevel(this.infoLOD.render, geometry, material, distance, hysteresis);\r\n\r\n  return this;\r\n};\r\n\r\nInstancedMesh2.prototype.addShadowLOD = function (geometry: BufferGeometry, distance = 0, hysteresis = 0): InstancedMesh2 {\r\n  if (this._parentLOD) {\r\n    console.error('Cannot create LOD for this InstancedMesh2.');\r\n    return;\r\n  }\r\n\r\n  if (!this.infoLOD) {\r\n    this.infoLOD = { render: null, shadowRender: null, objects: [this] };\r\n  }\r\n\r\n  if (!this.infoLOD.shadowRender) {\r\n    this.infoLOD.shadowRender = { levels: [], indexes: [], count: [] };\r\n  }\r\n\r\n  const object = this.addLevel(this.infoLOD.shadowRender, geometry, null, distance, hysteresis);\r\n  object.castShadow = true;\r\n  this.castShadow = true;\r\n\r\n  return this;\r\n};\r\n\r\nInstancedMesh2.prototype.addLevel = function (renderList: LODRenderList, geometry: BufferGeometry, material: Material, distance: number, hysteresis: number): InstancedMesh2 {\r\n  const objectsList = this.infoLOD.objects;\r\n  const levels = renderList.levels;\r\n  let index;\r\n  let object: InstancedMesh2;\r\n  distance = distance ** 2; // to avoid to use Math.sqrt every time\r\n\r\n  const objIndex = objectsList.findIndex((e) => e.geometry === geometry);\r\n  if (objIndex === -1) {\r\n    object = new InstancedMesh2(this._renderer, this._maxCount, geometry, material ?? new ShaderMaterial(), this);\r\n    objectsList.push(object);\r\n    this.add(object); // TODO handle render order?\r\n  } else {\r\n    object = objectsList[objIndex];\r\n    if (material) object.material = material;\r\n  }\r\n\r\n  for (index = 0; index < levels.length; index++) {\r\n    if (distance < levels[index].distance) break;\r\n  }\r\n\r\n  levels.splice(index, 0, { distance, hysteresis, object });\r\n  renderList.count.push(0);\r\n  renderList.indexes.splice(index, 0, object._indexArray);\r\n\r\n  return object;\r\n};\r\n","import { Intersection, Matrix4, Mesh, Ray, Raycaster, Sphere, Vector3 } from 'three';\r\nimport { InstancedMesh2 } from '../InstancedMesh2.js';\r\nimport { ascSortIntersection } from '../../utils/SortingUtils.js';\r\n\r\ndeclare module '../InstancedMesh2.js' {\r\n  interface InstancedMesh2 {\r\n    /** @internal */ checkObjectIntersection(raycaster: Raycaster, objectIndex: number, result: Intersection[]): void;\r\n  }\r\n}\r\n\r\nconst _intersections: Intersection[] = [];\r\nconst _mesh = new Mesh();\r\nconst _ray = new Ray();\r\nconst _direction = new Vector3();\r\nconst _worldScale = new Vector3();\r\nconst _invMatrixWorld = new Matrix4();\r\nconst _sphere = new Sphere();\r\n\r\nInstancedMesh2.prototype.raycast = function (raycaster: Raycaster, result: Intersection[]): void {\r\n  if (this._material === undefined) return;\r\n\r\n  const raycastFrustum = this.raycastOnlyFrustum && this._perObjectFrustumCulled && !this.bvh;\r\n  _mesh.geometry = this._geometry;\r\n  _mesh.material = this._material;\r\n\r\n  const originalRay = raycaster.ray;\r\n  const originalNear = raycaster.near;\r\n  const originalFar = raycaster.far;\r\n\r\n  _invMatrixWorld.copy(this.matrixWorld).invert();\r\n\r\n  _worldScale.setFromMatrixScale(this.matrixWorld);\r\n  _direction.copy(raycaster.ray.direction).multiply(_worldScale);\r\n  const scaleFactor = _direction.length();\r\n\r\n  raycaster.ray = _ray.copy(raycaster.ray).applyMatrix4(_invMatrixWorld);\r\n  raycaster.near /= scaleFactor;\r\n  raycaster.far /= scaleFactor;\r\n\r\n  if (this.bvh) {\r\n    this.bvh.raycast(raycaster, (instanceId) => this.checkObjectIntersection(raycaster, instanceId, result));\r\n    // TODO test with three-mesh-bvh\r\n  } else {\r\n    if (this.boundingSphere === null) this.computeBoundingSphere();\r\n    _sphere.copy(this.boundingSphere);\r\n    if (!raycaster.ray.intersectsSphere(_sphere)) return;\r\n\r\n    const instancesToCheck = this._indexArray;\r\n    const checkCount = raycastFrustum ? this._count : this.instancesCount;\r\n\r\n    for (let i = 0; i < checkCount; i++) {\r\n      this.checkObjectIntersection(raycaster, instancesToCheck[i], result);\r\n    }\r\n  }\r\n\r\n  result.sort(ascSortIntersection);\r\n\r\n  raycaster.ray = originalRay;\r\n  raycaster.near = originalNear;\r\n  raycaster.far = originalFar;\r\n};\r\n\r\nInstancedMesh2.prototype.checkObjectIntersection = function (raycaster: Raycaster, objectIndex: number, result: Intersection[]): void {\r\n  if (objectIndex > this.instancesCount || !this.getVisibilityAt(objectIndex)) return;\r\n\r\n  this.getMatrixAt(objectIndex, _mesh.matrixWorld);\r\n\r\n  _mesh.raycast(raycaster, _intersections);\r\n\r\n  for (const intersect of _intersections) {\r\n    intersect.instanceId = objectIndex;\r\n    intersect.object = this;\r\n    result.push(intersect);\r\n  }\r\n\r\n  _intersections.length = 0;\r\n};\r\n","export default /* glsl */`\r\n  float getFloatFromTexture( sampler2D texture, const in uint i ) {\r\n    int size = textureSize( texture, 0 ).x;\r\n    int j = int( i );\r\n    int x = j % size;\r\n    int y = j / size;\r\n    return float( texelFetch( texture, ivec2( x, y ), 0 ).r );\r\n  }\r\n\r\n  vec2 getVec2FromTexture( sampler2D texture, const in uint i ) {\r\n    int size = textureSize( texture, 0 ).x;\r\n    int j = int( i );\r\n    int x = j % size;\r\n    int y = j / size;\r\n    return texelFetch( texture, ivec2( x, y ), 0 ).rg;\r\n  }\r\n\r\n    vec3 getVec3FromTexture( sampler2D texture, const in uint i ) {\r\n    int size = textureSize( texture, 0 ).x;\r\n    int j = int( i );\r\n    int x = j % size;\r\n    int y = j / size;\r\n    return texelFetch( texture, ivec2( x, y ), 0 ).rgb;\r\n  }\r\n\r\n    vec4 getVec4FromTexture( sampler2D texture, const in uint i ) {\r\n    int size = textureSize( texture, 0 ).x;\r\n    int j = int( i );\r\n    int x = j % size;\r\n    int y = j / size;\r\n    return texelFetch( texture, ivec2( x, y ), 0 );\r\n  }\r\n\r\n  mat3 getMat3FromTexture( sampler2D texture, const in uint i ) {\r\n    int size = textureSize( texture, 0 ).x;\r\n    int j = int( i ) * 3;\r\n    int x = j % size;\r\n    int y = j / size;\r\n    vec4 v1 = texelFetch( texture, ivec2( x, y ), 0 );\r\n    vec4 v2 = texelFetch( texture, ivec2( x + 1, y ), 0 );\r\n    vec4 v3 = texelFetch( texture, ivec2( x + 2, y ), 0 );\r\n    return mat3( v1, v2, v3);\r\n  }\r\n\r\n  mat4 getMat4FromTexture( sampler2D texture, const in uint i ) {\r\n    int size = textureSize( texture, 0 ).x;\r\n    int j = int( i ) * 4;\r\n    int x = j % size;\r\n    int y = j / size;\r\n    vec4 v1 = texelFetch( texture, ivec2( x, y ), 0 );\r\n    vec4 v2 = texelFetch( texture, ivec2( x + 1, y ), 0 );\r\n    vec4 v3 = texelFetch( texture, ivec2( x + 2, y ), 0 );\r\n    vec4 v4 = texelFetch( texture, ivec2( x + 3, y ), 0 );\r\n    return mat4( v1, v2, v3, v4 );\r\n  }\r\n`;\r\n","export default /* glsl */`\r\n#ifdef USE_INSTANCING_INDIRECT\r\n  attribute uint instanceIndex;\r\n  uniform highp sampler2D matricesTexture;  \r\n  #ifdef USE_INSTANCING_COLOR_INDIRECT\r\n    uniform highp sampler2D colorsTexture;\r\n  #endif\r\n#endif\r\n`;\r\n","export default /* glsl */`\r\n#ifdef USE_INSTANCING_INDIRECT\r\n  mat4 instanceMatrix = getMat4FromTexture( matricesTexture, instanceIndex );\r\n\r\n  #ifdef USE_INSTANCING_COLOR_INDIRECT\r\n    vec3 instanceColor = getVec3FromTexture( colorsTexture, instanceIndex );\r\n    vColor.xyz *= instanceColor.xyz;\r\n  #endif\r\n#endif\r\n`;\r\n","import { ShaderChunk } from 'three';\r\nimport get_from_texture from './chunks/get_from_texture.glsl.js';\r\nimport instanced_pars_vertex from './chunks/instanced_pars_vertex.glsl.js';\r\nimport instanced_vertex from './chunks/instanced_vertex.glsl.js';\r\n\r\nShaderChunk['get_from_texture'] = get_from_texture;\r\nShaderChunk['instanced_pars_vertex'] = instanced_pars_vertex;\r\nShaderChunk['instanced_vertex'] = instanced_vertex;\r\n\r\nShaderChunk.project_vertex = ShaderChunk.project_vertex.replace('#ifdef USE_INSTANCING', '#if defined USE_INSTANCING || defined USE_INSTANCING_INDIRECT');\r\nShaderChunk.worldpos_vertex = ShaderChunk.worldpos_vertex.replace('#ifdef USE_INSTANCING', '#if defined USE_INSTANCING || defined USE_INSTANCING_INDIRECT');\r\nShaderChunk.defaultnormal_vertex = ShaderChunk.defaultnormal_vertex.replace('#ifdef USE_INSTANCING', '#if defined USE_INSTANCING || defined USE_INSTANCING_INDIRECT');\r\n\r\nShaderChunk.color_pars_vertex = ShaderChunk.color_pars_vertex.replace('defined( USE_INSTANCING_COLOR )', 'defined( USE_INSTANCING_COLOR ) || defined( USE_INSTANCING_COLOR_INDIRECT )');\r\nShaderChunk.color_vertex = ShaderChunk.color_vertex.replace('defined( USE_INSTANCING_COLOR )', 'defined( USE_INSTANCING_COLOR ) || defined( USE_INSTANCING_COLOR_INDIRECT )');\r\n\r\nShaderChunk.common = ShaderChunk.common.concat('\\n#include <get_from_texture>');\r\nShaderChunk.batching_pars_vertex = ShaderChunk.batching_pars_vertex.concat('\\n#include <instanced_pars_vertex>');\r\nShaderChunk['batching_vertex'] = ShaderChunk['batching_vertex'].concat('\\n#include <instanced_vertex>'); // TODO fix d.ts\r\n\r\n// use 'getPatchedShader' function to make these example works\r\n// examples/jsm/modifiers/CurveModifier.js\r\n// examples/jsm/postprocessing/OutlinePass.js\r\n\r\nexport function patchShader(shader: string): string {\r\n  return shader.replace('#ifdef USE_INSTANCING', '#if defined USE_INSTANCING || defined USE_INSTANCING_INDIRECT')\r\n    .replace('#ifdef USE_INSTANCING_COLOR', '#if defined USE_INSTANCING_COLOR || defined USE_INSTANCING_COLOR_INDIRECT')\r\n    .replace('defined( USE_INSTANCING_COLOR )', 'defined( USE_INSTANCING_COLOR ) || defined( USE_INSTANCING_COLOR_INDIRECT )');\r\n}\r\n"],"names":["InstancedEntity","owner","id","useEuler","Vector3","quaternion","Quaternion","rotation","Euler","value","position","scale","te","offset","x","y","z","w","x2","y2","z2","xx","xy","xz","yy","yz","zz","wx","wy","wz","sx","sy","sz","_a","name","target","m","q","axis","angle","_quat","_xAxis","_yAxis","_zAxis","distance","_vec3","createTexture_float","count","size","array","texture","DataTexture","RedFormat","FloatType","createTexture_uint","RedIntegerFormat","UnsignedIntType","createTexture_vec2","RGFormat","createTexture_vec4","RGBAFormat","createTexture_mat3","createTexture_mat4","GLInstancedBufferAttribute","GLBufferAttribute","gl","type","itemSize","elementSize","meshPerAttribute","buffer","renderer","getSphereFromMatrix_centeredGeometry","m0","m1","m2","m4","m5","m6","m8","m9","m10","scaleXSq","scaleYSq","scaleZSq","getPositionAt","index","getMaxScaleOnAxisAt","te0","te1","te2","te4","te5","te6","te8","te9","te10","InstancedMeshBVH","margin","highPrecision","getBoxFromSphere","geometry","center","BVH","HybridBuilder","WebGLCoordinateSystem","boxes","objects","node","ids","projScreenMatrix","onFrustumIntersection","frustum","mask","cameraPosition","levels","levelsArray","i","camera","level","raycaster","onIntersection","ray","origin","dir","vec3ToArray","box3ToArray","centerX","centerY","centerZ","maxScale","radius","_box3","Box3","InstancedMesh2","Mesh","material","LOD","instancesUseEuler","MeshDepthMaterial","RGBADepthPacking","MeshDistanceMaterial","InstancedBufferAttribute","scene","shadowCamera","depthMaterial","group","onBeforeCompile","shader","onUpdate","instances","instance","onInstanceCreation","config","matrix","_tempMat4","visible","color","ColorManagement","_tempCol","setCallback","object","_tempMesh","objectInfluences","len","dataIndex","morphInfluencesSum","objectInfluence","morphBaseInfluence","geoBoundingBox","boundingBox","Sphere","geoBoundingSphere","boundingSphere","_sphere","source","recursive","Matrix4","Color","createRadixSort","options","el","list","minZ","maxZ","depth","depthDelta","factor","item","radixSort","sortOpaque","a","b","sortTransparent","ascSortIntersection","InstancedRenderList","pool","_frustum","Frustum","_renderList","_projScreenMatrix","_invMatrixWorld","_forward","_cameraPos","_cameraLODPos","_position","cameraLOD","info","isShadowRendering","renderList","sortObjects","perObjectFrustumCulled","customSort","instancesCount","matrixArray","bSphere","geometryCentered","indexes","levelIndex","levelDistance","l","_b","visibilityArray","hysteresis","objectsList","objIndex","e","ShaderMaterial","_intersections","_mesh","_ray","Ray","_direction","_worldScale","result","raycastFrustum","originalRay","originalNear","originalFar","scaleFactor","instanceId","instancesToCheck","checkCount","objectIndex","intersect","get_from_texture","instanced_pars_vertex","instanced_vertex","ShaderChunk","patchShader"],"mappings":"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"}