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 }