@spearwolf/twopoint5d
Version:
Create 2.5D realtime graphics and pixelart with WebGL and three.js
47 lines • 1.72 kB
JavaScript
export class TileSpritesFactory {
constructor(tileSprites, tileSet, tileDataProvider) {
this.tileSprites = tileSprites;
this.tileSprites.update();
this.tileSet = tileSet;
this.tileDataProvider = tileDataProvider;
}
addToNode(node) {
node.add(this.tileSprites);
}
removeFromNode(node) {
node.remove(this.tileSprites);
}
freeTileSprite(sprite) {
this.tileSprites.geometry?.instancedPool.freeVO(sprite);
}
createTile(tileCoords) {
const tileDataId = this.tileDataProvider.getTileIdAt(tileCoords.x, tileCoords.y);
if (tileDataId === 0)
return;
const sprite = this.createTileSprite();
if (sprite == null)
return;
sprite.setQuadSize([tileCoords.view.width, tileCoords.view.height]);
sprite.setInstancePosition([tileCoords.view.left, 0, tileCoords.view.top]);
const frameId = this.tileSet.frameId(tileDataId);
const texCoords = this.tileSet.atlas.get(frameId).coords;
sprite.setTexCoords([texCoords.s, texCoords.t, texCoords.u, texCoords.v]);
return sprite;
}
updateTile(tile, tileCoords) {
tile.setInstancePosition([tileCoords.view.left, 0, tileCoords.view.top]);
}
createTileSprite() {
return this.tileSprites.geometry?.instancedPool.createVO();
}
destroyTile(tile) {
this.tileSprites.geometry?.instancedPool.freeVO(tile);
}
update() {
if (this.tileSprites.geometry) {
this.tileSprites.geometry.touch('quadSize', 'texCoords', 'instancePosition');
this.tileSprites.update();
}
}
}
//# sourceMappingURL=TileSpritesFactory.js.map