summaryrefslogtreecommitdiff
path: root/viewer/main.ts
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-03-28 01:56:21 +0100
committermetamuffin <metamuffin@disroot.org>2025-03-28 01:56:21 +0100
commit3be73a3c424bd7f72e6efecd6d954fbb08e960e0 (patch)
treedc8ed8557d352845ce4f892aa1f38b1df0cc638c /viewer/main.ts
parent94837b601fb757ba6582602264b598df39f303fe (diff)
downloadwearemapping-3be73a3c424bd7f72e6efecd6d954fbb08e960e0.tar
wearemapping-3be73a3c424bd7f72e6efecd6d954fbb08e960e0.tar.bz2
wearemapping-3be73a3c424bd7f72e6efecd6d954fbb08e960e0.tar.zst
a
Diffstat (limited to 'viewer/main.ts')
-rw-r--r--viewer/main.ts98
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