{"version":3,"sources":["../src/index.ts","../../voxelized-js/src/utils.ts","../../voxelized-js/src/slot.ts","../../voxelized-js/src/region.ts","../../voxelized-js/src/queue.ts","../../voxelized-js/src/store.ts","../../voxelized-js/src/camera.ts","../../voxelized-js/src/mesh.ts","../../voxelized-js/src/index.ts","../src/utils.ts"],"sourcesContent":["import * as THREE from 'three/webgpu'\nimport { attribute, float, Fn, int, ivec3, normalLocal, positionGeometry, positionLocal, textureLoad, uniformArray, varying, vec3, vec4 } from 'three/tsl'\n// import createVoxel from 'voxelized-js/src'\nimport createVoxel from '../../voxelized-js/src'\nimport { atlas } from './utils'\nimport type { Camera, DataArrayTexture, Object3D, Scene, UniformArrayNode, Node, Vector3 } from 'three/webgpu'\n\nexport * from './utils'\n\ntype Req = Parameters<typeof createVoxel>[0]\ntype Res = ReturnType<typeof createVoxel>\ntype Cam = Res['cam']\n\ntype Renderer = Parameters<Object3D['onBeforeRender']>[0]\n\nconst _vec2 = new THREE.Vector2()\nconst _vec3 = new THREE.Vector3()\nconst _mat4 = new THREE.Matrix4()\n\nconst driveFromVoxel = (cam: Cam, camera: Camera, renderer: Renderer) => {\n        const size = renderer.getSize(_vec2)\n        cam.update(size.x / size.y)\n        camera.position.set(cam.pos[0], cam.pos[1], cam.pos[2])\n        _vec3.set(cam.eye[0], cam.eye[1], cam.eye[2])\n        camera.lookAt(_vec3)\n        camera.updateMatrixWorld()\n        // @ts-ignore\n        camera.updateProjectionMatrix()\n}\n\nconst driveFromThree = (cam: Cam, camera: Camera) => {\n        _mat4.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse)\n        for (let k = 0; k < 16; k++) cam.mvp[k] = _mat4.elements[k]\n        cam.pos[0] = camera.position.x\n        cam.pos[1] = camera.position.y\n        cam.pos[2] = camera.position.z\n}\n\nconst createVec3 = () => new THREE.Vector3()\nconst createGeometry = () => new THREE.BoxGeometry()\nconst createMaterial = (atlasTex: DataArrayTexture, offsetNode: UniformArrayNode<'vec3'>) => {\n        const _pos = attribute<'vec3'>('pos', 'vec3')\n        const _scl = attribute<'vec3'>('scl', 'vec3')\n        const _aid = attribute<'float'>('aid', 'float')\n        const pick = Fn(([id, uvPix]: [Node<'float'>, Node<'ivec2'>]) => {\n                return textureLoad(atlasTex, uvPix, int(0)).depth(id.toInt())\n        })\n        const diffuse = Fn(([n]: [Node<'vec3'>]) => {\n                return vec3(-0.33, 0.77, 0.55).normalize().dot(n).mul(0.5).add(0.5)\n        })\n        const position = Fn(() => {\n                const off = offsetNode.element(_aid.toInt())\n                return off.add(_pos.add(positionLocal.mul(_scl)))\n        })\n        const center = Fn(() => {\n                const local = _pos.add(positionGeometry.mul(_scl))\n                return local.sub(normalLocal.sign().mul(float(0.5))).floor()\n        })\n        const vAid = varying(_aid, 'vAid')\n        const vDiff = varying(diffuse(normalLocal), 'vDiff')\n        const vCenter = varying(center(), 'vCenter')\n        const color = Fn(() => {\n                const p = ivec3(vCenter)\n                const uv = atlas(p).toVar('uv')\n                const rgb = pick(vAid, uv).rgb.mul(vDiff).toVar('rgb')\n                return vec4(rgb, 1)\n        })\n        const mat = new THREE.MeshBasicNodeMaterial({ side: THREE.FrontSide })\n        mat.positionNode = position()\n        mat.colorNode = color()\n        return mat\n}\n\nconst SIZE = 4096\n\nconst createDstTexture = (slot = 16) => {\n        const t = new THREE.DataArrayTexture(null, SIZE, SIZE, slot)\n        t.wrapS = THREE.ClampToEdgeWrapping\n        t.wrapT = THREE.ClampToEdgeWrapping\n        t.magFilter = THREE.NearestFilter\n        t.minFilter = THREE.NearestFilter\n        t.colorSpace = THREE.SRGBColorSpace\n        t.needsUpdate = true\n        t.generateMipmaps = false\n        t.source.dataReady = false\n        return t\n}\n\ntype WriteAtlas = (at: number, atlas: ImageBitmap) => void\n\nconst createAtlasWriter = (renderer: Renderer, dstTexture: DataArrayTexture): WriteAtlas => {\n        renderer.initTexture(dstTexture)\n        const backend = (renderer as any).backend\n        const device = backend.device\n        const gpuTex = backend.get(dstTexture).texture\n        return (at, atlas) => device.queue.copyExternalImageToTexture({ source: atlas, flipY: false }, { texture: gpuTex, origin: { x: 0, y: 0, z: at }, colorSpace: 'srgb' }, { width: SIZE, height: SIZE, depthOrArrayLayers: 1 })\n}\n\nconst writeOffset = (offsetNode: UniformArrayNode<'vec3'>, at: number, offset: [number, number, number]) => {\n        const _node = offsetNode as unknown as { array: Vector3[]; needsUpdate: boolean }\n        _node.array[at].set(offset[0], offset[1], offset[2])\n        _node.needsUpdate = true\n}\n\nexport class Voxel extends THREE.InstancedMesh {\n        voxel: Res\n        offsetNode: UniformArrayNode<'vec3'>\n        dstTexture: DataArrayTexture\n        private _isThree: boolean\n        private _writeAtlas?: WriteAtlas\n        constructor(params: Req & { controls?: 'three' | 'voxel' }) {\n                const { slot = 16, controls } = params\n                const offsetNode = uniformArray<'vec3'>(Array.from({ length: slot }, createVec3), 'vec3')\n                const dstTexture = createDstTexture(slot)\n                super(createGeometry(), createMaterial(dstTexture, offsetNode), 1)\n                this.offsetNode = offsetNode\n                this.dstTexture = dstTexture\n                this.frustumCulled = false\n                this.voxel = createVoxel(params)\n                this._isThree = controls !== 'voxel'\n                this._setAttribute()\n        }\n        onBeforeRender(renderer: Renderer, _scene: Scene, camera: Camera) {\n                const { dstTexture, offsetNode, voxel, _isThree } = this\n                const { cam, count, updated, updates, overflow } = voxel\n                if (_isThree) driveFromThree(cam, camera)\n                else driveFromVoxel(cam, camera, renderer)\n                if (!this._writeAtlas) this._writeAtlas = createAtlasWriter(renderer, dstTexture)\n                const writeAtlas = this._writeAtlas\n                updates(({ at, atlas, offset }) => {\n                        writeOffset(offsetNode, at, offset)\n                        writeAtlas(at, atlas)\n                })\n                if (!updated()) return\n                if (overflow()) return this._setAttribute()\n                const geometry = this.geometry\n                geometry.getAttribute('pos').needsUpdate = true\n                geometry.getAttribute('scl').needsUpdate = true\n                geometry.getAttribute('aid').needsUpdate = true\n                this.count = count()\n        }\n        private _setAttribute() {\n                const { geometry, voxel } = this\n                const { pos, scl, aid } = voxel\n                geometry.setAttribute('pos', new THREE.InstancedBufferAttribute(pos(), 3))\n                geometry.setAttribute('scl', new THREE.InstancedBufferAttribute(scl(), 3))\n                geometry.setAttribute('aid', new THREE.InstancedBufferAttribute(aid(), 1))\n        }\n}\n\nexport default Voxel\n","export interface VoxelConfig {\n        x0: number\n        x1: number\n        y0: number\n        y1: number\n        slot: number\n        prebuild: number\n        prefetch: number\n        prepurge: number\n        atlasExt: string\n        atlasUrl: string\n}\n\nexport const defaults: VoxelConfig = {\n        x0: 116326,\n        x1: 116508,\n        y0: 51545,\n        y1: 51694,\n        slot: 16,\n        prebuild: 4,\n        prefetch: 4,\n        prepurge: 64,\n        atlasExt: 'webp',\n        atlasUrl: 'https://r2.glre.dev/atlas/v1',\n}\n\nexport const local = (x: number, y: number, z: number) => (x | 0) + ((y | 0) + (z | 0) * 256) * 256\nexport const offOf = (i: number, j: number, x0: number, y0: number) => [(i - x0) << 8, 0, (j - y0) << 8]\nexport const posOf = (x: number, z: number, x0: number, y0: number) => [x0 + (x >> 8), y0 + (z >> 8)]\nexport const range = (n = 0) => [...Array(n).keys()]\nexport const regionId = (i: number, j: number, w: number) => i + w * j\nexport const culling = (VP = M.create(), rx = 0, ry = 0, rz = 0) => visSphere(VP as number[], rx + 128, ry + 128, rz + 128, Math.sqrt(256 * 256 * 3) * 0.5)\n\nconst Z = 17\nconst N = Math.pow(2, Z)\nexport const lng2i = (lng = 0) => ((lng + 180) / 360) * N\nexport const lat2j = (lat = 0, s = Math.sin((lat * Math.PI) / 180)) => (0.5 - Math.log((1 + s) / (1 - s)) / (4 * Math.PI)) * N\nexport const i2lng = (i = 0) => (i / N) * 360 - 180\nexport const j2lat = (j = 0) => (180 / Math.PI) * Math.atan(0.5 * (Math.exp(Math.PI * (1 - (2 * j) / N)) - Math.exp(-Math.PI * (1 - (2 * j) / N))))\nexport const geo2tile = (lat: number, lng: number): [number, number] => [Math.floor(lng2i(lng)), Math.floor(lat2j(lat))]\nexport const tile2geo = (i: number, j: number): [number, number] => [j2lat(j), i2lng(i)]\n\nexport const localOf = (wx: number, wy: number, wz: number, ri: number, rj: number, x0: number, y0: number): [number, number, number] => {\n        const [ox, , oz] = offOf(ri, rj, x0, y0)\n        return [wx - ox, wy, wz - oz]\n}\n\nexport const loadBitmap = async (url = '', signal?: AbortSignal) => {\n        const res = await fetch(url, { signal, mode: 'cors' }) // @MEMO DO NOT SET: `cache: 'reload'`\n        const blob = await res.blob()\n        if (blob.size <= 0) throw new Error('empty-atlas')\n        return await createImageBitmap(blob, 0, 0, 4096, 4096)\n}\n\nexport const loadContext = (bitmap: ImageBitmap) => {\n        const canvas = new OffscreenCanvas(bitmap.width, bitmap.height)\n        const ctx = canvas.getContext('2d', { willReadFrequently: true }) as OffscreenCanvasRenderingContext2D\n        ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height)\n        return ctx\n}\n\nexport const withinRange = (dx: number, dy: number, range: number) => Math.abs(dx) < range && Math.abs(dy) < range\n\nexport const inRegion = (x: number, y: number, z: number) => {\n        if (x < 0) return false\n        if (y < 0) return false\n        if (z < 0) return false\n        if (x >= 256) return false\n        if (y >= 256) return false\n        if (z >= 256) return false\n        return true\n}\n\nexport const scoped = (i: number, j: number, x0: number, x1: number, y0: number, y1: number) => {\n        if (i < x0) return false\n        if (i > x1) return false\n        if (j < y0) return false\n        if (j > y1) return false\n        return true\n}\n\nexport const xyz2m = (x: number, y: number, z: number) => {\n        x = x >>> 0\n        y = y >>> 0\n        z = z >>> 0\n        x = (x | (x << 16)) & 0xff0000ff\n        y = (y | (y << 16)) & 0xff0000ff\n        z = (z | (z << 16)) & 0xff0000ff\n        x = (x | (x << 8)) & 0x0300f00f\n        y = (y | (y << 8)) & 0x0300f00f\n        z = (z | (z << 8)) & 0x0300f00f\n        x = (x | (x << 4)) & 0x030c30c3\n        y = (y | (y << 4)) & 0x030c30c3\n        z = (z | (z << 4)) & 0x030c30c3\n        x = (x | (x << 2)) & 0x09249249\n        y = (y | (y << 2)) & 0x09249249\n        z = (z | (z << 2)) & 0x09249249\n        return (x | (y << 1) | (z << 2)) >>> 0\n}\n\nexport const m2xyz = (morton: number): [number, number, number] => {\n        let x = morton >>> 0\n        let y = (morton >>> 1) >>> 0\n        let z = (morton >>> 2) >>> 0\n        x = x & 0x09249249\n        y = y & 0x09249249\n        z = z & 0x09249249\n        x = (x | (x >>> 2)) & 0x030c30c3\n        y = (y | (y >>> 2)) & 0x030c30c3\n        z = (z | (z >>> 2)) & 0x030c30c3\n        x = (x | (x >>> 4)) & 0x0300f00f\n        y = (y | (y >>> 4)) & 0x0300f00f\n        z = (z | (z >>> 4)) & 0x0300f00f\n        x = (x | (x >>> 8)) & 0xff0000ff\n        y = (y | (y >>> 8)) & 0xff0000ff\n        z = (z | (z >>> 8)) & 0xff0000ff\n        x = (x | (x >>> 16)) & 0x000003ff\n        y = (y | (y >>> 16)) & 0x000003ff\n        z = (z | (z >>> 16)) & 0x000003ff\n        return [x, y, z]\n}\n\nexport const m2uv = (morton: number): [number, number] => {\n        let x = morton >>> 0\n        let y = (morton >>> 1) >>> 0\n        x = x & 0x55555555\n        y = y & 0x55555555\n        x = (x | (x >>> 1)) & 0x33333333\n        y = (y | (y >>> 1)) & 0x33333333\n        x = (x | (x >>> 2)) & 0x0f0f0f0f\n        y = (y | (y >>> 2)) & 0x0f0f0f0f\n        x = (x | (x >>> 4)) & 0x00ff00ff\n        y = (y | (y >>> 4)) & 0x00ff00ff\n        x = (x | (x >>> 8)) & 0x0000ffff\n        y = (y | (y >>> 8)) & 0x0000ffff\n        return [x, y]\n}\n\nexport const uv2m = (x: number, y: number) => {\n        x = x >>> 0\n        y = y >>> 0\n        x = x & 0x0000ffff\n        y = y & 0x0000ffff\n        x = (x | (x << 8)) & 0x00ff00ff\n        y = (y | (y << 8)) & 0x00ff00ff\n        x = (x | (x << 4)) & 0x0f0f0f0f\n        y = (y | (y << 4)) & 0x0f0f0f0f\n        x = (x | (x << 2)) & 0x33333333\n        y = (y | (y << 2)) & 0x33333333\n        x = (x | (x << 1)) & 0x55555555\n        y = (y | (y << 1)) & 0x55555555\n        return ((y << 1) | x) >>> 0\n}\n\nexport const atlas2occ = (data: Uint8ClampedArray, width: number, height: number) => {\n        const occ = new Uint8Array(256 * 256 * 256)\n        const pixels = width * height\n        for (let i = 0; i < pixels; i++) {\n                // if ((data[i * 4] | data[i * 4 + 1] | data[i * 4 + 2]) === 0) continue\n                if (data[i * 4 + 3] === 0) continue\n                const ax = i % width\n                const ay = (i / width) | 0\n                const id = uv2m(ax, ay)\n                const [x, y, z] = m2xyz(id)\n                occ[local(x, y, z)] = 1\n        }\n        return occ\n}\n\nexport const timer = (t = 6) => {\n        const start = performance.now()\n        return () => performance.now() - start < Math.max(0, t)\n}\n\nexport const createImage = async (src = '') => {\n        const img = new Image()\n        const promise = new Promise<HTMLImageElement>((resolve) => void (img.onload = () => resolve(img)))\n        Object.assign(img, { src, crossOrigin: 'anonymous' })\n        return await promise\n}\n\nexport const createContext = () => {\n        const el = document.createElement('canvas')\n        Object.assign(el, { width: 4096, height: 4096 })\n        return el.getContext('2d', { willReadFrequently: true })\n}\n\nexport const visSphere = (m = M.create(), cx = 0, cy = 0, cz = 0, r = 1) => {\n        const t = (ax = 0, ay = 0, az = 0, aw = 0) => (ax * cx + ay * cy + az * cz + aw) / (Math.hypot(ax, ay, az) || 1) + r < 0\n        if (t(m[3] + m[0], m[7] + m[4], m[11] + m[8], m[15] + m[12])) return false\n        if (t(m[3] - m[0], m[7] - m[4], m[11] - m[8], m[15] - m[12])) return false\n        if (t(m[3] + m[1], m[7] + m[5], m[11] + m[9], m[15] + m[13])) return false\n        if (t(m[3] - m[1], m[7] - m[5], m[11] - m[9], m[15] - m[13])) return false\n        if (t(m[3] + m[2], m[7] + m[6], m[11] + m[10], m[15] + m[14])) return false\n        if (t(m[3] - m[2], m[7] - m[6], m[11] - m[10], m[15] - m[14])) return false\n        return true\n}\n\nexport const V = {\n        create: (): number[] => [0, 0, 0],\n        fromValues: (x = 0, y = 0, z = 0): number[] => [x, y, z],\n        copy: (o: number[], a: number[]) => {\n                o[0] = a[0]\n                o[1] = a[1]\n                o[2] = a[2]\n                return o\n        },\n        normalize: (o: number[], a: number[]) => {\n                const l = Math.hypot(a[0], a[1], a[2]) || 1\n                o[0] = a[0] / l\n                o[1] = a[1] / l\n                o[2] = a[2] / l\n                return o\n        },\n        cross: (o: number[], a: number[], b: number[]) => {\n                const x = a[1] * b[2] - a[2] * b[1]\n                const y = a[2] * b[0] - a[0] * b[2]\n                const z = a[0] * b[1] - a[1] * b[0]\n                o[0] = x\n                o[1] = y\n                o[2] = z\n                return o\n        },\n        scale: (o: number[], a: number[], s: number) => {\n                o[0] = a[0] * s\n                o[1] = a[1] * s\n                o[2] = a[2] * s\n                return o\n        },\n        add: (o: number[], a: number[], b: number[]) => {\n                o[0] = a[0] + b[0]\n                o[1] = a[1] + b[1]\n                o[2] = a[2] + b[2]\n                return o\n        },\n        scaleAndAdd: (o: number[], a: number[], b: number[], s: number) => {\n                o[0] = a[0] + b[0] * s\n                o[1] = a[1] + b[1] * s\n                o[2] = a[2] + b[2] * s\n                return o\n        },\n        squaredLength: (a: number[]) => a[0] * a[0] + a[1] * a[1] + a[2] * a[2],\n        clone: (a: number[]) => [a[0], a[1], a[2]],\n        floor: (o: number[], a: number[]) => {\n                o[0] = Math.floor(a[0])\n                o[1] = Math.floor(a[1])\n                o[2] = Math.floor(a[2])\n                return o\n        },\n        transformMat4: (o: number[], a: number[], m: number[]) => {\n                const x = a[0]\n                const y = a[1]\n                const z = a[2]\n                const w = m[3] * x + m[7] * y + m[11] * z + m[15] || 1\n                o[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w\n                o[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w\n                o[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w\n                return o\n        },\n}\n\nexport const M = {\n        create: (): number[] => [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],\n        invert: (o: number[], m: number[]) => {\n                const [a00, a01, a02, a03, a10, a11, a12, a13, a20, a21, a22, a23, a30, a31, a32, a33] = m\n                const b00 = a00 * a11 - a01 * a10\n                const b01 = a00 * a12 - a02 * a10\n                const b02 = a00 * a13 - a03 * a10\n                const b03 = a01 * a12 - a02 * a11\n                const b04 = a01 * a13 - a03 * a11\n                const b05 = a02 * a13 - a03 * a12\n                const b06 = a20 * a31 - a21 * a30\n                const b07 = a20 * a32 - a22 * a30\n                const b08 = a20 * a33 - a23 * a30\n                const b09 = a21 * a32 - a22 * a31\n                const b10 = a21 * a33 - a23 * a31\n                const b11 = a22 * a33 - a23 * a32\n                const d = 1 / (b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06)\n                o[0] = (a11 * b11 - a12 * b10 + a13 * b09) * d\n                o[1] = (a02 * b10 - a01 * b11 - a03 * b09) * d\n                o[2] = (a31 * b05 - a32 * b04 + a33 * b03) * d\n                o[3] = (a22 * b04 - a21 * b05 - a23 * b03) * d\n                o[4] = (a12 * b08 - a10 * b11 - a13 * b07) * d\n                o[5] = (a00 * b11 - a02 * b08 + a03 * b07) * d\n                o[6] = (a32 * b02 - a30 * b05 - a33 * b01) * d\n                o[7] = (a20 * b05 - a22 * b02 + a23 * b01) * d\n                o[8] = (a10 * b10 - a11 * b08 + a13 * b06) * d\n                o[9] = (a01 * b08 - a00 * b10 - a03 * b06) * d\n                o[10] = (a30 * b04 - a31 * b02 + a33 * b00) * d\n                o[11] = (a21 * b02 - a20 * b04 - a23 * b00) * d\n                o[12] = (a11 * b07 - a10 * b09 - a12 * b06) * d\n                o[13] = (a00 * b09 - a01 * b07 + a02 * b06) * d\n                o[14] = (a31 * b01 - a30 * b03 - a32 * b00) * d\n                o[15] = (a20 * b03 - a21 * b01 + a22 * b00) * d\n                return o\n        },\n        identity: (o: number[]) => {\n                o[0] = 1\n                o[1] = 0\n                o[2] = 0\n                o[3] = 0\n                o[4] = 0\n                o[5] = 1\n                o[6] = 0\n                o[7] = 0\n                o[8] = 0\n                o[9] = 0\n                o[10] = 1\n                o[11] = 0\n                o[12] = 0\n                o[13] = 0\n                o[14] = 0\n                o[15] = 1\n                return o\n        },\n        rotateX: (out: number[], a: number[], rad: number) => {\n                const s = Math.sin(rad)\n                const c = Math.cos(rad)\n                const a10 = a[4]\n                const a11 = a[5]\n                const a12 = a[6]\n                const a13 = a[7]\n                const a20 = a[8]\n                const a21 = a[9]\n                const a22 = a[10]\n                const a23 = a[11]\n                if (a !== out) {\n                        out[0] = a[0]\n                        out[1] = a[1]\n                        out[2] = a[2]\n                        out[3] = a[3]\n                        out[12] = a[12]\n                        out[13] = a[13]\n                        out[14] = a[14]\n                        out[15] = a[15]\n                }\n                out[4] = a10 * c + a20 * s\n                out[5] = a11 * c + a21 * s\n                out[6] = a12 * c + a22 * s\n                out[7] = a13 * c + a23 * s\n                out[8] = a20 * c - a10 * s\n                out[9] = a21 * c - a11 * s\n                out[10] = a22 * c - a12 * s\n                out[11] = a23 * c - a13 * s\n                return out\n        },\n        rotateY: (out: number[], a: number[], rad: number) => {\n                const s = Math.sin(rad)\n                const c = Math.cos(rad)\n                const a00 = a[0]\n                const a01 = a[1]\n                const a02 = a[2]\n                const a03 = a[3]\n                const a20 = a[8]\n                const a21 = a[9]\n                const a22 = a[10]\n                const a23 = a[11]\n                if (a !== out) {\n                        out[4] = a[4]\n                        out[5] = a[5]\n                        out[6] = a[6]\n                        out[7] = a[7]\n                        out[12] = a[12]\n                        out[13] = a[13]\n                        out[14] = a[14]\n                        out[15] = a[15]\n                }\n                out[0] = a00 * c - a20 * s\n                out[1] = a01 * c - a21 * s\n                out[2] = a02 * c - a22 * s\n                out[3] = a03 * c - a23 * s\n                out[8] = a00 * s + a20 * c\n                out[9] = a01 * s + a21 * c\n                out[10] = a02 * s + a22 * c\n                out[11] = a03 * s + a23 * c\n                return out\n        },\n        perspective: (o: number[], fov: number, aspect: number, near: number, far: number) => {\n                const f = 1 / Math.tan(0.5 * fov)\n                for (let i = 0; i < 16; i++) o[i] = 0\n                o[0] = f / aspect\n                o[5] = f\n                o[10] = (far + near) / (near - far)\n                o[11] = -1\n                o[14] = (2 * far * near) / (near - far)\n                return o\n        },\n        perspective2: (o: number[], left: number, right: number, top: number, bottom: number, near: number, far: number) => {\n                const x = (2 * near) / (right - left)\n                const y = (2 * near) / (top - bottom)\n                const a = (right + left) / (right - left)\n                const b = (top + bottom) / (top - bottom)\n                const c = -far / (far - near)\n                const d = (-far * near) / (far - near)\n                o[0] = x\n                o[1] = 0\n                o[2] = 0\n                o[3] = 0\n                o[4] = 0\n                o[5] = y\n                o[6] = 0\n                o[7] = 0\n                o[8] = a\n                o[9] = b\n                o[10] = c\n                o[11] = -1\n                o[12] = 0\n                o[13] = 0\n                o[14] = d\n                o[15] = 0\n                return o\n        },\n        lookAt: (o: number[], eye: number[], center: number[], up: number[]) => {\n                let z0 = eye[0] - center[0]\n                let z1 = eye[1] - center[1]\n                let z2 = eye[2] - center[2]\n                let l = Math.hypot(z0, z1, z2)\n                if (!l) {\n                        z2 = 1\n                } else {\n                        z0 /= l\n                        z1 /= l\n                        z2 /= l\n                }\n                let x0 = up[1] * z2 - up[2] * z1\n                let x1 = up[2] * z0 - up[0] * z2\n                let x2 = up[0] * z1 - up[1] * z0\n                l = Math.hypot(x0, x1, x2)\n                if (l) {\n                        x0 /= l\n                        x1 /= l\n                        x2 /= l\n                }\n                const y0 = z1 * x2 - z2 * x1\n                const y1 = z2 * x0 - z0 * x2\n                const y2 = z0 * x1 - z1 * x0\n                o[0] = x0\n                o[1] = y0\n                o[2] = z0\n                o[3] = 0\n                o[4] = x1\n                o[5] = y1\n                o[6] = z1\n                o[7] = 0\n                o[8] = x2\n                o[9] = y2\n                o[10] = z2\n                o[11] = 0\n                o[12] = -(x0 * eye[0] + x1 * eye[1] + x2 * eye[2])\n                o[13] = -(y0 * eye[0] + y1 * eye[1] + y2 * eye[2])\n                o[14] = -(z0 * eye[0] + z1 * eye[1] + z2 * eye[2])\n                o[15] = 1\n                return o\n        },\n        multiply: (o: number[], a: number[], b: number[]) => {\n                const a00 = a[0]\n                const a01 = a[1]\n                const a02 = a[2]\n                const a03 = a[3]\n                const a10 = a[4]\n                const a11 = a[5]\n                const a12 = a[6]\n                const a13 = a[7]\n                const a20 = a[8]\n                const a21 = a[9]\n                const a22 = a[10]\n                const a23 = a[11]\n                const a30 = a[12]\n                const a31 = a[13]\n                const a32 = a[14]\n                const a33 = a[15]\n                const b00 = b[0]\n                const b01 = b[1]\n                const b02 = b[2]\n                const b03 = b[3]\n                const b10 = b[4]\n                const b11 = b[5]\n                const b12 = b[6]\n                const b13 = b[7]\n                const b20 = b[8]\n                const b21 = b[9]\n                const b22 = b[10]\n                const b23 = b[11]\n                const b30 = b[12]\n                const b31 = b[13]\n                const b32 = b[14]\n                const b33 = b[15]\n                o[0] = a00 * b00 + a10 * b01 + a20 * b02 + a30 * b03\n                o[1] = a01 * b00 + a11 * b01 + a21 * b02 + a31 * b03\n                o[2] = a02 * b00 + a12 * b01 + a22 * b02 + a32 * b03\n                o[3] = a03 * b00 + a13 * b01 + a23 * b02 + a33 * b03\n                o[4] = a00 * b10 + a10 * b11 + a20 * b12 + a30 * b13\n                o[5] = a01 * b10 + a11 * b11 + a21 * b12 + a31 * b13\n                o[6] = a02 * b10 + a12 * b11 + a22 * b12 + a32 * b13\n                o[7] = a03 * b10 + a13 * b11 + a23 * b12 + a33 * b13\n                o[8] = a00 * b20 + a10 * b21 + a20 * b22 + a30 * b23\n                o[9] = a01 * b20 + a11 * b21 + a21 * b22 + a31 * b23\n                o[10] = a02 * b20 + a12 * b21 + a22 * b22 + a32 * b23\n                o[11] = a03 * b20 + a13 * b21 + a23 * b22 + a33 * b23\n                o[12] = a00 * b30 + a10 * b31 + a20 * b32 + a30 * b33\n                o[13] = a01 * b30 + a11 * b31 + a21 * b32 + a31 * b33\n                o[14] = a02 * b30 + a12 * b31 + a22 * b32 + a32 * b33\n                o[15] = a03 * b30 + a13 * b31 + a23 * b32 + a33 * b33\n                return o\n        },\n}\n","import { range, timer } from './utils'\nimport type { Region } from './region'\n\nexport type SlotUpdate = { at: number; atlas: ImageBitmap; offset: [number, number, number] }\n\nconst createSlot = (index = 0) => {\n        let region: Region\n        let isReady = false\n        let pending: ImageBitmap | undefined\n        let _update: SlotUpdate | undefined\n        const _reset = () => {\n                pending = undefined\n                isReady = false\n                _update = undefined\n        }\n        const upload = (budget = 6): boolean => {\n                if (!pending) return false\n                const checker = timer(budget)\n                if (!region) return false\n                if (!checker()) return false\n                _update = { at: index, atlas: pending, offset: [region.x, region.y, region.z] }\n                pending = undefined\n                return (isReady = true)\n        }\n        const ready = (budget = 6) => {\n                if (!region) return true\n                if (region.isError()) return true\n                if (isReady) return true\n                const img = pending || region.bitmap()\n                if (!img) {\n                        region.prefetch('full', 2)\n                        return false\n                }\n                pending = img\n                return upload(budget)\n        }\n        const consumeUpdate = () => {\n                const u = _update\n                _update = undefined\n                return u\n        }\n        const release = () => {\n                if (!region) return\n                region.slot = -1\n                region = undefined as unknown as Region\n                _reset()\n        }\n        const set = (r: Region, idx = 0) => {\n                region = r\n                region.slot = idx\n                _reset()\n        }\n        return { ready, release, set, isReady: () => isReady, region: () => region, consumeUpdate }\n}\n\nexport const createSlots = (size = 16) => {\n        const owner = range(size).map(createSlot)\n        let pending = [] as Region[]\n        let keep = new Set<Region>()\n        const _assign = (r: Region, budget = 6) => {\n                let index = r.slot\n                if (index < 0) {\n                        index = owner.findIndex((slot) => !slot.region())\n                        if (index < 0) return false\n                        owner[index].set(r, index)\n                }\n                const slot = owner[index]\n                if (slot.region() !== r) return false\n                if (!slot.ready(budget)) return false\n                return r.build(index)\n        }\n        const _release = (keep: Set<Region>) => {\n                owner.forEach((slot) => {\n                        if (keep.has(slot.region())) return\n                        slot.release()\n                })\n        }\n        const begin = (next: Set<Region>) => {\n                _release((keep = next))\n                pending = Array.from(keep)\n                pending.forEach((r) => r.reset())\n        }\n        const step = (budget = 6) => {\n                const start = performance.now()\n                const inBudget = timer(budget)\n                let hasPending = false\n                for (let idx = 0; idx < pending.length; idx++) {\n                        if (!inBudget()) return false\n                        const r = pending[idx]\n                        if (r.fetching()) {\n                                hasPending = true\n                                continue\n                        }\n                        const dt = Math.max(0, budget - (performance.now() - start))\n                        if (_assign(r, dt)) continue\n                        hasPending = true\n                }\n                return !hasPending\n        }\n        return { begin, step, updates: (): SlotUpdate[] => owner.map((s) => s.consumeUpdate()).filter((u): u is SlotUpdate => u !== undefined) }\n}\n","import { inRegion, local, offOf, regionId } from './utils'\nimport type { Debug } from './debug'\nimport type { Queues, QueueTask } from './queue'\nimport type { Mesh } from './mesh'\nimport type { WorkerBridge } from './store'\nimport type { WorkerMode, WorkerResult } from './worker'\n\nconst MAX_RETRY = 3\n\nexport const createRegion = (i: number, j: number, mesh: Mesh, queues: Queues, worker: WorkerBridge, x0: number, y0: number, w: number, cx: number, cz: number, debug?: Debug) => {\n        let isMeshed = false\n        let isError = false\n        let pending: Promise<WorkerResult | undefined> | undefined\n        let queued: QueueTask | undefined\n        let result: WorkerResult | undefined\n        let memoCache: any | undefined\n        let level = 'none' as WorkerMode\n        let request = 'none' as WorkerMode\n        let retry = 0\n        let ticket = 0\n        const _done = () => {\n                pending = undefined\n                queued = undefined\n                request = 'none'\n        }\n        const _markError = (mode: 'image' | 'full') => {\n                retry++\n                if (retry < MAX_RETRY) {\n                        console.warn(`Retrying... ${retry}/${MAX_RETRY}\\n└ Failed to load atlas: 17_${i}_${j}`)\n                        level = 'none'\n                        debug?.taskDone(i, j, mode)\n                        _done()\n                        return\n                }\n                console.warn(`Failed permanently: 17_${i}_${j}\\n└ Max retries (${MAX_RETRY}) exceeded`)\n                isError = true\n                level = 'error'\n                debug?.setState(i, j, 'error')\n                debug?.setCache(i, j, 'empty')\n                debug?.taskDone(i, j, mode)\n                _done()\n        }\n        const _fetch = async (promise: Promise<WorkerResult>, _ticket: number, mode: 'image' | 'full') => {\n                try {\n                        const res = await promise\n                        if (_ticket !== ticket) return res\n                        if (!res || !res.bitmap) {\n                                _markError(mode)\n                                return result\n                        }\n                        retry = 0\n                        level = res.mesh ? 'full' : 'image'\n                        if (res.memo !== undefined) memoCache = res.memo\n                        debug?.setCache(i, j, mode === 'full' ? 'cached' : 'empty')\n                        debug?.taskDone(i, j, mode)\n                        _done()\n                        return (result = res)\n                } catch {\n                        if (_ticket !== ticket) return result\n                        _markError(mode)\n                        return result\n                }\n        }\n        const _request = (mode: 'image' | 'full', priority = 0) => {\n                if (isError) return Promise.resolve(result)\n                if (level === 'full') return Promise.resolve(result)\n                if (level === 'image' && mode === 'image') return Promise.resolve(result)\n                if (level === 'image' && mode === 'full' && request !== 'full') pending = undefined\n                if (pending) queues.tune(queued, priority)\n                else {\n                        ticket++\n                        const { promise, task } = queues.schedule((signal) => worker.run(i, j, mode, signal), priority, mode)\n                        queued = task\n                        request = mode\n                        debug?.setCache(i, j, mode === 'full' ? 'building' : 'fetching')\n                        debug?.taskStart(i, j, mode)\n                        pending = _fetch(promise, ticket, mode)\n                }\n                return pending\n        }\n        const _abort = () => {\n                if (request !== 'none') debug?.taskAbort(i, j)\n                ticket++\n                queues.abort(queued)\n                pending = undefined\n                queued = undefined\n                request = 'none'\n        }\n        const prefetch = async (mode: 'image' | 'full', priority = 0) => await _request(mode, priority)\n        const image = async (priority = 0) => {\n                if (result) return result.bitmap\n                const res = await _request('image', priority)\n                return res?.bitmap!\n        }\n        const build = (index = 0) => {\n                if (isError) return true\n                if (isMeshed) return true\n                if (!result || !result.mesh) return false\n                mesh.merge({ pos: result.mesh.pos, scl: result.mesh.scl, cnt: result.mesh.cnt }, index, 0, 0, 0)\n                isMeshed = true\n                return true\n        }\n        const pick = (lx = 0, ly = 0, lz = 0) => {\n                if (!result || !result.occ) return 0\n                if (!inRegion(lx, ly, lz)) return 0\n                return result.occ[local(lx, ly, lz)]\n        }\n        const tune = (mode: WorkerMode, priority = 0) => {\n                if (mode === 'none') return _abort()\n                if (isError) return\n                if (mode === 'image') {\n                        if (level === 'full') return\n                        if (level === 'image') return\n                        if (request === 'full') _abort()\n                        if (request === 'image') return queues.tune(queued, priority)\n                        _request('image', priority)\n                        return\n                }\n                if (level === 'full') return\n                if (request === 'image') _abort()\n                if (request === 'full') return queues.tune(queued, priority)\n                _request('full', priority)\n        }\n        const dispose = () => {\n                isMeshed = false\n                isError = false\n                retry = 0\n                _abort()\n                result = undefined\n                memoCache = undefined\n                level = 'none'\n                debug?.setCache(i, j, 'purged')\n                return true\n        }\n        const reset = () => void (isMeshed = false)\n        const fetching = () => {\n                if (!pending) return false\n                if (!result) return true\n                if (result.mode !== 'full') return true\n                return false\n        }\n        const bitmap = () => result?.bitmap\n        const occ = () => result?.occ\n        const memo = () => memoCache\n        const setMemo = (m: any) => {\n                memoCache = m\n        }\n        const getError = () => isError\n        const [ax, , az] = offOf(i, j, x0, y0)\n        const x = ax - cx\n        const y = 0\n        const z = az - cz\n        return { id: regionId(i, j, w), x, y, z, i, j, prefetch, image, build, pick, dispose, fetching, reset, tune, slot: -1, bitmap, occ, memo, setMemo, isError: getError }\n}\n\nexport type Region = ReturnType<typeof createRegion>\n","const createTask = <T>(resolve: (_: T) => void, start: (signal: AbortSignal) => Promise<T>, priority = 0, tag = ''): QueueTask => {\n        return { start, resolve, priority, started: false, isHigh: priority > 0, ctrl: new AbortController(), tag, done: false } as QueueTask\n}\n\nconst createQueue = () => {\n        const items = [] as QueueTask[]\n        const sort = () => void items.sort((a, b) => b.priority - a.priority)\n        const add = (task: QueueTask) => items.push(task)\n        const shift = () => items.shift()!\n        const remove = (task: QueueTask) => {\n                const index = items.indexOf(task)\n                if (index >= 0) items.splice(index, 1)\n        }\n        return { add, shift, sort, remove, size: () => items.length }\n}\n\nexport const createQueues = (limit = 4, lowLimit = 1) => {\n        let _high = 0\n        let _low = 0\n        const high = createQueue()\n        const low = createQueue()\n        const _finish = (task: QueueTask) => {\n                if (task.done) return\n                task.done = true\n                if (task.isHigh) _high = Math.max(0, _high - 1)\n                else _low = Math.max(0, _low - 1)\n                _pump()\n        }\n        const _launch = (task: QueueTask, isHigh = false) => {\n                task.started = true\n                task.isHigh = isHigh\n                if (isHigh) _high++\n                else _low++\n                task.start(task.ctrl.signal)\n                        .then((x) => {\n                                if (task.done) return\n                                task.resolve(x)\n                        })\n                        .catch(() => {\n                                if (task.done) return\n                                task.resolve(undefined)\n                        })\n                        .finally(() => _finish(task))\n        }\n        const _pump = () => {\n                const tick = () => {\n                        high.sort()\n                        low.sort()\n                        if (_high + _low >= limit) return\n                        if (high.size() > 0) {\n                                _launch(high.shift(), true)\n                                return tick()\n                        }\n                        if (low.size() <= 0 || _low >= lowLimit) return\n                        _launch(low.shift(), false)\n                        return tick()\n                }\n                tick()\n        }\n        const _bucket = (task: QueueTask, target: Queue) => {\n                ;(task.isHigh ? high : low).remove(task)\n                target.add(task)\n        }\n        const schedule = <T>(start: (signal: AbortSignal) => Promise<T>, priority = 0, tag = '') => {\n                let resolve = (_: T) => {}\n                const promise = new Promise<T>((r) => (resolve = r))\n                const task = createTask(resolve, start, priority, tag)\n                ;(task.isHigh ? high : low).add(task)\n                _pump()\n                return { promise, task }\n        }\n        const tune = (task?: QueueTask, priority = 0) => {\n                if (!task || task.priority === priority) return\n                const nextHigh = priority > 0\n                const prevHigh = task.isHigh\n                task.priority = priority\n                if (task.started) {\n                        if (prevHigh && !nextHigh) {\n                                task.isHigh = false\n                                _high = Math.max(0, _high - 1)\n                                _low++\n                        }\n                        if (!prevHigh && nextHigh) {\n                                task.isHigh = true\n                                _low = Math.max(0, _low - 1)\n                                _high++\n                        }\n                        _pump()\n                        return\n                }\n                if (prevHigh !== nextHigh) {\n                        _bucket(task, nextHigh ? high : low)\n                        task.isHigh = nextHigh\n                }\n                _pump()\n        }\n        const abort = (task?: QueueTask) => {\n                if (!task || task.done) return\n                if (task.started) {\n                        task.ctrl.abort()\n                        task.resolve(undefined)\n                        _finish(task)\n                        return\n                }\n                ;(task.isHigh ? high : low).remove(task)\n                task.done = true\n                task.resolve(undefined)\n                _pump()\n        }\n        return { schedule, tune, abort }\n}\n\nexport type Queue = ReturnType<typeof createQueue>\nexport type Queues = ReturnType<typeof createQueues>\nexport type QueueTask<T = unknown> = {\n        start: (signal: AbortSignal) => Promise<T>\n        resolve: (data: T) => void\n        priority: number\n        started: boolean\n        isHigh: boolean\n        ctrl: AbortController\n        tag: string\n        done: boolean\n}\n","import { createRegion } from './region'\nimport { createQueues } from './queue'\nimport { regionId } from './utils'\nimport type { VoxelConfig } from './utils'\nimport type { Debug } from './debug'\nimport type { Mesh } from './mesh'\nimport type { Region } from './region'\nimport type { WorkerResponse, WorkerResult } from './worker'\n\ntype Pending = { resolve: (v: WorkerResult) => void; reject: (e?: unknown) => void; t: number }\n\nexport const createBridge = (worker: Worker) => {\n        let seq = 0\n        const pending = new Map<number, Pending>()\n        const _settle = (id: number, fn: (p: Pending) => void) => {\n                const p = pending.get(id)\n                if (!p) return\n                pending.delete(id)\n                clearTimeout(p.t)\n                fn(p)\n        }\n        worker.onmessage = (e: MessageEvent<WorkerResponse>) => {\n                const { id, ...rest } = e.data\n                if (rest.mode === 'error')\n                        return _settle(id, (p) => {\n                                console.warn('worker error', rest)\n                                p.reject(rest)\n                        })\n                _settle(id, (p) => p.resolve(rest as WorkerResult))\n        }\n        worker.onerror = (e: ErrorEvent) => {\n                console.warn('worker crash', e.message)\n                pending.forEach((_, id) => _settle(id, (q) => q.reject(e.message)))\n                worker.terminate()\n        }\n        worker.onmessageerror = () => {\n                pending.forEach((_, id) => _settle(id, (q) => q.reject('message')))\n                worker.terminate()\n        }\n        const run = (i: number, j: number, mode: 'image' | 'full', signal?: AbortSignal) => {\n                const id = seq++\n                let resolve = (_: WorkerResult) => {}\n                let reject = (_?: unknown) => {}\n                const promise = new Promise<WorkerResult>((r, j) => {\n                        resolve = r\n                        reject = j\n                })\n                const t = window.setTimeout(() => _settle(id, (p) => p.reject('timeout')), 8000)\n                if (signal?.aborted) {\n                        clearTimeout(t)\n                        reject('abort')\n                        return promise\n                }\n                pending.set(id, { resolve, reject, t })\n                signal?.addEventListener('abort', () => {\n                        _settle(id, (p) => p.reject('abort'))\n                        worker.postMessage({ id, abort: true })\n                })\n                worker.postMessage({ id, i, j, mode })\n                return promise\n        }\n        return { run }\n}\n\nexport const createStore = (mesh: Mesh, worker: Worker, c: VoxelConfig, cx: number, cz: number, debug?: Debug) => {\n        const { x0, x1, y0, y1, prepurge } = c\n        const w = x1 - x0 + 1\n        const queues = createQueues()\n        const bridge = createBridge(worker)\n        const map = new Map<number, Region>()\n        const ensure = (rx = 0, ry = 0) => {\n                const id = regionId(rx, ry, w)\n                const got = map.get(id)\n                if (got) return got\n                const r = createRegion(rx, ry, mesh, queues, bridge, x0, y0, w, cx, cz, debug)\n                map.set(id, r)\n                return r\n        }\n        const prune = (active: Set<Region>, i: number, j: number) => {\n                if (map.size <= prepurge) return\n                const dist = (r: Region) => Math.hypot(r.i - i, r.j - j)\n                const list = [...map.values()].filter((r) => !active.has(r)).sort((a, b) => dist(b) - dist(a))\n                for (const r of list) {\n                        if (map.size <= prepurge) break\n                        map.delete(r.id)\n                        r.dispose()\n                }\n        }\n        return { ensure, prune, map }\n}\n\nexport type WorkerBridge = ReturnType<typeof createBridge>\n","import { M, V } from './utils'\n\nconst _up = V.fromValues(0, 1, 0)\nconst _fwd = V.fromValues(0, 0, -1)\nconst _t0 = V.create()\nconst _t1 = V.create()\nconst _t2 = M.create()\nconst _t3 = M.create()\n\nconst clampToFace = (pos = 0, half = 0.5, sign = 0, base = Math.floor(pos)) => (sign > 0 ? Math.min(pos, base + 1 - half) : Math.max(pos, base + half))\n\nconst createCollider = ({ size = [0.8, 1.8, 0.8], gravity = -50, jump = 12, ground = 0, y = 0 }) => {\n        let isGround = false\n        const collide = (pos: ReturnType<typeof V.create>, vel: ReturnType<typeof V.create>, axis = 0, pick = (_x = 0, _y = 0, _z = 0) => 0) => {\n                const v = vel[axis]\n                if (!v) return\n                const s = Math.sign(v)\n                const xyz = V.clone(pos)\n                xyz[axis] += s\n                if (!pick(...V.floor(xyz, xyz))) return\n                if (axis === 1 && s < 0) isGround = true\n                pos[axis] = clampToFace(pos[axis], size[axis] * 0.5, s)\n                vel[axis] = 0\n        }\n        const tick = (dt = 0, pos: ReturnType<typeof V.create>, vel: ReturnType<typeof V.create>, pick = (_x = 0, _y = 0, _z = 0) => 0) => {\n                vel[1] += gravity * dt\n                const vmax = Math.max(Math.abs(vel[0]), Math.abs(vel[1]), Math.abs(vel[2]))\n                let steps = Math.ceil((vmax * dt) / 0.25)\n                if (steps < 1) steps = 1\n                const sdt = dt / steps\n                isGround = false\n                for (let i = 0; i < steps; i++) {\n                        pos[1] += vel[1] * sdt\n                        collide(pos, vel, 1, pick)\n                        pos[0] += vel[0] * sdt\n                        collide(pos, vel, 0, pick)\n                        pos[2] += vel[2] * sdt\n                        collide(pos, vel, 2, pick)\n                }\n                if (pos[1] < ground) void ((pos[1] = y / 4), (vel[1] = 0))\n        }\n        const doJump = (vel: ReturnType<typeof V.create>) => {\n                if (isGround) vel[1] = jump\n        }\n        return { tick, jump: doJump, isGround: () => isGround }\n}\n\nconst lookAt = (eye = V.create(), pos = V.create(), face = V.create()) => {\n        V.scaleAndAdd(eye, pos, face, 10)\n}\n\nconst faceDir = (out = V.create(), yaw = 0, pitch = 0) => {\n        M.identity(_t2)\n        M.rotateY(_t2, _t2, yaw)\n        M.rotateX(_t2, _t2, pitch)\n        V.transformMat4(out, _fwd, _t2)\n        return out\n}\n\nconst moveDir = (out = V.create(), dir = V.create(), speed = 1, planar = false) => {\n        V.copy(_t1, out)\n        _t1[1] = 0\n        if (V.squaredLength(_t1) < 1e-8) {\n                _t1[0] = _t1[1] = 0\n                _t1[2] = -1\n        }\n        V.normalize(_t1, _t1)\n        V.cross(_t0, _up, _t1)\n        V.normalize(_t0, _t0)\n        const fwd = planar ? _t1 : out\n        V.scale(_t0, _t0, dir[0])\n        V.scale(_t1, fwd, dir[2])\n        V.add(out, _t0, _t1)\n        V.scale(out, out, speed)\n        return out\n}\n\nconst perspective = (mvp = M.create(), pos = V.create(), eye = V.create(), aspect = 1, near = 0.1, far = 4000, fov = 28) => {\n        M.perspective(_t2, (fov * Math.PI) / 180, aspect, near, far)\n        V.copy(_t0, pos)\n        V.copy(_t1, eye)\n        _t0[1] += 0.9\n        _t1[1] += 0.9\n        M.lookAt(_t3, _t0, _t1, _up)\n        M.multiply(mvp, _t2, _t3)\n}\n\nconst perspective2 = (mvp = M.create(), pos = V.create(), eye = V.create(), aspect = 1, near = 0.1, far = 4000, fov = 28) => {\n        const top = near * Math.tan(((fov * Math.PI) / 180) * 0.5)\n        const height = 2 * top\n        const width = aspect * height\n        const left = -0.5 * width\n        M.perspective2(_t2, left, left + width, top, top - height, near, far)\n        M.lookAt(_t3, pos, eye, _up)\n        M.multiply(mvp, _t2, _t3)\n}\n\nconst turnRate = (mode = 'scroll') => {\n        if (mode === 'scroll') return 0\n        if (mode === 'creative') return 1.5\n        if (mode === 'survive') return 1\n        return 0\n}\n\nexport const createCamera = ({ yaw = Math.PI * 0.5, pitch = -Math.PI * 0.45, near = 0.1, far = 4000, fov = 50, mode = 'scroll' as string, autoScroll = false, x = 0, y = 0, z = 0, dash = 3, move = 12, jump = 12, ground = 0, size = [0.8, 1.8, 0.8], gravity = -50, sens = 1 / 250, wrap = 0 }) => {\n        let dashing = 1\n        let scroll = 0\n        let aspect = 16 / 9\n        const collider = createCollider({ size, gravity, jump, ground, y })\n        const mvp = M.create()\n        const pos = V.fromValues(x, y, z)\n        const eye = V.fromValues(x - 10, y, z)\n        const vel = V.fromValues(0, 0, 0)\n        const dir = V.fromValues(0, 0, 0)\n        const face = V.fromValues(-1, 0, 0)\n        const asdw = (axis = 0, delta = 0) => {\n                if (axis === 0) return void (dir[1] = delta)\n                if (axis === 1) return void (dir[2] = delta)\n                if (axis === 2) return void (dir[0] = delta)\n        }\n        const shift = (isPress = true) => {\n                if (mode === 'creative') return asdw(0, isPress ? -1 : 0)\n                if (mode === 'survive') return void (dashing = isPress ? dash : 1)\n        }\n        const space = (isPress = true) => {\n                if (mode === 'creative') return asdw(0, isPress ? 1 : 0)\n                if (mode === 'survive' && isPress) return collider.jump(vel)\n        }\n        const turn = (delta = [0, 0]) => {\n                const r = turnRate(mode)\n                yaw += delta[0] * r * sens\n                pitch += delta[1] * r * sens\n                pitch = Math.min(pitch, Math.PI / 2 - 0.01)\n                pitch = Math.max(pitch, -Math.PI / 2 + 0.01)\n                faceDir(face, yaw, pitch)\n                lookAt(eye, pos, face)\n        }\n        const reset = (y = 0, p = -Math.PI / 2 + 0.01) => {\n                faceDir(face, (yaw = y), (pitch = p))\n                lookAt(eye, pos, face)\n        }\n        const tick = (dt = 0, pick = (_x = 0, _y = 0, _z = 0) => 0) => {\n                if (mode === 'scroll') {\n                        if (!autoScroll) return\n                        scroll -= dt * move\n                        pos[0] = x + scroll\n                        if (pos[0] < 0) pos[0] = wrap\n                        if (pos[0] > wrap) pos[0] = 0\n                        lookAt(eye, pos, face)\n                        return\n                }\n                const speed = move * dashing * (mode === 'creative' ? 20 : 1)\n                const heading = moveDir(V.clone(face), dir, speed, mode === 'survive')\n                vel[0] = heading[0]\n                vel[2] = heading[2]\n                if (mode === 'creative') {\n                        pos[0] += vel[0] * dt\n                        pos[1] += dir[1] * dt * speed\n                        pos[2] += vel[2] * dt\n                }\n                if (mode === 'survive') collider.tick(dt, pos, vel, pick)\n                lookAt(eye, pos, face)\n        }\n        const update = (_aspect = aspect, _near = near, _far = far, _fov = fov) => {\n                aspect = _aspect\n                near = _near\n                far = _far\n                fov = _fov\n                perspective2(mvp, pos, eye, _aspect, _near, _far, _fov)\n        }\n        faceDir(face, yaw, pitch)\n        lookAt(eye, pos, face)\n        return { pos, eye, mvp, reset, tick, turn, shift, space, asdw, update, mode: (x = 'scroll') => (mode = x), yaw: () => yaw, pitch: () => pitch, near: () => near, far: () => far, fov: () => fov, aspect: () => aspect }\n}\n\nexport type CameraConfig = Parameters<typeof createCamera>[0]\nexport type Camera = ReturnType<typeof createCamera>\n","export const createMesh = () => {\n        let count = 1\n        let cap = 1\n        let pos = new Float32Array([0, 0, 0])\n        let scl = new Float32Array([1, 1, 1])\n        let aid = new Float32Array([0])\n        let _count = 0\n        let _cap = 0\n        let _pos = new Float32Array(0)\n        let _scl = new Float32Array(0)\n        let _aid = new Float32Array(0)\n        let overflow = false\n        const ensure = (n: number) => {\n                if (n <= _cap) return\n                const c = Math.max(n, _cap * 2) || n\n                const p = new Float32Array(c * 3)\n                const s = new Float32Array(c * 3)\n                const a = new Float32Array(c)\n                if (_count) {\n                        p.set(_pos.subarray(0, _count * 3))\n                        s.set(_scl.subarray(0, _count * 3))\n                        a.set(_aid.subarray(0, _count))\n                }\n                _pos = p\n                _scl = s\n                _aid = a\n                _cap = c\n        }\n        // prettier-ignore\n        const merge = (built: { pos: ArrayLike<number>; scl: ArrayLike<number>; cnt: number }, index = 0, ox = 0, oy = 0, oz = 0) => {\n                ensure(_count + built.cnt)\n                const off = _count * 3\n                for (let i = 0; i < built.cnt; i++) {\n                        _pos[off + i * 3    ] = built.pos[i * 3    ] + ox\n                        _pos[off + i * 3 + 1] = built.pos[i * 3 + 1] + oy\n                        _pos[off + i * 3 + 2] = built.pos[i * 3 + 2] + oz\n                        _scl[off + i * 3    ] = built.scl[i * 3    ]\n                        _scl[off + i * 3 + 1] = built.scl[i * 3 + 1]\n                        _scl[off + i * 3 + 2] = built.scl[i * 3 + 2]\n                }\n                _aid.fill(index, _count, _count + built.cnt)\n                _count += built.cnt\n        }\n        const reset = () => {\n                _count = 0\n        }\n        const commit = () => {\n                if (!_count) return false\n                overflow = _count > cap\n                if (overflow) {\n                        cap = Math.max(_count, cap * 2) || _count\n                        pos = new Float32Array(cap * 3)\n                        scl = new Float32Array(cap * 3)\n                        aid = new Float32Array(cap)\n                }\n                pos.set(_pos.subarray(0, _count * 3))\n                scl.set(_scl.subarray(0, _count * 3))\n                aid.set(_aid.subarray(0, _count))\n                count = _count\n                reset()\n                return true\n        }\n        return {\n                merge,\n                reset,\n                commit,\n                pos: () => pos,\n                scl: () => scl,\n                aid: () => aid,\n                count: () => count,\n                overflow: () => overflow,\n        }\n}\n\nexport type Mesh = ReturnType<typeof createMesh>\n","import { createSlots } from './slot'\nimport { createStore } from './store'\nimport { createCamera } from './camera'\nimport { createMesh } from './mesh'\nimport { culling, lat2j, localOf, lng2i, posOf, scoped, regionId, defaults, i2lng, j2lat } from './utils'\nimport type { CameraConfig } from './camera'\nimport type { Debug } from './debug'\nimport type { Region } from './region'\nimport type { SlotUpdate } from './slot'\nimport type { VoxelConfig } from './utils'\n\nexport * from './debug'\nexport * from './utils'\n\nconst RANGE = 8\n\nconst grid = (range: number, cb: (dx: number, dy: number) => void) => {\n        for (let dx = range; dx >= -range; dx--) for (let dy = range; dy >= -range; dy--) cb(dx, dy)\n}\n\nconst createVis = (mvp: number[], pos: number[], store: any, c: VoxelConfig, cx: number, cz: number, debug?: Debug) => {\n        const { x0, x1, y0, y1, slot, prebuild, prefetch } = c\n        let regions = new Set<Region>()\n        let active = new Set<Region>()\n        let keys = new Set<string>()\n        const mark = (r: Region, mode: 'full' | 'image', p: number, s: string) => {\n                r.tune(mode, p)\n                active.add(r)\n                keys.add(`${r.i}:${r.j}`)\n                debug?.setState(r.i, r.j, s as any, r.isError())\n        }\n        const take = (list: { r: Region }[], limit: number, mode: 'full' | 'image', p: number, s: string) => {\n                let n = 0\n                for (const { r } of list) {\n                        if (n >= limit) return\n                        if (active.has(r)) continue\n                        mark(r, mode, p, s)\n                        n++\n                }\n        }\n        const vis = () => {\n                const all: { d: number; r: Region }[] = []\n                const [i, j] = posOf(pos[0] + cx, pos[2] + cz, x0, y0)\n                active = new Set()\n                keys = new Set()\n                grid(RANGE, (dx, dy) => {\n                        const ri = i + dx\n                        const rj = j + dy\n                        if (!scoped(ri, rj, x0, x1, y0, y1)) return\n                        all.push({ d: Math.hypot(dx, dy), r: store.ensure(ri, rj) })\n                })\n                all.sort((a, b) => a.d - b.d)\n                const visible = all.filter(({ r }) => culling(mvp, r.x, r.y, r.z))\n                regions = new Set(visible.slice(0, slot).map(({ r }) => r))\n                regions.forEach((r) => mark(r, 'full', 3, 'visible'))\n                take(all, prebuild, 'full', 2, 'prebuild')\n                take(all, prefetch, 'image', 1, 'prefetch')\n                debug?.setAnchor(i, j)\n                debug?.prune(keys)\n                store.map.forEach((r: Region) => {\n                        if (active.has(r)) return\n                        r.tune('none', -1)\n                        r.dispose()\n                })\n                store.prune(active, i, j)\n        }\n        return { vis, regions: () => regions }\n}\n\nexport const createVoxel = ({ worker, i = 116415, j = 51622, camera: cc, debug, onReady, ...opts }: { worker: Worker; i?: number; j?: number; camera?: CameraConfig; debug?: Debug; onReady?: () => void } & Partial<VoxelConfig>) => {\n        const c = { ...defaults, ...opts }\n        const { x0, x1, y0, y1 } = c\n        const w = x1 - x0 + 1\n        worker.postMessage({ config: { atlasUrl: c.atlasUrl, atlasExt: c.atlasExt } })\n        const cx = (i - x0 + 0.5) * 256\n        const cz = (j - y0 + 0.5) * 256\n        const cam = createCamera({ ...cc, x: cc?.x ?? 0, z: cc?.z ?? 0, wrap: w * 256 })\n        const mesh = createMesh()\n        const store = createStore(mesh, worker, c, cx, cz, debug)\n        const slots = createSlots(c.slot)\n        const { mvp, pos } = cam\n        const { vis, regions } = createVis(mvp, pos, store, c, cx, cz, debug)\n        let isLoading = false\n        let isFirst = true\n        let isReady = false\n        let renderPt = performance.now()\n        let updated = false\n        let ts = performance.now()\n        let pt = ts\n        const pick = (wx = 0, wy = 0, wz = 0) => {\n                const ax = wx + cx\n                const az = wz + cz\n                const [ri, rj] = posOf(ax, az, x0, y0)\n                if (!scoped(ri, rj, x0, x1, y0, y1)) return 0\n                const r = store.map.get(regionId(ri, rj, w))\n                if (!r) return 0\n                return r.pick(...localOf(ax, wy, az, ri, rj, x0, y0))\n        }\n        const geo2xyz = (lat: number, lng: number, y = -1): [number, number, number] => [(lng2i(lng) - i - 0.5) * 256, y, (lat2j(lat) - j - 0.5) * 256]\n        const xyz2geo = (wx = 0, _wy = 0, wz = 0): [number, number] => [j2lat(wz / 256 + j + 0.5), i2lng(wx / 256 + i + 0.5)]\n        const updates = (fn: (u: SlotUpdate) => void) => {\n                pt = ts\n                ts = performance.now()\n                const dt = Math.min((ts - pt) / 1000, 0.03)\n                if (isReady) cam.tick(dt, pick)\n                cam.update()\n                const now = performance.now()\n                if (!isLoading && (isFirst || now - renderPt >= 100)) {\n                        isFirst = false\n                        vis()\n                        mesh.reset()\n                        slots.begin(regions())\n                        isLoading = true\n                        renderPt = now\n                }\n                updated = false\n                if (isLoading)\n                        if (slots.step(6)) {\n                                updated = mesh.commit()\n                                if (!isReady && updated) {\n                                        isReady = true\n                                        onReady?.()\n                                }\n                                isLoading = false\n                        }\n                slots.updates().forEach(fn)\n        }\n        return { cam, i, j, center: [cx, cz] as [number, number], updates, updated: () => updated, overflow: mesh.overflow, pos: mesh.pos, scl: mesh.scl, aid: mesh.aid, count: mesh.count, pick, geo2xyz, xyz2geo, map: store.map }\n}\n\nexport default createVoxel\n","import { Fn, int, ivec2 } from 'three/tsl'\nimport type { Node } from 'three/webgpu'\n\nexport const xyz2m = Fn(([xyz]: [Node<'ivec3'>]) => {\n        const x = xyz.x.toVar()\n        const y = xyz.y.toVar()\n        const z = xyz.z.toVar()\n        x.assign(x.bitOr(x.shiftLeft(int(16))))\n        y.assign(y.bitOr(y.shiftLeft(int(16))))\n        z.assign(z.bitOr(z.shiftLeft(int(16))))\n        x.assign(x.bitAnd(int(0xff0000ff | 0)))\n        y.assign(y.bitAnd(int(0xff0000ff | 0)))\n        z.assign(z.bitAnd(int(0xff0000ff | 0)))\n        x.assign(x.bitOr(x.shiftLeft(int(8))))\n        y.assign(y.bitOr(y.shiftLeft(int(8))))\n        z.assign(z.bitOr(z.shiftLeft(int(8))))\n        x.assign(x.bitAnd(int(0x0300f00f)))\n        y.assign(y.bitAnd(int(0x0300f00f)))\n        z.assign(z.bitAnd(int(0x0300f00f)))\n        x.assign(x.bitOr(x.shiftLeft(int(4))))\n        y.assign(y.bitOr(y.shiftLeft(int(4))))\n        z.assign(z.bitOr(z.shiftLeft(int(4))))\n        x.assign(x.bitAnd(int(0x030c30c3)))\n        y.assign(y.bitAnd(int(0x030c30c3)))\n        z.assign(z.bitAnd(int(0x030c30c3)))\n        x.assign(x.bitOr(x.shiftLeft(int(2))))\n        y.assign(y.bitOr(y.shiftLeft(int(2))))\n        z.assign(z.bitOr(z.shiftLeft(int(2))))\n        x.assign(x.bitAnd(int(0x09249249)))\n        y.assign(y.bitAnd(int(0x09249249)))\n        z.assign(z.bitAnd(int(0x09249249)))\n        return x.bitOr(y.shiftLeft(int(1))).bitOr(z.shiftLeft(int(2)))\n})\n\nexport const m2uv = Fn(([morton]: [Node<'int'>]) => {\n        const px = morton.toVar()\n        const py = morton.shiftRight(int(1)).toVar()\n        px.assign(px.bitAnd(int(0x55555555)))\n        py.assign(py.bitAnd(int(0x55555555)))\n        px.assign(px.bitOr(px.shiftRight(int(1))))\n        py.assign(py.bitOr(py.shiftRight(int(1))))\n        px.assign(px.bitAnd(int(0x33333333)))\n        py.assign(py.bitAnd(int(0x33333333)))\n        px.assign(px.bitOr(px.shiftRight(int(2))))\n        py.assign(py.bitOr(py.shiftRight(int(2))))\n        px.assign(px.bitAnd(int(0x0f0f0f0f)))\n        py.assign(py.bitAnd(int(0x0f0f0f0f)))\n        px.assign(px.bitOr(px.shiftRight(int(4))))\n        py.assign(py.bitOr(py.shiftRight(int(4))))\n        px.assign(px.bitAnd(int(0x00ff00ff)))\n        py.assign(py.bitAnd(int(0x00ff00ff)))\n        px.assign(px.bitOr(px.shiftRight(int(8))))\n        py.assign(py.bitOr(py.shiftRight(int(8))))\n        px.assign(px.bitAnd(int(0x0000ffff)))\n        py.assign(py.bitAnd(int(0x0000ffff)))\n        return ivec2(px, py)\n})\n\nexport const atlas = Fn(([p]: [Node<'ivec3'>]) => {\n        return m2uv(xyz2m(p))\n})\n"],"mappings":"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","names":["THREE","attribute","float","Fn","int","ivec3","normalLocal","positionGeometry","positionLocal","textureLoad","uniformArray","varying","vec3","vec4","defaults","local","x","y","z","offOf","i","j","x0","y0","posOf","range","n","regionId","w","culling","VP","M","rx","ry","rz","visSphere","Z","N","lng2i","lng","lat2j","lat","s","i2lng","j2lat","localOf","wx","wy","wz","ri","rj","x0","y0","ox","oz","offOf","inRegion","x","y","z","scoped","i","j","x0","x1","y0","y1","timer","t","start","visSphere","m","M","cx","cy","cz","r","t","ax","ay","az","aw","V","x","y","z","o","a","l","b","s","w","a00","a01","a02","a03","a10","a11","a12","a13","a20","a21","a22","a23","a30","a31","a32","a33","b00","b01","b02","b03","b04","b05","b06","b07","b08","b09","b10","b11","d","out","rad","c","fov","aspect","near","far","f","left","right","top","bottom","eye","center","up","z0","z1","z2","x0","x1","x2","y0","y1","y2","b12","b13","b20","b21","b22","b23","b30","b31","b32","b33","createSlot","index","region","isReady","pending","_update","_reset","upload","budget","checker","timer","img","r","idx","u","createSlots","size","owner","range","keep","_assign","slot","_release","next","start","inBudget","hasPending","dt","s","MAX_RETRY","createRegion","i","j","mesh","queues","worker","x0","y0","w","cx","cz","debug","isMeshed","isError","pending","queued","result","memoCache","level","request","retry","ticket","_done","_markError","mode","_fetch","promise","_ticket","res","_request","priority","task","signal","_abort","prefetch","image","build","index","pick","lx","ly","lz","inRegion","local","tune","dispose","reset","fetching","bitmap","occ","memo","setMemo","m","getError","ax","az","offOf","x","y","z","regionId","createTask","resolve","start","priority","tag","createQueue","items","task","a","b","index","createQueues","limit","lowLimit","_high","_low","high","low","_finish","_pump","_launch","isHigh","x","tick","_bucket","target","_","promise","r","nextHigh","prevHigh","createBridge","worker","seq","pending","_settle","id","fn","p","e","rest","_","q","i","j","mode","signal","resolve","reject","promise","r","t","createStore","mesh","c","cx","cz","debug","x0","x1","y0","y1","prepurge","w","queues","createQueues","bridge","map","rx","ry","regionId","got","createRegion","active","dist","list","a","b","_up","V","_fwd","_t0","_t1","_t2","M","_t3","clampToFace","pos","half","sign","base","createCollider","size","gravity","jump","ground","y","isGround","collide","vel","axis","pick","_x","_y","_z","v","s","xyz","dt","vmax","steps","sdt","i","lookAt","eye","face","faceDir","out","yaw","pitch","moveDir","dir","speed","planar","fwd","perspective2","mvp","M","pos","V","eye","aspect","near","far","fov","top","height","width","left","_t2","_t3","_up","turnRate","mode","createCamera","yaw","pitch","autoScroll","x","y","z","dash","move","jump","ground","size","gravity","sens","wrap","dashing","scroll","collider","createCollider","vel","dir","face","asdw","axis","delta","shift","isPress","space","turn","r","faceDir","lookAt","reset","p","tick","dt","pick","_x","_y","_z","speed","heading","moveDir","update","_aspect","_near","_far","_fov","createMesh","count","cap","pos","scl","aid","_count","_cap","_pos","_scl","_aid","overflow","ensure","n","c","p","s","a","merge","built","index","ox","oy","oz","off","i","reset","RANGE","grid","range","cb","dx","dy","createVis","mvp","pos","store","c","cx","cz","debug","x0","x1","y0","y1","slot","prebuild","prefetch","regions","active","keys","mark","r","mode","p","s","take","list","limit","n","all","i","j","posOf","ri","rj","scoped","a","b","visible","culling","createVoxel","worker","cc","onReady","opts","defaults","w","cam","createCamera","mesh","createMesh","createStore","slots","createSlots","vis","isLoading","isFirst","isReady","renderPt","updated","ts","pt","pick","wx","wy","wz","ax","az","regionId","localOf","geo2xyz","lat","lng","y","lng2i","lat2j","xyz2geo","_wy","j2lat","i2lng","fn","dt","now","src_default","Fn","int","ivec2","xyz2m","xyz","x","y","z","m2uv","morton","px","py","atlas","p","_vec2","_vec3","_mat4","driveFromVoxel","cam","camera","renderer","size","driveFromThree","k","createVec3","createGeometry","createMaterial","atlasTex","offsetNode","_pos","attribute","_scl","_aid","pick","Fn","id","uvPix","textureLoad","int","diffuse","n","vec3","position","positionLocal","center","positionGeometry","normalLocal","float","vAid","varying","vDiff","vCenter","color","p","ivec3","uv","atlas","rgb","vec4","mat","SIZE","createDstTexture","slot","createAtlasWriter","dstTexture","backend","device","gpuTex","at","writeOffset","offset","_node","Voxel","params","controls","uniformArray","__publicField","src_default","_scene","voxel","_isThree","count","updated","updates","overflow","writeAtlas","geometry","pos","scl","aid","index_default"]}