Source: components/CameraResourceControllerComponent.js

import { Utils } from '../common/Utils';
import { BaseComponent } from './BaseComponent';
import { ImageTexture } from '../resources/ImageTexture';

const __ = {
	private: Symbol('private'),
}

/**
 * @class CameraResourceControllerComponent
 * The camera resource controller compnent.
 * @memberof THING
 * @extends THING.BaseComponent
 */
class CameraResourceControllerComponent extends BaseComponent {

	/**
	 * The resource(s) controller of camera, like setting background resource etc.
	 */
	constructor() {
		super();

		this[__.private] = {};
		let _private = this[__.private];

		_private.backgroundImage = null;
		_private.background = null;
	}

	onRemove() {
		let _private = this[__.private];

		if (_private.background && _private.background.isImageTexture) {
			_private.background.release();
		}

		_private.background = null;

		super.onRemove();
	}

	onCopy(component) {
		this.background = component.background;
	}

	/**
	 * Get/Set the background.
	 * @type {Number|String|Array<Number>|THING.ImageTexture}
	 * @private
	 */
	get background() {
		let _private = this[__.private];

		return _private.background;
	}
	set background(value) {
		let _private = this[__.private];

		let node = this.object.node;

		if (_private.background && _private.background.isImageTexture) {
			_private.background.release();
		}

		if (value) {
			// Image texture resource
			if (value.isImageTexture || value.isCubeTexture || value.isVideoTexture) {
				_private.background = value;
				_private.background.addRef();

				_private.background.waitForComplete().then((image) => {
					if (_private.background != image) {
						return;
					}

					node.setBackground('Texture', image.getTextureResource());
				});
			}
			// Image url or color from string
			else if (Utils.isString(value)) {
				if (_private.backgroundImage) {
					_private.backgroundImage.release();
					_private.backgroundImage = null;
				}

				// Color
				if (Utils.isColorString(value)) {
					_private.background = Utils.parseColor(value, [1, 1, 1]);

					node.setBackground('Color', _private.background);
				}
				// Image url
				else {
					_private.backgroundImage = new ImageTexture(value);

					this.background = _private.backgroundImage;
				}
			}
			// Color from number/array
			else if (Utils.isNumber(value) || Utils.isArray(value)) {
				_private.background = Utils.parseColor(value, [1, 1, 1]);

				node.setBackground('Color', _private.background);
			}
		}
		else {
			_private.background = null;

			node.clearBackground();
		}
	}

}

CameraResourceControllerComponent.exportProperties = [
	'background',
];

export { CameraResourceControllerComponent }