@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
68 lines • 5.84 kB
JavaScript
import { TgdTransfo } from "./../../math/index.js";
import { TgdPainterGroup } from "../group.js";
import { TgdPainter } from "../painter.js";
import { OctreeCache } from "./cache.js";
import { listBBoxes } from "./octree.js";
export class TgdPainterLOD extends TgdPainter {
constructor(context, options) {
super();
this.context = context;
this.options = options;
this.transfo = new TgdTransfo();
this.group = new TgdPainterGroup();
this.cache = new OctreeCache();
this.paintersToDelete = new Set();
this.isComputingOctree = false;
}
delete() {
for (const painter of this.paintersToDelete.values()) {
painter.delete();
}
this.paintersToDelete.clear();
this.group.delete();
}
paint(time, delta) {
this.group.paint(time, delta);
this.computeOctree();
}
async computeOctree() {
if (this.isComputingOctree)
return;
this.isComputingOctree = true;
try {
const { group, context, options } = this;
const candidates = listBBoxes(context.camera, options.bbox, options.subdivisions, options.surfaceThreshold ?? 0.25);
const promises = [];
for (const [x, y, z, level] of candidates) {
promises.push(this.getMeshPromise(x, y, z, level));
}
const results = await Promise.allSettled(promises);
group.removeAll(false);
for (const result of results) {
if (result.status === "fulfilled") {
const painter = result.value;
if (painter) {
group.add(painter);
this.paintersToDelete.add(painter);
}
}
}
this.context.paint();
}
finally {
this.isComputingOctree = false;
}
}
getMeshPromise(x, y, z, level) {
const fromCache = this.cache.get(x, y, z, level);
if (fromCache)
return fromCache;
const promise = this.options.factory(x, y, z, level);
this.cache.set(x, y, z, level, promise);
return promise;
}
debug(caption) {
console.debug(caption ?? `${this.name} (id: ${this.id}, active: ${this.active})`);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3BhaW50ZXIvbG9kL2xvZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQWdCLFVBQVUsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUVwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQzFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDdkMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUNyQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBeUNyQyxNQUFNLE9BQU8sYUFBYyxTQUFRLFVBQVU7SUFRekMsWUFDb0IsT0FBbUIsRUFDbEIsT0FBNkI7UUFFOUMsS0FBSyxFQUFFLENBQUE7UUFIUyxZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ2xCLFlBQU8sR0FBUCxPQUFPLENBQXNCO1FBVGxDLFlBQU8sR0FBa0MsSUFBSSxVQUFVLEVBQUUsQ0FBQTtRQUV4RCxVQUFLLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQTtRQUM3QixVQUFLLEdBQUcsSUFBSSxXQUFXLEVBQXdDLENBQUE7UUFDL0QscUJBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQWMsQ0FBQTtRQUNqRCxzQkFBaUIsR0FBRyxLQUFLLENBQUE7SUFPakMsQ0FBQztJQUVELE1BQU07UUFDRixLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQ25ELE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQTtRQUNwQixDQUFDO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFBO1FBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUE7SUFDdkIsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFZLEVBQUUsS0FBYTtRQUM3QixJQUFJLENBQUMs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