UNPKG

@spearwolf/twopoint5d

Version:

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

76 lines 2.19 kB
const isNamedTextureAtlasArgs = (args) => typeof args[0] === 'string' || typeof args[0] === 'symbol'; const rand = (max) => (Math.random() * max) | 0; export class TextureAtlas { #frames = []; #frameNames = new Map(); add(...args) { const id = this.#frames.length; if (isNamedTextureAtlasArgs(args)) { this.#frameNames.set(args[0], id); this.#frames.push({ coords: args[1], data: args[2] }); } else { this.#frames.push({ coords: args[0], data: args[1] }); } return id; } get size() { return this.#frames.length; } get(id) { return this.#frames[id]; } frameId(name) { return this.#frameNames.get(name); } frame(name) { return this.#frames[this.#frameNames.get(name)]; } frameNames(match) { const frameNames = Array.from(this.#frameNames.keys()); if (match != null) { const regex = typeof match === 'string' ? new RegExp(match) : match; return frameNames.filter((name) => typeof name === 'string' && regex.test(name)); } return frameNames; } randomFrameId() { return rand(this.#frames.length); } randomFrame() { return this.#frames[this.randomFrameId()]; } randomFrameName() { const randomIdx = rand(this.#frameNames.size); let idx = 0; for (const name of this.#frameNames.keys()) { if (idx === randomIdx) { return name; } ++idx; } return; } randomFrameIds(count) { const frameIds = []; for (let i = 0; i < count; i++) { frameIds.push(this.randomFrameId()); } return frameIds; } randomFrames(count) { const frames = []; for (let i = 0; i < count; i++) { frames.push(this.randomFrame()); } return frames; } randomFrameNames(count) { const names = []; for (let i = 0; i < count; i++) { names.push(this.randomFrameName()); } return names; } } //# sourceMappingURL=TextureAtlas.js.map