/// 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" canvas.style.left = "0px" canvas.style.width = "100vw" 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() 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 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); } } }