UNPKG

@spearwolf/twopoint5d

Version:

Create 2.5D realtime graphics and pixelart with WebGL and three.js

80 lines 2.8 kB
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