import Texture from './BaseTexture'; import ImageResource from './resources/ImageResource'; import { TARGETS } from './../const'; export default class ArrayTexture extends Texture { constructor(width, height, size, format) { super(null, 0, 1, width, height, format); this.target = TARGETS.TEXTURE_2D_ARRAY; this.size = size; this._new = true; this.array = []; } setResource(resource, index) { let layer = this.array[index]; if (!layer) { layer = this.array[index] = { index, texture: this, resource: null, texturePart: true, dirtyId: 0 }; } layer.resource = resource; resource.load.then((resource) => { if (layer.resource === resource) { this.validate(); this.dirtyId++; } }); } validate() { let valid = true; if (this.width === -1 || this.height === -1) { valid = false; } if (this.array) { for (let i = 0; i < this.array.length; i++) { const layer = this.array[i]; if (layer.resource && !layer.resource.loaded) { valid = false; break; } } } this.valid = valid; } static from(width, height, ...urls) { const arrayTexture = new ArrayTexture(width, height); for (let i = 0; i < 6; i++) { arrayTexture.setResource(ImageResource.from(urls[i % urls.length]), i); } return arrayTexture; } }