Source: resources/MaterialResource.js

import { Utils } from '../common/Utils'
import { BaseResource } from './BaseResource';

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

/**
 * @class MaterialResource
 * The material resource.
 * @memberof THING
 * @extends THING.BaseResource
 */
class MaterialResource extends BaseResource {

	/**
	 * The material resource to build custom geometry info in scene.
	 * @param {Object} param The initial parameters.
	 */
	constructor(param = {}) {
		super(param);

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

		_private.resources = [];
		_private.data = this._buildData(param);

		this._loadResource();
	}

	// #region Private

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

		let data = {};

		let lights = Utils.parseValue(param['lights'], true);
		if (lights) {
			data.type = 'Standard';
		}
		else {
			data.type = 'Unlit';
		}

		for (let key in param) {
			let value = param[key];

			if (Utils.isNull(value)) {
				continue;
			}

			if (value.isBaseResource) {
				value.addRef();

				_private.resources.push({
					key,
					resource: value
				});
			}
			else if (Utils.isArray(value)) {
				value = value.slice(0);
			}

			data[key] = value;
		}

		return data;
	}

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

		return Promise.all(_private.resources.map(res => {
			return res.resource.waitForComplete();
		}));
	}

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

		// Wait for all resource loaded
		this._waitForResources().then(() => {
			_private.resources.forEach(res => {
				_private.data[res.key] = res.resource.getTextureResource();
			});

			this.resource = Utils.createObject('MaterialResource', _private.data);
		});
	}

	// #endregion

	// #region Accessor

	/**
	 * Get the data.
	 * @type {Object}
	 */
	get data() {
		let _private = this[__.private];

		return _private.data;
	}

	// #endregion

	get isMaterialResource() {
		return true;
	}

}

export { MaterialResource }