@spearwolf/twopoint5d
Version:
Create 2.5D realtime graphics and pixelart with WebGL and three.js
80 lines • 2.8 kB
JavaScript
import { Vector2, Vector3 } from 'three/webgpu';
import { Map2DTileCoordsUtil } from './Map2DTileCoordsUtil.js';
export class Map2DTileStreamer {
#tileCoords;
#clearTilesOnNextUpdate;
get tileWidth() {
return this.#tileCoords.tileWidth;
}
set tileWidth(width) {
this.#tileCoords.tileWidth = width;
}
get tileHeight() {
return this.#tileCoords.tileHeight;
}
set tileHeight(height) {
this.#tileCoords.tileHeight = height;
}
get xOffset() {
return this.#tileCoords.xOffset;
}
set xOffset(offset) {
this.#tileCoords.xOffset = offset;
}
get yOffset() {
return this.#tileCoords.yOffset;
}
set yOffset(offset) {
this.#tileCoords.yOffset = offset;
}
constructor(tileWidth = 0, tileHeight = 0, xOffset = 0, yOffset = 0) {
this.centerX = 0;
this.centerY = 0;
this.#clearTilesOnNextUpdate = false;
this.tiles = [];
this.renderers = new Set();
this.#tileCoords = new Map2DTileCoordsUtil(tileWidth, tileHeight, xOffset, yOffset);
}
addTileRenderer(renderer) {
this.renderers.add(renderer);
}
removeTileRenderer(renderer) {
this.renderers.delete(renderer);
}
update(node) {
if (this.renderers.size === 0 || this.visibilitor == null)
return;
if (this.#clearTilesOnNextUpdate) {
for (const tileRenderer of this.renderers) {
tileRenderer.clearTiles();
}
this.tiles.length = 0;
this.#clearTilesOnNextUpdate = false;
}
node.updateWorldMatrix(true, false);
const visible = this.visibilitor.computeVisibleTiles(this.tiles, [this.centerX, this.centerY], this.#tileCoords, node.matrixWorld);
if (visible) {
this.tiles = visible?.tiles;
const offset = visible.offset ?? new Vector2();
const translate = visible.translate ?? new Vector3();
const position = new Vector3(offset.x + translate.x, translate.y, offset.y + translate.z);
for (const tileRenderer of this.renderers) {
tileRenderer.beginUpdatingTiles(position);
visible.removeTiles?.forEach((tile) => {
tileRenderer.removeTile(tile);
});
visible.createTiles?.forEach((tile) => {
tileRenderer.addTile(tile);
});
visible.reuseTiles?.forEach((tile) => {
tileRenderer.reuseTile(tile);
});
tileRenderer.endUpdatingTiles();
}
}
}
clearTiles() {
this.#clearTilesOnNextUpdate = true;
}
}
//# sourceMappingURL=Map2DTileStreamer.js.map