diff options
author | metamuffin <metamuffin@disroot.org> | 2025-03-28 01:56:21 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-03-28 01:56:21 +0100 |
commit | 3be73a3c424bd7f72e6efecd6d954fbb08e960e0 (patch) | |
tree | dc8ed8557d352845ce4f892aa1f38b1df0cc638c /viewer/main.ts | |
parent | 94837b601fb757ba6582602264b598df39f303fe (diff) | |
download | wearemapping-3be73a3c424bd7f72e6efecd6d954fbb08e960e0.tar wearemapping-3be73a3c424bd7f72e6efecd6d954fbb08e960e0.tar.bz2 wearemapping-3be73a3c424bd7f72e6efecd6d954fbb08e960e0.tar.zst |
a
Diffstat (limited to 'viewer/main.ts')
-rw-r--r-- | viewer/main.ts | 98 |
1 files changed, 63 insertions, 35 deletions
diff --git a/viewer/main.ts b/viewer/main.ts index 5aa1df6..e0c2fde 100644 --- a/viewer/main.ts +++ b/viewer/main.ts @@ -1,5 +1,8 @@ /// <reference lib="dom" /> +import { aabb_overlap } from "./helper.ts"; +import { AABB, get_graphics_part, get_prefab, get_respackentry, get_spatialindex, GraphicsPart, Prefab, Resource, SpatialIndex } from "./resources.ts"; + const canvas = document.createElement("canvas") canvas.style.position = "absolute" canvas.style.top = "0px" @@ -9,53 +12,78 @@ canvas.style.height = "100vh" document.body.append(canvas) const ctx = canvas.getContext("2d")! +let loader: Loader | undefined; + function draw() { ctx.fillStyle = "black" ctx.fillRect(0, 0, canvas.width, canvas.height) + + loader?.root.children + + requestAnimationFrame(draw) } canvas.addEventListener("resize", () => draw()) draw() -class Resource<T> { - constructor(public hash: Uint8Array) { } - toString() { - return Array.from(this.hash) - .map(e => e.toString(16).padStart(2, "0")) - .join("") - } - async download_raw() { - const res = await fetch(`http://127.0.0.1:28556/${this.toString()}`) - if (!res.ok) throw new Error("aaaa"); - return await res.bytes() - } -} - -function read_res_table(buffer: Uint8Array): { [key: string]: Uint8Array[] } { - const view = new DataView(buffer.buffer) - let p = 0 - const out: { [key: string]: Uint8Array[] } = {} - while (p < view.byteLength) { - const key_len = view.getInt16(p, true) - p += 2 - const value_len = view.getInt16(p, true) - p += 2 - const key = String.fromCharCode(...buffer.slice(p, p + key_len)) - p += key_len - const value = buffer.slice(p, p + value_len) - p += value_len - out[key] ??= [] - out[key].push(value) - } - return out -} async function init() { const resp = await fetch("http://127.0.0.1:28556/entry") if (!resp.ok) throw new Error("aaaa"); const entry_res = new Resource(await resp.bytes()) - const entry = await entry_res.download_raw() - console.log(read_res_table(entry)) + const entry = await get_respackentry(entry_res) + const root = await get_spatialindex(entry.c_spatial_index!) + loader = new Loader(root) + console.log("begin load"); + await loader.update() + console.log("end load"); + +} +init() + +let limit = 100; + +class Loader { + view: AABB + root: SNode + constructor(root: SpatialIndex) { + this.view = { min: { x: 0, y: 0, z: 0 }, max: { x: 1, y: 1, z: 1 } } + this.root = new SNode(root) + } + async update() { + await this.root.load(this.view) + } +} +class SNode { + children: (SNode | undefined)[] + prefab?: Prefab + graphics?: GraphicsPart + aabb?: AABB + constructor(public data: SpatialIndex) { + this.children = new Array(data.child.length).fill(undefined) + } + async load(view: AABB) { + if (this.data.prefab && !this.prefab) this.prefab = await get_prefab(this.data.prefab) + if (this.prefab?.graphics[0] && !this.graphics) this.graphics = await get_graphics_part(this.prefab.graphics[0][1]) + for (let i = 0; i < this.data.child.length; i++) { + const [aabb, child_data_hash] = this.data.child[i]; + if (!aabb_overlap(aabb, view)) continue + if (this.children[i] == undefined) { + this.children[i] = new SNode(await get_spatialindex(child_data_hash)) + limit -= 1 + if (limit <= 0) return + } + await this.children[i]!.load(view) + } + } + draw() { + for (const c of this.children) { + if (c) c.draw() + } + if (!this.graphics) return + for (const c of this.graphics.read()) { + console.log(c); + } + } } -init()
\ No newline at end of file |