const THREE = require('three'); /** * Base texture object for importing images and turning them into * texures unit that can be used by other texture primitives. * * @class * @author Alan Wu * @return {Texture} */ const Texture = function () { this.isTexture = true; this.impl = undefined; this.isLoading = false; this.size = { width: 1, height: 1, depth: 0 }; } /** * Read an image from src. * * @async * @param {Image} img - An image object. * @param {String} src - Source location of the image. * * @return {Promise} img on resolve. */ Texture.prototype.loadImage = function (img, src) { return new Promise((resolve, reject) => { img.onload = () => resolve(img); img.onerror = reject; img.src = src; }) } /** @typedef IMAGE_UINT8_RETURN @type {Set} @property {Uint8Array} array - Array containing the uint8 image value. @property {Number} width - Phyiscal image width. @property {Number} height - Phyiscal image height. */ /** * Read an image from src and turn it into Uint8Array. * * @async * @param {Image} img - An image object. * @param {String} src - Source location of the image. * @param {Canvas} canvas - Canvas html element used for the conversion. * * @return {IMAGE_UNIT8_RETURN} */ Texture.prototype.imageToUint8Array = async function (instance, img, src, canvas) { await instance.loadImage(img, src); canvas.width = img.width; canvas.height = img.height; const ctx = canvas.getContext("2d"); ctx.drawImage(img, 0, 0); return { array: new Uint8Array(ctx.getImageData(0, 0, canvas.width, canvas.height).data.buffer), width: canvas.width, height: canvas.height }; } Texture.prototype.loadFromImages = async function (srcArrays) { return } /** * Return true if the texture is ready for consumption. * * @return {Boolean} */ Texture.prototype.isReady = function () { if (this.impl && !this.isLoading) return true; return false; } /** * Return true if the texture is ready for consumption, otherwise false. * * @return {Boolean} */ Texture.prototype.getMaterial = function () { if (this.impl) { return new THREE.MeshBasicMaterial({ color: new THREE.Color(1, 1, 1), transparent: false, opacity: 1.0, map: this.impl, side: THREE.DoubleSide }); } } exports.Texture = Texture;